From 191061ee668400324f4505cf498f1ee2d57e4962 Mon Sep 17 00:00:00 2001 From: yury <yury> Date: Sat, 23 Oct 2004 13:59:25 +0000 Subject: [PATCH] - landing of b_hd_cleanup_merge to HEAD. --- .../patches/ext3-ea-in-inode-2.6-suse.patch | 72 +- ldiskfs/ldiskfs/Makefile.in | 5 +- ldiskfs/ldiskfs/autoMakefile.am | 17 +- lnet/archdep.m4 | 712 +- lnet/autoMakefile.am | 4 +- lnet/build.m4 | 41 +- lnet/include/.cvsignore | 2 + lnet/include/Makefile.am | 3 + lnet/include/linux/Makefile.am | 4 + lnet/include/linux/kp30.h | 73 +- lnet/include/linux/libcfs.h | 131 +- lnet/include/linux/portals_compat25.h | 8 + lnet/include/linux/portals_lib.h | 112 - lnet/include/lnet/Makefile.am | 10 + lnet/include/lnet/api.h | 2 + lnet/include/lnet/defines.h | 117 - lnet/include/lnet/lib-types.h | 8 +- lnet/include/lnet/lnetctl.h | 6 + lnet/include/lnet/ppid.h | 49 - lnet/include/lnet/ptlctl.h | 6 + lnet/include/lnet/types.h | 23 +- lnet/klnds/Makefile.in | 2 +- lnet/klnds/autoMakefile.am | 2 +- lnet/klnds/gmlnd/gmlnd.h | 40 +- lnet/klnds/gmlnd/gmlnd_api.c | 24 +- lnet/klnds/gmlnd/gmlnd_cb.c | 49 +- lnet/klnds/gmlnd/gmlnd_comm.c | 120 +- lnet/klnds/gmlnd/gmlnd_module.c | 13 +- lnet/klnds/iblnd/.cvsignore | 10 - lnet/klnds/iblnd/Makefile.in | 6 - lnet/klnds/iblnd/autoMakefile.am | 10 - lnet/klnds/iblnd/ibnal.c | 2142 - lnet/klnds/iblnd/ibnal.h | 565 - lnet/klnds/iblnd/ibnal_cb.c | 1302 - .../iblnd/ibnal_send_recv_self_testing.c | 116 - lnet/klnds/iblnd/uagent.c | 391 - lnet/klnds/openiblnd/Makefile.in | 6 + lnet/klnds/openiblnd/Makefile.mk | 10 + lnet/klnds/openiblnd/autoMakefile.am | 15 + lnet/klnds/openiblnd/openiblnd.c | 1503 + lnet/klnds/openiblnd/openiblnd.h | 509 + lnet/klnds/openiblnd/openiblnd_cb.c | 2552 + lnet/klnds/qswlnd/qswlnd.c | 13 +- lnet/klnds/qswlnd/qswlnd.h | 2 +- lnet/klnds/qswlnd/qswlnd_cb.c | 97 +- lnet/klnds/socklnd/socklnd.c | 1291 +- lnet/klnds/socklnd/socklnd.h | 137 +- lnet/klnds/socklnd/socklnd_cb.c | 694 +- lnet/libcfs/Makefile.in | 2 +- lnet/libcfs/Makefile.mk | 2 +- lnet/libcfs/autoMakefile.am | 2 +- lnet/libcfs/debug.c | 767 +- lnet/libcfs/lwt.c | 62 +- lnet/libcfs/module.c | 22 +- lnet/libcfs/proc.c | 40 +- lnet/libcfs/tracefile.c | 858 + lnet/libcfs/tracefile.h | 22 + lnet/lnet/api-ni.c | 18 +- lnet/lnet/api-wrap.c | 24 +- lnet/lnet/lib-md.c | 9 +- lnet/lnet/lib-move.c | 172 +- lnet/lnet/lib-msg.c | 24 +- lnet/router/proc.c | 205 +- lnet/router/router.c | 24 +- lnet/router/router.h | 4 + lnet/tests/ping_cli.c | 22 +- lnet/tests/ping_srv.c | 18 +- lnet/tests/sping_cli.c | 12 +- lnet/tests/sping_srv.c | 14 +- lnet/ulnds/Makefile.am | 6 +- lnet/ulnds/connection.c | 83 +- lnet/ulnds/socklnd/Makefile.am | 6 +- lnet/ulnds/socklnd/connection.c | 83 +- lnet/utils/Makefile.am | 8 +- lnet/utils/acceptor.c | 148 +- lnet/utils/debug.c | 466 +- lnet/utils/debugctl.c | 2 +- lnet/utils/portals.c | 525 +- lnet/utils/ptlctl.c | 12 +- lustre/ChangeLog | 1 + lustre/autoMakefile.am | 4 +- lustre/configure.in | 39 +- lustre/doc/Makefile.am | 8 +- lustre/doc/lmc.lyx | 1454 +- lustre/include/liblustre.h | 24 +- lustre/include/linux/Makefile.am | 6 + lustre/include/linux/lprocfs_status.h | 16 + lustre/include/linux/lustre_cfg.h | 3 +- lustre/include/linux/lustre_compat25.h | 65 +- lustre/include/linux/lustre_fsfilt.h | 30 +- lustre/include/linux/lustre_idl.h | 30 +- lustre/include/linux/lustre_import.h | 14 +- lustre/include/linux/lustre_lib.h | 57 +- lustre/include/linux/lustre_log.h | 11 +- lustre/include/linux/lustre_mds.h | 17 - lustre/include/linux/lustre_net.h | 45 +- lustre/include/linux/lustre_smfs.h | 1 + lustre/include/linux/lvfs.h | 1 + lustre/include/linux/lvfs_linux.h | 2 - lustre/include/linux/obd.h | 52 +- lustre/include/linux/obd_class.h | 36 +- lustre/include/linux/obd_support.h | 15 +- lustre/include/lustre/Makefile.am | 6 +- lustre/include/lustre/lustre_user.h | 17 +- .../kernel_configs/config-linux-2.6.7-uml | 353 + ...> 3.5G-address-space-2.4.24-vanilla.patch} | 0 .../add_page_private-2.4.19-pre1.patch | 15 - ...te.patch => add_page_private-2.4.24.patch} | 0 .../kernel_patches/patches/bproc-patch-2.4.20 | 1824 - .../kernel_patches/patches/cifs_2.6.5.patch | 65 - .../configurable-x86-stack-2.4.19-pre1.patch | 302 - .../configurable-x86-stack-2.4.20-rh.patch | 311 - ...nfigurable-x86-stack-2.4.21-sles8sp3.patch | 330 - .../configurable-x86-stack-2.4.21-suse2.patch | 318 - .../configurable-x86-stack-2.4.22-rh.patch | 311 - ...ch => configurable-x86-stack-2.4.24.patch} | 0 .../patches/configurable-x86_64-2.4.21.patch | 122 - .../patches/dcache-mds-num-2.6.7.patch | 22 + .../patches/dcache_refcount_debug.patch | 24 - ...20-rh.patch => dev_read_only-2.4.24.patch} | 0 .../patches/dev_read_only-suse-2.4.19.patch | 76 - .../patches/dev_read_only.patch | 73 - .../patches/dev_read_only_2.4.20.patch | 62 - .../patches/dev_read_only_2.4.21-chaos.patch | 78 - .../patches/dev_read_only_hp_2.4.20.patch | 77 - .../patches/dynamic-locks-2.4.20-rh.patch | 217 - .../patches/dynamic-locks-2.4.24.patch | 3 +- ...-suse2.patch => dynamic-locks-2.6.7.patch} | 58 +- ...ate.patch => export-truncate-2.4.24.patch} | 0 .../export-zap-page-range-2.4.24.patch | 12 + ...atch => export_lookup_create-2.4.24.patch} | 0 .../patches/export_num_siblings-2.4.24.patch | 10 + .../patches/export_symbols-2.6-suse.patch | 62 +- ....4.20-rh-hp.patch => exports-2.4.24.patch} | 0 lustre/kernel_patches/patches/exports.patch | 57 - .../patches/exports_2.4.19-pre1.patch | 62 - .../patches/exports_2.4.19-suse.patch | 59 - .../patches/exports_2.4.20.patch | 57 - .../patches/ext-2.4-patch-1-chaos.patch | 2528 - .../patches/ext-2.4-patch-1-suse-2.4.19.patch | 2551 - .../patches/ext-2.4-patch-1-suse.patch | 2528 - .../patches/ext-2.4-patch-1.patch | 2528 - .../patches/ext-2.4-patch-2.patch | 34 - .../patches/ext-2.4-patch-3.patch | 96 - .../patches/ext-2.4-patch-4.patch | 52 - .../patches/ext3-2.4.20-fixes.patch | 118 - .../ext3-delete_thread-2.4.19-suse.patch | 481 - .../ext3-delete_thread-2.4.20-hp.patch | 497 - .../patches/ext3-delete_thread-2.4.20.patch | 541 - .../ext3-delete_thread-2.4.21-chaos.patch | 496 - .../ext3-ea-in-inode-2.4.21-chaos.patch | 760 - .../ext3-ea-in-inode-2.4.21-suse2.patch | 760 - .../patches/ext3-ea-in-inode-2.4.22-rh.patch | 787 - ...20.patch => ext3-ea-in-inode-2.4.24.patch} | 72 +- .../patches/ext3-ea-in-inode-2.6-suse.patch | 72 +- ...t.patch => ext3-error-export-2.4.24.patch} | 0 .../patches/ext3-extents-2.4.20-rh.patch | 2821 - .../patches/ext3-extents-2.4.20.patch | 2807 - .../patches/ext3-extents-2.4.24.patch | 84 +- ...1-suse2.patch => ext3-extents-2.6.7.patch} | 435 +- ....patch => ext3-extents-in-ea-2.4.24.patch} | 0 ...2.patch => ext3-extents-in-ea-2.6.7.patch} | 176 +- ...-extents-in-ea-exports-symbol-2.6.7.patch} | 38 +- .../ext3-extents-in-ea-exports-symbol.patch | 134 - ... => ext3-extents-in-ea-ioctl-2.4.24.patch} | 0 .../ext3-extents-in-ea-ioctl-2.6.7.patch | 228 + .../patches/ext3-htree-2.4.19-pre1.patch | 2588 - .../patches/ext3-htree-2.4.21-chaos.patch | 2593 - ....4.22-rh.patch => ext3-htree-2.4.24.patch} | 0 .../patches/ext3-htree-rename_fix.patch | 24 - .../patches/ext3-htree-suse.patch | 2557 - .../kernel_patches/patches/ext3-htree.patch | 2574 - .../ext3-ino_sb_macro-2.4.21-chaos.patch | 1514 - .../patches/ext3-inode-reuse-2.4.22.patch | 187 - ...20.patch => ext3-inode-reuse-2.4.24.patch} | 0 .../patches/ext3-inode-reuse-2.6.7.patch | 120 + .../patches/ext3-largefile.patch | 16 - .../ext3-map_inode_page-2.4.21-suse2.patch | 114 - ...patch => ext3-map_inode_page-2.4.24.patch} | 0 .../patches/ext3-map_inode_page_2.4.18.patch | 105 - .../patches/ext3-mballoc-2.4.21-suse2.patch | 373 - ...21-suse.patch => ext3-mds-num-2.6.7.patch} | 183 +- .../patches/ext3-nlinks-2.4.24.patch | 170 + ...patch => ext3-no-write-super-2.4.24.patch} | 0 .../patches/ext3-no-write-super.patch | 22 - .../patches/ext3-noread-2.4.21-chaos.patch | 223 - .../patches/ext3-noread-2.4.21-suse2.patch | 218 - ...-2.4.20.patch => ext3-noread-2.4.24.patch} | 0 .../ext3-o_direct-1-2.4.18-chaos.patch | 198 - .../patches/ext3-o_direct-1.2.4.20-rh.patch | 197 - .../patches/ext3-o_direct-1.patch | 177 - .../patches/ext3-o_direct-2.4.21-chaos.patch | 23 - .../ext3-orphan_lock-2.4.19-suse.patch | 85 - ...rh.patch => ext3-orphan_lock-2.4.24.patch} | 0 .../patches/ext3-orphan_lock-suse.patch | 81 - .../patches/ext3-orphan_lock.patch | 79 - .../patches/ext3-pdirops-2.4.18-chaos.patch | 1238 - .../patches/ext3-pdirops-2.4.20.patch | 1268 - ...0-chaos.patch => ext3-pdirops-2.6.7.patch} | 339 +- ...h => ext3-raw-lookup-pdirops-2.4.24.patch} | 0 .../patches/ext3-raw-lookup.patch | 63 - .../patches/ext3-record-extents-ea.patch | 183 - .../ext3-reserve-inode-space-2.4.24.patch | 238 - .../ext3-reserve-inode-space-2.6.7.patch | 286 + ...san-2.4.20.patch => ext3-san-2.4.24.patch} | 0 .../patches/ext3-snapfs-2.4.20.patch | 3069 - ...-start_this_handle-must-return-error.patch | 22 - ...isc-fixup.patch => ext3-super-ntohl.patch} | 12 +- ...=> ext3-truncate-buffer-head-2.4.24.patch} | 0 .../patches/ext3-truncate_blocks.patch | 92 - ....20.patch => ext3-trusted_ea-2.4.24.patch} | 0 .../patches/ext3-trusted_ea-suse-2.4.19.patch | 179 - .../patches/ext3-unmount_sync.patch | 21 - .../ext3-use-after-free-2.4.19-pre1.patch | 53 - .../patches/ext3-use-after-free-suse.patch | 53 - .../patches/ext3-use-after-free.patch | 53 - ... => ext3-xattr-ptr-arith-fix-2.4.24.patch} | 0 .../ext3_delete_thread_2.4.20_chaos.patch | 500 - .../patches/ext3_orphan_lock-2.4.20-rh.patch | 82 - .../patches/ext3_snapfs_exports-2.4.24.patch | 75 - .../patches/extN-2.4.18-ino_sb_fixup.patch | 33 - .../kernel_patches/patches/extN-noread.patch | 235 - .../patches/extN-wantedi-2.4.19-suse.patch | 226 - .../patches/extN-wantedi-2.4.21-chaos.patch | 226 - .../patches/extN-wantedi-2.4.21-suse2.patch | 226 - .../patches/extN-wantedi-2.4.22-rh.patch | 217 - ...antedi.patch => extN-wantedi-2.4.24.patch} | 0 .../patches/gfp_memalloc-2.4.20-rh.patch | 70 - .../patches/gfp_memalloc-2.4.21-chaos.patch | 70 - .../patches/gfp_memalloc-2.4.22.patch | 59 - .../patches/gpl_header-chaos-2.4.20.patch | 11 - .../patches/invalidate_show-2.4.19-pre1.patch | 121 - .../patches/invalidate_show-2.4.20-hp.patch | 123 - .../patches/invalidate_show-2.4.20-rh.patch | 114 - .../invalidate_show-2.4.21-sles8sp3.patch | 134 - ...how.patch => invalidate_show-2.4.24.patch} | 0 .../invalidate_show_2.4.20_chaos.patch | 112 - .../patches/iod-rmap-exports-2.4.20.patch | 86 - .../iod-rmap-exports-2.4.21-chaos.patch | 94 - .../patches/iod-rmap-exports.patch | 86 - .../iod-stock-24-exports-2.4.19-suse.patch | 52 - .../patches/iod-stock-24-exports_hp.patch | 48 - .../patches/iod-stock-exports-2.4.22-rh.patch | 48 - ...2.patch => iod-stock-exports-2.4.24.patch} | 0 .../patches/iopen-2.4.19-suse.patch | 449 - .../patches/iopen-2.4.21-chaos.patch | 487 - .../patches/iopen-2.4.21-sles8sp3.patch | 494 - ...{iopen-2.4.20.patch => iopen-2.4.24.patch} | 10 +- .../patches/iopen-2.6-vanilla.patch | 285 +- .../patches/jbd-2.4.18-jcberr.patch | 274 - .../patches/jbd-2.4.19-pre1-jcberr.patch | 274 - ...s.patch => jbd-commit-tricks-2.4.24.patch} | 0 .../patches/jbd-ctx_switch.patch | 13 - ...bd-dont-account-blocks-twice-2.4.24.patch} | 0 .../patches/jbd-flushtime-2.4.19-suse.patch | 35 - .../patches/jbd-flushtime.patch | 34 - .../patches/jbd-get_write_access.patch | 56 - .../patches/kdev-2.4.19-pre1.patch | 12 - .../kernel_text_address-2.4.18-chaos.patch | 40 - .../kernel_text_address-2.4.19-pre1.patch | 58 - .../kernel_text_address-2.4.20-rh.patch | 68 - .../kernel_text_address-2.4.20-vanilla.patch | 116 - .../kernel_text_address-2.4.21-sles8sp3.patch | 115 - .../kernel_text_address-2.4.22-vanilla.patch | 59 - .../patches/kksymoops-2.4.24.vanilla.patch | 71 +- .../patches/kmem_cache_validate.patch | 119 - .../kmem_cache_validate_2.4.20-rh.patch | 124 - .../patches/kmem_cache_validate_2.4.20.patch | 116 - .../patches/kmem_cache_validate_hp.patch | 121 - .../linux-2.4.19-pre1-xattr-0.8.54.patch | 6045 -- .../linux-2.4.19-xattr-0.8.54-suse.patch | 60 - .../patches/linux-2.4.20-filemap.patch | 9 - .../linux-2.4.20-xattr-0.8.54-chaos.patch | 5531 -- .../linux-2.4.20-xattr-0.8.54-hp.patch | 4875 - .../patches/linux-2.4.20-xattr-0.8.54.patch | 5588 -- .../linux-2.4.21-xattr-0.8.54-chaos.patch | 2195 - .../linux-2.4.21-xattr-0.8.54-suse.patch | 5349 -- .../linux-2.4.21-xattr-0.8.54-suse2.patch | 258 - .../patches/linux-2.4.22-xattr-0.8.54.patch | 5466 -- .../patches/listman-2.4.21-chaos.patch | 26 - ...tman-2.4.20.patch => listman-2.4.24.patch} | 0 .../patches/lookup_bdev_init_intent.patch | 12 + .../patches/loop-sync-2.4.21-suse.patch | 11 - .../patches/loop_device_get_info.patch | 57 - .../kernel_patches/patches/lustre_build.patch | 33 - .../patches/mcore-2.4.20-8.patch | 2738 - .../patches/mkdep-revert-rh-2.4.patch | 50 - .../patches/netconsole-2.4.20-rh.patch | 469 - .../patches/netconsole-over-netpoll.patch | 416 - .../patches/nfs-cifs-intent-2.6-vanilla.patch | 117 + .../nfs_export_kernel-2.4.19-pre1.patch | 757 - .../patches/nfs_export_kernel-2.4.20-hp.patch | 741 - .../patches/nfs_export_kernel-2.4.20-rh.patch | 741 - .../patches/nfs_export_kernel-2.4.20.patch | 737 - .../nfs_export_kernel-2.4.21-chaos.patch | 746 - .../nfs_export_kernel-2.4.21-suse2.patch | 746 - .../patches/nfs_export_kernel-2.4.22-rh.patch | 730 - ...2.patch => nfs_export_kernel-2.4.24.patch} | 0 .../patches/pagecache-lock-2.4.21-chaos.patch | 21 - .../procfs-ndynamic-2.4.21-suse2.patch | 16 - ...2.4.patch => procfs-ndynamic-2.4.24.patch} | 0 .../patches/qlogic-suse-2.4.21-2.patch | 75673 ---------------- .../patches/removepage-2.4.19-suse.patch | 30 - .../patches/removepage-2.4.20.patch | 28 - .../patches/removepage-2.6-suse.patch | 30 - .../patches/resched-2.4.19-pre1.patch | 16 - .../patches/seq-private-2.4.19-pre1.patch | 12 - .../slab-use-after-free-debug-2.4.22.patch | 717 - .../slab-use-after-free-debug-2.4.24.patch | 798 - .../patches/smfs-export-symbol.patch | 13 - .../patches/snapfs_core-2.4.20.patch | 3082 - .../patches/socket-exports-2.4.22-rh.patch | 41 - .../patches/socket-exports-vanilla.patch | 42 - .../patches/tcp-zero-copy-2.4.19-pre1.patch | 461 - .../tcp-zero-copy-2.4.21-sles8sp3.patch | 458 - .../patches/tcp-zero-copy-2.4.21-suse2.patch | 468 - ...22-rh.patch => tcp-zero-copy-2.4.24.patch} | 0 .../patches/tcp-zero-copy.patch | 460 - .../patches/tcp_zero_copy_2.4.20_chaos.patch | 476 - .../uml-2.4.20-do_mmap_pgoff-fix.patch | 16 - .../patches/uml-2.4.20-fixes-1.patch | 215 - .../uml-2.4.24-do_mmap_pgoff-fix.patch | 42 + .../patches/uml-2.6.7-01-bb2.patch | 20390 +++++ ...atch => uml-export-end_iomem-2.4.24.patch} | 0 .../patches/uml-patch-2.4.20-6.patch | 39586 -------- .../patches/uml_check_get_page.patch | 32 - .../patches/uml_get_kmem_end_export.patch | 10 - .../kernel_patches/patches/uml_no_panic.patch | 32 - .../patches/vfs-pdirops-2.4.20.patch | 269 - ...4.20-rh.patch => vfs-pdirops-2.4.24.patch} | 0 ...21-suse2.patch => vfs-pdirops-2.6.7.patch} | 169 +- .../patches/vfs-wantedi-misc-2.6-suse.patch | 16 + .../patches/vfs_intent-2.4.19-pre1.patch | 1922 - .../patches/vfs_intent-2.4.19-suse.patch | 1902 - .../patches/vfs_intent-2.4.20-hp.patch | 1992 - .../patches/vfs_intent-2.4.20-rh.patch | 1923 - .../patches/vfs_intent-2.4.21-chaos.patch | 1905 - .../patches/vfs_intent-2.4.21-sles8sp3.patch | 1901 - .../patches/vfs_intent-2.4.21-suse2.patch | 1914 - .../patches/vfs_intent-2.4.22-rh.patch | 1873 - ...-vanilla.patch => vfs_intent-2.4.24.patch} | 0 .../patches/vfs_intent-2.6-vanilla.patch | 840 + .../patches/vfs_nointent-2.6-vanilla.patch | 509 + .../patches/vfs_races-2.6-vanilla.patch | 65 + .../patches/vmalloc_to_page-2.4.19-pre1.patch | 43 - .../patches/xattr-0.8.54-2.4.22-rh.patch | 5396 -- .../kernel_patches/series/2.6-vanilla.series | 18 + .../series/bproc-2.4.20-hp-pnnl | 37 - lustre/kernel_patches/series/chaos-2.4.21 | 35 - lustre/kernel_patches/series/hp-pnnl-2.4.20 | 46 - ...illa.series => ldiskfs-2.6-vanilla.series} | 7 + lustre/kernel_patches/series/rh-2.4.20 | 48 - lustre/kernel_patches/series/rh-2.4.22 | 32 - lustre/kernel_patches/series/smfs-2.4.20 | 58 - lustre/kernel_patches/series/smfs-2.4.20-rh | 50 - lustre/kernel_patches/series/smfs-2.4.24 | 46 - lustre/kernel_patches/series/snapfs-2.4.20 | 57 - lustre/kernel_patches/series/suse-2.4.19 | 35 - lustre/kernel_patches/series/suse-2.4.21 | 33 - lustre/kernel_patches/series/suse-2.4.21-2 | 45 - .../series/suse-sles8sp3-2.4.21 | 31 - .../kernel_patches/series/vanilla-2.4.19-pre1 | 48 - lustre/kernel_patches/series/vanilla-2.4.20 | 58 - lustre/kernel_patches/series/vanilla-2.4.22 | 35 - lustre/kernel_patches/series/vanilla-2.4.24 | 79 +- lustre/kernel_patches/series/vanilla-2.6.6 | 13 - lustre/ldiskfs/Makefile.in | 5 +- lustre/ldiskfs/autoMakefile.am | 17 +- lustre/ldlm/l_lock.c | 6 +- lustre/ldlm/ldlm_extent.c | 15 +- lustre/ldlm/ldlm_lib.c | 333 +- lustre/ldlm/ldlm_lock.c | 10 +- lustre/ldlm/ldlm_lockd.c | 123 +- lustre/ldlm/ldlm_request.c | 21 +- lustre/ldlm/ldlm_resource.c | 30 +- lustre/liblustre/Makefile.am | 39 +- lustre/liblustre/dir.c | 66 +- lustre/liblustre/file.c | 70 +- lustre/liblustre/genlib.sh | 90 +- lustre/liblustre/llite_lib.c | 499 +- lustre/liblustre/llite_lib.h | 85 +- lustre/liblustre/lutil.c | 353 + lustre/liblustre/lutil.h | 35 + lustre/liblustre/namei.c | 54 +- lustre/liblustre/rw.c | 665 +- lustre/liblustre/super.c | 298 +- lustre/liblustre/tests/Makefile.am | 26 +- lustre/liblustre/tests/echo_test.c | 145 +- lustre/liblustre/tests/recovery_small.c | 4 +- lustre/liblustre/tests/replay_single.c | 4 +- lustre/liblustre/tests/sanity.c | 338 +- lustre/llite/Makefile.in | 4 +- lustre/llite/Makefile.mk | 2 +- lustre/llite/dcache.c | 32 +- lustre/llite/dir.c | 15 +- lustre/llite/file.c | 279 +- lustre/llite/llite_close.c | 2 +- lustre/llite/llite_internal.h | 85 +- lustre/llite/llite_lib.c | 39 +- lustre/llite/llite_mmap.c | 488 + lustre/llite/llite_nfs.c | 2 +- lustre/llite/lproc_llite.c | 221 +- lustre/llite/namei.c | 55 +- lustre/llite/rw.c | 319 +- lustre/llite/rw24.c | 50 +- lustre/llite/rw26.c | 56 +- lustre/llite/super.c | 4 +- lustre/llite/super25.c | 39 +- lustre/llite/symlink.c | 3 +- lustre/lmv/lmv_intent.c | 178 +- lustre/lmv/lmv_obd.c | 4 +- lustre/lov/lov_obd.c | 68 +- lustre/lov/lov_pack.c | 3 +- lustre/lvfs/fsfilt_ext3.c | 149 +- lustre/lvfs/fsfilt_smfs.c | 12 +- lustre/lvfs/llog.c | 18 +- lustre/lvfs/llog_lvfs.c | 18 +- lustre/lvfs/lvfs_internal.h | 4 + lustre/lvfs/lvfs_linux.c | 14 +- lustre/lvfs/lvfs_reint.c | 2 +- lustre/lvfs/lvfs_userfs.c | 2 +- lustre/mdc/mdc_locks.c | 47 +- lustre/mdc/mdc_reint.c | 11 +- lustre/mdc/mdc_request.c | 13 +- lustre/mds/handler.c | 200 +- lustre/mds/lproc_mds.c | 60 +- lustre/mds/mds_fs.c | 22 +- lustre/mds/mds_internal.h | 44 +- lustre/mds/mds_lib.c | 5 +- lustre/mds/mds_lmv.c | 12 +- lustre/mds/mds_lov.c | 34 +- lustre/mds/mds_open.c | 101 +- lustre/mds/mds_reint.c | 536 +- lustre/mds/mds_unlink_open.c | 90 +- lustre/obdclass/class_obd.c | 43 +- lustre/obdclass/genops.c | 152 +- lustre/obdclass/llog_obd.c | 2 +- lustre/obdclass/lprocfs_status.c | 116 + lustre/obdclass/obd_config.c | 111 +- lustre/obdclass/sysctl.c | 6 + lustre/obdecho/echo.c | 55 +- lustre/obdecho/echo_client.c | 30 +- lustre/obdfilter/filter.c | 85 +- lustre/obdfilter/filter_internal.h | 20 +- lustre/obdfilter/filter_io.c | 381 +- lustre/obdfilter/filter_io_24.c | 234 +- lustre/obdfilter/filter_io_26.c | 313 +- lustre/obdfilter/filter_lvb.c | 4 +- lustre/obdfilter/lproc_obdfilter.c | 1 + lustre/osc/lproc_osc.c | 40 +- lustre/osc/osc_create.c | 77 +- lustre/osc/osc_internal.h | 1 + lustre/osc/osc_request.c | 154 +- lustre/ost/lproc_ost.c | 96 + lustre/ost/ost_handler.c | 81 +- lustre/portals/archdep.m4 | 712 +- lustre/portals/autoMakefile.am | 4 +- lustre/portals/build.m4 | 41 +- lustre/portals/include/.cvsignore | 2 + lustre/portals/include/Makefile.am | 3 + lustre/portals/include/linux/Makefile.am | 4 + lustre/portals/include/linux/kp30.h | 73 +- lustre/portals/include/linux/libcfs.h | 131 +- .../portals/include/linux/portals_compat25.h | 8 + lustre/portals/include/linux/portals_lib.h | 112 - lustre/portals/include/portals/Makefile.am | 10 + lustre/portals/include/portals/api.h | 2 + lustre/portals/include/portals/defines.h | 117 - lustre/portals/include/portals/lib-types.h | 8 +- lustre/portals/include/portals/ppid.h | 49 - lustre/portals/include/portals/ptlctl.h | 6 + lustre/portals/include/portals/types.h | 23 +- lustre/portals/knals/Makefile.in | 2 +- lustre/portals/knals/autoMakefile.am | 2 +- lustre/portals/knals/gmnal/gmnal.h | 40 +- lustre/portals/knals/gmnal/gmnal_api.c | 24 +- lustre/portals/knals/gmnal/gmnal_cb.c | 49 +- lustre/portals/knals/gmnal/gmnal_comm.c | 120 +- lustre/portals/knals/gmnal/gmnal_module.c | 13 +- lustre/portals/knals/ibnal/.cvsignore | 10 - lustre/portals/knals/ibnal/Makefile.in | 6 - lustre/portals/knals/ibnal/autoMakefile.am | 10 - lustre/portals/knals/ibnal/ibnal.c | 2142 - lustre/portals/knals/ibnal/ibnal.h | 565 - lustre/portals/knals/ibnal/ibnal_cb.c | 1302 - .../ibnal/ibnal_send_recv_self_testing.c | 116 - lustre/portals/knals/ibnal/uagent.c | 391 - lustre/portals/knals/openibnal/Makefile.in | 6 + lustre/portals/knals/openibnal/Makefile.mk | 10 + .../portals/knals/openibnal/autoMakefile.am | 15 + lustre/portals/knals/openibnal/openibnal.c | 1503 + lustre/portals/knals/openibnal/openibnal.h | 509 + lustre/portals/knals/openibnal/openibnal_cb.c | 2552 + lustre/portals/knals/qswnal/qswnal.c | 13 +- lustre/portals/knals/qswnal/qswnal.h | 2 +- lustre/portals/knals/qswnal/qswnal_cb.c | 97 +- lustre/portals/knals/socknal/socknal.c | 1291 +- lustre/portals/knals/socknal/socknal.h | 137 +- lustre/portals/knals/socknal/socknal_cb.c | 694 +- lustre/portals/libcfs/Makefile.in | 2 +- lustre/portals/libcfs/Makefile.mk | 2 +- lustre/portals/libcfs/autoMakefile.am | 2 +- lustre/portals/libcfs/debug.c | 767 +- lustre/portals/libcfs/lwt.c | 62 +- lustre/portals/libcfs/module.c | 22 +- lustre/portals/libcfs/proc.c | 40 +- lustre/portals/libcfs/tracefile.c | 858 + lustre/portals/libcfs/tracefile.h | 22 + lustre/portals/portals/api-ni.c | 18 +- lustre/portals/portals/api-wrap.c | 24 +- lustre/portals/portals/lib-md.c | 9 +- lustre/portals/portals/lib-move.c | 172 +- lustre/portals/portals/lib-msg.c | 24 +- lustre/portals/router/proc.c | 205 +- lustre/portals/router/router.c | 24 +- lustre/portals/router/router.h | 4 + lustre/portals/tests/ping_cli.c | 22 +- lustre/portals/tests/ping_srv.c | 18 +- lustre/portals/tests/sping_cli.c | 12 +- lustre/portals/tests/sping_srv.c | 14 +- lustre/portals/unals/Makefile.am | 6 +- lustre/portals/unals/connection.c | 83 +- lustre/portals/utils/Makefile.am | 8 +- lustre/portals/utils/acceptor.c | 148 +- lustre/portals/utils/debug.c | 466 +- lustre/portals/utils/debugctl.c | 2 +- lustre/portals/utils/portals.c | 525 +- lustre/portals/utils/ptlctl.c | 12 +- lustre/ptlrpc/Makefile.in | 19 +- lustre/ptlrpc/autoMakefile.am | 2 +- lustre/ptlrpc/client.c | 15 +- lustre/ptlrpc/events.c | 24 +- lustre/ptlrpc/import.c | 121 +- lustre/ptlrpc/llog_server.c | 13 +- lustre/ptlrpc/lproc_ptlrpc.c | 5 +- lustre/ptlrpc/niobuf.c | 18 +- lustre/ptlrpc/pack_generic.c | 17 +- lustre/ptlrpc/pers.c | 6 +- lustre/ptlrpc/ptlrpc_internal.h | 1 + lustre/ptlrpc/ptlrpc_module.c | 1 - lustre/ptlrpc/ptlrpcd.c | 22 +- lustre/ptlrpc/recov_thread.c | 54 +- lustre/ptlrpc/recover.c | 3 + lustre/ptlrpc/service.c | 124 +- lustre/scripts/Makefile.am | 7 +- lustre/scripts/branch.sh | 9 +- lustre/scripts/cvsdiffclient | 8 +- lustre/scripts/land1.sh | 4 +- lustre/scripts/lbuild | 20 +- lustre/scripts/lustre-kernel-2.4.spec.in | 118 +- lustre/scripts/lustre.spec.in | 74 +- lustre/scripts/lustrefs | 84 + lustre/scripts/merge1.sh | 8 +- lustre/tests/.cvsignore | 3 + lustre/tests/Makefile.am | 78 +- lustre/tests/acceptance-small.sh | 4 + lustre/tests/cfg/insanity-local.sh | 2 +- lustre/tests/cfg/insanity-ltest.sh | 75 + lustre/tests/cfg/insanity-mdev.sh | 13 +- lustre/tests/cfg/local.sh | 4 +- lustre/tests/compile.sh | 5 +- lustre/tests/conf-sanity.sh | 54 +- lustre/tests/insanity.sh | 36 +- lustre/tests/lfsck_config.sh | 4 +- lustre/tests/lfscktest.sh | 18 +- lustre/tests/lfscktest_config.sh | 23 +- lustre/tests/llmount.sh | 6 + lustre/tests/llmountcleanup.sh | 3 + lustre/tests/llrmount.sh | 6 + lustre/tests/local.sh | 12 +- lustre/tests/lockorder.sh | 6 +- lustre/tests/lov.sh | 9 +- lustre/tests/memhog.c | 102 + lustre/tests/mmap_sanity.c | 650 + lustre/tests/multiop.c | 3 +- lustre/tests/recovery-cleanup.sh | 6 +- lustre/tests/recovery-small.sh | 17 +- lustre/tests/rename_many.c | 5 +- lustre/tests/replay-dual.sh | 146 +- lustre/tests/replay-ost-single.sh | 8 +- lustre/tests/replay-sanity.sh | 248 + lustre/tests/replay-single.sh | 40 +- lustre/tests/rmdirmany.c | 40 + lustre/tests/runas.c | 2 +- lustre/tests/runtests | 5 +- lustre/tests/sanity-buffalo.sh | 2 +- lustre/tests/sanity.sh | 281 +- lustre/tests/sanityN.sh | 75 +- lustre/tests/test-framework.sh | 27 +- lustre/tests/uml.sh | 3 +- lustre/utils/Lustre/Makefile.am | 5 +- lustre/utils/Makefile.am | 17 +- lustre/utils/lconf | 334 +- lustre/utils/lctl.c | 35 +- lustre/utils/liblustreapi.c | 2 +- lustre/utils/llanalyze | 4 +- lustre/utils/llmount.c | 76 +- lustre/utils/lmc | 36 +- lustre/utils/lustre_cfg.c | 93 +- lustre/utils/lwizard | 17 +- lustre/utils/obd.c | 417 +- lustre/utils/obdctl.c | 1 + lustre/utils/obdctl.h | 3 + lustre/utils/obdiolib.c | 6 + lustre/utils/wirecheck.c | 2 +- lustre/utils/wiretest.c | 12 +- 606 files changed, 51889 insertions(+), 261555 deletions(-) create mode 100644 lnet/include/Makefile.am create mode 100644 lnet/include/linux/Makefile.am create mode 100644 lnet/include/lnet/Makefile.am delete mode 100644 lnet/include/lnet/defines.h delete mode 100644 lnet/include/lnet/ppid.h delete mode 100644 lnet/klnds/iblnd/.cvsignore delete mode 100644 lnet/klnds/iblnd/Makefile.in delete mode 100644 lnet/klnds/iblnd/autoMakefile.am delete mode 100644 lnet/klnds/iblnd/ibnal.c delete mode 100644 lnet/klnds/iblnd/ibnal.h delete mode 100644 lnet/klnds/iblnd/ibnal_cb.c delete mode 100644 lnet/klnds/iblnd/ibnal_send_recv_self_testing.c delete mode 100644 lnet/klnds/iblnd/uagent.c create mode 100644 lnet/klnds/openiblnd/Makefile.in create mode 100644 lnet/klnds/openiblnd/Makefile.mk create mode 100644 lnet/klnds/openiblnd/autoMakefile.am create mode 100644 lnet/klnds/openiblnd/openiblnd.c create mode 100644 lnet/klnds/openiblnd/openiblnd.h create mode 100644 lnet/klnds/openiblnd/openiblnd_cb.c create mode 100644 lnet/libcfs/tracefile.c create mode 100644 lnet/libcfs/tracefile.h create mode 100644 lustre/kernel_patches/kernel_configs/config-linux-2.6.7-uml rename lustre/kernel_patches/patches/{3.5G-address-space-2.4.22-vanilla.patch => 3.5G-address-space-2.4.24-vanilla.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/add_page_private-2.4.19-pre1.patch rename lustre/kernel_patches/patches/{add_page_private.patch => add_page_private-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/bproc-patch-2.4.20 delete mode 100644 lustre/kernel_patches/patches/cifs_2.6.5.patch delete mode 100644 lustre/kernel_patches/patches/configurable-x86-stack-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/configurable-x86-stack-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/configurable-x86-stack-2.4.21-sles8sp3.patch delete mode 100644 lustre/kernel_patches/patches/configurable-x86-stack-2.4.21-suse2.patch delete mode 100644 lustre/kernel_patches/patches/configurable-x86-stack-2.4.22-rh.patch rename lustre/kernel_patches/patches/{configurable-x86-stack-2.4.20.patch => configurable-x86-stack-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/configurable-x86_64-2.4.21.patch create mode 100644 lustre/kernel_patches/patches/dcache-mds-num-2.6.7.patch delete mode 100644 lustre/kernel_patches/patches/dcache_refcount_debug.patch rename lustre/kernel_patches/patches/{dev_read_only_2.4.20-rh.patch => dev_read_only-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/dev_read_only-suse-2.4.19.patch delete mode 100644 lustre/kernel_patches/patches/dev_read_only.patch delete mode 100644 lustre/kernel_patches/patches/dev_read_only_2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/dev_read_only_2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/dev_read_only_hp_2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/dynamic-locks-2.4.20-rh.patch rename lustre/kernel_patches/patches/{dynamic-locks-2.4.21-suse2.patch => dynamic-locks-2.6.7.patch} (81%) rename lustre/kernel_patches/patches/{export-truncate.patch => export-truncate-2.4.24.patch} (100%) create mode 100644 lustre/kernel_patches/patches/export-zap-page-range-2.4.24.patch rename lustre/kernel_patches/patches/{export_lookup_create.patch => export_lookup_create-2.4.24.patch} (100%) create mode 100644 lustre/kernel_patches/patches/export_num_siblings-2.4.24.patch rename lustre/kernel_patches/patches/{exports_2.4.20-rh-hp.patch => exports-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/exports.patch delete mode 100644 lustre/kernel_patches/patches/exports_2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/exports_2.4.19-suse.patch delete mode 100644 lustre/kernel_patches/patches/exports_2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/ext-2.4-patch-1-chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext-2.4-patch-1-suse-2.4.19.patch delete mode 100644 lustre/kernel_patches/patches/ext-2.4-patch-1-suse.patch delete mode 100644 lustre/kernel_patches/patches/ext-2.4-patch-1.patch delete mode 100644 lustre/kernel_patches/patches/ext-2.4-patch-2.patch delete mode 100644 lustre/kernel_patches/patches/ext-2.4-patch-3.patch delete mode 100644 lustre/kernel_patches/patches/ext-2.4-patch-4.patch delete mode 100644 lustre/kernel_patches/patches/ext3-2.4.20-fixes.patch delete mode 100644 lustre/kernel_patches/patches/ext3-delete_thread-2.4.19-suse.patch delete mode 100644 lustre/kernel_patches/patches/ext3-delete_thread-2.4.20-hp.patch delete mode 100644 lustre/kernel_patches/patches/ext3-delete_thread-2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/ext3-delete_thread-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.21-suse2.patch delete mode 100644 lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch rename lustre/kernel_patches/patches/{ext3-ea-in-inode-2.4.20.patch => ext3-ea-in-inode-2.4.24.patch} (92%) rename lustre/kernel_patches/patches/{ext3-error-export.patch => ext3-error-export-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-extents-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/ext3-extents-2.4.20.patch rename lustre/kernel_patches/patches/{ext3-extents-2.4.21-suse2.patch => ext3-extents-2.6.7.patch} (89%) rename lustre/kernel_patches/patches/{ext3-extents-in-ea-2.4.20.patch => ext3-extents-in-ea-2.4.24.patch} (100%) rename lustre/kernel_patches/patches/{ext3-extents-in-ea-2.4.21-suse2.patch => ext3-extents-in-ea-2.6.7.patch} (77%) mode change 100644 => 100755 rename lustre/kernel_patches/patches/{ext3-extents-in-ea-exports-symbol-2.4.21-suse2.patch => ext3-extents-in-ea-exports-symbol-2.6.7.patch} (64%) mode change 100644 => 100755 delete mode 100644 lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol.patch rename lustre/kernel_patches/patches/{ext3-extents-in-ea-ioctl-2.4.20.patch => ext3-extents-in-ea-ioctl-2.4.24.patch} (100%) create mode 100755 lustre/kernel_patches/patches/ext3-extents-in-ea-ioctl-2.6.7.patch delete mode 100644 lustre/kernel_patches/patches/ext3-htree-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/ext3-htree-2.4.21-chaos.patch rename lustre/kernel_patches/patches/{ext3-htree-2.4.22-rh.patch => ext3-htree-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-htree-rename_fix.patch delete mode 100644 lustre/kernel_patches/patches/ext3-htree-suse.patch delete mode 100644 lustre/kernel_patches/patches/ext3-htree.patch delete mode 100644 lustre/kernel_patches/patches/ext3-ino_sb_macro-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext3-inode-reuse-2.4.22.patch rename lustre/kernel_patches/patches/{ext3-inode-reuse-2.4.20.patch => ext3-inode-reuse-2.4.24.patch} (100%) create mode 100755 lustre/kernel_patches/patches/ext3-inode-reuse-2.6.7.patch delete mode 100644 lustre/kernel_patches/patches/ext3-largefile.patch delete mode 100644 lustre/kernel_patches/patches/ext3-map_inode_page-2.4.21-suse2.patch rename lustre/kernel_patches/patches/{ext3-map_inode_page.patch => ext3-map_inode_page-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch delete mode 100644 lustre/kernel_patches/patches/ext3-mballoc-2.4.21-suse2.patch rename lustre/kernel_patches/patches/{ext3-mds-num-2.4.21-suse.patch => ext3-mds-num-2.6.7.patch} (60%) mode change 100644 => 100755 create mode 100644 lustre/kernel_patches/patches/ext3-nlinks-2.4.24.patch rename lustre/kernel_patches/patches/{ext3-no-write-super-chaos.patch => ext3-no-write-super-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-no-write-super.patch delete mode 100644 lustre/kernel_patches/patches/ext3-noread-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext3-noread-2.4.21-suse2.patch rename lustre/kernel_patches/patches/{ext3-noread-2.4.20.patch => ext3-noread-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-o_direct-1-2.4.18-chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext3-o_direct-1.2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/ext3-o_direct-1.patch delete mode 100644 lustre/kernel_patches/patches/ext3-o_direct-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext3-orphan_lock-2.4.19-suse.patch rename lustre/kernel_patches/patches/{ext3-orphan_lock-2.4.22-rh.patch => ext3-orphan_lock-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-orphan_lock-suse.patch delete mode 100644 lustre/kernel_patches/patches/ext3-orphan_lock.patch delete mode 100644 lustre/kernel_patches/patches/ext3-pdirops-2.4.18-chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext3-pdirops-2.4.20.patch rename lustre/kernel_patches/patches/{ext3-pdirops-2.4.20-chaos.patch => ext3-pdirops-2.6.7.patch} (84%) rename lustre/kernel_patches/patches/{ext3-raw-lookup-pdirops.patch => ext3-raw-lookup-pdirops-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-raw-lookup.patch delete mode 100644 lustre/kernel_patches/patches/ext3-record-extents-ea.patch delete mode 100644 lustre/kernel_patches/patches/ext3-reserve-inode-space-2.4.24.patch create mode 100755 lustre/kernel_patches/patches/ext3-reserve-inode-space-2.6.7.patch rename lustre/kernel_patches/patches/{ext3-san-2.4.20.patch => ext3-san-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-snapfs-2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/ext3-start_this_handle-must-return-error.patch rename lustre/kernel_patches/patches/{extN-misc-fixup.patch => ext3-super-ntohl.patch} (59%) rename lustre/kernel_patches/patches/{ext3-truncate-buffer-head.patch => ext3-truncate-buffer-head-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-truncate_blocks.patch rename lustre/kernel_patches/patches/{ext3-trusted_ea-2.4.20.patch => ext3-trusted_ea-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3-trusted_ea-suse-2.4.19.patch delete mode 100644 lustre/kernel_patches/patches/ext3-unmount_sync.patch delete mode 100644 lustre/kernel_patches/patches/ext3-use-after-free-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/ext3-use-after-free-suse.patch delete mode 100644 lustre/kernel_patches/patches/ext3-use-after-free.patch rename lustre/kernel_patches/patches/{ext3-xattr-ptr-arith-fix.patch => ext3-xattr-ptr-arith-fix-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch delete mode 100644 lustre/kernel_patches/patches/ext3_orphan_lock-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/ext3_snapfs_exports-2.4.24.patch delete mode 100644 lustre/kernel_patches/patches/extN-2.4.18-ino_sb_fixup.patch delete mode 100644 lustre/kernel_patches/patches/extN-noread.patch delete mode 100644 lustre/kernel_patches/patches/extN-wantedi-2.4.19-suse.patch delete mode 100644 lustre/kernel_patches/patches/extN-wantedi-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/extN-wantedi-2.4.21-suse2.patch delete mode 100644 lustre/kernel_patches/patches/extN-wantedi-2.4.22-rh.patch rename lustre/kernel_patches/patches/{extN-wantedi.patch => extN-wantedi-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/gfp_memalloc-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/gfp_memalloc-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/gfp_memalloc-2.4.22.patch delete mode 100644 lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/invalidate_show-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/invalidate_show-2.4.20-hp.patch delete mode 100644 lustre/kernel_patches/patches/invalidate_show-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/invalidate_show-2.4.21-sles8sp3.patch rename lustre/kernel_patches/patches/{invalidate_show.patch => invalidate_show-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch delete mode 100644 lustre/kernel_patches/patches/iod-rmap-exports-2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/iod-rmap-exports-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/iod-rmap-exports.patch delete mode 100644 lustre/kernel_patches/patches/iod-stock-24-exports-2.4.19-suse.patch delete mode 100644 lustre/kernel_patches/patches/iod-stock-24-exports_hp.patch delete mode 100644 lustre/kernel_patches/patches/iod-stock-exports-2.4.22-rh.patch rename lustre/kernel_patches/patches/{iod-stock-exports-2.4.22.patch => iod-stock-exports-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/iopen-2.4.19-suse.patch delete mode 100644 lustre/kernel_patches/patches/iopen-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/iopen-2.4.21-sles8sp3.patch rename lustre/kernel_patches/patches/{iopen-2.4.20.patch => iopen-2.4.24.patch} (97%) delete mode 100644 lustre/kernel_patches/patches/jbd-2.4.18-jcberr.patch delete mode 100644 lustre/kernel_patches/patches/jbd-2.4.19-pre1-jcberr.patch rename lustre/kernel_patches/patches/{jbd-commit-tricks.patch => jbd-commit-tricks-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/jbd-ctx_switch.patch rename lustre/kernel_patches/patches/{jbd-dont-account-blocks-twice.patch => jbd-dont-account-blocks-twice-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/jbd-flushtime-2.4.19-suse.patch delete mode 100644 lustre/kernel_patches/patches/jbd-flushtime.patch delete mode 100644 lustre/kernel_patches/patches/jbd-get_write_access.patch delete mode 100644 lustre/kernel_patches/patches/kdev-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/kernel_text_address-2.4.18-chaos.patch delete mode 100644 lustre/kernel_patches/patches/kernel_text_address-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/kernel_text_address-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/kernel_text_address-2.4.20-vanilla.patch delete mode 100644 lustre/kernel_patches/patches/kernel_text_address-2.4.21-sles8sp3.patch delete mode 100644 lustre/kernel_patches/patches/kernel_text_address-2.4.22-vanilla.patch delete mode 100644 lustre/kernel_patches/patches/kmem_cache_validate.patch delete mode 100644 lustre/kernel_patches/patches/kmem_cache_validate_2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/kmem_cache_validate_2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/kmem_cache_validate_hp.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.19-pre1-xattr-0.8.54.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.19-xattr-0.8.54-suse.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.20-filemap.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54-chaos.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54-hp.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-chaos.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-suse.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-suse2.patch delete mode 100644 lustre/kernel_patches/patches/linux-2.4.22-xattr-0.8.54.patch delete mode 100644 lustre/kernel_patches/patches/listman-2.4.21-chaos.patch rename lustre/kernel_patches/patches/{listman-2.4.20.patch => listman-2.4.24.patch} (100%) create mode 100644 lustre/kernel_patches/patches/lookup_bdev_init_intent.patch delete mode 100644 lustre/kernel_patches/patches/loop-sync-2.4.21-suse.patch delete mode 100644 lustre/kernel_patches/patches/loop_device_get_info.patch delete mode 100644 lustre/kernel_patches/patches/lustre_build.patch delete mode 100644 lustre/kernel_patches/patches/mcore-2.4.20-8.patch delete mode 100644 lustre/kernel_patches/patches/mkdep-revert-rh-2.4.patch delete mode 100644 lustre/kernel_patches/patches/netconsole-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/netconsole-over-netpoll.patch create mode 100644 lustre/kernel_patches/patches/nfs-cifs-intent-2.6-vanilla.patch delete mode 100644 lustre/kernel_patches/patches/nfs_export_kernel-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch delete mode 100644 lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/nfs_export_kernel-2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-suse2.patch delete mode 100644 lustre/kernel_patches/patches/nfs_export_kernel-2.4.22-rh.patch rename lustre/kernel_patches/patches/{nfs_export_kernel-2.4.22.patch => nfs_export_kernel-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/pagecache-lock-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/procfs-ndynamic-2.4.21-suse2.patch rename lustre/kernel_patches/patches/{procfs-ndynamic-2.4.patch => procfs-ndynamic-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/qlogic-suse-2.4.21-2.patch delete mode 100644 lustre/kernel_patches/patches/removepage-2.4.19-suse.patch delete mode 100644 lustre/kernel_patches/patches/removepage-2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/removepage-2.6-suse.patch delete mode 100644 lustre/kernel_patches/patches/resched-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/seq-private-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/slab-use-after-free-debug-2.4.22.patch delete mode 100644 lustre/kernel_patches/patches/slab-use-after-free-debug-2.4.24.patch delete mode 100644 lustre/kernel_patches/patches/smfs-export-symbol.patch delete mode 100644 lustre/kernel_patches/patches/snapfs_core-2.4.20.patch delete mode 100644 lustre/kernel_patches/patches/socket-exports-2.4.22-rh.patch delete mode 100644 lustre/kernel_patches/patches/socket-exports-vanilla.patch delete mode 100644 lustre/kernel_patches/patches/tcp-zero-copy-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/tcp-zero-copy-2.4.21-sles8sp3.patch delete mode 100644 lustre/kernel_patches/patches/tcp-zero-copy-2.4.21-suse2.patch rename lustre/kernel_patches/patches/{tcp-zero-copy-2.4.22-rh.patch => tcp-zero-copy-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/tcp-zero-copy.patch delete mode 100644 lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch delete mode 100644 lustre/kernel_patches/patches/uml-2.4.20-do_mmap_pgoff-fix.patch delete mode 100644 lustre/kernel_patches/patches/uml-2.4.20-fixes-1.patch create mode 100644 lustre/kernel_patches/patches/uml-2.4.24-do_mmap_pgoff-fix.patch create mode 100644 lustre/kernel_patches/patches/uml-2.6.7-01-bb2.patch rename lustre/kernel_patches/patches/{uml-export-end_iomem.patch => uml-export-end_iomem-2.4.24.patch} (100%) delete mode 100644 lustre/kernel_patches/patches/uml-patch-2.4.20-6.patch delete mode 100644 lustre/kernel_patches/patches/uml_check_get_page.patch delete mode 100644 lustre/kernel_patches/patches/uml_get_kmem_end_export.patch delete mode 100644 lustre/kernel_patches/patches/uml_no_panic.patch delete mode 100644 lustre/kernel_patches/patches/vfs-pdirops-2.4.20.patch rename lustre/kernel_patches/patches/{vfs-pdirops-2.4.20-rh.patch => vfs-pdirops-2.4.24.patch} (100%) rename lustre/kernel_patches/patches/{vfs-pdirops-2.4.21-suse2.patch => vfs-pdirops-2.6.7.patch} (64%) create mode 100644 lustre/kernel_patches/patches/vfs-wantedi-misc-2.6-suse.patch delete mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.19-suse.patch delete mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.20-hp.patch delete mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.20-rh.patch delete mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.21-chaos.patch delete mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.21-sles8sp3.patch delete mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.21-suse2.patch delete mode 100644 lustre/kernel_patches/patches/vfs_intent-2.4.22-rh.patch rename lustre/kernel_patches/patches/{vfs_intent-2.4.20-vanilla.patch => vfs_intent-2.4.24.patch} (100%) mode change 100644 => 100755 create mode 100644 lustre/kernel_patches/patches/vfs_intent-2.6-vanilla.patch create mode 100644 lustre/kernel_patches/patches/vfs_nointent-2.6-vanilla.patch create mode 100644 lustre/kernel_patches/patches/vfs_races-2.6-vanilla.patch delete mode 100644 lustre/kernel_patches/patches/vmalloc_to_page-2.4.19-pre1.patch delete mode 100644 lustre/kernel_patches/patches/xattr-0.8.54-2.4.22-rh.patch create mode 100644 lustre/kernel_patches/series/2.6-vanilla.series delete mode 100644 lustre/kernel_patches/series/bproc-2.4.20-hp-pnnl delete mode 100644 lustre/kernel_patches/series/chaos-2.4.21 delete mode 100644 lustre/kernel_patches/series/hp-pnnl-2.4.20 rename lustre/kernel_patches/series/{ldiskfs-2.6.6-vanilla.series => ldiskfs-2.6-vanilla.series} (56%) delete mode 100644 lustre/kernel_patches/series/rh-2.4.20 delete mode 100644 lustre/kernel_patches/series/rh-2.4.22 delete mode 100644 lustre/kernel_patches/series/smfs-2.4.20 delete mode 100644 lustre/kernel_patches/series/smfs-2.4.20-rh delete mode 100644 lustre/kernel_patches/series/smfs-2.4.24 delete mode 100644 lustre/kernel_patches/series/snapfs-2.4.20 delete mode 100644 lustre/kernel_patches/series/suse-2.4.19 delete mode 100644 lustre/kernel_patches/series/suse-2.4.21 delete mode 100644 lustre/kernel_patches/series/suse-2.4.21-2 delete mode 100644 lustre/kernel_patches/series/suse-sles8sp3-2.4.21 delete mode 100644 lustre/kernel_patches/series/vanilla-2.4.19-pre1 delete mode 100644 lustre/kernel_patches/series/vanilla-2.4.20 delete mode 100644 lustre/kernel_patches/series/vanilla-2.4.22 delete mode 100644 lustre/kernel_patches/series/vanilla-2.6.6 create mode 100644 lustre/liblustre/lutil.c create mode 100644 lustre/liblustre/lutil.h create mode 100644 lustre/llite/llite_mmap.c create mode 100644 lustre/portals/include/Makefile.am create mode 100644 lustre/portals/include/linux/Makefile.am create mode 100644 lustre/portals/include/portals/Makefile.am delete mode 100644 lustre/portals/include/portals/defines.h delete mode 100644 lustre/portals/include/portals/ppid.h delete mode 100644 lustre/portals/knals/ibnal/.cvsignore delete mode 100644 lustre/portals/knals/ibnal/Makefile.in delete mode 100644 lustre/portals/knals/ibnal/autoMakefile.am delete mode 100644 lustre/portals/knals/ibnal/ibnal.c delete mode 100644 lustre/portals/knals/ibnal/ibnal.h delete mode 100644 lustre/portals/knals/ibnal/ibnal_cb.c delete mode 100644 lustre/portals/knals/ibnal/ibnal_send_recv_self_testing.c delete mode 100644 lustre/portals/knals/ibnal/uagent.c create mode 100644 lustre/portals/knals/openibnal/Makefile.in create mode 100644 lustre/portals/knals/openibnal/Makefile.mk create mode 100644 lustre/portals/knals/openibnal/autoMakefile.am create mode 100644 lustre/portals/knals/openibnal/openibnal.c create mode 100644 lustre/portals/knals/openibnal/openibnal.h create mode 100644 lustre/portals/knals/openibnal/openibnal_cb.c create mode 100644 lustre/portals/libcfs/tracefile.c create mode 100644 lustre/portals/libcfs/tracefile.h create mode 100644 lustre/scripts/lustrefs create mode 100644 lustre/tests/cfg/insanity-ltest.sh create mode 100644 lustre/tests/memhog.c create mode 100644 lustre/tests/mmap_sanity.c create mode 100755 lustre/tests/replay-sanity.sh create mode 100755 lustre/tests/rmdirmany.c diff --git a/ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch b/ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch index 39fa9ce943..92897b6542 100644 --- a/ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch +++ b/ldiskfs/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch @@ -1,10 +1,10 @@ %patch -Index: linux-2.6.0/fs/ext3/ialloc.c +Index: linux-2.6.7/fs/ext3/ialloc.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/ialloc.c 2004-01-14 18:54:11.000000000 +0300 -+++ linux-2.6.0/fs/ext3/ialloc.c 2004-01-14 18:54:12.000000000 +0300 -@@ -627,6 +627,11 @@ - inode->i_generation = EXT3_SB(sb)->s_next_generation++; +--- linux-2.6.7.orig/fs/ext3/ialloc.c 2004-09-06 20:01:18.000000000 +0800 ++++ linux-2.6.7/fs/ext3/ialloc.c 2004-09-06 20:04:42.000000000 +0800 +@@ -629,6 +629,11 @@ + spin_unlock(&sbi->s_next_gen_lock); ei->i_state = EXT3_STATE_NEW; + if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) { @@ -15,11 +15,11 @@ Index: linux-2.6.0/fs/ext3/ialloc.c ret = inode; if(DQUOT_ALLOC_INODE(inode)) { -Index: linux-2.6.0/fs/ext3/inode.c +Index: linux-2.6.7/fs/ext3/inode.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/inode.c 2004-01-14 18:54:12.000000000 +0300 -+++ linux-2.6.0/fs/ext3/inode.c 2004-01-14 19:09:46.000000000 +0300 -@@ -2339,7 +2339,7 @@ +--- linux-2.6.7.orig/fs/ext3/inode.c 2004-09-06 20:01:20.000000000 +0800 ++++ linux-2.6.7/fs/ext3/inode.c 2004-09-06 20:04:42.000000000 +0800 +@@ -2349,7 +2349,7 @@ * trying to determine the inode's location on-disk and no read need be * performed. */ @@ -28,7 +28,7 @@ Index: linux-2.6.0/fs/ext3/inode.c struct ext3_iloc *iloc, int in_mem) { unsigned long block; -@@ -2547,6 +2547,11 @@ +@@ -2558,6 +2558,11 @@ ei->i_data[block] = raw_inode->i_block[block]; INIT_LIST_HEAD(&ei->i_orphan); @@ -40,7 +40,7 @@ Index: linux-2.6.0/fs/ext3/inode.c if (S_ISREG(inode->i_mode)) { inode->i_op = &ext3_file_inode_operations; inode->i_fop = &ext3_file_operations; -@@ -2682,6 +2687,9 @@ +@@ -2693,6 +2698,9 @@ } else for (block = 0; block < EXT3_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; @@ -50,10 +50,10 @@ Index: linux-2.6.0/fs/ext3/inode.c BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); rc = ext3_journal_dirty_metadata(handle, bh); if (!err) -Index: linux-2.6.0/fs/ext3/xattr.c +Index: linux-2.6.7/fs/ext3/xattr.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/xattr.c 2003-12-30 08:33:13.000000000 +0300 -+++ linux-2.6.0/fs/ext3/xattr.c 2004-01-14 18:54:12.000000000 +0300 +--- linux-2.6.7.orig/fs/ext3/xattr.c 2004-06-16 13:19:36.000000000 +0800 ++++ linux-2.6.7/fs/ext3/xattr.c 2004-09-06 20:05:40.000000000 +0800 @@ -246,17 +246,12 @@ } @@ -113,7 +113,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return -ENOENT; + -+ ret = ext3_get_inode_loc(inode, &iloc); ++ ret = ext3_get_inode_loc(inode, &iloc, 1); + if (ret) + return ret; + raw_inode = ext3_raw_inode(&iloc); @@ -251,7 +251,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return 0; + -+ ret = ext3_get_inode_loc(inode, &iloc); ++ ret = ext3_get_inode_loc(inode, &iloc, 1); + if (ret) + return ret; + raw_inode = ext3_raw_inode(&iloc); @@ -388,7 +388,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return ret; + -+ err = ext3_get_inode_loc(inode, &iloc); ++ err = ext3_get_inode_loc(inode, &iloc, 1); + if (err) + return -EIO; + raw_inode = ext3_raw_inode(&iloc); @@ -519,7 +519,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return -ENOSPC; + -+ err = ext3_get_inode_loc(inode, &iloc); ++ err = ext3_get_inode_loc(inode, &iloc, 1); + if (err) + return err; + raw_inode = ext3_raw_inode(&iloc); @@ -749,7 +749,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c const char *name, const void *value, size_t value_len, int flags) { -@@ -492,22 +1078,7 @@ +@@ -492,22 +1079,7 @@ * towards the end of the block). * end -- Points right after the block pointed to by header. */ @@ -772,7 +772,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c if (EXT3_I(inode)->i_file_acl) { /* The inode already has an extended attribute block. */ bh = sb_bread(sb, EXT3_I(inode)->i_file_acl); -@@ -733,7 +1304,6 @@ +@@ -733,7 +1305,6 @@ brelse(bh); if (!(bh && header == HDR(bh))) kfree(header); @@ -780,10 +780,10 @@ Index: linux-2.6.0/fs/ext3/xattr.c return error; } -Index: linux-2.6.0/fs/ext3/xattr.h +Index: linux-2.6.7/fs/ext3/xattr.h =================================================================== ---- linux-2.6.0.orig/fs/ext3/xattr.h 2003-06-24 18:04:43.000000000 +0400 -+++ linux-2.6.0/fs/ext3/xattr.h 2004-01-14 18:54:12.000000000 +0300 +--- linux-2.6.7.orig/fs/ext3/xattr.h 2004-06-16 13:20:04.000000000 +0800 ++++ linux-2.6.7/fs/ext3/xattr.h 2004-09-06 20:04:42.000000000 +0800 @@ -77,7 +77,8 @@ extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); extern int ext3_xattr_list(struct inode *, char *, size_t); @@ -794,10 +794,10 @@ Index: linux-2.6.0/fs/ext3/xattr.h extern void ext3_xattr_delete_inode(handle_t *, struct inode *); extern void ext3_xattr_put_super(struct super_block *); -Index: linux-2.6.0/include/linux/ext3_fs.h +Index: linux-2.6.7/include/linux/ext3_fs.h =================================================================== ---- linux-2.6.0.orig/include/linux/ext3_fs.h 2004-01-14 18:54:11.000000000 +0300 -+++ linux-2.6.0/include/linux/ext3_fs.h 2004-01-14 18:54:12.000000000 +0300 +--- linux-2.6.7.orig/include/linux/ext3_fs.h 2004-09-06 20:01:19.000000000 +0800 ++++ linux-2.6.7/include/linux/ext3_fs.h 2004-09-06 20:04:42.000000000 +0800 @@ -265,6 +265,8 @@ __u32 m_i_reserved2[2]; } masix2; @@ -807,10 +807,18 @@ Index: linux-2.6.0/include/linux/ext3_fs.h }; #define i_size_high i_dir_acl -Index: linux-2.6.0/include/linux/ext3_fs_i.h +@@ -725,6 +727,7 @@ + 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 *, int); + extern void ext3_read_inode (struct inode *); + extern void ext3_write_inode (struct inode *, int); + extern int ext3_setattr (struct dentry *, struct iattr *); +Index: linux-2.6.7/include/linux/ext3_fs_i.h =================================================================== ---- linux-2.6.0.orig/include/linux/ext3_fs_i.h 2003-12-30 08:32:44.000000000 +0300 -+++ linux-2.6.0/include/linux/ext3_fs_i.h 2004-01-14 18:54:12.000000000 +0300 +--- linux-2.6.7.orig/include/linux/ext3_fs_i.h 2004-06-16 13:18:52.000000000 +0800 ++++ linux-2.6.7/include/linux/ext3_fs_i.h 2004-09-06 20:04:42.000000000 +0800 @@ -96,6 +96,9 @@ */ loff_t i_disksize; @@ -825,9 +833,9 @@ Index: linux-2.6.0/include/linux/ext3_fs_i.h %diffstat fs/ext3/ialloc.c | 5 fs/ext3/inode.c | 10 - fs/ext3/xattr.c | 634 +++++++++++++++++++++++++++++++++++++++++++--- + fs/ext3/xattr.c | 635 +++++++++++++++++++++++++++++++++++++++++++--- fs/ext3/xattr.h | 3 - include/linux/ext3_fs.h | 2 + include/linux/ext3_fs.h | 3 include/linux/ext3_fs_i.h | 3 - 6 files changed, 623 insertions(+), 34 deletions(-) + 6 files changed, 625 insertions(+), 34 deletions(-) diff --git a/ldiskfs/ldiskfs/Makefile.in b/ldiskfs/ldiskfs/Makefile.in index 7d1e229e95..80d9efb84d 100644 --- a/ldiskfs/ldiskfs/Makefile.in +++ b/ldiskfs/ldiskfs/Makefile.in @@ -7,11 +7,10 @@ ext3_extra := $(wildcard @LINUX@/fs/ext3/Makefile) ext3_headers := $(wildcard @LINUX@/fs/ext3/*.h) linux_headers := $(wildcard @LINUX@/include/linux/ext3*.h) - +new_linux_hearders := ext3_extents.h ext3_sources := $(filter-out %.mod.c,$(wildcard @LINUX@/fs/ext3/*.c)) -new_sources := iopen.c iopen.h +new_sources := iopen.c iopen.h extents.c extents-in-ea.c ldiskfs_sources := $(notdir $(ext3_sources) $(ext3_headers)) $(new_sources) - ldiskfs-objs := $(filter %.o,$(ldiskfs_sources:.c=.o)) EXTRA_PRE_CFLAGS := -I@LINUX@/fs -I@LUSTRE@ -I@LUSTRE@/ldiskfs diff --git a/ldiskfs/ldiskfs/autoMakefile.am b/ldiskfs/ldiskfs/autoMakefile.am index 11838d68af..e33e4c941a 100644 --- a/ldiskfs/ldiskfs/autoMakefile.am +++ b/ldiskfs/ldiskfs/autoMakefile.am @@ -27,15 +27,25 @@ linux/ldiskfs%.h: linux-stage/include/linux/ext3%.h # FIXME: we need to grab the series in configure somehow # (see bug 1679) # -series := @top_srcdir@/kernel_patches/series/ldiskfs-2.6-suse.series +series := @top_srcdir@/kernel_patches/series/ldiskfs-$(LDISKFS_SERIES) +patches := @top_srcdir@/kernel_patches/patches sources: $(ext3_sources) $(ext3_headers) $(linux_headers) $(series) rm -rf linux-stage linux sources $(ldiskfs_SOURCES) mkdir -p linux-stage/fs/ext3 linux-stage/include/linux - cd linux-stage && quilt setup -l ../$(series) cp $(ext3_sources) $(ext3_headers) $(ext3_extra) linux-stage/fs/ext3 cp $(linux_headers) linux-stage/include/linux cd linux-stage && quilt push -a -q +if USE_QUILT + cd linux-stage && quilt setup -l ../$(series) -d ../$(patches) + cd linux-stage && quilt push -a -q +else + @cd linux-stage && for i in $$(<../$(series)) ; do \ + echo "patch -p1 < ../$(patches)/$$i" ; \ + patch -p1 < ../$(patches)/$$i || exit 1 ; \ + done +endif + mkdir linux @echo -n "Replacing 'ext3' with 'ldiskfs':" @for i in $(notdir $(ext3_headers) $(ext3_sources)) $(new_sources) ; do \ @@ -43,12 +53,13 @@ sources: $(ext3_sources) $(ext3_headers) $(linux_headers) $(series) sed $(strip $(ldiskfs_sed_flags)) \ linux-stage/fs/ext3/$$i > $$i ; \ done - @for i in $(subst ext3,,$(notdir $(linux_headers))) ; do \ + @for i in $(subst ext3,,$(notdir $(linux_headers)) $(new_linux_hearders)) ; do \ echo -n " ext3$$i" ; \ sed $(strip $(ldiskfs_sed_flags)) \ linux-stage/include/linux/ext3$$i \ > linux/ldiskfs$$i ; \ done + @echo touch sources foo-check: diff --git a/lnet/archdep.m4 b/lnet/archdep.m4 index db70ec0ccb..d2bd1a142a 100644 --- a/lnet/archdep.m4 +++ b/lnet/archdep.m4 @@ -1,7 +1,7 @@ # -------- we can't build modules unless srcdir = builddir if test x$enable_modules != xno ; then -AC_CHECK_FILE([autoMakefile.am],[], - [AC_MSG_ERROR([At this time, Lustre does not support building kernel modules with srcdir != buildir.])]) + AC_CHECK_FILE([autoMakefile.am],[], + [AC_MSG_ERROR([At this time, Lustre does not support building kernel modules with srcdir != buildir.])]) fi # -------- in kernel compilation? (2.5 only) ------------- @@ -21,13 +21,15 @@ AC_ARG_WITH([cray-portals], [ if test "$with_cray_portals" != no; then if test -r $with_cray_portals/include/portals/api.h ; then + CRAY_PORTALS_PATH=$with_cray_portals CRAY_PORTALS_INCLUDE="-I$with_cray_portals/include" AC_DEFINE(CRAY_PORTALS, 1, [Building with Cray Portals]) else AC_MSG_ERROR([--with-cray-portals specified badly]) - fi - fi + fi + fi ],[with_cray_portals=no]) +AC_SUBST(CRAY_PORTALS_PATH) AC_MSG_RESULT([$with_cray_portals]) AM_CONDITIONAL(CRAY_PORTALS, test x$with_cray_portals != xno) @@ -42,43 +44,44 @@ if test x$enable_utils = xno ; then enable_utils=no fi -# -------- set linuxdir ------------ -AC_MSG_CHECKING([for Linux sources]) -AC_ARG_WITH([linux], - AC_HELP_STRING([--with-linux=path], - [set path to Linux source (default=/usr/src/linux)]), - [LINUX=$with_linux], - [LINUX=/usr/src/linux]) -AC_MSG_RESULT([$LINUX]) -AC_SUBST(LINUX) -if test x$enable_inkernel = xyes ; then - echo ln -s `pwd` $LINUX/fs/lustre - rm $LINUX/fs/lustre - ln -s `pwd` $LINUX/fs/lustre -fi - -# -------- check for .confg -------- -AC_ARG_WITH([linux-config], - [AC_HELP_STRING([--with-linux-config=path], - [set path to Linux .conf (default=\$LINUX/.config)])], - [LINUX_CONFIG=$with_linux_config], - [LINUX_CONFIG=$LINUX/.config]) -AC_SUBST(LINUX_CONFIG) - -AC_CHECK_FILE([/boot/kernel.h], - [KERNEL_SOURCE_HEADER='/boot/kernel.h'], - [AC_CHECK_FILE([/var/adm/running-kernel.h]), - [KERNEL_SOURCE_HEADER='/var/adm/running-kernel.h']]) - -AC_ARG_WITH([kernel-source-header], - AC_HELP_STRING([--with-kernel-source-header=path], - [Use a different kernel version header. Consult README.kernel-source for details.]), - [KERNEL_SOURCE_HEADER=$with_kernel_source_header]) - -# -------------------- -ARCH_UM= -UML_CFLAGS= if test x$enable_modules != xno ; then + # -------- set linuxdir ------------ + AC_MSG_CHECKING([for Linux sources]) + AC_ARG_WITH([linux], + AC_HELP_STRING([--with-linux=path], + [set path to Linux source (default=/usr/src/linux)]), + [LINUX=$with_linux], + [LINUX=/usr/src/linux]) + AC_MSG_RESULT([$LINUX]) + AC_SUBST(LINUX) + if test x$enable_inkernel = xyes ; then + echo ln -s `pwd` $LINUX/fs/lustre + rm $LINUX/fs/lustre + ln -s `pwd` $LINUX/fs/lustre + fi + + # -------- check for .confg -------- + AC_ARG_WITH([linux-config], + [AC_HELP_STRING([--with-linux-config=path], + [set path to Linux .conf (default=\$LINUX/.config)])], + [LINUX_CONFIG=$with_linux_config], + [LINUX_CONFIG=$LINUX/.config]) + AC_SUBST(LINUX_CONFIG) + + AC_CHECK_FILE([/boot/kernel.h], + [KERNEL_SOURCE_HEADER='/boot/kernel.h'], + [AC_CHECK_FILE([/var/adm/running-kernel.h]), + [KERNEL_SOURCE_HEADER='/var/adm/running-kernel.h']]) + + AC_ARG_WITH([kernel-source-header], + AC_HELP_STRING([--with-kernel-source-header=path], + [Use a different kernel version header. Consult README.kernel-source for details.]), + [KERNEL_SOURCE_HEADER=$with_kernel_source_header]) + + # -------------------- + ARCH_UM= + UML_CFLAGS= + AC_MSG_CHECKING([if you are running user mode linux for $host_cpu]) if test -e $LINUX/include/asm-um ; then if test X`ls -id $LINUX/include/asm/ | awk '{print $1}'` = X`ls -id $LINUX/include/asm-um | awk '{print $1}'` ; then @@ -92,23 +95,36 @@ if test x$enable_modules != xno ; then else AC_MSG_RESULT([no (asm-um missing)]) fi -fi -AC_SUBST(ARCH_UM) -AC_SUBST(UML_CFLAGS) -# --------- Linux 25 ------------------ -AC_CHECK_FILE([$LINUX/include/linux/namei.h], - [ - linux25="yes" - KMODEXT=".ko" - ],[ - KMODEXT=".o" - linux25="no" - ]) -AC_MSG_CHECKING([if you are using Linux 2.6]) -AC_MSG_RESULT([$linux25]) + AC_SUBST(ARCH_UM) + AC_SUBST(UML_CFLAGS) + + # --------- Linux 25 ------------------ + AC_CHECK_FILE([$LINUX/include/linux/namei.h], + [ + linux25="yes" + KMODEXT=".ko" + enable_ldiskfs="yes" + BACKINGFS="ldiskfs" + ],[ + KMODEXT=".o" + linux25="no" + ]) + AC_MSG_CHECKING([if you are using Linux 2.6]) + AC_MSG_RESULT([$linux25]) + + AC_SUBST(LINUX25) + AC_SUBST(KMODEXT) + + AC_PATH_PROG(PATCH, patch, [no]) + AC_PATH_PROG(QUILT, quilt, [no]) + + if test x$enable_ldiskfs$PATCH$QUILT = xyesnono ; then + AC_MSG_ERROR([Quilt or patch are needed to build the ldiskfs module (for Linux 2.6)]) + fi +fi AM_CONDITIONAL(LINUX25, test x$linux25 = xyes) -AC_SUBST(KMODEXT) +AM_CONDITIONAL(USE_QUILT, test x$QUILT != xno) # ------- Makeflags ------------------ @@ -208,14 +224,29 @@ if test x$enable_modules != xno ; then ]) # ------------ LINUXRELEASE and moduledir ------------------ - AC_MSG_CHECKING([for Linux release]) - rm -f kernel-tests/conftest.i - LINUXRELEASE= + MODULE_TARGET="SUBDIRS" if test $linux25 = 'yes' ; then + # ------------ external module support --------------------- makerule="$PWD/kernel-tests" + AC_MSG_CHECKING([for external module build support]) + rm -f kernel-tests/conftest.i + LUSTRE_MODULE_TRY_MAKE([],[], + [$makerule LUSTRE_KERNEL_TEST=conftest.i], + [test -s kernel-tests/conftest.i], + [ + AC_MSG_RESULT([no]) + ],[ + AC_MSG_RESULT([yes]) + makerule="_module_$makerule" + MODULE_TARGET="M" + ]) else makerule="_dir_$PWD/kernel-tests" fi + AC_SUBST(MODULE_TARGET) + LINUXRELEASE= + rm -f kernel-tests/conftest.i + AC_MSG_CHECKING([for Linux release]) LUSTRE_MODULE_TRY_MAKE( [#include <linux/version.h>], [char *LINUXRELEASE; @@ -237,244 +268,301 @@ if test x$enable_modules != xno ; then AC_MSG_RESULT([$LINUXRELEASE]) AC_SUBST(LINUXRELEASE) - moduledir='$(libdir)/modules/'$LINUXRELEASE/kernel - AC_SUBST(moduledir) - + moduledir='/lib/modules/'$LINUXRELEASE/kernel modulefsdir='$(moduledir)/fs/$(PACKAGE)' + modulenetdir='$(moduledir)/net/$(PACKAGE)' + + AC_SUBST(moduledir) AC_SUBST(modulefsdir) + AC_SUBST(modulenetdir) # ------------ RELEASE -------------------------------- AC_MSG_CHECKING([for Lustre release]) RELEASE="`echo ${LINUXRELEASE} | tr '-' '_'`_`date +%Y%m%d%H%M`" AC_MSG_RESULT($RELEASE) AC_SUBST(RELEASE) -fi -# ---------- Portals flags -------------------- - -#AC_PREFIX_DEFAULT([]) -#if test "x$prefix" = xNONE || test "x$prefix" = x; then -# usrprefix=/usr -#else -# usrprefix='${prefix}' -#fi -#AC_SUBST(usrprefix) - -AC_MSG_CHECKING([for zero-copy TCP support]) -AC_ARG_ENABLE([zerocopy], - AC_HELP_STRING([--disable-zerocopy], - [disable socknal zerocopy]), - [],[enable_zerocopy='yes']) -if test x$enable_zerocopy = xno ; then - AC_MSG_RESULT([no (by request)]) -else - ZCCD="`grep -c zccd $LINUX/include/linux/skbuff.h`" - if test "$ZCCD" != 0 ; then - AC_DEFINE(SOCKNAL_ZC, 1, [use zero-copy TCP]) - AC_MSG_RESULT(yes) + # ---------- Portals flags -------------------- + + AC_MSG_CHECKING([for zero-copy TCP support]) + AC_ARG_ENABLE([zerocopy], + AC_HELP_STRING([--disable-zerocopy], + [disable socknal zerocopy]), + [],[enable_zerocopy='yes']) + if test x$enable_zerocopy = xno ; then + AC_MSG_RESULT([no (by request)]) else - AC_MSG_RESULT([no (no kernel support)]) + ZCCD="`grep -c zccd $LINUX/include/linux/skbuff.h`" + if test "$ZCCD" != 0 ; then + AC_DEFINE(SOCKNAL_ZC, 1, [use zero-copy TCP]) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT([no (no kernel support)]) + fi fi -fi -AC_MSG_CHECKING([for CPU affinity support]) -AC_ARG_ENABLE([affinity], - AC_HELP_STRING([--disable-affinity], - [disable process/irq affinity]), - [],[enable_affinity='yes']) -if test x$enable_affinity = xno ; then - AC_MSG_RESULT([no (by request)]) -else - SET_CPUS_ALLOW="`grep -c set_cpus_allowed $LINUX/kernel/softirq.c`" - if test "$SET_CPUS_ALLOW" != 0 ; then - AC_DEFINE(CPU_AFFINITY, 1, [kernel has cpu affinity support]) - AC_MSG_RESULT([yes]) + AC_ARG_ENABLE([affinity], + AC_HELP_STRING([--disable-affinity], + [disable process/irq affinity]), + [],[enable_affinity='yes']) + + AC_MSG_CHECKING([for CPU affinity support]) + if test x$enable_affinity = xno ; then + AC_MSG_RESULT([no (by request)]) else - AC_MSG_RESULT([no (no kernel support)]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/sched.h> + ],[ + struct task_struct t; + #ifdef CPU_ARRAY_SIZE + cpumask_t m; + #else + unsigned long m; + #endif + set_cpus_allowed(&t, m); + ],[ + AC_DEFINE(CPU_AFFINITY, 1, [kernel has cpu affinity support]) + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no (no kernel support)]) + ]) fi -fi - -##################################### + ##################################### -AC_MSG_CHECKING([if quadrics kernel headers are present]) -if test -d $LINUX/drivers/net/qsnet ; then - AC_MSG_RESULT([yes]) - QSWNAL="qswnal" - AC_MSG_CHECKING([for multirail EKC]) - if test -f $LINUX/include/elan/epcomms.h; then - AC_MSG_RESULT([supported]) - QSWCPPFLAGS="-DMULTIRAIL_EKC=1" - else - AC_MSG_RESULT([not supported]) - if test -d $LINUX/drivers/net/qsnet/include; then - QSWCPPFLAGS="-I$LINUX/drivers/net/qsnet/include" + AC_MSG_CHECKING([if quadrics kernel headers are present]) + if test -d $LINUX/drivers/net/qsnet ; then + AC_MSG_RESULT([yes]) + QSWNAL="qswnal" + AC_MSG_CHECKING([for multirail EKC]) + if test -f $LINUX/include/elan/epcomms.h; then + AC_MSG_RESULT([supported]) + QSWCPPFLAGS="-DMULTIRAIL_EKC=1" else - QSWCPPFLAGS="-I$LINUX/include/linux" + AC_MSG_RESULT([not supported]) + if test -d $LINUX/drivers/net/qsnet/include; then + QSWCPPFLAGS="-I$LINUX/drivers/net/qsnet/include" + else + QSWCPPFLAGS="-I$LINUX/include/linux" + fi fi + else + AC_MSG_RESULT([no]) + QSWNAL="" + QSWCPPFLAGS="" fi -else - AC_MSG_RESULT([no]) - QSWNAL="" - QSWCPPFLAGS="" -fi -AC_SUBST(QSWCPPFLAGS) -AC_SUBST(QSWNAL) -AM_CONDITIONAL(BUILD_QSWNAL, test x$QSWNAL = "xqswnal") + AC_SUBST(QSWCPPFLAGS) + AC_SUBST(QSWNAL) -AC_MSG_CHECKING([if gm support was requested]) -AC_ARG_WITH([gm], - AC_HELP_STRING([--with-gm=path], - [build gmnal against path]), - [ - case $with_gm in - yes) - AC_MSG_RESULT([yes]) - GMCPPFLAGS="-I/usr/local/gm/include" - GMNAL="gmnal" - ;; - no) - AC_MSG_RESULT([no]) - GMCPPFLAGS="" - GMNAL="" - ;; - *) - AC_MSG_RESULT([yes]) - GMCPPFLAGS="-I$with_gm/include -I$with_gm/drivers -I$with_gm/drivers/linux/gm" - GMNAL="gmnal" - ;; - esac - ],[ - AC_MSG_RESULT([no]) - GMCPPFLAGS="" - GMNAL="" - ]) -AC_SUBST(GMCPPFLAGS) -AC_SUBST(GMNAL) -AM_CONDITIONAL(BUILD_GMNAL, test x$GMNAL = "xgmnal") + AC_MSG_CHECKING([if gm support was requested]) + AC_ARG_WITH([gm], + AC_HELP_STRING([--with-gm=path], + [build gmnal against path]), + [ + case $with_gm in + yes) + AC_MSG_RESULT([yes]) + GMCPPFLAGS="-I/usr/local/gm/include" + GMNAL="gmnal" + ;; + no) + AC_MSG_RESULT([no]) + GMCPPFLAGS="" + GMNAL="" + ;; + *) + AC_MSG_RESULT([yes]) + GMCPPFLAGS="-I$with_gm/include -I$with_gm/drivers -I$with_gm/drivers/linux/gm" + GMNAL="gmnal" + ;; + esac + ],[ + AC_MSG_RESULT([no]) + GMCPPFLAGS="" + GMNAL="" + ]) + AC_SUBST(GMCPPFLAGS) + AC_SUBST(GMNAL) + + #### OpenIB + AC_MSG_CHECKING([if OpenIB kernel headers are present]) + OPENIBCPPFLAGS="-I$LINUX/drivers/infiniband/include -DIN_TREE_BUILD" + EXTRA_KCFLAGS_save="$EXTRA_KCFLAGS" + EXTRA_KCFLAGS="$EXTRA_KCFLAGS $OPENIBCPPFLAGS" + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <ts_ib_core.h> + ],[ + struct ib_device_properties props; + return 0; + ],[ + AC_MSG_RESULT([yes]) + OPENIBNAL="openibnal" + ],[ + AC_MSG_RESULT([no]) + OPENIBNAL="" + OPENIBCPPFLAGS="" + ]) + EXTRA_KCFLAGS="$EXTRA_KCFLAGS_save" + AC_SUBST(OPENIBCPPFLAGS) + AC_SUBST(OPENIBNAL) -#fixme: where are the default IB includes? -default_ib_include_dir=/usr/local/ib/include -an_ib_include_file=vapi.h + # ---------- Red Hat 2.4.18 has iobuf->dovary -------------- + # But other kernels don't -AC_MSG_CHECKING([if ib nal support was requested]) -AC_ARG_WITH([ib], - AC_HELP_STRING([--with-ib=yes/no/path], - [Path to IB includes]), - [ - case $with_ib in - yes) - AC_MSG_RESULT([yes]) - IBCPPFLAGS="-I/usr/local/ib/include" - IBNAL="ibnal" - ;; - no) - AC_MSG_RESULT([no]) - IBCPPFLAGS="" - IBNAL="" - ;; - *) - AC_MSG_RESULT([yes]) - IBCPPFLAGS="-I$with_ib" - IBNAL="" - ;; - esac - ],[ - AC_MSG_RESULT([no]) - IBFLAGS="" - IBNAL="" - ]) -AC_SUBST(IBNAL) -AC_SUBST(IBCPPFLAGS) -AM_CONDITIONAL(BUILD_IBNAL, test x$IBNAL = "xibnal") + AC_MSG_CHECKING([if struct kiobuf has a dovary field]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/iobuf.h> + ],[ + struct kiobuf iobuf; + iobuf.dovary = 1; + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_KIOBUF_DOVARY, 1, [struct kiobuf has a dovary field]) + ],[ + AC_MSG_RESULT([no]) + ]) + + # ----------- 2.6.4 no longer has page->list --------------- + AC_MSG_CHECKING([if struct page has a list field]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/mm.h> + ],[ + struct page page; + &page.list; + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_PAGE_LIST, 1, [struct page has a list field]) + ],[ + AC_MSG_RESULT([no]) + ]) -AC_SUBST(MOD_LINK) -AC_SUBST(LINUX25) + # ---------- Red Hat 2.4.20 backports some 2.5 bits -------- + # This needs to run after we've defined the KCPPFLAGS -# ---------- Red Hat 2.4.18 has iobuf->dovary -------------- -# But other kernels don't + AC_MSG_CHECKING([if task_struct has a sighand field]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/sched.h> + ],[ + struct task_struct p; + p.sighand = NULL; + ],[ + AC_DEFINE(CONFIG_RH_2_4_20, 1, [this kernel contains Red Hat 2.4.20 patches]) + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + ]) -AC_MSG_CHECKING([if struct kiobuf has a dovary field]) -LUSTRE_MODULE_TRY_COMPILE( - [ - #include <linux/iobuf.h> - ],[ - struct kiobuf iobuf; - iobuf.dovary = 1; - ],[ + # ---------- 2.4.20 introduced cond_resched -------------- + + AC_MSG_CHECKING([if kernel offers cond_resched]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/sched.h> + ],[ + cond_resched(); + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_COND_RESCHED, 1, [cond_resched found]) + ],[ + AC_MSG_RESULT([no]) + ]) + + # --------- zap_page_range(vma) -------------------------------- + AC_MSG_CHECKING([if zap_pag_range with vma parameter]) + ZAP_PAGE_RANGE_VMA="`grep -c 'zap_page_range.*struct vm_area_struct' $LINUX/include/linux/mm.h`" + if test "$ZAP_PAGE_RANGE_VMA" != 0 ; then + AC_DEFINE(ZAP_PAGE_RANGE_VMA, 1, [zap_page_range with vma parameter]) AC_MSG_RESULT([yes]) - AC_DEFINE(HAVE_KIOBUF_DOVARY, 1, [struct kiobuf has a dovary field]) - ],[ + else AC_MSG_RESULT([no]) - ]) + fi -# ----------- 2.6.4 no longer has page->list --------------- -AC_MSG_CHECKING([if struct page has a list field]) -LUSTRE_MODULE_TRY_COMPILE( - [ - #include <linux/mm.h> - ],[ - struct page page; - &page.list; - ],[ + # ---------- Red Hat 2.4.21 backports some more 2.5 bits -------- + + AC_MSG_CHECKING([if kernel defines PDE]) + HAVE_PDE="`grep -c 'proc_dir_entry..PDE' $LINUX/include/linux/proc_fs.h`" + if test "$HAVE_PDE" != 0 ; then + AC_DEFINE(HAVE_PDE, 1, [the kernel defines PDE]) AC_MSG_RESULT([yes]) - AC_DEFINE(HAVE_PAGE_LIST, 1, [struct page has a list field]) - ],[ + else AC_MSG_RESULT([no]) - ]) + fi -# ---------- Red Hat 2.4.20 backports some 2.5 bits -------- -# This needs to run after we've defined the KCPPFLAGS + AC_MSG_CHECKING([if kernel passes struct file to direct_IO]) + HAVE_DIO_FILE="`grep -c 'direct_IO.*struct file' $LINUX/include/linux/fs.h`" + if test "$HAVE_DIO_FILE" != 0 ; then + AC_DEFINE(HAVE_DIO_FILE, 1, [the kernel passes struct file to direct_IO]) + AC_MSG_RESULT(yes) + else + AC_MSG_RESULT(no) + fi -AC_MSG_CHECKING([for kernel version]) -LUSTRE_MODULE_TRY_COMPILE( - [ - #include <linux/sched.h> - ],[ - struct task_struct p; - p.sighand = NULL; - ],[ - AC_DEFINE(CONFIG_RH_2_4_20, 1, [this kernel contains Red Hat 2.4.20 patches]) - AC_MSG_RESULT([redhat-2.4.20]) - ],[ - AC_MSG_RESULT([$LINUXRELEASE]) - ]) - -# ---------- 2.4.20 introduced cond_resched -------------- - -AC_MSG_CHECKING([if kernel offers cond_resched]) -LUSTRE_MODULE_TRY_COMPILE( - [ - #include <linux/sched.h> - ],[ - cond_resched(); - ],[ - AC_MSG_RESULT([yes]) - AC_DEFINE(HAVE_COND_RESCHED, 1, [cond_resched found]) - ],[ - AC_MSG_RESULT([no]) - ]) -# ---------- Red Hat 2.4.21 backports some more 2.5 bits -------- - -AC_MSG_CHECKING([if kernel defines PDE]) -HAVE_PDE="`grep -c 'proc_dir_entry..PDE' $LINUX/include/linux/proc_fs.h`" -if test "$HAVE_PDE" != 0 ; then - AC_DEFINE(HAVE_PDE, 1, [the kernel defines PDE]) - AC_MSG_RESULT([yes]) -else - AC_MSG_RESULT([no]) -fi + AC_MSG_CHECKING([if kernel defines cpu_online()]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/sched.h> + ],[ + cpu_online(0); + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_CPU_ONLINE, 1, [cpu_online found]) + ],[ + AC_MSG_RESULT([no]) + ]) + AC_MSG_CHECKING([if kernel defines cpumask_t]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/sched.h> + ],[ + return sizeof (cpumask_t); + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_CPUMASK_T, 1, [cpumask_t found]) + ],[ + AC_MSG_RESULT([no]) + ]) + + # ---------- RHEL kernels define page_count in mm_inline.h + AC_MSG_CHECKING([if kernel has mm_inline.h header]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/mm_inline.h> + ],[ + #ifndef page_count + #error mm_inline.h does not define page_count + #endif + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_MM_INLINE, 1, [mm_inline found]) + ],[ + AC_MSG_RESULT([no]) + ]) + + # ---------- inode->i_alloc_sem -------------- + AC_MSG_CHECKING([if struct inode has i_alloc_sem]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/fs.h> + #include <linux/version.h> + ],[ + #if defined(CONFIG_X86_64) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,24)) + #error "x86_64 down_read_trylock broken before 2.4.24" + #endif + struct inode i; + return (char *)&i.i_alloc_sem - (char *)&i; + ],[ + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_I_ALLOC_SEM, 1, [struct inode has i_alloc_sem]) + ],[ + AC_MSG_RESULT([no]) + ]) -AC_MSG_CHECKING([if kernel passes struct file to direct_IO]) -HAVE_DIO_FILE="`grep -c 'direct_IO.*struct file' $LINUX/include/linux/fs.h`" -if test "$HAVE_DIO_FILE" != 0 ; then - AC_DEFINE(HAVE_DIO_FILE, 1, [the kernel passes struct file to direct_IO]) - AC_MSG_RESULT(yes) -else - AC_MSG_RESULT(no) -fi -if test x$enable_modules != xno ; then # ---------- modules? ------------------------ AC_MSG_CHECKING([for module support]) LUSTRE_MODULE_TRY_COMPILE( @@ -522,53 +610,63 @@ if test x$enable_modules != xno ; then AC_MSG_RESULT([no]) ]) - if test $BACKINGFS = 'ext3' ; then - # --- Check that ext3 and ext3 xattr are enabled in the kernel - AC_MSG_CHECKING([that ext3 is enabled in the kernel]) - LUSTRE_MODULE_TRY_COMPILE( - [ - #include <linux/config.h> - ],[ - #ifndef CONFIG_EXT3_FS - #ifndef CONFIG_EXT3_FS_MODULE - #error CONFIG_EXT3_FS not #defined - #endif - #endif - ],[ - AC_MSG_RESULT([yes]) - ],[ - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Lustre requires that ext3 is enabled in the kernel (CONFIG_EXT3_FS)]) - ]) - - AC_MSG_CHECKING([that extended attributes for ext3 are enabled in the kernel]) - LUSTRE_MODULE_TRY_COMPILE( - [ - #include <linux/config.h> - ],[ - #ifndef CONFIG_EXT3_FS_XATTR - #error CONFIG_EXT3_FS_XATTR not #defined - #endif - ],[ - AC_MSG_RESULT([yes]) - ],[ - AC_MSG_RESULT([no]) - AC_MSG_WARN([Lustre requires that extended attributes for ext3 are enabled in the kernel (CONFIG_EXT3_FS_XATTR.)]) - AC_MSG_WARN([This build may fail.]) - ]) - fi # BACKINGFS = ext3 + case $BACKINGFS in + ext3) + # --- Check that ext3 and ext3 xattr are enabled in the kernel + AC_MSG_CHECKING([that ext3 is enabled in the kernel]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/config.h> + ],[ + #ifndef CONFIG_EXT3_FS + #ifndef CONFIG_EXT3_FS_MODULE + #error CONFIG_EXT3_FS not #defined + #endif + #endif + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Lustre requires that ext3 is enabled in the kernel (CONFIG_EXT3_FS)]) + ]) + + AC_MSG_CHECKING([that extended attributes for ext3 are enabled in the kernel]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/config.h> + ],[ + #ifndef CONFIG_EXT3_FS_XATTR + #error CONFIG_EXT3_FS_XATTR not #defined + #endif + ],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_WARN([Lustre requires that extended attributes for ext3 are enabled in the kernel (CONFIG_EXT3_FS_XATTR.)]) + AC_MSG_WARN([This build may fail.]) + ]) + ;; + ldiskfs) + AC_MSG_CHECKING([if fshooks are present]) + LUSTRE_MODULE_TRY_COMPILE( + [ + #include <linux/fshooks.h> + ],[],[ + AC_MSG_RESULT([yes]) + LDISKFS_SERIES="2.6-suse.series" + ],[ + AC_MSG_RESULT([no]) + LDISKFS_SERIES="2.6-vanilla.series" + ]) + AC_SUBST(LDISKFS_SERIES) + # --- check which ldiskfs series we should use + ;; + esac # $BACKINGFS fi -# ---------- check ->lookup_raw() support -------- - -AC_MSG_CHECKING([if kernel supports ->lookup_raw()]) -HAVE_LOOKUP_RAW="`grep -c 'lookup_raw.*struct inode' $LINUX/include/linux/fs.h`" -if test "$HAVE_LOOKUP_RAW" != 0 ; then - AC_DEFINE(HAVE_LOOKUP_RAW, 1, [the kernel supports ->lookup_raw()]) - AC_MSG_RESULT([yes]) -else - AC_MSG_RESULT([no]) -fi +AM_CONDITIONAL(BUILD_QSWNAL, test x$QSWNAL = "xqswnal") +AM_CONDITIONAL(BUILD_GMNAL, test x$GMNAL = "xgmnal") +AM_CONDITIONAL(BUILD_OPENIBNAL, test x$OPENIBNAL = "xopenibnal") CPPFLAGS="-include \$(top_builddir)/include/config.h $CPPFLAGS" EXTRA_KCFLAGS="-include $PWD/include/config.h $EXTRA_KCFLAGS" diff --git a/lnet/autoMakefile.am b/lnet/autoMakefile.am index bd57e6e07c..485ff04081 100644 --- a/lnet/autoMakefile.am +++ b/lnet/autoMakefile.am @@ -3,6 +3,6 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution -EXTRA_DIST = archdep.m4 build.m4 include +EXTRA_DIST = archdep.m4 build.m4 -SUBDIRS = portals libcfs knals unals router tests doc utils +SUBDIRS = portals libcfs knals unals router tests doc utils include diff --git a/lnet/build.m4 b/lnet/build.m4 index 93a370f736..861bb4a7f0 100644 --- a/lnet/build.m4 +++ b/lnet/build.m4 @@ -15,29 +15,22 @@ if test $ac_cv_sizeof_unsigned_long_long != 8 ; then fi # directories for binaries -ac_default_prefix= -bindir='${exec_prefix}/usr/bin' -sbindir='${exec_prefix}/usr/sbin' -includedir='${prefix}/usr/include' +ac_default_prefix=/usr -rootsbindir='${exec_prefix}/sbin' +# mount.lustre +rootsbindir='/sbin' AC_SUBST(rootsbindir) - +sysconfdir='/etc' +AC_SUBST(sysconfdir) # Directories for documentation and demos. -docdir='${prefix}/usr/share/doc/$(PACKAGE)' +docdir='${datadir}/doc/$(PACKAGE)' AC_SUBST(docdir) demodir='$(docdir)/demo' AC_SUBST(demodir) -pkgexampledir='${prefix}/usr/lib/$(PACKAGE)/examples' +pkgexampledir='${pkgdatadir}/examples' AC_SUBST(pkgexampledir) -pymoddir='${prefix}/usr/lib/${PACKAGE}/python/Lustre' +pymoddir='${pkglibdir}/python/Lustre' AC_SUBST(pymoddir) -# for substitution in lconf -PYMOD_DIR="/usr/lib/$PACKAGE/python" -AC_SUBST(PYMOD_DIR) -modulenetdir='$(moduledir)/net/$(PACKAGE)' -AC_SUBST(modulenetdir) - # ---------- BAD gcc? ------------ AC_PROG_RANLIB @@ -105,3 +98,21 @@ else LIBEFENCE="" fi AC_SUBST(LIBEFENCE) + +# -------- enable acceptor libwrap (TCP wrappers) support? ------- +AC_MSG_CHECKING([if libwrap support is requested]) +AC_ARG_ENABLE([libwrap], + AC_HELP_STRING([--enable-libwrap], [use TCP wrappers]), + [case "${enableval}" in + yes) enable_libwrap=yes ;; + no) enable_libwrap=no ;; + *) AC_MSG_ERROR(bad value ${enableval} for --enable-libwrap) ;; + esac],[enable_libwrap=no]) +AC_MSG_RESULT([$enable_libwrap]) +if test x$enable_libwrap = xyes ; then + LIBWRAP="-lwrap" + AC_DEFINE(HAVE_LIBWRAP, 1, [libwrap support is requested]) +else + LIBWRAP="" +fi +AC_SUBST(LIBWRAP) diff --git a/lnet/include/.cvsignore b/lnet/include/.cvsignore index d45f796491..94d3790678 100644 --- a/lnet/include/.cvsignore +++ b/lnet/include/.cvsignore @@ -2,3 +2,5 @@ config.h stamp-h stamp-h1 stamp-h.in +Makefile +Makefile.in diff --git a/lnet/include/Makefile.am b/lnet/include/Makefile.am new file mode 100644 index 0000000000..2b3eb8cf07 --- /dev/null +++ b/lnet/include/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = linux portals + +EXTRA_DIST = cygwin-ioctl.h diff --git a/lnet/include/linux/Makefile.am b/lnet/include/linux/Makefile.am new file mode 100644 index 0000000000..3c28c6e833 --- /dev/null +++ b/lnet/include/linux/Makefile.am @@ -0,0 +1,4 @@ +linuxdir = $(includedir)/linux + +EXTRA_DIST = kp30.h kpr.h libcfs.h lustre_list.h portals_compat25.h \ + portals_lib.h diff --git a/lnet/include/linux/kp30.h b/lnet/include/linux/kp30.h index b13f161638..db63a0812f 100644 --- a/lnet/include/linux/kp30.h +++ b/lnet/include/linux/kp30.h @@ -59,14 +59,11 @@ extern void kportal_assertion_failed(char *expr, char *file, const char *func, const int line); #define LASSERT(e) ((e) ? 0 : kportal_assertion_failed( #e , __FILE__, \ __FUNCTION__, __LINE__)) -/* it would be great to dump_stack() here, but some kernels - * export it as show_stack() and I can't be bothered to - * proprely engage in that dance right now */ #define LASSERTF(cond, fmt...) \ do { \ if (unlikely(!(cond))) { \ - portals_debug_msg(0, D_EMERG, __FILE__, __FUNCTION__,\ - __LINE__, CDEBUG_STACK, \ + portals_debug_msg(DEBUG_SUBSYSTEM, D_EMERG, __FILE__,\ + __FUNCTION__,__LINE__, CDEBUG_STACK,\ "ASSERTION(" #cond ") failed:" fmt);\ LBUG(); \ } \ @@ -95,6 +92,7 @@ do { \ #define LBUG_WITH_LOC(file, func, line) \ do { \ CEMERG("LBUG\n"); \ + CERROR("STACK: %s\n", portals_debug_dumpstack()); \ portals_debug_dumplog(); \ portals_run_lbug_upcall(file, func, line); \ set_task_state(current, TASK_UNINTERRUPTIBLE); \ @@ -337,25 +335,27 @@ char *portals_id2str(int nal, ptl_process_id_t nid, char *str); * Support for temporary event tracing with minimal Heisenberg effect. */ #define LWT_SUPPORT 0 -#define LWT_MEMORY (64<<20) -#define LWT_MAX_CPUS 4 +#define LWT_MEMORY (16<<20) +#if !KLWT_SUPPORT +/* kernel hasn't defined this? */ typedef struct { - cycles_t lwte_when; + long long lwte_when; char *lwte_where; void *lwte_task; long lwte_p1; long lwte_p2; long lwte_p3; long lwte_p4; -#if BITS_PER_LONG > 32 +# if BITS_PER_LONG > 32 long lwte_pad; -#endif +# endif } lwt_event_t; +#endif /* !KLWT_SUPPORT */ #if LWT_SUPPORT -#ifdef __KERNEL__ -#define LWT_EVENTS_PER_PAGE (PAGE_SIZE / sizeof (lwt_event_t)) +# ifdef __KERNEL__ +# if !KLWT_SUPPORT typedef struct _lwt_page { struct list_head lwtp_list; @@ -371,20 +371,13 @@ typedef struct { extern int lwt_enabled; extern lwt_cpu_t lwt_cpus[]; -extern int lwt_init (void); -extern void lwt_fini (void); -extern int lwt_lookup_string (int *size, char *knlptr, - char *usrptr, int usrsize); -extern int lwt_control (int enable, int clear); -extern int lwt_snapshot (cycles_t *now, int *ncpu, int *total_size, - void *user_ptr, int user_size); - /* Note that we _don't_ define LWT_EVENT at all if LWT_SUPPORT isn't set. * This stuff is meant for finding specific problems; it never stays in * production code... */ #define LWTSTR(n) #n #define LWTWHERE(f,l) f ":" LWTSTR(l) +#define LWT_EVENTS_PER_PAGE (PAGE_SIZE / sizeof (lwt_event_t)) #define LWT_EVENT(p1, p2, p3, p4) \ do { \ @@ -393,9 +386,9 @@ do { \ lwt_page_t *p; \ lwt_event_t *e; \ \ - local_irq_save (flags); \ - \ if (lwt_enabled) { \ + local_irq_save (flags); \ + \ cpu = &lwt_cpus[smp_processor_id()]; \ p = cpu->lwtc_current_page; \ e = &p->lwtp_events[cpu->lwtc_current_index++]; \ @@ -414,13 +407,23 @@ do { \ e->lwte_p2 = (long)(p2); \ e->lwte_p3 = (long)(p3); \ e->lwte_p4 = (long)(p4); \ - } \ \ - local_irq_restore (flags); \ + local_irq_restore (flags); \ + } \ } while (0) -#else /* __KERNEL__ */ -#define LWT_EVENT(p1,p2,p3,p4) /* no userland implementation yet */ -#endif /* __KERNEL__ */ + +#endif /* !KLWT_SUPPORT */ + +extern int lwt_init (void); +extern void lwt_fini (void); +extern int lwt_lookup_string (int *size, char *knlptr, + char *usrptr, int usrsize); +extern int lwt_control (int enable, int clear); +extern int lwt_snapshot (cycles_t *now, int *ncpu, int *total_size, + void *user_ptr, int user_size); +# else /* __KERNEL__ */ +# define LWT_EVENT(p1,p2,p3,p4) /* no userland implementation yet */ +# endif /* __KERNEL__ */ #endif /* LWT_SUPPORT */ struct portals_device_userstate @@ -620,14 +623,14 @@ static inline int portal_ioctl_getdata(char *buf, char *end, void *arg) #define IOC_PORTAL_MIN_NR 30 #define IOC_PORTAL_PING _IOWR('e', 30, long) -#define IOC_PORTAL_GET_DEBUG _IOWR('e', 31, long) + #define IOC_PORTAL_CLEAR_DEBUG _IOWR('e', 32, long) #define IOC_PORTAL_MARK_DEBUG _IOWR('e', 33, long) #define IOC_PORTAL_PANIC _IOWR('e', 34, long) #define IOC_PORTAL_NAL_CMD _IOWR('e', 35, long) #define IOC_PORTAL_GET_NID _IOWR('e', 36, long) #define IOC_PORTAL_FAIL_NID _IOWR('e', 37, long) -#define IOC_PORTAL_SET_DAEMON _IOWR('e', 38, long) + #define IOC_PORTAL_LWT_CONTROL _IOWR('e', 39, long) #define IOC_PORTAL_LWT_SNAPSHOT _IOWR('e', 40, long) #define IOC_PORTAL_LWT_LOOKUP_STRING _IOWR('e', 41, long) @@ -641,7 +644,7 @@ enum { /* 4 unused */ TCPNAL = 5, ROUTER = 6, - IBNAL = 7, + OPENIBNAL = 7, NAL_ENUM_END_MARKER }; @@ -654,14 +657,18 @@ enum { #define NAL_CMD_REGISTER_MYNID 102 #define NAL_CMD_PUSH_CONNECTION 103 #define NAL_CMD_GET_CONN 104 -#define NAL_CMD_DEL_AUTOCONN 105 -#define NAL_CMD_ADD_AUTOCONN 106 -#define NAL_CMD_GET_AUTOCONN 107 +#define NAL_CMD_DEL_PEER 105 +#define NAL_CMD_ADD_PEER 106 +#define NAL_CMD_GET_PEER 107 #define NAL_CMD_GET_TXDESC 108 #define NAL_CMD_ADD_ROUTE 109 #define NAL_CMD_DEL_ROUTE 110 #define NAL_CMD_GET_ROUTE 111 #define NAL_CMD_NOTIFY_ROUTER 112 +#define NAL_CMD_ADD_INTERFACE 113 +#define NAL_CMD_DEL_INTERFACE 114 +#define NAL_CMD_GET_INTERFACE 115 + enum { DEBUG_DAEMON_START = 1, diff --git a/lnet/include/linux/libcfs.h b/lnet/include/linux/libcfs.h index b725a568db..d1a5c4485b 100644 --- a/lnet/include/linux/libcfs.h +++ b/lnet/include/linux/libcfs.h @@ -2,51 +2,58 @@ * vim:expandtab:shiftwidth=8:tabstop=8: */ #ifndef _LIBCFS_H +#define _LIBCFS_H - -#define PORTAL_DEBUG - -/* I think this beast is just trying to get cycles_t and get_cycles(). - * this should be in its own header. */ -#ifdef __linux__ -# include <asm/types.h> -# if defined(__powerpc__) && !defined(__KERNEL__) -# define __KERNEL__ -# include <asm/timex.h> -# undef __KERNEL__ -# else -# if defined(__KERNEL__) -# include <asm/timex.h> -# else -# include <sys/time.h> -# define cycles_t unsigned long -static inline cycles_t get_cycles(void) -{ - struct timeval tv; - gettimeofday(&tv, NULL); - return (tv.tv_sec * 100000) + tv.tv_usec; -} -# endif -# endif -#else -# include <sys/types.h> -typedef u_int32_t __u32; -typedef u_int64_t __u64; -#endif +#include <asm/types.h> #ifdef __KERNEL__ # include <linux/time.h> +# include <asm/timex.h> #else # include <sys/time.h> # define do_gettimeofday(tv) gettimeofday(tv, NULL); +typedef unsigned long long cycles_t; #endif +#define PORTAL_DEBUG + #ifndef offsetof # define offsetof(typ,memb) ((unsigned long)((char *)&(((typ *)0)->memb))) #endif #define LOWEST_BIT_SET(x) ((x) & ~((x) - 1)) +#ifndef __KERNEL__ +/* Userpace byte flipping */ +# include <endian.h> +# include <byteswap.h> +# define __swab16(x) bswap_16(x) +# define __swab32(x) bswap_32(x) +# define __swab64(x) bswap_64(x) +# define __swab16s(x) do {*(x) = bswap_16(*(x));} while (0) +# define __swab32s(x) do {*(x) = bswap_32(*(x));} while (0) +# define __swab64s(x) do {*(x) = bswap_64(*(x));} while (0) +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define le16_to_cpu(x) (x) +# define cpu_to_le16(x) (x) +# define le32_to_cpu(x) (x) +# define cpu_to_le32(x) (x) +# define le64_to_cpu(x) (x) +# define cpu_to_le64(x) (x) +# else +# if __BYTE_ORDER == __BIG_ENDIAN +# define le16_to_cpu(x) bswap_16(x) +# define cpu_to_le16(x) bswap_16(x) +# define le32_to_cpu(x) bswap_32(x) +# define cpu_to_le32(x) bswap_32(x) +# define le64_to_cpu(x) bswap_64(x) +# define cpu_to_le64(x) bswap_64(x) +# else +# error "Unknown byte order" +# endif /* __BIG_ENDIAN */ +# endif /* __LITTLE_ENDIAN */ +#endif /* ! __KERNEL__ */ + /* * Debugging */ @@ -54,7 +61,24 @@ extern unsigned int portal_subsystem_debug; extern unsigned int portal_stack; extern unsigned int portal_debug; extern unsigned int portal_printk; -extern unsigned int portal_cerror; + +#include <asm/types.h> +struct ptldebug_header { + __u32 ph_len; + __u32 ph_flags; + __u32 ph_subsys; + __u32 ph_mask; + __u32 ph_cpu_id; + __u32 ph_sec; + __u64 ph_usec; + __u32 ph_stack; + __u32 ph_pid; + __u32 ph_extern_pid; + __u32 ph_line_num; +} __attribute__((packed)); + +#define PH_FLAG_FIRST_RECORD 1 + /* Debugging subsystems (32 bits, non-overlapping) */ #define S_UNDEFINED 0x00000001 #define S_MDC 0x00000002 @@ -78,7 +102,7 @@ extern unsigned int portal_cerror; #define S_GMNAL 0x00080000 #define S_PTLROUTER 0x00100000 #define S_COBD 0x00200000 -#define S_IBNAL 0x00400000 +#define S_OPENIBNAL 0x00400000 #define S_SM 0x00800000 #define S_ASOBD 0x01000000 #define S_LMV 0x02000000 @@ -111,8 +135,8 @@ extern unsigned int portal_cerror; #define D_RPCTRACE 0x00100000 /* for distributed debugging */ #define D_VFSTRACE 0x00200000 #define D_READA 0x00400000 /* read-ahead */ -#define D_CONFIG 0x00800000 - +#define D_MMAP 0x00800000 +#define D_CONFIG 0x01000000 #ifdef __KERNEL__ # include <linux/sched.h> /* THREAD_SIZE */ #else @@ -123,8 +147,7 @@ extern unsigned int portal_cerror; #define LUSTRE_TRACE_SIZE (THREAD_SIZE >> 5) -//#ifdef __KERNEL__ -#if 0 +#ifdef __KERNEL__ # ifdef __ia64__ # define CDEBUG_STACK (THREAD_SIZE - \ ((unsigned long)__builtin_dwarf_cfa() & \ @@ -133,7 +156,7 @@ extern unsigned int portal_cerror; # define CDEBUG_STACK (THREAD_SIZE - \ ((unsigned long)__builtin_frame_address(0) & \ (THREAD_SIZE - 1))) -# endif +# endif /* __ia64__ */ #define CHECK_STACK(stack) \ do { \ @@ -145,7 +168,7 @@ extern unsigned int portal_cerror; /*panic("LBUG");*/ \ } \ } while (0) -#else /* __KERNEL__ */ +#else /* !__KERNEL__ */ #define CHECK_STACK(stack) do { } while(0) #define CDEBUG_STACK (0L) #endif /* __KERNEL__ */ @@ -153,8 +176,7 @@ extern unsigned int portal_cerror; #if 1 #define CDEBUG(mask, format, a...) \ do { \ - if (likely(portal_debug == 0)) \ - break; \ + CHECK_STACK(CDEBUG_STACK); \ if (((mask) & (D_ERROR | D_EMERG | D_WARNING)) || \ (portal_debug & (mask) && \ portal_subsystem_debug & DEBUG_SUBSYSTEM)) \ @@ -163,26 +185,9 @@ do { \ CDEBUG_STACK, format, ## a); \ } while (0) -#define CWARN(format, a...) \ -do { \ - portals_debug_msg(DEBUG_SUBSYSTEM, D_WARNING, \ - __FILE__, __FUNCTION__, __LINE__, \ - CDEBUG_STACK, format, ## a); \ -} while (0) - -#define CERROR(format, a...) \ -do { \ - portals_debug_msg(DEBUG_SUBSYSTEM, D_ERROR, \ - __FILE__, __FUNCTION__, __LINE__, \ - CDEBUG_STACK, format, ## a); \ -} while (0) - -#define CEMERG(format, a...) \ -do { \ - portals_debug_msg(DEBUG_SUBSYSTEM, D_EMERG, \ - __FILE__, __FUNCTION__, __LINE__, \ - CDEBUG_STACK, format, ## a); \ -} while (0) +#define CWARN(format, a...) CDEBUG(D_WARNING, format, ## a) +#define CERROR(format, a...) CDEBUG(D_ERROR, format, ## a) +#define CEMERG(format, a...) CDEBUG(D_EMERG, format, ## a) #define GOTO(label, rc) \ do { \ @@ -212,9 +217,9 @@ do { \ } while(0) #else #define CDEBUG(mask, format, a...) do { } while (0) -#define CWARN(format, a...) printk("<4>" format, ## a) -#define CERROR(format, a...) printk("<3>" format, ## a) -#define CEMERG(format, a...) printk("<0>" format, ## a) +#define CWARN(format, a...) printk(KERN_WARNING format, ## a) +#define CERROR(format, a...) printk(KERN_ERR format, ## a) +#define CEMERG(format, a...) printk(KERN_EMERG format, ## a) #define GOTO(label, rc) do { (void)(rc); goto label; } while (0) #define RETURN(rc) return (rc) #define ENTRY do { } while (0) diff --git a/lnet/include/linux/portals_compat25.h b/lnet/include/linux/portals_compat25.h index 9ab4020706..7fe6dfce5d 100644 --- a/lnet/include/linux/portals_compat25.h +++ b/lnet/include/linux/portals_compat25.h @@ -80,4 +80,12 @@ extern int is_kernel_text_address(unsigned long addr); #define PAGE_LIST(page) ((page)->lru) #endif +#ifndef HAVE_CPU_ONLINE +#define cpu_online(cpu) (test_bit(cpu_online_map, &(cpu))) +#endif +#ifndef HAVE_CPUMASK_T +#define cpu_set(cpu, map) (set_bit(cpu, &(map))) +typedef unsigned long cpumask_t; +#endif + #endif /* _PORTALS_COMPAT_H */ diff --git a/lnet/include/linux/portals_lib.h b/lnet/include/linux/portals_lib.h index b4741cc281..8778a52aee 100644 --- a/lnet/include/linux/portals_lib.h +++ b/lnet/include/linux/portals_lib.h @@ -64,118 +64,6 @@ static inline size_t round_strlen(char *fset) return size_round(strlen(fset) + 1); } -#ifdef __KERNEL__ -static inline char *strdup(const char *str) -{ - int len = strlen(str) + 1; - char *tmp = kmalloc(len, GFP_KERNEL); - if (tmp) - memcpy(tmp, str, len); - - return tmp; -} -#endif - -#ifdef __KERNEL__ -# define NTOH__u16(var) le16_to_cpu(var) -# define NTOH__u32(var) le32_to_cpu(var) -# define NTOH__u64(var) le64_to_cpu(var) -# define HTON__u16(var) cpu_to_le16(var) -# define HTON__u32(var) cpu_to_le32(var) -# define HTON__u64(var) cpu_to_le64(var) -#else -# define expansion_u64(var) \ - ({ __u64 ret; \ - switch (sizeof(var)) { \ - case 8: (ret) = (var); break; \ - case 4: (ret) = (__u32)(var); break; \ - case 2: (ret) = (__u16)(var); break; \ - case 1: (ret) = (__u8)(var); break; \ - }; \ - (ret); \ - }) -# define NTOH__u16(var) (var) -# define NTOH__u32(var) (var) -# define NTOH__u64(var) (expansion_u64(var)) -# define HTON__u16(var) (var) -# define HTON__u32(var) (var) -# define HTON__u64(var) (expansion_u64(var)) -#endif - -/* - * copy sizeof(type) bytes from pointer to var and move ptr forward. - * return EFAULT if pointer goes beyond end - */ -#define UNLOGV(var,type,ptr,end) \ -do { \ - var = *(type *)ptr; \ - ptr += sizeof(type); \ - if (ptr > end ) \ - return -EFAULT; \ -} while (0) - -/* the following two macros convert to little endian */ -/* type MUST be __u32 or __u64 */ -#define LUNLOGV(var,type,ptr,end) \ -do { \ - var = NTOH##type(*(type *)ptr); \ - ptr += sizeof(type); \ - if (ptr > end ) \ - return -EFAULT; \ -} while (0) - -/* now log values */ -#define LOGV(var,type,ptr) \ -do { \ - *((type *)ptr) = var; \ - ptr += sizeof(type); \ -} while (0) - -/* and in network order */ -#define LLOGV(var,type,ptr) \ -do { \ - *((type *)ptr) = HTON##type(var); \ - ptr += sizeof(type); \ -} while (0) - - -/* - * set var to point at (type *)ptr, move ptr forward with sizeof(type) - * return from function with EFAULT if ptr goes beyond end - */ -#define UNLOGP(var,type,ptr,end) \ -do { \ - var = (type *)ptr; \ - ptr += sizeof(type); \ - if (ptr > end ) \ - return -EFAULT; \ -} while (0) - -#define LOGP(var,type,ptr) \ -do { \ - memcpy(ptr, var, sizeof(type)); \ - ptr += sizeof(type); \ -} while (0) - -/* - * set var to point at (char *)ptr, move ptr forward by size_round(len); - * return from function with EFAULT if ptr goes beyond end - */ -#define UNLOGL(var,type,len,ptr,end) \ -do { \ - var = (type *)ptr; \ - ptr += size_round(len * sizeof(type)); \ - if (ptr > end ) \ - return -EFAULT; \ -} while (0) - -#define UNLOGL0(var,type,len,ptr,end) \ -do { \ - UNLOGL(var,type,len,ptr,end); \ - if ( *((char *)ptr - size_round(len) + len - 1) != '\0') \ - return -EFAULT; \ -} while (0) - #define LOGL(var,len,ptr) \ do { \ if (var) \ diff --git a/lnet/include/lnet/Makefile.am b/lnet/include/lnet/Makefile.am new file mode 100644 index 0000000000..4043f66361 --- /dev/null +++ b/lnet/include/lnet/Makefile.am @@ -0,0 +1,10 @@ +portalsdir=$(includedir)/portals + +if UTILS +portals_HEADERS = list.h +endif + +EXTRA_DIST = api.h api-support.h build_check.h errno.h \ + internal.h lib-p30.h lib-types.h list.h \ + lltrace.h myrnal.h nal.h nalids.h p30.h ptlctl.h \ + socknal.h stringtab.h types.h diff --git a/lnet/include/lnet/api.h b/lnet/include/lnet/api.h index c7aaced559..56b7b995cb 100644 --- a/lnet/include/lnet/api.h +++ b/lnet/include/lnet/api.h @@ -18,6 +18,8 @@ int PtlNIFini(ptl_handle_ni_t interface_in); int PtlGetId(ptl_handle_ni_t ni_handle, ptl_process_id_t *id); +int PtlGetUid(ptl_handle_ni_t ni_handle, ptl_uid_t *uid); + /* * Network interfaces diff --git a/lnet/include/lnet/defines.h b/lnet/include/lnet/defines.h deleted file mode 100644 index 61aca3f438..0000000000 --- a/lnet/include/lnet/defines.h +++ /dev/null @@ -1,117 +0,0 @@ -#include "build_check.h" -/* -** -** This files contains definitions that are used throughout the cplant code. -*/ - -#ifndef CPLANT_H -#define CPLANT_H - -#define TITLE(fname,zmig) - - -/* -** TRUE and FALSE -*/ -#undef TRUE -#define TRUE (1) -#undef FALSE -#define FALSE (0) - - -/* -** Return codes from functions -*/ -#undef OK -#define OK (0) -#undef ERROR -#define ERROR (-1) - - - -/* -** The GCC macro for a safe max() that works on all types arithmetic types. -*/ -#ifndef MAX -#define MAX(a, b) (a) > (b) ? (a) : (b) -#endif /* MAX */ - -#ifndef MIN -#define MIN(a, b) (a) < (b) ? (a) : (b) -#endif /* MIN */ - -/* -** The rest is from the old qkdefs.h -*/ - -#ifndef __linux__ -#define __inline__ -#endif - -#ifndef NULL -#define NULL ((void *)0) -#endif - -#ifndef __osf__ -#define PRIVATE static -#define PUBLIC -#endif - -#ifndef __osf__ -typedef unsigned char uchar; -#endif - -typedef char CHAR; -typedef unsigned char UCHAR; -typedef char INT8; -typedef unsigned char UINT8; -typedef short int INT16; -typedef unsigned short int UINT16; -typedef int INT32; -typedef unsigned int UINT32; -typedef long LONG32; -typedef unsigned long ULONG32; - -/* long may be 32 or 64, so we can't really append the size to the definition */ -typedef long LONG; -typedef unsigned long ULONG; - -#ifdef __alpha__ -typedef long int_t; -#ifndef __osf__ -typedef unsigned long uint_t; -#endif -#endif - -#ifdef __i386__ -typedef int int_t; -typedef unsigned int uint_t; -#endif - -typedef float FLOAT32; -typedef double FLOAT64; -typedef void VOID; -typedef INT32 BOOLEAN; -typedef void (*FCN_PTR)(void); - -#ifndef off64_t - -#if defined (__alpha__) || defined (__ia64__) -typedef long off64_t; -#else -typedef long long off64_t; -#endif - -#endif - -/* -** Process related typedefs -*/ -typedef UINT16 PID_TYPE; /* Type of Local process ID */ -typedef UINT16 NID_TYPE; /* Type of Physical node ID */ -typedef UINT16 GID_TYPE; /* Type of Group ID */ -typedef UINT16 RANK_TYPE; /* Type of Logical rank/process within a group */ - - - -#endif /* CPLANT_H */ diff --git a/lnet/include/lnet/lib-types.h b/lnet/include/lnet/lib-types.h index 6549988bc9..cfcef2bd57 100644 --- a/lnet/include/lnet/lib-types.h +++ b/lnet/include/lnet/lib-types.h @@ -124,8 +124,8 @@ typedef struct { #define PORTALS_PROTO_MAGIC 0xeebc0ded -#define PORTALS_PROTO_VERSION_MAJOR 0 -#define PORTALS_PROTO_VERSION_MINOR 3 +#define PORTALS_PROTO_VERSION_MAJOR 1 +#define PORTALS_PROTO_VERSION_MINOR 0 typedef struct { long recv_count, recv_length, send_count, send_length, drop_count, @@ -133,8 +133,8 @@ typedef struct { } lib_counters_t; /* temporary expedient: limit number of entries in discontiguous MDs */ -#define PTL_MTU (512<<10) -#define PTL_MD_MAX_IOV 128 +#define PTL_MTU (1<<20) +#define PTL_MD_MAX_IOV 256 struct lib_msg_t { struct list_head msg_list; diff --git a/lnet/include/lnet/lnetctl.h b/lnet/include/lnet/lnetctl.h index e0140ce748..a81a3716ac 100644 --- a/lnet/include/lnet/lnetctl.h +++ b/lnet/include/lnet/lnetctl.h @@ -44,6 +44,12 @@ int jt_ptl_network(int argc, char **argv); int jt_ptl_print_autoconnects (int argc, char **argv); int jt_ptl_add_autoconnect (int argc, char **argv); int jt_ptl_del_autoconnect (int argc, char **argv); +int jt_ptl_print_interfaces(int argc, char **argv); +int jt_ptl_add_interface(int argc, char **argv); +int jt_ptl_del_interface(int argc, char **argv); +int jt_ptl_print_peers (int argc, char **argv); +int jt_ptl_add_peer (int argc, char **argv); +int jt_ptl_del_peer (int argc, char **argv); int jt_ptl_print_connections (int argc, char **argv); int jt_ptl_connect(int argc, char **argv); int jt_ptl_disconnect(int argc, char **argv); diff --git a/lnet/include/lnet/ppid.h b/lnet/include/lnet/ppid.h deleted file mode 100644 index 760f465b88..0000000000 --- a/lnet/include/lnet/ppid.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifndef _INCppidh_ -#define _INCppidh_ - -#include "defines.h" -// #include "idtypes.h" - - -#define MAX_PPID 1000 /* this needs to fit into 16 bits so the - maximum value is 65535. having it "large" - can help w/ debugging process accounting - but there are reasons for making it - somewhat smaller than the maximum -- - requiring storage for arrays that index - on the ppid, eg... */ - -#define MAX_GID 1000 /* this needs to fit into 16 bits... */ - -#define MAX_FIXED_PPID 100 -#define MAX_FIXED_GID 100 -#define PPID_FLOATING MAX_FIXED_PPID+1 /* Floating area starts here */ -#define GID_FLOATING MAX_FIXED_GID+1 /* Floating area starts here */ -#define NUM_PTL_TASKS MAX_FIXED_PPID+80 /* Maximum no. portals tasks */ - -#define PPID_AUTO 0 - -/* Minimum PPID is 1 */ -#define PPID_BEBOPD 1 /* bebopd */ -#define GID_BEBOPD 1 /* bebopd */ - -#define PPID_PCT 2 /* pct */ -#define GID_PCT 2 /* pct */ - -#define PPID_FYOD 3 /* fyod */ -#define GID_FYOD 3 /* fyod */ - -#define PPID_GDBWRAP 11 /* portals proxy for gdb */ -#define GID_GDBWRAP 11 /* portals proxy for gdb */ - -#define PPID_TEST 15 /* for portals tests */ -#define GID_TEST 15 - -#define GID_YOD 5 /* yod */ -#define GID_PINGD 6 /* pingd */ -#define GID_BT 7 /* bt */ -#define GID_PTLTEST 8 /* ptltest */ -#define GID_CGDB 9 /* cgdb */ -#define GID_TVDSVR 10 /* start-tvdsvr */ - -#endif /* _INCppidh_ */ diff --git a/lnet/include/lnet/ptlctl.h b/lnet/include/lnet/ptlctl.h index e0140ce748..a81a3716ac 100644 --- a/lnet/include/lnet/ptlctl.h +++ b/lnet/include/lnet/ptlctl.h @@ -44,6 +44,12 @@ int jt_ptl_network(int argc, char **argv); int jt_ptl_print_autoconnects (int argc, char **argv); int jt_ptl_add_autoconnect (int argc, char **argv); int jt_ptl_del_autoconnect (int argc, char **argv); +int jt_ptl_print_interfaces(int argc, char **argv); +int jt_ptl_add_interface(int argc, char **argv); +int jt_ptl_del_interface(int argc, char **argv); +int jt_ptl_print_peers (int argc, char **argv); +int jt_ptl_add_peer (int argc, char **argv); +int jt_ptl_del_peer (int argc, char **argv); int jt_ptl_print_connections (int argc, char **argv); int jt_ptl_connect(int argc, char **argv); int jt_ptl_disconnect(int argc, char **argv); diff --git a/lnet/include/lnet/types.h b/lnet/include/lnet/types.h index 250b95420b..0bada40260 100644 --- a/lnet/include/lnet/types.h +++ b/lnet/include/lnet/types.h @@ -11,6 +11,8 @@ #define PTL_NI_OK PTL_OK typedef ptl_err_t ptl_ni_fail_t; +typedef __u32 ptl_uid_t; +typedef __u32 ptl_jid_t; typedef __u64 ptl_nid_t; typedef __u32 ptl_pid_t; typedef __u32 ptl_pt_index_t; @@ -40,6 +42,8 @@ static inline int PtlHandleIsEqual (ptl_handle_any_t h1, ptl_handle_any_t h2) return (h1.nal_idx == h2.nal_idx && h1.cookie == h2.cookie); } +#define PTL_UID_ANY ((ptl_uid_t) -1) +#define PTL_JID_ANY ((ptl_jid_t) -1) #define PTL_NID_ANY ((ptl_nid_t) -1) #define PTL_PID_ANY ((ptl_pid_t) -1) @@ -65,7 +69,7 @@ typedef struct { int max_size; unsigned int options; void *user_ptr; - ptl_handle_eq_t eventq; + ptl_handle_eq_t eq_handle; } ptl_md_t; /* Options for the MD structure */ @@ -128,15 +132,20 @@ typedef unsigned PTL_SEQ_BASETYPE ptl_seq_t; typedef struct { ptl_event_kind_t type; ptl_process_id_t initiator; - ptl_pt_index_t portal; + ptl_uid_t uid; + ptl_jid_t jid; + ptl_pt_index_t pt_index; ptl_match_bits_t match_bits; ptl_size_t rlength; - ptl_size_t mlength; - ptl_size_t offset; - ptl_md_t mem_desc; + ptl_size_t mlength; + ptl_size_t offset; + ptl_handle_md_t md_handle; + ptl_md_t md; ptl_hdr_data_t hdr_data; - int unlinked; - ptl_ni_fail_t ni_fail_type; + ptl_seq_t link; + ptl_ni_fail_t ni_fail_type; + + int unlinked; volatile ptl_seq_t sequence; } ptl_event_t; diff --git a/lnet/klnds/Makefile.in b/lnet/klnds/Makefile.in index b5ed16823a..2a01119883 100644 --- a/lnet/klnds/Makefile.in +++ b/lnet/klnds/Makefile.in @@ -1,5 +1,5 @@ @BUILD_GMNAL_TRUE@subdir-m += gmnal -@BUILD_IBNAL_TRUE@subdir-m += ibnal +@BUILD_OPENIBNAL_TRUE@subdir-m += openibnal @BUILD_QSWNAL_TRUE@subdir-m += qswnal subdir-m += socknal diff --git a/lnet/klnds/autoMakefile.am b/lnet/klnds/autoMakefile.am index 9d04a467ae..002c169480 100644 --- a/lnet/klnds/autoMakefile.am +++ b/lnet/klnds/autoMakefile.am @@ -3,4 +3,4 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution -SUBDIRS = gmnal ibnal qswnal socknal +SUBDIRS = gmnal openibnal qswnal socknal diff --git a/lnet/klnds/gmlnd/gmlnd.h b/lnet/klnds/gmlnd/gmlnd.h index ca98f8435b..9c4425b10a 100644 --- a/lnet/klnds/gmlnd/gmlnd.h +++ b/lnet/klnds/gmlnd/gmlnd.h @@ -55,10 +55,13 @@ #include "linux/kp30.h" #include "portals/p30.h" -#include "portals/lib-nal.h" +#include "portals/nal.h" #include "portals/lib-p30.h" #define GM_STRONG_TYPES 1 +#ifdef VERSION +#undef VERSION +#endif #include "gm.h" #include "gm_internal.h" @@ -323,14 +326,9 @@ void gmnal_api_unlock(nal_t *, unsigned long *); #define GMNAL_INIT_NAL(a) do { \ - a->startup = gmnal_api_startup; \ - a->forward = gmnal_api_forward; \ - a->shutdown = gmnal_api_shutdown; \ - a->yield = gmnal_api_yield; \ - a->lock = gmnal_api_lock; \ - a->unlock = gmnal_api_unlock; \ - a->timeout = NULL; \ - a->nal_data = NULL; \ + (a)->nal_ni_init = gmnal_api_startup; \ + (a)->nal_ni_fini = gmnal_api_shutdown; \ + (a)->nal_data = NULL; \ } while (0) @@ -338,17 +336,17 @@ void gmnal_api_unlock(nal_t *, unsigned long *); * CB NAL */ -int gmnal_cb_send(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *, - int, ptl_nid_t, ptl_pid_t, unsigned int, struct iovec *, size_t); +ptl_err_t gmnal_cb_send(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *, + int, ptl_nid_t, ptl_pid_t, unsigned int, struct iovec *, size_t, size_t); -int gmnal_cb_send_pages(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *, - int, ptl_nid_t, ptl_pid_t, unsigned int, ptl_kiov_t *, size_t); +ptl_err_t gmnal_cb_send_pages(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *, + int, ptl_nid_t, ptl_pid_t, unsigned int, ptl_kiov_t *, size_t, size_t); -int gmnal_cb_recv(lib_nal_t *, void *, lib_msg_t *, - unsigned int, struct iovec *, size_t, size_t); +ptl_err_t gmnal_cb_recv(lib_nal_t *, void *, lib_msg_t *, + unsigned int, struct iovec *, size_t, size_t, size_t); -int gmnal_cb_recv_pages(lib_nal_t *, void *, lib_msg_t *, - unsigned int, ptl_kiov_t *, size_t, size_t); +ptl_err_t gmnal_cb_recv_pages(lib_nal_t *, void *, lib_msg_t *, + unsigned int, ptl_kiov_t *, size_t, size_t, size_t); int gmnal_cb_dist(lib_nal_t *, ptl_nid_t, unsigned long *); @@ -422,10 +420,10 @@ void gmnal_remove_rxtwe(gmnal_data_t *); * Small messages */ int gmnal_small_rx(lib_nal_t *, void *, lib_msg_t *, unsigned int, - struct iovec *, size_t, size_t); + struct iovec *, size_t, size_t, size_t); int gmnal_small_tx(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *, int, ptl_nid_t, ptl_pid_t, - unsigned int, struct iovec*, int); + unsigned int, struct iovec*, size_t, int); void gmnal_small_tx_callback(gm_port_t *, void *, gm_status_t); @@ -434,11 +432,11 @@ void gmnal_small_tx_callback(gm_port_t *, void *, gm_status_t); * Large messages */ int gmnal_large_rx(lib_nal_t *, void *, lib_msg_t *, unsigned int, - struct iovec *, size_t, size_t); + struct iovec *, size_t, size_t, size_t); int gmnal_large_tx(lib_nal_t *, void *, lib_msg_t *, ptl_hdr_t *, int, ptl_nid_t, ptl_pid_t, unsigned int, - struct iovec*, int); + struct iovec*, size_t, int); void gmnal_large_tx_callback(gm_port_t *, void *, gm_status_t); diff --git a/lnet/klnds/gmlnd/gmlnd_api.c b/lnet/klnds/gmlnd/gmlnd_api.c index bdf5cfe6cf..bd6c83e6d9 100644 --- a/lnet/klnds/gmlnd/gmlnd_api.c +++ b/lnet/klnds/gmlnd/gmlnd_api.c @@ -30,6 +30,9 @@ gmnal_data_t *global_nal_data = NULL; #define GLOBAL_NID_STR_LEN 16 char global_nid_str[GLOBAL_NID_STR_LEN] = {0}; +ptl_handle_ni_t kgmnal_ni; + +extern int gmnal_cmd(struct portals_cfg *pcfg, void *private); /* * Write the global nid /proc/sys/gmnal/globalnid @@ -57,7 +60,7 @@ static ctl_table gmnalnal_top_sysctl_table[] = { * nal_t nal our nal to shutdown */ void -gmnal_api_shutdown(nal_t *nal, int interface) +gmnal_api_shutdown(nal_t *nal) { gmnal_data_t *nal_data; lib_nal_t *libnal; @@ -65,12 +68,12 @@ gmnal_api_shutdown(nal_t *nal, int interface) if (nal->nal_refct != 0) return; - CDEBUG(D_TRACE, "gmnal_api_shutdown: nal_data [%p]\n", nal_data); LASSERT(nal == global_nal_data->nal); libnal = (lib_nal_t *)nal->nal_data; nal_data = (gmnal_data_t *)libnal->libnal_data; LASSERT(nal_data == global_nal_data); + CDEBUG(D_TRACE, "gmnal_api_shutdown: nal_data [%p]\n", nal_data); /* Stop portals calling our ioctl handler */ libcfs_nal_cmd_unregister(GMNAL); @@ -116,7 +119,8 @@ gmnal_api_startup(nal_t *nal, ptl_pid_t requested_pid, if (nal->nal_refct != 0) { if (actual_limits != NULL) { libnal = (lib_nal_t *)nal->nal_data; - *actual_limits = nal->libnal_ni.ni_actual_limits; + *actual_limits = libnal->libnal_ni.ni_actual_limits; + } return (PTL_OK); } @@ -170,8 +174,8 @@ gmnal_api_startup(nal_t *nal, ptl_pid_t requested_pid, } - CDEBUG(D_NET, "Calling gm_open with interface [%d], port [%d], " - "name [%s], version [%d]\n", interface, GMNAL_GM_PORT, + CDEBUG(D_NET, "Calling gm_open with port [%d], " + "name [%s], version [%d]\n", GMNAL_GM_PORT, "gmnal", GM_API_VERSION); GMNAL_GM_LOCK(nal_data); @@ -291,8 +295,10 @@ gmnal_api_startup(nal_t *nal, ptl_pid_t requested_pid, PORTAL_FREE(libnal, sizeof(lib_nal_t)); return(PTL_FAIL); } + nal_data->gm_local_nid = local_nid; CDEBUG(D_INFO, "Local node id is [%u]\n", local_nid); + GMNAL_GM_LOCK(nal_data); gm_status = gm_node_id_to_global_id(nal_data->gm_port, local_nid, &global_nid); @@ -342,7 +348,7 @@ gmnal_api_startup(nal_t *nal, ptl_pid_t requested_pid, } - if (libcfs_nal_cmd_register(GMNAL, &gmnal_cmd, nal->nal_data) != 0) { + if (libcfs_nal_cmd_register(GMNAL, &gmnal_cmd, libnal->libnal_data) != 0) { CDEBUG(D_INFO, "libcfs_nal_cmd_register failed\n"); /* XXX these cleanup cases should be restructured to @@ -393,6 +399,11 @@ int gmnal_init(void) rc = ptl_register_nal(GMNAL, &the_gm_nal); if (rc != PTL_OK) CERROR("Can't register GMNAL: %d\n", rc); + rc = PtlNIInit(GMNAL, LUSTRE_SRV_PTL_PID, NULL, NULL, &kgmnal_ni); + if (rc != PTL_OK && rc != PTL_IFACE_DUP) { + ptl_unregister_nal(GMNAL); + return (-ENODEV); + } return (rc); } @@ -407,6 +418,7 @@ void gmnal_fini() CDEBUG(D_TRACE, "gmnal_fini\n"); LASSERT(global_nal_data == NULL); + PtlNIFini(kgmnal_ni); ptl_unregister_nal(GMNAL); } diff --git a/lnet/klnds/gmlnd/gmlnd_cb.c b/lnet/klnds/gmlnd/gmlnd_cb.c index e99d3ec974..0ebf43747b 100644 --- a/lnet/klnds/gmlnd/gmlnd_cb.c +++ b/lnet/klnds/gmlnd/gmlnd_cb.c @@ -27,28 +27,28 @@ #include "gmnal.h" -int gmnal_cb_recv(lib_nal_t *libnal, void *private, lib_msg_t *cookie, - unsigned int niov, struct iovec *iov, size_t mlen, - size_t rlen) +ptl_err_t gmnal_cb_recv(lib_nal_t *libnal, void *private, lib_msg_t *cookie, + unsigned int niov, struct iovec *iov, size_t offset, + size_t mlen, size_t rlen) { gmnal_srxd_t *srxd = (gmnal_srxd_t*)private; int status = PTL_OK; CDEBUG(D_TRACE, "gmnal_cb_recv libnal [%p], private[%p], cookie[%p], " - "niov[%d], iov [%p], mlen["LPSZ"], rlen["LPSZ"]\n", - libnal, private, cookie, niov, iov, mlen, rlen); + "niov[%d], iov [%p], offset["LPSZ"], mlen["LPSZ"], rlen["LPSZ"]\n", + libnal, private, cookie, niov, iov, offset, mlen, rlen); switch(srxd->type) { case(GMNAL_SMALL_MESSAGE): CDEBUG(D_INFO, "gmnal_cb_recv got small message\n"); status = gmnal_small_rx(libnal, private, cookie, niov, - iov, mlen, rlen); + iov, offset, mlen, rlen); break; case(GMNAL_LARGE_MESSAGE_INIT): CDEBUG(D_INFO, "gmnal_cb_recv got large message init\n"); status = gmnal_large_rx(libnal, private, cookie, niov, - iov, mlen, rlen); + iov, offset, mlen, rlen); } @@ -56,9 +56,9 @@ int gmnal_cb_recv(lib_nal_t *libnal, void *private, lib_msg_t *cookie, return(status); } -int gmnal_cb_recv_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, - unsigned int kniov, ptl_kiov_t *kiov, size_t mlen, - size_t rlen) +ptl_err_t gmnal_cb_recv_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, + unsigned int kniov, ptl_kiov_t *kiov, size_t offset, + size_t mlen, size_t rlen) { gmnal_srxd_t *srxd = (gmnal_srxd_t*)private; int status = PTL_OK; @@ -68,8 +68,8 @@ int gmnal_cb_recv_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, CDEBUG(D_TRACE, "gmnal_cb_recv_pages libnal [%p],private[%p], " - "cookie[%p], kniov[%d], kiov [%p], mlen["LPSZ"], rlen["LPSZ"]\n", - libnal, private, cookie, kniov, kiov, mlen, rlen); + "cookie[%p], kniov[%d], kiov [%p], offset["LPSZ"], mlen["LPSZ"], rlen["LPSZ"]\n", + libnal, private, cookie, kniov, kiov, offset, mlen, rlen); if (srxd->type == GMNAL_SMALL_MESSAGE) { PORTAL_ALLOC(iovec, sizeof(struct iovec)*kniov); @@ -99,7 +99,7 @@ int gmnal_cb_recv_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, } CDEBUG(D_INFO, "calling gmnal_small_rx\n"); status = gmnal_small_rx(libnal, private, cookie, kniov, - iovec_dup, mlen, rlen); + iovec_dup, offset, mlen, rlen); for (i=0; i<kniov; i++) { kunmap(kiov_dup->kiov_page); kiov_dup++; @@ -113,35 +113,35 @@ int gmnal_cb_recv_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, } -int gmnal_cb_send(lib_nal_t *libnal, void *private, lib_msg_t *cookie, +ptl_err_t gmnal_cb_send(lib_nal_t *libnal, void *private, lib_msg_t *cookie, ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid, - unsigned int niov, struct iovec *iov, size_t len) + unsigned int niov, struct iovec *iov, size_t offset, size_t len) { gmnal_data_t *nal_data; - CDEBUG(D_TRACE, "gmnal_cb_send niov[%d] len["LPSZ"] nid["LPU64"]\n", - niov, len, nid); + CDEBUG(D_TRACE, "gmnal_cb_send niov[%d] offset["LPSZ"] len["LPSZ"] nid["LPU64"]\n", + niov, offset, len, nid); nal_data = libnal->libnal_data; if (GMNAL_IS_SMALL_MESSAGE(nal_data, niov, iov, len)) { CDEBUG(D_INFO, "This is a small message send\n"); gmnal_small_tx(libnal, private, cookie, hdr, type, nid, pid, - niov, iov, len); + niov, iov, offset, len); } else { CDEBUG(D_ERROR, "Large message send it is not supported\n"); lib_finalize(libnal, private, cookie, PTL_FAIL); return(PTL_FAIL); gmnal_large_tx(libnal, private, cookie, hdr, type, nid, pid, - niov, iov, len); + niov, iov, offset, len); } return(PTL_OK); } -int gmnal_cb_send_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, +ptl_err_t gmnal_cb_send_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid, - unsigned int kniov, ptl_kiov_t *kiov, size_t len) + unsigned int kniov, ptl_kiov_t *kiov, size_t offset, size_t len) { int i = 0; @@ -149,7 +149,8 @@ int gmnal_cb_send_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, struct iovec *iovec = NULL, *iovec_dup = NULL; ptl_kiov_t *kiov_dup = kiov; - CDEBUG(D_TRACE, "gmnal_cb_send_pages nid ["LPU64"] niov[%d] len["LPSZ"]\n", nid, kniov, len); + CDEBUG(D_TRACE, "gmnal_cb_send_pages nid ["LPU64"] niov[%d] offset["LPSZ"] len["LPSZ"]\n", + nid, kniov, offset, len); nal_data = libnal->libnal_data; PORTAL_ALLOC(iovec, kniov*sizeof(struct iovec)); iovec_dup = iovec; @@ -170,7 +171,7 @@ int gmnal_cb_send_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, kiov++; } gmnal_small_tx(libnal, private, cookie, hdr, type, nid, - pid, kniov, iovec_dup, len); + pid, kniov, iovec_dup, offset, len); } else { CDEBUG(D_ERROR, "Large message send it is not supported yet\n"); return(PTL_FAIL); @@ -187,7 +188,7 @@ int gmnal_cb_send_pages(lib_nal_t *libnal, void *private, lib_msg_t *cookie, kiov++; } gmnal_large_tx(libnal, private, cookie, hdr, type, nid, - pid, kniov, iovec, len); + pid, kniov, iovec, offset, len); } for (i=0; i<kniov; i++) { kunmap(kiov_dup->kiov_page); diff --git a/lnet/klnds/gmlnd/gmlnd_comm.c b/lnet/klnds/gmlnd/gmlnd_comm.c index 4af7186c37..6a8fcbc272 100644 --- a/lnet/klnds/gmlnd/gmlnd_comm.c +++ b/lnet/klnds/gmlnd/gmlnd_comm.c @@ -319,11 +319,11 @@ gmnal_rx_bad(gmnal_data_t *nal_data, gmnal_rxtwe_t *we, gmnal_srxd_t *srxd) */ int gmnal_small_rx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, - unsigned int niov, struct iovec *iov, size_t mlen, size_t rlen) + unsigned int niov, struct iovec *iov, size_t offset, size_t mlen, size_t rlen) { gmnal_srxd_t *srxd = NULL; void *buffer = NULL; - gmnal_data_t *nal_data = (gmnal_data_t*)libnal->nal_data; + gmnal_data_t *nal_data = (gmnal_data_t*)libnal->libnal_data; CDEBUG(D_TRACE, "niov [%d] mlen["LPSZ"]\n", niov, mlen); @@ -340,11 +340,24 @@ gmnal_small_rx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, buffer += sizeof(ptl_hdr_t); while(niov--) { - CDEBUG(D_INFO, "processing [%p] len ["LPSZ"]\n", iov, - iov->iov_len); - gm_bcopy(buffer, iov->iov_base, iov->iov_len); - buffer += iov->iov_len; - iov++; + if (offset >= iov->iov_len) { + offset -= iov->iov_len; + } else if (offset > 0) { + CDEBUG(D_INFO, "processing [%p] base [%p] len %d, " + "offset %d, len ["LPSZ"]\n", iov, + iov->iov_base + offset, iov->iov_len, offset, + iov->iov_len - offset); + gm_bcopy(buffer, iov->iov_base + offset, + iov->iov_len - offset); + offset = 0; + buffer += iov->iov_len - offset; + } else { + CDEBUG(D_INFO, "processing [%p] len ["LPSZ"]\n", iov, + iov->iov_len); + gm_bcopy(buffer, iov->iov_base, iov->iov_len); + buffer += iov->iov_len; + } + iov++; } @@ -376,9 +389,9 @@ gmnal_small_rx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, int gmnal_small_tx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, ptl_hdr_t *hdr, int type, ptl_nid_t global_nid, ptl_pid_t pid, - unsigned int niov, struct iovec *iov, int size) + unsigned int niov, struct iovec *iov, size_t offset, int size) { - gmnal_data_t *nal_data = (gmnal_data_t*)libnal->nal_data; + gmnal_data_t *nal_data = (gmnal_data_t*)libnal->libnal_data; gmnal_stxd_t *stxd = NULL; void *buffer = NULL; gmnal_msghdr_t *msghdr = NULL; @@ -437,11 +450,21 @@ gmnal_small_tx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, buffer += sizeof(ptl_hdr_t); while(niov--) { - CDEBUG(D_INFO, "processing iov [%p] len ["LPSZ"] to [%p]\n", - iov, iov->iov_len, buffer); - gm_bcopy(iov->iov_base, buffer, iov->iov_len); - buffer+= iov->iov_len; - iov++; + if (offset >= iov->iov_len) { + offset -= iov->iov_len; + } else if (offset > 0) { + CDEBUG(D_INFO, "processing iov [%p] base [%p] len ["LPSZ"] to [%p]\n", + iov, iov->iov_base + offset, iov->iov_len - offset, buffer); + gm_bcopy(iov->iov_base + offset, buffer, iov->iov_len - offset); + buffer+= iov->iov_len - offset; + offset = 0; + } else { + CDEBUG(D_INFO, "processing iov [%p] len ["LPSZ"] to [%p]\n", + iov, iov->iov_len, buffer); + gm_bcopy(iov->iov_base, buffer, iov->iov_len); + buffer+= iov->iov_len; + } + iov++; } CDEBUG(D_INFO, "sending\n"); @@ -656,7 +679,7 @@ void gmnal_drop_sends_callback(struct gm_port *gm_port, void *context, int gmnal_large_tx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, ptl_hdr_t *hdr, int type, ptl_nid_t global_nid, ptl_pid_t pid, - unsigned int niov, struct iovec *iov, int size) + unsigned int niov, struct iovec *iov, size_t offset, int size) { gmnal_data_t *nal_data; @@ -676,7 +699,7 @@ gmnal_large_tx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, global_nid, pid, niov, iov, size); if (libnal) - nal_data = (gmnal_data_t*)libnal->nal_data; + nal_data = (gmnal_data_t*)libnal->libnal_data; else { CDEBUG(D_ERROR, "no libnal.\n"); return(GMNAL_STATUS_FAIL); @@ -721,30 +744,39 @@ gmnal_large_tx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, mlen += sizeof(ptl_hdr_t); CDEBUG(D_INFO, "mlen is [%d]\n", mlen); + while (offset >= iov->iov_len) { + offset -= iov->iov_len; + niov--; + iov++; + } + + LASSERT(offset >= 0); + /* + * Store the iovs in the stxd for we can get + * them later if we need them + */ + stxd->iov[0].iov_base = iov->iov_base + offset; + stxd->iov[0].iov_len = iov->iov_len - offset; + CDEBUG(D_NET, "Copying iov [%p] to [%p], niov=%d\n", iov, stxd->iov, niov); + if (niov > 1) + gm_bcopy(&iov[1], &stxd->iov[1], (niov-1)*sizeof(struct iovec)); + stxd->niov = niov; + /* * copy the iov to the buffer so target knows * where to get the data from */ CDEBUG(D_INFO, "processing iov to [%p]\n", buffer); - gm_bcopy(iov, buffer, niov*sizeof(struct iovec)); - mlen += niov*(sizeof(struct iovec)); + gm_bcopy(stxd->iov, buffer, stxd->niov*sizeof(struct iovec)); + mlen += stxd->niov*(sizeof(struct iovec)); CDEBUG(D_INFO, "mlen is [%d]\n", mlen); - - - /* - * Store the iovs in the stxd for we can get - * them later if we need them - */ - CDEBUG(D_NET, "Copying iov [%p] to [%p]\n", iov, stxd->iov); - gm_bcopy(iov, stxd->iov, niov*sizeof(struct iovec)); - stxd->niov = niov; - /* * register the memory so the NIC can get hold of the data * This is a slow process. it'd be good to overlap it * with something else. */ + iov = stxd->iov; iov_dup = iov; niov_dup = niov; while(niov--) { @@ -821,10 +853,10 @@ gmnal_large_tx_callback(gm_port_t *gm_port, void *context, gm_status_t status) */ int gmnal_large_rx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, - unsigned int nriov, struct iovec *riov, size_t mlen, - size_t rlen) + unsigned int nriov, struct iovec *riov, size_t offset, + size_t mlen, size_t rlen) { - gmnal_data_t *nal_data = libnal->nal_data; + gmnal_data_t *nal_data = libnal->libnal_data; gmnal_srxd_t *srxd = (gmnal_srxd_t*)private; void *buffer = NULL; struct iovec *riov_dup; @@ -863,6 +895,25 @@ gmnal_large_rx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, * If the iovecs match, could interleave * gm_registers and gm_gets for each element */ + while (offset >= riov->iov_len) { + offset -= riov->iov_len; + riov++; + nriov--; + } + LASSERT (nriov >= 0); + LASSERT (offset >= 0); + /* + * do this so the final gm_get callback can deregister the memory + */ + PORTAL_ALLOC(srxd->riov, nriov*(sizeof(struct iovec))); + + srxd->riov[0].iov_base = riov->iov_base + offset; + srxd->riov[0].iov_len = riov->iov_len - offset; + if (nriov > 1) + gm_bcopy(&riov[1], &srxd->riov[1], (nriov-1)*(sizeof(struct iovec))); + srxd->nriov = nriov; + + riov = srxd->riov; nriov_dup = nriov; riov_dup = riov; while(nriov--) { @@ -888,17 +939,12 @@ gmnal_large_rx(lib_nal_t *libnal, void *private, lib_msg_t *cookie, /* * give back srxd and buffer. Send NACK to sender */ + PORTAL_FREE(srxd->riov, nriov_dup*(sizeof(struct iovec))); return(PTL_FAIL); } GMNAL_GM_UNLOCK(nal_data); riov++; } - /* - * do this so the final gm_get callback can deregister the memory - */ - PORTAL_ALLOC(srxd->riov, nriov_dup*(sizeof(struct iovec))); - gm_bcopy(riov_dup, srxd->riov, nriov_dup*(sizeof(struct iovec))); - srxd->nriov = nriov_dup; /* * now do gm_get to get the data diff --git a/lnet/klnds/gmlnd/gmlnd_module.c b/lnet/klnds/gmlnd/gmlnd_module.c index 278230e66e..3aca90f822 100644 --- a/lnet/klnds/gmlnd/gmlnd_module.c +++ b/lnet/klnds/gmlnd/gmlnd_module.c @@ -55,9 +55,15 @@ gmnal_cmd(struct portals_cfg *pcfg, void *private) copy_from_user(name, pcfg->pcfg_pbuf1, pcfg->pcfg_plen1); GMNAL_GM_LOCK(nal_data); - nid = gm_host_name_to_node_id(nal_data->gm_port, name); + //nid = gm_host_name_to_node_id(nal_data->gm_port, name); + gm_status = gm_host_name_to_node_id_ex (nal_data->gm_port, 0, name, &nid); GMNAL_GM_UNLOCK(nal_data); - CDEBUG(D_INFO, "Local node id is [%d]\n", nid); + if (gm_status != GM_SUCCESS) { + CDEBUG(D_INFO, "gm_host_name_to_node_id_ex(...host %s) failed[%d]\n", + name, gm_status); + return (-1); + } else + CDEBUG(D_INFO, "Local node %s id is [%d]\n", name, nid); GMNAL_GM_LOCK(nal_data); gm_status = gm_node_id_to_global_id(nal_data->gm_port, nid, &gnid); @@ -87,9 +93,8 @@ gmnal_load(void) CDEBUG(D_TRACE, "This is the gmnal module initialisation routine\n"); - CDEBUG(D_INFO, "Calling gmnal_init\n"); - statud = gmnal_init(); + status = gmnal_init(); if (status == PTL_OK) { CDEBUG(D_INFO, "Portals GMNAL initialised ok\n"); } else { diff --git a/lnet/klnds/iblnd/.cvsignore b/lnet/klnds/iblnd/.cvsignore deleted file mode 100644 index 48b17e932f..0000000000 --- a/lnet/klnds/iblnd/.cvsignore +++ /dev/null @@ -1,10 +0,0 @@ -.deps -Makefile -autoMakefile.in -autoMakefile -*.ko -*.mod.c -.*.flags -.*.cmd -.tmp_versions -.depend diff --git a/lnet/klnds/iblnd/Makefile.in b/lnet/klnds/iblnd/Makefile.in deleted file mode 100644 index e180b3e220..0000000000 --- a/lnet/klnds/iblnd/Makefile.in +++ /dev/null @@ -1,6 +0,0 @@ -MODULES := kibnal -kibnal-objs := ibnal.o ibnal_cb.o - -EXTRA_PRE_CFLAGS := @IBCPPFLAGS@ - -@INCLUDE_RULES@ diff --git a/lnet/klnds/iblnd/autoMakefile.am b/lnet/klnds/iblnd/autoMakefile.am deleted file mode 100644 index ffe084c92d..0000000000 --- a/lnet/klnds/iblnd/autoMakefile.am +++ /dev/null @@ -1,10 +0,0 @@ -if MODULES -if !CRAY_PORTALS -if BUILD_IBNAL -modulenet_DATA = kibnal$(KMODEXT) -endif -endif -endif - -MOSTLYCLEANFILES = *.o *.ko *.mod.c -DIST_SOURCES = $(kibnal-objs:%.o=%.c) ibnal.h diff --git a/lnet/klnds/iblnd/ibnal.c b/lnet/klnds/iblnd/ibnal.c deleted file mode 100644 index c6bd7ed044..0000000000 --- a/lnet/klnds/iblnd/ibnal.c +++ /dev/null @@ -1,2142 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Based on ksocknal, qswnal, and gmnal - * - * Copyright (C) 2003 LANL - * Author: HB Chen <hbchen@lanl.gov> - * Los Alamos National Lab - * - * Portals 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. - * - * Portals is distributed in the hope that it will be 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 Portals; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ - -#include "ibnal.h" - -// portal handle ID for this IB-NAL -ptl_handle_ni_t kibnal_ni; - -// message send buffer mutex -spinlock_t MSBuf_mutex[NUM_MBUF]; - -// message recv buffer mutex -spinlock_t MRBuf_mutex[NUM_MBUF]; - -// IB-NAL API information -nal_t kibnal_api; - -// nal's private data -kibnal_data_t kibnal_data; - -int ibnal_debug = 0; -VAPI_pd_hndl_t Pd_hndl; -unsigned int Num_posted_recv_buf; - -// registered send buffer list -Memory_buffer_info MSbuf_list[NUM_MBUF]; - -// registered recv buffer list -Memory_buffer_info MRbuf_list[NUM_MBUF]; - -// -// for router -// currently there is no need fo IBA -// -kpr_nal_interface_t kibnal_router_interface = { - kprni_nalid: IBNAL, - kprni_arg: &kibnal_data, - kprni_fwd: kibnal_fwd_packet, // forward data to router - // is router invloving the - // data transmision -}; - - -// Queue-pair list -QP_info QP_list[NUM_QPS]; - -// information associated with a HCA -HCA_info Hca_data; - -// something about HCA -VAPI_hca_hndl_t Hca_hndl; // assume we only use one HCA now -VAPI_hca_vendor_t Hca_vendor; -VAPI_hca_cap_t Hca_cap; -VAPI_hca_port_t Hca_port_1_props; -VAPI_hca_port_t Hca_port_2_props; -VAPI_hca_attr_t Hca_attr; -VAPI_hca_attr_mask_t Hca_attr_mask; -VAPI_cq_hndl_t Cq_RQ_hndl; // CQ's handle -VAPI_cq_hndl_t Cq_SQ_hndl; // CQ's handle -VAPI_cq_hndl_t Cq_hndl; // CQ's handle -Remote_QP_Info L_QP_data; -Remote_QP_Info R_QP_data; - - -// -// forward API -// -int -kibnal_forward(nal_t *nal, - int id, - void *args, - size_t args_len, - void *ret, - size_t ret_len) -{ - kibnal_data_t *knal_data = nal->nal_data; - nal_cb_t *nal_cb = knal_data->kib_cb; - - // ASSERT checking - LASSERT (nal == &kibnal_api); - LASSERT (knal_data == &kibnal_data); - LASSERT (nal_cb == &kibnal_lib); - - // dispatch forward API function - - CDEBUG(D_NET,"kibnal_forward: function id = %d\n", id); - - lib_dispatch(nal_cb, knal_data, id, args, ret); - - CDEBUG(D_TRACE,"IBNAL- Done kibnal_forward\n"); - - return PTL_OK; // always return PTL_OK -} - -// -// lock API -// -void -kibnal_lock(nal_t *nal, unsigned long *flags) -{ - kibnal_data_t *knal_data = nal->nal_data; - nal_cb_t *nal_cb = knal_data->kib_cb; - - // ASSERT checking - LASSERT (nal == &kibnal_api); - LASSERT (knal_data == &kibnal_data); - LASSERT (nal_cb == &kibnal_lib); - - // disable logical interrrupt - nal_cb->cb_cli(nal_cb,flags); - - CDEBUG(D_TRACE,"IBNAL-Done kibnal_lock\n"); - -} - -// -// unlock API -// -void -kibnal_unlock(nal_t *nal, unsigned long *flags) -{ - kibnal_data_t *k = nal->nal_data; - nal_cb_t *nal_cb = k->kib_cb; - - // ASSERT checking - LASSERT (nal == &kibnal_api); - LASSERT (k == &kibnal_data); - LASSERT (nal_cb == &kibnal_lib); - - // enable logical interrupt - nal_cb->cb_sti(nal_cb,flags); - - CDEBUG(D_TRACE,"IBNAL-Done kibnal_unlock"); - -} - -// -// shutdown API -// showdown this network interface -// -int -kibnal_shutdown(nal_t *nal, int ni) -{ - VAPI_ret_t vstat; - kibnal_data_t *k = nal->nal_data; - nal_cb_t *nal_cb = k->kib_cb; - - // assert checking - LASSERT (nal == &kibnal_api); - LASSERT (k == &kibnal_data); - LASSERT (nal_cb == &kibnal_lib); - - // take down this IB network interface - // there is not corresponding cb function to hande this - // do we actually need this one - // reference to IB network interface shutdown - // - - vstat = IB_Close_HCA(); - - if (vstat != VAPI_OK) { - CERROR("Failed to close HCA - %s\n",VAPI_strerror(vstat)); - return (~PTL_OK); - } - - CDEBUG(D_TRACE,"IBNAL- Done kibnal_shutdown\n"); - - return PTL_OK; -} - -// -// yield -// when do we call this yield function -// -void -kibnal_yield( nal_t *nal, unsigned long *flags, int milliseconds ) -{ - kibnal_data_t *k = nal->nal_data; - nal_cb_t *nal_cb = k->kib_cb; - - // assert checking - LASSERT (nal == &kibnal_api); - LASSERT (k == &kibnal_data); - LASSERT (nal_cb == &kibnal_lib); - - if (milliseconds != 0) { - CERROR("Blocking yeild not implemented yet\n"); - LBUG(); - } - - // check under what condition that we need to - // call schedule() - // who set this need_resched - if (current->need_resched) - schedule(); - - CDEBUG(D_TRACE,"IBNAL-Done kibnal_yield"); - - return; -} - -// -// ibnal init -// -nal_t * -kibnal_init(int interface, // no use here - ptl_pt_index_t ptl_size, - ptl_ac_index_t ac_size, - ptl_pid_t requested_pid // no use here - ) -{ - nal_t *nal = NULL; - nal_cb_t *nal_cb = NULL; - kibnal_data_t *nal_data = NULL; - int rc; - - CDEBUG(D_NET, "kibnal_init:calling lib_init with nid 0x%u\n", - kibnal_data.kib_nid); - - - CDEBUG(D_NET, "kibnal_init: interface [%d], ptl_size [%d], ac_size[%d]\n", - interface, ptl_size, ac_size); - CDEBUG(D_NET, "kibnal_init: &kibnal_lib 0x%X\n", &kibnal_lib); - CDEBUG(D_NET, "kibnal_init: kibnal_data.kib_nid %d\n", kibnal_data.kib_nid); - - rc = lib_init(&kibnal_lib, - kibnal_data.kib_nid, - requested_pid , // process id is set as requested_pid instead of 0 - ptl_size, - ac_size); - - if(rc != PTL_OK) { - CERROR("kibnal_init: Failed lib_init with nid 0x%u, rc=%d\n", - kibnal_data.kib_nid,rc); - } - else { - CDEBUG(D_NET,"kibnal_init: DONE lib_init with nid 0x%x%x\n", - kibnal_data.kib_nid); - } - - return &kibnal_api; - -} - - -// -// called before remove ibnal kernel module -// -void __exit -kibnal_finalize(void) -{ - struct list_head *tmp; - - inter_module_unregister("kibnal_ni"); - - // release resources allocated to this Infiniband network interface - PtlNIFini(kibnal_ni); - - lib_fini(&kibnal_lib); - - IB_Close_HCA(); - - // how much do we need to do here? - list_for_each(tmp, &kibnal_data.kib_list) { - kibnal_rx_t *conn; - conn = list_entry(tmp, kibnal_rx_t, krx_item); - CDEBUG(D_IOCTL, "freeing conn %p\n",conn); - tmp = tmp->next; - list_del(&conn->krx_item); - PORTAL_FREE(conn, sizeof(*conn)); - } - - CDEBUG(D_MALLOC,"done kmem %d\n",atomic_read(&portal_kmemory)); - CDEBUG(D_TRACE,"IBNAL-Done kibnal_finalize\n"); - - return; -} - - -// -// * k_server_thread is a kernel thread -// use a shared memory ro exchange HCA's data with a pthread in user -// address space -// * will be replaced when CM is used to handle communication management -// - -void k_server_thread(Remote_QP_Info *hca_data) -{ - int segment_id; - const int shared_segment_size = sizeof(Remote_QP_Info); - key_t key = HCA_EXCHANGE_SHM_KEY; - unsigned long raddr; - int exchanged_done = NO; - int i; - - Remote_QP_Info *exchange_hca_data; - - long *n; - long *uaddr; - long ret = 0; - - // create a shared memory with pre-agreement key - segment_id = sys_shmget(key, - shared_segment_size, - IPC_CREAT | 0666); - - - // attached to shared memoru - // raddr is pointed to an user address space - // use this address to update shared menory content - ret = sys_shmat(segment_id, 0 , SHM_RND, &raddr); - -#ifdef IBNAL_DEBUG - if(ret >= 0) { - CDEBUG(D_NET,"k_server_thread: Shared memory attach success ret = 0X%d,&raddr" - " 0X%x (*(&raddr))=0x%x \n", ret, &raddr, (*(&raddr))); - printk("k_server_thread: Shared memory attach success ret = 0X%d, &raddr" - " 0X%x (*(&raddr))=0x%x \n", ret, &raddr, (*(&raddr))); - } - else { - CERROR("k_server_thread: Shared memory attach failed ret = 0x%d \n", ret); - printk("k_server_thread: Shared memory attach failed ret = 0x%d \n", ret); - return; - } -#endif - - n = &raddr; - uaddr = *n; // get the U-address - /* cast uaddr to exchange_hca_data */ - exchange_hca_data = (Remote_QP_Info *) uaddr; - - /* copy data from local HCA to shared memory */ - exchange_hca_data->opcode = hca_data->opcode; - exchange_hca_data->length = hca_data->length; - - for(i=0; i < NUM_QPS; i++) { - exchange_hca_data->dlid[i] = hca_data->dlid[i]; - exchange_hca_data->rqp_num[i] = hca_data->rqp_num[i]; - } - - // periodically check shared memory until get updated - // remote HCA's data from user mode pthread - while(exchanged_done == NO) { - if(exchange_hca_data->opcode == RECV_QP_INFO){ - exchanged_done = YES; - /* copy data to local buffer from shared memory */ - hca_data->opcode = exchange_hca_data->opcode; - hca_data->length = exchange_hca_data->length; - - for(i=0; i < NUM_QPS; i++) { - hca_data->dlid[i] = exchange_hca_data->dlid[i]; - hca_data->rqp_num[i] = exchange_hca_data->rqp_num[i]; - } - break; - } - else { - schedule_timeout(1000); - } - } - - // detached shared memory - sys_shmdt(uaddr); - - CDEBUG(D_NET, "Exit from kernel thread: k_server_thread \n"); - printk("Exit from kernel thread: k_server_thread \n"); - - return; - -} - -// -// create QP -// -VAPI_ret_t -create_qp(QP_info *qp, int qp_index) -{ - - VAPI_ret_t vstat; - VAPI_qp_init_attr_t qp_init_attr; - VAPI_qp_prop_t qp_prop; - - qp->hca_hndl = Hca_hndl; - qp->port = 1; // default - qp->slid = Hca_port_1_props.lid; - qp->hca_port = Hca_port_1_props; - - - /* Queue Pair Creation Attributes */ - qp_init_attr.cap.max_oust_wr_rq = NUM_WQE; - qp_init_attr.cap.max_oust_wr_sq = NUM_WQE; - qp_init_attr.cap.max_sg_size_rq = NUM_SG; - qp_init_attr.cap.max_sg_size_sq = NUM_SG; - qp_init_attr.pd_hndl = qp->pd_hndl; - qp_init_attr.rdd_hndl = 0; - qp_init_attr.rq_cq_hndl = qp->rq_cq_hndl; - /* we use here polling */ - //qp_init_attr.rq_sig_type = VAPI_SIGNAL_REQ_WR; - qp_init_attr.rq_sig_type = VAPI_SIGNAL_ALL_WR; - qp_init_attr.sq_cq_hndl = qp->sq_cq_hndl; - /* we use here polling */ - //qp_init_attr.sq_sig_type = VAPI_SIGNAL_REQ_WR; - qp_init_attr.sq_sig_type = VAPI_SIGNAL_ALL_WR; - // transport servce - reliable connection - - qp_init_attr.ts_type = VAPI_TS_RC; - - vstat = VAPI_create_qp(qp->hca_hndl, - &qp_init_attr, - &qp->qp_hndl, &qp_prop); - - if (vstat != VAPI_OK) { - CERROR("Failed creating QP. Return Failed - %s\n",VAPI_strerror(vstat)); - return vstat; - } - - qp->qp_num = qp_prop.qp_num; // the qp number - qp->last_posted_send_id = 0; // user defined work request ID - qp->last_posted_rcv_id = 0; // user defined work request ID - qp->cur_send_outstanding = 0; - qp->cur_posted_rcv_bufs = 0; - qp->snd_rcv_balance = 0; - - CDEBUG(D_OTHER, "create_qp: qp_num = %d, slid = %d, qp_hndl = 0X%X", - qp->qp_num, qp->slid, qp->qp_hndl); - - // initialize spin-lock mutex variables - spin_lock_init(&(qp->snd_mutex)); - spin_lock_init(&(qp->rcv_mutex)); - spin_lock_init(&(qp->bl_mutex)); - spin_lock_init(&(qp->cln_mutex)); - // number of outstanding requests on the send Q - qp->cur_send_outstanding = 0; - // number of posted receive buffers - qp->cur_posted_rcv_bufs = 0; - qp->snd_rcv_balance = 0; - - return(VAPI_OK); - -} - -// -// initialize a UD qp state to RTR and RTS -// -VAPI_ret_t -init_qp_UD(QP_info *qp, int qp_index) -{ - VAPI_qp_attr_t qp_attr; - VAPI_qp_init_attr_t qp_init_attr; - VAPI_qp_attr_mask_t qp_attr_mask; - VAPI_qp_cap_t qp_cap; - VAPI_ret_t vstat; - - /* Move from RST to INIT */ - /* Change QP to INIT */ - - CDEBUG(D_OTHER, "Changing QP state to INIT qp-index = %d\n", qp_index); - - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - - qp_attr.qp_state = VAPI_INIT; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_QP_STATE); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.pkey_ix = 0; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_PKEY_IX); - - CDEBUG(D_OTHER, "pkey_ix qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.port = qp->port; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_PORT); - - CDEBUG(D_OTHER, "port qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.qkey = 0; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_QKEY); - - CDEBUG(D_OTHER, "qkey qp_attr_mask = 0X%x\n", qp_attr_mask); - - /* If I do not set this mask, I get an error from HH. QPM should catch it */ - - vstat = VAPI_modify_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_cap); - - if (vstat != VAPI_OK) { - CERROR("Failed modifying QP from RST to INIT. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - CDEBUG(D_OTHER, "Modifying QP from RST to INIT.\n"); - - vstat= VAPI_query_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_init_attr); - - if (vstat != VAPI_OK) { - CERROR("Failed query QP. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - /* Move from INIT to RTR */ - /* Change QP to RTR */ - CDEBUG(D_OTHER, "Changing QP state to RTR\n"); - - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - - qp_attr.qp_state = VAPI_RTR; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_QP_STATE); - - CDEBUG(D_OTHER, "INIT to RTR- qp_state : qp_attr_mask = 0X%x\n", qp_attr_mask); - - vstat = VAPI_modify_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_cap); - - if (vstat != VAPI_OK) { - CERROR("Failed modifying QP from INIT to RTR. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - CDEBUG(D_OTHER, "Modifying QP from INIT to RTR.\n"); - - vstat= VAPI_query_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_init_attr); - - if (vstat != VAPI_OK) { - CERROR("Failed query QP. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - /* RTR to RTS - Change QP to RTS */ - CDEBUG(D_OTHER, "Changing QP state to RTS\n"); - - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - - qp_attr.qp_state = VAPI_RTS; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_QP_STATE); - - qp_attr.sq_psn = START_SQ_PSN; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_SQ_PSN); - - vstat = VAPI_modify_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_cap); - - if (vstat != VAPI_OK) { - CERROR("Failed modifying QP from RTR to RTS. %s:%s\n", - VAPI_strerror_sym(vstat), - VAPI_strerror(vstat)); - return(vstat); - } - - CDEBUG(D_OTHER, "Modifying QP from RTR to RTS. \n"); - - vstat= VAPI_query_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_init_attr); - - if (vstat != VAPI_OK) { - CERROR("Failed query QP. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - // - // a QP is at RTS state NOW - // - - CDEBUG(D_OTHER, "IBNAL- UD qp is at RTS NOW\n"); - - return(vstat); - -} - - - -// -// initialize a RC qp state to RTR and RTS -// RC transport service -// -VAPI_ret_t -init_qp_RC(QP_info *qp, int qp_index) -{ - VAPI_qp_attr_t qp_attr; - VAPI_qp_init_attr_t qp_init_attr; - VAPI_qp_attr_mask_t qp_attr_mask; - VAPI_qp_cap_t qp_cap; - VAPI_ret_t vstat; - - /* Move from RST to INIT */ - /* Change QP to INIT */ - - CDEBUG(D_OTHER, "Changing QP state to INIT qp-index = %d\n", qp_index); - - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - - qp_attr.qp_state = VAPI_INIT; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_QP_STATE); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.pkey_ix = 0; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_PKEY_IX); - - CDEBUG(D_OTHER, "pkey_ix qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.port = qp->port; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_PORT); - - CDEBUG(D_OTHER, "port qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.remote_atomic_flags = VAPI_EN_REM_WRITE | VAPI_EN_REM_READ; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_REMOTE_ATOMIC_FLAGS); - - CDEBUG(D_OTHER, "remote_atomic_flags qp_attr_mask = 0X%x\n", qp_attr_mask); - - /* If I do not set this mask, I get an error from HH. QPM should catch it */ - - vstat = VAPI_modify_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_cap); - - if (vstat != VAPI_OK) { - CERROR("Failed modifying QP from RST to INIT. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - vstat= VAPI_query_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_init_attr); - - if (vstat != VAPI_OK) { - CERROR("Failed query QP. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - /* Move from INIT to RTR */ - /* Change QP to RTR */ - CDEBUG(D_OTHER, "Changing QP state to RTR qp_indexi %d\n", qp_index); - - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - qp_attr.qp_state = VAPI_RTR; - - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_QP_STATE); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.av.sl = 0;/* RESPONDER_SL */ - qp_attr.av.grh_flag = FALSE; - qp_attr.av.dlid = qp->dlid;/*RESPONDER_LID;*/ - qp_attr.av.static_rate = 0; - qp_attr.av.src_path_bits = 0; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_AV); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.path_mtu = MTU_2048;// default is MTU_2048 - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_PATH_MTU); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.rq_psn = START_RQ_PSN; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_RQ_PSN); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.qp_ous_rd_atom = NUM_WQE; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_QP_OUS_RD_ATOM); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.pkey_ix = 0; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_PKEY_IX); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.min_rnr_timer = 10; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_MIN_RNR_TIMER); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - qp_attr.dest_qp_num = qp->rqp_num; - - CDEBUG(D_OTHER, "remore qp num %d\n", qp->rqp_num); - - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_DEST_QP_NUM); - - CDEBUG(D_OTHER, "qp_state qp_attr_mask = 0X%x\n", qp_attr_mask); - - vstat = VAPI_modify_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_cap); - - - if (vstat != VAPI_OK) { - CERROR("Failed modifying QP from INIT to RTR. qp_index %d - %s\n", - qp_index, VAPI_strerror(vstat)); - return(vstat); - } - - vstat= VAPI_query_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_init_attr); - - if (vstat != VAPI_OK) { - CERROR("Failed query QP. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - /* RTR to RTS - Change QP to RTS */ - CDEBUG(D_OTHER, "Changing QP state to RTS\n"); - - QP_ATTR_MASK_CLR_ALL(qp_attr_mask); - - qp_attr.qp_state = VAPI_RTS; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_QP_STATE); - - qp_attr.sq_psn = START_SQ_PSN; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_SQ_PSN); - - qp_attr.timeout = 0x18; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_TIMEOUT); - - qp_attr.retry_count = 10; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_RETRY_COUNT); - - qp_attr.rnr_retry = 14; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_RNR_RETRY); - - qp_attr.ous_dst_rd_atom = 100; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_OUS_DST_RD_ATOM); - - qp_attr.min_rnr_timer = 5; - QP_ATTR_MASK_SET(qp_attr_mask,QP_ATTR_MIN_RNR_TIMER); - - vstat = VAPI_modify_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_cap); - - if (vstat != VAPI_OK) { - CERROR("Failed modifying QP from RTR to RTS. %s:%s\n", - VAPI_strerror_sym(vstat), VAPI_strerror(vstat)); - return(vstat); - } - - vstat= VAPI_query_qp(qp->hca_hndl, - qp->qp_hndl, - &qp_attr, - &qp_attr_mask, - &qp_init_attr); - - if (vstat != VAPI_OK) { - CERROR("Failed query QP. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - // - // a QP is at RTS state NOW - // - - CDEBUG(D_OTHER, "IBNAL- RC qp is at RTS NOW\n"); - - return(vstat); -} - - - -VAPI_ret_t -IB_Open_HCA(kibnal_data_t *kib_data) -{ - - VAPI_ret_t vstat; - VAPI_cqe_num_t cqe_active_num; - QP_info *qp; - int i; - int Num_posted_recv_buf; - - /* Open HCA */ - CDEBUG(D_PORTALS, "Opening an HCA\n"); - - vstat = VAPI_open_hca(HCA_ID, &Hca_hndl); - vstat = EVAPI_get_hca_hndl(HCA_ID, &Hca_hndl); - if (vstat != VAPI_OK) { - CERROR("Failed opening the HCA: %s. %s...\n",HCA_ID,VAPI_strerror(vstat)); - return(vstat); - } - - /* Get HCA CAP */ - vstat = VAPI_query_hca_cap(Hca_hndl, &Hca_vendor, &Hca_cap); - if (vstat != VAPI_OK) { - CERROR("Failed query hca cap %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - /* Get port 1 info */ - vstat = VAPI_query_hca_port_prop(Hca_hndl, HCA_PORT_1 , &Hca_port_1_props); - if (vstat != VAPI_OK) { - CERROR("Failed query port cap %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - /* Get port 2 info */ - vstat = VAPI_query_hca_port_prop(Hca_hndl, HCA_PORT_2, &Hca_port_2_props); - if (vstat != VAPI_OK) { - CERROR("Failed query port cap %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - // Get a PD - CDEBUG(D_PORTALS, "Allocating PD \n"); - vstat = VAPI_alloc_pd(Hca_hndl,&Pd_hndl); - if (vstat != VAPI_OK) { - CERROR("Failed allocating a PD. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - vstat = createMemRegion(Hca_hndl, Pd_hndl); - if (vstat != VAPI_OK) { - CERROR("Failed registering a memory region.%s\n",VAPI_strerror(vstat)); - return(vstat); - } - - /* Create CQ for RQ*/ - CDEBUG(D_PORTALS, "Creating a send completion queue\n"); - - vstat = VAPI_create_cq(Hca_hndl, - NUM_CQE, - &Cq_hndl, - &cqe_active_num); - - if (vstat != VAPI_OK) { - CERROR("Failed creating a CQ. %s\n",VAPI_strerror(vstat)); - return(vstat); - } - - if(NUM_CQE == cqe_active_num) { - CERROR("VAPI_create_cq: NUM_CQE EQ cqe_active_num \n"); - } - else { - CDEBUG(D_NET, "VAPI_create_cq: NUM_CQE %d , actual cqe_active_num %d \n", - NUM_CQE, cqe_active_num); - } - - Cq_SQ_hndl = Cq_hndl; - Cq_RQ_hndl = Cq_hndl; - - // - // create QPs - // - for(i=0; i < NUM_QPS; i++) { - QP_list[i].pd_hndl = Pd_hndl; - QP_list[i].hca_hndl = Hca_hndl; - // sq rq use the same Cq_hndl - QP_list[i].sq_cq_hndl = Cq_hndl; - QP_list[i].rq_cq_hndl = Cq_hndl; - vstat = create_qp(&QP_list[i], i); - if (vstat != VAPI_OK) { - CERROR("Failed creating a QP %d %s\n",i, VAPI_strerror(vstat)); - return(vstat); - } - } - - // - // record HCA data - // - - Hca_data.hca_hndl = Hca_hndl; // HCA handle - Hca_data.pd_hndl = Pd_hndl; // protection domain - Hca_data.port = 1; // port number - Hca_data.num_qp = NUM_QPS; // number of qp used - - for(i=0; i < NUM_QPS; i++) { - Hca_data.qp_ptr[i] = &QP_list[i]; // point to QP_list - } - - Hca_data.num_cq = NUM_CQ; // number of cq used - Hca_data.cq_hndl = Cq_hndl; // - Hca_data.sq_cq_hndl = Cq_SQ_hndl; // - Hca_data.rq_cq_hndl = Cq_RQ_hndl; // - Hca_data.kib_data = kib_data; // - Hca_data.slid = QP_list[0].slid;// - - // prepare L_QP_data - -#ifdef USE_SHARED_MEMORY_AND_SOCKET - - /* - * + use a shared-memory between a user thread and a kernel thread - * for HCA's data exchange on the same node - * + use socket in user mode to exhange HCA's data with a remote node - */ - - - R_QP_data.opcode = SEND_QP_INFO; - R_QP_data.length = sizeof(L_QP_data); - - for(i=0; i < NUM_QPS; i++) { - // my slid will be used in a remote node as dlid - R_QP_data.dlid[i] = QP_list[i].slid; - // my qp_num will be used in remode node as remote_qp_number - // RC is used here so we need dlid and rqp_num - R_QP_data.rqp_num[i] = QP_list[i].qp_num ; - } - - // create a kernel thread for exchanging HCA's data - // R_QP_data will be exchanged with a remoe node - - kernel_thread(k_server_thread, &R_QP_data, 0); // - // check if the HCA'data have been updated by kernel_thread - // loop until the HCA's data is updated - // make sure that uagent is running - - // QP info is exchanged with a remote node - while (1) { - schedule_timeout(1000); - if(R_QP_data.opcode == RECV_QP_INFO) { - CDEBUG(D_NET, "HCA's data is being updated\n"); - break; - } - } - -#endif - -#ifdef USE_SHARED_MEMORY_AND_MULTICAST - - /* - * + use a shared-memory between a user thread and a kernel thread - * for HCA's data exchange on the same node - * + use Infinoband UR/multicast in user mode to exhange HCA's data with i - * a remote node - */ - - // use CM, opemSM - -#endif - - // - for(i=0; i < NUM_QPS; i++) { - qp = (QP_info *) &QP_list[i]; - QP_list[i].rqp_num = R_QP_data.rqp_num[i]; // remoter qp number - QP_list[i].dlid = R_QP_data.dlid[i]; // remote dlid - } - - // already have remote_qp_num adn dlid information - // initialize QP to RTR/RTS state - // - for(i=0; i < NUM_QPS; i++) { - vstat = init_qp_RC(&QP_list[i], i); - if (vstat != VAPI_OK) { - CERROR("Failed change a QP %d to RTS state%s\n", - i,VAPI_strerror(vstat)); - return(vstat); - } - } - - // post receiving buffer before any send happened - - Num_posted_recv_buf = post_recv_bufs( (VAPI_wr_id_t ) START_RECV_WRQ_ID); - - // for irregular completion event or some unexpected failure event - vstat = IB_Set_Async_Event_Handler(Hca_data, &kibnal_data); - if (vstat != VAPI_OK) { - CERROR("IB_Set_Async_Event_Handler failed: %d\n", vstat); - return vstat; - } - - - CDEBUG(D_PORTALS, "IBNAL- done with IB_Open_HCA\n"); - - for(i=0; i < NUM_MBUF; i++) { - spin_lock_init(&MSB_mutex[i]); - } - - return(VAPI_OK); - -} - - -/* - Function: IB_Set_Event_Handler() - - IN Hca_info hca_data - IN kibnal_data_t *kib_data -- private data - OUT NONE - - return: VAPI_OK - success - else - fail - -*/ - -VAPI_ret_t -IB_Set_Event_Handler(HCA_info hca_data, kibnal_data_t *kib_data) -{ - VAPI_ret_t vstat; - EVAPI_compl_handler_hndl_t comp_handler_hndl; - - // register CQE_Event_Hnadler - // VAPI function - vstat = VAPI_set_comp_event_handler(hca_data.hca_hndl, - CQE_event_handler, - &hca_data); - - /* - or use extended VAPI function - vstat = EVAPI_set_comp_eventh(hca_data.hca_hndl, - hca_data.cq_hndl, - CQE_event_handler, - &hca_data, - &comp_handler_hndl - ); - */ - - if (vstat != VAPI_OK) { - CERROR("IB_Set_Event_Handler: failed EVAPI_set_comp_eventh for" - " HCA ID = %s (%s).\n", HCA_ID, VAPI_strerror(vstat)); - return vstat; - } - - // issue a request for completion ievent notification - vstat = VAPI_req_comp_notif(hca_data.hca_hndl, - hca_data.cq_hndl, - VAPI_NEXT_COMP); - - if (vstat != VAPI_OK) { - CERROR("IB_Set_Event_Handler: failed VAPI_req_comp_notif for HCA ID" - " = %s (%s).\n", HCA_ID, VAPI_strerror(vstat)); - } - - return vstat; -} - - - -/* - Function: IB_Set_Async_Event_Handler() - - IN HCA_info hca_data - IN kibnal_data_t *kib_data -- private data - OUT NONE - - return: VAPI_OK - success - else - fail - -*/ - - -VAPI_ret_t -IB_Set_Async_Event_Handler(HCA_info hca_data, kibnal_data_t *kib_data) -{ - VAPI_ret_t vstat; - - // - // register an asynchronous event handler for this HCA - // - - vstat= VAPI_set_async_event_handler(hca_data.hca_hndl, - async_event_handler, - kib_data); - - if (vstat != VAPI_OK) { - CERROR("IB_Set_Async_Event_Handler: failed VAPI_set_async_comp_event_handler" - " for HCA ID = %s (%s).\n", HCA_ID, VAPI_strerror(vstat)); - } - - return vstat; -} - -// -// IB_Close_HCA -// close this Infiniband HCA interface -// release allocated resources to system -// -VAPI_ret_t -IB_Close_HCA(void ) -{ - - VAPI_ret_t vstat; - int ok = 1; - int i; - - /* Destroy QP */ - CDEBUG(D_PORTALS, "Destroying QP\n"); - - for(i=0; i < NUM_QPS; i++) { - vstat = VAPI_destroy_qp(QP_list[i].hca_hndl, QP_list[i].qp_hndl); - if (vstat != VAPI_OK) { - CERROR("Failed destroying QP %d. %s\n", i, VAPI_strerror(vstat)); - ok = 0; - } - } - - if (ok) { - /* Destroy CQ */ - CDEBUG(D_PORTALS, "Destroying CQ\n"); - for(i=0; i < NUM_QPS; i++) { - // send_cq adn receive_cq are shared the same CQ - // so only destroy one of them - vstat = VAPI_destroy_cq(QP_list[i].hca_hndl, QP_list[i].sq_cq_hndl); - if (vstat != VAPI_OK) { - CERROR("Failed destroying CQ %d. %s\n", i, VAPI_strerror(vstat)); - ok = 0; - } - } - } - - if (ok) { - /* Destroy Memory Region */ - CDEBUG(D_PORTALS, "Deregistering MR\n"); - for(i=0; i < NUM_QPS; i++) { - vstat = deleteMemRegion(&QP_list[i], i); - if (vstat != VAPI_OK) { - CERROR("Failed deregister mem reg %d. %s\n",i, VAPI_strerror(vstat)); - ok = 0; - break; - } - } - } - - if (ok) { - // finally - /* Close HCA */ - CDEBUG(D_PORTALS, "Closing HCA\n"); - vstat = VAPI_close_hca(Hca_hndl); - if (vstat != VAPI_OK) { - CERROR("Failed to close HCA. %s\n", VAPI_strerror(vstat)); - ok = 0; - } - } - - CDEBUG(D_PORTALS, "IBNAL- Done with closing HCA \n"); - - return vstat; -} - - -VAPI_ret_t -createMemRegion(VAPI_hca_hndl_t hca_hndl, - VAPI_pd_hndl_t pd_hndl) -{ - VAPI_ret_t vstat; - VAPI_mrw_t mrw; - VAPI_mrw_t rep_mr; - VAPI_mr_hndl_t rep_mr_hndl; - int buf_size; - char *bufptr; - int i; - - // send registered memory region - for(i=0; i < NUM_ENTRY; i++) { - MSbuf_list[i].buf_size = KB_32; - PORTAL_ALLOC(bufptr, MSbuf_list[i].buf_size); - if(bufptr == NULL) { - CDEBUG(D_MALLOC,"Failed to malloc a block of send memory, qix %d size %d\n", - i, MSbuf_list[i].buf_size); - CERROR("Failed to malloc a block of send memory, qix %d size %d\n", - i, MSbuf_list[i].buf_size); - return(VAPI_ENOMEM); - } - - mrw.type = VAPI_MR; - mrw.pd_hndl= pd_hndl; - mrw.start = MSbuf_list[i].buf_addr = (VAPI_virt_addr_t)(MT_virt_addr_t) bufptr; - mrw.size = MSbuf_list[i].buf_size; - mrw.acl = VAPI_EN_LOCAL_WRITE | - VAPI_EN_REMOTE_WRITE | - VAPI_EN_REMOTE_READ; - - // register send memory region - vstat = VAPI_register_mr(hca_hndl, - &mrw, - &rep_mr_hndl, - &rep_mr); - - // this memory region is going to be reused until deregister is called - if(vstat != VAPI_OK) { - CERROR("Failed registering a mem region qix %d Addr=%p, Len=%d. %s\n", - i, mrw.start, mrw.size, VAPI_strerror(vstat)); - return(vstat); - } - - MSbuf_list[i].mr = rep_mr; - MSbuf_list[i].mr_hndl = rep_mr_hndl; - MSbuf_list[i].bufptr = bufptr; - MSbuf_list[i].buf_addr = rep_mr.start; - MSbuf_list[i].status = BUF_REGISTERED; - MSbuf_list[i].ref_count = 0; - MSbuf_list[i].buf_type = REG_BUF; - MSbuf_list[i].raddr = 0x0; - MSbuf_list[i].rkey = 0x0; - } - - // RDAM buffer is not reserved for RDAM WRITE/READ - - for(i=NUM_ENTRY; i< NUM_MBUF; i++) { - MSbuf_list[i].status = BUF_UNREGISTERED; - MSbuf_list[i].buf_type = RDMA_BUF; - } - - - // recv registered memory region - for(i=0; i < NUM_ENTRY; i++) { - MRbuf_list[i].buf_size = KB_32; - PORTAL_ALLOC(bufptr, MRbuf_list[i].buf_size); - - if(bufptr == NULL) { - CDEBUG(D_MALLOC, "Failed to malloc a block of send memory, qix %d size %d\n", - i, MRbuf_list[i].buf_size); - return(VAPI_ENOMEM); - } - - mrw.type = VAPI_MR; - mrw.pd_hndl= pd_hndl; - mrw.start = (VAPI_virt_addr_t)(MT_virt_addr_t) bufptr; - mrw.size = MRbuf_list[i].buf_size; - mrw.acl = VAPI_EN_LOCAL_WRITE | - VAPI_EN_REMOTE_WRITE | - VAPI_EN_REMOTE_READ; - - // register send memory region - vstat = VAPI_register_mr(hca_hndl, - &mrw, - &rep_mr_hndl, - &rep_mr); - - // this memory region is going to be reused until deregister is called - if(vstat != VAPI_OK) { - CERROR("Failed registering a mem region qix %d Addr=%p, Len=%d. %s\n", - i, mrw.start, mrw.size, VAPI_strerror(vstat)); - return(vstat); - } - - MRbuf_list[i].mr = rep_mr; - MRbuf_list[i].mr_hndl = rep_mr_hndl; - MRbuf_list[i].bufptr = bufptr; - MRbuf_list[i].buf_addr = rep_mr.start; - MRbuf_list[i].status = BUF_REGISTERED; - MRbuf_list[i].ref_count = 0; - MRbuf_list[i].buf_type = REG_BUF; - MRbuf_list[i].raddr = 0x0; - MRbuf_list[i].rkey = rep_mr.r_key; - MRbuf_list[i].lkey = rep_mr.l_key; - - } - - // keep extra information for a qp - for(i=0; i < NUM_QPS; i++) { - QP_list[i].mr_hndl = MSbuf_list[i].mr_hndl; - QP_list[i].mr = MSbuf_list[i].mr; - QP_list[i].bufptr = MSbuf_list[i].bufptr; - QP_list[i].buf_addr = MSbuf_list[i].buf_addr; - QP_list[i].buf_size = MSbuf_list[i].buf_size; - QP_list[i].raddr = MSbuf_list[i].raddr; - QP_list[i].rkey = MSbuf_list[i].rkey; - QP_list[i].lkey = MSbuf_list[i].lkey; - } - - CDEBUG(D_PORTALS, "IBNAL- done VAPI_ret_t createMemRegion \n"); - - return vstat; - -} /* createMemRegion */ - - - -VAPI_ret_t -deleteMemRegion(QP_info *qp, int qix) -{ - VAPI_ret_t vstat; - - // - // free send memory assocaited with this memory region - // - PORTAL_FREE(MSbuf_list[qix].bufptr, MSbuf_list[qix].buf_size); - - // de-register it - vstat = VAPI_deregister_mr(qp->hca_hndl, MSbuf_list[qix].mr_hndl); - - if(vstat != VAPI_OK) { - CERROR("Failed deregistering a send mem region qix %d %s\n", - qix, VAPI_strerror(vstat)); - return vstat; - } - - // - // free recv memory assocaited with this memory region - // - PORTAL_FREE(MRbuf_list[qix].bufptr, MRbuf_list[qix].buf_size); - - // de-register it - vstat = VAPI_deregister_mr(qp->hca_hndl, MRbuf_list[qix].mr_hndl); - - if(vstat != VAPI_OK) { - CERROR("Failed deregistering a recv mem region qix %d %s\n", - qix, VAPI_strerror(vstat)); - return vstat; - } - - return vstat; -} - - -// -// polling based event handling -// + a daemon process -// + poll the CQ and check what is in the CQ -// + process incoming CQ event -// + -// - - -RDMA_Info_Exchange Rdma_info; -int Cts_Message_arrived = NO; - -void k_recv_thread(HCA_info *hca_data) -{ - VAPI_ret_t vstat; - VAPI_wc_desc_t comp_desc; - unsigned long polling_count = 0; - u_int32_t timeout_usec; - unsigned int priority = 100; - unsigned int length; - VAPI_wr_id_t wrq_id; - u_int32_t transferred_data_length; /* Num. of bytes transferred */ - void *bufdata; - VAPI_virt_addr_t bufaddr; - unsigned long buf_size = 0; - QP_info *qp; // point to QP_list - - kportal_daemonize("k_recv_thread"); // make it as a daemon process - - // tuning variable - timeout_usec = 100; // how is the impact on the performance - - // send Q and receive Q are using the same CQ - // so only poll one CQ for both operations - - CDEBUG(D_NET, "IBNAL- enter kibnal_recv_thread\n"); - CDEBUG(D_NET, "hca_hndl = 0X%x, cq_hndl=0X%x\n", - hca_data->hca_hndl,hca_data->cq_hndl); - - qp = hca_data->qp_ptr; - if(qp == NULL) { - CDEBUG(D_NET, "in recv_thread qp is NULL\n"); - CDEBUG(D_NET, "Exit from recv_thread qp is NULL\n"); - return; - } - else { - CDEBUG(D_NET, "in recv_thread qp is 0X%X\n", qp); - } - - CDEBUG(D_NET, "kibnal_recv_thread - enter event driver polling loop\n"); - - // - // use event driver - // - - - - while(1) { - polling_count++; - - // - // send Q and receive Q are using the same CQ - // so only poll one CQ for both operations - // - - vstat = VAPI_poll_cq(hca_data->hca_hndl,hca_data->cq_hndl, &comp_desc); - - if (vstat == VAPI_CQ_EMPTY) { - // there is no event in CQE - continue; - } - else { - if (vstat != (VAPI_OK)) { - CERROR("error while polling completion queuei vstat %d \n", vstat); - return; - } - } - - // process the complete event - switch(comp_desc.opcode) { - case VAPI_CQE_SQ_SEND_DATA: - // about the Send Q ,POST SEND completion - // who needs this information - // get wrq_id - // mark MSbuf_list[wr_id].status = BUF_REGISTERED - - wrq_id = comp_desc.id; - - if(RDMA_OP_ID < wrq_id) { - // this RDMA message id, adjust it to the right entry - wrq_id = wrq_id - RDMA_OP_ID; - vstat = VAPI_deregister_mr(qp->hca_hndl, Local_rdma_info.send_rdma_mr_hndl); - } - - if(vstat != VAPI_OK) { - CERROR("VAPI_CQE_SQ_SEND_DATA: Failed deregistering a RDMAi recv" " mem region %s\n", VAPI_strerror(vstat)); - } - - if((RDMA_CTS_ID <= wrq_id) && (RDMA_OP_ID < wrq_id)) { - // RTS or CTS send complete, release send buffer - if(wrq_id >= RDMA_RTS_ID) - wrq_id = wrq_id - RDMA_RTS_ID; - else - wrq_id = wrq_id - RDMA_CTS_ID; - } - - spin_lock(&MSB_mutex[(int) wrq_id]); - MRbuf_list[wrq_id].status = BUF_REGISTERED; - spin_unlock(&MSB_mutex[(int) wrq_id]); - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_SEND_DATA\n"); - break; - - case VAPI_CQE_SQ_RDMA_WRITE: - // about the Send Q, RDMA write completion - // who needs this information - // data is successfully write from pource to destionation - - // get wr_id - // mark MSbuf_list[wr_id].status = BUF_REGISTERED - // de-register rdma buffer - // - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_RDMA_WRITE\n"); - break; - - case VAPI_CQE_SQ_RDMA_READ: - // about the Send Q - // RDMA read completion - // who needs this information - // data is successfully read from destionation to source - CDEBUG(D_NET, "CQE opcode- VAPI_CQE_SQ_RDMA_READ\n"); - break; - - case VAPI_CQE_SQ_COMP_SWAP: - // about the Send Q - // RDMA write completion - // who needs this information - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_COMP_SWAP\n"); - break; - - case VAPI_CQE_SQ_FETCH_ADD: - // about the Send Q - // RDMA write completion - // who needs this information - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_FETCH_ADD\n"); - break; - - case VAPI_CQE_SQ_BIND_MRW: - // about the Send Q - // RDMA write completion - // who needs this information - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_BIND_MRW\n"); - break; - - case VAPI_CQE_RQ_SEND_DATA: - // about the Receive Q - // process the incoming data and - // forward it to ..... - // a completion recevie event is arriving at CQ - // issue a recevie to get this arriving data out from CQ - // pass the receiving data for further processing - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_RQ_SEND_DATA\n"); - wrq_id = comp_desc.id ; - transferred_data_length = comp_desc.byte_len; - - if((wrq_id >= RDMA_CTS_ID) && (wrq_id < RDMA_OP_ID)) { - // this is RTS/CTS message - // process it locally and don't pass it to portals layer - // adjust wrq_id to get the right entry in MRbfu_list - - if(wrq_id >= RDMA_RTS_ID) - wrq_id = wrq_id - RDMA_RTS_ID; - else - wrq_id = wrq_id - RDMA_CTS_ID; - - bufaddr = (VAPI_virt_addr_t)(MT_virt_addr_t) MRbuf_list[wrq_id].buf_addr; - MRbuf_list[wrq_id].status = BUF_INUSE; - memcpy(&Rdma_info, &bufaddr, sizeof(RDMA_Info_Exchange)); - - if(Ready_To_send == Rdma_info.opcode) - // an RTS request message from remote node - // prepare local RDMA buffer and send local rdma info to - // remote node - CTS_handshaking_protocol(&Rdma_info); - else - if((Clear_To_send == Rdma_info.opcode) && - (RDMA_BUFFER_RESERVED == Rdma_info.flag)) - Cts_Message_arrived = YES; - else - if(RDMA_BUFFER_UNAVAILABLE == Rdma_info.flag) - CERROR("RDMA operation abort-RDMA_BUFFER_UNAVAILABLE\n"); - } - else { - // - // this is an incoming mesage for portals layer - // move to PORTALS layer for further processing - // - - bufaddr = (VAPI_virt_addr_t)(MT_virt_addr_t) - MRbuf_list[wrq_id].buf_addr; - - MRbuf_list[wrq_id].status = BUF_INUSE; - transferred_data_length = comp_desc.byte_len; - - kibnal_rx(hca_data->kib_data, - bufaddr, - transferred_data_length, - MRbuf_list[wrq_id].buf_size, - priority); - } - - // repost this receiving buffer and makr it at BUF_REGISTERED - - vstat = repost_recv_buf(qp, wrq_id); - if(vstat != (VAPI_OK)) { - CERROR("error while polling completion queue\n"); - } - else { - MRbuf_list[wrq_id].status = BUF_REGISTERED; - } - - break; - - case VAPI_CQE_RQ_RDMA_WITH_IMM: - // about the Receive Q - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_RQ_RDMA_WITH_IMM\n"); - - wrq_id = comp_desc.id ; - transferred_data_length = comp_desc.byte_len; - - if(wrq_id == RDMA_OP_ID) { - // this is RDAM op , locate the RDAM memory buffer address - - bufaddr = (VAPI_virt_addr_t)(MT_virt_addr_t) Local_rdma_info.raddr; - - transferred_data_length = comp_desc.byte_len; - - kibnal_rx(hca_data->kib_data, - bufaddr, - transferred_data_length, - Local_rdma_info.buf_length, - priority); - - // de-regiser this RDAM receiving memory buffer - // too early ?? test & check - vstat = VAPI_deregister_mr(qp->hca_hndl, Local_rdma_info.recv_rdma_mr_hndl); - if(vstat != VAPI_OK) { - CERROR("VAPI_CQE_RQ_RDMA_WITH_IMM: Failed deregistering a RDMA" - " recv mem region %s\n", VAPI_strerror(vstat)); - } - } - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_RQ_RDMA_WITH_IMM\n"); - break; - - case VAPI_CQE_INVAL_OPCODE: - // - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_INVAL_OPCODE\n"); - break; - - default : - CDEBUG(D_NET, "CQE opcode-unknown opcode\n"); - break; - } // switch - - schedule_timeout(RECEIVING_THREAD_TIMEOUT);//how often do we need to poll CQ - - }// receiving while loop - - -} - - -void CQE_event_handler(VAPI_hca_hndl_t hca_hndl, - VAPI_cq_hndl_t cq_hndl, - void *private) -{ - VAPI_ret_t vstat; - VAPI_wc_desc_t comp_desc; - unsigned long polling_count = 0; - u_int32_t timeout_usec; - unsigned int priority = 100; - unsigned int length; - VAPI_wr_id_t wrq_id; - u_int32_t transferred_data_length; /* Num. of bytes transferred */ - void *bufdata; - VAPI_virt_addr_t bufaddr; - unsigned long buf_size = 0; - QP_info *qp; // point to QP_list - HCA_info *hca_data; - - // send Q and receive Q are using the same CQ - // so only poll one CQ for both operations - - CDEBUG(D_NET, "IBNAL- enter CQE_event_handler\n"); - printk("IBNAL- enter CQE_event_handler\n"); - - hca_data = (HCA_info *) private; - - // - // use event driven - // - - - vstat = VAPI_poll_cq(hca_data->hca_hndl,hca_data->cq_hndl, &comp_desc); - - if (vstat == VAPI_CQ_EMPTY) { - CDEBUG(D_NET, "CQE_event_handler: there is no event in CQE, how could" - " this " "happened \n"); - printk("CQE_event_handler: there is no event in CQE, how could" - " this " "happened \n"); - - } - else { - if (vstat != (VAPI_OK)) { - CDEBUG(D_NET, "error while polling completion queue vstat %d - %s\n", - vstat, VAPI_strerror(vstat)); - printk("error while polling completion queue vstat %d - %s\n", - vstat, VAPI_strerror(vstat)); - return; - } - } - - // process the complete event - switch(comp_desc.opcode) { - case VAPI_CQE_SQ_SEND_DATA: - // about the Send Q ,POST SEND completion - // who needs this information - // get wrq_id - // mark MSbuf_list[wr_id].status = BUF_REGISTERED - - wrq_id = comp_desc.id; - -#ifdef IBNAL_SELF_TESTING - if(wrq_id == SEND_RECV_TEST_ID) { - printk("IBNAL_SELF_TESTING - VAPI_CQE_SQ_SEND_DATA \n"); - } -#else - if(RDMA_OP_ID < wrq_id) { - // this RDMA message id, adjust it to the right entry - wrq_id = wrq_id - RDMA_OP_ID; - vstat = VAPI_deregister_mr(qp->hca_hndl, - Local_rdma_info.send_rdma_mr_hndl); - } - - if(vstat != VAPI_OK) { - CERROR(" VAPI_CQE_SQ_SEND_DATA: Failed deregistering a RDMA" - " recv mem region %s\n", VAPI_strerror(vstat)); - } - - if((RDMA_CTS_ID <= wrq_id) && (RDMA_OP_ID < wrq_id)) { - // RTS or CTS send complete, release send buffer - if(wrq_id >= RDMA_RTS_ID) - wrq_id = wrq_id - RDMA_RTS_ID; - else - wrq_id = wrq_id - RDMA_CTS_ID; - } - - spin_lock(&MSB_mutex[(int) wrq_id]); - MRbuf_list[wrq_id].status = BUF_REGISTERED; - spin_unlock(&MSB_mutex[(int) wrq_id]); -#endif - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_SEND_DATA\n"); - - break; - - case VAPI_CQE_SQ_RDMA_WRITE: - // about the Send Q, RDMA write completion - // who needs this information - // data is successfully write from pource to destionation - - // get wr_id - // mark MSbuf_list[wr_id].status = BUF_REGISTERED - // de-register rdma buffer - // - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_RDMA_WRITE\n"); - break; - - case VAPI_CQE_SQ_RDMA_READ: - // about the Send Q - // RDMA read completion - // who needs this information - // data is successfully read from destionation to source - CDEBUG(D_NET, "CQE opcode- VAPI_CQE_SQ_RDMA_READ\n"); - break; - - case VAPI_CQE_SQ_COMP_SWAP: - // about the Send Q - // RDMA write completion - // who needs this information - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_COMP_SWAP\n"); - break; - - case VAPI_CQE_SQ_FETCH_ADD: - // about the Send Q - // RDMA write completion - // who needs this information - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_FETCH_ADD\n"); - break; - - case VAPI_CQE_SQ_BIND_MRW: - // about the Send Q - // RDMA write completion - // who needs this information - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_SQ_BIND_MRW\n"); - break; - - case VAPI_CQE_RQ_SEND_DATA: - // about the Receive Q - // process the incoming data and - // forward it to ..... - // a completion recevie event is arriving at CQ - // issue a recevie to get this arriving data out from CQ - // pass the receiving data for further processing - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_RQ_SEND_DATA\n"); - - wrq_id = comp_desc.id ; - -#ifdef IBNAL_SELF_TESTING - - char rbuf[KB_32]; - int i; - - if(wrq_id == SEND_RECV_TEST_ID) { - printk("IBNAL_SELF_TESTING - VAPI_CQE_RQ_SEND_DATA\n"); - } - - bufaddr = (VAPI_virt_addr_t)(MT_virt_addr_t) - MRbuf_list[ SEND_RECV_TEST_BUF_ID].buf_addr; - MRbuf_list[SEND_RECV_TEST_BUF_ID].status = BUF_INUSE; - memcpy(&rbuf, &bufaddr, KB_32); - - - for(i=0; i < 16; i++) - printk("rbuf[%d]=%c, ", rbuf[i]); - printk("\n"); - - // repost this receiving buffer and makr it at BUF_REGISTERED - vstat = repost_recv_buf(qp,SEND_RECV_TEST_BUF_ID); - if(vstat != (VAPI_OK)) { - printk("error while polling completion queue\n"); - } - else { - MRbuf_list[SEND_RECV_TEST_BUF_ID].status = BUF_REGISTERED; - } -#else - transferred_data_length = comp_desc.byte_len; - - if((wrq_id >= RDMA_CTS_ID) && (wrq_id < RDMA_OP_ID)) { - // this is RTS/CTS message - // process it locally and don't pass it to portals layer - // adjust wrq_id to get the right entry in MRbfu_list - - if(wrq_id >= RDMA_RTS_ID) - wrq_id = wrq_id - RDMA_RTS_ID; - else - wrq_id = wrq_id - RDMA_CTS_ID; - - bufaddr = (VAPI_virt_addr_t)(MT_virt_addr_t) - MRbuf_list[wrq_id].buf_addr; - MRbuf_list[wrq_id].status = BUF_INUSE; - memcpy(&Rdma_info, &bufaddr, sizeof(RDMA_Info_Exchange)); - - if(Ready_To_send == Rdma_info.opcode) - // an RTS request message from remote node - // prepare local RDMA buffer and send local rdma info to - // remote node - CTS_handshaking_protocol(&Rdma_info); - else - if((Clear_To_send == Rdma_info.opcode) && - (RDMA_BUFFER_RESERVED == Rdma_info.flag)) - Cts_Message_arrived = YES; - else - if(RDMA_BUFFER_UNAVAILABLE == Rdma_info.flag) - CERROR("RDMA operation abort-RDMA_BUFFER_UNAVAILABLE\n"); - } - else { - // - // this is an incoming mesage for portals layer - // move to PORTALS layer for further processing - // - - bufaddr = (VAPI_virt_addr_t)(MT_virt_addr_t) - MRbuf_list[wrq_id].buf_addr; - - MRbuf_list[wrq_id].status = BUF_INUSE; - transferred_data_length = comp_desc.byte_len; - - kibnal_rx(hca_data->kib_data, - bufaddr, - transferred_data_length, - MRbuf_list[wrq_id].buf_size, - priority); - } - - // repost this receiving buffer and makr it at BUF_REGISTERED - vstat = repost_recv_buf(qp, wrq_id); - if(vstat != (VAPI_OK)) { - CERROR("error while polling completion queue\n"); - } - else { - MRbuf_list[wrq_id].status = BUF_REGISTERED; - } -#endif - - break; - - case VAPI_CQE_RQ_RDMA_WITH_IMM: - // about the Receive Q - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_RQ_RDMA_WITH_IMM\n"); - - wrq_id = comp_desc.id ; - transferred_data_length = comp_desc.byte_len; - - if(wrq_id == RDMA_OP_ID) { - // this is RDAM op , locate the RDAM memory buffer address - - bufaddr = (VAPI_virt_addr_t)(MT_virt_addr_t) Local_rdma_info.raddr; - - transferred_data_length = comp_desc.byte_len; - - kibnal_rx(hca_data->kib_data, - bufaddr, - transferred_data_length, - Local_rdma_info.buf_length, - priority); - - // de-regiser this RDAM receiving memory buffer - // too early ?? test & check - vstat = VAPI_deregister_mr(qp->hca_hndl, Local_rdma_info.recv_rdma_mr_hndl); - if(vstat != VAPI_OK) { - CERROR("VAPI_CQE_RQ_RDMA_WITH_IMM: Failed deregistering a RDMA" - " recv mem region %s\n", VAPI_strerror(vstat)); - } - } - - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_RQ_RDMA_WITH_IMM\n"); - break; - - case VAPI_CQE_INVAL_OPCODE: - // - CDEBUG(D_NET, "CQE opcode-VAPI_CQE_INVAL_OPCODE\n"); - break; - - default : - CDEBUG(D_NET, "CQE opcode-unknown opcode\n"); - - break; - } // switch - - // issue a new request for completion ievent notification - vstat = VAPI_req_comp_notif(hca_data->hca_hndl, - hca_data->cq_hndl, - VAPI_NEXT_COMP); - - - if(vstat != VAPI_OK) { - CERROR("PI_req_comp_notif: Failed %s\n", VAPI_strerror(vstat)); - } - - return; // end of event handler - -} - - - -int -kibnal_cmd(struct portal_ioctl_data * data, void * private) -{ - int rc ; - - CDEBUG(D_NET, "kibnal_cmd \n"); - - return YES; -} - - - -void ibnal_send_recv_self_testing(int *my_role) -{ - VAPI_ret_t vstat; - VAPI_sr_desc_t sr_desc; - VAPI_sg_lst_entry_t sr_sg; - QP_info *qp; - VAPI_wr_id_t send_id; - int buf_id; - char sbuf[KB_32]; - char rbuf[KB_32]; - int i; - int buf_length = KB_32; - VAPI_wc_desc_t comp_desc; - int num_send = 1; - int loop_count = 0; - - // make it as a daemon process - // kportal_daemonize("ibnal_send_recv_self_testing"); - - printk("My role is 0X%X\n", *my_role); - -if(*my_role == TEST_SEND_MESSAGE) { - printk("Enter ibnal_send_recv_self_testing\n"); - - memset(&sbuf, 'a', KB_32); - memset(&rbuf, ' ', KB_32); - - send_id = SEND_RECV_TEST_ID; - buf_id = SEND_RECV_TEST_BUF_ID; - - qp = &QP_list[buf_id]; - - sr_desc.opcode = VAPI_SEND; - sr_desc.comp_type = VAPI_SIGNALED; - sr_desc.id = send_id; - - // scatter and gather info - sr_sg.len = KB_32; - sr_sg.lkey = MSbuf_list[buf_id].mr.l_key; // use send MR - sr_sg.addr = (VAPI_virt_addr_t)(MT_virt_addr_t) MSbuf_list[buf_id].buf_addr; - - // copy data to register send buffer - memcpy(&sr_sg.addr, &sbuf, buf_length); - - sr_desc.sg_lst_p = &sr_sg; - sr_desc.sg_lst_len = 1; // only 1 entry is used - sr_desc.fence = TRUE; - sr_desc.set_se = FALSE; - - /* - // call VAPI_post_sr to send out this data - vstat = VAPI_post_sr(qp->hca_hndl, qp->qp_hndl, &sr_desc); - - if (vstat != VAPI_OK) { - printk("VAPI_post_sr failed (%s).\n",VAPI_strerror(vstat)); - } - - printk("VAPI_post_sr success.\n"); - */ - - } -else { - printk("I am a receiver and doing nothing here\n"); -} - - printk("ibnal_send_recv_self_testing thread exit \n"); - - return; - -} - - -// -// ibnal initialize process -// -// 1. Bring up Infiniband network interface -// * -// 2. Initialize a PORTALS nal interface -// -// -int __init -kibnal_initialize(void) -{ - int rc; - int ntok; - unsigned long sizemask; - unsigned int nid; - VAPI_ret_t vstat; - - - portals_debug_set_level(IBNAL_DEBUG_LEVEL_1); - - CDEBUG(D_MALLOC, "start kmem %d\n", atomic_read (&portal_kmemory)); - - CDEBUG(D_PORTALS, "kibnal_initialize: Enter kibnal_initialize\n"); - - // set api functional pointers - kibnal_api.startup = kibnal_startup; - kibnal_api.forward = kibnal_forward; - kibnal_api.shutdown = kibnal_shutdown; - kibnal_api.yield = kibnal_yield; - kibnal_api.lock = kibnal_lock; - kibnal_api.unlock = kibnal_unlock; - kibnal_api.nal_data = &kibnal_data; // this is so called private data - - memset(&kibnal_data, 0, sizeof(kibnal_data)); - - // initialize kib_list list data structure - INIT_LIST_HEAD(&kibnal_data.kib_list); - - kibnal_data.kib_cb = &kibnal_lib; - - spin_lock_init(&kibnal_data.kib_dispatch_lock); - - - // - // bring up the IB inter-connect network interface - // setup QP, CQ - // - vstat = IB_Open_HCA(&kibnal_data); - - if(vstat != VAPI_OK) { - CERROR("kibnal_initialize: IB_Open_HCA failed: %d- %s\n", - vstat, VAPI_strerror(vstat)); - - printk("kibnal_initialize: IB_Open_HCA failed: %d- %s\n", - vstat, VAPI_strerror(vstat)); - return NO; - } - - kibnal_data.kib_nid = (__u64 )Hca_hndl;//convert Hca_hndl to 64-bit format - kibnal_data.kib_init = 1; - - CDEBUG(D_NET, " kibnal_data.kib_nid 0x%x%x\n", kibnal_data.kib_nid); - printk(" kibnal_data.kib_nid 0x%x%x\n", kibnal_data.kib_nid); - - /* Network interface ready to initialise */ - // get an entery in the PORTALS table for this IB protocol - - CDEBUG(D_PORTALS,"Call PtlNIInit to register this Infiniband Interface\n"); - printk("Call PtlNIInit to register this Infiniband Interface\n"); - - rc = PtlNIInit(kibnal_init, 32, 4, 0, &kibnal_ni); - - if(rc != PTL_OK) { - CERROR("kibnal_initialize: PtlNIInit failed %d\n", rc); - printk("kibnal_initialize: PtlNIInit failed %d\n", rc); - kibnal_finalize(); - return (-ENOMEM); - } - - CDEBUG(D_PORTALS,"kibnal_initialize: PtlNIInit DONE\n"); - printk("kibnal_initialize: PtlNIInit DONE\n"); - - - -#ifdef POLL_BASED_CQE_HANDLING - // create a receiving thread: main loopa - // this is polling based mail loop - kernel_thread(k_recv_thread, &Hca_data, 0); -#endif - -#ifdef EVENT_BASED_CQE_HANDLING - // for completion event handling, this is event based CQE handling - vstat = IB_Set_Event_Handler(Hca_data, &kibnal_data); - - if (vstat != VAPI_OK) { - CERROR("IB_Set_Event_Handler failed: %d - %s \n", - vstat, VAPI_strerror(vstat)); - return vstat; - } - - CDEBUG(D_PORTALS,"IB_Set_Event_Handler Done \n"); - printk("IB_Set_Event_Handler Done \n"); - -#endif - - PORTAL_SYMBOL_REGISTER(kibnal_ni); - -#ifdef IBNAL_SELF_TESTING - // - // test HCA send recv before normal event handling - // - int my_role; - my_role = TEST_SEND_MESSAGE; - - printk("my role is TEST_RECV_MESSAGE\n"); - - // kernel_thread(ibnal_send_recv_self_testing, &my_role, 0); - - ibnal_send_recv_self_testing(&my_role); - -#endif - - return 0; - -} - - - -MODULE_AUTHOR("Hsingbung(HB) Chen <hbchen@lanl.gov>"); -MODULE_DESCRIPTION("Kernel Infiniband NAL v0.1"); -MODULE_LICENSE("GPL"); - -module_init (kibnal_initialize); -module_exit (kibnal_finalize); - -EXPORT_SYMBOL(kibnal_ni); - diff --git a/lnet/klnds/iblnd/ibnal.h b/lnet/klnds/iblnd/ibnal.h deleted file mode 100644 index 4a1f0d7cf3..0000000000 --- a/lnet/klnds/iblnd/ibnal.h +++ /dev/null @@ -1,565 +0,0 @@ -#ifndef _IBNAL_H -#define _IBNAL_H - -#include <asm/system.h> -#include <asm/uaccess.h> -#include <asm/segment.h> -#include <linux/config.h> -#include <linux/module.h> -#include <linux/kernel.h> -#include <linux/mm.h> -#include <linux/string.h> - -#include <linux/ipc.h> -#include <linux/shm.h> - -#include <linux/stat.h> -#include <linux/errno.h> -#include <linux/locks.h> -#include <linux/unistd.h> -#include <linux/init.h> -#include <linux/fs.h> -#include <linux/file.h> -#include <linux/list.h> -#include <linux/in.h> -#include <unistd.h> - -#define DEBUG_SUBSYSTEM S_IBNAL - -#include <portals/p30.h> -#include <portals/lib-p30.h> -#include <linux/kp30.h> -#include <linux/kpr.h> - -// Infiniband VAPI/EVAPI header files -// Mellanox MT23108 VAPI -#include <vapi.h> -#include <vapi_types.h> -#include <vapi_common.h> -#include <evapi.h> - -// pick a port for this RDMA information exhange between two hosts -#define HOST_PORT 11211 -#define QUEUE_SIZE 1024 -#define HCA_PORT_1 1 -#define HCA_PORT_2 2 -#define DEBUG_SUBSYSTEM S_IBNAL - -#define START_SEND_WRQ_ID 0 -#define START_RECV_WRQ_ID 0 -#define START_RDMA_WRQ_ID 0 - -#define DEFAULT_PRIORITY 100 - -#define WAIT_FOT_R_RDMA_TIMEOUT 10000 -#define MAX_NUM_TRY 3000 - -#define MAX_NUM_POLL 300 -#define MAX_LOOP_COUNT 500 - -#define MAX_GID 32 -#define MCG_BUF_LENGTH 128 - -#define SHARED_SEGMENT_SIZE 0x10000 -#define HCA_EXCHANGE_SHM_KEY 999 // shared memory key for HCA data exchange - -// some internals opcodes for IB operations used in IBNAL -#define SEND_QP_INFO 0X00000001 -#define RECV_QP_INFO 0X00000010 - -// Mellanox InfiniHost MT23108 -// QP/CQ related information -// - -#define MTU_256 1 /* 1-256,2-512,3-1024,4-2048 */ -#define MTU_512 2 /* 1-256,2-512,3-1024,4-2048 */ -#define MTU_1024 3 /* 1-256,2-512,3-1024,4-2048 */ -#define MTU_2048 4 /* 1-256,2-512,3-1024,4-2048 */ - -// number of entries for each CQ and WQ -// how much do we need ? -#define NUM_CQE 1024 -#define NUM_WQE 1024 -#define MAX_OUT_SQ 64 -#define MAX_OUT_RQ 64 - -#define NUM_MBUF 256 -#define NUM_RDMA_RESERVED_ENTRY 128 -#define NUM_QPS 256 - -#define INVALID_WR_ID ((VAPI_wr_id_t) -1) - - -// for Vector IO -// scatter and gather -// Portals can support upto 64 IO-Vectors -// how much do we need ? -#define NUM_SGE 1 -#define NUM_SG 1 -#define NUM_CQ 1 - -#define ONE_KB 1024 -#define ONE_MB 1024 * ONE_KB -#define ONE_GB 1024 * ONE_MB - - -#define KB_4 1024 * 4 -#define KB_8 1024 * 8 -#define KB_16 1024 * 16 -#define KB_32 1024 * 32 -#define KB_64 1024 * 64 -#define KB_128 1024 * 128 -#define KB_256 1024 * 256 - -// 256 entry in registered buffer list -// small size message -#define Num_4_KB 64 -#define Num_8_KB 64 -#define Num_16_KB 40 -#define Num_32_KB 40 -#define Num_64_KB 40 -#define Num_128_KB 4 -#define Num_256_KB 4 - -#define SMALL_MSG_SIZE KB_32 - -#define MAX_MSG_SIZE ONE_MB * 512 - -// 128's 64KB bufer for send -// 128's 64KB bufer for recv -// used in RDAM operation only - -#define NUM_ENTRY 128 - -#define End_4_kb Num_4_KB -#define End_8_kb End_4_kb + Num_8_KB -#define End_16_kb End_8_kb + Num_16_KB -#define End_32_kb End_16_kb + Num_32_KB -#define End_64_kb End_32_kb + Num_64_KB -#define End_128_kb End_64_kb + Num_128_KB -#define End_256_kb End_128_kb+ Num_256_KB - - -#define SEND_BUF_SIZE KB_32 -#define RECV_BUF_SIZE SEND_BUF_SIZE - -// #define POLL_BASED_CQE_HANDLING 1 -#define EVENT_BASED_CQE_HANDLING 1 -#define IBNAL_SELF_TESTING 1 - -#ifdef IBNAL_SELF_TESTING -#undef IBNAL_SELF_TESTING -#endif - - -#define MSG_SIZE_SMALL 1 -#define MSG_SIZE_LARGE 2 - - - -// some defauly configuration values for early testing -#define DEFAULT_DLID 1 // default destination link ID -#define DEFAULT_QP_NUM 4 // default QP number -#define P_KEY 0xFFFF // do we need default value -#define PKEY_IX 0x0 // do we need default value -#define Q_KEY 0x012 // do we need default value -#define L_KEY 0x12345678 // do we need default value -#define R_KEY 0x87654321 // do we need default value -#define HCA_ID "InfiniHost0" // default -#define START_PSN 0 -#define START_SQ_PSN 0 -#define START_RQ_PSN 0 - - -#define __u_long_long unsigned long long - -#define IBNAL_DEBUG 1 - -#define USE_SHARED_MEMORY_AND_SOCKET 1 - -// operation type -#define TRY_SEND_ONLY 1 - -#define YES 1 -#define NO 0 - -// -// a common data structure for IB QP's operation -// each QP is associated with an QP_info structure -// -typedef struct QP_info -{ - VAPI_hca_hndl_t hca_hndl; // HCA handle - IB_port_t port; // port number - VAPI_qp_hndl_t qp_hndl; // QP's handle list - VAPI_qp_state_t qp_state; // QP's current state - VAPI_pd_hndl_t pd_hndl; // protection domain - VAPI_cq_hndl_t cq_hndl; // send-queue CQ's handle - VAPI_cq_hndl_t sq_cq_hndl; // send-queue CQ's handle - VAPI_cq_hndl_t rq_cq_hndl; // receive-queue CQ's handle - VAPI_ud_av_hndl_t av_hndl; // receive-queue CQ's handle - VAPI_qp_init_attr_t qp_init_attr; // QP's init attribute - VAPI_qp_attr_t qp_attr; // QP's attribute - dlid - VAPI_qp_prop_t qp_prop; // QP's propertities - VAPI_hca_port_t hca_port; - VAPI_qp_num_t qp_num; // QP's number - VAPI_qp_num_t rqp_num; // remote QP's number - IB_lid_t slid; - IB_lid_t dlid; - VAPI_gid_t src_gid; - - u_int32_t buf_size; - VAPI_virt_addr_t buf_addr; - char *bufptr; - VAPI_mrw_t mr; - VAPI_mr_hndl_t mr_hndl; - VAPI_virt_addr_t raddr; - VAPI_rkey_t rkey; - VAPI_lkey_t lkey; - - VAPI_wr_id_t last_posted_send_id; // user defined work request ID - VAPI_wr_id_t last_posted_rcv_id; // user defined work request ID - VAPI_mw_hndl_t mw_hndl; // memory window handle - VAPI_rkey_t mw_rkey; // memory window rkey - VAPI_sg_lst_entry_t sg_lst[256]; // scatter and gather list - int sg_list_sz; // set as NUM_SGE - VAPI_wr_id_t wr_id; // - spinlock_t snd_mutex; - spinlock_t rcv_mutex; - spinlock_t bl_mutex; - spinlock_t cln_mutex; - int cur_RDMA_outstanding; - int cur_send_outstanding; - int cur_posted_rcv_bufs; - int snd_rcv_balance; -} QP_info; - - -// buffer status -#define BUF_REGISTERED 0x10000000 -#define BUF_INUSE 0x01000000 -#define BUF_UNREGISTERED 0x00100000 - -// buffer type -#define REG_BUF 0x10000000 -#define RDMA_BUF 0x01000000 - -// -// IMM data -// -#define IMM_000 (0 << 32); -#define IMM_001 (1 << 32); -#define IMM_002 (2 << 32); -#define IMM_003 (3 << 32); -#define IMM_004 (4 << 32); -#define IMM_005 (5 << 32); -#define IMM_006 (6 << 32); -#define IMM_007 (7 << 32); -#define IMM_008 (8 << 32); -#define IMM_009 (9 << 32); -#define IMM_010 (10 << 32); -#define IMM_011 (11 << 32); -#define IMM_012 (12 << 32); -#define IMM_013 (13 << 32); -#define IMM_014 (14 << 32); -#define IMM_015 (15 << 32); -#define IMM_016 (16 << 32); -#define IMM_017 (17 << 32); -#define IMM_018 (18 << 32); -#define IMM_019 (19 << 32); -#define IMM_020 (20 << 32); -#define IMM_021 (21 << 32); -#define IMM_022 (22 << 32); -#define IMM_023 (23 << 32); -#define IMM_024 (24 << 32); -#define IMM_025 (25 << 32); -#define IMM_026 (26 << 32); -#define IMM_027 (27 << 32); -#define IMM_028 (28 << 32); -#define IMM_029 (29 << 32); -#define IMM_030 (30 << 32); -#define IMM_031 (31 << 32); - - - -typedef struct Memory_buffer_info{ - u_int32_t buf_size; - VAPI_virt_addr_t buf_addr; - char *bufptr; - VAPI_mrw_t mr; - VAPI_mr_hndl_t mr_hndl; - int status; - int ref_count; - int buf_type; - VAPI_virt_addr_t raddr; - VAPI_rkey_t rkey; - VAPI_lkey_t lkey; -} Memory_buffer_info; - -typedef struct RDMA_Info_Exchange { - int opcode; - int buf_length; - VAPI_mrw_t recv_rdma_mr; - VAPI_mr_hndl_t recv_rdma_mr_hndl; - VAPI_mrw_t send_rdma_mr; - VAPI_mr_hndl_t send_rdma_mr_hndl; - VAPI_virt_addr_t raddr; - VAPI_rkey_t rkey; - int flag; -} RDMA_Info_Exchange; - -// opcode for Rdma info exchange RTS/CTS -#define Ready_To_send 0x10000000 -#define Clear_To_send 0x01000000 - -#define RDMA_RTS_ID 5555 -#define RDMA_CTS_ID 7777 -#define RDMA_OP_ID 9999 -#define SEND_RECV_TEST_ID 2222 -#define SEND_RECV_TEST_BUF_ID 0 - -#define TEST_SEND_MESSAGE 0x00000001 -#define TEST_RECV_MESSAGE 0x00000002 - - -#define RTS_CTS_TIMEOUT 50 -#define RECEIVING_THREAD_TIMEOUT 50 -#define WAIT_FOR_SEND_BUF_TIMEOUT 50 - -#define IBNAL_DEBUG_LEVEL_1 0XFFFFFFFF -#define IBNAL_DEBUG_LEVEL_2 D_PORTALS | D_NET | D_WARNING | D_MALLOC | \ - D_ERROR | D_OTHER | D_TRACE | D_INFO - - -// flag for Rdma info exhange -#define RDMA_BUFFER_RESERVED 0x10000000 -#define RDMA_BUFFER_UNAVAILABLE 0x01000000 - - -// receiving data structure -typedef struct { - ptl_hdr_t *krx_buffer; // pointer to receiving buffer - unsigned long krx_len; // length of buffer - unsigned int krx_size; // - unsigned int krx_priority; // do we need this - struct list_head krx_item; -} kibnal_rx_t; - -// transmitting data structure -typedef struct { - nal_cb_t *ktx_nal; - void *ktx_private; - lib_msg_t *ktx_cookie; - char *ktx_buffer; - size_t ktx_len; - unsigned long ktx_size; - int ktx_ndx; - unsigned int ktx_priority; - unsigned int ktx_tgt_node; - unsigned int ktx_tgt_port_id; -} kibnal_tx_t; - - -typedef struct { - char kib_init; - char kib_shuttingdown; - IB_port_t port_num; // IB port information - struct list_head kib_list; - ptl_nid_t kib_nid; - nal_t *kib_nal; - nal_cb_t *kib_cb; - struct kib_trans *kib_trans; // do I need this - struct tq_struct kib_ready_tq; - spinlock_t kib_dispatch_lock; -} kibnal_data_t; - - -// -// A data structure for keeping the HCA information in system -// information related to HCA and hca_handle will be kept here -// -typedef struct HCA_Info -{ - VAPI_hca_hndl_t hca_hndl; // HCA handle - VAPI_pd_hndl_t pd_hndl; // protection domain - IB_port_t port; // port number - int num_qp; // number of qp used - QP_info *qp_ptr[NUM_QPS]; // point to QP_list - int num_cq; // number of cq used - VAPI_cq_hndl_t cq_hndl; - VAPI_cq_hndl_t sq_cq_hndl; - VAPI_cq_hndl_t rq_cq_hndl; - IB_lid_t dlid; - IB_lid_t slid; - kibnal_data_t *kib_data; // for PORTALS operations -} HCA_info; - - - - -// Remote HCA Info information -typedef struct Remote_HCA_Info { - unsigned long opcode; - unsigned long length; - IB_lid_t dlid[NUM_QPS]; - VAPI_qp_num_t rqp_num[NUM_QPS]; -} Remote_QP_Info; - -typedef struct Bucket_index{ - int start; - int end; -} Bucket_index; - -// functional prototypes -// infiniband initialization -int kib_init(kibnal_data_t *); - -// receiving thread -void kibnal_recv_thread(HCA_info *); -void recv_thread(HCA_info *); - -// forward data packet -void kibnal_fwd_packet (void *, kpr_fwd_desc_t *); - -// global data structures -extern kibnal_data_t kibnal_data; -extern ptl_handle_ni_t kibnal_ni; -extern nal_t kibnal_api; -extern nal_cb_t kibnal_lib; -extern QP_info QP_list[]; -extern QP_info CQ_list[]; -extern HCA_info Hca_data; -extern VAPI_hca_hndl_t Hca_hndl; -extern VAPI_pd_hndl_t Pd_hndl; -extern VAPI_hca_vendor_t Hca_vendor; -extern VAPI_hca_cap_t Hca_cap; -extern VAPI_hca_port_t Hca_port_1_props; -extern VAPI_hca_port_t Hca_port_2_props; -extern VAPI_hca_attr_t Hca_attr; -extern VAPI_hca_attr_mask_t Hca_attr_mask; -extern VAPI_cq_hndl_t Cq_SQ_hndl; -extern VAPI_cq_hndl_t Cq_RQ_hndl; -extern VAPI_cq_hndl_t Cq_hndl; -extern unsigned long User_Defined_Small_Msg_Size; -extern Remote_QP_Info L_HCA_RDMA_Info; -extern Remote_QP_Info R_HCA_RDMA_Info; -extern unsigned int Num_posted_recv_buf; -extern int R_RDMA_DATA_ARRIVED; -extern Memory_buffer_info MRbuf_list[]; -extern Memory_buffer_info MSbuf_list[]; -extern Bucket_index Bucket[]; -extern RDMA_Info_Exchange Rdma_info; -extern int Cts_Message_arrived; -extern RDMA_Info_Exchange Local_rdma_info; -extern spinlock_t MSB_mutex[]; - - - -// kernel NAL API function prototype -int kibnal_forward(nal_t *,int ,void *,size_t ,void *,size_t ); -void kibnal_lock(nal_t *, unsigned long *); -void kibnal_unlock(nal_t *, unsigned long *); -int kibnal_shutdown(nal_t *, int ); -void kibnal_yield( nal_t * ); -void kibnal_invalidate(nal_cb_t *,void *,size_t ,void *); -int kibnal_validate(nal_cb_t *,void *,size_t ,void **); - - - -nal_t *kibnal_init(int , ptl_pt_index_t , ptl_ac_index_t , ptl_pid_t ); -void __exit kibnal_finalize(void ); -VAPI_ret_t create_qp(QP_info *, int ); -VAPI_ret_t init_qp(QP_info *, int ); -VAPI_ret_t IB_Open_HCA(kibnal_data_t *); -VAPI_ret_t IB_Close_HCA(void ); -VAPI_ret_t createMemRegion(VAPI_hca_hndl_t, VAPI_pd_hndl_t); -VAPI_ret_t deleteMemRegion(QP_info *, int ); - -void ibnal_send_recv_self_testing(int *); - -int __init kibnal_initialize(void); - - - -/* CB NAL functions */ -int kibnal_send(nal_cb_t *, - void *, - lib_msg_t *, - ptl_hdr_t *, - int, - ptl_nid_t, - ptl_pid_t, - unsigned int, - ptl_kiov_t *, - size_t); - -int kibnal_send_pages(nal_cb_t *, - void *, - lib_msg_t *, - ptl_hdr_t *, - int, - ptl_nid_t, - ptl_pid_t, - unsigned int, - ptl_kiov_t *, - size_t); -int kibnal_recv(nal_cb_t *, void *, lib_msg_t *, - unsigned int, struct iovec *, size_t, size_t); -int kibnal_recv_pages(nal_cb_t *, void *, lib_msg_t *, - unsigned int, ptl_kiov_t *, size_t, size_t); -int kibnal_read(nal_cb_t *,void *,void *,user_ptr ,size_t ); -int kibnal_write(nal_cb_t *,void *,user_ptr ,void *,size_t ); -int kibnal_callback(nal_cb_t * , void *, lib_eq_t *, ptl_event_t *); -void *kibnal_malloc(nal_cb_t *,size_t ); -void kibnal_free(nal_cb_t *,void *,size_t ); -int kibnal_map(nal_cb_t *, unsigned int , struct iovec *, void **); -void kibnal_unmap(nal_cb_t *, unsigned int , struct iovec *, void **); -int kibnal_map_pages(nal_cb_t *, unsigned int , ptl_kiov_t *, void **); -void kibnal_unmap_pages(nal_cb_t * , unsigned int , ptl_kiov_t *, void **); -void kibnal_printf(nal_cb_t *, const char *, ...); -void kibnal_cli(nal_cb_t *,unsigned long *); -void kibnal_sti(nal_cb_t *,unsigned long *); -int kibnal_dist(nal_cb_t *,ptl_nid_t ,unsigned long *); - -void kibnal_fwd_packet (void *, kpr_fwd_desc_t *); -void kibnal_rx(kibnal_data_t *, - VAPI_virt_addr_t , - u_int32_t, - u_int32_t, - unsigned int); - -int kibnal_end(kibnal_data_t *); - -void async_event_handler(VAPI_hca_hndl_t , VAPI_event_record_t *,void *); - -void CQE_event_handler(VAPI_hca_hndl_t ,VAPI_cq_hndl_t , void *); - - -VAPI_ret_t Send_Small_Msg(char *, int ); -VAPI_ret_t Send_Large_Msg(char *, int ); - -VAPI_ret_t repost_recv_buf(QP_info *, VAPI_wr_id_t ); -int post_recv_bufs(VAPI_wr_id_t ); -int server_listen_thread(void *); -VAPI_wr_id_t RTS_handshaking_protocol(int ); -VAPI_wr_id_t CTS_handshaking_protocol(RDMA_Info_Exchange *); - -VAPI_ret_t createMemRegion_RDMA(VAPI_hca_hndl_t , - VAPI_pd_hndl_t , - char *, - int , - VAPI_mr_hndl_t *, - VAPI_mrw_t *); - - -VAPI_ret_t IB_Set_Event_Handler(HCA_info , kibnal_data_t *); - -VAPI_ret_t IB_Set_Async_Event_Handler(HCA_info ,kibnal_data_t *); - -VAPI_wr_id_t find_available_buf(int ); -VAPI_wr_id_t search_send_buf(int ); -VAPI_wr_id_t find_filler_list(int ,int ); -int insert_MRbuf_list(int ); - - -#endif /* _IBNAL_H */ diff --git a/lnet/klnds/iblnd/ibnal_cb.c b/lnet/klnds/iblnd/ibnal_cb.c deleted file mode 100644 index f359441826..0000000000 --- a/lnet/klnds/iblnd/ibnal_cb.c +++ /dev/null @@ -1,1302 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Based on ksocknal and qswnal - * - * Author: Hsing-bung Chen <hbchen@lanl.gov> - * - * This file is part of Portals, http://www.sf.net/projects/sandiaportals/ - * - * Portals 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. - * - * Portals is distributed in the hope that it will be 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 Portals; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#include "ibnal.h" - - - - -RDMA_Info_Exchange Rdma_nfo; -int Cts_Msg_Arrived = NO; - - -/* - * LIB functions follow - */ - -// -// read -// copy a block of data from scr_addr to dst_addr -// it all happens in kernel space - dst_addr and src_addr -// -// original definition is to read a block od data from a -// specified user address -// -// cb_read - -int kibnal_read (nal_cb_t *nal, - void *private, - void *dst_addr, - user_ptr src_addr, - size_t len) -{ - CDEBUG(D_NET, "kibnal_read: 0x%Lx: reading %ld bytes from %p -> %p\n", - nal->ni.nid, (long)len, src_addr, dst_addr ); - - memcpy( dst_addr, src_addr, len ); - - return 0; -} - -// -// it seems that read and write are doing the same thing -// because they all happen in kernel space -// why do we need two functions like read and write -// to make PORTALS API compatable -// - -// -// write -// copy a block of data from scr_addr to dst_addr -// it all happens in kernel space - dst_addr and src_addr -// -// original definition is to write a block od data to a -// specified user address -// -// cb_write - -int kibnal_write(nal_cb_t *nal, - void *private, - user_ptr dst_addr, - void *src_addr, - size_t len) -{ - CDEBUG(D_NET, "kibnal_write: 0x%Lx: writing %ld bytes from %p -> %p\n", - nal->ni.nid, (long)len, src_addr, dst_addr ); - - - memcpy( dst_addr, src_addr, len ); - - return 0; -} - -// -// malloc -// -// either vmalloc or kmalloc is used -// dynamically allocate a block of memory based on the size of buffer -// -// cb_malloc - -void * kibnal_malloc(nal_cb_t *nal, size_t length) -{ - void *buffer; - - // PORTAL_ALLOC will do the job - // allocate a buffer with size "length" - PORTAL_ALLOC(buffer, length); - - return buffer; -} - -// -// free -// release a dynamically allocated memory pointed by buffer pointer -// -// cb_free - -void kibnal_free(nal_cb_t *nal, void *buffer, size_t length) -{ - // - // release allocated buffer to system - // - PORTAL_FREE(buffer, length); -} - -// -// invalidate -// because evernthing is in kernel space (LUSTRE) -// there is no need to mark a piece of user memory as no longer in use by -// the system -// -// cb_invalidate - -void kibnal_invalidate(nal_cb_t *nal, - void *base, - size_t extent, - void *addrkey) -{ - // do nothing - CDEBUG(D_NET, "kibnal_invalidate: 0x%Lx: invalidating %p : %d\n", - nal->ni.nid, base, extent); - return; -} - - -// -// validate -// because everything is in kernel space (LUSTRE) -// there is no need to mark a piece of user memory in use by -// the system -// -// cb_validate - -int kibnal_validate(nal_cb_t *nal, - void *base, - size_t extent, - void **addrkey) -{ - // do nothing - CDEBUG(D_NET, "kibnal_validate: 0x%Lx: validating %p : %d\n", - nal->ni.nid, base, extent); - - return 0; -} - - -// -// log messages from kernel space -// printk() is used -// -// cb_printf - -void kibnal_printf(nal_cb_t *nal, const char *fmt, ...) -{ - va_list ap; - char msg[256]; - - if (portal_debug & D_NET) { - va_start( ap, fmt ); - vsnprintf( msg, sizeof(msg), fmt, ap ); - va_end( ap ); - - printk("CPUId: %d %s",smp_processor_id(), msg); - } -} - -// -// clear interrupt -// use spin_lock to lock protected area such as MD, ME... -// so a process can enter a protected area and do some works -// this won't physicall disable interrup but use a software -// spin-lock to control some protected areas -// -// cb_cli - -void kibnal_cli(nal_cb_t *nal, unsigned long *flags) -{ - kibnal_data_t *data= nal->nal_data; - - CDEBUG(D_NET, "kibnal_cli \n"); - - spin_lock_irqsave(&data->kib_dispatch_lock,*flags); - -} - -// -// set interrupt -// use spin_lock to unlock protected area such as MD, ME... -// this won't physicall enable interrup but use a software -// spin-lock to control some protected areas -// -// cb_sti - -void kibnal_sti(nal_cb_t *nal, unsigned long *flags) -{ - kibnal_data_t *data= nal->nal_data; - - CDEBUG(D_NET, "kibnal_sti \n"); - - spin_unlock_irqrestore(&data->kib_dispatch_lock,*flags); -} - -// -// A new event has just been created -// -void kibnal_callback(nal_cb_t *nal, void *private, lib_eq_t *eq, ptl_event_t *ev) -{ - /* holding kib_dispatch_lock */ - - if (eq->event_callback != NULL) - eq->event_callback(ev); - - /* We will wake theads sleeping in yield() here, AFTER the - * callback, when we implement blocking yield */ -} - -// -// nic distance -// -// network distance doesn't mean much for this nal -// here we only indicate -// 0 - operation is happened on the same node -// 1 - operation is happened on different nodes -// router will handle the data routing -// -// cb_dist - -int kibnal_dist(nal_cb_t *nal, ptl_nid_t nid, unsigned long *dist) -{ - CDEBUG(D_NET, "kibnal_dist \n"); - - if ( nal->ni.nid == nid ) { - *dist = 0; - } - else { - *dist = 1; - } - - return 0; // always retrun 0 -} - - -// -// This is the cb_send() on IB based interconnect system -// prepare a data package and use VAPI_post_sr() to send it -// down-link out-going message -// - - -int -kibnal_send(nal_cb_t *nal, - void *private, - lib_msg_t *cookie, - ptl_hdr_t *hdr, - int type, - ptl_nid_t nid, - ptl_pid_t pid, - unsigned int niov, - ptl_kiov_t *iov, - size_t len) -{ - - int rc=0; - void *buf = NULL; - unsigned long buf_length = sizeof(ptl_hdr_t) + len; - int expected_buf_size = 0; - VAPI_ret_t vstat; - - PROF_START(kibnal_send); // time stamp send start - - CDEBUG(D_NET,"kibnal_send: sending %d bytes from %p to nid: 0x%Lx pid %d\n", - buf_length, iov, nid, HCA_PORT_1); - - - // do I need to check the gateway information - // do I have problem to send direct - // do I have to forward a data packet to gateway - // - // The current connection is back-to-back - // I always know that data will be send from one-side to - // the other side - // - - // - // check data buffer size - // - // MSG_SIZE_SMALL - // regular post send - // - // MSG_SIZE_LARGE - // rdma write - - if(buf_length <= SMALL_MSG_SIZE) { - expected_buf_size = MSG_SIZE_SMALL; - } - else { - if(buf_length > MAX_MSG_SIZE) { - CERROR("kibnal_send:request exceeds Transmit data size (%d).\n", - MAX_MSG_SIZE); - rc = PTL_FAIL; - return rc; - } - else { - expected_buf_size = MSG_SIZE_LARGE; // this is a large data package - } - } - - // prepare data packet for send operation - // - // allocate a data buffer "buf" with size of buf_len(header + payload) - // --------------- - // buf | hdr | size = sizeof(ptl_hdr_t) - // -------------- - // |payload data | size = len - // --------------- - - // copy header to buf - memcpy(buf, hdr, sizeof(ptl_hdr_t)); - - // copy payload data from iov to buf - // use portals library function lib_copy_iov2buf() - - if (len != 0) - lib_copy_iov2buf(((char *)buf) + sizeof (ptl_hdr_t), - niov, - iov, - len); - - // buf is ready to do a post send - // the send method is base on the buf_size - - CDEBUG(D_NET,"ib_send %d bytes (size %d) from %p to nid: 0x%Lx " - " port %d\n", buf_length, expected_buf_size, iov, nid, HCA_PORT_1); - - switch(expected_buf_size) { - case MSG_SIZE_SMALL: - // send small message - if((vstat = Send_Small_Msg(buf, buf_length)) != VAPI_OK){ - CERROR("Send_Small_Msg() is failed\n"); - } - break; - - case MSG_SIZE_LARGE: - // send small message - if((vstat = Send_Large_Msg(buf, buf_length)) != VAPI_OK){ - CERROR("Send_Large_Msg() is failed\n"); - } - break; - - default: - CERROR("Unknown message size %d\n", expected_buf_size); - break; - } - - PROF_FINISH(kibnal_send); // time stapm of send operation - - rc = PTL_OK; - - return rc; -} - -// -// kibnal_send_pages -// -// no support -// -// do you need this -// -int kibnal_send_pages(nal_cb_t * nal, - void *private, - lib_msg_t * cookie, - ptl_hdr_t * hdr, - int type, - ptl_nid_t nid, - ptl_pid_t pid, - unsigned int niov, - ptl_kiov_t *iov, - size_t mlen) -{ - int rc = PTL_FAIL; - - CDEBUG(D_NET, "kibnal_send_pages\n"); - - // do nothing now for Infiniband - - return rc; -} - - - - - -// -// kibnal_fwd_packet -// -// no support -// -// do you need this -// -void kibnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) -{ - CDEBUG(D_NET, "forwarding not implemented\n"); - return; - -} - -// -// kibnal_callback -// -// no support -// -// do you need this -// -void kibnal_callback(nal_cb_t * nal, - void *private, - lib_eq_t *eq, - ptl_event_t *ev) -{ - CDEBUG(D_NET, "callback not implemented\n"); - return PTL_OK; -} - - -/* Process a received portals packet */ -// -// conver receiving data in to PORTALS header -// - -void kibnal_rx(kibnal_data_t *kib, - VAPI_virt_addr_t buffer_addr, - u_int32_t buffer_len, - u_int32_t buffer_size, - unsigned int priority) -{ - ptl_hdr_t *hdr = (ptl_hdr_t *) buffer_addr; // case to ptl header format - kibnal_rx_t krx; - - CDEBUG(D_NET,"kibnal_rx: buf %p, len %ld\n", buffer_addr, buffer_len); - - if ( buffer_len < sizeof( ptl_hdr_t ) ) { - /* XXX what's this for? */ - if (kib->kib_shuttingdown) - return; - CERROR("kibnal_rx: did not receive complete portal header, " - "len= %ld", buffer_len); - - return; - } - - // typedef struct { - // char *krx_buffer; // pointer to receiving buffer - // unsigned long krx_len; // length of buffer - // unsigned int krx_size; // - // unsigned int krx_priority; // do we need this - // struct list_head krx_item; - // } kibnal_rx_t; - // - krx.krx_buffer = hdr; - krx.krx_len = buffer_len; - krx.krx_size = buffer_size; - krx.krx_priority = priority; - - if ( hdr->dest_nid == kibnal_lib.ni.nid ) { - // this is my data - PROF_START(lib_parse); - - lib_parse(&kibnal_lib, (ptl_hdr_t *)krx.krx_buffer, &krx); - - PROF_FINISH(lib_parse); - } else { - /* forward to gateway */ - // Do we expect this happened ? - // - CERROR("kibnal_rx: forwarding not implemented yet"); - } - - return; -} - - - - -// -// kibnal_recv_pages -// -// no support -// -// do you need this -// -int -kibnal_recv_pages(nal_cb_t * nal, - void *private, - lib_msg_t * cookie, - unsigned int niov, - ptl_kiov_t *iov, - size_t mlen, - size_t rlen) -{ - - CDEBUG(D_NET, "recv_pages not implemented\n"); - return PTL_FAIL; - -} - - -int -kibnal_recv(nal_cb_t *nal, - void *private, - lib_msg_t *cookie, - unsigned int niov, - struct iovec *iov, - size_t mlen, - size_t rlen) -{ - kibnal_rx_t *krx = private; - - CDEBUG(D_NET,"kibnal_recv: mlen=%d, rlen=%d\n", mlen, rlen); - - /* What was actually received must be >= what sender claims to - * have sent. */ - LASSERT (mlen <= rlen); - - if (krx->krx_len < sizeof (ptl_hdr_t) + rlen) - return (PTL_FAIL); - - PROF_START(kibnal_recv); - - if(mlen != 0) { - PROF_START(memcpy); - lib_copy_buf2iov (niov, iov, krx->krx_buffer + - sizeof (ptl_hdr_t), mlen); - PROF_FINISH(memcpy); - } - - PROF_START(lib_finalize); - - lib_finalize(nal, private, cookie, PTL_OK); - - PROF_FINISH(lib_finalize); - PROF_FINISH(kibnal_recv); - - return PTL_OK; -} - -// -// kibnal_map -// no support -// do you need this -// -int kibnal_map(nal_cb_t * nal, - unsigned int niov, - struct iovec *iov, - void **addrkey) -{ - CDEBUG(D_NET, "map not implemented\n"); - return PTL_OK; -} - - - -// -// kibnal_unmap -// -// no support -// -// do you need this -// -void kibnal_unmap(nal_cb_t * nal, - unsigned int niov, - struct iovec *iov, - void **addrkey) -{ - CDEBUG(D_NET, "unmap not implemented\n"); - return; -} - - - -// -// kibnal_map_pages -// no support -// do you need this -/* as (un)map, but with a set of page fragments */ -int kibnal_map_pages(nal_cb_t * nal, - unsigned int niov, - ptl_kiov_t *iov, - void **addrkey) -{ - CDEBUG(D_NET, "map_pages not implemented\n"); - return PTL_OK; -} - - - -// -// kibnal_unmap_pages -// -// no support -// -// do you need this -// -void kibnal_unmap_pages(nal_cb_t * nal, - unsigned int niov, - ptl_kiov_t *iov, - void **addrkey) -{ - CDEBUG(D_NET, "unmap_pages not implemented\n"); - return ; -} - - -int kibnal_end(kibnal_data_t *kib) -{ - - /* wait for sends to finish ? */ - /* remove receive buffers */ - /* shutdown receive thread */ - - CDEBUG(D_NET, "kibnal_end\n"); - IB_Close_HCA(); - - return 0; -} - - -// -// -// asynchronous event handler: response to some unexpetced operation errors -// -// void async_event_handler(VAPI_hca_hndl_t hca_hndl, -// VAPI_event_record_t *event_record_p, -// void* private_data) -// the HCA drive will prepare evetn_record_p -// -// this handler is registered with VAPI_set_async_event_handler() -// VAPI_set_async_event_handler() is issued when an HCA is created -// -// -void async_event_handler(VAPI_hca_hndl_t hca_hndl, - VAPI_event_record_t *event_record_p, - void* private_data) -{ - // - // * event_record_p is prepared by the system when an async - // event happened - // * what to do with private_data - // * do we expect more async events happened if so what are they - // - // only log ERROR message now - - switch (event_record_p->type) { - case VAPI_PORT_ERROR: - printk("Got PORT_ERROR event. port number=%d\n", - event_record_p->modifier.port_num); - break; - case VAPI_PORT_ACTIVE: - printk("Got PORT_ACTIVE event. port number=%d\n", - event_record_p->modifier.port_num); - break; - case VAPI_QP_PATH_MIGRATED: /*QP*/ - printk("Got P_PATH_MIGRATED event. qp_hndl=%lu\n", - event_record_p->modifier.qp_hndl); - break; - case VAPI_EEC_PATH_MIGRATED: /*EEC*/ - printk("Got EEC_PATH_MIGRATED event. eec_hndl=%d\n", - event_record_p->modifier.eec_hndl); - break; - case VAPI_QP_COMM_ESTABLISHED: /*QP*/ - printk("Got QP_COMM_ESTABLISHED event. qp_hndl=%lu\n", - event_record_p->modifier.qp_hndl); - break; - case VAPI_EEC_COMM_ESTABLISHED: /*EEC*/ - printk("Got EEC_COMM_ESTABLISHED event. eec_hndl=%d\n", - event_record_p->modifier.eec_hndl); - break; - case VAPI_SEND_QUEUE_DRAINED: /*QP*/ - printk("Got SEND_QUEUE_DRAINED event. qp_hndl=%lu\n", - event_record_p->modifier.qp_hndl); - break; - case VAPI_CQ_ERROR: /*CQ*/ - printk("Got CQ_ERROR event. cq_hndl=%lu\n", - event_record_p->modifier.cq_hndl); - break; - case VAPI_LOCAL_WQ_INV_REQUEST_ERROR: /*QP*/ - printk("Got LOCAL_WQ_INV_REQUEST_ERROR event. qp_hndl=%lu\n", - event_record_p->modifier.qp_hndl); - break; - case VAPI_LOCAL_WQ_ACCESS_VIOL_ERROR: /*QP*/ - printk("Got LOCAL_WQ_ACCESS_VIOL_ERROR event. qp_hndl=%lu\n", - event_record_p->modifier.qp_hndl); - break; - case VAPI_LOCAL_WQ_CATASTROPHIC_ERROR: /*QP*/ - printk("Got LOCAL_WQ_CATASTROPHIC_ERROR event. qp_hndl=%lu\n", - event_record_p->modifier.qp_hndl); - break; - case VAPI_PATH_MIG_REQ_ERROR: /*QP*/ - printk("Got PATH_MIG_REQ_ERROR event. qp_hndl=%lu\n", - event_record_p->modifier.qp_hndl); - break; - case VAPI_LOCAL_CATASTROPHIC_ERROR: /*none*/ - printk("Got LOCAL_CATASTROPHIC_ERROR event. \n"); - break; - default: - printk(":got non-valid event type=%d. IGNORING\n", - event_record_p->type); - } - -} - - - - -VAPI_wr_id_t -search_send_buf(int buf_length) -{ - VAPI_wr_id_t send_id = -1; - u_int32_t i; - int flag = NO; - int loop_count = 0; - - CDEBUG(D_NET, "search_send_buf \n"); - - while((flag == NO) && (loop_count < MAX_LOOP_COUNT)) { - for(i=0; i < NUM_ENTRY; i++) { - // problem about using spinlock - spin_lock(&MSB_mutex[i]); - if(MSbuf_list[i].status == BUF_REGISTERED) { - MSbuf_list[i].status = BUF_INUSE;// make send buf as inuse - flag = YES; - spin_unlock(&MSB_mutex[i]); - break; - } - else - spin_unlock(&MSB_mutex[i]); - } - - loop_count++; - schedule_timeout(200); // wait for a while - } - - if(flag == NO) { - CDEBUG(D_NET, "search_send_buf: could not locate an entry in MSbuf_list\n"); - } - - send_id = (VAPI_wr_id_t ) i; - - return send_id; -} - - - -VAPI_wr_id_t -search_RDMA_recv_buf(int buf_length) -{ - VAPI_wr_id_t recv_id = -1; - u_int32_t i; - int flag = NO; - int loop_count = 0; - - CDEBUG(D_NET, "search_RDMA_recv_buf\n"); - - while((flag == NO) && (loop_count < MAX_LOOP_COUNT)) { - - for(i=NUM_ENTRY; i < NUM_MBUF; i++) { - - spin_lock(&MSB_mutex[i]); - - if((MRbuf_list[i].status == BUF_REGISTERED) && - (MRbuf_list[i].buf_size >= buf_length)) { - MSbuf_list[i].status = BUF_INUSE;// make send buf as inuse - flag = YES; - spin_unlock(&MSB_mutex[i]); - break; - } - else - spin_unlock(&MSB_mutex[i]); - } - - loop_count++; - - schedule_timeout(200); // wait for a while - } - - if(flag == NO) { - CERROR("search_RDMA_recv_buf: could not locate an entry in MBbuf_list\n"); - } - - recv_id = (VAPI_wr_id_t ) i; - - return recv_id; - -} - - - - - - - -VAPI_ret_t Send_Small_Msg(char *buf, int buf_length) -{ - VAPI_ret_t vstat; - VAPI_sr_desc_t sr_desc; - VAPI_sg_lst_entry_t sr_sg; - QP_info *qp; - VAPI_wr_id_t send_id; - - CDEBUG(D_NET, "Send_Small_Msg\n"); - - send_id = search_send_buf(buf_length); - - if(send_id < 0){ - CERROR("Send_Small_Msg: Can not find a QP \n"); - return(~VAPI_OK); - } - - qp = &QP_list[(int) send_id]; - - // find a suitable/registered send_buf from MSbuf_list - CDEBUG(D_NET, "Send_Small_Msg: current send id %d \n", send_id); - - sr_desc.opcode = VAPI_SEND; - sr_desc.comp_type = VAPI_SIGNALED; - sr_desc.id = send_id; - - - // scatter and gather info - sr_sg.len = buf_length; - sr_sg.lkey = MSbuf_list[send_id].mr.l_key; // use send MR - - sr_sg.addr = (VAPI_virt_addr_t)(MT_virt_addr_t) MSbuf_list[send_id].buf_addr; - - // copy data to register send buffer - memcpy(&sr_sg.addr, buf, buf_length); - - sr_desc.sg_lst_p = &sr_sg; - sr_desc.sg_lst_len = 1; // only 1 entry is used - sr_desc.fence = TRUE; - sr_desc.set_se = FALSE; - - // call VAPI_post_sr to send out this data - vstat = VAPI_post_sr(qp->hca_hndl, qp->qp_hndl, &sr_desc); - - if (vstat != VAPI_OK) { - CERROR("VAPI_post_sr failed (%s).\n",VAPI_strerror(vstat)); - } - - CDEBUG(D_NET, "VAPI_post_sr success.\n"); - - return (vstat); - -} - - - - -VAPI_wr_id_t -RTS_handshaking_protocol(int buf_length) -{ - - VAPI_ret_t vstat; - VAPI_sr_desc_t sr_desc; - VAPI_sg_lst_entry_t sr_sg; - VAPI_wr_id_t send_id; - - RDMA_Info_Exchange rdma_info; - - rdma_info.opcode = Ready_To_send; - rdma_info.buf_length = buf_length; - rdma_info.raddr = (VAPI_virt_addr_t) 0; - rdma_info.rkey = (VAPI_rkey_t) 0 ; - - QP_info *qp; - - CDEBUG(D_NET, "RTS_handshaking_protocol\n"); - - // find a suitable/registered send_buf from MSbuf_list - send_id = search_send_buf(sizeof(RDMA_Info_Exchange)); - - qp = &QP_list[(int) send_id]; - - CDEBUG(D_NET, "RTS_CTS: current send id %d \n", send_id); - sr_desc.opcode = VAPI_SEND; - sr_desc.comp_type = VAPI_SIGNALED; - sr_desc.id = send_id + RDMA_RTS_ID;// this RTS mesage ID - - // scatter and gather info - sr_sg.len = sizeof(RDMA_Info_Exchange); - sr_sg.lkey = MSbuf_list[send_id].mr.l_key; // use send MR - sr_sg.addr = (VAPI_virt_addr_t)(MT_virt_addr_t) MSbuf_list[send_id].buf_addr; - - // copy data to register send buffer - memcpy(&sr_sg.addr, &rdma_info, sizeof(RDMA_Info_Exchange)); - - sr_desc.sg_lst_p = &sr_sg; - sr_desc.sg_lst_len = 1; // only 1 entry is used - sr_desc.fence = TRUE; - sr_desc.set_se = FALSE; - - // call VAPI_post_sr to send out this RTS message data - vstat = VAPI_post_sr(qp->hca_hndl, qp->qp_hndl, &sr_desc); - - if (vstat != VAPI_OK) { - CERROR("RTS: VAPI_post_sr failed (%s).\n",VAPI_strerror_sym(vstat)); - } - - return send_id; - -} - - - -// create local receiving Memory Region for a HCA -VAPI_ret_t -createMemRegion_RDMA(VAPI_hca_hndl_t hca_hndl, - VAPI_pd_hndl_t pd_hndl, - char *bufptr, - int buf_length, - VAPI_mr_hndl_t *rep_mr_hndl, - VAPI_mrw_t *rep_mr) -{ - VAPI_ret_t vstat; - VAPI_mrw_t mrw; - - CDEBUG(D_NET, "createMemRegion_RDMA\n"); - - // memory region address and size of memory region - // allocate a block of memory for this HCA - // RDMA data buffer - - - if(bufptr == NULL) { - // need to allcate a local buffer to receive data from a - // remore VAPI_RDMA_WRITE_IMM - PORTAL_ALLOC(bufptr, buf_length); - } - - if(bufptr == NULL) { - CDEBUG(D_MALLOC, "Failed to malloc a block of RDMA receiving memory, size %d\n", - buf_length); - return(VAPI_ENOMEM); - } - - /* Register RDAM data Memory region */ - CDEBUG(D_NET, "Register a RDMA data memory region\n"); - - mrw.type = VAPI_MR; - mrw.pd_hndl= pd_hndl; - mrw.start = (VAPI_virt_addr_t )(MT_virt_addr_t )bufptr; - mrw.size = buf_length; - mrw.acl = VAPI_EN_LOCAL_WRITE | - VAPI_EN_REMOTE_WRITE | - VAPI_EN_REMOTE_READ; - - // register send memory region - vstat = VAPI_register_mr(hca_hndl, - &mrw, - rep_mr_hndl, - rep_mr); - - // this memory region is going to be reused until deregister is called - if (vstat != VAPI_OK) { - CERROR("Failed registering a mem region Addr=%p, Len=%d. %s\n", - bufptr, buf_length, VAPI_strerror(vstat)); - } - - return(vstat); - -} - - - -RDMA_Info_Exchange Local_rdma_info; - -int insert_MRbuf_list(int buf_lenght) -{ - int recv_id = NUM_ENTRY; - - CDEBUG(D_NET, "insert_MRbuf_list\n"); - - for(recv_id= NUM_ENTRY; recv_id < NUM_MBUF; recv_id++){ - if(BUF_UNREGISTERED == MRbuf_list[recv_id].status) { - MRbuf_list[recv_id].status = BUF_UNREGISTERED; - MRbuf_list[recv_id].buf_size = buf_lenght; - break; - } - } - - return recv_id; - -} - -VAPI_wr_id_t -CTS_handshaking_protocol(RDMA_Info_Exchange *rdma_info) -{ - - VAPI_ret_t vstat; - VAPI_sr_desc_t sr_desc; - VAPI_sg_lst_entry_t sr_sg; - QP_info *qp; - VAPI_wr_id_t send_id; - VAPI_mr_hndl_t rep_mr_hndl; - VAPI_mrw_t rep_mr; - int recv_id; - char *bufptr = NULL; - - // search MRbuf_list for an available entry that - // has registered data buffer with size equal to rdma_info->buf_lenght - - CDEBUG(D_NET, "CTS_handshaking_protocol\n"); - - // register memory buffer for RDAM operation - - vstat = createMemRegion_RDMA(Hca_hndl, - Pd_hndl, - bufptr, - rdma_info->buf_length, - &rep_mr_hndl, - &rep_mr); - - - Local_rdma_info.opcode = Clear_To_send; - Local_rdma_info.recv_rdma_mr = rep_mr; - Local_rdma_info.recv_rdma_mr_hndl = rep_mr_hndl; - - if (vstat != VAPI_OK) { - CERROR("CST_handshaking_protocol: Failed registering a mem region" - "Len=%d. %s\n", rdma_info->buf_length, VAPI_strerror(vstat)); - Local_rdma_info.flag = RDMA_BUFFER_UNAVAILABLE; - } - else { - // successfully allcate reserved RDAM data buffer - recv_id = insert_MRbuf_list(rdma_info->buf_length); - - if(recv_id >= NUM_ENTRY) { - MRbuf_list[recv_id].buf_addr = rep_mr.start; - MRbuf_list[recv_id].mr = rep_mr; - MRbuf_list[recv_id].mr_hndl = rep_mr_hndl; - MRbuf_list[recv_id].ref_count = 0; - Local_rdma_info.flag = RDMA_BUFFER_RESERVED; - Local_rdma_info.buf_length = rdma_info->buf_length; - Local_rdma_info.raddr = rep_mr.start; - Local_rdma_info.rkey = rep_mr.r_key; - } - else { - CERROR("Can not find an entry in MRbuf_list - how could this happen\n"); - } - } - - // find a suitable/registered send_buf from MSbuf_list - send_id = search_send_buf(sizeof(RDMA_Info_Exchange)); - CDEBUG(D_NET, "CTS: current send id %d \n", send_id); - sr_desc.opcode = VAPI_SEND; - sr_desc.comp_type = VAPI_SIGNALED; - sr_desc.id = send_id + RDMA_CTS_ID; // this CST message ID - - // scatter and gather info - sr_sg.len = sizeof(RDMA_Info_Exchange); - sr_sg.lkey = MSbuf_list[send_id].mr.l_key; // use send MR - sr_sg.addr = (VAPI_virt_addr_t)(MT_virt_addr_t) MSbuf_list[send_id].buf_addr; - - // copy data to register send buffer - memcpy(&sr_sg.addr, &Local_rdma_info, sizeof(RDMA_Info_Exchange)); - - sr_desc.sg_lst_p = &sr_sg; - sr_desc.sg_lst_len = 1; // only 1 entry is used - sr_desc.fence = TRUE; - sr_desc.set_se = FALSE; - - // call VAPI_post_sr to send out this RTS message data - vstat = VAPI_post_sr(qp->hca_hndl, qp->qp_hndl, &sr_desc); - - if (vstat != VAPI_OK) { - CERROR("CTS: VAPI_post_sr failed (%s).\n",VAPI_strerror(vstat)); - } - - -} - - - -VAPI_ret_t Send_Large_Msg(char *buf, int buf_length) -{ - VAPI_ret_t vstat; - VAPI_sr_desc_t sr_desc; - VAPI_sg_lst_entry_t sr_sg; - QP_info *qp; - VAPI_mrw_t rep_mr; - VAPI_mr_hndl_t rep_mr_hndl; - int send_id; - VAPI_imm_data_t imm_data = 0XAAAA5555; - - - CDEBUG(D_NET, "Send_Large_Msg: Enter\n"); - - // register this large buf - // don't need to copy this buf to send buffer - vstat = createMemRegion_RDMA(Hca_hndl, - Pd_hndl, - buf, - buf_length, - &rep_mr_hndl, - &rep_mr); - - if (vstat != VAPI_OK) { - CERROR("Send_Large_M\sg: createMemRegion_RDMAi() failed (%s).\n", - VAPI_strerror(vstat)); - } - - - Local_rdma_info.send_rdma_mr = rep_mr; - Local_rdma_info.send_rdma_mr_hndl = rep_mr_hndl; - - // - // Prepare descriptor for send queue - // - - // ask for a remote rdma buffer with size buf_lenght - send_id = RTS_handshaking_protocol(buf_length); - - qp = &QP_list[send_id]; - - // wait for CTS message receiving from remote node - while(1){ - if(YES == Cts_Message_arrived) { - // receive CST message from remote node - // Rdma_info is available for use - break; - } - schedule_timeout(RTS_CTS_TIMEOUT); - } - - sr_desc.id = send_id + RDMA_OP_ID; - sr_desc.opcode = VAPI_RDMA_WRITE_WITH_IMM; - sr_desc.comp_type = VAPI_SIGNALED; - - // scatter and gather info - sr_sg.len = buf_length; - - // rdma mr - sr_sg.lkey = rep_mr.l_key; - sr_sg.addr = (VAPI_virt_addr_t)(MT_virt_addr_t) rep_mr.start; - sr_desc.sg_lst_p = &sr_sg; - sr_desc.sg_lst_len = 1; // only 1 entry is used - - // immediate data - not used here - sr_desc.imm_data = imm_data; - sr_desc.fence = TRUE; - sr_desc.set_se = FALSE; - - // RDAM operation only - // raddr and rkey is receiving from remote node - sr_desc.remote_addr = Rdma_info.raddr; - sr_desc.r_key = Rdma_info.rkey; - - // call VAPI_post_sr to send out this data - vstat = VAPI_post_sr(qp->hca_hndl, qp->qp_hndl, &sr_desc); - - if (vstat != VAPI_OK) { - CERROR("VAPI_post_sr failed (%s).\n",VAPI_strerror_sym(vstat)); - } - -} - - - - - - -// -// repost_recv_buf -// post a used recv buffer back to recv WQE list -// wrq_id is used to indicate the starting position of recv-buffer -// -VAPI_ret_t -repost_recv_buf(QP_info *qp, - VAPI_wr_id_t wrq_id) -{ - VAPI_rr_desc_t rr; - VAPI_sg_lst_entry_t sg_entry; - VAPI_ret_t ret; - - CDEBUG(D_NET, "repost_recv_buf\n"); - - sg_entry.lkey = MRbuf_list[wrq_id].mr.l_key; - sg_entry.len = MRbuf_list[wrq_id].buf_size; - sg_entry.addr = (VAPI_virt_addr_t)(MT_virt_addr_t) MRbuf_list[wrq_id].buf_addr; - rr.opcode = VAPI_RECEIVE; - rr.comp_type = VAPI_SIGNALED; /* All with CQE (IB compliant) */ - rr.sg_lst_len = 1; /* single buffers */ - rr.sg_lst_p = &sg_entry; - rr.id = wrq_id; /* WQE id used is the index to buffers ptr array */ - - ret= VAPI_post_rr(qp->hca_hndl,qp->qp_hndl,&rr); - - if (ret != VAPI_OK){ - CERROR("failed reposting RQ WQE (%s) buffer \n",VAPI_strerror_sym(ret)); - return ret; - } - - CDEBUG(D_NET, "Successfully reposting an RQ WQE %d recv bufer \n", wrq_id); - - return ret ; -} - -// -// post_recv_bufs -// post "num_o_bufs" for receiving data -// each receiving buf (buffer starting address, size of buffer) -// each buffer is associated with an id -// -int -post_recv_bufs(VAPI_wr_id_t start_id) -{ - int i; - VAPI_rr_desc_t rr; - VAPI_sg_lst_entry_t sg_entry; - VAPI_ret_t ret; - - CDEBUG(D_NET, "post_recv_bufs\n"); - - for(i=0; i< NUM_ENTRY; i++) { - sg_entry.lkey = MRbuf_list[i].mr.l_key; - sg_entry.len = MRbuf_list[i].buf_size; - sg_entry.addr = (VAPI_virt_addr_t)(MT_virt_addr_t) MRbuf_list[i].buf_addr; - rr.opcode = VAPI_RECEIVE; - rr.comp_type = VAPI_SIGNALED; /* All with CQE (IB compliant) */ - rr.sg_lst_len = 1; /* single buffers */ - rr.sg_lst_p = &sg_entry; - rr.id = start_id+i; /* WQE id used is the index to buffers ptr array */ - - ret= VAPI_post_rr(QP_list[i].hca_hndl,QP_list[i].qp_hndl, &rr); - if (ret != VAPI_OK) { - CERROR("failed posting RQ WQE (%s)\n",VAPI_strerror_sym(ret)); - return i; - } - } - - return i; /* num of buffers posted */ -} - -int -post_RDMA_bufs(QP_info *qp, - void *buf_array, - unsigned int num_bufs, - unsigned int buf_size, - VAPI_wr_id_t start_id) -{ - - CDEBUG(D_NET, "post_RDMA_bufs \n"); - return YES; -} - - - -// -// LIB NAL -// assign function pointers to theirs corresponding entries -// - -nal_cb_t kibnal_lib = { - nal_data: &kibnal_data, /* NAL private data */ - cb_send: kibnal_send, - cb_send_pages: NULL, // not implemented - cb_recv: kibnal_recv, - cb_recv_pages: NULL, // not implemented - cb_read: kibnal_read, - cb_write: kibnal_write, - cb_callback: NULL, // not implemented - cb_malloc: kibnal_malloc, - cb_free: kibnal_free, - cb_map: NULL, // not implemented - cb_unmap: NULL, // not implemented - cb_map_pages: NULL, // not implemented - cb_unmap_pages: NULL, // not implemented - cb_printf: kibnal_printf, - cb_cli: kibnal_cli, - cb_sti: kibnal_sti, - cb_callback: kibnal_callback, - cb_dist: kibnal_dist // no used at this moment -}; diff --git a/lnet/klnds/iblnd/ibnal_send_recv_self_testing.c b/lnet/klnds/iblnd/ibnal_send_recv_self_testing.c deleted file mode 100644 index 82defdba87..0000000000 --- a/lnet/klnds/iblnd/ibnal_send_recv_self_testing.c +++ /dev/null @@ -1,116 +0,0 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * * - * * Based on ksocknal, qswnal, and gmnal - * * - * * Copyright (C) 2003 LANL - * * Author: HB Chen <hbchen@lanl.gov> - * * Los Alamos National Lab - * * - * * Portals 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. - * * - * * Portals is distributed in the hope that it will be 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 Portals; if not, write to the Free Software - * * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - * * - * */ - -#include "ibnal.h" - - - -VAPI_ret_t ibnal_send_recv_self_testing() -{ - VAPI_ret_t vstat; - VAPI_sr_desc_t sr_desc; - VAPI_sg_lst_entry_t sr_sg; - QP_info *qp; - VAPI_wr_id_t send_id; - int buf_id; - char sbuf[KB_32]; - char rbuf[KB_32]; - int i; - int buf_length = KB_32; - VAPI_wc_desc_t comp_desc; - int num_send = 1; - int loop_count = 0; - - - printk("ibnal_send_recv_self_testing\n"); - - memset(&sbuf, 'a', KB_32); - memset(&rbuf, ' ', KB_32); - - send_id = 2222; - buf_id = 0; - - qp = &QP_list[0]; - - sr_desc.opcode = VAPI_SEND; - sr_desc.comp_type = VAPI_SIGNALED; - - // scatter and gather info - sr_sg.len = KB_32; - sr_sg.lkey = MSbuf_list[buf_id].mr.l_key; // use send MR - sr_sg.addr = (VAPI_virt_addr_t)(MT_virt_addr_t) MSbuf_list[buf_id].buf_addr; - - // copy data to register send buffer - memcpy(&sr_sg.addr, &buf, buf_length); - - sr_desc.sg_lst_p = &sr_sg; - sr_desc.sg_lst_len = 1; // only 1 entry is used - sr_desc.fence = TRUE; - sr_desc.set_se = FALSE; - - - // call VAPI_post_sr to send out this data - vstat = VAPI_post_sr(qp->hca_hndl, qp->qp_hndl, &sr_desc); - - if (vstat != VAPI_OK) { - printk("VAPI_post_sr failed (%s).\n",VAPI_strerror(vstat)); - } - - printk("VAPI_post_sr success.\n"); - - // poll for completion - - while( loop_count < 100 ){ - vstat = VAPI_poll_cq(qp->hca_hndl, qp->cq_hndl, &comp_desc); - if( vstat == VAPI_OK ) { - if(comp_desc.opcode == VAPI_CQE_SQ_SEND_DATA ) { - /* SEND completion */ - printk("received SQ completion\n"); - } - else { - if(comp_desc.opcode == VAPI_CQE_RQ_SEND_DATA ) { - /* RECEIVE completion */ - printk("received RQ completion\n"); - memcpy(&rbuf, (char *) MRbuf_list[buf_id].buf_addar, KB_32); - - int n; - - n = memcmp($sbuf, &rbuf, KB_32); - printk("compare sbuf and rbuf n = %d\n", n); - - } - else { - printk("unexpected completion opcode %d \n", comp_desc.opcode); - } - } - } - - loop_count++; - schedule_timeout(500); - } - - printk("end of ibnal_self_send_recv_testing\n"); - - -} diff --git a/lnet/klnds/iblnd/uagent.c b/lnet/klnds/iblnd/uagent.c deleted file mode 100644 index d7e939ae97..0000000000 --- a/lnet/klnds/iblnd/uagent.c +++ /dev/null @@ -1,391 +0,0 @@ -#include <stdio.h> -#include <stdlib.h> -#include <pthread.h> - - -#include <linux/shm.h> -#include <linux/ipc.h> -#include <linux/stat.h> -#include <linux/types.h> - -#include <sys/socket.h> -#include <netinet/in.h> -#include <arpa/inet.h> -#include <unistd.h> - -// Infiniband VAPI/EVAPI header files Mellanox MT23108 VAPI -#include <vapi.h> -#include <vapi_types.h> -#include <vapi_common.h> -#include <evapi.h> - -// Remote HCA Info information - typedef struct Remote_HCA_Info { - unsigned long opcode; - unsigned long length; - IB_lid_t dlid[256]; - VAPI_qp_num_t rqp_num[256]; - VAPI_rkey_t rkey; // for remote RDAM request - unsigned long vaddr1; // virtual address fisrt 4 bytes - unsigned long vaddr2; // virtual address second 4 bytes - u_int32_t size; // size of RDMA memory buffer - char dest_ip[256]; //destination server IP address - } Remote_HCA_Info; - -#define SHARED_SEGMENT_SIZE 0x10000 // 16KB shared memory between U and K - -// some internals opcodes for IB operations used in IBNAL -#define SEND_QP_INFO 0X00000001 -#define RECV_QP_INFO 0X00000010 -#define DEFAULT_SOCKET_PORT 11211 -#define LISTEN_QUEUE_SIZE 2048 -#define DEST_IP "10.128.105.26" - -// server_thread -// + wait for an incoming connection from remote node -// + receive remote HCA's data -// -// -// -// -// -void *server_thread(void *vargp) -{ - Remote_HCA_Info *hca_data; - Remote_HCA_Info hca_data_buffer; - - int serverfd; - int infd; - struct hostent *hp; - struct sockaddr_in serveraddr; - struct sockaddr_in clientaddr; - int sin_size=sizeof(struct sockaddr_in); - int bytes_recv; - int i; - - - hca_data = (Remote_HCA_Info *) vargp; - - if((serverfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - printf("server_thread couldnot create a socket \n"); - pthread_exit((void *) 0); - } - - printf("server_thread create a socket \n"); - - bzero((char *) &serveraddr, sizeof(serveraddr)); - - serveraddr.sin_family = AF_INET; - serveraddr.sin_addr.s_addr = htons(INADDR_ANY); - serveraddr.sin_port = htons((unsigned short) DEFAULT_SOCKET_PORT); - - if(bind(serverfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr)) < 0) { - printf("server_thread couldnot bind to a socket \n"); - pthread_exit((void *) 0); - } - - printf("server_thread bind to a socket \n"); - - if(listen(serverfd, LISTEN_QUEUE_SIZE) < 0) { - printf("server_thread couldnot listen to a socket \n"); - pthread_exit((void *) 0); - } - - printf("server_thread listen to a socket \n"); - - // - // I only expect to receive one HCA data from a remote HCA - // - printf("server_thread: Waiting for a connection\n"); - infd= accept(serverfd,(struct sockaddr*)&clientaddr,&sin_size); - printf("server_thread: Got an incoming connection"); - - /* receive data from socket into buffer */ - bytes_recv = recv(infd, - &hca_data_buffer, - sizeof(Remote_HCA_Info), - 0); - - if(bytes_recv > 0) { -/* - printf("server_thread receive data\n"); - printf("opcode is 0x%X\n", hca_data_buffer.opcode); - printf("length is 0x%X\n", hca_data_buffer.length); - - for(i=0; i < 256; i++) { - printf("dlid %d is 0x%X\n", i, hca_data_buffer.dlid[i]); - printf("rqp_num %d is 0x%X\n", hca_data_buffer.rqp_num[i]); - } - - printf("rkey is 0x%X\n", hca_data_buffer.rkey); - printf("vaddr1 is 0x%X\n", hca_data_buffer.vaddr1); - printf("vaddr2 is 0x%X\n", hca_data_buffer.vaddr2); - printf("size is 0x%X\n", hca_data_buffer.size); - printf("After conversion hton \n"); - printf("opcode is 0x%X\n", htonl(hca_data_buffer.opcode)); - printf("length is 0x%X\n", htonl(hca_data_buffer.length)); - - for(i=0; i < 256; i++) { - printf("dlid %d is 0x%X\n", htons(hca_data_buffer.dlid[i])); - printf("rqp_num %d is 0x%X\n", htonl(hca_data_buffer.rqp_num[i])); - } - - printf("rkey is 0x%X\n", htonl(hca_data_buffer.rkey)); - printf("vaddr1 is 0x%X\n", htonl(hca_data_buffer.vaddr1)); - printf("vaddr2 is 0x%X\n", htonl(hca_data_buffer.vaddr2)); - printf("size is 0x%X\n", htonl(hca_data_buffer.size)); -*/ - - hca_data->opcode = ntohl(hca_data_buffer.opcode); // long - hca_data->length = ntohl(hca_data_buffer.length); // long - - for(i=0; i < 256; i++) { - hca_data->dlid[i] = ntohs(hca_data_buffer.dlid[i]); // u_int16 - hca_data->rqp_num[i] = ntohl(hca_data_buffer.rqp_num[i]);// u_int32 - } - - hca_data->rkey = ntohl(hca_data_buffer.rkey); // u_int32 - hca_data->vaddr1 = ntohl(hca_data_buffer.vaddr1); // first word u_int32 - hca_data->vaddr2 = ntohl(hca_data_buffer.vaddr2); // second word u_int32 - hca_data->size = ntohl(hca_data_buffer.size); // u_int32 - } - else { - printf("server_thread receive ERROR bytes_recv = %d\n", bytes_recv); - } - - close(infd); - close(serverfd); - - printf("server_thread EXIT \n"); - - pthread_exit((void *) 0); - -} - -// -// client_thread -// + connect to a remote server_thread -// + send local HCA's data to remote server_thread -// -void *client_thread(void *vargp) -{ - - Remote_HCA_Info *hca_data; - Remote_HCA_Info hca_data_buffer; - - int clientfd; - struct hostent *hp; - struct sockaddr_in clientaddr; - int bytes_send; - int i; - - hca_data = (Remote_HCA_Info *) vargp; - - if((clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { - printf("client_thread couldnot create a socket \n"); - pthread_exit((void *) 0); - } - - printf("client_thread create a socket \n"); - - bzero((char *) &clientaddr, sizeof(clientaddr)); - - clientaddr.sin_family = AF_INET; - clientaddr.sin_addr.s_addr = inet_addr(hca_data->dest_ip); - printf("client_thread get server Ip address = %s\n", hca_data->dest_ip); - clientaddr.sin_port = htons((unsigned short) DEFAULT_SOCKET_PORT); - memset(&(clientaddr.sin_zero), '\0', 8); - - connect(clientfd, (struct sockaddr *) &clientaddr, sizeof(struct sockaddr)); - - printf("client_thread connect to server Ip address = %s\n", hca_data->dest_ip); - - hca_data_buffer.opcode = htonl(hca_data->opcode); // long - hca_data_buffer.length = htonl(hca_data->length); // long - - for(i=0; i < 256; i++) { - hca_data_buffer.dlid[i] = htons(hca_data->dlid[i]); // u_int16 - hca_data_buffer.rqp_num[i] = htonl(hca_data->rqp_num[i]);// u_int32 - } - - hca_data_buffer.rkey = htonl(hca_data->rkey); // u_int32 - hca_data_buffer.vaddr1 = htonl(hca_data->vaddr1); // first word u_int32 - hca_data_buffer.vaddr2 = htonl(hca_data->vaddr2); // second word u_int32 - hca_data_buffer.size = htonl(hca_data->size); // u_int32 - - bytes_send = send(clientfd, & hca_data_buffer, sizeof(Remote_HCA_Info), 0); - - if(bytes_send == sizeof(Remote_HCA_Info)) { - printf("client_thread: send successfully \n"); - } - else { - printf("client_thread: send failed \n"); - } - - printf("client_thread EXIT \n"); - - pthread_exit((void *) 0); -} - - -// -// main -// + create a shared-memory between this main()/user address and -// a kernel thread/kernel address space associated with inbal -// kernel module -// + access local HCA's data through this shared memory -// -// + create a server_thread for receiving remote HCA's data -// + create a client_thread for sending out local HCA's data -// + after receiving remote HCA's data update this shared memory -// -int main(int argc , char *argv[]) -{ - int segment_id; - struct shmid_ds shmbuffer; - int segment_size; - const int shared_segment_size = sizeof(Remote_HCA_Info); - key_t key = 999; - unsigned long raddr; - Remote_HCA_Info *shared_memory; - Remote_HCA_Info exchange_hca_data; - Remote_HCA_Info remote_hca_data; - int i; - - /* pthread */ - pthread_t sid; - pthread_t cid; - pthread_attr_t attr; - int rc, status; - - char dest_ip[256]; - - if(argc != 2) { - printf("USAGE: uagent server_ip_address\n"); - printf("argc = %d \n", argc); - exit(1); - } - - strcpy(&exchange_hca_data.dest_ip[0], argv[1]); - printf("the destinational server IP address = %s\n", - &exchange_hca_data.dest_ip); - - segment_id = shmget(key, shared_segment_size, IPC_CREAT | 0666); - - printf("sys_shmget is done segment_id = %d\n", segment_id); - - shared_memory = (Remote_HCA_Info *) shmat(segment_id, 0, 0); - - if(shared_memory == (char *) -1) { - printf("Shared memory attach failed shared_memory=%p\n",shared_memory); - exit(0); - } - - printf("shared menory attached at address %p\n", shared_memory); - - while (1) { - if(shared_memory->opcode == SEND_QP_INFO) { - printf("Local HCA data received from kernel thread\n"); - break; - } - usleep(1000); - continue; - } - - printf("Local HCA data received from kernel thread\n"); - - // save local HCA's data in exchange_hca_data - // - exchange_hca_data.opcode = shared_memory->opcode; - exchange_hca_data.length = shared_memory->length; - - for(i=0; i < 256; i++) { - exchange_hca_data.dlid[i] = shared_memory->dlid[i]; - exchange_hca_data.rqp_num[i] = shared_memory->rqp_num[i]; - } - - exchange_hca_data.rkey = shared_memory->rkey; - exchange_hca_data.vaddr1 = shared_memory->vaddr1; - exchange_hca_data.vaddr2 = shared_memory->vaddr2; - exchange_hca_data.size = shared_memory->size; - - /* Initialize and set thread detached attribute */ - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); - - /* create a server thread for procsssing incoming remote node socket data */ - // - pthread_create(&sid, - &attr, - server_thread, - (Remote_HCA_Info *) &remote_hca_data); - - printf("Main: created a server thread \n"); - - sleep(10); - - /* create a clint thread to send out local HCA data to remote node */ - pthread_create(&cid, - &attr, - client_thread, - (Remote_HCA_Info *) &exchange_hca_data); - - printf("Main: created a client thread \n"); - - /* synchronization between server_thread and client_thread */ - pthread_attr_destroy(&attr); - - rc = pthread_join(sid, (void **) &status); - if(rc) { - printf("Error: return code from pthread_join() is %d\n", rc); - exit(-1); - } - - printf("completed join with thread %d status = %d\n", sid, status); - - rc = pthread_join(cid, (void **) &status); - if(rc) { - printf("Error: return code from pthread_join() is %d\n", rc); - exit(-1); - } - printf("completed join with thread %d status = %d\n", cid, status); - - // update shared memory with remote HCA's data - - shared_memory->opcode = RECV_QP_INFO; - shared_memory->length = remote_hca_data.length; - for(i=0; i < 256; i++) { - shared_memory->dlid[i] = remote_hca_data.dlid[i]; - shared_memory->rqp_num[i]= remote_hca_data.rqp_num[i]; - } - shared_memory->rkey = remote_hca_data.rkey; - shared_memory->vaddr1 = remote_hca_data.vaddr1; - shared_memory->vaddr2 = remote_hca_data.vaddr2; - shared_memory->size = remote_hca_data.size; - - sleep(5); - - shared_memory->opcode = RECV_QP_INFO; - shared_memory->length = remote_hca_data.length; - for(i=0; i < 256; i++) { - shared_memory->dlid[i] = remote_hca_data.dlid[i]; - shared_memory->rqp_num[i]= remote_hca_data.rqp_num[i]; - } - - shared_memory->rkey = remote_hca_data.rkey; - shared_memory->vaddr1 = remote_hca_data.vaddr1; - shared_memory->vaddr2 = remote_hca_data.vaddr2; - shared_memory->size = remote_hca_data.size; - - sleep(10); - -// shmdt(shared_memory); - - printf("uagent is DONE \n"); - - - - exit(0); - -} - diff --git a/lnet/klnds/openiblnd/Makefile.in b/lnet/klnds/openiblnd/Makefile.in new file mode 100644 index 0000000000..9b8ed5d1c8 --- /dev/null +++ b/lnet/klnds/openiblnd/Makefile.in @@ -0,0 +1,6 @@ +MODULES := kopenibnal +kopenibnal-objs := openibnal.o openibnal_cb.o + +EXTRA_POST_CFLAGS := @OPENIBCPPFLAGS@ + +@INCLUDE_RULES@ diff --git a/lnet/klnds/openiblnd/Makefile.mk b/lnet/klnds/openiblnd/Makefile.mk new file mode 100644 index 0000000000..bd8043e53c --- /dev/null +++ b/lnet/klnds/openiblnd/Makefile.mk @@ -0,0 +1,10 @@ +# 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 += kopenibnal.o +kopenibnal-objs := openibnal.o openibnal_cb.o + diff --git a/lnet/klnds/openiblnd/autoMakefile.am b/lnet/klnds/openiblnd/autoMakefile.am new file mode 100644 index 0000000000..a4207ae080 --- /dev/null +++ b/lnet/klnds/openiblnd/autoMakefile.am @@ -0,0 +1,15 @@ +# Copyright (C) 2001 Cluster File Systems, Inc. +# +# This code is issued under the GNU General Public License. +# See the file COPYING in this distribution + +if MODULES +if !CRAY_PORTALS +if BUILD_OPENIBNAL +modulenet_DATA = kopenibnal$(KMODEXT) +endif +endif +endif + +MOSTLYCLEANFILES = *.o *.ko *.mod.c +DIST_SOURCES = $(kopenibnal-objs:%.o=%.c) openibnal.h diff --git a/lnet/klnds/openiblnd/openiblnd.c b/lnet/klnds/openiblnd/openiblnd.c new file mode 100644 index 0000000000..6f661431ae --- /dev/null +++ b/lnet/klnds/openiblnd/openiblnd.c @@ -0,0 +1,1503 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2004 Cluster File Systems, Inc. + * Author: Eric Barton <eric@bartonsoftware.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. + * + */ + +#include "openibnal.h" + +nal_t koibnal_api; +ptl_handle_ni_t koibnal_ni; +koib_data_t koibnal_data; +koib_tunables_t koibnal_tunables; + +#ifdef CONFIG_SYSCTL +#define OPENIBNAL_SYSCTL 202 + +#define OPENIBNAL_SYSCTL_TIMEOUT 1 +#define OPENIBNAL_SYSCTL_ZERO_COPY 2 + +static ctl_table koibnal_ctl_table[] = { + {OPENIBNAL_SYSCTL_TIMEOUT, "timeout", + &koibnal_tunables.koib_io_timeout, sizeof (int), + 0644, NULL, &proc_dointvec}, + { 0 } +}; + +static ctl_table koibnal_top_ctl_table[] = { + {OPENIBNAL_SYSCTL, "openibnal", NULL, 0, 0555, koibnal_ctl_table}, + { 0 } +}; +#endif + +void +print_service(struct ib_common_attrib_service *service, char *tag, int rc) +{ + char name[32]; + + if (service == NULL) + { + CWARN("tag : %s\n" + "status : %d (NULL)\n", tag, rc); + return; + } + strncpy (name, service->service_name, sizeof(name)-1); + name[sizeof(name)-1] = 0; + + CWARN("tag : %s\n" + "status : %d\n" + "service id: "LPX64"\n" + "name : %s\n" + "NID : "LPX64"\n", tag, rc, + service->service_id, name, service->service_data64[0]); +} + +void +koibnal_service_setunset_done (tTS_IB_CLIENT_QUERY_TID tid, int status, + struct ib_common_attrib_service *service, void *arg) +{ + *(int *)arg = status; + up (&koibnal_data.koib_nid_signal); +} + +int +koibnal_advertise (void) +{ + __u64 tid; + int rc; + int rc2; + + LASSERT (koibnal_data.koib_nid != PTL_NID_ANY); + + memset (&koibnal_data.koib_service, 0, + sizeof (koibnal_data.koib_service)); + + koibnal_data.koib_service.service_id + = koibnal_data.koib_cm_service_id; + + rc = ib_cached_gid_get(koibnal_data.koib_device, + koibnal_data.koib_port, + 0, + koibnal_data.koib_service.service_gid); + if (rc != 0) { + CERROR ("Can't get port %d GID: %d\n", + koibnal_data.koib_port, rc); + return (rc); + } + + rc = ib_cached_pkey_get(koibnal_data.koib_device, + koibnal_data.koib_port, + 0, + &koibnal_data.koib_service.service_pkey); + if (rc != 0) { + CERROR ("Can't get port %d PKEY: %d\n", + koibnal_data.koib_port, rc); + return (rc); + } + + koibnal_data.koib_service.service_lease = 0xffffffff; + + koibnal_set_service_keys(&koibnal_data.koib_service, koibnal_data.koib_nid); + + CDEBUG(D_NET, "Advertising service id "LPX64" %s:"LPX64"\n", + koibnal_data.koib_service.service_id, + koibnal_data.koib_service.service_name, + *koibnal_service_nid_field(&koibnal_data.koib_service)); + + rc = ib_service_set (koibnal_data.koib_device, + koibnal_data.koib_port, + &koibnal_data.koib_service, + IB_SA_SERVICE_COMP_MASK_ID | + IB_SA_SERVICE_COMP_MASK_GID | + IB_SA_SERVICE_COMP_MASK_PKEY | + IB_SA_SERVICE_COMP_MASK_LEASE | + KOIBNAL_SERVICE_KEY_MASK, + koibnal_tunables.koib_io_timeout * HZ, + koibnal_service_setunset_done, &rc2, &tid); + + if (rc == 0) { + down (&koibnal_data.koib_nid_signal); + rc = rc2; + } + + if (rc != 0) + CERROR ("Error %d advertising SM service\n", rc); + + return (rc); +} + +int +koibnal_unadvertise (int expect_success) +{ + __u64 tid; + int rc; + int rc2; + + LASSERT (koibnal_data.koib_nid != PTL_NID_ANY); + + memset (&koibnal_data.koib_service, 0, + sizeof (koibnal_data.koib_service)); + + koibnal_set_service_keys(&koibnal_data.koib_service, koibnal_data.koib_nid); + + CDEBUG(D_NET, "Unadvertising service %s:"LPX64"\n", + koibnal_data.koib_service.service_name, + *koibnal_service_nid_field(&koibnal_data.koib_service)); + + rc = ib_service_delete (koibnal_data.koib_device, + koibnal_data.koib_port, + &koibnal_data.koib_service, + KOIBNAL_SERVICE_KEY_MASK, + koibnal_tunables.koib_io_timeout * HZ, + koibnal_service_setunset_done, &rc2, &tid); + if (rc != 0) { + CERROR ("Immediate error %d unadvertising NID "LPX64"\n", + rc, koibnal_data.koib_nid); + return (rc); + } + + down (&koibnal_data.koib_nid_signal); + + if ((rc2 == 0) == !!expect_success) + return (0); + + if (expect_success) + CERROR("Error %d unadvertising NID "LPX64"\n", + rc, koibnal_data.koib_nid); + else + CWARN("Removed conflicting NID "LPX64"\n", + koibnal_data.koib_nid); + + return (rc); +} + +int +koibnal_check_advert (void) +{ + __u64 tid; + int rc; + int rc2; + + static struct ib_common_attrib_service srv; + + memset (&srv, 0, sizeof (srv)); + + koibnal_set_service_keys(&srv, koibnal_data.koib_nid); + + rc = ib_service_get (koibnal_data.koib_device, + koibnal_data.koib_port, + &srv, + KOIBNAL_SERVICE_KEY_MASK, + koibnal_tunables.koib_io_timeout * HZ, + koibnal_service_setunset_done, &rc2, + &tid); + + if (rc != 0) { + CERROR ("Immediate error %d checking SM service\n", rc); + } else { + down (&koibnal_data.koib_nid_signal); + rc = rc2; + + if (rc != 0) + CERROR ("Error %d checking SM service\n", rc); + } + + return (rc); +} + +int +koibnal_set_mynid(ptl_nid_t nid) +{ + struct timeval tv; + lib_ni_t *ni = &koibnal_lib.libnal_ni; + int rc; + + CDEBUG(D_IOCTL, "setting mynid to "LPX64" (old nid="LPX64")\n", + nid, ni->ni_pid.nid); + + do_gettimeofday(&tv); + + down (&koibnal_data.koib_nid_mutex); + + if (nid == koibnal_data.koib_nid) { + /* no change of NID */ + up (&koibnal_data.koib_nid_mutex); + return (0); + } + + CDEBUG(D_NET, "NID "LPX64"("LPX64")\n", + koibnal_data.koib_nid, nid); + + if (koibnal_data.koib_nid != PTL_NID_ANY) { + + koibnal_unadvertise (1); + + rc = ib_cm_listen_stop (koibnal_data.koib_listen_handle); + if (rc != 0) + CERROR ("Error %d stopping listener\n", rc); + } + + koibnal_data.koib_nid = ni->ni_pid.nid = nid; + koibnal_data.koib_incarnation = (((__u64)tv.tv_sec) * 1000000) + tv.tv_usec; + + /* Delete all existing peers and their connections after new + * NID/incarnation set to ensure no old connections in our brave + * new world. */ + koibnal_del_peer (PTL_NID_ANY, 0); + + rc = 0; + if (koibnal_data.koib_nid != PTL_NID_ANY) { + /* New NID installed */ + + /* remove any previous advert (crashed node etc) */ + koibnal_unadvertise(0); + + /* Assign new service number */ + koibnal_data.koib_cm_service_id = ib_cm_service_assign(); + CDEBUG(D_NET, "service_id "LPX64"\n", koibnal_data.koib_cm_service_id); + + rc = ib_cm_listen(koibnal_data.koib_cm_service_id, + TS_IB_CM_SERVICE_EXACT_MASK, + koibnal_passive_conn_callback, NULL, + &koibnal_data.koib_listen_handle); + if (rc != 0) { + CERROR ("ib_cm_listen error: %d\n", rc); + goto out; + } + + rc = koibnal_advertise(); + + koibnal_check_advert(); + } + + out: + if (rc != 0) { + koibnal_data.koib_nid = PTL_NID_ANY; + /* remove any peers that sprung up while I failed to + * advertise myself */ + koibnal_del_peer (PTL_NID_ANY, 0); + } + + up (&koibnal_data.koib_nid_mutex); + return (0); +} + +koib_peer_t * +koibnal_create_peer (ptl_nid_t nid) +{ + koib_peer_t *peer; + + LASSERT (nid != PTL_NID_ANY); + + PORTAL_ALLOC (peer, sizeof (*peer)); + if (peer == NULL) + return (NULL); + + memset(peer, 0, sizeof(*peer)); /* zero flags etc */ + + peer->ibp_nid = nid; + atomic_set (&peer->ibp_refcount, 1); /* 1 ref for caller */ + + INIT_LIST_HEAD (&peer->ibp_list); /* not in the peer table yet */ + INIT_LIST_HEAD (&peer->ibp_conns); + INIT_LIST_HEAD (&peer->ibp_tx_queue); + + peer->ibp_reconnect_time = jiffies; + peer->ibp_reconnect_interval = OPENIBNAL_MIN_RECONNECT_INTERVAL; + + atomic_inc (&koibnal_data.koib_npeers); + return (peer); +} + +void +koibnal_destroy_peer (koib_peer_t *peer) +{ + CDEBUG (D_NET, "peer "LPX64" %p deleted\n", peer->ibp_nid, peer); + + LASSERT (atomic_read (&peer->ibp_refcount) == 0); + LASSERT (peer->ibp_persistence == 0); + LASSERT (!koibnal_peer_active(peer)); + LASSERT (peer->ibp_connecting == 0); + LASSERT (list_empty (&peer->ibp_conns)); + LASSERT (list_empty (&peer->ibp_tx_queue)); + + PORTAL_FREE (peer, sizeof (*peer)); + + /* NB a peer's connections keep a reference on their peer until + * they are destroyed, so we can be assured that _all_ state to do + * with this peer has been cleaned up when its refcount drops to + * zero. */ + atomic_dec (&koibnal_data.koib_npeers); +} + +void +koibnal_put_peer (koib_peer_t *peer) +{ + CDEBUG (D_OTHER, "putting peer[%p] -> "LPX64" (%d)\n", + peer, peer->ibp_nid, + atomic_read (&peer->ibp_refcount)); + + LASSERT (atomic_read (&peer->ibp_refcount) > 0); + if (!atomic_dec_and_test (&peer->ibp_refcount)) + return; + + koibnal_destroy_peer (peer); +} + +koib_peer_t * +koibnal_find_peer_locked (ptl_nid_t nid) +{ + struct list_head *peer_list = koibnal_nid2peerlist (nid); + struct list_head *tmp; + koib_peer_t *peer; + + list_for_each (tmp, peer_list) { + + peer = list_entry (tmp, koib_peer_t, ibp_list); + + LASSERT (peer->ibp_persistence != 0 || /* persistent peer */ + peer->ibp_connecting != 0 || /* creating conns */ + !list_empty (&peer->ibp_conns)); /* active conn */ + + if (peer->ibp_nid != nid) + continue; + + CDEBUG(D_NET, "got peer [%p] -> "LPX64" (%d)\n", + peer, nid, atomic_read (&peer->ibp_refcount)); + return (peer); + } + return (NULL); +} + +koib_peer_t * +koibnal_get_peer (ptl_nid_t nid) +{ + koib_peer_t *peer; + + read_lock (&koibnal_data.koib_global_lock); + peer = koibnal_find_peer_locked (nid); + if (peer != NULL) /* +1 ref for caller? */ + atomic_inc (&peer->ibp_refcount); + read_unlock (&koibnal_data.koib_global_lock); + + return (peer); +} + +void +koibnal_unlink_peer_locked (koib_peer_t *peer) +{ + LASSERT (peer->ibp_persistence == 0); + LASSERT (list_empty(&peer->ibp_conns)); + + LASSERT (koibnal_peer_active(peer)); + list_del_init (&peer->ibp_list); + /* lose peerlist's ref */ + koibnal_put_peer (peer); +} + +int +koibnal_get_peer_info (int index, ptl_nid_t *nidp, int *persistencep) +{ + koib_peer_t *peer; + struct list_head *ptmp; + int i; + + read_lock (&koibnal_data.koib_global_lock); + + for (i = 0; i < koibnal_data.koib_peer_hash_size; i++) { + + list_for_each (ptmp, &koibnal_data.koib_peers[i]) { + + peer = list_entry (ptmp, koib_peer_t, ibp_list); + LASSERT (peer->ibp_persistence != 0 || + peer->ibp_connecting != 0 || + !list_empty (&peer->ibp_conns)); + + if (index-- > 0) + continue; + + *nidp = peer->ibp_nid; + *persistencep = peer->ibp_persistence; + + read_unlock (&koibnal_data.koib_global_lock); + return (0); + } + } + + read_unlock (&koibnal_data.koib_global_lock); + return (-ENOENT); +} + +int +koibnal_add_persistent_peer (ptl_nid_t nid) +{ + unsigned long flags; + koib_peer_t *peer; + koib_peer_t *peer2; + + if (nid == PTL_NID_ANY) + return (-EINVAL); + + peer = koibnal_create_peer (nid); + if (peer == NULL) + return (-ENOMEM); + + write_lock_irqsave (&koibnal_data.koib_global_lock, flags); + + peer2 = koibnal_find_peer_locked (nid); + if (peer2 != NULL) { + koibnal_put_peer (peer); + peer = peer2; + } else { + /* peer table takes existing ref on peer */ + list_add_tail (&peer->ibp_list, + koibnal_nid2peerlist (nid)); + } + + peer->ibp_persistence++; + + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + return (0); +} + +void +koibnal_del_peer_locked (koib_peer_t *peer, int single_share) +{ + struct list_head *ctmp; + struct list_head *cnxt; + koib_conn_t *conn; + + if (!single_share) + peer->ibp_persistence = 0; + else if (peer->ibp_persistence > 0) + peer->ibp_persistence--; + + if (peer->ibp_persistence != 0) + return; + + list_for_each_safe (ctmp, cnxt, &peer->ibp_conns) { + conn = list_entry(ctmp, koib_conn_t, ibc_list); + + koibnal_close_conn_locked (conn, 0); + } + + /* NB peer unlinks itself when last conn is closed */ +} + +int +koibnal_del_peer (ptl_nid_t nid, int single_share) +{ + unsigned long flags; + struct list_head *ptmp; + struct list_head *pnxt; + koib_peer_t *peer; + int lo; + int hi; + int i; + int rc = -ENOENT; + + write_lock_irqsave (&koibnal_data.koib_global_lock, flags); + + if (nid != PTL_NID_ANY) + lo = hi = koibnal_nid2peerlist(nid) - koibnal_data.koib_peers; + else { + lo = 0; + hi = koibnal_data.koib_peer_hash_size - 1; + } + + for (i = lo; i <= hi; i++) { + list_for_each_safe (ptmp, pnxt, &koibnal_data.koib_peers[i]) { + peer = list_entry (ptmp, koib_peer_t, ibp_list); + LASSERT (peer->ibp_persistence != 0 || + peer->ibp_connecting != 0 || + !list_empty (&peer->ibp_conns)); + + if (!(nid == PTL_NID_ANY || peer->ibp_nid == nid)) + continue; + + koibnal_del_peer_locked (peer, single_share); + rc = 0; /* matched something */ + + if (single_share) + goto out; + } + } + out: + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + + return (rc); +} + +koib_conn_t * +koibnal_get_conn_by_idx (int index) +{ + koib_peer_t *peer; + struct list_head *ptmp; + koib_conn_t *conn; + struct list_head *ctmp; + int i; + + read_lock (&koibnal_data.koib_global_lock); + + for (i = 0; i < koibnal_data.koib_peer_hash_size; i++) { + list_for_each (ptmp, &koibnal_data.koib_peers[i]) { + + peer = list_entry (ptmp, koib_peer_t, ibp_list); + LASSERT (peer->ibp_persistence > 0 || + peer->ibp_connecting != 0 || + !list_empty (&peer->ibp_conns)); + + list_for_each (ctmp, &peer->ibp_conns) { + if (index-- > 0) + continue; + + conn = list_entry (ctmp, koib_conn_t, ibc_list); + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_inc (&conn->ibc_refcount); + read_unlock (&koibnal_data.koib_global_lock); + return (conn); + } + } + } + + read_unlock (&koibnal_data.koib_global_lock); + return (NULL); +} + +koib_conn_t * +koibnal_create_conn (void) +{ + koib_conn_t *conn; + int i; + __u64 vaddr = 0; + __u64 vaddr_base; + int page_offset; + int ipage; + int rc; + union { + struct ib_qp_create_param qp_create; + struct ib_qp_attribute qp_attr; + } params; + + PORTAL_ALLOC (conn, sizeof (*conn)); + if (conn == NULL) { + CERROR ("Can't allocate connection\n"); + return (NULL); + } + + /* zero flags, NULL pointers etc... */ + memset (conn, 0, sizeof (*conn)); + + INIT_LIST_HEAD (&conn->ibc_tx_queue); + INIT_LIST_HEAD (&conn->ibc_rdma_queue); + spin_lock_init (&conn->ibc_lock); + + atomic_inc (&koibnal_data.koib_nconns); + /* well not really, but I call destroy() on failure, which decrements */ + + PORTAL_ALLOC (conn->ibc_rxs, OPENIBNAL_RX_MSGS * sizeof (koib_rx_t)); + if (conn->ibc_rxs == NULL) + goto failed; + memset (conn->ibc_rxs, 0, OPENIBNAL_RX_MSGS * sizeof(koib_rx_t)); + + rc = koibnal_alloc_pages(&conn->ibc_rx_pages, + OPENIBNAL_RX_MSG_PAGES, + IB_ACCESS_LOCAL_WRITE); + if (rc != 0) + goto failed; + + vaddr_base = vaddr = conn->ibc_rx_pages->oibp_vaddr; + + for (i = ipage = page_offset = 0; i < OPENIBNAL_RX_MSGS; i++) { + struct page *page = conn->ibc_rx_pages->oibp_pages[ipage]; + koib_rx_t *rx = &conn->ibc_rxs[i]; + + rx->rx_conn = conn; + rx->rx_vaddr = vaddr; + rx->rx_msg = (koib_msg_t *)(((char *)page_address(page)) + page_offset); + + vaddr += OPENIBNAL_MSG_SIZE; + LASSERT (vaddr <= vaddr_base + OPENIBNAL_RX_MSG_BYTES); + + page_offset += OPENIBNAL_MSG_SIZE; + LASSERT (page_offset <= PAGE_SIZE); + + if (page_offset == PAGE_SIZE) { + page_offset = 0; + ipage++; + LASSERT (ipage <= OPENIBNAL_RX_MSG_PAGES); + } + } + + params.qp_create = (struct ib_qp_create_param) { + .limit = { + /* Sends have an optional RDMA */ + .max_outstanding_send_request = 2 * OPENIBNAL_MSG_QUEUE_SIZE, + .max_outstanding_receive_request = OPENIBNAL_MSG_QUEUE_SIZE, + .max_send_gather_element = 1, + .max_receive_scatter_element = 1, + }, + .pd = koibnal_data.koib_pd, + .send_queue = koibnal_data.koib_tx_cq, + .receive_queue = koibnal_data.koib_rx_cq, + .send_policy = IB_WQ_SIGNAL_SELECTABLE, + .receive_policy = IB_WQ_SIGNAL_SELECTABLE, + .rd_domain = 0, + .transport = IB_TRANSPORT_RC, + .device_specific = NULL, + }; + + rc = ib_qp_create (¶ms.qp_create, &conn->ibc_qp, &conn->ibc_qpn); + if (rc != 0) { + CERROR ("Failed to create queue pair: %d\n", rc); + goto failed; + } + + /* Mark QP created */ + conn->ibc_state = OPENIBNAL_CONN_INIT_QP; + + params.qp_attr = (struct ib_qp_attribute) { + .state = IB_QP_STATE_INIT, + .port = koibnal_data.koib_port, + .enable_rdma_read = 1, + .enable_rdma_write = 1, + .valid_fields = (IB_QP_ATTRIBUTE_STATE | + IB_QP_ATTRIBUTE_PORT | + IB_QP_ATTRIBUTE_PKEY_INDEX | + IB_QP_ATTRIBUTE_RDMA_ATOMIC_ENABLE), + }; + rc = ib_qp_modify(conn->ibc_qp, ¶ms.qp_attr); + if (rc != 0) { + CERROR ("Failed to modify queue pair: %d\n", rc); + goto failed; + } + + /* 1 ref for caller */ + atomic_set (&conn->ibc_refcount, 1); + return (conn); + + failed: + koibnal_destroy_conn (conn); + return (NULL); +} + +void +koibnal_destroy_conn (koib_conn_t *conn) +{ + int rc; + + CDEBUG (D_NET, "connection %p\n", conn); + + LASSERT (atomic_read (&conn->ibc_refcount) == 0); + LASSERT (list_empty(&conn->ibc_tx_queue)); + LASSERT (list_empty(&conn->ibc_rdma_queue)); + LASSERT (conn->ibc_nsends_posted == 0); + LASSERT (conn->ibc_connreq == NULL); + + switch (conn->ibc_state) { + case OPENIBNAL_CONN_ZOMBIE: + /* called after connection sequence initiated */ + + case OPENIBNAL_CONN_INIT_QP: + rc = ib_qp_destroy(conn->ibc_qp); + if (rc != 0) + CERROR("Can't destroy QP: %d\n", rc); + /* fall through */ + + case OPENIBNAL_CONN_INIT_NOTHING: + break; + + default: + LASSERT (0); + } + + if (conn->ibc_rx_pages != NULL) + koibnal_free_pages(conn->ibc_rx_pages); + + if (conn->ibc_rxs != NULL) + PORTAL_FREE(conn->ibc_rxs, + OPENIBNAL_RX_MSGS * sizeof(koib_rx_t)); + + if (conn->ibc_peer != NULL) + koibnal_put_peer(conn->ibc_peer); + + PORTAL_FREE(conn, sizeof (*conn)); + + atomic_dec(&koibnal_data.koib_nconns); + + if (atomic_read (&koibnal_data.koib_nconns) == 0 && + koibnal_data.koib_shutdown) { + /* I just nuked the last connection on shutdown; wake up + * everyone so they can exit. */ + wake_up_all(&koibnal_data.koib_sched_waitq); + wake_up_all(&koibnal_data.koib_connd_waitq); + } +} + +void +koibnal_put_conn (koib_conn_t *conn) +{ + unsigned long flags; + + CDEBUG (D_NET, "putting conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + + LASSERT (atomic_read (&conn->ibc_refcount) > 0); + if (!atomic_dec_and_test (&conn->ibc_refcount)) + return; + + /* last ref only goes on zombies */ + LASSERT (conn->ibc_state == OPENIBNAL_CONN_ZOMBIE); + + spin_lock_irqsave (&koibnal_data.koib_connd_lock, flags); + + list_add (&conn->ibc_list, &koibnal_data.koib_connd_conns); + wake_up (&koibnal_data.koib_connd_waitq); + + spin_unlock_irqrestore (&koibnal_data.koib_connd_lock, flags); +} + +int +koibnal_close_peer_conns_locked (koib_peer_t *peer, int why) +{ + koib_conn_t *conn; + struct list_head *ctmp; + struct list_head *cnxt; + int count = 0; + + list_for_each_safe (ctmp, cnxt, &peer->ibp_conns) { + conn = list_entry (ctmp, koib_conn_t, ibc_list); + + count++; + koibnal_close_conn_locked (conn, why); + } + + return (count); +} + +int +koibnal_close_stale_conns_locked (koib_peer_t *peer, __u64 incarnation) +{ + koib_conn_t *conn; + struct list_head *ctmp; + struct list_head *cnxt; + int count = 0; + + list_for_each_safe (ctmp, cnxt, &peer->ibp_conns) { + conn = list_entry (ctmp, koib_conn_t, ibc_list); + + if (conn->ibc_incarnation == incarnation) + continue; + + CDEBUG(D_NET, "Closing stale conn nid:"LPX64" incarnation:"LPX64"("LPX64")\n", + peer->ibp_nid, conn->ibc_incarnation, incarnation); + + count++; + koibnal_close_conn_locked (conn, -ESTALE); + } + + return (count); +} + +int +koibnal_close_matching_conns (ptl_nid_t nid) +{ + unsigned long flags; + koib_peer_t *peer; + struct list_head *ptmp; + struct list_head *pnxt; + int lo; + int hi; + int i; + int count = 0; + + write_lock_irqsave (&koibnal_data.koib_global_lock, flags); + + if (nid != PTL_NID_ANY) + lo = hi = koibnal_nid2peerlist(nid) - koibnal_data.koib_peers; + else { + lo = 0; + hi = koibnal_data.koib_peer_hash_size - 1; + } + + for (i = lo; i <= hi; i++) { + list_for_each_safe (ptmp, pnxt, &koibnal_data.koib_peers[i]) { + + peer = list_entry (ptmp, koib_peer_t, ibp_list); + LASSERT (peer->ibp_persistence != 0 || + peer->ibp_connecting != 0 || + !list_empty (&peer->ibp_conns)); + + if (!(nid == PTL_NID_ANY || nid == peer->ibp_nid)) + continue; + + count += koibnal_close_peer_conns_locked (peer, 0); + } + } + + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + + /* wildcards always succeed */ + if (nid == PTL_NID_ANY) + return (0); + + return (count == 0 ? -ENOENT : 0); +} + +int +koibnal_cmd(struct portals_cfg *pcfg, void * private) +{ + int rc = -EINVAL; + + LASSERT (pcfg != NULL); + + switch(pcfg->pcfg_command) { + case NAL_CMD_GET_PEER: { + ptl_nid_t nid = 0; + int share_count = 0; + + rc = koibnal_get_peer_info(pcfg->pcfg_count, + &nid, &share_count); + pcfg->pcfg_nid = nid; + pcfg->pcfg_size = 0; + pcfg->pcfg_id = 0; + pcfg->pcfg_misc = 0; + pcfg->pcfg_count = 0; + pcfg->pcfg_wait = share_count; + break; + } + case NAL_CMD_ADD_PEER: { + rc = koibnal_add_persistent_peer (pcfg->pcfg_nid); + break; + } + case NAL_CMD_DEL_PEER: { + rc = koibnal_del_peer (pcfg->pcfg_nid, + /* flags == single_share */ + pcfg->pcfg_flags != 0); + break; + } + case NAL_CMD_GET_CONN: { + koib_conn_t *conn = koibnal_get_conn_by_idx (pcfg->pcfg_count); + + if (conn == NULL) + rc = -ENOENT; + else { + rc = 0; + pcfg->pcfg_nid = conn->ibc_peer->ibp_nid; + pcfg->pcfg_id = 0; + pcfg->pcfg_misc = 0; + pcfg->pcfg_flags = 0; + koibnal_put_conn (conn); + } + break; + } + case NAL_CMD_CLOSE_CONNECTION: { + rc = koibnal_close_matching_conns (pcfg->pcfg_nid); + break; + } + case NAL_CMD_REGISTER_MYNID: { + if (pcfg->pcfg_nid == PTL_NID_ANY) + rc = -EINVAL; + else + rc = koibnal_set_mynid (pcfg->pcfg_nid); + break; + } + } + + return rc; +} + +void +koibnal_free_pages (koib_pages_t *p) +{ + int npages = p->oibp_npages; + int rc; + int i; + + if (p->oibp_mapped) { + rc = ib_memory_deregister(p->oibp_handle); + if (rc != 0) + CERROR ("Deregister error: %d\n", rc); + } + + for (i = 0; i < npages; i++) + if (p->oibp_pages[i] != NULL) + __free_page(p->oibp_pages[i]); + + PORTAL_FREE (p, offsetof(koib_pages_t, oibp_pages[npages])); +} + +int +koibnal_alloc_pages (koib_pages_t **pp, int npages, int access) +{ + koib_pages_t *p; + struct ib_physical_buffer *phys_pages; + int i; + int rc; + + PORTAL_ALLOC(p, offsetof(koib_pages_t, oibp_pages[npages])); + if (p == NULL) { + CERROR ("Can't allocate buffer %d\n", npages); + return (-ENOMEM); + } + + memset (p, 0, offsetof(koib_pages_t, oibp_pages[npages])); + p->oibp_npages = npages; + + for (i = 0; i < npages; i++) { + p->oibp_pages[i] = alloc_page (GFP_KERNEL); + if (p->oibp_pages[i] == NULL) { + CERROR ("Can't allocate page %d of %d\n", i, npages); + koibnal_free_pages(p); + return (-ENOMEM); + } + } + + PORTAL_ALLOC(phys_pages, npages * sizeof(*phys_pages)); + if (phys_pages == NULL) { + CERROR ("Can't allocate physarray for %d pages\n", npages); + koibnal_free_pages(p); + return (-ENOMEM); + } + + for (i = 0; i < npages; i++) { + phys_pages[i].size = PAGE_SIZE; + phys_pages[i].address = + koibnal_page2phys(p->oibp_pages[i]); + } + + p->oibp_vaddr = 0; + rc = ib_memory_register_physical(koibnal_data.koib_pd, + phys_pages, npages, + &p->oibp_vaddr, + npages * PAGE_SIZE, 0, + access, + &p->oibp_handle, + &p->oibp_lkey, + &p->oibp_rkey); + + PORTAL_FREE(phys_pages, npages * sizeof(*phys_pages)); + + if (rc != 0) { + CERROR ("Error %d mapping %d pages\n", rc, npages); + koibnal_free_pages(p); + return (rc); + } + + p->oibp_mapped = 1; + *pp = p; + return (0); +} + +int +koibnal_setup_tx_descs (void) +{ + int ipage = 0; + int page_offset = 0; + __u64 vaddr; + __u64 vaddr_base; + struct page *page; + koib_tx_t *tx; + int i; + int rc; + + /* pre-mapped messages are not bigger than 1 page */ + LASSERT (OPENIBNAL_MSG_SIZE <= PAGE_SIZE); + + /* No fancy arithmetic when we do the buffer calculations */ + LASSERT (PAGE_SIZE % OPENIBNAL_MSG_SIZE == 0); + + rc = koibnal_alloc_pages(&koibnal_data.koib_tx_pages, + OPENIBNAL_TX_MSG_PAGES, + 0); /* local read access only */ + if (rc != 0) + return (rc); + + vaddr = vaddr_base = koibnal_data.koib_tx_pages->oibp_vaddr; + + for (i = 0; i < OPENIBNAL_TX_MSGS; i++) { + page = koibnal_data.koib_tx_pages->oibp_pages[ipage]; + tx = &koibnal_data.koib_tx_descs[i]; + + memset (tx, 0, sizeof(*tx)); /* zero flags etc */ + + tx->tx_msg = (koib_msg_t *)(((char *)page_address(page)) + page_offset); + tx->tx_vaddr = vaddr; + tx->tx_isnblk = (i >= OPENIBNAL_NTX); + tx->tx_mapped = KOIB_TX_UNMAPPED; + + CDEBUG(D_NET, "Tx[%d] %p->%p - "LPX64"\n", + i, tx, tx->tx_msg, tx->tx_vaddr); + + if (tx->tx_isnblk) + list_add (&tx->tx_list, + &koibnal_data.koib_idle_nblk_txs); + else + list_add (&tx->tx_list, + &koibnal_data.koib_idle_txs); + + vaddr += OPENIBNAL_MSG_SIZE; + LASSERT (vaddr <= vaddr_base + OPENIBNAL_TX_MSG_BYTES); + + page_offset += OPENIBNAL_MSG_SIZE; + LASSERT (page_offset <= PAGE_SIZE); + + if (page_offset == PAGE_SIZE) { + page_offset = 0; + ipage++; + LASSERT (ipage <= OPENIBNAL_TX_MSG_PAGES); + } + } + + return (0); +} + +void +koibnal_api_shutdown (nal_t *nal) +{ + int i; + int rc; + + if (nal->nal_refct != 0) { + /* This module got the first ref */ + PORTAL_MODULE_UNUSE; + return; + } + + CDEBUG(D_MALLOC, "before NAL cleanup: kmem %d\n", + atomic_read (&portal_kmemory)); + + LASSERT(nal == &koibnal_api); + + switch (koibnal_data.koib_init) { + default: + CERROR ("Unexpected state %d\n", koibnal_data.koib_init); + LBUG(); + + case OPENIBNAL_INIT_ALL: + /* stop calls to nal_cmd */ + libcfs_nal_cmd_unregister(OPENIBNAL); + /* No new peers */ + + /* resetting my NID to unadvertises me, removes my + * listener and nukes all current peers */ + koibnal_set_mynid (PTL_NID_ANY); + + /* Wait for all peer state to clean up */ + i = 2; + while (atomic_read (&koibnal_data.koib_npeers) != 0) { + i++; + CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */ + "waiting for %d peers to close down\n", + atomic_read (&koibnal_data.koib_npeers)); + set_current_state (TASK_INTERRUPTIBLE); + schedule_timeout (HZ); + } + /* fall through */ + + case OPENIBNAL_INIT_TX_CQ: + rc = ib_cq_destroy (koibnal_data.koib_tx_cq); + if (rc != 0) + CERROR ("Destroy tx CQ error: %d\n", rc); + /* fall through */ + + case OPENIBNAL_INIT_RX_CQ: + rc = ib_cq_destroy (koibnal_data.koib_rx_cq); + if (rc != 0) + CERROR ("Destroy rx CQ error: %d\n", rc); + /* fall through */ + + case OPENIBNAL_INIT_TXD: + koibnal_free_pages (koibnal_data.koib_tx_pages); + /* fall through */ +#if OPENIBNAL_FMR + case OPENIBNAL_INIT_FMR: + rc = ib_fmr_pool_destroy (koibnal_data.koib_fmr_pool); + if (rc != 0) + CERROR ("Destroy FMR pool error: %d\n", rc); + /* fall through */ +#endif + case OPENIBNAL_INIT_PD: + rc = ib_pd_destroy(koibnal_data.koib_pd); + if (rc != 0) + CERROR ("Destroy PD error: %d\n", rc); + /* fall through */ + + case OPENIBNAL_INIT_LIB: + lib_fini(&koibnal_lib); + /* fall through */ + + case OPENIBNAL_INIT_DATA: + /* Module refcount only gets to zero when all peers + * have been closed so all lists must be empty */ + LASSERT (atomic_read (&koibnal_data.koib_npeers) == 0); + LASSERT (koibnal_data.koib_peers != NULL); + for (i = 0; i < koibnal_data.koib_peer_hash_size; i++) { + LASSERT (list_empty (&koibnal_data.koib_peers[i])); + } + LASSERT (atomic_read (&koibnal_data.koib_nconns) == 0); + LASSERT (list_empty (&koibnal_data.koib_sched_rxq)); + LASSERT (list_empty (&koibnal_data.koib_sched_txq)); + LASSERT (list_empty (&koibnal_data.koib_connd_conns)); + LASSERT (list_empty (&koibnal_data.koib_connd_peers)); + + /* flag threads to terminate; wake and wait for them to die */ + koibnal_data.koib_shutdown = 1; + wake_up_all (&koibnal_data.koib_sched_waitq); + wake_up_all (&koibnal_data.koib_connd_waitq); + + i = 2; + while (atomic_read (&koibnal_data.koib_nthreads) != 0) { + i++; + CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */ + "Waiting for %d threads to terminate\n", + atomic_read (&koibnal_data.koib_nthreads)); + set_current_state (TASK_INTERRUPTIBLE); + schedule_timeout (HZ); + } + /* fall through */ + + case OPENIBNAL_INIT_NOTHING: + break; + } + + if (koibnal_data.koib_tx_descs != NULL) + PORTAL_FREE (koibnal_data.koib_tx_descs, + OPENIBNAL_TX_MSGS * sizeof(koib_tx_t)); + + if (koibnal_data.koib_peers != NULL) + PORTAL_FREE (koibnal_data.koib_peers, + sizeof (struct list_head) * + koibnal_data.koib_peer_hash_size); + + CDEBUG(D_MALLOC, "after NAL cleanup: kmem %d\n", + atomic_read (&portal_kmemory)); + printk(KERN_INFO "Lustre: OpenIB NAL unloaded (final mem %d)\n", + atomic_read(&portal_kmemory)); + + koibnal_data.koib_init = OPENIBNAL_INIT_NOTHING; +} + +int +koibnal_api_startup (nal_t *nal, ptl_pid_t requested_pid, + ptl_ni_limits_t *requested_limits, + ptl_ni_limits_t *actual_limits) +{ + ptl_process_id_t process_id; + int pkmem = atomic_read(&portal_kmemory); + int rc; + int i; + + LASSERT (nal == &koibnal_api); + + if (nal->nal_refct != 0) { + if (actual_limits != NULL) + *actual_limits = koibnal_lib.libnal_ni.ni_actual_limits; + /* This module got the first ref */ + PORTAL_MODULE_USE; + return (PTL_OK); + } + + LASSERT (koibnal_data.koib_init == OPENIBNAL_INIT_NOTHING); + + memset (&koibnal_data, 0, sizeof (koibnal_data)); /* zero pointers, flags etc */ + + init_MUTEX (&koibnal_data.koib_nid_mutex); + init_MUTEX_LOCKED (&koibnal_data.koib_nid_signal); + koibnal_data.koib_nid = PTL_NID_ANY; + + rwlock_init(&koibnal_data.koib_global_lock); + + koibnal_data.koib_peer_hash_size = OPENIBNAL_PEER_HASH_SIZE; + PORTAL_ALLOC (koibnal_data.koib_peers, + sizeof (struct list_head) * koibnal_data.koib_peer_hash_size); + if (koibnal_data.koib_peers == NULL) { + goto failed; + } + for (i = 0; i < koibnal_data.koib_peer_hash_size; i++) + INIT_LIST_HEAD(&koibnal_data.koib_peers[i]); + + spin_lock_init (&koibnal_data.koib_connd_lock); + INIT_LIST_HEAD (&koibnal_data.koib_connd_peers); + INIT_LIST_HEAD (&koibnal_data.koib_connd_conns); + init_waitqueue_head (&koibnal_data.koib_connd_waitq); + + spin_lock_init (&koibnal_data.koib_sched_lock); + INIT_LIST_HEAD (&koibnal_data.koib_sched_txq); + INIT_LIST_HEAD (&koibnal_data.koib_sched_rxq); + init_waitqueue_head (&koibnal_data.koib_sched_waitq); + + spin_lock_init (&koibnal_data.koib_tx_lock); + INIT_LIST_HEAD (&koibnal_data.koib_idle_txs); + INIT_LIST_HEAD (&koibnal_data.koib_idle_nblk_txs); + init_waitqueue_head(&koibnal_data.koib_idle_tx_waitq); + + PORTAL_ALLOC (koibnal_data.koib_tx_descs, + OPENIBNAL_TX_MSGS * sizeof(koib_tx_t)); + if (koibnal_data.koib_tx_descs == NULL) { + CERROR ("Can't allocate tx descs\n"); + goto failed; + } + + /* lists/ptrs/locks initialised */ + koibnal_data.koib_init = OPENIBNAL_INIT_DATA; + /*****************************************************/ + + process_id.pid = requested_pid; + process_id.nid = koibnal_data.koib_nid; + + rc = lib_init(&koibnal_lib, nal, process_id, + requested_limits, actual_limits); + if (rc != PTL_OK) { + CERROR("lib_init failed: error %d\n", rc); + goto failed; + } + + /* lib interface initialised */ + koibnal_data.koib_init = OPENIBNAL_INIT_LIB; + /*****************************************************/ + + for (i = 0; i < OPENIBNAL_N_SCHED; i++) { + rc = koibnal_thread_start (koibnal_scheduler, (void *)i); + if (rc != 0) { + CERROR("Can't spawn openibnal scheduler[%d]: %d\n", + i, rc); + goto failed; + } + } + + rc = koibnal_thread_start (koibnal_connd, NULL); + if (rc != 0) { + CERROR ("Can't spawn openibnal connd: %d\n", rc); + goto failed; + } + + koibnal_data.koib_device = ib_device_get_by_index(0); + if (koibnal_data.koib_device == NULL) { + CERROR ("Can't open ib device 0\n"); + goto failed; + } + + rc = ib_device_properties_get(koibnal_data.koib_device, + &koibnal_data.koib_device_props); + if (rc != 0) { + CERROR ("Can't get device props: %d\n", rc); + goto failed; + } + + CDEBUG(D_NET, "Max Initiator: %d Max Responder %d\n", + koibnal_data.koib_device_props.max_initiator_per_qp, + koibnal_data.koib_device_props.max_responder_per_qp); + + koibnal_data.koib_port = 0; + for (i = 1; i <= 2; i++) { + rc = ib_port_properties_get(koibnal_data.koib_device, i, + &koibnal_data.koib_port_props); + if (rc == 0) { + koibnal_data.koib_port = i; + break; + } + } + if (koibnal_data.koib_port == 0) { + CERROR ("Can't find a port\n"); + goto failed; + } + + rc = ib_pd_create(koibnal_data.koib_device, + NULL, &koibnal_data.koib_pd); + if (rc != 0) { + CERROR ("Can't create PD: %d\n", rc); + goto failed; + } + + /* flag PD initialised */ + koibnal_data.koib_init = OPENIBNAL_INIT_PD; + /*****************************************************/ +#if OPENIBNAL_FMR + { + const int pool_size = OPENIBNAL_NTX + OPENIBNAL_NTX_NBLK; + struct ib_fmr_pool_param params = { + .max_pages_per_fmr = PTL_MTU/PAGE_SIZE, + .access = (IB_ACCESS_LOCAL_WRITE | + IB_ACCESS_REMOTE_WRITE | + IB_ACCESS_REMOTE_READ), + .pool_size = pool_size, + .dirty_watermark = (pool_size * 3)/4, + .flush_function = NULL, + .flush_arg = NULL, + .cache = 1, + }; + rc = ib_fmr_pool_create(koibnal_data.koib_pd, ¶ms, + &koibnal_data.koib_fmr_pool); + if (rc != 0) { + CERROR ("Can't create FMR pool size %d: %d\n", + pool_size, rc); + goto failed; + } + } + + /* flag FMR pool initialised */ + koibnal_data.koib_init = OPENIBNAL_INIT_FMR; +#endif + /*****************************************************/ + + rc = koibnal_setup_tx_descs(); + if (rc != 0) { + CERROR ("Can't register tx descs: %d\n", rc); + goto failed; + } + + /* flag TX descs initialised */ + koibnal_data.koib_init = OPENIBNAL_INIT_TXD; + /*****************************************************/ + + { + struct ib_cq_callback callback = { + .context = OPENIBNAL_CALLBACK_CTXT, + .policy = IB_CQ_PROVIDER_REARM, + .function = { + .entry = koibnal_rx_callback, + }, + .arg = NULL, + }; + int nentries = OPENIBNAL_RX_CQ_ENTRIES; + + rc = ib_cq_create (koibnal_data.koib_device, + &nentries, &callback, NULL, + &koibnal_data.koib_rx_cq); + if (rc != 0) { + CERROR ("Can't create RX CQ: %d\n", rc); + goto failed; + } + + /* I only want solicited events */ + rc = ib_cq_request_notification(koibnal_data.koib_rx_cq, 1); + LASSERT (rc == 0); + } + + /* flag RX CQ initialised */ + koibnal_data.koib_init = OPENIBNAL_INIT_RX_CQ; + /*****************************************************/ + + { + struct ib_cq_callback callback = { + .context = OPENIBNAL_CALLBACK_CTXT, + .policy = IB_CQ_PROVIDER_REARM, + .function = { + .entry = koibnal_tx_callback, + }, + .arg = NULL, + }; + int nentries = OPENIBNAL_TX_CQ_ENTRIES; + + rc = ib_cq_create (koibnal_data.koib_device, + &nentries, &callback, NULL, + &koibnal_data.koib_tx_cq); + if (rc != 0) { + CERROR ("Can't create RX CQ: %d\n", rc); + goto failed; + } + + /* I only want solicited events */ + rc = ib_cq_request_notification(koibnal_data.koib_tx_cq, 1); + LASSERT (rc == 0); + } + + /* flag TX CQ initialised */ + koibnal_data.koib_init = OPENIBNAL_INIT_TX_CQ; + /*****************************************************/ + + rc = libcfs_nal_cmd_register(OPENIBNAL, &koibnal_cmd, NULL); + if (rc != 0) { + CERROR ("Can't initialise command interface (rc = %d)\n", rc); + goto failed; + } + + /* flag everything initialised */ + koibnal_data.koib_init = OPENIBNAL_INIT_ALL; + /*****************************************************/ + + printk(KERN_INFO "Lustre: OpenIB NAL loaded " + "(initial mem %d)\n", pkmem); + + return (PTL_OK); + + failed: + koibnal_api_shutdown (&koibnal_api); + return (PTL_FAIL); +} + +void __exit +koibnal_module_fini (void) +{ +#ifdef CONFIG_SYSCTL + if (koibnal_tunables.koib_sysctl != NULL) + unregister_sysctl_table (koibnal_tunables.koib_sysctl); +#endif + PtlNIFini(koibnal_ni); + + ptl_unregister_nal(OPENIBNAL); +} + +int __init +koibnal_module_init (void) +{ + int rc; + + /* the following must be sizeof(int) for proc_dointvec() */ + LASSERT(sizeof (koibnal_tunables.koib_io_timeout) == sizeof (int)); + + koibnal_api.nal_ni_init = koibnal_api_startup; + koibnal_api.nal_ni_fini = koibnal_api_shutdown; + + /* Initialise dynamic tunables to defaults once only */ + koibnal_tunables.koib_io_timeout = OPENIBNAL_IO_TIMEOUT; + + rc = ptl_register_nal(OPENIBNAL, &koibnal_api); + if (rc != PTL_OK) { + CERROR("Can't register OPENIBNAL: %d\n", rc); + return (-ENOMEM); /* or something... */ + } + + /* Pure gateways want the NAL started up at module load time... */ + rc = PtlNIInit(OPENIBNAL, LUSTRE_SRV_PTL_PID, NULL, NULL, &koibnal_ni); + if (rc != PTL_OK && rc != PTL_IFACE_DUP) { + ptl_unregister_nal(OPENIBNAL); + return (-ENODEV); + } + +#ifdef CONFIG_SYSCTL + /* Press on regardless even if registering sysctl doesn't work */ + koibnal_tunables.koib_sysctl = + register_sysctl_table (koibnal_top_ctl_table, 0); +#endif + return (0); +} + +MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>"); +MODULE_DESCRIPTION("Kernel OpenIB NAL v0.01"); +MODULE_LICENSE("GPL"); + +module_init(koibnal_module_init); +module_exit(koibnal_module_fini); + diff --git a/lnet/klnds/openiblnd/openiblnd.h b/lnet/klnds/openiblnd/openiblnd.h new file mode 100644 index 0000000000..301d3ae051 --- /dev/null +++ b/lnet/klnds/openiblnd/openiblnd.h @@ -0,0 +1,509 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2004 Cluster File Systems, Inc. + * Author: Eric Barton <eric@bartonsoftware.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. + * + */ + +#ifndef EXPORT_SYMTAB +# define EXPORT_SYMTAB +#endif + +#include <linux/config.h> +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/mm.h> +#include <linux/string.h> +#include <linux/stat.h> +#include <linux/errno.h> +#include <linux/smp_lock.h> +#include <linux/unistd.h> +#include <linux/uio.h> + +#include <asm/system.h> +#include <asm/uaccess.h> +#include <asm/io.h> + +#include <linux/init.h> +#include <linux/fs.h> +#include <linux/file.h> +#include <linux/stat.h> +#include <linux/list.h> +#include <linux/kmod.h> +#include <linux/sysctl.h> + +#define DEBUG_SUBSYSTEM S_OPENIBNAL + +#include <linux/kp30.h> +#include <portals/p30.h> +#include <portals/lib-p30.h> +#include <portals/nal.h> + +#include <ts_ib_core.h> +#include <ts_ib_cm.h> +#include <ts_ib_sa_client.h> + +#define OPENIBNAL_SERVICE_NAME "openibnal" + +#if CONFIG_SMP +# define OPENIBNAL_N_SCHED num_online_cpus() /* # schedulers */ +#else +# define OPENIBNAL_N_SCHED 1 /* # schedulers */ +#endif + +#define OPENIBNAL_MIN_RECONNECT_INTERVAL HZ /* first failed connection retry... */ +#define OPENIBNAL_MAX_RECONNECT_INTERVAL (60*HZ) /* ...exponentially increasing to this */ + +#define OPENIBNAL_MSG_SIZE (4<<10) /* max size of queued messages (inc hdr) */ + +#define OPENIBNAL_MSG_QUEUE_SIZE 8 /* # messages in-flight */ +#define OPENIBNAL_CREDIT_HIGHWATER 6 /* when to eagerly return credits */ +#define OPENIBNAL_RETRY 7 /* # times to retry */ +#define OPENIBNAL_RNR_RETRY 7 /* */ +#define OPENIBNAL_CM_RETRY 7 /* # times to retry connection */ +#define OPENIBNAL_FLOW_CONTROL 1 +#define OPENIBNAL_RESPONDER_RESOURCES 8 + +#define OPENIBNAL_NTX 64 /* # tx descs */ +#define OPENIBNAL_NTX_NBLK 256 /* # reserved tx descs */ + +#define OPENIBNAL_PEER_HASH_SIZE 101 /* # peer lists */ + +#define OPENIBNAL_RESCHED 100 /* # scheduler loops before reschedule */ + +#define OPENIBNAL_CONCURRENT_PEERS 1000 /* # nodes all talking at once to me */ + +/* default vals for runtime tunables */ +#define OPENIBNAL_IO_TIMEOUT 50 /* default comms timeout (seconds) */ + +/************************/ +/* derived constants... */ + +/* TX messages (shared by all connections) */ +#define OPENIBNAL_TX_MSGS (OPENIBNAL_NTX + OPENIBNAL_NTX_NBLK) +#define OPENIBNAL_TX_MSG_BYTES (OPENIBNAL_TX_MSGS * OPENIBNAL_MSG_SIZE) +#define OPENIBNAL_TX_MSG_PAGES ((OPENIBNAL_TX_MSG_BYTES + PAGE_SIZE - 1)/PAGE_SIZE) + +/* we may have up to 2 completions per transmit */ +#define OPENIBNAL_TX_CQ_ENTRIES (2*OPENIBNAL_TX_MSGS) + +/* RX messages (per connection) */ +#define OPENIBNAL_RX_MSGS OPENIBNAL_MSG_QUEUE_SIZE +#define OPENIBNAL_RX_MSG_BYTES (OPENIBNAL_RX_MSGS * OPENIBNAL_MSG_SIZE) +#define OPENIBNAL_RX_MSG_PAGES ((OPENIBNAL_RX_MSG_BYTES + PAGE_SIZE - 1)/PAGE_SIZE) + +/* 1 completion per receive, per connection */ +#define OPENIBNAL_RX_CQ_ENTRIES (OPENIBNAL_RX_MSGS * OPENIBNAL_CONCURRENT_PEERS) + +#define OPENIBNAL_RDMA_BASE 0x0eeb0000 +#define OPENIBNAL_FMR 1 +#define OPENIBNAL_CKSUM 0 +//#define OPENIBNAL_CALLBACK_CTXT IB_CQ_CALLBACK_PROCESS +#define OPENIBNAL_CALLBACK_CTXT IB_CQ_CALLBACK_INTERRUPT + +typedef struct +{ + int koib_io_timeout; /* comms timeout (seconds) */ + struct ctl_table_header *koib_sysctl; /* sysctl interface */ +} koib_tunables_t; + +typedef struct +{ + int oibp_npages; /* # pages */ + int oibp_mapped; /* mapped? */ + __u64 oibp_vaddr; /* mapped region vaddr */ + __u32 oibp_lkey; /* mapped region lkey */ + __u32 oibp_rkey; /* mapped region rkey */ + struct ib_mr *oibp_handle; /* mapped region handle */ + struct page *oibp_pages[0]; +} koib_pages_t; + +typedef struct +{ + int koib_init; /* initialisation state */ + __u64 koib_incarnation; /* which one am I */ + int koib_shutdown; /* shut down? */ + atomic_t koib_nthreads; /* # live threads */ + + __u64 koib_cm_service_id; /* service number I listen on */ + ptl_nid_t koib_nid; /* my NID */ + struct semaphore koib_nid_mutex; /* serialise NID ops */ + struct semaphore koib_nid_signal; /* signal completion */ + + rwlock_t koib_global_lock; /* stabilize peer/conn ops */ + + struct list_head *koib_peers; /* hash table of all my known peers */ + int koib_peer_hash_size; /* size of koib_peers */ + atomic_t koib_npeers; /* # peers extant */ + atomic_t koib_nconns; /* # connections extant */ + + struct list_head koib_connd_conns; /* connections to progress */ + struct list_head koib_connd_peers; /* peers waiting for a connection */ + wait_queue_head_t koib_connd_waitq; /* connection daemons sleep here */ + unsigned long koib_connd_waketime; /* when connd will wake */ + spinlock_t koib_connd_lock; /* serialise */ + + wait_queue_head_t koib_sched_waitq; /* schedulers sleep here */ + struct list_head koib_sched_txq; /* tx requiring attention */ + struct list_head koib_sched_rxq; /* rx requiring attention */ + spinlock_t koib_sched_lock; /* serialise */ + + struct koib_tx *koib_tx_descs; /* all the tx descriptors */ + koib_pages_t *koib_tx_pages; /* premapped tx msg pages */ + + struct list_head koib_idle_txs; /* idle tx descriptors */ + struct list_head koib_idle_nblk_txs; /* idle reserved tx descriptors */ + wait_queue_head_t koib_idle_tx_waitq; /* block here for tx descriptor */ + __u64 koib_next_tx_cookie; /* RDMA completion cookie */ + spinlock_t koib_tx_lock; /* serialise */ + + struct ib_device *koib_device; /* "the" device */ + struct ib_device_properties koib_device_props; /* its properties */ + int koib_port; /* port on the device */ + struct ib_port_properties koib_port_props; /* its properties */ + struct ib_pd *koib_pd; /* protection domain */ +#if OPENIBNAL_FMR + struct ib_fmr_pool *koib_fmr_pool; /* fast memory region pool */ +#endif + struct ib_cq *koib_rx_cq; /* receive completion queue */ + struct ib_cq *koib_tx_cq; /* transmit completion queue */ + void *koib_listen_handle; /* where I listen for connections */ + struct ib_common_attrib_service koib_service; /* SM service */ + +} koib_data_t; + +#define OPENIBNAL_INIT_NOTHING 0 +#define OPENIBNAL_INIT_DATA 1 +#define OPENIBNAL_INIT_LIB 2 +#define OPENIBNAL_INIT_PD 3 +#define OPENIBNAL_INIT_FMR 4 +#define OPENIBNAL_INIT_TXD 5 +#define OPENIBNAL_INIT_RX_CQ 6 +#define OPENIBNAL_INIT_TX_CQ 7 +#define OPENIBNAL_INIT_ALL 8 + +/************************************************************************ + * Wire message structs. + * These are sent in sender's byte order (i.e. receiver flips). + * CAVEAT EMPTOR: other structs communicated between nodes (e.g. MAD + * private data and SM service info), is LE on the wire. + */ + +typedef struct +{ + union { + struct ib_mr *mr; + struct ib_fmr *fmr; + } md_handle; + __u32 md_lkey; + __u32 md_rkey; + __u64 md_addr; +} koib_md_t; + +typedef struct +{ + __u32 rd_key; /* remote key */ + __u32 rd_nob; /* # of bytes */ + __u64 rd_addr; /* remote io vaddr */ +} koib_rdma_desc_t; + + +typedef struct +{ + ptl_hdr_t oibim_hdr; /* portals header */ + char oibim_payload[0]; /* piggy-backed payload */ +} koib_immediate_msg_t; + +typedef struct +{ + ptl_hdr_t oibrm_hdr; /* portals header */ + __u64 oibrm_cookie; /* opaque completion cookie */ + koib_rdma_desc_t oibrm_desc; /* where to suck/blow */ +} koib_rdma_msg_t; + +typedef struct +{ + __u64 oibcm_cookie; /* opaque completion cookie */ + __u32 oibcm_status; /* completion status */ +} koib_completion_msg_t; + +typedef struct +{ + __u32 oibm_magic; /* I'm an openibnal message */ + __u16 oibm_version; /* this is my version number */ + __u8 oibm_type; /* msg type */ + __u8 oibm_credits; /* returned credits */ +#if OPENIBNAL_CKSUM + __u32 oibm_nob; + __u32 oibm_cksum; +#endif + union { + koib_immediate_msg_t immediate; + koib_rdma_msg_t rdma; + koib_completion_msg_t completion; + } oibm_u; +} koib_msg_t; + +#define OPENIBNAL_MSG_MAGIC 0x0be91b91 /* unique magic */ +#define OPENIBNAL_MSG_VERSION 1 /* current protocol version */ + +#define OPENIBNAL_MSG_NOOP 0xd0 /* nothing (just credits) */ +#define OPENIBNAL_MSG_IMMEDIATE 0xd1 /* portals hdr + payload */ +#define OPENIBNAL_MSG_PUT_RDMA 0xd2 /* portals PUT hdr + source rdma desc */ +#define OPENIBNAL_MSG_PUT_DONE 0xd3 /* signal PUT rdma completion */ +#define OPENIBNAL_MSG_GET_RDMA 0xd4 /* portals GET hdr + sink rdma desc */ +#define OPENIBNAL_MSG_GET_DONE 0xd5 /* signal GET rdma completion */ + +/***********************************************************************/ + +typedef struct koib_rx /* receive message */ +{ + struct list_head rx_list; /* queue for attention */ + struct koib_conn *rx_conn; /* owning conn */ + int rx_rdma; /* RDMA completion posted? */ + int rx_posted; /* posted? */ + __u64 rx_vaddr; /* pre-mapped buffer (hca vaddr) */ + koib_msg_t *rx_msg; /* pre-mapped buffer (host vaddr) */ + struct ib_receive_param rx_sp; /* receive work item */ + struct ib_gather_scatter rx_gl; /* and it's memory */ +} koib_rx_t; + +typedef struct koib_tx /* transmit message */ +{ + struct list_head tx_list; /* queue on idle_txs ibc_tx_queue etc. */ + int tx_isnblk; /* I'm reserved for non-blocking sends */ + struct koib_conn *tx_conn; /* owning conn */ + int tx_mapped; /* mapped for RDMA? */ + int tx_sending; /* # tx callbacks outstanding */ + int tx_status; /* completion status */ + int tx_passive_rdma; /* waiting for peer to RDMA? */ + int tx_passive_rdma_wait; /* on ibc_rdma_queue */ + unsigned long tx_passive_rdma_deadline; /* completion deadline */ + __u64 tx_passive_rdma_cookie; /* completion cookie */ + lib_msg_t *tx_libmsg[2]; /* lib msgs to finalize on completion */ + koib_md_t tx_md; /* RDMA mapping (active/passive) */ + __u64 tx_vaddr; /* pre-mapped buffer (hca vaddr) */ + koib_msg_t *tx_msg; /* pre-mapped buffer (host vaddr) */ + int tx_nsp; /* # send work items */ + struct ib_send_param tx_sp[2]; /* send work items... */ + struct ib_gather_scatter tx_gl[2]; /* ...and their memory */ +} koib_tx_t; + +#define KOIB_TX_UNMAPPED 0 +#define KOIB_TX_MAPPED 1 +#define KOIB_TX_MAPPED_FMR 2 + +typedef struct koib_wire_connreq +{ + __u32 wcr_magic; /* I'm an openibnal connreq */ + __u16 wcr_version; /* this is my version number */ + __u16 wcr_queue_depth; /* this is my receive queue size */ + __u64 wcr_nid; /* peer's NID */ + __u64 wcr_incarnation; /* peer's incarnation */ +} koib_wire_connreq_t; + +typedef struct koib_connreq +{ + /* connection-in-progress */ + struct koib_conn *cr_conn; + koib_wire_connreq_t cr_wcr; + __u64 cr_tid; + struct ib_common_attrib_service cr_service; + tTS_IB_GID cr_gid; + struct ib_path_record cr_path; + struct ib_cm_active_param cr_connparam; +} koib_connreq_t; + +typedef struct koib_conn +{ + struct koib_peer *ibc_peer; /* owning peer */ + struct list_head ibc_list; /* stash on peer's conn list */ + __u64 ibc_incarnation; /* which instance of the peer */ + atomic_t ibc_refcount; /* # users */ + int ibc_state; /* what's happening */ + atomic_t ibc_nob; /* # bytes buffered */ + int ibc_nsends_posted; /* # uncompleted sends */ + int ibc_credits; /* # credits I have */ + int ibc_outstanding_credits; /* # credits to return */ + struct list_head ibc_tx_queue; /* send queue */ + struct list_head ibc_rdma_queue; /* tx awaiting RDMA completion */ + spinlock_t ibc_lock; /* serialise */ + koib_rx_t *ibc_rxs; /* the rx descs */ + koib_pages_t *ibc_rx_pages; /* premapped rx msg pages */ + struct ib_qp *ibc_qp; /* queue pair */ + __u32 ibc_qpn; /* queue pair number */ + tTS_IB_CM_COMM_ID ibc_comm_id; /* connection ID? */ + koib_connreq_t *ibc_connreq; /* connection request state */ +} koib_conn_t; + +#define OPENIBNAL_CONN_INIT_NOTHING 0 /* initial state */ +#define OPENIBNAL_CONN_INIT_QP 1 /* ibc_qp set up */ +#define OPENIBNAL_CONN_CONNECTING 2 /* started to connect */ +#define OPENIBNAL_CONN_ESTABLISHED 3 /* connection established */ +#define OPENIBNAL_CONN_DEATHROW 4 /* waiting to be closed */ +#define OPENIBNAL_CONN_ZOMBIE 5 /* waiting to be freed */ + +typedef struct koib_peer +{ + struct list_head ibp_list; /* stash on global peer list */ + struct list_head ibp_connd_list; /* schedule on koib_connd_peers */ + ptl_nid_t ibp_nid; /* who's on the other end(s) */ + atomic_t ibp_refcount; /* # users */ + int ibp_persistence; /* "known" peer refs */ + struct list_head ibp_conns; /* all active connections */ + struct list_head ibp_tx_queue; /* msgs waiting for a conn */ + int ibp_connecting; /* connecting+accepting */ + unsigned long ibp_reconnect_time; /* when reconnect may be attempted */ + unsigned long ibp_reconnect_interval; /* exponential backoff */ +} koib_peer_t; + + +extern lib_nal_t koibnal_lib; +extern koib_data_t koibnal_data; +extern koib_tunables_t koibnal_tunables; + +static inline struct list_head * +koibnal_nid2peerlist (ptl_nid_t nid) +{ + unsigned int hash = ((unsigned int)nid) % koibnal_data.koib_peer_hash_size; + + return (&koibnal_data.koib_peers [hash]); +} + +static inline int +koibnal_peer_active(koib_peer_t *peer) +{ + /* Am I in the peer hash table? */ + return (!list_empty(&peer->ibp_list)); +} + +static inline void +koibnal_queue_tx_locked (koib_tx_t *tx, koib_conn_t *conn) +{ + /* CAVEAT EMPTOR: tx takes caller's ref on conn */ + + LASSERT (tx->tx_nsp > 0); /* work items set up */ + LASSERT (tx->tx_conn == NULL); /* only set here */ + + tx->tx_conn = conn; + list_add_tail(&tx->tx_list, &conn->ibc_tx_queue); +} + +#define KOIBNAL_SERVICE_KEY_MASK (IB_SA_SERVICE_COMP_MASK_NAME | \ + IB_SA_SERVICE_COMP_MASK_DATA8_1 | \ + IB_SA_SERVICE_COMP_MASK_DATA8_2 | \ + IB_SA_SERVICE_COMP_MASK_DATA8_3 | \ + IB_SA_SERVICE_COMP_MASK_DATA8_4 | \ + IB_SA_SERVICE_COMP_MASK_DATA8_5 | \ + IB_SA_SERVICE_COMP_MASK_DATA8_6 | \ + IB_SA_SERVICE_COMP_MASK_DATA8_7 | \ + IB_SA_SERVICE_COMP_MASK_DATA8_8) + +static inline __u64* +koibnal_service_nid_field(struct ib_common_attrib_service *srv) +{ + /* must be consistent with KOIBNAL_SERVICE_KEY_MASK */ + return (__u64 *)srv->service_data8; +} + + +static inline void +koibnal_set_service_keys(struct ib_common_attrib_service *srv, ptl_nid_t nid) +{ + LASSERT (strlen (OPENIBNAL_SERVICE_NAME) < sizeof(srv->service_name)); + memset (srv->service_name, 0, sizeof(srv->service_name)); + strcpy (srv->service_name, OPENIBNAL_SERVICE_NAME); + + *koibnal_service_nid_field(srv) = cpu_to_le64(nid); +} + +#if 0 +static inline void +koibnal_show_rdma_attr (koib_conn_t *conn) +{ + struct ib_qp_attribute qp_attr; + int rc; + + memset (&qp_attr, 0, sizeof(qp_attr)); + rc = ib_qp_query(conn->ibc_qp, &qp_attr); + if (rc != 0) { + CERROR ("Can't get qp attrs: %d\n", rc); + return; + } + + CWARN ("RDMA CAPABILITY: write %s read %s\n", + (qp_attr.valid_fields & TS_IB_QP_ATTRIBUTE_RDMA_ATOMIC_ENABLE) ? + (qp_attr.enable_rdma_write ? "enabled" : "disabled") : "invalid", + (qp_attr.valid_fields & TS_IB_QP_ATTRIBUTE_RDMA_ATOMIC_ENABLE) ? + (qp_attr.enable_rdma_read ? "enabled" : "disabled") : "invalid"); +} +#endif + +#if CONFIG_X86 +static inline __u64 +koibnal_page2phys (struct page *p) +{ + __u64 page_number = p - mem_map; + + return (page_number << PAGE_SHIFT); +} +#else +# error "no page->phys" +#endif + +extern koib_peer_t *koibnal_create_peer (ptl_nid_t nid); +extern void koibnal_put_peer (koib_peer_t *peer); +extern int koibnal_del_peer (ptl_nid_t nid, int single_share); +extern koib_peer_t *koibnal_find_peer_locked (ptl_nid_t nid); +extern void koibnal_unlink_peer_locked (koib_peer_t *peer); +extern int koibnal_close_stale_conns_locked (koib_peer_t *peer, + __u64 incarnation); +extern koib_conn_t *koibnal_create_conn (void); +extern void koibnal_put_conn (koib_conn_t *conn); +extern void koibnal_destroy_conn (koib_conn_t *conn); +extern int koibnal_alloc_pages (koib_pages_t **pp, int npages, int access); +extern void koibnal_free_pages (koib_pages_t *p); + +extern void koibnal_check_sends (koib_conn_t *conn); + +extern tTS_IB_CM_CALLBACK_RETURN +koibnal_conn_callback (tTS_IB_CM_EVENT event, tTS_IB_CM_COMM_ID cid, + void *param, void *arg); +extern tTS_IB_CM_CALLBACK_RETURN +koibnal_passive_conn_callback (tTS_IB_CM_EVENT event, tTS_IB_CM_COMM_ID cid, + void *param, void *arg); + +extern void koibnal_close_conn_locked (koib_conn_t *conn, int error); +extern void koibnal_destroy_conn (koib_conn_t *conn); +extern int koibnal_thread_start (int (*fn)(void *arg), void *arg); +extern int koibnal_scheduler(void *arg); +extern int koibnal_connd (void *arg); +extern void koibnal_rx_callback (struct ib_cq *cq, struct ib_cq_entry *e, void *arg); +extern void koibnal_tx_callback (struct ib_cq *cq, struct ib_cq_entry *e, void *arg); +extern void koibnal_init_tx_msg (koib_tx_t *tx, int type, int body_nob); +extern int koibnal_close_conn (koib_conn_t *conn, int why); +extern void koibnal_start_active_rdma (int type, int status, + koib_rx_t *rx, lib_msg_t *libmsg, + unsigned int niov, + struct iovec *iov, ptl_kiov_t *kiov, + size_t offset, size_t nob); + + + + diff --git a/lnet/klnds/openiblnd/openiblnd_cb.c b/lnet/klnds/openiblnd/openiblnd_cb.c new file mode 100644 index 0000000000..79bf37ae34 --- /dev/null +++ b/lnet/klnds/openiblnd/openiblnd_cb.c @@ -0,0 +1,2552 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2004 Cluster File Systems, Inc. + * Author: Eric Barton <eric@bartonsoftware.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. + * + */ + +#include "openibnal.h" + +/* + * LIB functions follow + * + */ +void +koibnal_schedule_tx_done (koib_tx_t *tx) +{ + unsigned long flags; + + spin_lock_irqsave (&koibnal_data.koib_sched_lock, flags); + + list_add_tail(&tx->tx_list, &koibnal_data.koib_sched_txq); + wake_up (&koibnal_data.koib_sched_waitq); + + spin_unlock_irqrestore(&koibnal_data.koib_sched_lock, flags); +} + +void +koibnal_tx_done (koib_tx_t *tx) +{ + ptl_err_t ptlrc = (tx->tx_status == 0) ? PTL_OK : PTL_FAIL; + unsigned long flags; + int i; + int rc; + + LASSERT (tx->tx_sending == 0); /* mustn't be awaiting callback */ + LASSERT (!tx->tx_passive_rdma_wait); /* mustn't be on ibc_rdma_queue */ + + switch (tx->tx_mapped) { + default: + LBUG(); + + case KOIB_TX_UNMAPPED: + break; + + case KOIB_TX_MAPPED: + if (in_interrupt()) { + /* can't deregister memory in IRQ context... */ + koibnal_schedule_tx_done(tx); + return; + } + rc = ib_memory_deregister(tx->tx_md.md_handle.mr); + LASSERT (rc == 0); + tx->tx_mapped = KOIB_TX_UNMAPPED; + break; + +#if OPENIBNAL_FMR + case KOIB_TX_MAPPED_FMR: + if (in_interrupt() && tx->tx_status != 0) { + /* can't flush FMRs in IRQ context... */ + koibnal_schedule_tx_done(tx); + return; + } + + rc = ib_fmr_deregister(tx->tx_md.md_handle.fmr); + LASSERT (rc == 0); + + if (tx->tx_status != 0) + ib_fmr_pool_force_flush(koibnal_data.koib_fmr_pool); + tx->tx_mapped = KOIB_TX_UNMAPPED; + break; +#endif + } + + for (i = 0; i < 2; i++) { + /* tx may have up to 2 libmsgs to finalise */ + if (tx->tx_libmsg[i] == NULL) + continue; + + lib_finalize (&koibnal_lib, NULL, tx->tx_libmsg[i], ptlrc); + tx->tx_libmsg[i] = NULL; + } + + if (tx->tx_conn != NULL) { + koibnal_put_conn (tx->tx_conn); + tx->tx_conn = NULL; + } + + tx->tx_nsp = 0; + tx->tx_passive_rdma = 0; + tx->tx_status = 0; + + spin_lock_irqsave (&koibnal_data.koib_tx_lock, flags); + + if (tx->tx_isnblk) { + list_add_tail (&tx->tx_list, &koibnal_data.koib_idle_nblk_txs); + } else { + list_add_tail (&tx->tx_list, &koibnal_data.koib_idle_txs); + wake_up (&koibnal_data.koib_idle_tx_waitq); + } + + spin_unlock_irqrestore (&koibnal_data.koib_tx_lock, flags); +} + +koib_tx_t * +koibnal_get_idle_tx (int may_block) +{ + unsigned long flags; + koib_tx_t *tx = NULL; + + for (;;) { + spin_lock_irqsave (&koibnal_data.koib_tx_lock, flags); + + /* "normal" descriptor is free */ + if (!list_empty (&koibnal_data.koib_idle_txs)) { + tx = list_entry (koibnal_data.koib_idle_txs.next, + koib_tx_t, tx_list); + break; + } + + if (!may_block) { + /* may dip into reserve pool */ + if (list_empty (&koibnal_data.koib_idle_nblk_txs)) { + CERROR ("reserved tx desc pool exhausted\n"); + break; + } + + tx = list_entry (koibnal_data.koib_idle_nblk_txs.next, + koib_tx_t, tx_list); + break; + } + + /* block for idle tx */ + spin_unlock_irqrestore (&koibnal_data.koib_tx_lock, flags); + + wait_event (koibnal_data.koib_idle_tx_waitq, + !list_empty (&koibnal_data.koib_idle_txs) || + koibnal_data.koib_shutdown); + } + + if (tx != NULL) { + list_del (&tx->tx_list); + + /* Allocate a new passive RDMA completion cookie. It might + * not be needed, but we've got a lock right now and we're + * unlikely to wrap... */ + tx->tx_passive_rdma_cookie = koibnal_data.koib_next_tx_cookie++; + + LASSERT (tx->tx_mapped == KOIB_TX_UNMAPPED); + LASSERT (tx->tx_nsp == 0); + LASSERT (tx->tx_sending == 0); + LASSERT (tx->tx_status == 0); + LASSERT (tx->tx_conn == NULL); + LASSERT (!tx->tx_passive_rdma); + LASSERT (!tx->tx_passive_rdma_wait); + LASSERT (tx->tx_libmsg[0] == NULL); + LASSERT (tx->tx_libmsg[1] == NULL); + } + + spin_unlock_irqrestore (&koibnal_data.koib_tx_lock, flags); + + return (tx); +} + +int +koibnal_dist(lib_nal_t *nal, ptl_nid_t nid, unsigned long *dist) +{ + /* I would guess that if koibnal_get_peer (nid) == NULL, + and we're not routing, then 'nid' is very distant :) */ + if ( nal->libnal_ni.ni_pid.nid == nid ) { + *dist = 0; + } else { + *dist = 1; + } + + return 0; +} + +void +koibnal_complete_passive_rdma(koib_conn_t *conn, __u64 cookie, int status) +{ + struct list_head *ttmp; + unsigned long flags; + int idle; + + spin_lock_irqsave (&conn->ibc_lock, flags); + + list_for_each (ttmp, &conn->ibc_rdma_queue) { + koib_tx_t *tx = list_entry(ttmp, koib_tx_t, tx_list); + + LASSERT (tx->tx_passive_rdma); + LASSERT (tx->tx_passive_rdma_wait); + + if (tx->tx_passive_rdma_cookie != cookie) + continue; + + CDEBUG(D_NET, "Complete %p "LPD64"\n", tx, cookie); + + list_del (&tx->tx_list); + + tx->tx_passive_rdma_wait = 0; + idle = (tx->tx_sending == 0); + + tx->tx_status = status; + + spin_unlock_irqrestore (&conn->ibc_lock, flags); + + /* I could be racing with tx callbacks. It's whoever + * _makes_ tx idle that frees it */ + if (idle) + koibnal_tx_done (tx); + return; + } + + spin_unlock_irqrestore (&conn->ibc_lock, flags); + + CERROR ("Unmatched (late?) RDMA completion "LPX64" from "LPX64"\n", + cookie, conn->ibc_peer->ibp_nid); +} + +void +koibnal_post_rx (koib_rx_t *rx, int do_credits) +{ + koib_conn_t *conn = rx->rx_conn; + int rc; + unsigned long flags; + + rx->rx_gl = (struct ib_gather_scatter) { + .address = rx->rx_vaddr, + .length = OPENIBNAL_MSG_SIZE, + .key = conn->ibc_rx_pages->oibp_lkey, + }; + + rx->rx_sp = (struct ib_receive_param) { + .work_request_id = (__u64)(unsigned long)rx, + .scatter_list = &rx->rx_gl, + .num_scatter_entries = 1, + .device_specific = NULL, + .signaled = 1, + }; + + LASSERT (conn->ibc_state >= OPENIBNAL_CONN_ESTABLISHED); + LASSERT (!rx->rx_posted); + rx->rx_posted = 1; + mb(); + + if (conn->ibc_state != OPENIBNAL_CONN_ESTABLISHED) + rc = -ECONNABORTED; + else + rc = ib_receive (conn->ibc_qp, &rx->rx_sp, 1); + + if (rc == 0) { + if (do_credits) { + spin_lock_irqsave(&conn->ibc_lock, flags); + conn->ibc_outstanding_credits++; + spin_unlock_irqrestore(&conn->ibc_lock, flags); + + koibnal_check_sends(conn); + } + return; + } + + if (conn->ibc_state == OPENIBNAL_CONN_ESTABLISHED) { + CERROR ("Error posting receive -> "LPX64": %d\n", + conn->ibc_peer->ibp_nid, rc); + koibnal_close_conn (rx->rx_conn, rc); + } else { + CDEBUG (D_NET, "Error posting receive -> "LPX64": %d\n", + conn->ibc_peer->ibp_nid, rc); + } + + /* Drop rx's ref */ + koibnal_put_conn (conn); +} + +#if OPENIBNAL_CKSUM +__u32 koibnal_cksum (void *ptr, int nob) +{ + char *c = ptr; + __u32 sum = 0; + + while (nob-- > 0) + sum = ((sum << 1) | (sum >> 31)) + *c++; + + return (sum); +} +#endif + +void +koibnal_rx_callback (struct ib_cq *cq, struct ib_cq_entry *e, void *arg) +{ + koib_rx_t *rx = (koib_rx_t *)((unsigned long)e->work_request_id); + koib_msg_t *msg = rx->rx_msg; + koib_conn_t *conn = rx->rx_conn; + int nob = e->bytes_transferred; + const int base_nob = offsetof(koib_msg_t, oibm_u); + int credits; + int flipped; + unsigned long flags; +#if OPENIBNAL_CKSUM + __u32 msg_cksum; + __u32 computed_cksum; +#endif + + CDEBUG (D_NET, "rx %p conn %p\n", rx, conn); + LASSERT (rx->rx_posted); + rx->rx_posted = 0; + mb(); + + /* receives complete with error in any case after we've started + * closing the QP */ + if (conn->ibc_state >= OPENIBNAL_CONN_DEATHROW) + goto failed; + + /* We don't post receives until the conn is established */ + LASSERT (conn->ibc_state == OPENIBNAL_CONN_ESTABLISHED); + + if (e->status != IB_COMPLETION_STATUS_SUCCESS) { + CERROR("Rx from "LPX64" failed: %d\n", + conn->ibc_peer->ibp_nid, e->status); + goto failed; + } + + if (nob < base_nob) { + CERROR ("Short rx from "LPX64": %d\n", + conn->ibc_peer->ibp_nid, nob); + goto failed; + } + + /* Receiver does any byte flipping if necessary... */ + + if (msg->oibm_magic == OPENIBNAL_MSG_MAGIC) { + flipped = 0; + } else { + if (msg->oibm_magic != __swab32(OPENIBNAL_MSG_MAGIC)) { + CERROR ("Unrecognised magic: %08x from "LPX64"\n", + msg->oibm_magic, conn->ibc_peer->ibp_nid); + goto failed; + } + flipped = 1; + __swab16s (&msg->oibm_version); + LASSERT (sizeof(msg->oibm_type) == 1); + LASSERT (sizeof(msg->oibm_credits) == 1); + } + + if (msg->oibm_version != OPENIBNAL_MSG_VERSION) { + CERROR ("Incompatible msg version %d (%d expected)\n", + msg->oibm_version, OPENIBNAL_MSG_VERSION); + goto failed; + } + +#if OPENIBNAL_CKSUM + if (nob != msg->oibm_nob) { + CERROR ("Unexpected # bytes %d (%d expected)\n", nob, msg->oibm_nob); + goto failed; + } + + msg_cksum = le32_to_cpu(msg->oibm_cksum); + msg->oibm_cksum = 0; + computed_cksum = koibnal_cksum (msg, nob); + + if (msg_cksum != computed_cksum) { + CERROR ("Checksum failure %d: (%d expected)\n", + computed_cksum, msg_cksum); + goto failed; + } + CDEBUG(D_NET, "cksum %x, nob %d\n", computed_cksum, nob); +#endif + + /* Have I received credits that will let me send? */ + credits = msg->oibm_credits; + if (credits != 0) { + spin_lock_irqsave(&conn->ibc_lock, flags); + conn->ibc_credits += credits; + spin_unlock_irqrestore(&conn->ibc_lock, flags); + + koibnal_check_sends(conn); + } + + switch (msg->oibm_type) { + case OPENIBNAL_MSG_NOOP: + koibnal_post_rx (rx, 1); + return; + + case OPENIBNAL_MSG_IMMEDIATE: + if (nob < base_nob + sizeof (koib_immediate_msg_t)) { + CERROR ("Short IMMEDIATE from "LPX64": %d\n", + conn->ibc_peer->ibp_nid, nob); + goto failed; + } + break; + + case OPENIBNAL_MSG_PUT_RDMA: + case OPENIBNAL_MSG_GET_RDMA: + if (nob < base_nob + sizeof (koib_rdma_msg_t)) { + CERROR ("Short RDMA msg from "LPX64": %d\n", + conn->ibc_peer->ibp_nid, nob); + goto failed; + } + if (flipped) { + __swab32s(&msg->oibm_u.rdma.oibrm_desc.rd_key); + __swab32s(&msg->oibm_u.rdma.oibrm_desc.rd_nob); + __swab64s(&msg->oibm_u.rdma.oibrm_desc.rd_addr); + } + CDEBUG(D_NET, "%d RDMA: cookie "LPX64", key %x, addr "LPX64", nob %d\n", + msg->oibm_type, msg->oibm_u.rdma.oibrm_cookie, + msg->oibm_u.rdma.oibrm_desc.rd_key, + msg->oibm_u.rdma.oibrm_desc.rd_addr, + msg->oibm_u.rdma.oibrm_desc.rd_nob); + break; + + case OPENIBNAL_MSG_PUT_DONE: + case OPENIBNAL_MSG_GET_DONE: + if (nob < base_nob + sizeof (koib_completion_msg_t)) { + CERROR ("Short COMPLETION msg from "LPX64": %d\n", + conn->ibc_peer->ibp_nid, nob); + goto failed; + } + if (flipped) + __swab32s(&msg->oibm_u.completion.oibcm_status); + + CDEBUG(D_NET, "%d DONE: cookie "LPX64", status %d\n", + msg->oibm_type, msg->oibm_u.completion.oibcm_cookie, + msg->oibm_u.completion.oibcm_status); + + koibnal_complete_passive_rdma (conn, + msg->oibm_u.completion.oibcm_cookie, + msg->oibm_u.completion.oibcm_status); + koibnal_post_rx (rx, 1); + return; + + default: + CERROR ("Can't parse type from "LPX64": %d\n", + conn->ibc_peer->ibp_nid, msg->oibm_type); + goto failed; + } + + /* schedule for koibnal_rx() in thread context */ + spin_lock_irqsave(&koibnal_data.koib_sched_lock, flags); + + list_add_tail (&rx->rx_list, &koibnal_data.koib_sched_rxq); + wake_up (&koibnal_data.koib_sched_waitq); + + spin_unlock_irqrestore(&koibnal_data.koib_sched_lock, flags); + return; + + failed: + CDEBUG(D_NET, "rx %p conn %p\n", rx, conn); + koibnal_close_conn(conn, -ECONNABORTED); + + /* Don't re-post rx & drop its ref on conn */ + koibnal_put_conn(conn); +} + +void +koibnal_rx (koib_rx_t *rx) +{ + koib_msg_t *msg = rx->rx_msg; + + /* Clear flag so I can detect if I've sent an RDMA completion */ + rx->rx_rdma = 0; + + switch (msg->oibm_type) { + case OPENIBNAL_MSG_GET_RDMA: + lib_parse(&koibnal_lib, &msg->oibm_u.rdma.oibrm_hdr, rx); + /* If the incoming get was matched, I'll have initiated the + * RDMA and the completion message... */ + if (rx->rx_rdma) + break; + + /* Otherwise, I'll send a failed completion now to prevent + * the peer's GET blocking for the full timeout. */ + CERROR ("Completing unmatched RDMA GET from "LPX64"\n", + rx->rx_conn->ibc_peer->ibp_nid); + koibnal_start_active_rdma (OPENIBNAL_MSG_GET_DONE, -EIO, + rx, NULL, 0, NULL, NULL, 0, 0); + break; + + case OPENIBNAL_MSG_PUT_RDMA: + lib_parse(&koibnal_lib, &msg->oibm_u.rdma.oibrm_hdr, rx); + if (rx->rx_rdma) + break; + /* This is most unusual, since even if lib_parse() didn't + * match anything, it should have asked us to read (and + * discard) the payload. The portals header must be + * inconsistent with this message type, so it's the + * sender's fault for sending garbage and she can time + * herself out... */ + CERROR ("Uncompleted RMDA PUT from "LPX64"\n", + rx->rx_conn->ibc_peer->ibp_nid); + break; + + case OPENIBNAL_MSG_IMMEDIATE: + lib_parse(&koibnal_lib, &msg->oibm_u.immediate.oibim_hdr, rx); + LASSERT (!rx->rx_rdma); + break; + + default: + LBUG(); + break; + } + + koibnal_post_rx (rx, 1); +} + +#if 0 +int +koibnal_kvaddr_to_phys (unsigned long vaddr, __u64 *physp) +{ + struct page *page; + + if (vaddr >= VMALLOC_START && + vaddr < VMALLOC_END) + page = vmalloc_to_page ((void *)vaddr); +#if CONFIG_HIGHMEM + else if (vaddr >= PKMAP_BASE && + vaddr < (PKMAP_BASE + LAST_PKMAP * PAGE_SIZE)) + page = vmalloc_to_page ((void *)vaddr); + /* in 2.4 ^ just walks the page tables */ +#endif + else + page = virt_to_page (vaddr); + + if (page == NULL || + !VALID_PAGE (page)) + return (-EFAULT); + + *physp = koibnal_page2phys(page) + (vaddr & (PAGE_SIZE - 1)); + return (0); +} +#endif + +int +koibnal_map_iov (koib_tx_t *tx, enum ib_memory_access access, + int niov, struct iovec *iov, int offset, int nob) + +{ + void *vaddr; + int rc; + + LASSERT (nob > 0); + LASSERT (niov > 0); + LASSERT (tx->tx_mapped == KOIB_TX_UNMAPPED); + + while (offset >= iov->iov_len) { + offset -= iov->iov_len; + niov--; + iov++; + LASSERT (niov > 0); + } + + if (nob > iov->iov_len - offset) { + CERROR ("Can't map multiple vaddr fragments\n"); + return (-EMSGSIZE); + } + + vaddr = (void *)(((unsigned long)iov->iov_base) + offset); + tx->tx_md.md_addr = (__u64)((unsigned long)vaddr); + + rc = ib_memory_register (koibnal_data.koib_pd, + vaddr, nob, + access, + &tx->tx_md.md_handle.mr, + &tx->tx_md.md_lkey, + &tx->tx_md.md_rkey); + + if (rc != 0) { + CERROR ("Can't map vaddr: %d\n", rc); + return (rc); + } + + tx->tx_mapped = KOIB_TX_MAPPED; + return (0); +} + +int +koibnal_map_kiov (koib_tx_t *tx, enum ib_memory_access access, + int nkiov, ptl_kiov_t *kiov, + int offset, int nob) +{ +#if OPENIBNAL_FMR + __u64 *phys; + const int mapped = KOIB_TX_MAPPED_FMR; +#else + struct ib_physical_buffer *phys; + const int mapped = KOIB_TX_MAPPED; +#endif + int page_offset; + int nphys; + int resid; + int phys_size; + int rc; + + CDEBUG(D_NET, "niov %d offset %d nob %d\n", nkiov, offset, nob); + + LASSERT (nob > 0); + LASSERT (nkiov > 0); + LASSERT (tx->tx_mapped == KOIB_TX_UNMAPPED); + + while (offset >= kiov->kiov_len) { + offset -= kiov->kiov_len; + nkiov--; + kiov++; + LASSERT (nkiov > 0); + } + + phys_size = nkiov * sizeof (*phys); + PORTAL_ALLOC(phys, phys_size); + if (phys == NULL) { + CERROR ("Can't allocate tmp phys\n"); + return (-ENOMEM); + } + + page_offset = kiov->kiov_offset + offset; +#if OPENIBNAL_FMR + phys[0] = koibnal_page2phys(kiov->kiov_page); +#else + phys[0].address = koibnal_page2phys(kiov->kiov_page); + phys[0].size = PAGE_SIZE; +#endif + nphys = 1; + resid = nob - (kiov->kiov_len - offset); + + while (resid > 0) { + kiov++; + nkiov--; + LASSERT (nkiov > 0); + + if (kiov->kiov_offset != 0 || + ((resid > PAGE_SIZE) && + kiov->kiov_len < PAGE_SIZE)) { + int i; + /* Can't have gaps */ + CERROR ("Can't make payload contiguous in I/O VM:" + "page %d, offset %d, len %d \n", nphys, + kiov->kiov_offset, kiov->kiov_len); + + for (i = -nphys; i < nkiov; i++) + { + CERROR("kiov[%d] %p +%d for %d\n", + i, kiov[i].kiov_page, kiov[i].kiov_offset, kiov[i].kiov_len); + } + + rc = -EINVAL; + goto out; + } + + if (nphys == PTL_MD_MAX_IOV) { + CERROR ("payload too big (%d)\n", nphys); + rc = -EMSGSIZE; + goto out; + } + + LASSERT (nphys * sizeof (*phys) < phys_size); +#if OPENIBNAL_FMR + phys[nphys] = koibnal_page2phys(kiov->kiov_page); +#else + phys[nphys].address = koibnal_page2phys(kiov->kiov_page); + phys[nphys].size = PAGE_SIZE; +#endif + nphys++; + + resid -= PAGE_SIZE; + } + +#if 0 + CWARN ("nphys %d, nob %d, page_offset %d\n", nphys, nob, page_offset); + for (rc = 0; rc < nphys; rc++) + CWARN (" [%d] "LPX64" / %d\n", rc, phys[rc].address, phys[rc].size); +#endif + tx->tx_md.md_addr = OPENIBNAL_RDMA_BASE; + +#if OPENIBNAL_FMR + rc = ib_fmr_register_physical (koibnal_data.koib_fmr_pool, + phys, nphys, + &tx->tx_md.md_addr, + page_offset, + &tx->tx_md.md_handle.fmr, + &tx->tx_md.md_lkey, + &tx->tx_md.md_rkey); +#else + rc = ib_memory_register_physical (koibnal_data.koib_pd, + phys, nphys, + &tx->tx_md.md_addr, + nob, page_offset, + access, + &tx->tx_md.md_handle.mr, + &tx->tx_md.md_lkey, + &tx->tx_md.md_rkey); +#endif + if (rc == 0) { + CDEBUG(D_NET, "Mapped %d pages %d bytes @ offset %d: lkey %x, rkey %x\n", + nphys, nob, page_offset, tx->tx_md.md_lkey, tx->tx_md.md_rkey); + tx->tx_mapped = mapped; + } else { + CERROR ("Can't map phys: %d\n", rc); + rc = -EFAULT; + } + + out: + PORTAL_FREE(phys, phys_size); + return (rc); +} + +koib_conn_t * +koibnal_find_conn_locked (koib_peer_t *peer) +{ + struct list_head *tmp; + + /* just return the first connection */ + list_for_each (tmp, &peer->ibp_conns) { + return (list_entry(tmp, koib_conn_t, ibc_list)); + } + + return (NULL); +} + +void +koibnal_check_sends (koib_conn_t *conn) +{ + unsigned long flags; + koib_tx_t *tx; + int rc; + int i; + int done; + int nwork; + + spin_lock_irqsave (&conn->ibc_lock, flags); + + if (list_empty(&conn->ibc_tx_queue) && + conn->ibc_outstanding_credits >= OPENIBNAL_CREDIT_HIGHWATER) { + spin_unlock_irqrestore(&conn->ibc_lock, flags); + + tx = koibnal_get_idle_tx(0); /* don't block */ + if (tx != NULL) + koibnal_init_tx_msg(tx, OPENIBNAL_MSG_NOOP, 0); + + spin_lock_irqsave(&conn->ibc_lock, flags); + + if (tx != NULL) { + atomic_inc(&conn->ibc_refcount); + koibnal_queue_tx_locked(tx, conn); + } + } + + LASSERT (conn->ibc_nsends_posted <= OPENIBNAL_MSG_QUEUE_SIZE); + + while (!list_empty (&conn->ibc_tx_queue)) { + tx = list_entry (conn->ibc_tx_queue.next, koib_tx_t, tx_list); + + /* We rely on this for QP sizing */ + LASSERT (tx->tx_nsp > 0 && tx->tx_nsp <= 2); + + LASSERT (conn->ibc_outstanding_credits >= 0); + LASSERT (conn->ibc_outstanding_credits <= OPENIBNAL_MSG_QUEUE_SIZE); + LASSERT (conn->ibc_credits >= 0); + LASSERT (conn->ibc_credits <= OPENIBNAL_MSG_QUEUE_SIZE); + + /* Not on ibc_rdma_queue */ + LASSERT (!tx->tx_passive_rdma_wait); + + if (conn->ibc_nsends_posted == OPENIBNAL_MSG_QUEUE_SIZE) + break; + + if (conn->ibc_credits == 0) /* no credits */ + break; + + if (conn->ibc_credits == 1 && /* last credit reserved for */ + conn->ibc_outstanding_credits == 0) /* giving back credits */ + break; + + list_del (&tx->tx_list); + + if (tx->tx_msg->oibm_type == OPENIBNAL_MSG_NOOP && + (!list_empty(&conn->ibc_tx_queue) || + conn->ibc_outstanding_credits < OPENIBNAL_CREDIT_HIGHWATER)) { + /* Redundant NOOP */ + spin_unlock_irqrestore(&conn->ibc_lock, flags); + koibnal_tx_done(tx); + spin_lock_irqsave(&conn->ibc_lock, flags); + continue; + } + + /* incoming RDMA completion can find this one now */ + if (tx->tx_passive_rdma) { + list_add (&tx->tx_list, &conn->ibc_rdma_queue); + tx->tx_passive_rdma_wait = 1; + tx->tx_passive_rdma_deadline = + jiffies + koibnal_tunables.koib_io_timeout * HZ; + } + + tx->tx_msg->oibm_credits = conn->ibc_outstanding_credits; + conn->ibc_outstanding_credits = 0; + + /* use the free memory barrier when we unlock to ensure + * sending set before we can get the tx callback. */ + conn->ibc_nsends_posted++; + conn->ibc_credits--; + tx->tx_sending = tx->tx_nsp; + +#if OPENIBNAL_CKSUM + tx->tx_msg->oibm_cksum = 0; + tx->tx_msg->oibm_cksum = koibnal_cksum(tx->tx_msg, tx->tx_msg->oibm_nob); + CDEBUG(D_NET, "cksum %x, nob %d\n", tx->tx_msg->oibm_cksum, tx->tx_msg->oibm_nob); +#endif + spin_unlock_irqrestore (&conn->ibc_lock, flags); + + /* NB the gap between removing tx from the queue and sending it + * allows message re-ordering to occur */ + + LASSERT (tx->tx_nsp > 0); + + rc = -ECONNABORTED; + nwork = 0; + if (conn->ibc_state == OPENIBNAL_CONN_ESTABLISHED) { + tx->tx_status = 0; + /* Driver only accepts 1 item at a time */ + for (i = 0; i < tx->tx_nsp; i++) { + rc = ib_send (conn->ibc_qp, &tx->tx_sp[i], 1); + if (rc != 0) + break; + nwork++; + } + } + + spin_lock_irqsave (&conn->ibc_lock, flags); + if (rc != 0) { + /* NB credits are transferred in the actual + * message, which can only be the last work item */ + conn->ibc_outstanding_credits += tx->tx_msg->oibm_credits; + conn->ibc_credits++; + conn->ibc_nsends_posted--; + tx->tx_sending -= tx->tx_nsp - nwork; + tx->tx_status = rc; + done = (tx->tx_sending == 0); + + if (tx->tx_passive_rdma) { + tx->tx_passive_rdma_wait = 0; + list_del (&tx->tx_list); + } + + spin_unlock_irqrestore (&conn->ibc_lock, flags); + + if (conn->ibc_state == OPENIBNAL_CONN_ESTABLISHED) + CERROR ("Error %d posting transmit to "LPX64"\n", + rc, conn->ibc_peer->ibp_nid); + else + CDEBUG (D_NET, "Error %d posting transmit to " + LPX64"\n", rc, conn->ibc_peer->ibp_nid); + + koibnal_close_conn (conn, rc); + + if (done) + koibnal_tx_done (tx); + return; + } + + } + + spin_unlock_irqrestore (&conn->ibc_lock, flags); +} + +void +koibnal_tx_callback (struct ib_cq *cq, struct ib_cq_entry *e, void *arg) +{ + koib_tx_t *tx = (koib_tx_t *)((unsigned long)e->work_request_id); + koib_conn_t *conn; + unsigned long flags; + int idle; + + conn = tx->tx_conn; + LASSERT (conn != NULL); + LASSERT (tx->tx_sending != 0); + + spin_lock_irqsave(&conn->ibc_lock, flags); + + CDEBUG(D_NET, "conn %p tx %p [%d/%d]: %d\n", conn, tx, + tx->tx_nsp - tx->tx_sending, tx->tx_nsp, + e->status); + + /* I could be racing with rdma completion. Whoever makes 'tx' idle + * gets to free it, which also drops its ref on 'conn'. If it's + * not me, then I take an extra ref on conn so it can't disappear + * under me. */ + + tx->tx_sending--; + idle = (tx->tx_sending == 0) && /* This is the final callback */ + (!tx->tx_passive_rdma_wait); /* Not waiting for RDMA completion */ + + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_inc (&conn->ibc_refcount); + + if (tx->tx_sending == 0) + conn->ibc_nsends_posted--; + + if (e->status != IB_COMPLETION_STATUS_SUCCESS && + tx->tx_status == 0) + tx->tx_status = -ECONNABORTED; + + spin_unlock_irqrestore(&conn->ibc_lock, flags); + + if (idle) + koibnal_tx_done (tx); + + if (e->status != IB_COMPLETION_STATUS_SUCCESS) { + CERROR ("Tx completion to "LPX64" failed: %d\n", + conn->ibc_peer->ibp_nid, e->status); + koibnal_close_conn (conn, -ENETDOWN); + } else { + /* can I shovel some more sends out the door? */ + koibnal_check_sends(conn); + } + + koibnal_put_conn (conn); +} + +void +koibnal_init_tx_msg (koib_tx_t *tx, int type, int body_nob) +{ + struct ib_gather_scatter *gl = &tx->tx_gl[tx->tx_nsp]; + struct ib_send_param *sp = &tx->tx_sp[tx->tx_nsp]; + int fence; + int nob = offsetof (koib_msg_t, oibm_u) + body_nob; + + LASSERT (tx->tx_nsp >= 0 && + tx->tx_nsp < sizeof(tx->tx_sp)/sizeof(tx->tx_sp[0])); + LASSERT (nob <= OPENIBNAL_MSG_SIZE); + + tx->tx_msg->oibm_magic = OPENIBNAL_MSG_MAGIC; + tx->tx_msg->oibm_version = OPENIBNAL_MSG_VERSION; + tx->tx_msg->oibm_type = type; +#if OPENIBNAL_CKSUM + tx->tx_msg->oibm_nob = nob; +#endif + /* Fence the message if it's bundled with an RDMA read */ + fence = (tx->tx_nsp > 0) && + (type == OPENIBNAL_MSG_PUT_DONE); + + *gl = (struct ib_gather_scatter) { + .address = tx->tx_vaddr, + .length = nob, + .key = koibnal_data.koib_tx_pages->oibp_lkey, + }; + + /* NB If this is an RDMA read, the completion message must wait for + * the RDMA to complete. Sends wait for previous RDMA writes + * anyway... */ + *sp = (struct ib_send_param) { + .work_request_id = (__u64)((unsigned long)tx), + .op = IB_OP_SEND, + .gather_list = gl, + .num_gather_entries = 1, + .device_specific = NULL, + .solicited_event = 1, + .signaled = 1, + .immediate_data_valid = 0, + .fence = fence, + .inline_data = 0, + }; + + tx->tx_nsp++; +} + +void +koibnal_queue_tx (koib_tx_t *tx, koib_conn_t *conn) +{ + unsigned long flags; + + spin_lock_irqsave(&conn->ibc_lock, flags); + + koibnal_queue_tx_locked (tx, conn); + + spin_unlock_irqrestore(&conn->ibc_lock, flags); + + koibnal_check_sends(conn); +} + +void +koibnal_launch_tx (koib_tx_t *tx, ptl_nid_t nid) +{ + unsigned long flags; + koib_peer_t *peer; + koib_conn_t *conn; + rwlock_t *g_lock = &koibnal_data.koib_global_lock; + + /* If I get here, I've committed to send, so I complete the tx with + * failure on any problems */ + + LASSERT (tx->tx_conn == NULL); /* only set when assigned a conn */ + LASSERT (tx->tx_nsp > 0); /* work items have been set up */ + + read_lock (g_lock); + + peer = koibnal_find_peer_locked (nid); + if (peer == NULL) { + read_unlock (g_lock); + tx->tx_status = -EHOSTUNREACH; + koibnal_tx_done (tx); + return; + } + + conn = koibnal_find_conn_locked (peer); + if (conn != NULL) { + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_inc (&conn->ibc_refcount); /* 1 ref for the tx */ + read_unlock (g_lock); + + koibnal_queue_tx (tx, conn); + return; + } + + /* Making one or more connections; I'll need a write lock... */ + read_unlock (g_lock); + write_lock_irqsave (g_lock, flags); + + peer = koibnal_find_peer_locked (nid); + if (peer == NULL) { + write_unlock_irqrestore (g_lock, flags); + tx->tx_status = -EHOSTUNREACH; + koibnal_tx_done (tx); + return; + } + + conn = koibnal_find_conn_locked (peer); + if (conn != NULL) { + /* Connection exists; queue message on it */ + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_inc (&conn->ibc_refcount); /* 1 ref for the tx */ + write_unlock_irqrestore (g_lock, flags); + + koibnal_queue_tx (tx, conn); + return; + } + + if (peer->ibp_connecting == 0) { + if (!time_after_eq(jiffies, peer->ibp_reconnect_time)) { + write_unlock_irqrestore (g_lock, flags); + tx->tx_status = -EHOSTUNREACH; + koibnal_tx_done (tx); + return; + } + + peer->ibp_connecting = 1; + atomic_inc (&peer->ibp_refcount); /* extra ref for connd */ + + spin_lock (&koibnal_data.koib_connd_lock); + + list_add_tail (&peer->ibp_connd_list, + &koibnal_data.koib_connd_peers); + wake_up (&koibnal_data.koib_connd_waitq); + + spin_unlock (&koibnal_data.koib_connd_lock); + } + + /* A connection is being established; queue the message... */ + list_add_tail (&tx->tx_list, &peer->ibp_tx_queue); + + write_unlock_irqrestore (g_lock, flags); +} + +ptl_err_t +koibnal_start_passive_rdma (int type, ptl_nid_t nid, + lib_msg_t *libmsg, ptl_hdr_t *hdr) +{ + int nob = libmsg->md->length; + koib_tx_t *tx; + koib_msg_t *oibmsg; + int rc; + int access; + + LASSERT (type == OPENIBNAL_MSG_PUT_RDMA || + type == OPENIBNAL_MSG_GET_RDMA); + LASSERT (nob > 0); + LASSERT (!in_interrupt()); /* Mapping could block */ + + if (type == OPENIBNAL_MSG_PUT_RDMA) { + access = IB_ACCESS_REMOTE_READ; + } else { + access = IB_ACCESS_REMOTE_WRITE | + IB_ACCESS_LOCAL_WRITE; + } + + tx = koibnal_get_idle_tx (1); /* May block; caller is an app thread */ + LASSERT (tx != NULL); + + if ((libmsg->md->options & PTL_MD_KIOV) == 0) + rc = koibnal_map_iov (tx, access, + libmsg->md->md_niov, + libmsg->md->md_iov.iov, + 0, nob); + else + rc = koibnal_map_kiov (tx, access, + libmsg->md->md_niov, + libmsg->md->md_iov.kiov, + 0, nob); + + if (rc != 0) { + CERROR ("Can't map RDMA for "LPX64": %d\n", nid, rc); + goto failed; + } + + if (type == OPENIBNAL_MSG_GET_RDMA) { + /* reply gets finalized when tx completes */ + tx->tx_libmsg[1] = lib_create_reply_msg(&koibnal_lib, + nid, libmsg); + if (tx->tx_libmsg[1] == NULL) { + CERROR ("Can't create reply for GET -> "LPX64"\n", + nid); + rc = -ENOMEM; + goto failed; + } + } + + tx->tx_passive_rdma = 1; + + oibmsg = tx->tx_msg; + + oibmsg->oibm_u.rdma.oibrm_hdr = *hdr; + oibmsg->oibm_u.rdma.oibrm_cookie = tx->tx_passive_rdma_cookie; + oibmsg->oibm_u.rdma.oibrm_desc.rd_key = tx->tx_md.md_rkey; + oibmsg->oibm_u.rdma.oibrm_desc.rd_addr = tx->tx_md.md_addr; + oibmsg->oibm_u.rdma.oibrm_desc.rd_nob = nob; + + koibnal_init_tx_msg (tx, type, sizeof (koib_rdma_msg_t)); + + CDEBUG(D_NET, "Passive: %p cookie "LPX64", key %x, addr " + LPX64", nob %d\n", + tx, tx->tx_passive_rdma_cookie, tx->tx_md.md_rkey, + tx->tx_md.md_addr, nob); + + /* libmsg gets finalized when tx completes. */ + tx->tx_libmsg[0] = libmsg; + + koibnal_launch_tx(tx, nid); + return (PTL_OK); + + failed: + tx->tx_status = rc; + koibnal_tx_done (tx); + return (PTL_FAIL); +} + +void +koibnal_start_active_rdma (int type, int status, + koib_rx_t *rx, lib_msg_t *libmsg, + unsigned int niov, + struct iovec *iov, ptl_kiov_t *kiov, + size_t offset, size_t nob) +{ + koib_msg_t *rxmsg = rx->rx_msg; + koib_msg_t *txmsg; + koib_tx_t *tx; + int access; + int rdma_op; + int rc; + + CDEBUG(D_NET, "type %d, status %d, niov %d, offset %d, nob %d\n", + type, status, niov, offset, nob); + + /* Called by scheduler */ + LASSERT (!in_interrupt ()); + + /* Either all pages or all vaddrs */ + LASSERT (!(kiov != NULL && iov != NULL)); + + /* No data if we're completing with failure */ + LASSERT (status == 0 || nob == 0); + + LASSERT (type == OPENIBNAL_MSG_GET_DONE || + type == OPENIBNAL_MSG_PUT_DONE); + + /* Flag I'm completing the RDMA. Even if I fail to send the + * completion message, I will have tried my best so further + * attempts shouldn't be tried. */ + LASSERT (!rx->rx_rdma); + rx->rx_rdma = 1; + + if (type == OPENIBNAL_MSG_GET_DONE) { + access = 0; + rdma_op = IB_OP_RDMA_WRITE; + LASSERT (rxmsg->oibm_type == OPENIBNAL_MSG_GET_RDMA); + } else { + access = IB_ACCESS_LOCAL_WRITE; + rdma_op = IB_OP_RDMA_READ; + LASSERT (rxmsg->oibm_type == OPENIBNAL_MSG_PUT_RDMA); + } + + tx = koibnal_get_idle_tx (0); /* Mustn't block */ + if (tx == NULL) { + CERROR ("tx descs exhausted on RDMA from "LPX64 + " completing locally with failure\n", + rx->rx_conn->ibc_peer->ibp_nid); + lib_finalize (&koibnal_lib, NULL, libmsg, PTL_NO_SPACE); + return; + } + LASSERT (tx->tx_nsp == 0); + + if (nob != 0) { + /* We actually need to transfer some data (the transfer + * size could get truncated to zero when the incoming + * message is matched) */ + + if (kiov != NULL) + rc = koibnal_map_kiov (tx, access, + niov, kiov, offset, nob); + else + rc = koibnal_map_iov (tx, access, + niov, iov, offset, nob); + + if (rc != 0) { + CERROR ("Can't map RDMA -> "LPX64": %d\n", + rx->rx_conn->ibc_peer->ibp_nid, rc); + /* We'll skip the RDMA and complete with failure. */ + status = rc; + nob = 0; + } else { + tx->tx_gl[0] = (struct ib_gather_scatter) { + .address = tx->tx_md.md_addr, + .length = nob, + .key = tx->tx_md.md_lkey, + }; + + tx->tx_sp[0] = (struct ib_send_param) { + .work_request_id = (__u64)((unsigned long)tx), + .op = rdma_op, + .gather_list = &tx->tx_gl[0], + .num_gather_entries = 1, + .remote_address = rxmsg->oibm_u.rdma.oibrm_desc.rd_addr, + .rkey = rxmsg->oibm_u.rdma.oibrm_desc.rd_key, + .device_specific = NULL, + .solicited_event = 0, + .signaled = 1, + .immediate_data_valid = 0, + .fence = 0, + .inline_data = 0, + }; + + tx->tx_nsp = 1; + } + } + + txmsg = tx->tx_msg; + + txmsg->oibm_u.completion.oibcm_cookie = rxmsg->oibm_u.rdma.oibrm_cookie; + txmsg->oibm_u.completion.oibcm_status = status; + + koibnal_init_tx_msg(tx, type, sizeof (koib_completion_msg_t)); + + if (status == 0 && nob != 0) { + LASSERT (tx->tx_nsp > 1); + /* RDMA: libmsg gets finalized when the tx completes. This + * is after the completion message has been sent, which in + * turn is after the RDMA has finished. */ + tx->tx_libmsg[0] = libmsg; + } else { + LASSERT (tx->tx_nsp == 1); + /* No RDMA: local completion happens now! */ + CDEBUG(D_WARNING,"No data: immediate completion\n"); + lib_finalize (&koibnal_lib, NULL, libmsg, + status == 0 ? PTL_OK : PTL_FAIL); + } + + /* +1 ref for this tx... */ + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + rx->rx_conn, rx->rx_conn->ibc_state, + rx->rx_conn->ibc_peer->ibp_nid, + atomic_read (&rx->rx_conn->ibc_refcount)); + atomic_inc (&rx->rx_conn->ibc_refcount); + /* ...and queue it up */ + koibnal_queue_tx(tx, rx->rx_conn); +} + +ptl_err_t +koibnal_sendmsg(lib_nal_t *nal, + void *private, + lib_msg_t *libmsg, + ptl_hdr_t *hdr, + int type, + ptl_nid_t nid, + ptl_pid_t pid, + unsigned int payload_niov, + struct iovec *payload_iov, + ptl_kiov_t *payload_kiov, + size_t payload_offset, + size_t payload_nob) +{ + koib_msg_t *oibmsg; + koib_tx_t *tx; + int nob; + + /* NB 'private' is different depending on what we're sending.... */ + + CDEBUG(D_NET, "sending "LPSZ" bytes in %d frags to nid:"LPX64 + " pid %d\n", payload_nob, payload_niov, nid , pid); + + LASSERT (payload_nob == 0 || payload_niov > 0); + LASSERT (payload_niov <= PTL_MD_MAX_IOV); + + /* Thread context if we're sending payload */ + LASSERT (!in_interrupt() || payload_niov == 0); + /* payload is either all vaddrs or all pages */ + LASSERT (!(payload_kiov != NULL && payload_iov != NULL)); + + switch (type) { + default: + LBUG(); + return (PTL_FAIL); + + case PTL_MSG_REPLY: { + /* reply's 'private' is the incoming receive */ + koib_rx_t *rx = private; + + /* RDMA reply expected? */ + if (rx->rx_msg->oibm_type == OPENIBNAL_MSG_GET_RDMA) { + koibnal_start_active_rdma(OPENIBNAL_MSG_GET_DONE, 0, + rx, libmsg, payload_niov, + payload_iov, payload_kiov, + payload_offset, payload_nob); + return (PTL_OK); + } + + /* Incoming message consistent with immediate reply? */ + if (rx->rx_msg->oibm_type != OPENIBNAL_MSG_IMMEDIATE) { + CERROR ("REPLY to "LPX64" bad opbm type %d!!!\n", + nid, rx->rx_msg->oibm_type); + return (PTL_FAIL); + } + + /* Will it fit in a message? */ + nob = offsetof(koib_msg_t, oibm_u.immediate.oibim_payload[payload_nob]); + if (nob >= OPENIBNAL_MSG_SIZE) { + CERROR("REPLY for "LPX64" too big (RDMA not requested): %d\n", + nid, payload_nob); + return (PTL_FAIL); + } + break; + } + + case PTL_MSG_GET: + /* might the REPLY message be big enough to need RDMA? */ + nob = offsetof(koib_msg_t, oibm_u.immediate.oibim_payload[libmsg->md->length]); + if (nob > OPENIBNAL_MSG_SIZE) + return (koibnal_start_passive_rdma(OPENIBNAL_MSG_GET_RDMA, + nid, libmsg, hdr)); + break; + + case PTL_MSG_ACK: + LASSERT (payload_nob == 0); + break; + + case PTL_MSG_PUT: + /* Is the payload big enough to need RDMA? */ + nob = offsetof(koib_msg_t, oibm_u.immediate.oibim_payload[payload_nob]); + if (nob > OPENIBNAL_MSG_SIZE) + return (koibnal_start_passive_rdma(OPENIBNAL_MSG_PUT_RDMA, + nid, libmsg, hdr)); + + break; + } + + tx = koibnal_get_idle_tx(!(type == PTL_MSG_ACK || + type == PTL_MSG_REPLY || + in_interrupt())); + if (tx == NULL) { + CERROR ("Can't send %d to "LPX64": tx descs exhausted%s\n", + type, nid, in_interrupt() ? " (intr)" : ""); + return (PTL_NO_SPACE); + } + + oibmsg = tx->tx_msg; + oibmsg->oibm_u.immediate.oibim_hdr = *hdr; + + if (payload_nob > 0) { + if (payload_kiov != NULL) + lib_copy_kiov2buf(oibmsg->oibm_u.immediate.oibim_payload, + payload_niov, payload_kiov, + payload_offset, payload_nob); + else + lib_copy_iov2buf(oibmsg->oibm_u.immediate.oibim_payload, + payload_niov, payload_iov, + payload_offset, payload_nob); + } + + koibnal_init_tx_msg (tx, OPENIBNAL_MSG_IMMEDIATE, + offsetof(koib_immediate_msg_t, + oibim_payload[payload_nob])); + + /* libmsg gets finalized when tx completes */ + tx->tx_libmsg[0] = libmsg; + + koibnal_launch_tx(tx, nid); + return (PTL_OK); +} + +ptl_err_t +koibnal_send (lib_nal_t *nal, void *private, lib_msg_t *cookie, + ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid, + unsigned int payload_niov, struct iovec *payload_iov, + size_t payload_offset, size_t payload_len) +{ + return (koibnal_sendmsg(nal, private, cookie, + hdr, type, nid, pid, + payload_niov, payload_iov, NULL, + payload_offset, payload_len)); +} + +ptl_err_t +koibnal_send_pages (lib_nal_t *nal, void *private, lib_msg_t *cookie, + ptl_hdr_t *hdr, int type, ptl_nid_t nid, ptl_pid_t pid, + unsigned int payload_niov, ptl_kiov_t *payload_kiov, + size_t payload_offset, size_t payload_len) +{ + return (koibnal_sendmsg(nal, private, cookie, + hdr, type, nid, pid, + payload_niov, NULL, payload_kiov, + payload_offset, payload_len)); +} + +ptl_err_t +koibnal_recvmsg (lib_nal_t *nal, void *private, lib_msg_t *libmsg, + unsigned int niov, struct iovec *iov, ptl_kiov_t *kiov, + size_t offset, size_t mlen, size_t rlen) +{ + koib_rx_t *rx = private; + koib_msg_t *rxmsg = rx->rx_msg; + int msg_nob; + + LASSERT (mlen <= rlen); + LASSERT (!in_interrupt ()); + /* Either all pages or all vaddrs */ + LASSERT (!(kiov != NULL && iov != NULL)); + + switch (rxmsg->oibm_type) { + default: + LBUG(); + return (PTL_FAIL); + + case OPENIBNAL_MSG_IMMEDIATE: + msg_nob = offsetof(koib_msg_t, oibm_u.immediate.oibim_payload[rlen]); + if (msg_nob > OPENIBNAL_MSG_SIZE) { + CERROR ("Immediate message from "LPX64" too big: %d\n", + rxmsg->oibm_u.immediate.oibim_hdr.src_nid, rlen); + return (PTL_FAIL); + } + + if (kiov != NULL) + lib_copy_buf2kiov(niov, kiov, offset, + rxmsg->oibm_u.immediate.oibim_payload, + mlen); + else + lib_copy_buf2iov(niov, iov, offset, + rxmsg->oibm_u.immediate.oibim_payload, + mlen); + + lib_finalize (nal, NULL, libmsg, PTL_OK); + return (PTL_OK); + + case OPENIBNAL_MSG_GET_RDMA: + /* We get called here just to discard any junk after the + * GET hdr. */ + LASSERT (libmsg == NULL); + lib_finalize (nal, NULL, libmsg, PTL_OK); + return (PTL_OK); + + case OPENIBNAL_MSG_PUT_RDMA: + koibnal_start_active_rdma (OPENIBNAL_MSG_PUT_DONE, 0, + rx, libmsg, + niov, iov, kiov, offset, mlen); + return (PTL_OK); + } +} + +ptl_err_t +koibnal_recv (lib_nal_t *nal, void *private, lib_msg_t *msg, + unsigned int niov, struct iovec *iov, + size_t offset, size_t mlen, size_t rlen) +{ + return (koibnal_recvmsg (nal, private, msg, niov, iov, NULL, + offset, mlen, rlen)); +} + +ptl_err_t +koibnal_recv_pages (lib_nal_t *nal, void *private, lib_msg_t *msg, + unsigned int niov, ptl_kiov_t *kiov, + size_t offset, size_t mlen, size_t rlen) +{ + return (koibnal_recvmsg (nal, private, msg, niov, NULL, kiov, + offset, mlen, rlen)); +} + +int +koibnal_thread_start (int (*fn)(void *arg), void *arg) +{ + long pid = kernel_thread (fn, arg, 0); + + if (pid < 0) + return ((int)pid); + + atomic_inc (&koibnal_data.koib_nthreads); + return (0); +} + +void +koibnal_thread_fini (void) +{ + atomic_dec (&koibnal_data.koib_nthreads); +} + +void +koibnal_close_conn_locked (koib_conn_t *conn, int error) +{ + /* This just does the immmediate housekeeping, and schedules the + * connection for the connd to finish off. + * Caller holds koib_global_lock exclusively in irq context */ + koib_peer_t *peer = conn->ibc_peer; + + CDEBUG (error == 0 ? D_NET : D_ERROR, + "closing conn to "LPX64": error %d\n", peer->ibp_nid, error); + + LASSERT (conn->ibc_state == OPENIBNAL_CONN_ESTABLISHED || + conn->ibc_state == OPENIBNAL_CONN_CONNECTING); + + if (conn->ibc_state == OPENIBNAL_CONN_ESTABLISHED) { + /* koib_connd_conns takes ibc_list's ref */ + list_del (&conn->ibc_list); + } else { + /* new ref for koib_connd_conns */ + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_inc (&conn->ibc_refcount); + } + + if (list_empty (&peer->ibp_conns) && + peer->ibp_persistence == 0) { + /* Non-persistent peer with no more conns... */ + koibnal_unlink_peer_locked (peer); + } + + conn->ibc_state = OPENIBNAL_CONN_DEATHROW; + + /* Schedule conn for closing/destruction */ + spin_lock (&koibnal_data.koib_connd_lock); + + list_add_tail (&conn->ibc_list, &koibnal_data.koib_connd_conns); + wake_up (&koibnal_data.koib_connd_waitq); + + spin_unlock (&koibnal_data.koib_connd_lock); +} + +int +koibnal_close_conn (koib_conn_t *conn, int why) +{ + unsigned long flags; + int count = 0; + + write_lock_irqsave (&koibnal_data.koib_global_lock, flags); + + LASSERT (conn->ibc_state >= OPENIBNAL_CONN_CONNECTING); + + if (conn->ibc_state <= OPENIBNAL_CONN_ESTABLISHED) { + count = 1; + koibnal_close_conn_locked (conn, why); + } + + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + return (count); +} + +void +koibnal_peer_connect_failed (koib_peer_t *peer, int active, int rc) +{ + LIST_HEAD (zombies); + koib_tx_t *tx; + unsigned long flags; + + LASSERT (rc != 0); + LASSERT (peer->ibp_reconnect_interval >= OPENIBNAL_MIN_RECONNECT_INTERVAL); + + write_lock_irqsave (&koibnal_data.koib_global_lock, flags); + + LASSERT (peer->ibp_connecting != 0); + peer->ibp_connecting--; + + if (peer->ibp_connecting != 0) { + /* another connection attempt under way (loopback?)... */ + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + return; + } + + if (list_empty(&peer->ibp_conns)) { + /* Say when active connection can be re-attempted */ + peer->ibp_reconnect_time = jiffies + peer->ibp_reconnect_interval; + /* Increase reconnection interval */ + peer->ibp_reconnect_interval = MIN (peer->ibp_reconnect_interval * 2, + OPENIBNAL_MAX_RECONNECT_INTERVAL); + + /* Take peer's blocked blocked transmits; I'll complete + * them with error */ + while (!list_empty (&peer->ibp_tx_queue)) { + tx = list_entry (peer->ibp_tx_queue.next, + koib_tx_t, tx_list); + + list_del (&tx->tx_list); + list_add_tail (&tx->tx_list, &zombies); + } + + if (koibnal_peer_active(peer) && + (peer->ibp_persistence == 0)) { + /* failed connection attempt on non-persistent peer */ + koibnal_unlink_peer_locked (peer); + } + } else { + /* Can't have blocked transmits if there are connections */ + LASSERT (list_empty(&peer->ibp_tx_queue)); + } + + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + + if (!list_empty (&zombies)) + CERROR ("Deleting messages for "LPX64": connection failed\n", + peer->ibp_nid); + + while (!list_empty (&zombies)) { + tx = list_entry (zombies.next, koib_tx_t, tx_list); + + list_del (&tx->tx_list); + /* complete now */ + tx->tx_status = -EHOSTUNREACH; + koibnal_tx_done (tx); + } +} + +void +koibnal_connreq_done (koib_conn_t *conn, int active, int status) +{ + int state = conn->ibc_state; + koib_peer_t *peer = conn->ibc_peer; + koib_tx_t *tx; + unsigned long flags; + int rc; + int i; + + /* passive connection has no connreq & vice versa */ + LASSERT (!active == !(conn->ibc_connreq != NULL)); + if (active) { + PORTAL_FREE (conn->ibc_connreq, sizeof (*conn->ibc_connreq)); + conn->ibc_connreq = NULL; + } + + if (state == OPENIBNAL_CONN_CONNECTING) { + /* Install common (active/passive) callback for + * disconnect/idle notification if I got as far as getting + * a CM comm_id */ + rc = tsIbCmCallbackModify(conn->ibc_comm_id, + koibnal_conn_callback, conn); + LASSERT (rc == 0); + } + + write_lock_irqsave (&koibnal_data.koib_global_lock, flags); + + LASSERT (peer->ibp_connecting != 0); + + if (status == 0) { + /* connection established... */ + LASSERT (state == OPENIBNAL_CONN_CONNECTING); + conn->ibc_state = OPENIBNAL_CONN_ESTABLISHED; + + if (!koibnal_peer_active(peer)) { + /* ...but peer deleted meantime */ + status = -ECONNABORTED; + } + } else { + LASSERT (state == OPENIBNAL_CONN_INIT_QP || + state == OPENIBNAL_CONN_CONNECTING); + } + + if (status == 0) { + /* Everything worked! */ + + peer->ibp_connecting--; + + /* +1 ref for ibc_list; caller(== CM)'s ref remains until + * the IB_CM_IDLE callback */ + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_inc (&conn->ibc_refcount); + list_add (&conn->ibc_list, &peer->ibp_conns); + + /* reset reconnect interval for next attempt */ + peer->ibp_reconnect_interval = OPENIBNAL_MIN_RECONNECT_INTERVAL; + + /* post blocked sends to the new connection */ + spin_lock (&conn->ibc_lock); + + while (!list_empty (&peer->ibp_tx_queue)) { + tx = list_entry (peer->ibp_tx_queue.next, + koib_tx_t, tx_list); + + list_del (&tx->tx_list); + + /* +1 ref for each tx */ + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_inc (&conn->ibc_refcount); + koibnal_queue_tx_locked (tx, conn); + } + + spin_unlock (&conn->ibc_lock); + + /* Nuke any dangling conns from a different peer instance... */ + koibnal_close_stale_conns_locked (conn->ibc_peer, + conn->ibc_incarnation); + + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + + /* queue up all the receives */ + for (i = 0; i < OPENIBNAL_RX_MSGS; i++) { + /* +1 ref for rx desc */ + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_inc (&conn->ibc_refcount); + + CDEBUG(D_NET, "RX[%d] %p->%p - "LPX64"\n", + i, &conn->ibc_rxs[i], conn->ibc_rxs[i].rx_msg, + conn->ibc_rxs[i].rx_vaddr); + + koibnal_post_rx (&conn->ibc_rxs[i], 0); + } + + koibnal_check_sends (conn); + return; + } + + /* connection failed */ + if (state == OPENIBNAL_CONN_CONNECTING) { + /* schedule for connd to close */ + koibnal_close_conn_locked (conn, status); + } else { + /* Don't have a CM comm_id; just wait for refs to drain */ + conn->ibc_state = OPENIBNAL_CONN_ZOMBIE; + } + + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + + koibnal_peer_connect_failed (conn->ibc_peer, active, status); + + if (state != OPENIBNAL_CONN_CONNECTING) { + /* drop caller's ref if we're not waiting for the + * IB_CM_IDLE callback */ + koibnal_put_conn (conn); + } +} + +int +koibnal_accept (koib_conn_t **connp, tTS_IB_CM_COMM_ID cid, + ptl_nid_t nid, __u64 incarnation, int queue_depth) +{ + koib_conn_t *conn = koibnal_create_conn(); + koib_peer_t *peer; + koib_peer_t *peer2; + unsigned long flags; + + if (conn == NULL) + return (-ENOMEM); + + if (queue_depth != OPENIBNAL_MSG_QUEUE_SIZE) { + CERROR("Can't accept "LPX64": bad queue depth %d (%d expected)\n", + nid, queue_depth, OPENIBNAL_MSG_QUEUE_SIZE); + return (-EPROTO); + } + + /* assume 'nid' is a new peer */ + peer = koibnal_create_peer (nid); + if (peer == NULL) { + CDEBUG(D_NET, "--conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, conn->ibc_peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + atomic_dec (&conn->ibc_refcount); + koibnal_destroy_conn(conn); + return (-ENOMEM); + } + + write_lock_irqsave (&koibnal_data.koib_global_lock, flags); + + peer2 = koibnal_find_peer_locked(nid); + if (peer2 == NULL) { + /* peer table takes my ref on peer */ + list_add_tail (&peer->ibp_list, + koibnal_nid2peerlist(nid)); + } else { + koibnal_put_peer (peer); + peer = peer2; + } + + /* +1 ref for conn */ + atomic_inc (&peer->ibp_refcount); + peer->ibp_connecting++; + + write_unlock_irqrestore (&koibnal_data.koib_global_lock, flags); + + conn->ibc_peer = peer; + conn->ibc_state = OPENIBNAL_CONN_CONNECTING; + conn->ibc_comm_id = cid; + conn->ibc_incarnation = incarnation; + conn->ibc_credits = OPENIBNAL_MSG_QUEUE_SIZE; + + *connp = conn; + return (0); +} + +tTS_IB_CM_CALLBACK_RETURN +koibnal_idle_conn_callback (tTS_IB_CM_EVENT event, + tTS_IB_CM_COMM_ID cid, + void *param, + void *arg) +{ + /* Shouldn't ever get a callback after TS_IB_CM_IDLE */ + CERROR ("Unexpected event %d: conn %p\n", event, arg); + LBUG (); + return TS_IB_CM_CALLBACK_PROCEED; +} + +tTS_IB_CM_CALLBACK_RETURN +koibnal_conn_callback (tTS_IB_CM_EVENT event, + tTS_IB_CM_COMM_ID cid, + void *param, + void *arg) +{ + koib_conn_t *conn = arg; + int rc; + + /* Established Connection Notifier */ + + switch (event) { + default: + CERROR("Connection %p -> "LPX64" ERROR %d\n", + conn, conn->ibc_peer->ibp_nid, event); + koibnal_close_conn (conn, -ECONNABORTED); + break; + + case TS_IB_CM_DISCONNECTED: + CDEBUG(D_WARNING, "Connection %p -> "LPX64" DISCONNECTED.\n", + conn, conn->ibc_peer->ibp_nid); + koibnal_close_conn (conn, 0); + break; + + case TS_IB_CM_IDLE: + CDEBUG(D_NET, "Connection %p -> "LPX64" IDLE.\n", + conn, conn->ibc_peer->ibp_nid); + koibnal_put_conn (conn); /* Lose CM's ref */ + + /* LASSERT (no further callbacks) */ + rc = tsIbCmCallbackModify(cid, + koibnal_idle_conn_callback, conn); + LASSERT (rc == 0); + break; + } + + return TS_IB_CM_CALLBACK_PROCEED; +} + +tTS_IB_CM_CALLBACK_RETURN +koibnal_passive_conn_callback (tTS_IB_CM_EVENT event, + tTS_IB_CM_COMM_ID cid, + void *param, + void *arg) +{ + koib_conn_t *conn = arg; + int rc; + + switch (event) { + default: + if (conn == NULL) { + /* no connection yet */ + CERROR ("Unexpected event: %d\n", event); + return TS_IB_CM_CALLBACK_ABORT; + } + + CERROR ("Unexpected event %p -> "LPX64": %d\n", + conn, conn->ibc_peer->ibp_nid, event); + koibnal_connreq_done (conn, 0, -ECONNABORTED); + break; + + case TS_IB_CM_REQ_RECEIVED: { + struct ib_cm_req_received_param *req = param; + koib_wire_connreq_t *wcr = req->remote_private_data; + + LASSERT (conn == NULL); + + CDEBUG(D_NET, "REQ from "LPX64"\n", le64_to_cpu(wcr->wcr_nid)); + + if (req->remote_private_data_len < sizeof (*wcr)) { + CERROR("Connect from remote LID %04x: too short %d\n", + req->dlid, req->remote_private_data_len); + return TS_IB_CM_CALLBACK_ABORT; + } + + if (wcr->wcr_magic != cpu_to_le32(OPENIBNAL_MSG_MAGIC)) { + CERROR ("Can't accept LID %04x: bad magic %08x\n", + req->dlid, le32_to_cpu(wcr->wcr_magic)); + return TS_IB_CM_CALLBACK_ABORT; + } + + if (wcr->wcr_version != cpu_to_le16(OPENIBNAL_MSG_VERSION)) { + CERROR ("Can't accept LID %04x: bad version %d\n", + req->dlid, le16_to_cpu(wcr->wcr_magic)); + return TS_IB_CM_CALLBACK_ABORT; + } + + rc = koibnal_accept(&conn, + cid, + le64_to_cpu(wcr->wcr_nid), + le64_to_cpu(wcr->wcr_incarnation), + le16_to_cpu(wcr->wcr_queue_depth)); + if (rc != 0) { + CERROR ("Can't accept "LPX64": %d\n", + le64_to_cpu(wcr->wcr_nid), rc); + return TS_IB_CM_CALLBACK_ABORT; + } + + /* update 'arg' for next callback */ + rc = tsIbCmCallbackModify(cid, + koibnal_passive_conn_callback, conn); + LASSERT (rc == 0); + + req->accept_param.qp = conn->ibc_qp; + *((koib_wire_connreq_t *)req->accept_param.reply_private_data) + = (koib_wire_connreq_t) { + .wcr_magic = cpu_to_le32(OPENIBNAL_MSG_MAGIC), + .wcr_version = cpu_to_le16(OPENIBNAL_MSG_VERSION), + .wcr_queue_depth = cpu_to_le32(OPENIBNAL_MSG_QUEUE_SIZE), + .wcr_nid = cpu_to_le64(koibnal_data.koib_nid), + .wcr_incarnation = cpu_to_le64(koibnal_data.koib_incarnation), + }; + req->accept_param.reply_private_data_len = sizeof(koib_wire_connreq_t); + req->accept_param.responder_resources = OPENIBNAL_RESPONDER_RESOURCES; + req->accept_param.initiator_depth = OPENIBNAL_RESPONDER_RESOURCES; + req->accept_param.rnr_retry_count = OPENIBNAL_RNR_RETRY; + req->accept_param.flow_control = OPENIBNAL_FLOW_CONTROL; + + CDEBUG(D_NET, "Proceeding\n"); + break; + } + + case TS_IB_CM_ESTABLISHED: + LASSERT (conn != NULL); + CDEBUG(D_WARNING, "Connection %p -> "LPX64" ESTABLISHED.\n", + conn, conn->ibc_peer->ibp_nid); + + koibnal_connreq_done (conn, 0, 0); + break; + } + + /* NB if the connreq is done, we switch to koibnal_conn_callback */ + return TS_IB_CM_CALLBACK_PROCEED; +} + +tTS_IB_CM_CALLBACK_RETURN +koibnal_active_conn_callback (tTS_IB_CM_EVENT event, + tTS_IB_CM_COMM_ID cid, + void *param, + void *arg) +{ + koib_conn_t *conn = arg; + + switch (event) { + case TS_IB_CM_REP_RECEIVED: { + struct ib_cm_rep_received_param *rep = param; + koib_wire_connreq_t *wcr = rep->remote_private_data; + + if (rep->remote_private_data_len < sizeof (*wcr)) { + CERROR ("Short reply from "LPX64": %d\n", + conn->ibc_peer->ibp_nid, + rep->remote_private_data_len); + koibnal_connreq_done (conn, 1, -EPROTO); + break; + } + + if (wcr->wcr_magic != cpu_to_le32(OPENIBNAL_MSG_MAGIC)) { + CERROR ("Can't connect "LPX64": bad magic %08x\n", + conn->ibc_peer->ibp_nid, le32_to_cpu(wcr->wcr_magic)); + koibnal_connreq_done (conn, 1, -EPROTO); + break; + } + + if (wcr->wcr_version != cpu_to_le16(OPENIBNAL_MSG_VERSION)) { + CERROR ("Can't connect "LPX64": bad version %d\n", + conn->ibc_peer->ibp_nid, le16_to_cpu(wcr->wcr_magic)); + koibnal_connreq_done (conn, 1, -EPROTO); + break; + } + + if (wcr->wcr_queue_depth != cpu_to_le16(OPENIBNAL_MSG_QUEUE_SIZE)) { + CERROR ("Can't connect "LPX64": bad queue depth %d\n", + conn->ibc_peer->ibp_nid, le16_to_cpu(wcr->wcr_queue_depth)); + koibnal_connreq_done (conn, 1, -EPROTO); + break; + } + + if (le64_to_cpu(wcr->wcr_nid) != conn->ibc_peer->ibp_nid) { + CERROR ("Unexpected NID "LPX64" from "LPX64"\n", + le64_to_cpu(wcr->wcr_nid), conn->ibc_peer->ibp_nid); + koibnal_connreq_done (conn, 1, -EPROTO); + break; + } + + CDEBUG(D_NET, "Connection %p -> "LPX64" REP_RECEIVED.\n", + conn, conn->ibc_peer->ibp_nid); + + conn->ibc_incarnation = le64_to_cpu(wcr->wcr_incarnation); + conn->ibc_credits = OPENIBNAL_MSG_QUEUE_SIZE; + break; + } + + case TS_IB_CM_ESTABLISHED: + CDEBUG(D_WARNING, "Connection %p -> "LPX64" Established\n", + conn, conn->ibc_peer->ibp_nid); + + koibnal_connreq_done (conn, 1, 0); + break; + + case TS_IB_CM_IDLE: + CERROR("Connection %p -> "LPX64" IDLE\n", + conn, conn->ibc_peer->ibp_nid); + /* Back out state change: I'm disengaged from CM */ + conn->ibc_state = OPENIBNAL_CONN_INIT_QP; + + koibnal_connreq_done (conn, 1, -ECONNABORTED); + break; + + default: + CERROR("Connection %p -> "LPX64" ERROR %d\n", + conn, conn->ibc_peer->ibp_nid, event); + koibnal_connreq_done (conn, 1, -ECONNABORTED); + break; + } + + /* NB if the connreq is done, we switch to koibnal_conn_callback */ + return TS_IB_CM_CALLBACK_PROCEED; +} + +int +koibnal_pathreq_callback (tTS_IB_CLIENT_QUERY_TID tid, int status, + struct ib_path_record *resp, int remaining, + void *arg) +{ + koib_conn_t *conn = arg; + + if (status != 0) { + CERROR ("status %d\n", status); + koibnal_connreq_done (conn, 1, status); + goto out; + } + + conn->ibc_connreq->cr_path = *resp; + + conn->ibc_connreq->cr_wcr = (koib_wire_connreq_t) { + .wcr_magic = cpu_to_le32(OPENIBNAL_MSG_MAGIC), + .wcr_version = cpu_to_le16(OPENIBNAL_MSG_VERSION), + .wcr_queue_depth = cpu_to_le16(OPENIBNAL_MSG_QUEUE_SIZE), + .wcr_nid = cpu_to_le64(koibnal_data.koib_nid), + .wcr_incarnation = cpu_to_le64(koibnal_data.koib_incarnation), + }; + + conn->ibc_connreq->cr_connparam = (struct ib_cm_active_param) { + .qp = conn->ibc_qp, + .req_private_data = &conn->ibc_connreq->cr_wcr, + .req_private_data_len = sizeof(conn->ibc_connreq->cr_wcr), + .responder_resources = OPENIBNAL_RESPONDER_RESOURCES, + .initiator_depth = OPENIBNAL_RESPONDER_RESOURCES, + .retry_count = OPENIBNAL_RETRY, + .rnr_retry_count = OPENIBNAL_RNR_RETRY, + .cm_response_timeout = koibnal_tunables.koib_io_timeout, + .max_cm_retries = OPENIBNAL_CM_RETRY, + .flow_control = OPENIBNAL_FLOW_CONTROL, + }; + + /* XXX set timeout just like SDP!!!*/ + conn->ibc_connreq->cr_path.packet_life = 13; + + /* Flag I'm getting involved with the CM... */ + conn->ibc_state = OPENIBNAL_CONN_CONNECTING; + + CDEBUG(D_NET, "Connecting to, service id "LPX64", on "LPX64"\n", + conn->ibc_connreq->cr_service.service_id, + *koibnal_service_nid_field(&conn->ibc_connreq->cr_service)); + + /* koibnal_connect_callback gets my conn ref */ + status = ib_cm_connect (&conn->ibc_connreq->cr_connparam, + &conn->ibc_connreq->cr_path, NULL, + conn->ibc_connreq->cr_service.service_id, 0, + koibnal_active_conn_callback, conn, + &conn->ibc_comm_id); + if (status != 0) { + CERROR ("Connect: %d\n", status); + /* Back out state change: I've not got a CM comm_id yet... */ + conn->ibc_state = OPENIBNAL_CONN_INIT_QP; + koibnal_connreq_done (conn, 1, status); + } + + out: + /* return non-zero to prevent further callbacks */ + return 1; +} + +void +koibnal_service_get_callback (tTS_IB_CLIENT_QUERY_TID tid, int status, + struct ib_common_attrib_service *resp, void *arg) +{ + koib_conn_t *conn = arg; + + if (status != 0) { + CERROR ("status %d\n", status); + koibnal_connreq_done (conn, 1, status); + return; + } + + CDEBUG(D_NET, "Got status %d, service id "LPX64", on "LPX64"\n", + status, resp->service_id, + *koibnal_service_nid_field(resp)); + + conn->ibc_connreq->cr_service = *resp; + + status = ib_cached_gid_get(koibnal_data.koib_device, + koibnal_data.koib_port, 0, + conn->ibc_connreq->cr_gid); + LASSERT (status == 0); + + /* koibnal_pathreq_callback gets my conn ref */ + status = tsIbPathRecordRequest (koibnal_data.koib_device, + koibnal_data.koib_port, + conn->ibc_connreq->cr_gid, + conn->ibc_connreq->cr_service.service_gid, + conn->ibc_connreq->cr_service.service_pkey, + 0, + koibnal_tunables.koib_io_timeout * HZ, + 0, + koibnal_pathreq_callback, conn, + &conn->ibc_connreq->cr_tid); + + if (status == 0) + return; + + CERROR ("Path record request: %d\n", status); + koibnal_connreq_done (conn, 1, status); +} + +void +koibnal_connect_peer (koib_peer_t *peer) +{ + koib_conn_t *conn = koibnal_create_conn(); + int rc; + + LASSERT (peer->ibp_connecting != 0); + + if (conn == NULL) { + CERROR ("Can't allocate conn\n"); + koibnal_peer_connect_failed (peer, 1, -ENOMEM); + return; + } + + conn->ibc_peer = peer; + atomic_inc (&peer->ibp_refcount); + + PORTAL_ALLOC (conn->ibc_connreq, sizeof (*conn->ibc_connreq)); + if (conn->ibc_connreq == NULL) { + CERROR ("Can't allocate connreq\n"); + koibnal_connreq_done (conn, 1, -ENOMEM); + return; + } + + memset(conn->ibc_connreq, 0, sizeof (*conn->ibc_connreq)); + + koibnal_set_service_keys(&conn->ibc_connreq->cr_service, peer->ibp_nid); + + /* koibnal_service_get_callback gets my conn ref */ + rc = ib_service_get (koibnal_data.koib_device, + koibnal_data.koib_port, + &conn->ibc_connreq->cr_service, + KOIBNAL_SERVICE_KEY_MASK, + koibnal_tunables.koib_io_timeout * HZ, + koibnal_service_get_callback, conn, + &conn->ibc_connreq->cr_tid); + + if (rc == 0) + return; + + CERROR ("ib_service_get: %d\n", rc); + koibnal_connreq_done (conn, 1, rc); +} + +int +koibnal_conn_timed_out (koib_conn_t *conn) +{ + koib_tx_t *tx; + struct list_head *ttmp; + unsigned long flags; + int rc = 0; + + spin_lock_irqsave (&conn->ibc_lock, flags); + + list_for_each (ttmp, &conn->ibc_rdma_queue) { + tx = list_entry (ttmp, koib_tx_t, tx_list); + + LASSERT (tx->tx_passive_rdma); + LASSERT (tx->tx_passive_rdma_wait); + + if (time_after_eq (jiffies, tx->tx_passive_rdma_deadline)) { + rc = 1; + break; + } + } + spin_unlock_irqrestore (&conn->ibc_lock, flags); + + return rc; +} + +void +koibnal_check_conns (int idx) +{ + struct list_head *peers = &koibnal_data.koib_peers[idx]; + struct list_head *ptmp; + koib_peer_t *peer; + koib_conn_t *conn; + struct list_head *ctmp; + + again: + /* NB. We expect to have a look at all the peers and not find any + * rdmas to time out, so we just use a shared lock while we + * take a look... */ + read_lock (&koibnal_data.koib_global_lock); + + list_for_each (ptmp, peers) { + peer = list_entry (ptmp, koib_peer_t, ibp_list); + + list_for_each (ctmp, &peer->ibp_conns) { + conn = list_entry (ctmp, koib_conn_t, ibc_list); + + LASSERT (conn->ibc_state == OPENIBNAL_CONN_ESTABLISHED); + + /* In case we have enough credits to return via a + * NOOP, but there were no non-blocking tx descs + * free to do it last time... */ + koibnal_check_sends(conn); + + if (!koibnal_conn_timed_out(conn)) + continue; + + CDEBUG(D_NET, "++conn[%p] state %d -> "LPX64" (%d)\n", + conn, conn->ibc_state, peer->ibp_nid, + atomic_read (&conn->ibc_refcount)); + + atomic_inc (&conn->ibc_refcount); + read_unlock (&koibnal_data.koib_global_lock); + + CERROR("Timed out RDMA with "LPX64"\n", + peer->ibp_nid); + + koibnal_close_conn (conn, -ETIMEDOUT); + koibnal_put_conn (conn); + + /* start again now I've dropped the lock */ + goto again; + } + } + + read_unlock (&koibnal_data.koib_global_lock); +} + +void +koibnal_terminate_conn (koib_conn_t *conn) +{ + unsigned long flags; + int rc; + int done; + + CDEBUG(D_NET, "conn %p\n", conn); + LASSERT (conn->ibc_state == OPENIBNAL_CONN_DEATHROW); + conn->ibc_state = OPENIBNAL_CONN_ZOMBIE; + + rc = ib_cm_disconnect (conn->ibc_comm_id); + if (rc != 0) + CERROR ("Error %d disconnecting conn %p -> "LPX64"\n", + rc, conn, conn->ibc_peer->ibp_nid); + + /* complete blocked passive RDMAs */ + spin_lock_irqsave (&conn->ibc_lock, flags); + + while (!list_empty (&conn->ibc_rdma_queue)) { + koib_tx_t *tx = list_entry (conn->ibc_rdma_queue.next, + koib_tx_t, tx_list); + + LASSERT (tx->tx_passive_rdma); + LASSERT (tx->tx_passive_rdma_wait); + + list_del (&tx->tx_list); + + tx->tx_passive_rdma_wait = 0; + done = (tx->tx_sending == 0); + + tx->tx_status = -ECONNABORTED; + + spin_unlock_irqrestore (&conn->ibc_lock, flags); + + if (done) + koibnal_tx_done (tx); + + spin_lock_irqsave (&conn->ibc_lock, flags); + } + + spin_unlock_irqrestore (&conn->ibc_lock, flags); + + /* Complete all blocked transmits */ + koibnal_check_sends(conn); +} + +int +koibnal_connd (void *arg) +{ + wait_queue_t wait; + unsigned long flags; + koib_conn_t *conn; + koib_peer_t *peer; + int timeout; + int i; + int peer_index = 0; + unsigned long deadline = jiffies; + + kportal_daemonize ("koibnal_connd"); + kportal_blockallsigs (); + + init_waitqueue_entry (&wait, current); + + spin_lock_irqsave (&koibnal_data.koib_connd_lock, flags); + + for (;;) { + if (!list_empty (&koibnal_data.koib_connd_conns)) { + conn = list_entry (koibnal_data.koib_connd_conns.next, + koib_conn_t, ibc_list); + list_del (&conn->ibc_list); + + spin_unlock_irqrestore (&koibnal_data.koib_connd_lock, flags); + + switch (conn->ibc_state) { + case OPENIBNAL_CONN_DEATHROW: + LASSERT (conn->ibc_comm_id != TS_IB_CM_COMM_ID_INVALID); + /* Disconnect: conn becomes a zombie in the + * callback and last ref reschedules it + * here... */ + koibnal_terminate_conn(conn); + koibnal_put_conn (conn); + break; + + case OPENIBNAL_CONN_ZOMBIE: + koibnal_destroy_conn (conn); + break; + + default: + CERROR ("Bad conn %p state: %d\n", + conn, conn->ibc_state); + LBUG(); + } + + spin_lock_irqsave (&koibnal_data.koib_connd_lock, flags); + continue; + } + + if (!list_empty (&koibnal_data.koib_connd_peers)) { + peer = list_entry (koibnal_data.koib_connd_peers.next, + koib_peer_t, ibp_connd_list); + + list_del_init (&peer->ibp_connd_list); + spin_unlock_irqrestore (&koibnal_data.koib_connd_lock, flags); + + koibnal_connect_peer (peer); + koibnal_put_peer (peer); + + spin_lock_irqsave (&koibnal_data.koib_connd_lock, flags); + } + + /* shut down and nobody left to reap... */ + if (koibnal_data.koib_shutdown && + atomic_read(&koibnal_data.koib_nconns) == 0) + break; + + spin_unlock_irqrestore (&koibnal_data.koib_connd_lock, flags); + + /* careful with the jiffy wrap... */ + while ((timeout = (int)(deadline - jiffies)) <= 0) { + const int n = 4; + const int p = 1; + int chunk = koibnal_data.koib_peer_hash_size; + + /* Time to check for RDMA timeouts on a few more + * peers: I do checks every 'p' seconds on a + * proportion of the peer table and I need to check + * every connection 'n' times within a timeout + * interval, to ensure I detect a timeout on any + * connection within (n+1)/n times the timeout + * interval. */ + + if (koibnal_tunables.koib_io_timeout > n * p) + chunk = (chunk * n * p) / + koibnal_tunables.koib_io_timeout; + if (chunk == 0) + chunk = 1; + + for (i = 0; i < chunk; i++) { + koibnal_check_conns (peer_index); + peer_index = (peer_index + 1) % + koibnal_data.koib_peer_hash_size; + } + + deadline += p * HZ; + } + + koibnal_data.koib_connd_waketime = jiffies + timeout; + + set_current_state (TASK_INTERRUPTIBLE); + add_wait_queue (&koibnal_data.koib_connd_waitq, &wait); + + if (!koibnal_data.koib_shutdown && + list_empty (&koibnal_data.koib_connd_conns) && + list_empty (&koibnal_data.koib_connd_peers)) + schedule_timeout (timeout); + + set_current_state (TASK_RUNNING); + remove_wait_queue (&koibnal_data.koib_connd_waitq, &wait); + + spin_lock_irqsave (&koibnal_data.koib_connd_lock, flags); + } + + spin_unlock_irqrestore (&koibnal_data.koib_connd_lock, flags); + + koibnal_thread_fini (); + return (0); +} + +int +koibnal_scheduler(void *arg) +{ + long id = (long)arg; + char name[16]; + koib_rx_t *rx; + koib_tx_t *tx; + unsigned long flags; + int rc; + int counter = 0; + int did_something; + + snprintf(name, sizeof(name), "koibnal_sd_%02ld", id); + kportal_daemonize(name); + kportal_blockallsigs(); + + spin_lock_irqsave(&koibnal_data.koib_sched_lock, flags); + + for (;;) { + did_something = 0; + + while (!list_empty(&koibnal_data.koib_sched_txq)) { + tx = list_entry(koibnal_data.koib_sched_txq.next, + koib_tx_t, tx_list); + list_del(&tx->tx_list); + spin_unlock_irqrestore(&koibnal_data.koib_sched_lock, + flags); + koibnal_tx_done(tx); + + spin_lock_irqsave(&koibnal_data.koib_sched_lock, + flags); + } + + if (!list_empty(&koibnal_data.koib_sched_rxq)) { + rx = list_entry(koibnal_data.koib_sched_rxq.next, + koib_rx_t, rx_list); + list_del(&rx->rx_list); + spin_unlock_irqrestore(&koibnal_data.koib_sched_lock, + flags); + + koibnal_rx(rx); + + did_something = 1; + spin_lock_irqsave(&koibnal_data.koib_sched_lock, + flags); + } + + /* shut down and no receives to complete... */ + if (koibnal_data.koib_shutdown && + atomic_read(&koibnal_data.koib_nconns) == 0) + break; + + /* nothing to do or hogging CPU */ + if (!did_something || counter++ == OPENIBNAL_RESCHED) { + spin_unlock_irqrestore(&koibnal_data.koib_sched_lock, + flags); + counter = 0; + + if (!did_something) { + rc = wait_event_interruptible( + koibnal_data.koib_sched_waitq, + !list_empty(&koibnal_data.koib_sched_txq) || + !list_empty(&koibnal_data.koib_sched_rxq) || + (koibnal_data.koib_shutdown && + atomic_read (&koibnal_data.koib_nconns) == 0)); + } else { + our_cond_resched(); + } + + spin_lock_irqsave(&koibnal_data.koib_sched_lock, + flags); + } + } + + spin_unlock_irqrestore(&koibnal_data.koib_sched_lock, flags); + + koibnal_thread_fini(); + return (0); +} + + +lib_nal_t koibnal_lib = { + libnal_data: &koibnal_data, /* NAL private data */ + libnal_send: koibnal_send, + libnal_send_pages: koibnal_send_pages, + libnal_recv: koibnal_recv, + libnal_recv_pages: koibnal_recv_pages, + libnal_dist: koibnal_dist +}; diff --git a/lnet/klnds/qswlnd/qswlnd.c b/lnet/klnds/qswlnd/qswlnd.c index 38d1636166..16123c21f2 100644 --- a/lnet/klnds/qswlnd/qswlnd.c +++ b/lnet/klnds/qswlnd/qswlnd.c @@ -64,6 +64,7 @@ kqswnal_get_tx_desc (struct portals_cfg *pcfg) unsigned long flags; struct list_head *tmp; kqswnal_tx_t *ktx; + ptl_hdr_t *hdr; int index = pcfg->pcfg_count; int rc = -ENOENT; @@ -74,11 +75,12 @@ kqswnal_get_tx_desc (struct portals_cfg *pcfg) continue; ktx = list_entry (tmp, kqswnal_tx_t, ktx_list); + hdr = (ptl_hdr_t *)ktx->ktx_buffer; pcfg->pcfg_pbuf1 = (char *)ktx; - pcfg->pcfg_count = NTOH__u32(ktx->ktx_wire_hdr->type); - pcfg->pcfg_size = NTOH__u32(ktx->ktx_wire_hdr->payload_length); - pcfg->pcfg_nid = NTOH__u64(ktx->ktx_wire_hdr->dest_nid); + pcfg->pcfg_count = le32_to_cpu(hdr->type); + pcfg->pcfg_size = le32_to_cpu(hdr->payload_length); + pcfg->pcfg_nid = le64_to_cpu(hdr->dest_nid); pcfg->pcfg_nid2 = ktx->ktx_nid; pcfg->pcfg_misc = ktx->ktx_launcher; pcfg->pcfg_flags = (list_empty (&ktx->ktx_delayed_list) ? 0 : 1) | @@ -374,7 +376,7 @@ kqswnal_shutdown(nal_t *nal) atomic_read(&portal_kmemory)); } -static int __init +static int kqswnal_startup (nal_t *nal, ptl_pid_t requested_pid, ptl_ni_limits_t *requested_limits, ptl_ni_limits_t *actual_limits) @@ -602,6 +604,9 @@ kqswnal_startup (nal_t *nal, ptl_pid_t requested_pid, INIT_LIST_HEAD (&ktx->ktx_delayed_list); ktx->ktx_state = KTX_IDLE; +#if MULTIRAIL_EKC + ktx->ktx_rail = -1; /* unset rail */ +#endif ktx->ktx_isnblk = (i >= KQSW_NTXMSGS); list_add_tail (&ktx->ktx_list, ktx->ktx_isnblk ? &kqswnal_data.kqn_nblk_idletxds : diff --git a/lnet/klnds/qswlnd/qswlnd.h b/lnet/klnds/qswlnd/qswlnd.h index b085caae96..438edc682f 100644 --- a/lnet/klnds/qswlnd/qswlnd.h +++ b/lnet/klnds/qswlnd/qswlnd.h @@ -187,10 +187,10 @@ typedef struct /* debug/info fields */ pid_t ktx_launcher; /* pid of launching process */ - ptl_hdr_t *ktx_wire_hdr; /* portals header (wire endian) */ int ktx_nfrag; /* # message frags */ #if MULTIRAIL_EKC + int ktx_rail; /* preferred rail */ EP_NMD ktx_ebuffer; /* elan mapping of ktx_buffer */ EP_NMD ktx_frags[EP_MAXFRAG];/* elan mapping of msg frags */ #else diff --git a/lnet/klnds/qswlnd/qswlnd_cb.c b/lnet/klnds/qswlnd/qswlnd_cb.c index e1237a8647..97b5a268f9 100644 --- a/lnet/klnds/qswlnd/qswlnd_cb.c +++ b/lnet/klnds/qswlnd/qswlnd_cb.c @@ -59,6 +59,8 @@ kqswnal_unmap_tx (kqswnal_tx_t *ktx) { #if MULTIRAIL_EKC int i; + + ktx->ktx_rail = -1; /* unset rail */ #endif if (ktx->ktx_nmappedpages == 0) @@ -97,10 +99,13 @@ kqswnal_map_tx_kiov (kqswnal_tx_t *ktx, int offset, int nob, int niov, ptl_kiov_ char *ptr; #if MULTIRAIL_EKC EP_RAILMASK railmask; - int rail = ep_xmtr_prefrail(kqswnal_data.kqn_eptx, - EP_RAILMASK_ALL, - kqswnal_nid2elanid(ktx->ktx_nid)); - + int rail; + + if (ktx->ktx_rail < 0) + ktx->ktx_rail = ep_xmtr_prefrail(kqswnal_data.kqn_eptx, + EP_RAILMASK_ALL, + kqswnal_nid2elanid(ktx->ktx_nid)); + rail = ktx->ktx_rail; if (rail < 0) { CERROR("No rails available for "LPX64"\n", ktx->ktx_nid); return (-ENETDOWN); @@ -215,10 +220,13 @@ kqswnal_map_tx_iov (kqswnal_tx_t *ktx, int offset, int nob, uint32_t basepage = ktx->ktx_basepage + nmapped; #if MULTIRAIL_EKC EP_RAILMASK railmask; - int rail = ep_xmtr_prefrail(kqswnal_data.kqn_eptx, - EP_RAILMASK_ALL, - kqswnal_nid2elanid(ktx->ktx_nid)); + int rail; + if (ktx->ktx_rail < 0) + ktx->ktx_rail = ep_xmtr_prefrail(kqswnal_data.kqn_eptx, + EP_RAILMASK_ALL, + kqswnal_nid2elanid(ktx->ktx_nid)); + rail = ktx->ktx_rail; if (rail < 0) { CERROR("No rails available for "LPX64"\n", ktx->ktx_nid); return (-ENETDOWN); @@ -515,7 +523,7 @@ kqswnal_launch (kqswnal_tx_t *ktx) /* Don't block for transmit descriptor if we're in interrupt context */ int attr = in_interrupt() ? (EP_NO_SLEEP | EP_NO_ALLOC) : 0; int dest = kqswnal_nid2elanid (ktx->ktx_nid); - long flags; + unsigned long flags; int rc; ktx->ktx_launchtime = jiffies; @@ -525,6 +533,11 @@ kqswnal_launch (kqswnal_tx_t *ktx) LASSERT (dest >= 0); /* must be a peer */ +#if MULTIRAIL_EKC + if (ktx->ktx_nmappedpages != 0) + attr = EP_SET_PREFRAIL(attr, ktx->ktx_rail); +#endif + switch (ktx->ktx_state) { case KTX_GETTING: case KTX_PUTTING: @@ -601,42 +614,42 @@ kqswnal_cerror_hdr(ptl_hdr_t * hdr) char *type_str = hdr_type_string (hdr); CERROR("P3 Header at %p of type %s length %d\n", hdr, type_str, - NTOH__u32(hdr->payload_length)); - CERROR(" From nid/pid "LPU64"/%u\n", NTOH__u64(hdr->src_nid), - NTOH__u32(hdr->src_pid)); - CERROR(" To nid/pid "LPU64"/%u\n", NTOH__u64(hdr->dest_nid), - NTOH__u32(hdr->dest_pid)); + le32_to_cpu(hdr->payload_length)); + CERROR(" From nid/pid "LPU64"/%u\n", le64_to_cpu(hdr->src_nid), + le32_to_cpu(hdr->src_pid)); + CERROR(" To nid/pid "LPU64"/%u\n", le64_to_cpu(hdr->dest_nid), + le32_to_cpu(hdr->dest_pid)); - switch (NTOH__u32(hdr->type)) { + switch (le32_to_cpu(hdr->type)) { case PTL_MSG_PUT: CERROR(" Ptl index %d, ack md "LPX64"."LPX64", " "match bits "LPX64"\n", - NTOH__u32 (hdr->msg.put.ptl_index), + le32_to_cpu(hdr->msg.put.ptl_index), hdr->msg.put.ack_wmd.wh_interface_cookie, hdr->msg.put.ack_wmd.wh_object_cookie, - NTOH__u64 (hdr->msg.put.match_bits)); + le64_to_cpu(hdr->msg.put.match_bits)); CERROR(" offset %d, hdr data "LPX64"\n", - NTOH__u32(hdr->msg.put.offset), + le32_to_cpu(hdr->msg.put.offset), hdr->msg.put.hdr_data); break; case PTL_MSG_GET: CERROR(" Ptl index %d, return md "LPX64"."LPX64", " "match bits "LPX64"\n", - NTOH__u32 (hdr->msg.get.ptl_index), + le32_to_cpu(hdr->msg.get.ptl_index), hdr->msg.get.return_wmd.wh_interface_cookie, hdr->msg.get.return_wmd.wh_object_cookie, hdr->msg.get.match_bits); CERROR(" Length %d, src offset %d\n", - NTOH__u32 (hdr->msg.get.sink_length), - NTOH__u32 (hdr->msg.get.src_offset)); + le32_to_cpu(hdr->msg.get.sink_length), + le32_to_cpu(hdr->msg.get.src_offset)); break; case PTL_MSG_ACK: CERROR(" dst md "LPX64"."LPX64", manipulated length %d\n", hdr->msg.ack.dst_wmd.wh_interface_cookie, hdr->msg.ack.dst_wmd.wh_object_cookie, - NTOH__u32 (hdr->msg.ack.mlength)); + le32_to_cpu(hdr->msg.ack.mlength)); break; case PTL_MSG_REPLY: @@ -889,6 +902,12 @@ kqswnal_rdma (kqswnal_rx_t *krx, lib_msg_t *libmsg, int type, ktx->ktx_args[0] = krx; ktx->ktx_args[1] = libmsg; +#if MULTIRAIL_EKC + /* Map on the rail the RPC prefers */ + ktx->ktx_rail = ep_rcvr_prefrail(krx->krx_eprx, + ep_rxd_railmask(krx->krx_rxd)); +#endif + /* Start mapping at offset 0 (we're not mapping any headers) */ ktx->ktx_nfrag = ktx->ktx_firsttmpfrag = 0; @@ -1077,7 +1096,6 @@ kqswnal_sendmsg (lib_nal_t *nal, ktx->ktx_args[2] = NULL; /* set when a GET commits to REPLY */ memcpy (ktx->ktx_buffer, hdr, sizeof (*hdr)); /* copy hdr from caller's stack */ - ktx->ktx_wire_hdr = (ptl_hdr_t *)ktx->ktx_buffer; #if KQSW_CHECKSUM csum = kqsw_csum (0, (char *)hdr, sizeof (*hdr)); @@ -1124,7 +1142,7 @@ kqswnal_sendmsg (lib_nal_t *nal, if (nid == targetnid && /* not forwarding */ ((type == PTL_MSG_GET && /* optimize GET? */ kqswnal_tunables.kqn_optimized_gets != 0 && - NTOH__u32(hdr->msg.get.sink_length) >= kqswnal_tunables.kqn_optimized_gets) || + le32_to_cpu(hdr->msg.get.sink_length) >= kqswnal_tunables.kqn_optimized_gets) || (type == PTL_MSG_PUT && /* optimize PUT? */ kqswnal_tunables.kqn_optimized_puts != 0 && payload_nob >= kqswnal_tunables.kqn_optimized_puts))) { @@ -1325,7 +1343,6 @@ kqswnal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) /* copy hdr into pre-mapped buffer */ memcpy(ktx->ktx_buffer, fwd->kprfd_hdr, sizeof(ptl_hdr_t)); - ktx->ktx_wire_hdr = (ptl_hdr_t *)ktx->ktx_buffer; ktx->ktx_port = (nob <= KQSW_SMALLPAYLOAD) ? EP_MSG_SVC_PORTALS_SMALL : EP_MSG_SVC_PORTALS_LARGE; @@ -1387,7 +1404,7 @@ kqswnal_fwd_callback (void *arg, int error) ptl_hdr_t *hdr = (ptl_hdr_t *)page_address (krx->krx_kiov[0].kiov_page); CERROR("Failed to route packet from "LPX64" to "LPX64": %d\n", - NTOH__u64(hdr->src_nid), NTOH__u64(hdr->dest_nid),error); + le64_to_cpu(hdr->src_nid), le64_to_cpu(hdr->dest_nid),error); } LASSERT (atomic_read(&krx->krx_refcount) == 1); @@ -1492,7 +1509,7 @@ void kqswnal_parse (kqswnal_rx_t *krx) { ptl_hdr_t *hdr = (ptl_hdr_t *) page_address(krx->krx_kiov[0].kiov_page); - ptl_nid_t dest_nid = NTOH__u64 (hdr->dest_nid); + ptl_nid_t dest_nid = le64_to_cpu(hdr->dest_nid); int payload_nob; int nob; int niov; @@ -1516,7 +1533,7 @@ kqswnal_parse (kqswnal_rx_t *krx) if (kqswnal_nid2elanid (dest_nid) >= 0) /* should have gone direct to peer */ { CERROR("dropping packet from "LPX64" for "LPX64 - ": target is peer\n", NTOH__u64(hdr->src_nid), dest_nid); + ": target is peer\n", le64_to_cpu(hdr->src_nid), dest_nid); kqswnal_rx_decref (krx); return; @@ -1551,7 +1568,7 @@ kqswnal_parse (kqswnal_rx_t *krx) void kqswnal_rxhandler(EP_RXD *rxd) { - long flags; + unsigned long flags; int nob = ep_rxd_len (rxd); int status = ep_rxd_status (rxd); kqswnal_rx_t *krx = (kqswnal_rx_t *)ep_rxd_arg (rxd); @@ -1615,30 +1632,30 @@ kqswnal_csum_error (kqswnal_rx_t *krx, int ishdr) CERROR ("%s checksum mismatch %p: dnid "LPX64", snid "LPX64 ", dpid %d, spid %d, type %d\n", ishdr ? "Header" : "Payload", krx, - NTOH__u64(hdr->dest_nid), NTOH__u64(hdr->src_nid) - NTOH__u32(hdr->dest_pid), NTOH__u32(hdr->src_pid), - NTOH__u32(hdr->type)); + le64_to_cpu(hdr->dest_nid), le64_to_cpu(hdr->src_nid) + le32_to_cpu(hdr->dest_pid), le32_to_cpu(hdr->src_pid), + le32_to_cpu(hdr->type)); - switch (NTOH__u32 (hdr->type)) + switch (le32_to_cpu(hdr->type)) { case PTL_MSG_ACK: CERROR("ACK: mlen %d dmd "LPX64"."LPX64" match "LPX64 " len %u\n", - NTOH__u32(hdr->msg.ack.mlength), + le32_to_cpu(hdr->msg.ack.mlength), hdr->msg.ack.dst_wmd.handle_cookie, hdr->msg.ack.dst_wmd.handle_idx, - NTOH__u64(hdr->msg.ack.match_bits), - NTOH__u32(hdr->msg.ack.length)); + le64_to_cpu(hdr->msg.ack.match_bits), + le32_to_cpu(hdr->msg.ack.length)); break; case PTL_MSG_PUT: CERROR("PUT: ptl %d amd "LPX64"."LPX64" match "LPX64 " len %u off %u data "LPX64"\n", - NTOH__u32(hdr->msg.put.ptl_index), + le32_to_cpu(hdr->msg.put.ptl_index), hdr->msg.put.ack_wmd.handle_cookie, hdr->msg.put.ack_wmd.handle_idx, - NTOH__u64(hdr->msg.put.match_bits), - NTOH__u32(hdr->msg.put.length), - NTOH__u32(hdr->msg.put.offset), + le64_to_cpu(hdr->msg.put.match_bits), + le32_to_cpu(hdr->msg.put.length), + le32_to_cpu(hdr->msg.put.offset), hdr->msg.put.hdr_data); break; case PTL_MSG_GET: @@ -1870,7 +1887,7 @@ kqswnal_scheduler (void *arg) kqswnal_rx_t *krx; kqswnal_tx_t *ktx; kpr_fwd_desc_t *fwd; - long flags; + unsigned long flags; int rc; int counter = 0; int did_something; diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index 3a3629b873..2a0ef11847 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -40,11 +40,17 @@ kpr_nal_interface_t ksocknal_router_interface = { #ifdef CONFIG_SYSCTL #define SOCKNAL_SYSCTL 200 -#define SOCKNAL_SYSCTL_TIMEOUT 1 -#define SOCKNAL_SYSCTL_EAGER_ACK 2 -#define SOCKNAL_SYSCTL_ZERO_COPY 3 -#define SOCKNAL_SYSCTL_TYPED 4 -#define SOCKNAL_SYSCTL_MIN_BULK 5 +#define SOCKNAL_SYSCTL_TIMEOUT 1 +#define SOCKNAL_SYSCTL_EAGER_ACK 2 +#define SOCKNAL_SYSCTL_ZERO_COPY 3 +#define SOCKNAL_SYSCTL_TYPED 4 +#define SOCKNAL_SYSCTL_MIN_BULK 5 +#define SOCKNAL_SYSCTL_BUFFER_SIZE 6 +#define SOCKNAL_SYSCTL_NAGLE 7 +#define SOCKNAL_SYSCTL_IRQ_AFFINITY 8 +#define SOCKNAL_SYSCTL_KEEPALIVE_IDLE 9 +#define SOCKNAL_SYSCTL_KEEPALIVE_COUNT 10 +#define SOCKNAL_SYSCTL_KEEPALIVE_INTVL 11 static ctl_table ksocknal_ctl_table[] = { {SOCKNAL_SYSCTL_TIMEOUT, "timeout", @@ -64,6 +70,26 @@ static ctl_table ksocknal_ctl_table[] = { {SOCKNAL_SYSCTL_MIN_BULK, "min_bulk", &ksocknal_tunables.ksnd_min_bulk, sizeof (int), 0644, NULL, &proc_dointvec}, + {SOCKNAL_SYSCTL_BUFFER_SIZE, "buffer_size", + &ksocknal_tunables.ksnd_buffer_size, sizeof(int), + 0644, NULL, &proc_dointvec}, + {SOCKNAL_SYSCTL_NAGLE, "nagle", + &ksocknal_tunables.ksnd_nagle, sizeof(int), + 0644, NULL, &proc_dointvec}, +#if CPU_AFFINITY + {SOCKNAL_SYSCTL_IRQ_AFFINITY, "irq_affinity", + &ksocknal_tunables.ksnd_irq_affinity, sizeof(int), + 0644, NULL, &proc_dointvec}, +#endif + {SOCKNAL_SYSCTL_KEEPALIVE_IDLE, "keepalive_idle", + &ksocknal_tunables.ksnd_keepalive_idle, sizeof(int), + 0644, NULL, &proc_dointvec}, + {SOCKNAL_SYSCTL_KEEPALIVE_COUNT, "keepalive_count", + &ksocknal_tunables.ksnd_keepalive_count, sizeof(int), + 0644, NULL, &proc_dointvec}, + {SOCKNAL_SYSCTL_KEEPALIVE_INTVL, "keepalive_intvl", + &ksocknal_tunables.ksnd_keepalive_intvl, sizeof(int), + 0644, NULL, &proc_dointvec}, { 0 } }; @@ -96,6 +122,7 @@ ksocknal_bind_irq (unsigned int irq) { #if (defined(CONFIG_SMP) && CPU_AFFINITY) int bind; + int cpu; unsigned long flags; char cmdline[64]; ksock_irqinfo_t *info; @@ -108,7 +135,7 @@ ksocknal_bind_irq (unsigned int irq) NULL}; LASSERT (irq < NR_IRQS); - if (irq == 0) /* software NIC */ + if (irq == 0) /* software NIC or affinity disabled */ return; info = &ksocknal_data.ksnd_irqinfo[irq]; @@ -124,11 +151,12 @@ ksocknal_bind_irq (unsigned int irq) if (!bind) /* bound already */ return; + cpu = ksocknal_irqsched2cpu(info->ksni_sched); snprintf (cmdline, sizeof (cmdline), - "echo %d > /proc/irq/%u/smp_affinity", 1 << info->ksni_sched, irq); + "echo %d > /proc/irq/%u/smp_affinity", 1 << cpu, irq); printk (KERN_INFO "Lustre: Binding irq %u to CPU %d with cmd: %s\n", - irq, info->ksni_sched, cmdline); + irq, cpu, cmdline); /* FIXME: Find a better method of setting IRQ affinity... */ @@ -137,9 +165,25 @@ ksocknal_bind_irq (unsigned int irq) #endif } +ksock_interface_t * +ksocknal_ip2iface(__u32 ip) +{ + int i; + ksock_interface_t *iface; + + for (i = 0; i < ksocknal_data.ksnd_ninterfaces; i++) { + LASSERT(i < SOCKNAL_MAX_INTERFACES); + iface = &ksocknal_data.ksnd_interfaces[i]; + + if (iface->ksni_ipaddr == ip) + return (iface); + } + + return (NULL); +} + ksock_route_t * -ksocknal_create_route (__u32 ipaddr, int port, int buffer_size, - int irq_affinity, int eager) +ksocknal_create_route (__u32 ipaddr, int port) { ksock_route_t *route; @@ -148,19 +192,16 @@ ksocknal_create_route (__u32 ipaddr, int port, int buffer_size, return (NULL); atomic_set (&route->ksnr_refcount, 1); - route->ksnr_sharecount = 0; route->ksnr_peer = NULL; route->ksnr_timeout = jiffies; route->ksnr_retry_interval = SOCKNAL_MIN_RECONNECT_INTERVAL; route->ksnr_ipaddr = ipaddr; route->ksnr_port = port; - route->ksnr_buffer_size = buffer_size; - route->ksnr_irq_affinity = irq_affinity; - route->ksnr_eager = eager; route->ksnr_connecting = 0; route->ksnr_connected = 0; route->ksnr_deleted = 0; route->ksnr_conn_count = 0; + route->ksnr_share_count = 0; return (route); } @@ -168,8 +209,6 @@ ksocknal_create_route (__u32 ipaddr, int port, int buffer_size, void ksocknal_destroy_route (ksock_route_t *route) { - LASSERT (route->ksnr_sharecount == 0); - if (route->ksnr_peer != NULL) ksocknal_put_peer (route->ksnr_peer); @@ -200,7 +239,7 @@ ksocknal_create_peer (ptl_nid_t nid) if (peer == NULL) return (NULL); - memset (peer, 0, sizeof (*peer)); + memset (peer, 0, sizeof (*peer)); /* NULL pointers/clear flags etc */ peer->ksnp_nid = nid; atomic_set (&peer->ksnp_refcount, 1); /* 1 ref for caller */ @@ -258,8 +297,6 @@ ksocknal_find_peer_locked (ptl_nid_t nid) peer = list_entry (tmp, ksock_peer_t, ksnp_list); LASSERT (!peer->ksnp_closing); - LASSERT (!(list_empty (&peer->ksnp_routes) && - list_empty (&peer->ksnp_conns))); if (peer->ksnp_nid != nid) continue; @@ -288,6 +325,18 @@ ksocknal_get_peer (ptl_nid_t nid) void ksocknal_unlink_peer_locked (ksock_peer_t *peer) { + int i; + __u32 ip; + + for (i = 0; i < peer->ksnp_n_passive_ips; i++) { + LASSERT (i < SOCKNAL_MAX_INTERFACES); + ip = peer->ksnp_passive_ips[i]; + + ksocknal_ip2iface(ip)->ksni_npeers--; + } + + LASSERT (list_empty(&peer->ksnp_conns)); + LASSERT (list_empty(&peer->ksnp_routes)); LASSERT (!peer->ksnp_closing); peer->ksnp_closing = 1; list_del (&peer->ksnp_list); @@ -295,49 +344,210 @@ ksocknal_unlink_peer_locked (ksock_peer_t *peer) ksocknal_put_peer (peer); } -ksock_route_t * -ksocknal_get_route_by_idx (int index) +int +ksocknal_get_peer_info (int index, ptl_nid_t *nid, + __u32 *myip, __u32 *peer_ip, int *port, + int *conn_count, int *share_count) { ksock_peer_t *peer; struct list_head *ptmp; ksock_route_t *route; struct list_head *rtmp; int i; + int j; + int rc = -ENOENT; read_lock (&ksocknal_data.ksnd_global_lock); for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) { + list_for_each (ptmp, &ksocknal_data.ksnd_peers[i]) { peer = list_entry (ptmp, ksock_peer_t, ksnp_list); - LASSERT (!(list_empty (&peer->ksnp_routes) && - list_empty (&peer->ksnp_conns))); + if (peer->ksnp_n_passive_ips == 0 && + list_empty(&peer->ksnp_routes)) { + if (index-- > 0) + continue; + + *nid = peer->ksnp_nid; + *myip = 0; + *peer_ip = 0; + *port = 0; + *conn_count = 0; + *share_count = 0; + rc = 0; + goto out; + } + for (j = 0; j < peer->ksnp_n_passive_ips; j++) { + if (index-- > 0) + continue; + + *nid = peer->ksnp_nid; + *myip = peer->ksnp_passive_ips[j]; + *peer_ip = 0; + *port = 0; + *conn_count = 0; + *share_count = 0; + rc = 0; + goto out; + } + list_for_each (rtmp, &peer->ksnp_routes) { if (index-- > 0) continue; - route = list_entry (rtmp, ksock_route_t, ksnr_list); - atomic_inc (&route->ksnr_refcount); - read_unlock (&ksocknal_data.ksnd_global_lock); - return (route); + route = list_entry(rtmp, ksock_route_t, + ksnr_list); + + *nid = peer->ksnp_nid; + *myip = route->ksnr_myipaddr; + *peer_ip = route->ksnr_ipaddr; + *port = route->ksnr_port; + *conn_count = route->ksnr_conn_count; + *share_count = route->ksnr_share_count; + rc = 0; + goto out; } } } - + out: read_unlock (&ksocknal_data.ksnd_global_lock); - return (NULL); + return (rc); +} + +void +ksocknal_associate_route_conn_locked(ksock_route_t *route, ksock_conn_t *conn) +{ + ksock_peer_t *peer = route->ksnr_peer; + int type = conn->ksnc_type; + ksock_interface_t *iface; + + conn->ksnc_route = route; + atomic_inc (&route->ksnr_refcount); + + if (route->ksnr_myipaddr != conn->ksnc_myipaddr) { + if (route->ksnr_myipaddr == 0) { + /* route wasn't bound locally yet (the initial route) */ + CWARN("Binding "LPX64" %u.%u.%u.%u to %u.%u.%u.%u\n", + peer->ksnp_nid, + HIPQUAD(route->ksnr_ipaddr), + HIPQUAD(conn->ksnc_myipaddr)); + } else { + CWARN("Rebinding "LPX64" %u.%u.%u.%u from " + "%u.%u.%u.%u to %u.%u.%u.%u\n", + peer->ksnp_nid, + HIPQUAD(route->ksnr_ipaddr), + HIPQUAD(route->ksnr_myipaddr), + HIPQUAD(conn->ksnc_myipaddr)); + + iface = ksocknal_ip2iface(route->ksnr_myipaddr); + if (iface != NULL) + iface->ksni_nroutes--; + } + route->ksnr_myipaddr = conn->ksnc_myipaddr; + iface = ksocknal_ip2iface(route->ksnr_myipaddr); + if (iface != NULL) + iface->ksni_nroutes++; + } + + route->ksnr_connected |= (1<<type); + route->ksnr_connecting &= ~(1<<type); + route->ksnr_conn_count++; + + /* Successful connection => further attempts can + * proceed immediately */ + route->ksnr_timeout = jiffies; + route->ksnr_retry_interval = SOCKNAL_MIN_RECONNECT_INTERVAL; +} + +void +ksocknal_add_route_locked (ksock_peer_t *peer, ksock_route_t *route) +{ + struct list_head *tmp; + ksock_conn_t *conn; + int type; + ksock_route_t *route2; + + LASSERT (route->ksnr_peer == NULL); + LASSERT (route->ksnr_connecting == 0); + LASSERT (route->ksnr_connected == 0); + + /* LASSERT(unique) */ + list_for_each(tmp, &peer->ksnp_routes) { + route2 = list_entry(tmp, ksock_route_t, ksnr_list); + + if (route2->ksnr_ipaddr == route->ksnr_ipaddr) { + CERROR ("Duplicate route "LPX64" %u.%u.%u.%u\n", + peer->ksnp_nid, HIPQUAD(route->ksnr_ipaddr)); + LBUG(); + } + } + + route->ksnr_peer = peer; + atomic_inc (&peer->ksnp_refcount); + /* peer's routelist takes over my ref on 'route' */ + list_add_tail(&route->ksnr_list, &peer->ksnp_routes); + + list_for_each(tmp, &peer->ksnp_conns) { + conn = list_entry(tmp, ksock_conn_t, ksnc_list); + type = conn->ksnc_type; + + if (conn->ksnc_ipaddr != route->ksnr_ipaddr) + continue; + + ksocknal_associate_route_conn_locked(route, conn); + /* keep going (typed routes) */ + } +} + +void +ksocknal_del_route_locked (ksock_route_t *route) +{ + ksock_peer_t *peer = route->ksnr_peer; + ksock_interface_t *iface; + ksock_conn_t *conn; + struct list_head *ctmp; + struct list_head *cnxt; + + LASSERT (!route->ksnr_deleted); + + /* Close associated conns */ + list_for_each_safe (ctmp, cnxt, &peer->ksnp_conns) { + conn = list_entry(ctmp, ksock_conn_t, ksnc_list); + + if (conn->ksnc_route != route) + continue; + + ksocknal_close_conn_locked (conn, 0); + } + + if (route->ksnr_myipaddr != 0) { + iface = ksocknal_ip2iface(route->ksnr_myipaddr); + if (iface != NULL) + iface->ksni_nroutes--; + } + + route->ksnr_deleted = 1; + list_del (&route->ksnr_list); + ksocknal_put_route (route); /* drop peer's ref */ + + if (list_empty (&peer->ksnp_routes) && + list_empty (&peer->ksnp_conns)) { + /* I've just removed the last autoconnect route of a peer + * with no active connections */ + ksocknal_unlink_peer_locked (peer); + } } int -ksocknal_add_route (ptl_nid_t nid, __u32 ipaddr, int port, int bufnob, - int bind_irq, int share, int eager) +ksocknal_add_peer (ptl_nid_t nid, __u32 ipaddr, int port) { unsigned long flags; + struct list_head *tmp; ksock_peer_t *peer; ksock_peer_t *peer2; ksock_route_t *route; - struct list_head *rtmp; ksock_route_t *route2; if (nid == PTL_NID_ANY) @@ -348,8 +558,7 @@ ksocknal_add_route (ptl_nid_t nid, __u32 ipaddr, int port, int bufnob, if (peer == NULL) return (-ENOMEM); - route = ksocknal_create_route (ipaddr, port, bufnob, - bind_irq, eager); + route = ksocknal_create_route (ipaddr, port); if (route == NULL) { ksocknal_put_peer (peer); return (-ENOMEM); @@ -362,36 +571,27 @@ ksocknal_add_route (ptl_nid_t nid, __u32 ipaddr, int port, int bufnob, ksocknal_put_peer (peer); peer = peer2; } else { - /* peer table takes existing ref on peer */ - list_add (&peer->ksnp_list, - ksocknal_nid2peerlist (nid)); + /* peer table takes my ref on peer */ + list_add_tail (&peer->ksnp_list, + ksocknal_nid2peerlist (nid)); } route2 = NULL; - if (share) { - /* check for existing route to this NID via this ipaddr */ - list_for_each (rtmp, &peer->ksnp_routes) { - route2 = list_entry (rtmp, ksock_route_t, ksnr_list); - - if (route2->ksnr_ipaddr == ipaddr) - break; - - route2 = NULL; - } + list_for_each (tmp, &peer->ksnp_routes) { + route2 = list_entry(tmp, ksock_route_t, ksnr_list); + + if (route2->ksnr_ipaddr == ipaddr) + break; + + route2 = NULL; } - - if (route2 != NULL) { - ksocknal_put_route (route); - route = route2; + if (route2 == NULL) { + ksocknal_add_route_locked(peer, route); + route->ksnr_share_count++; } else { - /* route takes a ref on peer */ - route->ksnr_peer = peer; - atomic_inc (&peer->ksnp_refcount); - /* peer's route list takes existing ref on route */ - list_add_tail (&route->ksnr_list, &peer->ksnp_routes); + ksocknal_put_route(route); + route2->ksnr_share_count++; } - - route->ksnr_sharecount++; write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags); @@ -399,59 +599,75 @@ ksocknal_add_route (ptl_nid_t nid, __u32 ipaddr, int port, int bufnob, } void -ksocknal_del_route_locked (ksock_route_t *route, int share, int keep_conn) +ksocknal_del_peer_locked (ksock_peer_t *peer, __u32 ip, int single_share) { - ksock_peer_t *peer = route->ksnr_peer; ksock_conn_t *conn; - struct list_head *ctmp; - struct list_head *cnxt; + ksock_route_t *route; + struct list_head *tmp; + struct list_head *nxt; + int nshared; - if (!share) - route->ksnr_sharecount = 0; - else { - route->ksnr_sharecount--; - if (route->ksnr_sharecount != 0) - return; - } + LASSERT (!peer->ksnp_closing); - list_for_each_safe (ctmp, cnxt, &peer->ksnp_conns) { - conn = list_entry(ctmp, ksock_conn_t, ksnc_list); + list_for_each_safe (tmp, nxt, &peer->ksnp_routes) { + route = list_entry(tmp, ksock_route_t, ksnr_list); - if (conn->ksnc_route != route) + if (single_share && route->ksnr_share_count == 0) continue; - - if (!keep_conn) { - ksocknal_close_conn_locked (conn, 0); + + /* no match */ + if (!(ip == 0 || route->ksnr_ipaddr == ip)) continue; + + if (!single_share) + route->ksnr_share_count = 0; + else if (route->ksnr_share_count > 0) + route->ksnr_share_count--; + + if (route->ksnr_share_count == 0) { + /* This deletes associated conns too */ + ksocknal_del_route_locked (route); } - /* keeping the conn; just dissociate it and route... */ - conn->ksnc_route = NULL; - ksocknal_put_route (route); /* drop conn's ref on route */ + if (single_share) + break; } - - route->ksnr_deleted = 1; - list_del (&route->ksnr_list); - ksocknal_put_route (route); /* drop peer's ref */ - if (list_empty (&peer->ksnp_routes) && - list_empty (&peer->ksnp_conns)) { - /* I've just removed the last autoconnect route of a peer - * with no active connections */ - ksocknal_unlink_peer_locked (peer); + nshared = 0; + list_for_each_safe (tmp, nxt, &peer->ksnp_routes) { + route = list_entry(tmp, ksock_route_t, ksnr_list); + nshared += route->ksnr_share_count; + } + + if (nshared == 0) { + /* remove everything else if there are no explicit entries + * left */ + + list_for_each_safe (tmp, nxt, &peer->ksnp_routes) { + route = list_entry(tmp, ksock_route_t, ksnr_list); + + /* we should only be removing auto-entries */ + LASSERT(route->ksnr_share_count == 0); + ksocknal_del_route_locked (route); + } + + list_for_each_safe (tmp, nxt, &peer->ksnp_conns) { + conn = list_entry(tmp, ksock_conn_t, ksnc_list); + + ksocknal_close_conn_locked(conn, 0); + } } + + /* NB peer unlinks itself when last conn/route is removed */ } int -ksocknal_del_route (ptl_nid_t nid, __u32 ipaddr, int share, int keep_conn) +ksocknal_del_peer (ptl_nid_t nid, __u32 ip, int single_share) { unsigned long flags; struct list_head *ptmp; struct list_head *pnxt; ksock_peer_t *peer; - struct list_head *rtmp; - struct list_head *rnxt; - ksock_route_t *route; int lo; int hi; int i; @@ -473,22 +689,14 @@ ksocknal_del_route (ptl_nid_t nid, __u32 ipaddr, int share, int keep_conn) if (!(nid == PTL_NID_ANY || peer->ksnp_nid == nid)) continue; - list_for_each_safe (rtmp, rnxt, &peer->ksnp_routes) { - route = list_entry (rtmp, ksock_route_t, - ksnr_list); + ksocknal_del_peer_locked (peer, ip, single_share); + rc = 0; /* matched! */ - if (!(ipaddr == 0 || - route->ksnr_ipaddr == ipaddr)) - continue; - - ksocknal_del_route_locked (route, share, keep_conn); - rc = 0; /* matched something */ - if (share) - goto out; - } + if (single_share) + break; } } - out: + write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags); return (rc); @@ -509,8 +717,7 @@ ksocknal_get_conn_by_idx (int index) list_for_each (ptmp, &ksocknal_data.ksnd_peers[i]) { peer = list_entry (ptmp, ksock_peer_t, ksnp_list); - LASSERT (!(list_empty (&peer->ksnp_routes) && - list_empty (&peer->ksnp_conns))); + LASSERT (!peer->ksnp_closing); list_for_each (ctmp, &peer->ksnp_conns) { if (index-- > 0) @@ -528,8 +735,8 @@ ksocknal_get_conn_by_idx (int index) return (NULL); } -void -ksocknal_get_peer_addr (ksock_conn_t *conn) +int +ksocknal_get_conn_addrs (ksock_conn_t *conn) { struct sockaddr_in sin; int len = sizeof (sin); @@ -539,24 +746,37 @@ ksocknal_get_peer_addr (ksock_conn_t *conn) (struct sockaddr *)&sin, &len, 2); /* Didn't need the {get,put}connsock dance to deref ksnc_sock... */ LASSERT (!conn->ksnc_closing); - LASSERT (len <= sizeof (sin)); if (rc != 0) { CERROR ("Error %d getting sock peer IP\n", rc); - return; + return rc; } conn->ksnc_ipaddr = ntohl (sin.sin_addr.s_addr); conn->ksnc_port = ntohs (sin.sin_port); + + rc = conn->ksnc_sock->ops->getname (conn->ksnc_sock, + (struct sockaddr *)&sin, &len, 0); + if (rc != 0) { + CERROR ("Error %d getting sock local IP\n", rc); + return rc; + } + + conn->ksnc_myipaddr = ntohl (sin.sin_addr.s_addr); + + return 0; } unsigned int -ksocknal_conn_irq (ksock_conn_t *conn) +ksocknal_sock_irq (struct socket *sock) { int irq = 0; struct dst_entry *dst; - dst = sk_dst_get (conn->ksnc_sock->sk); + if (!ksocknal_tunables.ksnd_irq_affinity) + return 0; + + dst = sk_dst_get (sock->sk); if (dst != NULL) { if (dst->dev != NULL) { irq = dst->dev->irq; @@ -568,8 +788,6 @@ ksocknal_conn_irq (ksock_conn_t *conn) dst_release (dst); } - /* Didn't need the {get,put}connsock dance to deref ksnc_sock... */ - LASSERT (!conn->ksnc_closing); return (irq); } @@ -591,7 +809,7 @@ ksocknal_choose_scheduler_locked (unsigned int irq) /* software NIC (irq == 0) || not associated with a scheduler yet. * Choose the CPU with the fewest connections... */ sched = &ksocknal_data.ksnd_schedulers[0]; - for (i = 1; i < SOCKNAL_N_SCHED; i++) + for (i = 1; i < ksocknal_data.ksnd_nschedulers; i++) if (sched->kss_nconns > ksocknal_data.ksnd_schedulers[i].kss_nconns) sched = &ksocknal_data.ksnd_schedulers[i]; @@ -608,14 +826,278 @@ ksocknal_choose_scheduler_locked (unsigned int irq) } int -ksocknal_create_conn (ksock_route_t *route, struct socket *sock, - int bind_irq, int type) +ksocknal_local_ipvec (__u32 *ipaddrs) { + int i; + int nip; + + read_lock (&ksocknal_data.ksnd_global_lock); + + nip = ksocknal_data.ksnd_ninterfaces; + for (i = 0; i < nip; i++) { + LASSERT (i < SOCKNAL_MAX_INTERFACES); + + ipaddrs[i] = ksocknal_data.ksnd_interfaces[i].ksni_ipaddr; + LASSERT (ipaddrs[i] != 0); + } + + read_unlock (&ksocknal_data.ksnd_global_lock); + return (nip); +} + +int +ksocknal_match_peerip (ksock_interface_t *iface, __u32 *ips, int nips) +{ + int best_netmatch = 0; + int best_xor = 0; + int best = -1; + int this_xor; + int this_netmatch; + int i; + + for (i = 0; i < nips; i++) { + if (ips[i] == 0) + continue; + + this_xor = (ips[i] ^ iface->ksni_ipaddr); + this_netmatch = ((this_xor & iface->ksni_netmask) == 0) ? 1 : 0; + + if (!(best < 0 || + best_netmatch < this_netmatch || + (best_netmatch == this_netmatch && + best_xor > this_xor))) + continue; + + best = i; + best_netmatch = this_netmatch; + best_xor = this_xor; + } + + LASSERT (best >= 0); + return (best); +} + +int +ksocknal_select_ips(ksock_peer_t *peer, __u32 *peerips, int n_peerips) +{ + rwlock_t *global_lock = &ksocknal_data.ksnd_global_lock; + unsigned long flags; + ksock_interface_t *iface; + ksock_interface_t *best_iface; + int n_ips; + int i; + int j; + int k; + __u32 ip; + __u32 xor; + int this_netmatch; + int best_netmatch; + int best_npeers; + + /* CAVEAT EMPTOR: We do all our interface matching with an + * exclusive hold of global lock at IRQ priority. We're only + * expecting to be dealing with small numbers of interfaces, so the + * O(n**3)-ness shouldn't matter */ + + /* Also note that I'm not going to return more than n_peerips + * interfaces, even if I have more myself */ + + write_lock_irqsave(global_lock, flags); + + LASSERT (n_peerips <= SOCKNAL_MAX_INTERFACES); + LASSERT (ksocknal_data.ksnd_ninterfaces <= SOCKNAL_MAX_INTERFACES); + + n_ips = MIN(n_peerips, ksocknal_data.ksnd_ninterfaces); + + for (i = 0; peer->ksnp_n_passive_ips < n_ips; i++) { + /* ^ yes really... */ + + /* If we have any new interfaces, first tick off all the + * peer IPs that match old interfaces, then choose new + * interfaces to match the remaining peer IPS. + * We don't forget interfaces we've stopped using; we might + * start using them again... */ + + if (i < peer->ksnp_n_passive_ips) { + /* Old interface. */ + ip = peer->ksnp_passive_ips[i]; + best_iface = ksocknal_ip2iface(ip); + + /* peer passive ips are kept up to date */ + LASSERT(best_iface != NULL); + } else { + /* choose a new interface */ + LASSERT (i == peer->ksnp_n_passive_ips); + + best_iface = NULL; + best_netmatch = 0; + best_npeers = 0; + + for (j = 0; j < ksocknal_data.ksnd_ninterfaces; j++) { + iface = &ksocknal_data.ksnd_interfaces[j]; + ip = iface->ksni_ipaddr; + + for (k = 0; k < peer->ksnp_n_passive_ips; k++) + if (peer->ksnp_passive_ips[k] == ip) + break; + + if (k < peer->ksnp_n_passive_ips) /* using it already */ + continue; + + k = ksocknal_match_peerip(iface, peerips, n_peerips); + xor = (ip ^ peerips[k]); + this_netmatch = ((xor & iface->ksni_netmask) == 0) ? 1 : 0; + + if (!(best_iface == NULL || + best_netmatch < this_netmatch || + (best_netmatch == this_netmatch && + best_npeers > iface->ksni_npeers))) + continue; + + best_iface = iface; + best_netmatch = this_netmatch; + best_npeers = iface->ksni_npeers; + } + + best_iface->ksni_npeers++; + ip = best_iface->ksni_ipaddr; + peer->ksnp_passive_ips[i] = ip; + peer->ksnp_n_passive_ips = i+1; + } + + LASSERT (best_iface != NULL); + + /* mark the best matching peer IP used */ + j = ksocknal_match_peerip(best_iface, peerips, n_peerips); + peerips[j] = 0; + } + + /* Overwrite input peer IP addresses */ + memcpy(peerips, peer->ksnp_passive_ips, n_ips * sizeof(*peerips)); + + write_unlock_irqrestore(global_lock, flags); + + return (n_ips); +} + +void +ksocknal_create_routes(ksock_peer_t *peer, int port, + __u32 *peer_ipaddrs, int npeer_ipaddrs) +{ + ksock_route_t *newroute = NULL; + rwlock_t *global_lock = &ksocknal_data.ksnd_global_lock; + unsigned long flags; + struct list_head *rtmp; + ksock_route_t *route; + ksock_interface_t *iface; + ksock_interface_t *best_iface; + int best_netmatch; + int this_netmatch; + int best_nroutes; + int i; + int j; + + /* CAVEAT EMPTOR: We do all our interface matching with an + * exclusive hold of global lock at IRQ priority. We're only + * expecting to be dealing with small numbers of interfaces, so the + * O(n**3)-ness here shouldn't matter */ + + write_lock_irqsave(global_lock, flags); + + LASSERT (npeer_ipaddrs <= SOCKNAL_MAX_INTERFACES); + + for (i = 0; i < npeer_ipaddrs; i++) { + if (newroute != NULL) { + newroute->ksnr_ipaddr = peer_ipaddrs[i]; + } else { + write_unlock_irqrestore(global_lock, flags); + + newroute = ksocknal_create_route(peer_ipaddrs[i], port); + if (newroute == NULL) + return; + + write_lock_irqsave(global_lock, flags); + } + + /* Already got a route? */ + route = NULL; + list_for_each(rtmp, &peer->ksnp_routes) { + route = list_entry(rtmp, ksock_route_t, ksnr_list); + + if (route->ksnr_ipaddr == newroute->ksnr_ipaddr) + break; + + route = NULL; + } + if (route != NULL) + continue; + + best_iface = NULL; + best_nroutes = 0; + best_netmatch = 0; + + LASSERT (ksocknal_data.ksnd_ninterfaces <= SOCKNAL_MAX_INTERFACES); + + /* Select interface to connect from */ + for (j = 0; j < ksocknal_data.ksnd_ninterfaces; j++) { + iface = &ksocknal_data.ksnd_interfaces[j]; + + /* Using this interface already? */ + list_for_each(rtmp, &peer->ksnp_routes) { + route = list_entry(rtmp, ksock_route_t, ksnr_list); + + if (route->ksnr_myipaddr == iface->ksni_ipaddr) + break; + + route = NULL; + } + if (route != NULL) + continue; + + this_netmatch = (((iface->ksni_ipaddr ^ + newroute->ksnr_ipaddr) & + iface->ksni_netmask) == 0) ? 1 : 0; + + if (!(best_iface == NULL || + best_netmatch < this_netmatch || + (best_netmatch == this_netmatch && + best_nroutes > iface->ksni_nroutes))) + continue; + + best_iface = iface; + best_netmatch = this_netmatch; + best_nroutes = iface->ksni_nroutes; + } + + if (best_iface == NULL) + continue; + + newroute->ksnr_myipaddr = best_iface->ksni_ipaddr; + best_iface->ksni_nroutes++; + + ksocknal_add_route_locked(peer, newroute); + newroute = NULL; + } + + write_unlock_irqrestore(global_lock, flags); + if (newroute != NULL) + ksocknal_put_route(newroute); +} + +int +ksocknal_create_conn (ksock_route_t *route, struct socket *sock, int type) +{ + int passive = (type == SOCKNAL_CONN_NONE); + rwlock_t *global_lock = &ksocknal_data.ksnd_global_lock; + __u32 ipaddrs[SOCKNAL_MAX_INTERFACES]; + int nipaddrs; ptl_nid_t nid; + struct list_head *tmp; __u64 incarnation; unsigned long flags; ksock_conn_t *conn; - ksock_peer_t *peer; + ksock_conn_t *conn2; + ksock_peer_t *peer = NULL; ksock_peer_t *peer2; ksock_sched_t *sched; unsigned int irq; @@ -628,45 +1110,23 @@ ksocknal_create_conn (ksock_route_t *route, struct socket *sock, * it, and sock->file has that pre-cooked... */ LASSERT (sock->file != NULL); LASSERT (file_count(sock->file) > 0); + LASSERT (route == NULL || !passive); rc = ksocknal_setup_sock (sock); if (rc != 0) return (rc); - if (route == NULL) { - /* acceptor or explicit connect */ - nid = PTL_NID_ANY; - } else { - LASSERT (type != SOCKNAL_CONN_NONE); - /* autoconnect: expect this nid on exchange */ - nid = route->ksnr_peer->ksnp_nid; - } - - rc = ksocknal_hello (sock, &nid, &type, &incarnation); - if (rc != 0) - return (rc); - - peer = NULL; - if (route == NULL) { /* not autoconnect */ - /* Assume this socket connects to a brand new peer */ - peer = ksocknal_create_peer (nid); - if (peer == NULL) - return (-ENOMEM); - } + irq = ksocknal_sock_irq (sock); PORTAL_ALLOC(conn, sizeof(*conn)); - if (conn == NULL) { - if (peer != NULL) - ksocknal_put_peer (peer); + if (conn == NULL) return (-ENOMEM); - } memset (conn, 0, sizeof (*conn)); conn->ksnc_peer = NULL; conn->ksnc_route = NULL; conn->ksnc_sock = sock; conn->ksnc_type = type; - conn->ksnc_incarnation = incarnation; conn->ksnc_saved_data_ready = sock->sk->sk_data_ready; conn->ksnc_saved_write_space = sock->sk->sk_write_space; atomic_set (&conn->ksnc_refcount, 1); /* 1 ref for me */ @@ -680,73 +1140,144 @@ ksocknal_create_conn (ksock_route_t *route, struct socket *sock, conn->ksnc_tx_scheduled = 0; atomic_set (&conn->ksnc_tx_nob, 0); - ksocknal_get_peer_addr (conn); + /* stash conn's local and remote addrs */ + rc = ksocknal_get_conn_addrs (conn); + if (rc != 0) + goto failed_0; - CWARN("New conn nid:"LPX64" ip:%08x/%d incarnation:"LPX64"\n", - nid, conn->ksnc_ipaddr, conn->ksnc_port, incarnation); + if (!passive) { + /* Active connection sends HELLO eagerly */ + rc = ksocknal_local_ipvec(ipaddrs); + if (rc < 0) + goto failed_0; + nipaddrs = rc; - irq = ksocknal_conn_irq (conn); + rc = ksocknal_send_hello (conn, ipaddrs, nipaddrs); + if (rc != 0) + goto failed_0; + } - write_lock_irqsave (&ksocknal_data.ksnd_global_lock, flags); + /* Find out/confirm peer's NID and connection type and get the + * vector of interfaces she's willing to let me connect to */ + nid = (route == NULL) ? PTL_NID_ANY : route->ksnr_peer->ksnp_nid; + rc = ksocknal_recv_hello (conn, &nid, &incarnation, ipaddrs); + if (rc < 0) + goto failed_0; + nipaddrs = rc; + LASSERT (nid != PTL_NID_ANY); if (route != NULL) { - /* Autoconnected! */ - LASSERT ((route->ksnr_connected & (1 << type)) == 0); - LASSERT ((route->ksnr_connecting & (1 << type)) != 0); - - if (route->ksnr_deleted) { - /* This conn was autoconnected, but the autoconnect - * route got deleted while it was being - * established! */ - write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, - flags); - PORTAL_FREE (conn, sizeof (*conn)); - return (-ESTALE); + peer = route->ksnr_peer; + atomic_inc(&peer->ksnp_refcount); + } else { + peer = ksocknal_create_peer(nid); + if (peer == NULL) { + rc = -ENOMEM; + goto failed_0; } + write_lock_irqsave(global_lock, flags); - /* associate conn/route */ - conn->ksnc_route = route; - atomic_inc (&route->ksnr_refcount); - - route->ksnr_connecting &= ~(1 << type); - route->ksnr_connected |= (1 << type); - route->ksnr_conn_count++; - route->ksnr_retry_interval = SOCKNAL_MIN_RECONNECT_INTERVAL; + peer2 = ksocknal_find_peer_locked(nid); + if (peer2 == NULL) { + /* NB this puts an "empty" peer in the peer + * table (which takes my ref) */ + list_add_tail(&peer->ksnp_list, + ksocknal_nid2peerlist(nid)); + } else { + ksocknal_put_peer(peer); + peer = peer2; + } + /* +1 ref for me */ + atomic_inc(&peer->ksnp_refcount); - peer = route->ksnr_peer; + write_unlock_irqrestore(global_lock, flags); + } + + if (!passive) { + ksocknal_create_routes(peer, conn->ksnc_port, + ipaddrs, nipaddrs); + rc = 0; } else { - /* Not an autoconnected connection; see if there is an - * existing peer for this NID */ - peer2 = ksocknal_find_peer_locked (nid); - if (peer2 != NULL) { - ksocknal_put_peer (peer); - peer = peer2; - } else { - list_add (&peer->ksnp_list, - ksocknal_nid2peerlist (nid)); - /* peer list takes over existing ref */ + rc = ksocknal_select_ips(peer, ipaddrs, nipaddrs); + LASSERT (rc >= 0); + rc = ksocknal_send_hello (conn, ipaddrs, rc); + } + if (rc < 0) + goto failed_1; + + write_lock_irqsave (global_lock, flags); + + if (peer->ksnp_closing || + (route != NULL && route->ksnr_deleted)) { + /* route/peer got closed under me */ + rc = -ESTALE; + goto failed_2; + } + + /* Refuse to duplicate an existing connection (both sides might + * autoconnect at once), unless this is a loopback connection */ + if (conn->ksnc_ipaddr != conn->ksnc_myipaddr) { + list_for_each(tmp, &peer->ksnp_conns) { + conn2 = list_entry(tmp, ksock_conn_t, ksnc_list); + + if (conn2->ksnc_ipaddr != conn->ksnc_ipaddr || + conn2->ksnc_myipaddr != conn->ksnc_myipaddr || + conn2->ksnc_type != conn->ksnc_type || + conn2->ksnc_incarnation != incarnation) + continue; + + CWARN("Not creating duplicate connection to " + "%u.%u.%u.%u type %d\n", + HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_type); + rc = -EALREADY; + goto failed_2; } } - LASSERT (!peer->ksnp_closing); + /* If the connection created by this route didn't bind to the IP + * address the route connected to, the connection/route matching + * code below probably isn't going to work. */ + if (route != NULL && + route->ksnr_ipaddr != conn->ksnc_ipaddr) { + CERROR("Route "LPX64" %u.%u.%u.%u connected to %u.%u.%u.%u\n", + peer->ksnp_nid, + HIPQUAD(route->ksnr_ipaddr), + HIPQUAD(conn->ksnc_ipaddr)); + } - conn->ksnc_peer = peer; - atomic_inc (&peer->ksnp_refcount); + /* Search for a route corresponding to the new connection and + * create an association. This allows incoming connections created + * by routes in my peer to match my own route entries so I don't + * continually create duplicate routes. */ + list_for_each (tmp, &peer->ksnp_routes) { + route = list_entry(tmp, ksock_route_t, ksnr_list); + + if (route->ksnr_ipaddr != conn->ksnc_ipaddr) + continue; + + ksocknal_associate_route_conn_locked(route, conn); + break; + } + + conn->ksnc_peer = peer; /* conn takes my ref on peer */ + conn->ksnc_incarnation = incarnation; peer->ksnp_last_alive = jiffies; peer->ksnp_error = 0; + sched = ksocknal_choose_scheduler_locked (irq); + sched->kss_nconns++; + conn->ksnc_scheduler = sched; + /* Set the deadline for the outgoing HELLO to drain */ + conn->ksnc_tx_bufnob = sock->sk->sk_wmem_queued; conn->ksnc_tx_deadline = jiffies + ksocknal_tunables.ksnd_io_timeout * HZ; + mb(); /* order with adding to peer's conn list */ list_add (&conn->ksnc_list, &peer->ksnp_conns); atomic_inc (&conn->ksnc_refcount); - sched = ksocknal_choose_scheduler_locked (irq); - sched->kss_nconns++; - conn->ksnc_scheduler = sched; - /* NB my callbacks block while I hold ksnd_global_lock */ sock->sk->sk_user_data = conn; sock->sk->sk_data_ready = ksocknal_data_ready; @@ -754,10 +1285,7 @@ ksocknal_create_conn (ksock_route_t *route, struct socket *sock, /* Take all the packets blocking for a connection. * NB, it might be nicer to share these blocked packets among any - * other connections that are becoming established, however that - * confuses the normal packet launching operation, which selects a - * connection and queues the packet on it without needing an - * exclusive lock on ksnd_global_lock. */ + * other connections that are becoming established. */ while (!list_empty (&peer->ksnp_tx_queue)) { tx = list_entry (peer->ksnp_tx_queue.next, ksock_tx_t, tx_list); @@ -766,27 +1294,47 @@ ksocknal_create_conn (ksock_route_t *route, struct socket *sock, ksocknal_queue_tx_locked (tx, conn); } - rc = ksocknal_close_stale_conns_locked (peer, incarnation); - - write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags); - + rc = ksocknal_close_stale_conns_locked(peer, incarnation); if (rc != 0) CERROR ("Closed %d stale conns to nid "LPX64" ip %d.%d.%d.%d\n", rc, conn->ksnc_peer->ksnp_nid, HIPQUAD(conn->ksnc_ipaddr)); - if (bind_irq) /* irq binding required */ - ksocknal_bind_irq (irq); + write_unlock_irqrestore (global_lock, flags); + + ksocknal_bind_irq (irq); /* Call the callbacks right now to get things going. */ - ksocknal_data_ready (sock->sk, 0); - ksocknal_write_space (sock->sk); + if (ksocknal_getconnsock(conn) == 0) { + ksocknal_data_ready (sock->sk, 0); + ksocknal_write_space (sock->sk); + ksocknal_putconnsock(conn); + } - CDEBUG(D_IOCTL, "conn [%p] registered for nid "LPX64" ip %d.%d.%d.%d\n", - conn, conn->ksnc_peer->ksnp_nid, HIPQUAD(conn->ksnc_ipaddr)); + CWARN("New conn nid:"LPX64" [type:%d] %u.%u.%u.%u -> %u.%u.%u.%u/%d" + " incarnation:"LPX64" sched[%d]/%d\n", + nid, conn->ksnc_type, HIPQUAD(conn->ksnc_myipaddr), + HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port, incarnation, + (int)(conn->ksnc_scheduler - ksocknal_data.ksnd_schedulers), irq); ksocknal_put_conn (conn); return (0); + + failed_2: + if (!peer->ksnp_closing && + list_empty (&peer->ksnp_conns) && + list_empty (&peer->ksnp_routes)) + ksocknal_unlink_peer_locked(peer); + write_unlock_irqrestore(global_lock, flags); + + failed_1: + ksocknal_put_peer (peer); + + failed_0: + PORTAL_FREE (conn, sizeof(*conn)); + + LASSERT (rc != 0); + return (rc); } void @@ -795,14 +1343,19 @@ ksocknal_close_conn_locked (ksock_conn_t *conn, int error) /* This just does the immmediate housekeeping, and queues the * connection for the reaper to terminate. * Caller holds ksnd_global_lock exclusively in irq context */ - ksock_peer_t *peer = conn->ksnc_peer; - ksock_route_t *route; + ksock_peer_t *peer = conn->ksnc_peer; + ksock_route_t *route; + ksock_conn_t *conn2; + struct list_head *tmp; LASSERT (peer->ksnp_error == 0); LASSERT (!conn->ksnc_closing); conn->ksnc_closing = 1; atomic_inc (&ksocknal_data.ksnd_nclosing_conns); + /* ksnd_deathrow_conns takes over peer's ref */ + list_del (&conn->ksnc_list); + route = conn->ksnc_route; if (route != NULL) { /* dissociate conn from route... */ @@ -810,18 +1363,28 @@ ksocknal_close_conn_locked (ksock_conn_t *conn, int error) LASSERT ((route->ksnr_connecting & (1 << conn->ksnc_type)) == 0); LASSERT ((route->ksnr_connected & (1 << conn->ksnc_type)) != 0); - route->ksnr_connected &= ~(1 << conn->ksnc_type); + conn2 = NULL; + list_for_each(tmp, &peer->ksnp_conns) { + conn2 = list_entry(tmp, ksock_conn_t, ksnc_list); + + if (conn2->ksnc_route == route && + conn2->ksnc_type == conn->ksnc_type) + break; + + conn2 = NULL; + } + if (conn2 == NULL) + route->ksnr_connected &= ~(1 << conn->ksnc_type); + conn->ksnc_route = NULL; +#if 0 /* irrelevent with only eager routes */ list_del (&route->ksnr_list); /* make route least favourite */ list_add_tail (&route->ksnr_list, &peer->ksnp_routes); - +#endif ksocknal_put_route (route); /* drop conn's ref on route */ } - /* ksnd_deathrow_conns takes over peer's ref */ - list_del (&conn->ksnc_list); - if (list_empty (&peer->ksnp_conns)) { /* No more connections to this peer */ @@ -1236,44 +1799,213 @@ ksocknal_push (ptl_nid_t nid) } int -ksocknal_cmd(struct portals_cfg *pcfg, void * private) +ksocknal_add_interface(__u32 ipaddress, __u32 netmask) +{ + unsigned long flags; + ksock_interface_t *iface; + int rc; + int i; + int j; + struct list_head *ptmp; + ksock_peer_t *peer; + struct list_head *rtmp; + ksock_route_t *route; + + if (ipaddress == 0 || + netmask == 0) + return (-EINVAL); + + write_lock_irqsave(&ksocknal_data.ksnd_global_lock, flags); + + iface = ksocknal_ip2iface(ipaddress); + if (iface != NULL) { + /* silently ignore dups */ + rc = 0; + } else if (ksocknal_data.ksnd_ninterfaces == SOCKNAL_MAX_INTERFACES) { + rc = -ENOSPC; + } else { + iface = &ksocknal_data.ksnd_interfaces[ksocknal_data.ksnd_ninterfaces++]; + + iface->ksni_ipaddr = ipaddress; + iface->ksni_netmask = netmask; + iface->ksni_nroutes = 0; + iface->ksni_npeers = 0; + + for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) { + list_for_each(ptmp, &ksocknal_data.ksnd_peers[i]) { + peer = list_entry(ptmp, ksock_peer_t, ksnp_list); + + for (j = 0; i < peer->ksnp_n_passive_ips; j++) + if (peer->ksnp_passive_ips[j] == ipaddress) + iface->ksni_npeers++; + + list_for_each(rtmp, &peer->ksnp_routes) { + route = list_entry(rtmp, ksock_route_t, ksnr_list); + + if (route->ksnr_myipaddr == ipaddress) + iface->ksni_nroutes++; + } + } + } + + rc = 0; + /* NB only new connections will pay attention to the new interface! */ + } + + write_unlock_irqrestore(&ksocknal_data.ksnd_global_lock, flags); + + return (rc); +} + +void +ksocknal_peer_del_interface_locked(ksock_peer_t *peer, __u32 ipaddr) +{ + struct list_head *tmp; + struct list_head *nxt; + ksock_route_t *route; + ksock_conn_t *conn; + int i; + int j; + + for (i = 0; i < peer->ksnp_n_passive_ips; i++) + if (peer->ksnp_passive_ips[i] == ipaddr) { + for (j = i+1; j < peer->ksnp_n_passive_ips; j++) + peer->ksnp_passive_ips[j-1] = + peer->ksnp_passive_ips[j]; + peer->ksnp_n_passive_ips--; + break; + } + + list_for_each_safe(tmp, nxt, &peer->ksnp_routes) { + route = list_entry (tmp, ksock_route_t, ksnr_list); + + if (route->ksnr_myipaddr != ipaddr) + continue; + + if (route->ksnr_share_count != 0) { + /* Manually created; keep, but unbind */ + route->ksnr_myipaddr = 0; + } else { + ksocknal_del_route_locked(route); + } + } + + list_for_each_safe(tmp, nxt, &peer->ksnp_conns) { + conn = list_entry(tmp, ksock_conn_t, ksnc_list); + + if (conn->ksnc_myipaddr == ipaddr) + ksocknal_close_conn_locked (conn, 0); + } +} + +int +ksocknal_del_interface(__u32 ipaddress) { - int rc = -EINVAL; + int rc = -ENOENT; + unsigned long flags; + struct list_head *tmp; + struct list_head *nxt; + ksock_peer_t *peer; + __u32 this_ip; + int i; + int j; + + write_lock_irqsave(&ksocknal_data.ksnd_global_lock, flags); + + for (i = 0; i < ksocknal_data.ksnd_ninterfaces; i++) { + this_ip = ksocknal_data.ksnd_interfaces[i].ksni_ipaddr; - LASSERT (pcfg != NULL); + if (!(ipaddress == 0 || + ipaddress == this_ip)) + continue; + + rc = 0; + + for (j = i+1; j < ksocknal_data.ksnd_ninterfaces; j++) + ksocknal_data.ksnd_interfaces[j-1] = + ksocknal_data.ksnd_interfaces[j]; + + ksocknal_data.ksnd_ninterfaces--; + + for (j = 0; j < ksocknal_data.ksnd_peer_hash_size; j++) { + list_for_each_safe(tmp, nxt, &ksocknal_data.ksnd_peers[j]) { + peer = list_entry(tmp, ksock_peer_t, ksnp_list); + + ksocknal_peer_del_interface_locked(peer, this_ip); + } + } + } + + write_unlock_irqrestore(&ksocknal_data.ksnd_global_lock, flags); + + return (rc); +} + +int +ksocknal_cmd(struct portals_cfg *pcfg, void * private) +{ + int rc; switch(pcfg->pcfg_command) { - case NAL_CMD_GET_AUTOCONN: { - ksock_route_t *route = ksocknal_get_route_by_idx (pcfg->pcfg_count); + case NAL_CMD_GET_INTERFACE: { + ksock_interface_t *iface; + + read_lock (&ksocknal_data.ksnd_global_lock); - if (route == NULL) + if (pcfg->pcfg_count < 0 || + pcfg->pcfg_count >= ksocknal_data.ksnd_ninterfaces) { rc = -ENOENT; - else { + } else { rc = 0; - pcfg->pcfg_nid = route->ksnr_peer->ksnp_nid; - pcfg->pcfg_id = route->ksnr_ipaddr; - pcfg->pcfg_misc = route->ksnr_port; - pcfg->pcfg_count = route->ksnr_conn_count; - pcfg->pcfg_size = route->ksnr_buffer_size; - pcfg->pcfg_wait = route->ksnr_sharecount; - pcfg->pcfg_flags = (route->ksnr_irq_affinity ? 2 : 0) | - (route->ksnr_eager ? 4 : 0); - ksocknal_put_route (route); + iface = &ksocknal_data.ksnd_interfaces[pcfg->pcfg_count]; + + pcfg->pcfg_id = iface->ksni_ipaddr; + pcfg->pcfg_misc = iface->ksni_netmask; + pcfg->pcfg_fd = iface->ksni_npeers; + pcfg->pcfg_count = iface->ksni_nroutes; } + + read_unlock (&ksocknal_data.ksnd_global_lock); + break; + } + case NAL_CMD_ADD_INTERFACE: { + rc = ksocknal_add_interface(pcfg->pcfg_id, /* IP address */ + pcfg->pcfg_misc); /* net mask */ break; } - case NAL_CMD_ADD_AUTOCONN: { - rc = ksocknal_add_route (pcfg->pcfg_nid, pcfg->pcfg_id, - pcfg->pcfg_misc, pcfg->pcfg_size, - (pcfg->pcfg_flags & 0x02) != 0, - (pcfg->pcfg_flags & 0x04) != 0, - (pcfg->pcfg_flags & 0x08) != 0); + case NAL_CMD_DEL_INTERFACE: { + rc = ksocknal_del_interface(pcfg->pcfg_id); /* IP address */ + break; + } + case NAL_CMD_GET_PEER: { + ptl_nid_t nid = 0; + __u32 myip = 0; + __u32 ip = 0; + int port = 0; + int conn_count = 0; + int share_count = 0; + + rc = ksocknal_get_peer_info(pcfg->pcfg_count, &nid, + &myip, &ip, &port, + &conn_count, &share_count); + pcfg->pcfg_nid = nid; + pcfg->pcfg_size = myip; + pcfg->pcfg_id = ip; + pcfg->pcfg_misc = port; + pcfg->pcfg_count = conn_count; + pcfg->pcfg_wait = share_count; break; } - case NAL_CMD_DEL_AUTOCONN: { - rc = ksocknal_del_route (pcfg->pcfg_nid, pcfg->pcfg_id, - (pcfg->pcfg_flags & 1) != 0, - (pcfg->pcfg_flags & 2) != 0); + case NAL_CMD_ADD_PEER: { + rc = ksocknal_add_peer (pcfg->pcfg_nid, + pcfg->pcfg_id, /* IP */ + pcfg->pcfg_misc); /* port */ + break; + } + case NAL_CMD_DEL_PEER: { + rc = ksocknal_del_peer (pcfg->pcfg_nid, + pcfg->pcfg_id, /* IP */ + pcfg->pcfg_flags); /* single_share? */ break; } case NAL_CMD_GET_CONN: { @@ -1282,11 +2014,23 @@ ksocknal_cmd(struct portals_cfg *pcfg, void * private) if (conn == NULL) rc = -ENOENT; else { + int txmem; + int rxmem; + int nagle; + + ksocknal_get_conn_tunables(conn, &txmem, &rxmem, &nagle); + rc = 0; - pcfg->pcfg_nid = conn->ksnc_peer->ksnp_nid; - pcfg->pcfg_id = conn->ksnc_ipaddr; - pcfg->pcfg_misc = conn->ksnc_port; - pcfg->pcfg_flags = conn->ksnc_type; + pcfg->pcfg_nid = conn->ksnc_peer->ksnp_nid; + pcfg->pcfg_id = conn->ksnc_ipaddr; + pcfg->pcfg_misc = conn->ksnc_port; + pcfg->pcfg_fd = conn->ksnc_myipaddr; + pcfg->pcfg_flags = conn->ksnc_type; + pcfg->pcfg_gw_nal = conn->ksnc_scheduler - + ksocknal_data.ksnd_schedulers; + pcfg->pcfg_count = txmem; + pcfg->pcfg_size = rxmem; + pcfg->pcfg_wait = nagle; ksocknal_put_conn (conn); } break; @@ -1304,8 +2048,10 @@ ksocknal_cmd(struct portals_cfg *pcfg, void * private) case SOCKNAL_CONN_CONTROL: case SOCKNAL_CONN_BULK_IN: case SOCKNAL_CONN_BULK_OUT: - rc = ksocknal_create_conn(NULL, sock, pcfg->pcfg_flags, type); + rc = ksocknal_create_conn(NULL, sock, type); + break; default: + rc = -EINVAL; break; } if (rc != 0) @@ -1325,6 +2071,9 @@ ksocknal_cmd(struct portals_cfg *pcfg, void * private) rc = ksocknal_push (pcfg->pcfg_nid); break; } + default: + rc = -EINVAL; + break; } return rc; @@ -1364,7 +2113,7 @@ ksocknal_free_buffers (void) if (ksocknal_data.ksnd_schedulers != NULL) PORTAL_FREE (ksocknal_data.ksnd_schedulers, - sizeof (ksock_sched_t) * SOCKNAL_N_SCHED); + sizeof (ksock_sched_t) * ksocknal_data.ksnd_nschedulers); PORTAL_FREE (ksocknal_data.ksnd_peers, sizeof (struct list_head) * @@ -1374,7 +2123,8 @@ ksocknal_free_buffers (void) void ksocknal_api_shutdown (nal_t *nal) { - int i; + ksock_sched_t *sched; + int i; if (nal->nal_refct != 0) { /* This module got the first ref */ @@ -1401,12 +2151,9 @@ ksocknal_api_shutdown (nal_t *nal) /* No more calls to ksocknal_cmd() to create new * autoroutes/connections since we're being unloaded. */ - /* Delete all autoroute entries */ - ksocknal_del_route(PTL_NID_ANY, 0, 0, 0); + /* Delete all peers */ + ksocknal_del_peer(PTL_NID_ANY, 0, 0); - /* Delete all connections */ - ksocknal_close_matching_conns (PTL_NID_ANY, 0); - /* Wait for all peer state to clean up */ i = 2; while (atomic_read (&ksocknal_data.ksnd_npeers) != 0) { @@ -1425,8 +2172,6 @@ ksocknal_api_shutdown (nal_t *nal) /* fall through */ case SOCKNAL_INIT_DATA: - /* Module refcount only gets to zero when all peers - * have been closed so all lists must be empty */ LASSERT (atomic_read (&ksocknal_data.ksnd_npeers) == 0); LASSERT (ksocknal_data.ksnd_peers != NULL); for (i = 0; i < ksocknal_data.ksnd_peer_hash_size; i++) { @@ -1439,7 +2184,7 @@ ksocknal_api_shutdown (nal_t *nal) LASSERT (list_empty (&ksocknal_data.ksnd_large_fmp.fmp_blocked_conns)); if (ksocknal_data.ksnd_schedulers != NULL) - for (i = 0; i < SOCKNAL_N_SCHED; i++) { + for (i = 0; i < ksocknal_data.ksnd_nschedulers; i++) { ksock_sched_t *kss = &ksocknal_data.ksnd_schedulers[i]; @@ -1453,22 +2198,27 @@ ksocknal_api_shutdown (nal_t *nal) /* flag threads to terminate; wake and wait for them to die */ ksocknal_data.ksnd_shuttingdown = 1; - mb(); wake_up_all (&ksocknal_data.ksnd_autoconnectd_waitq); wake_up_all (&ksocknal_data.ksnd_reaper_waitq); - for (i = 0; i < SOCKNAL_N_SCHED; i++) - wake_up_all(&ksocknal_data.ksnd_schedulers[i].kss_waitq); + for (i = 0; i < ksocknal_data.ksnd_nschedulers; i++) { + sched = &ksocknal_data.ksnd_schedulers[i]; + wake_up_all(&sched->kss_waitq); + } i = 4; - while (atomic_read (&ksocknal_data.ksnd_nthreads) != 0) { + read_lock(&ksocknal_data.ksnd_global_lock); + while (ksocknal_data.ksnd_nthreads != 0) { i++; CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */ "waiting for %d threads to terminate\n", - atomic_read (&ksocknal_data.ksnd_nthreads)); + ksocknal_data.ksnd_nthreads); + read_unlock(&ksocknal_data.ksnd_global_lock); set_current_state (TASK_UNINTERRUPTIBLE); schedule_timeout (HZ); + read_lock(&ksocknal_data.ksnd_global_lock); } + read_unlock(&ksocknal_data.ksnd_global_lock); kpr_deregister (&ksocknal_data.ksnd_router); @@ -1569,14 +2319,15 @@ ksocknal_api_startup (nal_t *nal, ptl_pid_t requested_pid, /* flag lists/ptrs/locks initialised */ ksocknal_data.ksnd_init = SOCKNAL_INIT_DATA; + ksocknal_data.ksnd_nschedulers = ksocknal_nsched(); PORTAL_ALLOC(ksocknal_data.ksnd_schedulers, - sizeof(ksock_sched_t) * SOCKNAL_N_SCHED); + sizeof(ksock_sched_t) * ksocknal_data.ksnd_nschedulers); if (ksocknal_data.ksnd_schedulers == NULL) { ksocknal_api_shutdown (nal); return (-ENOMEM); } - for (i = 0; i < SOCKNAL_N_SCHED; i++) { + for (i = 0; i < ksocknal_data.ksnd_nschedulers; i++) { ksock_sched_t *kss = &ksocknal_data.ksnd_schedulers[i]; spin_lock_init (&kss->kss_lock); @@ -1589,7 +2340,7 @@ ksocknal_api_startup (nal_t *nal, ptl_pid_t requested_pid, } /* NB we have to wait to be told our true NID... */ - process_id.pid = requested_pid; //LUSTRE_SRV_PTL_PID; + process_id.pid = requested_pid; process_id.nid = 0; rc = lib_init(&ksocknal_lib, nal, process_id, @@ -1602,7 +2353,7 @@ ksocknal_api_startup (nal_t *nal, ptl_pid_t requested_pid, ksocknal_data.ksnd_init = SOCKNAL_INIT_LIB; // flag lib_init() called - for (i = 0; i < SOCKNAL_N_SCHED; i++) { + for (i = 0; i < ksocknal_data.ksnd_nschedulers; i++) { rc = ksocknal_thread_start (ksocknal_scheduler, &ksocknal_data.ksnd_schedulers[i]); if (rc != 0) { @@ -1714,6 +2465,14 @@ ksocknal_module_init (void) LASSERT(sizeof (ksocknal_tunables.ksnd_eager_ack) == sizeof (int)); LASSERT(sizeof (ksocknal_tunables.ksnd_typed_conns) == sizeof (int)); LASSERT(sizeof (ksocknal_tunables.ksnd_min_bulk) == sizeof (int)); + LASSERT(sizeof (ksocknal_tunables.ksnd_buffer_size) == sizeof (int)); + LASSERT(sizeof (ksocknal_tunables.ksnd_nagle) == sizeof (int)); + LASSERT(sizeof (ksocknal_tunables.ksnd_keepalive_idle) == sizeof (int)); + LASSERT(sizeof (ksocknal_tunables.ksnd_keepalive_count) == sizeof (int)); + LASSERT(sizeof (ksocknal_tunables.ksnd_keepalive_intvl) == sizeof (int)); +#if CPU_AFFINITY + LASSERT(sizeof (ksocknal_tunables.ksnd_irq_affinity) == sizeof (int)); +#endif #if SOCKNAL_ZC LASSERT(sizeof (ksocknal_tunables.ksnd_zc_min_frag) == sizeof (int)); #endif @@ -1724,12 +2483,20 @@ ksocknal_module_init (void) ksocknal_api.nal_ni_fini = ksocknal_api_shutdown; /* Initialise dynamic tunables to defaults once only */ - ksocknal_tunables.ksnd_io_timeout = SOCKNAL_IO_TIMEOUT; - ksocknal_tunables.ksnd_eager_ack = SOCKNAL_EAGER_ACK; - ksocknal_tunables.ksnd_typed_conns = SOCKNAL_TYPED_CONNS; - ksocknal_tunables.ksnd_min_bulk = SOCKNAL_MIN_BULK; + ksocknal_tunables.ksnd_io_timeout = SOCKNAL_IO_TIMEOUT; + ksocknal_tunables.ksnd_eager_ack = SOCKNAL_EAGER_ACK; + ksocknal_tunables.ksnd_typed_conns = SOCKNAL_TYPED_CONNS; + ksocknal_tunables.ksnd_min_bulk = SOCKNAL_MIN_BULK; + ksocknal_tunables.ksnd_buffer_size = SOCKNAL_BUFFER_SIZE; + ksocknal_tunables.ksnd_nagle = SOCKNAL_NAGLE; + ksocknal_tunables.ksnd_keepalive_idle = SOCKNAL_KEEPALIVE_IDLE; + ksocknal_tunables.ksnd_keepalive_count = SOCKNAL_KEEPALIVE_COUNT; + ksocknal_tunables.ksnd_keepalive_intvl = SOCKNAL_KEEPALIVE_INTVL; +#if CPU_AFFINITY + ksocknal_tunables.ksnd_irq_affinity = SOCKNAL_IRQ_AFFINITY; +#endif #if SOCKNAL_ZC - ksocknal_tunables.ksnd_zc_min_frag = SOCKNAL_ZC_MIN_FRAG; + ksocknal_tunables.ksnd_zc_min_frag = SOCKNAL_ZC_MIN_FRAG; #endif rc = ptl_register_nal(SOCKNAL, &ksocknal_api); diff --git a/lnet/klnds/socklnd/socklnd.h b/lnet/klnds/socklnd/socklnd.h index e14205951e..0a5266a64f 100644 --- a/lnet/klnds/socklnd/socklnd.h +++ b/lnet/klnds/socklnd/socklnd.h @@ -68,23 +68,24 @@ #include <portals/socknal.h> #include <linux/lustre_idl.h> -#if CONFIG_SMP -# define SOCKNAL_N_SCHED num_online_cpus() /* # socknal schedulers */ -#else -# define SOCKNAL_N_SCHED 1 /* # socknal schedulers */ -#endif +#include <linux/lustre_idl.h> #define SOCKNAL_N_AUTOCONNECTD 4 /* # socknal autoconnect daemons */ #define SOCKNAL_MIN_RECONNECT_INTERVAL HZ /* first failed connection retry... */ #define SOCKNAL_MAX_RECONNECT_INTERVAL (60*HZ) /* ...exponentially increasing to this */ /* default vals for runtime tunables */ -#define SOCKNAL_IO_TIMEOUT 20 /* default comms timeout (seconds) */ +#define SOCKNAL_IO_TIMEOUT 50 /* default comms timeout (seconds) */ #define SOCKNAL_EAGER_ACK 0 /* default eager ack (boolean) */ #define SOCKNAL_TYPED_CONNS 1 /* unidirectional large, bidirectional small? */ #define SOCKNAL_ZC_MIN_FRAG (2<<10) /* default smallest zerocopy fragment */ #define SOCKNAL_MIN_BULK (1<<10) /* smallest "large" message */ -#define SOCKNAL_USE_KEEPALIVES 0 /* use tcp/ip keepalive? */ +#define SOCKNAL_BUFFER_SIZE (8<<20) /* default socket buffer size */ +#define SOCKNAL_NAGLE 0 /* enable/disable NAGLE? */ +#define SOCKNAL_IRQ_AFFINITY 1 /* enable/disable IRQ affinity? */ +#define SOCKNAL_KEEPALIVE_IDLE 0 /* # seconds idle before 1st probe */ +#define SOCKNAL_KEEPALIVE_COUNT 10 /* # unanswered probes to determine peer death */ +#define SOCKNAL_KEEPALIVE_INTVL 1 /* seconds between probes */ #define SOCKNAL_PEER_HASH_SIZE 101 /* # peer lists */ @@ -99,9 +100,14 @@ #define SOCKNAL_RESCHED 100 /* # scheduler loops before reschedule */ #define SOCKNAL_ENOMEM_RETRY 1 /* jiffies between retries */ +#define SOCKNAL_MAX_INTERFACES 16 /* Largest number of interfaces we bind */ + +#define SOCKNAL_ROUND_ROBIN 0 /* round robin / load balance */ + #define SOCKNAL_TX_LOW_WATER(sk) (((sk)->sk_sndbuf*8)/10) #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,72)) +# define sk_allocation allocation # define sk_data_ready data_ready # define sk_write_space write_space # define sk_user_data user_data @@ -112,6 +118,7 @@ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) # define sk_wmem_queued wmem_queued +# define sk_err err #endif typedef struct /* pool of forwarding buffers */ @@ -136,24 +143,41 @@ typedef struct /* per scheduler state */ int kss_nconns; /* # connections assigned to this scheduler */ } ksock_sched_t; -typedef struct { +typedef struct +{ int ksni_valid:1; /* been set yet? */ int ksni_bound:1; /* bound to a cpu yet? */ int ksni_sched:6; /* which scheduler (assumes < 64) */ } ksock_irqinfo_t; -typedef struct { +typedef struct +{ + __u32 ksni_ipaddr; /* interface's IP address */ + __u32 ksni_netmask; /* interface's network mask */ + int ksni_nroutes; /* # routes using (active) */ + int ksni_npeers; /* # peers using (passive) */ +} ksock_interface_t; + +typedef struct +{ int ksnd_io_timeout; /* "stuck" socket timeout (seconds) */ int ksnd_eager_ack; /* make TCP ack eagerly? */ int ksnd_typed_conns; /* drive sockets by type? */ int ksnd_min_bulk; /* smallest "large" message */ + int ksnd_buffer_size; /* socket buffer size */ + int ksnd_nagle; /* enable NAGLE? */ + int ksnd_irq_affinity; /* enable IRQ affinity? */ + int ksnd_keepalive_idle; /* # idle secs before 1st probe */ + int ksnd_keepalive_count; /* # probes */ + int ksnd_keepalive_intvl; /* time between probes */ #if SOCKNAL_ZC unsigned int ksnd_zc_min_frag; /* minimum zero copy frag size */ #endif struct ctl_table_header *ksnd_sysctl; /* sysctl interface */ } ksock_tunables_t; -typedef struct { +typedef struct +{ int ksnd_init; /* initialisation state */ __u64 ksnd_incarnation; /* my epoch */ @@ -161,9 +185,10 @@ typedef struct { struct list_head *ksnd_peers; /* hash table of all my known peers */ int ksnd_peer_hash_size; /* size of ksnd_peers */ - atomic_t ksnd_nthreads; /* # live threads */ + int ksnd_nthreads; /* # live threads */ int ksnd_shuttingdown; /* tell threads to exit */ - ksock_sched_t *ksnd_schedulers; /* scheduler state */ + int ksnd_nschedulers; /* # schedulers */ + ksock_sched_t *ksnd_schedulers; /* their state */ atomic_t ksnd_npeers; /* total # peers extant */ atomic_t ksnd_nclosing_conns; /* # closed conns extant */ @@ -191,6 +216,9 @@ typedef struct { spinlock_t ksnd_autoconnectd_lock; /* serialise */ ksock_irqinfo_t ksnd_irqinfo[NR_IRQS];/* irq->scheduler lookup */ + + int ksnd_ninterfaces; + ksock_interface_t ksnd_interfaces[SOCKNAL_MAX_INTERFACES]; /* published interfaces */ } ksock_nal_data_t; #define SOCKNAL_INIT_NOTHING 0 @@ -291,6 +319,7 @@ typedef struct ksock_conn void *ksnc_saved_write_space; /* socket's original write_space() callback */ atomic_t ksnc_refcount; /* # users */ ksock_sched_t *ksnc_scheduler; /* who schedules this connection */ + __u32 ksnc_myipaddr; /* my IP */ __u32 ksnc_ipaddr; /* peer's IP */ int ksnc_port; /* peer's port */ int ksnc_closing; /* being shut down */ @@ -318,6 +347,7 @@ typedef struct ksock_conn struct list_head ksnc_tx_list; /* where I enq waiting for output space */ struct list_head ksnc_tx_queue; /* packets waiting to be sent */ unsigned long ksnc_tx_deadline; /* when (in jiffies) tx times out */ + int ksnc_tx_bufnob; /* send buffer marker */ atomic_t ksnc_tx_nob; /* # bytes queued */ int ksnc_tx_ready; /* write space */ int ksnc_tx_scheduled; /* being progressed */ @@ -333,17 +363,15 @@ typedef struct ksock_route struct list_head ksnr_connect_list; /* chain on autoconnect list */ struct ksock_peer *ksnr_peer; /* owning peer */ atomic_t ksnr_refcount; /* # users */ - int ksnr_sharecount; /* lconf usage counter */ unsigned long ksnr_timeout; /* when (in jiffies) reconnection can happen next */ unsigned int ksnr_retry_interval; /* how long between retries */ - __u32 ksnr_ipaddr; /* an IP address for this peer */ + __u32 ksnr_myipaddr; /* my IP */ + __u32 ksnr_ipaddr; /* IP address to connect to */ int ksnr_port; /* port to connect to */ - int ksnr_buffer_size; /* size of socket buffers */ - unsigned int ksnr_irq_affinity:1; /* set affinity? */ - unsigned int ksnr_eager:1; /* connect eagery? */ unsigned int ksnr_connecting:4; /* autoconnects in progress by type */ unsigned int ksnr_connected:4; /* connections established by type */ unsigned int ksnr_deleted:1; /* been removed from peer? */ + unsigned int ksnr_share_count; /* created explicitly? */ int ksnr_conn_count; /* # conns established by this route */ } ksock_route_t; @@ -352,12 +380,15 @@ typedef struct ksock_peer struct list_head ksnp_list; /* stash on global peer list */ ptl_nid_t ksnp_nid; /* who's on the other end(s) */ atomic_t ksnp_refcount; /* # users */ + int ksnp_sharecount; /* lconf usage counter */ int ksnp_closing; /* being closed */ int ksnp_error; /* errno on closing last conn */ struct list_head ksnp_conns; /* all active connections */ struct list_head ksnp_routes; /* routes */ struct list_head ksnp_tx_queue; /* waiting packets */ unsigned long ksnp_last_alive; /* when (in jiffies) I was last alive */ + int ksnp_n_passive_ips; /* # of... */ + __u32 ksnp_passive_ips[SOCKNAL_MAX_INTERFACES]; /* preferred local interfaces */ } ksock_peer_t; @@ -366,18 +397,18 @@ extern ksock_nal_data_t ksocknal_data; extern ksock_tunables_t ksocknal_tunables; static inline struct list_head * -ksocknal_nid2peerlist (ptl_nid_t nid) +ksocknal_nid2peerlist (ptl_nid_t nid) { unsigned int hash = ((unsigned int)nid) % ksocknal_data.ksnd_peer_hash_size; - + return (&ksocknal_data.ksnd_peers [hash]); } static inline int -ksocknal_getconnsock (ksock_conn_t *conn) +ksocknal_getconnsock (ksock_conn_t *conn) { int rc = -ESHUTDOWN; - + read_lock (&ksocknal_data.ksnd_global_lock); if (!conn->ksnc_closing) { rc = 0; @@ -394,6 +425,61 @@ ksocknal_putconnsock (ksock_conn_t *conn) fput (conn->ksnc_sock->file); } +#ifndef CONFIG_SMP +static inline +int ksocknal_nsched(void) +{ + return 1; +} +#else +#include <linux/lustre_version.h> +# if !(defined(CONFIG_X86) && (LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21))) || defined(CONFIG_X86_64) || (LUSTRE_KERNEL_VERSION < 39) || ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)) && !defined(CONFIG_X86_HT)) +static inline int +ksocknal_nsched(void) +{ + return num_online_cpus(); +} + +static inline int +ksocknal_sched2cpu(int i) +{ + return i; +} + +static inline int +ksocknal_irqsched2cpu(int i) +{ + return i; +} +# else +static inline int +ksocknal_nsched(void) +{ + if (smp_num_siblings == 1) + return (num_online_cpus()); + + /* We need to know if this assumption is crap */ + LASSERT (smp_num_siblings == 2); + return (num_online_cpus()/2); +} + +static inline int +ksocknal_sched2cpu(int i) +{ + if (smp_num_siblings == 1) + return i; + + return (i * 2); +} + +static inline int +ksocknal_irqsched2cpu(int i) +{ + return (ksocknal_sched2cpu(i) + 1); +} +# endif +#endif + extern void ksocknal_put_route (ksock_route_t *route); extern void ksocknal_put_peer (ksock_peer_t *peer); extern ksock_peer_t *ksocknal_find_peer_locked (ptl_nid_t nid); @@ -401,7 +487,7 @@ extern ksock_peer_t *ksocknal_get_peer (ptl_nid_t nid); extern int ksocknal_del_route (ptl_nid_t nid, __u32 ipaddr, int single, int keep_conn); extern int ksocknal_create_conn (ksock_route_t *route, - struct socket *sock, int bind_irq, int type); + struct socket *sock, int type); extern void ksocknal_close_conn_locked (ksock_conn_t *conn, int why); extern void ksocknal_terminate_conn (ksock_conn_t *conn); extern void ksocknal_destroy_conn (ksock_conn_t *conn); @@ -422,6 +508,9 @@ extern void ksocknal_data_ready(struct sock *sk, int n); extern void ksocknal_write_space(struct sock *sk); extern int ksocknal_autoconnectd (void *arg); extern int ksocknal_reaper (void *arg); +extern int ksocknal_get_conn_tunables (ksock_conn_t *conn, int *txmem, + int *rxmem, int *nagle); extern int ksocknal_setup_sock (struct socket *sock); -extern int ksocknal_hello (struct socket *sock, - ptl_nid_t *nid, int *type, __u64 *incarnation); +extern int ksocknal_send_hello (ksock_conn_t *conn, __u32 *ipaddrs, int nipaddrs); +extern int ksocknal_recv_hello (ksock_conn_t *conn, + ptl_nid_t *nid, __u64 *incarnation, __u32 *ipaddrs); diff --git a/lnet/klnds/socklnd/socklnd_cb.c b/lnet/klnds/socklnd/socklnd_cb.c index 5815d16f0b..b22d501ed9 100644 --- a/lnet/klnds/socklnd/socklnd_cb.c +++ b/lnet/klnds/socklnd/socklnd_cb.c @@ -229,6 +229,7 @@ int ksocknal_transmit (ksock_conn_t *conn, ksock_tx_t *tx) { int rc; + int bufnob; if (ksocknal_data.ksnd_stall_tx != 0) { set_current_state (TASK_UNINTERRUPTIBLE); @@ -254,6 +255,20 @@ ksocknal_transmit (ksock_conn_t *conn, ksock_tx_t *tx) rc = ksocknal_send_kiov (conn, tx); } + bufnob = conn->ksnc_sock->sk->sk_wmem_queued; + if (rc > 0) /* sent something? */ + conn->ksnc_tx_bufnob += rc; /* account it */ + + if (bufnob < conn->ksnc_tx_bufnob) { + /* allocated send buffer bytes < computed; infer + * something got ACKed */ + conn->ksnc_tx_deadline = jiffies + + ksocknal_tunables.ksnd_io_timeout * HZ; + conn->ksnc_peer->ksnp_last_alive = jiffies; + conn->ksnc_tx_bufnob = bufnob; + mb(); + } + if (rc <= 0) { /* Didn't write anything. * @@ -286,18 +301,10 @@ ksocknal_transmit (ksock_conn_t *conn, ksock_tx_t *tx) break; } + /* socket's wmem_queued now includes 'rc' bytes */ + atomic_sub (rc, &conn->ksnc_tx_nob); rc = 0; - /* Consider the connection alive since we managed to chuck - * more data into it. Really, we'd like to consider it - * alive only when the peer ACKs something, but - * write_space() only gets called back while SOCK_NOSPACE - * is set. Instead, we presume peer death has occurred if - * the socket doesn't drain within a timout */ - conn->ksnc_tx_deadline = jiffies + - ksocknal_tunables.ksnd_io_timeout * HZ; - conn->ksnc_peer->ksnp_last_alive = jiffies; - } while (tx->tx_resid != 0); ksocknal_putconnsock (conn); @@ -519,8 +526,6 @@ ksocknal_tx_done (ksock_tx_t *tx, int asynch) ENTRY; if (tx->tx_conn != NULL) { - /* This tx got queued on a conn; do the accounting... */ - atomic_sub (tx->tx_nob, &tx->tx_conn->ksnc_tx_nob); #if SOCKNAL_ZC /* zero copy completion isn't always from * process_transmit() so it needs to keep a ref on @@ -635,7 +640,7 @@ ksocknal_launch_autoconnect_locked (ksock_route_t *route) LASSERT (!route->ksnr_deleted); LASSERT ((route->ksnr_connected & (1 << SOCKNAL_CONN_ANY)) == 0); LASSERT ((route->ksnr_connected & KSNR_TYPED_ROUTES) != KSNR_TYPED_ROUTES); - LASSERT (!route->ksnr_connecting); + LASSERT (route->ksnr_connecting == 0); if (ksocknal_tunables.ksnd_typed_conns) route->ksnr_connecting = @@ -697,13 +702,16 @@ ksocknal_find_conn_locked (ksock_tx_t *tx, ksock_peer_t *peer) int tnob = 0; ksock_conn_t *fallback = NULL; int fnob = 0; + ksock_conn_t *conn; - /* Find the conn with the shortest tx queue */ list_for_each (tmp, &peer->ksnp_conns) { ksock_conn_t *c = list_entry(tmp, ksock_conn_t, ksnc_list); +#if SOCKNAL_ROUND_ROBIN + const int nob = 0; +#else int nob = atomic_read(&c->ksnc_tx_nob) + c->ksnc_sock->sk->sk_wmem_queued; - +#endif LASSERT (!c->ksnc_closing); if (fallback == NULL || nob < fnob) { @@ -738,7 +746,16 @@ ksocknal_find_conn_locked (ksock_tx_t *tx, ksock_peer_t *peer) } /* prefer the typed selection */ - return ((typed != NULL) ? typed : fallback); + conn = (typed != NULL) ? typed : fallback; + +#if SOCKNAL_ROUND_ROBIN + if (conn != NULL) { + /* round-robin all else being equal */ + list_del (&conn->ksnc_list); + list_add_tail (&conn->ksnc_list, &peer->ksnp_conns); + } +#endif + return conn; } void @@ -769,9 +786,14 @@ ksocknal_queue_tx_locked (ksock_tx_t *tx, ksock_conn_t *conn) #endif spin_lock_irqsave (&sched->kss_lock, flags); - conn->ksnc_tx_deadline = jiffies + - ksocknal_tunables.ksnd_io_timeout * HZ; - mb(); /* order with list_add_tail */ + if (list_empty(&conn->ksnc_tx_queue) && + conn->ksnc_sock->sk->sk_wmem_queued == 0) { + /* First packet starts the timeout */ + conn->ksnc_tx_deadline = jiffies + + ksocknal_tunables.ksnd_io_timeout * HZ; + conn->ksnc_tx_bufnob = 0; + mb(); /* order with adding to tx_queue */ + } list_add_tail (&tx->tx_list, &conn->ksnc_tx_queue); @@ -793,46 +815,32 @@ ksocknal_find_connectable_route_locked (ksock_peer_t *peer) { struct list_head *tmp; ksock_route_t *route; - ksock_route_t *first_lazy = NULL; - int found_connecting_or_connected = 0; int bits; list_for_each (tmp, &peer->ksnp_routes) { route = list_entry (tmp, ksock_route_t, ksnr_list); bits = route->ksnr_connected; - - if ((bits & KSNR_TYPED_ROUTES) == KSNR_TYPED_ROUTES || - (bits & (1 << SOCKNAL_CONN_ANY)) != 0 || - route->ksnr_connecting != 0) { - /* All typed connections have been established, or - * an untyped connection has been established, or - * connections are currently being established */ - found_connecting_or_connected = 1; + + /* All typed connections established? */ + if ((bits & KSNR_TYPED_ROUTES) == KSNR_TYPED_ROUTES) + continue; + + /* Untyped connection established? */ + if ((bits & (1 << SOCKNAL_CONN_ANY)) != 0) + continue; + + /* connection being established? */ + if (route->ksnr_connecting != 0) continue; - } /* too soon to retry this guy? */ if (!time_after_eq (jiffies, route->ksnr_timeout)) continue; - /* eager routes always want to be connected */ - if (route->ksnr_eager) - return (route); - - if (first_lazy == NULL) - first_lazy = route; + return (route); } - /* No eager routes need to be connected. If some connection has - * already been established, or is being established there's nothing to - * do. Otherwise we return the first lazy route we found. If it fails - * to connect, it will go to the end of the list. */ - - if (!list_empty (&peer->ksnp_conns) || - found_connecting_or_connected) - return (NULL); - - return (first_lazy); + return (NULL); } ksock_route_t * @@ -880,8 +888,9 @@ ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid) tx->tx_hdr = (ptl_hdr_t *)tx->tx_iov[0].iov_base; g_lock = &ksocknal_data.ksnd_global_lock; +#if !SOCKNAL_ROUND_ROBIN read_lock (g_lock); - + peer = ksocknal_find_target_peer_locked (tx, nid); if (peer == NULL) { read_unlock (g_lock); @@ -898,19 +907,17 @@ ksocknal_launch_packet (ksock_tx_t *tx, ptl_nid_t nid) return (0); } } - - /* Making one or more connections; I'll need a write lock... */ - - atomic_inc (&peer->ksnp_refcount); /* +1 ref for me while I unlock */ + + /* I'll need a write lock... */ read_unlock (g_lock); - write_lock_irqsave (g_lock, flags); - - if (peer->ksnp_closing) { /* peer deleted as I blocked! */ - write_unlock_irqrestore (g_lock, flags); - ksocknal_put_peer (peer); +#endif + write_lock_irqsave(g_lock, flags); + + peer = ksocknal_find_target_peer_locked (tx, nid); + if (peer == NULL) { + write_unlock_irqrestore(g_lock, flags); return (-EHOSTUNREACH); } - ksocknal_put_peer (peer); /* drop ref I got above */ for (;;) { /* launch any/all autoconnections that need it */ @@ -1096,19 +1103,26 @@ ksocknal_fwd_packet (void *arg, kpr_fwd_desc_t *fwd) int ksocknal_thread_start (int (*fn)(void *arg), void *arg) { - long pid = kernel_thread (fn, arg, 0); + long pid = kernel_thread (fn, arg, 0); + unsigned long flags; if (pid < 0) return ((int)pid); - atomic_inc (&ksocknal_data.ksnd_nthreads); + write_lock_irqsave(&ksocknal_data.ksnd_global_lock, flags); + ksocknal_data.ksnd_nthreads++; + write_unlock_irqrestore(&ksocknal_data.ksnd_global_lock, flags); return (0); } void ksocknal_thread_fini (void) { - atomic_dec (&ksocknal_data.ksnd_nthreads); + unsigned long flags; + + write_lock_irqsave(&ksocknal_data.ksnd_global_lock, flags); + ksocknal_data.ksnd_nthreads--; + write_unlock_irqrestore(&ksocknal_data.ksnd_global_lock, flags); } void @@ -1116,7 +1130,7 @@ ksocknal_fmb_callback (void *arg, int error) { ksock_fmb_t *fmb = (ksock_fmb_t *)arg; ksock_fmb_pool_t *fmp = fmb->fmb_pool; - ptl_hdr_t *hdr = (ptl_hdr_t *)page_address(fmb->fmb_kiov[0].kiov_page); + ptl_hdr_t *hdr = &fmb->fmb_hdr; ksock_conn_t *conn = NULL; ksock_sched_t *sched; unsigned long flags; @@ -1126,14 +1140,14 @@ ksocknal_fmb_callback (void *arg, int error) if (error != 0) CERROR("Failed to route packet from " LPX64" %s to "LPX64" %s: %d\n", - NTOH__u64(hdr->src_nid), - portals_nid2str(SOCKNAL, NTOH__u64(hdr->src_nid), ipbuf), - NTOH__u64(hdr->dest_nid), - portals_nid2str(SOCKNAL, NTOH__u64(hdr->dest_nid), ipbuf2), + le64_to_cpu(hdr->src_nid), + portals_nid2str(SOCKNAL, le64_to_cpu(hdr->src_nid), ipbuf), + le64_to_cpu(hdr->dest_nid), + portals_nid2str(SOCKNAL, le64_to_cpu(hdr->dest_nid), ipbuf2), error); else CDEBUG (D_NET, "routed packet from "LPX64" to "LPX64": OK\n", - NTOH__u64 (hdr->src_nid), NTOH__u64 (hdr->dest_nid)); + le64_to_cpu(hdr->src_nid), le64_to_cpu(hdr->dest_nid)); /* drop peer ref taken on init */ ksocknal_put_peer (fmb->fmb_peer); @@ -1213,7 +1227,7 @@ int ksocknal_init_fmb (ksock_conn_t *conn, ksock_fmb_t *fmb) { int payload_nob = conn->ksnc_rx_nob_left; - ptl_nid_t dest_nid = NTOH__u64 (conn->ksnc_hdr.dest_nid); + ptl_nid_t dest_nid = le64_to_cpu(conn->ksnc_hdr.dest_nid); int niov = 0; int nob = payload_nob; @@ -1250,7 +1264,7 @@ ksocknal_init_fmb (ksock_conn_t *conn, ksock_fmb_t *fmb) if (payload_nob == 0) { /* got complete packet already */ CDEBUG (D_NET, "%p "LPX64"->"LPX64" fwd_start (immediate)\n", - conn, NTOH__u64 (conn->ksnc_hdr.src_nid), dest_nid); + conn, le64_to_cpu(conn->ksnc_hdr.src_nid), dest_nid); kpr_fwd_start (&ksocknal_data.ksnd_router, &fmb->fmb_fwd); @@ -1271,7 +1285,7 @@ ksocknal_init_fmb (ksock_conn_t *conn, ksock_fmb_t *fmb) memcpy(conn->ksnc_rx_kiov, fmb->fmb_kiov, niov * sizeof(ptl_kiov_t)); CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d reading body\n", conn, - NTOH__u64 (conn->ksnc_hdr.src_nid), dest_nid, payload_nob); + le64_to_cpu(conn->ksnc_hdr.src_nid), dest_nid, payload_nob); return (0); } @@ -1279,9 +1293,9 @@ void ksocknal_fwd_parse (ksock_conn_t *conn) { ksock_peer_t *peer; - ptl_nid_t dest_nid = NTOH__u64 (conn->ksnc_hdr.dest_nid); - ptl_nid_t src_nid = NTOH__u64 (conn->ksnc_hdr.src_nid); - int body_len = NTOH__u32 (conn->ksnc_hdr.payload_length); + ptl_nid_t dest_nid = le64_to_cpu(conn->ksnc_hdr.dest_nid); + ptl_nid_t src_nid = le64_to_cpu(conn->ksnc_hdr.src_nid); + int body_len = le32_to_cpu(conn->ksnc_hdr.payload_length); char str[PTL_NALFMT_SIZE]; char str2[PTL_NALFMT_SIZE]; @@ -1458,8 +1472,8 @@ ksocknal_process_receive (ksock_conn_t *conn) switch (conn->ksnc_rx_state) { case SOCKNAL_RX_HEADER: - if (conn->ksnc_hdr.type != HTON__u32(PTL_MSG_HELLO) && - NTOH__u64(conn->ksnc_hdr.dest_nid) != + if (conn->ksnc_hdr.type != cpu_to_le32(PTL_MSG_HELLO) && + le64_to_cpu(conn->ksnc_hdr.dest_nid) != ksocknal_lib.libnal_ni.ni_pid.nid) { /* This packet isn't for me */ ksocknal_fwd_parse (conn); @@ -1505,8 +1519,8 @@ ksocknal_process_receive (ksock_conn_t *conn) case SOCKNAL_RX_BODY_FWD: /* payload all received */ CDEBUG (D_NET, "%p "LPX64"->"LPX64" %d fwd_start (got body)\n", - conn, NTOH__u64 (conn->ksnc_hdr.src_nid), - NTOH__u64 (conn->ksnc_hdr.dest_nid), + conn, le64_to_cpu(conn->ksnc_hdr.src_nid), + le64_to_cpu(conn->ksnc_hdr.dest_nid), conn->ksnc_rx_nob_left); /* forward the packet. NB ksocknal_init_fmb() put fmb into @@ -1585,6 +1599,25 @@ ksocknal_recv_pages (lib_nal_t *nal, void *private, lib_msg_t *msg, return (PTL_OK); } +static inline int +ksocknal_sched_cansleep(ksock_sched_t *sched) +{ + unsigned long flags; + int rc; + + spin_lock_irqsave(&sched->kss_lock, flags); + + rc = (!ksocknal_data.ksnd_shuttingdown && +#if SOCKNAL_ZC + list_empty(&sched->kss_zctxdone_list) && +#endif + list_empty(&sched->kss_rx_conns) && + list_empty(&sched->kss_tx_conns)); + + spin_unlock_irqrestore(&sched->kss_lock, flags); + return (rc); +} + int ksocknal_scheduler (void *arg) { ksock_sched_t *sched = (ksock_sched_t *)arg; @@ -1601,14 +1634,13 @@ int ksocknal_scheduler (void *arg) kportal_blockallsigs (); #if (CONFIG_SMP && CPU_AFFINITY) - if ((cpu_online_map & (1 << id)) != 0) { -#if 1 - current->cpus_allowed = (1 << id); -#else - set_cpus_allowed (current, 1<<id); -#endif + id = ksocknal_sched2cpu(id); + if (cpu_online(id)) { + cpumask_t m; + cpu_set(id, m); + set_cpus_allowed(current, m); } else { - CERROR ("Can't set CPU affinity for %s\n", name); + CERROR ("Can't set CPU affinity for %s to %d\n", name, id); } #endif /* CONFIG_SMP && CPU_AFFINITY */ @@ -1736,18 +1768,8 @@ int ksocknal_scheduler (void *arg) nloops = 0; if (!did_something) { /* wait for something to do */ -#if SOCKNAL_ZC rc = wait_event_interruptible (sched->kss_waitq, - ksocknal_data.ksnd_shuttingdown || - !list_empty(&sched->kss_rx_conns) || - !list_empty(&sched->kss_tx_conns) || - !list_empty(&sched->kss_zctxdone_list)); -#else - rc = wait_event_interruptible (sched->kss_waitq, - ksocknal_data.ksnd_shuttingdown || - !list_empty(&sched->kss_rx_conns) || - !list_empty(&sched->kss_tx_conns)); -#endif + !ksocknal_sched_cansleep(sched)); LASSERT (rc == 0); } else our_cond_resched(); @@ -1935,133 +1957,245 @@ ksocknal_sock_read (struct socket *sock, void *buffer, int nob) } int -ksocknal_hello (struct socket *sock, ptl_nid_t *nid, int *type, - __u64 *incarnation) +ksocknal_send_hello (ksock_conn_t *conn, __u32 *ipaddrs, int nipaddrs) { - int rc; + /* CAVEAT EMPTOR: this byte flips 'ipaddrs' */ + struct socket *sock = conn->ksnc_sock; ptl_hdr_t hdr; ptl_magicversion_t *hmv = (ptl_magicversion_t *)&hdr.dest_nid; - char ipbuf[PTL_NALFMT_SIZE]; - char ipbuf2[PTL_NALFMT_SIZE]; + int i; + int rc; - LASSERT (sizeof (*hmv) == sizeof (hdr.dest_nid)); + LASSERT (conn->ksnc_type != SOCKNAL_CONN_NONE); + LASSERT (nipaddrs <= SOCKNAL_MAX_INTERFACES); - memset (&hdr, 0, sizeof (hdr)); - hmv->magic = __cpu_to_le32 (PORTALS_PROTO_MAGIC); - hmv->version_major = __cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR); - hmv->version_minor = __cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR); + /* No need for getconnsock/putconnsock */ + LASSERT (!conn->ksnc_closing); - hdr.src_nid = __cpu_to_le64 (ksocknal_lib.libnal_ni.ni_pid.nid); - hdr.type = __cpu_to_le32 (PTL_MSG_HELLO); + LASSERT (sizeof (*hmv) == sizeof (hdr.dest_nid)); + hmv->magic = cpu_to_le32 (PORTALS_PROTO_MAGIC); + hmv->version_major = cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR); + hmv->version_minor = cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR); - hdr.msg.hello.type = __cpu_to_le32 (*type); + hdr.src_nid = cpu_to_le64 (ksocknal_lib.libnal_ni.ni_pid.nid); + hdr.type = cpu_to_le32 (PTL_MSG_HELLO); + hdr.payload_length = cpu_to_le32 (nipaddrs * sizeof(*ipaddrs)); + + hdr.msg.hello.type = cpu_to_le32 (conn->ksnc_type); hdr.msg.hello.incarnation = - __cpu_to_le64 (ksocknal_data.ksnd_incarnation); + cpu_to_le64 (ksocknal_data.ksnd_incarnation); - /* Assume sufficient socket buffering for this message */ - rc = ksocknal_sock_write (sock, &hdr, sizeof (hdr)); + /* Receiver is eager */ + rc = ksocknal_sock_write (sock, &hdr, sizeof(hdr)); if (rc != 0) { - CERROR ("Error %d sending HELLO to "LPX64" %s\n", - rc, *nid, portals_nid2str(SOCKNAL, *nid, ipbuf)); + CERROR ("Error %d sending HELLO hdr to %u.%u.%u.%u/%d\n", + rc, HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port); return (rc); } + + if (nipaddrs == 0) + return (0); + + for (i = 0; i < nipaddrs; i++) { + ipaddrs[i] = __cpu_to_le32 (ipaddrs[i]); + } + + rc = ksocknal_sock_write (sock, ipaddrs, nipaddrs * sizeof(*ipaddrs)); + if (rc != 0) + CERROR ("Error %d sending HELLO payload (%d)" + " to %u.%u.%u.%u/%d\n", rc, nipaddrs, + HIPQUAD(conn->ksnc_ipaddr), conn->ksnc_port); + return (rc); +} + +int +ksocknal_invert_type(int type) +{ + switch (type) + { + case SOCKNAL_CONN_ANY: + case SOCKNAL_CONN_CONTROL: + return (type); + case SOCKNAL_CONN_BULK_IN: + return SOCKNAL_CONN_BULK_OUT; + case SOCKNAL_CONN_BULK_OUT: + return SOCKNAL_CONN_BULK_IN; + default: + return (SOCKNAL_CONN_NONE); + } +} + +int +ksocknal_recv_hello (ksock_conn_t *conn, ptl_nid_t *nid, + __u64 *incarnation, __u32 *ipaddrs) +{ + struct socket *sock = conn->ksnc_sock; + int rc; + int nips; + int i; + int type; + ptl_hdr_t hdr; + ptl_magicversion_t *hmv; + + hmv = (ptl_magicversion_t *)&hdr.dest_nid; + LASSERT (sizeof (*hmv) == sizeof (hdr.dest_nid)); rc = ksocknal_sock_read (sock, hmv, sizeof (*hmv)); if (rc != 0) { - CERROR ("Error %d reading HELLO from "LPX64" %s\n", - rc, *nid, portals_nid2str(SOCKNAL, *nid, ipbuf)); + CERROR ("Error %d reading HELLO from %u.%u.%u.%u\n", + rc, HIPQUAD(conn->ksnc_ipaddr)); return (rc); } - if (hmv->magic != __le32_to_cpu (PORTALS_PROTO_MAGIC)) { - CERROR ("Bad magic %#08x (%#08x expected) from "LPX64" %s\n", - __cpu_to_le32 (hmv->magic), PORTALS_PROTO_MAGIC, *nid, - portals_nid2str(SOCKNAL, *nid, ipbuf)); + if (hmv->magic != le32_to_cpu (PORTALS_PROTO_MAGIC)) { + CERROR ("Bad magic %#08x (%#08x expected) from %u.%u.%u.%u\n", + __cpu_to_le32 (hmv->magic), PORTALS_PROTO_MAGIC, + HIPQUAD(conn->ksnc_ipaddr)); return (-EPROTO); } - if (hmv->version_major != __cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR) || - hmv->version_minor != __cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR)) { + if (hmv->version_major != cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR) || + hmv->version_minor != cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR)) { CERROR ("Incompatible protocol version %d.%d (%d.%d expected)" - " from "LPX64" %s\n", - __le16_to_cpu (hmv->version_major), - __le16_to_cpu (hmv->version_minor), + " from %u.%u.%u.%u\n", + le16_to_cpu (hmv->version_major), + le16_to_cpu (hmv->version_minor), PORTALS_PROTO_VERSION_MAJOR, PORTALS_PROTO_VERSION_MINOR, - *nid, portals_nid2str(SOCKNAL, *nid, ipbuf)); + HIPQUAD(conn->ksnc_ipaddr)); return (-EPROTO); } -#if (PORTALS_PROTO_VERSION_MAJOR != 0) -# error "This code only understands protocol version 0.x" +#if (PORTALS_PROTO_VERSION_MAJOR != 1) +# error "This code only understands protocol version 1.x" #endif - /* version 0 sends magic/version as the dest_nid of a 'hello' header, - * so read the rest of it in now... */ + /* version 1 sends magic/version as the dest_nid of a 'hello' + * header, followed by payload full of interface IP addresses. + * Read the rest of it in now... */ rc = ksocknal_sock_read (sock, hmv + 1, sizeof (hdr) - sizeof (*hmv)); if (rc != 0) { - CERROR ("Error %d reading rest of HELLO hdr from "LPX64" %s\n", - rc, *nid, portals_nid2str(SOCKNAL, *nid, ipbuf)); + CERROR ("Error %d reading rest of HELLO hdr from %u.%u.%u.%u\n", + rc, HIPQUAD(conn->ksnc_ipaddr)); return (rc); } /* ...and check we got what we expected */ - if (hdr.type != __cpu_to_le32 (PTL_MSG_HELLO) || - hdr.payload_length != __cpu_to_le32 (0)) { - CERROR ("Expecting a HELLO hdr with 0 payload," - " but got type %d with %d payload from "LPX64" %s\n", - __le32_to_cpu (hdr.type), - __le32_to_cpu (hdr.payload_length), *nid, - portals_nid2str(SOCKNAL, *nid, ipbuf)); + if (hdr.type != cpu_to_le32 (PTL_MSG_HELLO)) { + CERROR ("Expecting a HELLO hdr," + " but got type %d from %u.%u.%u.%u\n", + le32_to_cpu (hdr.type), + HIPQUAD(conn->ksnc_ipaddr)); return (-EPROTO); } - if (__le64_to_cpu(hdr.src_nid) == PTL_NID_ANY) { - CERROR("Expecting a HELLO hdr with a NID, but got PTL_NID_ANY\n"); + if (le64_to_cpu(hdr.src_nid) == PTL_NID_ANY) { + CERROR("Expecting a HELLO hdr with a NID, but got PTL_NID_ANY" + "from %u.%u.%u.%u\n", HIPQUAD(conn->ksnc_ipaddr)); return (-EPROTO); } if (*nid == PTL_NID_ANY) { /* don't know peer's nid yet */ - *nid = __le64_to_cpu(hdr.src_nid); - } else if (*nid != __le64_to_cpu (hdr.src_nid)) { - CERROR ("Connected to nid "LPX64" %s, but expecting "LPX64" %s\n", - __le64_to_cpu (hdr.src_nid), - portals_nid2str(SOCKNAL, - __le64_to_cpu(hdr.src_nid), - ipbuf), - *nid, portals_nid2str(SOCKNAL, *nid, ipbuf2)); + *nid = le64_to_cpu(hdr.src_nid); + } else if (*nid != le64_to_cpu (hdr.src_nid)) { + CERROR ("Connected to nid "LPX64"@%u.%u.%u.%u " + "but expecting "LPX64"\n", + le64_to_cpu (hdr.src_nid), + HIPQUAD(conn->ksnc_ipaddr), *nid); return (-EPROTO); } - if (*type == SOCKNAL_CONN_NONE) { + type = __le32_to_cpu(hdr.msg.hello.type); + + if (conn->ksnc_type == SOCKNAL_CONN_NONE) { /* I've accepted this connection; peer determines type */ - *type = __le32_to_cpu(hdr.msg.hello.type); - switch (*type) { - case SOCKNAL_CONN_ANY: - case SOCKNAL_CONN_CONTROL: - break; - case SOCKNAL_CONN_BULK_IN: - *type = SOCKNAL_CONN_BULK_OUT; - break; - case SOCKNAL_CONN_BULK_OUT: - *type = SOCKNAL_CONN_BULK_IN; - break; - default: - CERROR ("Unexpected type %d from "LPX64" %s\n", - *type, *nid, - portals_nid2str(SOCKNAL, *nid, ipbuf)); + conn->ksnc_type = ksocknal_invert_type(type); + if (conn->ksnc_type == SOCKNAL_CONN_NONE) { + CERROR ("Unexpected type %d from "LPX64"@%u.%u.%u.%u\n", + type, *nid, HIPQUAD(conn->ksnc_ipaddr)); return (-EPROTO); } - } else if (__le32_to_cpu(hdr.msg.hello.type) != SOCKNAL_CONN_NONE) { - CERROR ("Mismatched types: me %d "LPX64" %s %d\n", - *type, *nid, portals_nid2str(SOCKNAL, *nid, ipbuf), - __le32_to_cpu(hdr.msg.hello.type)); + } else if (ksocknal_invert_type(type) != conn->ksnc_type) { + CERROR ("Mismatched types: me %d, "LPX64"@%u.%u.%u.%u %d\n", + conn->ksnc_type, *nid, HIPQUAD(conn->ksnc_ipaddr), + le32_to_cpu(hdr.msg.hello.type)); return (-EPROTO); } - *incarnation = __le64_to_cpu(hdr.msg.hello.incarnation); + *incarnation = le64_to_cpu(hdr.msg.hello.incarnation); - return (0); + nips = __le32_to_cpu (hdr.payload_length) / sizeof (__u32); + + if (nips > SOCKNAL_MAX_INTERFACES || + nips * sizeof(__u32) != __le32_to_cpu (hdr.payload_length)) { + CERROR("Bad payload length %d from "LPX64"@%u.%u.%u.%u\n", + __le32_to_cpu (hdr.payload_length), + *nid, HIPQUAD(conn->ksnc_ipaddr)); + } + + if (nips == 0) + return (0); + + rc = ksocknal_sock_read (sock, ipaddrs, nips * sizeof(*ipaddrs)); + if (rc != 0) { + CERROR ("Error %d reading IPs from "LPX64"@%u.%u.%u.%u\n", + rc, *nid, HIPQUAD(conn->ksnc_ipaddr)); + return (rc); + } + + for (i = 0; i < nips; i++) { + ipaddrs[i] = __le32_to_cpu(ipaddrs[i]); + + if (ipaddrs[i] == 0) { + CERROR("Zero IP[%d] from "LPX64"@%u.%u.%u.%u\n", + i, *nid, HIPQUAD(conn->ksnc_ipaddr)); + return (-EPROTO); + } + } + + return (nips); +} + +int +ksocknal_get_conn_tunables (ksock_conn_t *conn, int *txmem, int *rxmem, int *nagle) +{ + mm_segment_t oldmm = get_fs (); + struct socket *sock = conn->ksnc_sock; + int len; + int rc; + + rc = ksocknal_getconnsock (conn); + if (rc != 0) { + LASSERT (conn->ksnc_closing); + *txmem = *rxmem = *nagle = 0; + return (-ESHUTDOWN); + } + + set_fs (KERNEL_DS); + + len = sizeof(*txmem); + rc = sock_getsockopt(sock, SOL_SOCKET, SO_SNDBUF, + (char *)txmem, &len); + if (rc == 0) { + len = sizeof(*rxmem); + rc = sock_getsockopt(sock, SOL_SOCKET, SO_RCVBUF, + (char *)rxmem, &len); + } + if (rc == 0) { + len = sizeof(*nagle); + rc = sock->ops->getsockopt(sock, SOL_TCP, TCP_NODELAY, + (char *)nagle, &len); + } + + set_fs (oldmm); + ksocknal_putconnsock (conn); + + if (rc == 0) + *nagle = !*nagle; + else + *txmem = *rxmem = *nagle = 0; + + return (rc); } int @@ -2070,13 +2204,13 @@ ksocknal_setup_sock (struct socket *sock) mm_segment_t oldmm = get_fs (); int rc; int option; + int keep_idle; + int keep_intvl; + int keep_count; + int do_keepalive; struct linger linger; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)) sock->sk->sk_allocation = GFP_NOFS; -#else - sock->sk->allocation = GFP_NOFS; -#endif /* Ensure this socket aborts active sends immediately when we close * it. */ @@ -2103,64 +2237,103 @@ ksocknal_setup_sock (struct socket *sock) return (rc); } -#if SOCKNAL_USE_KEEPALIVES - /* Keepalives: If 3/4 of the timeout elapses, start probing every - * second until the timeout elapses. */ + if (!ksocknal_tunables.ksnd_nagle) { + option = 1; + + set_fs (KERNEL_DS); + rc = sock->ops->setsockopt (sock, SOL_TCP, TCP_NODELAY, + (char *)&option, sizeof (option)); + set_fs (oldmm); + if (rc != 0) { + CERROR ("Can't disable nagle: %d\n", rc); + return (rc); + } + } + + if (ksocknal_tunables.ksnd_buffer_size > 0) { + option = ksocknal_tunables.ksnd_buffer_size; + + set_fs (KERNEL_DS); + rc = sock_setsockopt (sock, SOL_SOCKET, SO_SNDBUF, + (char *)&option, sizeof (option)); + set_fs (oldmm); + if (rc != 0) { + CERROR ("Can't set send buffer %d: %d\n", + option, rc); + return (rc); + } + + set_fs (KERNEL_DS); + rc = sock_setsockopt (sock, SOL_SOCKET, SO_RCVBUF, + (char *)&option, sizeof (option)); + set_fs (oldmm); + if (rc != 0) { + CERROR ("Can't set receive buffer %d: %d\n", + option, rc); + return (rc); + } + } + + /* snapshot tunables */ + keep_idle = ksocknal_tunables.ksnd_keepalive_idle; + keep_count = ksocknal_tunables.ksnd_keepalive_count; + keep_intvl = ksocknal_tunables.ksnd_keepalive_intvl; + + do_keepalive = (keep_idle > 0 && keep_count > 0 && keep_intvl > 0); - option = (ksocknal_tunables.ksnd_io_timeout * 3) / 4; + option = (do_keepalive ? 1 : 0); set_fs (KERNEL_DS); - rc = sock->ops->setsockopt (sock, SOL_TCP, TCP_KEEPIDLE, - (char *)&option, sizeof (option)); + rc = sock_setsockopt (sock, SOL_SOCKET, SO_KEEPALIVE, + (char *)&option, sizeof (option)); set_fs (oldmm); if (rc != 0) { - CERROR ("Can't set TCP_KEEPIDLE: %d\n", rc); + CERROR ("Can't set SO_KEEPALIVE: %d\n", rc); return (rc); } - - option = 1; + + if (!do_keepalive) + return (0); + set_fs (KERNEL_DS); - rc = sock->ops->setsockopt (sock, SOL_TCP, TCP_KEEPINTVL, - (char *)&option, sizeof (option)); + rc = sock->ops->setsockopt (sock, SOL_TCP, TCP_KEEPIDLE, + (char *)&keep_idle, sizeof (keep_idle)); set_fs (oldmm); if (rc != 0) { - CERROR ("Can't set TCP_KEEPINTVL: %d\n", rc); + CERROR ("Can't set TCP_KEEPIDLE: %d\n", rc); return (rc); } - - option = ksocknal_tunables.ksnd_io_timeout / 4; + set_fs (KERNEL_DS); - rc = sock->ops->setsockopt (sock, SOL_TCP, TCP_KEEPCNT, - (char *)&option, sizeof (option)); + rc = sock->ops->setsockopt (sock, SOL_TCP, TCP_KEEPINTVL, + (char *)&keep_intvl, sizeof (keep_intvl)); set_fs (oldmm); if (rc != 0) { CERROR ("Can't set TCP_KEEPINTVL: %d\n", rc); return (rc); } - option = 1; set_fs (KERNEL_DS); - rc = sock_setsockopt (sock, SOL_SOCKET, SO_KEEPALIVE, - (char *)&option, sizeof (option)); + rc = sock->ops->setsockopt (sock, SOL_TCP, TCP_KEEPCNT, + (char *)&keep_count, sizeof (keep_count)); set_fs (oldmm); if (rc != 0) { - CERROR ("Can't set SO_KEEPALIVE: %d\n", rc); + CERROR ("Can't set TCP_KEEPCNT: %d\n", rc); return (rc); } -#endif + return (0); } int ksocknal_connect_peer (ksock_route_t *route, int type) { - struct sockaddr_in peer_addr; + struct sockaddr_in ipaddr; mm_segment_t oldmm = get_fs(); struct timeval tv; int fd; struct socket *sock; int rc; - char ipbuf[PTL_NALFMT_SIZE]; - + rc = sock_create (PF_INET, SOCK_STREAM, 0, &sock); if (rc != 0) { CERROR ("Can't create autoconnect socket: %d\n", rc); @@ -2207,60 +2380,41 @@ ksocknal_connect_peer (ksock_route_t *route, int type) goto out; } - { - int option = 1; - - set_fs (KERNEL_DS); - rc = sock->ops->setsockopt (sock, SOL_TCP, TCP_NODELAY, - (char *)&option, sizeof (option)); - set_fs (oldmm); - if (rc != 0) { - CERROR ("Can't disable nagle: %d\n", rc); - goto out; - } - } - - if (route->ksnr_buffer_size != 0) { - int option = route->ksnr_buffer_size; - - set_fs (KERNEL_DS); - rc = sock_setsockopt (sock, SOL_SOCKET, SO_SNDBUF, - (char *)&option, sizeof (option)); - set_fs (oldmm); - if (rc != 0) { - CERROR ("Can't set send buffer %d: %d\n", - route->ksnr_buffer_size, rc); - goto out; - } + if (route->ksnr_myipaddr != 0) { + /* Bind to the local IP address */ + memset (&ipaddr, 0, sizeof (ipaddr)); + ipaddr.sin_family = AF_INET; + ipaddr.sin_port = htons (0); /* ANY */ + ipaddr.sin_addr.s_addr = htonl(route->ksnr_myipaddr); - set_fs (KERNEL_DS); - rc = sock_setsockopt (sock, SOL_SOCKET, SO_RCVBUF, - (char *)&option, sizeof (option)); - set_fs (oldmm); + rc = sock->ops->bind (sock, (struct sockaddr *)&ipaddr, + sizeof (ipaddr)); if (rc != 0) { - CERROR ("Can't set receive buffer %d: %d\n", - route->ksnr_buffer_size, rc); + CERROR ("Can't bind to local IP %u.%u.%u.%u: %d\n", + HIPQUAD(route->ksnr_myipaddr), rc); goto out; } } - memset (&peer_addr, 0, sizeof (peer_addr)); - peer_addr.sin_family = AF_INET; - peer_addr.sin_port = htons (route->ksnr_port); - peer_addr.sin_addr.s_addr = htonl (route->ksnr_ipaddr); + memset (&ipaddr, 0, sizeof (ipaddr)); + ipaddr.sin_family = AF_INET; + ipaddr.sin_port = htons (route->ksnr_port); + ipaddr.sin_addr.s_addr = htonl (route->ksnr_ipaddr); - rc = sock->ops->connect (sock, (struct sockaddr *)&peer_addr, - sizeof (peer_addr), sock->file->f_flags); + rc = sock->ops->connect (sock, (struct sockaddr *)&ipaddr, + sizeof (ipaddr), sock->file->f_flags); if (rc != 0) { - CERROR ("Error %d connecting to "LPX64" %s\n", rc, + CERROR ("Can't connect to nid "LPX64 + " local IP: %u.%u.%u.%u," + " remote IP: %u.%u.%u.%u/%d: %d\n", route->ksnr_peer->ksnp_nid, - portals_nid2str(SOCKNAL, - route->ksnr_peer->ksnp_nid, - ipbuf)); + HIPQUAD(route->ksnr_myipaddr), + HIPQUAD(route->ksnr_ipaddr), + route->ksnr_port, rc); goto out; } - - rc = ksocknal_create_conn (route, sock, route->ksnr_irq_affinity, type); + + rc = ksocknal_create_conn (route, sock, type); if (rc == 0) { /* Take an extra ref on sock->file to compensate for the * upcoming close which will lose fd's ref on it. */ @@ -2329,12 +2483,13 @@ ksocknal_autoconnect (ksock_route_t *route) } while (!list_empty (&peer->ksnp_tx_queue)); } - /* make this route least-favourite for re-selection */ +#if 0 /* irrelevent with only eager routes */ if (!route->ksnr_deleted) { + /* make this route least-favourite for re-selection */ list_del(&route->ksnr_list); list_add_tail(&route->ksnr_list, &peer->ksnp_routes); } - +#endif write_unlock_irqrestore (&ksocknal_data.ksnd_global_lock, flags); while (!list_empty (&zombies)) { @@ -2343,15 +2498,15 @@ ksocknal_autoconnect (ksock_route_t *route) tx = list_entry (zombies.next, ksock_tx_t, tx_list); CERROR ("Deleting packet type %d len %d ("LPX64" %s->"LPX64" %s)\n", - NTOH__u32 (tx->tx_hdr->type), - NTOH__u32 (tx->tx_hdr->payload_length), - NTOH__u64 (tx->tx_hdr->src_nid), + le32_to_cpu (tx->tx_hdr->type), + le32_to_cpu (tx->tx_hdr->payload_length), + le64_to_cpu (tx->tx_hdr->src_nid), portals_nid2str(SOCKNAL, - NTOH__u64(tx->tx_hdr->src_nid), + le64_to_cpu(tx->tx_hdr->src_nid), ipbuf), - NTOH__u64 (tx->tx_hdr->dest_nid), + le64_to_cpu (tx->tx_hdr->dest_nid), portals_nid2str(SOCKNAL, - NTOH__u64(tx->tx_hdr->src_nid), + le64_to_cpu(tx->tx_hdr->src_nid), ipbuf2)); list_del (&tx->tx_list); @@ -2380,24 +2535,26 @@ ksocknal_autoconnectd (void *arg) if (!list_empty (&ksocknal_data.ksnd_autoconnectd_routes)) { route = list_entry (ksocknal_data.ksnd_autoconnectd_routes.next, ksock_route_t, ksnr_connect_list); - + list_del (&route->ksnr_connect_list); spin_unlock_irqrestore (&ksocknal_data.ksnd_autoconnectd_lock, flags); ksocknal_autoconnect (route); ksocknal_put_route (route); - spin_lock_irqsave (&ksocknal_data.ksnd_autoconnectd_lock, flags); + spin_lock_irqsave(&ksocknal_data.ksnd_autoconnectd_lock, + flags); continue; } - - spin_unlock_irqrestore (&ksocknal_data.ksnd_autoconnectd_lock, flags); - rc = wait_event_interruptible (ksocknal_data.ksnd_autoconnectd_waitq, - ksocknal_data.ksnd_shuttingdown || - !list_empty (&ksocknal_data.ksnd_autoconnectd_routes)); + spin_unlock_irqrestore(&ksocknal_data.ksnd_autoconnectd_lock, + flags); + + rc = wait_event_interruptible(ksocknal_data.ksnd_autoconnectd_waitq, + ksocknal_data.ksnd_shuttingdown || + !list_empty(&ksocknal_data.ksnd_autoconnectd_routes)); - spin_lock_irqsave (&ksocknal_data.ksnd_autoconnectd_lock, flags); + spin_lock_irqsave(&ksocknal_data.ksnd_autoconnectd_lock, flags); } spin_unlock_irqrestore (&ksocknal_data.ksnd_autoconnectd_lock, flags); @@ -2412,32 +2569,39 @@ ksocknal_find_timed_out_conn (ksock_peer_t *peer) /* We're called with a shared lock on ksnd_global_lock */ ksock_conn_t *conn; struct list_head *ctmp; - ksock_sched_t *sched; list_for_each (ctmp, &peer->ksnp_conns) { conn = list_entry (ctmp, ksock_conn_t, ksnc_list); - sched = conn->ksnc_scheduler; /* Don't need the {get,put}connsock dance to deref ksnc_sock... */ LASSERT (!conn->ksnc_closing); - + + if (conn->ksnc_sock->sk->sk_err != 0) { + /* Something (e.g. failed keepalive) set the socket error */ + atomic_inc (&conn->ksnc_refcount); + CERROR ("Socket error %d: "LPX64" %p %d.%d.%d.%d\n", + conn->ksnc_sock->sk->sk_err, peer->ksnp_nid, + conn, HIPQUAD(conn->ksnc_ipaddr)); + return (conn); + } + if (conn->ksnc_rx_started && time_after_eq (jiffies, conn->ksnc_rx_deadline)) { /* Timed out incomplete incoming message */ atomic_inc (&conn->ksnc_refcount); CERROR ("Timed out RX from "LPX64" %p %d.%d.%d.%d\n", - peer->ksnp_nid, conn, HIPQUAD(conn->ksnc_ipaddr)); + peer->ksnp_nid,conn,HIPQUAD(conn->ksnc_ipaddr)); return (conn); } - + if ((!list_empty (&conn->ksnc_tx_queue) || conn->ksnc_sock->sk->sk_wmem_queued != 0) && time_after_eq (jiffies, conn->ksnc_tx_deadline)) { - /* Timed out messages queued for sending, or - * messages buffered in the socket's send buffer */ + /* Timed out messages queued for sending or + * buffered in the socket's send buffer */ atomic_inc (&conn->ksnc_refcount); - CERROR ("Timed out TX to "LPX64" %s%d %p %d.%d.%d.%d\n", - peer->ksnp_nid, + CERROR ("Timed out TX to "LPX64" %s%d %p %d.%d.%d.%d\n", + peer->ksnp_nid, list_empty (&conn->ksnc_tx_queue) ? "" : "Q ", conn->ksnc_sock->sk->sk_wmem_queued, conn, HIPQUAD(conn->ksnc_ipaddr)); diff --git a/lnet/libcfs/Makefile.in b/lnet/libcfs/Makefile.in index 6f9c98148d..0967123ce9 100644 --- a/lnet/libcfs/Makefile.in +++ b/lnet/libcfs/Makefile.in @@ -1,4 +1,4 @@ MODULES = libcfs -libcfs-objs := debug.o lwt.o module.o proc.o +libcfs-objs := debug.o lwt.o module.o proc.o tracefile.o @INCLUDE_RULES@ diff --git a/lnet/libcfs/Makefile.mk b/lnet/libcfs/Makefile.mk index c2014296df..8ecf3c9387 100644 --- a/lnet/libcfs/Makefile.mk +++ b/lnet/libcfs/Makefile.mk @@ -6,4 +6,4 @@ include fs/lustre/portals/Kernelenv obj-y += libcfs.o -libcfs-objs := module.o proc.o debug.o lwt.o +libcfs-objs := module.o proc.o debug.o lwt.o tracefile.o diff --git a/lnet/libcfs/autoMakefile.am b/lnet/libcfs/autoMakefile.am index 192c3efaf1..9c27693325 100644 --- a/lnet/libcfs/autoMakefile.am +++ b/lnet/libcfs/autoMakefile.am @@ -8,4 +8,4 @@ modulenet_DATA := libcfs$(KMODEXT) endif MOSTLYCLEANFILES = *.o *.ko *.mod.c -DIST_SOURCES = $(libcfs-objs:%.o=%.c) +DIST_SOURCES = $(libcfs-objs:%.o=%.c) tracefile.h diff --git a/lnet/libcfs/debug.c b/lnet/libcfs/debug.c index eb75e60442..c56f76ff39 100644 --- a/lnet/libcfs/debug.c +++ b/lnet/libcfs/debug.c @@ -53,21 +53,20 @@ #include <linux/portals_compat25.h> #include <linux/libcfs.h> +#include "tracefile.h" + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) #include <linux/kallsyms.h> #endif unsigned int portal_subsystem_debug = ~0 - (S_PORTALS | S_QSWNAL | S_SOCKNAL | - S_GMNAL | S_IBNAL); + S_GMNAL | S_OPENIBNAL); EXPORT_SYMBOL(portal_subsystem_debug); unsigned int portal_debug = (D_WARNING | D_DLMTRACE | D_ERROR | D_EMERG | D_HA | - D_RPCTRACE | D_VFSTRACE | 0xffffffff); + D_RPCTRACE | D_VFSTRACE); EXPORT_SYMBOL(portal_debug); -unsigned int portal_cerror = 1; -EXPORT_SYMBOL(portal_cerror); - unsigned int portal_printk; EXPORT_SYMBOL(portal_printk); @@ -79,368 +78,32 @@ atomic_t portal_kmemory = ATOMIC_INIT(0); EXPORT_SYMBOL(portal_kmemory); #endif -#define DEBUG_OVERFLOW 1024 -static char *debug_buf = NULL; -static unsigned long debug_size = 0; -static atomic_t debug_off_a = ATOMIC_INIT(0); -static int debug_wrapped; static DECLARE_WAIT_QUEUE_HEAD(debug_ctlwq); -#define DAEMON_SND_SIZE (64 << 10) - -/* - * used by the daemon to keep track the offset into debug_buffer for the next - * write to the file. Usually, the daemon is to write out buffer - * from debug_daemon_next_write upto debug_off - * variable usage - * Reader - portals_debug_msg() - * Writer - portals_debug_daemon() - * portals_debug_daemon_start() during daemon init time - * portals_debug_daemon_continue() to reset to debug_off - * portals_debug_clear_buffer() reset to debug_off for clear - * Note that *_start(), *_continue() & *clear_buffer() should serialized; - */ -static atomic_t debug_daemon_next_write; - -/* - * A debug_daemon can be in following states - * stopped - stopped state means there is no debug_daemon running. - * accordingly, it must be in paused state - * a daemon is in !stopped && !paused state after - * "lctl debug_daemon start" creates debug_daemon successfully - * Variable Usage - * Reader - portals_debug_daemon() - * portals_debug_set_daemon() routines - * Writer - portals_debug_set_daemon() routines - * portals_debug_daemon() on IO error - * paused - a debug_daemon state is changed from !paused into paused - * when "lctl debug_daemon paused" is issued - * "lctl debug_daemon continue" gets a daemon into !paused mode - * Reader - portals_debug_set_daemon() routines - * portals_debug_msg() - * Writer - portals_debug_set_daemon() on init - * portals_debug_daemon() - * - * Daemon state diagram. - * (stopped, paused) - * | <-- debug_daemon start - * V - * (!stopped, !paused) - * | <-- debug_daemon pause - * V - * (!stopped, paused) - * | <-- debug_daemon continue - * V - * (!stopped, !paused) - * | <-- debug_daemon stop - * V - * (stopped, paused) - * Overlapped - this is a state when CDEBUG is too fast for the daemon to - * write out the debug_bufferr. That is, debug_off is to - * overlap debug_daemon_next_write; - * Reader - portals_debug_msg() - * Writer - portals_debug_msg() - */ - -/* - * Description on Trace Daemon Synchronization - * - * Three categories of code are synchronizing between each other - * 1. lctl, portals_debug_set_daemon(), the user debug control code, - * as well as portals_debug_clear_buffer() - * 2. CDEBUG, portals_debug_msg(), the debug put messages routine - * 3. Daemon, portals_debug_daemon(), to write out debug log file - * - * - * Three different controls for synchronizations - * - * 1. debug_daemon_semaphore - * The usage of this semaphore is to serialize multiple lctl controls - * in manipulating debug daemon state. The semaphore serves as the - * gatekeeper to allow only one user control thread, at any giving time, - * to access debug daemon state and keeps the other user control requests - * in wait state until the current control request is serviced. - * - * 2. wait_queue_head_t lctl (paired with lctl_event flag) - * Lctl event is the event between portals_debug_set_daemon() and - * portals_debug_daemon(). Lctl is an indicator for portals_debug_daemon() - * to flush data out to file. portals_debug_daemon() is to use lctl event - * as signal channel to wakeup portals_debug_set_daemon() upon flush - * operation is done. - * - * Producer : - * portals_debug_daemon() uses to wake up - * portals_debug_set_daemon(), pause and stop, routines - * Consumer : - * portals_debug_set_daemon(), stop and pause operations, - * wait and sleep on the event - * - * 3. wait_queue_head_t daemon (paired with daemon_event flag) - * This is an event channel to wakeup portals_debug_daemon. Daemon - * wakes up to run whenever there is an event posted. Daemon handles - * 2 types of operations . 1. Writes data out to debug file, 2. Flushes - * file and terminates base on lctl event. - * File operation - - * Daemon is normally in a sleep state. - * Daemon is woken up through daemon event whenever CDEBUG is - * putting data over any 64K boundary. - * File flush and termination - - * On portals_debug_daemon_stop/pause() operations, lctl control - * is to wake up daemon through daemon event. - * - * We can't use sleep_on() and wake_up() to replace daemon event because - * portals_debug_daemon() must catch the wakeup operation posted by - * portals_debug_daemon_stop/pause(). Otherwise, stop and pause may - * stuck in lctl wait event. - * - * Producer : - * a. portals_debug_daemon_pause() and portals_debug_daemon_stop() - * uses the event to wake up portals_debug_daemon() - * b. portals_debug_msg() uses the event to wake up - * portals_debug_daemon() whenever the data output is acrossing - * a 64K bytes boundary. - * Consumer : - * portals_debug_daemon() wakes up upon daemon event. - * - * Sequence for portals_debug_daemon_stop() operation - * - * _Portals_debug_daemon_stop()_ _Daemon_ - * Wait_event(daemon) or running - * Paused = 1; - * Wakeup_event (daemon) - * Wait_event(lctl) - * Set force_flush flag if lctlevnt - * Flush data - * Wakeup_event (lctl) - * Wait_event(daemon) - * Stopped = 1; - * Wakeup_event (daemon) - * Wait_event(lctl) - * Exit daemon loop if (Stopped) - * Wakeup_event (lctl) - * Exit - * Return to user application - * - * - * _Portals_debug_msg()_ _Daemon_ - * Wait_event(daemon) or running - * If (WriteStart<64K<WriteEnd) - * Wakeup_event(daemon) - * Do file IO - * Wait_event(daemon) - */ -struct debug_daemon_state { - unsigned long overlapped; - unsigned long stopped; - atomic_t paused; - unsigned long lctl_event; /* event for lctl */ - wait_queue_head_t lctl; - unsigned long daemon_event; /* event for daemon */ - wait_queue_head_t daemon; -}; -static struct debug_daemon_state debug_daemon_state; -static DECLARE_MUTEX(debug_daemon_semaphore); -static loff_t daemon_file_size_limit; -char debug_daemon_file_path[1024] = ""; - -spinlock_t portals_debug_lock = SPIN_LOCK_UNLOCKED; char debug_file_path[1024] = "/tmp/lustre-log"; -char debug_file_name[1024]; -int handled_panic; /* to avoid recursive calls to notifiers */ +static char debug_file_name[1024]; +static int handled_panic; /* to avoid recursive calls to notifiers */ char portals_upcall[1024] = "/usr/lib/lustre/portals_upcall"; - int portals_do_debug_dumplog(void *arg) { - struct file *file; void *journal_info; - int rc; - mm_segment_t oldfs; - unsigned long debug_off; kportal_daemonize(""); reparent_to_init(); journal_info = current->journal_info; current->journal_info = NULL; - sprintf(debug_file_name, "%s.%ld", debug_file_path, CURRENT_SECONDS); - file = filp_open(debug_file_name, O_CREAT|O_EXCL|O_RDWR, 0644); - if (!file || IS_ERR(file)) { - CERROR("cannot open %s for dumping: %ld\n", debug_file_name, - PTR_ERR(file)); - GOTO(out, PTR_ERR(file)); - } else { - printk(KERN_ALERT "LustreError: dumping log to %s ...\n", - debug_file_name); - } + snprintf(debug_file_name, sizeof(debug_file_path) - 1, + "%s.%ld.%ld", debug_file_path, CURRENT_SECONDS, (long)arg); + tracefile_dump_all_pages(debug_file_name); - debug_off = atomic_read(&debug_off_a); - oldfs = get_fs(); - set_fs(get_ds()); - if (debug_wrapped) { - rc = file->f_op->write(file, debug_buf + debug_off + 1, - debug_size-debug_off-1, &file->f_pos); - rc += file->f_op->write(file, debug_buf, debug_off + 1, - &file->f_pos); - } else { - rc = file->f_op->write(file, debug_buf, debug_off,&file->f_pos); - } - printk("LustreError: wrote %d bytes\n", rc); - set_fs(oldfs); - - rc = file->f_op->fsync(file, file->f_dentry, 1); - if (rc) - CERROR("sync returns %d\n", rc); - filp_close(file, 0); -out: current->journal_info = journal_info; wake_up(&debug_ctlwq); return 0; } -int portals_debug_daemon(void *arg) -{ - struct file *file; - void *journal_info; - mm_segment_t oldfs; - unsigned long force_flush = 0; - unsigned long size, off, flags; - int rc; - - kportal_daemonize("ldebug_daemon"); - reparent_to_init(); - journal_info = current->journal_info; - current->journal_info = NULL; - - file = filp_open(debug_daemon_file_path, - O_CREAT|O_TRUNC|O_RDWR|O_LARGEFILE, 0644); - - if (!file || IS_ERR(file)) { - CERROR("cannot open %s for logging", debug_daemon_file_path); - GOTO(out1, PTR_ERR(file)); - } - printk(KERN_INFO "daemon dumping log to %s\n", debug_daemon_file_path); - - debug_daemon_state.overlapped = 0; - debug_daemon_state.stopped = 0; - - spin_lock_irqsave(&portals_debug_lock, flags); - off = atomic_read(&debug_off_a) + 1; - if (debug_wrapped) - off = (off >= debug_size)? 0 : off; - else - off = 0; - atomic_set(&debug_daemon_next_write, off); - atomic_set(&debug_daemon_state.paused, 0); - spin_unlock_irqrestore(&portals_debug_lock, flags); - - oldfs = get_fs(); - set_fs(KERNEL_DS); - while (1) { - unsigned long ending; - unsigned long start, tail; - long delta; - - debug_daemon_state.daemon_event = 0; - - ending = atomic_read(&debug_off_a); - start = atomic_read(&debug_daemon_next_write); - - /* check if paused is imposed by lctl ? */ - force_flush = !debug_daemon_state.lctl_event; - - delta = ending - start; - tail = debug_size - start; - size = (delta >= 0) ? delta : tail; - while (size && (force_flush || (delta < 0) || - (size >= DAEMON_SND_SIZE))) { - if (daemon_file_size_limit) { - int ssize = daemon_file_size_limit - file->f_pos; - if (size > ssize) - size = ssize; - } - - rc = file->f_op->write(file, debug_buf+start, - size, &file->f_pos); - if (rc < 0) { - printk(KERN_ALERT "LustreError: Debug_daemon " - "write error %d\n", rc); - goto out; - } - start += rc; - delta = ending - start; - tail = debug_size - start; - if (tail == 0) - start = 0; - if (delta >= 0) - size = delta; - else - size = (tail == 0) ? ending : tail; - if (daemon_file_size_limit == file->f_pos) { - // file wrapped around - file->f_pos = 0; - } - } - atomic_set(&debug_daemon_next_write, start); - if (force_flush) { - rc = file->f_op->fsync(file, file->f_dentry, 1); - if (rc < 0) { - printk(KERN_ALERT "LustreError: Debug_daemon " - "sync error %d\n", rc); - goto out; - } - if (debug_daemon_state.stopped) - break; - debug_daemon_state.lctl_event = 1; - wake_up(&debug_daemon_state.lctl); - } - wait_event(debug_daemon_state.daemon, - debug_daemon_state.daemon_event); - } -out: - atomic_set(&debug_daemon_state.paused, 1); - debug_daemon_state.stopped = 1; - set_fs(oldfs); - filp_close(file, 0); - current->journal_info = journal_info; -out1: - debug_daemon_state.lctl_event = 1; - wake_up(&debug_daemon_state.lctl); - return 0; -} - -void portals_debug_print(void) -{ - unsigned long dumplen = 64 * 1024; - char *start1, *start2; - char *end1, *end2; - unsigned long debug_off = atomic_read(&debug_off_a); - - start1 = debug_buf + debug_off - dumplen; - if (start1 < debug_buf) { - start1 += debug_size; - end1 = debug_buf + debug_size - 1; - start2 = debug_buf; - end2 = debug_buf + debug_off; - } else { - end1 = debug_buf + debug_off; - start2 = debug_buf + debug_off; - end2 = debug_buf + debug_off; - } - - while (start1 < end1) { - int count = MIN(1024, end1 - start1); - printk("LustreError: %*s", count, start1); - start1 += 1024; - } - while (start2 < end2) { - int count = MIN(1024, end2 - start2); - printk("LustreError: %*s", count, start2); - start2 += 1024; - } -} - void portals_debug_dumplog(void) { int rc; @@ -453,8 +116,8 @@ void portals_debug_dumplog(void) set_current_state(TASK_INTERRUPTIBLE); add_wait_queue(&debug_ctlwq, &wait); - rc = kernel_thread(portals_do_debug_dumplog, - NULL, CLONE_VM | CLONE_FS | CLONE_FILES); + rc = kernel_thread(portals_do_debug_dumplog, (void *)(long)current->pid, + CLONE_VM | CLONE_FS | CLONE_FILES); if (rc < 0) printk(KERN_ERR "LustreError: cannot start log dump thread: " "%d\n", rc); @@ -466,108 +129,6 @@ void portals_debug_dumplog(void) set_current_state(TASK_RUNNING); } -int portals_debug_daemon_start(char *file, unsigned int size) -{ - int rc; - - if (!debug_daemon_state.stopped) - return -EALREADY; - - if (file != NULL) - strncpy(debug_daemon_file_path, file, 1024); - - init_waitqueue_head(&debug_daemon_state.lctl); - init_waitqueue_head(&debug_daemon_state.daemon); - - daemon_file_size_limit = size << 20; - - debug_daemon_state.lctl_event = 0; - rc = kernel_thread(portals_debug_daemon, NULL, 0); - if (rc < 0) { - printk(KERN_ERR "LustreError: cannot start debug daemon thread\n"); - strncpy(debug_daemon_file_path, "\0", 1); - return rc; - } - wait_event(debug_daemon_state.lctl, debug_daemon_state.lctl_event); - return 0; -} - -int portals_debug_daemon_pause(void) -{ - if (atomic_read(&debug_daemon_state.paused)) - return -EALREADY; - - atomic_set(&debug_daemon_state.paused, 1); - debug_daemon_state.lctl_event = 0; - debug_daemon_state.daemon_event = 1; - wake_up(&debug_daemon_state.daemon); - wait_event(debug_daemon_state.lctl, debug_daemon_state.lctl_event); - return 0; -} - -int portals_debug_daemon_continue(void) -{ - if (!atomic_read(&debug_daemon_state.paused)) - return -EINVAL; - if (debug_daemon_state.stopped) - return -EINVAL; - - debug_daemon_state.overlapped = 0; - atomic_set(&debug_daemon_next_write, atomic_read(&debug_off_a)); - atomic_set(&debug_daemon_state.paused, 0); - return 0; -} - -int portals_debug_daemon_stop(void) -{ - if (debug_daemon_state.stopped) - return -EALREADY; - - if (!atomic_read(&debug_daemon_state.paused)) - portals_debug_daemon_pause(); - - debug_daemon_state.lctl_event = 0; - debug_daemon_state.stopped = 1; - - debug_daemon_state.daemon_event = 1; - wake_up(&debug_daemon_state.daemon); - wait_event(debug_daemon_state.lctl, debug_daemon_state.lctl_event); - - debug_daemon_file_path[0] = '\0'; - return 0; -} - -int portals_debug_set_daemon(unsigned int cmd, unsigned int length, - char *filename, unsigned int size) -{ - int rc = -EINVAL; - - down(&debug_daemon_semaphore); - switch (cmd) { - case DEBUG_DAEMON_START: - if (length && (filename[length -1] != '\0')) { - CERROR("Invalid filename for debug_daemon\n"); - rc = -EINVAL; - break; - } - rc = portals_debug_daemon_start(filename, size); - break; - case DEBUG_DAEMON_STOP: - rc = portals_debug_daemon_stop(); - break; - case DEBUG_DAEMON_PAUSE: - rc = portals_debug_daemon_pause(); - break; - case DEBUG_DAEMON_CONTINUE: - rc = portals_debug_daemon_continue(); - break; - default: - CERROR("unknown set_daemon cmd\n"); - } - up(&debug_daemon_semaphore); - return rc; -} - static int panic_dumplog(struct notifier_block *self, unsigned long unused1, void *unused2) { @@ -577,7 +138,7 @@ static int panic_dumplog(struct notifier_block *self, unsigned long unused1, handled_panic = 1; if (in_interrupt()) { - portals_debug_print(); + trace_debug_print(); return 0; } @@ -595,80 +156,29 @@ static struct notifier_block lustre_panic_notifier = { int portals_debug_init(unsigned long bufsize) { - unsigned long debug_off = atomic_read(&debug_off_a); - if (debug_buf != NULL) - return -EALREADY; - - atomic_set(&debug_daemon_state.paused, 1); - debug_daemon_state.stopped = 1; - - debug_buf = vmalloc(bufsize + DEBUG_OVERFLOW); - if (debug_buf == NULL) - return -ENOMEM; - memset(debug_buf, 0, bufsize + DEBUG_OVERFLOW); - debug_wrapped = 0; - - //printk(KERN_INFO "Portals: allocated %lu byte debug buffer at %p.\n", - //bufsize, debug_buf); - atomic_set(&debug_off_a, debug_off); notifier_chain_register(&panic_notifier_list, &lustre_panic_notifier); - debug_size = bufsize; - - return 0; + return tracefile_init(); } int portals_debug_cleanup(void) { + tracefile_exit(); notifier_chain_unregister(&panic_notifier_list, &lustre_panic_notifier); - if (debug_buf == NULL) - return -EINVAL; - - down(&debug_daemon_semaphore); - portals_debug_daemon_stop(); - - vfree(debug_buf); - atomic_set(&debug_off_a, 0); - up(&debug_daemon_semaphore); - return 0; } int portals_debug_clear_buffer(void) { - unsigned long flags; - unsigned long state; - - if (debug_buf == NULL) - return -EINVAL; - - down(&debug_daemon_semaphore); - state = atomic_read(&debug_daemon_state.paused); - if (!state) - portals_debug_daemon_pause(); - spin_lock_irqsave(&portals_debug_lock, flags); - atomic_set(&debug_off_a, 0); - debug_wrapped = 0; - atomic_set(&debug_daemon_next_write, 0); - debug_daemon_state.overlapped = 0; - spin_unlock_irqrestore(&portals_debug_lock, flags); - - if (!state) - atomic_set(&debug_daemon_state.paused, 0); - up(&debug_daemon_semaphore); - + trace_flush_pages(); return 0; } /* Debug markers, although printed by S_PORTALS - * should not be be marked as such. - */ + * should not be be marked as such. */ #undef DEBUG_SUBSYSTEM #define DEBUG_SUBSYSTEM S_UNDEFINED int portals_debug_mark_buffer(char *text) { - if (debug_buf == NULL) - return -EINVAL; - CDEBUG(D_TRACE,"***************************************************\n"); CWARN("DEBUG MARKER: %s\n", text); CDEBUG(D_TRACE,"***************************************************\n"); @@ -678,231 +188,10 @@ int portals_debug_mark_buffer(char *text) #undef DEBUG_SUBSYSTEM #define DEBUG_SUBSYSTEM S_PORTALS -/* this copies a snapshot of the debug buffer into an array of pages - * before doing the potentially blocking copy into userspace. it could - * be warning userspace if things wrap heavily while its off copying. */ -__s32 portals_debug_copy_to_user(char *buf, unsigned long len) -{ - int rc; - unsigned long total, debug_off, i, off, copied; - unsigned long flags; - struct page *page; - LIST_HEAD(my_pages); - struct list_head *pos, *n; - - if (len < debug_size) - return -ENOSPC; - - for (i = 0 ; i < debug_size; i += PAGE_SIZE) { - page = alloc_page(GFP_NOFS); - if (page == NULL) { - rc = -ENOMEM; - goto cleanup; - } - list_add(&PAGE_LIST(page), &my_pages); - } - - spin_lock_irqsave(&portals_debug_lock, flags); - debug_off = atomic_read(&debug_off_a); - - /* Sigh. If the buffer is empty, then skip to the end. */ - if (debug_off == 0 && !debug_wrapped) { - spin_unlock_irqrestore(&portals_debug_lock, flags); - rc = 0; - goto cleanup; - } - - if (debug_wrapped) { - off = debug_off + 1; - total = debug_size; - } else { - off = 0; - total = debug_off; - } - copied = 0; - list_for_each(pos, &my_pages) { - unsigned long to_copy; - void *addr; - - page = list_entry(pos, struct page, PAGE_LIST_ENTRY); - to_copy = min(total - off, PAGE_SIZE); - if (to_copy == 0) { - off = 0; - to_copy = min(debug_size - off, PAGE_SIZE); - } -finish_partial: - addr = kmap_atomic(page, KM_USER0); - memcpy(addr, debug_buf + off, to_copy); - kunmap_atomic(addr, KM_USER0); - copied += to_copy; - if (copied >= total) - break; - - off += to_copy; - if (off >= debug_size) { - off = 0; - if (to_copy != PAGE_SIZE) { - to_copy = PAGE_SIZE - to_copy; - goto finish_partial; - } - } - } - - spin_unlock_irqrestore(&portals_debug_lock, flags); - - off = 0; - list_for_each(pos, &my_pages) { - unsigned long to_copy; - page = list_entry(pos, struct page, PAGE_LIST_ENTRY); - - to_copy = min(copied - off, PAGE_SIZE); - rc = copy_to_user(buf + off, kmap(page), to_copy); - kunmap(page); - if (rc) { - rc = -EFAULT; - goto cleanup; - } - off += to_copy; - if (off >= copied) - break; - } - rc = copied; - -cleanup: - list_for_each_safe(pos, n, &my_pages) { - page = list_entry(pos, struct page, PAGE_LIST_ENTRY); - list_del(&PAGE_LIST(page)); - __free_page(page); - } - return rc; -} - -/* FIXME: I'm not very smart; someone smarter should make this better. */ -void -portals_debug_msg(int subsys, int mask, char *file, const char *fn, - const int line, unsigned long stack, char *format, ...) -{ - va_list ap; - unsigned long flags; - int max_nob; - int prefix_nob; - int msg_nob; - struct timeval tv; - unsigned long base_offset; - unsigned long debug_off; - - if (debug_buf == NULL) { - printk("LustreError: portals_debug_msg: debug_buf is NULL!\n"); - return; - } - - spin_lock_irqsave(&portals_debug_lock, flags); - debug_off = atomic_read(&debug_off_a); - if (!atomic_read(&debug_daemon_state.paused)) { - unsigned long available; - long delta; - long v = atomic_read(&debug_daemon_next_write); - - delta = debug_off - v; - available = (delta>=0) ? debug_size-delta : -delta; - // Check if we still have enough debug buffer for CDEBUG - if (available < DAEMON_SND_SIZE) { - /* Drop CDEBUG packets until enough debug_buffer is - * available */ - if (debug_daemon_state.overlapped) - goto out; - /* If this is the first time, leave a marker in the - * output */ - debug_daemon_state.overlapped = 1; - format = "DEBUG MARKER: Debug buffer overlapped\n"; - printk(KERN_ERR "LustreError: debug daemon buffer " - "overlapped\n"); - } else /* More space just became available */ - debug_daemon_state.overlapped = 0; - } - - max_nob = debug_size - debug_off + DEBUG_OVERFLOW; - if (max_nob <= 0) { - spin_unlock_irqrestore(&portals_debug_lock, flags); - printk("LustreError: logic error in portals_debug_msg: " - "< 0 bytes to write\n"); - return; - } - - /* NB since we pass a non-zero sized buffer (at least) on the first - * print, we can be assured that by the end of all the snprinting, - * we _do_ have a terminated buffer, even if our message got truncated. - */ - - do_gettimeofday(&tv); - - prefix_nob = snprintf(debug_buf + debug_off, max_nob, - "%06x:%06x:%d:%lu.%06lu:%lu:%d:", - subsys, mask, smp_processor_id(), - tv.tv_sec, tv.tv_usec, stack, current->pid); - max_nob -= prefix_nob; - - if(*(format + strlen(format) - 1) != '\n') - printk(KERN_INFO "format at %s:%d:%s doesn't end in newline\n", - file, line, fn); - -#if defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20)) - msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, - "%d:(%s:%d:%s()) ", - current->thread.extern_pid, file, line, fn); -#elif defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) - msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, - "%d:(%s:%d:%s()) ", - current->thread.mode.tt.extern_pid, file, line, fn); -#else - msg_nob = snprintf(debug_buf + debug_off + prefix_nob, max_nob, - "%d:(%s:%d:%s()) ", - current->pid, file, line, fn); -#endif - - va_start(ap, format); - msg_nob += vsnprintf(debug_buf + debug_off + prefix_nob + msg_nob, - max_nob, format, ap); - max_nob -= msg_nob; - va_end(ap); - - /* Print to console, while msg is contiguous in debug_buf */ - /* NB safely terminated see above */ - if ((mask & D_EMERG) != 0) - printk(KERN_EMERG "LustreError: %s", - debug_buf + debug_off + prefix_nob); - else if ((mask & D_ERROR) != 0) - printk(KERN_ERR "LustreError: %s", - debug_buf + debug_off + prefix_nob); - else if ((mask & D_WARNING) != 0) - printk(KERN_WARNING "Lustre: %s", - debug_buf + debug_off + prefix_nob); - else if (portal_printk) - printk("<%d>Lustre: %s", portal_printk, - debug_buf+debug_off+prefix_nob); - base_offset = debug_off & 0xFFFF; - - debug_off += prefix_nob + msg_nob; - if (debug_off > debug_size) { - memcpy(debug_buf, debug_buf + debug_size, - debug_off - debug_size + 1); - debug_off -= debug_size; - debug_wrapped = 1; - } - - atomic_set(&debug_off_a, debug_off); - if (!atomic_read(&debug_daemon_state.paused) && - ((base_offset+prefix_nob+msg_nob) >= DAEMON_SND_SIZE)) { - debug_daemon_state.daemon_event = 1; - wake_up(&debug_daemon_state.daemon); - } -out: - spin_unlock_irqrestore(&portals_debug_lock, flags); -} - void portals_debug_set_level(unsigned int debug_level) { - printk("Lustre: Setting portals debug level to %08x\n", debug_level); + printk(KERN_WARNING "Lustre: Setting portals debug level to %08x\n", + debug_level); portal_debug = debug_level; } @@ -961,19 +250,25 @@ void portals_run_lbug_upcall(char *file, const char *fn, const int line) char *portals_nid2str(int nal, ptl_nid_t nid, char *str) { + if (nid == PTL_NID_ANY) { + snprintf(str, PTL_NALFMT_SIZE - 1, "%s", + "PTL_NID_ANY"); + return str; + } + switch(nal){ /* XXX this could be a nal method of some sort, 'cept it's config * dependent whether (say) socknal NIDs are actually IP addresses... */ #ifndef CRAY_PORTALS case TCPNAL: /* userspace NAL */ + case OPENIBNAL: case SOCKNAL: snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u", (__u32)(nid >> 32), HIPQUAD(nid)); break; case QSWNAL: case GMNAL: - case IBNAL: snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u", (__u32)(nid >> 32), (__u32)nid); break; @@ -989,18 +284,20 @@ char *portals_nid2str(int nal, ptl_nid_t nid, char *str) char *portals_id2str(int nal, ptl_process_id_t id, char *str) { switch(nal){ +#ifndef CRAY_PORTALS case TCPNAL: /* userspace NAL */ + case OPENIBNAL: case SOCKNAL: snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u.%u.%u.%u,%u", (__u32)(id.nid >> 32), HIPQUAD((id.nid)) , id.pid); break; case QSWNAL: case GMNAL: - case IBNAL: snprintf(str, PTL_NALFMT_SIZE - 1, "%u:%u,%u", (__u32)(id.nid >> 32), (__u32)id.nid, id.pid); break; +#endif default: snprintf(str, PTL_NALFMT_SIZE - 1, "?%d? %llx,%lx", nal, (long long)id.nid, (long)id.pid ); @@ -1091,12 +388,18 @@ char *portals_debug_dumpstack(void) } #endif /* __arch_um__ */ +struct task_struct *portals_current(void) +{ + CWARN("current task struct is %p\n", current); + return current; +} + EXPORT_SYMBOL(stack_backtrace_lock); EXPORT_SYMBOL(portals_debug_dumpstack); +EXPORT_SYMBOL(portals_current); #endif /* __KERNEL__ */ EXPORT_SYMBOL(portals_debug_dumplog); -EXPORT_SYMBOL(portals_debug_msg); EXPORT_SYMBOL(portals_debug_set_level); EXPORT_SYMBOL(portals_run_upcall); EXPORT_SYMBOL(portals_run_lbug_upcall); diff --git a/lnet/libcfs/lwt.c b/lnet/libcfs/lwt.c index a24423e867..3f6a9c27fa 100644 --- a/lnet/libcfs/lwt.c +++ b/lnet/libcfs/lwt.c @@ -45,9 +45,12 @@ #if LWT_SUPPORT +#if !KLWT_SUPPORT int lwt_enabled; +lwt_cpu_t lwt_cpus[NR_CPUS]; +#endif + int lwt_pages_per_cpu; -lwt_cpu_t lwt_cpus[LWT_MAX_CPUS]; /* NB only root is allowed to retrieve LWT info; it's an open door into the * kernel... */ @@ -97,23 +100,35 @@ lwt_control (int enable, int clear) if (!capable(CAP_SYS_ADMIN)) return (-EPERM); - if (clear) - for (i = 0; i < num_online_cpus(); i++) { - p = lwt_cpus[i].lwtc_current_page; + if (!enable) { + LWT_EVENT(0,0,0,0); + lwt_enabled = 0; + mb(); + /* give people some time to stop adding traces */ + schedule_timeout(10); + } - for (j = 0; j < lwt_pages_per_cpu; j++) { - memset (p->lwtp_events, 0, PAGE_SIZE); + for (i = 0; i < num_online_cpus(); i++) { + p = lwt_cpus[i].lwtc_current_page; - p = list_entry (p->lwtp_list.next, - lwt_page_t, lwtp_list); - } + if (p == NULL) + return (-ENODATA); + + if (!clear) + continue; + + for (j = 0; j < lwt_pages_per_cpu; j++) { + memset (p->lwtp_events, 0, PAGE_SIZE); + + p = list_entry (p->lwtp_list.next, + lwt_page_t, lwtp_list); + } } - lwt_enabled = enable; - mb(); - if (!enable) { - /* give people some time to stop adding traces */ - schedule_timeout(10); + if (enable) { + lwt_enabled = 1; + mb(); + LWT_EVENT(0,0,0,0); } return (0); @@ -141,6 +156,9 @@ lwt_snapshot (cycles_t *now, int *ncpu, int *total_size, for (i = 0; i < num_online_cpus(); i++) { p = lwt_cpus[i].lwtc_current_page; + + if (p == NULL) + return (-ENODATA); for (j = 0; j < lwt_pages_per_cpu; j++) { if (copy_to_user(user_ptr, p->lwtp_events, @@ -162,11 +180,12 @@ lwt_init () { int i; int j; + + for (i = 0; i < num_online_cpus(); i++) + if (lwt_cpus[i].lwtc_current_page != NULL) + return (-EALREADY); - if (num_online_cpus() > LWT_MAX_CPUS) { - CERROR ("Too many CPUs\n"); - return (-EINVAL); - } + LASSERT (!lwt_enabled); /* NULL pointers, zero scalars */ memset (lwt_cpus, 0, sizeof (lwt_cpus)); @@ -207,6 +226,8 @@ lwt_init () lwt_enabled = 1; mb(); + LWT_EVENT(0,0,0,0); + return (0); } @@ -214,10 +235,9 @@ void lwt_fini () { int i; - - if (num_online_cpus() > LWT_MAX_CPUS) - return; + lwt_control(0, 0); + for (i = 0; i < num_online_cpus(); i++) while (lwt_cpus[i].lwtc_current_page != NULL) { lwt_page_t *lwtp = lwt_cpus[i].lwtc_current_page; diff --git a/lnet/libcfs/module.c b/lnet/libcfs/module.c index 06f1578fb9..3703013d1b 100644 --- a/lnet/libcfs/module.c +++ b/lnet/libcfs/module.c @@ -398,23 +398,6 @@ static int libcfs_ioctl(struct inode *inode, struct file *file, data = (struct portal_ioctl_data *)buf; switch (cmd) { - case IOC_PORTAL_SET_DAEMON: - RETURN (portals_debug_set_daemon ( - (unsigned int) data->ioc_count, - (unsigned int) data->ioc_inllen1, - (char *) data->ioc_inlbuf1, - (unsigned int) data->ioc_misc)); - case IOC_PORTAL_GET_DEBUG: { - __s32 size = portals_debug_copy_to_user(data->ioc_pbuf1, - data->ioc_plen1); - - if (size < 0) - RETURN(size); - - data->ioc_size = size; - err = copy_to_user((char *)arg, data, sizeof(*data)); - RETURN(err); - } case IOC_PORTAL_CLEAR_DEBUG: portals_debug_clear_buffer(); RETURN(0); @@ -445,6 +428,10 @@ static int libcfs_ioctl(struct inode *inode, struct file *file, data->ioc_count = ncpu; data->ioc_misc = total_size; + /* Hedge against broken user/kernel typedefs (e.g. cycles_t) */ + data->ioc_nid = sizeof(lwt_event_t); + data->ioc_nid2 = offsetof(lwt_event_t, lwte_where); + if (err == 0 && copy_to_user((char *)arg, data, sizeof (*data))) err = -EFAULT; @@ -589,7 +576,6 @@ static void exit_libcfs_module(void) CDEBUG(D_MALLOC, "before Portals cleanup: kmem %d\n", atomic_read(&portal_kmemory)); - rc = misc_deregister(&libcfs_dev); if (rc) CERROR("misc_deregister error %d\n", rc); diff --git a/lnet/libcfs/proc.c b/lnet/libcfs/proc.c index c850f690fd..aa9cfa85a2 100644 --- a/lnet/libcfs/proc.c +++ b/lnet/libcfs/proc.c @@ -55,10 +55,10 @@ #include <linux/kp30.h> #include <asm/div64.h> +#include "tracefile.h" static struct ctl_table_header *portals_table_header = NULL; extern char debug_file_path[1024]; -extern char debug_daemon_file_path[1024]; extern char portals_upcall[1024]; #define PSDEV_PORTALS (0x100) @@ -80,13 +80,8 @@ static struct ctl_table portals_table[] = { sizeof(int), 0644, NULL, &proc_dointvec}, {PSDEV_PRINTK, "printk", &portal_printk, sizeof(int), 0644, NULL, &proc_dointvec}, - {PSDEV_CONSOLE, "console", &portal_cerror, sizeof(int), 0644, NULL, - &proc_dointvec}, {PSDEV_DEBUG_PATH, "debug_path", debug_file_path, sizeof(debug_file_path), 0644, NULL, &proc_dostring, &sysctl_string}, - {PSDEV_DEBUG_DUMP_PATH, "debug_daemon_path", debug_daemon_file_path, - sizeof(debug_daemon_file_path), 0644, NULL, &proc_dostring, - &sysctl_string}, {PSDEV_PORTALS_UPCALL, "upcall", portals_upcall, sizeof(portals_upcall), 0644, NULL, &proc_dostring, &sysctl_string}, @@ -238,9 +233,9 @@ static unsigned char basedir[]="net/portals"; int insert_proc(void) { + struct proc_dir_entry *ent; #if PORTALS_PROFILING unsigned char dir[128]; - struct proc_dir_entry *ent; if (ARRAY_SIZE(prof_ents) != MAX_PROFS) { CERROR("profiling enum and array are out of sync.\n"); @@ -270,6 +265,29 @@ int insert_proc(void) portals_table_header = register_sysctl_table(top_table, 0); #endif + ent = create_proc_entry("sys/portals/dump_kernel", 0, NULL); + if (ent == NULL) { + CERROR("couldn't register dump_kernel\n"); + return -1; + } + ent->write_proc = trace_dk; + + ent = create_proc_entry("sys/portals/daemon_file", 0, NULL); + if (ent == NULL) { + CERROR("couldn't register daemon_file\n"); + return -1; + } + ent->write_proc = trace_write_daemon_file; + ent->read_proc = trace_read_daemon_file; + + ent = create_proc_entry("sys/portals/debug_size", 0, NULL); + if (ent == NULL) { + CERROR("couldn't register debug_size\n"); + return -1; + } + ent->write_proc = trace_write_debug_size; + ent->read_proc = trace_read_debug_size; + return 0; } @@ -285,12 +303,16 @@ void remove_proc(void) end = strlen(dir); strcat(dir, "/cycles"); - remove_proc_entry(dir,0); + remove_proc_entry(dir, 0); dir[end] = '\0'; - remove_proc_entry(dir,0); + remove_proc_entry(dir, 0); #endif /* PORTALS_PROFILING */ + remove_proc_entry("sys/portals/dump_kernel", NULL); + remove_proc_entry("sys/portals/daemon_file", NULL); + remove_proc_entry("sys/portals/debug_size", NULL); + #ifdef CONFIG_SYSCTL if (portals_table_header) unregister_sysctl_table(portals_table_header); diff --git a/lnet/libcfs/tracefile.c b/lnet/libcfs/tracefile.c new file mode 100644 index 0000000000..562abcfb7e --- /dev/null +++ b/lnet/libcfs/tracefile.c @@ -0,0 +1,858 @@ +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + * vim:expandtab:shiftwidth=8:tabstop=8: + * + * Copyright (C) 2004 Cluster File Systems, Inc. + * Author: Zach Brown <zab@clusterfs.com> + * Author: Phil Schwan <phil@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. + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/init.h> +#include <linux/rwsem.h> +#include <linux/proc_fs.h> +#include <linux/file.h> +#include <linux/smp.h> +#include <linux/ctype.h> +#include <asm/uaccess.h> +#ifdef HAVE_MM_INLINE +#include <linux/mm_inline.h> +#endif + +#define DEBUG_SUBSYSTEM S_PORTALS + +#include <linux/kp30.h> +#include <linux/portals_compat25.h> +#include <linux/lustre_compat25.h> +#include <linux/libcfs.h> + +#define TCD_MAX_PAGES 1280 + +/* XXX move things up to the top, comment */ + +static union { + struct trace_cpu_data { + struct list_head tcd_pages; + unsigned long tcd_cur_pages; + + struct list_head tcd_daemon_pages; + unsigned long tcd_cur_daemon_pages; + + unsigned long tcd_max_pages; + int tcd_shutting_down; + } tcd; + char __pad[SMP_CACHE_BYTES]; +} trace_data[NR_CPUS] __cacheline_aligned; + +struct page_collection { + struct list_head pc_pages; + spinlock_t pc_lock; + int pc_want_daemon_pages; +}; + +struct tracefiled_ctl { + struct completion tctl_start; + struct completion tctl_stop; + wait_queue_head_t tctl_waitq; + pid_t tctl_pid; + atomic_t tctl_shutdown; +}; + +static DECLARE_RWSEM(tracefile_sem); +static char *tracefile = NULL; +static struct tracefiled_ctl trace_tctl; +static DECLARE_MUTEX(trace_thread_sem); +static int thread_running = 0; + +#ifndef get_cpu +#define get_cpu() smp_processor_id() +#define put_cpu() do { } while (0) +#endif + +#define trace_get_tcd(FLAGS) ({ \ + struct trace_cpu_data *__ret; \ + int __cpu = get_cpu(); \ + local_irq_save(FLAGS); \ + __ret = &trace_data[__cpu].tcd; \ + __ret; \ +}) + +#define trace_put_tcd(TCD, FLAGS) do { \ + local_irq_restore(FLAGS); \ + put_cpu(); \ +} while (0) + +static void put_pages_on_daemon_list_on_cpu(void *info); + +/* return a page that has 'len' bytes left at the end */ +static struct page *trace_get_page(struct trace_cpu_data *tcd, + unsigned long len) +{ + struct page *page = NULL; + + if (len > PAGE_SIZE) { + printk(KERN_ERR "cowardly refusing to write %lu bytes in a " + "page\n", len); + return NULL; + } + + if (!list_empty(&tcd->tcd_pages)) { + page = list_entry(tcd->tcd_pages.prev, struct page, + PAGE_LIST_ENTRY); + if (page->index + len <= PAGE_SIZE) + return page; + } + + if (tcd->tcd_cur_pages < tcd->tcd_max_pages) { + page = alloc_page(GFP_ATOMIC); + if (page == NULL) { + /* the kernel should print a message for us. fall back + * to using the last page in the ring buffer. */ + goto ring_buffer; + return NULL; + } + page->index = 0; + page->mapping = (void *)(long)smp_processor_id(); + list_add_tail(&PAGE_LIST(page), &tcd->tcd_pages); + tcd->tcd_cur_pages++; + + if (tcd->tcd_cur_pages > 8 && thread_running) { + struct tracefiled_ctl *tctl = &trace_tctl; + wake_up(&tctl->tctl_waitq); + } + return page; + } + + ring_buffer: + if (thread_running) { + int pgcount = tcd->tcd_cur_pages / 10; + struct page_collection pc; + struct list_head *pos, *tmp; + printk(KERN_WARNING "debug daemon buffer overflowed; discarding" + " 10%% of pages (%d)\n", pgcount + 1); + + INIT_LIST_HEAD(&pc.pc_pages); + spin_lock_init(&pc.pc_lock); + + list_for_each_safe(pos, tmp, &tcd->tcd_pages) { + struct page *page; + + if (pgcount-- == 0) + break; + + page = list_entry(pos, struct page, PAGE_LIST_ENTRY); + list_del(&PAGE_LIST(page)); + list_add_tail(&PAGE_LIST(page), &pc.pc_pages); + tcd->tcd_cur_pages--; + } + put_pages_on_daemon_list_on_cpu(&pc); + } + LASSERT(!list_empty(&tcd->tcd_pages)); + + page = list_entry(tcd->tcd_pages.next, struct page, PAGE_LIST_ENTRY); + page->index = 0; + + list_del(&PAGE_LIST(page)); + list_add_tail(&PAGE_LIST(page), &tcd->tcd_pages); + return page; +} + +static void print_to_console(struct ptldebug_header *hdr, int mask, char *buf, + int len, char *file, const char *fn) +{ + char *prefix = NULL, *ptype = NULL; + + if ((mask & D_EMERG) != 0) { + prefix = "LustreError"; + ptype = KERN_EMERG; + } else if ((mask & D_ERROR) != 0) { + prefix = "LustreError"; + ptype = KERN_ERR; + } else if ((mask & D_WARNING) != 0) { + prefix = "Lustre"; + ptype = KERN_WARNING; + } else if (portal_printk) { + prefix = "Lustre"; + ptype = KERN_INFO; + } + + printk("%s%s: %d:%d:(%s:%d:%s()) %.*s", ptype, prefix, hdr->ph_pid, + hdr->ph_extern_pid, file, hdr->ph_line_num, fn, len, buf); +} + +void portals_debug_msg(int subsys, int mask, char *file, const char *fn, + const int line, unsigned long stack, char *format, ...) +{ + struct trace_cpu_data *tcd; + struct ptldebug_header header; + struct page *page; + char *debug_buf; + int known_size, needed, max_nob; + va_list ap; + unsigned long flags; + struct timeval tv; + + if (*(format + strlen(format) - 1) != '\n') + printk(KERN_INFO "format at %s:%d:%s doesn't end in newline\n", + file, line, fn); + + tcd = trace_get_tcd(flags); + if (tcd->tcd_shutting_down) + goto out; + + do_gettimeofday(&tv); + + header.ph_subsys = subsys; + header.ph_mask = mask; + header.ph_cpu_id = smp_processor_id(); + header.ph_sec = (__u32)tv.tv_sec; + header.ph_usec = tv.tv_usec; + header.ph_stack = stack; + header.ph_pid = current->pid; + header.ph_line_num = line; + +#if defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20)) + header.ph_extern_pid = current->thread.extern_pid; +#elif defined(__arch_um__) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) + header.ph_extern_pid = current->thread.mode.tt.extern_pid; +#else + header.ph_extern_pid = 0; +#endif + + known_size = sizeof(header) + strlen(file) + strlen(fn) + 2; // nulls + + page = trace_get_page(tcd, known_size + 40); /* slop */ + retry: + if (page == NULL) + goto out; + + debug_buf = page_address(page) + page->index + known_size; + + va_start(ap, format); + max_nob = PAGE_SIZE - page->index - known_size; + LASSERT(max_nob > 0); + needed = vsnprintf(debug_buf, max_nob, format, ap); + va_end(ap); + + if (needed > max_nob) { + /* overflow. oh poop. */ + page = trace_get_page(tcd, needed + known_size); + goto retry; + } + + header.ph_len = known_size + needed; + debug_buf = page_address(page) + page->index; + + memcpy(debug_buf, &header, sizeof(header)); + page->index += sizeof(header); + debug_buf += sizeof(header); + + strcpy(debug_buf, file); + page->index += strlen(file) + 1; + debug_buf += strlen(file) + 1; + + strcpy(debug_buf, fn); + page->index += strlen(fn) + 1; + debug_buf += strlen(fn) + 1; + + page->index += needed; + if (page->index > PAGE_SIZE) + printk(KERN_EMERG "page->index == %lu in portals_debug_msg\n", + page->index); + + if ((mask & (D_EMERG | D_ERROR | D_WARNING)) || portal_printk) + print_to_console(&header, mask, debug_buf, needed, file, fn); + + out: + trace_put_tcd(tcd, flags); +} +EXPORT_SYMBOL(portals_debug_msg); + +static void collect_pages_on_cpu(void *info) +{ + struct trace_cpu_data *tcd; + unsigned long flags; + struct page_collection *pc = info; + + tcd = trace_get_tcd(flags); + + spin_lock(&pc->pc_lock); + list_splice(&tcd->tcd_pages, &pc->pc_pages); + INIT_LIST_HEAD(&tcd->tcd_pages); + tcd->tcd_cur_pages = 0; + if (pc->pc_want_daemon_pages) { + list_splice(&tcd->tcd_daemon_pages, &pc->pc_pages); + INIT_LIST_HEAD(&tcd->tcd_daemon_pages); + tcd->tcd_cur_daemon_pages = 0; + } + spin_unlock(&pc->pc_lock); + + trace_put_tcd(tcd, flags); +} + +static void collect_pages(struct page_collection *pc) +{ + /* needs to be fixed up for preempt */ + INIT_LIST_HEAD(&pc->pc_pages); + collect_pages_on_cpu(pc); + smp_call_function(collect_pages_on_cpu, pc, 0, 1); +} + +static void put_pages_back_on_cpu(void *info) +{ + struct page_collection *pc = info; + struct trace_cpu_data *tcd; + struct list_head *pos, *tmp, *cur_head; + unsigned long flags; + + tcd = trace_get_tcd(flags); + + cur_head = tcd->tcd_pages.next; + + spin_lock(&pc->pc_lock); + list_for_each_safe(pos, tmp, &pc->pc_pages) { + struct page *page; + + page = list_entry(pos, struct page, PAGE_LIST_ENTRY); + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + + if ((unsigned long)page->mapping != smp_processor_id()) + continue; + + list_del(&PAGE_LIST(page)); + list_add_tail(&PAGE_LIST(page), cur_head); + tcd->tcd_cur_pages++; + } + spin_unlock(&pc->pc_lock); + + trace_put_tcd(tcd, flags); +} + +static void put_pages_back(struct page_collection *pc) +{ + /* needs to be fixed up for preempt */ + put_pages_back_on_cpu(pc); + smp_call_function(put_pages_back_on_cpu, pc, 0, 1); +} + +/* Add pages to a per-cpu debug daemon ringbuffer. This buffer makes sure that + * we have a good amount of data at all times for dumping during an LBUG, even + * if we have been steadily writing (and otherwise discarding) pages via the + * debug daemon. */ +static void put_pages_on_daemon_list_on_cpu(void *info) +{ + struct page_collection *pc = info; + struct trace_cpu_data *tcd; + struct list_head *pos, *tmp; + unsigned long flags; + + tcd = trace_get_tcd(flags); + + spin_lock(&pc->pc_lock); + list_for_each_safe(pos, tmp, &pc->pc_pages) { + struct page *page; + + page = list_entry(pos, struct page, PAGE_LIST_ENTRY); + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + if ((unsigned long)page->mapping != smp_processor_id()) + continue; + + list_del(&PAGE_LIST(page)); + list_add_tail(&PAGE_LIST(page), &tcd->tcd_daemon_pages); + tcd->tcd_cur_daemon_pages++; + + if (tcd->tcd_cur_daemon_pages > tcd->tcd_max_pages) { + LASSERT(!list_empty(&tcd->tcd_daemon_pages)); + page = list_entry(tcd->tcd_daemon_pages.next, + struct page, PAGE_LIST_ENTRY); + + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + + page->index = 0; + list_del(&PAGE_LIST(page)); + page->mapping = NULL; + __free_page(page); + tcd->tcd_cur_daemon_pages--; + } + } + spin_unlock(&pc->pc_lock); + + trace_put_tcd(tcd, flags); +} + +static void put_pages_on_daemon_list(struct page_collection *pc) +{ + put_pages_on_daemon_list_on_cpu(pc); + smp_call_function(put_pages_on_daemon_list_on_cpu, pc, 0, 1); +} + +void trace_debug_print(void) +{ + struct page_collection pc; + struct list_head *pos, *tmp; + + spin_lock_init(&pc.pc_lock); + + collect_pages(&pc); + list_for_each_safe(pos, tmp, &pc.pc_pages) { + struct page *page; + char *p, *file, *fn; + + page = list_entry(pos, struct page, PAGE_LIST_ENTRY); + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + + p = page_address(page); + while (p < ((char *)page_address(page) + PAGE_SIZE)) { + struct ptldebug_header *hdr; + int len; + hdr = (void *)p; + p += sizeof(*hdr); + file = p; + p += strlen(file) + 1; + fn = p; + p += strlen(fn) + 1; + len = hdr->ph_len - (p - (char *)hdr); + + print_to_console(hdr, D_EMERG, p, len, file, fn); + } + + list_del(&PAGE_LIST(page)); + page->mapping = NULL; + __free_page(page); + } +} + +int tracefile_dump_all_pages(char *filename) +{ + struct page_collection pc; + struct file *filp; + struct list_head *pos, *tmp; + mm_segment_t oldfs; + int rc; + + down_write(&tracefile_sem); + + filp = filp_open(filename, O_CREAT|O_EXCL|O_WRONLY, 0600); + if (IS_ERR(filp)) { + rc = PTR_ERR(filp); + printk(KERN_ERR "LustreError: can't open %s for dump: rc %d\n", + filename, rc); + goto out; + } + + spin_lock_init(&pc.pc_lock); + pc.pc_want_daemon_pages = 1; + collect_pages(&pc); + if (list_empty(&pc.pc_pages)) { + rc = 0; + goto close; + } + + /* ok, for now, just write the pages. in the future we'll be building + * iobufs with the pages and calling generic_direct_IO */ + oldfs = get_fs(); + set_fs(get_ds()); + list_for_each_safe(pos, tmp, &pc.pc_pages) { + struct page *page; + + page = list_entry(pos, struct page, PAGE_LIST_ENTRY); + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + + rc = filp->f_op->write(filp, page_address(page), page->index, + &filp->f_pos); + if (rc != page->index) { + printk(KERN_WARNING "wanted to write %lu but wrote " + "%d\n", page->index, rc); + put_pages_back(&pc); + break; + } + list_del(&PAGE_LIST(page)); + page->mapping = NULL; + __free_page(page); + } + set_fs(oldfs); + rc = filp->f_op->fsync(filp, filp->f_dentry, 1); + if (rc) + printk(KERN_ERR "sync returns %d\n", rc); + close: + filp_close(filp, 0); + out: + up_write(&tracefile_sem); + return rc; +} + +void trace_flush_pages(void) +{ + struct page_collection pc; + struct list_head *pos, *tmp; + + spin_lock_init(&pc.pc_lock); + + collect_pages(&pc); + list_for_each_safe(pos, tmp, &pc.pc_pages) { + struct page *page; + + page = list_entry(pos, struct page, PAGE_LIST_ENTRY); + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + + list_del(&PAGE_LIST(page)); + page->mapping = NULL; + __free_page(page); + } +} + +int trace_dk(struct file *file, const char *buffer, unsigned long count, + void *data) +{ + char *name; + unsigned long off; + int rc; + + name = kmalloc(count + 1, GFP_KERNEL); + if (name == NULL) + return -ENOMEM; + + if (copy_from_user(name, buffer, count)) { + rc = -EFAULT; + goto out; + } + + if (name[0] != '/') { + rc = -EINVAL; + goto out; + } + + /* be nice and strip out trailing '\n' */ + for (off = count ; off > 2 && isspace(name[off - 1]); off--) + ; + + name[off] = '\0'; + rc = tracefile_dump_all_pages(name); +out: + if (name) + kfree(name); + return count; +} +EXPORT_SYMBOL(trace_dk); + +static int tracefiled(void *arg) +{ + struct page_collection pc; + struct tracefiled_ctl *tctl = arg; + struct list_head *pos, *tmp; + struct ptldebug_header *hdr; + struct file *filp; + struct page *page; + mm_segment_t oldfs; + int rc; + + /* we're started late enough that we pick up init's fs context */ + /* this is so broken in uml? what on earth is going on? */ + kportal_daemonize("ktracefiled"); + reparent_to_init(); + + spin_lock_init(&pc.pc_lock); + complete(&tctl->tctl_start); + + while (1) { + wait_queue_t __wait; + + init_waitqueue_entry(&__wait, current); + add_wait_queue(&tctl->tctl_waitq, &__wait); + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ); + remove_wait_queue(&tctl->tctl_waitq, &__wait); + + if (atomic_read(&tctl->tctl_shutdown)) + break; + + pc.pc_want_daemon_pages = 0; + collect_pages(&pc); + if (list_empty(&pc.pc_pages)) + continue; + + filp = NULL; + down_read(&tracefile_sem); + if (tracefile != NULL) { + filp = filp_open(tracefile, O_CREAT|O_RDWR|O_APPEND|O_LARGEFILE, + 0600); + if (IS_ERR(filp)) { + printk("couldn't open %s: %ld\n", tracefile, + PTR_ERR(filp)); + filp = NULL; + } + } + up_read(&tracefile_sem); + if (filp == NULL) { + put_pages_on_daemon_list(&pc); + continue; + } + + oldfs = get_fs(); + set_fs(get_ds()); + + /* mark the first header, so we can sort in chunks */ + page = list_entry(pc.pc_pages.next, struct page, + PAGE_LIST_ENTRY); + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + + hdr = page_address(page); + hdr->ph_flags |= PH_FLAG_FIRST_RECORD; + + list_for_each_safe(pos, tmp, &pc.pc_pages) { + page = list_entry(pos, struct page, PAGE_LIST_ENTRY); + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + + rc = filp->f_op->write(filp, page_address(page), + page->index, &filp->f_pos); + if (rc != page->index) { + printk(KERN_WARNING "wanted to write %lu but " + "wrote %d\n", page->index, rc); + put_pages_back(&pc); + } + } + set_fs(oldfs); + filp_close(filp, 0); + + put_pages_on_daemon_list(&pc); + } + complete(&tctl->tctl_stop); + return 0; +} + +int trace_start_thread(void) +{ + struct tracefiled_ctl *tctl = &trace_tctl; + int rc = 0; + + down(&trace_thread_sem); + if (thread_running) + goto out; + + init_completion(&tctl->tctl_start); + init_completion(&tctl->tctl_stop); + init_waitqueue_head(&tctl->tctl_waitq); + atomic_set(&tctl->tctl_shutdown, 0); + + if (kernel_thread(tracefiled, tctl, 0) < 0) { + rc = -ECHILD; + goto out; + } + + wait_for_completion(&tctl->tctl_start); + thread_running = 1; +out: + up(&trace_thread_sem); + return rc; +} + +void trace_stop_thread(void) +{ + struct tracefiled_ctl *tctl = &trace_tctl; + + down(&trace_thread_sem); + if (thread_running) { + printk(KERN_INFO "Shutting down debug daemon thread...\n"); + atomic_set(&tctl->tctl_shutdown, 1); + wait_for_completion(&tctl->tctl_stop); + thread_running = 0; + } + up(&trace_thread_sem); +} + +int trace_write_daemon_file(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + char *name; + unsigned long off; + int rc; + + name = kmalloc(count + 1, GFP_KERNEL); + if (name == NULL) + return -ENOMEM; + + if (copy_from_user(name, buffer, count)) { + rc = -EFAULT; + goto out; + } + + /* be nice and strip out trailing '\n' */ + for (off = count ; off > 2 && isspace(name[off - 1]); off--) + ; + + name[off] = '\0'; + + down_write(&tracefile_sem); + if (strcmp(name, "stop") == 0) { + tracefile = NULL; + trace_stop_thread(); + goto out_sem; + } + + if (name[0] != '/') { + rc = -EINVAL; + goto out_sem; + } + + if (tracefile != NULL) + kfree(tracefile); + + tracefile = name; + name = NULL; + trace_start_thread(); + + out_sem: + up_write(&tracefile_sem); + + out: + if (name) + kfree(name); + return count; +} + +int trace_read_daemon_file(char *page, char **start, off_t off, int count, + int *eof, void *data) +{ + int rc; + + down_read(&tracefile_sem); + rc = snprintf(page, count, "%s", tracefile); + up_read(&tracefile_sem); + + return rc; +} + +int trace_write_debug_size(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + char *string; + int rc, i, max; + + string = kmalloc(count + 1, GFP_KERNEL); + if (string == NULL) + return -ENOMEM; + + if (copy_from_user(string, buffer, count)) { + rc = -EFAULT; + goto out; + } + + max = simple_strtoul(string, NULL, 0); + if (max == 0) { + rc = -EINVAL; + goto out; + } + max /= smp_num_cpus; + + if (max > num_physpages / 5 * 4) { + printk(KERN_ERR "Lustre: Refusing to set debug buffer size to " + "%d pages, which is more than 80%% of physical pages " + "(%lu).\n", max * smp_num_cpus, num_physpages / 5 * 4); + return count; + } + for (i = 0; i < NR_CPUS; i++) { + struct trace_cpu_data *tcd; + tcd = &trace_data[i].tcd; + tcd->tcd_max_pages = max; + } + out: + kfree(string); + return count; +} + +int trace_read_debug_size(char *page, char **start, off_t off, int count, + int *eof, void *data) +{ + struct trace_cpu_data *tcd; + unsigned long flags; + int rc; + + tcd = trace_get_tcd(flags); + rc = snprintf(page, count, "%lu", tcd->tcd_max_pages); + trace_put_tcd(tcd, flags); + + return rc; +} + +int tracefile_init(void) +{ + struct trace_cpu_data *tcd; + int i; + + for (i = 0; i < NR_CPUS; i++) { + tcd = &trace_data[i].tcd; + INIT_LIST_HEAD(&tcd->tcd_pages); + INIT_LIST_HEAD(&tcd->tcd_daemon_pages); + tcd->tcd_cur_pages = 0; + tcd->tcd_cur_daemon_pages = 0; + tcd->tcd_max_pages = TCD_MAX_PAGES; + tcd->tcd_shutting_down = 0; + } + return 0; +} + +static void trace_cleanup_on_cpu(void *info) +{ + struct trace_cpu_data *tcd; + struct list_head *pos, *tmp; + unsigned long flags; + + tcd = trace_get_tcd(flags); + + tcd->tcd_shutting_down = 1; + + list_for_each_safe(pos, tmp, &tcd->tcd_pages) { + struct page *page; + + page = list_entry(pos, struct page, PAGE_LIST_ENTRY); + LASSERT(page->index <= PAGE_SIZE); + LASSERT(page_count(page) > 0); + + list_del(&PAGE_LIST(page)); + page->mapping = NULL; + __free_page(page); + } + tcd->tcd_cur_pages = 0; + + trace_put_tcd(tcd, flags); +} + +static void trace_cleanup(void) +{ + struct page_collection pc; + + INIT_LIST_HEAD(&pc.pc_pages); + spin_lock_init(&pc.pc_lock); + + trace_cleanup_on_cpu(&pc); + smp_call_function(trace_cleanup_on_cpu, &pc, 0, 1); +} + +void tracefile_exit(void) +{ + trace_stop_thread(); + trace_cleanup(); +} diff --git a/lnet/libcfs/tracefile.h b/lnet/libcfs/tracefile.h new file mode 100644 index 0000000000..1b6e7a05e1 --- /dev/null +++ b/lnet/libcfs/tracefile.h @@ -0,0 +1,22 @@ +#ifndef __PORTALS_TRACEFILE_H +#define __PORTALS_TRACEFILE_H + +int tracefile_dump_all_pages(char *filename); +void trace_debug_print(void); +void trace_flush_pages(void); +int trace_start_thread(void); +void trace_stop_thread(void); +int tracefile_init(void); +void tracefile_exit(void); +int trace_write_daemon_file(struct file *file, const char *buffer, + unsigned long count, void *data); +int trace_read_daemon_file(char *page, char **start, off_t off, int count, + int *eof, void *data); +int trace_write_debug_size(struct file *file, const char *buffer, + unsigned long count, void *data); +int trace_read_debug_size(char *page, char **start, off_t off, int count, + int *eof, void *data); +int trace_dk(struct file *file, const char *buffer, unsigned long count, + void *data); + +#endif /* __PORTALS_TRACEFILE_H */ diff --git a/lnet/lnet/api-ni.c b/lnet/lnet/api-ni.c index 56afd451a5..72d3b4188e 100644 --- a/lnet/lnet/api-ni.c +++ b/lnet/lnet/api-ni.c @@ -33,7 +33,7 @@ int ptl_init; #define NI_HANDLE_MAGIC 0xebc0de00 #define NI_HANDLE_MASK 0x000000ff -static struct nal_t *ptl_nal_table[NAL_MAX_NR]; +static struct nal_t *ptl_nal_table[NAL_MAX_NR + 1]; #ifdef __KERNEL__ DECLARE_MUTEX(ptl_mutex); @@ -73,7 +73,7 @@ nal_t *ptl_hndl2nal(ptl_handle_any_t *handle) idx &= NI_HANDLE_MASK; - if (idx >= NAL_MAX_NR || + if (idx > NAL_MAX_NR || ptl_nal_table[idx] == NULL || ptl_nal_table[idx]->nal_refct == 0) return NULL; @@ -87,7 +87,7 @@ int ptl_register_nal (ptl_interface_t interface, nal_t *nal) ptl_mutex_enter(); - if (interface < 0 || interface >= NAL_MAX_NR) + if (interface < 0 || interface > NAL_MAX_NR) rc = PTL_IFACE_INVALID; else if (ptl_nal_table[interface] != NULL) rc = PTL_IFACE_DUP; @@ -103,7 +103,7 @@ int ptl_register_nal (ptl_interface_t interface, nal_t *nal) void ptl_unregister_nal (ptl_interface_t interface) { - LASSERT(interface >= 0 && interface < NAL_MAX_NR); + LASSERT(interface >= 0 && interface <= NAL_MAX_NR); LASSERT(ptl_nal_table[interface] != NULL); LASSERT(ptl_nal_table[interface]->nal_refct == 0); @@ -120,10 +120,10 @@ int PtlInit(int *max_interfaces) /* If this assertion fails, we need more bits in NI_HANDLE_MASK and * to shift NI_HANDLE_MAGIC left appropriately */ - LASSERT (NAL_MAX_NR <= (NI_HANDLE_MASK + 1)); + LASSERT (NAL_MAX_NR < (NI_HANDLE_MASK + 1)); if (max_interfaces != NULL) - *max_interfaces = NAL_MAX_NR; + *max_interfaces = NAL_MAX_NR + 1; ptl_mutex_enter(); @@ -158,7 +158,7 @@ void PtlFini(void) ptl_mutex_enter(); if (ptl_init) { - for (i = 0; i < NAL_MAX_NR; i++) { + for (i = 0; i <= NAL_MAX_NR; i++) { nal = ptl_nal_table[i]; if (nal == NULL) @@ -193,7 +193,7 @@ int PtlNIInit(ptl_interface_t interface, ptl_pid_t requested_pid, ptl_mutex_enter (); if (interface == PTL_IFACE_DEFAULT) { - for (i = 0; i < NAL_MAX_NR; i++) + for (i = 0; i <= NAL_MAX_NR; i++) if (ptl_nal_table[i] != NULL) { interface = i; break; @@ -203,7 +203,7 @@ int PtlNIInit(ptl_interface_t interface, ptl_pid_t requested_pid, } if (interface < 0 || - interface >= NAL_MAX_NR || + interface > NAL_MAX_NR || ptl_nal_table[interface] == NULL) { GOTO(out, rc = PTL_IFACE_INVALID); } diff --git a/lnet/lnet/api-wrap.c b/lnet/lnet/api-wrap.c index d7ff0203ea..37f6c0b2c6 100644 --- a/lnet/lnet/api-wrap.c +++ b/lnet/lnet/api-wrap.c @@ -57,6 +57,22 @@ int PtlGetId(ptl_handle_ni_t ni_handle, ptl_process_id_t *id) return nal->nal_get_id(nal, id); } +int PtlGetUid(ptl_handle_ni_t ni_handle, ptl_uid_t *uid) +{ + nal_t *nal; + + if (!ptl_init) + return PTL_NO_INIT; + + nal = ptl_hndl2nal(&ni_handle); + if (nal == NULL) + return PTL_NI_INVALID; + + /* We don't support different uids yet */ + *uid = 0; + return PTL_OK; +} + int PtlFailNid (ptl_handle_ni_t interface, ptl_nid_t nid, unsigned int threshold) { nal_t *nal; @@ -165,8 +181,8 @@ int PtlMDAttach(ptl_handle_me_t me_in, ptl_md_t md_in, if (nal == NULL) return PTL_ME_INVALID; - if (!PtlHandleIsEqual(md_in.eventq, PTL_EQ_NONE) && - ptl_hndl2nal(&md_in.eventq) != nal) + if (!PtlHandleIsEqual(md_in.eq_handle, PTL_EQ_NONE) && + ptl_hndl2nal(&md_in.eq_handle) != nal) return PTL_MD_ILLEGAL; return (nal->nal_md_attach)(nal, &me_in, &md_in, @@ -185,8 +201,8 @@ int PtlMDBind(ptl_handle_ni_t ni_in, ptl_md_t md_in, if (nal == NULL) return PTL_NI_INVALID; - if (!PtlHandleIsEqual(md_in.eventq, PTL_EQ_NONE) && - ptl_hndl2nal(&md_in.eventq) != nal) + if (!PtlHandleIsEqual(md_in.eq_handle, PTL_EQ_NONE) && + ptl_hndl2nal(&md_in.eq_handle) != nal) return PTL_MD_ILLEGAL; return (nal->nal_md_bind)(nal, &md_in, unlink_in, handle_out); diff --git a/lnet/lnet/lib-md.c b/lnet/lnet/lib-md.c index a4df791787..6deadb8442 100644 --- a/lnet/lnet/lib-md.c +++ b/lnet/lnet/lib-md.c @@ -97,8 +97,8 @@ lib_md_build(lib_nal_t *nal, lib_md_t *lmd, ptl_md_t *umd, int unlink) * otherwise caller may only lib_md_free() it. */ - if (!PtlHandleIsEqual (umd->eventq, PTL_EQ_NONE)) { - eq = ptl_handle2eq(&umd->eventq, nal); + if (!PtlHandleIsEqual (umd->eq_handle, PTL_EQ_NONE)) { + eq = ptl_handle2eq(&umd->eq_handle, nal); if (eq == NULL) return PTL_EQ_INVALID; } @@ -232,7 +232,7 @@ lib_md_deconstruct(lib_nal_t *nal, lib_md_t *lmd, ptl_md_t *umd) umd->max_size = lmd->max_size; umd->options = lmd->options; umd->user_ptr = lmd->user_ptr; - ptl_eq2handle(&umd->eventq, nal, lmd->eq); + ptl_eq2handle(&umd->eq_handle, nal, lmd->eq); } int @@ -342,7 +342,8 @@ lib_api_md_unlink (nal_t *apinal, ptl_handle_md_t *mdh) ev.type = PTL_EVENT_UNLINK; ev.ni_fail_type = PTL_OK; ev.unlinked = 1; - lib_md_deconstruct(nal, md, &ev.mem_desc); + lib_md_deconstruct(nal, md, &ev.md); + ptl_md2handle(&ev.md_handle, nal, md); lib_enq_event_locked(nal, NULL, md->eq, &ev); } diff --git a/lnet/lnet/lib-move.c b/lnet/lnet/lib-move.c index 854a452e55..13451d93e5 100644 --- a/lnet/lnet/lib-move.c +++ b/lnet/lnet/lib-move.c @@ -130,13 +130,14 @@ lib_match_md(lib_nal_t *nal, int index, int op_mask, /* NB Caller sets ev.type and ev.hdr_data */ msg->ev.initiator.nid = src_nid; msg->ev.initiator.pid = src_pid; - msg->ev.portal = index; + msg->ev.pt_index = index; msg->ev.match_bits = match_bits; msg->ev.rlength = rlength; msg->ev.mlength = mlength; msg->ev.offset = offset; - lib_md_deconstruct(nal, md, &msg->ev.mem_desc); + lib_md_deconstruct(nal, md, &msg->ev.md); + ptl_md2handle(&msg->ev.md_handle, nal, md); *offset_out = offset; *mlength_out = mlength; @@ -655,9 +656,9 @@ parse_put(lib_nal_t *nal, ptl_hdr_t *hdr, void *private, lib_msg_t *msg) unsigned long flags; /* Convert put fields to host byte order */ - hdr->msg.put.match_bits = NTOH__u64 (hdr->msg.put.match_bits); - hdr->msg.put.ptl_index = NTOH__u32 (hdr->msg.put.ptl_index); - hdr->msg.put.offset = NTOH__u32 (hdr->msg.put.offset); + hdr->msg.put.match_bits = le64_to_cpu(hdr->msg.put.match_bits); + hdr->msg.put.ptl_index = le32_to_cpu(hdr->msg.put.ptl_index); + hdr->msg.put.offset = le32_to_cpu(hdr->msg.put.offset); LIB_LOCK(nal, flags); @@ -705,10 +706,10 @@ parse_get(lib_nal_t *nal, ptl_hdr_t *hdr, void *private, lib_msg_t *msg) int rc; /* Convert get fields to host byte order */ - hdr->msg.get.match_bits = NTOH__u64 (hdr->msg.get.match_bits); - hdr->msg.get.ptl_index = NTOH__u32 (hdr->msg.get.ptl_index); - hdr->msg.get.sink_length = NTOH__u32 (hdr->msg.get.sink_length); - hdr->msg.get.src_offset = NTOH__u32 (hdr->msg.get.src_offset); + hdr->msg.get.match_bits = le64_to_cpu(hdr->msg.get.match_bits); + hdr->msg.get.ptl_index = le32_to_cpu(hdr->msg.get.ptl_index); + hdr->msg.get.sink_length = le32_to_cpu(hdr->msg.get.sink_length); + hdr->msg.get.src_offset = le32_to_cpu(hdr->msg.get.src_offset); LIB_LOCK(nal, flags); @@ -731,12 +732,12 @@ parse_get(lib_nal_t *nal, ptl_hdr_t *hdr, void *private, lib_msg_t *msg) LIB_UNLOCK(nal, flags); memset (&reply, 0, sizeof (reply)); - reply.type = HTON__u32 (PTL_MSG_REPLY); - reply.dest_nid = HTON__u64 (hdr->src_nid); - reply.dest_pid = HTON__u32 (hdr->src_pid); - reply.src_nid = HTON__u64 (ni->ni_pid.nid); - reply.src_pid = HTON__u32 (ni->ni_pid.pid); - reply.payload_length = HTON__u32 (mlength); + reply.type = cpu_to_le32(PTL_MSG_REPLY); + reply.dest_nid = cpu_to_le64(hdr->src_nid); + reply.dest_pid = cpu_to_le32(hdr->src_pid); + reply.src_nid = cpu_to_le64(ni->ni_pid.nid); + reply.src_pid = cpu_to_le32(ni->ni_pid.pid); + reply.payload_length = cpu_to_le32(mlength); reply.msg.reply.dst_wmd = hdr->msg.get.return_wmd; @@ -810,7 +811,8 @@ parse_reply(lib_nal_t *nal, ptl_hdr_t *hdr, void *private, lib_msg_t *msg) msg->ev.mlength = length; msg->ev.offset = 0; - lib_md_deconstruct(nal, md, &msg->ev.mem_desc); + lib_md_deconstruct(nal, md, &msg->ev.md); + ptl_md2handle(&msg->ev.md_handle, nal, md); ni->ni_counters.recv_count++; ni->ni_counters.recv_length += length; @@ -833,8 +835,8 @@ parse_ack(lib_nal_t *nal, ptl_hdr_t *hdr, void *private, lib_msg_t *msg) unsigned long flags; /* Convert ack fields to host byte order */ - hdr->msg.ack.match_bits = NTOH__u64 (hdr->msg.ack.match_bits); - hdr->msg.ack.mlength = NTOH__u32 (hdr->msg.ack.mlength); + hdr->msg.ack.match_bits = le64_to_cpu(hdr->msg.ack.match_bits); + hdr->msg.ack.mlength = le32_to_cpu(hdr->msg.ack.mlength); LIB_LOCK(nal, flags); @@ -863,7 +865,8 @@ parse_ack(lib_nal_t *nal, ptl_hdr_t *hdr, void *private, lib_msg_t *msg) msg->ev.mlength = hdr->msg.ack.mlength; msg->ev.match_bits = hdr->msg.ack.match_bits; - lib_md_deconstruct(nal, md, &msg->ev.mem_desc); + lib_md_deconstruct(nal, md, &msg->ev.md); + ptl_md2handle(&msg->ev.md_handle, nal, md); ni->ni_counters.recv_count++; @@ -964,20 +967,20 @@ lib_parse(lib_nal_t *nal, ptl_hdr_t *hdr, void *private) * message after that point is the responsibility of the NAL */ /* convert common fields to host byte order */ - hdr->type = NTOH__u32 (hdr->type); - hdr->src_nid = NTOH__u64 (hdr->src_nid); - hdr->src_pid = NTOH__u32 (hdr->src_pid); - hdr->dest_pid = NTOH__u32 (hdr->dest_pid); - hdr->payload_length = NTOH__u32(hdr->payload_length); + hdr->type = le32_to_cpu(hdr->type); + hdr->src_nid = le64_to_cpu(hdr->src_nid); + hdr->src_pid = le32_to_cpu(hdr->src_pid); + hdr->dest_pid = le32_to_cpu(hdr->dest_pid); + hdr->payload_length = le32_to_cpu(hdr->payload_length); switch (hdr->type) { case PTL_MSG_HELLO: { /* dest_nid is really ptl_magicversion_t */ ptl_magicversion_t *mv = (ptl_magicversion_t *)&hdr->dest_nid; - mv->magic = NTOH__u32(mv->magic); - mv->version_major = NTOH__u16(mv->version_major); - mv->version_minor = NTOH__u16(mv->version_minor); + mv->magic = le32_to_cpu(mv->magic); + mv->version_major = le16_to_cpu(mv->version_major); + mv->version_minor = le16_to_cpu(mv->version_minor); if (mv->magic == PORTALS_PROTO_MAGIC && mv->version_major == PORTALS_PROTO_VERSION_MAJOR && @@ -1006,7 +1009,7 @@ lib_parse(lib_nal_t *nal, ptl_hdr_t *hdr, void *private) case PTL_MSG_PUT: case PTL_MSG_GET: case PTL_MSG_REPLY: - hdr->dest_nid = NTOH__u64 (hdr->dest_nid); + hdr->dest_nid = le64_to_cpu(hdr->dest_nid); if (hdr->dest_nid != nal->libnal_ni.ni_pid.nid) { CERROR(LPU64": BAD dest NID in %s message from" LPU64" to "LPU64" (not me)\n", @@ -1125,12 +1128,12 @@ lib_api_put(nal_t *apinal, ptl_handle_md_t *mdh, CDEBUG(D_NET, "PtlPut -> "LPX64"\n", id->nid); memset (&hdr, 0, sizeof (hdr)); - hdr.type = HTON__u32 (PTL_MSG_PUT); - hdr.dest_nid = HTON__u64 (id->nid); - hdr.dest_pid = HTON__u32 (id->pid); - hdr.src_nid = HTON__u64 (ni->ni_pid.nid); - hdr.src_pid = HTON__u32 (ni->ni_pid.pid); - hdr.payload_length = HTON__u32 (md->length); + hdr.type = cpu_to_le32(PTL_MSG_PUT); + hdr.dest_nid = cpu_to_le64(id->nid); + hdr.dest_pid = cpu_to_le32(id->pid); + hdr.src_nid = cpu_to_le64(ni->ni_pid.nid); + hdr.src_pid = cpu_to_le32(ni->ni_pid.pid); + hdr.payload_length = cpu_to_le32(md->length); /* NB handles only looked up by creator (no flips) */ if (ack == PTL_ACK_REQ) { @@ -1140,9 +1143,9 @@ lib_api_put(nal_t *apinal, ptl_handle_md_t *mdh, hdr.msg.put.ack_wmd = PTL_WIRE_HANDLE_NONE; } - hdr.msg.put.match_bits = HTON__u64 (match_bits); - hdr.msg.put.ptl_index = HTON__u32 (portal); - hdr.msg.put.offset = HTON__u32 (offset); + hdr.msg.put.match_bits = cpu_to_le64(match_bits); + hdr.msg.put.ptl_index = cpu_to_le32(portal); + hdr.msg.put.offset = cpu_to_le32(offset); hdr.msg.put.hdr_data = hdr_data; lib_commit_md(nal, md, msg); @@ -1150,14 +1153,15 @@ lib_api_put(nal_t *apinal, ptl_handle_md_t *mdh, msg->ev.type = PTL_EVENT_SEND_END; msg->ev.initiator.nid = ni->ni_pid.nid; msg->ev.initiator.pid = ni->ni_pid.pid; - msg->ev.portal = portal; + msg->ev.pt_index = portal; msg->ev.match_bits = match_bits; msg->ev.rlength = md->length; msg->ev.mlength = md->length; msg->ev.offset = offset; msg->ev.hdr_data = hdr_data; - lib_md_deconstruct(nal, md, &msg->ev.mem_desc); + lib_md_deconstruct(nal, md, &msg->ev.md); + ptl_md2handle(&msg->ev.md_handle, nal, md); ni->ni_counters.send_count++; ni->ni_counters.send_length += md->length; @@ -1219,7 +1223,8 @@ lib_create_reply_msg (lib_nal_t *nal, ptl_nid_t peer_nid, lib_msg_t *getmsg) msg->ev.rlength = msg->ev.mlength = getmd->length; msg->ev.offset = 0; - lib_md_deconstruct(nal, getmd, &msg->ev.mem_desc); + lib_md_deconstruct(nal, getmd, &msg->ev.md); + ptl_md2handle(&msg->ev.md_handle, nal, getmd); ni->ni_counters.recv_count++; ni->ni_counters.recv_length += getmd->length; @@ -1281,34 +1286,35 @@ lib_api_get(nal_t *apinal, ptl_handle_md_t *mdh, ptl_process_id_t *id, (unsigned long)id->pid); memset (&hdr, 0, sizeof (hdr)); - hdr.type = HTON__u32 (PTL_MSG_GET); - hdr.dest_nid = HTON__u64 (id->nid); - hdr.dest_pid = HTON__u32 (id->pid); - hdr.src_nid = HTON__u64 (ni->ni_pid.nid); - hdr.src_pid = HTON__u32 (ni->ni_pid.pid); + hdr.type = cpu_to_le32(PTL_MSG_GET); + hdr.dest_nid = cpu_to_le64(id->nid); + hdr.dest_pid = cpu_to_le32(id->pid); + hdr.src_nid = cpu_to_le64(ni->ni_pid.nid); + hdr.src_pid = cpu_to_le32(ni->ni_pid.pid); hdr.payload_length = 0; /* NB handles only looked up by creator (no flips) */ hdr.msg.get.return_wmd.wh_interface_cookie = ni->ni_interface_cookie; hdr.msg.get.return_wmd.wh_object_cookie = md->md_lh.lh_cookie; - hdr.msg.get.match_bits = HTON__u64 (match_bits); - hdr.msg.get.ptl_index = HTON__u32 (portal); - hdr.msg.get.src_offset = HTON__u32 (offset); - hdr.msg.get.sink_length = HTON__u32 (md->length); + hdr.msg.get.match_bits = cpu_to_le64(match_bits); + hdr.msg.get.ptl_index = cpu_to_le32(portal); + hdr.msg.get.src_offset = cpu_to_le32(offset); + hdr.msg.get.sink_length = cpu_to_le32(md->length); lib_commit_md(nal, md, msg); msg->ev.type = PTL_EVENT_SEND_END; msg->ev.initiator = ni->ni_pid; - msg->ev.portal = portal; + msg->ev.pt_index = portal; msg->ev.match_bits = match_bits; msg->ev.rlength = md->length; msg->ev.mlength = md->length; msg->ev.offset = offset; msg->ev.hdr_data = 0; - lib_md_deconstruct(nal, md, &msg->ev.mem_desc); + lib_md_deconstruct(nal, md, &msg->ev.md); + ptl_md2handle(&msg->ev.md_handle, nal, md); ni->ni_counters.send_count++; @@ -1329,14 +1335,14 @@ lib_api_get(nal_t *apinal, ptl_handle_md_t *mdh, ptl_process_id_t *id, void lib_assert_wire_constants (void) { /* Wire protocol assertions generated by 'wirecheck' - * running on Linux robert.bartonsoftware.com 2.4.20-18.9 #1 Thu May 29 06:54:41 EDT 2003 i68 - * with gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) */ + * running on Linux mdevi 2.4.21-p4smp-55chaos #1 SMP Tue Jun 8 14:38:44 PDT 2004 i686 i686 i + * with gcc version 3.2.3 20030502 (Red Hat Linux 3.2.3-34) */ /* Constants... */ LASSERT (PORTALS_PROTO_MAGIC == 0xeebc0ded); - LASSERT (PORTALS_PROTO_VERSION_MAJOR == 0); - LASSERT (PORTALS_PROTO_VERSION_MINOR == 3); + LASSERT (PORTALS_PROTO_VERSION_MAJOR == 1); + LASSERT (PORTALS_PROTO_VERSION_MINOR == 0); LASSERT (PTL_MSG_ACK == 0); LASSERT (PTL_MSG_PUT == 1); LASSERT (PTL_MSG_GET == 2); @@ -1345,76 +1351,76 @@ void lib_assert_wire_constants (void) /* Checks for struct ptl_handle_wire_t */ LASSERT ((int)sizeof(ptl_handle_wire_t) == 16); - LASSERT (offsetof(ptl_handle_wire_t, wh_interface_cookie) == 0); + LASSERT ((int)offsetof(ptl_handle_wire_t, wh_interface_cookie) == 0); LASSERT ((int)sizeof(((ptl_handle_wire_t *)0)->wh_interface_cookie) == 8); - LASSERT (offsetof(ptl_handle_wire_t, wh_object_cookie) == 8); + LASSERT ((int)offsetof(ptl_handle_wire_t, wh_object_cookie) == 8); LASSERT ((int)sizeof(((ptl_handle_wire_t *)0)->wh_object_cookie) == 8); /* Checks for struct ptl_magicversion_t */ LASSERT ((int)sizeof(ptl_magicversion_t) == 8); - LASSERT (offsetof(ptl_magicversion_t, magic) == 0); + LASSERT ((int)offsetof(ptl_magicversion_t, magic) == 0); LASSERT ((int)sizeof(((ptl_magicversion_t *)0)->magic) == 4); - LASSERT (offsetof(ptl_magicversion_t, version_major) == 4); + LASSERT ((int)offsetof(ptl_magicversion_t, version_major) == 4); LASSERT ((int)sizeof(((ptl_magicversion_t *)0)->version_major) == 2); - LASSERT (offsetof(ptl_magicversion_t, version_minor) == 6); + LASSERT ((int)offsetof(ptl_magicversion_t, version_minor) == 6); LASSERT ((int)sizeof(((ptl_magicversion_t *)0)->version_minor) == 2); /* Checks for struct ptl_hdr_t */ LASSERT ((int)sizeof(ptl_hdr_t) == 72); - LASSERT (offsetof(ptl_hdr_t, dest_nid) == 0); + LASSERT ((int)offsetof(ptl_hdr_t, dest_nid) == 0); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->dest_nid) == 8); - LASSERT (offsetof(ptl_hdr_t, src_nid) == 8); + LASSERT ((int)offsetof(ptl_hdr_t, src_nid) == 8); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->src_nid) == 8); - LASSERT (offsetof(ptl_hdr_t, dest_pid) == 16); + LASSERT ((int)offsetof(ptl_hdr_t, dest_pid) == 16); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->dest_pid) == 4); - LASSERT (offsetof(ptl_hdr_t, src_pid) == 20); + LASSERT ((int)offsetof(ptl_hdr_t, src_pid) == 20); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->src_pid) == 4); - LASSERT (offsetof(ptl_hdr_t, type) == 24); + LASSERT ((int)offsetof(ptl_hdr_t, type) == 24); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->type) == 4); - LASSERT (offsetof(ptl_hdr_t, payload_length) == 28); + LASSERT ((int)offsetof(ptl_hdr_t, payload_length) == 28); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->payload_length) == 4); - LASSERT (offsetof(ptl_hdr_t, msg) == 32); + LASSERT ((int)offsetof(ptl_hdr_t, msg) == 32); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg) == 40); /* Ack */ - LASSERT (offsetof(ptl_hdr_t, msg.ack.dst_wmd) == 32); + LASSERT ((int)offsetof(ptl_hdr_t, msg.ack.dst_wmd) == 32); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.ack.dst_wmd) == 16); - LASSERT (offsetof(ptl_hdr_t, msg.ack.match_bits) == 48); + LASSERT ((int)offsetof(ptl_hdr_t, msg.ack.match_bits) == 48); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.ack.match_bits) == 8); - LASSERT (offsetof(ptl_hdr_t, msg.ack.mlength) == 56); + LASSERT ((int)offsetof(ptl_hdr_t, msg.ack.mlength) == 56); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.ack.mlength) == 4); /* Put */ - LASSERT (offsetof(ptl_hdr_t, msg.put.ack_wmd) == 32); + LASSERT ((int)offsetof(ptl_hdr_t, msg.put.ack_wmd) == 32); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.put.ack_wmd) == 16); - LASSERT (offsetof(ptl_hdr_t, msg.put.match_bits) == 48); + LASSERT ((int)offsetof(ptl_hdr_t, msg.put.match_bits) == 48); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.put.match_bits) == 8); - LASSERT (offsetof(ptl_hdr_t, msg.put.hdr_data) == 56); + LASSERT ((int)offsetof(ptl_hdr_t, msg.put.hdr_data) == 56); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.put.hdr_data) == 8); - LASSERT (offsetof(ptl_hdr_t, msg.put.ptl_index) == 64); + LASSERT ((int)offsetof(ptl_hdr_t, msg.put.ptl_index) == 64); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.put.ptl_index) == 4); - LASSERT (offsetof(ptl_hdr_t, msg.put.offset) == 68); + LASSERT ((int)offsetof(ptl_hdr_t, msg.put.offset) == 68); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.put.offset) == 4); /* Get */ - LASSERT (offsetof(ptl_hdr_t, msg.get.return_wmd) == 32); + LASSERT ((int)offsetof(ptl_hdr_t, msg.get.return_wmd) == 32); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.get.return_wmd) == 16); - LASSERT (offsetof(ptl_hdr_t, msg.get.match_bits) == 48); + LASSERT ((int)offsetof(ptl_hdr_t, msg.get.match_bits) == 48); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.get.match_bits) == 8); - LASSERT (offsetof(ptl_hdr_t, msg.get.ptl_index) == 56); + LASSERT ((int)offsetof(ptl_hdr_t, msg.get.ptl_index) == 56); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.get.ptl_index) == 4); - LASSERT (offsetof(ptl_hdr_t, msg.get.src_offset) == 60); + LASSERT ((int)offsetof(ptl_hdr_t, msg.get.src_offset) == 60); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.get.src_offset) == 4); - LASSERT (offsetof(ptl_hdr_t, msg.get.sink_length) == 64); + LASSERT ((int)offsetof(ptl_hdr_t, msg.get.sink_length) == 64); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.get.sink_length) == 4); /* Reply */ - LASSERT (offsetof(ptl_hdr_t, msg.reply.dst_wmd) == 32); + LASSERT ((int)offsetof(ptl_hdr_t, msg.reply.dst_wmd) == 32); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.reply.dst_wmd) == 16); /* Hello */ - LASSERT (offsetof(ptl_hdr_t, msg.hello.incarnation) == 32); + LASSERT ((int)offsetof(ptl_hdr_t, msg.hello.incarnation) == 32); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.hello.incarnation) == 8); - LASSERT (offsetof(ptl_hdr_t, msg.hello.type) == 40); + LASSERT ((int)offsetof(ptl_hdr_t, msg.hello.type) == 40); LASSERT ((int)sizeof(((ptl_hdr_t *)0)->msg.hello.type) == 4); } diff --git a/lnet/lnet/lib-msg.c b/lnet/lnet/lib-msg.c index 328b8d8a7d..54e89bcf40 100644 --- a/lnet/lnet/lib-msg.c +++ b/lnet/lnet/lib-msg.c @@ -37,9 +37,17 @@ lib_enq_event_locked (lib_nal_t *nal, void *private, lib_eq_t *eq, ptl_event_t *ev) { ptl_event_t *eq_slot; - - ev->sequence = eq->eq_enq_seq++; /* Allocate the next queue slot */ + /* Allocate the next queue slot */ + ev->link = ev->sequence = eq->eq_enq_seq++; + /* NB we don't support START events yet and we don't create a separate + * UNLINK event unless an explicit unlink succeeds, so the link + * sequence is pretty useless */ + + /* We don't support different uid/jids yet */ + ev->uid = 0; + ev->jid = 0; + /* size must be a power of 2 to handle sequence # overflow */ LASSERT (eq->eq_size != 0 && eq->eq_size == LOWEST_BIT_SET (eq->eq_size)); @@ -83,16 +91,16 @@ lib_finalize (lib_nal_t *nal, void *private, lib_msg_t *msg, ptl_err_t status) LASSERT(msg->ev.type == PTL_EVENT_PUT_END); memset (&ack, 0, sizeof (ack)); - ack.type = HTON__u32 (PTL_MSG_ACK); - ack.dest_nid = HTON__u64 (msg->ev.initiator.nid); - ack.dest_pid = HTON__u32 (msg->ev.initiator.pid); - ack.src_nid = HTON__u64 (nal->libnal_ni.ni_pid.nid); - ack.src_pid = HTON__u32 (nal->libnal_ni.ni_pid.pid); + ack.type = cpu_to_le32(PTL_MSG_ACK); + ack.dest_nid = cpu_to_le64(msg->ev.initiator.nid); + ack.dest_pid = cpu_to_le32(msg->ev.initiator.pid); + ack.src_nid = cpu_to_le64(nal->libnal_ni.ni_pid.nid); + ack.src_pid = cpu_to_le32(nal->libnal_ni.ni_pid.pid); ack.payload_length = 0; ack.msg.ack.dst_wmd = msg->ack_wmd; ack.msg.ack.match_bits = msg->ev.match_bits; - ack.msg.ack.mlength = HTON__u32 (msg->ev.mlength); + ack.msg.ack.mlength = cpu_to_le32(msg->ev.mlength); rc = lib_send (nal, private, NULL, &ack, PTL_MSG_ACK, msg->ev.initiator.nid, msg->ev.initiator.pid, diff --git a/lnet/router/proc.c b/lnet/router/proc.c index dd65b34b6d..0fe3b90511 100644 --- a/lnet/router/proc.c +++ b/lnet/router/proc.c @@ -24,55 +24,196 @@ #include "router.h" #define KPR_PROC_ROUTER "sys/portals/router" +#define KPR_PROC_ROUTES "sys/portals/routes" -int -kpr_proc_read (char *page, char **start, off_t off, int count, int *eof, void *data) +/* Used for multi-page route list book keeping */ +struct proc_route_data { + struct list_head *curr; + unsigned int generation; + off_t skip; +} kpr_read_routes_data; + +/* nal2name support re-used from utils/portals.c */ +struct name2num { + char *name; + int num; +} nalnames[] = { + { "any", 0}, + { "elan", QSWNAL}, + { "tcp", SOCKNAL}, + { "gm", GMNAL}, + { "ib", OPENIBNAL}, + { NULL, -1} +}; + +static struct name2num *name2num_lookup_num(struct name2num *table, int num) +{ + while (table->name != NULL) + if (num == table->num) + return (table); + else + table++; + return (NULL); +} + +static char *nal2name(int nal) { - unsigned long long bytes = kpr_fwd_bytes; - unsigned long packets = kpr_fwd_packets; - unsigned long errors = kpr_fwd_errors; + struct name2num *e = name2num_lookup_num(nalnames, nal); + return ((e == NULL) ? "???" : e->name); +} + + +static int kpr_proc_router_read(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + unsigned long long bytes = kpr_fwd_bytes; + unsigned long packets = kpr_fwd_packets; + unsigned long errors = kpr_fwd_errors; unsigned int qdepth = atomic_read (&kpr_queue_depth); - int len; - - *eof = 1; - if (off != 0) - return (0); - - len = sprintf (page, "%Ld %ld %ld %d\n", bytes, packets, errors, qdepth); - - *start = page; - return (len); + int len; + + *eof = 1; + if (off != 0) + return (0); + + len = sprintf(page, "%Ld %ld %ld %d\n", bytes, packets, errors, qdepth); + + *start = page; + return (len); } -int -kpr_proc_write (struct file *file, const char *ubuffer, unsigned long count, void *data) +static int kpr_proc_router_write(struct file *file, const char *ubuffer, + unsigned long count, void *data) { - /* Ignore what we've been asked to write, and just zero the stats counters */ - kpr_fwd_bytes = 0; - kpr_fwd_packets = 0; - kpr_fwd_errors = 0; + /* Ignore what we've been asked to write, and just zero the stats */ + kpr_fwd_bytes = 0; + kpr_fwd_packets = 0; + kpr_fwd_errors = 0; - return (count); + return (count); } -void -kpr_proc_init(void) +static int kpr_proc_routes_read(char *page, char **start, off_t off, + int count, int *eof, void *data) { - struct proc_dir_entry *entry = create_proc_entry (KPR_PROC_ROUTER, S_IFREG | S_IRUGO | S_IWUSR, NULL); + struct proc_route_data *prd = data; + kpr_route_entry_t *re; + kpr_gateway_entry_t *ge; + int chunk_len = 0; + int line_len = 0; + int user_len = 0; + + *eof = 1; + *start = page; + + if (prd->curr == NULL) { + if (off != 0) + return 0; + + /* First pass, initialize our private data */ + prd->curr = kpr_routes.next; + prd->generation = kpr_routes_generation; + prd->skip = 0; + } else { + /* Abort route list generation change */ + if (prd->generation != kpr_routes_generation) { + prd->curr = NULL; + return sprintf(page, "\nError: Routes Changed\n"); + } + + /* All the routes have been walked */ + if (prd->curr == &kpr_routes) { + prd->curr = NULL; + return 0; + } + } + + read_lock(&kpr_rwlock); + *start = page + prd->skip; + user_len = -prd->skip; + + for (; prd->curr != &kpr_routes; prd->curr = prd->curr->next) { + re = list_entry(prd->curr, kpr_route_entry_t, kpre_list); + ge = re->kpre_gateway; + + line_len = sprintf(page + chunk_len, + "%12s "LPX64" : "LPX64" - "LPX64", %s\n", + nal2name(ge->kpge_nalid), ge->kpge_nid, + re->kpre_lo_nid, re->kpre_hi_nid, + ge->kpge_alive ? "up" : "down"); + chunk_len += line_len; + user_len += line_len; - if (entry == NULL) - { + /* The route table will exceed one page */ + if ((chunk_len > (PAGE_SIZE - 80)) || (user_len > count)) { + prd->curr = prd->curr->next; + break; + } + } + + *eof = 0; + + /* Caller received only a portion of the last entry, the + * remaining will be delivered in the next page if asked for. + */ + if (user_len > count) { + prd->curr = prd->curr->prev; + prd->skip = line_len - (user_len - count); + read_unlock(&kpr_rwlock); + return count; + } + + /* Not enough data to entirely satify callers request */ + prd->skip = 0; + read_unlock(&kpr_rwlock); + return user_len; +} + +static int kpr_proc_routes_write(struct file *file, const char *ubuffer, + unsigned long count, void *data) +{ + /* no-op; lctl should be used to adjust the routes */ + return (count); +} + +void kpr_proc_init(void) +{ + struct proc_dir_entry *router_entry; + struct proc_dir_entry *routes_entry; + + /* Initialize KPR_PROC_ROUTER */ + router_entry = create_proc_entry (KPR_PROC_ROUTER, + S_IFREG | S_IRUGO | S_IWUSR, NULL); + + if (router_entry == NULL) { CERROR("couldn't create proc entry %s\n", KPR_PROC_ROUTER); return; } - entry->data = NULL; - entry->read_proc = kpr_proc_read; - entry->write_proc = kpr_proc_write; + router_entry->data = NULL; + router_entry->read_proc = kpr_proc_router_read; + router_entry->write_proc = kpr_proc_router_write; + + /* Initialize KPR_PROC_ROUTES */ + routes_entry = create_proc_entry (KPR_PROC_ROUTES, + S_IFREG | S_IRUGO | S_IWUSR, NULL); + + if (routes_entry == NULL) { + CERROR("couldn't create proc entry %s\n", KPR_PROC_ROUTES); + return; + } + + kpr_read_routes_data.curr = NULL; + kpr_read_routes_data.generation = 0; + kpr_read_routes_data.skip = 0; + + routes_entry->data = &kpr_read_routes_data; + routes_entry->read_proc = kpr_proc_routes_read; + routes_entry->write_proc = kpr_proc_routes_write; } -void -kpr_proc_fini(void) +void kpr_proc_fini(void) { remove_proc_entry(KPR_PROC_ROUTER, 0); + remove_proc_entry(KPR_PROC_ROUTES, 0); } diff --git a/lnet/router/router.c b/lnet/router/router.c index 9fb6afef4c..448ab1f588 100644 --- a/lnet/router/router.c +++ b/lnet/router/router.c @@ -27,6 +27,7 @@ LIST_HEAD(kpr_routes); LIST_HEAD(kpr_gateways); LIST_HEAD(kpr_nals); +unsigned int kpr_routes_generation; unsigned long long kpr_fwd_bytes; unsigned long kpr_fwd_packets; unsigned long kpr_fwd_errors; @@ -594,7 +595,7 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, list_for_each (e, &kpr_gateways) { kpr_gateway_entry_t *ge2 = list_entry(e, kpr_gateway_entry_t, kpge_list); - + if (ge2->kpge_nalid == gateway_nalid && ge2->kpge_nid == gateway_nid) { PORTAL_FREE (ge, sizeof (*ge)); @@ -606,7 +607,6 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, if (!dup) { /* Adding a new gateway... */ - list_add (&ge->kpge_list, &kpr_gateways); /* ...zero all gateway weights so this one doesn't have to @@ -617,12 +617,12 @@ kpr_add_route (int gateway_nalid, ptl_nid_t gateway_nid, kpge_list); atomic_set (&ge2->kpge_weight, 0); } - } re->kpre_gateway = ge; ge->kpge_refcount++; list_add (&re->kpre_list, &kpr_routes); + kpr_routes_generation++; write_unlock_irqrestore (&kpr_rwlock, flags); return (0); @@ -640,12 +640,12 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid, ptl_nid_t lo, ptl_nid_t hi) { int specific = (lo != PTL_NID_ANY); - unsigned long flags; + unsigned long flags; int rc = -ENOENT; - struct list_head *e; - struct list_head *n; + struct list_head *e; + struct list_head *n; - CDEBUG(D_NET, "Del route [%d] "LPX64" : "LPX64" - "LPX64"\n", + CDEBUG(D_NET, "Del route [%d] "LPX64" : "LPX64" - "LPX64"\n", gw_nalid, gw_nid, lo, hi); LASSERT(!in_interrupt()); @@ -653,20 +653,19 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid, /* NB Caller may specify either all routes via the given gateway * (lo/hi == PTL_NID_ANY) or a specific route entry (lo/hi are * actual NIDs) */ - if (specific ? (hi == PTL_NID_ANY || hi < lo) : (hi != PTL_NID_ANY)) return (-EINVAL); - write_lock_irqsave(&kpr_rwlock, flags); + write_lock_irqsave(&kpr_rwlock, flags); list_for_each_safe (e, n, &kpr_routes) { kpr_route_entry_t *re = list_entry(e, kpr_route_entry_t, kpre_list); kpr_gateway_entry_t *ge = re->kpre_gateway; - + if (ge->kpge_nalid != gw_nalid || ge->kpge_nid != gw_nid || - (specific && + (specific && (lo != re->kpre_lo_nid || hi != re->kpre_hi_nid))) continue; @@ -684,7 +683,9 @@ kpr_del_route (int gw_nalid, ptl_nid_t gw_nid, break; } + kpr_routes_generation++; write_unlock_irqrestore(&kpr_rwlock, flags); + return (rc); } @@ -800,6 +801,7 @@ kpr_initialise (void) CDEBUG(D_MALLOC, "kpr_initialise: kmem %d\n", atomic_read(&portal_kmemory)); + kpr_routes_generation = 0; kpr_proc_init(); rc = libcfs_nal_cmd_register(ROUTER, kpr_nal_cmd, NULL); diff --git a/lnet/router/router.h b/lnet/router/router.h index 0787064c50..27e49837a2 100644 --- a/lnet/router/router.h +++ b/lnet/router/router.h @@ -93,9 +93,13 @@ extern void kpr_deregister_nal (void *arg); extern void kpr_proc_init (void); extern void kpr_proc_fini (void); +extern unsigned int kpr_routes_generation; extern unsigned long long kpr_fwd_bytes; extern unsigned long kpr_fwd_packets; extern unsigned long kpr_fwd_errors; extern atomic_t kpr_queue_depth; +extern struct list_head kpr_routes; +extern rwlock_t kpr_rwlock; + #endif /* _KPLROUTER_H */ diff --git a/lnet/tests/ping_cli.c b/lnet/tests/ping_cli.c index b216df16c5..7a3f8a0809 100644 --- a/lnet/tests/ping_cli.c +++ b/lnet/tests/ping_cli.c @@ -87,17 +87,17 @@ pingcli_shutdown(ptl_handle_ni_t nih, int err) static void pingcli_callback(ptl_event_t *ev) { int i, magic; - i = *(int *)(ev->mem_desc.start + ev->offset + sizeof(unsigned)); - magic = *(int *)(ev->mem_desc.start + ev->offset); + i = *(int *)(ev->md.start + ev->offset + sizeof(unsigned)); + magic = *(int *)(ev->md.start + ev->offset); if(magic != 0xcafebabe) { - printk ("LustreError: Unexpected response \n"); + CERROR("Unexpected response %x\n", magic); } if((i == count) || !count) wake_up_process (client->tsk); else - printk ("LustreError: Received response after timeout for %d\n",i); + CERROR("Received response after timeout for %d\n",i); } @@ -188,7 +188,7 @@ pingcli_start(struct portal_ioctl_data *args) client->md_in_head.threshold = PTL_MD_THRESH_INF; client->md_in_head.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; client->md_in_head.user_ptr = NULL; - client->md_in_head.eventq = client->eq; + client->md_in_head.eq_handle = client->eq; memset (client->inbuf, 0, (args->ioc_size + STDSIZE) * count); /* Attach the incoming buffer */ @@ -204,7 +204,7 @@ pingcli_start(struct portal_ioctl_data *args) client->md_out_head.threshold = args->ioc_count; client->md_out_head.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; client->md_out_head.user_ptr = NULL; - client->md_out_head.eventq = PTL_EQ_NONE; + client->md_out_head.eq_handle = PTL_EQ_NONE; memcpy (client->outbuf, &ping_head_magic, sizeof(ping_bulk_magic)); @@ -232,17 +232,17 @@ pingcli_start(struct portal_ioctl_data *args) pingcli_shutdown (nih, 1); return NULL; } - printk ("Lustre: sent msg no %d", count); + CWARN ("Lustre: sent msg no %d", count); set_current_state (TASK_INTERRUPTIBLE); rc = schedule_timeout (20 * args->ioc_timeout); if (rc == 0) { - printk ("LustreError: :: timeout .....\n"); + CERROR ("timeout .....\n"); } else { do_gettimeofday (&tv2); - printk("Lustre: :: Reply in %u usec\n", - (unsigned)((tv2.tv_sec - tv1.tv_sec) - * 1000000 + (tv2.tv_usec - tv1.tv_usec))); + CWARN("Reply in %u usec\n", + (unsigned)((tv2.tv_sec - tv1.tv_sec) + * 1000000 + (tv2.tv_usec - tv1.tv_usec))); } count++; } diff --git a/lnet/tests/ping_srv.c b/lnet/tests/ping_srv.c index 188ba98985..dec806ac1e 100644 --- a/lnet/tests/ping_srv.c +++ b/lnet/tests/ping_srv.c @@ -116,12 +116,12 @@ int pingsrv_thread(void *arg) continue; } - magic = *((int *)(server->evnt.mem_desc.start + magic = *((int *)(server->evnt.md.start + server->evnt.offset)); if(magic != 0xdeadbeef) { - printk("LustreError: Unexpected Packet to the server\n"); + CERROR("Unexpected Packet to the server\n"); } memcpy (server->in_buf, &ping_bulk_magic, sizeof(ping_bulk_magic)); @@ -131,7 +131,7 @@ int pingsrv_thread(void *arg) server->mdout.threshold = 1; server->mdout.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; server->mdout.user_ptr = NULL; - server->mdout.eventq = PTL_EQ_NONE; + server->mdout.eq_handle = PTL_EQ_NONE; /* Bind the outgoing buffer */ if ((rc = PtlMDBind (server->ni, server->mdout, @@ -147,7 +147,7 @@ int pingsrv_thread(void *arg) server->mdin.threshold = 1; server->mdin.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; server->mdin.user_ptr = NULL; - server->mdin.eventq = server->eq; + server->mdin.eq_handle = server->eq; if ((rc = PtlMDAttach (server->me, server->mdin, PTL_UNLINK, &server->mdin_h))) { @@ -182,12 +182,12 @@ static void pingsrv_callback(ptl_event_t *ev) } server->evnt = *ev; - printk ("Lustre: received ping from nid "LPX64" " + CWARN ("received ping from nid "LPX64" " "(off=%u rlen=%u mlen=%u head=%x seq=%d size=%d)\n", ev->initiator.nid, ev->offset, ev->rlength, ev->mlength, - *((int *)(ev->mem_desc.start + ev->offset)), - *((int *)(ev->mem_desc.start + ev->offset + sizeof(unsigned))), - *((int *)(ev->mem_desc.start + ev->offset + 2 * + *((int *)(ev->md.start + ev->offset)), + *((int *)(ev->md.start + ev->offset + sizeof(unsigned))), + *((int *)(ev->md.start + ev->offset + 2 * sizeof(unsigned)))); packets_valid++; @@ -247,7 +247,7 @@ static struct pingsrv_data *pingsrv_setup(void) server->mdin.threshold = 1; server->mdin.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; server->mdin.user_ptr = NULL; - server->mdin.eventq = server->eq; + server->mdin.eq_handle = server->eq; memset (server->in_buf, 0, STDSIZE); if ((rc = PtlMDAttach (server->me, server->mdin, diff --git a/lnet/tests/sping_cli.c b/lnet/tests/sping_cli.c index 8e8649195d..730ba00392 100644 --- a/lnet/tests/sping_cli.c +++ b/lnet/tests/sping_cli.c @@ -182,7 +182,7 @@ pingcli_start(struct portal_ioctl_data *args) client->md_in_head.threshold = 1; client->md_in_head.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; client->md_in_head.user_ptr = NULL; - client->md_in_head.eventq = client->eq; + client->md_in_head.eq_handle = client->eq; memset (client->inbuf, 0, STDSIZE); /* Attach the incoming buffer */ @@ -199,7 +199,7 @@ pingcli_start(struct portal_ioctl_data *args) client->md_out_head.threshold = 1; client->md_out_head.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; client->md_out_head.user_ptr = NULL; - client->md_out_head.eventq = PTL_EQ_NONE; + client->md_out_head.eq_handle = PTL_EQ_NONE; memcpy (client->outbuf, &ping_head_magic, sizeof(ping_head_magic)); @@ -222,12 +222,12 @@ pingcli_start(struct portal_ioctl_data *args) set_current_state (TASK_INTERRUPTIBLE); rc = schedule_timeout (20 * args->ioc_timeout); if (rc == 0) { - printk ("LustreError: Time out on the server\n"); + CERROR ("Time out on the server\n"); pingcli_shutdown (nih, 2); return NULL; - } else - printk("Lustre: Received respose from the server \n"); - + } else { + CWARN("Received respose from the server \n"); + } pingcli_shutdown (nih, 2); diff --git a/lnet/tests/sping_srv.c b/lnet/tests/sping_srv.c index d840ddd928..f2382d1066 100644 --- a/lnet/tests/sping_srv.c +++ b/lnet/tests/sping_srv.c @@ -123,7 +123,7 @@ int pingsrv_thread(void *arg) server->mdout.threshold = 1; server->mdout.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; server->mdout.user_ptr = NULL; - server->mdout.eventq = PTL_EQ_NONE; + server->mdout.eq_handle = PTL_EQ_NONE; /* Bind the outgoing buffer */ if ((rc = PtlMDBind (server->ni, server->mdout, @@ -139,7 +139,7 @@ int pingsrv_thread(void *arg) server->mdin.threshold = 1; server->mdin.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; server->mdin.user_ptr = NULL; - server->mdin.eventq = server->eq; + server->mdin.eq_handle = server->eq; if ((rc = PtlMDAttach (server->me, server->mdin, PTL_UNLINK, &server->mdin_h))) { @@ -174,10 +174,10 @@ static void pingsrv_callback(ptl_event_t *ev) } server->evnt = *ev; - printk ("Lustre: received ping from nid "LPX64" " - "(off=%u rlen=%u mlen=%u head=%x)\n", - ev->initiator.nid, ev->offset, ev->rlength, ev->mlength, - *((int *)(ev->mem_desc.start + ev->offset))); + CWARN("Lustre: received ping from nid "LPX64" " + "(off=%u rlen=%u mlen=%u head=%x)\n", + ev->initiator.nid, ev->offset, ev->rlength, ev->mlength, + *((int *)(ev->md.start + ev->offset))); packets_valid++; @@ -235,7 +235,7 @@ static struct pingsrv_data *pingsrv_setup(void) server->mdin.threshold = 1; server->mdin.options = PTL_MD_EVENT_START_DISABLE | PTL_MD_OP_PUT; server->mdin.user_ptr = NULL; - server->mdin.eventq = server->eq; + server->mdin.eq_handle = server->eq; memset (server->in_buf, 0, STDSIZE); if ((rc = PtlMDAttach (server->me, server->mdin, diff --git a/lnet/ulnds/Makefile.am b/lnet/ulnds/Makefile.am index 1681250fca..3437d3922f 100644 --- a/lnet/ulnds/Makefile.am +++ b/lnet/ulnds/Makefile.am @@ -1,10 +1,10 @@ if LIBLUSTRE +if !CRAY_PORTALS noinst_LIBRARIES = libtcpnal.a endif +endif -if !CRAY_PORTALS -pkginclude_HEADERS = pqtimer.h dispatch.h table.h timer.h connection.h ipmap.h bridge.h procbridge.h +noinst_HEADERS = pqtimer.h dispatch.h table.h timer.h connection.h ipmap.h bridge.h procbridge.h libtcpnal_a_SOURCES = debug.c pqtimer.c select.c table.c pqtimer.h dispatch.h table.h timer.h address.c procapi.c proclib.c connection.c tcpnal.c connection.h libtcpnal_a_CPPFLAGS = $(LLCPPFLAGS) libtcpnal_a_CFLAGS = $(LLCFLAGS) -endif \ No newline at end of file diff --git a/lnet/ulnds/connection.c b/lnet/ulnds/connection.c index 3448460cfa..ed8dc08758 100644 --- a/lnet/ulnds/connection.c +++ b/lnet/ulnds/connection.c @@ -201,35 +201,30 @@ static int new_connection(void *z) return(1); } -/* FIXME assuming little endian, cleanup!! */ -#define __cpu_to_le64(x) ((__u64)(x)) -#define __le64_to_cpu(x) ((__u64)(x)) -#define __cpu_to_le32(x) ((__u32)(x)) -#define __le32_to_cpu(x) ((__u32)(x)) -#define __cpu_to_le16(x) ((__u16)(x)) -#define __le16_to_cpu(x) ((__u16)(x)) - extern ptl_nid_t tcpnal_mynid; int tcpnal_hello (int sockfd, ptl_nid_t *nid, int type, __u64 incarnation) { int rc; + int nob; ptl_hdr_t hdr; ptl_magicversion_t *hmv = (ptl_magicversion_t *)&hdr.dest_nid; LASSERT (sizeof (*hmv) == sizeof (hdr.dest_nid)); memset (&hdr, 0, sizeof (hdr)); - hmv->magic = __cpu_to_le32 (PORTALS_PROTO_MAGIC); - hmv->version_major = __cpu_to_le32 (PORTALS_PROTO_VERSION_MAJOR); - hmv->version_minor = __cpu_to_le32 (PORTALS_PROTO_VERSION_MINOR); + hmv->magic = cpu_to_le32(PORTALS_PROTO_MAGIC); + hmv->version_major = cpu_to_le32(PORTALS_PROTO_VERSION_MAJOR); + hmv->version_minor = cpu_to_le32(PORTALS_PROTO_VERSION_MINOR); - hdr.src_nid = __cpu_to_le64 (tcpnal_mynid); - hdr.type = __cpu_to_le32 (PTL_MSG_HELLO); + hdr.src_nid = cpu_to_le64(tcpnal_mynid); + hdr.type = cpu_to_le32(PTL_MSG_HELLO); + + hdr.msg.hello.type = cpu_to_le32(type); + hdr.msg.hello.incarnation = cpu_to_le64(incarnation); - hdr.msg.hello.type = __cpu_to_le32 (type); - hdr.msg.hello.incarnation = __cpu_to_le64(incarnation); + /* I don't send any interface info */ /* Assume sufficient socket buffering for this message */ rc = syscall(SYS_write, sockfd, &hdr, sizeof(hdr)); @@ -244,28 +239,28 @@ tcpnal_hello (int sockfd, ptl_nid_t *nid, int type, __u64 incarnation) return (rc); } - if (hmv->magic != __le32_to_cpu (PORTALS_PROTO_MAGIC)) { + if (hmv->magic != le32_to_cpu(PORTALS_PROTO_MAGIC)) { CERROR ("Bad magic %#08x (%#08x expected) from "LPX64"\n", - __cpu_to_le32 (hmv->magic), PORTALS_PROTO_MAGIC, *nid); + cpu_to_le32(hmv->magic), PORTALS_PROTO_MAGIC, *nid); return (-EPROTO); } - if (hmv->version_major != __cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR) || - hmv->version_minor != __cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR)) { + if (hmv->version_major != cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR) || + hmv->version_minor != cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR)) { CERROR ("Incompatible protocol version %d.%d (%d.%d expected)" " from "LPX64"\n", - __le16_to_cpu (hmv->version_major), - __le16_to_cpu (hmv->version_minor), + le16_to_cpu (hmv->version_major), + le16_to_cpu (hmv->version_minor), PORTALS_PROTO_VERSION_MAJOR, PORTALS_PROTO_VERSION_MINOR, *nid); return (-EPROTO); } -#if (PORTALS_PROTO_VERSION_MAJOR != 0) -# error "This code only understands protocol version 0.x" +#if (PORTALS_PROTO_VERSION_MAJOR != 1) +# error "This code only understands protocol version 1.x" #endif - /* version 0 sends magic/version as the dest_nid of a 'hello' header, + /* version 1 sends magic/version as the dest_nid of a 'hello' header, * so read the rest of it in now... */ rc = syscall(SYS_read, sockfd, hmv + 1, sizeof(hdr) - sizeof(*hmv)); @@ -276,27 +271,49 @@ tcpnal_hello (int sockfd, ptl_nid_t *nid, int type, __u64 incarnation) } /* ...and check we got what we expected */ - if (hdr.type != __cpu_to_le32 (PTL_MSG_HELLO) || - hdr.payload_length != __cpu_to_le32 (0)) { - CERROR ("Expecting a HELLO hdr with 0 payload," + if (hdr.type != cpu_to_le32 (PTL_MSG_HELLO)) { + CERROR ("Expecting a HELLO hdr " " but got type %d with %d payload from "LPX64"\n", - __le32_to_cpu (hdr.type), - __le32_to_cpu (hdr.payload_length), *nid); + le32_to_cpu (hdr.type), + le32_to_cpu (hdr.payload_length), *nid); return (-EPROTO); } - if (__le64_to_cpu(hdr.src_nid) == PTL_NID_ANY) { + if (le64_to_cpu(hdr.src_nid) == PTL_NID_ANY) { CERROR("Expecting a HELLO hdr with a NID, but got PTL_NID_ANY\n"); return (-EPROTO); } if (*nid == PTL_NID_ANY) { /* don't know peer's nid yet */ - *nid = __le64_to_cpu(hdr.src_nid); - } else if (*nid != __le64_to_cpu (hdr.src_nid)) { + *nid = le64_to_cpu(hdr.src_nid); + } else if (*nid != le64_to_cpu (hdr.src_nid)) { CERROR ("Connected to nid "LPX64", but expecting "LPX64"\n", - __le64_to_cpu (hdr.src_nid), *nid); + le64_to_cpu (hdr.src_nid), *nid); + return (-EPROTO); + } + + /* Ignore any interface info in the payload */ + nob = le32_to_cpu(hdr.payload_length); + if (nob > getpagesize()) { + CERROR("Unexpected HELLO payload %d from "LPX64"\n", + nob, *nid); return (-EPROTO); } + if (nob > 0) { + char *space = (char *)malloc(nob); + + if (space == NULL) { + CERROR("Can't allocate scratch buffer %d\n", nob); + return (-ENOMEM); + } + + rc = syscall(SYS_read, sockfd, space, nob); + if (rc <= 0) { + CERROR("Error %d skipping HELLO payload from " + LPX64"\n", rc, *nid); + return (rc); + } + } return (0); } diff --git a/lnet/ulnds/socklnd/Makefile.am b/lnet/ulnds/socklnd/Makefile.am index 1681250fca..3437d3922f 100644 --- a/lnet/ulnds/socklnd/Makefile.am +++ b/lnet/ulnds/socklnd/Makefile.am @@ -1,10 +1,10 @@ if LIBLUSTRE +if !CRAY_PORTALS noinst_LIBRARIES = libtcpnal.a endif +endif -if !CRAY_PORTALS -pkginclude_HEADERS = pqtimer.h dispatch.h table.h timer.h connection.h ipmap.h bridge.h procbridge.h +noinst_HEADERS = pqtimer.h dispatch.h table.h timer.h connection.h ipmap.h bridge.h procbridge.h libtcpnal_a_SOURCES = debug.c pqtimer.c select.c table.c pqtimer.h dispatch.h table.h timer.h address.c procapi.c proclib.c connection.c tcpnal.c connection.h libtcpnal_a_CPPFLAGS = $(LLCPPFLAGS) libtcpnal_a_CFLAGS = $(LLCFLAGS) -endif \ No newline at end of file diff --git a/lnet/ulnds/socklnd/connection.c b/lnet/ulnds/socklnd/connection.c index 3448460cfa..ed8dc08758 100644 --- a/lnet/ulnds/socklnd/connection.c +++ b/lnet/ulnds/socklnd/connection.c @@ -201,35 +201,30 @@ static int new_connection(void *z) return(1); } -/* FIXME assuming little endian, cleanup!! */ -#define __cpu_to_le64(x) ((__u64)(x)) -#define __le64_to_cpu(x) ((__u64)(x)) -#define __cpu_to_le32(x) ((__u32)(x)) -#define __le32_to_cpu(x) ((__u32)(x)) -#define __cpu_to_le16(x) ((__u16)(x)) -#define __le16_to_cpu(x) ((__u16)(x)) - extern ptl_nid_t tcpnal_mynid; int tcpnal_hello (int sockfd, ptl_nid_t *nid, int type, __u64 incarnation) { int rc; + int nob; ptl_hdr_t hdr; ptl_magicversion_t *hmv = (ptl_magicversion_t *)&hdr.dest_nid; LASSERT (sizeof (*hmv) == sizeof (hdr.dest_nid)); memset (&hdr, 0, sizeof (hdr)); - hmv->magic = __cpu_to_le32 (PORTALS_PROTO_MAGIC); - hmv->version_major = __cpu_to_le32 (PORTALS_PROTO_VERSION_MAJOR); - hmv->version_minor = __cpu_to_le32 (PORTALS_PROTO_VERSION_MINOR); + hmv->magic = cpu_to_le32(PORTALS_PROTO_MAGIC); + hmv->version_major = cpu_to_le32(PORTALS_PROTO_VERSION_MAJOR); + hmv->version_minor = cpu_to_le32(PORTALS_PROTO_VERSION_MINOR); - hdr.src_nid = __cpu_to_le64 (tcpnal_mynid); - hdr.type = __cpu_to_le32 (PTL_MSG_HELLO); + hdr.src_nid = cpu_to_le64(tcpnal_mynid); + hdr.type = cpu_to_le32(PTL_MSG_HELLO); + + hdr.msg.hello.type = cpu_to_le32(type); + hdr.msg.hello.incarnation = cpu_to_le64(incarnation); - hdr.msg.hello.type = __cpu_to_le32 (type); - hdr.msg.hello.incarnation = __cpu_to_le64(incarnation); + /* I don't send any interface info */ /* Assume sufficient socket buffering for this message */ rc = syscall(SYS_write, sockfd, &hdr, sizeof(hdr)); @@ -244,28 +239,28 @@ tcpnal_hello (int sockfd, ptl_nid_t *nid, int type, __u64 incarnation) return (rc); } - if (hmv->magic != __le32_to_cpu (PORTALS_PROTO_MAGIC)) { + if (hmv->magic != le32_to_cpu(PORTALS_PROTO_MAGIC)) { CERROR ("Bad magic %#08x (%#08x expected) from "LPX64"\n", - __cpu_to_le32 (hmv->magic), PORTALS_PROTO_MAGIC, *nid); + cpu_to_le32(hmv->magic), PORTALS_PROTO_MAGIC, *nid); return (-EPROTO); } - if (hmv->version_major != __cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR) || - hmv->version_minor != __cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR)) { + if (hmv->version_major != cpu_to_le16 (PORTALS_PROTO_VERSION_MAJOR) || + hmv->version_minor != cpu_to_le16 (PORTALS_PROTO_VERSION_MINOR)) { CERROR ("Incompatible protocol version %d.%d (%d.%d expected)" " from "LPX64"\n", - __le16_to_cpu (hmv->version_major), - __le16_to_cpu (hmv->version_minor), + le16_to_cpu (hmv->version_major), + le16_to_cpu (hmv->version_minor), PORTALS_PROTO_VERSION_MAJOR, PORTALS_PROTO_VERSION_MINOR, *nid); return (-EPROTO); } -#if (PORTALS_PROTO_VERSION_MAJOR != 0) -# error "This code only understands protocol version 0.x" +#if (PORTALS_PROTO_VERSION_MAJOR != 1) +# error "This code only understands protocol version 1.x" #endif - /* version 0 sends magic/version as the dest_nid of a 'hello' header, + /* version 1 sends magic/version as the dest_nid of a 'hello' header, * so read the rest of it in now... */ rc = syscall(SYS_read, sockfd, hmv + 1, sizeof(hdr) - sizeof(*hmv)); @@ -276,27 +271,49 @@ tcpnal_hello (int sockfd, ptl_nid_t *nid, int type, __u64 incarnation) } /* ...and check we got what we expected */ - if (hdr.type != __cpu_to_le32 (PTL_MSG_HELLO) || - hdr.payload_length != __cpu_to_le32 (0)) { - CERROR ("Expecting a HELLO hdr with 0 payload," + if (hdr.type != cpu_to_le32 (PTL_MSG_HELLO)) { + CERROR ("Expecting a HELLO hdr " " but got type %d with %d payload from "LPX64"\n", - __le32_to_cpu (hdr.type), - __le32_to_cpu (hdr.payload_length), *nid); + le32_to_cpu (hdr.type), + le32_to_cpu (hdr.payload_length), *nid); return (-EPROTO); } - if (__le64_to_cpu(hdr.src_nid) == PTL_NID_ANY) { + if (le64_to_cpu(hdr.src_nid) == PTL_NID_ANY) { CERROR("Expecting a HELLO hdr with a NID, but got PTL_NID_ANY\n"); return (-EPROTO); } if (*nid == PTL_NID_ANY) { /* don't know peer's nid yet */ - *nid = __le64_to_cpu(hdr.src_nid); - } else if (*nid != __le64_to_cpu (hdr.src_nid)) { + *nid = le64_to_cpu(hdr.src_nid); + } else if (*nid != le64_to_cpu (hdr.src_nid)) { CERROR ("Connected to nid "LPX64", but expecting "LPX64"\n", - __le64_to_cpu (hdr.src_nid), *nid); + le64_to_cpu (hdr.src_nid), *nid); + return (-EPROTO); + } + + /* Ignore any interface info in the payload */ + nob = le32_to_cpu(hdr.payload_length); + if (nob > getpagesize()) { + CERROR("Unexpected HELLO payload %d from "LPX64"\n", + nob, *nid); return (-EPROTO); } + if (nob > 0) { + char *space = (char *)malloc(nob); + + if (space == NULL) { + CERROR("Can't allocate scratch buffer %d\n", nob); + return (-ENOMEM); + } + + rc = syscall(SYS_read, sockfd, space, nob); + if (rc <= 0) { + CERROR("Error %d skipping HELLO payload from " + LPX64"\n", rc, *nid); + return (rc); + } + } return (0); } diff --git a/lnet/utils/Makefile.am b/lnet/utils/Makefile.am index a14df1c27c..1d9f9050a9 100644 --- a/lnet/utils/Makefile.am +++ b/lnet/utils/Makefile.am @@ -9,10 +9,11 @@ if LIBLUSTRE noinst_LIBRARIES = libuptlctl.a +endif + libuptlctl_a_SOURCES = portals.c debug.c l_ioctl.c libuptlctl_a_CPPFLAGS = $(LLCPPFLAGS) libuptlctl_a_CFLAGS = $(LLCFLAGS) -endif sbin_PROGRAMS = debugctl @@ -20,10 +21,14 @@ lib_LIBRARIES = libptlctl.a libptlctl_a_SOURCES = portals.c debug.c l_ioctl.c parser.c parser.h +if UTILS if !CRAY_PORTALS sbin_PROGRAMS += acceptor ptlctl routerstat wirecheck gmnalnid +endif +endif acceptor_SOURCES = acceptor.c +acceptor_LDADD = $(LIBWRAP) wirecheck_SOURCES = wirecheck.c @@ -34,7 +39,6 @@ ptlctl_LDADD = -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE) ptlctl_DEPENDENCIES = libptlctl.a routerstat_SOURCES = routerstat.c -endif debugctl_SOURCES = debugctl.c debugctl_LDADD = -L. -lptlctl $(LIBREADLINE) $(LIBEFENCE) diff --git a/lnet/utils/acceptor.c b/lnet/utils/acceptor.c index f6367d499f..8aea457083 100644 --- a/lnet/utils/acceptor.c +++ b/lnet/utils/acceptor.c @@ -13,6 +13,11 @@ #include <unistd.h> #include <syslog.h> #include <errno.h> +#ifdef HAVE_LIBWRAP +#include <arpa/inet.h> +#include <netinet/in.h> +#include <tcpd.h> +#endif #include <portals/api-support.h> #include <portals/list.h> @@ -26,6 +31,12 @@ #define PROGNAME "acceptor" +#ifdef HAVE_LIBWRAP +/* needed because libwrap declares these as externs */ +int allow_severity = LOG_INFO; +int deny_severity = LOG_WARNING; +#endif + void create_pidfile(char *name, int port) { char pidfile[1024]; @@ -58,83 +69,27 @@ int pidfile_exists(char *name, int port) return (0); } -int -parse_size (int *sizep, char *str) -{ - int size; - char mod[32]; - - switch (sscanf (str, "%d%1[gGmMkK]", &size, mod)) - { - default: - return (-1); - - case 1: - *sizep = size; - return (0); - - case 2: - switch (*mod) - { - case 'g': - case 'G': - *sizep = size << 30; - return (0); - - case 'm': - case 'M': - *sizep = size << 20; - return (0); - - case 'k': - case 'K': - *sizep = size << 10; - return (0); - - default: - *sizep = size; - return (0); - } - } -} - void show_connection (int fd, __u32 net_ip) { struct hostent *h = gethostbyaddr ((char *)&net_ip, sizeof net_ip, AF_INET); __u32 host_ip = ntohl (net_ip); - int rxmem = 0; - int txmem = 0; - int nonagle = 0; int len; char host[1024]; - len = sizeof (txmem); - if (getsockopt (fd, SOL_SOCKET, SO_SNDBUF, &txmem, &len) != 0) - perror ("Cannot get write buffer size"); - - len = sizeof (rxmem); - if (getsockopt (fd, SOL_SOCKET, SO_RCVBUF, &rxmem, &len) != 0) - perror ("Cannot get read buffer size"); - - len = sizeof (nonagle); - if (getsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &nonagle, &len) != 0) - perror ("Cannot get nagle"); - if (h == NULL) snprintf (host, sizeof(host), "%d.%d.%d.%d", (host_ip >> 24) & 0xff, (host_ip >> 16) & 0xff, (host_ip >> 8) & 0xff, host_ip & 0xff); else snprintf (host, sizeof(host), "%s", h->h_name); - syslog (LOG_INFO, "Accepted host: %s snd: %d rcv %d nagle: %s\n", - host, txmem, rxmem, nonagle ? "disabled" : "enabled"); + syslog (LOG_INFO, "Accepted host: %s\n", host); } void usage (char *myname) { - fprintf (stderr, "Usage: %s [-r recv_mem] [-s send_mem] [-n] [-N nal_id] port\n", myname); + fprintf (stderr, "Usage: %s [-N nal_id] port\n", myname); exit (1); } @@ -143,40 +98,18 @@ int main(int argc, char **argv) int o, fd, rc, port, pfd; struct sockaddr_in srvaddr; int c; - int rxmem = 0; - int txmem = 0; int noclose = 0; - int nonagle = 1; int nal = SOCKNAL; - int bind_irq = 0; - while ((c = getopt (argc, argv, "N:r:s:nli")) != -1) + while ((c = getopt (argc, argv, "N:l")) != -1) switch (c) { - case 'r': - if (parse_size (&rxmem, optarg) != 0 || rxmem < 0) - usage (argv[0]); - break; - - case 's': - if (parse_size (&txmem, optarg) != 0 || txmem < 0) - usage (argv[0]); - break; - - case 'n': - nonagle = 0; - break; - case 'l': noclose = 1; break; - case 'i': - bind_irq = 1; - break; - case 'N': - if (parse_size(&nal, optarg) != 0 || + if (sscanf(optarg, "%d", &nal) != 1 || nal < 0 || nal > NAL_MAX_NR) usage(argv[0]); break; @@ -211,37 +144,6 @@ int main(int argc, char **argv) exit(1); } - if (nonagle) - { - o = 1; - rc = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &o, sizeof (o)); - if (rc != 0) - { - perror ("Cannot disable nagle"); - exit (1); - } - } - - if (txmem != 0) - { - rc = setsockopt (fd, SOL_SOCKET, SO_SNDBUF, &txmem, sizeof (txmem)); - if (rc != 0) - { - perror ("Cannot set write buffer size"); - exit (1); - } - } - - if (rxmem != 0) - { - rc = setsockopt (fd, SOL_SOCKET, SO_RCVBUF, &rxmem, sizeof (rxmem)); - if (rc != 0) - { - perror ("Cannot set read buffer size"); - exit (1); - } - } - rc = bind(fd, (struct sockaddr *)&srvaddr, sizeof(srvaddr)); if ( rc == -1 ) { perror("bind: "); @@ -276,7 +178,11 @@ int main(int argc, char **argv) int cfd; struct portal_ioctl_data data; struct portals_cfg pcfg; - +#ifdef HAVE_LIBWRAP + struct request_info request; + char addrstr[INET_ADDRSTRLEN]; +#endif + cfd = accept(fd, (struct sockaddr *)&clntaddr, &len); if ( cfd < 0 ) { perror("accept"); @@ -284,12 +190,24 @@ int main(int argc, char **argv) continue; } +#ifdef HAVE_LIBWRAP + /* libwrap access control */ + request_init(&request, RQ_DAEMON, "lustre", RQ_FILE, cfd, 0); + sock_host(&request); + if (!hosts_access(&request)) { + inet_ntop(AF_INET, &clntaddr.sin_addr, + addrstr, INET_ADDRSTRLEN); + syslog(LOG_WARNING, "Unauthorized access from %s:%hd\n", + addrstr, ntohs(clntaddr.sin_port)); + close (cfd); + continue; + } +#endif show_connection (cfd, clntaddr.sin_addr.s_addr); PCFG_INIT(pcfg, NAL_CMD_REGISTER_PEER_FD); pcfg.pcfg_nal = nal; pcfg.pcfg_fd = cfd; - pcfg.pcfg_flags = bind_irq; pcfg.pcfg_misc = SOCKNAL_CONN_NONE; /* == incoming connection */ PORTAL_IOC_INIT(data); diff --git a/lnet/utils/debug.c b/lnet/utils/debug.c index 9ce7528887..36d8a04398 100644 --- a/lnet/utils/debug.c +++ b/lnet/utils/debug.c @@ -24,6 +24,9 @@ */ #define __USE_FILE_OFFSET64 +#define _GNU_SOURCE + +#include <portals/list.h> #include <stdio.h> #include <netdb.h> @@ -32,7 +35,6 @@ #include <fcntl.h> #include <errno.h> #include <unistd.h> -#include <time.h> #ifndef __CYGWIN__ # include <syscall.h> #endif @@ -49,11 +51,14 @@ #define BUG() /* workaround for module.h includes */ #include <linux/module.h> #endif +#include <sys/utsname.h> #include <portals/api-support.h> #include <portals/ptlctl.h> #include "parser.h" +#include <time.h> + static char rawbuf[8192]; static char *buf = rawbuf; static int max = 8192; @@ -65,14 +70,14 @@ static int debug_mask = ~0; static const char *portal_debug_subsystems[] = {"undefined", "mdc", "mds", "osc", "ost", "class", "log", "llite", - "rpc", "mgmt", "portals", "libcfs", "socknal", "qswnal", "pinger", - "filter", "ptlbd", "echo", "ldlm", "lov", "gmnal", "router", "cobd", - "ibnal", "lmv", "smfs", "cmobd", NULL}; + "rpc", "mgmt", "portals", "libcfs", "socknal", "qswnal", "pinger", + "filter", "ptlbd", "echo", "ldlm", "lov", "gmnal", "router", "cobd", + "openibnal", "lmv", "smfs", "cmobd", NULL}; static const char *portal_debug_masks[] = {"trace", "inode", "super", "ext2", "malloc", "cache", "info", "ioctl", "blocks", "net", "warning", "buffs", "other", "dentry", "portals", "page", "dlmtrace", "error", "emerg", "ha", "rpctrace", "vfstrace", - "reada", "config", NULL}; + "reada", "mmap", NULL}; struct debug_daemon_cmd { char *cmd; @@ -82,8 +87,6 @@ struct debug_daemon_cmd { static const struct debug_daemon_cmd portal_debug_daemon_cmd[] = { {"start", DEBUG_DAEMON_START}, {"stop", DEBUG_DAEMON_STOP}, - {"pause", DEBUG_DAEMON_PAUSE}, - {"continue", DEBUG_DAEMON_CONTINUE}, {0, 0} }; @@ -227,229 +230,293 @@ int jt_dbg_list(int argc, char **argv) return 0; } -/* if 'raw' is true, don't strip the debug information from the front of the - * lines */ -static void dump_buffer(FILE *fd, char *buf, int size, int raw) +/* all strings nul-terminated; only the struct and hdr need to be freed */ +struct dbg_line { + struct ptldebug_header *hdr; + char *file; + char *fn; + char *text; + struct list_head chain; +}; + +/* nurr. */ +static void list_add_ordered(struct dbg_line *new, struct list_head *head) +{ + struct list_head *pos; + struct dbg_line *curr; + + list_for_each(pos, head) { + curr = list_entry(pos, struct dbg_line, chain); + + if (curr->hdr->ph_sec < new->hdr->ph_sec) + continue; + if (curr->hdr->ph_sec == new->hdr->ph_sec && + curr->hdr->ph_usec < new->hdr->ph_usec) + continue; + + list_add(&new->chain, pos->prev); + return; + } + list_add_tail(&new->chain, head); +} + +static void print_saved_records(struct list_head *list, FILE *out) +{ + struct list_head *pos, *tmp; + + list_for_each_safe(pos, tmp, list) { + struct dbg_line *line; + struct ptldebug_header *hdr; + + line = list_entry(pos, struct dbg_line, chain); + list_del(&line->chain); + + hdr = line->hdr; + fprintf(out, "%06x:%06x:%u:%u.%06Lu:%u:%u:%u:(%s:%u:%s()) %s", + hdr->ph_subsys, hdr->ph_mask, hdr->ph_cpu_id, + hdr->ph_sec, (unsigned long long)hdr->ph_usec, + hdr->ph_stack, hdr->ph_pid, hdr->ph_extern_pid, + line->file, hdr->ph_line_num, line->fn, line->text); + free(line->hdr); + free(line); + } +} + +static int parse_buffer(FILE *in, FILE *out) { - char *p, *z; - unsigned long subsystem, debug, dropped = 0, kept = 0; + struct dbg_line *line; + struct ptldebug_header *hdr; + char buf[4097], *p; + int rc; + unsigned long dropped = 0, kept = 0; + struct list_head chunk_list; + + INIT_LIST_HEAD(&chunk_list); - while (size) { - p = memchr(buf, '\n', size); - if (!p) + while (1) { + rc = fread(buf, sizeof(hdr->ph_len), 1, in); + if (rc <= 0) break; - subsystem = strtoul(buf, &z, 16); - debug = strtoul(z + 1, &z, 16); - - z++; - /* for some reason %*s isn't working. */ - *p = '\0'; - if ((subsystem_mask & subsystem) && - (!debug || (debug_mask & debug))) { - if (raw) - fprintf(fd, "%s\n", buf); - else - fprintf(fd, "%s\n", z); - //printf("%s\n", buf); - kept++; - } else { - //fprintf(stderr, "dropping line (%lx:%lx): %s\n", subsystem, debug, buf); + + hdr = (void *)buf; + if (hdr->ph_len == 0) + break; + if (hdr->ph_len > 4094) { + fprintf(stderr, "unexpected large record: %d bytes. " + "aborting.\n", + hdr->ph_len); + break; + } + + if (hdr->ph_flags & PH_FLAG_FIRST_RECORD) { + print_saved_records(&chunk_list, out); + assert(list_empty(&chunk_list)); + } + + rc = fread(buf + sizeof(hdr->ph_len), 1, + hdr->ph_len - sizeof(hdr->ph_len), in); + if (rc <= 0) + break; + + if (hdr->ph_mask && + (!(subsystem_mask & hdr->ph_subsys) || + (!(debug_mask & hdr->ph_mask)))) { dropped++; + continue; } - *p = '\n'; - p++; - size -= (p - buf); - buf = p; + + line = malloc(sizeof(*line)); + if (line == NULL) { + fprintf(stderr, "malloc failed; printing accumulated " + "records and exiting.\n"); + break; + } + + line->hdr = malloc(hdr->ph_len + 1); + if (line->hdr == NULL) { + fprintf(stderr, "malloc failed; printing accumulated " + "records and exiting.\n"); + break; + } + + p = (void *)line->hdr; + memcpy(line->hdr, buf, hdr->ph_len); + p[hdr->ph_len] = '\0'; + + p += sizeof(*hdr); + line->file = p; + p += strlen(line->file) + 1; + line->fn = p; + p += strlen(line->fn) + 1; + line->text = p; + + list_add_ordered(line, &chunk_list); + kept++; } + print_saved_records(&chunk_list, out); + printf("Debug log: %lu lines, %lu kept, %lu dropped.\n", dropped + kept, kept, dropped); + return 0; } int jt_dbg_debug_kernel(int argc, char **argv) { - int rc, raw = 1; - FILE *fd = stdout; - const int databuf_size = (6 << 20); - struct portal_ioctl_data data, *newdata; - char *databuf = NULL; + char filename[4096]; + int rc, raw = 0, fd; + FILE *in, *out = stdout; if (argc > 3) { fprintf(stderr, "usage: %s [file] [raw]\n", argv[0]); return 0; } + sprintf(filename, "%s.%lu.%u", argc > 1 ? argv[1] : "/tmp/lustre-log", + time(NULL), getpid()); - if (argc > 1) { - fd = fopen(argv[1], "w"); - if (fd == NULL) { - fprintf(stderr, "fopen(%s) failed: %s\n", argv[1], - strerror(errno)); - return -1; - } - } if (argc > 2) raw = atoi(argv[2]); + unlink(filename); - databuf = malloc(databuf_size); - if (!databuf) { - fprintf(stderr, "No memory for buffer.\n"); - goto out; - } - - memset(&data, 0, sizeof(data)); - data.ioc_plen1 = databuf_size; - data.ioc_pbuf1 = databuf; - - if (portal_ioctl_pack(&data, &buf, max) != 0) { - fprintf(stderr, "portal_ioctl_pack failed.\n"); - goto out; + fd = open("/proc/sys/portals/dump_kernel", O_WRONLY); + if (fd < 0) { + fprintf(stderr, "open(dump_kernel) failed: %s\n", + strerror(errno)); + return 1; } - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_GET_DEBUG, buf); - if (rc) { - fprintf(stderr, "IOC_PORTAL_GET_DEBUG failed: %s\n", + rc = write(fd, filename, strlen(filename)); + if (rc != strlen(filename)) { + fprintf(stderr, "write(%s) failed: %s\n", filename, strerror(errno)); - goto out; + close(fd); + return 1; } + close(fd); - newdata = (struct portal_ioctl_data *)buf; - if (newdata->ioc_size > 0) - dump_buffer(fd, databuf, newdata->ioc_size, raw); - - out: - if (databuf) - free(databuf); - if (fd != stdout) - fclose(fd); - return 0; -} - -int jt_dbg_debug_daemon(int argc, char **argv) -{ - int i, rc; - unsigned int cmd = 0; - FILE *fd = stdout; - struct portal_ioctl_data data; - - if (argc <= 1) { - fprintf(stderr, "usage: %s [start file <#MB>|stop|pause|" - "continue]\n", argv[0]); - return 0; - } - for (i = 0; portal_debug_daemon_cmd[i].cmd != NULL; i++) { - if (strcasecmp(argv[1], portal_debug_daemon_cmd[i].cmd) == 0) { - cmd = portal_debug_daemon_cmd[i].cmdv; - break; - } - } - if (portal_debug_daemon_cmd[i].cmd == NULL) { - fprintf(stderr, "usage: %s [start file <#MB>|stop|pause|" - "continue]\n", argv[0]); + if (raw) return 0; - } - memset(&data, 0, sizeof(data)); - if (cmd == DEBUG_DAEMON_START) { - if (argc < 3) { - fprintf(stderr, "usage: %s [start file <#MB>|stop|" - "pause|continue]\n", argv[0]); - return 0; - } - if (access(argv[2], F_OK) != 0) { - fd = fopen(argv[2], "w"); - if (fd != NULL) { - fclose(fd); - remove(argv[2]); - goto ok; - } - } - if (access(argv[2], W_OK) == 0) - goto ok; - fprintf(stderr, "fopen(%s) failed: %s\n", argv[2], + + in = fopen(filename, "r"); + if (in == NULL) { + fprintf(stderr, "fopen(%s) failed: %s\n", filename, strerror(errno)); - return -1; -ok: - data.ioc_inllen1 = strlen(argv[2]) + 1; - data.ioc_inlbuf1 = argv[2]; - data.ioc_misc = 0; - if (argc == 4) { - unsigned long size; - errno = 0; - size = strtoul(argv[3], NULL, 0); - if (errno) { - fprintf(stderr, "file size(%s): error %s\n", - argv[3], strerror(errno)); - return -1; - } - data.ioc_misc = size; - } + return 1; } - data.ioc_count = cmd; - if (portal_ioctl_pack(&data, &buf, max) != 0) { - fprintf(stderr, "portal_ioctl_pack failed.\n"); - return -1; + if (argc > 1) { + out = fopen(argv[1], "w"); + if (out == NULL) { + fprintf(stderr, "fopen(%s) failed: %s\n", argv[1], + strerror(errno)); + fclose(in); + return 1; + } } - rc = l_ioctl(PORTALS_DEV_ID, IOC_PORTAL_SET_DAEMON, buf); - if (rc < 0) { - fprintf(stderr, "IOC_PORTAL_SET_DEMON failed: %s\n", + + rc = parse_buffer(in, out); + fclose(in); + if (argc > 1) + fclose(out); + if (rc) { + fprintf(stderr, "parse_buffer failed; leaving tmp file %s " + "behind.\n", filename); + } else { + rc = unlink(filename); + if (rc) + fprintf(stderr, "dumped successfully, but couldn't " + "unlink tmp file %s: %s\n", filename, strerror(errno)); - return rc; } - return 0; + return rc; } int jt_dbg_debug_file(int argc, char **argv) { - int rc, fd = -1, raw = 1; - FILE *output = stdout; - char *databuf = NULL; - struct stat statbuf; - - if (argc > 4 || argc < 2) { - fprintf(stderr, "usage: %s <input> [output] [raw]\n", argv[0]); + int fdin,fdout; + FILE *in, *out = stdout; + if (argc > 3 || argc < 2) { + fprintf(stderr, "usage: %s <input> [output]\n", argv[0]); return 0; } - fd = open(argv[1], O_RDONLY); - if (fd < 0) { - fprintf(stderr, "fopen(%s) failed: %s\n", argv[1], + fdin = open(argv[1], O_RDONLY | O_LARGEFILE); + if (fdin == -1) { + fprintf(stderr, "open(%s) failed: %s\n", argv[1], strerror(errno)); - return -1; + return 1; } - - rc = fstat(fd, &statbuf); - if (rc < 0) { - fprintf(stderr, "fstat failed: %s\n", strerror(errno)); - goto out; + in = fdopen(fdin, "r"); + if (in == NULL) { + fprintf(stderr, "fopen(%s) failed: %s\n", argv[1], + strerror(errno)); + close(fdin); + return 1; } - - if (argc >= 3) { - output = fopen(argv[2], "w"); - if (output == NULL) { + if (argc > 2) { + fdout = open(argv[2], O_CREAT | O_WRONLY | O_LARGEFILE); + if (fdout == -1) { + fprintf(stderr, "open(%s) failed: %s\n", argv[2], + strerror(errno)); + fclose(in); + return 1; + } + out = fdopen(fdout, "w"); + if (out == NULL) { fprintf(stderr, "fopen(%s) failed: %s\n", argv[2], strerror(errno)); - goto out; + fclose(in); + close(fdout); + return 1; } } - if (argc == 4) - raw = atoi(argv[3]); + return parse_buffer(in, out); +} - databuf = mmap(NULL, statbuf.st_size, PROT_READ | PROT_WRITE, - MAP_PRIVATE, fd, 0); - if (databuf == NULL) { - fprintf(stderr, "mmap failed: %s\n", strerror(errno)); - goto out; +const char debug_daemon_usage[]="usage: debug_daemon {start file [MB]|stop}\n"; +int jt_dbg_debug_daemon(int argc, char **argv) +{ + int rc, fd; + + if (argc <= 1) { + fprintf(stderr, debug_daemon_usage); + return 0; } - - dump_buffer(output, databuf, statbuf.st_size, raw); - - out: - if (databuf) - munmap(databuf, statbuf.st_size); - if (output != stdout) - fclose(output); - if (fd > 0) - close(fd); + + fd = open("/proc/sys/portals/daemon_file", O_WRONLY); + if (fd < 0) { + fprintf(stderr, "open(daemon_file) failed: %s\n", + strerror(errno)); + return 1; + } + + if (strcasecmp(argv[1], "start") == 0) { + if (argc != 3) { + fprintf(stderr, debug_daemon_usage); + return 1; + } + + rc = write(fd, argv[2], strlen(argv[2])); + if (rc != strlen(argv[2])) { + fprintf(stderr, "write(%s) failed: %s\n", argv[2], + strerror(errno)); + close(fd); + return 1; + } + } else if (strcasecmp(argv[1], "stop") == 0) { + rc = write(fd, "stop", 4); + if (rc != 4) { + fprintf(stderr, "write(stop) failed: %s\n", + strerror(errno)); + close(fd); + return 1; + } + } else { + fprintf(stderr, debug_daemon_usage); + return 1; + } + + close(fd); return 0; } @@ -532,6 +599,7 @@ static struct mod_paths { {"obdclass", "lustre/obdclass"}, {"llog_test", "lustre/obdclass"}, {"ptlrpc", "lustre/ptlrpc"}, + {"obdext2", "lustre/obdext2"}, {"ost", "lustre/ost"}, {"osc", "lustre/osc"}, {"mds", "lustre/mds"}, @@ -545,11 +613,13 @@ static struct mod_paths { {"lov", "lustre/lov"}, {"lmv", "lustre/lmv"}, {"fsfilt_ext3", "lustre/lvfs"}, - {"fsfilt_snap_ext3", "lustre/lvfs"}, {"fsfilt_extN", "lustre/lvfs"}, {"fsfilt_reiserfs", "lustre/lvfs"}, {"fsfilt_smfs", "lustre/lvfs"}, - {"fsfilt_snap_smfs", "lustre/lvfs"}, + {"fsfilt_ldiskfs", "lustre/lvfs"}, + {"mds_ext2", "lustre/mds"}, + {"mds_ext3", "lustre/mds"}, + {"mds_extN", "lustre/mds"}, {"ptlbd", "lustre/ptlbd"}, {"mgmt_svc", "lustre/mgmt"}, {"mgmt_cli", "lustre/mgmt"}, @@ -558,9 +628,9 @@ static struct mod_paths { {NULL, NULL} }; -#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) -int jt_dbg_modules(int argc, char **argv) +static int jt_dbg_modules_2_4(int argc, char **argv) { +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)) struct mod_paths *mp; char *path = ".."; char *kernel = "linux"; @@ -595,9 +665,12 @@ int jt_dbg_modules(int argc, char **argv) } return 0; +#else /* Headers are 2.6-only */ + return -EINVAL; +#endif } -#else -int jt_dbg_modules(int argc, char **argv) + +static int jt_dbg_modules_2_5(int argc, char **argv) { struct mod_paths *mp; char *path = ".."; @@ -637,7 +710,26 @@ int jt_dbg_modules(int argc, char **argv) return 0; } -#endif /* linux 2.5 */ + +int jt_dbg_modules(int argc, char **argv) +{ + int rc = 0; + struct utsname sysinfo; + + rc = uname(&sysinfo); + if (rc) { + printf("uname() failed: %s\n", strerror(errno)); + return 0; + } + + if (sysinfo.release[2] > '4') { + return jt_dbg_modules_2_5(argc, argv); + } else { + return jt_dbg_modules_2_4(argc, argv); + } + + return 0; +} int jt_dbg_panic(int argc, char **argv) { diff --git a/lnet/utils/debugctl.c b/lnet/utils/debugctl.c index 02cb9b4fec..1b6cd96f4f 100644 --- a/lnet/utils/debugctl.c +++ b/lnet/utils/debugctl.c @@ -32,7 +32,7 @@ command_t list[] = { {"debug_kernel", jt_dbg_debug_kernel, 0, "usage: debug_kernel [file] [raw], get debug buffer and print it [to a file]"}, - {"debug_daemon", jt_dbg_debug_daemon, 0, "usage: debug_daemon [start file [#MB]|stop|pause|continue], control debug daemon to dump debug buffer to a file"}, + {"debug_daemon", jt_dbg_debug_daemon, 0, "usage: debug_daemon [start file|stop], control debug daemon to dump debug buffer to a file"}, {"debug_file", jt_dbg_debug_file, 0, "usage: debug_file <input> [output] [raw], read debug buffer from input and print it [to output]"}, {"clear", jt_dbg_clear_debug_buf, 0, "clear kernel debug buffer"}, {"mark", jt_dbg_mark_debug_buf, 0, "insert a marker into the kernel debug buffer (args: [marker text])"}, diff --git a/lnet/utils/portals.c b/lnet/utils/portals.c index f8107d8068..1bde59f50d 100644 --- a/lnet/utils/portals.c +++ b/lnet/utils/portals.c @@ -40,15 +40,6 @@ #include <netinet/in.h> -#warning assuming little endian - -#define __cpu_to_le64(x) ((__u64)(x)) -#define __le64_to_cpu(x) ((__u64)(x)) -#define __cpu_to_le32(x) ((__u32)(x)) -#define __le32_to_cpu(x) ((__u32)(x)) -#define __cpu_to_le16(x) ((__u16)(x)) -#define __le16_to_cpu(x) ((__u16)(x)) - #endif /* __CYGWIN__ */ #include <portals/api-support.h> @@ -60,8 +51,6 @@ unsigned int portal_debug; unsigned int portal_printk; -unsigned int portal_stack; -unsigned int portal_cerror = 1; static unsigned int g_nal = 0; @@ -80,7 +69,7 @@ static name2num_t nalnames[] = { {"tcp", SOCKNAL}, {"elan", QSWNAL}, {"gm", GMNAL}, - {"ib", IBNAL}, + {"openib", OPENIBNAL}, {NULL, -1} }; @@ -285,20 +274,13 @@ ptl_parse_time (time_t *t, char *str) } int -ptl_parse_ipaddr (__u32 *ipaddrp, char *str) +ptl_parse_ipquad (__u32 *ipaddrp, char *str) { - struct hostent *he; int a; int b; int c; int d; - if (!strcmp (str, "_all_")) - { - *ipaddrp = 0; - return (0); - } - if (sscanf (str, "%d.%d.%d.%d", &a, &b, &c, &d) == 4 && (a & ~0xff) == 0 && (b & ~0xff) == 0 && (c & ~0xff) == 0 && (d & ~0xff) == 0) @@ -306,6 +288,23 @@ ptl_parse_ipaddr (__u32 *ipaddrp, char *str) *ipaddrp = (a<<24)|(b<<16)|(c<<8)|d; return (0); } + + return (-1); +} + +int +ptl_parse_ipaddr (__u32 *ipaddrp, char *str) +{ + struct hostent *he; + + if (!strcmp (str, "_all_")) + { + *ipaddrp = 0; + return (0); + } + + if (ptl_parse_ipquad(ipaddrp, str) == 0) + return (0); if ((('a' <= str[0] && str[0] <= 'z') || ('A' <= str[0] && str[0] <= 'Z')) && @@ -321,15 +320,19 @@ ptl_parse_ipaddr (__u32 *ipaddrp, char *str) } char * -ptl_ipaddr_2_str (__u32 ipaddr, char *str) +ptl_ipaddr_2_str (__u32 ipaddr, char *str, int lookup) { __u32 net_ip; struct hostent *he; - - net_ip = htonl (ipaddr); - he = gethostbyaddr (&net_ip, sizeof (net_ip), AF_INET); - if (he != NULL) - return (he->h_name); + + if (lookup) { + net_ip = htonl (ipaddr); + he = gethostbyaddr (&net_ip, sizeof (net_ip), AF_INET); + if (he != NULL) { + strcpy(str, he->h_name); + return (str); + } + } sprintf (str, "%d.%d.%d.%d", (ipaddr >> 24) & 0xff, (ipaddr >> 16) & 0xff, @@ -383,22 +386,22 @@ char * ptl_nid2str (char *buffer, ptl_nid_t nid) { __u64 nid64 = ptl_nid2u64(nid); - struct hostent *he; + struct hostent *he = 0; - if ((nid64 & ~((__u64)((__u32)-1))) != 0) { - /* top bits set */ - he = NULL; - } else { + /* Don't try to resolve NIDs that are e.g. Elan host IDs. Assume + * TCP addresses in the 0.x.x.x subnet are not in use. This can + * happen on routers and slows things down a _lot_. Bug 3442. */ + if (nid & 0xff000000) { __u32 addr = htonl((__u32)nid); /* back to NETWORK byte order */ he = gethostbyaddr ((const char *)&addr, sizeof (addr), AF_INET); } if (he != NULL) - strcpy (buffer, he->h_name); + sprintf(buffer, "%#x:%s", (int)(nid64 >> 32), he->h_name); else - sprintf (buffer, LPX64, nid64); - + sprintf(buffer, LPX64, nid64); + return (buffer); } @@ -521,11 +524,12 @@ int jt_ptl_network(int argc, char **argv) return (-1); } -int -jt_ptl_print_autoconnects (int argc, char **argv) + +int +jt_ptl_print_interfaces (int argc, char **argv) { - struct portals_cfg pcfg; - char buffer[64]; + struct portals_cfg pcfg; + char buffer[3][64]; int index; int rc; @@ -533,99 +537,184 @@ jt_ptl_print_autoconnects (int argc, char **argv) return -1; for (index = 0;;index++) { - PCFG_INIT (pcfg, NAL_CMD_GET_AUTOCONN); - pcfg.pcfg_count = index; + PCFG_INIT (pcfg, NAL_CMD_GET_INTERFACE); + pcfg.pcfg_count = index; rc = pcfg_ioctl (&pcfg); if (rc != 0) break; - printf (LPX64"@%s:%d #%d buffer %d " - "nonagle %s affinity %s eager %s share %d\n", - pcfg.pcfg_nid, ptl_ipaddr_2_str (pcfg.pcfg_id, buffer), - pcfg.pcfg_misc, pcfg.pcfg_count, pcfg.pcfg_size, - (pcfg.pcfg_flags & 1) ? "on" : "off", - (pcfg.pcfg_flags & 2) ? "on" : "off", - (pcfg.pcfg_flags & 4) ? "on" : "off", - pcfg.pcfg_wait); + printf ("%s: (%s/%s) npeer %d nroute %d\n", + ptl_ipaddr_2_str(pcfg.pcfg_id, buffer[2], 1), + ptl_ipaddr_2_str(pcfg.pcfg_id, buffer[0], 0), + ptl_ipaddr_2_str(pcfg.pcfg_misc, buffer[1], 0), + pcfg.pcfg_fd, pcfg.pcfg_count); } if (index == 0) - printf ("<no autoconnect routes>\n"); + printf ("<no interfaces>\n"); return 0; } -int -jt_ptl_add_autoconnect (int argc, char **argv) +int +jt_ptl_add_interface (int argc, char **argv) { - struct portals_cfg pcfg; - ptl_nid_t nid; - __u32 ip; - int port; - int irq_affinity = 0; - int share = 0; - int eager = 0; + struct portals_cfg pcfg; + __u32 ipaddr; int rc; + __u32 netmask = 0xffffff00; - if (argc < 4 || argc > 5) { - fprintf (stderr, "usage: %s nid ipaddr port [ise]\n", argv[0]); + if (argc < 2 || argc > 3) { + fprintf (stderr, "usage: %s ipaddr [netmask]\n", argv[0]); return 0; } - if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) + if (!g_nal_is_compatible(argv[0], SOCKNAL, 0)) return -1; - if (ptl_parse_nid (&nid, argv[1]) != 0 || - nid == PTL_NID_ANY) { - fprintf (stderr, "Can't parse NID: %s\n", argv[1]); + if (ptl_parse_ipaddr(&ipaddr, argv[1]) != 0) { + fprintf (stderr, "Can't parse ip: %s\n", argv[1]); + return -1; + } + + if (argc > 2 && + ptl_parse_ipquad(&netmask, argv[2]) != 0) { + fprintf (stderr, "Can't parse netmask: %s\n", argv[2]); + return -1; + } + + PCFG_INIT(pcfg, NAL_CMD_ADD_INTERFACE); + pcfg.pcfg_id = ipaddr; + pcfg.pcfg_misc = netmask; + + rc = pcfg_ioctl (&pcfg); + if (rc != 0) { + fprintf (stderr, "failed to add interface: %s\n", + strerror (errno)); return -1; } + + return 0; +} - if (ptl_parse_ipaddr (&ip, argv[2]) != 0) { - fprintf (stderr, "Can't parse ip addr: %s\n", argv[2]); +int +jt_ptl_del_interface (int argc, char **argv) +{ + struct portals_cfg pcfg; + int rc; + __u32 ipaddr = 0; + + if (argc > 2) { + fprintf (stderr, "usage: %s [ipaddr]\n", argv[0]); + return 0; + } + + if (!g_nal_is_compatible(argv[0], SOCKNAL, 0)) + return -1; + + if (argc == 2 && + ptl_parse_ipaddr(&ipaddr, argv[1]) != 0) { + fprintf (stderr, "Can't parse ip: %s\n", argv[1]); return -1; } + + PCFG_INIT(pcfg, NAL_CMD_DEL_INTERFACE); + pcfg.pcfg_id = ipaddr; - if (ptl_parse_port (&port, argv[3]) != 0) { - fprintf (stderr, "Can't parse port: %s\n", argv[3]); + rc = pcfg_ioctl (&pcfg); + if (rc != 0) { + fprintf (stderr, "failed to delete interface: %s\n", + strerror (errno)); return -1; } + + return 0; +} - if (argc > 4) { - char *opts = argv[4]; - - while (*opts != 0) - switch (*opts++) { - case 'i': - irq_affinity = 1; - break; - case 's': - share = 1; - break; - case 'e': - eager = 1; - break; - default: - fprintf (stderr, "Can't parse options: %s\n", - argv[4]); - return -1; - } +int +jt_ptl_print_peers (int argc, char **argv) +{ + struct portals_cfg pcfg; + char buffer[2][64]; + int index; + int rc; + + if (!g_nal_is_compatible (argv[0], SOCKNAL, OPENIBNAL, 0)) + return -1; + + for (index = 0;;index++) { + PCFG_INIT (pcfg, NAL_CMD_GET_PEER); + pcfg.pcfg_count = index; + + rc = pcfg_ioctl (&pcfg); + if (rc != 0) + break; + + if (g_nal_is_compatible(NULL, SOCKNAL, 0)) + printf (LPX64"[%d]%s@%s:%d #%d\n", + pcfg.pcfg_nid, pcfg.pcfg_wait, + ptl_ipaddr_2_str (pcfg.pcfg_size, buffer[0], 1), + ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1), + pcfg.pcfg_misc, pcfg.pcfg_count); + else + printf (LPX64"[%d]\n", + pcfg.pcfg_nid, pcfg.pcfg_wait); } - PCFG_INIT(pcfg, NAL_CMD_ADD_AUTOCONN); + if (index == 0) + printf ("<no peers>\n"); + return 0; +} + +int +jt_ptl_add_peer (int argc, char **argv) +{ + struct portals_cfg pcfg; + ptl_nid_t nid; + __u32 ip = 0; + int port = 0; + int rc; + + if (!g_nal_is_compatible (argv[0], SOCKNAL, OPENIBNAL, 0)) + return -1; + + if (g_nal_is_compatible(NULL, SOCKNAL, 0)) { + if (argc != 4) { + fprintf (stderr, "usage(tcp): %s nid ipaddr port\n", + argv[0]); + return 0; + } + } else if (argc != 2) { + fprintf (stderr, "usage(openib): %s nid\n", argv[0]); + return 0; + } + + if (ptl_parse_nid (&nid, argv[1]) != 0 || + nid == PTL_NID_ANY) { + fprintf (stderr, "Can't parse NID: %s\n", argv[1]); + return -1; + } + + if (g_nal_is_compatible (NULL, SOCKNAL, 0)) { + if (ptl_parse_ipaddr (&ip, argv[2]) != 0) { + fprintf (stderr, "Can't parse ip addr: %s\n", argv[2]); + return -1; + } + + if (ptl_parse_port (&port, argv[3]) != 0) { + fprintf (stderr, "Can't parse port: %s\n", argv[3]); + return -1; + } + } + + PCFG_INIT(pcfg, NAL_CMD_ADD_PEER); pcfg.pcfg_nid = nid; pcfg.pcfg_id = ip; pcfg.pcfg_misc = port; - /* only passing one buffer size! */ - pcfg.pcfg_size = MAX (g_socket_rxmem, g_socket_txmem); - pcfg.pcfg_flags = (g_socket_nonagle ? 0x01 : 0) | - (irq_affinity ? 0x02 : 0) | - (share ? 0x04 : 0) | - (eager ? 0x08 : 0); rc = pcfg_ioctl (&pcfg); if (rc != 0) { - fprintf (stderr, "failed to enable autoconnect: %s\n", + fprintf (stderr, "failed to add peer: %s\n", strerror (errno)); return -1; } @@ -634,63 +723,63 @@ jt_ptl_add_autoconnect (int argc, char **argv) } int -jt_ptl_del_autoconnect (int argc, char **argv) +jt_ptl_del_peer (int argc, char **argv) { struct portals_cfg pcfg; ptl_nid_t nid = PTL_NID_ANY; - __u32 ip = 0; - int share = 0; - int keep_conn = 0; + __u32 ip = 0; + int single_share = 0; + int argidx; int rc; - if (argc > 4) { - fprintf (stderr, "usage: %s [nid] [ipaddr] [sk]\n", - argv[0]); - return 0; - } - - if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, OPENIBNAL, 0)) return -1; + if (g_nal_is_compatible(NULL, SOCKNAL, 0)) { + if (argc > 4) { + fprintf (stderr, "usage: %s [nid] [ipaddr] [single_share]\n", + argv[0]); + return 0; + } + } else if (argc > 3) { + fprintf (stderr, "usage: %s [nid] [single_share]\n", argv[0]); + return 0; + } + if (argc > 1 && ptl_parse_nid (&nid, argv[1]) != 0) { fprintf (stderr, "Can't parse nid: %s\n", argv[1]); return -1; } - if (argc > 2 && - ptl_parse_ipaddr (&ip, argv[2]) != 0) { - fprintf (stderr, "Can't parse ip addr: %s\n", argv[2]); - return -1; + argidx = 2; + if (g_nal_is_compatible(NULL, SOCKNAL, 0)) { + if (argc > argidx && + ptl_parse_ipaddr (&ip, argv[argidx]) != 0) { + fprintf (stderr, "Can't parse ip addr: %s\n", + argv[argidx]); + return -1; + } + argidx++; } - - if (argc > 3) { - char *opts = argv[3]; - - while (*opts != 0) - switch (*opts++) { - case 's': - share = 1; - break; - case 'k': - keep_conn = 1; - break; - default: - fprintf (stderr, "Can't parse flags: %s\n", - argv[3]); - return -1; - } + + if (argc > argidx) { + if (!strcmp (argv[3], "single_share")) { + single_share = 1; + } else { + fprintf (stderr, "Unrecognised arg %s'\n", argv[3]); + return -1; + } } - PCFG_INIT(pcfg, NAL_CMD_DEL_AUTOCONN); - pcfg.pcfg_nid = nid; - pcfg.pcfg_id = ip; - pcfg.pcfg_flags = (share ? 1 : 0) | - (keep_conn ? 2 : 0); + PCFG_INIT(pcfg, NAL_CMD_DEL_PEER); + pcfg.pcfg_nid = nid; + pcfg.pcfg_id = ip; + pcfg.pcfg_flags = single_share; rc = pcfg_ioctl (&pcfg); if (rc != 0) { - fprintf (stderr, "failed to remove autoconnect route: %s\n", + fprintf (stderr, "failed to remove peer: %s\n", strerror (errno)); return -1; } @@ -702,11 +791,11 @@ int jt_ptl_print_connections (int argc, char **argv) { struct portals_cfg pcfg; - char buffer[64]; + char buffer[2][64]; int index; int rc; - if (!g_nal_is_compatible (argv[0], SOCKNAL, 0)) + if (!g_nal_is_compatible (argv[0], SOCKNAL, OPENIBNAL, 0)) return -1; for (index = 0;;index++) { @@ -717,14 +806,23 @@ jt_ptl_print_connections (int argc, char **argv) if (rc != 0) break; - printf (LPX64"@%s:%d:%s\n", - pcfg.pcfg_nid, - ptl_ipaddr_2_str (pcfg.pcfg_id, buffer), - pcfg.pcfg_misc, - (pcfg.pcfg_flags == SOCKNAL_CONN_ANY) ? "A" : - (pcfg.pcfg_flags == SOCKNAL_CONN_CONTROL) ? "C" : - (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_IN) ? "I" : - (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_OUT) ? "O" : "?"); + if (g_nal_is_compatible (NULL, SOCKNAL, 0)) + printf ("[%d]%s:"LPX64"@%s:%d:%s %d/%d %s\n", + pcfg.pcfg_gw_nal, /* scheduler */ + ptl_ipaddr_2_str (pcfg.pcfg_fd, buffer[0], 1), /* local IP addr */ + pcfg.pcfg_nid, + ptl_ipaddr_2_str (pcfg.pcfg_id, buffer[1], 1), /* remote IP addr */ + pcfg.pcfg_misc, /* remote port */ + (pcfg.pcfg_flags == SOCKNAL_CONN_ANY) ? "A" : + (pcfg.pcfg_flags == SOCKNAL_CONN_CONTROL) ? "C" : + (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_IN) ? "I" : + (pcfg.pcfg_flags == SOCKNAL_CONN_BULK_OUT) ? "O" : "?", + pcfg.pcfg_count, /* tx buffer size */ + pcfg.pcfg_size, /* rx buffer size */ + pcfg.pcfg_wait ? "nagle" : "nonagle"); + else + printf (LPX64"\n", + pcfg.pcfg_nid); } if (index == 0) @@ -739,17 +837,11 @@ int jt_ptl_connect(int argc, char **argv) __u32 ipaddr; char *flag; int fd, rc; - int nonagle = 0; - int rxmem = 0; - int txmem = 0; - int bind_irq = 0; int type = SOCKNAL_CONN_ANY; int port; - int o; - int olen; if (argc < 3) { - fprintf(stderr, "usage: %s ip port [xibctr]\n", argv[0]); + fprintf(stderr, "usage: %s ip port [type]\n", argv[0]); return 0; } @@ -771,10 +863,6 @@ int jt_ptl_connect(int argc, char **argv) for (flag = argv[3]; *flag != 0; flag++) switch (*flag) { - case 'i': - bind_irq = 1; - break; - case 'I': if (type != SOCKNAL_CONN_ANY) { fprintf(stderr, "Can't flag type twice\n"); @@ -816,49 +904,14 @@ int jt_ptl_connect(int argc, char **argv) return -1; } - if (g_socket_nonagle) - { - o = 1; - if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &o, sizeof (o)) != 0) { - fprintf(stderr, "cannot disable nagle: %s\n", strerror(errno)); - return (-1); - } - } - - if (g_socket_rxmem != 0) { - o = g_socket_rxmem; - if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &o, sizeof (o)) != 0) { - fprintf(stderr, "cannot set receive buffer size: %s\n", strerror(errno)); - return (-1); - } - } - - if (g_socket_txmem != 0) { - o = g_socket_txmem; - if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &o, sizeof (o)) != 0) { - fprintf(stderr, "cannot set send buffer size: %s\n", strerror(errno)); - return (-1); - } - } - rc = connect(fd, (struct sockaddr *)&srvaddr, sizeof(srvaddr)); if ( rc == -1 ) { fprintf(stderr, "connect() failed: %s\n", strerror(errno)); return -1; } - olen = sizeof (txmem); - if (getsockopt (fd, SOL_SOCKET, SO_SNDBUF, &txmem, &olen) != 0) - fprintf (stderr, "Can't get send buffer size: %s\n", strerror (errno)); - olen = sizeof (rxmem); - if (getsockopt (fd, SOL_SOCKET, SO_RCVBUF, &rxmem, &olen) != 0) - fprintf (stderr, "Can't get receive buffer size: %s\n", strerror (errno)); - olen = sizeof (nonagle); - if (getsockopt (fd, IPPROTO_TCP, TCP_NODELAY, &nonagle, &olen) != 0) - fprintf (stderr, "Can't get nagle: %s\n", strerror (errno)); - - printf("Connected host: %s snd: %d rcv: %d nagle: %s type: %s\n", - argv[1], txmem, rxmem, nonagle ? "Disabled" : "Enabled", + printf("Connected host: %s type: %s\n", + argv[1], (type == SOCKNAL_CONN_ANY) ? "A" : (type == SOCKNAL_CONN_CONTROL) ? "C" : (type == SOCKNAL_CONN_BULK_IN) ? "I" : @@ -867,7 +920,6 @@ int jt_ptl_connect(int argc, char **argv) PCFG_INIT(pcfg, NAL_CMD_REGISTER_PEER_FD); pcfg.pcfg_nal = g_nal; pcfg.pcfg_fd = fd; - pcfg.pcfg_flags = bind_irq; pcfg.pcfg_misc = type; rc = pcfg_ioctl(&pcfg); @@ -889,7 +941,7 @@ int jt_ptl_connect(int argc, char **argv) int jt_ptl_disconnect(int argc, char **argv) { - struct portals_cfg pcfg; + struct portals_cfg pcfg; ptl_nid_t nid = PTL_NID_ANY; __u32 ipaddr = 0; int rc; @@ -899,7 +951,7 @@ int jt_ptl_disconnect(int argc, char **argv) return 0; } - if (!g_nal_is_compatible (NULL, SOCKNAL, 0)) + if (!g_nal_is_compatible (NULL, SOCKNAL, OPENIBNAL, 0)) return 0; if (argc >= 2 && @@ -908,7 +960,8 @@ int jt_ptl_disconnect(int argc, char **argv) return -1; } - if (argc >= 3 && + if (g_nal_is_compatible (NULL, SOCKNAL, 0) && + argc >= 3 && ptl_parse_ipaddr (&ipaddr, argv[2]) != 0) { fprintf (stderr, "Can't parse ip addr %s\n", argv[2]); return -1; @@ -930,7 +983,7 @@ int jt_ptl_disconnect(int argc, char **argv) int jt_ptl_push_connection (int argc, char **argv) { - struct portals_cfg pcfg; + struct portals_cfg pcfg; int rc; ptl_nid_t nid = PTL_NID_ANY; __u32 ipaddr = 0; @@ -971,7 +1024,7 @@ int jt_ptl_push_connection (int argc, char **argv) int jt_ptl_print_active_txs (int argc, char **argv) { - struct portals_cfg pcfg; + struct portals_cfg pcfg; int index; int rc; @@ -1179,61 +1232,6 @@ jt_ptl_fail_nid (int argc, char **argv) return (0); } -int -jt_ptl_rxmem (int argc, char **argv) -{ - int size; - - if (argc > 1) - { - if (ptl_parse_size (&size, argv[1]) != 0 || size < 0) - { - fprintf (stderr, "Can't parse size %s\n", argv[1]); - return (0); - } - - g_socket_rxmem = size; - } - printf ("Socket rmem = %d\n", g_socket_rxmem); - return (0); -} - -int -jt_ptl_txmem (int argc, char **argv) -{ - int size; - - if (argc > 1) - { - if (ptl_parse_size (&size, argv[1]) != 0 || size < 0) - { - fprintf (stderr, "Can't parse size %s\n", argv[1]); - return (0); - } - g_socket_txmem = size; - } - printf ("Socket txmem = %d\n", g_socket_txmem); - return (0); -} - -int -jt_ptl_nagle (int argc, char **argv) -{ - int enable; - - if (argc > 1) - { - if (ptl_parse_bool (&enable, argv[1]) != 0) - { - fprintf (stderr, "Can't parse boolean %s\n", argv[1]); - return (-1); - } - g_socket_nonagle = !enable; - } - printf ("Nagle %s\n", g_socket_nonagle ? "disabled" : "enabled"); - return (0); -} - int jt_ptl_add_route (int argc, char **argv) { @@ -1492,9 +1490,19 @@ lwt_snapshot(cycles_t *now, int *ncpu, int *totalsize, return (-1); } + /* crappy overloads */ + if (data.ioc_nid != sizeof(lwt_event_t) || + data.ioc_nid2 != offsetof(lwt_event_t, lwte_where)) { + fprintf(stderr,"kernel/user LWT event mismatch %d(%d),%d(%d)\n", + (int)data.ioc_nid, sizeof(lwt_event_t), + (int)data.ioc_nid2, + (int)offsetof(lwt_event_t, lwte_where)); + return (-1); + } + LASSERT (data.ioc_count != 0); LASSERT (data.ioc_misc != 0); - + if (now != NULL) *now = data.ioc_nid; @@ -1604,13 +1612,14 @@ get_cycles_per_usec () int jt_ptl_lwt(int argc, char **argv) { + const int lwt_max_cpus = 32; int ncpus; int totalspace; int nevents_per_cpu; lwt_event_t *events; - lwt_event_t *cpu_event[LWT_MAX_CPUS + 1]; - lwt_event_t *next_event[LWT_MAX_CPUS]; - lwt_event_t *first_event[LWT_MAX_CPUS]; + lwt_event_t *cpu_event[lwt_max_cpus + 1]; + lwt_event_t *next_event[lwt_max_cpus]; + lwt_event_t *first_event[lwt_max_cpus]; int cpu; lwt_event_t *e; int rc; @@ -1652,9 +1661,9 @@ jt_ptl_lwt(int argc, char **argv) if (lwt_snapshot(NULL, &ncpus, &totalspace, NULL, 0) != 0) return (-1); - if (ncpus > LWT_MAX_CPUS) { + if (ncpus > lwt_max_cpus) { fprintf(stderr, "Too many cpus: %d (%d)\n", - ncpus, LWT_MAX_CPUS); + ncpus, lwt_max_cpus); return (-1); } diff --git a/lnet/utils/ptlctl.c b/lnet/utils/ptlctl.c index c65ecb2443..03cfe777b2 100644 --- a/lnet/utils/ptlctl.c +++ b/lnet/utils/ptlctl.c @@ -30,9 +30,12 @@ command_t list[] = { {"network", jt_ptl_network, 0,"setup the NAL (args: nal name)"}, - {"print_autoconns", jt_ptl_print_autoconnects, 0, "print autoconnect entries (no args)"}, - {"add_autoconn", jt_ptl_add_autoconnect, 0, "add autoconnect entry (args: nid host [ise])"}, - {"del_autoconn", jt_ptl_del_autoconnect, 0, "delete autoconnect entry (args: [nid] [host] [ks])"}, + {"print_interfaces", jt_ptl_print_interfaces, 0, "print interface entries (no args)"}, + {"add_interface", jt_ptl_add_interface, 0, "add interface entry (args: ip [netmask])"}, + {"del_interface", jt_ptl_del_interface, 0, "delete interface entries (args: [ip])"}, + {"print_peers", jt_ptl_print_peers, 0, "print peer entries (no args)"}, + {"add_peer", jt_ptl_add_peer, 0, "add peer entry (args: nid host port)"}, + {"del_peer", jt_ptl_del_peer, 0, "delete peer entry (args: [nid] [host])"}, {"print_conns", jt_ptl_print_connections, 0, "print connections (no args)"}, {"connect", jt_ptl_connect, 0, "connect to a remote nid (args: host port [iIOC])"}, {"disconnect", jt_ptl_disconnect, 0, "disconnect from a remote nid (args: [nid] [host]"}, @@ -48,9 +51,6 @@ command_t list[] = { {"set_route", jt_ptl_notify_router, 0, "enable/disable a route in the routing table (args: gatewayNID up/down [time]"}, {"print_routes", jt_ptl_print_routes, 0, "print the routing table (args: none)"}, - {"recv_mem", jt_ptl_rxmem, 0, "Set socket receive buffer size (args: [size])"}, - {"send_mem", jt_ptl_txmem, 0, "Set socket send buffer size (args: [size])"}, - {"nagle", jt_ptl_nagle, 0, "Enable/Disable Nagle (args: [on/off])"}, {"dump", jt_ioc_dump, 0, "usage: dump file, save ioctl buffer to file"}, {"fail", jt_ptl_fail_nid, 0, "usage: fail nid|_all_ [count]"}, {"help", Parser_help, 0, "help"}, diff --git a/lustre/ChangeLog b/lustre/ChangeLog index a563e0d99e..083b5b0a3b 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -8,6 +8,7 @@ tbd Cluster File Systems, Inc. <info@clusterfs.com> - leave liblustre's partial write handling to filter (3274) - chose better nal ids in liblustre (3292) - initialize liblustre with uid/group membership (2862) + - let lconf resolve symlinked-to devices (4629) * miscellania - drop scimac NAL (unmaintained) diff --git a/lustre/autoMakefile.am b/lustre/autoMakefile.am index a706178ecd..6d9b324aa1 100644 --- a/lustre/autoMakefile.am +++ b/lustre/autoMakefile.am @@ -42,6 +42,8 @@ dep: .depend .depend: $(MAKE) $(ARCH_UM) -C $(LINUX) -f $(PWD)/kernel-tests/Makefile LUSTRE_LINUX_CONFIG=$(LINUX_CONFIG) -o scripts -o include/config/MARKER _sfdep_$(PWD) _FASTDEP_ALL_SUB_DIRS="$(PWD)" + +CLEANFILES = .depend endif if LDISKFS @@ -54,7 +56,7 @@ lvfs-sources: $(MAKE) sources -C lvfs modules: lustre_build_version $(DEP) $(LDISKFS) lvfs-sources - $(MAKE) $(ARCH_UM) -C $(LINUX) -f $(PWD)/kernel-tests/Makefile LUSTRE_LINUX_CONFIG=$(LINUX_CONFIG) SUBDIRS=$(PWD) -o tmp_include_depends -o scripts -o include/config/MARKER $@ + $(MAKE) $(ARCH_UM) -C $(LINUX) -f $(PWD)/kernel-tests/Makefile LUSTRE_LINUX_CONFIG=$(LINUX_CONFIG) $(MODULE_TARGET)=$(PWD) -o tmp_include_depends -o scripts -o include/config/MARKER $@ endif # MODULES diff --git a/lustre/configure.in b/lustre/configure.in index 762e4893db..e2fca964cd 100644 --- a/lustre/configure.in +++ b/lustre/configure.in @@ -5,7 +5,7 @@ AC_INIT AC_CANONICAL_SYSTEM -AM_INIT_AUTOMAKE(lustre, b1_4) +AM_INIT_AUTOMAKE(lustre, 1.3.9.1) # AM_MAINTAINER_MODE # Four main targets: lustre kernel modules, utilities, tests, and liblustre @@ -61,15 +61,6 @@ AC_SUBST(ENABLE_DOC) # default backing fs is ext3 BACKINGFS='ext3' -# LLNL patches their ext3 and calls it extN -AC_MSG_CHECKING([whether to use extN]) -AC_ARG_ENABLE([extN], - AC_HELP_STRING([--enable-extN], - [use extN instead of ext3 for lustre backend]), - [BACKINGFS='extN'],[enable_extN='no']) -AC_MSG_RESULT([$enable_extN]) -AM_CONDITIONAL(EXTN, test x$enable_extN = xyes) - # SuSE gets ldiskfs AC_MSG_CHECKING([whether to enable ldiskfs]) AC_ARG_ENABLE([ldiskfs], @@ -77,7 +68,6 @@ AC_ARG_ENABLE([ldiskfs], [use ldiskfs for the Lustre backing FS]), [BACKINGFS='ldiskfs'],[enable_ldiskfs='no']) AC_MSG_RESULT([$enable_ldiskfs]) -AM_CONDITIONAL(LDISKFS, test x$enable_ldiskfs = xyes) AC_MSG_CHECKING([which backing filesystem to use]) AC_MSG_RESULT([$BACKINGFS]) @@ -120,7 +110,7 @@ AC_ARG_WITH([sysio], ]) AC_MSG_RESULT([$SYSIO_PATH]) -AC_CHECK_FILE([$SYSIO_PATH/src/libsysio.a],[], +AC_CHECK_FILE([$SYSIO_PATH/lib/libsysio.a],[], [ if test x$enable_liblustre = xyes ; then AC_MSG_ERROR([A built libsysio tree is required for building liblustre.]) @@ -143,16 +133,23 @@ AC_ARG_ENABLE([snapfs], AC_HELP_STRING([--enable-snapfs], [build snapfs]), [],[enable_snapfs='no']) - AC_MSG_RESULT([$enable_snapfs]) AM_CONDITIONAL(SNAPFS, test x$enable_snapfs = xyes) -if test x$enable_snapfs = xyes ; then - AC_DEFINE(CONFIG_SNAPFS, 1, [enable snap support]) -fi + +# smfs compilation +AC_MSG_CHECKING([whether to enable smfs support]) +AC_ARG_ENABLE([smfs], + AC_HELP_STRING([--enable-smfs], + [build smfs]), + [],[enable_smfs='no']) +AC_MSG_RESULT([$enable_smfs]) +AM_CONDITIONAL(SMFS, test x$enable_smfs = xyes) sinclude(portals/build.m4) sinclude(portals/archdep.m4) +AM_CONDITIONAL(LDISKFS, test x$enable_ldiskfs = xyes) + if test x$enable_inkernel = xyes ; then find . -name Makefile.mk | sed 's/.mk$//' | xargs -n 1 \ sh -e -x -c '(cp -f $0.mk $0.in)' @@ -214,12 +211,15 @@ portals/Kernelenv portals/Makefile portals/autoMakefile portals/doc/Makefile +portals/include/Makefile +portals/include/linux/Makefile +portals/include/portals/Makefile portals/knals/Makefile portals/knals/autoMakefile portals/knals/gmnal/Makefile portals/knals/gmnal/autoMakefile -portals/knals/ibnal/Makefile -portals/knals/ibnal/autoMakefile +portals/knals/openibnal/Makefile +portals/knals/openibnal/autoMakefile portals/knals/qswnal/Makefile portals/knals/qswnal/autoMakefile portals/knals/socknal/Makefile @@ -245,6 +245,9 @@ smfs/Makefile smfs/autoMakefile cmobd/Makefile cmobd/autoMakefile +snapfs/Makefile +snapfs/autoMakefile +snapfs/utils/Makefile tests/Makefile utils/Lustre/Makefile utils/Makefile diff --git a/lustre/doc/Makefile.am b/lustre/doc/Makefile.am index dce13432fd..7b588344c4 100644 --- a/lustre/doc/Makefile.am +++ b/lustre/doc/Makefile.am @@ -20,6 +20,11 @@ else DOCS = endif +if UTILS +man_MANS = lfs.1 lmc.1 lwizard.1 lconf.8 lctl.8 +endif + + IMAGES := $(patsubst %.fig,%.eps,$(wildcard *.fig)) LYXFILES= $(filter-out $(patsubst %.lin,%.lyx,$(wildcard *.lin)),\ $(wildcard *.lin *.lyx)) @@ -29,7 +34,8 @@ CLEANFILES = *.aux *.tex doc.old/*.aux doc.old/*.tex *.eps *.log *.pdf VERSIONED = lustre.lyx doc.old/lustre.lyx GENERATED = $(VERSIONED) lustre-full.tex lustre-chbar.tex -EXTRA_DIST = chbar.sh postbar tex2pdf $(DOCS) $(IMAGES) $(LYXFILES) lustre.bib +EXTRA_DIST = chbar.sh postbar tex2pdf $(DOCS) $(man_MANS) $(IMAGES) \ + $(LYXFILES) lustre.bib lfs.1 lmc.1 lwizard.1 lconf.8 lctl.8 all: docs: $(DOCS) diff --git a/lustre/doc/lmc.lyx b/lustre/doc/lmc.lyx index 183994b4d5..168e08a711 100644 --- a/lustre/doc/lmc.lyx +++ b/lustre/doc/lmc.lyx @@ -1,748 +1,706 @@ -#LyX 1.3 created this file. For more info see http://www.lyx.org/ -\lyxformat 221 -\textclass amsart -\language english -\inputencoding auto -\fontscheme times -\graphics default -\paperfontsize default -\spacing single -\papersize letterpaper -\paperpackage a4 -\use_geometry 0 -\use_amsmath 0 -\use_natbib 0 -\use_numerical_citations 0 -\paperorientation portrait -\secnumdepth 3 -\tocdepth 3 -\paragraph_separation skip -\defskip medskip -\quotes_language english -\quotes_times 2 -\papercolumns 1 -\papersides 1 -\paperpagestyle default - -\layout Section - -lmc -\layout Subsection - -NAME -\layout Description - -lmc Lustre configuration maker. -\layout Subsection - -SYNOPSIS -\layout Standard - - -\series bold -lmc [options] --add <objectype> [args] -\layout Standard - - -\series bold -lmc [options] --remove <objecttype> [args] -- [NOT IMPLEMENTED] -\layout Standard - - -\series bold -lmc [options] --convert [args] -- [NOT IMPLEMENTED] -\layout Subsection - -DESCRIPTION -\layout Standard - -At present -\series bold -\emph on -lmc -\series default -\emph default -, when invoked, adds configuration data to the config file. - In future, -\series bold -\emph on -lmc -\series default -\emph default - will also be able to remove configuration data or convert its format. - A Lustre cluster consists of several components - MDS's, mount-points, - OSTs, LOVs and whatever those reference (e.g nets and profiles). - A single configuration file would be generated for the complete cluster. - In the -\series bold -\emph on -lmc -\series default -\emph default - command line interface, each of these components is associated with an - -\emph on -objecttype -\emph default -. - -\layout Standard - -The -\emph on -objecttype -\emph default - refers to a collection of related configuration entities and can be one - of -\series bold -net -\series default -, -\series bold - MDS -\series default -, -\series bold - LOV -\series default -, -\series bold - OST -\series default -, -\series bold - mtpt -\series default -, -\series bold - route -\series default -, -\series bold - echo_client, or cobd. - -\series default -We describe the arguments required for the addition of each -\emph on -objecttype -\emph default -. - -\layout Standard - -To generate configuration data associated with systems in a Lustre cluster: -\layout Description - - -\emph on -- -\emph default --add\SpecialChar ~ -node Adds a new node in the cluster configuration. - -\begin_deeper -\layout Standard - -The arguments required are: -\layout Description - ---node\SpecialChar ~ -''node_name'' This will create a new node with the given name if not - already present. -\layout Description - ---timeout\SpecialChar ~ -<num> Timeout before going into recovery -\layout Description - ---lustre_upcall\SpecialChar ~ -<path> Set the location of the Lustre upcall scripts used - by the client for recovery -\layout Description - ---portals_upcall\SpecialChar ~ -<path> Specify the location of the Portals upcall scripts - used by the client for recovery -\layout Description - ---upcall\SpecialChar ~ -<path> Specify the location of both (Lustre and Portals) upcall - scripts used by the client for recovery -\layout Description - ---ptldebug\SpecialChar ~ -<debug_level> Set the portals debug level. -\layout Description - ---subsytem\SpecialChar ~ -<subsystem_name> Specify which Lustre subsystems have debug output - recorded in the log. -\end_deeper -\layout Description - - -\emph on -- -\emph default --add\SpecialChar ~ -net Adds a network device descriptor for the given node, with parameters - as indicated. -\begin_deeper -\layout Standard - -The arguments required are: -\layout Description - ---node\SpecialChar ~ -''node_name'' This will create a new node with the given name if not - already present. - This is also used to specify a specific node for other elements. -\layout Description - ---nettype\SpecialChar ~ -<type> Specify the network type.This can be -\series bold -tcp, elan, gm. -\layout Description - ---nid\SpecialChar ~ -nid The network -\emph on -id -\emph default -, e.g. - ElanID or IP address as used by Portals. - If -\emph on -nid -\emph default - is '*', then the local address of the interface with specified -\series bold -nettype -\series default -is will be substituted when the node is configured with lconf. - An -\emph on -nid -\emph default - of -\emph on -'*' -\emph default - should be used only for the generic -\emph on -client -\emph default - configuration. -\layout Description - ---cluster_id\SpecialChar ~ -id Specify the cluster ID. -\layout Description - ---hostaddr\SpecialChar ~ -addr Specify the host address. - lconf will transfer it to the real host address. -\layout Description - ---router Optional flag to mark this node as a router -\layout Description - ---port\SpecialChar ~ -[port] Optional arguement to indicate the tcp port. - The default is 988. - -\layout Description - ---tcpbuf\SpecialChar ~ -<size> Optional arguement. - The default TCP buffer size is 1MB. -\layout Description - ---irq_affinity\SpecialChar ~ -0|1 Optional arguement. - Default is 0. -\layout Description - ---nid_exchange\SpecialChar ~ -0|1 Optional arguement since some OSTs might not have the - required support. - This is turned off by default, value of 1 will turn it ON. - -\end_deeper -\layout Description - ---add\SpecialChar ~ -mds -\begin_deeper -\layout Description - ---node\SpecialChar ~ -<node\SpecialChar ~ -name> Name of the node on which the MDS resides -\layout Description - ---mds\SpecialChar ~ -<mds_name> Specify MDS name. -\layout Description - ---mdsuuid\SpecialChar ~ -<uuid> Specify MDS uuid. -\layout Description - ---failover Enable failover support on MDS. -\layout Description - ---dev\SpecialChar ~ -<pathname> Path of device on local system. - If the is a file, then a loop device is created and used as the block device. -\layout Description - ---backdev\SpecialChar ~ -<pathname> Path of the device for backing storage on local system. -\layout Description - ---size\SpecialChar ~ -<size> Optional argument indicating the size (in KB) of the device - to be created (used typically for loop devices). -\layout Description - ---node\SpecialChar ~ -<nodename> Adds an MDS to the specified node. - This requires a -\emph on ---node -\emph default - argument, and it must not be a profile node. -\layout Description - ---fstype\SpecialChar ~ -extN|ext3 Optional argument used to specify the file system type. - Default is ext3. -\layout Description - ---backfstype\SpecialChar ~ -ext3|tmpfs Optional argument to specify the backing filesystem - type. -\layout Description - ---nspath Local mount point of server namespace. -\layout Description - ---inode_size\SpecialChar ~ -<size> Specify new inode size for underlying ext3 file system. -\layout Description - ---mkfsoptions\SpecialChar ~ -<options> Optional argument to mkfs. -\layout Description - ---mountfsoptions\SpecialChar ~ -<options> Optional argument to mount fs. - Mount options will be passed by this argument. - For example, extents are to be enabled by adding ",extents" to the --mountfsopt -ions option. - -\begin_inset Quotes eld -\end_inset - -errors=remount-ro -\begin_inset Quotes erd -\end_inset - - and -\begin_inset Quotes eld -\end_inset - -asyncdel -\begin_inset Quotes erd -\end_inset - - can also be added to it. -\layout Description - ---journal_size\SpecialChar ~ -<size> Optional arguement to specify the journal size for - the ext2/ext3 file system. - The size should be in the units expected by -\series bold -mkfs -\series default -, so for ext3 it should be in MB. - If this is option is not used, the ext2/ext3 filesystem will be configured - with the default journal size. -\end_deeper -\layout Description - ---add\SpecialChar ~ -lov Creates an LOV with the specified parameters. - The -\emph on -mds_name -\emph default - must already exist in the descriptor. -\begin_deeper -\layout Description - ---lov\SpecialChar ~ -<name> Specify LOV name. -\layout Description - ---mds\SpecialChar ~ -<name> Specify the mds name. -\layout Description - ---stripe_sz\SpecialChar ~ -<size> Specify the stripe size in bytes. -\layout Description - ---stripe_cnt\SpecialChar ~ -<count> A value of 0 for this means to stripe on all available - OSTs. - Default is 0. -\layout Description - ---stripe_pattern\SpecialChar ~ -<pattern> Only Pattern 0 (RAID 0) is supported currently. -\end_deeper -\layout Description - ---add\SpecialChar ~ -ost Creates an OBD, OST, and OSC. - The OST and OBD are created on the specified node. -\begin_deeper -\layout Description - ---ost\SpecialChar ~ -<name> Assign a name to the OST device. -\layout Description - ---node\SpecialChar ~ -<nodename> Node on which the OST service is run, can not be a profile - node. -\layout Description - ---failover Enable failover support on OST. -\layout Description - ---dev\SpecialChar ~ -<pathname> Path of device on local system. - If this is a file, then a loop device is created and used as the block - device. -\layout Description - ---backdev\SpecialChar ~ -<pathname> Path of the device for backing storage on local system. -\layout Description - ---size\SpecialChar ~ -[size] Optional argument indicating the size (in KB) of the device - to be created (used typically for loop devices). -\layout Description - ---osdtype\SpecialChar ~ -obdfilter|obdecho Specify the type of OSD. -\layout Description - ---lov\SpecialChar ~ -<name> Optional arguement. - Name of LOV to which this OSC will be attached. - -\layout Description - ---ostuuid\SpecialChar ~ -UUID Specify the UUID of the OST device. - -\layout Description - ---fstype\SpecialChar ~ -extN|ext3 Optional arguement used to specify the file system type. - Default is ext3. -\layout Description - ---backfstype\SpecialChar ~ -ext3|tmpfs Optional argument to specify the backing filesystem - type. -\layout Description - ---inode_size\SpecialChar ~ -<size> Specify new inode size for underlying ext3 file system. -\layout Description - ---nspath Local mount point of server namespace. -\layout Description - ---mkfsoptions\SpecialChar ~ -<options> Optional argument to mkfs. -\layout Description - ---mountfsoptions\SpecialChar ~ -<options> Optional argument to mount fs. - Mount options will be passed by this argument. - For example, extents are to be enabled by adding ",extents" to the --mountfsopt -ions option. - -\begin_inset Quotes eld -\end_inset - -errors=remount-ro -\begin_inset Quotes erd -\end_inset - - and -\begin_inset Quotes eld -\end_inset - -asyncdel -\begin_inset Quotes erd -\end_inset - - can also be added to it. -\layout Description - ---journal_size\SpecialChar ~ -<size> Optional arguement to specify the journal size for - the ext2/ext3 file system. - The size should be in the units expected by -\series bold -mkfs -\series default -, so for ext3 it should be in MB. - If this is option is not used, the ext2/ext3 filesystem will be configured - with the default journal size. -\end_deeper -\layout Description - ---add\SpecialChar ~ -mtpt Creates a mount-point on the specified node. - Either an LOV or OSC name can be used. -\begin_deeper -\layout Description - ---node\SpecialChar ~ -node Node or profile node that will use the -\emph on -mtpt -\emph default -. -\layout Description - ---path\SpecialChar ~ -/mnt/path Specify the mountpoint for Lustre. -\layout Description - ---mds\SpecialChar ~ -mds_name Specify the mds name, which will provide service for this - client. -\layout Description - ---ost\SpecialChar ~ -ost_name\SpecialChar ~ -|\SpecialChar ~ ---lov\SpecialChar ~ -lov_name Specify the ost or lov, which will provide service - for this client. -\layout Description - ---clientoptions Specify the options for Lustre, such as async. -\end_deeper -\layout Description - ---add\SpecialChar ~ -route Creates a static route through a gateway to a specific -\emph on -nid -\emph default - or a range of -\emph on -nid -\emph default -'s. -\begin_deeper -\layout Description - ---node\SpecialChar ~ -node Node to add the route to. -\layout Description - ---router Optional flag to mark a node as router. -\layout Description - ---gw\SpecialChar ~ -nid The -\emph on -nid -\emph default - of the gateway (must be a local interface or a peer). -\layout Description - ---gateway_cluster_id\SpecialChar ~ -id Specify the id of the cluster, to which the gateway - belongs. -\layout Description - ---target_cluster_id\SpecialChar ~ -id Specify the id of the cluster, to which the target - of the route belongs. -\layout Description - ---lo\SpecialChar ~ -nid For a range route, this is the lo value -\emph on -nid. -\layout Description - ---hi\SpecialChar ~ -nid For a range route, this is the hi value -\emph on -nid. -\end_deeper -\layout Description - ---add\SpecialChar ~ -echo-client Used for testing purpose only. - -\begin_deeper -\layout Description - ---node\SpecialChar ~ -nodename -\emph on - -\emph default -Node on which the echo-client resides. -\end_deeper -\layout Description - ---add\SpecialChar ~ -mgmt Management/monitoring service. -\begin_deeper -\layout Description - ---node\SpecialChar ~ -nodename -\emph on - -\emph default -Node on which the mgmt service resides. -\layout Description - ---mgmt\SpecialChar ~ -<mgmt_service_name> Specify management/monitoring service name. -\end_deeper -\layout List -\labelwidthstring 00.00.0000 - - -\series bold ---add\SpecialChar ~ -cobd -\series default -Create the cobd on the specified node. -\begin_deeper -\layout Description -\noindent \align left ---node\SpecialChar ~ -nodename -\emph on - -\emph default -Node on which the cobd resides. -\layout Description - ---cache_obd\SpecialChar ~ -obd_name Specify the cache device for the cache obd system. -\layout Description - ---real_obd\SpecialChar ~ -obd_name -\emph on - -\emph default -Specify the real device for the cache obd system. -\end_deeper -\layout List -\labelwidthstring 00.00.0000 - - -\series bold -Options -\layout Description - ---reference Print short reference for commands. -\layout Description - ---verbose Print system commands as they are run. -\layout Description - ---batch\SpecialChar ~ -filename Used to execute lmc commands in batch mode. -\layout Description - ---output\SpecialChar ~ -filename Send output to the file. - If the file exists, it will be overwritten. -\layout Description - ---merge\SpecialChar ~ -filename -\emph on - -\emph default -Add the new element to an existing file. - -\layout Subsection - -EXAMPLES -\layout Subsubsection - ---add net -\layout Standard - - -\series bold -lmc --node adev3 --add net --nid adev3 --cluster_id 0x1000 --nettype tcp - --hostaddr adev3-eth0 --port 988 -\layout Standard - - -\series bold -lmc --node adev3 --add net --nid adev3 --cluster_id 0x2000 --nettype tcp - --hostaddr adev3-eth1 --port 989 -\series default -\emph on - -\layout Standard - -Used to add a Lustre node to a specified Lustre cluster through a network - interface. - In this example, Lustre node adev3 has been added to 2 Lustre clusters - whose cluster_id are 0x1000 and 0x2000 separately through 2 network interface - cards: adev3-eth0 and adev3-eth1. - adev3 would listen in some specified port(s) to prepare for possible connection - requests from nodes in these two clusters. -\layout Subsubsection - ---add route -\layout Standard - - -\series bold -lmc --node adev3 --add route --nettype tcp --gw 5 --gateway_cluster_id 0x1000 - --target_cluster_id 0x1000 --lo 4 --hi 7 -\layout Standard - -Used to add a route entry for a Lustre node. - Here Lustre node adev3 is told it has a new route entry that now it could - send packets to Lustre nodes whose nids is from 4 to 7 with the help of - Lustre gateway node whose nid is 5. - Besides, Lustre gateway node is in cluster whose id is 0x1000 and target - of the route belongs to cluster whose id is also 0x1000. - The network in this route path is a tcp network. -\layout Subsection - -BUGS -\layout Standard - -None are known. -\the_end +#LyX 1.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 221 +\textclass amsart +\language english +\inputencoding auto +\fontscheme times +\graphics default +\paperfontsize default +\spacing single +\papersize letterpaper +\paperpackage a4 +\use_geometry 0 +\use_amsmath 0 +\use_natbib 0 +\use_numerical_citations 0 +\paperorientation portrait +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation skip +\defskip medskip +\quotes_language english +\quotes_times 2 +\papercolumns 1 +\papersides 1 +\paperpagestyle default + +\layout Section + +lmc +\layout Subsection + +NAME +\layout Description + +lmc Lustre configuration maker. +\layout Subsection + +SYNOPSIS +\layout Standard + + +\series bold +lmc [options] --add <objectype> [args] +\layout Standard + + +\series bold +lmc [options] --remove <objecttype> [args] -- [NOT IMPLEMENTED] +\layout Standard + + +\series bold +lmc [options] --convert [args] -- [NOT IMPLEMENTED] +\layout Subsection + +DESCRIPTION +\layout Standard + +At present +\series bold +\emph on +lmc +\series default +\emph default +, when invoked, adds configuration data to the config file. + In future, +\series bold +\emph on +lmc +\series default +\emph default + will also be able to remove configuration data or convert its format. + A Lustre cluster consists of several components - MDS's, mount-points, + OSTs, LOVs and whatever those reference (e.g nets and profiles). + A single configuration file would be generated for the complete cluster. + In the +\series bold +\emph on +lmc +\series default +\emph default + command line interface, each of these components is associated with an + +\emph on +objecttype +\emph default +. + +\layout Standard + +The +\emph on +objecttype +\emph default + refers to a collection of related configuration entities and can be one + of +\series bold +net +\series default +, +\series bold + MDS +\series default +, +\series bold + LOV +\series default +, +\series bold + OST +\series default +, +\series bold + mtpt +\series default +, +\series bold + route +\series default +, +\series bold + echo_client, or cobd. + +\series default +We describe the arguments required for the addition of each +\emph on +objecttype +\emph default +. + +\layout Standard + +To generate configuration data associated with systems in a Lustre cluster: +\layout Description + + +\emph on +- +\emph default +-add\SpecialChar ~ +node Adds a new node in the cluster configuration. + +\begin_deeper +\layout Standard + +The arguments required are: +\layout Description + +--node\SpecialChar ~ +''node_name'' This will create a new node with the given name if not + already present. +\layout Description + +--timeout\SpecialChar ~ +<num> Timeout before going into recovery +\layout Description + +--lustre_upcall\SpecialChar ~ +<path> Set the location of the Lustre upcall scripts used + by the client for recovery +\layout Description + +--portals_upcall\SpecialChar ~ +<path> Specify the location of the Portals upcall scripts + used by the client for recovery +\layout Description + +--upcall\SpecialChar ~ +<path> Specify the location of both (Lustre and Portals) upcall + scripts used by the client for recovery +\layout Description + +--ptldebug\SpecialChar ~ +<debug_level> Set the portals debug level. +\layout Description + +--subsytem\SpecialChar ~ +<subsystem_name> Specify which Lustre subsystems have debug output + recorded in the log. +\end_deeper +\layout Description + + +\emph on +- +\emph default +-add\SpecialChar ~ +net Adds a network device descriptor for the given node, with parameters + as indicated. +\begin_deeper +\layout Standard + +The arguments required are: +\layout Description + +--node\SpecialChar ~ +''node_name'' This will create a new node with the given name if not + already present. + This is also used to specify a specific node for other elements. +\layout Description + +--nettype\SpecialChar ~ +<type> Specify the network type.This can be +\series bold +tcp, elan, gm, ibnal. +\layout Description + +--nid\SpecialChar ~ +nid The network +\emph on +id +\emph default +, e.g. + ElanID or IP address as used by Portals. + If +\emph on +nid +\emph default + is '*', then the local address of the interface with specified +\series bold +nettype +\series default +is will be substituted when the node is configured with lconf. + An +\emph on +nid +\emph default + of +\emph on +'*' +\emph default + should be used only for the generic +\emph on +client +\emph default + configuration. +\layout Description + +--cluster_id\SpecialChar ~ +id Specify the cluster ID. +\layout Description + +--hostaddr\SpecialChar ~ +addr Specify the host address. + lconf will transfer it to the real host address. +\layout Description + +--router Optional flag to mark this node as a router +\layout Description + +--port\SpecialChar ~ +[port] Optional arguement to indicate the tcp port. + The default is 988. + +\layout Description + +--tcpbuf\SpecialChar ~ +<size> Optional arguement. + The default TCP buffer size is 1MB. +\layout Description + +--irq_affinity\SpecialChar ~ +0|1 Optional arguement. + Default is 0. +\layout Description + +--nid_exchange\SpecialChar ~ +0|1 Optional arguement since some OSTs might not have the + required support. + This is turned off by default, value of 1 will turn it ON. + +\end_deeper +\layout Description + +--add\SpecialChar ~ +mds +\begin_deeper +\layout Description + +--node\SpecialChar ~ +<node\SpecialChar ~ +name> Name of the node on which the MDS resides +\layout Description + +--mds\SpecialChar ~ +<mds_name> Specify MDS name. +\layout Description + +--mdsuuid\SpecialChar ~ +<uuid> Specify MDS uuid. +\layout Description + +--failover Enable failover support on MDS. +\layout Description + +--dev\SpecialChar ~ +<pathname> Path of device on local system. + If the is a file, then a loop device is created and used as the block device. +\layout Description + +--backdev\SpecialChar ~ +<pathname> Path of the device for backing storage on local system. +\layout Description + +--size\SpecialChar ~ +<size> Optional argument indicating the size (in KB) of the device + to be created (used typically for loop devices). +\layout Description + +--node\SpecialChar ~ +<nodename> Adds an MDS to the specified node. + This requires a +\emph on +--node +\emph default + argument, and it must not be a profile node. +\layout Description + +--fstype\SpecialChar ~ +extN|ext3 Optional argument used to specify the file system type. + Default is ext3. +\layout Description + +--backfstype\SpecialChar ~ +ext3|tmpfs Optional argument to specify the backing filesystem + type. +\layout Description + +--nspath Local mount point of server namespace. +\layout Description + +--inode_size\SpecialChar ~ +<size> Specify new inode size for underlying ext3 file system. +\layout Description + +--mkfsoptions\SpecialChar ~ +<options> Optional argument to mkfs. +\layout Description + +--mountfsoptions\SpecialChar ~ +<options> Optional argument to mount fs. + Mount options will be passed by this argument. + For example, extents are to be enabled by adding ",extents" to the --mountfsopt +ions option. + +\begin_inset Quotes eld +\end_inset + +errors=remount-ro +\begin_inset Quotes erd +\end_inset + + and +\begin_inset Quotes eld +\end_inset + +asyncdel +\begin_inset Quotes erd +\end_inset + + can also be added to it. +\layout Description + +--journal_size\SpecialChar ~ +<size> Optional arguement to specify the journal size for + the ext2/ext3 file system. + The size should be in the units expected by +\series bold +mkfs +\series default +, so for ext3 it should be in MB. + If this is option is not used, the ext2/ext3 filesystem will be configured + with the default journal size. +\end_deeper +\layout Description + +--add\SpecialChar ~ +lov Creates an LOV with the specified parameters. + The +\emph on +mds_name +\emph default + must already exist in the descriptor. +\begin_deeper +\layout Description + +--lov\SpecialChar ~ +<name> Specify LOV name. +\layout Description + +--mds\SpecialChar ~ +<name> Specify the mds name. +\layout Description + +--stripe_sz\SpecialChar ~ +<size> Specify the stripe size in bytes. +\layout Description + +--stripe_cnt\SpecialChar ~ +<count> A value of 0 for this means to stripe on all available + OSTs. + Default is 0. +\layout Description + +--stripe_pattern\SpecialChar ~ +<pattern> Only Pattern 0 (RAID 0) is supported currently. +\end_deeper +\layout Description + +--add\SpecialChar ~ +ost Creates an OBD, OST, and OSC. + The OST and OBD are created on the specified node. +\begin_deeper +\layout Description + +--ost\SpecialChar ~ +<name> Assign a name to the OST device. +\layout Description + +--node\SpecialChar ~ +<nodename> Node on which the OST service is run, can not be a profile + node. +\layout Description + +--failover Enable failover support on OST. +\layout Description + +--dev\SpecialChar ~ +<pathname> Path of device on local system. + If this is a file, then a loop device is created and used as the block + device. +\layout Description + +--backdev\SpecialChar ~ +<pathname> Path of the device for backing storage on local system. +\layout Description + +--size\SpecialChar ~ +[size] Optional argument indicating the size (in KB) of the device + to be created (used typically for loop devices). +\layout Description + +--osdtype\SpecialChar ~ +obdfilter|obdecho Specify the type of OSD. +\layout Description + +--lov\SpecialChar ~ +<name> Optional arguement. + Name of LOV to which this OSC will be attached. + +\layout Description + +--ostuuid\SpecialChar ~ +UUID Specify the UUID of the OST device. + +\layout Description + +--fstype\SpecialChar ~ +extN|ext3 Optional arguement used to specify the file system type. + Default is ext3. +\layout Description + +--backfstype\SpecialChar ~ +ext3|tmpfs Optional argument to specify the backing filesystem + type. +\layout Description + +--inode_size\SpecialChar ~ +<size> Specify new inode size for underlying ext3 file system. +\layout Description + +--nspath Local mount point of server namespace. +\layout Description + +--mkfsoptions\SpecialChar ~ +<options> Optional argument to mkfs. +\layout Description + +--mountfsoptions\SpecialChar ~ +<options> Optional argument to mount fs. + Mount options will be passed by this argument. + For example, extents are to be enabled by adding ",extents" to the --mountfsopt +ions option. + +\begin_inset Quotes eld +\end_inset + +errors=remount-ro +\begin_inset Quotes erd +\end_inset + + and +\begin_inset Quotes eld +\end_inset + +asyncdel +\begin_inset Quotes erd +\end_inset + + can also be added to it. +\layout Description + +--journal_size\SpecialChar ~ +<size> Optional arguement to specify the journal size for + the ext2/ext3 file system. + The size should be in the units expected by +\series bold +mkfs +\series default +, so for ext3 it should be in MB. + If this is option is not used, the ext2/ext3 filesystem will be configured + with the default journal size. +\end_deeper +\layout Description + +--add\SpecialChar ~ +mtpt Creates a mount-point on the specified node. + Either an LOV or OSC name can be used. +\begin_deeper +\layout Description + +--node\SpecialChar ~ +node Node or profile node that will use the +\emph on +mtpt +\emph default +. +\layout Description + +--path\SpecialChar ~ +/mnt/path Specify the mountpoint for Lustre. +\layout Description + +--mds\SpecialChar ~ +mds_name Specify the mds name, which will provide service for this + client. +\layout Description + +--ost\SpecialChar ~ +ost_name\SpecialChar ~ +|\SpecialChar ~ +--lov\SpecialChar ~ +lov_name Specify the ost or lov, which will provide service + for this client. +\layout Description + +--clientoptions Specify the options for Lustre, such as async. +\end_deeper +\layout Description + +--add\SpecialChar ~ +route Creates a static route through a gateway to a specific +\emph on +nid +\emph default + or a range of +\emph on +nid +\emph default +'s. +\begin_deeper +\layout Description + +--node\SpecialChar ~ +node Node to add the route to. +\layout Description + +--router Optional flag to mark a node as router. +\layout Description + +--gw\SpecialChar ~ +nid The +\emph on +nid +\emph default + of the gateway (must be a local interface or a peer). +\layout Description + +--gateway_cluster_id\SpecialChar ~ +id Specify the id of the cluster, to which the gateway + belongs. +\layout Description + +--target_cluster_id\SpecialChar ~ +id Specify the id of the cluster, to which the target + of the route belongs. +\layout Description + +--lo\SpecialChar ~ +nid For a range route, this is the lo value +\emph on +nid. +\layout Description + +--hi\SpecialChar ~ +nid For a range route, this is the hi value +\emph on +nid. +\end_deeper +\layout Description + +--add\SpecialChar ~ +echo-client Used for testing purpose only. + +\begin_deeper +\layout Description + +--node\SpecialChar ~ +nodename +\emph on + +\emph default +Node on which the echo-client resides. +\end_deeper +\layout Description + +--add\SpecialChar ~ +mgmt Management/monitoring service. +\begin_deeper +\layout Description + +--node\SpecialChar ~ +nodename +\emph on + +\emph default +Node on which the mgmt service resides. +\layout Description + +--mgmt\SpecialChar ~ +<mgmt_service_name> Specify management/monitoring service name. +\end_deeper +\layout List +\labelwidthstring 00.00.0000 + + +\series bold +--add\SpecialChar ~ +cobd +\series default +Create the cobd on the specified node. +\begin_deeper +\layout Description +\noindent \align left +--node\SpecialChar ~ +nodename +\emph on + +\emph default +Node on which the cobd resides. +\layout Description + +--cache_obd\SpecialChar ~ +obd_name Specify the cache device for the cache obd system. +\layout Description + +--real_obd\SpecialChar ~ +obd_name +\emph on + +\emph default +Specify the real device for the cache obd system. +\end_deeper +\layout List +\labelwidthstring 00.00.0000 + + +\series bold +Options +\layout Description + +--reference Print short reference for commands. +\layout Description + +--verbose Print system commands as they are run. +\layout Description + +--batch\SpecialChar ~ +filename Used to execute lmc commands in batch mode. +\layout Description + +--output\SpecialChar ~ +filename Send output to the file. + If the file exists, it will be overwritten. +\layout Description + +--merge\SpecialChar ~ +filename +\emph on + +\emph default +Add the new element to an existing file. + +\layout Subsection + +EXAMPLES +\layout Standard + +Real life examples are given in the Lustre-conf manual page. +\layout Subsection + +BUGS +\layout Standard + +None are known. +\the_end diff --git a/lustre/include/liblustre.h b/lustre/include/liblustre.h index 9f290a8dc4..3c602cd8f9 100644 --- a/lustre/include/liblustre.h +++ b/lustre/include/liblustre.h @@ -25,7 +25,6 @@ #define LIBLUSTRE_H__ #include <sys/mman.h> -#include <asm/byteorder.h> #ifndef __CYGWIN__ #include <stdint.h> #include <asm/page.h> @@ -127,13 +126,6 @@ struct file; /* forward ref */ typedef int (write_proc_t)(struct file *file, const char *buffer, unsigned long count, void *data); -# define le16_to_cpu(x) __le16_to_cpu(x) -# define cpu_to_le16(x) __cpu_to_le16(x) -# define le32_to_cpu(x) __le32_to_cpu(x) -# define cpu_to_le32(x) __cpu_to_le32(x) -# define le64_to_cpu(x) __le64_to_cpu(x) -# define cpu_to_le64(x) __cpu_to_le64(x) - #define NIPQUAD(addr) \ ((unsigned char *)&addr)[0], \ ((unsigned char *)&addr)[1], \ @@ -352,9 +344,9 @@ static inline int kmem_cache_destroy(kmem_cache_t *a) #define kmem_cache_alloc(cache, prio) malloc(cache->size) #define kmem_cache_free(cache, obj) free(obj) -#define PAGE_CACHE_SIZE PAGE_SIZE -#define PAGE_CACHE_SHIFT 12 -#define PAGE_CACHE_MASK PAGE_MASK +#define PAGE_CACHE_SIZE PAGE_SIZE +#define PAGE_CACHE_SHIFT PAGE_SHIFT +#define PAGE_CACHE_MASK PAGE_MASK struct page { void *addr; @@ -638,7 +630,7 @@ static inline int schedule_timeout(signed long t) _ret = tv.tv_sec; \ _ret; \ }) -#define time_after(a, b) ((long)(b) - (long)(a) > 0) +#define time_after(a, b) ((long)(b) - (long)(a) < 0) #define time_before(a, b) time_after(b,a) struct timer_list { @@ -707,9 +699,11 @@ typedef enum { CAP_SET=1 } cap_flag_value_t; -#define CAP_FOWNER 3 -#define CAP_FSETID 4 -#define CAP_SYS_ADMIN 21 +#define CAP_DAC_OVERRIDE 1 +#define CAP_DAC_READ_SEARCH 2 +#define CAP_FOWNER 3 +#define CAP_FSETID 4 +#define CAP_SYS_ADMIN 21 cap_t cap_get_proc(void); int cap_get_flag(cap_t, cap_value_t, cap_flag_t, cap_flag_value_t *); diff --git a/lustre/include/linux/Makefile.am b/lustre/include/linux/Makefile.am index b170c5c119..77c7afd358 100644 --- a/lustre/include/linux/Makefile.am +++ b/lustre/include/linux/Makefile.am @@ -3,6 +3,12 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution +linuxdir = $(includedir)/linux + +if UTILS +linux_HEADERS = lustre_idl.h +endif + EXTRA_DIST = lprocfs_status.h lustre_debug.h lustre_ha.h lustre_lib.h \ lustre_mgmt.h obd_cache.h obd_lov.h lustre_dlm.h lustre_handles.h \ lustre_net.h obd_class.h obd_ost.h obd_support.h lustre_commit_confd.h \ diff --git a/lustre/include/linux/lprocfs_status.h b/lustre/include/linux/lprocfs_status.h index 27121366b4..44dff5b593 100644 --- a/lustre/include/linux/lprocfs_status.h +++ b/lustre/include/linux/lprocfs_status.h @@ -273,11 +273,22 @@ void lprocfs_oh_tally_log2(struct obd_histogram *oh, unsigned int value); void lprocfs_oh_clear(struct obd_histogram *oh); unsigned long lprocfs_oh_sum(struct obd_histogram *oh); +struct obd_service_time; +void lprocfs_stime_record(struct obd_service_time *stime, + struct timeval *large, struct timeval *small); +unsigned long lprocfs_stime_avg_ms(struct obd_service_time *stime); +unsigned long lprocfs_stime_avg_us(struct obd_service_time *stime); + /* lprocfs_status.c: counter read/write functions */ extern int lprocfs_counter_read(char *page, char **start, off_t off, int count, int *eof, void *data); extern int lprocfs_counter_write(struct file *file, const char *buffer, unsigned long count, void *data); + +/* lprocfs_status.c: recovery status */ +int lprocfs_obd_rd_recovery_status(char *page, char **start, off_t off, + int count, int *eof, void *data); + #else /* LPROCFS is not defined */ static inline void lprocfs_counter_add(struct lprocfs_stats *stats, @@ -288,6 +299,11 @@ static inline void lprocfs_counter_init(struct lprocfs_stats *stats, int index, unsigned conf, const char *name, const char *units) { return; } +struct obd_service_time; +static inline void lprocfs_stime_record(struct obd_service_time *stime, + struct timeval *large, struct timeval *small) +{ return; } + static inline struct lprocfs_stats* lprocfs_alloc_stats(unsigned int num) { return NULL; } diff --git a/lustre/include/linux/lustre_cfg.h b/lustre/include/linux/lustre_cfg.h index eb17e8dd2f..fe446e5e1b 100644 --- a/lustre/include/linux/lustre_cfg.h +++ b/lustre/include/linux/lustre_cfg.h @@ -38,6 +38,8 @@ enum lcfg_command_type { LCFG_SET_UPCALL = 0x00cf00a, LCFG_LOV_ADD_OBD = 0x00cf00b, LCFG_LOV_DEL_OBD = 0x00cf00c, + LCFG_ADD_CONN = 0x00cf00d, + LCFG_DEL_CONN = 0x00cf00e, }; struct lustre_cfg { @@ -277,7 +279,6 @@ struct lustre_mount_data { uint32_t lmd_nal; uint32_t lmd_server_ipaddr; uint32_t lmd_port; - uint32_t lmd_clone_index; char lmd_mds[64]; char lmd_profile[64]; }; diff --git a/lustre/include/linux/lustre_compat25.h b/lustre/include/linux/lustre_compat25.h index 48ba509b43..f976cda68a 100644 --- a/lustre/include/linux/lustre_compat25.h +++ b/lustre/include/linux/lustre_compat25.h @@ -151,8 +151,23 @@ static inline void lustre_daemonize_helper(void) current->signal->tty = NULL; } +#define __set_page_ll_data(page, llap) \ + do { \ + page_cache_get(page); \ + SetPagePrivate(page); \ + page->private = (unsigned long)llap; \ + } while (0) +#define __clear_page_ll_data(page) \ + do { \ + ClearPagePrivate(page); \ + page_cache_release(page); \ + page->private = 0; \ + } while(0) + #define smp_num_cpus NR_CPUS +#define kiobuf bio + #include <linux/proc_fs.h> #else /* 2.4.. */ @@ -226,17 +241,33 @@ static inline void lustre_daemonize_helper(void) static inline void cond_resched(void) { if (unlikely(need_resched())) { - set_curret_state(TASK_RUNNING); + set_current_state(TASK_RUNNING); schedule(); } } #endif +static inline int mapping_mapped(struct address_space *mapping) +{ + return mapping->i_mmap_shared ? 1 : 0; +} + /* to find proc_dir_entry from inode. 2.6 has native one -bzzz */ #ifndef HAVE_PDE #define PDE(ii) ((ii)->u.generic_ip) #endif +#define __set_page_ll_data(page, llap) page->private = (unsigned long)llap +#define __clear_page_ll_data(page) page->private = 0 +#define PageWriteback(page) 0 +#define end_page_writeback(page) + +#ifdef ZAP_PAGE_RANGE_VMA +#define ll_zap_page_range(vma, addr, len) zap_page_range(vma, addr, len) +#else +#define ll_zap_page_range(vma, addr, len) zap_page_range(vma->vm_mm, addr, len) +#endif + #endif /* end of 2.4 compat macros */ #ifdef HAVE_PAGE_LIST @@ -276,5 +307,37 @@ static inline int mapping_has_pages(struct address_space *mapping) } #endif +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7)) +#define ll_set_dflags(dentry, flags) do { dentry->d_vfs_flags |= flags; } while(0) +#define ll_vfs_symlink(dir, dentry, path, mode) vfs_symlink(dir, dentry, path) +#else +#define ll_set_dflags(dentry, flags) do { \ + spin_lock(&dentry->d_lock); \ + dentry->d_flags |= flags; \ + spin_unlock(&dentry->d_lock); \ + } while(0) +#define ll_vfs_symlink(dir, dentry, path, mode) vfs_symlink(dir, dentry, path, mode) +#endif + +#ifdef HAVE_I_ALLOC_SEM +#define UP_WRITE_I_ALLOC_SEM(i) do { up_write(&(i)->i_alloc_sem); } while (0) +#define DOWN_WRITE_I_ALLOC_SEM(i) do { down_write(&(i)->i_alloc_sem); } while(0) +#define LASSERT_MDS_ORPHAN_WRITE_LOCKED(i) LASSERT(down_read_trylock(&(i)->i_alloc_sem) == 0) + +#define UP_READ_I_ALLOC_SEM(i) do { up_read(&(i)->i_alloc_sem); } while (0) +#define DOWN_READ_I_ALLOC_SEM(i) do { down_read(&(i)->i_alloc_sem); } while (0) +#define LASSERT_MDS_ORPHAN_READ_LOCKED(i) LASSERT(down_write_trylock(&(i)->i_alloc_sem) == 0) +#define MDS_PACK_MD_LOCK 1 +#else +#define UP_READ_I_ALLOC_SEM(i) do { up(&(i)->i_sem); } while (0) +#define DOWN_READ_I_ALLOC_SEM(i) do { down(&(i)->i_sem); } while (0) +#define LASSERT_MDS_ORPHAN_READ_LOCKED(i) LASSERT(down_trylock(&(i)->i_sem) != 0) + +#define UP_WRITE_I_ALLOC_SEM(i) do { up(&(i)->i_sem); } while (0) +#define DOWN_WRITE_I_ALLOC_SEM(i) do { down(&(i)->i_sem); } while (0) +#define LASSERT_MDS_ORPHAN_WRITE_LOCKED(i) LASSERT(down_trylock(&(i)->i_sem) != 0) +#define MDS_PACK_MD_LOCK 0 +#endif + #endif /* __KERNEL__ */ #endif /* _COMPAT25_H */ diff --git a/lustre/include/linux/lustre_fsfilt.h b/lustre/include/linux/lustre_fsfilt.h index 5c3f9c5674..028796448a 100644 --- a/lustre/include/linux/lustre_fsfilt.h +++ b/lustre/include/linux/lustre_fsfilt.h @@ -62,11 +62,7 @@ struct fsfilt_operations { int (* fs_get_md)(struct inode *inode, void *md, int size); /* this method is needed to make IO operation fsfilt nature depend. */ -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) - int (* fs_send_bio)(struct inode *inode, struct bio *bio); -#else - int (* fs_send_bio)(struct inode *inode, struct kiobuf *bio); -#endif + int (* fs_send_bio)(int rw, struct inode *inode,struct kiobuf *bio); /* methods for getting page from backing fs and putting page there * during IO. Used on OST. */ @@ -75,8 +71,10 @@ struct fsfilt_operations { ssize_t (* fs_readpage)(struct file *file, char *buf, size_t count, loff_t *offset); - int (* fs_add_journal_cb)(struct obd_device *obd, struct super_block *sb, - __u64 last_rcvd, void *handle, fsfilt_cb_t cb_func, + int (* fs_add_journal_cb)(struct obd_device *obd, + struct super_block *sb, + __u64 last_rcvd, void *handle, + fsfilt_cb_t cb_func, void *cb_data); int (* fs_statfs)(struct super_block *sb, struct obd_statfs *osfs); int (* fs_sync)(struct super_block *sb); @@ -391,17 +389,15 @@ fsfilt_get_md(struct obd_device *obd, struct inode *inode, return obd->obd_fsops->fs_get_md(inode, md, size); } -#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) -static inline int -fsfilt_send_bio(struct obd_device *obd, struct inode *inode, - struct bio *bio) -#else -static inline int -fsfilt_send_bio(struct obd_device *obd, struct inode *inode, - struct kiobuf *bio) -#endif +static inline int fsfilt_send_bio(int rw, struct obd_device *obd, + struct inode *inode, void *bio) { - return obd->obd_fsops->fs_send_bio(inode, bio); + LASSERTF(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ, "%x\n", rw); + + if (rw == OBD_BRW_READ) + return obd->obd_fsops->fs_send_bio(READ, inode, bio); + else + return obd->obd_fsops->fs_send_bio(WRITE, inode, bio); } static inline int diff --git a/lustre/include/linux/lustre_idl.h b/lustre/include/linux/lustre_idl.h index 8fb130376f..66e79f15cd 100644 --- a/lustre/include/linux/lustre_idl.h +++ b/lustre/include/linux/lustre_idl.h @@ -265,6 +265,7 @@ typedef uint32_t obd_count; #define OBD_FL_NORPC (0x00000008) // if set in o_flags set in OSC not OST #define OBD_FL_IDONLY (0x00000010) // if set in o_flags only adjust obj id #define OBD_FL_RECREATE_OBJS (0x00000020) // recreate missing obj +#define OBD_FL_DEBUG_CHECK (0x00000040) /* echo client/server debug check */ #define OBD_INLINESZ 64 @@ -272,10 +273,10 @@ typedef uint32_t obd_count; struct obdo { obd_id o_id; obd_gr o_gr; - obd_time o_atime; + obd_size o_size; obd_time o_mtime; + obd_time o_atime; obd_time o_ctime; - obd_size o_size; obd_blocks o_blocks; /* brw: cli sent cached bytes */ obd_size o_grant; obd_blksize o_blksize; /* optimal IO blocksize */ @@ -286,7 +287,7 @@ struct obdo { obd_count o_nlink; /* brw: checksum */ obd_count o_generation; obd_flag o_valid; /* hot fields in this obdo */ - obd_count o_misc; + obd_count o_misc; /* brw: o_dropped */ __u32 o_easize; /* epoch in ost writes */ __u32 o_mds; __u32 o_padding; @@ -501,7 +502,7 @@ struct mds_req_sec_desc *lustre_swab_mds_secdesc(struct ptlrpc_request *req, /* opcodes */ typedef enum { MDS_GETATTR = 33, - MDS_GETATTR_NAME = 34, + MDS_GETATTR_LOCK = 34, MDS_CLOSE = 35, MDS_REINT = 36, MDS_READPAGE = 37, @@ -533,13 +534,13 @@ typedef enum { #define REINT_MAX 8 /* the disposition of the intent outlines what was executed */ -#define DISP_IT_EXECD 1 -#define DISP_LOOKUP_EXECD (1 << 1) -#define DISP_LOOKUP_NEG (1 << 2) -#define DISP_LOOKUP_POS (1 << 3) -#define DISP_OPEN_CREATE (1 << 4) -#define DISP_OPEN_OPEN (1 << 5) -#define DISP_ENQ_COMPLETE (1<<6) +#define DISP_IT_EXECD 0x01 +#define DISP_LOOKUP_EXECD 0x02 +#define DISP_LOOKUP_NEG 0x04 +#define DISP_LOOKUP_POS 0x08 +#define DISP_OPEN_CREATE 0x10 +#define DISP_OPEN_OPEN 0x20 +#define DISP_ENQ_COMPLETE 0x40 /* INODE LOCK PARTS */ #define MDS_INODELOCK_LOOKUP 0x000001 /* dentry, mode, owner, group */ @@ -887,13 +888,6 @@ struct ptlbd_rsp { extern void lustre_swab_ptlbd_rsp (struct ptlbd_rsp *r); -#define CLONE_INFO_MAGIC 0x0218 -struct clonefs_info { - int clone_magic; - int clone_index; - int clone_flags; -}; -extern void lustre_swab_clonefs_info(struct clonefs_info *clone); /* * Opcodes for management/monitoring node. */ diff --git a/lustre/include/linux/lustre_import.h b/lustre/include/linux/lustre_import.h index 56aed70b26..e7230d0fe1 100644 --- a/lustre/include/linux/lustre_import.h +++ b/lustre/include/linux/lustre_import.h @@ -46,6 +46,14 @@ enum obd_import_event { IMP_EVENT_ACTIVE = 0x808004, }; +struct obd_import_conn { + struct list_head oic_item; + struct ptlrpc_connection *oic_conn; + struct obd_uuid oic_uuid; + unsigned long oic_last_attempt; /* in jiffies */ +}; + + struct obd_import { struct portals_handle imp_handle; atomic_t imp_refcount; @@ -76,7 +84,11 @@ struct obd_import { struct lustre_handle imp_remote_handle; unsigned long imp_next_ping; unsigned long imp_connect_start; - + + /* all available obd_import_conn linked here */ + struct list_head imp_conn_list; + struct obd_import_conn *imp_conn_current; + /* Protects flags, level, generation, conn_cnt, *_list */ spinlock_t imp_lock; diff --git a/lustre/include/linux/lustre_lib.h b/lustre/include/linux/lustre_lib.h index 6f1f96d91d..7a9d350f74 100644 --- a/lustre/include/linux/lustre_lib.h +++ b/lustre/include/linux/lustre_lib.h @@ -35,8 +35,7 @@ # include <linux/signal.h> # include <linux/types.h> #endif -#include <linux/portals_lib.h> -#include <linux/kp30.h> /* XXX just for LASSERT! */ +#include <linux/kp30.h> #include <linux/lustre_idl.h> #include <linux/lustre_cfg.h> @@ -88,6 +87,7 @@ void target_start_recovery_timer(struct obd_device *obd); int target_start_recovery_thread(struct obd_device *obd, svc_handler_t handler); void target_stop_recovery_thread(struct obd_device *obd); +void target_cleanup_recovery(struct obd_device *obd); int target_queue_recovery_request(struct ptlrpc_request *req, struct obd_device *obd); int target_queue_final_reply(struct ptlrpc_request *req, int rc); @@ -125,8 +125,6 @@ void l_unlock(struct lustre_lock *); int l_has_lock(struct lustre_lock *); -#include <linux/portals_lib.h> - /* * OBD IOCTLS */ @@ -190,60 +188,60 @@ static inline int obd_ioctl_packlen(struct obd_ioctl_data *data) static inline int obd_ioctl_is_invalid(struct obd_ioctl_data *data) { if (data->ioc_len > (1<<30)) { - printk("LustreError: OBD ioctl: ioc_len larger than 1<<30\n"); + CERROR("OBD ioctl: ioc_len larger than 1<<30\n"); return 1; } if (data->ioc_inllen1 > (1<<30)) { - printk("LustreError: OBD ioctl: ioc_inllen1 larger than 1<<30\n"); + CERROR("OBD ioctl: ioc_inllen1 larger than 1<<30\n"); return 1; } if (data->ioc_inllen2 > (1<<30)) { - printk("LustreError: OBD ioctl: ioc_inllen2 larger than 1<<30\n"); + CERROR("OBD ioctl: ioc_inllen2 larger than 1<<30\n"); return 1; } if (data->ioc_inllen3 > (1<<30)) { - printk("LustreError: OBD ioctl: ioc_inllen3 larger than 1<<30\n"); + CERROR("OBD ioctl: ioc_inllen3 larger than 1<<30\n"); return 1; } if (data->ioc_inllen4 > (1<<30)) { - printk("LustreError: OBD ioctl: ioc_inllen4 larger than 1<<30\n"); + CERROR("OBD ioctl: ioc_inllen4 larger than 1<<30\n"); return 1; } if (data->ioc_inlbuf1 && !data->ioc_inllen1) { - printk("LustreError: OBD ioctl: inlbuf1 pointer but 0 length\n"); + CERROR("OBD ioctl: inlbuf1 pointer but 0 length\n"); return 1; } if (data->ioc_inlbuf2 && !data->ioc_inllen2) { - printk("LustreError: OBD ioctl: inlbuf2 pointer but 0 length\n"); + CERROR("OBD ioctl: inlbuf2 pointer but 0 length\n"); return 1; } if (data->ioc_inlbuf3 && !data->ioc_inllen3) { - printk("LustreError: OBD ioctl: inlbuf3 pointer but 0 length\n"); + CERROR("OBD ioctl: inlbuf3 pointer but 0 length\n"); return 1; } if (data->ioc_inlbuf4 && !data->ioc_inllen4) { - printk("LustreError: OBD ioctl: inlbuf4 pointer but 0 length\n"); + CERROR("OBD ioctl: inlbuf4 pointer but 0 length\n"); return 1; } if (data->ioc_pbuf1 && !data->ioc_plen1) { - printk("LustreError: OBD ioctl: pbuf1 pointer but 0 length\n"); + CERROR("OBD ioctl: pbuf1 pointer but 0 length\n"); return 1; } if (data->ioc_pbuf2 && !data->ioc_plen2) { - printk("LustreError: OBD ioctl: pbuf2 pointer but 0 length\n"); + CERROR("OBD ioctl: pbuf2 pointer but 0 length\n"); return 1; } if (data->ioc_plen1 && !data->ioc_pbuf1) { - printk("LustreError: OBD ioctl: plen1 set but NULL pointer\n"); + CERROR("OBD ioctl: plen1 set but NULL pointer\n"); return 1; } if (data->ioc_plen2 && !data->ioc_pbuf2) { - printk("LustreError: OBD ioctl: plen2 set but NULL pointer\n"); + CERROR("OBD ioctl: plen2 set but NULL pointer\n"); return 1; } if (obd_ioctl_packlen(data) != data->ioc_len) { - printk("LustreError: OBD ioctl: packlen exceeds ioc_len (%d != %d)\n", - obd_ioctl_packlen(data), data->ioc_len); + CERROR("OBD ioctl: packlen exceeds ioc_len (%d != %d)\n", + obd_ioctl_packlen(data), data->ioc_len); return 1; } return 0; @@ -344,7 +342,7 @@ static inline int obd_ioctl_getdata(char **buf, int *len, void *arg) } if (hdr.ioc_len < sizeof(struct obd_ioctl_data)) { - printk("LustreError: OBD: user buffer too small for ioctl\n"); + CERROR("OBD: user buffer too small for ioctl\n"); return -EINVAL; } @@ -504,13 +502,9 @@ static inline void ost_checksum(obd_count *cksum, void *addr, int len) static inline int ll_insecure_random_int(void) { -#ifdef __arch_um__ struct timeval t; do_gettimeofday(&t); return (int)(t.tv_usec); -#else - return (int)(get_cycles() >> 2); -#endif } /* @@ -657,13 +651,26 @@ do { \ #else /* !__KERNEL__ */ #define __l_wait_event(wq, condition, info, ret, excl) \ do { \ + int timeout = info->lwi_timeout, elapse; \ int __timed_out = 0; \ + long last; \ \ + last = time(NULL); \ for (;;) { \ if (condition) \ break; \ - if (liblustre_wait_event(info->lwi_timeout)) \ + if (liblustre_wait_event(timeout)) { \ + if (timeout == 0) \ + continue; \ + elapse = (int) (time(NULL) - last); \ + if (elapse) { \ + last += elapse; \ + timeout -= elapse; \ + if (timeout < 0) \ + timeout = 0; \ + } \ continue; \ + } \ if (info->lwi_timeout && !__timed_out) { \ __timed_out = 1; \ if (info->lwi_on_timeout == NULL || \ diff --git a/lustre/include/linux/lustre_log.h b/lustre/include/linux/lustre_log.h index b6e00cb38c..1694a5f5d6 100644 --- a/lustre/include/linux/lustre_log.h +++ b/lustre/include/linux/lustre_log.h @@ -121,15 +121,16 @@ int llog_cat_half_bottom(struct llog_cookie *, struct llog_handle *); /* llog_lvfs.c */ int llog_get_cat_list(struct lvfs_run_ctxt *, struct fsfilt_operations *, - char *name, int count, struct llog_catid *idarray); -int llog_put_cat_list(struct lvfs_run_ctxt *, struct fsfilt_operations *, - char *name, int count, struct llog_catid *idarray); + const char *name, int count, struct llog_catid *idarray); +int llog_put_cat_list(struct lvfs_run_ctxt *, struct fsfilt_operations *, + const char *name, int count, struct llog_catid *idarray); + extern struct llog_operations llog_lvfs_ops; int llog_obd_origin_setup(struct obd_device *, struct obd_llogs *, int, struct obd_device *, int, struct llog_logid *); -int obd_llog_cat_initialize(struct obd_device *, struct obd_llogs *, int, char *); +int obd_llog_cat_initialize(struct obd_device *, struct obd_llogs *, int, const char *); /* llog_obd.c - obd llog api */ int obd_llog_setup(struct obd_device *obd, struct obd_llogs *, int index, @@ -213,7 +214,7 @@ struct llog_ctxt { struct obd_import *loc_imp; /* to use in RPC's: can be backward pointing import */ struct llog_canceld_ctxt *loc_llcd; - struct semaphore loc_sem; /* protects loc_llcd */ + struct semaphore loc_sem; /* protects loc_llcd and loc_imp */ void *llog_proc_cb; struct obd_llogs *loc_llogs; }; diff --git a/lustre/include/linux/lustre_mds.h b/lustre/include/linux/lustre_mds.h index 04fbe090e1..c125662e00 100644 --- a/lustre/include/linux/lustre_mds.h +++ b/lustre/include/linux/lustre_mds.h @@ -77,23 +77,6 @@ struct mds_update_record { #define _ur_cap ur_uc.luc_cap #define _ur_uid ur_uc.luc_uid -/* i_attr_flags holds the open count in the inode in 2.4 */ -//XXX Alex implement on 2.4 with i_attr_flags and find soln for 2.5 please -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)) -# define mds_inode_oatomic(inode) ((atomic_t *)&(inode)->i_cindex) -#else -# define mds_inode_oatomic(inode) ((atomic_t *)&(inode)->i_attr_flags) -#endif - -# define mds_open_orphan_count(inode) \ - atomic_read(mds_inode_oatomic(inode)) -# define mds_open_orphan_inc(inode) \ - atomic_inc(mds_inode_oatomic(inode)) -# define mds_open_orphan_dec_test(inode) \ - atomic_dec_and_test(mds_inode_oatomic(inode)) - -#define mds_inode_is_orphan(inode) ((inode)->i_flags & 0x4000000) -#define mds_inode_set_orphan(inode) (inode)->i_flags |= 0x4000000 #define MDS_LR_SERVER_SIZE 512 diff --git a/lustre/include/linux/lustre_net.h b/lustre/include/linux/lustre_net.h index 107d849ef4..f3569c0040 100644 --- a/lustre/include/linux/lustre_net.h +++ b/lustre/include/linux/lustre_net.h @@ -87,32 +87,29 @@ * buffers */ #define SVC_BUF_VMALLOC_THRESHOLD (2*PAGE_SIZE) -/* The following constants determine how much memory is devoted to - * buffering in the lustre services. +/* The following constants determine how memory is used to buffer incoming + * service requests. * - * ?_NEVENTS # event queue entries - * - * ?_NBUFS # request buffers + * ?_NBUFS # buffers to allocate when growing the pool * ?_BUFSIZE # bytes in a single request buffer - * total memory = ?_NBUFS * ?_BUFSIZE - * * ?_MAXREQSIZE # maximum request service will receive - * messages larger than ?_MAXREQSIZE are dropped. - * request buffers are auto-unlinked when less than ?_MAXREQSIZE - * is left in them. + * + * When fewer than ?_NBUFS/2 buffers are posted for receive, another chunk + * of ?_NBUFS is added to the pool. + * + * Messages larger than ?_MAXREQSIZE are dropped. Request buffers are + * considered full when less than ?_MAXREQSIZE is left in them. */ #define LDLM_NUM_THREADS min(smp_num_cpus * smp_num_cpus * 8, 64) -#define LDLM_NBUF_MAX 512UL +#define LDLM_NBUFS 64 #define LDLM_BUFSIZE (8 * 1024) #define LDLM_MAXREQSIZE (5 * 1024) -#define LDLM_MAXMEM (num_physpages*(PAGE_SIZE/1024)) -#define LDLM_NBUFS min(LDLM_MAXMEM/LDLM_BUFSIZE, LDLM_NBUF_MAX) #define MDT_MAX_THREADS 32UL #define MDT_NUM_THREADS max(min_t(unsigned long, num_physpages / 8192, \ MDT_MAX_THREADS), 2UL) -#define MDS_NBUF_MAX 4096UL +#define MDS_NBUFS (64 * smp_num_cpus) #define MDS_BUFSIZE (8 * 1024) /* Assume file name length = FNAME_MAX = 256 (true for extN). * path name length = PATH_MAX = 4096 @@ -129,13 +126,11 @@ * except in the open case where there are a large number of OSTs in a LOV. */ #define MDS_MAXREQSIZE (5 * 1024) -#define MDS_MAXMEM (num_physpages*(PAGE_SIZE/128)) -#define MDS_NBUFS min(MDS_MAXMEM/MDS_BUFSIZE, MDS_NBUF_MAX) #define OST_MAX_THREADS 36UL #define OST_NUM_THREADS max(min_t(unsigned long, num_physpages / 8192, \ OST_MAX_THREADS), 2UL) -#define OST_NBUF_MAX 5000UL +#define OST_NBUFS (64 * smp_num_cpus) #define OST_BUFSIZE (8 * 1024) /* OST_MAXREQSIZE ~= 1640 bytes = * lustre_msg + obdo + 16 * obd_ioobj + 64 * niobuf_remote @@ -144,11 +139,9 @@ * - OST_MAXREQSIZE must be at least 1 page of cookies plus some spillover */ #define OST_MAXREQSIZE (5 * 1024) -#define OST_MAXMEM (num_physpages*(PAGE_SIZE/128)) -#define OST_NBUFS min(OST_MAXMEM/OST_BUFSIZE, OST_NBUF_MAX) #define PTLBD_NUM_THREADS 4 -#define PTLBD_NBUFS 20 +#define PTLBD_NBUFS 64 #define PTLBD_BUFSIZE (32 * 1024) #define PTLBD_MAXREQSIZE 1024 @@ -324,6 +317,9 @@ struct ptlrpc_request { ptl_handle_md_t rq_req_md_h; struct ptlrpc_cb_id rq_req_cbid; + /* client-side... */ + struct timeval rq_rpcd_start; + /* server-side... */ struct timeval rq_arrival_time; /* request arrival time */ struct ptlrpc_reply_state *rq_reply_state; /* separated reply state */ @@ -345,6 +341,8 @@ struct ptlrpc_request { struct ptlrpc_bulk_desc *rq_bulk; /* client side bulk */ time_t rq_sent; /* when the request was sent */ + struct ptlrpc_service *rq_svc; + /* Multi-rpc bits */ struct list_head rq_set_chain; struct ptlrpc_request_set *rq_set; @@ -481,6 +479,7 @@ struct ptlrpc_service { struct list_head srv_list; /* chain thru all services */ int srv_max_req_size; /* biggest request to receive */ int srv_buf_size; /* size of individual buffers */ + int srv_nbuf_per_group; /* # buffers to allocate in 1 group */ int srv_nbufs; /* total # req buffer descs allocated */ int srv_nthreads; /* # running threads */ int srv_n_difficult_replies; /* # 'difficult' replies */ @@ -726,6 +725,12 @@ int client_connect_import(struct lustre_handle *conn, struct obd_device *obd, struct obd_uuid *cluuid, unsigned long); int client_disconnect_export(struct obd_export *exp, int failover); +int client_import_add_conn(struct obd_import *imp, struct obd_uuid *uuid, + int priority); +int client_import_del_conn(struct obd_import *imp, struct obd_uuid *uuid); +int import_set_conn_priority(struct obd_import *imp, struct obd_uuid *uuid); + + /* ptlrpc/pinger.c */ int ptlrpc_pinger_add_import(struct obd_import *imp); int ptlrpc_pinger_del_import(struct obd_import *imp); diff --git a/lustre/include/linux/lustre_smfs.h b/lustre/include/linux/lustre_smfs.h index b51d628ad2..62efd3c1f4 100644 --- a/lustre/include/linux/lustre_smfs.h +++ b/lustre/include/linux/lustre_smfs.h @@ -302,6 +302,7 @@ static inline void duplicate_inode(struct inode *dst_inode, dst_inode->i_version = src_inode->i_version; dst_inode->i_state = src_inode->i_state; dst_inode->i_generation = src_inode->i_generation; + dst_inode->i_flags = src_inode->i_flags; /* This is to make creating special files working. */ dst_inode->i_rdev = src_inode->i_rdev; diff --git a/lustre/include/linux/lvfs.h b/lustre/include/linux/lvfs.h index 73c7bc236d..3585660212 100644 --- a/lustre/include/linux/lvfs.h +++ b/lustre/include/linux/lvfs.h @@ -24,6 +24,7 @@ struct lvfs_ucred { __u32 luc_fsgid; __u32 luc_cap; __u32 luc_uid; + __u32 luc_umask; }; struct lvfs_callback_ops { diff --git a/lustre/include/linux/lvfs_linux.h b/lustre/include/linux/lvfs_linux.h index 5e125a01a6..ae27f81b12 100644 --- a/lustre/include/linux/lvfs_linux.h +++ b/lustre/include/linux/lvfs_linux.h @@ -8,11 +8,9 @@ #include <linux/module.h> #include <linux/fs.h> #include <linux/sched.h> -#include <linux/jbd.h> #include <linux/lvfs.h> /* we have made EXT3_IOC_SETFLAGS a Lustre constant */ -#include <linux/ext3_fs.h> #define l_file file #define l_dentry dentry diff --git a/lustre/include/linux/obd.h b/lustre/include/linux/obd.h index 9b56834711..4cf2769d05 100644 --- a/lustre/include/linux/obd.h +++ b/lustre/include/linux/obd.h @@ -60,7 +60,7 @@ struct lov_oinfo { /* per-stripe data structure */ struct list_head loi_write_item; struct list_head loi_read_item; - int loi_kms_valid:1; + unsigned loi_kms_valid:1; __u64 loi_kms; /* known minimum size */ __u64 loi_rss; /* recently seen size */ __u64 loi_mtime; /* recently seen mtime */ @@ -119,7 +119,8 @@ struct obd_type { }; struct brw_page { - obd_off off; + obd_off disk_offset; /* modulo PAGE_SIZE */ + obd_off page_offset; /* modulo PAGE_SIZE (obviously) */ struct page *pg; int count; obd_flag flag; @@ -165,6 +166,7 @@ struct oig_callback_context { * callees of this method are encouraged to abort their state * in the oig. This may be called multiple times. */ void (*occ_interrupted)(struct oig_callback_context *occ); + int interrupted; }; /* if we find more consumers this could be generalized */ @@ -174,6 +176,13 @@ struct obd_histogram { unsigned long oh_buckets[OBD_HIST_MAX]; }; +/* reports average service time with the help of lprocfs_status.c */ +struct obd_service_time { + __u32 st_num; + __u64 st_total_us; +}; + + struct ost_server_data; #define FILTER_SUBDIR_COUNT 32 /* set to zero for no subdirs */ @@ -249,10 +258,11 @@ struct filter_obd { struct mds_server_data; -#define OSC_MAX_RIF_DEFAULT 4 -#define OSC_MAX_RIF_MAX 32 -#define OSC_MAX_DIRTY_DEFAULT 4 -#define OSC_MAX_DIRTY_MB_MAX 256 /* totally arbitrary */ +#define OSC_MAX_RIF_DEFAULT 8 +#define OSC_MAX_RIF_MAX 64 +#define OSC_MAX_DIRTY_DEFAULT (4*OSC_MAX_RIF_DEFAULT*PTLRPC_MAX_BRW_SIZE>>20) +#define OSC_MAX_DIRTY_MB_MAX 512 /* totally arbitrary */ + struct mdc_rpc_lock; struct client_obd { @@ -284,7 +294,8 @@ struct client_obd { struct list_head cl_loi_ready_list; struct list_head cl_loi_write_list; struct list_head cl_loi_read_list; - int cl_brw_in_flight; + int cl_r_in_flight; + int cl_w_in_flight; /* just a sum of the loi/lop pending numbers to be exported by /proc */ int cl_pending_w_pages; int cl_pending_r_pages; @@ -294,11 +305,13 @@ struct client_obd { struct obd_histogram cl_write_rpc_hist; struct obd_histogram cl_read_page_hist; struct obd_histogram cl_write_page_hist; + struct obd_service_time cl_read_stime; + struct obd_service_time cl_write_stime; + struct obd_service_time cl_enter_stime; struct mdc_rpc_lock *cl_rpc_lock; struct mdc_rpc_lock *cl_setattr_lock; struct osc_creator cl_oscc; - void *cl_clone_info; }; /* Like a client, with some hangers-on. Keep mc_client_obd first so that we @@ -370,16 +383,11 @@ struct mds_obd { }; struct echo_obd { - struct obdo oa; - spinlock_t eo_lock; - __u64 eo_lastino; - atomic_t eo_getattr; - atomic_t eo_setattr; - atomic_t eo_create; - atomic_t eo_destroy; - atomic_t eo_prep; - atomic_t eo_read; - atomic_t eo_write; + struct obdo eo_oa; + spinlock_t eo_lock; + __u64 eo_lastino; + struct lustre_handle eo_nl_lock; + atomic_t eo_prep; }; /* @@ -411,8 +419,10 @@ struct recovd_obd { }; struct ost_obd { + spinlock_t ost_lock; struct ptlrpc_service *ost_service; struct ptlrpc_service *ost_create_service; + struct obd_service_time ost_stimes[6]; }; struct echo_client_obd { @@ -613,6 +623,9 @@ struct obd_device { struct timer_list obd_recovery_timer; struct list_head obd_recovery_queue; struct list_head obd_delayed_reply_queue; + time_t obd_recovery_start; + time_t obd_recovery_end; + union { struct filter_obd filter; @@ -662,6 +675,9 @@ struct obd_ops { int (*o_process_config)(struct obd_device *dev, obd_count len, void *data); int (*o_postrecov)(struct obd_device *dev); + int (*o_add_conn)(struct obd_import *imp, struct obd_uuid *uuid, + int priority); + int (*o_del_conn)(struct obd_import *imp, struct obd_uuid *uuid); int (*o_connect)(struct lustre_handle *conn, struct obd_device *src, struct obd_uuid *cluuid, unsigned long connect_flags); int (*o_connect_post)(struct obd_export *exp); diff --git a/lustre/include/linux/obd_class.h b/lustre/include/linux/obd_class.h index d5d24579f4..dd05896adf 100644 --- a/lustre/include/linux/obd_class.h +++ b/lustre/include/linux/obd_class.h @@ -47,6 +47,7 @@ /* OBD Device Declarations */ #define MAX_OBD_DEVICES 256 extern struct obd_device obd_dev[MAX_OBD_DEVICES]; +extern spinlock_t obd_dev_lock; /* OBD Operations Declarations */ extern struct obd_device *class_conn2obd(struct lustre_handle *); @@ -58,7 +59,8 @@ int class_register_type(struct obd_ops *ops, struct md_ops *md_ops, struct lprocfs_vars *, char *nm); int class_unregister_type(char *nm); -struct obd_device *class_newdev(int *dev); +struct obd_device *class_newdev(struct obd_type *type); +void class_release_dev(struct obd_device *obd); int class_name2dev(char *name); struct obd_device *class_name2obd(char *name); @@ -87,6 +89,8 @@ struct config_llog_instance { struct obd_uuid cfg_uuid; ptl_nid_t cfg_local_nid; }; +int class_config_parse_llog(struct llog_ctxt *ctxt, char *name, + struct config_llog_instance *cfg); int class_config_process_llog(struct llog_ctxt *ctxt, char *name, struct config_llog_instance *cfg); @@ -152,6 +156,7 @@ int class_connect(struct lustre_handle *conn, struct obd_device *obd, struct obd_uuid *cluuid); int class_disconnect(struct obd_export *exp, int failover); void class_disconnect_exports(struct obd_device *obddev, int failover); +void class_disconnect_stale_exports(struct obd_device *obddev, int failover); /* generic operations shared by various OBD types */ int class_multi_setup(struct obd_device *obddev, uint32_t len, void *data); int class_multi_cleanup(struct obd_device *obddev); @@ -623,6 +628,35 @@ static inline int obd_setattr(struct obd_export *exp, struct obdo *obdo, rc = OBP(exp->exp_obd, setattr)(exp, obdo, ea, oti); RETURN(rc); } +static inline int obd_add_conn(struct obd_import *imp, struct obd_uuid *uuid, + int priority) +{ + struct obd_device *obd = imp->imp_obd; + int rc; + ENTRY; + + OBD_CHECK_DEV_ACTIVE(obd); + OBD_CHECK_OP(obd, add_conn, -EOPNOTSUPP); + OBD_COUNTER_INCREMENT(obd, add_conn); + + rc = OBP(obd, add_conn)(imp, uuid, priority); + RETURN(rc); +} + +static inline int obd_del_conn(struct obd_import *imp, struct obd_uuid *uuid) +{ + struct obd_device *obd = imp->imp_obd; + int rc; + ENTRY; + + OBD_CHECK_DEV_ACTIVE(obd); + OBD_CHECK_OP(obd, del_conn, -EOPNOTSUPP); + OBD_COUNTER_INCREMENT(obd, del_conn); + + rc = OBP(obd, del_conn)(imp, uuid); + RETURN(rc); +} + static inline int obd_connect(struct lustre_handle *conn, struct obd_device *obd, struct obd_uuid *cluuid, diff --git a/lustre/include/linux/obd_support.h b/lustre/include/linux/obd_support.h index 9d7957eaa4..57623e89bf 100644 --- a/lustre/include/linux/obd_support.h +++ b/lustre/include/linux/obd_support.h @@ -36,7 +36,9 @@ extern atomic_t obd_memory; extern int obd_memmax; extern unsigned int obd_fail_loc; +extern unsigned int obd_dump_on_timeout; extern unsigned int obd_timeout; +extern unsigned int ldlm_timeout; extern char obd_lustre_upcall[128]; extern unsigned int obd_sync_filter; extern wait_queue_head_t obd_race_waitq; @@ -72,7 +74,7 @@ extern wait_queue_head_t obd_race_waitq; #define OBD_FAIL_MDS_GETSTATUS_PACK 0x11c #define OBD_FAIL_MDS_STATFS_PACK 0x11d #define OBD_FAIL_MDS_STATFS_NET 0x11e -#define OBD_FAIL_MDS_GETATTR_NAME_NET 0x11f +#define OBD_FAIL_MDS_GETATTR_LOCK_NET 0x11f #define OBD_FAIL_MDS_PIN_NET 0x120 #define OBD_FAIL_MDS_UNPIN_NET 0x121 #define OBD_FAIL_MDS_ALL_REPLY_NET 0x122 @@ -104,6 +106,9 @@ extern wait_queue_head_t obd_race_waitq; #define OBD_FAIL_OST_ALL_REQUESTS_NET 0x212 #define OBD_FAIL_OST_LDLM_REPLY_NET 0x213 #define OBD_FAIL_OST_BRW_PAUSE_BULK 0x214 +#define OBD_FAIL_OST_ENOSPC 0x215 +#define OBD_FAIL_OST_EROFS 0x216 + #define OBD_FAIL_LDLM 0x300 #define OBD_FAIL_LDLM_NAMESPACE_NEW 0x301 @@ -115,6 +120,10 @@ extern wait_queue_head_t obd_race_waitq; #define OBD_FAIL_LDLM_GL_CALLBACK 0x307 #define OBD_FAIL_LDLM_ENQUEUE_EXTENT_ERR 0x308 #define OBD_FAIL_LDLM_ENQUEUE_INTENT_ERR 0x309 +#define OBD_FAIL_LDLM_CREATE_RESOURCE 0x30a +#define OBD_FAIL_LDLM_ENQUEUE_BLOCKED 0x30b +#define OBD_FAIL_LDLM_REPLY 0x30c + #define OBD_FAIL_OSC 0x400 #define OBD_FAIL_OSC_BRW_READ_BULK 0x401 @@ -171,8 +180,8 @@ do { \ #define OBD_FAIL_TIMEOUT(id, secs) \ do { \ if (OBD_FAIL_CHECK_ONCE(id)) { \ - CERROR("obd_fail_timeout id %x sleeping for %d secs\n", \ - (id), (secs)); \ + CERROR("obd_fail_timeout id %x sleeping for %d secs\n", \ + (id), (secs)); \ set_current_state(TASK_UNINTERRUPTIBLE); \ schedule_timeout((secs) * HZ); \ set_current_state(TASK_RUNNING); \ diff --git a/lustre/include/lustre/Makefile.am b/lustre/include/lustre/Makefile.am index a785adaafe..fe47cb1881 100644 --- a/lustre/include/lustre/Makefile.am +++ b/lustre/include/lustre/Makefile.am @@ -3,7 +3,7 @@ # This code is issued under the GNU General Public License. # See the file COPYING in this distribution - +if UTILS pkginclude_HEADERS = lustre_user.h liblustreapi.h - -EXTRA_DIST = $(pkginclude_HEADERS) +endif +EXTRA_DIST = lustre_user.h liblustreapi.h diff --git a/lustre/include/lustre/lustre_user.h b/lustre/include/lustre/lustre_user.h index 16ebe76cc3..ab573c1953 100644 --- a/lustre/include/lustre/lustre_user.h +++ b/lustre/include/lustre/lustre_user.h @@ -29,9 +29,22 @@ #include <string.h> #endif +/* for statfs() */ +#define LL_SUPER_MAGIC 0x0BD00BD0 + + #define IOC_MDC_TYPE 'i' #define IOC_MDC_GETSTRIPE _IOWR(IOC_MDC_TYPE, 21, struct lov_mds_md *) +#ifndef EXT3_IOC_GETFLAGS +#define EXT3_IOC_GETFLAGS _IOR('f', 1, long) +#define EXT3_IOC_SETFLAGS _IOW('f', 2, long) +#define EXT3_IOC_GETVERSION _IOR('f', 3, long) +#define EXT3_IOC_SETVERSION _IOW('f', 4, long) +#define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) +#define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) +#endif + #define LL_IOC_GETFLAGS _IOR ('f', 151, long) #define LL_IOC_SETFLAGS _IOW ('f', 152, long) #define LL_IOC_CLRFLAGS _IOW ('f', 153, long) @@ -102,7 +115,7 @@ struct obd_uuid { static inline int obd_uuid_equals(struct obd_uuid *u1, struct obd_uuid *u2) { - return strcmp(u1->uuid, u2->uuid) == 0; + return strcmp((char *)u1->uuid, (char *)u2->uuid) == 0; } static inline int obd_uuid_empty(struct obd_uuid *uuid) @@ -112,7 +125,7 @@ static inline int obd_uuid_empty(struct obd_uuid *uuid) static inline void obd_str2uuid(struct obd_uuid *uuid, char *tmp) { - strncpy(uuid->uuid, tmp, sizeof(*uuid)); + strncpy((char *)uuid->uuid, tmp, sizeof(*uuid)); uuid->uuid[sizeof(*uuid) - 1] = '\0'; } diff --git a/lustre/kernel_patches/kernel_configs/config-linux-2.6.7-uml b/lustre/kernel_patches/kernel_configs/config-linux-2.6.7-uml new file mode 100644 index 0000000000..1ca56145dd --- /dev/null +++ b/lustre/kernel_patches/kernel_configs/config-linux-2.6.7-uml @@ -0,0 +1,353 @@ +# +# Automatically generated make config: don't edit +# +CONFIG_USERMODE=y +CONFIG_MMU=y +CONFIG_UID16=y +CONFIG_RWSEM_GENERIC_SPINLOCK=y + +# +# UML-specific options +# +CONFIG_MODE_TT=y +# CONFIG_MODE_SKAS is not set +CONFIG_NET=y +CONFIG_BINFMT_ELF=y +CONFIG_BINFMT_MISC=y +CONFIG_HOSTFS=y +# CONFIG_HPPFS is not set +CONFIG_MCONSOLE=y +CONFIG_MAGIC_SYSRQ=y +# CONFIG_HOST_2G_2G is not set +# CONFIG_UML_SMP is not set +# CONFIG_SMP is not set +CONFIG_NEST_LEVEL=0 +CONFIG_KERNEL_HALF_GIGS=1 +# CONFIG_HIGHMEM is not set +CONFIG_KERNEL_STACK_ORDER=2 +CONFIG_UML_REAL_TIME_CLOCK=y + +# +# Code maturity level options +# +CONFIG_EXPERIMENTAL=y +CONFIG_CLEAN_COMPILE=y +CONFIG_STANDALONE=y +CONFIG_BROKEN_ON_SMP=y + +# +# General setup +# +CONFIG_SWAP=y +CONFIG_SYSVIPC=y +# CONFIG_POSIX_MQUEUE is not set +CONFIG_BSD_PROCESS_ACCT=y +CONFIG_SYSCTL=y +# CONFIG_AUDIT is not set +CONFIG_LOG_BUF_SHIFT=14 +# CONFIG_HOTPLUG is not set +# CONFIG_IKCONFIG is not set +# CONFIG_EMBEDDED is not set +CONFIG_KALLSYMS=y +CONFIG_FUTEX=y +CONFIG_EPOLL=y +CONFIG_IOSCHED_NOOP=y +CONFIG_IOSCHED_AS=y +CONFIG_IOSCHED_DEADLINE=y +CONFIG_IOSCHED_CFQ=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + +# +# Loadable module support +# +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_OBSOLETE_MODPARM=y +CONFIG_MODVERSIONS=y +CONFIG_KMOD=y + +# +# Generic Driver Options +# + +# +# Character Devices +# +CONFIG_STDIO_CONSOLE=y +CONFIG_SSL=y +CONFIG_FD_CHAN=y +# CONFIG_NULL_CHAN is not set +CONFIG_PORT_CHAN=y +CONFIG_PTY_CHAN=y +CONFIG_TTY_CHAN=y +CONFIG_XTERM_CHAN=y +CONFIG_CON_ZERO_CHAN="fd:0,fd:1" +CONFIG_CON_CHAN="xterm" +CONFIG_SSL_CHAN="pty" +CONFIG_UNIX98_PTYS=y +CONFIG_LEGACY_PTYS=y +CONFIG_LEGACY_PTY_COUNT=256 +# CONFIG_WATCHDOG is not set +# CONFIG_UML_SOUND is not set +# CONFIG_SOUND is not set +# CONFIG_HOSTAUDIO is not set + +# +# Block Devices +# +CONFIG_BLK_DEV_UBD=y +# CONFIG_BLK_DEV_UBD_SYNC is not set +CONFIG_BLK_DEV_COW_COMMON=y +CONFIG_BLK_DEV_LOOP=y +# CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_RAM is not set +# CONFIG_MMAPPER is not set +CONFIG_NETDEVICES=y + +# +# UML Network Devices +# +CONFIG_UML_NET=y +CONFIG_UML_NET_ETHERTAP=y +CONFIG_UML_NET_TUNTAP=y +CONFIG_UML_NET_SLIP=y +CONFIG_UML_NET_DAEMON=y +CONFIG_UML_NET_MCAST=y +# CONFIG_UML_NET_PCAP is not set +# CONFIG_UML_NET_SLIRP is not set + +# +# Networking support +# + +# +# Networking options +# +CONFIG_PACKET=y +CONFIG_PACKET_MMAP=y +# CONFIG_NETLINK_DEV is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=y +# CONFIG_IP_MULTICAST is not set +# 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_ARPD 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_NETFILTER is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK 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_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set +CONFIG_DUMMY=y +# CONFIG_BONDING is not set +# CONFIG_EQUALIZER is not set +CONFIG_TUN=y + +# +# Ethernet (10 or 100Mbit) +# +# CONFIG_NET_ETHERNET is not set + +# +# Ethernet (1000 Mbit) +# + +# +# Ethernet (10000 Mbit) +# + +# +# Token Ring devices +# + +# +# Wireless LAN (non-hamradio) +# +# CONFIG_NET_RADIO is not set + +# +# Wan interfaces +# +# CONFIG_WAN is not set +CONFIG_PPP=y +# CONFIG_PPP_MULTILINK is not set +# CONFIG_PPP_FILTER is not set +# CONFIG_PPP_ASYNC is not set +# CONFIG_PPP_SYNC_TTY is not set +# CONFIG_PPP_DEFLATE is not set +# CONFIG_PPP_BSDCOMP is not set +# CONFIG_PPPOE is not set +CONFIG_SLIP=y +# CONFIG_SLIP_COMPRESSED is not set +# CONFIG_SLIP_SMART is not set +# CONFIG_SLIP_MODE_SLIP6 is not set +# CONFIG_SHAPER is not set +# CONFIG_NETCONSOLE 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=y +CONFIG_EXT3_FS_SECURITY=y +CONFIG_JBD=y +CONFIG_JBD_DEBUG=y +CONFIG_FS_MBCACHE=y +# CONFIG_REISERFS_FS is not set +# CONFIG_JFS_FS is not set +CONFIG_FS_POSIX_ACL=y +# 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 is not set +# CONFIG_UDF_FS is not set + +# +# DOS/FAT/NT Filesystems +# +# CONFIG_FAT_FS is not set +# CONFIG_NTFS_FS is not set + +# +# Pseudo filesystems +# +CONFIG_PROC_FS=y +CONFIG_PROC_KCORE=y +CONFIG_SYSFS=y +CONFIG_DEVFS_FS=y +CONFIG_DEVFS_MOUNT=y +# CONFIG_DEVFS_DEBUG is not set +# CONFIG_DEVPTS_FS_XATTR is not set +CONFIG_TMPFS=y +# CONFIG_HUGETLB_PAGE is not set +CONFIG_RAMFS=y + +# +# Miscellaneous filesystems +# +# CONFIG_ADFS_FS is not set +# CONFIG_AFFS_FS is not set +# CONFIG_HFS_FS is not set +# CONFIG_HFSPLUS_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 is not set +# CONFIG_NFSD is not set +# CONFIG_EXPORTFS 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_AFS_FS is not set + +# +# Partition Types +# +# CONFIG_PARTITION_ADVANCED is not set +CONFIG_MSDOS_PARTITION=y + +# +# Native Language Support +# +# CONFIG_NLS is not set + +# +# Security options +# +# CONFIG_SECURITY is not set + +# +# Cryptographic options +# +# CONFIG_CRYPTO is not set + +# +# Library routines +# +# CONFIG_CRC32 is not set +# CONFIG_LIBCRC32C is not set + +# +# SCSI support +# +# CONFIG_SCSI is not set + +# +# Multi-device support (RAID and LVM) +# +# CONFIG_MD is not set + +# +# Memory Technology Devices (MTD) +# +# CONFIG_MTD is not set + +# +# Kernel hacking +# +CONFIG_DEBUG_SLAB=y +# CONFIG_DEBUG_SPINLOCK is not set +CONFIG_DEBUG_INFO=y +CONFIG_FRAME_POINTER=y +CONFIG_PT_PROXY=y +# CONFIG_GPROF is not set +# CONFIG_GCOV is not set diff --git a/lustre/kernel_patches/patches/3.5G-address-space-2.4.22-vanilla.patch b/lustre/kernel_patches/patches/3.5G-address-space-2.4.24-vanilla.patch similarity index 100% rename from lustre/kernel_patches/patches/3.5G-address-space-2.4.22-vanilla.patch rename to lustre/kernel_patches/patches/3.5G-address-space-2.4.24-vanilla.patch diff --git a/lustre/kernel_patches/patches/add_page_private-2.4.19-pre1.patch b/lustre/kernel_patches/patches/add_page_private-2.4.19-pre1.patch deleted file mode 100644 index a7e087d010..0000000000 --- a/lustre/kernel_patches/patches/add_page_private-2.4.19-pre1.patch +++ /dev/null @@ -1,15 +0,0 @@ - include/linux/mm.h | 1 + - 1 files changed, 1 insertion(+) - -Index: linux-2.4.19-pre1/include/linux/mm.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/mm.h 2003-11-20 19:24:06.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/mm.h 2003-11-21 02:00:13.000000000 +0300 -@@ -162,6 +162,7 @@ - wait_queue_head_t wait; /* Page locked? Stand in line... */ - struct page **pprev_hash; /* Complement to *next_hash. */ - struct buffer_head * buffers; /* Buffer maps us to a disk block. */ -+ unsigned long private; - void *virtual; /* Kernel virtual address (NULL if - not kmapped, ie. highmem) */ - struct zone_struct *zone; /* Memory zone we are in. */ diff --git a/lustre/kernel_patches/patches/add_page_private.patch b/lustre/kernel_patches/patches/add_page_private-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/add_page_private.patch rename to lustre/kernel_patches/patches/add_page_private-2.4.24.patch diff --git a/lustre/kernel_patches/patches/bproc-patch-2.4.20 b/lustre/kernel_patches/patches/bproc-patch-2.4.20 deleted file mode 100644 index 0144b9fdc9..0000000000 --- a/lustre/kernel_patches/patches/bproc-patch-2.4.20 +++ /dev/null @@ -1,1824 +0,0 @@ -Index: linux/fs/exec.c -=================================================================== ---- linux.orig/fs/exec.c 2003-09-03 17:52:00.000000000 -0400 -+++ linux/fs/exec.c 2003-09-03 17:52:04.000000000 -0400 -@@ -38,6 +38,7 @@ - #include <linux/utsname.h> - #define __NO_VERSION__ - #include <linux/module.h> -+#include <linux/bproc.h> - - #include <asm/uaccess.h> - #include <asm/pgalloc.h> -@@ -953,9 +954,11 @@ - xa_call_actions (XA_EXEC, XA_KOE, NULL); - - retval = search_binary_handler(&bprm,regs); -- if (retval >= 0) -+ if (retval >= 0) { - /* execve success */ -+ bproc_hook_im(do_execve,()); - return retval; -+ } - - out: - /* Something went wrong, return the inode and free the argument pages*/ -Index: linux/fs/binfmt_script.c -=================================================================== ---- linux.orig/fs/binfmt_script.c 2002-08-02 20:39:45.000000000 -0400 -+++ linux/fs/binfmt_script.c 2003-09-03 17:52:04.000000000 -0400 -@@ -13,6 +13,7 @@ - #include <linux/init.h> - #include <linux/file.h> - #include <linux/smp_lock.h> -+#include <linux/bproc.h> - - static int load_script(struct linux_binprm *bprm,struct pt_regs *regs) - { -@@ -67,7 +68,7 @@ - * user environment and arguments are stored. - */ - remove_arg_zero(bprm); -- retval = copy_strings_kernel(1, &bprm->filename, bprm); -+ retval = copy_strings_kernel(1,bproc_hook_v(&bprm->filename,load_script,(&bprm->filename)), bprm); - if (retval < 0) return retval; - bprm->argc++; - if (i_arg) { -Index: linux/fs/binfmt_elf.c -=================================================================== ---- linux.orig/fs/binfmt_elf.c 2002-08-02 20:39:45.000000000 -0400 -+++ linux/fs/binfmt_elf.c 2003-09-03 17:52:04.000000000 -0400 -@@ -73,7 +73,7 @@ - #define ELF_PAGEOFFSET(_v) ((_v) & (ELF_MIN_ALIGN-1)) - #define ELF_PAGEALIGN(_v) (((_v) + ELF_MIN_ALIGN - 1) & ~(ELF_MIN_ALIGN - 1)) - --static struct linux_binfmt elf_format = { -+struct linux_binfmt elf_format = { - NULL, THIS_MODULE, load_elf_binary, load_elf_library, elf_core_dump, ELF_EXEC_PAGESIZE - }; - -Index: linux/fs/proc/base.c -=================================================================== ---- linux.orig/fs/proc/base.c 2003-09-03 17:52:00.000000000 -0400 -+++ linux/fs/proc/base.c 2003-09-03 17:52:04.000000000 -0400 -@@ -25,6 +25,7 @@ - #include <linux/string.h> - #include <linux/seq_file.h> - #include <linux/namespace.h> -+#include <linux/bproc.h> - - /* - * For hysterical raisins we keep the same inumbers as in the old procfs. -@@ -304,6 +305,7 @@ - if (!(page = __get_free_page(GFP_KERNEL))) - return -ENOMEM; - -+ if (bproc_isghost(task)) bproc_hook(refresh_status,(task)); - length = inode->u.proc_i.op.proc_read(task, (char*)page); - - if (length < 0) { -@@ -976,14 +978,14 @@ - static int proc_self_readlink(struct dentry *dentry, char *buffer, int buflen) - { - char tmp[30]; -- sprintf(tmp, "%d", current->pid); -+ sprintf(tmp, "%d", bproc_hook_imv(current->pid,proc3,())); - return vfs_readlink(dentry,buffer,buflen,tmp); - } - - static int proc_self_follow_link(struct dentry *dentry, struct nameidata *nd) - { - char tmp[30]; -- sprintf(tmp, "%d", current->pid); -+ sprintf(tmp, "%d", bproc_hook_imv(current->pid,proc3,())); - return vfs_follow_link(nd,tmp); - } - -@@ -1031,6 +1033,7 @@ - goto out; - } - -+ pid = bproc_hook_imv(pid,proc2,(pid)); - read_lock(&tasklist_lock); - task = find_task_by_pid(pid); - if (task) -@@ -1082,7 +1085,7 @@ - index--; - read_lock(&tasklist_lock); - for_each_task(p) { -- int pid = p->pid; -+ int pid = bproc_hook_imv(p->pid,proc1,(p)); - if (!pid) - continue; - if (--index >= 0) -Index: linux/fs/proc/array.c -=================================================================== ---- linux.orig/fs/proc/array.c 2002-08-02 20:39:45.000000000 -0400 -+++ linux/fs/proc/array.c 2003-09-03 17:52:04.000000000 -0400 -@@ -70,6 +70,7 @@ - #include <linux/smp.h> - #include <linux/signal.h> - #include <linux/highmem.h> -+#include <linux/bproc.h> - - #include <asm/uaccess.h> - #include <asm/pgtable.h> -@@ -130,7 +131,8 @@ - - static inline const char * get_task_state(struct task_struct *tsk) - { -- unsigned int state = tsk->state & (TASK_RUNNING | -+ unsigned int state = (bproc_hook_v(tsk->state,get_task_state,(tsk))) -+ & (TASK_RUNNING | - TASK_INTERRUPTIBLE | - TASK_UNINTERRUPTIBLE | - TASK_ZOMBIE | -@@ -158,7 +160,8 @@ - "Uid:\t%d\t%d\t%d\t%d\n" - "Gid:\t%d\t%d\t%d\t%d\n", - get_task_state(p), p->tgid, -- p->pid, p->pid ? p->p_opptr->pid : 0, 0, -+ bproc_hook_imv(p->pid, proc_pid, (p)), -+ bproc_hook_imv(p->p_opptr->pid, proc_ppid, (p)), 0, - p->uid, p->euid, p->suid, p->fsuid, - p->gid, p->egid, p->sgid, p->fsgid); - read_unlock(&tasklist_lock); -@@ -305,7 +308,7 @@ - sigset_t sigign, sigcatch; - char state; - int res; -- pid_t ppid; -+ pid_t pid, ppid; - struct mm_struct *mm; - - state = *get_task_state(task); -@@ -343,12 +346,14 @@ - nice = task->nice; - - read_lock(&tasklist_lock); -- ppid = task->pid ? task->p_opptr->pid : 0; -+ pid = bproc_hook_imv(task->pid, proc_pid, (task)), -+ ppid = bproc_hook_imv(task->pid ? task->p_opptr->pid : 0, -+ proc_ppid, (task)); - read_unlock(&tasklist_lock); - res = sprintf(buffer,"%d (%s) %c %d %d %d %d %d %lu %lu \ - %lu %lu %lu %lu %lu %ld %ld %ld %ld %ld %ld %lu %lu %ld %lu %lu %lu %lu %lu \ - %lu %lu %lu %lu %lu %lu %lu %lu %d %d\n", -- task->pid, -+ pid, - task->comm, - state, - ppid, -Index: linux/kernel/timer.c -=================================================================== ---- linux.orig/kernel/timer.c 2003-09-03 17:51:01.000000000 -0400 -+++ linux/kernel/timer.c 2003-09-03 17:52:04.000000000 -0400 -@@ -22,6 +22,7 @@ - #include <linux/smp_lock.h> - #include <linux/interrupt.h> - #include <linux/kernel_stat.h> -+#include <linux/bproc.h> - - #include <asm/uaccess.h> - -@@ -754,7 +755,7 @@ - */ - asmlinkage long sys_getpid(void) - { -- return current->tgid; -+ return bproc_hook_imv(current->tgid, sys_getpid, ()); - } - - /* -@@ -788,7 +789,7 @@ - - parent = me->p_opptr; - for (;;) { -- pid = parent->pid; -+ pid = bproc_hook_imv(parent->pid,sys_getppid,(parent)); - #if CONFIG_SMP - { - struct task_struct *old = parent; -Index: linux/kernel/signal.c -=================================================================== ---- linux.orig/kernel/signal.c 2003-09-03 17:51:01.000000000 -0400 -+++ linux/kernel/signal.c 2003-09-03 17:52:04.000000000 -0400 -@@ -16,6 +16,8 @@ - - #include <asm/uaccess.h> - -+#include <linux/bproc.h> -+ - /* - * SLAB caches for signal bits. - */ -@@ -548,6 +550,9 @@ - if (sig < SIGRTMIN && sigismember(&t->pending.signal, sig)) - goto out; - -+ if (bproc_hook_v(0, send_sig_info, (sig, info, t))) -+ goto out; -+ - ret = deliver_signal(sig, info, t); - out: - spin_unlock_irqrestore(&t->sigmask_lock, flags); -@@ -590,6 +595,9 @@ - kill_pg_info(int sig, struct siginfo *info, pid_t pgrp) - { - int retval = -EINVAL; -+ -+ if (bproc_hook_imv(0,kill_pg_info, (sig, info, &pgrp, &retval)) == 1) -+ return retval; - if (pgrp > 0) { - struct task_struct *p; - -@@ -617,6 +625,7 @@ - kill_sl_info(int sig, struct siginfo *info, pid_t sess) - { - int retval = -EINVAL; -+ /* XXX bproc: Need ways to deal with session leaders...*/ - if (sess > 0) { - struct task_struct *p; - -@@ -640,6 +649,9 @@ - int error; - struct task_struct *p; - -+ if (bproc_hook_imv(0, kill_proc_info,(sig, info, &pid, &error)) == 1) -+ return error; -+ - read_lock(&tasklist_lock); - p = find_task_by_pid(pid); - error = -ESRCH; -@@ -684,6 +696,7 @@ - read_unlock(&tasklist_lock); - return count ? retval : -ESRCH; - } else if (pid < 0) { -+ /* XXX pid masq - do PG stuff. */ - return kill_pg_info(sig, info, -pid); - } else { - return kill_proc_info(sig, info, pid); -@@ -815,6 +828,7 @@ - EXPORT_SYMBOL(recalc_sigpending); - EXPORT_SYMBOL(send_sig); - EXPORT_SYMBOL(send_sig_info); -+EXPORT_SYMBOL(kill_something_info); - EXPORT_SYMBOL(block_all_signals); - EXPORT_SYMBOL(unblock_all_signals); - -Index: linux/kernel/sched.c -=================================================================== ---- linux.orig/kernel/sched.c 2003-09-03 17:51:05.000000000 -0400 -+++ linux/kernel/sched.c 2003-09-03 17:52:04.000000000 -0400 -@@ -30,6 +30,7 @@ - #include <linux/dump.h> - #include <linux/prefetch.h> - #include <linux/compiler.h> -+#include <linux/bproc.h> - - #include <asm/uaccess.h> - #include <asm/mmu_context.h> -@@ -370,6 +371,8 @@ - - inline int wake_up_process(struct task_struct * p) - { -+ if (p->state == TASK_STOPPED && bproc_ismasq(p)) -+ bproc_hook(wake_up_process, (p)); - return try_to_wake_up(p, 0); - } - -Index: linux/kernel/ksyms.c -=================================================================== ---- linux.orig/kernel/ksyms.c 2003-09-03 17:52:02.000000000 -0400 -+++ linux/kernel/ksyms.c 2003-09-03 17:52:04.000000000 -0400 -@@ -68,6 +68,10 @@ - extern void set_device_ro(kdev_t dev,int flag); - - extern void *sys_call_table; -+extern struct task_struct *child_reaper; -+#if defined(CONFIG_BINFMT_ELF) -+extern struct linux_binfmt elf_format; -+#endif - - extern struct timezone sys_tz; - extern int request_dma(unsigned int dmanr, char * deviceID); -@@ -104,9 +108,17 @@ - EXPORT_SYMBOL(do_munmap); - EXPORT_SYMBOL(do_brk); - EXPORT_SYMBOL(exit_mm); -+EXPORT_SYMBOL(do_exit); - EXPORT_SYMBOL(exit_files); - EXPORT_SYMBOL(exit_fs); - EXPORT_SYMBOL(exit_sighand); -+EXPORT_SYMBOL(is_orphaned_pgrp); -+EXPORT_SYMBOL(child_reaper); -+#if defined(CONFIG_BINFMT_ELF) -+EXPORT_SYMBOL(elf_format); -+#endif -+EXPORT_SYMBOL(alloc_uid); -+EXPORT_SYMBOL(free_uid); - EXPORT_SYMBOL(copy_fs_struct); - EXPORT_SYMBOL_GPL(make_pages_present); - -@@ -584,6 +596,7 @@ - EXPORT_SYMBOL(read_ahead); - EXPORT_SYMBOL(get_hash_table); - EXPORT_SYMBOL(new_inode); -+EXPORT_SYMBOL(get_empty_inode); - EXPORT_SYMBOL(insert_inode_hash); - EXPORT_SYMBOL(remove_inode_hash); - EXPORT_SYMBOL(buffer_insert_inode_queue); -Index: linux/kernel/fork.c -=================================================================== ---- linux.orig/kernel/fork.c 2003-09-03 17:52:00.000000000 -0400 -+++ linux/kernel/fork.c 2003-09-03 17:52:04.000000000 -0400 -@@ -23,6 +23,8 @@ - #include <linux/personality.h> - #include <linux/compiler.h> - -+#include <linux/bproc.h> -+ - #include <asm/pgtable.h> - #include <asm/pgalloc.h> - #include <asm/uaccess.h> -@@ -413,6 +415,7 @@ - - static inline int copy_fs(unsigned long clone_flags, struct task_struct * tsk) - { -+ if (!current->fs) return 0; - if (clone_flags & CLONE_FS) { - atomic_inc(¤t->fs->count); - return 0; -@@ -781,7 +784,8 @@ - * - * Let it rip! - */ -- retval = p->pid; -+ if ((retval = bproc_hook_v(p->pid, do_fork, (p, clone_flags))) < 0) -+ goto bad_fork_cleanup_mm; - p->tgid = retval; - INIT_LIST_HEAD(&p->thread_group); - -@@ -805,6 +809,7 @@ - SET_LINKS(p); - hash_pid(p); - nr_threads++; -+ bproc_hook(do_fork_2, (p)); - write_unlock_irq(&tasklist_lock); - - if (p->ptrace & PT_PTRACED) -@@ -816,6 +821,7 @@ - wait_for_completion(&vfork); - - fork_out: -+ bproc_clear_kcall(); - return retval; - - bad_fork_cleanup_namespace: -Index: linux/kernel/exit.c -=================================================================== ---- linux.orig/kernel/exit.c 2003-09-03 17:52:00.000000000 -0400 -+++ linux/kernel/exit.c 2003-09-03 17:52:04.000000000 -0400 -@@ -22,6 +22,8 @@ - #include <asm/pgtable.h> - #include <asm/mmu_context.h> - -+#include <linux/bproc.h> -+ - extern void sem_exit (void); - extern struct task_struct *child_reaper; - -@@ -47,6 +49,7 @@ - } - task_unlock(p); - #endif -+ bproc_hook(release,(p)); - atomic_dec(&p->user->processes); - free_uid(p->user); - unhash_process(p); -@@ -130,7 +133,8 @@ - - int is_orphaned_pgrp(int pgrp) - { -- return will_become_orphaned_pgrp(pgrp, 0); -+ return bproc_hook_imv(will_become_orphaned_pgrp(pgrp, 0), -+ is_orphaned_pgrp,(pgrp)); - } - - static inline int has_stopped_jobs(int pgrp) -@@ -170,7 +174,7 @@ - p->self_exec_id++; - - /* Make sure we're not reparenting to ourselves */ -- p->p_opptr = child_reaper; -+ p->p_opptr = bproc_hook_v(child_reaper, child_reaper, (p)); - - if (p->pdeath_signal) send_sig(p->pdeath_signal, p, 0); - } -@@ -450,6 +454,7 @@ - #endif - __exit_mm(tsk); - -+ bproc_hook(do_exit, (tsk,code)); - lock_kernel(); - sem_exit(); - __exit_files(tsk); -@@ -501,6 +506,7 @@ - asmlinkage long sys_wait4(pid_t pid,unsigned int * stat_addr, int options, struct rusage * ru) - { - int flag, retval; -+ pid_t orig_pid = pid; - DECLARE_WAITQUEUE(wait, current); - struct task_struct *tsk; - -@@ -512,6 +518,9 @@ - flag = 0; - current->state = TASK_INTERRUPTIBLE; - read_lock(&tasklist_lock); -+ pid = orig_pid; -+ if (bproc_hook_imv(0, sys_wait4_1, (&pid, stat_addr, options, ru, &retval))) -+ goto end_wait4; /* handler will unlock tasklist_lock */ - tsk = current; - do { - struct task_struct *p; -@@ -535,7 +544,7 @@ - && !(options & __WALL)) - continue; - flag = 1; -- switch (p->state) { -+ switch (bproc_hook_v(p->state,sys_wait4_2,(p))) { - case TASK_STOPPED: - if (!p->exit_code) - continue; -@@ -547,7 +556,7 @@ - retval = put_user((p->exit_code << 8) | 0x7f, stat_addr); - if (!retval) { - p->exit_code = 0; -- retval = p->pid; -+ retval = bproc_hook_imv(p->pid, sys_wait4_3, (p)); - } - goto end_wait4; - case TASK_ZOMBIE: -@@ -559,7 +568,7 @@ - retval = put_user(p->exit_code, stat_addr); - if (retval) - goto end_wait4; -- retval = p->pid; -+ retval = bproc_hook_imv(p->pid, sys_wait4_3, (p)); - if (p->p_opptr != p->p_pptr) { - write_lock_irq(&tasklist_lock); - REMOVE_LINKS(p); -@@ -569,6 +578,7 @@ - write_unlock_irq(&tasklist_lock); - } else - release_task(p); -+ bproc_hook_im(sys_wait4_4,(retval, options)); - goto end_wait4; - default: - continue; -@@ -593,6 +603,7 @@ - end_wait4: - current->state = TASK_RUNNING; - remove_wait_queue(¤t->wait_chldexit,&wait); -+ bproc_clear_kcall(); - return retval; - } - -Index: linux/kernel/sys.c -=================================================================== ---- linux.orig/kernel/sys.c 2003-09-03 17:51:05.000000000 -0400 -+++ linux/kernel/sys.c 2003-09-03 17:52:04.000000000 -0400 -@@ -21,6 +21,8 @@ - #include <asm/uaccess.h> - #include <asm/io.h> - -+#include <linux/bproc.h> -+ - /* - * this is where the system-wide overflow UID and GID are defined, for - * architectures that now have 32-bit UID/GID but didn't in the past -@@ -448,6 +450,7 @@ - current->fsgid = new_egid; - current->egid = new_egid; - current->gid = new_rgid; -+ bproc_hook_im(set_creds, ()); - return 0; - } - -@@ -480,6 +483,7 @@ - } - else - return -EPERM; -+ bproc_hook_im(set_creds, ()); - return 0; - } - -@@ -614,6 +618,7 @@ - cap_emulate_setxuid(old_ruid, old_euid, old_suid); - } - -+ bproc_hook_im(set_creds, ()); - return 0; - } - -@@ -658,6 +663,8 @@ - cap_emulate_setxuid(old_ruid, old_euid, old_suid); - } - -+ bproc_hook_im(set_creds, ()); -+ bproc_hook_im(set_creds, ()); - return 0; - } - -@@ -746,6 +753,7 @@ - current->gid = rgid; - if (sgid != (gid_t) -1) - current->sgid = sgid; -+ bproc_hook_im(set_creds, ()); - return 0; - } - -@@ -803,6 +811,7 @@ - } - } - -+ if (current->fsuid != old_fsuid) bproc_hook_im(set_creds, ()); - return old_fsuid; - } - -@@ -825,6 +834,8 @@ - } - current->fsgid = gid; - } -+ -+ if (current->fsgid != old_fsgid) bproc_hook_im(set_creds, ()); - return old_fsgid; - } - -@@ -860,6 +871,8 @@ - struct task_struct * p; - int err = -EINVAL; - -+ bproc_hook_imr(sys_setpgid1, (pid, pgid)); -+ - if (!pid) - pid = current->pid; - if (!pgid) -@@ -901,6 +914,7 @@ - - ok_pgid: - p->pgrp = pgid; -+ if (bproc_isghost(p)) bproc_hook(sys_setpgid2, (p)); - err = 0; - out: - /* All paths lead to here, thus we are safe. -DaveM */ -@@ -910,6 +924,7 @@ - - asmlinkage long sys_getpgid(pid_t pid) - { -+ bproc_hook_imr(sys_getpgid,(pid)); - if (!pid) { - return current->pgrp; - } else { -@@ -930,23 +945,25 @@ - asmlinkage long sys_getpgrp(void) - { - /* SMP - assuming writes are word atomic this is fine */ -- return current->pgrp; -+ return bproc_hook_imv(current->pgrp,sys_getpgrp,()); - } - - asmlinkage long sys_getsid(pid_t pid) - { - if (!pid) { -- return current->session; -+ return bproc_hook_imv(current->session,sys_getsid1,()); - } else { - int retval; - struct task_struct *p; -+ if (bproc_hook_imv(0,sys_getsid2, (&pid, &retval))==1) -+ return retval; - - read_lock(&tasklist_lock); - p = find_task_by_pid(pid); - - retval = -ESRCH; - if(p) -- retval = p->session; -+ retval = bproc_hook_imv(p->session,sys_getsid3,(p)); - read_unlock(&tasklist_lock); - return retval; - } -@@ -957,6 +974,8 @@ - struct task_struct * p; - int err = -EPERM; - -+ bproc_hook_imr(sys_setsid,()); -+ - read_lock(&tasklist_lock); - for_each_task(p) { - if (p->pgrp == current->pid) -@@ -1011,6 +1030,7 @@ - if(copy_from_user(current->groups, grouplist, gidsetsize * sizeof(gid_t))) - return -EFAULT; - current->ngroups = gidsetsize; -+ bproc_hook_im(set_creds, ()); - return 0; - } - -Index: linux/kernel/ptrace.c -=================================================================== ---- linux.orig/kernel/ptrace.c 2003-09-03 17:51:04.000000000 -0400 -+++ linux/kernel/ptrace.c 2003-09-03 17:52:04.000000000 -0400 -@@ -12,6 +12,7 @@ - #include <linux/mm.h> - #include <linux/highmem.h> - #include <linux/smp_lock.h> -+#include <linux/bproc.h> - - #include <asm/pgtable.h> - #include <asm/uaccess.h> -@@ -25,8 +26,13 @@ - if (!(child->ptrace & PT_PTRACED)) - return -ESRCH; - -- if (child->p_pptr != current) -- return -ESRCH; -+ if (child->p_pptr != current && -+ !bproc_hook_v(0,ptrace_slave_call, -+ (PTRACE_DETACH, child, current->bproc.arg))) -+ return -ESRCH; -+ -+ if (bproc_isghost(child)) -+ return 0; - - if (!kill) { - if (child->state != TASK_STOPPED) -@@ -55,6 +61,7 @@ - - int ptrace_attach(struct task_struct *task) - { -+ long ret; - task_lock(task); - if (task->pid <= 1) - goto bad; -@@ -83,16 +90,22 @@ - task->ptrace |= PT_PTRACE_CAP; - task_unlock(task); - -+ ret = 0; - write_lock_irq(&tasklist_lock); - if (task->p_pptr != current) { -+ if (bproc_isghost(current) && !bproc_isghost(task)) ret = 1; - REMOVE_LINKS(task); - task->p_pptr = current; - SET_LINKS(task); - } -+ if (bproc_ismasq(task)) -+ bproc_hook(ptrace_attach, (task, current->bproc.arg, &ret)); - write_unlock_irq(&tasklist_lock); -- -- send_sig(SIGSTOP, task, 1); -- return 0; -+ if (bproc_isghost(task)) -+ bproc_hook(ptraceg,(PTRACE_ATTACH, task, 0, 0, &ret, 0)); -+ else -+ send_sig(SIGSTOP, task, 1); -+ return ret; - - bad: - task_unlock(task); -@@ -101,6 +114,7 @@ - - int ptrace_detach(struct task_struct *child, unsigned int data) - { -+ long ret = 0; - if ((unsigned long) data > _NSIG) - return -EIO; - -@@ -111,14 +125,19 @@ - child->ptrace = 0; - child->exit_code = data; - write_lock_irq(&tasklist_lock); -+ if (bproc_isghost(current) && !bproc_isghost(child) && -+ child->p_pptr != child->p_opptr) -+ ret = 1; - REMOVE_LINKS(child); -+ if (bproc_ismasq(child)) -+ bproc_hook(ptrace_detach,(child,(long*)&ret)); - child->p_pptr = child->p_opptr; - SET_LINKS(child); - write_unlock_irq(&tasklist_lock); - - /* .. and wake it up. */ - wake_up_process(child); -- return 0; -+ return ret; - } - - /* -Index: linux/kernel/Makefile -=================================================================== ---- linux.orig/kernel/Makefile 2003-09-03 17:51:06.000000000 -0400 -+++ linux/kernel/Makefile 2003-09-03 17:52:04.000000000 -0400 -@@ -9,7 +9,7 @@ - - O_TARGET := kernel.o - --export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o printk.o -+export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o printk.o bproc_hook.o - - obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \ - module.o exit.o itimer.o info.o time.o softirq.o resource.o \ -@@ -24,6 +24,7 @@ - obj-$(CONFIG_MODULES) += ksyms.o - obj-$(CONFIG_PM) += pm.o - obj-$(CONFIG_KALLSYMS) += kallsyms.o -+obj-$(CONFIG_BPROC) += bproc_hook.o - - ifneq ($(CONFIG_IA64),y) - # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is -Index: linux/kernel/bproc_hook.c -=================================================================== ---- linux.orig/kernel/bproc_hook.c 2003-09-03 17:52:04.000000000 -0400 -+++ linux/kernel/bproc_hook.c 2003-09-03 17:52:04.000000000 -0400 -@@ -0,0 +1,36 @@ -+/*------------------------------------------------------------------------- -+ * bproc_hook.c: Beowulf distributed PID space (bproc) definitions -+ * -+ * Copyright (C) 2000 by Erik Hendriks <hendriks@scyld.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 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ * Id: bproc-patch-2.4.20,v 1.8 2004/04/12 21:44:45 nic Exp $ -+ *-----------------------------------------------------------------------*/ -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/module.h> -+ -+#define bprocdeclhook(ret,func,args) \ -+ ret (* bproc_hook_ ## func ## _hook) args = 0;\ -+ EXPORT_SYMBOL( bproc_hook_ ## func ## _hook ) -+ -+#include <linux/bproc.h> -+ -+/* -+ * Local variables: -+ * c-basic-offset: 4 -+ * End: -+ */ -Index: linux/include/linux/sched.h -=================================================================== ---- linux.orig/include/linux/sched.h 2003-09-03 17:51:06.000000000 -0400 -+++ linux/include/linux/sched.h 2003-09-03 17:52:04.000000000 -0400 -@@ -430,6 +430,14 @@ - - /* journalling filesystem info */ - void *journal_info; -+ -+/* bproc */ -+ struct { -+ long flag; -+ long arg; -+ struct bproc_masq_proc_t *masq; -+ struct bproc_ghost_proc_t *ghost; -+ } bproc; - }; - - /* -@@ -526,6 +534,7 @@ - alloc_lock: SPIN_LOCK_UNLOCKED, \ - exit_actions: NULL, \ - journal_info: NULL, \ -+ bproc: {0, 0, 0, 0} \ - } - - -Index: linux/include/linux/bproc.h -=================================================================== ---- linux.orig/include/linux/bproc.h 2003-09-03 17:52:04.000000000 -0400 -+++ linux/include/linux/bproc.h 2003-09-03 17:52:04.000000000 -0400 -@@ -0,0 +1,155 @@ -+/*------------------------------------------------------------------------- -+ * bproc.h: Beowulf distributed PID space (bproc) definitions -+ * -+ * Copyright (C) 1999-2001 by Erik Hendriks <erik@hendriks.cx> -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ * Id: bproc-patch-2.4.20,v 1.8 2004/04/12 21:44:45 nic Exp $ -+ *-----------------------------------------------------------------------*/ -+#ifndef _LINUX_BPROC_H -+#define _LINUX_BPROC_H -+ -+#include <linux/config.h> -+#include <linux/types.h> -+ -+#ifdef CONFIG_BPROC -+ -+#ifndef bprocdeclhook -+/* Function pointers for bproc hooks. */ -+#define bprocdeclhook(ret,func,args) extern ret (* bproc_hook_ ## func ## _hook) args -+#endif -+ -+struct bproc_ghost_proc_t; -+struct task_struct; -+struct rusage; -+struct siginfo; -+ -+/*----- fs/exec.c -------------------------------------------------------*/ -+bprocdeclhook(void, do_execve, (void)); -+/*----- fs/binfmt_script.c ----------------------------------------------*/ -+bprocdeclhook(char**,load_script, (char **)); -+/*----- fs/proc/array.c ----------------------------------------------------*/ -+bprocdeclhook(void, refresh_status, (struct task_struct *)); -+bprocdeclhook(int, get_task_state, (struct task_struct *)); -+bprocdeclhook(int, proc_pid, (struct task_struct *)); -+bprocdeclhook(int, proc_ppid, (struct task_struct *)); -+bprocdeclhook(int, proc1, (struct task_struct *)); -+bprocdeclhook(int, proc2, (int)); -+bprocdeclhook(int, proc3, (void)); -+/*----- kernel/timer.c --------------------------------------------------*/ -+bprocdeclhook(int, sys_getpid, (void)); -+bprocdeclhook(int, sys_getppid, (struct task_struct *)); -+/*----- kernel/sched.c --------------------------------------------------*/ -+bprocdeclhook(void, wake_up_process, (struct task_struct *)); -+/*----- kernel/exit.c ---------------------------------------------------*/ -+bprocdeclhook(void, release, (struct task_struct *)); -+bprocdeclhook(int, is_orphaned_pgrp,(int)); -+bprocdeclhook(struct task_struct *,child_reaper,(struct task_struct *)); -+bprocdeclhook(void, do_exit, (struct task_struct *, long code)); -+bprocdeclhook(int, sys_wait4_1, (pid_t *, unsigned int *, int, -+ struct rusage *, int *)); -+bprocdeclhook(long, sys_wait4_2, (struct task_struct *)); -+bprocdeclhook(int, sys_wait4_3, (struct task_struct *)); -+bprocdeclhook(void, sys_wait4_4, (pid_t, int options)); -+/*----- kernel/fork.c ---------------------------------------------------*/ -+bprocdeclhook(int, do_fork, (struct task_struct *, unsigned long)); -+bprocdeclhook(void, do_fork_2, (struct task_struct *)); -+/*----- kernel/signal.c -------------------------------------------------*/ -+bprocdeclhook(int, send_sig_info, (int, struct siginfo *, -+ struct task_struct *)); -+bprocdeclhook(int, kill_pg_info, (int, struct siginfo *, pid_t *, int *)); -+bprocdeclhook(int, kill_proc_info, (int, struct siginfo *, pid_t *, int *)); -+/*----- kernel/sys.c ----------------------------------------------------*/ -+bprocdeclhook(int, sys_setpgid1, (pid_t, pid_t)); -+bprocdeclhook(void, sys_setpgid2, (struct task_struct *p)); -+bprocdeclhook(int, sys_getpgid, (pid_t pid)); -+bprocdeclhook(int, sys_getpgrp, (void)); -+bprocdeclhook(int, sys_getsid1, (void)); -+bprocdeclhook(int, sys_getsid2, (pid_t *pid, int *error)); -+bprocdeclhook(int, sys_getsid3, (struct task_struct *p)); -+bprocdeclhook(int, sys_setsid, (void)); -+bprocdeclhook(void, set_creds, (void)); -+/*----- arch/???/kernel/ptrace.c,signal.c -------------------------------*/ -+bprocdeclhook(void, stop_notify, (int)); -+bprocdeclhook(int, ptracem, (long, long *, long, long, -+ long *, long *)); -+bprocdeclhook(void, ptrace_attach, (struct task_struct *, long, long *)); -+bprocdeclhook(void, ptraceg, (long, struct task_struct *, long, -+ long, long *, long *)); -+bprocdeclhook(int, ptrace_slave_call,(long, struct task_struct *, long)); -+bprocdeclhook(void, ptrace_detach, (struct task_struct *, long *)); -+bprocdeclhook(int, sys_execve, (struct pt_regs *, char *, -+ char **, char **)); -+ -+/* Macro suffixes: -+ * (none) = execute this hook if it's present. -+ * im = if masq'ed -+ * nkc = no kernel call (kcall must be 0 to call hook) -+ * r = return the value of this hook -+ * v = hook returns a value. -+ */ -+#define hookname(func) bproc_hook_ ## func ## _hook -+#define bproc_hook(func,args) do{if(hookname(func))hookname(func)args;}while(0) -+#define bproc_hook_im(func,args) do{if(hookname(func)&¤t->bproc.masq)hookname(func)args;}while(0) -+#define bproc_hook_imr(func,args) do{if(hookname(func)&¤t->bproc.masq)return hookname(func)args;}while(0) -+#define bproc_hook_v(defl,func,args) ( hookname(func) ?hookname(func)args:defl) -+#define bproc_hook_imv(defl,func,args) ((hookname(func)&¤t->bproc.masq)?hookname(func)args:defl) -+ -+#define bproc_isghost(tsk) ((tsk)->bproc.ghost != 0) -+#define bproc_ismasq(tsk) ((tsk)->bproc.masq != 0) -+#define bproc_set_arg(x) do{current->bproc.arg=(x);}while(0) -+ -+/* Kernel call weirdness... a kernel call is a call made from the -+ * kernel which we do not want to be subject to the usual rules for -+ * PID masquerading. This is mostly used for drivers which create and -+ * possibly wait for kernel threads which they create. These -+ * functions are called from the relevant places within the kernel -+ * (like within kernel_thread) to set a flag so that things will be -+ * handled correctly later on. */ -+static inline void bproc_no_kcall(void) { -+ current->bproc.flag = (current->bproc.flag & ~3) | 2; -+} -+static inline void bproc_clear_kcall(void) { -+ current->bproc.flag &= ~3; -+} -+static inline void bproc_kcall(void) { -+ if (current->bproc.flag & 2) -+ bproc_clear_kcall(); -+ else -+ current->bproc.flag |= 1; /* set kernel call flag */ -+} -+ -+#else -+/* Stubs for when hooks are not compiled in */ -+#define bproc_hook(func,args) do{}while(0) -+#define bproc_hook_im(func,args) do{}while(0) -+#define bproc_hook_imr(func,args) do{}while(0) -+#define bproc_hook_v(defl,func,args) (defl) -+#define bproc_hook_imv(defl,func,args) (defl) -+#define bproc_isghost(tsk) (0) -+#define bproc_ismasq(tsk) (0) -+#define bproc_set_arg(x) do{}while(0) -+#define bproc_no_kcall() do{}while(0) -+#define bproc_clear_kcall() do{}while(0) -+#define bproc_kcall() do{}while(0) -+#endif -+#endif -+ -+/* -+ * Local variables: -+ * c-basic-offset: 4 -+ * End: -+ */ -Index: linux/include/asm-i386/unistd.h -=================================================================== ---- linux.orig/include/asm-i386/unistd.h 2002-11-28 18:53:15.000000000 -0500 -+++ linux/include/asm-i386/unistd.h 2003-09-03 17:52:04.000000000 -0400 -@@ -349,6 +349,7 @@ - - #ifdef __KERNEL_SYSCALLS__ - -+#include <linux/bproc.h> - /* - * we need this inline - forking from kernel space will result - * in NO COPY ON WRITE (!!!), until an execve is executed. This -@@ -373,7 +374,16 @@ - static inline _syscall3(int,open,const char *,file,int,flag,int,mode) - static inline _syscall1(int,close,int,fd) - static inline _syscall1(int,_exit,int,exitcode) --static inline _syscall3(pid_t,waitpid,pid_t,pid,int *,wait_stat,int,options) -+static inline pid_t waitpid(pid_t pid, int *wait_stat, int options) { -+ long __res; -+ bproc_kcall(); -+ __asm__ volatile ("int $0x80" -+ : "=a" (__res) -+ : "0" (__NR_waitpid),"b" ((long)(pid)),"c" ((long)(wait_stat)), -+ "d" ((long)(options))); -+ __syscall_return(pid_t,__res); -+} -+ - static inline _syscall1(int,delete_module,const char *,name) - - static inline pid_t wait(int * wait_stat) -Index: linux/include/asm-alpha/unistd.h -=================================================================== ---- linux.orig/include/asm-alpha/unistd.h 2002-08-02 20:39:45.000000000 -0400 -+++ linux/include/asm-alpha/unistd.h 2003-09-03 17:52:04.000000000 -0400 -@@ -519,6 +519,7 @@ - - #include <linux/string.h> - #include <linux/signal.h> -+#include <linux/bproc.h> - - extern void sys_idle(void); - static inline void idle(void) -@@ -591,11 +592,13 @@ - - static inline pid_t waitpid(int pid, int * wait_stat, int flags) - { -+ bproc_kcall(); - return sys_wait4(pid, wait_stat, flags, NULL); - } - - static inline pid_t wait(int * wait_stat) - { -+ bproc_kcall(); - return waitpid(-1,wait_stat,0); - } - -Index: linux/net/socket.c -=================================================================== ---- linux.orig/net/socket.c 2003-09-03 17:51:05.000000000 -0400 -+++ linux/net/socket.c 2003-09-03 17:52:04.000000000 -0400 -@@ -111,7 +111,7 @@ - * in the operation structures but are done directly via the socketcall() multiplexor. - */ - --static struct file_operations socket_file_ops = { -+struct file_operations socket_file_ops = { - llseek: no_llseek, - read: sock_read, - write: sock_write, -@@ -298,13 +298,13 @@ - return sb; - } - --static struct vfsmount *sock_mnt; -+struct vfsmount *sock_mnt; - static DECLARE_FSTYPE(sock_fs_type, "sockfs", sockfs_read_super, FS_NOMOUNT); - static int sockfs_delete_dentry(struct dentry *dentry) - { - return 1; - } --static struct dentry_operations sockfs_dentry_operations = { -+struct dentry_operations sockfs_dentry_operations = { - d_delete: sockfs_delete_dentry, - }; - -Index: linux/net/netsyms.c -=================================================================== ---- linux.orig/net/netsyms.c 2003-09-03 17:52:04.000000000 -0400 -+++ linux/net/netsyms.c 2003-09-03 17:52:04.000000000 -0400 -@@ -599,4 +599,11 @@ - EXPORT_SYMBOL(wireless_send_event); - #endif /* CONFIG_NET_RADIO || CONFIG_NET_PCMCIA_RADIO */ - -+extern struct vfsmount *sock_mnt; -+extern struct dentry_operations sockfs_dentry_operations; -+extern struct file_operations socket_file_ops; -+EXPORT_SYMBOL(sock_mnt); -+EXPORT_SYMBOL(sockfs_dentry_operations); -+EXPORT_SYMBOL(socket_file_ops); -+ - #endif /* CONFIG_NET */ -Index: linux/arch/i386/config.in -=================================================================== ---- linux.orig/arch/i386/config.in 2003-09-03 17:51:06.000000000 -0400 -+++ linux/arch/i386/config.in 2003-09-03 17:52:04.000000000 -0400 -@@ -285,6 +285,7 @@ - - bool 'System V IPC' CONFIG_SYSVIPC - bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT -+bool 'Beowulf Distributed Process Space' CONFIG_BPROC - bool 'Sysctl support' CONFIG_SYSCTL - if [ "$CONFIG_PROC_FS" = "y" ]; then - choice 'Kernel core (/proc/kcore) format' \ -Index: linux/arch/i386/kernel/signal.c -=================================================================== ---- linux.orig/arch/i386/kernel/signal.c 2002-08-02 20:39:42.000000000 -0400 -+++ linux/arch/i386/kernel/signal.c 2003-09-03 17:52:04.000000000 -0400 -@@ -20,6 +20,7 @@ - #include <linux/stddef.h> - #include <linux/tty.h> - #include <linux/personality.h> -+#include <linux/bproc.h> - #include <asm/ucontext.h> - #include <asm/uaccess.h> - #include <asm/i387.h> -@@ -612,6 +613,7 @@ - /* Let the debugger run. */ - current->exit_code = signr; - current->state = TASK_STOPPED; -+ bproc_hook_im(stop_notify,(signr)); - notify_parent(current, SIGCHLD); - schedule(); - -@@ -670,6 +672,7 @@ - struct signal_struct *sig; - current->state = TASK_STOPPED; - current->exit_code = signr; -+ bproc_hook_im(stop_notify,(signr)); - sig = current->p_pptr->sig; - if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP)) - notify_parent(current, SIGCHLD); -Index: linux/arch/i386/kernel/ptrace.c -=================================================================== ---- linux.orig/arch/i386/kernel/ptrace.c 2002-08-02 20:39:42.000000000 -0400 -+++ linux/arch/i386/kernel/ptrace.c 2003-09-03 17:52:04.000000000 -0400 -@@ -21,6 +21,8 @@ - #include <asm/i387.h> - #include <asm/debugreg.h> - -+#include <linux/bproc.h> -+ - /* - * does not yet catch signals sent when the child dies. - * in exit.c or in signal.c. -@@ -152,6 +154,15 @@ - struct task_struct *child; - struct user * dummy = NULL; - int i, ret; -+ long orig_pid; -+ -+ orig_pid = pid; -+ retry_ptrace: -+ pid = orig_pid; -+ if (bproc_hook_imv(0, ptracem, (request,&pid,addr,data,(long*)&ret,0))) { -+ if (ret == -ELOOP) goto retry_ptrace; -+ return ret; -+ } - - lock_kernel(); - ret = -EPERM; -@@ -178,14 +189,21 @@ - goto out_tsk; - - if (request == PTRACE_ATTACH) { -+ bproc_set_arg(addr); - ret = ptrace_attach(child); - goto out_tsk; - } - -+ bproc_set_arg(request == PTRACE_DETACH ? addr : 0); - ret = ptrace_check_attach(child, request == PTRACE_KILL); - if (ret < 0) - goto out_tsk; - -+ if (bproc_isghost(child)) { -+ bproc_hook(ptraceg, (request,child,addr,data,(long*)&ret,0)); -+ goto out_tsk; -+ } -+ - switch (request) { - /* when I and D space are separate, these will need to be fixed. */ - case PTRACE_PEEKTEXT: /* read word at location addr. */ -@@ -427,6 +445,7 @@ - free_task_struct(child); - out: - unlock_kernel(); -+ if (ret == -ELOOP) goto retry_ptrace; - return ret; - } - -@@ -440,6 +459,7 @@ - current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) - ? 0x80 : 0); - current->state = TASK_STOPPED; -+ bproc_hook_im(stop_notify,(SIGTRAP)); - notify_parent(current, SIGCHLD); - schedule(); - /* -Index: linux/arch/i386/kernel/process.c -=================================================================== ---- linux.orig/arch/i386/kernel/process.c 2003-09-03 17:51:02.000000000 -0400 -+++ linux/arch/i386/kernel/process.c 2003-09-03 17:52:04.000000000 -0400 -@@ -33,6 +33,7 @@ - #include <linux/reboot.h> - #include <linux/init.h> - #include <linux/mc146818rtc.h> -+#include <linux/bproc.h> - - #include <asm/uaccess.h> - #include <asm/pgtable.h> -@@ -489,6 +490,7 @@ - { - long retval, d0; - -+ bproc_kcall(); - __asm__ __volatile__( - "movl %%esp,%%esi\n\t" - "int $0x80\n\t" /* Linux/i386 system call */ -@@ -789,6 +791,11 @@ - current->ptrace &= ~PT_DTRACE; - putname(filename); - out: -+ if (error == -ENOENT) -+ error = bproc_hook_imv(error, sys_execve, -+ (®s,(char *)regs.ebx, -+ (char **)regs.ecx, (char **)regs.edx)); -+ - return error; - } - -Index: linux/arch/i386/kernel/i386_ksyms.c -=================================================================== ---- linux.orig/arch/i386/kernel/i386_ksyms.c 2003-09-03 17:51:04.000000000 -0400 -+++ linux/arch/i386/kernel/i386_ksyms.c 2003-09-03 17:52:04.000000000 -0400 -@@ -107,6 +107,11 @@ - EXPORT_SYMBOL(__generic_copy_to_user); - EXPORT_SYMBOL(strnlen_user); - -+asmlinkage void ret_from_sys_call(void) __asm__("ret_from_sys_call"); -+EXPORT_SYMBOL_NOVERS(ret_from_sys_call); -+asmlinkage void syscall_trace(void); -+EXPORT_SYMBOL(syscall_trace); -+ - EXPORT_SYMBOL(pci_alloc_consistent); - EXPORT_SYMBOL(pci_free_consistent); - -Index: linux/arch/alpha/config.in -=================================================================== ---- linux.orig/arch/alpha/config.in 2003-09-03 17:51:04.000000000 -0400 -+++ linux/arch/alpha/config.in 2003-09-03 17:52:04.000000000 -0400 -@@ -271,6 +271,7 @@ - - bool 'Networking support' CONFIG_NET - bool 'System V IPC' CONFIG_SYSVIPC -+bool 'Beowulf Distributed Process Space' CONFIG_BPROC - bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT - bool 'Sysctl support' CONFIG_SYSCTL - if [ "$CONFIG_PROC_FS" = "y" ]; then -Index: linux/arch/alpha/kernel/signal.c -=================================================================== ---- linux.orig/arch/alpha/kernel/signal.c 2002-08-02 20:39:42.000000000 -0400 -+++ linux/arch/alpha/kernel/signal.c 2003-09-03 17:52:04.000000000 -0400 -@@ -23,6 +23,7 @@ - #include <asm/uaccess.h> - #include <asm/sigcontext.h> - #include <asm/ucontext.h> -+#include <linux/bproc.h> - - #include "proto.h" - -@@ -643,6 +644,7 @@ - /* Let the debugger run. */ - current->exit_code = signr; - current->state = TASK_STOPPED; -+ bproc_hook_im(stop_notify,(signr)); - notify_parent(current, SIGCHLD); - schedule(); - single_stepping |= ptrace_cancel_bpt(current); -@@ -701,6 +703,7 @@ - case SIGSTOP: - current->state = TASK_STOPPED; - current->exit_code = signr; -+ bproc_hook_im(stop_notify,(signr)); - if (!(current->p_pptr->sig->action[SIGCHLD-1] - .sa.sa_flags & SA_NOCLDSTOP)) - notify_parent(current, SIGCHLD); -Index: linux/arch/alpha/kernel/osf_sys.c -=================================================================== ---- linux.orig/arch/alpha/kernel/osf_sys.c 2002-08-02 20:39:42.000000000 -0400 -+++ linux/arch/alpha/kernel/osf_sys.c 2003-09-03 17:52:04.000000000 -0400 -@@ -33,6 +33,7 @@ - #include <linux/file.h> - #include <linux/types.h> - #include <linux/ipc.h> -+#include <linux/bproc.h> - - #include <asm/fpu.h> - #include <asm/io.h> -@@ -219,8 +220,8 @@ - * isn't actually going to matter, as if the parent happens - * to change we can happily return either of the pids. - */ -- (®s)->r20 = tsk->p_opptr->tgid; -- return tsk->tgid; -+ (®s)->r20 = bproc_hook_imv(tsk->p_opptr->tgid,sys_getppid,(tsk->p_opptr)); -+ return bproc_hook_imv(tsk->tgid,sys_getpid,()); - } - - asmlinkage unsigned long osf_mmap(unsigned long addr, unsigned long len, -Index: linux/arch/alpha/kernel/entry.S -=================================================================== ---- linux.orig/arch/alpha/kernel/entry.S 2003-09-03 17:52:01.000000000 -0400 -+++ linux/arch/alpha/kernel/entry.S 2003-09-03 17:52:04.000000000 -0400 -@@ -212,8 +212,10 @@ - * stack buildup, as we can't do system calls from kernel space. - */ - .align 3 -+.globl kernel_clone - .ent kernel_clone - kernel_clone: -+ ldgp $29,0($27) /* we can be called from a module */ - .frame $30, 0, $26 - .prologue 0 - subq $30,6*8,$30 -@@ -230,6 +232,23 @@ - br ret_from_sys_call - .end kernel_clone - -+.align 3 -+.globl ret_to_user_space -+.ent ret_to_user_space -+ret_to_user_space: -+ ldgp $29, 0($27) /* We can jump here from a module */ -+ bsr $1, undo_switch_stack -+ lda $1, 8($31) /* Set ps = 8 */ -+ stq $1, 0xB8($30) -+ -+ /* This tidbit ripped from entSys. Is this appropriate here ? */ -+ blt $0,syscall_error /* the call failed */ -+ stq $0,0($30) -+ stq $31,72($30) /* a3=0 => no error */ -+ -+ br ret_from_sys_call -+.end ret_to_user_space -+ - /* - * arch_kernel_thread(fn, arg, clone_flags) - */ -@@ -240,19 +259,24 @@ - ldgp $29,0($27) /* we can be called from a module */ - .frame $30, 4*8, $26 - subq $30,4*8,$30 -+ stq $11,24($30) - stq $10,16($30) - stq $9,8($30) -- lda $0,CLONE_VM - stq $26,0($30) - .prologue 1 - mov $16,$9 /* save fn */ - mov $17,$10 /* save arg */ -- or $18,$0,$16 /* shuffle flags to front; add CLONE_VM. */ -- bsr $26,kernel_clone -+ mov $18,$11 /* save flags */ -+ bsr $26,bproc_kcall_ -+ lda $0,CLONE_VM -+ or $11,$0,$16 /* shuffle flags to front; add CLONE_VM. */ -+ jsr $26,kernel_clone -+ ldgp $29,0($26) - bne $20,1f /* $20 is non-zero in child */ - ldq $26,0($30) - ldq $9,8($30) - ldq $10,16($30) -+ ldq $11,24($30) - addq $30,4*8,$30 - ret $31,($26),1 - /* this is in child: look out as we don't have any stack here.. */ -@@ -290,6 +314,7 @@ - .end __kernel_execve - - .align 3 -+.globl do_switch_stack - .ent do_switch_stack - do_switch_stack: - lda $30,-SWITCH_STACK_SIZE($30) -@@ -339,6 +364,7 @@ - .end do_switch_stack - - .align 3 -+.globl undo_switch_stack - .ent undo_switch_stack - undo_switch_stack: - ldq $9,0($30) -@@ -1062,7 +1088,7 @@ - .quad alpha_ni_syscall - .quad alpha_ni_syscall - .quad alpha_ni_syscall /* 290 */ -- .quad alpha_ni_syscall -+ .quad sys_ni_syscall /* bproc: please shut up... */ - .quad alpha_ni_syscall - .quad alpha_ni_syscall - .quad alpha_ni_syscall -Index: linux/arch/alpha/kernel/alpha_ksyms.c -=================================================================== ---- linux.orig/arch/alpha/kernel/alpha_ksyms.c 2002-08-02 20:39:42.000000000 -0400 -+++ linux/arch/alpha/kernel/alpha_ksyms.c 2003-09-03 17:52:04.000000000 -0400 -@@ -164,6 +164,17 @@ - EXPORT_SYMBOL(sys_sync); - EXPORT_SYMBOL(sys_wait4); - -+extern void kernel_clone(void); -+extern void ret_to_user_space(void); -+extern void do_switch_stack(void); -+extern void undo_switch_stack(void); -+asmlinkage void syscall_trace(void); -+EXPORT_SYMBOL_NOVERS(kernel_clone); -+EXPORT_SYMBOL_NOVERS(ret_to_user_space); -+EXPORT_SYMBOL_NOVERS(do_switch_stack); -+EXPORT_SYMBOL_NOVERS(undo_switch_stack); -+EXPORT_SYMBOL(syscall_trace); -+ - /* Networking helper routines. */ - EXPORT_SYMBOL(csum_tcpudp_magic); - EXPORT_SYMBOL(ip_compute_csum); -Index: linux/arch/alpha/kernel/process.c -=================================================================== ---- linux.orig/arch/alpha/kernel/process.c 2001-09-30 15:26:08.000000000 -0400 -+++ linux/arch/alpha/kernel/process.c 2003-09-03 17:52:04.000000000 -0400 -@@ -30,6 +30,7 @@ - #include <linux/reboot.h> - #include <linux/tty.h> - #include <linux/console.h> -+#include <linux/bproc.h> - - #include <asm/reg.h> - #include <asm/uaccess.h> -@@ -430,6 +431,9 @@ - error = do_execve(filename, argv, envp, ®s); - putname(filename); - out: -+ if (error == -ENOENT) -+ error = bproc_hook_imv(error, sys_execve, -+ (®s,ufilename,argv,envp)); - return error; - } - -@@ -465,3 +469,10 @@ - } - return pc; - } -+ -+/* This is usually inlined. It's packaged in a function here so that -+ * we can call it from ASM code on this architecture. */ -+void bproc_kcall_(void) -+{ -+ bproc_kcall(); -+} -Index: linux/arch/alpha/kernel/ptrace.c -=================================================================== ---- linux.orig/arch/alpha/kernel/ptrace.c 2001-09-18 20:03:51.000000000 -0400 -+++ linux/arch/alpha/kernel/ptrace.c 2003-09-03 17:52:04.000000000 -0400 -@@ -13,6 +13,7 @@ - #include <linux/ptrace.h> - #include <linux/user.h> - #include <linux/slab.h> -+#include <linux/bproc.h> - - #include <asm/uaccess.h> - #include <asm/pgtable.h> -@@ -248,7 +249,15 @@ - int a4, int a5, struct pt_regs regs) - { - struct task_struct *child; -- long ret; -+ long ret, orig_pid; -+ -+ orig_pid = pid; -+ retry_ptrace: -+ pid = orig_pid; -+ if (bproc_hook_imv(0, ptracem, (request,&pid,addr,data,&ret,®s.r0))) { -+ if (ret == -ELOOP && regs.r0) goto retry_ptrace; -+ return ret; -+ } - - lock_kernel(); - DBG(DBG_MEM, ("request=%ld pid=%ld addr=0x%lx data=0x%lx\n", -@@ -274,6 +283,7 @@ - if (!child) - goto out_notsk; - if (request == PTRACE_ATTACH) { -+ bproc_set_arg(addr); - ret = ptrace_attach(child); - goto out; - } -@@ -282,15 +292,20 @@ - DBG(DBG_MEM, ("child not traced\n")); - goto out; - } -+ if (child->p_pptr != current && -+ !bproc_hook_v(0,ptrace_slave_call,(request,child,addr))) { -+ DBG(DBG_MEM, ("child not parent of this process\n")); -+ goto out; -+ } -+ if (bproc_isghost(child)) { -+ bproc_hook(ptraceg,(request,child,addr,data,&ret,®s.r0)); -+ goto out; -+ } - if (child->state != TASK_STOPPED) { - DBG(DBG_MEM, ("child process not stopped\n")); - if (request != PTRACE_KILL) - goto out; - } -- if (child->p_pptr != current) { -- DBG(DBG_MEM, ("child not parent of this process\n")); -- goto out; -- } - - switch (request) { - /* When I and D space are separate, these will need to be fixed. */ -@@ -384,6 +399,7 @@ - free_task_struct(child); - out_notsk: - unlock_kernel(); -+ if (ret == -ELOOP && regs.r0) goto retry_ptrace; - return ret; - } - -@@ -395,6 +411,7 @@ - return; - current->exit_code = SIGTRAP; - current->state = TASK_STOPPED; -+ bproc_hook_im(stop_notify,(SIGTRAP)); - notify_parent(current, SIGCHLD); - schedule(); - /* -Index: linux/arch/ppc/config.in -=================================================================== ---- linux.orig/arch/ppc/config.in 2002-11-28 18:53:11.000000000 -0500 -+++ linux/arch/ppc/config.in 2003-09-03 17:52:04.000000000 -0400 -@@ -162,6 +162,7 @@ - bool 'Networking support' CONFIG_NET - bool 'Sysctl support' CONFIG_SYSCTL - bool 'System V IPC' CONFIG_SYSVIPC -+bool 'Beowulf Distributed Process Space' CONFIG_BPROC - bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT - - # only elf supported, a.out is not -- Cort -Index: linux/arch/ppc/kernel/signal.c -=================================================================== ---- linux.orig/arch/ppc/kernel/signal.c 2002-11-28 18:53:11.000000000 -0500 -+++ linux/arch/ppc/kernel/signal.c 2003-09-03 17:52:04.000000000 -0400 -@@ -29,6 +29,7 @@ - #include <linux/unistd.h> - #include <linux/stddef.h> - #include <linux/elf.h> -+#include <linux/bproc.h> - #include <asm/ucontext.h> - #include <asm/uaccess.h> - #include <asm/pgtable.h> -@@ -579,6 +580,7 @@ - /* Let the debugger run. */ - current->exit_code = signr; - current->state = TASK_STOPPED; -+ bproc_hook_im(stop_notify,(signr)); - notify_parent(current, SIGCHLD); - schedule(); - -@@ -636,6 +638,7 @@ - case SIGSTOP: - current->state = TASK_STOPPED; - current->exit_code = signr; -+ bproc_hook_im(stop_notify,(signr)); - if (!(current->p_pptr->sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP)) - notify_parent(current, SIGCHLD); - schedule(); -Index: linux/arch/ppc/kernel/ptrace.c -=================================================================== ---- linux.orig/arch/ppc/kernel/ptrace.c 2002-11-28 18:53:11.000000000 -0500 -+++ linux/arch/ppc/kernel/ptrace.c 2003-09-03 17:52:04.000000000 -0400 -@@ -27,6 +27,7 @@ - #include <linux/errno.h> - #include <linux/ptrace.h> - #include <linux/user.h> -+#include <linux/bproc.h> - - #include <asm/uaccess.h> - #include <asm/page.h> -@@ -161,6 +162,15 @@ - { - struct task_struct *child; - int ret = -EPERM; -+ long orig_pid; -+ -+ orig_pid = pid; -+ retry_ptrace: -+ pid = orig_pid; -+ if (bproc_hook_imv(0, ptracem,(request,&pid,addr,data,(long*)&ret,0))){ -+ if (ret == -ELOOP) goto retry_ptrace; -+ return ret; -+ } - - lock_kernel(); - if (request == PTRACE_TRACEME) { -@@ -186,14 +196,21 @@ - goto out_tsk; - - if (request == PTRACE_ATTACH) { -+ bproc_set_arg(addr); - ret = ptrace_attach(child); - goto out_tsk; - } - -+ bproc_set_arg(request == PTRACE_DETACH ? addr : 0); - ret = ptrace_check_attach(child, request == PTRACE_KILL); - if (ret < 0) - goto out_tsk; - -+ if (bproc_isghost(child)) { -+ bproc_hook(ptraceg, (request,child,addr,data,(long*)&ret,0)); -+ goto out_tsk; -+ } -+ - switch (request) { - /* when I and D space are separate, these will need to be fixed. */ - case PTRACE_PEEKTEXT: /* read word at location addr. */ -@@ -342,6 +359,7 @@ - free_task_struct(child); - out: - unlock_kernel(); -+ if (ret == -ELOOP) goto retry_ptrace; - return ret; - } - -@@ -352,6 +370,7 @@ - return; - current->exit_code = SIGTRAP; - current->state = TASK_STOPPED; -+ bproc_hook_im(stop_notify,(SIGTRAP)); - notify_parent(current, SIGCHLD); - schedule(); - /* -Index: linux/arch/ppc/kernel/ppc_ksyms.c -=================================================================== ---- linux.orig/arch/ppc/kernel/ppc_ksyms.c 2002-11-28 18:53:11.000000000 -0500 -+++ linux/arch/ppc/kernel/ppc_ksyms.c 2003-09-03 17:52:04.000000000 -0400 -@@ -366,3 +366,5 @@ - EXPORT_SYMBOL_NOVERS(agp_special_page); - #endif /* defined(CONFIG_ALL_PPC) */ - -+asmlinkage void ret_from_syscall_1(void) __asm__("ret_from_syscall_1"); -+EXPORT_SYMBOL_NOVERS(ret_from_syscall_1); -Index: linux/arch/ppc/kernel/misc.S -=================================================================== ---- linux.orig/arch/ppc/kernel/misc.S 2003-09-03 17:51:02.000000000 -0400 -+++ linux/arch/ppc/kernel/misc.S 2003-09-03 17:52:04.000000000 -0400 -@@ -901,6 +901,20 @@ - * arch_kernel_thread(fn, arg, flags) - */ - _GLOBAL(arch_kernel_thread) -+ stwu r1,-28(r1) /* Setup stack frame to save args */ -+ mflr r0 -+ stw r3, 16(r1) -+ stw r4, 20(r1) -+ stw r5, 24(r1) -+ stw r0, 32(r1) -+ bl bproc_kcall_ /* Call bproc_kcall_ hook */ -+ lwz r0, 32(r1) /* Restore stack + arguments */ -+ lwz r5, 24(r1) -+ lwz r4, 20(r1) -+ lwz r3, 16(r1) -+ mtlr r0 -+ addi r1,r1,28 -+ - mr r6,r3 /* function */ - ori r3,r5,CLONE_VM /* flags */ - li r0,__NR_clone -@@ -941,7 +955,29 @@ - SYSCALL(execve) - SYSCALL(open) - SYSCALL(close) --SYSCALL(waitpid) -+_GLOBAL(waitpid) -+ stwu r1,-28(r1) /* Setup stack frame to save args */ -+ mflr r0 -+ stw r3, 16(r1) -+ stw r4, 20(r1) -+ stw r5, 24(r1) -+ stw r0, 32(r1) -+ bl bproc_kcall_ /* Call bproc_kcall_ hook */ -+ lwz r0, 32(r1) /* Restore stack + arguments */ -+ lwz r5, 24(r1) -+ lwz r4, 20(r1) -+ lwz r3, 16(r1) -+ mtlr r0 -+ addi r1,r1,28 -+ -+ li r0,__NR_waitpid -+ sc -+ bnslr -+ lis r4,errno@ha -+ stw r3,errno@l(r4) -+ li r3,-1 -+ blr -+ - SYSCALL(fork) - SYSCALL(delete_module) - SYSCALL(_exit) -Index: linux/arch/ppc/kernel/process.c -=================================================================== ---- linux.orig/arch/ppc/kernel/process.c 2001-11-26 08:29:17.000000000 -0500 -+++ linux/arch/ppc/kernel/process.c 2003-09-03 17:52:04.000000000 -0400 -@@ -34,6 +34,7 @@ - #include <linux/user.h> - #include <linux/elf.h> - #include <linux/init.h> -+#include <linux/bproc.h> - - #include <asm/pgtable.h> - #include <asm/uaccess.h> -@@ -443,6 +444,10 @@ - current->ptrace &= ~PT_DTRACE; - putname(filename); - out: -+ if (error == -ENOENT) -+ error = bproc_hook_imv(error, sys_execve, -+ (regs,(char*)a0,(char**)a1,(char**)a2)); -+ - return error; - } - -@@ -605,3 +610,10 @@ - } while (count++ < 16); - return 0; - } -+ -+/* This is usually inlined. It's packaged in a function here so that -+ * we can call it from ASM code on this architecture. */ -+void bproc_kcall_(void) -+{ -+ bproc_kcall(); -+} -Index: linux/fs/inode.c -=================================================================== ---- linux.orig/fs/inode.c 2003-09-03 17:52:00.000000000 -0400 -+++ linux/fs/inode.c 2003-09-03 17:52:04.000000000 -0400 -@@ -816,6 +816,76 @@ - return inode; - } - -+/* -+ * This just initializes the inode fields -+ * to known values before returning the inode.. -+ * -+ * i_sb, i_ino, i_count, i_state and the lists have -+ * been initialized elsewhere.. -+ */ -+static void clean_inode(struct inode *inode) -+{ -+ static struct address_space_operations empty_aops; -+ static struct inode_operations empty_iops; -+ static struct file_operations empty_fops; -+ memset(&inode->u, 0, sizeof(inode->u)); -+ inode->i_sock = 0; -+ inode->i_op = &empty_iops; -+ inode->i_fop = &empty_fops; -+ inode->i_nlink = 1; -+ atomic_set(&inode->i_writecount, 0); -+ inode->i_size = 0; -+ inode->i_blocks = 0; -+ inode->i_generation = 0; -+ memset(&inode->i_dquot, 0, sizeof(inode->i_dquot)); -+ inode->i_pipe = NULL; -+ inode->i_bdev = NULL; -+ inode->i_cdev = NULL; -+ inode->i_data.a_ops = &empty_aops; -+ inode->i_data.host = inode; -+ inode->i_data.gfp_mask = GFP_HIGHUSER; -+ inode->i_mapping = &inode->i_data; -+} -+ -+/** -+ * get_empty_inode - obtain an inode -+ * -+ * This is called by things like the networking layer -+ * etc that want to get an inode without any inode -+ * number, or filesystems that allocate new inodes with -+ * no pre-existing information. -+ * -+ * On a successful return the inode pointer is returned. On a failure -+ * a %NULL pointer is returned. The returned inode is not on any superblock -+ * lists. -+ */ -+ -+struct inode * get_empty_inode(void) -+{ -+ static unsigned long last_ino; -+ struct inode * inode; -+ -+ spin_lock_prefetch(&inode_lock); -+ -+ inode = (struct inode *) kmem_cache_alloc(inode_cachep, SLAB_KERNEL); -+ if (inode) -+ { -+ spin_lock(&inode_lock); -+ inodes_stat.nr_inodes++; -+ list_add(&inode->i_list, &inode_in_use); -+ inode->i_sb = NULL; -+ inode->i_dev = 0; -+ inode->i_blkbits = 0; -+ inode->i_ino = ++last_ino; -+ inode->i_flags = 0; -+ atomic_set(&inode->i_count, 1); -+ inode->i_state = 0; -+ spin_unlock(&inode_lock); -+ clean_inode(inode); -+ } -+ return inode; -+} -+ - /** - * new_inode - obtain an inode - * @sb: superblock -Index: linux/include/linux/fs.h -=================================================================== ---- linux.orig/include/linux/fs.h 2003-09-03 17:52:02.000000000 -0400 -+++ linux/include/linux/fs.h 2003-09-03 17:52:04.000000000 -0400 -@@ -1440,6 +1440,7 @@ - - extern void clear_inode(struct inode *); - extern struct inode *new_inode(struct super_block *sb); -+extern struct inode * get_empty_inode(void); - extern void remove_suid(struct inode *inode); - - extern void insert_inode_hash(struct inode *); -Index: linux/arch/i386/kernel/setup.c -=================================================================== ---- linux.orig/arch/i386/kernel/setup.c 2003-09-03 17:51:01.000000000 -0400 -+++ linux/arch/i386/kernel/setup.c 2003-09-03 17:53:05.000000000 -0400 -@@ -172,6 +172,8 @@ - static u32 disabled_x86_caps[NCAPINTS] __initdata = { 0 }; - extern int blk_nohighio; - -+int enable_acpi_smp_table; -+ - /* - * This is set up by the setup-routine at boot-time - */ diff --git a/lustre/kernel_patches/patches/cifs_2.6.5.patch b/lustre/kernel_patches/patches/cifs_2.6.5.patch deleted file mode 100644 index 35db137e0d..0000000000 --- a/lustre/kernel_patches/patches/cifs_2.6.5.patch +++ /dev/null @@ -1,65 +0,0 @@ -#EJF i took out part of this change set - - -# This is a BitKeeper generated diff -Nru style patch. -# -# ChangeSet -# 2004/01/30 17:20:19-06:00 stevef@stevef95.austin.ibm.com -# Relax requested CIFS permissions on open to simply request GENERIC_READ and GENERIC_WRITE (instead of GENERIC_ALL which -# can unnecessarily conflict with share permissions by asking implicitly for take ownership and other unneeded flags) -# -# fs/cifs/dir.c -# 2004/01/30 17:20:13-06:00 stevef@stevef95.austin.ibm.com +7 -3 -# Relax requested CIFS permissions on open to simply request GENERIC_READ and GENERIC_WRITE (instead of GENERIC_ALL which -# can unnecessarily conflict with share permissions by asking implicitly for take ownership and other unneeded flags) -# -# fs/cifs/file.c -# 2004/01/30 17:20:13-06:00 stevef@stevef95.austin.ibm.com +12 -4 -# Relax requested CIFS permissions on open to simply request GENERIC_READ and GENERIC_WRITE (instead of GENERIC_ALL which -# can unnecessarily conflict with share permissions by asking implicitly for take ownership and other unneeded flags) -# -diff -Nru a/fs/cifs/dir.c b/fs/cifs/dir.c ---- a/fs/cifs/dir.c Mon May 3 16:32:08 2004 -+++ b/fs/cifs/dir.c Mon May 3 16:32:08 2004 -@@ -125,7 +125,7 @@ - int rc = -ENOENT; - int xid; - int oplock = 0; -- int desiredAccess = GENERIC_ALL; -+ int desiredAccess = GENERIC_READ | GENERIC_WRITE; - __u16 fileHandle; - struct cifs_sb_info *cifs_sb; - struct cifsTconInfo *pTcon; -@@ -150,8 +150,12 @@ - desiredAccess = GENERIC_READ; - else if ((nd->intent.open.flags & O_ACCMODE) == O_WRONLY) - desiredAccess = GENERIC_WRITE; -- else if ((nd->intent.open.flags & O_ACCMODE) == O_RDWR) -- desiredAccess = GENERIC_ALL; -+ else if ((nd->intent.open.flags & O_ACCMODE) == O_RDWR) { -+ /* GENERIC_ALL is too much permission to request */ -+ /* can cause unnecessary access denied on create */ -+ /* desiredAccess = GENERIC_ALL; */ -+ desiredAccess = GENERIC_READ | GENERIC_WRITE; -+ } - - if((nd->intent.open.flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) - disposition = FILE_CREATE; -diff -Nru a/fs/cifs/file.c b/fs/cifs/file.c ---- a/fs/cifs/file.c Mon May 3 16:32:08 2004 -+++ b/fs/cifs/file.c Mon May 3 16:32:08 2004 -@@ -87,8 +87,12 @@ - desiredAccess = GENERIC_READ; - else if ((file->f_flags & O_ACCMODE) == O_WRONLY) - desiredAccess = GENERIC_WRITE; -- else if ((file->f_flags & O_ACCMODE) == O_RDWR) -- desiredAccess = GENERIC_ALL; -+ else if ((file->f_flags & O_ACCMODE) == O_RDWR) { -+ /* GENERIC_ALL is too much permission to request */ -+ /* can cause unnecessary access denied on create */ -+ /* desiredAccess = GENERIC_ALL; */ -+ desiredAccess = GENERIC_READ | GENERIC_WRITE; -+ } - - /********************************************************************* - * open flag mapping table: diff --git a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.19-pre1.patch b/lustre/kernel_patches/patches/configurable-x86-stack-2.4.19-pre1.patch deleted file mode 100644 index 3f79b5b1ec..0000000000 --- a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.19-pre1.patch +++ /dev/null @@ -1,302 +0,0 @@ -Index: linux-2.4.19-pre1/arch/i386/kernel/entry.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/kernel/entry.S 2003-11-21 03:38:55.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/kernel/entry.S 2003-12-01 18:14:32.000000000 +0300 -@@ -45,6 +45,7 @@ - #include <linux/linkage.h> - #include <asm/segment.h> - #include <asm/smp.h> -+#include <asm/current.h> - - EBX = 0x00 - ECX = 0x04 -@@ -128,10 +129,6 @@ - .long 3b,6b; \ - .previous - --#define GET_CURRENT(reg) \ -- movl $-8192, reg; \ -- andl %esp, reg -- - ENTRY(lcall7) - pushfl # We get a different stack layout with call gates, - pushl %eax # which has to be cleaned up later.. -@@ -144,7 +141,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x7 -@@ -165,7 +162,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x27 -Index: linux-2.4.19-pre1/arch/i386/kernel/smpboot.c -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/kernel/smpboot.c 2001-12-21 20:41:53.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/kernel/smpboot.c 2003-12-01 18:14:32.000000000 +0300 -@@ -819,7 +819,7 @@ - - /* So we see what's up */ - printk("Booting processor %d/%d eip %lx\n", cpu, apicid, start_eip); -- stack_start.esp = (void *) (1024 + PAGE_SIZE + (char *)idle); -+ stack_start.esp = (void *)idle->thread.esp; - - /* - * This grunge runs the startup process for -@@ -892,7 +892,7 @@ - Dprintk("CPU has booted.\n"); - } else { - boot_error= 1; -- if (*((volatile unsigned char *)phys_to_virt(8192)) -+ if (*((volatile unsigned char *)phys_to_virt(THREAD_SIZE)) - == 0xA5) - /* trampoline started but...? */ - printk("Stuck ??\n"); -@@ -915,7 +915,7 @@ - } - - /* mark "stuck" area as not stuck */ -- *((volatile unsigned long *)phys_to_virt(8192)) = 0; -+ *((volatile unsigned long *)phys_to_virt(THREAD_SIZE)) = 0; - - if(clustered_apic_mode) { - printk("Restoring NMI vector\n"); -Index: linux-2.4.19-pre1/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/kernel/traps.c 2003-12-01 18:11:31.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/kernel/traps.c 2003-12-01 18:14:32.000000000 +0300 -@@ -158,7 +158,7 @@ - unsigned long esp = tsk->thread.esp; - - /* User space on another CPU? */ -- if ((esp ^ (unsigned long)tsk) & (PAGE_MASK<<1)) -+ if ((esp ^ (unsigned long)tsk) & ~(THREAD_SIZE - 1)) - return; - show_trace((unsigned long *)esp); - } -Index: linux-2.4.19-pre1/arch/i386/kernel/head.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/kernel/head.S 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/kernel/head.S 2003-12-01 18:14:32.000000000 +0300 -@@ -15,6 +15,7 @@ - #include <asm/page.h> - #include <asm/pgtable.h> - #include <asm/desc.h> -+#include <asm/current.h> - - #define OLD_CL_MAGIC_ADDR 0x90020 - #define OLD_CL_MAGIC 0xA33F -@@ -320,7 +321,7 @@ - ret - - ENTRY(stack_start) -- .long SYMBOL_NAME(init_task_union)+8192 -+ .long SYMBOL_NAME(init_task_union)+THREAD_SIZE - .long __KERNEL_DS - - /* This is the default interrupt "handler" :-) */ -Index: linux-2.4.19-pre1/arch/i386/lib/getuser.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/lib/getuser.S 1998-01-13 00:42:52.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/lib/getuser.S 2003-12-01 18:14:32.000000000 +0300 -@@ -21,6 +21,10 @@ - * as they get called from within inline assembly. - */ - -+/* Duplicated from asm/processor.h */ -+#include <asm/current.h> -+#include <linux/config.h> -+ - addr_limit = 12 - - .text -@@ -28,7 +32,7 @@ - .globl __get_user_1 - __get_user_1: - movl %esp,%edx -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 1: movzbl (%eax),%edx -@@ -41,7 +45,7 @@ - addl $1,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 2: movzwl -1(%eax),%edx -@@ -54,7 +58,7 @@ - addl $3,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 3: movl -3(%eax),%edx -Index: linux-2.4.19-pre1/arch/i386/config.in -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/config.in 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/config.in 2003-12-01 18:14:32.000000000 +0300 -@@ -201,6 +201,29 @@ - if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then - define_bool CONFIG_HAVE_DEC_LOCK y - fi -+ -+choice 'Bigger Stack Size Support' \ -+ "off CONFIG_NOBIGSTACK \ -+ 16KB CONFIG_STACK_SIZE_16KB \ -+ 32KB CONFIG_STACK_SIZE_32KB \ -+ 64KB CONFIG_STACK_SIZE_64KB" off -+ -+if [ "$CONFIG_NOBIGSTACK" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 1 -+else -+ if [ "$CONFIG_STACK_SIZE_16KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 2 -+ else -+ if [ "$CONFIG_STACK_SIZE_32KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 3 -+ else -+ if [ "$CONFIG_STACK_SIZE_64KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 4 -+ fi -+ fi -+ fi -+fi -+ - endmenu - - mainmenu_option next_comment -Index: linux-2.4.19-pre1/arch/i386/vmlinux.lds -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/vmlinux.lds 2003-11-20 19:01:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/vmlinux.lds 2003-12-01 18:14:32.000000000 +0300 -@@ -35,7 +35,8 @@ - - _edata = .; /* End of data section */ - -- . = ALIGN(8192); /* init_task */ -+/* chose the biggest of the possible stack sizes here? */ -+ . = ALIGN(65536); /* init_task */ - .data.init_task : { *(.data.init_task) } - - . = ALIGN(4096); /* Init code and data */ -Index: linux-2.4.19-pre1/include/asm-i386/current.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-i386/current.h 1998-08-15 03:35:22.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-i386/current.h 2003-12-01 18:14:32.000000000 +0300 -@@ -1,15 +1,43 @@ - #ifndef _I386_CURRENT_H - #define _I386_CURRENT_H -+#include <asm/page.h> -+ -+/* -+ * Configurable page sizes on i386, mainly for debugging purposes. -+ * (c) Balbir Singh -+ */ -+ -+#ifdef __ASSEMBLY__ -+ -+#define PAGE_SIZE 4096 /* as cannot handle 1UL << 12 */ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+ -+#define GET_CURRENT(reg) \ -+ movl $-THREAD_SIZE, reg; \ -+ andl %esp, reg -+ -+#else /* __ASSEMBLY__ */ -+ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+#define alloc_task_struct() \ -+ ((struct task_struct *) __get_free_pages(GFP_KERNEL,CONFIG_STACK_SIZE_SHIFT)) -+ -+#define free_task_struct(p) \ -+ free_pages((unsigned long) (p), CONFIG_STACK_SIZE_SHIFT) -+ -+#define INIT_TASK_SIZE THREAD_SIZE - - struct task_struct; - - static inline struct task_struct * get_current(void) - { - struct task_struct *current; -- __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); -+ __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~(THREAD_SIZE - 1))); - return current; - } - - #define current get_current() - -+#endif /* __ASSEMBLY__ */ -+ - #endif /* !(_I386_CURRENT_H) */ -Index: linux-2.4.19-pre1/include/asm-i386/hw_irq.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-i386/hw_irq.h 2003-11-21 02:59:05.000000000 +0300 -+++ linux-2.4.19-pre1/include/asm-i386/hw_irq.h 2003-12-01 18:14:32.000000000 +0300 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <asm/atomic.h> - #include <asm/irq.h> -+#include <asm/current.h> - - /* - * IDT vectors usable for external interrupt sources start -@@ -113,10 +114,6 @@ - #define IRQ_NAME2(nr) nr##_interrupt(void) - #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) - --#define GET_CURRENT \ -- "movl %esp, %ebx\n\t" \ -- "andl $-8192, %ebx\n\t" -- - /* - * SMP has a few special interrupts for IPI messages - */ -Index: linux-2.4.19-pre1/include/asm-i386/processor.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-i386/processor.h 2003-11-21 02:59:05.000000000 +0300 -+++ linux-2.4.19-pre1/include/asm-i386/processor.h 2003-12-01 18:14:32.000000000 +0300 -@@ -14,6 +14,7 @@ - #include <asm/types.h> - #include <asm/sigcontext.h> - #include <asm/cpufeature.h> -+#include <asm/current.h> - #include <linux/cache.h> - #include <linux/config.h> - #include <linux/threads.h> -@@ -447,9 +448,6 @@ - #define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1019]) - #define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1022]) - --#define THREAD_SIZE (2*PAGE_SIZE) --#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) --#define free_task_struct(p) free_pages((unsigned long) (p), 1) - #define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count) - - #define init_task (init_task_union.task) -Index: linux-2.4.19-pre1/include/linux/sched.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/sched.h 2003-12-01 18:11:28.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/sched.h 2003-12-01 18:14:32.000000000 +0300 -@@ -2,6 +2,7 @@ - #define _LINUX_SCHED_H - - #include <asm/param.h> /* for HZ */ -+#include <asm/current.h> /* maybe for INIT_TASK_SIZE */ - - extern unsigned long event; - diff --git a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.20-rh.patch b/lustre/kernel_patches/patches/configurable-x86-stack-2.4.20-rh.patch deleted file mode 100644 index f70b0d42cd..0000000000 --- a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.20-rh.patch +++ /dev/null @@ -1,311 +0,0 @@ -Index: linux-2.4.20-rh-20.9/arch/i386/kernel/entry.S -=================================================================== ---- linux-2.4.20-rh-20.9.orig/arch/i386/kernel/entry.S 2003-09-13 19:34:35.000000000 +0400 -+++ linux-2.4.20-rh-20.9/arch/i386/kernel/entry.S 2003-12-01 18:02:14.000000000 +0300 -@@ -45,6 +45,7 @@ - #include <linux/linkage.h> - #include <asm/segment.h> - #include <asm/smp.h> -+#include <asm/current.h> - - EBX = 0x00 - ECX = 0x04 -@@ -130,10 +131,6 @@ - .long 3b,6b; \ - .previous - --#define GET_CURRENT(reg) \ -- movl $-8192, reg; \ -- andl %esp, reg -- - ENTRY(lcall7) - pushfl # We get a different stack layout with call gates, - pushl %eax # which has to be cleaned up later.. -@@ -149,7 +146,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x7 -@@ -173,7 +170,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x27 -Index: linux-2.4.20-rh-20.9/arch/i386/kernel/smpboot.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/arch/i386/kernel/smpboot.c 2003-09-13 19:34:35.000000000 +0400 -+++ linux-2.4.20-rh-20.9/arch/i386/kernel/smpboot.c 2003-12-01 18:02:14.000000000 +0300 -@@ -811,7 +811,7 @@ - - /* So we see what's up */ - printk("Booting processor %d/%d eip %lx\n", cpu, apicid, start_eip); -- stack_start.esp = (void *) (1024 + PAGE_SIZE + (char *)idle); -+ stack_start.esp = (void *)idle->thread.esp; - - /* - * This grunge runs the startup process for -@@ -884,7 +884,7 @@ - Dprintk("CPU has booted.\n"); - } else { - boot_error= 1; -- if (*((volatile unsigned char *)phys_to_virt(8192)) -+ if (*((volatile unsigned char *)phys_to_virt(THREAD_SIZE)) - == 0xA5) - /* trampoline started but...? */ - printk("Stuck ??\n"); -@@ -907,7 +907,7 @@ - } - - /* mark "stuck" area as not stuck */ -- *((volatile unsigned long *)phys_to_virt(8192)) = 0; -+ *((volatile unsigned long *)phys_to_virt(THREAD_SIZE)) = 0; - - if(clustered_apic_mode == CLUSTERED_APIC_NUMAQ) { - printk("Restoring NMI vector\n"); -Index: linux-2.4.20-rh-20.9/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/arch/i386/kernel/traps.c 2003-09-13 19:34:35.000000000 +0400 -+++ linux-2.4.20-rh-20.9/arch/i386/kernel/traps.c 2003-12-01 18:02:14.000000000 +0300 -@@ -161,7 +161,7 @@ - unsigned long esp = tsk->thread.esp; - - /* User space on another CPU? */ -- if ((esp ^ (unsigned long)tsk) & (PAGE_MASK<<1)) -+ if ((esp ^ (unsigned long)tsk) & ~(THREAD_SIZE - 1)) - return; - show_trace((unsigned long *)esp); - } -Index: linux-2.4.20-rh-20.9/arch/i386/kernel/head.S -=================================================================== ---- linux-2.4.20-rh-20.9.orig/arch/i386/kernel/head.S 2003-09-13 19:34:35.000000000 +0400 -+++ linux-2.4.20-rh-20.9/arch/i386/kernel/head.S 2003-12-01 18:02:14.000000000 +0300 -@@ -15,6 +15,7 @@ - #include <asm/page.h> - #include <asm/pgtable.h> - #include <asm/desc.h> -+#include <asm/current.h> - - #define OLD_CL_MAGIC_ADDR 0x90020 - #define OLD_CL_MAGIC 0xA33F -@@ -315,7 +316,7 @@ - ret - - ENTRY(stack_start) -- .long SYMBOL_NAME(init_task_union)+8192 -+ .long SYMBOL_NAME(init_task_union)+THREAD_SIZE - .long __KERNEL_DS - - /* This is the default interrupt "handler" :-) */ -Index: linux-2.4.20-rh-20.9/arch/i386/kernel/irq.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/arch/i386/kernel/irq.c 2003-12-01 17:42:59.000000000 +0300 -+++ linux-2.4.20-rh-20.9/arch/i386/kernel/irq.c 2003-12-01 18:02:14.000000000 +0300 -@@ -581,7 +581,10 @@ - long esp; - - /* Debugging check for stack overflow: is there less than 1KB free? */ -- __asm__ __volatile__("andl %%esp,%0" : "=r" (esp) : "0" (8191)); -+ __asm__ __volatile__( -+ "andl %%esp,%0" -+ : "=r" (esp) : "0" (THREAD_SIZE-1)); -+ - if (unlikely(esp < (sizeof(struct task_struct) + 1024))) { - extern void show_stack(unsigned long *); - -Index: linux-2.4.20-rh-20.9/arch/i386/lib/getuser.S -=================================================================== ---- linux-2.4.20-rh-20.9.orig/arch/i386/lib/getuser.S 1998-01-13 00:42:52.000000000 +0300 -+++ linux-2.4.20-rh-20.9/arch/i386/lib/getuser.S 2003-12-01 18:02:14.000000000 +0300 -@@ -21,6 +21,10 @@ - * as they get called from within inline assembly. - */ - -+/* Duplicated from asm/processor.h */ -+#include <asm/current.h> -+#include <linux/config.h> -+ - addr_limit = 12 - - .text -@@ -28,7 +32,7 @@ - .globl __get_user_1 - __get_user_1: - movl %esp,%edx -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 1: movzbl (%eax),%edx -@@ -41,7 +45,7 @@ - addl $1,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 2: movzwl -1(%eax),%edx -@@ -54,7 +58,7 @@ - addl $3,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 3: movl -3(%eax),%edx -Index: linux-2.4.20-rh-20.9/arch/i386/config.in -=================================================================== ---- linux-2.4.20-rh-20.9.orig/arch/i386/config.in 2003-09-13 19:34:34.000000000 +0400 -+++ linux-2.4.20-rh-20.9/arch/i386/config.in 2003-12-01 18:02:14.000000000 +0300 -@@ -266,6 +266,29 @@ - if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then - define_bool CONFIG_HAVE_DEC_LOCK y - fi -+ -+choice 'Bigger Stack Size Support' \ -+ "off CONFIG_NOBIGSTACK \ -+ 16KB CONFIG_STACK_SIZE_16KB \ -+ 32KB CONFIG_STACK_SIZE_32KB \ -+ 64KB CONFIG_STACK_SIZE_64KB" off -+ -+if [ "$CONFIG_NOBIGSTACK" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 1 -+else -+ if [ "$CONFIG_STACK_SIZE_16KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 2 -+ else -+ if [ "$CONFIG_STACK_SIZE_32KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 3 -+ else -+ if [ "$CONFIG_STACK_SIZE_64KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 4 -+ fi -+ fi -+ fi -+fi -+ - endmenu - - mainmenu_option next_comment -Index: linux-2.4.20-rh-20.9/arch/i386/vmlinux.lds -=================================================================== ---- linux-2.4.20-rh-20.9.orig/arch/i386/vmlinux.lds 2003-09-13 19:34:24.000000000 +0400 -+++ linux-2.4.20-rh-20.9/arch/i386/vmlinux.lds 2003-12-01 18:02:14.000000000 +0300 -@@ -38,7 +38,8 @@ - - _edata = .; /* End of data section */ - -- . = ALIGN(8192); /* init_task */ -+/* chose the biggest of the possible stack sizes here? */ -+ . = ALIGN(65536); /* init_task */ - .data.init_task : { *(.data.init_task) } - - . = ALIGN(4096); /* Init code and data */ -Index: linux-2.4.20-rh-20.9/include/asm-i386/current.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/asm-i386/current.h 1998-08-15 03:35:22.000000000 +0400 -+++ linux-2.4.20-rh-20.9/include/asm-i386/current.h 2003-12-01 18:03:28.000000000 +0300 -@@ -1,15 +1,43 @@ - #ifndef _I386_CURRENT_H - #define _I386_CURRENT_H -+#include <asm/page.h> -+ -+/* -+ * Configurable page sizes on i386, mainly for debugging purposes. -+ * (c) Balbir Singh -+ */ -+ -+#ifdef __ASSEMBLY__ -+ -+#define PAGE_SIZE 4096 /* as cannot handle 1UL << 12 */ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+ -+#define GET_CURRENT(reg) \ -+ movl $-THREAD_SIZE, reg; \ -+ andl %esp, reg -+ -+#else /* __ASSEMBLY__ */ -+ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+#define __alloc_task_struct() \ -+ ((struct task_struct *) __get_free_pages(GFP_KERNEL,CONFIG_STACK_SIZE_SHIFT)) -+ -+#define __free_task_struct(p) \ -+ free_pages((unsigned long) (p), CONFIG_STACK_SIZE_SHIFT) -+ -+#define INIT_TASK_SIZE THREAD_SIZE - - struct task_struct; - - static inline struct task_struct * get_current(void) - { - struct task_struct *current; -- __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); -+ __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~(THREAD_SIZE - 1))); - return current; - } - - #define current get_current() - -+#endif /* __ASSEMBLY__ */ -+ - #endif /* !(_I386_CURRENT_H) */ -Index: linux-2.4.20-rh-20.9/include/asm-i386/hw_irq.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/asm-i386/hw_irq.h 2003-11-13 17:35:48.000000000 +0300 -+++ linux-2.4.20-rh-20.9/include/asm-i386/hw_irq.h 2003-12-01 18:02:14.000000000 +0300 -@@ -116,10 +116,6 @@ - #define IRQ_NAME2(nr) nr##_interrupt(void) - #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) - --#define GET_CURRENT \ -- "movl %esp, %ebx\n\t" \ -- "andl $-8192, %ebx\n\t" -- - /* - * SMP has a few special interrupts for IPI messages - */ -Index: linux-2.4.20-rh-20.9/include/asm-i386/processor.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/asm-i386/processor.h 2003-10-08 12:29:57.000000000 +0400 -+++ linux-2.4.20-rh-20.9/include/asm-i386/processor.h 2003-12-01 18:02:14.000000000 +0300 -@@ -14,6 +14,7 @@ - #include <asm/types.h> - #include <asm/sigcontext.h> - #include <asm/cpufeature.h> -+#include <asm/current.h> - #include <linux/cache.h> - #include <linux/config.h> - #include <linux/threads.h> -@@ -469,10 +470,6 @@ - #define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1019]) - #define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1022]) - --#define THREAD_SIZE (2*PAGE_SIZE) --#define __alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) --#define __free_task_struct(p) do { BUG_ON((p)->state < TASK_ZOMBIE); free_pages((unsigned long) (p), 1); } while (0) -- - #define init_task (init_task_union.task) - #define init_stack (init_task_union.stack) - -Index: linux-2.4.20-rh-20.9/include/linux/sched.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/linux/sched.h 2003-11-13 17:35:48.000000000 +0300 -+++ linux-2.4.20-rh-20.9/include/linux/sched.h 2003-12-01 18:02:14.000000000 +0300 -@@ -2,6 +2,7 @@ - #define _LINUX_SCHED_H - - #include <asm/param.h> /* for HZ */ -+#include <asm/current.h> /* maybe for INIT_TASK_SIZE */ - - extern unsigned long event; - diff --git a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.21-sles8sp3.patch b/lustre/kernel_patches/patches/configurable-x86-stack-2.4.21-sles8sp3.patch deleted file mode 100644 index bc0a1b7973..0000000000 --- a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.21-sles8sp3.patch +++ /dev/null @@ -1,330 +0,0 @@ -Index: linux-2.4.21/arch/i386/kernel/entry.S -=================================================================== ---- linux-2.4.21.orig/arch/i386/kernel/entry.S 2004-04-24 02:39:01.000000000 -0400 -+++ linux-2.4.21/arch/i386/kernel/entry.S 2004-04-24 02:42:58.000000000 -0400 -@@ -45,6 +45,7 @@ - #include <linux/linkage.h> - #include <asm/segment.h> - #include <asm/smp.h> -+#include <asm/current.h> - - EBX = 0x00 - ECX = 0x04 -@@ -130,10 +131,6 @@ - .long 3b,6b; \ - .previous - --#define GET_CURRENT(reg) \ -- movl $-8192, reg; \ -- andl %esp, reg -- - ENTRY(lcall7) - pushfl # We get a different stack layout with call gates, - pushl %eax # which has to be cleaned up later.. -@@ -149,7 +146,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x7 -@@ -173,7 +170,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x27 -Index: linux-2.4.21/arch/i386/kernel/smpboot.c -=================================================================== ---- linux-2.4.21.orig/arch/i386/kernel/smpboot.c 2004-04-24 02:39:05.000000000 -0400 -+++ linux-2.4.21/arch/i386/kernel/smpboot.c 2004-04-24 02:42:58.000000000 -0400 -@@ -837,7 +837,7 @@ - - /* So we see what's up */ - printk("Booting processor %d/%d eip %lx\n", cpu, apicid, start_eip); -- stack_start.esp = (void *) (1024 + PAGE_SIZE + (char *)idle); -+ stack_start.esp = (void *)idle->thread.esp; - - /* - * This grunge runs the startup process for -@@ -918,7 +918,7 @@ - Dprintk("CPU has booted.\n"); - } else { - boot_error= 1; -- if (*((volatile unsigned char *)phys_to_virt(8192)) -+ if (*((volatile unsigned char *)phys_to_virt(THREAD_SIZE)) - == 0xA5) - /* trampoline started but...? */ - printk("Stuck ??\n"); -@@ -941,7 +941,7 @@ - } - - /* mark "stuck" area as not stuck */ -- *((volatile unsigned long *)phys_to_virt(8192)) = 0; -+ *((volatile unsigned long *)phys_to_virt(THREAD_SIZE)) = 0; - - #ifdef CONFIG_ES7000 - if (!es7000_plat) -Index: linux-2.4.21/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.21.orig/arch/i386/kernel/traps.c 2004-04-24 02:39:18.000000000 -0400 -+++ linux-2.4.21/arch/i386/kernel/traps.c 2004-04-24 02:42:58.000000000 -0400 -@@ -304,7 +304,7 @@ - unsigned long esp = tsk->thread.esp; - - /* User space on another CPU? */ -- if ((esp ^ (unsigned long)tsk) & (PAGE_MASK<<1)) -+ if ((esp ^ (unsigned long)tsk) & ~(THREAD_SIZE - 1)) - return; - show_trace((unsigned long *)esp); - } -Index: linux-2.4.21/arch/i386/kernel/head.S -=================================================================== ---- linux-2.4.21.orig/arch/i386/kernel/head.S 2004-04-24 02:38:42.000000000 -0400 -+++ linux-2.4.21/arch/i386/kernel/head.S 2004-04-24 02:42:58.000000000 -0400 -@@ -15,6 +15,7 @@ - #include <asm/page.h> - #include <asm/pgtable.h> - #include <asm/desc.h> -+#include <asm/current.h> - - #define OLD_CL_MAGIC_ADDR 0x90020 - #define OLD_CL_MAGIC 0xA33F -@@ -326,7 +327,7 @@ - ret - - ENTRY(stack_start) -- .long SYMBOL_NAME(init_task_union)+8192 -+ .long SYMBOL_NAME(init_task_union)+THREAD_SIZE - .long __KERNEL_DS - - /* This is the default interrupt "handler" :-) */ -Index: linux-2.4.21/arch/i386/kernel/irq.c -=================================================================== ---- linux-2.4.21.orig/arch/i386/kernel/irq.c 2004-04-24 02:39:18.000000000 -0400 -+++ linux-2.4.21/arch/i386/kernel/irq.c 2004-04-24 02:44:26.000000000 -0400 -@@ -602,7 +602,10 @@ - long esp; - - /* Debugging check for stack overflow: is there less than 1KB free? */ -- __asm__ __volatile__("andl %%esp,%0" : "=r" (esp) : "0" (8191)); -+ __asm__ __volatile__( -+ "andl %%esp,%0" -+ : "=r" (esp) : "0" (THREAD_SIZE-1)); -+ - if (unlikely(esp < (sizeof(struct task_struct) + sysctl_stackwarn))) { - static unsigned long next_jiffies; /* ratelimiting */ - static long least_esp = THREAD_SIZE; -Index: linux-2.4.21/arch/i386/lib/getuser.S -=================================================================== ---- linux-2.4.21.orig/arch/i386/lib/getuser.S 1998-01-12 16:42:52.000000000 -0500 -+++ linux-2.4.21/arch/i386/lib/getuser.S 2004-04-24 02:42:58.000000000 -0400 -@@ -21,6 +21,10 @@ - * as they get called from within inline assembly. - */ - -+/* Duplicated from asm/processor.h */ -+#include <asm/current.h> -+#include <linux/config.h> -+ - addr_limit = 12 - - .text -@@ -28,7 +32,7 @@ - .globl __get_user_1 - __get_user_1: - movl %esp,%edx -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 1: movzbl (%eax),%edx -@@ -41,7 +45,7 @@ - addl $1,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 2: movzwl -1(%eax),%edx -@@ -54,7 +58,7 @@ - addl $3,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 3: movl -3(%eax),%edx -Index: linux-2.4.21/arch/i386/config.in -=================================================================== ---- linux-2.4.21.orig/arch/i386/config.in 2004-04-24 02:39:21.000000000 -0400 -+++ linux-2.4.21/arch/i386/config.in 2004-04-24 02:42:58.000000000 -0400 -@@ -326,6 +326,29 @@ - if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then - define_bool CONFIG_HAVE_DEC_LOCK y - fi -+ -+choice 'Bigger Stack Size Support' \ -+ "off CONFIG_NOBIGSTACK \ -+ 16KB CONFIG_STACK_SIZE_16KB \ -+ 32KB CONFIG_STACK_SIZE_32KB \ -+ 64KB CONFIG_STACK_SIZE_64KB" off -+ -+if [ "$CONFIG_NOBIGSTACK" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 1 -+else -+ if [ "$CONFIG_STACK_SIZE_16KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 2 -+ else -+ if [ "$CONFIG_STACK_SIZE_32KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 3 -+ else -+ if [ "$CONFIG_STACK_SIZE_64KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 4 -+ fi -+ fi -+ fi -+fi -+ - endmenu - - mainmenu_option next_comment -Index: linux-2.4.21/arch/i386/vmlinux.lds.S -=================================================================== ---- linux-2.4.21.orig/arch/i386/vmlinux.lds.S 2004-04-24 02:38:06.000000000 -0400 -+++ linux-2.4.21/arch/i386/vmlinux.lds.S 2004-04-24 02:42:58.000000000 -0400 -@@ -39,7 +39,8 @@ - - _edata = .; /* End of data section */ - -- . = ALIGN(8192); /* init_task */ -+/* chose the biggest of the possible stack sizes here? */ -+ . = ALIGN(65536); /* init_task */ - .data.init_task : { *(.data.init_task) } - - . = ALIGN(4096); /* Init code and data */ -Index: linux-2.4.21/include/asm-i386/current.h -=================================================================== ---- linux-2.4.21.orig/include/asm-i386/current.h 1998-08-14 19:35:22.000000000 -0400 -+++ linux-2.4.21/include/asm-i386/current.h 2004-04-24 02:42:58.000000000 -0400 -@@ -1,15 +1,43 @@ - #ifndef _I386_CURRENT_H - #define _I386_CURRENT_H -+#include <asm/page.h> -+ -+/* -+ * Configurable page sizes on i386, mainly for debugging purposes. -+ * (c) Balbir Singh -+ */ -+ -+#ifdef __ASSEMBLY__ -+ -+#define PAGE_SIZE 4096 /* as cannot handle 1UL << 12 */ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+ -+#define GET_CURRENT(reg) \ -+ movl $-THREAD_SIZE, reg; \ -+ andl %esp, reg -+ -+#else /* __ASSEMBLY__ */ -+ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+#define alloc_task_struct() \ -+ ((struct task_struct *) __get_free_pages(GFP_KERNEL,CONFIG_STACK_SIZE_SHIFT)) -+ -+#define free_task_struct(p) \ -+ free_pages((unsigned long) (p), CONFIG_STACK_SIZE_SHIFT) -+ -+#define INIT_TASK_SIZE THREAD_SIZE - - struct task_struct; - - static inline struct task_struct * get_current(void) - { - struct task_struct *current; -- __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); -+ __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~(THREAD_SIZE - 1))); - return current; - } - - #define current get_current() - -+#endif /* __ASSEMBLY__ */ -+ - #endif /* !(_I386_CURRENT_H) */ -Index: linux-2.4.21/include/asm-i386/hw_irq.h -=================================================================== ---- linux-2.4.21.orig/include/asm-i386/hw_irq.h 2004-04-24 02:39:05.000000000 -0400 -+++ linux-2.4.21/include/asm-i386/hw_irq.h 2004-04-24 02:42:58.000000000 -0400 -@@ -16,6 +16,7 @@ - #include <linux/sched.h> - #include <asm/atomic.h> - #include <asm/irq.h> -+#include <asm/current.h> - - /* - * IDT vectors usable for external interrupt sources start -@@ -120,10 +121,6 @@ - #define IRQ_NAME2(nr) nr##_interrupt(void) - #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) - --#define GET_CURRENT \ -- "movl %esp, %ebx\n\t" \ -- "andl $-8192, %ebx\n\t" -- - /* - * SMP has a few special interrupts for IPI messages - */ -Index: linux-2.4.21/include/asm-i386/processor.h -=================================================================== ---- linux-2.4.21.orig/include/asm-i386/processor.h 2004-04-24 02:39:21.000000000 -0400 -+++ linux-2.4.21/include/asm-i386/processor.h 2004-04-24 02:42:58.000000000 -0400 -@@ -14,6 +14,7 @@ - #include <asm/types.h> - #include <asm/sigcontext.h> - #include <asm/cpufeature.h> -+#include <asm/current.h> - #include <linux/cache.h> - #include <linux/config.h> - #include <linux/threads.h> -@@ -466,9 +467,6 @@ - #define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1019]) - #define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1022]) - --#define THREAD_SIZE (2*PAGE_SIZE) --#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) --#define free_task_struct(p) free_pages((unsigned long) (p), 1) - #define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count) - - #define init_task (init_task_union.task) -Index: linux-2.4.21/include/linux/sched.h -=================================================================== ---- linux-2.4.21.orig/include/linux/sched.h 2004-04-24 02:39:20.000000000 -0400 -+++ linux-2.4.21/include/linux/sched.h 2004-04-24 02:42:58.000000000 -0400 -@@ -2,6 +2,7 @@ - #define _LINUX_SCHED_H - - #include <asm/param.h> /* for HZ */ -+#include <asm/current.h> /* maybe for INIT_TASK_SIZE */ - - extern unsigned long event; - -Index: linux-2.4.21/include/asm-x86_64/current.h -=================================================================== ---- linux-2.4.21.orig/include/asm-x86_64/current.h 2002-11-28 18:53:15.000000000 -0500 -+++ linux-2.4.21/include/asm-x86_64/current.h 2004-04-24 02:42:58.000000000 -0400 -@@ -5,6 +5,7 @@ - struct task_struct; - - #include <asm/pda.h> -+#include <asm/page.h> - - static inline struct task_struct *get_current(void) - { diff --git a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.21-suse2.patch b/lustre/kernel_patches/patches/configurable-x86-stack-2.4.21-suse2.patch deleted file mode 100644 index dc68b3e164..0000000000 --- a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.21-suse2.patch +++ /dev/null @@ -1,318 +0,0 @@ -Index: kernel-2.4.21/arch/i386/kernel/entry.S -=================================================================== ---- kernel-2.4.21.orig/arch/i386/kernel/entry.S 2003-06-13 07:51:29.000000000 -0700 -+++ kernel-2.4.21/arch/i386/kernel/entry.S 2003-12-04 11:57:01.000000000 -0800 -@@ -45,6 +45,7 @@ - #include <linux/linkage.h> - #include <asm/segment.h> - #include <asm/smp.h> -+#include <asm/current.h> - - EBX = 0x00 - ECX = 0x04 -@@ -130,10 +131,6 @@ - .long 3b,6b; \ - .previous - --#define GET_CURRENT(reg) \ -- movl $-8192, reg; \ -- andl %esp, reg -- - ENTRY(lcall7) - pushfl # We get a different stack layout with call gates, - pushl %eax # which has to be cleaned up later.. -@@ -149,7 +146,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x7 -@@ -173,7 +170,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x27 -Index: kernel-2.4.21/arch/i386/kernel/smpboot.c -=================================================================== ---- kernel-2.4.21.orig/arch/i386/kernel/smpboot.c 2003-06-13 07:51:29.000000000 -0700 -+++ kernel-2.4.21/arch/i386/kernel/smpboot.c 2003-12-04 11:57:01.000000000 -0800 -@@ -819,7 +819,7 @@ - - /* So we see what's up */ - printk("Booting processor %d/%d eip %lx\n", cpu, apicid, start_eip); -- stack_start.esp = (void *) (1024 + PAGE_SIZE + (char *)idle); -+ stack_start.esp = (void *)idle->thread.esp; - - /* - * This grunge runs the startup process for -@@ -892,7 +892,7 @@ - Dprintk("CPU has booted.\n"); - } else { - boot_error= 1; -- if (*((volatile unsigned char *)phys_to_virt(8192)) -+ if (*((volatile unsigned char *)phys_to_virt(THREAD_SIZE)) - == 0xA5) - /* trampoline started but...? */ - printk("Stuck ??\n"); -@@ -915,7 +915,7 @@ - } - - /* mark "stuck" area as not stuck */ -- *((volatile unsigned long *)phys_to_virt(8192)) = 0; -+ *((volatile unsigned long *)phys_to_virt(THREAD_SIZE)) = 0; - - if(clustered_apic_mode == CLUSTERED_APIC_NUMAQ) { - printk("Restoring NMI vector\n"); -Index: kernel-2.4.21/arch/i386/kernel/traps.c -=================================================================== ---- kernel-2.4.21.orig/arch/i386/kernel/traps.c 2002-11-28 15:53:09.000000000 -0800 -+++ kernel-2.4.21/arch/i386/kernel/traps.c 2003-12-04 11:57:01.000000000 -0800 -@@ -158,7 +158,7 @@ - unsigned long esp = tsk->thread.esp; - - /* User space on another CPU? */ -- if ((esp ^ (unsigned long)tsk) & (PAGE_MASK<<1)) -+ if ((esp ^ (unsigned long)tsk) & ~(THREAD_SIZE - 1)) - return; - show_trace((unsigned long *)esp); - } -Index: kernel-2.4.21/arch/i386/kernel/head.S -=================================================================== ---- kernel-2.4.21.orig/arch/i386/kernel/head.S 2003-06-13 07:51:29.000000000 -0700 -+++ kernel-2.4.21/arch/i386/kernel/head.S 2003-12-04 11:57:01.000000000 -0800 -@@ -15,6 +15,7 @@ - #include <asm/page.h> - #include <asm/pgtable.h> - #include <asm/desc.h> -+#include <asm/current.h> - - #define OLD_CL_MAGIC_ADDR 0x90020 - #define OLD_CL_MAGIC 0xA33F -@@ -320,7 +321,7 @@ - ret - - ENTRY(stack_start) -- .long SYMBOL_NAME(init_task_union)+8192 -+ .long SYMBOL_NAME(init_task_union)+THREAD_SIZE - .long __KERNEL_DS - - /* This is the default interrupt "handler" :-) */ -Index: kernel-2.4.21/arch/i386/kernel/irq.c -=================================================================== ---- kernel-2.4.21.orig/arch/i386/kernel/irq.c 2002-11-28 15:53:09.000000000 -0800 -+++ kernel-2.4.21/arch/i386/kernel/irq.c 2003-12-04 11:57:01.000000000 -0800 -@@ -581,7 +581,10 @@ - long esp; - - /* Debugging check for stack overflow: is there less than 1KB free? */ -- __asm__ __volatile__("andl %%esp,%0" : "=r" (esp) : "0" (8191)); -+ __asm__ __volatile__( -+ "andl %%esp,%0" -+ : "=r" (esp) : "0" (THREAD_SIZE-1)); -+ - if (unlikely(esp < (sizeof(struct task_struct) + 1024))) { - extern void show_stack(unsigned long *); - -Index: kernel-2.4.21/arch/i386/lib/getuser.S -=================================================================== ---- kernel-2.4.21.orig/arch/i386/lib/getuser.S 1998-01-12 13:42:52.000000000 -0800 -+++ kernel-2.4.21/arch/i386/lib/getuser.S 2003-12-04 11:57:01.000000000 -0800 -@@ -21,6 +21,10 @@ - * as they get called from within inline assembly. - */ - -+/* Duplicated from asm/processor.h */ -+#include <asm/current.h> -+#include <linux/config.h> -+ - addr_limit = 12 - - .text -@@ -28,7 +32,7 @@ - .globl __get_user_1 - __get_user_1: - movl %esp,%edx -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 1: movzbl (%eax),%edx -@@ -41,7 +45,7 @@ - addl $1,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 2: movzwl -1(%eax),%edx -@@ -54,7 +58,7 @@ - addl $3,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 3: movl -3(%eax),%edx -Index: kernel-2.4.21/arch/i386/config.in -=================================================================== ---- kernel-2.4.21.orig/arch/i386/config.in 2003-06-13 07:51:29.000000000 -0700 -+++ kernel-2.4.21/arch/i386/config.in 2003-12-04 11:57:01.000000000 -0800 -@@ -256,6 +256,29 @@ - if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then - define_bool CONFIG_HAVE_DEC_LOCK y - fi -+ -+choice 'Bigger Stack Size Support' \ -+ "off CONFIG_NOBIGSTACK \ -+ 16KB CONFIG_STACK_SIZE_16KB \ -+ 32KB CONFIG_STACK_SIZE_32KB \ -+ 64KB CONFIG_STACK_SIZE_64KB" off -+ -+if [ "$CONFIG_NOBIGSTACK" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 1 -+else -+ if [ "$CONFIG_STACK_SIZE_16KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 2 -+ else -+ if [ "$CONFIG_STACK_SIZE_32KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 3 -+ else -+ if [ "$CONFIG_STACK_SIZE_64KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 4 -+ fi -+ fi -+ fi -+fi -+ - endmenu - - mainmenu_option next_comment -Index: kernel-2.4.21/arch/i386/vmlinux.lds -=================================================================== ---- kernel-2.4.21.orig/arch/i386/vmlinux.lds.S 2002-02-25 11:37:53.000000000 -0800 -+++ kernel-2.4.21/arch/i386/vmlinux.lds.S 2003-12-04 11:57:01.000000000 -0800 -@@ -35,7 +35,8 @@ - - _edata = .; /* End of data section */ - -- . = ALIGN(8192); /* init_task */ -+/* chose the biggest of the possible stack sizes here? */ -+ . = ALIGN(65536); /* init_task */ - .data.init_task : { *(.data.init_task) } - - . = ALIGN(4096); /* Init code and data */ -Index: kernel-2.4.21/include/asm-i386/current.h -=================================================================== ---- kernel-2.4.21.orig/include/asm-i386/current.h 1998-08-14 16:35:22.000000000 -0700 -+++ kernel-2.4.21/include/asm-i386/current.h 2003-12-04 11:57:01.000000000 -0800 -@@ -1,15 +1,43 @@ - #ifndef _I386_CURRENT_H - #define _I386_CURRENT_H -+#include <asm/page.h> -+ -+/* -+ * Configurable page sizes on i386, mainly for debugging purposes. -+ * (c) Balbir Singh -+ */ -+ -+#ifdef __ASSEMBLY__ -+ -+#define PAGE_SIZE 4096 /* as cannot handle 1UL << 12 */ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+ -+#define GET_CURRENT(reg) \ -+ movl $-THREAD_SIZE, reg; \ -+ andl %esp, reg -+ -+#else /* __ASSEMBLY__ */ -+ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+#define alloc_task_struct() \ -+ ((struct task_struct *) __get_free_pages(GFP_KERNEL,CONFIG_STACK_SIZE_SHIFT)) -+ -+#define free_task_struct(p) \ -+ free_pages((unsigned long) (p), CONFIG_STACK_SIZE_SHIFT) -+ -+#define INIT_TASK_SIZE THREAD_SIZE - - struct task_struct; - - static inline struct task_struct * get_current(void) - { - struct task_struct *current; -- __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); -+ __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~(THREAD_SIZE - 1))); - return current; - } - - #define current get_current() - -+#endif /* __ASSEMBLY__ */ -+ - #endif /* !(_I386_CURRENT_H) */ -Index: kernel-2.4.21/include/asm-i386/hw_irq.h -=================================================================== ---- kernel-2.4.21.orig/include/asm-i386/hw_irq.h 2001-11-22 11:46:18.000000000 -0800 -+++ kernel-2.4.21/include/asm-i386/hw_irq.h 2003-12-04 11:57:01.000000000 -0800 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <asm/atomic.h> - #include <asm/irq.h> -+#include <asm/current.h> - - /* - * IDT vectors usable for external interrupt sources start -@@ -113,10 +114,6 @@ - #define IRQ_NAME2(nr) nr##_interrupt(void) - #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) - --#define GET_CURRENT \ -- "movl %esp, %ebx\n\t" \ -- "andl $-8192, %ebx\n\t" -- - /* - * SMP has a few special interrupts for IPI messages - */ -Index: kernel-2.4.21/include/asm-i386/processor.h -=================================================================== ---- kernel-2.4.21.orig/include/asm-i386/processor.h 2003-06-13 07:51:38.000000000 -0700 -+++ kernel-2.4.21/include/asm-i386/processor.h 2003-12-04 11:57:01.000000000 -0800 -@@ -14,6 +14,7 @@ - #include <asm/types.h> - #include <asm/sigcontext.h> - #include <asm/cpufeature.h> -+#include <asm/current.h> - #include <linux/cache.h> - #include <linux/config.h> - #include <linux/threads.h> -@@ -453,9 +454,6 @@ - #define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1019]) - #define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1022]) - --#define THREAD_SIZE (2*PAGE_SIZE) --#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) --#define free_task_struct(p) free_pages((unsigned long) (p), 1) - #define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count) - - #define init_task (init_task_union.task) -Index: kernel-2.4.21/include/linux/sched.h -=================================================================== ---- kernel-2.4.21.orig/include/linux/sched.h 2003-06-13 15:26:52.000000000 -0700 -+++ kernel-2.4.21/include/linux/sched.h 2003-12-04 12:00:14.000000000 -0800 -@@ -2,6 +2,7 @@ - #define _LINUX_SCHED_H - - #include <asm/param.h> /* for HZ */ -+#include <asm/current.h> /* maybe for INIT_TASK_SIZE */ - - extern unsigned long event; - diff --git a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.22-rh.patch b/lustre/kernel_patches/patches/configurable-x86-stack-2.4.22-rh.patch deleted file mode 100644 index 856425a8f8..0000000000 --- a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.22-rh.patch +++ /dev/null @@ -1,311 +0,0 @@ -Index: linux-2.4.22-ac1/arch/i386/kernel/entry.S -=================================================================== ---- linux-2.4.22-ac1.orig/arch/i386/kernel/entry.S 2003-09-25 14:16:34.000000000 +0400 -+++ linux-2.4.22-ac1/arch/i386/kernel/entry.S 2003-12-01 18:34:08.000000000 +0300 -@@ -46,6 +46,7 @@ - #include <asm/segment.h> - #include <asm/smp.h> - #include <asm/unistd.h> -+#include <asm/current.h> - - EBX = 0x00 - ECX = 0x04 -@@ -131,10 +132,6 @@ - .long 3b,6b; \ - .previous - --#define GET_CURRENT(reg) \ -- movl $-8192, reg; \ -- andl %esp, reg -- - ENTRY(lcall7) - pushfl # We get a different stack layout with call gates, - pushl %eax # which has to be cleaned up later.. -@@ -150,7 +147,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x7 -@@ -174,7 +171,7 @@ - movl %ecx,CS(%esp) # - movl %esp,%ebx - pushl %ebx -- andl $-8192,%ebx # GET_CURRENT -+ andl $-THREAD_SIZE,%ebx # GET_CURRENT - movl exec_domain(%ebx),%edx # Get the execution domain - movl 4(%edx),%edx # Get the lcall7 handler for the domain - pushl $0x27 -Index: linux-2.4.22-ac1/arch/i386/kernel/smpboot.c -=================================================================== ---- linux-2.4.22-ac1.orig/arch/i386/kernel/smpboot.c 2003-09-25 14:16:28.000000000 +0400 -+++ linux-2.4.22-ac1/arch/i386/kernel/smpboot.c 2003-12-01 18:34:08.000000000 +0300 -@@ -814,7 +814,7 @@ - - /* So we see what's up */ - printk("Booting processor %d/%d eip %lx\n", cpu, apicid, start_eip); -- stack_start.esp = (void *) (1024 + PAGE_SIZE + (char *)idle); -+ stack_start.esp = (void *)idle->thread.esp; - - /* - * This grunge runs the startup process for -@@ -887,7 +887,7 @@ - Dprintk("CPU has booted.\n"); - } else { - boot_error= 1; -- if (*((volatile unsigned char *)phys_to_virt(8192)) -+ if (*((volatile unsigned char *)phys_to_virt(THREAD_SIZE)) - == 0xA5) - /* trampoline started but...? */ - printk("Stuck ??\n"); -@@ -910,7 +910,7 @@ - } - - /* mark "stuck" area as not stuck */ -- *((volatile unsigned long *)phys_to_virt(8192)) = 0; -+ *((volatile unsigned long *)phys_to_virt(THREAD_SIZE)) = 0; - - if(clustered_apic_mode == CLUSTERED_APIC_NUMAQ) { - printk("Restoring NMI vector\n"); -Index: linux-2.4.22-ac1/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.22-ac1.orig/arch/i386/kernel/traps.c 2003-09-25 14:16:29.000000000 +0400 -+++ linux-2.4.22-ac1/arch/i386/kernel/traps.c 2003-12-01 18:34:08.000000000 +0300 -@@ -161,7 +161,7 @@ - unsigned long esp = tsk->thread.esp; - - /* User space on another CPU? */ -- if ((esp ^ (unsigned long)tsk) & (PAGE_MASK<<1)) -+ if ((esp ^ (unsigned long)tsk) & ~(THREAD_SIZE - 1)) - return; - show_trace((unsigned long *)esp); - } -Index: linux-2.4.22-ac1/arch/i386/kernel/head.S -=================================================================== ---- linux-2.4.22-ac1.orig/arch/i386/kernel/head.S 2003-09-25 14:16:27.000000000 +0400 -+++ linux-2.4.22-ac1/arch/i386/kernel/head.S 2003-12-01 18:34:08.000000000 +0300 -@@ -15,6 +15,7 @@ - #include <asm/page.h> - #include <asm/pgtable.h> - #include <asm/desc.h> -+#include <asm/current.h> - - #define OLD_CL_MAGIC_ADDR 0x90020 - #define OLD_CL_MAGIC 0xA33F -@@ -315,7 +316,7 @@ - ret - - ENTRY(stack_start) -- .long SYMBOL_NAME(init_task_union)+8192 -+ .long SYMBOL_NAME(init_task_union)+THREAD_SIZE - .long __KERNEL_DS - - /* This is the default interrupt "handler" :-) */ -Index: linux-2.4.22-ac1/arch/i386/kernel/irq.c -=================================================================== ---- linux-2.4.22-ac1.orig/arch/i386/kernel/irq.c 2003-09-25 14:16:18.000000000 +0400 -+++ linux-2.4.22-ac1/arch/i386/kernel/irq.c 2003-12-01 18:34:08.000000000 +0300 -@@ -581,7 +581,10 @@ - long esp; - - /* Debugging check for stack overflow: is there less than 1KB free? */ -- __asm__ __volatile__("andl %%esp,%0" : "=r" (esp) : "0" (8191)); -+ __asm__ __volatile__( -+ "andl %%esp,%0" -+ : "=r" (esp) : "0" (THREAD_SIZE-1)); -+ - if (unlikely(esp < (sizeof(struct task_struct) + 1024))) { - extern void show_stack(unsigned long *); - -Index: linux-2.4.22-ac1/arch/i386/lib/getuser.S -=================================================================== ---- linux-2.4.22-ac1.orig/arch/i386/lib/getuser.S 1998-01-13 00:42:52.000000000 +0300 -+++ linux-2.4.22-ac1/arch/i386/lib/getuser.S 2003-12-01 18:34:08.000000000 +0300 -@@ -21,6 +21,10 @@ - * as they get called from within inline assembly. - */ - -+/* Duplicated from asm/processor.h */ -+#include <asm/current.h> -+#include <linux/config.h> -+ - addr_limit = 12 - - .text -@@ -28,7 +32,7 @@ - .globl __get_user_1 - __get_user_1: - movl %esp,%edx -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 1: movzbl (%eax),%edx -@@ -41,7 +45,7 @@ - addl $1,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 2: movzwl -1(%eax),%edx -@@ -54,7 +58,7 @@ - addl $3,%eax - movl %esp,%edx - jc bad_get_user -- andl $0xffffe000,%edx -+ andl $~(THREAD_SIZE - 1),%edx - cmpl addr_limit(%edx),%eax - jae bad_get_user - 3: movl -3(%eax),%edx -Index: linux-2.4.22-ac1/arch/i386/config.in -=================================================================== ---- linux-2.4.22-ac1.orig/arch/i386/config.in 2003-09-25 14:16:34.000000000 +0400 -+++ linux-2.4.22-ac1/arch/i386/config.in 2003-12-01 18:34:08.000000000 +0300 -@@ -304,6 +304,29 @@ - if [ "$CONFIG_SMP" = "y" -a "$CONFIG_X86_CMPXCHG" = "y" ]; then - define_bool CONFIG_HAVE_DEC_LOCK y - fi -+ -+choice 'Bigger Stack Size Support' \ -+ "off CONFIG_NOBIGSTACK \ -+ 16KB CONFIG_STACK_SIZE_16KB \ -+ 32KB CONFIG_STACK_SIZE_32KB \ -+ 64KB CONFIG_STACK_SIZE_64KB" off -+ -+if [ "$CONFIG_NOBIGSTACK" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 1 -+else -+ if [ "$CONFIG_STACK_SIZE_16KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 2 -+ else -+ if [ "$CONFIG_STACK_SIZE_32KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 3 -+ else -+ if [ "$CONFIG_STACK_SIZE_64KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 4 -+ fi -+ fi -+ fi -+fi -+ - endmenu - - mainmenu_option next_comment -Index: linux-2.4.22-ac1/arch/i386/vmlinux.lds -=================================================================== ---- linux-2.4.22-ac1.orig/arch/i386/vmlinux.lds 2003-09-25 14:16:28.000000000 +0400 -+++ linux-2.4.22-ac1/arch/i386/vmlinux.lds 2003-12-01 18:34:08.000000000 +0300 -@@ -38,7 +38,8 @@ - - _edata = .; /* End of data section */ - -- . = ALIGN(8192); /* init_task */ -+/* chose the biggest of the possible stack sizes here? */ -+ . = ALIGN(65536); /* init_task */ - .data.init_task : { *(.data.init_task) } - - . = ALIGN(4096); /* Init code and data */ -Index: linux-2.4.22-ac1/include/asm-i386/current.h -=================================================================== ---- linux-2.4.22-ac1.orig/include/asm-i386/current.h 1998-08-15 03:35:22.000000000 +0400 -+++ linux-2.4.22-ac1/include/asm-i386/current.h 2003-12-01 18:34:16.000000000 +0300 -@@ -1,15 +1,43 @@ - #ifndef _I386_CURRENT_H - #define _I386_CURRENT_H -+#include <asm/page.h> -+ -+/* -+ * Configurable page sizes on i386, mainly for debugging purposes. -+ * (c) Balbir Singh -+ */ -+ -+#ifdef __ASSEMBLY__ -+ -+#define PAGE_SIZE 4096 /* as cannot handle 1UL << 12 */ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+ -+#define GET_CURRENT(reg) \ -+ movl $-THREAD_SIZE, reg; \ -+ andl %esp, reg -+ -+#else /* __ASSEMBLY__ */ -+ -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) -+#define __alloc_task_struct() \ -+ ((struct task_struct *) __get_free_pages(GFP_KERNEL,CONFIG_STACK_SIZE_SHIFT)) -+ -+#define __free_task_struct(p) \ -+ free_pages((unsigned long) (p), CONFIG_STACK_SIZE_SHIFT) -+ -+#define INIT_TASK_SIZE THREAD_SIZE - - struct task_struct; - - static inline struct task_struct * get_current(void) - { - struct task_struct *current; -- __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); -+ __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~(THREAD_SIZE - 1))); - return current; - } - - #define current get_current() - -+#endif /* __ASSEMBLY__ */ -+ - #endif /* !(_I386_CURRENT_H) */ -Index: linux-2.4.22-ac1/include/asm-i386/hw_irq.h -=================================================================== ---- linux-2.4.22-ac1.orig/include/asm-i386/hw_irq.h 2003-09-26 00:54:45.000000000 +0400 -+++ linux-2.4.22-ac1/include/asm-i386/hw_irq.h 2003-12-01 18:34:08.000000000 +0300 -@@ -114,10 +114,6 @@ - #define IRQ_NAME2(nr) nr##_interrupt(void) - #define IRQ_NAME(nr) IRQ_NAME2(IRQ##nr) - --#define GET_CURRENT \ -- "movl %esp, %ebx\n\t" \ -- "andl $-8192, %ebx\n\t" -- - /* - * SMP has a few special interrupts for IPI messages - */ -Index: linux-2.4.22-ac1/include/asm-i386/processor.h -=================================================================== ---- linux-2.4.22-ac1.orig/include/asm-i386/processor.h 2003-09-26 00:54:44.000000000 +0400 -+++ linux-2.4.22-ac1/include/asm-i386/processor.h 2003-12-01 18:34:08.000000000 +0300 -@@ -14,6 +14,7 @@ - #include <asm/types.h> - #include <asm/sigcontext.h> - #include <asm/cpufeature.h> -+#include <asm/current.h> - #include <linux/cache.h> - #include <linux/config.h> - #include <linux/threads.h> -@@ -465,10 +466,6 @@ - #define KSTK_EIP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1019]) - #define KSTK_ESP(tsk) (((unsigned long *)(4096+(unsigned long)(tsk)))[1022]) - --#define THREAD_SIZE (2*PAGE_SIZE) --#define __alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1)) --#define __free_task_struct(p) do { BUG_ON((p)->state < TASK_ZOMBIE); free_pages((unsigned long) (p), 1); } while (0) -- - #define init_task (init_task_union.task) - #define init_stack (init_task_union.stack) - -Index: linux-2.4.22-ac1/include/linux/sched.h -=================================================================== ---- linux-2.4.22-ac1.orig/include/linux/sched.h 2003-11-13 18:21:42.000000000 +0300 -+++ linux-2.4.22-ac1/include/linux/sched.h 2003-12-01 18:34:08.000000000 +0300 -@@ -2,6 +2,7 @@ - #define _LINUX_SCHED_H - - #include <asm/param.h> /* for HZ */ -+#include <asm/current.h> /* maybe for INIT_TASK_SIZE */ - - extern unsigned long event; - diff --git a/lustre/kernel_patches/patches/configurable-x86-stack-2.4.20.patch b/lustre/kernel_patches/patches/configurable-x86-stack-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/configurable-x86-stack-2.4.20.patch rename to lustre/kernel_patches/patches/configurable-x86-stack-2.4.24.patch diff --git a/lustre/kernel_patches/patches/configurable-x86_64-2.4.21.patch b/lustre/kernel_patches/patches/configurable-x86_64-2.4.21.patch deleted file mode 100644 index 757ee717ba..0000000000 --- a/lustre/kernel_patches/patches/configurable-x86_64-2.4.21.patch +++ /dev/null @@ -1,122 +0,0 @@ -Index: linux-2.4.21-drop2/arch/x86_64/kernel/smpboot.c -=================================================================== ---- linux-2.4.21-drop2.orig/arch/x86_64/kernel/smpboot.c 2003-10-28 10:34:20.000000000 -0800 -+++ linux-2.4.21-drop2/arch/x86_64/kernel/smpboot.c 2004-08-06 06:18:39.000000000 -0700 -@@ -751,7 +751,7 @@ - Dprintk("CPU has booted.\n"); - } else { - boot_status = 1; -- if (*((volatile unsigned char *)phys_to_virt(8192)) -+ if (*((volatile unsigned char *)phys_to_virt(THREAD_SIZE)) - == 0xA5) - /* trampoline started but...? */ - printk("Stuck ??\n"); -@@ -770,7 +770,7 @@ - } - - /* mark "stuck" area as not stuck */ -- *((volatile unsigned int *)phys_to_virt(8192)) = 0; -+ *((volatile unsigned int *)phys_to_virt(THREAD_SIZE)) = 0; - - return cpu; - } -Index: linux-2.4.21-drop2/arch/x86_64/kernel/traps.c -=================================================================== ---- linux-2.4.21-drop2.orig/arch/x86_64/kernel/traps.c 2003-11-06 15:52:41.000000000 -0800 -+++ linux-2.4.21-drop2/arch/x86_64/kernel/traps.c 2004-08-06 06:18:39.000000000 -0700 -@@ -239,7 +239,7 @@ - unsigned long rsp = tsk->thread.rsp; - - /* User space on another CPU? */ -- if ((rsp ^ (unsigned long)tsk) & (PAGE_MASK<<1)) -+ if ((rsp ^ (unsigned long)tsk) & ~(THREAD_SIZE - 1)) - return; - show_trace((unsigned long *)rsp); - } -Index: linux-2.4.21-drop2/arch/x86_64/config.in -=================================================================== ---- linux-2.4.21-drop2.orig/arch/x86_64/config.in 2003-10-28 10:34:25.000000000 -0800 -+++ linux-2.4.21-drop2/arch/x86_64/config.in 2004-08-06 06:20:20.000000000 -0700 -@@ -91,6 +91,28 @@ - define_bool CONFIG_NUMA y - fi - -+choice 'Bigger Stack Size Support' \ -+ "off CONFIG_NOBIGSTACK \ -+ 16KB CONFIG_STACK_SIZE_16KB \ -+ 32KB CONFIG_STACK_SIZE_32KB \ -+ 64KB CONFIG_STACK_SIZE_64KB" off -+ -+if [ "$CONFIG_NOBIGSTACK" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 1 -+else -+ if [ "$CONFIG_STACK_SIZE_16KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 2 -+ else -+ if [ "$CONFIG_STACK_SIZE_32KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 3 -+ else -+ if [ "$CONFIG_STACK_SIZE_64KB" = "y" ]; then -+ define_int CONFIG_STACK_SIZE_SHIFT 4 -+ fi -+ fi -+ fi -+fi -+ - endmenu - - mainmenu_option next_comment -Index: linux-2.4.21-drop2/arch/x86_64/vmlinux.lds -=================================================================== ---- linux-2.4.21-drop2.orig/arch/x86_64/vmlinux.lds 2003-06-13 07:51:32.000000000 -0700 -+++ linux-2.4.21-drop2/arch/x86_64/vmlinux.lds 2004-08-06 06:18:39.000000000 -0700 -@@ -72,7 +72,8 @@ - .vsyscall_1 ADDR(.vsyscall_0) + 1024: AT (LOADADDR(.vsyscall_0) + 1024) { *(.vsyscall_1) } - . = LOADADDR(.vsyscall_0) + 4096; - -- . = ALIGN(8192); /* init_task */ -+/* chose the biggest of the possible stack sizes here? */ -+ . = ALIGN(65536); /* init_task */ - .data.init_task : { *(.data.init_task) } - - . = ALIGN(4096); -Index: linux-2.4.21-drop2/include/asm-x86_64/current.h -=================================================================== ---- linux-2.4.21-drop2.orig/include/asm-x86_64/current.h 2003-11-10 16:44:28.000000000 -0800 -+++ linux-2.4.21-drop2/include/asm-x86_64/current.h 2004-08-06 06:24:33.000000000 -0700 -@@ -5,6 +5,7 @@ - struct task_struct; - - #include <asm/pda.h> -+#include <asm/page.h> - - static inline struct task_struct *get_current(void) - { -Index: linux-2.4.21-drop2/include/asm-x86_64/page.h -=================================================================== ---- linux-2.4.21-drop2.orig/include/asm-x86_64/page.h 2003-10-28 10:34:00.000000000 -0800 -+++ linux-2.4.21-drop2/include/asm-x86_64/page.h 2004-08-06 06:24:33.000000000 -0700 -@@ -27,8 +27,8 @@ - /* We still hope 8K is enough, but ... */ - /* Currently it is actually ~6k. This would change when task_struct moves into - an own slab. */ --#define THREAD_ORDER 1 --#define THREAD_SIZE (2*PAGE_SIZE) -+#define THREAD_ORDER CONFIG_STACK_SIZE_SHIFT -+#define THREAD_SIZE ((1 << CONFIG_STACK_SIZE_SHIFT) * PAGE_SIZE) - - #define INIT_TASK_SIZE THREAD_SIZE - #define CURRENT_MASK (~(THREAD_SIZE-1)) -Index: linux-2.4.21-drop2/include/asm-x86_64/processor.h -=================================================================== ---- linux-2.4.21-drop2.orig/include/asm-x86_64/processor.h 2003-11-10 16:44:28.000000000 -0800 -+++ linux-2.4.21-drop2/include/asm-x86_64/processor.h 2004-08-06 06:24:33.000000000 -0700 -@@ -385,7 +385,7 @@ - are already there. When you run out of stack try this first. */ - #define alloc_task_struct() \ - ((struct task_struct *) __get_free_pages(GFP_KERNEL,THREAD_ORDER)) --#define free_task_struct(p) free_pages((unsigned long) (p), 1) -+#define free_task_struct(p) free_pages((unsigned long) (p), THREAD_ORDER) - #define get_task_struct(tsk) atomic_inc(&virt_to_page(tsk)->count) - - #define init_task (init_task_union.task) diff --git a/lustre/kernel_patches/patches/dcache-mds-num-2.6.7.patch b/lustre/kernel_patches/patches/dcache-mds-num-2.6.7.patch new file mode 100644 index 0000000000..d86d1b6930 --- /dev/null +++ b/lustre/kernel_patches/patches/dcache-mds-num-2.6.7.patch @@ -0,0 +1,22 @@ +Index: linux-2.6.7/include/linux/dcache.h +=================================================================== +--- linux-2.6.7.orig/include/linux/dcache.h 2004-08-30 17:20:57.000000000 +0800 ++++ linux-2.6.7/include/linux/dcache.h 2004-08-30 17:39:12.000000000 +0800 +@@ -94,6 +94,9 @@ + spinlock_t d_lock; /* per dentry lock */ + struct inode *d_inode; /* Where the name belongs to - NULL is + * negative */ ++ unsigned d_inum; /* for cross-fs references (Lustre) */ ++ unsigned d_mdsnum; /* for cross-fs references (Lustre) */ ++ unsigned d_generation; /* for cross-fs references (Lustre) */ + /* + * The next three fields are touched by __d_lookup. Place them here + * so they all fit in a 16-byte range, with 16-byte alignment. +@@ -166,6 +169,7 @@ + #define DCACHE_UNHASHED 0x0010 + #define DCACHE_LUSTRE_INVALID 0x0020 /* Lustre invalidated */ + ++#define DCACHE_CROSS_REF 0x0040 /* entry points to inode on another MDS */ + + extern spinlock_t dcache_lock; + diff --git a/lustre/kernel_patches/patches/dcache_refcount_debug.patch b/lustre/kernel_patches/patches/dcache_refcount_debug.patch deleted file mode 100644 index 0eddc23286..0000000000 --- a/lustre/kernel_patches/patches/dcache_refcount_debug.patch +++ /dev/null @@ -1,24 +0,0 @@ ---- ./fs/dcache.c.orig 2004-01-30 14:54:45.000000000 -0700 -+++ ./fs/dcache.c 2004-02-20 14:49:18.000000000 -0700 -@@ -348,8 +348,20 @@ - dentry_stat.nr_unused--; - - /* Unused dentry with a count? */ -- if (atomic_read(&dentry->d_count)) -+ if (atomic_read(&dentry->d_count)) { -+ struct inode *inode = dentry->d_inode; -+ printk(KERN_CRIT "dentry %*s %p->%lu/%u(%p/%s) ct %d\n", -+ dentry->d_name.len, dentry->d_name.name, dentry, -+ inode ? inode->i_ino : 0, -+ inode ? inode->i_generation : 0, inode, -+ inode ? inode->i_sb ? -+ inode->i_sb->s_type->name : "" : "", -+ atomic_read(&dentry->d_count)); -+ spin_unlock(&dcache_lock); -+ set_task_state(current, TASK_UNINTERRUPTIBLE); -+ schedule(); - BUG(); -+ } - - prune_one_dentry(dentry); - if (!--count) diff --git a/lustre/kernel_patches/patches/dev_read_only_2.4.20-rh.patch b/lustre/kernel_patches/patches/dev_read_only-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/dev_read_only_2.4.20-rh.patch rename to lustre/kernel_patches/patches/dev_read_only-2.4.24.patch diff --git a/lustre/kernel_patches/patches/dev_read_only-suse-2.4.19.patch b/lustre/kernel_patches/patches/dev_read_only-suse-2.4.19.patch deleted file mode 100644 index f2eb39ac74..0000000000 --- a/lustre/kernel_patches/patches/dev_read_only-suse-2.4.19.patch +++ /dev/null @@ -1,76 +0,0 @@ - drivers/block/blkpg.c | 36 ++++++++++++++++++++++++++++++++++++ - drivers/block/loop.c | 3 +++ - drivers/ide/ide-disk.c | 4 ++++ - 3 files changed, 43 insertions(+) - -Index: linux-2.4.19/drivers/block/blkpg.c -=================================================================== ---- linux-2.4.19.orig/drivers/block/blkpg.c 2002-08-02 20:39:43.000000000 -0400 -+++ linux-2.4.19/drivers/block/blkpg.c 2004-04-23 18:24:40.000000000 -0400 -@@ -296,3 +296,37 @@ - } - - EXPORT_SYMBOL(blk_ioctl); -+ -+#define NUM_DEV_NO_WRITE 16 -+static int dev_no_write[NUM_DEV_NO_WRITE]; -+/* -+ * Debug code for turning block devices "read-only" (will discard writes -+ * silently). This is for filesystem crash/recovery testing. -+ */ -+void dev_set_rdonly(kdev_t dev, int no_write) -+{ -+ if (dev) { -+ printk(KERN_WARNING "Turning device %s read-only\n", -+ bdevname(dev)); -+ dev_no_write[no_write] = 0xdead0000 + dev; -+ } -+} -+ -+int dev_check_rdonly(kdev_t dev) { -+ int i; -+ -+ for (i = 0; i < NUM_DEV_NO_WRITE; i++) { -+ if ((dev_no_write[i] & 0xffff0000) == 0xdead0000 && -+ dev == (dev_no_write[i] & 0xffff)) -+ return 1; -+ } -+ return 0; -+} -+ -+void dev_clear_rdonly(int no_write) { -+ dev_no_write[no_write] = 0; -+} -+ -+EXPORT_SYMBOL(dev_set_rdonly); -+EXPORT_SYMBOL(dev_check_rdonly); -+EXPORT_SYMBOL(dev_clear_rdonly); -Index: linux-2.4.19/drivers/block/loop.c -=================================================================== ---- linux-2.4.19.orig/drivers/block/loop.c 2004-04-23 17:53:56.000000000 -0400 -+++ linux-2.4.19/drivers/block/loop.c 2004-04-23 18:23:16.000000000 -0400 -@@ -478,6 +478,9 @@ - spin_unlock_irq(&lo->lo_lock); - - if (rw == WRITE) { -+ if (dev_check_rdonly(rbh->b_rdev)) -+ goto err; -+ - if (lo->lo_flags & LO_FLAGS_READ_ONLY) - goto err; - } else if (rw == READA) { -Index: linux-2.4.19/drivers/ide/ide-disk.c -=================================================================== ---- linux-2.4.19.orig/drivers/ide/ide-disk.c 2004-04-23 17:53:51.000000000 -0400 -+++ linux-2.4.19/drivers/ide/ide-disk.c 2004-04-23 18:23:16.000000000 -0400 -@@ -558,6 +558,10 @@ - */ - static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block) - { -+ if (rq->cmd == WRITE && dev_check_rdonly(rq->rq_dev)) { -+ ide_end_request(1, HWGROUP(drive)); -+ return ide_stopped; -+ } - if (IDE_CONTROL_REG) - OUT_BYTE(drive->ctl,IDE_CONTROL_REG); - diff --git a/lustre/kernel_patches/patches/dev_read_only.patch b/lustre/kernel_patches/patches/dev_read_only.patch deleted file mode 100644 index bac5ebf4fa..0000000000 --- a/lustre/kernel_patches/patches/dev_read_only.patch +++ /dev/null @@ -1,73 +0,0 @@ - - - - 0 files changed - ---- linux-2.4.18-17.8.0/drivers/block/blkpg.c~dev_read_only 2002-12-06 14:52:29.000000000 -0800 -+++ linux-2.4.18-17.8.0-zab/drivers/block/blkpg.c 2002-12-06 14:52:29.000000000 -0800 -@@ -297,3 +297,38 @@ int blk_ioctl(kdev_t dev, unsigned int c - } - - EXPORT_SYMBOL(blk_ioctl); -+ -+#define NUM_DEV_NO_WRITE 16 -+static int dev_no_write[NUM_DEV_NO_WRITE]; -+ -+/* -+ * Debug code for turning block devices "read-only" (will discard writes -+ * silently). This is for filesystem crash/recovery testing. -+ */ -+void dev_set_rdonly(kdev_t dev, int no_write) -+{ -+ if (dev) { -+ printk(KERN_WARNING "Turning device %s read-only\n", -+ bdevname(dev)); -+ dev_no_write[no_write] = 0xdead0000 + dev; -+ } -+} -+ -+int dev_check_rdonly(kdev_t dev) { -+ int i; -+ -+ for (i = 0; i < NUM_DEV_NO_WRITE; i++) { -+ if ((dev_no_write[i] & 0xffff0000) == 0xdead0000 && -+ dev == (dev_no_write[i] & 0xffff)) -+ return 1; -+ } -+ return 0; -+} -+ -+void dev_clear_rdonly(int no_write) { -+ dev_no_write[no_write] = 0; -+} -+ -+EXPORT_SYMBOL(dev_set_rdonly); -+EXPORT_SYMBOL(dev_check_rdonly); -+EXPORT_SYMBOL(dev_clear_rdonly); ---- linux-2.4.18-17.8.0/drivers/block/loop.c~dev_read_only 2002-12-06 14:52:29.000000000 -0800 -+++ linux-2.4.18-17.8.0-zab/drivers/block/loop.c 2002-12-06 14:52:29.000000000 -0800 -@@ -491,6 +491,9 @@ static int loop_make_request(request_que - spin_unlock_irq(&lo->lo_lock); - - if (rw == WRITE) { -+ if (dev_check_rdonly(rbh->b_rdev)) -+ goto err; -+ - if (lo->lo_flags & LO_FLAGS_READ_ONLY) - goto err; - } else if (rw == READA) { ---- linux-2.4.18-17.8.0/drivers/ide/ide-disk.c~dev_read_only 2002-12-06 14:52:29.000000000 -0800 -+++ linux-2.4.18-17.8.0-zab/drivers/ide/ide-disk.c 2002-12-06 14:52:29.000000000 -0800 -@@ -557,6 +557,10 @@ static ide_startstop_t lba_48_rw_disk (i - */ - static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block) - { -+ if (rq->cmd == WRITE && dev_check_rdonly(rq->rq_dev)) { -+ ide_end_request(1, HWGROUP(drive)); -+ return ide_stopped; -+ } - if (IDE_CONTROL_REG) - OUT_BYTE(drive->ctl,IDE_CONTROL_REG); - - -_ diff --git a/lustre/kernel_patches/patches/dev_read_only_2.4.20.patch b/lustre/kernel_patches/patches/dev_read_only_2.4.20.patch deleted file mode 100644 index 7df8dbe2f1..0000000000 --- a/lustre/kernel_patches/patches/dev_read_only_2.4.20.patch +++ /dev/null @@ -1,62 +0,0 @@ -Index: linux-2.4.20-8/drivers/block/blkpg.c -=================================================================== ---- linux-2.4.20-8.orig/drivers/block/blkpg.c 2002-08-03 08:39:43.000000000 +0800 -+++ linux-2.4.20-8/drivers/block/blkpg.c 2003-12-08 15:50:20.000000000 +0800 -@@ -296,3 +296,42 @@ - } - - EXPORT_SYMBOL(blk_ioctl); -+ -+ -+ -+#define NUM_DEV_NO_WRITE 16 -+static int dev_no_write[NUM_DEV_NO_WRITE]; -+ -+/* -+ * Debug code for turning block devices "read-only" (will discard writes -+ * silently). This is for filesystem crash/recovery testing. -+ */ -+void dev_set_rdonly(kdev_t dev, int no_write) -+{ -+ if (dev) { -+ printk(KERN_WARNING "Turning device %s read-only\n", -+ bdevname(dev)); -+ dev_no_write[no_write] = 0xdead0000 + dev; -+ } -+} -+ -+int dev_check_rdonly(kdev_t dev) { -+ int i; -+ -+ for (i = 0; i < NUM_DEV_NO_WRITE; i++) { -+ if ((dev_no_write[i] & 0xffff0000) == 0xdead0000 && -+ dev == (dev_no_write[i] & 0xffff)) -+ return 1; -+ } -+ return 0; -+} -+ -+void dev_clear_rdonly(int no_write) { -+ dev_no_write[no_write] = 0; -+} -+ -+EXPORT_SYMBOL(dev_set_rdonly); -+EXPORT_SYMBOL(dev_check_rdonly); -+EXPORT_SYMBOL(dev_clear_rdonly); -+ -+ -Index: linux-2.4.20-8/drivers/block/ll_rw_blk.c -=================================================================== ---- linux-2.4.20-8.orig/drivers/block/ll_rw_blk.c 2003-12-08 15:47:50.000000000 +0800 -+++ linux-2.4.20-8/drivers/block/ll_rw_blk.c 2003-12-08 15:51:17.000000000 +0800 -@@ -1164,6 +1164,10 @@ - buffer_IO_error(bh); - break; - } -+ if ((dev_check_rdonly(bh->b_rdev))&&(rw & WRITE)) { -+ bh->b_end_io(bh, 0); -+ break; -+ } - } while (q->make_request_fn(q, rw, bh)); - } - diff --git a/lustre/kernel_patches/patches/dev_read_only_2.4.21-chaos.patch b/lustre/kernel_patches/patches/dev_read_only_2.4.21-chaos.patch deleted file mode 100644 index 801431c2de..0000000000 --- a/lustre/kernel_patches/patches/dev_read_only_2.4.21-chaos.patch +++ /dev/null @@ -1,78 +0,0 @@ - drivers/block/blkpg.c | 35 +++++++++++++++++++++++++++++++++++ - drivers/block/loop.c | 3 +++ - drivers/ide/ide-disk.c | 5 +++++ - 3 files changed, 43 insertions(+) - -Index: linux-2.4.21-chaos/drivers/block/blkpg.c -=================================================================== ---- linux-2.4.21-chaos.orig/drivers/block/blkpg.c 2003-09-19 03:49:42.000000000 +0400 -+++ linux-2.4.21-chaos/drivers/block/blkpg.c 2003-12-12 16:17:49.000000000 +0300 -@@ -535,3 +535,38 @@ - - #endif /* CONFIG_IA64 */ - -+ -+#define NUM_DEV_NO_WRITE 16 -+static int dev_no_write[NUM_DEV_NO_WRITE]; -+ -+/* -+ * Debug code for turning block devices "read-only" (will discard writes -+ * silently). This is for filesystem crash/recovery testing. -+ */ -+void dev_set_rdonly(kdev_t dev, int no_write) -+{ -+ if (dev) { -+ printk(KERN_WARNING "Turning device %s read-only\n", -+ bdevname(dev)); -+ dev_no_write[no_write] = 0xdead0000 + dev; -+ } -+} -+ -+int dev_check_rdonly(kdev_t dev) { -+ int i; -+ -+ for (i = 0; i < NUM_DEV_NO_WRITE; i++) { -+ if ((dev_no_write[i] & 0xffff0000) == 0xdead0000 && -+ dev == (dev_no_write[i] & 0xffff)) -+ return 1; -+ } -+ return 0; -+} -+ -+void dev_clear_rdonly(int no_write) { -+ dev_no_write[no_write] = 0; -+} -+ -+EXPORT_SYMBOL(dev_set_rdonly); -+EXPORT_SYMBOL(dev_check_rdonly); -+EXPORT_SYMBOL(dev_clear_rdonly); -Index: linux-2.4.21-chaos/drivers/block/loop.c -=================================================================== ---- linux-2.4.21-chaos.orig/drivers/block/loop.c 2003-09-19 03:49:42.000000000 +0400 -+++ linux-2.4.21-chaos/drivers/block/loop.c 2003-12-12 16:17:49.000000000 +0300 -@@ -491,6 +491,9 @@ - spin_unlock_irq(&lo->lo_lock); - - if (rw == WRITE) { -+ if (dev_check_rdonly(rbh->b_rdev)) -+ goto err; -+ - if (lo->lo_flags & LO_FLAGS_READ_ONLY) - goto err; - } else if (rw == READA) { -Index: linux-2.4.21-chaos/drivers/ide/ide-disk.c -=================================================================== ---- linux-2.4.21-chaos.orig/drivers/ide/ide-disk.c 2003-07-15 02:08:42.000000000 +0400 -+++ linux-2.4.21-chaos/drivers/ide/ide-disk.c 2003-12-12 16:17:49.000000000 +0300 -@@ -371,6 +371,11 @@ - if (driver_blocked) - panic("Request while ide driver is blocked?"); - -+ if (rq->cmd == WRITE && dev_check_rdonly(rq->rq_dev)) { -+ ide_end_request(drive, 1); -+ return ide_stopped; -+ } -+ - if (IDE_CONTROL_REG) - hwif->OUTB(drive->ctl, IDE_CONTROL_REG); - diff --git a/lustre/kernel_patches/patches/dev_read_only_hp_2.4.20.patch b/lustre/kernel_patches/patches/dev_read_only_hp_2.4.20.patch deleted file mode 100644 index 60081db4db..0000000000 --- a/lustre/kernel_patches/patches/dev_read_only_hp_2.4.20.patch +++ /dev/null @@ -1,77 +0,0 @@ - drivers/block/blkpg.c | 36 ++++++++++++++++++++++++++++++++++++ - drivers/block/loop.c | 3 +++ - drivers/ide/ide-disk.c | 4 ++++ - 3 files changed, 43 insertions(+) - ---- linux/drivers/block/blkpg.c~dev_read_only_hp_2.4.20 Mon May 19 07:07:52 2003 -+++ linux-mmonroe/drivers/block/blkpg.c Mon May 19 07:37:22 2003 -@@ -310,6 +310,42 @@ int blk_ioctl(kdev_t dev, unsigned int c - - EXPORT_SYMBOL(blk_ioctl); - -+ -+#define NUM_DEV_NO_WRITE 16 -+static int dev_no_write[NUM_DEV_NO_WRITE]; -+/* -+ * Debug code for turning block devices "read-only" (will discard writes -+ * silently). This is for filesystem crash/recovery testing. -+ */ -+void dev_set_rdonly(kdev_t dev, int no_write) -+{ -+ if (dev) { -+ printk(KERN_WARNING "Turning device %s read-only\n", -+ bdevname(dev)); -+ dev_no_write[no_write] = 0xdead0000 + dev; -+ } -+} -+ -+int dev_check_rdonly(kdev_t dev) { -+ int i; -+ -+ for (i = 0; i < NUM_DEV_NO_WRITE; i++) { -+ if ((dev_no_write[i] & 0xffff0000) == 0xdead0000 && -+ dev == (dev_no_write[i] & 0xffff)) -+ return 1; -+ } -+ return 0; -+} -+ -+void dev_clear_rdonly(int no_write) { -+ dev_no_write[no_write] = 0; -+} -+ -+EXPORT_SYMBOL(dev_set_rdonly); -+EXPORT_SYMBOL(dev_check_rdonly); -+EXPORT_SYMBOL(dev_clear_rdonly); -+ -+ - /** - * get_last_sector() - * ---- linux/drivers/block/loop.c~dev_read_only_hp_2.4.20 Thu Nov 28 15:53:12 2002 -+++ linux-mmonroe/drivers/block/loop.c Mon May 19 07:28:29 2003 -@@ -474,6 +474,9 @@ static int loop_make_request(request_que - spin_unlock_irq(&lo->lo_lock); - - if (rw == WRITE) { -+ if (dev_check_rdonly(rbh->b_rdev)) -+ goto err; -+ - if (lo->lo_flags & LO_FLAGS_READ_ONLY) - goto err; - } else if (rw == READA) { ---- linux/drivers/ide/ide-disk.c~dev_read_only_hp_2.4.20 Thu Nov 28 15:53:13 2002 -+++ linux-mmonroe/drivers/ide/ide-disk.c Mon May 19 07:28:29 2003 -@@ -558,6 +558,10 @@ static ide_startstop_t lba_48_rw_disk (i - */ - static ide_startstop_t do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block) - { -+ if (rq->cmd == WRITE && dev_check_rdonly(rq->rq_dev)) { -+ ide_end_request(1, HWGROUP(drive)); -+ return ide_stopped; -+ } - if (IDE_CONTROL_REG) - OUT_BYTE(drive->ctl,IDE_CONTROL_REG); - - -_ diff --git a/lustre/kernel_patches/patches/dynamic-locks-2.4.20-rh.patch b/lustre/kernel_patches/patches/dynamic-locks-2.4.20-rh.patch deleted file mode 100644 index 59f0a3eef4..0000000000 --- a/lustre/kernel_patches/patches/dynamic-locks-2.4.20-rh.patch +++ /dev/null @@ -1,217 +0,0 @@ - include/linux/dynlocks.h | 33 ++++++++++ - lib/Makefile | 4 - - lib/dynlocks.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++ - 3 files changed, 187 insertions(+), 2 deletions(-) - -Index: linux-2.4.20-rh/include/linux/dynlocks.h -=================================================================== ---- linux-2.4.20-rh.orig/include/linux/dynlocks.h 2003-09-04 18:25:49.000000000 +0800 -+++ linux-2.4.20-rh/include/linux/dynlocks.h 2003-09-04 18:25:49.000000000 +0800 -@@ -0,0 +1,33 @@ -+#ifndef _LINUX_DYNLOCKS_H -+#define _LINUX_DYNLOCKS_H -+ -+#include <linux/list.h> -+#include <linux/wait.h> -+ -+struct dynlock_member { -+ struct list_head dl_list; -+ unsigned long dl_value; /* lock value */ -+ int dl_refcount; /* number of users */ -+ int dl_readers; -+ int dl_writers; -+ int dl_pid; /* holder of the lock */ -+ wait_queue_head_t dl_wait; -+}; -+ -+/* -+ * lock's namespace: -+ * - list of locks -+ * - lock to protect this list -+ */ -+struct dynlock { -+ struct list_head dl_list; -+ spinlock_t dl_list_lock; -+}; -+ -+void dynlock_init(struct dynlock *dl); -+void *dynlock_lock(struct dynlock *dl, unsigned long value, int rw, int gfp); -+void dynlock_unlock(struct dynlock *dl, void *lock); -+ -+ -+#endif -+ -Index: linux-2.4.20-rh/lib/dynlocks.c -=================================================================== ---- linux-2.4.20-rh.orig/lib/dynlocks.c 2003-09-04 18:25:49.000000000 +0800 -+++ linux-2.4.20-rh/lib/dynlocks.c 2003-09-04 18:25:49.000000000 +0800 -@@ -0,0 +1,152 @@ -+/* -+ * Dynamic Locks -+ * -+ * struct dynlock is lockspace -+ * one may request lock (exclusive or shared) for some value -+ * in that lockspace -+ * -+ */ -+ -+#include <linux/dynlocks.h> -+#include <linux/module.h> -+#include <linux/slab.h> -+#include <linux/sched.h> -+ -+/* -+ * dynlock_init -+ * -+ * initialize lockspace -+ * -+ */ -+void dynlock_init(struct dynlock *dl) -+{ -+ spin_lock_init(&dl->dl_list_lock); -+ INIT_LIST_HEAD(&dl->dl_list); -+} -+ -+/* -+ * dynlock_lock -+ * -+ * acquires lock (exclusive or shared) in specified lockspace -+ * each lock in lockspace is allocated separately, so user have -+ * to specify GFP flags. -+ * routine returns pointer to lock. this pointer is intended to -+ * be passed to dynlock_unlock -+ * -+ */ -+void *dynlock_lock(struct dynlock *dl, unsigned long value, int rw, int gfp) -+{ -+ struct dynlock_member *nhl = NULL; -+ struct dynlock_member *hl; -+ struct list_head *cur; -+ -+repeat: -+ /* find requested lock in lockspace */ -+ spin_lock(&dl->dl_list_lock); -+ list_for_each(cur, &dl->dl_list) { -+ hl = list_entry(cur, struct dynlock_member, dl_list); -+ if (hl->dl_value == value) { -+ /* lock is found */ -+ if (nhl) { -+ /* someone else just allocated -+ * lock we didn't find and just created -+ * so, we drop our lock -+ */ -+ kfree(nhl); -+ nhl = NULL; -+ } -+ hl->dl_refcount++; -+ goto found; -+ } -+ } -+ /* lock not found */ -+ if (nhl) { -+ /* we already have allocated lock. use it */ -+ hl = nhl; -+ nhl = NULL; -+ list_add(&hl->dl_list, &dl->dl_list); -+ goto found; -+ } -+ spin_unlock(&dl->dl_list_lock); -+ -+ /* lock not found and we haven't allocated lock yet. allocate it */ -+ nhl = kmalloc(sizeof(struct dynlock_member), gfp); -+ if (nhl == NULL) -+ return NULL; -+ nhl->dl_refcount = 1; -+ nhl->dl_value = value; -+ nhl->dl_readers = 0; -+ nhl->dl_writers = 0; -+ init_waitqueue_head(&nhl->dl_wait); -+ -+ /* while lock is being allocated, someone else may allocate it -+ * and put onto to list. check this situation -+ */ -+ goto repeat; -+ -+found: -+ if (rw) { -+ /* exclusive lock: user don't want to share lock at all -+ * NOTE: one process may take the same lock several times -+ * this functionaly is useful for rename operations */ -+ while ((hl->dl_writers && hl->dl_pid != current->pid) || -+ hl->dl_readers) { -+ spin_unlock(&dl->dl_list_lock); -+ wait_event(hl->dl_wait, -+ hl->dl_writers == 0 && hl->dl_readers == 0); -+ spin_lock(&dl->dl_list_lock); -+ } -+ hl->dl_writers++; -+ } else { -+ /* shared lock: user do not want to share lock with writer */ -+ while (hl->dl_writers) { -+ spin_unlock(&dl->dl_list_lock); -+ wait_event(hl->dl_wait, hl->dl_writers == 0); -+ spin_lock(&dl->dl_list_lock); -+ } -+ hl->dl_readers++; -+ } -+ hl->dl_pid = current->pid; -+ spin_unlock(&dl->dl_list_lock); -+ -+ return hl; -+} -+ -+ -+/* -+ * dynlock_unlock -+ * -+ * user have to specify lockspace (dl) and pointer to lock structure -+ * returned by dynlock_lock() -+ * -+ */ -+void dynlock_unlock(struct dynlock *dl, void *lock) -+{ -+ struct dynlock_member *hl = lock; -+ int wakeup = 0; -+ -+ spin_lock(&dl->dl_list_lock); -+ if (hl->dl_writers) { -+ hl->dl_writers--; -+ if (hl->dl_writers == 0) -+ wakeup = 1; -+ } else { -+ hl->dl_readers--; -+ if (hl->dl_readers == 0) -+ wakeup = 1; -+ } -+ if (wakeup) { -+ hl->dl_pid = 0; -+ wake_up(&hl->dl_wait); -+ } -+ if (--(hl->dl_refcount) == 0) -+ list_del(&hl->dl_list); -+ spin_unlock(&dl->dl_list_lock); -+ if (hl->dl_refcount == 0) -+ kfree(hl); -+} -+ -+EXPORT_SYMBOL(dynlock_init); -+EXPORT_SYMBOL(dynlock_lock); -+EXPORT_SYMBOL(dynlock_unlock); -+ -Index: linux-2.4.20-rh/lib/Makefile -=================================================================== ---- linux-2.4.20-rh.orig/lib/Makefile 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-rh/lib/Makefile 2003-09-04 18:27:26.000000000 +0800 -@@ -8,10 +8,10 @@ - - L_TARGET := lib.a - --export-objs := cmdline.o dec_and_lock.o rwsem-spinlock.o rwsem.o rbtree.o -+export-objs := cmdline.o dec_and_lock.o rwsem-spinlock.o rwsem.o rbtree.o dynlocks.o - - obj-y := errno.o ctype.o string.o vsprintf.o brlock.o cmdline.o \ -- bust_spinlocks.o rbtree.o dump_stack.o -+ bust_spinlocks.o rbtree.o dump_stack.o dynlocks.o - - obj-$(CONFIG_RWSEM_GENERIC_SPINLOCK) += rwsem-spinlock.o - obj-$(CONFIG_RWSEM_XCHGADD_ALGORITHM) += rwsem.o diff --git a/lustre/kernel_patches/patches/dynamic-locks-2.4.24.patch b/lustre/kernel_patches/patches/dynamic-locks-2.4.24.patch index a846605997..2da0974428 100644 --- a/lustre/kernel_patches/patches/dynamic-locks-2.4.24.patch +++ b/lustre/kernel_patches/patches/dynamic-locks-2.4.24.patch @@ -55,7 +55,7 @@ Index: linux-2.4.24/lib/dynlocks.c =================================================================== --- linux-2.4.24.orig/lib/dynlocks.c 2003-01-30 13:24:37.000000000 +0300 +++ linux-2.4.24/lib/dynlocks.c 2004-07-18 11:23:01.000000000 +0400 -@@ -0,0 +1,187 @@ +@@ -0,0 +1,188 @@ +/* + * Dynamic Locks + * @@ -69,6 +69,7 @@ Index: linux-2.4.24/lib/dynlocks.c +#include <linux/module.h> +#include <linux/slab.h> +#include <linux/sched.h> ++#include <linux/init.h> + +static kmem_cache_t * dynlock_cachep = NULL; + diff --git a/lustre/kernel_patches/patches/dynamic-locks-2.4.21-suse2.patch b/lustre/kernel_patches/patches/dynamic-locks-2.6.7.patch similarity index 81% rename from lustre/kernel_patches/patches/dynamic-locks-2.4.21-suse2.patch rename to lustre/kernel_patches/patches/dynamic-locks-2.6.7.patch index 6ab4ef12a9..2f57fd5dbf 100644 --- a/lustre/kernel_patches/patches/dynamic-locks-2.4.21-suse2.patch +++ b/lustre/kernel_patches/patches/dynamic-locks-2.6.7.patch @@ -3,10 +3,10 @@ lib/dynlocks.c | 152 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+), 2 deletions(-) -Index: linux-2.4.21-suse2/include/linux/dynlocks.h +Index: linux-2.6.7/include/linux/dynlocks.h =================================================================== ---- linux-2.4.21-suse2.orig/include/linux/dynlocks.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-suse2/include/linux/dynlocks.h 2004-08-19 13:11:02.000000000 +0400 +--- linux-2.6.7.orig/include/linux/dynlocks.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.6.7/include/linux/dynlocks.h 2004-09-07 14:12:39.000000000 +0400 @@ -0,0 +1,43 @@ +#ifndef _LINUX_DYNLOCKS_H +#define _LINUX_DYNLOCKS_H @@ -51,10 +51,10 @@ Index: linux-2.4.21-suse2/include/linux/dynlocks.h + +#endif + -Index: linux-2.4.21-suse2/lib/dynlocks.c +Index: linux-2.6.7/lib/dynlocks.c =================================================================== ---- linux-2.4.21-suse2.orig/lib/dynlocks.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-suse2/lib/dynlocks.c 2004-08-19 13:11:02.000000000 +0400 +--- linux-2.6.7.orig/lib/dynlocks.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.6.7/lib/dynlocks.c 2004-09-07 14:12:39.000000000 +0400 @@ -0,0 +1,187 @@ +/* + * Dynamic Locks @@ -243,38 +243,36 @@ Index: linux-2.4.21-suse2/lib/dynlocks.c +EXPORT_SYMBOL(dynlock_lock); +EXPORT_SYMBOL(dynlock_unlock); + -Index: linux-2.4.21-suse2/lib/Makefile +Index: linux-2.6.7/lib/Makefile =================================================================== ---- linux-2.4.21-suse2.orig/lib/Makefile 2003-10-28 21:34:24.000000000 +0300 -+++ linux-2.4.21-suse2/lib/Makefile 2004-08-19 13:11:31.000000000 +0400 -@@ -9,10 +9,10 @@ - L_TARGET := lib.a +--- linux-2.6.7.orig/lib/Makefile 2004-08-26 17:12:16.000000000 +0400 ++++ linux-2.6.7/lib/Makefile 2004-09-07 14:13:03.000000000 +0400 +@@ -6,7 +6,7 @@ + lib-y := errno.o ctype.o string.o vsprintf.o cmdline.o \ + bust_spinlocks.o rbtree.o radix-tree.o dump_stack.o \ + kobject.o idr.o div64.o parser.o int_sqrt.o \ +- bitmap.o extable.o ++ bitmap.o extable.o dynlocks.o - export-objs := cmdline.o dec_and_lock.o rwsem.o rbtree.o qsort.o \ -- firmware_class.o -+ firmware_class.o dynlocks.o - - obj-y := errno.o ctype.o string.o vsprintf.o brlock.o cmdline.o \ -- bust_spinlocks.o rbtree.o dump_stack.o rwsem.o md5.o -+ bust_spinlocks.o rbtree.o dump_stack.o rwsem.o md5.o dynlocks.o - - obj-$(CONFIG_FW_LOADER) += firmware_class.o - obj-$(CONFIG_QSORT) += qsort.o -Index: linux-2.4.21-suse2/fs/dcache.c + # hack for now till some static code uses krefs, then it can move up above... + obj-y += kref.o +Index: linux-2.6.7/fs/dcache.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/dcache.c 2004-08-19 12:57:06.000000000 +0400 -+++ linux-2.4.21-suse2/fs/dcache.c 2004-08-19 13:11:02.000000000 +0400 -@@ -1312,6 +1312,7 @@ +--- linux-2.6.7.orig/fs/dcache.c 2004-09-06 22:53:19.000000000 +0400 ++++ linux-2.6.7/fs/dcache.c 2004-09-07 14:13:42.000000000 +0400 +@@ -1654,6 +1654,7 @@ + extern void bdev_cache_init(void); - extern void cdev_cache_init(void); - extern void iobuf_cache_init(void); + extern void chrdev_init(void); +extern void dynlock_cache_init(void); void __init vfs_caches_init(unsigned long mempages) { -@@ -1348,4 +1349,5 @@ +@@ -1677,6 +1678,7 @@ + mnt_init(mempages); bdev_cache_init(); - cdev_cache_init(); - iobuf_cache_init(); + chrdev_init(); + dynlock_cache_init(); } + + EXPORT_SYMBOL(d_alloc); diff --git a/lustre/kernel_patches/patches/export-truncate.patch b/lustre/kernel_patches/patches/export-truncate-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/export-truncate.patch rename to lustre/kernel_patches/patches/export-truncate-2.4.24.patch diff --git a/lustre/kernel_patches/patches/export-zap-page-range-2.4.24.patch b/lustre/kernel_patches/patches/export-zap-page-range-2.4.24.patch new file mode 100644 index 0000000000..9b9d48fbb9 --- /dev/null +++ b/lustre/kernel_patches/patches/export-zap-page-range-2.4.24.patch @@ -0,0 +1,12 @@ +Index: linux-2.4.24-l36mmap/mm/memory.c +=================================================================== +--- linux-2.4.24-l36mmap.orig/mm/memory.c 2004-05-27 17:44:13.000000000 -0700 ++++ linux-2.4.24-l36mmap/mm/memory.c 2004-05-27 17:45:07.000000000 -0700 +@@ -411,6 +411,7 @@ + mm->rss = 0; + spin_unlock(&mm->page_table_lock); + } ++EXPORT_SYMBOL_GPL(zap_page_range); + + /* + * Do a quick page-table lookup for a single page. diff --git a/lustre/kernel_patches/patches/export_lookup_create.patch b/lustre/kernel_patches/patches/export_lookup_create-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/export_lookup_create.patch rename to lustre/kernel_patches/patches/export_lookup_create-2.4.24.patch diff --git a/lustre/kernel_patches/patches/export_num_siblings-2.4.24.patch b/lustre/kernel_patches/patches/export_num_siblings-2.4.24.patch new file mode 100644 index 0000000000..0fdefb53eb --- /dev/null +++ b/lustre/kernel_patches/patches/export_num_siblings-2.4.24.patch @@ -0,0 +1,10 @@ +--- linux/arch/i386/kernel/i386_ksyms.c.orig 2003-11-28 11:26:19.000000000 -0700 ++++ linux/arch/i386/kernel/i386_ksyms.c 2004-08-13 11:31:33.000000000 -0600 +@@ -131,6 +131,7 @@ + EXPORT_SYMBOL(cpu_data); + EXPORT_SYMBOL(kernel_flag_cacheline); + EXPORT_SYMBOL(smp_num_cpus); ++EXPORT_SYMBOL(smp_num_siblings); + EXPORT_SYMBOL(cpu_online_map); + EXPORT_SYMBOL_NOVERS(__write_lock_failed); + EXPORT_SYMBOL_NOVERS(__read_lock_failed); diff --git a/lustre/kernel_patches/patches/export_symbols-2.6-suse.patch b/lustre/kernel_patches/patches/export_symbols-2.6-suse.patch index b22d925391..e8e17409d1 100644 --- a/lustre/kernel_patches/patches/export_symbols-2.6-suse.patch +++ b/lustre/kernel_patches/patches/export_symbols-2.6-suse.patch @@ -1,7 +1,7 @@ -Index: linux-2.6.4-51.0/fs/filesystems.c +Index: linux-2.6.7/fs/filesystems.c =================================================================== ---- linux-2.6.4-51.0.orig/fs/filesystems.c 2004-04-05 12:41:59.000000000 -0400 -+++ linux-2.6.4-51.0/fs/filesystems.c 2004-04-15 14:59:56.000000000 -0400 +--- linux-2.6.7.orig/fs/filesystems.c 2004-06-16 13:19:51.000000000 +0800 ++++ linux-2.6.7/fs/filesystems.c 2004-09-06 21:01:57.000000000 +0800 @@ -27,7 +27,9 @@ */ @@ -13,11 +13,33 @@ Index: linux-2.6.4-51.0/fs/filesystems.c /* WARNING: This can be used only if we _already_ own a reference */ void get_filesystem(struct file_system_type *fs) -Index: linux-2.6.4-51.0/include/linux/fs.h +Index: linux-2.6.7/fs/namespace.c =================================================================== ---- linux-2.6.4-51.0.orig/include/linux/fs.h 2004-04-15 14:59:50.000000000 -0400 -+++ linux-2.6.4-51.0/include/linux/fs.h 2004-04-15 14:59:56.000000000 -0400 -@@ -1432,6 +1432,7 @@ +--- linux-2.6.7.orig/fs/namespace.c 2004-09-06 21:00:27.000000000 +0800 ++++ linux-2.6.7/fs/namespace.c 2004-09-06 21:01:57.000000000 +0800 +@@ -364,7 +364,7 @@ + } + } + +-static int do_umount(struct vfsmount *mnt, int flags) ++int do_umount(struct vfsmount *mnt, int flags) + { + struct super_block * sb = mnt->mnt_sb; + int retval; +@@ -439,7 +439,7 @@ + up_write(¤t->namespace->sem); + return retval; + } +- ++EXPORT_SYMBOL(do_umount); + /* + * Now umount can handle mount points as well as block devices. + * This is important for filesystems which use unnamed block devices. +Index: linux-2.6.7/include/linux/fs.h +=================================================================== +--- linux-2.6.7.orig/include/linux/fs.h 2004-08-30 19:31:13.000000000 +0800 ++++ linux-2.6.7/include/linux/fs.h 2004-09-06 21:01:57.000000000 +0800 +@@ -1474,6 +1474,7 @@ extern struct file_operations generic_ro_fops; @@ -25,10 +47,10 @@ Index: linux-2.6.4-51.0/include/linux/fs.h #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m)) extern int vfs_readlink(struct dentry *, char __user *, int, const char *); -Index: linux-2.6.4-51.0/include/linux/ext2_fs_sb.h +Index: linux-2.6.7/include/linux/ext2_fs_sb.h =================================================================== ---- linux-2.6.4-51.0.orig/include/linux/ext2_fs_sb.h 2004-04-05 12:42:07.000000000 -0400 -+++ linux-2.6.4-51.0/include/linux/ext2_fs_sb.h 2004-04-15 14:59:56.000000000 -0400 +--- linux-2.6.7.orig/include/linux/ext2_fs_sb.h 2004-06-16 13:19:53.000000000 +0800 ++++ linux-2.6.7/include/linux/ext2_fs_sb.h 2004-09-06 21:01:57.000000000 +0800 @@ -16,9 +16,11 @@ #ifndef _LINUX_EXT2_FS_SB #define _LINUX_EXT2_FS_SB @@ -42,11 +64,23 @@ Index: linux-2.6.4-51.0/include/linux/ext2_fs_sb.h /* * second extended-fs super-block data in memory */ -Index: linux-2.6.4-51.0/kernel/kallsyms.c +Index: linux-2.6.7/include/linux/mount.h +=================================================================== +--- linux-2.6.7.orig/include/linux/mount.h 2004-09-06 21:01:55.000000000 +0800 ++++ linux-2.6.7/include/linux/mount.h 2004-09-06 21:02:26.000000000 +0800 +@@ -56,6 +56,7 @@ + extern struct vfsmount *alloc_vfsmnt(const char *name); + extern struct vfsmount *do_kern_mount(const char *fstype, int flags, + const char *name, void *data); ++extern int do_umount(struct vfsmount *mnt, int flags); + extern spinlock_t vfsmount_lock; + + #endif +Index: linux-2.6.7/kernel/kallsyms.c =================================================================== ---- linux-2.6.4-51.0.orig/kernel/kallsyms.c 2004-04-05 12:42:08.000000000 -0400 -+++ linux-2.6.4-51.0/kernel/kallsyms.c 2004-04-15 15:00:56.000000000 -0400 -@@ -329,3 +329,4 @@ +--- linux-2.6.7.orig/kernel/kallsyms.c 2004-06-16 13:20:19.000000000 +0800 ++++ linux-2.6.7/kernel/kallsyms.c 2004-09-06 21:01:57.000000000 +0800 +@@ -322,3 +322,4 @@ EXPORT_SYMBOL(kallsyms_lookup); EXPORT_SYMBOL(__print_symbol); diff --git a/lustre/kernel_patches/patches/exports_2.4.20-rh-hp.patch b/lustre/kernel_patches/patches/exports-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/exports_2.4.20-rh-hp.patch rename to lustre/kernel_patches/patches/exports-2.4.24.patch diff --git a/lustre/kernel_patches/patches/exports.patch b/lustre/kernel_patches/patches/exports.patch deleted file mode 100644 index 33e0b6ce4b..0000000000 --- a/lustre/kernel_patches/patches/exports.patch +++ /dev/null @@ -1,57 +0,0 @@ - - - - fs/ext3/Makefile | 2 ++ - fs/ext3/super.c | 2 +- - include/linux/fs.h | 1 + - kernel/ksyms.c | 5 +++++ - 4 files changed, 9 insertions(+), 1 deletion(-) - ---- linux-2.4.18-18/fs/ext3/Makefile~exports Sat Apr 5 02:51:27 2003 -+++ linux-2.4.18-18-braam/fs/ext3/Makefile Sat Apr 5 02:54:45 2003 -@@ -9,6 +9,8 @@ - - O_TARGET := ext3.o - -+export-objs := super.o inode.o -+ - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) ---- linux-2.4.18-18/fs/ext3/super.c~exports Sat Apr 5 02:51:27 2003 -+++ linux-2.4.18-18-braam/fs/ext3/super.c Sat Apr 5 02:54:28 2003 -@@ -1746,7 +1746,7 @@ static void __exit exit_ext3_fs(void) - unregister_filesystem(&ext3_fs_type); - } - --EXPORT_NO_SYMBOLS; -+EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); ---- linux-2.4.18-18/include/linux/fs.h~exports Sat Apr 5 02:51:27 2003 -+++ linux-2.4.18-18-braam/include/linux/fs.h Sat Apr 5 02:54:29 2003 -@@ -1046,6 +1046,7 @@ extern int unregister_filesystem(struct - extern struct vfsmount *kern_mount(struct file_system_type *); - extern int may_umount(struct vfsmount *); - extern long do_mount(char *, char *, char *, unsigned long, void *); -+struct vfsmount *do_kern_mount(const char *type, int flags, char *name, void *data); - extern void umount_tree(struct vfsmount *); - - #define kern_umount mntput ---- linux-2.4.18-18/kernel/ksyms.c~exports Sat Apr 5 02:51:27 2003 -+++ linux-2.4.18-18-braam/kernel/ksyms.c Sat Apr 5 02:54:29 2003 -@@ -306,6 +306,11 @@ EXPORT_SYMBOL_GPL(buffermem_pages); - EXPORT_SYMBOL_GPL(nr_free_pages); - EXPORT_SYMBOL_GPL(page_cache_size); - -+/* lustre */ -+EXPORT_SYMBOL(panic_notifier_list); -+EXPORT_SYMBOL(pagecache_lock_cacheline); -+EXPORT_SYMBOL(do_kern_mount); -+ - /* for stackable file systems (lofs, wrapfs, cryptfs, etc.) */ - EXPORT_SYMBOL(default_llseek); - EXPORT_SYMBOL(dentry_open); - -_ diff --git a/lustre/kernel_patches/patches/exports_2.4.19-pre1.patch b/lustre/kernel_patches/patches/exports_2.4.19-pre1.patch deleted file mode 100644 index 9c37bbc0d7..0000000000 --- a/lustre/kernel_patches/patches/exports_2.4.19-pre1.patch +++ /dev/null @@ -1,62 +0,0 @@ - - - - fs/ext3/Makefile | 4 +++- - fs/ext3/super.c | 2 +- - include/linux/fs.h | 1 + - kernel/ksyms.c | 5 +++++ - 4 files changed, 10 insertions(+), 2 deletions(-) - -Index: linux-2.4.19-pre1/fs/ext3/Makefile -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/Makefile 2003-11-21 02:39:49.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/Makefile 2003-11-21 02:41:04.000000000 +0300 -@@ -9,6 +9,8 @@ - - O_TARGET := ext3.o - -+export-objs := super.o inode.o -+ - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) -Index: linux-2.4.19-pre1/fs/ext3/super.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/super.c 2003-11-21 02:39:49.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/super.c 2003-11-21 02:41:04.000000000 +0300 -@@ -1744,7 +1744,7 @@ - unregister_filesystem(&ext3_fs_type); - } - --EXPORT_NO_SYMBOLS; -+EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); -Index: linux-2.4.19-pre1/include/linux/fs.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/fs.h 2003-11-21 02:39:49.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/fs.h 2003-11-21 02:41:41.000000000 +0300 -@@ -984,6 +984,7 @@ - extern struct vfsmount *kern_mount(struct file_system_type *); - extern int may_umount(struct vfsmount *); - extern long do_mount(char *, char *, char *, unsigned long, void *); -+struct vfsmount *do_kern_mount(char *type, int flags, char *name, void *data); - - #define kern_umount mntput - -Index: linux-2.4.19-pre1/kernel/ksyms.c -=================================================================== ---- linux-2.4.19-pre1.orig/kernel/ksyms.c 2003-11-21 02:39:49.000000000 +0300 -+++ linux-2.4.19-pre1/kernel/ksyms.c 2003-11-21 02:41:04.000000000 +0300 -@@ -271,6 +271,10 @@ - EXPORT_SYMBOL(lock_may_write); - EXPORT_SYMBOL(dcache_readdir); - -+/* lustre */ -+EXPORT_SYMBOL(panic_notifier_list); -+EXPORT_SYMBOL(do_kern_mount); -+ - /* for stackable file systems (lofs, wrapfs, cryptfs, etc.) */ - EXPORT_SYMBOL(default_llseek); - EXPORT_SYMBOL(dentry_open); diff --git a/lustre/kernel_patches/patches/exports_2.4.19-suse.patch b/lustre/kernel_patches/patches/exports_2.4.19-suse.patch deleted file mode 100644 index 769f411f86..0000000000 --- a/lustre/kernel_patches/patches/exports_2.4.19-suse.patch +++ /dev/null @@ -1,59 +0,0 @@ - fs/ext3/Makefile | 2 ++ - fs/ext3/super.c | 2 +- - include/linux/fs.h | 1 + - kernel/ksyms.c | 4 ++++ - 4 files changed, 8 insertions(+), 1 deletion(-) - -Index: linux-2.4.19/fs/ext3/Makefile -=================================================================== ---- linux-2.4.19.orig/fs/ext3/Makefile 2004-04-23 17:53:55.000000000 -0400 -+++ linux-2.4.19/fs/ext3/Makefile 2004-04-23 18:25:03.000000000 -0400 -@@ -9,6 +9,8 @@ - - O_TARGET := ext3.o - -+export-objs := super.o inode.o -+ - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) -Index: linux-2.4.19/fs/ext3/super.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/super.c 2004-04-23 17:53:55.000000000 -0400 -+++ linux-2.4.19/fs/ext3/super.c 2004-04-23 18:25:03.000000000 -0400 -@@ -1821,7 +1821,7 @@ - exit_ext3_xattr(); - } - --EXPORT_NO_SYMBOLS; -+EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); -Index: linux-2.4.19/include/linux/fs.h -=================================================================== ---- linux-2.4.19.orig/include/linux/fs.h 2004-04-23 17:54:14.000000000 -0400 -+++ linux-2.4.19/include/linux/fs.h 2004-04-23 18:25:27.000000000 -0400 -@@ -1183,6 +1183,7 @@ - extern struct vfsmount *kern_mount(struct file_system_type *); - extern int may_umount(struct vfsmount *); - extern long do_mount(char *, char *, char *, unsigned long, void *); -+struct vfsmount *do_kern_mount(const char *type, int flags, char *name, void *data); - extern void umount_tree(struct vfsmount *); - - #define kern_umount mntput -Index: linux-2.4.19/kernel/ksyms.c -=================================================================== ---- linux-2.4.19.orig/kernel/ksyms.c 2004-04-23 17:54:14.000000000 -0400 -+++ linux-2.4.19/kernel/ksyms.c 2004-04-23 18:25:03.000000000 -0400 -@@ -330,6 +330,10 @@ - EXPORT_SYMBOL(dcache_readdir); - EXPORT_SYMBOL(dcache_dir_ops); - -+/* lustre */ -+EXPORT_SYMBOL(pagecache_lock_cacheline); -+EXPORT_SYMBOL(do_kern_mount); -+ - /* for stackable file systems (lofs, wrapfs, cryptfs, etc.) */ - EXPORT_SYMBOL(default_llseek); - EXPORT_SYMBOL(dentry_open); diff --git a/lustre/kernel_patches/patches/exports_2.4.20.patch b/lustre/kernel_patches/patches/exports_2.4.20.patch deleted file mode 100644 index bed8693c18..0000000000 --- a/lustre/kernel_patches/patches/exports_2.4.20.patch +++ /dev/null @@ -1,57 +0,0 @@ - - - - fs/ext3/Makefile | 4 +++- - fs/ext3/super.c | 2 +- - include/linux/fs.h | 1 + - kernel/ksyms.c | 5 +++++ - 4 files changed, 10 insertions(+), 2 deletions(-) - ---- linux-2.4.20/fs/ext3/Makefile~exports_hp Sat Apr 5 03:55:19 2003 -+++ linux-2.4.20-braam/fs/ext3/Makefile Sat Apr 5 03:56:03 2003 -@@ -9,6 +9,8 @@ - - O_TARGET := ext3.o - -+export-objs := super.o inode.o -+ - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) ---- linux-2.4.20/fs/ext3/super.c~exports_hp Sat Apr 5 03:55:19 2003 -+++ linux-2.4.20-braam/fs/ext3/super.c Sat Apr 5 03:55:19 2003 -@@ -1769,7 +1769,7 @@ static void __exit exit_ext3_fs(void) - unregister_filesystem(&ext3_fs_type); - } - --EXPORT_NO_SYMBOLS; -+EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); ---- linux-2.4.20/include/linux/fs.h~exports_hp Sat Apr 5 03:55:19 2003 -+++ linux-2.4.20-braam/include/linux/fs.h Sat Apr 5 03:55:19 2003 -@@ -1005,6 +1005,7 @@ extern int unregister_filesystem(struct - extern struct vfsmount *kern_mount(struct file_system_type *); - extern int may_umount(struct vfsmount *); - extern long do_mount(char *, char *, char *, unsigned long, void *); -+struct vfsmount *do_kern_mount(const char *type, int flags, char *name, void *data); - - #define kern_umount mntput - ---- linux-2.4.20/kernel/ksyms.c~exports_hp Sat Apr 5 03:55:19 2003 -+++ linux-2.4.20-braam/kernel/ksyms.c Sat Apr 5 03:55:19 2003 -@@ -284,6 +284,11 @@ EXPORT_SYMBOL(dcache_dir_fsync); - EXPORT_SYMBOL(dcache_readdir); - EXPORT_SYMBOL(dcache_dir_ops); - -+/* lustre */ -+EXPORT_SYMBOL(pagecache_lock_cacheline); -+EXPORT_SYMBOL(panic_notifier_list); -+EXPORT_SYMBOL(do_kern_mount); -+ - /* for stackable file systems (lofs, wrapfs, cryptfs, etc.) */ - EXPORT_SYMBOL(default_llseek); - EXPORT_SYMBOL(dentry_open); - -_ diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-1-chaos.patch b/lustre/kernel_patches/patches/ext-2.4-patch-1-chaos.patch deleted file mode 100644 index f6b2f4350d..0000000000 --- a/lustre/kernel_patches/patches/ext-2.4-patch-1-chaos.patch +++ /dev/null @@ -1,2528 +0,0 @@ - fs/ext3/Makefile | 2 - fs/ext3/dir.c | 299 +++++++++ - fs/ext3/file.c | 3 - fs/ext3/hash.c | 215 ++++++ - fs/ext3/namei.c | 1388 ++++++++++++++++++++++++++++++++++++++++----- - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 85 ++ - include/linux/ext3_fs_sb.h | 2 - include/linux/ext3_jbd.h | 2 - include/linux/rbtree.h | 2 - lib/rbtree.c | 42 + - 11 files changed, 1887 insertions(+), 160 deletions(-) - ---- linux-chaos-2.4.20-6/fs/ext3/Makefile~ext-2.4-patch-1-chaos 2003-04-09 16:10:38.000000000 -0600 -+++ linux-chaos-2.4.20-6-braam/fs/ext3/Makefile 2003-04-09 16:18:55.000000000 -0600 -@@ -12,7 +12,7 @@ O_TARGET := ext3.o - export-objs := super.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o -+ ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - - include $(TOPDIR)/Rules.make ---- linux-chaos-2.4.20-6/fs/ext3/dir.c~ext-2.4-patch-1-chaos 2002-05-07 15:53:46.000000000 -0600 -+++ linux-chaos-2.4.20-6-braam/fs/ext3/dir.c 2003-04-09 16:18:55.000000000 -0600 -@@ -21,12 +21,16 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/slab.h> -+#include <linux/rbtree.h> - - static unsigned char ext3_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK - }; - - static int ext3_readdir(struct file *, void *, filldir_t); -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir); - - struct file_operations ext3_dir_operations = { - read: generic_read_dir, -@@ -35,6 +39,17 @@ struct file_operations ext3_dir_operatio - fsync: ext3_sync_file, /* BKL held */ - }; - -+ -+static unsigned char get_dtype(struct super_block *sb, int filetype) -+{ -+ if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || -+ (filetype >= EXT3_FT_MAX)) -+ return DT_UNKNOWN; -+ -+ return (ext3_filetype_table[filetype]); -+} -+ -+ - int ext3_check_dir_entry (const char * function, struct inode * dir, - struct ext3_dir_entry_2 * de, - struct buffer_head * bh, -@@ -79,6 +94,16 @@ static int ext3_readdir(struct file * fi - - sb = inode->i_sb; - -+ if (is_dx(inode)) { -+ err = ext3_dx_readdir(filp, dirent, filldir); -+ if (err != ERR_BAD_DX_DIR) -+ return err; -+ /* -+ * We don't set the inode dirty flag since it's not -+ * critical that it get flushed back to the disk. -+ */ -+ EXT3_I(filp->f_dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; -+ } - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); -@@ -162,18 +187,12 @@ revalidate: - * during the copy operation. - */ - unsigned long version = filp->f_version; -- unsigned char d_type = DT_UNKNOWN; - -- if (EXT3_HAS_INCOMPAT_FEATURE(sb, -- EXT3_FEATURE_INCOMPAT_FILETYPE) -- && de->file_type < EXT3_FT_MAX) -- d_type = -- ext3_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, - le32_to_cpu(de->inode), -- d_type); -+ get_dtype(sb, de->file_type)); - if (error) - break; - if (version != filp->f_version) -@@ -188,3 +207,269 @@ revalidate: - UPDATE_ATIME(inode); - return 0; - } -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * These functions convert from the major/minor hash to an f_pos -+ * value. -+ * -+ * Currently we only use major hash numer. This is unfortunate, but -+ * on 32-bit machines, the same VFS interface is used for lseek and -+ * llseek, so if we use the 64 bit offset, then the 32-bit versions of -+ * lseek/telldir/seekdir will blow out spectacularly, and from within -+ * the ext2 low-level routine, we don't know if we're being called by -+ * a 64-bit version of the system call or the 32-bit version of the -+ * system call. Worse yet, NFSv2 only allows for a 32-bit readdir -+ * cookie. Sigh. -+ */ -+#define hash2pos(major, minor) (major >> 1) -+#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff) -+#define pos2min_hash(pos) (0) -+ -+/* -+ * This structure holds the nodes of the red-black tree used to store -+ * the directory entry in hash order. -+ */ -+struct fname { -+ __u32 hash; -+ __u32 minor_hash; -+ rb_node_t rb_hash; -+ struct fname *next; -+ __u32 inode; -+ __u8 name_len; -+ __u8 file_type; -+ char name[0]; -+}; -+ -+/* -+ * This functoin implements a non-recursive way of freeing all of the -+ * nodes in the red-black tree. -+ */ -+static void free_rb_tree_fname(rb_root_t *root) -+{ -+ rb_node_t *n = root->rb_node; -+ rb_node_t *parent; -+ struct fname *fname; -+ -+ while (n) { -+ /* Do the node's children first */ -+ if ((n)->rb_left) { -+ n = n->rb_left; -+ continue; -+ } -+ if (n->rb_right) { -+ n = n->rb_right; -+ continue; -+ } -+ /* -+ * The node has no children; free it, and then zero -+ * out parent's link to it. Finally go to the -+ * beginning of the loop and try to free the parent -+ * node. -+ */ -+ parent = n->rb_parent; -+ fname = rb_entry(n, struct fname, rb_hash); -+ kfree(fname); -+ if (!parent) -+ root->rb_node = 0; -+ else if (parent->rb_left == n) -+ parent->rb_left = 0; -+ else if (parent->rb_right == n) -+ parent->rb_right = 0; -+ n = parent; -+ } -+ root->rb_node = 0; -+} -+ -+ -+struct dir_private_info *create_dir_info(loff_t pos) -+{ -+ struct dir_private_info *p; -+ -+ p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL); -+ if (!p) -+ return NULL; -+ p->root.rb_node = 0; -+ p->curr_node = 0; -+ p->extra_fname = 0; -+ p->last_pos = 0; -+ p->curr_hash = pos2maj_hash(pos); -+ p->curr_minor_hash = pos2min_hash(pos); -+ p->next_hash = 0; -+ return p; -+} -+ -+void ext3_htree_free_dir_info(struct dir_private_info *p) -+{ -+ free_rb_tree_fname(&p->root); -+ kfree(p); -+} -+ -+/* -+ * Given a directory entry, enter it into the fname rb tree. -+ */ -+void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent) -+{ -+ rb_node_t **p, *parent = NULL; -+ struct fname * fname, *new_fn; -+ struct dir_private_info *info; -+ int len; -+ -+ info = (struct dir_private_info *) dir_file->private_data; -+ p = &info->root.rb_node; -+ -+ /* Create and allocate the fname structure */ -+ len = sizeof(struct fname) + dirent->name_len + 1; -+ new_fn = kmalloc(len, GFP_KERNEL); -+ memset(new_fn, 0, len); -+ new_fn->hash = hash; -+ new_fn->minor_hash = minor_hash; -+ new_fn->inode = le32_to_cpu(dirent->inode); -+ new_fn->name_len = dirent->name_len; -+ new_fn->file_type = dirent->file_type; -+ memcpy(new_fn->name, dirent->name, dirent->name_len); -+ new_fn->name[dirent->name_len] = 0; -+ -+ while (*p) { -+ parent = *p; -+ fname = rb_entry(parent, struct fname, rb_hash); -+ -+ /* -+ * If the hash and minor hash match up, then we put -+ * them on a linked list. This rarely happens... -+ */ -+ if ((new_fn->hash == fname->hash) && -+ (new_fn->minor_hash == fname->minor_hash)) { -+ new_fn->next = fname->next; -+ fname->next = new_fn; -+ return; -+ } -+ -+ if (new_fn->hash < fname->hash) -+ p = &(*p)->rb_left; -+ else if (new_fn->hash > fname->hash) -+ p = &(*p)->rb_right; -+ else if (new_fn->minor_hash < fname->minor_hash) -+ p = &(*p)->rb_left; -+ else /* if (new_fn->minor_hash > fname->minor_hash) */ -+ p = &(*p)->rb_right; -+ } -+ -+ rb_link_node(&new_fn->rb_hash, parent, p); -+ rb_insert_color(&new_fn->rb_hash, &info->root); -+} -+ -+ -+ -+/* -+ * This is a helper function for ext3_dx_readdir. It calls filldir -+ * for all entres on the fname linked list. (Normally there is only -+ * one entry on the linked list, unless there are 62 bit hash collisions.) -+ */ -+static int call_filldir(struct file * filp, void * dirent, -+ filldir_t filldir, struct fname *fname) -+{ -+ struct dir_private_info *info = filp->private_data; -+ loff_t curr_pos; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct super_block * sb; -+ int error; -+ -+ sb = inode->i_sb; -+ -+ if (!fname) { -+ printk("call_filldir: called with null fname?!?\n"); -+ return 0; -+ } -+ curr_pos = hash2pos(fname->hash, fname->minor_hash); -+ while (fname) { -+ error = filldir(dirent, fname->name, -+ fname->name_len, curr_pos, -+ fname->inode, -+ get_dtype(sb, fname->file_type)); -+ if (error) { -+ filp->f_pos = curr_pos; -+ info->extra_fname = fname->next; -+ return error; -+ } -+ fname = fname->next; -+ } -+ return 0; -+} -+ -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir) -+{ -+ struct dir_private_info *info = filp->private_data; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct fname *fname; -+ int ret; -+ -+ if (!info) { -+ info = create_dir_info(filp->f_pos); -+ if (!info) -+ return -ENOMEM; -+ filp->private_data = info; -+ } -+ -+ /* Some one has messed with f_pos; reset the world */ -+ if (info->last_pos != filp->f_pos) { -+ free_rb_tree_fname(&info->root); -+ info->curr_node = 0; -+ info->extra_fname = 0; -+ info->curr_hash = pos2maj_hash(filp->f_pos); -+ info->curr_minor_hash = pos2min_hash(filp->f_pos); -+ } -+ -+ /* -+ * If there are any leftover names on the hash collision -+ * chain, return them first. -+ */ -+ if (info->extra_fname && -+ call_filldir(filp, dirent, filldir, info->extra_fname)) -+ goto finished; -+ -+ if (!info->curr_node) -+ info->curr_node = rb_get_first(&info->root); -+ -+ while (1) { -+ /* -+ * Fill the rbtree if we have no more entries, -+ * or the inode has changed since we last read in the -+ * cached entries. -+ */ -+ if ((!info->curr_node) || -+ (filp->f_version != inode->i_version)) { -+ info->curr_node = 0; -+ free_rb_tree_fname(&info->root); -+ filp->f_version = inode->i_version; -+ ret = ext3_htree_fill_tree(filp, info->curr_hash, -+ info->curr_minor_hash, -+ &info->next_hash); -+ if (ret < 0) -+ return ret; -+ if (ret == 0) -+ break; -+ info->curr_node = rb_get_first(&info->root); -+ } -+ -+ fname = rb_entry(info->curr_node, struct fname, rb_hash); -+ info->curr_hash = fname->hash; -+ info->curr_minor_hash = fname->minor_hash; -+ if (call_filldir(filp, dirent, filldir, fname)) -+ break; -+ -+ info->curr_node = rb_get_next(info->curr_node); -+ if (!info->curr_node) { -+ info->curr_hash = info->next_hash; -+ info->curr_minor_hash = 0; -+ } -+ } -+finished: -+ info->last_pos = filp->f_pos; -+ UPDATE_ATIME(inode); -+ return 0; -+} -+#endif ---- linux-chaos-2.4.20-6/fs/ext3/file.c~ext-2.4-patch-1-chaos 2003-02-14 15:59:09.000000000 -0700 -+++ linux-chaos-2.4.20-6-braam/fs/ext3/file.c 2003-04-09 16:18:55.000000000 -0600 -@@ -35,6 +35,9 @@ static int ext3_release_file (struct ino - { - if (filp->f_mode & FMODE_WRITE) - ext3_discard_prealloc (inode); -+ if (is_dx(inode) && filp->private_data) -+ ext3_htree_free_dir_info(filp->private_data); -+ - return 0; - } - ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ linux-chaos-2.4.20-6-braam/fs/ext3/hash.c 2003-04-09 16:18:55.000000000 -0600 -@@ -0,0 +1,215 @@ -+/* -+ * linux/fs/ext3/hash.c -+ * -+ * Copyright (C) 2002 by Theodore Ts'o -+ * -+ * This file is released under the GPL v2. -+ * -+ * This file may be redistributed under the terms of the GNU Public -+ * License. -+ */ -+ -+#include <linux/fs.h> -+#include <linux/jbd.h> -+#include <linux/sched.h> -+#include <linux/ext3_fs.h> -+ -+#define DELTA 0x9E3779B9 -+ -+static void TEA_transform(__u32 buf[4], __u32 const in[]) -+{ -+ __u32 sum = 0; -+ __u32 b0 = buf[0], b1 = buf[1]; -+ __u32 a = in[0], b = in[1], c = in[2], d = in[3]; -+ int n = 16; -+ -+ do { -+ sum += DELTA; -+ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); -+ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); -+ } while(--n); -+ -+ buf[0] += b0; -+ buf[1] += b1; -+} -+ -+/* F, G and H are basic MD4 functions: selection, majority, parity */ -+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -+#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -+#define H(x, y, z) ((x) ^ (y) ^ (z)) -+ -+/* -+ * The generic round function. The application is so specific that -+ * we don't bother protecting all the arguments with parens, as is generally -+ * good macro practice, in favor of extra legibility. -+ * Rotation is separate from addition to prevent recomputation -+ */ -+#define ROUND(f, a, b, c, d, x, s) \ -+ (a += f(b, c, d) + x, a = (a << s) | (a >> (32-s))) -+#define K1 0 -+#define K2 013240474631UL -+#define K3 015666365641UL -+ -+/* -+ * Basic cut-down MD4 transform. Returns only 32 bits of result. -+ */ -+static void halfMD4Transform (__u32 buf[4], __u32 const in[]) -+{ -+ __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; -+ -+ /* Round 1 */ -+ ROUND(F, a, b, c, d, in[0] + K1, 3); -+ ROUND(F, d, a, b, c, in[1] + K1, 7); -+ ROUND(F, c, d, a, b, in[2] + K1, 11); -+ ROUND(F, b, c, d, a, in[3] + K1, 19); -+ ROUND(F, a, b, c, d, in[4] + K1, 3); -+ ROUND(F, d, a, b, c, in[5] + K1, 7); -+ ROUND(F, c, d, a, b, in[6] + K1, 11); -+ ROUND(F, b, c, d, a, in[7] + K1, 19); -+ -+ /* Round 2 */ -+ ROUND(G, a, b, c, d, in[1] + K2, 3); -+ ROUND(G, d, a, b, c, in[3] + K2, 5); -+ ROUND(G, c, d, a, b, in[5] + K2, 9); -+ ROUND(G, b, c, d, a, in[7] + K2, 13); -+ ROUND(G, a, b, c, d, in[0] + K2, 3); -+ ROUND(G, d, a, b, c, in[2] + K2, 5); -+ ROUND(G, c, d, a, b, in[4] + K2, 9); -+ ROUND(G, b, c, d, a, in[6] + K2, 13); -+ -+ /* Round 3 */ -+ ROUND(H, a, b, c, d, in[3] + K3, 3); -+ ROUND(H, d, a, b, c, in[7] + K3, 9); -+ ROUND(H, c, d, a, b, in[2] + K3, 11); -+ ROUND(H, b, c, d, a, in[6] + K3, 15); -+ ROUND(H, a, b, c, d, in[1] + K3, 3); -+ ROUND(H, d, a, b, c, in[5] + K3, 9); -+ ROUND(H, c, d, a, b, in[0] + K3, 11); -+ ROUND(H, b, c, d, a, in[4] + K3, 15); -+ -+ buf[0] += a; -+ buf[1] += b; -+ buf[2] += c; -+ buf[3] += d; -+} -+ -+#undef ROUND -+#undef F -+#undef G -+#undef H -+#undef K1 -+#undef K2 -+#undef K3 -+ -+/* The old legacy hash */ -+static __u32 dx_hack_hash (const char *name, int len) -+{ -+ __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9; -+ while (len--) { -+ __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373)); -+ -+ if (hash & 0x80000000) hash -= 0x7fffffff; -+ hash1 = hash0; -+ hash0 = hash; -+ } -+ return (hash0 << 1); -+} -+ -+static void str2hashbuf(const char *msg, int len, __u32 *buf, int num) -+{ -+ __u32 pad, val; -+ int i; -+ -+ pad = (__u32)len | ((__u32)len << 8); -+ pad |= pad << 16; -+ -+ val = pad; -+ if (len > num*4) -+ len = num * 4; -+ for (i=0; i < len; i++) { -+ if ((i % 4) == 0) -+ val = pad; -+ val = msg[i] + (val << 8); -+ if ((i % 4) == 3) { -+ *buf++ = val; -+ val = pad; -+ num--; -+ } -+ } -+ if (--num >= 0) -+ *buf++ = val; -+ while (--num >= 0) -+ *buf++ = pad; -+} -+ -+/* -+ * Returns the hash of a filename. If len is 0 and name is NULL, then -+ * this function can be used to test whether or not a hash version is -+ * supported. -+ * -+ * The seed is an 4 longword (32 bits) "secret" which can be used to -+ * uniquify a hash. If the seed is all zero's, then some default seed -+ * may be used. -+ * -+ * A particular hash version specifies whether or not the seed is -+ * represented, and whether or not the returned hash is 32 bits or 64 -+ * bits. 32 bit hashes will return 0 for the minor hash. -+ */ -+int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) -+{ -+ __u32 hash; -+ __u32 minor_hash = 0; -+ const char *p; -+ int i; -+ __u32 in[8], buf[4]; -+ -+ /* Initialize the default seed for the hash checksum functions */ -+ buf[0] = 0x67452301; -+ buf[1] = 0xefcdab89; -+ buf[2] = 0x98badcfe; -+ buf[3] = 0x10325476; -+ -+ /* Check to see if the seed is all zero's */ -+ if (hinfo->seed) { -+ for (i=0; i < 4; i++) { -+ if (hinfo->seed[i]) -+ break; -+ } -+ if (i < 4) -+ memcpy(buf, hinfo->seed, sizeof(buf)); -+ } -+ -+ switch (hinfo->hash_version) { -+ case DX_HASH_LEGACY: -+ hash = dx_hack_hash(name, len); -+ break; -+ case DX_HASH_HALF_MD4: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 8); -+ halfMD4Transform(buf, in); -+ len -= 32; -+ p += 32; -+ } -+ minor_hash = buf[2]; -+ hash = buf[1]; -+ break; -+ case DX_HASH_TEA: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 4); -+ TEA_transform(buf, in); -+ len -= 16; -+ p += 16; -+ } -+ hash = buf[0]; -+ minor_hash = buf[1]; -+ break; -+ default: -+ hinfo->hash = 0; -+ return -1; -+ } -+ hinfo->hash = hash & ~1; -+ hinfo->minor_hash = minor_hash; -+ return 0; -+} ---- linux-chaos-2.4.20-6/fs/ext3/namei.c~ext-2.4-patch-1-chaos 2003-03-12 12:51:02.000000000 -0700 -+++ linux-chaos-2.4.20-6-braam/fs/ext3/namei.c 2003-04-09 16:26:04.000000000 -0600 -@@ -16,6 +16,12 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 -+ * Hash Tree Directory indexing (c) -+ * Daniel Phillips, 2001 -+ * Hash Tree Directory indexing porting -+ * Christopher Li, 2002 -+ * Hash Tree Directory indexing cleanup -+ * Theodore Ts'o, 2002 - */ - - #include <linux/fs.h> -@@ -38,6 +44,630 @@ - #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) - #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) - -+static struct buffer_head *ext3_append(handle_t *handle, -+ struct inode *inode, -+ u32 *block, int *err) -+{ -+ struct buffer_head *bh; -+ -+ *block = inode->i_size >> inode->i_sb->s_blocksize_bits; -+ -+ if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -+ inode->i_size += inode->i_sb->s_blocksize; -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_journal_get_write_access(handle,bh); -+ } -+ return bh; -+} -+ -+#ifndef assert -+#define assert(test) J_ASSERT(test) -+#endif -+ -+#ifndef swap -+#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0) -+#endif -+ -+typedef struct { u32 v; } le_u32; -+typedef struct { u16 v; } le_u16; -+ -+#ifdef DX_DEBUG -+#define dxtrace(command) command -+#else -+#define dxtrace(command) -+#endif -+ -+struct fake_dirent -+{ -+ /*le*/u32 inode; -+ /*le*/u16 rec_len; -+ u8 name_len; -+ u8 file_type; -+}; -+ -+struct dx_countlimit -+{ -+ le_u16 limit; -+ le_u16 count; -+}; -+ -+struct dx_entry -+{ -+ le_u32 hash; -+ le_u32 block; -+}; -+ -+/* -+ * dx_root_info is laid out so that if it should somehow get overlaid by a -+ * dirent the two low bits of the hash version will be zero. Therefore, the -+ * hash version mod 4 should never be 0. Sincerely, the paranoia department. -+ */ -+ -+struct dx_root -+{ -+ struct fake_dirent dot; -+ char dot_name[4]; -+ struct fake_dirent dotdot; -+ char dotdot_name[4]; -+ struct dx_root_info -+ { -+ le_u32 reserved_zero; -+ u8 hash_version; -+ u8 info_length; /* 8 */ -+ u8 indirect_levels; -+ u8 unused_flags; -+ } -+ info; -+ struct dx_entry entries[0]; -+}; -+ -+struct dx_node -+{ -+ struct fake_dirent fake; -+ struct dx_entry entries[0]; -+}; -+ -+ -+struct dx_frame -+{ -+ struct buffer_head *bh; -+ struct dx_entry *entries; -+ struct dx_entry *at; -+}; -+ -+struct dx_map_entry -+{ -+ u32 hash; -+ u32 offs; -+}; -+ -+#ifdef CONFIG_EXT3_INDEX -+static inline unsigned dx_get_block (struct dx_entry *entry); -+static void dx_set_block (struct dx_entry *entry, unsigned value); -+static inline unsigned dx_get_hash (struct dx_entry *entry); -+static void dx_set_hash (struct dx_entry *entry, unsigned value); -+static unsigned dx_get_count (struct dx_entry *entries); -+static unsigned dx_get_limit (struct dx_entry *entries); -+static void dx_set_count (struct dx_entry *entries, unsigned value); -+static void dx_set_limit (struct dx_entry *entries, unsigned value); -+static unsigned dx_root_limit (struct inode *dir, unsigned infosize); -+static unsigned dx_node_limit (struct inode *dir); -+static struct dx_frame *dx_probe(struct dentry *dentry, -+ struct inode *dir, -+ struct dx_hash_info *hinfo, -+ struct dx_frame *frame, -+ int *err); -+static void dx_release (struct dx_frame *frames); -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry map[]); -+static void dx_sort_map(struct dx_map_entry *map, unsigned count); -+static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, -+ struct dx_map_entry *offsets, int count); -+static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); -+static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash); -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err); -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode); -+ -+/* -+ * Future: use high four bits of block for coalesce-on-delete flags -+ * Mask them off for now. -+ */ -+ -+static inline unsigned dx_get_block (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->block.v) & 0x00ffffff; -+} -+ -+static inline void dx_set_block (struct dx_entry *entry, unsigned value) -+{ -+ entry->block.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_hash (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->hash.v); -+} -+ -+static inline void dx_set_hash (struct dx_entry *entry, unsigned value) -+{ -+ entry->hash.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_count (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->count.v); -+} -+ -+static inline unsigned dx_get_limit (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->limit.v); -+} -+ -+static inline void dx_set_count (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->count.v = cpu_to_le16(value); -+} -+ -+static inline void dx_set_limit (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->limit.v = cpu_to_le16(value); -+} -+ -+static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - -+ EXT3_DIR_REC_LEN(2) - infosize; -+ return 0? 20: entry_space / sizeof(struct dx_entry); -+} -+ -+static inline unsigned dx_node_limit (struct inode *dir) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); -+ return 0? 22: entry_space / sizeof(struct dx_entry); -+} -+ -+/* -+ * Debug -+ */ -+#ifdef DX_DEBUG -+struct stats -+{ -+ unsigned names; -+ unsigned space; -+ unsigned bcount; -+}; -+ -+static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, -+ int size, int show_names) -+{ -+ unsigned names = 0, space = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ printk("names: "); -+ while ((char *) de < base + size) -+ { -+ if (de->inode) -+ { -+ if (show_names) -+ { -+ int len = de->name_len; -+ char *name = de->name; -+ while (len--) printk("%c", *name++); -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ printk(":%x.%u ", h.hash, -+ ((char *) de - base)); -+ } -+ space += EXT3_DIR_REC_LEN(de->name_len); -+ names++; -+ } -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ printk("(%i)\n", names); -+ return (struct stats) { names, space, 1 }; -+} -+ -+struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, -+ struct dx_entry *entries, int levels) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count = dx_get_count (entries), names = 0, space = 0, i; -+ unsigned bcount = 0; -+ struct buffer_head *bh; -+ int err; -+ printk("%i indexed blocks...\n", count); -+ for (i = 0; i < count; i++, entries++) -+ { -+ u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; -+ u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; -+ struct stats stats; -+ printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); -+ if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; -+ stats = levels? -+ dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): -+ dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); -+ names += stats.names; -+ space += stats.space; -+ bcount += stats.bcount; -+ brelse (bh); -+ } -+ if (bcount) -+ printk("%snames %u, fullness %u (%u%%)\n", levels?"":" ", -+ names, space/bcount,(space/bcount)*100/blocksize); -+ return (struct stats) { names, space, bcount}; -+} -+#endif /* DX_DEBUG */ -+ -+/* -+ * Probe for a directory leaf block to search. -+ * -+ * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -+ * error in the directory index, and the caller should fall back to -+ * searching the directory normally. The callers of dx_probe **MUST** -+ * check for this error code, and make sure it never gets reflected -+ * back to userspace. -+ */ -+static struct dx_frame * -+dx_probe(struct dentry *dentry, struct inode *dir, -+ struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) -+{ -+ unsigned count, indirect; -+ struct dx_entry *at, *entries, *p, *q, *m; -+ struct dx_root *root; -+ struct buffer_head *bh; -+ struct dx_frame *frame = frame_in; -+ u32 hash; -+ -+ frame->bh = NULL; -+ if (dentry) -+ dir = dentry->d_parent->d_inode; -+ if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) -+ goto fail; -+ root = (struct dx_root *) bh->b_data; -+ if (root->info.hash_version != DX_HASH_TEA && -+ root->info.hash_version != DX_HASH_HALF_MD4 && -+ root->info.hash_version != DX_HASH_LEGACY) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unrecognised inode hash code %d", -+ root->info.hash_version); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ hinfo->hash_version = root->info.hash_version; -+ hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ if (dentry) -+ ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ hash = hinfo->hash; -+ -+ if (root->info.unused_flags & 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash flags: %#06x", -+ root->info.unused_flags); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ if ((indirect = root->info.indirect_levels) > 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash depth: %#06x", -+ root->info.indirect_levels); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ while (1) -+ { -+ count = dx_get_count(entries); -+ assert (count && count <= dx_get_limit(entries)); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ dxtrace(printk(".")); -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ -+ if (0) // linear search cross check -+ { -+ unsigned n = count - 1; -+ at = entries; -+ while (n--) -+ { -+ dxtrace(printk(",")); -+ if (dx_get_hash(++at) > hash) -+ { -+ at--; -+ break; -+ } -+ } -+ assert (at == p - 1); -+ } -+ -+ at = p - 1; -+ dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ frame->bh = bh; -+ frame->entries = entries; -+ frame->at = at; -+ if (!indirect--) return frame; -+ if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ goto fail2; -+ at = entries = ((struct dx_node *) bh->b_data)->entries; -+ assert (dx_get_limit(entries) == dx_node_limit (dir)); -+ frame++; -+ } -+fail2: -+ while (frame >= frame_in) { -+ brelse(frame->bh); -+ frame--; -+ } -+fail: -+ return NULL; -+} -+ -+static void dx_release (struct dx_frame *frames) -+{ -+ if (frames[0].bh == NULL) -+ return; -+ -+ if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ brelse(frames[1].bh); -+ brelse(frames[0].bh); -+} -+ -+/* -+ * This function increments the frame pointer to search the next leaf -+ * block, and reads in the necessary intervening nodes if the search -+ * should be necessary. Whether or not the search is necessary is -+ * controlled by the hash parameter. If the hash value is even, then -+ * the search is only continued if the next block starts with that -+ * hash value. This is used if we are searching for a specific file. -+ * -+ * If the hash value is HASH_NB_ALWAYS, then always go to the next block. -+ * -+ * This function returns 1 if the caller should continue to search, -+ * or 0 if it should not. If there is an error reading one of the -+ * index blocks, it will return -1. -+ * -+ * If start_hash is non-null, it will be filled in with the starting -+ * hash of the next page. -+ */ -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash) -+{ -+ struct dx_frame *p; -+ struct buffer_head *bh; -+ int num_frames = 0; -+ __u32 bhash; -+ -+ *err = ENOENT; -+ p = frame; -+ /* -+ * Find the next leaf page by incrementing the frame pointer. -+ * If we run out of entries in the interior node, loop around and -+ * increment pointer in the parent node. When we break out of -+ * this loop, num_frames indicates the number of interior -+ * nodes need to be read. -+ */ -+ while (1) { -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ break; -+ if (p == frames) -+ return 0; -+ num_frames++; -+ p--; -+ } -+ -+ /* -+ * If the hash is 1, then continue only if the next page has a -+ * continuation hash of any value. This is used for readdir -+ * handling. Otherwise, check to see if the hash matches the -+ * desired contiuation hash. If it doesn't, return since -+ * there's no point to read in the successive index pages. -+ */ -+ bhash = dx_get_hash(p->at); -+ if (start_hash) -+ *start_hash = bhash; -+ if ((hash & 1) == 0) { -+ if ((bhash & ~1) != hash) -+ return 0; -+ } -+ /* -+ * If the hash is HASH_NB_ALWAYS, we always go to the next -+ * block so no check is necessary -+ */ -+ while (num_frames--) { -+ if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -+ 0, err))) -+ return -1; /* Failure */ -+ p++; -+ brelse (p->bh); -+ p->bh = bh; -+ p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ } -+ return 1; -+} -+ -+ -+/* -+ * p is at least 6 bytes before the end of page -+ */ -+static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) -+{ -+ return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); -+} -+ -+/* -+ * This function fills a red-black tree with information from a -+ * directory. We start scanning the directory in hash order, starting -+ * at start_hash and start_minor_hash. -+ * -+ * This function returns the number of entries inserted into the tree, -+ * or a negative error code. -+ */ -+int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash) -+{ -+ struct dx_hash_info hinfo; -+ struct buffer_head *bh; -+ struct ext3_dir_entry_2 *de, *top; -+ static struct dx_frame frames[2], *frame; -+ struct inode *dir; -+ int block, err; -+ int count = 0; -+ int ret; -+ __u32 hashval; -+ -+ dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, -+ start_minor_hash)); -+ dir = dir_file->f_dentry->d_inode; -+ hinfo.hash = start_hash; -+ hinfo.minor_hash = 0; -+ frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ -+ while (1) { -+ block = dx_get_block(frame->at); -+ dxtrace(printk("Reading block %d\n", block)); -+ if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) -+ goto errout; -+ -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) { -+ ext3fs_dirhash(de->name, de->name_len, &hinfo); -+ if ((hinfo.hash < start_hash) || -+ ((hinfo.hash == start_hash) && -+ (hinfo.minor_hash < start_minor_hash))) -+ continue; -+ ext3_htree_store_dirent(dir_file, hinfo.hash, -+ hinfo.minor_hash, de); -+ count++; -+ } -+ brelse (bh); -+ hashval = ~1; -+ ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, -+ frame, frames, &err, &hashval); -+ if (next_hash) -+ *next_hash = hashval; -+ if (ret == -1) -+ goto errout; -+ /* -+ * Stop if: (a) there are no more entries, or -+ * (b) we have inserted at least one entry and the -+ * next hash value is not a continuation -+ */ -+ if ((ret == 0) || -+ (count && ((hashval & 1) == 0))) -+ break; -+ } -+ dx_release(frames); -+ dxtrace(printk("Fill tree: returned %d entries\n", count)); -+ return count; -+errout: -+ dx_release(frames); -+ return (err); -+} -+ -+ -+/* -+ * Directory block splitting, compacting -+ */ -+ -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) -+{ -+ int count = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ while ((char *) de < base + size) -+ { -+ if (de->name_len && de->inode) { -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ map_tail--; -+ map_tail->hash = h.hash; -+ map_tail->offs = (u32) ((char *) de - base); -+ count++; -+ } -+ /* XXX: do we need to check rec_len == 0 case? -Chris */ -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ return count; -+} -+ -+static void dx_sort_map (struct dx_map_entry *map, unsigned count) -+{ -+ struct dx_map_entry *p, *q, *top = map + count - 1; -+ int more; -+ /* Combsort until bubble sort doesn't suck */ -+ while (count > 2) -+ { -+ count = count*10/13; -+ if (count - 9 < 2) /* 9, 10 -> 11 */ -+ count = 11; -+ for (p = top, q = p - count; q >= map; p--, q--) -+ if (p->hash < q->hash) -+ swap(*p, *q); -+ } -+ /* Garden variety bubble sort */ -+ do { -+ more = 0; -+ q = top; -+ while (q-- > map) -+ { -+ if (q[1].hash >= q[0].hash) -+ continue; -+ swap(*(q+1), *q); -+ more = 1; -+ } -+ } while(more); -+} -+ -+static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+{ -+ struct dx_entry *entries = frame->entries; -+ struct dx_entry *old = frame->at, *new = old + 1; -+ int count = dx_get_count(entries); -+ -+ assert(count < dx_get_limit(entries)); -+ assert(old < entries + count); -+ memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); -+ dx_set_hash(new, hash); -+ dx_set_block(new, block); -+ dx_set_count(entries, count + 1); -+} -+#endif -+ -+ -+static void ext3_update_dx_flag(struct inode *inode) -+{ -+ if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, -+ EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; -+} -+ - /* - * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. - * -@@ -94,6 +724,7 @@ static int inline search_dirblock(struct - return 0; - } - -+ - /* - * ext3_find_entry() - * -@@ -105,6 +736,8 @@ static int inline search_dirblock(struct - * The returned buffer_head has ->b_count elevated. The caller is expected - * to brelse() it when appropriate. - */ -+ -+ - static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) - { -@@ -119,12 +752,32 @@ static struct buffer_head * ext3_find_en - int num = 0; - int nblocks, i, err; - struct inode *dir = dentry->d_parent->d_inode; -+ int namelen; -+ const u8 *name; -+ unsigned blocksize; - - *res_dir = NULL; - sb = dir->i_sb; -- -+ blocksize = sb->s_blocksize; -+ namelen = dentry->d_name.len; -+ name = dentry->d_name.name; -+ if (namelen > EXT3_NAME_LEN) -+ return NULL; -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ /* -+ * On success, or if the error was file not found, -+ * return. Otherwise, fall back to doing a search the -+ * old fashioned way. -+ */ -+ if (bh || (err != ERR_BAD_DX_DIR)) -+ return bh; -+ dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ } -+#endif - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); -- start = dir->u.ext3_i.i_dir_start_lookup; -+ start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) - start = 0; - block = start; -@@ -166,7 +819,7 @@ restart: - i = search_dirblock(bh, dir, dentry, - block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); - if (i == 1) { -- dir->u.ext3_i.i_dir_start_lookup = block; -+ EXT3_I(dir)->i_dir_start_lookup = block; - ret = bh; - goto cleanup_and_exit; - } else { -@@ -197,6 +850,66 @@ cleanup_and_exit: - return ret; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err) -+{ -+ struct super_block * sb; -+ struct dx_hash_info hinfo; -+ u32 hash; -+ struct dx_frame frames[2], *frame; -+ struct ext3_dir_entry_2 *de, *top; -+ struct buffer_head *bh; -+ unsigned long block; -+ int retval; -+ int namelen = dentry->d_name.len; -+ const u8 *name = dentry->d_name.name; -+ struct inode *dir = dentry->d_parent->d_inode; -+ -+ sb = dir->i_sb; -+ if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+ return NULL; -+ hash = hinfo.hash; -+ do { -+ block = dx_get_block(frame->at); -+ if (!(bh = ext3_bread (NULL,dir, block, 0, err))) -+ goto errout; -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) -+ if (ext3_match (namelen, name, de)) { -+ if (!ext3_check_dir_entry("ext3_find_entry", -+ dir, de, bh, -+ (block<<EXT3_BLOCK_SIZE_BITS(sb)) -+ +((char *)de - bh->b_data))) { -+ brelse (bh); -+ goto errout; -+ } -+ *res_dir = de; -+ dx_release (frames); -+ return bh; -+ } -+ brelse (bh); -+ /* Check to see if we should continue to search */ -+ retval = ext3_htree_next_block(dir, hash, frame, -+ frames, err, 0); -+ if (retval == -1) { -+ ext3_warning(sb, __FUNCTION__, -+ "error reading index page in directory #%lu", -+ dir->i_ino); -+ goto errout; -+ } -+ } while (retval == 1); -+ -+ *err = -ENOENT; -+errout: -+ dxtrace(printk("%s not found\n", name)); -+ dx_release (frames); -+ return NULL; -+} -+#endif -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -213,8 +926,9 @@ static struct dentry *ext3_lookup(struct - brelse (bh); - inode = iget(dir->i_sb, ino); - -- if (!inode) -+ if (!inode) { - return ERR_PTR(-EACCES); -+ } - } - d_add(dentry, inode); - return NULL; -@@ -238,6 +952,301 @@ static inline void ext3_set_de_type(stru - de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct ext3_dir_entry_2 * -+dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) -+{ -+ unsigned rec_len = 0; -+ -+ while (count--) { -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); -+ de->inode = 0; -+ map++; -+ to += rec_len; -+ } -+ return (struct ext3_dir_entry_2 *) (to - rec_len); -+} -+ -+static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) -+{ -+ struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ unsigned rec_len = 0; -+ -+ prev = to = de; -+ while ((char*)de < base + size) { -+ next = (struct ext3_dir_entry_2 *) ((char *) de + -+ le16_to_cpu(de->rec_len)); -+ if (de->inode && de->name_len) { -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ if (de > to) -+ memmove(to, de, rec_len); -+ to->rec_len = cpu_to_le16(rec_len); -+ prev = to; -+ to = (struct ext3_dir_entry_2 *)((char *)to + rec_len); -+ } -+ de = next; -+ } -+ return prev; -+} -+ -+static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, -+ struct buffer_head **bh,struct dx_frame *frame, -+ struct dx_hash_info *hinfo, int *error) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count, continued; -+ struct buffer_head *bh2; -+ u32 newblock; -+ u32 hash2; -+ struct dx_map_entry *map; -+ char *data1 = (*bh)->b_data, *data2; -+ unsigned split; -+ struct ext3_dir_entry_2 *de = NULL, *de2; -+ int err; -+ -+ bh2 = ext3_append (handle, dir, &newblock, error); -+ if (!(bh2)) { -+ brelse(*bh); -+ *bh = NULL; -+ goto errout; -+ } -+ -+ BUFFER_TRACE(*bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, *bh); -+ if (err) { -+ journal_error: -+ brelse(*bh); -+ brelse(bh2); -+ *bh = NULL; -+ ext3_std_error(dir->i_sb, err); -+ goto errout; -+ } -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ -+ data2 = bh2->b_data; -+ -+ /* create map in the end of data2 block */ -+ map = (struct dx_map_entry *) (data2 + blocksize); -+ count = dx_make_map ((struct ext3_dir_entry_2 *) data1, -+ blocksize, hinfo, map); -+ map -= count; -+ split = count/2; // need to adjust to actual middle -+ dx_sort_map (map, count); -+ hash2 = map[split].hash; -+ continued = hash2 == map[split - 1].hash; -+ dxtrace(printk("Split block %i at %x, %i/%i\n", -+ dx_get_block(frame->at), hash2, split, count-split)); -+ -+ /* Fancy dance to stay within two buffers */ -+ de2 = dx_move_dirents(data1, data2, map + split, count - split); -+ de = dx_pack_dirents(data1,blocksize); -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ -+ /* Which block gets the new entry? */ -+ if (hinfo->hash >= hash2) -+ { -+ swap(*bh, bh2); -+ de = de2; -+ } -+ dx_insert_block (frame, hash2 + continued, newblock); -+ err = ext3_journal_dirty_metadata (handle, bh2); -+ if (err) -+ goto journal_error; -+ err = ext3_journal_dirty_metadata (handle, frame->bh); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ dxtrace(dx_show_index ("frame", frame->entries)); -+errout: -+ return de; -+} -+#endif -+ -+ -+/* -+ * Add a new entry into a directory (leaf) block. If de is non-NULL, -+ * it points to a directory entry which is guaranteed to be large -+ * enough for new directory entry. If de is NULL, then -+ * add_dirent_to_buf will attempt search the directory block for -+ * space. It will return -ENOSPC if no space is available, and -EIO -+ * and -EEXIST if directory entry already exists. -+ * -+ * NOTE! bh is NOT released in the case where ENOSPC is returned. In -+ * all other cases bh is released. -+ */ -+static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct ext3_dir_entry_2 *de, -+ struct buffer_head * bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ unsigned long offset = 0; -+ unsigned short reclen; -+ int nlen, rlen, err; -+ char *top; -+ -+ reclen = EXT3_DIR_REC_LEN(namelen); -+ if (!de) { -+ de = (struct ext3_dir_entry_2 *)bh->b_data; -+ top = bh->b_data + dir->i_sb->s_blocksize - reclen; -+ while ((char *) de <= top) { -+ if (!ext3_check_dir_entry("ext3_add_entry", dir, de, -+ bh, offset)) { -+ brelse (bh); -+ return -EIO; -+ } -+ if (ext3_match (namelen, name, de)) { -+ brelse (bh); -+ return -EEXIST; -+ } -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if ((de->inode? rlen - nlen: rlen) >= reclen) -+ break; -+ de = (struct ext3_dir_entry_2 *)((char *)de + rlen); -+ offset += rlen; -+ } -+ if ((char *) de > top) -+ return -ENOSPC; -+ } -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) { -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return err; -+ } -+ -+ /* By now the buffer is marked for journaling */ -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if (de->inode) { -+ struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ de1->rec_len = cpu_to_le16(rlen - nlen); -+ de->rec_len = cpu_to_le16(nlen); -+ de = de1; -+ } -+ de->file_type = EXT3_FT_UNKNOWN; -+ if (inode) { -+ de->inode = cpu_to_le32(inode->i_ino); -+ ext3_set_de_type(dir->i_sb, de, inode->i_mode); -+ } else -+ de->inode = 0; -+ de->name_len = namelen; -+ memcpy (de->name, name, namelen); -+ /* -+ * XXX shouldn't update any times until successful -+ * completion of syscall, but too many callers depend -+ * on this. -+ * -+ * XXX similarly, too many callers depend on -+ * ext3_new_inode() setting the times, but error -+ * recovery deletes the inode, so the worst that can -+ * happen is that the times are slightly out of date -+ * and/or different from the directory change time. -+ */ -+ dir->i_mtime = dir->i_ctime = CURRENT_TIME; -+ ext3_update_dx_flag(dir); -+ dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return 0; -+} -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * This converts a one block unindexed directory to a 3 block indexed -+ * directory, and adds the dentry to the indexed directory. -+ */ -+static int make_indexed_dir(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct buffer_head *bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ struct buffer_head *bh2; -+ struct dx_root *root; -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries; -+ struct ext3_dir_entry_2 *de, *de2; -+ char *data1, *top; -+ unsigned len; -+ int retval; -+ unsigned blocksize; -+ struct dx_hash_info hinfo; -+ u32 block; -+ -+ blocksize = dir->i_sb->s_blocksize; -+ dxtrace(printk("Creating index\n")); -+ retval = ext3_journal_get_write_access(handle, bh); -+ if (retval) { -+ ext3_std_error(dir->i_sb, retval); -+ brelse(bh); -+ return retval; -+ } -+ root = (struct dx_root *) bh->b_data; -+ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ bh2 = ext3_append (handle, dir, &block, &retval); -+ if (!(bh2)) { -+ brelse(bh); -+ return retval; -+ } -+ data1 = bh2->b_data; -+ -+ /* The 0th block becomes the root, move the dirents out */ -+ de = (struct ext3_dir_entry_2 *)&root->dotdot; -+ de = (struct ext3_dir_entry_2 *)((char *)de + le16_to_cpu(de->rec_len)); -+ len = ((char *) root) + blocksize - (char *) de; -+ memcpy (data1, de, len); -+ de = (struct ext3_dir_entry_2 *) data1; -+ top = data1 + len; -+ while (((char *) de2=(char*)de+le16_to_cpu(de->rec_len)) < top) -+ de = de2; -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ /* Initialize the root; the dot dirents already exist */ -+ de = (struct ext3_dir_entry_2 *) (&root->dotdot); -+ de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); -+ memset (&root->info, 0, sizeof(root->info)); -+ root->info.info_length = sizeof(root->info); -+ root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ entries = root->entries; -+ dx_set_block (entries, 1); -+ dx_set_count (entries, 1); -+ dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info))); -+ -+ /* Initialize as for dx_probe */ -+ hinfo.hash_version = root->info.hash_version; -+ hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ ext3fs_dirhash(name, namelen, &hinfo); -+ frame = frames; -+ frame->entries = entries; -+ frame->at = entries; -+ frame->bh = bh; -+ bh = bh2; -+ de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ dx_release (frames); -+ if (!(de)) -+ return retval; -+ -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} -+#endif -+ - /* - * ext3_add_entry() - * -@@ -248,127 +1256,198 @@ static inline void ext3_set_de_type(stru - * may not sleep between calling this and putting something into - * the entry, as someone else might have used it while you slept. - */ -- --/* -- * AKPM: the journalling code here looks wrong on the error paths -- */ - static int ext3_add_entry (handle_t *handle, struct dentry *dentry, - struct inode *inode) - { - struct inode *dir = dentry->d_parent->d_inode; -- const char *name = dentry->d_name.name; -- int namelen = dentry->d_name.len; - unsigned long offset; -- unsigned short rec_len; - struct buffer_head * bh; -- struct ext3_dir_entry_2 * de, * de1; -+ struct ext3_dir_entry_2 *de; - struct super_block * sb; - int retval; -+#ifdef CONFIG_EXT3_INDEX -+ int dx_fallback=0; -+#endif -+ unsigned blocksize; -+ unsigned nlen, rlen; -+ u32 block, blocks; - - sb = dir->i_sb; -- -- if (!namelen) -+ blocksize = sb->s_blocksize; -+ if (!dentry->d_name.len) - return -EINVAL; -- bh = ext3_bread (handle, dir, 0, 0, &retval); -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ retval = ext3_dx_add_entry(handle, dentry, inode); -+ if (!retval || (retval != ERR_BAD_DX_DIR)) -+ return retval; -+ EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; -+ dx_fallback++; -+ ext3_mark_inode_dirty(handle, dir); -+ } -+#endif -+ blocks = dir->i_size >> sb->s_blocksize_bits; -+ for (block = 0, offset = 0; block < blocks; block++) { -+ bh = ext3_bread(handle, dir, block, 0, &retval); -+ if(!bh) -+ return retval; -+ retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (retval != -ENOSPC) -+ return retval; -+ -+#ifdef CONFIG_EXT3_INDEX -+ if (blocks == 1 && !dx_fallback && -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ return make_indexed_dir(handle, dentry, inode, bh); -+#endif -+ brelse(bh); -+ } -+ bh = ext3_append(handle, dir, &block, &retval); - if (!bh) - return retval; -- rec_len = EXT3_DIR_REC_LEN(namelen); -- offset = 0; - de = (struct ext3_dir_entry_2 *) bh->b_data; -- while (1) { -- if ((char *)de >= sb->s_blocksize + bh->b_data) { -- brelse (bh); -- bh = NULL; -- bh = ext3_bread (handle, dir, -- offset >> EXT3_BLOCK_SIZE_BITS(sb), 1, &retval); -- if (!bh) -- return retval; -- if (dir->i_size <= offset) { -- if (dir->i_size == 0) { -- brelse(bh); -- return -ENOENT; -- } -+ de->inode = 0; -+ de->rec_len = cpu_to_le16(rlen = blocksize); -+ nlen = 0; -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} - -- ext3_debug ("creating next block\n"); -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * Returns 0 for success, or a negative error value -+ */ -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries, *at; -+ struct dx_hash_info hinfo; -+ struct buffer_head * bh; -+ struct inode *dir = dentry->d_parent->d_inode; -+ struct super_block * sb = dir->i_sb; -+ struct ext3_dir_entry_2 *de; -+ int err; - -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- de->inode = 0; -- de->rec_len = le16_to_cpu(sb->s_blocksize); -- dir->u.ext3_i.i_disksize = -- dir->i_size = offset + sb->s_blocksize; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); -- } else { -+ frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ entries = frame->entries; -+ at = frame->at; - -- ext3_debug ("skipping to next block\n"); -+ if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ goto cleanup; - -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- } -- } -- if (!ext3_check_dir_entry ("ext3_add_entry", dir, de, bh, -- offset)) { -- brelse (bh); -- return -ENOENT; -- } -- if (ext3_match (namelen, name, de)) { -- brelse (bh); -- return -EEXIST; -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto journal_error; -+ -+ err = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (err != -ENOSPC) { -+ bh = 0; -+ goto cleanup; -+ } -+ -+ /* Block full, should compress but for now just split */ -+ dxtrace(printk("using %u of %u node entries\n", -+ dx_get_count(entries), dx_get_limit(entries))); -+ /* Need to split index? */ -+ if (dx_get_count(entries) == dx_get_limit(entries)) { -+ u32 newblock; -+ unsigned icount = dx_get_count(entries); -+ int levels = frame - frames; -+ struct dx_entry *entries2; -+ struct dx_node *node2; -+ struct buffer_head *bh2; -+ -+ if (levels && (dx_get_count(frames->entries) == -+ dx_get_limit(frames->entries))) { -+ ext3_warning(sb, __FUNCTION__, -+ "Directory index full!\n"); -+ err = -ENOSPC; -+ goto cleanup; - } -- if ((le32_to_cpu(de->inode) == 0 && -- le16_to_cpu(de->rec_len) >= rec_len) || -- (le16_to_cpu(de->rec_len) >= -- EXT3_DIR_REC_LEN(de->name_len) + rec_len)) { -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- /* By now the buffer is marked for journaling */ -- offset += le16_to_cpu(de->rec_len); -- if (le32_to_cpu(de->inode)) { -- de1 = (struct ext3_dir_entry_2 *) ((char *) de + -- EXT3_DIR_REC_LEN(de->name_len)); -- de1->rec_len = -- cpu_to_le16(le16_to_cpu(de->rec_len) - -- EXT3_DIR_REC_LEN(de->name_len)); -- de->rec_len = cpu_to_le16( -- EXT3_DIR_REC_LEN(de->name_len)); -- de = de1; -+ bh2 = ext3_append (handle, dir, &newblock, &err); -+ if (!(bh2)) -+ goto cleanup; -+ node2 = (struct dx_node *)(bh2->b_data); -+ entries2 = node2->entries; -+ node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -+ node2->fake.inode = 0; -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ if (levels) { -+ unsigned icount1 = icount/2, icount2 = icount - icount1; -+ unsigned hash2 = dx_get_hash(entries + icount1); -+ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ err = ext3_journal_get_write_access(handle, -+ frames[0].bh); -+ if (err) -+ goto journal_error; -+ -+ memcpy ((char *) entries2, (char *) (entries + icount1), -+ icount2 * sizeof(struct dx_entry)); -+ dx_set_count (entries, icount1); -+ dx_set_count (entries2, icount2); -+ dx_set_limit (entries2, dx_node_limit(dir)); -+ -+ /* Which index block gets the new entry? */ -+ if (at - entries >= icount1) { -+ frame->at = at = at - entries - icount1 + entries2; -+ frame->entries = entries = entries2; -+ swap(frame->bh, bh2); - } -- de->file_type = EXT3_FT_UNKNOWN; -- if (inode) { -- de->inode = cpu_to_le32(inode->i_ino); -- ext3_set_de_type(dir->i_sb, de, inode->i_mode); -- } else -- de->inode = 0; -- de->name_len = namelen; -- memcpy (de->name, name, namelen); -- /* -- * XXX shouldn't update any times until successful -- * completion of syscall, but too many callers depend -- * on this. -- * -- * XXX similarly, too many callers depend on -- * ext3_new_inode() setting the times, but error -- * recovery deletes the inode, so the worst that can -- * happen is that the times are slightly out of date -- * and/or different from the directory change time. -- */ -- dir->i_mtime = dir->i_ctime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- 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); -- return 0; -+ dx_insert_block (frames + 0, hash2, newblock); -+ dxtrace(dx_show_index ("node", frames[1].entries)); -+ dxtrace(dx_show_index ("node", -+ ((struct dx_node *) bh2->b_data)->entries)); -+ err = ext3_journal_dirty_metadata(handle, bh2); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ } else { -+ dxtrace(printk("Creating second level index...\n")); -+ memcpy((char *) entries2, (char *) entries, -+ icount * sizeof(struct dx_entry)); -+ dx_set_limit(entries2, dx_node_limit(dir)); -+ -+ /* Set up root */ -+ dx_set_count(entries, 1); -+ dx_set_block(entries + 0, newblock); -+ ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ -+ /* Add new access path frame */ -+ frame = frames + 1; -+ frame->at = at = at - entries + entries2; -+ frame->entries = entries = entries2; -+ frame->bh = bh2; -+ err = ext3_journal_get_write_access(handle, -+ frame->bh); -+ if (err) -+ goto journal_error; - } -- offset += le16_to_cpu(de->rec_len); -- de = (struct ext3_dir_entry_2 *) -- ((char *) de + le16_to_cpu(de->rec_len)); -+ ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- brelse (bh); -- return -ENOSPC; -+ de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ if (!de) -+ goto cleanup; -+ err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ bh = 0; -+ goto cleanup; -+ -+journal_error: -+ ext3_std_error(dir->i_sb, err); -+cleanup: -+ if (bh) -+ brelse(bh); -+ dx_release(frames); -+ return err; - } -+#endif - - /* - * ext3_delete_entry deletes a directory entry by merging it with the -@@ -455,9 +1534,11 @@ static int ext3_create (struct inode * d - struct inode * inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -481,9 +1562,11 @@ static int ext3_mknod (struct inode * di - struct inode *inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -509,9 +1592,11 @@ static int ext3_mkdir(struct inode * dir - if (dir->i_nlink >= EXT3_LINK_MAX) - return -EMLINK; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -523,7 +1608,7 @@ static int ext3_mkdir(struct inode * dir - - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -- inode->i_size = inode->u.ext3_i.i_disksize = inode->i_sb->s_blocksize; -+ inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; - inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { -@@ -556,21 +1641,19 @@ static int ext3_mkdir(struct inode * dir - inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); -- if (err) -- goto out_no_entry; -+ if (err) { -+ inode->i_nlink = 0; -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - dir->i_nlink++; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - d_instantiate(dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- inode->i_nlink = 0; -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - /* -@@ -657,7 +1740,7 @@ int ext3_orphan_add(handle_t *handle, st - int err = 0, rc; - - lock_super(sb); -- if (!list_empty(&inode->u.ext3_i.i_orphan)) -+ if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - - /* Orphan handling is only valid for files with data blocks -@@ -698,7 +1781,7 @@ int ext3_orphan_add(handle_t *handle, st - * This is safe: on error we're going to ignore the orphan list - * anyway on the next recovery. */ - if (!err) -- list_add(&inode->u.ext3_i.i_orphan, &EXT3_SB(sb)->s_orphan); -+ list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", -@@ -716,25 +1799,26 @@ out_unlock: - int ext3_orphan_del(handle_t *handle, struct inode *inode) - { - struct list_head *prev; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct ext3_sb_info *sbi; - unsigned long ino_next; - struct ext3_iloc iloc; - int err = 0; - - lock_super(inode->i_sb); -- if (list_empty(&inode->u.ext3_i.i_orphan)) { -+ if (list_empty(&ei->i_orphan)) { - unlock_super(inode->i_sb); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); -- prev = inode->u.ext3_i.i_orphan.prev; -+ prev = ei->i_orphan.prev; - sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino); - -- list_del(&inode->u.ext3_i.i_orphan); -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ list_del(&ei->i_orphan); -+ INIT_LIST_HEAD(&ei->i_orphan); - - /* If we're on an error path, we may not have a valid - * transaction handle with which to update the orphan list on -@@ -795,8 +1879,9 @@ static int ext3_rmdir (struct inode * di - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); -@@ -834,7 +1919,7 @@ static int ext3_rmdir (struct inode * di - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; - ext3_mark_inode_dirty(handle, inode); -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - - end_rmdir: -@@ -852,8 +1937,9 @@ static int ext3_unlink(struct inode * di - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -880,7 +1966,7 @@ static int ext3_unlink(struct inode * di - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - inode->i_nlink--; - if (!inode->i_nlink) -@@ -906,9 +1992,11 @@ static int ext3_symlink (struct inode * - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 5); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -918,7 +2006,7 @@ static int ext3_symlink (struct inode * - if (IS_ERR(inode)) - goto out_stop; - -- if (l > sizeof (inode->u.ext3_i.i_data)) { -+ if (l > sizeof (EXT3_I(inode)->i_data)) { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* -@@ -927,24 +2015,23 @@ static int ext3_symlink (struct inode * - * i_size in generic_commit_write(). - */ - err = block_symlink(inode, symname, l); -- if (err) -- goto out_no_entry; -+ if (err) { -+ ext3_dec_count(handle, inode); -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - } else { - inode->i_op = &ext3_fast_symlink_inode_operations; -- memcpy((char*)&inode->u.ext3_i.i_data,symname,l); -+ memcpy((char*)&EXT3_I(inode)->i_data,symname,l); - inode->i_size = l-1; - } -- inode->u.ext3_i.i_disksize = inode->i_size; -+ EXT3_I(inode)->i_disksize = inode->i_size; - err = ext3_add_nondir(handle, dentry, inode); -+ ext3_mark_inode_dirty(handle, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- ext3_dec_count(handle, inode); -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - static int ext3_link (struct dentry * old_dentry, -@@ -957,12 +2044,15 @@ static int ext3_link (struct dentry * ol - if (S_ISDIR(inode->i_mode)) - return -EPERM; - -- if (inode->i_nlink >= EXT3_LINK_MAX) -+ if (inode->i_nlink >= EXT3_LINK_MAX) { - return -EMLINK; -+ } - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -995,9 +2085,11 @@ static int ext3_rename (struct inode * o - - old_bh = new_bh = dir_bh = NULL; - -- handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + 2); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; -@@ -1077,7 +2169,7 @@ static int ext3_rename (struct inode * o - new_inode->i_ctime = CURRENT_TIME; - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; -- old_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(old_dir); - if (dir_bh) { - BUFFER_TRACE(dir_bh, "get_write_access"); - ext3_journal_get_write_access(handle, dir_bh); -@@ -1089,7 +2181,7 @@ static int ext3_rename (struct inode * o - new_inode->i_nlink--; - } else { - new_dir->i_nlink++; -- new_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(new_dir); - ext3_mark_inode_dirty(handle, new_dir); - } - } ---- linux-chaos-2.4.20-6/fs/ext3/super.c~ext-2.4-patch-1-chaos 2003-04-09 16:10:38.000000000 -0600 -+++ linux-chaos-2.4.20-6-braam/fs/ext3/super.c 2003-04-09 16:18:55.000000000 -0600 -@@ -710,6 +710,7 @@ static int ext3_setup_super(struct super - es->s_mtime = cpu_to_le32(CURRENT_TIME); - ext3_update_dynamic_rev(sb); - EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -+ - ext3_commit_super (sb, es, 1); - if (test_opt (sb, DEBUG)) - printk (KERN_INFO -@@ -720,6 +721,7 @@ static int ext3_setup_super(struct super - EXT3_BLOCKS_PER_GROUP(sb), - EXT3_INODES_PER_GROUP(sb), - sbi->s_mount_opt); -+ - printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ", - bdevname(sb->s_dev)); - if (EXT3_SB(sb)->s_journal->j_inode == NULL) { -@@ -893,6 +895,7 @@ static loff_t ext3_max_size(int bits) - return res; - } - -+ - struct super_block * ext3_read_super (struct super_block * sb, void * data, - int silent) - { -@@ -1069,6 +1072,9 @@ struct super_block * ext3_read_super (st - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+ for (i=0; i < 4; i++) -+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); -+ sbi->s_def_hash_version = es->s_def_hash_version; - - if (sbi->s_blocks_per_group > blocksize * 8) { - printk (KERN_ERR -@@ -1770,6 +1776,7 @@ static void __exit exit_ext3_fs(void) - unregister_filesystem(&ext3_fs_type); - } - -+EXPORT_SYMBOL(ext3_force_commit); - EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); ---- linux-chaos-2.4.20-6/include/linux/ext3_fs.h~ext-2.4-patch-1-chaos 2003-03-12 12:51:27.000000000 -0700 -+++ linux-chaos-2.4.20-6-braam/include/linux/ext3_fs.h 2003-04-09 16:18:55.000000000 -0600 -@@ -40,6 +40,11 @@ - #define EXT3FS_VERSION "2.4-0.9.19" - - /* -+ * Always enable hashed directories -+ */ -+#define CONFIG_EXT3_INDEX -+ -+/* - * Debug code - */ - #ifdef EXT3FS_DEBUG -@@ -437,8 +442,11 @@ struct ext3_super_block { - /*E0*/ __u32 s_journal_inum; /* inode number of journal file */ - __u32 s_journal_dev; /* device number of journal file */ - __u32 s_last_orphan; /* start of list of inodes to delete */ -- --/*EC*/ __u32 s_reserved[197]; /* Padding to the end of the block */ -+ __u32 s_hash_seed[4]; /* HTREE hash seed */ -+ __u8 s_def_hash_version; /* Default hash version to use */ -+ __u8 s_reserved_char_pad; -+ __u16 s_reserved_word_pad; -+ __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -575,9 +583,46 @@ struct ext3_dir_entry_2 { - #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) - #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ - ~EXT3_DIR_ROUND) -+/* -+ * Hash Tree Directory indexing -+ * (c) Daniel Phillips, 2001 -+ */ -+ -+#ifdef CONFIG_EXT3_INDEX -+ #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ -+ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ -+ (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) -+#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) -+#else -+ #define is_dx(dir) 0 -+#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) -+#endif -+ -+/* Legal values for the dx_root hash_version field: */ -+ -+#define DX_HASH_LEGACY 0 -+#define DX_HASH_HALF_MD4 1 -+#define DX_HASH_TEA 2 -+ -+/* hash info structure used by the directory hash */ -+struct dx_hash_info -+{ -+ u32 hash; -+ u32 minor_hash; -+ int hash_version; -+ u32 *seed; -+}; - - #ifdef __KERNEL__ - /* -+ * Control parameters used by ext3_htree_next_block -+ */ -+#define HASH_NB_ALWAYS 1 -+ -+ -+/* - * Describe an inode's exact location on disk and in memory - */ - struct ext3_iloc -@@ -587,6 +632,27 @@ struct ext3_iloc - unsigned long block_group; - }; - -+ -+/* -+ * This structure is stuffed into the struct file's private_data field -+ * for directories. It is where we put information so that we can do -+ * readdir operations in hash tree order. -+ */ -+struct dir_private_info { -+ rb_root_t root; -+ rb_node_t *curr_node; -+ struct fname *extra_fname; -+ loff_t last_pos; -+ __u32 curr_hash; -+ __u32 curr_minor_hash; -+ __u32 next_hash; -+}; -+ -+/* -+ * Special error return code only used by dx_probe() and its callers. -+ */ -+#define ERR_BAD_DX_DIR -75000 -+ - /* - * Function prototypes - */ -@@ -614,11 +680,20 @@ extern struct ext3_group_desc * ext3_get - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, -- struct ext3_dir_entry_2 *, struct buffer_head *, -- unsigned long); -+ struct ext3_dir_entry_2 *, -+ struct buffer_head *, unsigned long); -+extern void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent); -+extern void ext3_htree_free_dir_info(struct dir_private_info *p); -+ - /* fsync.c */ - extern int ext3_sync_file (struct file *, struct dentry *, int); - -+/* hash.c */ -+extern int ext3fs_dirhash(const char *name, int len, struct -+ dx_hash_info *hinfo); -+ - /* ialloc.c */ - extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int); - extern void ext3_free_inode (handle_t *, struct inode *); -@@ -650,6 +725,8 @@ extern int ext3_ioctl (struct inode *, s - /* namei.c */ - extern int ext3_orphan_add(handle_t *, struct inode *); - extern int ext3_orphan_del(handle_t *, struct inode *); -+extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash); - - /* super.c */ - extern void ext3_error (struct super_block *, const char *, const char *, ...) ---- linux-chaos-2.4.20-6/include/linux/ext3_fs_sb.h~ext-2.4-patch-1-chaos 2003-03-12 12:51:27.000000000 -0700 -+++ linux-chaos-2.4.20-6-braam/include/linux/ext3_fs_sb.h 2003-04-09 16:18:55.000000000 -0600 -@@ -62,6 +62,8 @@ struct ext3_sb_info { - int s_inode_size; - int s_first_ino; - u32 s_next_generation; -+ u32 s_hash_seed[4]; -+ int s_def_hash_version; - - /* Journaling */ - struct inode * s_journal_inode; ---- linux-chaos-2.4.20-6/include/linux/ext3_jbd.h~ext-2.4-patch-1-chaos 2003-03-12 12:51:27.000000000 -0700 -+++ linux-chaos-2.4.20-6-braam/include/linux/ext3_jbd.h 2003-04-09 16:18:55.000000000 -0600 -@@ -63,6 +63,8 @@ extern int ext3_writepage_trans_blocks(s - - #define EXT3_RESERVE_TRANS_BLOCKS 12U - -+#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, ---- linux-chaos-2.4.20-6/include/linux/rbtree.h~ext-2.4-patch-1-chaos 2002-05-07 15:53:47.000000000 -0600 -+++ linux-chaos-2.4.20-6-braam/include/linux/rbtree.h 2003-04-09 16:18:55.000000000 -0600 -@@ -120,6 +120,8 @@ rb_root_t; - - extern void rb_insert_color(rb_node_t *, rb_root_t *); - extern void rb_erase(rb_node_t *, rb_root_t *); -+extern rb_node_t *rb_get_first(rb_root_t *root); -+extern rb_node_t *rb_get_next(rb_node_t *n); - - static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link) - { ---- linux-chaos-2.4.20-6/lib/rbtree.c~ext-2.4-patch-1-chaos 2002-09-25 11:14:03.000000000 -0600 -+++ linux-chaos-2.4.20-6-braam/lib/rbtree.c 2003-04-09 16:18:55.000000000 -0600 -@@ -17,6 +17,8 @@ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - linux/lib/rbtree.c -+ -+ rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002 - */ - - #include <linux/rbtree.h> -@@ -294,3 +296,43 @@ void rb_erase(rb_node_t * node, rb_root_ - __rb_erase_color(child, parent, root); - } - EXPORT_SYMBOL(rb_erase); -+ -+/* -+ * This function returns the first node (in sort order) of the tree. -+ */ -+rb_node_t *rb_get_first(rb_root_t *root) -+{ -+ rb_node_t *n; -+ -+ n = root->rb_node; -+ if (!n) -+ return 0; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+} -+EXPORT_SYMBOL(rb_get_first); -+ -+/* -+ * Given a node, this function will return the next node in the tree. -+ */ -+rb_node_t *rb_get_next(rb_node_t *n) -+{ -+ rb_node_t *parent; -+ -+ if (n->rb_right) { -+ n = n->rb_right; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+ } else { -+ while ((parent = n->rb_parent)) { -+ if (n == parent->rb_left) -+ return parent; -+ n = parent; -+ } -+ return 0; -+ } -+} -+EXPORT_SYMBOL(rb_get_next); -+ - -_ diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-1-suse-2.4.19.patch b/lustre/kernel_patches/patches/ext-2.4-patch-1-suse-2.4.19.patch deleted file mode 100644 index 97309211f0..0000000000 --- a/lustre/kernel_patches/patches/ext-2.4-patch-1-suse-2.4.19.patch +++ /dev/null @@ -1,2551 +0,0 @@ - fs/ext3/Makefile | 2 - fs/ext3/dir.c | 299 +++++++++ - fs/ext3/file.c | 3 - fs/ext3/hash.c | 215 ++++++ - fs/ext3/namei.c | 1388 ++++++++++++++++++++++++++++++++++++++++----- - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 85 ++ - include/linux/ext3_fs_sb.h | 2 - include/linux/ext3_jbd.h | 2 - include/linux/rbtree.h | 2 - lib/rbtree.c | 42 + - 11 files changed, 1887 insertions(+), 160 deletions(-) - -Index: linux-2.4.19/fs/ext3/Makefile -=================================================================== ---- linux-2.4.19.orig/fs/ext3/Makefile 2004-04-23 18:25:03.000000000 -0400 -+++ linux-2.4.19/fs/ext3/Makefile 2004-04-23 18:26:27.000000000 -0400 -@@ -12,7 +12,7 @@ - export-objs := super.o inode.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o -+ ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - - obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -Index: linux-2.4.19/fs/ext3/dir.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/dir.c 2001-11-09 17:25:04.000000000 -0500 -+++ linux-2.4.19/fs/ext3/dir.c 2004-04-23 18:26:27.000000000 -0400 -@@ -21,12 +21,16 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/slab.h> -+#include <linux/rbtree.h> - - static unsigned char ext3_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK - }; - - static int ext3_readdir(struct file *, void *, filldir_t); -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir); - - struct file_operations ext3_dir_operations = { - read: generic_read_dir, -@@ -35,6 +39,17 @@ - fsync: ext3_sync_file, /* BKL held */ - }; - -+ -+static unsigned char get_dtype(struct super_block *sb, int filetype) -+{ -+ if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || -+ (filetype >= EXT3_FT_MAX)) -+ return DT_UNKNOWN; -+ -+ return (ext3_filetype_table[filetype]); -+} -+ -+ - int ext3_check_dir_entry (const char * function, struct inode * dir, - struct ext3_dir_entry_2 * de, - struct buffer_head * bh, -@@ -79,6 +94,16 @@ - - sb = inode->i_sb; - -+ if (is_dx(inode)) { -+ err = ext3_dx_readdir(filp, dirent, filldir); -+ if (err != ERR_BAD_DX_DIR) -+ return err; -+ /* -+ * We don't set the inode dirty flag since it's not -+ * critical that it get flushed back to the disk. -+ */ -+ EXT3_I(filp->f_dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; -+ } - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); -@@ -162,18 +187,12 @@ - * during the copy operation. - */ - unsigned long version = filp->f_version; -- unsigned char d_type = DT_UNKNOWN; - -- if (EXT3_HAS_INCOMPAT_FEATURE(sb, -- EXT3_FEATURE_INCOMPAT_FILETYPE) -- && de->file_type < EXT3_FT_MAX) -- d_type = -- ext3_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, - le32_to_cpu(de->inode), -- d_type); -+ get_dtype(sb, de->file_type)); - if (error) - break; - if (version != filp->f_version) -@@ -188,3 +207,269 @@ - UPDATE_ATIME(inode); - return 0; - } -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * These functions convert from the major/minor hash to an f_pos -+ * value. -+ * -+ * Currently we only use major hash numer. This is unfortunate, but -+ * on 32-bit machines, the same VFS interface is used for lseek and -+ * llseek, so if we use the 64 bit offset, then the 32-bit versions of -+ * lseek/telldir/seekdir will blow out spectacularly, and from within -+ * the ext2 low-level routine, we don't know if we're being called by -+ * a 64-bit version of the system call or the 32-bit version of the -+ * system call. Worse yet, NFSv2 only allows for a 32-bit readdir -+ * cookie. Sigh. -+ */ -+#define hash2pos(major, minor) (major >> 1) -+#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff) -+#define pos2min_hash(pos) (0) -+ -+/* -+ * This structure holds the nodes of the red-black tree used to store -+ * the directory entry in hash order. -+ */ -+struct fname { -+ __u32 hash; -+ __u32 minor_hash; -+ rb_node_t rb_hash; -+ struct fname *next; -+ __u32 inode; -+ __u8 name_len; -+ __u8 file_type; -+ char name[0]; -+}; -+ -+/* -+ * This functoin implements a non-recursive way of freeing all of the -+ * nodes in the red-black tree. -+ */ -+static void free_rb_tree_fname(rb_root_t *root) -+{ -+ rb_node_t *n = root->rb_node; -+ rb_node_t *parent; -+ struct fname *fname; -+ -+ while (n) { -+ /* Do the node's children first */ -+ if ((n)->rb_left) { -+ n = n->rb_left; -+ continue; -+ } -+ if (n->rb_right) { -+ n = n->rb_right; -+ continue; -+ } -+ /* -+ * The node has no children; free it, and then zero -+ * out parent's link to it. Finally go to the -+ * beginning of the loop and try to free the parent -+ * node. -+ */ -+ parent = n->rb_parent; -+ fname = rb_entry(n, struct fname, rb_hash); -+ kfree(fname); -+ if (!parent) -+ root->rb_node = 0; -+ else if (parent->rb_left == n) -+ parent->rb_left = 0; -+ else if (parent->rb_right == n) -+ parent->rb_right = 0; -+ n = parent; -+ } -+ root->rb_node = 0; -+} -+ -+ -+struct dir_private_info *create_dir_info(loff_t pos) -+{ -+ struct dir_private_info *p; -+ -+ p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL); -+ if (!p) -+ return NULL; -+ p->root.rb_node = 0; -+ p->curr_node = 0; -+ p->extra_fname = 0; -+ p->last_pos = 0; -+ p->curr_hash = pos2maj_hash(pos); -+ p->curr_minor_hash = pos2min_hash(pos); -+ p->next_hash = 0; -+ return p; -+} -+ -+void ext3_htree_free_dir_info(struct dir_private_info *p) -+{ -+ free_rb_tree_fname(&p->root); -+ kfree(p); -+} -+ -+/* -+ * Given a directory entry, enter it into the fname rb tree. -+ */ -+void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent) -+{ -+ rb_node_t **p, *parent = NULL; -+ struct fname * fname, *new_fn; -+ struct dir_private_info *info; -+ int len; -+ -+ info = (struct dir_private_info *) dir_file->private_data; -+ p = &info->root.rb_node; -+ -+ /* Create and allocate the fname structure */ -+ len = sizeof(struct fname) + dirent->name_len + 1; -+ new_fn = kmalloc(len, GFP_KERNEL); -+ memset(new_fn, 0, len); -+ new_fn->hash = hash; -+ new_fn->minor_hash = minor_hash; -+ new_fn->inode = le32_to_cpu(dirent->inode); -+ new_fn->name_len = dirent->name_len; -+ new_fn->file_type = dirent->file_type; -+ memcpy(new_fn->name, dirent->name, dirent->name_len); -+ new_fn->name[dirent->name_len] = 0; -+ -+ while (*p) { -+ parent = *p; -+ fname = rb_entry(parent, struct fname, rb_hash); -+ -+ /* -+ * If the hash and minor hash match up, then we put -+ * them on a linked list. This rarely happens... -+ */ -+ if ((new_fn->hash == fname->hash) && -+ (new_fn->minor_hash == fname->minor_hash)) { -+ new_fn->next = fname->next; -+ fname->next = new_fn; -+ return; -+ } -+ -+ if (new_fn->hash < fname->hash) -+ p = &(*p)->rb_left; -+ else if (new_fn->hash > fname->hash) -+ p = &(*p)->rb_right; -+ else if (new_fn->minor_hash < fname->minor_hash) -+ p = &(*p)->rb_left; -+ else /* if (new_fn->minor_hash > fname->minor_hash) */ -+ p = &(*p)->rb_right; -+ } -+ -+ rb_link_node(&new_fn->rb_hash, parent, p); -+ rb_insert_color(&new_fn->rb_hash, &info->root); -+} -+ -+ -+ -+/* -+ * This is a helper function for ext3_dx_readdir. It calls filldir -+ * for all entres on the fname linked list. (Normally there is only -+ * one entry on the linked list, unless there are 62 bit hash collisions.) -+ */ -+static int call_filldir(struct file * filp, void * dirent, -+ filldir_t filldir, struct fname *fname) -+{ -+ struct dir_private_info *info = filp->private_data; -+ loff_t curr_pos; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct super_block * sb; -+ int error; -+ -+ sb = inode->i_sb; -+ -+ if (!fname) { -+ printk("call_filldir: called with null fname?!?\n"); -+ return 0; -+ } -+ curr_pos = hash2pos(fname->hash, fname->minor_hash); -+ while (fname) { -+ error = filldir(dirent, fname->name, -+ fname->name_len, curr_pos, -+ fname->inode, -+ get_dtype(sb, fname->file_type)); -+ if (error) { -+ filp->f_pos = curr_pos; -+ info->extra_fname = fname->next; -+ return error; -+ } -+ fname = fname->next; -+ } -+ return 0; -+} -+ -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir) -+{ -+ struct dir_private_info *info = filp->private_data; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct fname *fname; -+ int ret; -+ -+ if (!info) { -+ info = create_dir_info(filp->f_pos); -+ if (!info) -+ return -ENOMEM; -+ filp->private_data = info; -+ } -+ -+ /* Some one has messed with f_pos; reset the world */ -+ if (info->last_pos != filp->f_pos) { -+ free_rb_tree_fname(&info->root); -+ info->curr_node = 0; -+ info->extra_fname = 0; -+ info->curr_hash = pos2maj_hash(filp->f_pos); -+ info->curr_minor_hash = pos2min_hash(filp->f_pos); -+ } -+ -+ /* -+ * If there are any leftover names on the hash collision -+ * chain, return them first. -+ */ -+ if (info->extra_fname && -+ call_filldir(filp, dirent, filldir, info->extra_fname)) -+ goto finished; -+ -+ if (!info->curr_node) -+ info->curr_node = rb_get_first(&info->root); -+ -+ while (1) { -+ /* -+ * Fill the rbtree if we have no more entries, -+ * or the inode has changed since we last read in the -+ * cached entries. -+ */ -+ if ((!info->curr_node) || -+ (filp->f_version != inode->i_version)) { -+ info->curr_node = 0; -+ free_rb_tree_fname(&info->root); -+ filp->f_version = inode->i_version; -+ ret = ext3_htree_fill_tree(filp, info->curr_hash, -+ info->curr_minor_hash, -+ &info->next_hash); -+ if (ret < 0) -+ return ret; -+ if (ret == 0) -+ break; -+ info->curr_node = rb_get_first(&info->root); -+ } -+ -+ fname = rb_entry(info->curr_node, struct fname, rb_hash); -+ info->curr_hash = fname->hash; -+ info->curr_minor_hash = fname->minor_hash; -+ if (call_filldir(filp, dirent, filldir, fname)) -+ break; -+ -+ info->curr_node = rb_get_next(info->curr_node); -+ if (!info->curr_node) { -+ info->curr_hash = info->next_hash; -+ info->curr_minor_hash = 0; -+ } -+ } -+finished: -+ info->last_pos = filp->f_pos; -+ UPDATE_ATIME(inode); -+ return 0; -+} -+#endif -Index: linux-2.4.19/fs/ext3/file.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/file.c 2004-04-23 17:54:02.000000000 -0400 -+++ linux-2.4.19/fs/ext3/file.c 2004-04-23 18:26:27.000000000 -0400 -@@ -38,6 +38,9 @@ - { - if (filp->f_mode & FMODE_WRITE) - ext3_discard_prealloc (inode); -+ if (is_dx(inode) && filp->private_data) -+ ext3_htree_free_dir_info(filp->private_data); -+ - return 0; - } - -Index: linux-2.4.19/fs/ext3/hash.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/hash.c 2003-01-30 05:24:37.000000000 -0500 -+++ linux-2.4.19/fs/ext3/hash.c 2004-04-23 18:26:27.000000000 -0400 -@@ -0,0 +1,215 @@ -+/* -+ * linux/fs/ext3/hash.c -+ * -+ * Copyright (C) 2002 by Theodore Ts'o -+ * -+ * This file is released under the GPL v2. -+ * -+ * This file may be redistributed under the terms of the GNU Public -+ * License. -+ */ -+ -+#include <linux/fs.h> -+#include <linux/jbd.h> -+#include <linux/sched.h> -+#include <linux/ext3_fs.h> -+ -+#define DELTA 0x9E3779B9 -+ -+static void TEA_transform(__u32 buf[4], __u32 const in[]) -+{ -+ __u32 sum = 0; -+ __u32 b0 = buf[0], b1 = buf[1]; -+ __u32 a = in[0], b = in[1], c = in[2], d = in[3]; -+ int n = 16; -+ -+ do { -+ sum += DELTA; -+ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); -+ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); -+ } while(--n); -+ -+ buf[0] += b0; -+ buf[1] += b1; -+} -+ -+/* F, G and H are basic MD4 functions: selection, majority, parity */ -+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -+#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -+#define H(x, y, z) ((x) ^ (y) ^ (z)) -+ -+/* -+ * The generic round function. The application is so specific that -+ * we don't bother protecting all the arguments with parens, as is generally -+ * good macro practice, in favor of extra legibility. -+ * Rotation is separate from addition to prevent recomputation -+ */ -+#define ROUND(f, a, b, c, d, x, s) \ -+ (a += f(b, c, d) + x, a = (a << s) | (a >> (32-s))) -+#define K1 0 -+#define K2 013240474631UL -+#define K3 015666365641UL -+ -+/* -+ * Basic cut-down MD4 transform. Returns only 32 bits of result. -+ */ -+static void halfMD4Transform (__u32 buf[4], __u32 const in[]) -+{ -+ __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; -+ -+ /* Round 1 */ -+ ROUND(F, a, b, c, d, in[0] + K1, 3); -+ ROUND(F, d, a, b, c, in[1] + K1, 7); -+ ROUND(F, c, d, a, b, in[2] + K1, 11); -+ ROUND(F, b, c, d, a, in[3] + K1, 19); -+ ROUND(F, a, b, c, d, in[4] + K1, 3); -+ ROUND(F, d, a, b, c, in[5] + K1, 7); -+ ROUND(F, c, d, a, b, in[6] + K1, 11); -+ ROUND(F, b, c, d, a, in[7] + K1, 19); -+ -+ /* Round 2 */ -+ ROUND(G, a, b, c, d, in[1] + K2, 3); -+ ROUND(G, d, a, b, c, in[3] + K2, 5); -+ ROUND(G, c, d, a, b, in[5] + K2, 9); -+ ROUND(G, b, c, d, a, in[7] + K2, 13); -+ ROUND(G, a, b, c, d, in[0] + K2, 3); -+ ROUND(G, d, a, b, c, in[2] + K2, 5); -+ ROUND(G, c, d, a, b, in[4] + K2, 9); -+ ROUND(G, b, c, d, a, in[6] + K2, 13); -+ -+ /* Round 3 */ -+ ROUND(H, a, b, c, d, in[3] + K3, 3); -+ ROUND(H, d, a, b, c, in[7] + K3, 9); -+ ROUND(H, c, d, a, b, in[2] + K3, 11); -+ ROUND(H, b, c, d, a, in[6] + K3, 15); -+ ROUND(H, a, b, c, d, in[1] + K3, 3); -+ ROUND(H, d, a, b, c, in[5] + K3, 9); -+ ROUND(H, c, d, a, b, in[0] + K3, 11); -+ ROUND(H, b, c, d, a, in[4] + K3, 15); -+ -+ buf[0] += a; -+ buf[1] += b; -+ buf[2] += c; -+ buf[3] += d; -+} -+ -+#undef ROUND -+#undef F -+#undef G -+#undef H -+#undef K1 -+#undef K2 -+#undef K3 -+ -+/* The old legacy hash */ -+static __u32 dx_hack_hash (const char *name, int len) -+{ -+ __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9; -+ while (len--) { -+ __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373)); -+ -+ if (hash & 0x80000000) hash -= 0x7fffffff; -+ hash1 = hash0; -+ hash0 = hash; -+ } -+ return (hash0 << 1); -+} -+ -+static void str2hashbuf(const char *msg, int len, __u32 *buf, int num) -+{ -+ __u32 pad, val; -+ int i; -+ -+ pad = (__u32)len | ((__u32)len << 8); -+ pad |= pad << 16; -+ -+ val = pad; -+ if (len > num*4) -+ len = num * 4; -+ for (i=0; i < len; i++) { -+ if ((i % 4) == 0) -+ val = pad; -+ val = msg[i] + (val << 8); -+ if ((i % 4) == 3) { -+ *buf++ = val; -+ val = pad; -+ num--; -+ } -+ } -+ if (--num >= 0) -+ *buf++ = val; -+ while (--num >= 0) -+ *buf++ = pad; -+} -+ -+/* -+ * Returns the hash of a filename. If len is 0 and name is NULL, then -+ * this function can be used to test whether or not a hash version is -+ * supported. -+ * -+ * The seed is an 4 longword (32 bits) "secret" which can be used to -+ * uniquify a hash. If the seed is all zero's, then some default seed -+ * may be used. -+ * -+ * A particular hash version specifies whether or not the seed is -+ * represented, and whether or not the returned hash is 32 bits or 64 -+ * bits. 32 bit hashes will return 0 for the minor hash. -+ */ -+int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) -+{ -+ __u32 hash; -+ __u32 minor_hash = 0; -+ const char *p; -+ int i; -+ __u32 in[8], buf[4]; -+ -+ /* Initialize the default seed for the hash checksum functions */ -+ buf[0] = 0x67452301; -+ buf[1] = 0xefcdab89; -+ buf[2] = 0x98badcfe; -+ buf[3] = 0x10325476; -+ -+ /* Check to see if the seed is all zero's */ -+ if (hinfo->seed) { -+ for (i=0; i < 4; i++) { -+ if (hinfo->seed[i]) -+ break; -+ } -+ if (i < 4) -+ memcpy(buf, hinfo->seed, sizeof(buf)); -+ } -+ -+ switch (hinfo->hash_version) { -+ case DX_HASH_LEGACY: -+ hash = dx_hack_hash(name, len); -+ break; -+ case DX_HASH_HALF_MD4: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 8); -+ halfMD4Transform(buf, in); -+ len -= 32; -+ p += 32; -+ } -+ minor_hash = buf[2]; -+ hash = buf[1]; -+ break; -+ case DX_HASH_TEA: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 4); -+ TEA_transform(buf, in); -+ len -= 16; -+ p += 16; -+ } -+ hash = buf[0]; -+ minor_hash = buf[1]; -+ break; -+ default: -+ hinfo->hash = 0; -+ return -1; -+ } -+ hinfo->hash = hash & ~1; -+ hinfo->minor_hash = minor_hash; -+ return 0; -+} -Index: linux-2.4.19/fs/ext3/namei.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/namei.c 2004-04-23 17:53:55.000000000 -0400 -+++ linux-2.4.19/fs/ext3/namei.c 2004-04-23 22:24:05.000000000 -0400 -@@ -16,6 +16,12 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 -+ * Hash Tree Directory indexing (c) -+ * Daniel Phillips, 2001 -+ * Hash Tree Directory indexing porting -+ * Christopher Li, 2002 -+ * Hash Tree Directory indexing cleanup -+ * Theodore Ts'o, 2002 - */ - - #include <linux/fs.h> -@@ -40,6 +46,630 @@ - #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) - #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) - -+static struct buffer_head *ext3_append(handle_t *handle, -+ struct inode *inode, -+ u32 *block, int *err) -+{ -+ struct buffer_head *bh; -+ -+ *block = inode->i_size >> inode->i_sb->s_blocksize_bits; -+ -+ if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -+ inode->i_size += inode->i_sb->s_blocksize; -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_journal_get_write_access(handle,bh); -+ } -+ return bh; -+} -+ -+#ifndef assert -+#define assert(test) J_ASSERT(test) -+#endif -+ -+#ifndef swap -+#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0) -+#endif -+ -+typedef struct { u32 v; } le_u32; -+typedef struct { u16 v; } le_u16; -+ -+#ifdef DX_DEBUG -+#define dxtrace(command) command -+#else -+#define dxtrace(command) -+#endif -+ -+struct fake_dirent -+{ -+ /*le*/u32 inode; -+ /*le*/u16 rec_len; -+ u8 name_len; -+ u8 file_type; -+}; -+ -+struct dx_countlimit -+{ -+ le_u16 limit; -+ le_u16 count; -+}; -+ -+struct dx_entry -+{ -+ le_u32 hash; -+ le_u32 block; -+}; -+ -+/* -+ * dx_root_info is laid out so that if it should somehow get overlaid by a -+ * dirent the two low bits of the hash version will be zero. Therefore, the -+ * hash version mod 4 should never be 0. Sincerely, the paranoia department. -+ */ -+ -+struct dx_root -+{ -+ struct fake_dirent dot; -+ char dot_name[4]; -+ struct fake_dirent dotdot; -+ char dotdot_name[4]; -+ struct dx_root_info -+ { -+ le_u32 reserved_zero; -+ u8 hash_version; -+ u8 info_length; /* 8 */ -+ u8 indirect_levels; -+ u8 unused_flags; -+ } -+ info; -+ struct dx_entry entries[0]; -+}; -+ -+struct dx_node -+{ -+ struct fake_dirent fake; -+ struct dx_entry entries[0]; -+}; -+ -+ -+struct dx_frame -+{ -+ struct buffer_head *bh; -+ struct dx_entry *entries; -+ struct dx_entry *at; -+}; -+ -+struct dx_map_entry -+{ -+ u32 hash; -+ u32 offs; -+}; -+ -+#ifdef CONFIG_EXT3_INDEX -+static inline unsigned dx_get_block (struct dx_entry *entry); -+static void dx_set_block (struct dx_entry *entry, unsigned value); -+static inline unsigned dx_get_hash (struct dx_entry *entry); -+static void dx_set_hash (struct dx_entry *entry, unsigned value); -+static unsigned dx_get_count (struct dx_entry *entries); -+static unsigned dx_get_limit (struct dx_entry *entries); -+static void dx_set_count (struct dx_entry *entries, unsigned value); -+static void dx_set_limit (struct dx_entry *entries, unsigned value); -+static unsigned dx_root_limit (struct inode *dir, unsigned infosize); -+static unsigned dx_node_limit (struct inode *dir); -+static struct dx_frame *dx_probe(struct dentry *dentry, -+ struct inode *dir, -+ struct dx_hash_info *hinfo, -+ struct dx_frame *frame, -+ int *err); -+static void dx_release (struct dx_frame *frames); -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry map[]); -+static void dx_sort_map(struct dx_map_entry *map, unsigned count); -+static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, -+ struct dx_map_entry *offsets, int count); -+static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); -+static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash); -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err); -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode); -+ -+/* -+ * Future: use high four bits of block for coalesce-on-delete flags -+ * Mask them off for now. -+ */ -+ -+static inline unsigned dx_get_block (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->block.v) & 0x00ffffff; -+} -+ -+static inline void dx_set_block (struct dx_entry *entry, unsigned value) -+{ -+ entry->block.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_hash (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->hash.v); -+} -+ -+static inline void dx_set_hash (struct dx_entry *entry, unsigned value) -+{ -+ entry->hash.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_count (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->count.v); -+} -+ -+static inline unsigned dx_get_limit (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->limit.v); -+} -+ -+static inline void dx_set_count (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->count.v = cpu_to_le16(value); -+} -+ -+static inline void dx_set_limit (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->limit.v = cpu_to_le16(value); -+} -+ -+static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - -+ EXT3_DIR_REC_LEN(2) - infosize; -+ return 0? 20: entry_space / sizeof(struct dx_entry); -+} -+ -+static inline unsigned dx_node_limit (struct inode *dir) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); -+ return 0? 22: entry_space / sizeof(struct dx_entry); -+} -+ -+/* -+ * Debug -+ */ -+#ifdef DX_DEBUG -+struct stats -+{ -+ unsigned names; -+ unsigned space; -+ unsigned bcount; -+}; -+ -+static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, -+ int size, int show_names) -+{ -+ unsigned names = 0, space = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ printk("names: "); -+ while ((char *) de < base + size) -+ { -+ if (de->inode) -+ { -+ if (show_names) -+ { -+ int len = de->name_len; -+ char *name = de->name; -+ while (len--) printk("%c", *name++); -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ printk(":%x.%u ", h.hash, -+ ((char *) de - base)); -+ } -+ space += EXT3_DIR_REC_LEN(de->name_len); -+ names++; -+ } -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ printk("(%i)\n", names); -+ return (struct stats) { names, space, 1 }; -+} -+ -+struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, -+ struct dx_entry *entries, int levels) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count = dx_get_count (entries), names = 0, space = 0, i; -+ unsigned bcount = 0; -+ struct buffer_head *bh; -+ int err; -+ printk("%i indexed blocks...\n", count); -+ for (i = 0; i < count; i++, entries++) -+ { -+ u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; -+ u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; -+ struct stats stats; -+ printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); -+ if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; -+ stats = levels? -+ dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): -+ dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); -+ names += stats.names; -+ space += stats.space; -+ bcount += stats.bcount; -+ brelse (bh); -+ } -+ if (bcount) -+ printk("%snames %u, fullness %u (%u%%)\n", levels?"":" ", -+ names, space/bcount,(space/bcount)*100/blocksize); -+ return (struct stats) { names, space, bcount}; -+} -+#endif /* DX_DEBUG */ -+ -+/* -+ * Probe for a directory leaf block to search. -+ * -+ * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -+ * error in the directory index, and the caller should fall back to -+ * searching the directory normally. The callers of dx_probe **MUST** -+ * check for this error code, and make sure it never gets reflected -+ * back to userspace. -+ */ -+static struct dx_frame * -+dx_probe(struct dentry *dentry, struct inode *dir, -+ struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) -+{ -+ unsigned count, indirect; -+ struct dx_entry *at, *entries, *p, *q, *m; -+ struct dx_root *root; -+ struct buffer_head *bh; -+ struct dx_frame *frame = frame_in; -+ u32 hash; -+ -+ frame->bh = NULL; -+ if (dentry) -+ dir = dentry->d_parent->d_inode; -+ if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) -+ goto fail; -+ root = (struct dx_root *) bh->b_data; -+ if (root->info.hash_version != DX_HASH_TEA && -+ root->info.hash_version != DX_HASH_HALF_MD4 && -+ root->info.hash_version != DX_HASH_LEGACY) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unrecognised inode hash code %d", -+ root->info.hash_version); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ hinfo->hash_version = root->info.hash_version; -+ hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ if (dentry) -+ ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ hash = hinfo->hash; -+ -+ if (root->info.unused_flags & 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash flags: %#06x", -+ root->info.unused_flags); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ if ((indirect = root->info.indirect_levels) > 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash depth: %#06x", -+ root->info.indirect_levels); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ while (1) -+ { -+ count = dx_get_count(entries); -+ assert (count && count <= dx_get_limit(entries)); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ dxtrace(printk(".")); -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ -+ if (0) // linear search cross check -+ { -+ unsigned n = count - 1; -+ at = entries; -+ while (n--) -+ { -+ dxtrace(printk(",")); -+ if (dx_get_hash(++at) > hash) -+ { -+ at--; -+ break; -+ } -+ } -+ assert (at == p - 1); -+ } -+ -+ at = p - 1; -+ dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ frame->bh = bh; -+ frame->entries = entries; -+ frame->at = at; -+ if (!indirect--) return frame; -+ if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ goto fail2; -+ at = entries = ((struct dx_node *) bh->b_data)->entries; -+ assert (dx_get_limit(entries) == dx_node_limit (dir)); -+ frame++; -+ } -+fail2: -+ while (frame >= frame_in) { -+ brelse(frame->bh); -+ frame--; -+ } -+fail: -+ return NULL; -+} -+ -+static void dx_release (struct dx_frame *frames) -+{ -+ if (frames[0].bh == NULL) -+ return; -+ -+ if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ brelse(frames[1].bh); -+ brelse(frames[0].bh); -+} -+ -+/* -+ * This function increments the frame pointer to search the next leaf -+ * block, and reads in the necessary intervening nodes if the search -+ * should be necessary. Whether or not the search is necessary is -+ * controlled by the hash parameter. If the hash value is even, then -+ * the search is only continued if the next block starts with that -+ * hash value. This is used if we are searching for a specific file. -+ * -+ * If the hash value is HASH_NB_ALWAYS, then always go to the next block. -+ * -+ * This function returns 1 if the caller should continue to search, -+ * or 0 if it should not. If there is an error reading one of the -+ * index blocks, it will return -1. -+ * -+ * If start_hash is non-null, it will be filled in with the starting -+ * hash of the next page. -+ */ -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash) -+{ -+ struct dx_frame *p; -+ struct buffer_head *bh; -+ int num_frames = 0; -+ __u32 bhash; -+ -+ *err = ENOENT; -+ p = frame; -+ /* -+ * Find the next leaf page by incrementing the frame pointer. -+ * If we run out of entries in the interior node, loop around and -+ * increment pointer in the parent node. When we break out of -+ * this loop, num_frames indicates the number of interior -+ * nodes need to be read. -+ */ -+ while (1) { -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ break; -+ if (p == frames) -+ return 0; -+ num_frames++; -+ p--; -+ } -+ -+ /* -+ * If the hash is 1, then continue only if the next page has a -+ * continuation hash of any value. This is used for readdir -+ * handling. Otherwise, check to see if the hash matches the -+ * desired contiuation hash. If it doesn't, return since -+ * there's no point to read in the successive index pages. -+ */ -+ bhash = dx_get_hash(p->at); -+ if (start_hash) -+ *start_hash = bhash; -+ if ((hash & 1) == 0) { -+ if ((bhash & ~1) != hash) -+ return 0; -+ } -+ /* -+ * If the hash is HASH_NB_ALWAYS, we always go to the next -+ * block so no check is necessary -+ */ -+ while (num_frames--) { -+ if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -+ 0, err))) -+ return -1; /* Failure */ -+ p++; -+ brelse (p->bh); -+ p->bh = bh; -+ p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ } -+ return 1; -+} -+ -+ -+/* -+ * p is at least 6 bytes before the end of page -+ */ -+static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) -+{ -+ return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); -+} -+ -+/* -+ * This function fills a red-black tree with information from a -+ * directory. We start scanning the directory in hash order, starting -+ * at start_hash and start_minor_hash. -+ * -+ * This function returns the number of entries inserted into the tree, -+ * or a negative error code. -+ */ -+int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash) -+{ -+ struct dx_hash_info hinfo; -+ struct buffer_head *bh; -+ struct ext3_dir_entry_2 *de, *top; -+ static struct dx_frame frames[2], *frame; -+ struct inode *dir; -+ int block, err; -+ int count = 0; -+ int ret; -+ __u32 hashval; -+ -+ dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, -+ start_minor_hash)); -+ dir = dir_file->f_dentry->d_inode; -+ hinfo.hash = start_hash; -+ hinfo.minor_hash = 0; -+ frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ -+ while (1) { -+ block = dx_get_block(frame->at); -+ dxtrace(printk("Reading block %d\n", block)); -+ if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) -+ goto errout; -+ -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) { -+ ext3fs_dirhash(de->name, de->name_len, &hinfo); -+ if ((hinfo.hash < start_hash) || -+ ((hinfo.hash == start_hash) && -+ (hinfo.minor_hash < start_minor_hash))) -+ continue; -+ ext3_htree_store_dirent(dir_file, hinfo.hash, -+ hinfo.minor_hash, de); -+ count++; -+ } -+ brelse (bh); -+ hashval = ~1; -+ ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, -+ frame, frames, &err, &hashval); -+ if (next_hash) -+ *next_hash = hashval; -+ if (ret == -1) -+ goto errout; -+ /* -+ * Stop if: (a) there are no more entries, or -+ * (b) we have inserted at least one entry and the -+ * next hash value is not a continuation -+ */ -+ if ((ret == 0) || -+ (count && ((hashval & 1) == 0))) -+ break; -+ } -+ dx_release(frames); -+ dxtrace(printk("Fill tree: returned %d entries\n", count)); -+ return count; -+errout: -+ dx_release(frames); -+ return (err); -+} -+ -+ -+/* -+ * Directory block splitting, compacting -+ */ -+ -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) -+{ -+ int count = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ while ((char *) de < base + size) -+ { -+ if (de->name_len && de->inode) { -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ map_tail--; -+ map_tail->hash = h.hash; -+ map_tail->offs = (u32) ((char *) de - base); -+ count++; -+ } -+ /* XXX: do we need to check rec_len == 0 case? -Chris */ -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ return count; -+} -+ -+static void dx_sort_map (struct dx_map_entry *map, unsigned count) -+{ -+ struct dx_map_entry *p, *q, *top = map + count - 1; -+ int more; -+ /* Combsort until bubble sort doesn't suck */ -+ while (count > 2) -+ { -+ count = count*10/13; -+ if (count - 9 < 2) /* 9, 10 -> 11 */ -+ count = 11; -+ for (p = top, q = p - count; q >= map; p--, q--) -+ if (p->hash < q->hash) -+ swap(*p, *q); -+ } -+ /* Garden variety bubble sort */ -+ do { -+ more = 0; -+ q = top; -+ while (q-- > map) -+ { -+ if (q[1].hash >= q[0].hash) -+ continue; -+ swap(*(q+1), *q); -+ more = 1; -+ } -+ } while(more); -+} -+ -+static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+{ -+ struct dx_entry *entries = frame->entries; -+ struct dx_entry *old = frame->at, *new = old + 1; -+ int count = dx_get_count(entries); -+ -+ assert(count < dx_get_limit(entries)); -+ assert(old < entries + count); -+ memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); -+ dx_set_hash(new, hash); -+ dx_set_block(new, block); -+ dx_set_count(entries, count + 1); -+} -+#endif -+ -+ -+static void ext3_update_dx_flag(struct inode *inode) -+{ -+ if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, -+ EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; -+} -+ - /* - * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. - * -@@ -96,6 +726,7 @@ - return 0; - } - -+ - /* - * ext3_find_entry() - * -@@ -107,6 +738,8 @@ - * The returned buffer_head has ->b_count elevated. The caller is expected - * to brelse() it when appropriate. - */ -+ -+ - static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) - { -@@ -121,12 +754,32 @@ - int num = 0; - int nblocks, i, err; - struct inode *dir = dentry->d_parent->d_inode; -+ int namelen; -+ const u8 *name; -+ unsigned blocksize; - - *res_dir = NULL; - sb = dir->i_sb; -- -+ blocksize = sb->s_blocksize; -+ namelen = dentry->d_name.len; -+ name = dentry->d_name.name; -+ if (namelen > EXT3_NAME_LEN) -+ return NULL; -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ /* -+ * On success, or if the error was file not found, -+ * return. Otherwise, fall back to doing a search the -+ * old fashioned way. -+ */ -+ if (bh || (err != ERR_BAD_DX_DIR)) -+ return bh; -+ dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ } -+#endif - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); -- start = dir->u.ext3_i.i_dir_start_lookup; -+ start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) - start = 0; - block = start; -@@ -167,7 +820,7 @@ - i = search_dirblock(bh, dir, dentry, - block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); - if (i == 1) { -- dir->u.ext3_i.i_dir_start_lookup = block; -+ EXT3_I(dir)->i_dir_start_lookup = block; - ret = bh; - goto cleanup_and_exit; - } else { -@@ -198,6 +851,66 @@ - return ret; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err) -+{ -+ struct super_block * sb; -+ struct dx_hash_info hinfo; -+ u32 hash; -+ struct dx_frame frames[2], *frame; -+ struct ext3_dir_entry_2 *de, *top; -+ struct buffer_head *bh; -+ unsigned long block; -+ int retval; -+ int namelen = dentry->d_name.len; -+ const u8 *name = dentry->d_name.name; -+ struct inode *dir = dentry->d_parent->d_inode; -+ -+ sb = dir->i_sb; -+ if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+ return NULL; -+ hash = hinfo.hash; -+ do { -+ block = dx_get_block(frame->at); -+ if (!(bh = ext3_bread (NULL,dir, block, 0, err))) -+ goto errout; -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) -+ if (ext3_match (namelen, name, de)) { -+ if (!ext3_check_dir_entry("ext3_find_entry", -+ dir, de, bh, -+ (block<<EXT3_BLOCK_SIZE_BITS(sb)) -+ +((char *)de - bh->b_data))) { -+ brelse (bh); -+ goto errout; -+ } -+ *res_dir = de; -+ dx_release (frames); -+ return bh; -+ } -+ brelse (bh); -+ /* Check to see if we should continue to search */ -+ retval = ext3_htree_next_block(dir, hash, frame, -+ frames, err, 0); -+ if (retval == -1) { -+ ext3_warning(sb, __FUNCTION__, -+ "error reading index page in directory #%lu", -+ dir->i_ino); -+ goto errout; -+ } -+ } while (retval == 1); -+ -+ *err = -ENOENT; -+errout: -+ dxtrace(printk("%s not found\n", name)); -+ dx_release (frames); -+ return NULL; -+} -+#endif -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -214,8 +927,9 @@ - brelse (bh); - inode = iget(dir->i_sb, ino); - -- if (!inode) -+ if (!inode) { - return ERR_PTR(-EACCES); -+ } - } - d_add(dentry, inode); - return NULL; -@@ -239,6 +953,301 @@ - de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct ext3_dir_entry_2 * -+dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) -+{ -+ unsigned rec_len = 0; -+ -+ while (count--) { -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); -+ de->inode = 0; -+ map++; -+ to += rec_len; -+ } -+ return (struct ext3_dir_entry_2 *) (to - rec_len); -+} -+ -+static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) -+{ -+ struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ unsigned rec_len = 0; -+ -+ prev = to = de; -+ while ((char*)de < base + size) { -+ next = (struct ext3_dir_entry_2 *) ((char *) de + -+ le16_to_cpu(de->rec_len)); -+ if (de->inode && de->name_len) { -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ if (de > to) -+ memmove(to, de, rec_len); -+ to->rec_len = cpu_to_le16(rec_len); -+ prev = to; -+ to = (struct ext3_dir_entry_2 *) (((char *) to) + rec_len); -+ } -+ de = next; -+ } -+ return prev; -+} -+ -+static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, -+ struct buffer_head **bh,struct dx_frame *frame, -+ struct dx_hash_info *hinfo, int *error) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count, continued; -+ struct buffer_head *bh2; -+ u32 newblock; -+ u32 hash2; -+ struct dx_map_entry *map; -+ char *data1 = (*bh)->b_data, *data2; -+ unsigned split; -+ struct ext3_dir_entry_2 *de = NULL, *de2; -+ int err; -+ -+ bh2 = ext3_append (handle, dir, &newblock, error); -+ if (!(bh2)) { -+ brelse(*bh); -+ *bh = NULL; -+ goto errout; -+ } -+ -+ BUFFER_TRACE(*bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, *bh); -+ if (err) { -+ journal_error: -+ brelse(*bh); -+ brelse(bh2); -+ *bh = NULL; -+ ext3_std_error(dir->i_sb, err); -+ goto errout; -+ } -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ -+ data2 = bh2->b_data; -+ -+ /* create map in the end of data2 block */ -+ map = (struct dx_map_entry *) (data2 + blocksize); -+ count = dx_make_map ((struct ext3_dir_entry_2 *) data1, -+ blocksize, hinfo, map); -+ map -= count; -+ split = count/2; // need to adjust to actual middle -+ dx_sort_map (map, count); -+ hash2 = map[split].hash; -+ continued = hash2 == map[split - 1].hash; -+ dxtrace(printk("Split block %i at %x, %i/%i\n", -+ dx_get_block(frame->at), hash2, split, count-split)); -+ -+ /* Fancy dance to stay within two buffers */ -+ de2 = dx_move_dirents(data1, data2, map + split, count - split); -+ de = dx_pack_dirents(data1,blocksize); -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ -+ /* Which block gets the new entry? */ -+ if (hinfo->hash >= hash2) -+ { -+ swap(*bh, bh2); -+ de = de2; -+ } -+ dx_insert_block (frame, hash2 + continued, newblock); -+ err = ext3_journal_dirty_metadata (handle, bh2); -+ if (err) -+ goto journal_error; -+ err = ext3_journal_dirty_metadata (handle, frame->bh); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ dxtrace(dx_show_index ("frame", frame->entries)); -+errout: -+ return de; -+} -+#endif -+ -+ -+/* -+ * Add a new entry into a directory (leaf) block. If de is non-NULL, -+ * it points to a directory entry which is guaranteed to be large -+ * enough for new directory entry. If de is NULL, then -+ * add_dirent_to_buf will attempt search the directory block for -+ * space. It will return -ENOSPC if no space is available, and -EIO -+ * and -EEXIST if directory entry already exists. -+ * -+ * NOTE! bh is NOT released in the case where ENOSPC is returned. In -+ * all other cases bh is released. -+ */ -+static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct ext3_dir_entry_2 *de, -+ struct buffer_head * bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ unsigned long offset = 0; -+ unsigned short reclen; -+ int nlen, rlen, err; -+ char *top; -+ -+ reclen = EXT3_DIR_REC_LEN(namelen); -+ if (!de) { -+ de = (struct ext3_dir_entry_2 *)bh->b_data; -+ top = bh->b_data + dir->i_sb->s_blocksize - reclen; -+ while ((char *) de <= top) { -+ if (!ext3_check_dir_entry("ext3_add_entry", dir, de, -+ bh, offset)) { -+ brelse (bh); -+ return -EIO; -+ } -+ if (ext3_match (namelen, name, de)) { -+ brelse (bh); -+ return -EEXIST; -+ } -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if ((de->inode? rlen - nlen: rlen) >= reclen) -+ break; -+ de = (struct ext3_dir_entry_2 *)((char *)de + rlen); -+ offset += rlen; -+ } -+ if ((char *) de > top) -+ return -ENOSPC; -+ } -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) { -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return err; -+ } -+ -+ /* By now the buffer is marked for journaling */ -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if (de->inode) { -+ struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ de1->rec_len = cpu_to_le16(rlen - nlen); -+ de->rec_len = cpu_to_le16(nlen); -+ de = de1; -+ } -+ de->file_type = EXT3_FT_UNKNOWN; -+ if (inode) { -+ de->inode = cpu_to_le32(inode->i_ino); -+ ext3_set_de_type(dir->i_sb, de, inode->i_mode); -+ } else -+ de->inode = 0; -+ de->name_len = namelen; -+ memcpy (de->name, name, namelen); -+ /* -+ * XXX shouldn't update any times until successful -+ * completion of syscall, but too many callers depend -+ * on this. -+ * -+ * XXX similarly, too many callers depend on -+ * ext3_new_inode() setting the times, but error -+ * recovery deletes the inode, so the worst that can -+ * happen is that the times are slightly out of date -+ * and/or different from the directory change time. -+ */ -+ dir->i_mtime = dir->i_ctime = CURRENT_TIME; -+ ext3_update_dx_flag(dir); -+ dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return 0; -+} -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * This converts a one block unindexed directory to a 3 block indexed -+ * directory, and adds the dentry to the indexed directory. -+ */ -+static int make_indexed_dir(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct buffer_head *bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ struct buffer_head *bh2; -+ struct dx_root *root; -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries; -+ struct ext3_dir_entry_2 *de, *de2; -+ char *data1, *top; -+ unsigned len; -+ int retval; -+ unsigned blocksize; -+ struct dx_hash_info hinfo; -+ u32 block; -+ -+ blocksize = dir->i_sb->s_blocksize; -+ dxtrace(printk("Creating index\n")); -+ retval = ext3_journal_get_write_access(handle, bh); -+ if (retval) { -+ ext3_std_error(dir->i_sb, retval); -+ brelse(bh); -+ return retval; -+ } -+ root = (struct dx_root *) bh->b_data; -+ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ bh2 = ext3_append (handle, dir, &block, &retval); -+ if (!(bh2)) { -+ brelse(bh); -+ return retval; -+ } -+ data1 = bh2->b_data; -+ -+ /* The 0th block becomes the root, move the dirents out */ -+ de = (struct ext3_dir_entry_2 *)&root->dotdot; -+ de = (struct ext3_dir_entry_2 *)((char *)de + le16_to_cpu(de->rec_len)); -+ len = ((char *) root) + blocksize - (char *) de; -+ memcpy (data1, de, len); -+ de = (struct ext3_dir_entry_2 *) data1; -+ top = data1 + len; -+ while (((char *) de2=(char*)de+le16_to_cpu(de->rec_len)) < top) -+ de = de2; -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ /* Initialize the root; the dot dirents already exist */ -+ de = (struct ext3_dir_entry_2 *) (&root->dotdot); -+ de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); -+ memset (&root->info, 0, sizeof(root->info)); -+ root->info.info_length = sizeof(root->info); -+ root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ entries = root->entries; -+ dx_set_block (entries, 1); -+ dx_set_count (entries, 1); -+ dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info))); -+ -+ /* Initialize as for dx_probe */ -+ hinfo.hash_version = root->info.hash_version; -+ hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ ext3fs_dirhash(name, namelen, &hinfo); -+ frame = frames; -+ frame->entries = entries; -+ frame->at = entries; -+ frame->bh = bh; -+ bh = bh2; -+ de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ dx_release (frames); -+ if (!(de)) -+ return retval; -+ -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} -+#endif -+ - /* - * ext3_add_entry() - * -@@ -249,127 +1258,197 @@ - * may not sleep between calling this and putting something into - * the entry, as someone else might have used it while you slept. - */ -- --/* -- * AKPM: the journalling code here looks wrong on the error paths -- */ - static int ext3_add_entry (handle_t *handle, struct dentry *dentry, - struct inode *inode) - { - struct inode *dir = dentry->d_parent->d_inode; -- const char *name = dentry->d_name.name; -- int namelen = dentry->d_name.len; - unsigned long offset; -- unsigned short rec_len; - struct buffer_head * bh; -- struct ext3_dir_entry_2 * de, * de1; -+ struct ext3_dir_entry_2 *de; - struct super_block * sb; - int retval; -+#ifdef CONFIG_EXT3_INDEX -+ int dx_fallback=0; -+#endif -+ unsigned blocksize; -+ unsigned nlen, rlen; -+ u32 block, blocks; - - sb = dir->i_sb; -- -- if (!namelen) -+ blocksize = sb->s_blocksize; -+ if (!dentry->d_name.len) - return -EINVAL; -- bh = ext3_bread (handle, dir, 0, 0, &retval); -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ retval = ext3_dx_add_entry(handle, dentry, inode); -+ if (!retval || (retval != ERR_BAD_DX_DIR)) -+ return retval; -+ EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; -+ dx_fallback++; -+ ext3_mark_inode_dirty(handle, dir); -+ } -+#endif -+ blocks = dir->i_size >> sb->s_blocksize_bits; -+ for (block = 0, offset = 0; block < blocks; block++) { -+ bh = ext3_bread(handle, dir, block, 0, &retval); -+ if(!bh) -+ return retval; -+ retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (retval != -ENOSPC) -+ return retval; -+ -+#ifdef CONFIG_EXT3_INDEX -+ if (blocks == 1 && !dx_fallback && -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ return make_indexed_dir(handle, dentry, inode, bh); -+#endif -+ brelse(bh); -+ } -+ bh = ext3_append(handle, dir, &block, &retval); - if (!bh) - return retval; -- rec_len = EXT3_DIR_REC_LEN(namelen); -- offset = 0; - de = (struct ext3_dir_entry_2 *) bh->b_data; -- while (1) { -- if ((char *)de >= sb->s_blocksize + bh->b_data) { -- brelse (bh); -- bh = NULL; -- bh = ext3_bread (handle, dir, -- offset >> EXT3_BLOCK_SIZE_BITS(sb), 1, &retval); -- if (!bh) -- return retval; -- if (dir->i_size <= offset) { -- if (dir->i_size == 0) { -- brelse(bh); -- return -ENOENT; -- } -- -- ext3_debug ("creating next block\n"); -- -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- de->inode = 0; -- de->rec_len = le16_to_cpu(sb->s_blocksize); -- dir->u.ext3_i.i_disksize = -- dir->i_size = offset + sb->s_blocksize; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); -- } else { -- -- ext3_debug ("skipping to next block\n"); -+ de->inode = 0; -+ de->rec_len = cpu_to_le16(rlen = blocksize); -+ nlen = 0; -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} - -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- } -- } -- if (!ext3_check_dir_entry ("ext3_add_entry", dir, de, bh, -- offset)) { -- brelse (bh); -- return -ENOENT; -- } -- if (ext3_match (namelen, name, de)) { -- brelse (bh); -- return -EEXIST; -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * Returns 0 for success, or a negative error value -+ */ -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries, *at; -+ struct dx_hash_info hinfo; -+ struct buffer_head * bh; -+ struct inode *dir = dentry->d_parent->d_inode; -+ struct super_block * sb = dir->i_sb; -+ struct ext3_dir_entry_2 *de; -+ int err; -+ -+ frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ entries = frame->entries; -+ at = frame->at; -+ -+ if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ goto cleanup; -+ -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto journal_error; -+ -+ err = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (err != -ENOSPC) { -+ bh = 0; -+ goto cleanup; -+ } -+ -+ /* Block full, should compress but for now just split */ -+ dxtrace(printk("using %u of %u node entries\n", -+ dx_get_count(entries), dx_get_limit(entries))); -+ /* Need to split index? */ -+ if (dx_get_count(entries) == dx_get_limit(entries)) { -+ u32 newblock; -+ unsigned icount = dx_get_count(entries); -+ int levels = frame - frames; -+ struct dx_entry *entries2; -+ struct dx_node *node2; -+ struct buffer_head *bh2; -+ -+ if (levels && (dx_get_count(frames->entries) == -+ dx_get_limit(frames->entries))) { -+ ext3_warning(sb, __FUNCTION__, -+ "Directory index full!\n"); -+ err = -ENOSPC; -+ goto cleanup; - } -- if ((le32_to_cpu(de->inode) == 0 && -- le16_to_cpu(de->rec_len) >= rec_len) || -- (le16_to_cpu(de->rec_len) >= -- EXT3_DIR_REC_LEN(de->name_len) + rec_len)) { -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- /* By now the buffer is marked for journaling */ -- offset += le16_to_cpu(de->rec_len); -- if (le32_to_cpu(de->inode)) { -- de1 = (struct ext3_dir_entry_2 *) ((char *) de + -- EXT3_DIR_REC_LEN(de->name_len)); -- de1->rec_len = -- cpu_to_le16(le16_to_cpu(de->rec_len) - -- EXT3_DIR_REC_LEN(de->name_len)); -- de->rec_len = cpu_to_le16( -- EXT3_DIR_REC_LEN(de->name_len)); -- de = de1; -+ -+ bh2 = ext3_append (handle, dir, &newblock, &err); -+ if (!(bh2)) -+ goto cleanup; -+ node2 = (struct dx_node *)(bh2->b_data); -+ entries2 = node2->entries; -+ node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -+ node2->fake.inode = 0; -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ if (levels) { -+ unsigned icount1 = icount/2, icount2 = icount - icount1;+ unsigned hash2 = dx_get_hash(entries + icount1); -+ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ err = ext3_journal_get_write_access(handle, -+ frames[0].bh); -+ if (err) -+ goto journal_error; -+ -+ memcpy ((char *) entries2, (char *) (entries + icount1),+ icount2 * sizeof(struct dx_entry)); -+ dx_set_count (entries, icount1); -+ dx_set_count (entries2, icount2); -+ dx_set_limit (entries2, dx_node_limit(dir)); -+ -+ /* Which index block gets the new entry? */ -+ if (at - entries >= icount1) { -+ frame->at = at = at - entries - icount1 + entries2; -+ frame->entries = entries = entries2; -+ swap(frame->bh, bh2); - } -- de->file_type = EXT3_FT_UNKNOWN; -- if (inode) { -- de->inode = cpu_to_le32(inode->i_ino); -- ext3_set_de_type(dir->i_sb, de, inode->i_mode); -- } else -- de->inode = 0; -- de->name_len = namelen; -- memcpy (de->name, name, namelen); -- /* -- * XXX shouldn't update any times until successful -- * completion of syscall, but too many callers depend -- * on this. -- * -- * XXX similarly, too many callers depend on -- * ext3_new_inode() setting the times, but error -- * recovery deletes the inode, so the worst that can -- * happen is that the times are slightly out of date -- * and/or different from the directory change time. -- */ -- 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; -- BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -- ext3_journal_dirty_metadata(handle, bh); -- brelse(bh); -- return 0; -+ dx_insert_block (frames + 0, hash2, newblock); -+ dxtrace(dx_show_index ("node", frames[1].entries)); -+ dxtrace(dx_show_index ("node", -+ ((struct dx_node *) bh2->b_data)->entries)); -+ err = ext3_journal_dirty_metadata(handle, bh2); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ } else { -+ dxtrace(printk("Creating second level index...\n")); -+ memcpy((char *) entries2, (char *) entries, -+ icount * sizeof(struct dx_entry)); -+ dx_set_limit(entries2, dx_node_limit(dir)); -+ -+ /* Set up root */ -+ dx_set_count(entries, 1); -+ dx_set_block(entries + 0, newblock); -+ ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ -+ /* Add new access path frame */ -+ frame = frames + 1; -+ frame->at = at = at - entries + entries2; -+ frame->entries = entries = entries2; -+ frame->bh = bh2; -+ err = ext3_journal_get_write_access(handle, -+ frame->bh); -+ if (err) -+ goto journal_error; - } -- offset += le16_to_cpu(de->rec_len); -- de = (struct ext3_dir_entry_2 *) -- ((char *) de + le16_to_cpu(de->rec_len)); -+ ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- brelse (bh); -- return -ENOSPC; -+ de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ if (!de) -+ goto cleanup; -+ err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ bh = 0; -+ goto cleanup; -+ -+journal_error: -+ ext3_std_error(dir->i_sb, err); -+cleanup: -+ if (bh) -+ brelse(bh); -+ dx_release(frames); -+ return err; - } -+#endif - - /* - * ext3_delete_entry deletes a directory entry by merging it with the -@@ -453,9 +1532,11 @@ - struct inode * inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -480,9 +1561,11 @@ - struct inode *inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -512,9 +1595,11 @@ - if (dir->i_nlink >= EXT3_LINK_MAX) - return -EMLINK; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -526,7 +1611,8 @@ - - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -- inode->i_size = inode->u.ext3_i.i_disksize = inode->i_sb->s_blocksize; -+ inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; -+ inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ -@@ -555,21 +1641,19 @@ - brelse (dir_block); - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); -- if (err) -- goto out_no_entry; -+ if (err) { -+ inode->i_nlink = 0; -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - dir->i_nlink++; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - d_instantiate(dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- inode->i_nlink = 0; -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - /* -@@ -656,7 +1740,7 @@ - int err = 0, rc; - - lock_super(sb); -- if (!list_empty(&inode->u.ext3_i.i_orphan)) -+ if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - - /* Orphan handling is only valid for files with data blocks -@@ -697,7 +1781,7 @@ - * This is safe: on error we're going to ignore the orphan list - * anyway on the next recovery. */ - if (!err) -- list_add(&inode->u.ext3_i.i_orphan, &EXT3_SB(sb)->s_orphan); -+ list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", -@@ -715,25 +1799,26 @@ - int ext3_orphan_del(handle_t *handle, struct inode *inode) - { - struct list_head *prev; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct ext3_sb_info *sbi; - ino_t ino_next; - struct ext3_iloc iloc; - int err = 0; - - lock_super(inode->i_sb); -- if (list_empty(&inode->u.ext3_i.i_orphan)) { -+ if (list_empty(&ei->i_orphan)) { - unlock_super(inode->i_sb); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); -- prev = inode->u.ext3_i.i_orphan.prev; -+ prev = ei->i_orphan.prev; - sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %ld from orphan list\n", inode->i_ino); - -- list_del(&inode->u.ext3_i.i_orphan); -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ list_del(&ei->i_orphan); -+ INIT_LIST_HEAD(&ei->i_orphan); - - /* If we're on an error path, we may not have a valid - * transaction handle with which to update the orphan list on -@@ -794,8 +1879,9 @@ - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); -@@ -833,7 +1919,7 @@ - ext3_mark_inode_dirty(handle, inode); - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - - end_rmdir: -@@ -851,8 +1937,9 @@ - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -879,7 +1966,7 @@ - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - inode->i_nlink--; - if (!inode->i_nlink) -@@ -905,9 +1992,11 @@ - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 5); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -917,7 +2006,7 @@ - if (IS_ERR(inode)) - goto out_stop; - -- if (l > sizeof (inode->u.ext3_i.i_data)) { -+ if (l > sizeof (EXT3_I(inode)->i_data)) { - inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* -@@ -926,25 +2015,23 @@ - * i_size in generic_commit_write(). - */ - err = block_symlink(inode, symname, l); -- if (err) -- goto out_no_entry; -+ if (err) { -+ ext3_dec_count(handle, inode); -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - } else { - inode->i_op = &ext3_fast_symlink_inode_operations; -- memcpy((char*)&inode->u.ext3_i.i_data,symname,l); -+ memcpy((char*)&EXT3_I(inode)->i_data,symname,l); - inode->i_size = l-1; - } -- inode->u.ext3_i.i_disksize = inode->i_size; -+ EXT3_I(inode)->i_disksize = inode->i_size; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- ext3_dec_count(handle, inode); -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - static int ext3_link (struct dentry * old_dentry, -@@ -957,12 +2044,15 @@ - if (S_ISDIR(inode->i_mode)) - return -EPERM; - -- if (inode->i_nlink >= EXT3_LINK_MAX) -+ if (inode->i_nlink >= EXT3_LINK_MAX) { - return -EMLINK; -+ } - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -996,9 +2086,11 @@ - - old_bh = new_bh = dir_bh = NULL; - -- handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + 2); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; -@@ -1078,7 +2170,7 @@ - new_inode->i_ctime = CURRENT_TIME; - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; -- old_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(old_dir); - if (dir_bh) { - BUFFER_TRACE(dir_bh, "get_write_access"); - ext3_journal_get_write_access(handle, dir_bh); -@@ -1090,7 +2182,7 @@ - new_inode->i_nlink--; - } else { - new_dir->i_nlink++; -- new_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(new_dir); - ext3_mark_inode_dirty(handle, new_dir); - } - } -Index: linux-2.4.19/fs/ext3/super.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/super.c 2004-04-23 18:25:03.000000000 -0400 -+++ linux-2.4.19/fs/ext3/super.c 2004-04-23 18:26:27.000000000 -0400 -@@ -741,6 +741,7 @@ - es->s_mtime = cpu_to_le32(CURRENT_TIME); - ext3_update_dynamic_rev(sb); - EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -+ - ext3_commit_super (sb, es, 1); - if (test_opt (sb, DEBUG)) - printk (KERN_INFO -@@ -751,6 +752,7 @@ - EXT3_BLOCKS_PER_GROUP(sb), - EXT3_INODES_PER_GROUP(sb), - sbi->s_mount_opt); -+ - printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ", - bdevname(sb->s_dev)); - if (EXT3_SB(sb)->s_journal->j_inode == NULL) { -@@ -925,6 +927,7 @@ - return res; - } - -+ - struct super_block * ext3_read_super (struct super_block * sb, void * data, - int silent) - { -@@ -1113,6 +1116,9 @@ - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+ for (i=0; i < 4; i++) -+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); -+ sbi->s_def_hash_version = es->s_def_hash_version; - - if (sbi->s_blocks_per_group > blocksize * 8) { - printk (KERN_ERR -@@ -1821,6 +1827,7 @@ - exit_ext3_xattr(); - } - -+EXPORT_SYMBOL(ext3_force_commit); - EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); -Index: linux-2.4.19/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.19.orig/include/linux/ext3_fs.h 2004-04-23 17:53:55.000000000 -0400 -+++ linux-2.4.19/include/linux/ext3_fs.h 2004-04-23 18:26:27.000000000 -0400 -@@ -40,6 +40,11 @@ - #define EXT3FS_VERSION "2.4-0.9.18" - - /* -+ * Always enable hashed directories -+ */ -+#define CONFIG_EXT3_INDEX -+ -+/* - * Debug code - */ - #ifdef EXT3FS_DEBUG -@@ -414,8 +419,11 @@ - /*E0*/ __u32 s_journal_inum; /* inode number of journal file */ - __u32 s_journal_dev; /* device number of journal file */ - __u32 s_last_orphan; /* start of list of inodes to delete */ -- --/*EC*/ __u32 s_reserved[197]; /* Padding to the end of the block */ -+ __u32 s_hash_seed[4]; /* HTREE hash seed */ -+ __u8 s_def_hash_version; /* Default hash version to use */ -+ __u8 s_reserved_char_pad; -+ __u16 s_reserved_word_pad; -+ __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -552,9 +560,46 @@ - #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) - #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ - ~EXT3_DIR_ROUND) -+/* -+ * Hash Tree Directory indexing -+ * (c) Daniel Phillips, 2001 -+ */ -+ -+#ifdef CONFIG_EXT3_INDEX -+ #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ -+ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ -+ (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) -+#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) -+#else -+ #define is_dx(dir) 0 -+#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) -+#endif -+ -+/* Legal values for the dx_root hash_version field: */ -+ -+#define DX_HASH_LEGACY 0 -+#define DX_HASH_HALF_MD4 1 -+#define DX_HASH_TEA 2 -+ -+/* hash info structure used by the directory hash */ -+struct dx_hash_info -+{ -+ u32 hash; -+ u32 minor_hash; -+ int hash_version; -+ u32 *seed; -+}; - - #ifdef __KERNEL__ - /* -+ * Control parameters used by ext3_htree_next_block -+ */ -+#define HASH_NB_ALWAYS 1 -+ -+ -+/* - * Describe an inode's exact location on disk and in memory - */ - struct ext3_iloc -@@ -564,6 +609,27 @@ - unsigned long block_group; - }; - -+ -+/* -+ * This structure is stuffed into the struct file's private_data field -+ * for directories. It is where we put information so that we can do -+ * readdir operations in hash tree order. -+ */ -+struct dir_private_info { -+ rb_root_t root; -+ rb_node_t *curr_node; -+ struct fname *extra_fname; -+ loff_t last_pos; -+ __u32 curr_hash; -+ __u32 curr_minor_hash; -+ __u32 next_hash; -+}; -+ -+/* -+ * Special error return code only used by dx_probe() and its callers. -+ */ -+#define ERR_BAD_DX_DIR -75000 -+ - /* - * Function prototypes - */ -@@ -591,11 +657,20 @@ - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, -- struct ext3_dir_entry_2 *, struct buffer_head *, -- unsigned long); -+ struct ext3_dir_entry_2 *, -+ struct buffer_head *, unsigned long); -+extern void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent); -+extern void ext3_htree_free_dir_info(struct dir_private_info *p); -+ - /* fsync.c */ - extern int ext3_sync_file (struct file *, struct dentry *, int); - -+/* hash.c */ -+extern int ext3fs_dirhash(const char *name, int len, struct -+ dx_hash_info *hinfo); -+ - /* ialloc.c */ - extern struct inode * ext3_new_inode (handle_t *, struct inode *, int); - extern void ext3_free_inode (handle_t *, struct inode *); -@@ -628,6 +703,8 @@ - /* namei.c */ - extern int ext3_orphan_add(handle_t *, struct inode *); - extern int ext3_orphan_del(handle_t *, struct inode *); -+extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash); - - /* super.c */ - extern void ext3_error (struct super_block *, const char *, const char *, ...) -Index: linux-2.4.19/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.19.orig/include/linux/ext3_fs_sb.h 2004-04-23 17:53:54.000000000 -0400 -+++ linux-2.4.19/include/linux/ext3_fs_sb.h 2004-04-23 18:26:27.000000000 -0400 -@@ -62,6 +62,8 @@ - int s_inode_size; - int s_first_ino; - u32 s_next_generation; -+ u32 s_hash_seed[4]; -+ int s_def_hash_version; - - /* Journaling */ - struct inode * s_journal_inode; -Index: linux-2.4.19/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.19.orig/include/linux/ext3_jbd.h 2004-04-23 17:53:54.000000000 -0400 -+++ linux-2.4.19/include/linux/ext3_jbd.h 2004-04-23 18:26:27.000000000 -0400 -@@ -69,6 +69,8 @@ - - #define EXT3_RESERVE_TRANS_BLOCKS 12 - -+#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, -Index: linux-2.4.19/include/linux/rbtree.h -=================================================================== ---- linux-2.4.19.orig/include/linux/rbtree.h 2001-11-22 14:46:18.000000000 -0500 -+++ linux-2.4.19/include/linux/rbtree.h 2004-04-23 18:26:27.000000000 -0400 -@@ -120,6 +120,8 @@ - - extern void rb_insert_color(rb_node_t *, rb_root_t *); - extern void rb_erase(rb_node_t *, rb_root_t *); -+extern rb_node_t *rb_get_first(rb_root_t *root); -+extern rb_node_t *rb_get_next(rb_node_t *n); - - static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link) - { -Index: linux-2.4.19/lib/rbtree.c -=================================================================== ---- linux-2.4.19.orig/lib/rbtree.c 2002-08-02 20:39:46.000000000 -0400 -+++ linux-2.4.19/lib/rbtree.c 2004-04-23 18:26:27.000000000 -0400 -@@ -17,6 +17,8 @@ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - linux/lib/rbtree.c -+ -+ rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002 - */ - - #include <linux/rbtree.h> -@@ -294,3 +296,43 @@ - __rb_erase_color(child, parent, root); - } - EXPORT_SYMBOL(rb_erase); -+ -+/* -+ * This function returns the first node (in sort order) of the tree. -+ */ -+rb_node_t *rb_get_first(rb_root_t *root) -+{ -+ rb_node_t *n; -+ -+ n = root->rb_node; -+ if (!n) -+ return 0; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+} -+EXPORT_SYMBOL(rb_get_first); -+ -+/* -+ * Given a node, this function will return the next node in the tree. -+ */ -+rb_node_t *rb_get_next(rb_node_t *n) -+{ -+ rb_node_t *parent; -+ -+ if (n->rb_right) { -+ n = n->rb_right; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+ } else { -+ while ((parent = n->rb_parent)) { -+ if (n == parent->rb_left) -+ return parent; -+ n = parent; -+ } -+ return 0; -+ } -+} -+EXPORT_SYMBOL(rb_get_next); -+ diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-1-suse.patch b/lustre/kernel_patches/patches/ext-2.4-patch-1-suse.patch deleted file mode 100644 index 28a1ad664e..0000000000 --- a/lustre/kernel_patches/patches/ext-2.4-patch-1-suse.patch +++ /dev/null @@ -1,2528 +0,0 @@ - fs/ext3/Makefile | 2 - fs/ext3/dir.c | 299 +++++++++ - fs/ext3/file.c | 3 - fs/ext3/hash.c | 215 ++++++ - fs/ext3/namei.c | 1387 ++++++++++++++++++++++++++++++++++++++++----- - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 85 ++ - include/linux/ext3_fs_sb.h | 2 - include/linux/ext3_jbd.h | 2 - include/linux/rbtree.h | 2 - lib/rbtree.c | 42 + - 11 files changed, 1886 insertions(+), 160 deletions(-) - ---- linux-2.4.20/fs/ext3/Makefile~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/Makefile Sat Apr 5 03:57:05 2003 -@@ -12,7 +12,7 @@ O_TARGET := ext3.o - export-objs := super.o inode.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o -+ ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - - include $(TOPDIR)/Rules.make ---- linux-2.4.20/fs/ext3/dir.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/dir.c Sat Apr 5 03:56:31 2003 -@@ -21,12 +21,16 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/slab.h> -+#include <linux/rbtree.h> - - static unsigned char ext3_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK - }; - - static int ext3_readdir(struct file *, void *, filldir_t); -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir); - - struct file_operations ext3_dir_operations = { - read: generic_read_dir, -@@ -35,6 +39,17 @@ struct file_operations ext3_dir_operatio - fsync: ext3_sync_file, /* BKL held */ - }; - -+ -+static unsigned char get_dtype(struct super_block *sb, int filetype) -+{ -+ if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || -+ (filetype >= EXT3_FT_MAX)) -+ return DT_UNKNOWN; -+ -+ return (ext3_filetype_table[filetype]); -+} -+ -+ - int ext3_check_dir_entry (const char * function, struct inode * dir, - struct ext3_dir_entry_2 * de, - struct buffer_head * bh, -@@ -79,6 +94,16 @@ static int ext3_readdir(struct file * fi - - sb = inode->i_sb; - -+ if (is_dx(inode)) { -+ err = ext3_dx_readdir(filp, dirent, filldir); -+ if (err != ERR_BAD_DX_DIR) -+ return err; -+ /* -+ * We don't set the inode dirty flag since it's not -+ * critical that it get flushed back to the disk. -+ */ -+ EXT3_I(filp->f_dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; -+ } - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); -@@ -162,18 +187,12 @@ revalidate: - * during the copy operation. - */ - unsigned long version = filp->f_version; -- unsigned char d_type = DT_UNKNOWN; - -- if (EXT3_HAS_INCOMPAT_FEATURE(sb, -- EXT3_FEATURE_INCOMPAT_FILETYPE) -- && de->file_type < EXT3_FT_MAX) -- d_type = -- ext3_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, - le32_to_cpu(de->inode), -- d_type); -+ get_dtype(sb, de->file_type)); - if (error) - break; - if (version != filp->f_version) -@@ -188,3 +207,269 @@ revalidate: - UPDATE_ATIME(inode); - return 0; - } -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * These functions convert from the major/minor hash to an f_pos -+ * value. -+ * -+ * Currently we only use major hash numer. This is unfortunate, but -+ * on 32-bit machines, the same VFS interface is used for lseek and -+ * llseek, so if we use the 64 bit offset, then the 32-bit versions of -+ * lseek/telldir/seekdir will blow out spectacularly, and from within -+ * the ext2 low-level routine, we don't know if we're being called by -+ * a 64-bit version of the system call or the 32-bit version of the -+ * system call. Worse yet, NFSv2 only allows for a 32-bit readdir -+ * cookie. Sigh. -+ */ -+#define hash2pos(major, minor) (major >> 1) -+#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff) -+#define pos2min_hash(pos) (0) -+ -+/* -+ * This structure holds the nodes of the red-black tree used to store -+ * the directory entry in hash order. -+ */ -+struct fname { -+ __u32 hash; -+ __u32 minor_hash; -+ rb_node_t rb_hash; -+ struct fname *next; -+ __u32 inode; -+ __u8 name_len; -+ __u8 file_type; -+ char name[0]; -+}; -+ -+/* -+ * This functoin implements a non-recursive way of freeing all of the -+ * nodes in the red-black tree. -+ */ -+static void free_rb_tree_fname(rb_root_t *root) -+{ -+ rb_node_t *n = root->rb_node; -+ rb_node_t *parent; -+ struct fname *fname; -+ -+ while (n) { -+ /* Do the node's children first */ -+ if ((n)->rb_left) { -+ n = n->rb_left; -+ continue; -+ } -+ if (n->rb_right) { -+ n = n->rb_right; -+ continue; -+ } -+ /* -+ * The node has no children; free it, and then zero -+ * out parent's link to it. Finally go to the -+ * beginning of the loop and try to free the parent -+ * node. -+ */ -+ parent = n->rb_parent; -+ fname = rb_entry(n, struct fname, rb_hash); -+ kfree(fname); -+ if (!parent) -+ root->rb_node = 0; -+ else if (parent->rb_left == n) -+ parent->rb_left = 0; -+ else if (parent->rb_right == n) -+ parent->rb_right = 0; -+ n = parent; -+ } -+ root->rb_node = 0; -+} -+ -+ -+struct dir_private_info *create_dir_info(loff_t pos) -+{ -+ struct dir_private_info *p; -+ -+ p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL); -+ if (!p) -+ return NULL; -+ p->root.rb_node = 0; -+ p->curr_node = 0; -+ p->extra_fname = 0; -+ p->last_pos = 0; -+ p->curr_hash = pos2maj_hash(pos); -+ p->curr_minor_hash = pos2min_hash(pos); -+ p->next_hash = 0; -+ return p; -+} -+ -+void ext3_htree_free_dir_info(struct dir_private_info *p) -+{ -+ free_rb_tree_fname(&p->root); -+ kfree(p); -+} -+ -+/* -+ * Given a directory entry, enter it into the fname rb tree. -+ */ -+void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent) -+{ -+ rb_node_t **p, *parent = NULL; -+ struct fname * fname, *new_fn; -+ struct dir_private_info *info; -+ int len; -+ -+ info = (struct dir_private_info *) dir_file->private_data; -+ p = &info->root.rb_node; -+ -+ /* Create and allocate the fname structure */ -+ len = sizeof(struct fname) + dirent->name_len + 1; -+ new_fn = kmalloc(len, GFP_KERNEL); -+ memset(new_fn, 0, len); -+ new_fn->hash = hash; -+ new_fn->minor_hash = minor_hash; -+ new_fn->inode = le32_to_cpu(dirent->inode); -+ new_fn->name_len = dirent->name_len; -+ new_fn->file_type = dirent->file_type; -+ memcpy(new_fn->name, dirent->name, dirent->name_len); -+ new_fn->name[dirent->name_len] = 0; -+ -+ while (*p) { -+ parent = *p; -+ fname = rb_entry(parent, struct fname, rb_hash); -+ -+ /* -+ * If the hash and minor hash match up, then we put -+ * them on a linked list. This rarely happens... -+ */ -+ if ((new_fn->hash == fname->hash) && -+ (new_fn->minor_hash == fname->minor_hash)) { -+ new_fn->next = fname->next; -+ fname->next = new_fn; -+ return; -+ } -+ -+ if (new_fn->hash < fname->hash) -+ p = &(*p)->rb_left; -+ else if (new_fn->hash > fname->hash) -+ p = &(*p)->rb_right; -+ else if (new_fn->minor_hash < fname->minor_hash) -+ p = &(*p)->rb_left; -+ else /* if (new_fn->minor_hash > fname->minor_hash) */ -+ p = &(*p)->rb_right; -+ } -+ -+ rb_link_node(&new_fn->rb_hash, parent, p); -+ rb_insert_color(&new_fn->rb_hash, &info->root); -+} -+ -+ -+ -+/* -+ * This is a helper function for ext3_dx_readdir. It calls filldir -+ * for all entres on the fname linked list. (Normally there is only -+ * one entry on the linked list, unless there are 62 bit hash collisions.) -+ */ -+static int call_filldir(struct file * filp, void * dirent, -+ filldir_t filldir, struct fname *fname) -+{ -+ struct dir_private_info *info = filp->private_data; -+ loff_t curr_pos; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct super_block * sb; -+ int error; -+ -+ sb = inode->i_sb; -+ -+ if (!fname) { -+ printk("call_filldir: called with null fname?!?\n"); -+ return 0; -+ } -+ curr_pos = hash2pos(fname->hash, fname->minor_hash); -+ while (fname) { -+ error = filldir(dirent, fname->name, -+ fname->name_len, curr_pos, -+ fname->inode, -+ get_dtype(sb, fname->file_type)); -+ if (error) { -+ filp->f_pos = curr_pos; -+ info->extra_fname = fname->next; -+ return error; -+ } -+ fname = fname->next; -+ } -+ return 0; -+} -+ -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir) -+{ -+ struct dir_private_info *info = filp->private_data; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct fname *fname; -+ int ret; -+ -+ if (!info) { -+ info = create_dir_info(filp->f_pos); -+ if (!info) -+ return -ENOMEM; -+ filp->private_data = info; -+ } -+ -+ /* Some one has messed with f_pos; reset the world */ -+ if (info->last_pos != filp->f_pos) { -+ free_rb_tree_fname(&info->root); -+ info->curr_node = 0; -+ info->extra_fname = 0; -+ info->curr_hash = pos2maj_hash(filp->f_pos); -+ info->curr_minor_hash = pos2min_hash(filp->f_pos); -+ } -+ -+ /* -+ * If there are any leftover names on the hash collision -+ * chain, return them first. -+ */ -+ if (info->extra_fname && -+ call_filldir(filp, dirent, filldir, info->extra_fname)) -+ goto finished; -+ -+ if (!info->curr_node) -+ info->curr_node = rb_get_first(&info->root); -+ -+ while (1) { -+ /* -+ * Fill the rbtree if we have no more entries, -+ * or the inode has changed since we last read in the -+ * cached entries. -+ */ -+ if ((!info->curr_node) || -+ (filp->f_version != inode->i_version)) { -+ info->curr_node = 0; -+ free_rb_tree_fname(&info->root); -+ filp->f_version = inode->i_version; -+ ret = ext3_htree_fill_tree(filp, info->curr_hash, -+ info->curr_minor_hash, -+ &info->next_hash); -+ if (ret < 0) -+ return ret; -+ if (ret == 0) -+ break; -+ info->curr_node = rb_get_first(&info->root); -+ } -+ -+ fname = rb_entry(info->curr_node, struct fname, rb_hash); -+ info->curr_hash = fname->hash; -+ info->curr_minor_hash = fname->minor_hash; -+ if (call_filldir(filp, dirent, filldir, fname)) -+ break; -+ -+ info->curr_node = rb_get_next(info->curr_node); -+ if (!info->curr_node) { -+ info->curr_hash = info->next_hash; -+ info->curr_minor_hash = 0; -+ } -+ } -+finished: -+ info->last_pos = filp->f_pos; -+ UPDATE_ATIME(inode); -+ return 0; -+} -+#endif ---- linux-2.4.20/fs/ext3/file.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/file.c Sat Apr 5 03:56:31 2003 -@@ -35,6 +35,9 @@ static int ext3_release_file (struct ino - { - if (filp->f_mode & FMODE_WRITE) - ext3_discard_prealloc (inode); -+ if (is_dx(inode) && filp->private_data) -+ ext3_htree_free_dir_info(filp->private_data); -+ - return 0; - } - ---- /dev/null Fri Aug 30 17:31:37 2002 -+++ linux-2.4.20-braam/fs/ext3/hash.c Sat Apr 5 03:56:31 2003 -@@ -0,0 +1,215 @@ -+/* -+ * linux/fs/ext3/hash.c -+ * -+ * Copyright (C) 2002 by Theodore Ts'o -+ * -+ * This file is released under the GPL v2. -+ * -+ * This file may be redistributed under the terms of the GNU Public -+ * License. -+ */ -+ -+#include <linux/fs.h> -+#include <linux/jbd.h> -+#include <linux/sched.h> -+#include <linux/ext3_fs.h> -+ -+#define DELTA 0x9E3779B9 -+ -+static void TEA_transform(__u32 buf[4], __u32 const in[]) -+{ -+ __u32 sum = 0; -+ __u32 b0 = buf[0], b1 = buf[1]; -+ __u32 a = in[0], b = in[1], c = in[2], d = in[3]; -+ int n = 16; -+ -+ do { -+ sum += DELTA; -+ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); -+ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); -+ } while(--n); -+ -+ buf[0] += b0; -+ buf[1] += b1; -+} -+ -+/* F, G and H are basic MD4 functions: selection, majority, parity */ -+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -+#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -+#define H(x, y, z) ((x) ^ (y) ^ (z)) -+ -+/* -+ * The generic round function. The application is so specific that -+ * we don't bother protecting all the arguments with parens, as is generally -+ * good macro practice, in favor of extra legibility. -+ * Rotation is separate from addition to prevent recomputation -+ */ -+#define ROUND(f, a, b, c, d, x, s) \ -+ (a += f(b, c, d) + x, a = (a << s) | (a >> (32-s))) -+#define K1 0 -+#define K2 013240474631UL -+#define K3 015666365641UL -+ -+/* -+ * Basic cut-down MD4 transform. Returns only 32 bits of result. -+ */ -+static void halfMD4Transform (__u32 buf[4], __u32 const in[]) -+{ -+ __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; -+ -+ /* Round 1 */ -+ ROUND(F, a, b, c, d, in[0] + K1, 3); -+ ROUND(F, d, a, b, c, in[1] + K1, 7); -+ ROUND(F, c, d, a, b, in[2] + K1, 11); -+ ROUND(F, b, c, d, a, in[3] + K1, 19); -+ ROUND(F, a, b, c, d, in[4] + K1, 3); -+ ROUND(F, d, a, b, c, in[5] + K1, 7); -+ ROUND(F, c, d, a, b, in[6] + K1, 11); -+ ROUND(F, b, c, d, a, in[7] + K1, 19); -+ -+ /* Round 2 */ -+ ROUND(G, a, b, c, d, in[1] + K2, 3); -+ ROUND(G, d, a, b, c, in[3] + K2, 5); -+ ROUND(G, c, d, a, b, in[5] + K2, 9); -+ ROUND(G, b, c, d, a, in[7] + K2, 13); -+ ROUND(G, a, b, c, d, in[0] + K2, 3); -+ ROUND(G, d, a, b, c, in[2] + K2, 5); -+ ROUND(G, c, d, a, b, in[4] + K2, 9); -+ ROUND(G, b, c, d, a, in[6] + K2, 13); -+ -+ /* Round 3 */ -+ ROUND(H, a, b, c, d, in[3] + K3, 3); -+ ROUND(H, d, a, b, c, in[7] + K3, 9); -+ ROUND(H, c, d, a, b, in[2] + K3, 11); -+ ROUND(H, b, c, d, a, in[6] + K3, 15); -+ ROUND(H, a, b, c, d, in[1] + K3, 3); -+ ROUND(H, d, a, b, c, in[5] + K3, 9); -+ ROUND(H, c, d, a, b, in[0] + K3, 11); -+ ROUND(H, b, c, d, a, in[4] + K3, 15); -+ -+ buf[0] += a; -+ buf[1] += b; -+ buf[2] += c; -+ buf[3] += d; -+} -+ -+#undef ROUND -+#undef F -+#undef G -+#undef H -+#undef K1 -+#undef K2 -+#undef K3 -+ -+/* The old legacy hash */ -+static __u32 dx_hack_hash (const char *name, int len) -+{ -+ __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9; -+ while (len--) { -+ __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373)); -+ -+ if (hash & 0x80000000) hash -= 0x7fffffff; -+ hash1 = hash0; -+ hash0 = hash; -+ } -+ return (hash0 << 1); -+} -+ -+static void str2hashbuf(const char *msg, int len, __u32 *buf, int num) -+{ -+ __u32 pad, val; -+ int i; -+ -+ pad = (__u32)len | ((__u32)len << 8); -+ pad |= pad << 16; -+ -+ val = pad; -+ if (len > num*4) -+ len = num * 4; -+ for (i=0; i < len; i++) { -+ if ((i % 4) == 0) -+ val = pad; -+ val = msg[i] + (val << 8); -+ if ((i % 4) == 3) { -+ *buf++ = val; -+ val = pad; -+ num--; -+ } -+ } -+ if (--num >= 0) -+ *buf++ = val; -+ while (--num >= 0) -+ *buf++ = pad; -+} -+ -+/* -+ * Returns the hash of a filename. If len is 0 and name is NULL, then -+ * this function can be used to test whether or not a hash version is -+ * supported. -+ * -+ * The seed is an 4 longword (32 bits) "secret" which can be used to -+ * uniquify a hash. If the seed is all zero's, then some default seed -+ * may be used. -+ * -+ * A particular hash version specifies whether or not the seed is -+ * represented, and whether or not the returned hash is 32 bits or 64 -+ * bits. 32 bit hashes will return 0 for the minor hash. -+ */ -+int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) -+{ -+ __u32 hash; -+ __u32 minor_hash = 0; -+ const char *p; -+ int i; -+ __u32 in[8], buf[4]; -+ -+ /* Initialize the default seed for the hash checksum functions */ -+ buf[0] = 0x67452301; -+ buf[1] = 0xefcdab89; -+ buf[2] = 0x98badcfe; -+ buf[3] = 0x10325476; -+ -+ /* Check to see if the seed is all zero's */ -+ if (hinfo->seed) { -+ for (i=0; i < 4; i++) { -+ if (hinfo->seed[i]) -+ break; -+ } -+ if (i < 4) -+ memcpy(buf, hinfo->seed, sizeof(buf)); -+ } -+ -+ switch (hinfo->hash_version) { -+ case DX_HASH_LEGACY: -+ hash = dx_hack_hash(name, len); -+ break; -+ case DX_HASH_HALF_MD4: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 8); -+ halfMD4Transform(buf, in); -+ len -= 32; -+ p += 32; -+ } -+ minor_hash = buf[2]; -+ hash = buf[1]; -+ break; -+ case DX_HASH_TEA: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 4); -+ TEA_transform(buf, in); -+ len -= 16; -+ p += 16; -+ } -+ hash = buf[0]; -+ minor_hash = buf[1]; -+ break; -+ default: -+ hinfo->hash = 0; -+ return -1; -+ } -+ hinfo->hash = hash & ~1; -+ hinfo->minor_hash = minor_hash; -+ return 0; -+} ---- linux-2.4.20/fs/ext3/namei.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/namei.c Sat Apr 5 03:56:31 2003 -@@ -16,6 +16,12 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 -+ * Hash Tree Directory indexing (c) -+ * Daniel Phillips, 2001 -+ * Hash Tree Directory indexing porting -+ * Christopher Li, 2002 -+ * Hash Tree Directory indexing cleanup -+ * Theodore Ts'o, 2002 - */ - - #include <linux/fs.h> -@@ -38,6 +44,630 @@ - #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) - #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) - -+static struct buffer_head *ext3_append(handle_t *handle, -+ struct inode *inode, -+ u32 *block, int *err) -+{ -+ struct buffer_head *bh; -+ -+ *block = inode->i_size >> inode->i_sb->s_blocksize_bits; -+ -+ if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -+ inode->i_size += inode->i_sb->s_blocksize; -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_journal_get_write_access(handle,bh); -+ } -+ return bh; -+} -+ -+#ifndef assert -+#define assert(test) J_ASSERT(test) -+#endif -+ -+#ifndef swap -+#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0) -+#endif -+ -+typedef struct { u32 v; } le_u32; -+typedef struct { u16 v; } le_u16; -+ -+#ifdef DX_DEBUG -+#define dxtrace(command) command -+#else -+#define dxtrace(command) -+#endif -+ -+struct fake_dirent -+{ -+ /*le*/u32 inode; -+ /*le*/u16 rec_len; -+ u8 name_len; -+ u8 file_type; -+}; -+ -+struct dx_countlimit -+{ -+ le_u16 limit; -+ le_u16 count; -+}; -+ -+struct dx_entry -+{ -+ le_u32 hash; -+ le_u32 block; -+}; -+ -+/* -+ * dx_root_info is laid out so that if it should somehow get overlaid by a -+ * dirent the two low bits of the hash version will be zero. Therefore, the -+ * hash version mod 4 should never be 0. Sincerely, the paranoia department. -+ */ -+ -+struct dx_root -+{ -+ struct fake_dirent dot; -+ char dot_name[4]; -+ struct fake_dirent dotdot; -+ char dotdot_name[4]; -+ struct dx_root_info -+ { -+ le_u32 reserved_zero; -+ u8 hash_version; -+ u8 info_length; /* 8 */ -+ u8 indirect_levels; -+ u8 unused_flags; -+ } -+ info; -+ struct dx_entry entries[0]; -+}; -+ -+struct dx_node -+{ -+ struct fake_dirent fake; -+ struct dx_entry entries[0]; -+}; -+ -+ -+struct dx_frame -+{ -+ struct buffer_head *bh; -+ struct dx_entry *entries; -+ struct dx_entry *at; -+}; -+ -+struct dx_map_entry -+{ -+ u32 hash; -+ u32 offs; -+}; -+ -+#ifdef CONFIG_EXT3_INDEX -+static inline unsigned dx_get_block (struct dx_entry *entry); -+static void dx_set_block (struct dx_entry *entry, unsigned value); -+static inline unsigned dx_get_hash (struct dx_entry *entry); -+static void dx_set_hash (struct dx_entry *entry, unsigned value); -+static unsigned dx_get_count (struct dx_entry *entries); -+static unsigned dx_get_limit (struct dx_entry *entries); -+static void dx_set_count (struct dx_entry *entries, unsigned value); -+static void dx_set_limit (struct dx_entry *entries, unsigned value); -+static unsigned dx_root_limit (struct inode *dir, unsigned infosize); -+static unsigned dx_node_limit (struct inode *dir); -+static struct dx_frame *dx_probe(struct dentry *dentry, -+ struct inode *dir, -+ struct dx_hash_info *hinfo, -+ struct dx_frame *frame, -+ int *err); -+static void dx_release (struct dx_frame *frames); -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry map[]); -+static void dx_sort_map(struct dx_map_entry *map, unsigned count); -+static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, -+ struct dx_map_entry *offsets, int count); -+static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); -+static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash); -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err); -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode); -+ -+/* -+ * Future: use high four bits of block for coalesce-on-delete flags -+ * Mask them off for now. -+ */ -+ -+static inline unsigned dx_get_block (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->block.v) & 0x00ffffff; -+} -+ -+static inline void dx_set_block (struct dx_entry *entry, unsigned value) -+{ -+ entry->block.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_hash (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->hash.v); -+} -+ -+static inline void dx_set_hash (struct dx_entry *entry, unsigned value) -+{ -+ entry->hash.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_count (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->count.v); -+} -+ -+static inline unsigned dx_get_limit (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->limit.v); -+} -+ -+static inline void dx_set_count (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->count.v = cpu_to_le16(value); -+} -+ -+static inline void dx_set_limit (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->limit.v = cpu_to_le16(value); -+} -+ -+static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - -+ EXT3_DIR_REC_LEN(2) - infosize; -+ return 0? 20: entry_space / sizeof(struct dx_entry); -+} -+ -+static inline unsigned dx_node_limit (struct inode *dir) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); -+ return 0? 22: entry_space / sizeof(struct dx_entry); -+} -+ -+/* -+ * Debug -+ */ -+#ifdef DX_DEBUG -+struct stats -+{ -+ unsigned names; -+ unsigned space; -+ unsigned bcount; -+}; -+ -+static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, -+ int size, int show_names) -+{ -+ unsigned names = 0, space = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ printk("names: "); -+ while ((char *) de < base + size) -+ { -+ if (de->inode) -+ { -+ if (show_names) -+ { -+ int len = de->name_len; -+ char *name = de->name; -+ while (len--) printk("%c", *name++); -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ printk(":%x.%u ", h.hash, -+ ((char *) de - base)); -+ } -+ space += EXT3_DIR_REC_LEN(de->name_len); -+ names++; -+ } -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ printk("(%i)\n", names); -+ return (struct stats) { names, space, 1 }; -+} -+ -+struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, -+ struct dx_entry *entries, int levels) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count = dx_get_count (entries), names = 0, space = 0, i; -+ unsigned bcount = 0; -+ struct buffer_head *bh; -+ int err; -+ printk("%i indexed blocks...\n", count); -+ for (i = 0; i < count; i++, entries++) -+ { -+ u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; -+ u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; -+ struct stats stats; -+ printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); -+ if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; -+ stats = levels? -+ dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): -+ dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); -+ names += stats.names; -+ space += stats.space; -+ bcount += stats.bcount; -+ brelse (bh); -+ } -+ if (bcount) -+ printk("%snames %u, fullness %u (%u%%)\n", levels?"":" ", -+ names, space/bcount,(space/bcount)*100/blocksize); -+ return (struct stats) { names, space, bcount}; -+} -+#endif /* DX_DEBUG */ -+ -+/* -+ * Probe for a directory leaf block to search. -+ * -+ * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -+ * error in the directory index, and the caller should fall back to -+ * searching the directory normally. The callers of dx_probe **MUST** -+ * check for this error code, and make sure it never gets reflected -+ * back to userspace. -+ */ -+static struct dx_frame * -+dx_probe(struct dentry *dentry, struct inode *dir, -+ struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) -+{ -+ unsigned count, indirect; -+ struct dx_entry *at, *entries, *p, *q, *m; -+ struct dx_root *root; -+ struct buffer_head *bh; -+ struct dx_frame *frame = frame_in; -+ u32 hash; -+ -+ frame->bh = NULL; -+ if (dentry) -+ dir = dentry->d_parent->d_inode; -+ if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) -+ goto fail; -+ root = (struct dx_root *) bh->b_data; -+ if (root->info.hash_version != DX_HASH_TEA && -+ root->info.hash_version != DX_HASH_HALF_MD4 && -+ root->info.hash_version != DX_HASH_LEGACY) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unrecognised inode hash code %d", -+ root->info.hash_version); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ hinfo->hash_version = root->info.hash_version; -+ hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ if (dentry) -+ ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ hash = hinfo->hash; -+ -+ if (root->info.unused_flags & 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash flags: %#06x", -+ root->info.unused_flags); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ if ((indirect = root->info.indirect_levels) > 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash depth: %#06x", -+ root->info.indirect_levels); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ while (1) -+ { -+ count = dx_get_count(entries); -+ assert (count && count <= dx_get_limit(entries)); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ dxtrace(printk(".")); -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ -+ if (0) // linear search cross check -+ { -+ unsigned n = count - 1; -+ at = entries; -+ while (n--) -+ { -+ dxtrace(printk(",")); -+ if (dx_get_hash(++at) > hash) -+ { -+ at--; -+ break; -+ } -+ } -+ assert (at == p - 1); -+ } -+ -+ at = p - 1; -+ dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ frame->bh = bh; -+ frame->entries = entries; -+ frame->at = at; -+ if (!indirect--) return frame; -+ if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ goto fail2; -+ at = entries = ((struct dx_node *) bh->b_data)->entries; -+ assert (dx_get_limit(entries) == dx_node_limit (dir)); -+ frame++; -+ } -+fail2: -+ while (frame >= frame_in) { -+ brelse(frame->bh); -+ frame--; -+ } -+fail: -+ return NULL; -+} -+ -+static void dx_release (struct dx_frame *frames) -+{ -+ if (frames[0].bh == NULL) -+ return; -+ -+ if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ brelse(frames[1].bh); -+ brelse(frames[0].bh); -+} -+ -+/* -+ * This function increments the frame pointer to search the next leaf -+ * block, and reads in the necessary intervening nodes if the search -+ * should be necessary. Whether or not the search is necessary is -+ * controlled by the hash parameter. If the hash value is even, then -+ * the search is only continued if the next block starts with that -+ * hash value. This is used if we are searching for a specific file. -+ * -+ * If the hash value is HASH_NB_ALWAYS, then always go to the next block. -+ * -+ * This function returns 1 if the caller should continue to search, -+ * or 0 if it should not. If there is an error reading one of the -+ * index blocks, it will return -1. -+ * -+ * If start_hash is non-null, it will be filled in with the starting -+ * hash of the next page. -+ */ -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash) -+{ -+ struct dx_frame *p; -+ struct buffer_head *bh; -+ int num_frames = 0; -+ __u32 bhash; -+ -+ *err = ENOENT; -+ p = frame; -+ /* -+ * Find the next leaf page by incrementing the frame pointer. -+ * If we run out of entries in the interior node, loop around and -+ * increment pointer in the parent node. When we break out of -+ * this loop, num_frames indicates the number of interior -+ * nodes need to be read. -+ */ -+ while (1) { -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ break; -+ if (p == frames) -+ return 0; -+ num_frames++; -+ p--; -+ } -+ -+ /* -+ * If the hash is 1, then continue only if the next page has a -+ * continuation hash of any value. This is used for readdir -+ * handling. Otherwise, check to see if the hash matches the -+ * desired contiuation hash. If it doesn't, return since -+ * there's no point to read in the successive index pages. -+ */ -+ bhash = dx_get_hash(p->at); -+ if (start_hash) -+ *start_hash = bhash; -+ if ((hash & 1) == 0) { -+ if ((bhash & ~1) != hash) -+ return 0; -+ } -+ /* -+ * If the hash is HASH_NB_ALWAYS, we always go to the next -+ * block so no check is necessary -+ */ -+ while (num_frames--) { -+ if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -+ 0, err))) -+ return -1; /* Failure */ -+ p++; -+ brelse (p->bh); -+ p->bh = bh; -+ p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ } -+ return 1; -+} -+ -+ -+/* -+ * p is at least 6 bytes before the end of page -+ */ -+static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) -+{ -+ return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); -+} -+ -+/* -+ * This function fills a red-black tree with information from a -+ * directory. We start scanning the directory in hash order, starting -+ * at start_hash and start_minor_hash. -+ * -+ * This function returns the number of entries inserted into the tree, -+ * or a negative error code. -+ */ -+int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash) -+{ -+ struct dx_hash_info hinfo; -+ struct buffer_head *bh; -+ struct ext3_dir_entry_2 *de, *top; -+ static struct dx_frame frames[2], *frame; -+ struct inode *dir; -+ int block, err; -+ int count = 0; -+ int ret; -+ __u32 hashval; -+ -+ dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, -+ start_minor_hash)); -+ dir = dir_file->f_dentry->d_inode; -+ hinfo.hash = start_hash; -+ hinfo.minor_hash = 0; -+ frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ -+ while (1) { -+ block = dx_get_block(frame->at); -+ dxtrace(printk("Reading block %d\n", block)); -+ if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) -+ goto errout; -+ -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) { -+ ext3fs_dirhash(de->name, de->name_len, &hinfo); -+ if ((hinfo.hash < start_hash) || -+ ((hinfo.hash == start_hash) && -+ (hinfo.minor_hash < start_minor_hash))) -+ continue; -+ ext3_htree_store_dirent(dir_file, hinfo.hash, -+ hinfo.minor_hash, de); -+ count++; -+ } -+ brelse (bh); -+ hashval = ~1; -+ ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, -+ frame, frames, &err, &hashval); -+ if (next_hash) -+ *next_hash = hashval; -+ if (ret == -1) -+ goto errout; -+ /* -+ * Stop if: (a) there are no more entries, or -+ * (b) we have inserted at least one entry and the -+ * next hash value is not a continuation -+ */ -+ if ((ret == 0) || -+ (count && ((hashval & 1) == 0))) -+ break; -+ } -+ dx_release(frames); -+ dxtrace(printk("Fill tree: returned %d entries\n", count)); -+ return count; -+errout: -+ dx_release(frames); -+ return (err); -+} -+ -+ -+/* -+ * Directory block splitting, compacting -+ */ -+ -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) -+{ -+ int count = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ while ((char *) de < base + size) -+ { -+ if (de->name_len && de->inode) { -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ map_tail--; -+ map_tail->hash = h.hash; -+ map_tail->offs = (u32) ((char *) de - base); -+ count++; -+ } -+ /* XXX: do we need to check rec_len == 0 case? -Chris */ -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ return count; -+} -+ -+static void dx_sort_map (struct dx_map_entry *map, unsigned count) -+{ -+ struct dx_map_entry *p, *q, *top = map + count - 1; -+ int more; -+ /* Combsort until bubble sort doesn't suck */ -+ while (count > 2) -+ { -+ count = count*10/13; -+ if (count - 9 < 2) /* 9, 10 -> 11 */ -+ count = 11; -+ for (p = top, q = p - count; q >= map; p--, q--) -+ if (p->hash < q->hash) -+ swap(*p, *q); -+ } -+ /* Garden variety bubble sort */ -+ do { -+ more = 0; -+ q = top; -+ while (q-- > map) -+ { -+ if (q[1].hash >= q[0].hash) -+ continue; -+ swap(*(q+1), *q); -+ more = 1; -+ } -+ } while(more); -+} -+ -+static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+{ -+ struct dx_entry *entries = frame->entries; -+ struct dx_entry *old = frame->at, *new = old + 1; -+ int count = dx_get_count(entries); -+ -+ assert(count < dx_get_limit(entries)); -+ assert(old < entries + count); -+ memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); -+ dx_set_hash(new, hash); -+ dx_set_block(new, block); -+ dx_set_count(entries, count + 1); -+} -+#endif -+ -+ -+static void ext3_update_dx_flag(struct inode *inode) -+{ -+ if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, -+ EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; -+} -+ - /* - * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. - * -@@ -94,6 +724,7 @@ static int inline search_dirblock(struct - return 0; - } - -+ - /* - * ext3_find_entry() - * -@@ -105,6 +736,8 @@ static int inline search_dirblock(struct - * The returned buffer_head has ->b_count elevated. The caller is expected - * to brelse() it when appropriate. - */ -+ -+ - static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) - { -@@ -119,12 +752,32 @@ static struct buffer_head * ext3_find_en - int num = 0; - int nblocks, i, err; - struct inode *dir = dentry->d_parent->d_inode; -+ int namelen; -+ const u8 *name; -+ unsigned blocksize; - - *res_dir = NULL; - sb = dir->i_sb; -- -+ blocksize = sb->s_blocksize; -+ namelen = dentry->d_name.len; -+ name = dentry->d_name.name; -+ if (namelen > EXT3_NAME_LEN) -+ return NULL; -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ /* -+ * On success, or if the error was file not found, -+ * return. Otherwise, fall back to doing a search the -+ * old fashioned way. -+ */ -+ if (bh || (err != ERR_BAD_DX_DIR)) -+ return bh; -+ dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ } -+#endif - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); -- start = dir->u.ext3_i.i_dir_start_lookup; -+ start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) - start = 0; - block = start; -@@ -165,7 +818,7 @@ restart: - i = search_dirblock(bh, dir, dentry, - block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); - if (i == 1) { -- dir->u.ext3_i.i_dir_start_lookup = block; -+ EXT3_I(dir)->i_dir_start_lookup = block; - ret = bh; - goto cleanup_and_exit; - } else { -@@ -196,6 +849,66 @@ cleanup_and_exit: - return ret; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err) -+{ -+ struct super_block * sb; -+ struct dx_hash_info hinfo; -+ u32 hash; -+ struct dx_frame frames[2], *frame; -+ struct ext3_dir_entry_2 *de, *top; -+ struct buffer_head *bh; -+ unsigned long block; -+ int retval; -+ int namelen = dentry->d_name.len; -+ const u8 *name = dentry->d_name.name; -+ struct inode *dir = dentry->d_parent->d_inode; -+ -+ sb = dir->i_sb; -+ if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+ return NULL; -+ hash = hinfo.hash; -+ do { -+ block = dx_get_block(frame->at); -+ if (!(bh = ext3_bread (NULL,dir, block, 0, err))) -+ goto errout; -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) -+ if (ext3_match (namelen, name, de)) { -+ if (!ext3_check_dir_entry("ext3_find_entry", -+ dir, de, bh, -+ (block<<EXT3_BLOCK_SIZE_BITS(sb)) -+ +((char *)de - bh->b_data))) { -+ brelse (bh); -+ goto errout; -+ } -+ *res_dir = de; -+ dx_release (frames); -+ return bh; -+ } -+ brelse (bh); -+ /* Check to see if we should continue to search */ -+ retval = ext3_htree_next_block(dir, hash, frame, -+ frames, err, 0); -+ if (retval == -1) { -+ ext3_warning(sb, __FUNCTION__, -+ "error reading index page in directory #%lu", -+ dir->i_ino); -+ goto errout; -+ } -+ } while (retval == 1); -+ -+ *err = -ENOENT; -+errout: -+ dxtrace(printk("%s not found\n", name)); -+ dx_release (frames); -+ return NULL; -+} -+#endif -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -212,8 +925,9 @@ static struct dentry *ext3_lookup(struct - brelse (bh); - inode = iget(dir->i_sb, ino); - -- if (!inode) -+ if (!inode) { - return ERR_PTR(-EACCES); -+ } - } - d_add(dentry, inode); - return NULL; -@@ -237,6 +951,301 @@ static inline void ext3_set_de_type(stru - de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct ext3_dir_entry_2 * -+dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) -+{ -+ unsigned rec_len = 0; -+ -+ while (count--) { -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); -+ de->inode = 0; -+ map++; -+ to += rec_len; -+ } -+ return (struct ext3_dir_entry_2 *) (to - rec_len); -+} -+ -+static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) -+{ -+ struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ unsigned rec_len = 0; -+ -+ prev = to = de; -+ while ((char*)de < base + size) { -+ next = (struct ext3_dir_entry_2 *) ((char *) de + -+ le16_to_cpu(de->rec_len)); -+ if (de->inode && de->name_len) { -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ if (de > to) -+ memmove(to, de, rec_len); -+ to->rec_len = cpu_to_le16(rec_len); -+ prev = to; -+ to = (struct ext3_dir_entry_2 *)((char *)to + rec_len); -+ } -+ de = next; -+ } -+ return prev; -+} -+ -+static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, -+ struct buffer_head **bh,struct dx_frame *frame, -+ struct dx_hash_info *hinfo, int *error) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count, continued; -+ struct buffer_head *bh2; -+ u32 newblock; -+ u32 hash2; -+ struct dx_map_entry *map; -+ char *data1 = (*bh)->b_data, *data2; -+ unsigned split; -+ struct ext3_dir_entry_2 *de = NULL, *de2; -+ int err; -+ -+ bh2 = ext3_append (handle, dir, &newblock, error); -+ if (!(bh2)) { -+ brelse(*bh); -+ *bh = NULL; -+ goto errout; -+ } -+ -+ BUFFER_TRACE(*bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, *bh); -+ if (err) { -+ journal_error: -+ brelse(*bh); -+ brelse(bh2); -+ *bh = NULL; -+ ext3_std_error(dir->i_sb, err); -+ goto errout; -+ } -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ -+ data2 = bh2->b_data; -+ -+ /* create map in the end of data2 block */ -+ map = (struct dx_map_entry *) (data2 + blocksize); -+ count = dx_make_map ((struct ext3_dir_entry_2 *) data1, -+ blocksize, hinfo, map); -+ map -= count; -+ split = count/2; // need to adjust to actual middle -+ dx_sort_map (map, count); -+ hash2 = map[split].hash; -+ continued = hash2 == map[split - 1].hash; -+ dxtrace(printk("Split block %i at %x, %i/%i\n", -+ dx_get_block(frame->at), hash2, split, count-split)); -+ -+ /* Fancy dance to stay within two buffers */ -+ de2 = dx_move_dirents(data1, data2, map + split, count - split); -+ de = dx_pack_dirents(data1,blocksize); -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ -+ /* Which block gets the new entry? */ -+ if (hinfo->hash >= hash2) -+ { -+ swap(*bh, bh2); -+ de = de2; -+ } -+ dx_insert_block (frame, hash2 + continued, newblock); -+ err = ext3_journal_dirty_metadata (handle, bh2); -+ if (err) -+ goto journal_error; -+ err = ext3_journal_dirty_metadata (handle, frame->bh); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ dxtrace(dx_show_index ("frame", frame->entries)); -+errout: -+ return de; -+} -+#endif -+ -+ -+/* -+ * Add a new entry into a directory (leaf) block. If de is non-NULL, -+ * it points to a directory entry which is guaranteed to be large -+ * enough for new directory entry. If de is NULL, then -+ * add_dirent_to_buf will attempt search the directory block for -+ * space. It will return -ENOSPC if no space is available, and -EIO -+ * and -EEXIST if directory entry already exists. -+ * -+ * NOTE! bh is NOT released in the case where ENOSPC is returned. In -+ * all other cases bh is released. -+ */ -+static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct ext3_dir_entry_2 *de, -+ struct buffer_head * bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ unsigned long offset = 0; -+ unsigned short reclen; -+ int nlen, rlen, err; -+ char *top; -+ -+ reclen = EXT3_DIR_REC_LEN(namelen); -+ if (!de) { -+ de = (struct ext3_dir_entry_2 *)bh->b_data; -+ top = bh->b_data + dir->i_sb->s_blocksize - reclen; -+ while ((char *) de <= top) { -+ if (!ext3_check_dir_entry("ext3_add_entry", dir, de, -+ bh, offset)) { -+ brelse (bh); -+ return -EIO; -+ } -+ if (ext3_match (namelen, name, de)) { -+ brelse (bh); -+ return -EEXIST; -+ } -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if ((de->inode? rlen - nlen: rlen) >= reclen) -+ break; -+ de = (struct ext3_dir_entry_2 *)((char *)de + rlen); -+ offset += rlen; -+ } -+ if ((char *) de > top) -+ return -ENOSPC; -+ } -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) { -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return err; -+ } -+ -+ /* By now the buffer is marked for journaling */ -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if (de->inode) { -+ struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ de1->rec_len = cpu_to_le16(rlen - nlen); -+ de->rec_len = cpu_to_le16(nlen); -+ de = de1; -+ } -+ de->file_type = EXT3_FT_UNKNOWN; -+ if (inode) { -+ de->inode = cpu_to_le32(inode->i_ino); -+ ext3_set_de_type(dir->i_sb, de, inode->i_mode); -+ } else -+ de->inode = 0; -+ de->name_len = namelen; -+ memcpy (de->name, name, namelen); -+ /* -+ * XXX shouldn't update any times until successful -+ * completion of syscall, but too many callers depend -+ * on this. -+ * -+ * XXX similarly, too many callers depend on -+ * ext3_new_inode() setting the times, but error -+ * recovery deletes the inode, so the worst that can -+ * happen is that the times are slightly out of date -+ * and/or different from the directory change time. -+ */ -+ dir->i_mtime = dir->i_ctime = CURRENT_TIME; -+ ext3_update_dx_flag(dir); -+ dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return 0; -+} -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * This converts a one block unindexed directory to a 3 block indexed -+ * directory, and adds the dentry to the indexed directory. -+ */ -+static int make_indexed_dir(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct buffer_head *bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ struct buffer_head *bh2; -+ struct dx_root *root; -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries; -+ struct ext3_dir_entry_2 *de, *de2; -+ char *data1, *top; -+ unsigned len; -+ int retval; -+ unsigned blocksize; -+ struct dx_hash_info hinfo; -+ u32 block; -+ -+ blocksize = dir->i_sb->s_blocksize; -+ dxtrace(printk("Creating index\n")); -+ retval = ext3_journal_get_write_access(handle, bh); -+ if (retval) { -+ ext3_std_error(dir->i_sb, retval); -+ brelse(bh); -+ return retval; -+ } -+ root = (struct dx_root *) bh->b_data; -+ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ bh2 = ext3_append (handle, dir, &block, &retval); -+ if (!(bh2)) { -+ brelse(bh); -+ return retval; -+ } -+ data1 = bh2->b_data; -+ -+ /* The 0th block becomes the root, move the dirents out */ -+ de = (struct ext3_dir_entry_2 *)&root->dotdot; -+ de = (struct ext3_dir_entry_2 *)((char *)de + le16_to_cpu(de->rec_len)); -+ len = ((char *) root) + blocksize - (char *) de; -+ memcpy (data1, de, len); -+ de = (struct ext3_dir_entry_2 *) data1; -+ top = data1 + len; -+ while (((char *) de2=(char*)de+le16_to_cpu(de->rec_len)) < top) -+ de = de2; -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ /* Initialize the root; the dot dirents already exist */ -+ de = (struct ext3_dir_entry_2 *) (&root->dotdot); -+ de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); -+ memset (&root->info, 0, sizeof(root->info)); -+ root->info.info_length = sizeof(root->info); -+ root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ entries = root->entries; -+ dx_set_block (entries, 1); -+ dx_set_count (entries, 1); -+ dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info))); -+ -+ /* Initialize as for dx_probe */ -+ hinfo.hash_version = root->info.hash_version; -+ hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ ext3fs_dirhash(name, namelen, &hinfo); -+ frame = frames; -+ frame->entries = entries; -+ frame->at = entries; -+ frame->bh = bh; -+ bh = bh2; -+ de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ dx_release (frames); -+ if (!(de)) -+ return retval; -+ -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} -+#endif -+ - /* - * ext3_add_entry() - * -@@ -247,127 +1255,198 @@ static inline void ext3_set_de_type(stru - * may not sleep between calling this and putting something into - * the entry, as someone else might have used it while you slept. - */ -- --/* -- * AKPM: the journalling code here looks wrong on the error paths -- */ - static int ext3_add_entry (handle_t *handle, struct dentry *dentry, - struct inode *inode) - { - struct inode *dir = dentry->d_parent->d_inode; -- const char *name = dentry->d_name.name; -- int namelen = dentry->d_name.len; - unsigned long offset; -- unsigned short rec_len; - struct buffer_head * bh; -- struct ext3_dir_entry_2 * de, * de1; -+ struct ext3_dir_entry_2 *de; - struct super_block * sb; - int retval; -+#ifdef CONFIG_EXT3_INDEX -+ int dx_fallback=0; -+#endif -+ unsigned blocksize; -+ unsigned nlen, rlen; -+ u32 block, blocks; - - sb = dir->i_sb; -- -- if (!namelen) -+ blocksize = sb->s_blocksize; -+ if (!dentry->d_name.len) - return -EINVAL; -- bh = ext3_bread (handle, dir, 0, 0, &retval); -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ retval = ext3_dx_add_entry(handle, dentry, inode); -+ if (!retval || (retval != ERR_BAD_DX_DIR)) -+ return retval; -+ EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; -+ dx_fallback++; -+ ext3_mark_inode_dirty(handle, dir); -+ } -+#endif -+ blocks = dir->i_size >> sb->s_blocksize_bits; -+ for (block = 0, offset = 0; block < blocks; block++) { -+ bh = ext3_bread(handle, dir, block, 0, &retval); -+ if(!bh) -+ return retval; -+ retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (retval != -ENOSPC) -+ return retval; -+ -+#ifdef CONFIG_EXT3_INDEX -+ if (blocks == 1 && !dx_fallback && -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ return make_indexed_dir(handle, dentry, inode, bh); -+#endif -+ brelse(bh); -+ } -+ bh = ext3_append(handle, dir, &block, &retval); - if (!bh) - return retval; -- rec_len = EXT3_DIR_REC_LEN(namelen); -- offset = 0; - de = (struct ext3_dir_entry_2 *) bh->b_data; -- while (1) { -- if ((char *)de >= sb->s_blocksize + bh->b_data) { -- brelse (bh); -- bh = NULL; -- bh = ext3_bread (handle, dir, -- offset >> EXT3_BLOCK_SIZE_BITS(sb), 1, &retval); -- if (!bh) -- return retval; -- if (dir->i_size <= offset) { -- if (dir->i_size == 0) { -- brelse(bh); -- return -ENOENT; -- } -+ de->inode = 0; -+ de->rec_len = cpu_to_le16(rlen = blocksize); -+ nlen = 0; -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} - -- ext3_debug ("creating next block\n"); -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * Returns 0 for success, or a negative error value -+ */ -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries, *at; -+ struct dx_hash_info hinfo; -+ struct buffer_head * bh; -+ struct inode *dir = dentry->d_parent->d_inode; -+ struct super_block * sb = dir->i_sb; -+ struct ext3_dir_entry_2 *de; -+ int err; - -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- de->inode = 0; -- de->rec_len = le16_to_cpu(sb->s_blocksize); -- dir->u.ext3_i.i_disksize = -- dir->i_size = offset + sb->s_blocksize; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); -- } else { -+ frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ entries = frame->entries; -+ at = frame->at; - -- ext3_debug ("skipping to next block\n"); -+ if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ goto cleanup; - -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- } -- } -- if (!ext3_check_dir_entry ("ext3_add_entry", dir, de, bh, -- offset)) { -- brelse (bh); -- return -ENOENT; -- } -- if (ext3_match (namelen, name, de)) { -- brelse (bh); -- return -EEXIST; -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto journal_error; -+ -+ err = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (err != -ENOSPC) { -+ bh = 0; -+ goto cleanup; -+ } -+ -+ /* Block full, should compress but for now just split */ -+ dxtrace(printk("using %u of %u node entries\n", -+ dx_get_count(entries), dx_get_limit(entries))); -+ /* Need to split index? */ -+ if (dx_get_count(entries) == dx_get_limit(entries)) { -+ u32 newblock; -+ unsigned icount = dx_get_count(entries); -+ int levels = frame - frames; -+ struct dx_entry *entries2; -+ struct dx_node *node2; -+ struct buffer_head *bh2; -+ -+ if (levels && (dx_get_count(frames->entries) == -+ dx_get_limit(frames->entries))) { -+ ext3_warning(sb, __FUNCTION__, -+ "Directory index full!\n"); -+ err = -ENOSPC; -+ goto cleanup; - } -- if ((le32_to_cpu(de->inode) == 0 && -- le16_to_cpu(de->rec_len) >= rec_len) || -- (le16_to_cpu(de->rec_len) >= -- EXT3_DIR_REC_LEN(de->name_len) + rec_len)) { -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- /* By now the buffer is marked for journaling */ -- offset += le16_to_cpu(de->rec_len); -- if (le32_to_cpu(de->inode)) { -- de1 = (struct ext3_dir_entry_2 *) ((char *) de + -- EXT3_DIR_REC_LEN(de->name_len)); -- de1->rec_len = -- cpu_to_le16(le16_to_cpu(de->rec_len) - -- EXT3_DIR_REC_LEN(de->name_len)); -- de->rec_len = cpu_to_le16( -- EXT3_DIR_REC_LEN(de->name_len)); -- de = de1; -+ bh2 = ext3_append (handle, dir, &newblock, &err); -+ if (!(bh2)) -+ goto cleanup; -+ node2 = (struct dx_node *)(bh2->b_data); -+ entries2 = node2->entries; -+ node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -+ node2->fake.inode = 0; -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ if (levels) { -+ unsigned icount1 = icount/2, icount2 = icount - icount1; -+ unsigned hash2 = dx_get_hash(entries + icount1); -+ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ err = ext3_journal_get_write_access(handle, -+ frames[0].bh); -+ if (err) -+ goto journal_error; -+ -+ memcpy ((char *) entries2, (char *) (entries + icount1), -+ icount2 * sizeof(struct dx_entry)); -+ dx_set_count (entries, icount1); -+ dx_set_count (entries2, icount2); -+ dx_set_limit (entries2, dx_node_limit(dir)); -+ -+ /* Which index block gets the new entry? */ -+ if (at - entries >= icount1) { -+ frame->at = at = at - entries - icount1 + entries2; -+ frame->entries = entries = entries2; -+ swap(frame->bh, bh2); - } -- de->file_type = EXT3_FT_UNKNOWN; -- if (inode) { -- de->inode = cpu_to_le32(inode->i_ino); -- ext3_set_de_type(dir->i_sb, de, inode->i_mode); -- } else -- de->inode = 0; -- de->name_len = namelen; -- memcpy (de->name, name, namelen); -- /* -- * XXX shouldn't update any times until successful -- * completion of syscall, but too many callers depend -- * on this. -- * -- * XXX similarly, too many callers depend on -- * ext3_new_inode() setting the times, but error -- * recovery deletes the inode, so the worst that can -- * happen is that the times are slightly out of date -- * and/or different from the directory change time. -- */ -- dir->i_mtime = dir->i_ctime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- 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); -- return 0; -+ dx_insert_block (frames + 0, hash2, newblock); -+ dxtrace(dx_show_index ("node", frames[1].entries)); -+ dxtrace(dx_show_index ("node", -+ ((struct dx_node *) bh2->b_data)->entries)); -+ err = ext3_journal_dirty_metadata(handle, bh2); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ } else { -+ dxtrace(printk("Creating second level index...\n")); -+ memcpy((char *) entries2, (char *) entries, -+ icount * sizeof(struct dx_entry)); -+ dx_set_limit(entries2, dx_node_limit(dir)); -+ -+ /* Set up root */ -+ dx_set_count(entries, 1); -+ dx_set_block(entries + 0, newblock); -+ ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ -+ /* Add new access path frame */ -+ frame = frames + 1; -+ frame->at = at = at - entries + entries2; -+ frame->entries = entries = entries2; -+ frame->bh = bh2; -+ err = ext3_journal_get_write_access(handle, -+ frame->bh); -+ if (err) -+ goto journal_error; - } -- offset += le16_to_cpu(de->rec_len); -- de = (struct ext3_dir_entry_2 *) -- ((char *) de + le16_to_cpu(de->rec_len)); -+ ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- brelse (bh); -- return -ENOSPC; -+ de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ if (!de) -+ goto cleanup; -+ err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ bh = 0; -+ goto cleanup; -+ -+journal_error: -+ ext3_std_error(dir->i_sb, err); -+cleanup: -+ if (bh) -+ brelse(bh); -+ dx_release(frames); -+ return err; - } -+#endif - - /* - * ext3_delete_entry deletes a directory entry by merging it with the -@@ -451,9 +1530,11 @@ static int ext3_create (struct inode * d - struct inode * inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -478,9 +1559,11 @@ static int ext3_mknod (struct inode * di - struct inode *inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -507,9 +1590,11 @@ static int ext3_mkdir(struct inode * dir - if (dir->i_nlink >= EXT3_LINK_MAX) - return -EMLINK; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -521,7 +1606,7 @@ static int ext3_mkdir(struct inode * dir - - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -- inode->i_size = inode->u.ext3_i.i_disksize = inode->i_sb->s_blocksize; -+ inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; - inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { -@@ -554,21 +1639,19 @@ static int ext3_mkdir(struct inode * dir - inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); -- if (err) -- goto out_no_entry; -+ if (err) { -+ inode->i_nlink = 0; -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - dir->i_nlink++; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - d_instantiate(dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- inode->i_nlink = 0; -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - /* -@@ -655,7 +1738,7 @@ int ext3_orphan_add(handle_t *handle, st - int err = 0, rc; - - lock_super(sb); -- if (!list_empty(&inode->u.ext3_i.i_orphan)) -+ if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - - /* Orphan handling is only valid for files with data blocks -@@ -696,7 +1779,7 @@ int ext3_orphan_add(handle_t *handle, st - * This is safe: on error we're going to ignore the orphan list - * anyway on the next recovery. */ - if (!err) -- list_add(&inode->u.ext3_i.i_orphan, &EXT3_SB(sb)->s_orphan); -+ list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", -@@ -714,25 +1797,26 @@ out_unlock: - int ext3_orphan_del(handle_t *handle, struct inode *inode) - { - struct list_head *prev; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct ext3_sb_info *sbi; - ino_t ino_next; - struct ext3_iloc iloc; - int err = 0; - - lock_super(inode->i_sb); -- if (list_empty(&inode->u.ext3_i.i_orphan)) { -+ if (list_empty(&ei->i_orphan)) { - unlock_super(inode->i_sb); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); -- prev = inode->u.ext3_i.i_orphan.prev; -+ prev = ei->i_orphan.prev; - sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %ld from orphan list\n", inode->i_ino); - -- list_del(&inode->u.ext3_i.i_orphan); -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ list_del(&ei->i_orphan); -+ INIT_LIST_HEAD(&ei->i_orphan); - - /* If we're on an error path, we may not have a valid - * transaction handle with which to update the orphan list on -@@ -793,8 +1877,9 @@ static int ext3_rmdir (struct inode * di - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); -@@ -832,7 +1917,7 @@ static int ext3_rmdir (struct inode * di - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; - ext3_mark_inode_dirty(handle, inode); -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - - end_rmdir: -@@ -850,8 +1935,9 @@ static int ext3_unlink(struct inode * di - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -878,7 +1964,7 @@ static int ext3_unlink(struct inode * di - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - inode->i_nlink--; - if (!inode->i_nlink) -@@ -904,9 +1990,11 @@ static int ext3_symlink (struct inode * - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 5); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -916,7 +2004,7 @@ static int ext3_symlink (struct inode * - if (IS_ERR(inode)) - goto out_stop; - -- if (l > sizeof (inode->u.ext3_i.i_data)) { -+ if (l > sizeof (EXT3_I(inode)->i_data)) { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* -@@ -925,25 +2013,23 @@ static int ext3_symlink (struct inode * - * i_size in generic_commit_write(). - */ - err = block_symlink(inode, symname, l); -- if (err) -- goto out_no_entry; -+ if (err) { -+ ext3_dec_count(handle, inode); -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - } else { - inode->i_op = &ext3_fast_symlink_inode_operations; -- memcpy((char*)&inode->u.ext3_i.i_data,symname,l); -+ memcpy((char*)&EXT3_I(inode)->i_data,symname,l); - inode->i_size = l-1; - } -- inode->u.ext3_i.i_disksize = inode->i_size; -+ EXT3_I(inode)->i_disksize = inode->i_size; - err = ext3_add_nondir(handle, dentry, inode); - ext3_mark_inode_dirty(handle, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- ext3_dec_count(handle, inode); -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - static int ext3_link (struct dentry * old_dentry, -@@ -956,12 +2042,15 @@ static int ext3_link (struct dentry * ol - if (S_ISDIR(inode->i_mode)) - return -EPERM; - -- if (inode->i_nlink >= EXT3_LINK_MAX) -+ if (inode->i_nlink >= EXT3_LINK_MAX) { - return -EMLINK; -+ } - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -995,9 +2084,11 @@ static int ext3_rename (struct inode * o - - old_bh = new_bh = dir_bh = NULL; - -- handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + 2); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; -@@ -1077,7 +2168,7 @@ static int ext3_rename (struct inode * o - new_inode->i_ctime = CURRENT_TIME; - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; -- old_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(old_dir); - if (dir_bh) { - BUFFER_TRACE(dir_bh, "get_write_access"); - ext3_journal_get_write_access(handle, dir_bh); -@@ -1089,7 +2180,7 @@ static int ext3_rename (struct inode * o - new_inode->i_nlink--; - } else { - new_dir->i_nlink++; -- new_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(new_dir); - ext3_mark_inode_dirty(handle, new_dir); - } - } ---- linux-2.4.20/fs/ext3/super.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/super.c Sat Apr 5 03:56:31 2003 -@@ -707,6 +707,7 @@ static int ext3_setup_super(struct super - es->s_mtime = cpu_to_le32(CURRENT_TIME); - ext3_update_dynamic_rev(sb); - EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -+ - ext3_commit_super (sb, es, 1); - if (test_opt (sb, DEBUG)) - printk (KERN_INFO -@@ -717,6 +718,7 @@ static int ext3_setup_super(struct super - EXT3_BLOCKS_PER_GROUP(sb), - EXT3_INODES_PER_GROUP(sb), - sbi->s_mount_opt); -+ - printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ", - bdevname(sb->s_dev)); - if (EXT3_SB(sb)->s_journal->j_inode == NULL) { -@@ -890,6 +892,7 @@ static loff_t ext3_max_size(int bits) - return res; - } - -+ - struct super_block * ext3_read_super (struct super_block * sb, void * data, - int silent) - { -@@ -1066,6 +1069,9 @@ struct super_block * ext3_read_super (st - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+ for (i=0; i < 4; i++) -+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); -+ sbi->s_def_hash_version = es->s_def_hash_version; - - if (sbi->s_blocks_per_group > blocksize * 8) { - printk (KERN_ERR -@@ -1769,6 +1775,7 @@ static void __exit exit_ext3_fs(void) - unregister_filesystem(&ext3_fs_type); - } - -+EXPORT_SYMBOL(ext3_force_commit); - EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); ---- linux-2.4.20/include/linux/ext3_fs.h~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/include/linux/ext3_fs.h Sat Apr 5 03:56:31 2003 -@@ -40,6 +40,11 @@ - #define EXT3FS_VERSION "2.4-0.9.19" - - /* -+ * Always enable hashed directories -+ */ -+#define CONFIG_EXT3_INDEX -+ -+/* - * Debug code - */ - #ifdef EXT3FS_DEBUG -@@ -437,8 +442,11 @@ struct ext3_super_block { - /*E0*/ __u32 s_journal_inum; /* inode number of journal file */ - __u32 s_journal_dev; /* device number of journal file */ - __u32 s_last_orphan; /* start of list of inodes to delete */ -- --/*EC*/ __u32 s_reserved[197]; /* Padding to the end of the block */ -+ __u32 s_hash_seed[4]; /* HTREE hash seed */ -+ __u8 s_def_hash_version; /* Default hash version to use */ -+ __u8 s_reserved_char_pad; -+ __u16 s_reserved_word_pad; -+ __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -575,9 +583,46 @@ struct ext3_dir_entry_2 { - #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) - #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ - ~EXT3_DIR_ROUND) -+/* -+ * Hash Tree Directory indexing -+ * (c) Daniel Phillips, 2001 -+ */ -+ -+#ifdef CONFIG_EXT3_INDEX -+ #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ -+ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ -+ (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) -+#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) -+#else -+ #define is_dx(dir) 0 -+#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) -+#endif -+ -+/* Legal values for the dx_root hash_version field: */ -+ -+#define DX_HASH_LEGACY 0 -+#define DX_HASH_HALF_MD4 1 -+#define DX_HASH_TEA 2 -+ -+/* hash info structure used by the directory hash */ -+struct dx_hash_info -+{ -+ u32 hash; -+ u32 minor_hash; -+ int hash_version; -+ u32 *seed; -+}; - - #ifdef __KERNEL__ - /* -+ * Control parameters used by ext3_htree_next_block -+ */ -+#define HASH_NB_ALWAYS 1 -+ -+ -+/* - * Describe an inode's exact location on disk and in memory - */ - struct ext3_iloc -@@ -587,6 +632,27 @@ struct ext3_iloc - unsigned long block_group; - }; - -+ -+/* -+ * This structure is stuffed into the struct file's private_data field -+ * for directories. It is where we put information so that we can do -+ * readdir operations in hash tree order. -+ */ -+struct dir_private_info { -+ rb_root_t root; -+ rb_node_t *curr_node; -+ struct fname *extra_fname; -+ loff_t last_pos; -+ __u32 curr_hash; -+ __u32 curr_minor_hash; -+ __u32 next_hash; -+}; -+ -+/* -+ * Special error return code only used by dx_probe() and its callers. -+ */ -+#define ERR_BAD_DX_DIR -75000 -+ - /* - * Function prototypes - */ -@@ -614,11 +680,20 @@ extern struct ext3_group_desc * ext3_get - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, -- struct ext3_dir_entry_2 *, struct buffer_head *, -- unsigned long); -+ struct ext3_dir_entry_2 *, -+ struct buffer_head *, unsigned long); -+extern void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent); -+extern void ext3_htree_free_dir_info(struct dir_private_info *p); -+ - /* fsync.c */ - extern int ext3_sync_file (struct file *, struct dentry *, int); - -+/* hash.c */ -+extern int ext3fs_dirhash(const char *name, int len, struct -+ dx_hash_info *hinfo); -+ - /* ialloc.c */ - extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int); - extern void ext3_free_inode (handle_t *, struct inode *); -@@ -650,6 +725,8 @@ extern int ext3_ioctl (struct inode *, s - /* namei.c */ - extern int ext3_orphan_add(handle_t *, struct inode *); - extern int ext3_orphan_del(handle_t *, struct inode *); -+extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash); - - /* super.c */ - extern void ext3_error (struct super_block *, const char *, const char *, ...) ---- linux-2.4.20/include/linux/ext3_fs_sb.h~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/include/linux/ext3_fs_sb.h Sat Apr 5 03:56:31 2003 -@@ -62,6 +62,8 @@ struct ext3_sb_info { - int s_inode_size; - int s_first_ino; - u32 s_next_generation; -+ u32 s_hash_seed[4]; -+ int s_def_hash_version; - - /* Journaling */ - struct inode * s_journal_inode; ---- linux-2.4.20/include/linux/ext3_jbd.h~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/include/linux/ext3_jbd.h Sat Apr 5 03:56:31 2003 -@@ -63,6 +63,8 @@ extern int ext3_writepage_trans_blocks(s - - #define EXT3_RESERVE_TRANS_BLOCKS 12 - -+#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, ---- linux-2.4.20/include/linux/rbtree.h~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/include/linux/rbtree.h Sat Apr 5 03:56:31 2003 -@@ -120,6 +120,8 @@ rb_root_t; - - extern void rb_insert_color(rb_node_t *, rb_root_t *); - extern void rb_erase(rb_node_t *, rb_root_t *); -+extern rb_node_t *rb_get_first(rb_root_t *root); -+extern rb_node_t *rb_get_next(rb_node_t *n); - - static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link) - { ---- linux-2.4.20/lib/rbtree.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/lib/rbtree.c Sat Apr 5 03:56:31 2003 -@@ -17,6 +17,8 @@ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - linux/lib/rbtree.c -+ -+ rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002 - */ - - #include <linux/rbtree.h> -@@ -294,3 +296,43 @@ void rb_erase(rb_node_t * node, rb_root_ - __rb_erase_color(child, parent, root); - } - EXPORT_SYMBOL(rb_erase); -+ -+/* -+ * This function returns the first node (in sort order) of the tree. -+ */ -+rb_node_t *rb_get_first(rb_root_t *root) -+{ -+ rb_node_t *n; -+ -+ n = root->rb_node; -+ if (!n) -+ return 0; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+} -+EXPORT_SYMBOL(rb_get_first); -+ -+/* -+ * Given a node, this function will return the next node in the tree. -+ */ -+rb_node_t *rb_get_next(rb_node_t *n) -+{ -+ rb_node_t *parent; -+ -+ if (n->rb_right) { -+ n = n->rb_right; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+ } else { -+ while ((parent = n->rb_parent)) { -+ if (n == parent->rb_left) -+ return parent; -+ n = parent; -+ } -+ return 0; -+ } -+} -+EXPORT_SYMBOL(rb_get_next); -+ - -_ diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-1.patch b/lustre/kernel_patches/patches/ext-2.4-patch-1.patch deleted file mode 100644 index 28a1ad664e..0000000000 --- a/lustre/kernel_patches/patches/ext-2.4-patch-1.patch +++ /dev/null @@ -1,2528 +0,0 @@ - fs/ext3/Makefile | 2 - fs/ext3/dir.c | 299 +++++++++ - fs/ext3/file.c | 3 - fs/ext3/hash.c | 215 ++++++ - fs/ext3/namei.c | 1387 ++++++++++++++++++++++++++++++++++++++++----- - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 85 ++ - include/linux/ext3_fs_sb.h | 2 - include/linux/ext3_jbd.h | 2 - include/linux/rbtree.h | 2 - lib/rbtree.c | 42 + - 11 files changed, 1886 insertions(+), 160 deletions(-) - ---- linux-2.4.20/fs/ext3/Makefile~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/Makefile Sat Apr 5 03:57:05 2003 -@@ -12,7 +12,7 @@ O_TARGET := ext3.o - export-objs := super.o inode.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o -+ ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - - include $(TOPDIR)/Rules.make ---- linux-2.4.20/fs/ext3/dir.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/dir.c Sat Apr 5 03:56:31 2003 -@@ -21,12 +21,16 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/slab.h> -+#include <linux/rbtree.h> - - static unsigned char ext3_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK - }; - - static int ext3_readdir(struct file *, void *, filldir_t); -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir); - - struct file_operations ext3_dir_operations = { - read: generic_read_dir, -@@ -35,6 +39,17 @@ struct file_operations ext3_dir_operatio - fsync: ext3_sync_file, /* BKL held */ - }; - -+ -+static unsigned char get_dtype(struct super_block *sb, int filetype) -+{ -+ if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || -+ (filetype >= EXT3_FT_MAX)) -+ return DT_UNKNOWN; -+ -+ return (ext3_filetype_table[filetype]); -+} -+ -+ - int ext3_check_dir_entry (const char * function, struct inode * dir, - struct ext3_dir_entry_2 * de, - struct buffer_head * bh, -@@ -79,6 +94,16 @@ static int ext3_readdir(struct file * fi - - sb = inode->i_sb; - -+ if (is_dx(inode)) { -+ err = ext3_dx_readdir(filp, dirent, filldir); -+ if (err != ERR_BAD_DX_DIR) -+ return err; -+ /* -+ * We don't set the inode dirty flag since it's not -+ * critical that it get flushed back to the disk. -+ */ -+ EXT3_I(filp->f_dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; -+ } - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); -@@ -162,18 +187,12 @@ revalidate: - * during the copy operation. - */ - unsigned long version = filp->f_version; -- unsigned char d_type = DT_UNKNOWN; - -- if (EXT3_HAS_INCOMPAT_FEATURE(sb, -- EXT3_FEATURE_INCOMPAT_FILETYPE) -- && de->file_type < EXT3_FT_MAX) -- d_type = -- ext3_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, - le32_to_cpu(de->inode), -- d_type); -+ get_dtype(sb, de->file_type)); - if (error) - break; - if (version != filp->f_version) -@@ -188,3 +207,269 @@ revalidate: - UPDATE_ATIME(inode); - return 0; - } -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * These functions convert from the major/minor hash to an f_pos -+ * value. -+ * -+ * Currently we only use major hash numer. This is unfortunate, but -+ * on 32-bit machines, the same VFS interface is used for lseek and -+ * llseek, so if we use the 64 bit offset, then the 32-bit versions of -+ * lseek/telldir/seekdir will blow out spectacularly, and from within -+ * the ext2 low-level routine, we don't know if we're being called by -+ * a 64-bit version of the system call or the 32-bit version of the -+ * system call. Worse yet, NFSv2 only allows for a 32-bit readdir -+ * cookie. Sigh. -+ */ -+#define hash2pos(major, minor) (major >> 1) -+#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff) -+#define pos2min_hash(pos) (0) -+ -+/* -+ * This structure holds the nodes of the red-black tree used to store -+ * the directory entry in hash order. -+ */ -+struct fname { -+ __u32 hash; -+ __u32 minor_hash; -+ rb_node_t rb_hash; -+ struct fname *next; -+ __u32 inode; -+ __u8 name_len; -+ __u8 file_type; -+ char name[0]; -+}; -+ -+/* -+ * This functoin implements a non-recursive way of freeing all of the -+ * nodes in the red-black tree. -+ */ -+static void free_rb_tree_fname(rb_root_t *root) -+{ -+ rb_node_t *n = root->rb_node; -+ rb_node_t *parent; -+ struct fname *fname; -+ -+ while (n) { -+ /* Do the node's children first */ -+ if ((n)->rb_left) { -+ n = n->rb_left; -+ continue; -+ } -+ if (n->rb_right) { -+ n = n->rb_right; -+ continue; -+ } -+ /* -+ * The node has no children; free it, and then zero -+ * out parent's link to it. Finally go to the -+ * beginning of the loop and try to free the parent -+ * node. -+ */ -+ parent = n->rb_parent; -+ fname = rb_entry(n, struct fname, rb_hash); -+ kfree(fname); -+ if (!parent) -+ root->rb_node = 0; -+ else if (parent->rb_left == n) -+ parent->rb_left = 0; -+ else if (parent->rb_right == n) -+ parent->rb_right = 0; -+ n = parent; -+ } -+ root->rb_node = 0; -+} -+ -+ -+struct dir_private_info *create_dir_info(loff_t pos) -+{ -+ struct dir_private_info *p; -+ -+ p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL); -+ if (!p) -+ return NULL; -+ p->root.rb_node = 0; -+ p->curr_node = 0; -+ p->extra_fname = 0; -+ p->last_pos = 0; -+ p->curr_hash = pos2maj_hash(pos); -+ p->curr_minor_hash = pos2min_hash(pos); -+ p->next_hash = 0; -+ return p; -+} -+ -+void ext3_htree_free_dir_info(struct dir_private_info *p) -+{ -+ free_rb_tree_fname(&p->root); -+ kfree(p); -+} -+ -+/* -+ * Given a directory entry, enter it into the fname rb tree. -+ */ -+void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent) -+{ -+ rb_node_t **p, *parent = NULL; -+ struct fname * fname, *new_fn; -+ struct dir_private_info *info; -+ int len; -+ -+ info = (struct dir_private_info *) dir_file->private_data; -+ p = &info->root.rb_node; -+ -+ /* Create and allocate the fname structure */ -+ len = sizeof(struct fname) + dirent->name_len + 1; -+ new_fn = kmalloc(len, GFP_KERNEL); -+ memset(new_fn, 0, len); -+ new_fn->hash = hash; -+ new_fn->minor_hash = minor_hash; -+ new_fn->inode = le32_to_cpu(dirent->inode); -+ new_fn->name_len = dirent->name_len; -+ new_fn->file_type = dirent->file_type; -+ memcpy(new_fn->name, dirent->name, dirent->name_len); -+ new_fn->name[dirent->name_len] = 0; -+ -+ while (*p) { -+ parent = *p; -+ fname = rb_entry(parent, struct fname, rb_hash); -+ -+ /* -+ * If the hash and minor hash match up, then we put -+ * them on a linked list. This rarely happens... -+ */ -+ if ((new_fn->hash == fname->hash) && -+ (new_fn->minor_hash == fname->minor_hash)) { -+ new_fn->next = fname->next; -+ fname->next = new_fn; -+ return; -+ } -+ -+ if (new_fn->hash < fname->hash) -+ p = &(*p)->rb_left; -+ else if (new_fn->hash > fname->hash) -+ p = &(*p)->rb_right; -+ else if (new_fn->minor_hash < fname->minor_hash) -+ p = &(*p)->rb_left; -+ else /* if (new_fn->minor_hash > fname->minor_hash) */ -+ p = &(*p)->rb_right; -+ } -+ -+ rb_link_node(&new_fn->rb_hash, parent, p); -+ rb_insert_color(&new_fn->rb_hash, &info->root); -+} -+ -+ -+ -+/* -+ * This is a helper function for ext3_dx_readdir. It calls filldir -+ * for all entres on the fname linked list. (Normally there is only -+ * one entry on the linked list, unless there are 62 bit hash collisions.) -+ */ -+static int call_filldir(struct file * filp, void * dirent, -+ filldir_t filldir, struct fname *fname) -+{ -+ struct dir_private_info *info = filp->private_data; -+ loff_t curr_pos; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct super_block * sb; -+ int error; -+ -+ sb = inode->i_sb; -+ -+ if (!fname) { -+ printk("call_filldir: called with null fname?!?\n"); -+ return 0; -+ } -+ curr_pos = hash2pos(fname->hash, fname->minor_hash); -+ while (fname) { -+ error = filldir(dirent, fname->name, -+ fname->name_len, curr_pos, -+ fname->inode, -+ get_dtype(sb, fname->file_type)); -+ if (error) { -+ filp->f_pos = curr_pos; -+ info->extra_fname = fname->next; -+ return error; -+ } -+ fname = fname->next; -+ } -+ return 0; -+} -+ -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir) -+{ -+ struct dir_private_info *info = filp->private_data; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct fname *fname; -+ int ret; -+ -+ if (!info) { -+ info = create_dir_info(filp->f_pos); -+ if (!info) -+ return -ENOMEM; -+ filp->private_data = info; -+ } -+ -+ /* Some one has messed with f_pos; reset the world */ -+ if (info->last_pos != filp->f_pos) { -+ free_rb_tree_fname(&info->root); -+ info->curr_node = 0; -+ info->extra_fname = 0; -+ info->curr_hash = pos2maj_hash(filp->f_pos); -+ info->curr_minor_hash = pos2min_hash(filp->f_pos); -+ } -+ -+ /* -+ * If there are any leftover names on the hash collision -+ * chain, return them first. -+ */ -+ if (info->extra_fname && -+ call_filldir(filp, dirent, filldir, info->extra_fname)) -+ goto finished; -+ -+ if (!info->curr_node) -+ info->curr_node = rb_get_first(&info->root); -+ -+ while (1) { -+ /* -+ * Fill the rbtree if we have no more entries, -+ * or the inode has changed since we last read in the -+ * cached entries. -+ */ -+ if ((!info->curr_node) || -+ (filp->f_version != inode->i_version)) { -+ info->curr_node = 0; -+ free_rb_tree_fname(&info->root); -+ filp->f_version = inode->i_version; -+ ret = ext3_htree_fill_tree(filp, info->curr_hash, -+ info->curr_minor_hash, -+ &info->next_hash); -+ if (ret < 0) -+ return ret; -+ if (ret == 0) -+ break; -+ info->curr_node = rb_get_first(&info->root); -+ } -+ -+ fname = rb_entry(info->curr_node, struct fname, rb_hash); -+ info->curr_hash = fname->hash; -+ info->curr_minor_hash = fname->minor_hash; -+ if (call_filldir(filp, dirent, filldir, fname)) -+ break; -+ -+ info->curr_node = rb_get_next(info->curr_node); -+ if (!info->curr_node) { -+ info->curr_hash = info->next_hash; -+ info->curr_minor_hash = 0; -+ } -+ } -+finished: -+ info->last_pos = filp->f_pos; -+ UPDATE_ATIME(inode); -+ return 0; -+} -+#endif ---- linux-2.4.20/fs/ext3/file.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/file.c Sat Apr 5 03:56:31 2003 -@@ -35,6 +35,9 @@ static int ext3_release_file (struct ino - { - if (filp->f_mode & FMODE_WRITE) - ext3_discard_prealloc (inode); -+ if (is_dx(inode) && filp->private_data) -+ ext3_htree_free_dir_info(filp->private_data); -+ - return 0; - } - ---- /dev/null Fri Aug 30 17:31:37 2002 -+++ linux-2.4.20-braam/fs/ext3/hash.c Sat Apr 5 03:56:31 2003 -@@ -0,0 +1,215 @@ -+/* -+ * linux/fs/ext3/hash.c -+ * -+ * Copyright (C) 2002 by Theodore Ts'o -+ * -+ * This file is released under the GPL v2. -+ * -+ * This file may be redistributed under the terms of the GNU Public -+ * License. -+ */ -+ -+#include <linux/fs.h> -+#include <linux/jbd.h> -+#include <linux/sched.h> -+#include <linux/ext3_fs.h> -+ -+#define DELTA 0x9E3779B9 -+ -+static void TEA_transform(__u32 buf[4], __u32 const in[]) -+{ -+ __u32 sum = 0; -+ __u32 b0 = buf[0], b1 = buf[1]; -+ __u32 a = in[0], b = in[1], c = in[2], d = in[3]; -+ int n = 16; -+ -+ do { -+ sum += DELTA; -+ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); -+ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); -+ } while(--n); -+ -+ buf[0] += b0; -+ buf[1] += b1; -+} -+ -+/* F, G and H are basic MD4 functions: selection, majority, parity */ -+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -+#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -+#define H(x, y, z) ((x) ^ (y) ^ (z)) -+ -+/* -+ * The generic round function. The application is so specific that -+ * we don't bother protecting all the arguments with parens, as is generally -+ * good macro practice, in favor of extra legibility. -+ * Rotation is separate from addition to prevent recomputation -+ */ -+#define ROUND(f, a, b, c, d, x, s) \ -+ (a += f(b, c, d) + x, a = (a << s) | (a >> (32-s))) -+#define K1 0 -+#define K2 013240474631UL -+#define K3 015666365641UL -+ -+/* -+ * Basic cut-down MD4 transform. Returns only 32 bits of result. -+ */ -+static void halfMD4Transform (__u32 buf[4], __u32 const in[]) -+{ -+ __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; -+ -+ /* Round 1 */ -+ ROUND(F, a, b, c, d, in[0] + K1, 3); -+ ROUND(F, d, a, b, c, in[1] + K1, 7); -+ ROUND(F, c, d, a, b, in[2] + K1, 11); -+ ROUND(F, b, c, d, a, in[3] + K1, 19); -+ ROUND(F, a, b, c, d, in[4] + K1, 3); -+ ROUND(F, d, a, b, c, in[5] + K1, 7); -+ ROUND(F, c, d, a, b, in[6] + K1, 11); -+ ROUND(F, b, c, d, a, in[7] + K1, 19); -+ -+ /* Round 2 */ -+ ROUND(G, a, b, c, d, in[1] + K2, 3); -+ ROUND(G, d, a, b, c, in[3] + K2, 5); -+ ROUND(G, c, d, a, b, in[5] + K2, 9); -+ ROUND(G, b, c, d, a, in[7] + K2, 13); -+ ROUND(G, a, b, c, d, in[0] + K2, 3); -+ ROUND(G, d, a, b, c, in[2] + K2, 5); -+ ROUND(G, c, d, a, b, in[4] + K2, 9); -+ ROUND(G, b, c, d, a, in[6] + K2, 13); -+ -+ /* Round 3 */ -+ ROUND(H, a, b, c, d, in[3] + K3, 3); -+ ROUND(H, d, a, b, c, in[7] + K3, 9); -+ ROUND(H, c, d, a, b, in[2] + K3, 11); -+ ROUND(H, b, c, d, a, in[6] + K3, 15); -+ ROUND(H, a, b, c, d, in[1] + K3, 3); -+ ROUND(H, d, a, b, c, in[5] + K3, 9); -+ ROUND(H, c, d, a, b, in[0] + K3, 11); -+ ROUND(H, b, c, d, a, in[4] + K3, 15); -+ -+ buf[0] += a; -+ buf[1] += b; -+ buf[2] += c; -+ buf[3] += d; -+} -+ -+#undef ROUND -+#undef F -+#undef G -+#undef H -+#undef K1 -+#undef K2 -+#undef K3 -+ -+/* The old legacy hash */ -+static __u32 dx_hack_hash (const char *name, int len) -+{ -+ __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9; -+ while (len--) { -+ __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373)); -+ -+ if (hash & 0x80000000) hash -= 0x7fffffff; -+ hash1 = hash0; -+ hash0 = hash; -+ } -+ return (hash0 << 1); -+} -+ -+static void str2hashbuf(const char *msg, int len, __u32 *buf, int num) -+{ -+ __u32 pad, val; -+ int i; -+ -+ pad = (__u32)len | ((__u32)len << 8); -+ pad |= pad << 16; -+ -+ val = pad; -+ if (len > num*4) -+ len = num * 4; -+ for (i=0; i < len; i++) { -+ if ((i % 4) == 0) -+ val = pad; -+ val = msg[i] + (val << 8); -+ if ((i % 4) == 3) { -+ *buf++ = val; -+ val = pad; -+ num--; -+ } -+ } -+ if (--num >= 0) -+ *buf++ = val; -+ while (--num >= 0) -+ *buf++ = pad; -+} -+ -+/* -+ * Returns the hash of a filename. If len is 0 and name is NULL, then -+ * this function can be used to test whether or not a hash version is -+ * supported. -+ * -+ * The seed is an 4 longword (32 bits) "secret" which can be used to -+ * uniquify a hash. If the seed is all zero's, then some default seed -+ * may be used. -+ * -+ * A particular hash version specifies whether or not the seed is -+ * represented, and whether or not the returned hash is 32 bits or 64 -+ * bits. 32 bit hashes will return 0 for the minor hash. -+ */ -+int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) -+{ -+ __u32 hash; -+ __u32 minor_hash = 0; -+ const char *p; -+ int i; -+ __u32 in[8], buf[4]; -+ -+ /* Initialize the default seed for the hash checksum functions */ -+ buf[0] = 0x67452301; -+ buf[1] = 0xefcdab89; -+ buf[2] = 0x98badcfe; -+ buf[3] = 0x10325476; -+ -+ /* Check to see if the seed is all zero's */ -+ if (hinfo->seed) { -+ for (i=0; i < 4; i++) { -+ if (hinfo->seed[i]) -+ break; -+ } -+ if (i < 4) -+ memcpy(buf, hinfo->seed, sizeof(buf)); -+ } -+ -+ switch (hinfo->hash_version) { -+ case DX_HASH_LEGACY: -+ hash = dx_hack_hash(name, len); -+ break; -+ case DX_HASH_HALF_MD4: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 8); -+ halfMD4Transform(buf, in); -+ len -= 32; -+ p += 32; -+ } -+ minor_hash = buf[2]; -+ hash = buf[1]; -+ break; -+ case DX_HASH_TEA: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 4); -+ TEA_transform(buf, in); -+ len -= 16; -+ p += 16; -+ } -+ hash = buf[0]; -+ minor_hash = buf[1]; -+ break; -+ default: -+ hinfo->hash = 0; -+ return -1; -+ } -+ hinfo->hash = hash & ~1; -+ hinfo->minor_hash = minor_hash; -+ return 0; -+} ---- linux-2.4.20/fs/ext3/namei.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/namei.c Sat Apr 5 03:56:31 2003 -@@ -16,6 +16,12 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 -+ * Hash Tree Directory indexing (c) -+ * Daniel Phillips, 2001 -+ * Hash Tree Directory indexing porting -+ * Christopher Li, 2002 -+ * Hash Tree Directory indexing cleanup -+ * Theodore Ts'o, 2002 - */ - - #include <linux/fs.h> -@@ -38,6 +44,630 @@ - #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) - #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) - -+static struct buffer_head *ext3_append(handle_t *handle, -+ struct inode *inode, -+ u32 *block, int *err) -+{ -+ struct buffer_head *bh; -+ -+ *block = inode->i_size >> inode->i_sb->s_blocksize_bits; -+ -+ if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -+ inode->i_size += inode->i_sb->s_blocksize; -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_journal_get_write_access(handle,bh); -+ } -+ return bh; -+} -+ -+#ifndef assert -+#define assert(test) J_ASSERT(test) -+#endif -+ -+#ifndef swap -+#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0) -+#endif -+ -+typedef struct { u32 v; } le_u32; -+typedef struct { u16 v; } le_u16; -+ -+#ifdef DX_DEBUG -+#define dxtrace(command) command -+#else -+#define dxtrace(command) -+#endif -+ -+struct fake_dirent -+{ -+ /*le*/u32 inode; -+ /*le*/u16 rec_len; -+ u8 name_len; -+ u8 file_type; -+}; -+ -+struct dx_countlimit -+{ -+ le_u16 limit; -+ le_u16 count; -+}; -+ -+struct dx_entry -+{ -+ le_u32 hash; -+ le_u32 block; -+}; -+ -+/* -+ * dx_root_info is laid out so that if it should somehow get overlaid by a -+ * dirent the two low bits of the hash version will be zero. Therefore, the -+ * hash version mod 4 should never be 0. Sincerely, the paranoia department. -+ */ -+ -+struct dx_root -+{ -+ struct fake_dirent dot; -+ char dot_name[4]; -+ struct fake_dirent dotdot; -+ char dotdot_name[4]; -+ struct dx_root_info -+ { -+ le_u32 reserved_zero; -+ u8 hash_version; -+ u8 info_length; /* 8 */ -+ u8 indirect_levels; -+ u8 unused_flags; -+ } -+ info; -+ struct dx_entry entries[0]; -+}; -+ -+struct dx_node -+{ -+ struct fake_dirent fake; -+ struct dx_entry entries[0]; -+}; -+ -+ -+struct dx_frame -+{ -+ struct buffer_head *bh; -+ struct dx_entry *entries; -+ struct dx_entry *at; -+}; -+ -+struct dx_map_entry -+{ -+ u32 hash; -+ u32 offs; -+}; -+ -+#ifdef CONFIG_EXT3_INDEX -+static inline unsigned dx_get_block (struct dx_entry *entry); -+static void dx_set_block (struct dx_entry *entry, unsigned value); -+static inline unsigned dx_get_hash (struct dx_entry *entry); -+static void dx_set_hash (struct dx_entry *entry, unsigned value); -+static unsigned dx_get_count (struct dx_entry *entries); -+static unsigned dx_get_limit (struct dx_entry *entries); -+static void dx_set_count (struct dx_entry *entries, unsigned value); -+static void dx_set_limit (struct dx_entry *entries, unsigned value); -+static unsigned dx_root_limit (struct inode *dir, unsigned infosize); -+static unsigned dx_node_limit (struct inode *dir); -+static struct dx_frame *dx_probe(struct dentry *dentry, -+ struct inode *dir, -+ struct dx_hash_info *hinfo, -+ struct dx_frame *frame, -+ int *err); -+static void dx_release (struct dx_frame *frames); -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry map[]); -+static void dx_sort_map(struct dx_map_entry *map, unsigned count); -+static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, -+ struct dx_map_entry *offsets, int count); -+static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); -+static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash); -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err); -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode); -+ -+/* -+ * Future: use high four bits of block for coalesce-on-delete flags -+ * Mask them off for now. -+ */ -+ -+static inline unsigned dx_get_block (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->block.v) & 0x00ffffff; -+} -+ -+static inline void dx_set_block (struct dx_entry *entry, unsigned value) -+{ -+ entry->block.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_hash (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->hash.v); -+} -+ -+static inline void dx_set_hash (struct dx_entry *entry, unsigned value) -+{ -+ entry->hash.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_count (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->count.v); -+} -+ -+static inline unsigned dx_get_limit (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->limit.v); -+} -+ -+static inline void dx_set_count (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->count.v = cpu_to_le16(value); -+} -+ -+static inline void dx_set_limit (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->limit.v = cpu_to_le16(value); -+} -+ -+static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - -+ EXT3_DIR_REC_LEN(2) - infosize; -+ return 0? 20: entry_space / sizeof(struct dx_entry); -+} -+ -+static inline unsigned dx_node_limit (struct inode *dir) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); -+ return 0? 22: entry_space / sizeof(struct dx_entry); -+} -+ -+/* -+ * Debug -+ */ -+#ifdef DX_DEBUG -+struct stats -+{ -+ unsigned names; -+ unsigned space; -+ unsigned bcount; -+}; -+ -+static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, -+ int size, int show_names) -+{ -+ unsigned names = 0, space = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ printk("names: "); -+ while ((char *) de < base + size) -+ { -+ if (de->inode) -+ { -+ if (show_names) -+ { -+ int len = de->name_len; -+ char *name = de->name; -+ while (len--) printk("%c", *name++); -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ printk(":%x.%u ", h.hash, -+ ((char *) de - base)); -+ } -+ space += EXT3_DIR_REC_LEN(de->name_len); -+ names++; -+ } -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ printk("(%i)\n", names); -+ return (struct stats) { names, space, 1 }; -+} -+ -+struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, -+ struct dx_entry *entries, int levels) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count = dx_get_count (entries), names = 0, space = 0, i; -+ unsigned bcount = 0; -+ struct buffer_head *bh; -+ int err; -+ printk("%i indexed blocks...\n", count); -+ for (i = 0; i < count; i++, entries++) -+ { -+ u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; -+ u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; -+ struct stats stats; -+ printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); -+ if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; -+ stats = levels? -+ dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): -+ dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); -+ names += stats.names; -+ space += stats.space; -+ bcount += stats.bcount; -+ brelse (bh); -+ } -+ if (bcount) -+ printk("%snames %u, fullness %u (%u%%)\n", levels?"":" ", -+ names, space/bcount,(space/bcount)*100/blocksize); -+ return (struct stats) { names, space, bcount}; -+} -+#endif /* DX_DEBUG */ -+ -+/* -+ * Probe for a directory leaf block to search. -+ * -+ * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -+ * error in the directory index, and the caller should fall back to -+ * searching the directory normally. The callers of dx_probe **MUST** -+ * check for this error code, and make sure it never gets reflected -+ * back to userspace. -+ */ -+static struct dx_frame * -+dx_probe(struct dentry *dentry, struct inode *dir, -+ struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) -+{ -+ unsigned count, indirect; -+ struct dx_entry *at, *entries, *p, *q, *m; -+ struct dx_root *root; -+ struct buffer_head *bh; -+ struct dx_frame *frame = frame_in; -+ u32 hash; -+ -+ frame->bh = NULL; -+ if (dentry) -+ dir = dentry->d_parent->d_inode; -+ if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) -+ goto fail; -+ root = (struct dx_root *) bh->b_data; -+ if (root->info.hash_version != DX_HASH_TEA && -+ root->info.hash_version != DX_HASH_HALF_MD4 && -+ root->info.hash_version != DX_HASH_LEGACY) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unrecognised inode hash code %d", -+ root->info.hash_version); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ hinfo->hash_version = root->info.hash_version; -+ hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ if (dentry) -+ ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ hash = hinfo->hash; -+ -+ if (root->info.unused_flags & 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash flags: %#06x", -+ root->info.unused_flags); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ if ((indirect = root->info.indirect_levels) > 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash depth: %#06x", -+ root->info.indirect_levels); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ while (1) -+ { -+ count = dx_get_count(entries); -+ assert (count && count <= dx_get_limit(entries)); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ dxtrace(printk(".")); -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ -+ if (0) // linear search cross check -+ { -+ unsigned n = count - 1; -+ at = entries; -+ while (n--) -+ { -+ dxtrace(printk(",")); -+ if (dx_get_hash(++at) > hash) -+ { -+ at--; -+ break; -+ } -+ } -+ assert (at == p - 1); -+ } -+ -+ at = p - 1; -+ dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ frame->bh = bh; -+ frame->entries = entries; -+ frame->at = at; -+ if (!indirect--) return frame; -+ if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ goto fail2; -+ at = entries = ((struct dx_node *) bh->b_data)->entries; -+ assert (dx_get_limit(entries) == dx_node_limit (dir)); -+ frame++; -+ } -+fail2: -+ while (frame >= frame_in) { -+ brelse(frame->bh); -+ frame--; -+ } -+fail: -+ return NULL; -+} -+ -+static void dx_release (struct dx_frame *frames) -+{ -+ if (frames[0].bh == NULL) -+ return; -+ -+ if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ brelse(frames[1].bh); -+ brelse(frames[0].bh); -+} -+ -+/* -+ * This function increments the frame pointer to search the next leaf -+ * block, and reads in the necessary intervening nodes if the search -+ * should be necessary. Whether or not the search is necessary is -+ * controlled by the hash parameter. If the hash value is even, then -+ * the search is only continued if the next block starts with that -+ * hash value. This is used if we are searching for a specific file. -+ * -+ * If the hash value is HASH_NB_ALWAYS, then always go to the next block. -+ * -+ * This function returns 1 if the caller should continue to search, -+ * or 0 if it should not. If there is an error reading one of the -+ * index blocks, it will return -1. -+ * -+ * If start_hash is non-null, it will be filled in with the starting -+ * hash of the next page. -+ */ -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash) -+{ -+ struct dx_frame *p; -+ struct buffer_head *bh; -+ int num_frames = 0; -+ __u32 bhash; -+ -+ *err = ENOENT; -+ p = frame; -+ /* -+ * Find the next leaf page by incrementing the frame pointer. -+ * If we run out of entries in the interior node, loop around and -+ * increment pointer in the parent node. When we break out of -+ * this loop, num_frames indicates the number of interior -+ * nodes need to be read. -+ */ -+ while (1) { -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ break; -+ if (p == frames) -+ return 0; -+ num_frames++; -+ p--; -+ } -+ -+ /* -+ * If the hash is 1, then continue only if the next page has a -+ * continuation hash of any value. This is used for readdir -+ * handling. Otherwise, check to see if the hash matches the -+ * desired contiuation hash. If it doesn't, return since -+ * there's no point to read in the successive index pages. -+ */ -+ bhash = dx_get_hash(p->at); -+ if (start_hash) -+ *start_hash = bhash; -+ if ((hash & 1) == 0) { -+ if ((bhash & ~1) != hash) -+ return 0; -+ } -+ /* -+ * If the hash is HASH_NB_ALWAYS, we always go to the next -+ * block so no check is necessary -+ */ -+ while (num_frames--) { -+ if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -+ 0, err))) -+ return -1; /* Failure */ -+ p++; -+ brelse (p->bh); -+ p->bh = bh; -+ p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ } -+ return 1; -+} -+ -+ -+/* -+ * p is at least 6 bytes before the end of page -+ */ -+static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) -+{ -+ return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); -+} -+ -+/* -+ * This function fills a red-black tree with information from a -+ * directory. We start scanning the directory in hash order, starting -+ * at start_hash and start_minor_hash. -+ * -+ * This function returns the number of entries inserted into the tree, -+ * or a negative error code. -+ */ -+int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash) -+{ -+ struct dx_hash_info hinfo; -+ struct buffer_head *bh; -+ struct ext3_dir_entry_2 *de, *top; -+ static struct dx_frame frames[2], *frame; -+ struct inode *dir; -+ int block, err; -+ int count = 0; -+ int ret; -+ __u32 hashval; -+ -+ dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, -+ start_minor_hash)); -+ dir = dir_file->f_dentry->d_inode; -+ hinfo.hash = start_hash; -+ hinfo.minor_hash = 0; -+ frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ -+ while (1) { -+ block = dx_get_block(frame->at); -+ dxtrace(printk("Reading block %d\n", block)); -+ if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) -+ goto errout; -+ -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) { -+ ext3fs_dirhash(de->name, de->name_len, &hinfo); -+ if ((hinfo.hash < start_hash) || -+ ((hinfo.hash == start_hash) && -+ (hinfo.minor_hash < start_minor_hash))) -+ continue; -+ ext3_htree_store_dirent(dir_file, hinfo.hash, -+ hinfo.minor_hash, de); -+ count++; -+ } -+ brelse (bh); -+ hashval = ~1; -+ ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, -+ frame, frames, &err, &hashval); -+ if (next_hash) -+ *next_hash = hashval; -+ if (ret == -1) -+ goto errout; -+ /* -+ * Stop if: (a) there are no more entries, or -+ * (b) we have inserted at least one entry and the -+ * next hash value is not a continuation -+ */ -+ if ((ret == 0) || -+ (count && ((hashval & 1) == 0))) -+ break; -+ } -+ dx_release(frames); -+ dxtrace(printk("Fill tree: returned %d entries\n", count)); -+ return count; -+errout: -+ dx_release(frames); -+ return (err); -+} -+ -+ -+/* -+ * Directory block splitting, compacting -+ */ -+ -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) -+{ -+ int count = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ while ((char *) de < base + size) -+ { -+ if (de->name_len && de->inode) { -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ map_tail--; -+ map_tail->hash = h.hash; -+ map_tail->offs = (u32) ((char *) de - base); -+ count++; -+ } -+ /* XXX: do we need to check rec_len == 0 case? -Chris */ -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ return count; -+} -+ -+static void dx_sort_map (struct dx_map_entry *map, unsigned count) -+{ -+ struct dx_map_entry *p, *q, *top = map + count - 1; -+ int more; -+ /* Combsort until bubble sort doesn't suck */ -+ while (count > 2) -+ { -+ count = count*10/13; -+ if (count - 9 < 2) /* 9, 10 -> 11 */ -+ count = 11; -+ for (p = top, q = p - count; q >= map; p--, q--) -+ if (p->hash < q->hash) -+ swap(*p, *q); -+ } -+ /* Garden variety bubble sort */ -+ do { -+ more = 0; -+ q = top; -+ while (q-- > map) -+ { -+ if (q[1].hash >= q[0].hash) -+ continue; -+ swap(*(q+1), *q); -+ more = 1; -+ } -+ } while(more); -+} -+ -+static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+{ -+ struct dx_entry *entries = frame->entries; -+ struct dx_entry *old = frame->at, *new = old + 1; -+ int count = dx_get_count(entries); -+ -+ assert(count < dx_get_limit(entries)); -+ assert(old < entries + count); -+ memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); -+ dx_set_hash(new, hash); -+ dx_set_block(new, block); -+ dx_set_count(entries, count + 1); -+} -+#endif -+ -+ -+static void ext3_update_dx_flag(struct inode *inode) -+{ -+ if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, -+ EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; -+} -+ - /* - * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. - * -@@ -94,6 +724,7 @@ static int inline search_dirblock(struct - return 0; - } - -+ - /* - * ext3_find_entry() - * -@@ -105,6 +736,8 @@ static int inline search_dirblock(struct - * The returned buffer_head has ->b_count elevated. The caller is expected - * to brelse() it when appropriate. - */ -+ -+ - static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) - { -@@ -119,12 +752,32 @@ static struct buffer_head * ext3_find_en - int num = 0; - int nblocks, i, err; - struct inode *dir = dentry->d_parent->d_inode; -+ int namelen; -+ const u8 *name; -+ unsigned blocksize; - - *res_dir = NULL; - sb = dir->i_sb; -- -+ blocksize = sb->s_blocksize; -+ namelen = dentry->d_name.len; -+ name = dentry->d_name.name; -+ if (namelen > EXT3_NAME_LEN) -+ return NULL; -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ /* -+ * On success, or if the error was file not found, -+ * return. Otherwise, fall back to doing a search the -+ * old fashioned way. -+ */ -+ if (bh || (err != ERR_BAD_DX_DIR)) -+ return bh; -+ dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ } -+#endif - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); -- start = dir->u.ext3_i.i_dir_start_lookup; -+ start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) - start = 0; - block = start; -@@ -165,7 +818,7 @@ restart: - i = search_dirblock(bh, dir, dentry, - block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); - if (i == 1) { -- dir->u.ext3_i.i_dir_start_lookup = block; -+ EXT3_I(dir)->i_dir_start_lookup = block; - ret = bh; - goto cleanup_and_exit; - } else { -@@ -196,6 +849,66 @@ cleanup_and_exit: - return ret; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err) -+{ -+ struct super_block * sb; -+ struct dx_hash_info hinfo; -+ u32 hash; -+ struct dx_frame frames[2], *frame; -+ struct ext3_dir_entry_2 *de, *top; -+ struct buffer_head *bh; -+ unsigned long block; -+ int retval; -+ int namelen = dentry->d_name.len; -+ const u8 *name = dentry->d_name.name; -+ struct inode *dir = dentry->d_parent->d_inode; -+ -+ sb = dir->i_sb; -+ if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+ return NULL; -+ hash = hinfo.hash; -+ do { -+ block = dx_get_block(frame->at); -+ if (!(bh = ext3_bread (NULL,dir, block, 0, err))) -+ goto errout; -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) -+ if (ext3_match (namelen, name, de)) { -+ if (!ext3_check_dir_entry("ext3_find_entry", -+ dir, de, bh, -+ (block<<EXT3_BLOCK_SIZE_BITS(sb)) -+ +((char *)de - bh->b_data))) { -+ brelse (bh); -+ goto errout; -+ } -+ *res_dir = de; -+ dx_release (frames); -+ return bh; -+ } -+ brelse (bh); -+ /* Check to see if we should continue to search */ -+ retval = ext3_htree_next_block(dir, hash, frame, -+ frames, err, 0); -+ if (retval == -1) { -+ ext3_warning(sb, __FUNCTION__, -+ "error reading index page in directory #%lu", -+ dir->i_ino); -+ goto errout; -+ } -+ } while (retval == 1); -+ -+ *err = -ENOENT; -+errout: -+ dxtrace(printk("%s not found\n", name)); -+ dx_release (frames); -+ return NULL; -+} -+#endif -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -212,8 +925,9 @@ static struct dentry *ext3_lookup(struct - brelse (bh); - inode = iget(dir->i_sb, ino); - -- if (!inode) -+ if (!inode) { - return ERR_PTR(-EACCES); -+ } - } - d_add(dentry, inode); - return NULL; -@@ -237,6 +951,301 @@ static inline void ext3_set_de_type(stru - de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct ext3_dir_entry_2 * -+dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) -+{ -+ unsigned rec_len = 0; -+ -+ while (count--) { -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); -+ de->inode = 0; -+ map++; -+ to += rec_len; -+ } -+ return (struct ext3_dir_entry_2 *) (to - rec_len); -+} -+ -+static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) -+{ -+ struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ unsigned rec_len = 0; -+ -+ prev = to = de; -+ while ((char*)de < base + size) { -+ next = (struct ext3_dir_entry_2 *) ((char *) de + -+ le16_to_cpu(de->rec_len)); -+ if (de->inode && de->name_len) { -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ if (de > to) -+ memmove(to, de, rec_len); -+ to->rec_len = cpu_to_le16(rec_len); -+ prev = to; -+ to = (struct ext3_dir_entry_2 *)((char *)to + rec_len); -+ } -+ de = next; -+ } -+ return prev; -+} -+ -+static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, -+ struct buffer_head **bh,struct dx_frame *frame, -+ struct dx_hash_info *hinfo, int *error) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count, continued; -+ struct buffer_head *bh2; -+ u32 newblock; -+ u32 hash2; -+ struct dx_map_entry *map; -+ char *data1 = (*bh)->b_data, *data2; -+ unsigned split; -+ struct ext3_dir_entry_2 *de = NULL, *de2; -+ int err; -+ -+ bh2 = ext3_append (handle, dir, &newblock, error); -+ if (!(bh2)) { -+ brelse(*bh); -+ *bh = NULL; -+ goto errout; -+ } -+ -+ BUFFER_TRACE(*bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, *bh); -+ if (err) { -+ journal_error: -+ brelse(*bh); -+ brelse(bh2); -+ *bh = NULL; -+ ext3_std_error(dir->i_sb, err); -+ goto errout; -+ } -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ -+ data2 = bh2->b_data; -+ -+ /* create map in the end of data2 block */ -+ map = (struct dx_map_entry *) (data2 + blocksize); -+ count = dx_make_map ((struct ext3_dir_entry_2 *) data1, -+ blocksize, hinfo, map); -+ map -= count; -+ split = count/2; // need to adjust to actual middle -+ dx_sort_map (map, count); -+ hash2 = map[split].hash; -+ continued = hash2 == map[split - 1].hash; -+ dxtrace(printk("Split block %i at %x, %i/%i\n", -+ dx_get_block(frame->at), hash2, split, count-split)); -+ -+ /* Fancy dance to stay within two buffers */ -+ de2 = dx_move_dirents(data1, data2, map + split, count - split); -+ de = dx_pack_dirents(data1,blocksize); -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ -+ /* Which block gets the new entry? */ -+ if (hinfo->hash >= hash2) -+ { -+ swap(*bh, bh2); -+ de = de2; -+ } -+ dx_insert_block (frame, hash2 + continued, newblock); -+ err = ext3_journal_dirty_metadata (handle, bh2); -+ if (err) -+ goto journal_error; -+ err = ext3_journal_dirty_metadata (handle, frame->bh); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ dxtrace(dx_show_index ("frame", frame->entries)); -+errout: -+ return de; -+} -+#endif -+ -+ -+/* -+ * Add a new entry into a directory (leaf) block. If de is non-NULL, -+ * it points to a directory entry which is guaranteed to be large -+ * enough for new directory entry. If de is NULL, then -+ * add_dirent_to_buf will attempt search the directory block for -+ * space. It will return -ENOSPC if no space is available, and -EIO -+ * and -EEXIST if directory entry already exists. -+ * -+ * NOTE! bh is NOT released in the case where ENOSPC is returned. In -+ * all other cases bh is released. -+ */ -+static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct ext3_dir_entry_2 *de, -+ struct buffer_head * bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ unsigned long offset = 0; -+ unsigned short reclen; -+ int nlen, rlen, err; -+ char *top; -+ -+ reclen = EXT3_DIR_REC_LEN(namelen); -+ if (!de) { -+ de = (struct ext3_dir_entry_2 *)bh->b_data; -+ top = bh->b_data + dir->i_sb->s_blocksize - reclen; -+ while ((char *) de <= top) { -+ if (!ext3_check_dir_entry("ext3_add_entry", dir, de, -+ bh, offset)) { -+ brelse (bh); -+ return -EIO; -+ } -+ if (ext3_match (namelen, name, de)) { -+ brelse (bh); -+ return -EEXIST; -+ } -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if ((de->inode? rlen - nlen: rlen) >= reclen) -+ break; -+ de = (struct ext3_dir_entry_2 *)((char *)de + rlen); -+ offset += rlen; -+ } -+ if ((char *) de > top) -+ return -ENOSPC; -+ } -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) { -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return err; -+ } -+ -+ /* By now the buffer is marked for journaling */ -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if (de->inode) { -+ struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ de1->rec_len = cpu_to_le16(rlen - nlen); -+ de->rec_len = cpu_to_le16(nlen); -+ de = de1; -+ } -+ de->file_type = EXT3_FT_UNKNOWN; -+ if (inode) { -+ de->inode = cpu_to_le32(inode->i_ino); -+ ext3_set_de_type(dir->i_sb, de, inode->i_mode); -+ } else -+ de->inode = 0; -+ de->name_len = namelen; -+ memcpy (de->name, name, namelen); -+ /* -+ * XXX shouldn't update any times until successful -+ * completion of syscall, but too many callers depend -+ * on this. -+ * -+ * XXX similarly, too many callers depend on -+ * ext3_new_inode() setting the times, but error -+ * recovery deletes the inode, so the worst that can -+ * happen is that the times are slightly out of date -+ * and/or different from the directory change time. -+ */ -+ dir->i_mtime = dir->i_ctime = CURRENT_TIME; -+ ext3_update_dx_flag(dir); -+ dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return 0; -+} -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * This converts a one block unindexed directory to a 3 block indexed -+ * directory, and adds the dentry to the indexed directory. -+ */ -+static int make_indexed_dir(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct buffer_head *bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ struct buffer_head *bh2; -+ struct dx_root *root; -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries; -+ struct ext3_dir_entry_2 *de, *de2; -+ char *data1, *top; -+ unsigned len; -+ int retval; -+ unsigned blocksize; -+ struct dx_hash_info hinfo; -+ u32 block; -+ -+ blocksize = dir->i_sb->s_blocksize; -+ dxtrace(printk("Creating index\n")); -+ retval = ext3_journal_get_write_access(handle, bh); -+ if (retval) { -+ ext3_std_error(dir->i_sb, retval); -+ brelse(bh); -+ return retval; -+ } -+ root = (struct dx_root *) bh->b_data; -+ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ bh2 = ext3_append (handle, dir, &block, &retval); -+ if (!(bh2)) { -+ brelse(bh); -+ return retval; -+ } -+ data1 = bh2->b_data; -+ -+ /* The 0th block becomes the root, move the dirents out */ -+ de = (struct ext3_dir_entry_2 *)&root->dotdot; -+ de = (struct ext3_dir_entry_2 *)((char *)de + le16_to_cpu(de->rec_len)); -+ len = ((char *) root) + blocksize - (char *) de; -+ memcpy (data1, de, len); -+ de = (struct ext3_dir_entry_2 *) data1; -+ top = data1 + len; -+ while (((char *) de2=(char*)de+le16_to_cpu(de->rec_len)) < top) -+ de = de2; -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ /* Initialize the root; the dot dirents already exist */ -+ de = (struct ext3_dir_entry_2 *) (&root->dotdot); -+ de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); -+ memset (&root->info, 0, sizeof(root->info)); -+ root->info.info_length = sizeof(root->info); -+ root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ entries = root->entries; -+ dx_set_block (entries, 1); -+ dx_set_count (entries, 1); -+ dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info))); -+ -+ /* Initialize as for dx_probe */ -+ hinfo.hash_version = root->info.hash_version; -+ hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ ext3fs_dirhash(name, namelen, &hinfo); -+ frame = frames; -+ frame->entries = entries; -+ frame->at = entries; -+ frame->bh = bh; -+ bh = bh2; -+ de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ dx_release (frames); -+ if (!(de)) -+ return retval; -+ -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} -+#endif -+ - /* - * ext3_add_entry() - * -@@ -247,127 +1255,198 @@ static inline void ext3_set_de_type(stru - * may not sleep between calling this and putting something into - * the entry, as someone else might have used it while you slept. - */ -- --/* -- * AKPM: the journalling code here looks wrong on the error paths -- */ - static int ext3_add_entry (handle_t *handle, struct dentry *dentry, - struct inode *inode) - { - struct inode *dir = dentry->d_parent->d_inode; -- const char *name = dentry->d_name.name; -- int namelen = dentry->d_name.len; - unsigned long offset; -- unsigned short rec_len; - struct buffer_head * bh; -- struct ext3_dir_entry_2 * de, * de1; -+ struct ext3_dir_entry_2 *de; - struct super_block * sb; - int retval; -+#ifdef CONFIG_EXT3_INDEX -+ int dx_fallback=0; -+#endif -+ unsigned blocksize; -+ unsigned nlen, rlen; -+ u32 block, blocks; - - sb = dir->i_sb; -- -- if (!namelen) -+ blocksize = sb->s_blocksize; -+ if (!dentry->d_name.len) - return -EINVAL; -- bh = ext3_bread (handle, dir, 0, 0, &retval); -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ retval = ext3_dx_add_entry(handle, dentry, inode); -+ if (!retval || (retval != ERR_BAD_DX_DIR)) -+ return retval; -+ EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; -+ dx_fallback++; -+ ext3_mark_inode_dirty(handle, dir); -+ } -+#endif -+ blocks = dir->i_size >> sb->s_blocksize_bits; -+ for (block = 0, offset = 0; block < blocks; block++) { -+ bh = ext3_bread(handle, dir, block, 0, &retval); -+ if(!bh) -+ return retval; -+ retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (retval != -ENOSPC) -+ return retval; -+ -+#ifdef CONFIG_EXT3_INDEX -+ if (blocks == 1 && !dx_fallback && -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ return make_indexed_dir(handle, dentry, inode, bh); -+#endif -+ brelse(bh); -+ } -+ bh = ext3_append(handle, dir, &block, &retval); - if (!bh) - return retval; -- rec_len = EXT3_DIR_REC_LEN(namelen); -- offset = 0; - de = (struct ext3_dir_entry_2 *) bh->b_data; -- while (1) { -- if ((char *)de >= sb->s_blocksize + bh->b_data) { -- brelse (bh); -- bh = NULL; -- bh = ext3_bread (handle, dir, -- offset >> EXT3_BLOCK_SIZE_BITS(sb), 1, &retval); -- if (!bh) -- return retval; -- if (dir->i_size <= offset) { -- if (dir->i_size == 0) { -- brelse(bh); -- return -ENOENT; -- } -+ de->inode = 0; -+ de->rec_len = cpu_to_le16(rlen = blocksize); -+ nlen = 0; -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} - -- ext3_debug ("creating next block\n"); -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * Returns 0 for success, or a negative error value -+ */ -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries, *at; -+ struct dx_hash_info hinfo; -+ struct buffer_head * bh; -+ struct inode *dir = dentry->d_parent->d_inode; -+ struct super_block * sb = dir->i_sb; -+ struct ext3_dir_entry_2 *de; -+ int err; - -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- de->inode = 0; -- de->rec_len = le16_to_cpu(sb->s_blocksize); -- dir->u.ext3_i.i_disksize = -- dir->i_size = offset + sb->s_blocksize; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); -- } else { -+ frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ entries = frame->entries; -+ at = frame->at; - -- ext3_debug ("skipping to next block\n"); -+ if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ goto cleanup; - -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- } -- } -- if (!ext3_check_dir_entry ("ext3_add_entry", dir, de, bh, -- offset)) { -- brelse (bh); -- return -ENOENT; -- } -- if (ext3_match (namelen, name, de)) { -- brelse (bh); -- return -EEXIST; -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto journal_error; -+ -+ err = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (err != -ENOSPC) { -+ bh = 0; -+ goto cleanup; -+ } -+ -+ /* Block full, should compress but for now just split */ -+ dxtrace(printk("using %u of %u node entries\n", -+ dx_get_count(entries), dx_get_limit(entries))); -+ /* Need to split index? */ -+ if (dx_get_count(entries) == dx_get_limit(entries)) { -+ u32 newblock; -+ unsigned icount = dx_get_count(entries); -+ int levels = frame - frames; -+ struct dx_entry *entries2; -+ struct dx_node *node2; -+ struct buffer_head *bh2; -+ -+ if (levels && (dx_get_count(frames->entries) == -+ dx_get_limit(frames->entries))) { -+ ext3_warning(sb, __FUNCTION__, -+ "Directory index full!\n"); -+ err = -ENOSPC; -+ goto cleanup; - } -- if ((le32_to_cpu(de->inode) == 0 && -- le16_to_cpu(de->rec_len) >= rec_len) || -- (le16_to_cpu(de->rec_len) >= -- EXT3_DIR_REC_LEN(de->name_len) + rec_len)) { -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- /* By now the buffer is marked for journaling */ -- offset += le16_to_cpu(de->rec_len); -- if (le32_to_cpu(de->inode)) { -- de1 = (struct ext3_dir_entry_2 *) ((char *) de + -- EXT3_DIR_REC_LEN(de->name_len)); -- de1->rec_len = -- cpu_to_le16(le16_to_cpu(de->rec_len) - -- EXT3_DIR_REC_LEN(de->name_len)); -- de->rec_len = cpu_to_le16( -- EXT3_DIR_REC_LEN(de->name_len)); -- de = de1; -+ bh2 = ext3_append (handle, dir, &newblock, &err); -+ if (!(bh2)) -+ goto cleanup; -+ node2 = (struct dx_node *)(bh2->b_data); -+ entries2 = node2->entries; -+ node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -+ node2->fake.inode = 0; -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ if (levels) { -+ unsigned icount1 = icount/2, icount2 = icount - icount1; -+ unsigned hash2 = dx_get_hash(entries + icount1); -+ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ err = ext3_journal_get_write_access(handle, -+ frames[0].bh); -+ if (err) -+ goto journal_error; -+ -+ memcpy ((char *) entries2, (char *) (entries + icount1), -+ icount2 * sizeof(struct dx_entry)); -+ dx_set_count (entries, icount1); -+ dx_set_count (entries2, icount2); -+ dx_set_limit (entries2, dx_node_limit(dir)); -+ -+ /* Which index block gets the new entry? */ -+ if (at - entries >= icount1) { -+ frame->at = at = at - entries - icount1 + entries2; -+ frame->entries = entries = entries2; -+ swap(frame->bh, bh2); - } -- de->file_type = EXT3_FT_UNKNOWN; -- if (inode) { -- de->inode = cpu_to_le32(inode->i_ino); -- ext3_set_de_type(dir->i_sb, de, inode->i_mode); -- } else -- de->inode = 0; -- de->name_len = namelen; -- memcpy (de->name, name, namelen); -- /* -- * XXX shouldn't update any times until successful -- * completion of syscall, but too many callers depend -- * on this. -- * -- * XXX similarly, too many callers depend on -- * ext3_new_inode() setting the times, but error -- * recovery deletes the inode, so the worst that can -- * happen is that the times are slightly out of date -- * and/or different from the directory change time. -- */ -- dir->i_mtime = dir->i_ctime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- 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); -- return 0; -+ dx_insert_block (frames + 0, hash2, newblock); -+ dxtrace(dx_show_index ("node", frames[1].entries)); -+ dxtrace(dx_show_index ("node", -+ ((struct dx_node *) bh2->b_data)->entries)); -+ err = ext3_journal_dirty_metadata(handle, bh2); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ } else { -+ dxtrace(printk("Creating second level index...\n")); -+ memcpy((char *) entries2, (char *) entries, -+ icount * sizeof(struct dx_entry)); -+ dx_set_limit(entries2, dx_node_limit(dir)); -+ -+ /* Set up root */ -+ dx_set_count(entries, 1); -+ dx_set_block(entries + 0, newblock); -+ ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ -+ /* Add new access path frame */ -+ frame = frames + 1; -+ frame->at = at = at - entries + entries2; -+ frame->entries = entries = entries2; -+ frame->bh = bh2; -+ err = ext3_journal_get_write_access(handle, -+ frame->bh); -+ if (err) -+ goto journal_error; - } -- offset += le16_to_cpu(de->rec_len); -- de = (struct ext3_dir_entry_2 *) -- ((char *) de + le16_to_cpu(de->rec_len)); -+ ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- brelse (bh); -- return -ENOSPC; -+ de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ if (!de) -+ goto cleanup; -+ err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ bh = 0; -+ goto cleanup; -+ -+journal_error: -+ ext3_std_error(dir->i_sb, err); -+cleanup: -+ if (bh) -+ brelse(bh); -+ dx_release(frames); -+ return err; - } -+#endif - - /* - * ext3_delete_entry deletes a directory entry by merging it with the -@@ -451,9 +1530,11 @@ static int ext3_create (struct inode * d - struct inode * inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -478,9 +1559,11 @@ static int ext3_mknod (struct inode * di - struct inode *inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -507,9 +1590,11 @@ static int ext3_mkdir(struct inode * dir - if (dir->i_nlink >= EXT3_LINK_MAX) - return -EMLINK; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -521,7 +1606,7 @@ static int ext3_mkdir(struct inode * dir - - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -- inode->i_size = inode->u.ext3_i.i_disksize = inode->i_sb->s_blocksize; -+ inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; - inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { -@@ -554,21 +1639,19 @@ static int ext3_mkdir(struct inode * dir - inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); -- if (err) -- goto out_no_entry; -+ if (err) { -+ inode->i_nlink = 0; -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - dir->i_nlink++; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - d_instantiate(dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- inode->i_nlink = 0; -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - /* -@@ -655,7 +1738,7 @@ int ext3_orphan_add(handle_t *handle, st - int err = 0, rc; - - lock_super(sb); -- if (!list_empty(&inode->u.ext3_i.i_orphan)) -+ if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - - /* Orphan handling is only valid for files with data blocks -@@ -696,7 +1779,7 @@ int ext3_orphan_add(handle_t *handle, st - * This is safe: on error we're going to ignore the orphan list - * anyway on the next recovery. */ - if (!err) -- list_add(&inode->u.ext3_i.i_orphan, &EXT3_SB(sb)->s_orphan); -+ list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", -@@ -714,25 +1797,26 @@ out_unlock: - int ext3_orphan_del(handle_t *handle, struct inode *inode) - { - struct list_head *prev; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct ext3_sb_info *sbi; - ino_t ino_next; - struct ext3_iloc iloc; - int err = 0; - - lock_super(inode->i_sb); -- if (list_empty(&inode->u.ext3_i.i_orphan)) { -+ if (list_empty(&ei->i_orphan)) { - unlock_super(inode->i_sb); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); -- prev = inode->u.ext3_i.i_orphan.prev; -+ prev = ei->i_orphan.prev; - sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %ld from orphan list\n", inode->i_ino); - -- list_del(&inode->u.ext3_i.i_orphan); -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ list_del(&ei->i_orphan); -+ INIT_LIST_HEAD(&ei->i_orphan); - - /* If we're on an error path, we may not have a valid - * transaction handle with which to update the orphan list on -@@ -793,8 +1877,9 @@ static int ext3_rmdir (struct inode * di - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); -@@ -832,7 +1917,7 @@ static int ext3_rmdir (struct inode * di - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; - ext3_mark_inode_dirty(handle, inode); -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - - end_rmdir: -@@ -850,8 +1935,9 @@ static int ext3_unlink(struct inode * di - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -878,7 +1964,7 @@ static int ext3_unlink(struct inode * di - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - inode->i_nlink--; - if (!inode->i_nlink) -@@ -904,9 +1990,11 @@ static int ext3_symlink (struct inode * - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 5); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -916,7 +2004,7 @@ static int ext3_symlink (struct inode * - if (IS_ERR(inode)) - goto out_stop; - -- if (l > sizeof (inode->u.ext3_i.i_data)) { -+ if (l > sizeof (EXT3_I(inode)->i_data)) { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* -@@ -925,25 +2013,23 @@ static int ext3_symlink (struct inode * - * i_size in generic_commit_write(). - */ - err = block_symlink(inode, symname, l); -- if (err) -- goto out_no_entry; -+ if (err) { -+ ext3_dec_count(handle, inode); -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - } else { - inode->i_op = &ext3_fast_symlink_inode_operations; -- memcpy((char*)&inode->u.ext3_i.i_data,symname,l); -+ memcpy((char*)&EXT3_I(inode)->i_data,symname,l); - inode->i_size = l-1; - } -- inode->u.ext3_i.i_disksize = inode->i_size; -+ EXT3_I(inode)->i_disksize = inode->i_size; - err = ext3_add_nondir(handle, dentry, inode); - ext3_mark_inode_dirty(handle, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- ext3_dec_count(handle, inode); -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - static int ext3_link (struct dentry * old_dentry, -@@ -956,12 +2042,15 @@ static int ext3_link (struct dentry * ol - if (S_ISDIR(inode->i_mode)) - return -EPERM; - -- if (inode->i_nlink >= EXT3_LINK_MAX) -+ if (inode->i_nlink >= EXT3_LINK_MAX) { - return -EMLINK; -+ } - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -995,9 +2084,11 @@ static int ext3_rename (struct inode * o - - old_bh = new_bh = dir_bh = NULL; - -- handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + 2); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; -@@ -1077,7 +2168,7 @@ static int ext3_rename (struct inode * o - new_inode->i_ctime = CURRENT_TIME; - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; -- old_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(old_dir); - if (dir_bh) { - BUFFER_TRACE(dir_bh, "get_write_access"); - ext3_journal_get_write_access(handle, dir_bh); -@@ -1089,7 +2180,7 @@ static int ext3_rename (struct inode * o - new_inode->i_nlink--; - } else { - new_dir->i_nlink++; -- new_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(new_dir); - ext3_mark_inode_dirty(handle, new_dir); - } - } ---- linux-2.4.20/fs/ext3/super.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/fs/ext3/super.c Sat Apr 5 03:56:31 2003 -@@ -707,6 +707,7 @@ static int ext3_setup_super(struct super - es->s_mtime = cpu_to_le32(CURRENT_TIME); - ext3_update_dynamic_rev(sb); - EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -+ - ext3_commit_super (sb, es, 1); - if (test_opt (sb, DEBUG)) - printk (KERN_INFO -@@ -717,6 +718,7 @@ static int ext3_setup_super(struct super - EXT3_BLOCKS_PER_GROUP(sb), - EXT3_INODES_PER_GROUP(sb), - sbi->s_mount_opt); -+ - printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ", - bdevname(sb->s_dev)); - if (EXT3_SB(sb)->s_journal->j_inode == NULL) { -@@ -890,6 +892,7 @@ static loff_t ext3_max_size(int bits) - return res; - } - -+ - struct super_block * ext3_read_super (struct super_block * sb, void * data, - int silent) - { -@@ -1066,6 +1069,9 @@ struct super_block * ext3_read_super (st - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+ for (i=0; i < 4; i++) -+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); -+ sbi->s_def_hash_version = es->s_def_hash_version; - - if (sbi->s_blocks_per_group > blocksize * 8) { - printk (KERN_ERR -@@ -1769,6 +1775,7 @@ static void __exit exit_ext3_fs(void) - unregister_filesystem(&ext3_fs_type); - } - -+EXPORT_SYMBOL(ext3_force_commit); - EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); ---- linux-2.4.20/include/linux/ext3_fs.h~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/include/linux/ext3_fs.h Sat Apr 5 03:56:31 2003 -@@ -40,6 +40,11 @@ - #define EXT3FS_VERSION "2.4-0.9.19" - - /* -+ * Always enable hashed directories -+ */ -+#define CONFIG_EXT3_INDEX -+ -+/* - * Debug code - */ - #ifdef EXT3FS_DEBUG -@@ -437,8 +442,11 @@ struct ext3_super_block { - /*E0*/ __u32 s_journal_inum; /* inode number of journal file */ - __u32 s_journal_dev; /* device number of journal file */ - __u32 s_last_orphan; /* start of list of inodes to delete */ -- --/*EC*/ __u32 s_reserved[197]; /* Padding to the end of the block */ -+ __u32 s_hash_seed[4]; /* HTREE hash seed */ -+ __u8 s_def_hash_version; /* Default hash version to use */ -+ __u8 s_reserved_char_pad; -+ __u16 s_reserved_word_pad; -+ __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -575,9 +583,46 @@ struct ext3_dir_entry_2 { - #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) - #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ - ~EXT3_DIR_ROUND) -+/* -+ * Hash Tree Directory indexing -+ * (c) Daniel Phillips, 2001 -+ */ -+ -+#ifdef CONFIG_EXT3_INDEX -+ #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ -+ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ -+ (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) -+#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) -+#else -+ #define is_dx(dir) 0 -+#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) -+#endif -+ -+/* Legal values for the dx_root hash_version field: */ -+ -+#define DX_HASH_LEGACY 0 -+#define DX_HASH_HALF_MD4 1 -+#define DX_HASH_TEA 2 -+ -+/* hash info structure used by the directory hash */ -+struct dx_hash_info -+{ -+ u32 hash; -+ u32 minor_hash; -+ int hash_version; -+ u32 *seed; -+}; - - #ifdef __KERNEL__ - /* -+ * Control parameters used by ext3_htree_next_block -+ */ -+#define HASH_NB_ALWAYS 1 -+ -+ -+/* - * Describe an inode's exact location on disk and in memory - */ - struct ext3_iloc -@@ -587,6 +632,27 @@ struct ext3_iloc - unsigned long block_group; - }; - -+ -+/* -+ * This structure is stuffed into the struct file's private_data field -+ * for directories. It is where we put information so that we can do -+ * readdir operations in hash tree order. -+ */ -+struct dir_private_info { -+ rb_root_t root; -+ rb_node_t *curr_node; -+ struct fname *extra_fname; -+ loff_t last_pos; -+ __u32 curr_hash; -+ __u32 curr_minor_hash; -+ __u32 next_hash; -+}; -+ -+/* -+ * Special error return code only used by dx_probe() and its callers. -+ */ -+#define ERR_BAD_DX_DIR -75000 -+ - /* - * Function prototypes - */ -@@ -614,11 +680,20 @@ extern struct ext3_group_desc * ext3_get - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, -- struct ext3_dir_entry_2 *, struct buffer_head *, -- unsigned long); -+ struct ext3_dir_entry_2 *, -+ struct buffer_head *, unsigned long); -+extern void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent); -+extern void ext3_htree_free_dir_info(struct dir_private_info *p); -+ - /* fsync.c */ - extern int ext3_sync_file (struct file *, struct dentry *, int); - -+/* hash.c */ -+extern int ext3fs_dirhash(const char *name, int len, struct -+ dx_hash_info *hinfo); -+ - /* ialloc.c */ - extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int); - extern void ext3_free_inode (handle_t *, struct inode *); -@@ -650,6 +725,8 @@ extern int ext3_ioctl (struct inode *, s - /* namei.c */ - extern int ext3_orphan_add(handle_t *, struct inode *); - extern int ext3_orphan_del(handle_t *, struct inode *); -+extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash); - - /* super.c */ - extern void ext3_error (struct super_block *, const char *, const char *, ...) ---- linux-2.4.20/include/linux/ext3_fs_sb.h~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/include/linux/ext3_fs_sb.h Sat Apr 5 03:56:31 2003 -@@ -62,6 +62,8 @@ struct ext3_sb_info { - int s_inode_size; - int s_first_ino; - u32 s_next_generation; -+ u32 s_hash_seed[4]; -+ int s_def_hash_version; - - /* Journaling */ - struct inode * s_journal_inode; ---- linux-2.4.20/include/linux/ext3_jbd.h~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/include/linux/ext3_jbd.h Sat Apr 5 03:56:31 2003 -@@ -63,6 +63,8 @@ extern int ext3_writepage_trans_blocks(s - - #define EXT3_RESERVE_TRANS_BLOCKS 12 - -+#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, ---- linux-2.4.20/include/linux/rbtree.h~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/include/linux/rbtree.h Sat Apr 5 03:56:31 2003 -@@ -120,6 +120,8 @@ rb_root_t; - - extern void rb_insert_color(rb_node_t *, rb_root_t *); - extern void rb_erase(rb_node_t *, rb_root_t *); -+extern rb_node_t *rb_get_first(rb_root_t *root); -+extern rb_node_t *rb_get_next(rb_node_t *n); - - static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link) - { ---- linux-2.4.20/lib/rbtree.c~ext-2.4-patch-1 Sat Apr 5 03:56:31 2003 -+++ linux-2.4.20-braam/lib/rbtree.c Sat Apr 5 03:56:31 2003 -@@ -17,6 +17,8 @@ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - linux/lib/rbtree.c -+ -+ rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002 - */ - - #include <linux/rbtree.h> -@@ -294,3 +296,43 @@ void rb_erase(rb_node_t * node, rb_root_ - __rb_erase_color(child, parent, root); - } - EXPORT_SYMBOL(rb_erase); -+ -+/* -+ * This function returns the first node (in sort order) of the tree. -+ */ -+rb_node_t *rb_get_first(rb_root_t *root) -+{ -+ rb_node_t *n; -+ -+ n = root->rb_node; -+ if (!n) -+ return 0; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+} -+EXPORT_SYMBOL(rb_get_first); -+ -+/* -+ * Given a node, this function will return the next node in the tree. -+ */ -+rb_node_t *rb_get_next(rb_node_t *n) -+{ -+ rb_node_t *parent; -+ -+ if (n->rb_right) { -+ n = n->rb_right; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+ } else { -+ while ((parent = n->rb_parent)) { -+ if (n == parent->rb_left) -+ return parent; -+ n = parent; -+ } -+ return 0; -+ } -+} -+EXPORT_SYMBOL(rb_get_next); -+ - -_ diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-2.patch b/lustre/kernel_patches/patches/ext-2.4-patch-2.patch deleted file mode 100644 index 689d33b949..0000000000 --- a/lustre/kernel_patches/patches/ext-2.4-patch-2.patch +++ /dev/null @@ -1,34 +0,0 @@ -# This is a BitKeeper generated patch for the following project: -# Project Name: Linux kernel tree -# -# namei.c | 9 +++++++++ -# 1 files changed, 9 insertions(+) -# -# The following is the BitKeeper ChangeSet Log -# -------------------------------------------- -# 02/11/07 tytso@snap.thunk.org 1.777 -# Add '.' and '..' entries to be returned by readdir of htree directories -# -# This patch from Chris Li adds '.' and '..' to the rbtree so that they -# are properly returned by readdir. -# -------------------------------------------- -# -diff -Nru a/fs/ext3/namei.c b/fs/ext3/namei.c ---- a/fs/ext3/namei.c Thu Nov 7 10:57:30 2002 -+++ b/fs/ext3/namei.c Thu Nov 7 10:57:30 2002 -@@ -546,6 +546,15 @@ - if (!frame) - return err; - -+ /* Add '.' and '..' from the htree header */ -+ if (!start_hash && !start_minor_hash) { -+ de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; -+ ext3_htree_store_dirent(dir_file, 0, 0, de); -+ de = ext3_next_entry(de); -+ ext3_htree_store_dirent(dir_file, 0, 0, de); -+ count += 2; -+ } -+ - while (1) { - block = dx_get_block(frame->at); - dxtrace(printk("Reading block %d\n", block)); diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-3.patch b/lustre/kernel_patches/patches/ext-2.4-patch-3.patch deleted file mode 100644 index 2600b02b5a..0000000000 --- a/lustre/kernel_patches/patches/ext-2.4-patch-3.patch +++ /dev/null @@ -1,96 +0,0 @@ -# This is a BitKeeper generated patch for the following project: -# Project Name: Linux kernel tree -# -# fs/ext3/dir.c | 7 +++++-- -# fs/ext3/namei.c | 11 +++++++---- -# include/linux/ext3_fs.h | 2 +- -# 3 files changed, 13 insertions(+), 7 deletions(-) -# -# The following is the BitKeeper ChangeSet Log -# -------------------------------------------- -# 02/11/07 tytso@snap.thunk.org 1.778 -# Check for failed kmalloc() in ext3_htree_store_dirent() -# -# This patch checks for a failed kmalloc() in ext3_htree_store_dirent(), -# and passes the error up to its caller, ext3_htree_fill_tree(). -# -------------------------------------------- -# -diff -Nru a/fs/ext3/dir.c b/fs/ext3/dir.c ---- a/fs/ext3/dir.c Thu Nov 7 10:57:34 2002 -+++ b/fs/ext3/dir.c Thu Nov 7 10:57:34 2002 -@@ -308,7 +308,7 @@ - /* - * Given a directory entry, enter it into the fname rb tree. - */ --void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, - __u32 minor_hash, - struct ext3_dir_entry_2 *dirent) - { -@@ -323,6 +323,8 @@ - /* Create and allocate the fname structure */ - len = sizeof(struct fname) + dirent->name_len + 1; - new_fn = kmalloc(len, GFP_KERNEL); -+ if (!new_fn) -+ return -ENOMEM; - memset(new_fn, 0, len); - new_fn->hash = hash; - new_fn->minor_hash = minor_hash; -@@ -344,7 +346,7 @@ - (new_fn->minor_hash == fname->minor_hash)) { - new_fn->next = fname->next; - fname->next = new_fn; -- return; -+ return 0; - } - - if (new_fn->hash < fname->hash) -@@ -359,6 +361,7 @@ - - rb_link_node(&new_fn->rb_hash, parent, p); - rb_insert_color(&new_fn->rb_hash, &info->root); -+ return 0; - } - - -diff -Nru a/fs/ext3/namei.c b/fs/ext3/namei.c ---- a/fs/ext3/namei.c Thu Nov 7 10:57:34 2002 -+++ b/fs/ext3/namei.c Thu Nov 7 10:57:34 2002 -@@ -549,9 +549,11 @@ - /* Add '.' and '..' from the htree header */ - if (!start_hash && !start_minor_hash) { - de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; -- ext3_htree_store_dirent(dir_file, 0, 0, de); -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; - de = ext3_next_entry(de); -- ext3_htree_store_dirent(dir_file, 0, 0, de); -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; - count += 2; - } - -@@ -570,8 +572,9 @@ - ((hinfo.hash == start_hash) && - (hinfo.minor_hash < start_minor_hash))) - continue; -- ext3_htree_store_dirent(dir_file, hinfo.hash, -- hinfo.minor_hash, de); -+ if ((err = ext3_htree_store_dirent(dir_file, -+ hinfo.hash, hinfo.minor_hash, de)) != 0) -+ goto errout; - count++; - } - brelse (bh); -diff -Nru a/include/linux/ext3_fs.h b/include/linux/ext3_fs.h ---- a/include/linux/ext3_fs.h Thu Nov 7 10:57:34 2002 -+++ b/include/linux/ext3_fs.h Thu Nov 7 10:57:34 2002 -@@ -682,7 +682,7 @@ - extern int ext3_check_dir_entry(const char *, struct inode *, - struct ext3_dir_entry_2 *, - struct buffer_head *, unsigned long); --extern void ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, - __u32 minor_hash, - struct ext3_dir_entry_2 *dirent); - extern void ext3_htree_free_dir_info(struct dir_private_info *p); diff --git a/lustre/kernel_patches/patches/ext-2.4-patch-4.patch b/lustre/kernel_patches/patches/ext-2.4-patch-4.patch deleted file mode 100644 index 4c8d4fa31a..0000000000 --- a/lustre/kernel_patches/patches/ext-2.4-patch-4.patch +++ /dev/null @@ -1,52 +0,0 @@ -# This is a BitKeeper generated patch for the following project: -# Project Name: Linux kernel tree -# -# namei.c | 21 ++++++++++++++++++++- -# 1 files changed, 20 insertions(+), 1 deletion(-) -# -# The following is the BitKeeper ChangeSet Log -# -------------------------------------------- -# 02/11/07 tytso@snap.thunk.org 1.779 -# Fix ext3 htree rename bug. -# -# This fixes an ext3 htree bug pointed out by Christopher Li; if -# adding the new name to the directory causes a split, this can cause -# the directory entry containing the old name to move to another -# block, and then the removal of the old name will fail. -# -------------------------------------------- -# -diff -Nru a/fs/ext3/namei.c b/fs/ext3/namei.c ---- a/fs/ext3/namei.c Thu Nov 7 10:57:49 2002 -+++ b/fs/ext3/namei.c Thu Nov 7 10:57:49 2002 -@@ -2173,7 +2173,30 @@ - /* - * ok, that's it - */ -- ext3_delete_entry(handle, old_dir, old_de, old_bh); -+ if (le32_to_cpu(old_de->inode) != old_inode->i_ino || -+ old_de->name_len != old_dentry->d_name.len || -+ strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || -+ (retval = ext3_delete_entry(handle, old_dir, -+ old_de, old_bh)) == -ENOENT) { -+ /* old_de could have moved from under us during htree split, so -+ * make sure that we are deleting the right entry. We might -+ * also be pointing to a stale entry in the unused part of -+ * old_bh so just checking inum and the name isn't enough. */ -+ struct buffer_head *old_bh2; -+ struct ext3_dir_entry_2 *old_de2; -+ -+ old_bh2 = ext3_find_entry(old_dentry, &old_de2); -+ if (old_bh2) { -+ retval = ext3_delete_entry(handle, old_dir, -+ old_de2, old_bh2); -+ brelse(old_bh2); -+ } -+ } -+ if (retval) { -+ ext3_warning(old_dir->i_sb, "ext3_rename", -+ "Deleting old file (%lu), %d, error=%d", -+ old_dir->i_ino, old_dir->i_nlink, retval); -+ } - - if (new_inode) { - new_inode->i_nlink--; diff --git a/lustre/kernel_patches/patches/ext3-2.4.20-fixes.patch b/lustre/kernel_patches/patches/ext3-2.4.20-fixes.patch deleted file mode 100644 index 5f566de4d5..0000000000 --- a/lustre/kernel_patches/patches/ext3-2.4.20-fixes.patch +++ /dev/null @@ -1,118 +0,0 @@ - - - - fs/ext3/balloc.c | 53 +++++++++++++++++++++++++++++++---------------------- - 1 files changed, 31 insertions(+), 22 deletions(-) - ---- linux-2.4.20/fs/ext3/balloc.c~ext3-2.4.20-fixes 2003-04-08 23:35:17.000000000 -0600 -+++ linux-2.4.20-braam/fs/ext3/balloc.c 2003-04-08 23:35:17.000000000 -0600 -@@ -276,7 +276,8 @@ void ext3_free_blocks (handle_t *handle, - } - 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 @@ do_more: - 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 @@ do_more: - 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), -+ EXT3_SB(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 @@ do_more: - #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 +414,6 @@ do_more: - if (!err) err = ret; - - if (overflow && !err) { -- block += count; - count = overflow; - goto do_more; - } -@@ -576,6 +574,7 @@ int ext3_new_block (handle_t *handle, st - - ext3_debug ("goal=%lu.\n", goal); - -+repeat: - /* - * First, test whether the goal block is free. - */ -@@ -684,10 +683,20 @@ got_block: - 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! */ - -_ diff --git a/lustre/kernel_patches/patches/ext3-delete_thread-2.4.19-suse.patch b/lustre/kernel_patches/patches/ext3-delete_thread-2.4.19-suse.patch deleted file mode 100644 index 4bcefcefb3..0000000000 --- a/lustre/kernel_patches/patches/ext3-delete_thread-2.4.19-suse.patch +++ /dev/null @@ -1,481 +0,0 @@ - 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(+) - -Index: linux-2.4.19.SuSE/fs/ext3/super.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/ext3/super.c Sun Nov 16 01:18:04 2003 -+++ linux-2.4.19.SuSE/fs/ext3/super.c Sun Nov 16 01:19:22 2003 -@@ -401,6 +401,220 @@ - } - } - -+#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); -@@ -408,6 +622,7 @@ - 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)) { -@@ -476,7 +691,11 @@ - 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, -@@ -553,6 +772,13 @@ - clear_opt (*mount_options, POSIX_ACL); - 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")) { -@@ -1254,6 +1480,7 @@ - } - - 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 -@@ -1692,6 +1919,9 @@ - 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"); - -Index: linux-2.4.19.SuSE/fs/ext3/inode.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/ext3/inode.c Sun Nov 16 01:02:56 2003 -+++ linux-2.4.19.SuSE/fs/ext3/inode.c Sun Nov 16 01:19:22 2003 -@@ -2114,6 +2114,118 @@ - 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. -+ */ -+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; -+ } -+ -+ 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; -+ old_inode->i_mtime = old_inode->i_ctime = CURRENT_TIME; -+ -+ 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); -+ -+ 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; -+ } -+ -+ 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. -Index: linux-2.4.19.SuSE/fs/ext3/file.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/ext3/file.c Sun Nov 16 00:40:59 2003 -+++ linux-2.4.19.SuSE/fs/ext3/file.c Sun Nov 16 01:19:22 2003 -@@ -132,7 +132,11 @@ - }; - - 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 */ -Index: linux-2.4.19.SuSE/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.19.SuSE.orig/include/linux/ext3_fs.h Sun Nov 16 01:02:51 2003 -+++ linux-2.4.19.SuSE/include/linux/ext3_fs.h Sun Nov 16 01:20:06 2003 -@@ -193,6 +193,7 @@ - */ - #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 -@@ -321,6 +322,7 @@ - #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_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_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 - - /* ioctl.c */ - extern int ext3_ioctl (struct inode *, struct file *, unsigned int, -Index: linux-2.4.19.SuSE/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.19.SuSE.orig/include/linux/ext3_fs_sb.h Sun Nov 16 01:18:41 2003 -+++ linux-2.4.19.SuSE/include/linux/ext3_fs_sb.h Sun Nov 16 01:19:22 2003 -@@ -29,6 +29,8 @@ - - #define EXT3_MAX_GROUP_LOADED 8 - -+#define EXT3_DELETE_THREAD -+ - /* - * third extended-fs super-block data in memory - */ -@@ -75,6 +77,14 @@ - 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/ext3-delete_thread-2.4.20-hp.patch b/lustre/kernel_patches/patches/ext3-delete_thread-2.4.20-hp.patch deleted file mode 100644 index d722b68a23..0000000000 --- a/lustre/kernel_patches/patches/ext3-delete_thread-2.4.20-hp.patch +++ /dev/null @@ -1,497 +0,0 @@ - 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(+) - -Index: linux/fs/ext3/super.c -=================================================================== ---- linux.orig/fs/ext3/super.c Mon Feb 2 20:57:35 2004 -+++ linux/fs/ext3/super.c Mon Feb 2 20:58:05 2004 -@@ -400,6 +400,221 @@ - } - } - -+#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, -+ sbi->s_delete_list.next == 0 && sbi->s_delete_inodes == 0); -+} -+ -+/* 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 +622,7 @@ - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ J_ASSERT(sbi->s_delete_inodes == 0); - ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { -@@ -455,7 +671,11 @@ - 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 */ -- delete_inode: ext3_delete_inode, /* BKL not held. We take it */ -+#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 +744,13 @@ - 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 +1450,7 @@ - } - - 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 -@@ -1614,7 +1842,12 @@ - static int ext3_sync_fs(struct super_block *sb) - { - tid_t target; -- -+ -+ if (atomic_read(&sb->s_active) == 0) { -+ /* fs is being umounted: time to stop delete thread */ -+ ext3_stop_delete_thread(EXT3_SB(sb)); -+ } -+ - sb->s_dirt = 0; - target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); - log_wait_commit(EXT3_SB(sb)->s_journal, target); -@@ -1678,6 +1911,9 @@ - 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"); - -Index: linux/fs/ext3/inode.c -=================================================================== ---- linux.orig/fs/ext3/inode.c Mon Feb 2 20:57:35 2004 -+++ linux/fs/ext3/inode.c Mon Feb 2 20:58:05 2004 -@@ -2500,6 +2500,118 @@ - return err; - } - -+#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. -+ */ -+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; -+ } -+ -+ 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; -+ old_inode->i_mtime = old_inode->i_ctime = CURRENT_TIME; -+ -+ 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); -+ -+ 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; -+ } -+ -+ 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 */ -+ - /* - * On success, We end up with an outstanding reference count against - * iloc->bh. This _must_ be cleaned up later. -Index: linux/fs/ext3/file.c -=================================================================== ---- linux.orig/fs/ext3/file.c Mon Feb 2 20:57:34 2004 -+++ linux/fs/ext3/file.c Mon Feb 2 20:58:05 2004 -@@ -125,7 +125,11 @@ - }; - - 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 */ -Index: linux/include/linux/ext3_fs.h -=================================================================== ---- linux.orig/include/linux/ext3_fs.h Mon Feb 2 20:57:35 2004 -+++ linux/include/linux/ext3_fs.h Mon Feb 2 20:58:05 2004 -@@ -193,6 +193,7 @@ - */ - #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 @@ - #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 -@@ -694,6 +696,9 @@ - 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 - - /* ioctl.c */ - extern int ext3_ioctl (struct inode *, struct file *, unsigned int, -Index: linux/include/linux/ext3_fs_sb.h -=================================================================== ---- linux.orig/include/linux/ext3_fs_sb.h Mon Feb 2 20:57:35 2004 -+++ linux/include/linux/ext3_fs_sb.h Mon Feb 2 20:58:05 2004 -@@ -29,6 +29,8 @@ - - #define EXT3_MAX_GROUP_LOADED 8 - -+#define EXT3_DELETE_THREAD -+ - /* - * third extended-fs super-block data in memory - */ -@@ -76,6 +78,14 @@ - 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/ext3-delete_thread-2.4.20.patch b/lustre/kernel_patches/patches/ext3-delete_thread-2.4.20.patch deleted file mode 100644 index ca05893f58..0000000000 --- a/lustre/kernel_patches/patches/ext3-delete_thread-2.4.20.patch +++ /dev/null @@ -1,541 +0,0 @@ - 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(+) - -Index: linux-2.4.20/fs/ext3/super.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/super.c 2004-01-12 20:13:37.000000000 +0300 -+++ linux-2.4.20/fs/ext3/super.c 2004-01-13 16:59:54.000000000 +0300 -@@ -48,6 +48,8 @@ - static void ext3_clear_journal_err(struct super_block * sb, - struct ext3_super_block * es); - -+static int ext3_sync_fs(struct super_block * sb); -+ - #ifdef CONFIG_JBD_DEBUG - int journal_no_write[2]; - -@@ -398,6 +400,221 @@ - } - } - -+#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, -+ sbi->s_delete_list.next == 0 && sbi->s_delete_inodes == 0); -+} -+ -+/* 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); -@@ -405,6 +622,7 @@ - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ J_ASSERT(sbi->s_delete_inodes == 0); - ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { -@@ -453,9 +671,14 @@ - 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, - write_super_lockfs: ext3_write_super_lockfs, /* BKL not held. Take it */ - unlockfs: ext3_unlockfs, /* BKL not held. We take it */ - statfs: ext3_statfs, /* BKL held */ -@@ -521,6 +744,13 @@ - 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")) { -@@ -1220,6 +1450,7 @@ - } - - 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 -@@ -1625,6 +1856,21 @@ - } - } - -+static int ext3_sync_fs(struct super_block *sb) -+{ -+ tid_t target; -+ -+ if (atomic_read(&sb->s_active) == 0) { -+ /* fs is being umounted: time to stop delete thread */ -+ ext3_stop_delete_thread(EXT3_SB(sb)); -+ } -+ -+ sb->s_dirt = 0; -+ target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); -+ log_wait_commit(EXT3_SB(sb)->s_journal, target); -+ return 0; -+} -+ - /* - * LVM calls this function before a (read-only) snapshot is created. This - * gives us a chance to flush the journal completely and mark the fs clean. -@@ -1682,6 +1928,9 @@ - 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"); - -Index: linux-2.4.20/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/inode.c 2004-01-12 20:13:37.000000000 +0300 -+++ linux-2.4.20/fs/ext3/inode.c 2004-01-13 16:55:45.000000000 +0300 -@@ -2552,6 +2552,118 @@ - return err; - } - -+#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. -+ */ -+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; -+ } -+ -+ 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; -+ old_inode->i_mtime = old_inode->i_ctime = CURRENT_TIME; -+ -+ 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); -+ -+ 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; -+ } -+ -+ 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 */ -+ - /* - * On success, We end up with an outstanding reference count against - * iloc->bh. This _must_ be cleaned up later. -Index: linux-2.4.20/fs/ext3/file.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/file.c 2004-01-12 20:13:36.000000000 +0300 -+++ linux-2.4.20/fs/ext3/file.c 2004-01-13 16:55:45.000000000 +0300 -@@ -125,7 +125,11 @@ - }; - - 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 */ -Index: linux-2.4.20/fs/buffer.c -=================================================================== ---- linux-2.4.20.orig/fs/buffer.c 2003-05-16 05:29:12.000000000 +0400 -+++ linux-2.4.20/fs/buffer.c 2004-01-13 16:55:45.000000000 +0300 -@@ -328,6 +328,8 @@ - if (sb->s_dirt && sb->s_op && sb->s_op->write_super) - sb->s_op->write_super(sb); - unlock_super(sb); -+ if (sb->s_op && sb->s_op->sync_fs) -+ sb->s_op->sync_fs(sb); - unlock_kernel(); - - return sync_buffers(dev, 1); -Index: linux-2.4.20/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.20.orig/include/linux/ext3_fs.h 2004-01-12 20:13:37.000000000 +0300 -+++ linux-2.4.20/include/linux/ext3_fs.h 2004-01-13 16:55:45.000000000 +0300 -@@ -193,6 +193,7 @@ - */ - #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 @@ - #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 -@@ -696,6 +698,9 @@ - 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 - - /* ioctl.c */ - extern int ext3_ioctl (struct inode *, struct file *, unsigned int, -Index: linux-2.4.20/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.20.orig/include/linux/ext3_fs_sb.h 2004-01-12 20:13:37.000000000 +0300 -+++ linux-2.4.20/include/linux/ext3_fs_sb.h 2004-01-13 16:55:45.000000000 +0300 -@@ -29,6 +29,8 @@ - - #define EXT3_MAX_GROUP_LOADED 8 - -+#define EXT3_DELETE_THREAD -+ - /* - * third extended-fs super-block data in memory - */ -@@ -76,6 +78,14 @@ - 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 */ -Index: linux-2.4.20/include/linux/fs.h -=================================================================== ---- linux-2.4.20.orig/include/linux/fs.h 2004-01-12 20:13:36.000000000 +0300 -+++ linux-2.4.20/include/linux/fs.h 2004-01-13 16:55:45.000000000 +0300 -@@ -917,6 +917,7 @@ - void (*delete_inode) (struct inode *); - void (*put_super) (struct super_block *); - void (*write_super) (struct super_block *); -+ int (*sync_fs) (struct super_block *); - void (*write_super_lockfs) (struct super_block *); - void (*unlockfs) (struct super_block *); - int (*statfs) (struct super_block *, struct statfs *); diff --git a/lustre/kernel_patches/patches/ext3-delete_thread-2.4.21-chaos.patch b/lustre/kernel_patches/patches/ext3-delete_thread-2.4.21-chaos.patch deleted file mode 100644 index 2fc365d1e2..0000000000 --- a/lustre/kernel_patches/patches/ext3-delete_thread-2.4.21-chaos.patch +++ /dev/null @@ -1,496 +0,0 @@ - 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(+) - -Index: linux-2.4.21-chaos/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/super.c 2004-01-12 19:20:07.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/super.c 2004-01-13 17:25:49.000000000 +0300 -@@ -425,6 +425,221 @@ - } - } - -+#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, -+ sbi->s_delete_list.next == 0 && sbi->s_delete_inodes == 0); -+} -+ -+/* 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); -@@ -432,6 +647,7 @@ - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ J_ASSERT(sbi->s_delete_inodes == 0); - ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { -@@ -501,7 +717,11 @@ - 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, -@@ -579,6 +799,13 @@ - *mount_flags &= ~MS_POSIXACL; - 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")) { -@@ -1283,6 +1510,7 @@ - } - - 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 -@@ -1676,7 +1904,12 @@ - static int ext3_sync_fs(struct super_block *sb) - { - tid_t target; -- -+ -+ if (atomic_read(&sb->s_active) == 0) { -+ /* fs is being umounted: time to stop delete thread */ -+ ext3_stop_delete_thread(EXT3_SB(sb)); -+ } -+ - sb->s_dirt = 0; - target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); - log_wait_commit(EXT3_SB(sb)->s_journal, target); -@@ -1746,6 +1979,9 @@ - if (!parse_options(data, &tmp, sbi, &mount_flags, &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"); - -Index: linux-2.4.21-chaos/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/inode.c 2004-01-12 19:20:06.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/inode.c 2004-01-12 19:20:07.000000000 +0300 -@@ -2179,6 +2179,118 @@ - return; /* AKPM: return what? */ - } - -+#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. -+ */ -+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; -+ } -+ -+ 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; -+ old_inode->i_mtime = old_inode->i_ctime = CURRENT_TIME; -+ -+ 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); -+ -+ 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; -+ } -+ -+ 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. -Index: linux-2.4.21-chaos/fs/ext3/file.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/file.c 2004-01-12 19:20:06.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/file.c 2004-01-12 19:20:07.000000000 +0300 -@@ -132,7 +132,11 @@ - }; - - 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 */ -Index: linux-2.4.21-chaos/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs.h 2004-01-12 19:20:06.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs.h 2004-01-12 19:20:07.000000000 +0300 -@@ -195,6 +195,7 @@ - */ - #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 -@@ -323,6 +324,7 @@ - #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_ASYNCDEL 0x20000 /* Delayed deletion */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -693,6 +695,9 @@ - extern int ext3_change_inode_journal_flag(struct inode *, int); - extern void ext3_truncate (struct inode *); - extern void ext3_set_inode_flags(struct inode *); -+#ifdef EXT3_DELETE_THREAD -+extern void ext3_truncate_thread(struct inode *inode); -+#endif - - /* ioctl.c */ - extern int ext3_ioctl (struct inode *, struct file *, unsigned int, -Index: linux-2.4.21-chaos/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs_sb.h 2004-01-12 19:20:07.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs_sb.h 2004-01-12 20:53:51.000000000 +0300 -@@ -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 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/ext3-ea-in-inode-2.4.21-chaos.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.21-chaos.patch deleted file mode 100644 index 031e46db66..0000000000 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.21-chaos.patch +++ /dev/null @@ -1,760 +0,0 @@ - fs/ext3/ialloc.c | 6 - fs/ext3/inode.c | 12 - fs/ext3/super.c | 6 - fs/ext3/xattr.c | 597 +++++++++++++++++++++++++++++++++++++++++++++- - include/linux/ext3_fs.h | 2 - include/linux/ext3_fs_i.h | 3 - 6 files changed, 615 insertions(+), 11 deletions(-) - -Index: linux-2.4.21-chaos/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ialloc.c 2003-12-12 17:39:10.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ialloc.c 2003-12-12 17:39:55.000000000 +0300 -@@ -580,6 +580,12 @@ - insert_inode_hash(inode); - inode->i_generation = sbi->s_next_generation++; - -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) { -+ EXT3_I(inode)->i_extra_isize = sizeof(__u16) /* i_extra_isize */ -+ + sizeof(__u16); /* i_pad1 */ -+ } else -+ EXT3_I(inode)->i_extra_isize = 0; -+ - ei->i_state = EXT3_STATE_NEW; - err = ext3_get_inode_loc_new(inode, &iloc, 1); - if (err) goto fail; -Index: linux-2.4.21-chaos/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/inode.c 2003-12-12 17:39:11.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/inode.c 2003-12-12 17:39:55.000000000 +0300 -@@ -2502,6 +2502,12 @@ - ei->i_data[block] = iloc.raw_inode->i_block[block]; - INIT_LIST_HEAD(&ei->i_orphan); - -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) -+ EXT3_I(inode)->i_extra_isize = -+ le16_to_cpu(raw_inode->i_extra_isize); -+ else -+ EXT3_I(inode)->i_extra_isize = 0; -+ - if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; -@@ -2564,6 +2570,8 @@ - if (err) - goto out_brelse; - } -+ if (EXT3_I(inode)->i_state & EXT3_STATE_NEW) -+ memset(raw_inode, 0, EXT3_INODE_SIZE(inode->i_sb)); - raw_inode->i_mode = cpu_to_le16(inode->i_mode); - if(!(test_opt(inode->i_sb, NO_UID32))) { - raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid)); -@@ -2646,6 +2654,10 @@ - else for (block = 0; block < EXT3_N_BLOCKS; block++) - raw_inode->i_block[block] = ei->i_data[block]; - -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) -+ raw_inode->i_extra_isize = -+ cpu_to_le16(EXT3_I(inode)->i_extra_isize); -+ - BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); - rc = ext3_journal_dirty_metadata(handle, bh); - if (!err) -Index: linux-2.4.21-chaos/fs/ext3/xattr.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/xattr.c 2003-12-12 17:38:44.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/xattr.c 2003-12-12 17:42:58.000000000 +0300 -@@ -88,6 +88,9 @@ - struct buffer_head *, - struct ext3_xattr_header *); - -+int ext3_xattr_block_set(handle_t *, struct inode *, int, const char *, -+ const void *, size_t, int); -+ - #ifdef CONFIG_EXT3_FS_XATTR_SHARING - - static int ext3_xattr_cache_insert(struct buffer_head *); -@@ -256,17 +259,12 @@ - } - - /* -- * ext3_xattr_get() -- * -- * Copy an extended attribute into the buffer -- * provided, or compute the buffer size required. -- * Buffer is NULL to compute the size of the buffer required. -+ * ext3_xattr_block_get() - * -- * Returns a negative error number on failure, or the number of bytes -- * used / required on success. -+ * routine looks for attribute in EA block and returns it's value and size - */ - int --ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ext3_xattr_block_get(struct inode *inode, int name_index, const char *name, - void *buffer, size_t buffer_size) - { - struct buffer_head *bh = NULL; -@@ -359,6 +357,94 @@ - } - - /* -+ * ext3_xattr_ibode_get() -+ * -+ * routine looks for attribute in inode body and returns it's value and size -+ */ -+int -+ext3_xattr_ibody_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ int size, name_len = strlen(name), storage_size; -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ struct ext3_iloc iloc; -+ char *start, *end; -+ int ret = -ENOENT; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return -ENOENT; -+ -+ ret = ext3_get_inode_loc(inode, &iloc); -+ if (ret) -+ return ret; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return -ENOENT; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_get", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) -+ goto found; -+ last = next; -+ } -+ -+ /* can't find EA */ -+ brelse(iloc.bh); -+ return -ENOENT; -+ -+found: -+ size = le32_to_cpu(last->e_value_size); -+ if (buffer) { -+ ret = -ERANGE; -+ if (buffer_size >= size) { -+ memcpy(buffer, start + le16_to_cpu(last->e_value_offs), -+ size); -+ ret = size; -+ } -+ } else -+ ret = size; -+ brelse(iloc.bh); -+ return ret; -+} -+ -+int ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ int err; -+ -+ /* try to find attribute in inode body */ -+ err = ext3_xattr_ibody_get(inode, name_index, name, -+ buffer, buffer_size); -+ if (err < 0) -+ /* search was unsuccessful, try to find EA in dedicated block */ -+ err = ext3_xattr_block_get(inode, name_index, name, -+ buffer, buffer_size); -+ return err; -+} -+ -+/* - * ext3_xattr_list() - * - * Copy a list of attribute names into the buffer -@@ -369,7 +455,7 @@ - * used / required on success. - */ - int --ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+ext3_xattr_block_list(struct inode *inode, char *buffer, size_t buffer_size) - { - struct buffer_head *bh = NULL; - struct ext3_xattr_entry *entry; -@@ -446,6 +532,131 @@ - return error; - } - -+/* ext3_xattr_ibody_list() -+ * -+ * generate list of attributes stored in inode body -+ */ -+int -+ext3_xattr_ibody_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ char *start, *end, *buf; -+ struct ext3_iloc iloc; -+ int storage_size; -+ int ret; -+ int size = 0; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return 0; -+ -+ ret = ext3_get_inode_loc(inode, &iloc); -+ if (ret) -+ return ret; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return 0; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ struct ext3_xattr_handler *handler; -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_list", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ handler = ext3_xattr_handler(last->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, last->e_name, -+ last->e_name_len); -+ last = next; -+ } -+ -+ if (!buffer) { -+ ret = size; -+ goto cleanup; -+ } else { -+ ret = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ last = (struct ext3_xattr_entry *) start; -+ buf = buffer; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ struct ext3_xattr_handler *handler; -+ handler = ext3_xattr_handler(last->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, last->e_name, -+ last->e_name_len); -+ last = next; -+ } -+ ret = size; -+cleanup: -+ brelse(iloc.bh); -+ return ret; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ int error; -+ int size = buffer_size; -+ -+ /* get list of attributes stored in inode body */ -+ error = ext3_xattr_ibody_list(inode, buffer, buffer_size); -+ if (error < 0) { -+ /* some error occured while collecting -+ * attributes in inode body */ -+ size = 0; -+ goto cleanup; -+ } -+ size = error; -+ -+ /* get list of attributes stored in dedicated block */ -+ if (buffer) { -+ buffer_size -= error; -+ if (buffer_size <= 0) { -+ buffer = NULL; -+ buffer_size = 0; -+ } else -+ buffer += error; -+ } -+ -+ error = ext3_xattr_block_list(inode, buffer, buffer_size); -+ if (error < 0) -+ /* listing was successful, so we return len */ -+ size = 0; -+ -+cleanup: -+ return error + size; -+} -+ - /* - * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is - * not set, set it. -@@ -480,6 +691,102 @@ - */ - int - ext3_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, -+ int flags) -+{ -+ struct ext3_xattr_entry entry; -+ int err, where = 0, found = 0, total; -+ int free1 = -1, free2 = -1; -+ int name_len; -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > inode->i_sb->s_blocksize) -+ return -ERANGE; -+ -+ /* try to find attribute in inode body */ -+ err = ext3_xattr_ibody_find(inode, name_index, name, &entry, &free1); -+ if (err == 0) { -+ /* found EA in inode */ -+ found = 1; -+ where = 0; -+ } else if (err == -ENOENT) { -+ /* there is no such attribute in inode body */ -+ /* try to find attribute in dedicated block */ -+ err = ext3_xattr_block_find(inode, name_index, name, -+ &entry, &free2); -+ if (err != 0 && err != -ENOENT) { -+ /* not found EA in block */ -+ goto finish; -+ } else if (err == 0) { -+ /* found EA in block */ -+ where = 1; -+ found = 1; -+ } -+ } else -+ goto finish; -+ -+ /* check flags: may replace? may create ? */ -+ if (found && (flags & XATTR_CREATE)) { -+ err = -EEXIST; -+ goto finish; -+ } else if (!found && (flags & XATTR_REPLACE)) { -+ err = -ENODATA; -+ goto finish; -+ } -+ -+ /* check if we have enough space to store attribute */ -+ total = EXT3_XATTR_LEN(strlen(name)) + value_len; -+ if (free1 >= 0 && total > free1 && free2 >= 0 && total > free2) { -+ /* have no enough space */ -+ err = -ENOSPC; -+ goto finish; -+ } -+ -+ /* time to remove attribute */ -+ if (found) { -+ if (where == 0) { -+ /* EA is stored in inode body */ -+ ext3_xattr_ibody_set(handle, inode, name_index, name, -+ NULL, 0, flags); -+ } else { -+ /* EA is stored in separated block */ -+ ext3_xattr_block_set(handle, inode, name_index, name, -+ NULL, 0, flags); -+ } -+ } -+ -+ /* try to store EA in inode body */ -+ err = ext3_xattr_ibody_set(handle, inode, name_index, name, -+ value, value_len, flags); -+ if (err) { -+ /* can't store EA in inode body */ -+ /* try to store in block */ -+ err = ext3_xattr_block_set(handle, inode, name_index, -+ name, value, value_len, flags); -+ } -+ -+finish: -+ return err; -+} -+ -+/* -+ * ext3_xattr_block_set() -+ * -+ * this routine add/remove/replace attribute in EA block -+ */ -+int -+ext3_xattr_block_set(handle_t *handle, struct inode *inode, int name_index, - const char *name, const void *value, size_t value_len, - int flags) - { -@@ -868,6 +1174,279 @@ - } - - /* -+ * ext3_xattr_ibody_find() -+ * -+ * search attribute and calculate free space in inode body -+ * NOTE: free space includes space our attribute hold -+ */ -+int -+ext3_xattr_ibody_find(struct inode *inode, int name_index, -+ const char *name, struct ext3_xattr_entry *rentry, int *free) -+{ -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ int name_len = strlen(name); -+ int err, storage_size; -+ struct ext3_iloc iloc; -+ char *start, *end; -+ int ret = -ENOENT; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return ret; -+ -+ err = ext3_get_inode_loc(inode, &iloc); -+ if (err) -+ return -EIO; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ *free = storage_size - sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return -ENOENT; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_find", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) { -+ memcpy(rentry, last, sizeof(struct ext3_xattr_entry)); -+ ret = 0; -+ } else { -+ *free -= EXT3_XATTR_LEN(last->e_name_len); -+ *free -= le32_to_cpu(last->e_value_size); -+ } -+ last = next; -+ } -+ -+ brelse(iloc.bh); -+ return ret; -+} -+ -+/* -+ * ext3_xattr_block_find() -+ * -+ * search attribute and calculate free space in EA block (if it allocated) -+ * NOTE: free space includes space our attribute hold -+ */ -+int -+ext3_xattr_block_find(struct inode *inode, int name_index, const char *name, -+ struct ext3_xattr_entry *rentry, int *free) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ char *end; -+ int name_len, error = -ENOENT; -+ -+ if (!EXT3_I(inode)->i_file_acl) { -+ *free = inode->i_sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - -+ sizeof(__u32); -+ return -ENOENT; -+ } -+ ea_idebug(inode, "reading block %d", EXT3_I(inode)->i_file_acl); -+ bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, -+ EXT3_I(inode)->i_file_acl); -+ brelse(bh); -+ return -EIO; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ *free = bh->b_size - sizeof(__u32); -+ -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) { -+ memcpy(rentry, entry, sizeof(struct ext3_xattr_entry)); -+ error = 0; -+ } else { -+ *free -= EXT3_XATTR_LEN(entry->e_name_len); -+ *free -= le32_to_cpu(entry->e_value_size); -+ } -+ entry = next; -+ } -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_inode_set() -+ * -+ * this routine add/remove/replace attribute in inode body -+ */ -+int -+ext3_xattr_ibody_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, -+ int flags) -+{ -+ struct ext3_xattr_entry *last, *next, *here = NULL; -+ struct ext3_inode *raw_inode; -+ int name_len = strlen(name); -+ int esize = EXT3_XATTR_LEN(name_len); -+ struct buffer_head *bh; -+ int err, storage_size; -+ struct ext3_iloc iloc; -+ int free, min_offs; -+ char *start, *end; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return -ENOSPC; -+ -+ err = ext3_get_inode_loc(inode, &iloc); -+ if (err) -+ return err; -+ raw_inode = iloc.raw_inode; -+ bh = iloc.bh; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if ((*(__u32*) start) != EXT3_XATTR_MAGIC) { -+ /* inode had no attributes before */ -+ *((__u32*) start) = cpu_to_le32(EXT3_XATTR_MAGIC); -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ min_offs = storage_size; -+ free = storage_size - sizeof(__u32); -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_set", -+ "inode %ld", inode->i_ino); -+ brelse(bh); -+ return -EIO; -+ } -+ -+ if (last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) -+ here = last; -+ else { -+ /* we calculate all but our attribute -+ * because it will be removed before changing */ -+ free -= EXT3_XATTR_LEN(last->e_name_len); -+ free -= le32_to_cpu(last->e_value_size); -+ } -+ last = next; -+ } -+ -+ if (value && (esize + value_len > free)) { -+ brelse(bh); -+ return -ENOSPC; -+ } -+ -+ err = ext3_reserve_inode_write(handle, inode, &iloc); -+ if (err) { -+ brelse(bh); -+ return err; -+ } -+ -+ if (here) { -+ /* time to remove old value */ -+ struct ext3_xattr_entry *e; -+ int size = le32_to_cpu(here->e_value_size); -+ int border = le16_to_cpu(here->e_value_offs); -+ char *src; -+ -+ /* move tail */ -+ memmove(start + min_offs + size, start + min_offs, -+ border - min_offs); -+ -+ /* recalculate offsets */ -+ e = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(e)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(e); -+ int offs = le16_to_cpu(e->e_value_offs); -+ if (offs < border) -+ e->e_value_offs = -+ cpu_to_le16(offs + size); -+ e = next; -+ } -+ min_offs += size; -+ -+ /* remove entry */ -+ border = EXT3_XATTR_LEN(here->e_name_len); -+ src = (char *) here + EXT3_XATTR_LEN(here->e_name_len); -+ size = (char *) last - src; -+ if ((char *) here + size > end) -+ printk("ALERT at %s:%d: 0x%p + %d > 0x%p\n", -+ __FILE__, __LINE__, here, size, end); -+ memmove(here, src, size); -+ last = (struct ext3_xattr_entry *) ((char *) last - border); -+ *((__u32 *) last) = 0; -+ } -+ -+ if (value) { -+ int offs = min_offs - value_len; -+ /* use last to create new entry */ -+ last->e_name_len = strlen(name); -+ last->e_name_index = name_index; -+ last->e_value_offs = cpu_to_le16(offs); -+ last->e_value_size = cpu_to_le32(value_len); -+ last->e_hash = last->e_value_block = 0; -+ memset(last->e_name, 0, esize); -+ memcpy(last->e_name, name, last->e_name_len); -+ if (start + offs + value_len > end) -+ printk("ALERT at %s:%d: 0x%p + %d + %d > 0x%p\n", -+ __FILE__, __LINE__, start, offs, -+ value_len, end); -+ memcpy(start + offs, value, value_len); -+ last = EXT3_XATTR_NEXT(last); -+ *((__u32 *) last) = 0; -+ } -+ -+ ext3_mark_iloc_dirty(handle, inode, &iloc); -+ brelse(bh); -+ -+ return 0; -+} -+ -+/* - * ext3_xattr_set_trans() - * - * Like ext3_xattr_set_handle, but start from an inode. This extended -Index: linux-2.4.21-chaos/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/super.c 2003-12-12 17:39:11.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/super.c 2003-12-12 17:39:55.000000000 +0300 -@@ -1354,8 +1354,10 @@ - } else { - sbi->s_inode_size = le16_to_cpu(es->s_inode_size); - sbi->s_first_ino = le32_to_cpu(es->s_first_ino); -- if (sbi->s_inode_size != EXT3_GOOD_OLD_INODE_SIZE) { -- printk (KERN_ERR -+ if ((sbi->s_inode_size < EXT3_GOOD_OLD_INODE_SIZE) || -+ (sbi->s_inode_size & (sbi->s_inode_size - 1)) || -+ (sbi->s_inode_size > blocksize)) { -+ printk (KERN_ERR - "EXT3-fs: unsupported inode size: %d\n", - sbi->s_inode_size); - goto failed_mount; -Index: linux-2.4.21-chaos/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs.h 2003-12-12 17:39:10.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs.h 2003-12-12 17:39:55.000000000 +0300 -@@ -268,6 +268,8 @@ - __u32 m_i_reserved2[2]; - } masix2; - } osd2; /* OS dependent 2 */ -+ __u16 i_extra_isize; -+ __u16 i_pad1; - }; - - #define i_size_high i_dir_acl -Index: linux-2.4.21-chaos/include/linux/ext3_fs_i.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs_i.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs_i.h 2003-12-12 17:39:55.000000000 +0300 -@@ -76,6 +76,9 @@ - */ - loff_t i_disksize; - -+ /* on-disk additional length */ -+ __u16 i_extra_isize; -+ - /* - * truncate_sem is for serialising ext3_truncate() against - * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.21-suse2.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.21-suse2.patch deleted file mode 100644 index edcf826957..0000000000 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.21-suse2.patch +++ /dev/null @@ -1,760 +0,0 @@ - fs/ext3/ialloc.c | 6 - fs/ext3/inode.c | 12 - fs/ext3/super.c | 6 - fs/ext3/xattr.c | 597 +++++++++++++++++++++++++++++++++++++++++++++- - include/linux/ext3_fs.h | 2 - include/linux/ext3_fs_i.h | 3 - 6 files changed, 615 insertions(+), 11 deletions(-) - -Index: linux-2.4.21-chaos/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ialloc.c 2003-12-12 17:39:10.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ialloc.c 2003-12-12 17:39:55.000000000 +0300 -@@ -580,6 +580,12 @@ - insert_inode_hash(inode); - inode->i_generation = sbi->s_next_generation++; - -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) { -+ EXT3_I(inode)->i_extra_isize = sizeof(__u16) /* i_extra_isize */ -+ + sizeof(__u16); /* i_pad1 */ -+ } else -+ EXT3_I(inode)->i_extra_isize = 0; -+ - inode->u.ext3_i.i_state = EXT3_STATE_NEW; - err = ext3_get_inode_loc_new(inode, &iloc, 1); - if (err) goto fail; -Index: linux-2.4.21-chaos/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/inode.c 2003-12-12 17:39:11.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/inode.c 2003-12-12 17:39:55.000000000 +0300 -@@ -2502,6 +2502,12 @@ - ei->i_data[block] = iloc.raw_inode->i_block[block]; - INIT_LIST_HEAD(&ei->i_orphan); - -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) -+ EXT3_I(inode)->i_extra_isize = -+ le16_to_cpu(raw_inode->i_extra_isize); -+ else -+ EXT3_I(inode)->i_extra_isize = 0; -+ - if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; -@@ -2564,6 +2570,8 @@ - if (err) - goto out_brelse; - } -+ if (EXT3_I(inode)->i_state & EXT3_STATE_NEW) -+ memset(raw_inode, 0, EXT3_INODE_SIZE(inode->i_sb)); - raw_inode->i_mode = cpu_to_le16(inode->i_mode); - if(!(test_opt(inode->i_sb, NO_UID32))) { - raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid)); -@@ -2646,6 +2654,10 @@ - else for (block = 0; block < EXT3_N_BLOCKS; block++) - raw_inode->i_block[block] = ei->i_data[block]; - -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) -+ raw_inode->i_extra_isize = -+ cpu_to_le16(EXT3_I(inode)->i_extra_isize); -+ - BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); - rc = ext3_journal_dirty_metadata(handle, bh); - if (!err) -Index: linux-2.4.21-chaos/fs/ext3/xattr.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/xattr.c 2003-12-12 17:38:44.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/xattr.c 2003-12-12 17:42:58.000000000 +0300 -@@ -88,6 +88,9 @@ - struct buffer_head *, - struct ext3_xattr_header *); - -+int ext3_xattr_block_set(handle_t *, struct inode *, int, const char *, -+ const void *, size_t, int); -+ - #ifdef CONFIG_EXT3_FS_XATTR_SHARING - - static int ext3_xattr_cache_insert(struct buffer_head *); -@@ -256,17 +259,12 @@ - } - - /* -- * ext3_xattr_get() -- * -- * Copy an extended attribute into the buffer -- * provided, or compute the buffer size required. -- * Buffer is NULL to compute the size of the buffer required. -+ * ext3_xattr_block_get() - * -- * Returns a negative error number on failure, or the number of bytes -- * used / required on success. -+ * routine looks for attribute in EA block and returns it's value and size - */ - int --ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ext3_xattr_block_get(struct inode *inode, int name_index, const char *name, - void *buffer, size_t buffer_size) - { - struct buffer_head *bh = NULL; -@@ -359,6 +357,94 @@ - } - - /* -+ * ext3_xattr_ibode_get() -+ * -+ * routine looks for attribute in inode body and returns it's value and size -+ */ -+int -+ext3_xattr_ibody_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ int size, name_len = strlen(name), storage_size; -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ struct ext3_iloc iloc; -+ char *start, *end; -+ int ret = -ENOENT; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return -ENOENT; -+ -+ ret = ext3_get_inode_loc(inode, &iloc); -+ if (ret) -+ return ret; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return -ENOENT; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_get", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) -+ goto found; -+ last = next; -+ } -+ -+ /* can't find EA */ -+ brelse(iloc.bh); -+ return -ENOENT; -+ -+found: -+ size = le32_to_cpu(last->e_value_size); -+ if (buffer) { -+ ret = -ERANGE; -+ if (buffer_size >= size) { -+ memcpy(buffer, start + le16_to_cpu(last->e_value_offs), -+ size); -+ ret = size; -+ } -+ } else -+ ret = size; -+ brelse(iloc.bh); -+ return ret; -+} -+ -+int ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ int err; -+ -+ /* try to find attribute in inode body */ -+ err = ext3_xattr_ibody_get(inode, name_index, name, -+ buffer, buffer_size); -+ if (err < 0) -+ /* search was unsuccessful, try to find EA in dedicated block */ -+ err = ext3_xattr_block_get(inode, name_index, name, -+ buffer, buffer_size); -+ return err; -+} -+ -+/* - * ext3_xattr_list() - * - * Copy a list of attribute names into the buffer -@@ -369,7 +455,7 @@ - * used / required on success. - */ - int --ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+ext3_xattr_block_list(struct inode *inode, char *buffer, size_t buffer_size) - { - struct buffer_head *bh = NULL; - struct ext3_xattr_entry *entry; -@@ -446,6 +532,131 @@ - return error; - } - -+/* ext3_xattr_ibody_list() -+ * -+ * generate list of attributes stored in inode body -+ */ -+int -+ext3_xattr_ibody_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ char *start, *end, *buf; -+ struct ext3_iloc iloc; -+ int storage_size; -+ int ret; -+ int size = 0; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return 0; -+ -+ ret = ext3_get_inode_loc(inode, &iloc); -+ if (ret) -+ return ret; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return 0; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ struct ext3_xattr_handler *handler; -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_list", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ handler = ext3_xattr_handler(last->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, last->e_name, -+ last->e_name_len); -+ last = next; -+ } -+ -+ if (!buffer) { -+ ret = size; -+ goto cleanup; -+ } else { -+ ret = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ last = (struct ext3_xattr_entry *) start; -+ buf = buffer; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ struct ext3_xattr_handler *handler; -+ handler = ext3_xattr_handler(last->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, last->e_name, -+ last->e_name_len); -+ last = next; -+ } -+ ret = size; -+cleanup: -+ brelse(iloc.bh); -+ return ret; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ int error; -+ int size = buffer_size; -+ -+ /* get list of attributes stored in inode body */ -+ error = ext3_xattr_ibody_list(inode, buffer, buffer_size); -+ if (error < 0) { -+ /* some error occured while collecting -+ * attributes in inode body */ -+ size = 0; -+ goto cleanup; -+ } -+ size = error; -+ -+ /* get list of attributes stored in dedicated block */ -+ if (buffer) { -+ buffer_size -= error; -+ if (buffer_size <= 0) { -+ buffer = NULL; -+ buffer_size = 0; -+ } else -+ buffer += error; -+ } -+ -+ error = ext3_xattr_block_list(inode, buffer, buffer_size); -+ if (error < 0) -+ /* listing was successful, so we return len */ -+ size = 0; -+ -+cleanup: -+ return error + size; -+} -+ - /* - * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is - * not set, set it. -@@ -480,6 +691,102 @@ - */ - int - ext3_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, -+ int flags) -+{ -+ struct ext3_xattr_entry entry; -+ int err, where = 0, found = 0, total; -+ int free1 = -1, free2 = -1; -+ int name_len; -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > inode->i_sb->s_blocksize) -+ return -ERANGE; -+ -+ /* try to find attribute in inode body */ -+ err = ext3_xattr_ibody_find(inode, name_index, name, &entry, &free1); -+ if (err == 0) { -+ /* found EA in inode */ -+ found = 1; -+ where = 0; -+ } else if (err == -ENOENT) { -+ /* there is no such attribute in inode body */ -+ /* try to find attribute in dedicated block */ -+ err = ext3_xattr_block_find(inode, name_index, name, -+ &entry, &free2); -+ if (err != 0 && err != -ENOENT) { -+ /* not found EA in block */ -+ goto finish; -+ } else if (err == 0) { -+ /* found EA in block */ -+ where = 1; -+ found = 1; -+ } -+ } else -+ goto finish; -+ -+ /* check flags: may replace? may create ? */ -+ if (found && (flags & XATTR_CREATE)) { -+ err = -EEXIST; -+ goto finish; -+ } else if (!found && (flags & XATTR_REPLACE)) { -+ err = -ENODATA; -+ goto finish; -+ } -+ -+ /* check if we have enough space to store attribute */ -+ total = EXT3_XATTR_LEN(strlen(name)) + value_len; -+ if (free1 >= 0 && total > free1 && free2 >= 0 && total > free2) { -+ /* have no enough space */ -+ err = -ENOSPC; -+ goto finish; -+ } -+ -+ /* time to remove attribute */ -+ if (found) { -+ if (where == 0) { -+ /* EA is stored in inode body */ -+ ext3_xattr_ibody_set(handle, inode, name_index, name, -+ NULL, 0, flags); -+ } else { -+ /* EA is stored in separated block */ -+ ext3_xattr_block_set(handle, inode, name_index, name, -+ NULL, 0, flags); -+ } -+ } -+ -+ /* try to store EA in inode body */ -+ err = ext3_xattr_ibody_set(handle, inode, name_index, name, -+ value, value_len, flags); -+ if (err) { -+ /* can't store EA in inode body */ -+ /* try to store in block */ -+ err = ext3_xattr_block_set(handle, inode, name_index, -+ name, value, value_len, flags); -+ } -+ -+finish: -+ return err; -+} -+ -+/* -+ * ext3_xattr_block_set() -+ * -+ * this routine add/remove/replace attribute in EA block -+ */ -+int -+ext3_xattr_block_set(handle_t *handle, struct inode *inode, int name_index, - const char *name, const void *value, size_t value_len, - int flags) - { -@@ -868,6 +1174,279 @@ - } - - /* -+ * ext3_xattr_ibody_find() -+ * -+ * search attribute and calculate free space in inode body -+ * NOTE: free space includes space our attribute hold -+ */ -+int -+ext3_xattr_ibody_find(struct inode *inode, int name_index, -+ const char *name, struct ext3_xattr_entry *rentry, int *free) -+{ -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ int name_len = strlen(name); -+ int err, storage_size; -+ struct ext3_iloc iloc; -+ char *start, *end; -+ int ret = -ENOENT; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return ret; -+ -+ err = ext3_get_inode_loc(inode, &iloc); -+ if (err) -+ return -EIO; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ *free = storage_size - sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return -ENOENT; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_find", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) { -+ memcpy(rentry, last, sizeof(struct ext3_xattr_entry)); -+ ret = 0; -+ } else { -+ *free -= EXT3_XATTR_LEN(last->e_name_len); -+ *free -= le32_to_cpu(last->e_value_size); -+ } -+ last = next; -+ } -+ -+ brelse(iloc.bh); -+ return ret; -+} -+ -+/* -+ * ext3_xattr_block_find() -+ * -+ * search attribute and calculate free space in EA block (if it allocated) -+ * NOTE: free space includes space our attribute hold -+ */ -+int -+ext3_xattr_block_find(struct inode *inode, int name_index, const char *name, -+ struct ext3_xattr_entry *rentry, int *free) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ char *end; -+ int name_len, error = -ENOENT; -+ -+ if (!EXT3_I(inode)->i_file_acl) { -+ *free = inode->i_sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - -+ sizeof(__u32); -+ return -ENOENT; -+ } -+ ea_idebug(inode, "reading block %d", EXT3_I(inode)->i_file_acl); -+ bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, -+ EXT3_I(inode)->i_file_acl); -+ brelse(bh); -+ return -EIO; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ *free = bh->b_size - sizeof(__u32); -+ -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) { -+ memcpy(rentry, entry, sizeof(struct ext3_xattr_entry)); -+ error = 0; -+ } else { -+ *free -= EXT3_XATTR_LEN(entry->e_name_len); -+ *free -= le32_to_cpu(entry->e_value_size); -+ } -+ entry = next; -+ } -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_inode_set() -+ * -+ * this routine add/remove/replace attribute in inode body -+ */ -+int -+ext3_xattr_ibody_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, -+ int flags) -+{ -+ struct ext3_xattr_entry *last, *next, *here = NULL; -+ struct ext3_inode *raw_inode; -+ int name_len = strlen(name); -+ int esize = EXT3_XATTR_LEN(name_len); -+ struct buffer_head *bh; -+ int err, storage_size; -+ struct ext3_iloc iloc; -+ int free, min_offs; -+ char *start, *end; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return -ENOSPC; -+ -+ err = ext3_get_inode_loc(inode, &iloc); -+ if (err) -+ return err; -+ raw_inode = iloc.raw_inode; -+ bh = iloc.bh; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if ((*(__u32*) start) != EXT3_XATTR_MAGIC) { -+ /* inode had no attributes before */ -+ *((__u32*) start) = cpu_to_le32(EXT3_XATTR_MAGIC); -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ min_offs = storage_size; -+ free = storage_size - sizeof(__u32); -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_set", -+ "inode %ld", inode->i_ino); -+ brelse(bh); -+ return -EIO; -+ } -+ -+ if (last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) -+ here = last; -+ else { -+ /* we calculate all but our attribute -+ * because it will be removed before changing */ -+ free -= EXT3_XATTR_LEN(last->e_name_len); -+ free -= le32_to_cpu(last->e_value_size); -+ } -+ last = next; -+ } -+ -+ if (value && (esize + value_len > free)) { -+ brelse(bh); -+ return -ENOSPC; -+ } -+ -+ err = ext3_reserve_inode_write(handle, inode, &iloc); -+ if (err) { -+ brelse(bh); -+ return err; -+ } -+ -+ if (here) { -+ /* time to remove old value */ -+ struct ext3_xattr_entry *e; -+ int size = le32_to_cpu(here->e_value_size); -+ int border = le16_to_cpu(here->e_value_offs); -+ char *src; -+ -+ /* move tail */ -+ memmove(start + min_offs + size, start + min_offs, -+ border - min_offs); -+ -+ /* recalculate offsets */ -+ e = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(e)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(e); -+ int offs = le16_to_cpu(e->e_value_offs); -+ if (offs < border) -+ e->e_value_offs = -+ cpu_to_le16(offs + size); -+ e = next; -+ } -+ min_offs += size; -+ -+ /* remove entry */ -+ border = EXT3_XATTR_LEN(here->e_name_len); -+ src = (char *) here + EXT3_XATTR_LEN(here->e_name_len); -+ size = (char *) last - src; -+ if ((char *) here + size > end) -+ printk("ALERT at %s:%d: 0x%p + %d > 0x%p\n", -+ __FILE__, __LINE__, here, size, end); -+ memmove(here, src, size); -+ last = (struct ext3_xattr_entry *) ((char *) last - border); -+ *((__u32 *) last) = 0; -+ } -+ -+ if (value) { -+ int offs = min_offs - value_len; -+ /* use last to create new entry */ -+ last->e_name_len = strlen(name); -+ last->e_name_index = name_index; -+ last->e_value_offs = cpu_to_le16(offs); -+ last->e_value_size = cpu_to_le32(value_len); -+ last->e_hash = last->e_value_block = 0; -+ memset(last->e_name, 0, esize); -+ memcpy(last->e_name, name, last->e_name_len); -+ if (start + offs + value_len > end) -+ printk("ALERT at %s:%d: 0x%p + %d + %d > 0x%p\n", -+ __FILE__, __LINE__, start, offs, -+ value_len, end); -+ memcpy(start + offs, value, value_len); -+ last = EXT3_XATTR_NEXT(last); -+ *((__u32 *) last) = 0; -+ } -+ -+ ext3_mark_iloc_dirty(handle, inode, &iloc); -+ brelse(bh); -+ -+ return 0; -+} -+ -+/* - * ext3_xattr_set_trans() - * - * Like ext3_xattr_set_handle, but start from an inode. This extended -Index: linux-2.4.21-chaos/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/super.c 2003-12-12 17:39:11.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/super.c 2003-12-12 17:39:55.000000000 +0300 -@@ -1354,8 +1354,10 @@ - } else { - sbi->s_inode_size = le16_to_cpu(es->s_inode_size); - sbi->s_first_ino = le32_to_cpu(es->s_first_ino); -- if (sbi->s_inode_size != EXT3_GOOD_OLD_INODE_SIZE) { -- printk (KERN_ERR -+ if ((sbi->s_inode_size < EXT3_GOOD_OLD_INODE_SIZE) || -+ (sbi->s_inode_size & (sbi->s_inode_size - 1)) || -+ (sbi->s_inode_size > blocksize)) { -+ printk (KERN_ERR - "EXT3-fs: unsupported inode size: %d\n", - sbi->s_inode_size); - goto failed_mount; -Index: linux-2.4.21-chaos/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs.h 2003-12-12 17:39:10.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs.h 2003-12-12 17:39:55.000000000 +0300 -@@ -268,6 +268,8 @@ - __u32 m_i_reserved2[2]; - } masix2; - } osd2; /* OS dependent 2 */ -+ __u16 i_extra_isize; -+ __u16 i_pad1; - }; - - #define i_size_high i_dir_acl -Index: linux-2.4.21-chaos/include/linux/ext3_fs_i.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs_i.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs_i.h 2003-12-12 17:39:55.000000000 +0300 -@@ -76,6 +76,9 @@ - */ - loff_t i_disksize; - -+ /* on-disk additional length */ -+ __u16 i_extra_isize; -+ - /* - * truncate_sem is for serialising ext3_truncate() against - * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch deleted file mode 100644 index c1ae5edaab..0000000000 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.22-rh.patch +++ /dev/null @@ -1,787 +0,0 @@ - fs/ext3/ialloc.c | 6 - fs/ext3/inode.c | 12 - fs/ext3/super.c | 6 - fs/ext3/xattr.c | 597 +++++++++++++++++++++++++++++++++++++++++++++- - include/linux/ext3_fs.h | 2 - include/linux/ext3_fs_i.h | 3 - 6 files changed, 615 insertions(+), 11 deletions(-) - -Index: linux-2.4.24/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/ialloc.c 2004-07-13 11:07:17.000000000 +0400 -+++ linux-2.4.24/fs/ext3/ialloc.c 2004-07-14 18:04:43.000000000 +0400 -@@ -576,6 +576,13 @@ - insert_inode_hash(inode); - inode->i_generation = sb->u.ext3_sb.s_next_generation++; - -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) { -+ inode->u.ext3_i.i_extra_isize = sizeof(__u16) /* i_extra_isize */ -+ + sizeof(__u16); /* i_pad1 */ -+ inode->u.ext3_i.i_flags |= EXT3_EXTRA_ISIZE; -+ } else -+ inode->u.ext3_i.i_extra_isize = 0; -+ - inode->u.ext3_i.i_state = EXT3_STATE_NEW; - err = ext3_get_inode_loc_new(inode, &iloc, 1); - if (err) goto fail; -Index: linux-2.4.24/fs/ext3/inode.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/inode.c 2004-07-13 11:07:18.000000000 +0400 -+++ linux-2.4.24/fs/ext3/inode.c 2004-07-14 18:11:39.000000000 +0400 -@@ -2225,6 +2225,23 @@ - inode->u.ext3_i.i_data[block] = iloc.raw_inode->i_block[block]; - INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); - -+ inode->u.ext3_i.i_extra_isize = 0; -+ if (inode->u.ext3_i.i_flags & EXT3_EXTRA_ISIZE) { -+ BUG_ON(EXT3_INODE_SIZE(inode->i_sb) <= EXT3_GOOD_OLD_INODE_SIZE); -+ inode->u.ext3_i.i_extra_isize = -+ le16_to_cpu(raw_inode->i_extra_isize); -+ } else if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) { -+ /* this is dirty hack for already formatted filesystems: -+ * inodes with inum <= 11 are created by mke2fs that doesn't -+ * initialize extra space and inodes with larger inum are -+ * created by ext3 itself that initializes extra space -bzzz */ -+ if (inode->i_ino > 11) -+ inode->u.ext3_i.i_extra_isize = -+ le16_to_cpu(raw_inode->i_extra_isize); -+ } -+ block = EXT3_INODE_SIZE(inode->i_sb) - EXT3_GOOD_OLD_INODE_SIZE; -+ BUG_ON(inode->u.ext3_i.i_extra_isize > block); -+ - if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; -@@ -2273,6 +2290,8 @@ - if (err) - goto out_brelse; - } -+ if (EXT3_I(inode)->i_state & EXT3_STATE_NEW) -+ memset(raw_inode, 0, EXT3_INODE_SIZE(inode->i_sb)); - raw_inode->i_mode = cpu_to_le16(inode->i_mode); - if(!(test_opt(inode->i_sb, NO_UID32))) { - raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid)); -@@ -2356,6 +2375,10 @@ - else for (block = 0; block < EXT3_N_BLOCKS; block++) - raw_inode->i_block[block] = inode->u.ext3_i.i_data[block]; - -+ if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) -+ raw_inode->i_extra_isize = -+ cpu_to_le16(EXT3_I(inode)->i_extra_isize); -+ - BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); - rc = ext3_journal_dirty_metadata(handle, bh); - if (!err) -Index: linux-2.4.24/fs/ext3/super.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/super.c 2004-07-13 11:07:19.000000000 +0400 -+++ linux-2.4.24/fs/ext3/super.c 2004-07-14 18:00:14.000000000 +0400 -@@ -1203,8 +1203,10 @@ - } else { - sbi->s_inode_size = le16_to_cpu(es->s_inode_size); - sbi->s_first_ino = le32_to_cpu(es->s_first_ino); -- if (sbi->s_inode_size != EXT3_GOOD_OLD_INODE_SIZE) { -- printk (KERN_ERR -+ if ((sbi->s_inode_size < EXT3_GOOD_OLD_INODE_SIZE) || -+ (sbi->s_inode_size & (sbi->s_inode_size - 1)) || -+ (sbi->s_inode_size > blocksize)) { -+ printk (KERN_ERR - "EXT3-fs: unsupported inode size: %d\n", - sbi->s_inode_size); - goto failed_mount; -Index: linux-2.4.24/fs/ext3/xattr.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/xattr.c 2004-07-13 11:07:16.000000000 +0400 -+++ linux-2.4.24/fs/ext3/xattr.c 2004-07-14 18:00:14.000000000 +0400 -@@ -100,6 +100,9 @@ - static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, - struct ext3_xattr_header *); - -+int ext3_xattr_block_set(handle_t *, struct inode *, int, const char *, -+ const void *, size_t, int); -+ - #ifdef CONFIG_EXT3_FS_XATTR_SHARING - - static int ext3_xattr_cache_insert(struct buffer_head *); -@@ -348,17 +351,12 @@ - } - - /* -- * ext3_xattr_get() -- * -- * Copy an extended attribute into the buffer -- * provided, or compute the buffer size required. -- * Buffer is NULL to compute the size of the buffer required. -+ * ext3_xattr_block_get() - * -- * Returns a negative error number on failure, or the number of bytes -- * used / required on success. -+ * routine looks for attribute in EA block and returns it's value and size - */ - int --ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ext3_xattr_block_get(struct inode *inode, int name_index, const char *name, - void *buffer, size_t buffer_size) - { - struct buffer_head *bh = NULL; -@@ -447,6 +445,94 @@ - } - - /* -+ * ext3_xattr_ibode_get() -+ * -+ * routine looks for attribute in inode body and returns it's value and size -+ */ -+int -+ext3_xattr_ibody_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ int size, name_len = strlen(name), storage_size; -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ struct ext3_iloc iloc; -+ char *start, *end; -+ int ret = -ENOENT; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return -ENOENT; -+ -+ ret = ext3_get_inode_loc(inode, &iloc); -+ if (ret) -+ return ret; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return -ENOENT; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_get", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) -+ goto found; -+ last = next; -+ } -+ -+ /* can't find EA */ -+ brelse(iloc.bh); -+ return -ENOENT; -+ -+found: -+ size = le32_to_cpu(last->e_value_size); -+ if (buffer) { -+ ret = -ERANGE; -+ if (buffer_size >= size) { -+ memcpy(buffer, start + le16_to_cpu(last->e_value_offs), -+ size); -+ ret = size; -+ } -+ } else -+ ret = size; -+ brelse(iloc.bh); -+ return ret; -+} -+ -+int ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ int err; -+ -+ /* try to find attribute in inode body */ -+ err = ext3_xattr_ibody_get(inode, name_index, name, -+ buffer, buffer_size); -+ if (err < 0) -+ /* search was unsuccessful, try to find EA in dedicated block */ -+ err = ext3_xattr_block_get(inode, name_index, name, -+ buffer, buffer_size); -+ return err; -+} -+ -+/* - * ext3_xattr_list() - * - * Copy a list of attribute names into the buffer -@@ -457,7 +543,7 @@ - * used / required on success. - */ - int --ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+ext3_xattr_block_list(struct inode *inode, char *buffer, size_t buffer_size) - { - struct buffer_head *bh = NULL; - struct ext3_xattr_entry *entry; -@@ -530,6 +616,131 @@ - return error; - } - -+/* ext3_xattr_ibody_list() -+ * -+ * generate list of attributes stored in inode body -+ */ -+int -+ext3_xattr_ibody_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ char *start, *end, *buf; -+ struct ext3_iloc iloc; -+ int storage_size; -+ int ret; -+ int size = 0; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return 0; -+ -+ ret = ext3_get_inode_loc(inode, &iloc); -+ if (ret) -+ return ret; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return 0; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ struct ext3_xattr_handler *handler; -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_list", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ handler = ext3_xattr_handler(last->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, last->e_name, -+ last->e_name_len); -+ last = next; -+ } -+ -+ if (!buffer) { -+ ret = size; -+ goto cleanup; -+ } else { -+ ret = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ last = (struct ext3_xattr_entry *) start; -+ buf = buffer; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ struct ext3_xattr_handler *handler; -+ handler = ext3_xattr_handler(last->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, last->e_name, -+ last->e_name_len); -+ last = next; -+ } -+ ret = size; -+cleanup: -+ brelse(iloc.bh); -+ return ret; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ int error; -+ int size = buffer_size; -+ -+ /* get list of attributes stored in inode body */ -+ error = ext3_xattr_ibody_list(inode, buffer, buffer_size); -+ if (error < 0) { -+ /* some error occured while collecting -+ * attributes in inode body */ -+ size = 0; -+ goto cleanup; -+ } -+ size = error; -+ -+ /* get list of attributes stored in dedicated block */ -+ if (buffer) { -+ buffer_size -= error; -+ if (buffer_size <= 0) { -+ buffer = NULL; -+ buffer_size = 0; -+ } else -+ buffer += error; -+ } -+ -+ error = ext3_xattr_block_list(inode, buffer, buffer_size); -+ if (error < 0) -+ /* listing was successful, so we return len */ -+ size = 0; -+ -+cleanup: -+ return error + size; -+} -+ - /* - * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is - * not set, set it. -@@ -553,6 +764,279 @@ - } - - /* -+ * ext3_xattr_ibody_find() -+ * -+ * search attribute and calculate free space in inode body -+ * NOTE: free space includes space our attribute hold -+ */ -+int -+ext3_xattr_ibody_find(struct inode *inode, int name_index, -+ const char *name, struct ext3_xattr_entry *rentry, int *free) -+{ -+ struct ext3_xattr_entry *last; -+ struct ext3_inode *raw_inode; -+ int name_len = strlen(name); -+ int err, storage_size; -+ struct ext3_iloc iloc; -+ char *start, *end; -+ int ret = -ENOENT; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return ret; -+ -+ err = ext3_get_inode_loc(inode, &iloc); -+ if (err) -+ return -EIO; -+ raw_inode = iloc.raw_inode; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ *free = storage_size - sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if (le32_to_cpu((*(__u32*) start)) != EXT3_XATTR_MAGIC) { -+ brelse(iloc.bh); -+ return -ENOENT; -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_find", -+ "inode %ld", inode->i_ino); -+ brelse(iloc.bh); -+ return -EIO; -+ } -+ -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) { -+ memcpy(rentry, last, sizeof(struct ext3_xattr_entry)); -+ ret = 0; -+ } else { -+ *free -= EXT3_XATTR_LEN(last->e_name_len); -+ *free -= le32_to_cpu(last->e_value_size); -+ } -+ last = next; -+ } -+ -+ brelse(iloc.bh); -+ return ret; -+} -+ -+/* -+ * ext3_xattr_block_find() -+ * -+ * search attribute and calculate free space in EA block (if it allocated) -+ * NOTE: free space includes space our attribute hold -+ */ -+int -+ext3_xattr_block_find(struct inode *inode, int name_index, const char *name, -+ struct ext3_xattr_entry *rentry, int *free) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ char *end; -+ int name_len, error = -ENOENT; -+ -+ if (!EXT3_I(inode)->i_file_acl) { -+ *free = inode->i_sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - -+ sizeof(__u32); -+ return -ENOENT; -+ } -+ ea_idebug(inode, "reading block %d", EXT3_I(inode)->i_file_acl); -+ bh = sb_bread(inode->i_sb, EXT3_I(inode)->i_file_acl); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, -+ EXT3_I(inode)->i_file_acl); -+ brelse(bh); -+ return -EIO; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ *free = bh->b_size - sizeof(__u32); -+ -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) { -+ memcpy(rentry, entry, sizeof(struct ext3_xattr_entry)); -+ error = 0; -+ } else { -+ *free -= EXT3_XATTR_LEN(entry->e_name_len); -+ *free -= le32_to_cpu(entry->e_value_size); -+ } -+ entry = next; -+ } -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_inode_set() -+ * -+ * this routine add/remove/replace attribute in inode body -+ */ -+int -+ext3_xattr_ibody_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, -+ int flags) -+{ -+ struct ext3_xattr_entry *last, *next, *here = NULL; -+ struct ext3_inode *raw_inode; -+ int name_len = strlen(name); -+ int esize = EXT3_XATTR_LEN(name_len); -+ struct buffer_head *bh; -+ int err, storage_size; -+ struct ext3_iloc iloc; -+ int free, min_offs; -+ char *start, *end; -+ -+ if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) -+ return -ENOSPC; -+ -+ err = ext3_get_inode_loc(inode, &iloc); -+ if (err) -+ return err; -+ raw_inode = iloc.raw_inode; -+ bh = iloc.bh; -+ -+ storage_size = EXT3_SB(inode->i_sb)->s_inode_size - -+ EXT3_GOOD_OLD_INODE_SIZE - -+ EXT3_I(inode)->i_extra_isize - -+ sizeof(__u32); -+ start = (char *) raw_inode + EXT3_GOOD_OLD_INODE_SIZE + -+ EXT3_I(inode)->i_extra_isize; -+ if ((*(__u32*) start) != EXT3_XATTR_MAGIC) { -+ /* inode had no attributes before */ -+ *((__u32*) start) = cpu_to_le32(EXT3_XATTR_MAGIC); -+ } -+ start += sizeof(__u32); -+ end = (char *) raw_inode + EXT3_SB(inode->i_sb)->s_inode_size; -+ min_offs = storage_size; -+ free = storage_size - sizeof(__u32); -+ -+ last = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(last)) { -+ next = EXT3_XATTR_NEXT(last); -+ if (le32_to_cpu(last->e_value_size) > storage_size || -+ (char *) next >= end) { -+ ext3_error(inode->i_sb, "ext3_xattr_ibody_set", -+ "inode %ld", inode->i_ino); -+ brelse(bh); -+ return -EIO; -+ } -+ -+ if (last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ if (name_index == last->e_name_index && -+ name_len == last->e_name_len && -+ !memcmp(name, last->e_name, name_len)) -+ here = last; -+ else { -+ /* we calculate all but our attribute -+ * because it will be removed before changing */ -+ free -= EXT3_XATTR_LEN(last->e_name_len); -+ free -= le32_to_cpu(last->e_value_size); -+ } -+ last = next; -+ } -+ -+ if (value && (esize + value_len > free)) { -+ brelse(bh); -+ return -ENOSPC; -+ } -+ -+ err = ext3_reserve_inode_write(handle, inode, &iloc); -+ if (err) { -+ brelse(bh); -+ return err; -+ } -+ -+ if (here) { -+ /* time to remove old value */ -+ struct ext3_xattr_entry *e; -+ int size = le32_to_cpu(here->e_value_size); -+ int border = le16_to_cpu(here->e_value_offs); -+ char *src; -+ -+ /* move tail */ -+ memmove(start + min_offs + size, start + min_offs, -+ border - min_offs); -+ -+ /* recalculate offsets */ -+ e = (struct ext3_xattr_entry *) start; -+ while (!IS_LAST_ENTRY(e)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(e); -+ int offs = le16_to_cpu(e->e_value_offs); -+ if (offs < border) -+ e->e_value_offs = -+ cpu_to_le16(offs + size); -+ e = next; -+ } -+ min_offs += size; -+ -+ /* remove entry */ -+ border = EXT3_XATTR_LEN(here->e_name_len); -+ src = (char *) here + EXT3_XATTR_LEN(here->e_name_len); -+ size = (char *) last - src; -+ if ((char *) here + size > end) -+ printk("ALERT at %s:%d: 0x%p + %d > 0x%p\n", -+ __FILE__, __LINE__, here, size, end); -+ memmove(here, src, size); -+ last = (struct ext3_xattr_entry *) ((char *) last - border); -+ *((__u32 *) last) = 0; -+ } -+ -+ if (value) { -+ int offs = min_offs - value_len; -+ /* use last to create new entry */ -+ last->e_name_len = strlen(name); -+ last->e_name_index = name_index; -+ last->e_value_offs = cpu_to_le16(offs); -+ last->e_value_size = cpu_to_le32(value_len); -+ last->e_hash = last->e_value_block = 0; -+ memset(last->e_name, 0, esize); -+ memcpy(last->e_name, name, last->e_name_len); -+ if (start + offs + value_len > end) -+ printk("ALERT at %s:%d: 0x%p + %d + %d > 0x%p\n", -+ __FILE__, __LINE__, start, offs, -+ value_len, end); -+ memcpy(start + offs, value, value_len); -+ last = EXT3_XATTR_NEXT(last); -+ *((__u32 *) last) = 0; -+ } -+ -+ ext3_mark_iloc_dirty(handle, inode, &iloc); -+ brelse(bh); -+ -+ return 0; -+} -+ -+/* - * ext3_xattr_set() - * - * Create, replace or remove an extended attribute for this inode. Buffer -@@ -566,6 +1050,101 @@ - */ - int - ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, int flags) -+{ -+ struct ext3_xattr_entry entry; -+ int err, where = 0, found = 0, total; -+ int free1 = -1, free2 = -1; -+ int name_len; -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > inode->i_sb->s_blocksize) -+ return -ERANGE; -+ -+ /* try to find attribute in inode body */ -+ err = ext3_xattr_ibody_find(inode, name_index, name, &entry, &free1); -+ if (err == 0) { -+ /* found EA in inode */ -+ found = 1; -+ where = 0; -+ } else if (err == -ENOENT) { -+ /* there is no such attribute in inode body */ -+ /* try to find attribute in dedicated block */ -+ err = ext3_xattr_block_find(inode, name_index, name, -+ &entry, &free2); -+ if (err != 0 && err != -ENOENT) { -+ /* not found EA in block */ -+ goto finish; -+ } else if (err == 0) { -+ /* found EA in block */ -+ where = 1; -+ found = 1; -+ } -+ } else -+ goto finish; -+ -+ /* check flags: may replace? may create ? */ -+ if (found && (flags & XATTR_CREATE)) { -+ err = -EEXIST; -+ goto finish; -+ } else if (!found && (flags & XATTR_REPLACE)) { -+ err = -ENODATA; -+ goto finish; -+ } -+ -+ /* check if we have enough space to store attribute */ -+ total = EXT3_XATTR_LEN(strlen(name)) + value_len; -+ if (free1 >= 0 && total > free1 && free2 >= 0 && total > free2) { -+ /* have no enough space */ -+ err = -ENOSPC; -+ goto finish; -+ } -+ -+ /* time to remove attribute */ -+ if (found) { -+ if (where == 0) { -+ /* EA is stored in inode body */ -+ ext3_xattr_ibody_set(handle, inode, name_index, name, -+ NULL, 0, flags); -+ } else { -+ /* EA is stored in separated block */ -+ ext3_xattr_block_set(handle, inode, name_index, name, -+ NULL, 0, flags); -+ } -+ } -+ -+ /* try to store EA in inode body */ -+ err = ext3_xattr_ibody_set(handle, inode, name_index, name, -+ value, value_len, flags); -+ if (err) { -+ /* can't store EA in inode body */ -+ /* try to store in block */ -+ err = ext3_xattr_block_set(handle, inode, name_index, -+ name, value, value_len, flags); -+ } -+ -+finish: -+ return err; -+} -+ -+/* -+ * ext3_xattr_block_set() -+ * -+ * this routine add/remove/replace attribute in EA block -+ */ -+int -+ext3_xattr_block_set(handle_t *handle, struct inode *inode, int name_index, - const char *name, const void *value, size_t value_len, int flags) - { - struct super_block *sb = inode->i_sb; -@@ -603,6 +1182,7 @@ - name_len = strlen(name); - if (name_len > 255 || value_len > sb->s_blocksize) - return -ERANGE; -+ - down(&ext3_xattr_sem); - - if (block) { -Index: linux-2.4.24/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.24.orig/include/linux/ext3_fs.h 2004-07-13 11:07:18.000000000 +0400 -+++ linux-2.4.24/include/linux/ext3_fs.h 2004-07-14 18:04:43.000000000 +0400 -@@ -183,6 +183,7 @@ - #define EXT3_INDEX_FL 0x00001000 /* hash-indexed directory */ - #define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */ - #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ -+#define EXT3_EXTRA_ISIZE 0x00008000 /* inode has initialized i_extra_isize */ - #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ - - #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ -@@ -264,6 +265,8 @@ - __u32 m_i_reserved2[2]; - } masix2; - } osd2; /* OS dependent 2 */ -+ __u16 i_extra_isize; -+ __u16 i_pad1; - }; - - #define i_size_high i_dir_acl -Index: linux-2.4.24/include/linux/ext3_fs_i.h -=================================================================== ---- linux-2.4.24.orig/include/linux/ext3_fs_i.h 2001-11-22 22:46:19.000000000 +0300 -+++ linux-2.4.24/include/linux/ext3_fs_i.h 2004-07-14 18:00:14.000000000 +0400 -@@ -62,6 +62,9 @@ - */ - loff_t i_disksize; - -+ /* on-disk additional length */ -+ __u16 i_extra_isize; -+ - /* - * truncate_sem is for serialising ext3_truncate() against - * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.24.patch similarity index 92% rename from lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch rename to lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.24.patch index aeff645dee..e6eaaf8841 100644 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.20.patch +++ b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.4.24.patch @@ -6,9 +6,9 @@ include/linux/ext3_fs_i.h | 3 6 files changed, 615 insertions(+), 11 deletions(-) ---- linux-2.4.20/fs/ext3/ialloc.c~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:08.000000000 +0400 -+++ linux-2.4.20-alexey/fs/ext3/ialloc.c 2003-10-12 16:25:21.000000000 +0400 -@@ -577,6 +577,12 @@ repeat: +--- linux-2.4.22-ac1/fs/ext3/ialloc.c~ext3-ea-in-inode-2.4.22-rh 2003-10-08 13:57:56.000000000 +0400 ++++ linux-2.4.22-ac1-alexey/fs/ext3/ialloc.c 2003-10-08 15:13:31.000000000 +0400 +@@ -715,6 +715,12 @@ have_bit_and_group: insert_inode_hash(inode); inode->i_generation = sb->u.ext3_sb.s_next_generation++; @@ -21,9 +21,9 @@ inode->u.ext3_i.i_state = EXT3_STATE_NEW; err = ext3_get_inode_loc_new(inode, &iloc, 1); if (err) goto fail; ---- linux-2.4.20/fs/ext3/inode.c~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:08.000000000 +0400 -+++ linux-2.4.20-alexey/fs/ext3/inode.c 2003-10-12 16:25:21.000000000 +0400 -@@ -2209,6 +2209,12 @@ void ext3_read_inode(struct inode * inod +--- linux-2.4.22-ac1/fs/ext3/inode.c~ext3-ea-in-inode-2.4.22-rh 2003-10-08 13:57:57.000000000 +0400 ++++ linux-2.4.22-ac1-alexey/fs/ext3/inode.c 2003-10-08 15:14:57.000000000 +0400 +@@ -2229,6 +2229,12 @@ void ext3_read_inode(struct inode * inod inode->u.ext3_i.i_data[block] = iloc.raw_inode->i_block[block]; INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); @@ -33,10 +33,10 @@ + else + inode->u.ext3_i.i_extra_isize = 0; + - brelse (iloc.bh); - if (S_ISREG(inode->i_mode)) { -@@ -2274,6 +2280,8 @@ static int ext3_do_update_inode(handle_t + inode->i_op = &ext3_file_inode_operations; + inode->i_fop = &ext3_file_operations; +@@ -2277,6 +2283,8 @@ static int ext3_do_update_inode(handle_t if (err) goto out_brelse; } @@ -45,7 +45,7 @@ raw_inode->i_mode = cpu_to_le16(inode->i_mode); if(!(test_opt(inode->i_sb, NO_UID32))) { raw_inode->i_uid_low = cpu_to_le16(low_16_bits(inode->i_uid)); -@@ -2357,6 +2365,10 @@ static int ext3_do_update_inode(handle_t +@@ -2360,6 +2368,10 @@ static int ext3_do_update_inode(handle_t else for (block = 0; block < EXT3_N_BLOCKS; block++) raw_inode->i_block[block] = inode->u.ext3_i.i_data[block]; @@ -56,8 +56,23 @@ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); rc = ext3_journal_dirty_metadata(handle, bh); if (!err) ---- linux-2.4.20/fs/ext3/xattr.c~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:06.000000000 +0400 -+++ linux-2.4.20-alexey/fs/ext3/xattr.c 2003-10-12 16:26:31.000000000 +0400 +--- linux-2.4.22-ac1/fs/ext3/super.c~ext3-ea-in-inode-2.4.22-rh 2003-10-08 13:57:57.000000000 +0400 ++++ linux-2.4.22-ac1-alexey/fs/ext3/super.c 2003-10-08 15:13:31.000000000 +0400 +@@ -1299,8 +1299,10 @@ struct super_block * ext3_read_super (st + } else { + sbi->s_inode_size = le16_to_cpu(es->s_inode_size); + sbi->s_first_ino = le32_to_cpu(es->s_first_ino); +- if (sbi->s_inode_size != EXT3_GOOD_OLD_INODE_SIZE) { +- printk (KERN_ERR ++ if ((sbi->s_inode_size < EXT3_GOOD_OLD_INODE_SIZE) || ++ (sbi->s_inode_size & (sbi->s_inode_size - 1)) || ++ (sbi->s_inode_size > blocksize)) { ++ printk (KERN_ERR + "EXT3-fs: unsupported inode size: %d\n", + sbi->s_inode_size); + goto failed_mount; +--- linux-2.4.22-ac1/fs/ext3/xattr.c~ext3-ea-in-inode-2.4.22-rh 2003-10-08 13:57:56.000000000 +0400 ++++ linux-2.4.22-ac1-alexey/fs/ext3/xattr.c 2003-10-12 16:36:07.000000000 +0400 @@ -100,6 +100,9 @@ static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, struct ext3_xattr_header *); @@ -707,9 +722,17 @@ const char *name, const void *value, size_t value_len, int flags) { struct super_block *sb = inode->i_sb; ---- linux-2.4.20/include/linux/ext3_fs.h~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:08.000000000 +0400 -+++ linux-2.4.20-alexey/include/linux/ext3_fs.h 2003-10-12 16:35:46.000000000 +0400 -@@ -264,6 +264,8 @@ struct ext3_inode { +@@ -603,6 +1181,7 @@ ext3_xattr_set(handle_t *handle, struct + name_len = strlen(name); + if (name_len > 255 || value_len > sb->s_blocksize) + return -ERANGE; ++ + down(&ext3_xattr_sem); + + if (block) { +--- linux-2.4.22-ac1/include/linux/ext3_fs.h~ext3-ea-in-inode-2.4.22-rh 2003-10-08 13:57:57.000000000 +0400 ++++ linux-2.4.22-ac1-alexey/include/linux/ext3_fs.h 2003-10-08 15:13:31.000000000 +0400 +@@ -265,6 +265,8 @@ struct ext3_inode { __u32 m_i_reserved2[2]; } masix2; } osd2; /* OS dependent 2 */ @@ -718,8 +741,8 @@ }; #define i_size_high i_dir_acl ---- linux-2.4.20/include/linux/ext3_fs_i.h~ext3-ea-in-inode-2.4.20 2001-11-22 22:46:19.000000000 +0300 -+++ linux-2.4.20-alexey/include/linux/ext3_fs_i.h 2003-10-12 16:34:14.000000000 +0400 +--- linux-2.4.22-ac1/include/linux/ext3_fs_i.h~ext3-ea-in-inode-2.4.22-rh 2003-09-26 00:54:44.000000000 +0400 ++++ linux-2.4.22-ac1-alexey/include/linux/ext3_fs_i.h 2003-10-08 15:13:31.000000000 +0400 @@ -62,6 +62,9 @@ struct ext3_inode_info { */ loff_t i_disksize; @@ -730,20 +753,5 @@ /* * truncate_sem is for serialising ext3_truncate() against * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's ---- linux-2.4.20/fs/ext3/super.c~ext3-ea-in-inode-2.4.20 2003-10-08 23:18:09.000000000 +0400 -+++ linux-2.4.20-alexey/fs/ext3/super.c 2003-10-12 16:25:21.000000000 +0400 -@@ -1292,8 +1292,10 @@ struct super_block * ext3_read_super (st - } else { - sbi->s_inode_size = le16_to_cpu(es->s_inode_size); - sbi->s_first_ino = le32_to_cpu(es->s_first_ino); -- if (sbi->s_inode_size != EXT3_GOOD_OLD_INODE_SIZE) { -- printk (KERN_ERR -+ if ((sbi->s_inode_size < EXT3_GOOD_OLD_INODE_SIZE) || -+ (sbi->s_inode_size & (sbi->s_inode_size - 1)) || -+ (sbi->s_inode_size > blocksize)) { -+ printk (KERN_ERR - "EXT3-fs: unsupported inode size: %d\n", - sbi->s_inode_size); - goto failed_mount; _ diff --git a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch index 39fa9ce943..92897b6542 100644 --- a/lustre/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch +++ b/lustre/kernel_patches/patches/ext3-ea-in-inode-2.6-suse.patch @@ -1,10 +1,10 @@ %patch -Index: linux-2.6.0/fs/ext3/ialloc.c +Index: linux-2.6.7/fs/ext3/ialloc.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/ialloc.c 2004-01-14 18:54:11.000000000 +0300 -+++ linux-2.6.0/fs/ext3/ialloc.c 2004-01-14 18:54:12.000000000 +0300 -@@ -627,6 +627,11 @@ - inode->i_generation = EXT3_SB(sb)->s_next_generation++; +--- linux-2.6.7.orig/fs/ext3/ialloc.c 2004-09-06 20:01:18.000000000 +0800 ++++ linux-2.6.7/fs/ext3/ialloc.c 2004-09-06 20:04:42.000000000 +0800 +@@ -629,6 +629,11 @@ + spin_unlock(&sbi->s_next_gen_lock); ei->i_state = EXT3_STATE_NEW; + if (EXT3_INODE_SIZE(inode->i_sb) > EXT3_GOOD_OLD_INODE_SIZE) { @@ -15,11 +15,11 @@ Index: linux-2.6.0/fs/ext3/ialloc.c ret = inode; if(DQUOT_ALLOC_INODE(inode)) { -Index: linux-2.6.0/fs/ext3/inode.c +Index: linux-2.6.7/fs/ext3/inode.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/inode.c 2004-01-14 18:54:12.000000000 +0300 -+++ linux-2.6.0/fs/ext3/inode.c 2004-01-14 19:09:46.000000000 +0300 -@@ -2339,7 +2339,7 @@ +--- linux-2.6.7.orig/fs/ext3/inode.c 2004-09-06 20:01:20.000000000 +0800 ++++ linux-2.6.7/fs/ext3/inode.c 2004-09-06 20:04:42.000000000 +0800 +@@ -2349,7 +2349,7 @@ * trying to determine the inode's location on-disk and no read need be * performed. */ @@ -28,7 +28,7 @@ Index: linux-2.6.0/fs/ext3/inode.c struct ext3_iloc *iloc, int in_mem) { unsigned long block; -@@ -2547,6 +2547,11 @@ +@@ -2558,6 +2558,11 @@ ei->i_data[block] = raw_inode->i_block[block]; INIT_LIST_HEAD(&ei->i_orphan); @@ -40,7 +40,7 @@ Index: linux-2.6.0/fs/ext3/inode.c if (S_ISREG(inode->i_mode)) { inode->i_op = &ext3_file_inode_operations; inode->i_fop = &ext3_file_operations; -@@ -2682,6 +2687,9 @@ +@@ -2693,6 +2698,9 @@ } else for (block = 0; block < EXT3_N_BLOCKS; block++) raw_inode->i_block[block] = ei->i_data[block]; @@ -50,10 +50,10 @@ Index: linux-2.6.0/fs/ext3/inode.c BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); rc = ext3_journal_dirty_metadata(handle, bh); if (!err) -Index: linux-2.6.0/fs/ext3/xattr.c +Index: linux-2.6.7/fs/ext3/xattr.c =================================================================== ---- linux-2.6.0.orig/fs/ext3/xattr.c 2003-12-30 08:33:13.000000000 +0300 -+++ linux-2.6.0/fs/ext3/xattr.c 2004-01-14 18:54:12.000000000 +0300 +--- linux-2.6.7.orig/fs/ext3/xattr.c 2004-06-16 13:19:36.000000000 +0800 ++++ linux-2.6.7/fs/ext3/xattr.c 2004-09-06 20:05:40.000000000 +0800 @@ -246,17 +246,12 @@ } @@ -113,7 +113,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return -ENOENT; + -+ ret = ext3_get_inode_loc(inode, &iloc); ++ ret = ext3_get_inode_loc(inode, &iloc, 1); + if (ret) + return ret; + raw_inode = ext3_raw_inode(&iloc); @@ -251,7 +251,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return 0; + -+ ret = ext3_get_inode_loc(inode, &iloc); ++ ret = ext3_get_inode_loc(inode, &iloc, 1); + if (ret) + return ret; + raw_inode = ext3_raw_inode(&iloc); @@ -388,7 +388,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return ret; + -+ err = ext3_get_inode_loc(inode, &iloc); ++ err = ext3_get_inode_loc(inode, &iloc, 1); + if (err) + return -EIO; + raw_inode = ext3_raw_inode(&iloc); @@ -519,7 +519,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c + if (EXT3_SB(inode->i_sb)->s_inode_size <= EXT3_GOOD_OLD_INODE_SIZE) + return -ENOSPC; + -+ err = ext3_get_inode_loc(inode, &iloc); ++ err = ext3_get_inode_loc(inode, &iloc, 1); + if (err) + return err; + raw_inode = ext3_raw_inode(&iloc); @@ -749,7 +749,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c const char *name, const void *value, size_t value_len, int flags) { -@@ -492,22 +1078,7 @@ +@@ -492,22 +1079,7 @@ * towards the end of the block). * end -- Points right after the block pointed to by header. */ @@ -772,7 +772,7 @@ Index: linux-2.6.0/fs/ext3/xattr.c if (EXT3_I(inode)->i_file_acl) { /* The inode already has an extended attribute block. */ bh = sb_bread(sb, EXT3_I(inode)->i_file_acl); -@@ -733,7 +1304,6 @@ +@@ -733,7 +1305,6 @@ brelse(bh); if (!(bh && header == HDR(bh))) kfree(header); @@ -780,10 +780,10 @@ Index: linux-2.6.0/fs/ext3/xattr.c return error; } -Index: linux-2.6.0/fs/ext3/xattr.h +Index: linux-2.6.7/fs/ext3/xattr.h =================================================================== ---- linux-2.6.0.orig/fs/ext3/xattr.h 2003-06-24 18:04:43.000000000 +0400 -+++ linux-2.6.0/fs/ext3/xattr.h 2004-01-14 18:54:12.000000000 +0300 +--- linux-2.6.7.orig/fs/ext3/xattr.h 2004-06-16 13:20:04.000000000 +0800 ++++ linux-2.6.7/fs/ext3/xattr.h 2004-09-06 20:04:42.000000000 +0800 @@ -77,7 +77,8 @@ extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); extern int ext3_xattr_list(struct inode *, char *, size_t); @@ -794,10 +794,10 @@ Index: linux-2.6.0/fs/ext3/xattr.h extern void ext3_xattr_delete_inode(handle_t *, struct inode *); extern void ext3_xattr_put_super(struct super_block *); -Index: linux-2.6.0/include/linux/ext3_fs.h +Index: linux-2.6.7/include/linux/ext3_fs.h =================================================================== ---- linux-2.6.0.orig/include/linux/ext3_fs.h 2004-01-14 18:54:11.000000000 +0300 -+++ linux-2.6.0/include/linux/ext3_fs.h 2004-01-14 18:54:12.000000000 +0300 +--- linux-2.6.7.orig/include/linux/ext3_fs.h 2004-09-06 20:01:19.000000000 +0800 ++++ linux-2.6.7/include/linux/ext3_fs.h 2004-09-06 20:04:42.000000000 +0800 @@ -265,6 +265,8 @@ __u32 m_i_reserved2[2]; } masix2; @@ -807,10 +807,18 @@ Index: linux-2.6.0/include/linux/ext3_fs.h }; #define i_size_high i_dir_acl -Index: linux-2.6.0/include/linux/ext3_fs_i.h +@@ -725,6 +727,7 @@ + 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 *, int); + extern void ext3_read_inode (struct inode *); + extern void ext3_write_inode (struct inode *, int); + extern int ext3_setattr (struct dentry *, struct iattr *); +Index: linux-2.6.7/include/linux/ext3_fs_i.h =================================================================== ---- linux-2.6.0.orig/include/linux/ext3_fs_i.h 2003-12-30 08:32:44.000000000 +0300 -+++ linux-2.6.0/include/linux/ext3_fs_i.h 2004-01-14 18:54:12.000000000 +0300 +--- linux-2.6.7.orig/include/linux/ext3_fs_i.h 2004-06-16 13:18:52.000000000 +0800 ++++ linux-2.6.7/include/linux/ext3_fs_i.h 2004-09-06 20:04:42.000000000 +0800 @@ -96,6 +96,9 @@ */ loff_t i_disksize; @@ -825,9 +833,9 @@ Index: linux-2.6.0/include/linux/ext3_fs_i.h %diffstat fs/ext3/ialloc.c | 5 fs/ext3/inode.c | 10 - fs/ext3/xattr.c | 634 +++++++++++++++++++++++++++++++++++++++++++--- + fs/ext3/xattr.c | 635 +++++++++++++++++++++++++++++++++++++++++++--- fs/ext3/xattr.h | 3 - include/linux/ext3_fs.h | 2 + include/linux/ext3_fs.h | 3 include/linux/ext3_fs_i.h | 3 - 6 files changed, 623 insertions(+), 34 deletions(-) + 6 files changed, 625 insertions(+), 34 deletions(-) diff --git a/lustre/kernel_patches/patches/ext3-error-export.patch b/lustre/kernel_patches/patches/ext3-error-export-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-error-export.patch rename to lustre/kernel_patches/patches/ext3-error-export-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-extents-2.4.20-rh.patch b/lustre/kernel_patches/patches/ext3-extents-2.4.20-rh.patch deleted file mode 100644 index cd517719eb..0000000000 --- a/lustre/kernel_patches/patches/ext3-extents-2.4.20-rh.patch +++ /dev/null @@ -1,2821 +0,0 @@ -Index: linux-2.4.20-rh/fs/ext3/extents.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/extents.c 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/extents.c 2004-04-28 10:32:44.000000000 +0800 -@@ -0,0 +1,2347 @@ -+/* -+ * Copyright (C) 2003 Alex Tomas <alex@clusterfs.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. -+ * -+ * 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 Licens -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- -+ */ -+ -+/* -+ * Extents support for EXT3 -+ * -+ * TODO: -+ * - ext3_ext_walk_space() sould not use ext3_ext_find_extent() -+ * - ext3_ext_calc_credits() could take 'mergable' into account -+ * - ext3*_error() should be used in some situations -+ * - find_goal() [to be tested and improved] -+ * - smart tree reduction -+ * - arch-independence -+ * common on-disk format for big/little-endian arch -+ */ -+ -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/time.h> -+#include <linux/ext3_jbd.h> -+#include <linux/jbd.h> -+#include <linux/smp_lock.h> -+#include <linux/highuid.h> -+#include <linux/pagemap.h> -+#include <linux/quotaops.h> -+#include <linux/string.h> -+#include <linux/slab.h> -+#include <linux/locks.h> -+#include <linux/ext3_extents.h> -+#include <asm/uaccess.h> -+ -+static handle_t *ext3_ext_journal_restart(handle_t *handle, int needed) -+{ -+ int err; -+ -+ if (handle->h_buffer_credits > needed) -+ return handle; -+ if (!ext3_journal_extend(handle, needed)) -+ return handle; -+ err = ext3_journal_restart(handle, needed); -+ -+ return handle; -+} -+ -+static int inline -+ext3_ext_get_access_for_root(handle_t *h, struct ext3_extents_tree *tree) -+{ -+ if (tree->get_write_access) -+ return tree->get_write_access(h,tree->buffer); -+ else -+ return 0; -+} -+ -+static int inline -+ext3_ext_mark_root_dirty(handle_t *h, struct ext3_extents_tree *tree) -+{ -+ if (tree->mark_buffer_dirty) -+ return tree->mark_buffer_dirty(h,tree->buffer); -+ else -+ return 0; -+} -+ -+/* -+ * could return: -+ * - EROFS -+ * - ENOMEM -+ */ -+static int ext3_ext_get_access(handle_t *handle, -+ struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ int err; -+ -+ if (path->p_bh) { -+ /* path points to block */ -+ err = ext3_journal_get_write_access(handle, path->p_bh); -+ } else { -+ /* path points to leaf/index in inode body */ -+ err = ext3_ext_get_access_for_root(handle, tree); -+ } -+ return err; -+} -+ -+/* -+ * could return: -+ * - EROFS -+ * - ENOMEM -+ * - EIO -+ */ -+static int ext3_ext_dirty(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ int err; -+ if (path->p_bh) { -+ /* path points to block */ -+ err =ext3_journal_dirty_metadata(handle, path->p_bh); -+ } else { -+ /* path points to leaf/index in inode body */ -+ err = ext3_ext_mark_root_dirty(handle, tree); -+ } -+ return err; -+} -+ -+static int inline -+ext3_ext_new_block(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, struct ext3_extent *ex, -+ int *err) -+{ -+ int goal, depth, newblock; -+ struct inode *inode; -+ -+ EXT_ASSERT(tree); -+ if (tree->new_block) -+ return tree->new_block(handle, tree, path, ex, err); -+ -+ inode = tree->inode; -+ depth = EXT_DEPTH(tree); -+ if (path && depth > 0) { -+ goal = path[depth-1].p_block; -+ } else { -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ unsigned long bg_start; -+ unsigned long colour; -+ -+ bg_start = (ei->i_block_group * -+ EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + -+ le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); -+ colour = (current->pid % 16) * -+ (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); -+ goal = bg_start + colour; -+ } -+ -+ newblock = ext3_new_block(handle, inode, goal, 0, 0, err); -+ return newblock; -+} -+ -+static inline void ext3_ext_tree_changed(struct ext3_extents_tree *tree) -+{ -+ struct ext3_extent_header *neh; -+ neh = EXT_ROOT_HDR(tree); -+ neh->e_generation++; -+} -+ -+static inline int ext3_ext_space_block(struct ext3_extents_tree *tree) -+{ -+ int size; -+ -+ size = (tree->inode->i_sb->s_blocksize - -+ sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent); -+#ifdef AGRESSIVE_TEST -+ size = 6; -+#endif -+ return size; -+} -+ -+static inline int ext3_ext_space_block_idx(struct ext3_extents_tree *tree) -+{ -+ int size; -+ -+ size = (tree->inode->i_sb->s_blocksize - -+ sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent_idx); -+#ifdef AGRESSIVE_TEST -+ size = 5; -+#endif -+ return size; -+} -+ -+static inline int ext3_ext_space_root(struct ext3_extents_tree *tree) -+{ -+ int size; -+ -+ size = (tree->buffer_len - sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent); -+#ifdef AGRESSIVE_TEST -+ size = 3; -+#endif -+ return size; -+} -+ -+static inline int ext3_ext_space_root_idx(struct ext3_extents_tree *tree) -+{ -+ int size; -+ -+ size = (tree->buffer_len - -+ sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent_idx); -+#ifdef AGRESSIVE_TEST -+ size = 4; -+#endif -+ return size; -+} -+ -+static void ext3_ext_show_path(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+#ifdef EXT_DEBUG -+ int k, l = path->p_depth; -+ -+ ext_debug(tree, "path:"); -+ for (k = 0; k <= l; k++, path++) { -+ if (path->p_idx) { -+ ext_debug(tree, " %d->%d", path->p_idx->e_block, -+ path->p_idx->e_leaf); -+ } else if (path->p_ext) { -+ ext_debug(tree, " %d:%d:%d", -+ path->p_ext->e_block, -+ path->p_ext->e_num, -+ path->p_ext->e_start); -+ } else -+ ext_debug(tree, " []"); -+ } -+ ext_debug(tree, "\n"); -+#endif -+} -+ -+static void ext3_ext_show_leaf(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+#ifdef EXT_DEBUG -+ int depth = EXT_DEPTH(tree); -+ struct ext3_extent_header *eh; -+ struct ext3_extent *ex; -+ int i; -+ -+ if (!path) -+ return; -+ -+ eh = path[depth].p_hdr; -+ ex = EXT_FIRST_EXTENT(eh); -+ -+ for (i = 0; i < eh->e_num; i++, ex++) { -+ ext_debug(tree, "%d:%d:%d ", -+ ex->e_block, ex->e_num, ex->e_start); -+ } -+ ext_debug(tree, "\n"); -+#endif -+} -+ -+static void ext3_ext_drop_refs(struct ext3_ext_path *path) -+{ -+ int depth = path->p_depth; -+ int i; -+ -+ for (i = 0; i <= depth; i++, path++) -+ if (path->p_bh) { -+ brelse(path->p_bh); -+ path->p_bh = NULL; -+ } -+} -+ -+/* -+ * binary search for closest index by given block -+ */ -+static inline void -+ext3_ext_binsearch_idx(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, int block) -+{ -+ struct ext3_extent_header *eh = path->p_hdr; -+ struct ext3_extent_idx *ix; -+ int l = 0, k, r; -+ -+ EXT_ASSERT(eh->e_magic == EXT3_EXT_MAGIC); -+ EXT_ASSERT(eh->e_num <= eh->e_max); -+ EXT_ASSERT(eh->e_num > 0); -+ -+ ext_debug(tree, "binsearch for %d(idx): ", block); -+ -+ path->p_idx = ix = EXT_FIRST_INDEX(eh); -+ -+ r = k = eh->e_num; -+ while (k > 1) { -+ k = (r - l) / 2; -+ if (block < ix[l + k].e_block) -+ r -= k; -+ else -+ l += k; -+ ext_debug(tree, "%d:%d:%d ", k, l, r); -+ } -+ -+ ix += l; -+ path->p_idx = ix; -+ ext_debug(tree, " -> %d->%d ", path->p_idx->e_block, path->p_idx->e_leaf); -+ -+ while (l++ < r) { -+ if (block < ix->e_block) -+ break; -+ path->p_idx = ix++; -+ } -+ ext_debug(tree, " -> %d->%d\n", path->p_idx->e_block, -+ path->p_idx->e_leaf); -+ -+#ifdef CHECK_BINSEARCH -+ { -+ struct ext3_extent_idx *chix; -+ -+ chix = ix = EXT_FIRST_INDEX(eh); -+ for (k = 0; k < eh->e_num; k++, ix++) { -+ if (k != 0 && ix->e_block <= ix[-1].e_block) { -+ printk("k=%d, ix=0x%p, first=0x%p\n", k, -+ ix, EXT_FIRST_INDEX(eh)); -+ printk("%u <= %u\n", -+ ix->e_block,ix[-1].e_block); -+ } -+ EXT_ASSERT(k == 0 || ix->e_block > ix[-1].e_block); -+ if (block < ix->e_block) -+ break; -+ chix = ix; -+ } -+ EXT_ASSERT(chix == path->p_idx); -+ } -+#endif -+ -+} -+ -+/* -+ * binary search for closest extent by given block -+ */ -+static inline void -+ext3_ext_binsearch(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, int block) -+{ -+ struct ext3_extent_header *eh = path->p_hdr; -+ struct ext3_extent *ex; -+ int l = 0, k, r; -+ -+ EXT_ASSERT(eh->e_magic == EXT3_EXT_MAGIC); -+ EXT_ASSERT(eh->e_num <= eh->e_max); -+ -+ if (eh->e_num == 0) { -+ /* -+ * this leaf is empty yet: -+ * we get such a leaf in split/add case -+ */ -+ return; -+ } -+ -+ ext_debug(tree, "binsearch for %d: ", block); -+ -+ path->p_ext = ex = EXT_FIRST_EXTENT(eh); -+ -+ r = k = eh->e_num; -+ while (k > 1) { -+ k = (r - l) / 2; -+ if (block < ex[l + k].e_block) -+ r -= k; -+ else -+ l += k; -+ ext_debug(tree, "%d:%d:%d ", k, l, r); -+ } -+ -+ ex += l; -+ path->p_ext = ex; -+ ext_debug(tree, " -> %d:%d:%d ", path->p_ext->e_block, -+ path->p_ext->e_start, path->p_ext->e_num); -+ -+ while (l++ < r) { -+ if (block < ex->e_block) -+ break; -+ path->p_ext = ex++; -+ } -+ ext_debug(tree, " -> %d:%d:%d\n", path->p_ext->e_block, -+ path->p_ext->e_start, path->p_ext->e_num); -+ -+#ifdef CHECK_BINSEARCH -+ { -+ struct ext3_extent *chex; -+ -+ chex = ex = EXT_FIRST_EXTENT(eh); -+ for (k = 0; k < eh->e_num; k++, ex++) { -+ EXT_ASSERT(k == 0 || ex->e_block > ex[-1].e_block); -+ if (block < ex->e_block) -+ break; -+ chex = ex; -+ } -+ EXT_ASSERT(chex == path->p_ext); -+ } -+#endif -+ -+} -+ -+int ext3_extent_tree_init(handle_t *handle, struct ext3_extents_tree *tree) -+{ -+ struct ext3_extent_header *eh; -+ -+ BUG_ON(tree->buffer_len == 0); -+ ext3_ext_get_access_for_root(handle, tree); -+ eh = EXT_ROOT_HDR(tree); -+ eh->e_depth = 0; -+ eh->e_num = 0; -+ eh->e_magic = EXT3_EXT_MAGIC; -+ eh->e_max = ext3_ext_space_root(tree); -+ ext3_ext_mark_root_dirty(handle, tree); -+ return 0; -+} -+ -+struct ext3_ext_path * -+ext3_ext_find_extent(struct ext3_extents_tree *tree, int block, -+ struct ext3_ext_path *path) -+{ -+ struct ext3_extent_header *eh; -+ struct buffer_head *bh; -+ int depth, i, ppos = 0; -+ -+ EXT_ASSERT(tree); -+ EXT_ASSERT(tree->inode); -+ EXT_ASSERT(tree->root); -+ -+ eh = EXT_ROOT_HDR(tree); -+ EXT_ASSERT(eh); -+ i = depth = EXT_DEPTH(tree); -+ EXT_ASSERT(eh->e_max); -+ EXT_ASSERT(eh->e_magic == EXT3_EXT_MAGIC); -+ EXT_ASSERT(i == 0 || eh->e_num > 0); -+ -+ /* account possible depth increase */ -+ if (!path) { -+ path = kmalloc(sizeof(struct ext3_ext_path) * (depth + 2), -+ GFP_NOFS); -+ if (!path) -+ return ERR_PTR(-ENOMEM); -+ } -+ memset(path, 0, sizeof(struct ext3_ext_path) * (depth + 1)); -+ path[0].p_hdr = eh; -+ -+ /* walk through the tree */ -+ while (i) { -+ ext_debug(tree, "depth %d: num %d, max %d\n", -+ ppos, eh->e_num, eh->e_max); -+ ext3_ext_binsearch_idx(tree, path + ppos, block); -+ path[ppos].p_block = path[ppos].p_idx->e_leaf; -+ path[ppos].p_depth = i; -+ path[ppos].p_ext = NULL; -+ -+ bh = sb_bread(tree->inode->i_sb, path[ppos].p_block); -+ if (!bh) { -+ ext3_ext_drop_refs(path); -+ kfree(path); -+ return ERR_PTR(-EIO); -+ } -+ eh = EXT_BLOCK_HDR(bh); -+ ppos++; -+ EXT_ASSERT(ppos <= depth); -+ path[ppos].p_bh = bh; -+ path[ppos].p_hdr = eh; -+ i--; -+ } -+ -+ path[ppos].p_depth = i; -+ path[ppos].p_hdr = eh; -+ path[ppos].p_ext = NULL; -+ -+ /* find extent */ -+ ext3_ext_binsearch(tree, path + ppos, block); -+ -+ ext3_ext_show_path(tree, path); -+ -+ return path; -+} -+ -+/* -+ * insert new index [logical;ptr] into the block at cupr -+ * it check where to insert: before curp or after curp -+ */ -+static int ext3_ext_insert_index(handle_t *handle, -+ struct ext3_extents_tree *tree, -+ struct ext3_ext_path *curp, -+ int logical, int ptr) -+{ -+ struct ext3_extent_idx *ix; -+ int len, err; -+ -+ if ((err = ext3_ext_get_access(handle, tree, curp))) -+ return err; -+ -+ EXT_ASSERT(logical != curp->p_idx->e_block); -+ len = EXT_MAX_INDEX(curp->p_hdr) - curp->p_idx; -+ if (logical > curp->p_idx->e_block) { -+ /* insert after */ -+ if (curp->p_idx != EXT_LAST_INDEX(curp->p_hdr)) { -+ len = (len - 1) * sizeof(struct ext3_extent_idx); -+ len = len < 0 ? 0 : len; -+ ext_debug(tree, "insert new index %d after: %d. " -+ "move %d from 0x%p to 0x%p\n", -+ logical, ptr, len, -+ (curp->p_idx + 1), (curp->p_idx + 2)); -+ memmove(curp->p_idx + 2, curp->p_idx + 1, len); -+ } -+ ix = curp->p_idx + 1; -+ } else { -+ /* insert before */ -+ len = len * sizeof(struct ext3_extent_idx); -+ len = len < 0 ? 0 : len; -+ ext_debug(tree, "insert new index %d before: %d. " -+ "move %d from 0x%p to 0x%p\n", -+ logical, ptr, len, -+ curp->p_idx, (curp->p_idx + 1)); -+ memmove(curp->p_idx + 1, curp->p_idx, len); -+ ix = curp->p_idx; -+ } -+ -+ ix->e_block = logical; -+ ix->e_leaf = ptr; -+ curp->p_hdr->e_num++; -+ -+ EXT_ASSERT(curp->p_hdr->e_num <= curp->p_hdr->e_max); -+ EXT_ASSERT(ix <= EXT_LAST_INDEX(curp->p_hdr)); -+ -+ err = ext3_ext_dirty(handle, tree, curp); -+ ext3_std_error(tree->inode->i_sb, err); -+ -+ return err; -+} -+ -+/* -+ * routine inserts new subtree into the path, using free index entry -+ * at depth 'at: -+ * - allocates all needed blocks (new leaf and all intermediate index blocks) -+ * - makes decision where to split -+ * - moves remaining extens and index entries (right to the split point) -+ * into the newly allocated blocks -+ * - initialize subtree -+ */ -+static int ext3_ext_split(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newext, int at) -+{ -+ struct buffer_head *bh = NULL; -+ int depth = EXT_DEPTH(tree); -+ struct ext3_extent_header *neh; -+ struct ext3_extent_idx *fidx; -+ struct ext3_extent *ex; -+ int i = at, k, m, a; -+ unsigned long newblock, oldblock, border; -+ int *ablocks = NULL; /* array of allocated blocks */ -+ int err = 0; -+ -+ /* make decision: where to split? */ -+ /* FIXME: now desicion is simplest: at current extent */ -+ -+ /* if current leaf will be splitted, then we should use -+ * border from split point */ -+ EXT_ASSERT(path[depth].p_ext <= EXT_MAX_EXTENT(path[depth].p_hdr)); -+ if (path[depth].p_ext != EXT_MAX_EXTENT(path[depth].p_hdr)) { -+ border = path[depth].p_ext[1].e_block; -+ ext_debug(tree, "leaf will be splitted." -+ " next leaf starts at %d\n", -+ (int)border); -+ } else { -+ border = newext->e_block; -+ ext_debug(tree, "leaf will be added." -+ " next leaf starts at %d\n", -+ (int)border); -+ } -+ -+ /* -+ * if error occurs, then we break processing -+ * and turn filesystem read-only. so, index won't -+ * be inserted and tree will be in consistent -+ * state. next mount will repair buffers too -+ */ -+ -+ /* -+ * get array to track all allocated blocks -+ * we need this to handle errors and free blocks -+ * upon them -+ */ -+ ablocks = kmalloc(sizeof(unsigned long) * depth, GFP_NOFS); -+ if (!ablocks) -+ return -ENOMEM; -+ memset(ablocks, 0, sizeof(unsigned long) * depth); -+ -+ /* allocate all needed blocks */ -+ ext_debug(tree, "allocate %d blocks for indexes/leaf\n", depth - at); -+ for (a = 0; a < depth - at; a++) { -+ newblock = ext3_ext_new_block(handle, tree, path, newext, &err); -+ if (newblock == 0) -+ goto cleanup; -+ ablocks[a] = newblock; -+ } -+ -+ /* initialize new leaf */ -+ newblock = ablocks[--a]; -+ EXT_ASSERT(newblock); -+ bh = sb_getblk(tree->inode->i_sb, newblock); -+ if (!bh) { -+ err = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(bh); -+ -+ if ((err = ext3_journal_get_create_access(handle, bh))) -+ goto cleanup; -+ -+ neh = EXT_BLOCK_HDR(bh); -+ neh->e_num = 0; -+ neh->e_max = ext3_ext_space_block(tree); -+ neh->e_magic = EXT3_EXT_MAGIC; -+ neh->e_depth = 0; -+ ex = EXT_FIRST_EXTENT(neh); -+ -+ /* move remain of path[depth] to the new leaf */ -+ EXT_ASSERT(path[depth].p_hdr->e_num == path[depth].p_hdr->e_max); -+ /* start copy from next extent */ -+ /* TODO: we could do it by single memmove */ -+ m = 0; -+ path[depth].p_ext++; -+ while (path[depth].p_ext <= -+ EXT_MAX_EXTENT(path[depth].p_hdr)) { -+ ext_debug(tree, "move %d:%d:%d in new leaf %lu\n", -+ path[depth].p_ext->e_block, -+ path[depth].p_ext->e_start, -+ path[depth].p_ext->e_num, -+ newblock); -+ memmove(ex++, path[depth].p_ext++, -+ sizeof(struct ext3_extent)); -+ neh->e_num++; -+ m++; -+ } -+ mark_buffer_uptodate(bh, 1); -+ unlock_buffer(bh); -+ -+ if ((err = ext3_journal_dirty_metadata(handle, bh))) -+ goto cleanup; -+ brelse(bh); -+ bh = NULL; -+ -+ /* correct old leaf */ -+ if (m) { -+ if ((err = ext3_ext_get_access(handle, tree, path + depth))) -+ goto cleanup; -+ path[depth].p_hdr->e_num -= m; -+ if ((err = ext3_ext_dirty(handle, tree, path + depth))) -+ goto cleanup; -+ -+ } -+ -+ /* create intermediate indexes */ -+ k = depth - at - 1; -+ EXT_ASSERT(k >= 0); -+ if (k) -+ ext_debug(tree, "create %d intermediate indices\n", k); -+ /* insert new index into current index block */ -+ /* current depth stored in i var */ -+ i = depth - 1; -+ while (k--) { -+ oldblock = newblock; -+ newblock = ablocks[--a]; -+ bh = sb_getblk(tree->inode->i_sb, newblock); -+ if (!bh) { -+ err = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(bh); -+ -+ if ((err = ext3_journal_get_create_access(handle, bh))) -+ goto cleanup; -+ -+ neh = EXT_BLOCK_HDR(bh); -+ neh->e_num = 1; -+ neh->e_magic = EXT3_EXT_MAGIC; -+ neh->e_max = ext3_ext_space_block_idx(tree); -+ neh->e_depth = depth - i; -+ fidx = EXT_FIRST_INDEX(neh); -+ fidx->e_block = border; -+ fidx->e_leaf = oldblock; -+ -+ ext_debug(tree, "int.index at %d (block %lu): %lu -> %lu\n", -+ i, newblock, border, oldblock); -+ /* copy indexes */ -+ m = 0; -+ path[i].p_idx++; -+ -+ ext_debug(tree, "cur 0x%p, last 0x%p\n", path[i].p_idx, -+ EXT_MAX_INDEX(path[i].p_hdr)); -+ EXT_ASSERT(EXT_MAX_INDEX(path[i].p_hdr) == -+ EXT_LAST_INDEX(path[i].p_hdr)); -+ while (path[i].p_idx <= EXT_MAX_INDEX(path[i].p_hdr)) { -+ ext_debug(tree, "%d: move %d:%d in new index %lu\n", -+ i, path[i].p_idx->e_block, -+ path[i].p_idx->e_leaf, newblock); -+ memmove(++fidx, path[i].p_idx++, -+ sizeof(struct ext3_extent_idx)); -+ neh->e_num++; -+ EXT_ASSERT(neh->e_num <= neh->e_max); -+ m++; -+ } -+ mark_buffer_uptodate(bh, 1); -+ unlock_buffer(bh); -+ -+ if ((err = ext3_journal_dirty_metadata(handle, bh))) -+ goto cleanup; -+ brelse(bh); -+ bh = NULL; -+ -+ /* correct old index */ -+ if (m) { -+ err = ext3_ext_get_access(handle, tree, path + i); -+ if (err) -+ goto cleanup; -+ path[i].p_hdr->e_num -= m; -+ err = ext3_ext_dirty(handle, tree, path + i); -+ if (err) -+ goto cleanup; -+ } -+ -+ i--; -+ } -+ -+ /* insert new index */ -+ if (!err) -+ err = ext3_ext_insert_index(handle, tree, path + at, -+ border, newblock); -+ -+cleanup: -+ if (bh) { -+ if (buffer_locked(bh)) -+ unlock_buffer(bh); -+ brelse(bh); -+ } -+ -+ if (err) { -+ /* free all allocated blocks in error case */ -+ for (i = 0; i < depth; i++) -+ if (!ablocks[i]) -+ continue; -+ ext3_free_blocks(handle, tree->inode, ablocks[i], 1); -+ } -+ kfree(ablocks); -+ -+ return err; -+} -+ -+/* -+ * routine implements tree growing procedure: -+ * - allocates new block -+ * - moves top-level data (index block or leaf) into the new block -+ * - initialize new top-level, creating index that points to the -+ * just created block -+ */ -+static int ext3_ext_grow_indepth(handle_t *handle, -+ struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newext) -+{ -+ struct ext3_ext_path *curp = path; -+ struct ext3_extent_header *neh; -+ struct ext3_extent_idx *fidx; -+ struct buffer_head *bh; -+ unsigned long newblock; -+ int err = 0; -+ -+ newblock = ext3_ext_new_block(handle, tree, path, newext, &err); -+ if (newblock == 0) -+ return err; -+ -+ bh = sb_getblk(tree->inode->i_sb, newblock); -+ if (!bh) { -+ err = -EIO; -+ ext3_std_error(tree->inode->i_sb, err); -+ return err; -+ } -+ lock_buffer(bh); -+ -+ if ((err = ext3_journal_get_create_access(handle, bh))) { -+ unlock_buffer(bh); -+ goto out; -+ } -+ -+ /* move top-level index/leaf into new block */ -+ memmove(bh->b_data, curp->p_hdr, tree->buffer_len); -+ -+ /* set size of new block */ -+ neh = EXT_BLOCK_HDR(bh); -+ /* old root could have indexes or leaves -+ * so calculate e_max right way */ -+ if (EXT_DEPTH(tree)) -+ neh->e_max = ext3_ext_space_block_idx(tree); -+ else -+ neh->e_max = ext3_ext_space_block(tree); -+ neh->e_magic = EXT3_EXT_MAGIC; -+ mark_buffer_uptodate(bh, 1); -+ unlock_buffer(bh); -+ -+ if ((err = ext3_journal_dirty_metadata(handle, bh))) -+ goto out; -+ -+ /* create index in new top-level index: num,max,pointer */ -+ if ((err = ext3_ext_get_access(handle, tree, curp))) -+ goto out; -+ -+ curp->p_hdr->e_magic = EXT3_EXT_MAGIC; -+ curp->p_hdr->e_max = ext3_ext_space_root_idx(tree); -+ curp->p_hdr->e_num = 1; -+ curp->p_idx = EXT_FIRST_INDEX(curp->p_hdr); -+ /* FIXME: it works, but actually path[0] can be index */ -+ curp->p_idx->e_block = EXT_FIRST_EXTENT(path[0].p_hdr)->e_block; -+ curp->p_idx->e_leaf = newblock; -+ -+ neh = EXT_ROOT_HDR(tree); -+ fidx = EXT_FIRST_INDEX(neh); -+ ext_debug(tree, "new root: num %d(%d), lblock %d, ptr %d\n", -+ neh->e_num, neh->e_max, fidx->e_block, fidx->e_leaf); -+ -+ neh->e_depth = path->p_depth + 1; -+ err = ext3_ext_dirty(handle, tree, curp); -+out: -+ brelse(bh); -+ -+ return err; -+} -+ -+/* -+ * routine finds empty index and adds new leaf. if no free index found -+ * then it requests in-depth growing -+ */ -+static int ext3_ext_create_new_leaf(handle_t *handle, -+ struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newext) -+{ -+ struct ext3_ext_path *curp; -+ int depth, i, err = 0; -+ -+repeat: -+ i = depth = EXT_DEPTH(tree); -+ -+ /* walk up to the tree and look for free index entry */ -+ curp = path + depth; -+ while (i > 0 && !EXT_HAS_FREE_INDEX(curp)) { -+ i--; -+ curp--; -+ } -+ -+ /* we use already allocated block for index block -+ * so, subsequent data blocks should be contigoues */ -+ if (EXT_HAS_FREE_INDEX(curp)) { -+ /* if we found index with free entry, then use that -+ * entry: create all needed subtree and add new leaf */ -+ err = ext3_ext_split(handle, tree, path, newext, i); -+ -+ /* refill path */ -+ ext3_ext_drop_refs(path); -+ path = ext3_ext_find_extent(tree, newext->e_block, path); -+ if (IS_ERR(path)) -+ err = PTR_ERR(path); -+ } else { -+ /* tree is full, time to grow in depth */ -+ err = ext3_ext_grow_indepth(handle, tree, path, newext); -+ -+ /* refill path */ -+ ext3_ext_drop_refs(path); -+ path = ext3_ext_find_extent(tree, newext->e_block, path); -+ if (IS_ERR(path)) -+ err = PTR_ERR(path); -+ -+ /* -+ * only first (depth 0 -> 1) produces free space -+ * in all other cases we have to split growed tree -+ */ -+ depth = EXT_DEPTH(tree); -+ if (path[depth].p_hdr->e_num == path[depth].p_hdr->e_max) { -+ /* now we need split */ -+ goto repeat; -+ } -+ } -+ -+ if (err) -+ return err; -+ -+ return 0; -+} -+ -+/* -+ * returns allocated block in subsequent extent or 0xffffffff -+ * NOTE: it consider block number from index entry as -+ * allocated block. thus, index entries have to be consistent -+ * with leafs -+ */ -+static unsigned long -+ext3_ext_next_allocated_block(struct ext3_ext_path *path) -+{ -+ int depth; -+ -+ EXT_ASSERT(path != NULL); -+ depth = path->p_depth; -+ -+ if (depth == 0 && path->p_ext == NULL) -+ return 0xffffffff; -+ -+ /* FIXME: what if index isn't full ?! */ -+ while (depth >= 0) { -+ if (depth == path->p_depth) { -+ /* leaf */ -+ if (path[depth].p_ext != -+ EXT_LAST_EXTENT(path[depth].p_hdr)) -+ return path[depth].p_ext[1].e_block; -+ } else { -+ /* index */ -+ if (path[depth].p_idx != -+ EXT_LAST_INDEX(path[depth].p_hdr)) -+ return path[depth].p_idx[1].e_block; -+ } -+ depth--; -+ } -+ -+ return 0xffffffff; -+} -+ -+/* -+ * returns first allocated block from next leaf or 0xffffffff -+ */ -+static unsigned ext3_ext_next_leaf_block(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ int depth; -+ -+ EXT_ASSERT(path != NULL); -+ depth = path->p_depth; -+ -+ /* zero-tree has no leaf blocks at all */ -+ if (depth == 0) -+ return 0xffffffff; -+ -+ /* go to index block */ -+ depth--; -+ -+ while (depth >= 0) { -+ if (path[depth].p_idx != -+ EXT_LAST_INDEX(path[depth].p_hdr)) -+ return path[depth].p_idx[1].e_block; -+ depth--; -+ } -+ -+ return 0xffffffff; -+} -+ -+/* -+ * if leaf gets modified and modified extent is first in the leaf -+ * then we have to correct all indexes above -+ * TODO: do we need to correct tree in all cases? -+ */ -+int ext3_ext_correct_indexes(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ struct ext3_extent_header *eh; -+ int depth = EXT_DEPTH(tree); -+ struct ext3_extent *ex; -+ unsigned long border; -+ int k, err = 0; -+ -+ eh = path[depth].p_hdr; -+ ex = path[depth].p_ext; -+ EXT_ASSERT(ex); -+ EXT_ASSERT(eh); -+ -+ if (depth == 0) { -+ /* there is no tree at all */ -+ return 0; -+ } -+ -+ if (ex != EXT_FIRST_EXTENT(eh)) { -+ /* we correct tree if first leaf got modified only */ -+ return 0; -+ } -+ -+ /* -+ * TODO: we need correction if border is smaller then current one -+ */ -+ k = depth - 1; -+ border = path[depth].p_ext->e_block; -+ if ((err = ext3_ext_get_access(handle, tree, path + k))) -+ return err; -+ path[k].p_idx->e_block = border; -+ if ((err = ext3_ext_dirty(handle, tree, path + k))) -+ return err; -+ -+ while (k--) { -+ /* change all left-side indexes */ -+ if (path[k+1].p_idx != EXT_FIRST_INDEX(path[k+1].p_hdr)) -+ break; -+ if ((err = ext3_ext_get_access(handle, tree, path + k))) -+ break; -+ path[k].p_idx->e_block = border; -+ if ((err = ext3_ext_dirty(handle, tree, path + k))) -+ break; -+ } -+ -+ return err; -+} -+ -+static int inline -+ext3_can_extents_be_merged(struct ext3_extents_tree *tree, -+ struct ext3_extent *ex1, -+ struct ext3_extent *ex2) -+{ -+ if (ex1->e_block + ex1->e_num != ex2->e_block) -+ return 0; -+ -+#ifdef AGRESSIVE_TEST -+ if (ex1->e_num >= 4) -+ return 0; -+#endif -+ -+ if (!tree->mergable) -+ return 1; -+ -+ return tree->mergable(ex1, ex2); -+} -+ -+/* -+ * this routine tries to merge requsted extent into the existing -+ * extent or inserts requested extent as new one into the tree, -+ * creating new leaf in no-space case -+ */ -+int ext3_ext_insert_extent(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newext) -+{ -+ struct ext3_extent_header * eh; -+ struct ext3_extent *ex, *fex; -+ struct ext3_extent *nearex; /* nearest extent */ -+ struct ext3_ext_path *npath = NULL; -+ int depth, len, err, next; -+ -+ depth = EXT_DEPTH(tree); -+ ex = path[depth].p_ext; -+ EXT_ASSERT(path[depth].p_hdr); -+ -+ /* try to insert block into found extent and return */ -+ if (ex && ext3_can_extents_be_merged(tree, ex, newext)) { -+ ext_debug(tree, "append %d block to %d:%d (from %d)\n", -+ newext->e_num, ex->e_block, ex->e_num, -+ ex->e_start); -+ if ((err = ext3_ext_get_access(handle, tree, path + depth))) -+ return err; -+ ex->e_num += newext->e_num; -+ eh = path[depth].p_hdr; -+ nearex = ex; -+ goto merge; -+ } -+ -+repeat: -+ depth = EXT_DEPTH(tree); -+ eh = path[depth].p_hdr; -+ if (eh->e_num < eh->e_max) -+ goto has_space; -+ -+ /* probably next leaf has space for us? */ -+ fex = EXT_LAST_EXTENT(eh); -+ next = ext3_ext_next_leaf_block(tree, path); -+ if (newext->e_block > fex->e_block && next != 0xffffffff) { -+ ext_debug(tree, "next leaf block - %d\n", next); -+ EXT_ASSERT(!npath); -+ npath = ext3_ext_find_extent(tree, next, NULL); -+ if (IS_ERR(npath)) -+ return PTR_ERR(npath); -+ EXT_ASSERT(npath->p_depth == path->p_depth); -+ eh = npath[depth].p_hdr; -+ if (eh->e_num < eh->e_max) { -+ ext_debug(tree, "next leaf isnt full(%d)\n", -+ eh->e_num); -+ path = npath; -+ goto repeat; -+ } -+ ext_debug(tree, "next leaf hasno free space(%d,%d)\n", -+ eh->e_num, eh->e_max); -+ } -+ -+ /* -+ * there is no free space in found leaf -+ * we're gonna add new leaf in the tree -+ */ -+ err = ext3_ext_create_new_leaf(handle, tree, path, newext); -+ if (err) -+ goto cleanup; -+ depth = EXT_DEPTH(tree); -+ eh = path[depth].p_hdr; -+ -+has_space: -+ nearex = path[depth].p_ext; -+ -+ if ((err = ext3_ext_get_access(handle, tree, path + depth))) -+ goto cleanup; -+ -+ if (!nearex) { -+ /* there is no extent in this leaf, create first one */ -+ ext_debug(tree, "first extent in the leaf: %d:%d:%d\n", -+ newext->e_block, newext->e_start, -+ newext->e_num); -+ path[depth].p_ext = EXT_FIRST_EXTENT(eh); -+ } else if (newext->e_block > nearex->e_block) { -+ EXT_ASSERT(newext->e_block != nearex->e_block); -+ if (nearex != EXT_LAST_EXTENT(eh)) { -+ len = EXT_MAX_EXTENT(eh) - nearex; -+ len = (len - 1) * sizeof(struct ext3_extent); -+ len = len < 0 ? 0 : len; -+ ext_debug(tree, "insert %d:%d:%d after: nearest 0x%p, " -+ "move %d from 0x%p to 0x%p\n", -+ newext->e_block, newext->e_start, -+ newext->e_num, -+ nearex, len, nearex + 1, nearex + 2); -+ memmove(nearex + 2, nearex + 1, len); -+ } -+ path[depth].p_ext = nearex + 1; -+ } else { -+ EXT_ASSERT(newext->e_block != nearex->e_block); -+ len = (EXT_MAX_EXTENT(eh) - nearex) * sizeof(struct ext3_extent); -+ len = len < 0 ? 0 : len; -+ ext_debug(tree, "insert %d:%d:%d before: nearest 0x%p, " -+ "move %d from 0x%p to 0x%p\n", -+ newext->e_block, newext->e_start, newext->e_num, -+ nearex, len, nearex + 1, nearex + 2); -+ memmove(nearex + 1, nearex, len); -+ path[depth].p_ext = nearex; -+ } -+ -+ eh->e_num++; -+ nearex = path[depth].p_ext; -+ nearex->e_block = newext->e_block; -+ nearex->e_start = newext->e_start; -+ nearex->e_num = newext->e_num; -+ -+merge: -+ /* try to merge extents to the right */ -+ while (nearex < EXT_LAST_EXTENT(eh)) { -+ if (!ext3_can_extents_be_merged(tree, nearex, nearex + 1)) -+ break; -+ /* merge with next extent! */ -+ nearex->e_num += nearex[1].e_num; -+ if (nearex + 1 < EXT_LAST_EXTENT(eh)) { -+ len = (EXT_LAST_EXTENT(eh) - nearex - 1) -+ * sizeof(struct ext3_extent); -+ memmove(nearex + 1, nearex + 2, len); -+ } -+ eh->e_num--; -+ EXT_ASSERT(eh->e_num > 0); -+ } -+ -+ /* try to merge extents to the left */ -+ -+ /* time to correct all indexes above */ -+ err = ext3_ext_correct_indexes(handle, tree, path); -+ if (err) -+ goto cleanup; -+ -+ err = ext3_ext_dirty(handle, tree, path + depth); -+ -+cleanup: -+ if (npath) { -+ ext3_ext_drop_refs(npath); -+ kfree(npath); -+ } -+ ext3_ext_tree_changed(tree); -+ return err; -+} -+ -+int ext3_ext_walk_space(struct ext3_extents_tree *tree, unsigned long block, -+ unsigned long num, ext_prepare_callback func) -+{ -+ struct ext3_ext_path *path = NULL; -+ struct ext3_extent *ex, cbex; -+ unsigned long next, start = 0, end = 0; -+ unsigned long last = block + num; -+ int depth, exists, err = 0; -+ -+ EXT_ASSERT(tree); -+ EXT_ASSERT(func); -+ EXT_ASSERT(tree->inode); -+ EXT_ASSERT(tree->root); -+ -+ while (block < last && block != 0xfffffffff) { -+ num = last - block; -+ /* find extent for this block */ -+ path = ext3_ext_find_extent(tree, block, path); -+ if (IS_ERR(path)) { -+ err = PTR_ERR(path); -+ path = NULL; -+ break; -+ } -+ -+ depth = EXT_DEPTH(tree); -+ EXT_ASSERT(path[depth].p_hdr); -+ ex = path[depth].p_ext; -+ next = ext3_ext_next_allocated_block(path); -+ -+ exists = 0; -+ if (!ex) { -+ /* there is no extent yet, so try to allocate -+ * all requested space */ -+ start = block; -+ end = block + num; -+ } else if (ex->e_block > block) { -+ /* need to allocate space before found extent */ -+ start = block; -+ end = ex->e_block; -+ if (block + num < end) -+ end = block + num; -+ } else if (block >= ex->e_block + ex->e_num) { -+ /* need to allocate space after found extent */ -+ start = block; -+ end = block + num; -+ if (end >= next) -+ end = next; -+ } else if (block >= ex->e_block) { -+ /* -+ * some part of requested space is covered -+ * by found extent -+ */ -+ start = block; -+ end = ex->e_block + ex->e_num; -+ if (block + num < end) -+ end = block + num; -+ exists = 1; -+ } else { -+ BUG(); -+ } -+ EXT_ASSERT(end > start); -+ -+ if (!exists) { -+ cbex.e_block = start; -+ cbex.e_num = end - start; -+ cbex.e_start = 0; -+ } else -+ cbex = *ex; -+ -+ EXT_ASSERT(path[depth].p_hdr); -+ err = func(tree, path, &cbex, exists); -+ ext3_ext_drop_refs(path); -+ -+ if (err < 0) -+ break; -+ if (err == EXT_REPEAT) -+ continue; -+ else if (err == EXT_BREAK) { -+ err = 0; -+ break; -+ } -+ -+ if (EXT_DEPTH(tree) != depth) { -+ /* depth was changed. we have to realloc path */ -+ kfree(path); -+ path = NULL; -+ } -+ -+ block = cbex.e_block + cbex.e_num; -+ } -+ -+ if (path) { -+ ext3_ext_drop_refs(path); -+ kfree(path); -+ } -+ -+ return err; -+} -+ -+static inline void -+ext3_ext_invalidate_cache(struct ext3_extents_tree *tree) -+{ -+ if (tree->cex) -+ tree->cex->e_num = 0; -+} -+ -+static inline void -+ext3_ext_put_in_cache(struct ext3_extents_tree *tree, struct ext3_extent *ex) -+{ -+ if (tree->cex) { -+ EXT_ASSERT(ex); -+ EXT_ASSERT(ex->e_num); -+ tree->cex->e_block = ex->e_block; -+ tree->cex->e_start = ex->e_start; -+ tree->cex->e_num = ex->e_num; -+ } -+} -+ -+/* -+ * this routine calculate boundaries of the gap requested block fits into -+ * and cache this gap -+ */ -+static inline void -+ext3_ext_put_gap_in_cache(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ unsigned long block) -+{ -+ int depth = EXT_DEPTH(tree); -+ struct ext3_extent *ex, gex; -+ -+ if (!tree->cex) -+ return; -+ -+ ex = path[depth].p_ext; -+ if (ex == NULL) { -+ /* there is no extent yet, so gap is [0;-] */ -+ gex.e_block = 0; -+ gex.e_num = 0xffffffff; -+ ext_debug(tree, "cache gap(whole file):"); -+ } else if (block < ex->e_block) { -+ gex.e_block = block; -+ gex.e_num = ex->e_block - block; -+ ext_debug(tree, "cache gap(before): %lu [%lu:%lu]", -+ (unsigned long) block, -+ (unsigned long) ex->e_block, -+ (unsigned long) ex->e_num); -+ } else if (block >= ex->e_block + ex->e_num) { -+ gex.e_block = ex->e_block + ex->e_num; -+ gex.e_num = ext3_ext_next_allocated_block(path); -+ ext_debug(tree, "cache gap(after): [%lu:%lu] %lu", -+ (unsigned long) ex->e_block, -+ (unsigned long) ex->e_num, -+ (unsigned long) block); -+ EXT_ASSERT(gex.e_num > gex.e_block); -+ gex.e_num = gex.e_num - gex.e_block; -+ } else { -+ BUG(); -+ } -+ -+ ext_debug(tree, " -> %lu:%lu\n", (unsigned long) gex.e_block, -+ (unsigned long) gex.e_num); -+ gex.e_start = 0xffffffff; -+ ext3_ext_put_in_cache(tree, &gex); -+} -+ -+static inline int -+ext3_ext_in_cache(struct ext3_extents_tree *tree, unsigned long block, -+ struct ext3_extent *ex) -+{ -+ struct ext3_extent *cex = tree->cex; -+ -+ /* is there cache storage at all? */ -+ if (!cex) -+ return 0; -+ -+ /* has cache valid data? */ -+ if (cex->e_num == 0) -+ return 0; -+ -+ if (block >= cex->e_block && block < cex->e_block + cex->e_num) { -+ ex->e_block = cex->e_block; -+ ex->e_start = cex->e_start; -+ ex->e_num = cex->e_num; -+ ext_debug(tree, "%lu cached by %lu:%lu:%lu\n", -+ (unsigned long) block, -+ (unsigned long) ex->e_block, -+ (unsigned long) ex->e_num, -+ (unsigned long) ex->e_start); -+ return 1; -+ } -+ -+ /* not in cache */ -+ return 0; -+} -+ -+/* -+ * routine removes index from the index block -+ * it's used in truncate case only. thus all requests are for -+ * last index in the block only -+ */ -+int ext3_ext_rm_idx(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ struct buffer_head *bh; -+ int err; -+ -+ /* free index block */ -+ path--; -+ EXT_ASSERT(path->p_hdr->e_num); -+ if ((err = ext3_ext_get_access(handle, tree, path))) -+ return err; -+ path->p_hdr->e_num--; -+ if ((err = ext3_ext_dirty(handle, tree, path))) -+ return err; -+ ext_debug(tree, "index is empty, remove it, free block %d\n", -+ path->p_idx->e_leaf); -+ bh = sb_get_hash_table(tree->inode->i_sb, path->p_idx->e_leaf); -+ ext3_forget(handle, 1, tree->inode, bh, path->p_idx->e_leaf); -+ ext3_free_blocks(handle, tree->inode, path->p_idx->e_leaf, 1); -+ return err; -+} -+ -+int ext3_ext_calc_credits_for_insert(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ int depth = EXT_DEPTH(tree); -+ int needed; -+ -+ if (path) { -+ /* probably there is space in leaf? */ -+ if (path[depth].p_hdr->e_num < path[depth].p_hdr->e_max) -+ return 1; -+ } -+ -+ /* -+ * the worste case we're expecting is creation of the -+ * new root (growing in depth) with index splitting -+ * for splitting we have to consider depth + 1 because -+ * previous growing could increase it -+ */ -+ depth = depth + 1; -+ -+ /* -+ * growing in depth: -+ * block allocation + new root + old root -+ */ -+ needed = EXT3_ALLOC_NEEDED + 2; -+ -+ /* index split. we may need: -+ * allocate intermediate indexes and new leaf -+ * change two blocks at each level, but root -+ * modify root block (inode) -+ */ -+ needed += (depth * EXT3_ALLOC_NEEDED) + (2 * depth) + 1; -+ -+ return needed; -+} -+ -+static int -+ext3_ext_split_for_rm(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, unsigned long start, -+ unsigned long end) -+{ -+ struct ext3_extent *ex, tex; -+ struct ext3_ext_path *npath; -+ int depth, creds, err; -+ -+ depth = EXT_DEPTH(tree); -+ ex = path[depth].p_ext; -+ EXT_ASSERT(ex); -+ EXT_ASSERT(end < ex->e_block + ex->e_num - 1); -+ EXT_ASSERT(ex->e_block < start); -+ -+ /* calculate tail extent */ -+ tex.e_block = end + 1; -+ EXT_ASSERT(tex.e_block < ex->e_block + ex->e_num); -+ tex.e_num = ex->e_block + ex->e_num - tex.e_block; -+ -+ creds = ext3_ext_calc_credits_for_insert(tree, path); -+ handle = ext3_ext_journal_restart(handle, creds); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ -+ /* calculate head extent. use primary extent */ -+ err = ext3_ext_get_access(handle, tree, path + depth); -+ if (err) -+ return err; -+ ex->e_num = start - ex->e_block; -+ err = ext3_ext_dirty(handle, tree, path + depth); -+ if (err) -+ return err; -+ -+ /* FIXME: some callback to free underlying resource -+ * and correct e_start? */ -+ ext_debug(tree, "split extent: head %u:%u, tail %u:%u\n", -+ ex->e_block, ex->e_num, tex.e_block, tex.e_num); -+ -+ npath = ext3_ext_find_extent(tree, ex->e_block, NULL); -+ if (IS_ERR(npath)) -+ return PTR_ERR(npath); -+ depth = EXT_DEPTH(tree); -+ EXT_ASSERT(npath[depth].p_ext->e_block == ex->e_block); -+ EXT_ASSERT(npath[depth].p_ext->e_num == ex->e_num); -+ -+ err = ext3_ext_insert_extent(handle, tree, npath, &tex); -+ ext3_ext_drop_refs(npath); -+ kfree(npath); -+ -+ return err; -+ -+} -+ -+static int -+ext3_ext_rm_leaf(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, unsigned long start, -+ unsigned long end) -+{ -+ struct ext3_extent *ex, *fu = NULL, *lu, *le; -+ int err = 0, correct_index = 0; -+ int depth = EXT_DEPTH(tree), credits; -+ struct ext3_extent_header *eh; -+ unsigned a, b, block, num; -+ -+ ext_debug(tree, "remove [%lu:%lu] in leaf\n", start, end); -+ if (!path[depth].p_hdr) -+ path[depth].p_hdr = EXT_BLOCK_HDR(path[depth].p_bh); -+ eh = path[depth].p_hdr; -+ EXT_ASSERT(eh); -+ EXT_ASSERT(eh->e_num <= eh->e_max); -+ EXT_ASSERT(eh->e_magic == EXT3_EXT_MAGIC); -+ -+ /* find where to start removing */ -+ le = ex = EXT_LAST_EXTENT(eh); -+ while (ex != EXT_FIRST_EXTENT(eh)) { -+ if (ex->e_block <= end) -+ break; -+ ex--; -+ } -+ -+ if (start > ex->e_block && end < ex->e_block + ex->e_num - 1) { -+ /* removal of internal part of the extent requested -+ * tail and head must be placed in different extent -+ * so, we have to insert one more extent */ -+ path[depth].p_ext = ex; -+ return ext3_ext_split_for_rm(handle, tree, path, start, end); -+ } -+ -+ lu = ex; -+ while (ex >= EXT_FIRST_EXTENT(eh) && -+ ex->e_block + ex->e_num > start) { -+ ext_debug(tree, "remove ext %u:%u\n", ex->e_block, ex->e_num); -+ path[depth].p_ext = ex; -+ -+ a = ex->e_block > start ? ex->e_block : start; -+ b = ex->e_block + ex->e_num - 1 < end ? -+ ex->e_block + ex->e_num - 1 : end; -+ -+ ext_debug(tree, " border %u:%u\n", a, b); -+ -+ if (a != ex->e_block && b != ex->e_block + ex->e_num - 1) { -+ block = 0; -+ num = 0; -+ BUG(); -+ } else if (a != ex->e_block) { -+ /* remove tail of the extent */ -+ block = ex->e_block; -+ num = a - block; -+ } else if (b != ex->e_block + ex->e_num - 1) { -+ /* remove head of the extent */ -+ block = a; -+ num = b - a; -+ } else { -+ /* remove whole extent: excelent! */ -+ block = ex->e_block; -+ num = 0; -+ EXT_ASSERT(a == ex->e_block && -+ b == ex->e_block + ex->e_num - 1); -+ } -+ -+ if (ex == EXT_FIRST_EXTENT(eh)) -+ correct_index = 1; -+ -+ credits = 1; -+ if (correct_index) -+ credits += (EXT_DEPTH(tree) * EXT3_ALLOC_NEEDED) + 1; -+ if (tree->remove_extent_credits) -+ credits += tree->remove_extent_credits(tree, ex, a, b); -+ -+ handle = ext3_ext_journal_restart(handle, credits); -+ if (IS_ERR(handle)) { -+ err = PTR_ERR(handle); -+ goto out; -+ } -+ -+ err = ext3_ext_get_access(handle, tree, path + depth); -+ if (err) -+ goto out; -+ -+ if (tree->remove_extent) -+ err = tree->remove_extent(tree, ex, a, b); -+ if (err) -+ goto out; -+ -+ if (num == 0) { -+ /* this extent is removed entirely mark slot unused */ -+ ex->e_start = 0; -+ eh->e_num--; -+ fu = ex; -+ } -+ -+ ex->e_block = block; -+ ex->e_num = num; -+ -+ err = ext3_ext_dirty(handle, tree, path + depth); -+ if (err) -+ goto out; -+ -+ ext_debug(tree, "new extent: %u:%u:%u\n", -+ ex->e_block, ex->e_num, ex->e_start); -+ ex--; -+ } -+ -+ if (fu) { -+ /* reuse unused slots */ -+ while (lu < le) { -+ if (lu->e_start) { -+ *fu = *lu; -+ lu->e_start = 0; -+ fu++; -+ } -+ lu++; -+ } -+ } -+ -+ if (correct_index && eh->e_num) -+ err = ext3_ext_correct_indexes(handle, tree, path); -+ -+ /* if this leaf is free, then we should -+ * remove it from index block above */ -+ if (err == 0 && eh->e_num == 0 && path[depth].p_bh != NULL) -+ err = ext3_ext_rm_idx(handle, tree, path + depth); -+ -+out: -+ return err; -+} -+ -+ -+static struct ext3_extent_idx * -+ext3_ext_last_covered(struct ext3_extent_header *hdr, unsigned long block) -+{ -+ struct ext3_extent_idx *ix; -+ -+ ix = EXT_LAST_INDEX(hdr); -+ while (ix != EXT_FIRST_INDEX(hdr)) { -+ if (ix->e_block <= block) -+ break; -+ ix--; -+ } -+ return ix; -+} -+ -+/* -+ * returns 1 if current index have to be freed (even partial) -+ */ -+static int inline -+ext3_ext_more_to_rm(struct ext3_ext_path *path) -+{ -+ EXT_ASSERT(path->p_idx); -+ -+ if (path->p_idx < EXT_FIRST_INDEX(path->p_hdr)) -+ return 0; -+ -+ /* -+ * if truncate on deeper level happened it it wasn't partial -+ * so we have to consider current index for truncation -+ */ -+ if (path->p_hdr->e_num == path->p_block) -+ return 0; -+ return 1; -+} -+ -+int ext3_ext_remove_space(struct ext3_extents_tree *tree, -+ unsigned long start, unsigned long end) -+{ -+ struct inode *inode = tree->inode; -+ struct super_block *sb = inode->i_sb; -+ int depth = EXT_DEPTH(tree); -+ struct ext3_ext_path *path; -+ handle_t *handle; -+ int i = 0, err = 0; -+ -+ ext_debug(tree, "space to be removed: %lu:%lu\n", start, end); -+ -+ /* probably first extent we're gonna free will be last in block */ -+ handle = ext3_journal_start(inode, depth + 1); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ -+ ext3_ext_invalidate_cache(tree); -+ -+ /* -+ * we start scanning from right side freeing all the blocks -+ * after i_size and walking into the deep -+ */ -+ path = kmalloc(sizeof(struct ext3_ext_path) * (depth + 1), GFP_KERNEL); -+ if (IS_ERR(path)) { -+ ext3_error(sb, "ext3_ext_remove_space", -+ "Can't allocate path array"); -+ ext3_journal_stop(handle, inode); -+ return -ENOMEM; -+ } -+ memset(path, 0, sizeof(struct ext3_ext_path) * (depth + 1)); -+ path[i].p_hdr = EXT_ROOT_HDR(tree); -+ -+ while (i >= 0 && err == 0) { -+ if (i == depth) { -+ /* this is leaf block */ -+ err = ext3_ext_rm_leaf(handle, tree, path, start, end); -+ /* root level have p_bh == NULL, brelse() eats this */ -+ brelse(path[i].p_bh); -+ i--; -+ continue; -+ } -+ -+ /* this is index block */ -+ if (!path[i].p_hdr) { -+ ext_debug(tree, "initialize header\n"); -+ path[i].p_hdr = EXT_BLOCK_HDR(path[i].p_bh); -+ } -+ -+ EXT_ASSERT(path[i].p_hdr->e_num <= path[i].p_hdr->e_max); -+ EXT_ASSERT(path[i].p_hdr->e_magic == EXT3_EXT_MAGIC); -+ -+ if (!path[i].p_idx) { -+ /* this level hasn't touched yet */ -+ path[i].p_idx = -+ ext3_ext_last_covered(path[i].p_hdr, end); -+ path[i].p_block = path[i].p_hdr->e_num + 1; -+ ext_debug(tree, "init index ptr: hdr 0x%p, num %d\n", -+ path[i].p_hdr, path[i].p_hdr->e_num); -+ } else { -+ /* we've already was here, see at next index */ -+ path[i].p_idx--; -+ } -+ -+ ext_debug(tree, "level %d - index, first 0x%p, cur 0x%p\n", -+ i, EXT_FIRST_INDEX(path[i].p_hdr), -+ path[i].p_idx); -+ if (ext3_ext_more_to_rm(path + i)) { -+ /* go to the next level */ -+ ext_debug(tree, "move to level %d (block %d)\n", -+ i + 1, path[i].p_idx->e_leaf); -+ memset(path + i + 1, 0, sizeof(*path)); -+ path[i+1].p_bh = sb_bread(sb, path[i].p_idx->e_leaf); -+ if (!path[i+1].p_bh) { -+ /* should we reset i_size? */ -+ err = -EIO; -+ break; -+ } -+ /* put actual number of indexes to know is this -+ * number got changed at the next iteration */ -+ path[i].p_block = path[i].p_hdr->e_num; -+ i++; -+ } else { -+ /* we finish processing this index, go up */ -+ if (path[i].p_hdr->e_num == 0 && i > 0) { -+ /* index is empty, remove it -+ * handle must be already prepared by the -+ * truncate_leaf() */ -+ err = ext3_ext_rm_idx(handle, tree, path + i); -+ } -+ /* root level have p_bh == NULL, brelse() eats this */ -+ brelse(path[i].p_bh); -+ i--; -+ ext_debug(tree, "return to level %d\n", i); -+ } -+ } -+ -+ /* TODO: flexible tree reduction should be here */ -+ if (path->p_hdr->e_num == 0) { -+ /* -+ * truncate to zero freed all the tree -+ * so, we need to correct e_depth -+ */ -+ err = ext3_ext_get_access(handle, tree, path); -+ if (err == 0) { -+ EXT_ROOT_HDR(tree)->e_depth = 0; -+ err = ext3_ext_dirty(handle, tree, path); -+ } -+ } -+ ext3_ext_tree_changed(tree); -+ -+ kfree(path); -+ ext3_journal_stop(handle, inode); -+ -+ return err; -+} -+ -+/* -+ * called at mount time -+ */ -+void ext3_ext_init(struct super_block *sb) -+{ -+ /* -+ * possible initialization would be here -+ */ -+ -+ if (test_opt(sb, EXTENTS)) { -+ printk("EXT3-fs: file extents enabled"); -+#ifdef AGRESSIVE_TEST -+ printk(", agressive tests"); -+#endif -+#ifdef CHECK_BINSEARCH -+ printk(", check binsearch"); -+#endif -+ printk("\n"); -+ } -+} -+ -+/* -+ * called at umount time -+ */ -+void ext3_ext_release(struct super_block *sb) -+{ -+} -+ -+/************************************************************************ -+ * VFS related routines -+ ************************************************************************/ -+ -+static int ext3_get_inode_write_access(handle_t *handle, void *buffer) -+{ -+ /* we use in-core data, not bh */ -+ return 0; -+} -+ -+static int ext3_mark_buffer_dirty(handle_t *handle, void *buffer) -+{ -+ struct inode *inode = buffer; -+ return ext3_mark_inode_dirty(handle, inode); -+} -+ -+static int ext3_ext_mergable(struct ext3_extent *ex1, -+ struct ext3_extent *ex2) -+{ -+ if (ex1->e_start + ex1->e_num == ex2->e_start) -+ return 1; -+ return 0; -+} -+ -+static int -+ext3_remove_blocks_credits(struct ext3_extents_tree *tree, -+ struct ext3_extent *ex, -+ unsigned long from, unsigned long to) -+{ -+ int needed; -+ -+ /* at present, extent can't cross block group */; -+ needed = 3; /* bitmap + group desc + sb */ -+ -+#ifdef CONFIG_QUOTA -+ needed += 2 * EXT3_SINGLEDATA_TRANS_BLOCKS; -+#endif -+ return needed; -+} -+ -+static int -+ext3_remove_blocks(struct ext3_extents_tree *tree, -+ struct ext3_extent *ex, -+ unsigned long from, unsigned long to) -+{ -+ int needed = ext3_remove_blocks_credits(tree, ex, from, to); -+ handle_t *handle = ext3_journal_start(tree->inode, needed); -+ struct buffer_head *bh; -+ int i; -+ -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ if (from >= ex->e_block && to == ex->e_block + ex->e_num - 1) { -+ /* tail removal */ -+ unsigned long num, start; -+ num = ex->e_block + ex->e_num - from; -+ start = ex->e_start + ex->e_num - num; -+ ext_debug(tree, "free last %lu blocks starting %lu\n", -+ num, start); -+ for (i = 0; i < num; i++) { -+ bh = sb_get_hash_table(tree->inode->i_sb, start + i); -+ ext3_forget(handle, 0, tree->inode, bh, start + i); -+ } -+ ext3_free_blocks(handle, tree->inode, start, num); -+ } else if (from == ex->e_block && to <= ex->e_block + ex->e_num - 1) { -+ printk("strange request: removal %lu-%lu from %u:%u\n", -+ from, to, ex->e_block, ex->e_num); -+ } else { -+ printk("strange request: removal(2) %lu-%lu from %u:%u\n", -+ from, to, ex->e_block, ex->e_num); -+ } -+ ext3_journal_stop(handle, tree->inode); -+ return 0; -+} -+ -+static int ext3_ext_find_goal(struct inode *inode, struct ext3_ext_path *path, -+ unsigned long block) -+{ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ unsigned long bg_start; -+ unsigned long colour; -+ int depth; -+ -+ if (path) { -+ struct ext3_extent *ex; -+ depth = path->p_depth; -+ -+ /* try to predict block placement */ -+ if ((ex = path[depth].p_ext)) -+ return ex->e_start + (block - ex->e_block); -+ -+ /* it looks index is empty -+ * try to find starting from index itself */ -+ if (path[depth].p_bh) -+ return path[depth].p_bh->b_blocknr; -+ } -+ -+ /* OK. use inode's group */ -+ bg_start = (ei->i_block_group * EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + -+ le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); -+ colour = (current->pid % 16) * -+ (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); -+ return bg_start + colour + block; -+} -+ -+static int ext3_new_block_cb(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *ex, int *err) -+{ -+ struct inode *inode = tree->inode; -+ int newblock, goal; -+ -+ EXT_ASSERT(path); -+ EXT_ASSERT(ex); -+ EXT_ASSERT(ex->e_start); -+ EXT_ASSERT(ex->e_num); -+ -+ /* reuse block from the extent to order data/metadata */ -+ newblock = ex->e_start++; -+ ex->e_num--; -+ if (ex->e_num == 0) { -+ ex->e_num = 1; -+ /* allocate new block for the extent */ -+ goal = ext3_ext_find_goal(inode, path, ex->e_block); -+ ex->e_start = ext3_new_block(handle, inode, goal, 0, 0, err); -+ if (ex->e_start == 0) { -+ /* error occured: restore old extent */ -+ ex->e_start = newblock; -+ return 0; -+ } -+ } -+ return newblock; -+} -+ -+static void ext3_init_tree_desc(struct ext3_extents_tree *tree, -+ struct inode *inode) -+{ -+ tree->inode = inode; -+ tree->root = (void *) EXT3_I(inode)->i_data; -+ tree->get_write_access = ext3_get_inode_write_access; -+ tree->mark_buffer_dirty = ext3_mark_buffer_dirty; -+ tree->mergable = ext3_ext_mergable; -+ tree->new_block = ext3_new_block_cb; -+ tree->remove_extent = ext3_remove_blocks; -+ tree->remove_extent_credits = ext3_remove_blocks_credits; -+ tree->buffer = (void *) inode; -+ tree->buffer_len = sizeof(EXT3_I(inode)->i_data); -+ tree->cex = (struct ext3_extent *) &EXT3_I(inode)->i_cached_extent; -+} -+ -+#if EXT3_MULTIBLOCK_ALLOCATOR -+static int -+ext3_ext_new_extent_cb(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newex, int exist) -+{ -+ struct inode *inode = tree->inode; -+ struct buffer_head *bh; -+ int count, err, goal; -+ unsigned long pblock; -+ unsigned long tgen; -+ loff_t new_i_size; -+ handle_t *handle; -+ int i; -+ -+ if (exist) -+ return EXT_CONTINUE; -+ -+ tgen = EXT_GENERATION(tree); -+ count = ext3_ext_calc_credits_for_insert(tree, path); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ -+ handle = ext3_journal_start(inode, count + EXT3_ALLOC_NEEDED + 1); -+ if (IS_ERR(handle)) { -+ down_write(&EXT3_I(inode)->truncate_sem); -+ return PTR_ERR(handle); -+ } -+ -+ if (tgen != EXT_GENERATION(tree)) { -+ /* the tree has changed. so path can be invalid at moment */ -+ ext3_journal_stop(handle, inode); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ return EXT_REPEAT; -+ } -+ -+ down_write(&EXT3_I(inode)->truncate_sem); -+ goal = ext3_ext_find_goal(inode, path, newex->e_block); -+ count = newex->e_num; -+ pblock = ext3_new_blocks(handle, inode, &count, goal, &err); -+ if (!pblock) -+ goto out; -+ EXT_ASSERT(count <= newex->e_num); -+ -+ /* insert new extent */ -+ newex->e_start = pblock; -+ newex->e_num = count; -+ err = ext3_ext_insert_extent(handle, tree, path, newex); -+ if (err) -+ goto out; -+ -+ /* block have been allocated for data, so time to drop dirty -+ * in correspondend buffer_heads to prevent corruptions */ -+ for (i = 0; i < newex->e_num; i++) { -+ bh = sb_get_hash_table(inode->i_sb, newex->e_start + i); -+ if (bh) { -+ mark_buffer_clean(bh); -+ wait_on_buffer(bh); -+ clear_bit(BH_Req, &bh->b_state); -+ __brelse(bh); -+ } -+ } -+ -+ /* correct on-disk inode size */ -+ if (newex->e_num > 0) { -+ new_i_size = (loff_t) newex->e_block + newex->e_num; -+ new_i_size = new_i_size << inode->i_blkbits; -+ if (new_i_size > EXT3_I(inode)->i_disksize) { -+ EXT3_I(inode)->i_disksize = new_i_size; -+ err = ext3_mark_inode_dirty(handle, inode); -+ } -+ } -+ -+out: -+ ext3_journal_stop(handle, inode); -+ return err; -+} -+ -+ -+int ext3_ext_allocate_nblocks(struct inode *inode, unsigned long block, -+ unsigned long num) -+{ -+ struct ext3_extents_tree tree; -+ int err; -+ -+ ext3_init_tree_desc(&tree, inode); -+ ext_debug(&tree, "blocks %lu-%lu requested for inode %u\n", -+ block, block + num,(unsigned) inode->i_ino); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ err = ext3_ext_walk_space(&tree, block, num, ext3_ext_new_extent_cb); -+ ext3_ext_invalidate_cache(&tree); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ -+ return err; -+} -+#endif -+ -+int ext3_ext_get_block(handle_t *handle, struct inode *inode, -+ long iblock, struct buffer_head *bh_result, int create) -+{ -+ struct ext3_ext_path *path = NULL; -+ struct ext3_extent newex; -+ struct ext3_extent *ex; -+ int goal, newblock, err = 0, depth; -+ struct ext3_extents_tree tree; -+ -+ clear_bit(BH_New, &bh_result->b_state); -+ ext3_init_tree_desc(&tree, inode); -+ ext_debug(&tree, "block %d requested for inode %u\n", -+ (int) iblock, (unsigned) inode->i_ino); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ -+ /* check in cache */ -+ if (ext3_ext_in_cache(&tree, iblock, &newex)) { -+ if (newex.e_start == 0xffffffff && !create) { -+ /* block isn't allocated yet and -+ * user don't want to allocate it */ -+ goto out2; -+ } else if (newex.e_start) { -+ /* block is already allocated */ -+ newblock = iblock - newex.e_block + newex.e_start; -+ goto out; -+ } -+ } -+ -+ /* find extent for this block */ -+ path = ext3_ext_find_extent(&tree, iblock, NULL); -+ if (IS_ERR(path)) { -+ err = PTR_ERR(path); -+ path = NULL; -+ goto out2; -+ } -+ -+ depth = EXT_DEPTH(&tree); -+ -+ /* -+ * consistent leaf must not be empty -+ * this situations is possible, though, _during_ tree modification -+ * this is why assert can't be put in ext3_ext_find_extent() -+ */ -+ EXT_ASSERT(path[depth].p_ext != NULL || depth == 0); -+ -+ if ((ex = path[depth].p_ext)) { -+ /* if found exent covers block, simple return it */ -+ if (iblock >= ex->e_block && iblock < ex->e_block + ex->e_num) { -+ newblock = iblock - ex->e_block + ex->e_start; -+ ext_debug(&tree, "%d fit into %d:%d -> %d\n", -+ (int) iblock, ex->e_block, ex->e_num, -+ newblock); -+ ext3_ext_put_in_cache(&tree, ex); -+ goto out; -+ } -+ } -+ -+ /* -+ * requested block isn't allocated yet -+ * we couldn't try to create block if create flag is zero -+ */ -+ if (!create) { -+ /* put just found gap into cache to speedup subsequest reqs */ -+ ext3_ext_put_gap_in_cache(&tree, path, iblock); -+ goto out2; -+ } -+ -+ /* allocate new block */ -+ goal = ext3_ext_find_goal(inode, path, iblock); -+ newblock = ext3_new_block(handle, inode, goal, 0, 0, &err); -+ if (!newblock) -+ goto out2; -+ ext_debug(&tree, "allocate new block: goal %d, found %d\n", -+ goal, newblock); -+ -+ /* try to insert new extent into found leaf and return */ -+ newex.e_block = iblock; -+ newex.e_start = newblock; -+ newex.e_num = 1; -+ err = ext3_ext_insert_extent(handle, &tree, path, &newex); -+ if (err) -+ goto out2; -+ -+ if (inode->i_size > EXT3_I(inode)->i_disksize) -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ -+ /* previous routine could use block we allocated */ -+ newblock = newex.e_start; -+ set_bit(BH_New, &bh_result->b_state); -+ -+ ext3_ext_put_in_cache(&tree, &newex); -+out: -+ ext3_ext_show_leaf(&tree, path); -+ set_bit(BH_Mapped, &bh_result->b_state); -+ bh_result->b_dev = inode->i_sb->s_dev; -+ bh_result->b_blocknr = newblock; -+out2: -+ if (path) { -+ ext3_ext_drop_refs(path); -+ kfree(path); -+ } -+ up_write(&EXT3_I(inode)->truncate_sem); -+ -+ return err; -+} -+ -+void ext3_ext_truncate(struct inode * inode) -+{ -+ struct address_space *mapping = inode->i_mapping; -+ struct super_block *sb = inode->i_sb; -+ struct ext3_extents_tree tree; -+ unsigned long last_block; -+ handle_t *handle; -+ int err = 0; -+ -+ ext3_init_tree_desc(&tree, inode); -+ -+ /* -+ * probably first extent we're gonna free will be last in block -+ */ -+ err = ext3_writepage_trans_blocks(inode) + 3; -+ handle = ext3_journal_start(inode, err); -+ if (IS_ERR(handle)) -+ return; -+ -+ ext3_block_truncate_page(handle, mapping, inode->i_size); -+ -+ down_write(&EXT3_I(inode)->truncate_sem); -+ ext3_ext_invalidate_cache(&tree); -+ -+ /* -+ * TODO: optimization is possible here -+ * probably we need not scaning at all, -+ * because page truncation is enough -+ */ -+ if (ext3_orphan_add(handle, inode)) -+ goto out_stop; -+ -+ /* we have to know where to truncate from in crash case */ -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_mark_inode_dirty(handle, inode); -+ -+ last_block = (inode->i_size + sb->s_blocksize - 1) -+ >> EXT3_BLOCK_SIZE_BITS(sb); -+ err = ext3_ext_remove_space(&tree, last_block, 0xffffffff); -+ -+ /* In a multi-transaction truncate, we only make the final -+ * transaction synchronous */ -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ -+out_stop: -+ /* -+ * If this was a simple ftruncate(), and the file will remain alive -+ * then we need to clear up the orphan record which we created above. -+ * However, if this was a real unlink then we were called by -+ * ext3_delete_inode(), and we allow that function to clean up the -+ * orphan info for us. -+ */ -+ if (inode->i_nlink) -+ ext3_orphan_del(handle, inode); -+ -+ up_write(&EXT3_I(inode)->truncate_sem); -+ ext3_journal_stop(handle, inode); -+} -+ -+/* -+ * this routine calculate max number of blocks we could modify -+ * in order to allocate new block for an inode -+ */ -+int ext3_ext_writepage_trans_blocks(struct inode *inode, int num) -+{ -+ struct ext3_extents_tree tree; -+ int needed; -+ -+ ext3_init_tree_desc(&tree, inode); -+ -+ needed = ext3_ext_calc_credits_for_insert(&tree, NULL); -+ -+ /* caller want to allocate num blocks */ -+ needed *= num; -+ -+#ifdef CONFIG_QUOTA -+ /* -+ * FIXME: real calculation should be here -+ * it depends on blockmap format of qouta file -+ */ -+ needed += 2 * EXT3_SINGLEDATA_TRANS_BLOCKS; -+#endif -+ -+ return needed; -+} -+ -+void ext3_extents_initialize_blockmap(handle_t *handle, struct inode *inode) -+{ -+ struct ext3_extents_tree tree; -+ -+ ext3_init_tree_desc(&tree, inode); -+ ext3_extent_tree_init(handle, &tree); -+} -+ -+static int -+ext3_ext_store_extent_cb(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newex, int exist) -+{ -+ struct ext3_extent_buf *buf = (struct ext3_extent_buf *) tree->private; -+ -+ if (!exist) -+ return EXT_CONTINUE; -+ if (buf->err < 0) -+ return EXT_BREAK; -+ if (buf->cur - buf->buffer + sizeof(*newex) > buf->buflen) -+ return EXT_BREAK; -+ -+ if (!copy_to_user(buf->cur, newex, sizeof(*newex))) { -+ buf->err++; -+ buf->cur += sizeof(*newex); -+ } else { -+ buf->err = -EFAULT; -+ return EXT_BREAK; -+ } -+ return EXT_CONTINUE; -+} -+ -+static int -+ext3_ext_collect_stats_cb(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *ex, int exist) -+{ -+ struct ext3_extent_tree_stats *buf = -+ (struct ext3_extent_tree_stats *) tree->private; -+ int depth; -+ -+ if (!exist) -+ return EXT_CONTINUE; -+ -+ depth = EXT_DEPTH(tree); -+ buf->extents_num++; -+ if (path[depth].p_ext == EXT_FIRST_EXTENT(path[depth].p_hdr)) -+ buf->leaf_num++; -+ return EXT_CONTINUE; -+} -+ -+int ext3_ext_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, -+ unsigned long arg) -+{ -+ int err = 0; -+ -+ if (!(EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL)) -+ return -EINVAL; -+ -+ if (cmd == EXT3_IOC_GET_EXTENTS) { -+ struct ext3_extent_buf buf; -+ struct ext3_extents_tree tree; -+ -+ if (copy_from_user(&buf, (void *) arg, sizeof(buf))) -+ return -EFAULT; -+ -+ ext3_init_tree_desc(&tree, inode); -+ buf.cur = buf.buffer; -+ buf.err = 0; -+ tree.private = &buf; -+ down_write(&EXT3_I(inode)->truncate_sem); -+ err = ext3_ext_walk_space(&tree, buf.start, 0xffffffff, -+ ext3_ext_store_extent_cb); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ if (err == 0) -+ err = buf.err; -+ } else if (cmd == EXT3_IOC_GET_TREE_STATS) { -+ struct ext3_extent_tree_stats buf; -+ struct ext3_extents_tree tree; -+ -+ ext3_init_tree_desc(&tree, inode); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ buf.depth = EXT_DEPTH(&tree); -+ buf.extents_num = 0; -+ buf.leaf_num = 0; -+ tree.private = &buf; -+ err = ext3_ext_walk_space(&tree, 0, 0xffffffff, -+ ext3_ext_collect_stats_cb); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ if (!err) -+ err = copy_to_user((void *) arg, &buf, sizeof(buf)); -+ } else if (cmd == EXT3_IOC_GET_TREE_DEPTH) { -+ struct ext3_extents_tree tree; -+ ext3_init_tree_desc(&tree, inode); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ err = EXT_DEPTH(&tree); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ } -+ -+ return err; -+} -+ -+EXPORT_SYMBOL(ext3_init_tree_desc); -+EXPORT_SYMBOL(ext3_mark_inode_dirty); -+EXPORT_SYMBOL(ext3_ext_invalidate_cache); -+EXPORT_SYMBOL(ext3_ext_insert_extent); -+EXPORT_SYMBOL(ext3_ext_walk_space); -+EXPORT_SYMBOL(ext3_ext_find_goal); -+EXPORT_SYMBOL(ext3_ext_calc_credits_for_insert); -+ -Index: linux-2.4.20-rh/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/ialloc.c 2004-04-28 10:31:55.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/ialloc.c 2004-04-28 10:32:44.000000000 +0800 -@@ -593,10 +593,13 @@ - iloc.bh = NULL; - goto fail; - } -+ if (test_opt(sb, EXTENTS)) { -+ EXT3_I(inode)->i_flags |= EXT3_EXTENTS_FL; -+ ext3_extents_initialize_blockmap(handle, inode); -+ } -+ - err = ext3_mark_iloc_dirty(handle, inode, &iloc); - if (err) goto fail; -- -- - - unlock_super (sb); - if(DQUOT_ALLOC_INODE(inode)) { -Index: linux-2.4.20-rh/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/inode.c 2004-04-28 10:31:55.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/inode.c 2004-04-28 10:41:41.000000000 +0800 -@@ -852,6 +852,15 @@ - goto reread; - } - -+static inline int -+ext3_get_block_wrap(handle_t *handle, struct inode *inode, long block, -+ struct buffer_head *bh, int create, int extend_disksize) -+{ -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_get_block(handle, inode, block, bh, create); -+ return ext3_get_block_handle(handle, inode, block, bh, create, extend_disksize); -+} -+ - /* - * The BKL is not held on entry here. - */ -@@ -865,8 +874,8 @@ - handle = ext3_journal_current_handle(); - J_ASSERT(handle != 0); - } -- ret = ext3_get_block_handle(handle, inode, iblock, -- bh_result, create, 1); -+ -+ ret = ext3_get_block_wrap(handle, inode, iblock, bh_result, create, 0); - return ret; - } - -@@ -892,8 +901,8 @@ - } - } - if (ret == 0) -- ret = ext3_get_block_handle(handle, inode, iblock, -- bh_result, create, 0); -+ ret = ext3_get_block_wrap(handle, inode, iblock, -+ bh_result, create, 0); - if (ret == 0) - bh_result->b_size = (1 << inode->i_blkbits); - unlock_kernel(); -@@ -914,7 +923,7 @@ - dummy.b_state = 0; - dummy.b_blocknr = -1000; - buffer_trace_init(&dummy.b_history); -- *errp = ext3_get_block_handle(handle, inode, block, &dummy, create, 1); -+ *errp = ext3_get_block_wrap(handle, inode, block, &dummy, create, 0); - if (!*errp && buffer_mapped(&dummy)) { - struct buffer_head *bh; - bh = sb_getblk(inode->i_sb, dummy.b_blocknr); -@@ -1502,7 +1511,7 @@ - * This required during truncate. We need to physically zero the tail end - * of that block so it doesn't yield old data if the file is later grown. - */ --static int ext3_block_truncate_page(handle_t *handle, -+int ext3_block_truncate_page(handle_t *handle, - struct address_space *mapping, loff_t from) - { - unsigned long index = from >> PAGE_CACHE_SHIFT; -@@ -1989,6 +1998,9 @@ - - ext3_discard_prealloc(inode); - -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_truncate(inode); -+ - handle = start_transaction(inode); - if (IS_ERR(handle)) - return; /* AKPM: return what? */ -@@ -2757,6 +2769,9 @@ - int indirects = (EXT3_NDIR_BLOCKS % bpp) ? 5 : 3; - int ret; - -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_writepage_trans_blocks(inode, bpp); -+ - if (ext3_should_journal_data(inode)) - ret = 3 * (bpp + indirects) + 2; - else -@@ -3081,8 +3096,8 @@ - - /* alloc blocks one by one */ - for (i = 0; i < nblocks; i++) { -- ret = ext3_get_block_handle(handle, inode, blocks[i], -- &bh_tmp, 1, 1); -+ ret = ext3_get_block_wrap(handle, inode, blocks[i], -+ &bh_tmp, 1, 1); - if (ret) - break; - -@@ -3157,7 +3172,7 @@ - if (blocks[i] != 0) - continue; - -- rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1, 1); -+ rc = ext3_get_block_wrap(handle, inode, iblock, &bh, 1, 1); - if (rc) { - printk(KERN_INFO "ext3_map_inode_page: error %d " - "allocating block %ld\n", rc, iblock); -Index: linux-2.4.20-rh/fs/ext3/Makefile -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/Makefile 2004-04-28 10:31:56.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/Makefile 2004-04-28 10:32:44.000000000 +0800 -@@ -13,7 +13,9 @@ - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ -- xattr_trusted.o -+ xattr_trusted.o extents.o -+export-objs += extents.o -+ - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.20-rh/fs/ext3/super.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/super.c 2004-04-28 10:31:55.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/super.c 2004-04-28 10:58:00.000000000 +0800 -@@ -623,6 +623,7 @@ - int i; - - J_ASSERT(sbi->s_delete_inodes == 0); -+ ext3_ext_release(sb); - ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { -@@ -796,6 +797,10 @@ - return 0; - } - } -+ else if (!strcmp (this_char, "extents")) -+ set_opt (*mount_options, EXTENTS); -+ else if (!strcmp (this_char, "extdebug")) -+ set_opt (*mount_options, EXTDEBUG); - else if (!strcmp (this_char, "pdirops")) - set_opt (sbi->s_mount_opt, PDIROPS); - else if (!strcmp (this_char, "grpid") || -@@ -1500,6 +1505,8 @@ - sb->s_flags |= S_PDIROPS; - } - -+ ext3_ext_init(sb); -+ - return sb; - - failed_mount3: -Index: linux-2.4.20-rh/fs/ext3/ioctl.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/ioctl.c 2004-04-28 10:31:33.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/ioctl.c 2004-04-28 10:32:44.000000000 +0800 -@@ -189,6 +189,10 @@ - return ret; - } - #endif -+ case EXT3_IOC_GET_EXTENTS: -+ case EXT3_IOC_GET_TREE_STATS: -+ case EXT3_IOC_GET_TREE_DEPTH: -+ return ext3_ext_ioctl(inode, filp, cmd, arg); - default: - return -ENOTTY; - } -Index: linux-2.4.20-rh/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.20-rh.orig/include/linux/ext3_fs.h 2004-04-28 10:31:55.000000000 +0800 -+++ linux-2.4.20-rh/include/linux/ext3_fs.h 2004-04-28 10:32:44.000000000 +0800 -@@ -184,6 +184,7 @@ - #define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */ - #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ - #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ -+#define EXT3_EXTENTS_FL 0x00080000 /* Inode uses extents */ - - #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ - #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ -@@ -208,6 +209,9 @@ - #ifdef CONFIG_JBD_DEBUG - #define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) - #endif -+#define EXT3_IOC_GET_EXTENTS _IOR('f', 5, long) -+#define EXT3_IOC_GET_TREE_DEPTH _IOR('f', 6, long) -+#define EXT3_IOC_GET_TREE_STATS _IOR('f', 7, long) - - /* - * Structure of an inode on the disk -@@ -328,6 +332,8 @@ - #define EXT3_MOUNT_IOPEN 0x8000 /* Allow access via iopen */ - #define EXT3_MOUNT_IOPEN_NOPRIV 0x10000 /* Make iopen world-readable */ - #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ -+#define EXT3_MOUNT_EXTENTS 0x100000/* Extents support */ -+#define EXT3_MOUNT_EXTDEBUG 0x200000/* Extents debug */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -689,6 +695,7 @@ - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - - /* inode.c */ -+extern int ext3_block_truncate_page(handle_t *, struct address_space *, loff_t); - extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); -@@ -770,6 +777,14 @@ - extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - -+/* extents.c */ -+extern int ext3_ext_writepage_trans_blocks(struct inode *, int); -+extern int ext3_ext_get_block(handle_t *, struct inode *, long, -+ struct buffer_head *, int); -+extern void ext3_ext_truncate(struct inode *); -+extern void ext3_ext_init(struct super_block *); -+extern void ext3_ext_release(struct super_block *); -+extern void ext3_extents_initialize_blockmap(handle_t *, struct inode *); - - #endif /* __KERNEL__ */ - -Index: linux-2.4.20-rh/include/linux/ext3_extents.h -=================================================================== ---- linux-2.4.20-rh.orig/include/linux/ext3_extents.h 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-rh/include/linux/ext3_extents.h 2004-04-28 10:32:44.000000000 +0800 -@@ -0,0 +1,216 @@ -+/* -+ * Copyright (C) 2003 Alex Tomas <alex@clusterfs.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. -+ * -+ * 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 Licens -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- -+ */ -+ -+#ifndef _LINUX_EXT3_EXTENTS -+#define _LINUX_EXT3_EXTENTS -+ -+/* -+ * with AGRESSIVE_TEST defined capacity of index/leaf blocks -+ * become very little, so index split, in-depth growing and -+ * other hard changes happens much more often -+ * this is for debug purposes only -+ */ -+#define AGRESSIVE_TEST_ -+ -+/* -+ * if CHECK_BINSEARCH defined, then results of binary search -+ * will be checked by linear search -+ */ -+#define CHECK_BINSEARCH_ -+ -+/* -+ * if EXT_DEBUG is defined you can use 'extdebug' mount option -+ * to get lots of info what's going on -+ */ -+#define EXT_DEBUG -+#ifdef EXT_DEBUG -+#define ext_debug(tree,fmt,a...) \ -+do { \ -+ if (test_opt((tree)->inode->i_sb, EXTDEBUG)) \ -+ printk(fmt, ##a); \ -+} while (0); -+#else -+#define ext_debug(tree,fmt,a...) -+#endif -+ -+/* -+ * if EXT_STATS is defined then stats numbers are collected -+ * these number will be displayed at umount time -+ */ -+#define EXT_STATS_ -+ -+ -+#define EXT3_ALLOC_NEEDED 3 /* block bitmap + group desc. + sb */ -+ -+/* -+ * ext3_inode has i_block array (total 60 bytes) -+ * first 4 bytes are used to store: -+ * - tree depth (0 mean there is no tree yet. all extents in the inode) -+ * - number of alive extents in the inode -+ */ -+ -+/* -+ * this is extent on-disk structure -+ * it's used at the bottom of the tree -+ */ -+struct ext3_extent { -+ __u32 e_block; /* first logical block extent covers */ -+ __u32 e_start; /* first physical block extents lives */ -+ __u32 e_num; /* number of blocks covered by extent */ -+}; -+ -+/* -+ * this is index on-disk structure -+ * it's used at all the levels, but the bottom -+ */ -+struct ext3_extent_idx { -+ __u32 e_block; /* index covers logical blocks from 'block' */ -+ __u32 e_leaf; /* pointer to the physical block of the next * -+ * level. leaf or next index could bet here */ -+}; -+ -+/* -+ * each block (leaves and indexes), even inode-stored has header -+ */ -+struct ext3_extent_header { -+ __u16 e_magic; /* probably will support different formats */ -+ __u16 e_num; /* number of valid entries */ -+ __u16 e_max; /* capacity of store in entries */ -+ __u16 e_depth; /* has tree real underlaying blocks? */ -+ __u32 e_generation; /* generation of the tree */ -+}; -+ -+#define EXT3_EXT_MAGIC 0xf301 -+ -+/* -+ * array of ext3_ext_path contains path to some extent -+ * creation/lookup routines use it for traversal/splitting/etc -+ * truncate uses it to simulate recursive walking -+ */ -+struct ext3_ext_path { -+ __u32 p_block; -+ __u16 p_depth; -+ struct ext3_extent *p_ext; -+ struct ext3_extent_idx *p_idx; -+ struct ext3_extent_header *p_hdr; -+ struct buffer_head *p_bh; -+}; -+ -+/* -+ * structure for external API -+ */ -+ -+ -+/* -+ * ext3_extents_tree is used to pass initial information -+ * to top-level extents API -+ */ -+struct ext3_extents_tree { -+ struct inode *inode; /* inode which tree belongs to */ -+ void *root; /* ptr to data top of tree resides at */ -+ void *buffer; /* will be passed as arg to ^^ routines */ -+ int buffer_len; -+ void *private; -+ struct ext3_extent *cex;/* last found extent */ -+ int (*get_write_access)(handle_t *h, void *buffer); -+ int (*mark_buffer_dirty)(handle_t *h, void *buffer); -+ int (*mergable)(struct ext3_extent *ex1, struct ext3_extent *ex2); -+ int (*remove_extent_credits)(struct ext3_extents_tree *, -+ struct ext3_extent *, unsigned long, -+ unsigned long); -+ int (*remove_extent)(struct ext3_extents_tree *, -+ struct ext3_extent *, unsigned long, -+ unsigned long); -+ int (*new_block)(handle_t *, struct ext3_extents_tree *, -+ struct ext3_ext_path *, struct ext3_extent *, -+ int *); -+}; -+ -+/* -+ * to be called by ext3_ext_walk_space() -+ * negative retcode - error -+ * positive retcode - signal for ext3_ext_walk_space(), see below -+ * callback must return valid extent (passed or newly created) -+ */ -+typedef int (*ext_prepare_callback)(struct ext3_extents_tree *, -+ struct ext3_ext_path *, -+ struct ext3_extent *, int); -+ -+#define EXT_CONTINUE 0 -+#define EXT_BREAK 1 -+#define EXT_REPEAT 2 -+ -+ -+#define EXT_FIRST_EXTENT(__hdr__) \ -+ ((struct ext3_extent *) (((char *) (__hdr__)) + \ -+ sizeof(struct ext3_extent_header))) -+#define EXT_FIRST_INDEX(__hdr__) \ -+ ((struct ext3_extent_idx *) (((char *) (__hdr__)) + \ -+ sizeof(struct ext3_extent_header))) -+#define EXT_HAS_FREE_INDEX(__path__) \ -+ ((__path__)->p_hdr->e_num < (__path__)->p_hdr->e_max) -+#define EXT_LAST_EXTENT(__hdr__) \ -+ (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->e_num - 1) -+#define EXT_LAST_INDEX(__hdr__) \ -+ (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->e_num - 1) -+#define EXT_MAX_EXTENT(__hdr__) \ -+ (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->e_max - 1) -+#define EXT_MAX_INDEX(__hdr__) \ -+ (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->e_max - 1) -+ -+#define EXT_ROOT_HDR(tree) \ -+ ((struct ext3_extent_header *) (tree)->root) -+#define EXT_BLOCK_HDR(bh) \ -+ ((struct ext3_extent_header *) (bh)->b_data) -+#define EXT_DEPTH(_t_) \ -+ (((struct ext3_extent_header *)((_t_)->root))->e_depth) -+#define EXT_GENERATION(_t_) \ -+ (((struct ext3_extent_header *)((_t_)->root))->e_generation) -+ -+ -+#define EXT_ASSERT(__x__) if (!(__x__)) BUG(); -+ -+ -+/* -+ * this structure is used to gather extents from the tree via ioctl -+ */ -+struct ext3_extent_buf { -+ unsigned long start; -+ int buflen; -+ void *buffer; -+ void *cur; -+ int err; -+}; -+ -+/* -+ * this structure is used to collect stats info about the tree -+ */ -+struct ext3_extent_tree_stats { -+ int depth; -+ int extents_num; -+ int leaf_num; -+}; -+ -+extern int ext3_extent_tree_init(handle_t *, struct ext3_extents_tree *); -+extern int ext3_ext_calc_credits_for_insert(struct ext3_extents_tree *, struct ext3_ext_path *); -+extern int ext3_ext_insert_extent(handle_t *, struct ext3_extents_tree *, struct ext3_ext_path *, struct ext3_extent *); -+extern int ext3_ext_walk_space(struct ext3_extents_tree *, unsigned long, unsigned long, ext_prepare_callback); -+extern int ext3_ext_remove_space(struct ext3_extents_tree *, unsigned long, unsigned long); -+extern struct ext3_ext_path * ext3_ext_find_extent(struct ext3_extents_tree *, int, struct ext3_ext_path *); -+ -+#endif /* _LINUX_EXT3_EXTENTS */ -+ -Index: linux-2.4.20-rh/include/linux/ext3_fs_i.h -=================================================================== ---- linux-2.4.20-rh.orig/include/linux/ext3_fs_i.h 2004-04-28 10:31:55.000000000 +0800 -+++ linux-2.4.20-rh/include/linux/ext3_fs_i.h 2004-04-28 10:59:04.000000000 +0800 -@@ -78,6 +78,7 @@ - */ - struct rw_semaphore truncate_sem; - -+ __u32 i_cached_extent[3]; - /* following fields for parallel directory operations -bzzz */ - struct dynlock i_htree_lock; - struct semaphore i_append_sem; diff --git a/lustre/kernel_patches/patches/ext3-extents-2.4.20.patch b/lustre/kernel_patches/patches/ext3-extents-2.4.20.patch deleted file mode 100644 index 18902e5f62..0000000000 --- a/lustre/kernel_patches/patches/ext3-extents-2.4.20.patch +++ /dev/null @@ -1,2807 +0,0 @@ -Index: linux-2.4.20-8/fs/ext3/extents.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/extents.c 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/extents.c 2004-04-14 19:47:13.000000000 +0800 -@@ -0,0 +1,2347 @@ -+/* -+ * Copyright (C) 2003 Alex Tomas <alex@clusterfs.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. -+ * -+ * 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 Licens -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- -+ */ -+ -+/* -+ * Extents support for EXT3 -+ * -+ * TODO: -+ * - ext3_ext_walk_space() sould not use ext3_ext_find_extent() -+ * - ext3_ext_calc_credits() could take 'mergable' into account -+ * - ext3*_error() should be used in some situations -+ * - find_goal() [to be tested and improved] -+ * - smart tree reduction -+ * - arch-independence -+ * common on-disk format for big/little-endian arch -+ */ -+ -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/time.h> -+#include <linux/ext3_jbd.h> -+#include <linux/jbd.h> -+#include <linux/smp_lock.h> -+#include <linux/highuid.h> -+#include <linux/pagemap.h> -+#include <linux/quotaops.h> -+#include <linux/string.h> -+#include <linux/slab.h> -+#include <linux/locks.h> -+#include <linux/ext3_extents.h> -+#include <asm/uaccess.h> -+ -+static handle_t *ext3_ext_journal_restart(handle_t *handle, int needed) -+{ -+ int err; -+ -+ if (handle->h_buffer_credits > needed) -+ return handle; -+ if (!ext3_journal_extend(handle, needed)) -+ return handle; -+ err = ext3_journal_restart(handle, needed); -+ -+ return handle; -+} -+ -+static int inline -+ext3_ext_get_access_for_root(handle_t *h, struct ext3_extents_tree *tree) -+{ -+ if (tree->get_write_access) -+ return tree->get_write_access(h,tree->buffer); -+ else -+ return 0; -+} -+ -+static int inline -+ext3_ext_mark_root_dirty(handle_t *h, struct ext3_extents_tree *tree) -+{ -+ if (tree->mark_buffer_dirty) -+ return tree->mark_buffer_dirty(h,tree->buffer); -+ else -+ return 0; -+} -+ -+/* -+ * could return: -+ * - EROFS -+ * - ENOMEM -+ */ -+static int ext3_ext_get_access(handle_t *handle, -+ struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ int err; -+ -+ if (path->p_bh) { -+ /* path points to block */ -+ err = ext3_journal_get_write_access(handle, path->p_bh); -+ } else { -+ /* path points to leaf/index in inode body */ -+ err = ext3_ext_get_access_for_root(handle, tree); -+ } -+ return err; -+} -+ -+/* -+ * could return: -+ * - EROFS -+ * - ENOMEM -+ * - EIO -+ */ -+static int ext3_ext_dirty(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ int err; -+ if (path->p_bh) { -+ /* path points to block */ -+ err =ext3_journal_dirty_metadata(handle, path->p_bh); -+ } else { -+ /* path points to leaf/index in inode body */ -+ err = ext3_ext_mark_root_dirty(handle, tree); -+ } -+ return err; -+} -+ -+static int inline -+ext3_ext_new_block(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, struct ext3_extent *ex, -+ int *err) -+{ -+ int goal, depth, newblock; -+ struct inode *inode; -+ -+ EXT_ASSERT(tree); -+ if (tree->new_block) -+ return tree->new_block(handle, tree, path, ex, err); -+ -+ inode = tree->inode; -+ depth = EXT_DEPTH(tree); -+ if (path && depth > 0) { -+ goal = path[depth-1].p_block; -+ } else { -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ unsigned long bg_start; -+ unsigned long colour; -+ -+ bg_start = (ei->i_block_group * -+ EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + -+ le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); -+ colour = (current->pid % 16) * -+ (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); -+ goal = bg_start + colour; -+ } -+ -+ newblock = ext3_new_block(handle, inode, goal, 0, 0, err); -+ return newblock; -+} -+ -+static inline void ext3_ext_tree_changed(struct ext3_extents_tree *tree) -+{ -+ struct ext3_extent_header *neh; -+ neh = EXT_ROOT_HDR(tree); -+ neh->e_generation++; -+} -+ -+static inline int ext3_ext_space_block(struct ext3_extents_tree *tree) -+{ -+ int size; -+ -+ size = (tree->inode->i_sb->s_blocksize - -+ sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent); -+#ifdef AGRESSIVE_TEST -+ size = 6; -+#endif -+ return size; -+} -+ -+static inline int ext3_ext_space_block_idx(struct ext3_extents_tree *tree) -+{ -+ int size; -+ -+ size = (tree->inode->i_sb->s_blocksize - -+ sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent_idx); -+#ifdef AGRESSIVE_TEST -+ size = 5; -+#endif -+ return size; -+} -+ -+static inline int ext3_ext_space_root(struct ext3_extents_tree *tree) -+{ -+ int size; -+ -+ size = (tree->buffer_len - sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent); -+#ifdef AGRESSIVE_TEST -+ size = 3; -+#endif -+ return size; -+} -+ -+static inline int ext3_ext_space_root_idx(struct ext3_extents_tree *tree) -+{ -+ int size; -+ -+ size = (tree->buffer_len - -+ sizeof(struct ext3_extent_header)) -+ / sizeof(struct ext3_extent_idx); -+#ifdef AGRESSIVE_TEST -+ size = 4; -+#endif -+ return size; -+} -+ -+static void ext3_ext_show_path(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+#ifdef EXT_DEBUG -+ int k, l = path->p_depth; -+ -+ ext_debug(tree, "path:"); -+ for (k = 0; k <= l; k++, path++) { -+ if (path->p_idx) { -+ ext_debug(tree, " %d->%d", path->p_idx->e_block, -+ path->p_idx->e_leaf); -+ } else if (path->p_ext) { -+ ext_debug(tree, " %d:%d:%d", -+ path->p_ext->e_block, -+ path->p_ext->e_num, -+ path->p_ext->e_start); -+ } else -+ ext_debug(tree, " []"); -+ } -+ ext_debug(tree, "\n"); -+#endif -+} -+ -+static void ext3_ext_show_leaf(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+#ifdef EXT_DEBUG -+ int depth = EXT_DEPTH(tree); -+ struct ext3_extent_header *eh; -+ struct ext3_extent *ex; -+ int i; -+ -+ if (!path) -+ return; -+ -+ eh = path[depth].p_hdr; -+ ex = EXT_FIRST_EXTENT(eh); -+ -+ for (i = 0; i < eh->e_num; i++, ex++) { -+ ext_debug(tree, "%d:%d:%d ", -+ ex->e_block, ex->e_num, ex->e_start); -+ } -+ ext_debug(tree, "\n"); -+#endif -+} -+ -+static void ext3_ext_drop_refs(struct ext3_ext_path *path) -+{ -+ int depth = path->p_depth; -+ int i; -+ -+ for (i = 0; i <= depth; i++, path++) -+ if (path->p_bh) { -+ brelse(path->p_bh); -+ path->p_bh = NULL; -+ } -+} -+ -+/* -+ * binary search for closest index by given block -+ */ -+static inline void -+ext3_ext_binsearch_idx(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, int block) -+{ -+ struct ext3_extent_header *eh = path->p_hdr; -+ struct ext3_extent_idx *ix; -+ int l = 0, k, r; -+ -+ EXT_ASSERT(eh->e_magic == EXT3_EXT_MAGIC); -+ EXT_ASSERT(eh->e_num <= eh->e_max); -+ EXT_ASSERT(eh->e_num > 0); -+ -+ ext_debug(tree, "binsearch for %d(idx): ", block); -+ -+ path->p_idx = ix = EXT_FIRST_INDEX(eh); -+ -+ r = k = eh->e_num; -+ while (k > 1) { -+ k = (r - l) / 2; -+ if (block < ix[l + k].e_block) -+ r -= k; -+ else -+ l += k; -+ ext_debug(tree, "%d:%d:%d ", k, l, r); -+ } -+ -+ ix += l; -+ path->p_idx = ix; -+ ext_debug(tree, " -> %d->%d ", path->p_idx->e_block, path->p_idx->e_leaf); -+ -+ while (l++ < r) { -+ if (block < ix->e_block) -+ break; -+ path->p_idx = ix++; -+ } -+ ext_debug(tree, " -> %d->%d\n", path->p_idx->e_block, -+ path->p_idx->e_leaf); -+ -+#ifdef CHECK_BINSEARCH -+ { -+ struct ext3_extent_idx *chix; -+ -+ chix = ix = EXT_FIRST_INDEX(eh); -+ for (k = 0; k < eh->e_num; k++, ix++) { -+ if (k != 0 && ix->e_block <= ix[-1].e_block) { -+ printk("k=%d, ix=0x%p, first=0x%p\n", k, -+ ix, EXT_FIRST_INDEX(eh)); -+ printk("%u <= %u\n", -+ ix->e_block,ix[-1].e_block); -+ } -+ EXT_ASSERT(k == 0 || ix->e_block > ix[-1].e_block); -+ if (block < ix->e_block) -+ break; -+ chix = ix; -+ } -+ EXT_ASSERT(chix == path->p_idx); -+ } -+#endif -+ -+} -+ -+/* -+ * binary search for closest extent by given block -+ */ -+static inline void -+ext3_ext_binsearch(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, int block) -+{ -+ struct ext3_extent_header *eh = path->p_hdr; -+ struct ext3_extent *ex; -+ int l = 0, k, r; -+ -+ EXT_ASSERT(eh->e_magic == EXT3_EXT_MAGIC); -+ EXT_ASSERT(eh->e_num <= eh->e_max); -+ -+ if (eh->e_num == 0) { -+ /* -+ * this leaf is empty yet: -+ * we get such a leaf in split/add case -+ */ -+ return; -+ } -+ -+ ext_debug(tree, "binsearch for %d: ", block); -+ -+ path->p_ext = ex = EXT_FIRST_EXTENT(eh); -+ -+ r = k = eh->e_num; -+ while (k > 1) { -+ k = (r - l) / 2; -+ if (block < ex[l + k].e_block) -+ r -= k; -+ else -+ l += k; -+ ext_debug(tree, "%d:%d:%d ", k, l, r); -+ } -+ -+ ex += l; -+ path->p_ext = ex; -+ ext_debug(tree, " -> %d:%d:%d ", path->p_ext->e_block, -+ path->p_ext->e_start, path->p_ext->e_num); -+ -+ while (l++ < r) { -+ if (block < ex->e_block) -+ break; -+ path->p_ext = ex++; -+ } -+ ext_debug(tree, " -> %d:%d:%d\n", path->p_ext->e_block, -+ path->p_ext->e_start, path->p_ext->e_num); -+ -+#ifdef CHECK_BINSEARCH -+ { -+ struct ext3_extent *chex; -+ -+ chex = ex = EXT_FIRST_EXTENT(eh); -+ for (k = 0; k < eh->e_num; k++, ex++) { -+ EXT_ASSERT(k == 0 || ex->e_block > ex[-1].e_block); -+ if (block < ex->e_block) -+ break; -+ chex = ex; -+ } -+ EXT_ASSERT(chex == path->p_ext); -+ } -+#endif -+ -+} -+ -+int ext3_extent_tree_init(handle_t *handle, struct ext3_extents_tree *tree) -+{ -+ struct ext3_extent_header *eh; -+ -+ BUG_ON(tree->buffer_len == 0); -+ ext3_ext_get_access_for_root(handle, tree); -+ eh = EXT_ROOT_HDR(tree); -+ eh->e_depth = 0; -+ eh->e_num = 0; -+ eh->e_magic = EXT3_EXT_MAGIC; -+ eh->e_max = ext3_ext_space_root(tree); -+ ext3_ext_mark_root_dirty(handle, tree); -+ return 0; -+} -+ -+struct ext3_ext_path * -+ext3_ext_find_extent(struct ext3_extents_tree *tree, int block, -+ struct ext3_ext_path *path) -+{ -+ struct ext3_extent_header *eh; -+ struct buffer_head *bh; -+ int depth, i, ppos = 0; -+ -+ EXT_ASSERT(tree); -+ EXT_ASSERT(tree->inode); -+ EXT_ASSERT(tree->root); -+ -+ eh = EXT_ROOT_HDR(tree); -+ EXT_ASSERT(eh); -+ i = depth = EXT_DEPTH(tree); -+ EXT_ASSERT(eh->e_max); -+ EXT_ASSERT(eh->e_magic == EXT3_EXT_MAGIC); -+ EXT_ASSERT(i == 0 || eh->e_num > 0); -+ -+ /* account possible depth increase */ -+ if (!path) { -+ path = kmalloc(sizeof(struct ext3_ext_path) * (depth + 2), -+ GFP_NOFS); -+ if (!path) -+ return ERR_PTR(-ENOMEM); -+ } -+ memset(path, 0, sizeof(struct ext3_ext_path) * (depth + 1)); -+ path[0].p_hdr = eh; -+ -+ /* walk through the tree */ -+ while (i) { -+ ext_debug(tree, "depth %d: num %d, max %d\n", -+ ppos, eh->e_num, eh->e_max); -+ ext3_ext_binsearch_idx(tree, path + ppos, block); -+ path[ppos].p_block = path[ppos].p_idx->e_leaf; -+ path[ppos].p_depth = i; -+ path[ppos].p_ext = NULL; -+ -+ bh = sb_bread(tree->inode->i_sb, path[ppos].p_block); -+ if (!bh) { -+ ext3_ext_drop_refs(path); -+ kfree(path); -+ return ERR_PTR(-EIO); -+ } -+ eh = EXT_BLOCK_HDR(bh); -+ ppos++; -+ EXT_ASSERT(ppos <= depth); -+ path[ppos].p_bh = bh; -+ path[ppos].p_hdr = eh; -+ i--; -+ } -+ -+ path[ppos].p_depth = i; -+ path[ppos].p_hdr = eh; -+ path[ppos].p_ext = NULL; -+ -+ /* find extent */ -+ ext3_ext_binsearch(tree, path + ppos, block); -+ -+ ext3_ext_show_path(tree, path); -+ -+ return path; -+} -+ -+/* -+ * insert new index [logical;ptr] into the block at cupr -+ * it check where to insert: before curp or after curp -+ */ -+static int ext3_ext_insert_index(handle_t *handle, -+ struct ext3_extents_tree *tree, -+ struct ext3_ext_path *curp, -+ int logical, int ptr) -+{ -+ struct ext3_extent_idx *ix; -+ int len, err; -+ -+ if ((err = ext3_ext_get_access(handle, tree, curp))) -+ return err; -+ -+ EXT_ASSERT(logical != curp->p_idx->e_block); -+ len = EXT_MAX_INDEX(curp->p_hdr) - curp->p_idx; -+ if (logical > curp->p_idx->e_block) { -+ /* insert after */ -+ if (curp->p_idx != EXT_LAST_INDEX(curp->p_hdr)) { -+ len = (len - 1) * sizeof(struct ext3_extent_idx); -+ len = len < 0 ? 0 : len; -+ ext_debug(tree, "insert new index %d after: %d. " -+ "move %d from 0x%p to 0x%p\n", -+ logical, ptr, len, -+ (curp->p_idx + 1), (curp->p_idx + 2)); -+ memmove(curp->p_idx + 2, curp->p_idx + 1, len); -+ } -+ ix = curp->p_idx + 1; -+ } else { -+ /* insert before */ -+ len = len * sizeof(struct ext3_extent_idx); -+ len = len < 0 ? 0 : len; -+ ext_debug(tree, "insert new index %d before: %d. " -+ "move %d from 0x%p to 0x%p\n", -+ logical, ptr, len, -+ curp->p_idx, (curp->p_idx + 1)); -+ memmove(curp->p_idx + 1, curp->p_idx, len); -+ ix = curp->p_idx; -+ } -+ -+ ix->e_block = logical; -+ ix->e_leaf = ptr; -+ curp->p_hdr->e_num++; -+ -+ EXT_ASSERT(curp->p_hdr->e_num <= curp->p_hdr->e_max); -+ EXT_ASSERT(ix <= EXT_LAST_INDEX(curp->p_hdr)); -+ -+ err = ext3_ext_dirty(handle, tree, curp); -+ ext3_std_error(tree->inode->i_sb, err); -+ -+ return err; -+} -+ -+/* -+ * routine inserts new subtree into the path, using free index entry -+ * at depth 'at: -+ * - allocates all needed blocks (new leaf and all intermediate index blocks) -+ * - makes decision where to split -+ * - moves remaining extens and index entries (right to the split point) -+ * into the newly allocated blocks -+ * - initialize subtree -+ */ -+static int ext3_ext_split(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newext, int at) -+{ -+ struct buffer_head *bh = NULL; -+ int depth = EXT_DEPTH(tree); -+ struct ext3_extent_header *neh; -+ struct ext3_extent_idx *fidx; -+ struct ext3_extent *ex; -+ int i = at, k, m, a; -+ unsigned long newblock, oldblock, border; -+ int *ablocks = NULL; /* array of allocated blocks */ -+ int err = 0; -+ -+ /* make decision: where to split? */ -+ /* FIXME: now desicion is simplest: at current extent */ -+ -+ /* if current leaf will be splitted, then we should use -+ * border from split point */ -+ EXT_ASSERT(path[depth].p_ext <= EXT_MAX_EXTENT(path[depth].p_hdr)); -+ if (path[depth].p_ext != EXT_MAX_EXTENT(path[depth].p_hdr)) { -+ border = path[depth].p_ext[1].e_block; -+ ext_debug(tree, "leaf will be splitted." -+ " next leaf starts at %d\n", -+ (int)border); -+ } else { -+ border = newext->e_block; -+ ext_debug(tree, "leaf will be added." -+ " next leaf starts at %d\n", -+ (int)border); -+ } -+ -+ /* -+ * if error occurs, then we break processing -+ * and turn filesystem read-only. so, index won't -+ * be inserted and tree will be in consistent -+ * state. next mount will repair buffers too -+ */ -+ -+ /* -+ * get array to track all allocated blocks -+ * we need this to handle errors and free blocks -+ * upon them -+ */ -+ ablocks = kmalloc(sizeof(unsigned long) * depth, GFP_NOFS); -+ if (!ablocks) -+ return -ENOMEM; -+ memset(ablocks, 0, sizeof(unsigned long) * depth); -+ -+ /* allocate all needed blocks */ -+ ext_debug(tree, "allocate %d blocks for indexes/leaf\n", depth - at); -+ for (a = 0; a < depth - at; a++) { -+ newblock = ext3_ext_new_block(handle, tree, path, newext, &err); -+ if (newblock == 0) -+ goto cleanup; -+ ablocks[a] = newblock; -+ } -+ -+ /* initialize new leaf */ -+ newblock = ablocks[--a]; -+ EXT_ASSERT(newblock); -+ bh = sb_getblk(tree->inode->i_sb, newblock); -+ if (!bh) { -+ err = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(bh); -+ -+ if ((err = ext3_journal_get_create_access(handle, bh))) -+ goto cleanup; -+ -+ neh = EXT_BLOCK_HDR(bh); -+ neh->e_num = 0; -+ neh->e_max = ext3_ext_space_block(tree); -+ neh->e_magic = EXT3_EXT_MAGIC; -+ neh->e_depth = 0; -+ ex = EXT_FIRST_EXTENT(neh); -+ -+ /* move remain of path[depth] to the new leaf */ -+ EXT_ASSERT(path[depth].p_hdr->e_num == path[depth].p_hdr->e_max); -+ /* start copy from next extent */ -+ /* TODO: we could do it by single memmove */ -+ m = 0; -+ path[depth].p_ext++; -+ while (path[depth].p_ext <= -+ EXT_MAX_EXTENT(path[depth].p_hdr)) { -+ ext_debug(tree, "move %d:%d:%d in new leaf %lu\n", -+ path[depth].p_ext->e_block, -+ path[depth].p_ext->e_start, -+ path[depth].p_ext->e_num, -+ newblock); -+ memmove(ex++, path[depth].p_ext++, -+ sizeof(struct ext3_extent)); -+ neh->e_num++; -+ m++; -+ } -+ mark_buffer_uptodate(bh, 1); -+ unlock_buffer(bh); -+ -+ if ((err = ext3_journal_dirty_metadata(handle, bh))) -+ goto cleanup; -+ brelse(bh); -+ bh = NULL; -+ -+ /* correct old leaf */ -+ if (m) { -+ if ((err = ext3_ext_get_access(handle, tree, path + depth))) -+ goto cleanup; -+ path[depth].p_hdr->e_num -= m; -+ if ((err = ext3_ext_dirty(handle, tree, path + depth))) -+ goto cleanup; -+ -+ } -+ -+ /* create intermediate indexes */ -+ k = depth - at - 1; -+ EXT_ASSERT(k >= 0); -+ if (k) -+ ext_debug(tree, "create %d intermediate indices\n", k); -+ /* insert new index into current index block */ -+ /* current depth stored in i var */ -+ i = depth - 1; -+ while (k--) { -+ oldblock = newblock; -+ newblock = ablocks[--a]; -+ bh = sb_getblk(tree->inode->i_sb, newblock); -+ if (!bh) { -+ err = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(bh); -+ -+ if ((err = ext3_journal_get_create_access(handle, bh))) -+ goto cleanup; -+ -+ neh = EXT_BLOCK_HDR(bh); -+ neh->e_num = 1; -+ neh->e_magic = EXT3_EXT_MAGIC; -+ neh->e_max = ext3_ext_space_block_idx(tree); -+ neh->e_depth = depth - i; -+ fidx = EXT_FIRST_INDEX(neh); -+ fidx->e_block = border; -+ fidx->e_leaf = oldblock; -+ -+ ext_debug(tree, "int.index at %d (block %lu): %lu -> %lu\n", -+ i, newblock, border, oldblock); -+ /* copy indexes */ -+ m = 0; -+ path[i].p_idx++; -+ -+ ext_debug(tree, "cur 0x%p, last 0x%p\n", path[i].p_idx, -+ EXT_MAX_INDEX(path[i].p_hdr)); -+ EXT_ASSERT(EXT_MAX_INDEX(path[i].p_hdr) == -+ EXT_LAST_INDEX(path[i].p_hdr)); -+ while (path[i].p_idx <= EXT_MAX_INDEX(path[i].p_hdr)) { -+ ext_debug(tree, "%d: move %d:%d in new index %lu\n", -+ i, path[i].p_idx->e_block, -+ path[i].p_idx->e_leaf, newblock); -+ memmove(++fidx, path[i].p_idx++, -+ sizeof(struct ext3_extent_idx)); -+ neh->e_num++; -+ EXT_ASSERT(neh->e_num <= neh->e_max); -+ m++; -+ } -+ mark_buffer_uptodate(bh, 1); -+ unlock_buffer(bh); -+ -+ if ((err = ext3_journal_dirty_metadata(handle, bh))) -+ goto cleanup; -+ brelse(bh); -+ bh = NULL; -+ -+ /* correct old index */ -+ if (m) { -+ err = ext3_ext_get_access(handle, tree, path + i); -+ if (err) -+ goto cleanup; -+ path[i].p_hdr->e_num -= m; -+ err = ext3_ext_dirty(handle, tree, path + i); -+ if (err) -+ goto cleanup; -+ } -+ -+ i--; -+ } -+ -+ /* insert new index */ -+ if (!err) -+ err = ext3_ext_insert_index(handle, tree, path + at, -+ border, newblock); -+ -+cleanup: -+ if (bh) { -+ if (buffer_locked(bh)) -+ unlock_buffer(bh); -+ brelse(bh); -+ } -+ -+ if (err) { -+ /* free all allocated blocks in error case */ -+ for (i = 0; i < depth; i++) -+ if (!ablocks[i]) -+ continue; -+ ext3_free_blocks(handle, tree->inode, ablocks[i], 1); -+ } -+ kfree(ablocks); -+ -+ return err; -+} -+ -+/* -+ * routine implements tree growing procedure: -+ * - allocates new block -+ * - moves top-level data (index block or leaf) into the new block -+ * - initialize new top-level, creating index that points to the -+ * just created block -+ */ -+static int ext3_ext_grow_indepth(handle_t *handle, -+ struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newext) -+{ -+ struct ext3_ext_path *curp = path; -+ struct ext3_extent_header *neh; -+ struct ext3_extent_idx *fidx; -+ struct buffer_head *bh; -+ unsigned long newblock; -+ int err = 0; -+ -+ newblock = ext3_ext_new_block(handle, tree, path, newext, &err); -+ if (newblock == 0) -+ return err; -+ -+ bh = sb_getblk(tree->inode->i_sb, newblock); -+ if (!bh) { -+ err = -EIO; -+ ext3_std_error(tree->inode->i_sb, err); -+ return err; -+ } -+ lock_buffer(bh); -+ -+ if ((err = ext3_journal_get_create_access(handle, bh))) { -+ unlock_buffer(bh); -+ goto out; -+ } -+ -+ /* move top-level index/leaf into new block */ -+ memmove(bh->b_data, curp->p_hdr, tree->buffer_len); -+ -+ /* set size of new block */ -+ neh = EXT_BLOCK_HDR(bh); -+ /* old root could have indexes or leaves -+ * so calculate e_max right way */ -+ if (EXT_DEPTH(tree)) -+ neh->e_max = ext3_ext_space_block_idx(tree); -+ else -+ neh->e_max = ext3_ext_space_block(tree); -+ neh->e_magic = EXT3_EXT_MAGIC; -+ mark_buffer_uptodate(bh, 1); -+ unlock_buffer(bh); -+ -+ if ((err = ext3_journal_dirty_metadata(handle, bh))) -+ goto out; -+ -+ /* create index in new top-level index: num,max,pointer */ -+ if ((err = ext3_ext_get_access(handle, tree, curp))) -+ goto out; -+ -+ curp->p_hdr->e_magic = EXT3_EXT_MAGIC; -+ curp->p_hdr->e_max = ext3_ext_space_root_idx(tree); -+ curp->p_hdr->e_num = 1; -+ curp->p_idx = EXT_FIRST_INDEX(curp->p_hdr); -+ /* FIXME: it works, but actually path[0] can be index */ -+ curp->p_idx->e_block = EXT_FIRST_EXTENT(path[0].p_hdr)->e_block; -+ curp->p_idx->e_leaf = newblock; -+ -+ neh = EXT_ROOT_HDR(tree); -+ fidx = EXT_FIRST_INDEX(neh); -+ ext_debug(tree, "new root: num %d(%d), lblock %d, ptr %d\n", -+ neh->e_num, neh->e_max, fidx->e_block, fidx->e_leaf); -+ -+ neh->e_depth = path->p_depth + 1; -+ err = ext3_ext_dirty(handle, tree, curp); -+out: -+ brelse(bh); -+ -+ return err; -+} -+ -+/* -+ * routine finds empty index and adds new leaf. if no free index found -+ * then it requests in-depth growing -+ */ -+static int ext3_ext_create_new_leaf(handle_t *handle, -+ struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newext) -+{ -+ struct ext3_ext_path *curp; -+ int depth, i, err = 0; -+ -+repeat: -+ i = depth = EXT_DEPTH(tree); -+ -+ /* walk up to the tree and look for free index entry */ -+ curp = path + depth; -+ while (i > 0 && !EXT_HAS_FREE_INDEX(curp)) { -+ i--; -+ curp--; -+ } -+ -+ /* we use already allocated block for index block -+ * so, subsequent data blocks should be contigoues */ -+ if (EXT_HAS_FREE_INDEX(curp)) { -+ /* if we found index with free entry, then use that -+ * entry: create all needed subtree and add new leaf */ -+ err = ext3_ext_split(handle, tree, path, newext, i); -+ -+ /* refill path */ -+ ext3_ext_drop_refs(path); -+ path = ext3_ext_find_extent(tree, newext->e_block, path); -+ if (IS_ERR(path)) -+ err = PTR_ERR(path); -+ } else { -+ /* tree is full, time to grow in depth */ -+ err = ext3_ext_grow_indepth(handle, tree, path, newext); -+ -+ /* refill path */ -+ ext3_ext_drop_refs(path); -+ path = ext3_ext_find_extent(tree, newext->e_block, path); -+ if (IS_ERR(path)) -+ err = PTR_ERR(path); -+ -+ /* -+ * only first (depth 0 -> 1) produces free space -+ * in all other cases we have to split growed tree -+ */ -+ depth = EXT_DEPTH(tree); -+ if (path[depth].p_hdr->e_num == path[depth].p_hdr->e_max) { -+ /* now we need split */ -+ goto repeat; -+ } -+ } -+ -+ if (err) -+ return err; -+ -+ return 0; -+} -+ -+/* -+ * returns allocated block in subsequent extent or 0xffffffff -+ * NOTE: it consider block number from index entry as -+ * allocated block. thus, index entries have to be consistent -+ * with leafs -+ */ -+static unsigned long -+ext3_ext_next_allocated_block(struct ext3_ext_path *path) -+{ -+ int depth; -+ -+ EXT_ASSERT(path != NULL); -+ depth = path->p_depth; -+ -+ if (depth == 0 && path->p_ext == NULL) -+ return 0xffffffff; -+ -+ /* FIXME: what if index isn't full ?! */ -+ while (depth >= 0) { -+ if (depth == path->p_depth) { -+ /* leaf */ -+ if (path[depth].p_ext != -+ EXT_LAST_EXTENT(path[depth].p_hdr)) -+ return path[depth].p_ext[1].e_block; -+ } else { -+ /* index */ -+ if (path[depth].p_idx != -+ EXT_LAST_INDEX(path[depth].p_hdr)) -+ return path[depth].p_idx[1].e_block; -+ } -+ depth--; -+ } -+ -+ return 0xffffffff; -+} -+ -+/* -+ * returns first allocated block from next leaf or 0xffffffff -+ */ -+static unsigned ext3_ext_next_leaf_block(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ int depth; -+ -+ EXT_ASSERT(path != NULL); -+ depth = path->p_depth; -+ -+ /* zero-tree has no leaf blocks at all */ -+ if (depth == 0) -+ return 0xffffffff; -+ -+ /* go to index block */ -+ depth--; -+ -+ while (depth >= 0) { -+ if (path[depth].p_idx != -+ EXT_LAST_INDEX(path[depth].p_hdr)) -+ return path[depth].p_idx[1].e_block; -+ depth--; -+ } -+ -+ return 0xffffffff; -+} -+ -+/* -+ * if leaf gets modified and modified extent is first in the leaf -+ * then we have to correct all indexes above -+ * TODO: do we need to correct tree in all cases? -+ */ -+int ext3_ext_correct_indexes(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ struct ext3_extent_header *eh; -+ int depth = EXT_DEPTH(tree); -+ struct ext3_extent *ex; -+ unsigned long border; -+ int k, err = 0; -+ -+ eh = path[depth].p_hdr; -+ ex = path[depth].p_ext; -+ EXT_ASSERT(ex); -+ EXT_ASSERT(eh); -+ -+ if (depth == 0) { -+ /* there is no tree at all */ -+ return 0; -+ } -+ -+ if (ex != EXT_FIRST_EXTENT(eh)) { -+ /* we correct tree if first leaf got modified only */ -+ return 0; -+ } -+ -+ /* -+ * TODO: we need correction if border is smaller then current one -+ */ -+ k = depth - 1; -+ border = path[depth].p_ext->e_block; -+ if ((err = ext3_ext_get_access(handle, tree, path + k))) -+ return err; -+ path[k].p_idx->e_block = border; -+ if ((err = ext3_ext_dirty(handle, tree, path + k))) -+ return err; -+ -+ while (k--) { -+ /* change all left-side indexes */ -+ if (path[k+1].p_idx != EXT_FIRST_INDEX(path[k+1].p_hdr)) -+ break; -+ if ((err = ext3_ext_get_access(handle, tree, path + k))) -+ break; -+ path[k].p_idx->e_block = border; -+ if ((err = ext3_ext_dirty(handle, tree, path + k))) -+ break; -+ } -+ -+ return err; -+} -+ -+static int inline -+ext3_can_extents_be_merged(struct ext3_extents_tree *tree, -+ struct ext3_extent *ex1, -+ struct ext3_extent *ex2) -+{ -+ if (ex1->e_block + ex1->e_num != ex2->e_block) -+ return 0; -+ -+#ifdef AGRESSIVE_TEST -+ if (ex1->e_num >= 4) -+ return 0; -+#endif -+ -+ if (!tree->mergable) -+ return 1; -+ -+ return tree->mergable(ex1, ex2); -+} -+ -+/* -+ * this routine tries to merge requsted extent into the existing -+ * extent or inserts requested extent as new one into the tree, -+ * creating new leaf in no-space case -+ */ -+int ext3_ext_insert_extent(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newext) -+{ -+ struct ext3_extent_header * eh; -+ struct ext3_extent *ex, *fex; -+ struct ext3_extent *nearex; /* nearest extent */ -+ struct ext3_ext_path *npath = NULL; -+ int depth, len, err, next; -+ -+ depth = EXT_DEPTH(tree); -+ ex = path[depth].p_ext; -+ EXT_ASSERT(path[depth].p_hdr); -+ -+ /* try to insert block into found extent and return */ -+ if (ex && ext3_can_extents_be_merged(tree, ex, newext)) { -+ ext_debug(tree, "append %d block to %d:%d (from %d)\n", -+ newext->e_num, ex->e_block, ex->e_num, -+ ex->e_start); -+ if ((err = ext3_ext_get_access(handle, tree, path + depth))) -+ return err; -+ ex->e_num += newext->e_num; -+ eh = path[depth].p_hdr; -+ nearex = ex; -+ goto merge; -+ } -+ -+repeat: -+ depth = EXT_DEPTH(tree); -+ eh = path[depth].p_hdr; -+ if (eh->e_num < eh->e_max) -+ goto has_space; -+ -+ /* probably next leaf has space for us? */ -+ fex = EXT_LAST_EXTENT(eh); -+ next = ext3_ext_next_leaf_block(tree, path); -+ if (newext->e_block > fex->e_block && next != 0xffffffff) { -+ ext_debug(tree, "next leaf block - %d\n", next); -+ EXT_ASSERT(!npath); -+ npath = ext3_ext_find_extent(tree, next, NULL); -+ if (IS_ERR(npath)) -+ return PTR_ERR(npath); -+ EXT_ASSERT(npath->p_depth == path->p_depth); -+ eh = npath[depth].p_hdr; -+ if (eh->e_num < eh->e_max) { -+ ext_debug(tree, "next leaf isnt full(%d)\n", -+ eh->e_num); -+ path = npath; -+ goto repeat; -+ } -+ ext_debug(tree, "next leaf hasno free space(%d,%d)\n", -+ eh->e_num, eh->e_max); -+ } -+ -+ /* -+ * there is no free space in found leaf -+ * we're gonna add new leaf in the tree -+ */ -+ err = ext3_ext_create_new_leaf(handle, tree, path, newext); -+ if (err) -+ goto cleanup; -+ depth = EXT_DEPTH(tree); -+ eh = path[depth].p_hdr; -+ -+has_space: -+ nearex = path[depth].p_ext; -+ -+ if ((err = ext3_ext_get_access(handle, tree, path + depth))) -+ goto cleanup; -+ -+ if (!nearex) { -+ /* there is no extent in this leaf, create first one */ -+ ext_debug(tree, "first extent in the leaf: %d:%d:%d\n", -+ newext->e_block, newext->e_start, -+ newext->e_num); -+ path[depth].p_ext = EXT_FIRST_EXTENT(eh); -+ } else if (newext->e_block > nearex->e_block) { -+ EXT_ASSERT(newext->e_block != nearex->e_block); -+ if (nearex != EXT_LAST_EXTENT(eh)) { -+ len = EXT_MAX_EXTENT(eh) - nearex; -+ len = (len - 1) * sizeof(struct ext3_extent); -+ len = len < 0 ? 0 : len; -+ ext_debug(tree, "insert %d:%d:%d after: nearest 0x%p, " -+ "move %d from 0x%p to 0x%p\n", -+ newext->e_block, newext->e_start, -+ newext->e_num, -+ nearex, len, nearex + 1, nearex + 2); -+ memmove(nearex + 2, nearex + 1, len); -+ } -+ path[depth].p_ext = nearex + 1; -+ } else { -+ EXT_ASSERT(newext->e_block != nearex->e_block); -+ len = (EXT_MAX_EXTENT(eh) - nearex) * sizeof(struct ext3_extent); -+ len = len < 0 ? 0 : len; -+ ext_debug(tree, "insert %d:%d:%d before: nearest 0x%p, " -+ "move %d from 0x%p to 0x%p\n", -+ newext->e_block, newext->e_start, newext->e_num, -+ nearex, len, nearex + 1, nearex + 2); -+ memmove(nearex + 1, nearex, len); -+ path[depth].p_ext = nearex; -+ } -+ -+ eh->e_num++; -+ nearex = path[depth].p_ext; -+ nearex->e_block = newext->e_block; -+ nearex->e_start = newext->e_start; -+ nearex->e_num = newext->e_num; -+ -+merge: -+ /* try to merge extents to the right */ -+ while (nearex < EXT_LAST_EXTENT(eh)) { -+ if (!ext3_can_extents_be_merged(tree, nearex, nearex + 1)) -+ break; -+ /* merge with next extent! */ -+ nearex->e_num += nearex[1].e_num; -+ if (nearex + 1 < EXT_LAST_EXTENT(eh)) { -+ len = (EXT_LAST_EXTENT(eh) - nearex - 1) -+ * sizeof(struct ext3_extent); -+ memmove(nearex + 1, nearex + 2, len); -+ } -+ eh->e_num--; -+ EXT_ASSERT(eh->e_num > 0); -+ } -+ -+ /* try to merge extents to the left */ -+ -+ /* time to correct all indexes above */ -+ err = ext3_ext_correct_indexes(handle, tree, path); -+ if (err) -+ goto cleanup; -+ -+ err = ext3_ext_dirty(handle, tree, path + depth); -+ -+cleanup: -+ if (npath) { -+ ext3_ext_drop_refs(npath); -+ kfree(npath); -+ } -+ ext3_ext_tree_changed(tree); -+ return err; -+} -+ -+int ext3_ext_walk_space(struct ext3_extents_tree *tree, unsigned long block, -+ unsigned long num, ext_prepare_callback func) -+{ -+ struct ext3_ext_path *path = NULL; -+ struct ext3_extent *ex, cbex; -+ unsigned long next, start = 0, end = 0; -+ unsigned long last = block + num; -+ int depth, exists, err = 0; -+ -+ EXT_ASSERT(tree); -+ EXT_ASSERT(func); -+ EXT_ASSERT(tree->inode); -+ EXT_ASSERT(tree->root); -+ -+ while (block < last && block != 0xfffffffff) { -+ num = last - block; -+ /* find extent for this block */ -+ path = ext3_ext_find_extent(tree, block, path); -+ if (IS_ERR(path)) { -+ err = PTR_ERR(path); -+ path = NULL; -+ break; -+ } -+ -+ depth = EXT_DEPTH(tree); -+ EXT_ASSERT(path[depth].p_hdr); -+ ex = path[depth].p_ext; -+ next = ext3_ext_next_allocated_block(path); -+ -+ exists = 0; -+ if (!ex) { -+ /* there is no extent yet, so try to allocate -+ * all requested space */ -+ start = block; -+ end = block + num; -+ } else if (ex->e_block > block) { -+ /* need to allocate space before found extent */ -+ start = block; -+ end = ex->e_block; -+ if (block + num < end) -+ end = block + num; -+ } else if (block >= ex->e_block + ex->e_num) { -+ /* need to allocate space after found extent */ -+ start = block; -+ end = block + num; -+ if (end >= next) -+ end = next; -+ } else if (block >= ex->e_block) { -+ /* -+ * some part of requested space is covered -+ * by found extent -+ */ -+ start = block; -+ end = ex->e_block + ex->e_num; -+ if (block + num < end) -+ end = block + num; -+ exists = 1; -+ } else { -+ BUG(); -+ } -+ EXT_ASSERT(end > start); -+ -+ if (!exists) { -+ cbex.e_block = start; -+ cbex.e_num = end - start; -+ cbex.e_start = 0; -+ } else -+ cbex = *ex; -+ -+ EXT_ASSERT(path[depth].p_hdr); -+ err = func(tree, path, &cbex, exists); -+ ext3_ext_drop_refs(path); -+ -+ if (err < 0) -+ break; -+ if (err == EXT_REPEAT) -+ continue; -+ else if (err == EXT_BREAK) { -+ err = 0; -+ break; -+ } -+ -+ if (EXT_DEPTH(tree) != depth) { -+ /* depth was changed. we have to realloc path */ -+ kfree(path); -+ path = NULL; -+ } -+ -+ block = cbex.e_block + cbex.e_num; -+ } -+ -+ if (path) { -+ ext3_ext_drop_refs(path); -+ kfree(path); -+ } -+ -+ return err; -+} -+ -+static inline void -+ext3_ext_invalidate_cache(struct ext3_extents_tree *tree) -+{ -+ if (tree->cex) -+ tree->cex->e_num = 0; -+} -+ -+static inline void -+ext3_ext_put_in_cache(struct ext3_extents_tree *tree, struct ext3_extent *ex) -+{ -+ if (tree->cex) { -+ EXT_ASSERT(ex); -+ EXT_ASSERT(ex->e_num); -+ tree->cex->e_block = ex->e_block; -+ tree->cex->e_start = ex->e_start; -+ tree->cex->e_num = ex->e_num; -+ } -+} -+ -+/* -+ * this routine calculate boundaries of the gap requested block fits into -+ * and cache this gap -+ */ -+static inline void -+ext3_ext_put_gap_in_cache(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ unsigned long block) -+{ -+ int depth = EXT_DEPTH(tree); -+ struct ext3_extent *ex, gex; -+ -+ if (!tree->cex) -+ return; -+ -+ ex = path[depth].p_ext; -+ if (ex == NULL) { -+ /* there is no extent yet, so gap is [0;-] */ -+ gex.e_block = 0; -+ gex.e_num = 0xffffffff; -+ ext_debug(tree, "cache gap(whole file):"); -+ } else if (block < ex->e_block) { -+ gex.e_block = block; -+ gex.e_num = ex->e_block - block; -+ ext_debug(tree, "cache gap(before): %lu [%lu:%lu]", -+ (unsigned long) block, -+ (unsigned long) ex->e_block, -+ (unsigned long) ex->e_num); -+ } else if (block >= ex->e_block + ex->e_num) { -+ gex.e_block = ex->e_block + ex->e_num; -+ gex.e_num = ext3_ext_next_allocated_block(path); -+ ext_debug(tree, "cache gap(after): [%lu:%lu] %lu", -+ (unsigned long) ex->e_block, -+ (unsigned long) ex->e_num, -+ (unsigned long) block); -+ EXT_ASSERT(gex.e_num > gex.e_block); -+ gex.e_num = gex.e_num - gex.e_block; -+ } else { -+ BUG(); -+ } -+ -+ ext_debug(tree, " -> %lu:%lu\n", (unsigned long) gex.e_block, -+ (unsigned long) gex.e_num); -+ gex.e_start = 0xffffffff; -+ ext3_ext_put_in_cache(tree, &gex); -+} -+ -+static inline int -+ext3_ext_in_cache(struct ext3_extents_tree *tree, unsigned long block, -+ struct ext3_extent *ex) -+{ -+ struct ext3_extent *cex = tree->cex; -+ -+ /* is there cache storage at all? */ -+ if (!cex) -+ return 0; -+ -+ /* has cache valid data? */ -+ if (cex->e_num == 0) -+ return 0; -+ -+ if (block >= cex->e_block && block < cex->e_block + cex->e_num) { -+ ex->e_block = cex->e_block; -+ ex->e_start = cex->e_start; -+ ex->e_num = cex->e_num; -+ ext_debug(tree, "%lu cached by %lu:%lu:%lu\n", -+ (unsigned long) block, -+ (unsigned long) ex->e_block, -+ (unsigned long) ex->e_num, -+ (unsigned long) ex->e_start); -+ return 1; -+ } -+ -+ /* not in cache */ -+ return 0; -+} -+ -+/* -+ * routine removes index from the index block -+ * it's used in truncate case only. thus all requests are for -+ * last index in the block only -+ */ -+int ext3_ext_rm_idx(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ struct buffer_head *bh; -+ int err; -+ -+ /* free index block */ -+ path--; -+ EXT_ASSERT(path->p_hdr->e_num); -+ if ((err = ext3_ext_get_access(handle, tree, path))) -+ return err; -+ path->p_hdr->e_num--; -+ if ((err = ext3_ext_dirty(handle, tree, path))) -+ return err; -+ ext_debug(tree, "index is empty, remove it, free block %d\n", -+ path->p_idx->e_leaf); -+ bh = sb_get_hash_table(tree->inode->i_sb, path->p_idx->e_leaf); -+ ext3_forget(handle, 1, tree->inode, bh, path->p_idx->e_leaf); -+ ext3_free_blocks(handle, tree->inode, path->p_idx->e_leaf, 1); -+ return err; -+} -+ -+int ext3_ext_calc_credits_for_insert(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path) -+{ -+ int depth = EXT_DEPTH(tree); -+ int needed; -+ -+ if (path) { -+ /* probably there is space in leaf? */ -+ if (path[depth].p_hdr->e_num < path[depth].p_hdr->e_max) -+ return 1; -+ } -+ -+ /* -+ * the worste case we're expecting is creation of the -+ * new root (growing in depth) with index splitting -+ * for splitting we have to consider depth + 1 because -+ * previous growing could increase it -+ */ -+ depth = depth + 1; -+ -+ /* -+ * growing in depth: -+ * block allocation + new root + old root -+ */ -+ needed = EXT3_ALLOC_NEEDED + 2; -+ -+ /* index split. we may need: -+ * allocate intermediate indexes and new leaf -+ * change two blocks at each level, but root -+ * modify root block (inode) -+ */ -+ needed += (depth * EXT3_ALLOC_NEEDED) + (2 * depth) + 1; -+ -+ return needed; -+} -+ -+static int -+ext3_ext_split_for_rm(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, unsigned long start, -+ unsigned long end) -+{ -+ struct ext3_extent *ex, tex; -+ struct ext3_ext_path *npath; -+ int depth, creds, err; -+ -+ depth = EXT_DEPTH(tree); -+ ex = path[depth].p_ext; -+ EXT_ASSERT(ex); -+ EXT_ASSERT(end < ex->e_block + ex->e_num - 1); -+ EXT_ASSERT(ex->e_block < start); -+ -+ /* calculate tail extent */ -+ tex.e_block = end + 1; -+ EXT_ASSERT(tex.e_block < ex->e_block + ex->e_num); -+ tex.e_num = ex->e_block + ex->e_num - tex.e_block; -+ -+ creds = ext3_ext_calc_credits_for_insert(tree, path); -+ handle = ext3_ext_journal_restart(handle, creds); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ -+ /* calculate head extent. use primary extent */ -+ err = ext3_ext_get_access(handle, tree, path + depth); -+ if (err) -+ return err; -+ ex->e_num = start - ex->e_block; -+ err = ext3_ext_dirty(handle, tree, path + depth); -+ if (err) -+ return err; -+ -+ /* FIXME: some callback to free underlying resource -+ * and correct e_start? */ -+ ext_debug(tree, "split extent: head %u:%u, tail %u:%u\n", -+ ex->e_block, ex->e_num, tex.e_block, tex.e_num); -+ -+ npath = ext3_ext_find_extent(tree, ex->e_block, NULL); -+ if (IS_ERR(npath)) -+ return PTR_ERR(npath); -+ depth = EXT_DEPTH(tree); -+ EXT_ASSERT(npath[depth].p_ext->e_block == ex->e_block); -+ EXT_ASSERT(npath[depth].p_ext->e_num == ex->e_num); -+ -+ err = ext3_ext_insert_extent(handle, tree, npath, &tex); -+ ext3_ext_drop_refs(npath); -+ kfree(npath); -+ -+ return err; -+ -+} -+ -+static int -+ext3_ext_rm_leaf(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, unsigned long start, -+ unsigned long end) -+{ -+ struct ext3_extent *ex, *fu = NULL, *lu, *le; -+ int err = 0, correct_index = 0; -+ int depth = EXT_DEPTH(tree), credits; -+ struct ext3_extent_header *eh; -+ unsigned a, b, block, num; -+ -+ ext_debug(tree, "remove [%lu:%lu] in leaf\n", start, end); -+ if (!path[depth].p_hdr) -+ path[depth].p_hdr = EXT_BLOCK_HDR(path[depth].p_bh); -+ eh = path[depth].p_hdr; -+ EXT_ASSERT(eh); -+ EXT_ASSERT(eh->e_num <= eh->e_max); -+ EXT_ASSERT(eh->e_magic == EXT3_EXT_MAGIC); -+ -+ /* find where to start removing */ -+ le = ex = EXT_LAST_EXTENT(eh); -+ while (ex != EXT_FIRST_EXTENT(eh)) { -+ if (ex->e_block <= end) -+ break; -+ ex--; -+ } -+ -+ if (start > ex->e_block && end < ex->e_block + ex->e_num - 1) { -+ /* removal of internal part of the extent requested -+ * tail and head must be placed in different extent -+ * so, we have to insert one more extent */ -+ path[depth].p_ext = ex; -+ return ext3_ext_split_for_rm(handle, tree, path, start, end); -+ } -+ -+ lu = ex; -+ while (ex >= EXT_FIRST_EXTENT(eh) && -+ ex->e_block + ex->e_num > start) { -+ ext_debug(tree, "remove ext %u:%u\n", ex->e_block, ex->e_num); -+ path[depth].p_ext = ex; -+ -+ a = ex->e_block > start ? ex->e_block : start; -+ b = ex->e_block + ex->e_num - 1 < end ? -+ ex->e_block + ex->e_num - 1 : end; -+ -+ ext_debug(tree, " border %u:%u\n", a, b); -+ -+ if (a != ex->e_block && b != ex->e_block + ex->e_num - 1) { -+ block = 0; -+ num = 0; -+ BUG(); -+ } else if (a != ex->e_block) { -+ /* remove tail of the extent */ -+ block = ex->e_block; -+ num = a - block; -+ } else if (b != ex->e_block + ex->e_num - 1) { -+ /* remove head of the extent */ -+ block = a; -+ num = b - a; -+ } else { -+ /* remove whole extent: excelent! */ -+ block = ex->e_block; -+ num = 0; -+ EXT_ASSERT(a == ex->e_block && -+ b == ex->e_block + ex->e_num - 1); -+ } -+ -+ if (ex == EXT_FIRST_EXTENT(eh)) -+ correct_index = 1; -+ -+ credits = 1; -+ if (correct_index) -+ credits += (EXT_DEPTH(tree) * EXT3_ALLOC_NEEDED) + 1; -+ if (tree->remove_extent_credits) -+ credits += tree->remove_extent_credits(tree, ex, a, b); -+ -+ handle = ext3_ext_journal_restart(handle, credits); -+ if (IS_ERR(handle)) { -+ err = PTR_ERR(handle); -+ goto out; -+ } -+ -+ err = ext3_ext_get_access(handle, tree, path + depth); -+ if (err) -+ goto out; -+ -+ if (tree->remove_extent) -+ err = tree->remove_extent(tree, ex, a, b); -+ if (err) -+ goto out; -+ -+ if (num == 0) { -+ /* this extent is removed entirely mark slot unused */ -+ ex->e_start = 0; -+ eh->e_num--; -+ fu = ex; -+ } -+ -+ ex->e_block = block; -+ ex->e_num = num; -+ -+ err = ext3_ext_dirty(handle, tree, path + depth); -+ if (err) -+ goto out; -+ -+ ext_debug(tree, "new extent: %u:%u:%u\n", -+ ex->e_block, ex->e_num, ex->e_start); -+ ex--; -+ } -+ -+ if (fu) { -+ /* reuse unused slots */ -+ while (lu < le) { -+ if (lu->e_start) { -+ *fu = *lu; -+ lu->e_start = 0; -+ fu++; -+ } -+ lu++; -+ } -+ } -+ -+ if (correct_index && eh->e_num) -+ err = ext3_ext_correct_indexes(handle, tree, path); -+ -+ /* if this leaf is free, then we should -+ * remove it from index block above */ -+ if (err == 0 && eh->e_num == 0 && path[depth].p_bh != NULL) -+ err = ext3_ext_rm_idx(handle, tree, path + depth); -+ -+out: -+ return err; -+} -+ -+ -+static struct ext3_extent_idx * -+ext3_ext_last_covered(struct ext3_extent_header *hdr, unsigned long block) -+{ -+ struct ext3_extent_idx *ix; -+ -+ ix = EXT_LAST_INDEX(hdr); -+ while (ix != EXT_FIRST_INDEX(hdr)) { -+ if (ix->e_block <= block) -+ break; -+ ix--; -+ } -+ return ix; -+} -+ -+/* -+ * returns 1 if current index have to be freed (even partial) -+ */ -+static int inline -+ext3_ext_more_to_rm(struct ext3_ext_path *path) -+{ -+ EXT_ASSERT(path->p_idx); -+ -+ if (path->p_idx < EXT_FIRST_INDEX(path->p_hdr)) -+ return 0; -+ -+ /* -+ * if truncate on deeper level happened it it wasn't partial -+ * so we have to consider current index for truncation -+ */ -+ if (path->p_hdr->e_num == path->p_block) -+ return 0; -+ return 1; -+} -+ -+int ext3_ext_remove_space(struct ext3_extents_tree *tree, -+ unsigned long start, unsigned long end) -+{ -+ struct inode *inode = tree->inode; -+ struct super_block *sb = inode->i_sb; -+ int depth = EXT_DEPTH(tree); -+ struct ext3_ext_path *path; -+ handle_t *handle; -+ int i = 0, err = 0; -+ -+ ext_debug(tree, "space to be removed: %lu:%lu\n", start, end); -+ -+ /* probably first extent we're gonna free will be last in block */ -+ handle = ext3_journal_start(inode, depth + 1); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ -+ ext3_ext_invalidate_cache(tree); -+ -+ /* -+ * we start scanning from right side freeing all the blocks -+ * after i_size and walking into the deep -+ */ -+ path = kmalloc(sizeof(struct ext3_ext_path) * (depth + 1), GFP_KERNEL); -+ if (IS_ERR(path)) { -+ ext3_error(sb, "ext3_ext_remove_space", -+ "Can't allocate path array"); -+ ext3_journal_stop(handle, inode); -+ return -ENOMEM; -+ } -+ memset(path, 0, sizeof(struct ext3_ext_path) * (depth + 1)); -+ path[i].p_hdr = EXT_ROOT_HDR(tree); -+ -+ while (i >= 0 && err == 0) { -+ if (i == depth) { -+ /* this is leaf block */ -+ err = ext3_ext_rm_leaf(handle, tree, path, start, end); -+ /* root level have p_bh == NULL, brelse() eats this */ -+ brelse(path[i].p_bh); -+ i--; -+ continue; -+ } -+ -+ /* this is index block */ -+ if (!path[i].p_hdr) { -+ ext_debug(tree, "initialize header\n"); -+ path[i].p_hdr = EXT_BLOCK_HDR(path[i].p_bh); -+ } -+ -+ EXT_ASSERT(path[i].p_hdr->e_num <= path[i].p_hdr->e_max); -+ EXT_ASSERT(path[i].p_hdr->e_magic == EXT3_EXT_MAGIC); -+ -+ if (!path[i].p_idx) { -+ /* this level hasn't touched yet */ -+ path[i].p_idx = -+ ext3_ext_last_covered(path[i].p_hdr, end); -+ path[i].p_block = path[i].p_hdr->e_num + 1; -+ ext_debug(tree, "init index ptr: hdr 0x%p, num %d\n", -+ path[i].p_hdr, path[i].p_hdr->e_num); -+ } else { -+ /* we've already was here, see at next index */ -+ path[i].p_idx--; -+ } -+ -+ ext_debug(tree, "level %d - index, first 0x%p, cur 0x%p\n", -+ i, EXT_FIRST_INDEX(path[i].p_hdr), -+ path[i].p_idx); -+ if (ext3_ext_more_to_rm(path + i)) { -+ /* go to the next level */ -+ ext_debug(tree, "move to level %d (block %d)\n", -+ i + 1, path[i].p_idx->e_leaf); -+ memset(path + i + 1, 0, sizeof(*path)); -+ path[i+1].p_bh = sb_bread(sb, path[i].p_idx->e_leaf); -+ if (!path[i+1].p_bh) { -+ /* should we reset i_size? */ -+ err = -EIO; -+ break; -+ } -+ /* put actual number of indexes to know is this -+ * number got changed at the next iteration */ -+ path[i].p_block = path[i].p_hdr->e_num; -+ i++; -+ } else { -+ /* we finish processing this index, go up */ -+ if (path[i].p_hdr->e_num == 0 && i > 0) { -+ /* index is empty, remove it -+ * handle must be already prepared by the -+ * truncate_leaf() */ -+ err = ext3_ext_rm_idx(handle, tree, path + i); -+ } -+ /* root level have p_bh == NULL, brelse() eats this */ -+ brelse(path[i].p_bh); -+ i--; -+ ext_debug(tree, "return to level %d\n", i); -+ } -+ } -+ -+ /* TODO: flexible tree reduction should be here */ -+ if (path->p_hdr->e_num == 0) { -+ /* -+ * truncate to zero freed all the tree -+ * so, we need to correct e_depth -+ */ -+ err = ext3_ext_get_access(handle, tree, path); -+ if (err == 0) { -+ EXT_ROOT_HDR(tree)->e_depth = 0; -+ err = ext3_ext_dirty(handle, tree, path); -+ } -+ } -+ ext3_ext_tree_changed(tree); -+ -+ kfree(path); -+ ext3_journal_stop(handle, inode); -+ -+ return err; -+} -+ -+/* -+ * called at mount time -+ */ -+void ext3_ext_init(struct super_block *sb) -+{ -+ /* -+ * possible initialization would be here -+ */ -+ -+ if (test_opt(sb, EXTENTS)) { -+ printk("EXT3-fs: file extents enabled"); -+#ifdef AGRESSIVE_TEST -+ printk(", agressive tests"); -+#endif -+#ifdef CHECK_BINSEARCH -+ printk(", check binsearch"); -+#endif -+ printk("\n"); -+ } -+} -+ -+/* -+ * called at umount time -+ */ -+void ext3_ext_release(struct super_block *sb) -+{ -+} -+ -+/************************************************************************ -+ * VFS related routines -+ ************************************************************************/ -+ -+static int ext3_get_inode_write_access(handle_t *handle, void *buffer) -+{ -+ /* we use in-core data, not bh */ -+ return 0; -+} -+ -+static int ext3_mark_buffer_dirty(handle_t *handle, void *buffer) -+{ -+ struct inode *inode = buffer; -+ return ext3_mark_inode_dirty(handle, inode); -+} -+ -+static int ext3_ext_mergable(struct ext3_extent *ex1, -+ struct ext3_extent *ex2) -+{ -+ if (ex1->e_start + ex1->e_num == ex2->e_start) -+ return 1; -+ return 0; -+} -+ -+static int -+ext3_remove_blocks_credits(struct ext3_extents_tree *tree, -+ struct ext3_extent *ex, -+ unsigned long from, unsigned long to) -+{ -+ int needed; -+ -+ /* at present, extent can't cross block group */; -+ needed = 3; /* bitmap + group desc + sb */ -+ -+#ifdef CONFIG_QUOTA -+ needed += 2 * EXT3_SINGLEDATA_TRANS_BLOCKS; -+#endif -+ return needed; -+} -+ -+static int -+ext3_remove_blocks(struct ext3_extents_tree *tree, -+ struct ext3_extent *ex, -+ unsigned long from, unsigned long to) -+{ -+ int needed = ext3_remove_blocks_credits(tree, ex, from, to); -+ handle_t *handle = ext3_journal_start(tree->inode, needed); -+ struct buffer_head *bh; -+ int i; -+ -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ if (from >= ex->e_block && to == ex->e_block + ex->e_num - 1) { -+ /* tail removal */ -+ unsigned long num, start; -+ num = ex->e_block + ex->e_num - from; -+ start = ex->e_start + ex->e_num - num; -+ ext_debug(tree, "free last %lu blocks starting %lu\n", -+ num, start); -+ for (i = 0; i < num; i++) { -+ bh = sb_get_hash_table(tree->inode->i_sb, start + i); -+ ext3_forget(handle, 0, tree->inode, bh, start + i); -+ } -+ ext3_free_blocks(handle, tree->inode, start, num); -+ } else if (from == ex->e_block && to <= ex->e_block + ex->e_num - 1) { -+ printk("strange request: removal %lu-%lu from %u:%u\n", -+ from, to, ex->e_block, ex->e_num); -+ } else { -+ printk("strange request: removal(2) %lu-%lu from %u:%u\n", -+ from, to, ex->e_block, ex->e_num); -+ } -+ ext3_journal_stop(handle, tree->inode); -+ return 0; -+} -+ -+static int ext3_ext_find_goal(struct inode *inode, struct ext3_ext_path *path, -+ unsigned long block) -+{ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ unsigned long bg_start; -+ unsigned long colour; -+ int depth; -+ -+ if (path) { -+ struct ext3_extent *ex; -+ depth = path->p_depth; -+ -+ /* try to predict block placement */ -+ if ((ex = path[depth].p_ext)) -+ return ex->e_start + (block - ex->e_block); -+ -+ /* it looks index is empty -+ * try to find starting from index itself */ -+ if (path[depth].p_bh) -+ return path[depth].p_bh->b_blocknr; -+ } -+ -+ /* OK. use inode's group */ -+ bg_start = (ei->i_block_group * EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + -+ le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); -+ colour = (current->pid % 16) * -+ (EXT3_BLOCKS_PER_GROUP(inode->i_sb) / 16); -+ return bg_start + colour + block; -+} -+ -+static int ext3_new_block_cb(handle_t *handle, struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *ex, int *err) -+{ -+ struct inode *inode = tree->inode; -+ int newblock, goal; -+ -+ EXT_ASSERT(path); -+ EXT_ASSERT(ex); -+ EXT_ASSERT(ex->e_start); -+ EXT_ASSERT(ex->e_num); -+ -+ /* reuse block from the extent to order data/metadata */ -+ newblock = ex->e_start++; -+ ex->e_num--; -+ if (ex->e_num == 0) { -+ ex->e_num = 1; -+ /* allocate new block for the extent */ -+ goal = ext3_ext_find_goal(inode, path, ex->e_block); -+ ex->e_start = ext3_new_block(handle, inode, goal, 0, 0, err); -+ if (ex->e_start == 0) { -+ /* error occured: restore old extent */ -+ ex->e_start = newblock; -+ return 0; -+ } -+ } -+ return newblock; -+} -+ -+static void ext3_init_tree_desc(struct ext3_extents_tree *tree, -+ struct inode *inode) -+{ -+ tree->inode = inode; -+ tree->root = (void *) EXT3_I(inode)->i_data; -+ tree->get_write_access = ext3_get_inode_write_access; -+ tree->mark_buffer_dirty = ext3_mark_buffer_dirty; -+ tree->mergable = ext3_ext_mergable; -+ tree->new_block = ext3_new_block_cb; -+ tree->remove_extent = ext3_remove_blocks; -+ tree->remove_extent_credits = ext3_remove_blocks_credits; -+ tree->buffer = (void *) inode; -+ tree->buffer_len = sizeof(EXT3_I(inode)->i_data); -+ tree->cex = (struct ext3_extent *) &EXT3_I(inode)->i_cached_extent; -+} -+ -+#if EXT3_MULTIBLOCK_ALLOCATOR -+static int -+ext3_ext_new_extent_cb(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newex, int exist) -+{ -+ struct inode *inode = tree->inode; -+ struct buffer_head *bh; -+ int count, err, goal; -+ unsigned long pblock; -+ unsigned long tgen; -+ loff_t new_i_size; -+ handle_t *handle; -+ int i; -+ -+ if (exist) -+ return EXT_CONTINUE; -+ -+ tgen = EXT_GENERATION(tree); -+ count = ext3_ext_calc_credits_for_insert(tree, path); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ -+ handle = ext3_journal_start(inode, count + EXT3_ALLOC_NEEDED + 1); -+ if (IS_ERR(handle)) { -+ down_write(&EXT3_I(inode)->truncate_sem); -+ return PTR_ERR(handle); -+ } -+ -+ if (tgen != EXT_GENERATION(tree)) { -+ /* the tree has changed. so path can be invalid at moment */ -+ ext3_journal_stop(handle, inode); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ return EXT_REPEAT; -+ } -+ -+ down_write(&EXT3_I(inode)->truncate_sem); -+ goal = ext3_ext_find_goal(inode, path, newex->e_block); -+ count = newex->e_num; -+ pblock = ext3_new_blocks(handle, inode, &count, goal, &err); -+ if (!pblock) -+ goto out; -+ EXT_ASSERT(count <= newex->e_num); -+ -+ /* insert new extent */ -+ newex->e_start = pblock; -+ newex->e_num = count; -+ err = ext3_ext_insert_extent(handle, tree, path, newex); -+ if (err) -+ goto out; -+ -+ /* block have been allocated for data, so time to drop dirty -+ * in correspondend buffer_heads to prevent corruptions */ -+ for (i = 0; i < newex->e_num; i++) { -+ bh = sb_get_hash_table(inode->i_sb, newex->e_start + i); -+ if (bh) { -+ mark_buffer_clean(bh); -+ wait_on_buffer(bh); -+ clear_bit(BH_Req, &bh->b_state); -+ __brelse(bh); -+ } -+ } -+ -+ /* correct on-disk inode size */ -+ if (newex->e_num > 0) { -+ new_i_size = (loff_t) newex->e_block + newex->e_num; -+ new_i_size = new_i_size << inode->i_blkbits; -+ if (new_i_size > EXT3_I(inode)->i_disksize) { -+ EXT3_I(inode)->i_disksize = new_i_size; -+ err = ext3_mark_inode_dirty(handle, inode); -+ } -+ } -+ -+out: -+ ext3_journal_stop(handle, inode); -+ return err; -+} -+ -+ -+int ext3_ext_allocate_nblocks(struct inode *inode, unsigned long block, -+ unsigned long num) -+{ -+ struct ext3_extents_tree tree; -+ int err; -+ -+ ext3_init_tree_desc(&tree, inode); -+ ext_debug(&tree, "blocks %lu-%lu requested for inode %u\n", -+ block, block + num,(unsigned) inode->i_ino); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ err = ext3_ext_walk_space(&tree, block, num, ext3_ext_new_extent_cb); -+ ext3_ext_invalidate_cache(&tree); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ -+ return err; -+} -+#endif -+ -+int ext3_ext_get_block(handle_t *handle, struct inode *inode, -+ long iblock, struct buffer_head *bh_result, int create) -+{ -+ struct ext3_ext_path *path = NULL; -+ struct ext3_extent newex; -+ struct ext3_extent *ex; -+ int goal, newblock, err = 0, depth; -+ struct ext3_extents_tree tree; -+ -+ clear_bit(BH_New, &bh_result->b_state); -+ ext3_init_tree_desc(&tree, inode); -+ ext_debug(&tree, "block %d requested for inode %u\n", -+ (int) iblock, (unsigned) inode->i_ino); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ -+ /* check in cache */ -+ if (ext3_ext_in_cache(&tree, iblock, &newex)) { -+ if (newex.e_start == 0xffffffff && !create) { -+ /* block isn't allocated yet and -+ * user don't want to allocate it */ -+ goto out2; -+ } else if (newex.e_start) { -+ /* block is already allocated */ -+ newblock = iblock - newex.e_block + newex.e_start; -+ goto out; -+ } -+ } -+ -+ /* find extent for this block */ -+ path = ext3_ext_find_extent(&tree, iblock, NULL); -+ if (IS_ERR(path)) { -+ err = PTR_ERR(path); -+ path = NULL; -+ goto out2; -+ } -+ -+ depth = EXT_DEPTH(&tree); -+ -+ /* -+ * consistent leaf must not be empty -+ * this situations is possible, though, _during_ tree modification -+ * this is why assert can't be put in ext3_ext_find_extent() -+ */ -+ EXT_ASSERT(path[depth].p_ext != NULL || depth == 0); -+ -+ if ((ex = path[depth].p_ext)) { -+ /* if found exent covers block, simple return it */ -+ if (iblock >= ex->e_block && iblock < ex->e_block + ex->e_num) { -+ newblock = iblock - ex->e_block + ex->e_start; -+ ext_debug(&tree, "%d fit into %d:%d -> %d\n", -+ (int) iblock, ex->e_block, ex->e_num, -+ newblock); -+ ext3_ext_put_in_cache(&tree, ex); -+ goto out; -+ } -+ } -+ -+ /* -+ * requested block isn't allocated yet -+ * we couldn't try to create block if create flag is zero -+ */ -+ if (!create) { -+ /* put just found gap into cache to speedup subsequest reqs */ -+ ext3_ext_put_gap_in_cache(&tree, path, iblock); -+ goto out2; -+ } -+ -+ /* allocate new block */ -+ goal = ext3_ext_find_goal(inode, path, iblock); -+ newblock = ext3_new_block(handle, inode, goal, 0, 0, &err); -+ if (!newblock) -+ goto out2; -+ ext_debug(&tree, "allocate new block: goal %d, found %d\n", -+ goal, newblock); -+ -+ /* try to insert new extent into found leaf and return */ -+ newex.e_block = iblock; -+ newex.e_start = newblock; -+ newex.e_num = 1; -+ err = ext3_ext_insert_extent(handle, &tree, path, &newex); -+ if (err) -+ goto out2; -+ -+ if (inode->i_size > EXT3_I(inode)->i_disksize) -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ -+ /* previous routine could use block we allocated */ -+ newblock = newex.e_start; -+ set_bit(BH_New, &bh_result->b_state); -+ -+ ext3_ext_put_in_cache(&tree, &newex); -+out: -+ ext3_ext_show_leaf(&tree, path); -+ set_bit(BH_Mapped, &bh_result->b_state); -+ bh_result->b_dev = inode->i_sb->s_dev; -+ bh_result->b_blocknr = newblock; -+out2: -+ if (path) { -+ ext3_ext_drop_refs(path); -+ kfree(path); -+ } -+ up_write(&EXT3_I(inode)->truncate_sem); -+ -+ return err; -+} -+ -+void ext3_ext_truncate(struct inode * inode) -+{ -+ struct address_space *mapping = inode->i_mapping; -+ struct super_block *sb = inode->i_sb; -+ struct ext3_extents_tree tree; -+ unsigned long last_block; -+ handle_t *handle; -+ int err = 0; -+ -+ ext3_init_tree_desc(&tree, inode); -+ -+ /* -+ * probably first extent we're gonna free will be last in block -+ */ -+ err = ext3_writepage_trans_blocks(inode) + 3; -+ handle = ext3_journal_start(inode, err); -+ if (IS_ERR(handle)) -+ return; -+ -+ ext3_block_truncate_page(handle, mapping, inode->i_size); -+ -+ down_write(&EXT3_I(inode)->truncate_sem); -+ ext3_ext_invalidate_cache(&tree); -+ -+ /* -+ * TODO: optimization is possible here -+ * probably we need not scaning at all, -+ * because page truncation is enough -+ */ -+ if (ext3_orphan_add(handle, inode)) -+ goto out_stop; -+ -+ /* we have to know where to truncate from in crash case */ -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_mark_inode_dirty(handle, inode); -+ -+ last_block = (inode->i_size + sb->s_blocksize - 1) -+ >> EXT3_BLOCK_SIZE_BITS(sb); -+ err = ext3_ext_remove_space(&tree, last_block, 0xffffffff); -+ -+ /* In a multi-transaction truncate, we only make the final -+ * transaction synchronous */ -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ -+out_stop: -+ /* -+ * If this was a simple ftruncate(), and the file will remain alive -+ * then we need to clear up the orphan record which we created above. -+ * However, if this was a real unlink then we were called by -+ * ext3_delete_inode(), and we allow that function to clean up the -+ * orphan info for us. -+ */ -+ if (inode->i_nlink) -+ ext3_orphan_del(handle, inode); -+ -+ up_write(&EXT3_I(inode)->truncate_sem); -+ ext3_journal_stop(handle, inode); -+} -+ -+/* -+ * this routine calculate max number of blocks we could modify -+ * in order to allocate new block for an inode -+ */ -+int ext3_ext_writepage_trans_blocks(struct inode *inode, int num) -+{ -+ struct ext3_extents_tree tree; -+ int needed; -+ -+ ext3_init_tree_desc(&tree, inode); -+ -+ needed = ext3_ext_calc_credits_for_insert(&tree, NULL); -+ -+ /* caller want to allocate num blocks */ -+ needed *= num; -+ -+#ifdef CONFIG_QUOTA -+ /* -+ * FIXME: real calculation should be here -+ * it depends on blockmap format of qouta file -+ */ -+ needed += 2 * EXT3_SINGLEDATA_TRANS_BLOCKS; -+#endif -+ -+ return needed; -+} -+ -+void ext3_extents_initialize_blockmap(handle_t *handle, struct inode *inode) -+{ -+ struct ext3_extents_tree tree; -+ -+ ext3_init_tree_desc(&tree, inode); -+ ext3_extent_tree_init(handle, &tree); -+} -+ -+static int -+ext3_ext_store_extent_cb(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *newex, int exist) -+{ -+ struct ext3_extent_buf *buf = (struct ext3_extent_buf *) tree->private; -+ -+ if (!exist) -+ return EXT_CONTINUE; -+ if (buf->err < 0) -+ return EXT_BREAK; -+ if (buf->cur - buf->buffer + sizeof(*newex) > buf->buflen) -+ return EXT_BREAK; -+ -+ if (!copy_to_user(buf->cur, newex, sizeof(*newex))) { -+ buf->err++; -+ buf->cur += sizeof(*newex); -+ } else { -+ buf->err = -EFAULT; -+ return EXT_BREAK; -+ } -+ return EXT_CONTINUE; -+} -+ -+static int -+ext3_ext_collect_stats_cb(struct ext3_extents_tree *tree, -+ struct ext3_ext_path *path, -+ struct ext3_extent *ex, int exist) -+{ -+ struct ext3_extent_tree_stats *buf = -+ (struct ext3_extent_tree_stats *) tree->private; -+ int depth; -+ -+ if (!exist) -+ return EXT_CONTINUE; -+ -+ depth = EXT_DEPTH(tree); -+ buf->extents_num++; -+ if (path[depth].p_ext == EXT_FIRST_EXTENT(path[depth].p_hdr)) -+ buf->leaf_num++; -+ return EXT_CONTINUE; -+} -+ -+int ext3_ext_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, -+ unsigned long arg) -+{ -+ int err = 0; -+ -+ if (!(EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL)) -+ return -EINVAL; -+ -+ if (cmd == EXT3_IOC_GET_EXTENTS) { -+ struct ext3_extent_buf buf; -+ struct ext3_extents_tree tree; -+ -+ if (copy_from_user(&buf, (void *) arg, sizeof(buf))) -+ return -EFAULT; -+ -+ ext3_init_tree_desc(&tree, inode); -+ buf.cur = buf.buffer; -+ buf.err = 0; -+ tree.private = &buf; -+ down_write(&EXT3_I(inode)->truncate_sem); -+ err = ext3_ext_walk_space(&tree, buf.start, 0xffffffff, -+ ext3_ext_store_extent_cb); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ if (err == 0) -+ err = buf.err; -+ } else if (cmd == EXT3_IOC_GET_TREE_STATS) { -+ struct ext3_extent_tree_stats buf; -+ struct ext3_extents_tree tree; -+ -+ ext3_init_tree_desc(&tree, inode); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ buf.depth = EXT_DEPTH(&tree); -+ buf.extents_num = 0; -+ buf.leaf_num = 0; -+ tree.private = &buf; -+ err = ext3_ext_walk_space(&tree, 0, 0xffffffff, -+ ext3_ext_collect_stats_cb); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ if (!err) -+ err = copy_to_user((void *) arg, &buf, sizeof(buf)); -+ } else if (cmd == EXT3_IOC_GET_TREE_DEPTH) { -+ struct ext3_extents_tree tree; -+ ext3_init_tree_desc(&tree, inode); -+ down_write(&EXT3_I(inode)->truncate_sem); -+ err = EXT_DEPTH(&tree); -+ up_write(&EXT3_I(inode)->truncate_sem); -+ } -+ -+ return err; -+} -+ -+EXPORT_SYMBOL(ext3_init_tree_desc); -+EXPORT_SYMBOL(ext3_mark_inode_dirty); -+EXPORT_SYMBOL(ext3_ext_invalidate_cache); -+EXPORT_SYMBOL(ext3_ext_insert_extent); -+EXPORT_SYMBOL(ext3_ext_walk_space); -+EXPORT_SYMBOL(ext3_ext_find_goal); -+EXPORT_SYMBOL(ext3_ext_calc_credits_for_insert); -+ -Index: linux-2.4.20-8/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/ialloc.c 2004-04-14 18:42:03.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/ialloc.c 2004-04-14 19:49:07.000000000 +0800 -@@ -593,10 +593,13 @@ - iloc.bh = NULL; - goto fail; - } -+ if (test_opt(sb, EXTENTS)) { -+ EXT3_I(inode)->i_flags |= EXT3_EXTENTS_FL; -+ ext3_extents_initialize_blockmap(handle, inode); -+ } -+ - err = ext3_mark_iloc_dirty(handle, inode, &iloc); - if (err) goto fail; -- -- - - unlock_super (sb); - if(DQUOT_ALLOC_INODE(inode)) { -Index: linux-2.4.20-8/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/inode.c 2004-04-14 18:42:03.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/inode.c 2004-04-14 19:47:13.000000000 +0800 -@@ -848,6 +848,15 @@ - goto reread; - } - -+static inline int -+ext3_get_block_wrap(handle_t *handle, struct inode *inode, long block, -+ struct buffer_head *bh, int create) -+{ -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_get_block(handle, inode, block, bh, create); -+ return ext3_get_block_handle(handle, inode, block, bh, create); -+} -+ - /* - * The BKL is not held on entry here. - */ -@@ -861,7 +870,7 @@ - handle = ext3_journal_current_handle(); - J_ASSERT(handle != 0); - } -- ret = ext3_get_block_handle(handle, inode, iblock, bh_result, create); -+ ret = ext3_get_block_wrap(handle, inode, iblock, bh_result, create); - return ret; - } - -@@ -879,7 +888,7 @@ - dummy.b_state = 0; - dummy.b_blocknr = -1000; - buffer_trace_init(&dummy.b_history); -- *errp = ext3_get_block_handle(handle, inode, block, &dummy, create); -+ *errp = ext3_get_block_wrap(handle, inode, block, &dummy, create); - if (!*errp && buffer_mapped(&dummy)) { - struct buffer_head *bh; - bh = sb_getblk(inode->i_sb, dummy.b_blocknr); -@@ -1403,7 +1412,7 @@ - * This required during truncate. We need to physically zero the tail end - * of that block so it doesn't yield old data if the file is later grown. - */ --static int ext3_block_truncate_page(handle_t *handle, -+int ext3_block_truncate_page(handle_t *handle, - struct address_space *mapping, loff_t from) - { - unsigned long index = from >> PAGE_CACHE_SHIFT; -@@ -1888,6 +1897,9 @@ - - ext3_discard_prealloc(inode); - -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_truncate(inode); -+ - handle = start_transaction(inode); - if (IS_ERR(handle)) - return; /* AKPM: return what? */ -@@ -2537,6 +2549,9 @@ - int indirects = (EXT3_NDIR_BLOCKS % bpp) ? 5 : 3; - int ret; - -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_writepage_trans_blocks(inode, bpp); -+ - if (ext3_should_journal_data(inode)) - ret = 3 * (bpp + indirects) + 2; - else -@@ -2973,7 +2988,7 @@ - - /* alloc blocks one by one */ - for (i = 0; i < nblocks; i++) { -- ret = ext3_get_block_handle(handle, inode, blocks[i], -+ ret = ext3_get_block_wrap(handle, inode, blocks[i], - &bh_tmp, 1); - if (ret) - break; -@@ -3049,7 +3064,7 @@ - if (blocks[i] != 0) - continue; - -- rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1); -+ rc = ext3_get_block_wrap(handle, inode, iblock, &bh, 1); - if (rc) { - printk(KERN_INFO "ext3_map_inode_page: error %d " - "allocating block %ld\n", rc, iblock); -Index: linux-2.4.20-8/fs/ext3/Makefile -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/Makefile 2004-04-14 18:42:03.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/Makefile 2004-04-14 19:47:13.000000000 +0800 -@@ -13,7 +13,9 @@ - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ -- xattr_trusted.o -+ xattr_trusted.o extents.o -+export-objs += extents.o -+ - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.20-8/fs/ext3/super.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/super.c 2004-04-14 18:42:03.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/super.c 2004-04-14 19:47:13.000000000 +0800 -@@ -623,6 +623,7 @@ - int i; - - J_ASSERT(sbi->s_delete_inodes == 0); -+ ext3_ext_release(sb); - ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { -@@ -796,6 +797,10 @@ - return 0; - } - } -+ else if (!strcmp (this_char, "extents")) -+ set_opt (*mount_options, EXTENTS); -+ else if (!strcmp (this_char, "extdebug")) -+ set_opt (*mount_options, EXTDEBUG); - else if (!strcmp (this_char, "grpid") || - !strcmp (this_char, "bsdgroups")) - set_opt (*mount_options, GRPID); -@@ -1486,6 +1491,8 @@ - test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": - "writeback"); - -+ ext3_ext_init(sb); -+ - return sb; - - failed_mount3: -Index: linux-2.4.20-8/fs/ext3/ioctl.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/ioctl.c 2004-04-14 18:42:01.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/ioctl.c 2004-04-14 19:47:13.000000000 +0800 -@@ -189,6 +189,10 @@ - return ret; - } - #endif -+ case EXT3_IOC_GET_EXTENTS: -+ case EXT3_IOC_GET_TREE_STATS: -+ case EXT3_IOC_GET_TREE_DEPTH: -+ return ext3_ext_ioctl(inode, filp, cmd, arg); - default: - return -ENOTTY; - } -Index: linux-2.4.20-8/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_fs.h 2004-04-14 18:42:03.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_fs.h 2004-04-14 19:47:13.000000000 +0800 -@@ -184,6 +184,7 @@ - #define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */ - #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ - #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ -+#define EXT3_EXTENTS_FL 0x00080000 /* Inode uses extents */ - - #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ - #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ -@@ -208,6 +209,9 @@ - #ifdef CONFIG_JBD_DEBUG - #define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) - #endif -+#define EXT3_IOC_GET_EXTENTS _IOR('f', 5, long) -+#define EXT3_IOC_GET_TREE_DEPTH _IOR('f', 6, long) -+#define EXT3_IOC_GET_TREE_STATS _IOR('f', 7, long) - - /* - * Structure of an inode on the disk -@@ -327,6 +331,8 @@ - #define EXT3_MOUNT_IOPEN 0x8000 /* Allow access via iopen */ - #define EXT3_MOUNT_IOPEN_NOPRIV 0x10000 /* Make iopen world-readable */ - #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ -+#define EXT3_MOUNT_EXTENTS 0x100000/* Extents support */ -+#define EXT3_MOUNT_EXTDEBUG 0x200000/* Extents debug */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -687,6 +693,7 @@ - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - - /* inode.c */ -+extern int ext3_block_truncate_page(handle_t *, struct address_space *, loff_t); - extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); -@@ -767,6 +774,14 @@ - extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - -+/* extents.c */ -+extern int ext3_ext_writepage_trans_blocks(struct inode *, int); -+extern int ext3_ext_get_block(handle_t *, struct inode *, long, -+ struct buffer_head *, int); -+extern void ext3_ext_truncate(struct inode *); -+extern void ext3_ext_init(struct super_block *); -+extern void ext3_ext_release(struct super_block *); -+extern void ext3_extents_initialize_blockmap(handle_t *, struct inode *); - - #endif /* __KERNEL__ */ - -Index: linux-2.4.20-8/include/linux/ext3_extents.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_extents.h 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_extents.h 2004-04-14 19:47:13.000000000 +0800 -@@ -0,0 +1,216 @@ -+/* -+ * Copyright (C) 2003 Alex Tomas <alex@clusterfs.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. -+ * -+ * 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 Licens -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- -+ */ -+ -+#ifndef _LINUX_EXT3_EXTENTS -+#define _LINUX_EXT3_EXTENTS -+ -+/* -+ * with AGRESSIVE_TEST defined capacity of index/leaf blocks -+ * become very little, so index split, in-depth growing and -+ * other hard changes happens much more often -+ * this is for debug purposes only -+ */ -+#define AGRESSIVE_TEST_ -+ -+/* -+ * if CHECK_BINSEARCH defined, then results of binary search -+ * will be checked by linear search -+ */ -+#define CHECK_BINSEARCH_ -+ -+/* -+ * if EXT_DEBUG is defined you can use 'extdebug' mount option -+ * to get lots of info what's going on -+ */ -+#define EXT_DEBUG -+#ifdef EXT_DEBUG -+#define ext_debug(tree,fmt,a...) \ -+do { \ -+ if (test_opt((tree)->inode->i_sb, EXTDEBUG)) \ -+ printk(fmt, ##a); \ -+} while (0); -+#else -+#define ext_debug(tree,fmt,a...) -+#endif -+ -+/* -+ * if EXT_STATS is defined then stats numbers are collected -+ * these number will be displayed at umount time -+ */ -+#define EXT_STATS_ -+ -+ -+#define EXT3_ALLOC_NEEDED 3 /* block bitmap + group desc. + sb */ -+ -+/* -+ * ext3_inode has i_block array (total 60 bytes) -+ * first 4 bytes are used to store: -+ * - tree depth (0 mean there is no tree yet. all extents in the inode) -+ * - number of alive extents in the inode -+ */ -+ -+/* -+ * this is extent on-disk structure -+ * it's used at the bottom of the tree -+ */ -+struct ext3_extent { -+ __u32 e_block; /* first logical block extent covers */ -+ __u32 e_start; /* first physical block extents lives */ -+ __u32 e_num; /* number of blocks covered by extent */ -+}; -+ -+/* -+ * this is index on-disk structure -+ * it's used at all the levels, but the bottom -+ */ -+struct ext3_extent_idx { -+ __u32 e_block; /* index covers logical blocks from 'block' */ -+ __u32 e_leaf; /* pointer to the physical block of the next * -+ * level. leaf or next index could bet here */ -+}; -+ -+/* -+ * each block (leaves and indexes), even inode-stored has header -+ */ -+struct ext3_extent_header { -+ __u16 e_magic; /* probably will support different formats */ -+ __u16 e_num; /* number of valid entries */ -+ __u16 e_max; /* capacity of store in entries */ -+ __u16 e_depth; /* has tree real underlaying blocks? */ -+ __u32 e_generation; /* generation of the tree */ -+}; -+ -+#define EXT3_EXT_MAGIC 0xf301 -+ -+/* -+ * array of ext3_ext_path contains path to some extent -+ * creation/lookup routines use it for traversal/splitting/etc -+ * truncate uses it to simulate recursive walking -+ */ -+struct ext3_ext_path { -+ __u32 p_block; -+ __u16 p_depth; -+ struct ext3_extent *p_ext; -+ struct ext3_extent_idx *p_idx; -+ struct ext3_extent_header *p_hdr; -+ struct buffer_head *p_bh; -+}; -+ -+/* -+ * structure for external API -+ */ -+ -+ -+/* -+ * ext3_extents_tree is used to pass initial information -+ * to top-level extents API -+ */ -+struct ext3_extents_tree { -+ struct inode *inode; /* inode which tree belongs to */ -+ void *root; /* ptr to data top of tree resides at */ -+ void *buffer; /* will be passed as arg to ^^ routines */ -+ int buffer_len; -+ void *private; -+ struct ext3_extent *cex;/* last found extent */ -+ int (*get_write_access)(handle_t *h, void *buffer); -+ int (*mark_buffer_dirty)(handle_t *h, void *buffer); -+ int (*mergable)(struct ext3_extent *ex1, struct ext3_extent *ex2); -+ int (*remove_extent_credits)(struct ext3_extents_tree *, -+ struct ext3_extent *, unsigned long, -+ unsigned long); -+ int (*remove_extent)(struct ext3_extents_tree *, -+ struct ext3_extent *, unsigned long, -+ unsigned long); -+ int (*new_block)(handle_t *, struct ext3_extents_tree *, -+ struct ext3_ext_path *, struct ext3_extent *, -+ int *); -+}; -+ -+/* -+ * to be called by ext3_ext_walk_space() -+ * negative retcode - error -+ * positive retcode - signal for ext3_ext_walk_space(), see below -+ * callback must return valid extent (passed or newly created) -+ */ -+typedef int (*ext_prepare_callback)(struct ext3_extents_tree *, -+ struct ext3_ext_path *, -+ struct ext3_extent *, int); -+ -+#define EXT_CONTINUE 0 -+#define EXT_BREAK 1 -+#define EXT_REPEAT 2 -+ -+ -+#define EXT_FIRST_EXTENT(__hdr__) \ -+ ((struct ext3_extent *) (((char *) (__hdr__)) + \ -+ sizeof(struct ext3_extent_header))) -+#define EXT_FIRST_INDEX(__hdr__) \ -+ ((struct ext3_extent_idx *) (((char *) (__hdr__)) + \ -+ sizeof(struct ext3_extent_header))) -+#define EXT_HAS_FREE_INDEX(__path__) \ -+ ((__path__)->p_hdr->e_num < (__path__)->p_hdr->e_max) -+#define EXT_LAST_EXTENT(__hdr__) \ -+ (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->e_num - 1) -+#define EXT_LAST_INDEX(__hdr__) \ -+ (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->e_num - 1) -+#define EXT_MAX_EXTENT(__hdr__) \ -+ (EXT_FIRST_EXTENT((__hdr__)) + (__hdr__)->e_max - 1) -+#define EXT_MAX_INDEX(__hdr__) \ -+ (EXT_FIRST_INDEX((__hdr__)) + (__hdr__)->e_max - 1) -+ -+#define EXT_ROOT_HDR(tree) \ -+ ((struct ext3_extent_header *) (tree)->root) -+#define EXT_BLOCK_HDR(bh) \ -+ ((struct ext3_extent_header *) (bh)->b_data) -+#define EXT_DEPTH(_t_) \ -+ (((struct ext3_extent_header *)((_t_)->root))->e_depth) -+#define EXT_GENERATION(_t_) \ -+ (((struct ext3_extent_header *)((_t_)->root))->e_generation) -+ -+ -+#define EXT_ASSERT(__x__) if (!(__x__)) BUG(); -+ -+ -+/* -+ * this structure is used to gather extents from the tree via ioctl -+ */ -+struct ext3_extent_buf { -+ unsigned long start; -+ int buflen; -+ void *buffer; -+ void *cur; -+ int err; -+}; -+ -+/* -+ * this structure is used to collect stats info about the tree -+ */ -+struct ext3_extent_tree_stats { -+ int depth; -+ int extents_num; -+ int leaf_num; -+}; -+ -+extern int ext3_extent_tree_init(handle_t *, struct ext3_extents_tree *); -+extern int ext3_ext_calc_credits_for_insert(struct ext3_extents_tree *, struct ext3_ext_path *); -+extern int ext3_ext_insert_extent(handle_t *, struct ext3_extents_tree *, struct ext3_ext_path *, struct ext3_extent *); -+extern int ext3_ext_walk_space(struct ext3_extents_tree *, unsigned long, unsigned long, ext_prepare_callback); -+extern int ext3_ext_remove_space(struct ext3_extents_tree *, unsigned long, unsigned long); -+extern struct ext3_ext_path * ext3_ext_find_extent(struct ext3_extents_tree *, int, struct ext3_ext_path *); -+ -+#endif /* _LINUX_EXT3_EXTENTS */ -+ -Index: linux-2.4.20-8/include/linux/ext3_fs_i.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_fs_i.h 2004-04-14 18:42:03.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_fs_i.h 2004-04-14 19:47:13.000000000 +0800 -@@ -76,6 +76,8 @@ - * by other means, so we have truncate_sem. - */ - struct rw_semaphore truncate_sem; -+ -+ __u32 i_cached_extent[3]; - }; - - #endif /* _LINUX_EXT3_FS_I */ diff --git a/lustre/kernel_patches/patches/ext3-extents-2.4.24.patch b/lustre/kernel_patches/patches/ext3-extents-2.4.24.patch index d6b0d4fbcb..ec759457f6 100644 --- a/lustre/kernel_patches/patches/ext3-extents-2.4.24.patch +++ b/lustre/kernel_patches/patches/ext3-extents-2.4.24.patch @@ -1,7 +1,7 @@ -Index: linux-2.4.24/fs/ext3/extents.c +Index: linux-2.4.24-b1_4/fs/ext3/extents.c =================================================================== ---- linux-2.4.24.orig/fs/ext3/extents.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.24/fs/ext3/extents.c 2004-09-12 17:37:14.000000000 +0400 +--- linux-2.4.24-b1_4.orig/fs/ext3/extents.c 2003-01-30 18:24:37.000000000 +0800 ++++ linux-2.4.24-b1_4/fs/ext3/extents.c 2004-09-30 14:04:33.000000000 +0800 @@ -0,0 +1,2262 @@ +/* + * Copyright (c) 2003, Cluster File Systems, Inc, info@clusterfs.com @@ -2265,11 +2265,11 @@ Index: linux-2.4.24/fs/ext3/extents.c +EXPORT_SYMBOL(ext3_ext_find_goal); +EXPORT_SYMBOL(ext3_ext_calc_credits_for_insert); + -Index: linux-2.4.24/fs/ext3/ialloc.c +Index: linux-2.4.24-b1_4/fs/ext3/ialloc.c =================================================================== ---- linux-2.4.24.orig/fs/ext3/ialloc.c 2004-08-07 16:35:25.000000000 +0400 -+++ linux-2.4.24/fs/ext3/ialloc.c 2004-09-12 17:49:24.000000000 +0400 -@@ -593,10 +593,21 @@ +--- linux-2.4.24-b1_4.orig/fs/ext3/ialloc.c 2004-09-30 14:04:27.000000000 +0800 ++++ linux-2.4.24-b1_4/fs/ext3/ialloc.c 2004-09-30 14:04:33.000000000 +0800 +@@ -592,10 +592,21 @@ iloc.bh = NULL; goto fail; } @@ -2293,10 +2293,10 @@ Index: linux-2.4.24/fs/ext3/ialloc.c unlock_super (sb); if(DQUOT_ALLOC_INODE(inode)) { -Index: linux-2.4.24/fs/ext3/inode.c +Index: linux-2.4.24-b1_4/fs/ext3/inode.c =================================================================== ---- linux-2.4.24.orig/fs/ext3/inode.c 2004-08-07 16:35:25.000000000 +0400 -+++ linux-2.4.24/fs/ext3/inode.c 2004-09-12 17:37:14.000000000 +0400 +--- linux-2.4.24-b1_4.orig/fs/ext3/inode.c 2004-09-30 14:04:27.000000000 +0800 ++++ linux-2.4.24-b1_4/fs/ext3/inode.c 2004-09-30 14:04:33.000000000 +0800 @@ -848,6 +848,15 @@ goto reread; } @@ -2350,7 +2350,7 @@ Index: linux-2.4.24/fs/ext3/inode.c handle = start_transaction(inode); if (IS_ERR(handle)) return; /* AKPM: return what? */ -@@ -2547,6 +2559,9 @@ +@@ -2536,6 +2548,9 @@ int indirects = (EXT3_NDIR_BLOCKS % bpp) ? 5 : 3; int ret; @@ -2360,7 +2360,7 @@ Index: linux-2.4.24/fs/ext3/inode.c if (ext3_should_journal_data(inode)) ret = 3 * (bpp + indirects) + 2; else -@@ -2983,7 +2998,7 @@ +@@ -2972,7 +2987,7 @@ /* alloc blocks one by one */ for (i = 0; i < nblocks; i++) { @@ -2369,7 +2369,7 @@ Index: linux-2.4.24/fs/ext3/inode.c &bh_tmp, 1); if (ret) break; -@@ -3059,7 +3074,7 @@ +@@ -3048,7 +3063,7 @@ if (blocks[i] != 0) continue; @@ -2378,10 +2378,10 @@ Index: linux-2.4.24/fs/ext3/inode.c if (rc) { printk(KERN_INFO "ext3_map_inode_page: error %d " "allocating block %ld\n", rc, iblock); -Index: linux-2.4.24/fs/ext3/Makefile +Index: linux-2.4.24-b1_4/fs/ext3/Makefile =================================================================== ---- linux-2.4.24.orig/fs/ext3/Makefile 2004-08-07 16:35:25.000000000 +0400 -+++ linux-2.4.24/fs/ext3/Makefile 2004-09-12 17:37:14.000000000 +0400 +--- linux-2.4.24-b1_4.orig/fs/ext3/Makefile 2004-09-30 14:04:27.000000000 +0800 ++++ linux-2.4.24-b1_4/fs/ext3/Makefile 2004-09-30 14:04:33.000000000 +0800 @@ -13,7 +13,9 @@ obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ @@ -2393,10 +2393,10 @@ Index: linux-2.4.24/fs/ext3/Makefile obj-m := $(O_TARGET) export-objs += xattr.o -Index: linux-2.4.24/fs/ext3/super.c +Index: linux-2.4.24-b1_4/fs/ext3/super.c =================================================================== ---- linux-2.4.24.orig/fs/ext3/super.c 2004-08-07 16:35:25.000000000 +0400 -+++ linux-2.4.24/fs/ext3/super.c 2004-09-12 17:37:14.000000000 +0400 +--- linux-2.4.24-b1_4.orig/fs/ext3/super.c 2004-09-30 14:04:27.000000000 +0800 ++++ linux-2.4.24-b1_4/fs/ext3/super.c 2004-09-30 14:04:33.000000000 +0800 @@ -530,6 +530,7 @@ int i; @@ -2425,10 +2425,10 @@ Index: linux-2.4.24/fs/ext3/super.c return sb; failed_mount3: -Index: linux-2.4.24/fs/ext3/ioctl.c +Index: linux-2.4.24-b1_4/fs/ext3/ioctl.c =================================================================== ---- linux-2.4.24.orig/fs/ext3/ioctl.c 2004-08-07 16:35:23.000000000 +0400 -+++ linux-2.4.24/fs/ext3/ioctl.c 2004-09-12 17:37:14.000000000 +0400 +--- linux-2.4.24-b1_4.orig/fs/ext3/ioctl.c 2004-09-30 14:04:22.000000000 +0800 ++++ linux-2.4.24-b1_4/fs/ext3/ioctl.c 2004-09-30 14:04:33.000000000 +0800 @@ -174,6 +174,10 @@ return ret; } @@ -2440,19 +2440,19 @@ Index: linux-2.4.24/fs/ext3/ioctl.c default: return -ENOTTY; } -Index: linux-2.4.24/include/linux/ext3_fs.h +Index: linux-2.4.24-b1_4/include/linux/ext3_fs.h =================================================================== ---- linux-2.4.24.orig/include/linux/ext3_fs.h 2004-08-07 16:35:25.000000000 +0400 -+++ linux-2.4.24/include/linux/ext3_fs.h 2004-09-12 17:45:20.000000000 +0400 -@@ -185,6 +185,7 @@ +--- linux-2.4.24-b1_4.orig/include/linux/ext3_fs.h 2004-09-30 14:04:27.000000000 +0800 ++++ linux-2.4.24-b1_4/include/linux/ext3_fs.h 2004-09-30 14:07:09.000000000 +0800 +@@ -184,6 +184,7 @@ + #define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */ #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ - #define EXT3_EXTRA_ISIZE 0x00008000 /* inode has initialized i_extra_isize */ #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ +#define EXT3_EXTENTS_FL 0x00080000 /* Inode uses extents */ #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ -@@ -209,6 +210,9 @@ +@@ -208,6 +209,9 @@ #ifdef CONFIG_JBD_DEBUG #define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) #endif @@ -2462,16 +2462,16 @@ Index: linux-2.4.24/include/linux/ext3_fs.h /* * Structure of an inode on the disk -@@ -328,6 +332,8 @@ - #define EXT3_MOUNT_IOPEN 0x8000 /* Allow access via iopen */ - #define EXT3_MOUNT_IOPEN_NOPRIV 0x10000 /* Make iopen world-readable */ +@@ -327,6 +331,8 @@ #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ -+#define EXT3_MOUNT_EXTENTS 0x40000 /* Extents support */ -+#define EXT3_MOUNT_EXTDEBUG 0x80000 /* Extents debug */ + #define EXT3_MOUNT_IOPEN 0x40000 /* Allow access via iopen */ + #define EXT3_MOUNT_IOPEN_NOPRIV 0x80000 /* Make iopen world-readable */ ++#define EXT3_MOUNT_EXTENTS 0x100000 /* Extents support */ ++#define EXT3_MOUNT_EXTDEBUG 0x200000 /* Extents debug */ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ #ifndef _LINUX_EXT2_FS_H -@@ -504,10 +510,12 @@ +@@ -503,10 +509,12 @@ #define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002 #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ @@ -2485,7 +2485,7 @@ Index: linux-2.4.24/include/linux/ext3_fs.h #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT3_FEATURE_RO_COMPAT_BTREE_DIR) -@@ -689,6 +697,7 @@ +@@ -688,6 +696,7 @@ extern unsigned long ext3_count_free (struct buffer_head *, unsigned); /* inode.c */ @@ -2493,7 +2493,7 @@ Index: linux-2.4.24/include/linux/ext3_fs.h extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); -@@ -770,6 +779,14 @@ +@@ -769,6 +778,14 @@ extern struct inode_operations ext3_symlink_inode_operations; extern struct inode_operations ext3_fast_symlink_inode_operations; @@ -2508,10 +2508,10 @@ Index: linux-2.4.24/include/linux/ext3_fs.h #endif /* __KERNEL__ */ -Index: linux-2.4.24/include/linux/ext3_extents.h +Index: linux-2.4.24-b1_4/include/linux/ext3_extents.h =================================================================== ---- linux-2.4.24.orig/include/linux/ext3_extents.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.24/include/linux/ext3_extents.h 2004-09-12 17:37:14.000000000 +0400 +--- linux-2.4.24-b1_4.orig/include/linux/ext3_extents.h 2003-01-30 18:24:37.000000000 +0800 ++++ linux-2.4.24-b1_4/include/linux/ext3_extents.h 2004-09-30 14:04:33.000000000 +0800 @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2003, Cluster File Systems, Inc, info@clusterfs.com @@ -2750,10 +2750,10 @@ Index: linux-2.4.24/include/linux/ext3_extents.h + +#endif /* _LINUX_EXT3_EXTENTS */ + -Index: linux-2.4.24/include/linux/ext3_fs_i.h +Index: linux-2.4.24-b1_4/include/linux/ext3_fs_i.h =================================================================== ---- linux-2.4.24.orig/include/linux/ext3_fs_i.h 2004-08-07 16:35:25.000000000 +0400 -+++ linux-2.4.24/include/linux/ext3_fs_i.h 2004-09-12 17:37:14.000000000 +0400 +--- linux-2.4.24-b1_4.orig/include/linux/ext3_fs_i.h 2004-09-30 14:04:27.000000000 +0800 ++++ linux-2.4.24-b1_4/include/linux/ext3_fs_i.h 2004-09-30 14:04:33.000000000 +0800 @@ -76,6 +76,8 @@ * by other means, so we have truncate_sem. */ diff --git a/lustre/kernel_patches/patches/ext3-extents-2.4.21-suse2.patch b/lustre/kernel_patches/patches/ext3-extents-2.6.7.patch similarity index 89% rename from lustre/kernel_patches/patches/ext3-extents-2.4.21-suse2.patch rename to lustre/kernel_patches/patches/ext3-extents-2.6.7.patch index 65289ca8d9..903130f32d 100644 --- a/lustre/kernel_patches/patches/ext3-extents-2.4.21-suse2.patch +++ b/lustre/kernel_patches/patches/ext3-extents-2.6.7.patch @@ -1,8 +1,9 @@ -Index: linux-2.4.21-suse2/fs/ext3/extents.c +%patch +Index: linux-2.6.7/fs/ext3/extents.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/extents.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-suse2/fs/ext3/extents.c 2004-09-12 17:56:01.000000000 +0400 -@@ -0,0 +1,2262 @@ +--- linux-2.6.7.orig/fs/ext3/extents.c 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.6.7/fs/ext3/extents.c 2004-09-12 18:53:38.000000000 +0400 +@@ -0,0 +1,2306 @@ +/* + * Copyright (c) 2003, Cluster File Systems, Inc, info@clusterfs.com + * Written by Alex Tomas <alex@clusterfs.com> @@ -39,7 +40,6 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c +#include <linux/time.h> +#include <linux/ext3_jbd.h> +#include <linux/jbd.h> -+#include <linux/locks.h> +#include <linux/smp_lock.h> +#include <linux/highuid.h> +#include <linux/pagemap.h> @@ -639,7 +639,7 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + neh->eh_entries++; + m++; + } -+ mark_buffer_uptodate(bh, 1); ++ set_buffer_uptodate(bh); + unlock_buffer(bh); + + if ((err = ext3_journal_dirty_metadata(handle, bh))) @@ -707,7 +707,7 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + EXT_ASSERT(neh->eh_entries <= neh->eh_max); + m++; + } -+ mark_buffer_uptodate(bh, 1); ++ set_buffer_uptodate(bh); + unlock_buffer(bh); + + if ((err = ext3_journal_dirty_metadata(handle, bh))) @@ -796,13 +796,13 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + /* set size of new block */ + neh = EXT_BLOCK_HDR(bh); + /* old root could have indexes or leaves -+ * so calculate eh_max right way */ ++ * so calculate e_max right way */ + if (EXT_DEPTH(tree)) + neh->eh_max = ext3_ext_space_block_idx(tree); + else + neh->eh_max = ext3_ext_space_block(tree); + neh->eh_magic = EXT3_EXT_MAGIC; -+ mark_buffer_uptodate(bh, 1); ++ set_buffer_uptodate(bh); + unlock_buffer(bh); + + if ((err = ext3_journal_dirty_metadata(handle, bh))) @@ -1392,7 +1392,7 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + return err; + ext_debug(tree, "index is empty, remove it, free block %d\n", + path->p_idx->ei_leaf); -+ bh = sb_get_hash_table(tree->inode->i_sb, path->p_idx->ei_leaf); ++ bh = sb_find_get_block(tree->inode->i_sb, path->p_idx->ei_leaf); + ext3_forget(handle, 1, tree->inode, bh, path->p_idx->ei_leaf); + ext3_free_blocks(handle, tree->inode, path->p_idx->ei_leaf, 1); + return err; @@ -1684,7 +1684,7 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + if (IS_ERR(path)) { + ext3_error(sb, "ext3_ext_remove_space", + "Can't allocate path array"); -+ ext3_journal_stop(handle, inode); ++ ext3_journal_stop(handle); + return -ENOMEM; + } + memset(path, 0, sizeof(struct ext3_ext_path) * (depth + 1)); @@ -1770,11 +1770,41 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + ext3_ext_tree_changed(tree); + + kfree(path); -+ ext3_journal_stop(handle, inode); ++ ext3_journal_stop(handle); + + return err; +} + ++int ext3_ext_calc_metadata_amount(struct ext3_extents_tree *tree, int blocks) ++{ ++ int lcap, icap, rcap, leafs, idxs, num; ++ ++ rcap = ext3_ext_space_root(tree); ++ if (blocks <= rcap) { ++ /* all extents fit to the root */ ++ return 0; ++ } ++ ++ rcap = ext3_ext_space_root_idx(tree); ++ lcap = ext3_ext_space_block(tree); ++ icap = ext3_ext_space_block_idx(tree); ++ ++ num = leafs = (blocks + lcap - 1) / lcap; ++ if (leafs <= rcap) { ++ /* all pointers to leafs fit to the root */ ++ return leafs; ++ } ++ ++ /* ok. we need separate index block(s) to link all leaf blocks */ ++ idxs = (leafs + icap - 1) / icap; ++ do { ++ num += idxs; ++ idxs = (idxs + icap - 1) / icap; ++ } while (idxs > rcap); ++ ++ return num; ++} ++ +/* + * called at mount time + */ @@ -1864,7 +1894,7 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + ext_debug(tree, "free last %lu blocks starting %lu\n", + num, start); + for (i = 0; i < num; i++) { -+ bh = sb_get_hash_table(tree->inode->i_sb, start + i); ++ bh = sb_find_get_block(tree->inode->i_sb, start + i); + ext3_forget(handle, 0, tree->inode, bh, start + i); + } + ext3_free_blocks(handle, tree->inode, start, num); @@ -1875,12 +1905,12 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + printk("strange request: removal(2) %lu-%lu from %u:%u\n", + from, to, ex->ee_block, ex->ee_len); + } -+ ext3_journal_stop(handle, tree->inode); ++ ext3_journal_stop(handle); + return 0; +} + -+int ext3_ext_find_goal(struct inode *inode, struct ext3_ext_path *path, -+ unsigned long block) ++static int ext3_ext_find_goal(struct inode *inode, ++ struct ext3_ext_path *path, unsigned long block) +{ + struct ext3_inode_info *ei = EXT3_I(inode); + unsigned long bg_start; @@ -1959,7 +1989,8 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c +} + +int ext3_ext_get_block(handle_t *handle, struct inode *inode, -+ long iblock, struct buffer_head *bh_result, int create) ++ long iblock, struct buffer_head *bh_result, ++ int create, int extend_disksize) +{ + struct ext3_ext_path *path = NULL; + struct ext3_extent newex; @@ -1967,11 +1998,11 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + int goal, newblock, err = 0, depth; + struct ext3_extents_tree tree; + -+ clear_bit(BH_New, &bh_result->b_state); ++ clear_buffer_new(bh_result); + ext3_init_tree_desc(&tree, inode); + ext_debug(&tree, "block %d requested for inode %u\n", + (int) iblock, (unsigned) inode->i_ino); -+ down_write(&EXT3_I(inode)->truncate_sem); ++ down(&EXT3_I(inode)->truncate_sem); + + /* check in cache */ + if (ext3_ext_in_cache(&tree, iblock, &newex)) { @@ -2045,30 +2076,28 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + if (err) + goto out2; + -+ if (inode->i_size > EXT3_I(inode)->i_disksize) ++ if (extend_disksize && inode->i_size > EXT3_I(inode)->i_disksize) + EXT3_I(inode)->i_disksize = inode->i_size; + + /* previous routine could use block we allocated */ + newblock = newex.ee_start; -+ set_bit(BH_New, &bh_result->b_state); ++ set_buffer_new(bh_result); + + ext3_ext_put_in_cache(&tree, &newex); +out: + ext3_ext_show_leaf(&tree, path); -+ set_bit(BH_Mapped, &bh_result->b_state); -+ bh_result->b_dev = inode->i_sb->s_dev; -+ bh_result->b_blocknr = newblock; ++ map_bh(bh_result, inode->i_sb, newblock); +out2: + if (path) { + ext3_ext_drop_refs(path); + kfree(path); + } -+ up_write(&EXT3_I(inode)->truncate_sem); ++ up(&EXT3_I(inode)->truncate_sem); + + return err; +} + -+void ext3_ext_truncate(struct inode * inode) ++void ext3_ext_truncate(struct inode * inode, struct page *page) +{ + struct address_space *mapping = inode->i_mapping; + struct super_block *sb = inode->i_sb; @@ -2084,12 +2113,20 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + */ + err = ext3_writepage_trans_blocks(inode) + 3; + handle = ext3_journal_start(inode, err); -+ if (IS_ERR(handle)) ++ if (IS_ERR(handle)) { ++ if (page) { ++ clear_highpage(page); ++ flush_dcache_page(page); ++ unlock_page(page); ++ page_cache_release(page); ++ } + return; ++ } + -+ ext3_block_truncate_page(handle, mapping, inode->i_size); ++ if (page) ++ ext3_block_truncate_page(handle, page, mapping, inode->i_size); + -+ down_write(&EXT3_I(inode)->truncate_sem); ++ down(&EXT3_I(inode)->truncate_sem); + ext3_ext_invalidate_cache(&tree); + + /* @@ -2124,8 +2161,8 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + if (inode->i_nlink) + ext3_orphan_del(handle, inode); + -+ up_write(&EXT3_I(inode)->truncate_sem); -+ ext3_journal_stop(handle, inode); ++ up(&EXT3_I(inode)->truncate_sem); ++ ext3_journal_stop(handle); +} + +/* @@ -2163,6 +2200,14 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + ext3_extent_tree_init(handle, &tree); +} + ++int ext3_ext_calc_blockmap_metadata(struct inode *inode, int blocks) ++{ ++ struct ext3_extents_tree tree; ++ ++ ext3_init_tree_desc(&tree, inode); ++ return ext3_ext_calc_metadata_amount(&tree, blocks); ++} ++ +static int +ext3_ext_store_extent_cb(struct ext3_extents_tree *tree, + struct ext3_ext_path *path, @@ -2225,10 +2270,10 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + buf.cur = buf.buffer; + buf.err = 0; + tree.private = &buf; -+ down_write(&EXT3_I(inode)->truncate_sem); ++ down(&EXT3_I(inode)->truncate_sem); + err = ext3_ext_walk_space(&tree, buf.start, EXT_MAX_BLOCK, + ext3_ext_store_extent_cb); -+ up_write(&EXT3_I(inode)->truncate_sem); ++ up(&EXT3_I(inode)->truncate_sem); + if (err == 0) + err = buf.err; + } else if (cmd == EXT3_IOC_GET_TREE_STATS) { @@ -2236,22 +2281,22 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c + struct ext3_extents_tree tree; + + ext3_init_tree_desc(&tree, inode); -+ down_write(&EXT3_I(inode)->truncate_sem); ++ down(&EXT3_I(inode)->truncate_sem); + buf.depth = EXT_DEPTH(&tree); + buf.extents_num = 0; + buf.leaf_num = 0; + tree.private = &buf; + err = ext3_ext_walk_space(&tree, 0, EXT_MAX_BLOCK, + ext3_ext_collect_stats_cb); -+ up_write(&EXT3_I(inode)->truncate_sem); ++ up(&EXT3_I(inode)->truncate_sem); + if (!err) + err = copy_to_user((void *) arg, &buf, sizeof(buf)); + } else if (cmd == EXT3_IOC_GET_TREE_DEPTH) { + struct ext3_extents_tree tree; + ext3_init_tree_desc(&tree, inode); -+ down_write(&EXT3_I(inode)->truncate_sem); ++ down(&EXT3_I(inode)->truncate_sem); + err = EXT_DEPTH(&tree); -+ up_write(&EXT3_I(inode)->truncate_sem); ++ up(&EXT3_I(inode)->truncate_sem); + } + + return err; @@ -2265,21 +2310,17 @@ Index: linux-2.4.21-suse2/fs/ext3/extents.c +EXPORT_SYMBOL(ext3_ext_find_goal); +EXPORT_SYMBOL(ext3_ext_calc_credits_for_insert); + -Index: linux-2.4.21-suse2/fs/ext3/ialloc.c +Index: linux-2.6.7/fs/ext3/ialloc.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/ialloc.c 2004-08-19 13:51:48.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/ialloc.c 2004-09-12 18:26:45.000000000 +0400 -@@ -592,10 +592,21 @@ - iloc.bh = NULL; - goto fail; - } -- err = ext3_mark_iloc_dirty(handle, inode, &iloc); -- if (err) goto fail; -- - -+ if (test_opt(sb, EXTENTS)) { -+ EXT3_I(inode)->i_flags |= EXT3_EXTENTS_FL; -+ ext3_extents_initialize_blockmap(handle, inode); +--- linux-2.6.7.orig/fs/ext3/ialloc.c 2004-09-12 18:53:35.000000000 +0400 ++++ linux-2.6.7/fs/ext3/ialloc.c 2004-09-12 19:09:54.000000000 +0400 +@@ -646,6 +646,17 @@ + DQUOT_FREE_INODE(inode); + goto fail2; + } ++ if (test_opt(sb, EXTENTS)) { ++ EXT3_I(inode)->i_flags |= EXT3_EXTENTS_FL; ++ ext3_extents_initialize_blockmap(handle, inode); + if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_EXTENTS)) { + err = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); + if (err) goto fail; @@ -2287,18 +2328,15 @@ Index: linux-2.4.21-suse2/fs/ext3/ialloc.c + BUFFER_TRACE(EXT3_SB(sb)->s_sbh, "call ext3_journal_dirty_metadata"); + err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); + } -+ } -+ -+ err = ext3_mark_iloc_dirty(handle, inode, &iloc); -+ if (err) goto fail; - - #ifdef CONFIG_EXT3_FS_XATTR - init_rwsem(&inode->u.ext3_i.xattr_sem); -Index: linux-2.4.21-suse2/fs/ext3/inode.c ++ } + err = ext3_mark_inode_dirty(handle, inode); + if (err) { + ext3_std_error(sb, err); +Index: linux-2.6.7/fs/ext3/inode.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/inode.c 2004-08-19 13:51:48.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/inode.c 2004-09-12 17:56:01.000000000 +0400 -@@ -853,6 +853,16 @@ +--- linux-2.6.7.orig/fs/ext3/inode.c 2004-09-12 18:53:35.000000000 +0400 ++++ linux-2.6.7/fs/ext3/inode.c 2004-09-12 18:53:38.000000000 +0400 +@@ -857,6 +857,17 @@ goto reread; } @@ -2307,33 +2345,38 @@ Index: linux-2.4.21-suse2/fs/ext3/inode.c + struct buffer_head *bh, int create, int extend_disksize) +{ + if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_get_block(handle, inode, block, bh, create); ++ return ext3_ext_get_block(handle, inode, block, bh, create, ++ extend_disksize); + return ext3_get_block_handle(handle, inode, block, bh, create, + extend_disksize); +} + - /* - * The BKL is not held on entry here. - */ -@@ -866,7 +876,7 @@ + static int ext3_get_block(struct inode *inode, sector_t iblock, + struct buffer_head *bh_result, int create) + { +@@ -867,8 +878,8 @@ handle = ext3_journal_current_handle(); J_ASSERT(handle != 0); } - ret = ext3_get_block_handle(handle, inode, iblock, +- bh_result, create, 1); + ret = ext3_get_block_wrap(handle, inode, iblock, - bh_result, create, 1); ++ bh_result, create, 1); return ret; } -@@ -893,7 +903,7 @@ + +@@ -894,8 +905,8 @@ } } if (ret == 0) - ret = ext3_get_block_handle(handle, inode, iblock, +- bh_result, create, 0); + ret = ext3_get_block_wrap(handle, inode, iblock, - bh_result, create, 0); ++ bh_result, create, 0); if (ret == 0) bh_result->b_size = (1 << inode->i_blkbits); -@@ -915,7 +925,7 @@ + return ret; +@@ -916,7 +927,7 @@ dummy.b_state = 0; dummy.b_blocknr = -1000; buffer_trace_init(&dummy.b_history); @@ -2342,106 +2385,102 @@ Index: linux-2.4.21-suse2/fs/ext3/inode.c if (!*errp && buffer_mapped(&dummy)) { struct buffer_head *bh; bh = sb_getblk(inode->i_sb, dummy.b_blocknr); -@@ -1502,7 +1512,7 @@ +@@ -1669,7 +1680,7 @@ * This required during truncate. We need to physically zero the tail end * of that block so it doesn't yield old data if the file is later grown. */ --static int ext3_block_truncate_page(handle_t *handle, -+int ext3_block_truncate_page(handle_t *handle, +-static int ext3_block_truncate_page(handle_t *handle, struct page *page, ++int ext3_block_truncate_page(handle_t *handle, struct page *page, struct address_space *mapping, loff_t from) { unsigned long index = from >> PAGE_CACHE_SHIFT; -@@ -1988,6 +1998,9 @@ - - ext3_discard_prealloc(inode); +@@ -2165,6 +2176,9 @@ + return; + } + if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_truncate(inode); ++ return ext3_ext_truncate(inode, page); + handle = start_transaction(inode); - if (IS_ERR(handle)) - return; /* AKPM: return what? */ -@@ -2664,6 +2677,9 @@ + if (IS_ERR(handle)) { + if (page) { +@@ -2888,6 +2902,9 @@ int indirects = (EXT3_NDIR_BLOCKS % bpp) ? 5 : 3; int ret; - -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -+ return ext3_ext_writepage_trans_blocks(inode, bpp); -+ + ++ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) ++ return ext3_ext_writepage_trans_blocks(inode, bpp); ++ if (ext3_should_journal_data(inode)) ret = 3 * (bpp + indirects) + 2; else -@@ -3100,7 +3116,7 @@ - - /* alloc blocks one by one */ - for (i = 0; i < nblocks; i++) { -- ret = ext3_get_block_handle(handle, inode, blocks[i], -+ ret = ext3_get_block_wrap(handle, inode, blocks[i], - &bh_tmp, 1, 1); - if (ret) - break; -@@ -3176,7 +3192,7 @@ - if (blocks[i] != 0) - continue; - -- rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1, 1); -+ rc = ext3_get_block_wrap(handle, inode, iblock, &bh, 1, 1); - if (rc) { - printk(KERN_INFO "ext3_map_inode_page: error %d " - "allocating block %ld\n", rc, iblock); -Index: linux-2.4.21-suse2/fs/ext3/Makefile +Index: linux-2.6.7/fs/ext3/super.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/Makefile 2004-08-19 13:45:03.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/Makefile 2004-09-12 17:56:01.000000000 +0400 -@@ -12,7 +12,10 @@ - export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ -- ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ -+ extents.o -+export-objs += extents.o -+ - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.21-suse2/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/super.c 2004-08-19 13:51:48.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/super.c 2004-09-12 17:56:01.000000000 +0400 -@@ -624,6 +624,7 @@ +--- linux-2.6.7.orig/fs/ext3/super.c 2004-09-12 18:53:35.000000000 +0400 ++++ linux-2.6.7/fs/ext3/super.c 2004-09-12 18:53:38.000000000 +0400 +@@ -392,6 +392,7 @@ + struct ext3_super_block *es = sbi->s_es; int i; - J_ASSERT(sbi->s_delete_inodes == 0); -+ ext3_ext_release(sb); ++ ext3_ext_release(sb); ext3_xattr_put_super(sb); journal_destroy(sbi->s_journal); if (!(sb->s_flags & MS_RDONLY)) { -@@ -829,6 +830,10 @@ - return 0; - } - } -+ else if (!strcmp (this_char, "extents")) -+ set_opt (*mount_options, EXTENTS); -+ else if (!strcmp (this_char, "extdebug")) -+ set_opt (*mount_options, EXTDEBUG); - else if (!strcmp (this_char, "grpid") || - !strcmp (this_char, "bsdgroups")) - set_opt (*mount_options, GRPID); -@@ -1524,6 +1529,8 @@ - test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": - "writeback"); +@@ -458,6 +459,9 @@ + dynlock_init(&ei->i_htree_lock); + sema_init(&ei->i_rename_sem, 1); + sema_init(&ei->i_append_sem, 1); ++ ei->i_cached_extent[0] = 0; ++ ei->i_cached_extent[1] = 0; ++ ei->i_cached_extent[2] = 0; + return &ei->vfs_inode; + } -+ ext3_ext_init(sb); -+ - return sb; +@@ -592,7 +596,7 @@ + Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, + Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, + Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_pdirops, +- Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, ++ Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, Opt_extents, Opt_extdebug, + Opt_ignore, Opt_err, + }; + +@@ -642,6 +646,8 @@ + {Opt_iopen, "iopen"}, + {Opt_noiopen, "noiopen"}, + {Opt_iopen_nopriv, "iopen_nopriv"}, ++ {Opt_extents, "extents"}, ++ {Opt_extdebug, "extdebug"}, + {Opt_err, NULL} + }; + +@@ -921,6 +927,12 @@ + break; + case Opt_ignore: + break; ++ case Opt_extents: ++ set_opt (sbi->s_mount_opt, EXTENTS); ++ break; ++ case Opt_extdebug: ++ set_opt (sbi->s_mount_opt, EXTDEBUG); ++ break; + default: + printk (KERN_ERR + "EXT3-fs: Unrecognized mount option \"%s\" " +@@ -1593,6 +1605,8 @@ + percpu_counter_mod(&sbi->s_dirs_counter, + ext3_count_dirs(sb)); + ++ ext3_ext_init(sb); ++ + return 0; failed_mount3: -Index: linux-2.4.21-suse2/fs/ext3/ioctl.c +Index: linux-2.6.7/fs/ext3/ioctl.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/ioctl.c 2004-08-19 13:45:03.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/ioctl.c 2004-09-12 17:56:01.000000000 +0400 -@@ -174,6 +174,10 @@ +--- linux-2.6.7.orig/fs/ext3/ioctl.c 2004-09-12 18:53:32.000000000 +0400 ++++ linux-2.6.7/fs/ext3/ioctl.c 2004-09-12 18:53:38.000000000 +0400 +@@ -176,6 +176,10 @@ return ret; } #endif @@ -2452,19 +2491,32 @@ Index: linux-2.4.21-suse2/fs/ext3/ioctl.c default: return -ENOTTY; } -Index: linux-2.4.21-suse2/include/linux/ext3_fs.h +Index: linux-2.6.7/fs/ext3/Makefile =================================================================== ---- linux-2.4.21-suse2.orig/include/linux/ext3_fs.h 2004-08-19 13:51:48.000000000 +0400 -+++ linux-2.4.21-suse2/include/linux/ext3_fs.h 2004-09-12 18:26:06.000000000 +0400 -@@ -184,6 +184,7 @@ - #define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */ - #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ +--- linux-2.6.7.orig/fs/ext3/Makefile 2004-09-12 18:53:33.000000000 +0400 ++++ linux-2.6.7/fs/ext3/Makefile 2004-09-12 18:53:38.000000000 +0400 +@@ -5,7 +5,7 @@ + obj-$(CONFIG_EXT3_FS) += ext3.o + + ext3-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ +- ioctl.o namei.o super.o symlink.o hash.o ++ ioctl.o namei.o super.o symlink.o hash.o extents.o + + ext3-$(CONFIG_EXT3_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o + ext3-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o +Index: linux-2.6.7/include/linux/ext3_fs.h +=================================================================== +--- linux-2.6.7.orig/include/linux/ext3_fs.h 2004-09-12 18:53:37.000000000 +0400 ++++ linux-2.6.7/include/linux/ext3_fs.h 2004-09-12 19:13:48.000000000 +0400 +@@ -186,6 +186,7 @@ + #define EXT3_DIRSYNC_FL 0x00010000 /* dirsync behaviour (directories only) */ + #define EXT3_TOPDIR_FL 0x00020000 /* Top of directory hierarchies*/ #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ +#define EXT3_EXTENTS_FL 0x00080000 /* Inode uses extents */ - #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ - #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ -@@ -208,6 +209,9 @@ + #define EXT3_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */ + #define EXT3_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */ +@@ -209,6 +210,9 @@ #ifdef CONFIG_JBD_DEBUG #define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) #endif @@ -2474,57 +2526,58 @@ Index: linux-2.4.21-suse2/include/linux/ext3_fs.h /* * Structure of an inode on the disk -@@ -328,6 +332,8 @@ - #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ +@@ -330,6 +334,8 @@ + #define EXT3_MOUNT_POSIX_ACL 0x8000 /* POSIX Access Control Lists */ #define EXT3_MOUNT_IOPEN 0x40000 /* Allow access via iopen */ #define EXT3_MOUNT_IOPEN_NOPRIV 0x80000 /* Make iopen world-readable */ -+#define EXT3_MOUNT_EXTENTS 0x100000/* Extents support */ -+#define EXT3_MOUNT_EXTDEBUG 0x200000/* Extents debug */ ++#define EXT3_MOUNT_EXTENTS 0x10000 /* Extents support */ ++#define EXT3_MOUNT_EXTDEBUG 0x20000 /* Extents debug */ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -504,10 +510,12 @@ - #define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002 + #ifndef clear_opt +@@ -518,11 +524,13 @@ #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ + #define EXT3_FEATURE_INCOMPAT_META_BG 0x0010 +#define EXT3_FEATURE_INCOMPAT_EXTENTS 0x0040 /* extents support */ #define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ -- EXT3_FEATURE_INCOMPAT_RECOVER) -+ EXT3_FEATURE_INCOMPAT_RECOVER| \ + EXT3_FEATURE_INCOMPAT_RECOVER| \ +- EXT3_FEATURE_INCOMPAT_META_BG) ++ EXT3_FEATURE_INCOMPAT_META_BG| \ + EXT3_FEATURE_INCOMPAT_EXTENTS) #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT3_FEATURE_RO_COMPAT_BTREE_DIR) -@@ -689,6 +697,7 @@ - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); +@@ -725,6 +733,7 @@ + /* inode.c */ -+extern int ext3_block_truncate_page(handle_t *, struct address_space *, loff_t); ++extern int ext3_block_truncate_page(handle_t *, struct page *, struct address_space *, loff_t); extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); -@@ -770,6 +779,14 @@ +@@ -798,6 +807,14 @@ extern struct inode_operations ext3_symlink_inode_operations; extern struct inode_operations ext3_fast_symlink_inode_operations; +/* extents.c */ +extern int ext3_ext_writepage_trans_blocks(struct inode *, int); +extern int ext3_ext_get_block(handle_t *, struct inode *, long, -+ struct buffer_head *, int); -+extern void ext3_ext_truncate(struct inode *); ++ struct buffer_head *, int, int); ++extern void ext3_ext_truncate(struct inode *, struct page *); +extern void ext3_ext_init(struct super_block *); +extern void ext3_ext_release(struct super_block *); +extern void ext3_extents_initialize_blockmap(handle_t *, struct inode *); #endif /* __KERNEL__ */ -Index: linux-2.4.21-suse2/include/linux/ext3_extents.h +Index: linux-2.6.7/include/linux/ext3_extents.h =================================================================== ---- linux-2.4.21-suse2.orig/include/linux/ext3_extents.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-suse2/include/linux/ext3_extents.h 2004-09-12 17:56:01.000000000 +0400 -@@ -0,0 +1,237 @@ +--- linux-2.6.7.orig/include/linux/ext3_extents.h 2003-01-30 13:24:37.000000000 +0300 ++++ linux-2.6.7/include/linux/ext3_extents.h 2004-09-12 18:53:38.000000000 +0400 +@@ -0,0 +1,238 @@ +/* + * Copyright (c) 2003, Cluster File Systems, Inc, info@clusterfs.com + * Written by Alex Tomas <alex@clusterfs.com> @@ -2744,13 +2797,14 @@ Index: linux-2.4.21-suse2/include/linux/ext3_extents.h + int leaf_num; +}; + -+void ext3_init_tree_desc(struct ext3_extents_tree *, struct inode *); +extern int ext3_extent_tree_init(handle_t *, struct ext3_extents_tree *); +extern int ext3_ext_calc_credits_for_insert(struct ext3_extents_tree *, struct ext3_ext_path *); +extern int ext3_ext_insert_extent(handle_t *, struct ext3_extents_tree *, struct ext3_ext_path *, struct ext3_extent *); +extern int ext3_ext_walk_space(struct ext3_extents_tree *, unsigned long, unsigned long, ext_prepare_callback); +extern int ext3_ext_remove_space(struct ext3_extents_tree *, unsigned long, unsigned long); +extern struct ext3_ext_path * ext3_ext_find_extent(struct ext3_extents_tree *, int, struct ext3_ext_path *); ++extern void ext3_init_tree_desc(struct ext3_extents_tree *, struct inode *); ++extern int ext3_ext_calc_blockmap_metadata(struct inode *, int); + +static inline void +ext3_ext_invalidate_cache(struct ext3_extents_tree *tree) @@ -2762,16 +2816,29 @@ Index: linux-2.4.21-suse2/include/linux/ext3_extents.h + +#endif /* _LINUX_EXT3_EXTENTS */ + -Index: linux-2.4.21-suse2/include/linux/ext3_fs_i.h +Index: linux-2.6.7/include/linux/ext3_fs_i.h =================================================================== ---- linux-2.4.21-suse2.orig/include/linux/ext3_fs_i.h 2004-08-19 13:51:48.000000000 +0400 -+++ linux-2.4.21-suse2/include/linux/ext3_fs_i.h 2004-09-12 17:56:01.000000000 +0400 -@@ -90,6 +90,8 @@ - * by other means, so we have truncate_sem. - */ - struct rw_semaphore truncate_sem; -+ -+ __u32 i_cached_extent[3]; +--- linux-2.6.7.orig/include/linux/ext3_fs_i.h 2004-09-12 18:53:35.000000000 +0400 ++++ linux-2.6.7/include/linux/ext3_fs_i.h 2004-09-12 18:53:38.000000000 +0400 +@@ -117,6 +117,8 @@ + struct dynlock i_htree_lock; + struct semaphore i_append_sem; + struct semaphore i_rename_sem; ++ ++ __u32 i_cached_extent[3]; }; #endif /* _LINUX_EXT3_FS_I */ + +%diffstat + fs/ext3/Makefile | 2 + fs/ext3/extents.c | 2306 +++++++++++++++++++++++++++++++++++++++++++ + fs/ext3/ialloc.c | 11 + fs/ext3/inode.c | 29 + fs/ext3/ioctl.c | 4 + fs/ext3/super.c | 16 + include/linux/ext3_extents.h | 238 ++++ + include/linux/ext3_fs.h | 19 + include/linux/ext3_fs_i.h | 2 + 9 files changed, 2618 insertions(+), 9 deletions(-) + diff --git a/lustre/kernel_patches/patches/ext3-extents-in-ea-2.4.20.patch b/lustre/kernel_patches/patches/ext3-extents-in-ea-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-extents-in-ea-2.4.20.patch rename to lustre/kernel_patches/patches/ext3-extents-in-ea-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-extents-in-ea-2.4.21-suse2.patch b/lustre/kernel_patches/patches/ext3-extents-in-ea-2.6.7.patch old mode 100644 new mode 100755 similarity index 77% rename from lustre/kernel_patches/patches/ext3-extents-in-ea-2.4.21-suse2.patch rename to lustre/kernel_patches/patches/ext3-extents-in-ea-2.6.7.patch index 5a7dfd6bd1..3f5e42d641 --- a/lustre/kernel_patches/patches/ext3-extents-in-ea-2.4.21-suse2.patch +++ b/lustre/kernel_patches/patches/ext3-extents-in-ea-2.6.7.patch @@ -1,7 +1,7 @@ -Index: linux-2.4.21-suse2/fs/ext3/extents-in-ea.c +Index: linux-2.6.7/fs/ext3/extents-in-ea.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/extents-in-ea.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-suse2/fs/ext3/extents-in-ea.c 2004-08-19 16:45:44.000000000 +0400 +--- linux-2.6.7.orig/fs/ext3/extents-in-ea.c 2003-01-30 18:24:37.000000000 +0800 ++++ linux-2.6.7/fs/ext3/extents-in-ea.c 2004-08-12 14:31:13.000000000 +0800 @@ -0,0 +1,224 @@ +/* + * Copyright (c) 2003, Cluster File Systems, Inc, info@clusterfs.com @@ -108,8 +108,8 @@ Index: linux-2.4.21-suse2/fs/ext3/extents-in-ea.c + handle = ext3_journal_start(inode, EXT3_ALLOC_NEEDED + 3); + if (IS_ERR(handle)) + return PTR_ERR(handle); -+ if ((err = ext3_xattr_set(handle, inode, name_index, -+ eaname, root, size, 0))) ++ if ((err = ext3_xattr_set(inode, name_index, ++ eaname, root, size, 0))) + goto out; + if ((err = ext3_init_tree_in_ea_desc(&tree, inode, name_index, eaname))) + goto out; @@ -136,7 +136,7 @@ Index: linux-2.4.21-suse2/fs/ext3/extents-in-ea.c + + tgen = EXT_GENERATION(tree); + needed = ext3_ext_calc_credits_for_insert(tree, path); -+ up_write(&EXT3_I(inode)->truncate_sem); ++ up(&EXT3_I(inode)->truncate_sem); + handle = ext3_journal_start(tree->inode, needed + 10); + if (IS_ERR(handle)) { + down_write(&EXT3_I(inode)->truncate_sem); @@ -227,82 +227,23 @@ Index: linux-2.4.21-suse2/fs/ext3/extents-in-ea.c + return err; +} + -Index: linux-2.4.21-suse2/fs/ext3/Makefile +Index: linux-2.6.7/fs/ext3/Makefile =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/Makefile 2004-08-19 13:51:49.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/Makefile 2004-08-19 16:45:44.000000000 +0400 -@@ -19,7 +19,7 @@ - obj-m := $(O_TARGET) +--- linux-2.6.7.orig/fs/ext3/Makefile 2004-08-12 13:42:21.000000000 +0800 ++++ linux-2.6.7/fs/ext3/Makefile 2004-08-12 13:42:23.000000000 +0800 +@@ -7,6 +7,6 @@ + ext3-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ + ioctl.o namei.o super.o symlink.o hash.o extents.o - export-objs += xattr.o --obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o extents-in-ea.o - obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o - obj-$(CONFIG_EXT3_FS_XATTR_TRUSTED) += xattr_trusted.o - obj-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o -Index: linux-2.4.21-suse2/fs/ext3/xattr.c +-ext3-$(CONFIG_EXT3_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o ++ext3-$(CONFIG_EXT3_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o extents-in-ea.o + ext3-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o + ext3-$(CONFIG_EXT3_FS_SECURITY) += xattr_security.o +Index: linux-2.6.7/fs/ext3/xattr.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/xattr.c 2004-08-19 13:51:48.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/xattr.c 2004-08-19 17:12:21.000000000 +0400 -@@ -715,7 +715,8 @@ - return -ERANGE; - - /* try to find attribute in inode body */ -- err = ext3_xattr_ibody_find(inode, name_index, name, &entry, &free1); -+ err = ext3_xattr_ibody_find(inode, name_index, name, -+ &entry, &free1, NULL, NULL); - if (err == 0) { - /* found EA in inode */ - found = 1; -@@ -724,7 +725,7 @@ - /* there is no such attribute in inode body */ - /* try to find attribute in dedicated block */ - err = ext3_xattr_block_find(inode, name_index, name, -- &entry, &free2); -+ &entry, &free2, NULL, NULL); - if (err != 0 && err != -ENOENT) { - /* not found EA in block */ - goto finish; -@@ -780,6 +781,38 @@ - return err; - } - -+int ext3_xattr_get_ea_loc(struct inode *inode, int name_index, -+ const char *name, struct buffer_head **bh, -+ int *offset, int *size) -+ { -+ int free1 = -1, free2 = -1, err, name_len; -+ struct ext3_xattr_entry entry; -+ -+ ea_idebug(inode, "name=%d.%s", name_index, name); -+ -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255) -+ return -ERANGE; -+ -+ down_write(&EXT3_I(inode)->xattr_sem); -+ -+ /* try to find attribute in inode body */ -+ err = ext3_xattr_ibody_find(inode, name_index, name, -+ &entry, &free1, bh, offset); -+ if (err == -ENOENT) { -+ /* there is no such attribute in inode body */ -+ /* try to find attribute in dedicated block */ -+ err = ext3_xattr_block_find(inode, name_index, name, -+ &entry, &free2, bh, offset); -+ } -+ if (err == 0 && size) -+ *size = le32_to_cpu(entry.e_value_size); -+ up_write(&EXT3_I(inode)->xattr_sem); -+ return err; -+ } -+ - /* - * ext3_xattr_block_set() - * -@@ -1183,7 +1216,8 @@ +--- linux-2.6.7.orig/fs/ext3/xattr.c 2004-08-12 13:04:19.000000000 +0800 ++++ linux-2.6.7/fs/ext3/xattr.c 2004-08-12 13:43:10.000000000 +0800 +@@ -680,7 +680,8 @@ */ int ext3_xattr_ibody_find(struct inode *inode, int name_index, @@ -312,7 +253,7 @@ Index: linux-2.4.21-suse2/fs/ext3/xattr.c { struct ext3_xattr_entry *last; struct ext3_inode *raw_inode; -@@ -1230,6 +1264,15 @@ +@@ -727,6 +728,15 @@ name_len == last->e_name_len && !memcmp(name, last->e_name, name_len)) { memcpy(rentry, last, sizeof(struct ext3_xattr_entry)); @@ -328,7 +269,7 @@ Index: linux-2.4.21-suse2/fs/ext3/xattr.c ret = 0; } else { *free -= EXT3_XATTR_LEN(last->e_name_len); -@@ -1250,7 +1293,8 @@ +@@ -747,7 +757,8 @@ */ int ext3_xattr_block_find(struct inode *inode, int name_index, const char *name, @@ -338,7 +279,7 @@ Index: linux-2.4.21-suse2/fs/ext3/xattr.c { struct buffer_head *bh = NULL; struct ext3_xattr_entry *entry; -@@ -1293,6 +1337,12 @@ +@@ -790,6 +801,12 @@ memcmp(name, entry->e_name, name_len) == 0) { memcpy(rentry, entry, sizeof(struct ext3_xattr_entry)); error = 0; @@ -351,15 +292,70 @@ Index: linux-2.4.21-suse2/fs/ext3/xattr.c } else { *free -= EXT3_XATTR_LEN(entry->e_name_len); *free -= le32_to_cpu(entry->e_value_size); -Index: linux-2.4.21-suse2/include/linux/ext3_xattr.h +@@ -984,7 +1001,8 @@ + down_write(&EXT3_I(inode)->xattr_sem); + + /* try to find attribute in inode body */ +- err = ext3_xattr_ibody_find(inode, name_index, name, &entry, &free1); ++ err = ext3_xattr_ibody_find(inode, name_index, name, ++ &entry, &free1, NULL, NULL); + if (err == 0) { + /* found EA in inode */ + found = 1; +@@ -993,7 +1011,7 @@ + /* there is no such attribute in inode body */ + /* try to find attribute in dedicated block */ + err = ext3_xattr_block_find(inode, name_index, name, +- &entry, &free2); ++ &entry, &free2, NULL, NULL); + if (err != 0 && err != -ENOENT) { + /* not found EA in block */ + goto finish; +@@ -1050,6 +1068,35 @@ + return err; + } + ++int ext3_xattr_get_ea_loc(struct inode *inode, int name_index, ++ const char *name, struct buffer_head **bh, ++ int *offset, int *size) ++{ ++ int free1 = -1, free2 = -1, err, name_len; ++ struct ext3_xattr_entry entry; ++ ++ ea_idebug(inode, "name=%d.%s", name_index, name); ++ ++ if (name == NULL) ++ return -EINVAL; ++ name_len = strlen(name); ++ if (name_len > 255) ++ return -ERANGE; ++ ++ /* try to find attribute in inode body */ ++ err = ext3_xattr_ibody_find(inode, name_index, name, ++ &entry, &free1, bh, offset); ++ if (err == -ENOENT) { ++ /* there is no such attribute in inode body */ ++ /* try to find attribute in dedicated block */ ++ err = ext3_xattr_block_find(inode, name_index, name, ++ &entry, &free2, bh, offset); ++ } ++ if (err == 0 && size) ++ *size = le32_to_cpu(entry.e_value_size); ++ return err; ++} ++ + /* + * ext3_xattr_block_set() + * +Index: linux-2.6.7/fs/ext3/xattr.h =================================================================== ---- linux-2.4.21-suse2.orig/include/linux/ext3_xattr.h 2004-08-19 13:50:00.000000000 +0400 -+++ linux-2.4.21-suse2/include/linux/ext3_xattr.h 2004-08-19 16:45:44.000000000 +0400 -@@ -84,6 +84,7 @@ - size_t, int); - extern int ext3_xattr_set(handle_t *, struct inode *, int, const char *, - const void *, size_t, int); -+extern int ext3_xattr_get_ea_loc(struct inode *, int, const char *, struct buffer_head **, int *, int *); +--- linux-2.6.7.orig/fs/ext3/xattr.h 2004-08-12 13:04:19.000000000 +0800 ++++ linux-2.6.7/fs/ext3/xattr.h 2004-08-12 13:42:23.000000000 +0800 +@@ -80,6 +80,7 @@ + extern int ext3_xattr_set_handle(handle_t *, struct inode *, int, const char *,const void *,size_t,int); + extern int ext3_xattr_block_set(handle_t *, struct inode *, int, const char *,const void *,size_t,int); ++extern int ext3_xattr_get_ea_loc(struct inode *, int, const char *, struct buffer_head **, int *, int *); extern void ext3_xattr_delete_inode(handle_t *, struct inode *); extern void ext3_xattr_put_super(struct super_block *); + diff --git a/lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol-2.4.21-suse2.patch b/lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol-2.6.7.patch old mode 100644 new mode 100755 similarity index 64% rename from lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol-2.4.21-suse2.patch rename to lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol-2.6.7.patch index 092abfb320..c2ceb409f4 --- a/lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol-2.4.21-suse2.patch +++ b/lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol-2.6.7.patch @@ -1,7 +1,7 @@ -Index: linux-2.4.21-suse2/fs/ext3/extents-in-ea.c +Index: linux-2.6.7/fs/ext3/extents-in-ea.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/extents-in-ea.c 2004-08-19 16:45:44.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/extents-in-ea.c 2004-08-19 17:17:22.000000000 +0400 +--- linux-2.6.7.orig/fs/ext3/extents-in-ea.c 2004-08-13 08:58:28.000000000 +0800 ++++ linux-2.6.7/fs/ext3/extents-in-ea.c 2004-08-13 08:58:34.000000000 +0800 @@ -115,7 +115,7 @@ kfree(root); return err; @@ -29,7 +29,7 @@ Index: linux-2.4.21-suse2/fs/ext3/extents-in-ea.c int ext3_ext_in_ea_presence(struct inode *inode, int name_index, const char *eaname, unsigned long block) { -@@ -222,3 +222,49 @@ +@@ -331,3 +331,49 @@ return err; } @@ -79,37 +79,15 @@ Index: linux-2.4.21-suse2/fs/ext3/extents-in-ea.c + return err; +} +EXPORT_SYMBOL(ext3_ext_in_ea_get_extents_num); -Index: linux-2.4.21-suse2/fs/ext3/Makefile +Index: linux-2.6.7/fs/ext3/ioctl.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/Makefile 2004-08-19 16:45:44.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/Makefile 2004-08-19 17:18:25.000000000 +0400 -@@ -13,13 +13,16 @@ - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ -- extents.o -+ extents.o extents-in-ea.o - export-objs += extents.o - - obj-m := $(O_TARGET) - - export-objs += xattr.o - obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o extents-in-ea.o -+ifeq ($(CONFIG_EXT3_FS_XATTR),y) -+export-objs += extents-in-ea.o -+endif - obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o - obj-$(CONFIG_EXT3_FS_XATTR_TRUSTED) += xattr_trusted.o - obj-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o -Index: linux-2.4.21-suse2/fs/ext3/ioctl.c -=================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/ioctl.c 2004-08-19 13:51:49.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/ioctl.c 2004-08-19 17:17:22.000000000 +0400 +--- linux-2.6.7.orig/fs/ext3/ioctl.c 2004-08-13 08:58:28.000000000 +0800 ++++ linux-2.6.7/fs/ext3/ioctl.c 2004-08-13 08:58:34.000000000 +0800 @@ -11,6 +11,7 @@ #include <linux/jbd.h> #include <linux/ext3_fs.h> #include <linux/ext3_jbd.h> +#include <linux/ext3_extents.h> - #include <linux/sched.h> + #include <linux/time.h> #include <asm/uaccess.h> diff --git a/lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol.patch b/lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol.patch deleted file mode 100644 index 4cf8fc829f..0000000000 --- a/lustre/kernel_patches/patches/ext3-extents-in-ea-exports-symbol.patch +++ /dev/null @@ -1,134 +0,0 @@ -Index: linux-2.4.20-rh/fs/ext3/extents-in-ea.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/extents-in-ea.c 2004-04-28 13:55:14.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/extents-in-ea.c 2004-04-28 13:56:12.000000000 +0800 -@@ -110,7 +110,7 @@ - kfree(root); - return err; - } -- -+EXPORT_SYMBOL(ext3_init_tree_in_ea); - static int - ext3_ext_in_ea_new_extent(struct ext3_extents_tree *tree, - struct ext3_ext_path *path, -@@ -151,7 +151,7 @@ - } - return err; - } -- -+EXPORT_SYMBOL(ext3_ext_in_ea_alloc_space); - int ext3_ext_in_ea_remove_space(struct inode *inode, int name_index, - const char *eaname, unsigned long from, - unsigned long num) -@@ -166,7 +166,7 @@ - } - return err; - } -- -+EXPORT_SYMBOL(ext3_ext_in_ea_remove_space); - int ext3_ext_in_ea_presence(struct inode *inode, int name_index, - const char *eaname, unsigned long block) - { -@@ -309,3 +309,49 @@ - return err; - } - -+EXPORT_SYMBOL(ext3_ext_in_ea_ioctl); -+int ext3_ext_in_ea_get_extents(struct inode *inode, int name_index, -+ const char *eaname, char **buf, int *size) -+{ -+ /*allocate the buffer and put the extents there*/ -+ struct ext3_extents_tree tree; -+ struct ext3_extent_buf ex_buf; -+ int err; -+ err = ext3_init_tree_in_ea_desc(&tree, inode, name_index, eaname); -+ if (err) -+ goto out; -+ ex_buf.cur = *buf; -+ ex_buf.err = 0; -+ tree.private = &ex_buf; -+ ex_buf.start = 0; -+ -+ err = ext3_ext_walk_space(&tree, ex_buf.start, 0xffffffff, -+ ext3_ext_store_extent_cb); -+ if (err == 0) -+ err = ex_buf.err; -+ ext3_release_tree_in_ea_desc(&tree); -+out: -+ return err; -+} -+EXPORT_SYMBOL(ext3_ext_in_ea_get_extents); -+int ext3_ext_in_ea_get_extents_num(struct inode *inode, int name_index, -+ const char *eaname, int *size) -+{ -+ struct ext3_extents_tree tree; -+ struct ext3_extent_tree_stats stats_buf; -+ int err = 0, ext_num; -+ /*get extents number*/ -+ err = ext3_init_tree_in_ea_desc(&tree, inode, name_index, eaname); -+ if (err) -+ return err; -+ tree.private = &stats_buf; -+ err = ext3_ext_walk_space(&tree, 0, 0xffffffff, -+ ext3_ext_collect_stats_cb); -+ ext_num = stats_buf.extents_num; -+ ext3_release_tree_in_ea_desc(&tree); -+ -+ *size = ext_num * sizeof(struct ext3_extent); -+ -+ return err; -+} -+EXPORT_SYMBOL(ext3_ext_in_ea_get_extents_num); -Index: linux-2.4.20-rh/fs/ext3/Makefile -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/Makefile 2004-04-28 12:42:39.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/Makefile 2004-04-28 13:55:21.000000000 +0800 -@@ -13,13 +13,16 @@ - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ -- xattr_trusted.o extents.o -+ xattr_trusted.o extents.o extents-in-ea.o - export-objs += extents.o - - obj-m := $(O_TARGET) - - export-objs += xattr.o --obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o extents-in-ea.o -+ifeq ($(CONFIG_EXT3_FS_XATTR),y) -+export-objs += extents-in-ea.o -+endif -+obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o - obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o - - include $(TOPDIR)/Rules.make -Index: linux-2.4.20-rh/fs/ext3/ioctl.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/ioctl.c 2004-04-28 13:55:14.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/ioctl.c 2004-04-28 13:55:21.000000000 +0800 -@@ -11,6 +11,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_extents.h> - #include <linux/sched.h> - #include <asm/uaccess.h> - -Index: linux-2.4.20-rh/include/linux/ext3_extents.h -=================================================================== ---- linux-2.4.20-rh.orig/include/linux/ext3_extents.h 2004-04-28 12:42:39.000000000 +0800 -+++ linux-2.4.20-rh/include/linux/ext3_extents.h 2004-04-28 13:55:21.000000000 +0800 -@@ -211,6 +211,12 @@ - extern int ext3_ext_walk_space(struct ext3_extents_tree *, unsigned long, unsigned long, ext_prepare_callback); - extern int ext3_ext_remove_space(struct ext3_extents_tree *, unsigned long, unsigned long); - extern struct ext3_ext_path * ext3_ext_find_extent(struct ext3_extents_tree *, int, struct ext3_ext_path *); -- -+extern int ext3_ext_in_ea_alloc_space(struct inode *inode, int name_index, const char *eaname, unsigned long from, -+ unsigned long num); -+extern int ext3_ext_in_ea_remove_space(struct inode *inode, int name_index, const char *eaname, unsigned long from, -+ unsigned long num); -+extern int ext3_ext_in_ea_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg); -+extern int ext3_ext_in_ea_get_extents(struct inode *inode, int name_index, const char *eaname, char **buf, int *size); -+extern int ext3_ext_in_ea_get_extents_num(struct inode *inode, int name_index, const char *eaname, int *size); - #endif /* _LINUX_EXT3_EXTENTS */ - diff --git a/lustre/kernel_patches/patches/ext3-extents-in-ea-ioctl-2.4.20.patch b/lustre/kernel_patches/patches/ext3-extents-in-ea-ioctl-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-extents-in-ea-ioctl-2.4.20.patch rename to lustre/kernel_patches/patches/ext3-extents-in-ea-ioctl-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-extents-in-ea-ioctl-2.6.7.patch b/lustre/kernel_patches/patches/ext3-extents-in-ea-ioctl-2.6.7.patch new file mode 100755 index 0000000000..35154cc8ef --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-extents-in-ea-ioctl-2.6.7.patch @@ -0,0 +1,228 @@ +Index: linux-2.6.7/fs/ext3/extents-in-ea.c +=================================================================== +--- linux-2.6.7.orig/fs/ext3/extents-in-ea.c 2004-08-12 13:42:23.000000000 +0800 ++++ linux-2.6.7/fs/ext3/extents-in-ea.c 2004-08-12 14:25:29.000000000 +0800 +@@ -27,7 +27,7 @@ + #include <linux/quotaops.h> + #include <linux/string.h> + #include <linux/ext3_extents.h> +-#include <linux/ext3_xattr.h> ++#include "xattr.h" + #include <linux/slab.h> + #include <asm/uaccess.h> + +@@ -111,7 +111,7 @@ + err = ext3_extent_tree_init(handle, &tree); + ext3_release_tree_in_ea_desc(&tree); + out: +- ext3_journal_stop(handle, inode); ++ ext3_journal_stop(handle); + kfree(root); + return err; + } +@@ -134,24 +134,24 @@ + up_write(&EXT3_I(inode)->truncate_sem); + handle = ext3_journal_start(tree->inode, needed + 10); + if (IS_ERR(handle)) { +- down_write(&EXT3_I(inode)->truncate_sem); ++ down(&EXT3_I(inode)->truncate_sem); + return PTR_ERR(handle); + } + + if (tgen != EXT_GENERATION(tree)) { + /* the tree has changed. so path can be invalid at moment */ +- ext3_journal_stop(handle, inode); +- down_write(&EXT3_I(inode)->truncate_sem); ++ ext3_journal_stop(handle); ++ down(&EXT3_I(inode)->truncate_sem); + return EXT_REPEAT; + } + +- down_write(&EXT3_I(inode)->truncate_sem); ++ down(&EXT3_I(inode)->truncate_sem); + + /* insert new extent */ + newex->ee_start = 0; + err = ext3_ext_insert_extent(handle, tree, path, newex); + if (!err) +- ext3_journal_stop(handle, tree->inode); ++ ext3_journal_stop(handle); + + return err; + } +@@ -165,11 +165,11 @@ + + err = ext3_init_tree_in_ea_desc(&tree, inode, name_index, eaname); + if (err == 0) { +- down_write(&EXT3_I(inode)->truncate_sem); ++ down(&EXT3_I(inode)->truncate_sem); + err = ext3_ext_walk_space(&tree, from, num, + ext3_ext_in_ea_new_extent); + ext3_release_tree_in_ea_desc(&tree); +- up_write(&EXT3_I(inode)->truncate_sem); ++ up(&EXT3_I(inode)->truncate_sem); + } + return err; + } +@@ -222,3 +222,112 @@ + return err; + } + ++static int ++ext3_ext_store_extent_cb(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, ++ struct ext3_extent *newex, int exist) ++{ ++ struct ext3_extent_buf *buf = (struct ext3_extent_buf *) tree->private; ++ ++ if (!exist) ++ return EXT_CONTINUE; ++ if (buf->err < 0) ++ return EXT_BREAK; ++ if (buf->cur - buf->buffer + sizeof(*newex) > buf->buflen) ++ return EXT_BREAK; ++ ++ if (!copy_to_user(buf->cur, newex, sizeof(*newex))) { ++ buf->err++; ++ buf->cur += sizeof(*newex); ++ } else { ++ buf->err = -EFAULT; ++ return EXT_BREAK; ++ } ++ return EXT_CONTINUE; ++} ++ ++static int ++ext3_ext_collect_stats_cb(struct ext3_extents_tree *tree, ++ struct ext3_ext_path *path, ++ struct ext3_extent *ex, int exist) ++{ ++ struct ext3_extent_tree_stats *buf = ++ (struct ext3_extent_tree_stats *) tree->private; ++ int depth; ++ ++ if (!exist) ++ return EXT_CONTINUE; ++ ++ depth = EXT_DEPTH(tree); ++ buf->extents_num++; ++ if (path[depth].p_ext == EXT_FIRST_EXTENT(path[depth].p_hdr)) ++ buf->leaf_num++; ++ return EXT_CONTINUE; ++} ++ ++struct ea_tree_desc { ++ int name_index; ++ char eaname[256]; ++}; ++ ++int ext3_ext_in_ea_ioctl(struct inode *inode, struct file *filp, ++ unsigned int cmd, unsigned long arg) ++{ ++ int err = 0; ++ ++ if (cmd == EXT3_IOC_EA_TREE_INIT) { ++ struct ea_tree_desc desc; ++ ++ if (copy_from_user(&desc, (void *) arg, sizeof(desc))) ++ return -EFAULT; ++ err = ext3_init_tree_in_ea(inode, desc.name_index, ++ desc.eaname, 64); ++ } else if (cmd == EXT3_IOC_GET_EA_EXTENTS) { ++ struct ext3_extents_tree tree; ++ struct ext3_extent_buf buf; ++ struct ea_tree_desc desc; ++ ++ if (copy_from_user(&buf, (void *) arg, sizeof(buf))) ++ return -EFAULT; ++ if (copy_from_user(&desc, buf.cur, sizeof(desc))) ++ return -EFAULT; ++ err = ext3_init_tree_in_ea_desc(&tree, inode, ++ desc.name_index, desc.eaname); ++ if (err) ++ goto out; ++ buf.cur = buf.buffer; ++ buf.err = 0; ++ tree.private = &buf; ++ err = ext3_ext_walk_space(&tree, buf.start, EXT_MAX_BLOCK, ++ ext3_ext_store_extent_cb); ++ if (err == 0) ++ err = buf.err; ++ ext3_release_tree_in_ea_desc(&tree); ++ } else if (cmd == EXT3_IOC_EA_TREE_ALLOCATE) { ++ struct ext3_extent_buf buf; ++ struct ea_tree_desc desc; ++ ++ if (copy_from_user(&buf, (void *) arg, sizeof(buf))) ++ return -EFAULT; ++ if (copy_from_user(&desc, buf.cur, sizeof(desc))) ++ return -EFAULT; ++ err = ext3_ext_in_ea_alloc_space(inode, desc.name_index, ++ desc.eaname, buf.start, ++ buf.err); ++ } else if (cmd == EXT3_IOC_EA_TREE_REMOVE) { ++ struct ext3_extent_buf buf; ++ struct ea_tree_desc desc; ++ ++ if (copy_from_user(&buf, (void *) arg, sizeof(buf))) ++ return -EFAULT; ++ if (copy_from_user(&desc, buf.cur, sizeof(desc))) ++ return -EFAULT; ++ err = ext3_ext_in_ea_remove_space(inode, desc.name_index, ++ desc.eaname, buf.start, ++ buf.err); ++ } ++ ++out: ++ return err; ++} ++ +Index: linux-2.6.7/fs/ext3/ioctl.c +=================================================================== +--- linux-2.6.7.orig/fs/ext3/ioctl.c 2004-08-12 13:42:21.000000000 +0800 ++++ linux-2.6.7/fs/ext3/ioctl.c 2004-08-12 13:43:19.000000000 +0800 +@@ -155,6 +155,13 @@ + case EXT3_IOC_GET_TREE_STATS: + case EXT3_IOC_GET_TREE_DEPTH: + return ext3_ext_ioctl(inode, filp, cmd, arg); ++ case EXT3_IOC_GET_EA_EXTENTS: ++ case EXT3_IOC_GET_EA_TREE_DEPTH: ++ case EXT3_IOC_GET_EA_TREE_STATS: ++ case EXT3_IOC_EA_TREE_INIT: ++ case EXT3_IOC_EA_TREE_ALLOCATE: ++ case EXT3_IOC_EA_TREE_REMOVE: ++ return ext3_ext_in_ea_ioctl(inode, filp, cmd, arg); + default: + return -ENOTTY; + } +Index: linux-2.6.7/include/linux/ext3_fs.h +=================================================================== +--- linux-2.6.7.orig/include/linux/ext3_fs.h 2004-08-12 13:42:21.000000000 +0800 ++++ linux-2.6.7/include/linux/ext3_fs.h 2004-08-12 13:43:19.000000000 +0800 +@@ -213,6 +213,14 @@ + #define EXT3_IOC_GET_TREE_DEPTH _IOR('f', 6, long) + #define EXT3_IOC_GET_TREE_STATS _IOR('f', 7, long) + ++#define EXT3_IOC_GET_EA_EXTENTS _IOR('f', 10, long) ++#define EXT3_IOC_GET_EA_TREE_DEPTH _IOR('f', 11, long) ++#define EXT3_IOC_GET_EA_TREE_STATS _IOR('f', 12, long) ++#define EXT3_IOC_EA_TREE_INIT _IOW('f', 13, long) ++#define EXT3_IOC_EA_TREE_ALLOCATE _IOW('f', 14, long) ++#define EXT3_IOC_EA_TREE_REMOVE _IOW('f', 15, long) ++ ++ + /* + * Structure of an inode on the disk + */ +@@ -746,7 +754,10 @@ + /* ioctl.c */ + extern int ext3_ioctl (struct inode *, struct file *, unsigned int, + unsigned long); +- ++extern int ext3_ext_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, ++ unsigned long arg); ++extern int ext3_ext_in_ea_ioctl(struct inode *inode, struct file *filp, ++ unsigned int cmd, unsigned long arg); + /* namei.c */ + extern int ext3_orphan_add(handle_t *, struct inode *); + extern int ext3_orphan_del(handle_t *, struct inode *); diff --git a/lustre/kernel_patches/patches/ext3-htree-2.4.19-pre1.patch b/lustre/kernel_patches/patches/ext3-htree-2.4.19-pre1.patch deleted file mode 100644 index 0806c38912..0000000000 --- a/lustre/kernel_patches/patches/ext3-htree-2.4.19-pre1.patch +++ /dev/null @@ -1,2588 +0,0 @@ - fs/ext3/Makefile | 2 - fs/ext3/dir.c | 302 +++++++++ - fs/ext3/file.c | 3 - fs/ext3/hash.c | 215 ++++++ - fs/ext3/namei.c | 1420 ++++++++++++++++++++++++++++++++++++++++----- - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 85 ++ - include/linux/ext3_fs_sb.h | 2 - include/linux/ext3_jbd.h | 2 - include/linux/rbtree.h | 2 - lib/rbtree.c | 42 + - 11 files changed, 1921 insertions(+), 161 deletions(-) - -Index: linux-2.4.19-pre1/fs/ext3/dir.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/dir.c 2001-11-10 01:25:04.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/dir.c 2003-11-20 23:05:26.000000000 +0300 -@@ -21,12 +21,16 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/slab.h> -+#include <linux/rbtree.h> - - static unsigned char ext3_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK - }; - - static int ext3_readdir(struct file *, void *, filldir_t); -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir); - - struct file_operations ext3_dir_operations = { - read: generic_read_dir, -@@ -35,6 +39,17 @@ - fsync: ext3_sync_file, /* BKL held */ - }; - -+ -+static unsigned char get_dtype(struct super_block *sb, int filetype) -+{ -+ if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || -+ (filetype >= EXT3_FT_MAX)) -+ return DT_UNKNOWN; -+ -+ return (ext3_filetype_table[filetype]); -+} -+ -+ - int ext3_check_dir_entry (const char * function, struct inode * dir, - struct ext3_dir_entry_2 * de, - struct buffer_head * bh, -@@ -79,6 +94,16 @@ - - sb = inode->i_sb; - -+ if (is_dx(inode)) { -+ err = ext3_dx_readdir(filp, dirent, filldir); -+ if (err != ERR_BAD_DX_DIR) -+ return err; -+ /* -+ * We don't set the inode dirty flag since it's not -+ * critical that it get flushed back to the disk. -+ */ -+ EXT3_I(filp->f_dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; -+ } - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); -@@ -162,18 +187,12 @@ - * during the copy operation. - */ - unsigned long version = filp->f_version; -- unsigned char d_type = DT_UNKNOWN; - -- if (EXT3_HAS_INCOMPAT_FEATURE(sb, -- EXT3_FEATURE_INCOMPAT_FILETYPE) -- && de->file_type < EXT3_FT_MAX) -- d_type = -- ext3_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, - le32_to_cpu(de->inode), -- d_type); -+ get_dtype(sb, de->file_type)); - if (error) - break; - if (version != filp->f_version) -@@ -188,3 +207,272 @@ - UPDATE_ATIME(inode); - return 0; - } -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * These functions convert from the major/minor hash to an f_pos -+ * value. -+ * -+ * Currently we only use major hash numer. This is unfortunate, but -+ * on 32-bit machines, the same VFS interface is used for lseek and -+ * llseek, so if we use the 64 bit offset, then the 32-bit versions of -+ * lseek/telldir/seekdir will blow out spectacularly, and from within -+ * the ext2 low-level routine, we don't know if we're being called by -+ * a 64-bit version of the system call or the 32-bit version of the -+ * system call. Worse yet, NFSv2 only allows for a 32-bit readdir -+ * cookie. Sigh. -+ */ -+#define hash2pos(major, minor) (major >> 1) -+#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff) -+#define pos2min_hash(pos) (0) -+ -+/* -+ * This structure holds the nodes of the red-black tree used to store -+ * the directory entry in hash order. -+ */ -+struct fname { -+ __u32 hash; -+ __u32 minor_hash; -+ rb_node_t rb_hash; -+ struct fname *next; -+ __u32 inode; -+ __u8 name_len; -+ __u8 file_type; -+ char name[0]; -+}; -+ -+/* -+ * This functoin implements a non-recursive way of freeing all of the -+ * nodes in the red-black tree. -+ */ -+static void free_rb_tree_fname(rb_root_t *root) -+{ -+ rb_node_t *n = root->rb_node; -+ rb_node_t *parent; -+ struct fname *fname; -+ -+ while (n) { -+ /* Do the node's children first */ -+ if ((n)->rb_left) { -+ n = n->rb_left; -+ continue; -+ } -+ if (n->rb_right) { -+ n = n->rb_right; -+ continue; -+ } -+ /* -+ * The node has no children; free it, and then zero -+ * out parent's link to it. Finally go to the -+ * beginning of the loop and try to free the parent -+ * node. -+ */ -+ parent = n->rb_parent; -+ fname = rb_entry(n, struct fname, rb_hash); -+ kfree(fname); -+ if (!parent) -+ root->rb_node = 0; -+ else if (parent->rb_left == n) -+ parent->rb_left = 0; -+ else if (parent->rb_right == n) -+ parent->rb_right = 0; -+ n = parent; -+ } -+ root->rb_node = 0; -+} -+ -+ -+struct dir_private_info *create_dir_info(loff_t pos) -+{ -+ struct dir_private_info *p; -+ -+ p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL); -+ if (!p) -+ return NULL; -+ p->root.rb_node = 0; -+ p->curr_node = 0; -+ p->extra_fname = 0; -+ p->last_pos = 0; -+ p->curr_hash = pos2maj_hash(pos); -+ p->curr_minor_hash = pos2min_hash(pos); -+ p->next_hash = 0; -+ return p; -+} -+ -+void ext3_htree_free_dir_info(struct dir_private_info *p) -+{ -+ free_rb_tree_fname(&p->root); -+ kfree(p); -+} -+ -+/* -+ * Given a directory entry, enter it into the fname rb tree. -+ */ -+int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent) -+{ -+ rb_node_t **p, *parent = NULL; -+ struct fname * fname, *new_fn; -+ struct dir_private_info *info; -+ int len; -+ -+ info = (struct dir_private_info *) dir_file->private_data; -+ p = &info->root.rb_node; -+ -+ /* Create and allocate the fname structure */ -+ len = sizeof(struct fname) + dirent->name_len + 1; -+ new_fn = kmalloc(len, GFP_KERNEL); -+ if (!new_fn) -+ return -ENOMEM; -+ memset(new_fn, 0, len); -+ new_fn->hash = hash; -+ new_fn->minor_hash = minor_hash; -+ new_fn->inode = le32_to_cpu(dirent->inode); -+ new_fn->name_len = dirent->name_len; -+ new_fn->file_type = dirent->file_type; -+ memcpy(new_fn->name, dirent->name, dirent->name_len); -+ new_fn->name[dirent->name_len] = 0; -+ -+ while (*p) { -+ parent = *p; -+ fname = rb_entry(parent, struct fname, rb_hash); -+ -+ /* -+ * If the hash and minor hash match up, then we put -+ * them on a linked list. This rarely happens... -+ */ -+ if ((new_fn->hash == fname->hash) && -+ (new_fn->minor_hash == fname->minor_hash)) { -+ new_fn->next = fname->next; -+ fname->next = new_fn; -+ return 0; -+ } -+ -+ if (new_fn->hash < fname->hash) -+ p = &(*p)->rb_left; -+ else if (new_fn->hash > fname->hash) -+ p = &(*p)->rb_right; -+ else if (new_fn->minor_hash < fname->minor_hash) -+ p = &(*p)->rb_left; -+ else /* if (new_fn->minor_hash > fname->minor_hash) */ -+ p = &(*p)->rb_right; -+ } -+ -+ rb_link_node(&new_fn->rb_hash, parent, p); -+ rb_insert_color(&new_fn->rb_hash, &info->root); -+ return 0; -+} -+ -+ -+ -+/* -+ * This is a helper function for ext3_dx_readdir. It calls filldir -+ * for all entres on the fname linked list. (Normally there is only -+ * one entry on the linked list, unless there are 62 bit hash collisions.) -+ */ -+static int call_filldir(struct file * filp, void * dirent, -+ filldir_t filldir, struct fname *fname) -+{ -+ struct dir_private_info *info = filp->private_data; -+ loff_t curr_pos; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct super_block * sb; -+ int error; -+ -+ sb = inode->i_sb; -+ -+ if (!fname) { -+ printk("call_filldir: called with null fname?!?\n"); -+ return 0; -+ } -+ curr_pos = hash2pos(fname->hash, fname->minor_hash); -+ while (fname) { -+ error = filldir(dirent, fname->name, -+ fname->name_len, curr_pos, -+ fname->inode, -+ get_dtype(sb, fname->file_type)); -+ if (error) { -+ filp->f_pos = curr_pos; -+ info->extra_fname = fname->next; -+ return error; -+ } -+ fname = fname->next; -+ } -+ return 0; -+} -+ -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir) -+{ -+ struct dir_private_info *info = filp->private_data; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct fname *fname; -+ int ret; -+ -+ if (!info) { -+ info = create_dir_info(filp->f_pos); -+ if (!info) -+ return -ENOMEM; -+ filp->private_data = info; -+ } -+ -+ /* Some one has messed with f_pos; reset the world */ -+ if (info->last_pos != filp->f_pos) { -+ free_rb_tree_fname(&info->root); -+ info->curr_node = 0; -+ info->extra_fname = 0; -+ info->curr_hash = pos2maj_hash(filp->f_pos); -+ info->curr_minor_hash = pos2min_hash(filp->f_pos); -+ } -+ -+ /* -+ * If there are any leftover names on the hash collision -+ * chain, return them first. -+ */ -+ if (info->extra_fname && -+ call_filldir(filp, dirent, filldir, info->extra_fname)) -+ goto finished; -+ -+ if (!info->curr_node) -+ info->curr_node = rb_get_first(&info->root); -+ -+ while (1) { -+ /* -+ * Fill the rbtree if we have no more entries, -+ * or the inode has changed since we last read in the -+ * cached entries. -+ */ -+ if ((!info->curr_node) || -+ (filp->f_version != inode->i_version)) { -+ info->curr_node = 0; -+ free_rb_tree_fname(&info->root); -+ filp->f_version = inode->i_version; -+ ret = ext3_htree_fill_tree(filp, info->curr_hash, -+ info->curr_minor_hash, -+ &info->next_hash); -+ if (ret < 0) -+ return ret; -+ if (ret == 0) -+ break; -+ info->curr_node = rb_get_first(&info->root); -+ } -+ -+ fname = rb_entry(info->curr_node, struct fname, rb_hash); -+ info->curr_hash = fname->hash; -+ info->curr_minor_hash = fname->minor_hash; -+ if (call_filldir(filp, dirent, filldir, fname)) -+ break; -+ -+ info->curr_node = rb_get_next(info->curr_node); -+ if (!info->curr_node) { -+ info->curr_hash = info->next_hash; -+ info->curr_minor_hash = 0; -+ } -+ } -+finished: -+ info->last_pos = filp->f_pos; -+ UPDATE_ATIME(inode); -+ return 0; -+} -+#endif -Index: linux-2.4.19-pre1/fs/ext3/file.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/file.c 2001-11-16 00:37:55.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/file.c 2003-11-20 23:05:26.000000000 +0300 -@@ -35,6 +35,9 @@ - { - if (filp->f_mode & FMODE_WRITE) - ext3_discard_prealloc (inode); -+ if (is_dx(inode) && filp->private_data) -+ ext3_htree_free_dir_info(filp->private_data); -+ - return 0; - } - -Index: linux-2.4.19-pre1/fs/ext3/hash.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/hash.c 2003-11-20 23:05:26.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/hash.c 2003-11-20 23:05:26.000000000 +0300 -@@ -0,0 +1,215 @@ -+/* -+ * linux/fs/ext3/hash.c -+ * -+ * Copyright (C) 2002 by Theodore Ts'o -+ * -+ * This file is released under the GPL v2. -+ * -+ * This file may be redistributed under the terms of the GNU Public -+ * License. -+ */ -+ -+#include <linux/fs.h> -+#include <linux/jbd.h> -+#include <linux/sched.h> -+#include <linux/ext3_fs.h> -+ -+#define DELTA 0x9E3779B9 -+ -+static void TEA_transform(__u32 buf[4], __u32 const in[]) -+{ -+ __u32 sum = 0; -+ __u32 b0 = buf[0], b1 = buf[1]; -+ __u32 a = in[0], b = in[1], c = in[2], d = in[3]; -+ int n = 16; -+ -+ do { -+ sum += DELTA; -+ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); -+ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); -+ } while(--n); -+ -+ buf[0] += b0; -+ buf[1] += b1; -+} -+ -+/* F, G and H are basic MD4 functions: selection, majority, parity */ -+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -+#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -+#define H(x, y, z) ((x) ^ (y) ^ (z)) -+ -+/* -+ * The generic round function. The application is so specific that -+ * we don't bother protecting all the arguments with parens, as is generally -+ * good macro practice, in favor of extra legibility. -+ * Rotation is separate from addition to prevent recomputation -+ */ -+#define ROUND(f, a, b, c, d, x, s) \ -+ (a += f(b, c, d) + x, a = (a << s) | (a >> (32-s))) -+#define K1 0 -+#define K2 013240474631UL -+#define K3 015666365641UL -+ -+/* -+ * Basic cut-down MD4 transform. Returns only 32 bits of result. -+ */ -+static void halfMD4Transform (__u32 buf[4], __u32 const in[]) -+{ -+ __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; -+ -+ /* Round 1 */ -+ ROUND(F, a, b, c, d, in[0] + K1, 3); -+ ROUND(F, d, a, b, c, in[1] + K1, 7); -+ ROUND(F, c, d, a, b, in[2] + K1, 11); -+ ROUND(F, b, c, d, a, in[3] + K1, 19); -+ ROUND(F, a, b, c, d, in[4] + K1, 3); -+ ROUND(F, d, a, b, c, in[5] + K1, 7); -+ ROUND(F, c, d, a, b, in[6] + K1, 11); -+ ROUND(F, b, c, d, a, in[7] + K1, 19); -+ -+ /* Round 2 */ -+ ROUND(G, a, b, c, d, in[1] + K2, 3); -+ ROUND(G, d, a, b, c, in[3] + K2, 5); -+ ROUND(G, c, d, a, b, in[5] + K2, 9); -+ ROUND(G, b, c, d, a, in[7] + K2, 13); -+ ROUND(G, a, b, c, d, in[0] + K2, 3); -+ ROUND(G, d, a, b, c, in[2] + K2, 5); -+ ROUND(G, c, d, a, b, in[4] + K2, 9); -+ ROUND(G, b, c, d, a, in[6] + K2, 13); -+ -+ /* Round 3 */ -+ ROUND(H, a, b, c, d, in[3] + K3, 3); -+ ROUND(H, d, a, b, c, in[7] + K3, 9); -+ ROUND(H, c, d, a, b, in[2] + K3, 11); -+ ROUND(H, b, c, d, a, in[6] + K3, 15); -+ ROUND(H, a, b, c, d, in[1] + K3, 3); -+ ROUND(H, d, a, b, c, in[5] + K3, 9); -+ ROUND(H, c, d, a, b, in[0] + K3, 11); -+ ROUND(H, b, c, d, a, in[4] + K3, 15); -+ -+ buf[0] += a; -+ buf[1] += b; -+ buf[2] += c; -+ buf[3] += d; -+} -+ -+#undef ROUND -+#undef F -+#undef G -+#undef H -+#undef K1 -+#undef K2 -+#undef K3 -+ -+/* The old legacy hash */ -+static __u32 dx_hack_hash (const char *name, int len) -+{ -+ __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9; -+ while (len--) { -+ __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373)); -+ -+ if (hash & 0x80000000) hash -= 0x7fffffff; -+ hash1 = hash0; -+ hash0 = hash; -+ } -+ return (hash0 << 1); -+} -+ -+static void str2hashbuf(const char *msg, int len, __u32 *buf, int num) -+{ -+ __u32 pad, val; -+ int i; -+ -+ pad = (__u32)len | ((__u32)len << 8); -+ pad |= pad << 16; -+ -+ val = pad; -+ if (len > num*4) -+ len = num * 4; -+ for (i=0; i < len; i++) { -+ if ((i % 4) == 0) -+ val = pad; -+ val = msg[i] + (val << 8); -+ if ((i % 4) == 3) { -+ *buf++ = val; -+ val = pad; -+ num--; -+ } -+ } -+ if (--num >= 0) -+ *buf++ = val; -+ while (--num >= 0) -+ *buf++ = pad; -+} -+ -+/* -+ * Returns the hash of a filename. If len is 0 and name is NULL, then -+ * this function can be used to test whether or not a hash version is -+ * supported. -+ * -+ * The seed is an 4 longword (32 bits) "secret" which can be used to -+ * uniquify a hash. If the seed is all zero's, then some default seed -+ * may be used. -+ * -+ * A particular hash version specifies whether or not the seed is -+ * represented, and whether or not the returned hash is 32 bits or 64 -+ * bits. 32 bit hashes will return 0 for the minor hash. -+ */ -+int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) -+{ -+ __u32 hash; -+ __u32 minor_hash = 0; -+ const char *p; -+ int i; -+ __u32 in[8], buf[4]; -+ -+ /* Initialize the default seed for the hash checksum functions */ -+ buf[0] = 0x67452301; -+ buf[1] = 0xefcdab89; -+ buf[2] = 0x98badcfe; -+ buf[3] = 0x10325476; -+ -+ /* Check to see if the seed is all zero's */ -+ if (hinfo->seed) { -+ for (i=0; i < 4; i++) { -+ if (hinfo->seed[i]) -+ break; -+ } -+ if (i < 4) -+ memcpy(buf, hinfo->seed, sizeof(buf)); -+ } -+ -+ switch (hinfo->hash_version) { -+ case DX_HASH_LEGACY: -+ hash = dx_hack_hash(name, len); -+ break; -+ case DX_HASH_HALF_MD4: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 8); -+ halfMD4Transform(buf, in); -+ len -= 32; -+ p += 32; -+ } -+ minor_hash = buf[2]; -+ hash = buf[1]; -+ break; -+ case DX_HASH_TEA: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 4); -+ TEA_transform(buf, in); -+ len -= 16; -+ p += 16; -+ } -+ hash = buf[0]; -+ minor_hash = buf[1]; -+ break; -+ default: -+ hinfo->hash = 0; -+ return -1; -+ } -+ hinfo->hash = hash & ~1; -+ hinfo->minor_hash = minor_hash; -+ return 0; -+} -Index: linux-2.4.19-pre1/fs/ext3/Makefile -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/Makefile 2003-11-20 19:01:58.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/Makefile 2003-11-20 23:05:26.000000000 +0300 -@@ -12,7 +12,7 @@ - export-objs := super.o inode.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o -+ ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - - include $(TOPDIR)/Rules.make -Index: linux-2.4.19-pre1/fs/ext3/namei.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/namei.c 2001-11-10 01:25:04.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/namei.c 2003-11-20 23:22:54.000000000 +0300 -@@ -16,6 +16,12 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 -+ * Hash Tree Directory indexing (c) -+ * Daniel Phillips, 2001 -+ * Hash Tree Directory indexing porting -+ * Christopher Li, 2002 -+ * Hash Tree Directory indexing cleanup -+ * Theodore Ts'o, 2002 - */ - - #include <linux/fs.h> -@@ -38,6 +44,642 @@ - #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) - #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) - -+static struct buffer_head *ext3_append(handle_t *handle, -+ struct inode *inode, -+ u32 *block, int *err) -+{ -+ struct buffer_head *bh; -+ -+ *block = inode->i_size >> inode->i_sb->s_blocksize_bits; -+ -+ if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -+ inode->i_size += inode->i_sb->s_blocksize; -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_journal_get_write_access(handle,bh); -+ } -+ return bh; -+} -+ -+#ifndef assert -+#define assert(test) J_ASSERT(test) -+#endif -+ -+#ifndef swap -+#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0) -+#endif -+ -+typedef struct { u32 v; } le_u32; -+typedef struct { u16 v; } le_u16; -+ -+#ifdef DX_DEBUG -+#define dxtrace(command) command -+#else -+#define dxtrace(command) -+#endif -+ -+struct fake_dirent -+{ -+ /*le*/u32 inode; -+ /*le*/u16 rec_len; -+ u8 name_len; -+ u8 file_type; -+}; -+ -+struct dx_countlimit -+{ -+ le_u16 limit; -+ le_u16 count; -+}; -+ -+struct dx_entry -+{ -+ le_u32 hash; -+ le_u32 block; -+}; -+ -+/* -+ * dx_root_info is laid out so that if it should somehow get overlaid by a -+ * dirent the two low bits of the hash version will be zero. Therefore, the -+ * hash version mod 4 should never be 0. Sincerely, the paranoia department. -+ */ -+ -+struct dx_root -+{ -+ struct fake_dirent dot; -+ char dot_name[4]; -+ struct fake_dirent dotdot; -+ char dotdot_name[4]; -+ struct dx_root_info -+ { -+ le_u32 reserved_zero; -+ u8 hash_version; -+ u8 info_length; /* 8 */ -+ u8 indirect_levels; -+ u8 unused_flags; -+ } -+ info; -+ struct dx_entry entries[0]; -+}; -+ -+struct dx_node -+{ -+ struct fake_dirent fake; -+ struct dx_entry entries[0]; -+}; -+ -+ -+struct dx_frame -+{ -+ struct buffer_head *bh; -+ struct dx_entry *entries; -+ struct dx_entry *at; -+}; -+ -+struct dx_map_entry -+{ -+ u32 hash; -+ u32 offs; -+}; -+ -+#ifdef CONFIG_EXT3_INDEX -+static inline unsigned dx_get_block (struct dx_entry *entry); -+static void dx_set_block (struct dx_entry *entry, unsigned value); -+static inline unsigned dx_get_hash (struct dx_entry *entry); -+static void dx_set_hash (struct dx_entry *entry, unsigned value); -+static unsigned dx_get_count (struct dx_entry *entries); -+static unsigned dx_get_limit (struct dx_entry *entries); -+static void dx_set_count (struct dx_entry *entries, unsigned value); -+static void dx_set_limit (struct dx_entry *entries, unsigned value); -+static unsigned dx_root_limit (struct inode *dir, unsigned infosize); -+static unsigned dx_node_limit (struct inode *dir); -+static struct dx_frame *dx_probe(struct dentry *dentry, -+ struct inode *dir, -+ struct dx_hash_info *hinfo, -+ struct dx_frame *frame, -+ int *err); -+static void dx_release (struct dx_frame *frames); -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry map[]); -+static void dx_sort_map(struct dx_map_entry *map, unsigned count); -+static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, -+ struct dx_map_entry *offsets, int count); -+static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); -+static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash); -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err); -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode); -+ -+/* -+ * Future: use high four bits of block for coalesce-on-delete flags -+ * Mask them off for now. -+ */ -+ -+static inline unsigned dx_get_block (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->block.v) & 0x00ffffff; -+} -+ -+static inline void dx_set_block (struct dx_entry *entry, unsigned value) -+{ -+ entry->block.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_hash (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->hash.v); -+} -+ -+static inline void dx_set_hash (struct dx_entry *entry, unsigned value) -+{ -+ entry->hash.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_count (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->count.v); -+} -+ -+static inline unsigned dx_get_limit (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->limit.v); -+} -+ -+static inline void dx_set_count (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->count.v = cpu_to_le16(value); -+} -+ -+static inline void dx_set_limit (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->limit.v = cpu_to_le16(value); -+} -+ -+static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - -+ EXT3_DIR_REC_LEN(2) - infosize; -+ return 0? 20: entry_space / sizeof(struct dx_entry); -+} -+ -+static inline unsigned dx_node_limit (struct inode *dir) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); -+ return 0? 22: entry_space / sizeof(struct dx_entry); -+} -+ -+/* -+ * Debug -+ */ -+#ifdef DX_DEBUG -+struct stats -+{ -+ unsigned names; -+ unsigned space; -+ unsigned bcount; -+}; -+ -+static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, -+ int size, int show_names) -+{ -+ unsigned names = 0, space = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ printk("names: "); -+ while ((char *) de < base + size) -+ { -+ if (de->inode) -+ { -+ if (show_names) -+ { -+ int len = de->name_len; -+ char *name = de->name; -+ while (len--) printk("%c", *name++); -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ printk(":%x.%u ", h.hash, -+ ((char *) de - base)); -+ } -+ space += EXT3_DIR_REC_LEN(de->name_len); -+ names++; -+ } -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ printk("(%i)\n", names); -+ return (struct stats) { names, space, 1 }; -+} -+ -+struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, -+ struct dx_entry *entries, int levels) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count = dx_get_count (entries), names = 0, space = 0, i; -+ unsigned bcount = 0; -+ struct buffer_head *bh; -+ int err; -+ printk("%i indexed blocks...\n", count); -+ for (i = 0; i < count; i++, entries++) -+ { -+ u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; -+ u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; -+ struct stats stats; -+ printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); -+ if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; -+ stats = levels? -+ dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): -+ dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); -+ names += stats.names; -+ space += stats.space; -+ bcount += stats.bcount; -+ brelse (bh); -+ } -+ if (bcount) -+ printk("%snames %u, fullness %u (%u%%)\n", levels?"":" ", -+ names, space/bcount,(space/bcount)*100/blocksize); -+ return (struct stats) { names, space, bcount}; -+} -+#endif /* DX_DEBUG */ -+ -+/* -+ * Probe for a directory leaf block to search. -+ * -+ * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -+ * error in the directory index, and the caller should fall back to -+ * searching the directory normally. The callers of dx_probe **MUST** -+ * check for this error code, and make sure it never gets reflected -+ * back to userspace. -+ */ -+static struct dx_frame * -+dx_probe(struct dentry *dentry, struct inode *dir, -+ struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) -+{ -+ unsigned count, indirect; -+ struct dx_entry *at, *entries, *p, *q, *m; -+ struct dx_root *root; -+ struct buffer_head *bh; -+ struct dx_frame *frame = frame_in; -+ u32 hash; -+ -+ frame->bh = NULL; -+ if (dentry) -+ dir = dentry->d_parent->d_inode; -+ if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) -+ goto fail; -+ root = (struct dx_root *) bh->b_data; -+ if (root->info.hash_version != DX_HASH_TEA && -+ root->info.hash_version != DX_HASH_HALF_MD4 && -+ root->info.hash_version != DX_HASH_LEGACY) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unrecognised inode hash code %d", -+ root->info.hash_version); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ hinfo->hash_version = root->info.hash_version; -+ hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ if (dentry) -+ ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ hash = hinfo->hash; -+ -+ if (root->info.unused_flags & 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash flags: %#06x", -+ root->info.unused_flags); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ if ((indirect = root->info.indirect_levels) > 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash depth: %#06x", -+ root->info.indirect_levels); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ while (1) -+ { -+ count = dx_get_count(entries); -+ assert (count && count <= dx_get_limit(entries)); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ dxtrace(printk(".")); -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ -+ if (0) // linear search cross check -+ { -+ unsigned n = count - 1; -+ at = entries; -+ while (n--) -+ { -+ dxtrace(printk(",")); -+ if (dx_get_hash(++at) > hash) -+ { -+ at--; -+ break; -+ } -+ } -+ assert (at == p - 1); -+ } -+ -+ at = p - 1; -+ dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ frame->bh = bh; -+ frame->entries = entries; -+ frame->at = at; -+ if (!indirect--) return frame; -+ if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ goto fail2; -+ at = entries = ((struct dx_node *) bh->b_data)->entries; -+ assert (dx_get_limit(entries) == dx_node_limit (dir)); -+ frame++; -+ } -+fail2: -+ while (frame >= frame_in) { -+ brelse(frame->bh); -+ frame--; -+ } -+fail: -+ return NULL; -+} -+ -+static void dx_release (struct dx_frame *frames) -+{ -+ if (frames[0].bh == NULL) -+ return; -+ -+ if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ brelse(frames[1].bh); -+ brelse(frames[0].bh); -+} -+ -+/* -+ * This function increments the frame pointer to search the next leaf -+ * block, and reads in the necessary intervening nodes if the search -+ * should be necessary. Whether or not the search is necessary is -+ * controlled by the hash parameter. If the hash value is even, then -+ * the search is only continued if the next block starts with that -+ * hash value. This is used if we are searching for a specific file. -+ * -+ * If the hash value is HASH_NB_ALWAYS, then always go to the next block. -+ * -+ * This function returns 1 if the caller should continue to search, -+ * or 0 if it should not. If there is an error reading one of the -+ * index blocks, it will return -1. -+ * -+ * If start_hash is non-null, it will be filled in with the starting -+ * hash of the next page. -+ */ -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash) -+{ -+ struct dx_frame *p; -+ struct buffer_head *bh; -+ int num_frames = 0; -+ __u32 bhash; -+ -+ *err = ENOENT; -+ p = frame; -+ /* -+ * Find the next leaf page by incrementing the frame pointer. -+ * If we run out of entries in the interior node, loop around and -+ * increment pointer in the parent node. When we break out of -+ * this loop, num_frames indicates the number of interior -+ * nodes need to be read. -+ */ -+ while (1) { -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ break; -+ if (p == frames) -+ return 0; -+ num_frames++; -+ p--; -+ } -+ -+ /* -+ * If the hash is 1, then continue only if the next page has a -+ * continuation hash of any value. This is used for readdir -+ * handling. Otherwise, check to see if the hash matches the -+ * desired contiuation hash. If it doesn't, return since -+ * there's no point to read in the successive index pages. -+ */ -+ bhash = dx_get_hash(p->at); -+ if (start_hash) -+ *start_hash = bhash; -+ if ((hash & 1) == 0) { -+ if ((bhash & ~1) != hash) -+ return 0; -+ } -+ /* -+ * If the hash is HASH_NB_ALWAYS, we always go to the next -+ * block so no check is necessary -+ */ -+ while (num_frames--) { -+ if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -+ 0, err))) -+ return -1; /* Failure */ -+ p++; -+ brelse (p->bh); -+ p->bh = bh; -+ p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ } -+ return 1; -+} -+ -+ -+/* -+ * p is at least 6 bytes before the end of page -+ */ -+static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) -+{ -+ return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); -+} -+ -+/* -+ * This function fills a red-black tree with information from a -+ * directory. We start scanning the directory in hash order, starting -+ * at start_hash and start_minor_hash. -+ * -+ * This function returns the number of entries inserted into the tree, -+ * or a negative error code. -+ */ -+int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash) -+{ -+ struct dx_hash_info hinfo; -+ struct buffer_head *bh; -+ struct ext3_dir_entry_2 *de, *top; -+ static struct dx_frame frames[2], *frame; -+ struct inode *dir; -+ int block, err; -+ int count = 0; -+ int ret; -+ __u32 hashval; -+ -+ dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, -+ start_minor_hash)); -+ dir = dir_file->f_dentry->d_inode; -+ hinfo.hash = start_hash; -+ hinfo.minor_hash = 0; -+ frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ -+ /* Add '.' and '..' from the htree header */ -+ if (!start_hash && !start_minor_hash) { -+ de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; -+ de = ext3_next_entry(de); -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; -+ count += 2; -+ } -+ -+ while (1) { -+ block = dx_get_block(frame->at); -+ dxtrace(printk("Reading block %d\n", block)); -+ if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) -+ goto errout; -+ -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) { -+ ext3fs_dirhash(de->name, de->name_len, &hinfo); -+ if ((hinfo.hash < start_hash) || -+ ((hinfo.hash == start_hash) && -+ (hinfo.minor_hash < start_minor_hash))) -+ continue; -+ if ((err = ext3_htree_store_dirent(dir_file, -+ hinfo.hash, hinfo.minor_hash, de)) != 0) -+ goto errout; -+ count++; -+ } -+ brelse (bh); -+ hashval = ~1; -+ ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, -+ frame, frames, &err, &hashval); -+ if (next_hash) -+ *next_hash = hashval; -+ if (ret == -1) -+ goto errout; -+ /* -+ * Stop if: (a) there are no more entries, or -+ * (b) we have inserted at least one entry and the -+ * next hash value is not a continuation -+ */ -+ if ((ret == 0) || -+ (count && ((hashval & 1) == 0))) -+ break; -+ } -+ dx_release(frames); -+ dxtrace(printk("Fill tree: returned %d entries\n", count)); -+ return count; -+errout: -+ dx_release(frames); -+ return (err); -+} -+ -+ -+/* -+ * Directory block splitting, compacting -+ */ -+ -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) -+{ -+ int count = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ while ((char *) de < base + size) -+ { -+ if (de->name_len && de->inode) { -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ map_tail--; -+ map_tail->hash = h.hash; -+ map_tail->offs = (u32) ((char *) de - base); -+ count++; -+ } -+ /* XXX: do we need to check rec_len == 0 case? -Chris */ -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ return count; -+} -+ -+static void dx_sort_map (struct dx_map_entry *map, unsigned count) -+{ -+ struct dx_map_entry *p, *q, *top = map + count - 1; -+ int more; -+ /* Combsort until bubble sort doesn't suck */ -+ while (count > 2) -+ { -+ count = count*10/13; -+ if (count - 9 < 2) /* 9, 10 -> 11 */ -+ count = 11; -+ for (p = top, q = p - count; q >= map; p--, q--) -+ if (p->hash < q->hash) -+ swap(*p, *q); -+ } -+ /* Garden variety bubble sort */ -+ do { -+ more = 0; -+ q = top; -+ while (q-- > map) -+ { -+ if (q[1].hash >= q[0].hash) -+ continue; -+ swap(*(q+1), *q); -+ more = 1; -+ } -+ } while(more); -+} -+ -+static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+{ -+ struct dx_entry *entries = frame->entries; -+ struct dx_entry *old = frame->at, *new = old + 1; -+ int count = dx_get_count(entries); -+ -+ assert(count < dx_get_limit(entries)); -+ assert(old < entries + count); -+ memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); -+ dx_set_hash(new, hash); -+ dx_set_block(new, block); -+ dx_set_count(entries, count + 1); -+} -+#endif -+ -+ -+static void ext3_update_dx_flag(struct inode *inode) -+{ -+ if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, -+ EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; -+} -+ - /* - * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. - * -@@ -94,6 +736,7 @@ - return 0; - } - -+ - /* - * ext3_find_entry() - * -@@ -105,6 +748,8 @@ - * The returned buffer_head has ->b_count elevated. The caller is expected - * to brelse() it when appropriate. - */ -+ -+ - static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) - { -@@ -119,12 +764,32 @@ - int num = 0; - int nblocks, i, err; - struct inode *dir = dentry->d_parent->d_inode; -+ int namelen; -+ const u8 *name; -+ unsigned blocksize; - - *res_dir = NULL; - sb = dir->i_sb; -- -+ blocksize = sb->s_blocksize; -+ namelen = dentry->d_name.len; -+ name = dentry->d_name.name; -+ if (namelen > EXT3_NAME_LEN) -+ return NULL; -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ /* -+ * On success, or if the error was file not found, -+ * return. Otherwise, fall back to doing a search the -+ * old fashioned way. -+ */ -+ if (bh || (err != ERR_BAD_DX_DIR)) -+ return bh; -+ dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ } -+#endif - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); -- start = dir->u.ext3_i.i_dir_start_lookup; -+ start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) - start = 0; - block = start; -@@ -165,7 +830,7 @@ - i = search_dirblock(bh, dir, dentry, - block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); - if (i == 1) { -- dir->u.ext3_i.i_dir_start_lookup = block; -+ EXT3_I(dir)->i_dir_start_lookup = block; - ret = bh; - goto cleanup_and_exit; - } else { -@@ -196,6 +861,66 @@ - return ret; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err) -+{ -+ struct super_block * sb; -+ struct dx_hash_info hinfo; -+ u32 hash; -+ struct dx_frame frames[2], *frame; -+ struct ext3_dir_entry_2 *de, *top; -+ struct buffer_head *bh; -+ unsigned long block; -+ int retval; -+ int namelen = dentry->d_name.len; -+ const u8 *name = dentry->d_name.name; -+ struct inode *dir = dentry->d_parent->d_inode; -+ -+ sb = dir->i_sb; -+ if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+ return NULL; -+ hash = hinfo.hash; -+ do { -+ block = dx_get_block(frame->at); -+ if (!(bh = ext3_bread (NULL,dir, block, 0, err))) -+ goto errout; -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) -+ if (ext3_match (namelen, name, de)) { -+ if (!ext3_check_dir_entry("ext3_find_entry", -+ dir, de, bh, -+ (block<<EXT3_BLOCK_SIZE_BITS(sb)) -+ +((char *)de - bh->b_data))) { -+ brelse (bh); -+ goto errout; -+ } -+ *res_dir = de; -+ dx_release (frames); -+ return bh; -+ } -+ brelse (bh); -+ /* Check to see if we should continue to search */ -+ retval = ext3_htree_next_block(dir, hash, frame, -+ frames, err, 0); -+ if (retval == -1) { -+ ext3_warning(sb, __FUNCTION__, -+ "error reading index page in directory #%lu", -+ dir->i_ino); -+ goto errout; -+ } -+ } while (retval == 1); -+ -+ *err = -ENOENT; -+errout: -+ dxtrace(printk("%s not found\n", name)); -+ dx_release (frames); -+ return NULL; -+} -+#endif -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -212,8 +937,9 @@ - brelse (bh); - inode = iget(dir->i_sb, ino); - -- if (!inode) -+ if (!inode) { - return ERR_PTR(-EACCES); -+ } - } - d_add(dentry, inode); - return NULL; -@@ -237,6 +963,301 @@ - de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct ext3_dir_entry_2 * -+dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) -+{ -+ unsigned rec_len = 0; -+ -+ while (count--) { -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); -+ de->inode = 0; -+ map++; -+ to += rec_len; -+ } -+ return (struct ext3_dir_entry_2 *) (to - rec_len); -+} -+ -+static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) -+{ -+ struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ unsigned rec_len = 0; -+ -+ prev = to = de; -+ while ((char*)de < base + size) { -+ next = (struct ext3_dir_entry_2 *) ((char *) de + -+ le16_to_cpu(de->rec_len)); -+ if (de->inode && de->name_len) { -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ if (de > to) -+ memmove(to, de, rec_len); -+ to->rec_len = cpu_to_le16(rec_len); -+ prev = to; -+ to = (struct ext3_dir_entry_2 *)((char *)to + rec_len); -+ } -+ de = next; -+ } -+ return prev; -+} -+ -+static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, -+ struct buffer_head **bh,struct dx_frame *frame, -+ struct dx_hash_info *hinfo, int *error) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count, continued; -+ struct buffer_head *bh2; -+ u32 newblock; -+ u32 hash2; -+ struct dx_map_entry *map; -+ char *data1 = (*bh)->b_data, *data2; -+ unsigned split; -+ struct ext3_dir_entry_2 *de = NULL, *de2; -+ int err; -+ -+ bh2 = ext3_append (handle, dir, &newblock, error); -+ if (!(bh2)) { -+ brelse(*bh); -+ *bh = NULL; -+ goto errout; -+ } -+ -+ BUFFER_TRACE(*bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, *bh); -+ if (err) { -+ journal_error: -+ brelse(*bh); -+ brelse(bh2); -+ *bh = NULL; -+ ext3_std_error(dir->i_sb, err); -+ goto errout; -+ } -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ -+ data2 = bh2->b_data; -+ -+ /* create map in the end of data2 block */ -+ map = (struct dx_map_entry *) (data2 + blocksize); -+ count = dx_make_map ((struct ext3_dir_entry_2 *) data1, -+ blocksize, hinfo, map); -+ map -= count; -+ split = count/2; // need to adjust to actual middle -+ dx_sort_map (map, count); -+ hash2 = map[split].hash; -+ continued = hash2 == map[split - 1].hash; -+ dxtrace(printk("Split block %i at %x, %i/%i\n", -+ dx_get_block(frame->at), hash2, split, count-split)); -+ -+ /* Fancy dance to stay within two buffers */ -+ de2 = dx_move_dirents(data1, data2, map + split, count - split); -+ de = dx_pack_dirents(data1,blocksize); -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ -+ /* Which block gets the new entry? */ -+ if (hinfo->hash >= hash2) -+ { -+ swap(*bh, bh2); -+ de = de2; -+ } -+ dx_insert_block (frame, hash2 + continued, newblock); -+ err = ext3_journal_dirty_metadata (handle, bh2); -+ if (err) -+ goto journal_error; -+ err = ext3_journal_dirty_metadata (handle, frame->bh); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ dxtrace(dx_show_index ("frame", frame->entries)); -+errout: -+ return de; -+} -+#endif -+ -+ -+/* -+ * Add a new entry into a directory (leaf) block. If de is non-NULL, -+ * it points to a directory entry which is guaranteed to be large -+ * enough for new directory entry. If de is NULL, then -+ * add_dirent_to_buf will attempt search the directory block for -+ * space. It will return -ENOSPC if no space is available, and -EIO -+ * and -EEXIST if directory entry already exists. -+ * -+ * NOTE! bh is NOT released in the case where ENOSPC is returned. In -+ * all other cases bh is released. -+ */ -+static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct ext3_dir_entry_2 *de, -+ struct buffer_head * bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ unsigned long offset = 0; -+ unsigned short reclen; -+ int nlen, rlen, err; -+ char *top; -+ -+ reclen = EXT3_DIR_REC_LEN(namelen); -+ if (!de) { -+ de = (struct ext3_dir_entry_2 *)bh->b_data; -+ top = bh->b_data + dir->i_sb->s_blocksize - reclen; -+ while ((char *) de <= top) { -+ if (!ext3_check_dir_entry("ext3_add_entry", dir, de, -+ bh, offset)) { -+ brelse (bh); -+ return -EIO; -+ } -+ if (ext3_match (namelen, name, de)) { -+ brelse (bh); -+ return -EEXIST; -+ } -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if ((de->inode? rlen - nlen: rlen) >= reclen) -+ break; -+ de = (struct ext3_dir_entry_2 *)((char *)de + rlen); -+ offset += rlen; -+ } -+ if ((char *) de > top) -+ return -ENOSPC; -+ } -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) { -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return err; -+ } -+ -+ /* By now the buffer is marked for journaling */ -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if (de->inode) { -+ struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ de1->rec_len = cpu_to_le16(rlen - nlen); -+ de->rec_len = cpu_to_le16(nlen); -+ de = de1; -+ } -+ de->file_type = EXT3_FT_UNKNOWN; -+ if (inode) { -+ de->inode = cpu_to_le32(inode->i_ino); -+ ext3_set_de_type(dir->i_sb, de, inode->i_mode); -+ } else -+ de->inode = 0; -+ de->name_len = namelen; -+ memcpy (de->name, name, namelen); -+ /* -+ * XXX shouldn't update any times until successful -+ * completion of syscall, but too many callers depend -+ * on this. -+ * -+ * XXX similarly, too many callers depend on -+ * ext3_new_inode() setting the times, but error -+ * recovery deletes the inode, so the worst that can -+ * happen is that the times are slightly out of date -+ * and/or different from the directory change time. -+ */ -+ dir->i_mtime = dir->i_ctime = CURRENT_TIME; -+ ext3_update_dx_flag(dir); -+ dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return 0; -+} -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * This converts a one block unindexed directory to a 3 block indexed -+ * directory, and adds the dentry to the indexed directory. -+ */ -+static int make_indexed_dir(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct buffer_head *bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ struct buffer_head *bh2; -+ struct dx_root *root; -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries; -+ struct ext3_dir_entry_2 *de, *de2; -+ char *data1, *top; -+ unsigned len; -+ int retval; -+ unsigned blocksize; -+ struct dx_hash_info hinfo; -+ u32 block; -+ -+ blocksize = dir->i_sb->s_blocksize; -+ dxtrace(printk("Creating index\n")); -+ retval = ext3_journal_get_write_access(handle, bh); -+ if (retval) { -+ ext3_std_error(dir->i_sb, retval); -+ brelse(bh); -+ return retval; -+ } -+ root = (struct dx_root *) bh->b_data; -+ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ bh2 = ext3_append (handle, dir, &block, &retval); -+ if (!(bh2)) { -+ brelse(bh); -+ return retval; -+ } -+ data1 = bh2->b_data; -+ -+ /* The 0th block becomes the root, move the dirents out */ -+ de = (struct ext3_dir_entry_2 *)&root->dotdot; -+ de = (struct ext3_dir_entry_2 *)((char *)de + le16_to_cpu(de->rec_len)); -+ len = ((char *) root) + blocksize - (char *) de; -+ memcpy (data1, de, len); -+ de = (struct ext3_dir_entry_2 *) data1; -+ top = data1 + len; -+ while (((char *) de2=(char*)de+le16_to_cpu(de->rec_len)) < top) -+ de = de2; -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ /* Initialize the root; the dot dirents already exist */ -+ de = (struct ext3_dir_entry_2 *) (&root->dotdot); -+ de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); -+ memset (&root->info, 0, sizeof(root->info)); -+ root->info.info_length = sizeof(root->info); -+ root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ entries = root->entries; -+ dx_set_block (entries, 1); -+ dx_set_count (entries, 1); -+ dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info))); -+ -+ /* Initialize as for dx_probe */ -+ hinfo.hash_version = root->info.hash_version; -+ hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ ext3fs_dirhash(name, namelen, &hinfo); -+ frame = frames; -+ frame->entries = entries; -+ frame->at = entries; -+ frame->bh = bh; -+ bh = bh2; -+ de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ dx_release (frames); -+ if (!(de)) -+ return retval; -+ -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} -+#endif -+ - /* - * ext3_add_entry() - * -@@ -247,127 +1268,198 @@ - * may not sleep between calling this and putting something into - * the entry, as someone else might have used it while you slept. - */ -- --/* -- * AKPM: the journalling code here looks wrong on the error paths -- */ - static int ext3_add_entry (handle_t *handle, struct dentry *dentry, - struct inode *inode) - { - struct inode *dir = dentry->d_parent->d_inode; -- const char *name = dentry->d_name.name; -- int namelen = dentry->d_name.len; - unsigned long offset; -- unsigned short rec_len; - struct buffer_head * bh; -- struct ext3_dir_entry_2 * de, * de1; -+ struct ext3_dir_entry_2 *de; - struct super_block * sb; - int retval; -+#ifdef CONFIG_EXT3_INDEX -+ int dx_fallback=0; -+#endif -+ unsigned blocksize; -+ unsigned nlen, rlen; -+ u32 block, blocks; - - sb = dir->i_sb; -- -- if (!namelen) -+ blocksize = sb->s_blocksize; -+ if (!dentry->d_name.len) - return -EINVAL; -- bh = ext3_bread (handle, dir, 0, 0, &retval); -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ retval = ext3_dx_add_entry(handle, dentry, inode); -+ if (!retval || (retval != ERR_BAD_DX_DIR)) -+ return retval; -+ EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; -+ dx_fallback++; -+ ext3_mark_inode_dirty(handle, dir); -+ } -+#endif -+ blocks = dir->i_size >> sb->s_blocksize_bits; -+ for (block = 0, offset = 0; block < blocks; block++) { -+ bh = ext3_bread(handle, dir, block, 0, &retval); -+ if(!bh) -+ return retval; -+ retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (retval != -ENOSPC) -+ return retval; -+ -+#ifdef CONFIG_EXT3_INDEX -+ if (blocks == 1 && !dx_fallback && -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ return make_indexed_dir(handle, dentry, inode, bh); -+#endif -+ brelse(bh); -+ } -+ bh = ext3_append(handle, dir, &block, &retval); - if (!bh) - return retval; -- rec_len = EXT3_DIR_REC_LEN(namelen); -- offset = 0; - de = (struct ext3_dir_entry_2 *) bh->b_data; -- while (1) { -- if ((char *)de >= sb->s_blocksize + bh->b_data) { -- brelse (bh); -- bh = NULL; -- bh = ext3_bread (handle, dir, -- offset >> EXT3_BLOCK_SIZE_BITS(sb), 1, &retval); -- if (!bh) -- return retval; -- if (dir->i_size <= offset) { -- if (dir->i_size == 0) { -- brelse(bh); -- return -ENOENT; -- } -+ de->inode = 0; -+ de->rec_len = cpu_to_le16(rlen = blocksize); -+ nlen = 0; -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} - -- ext3_debug ("creating next block\n"); -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * Returns 0 for success, or a negative error value -+ */ -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries, *at; -+ struct dx_hash_info hinfo; -+ struct buffer_head * bh; -+ struct inode *dir = dentry->d_parent->d_inode; -+ struct super_block * sb = dir->i_sb; -+ struct ext3_dir_entry_2 *de; -+ int err; - -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- de->inode = 0; -- de->rec_len = le16_to_cpu(sb->s_blocksize); -- dir->u.ext3_i.i_disksize = -- dir->i_size = offset + sb->s_blocksize; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); -- } else { -+ frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ entries = frame->entries; -+ at = frame->at; - -- ext3_debug ("skipping to next block\n"); -+ if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ goto cleanup; - -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- } -- } -- if (!ext3_check_dir_entry ("ext3_add_entry", dir, de, bh, -- offset)) { -- brelse (bh); -- return -ENOENT; -- } -- if (ext3_match (namelen, name, de)) { -- brelse (bh); -- return -EEXIST; -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto journal_error; -+ -+ err = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (err != -ENOSPC) { -+ bh = 0; -+ goto cleanup; -+ } -+ -+ /* Block full, should compress but for now just split */ -+ dxtrace(printk("using %u of %u node entries\n", -+ dx_get_count(entries), dx_get_limit(entries))); -+ /* Need to split index? */ -+ if (dx_get_count(entries) == dx_get_limit(entries)) { -+ u32 newblock; -+ unsigned icount = dx_get_count(entries); -+ int levels = frame - frames; -+ struct dx_entry *entries2; -+ struct dx_node *node2; -+ struct buffer_head *bh2; -+ -+ if (levels && (dx_get_count(frames->entries) == -+ dx_get_limit(frames->entries))) { -+ ext3_warning(sb, __FUNCTION__, -+ "Directory index full!\n"); -+ err = -ENOSPC; -+ goto cleanup; - } -- if ((le32_to_cpu(de->inode) == 0 && -- le16_to_cpu(de->rec_len) >= rec_len) || -- (le16_to_cpu(de->rec_len) >= -- EXT3_DIR_REC_LEN(de->name_len) + rec_len)) { -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- /* By now the buffer is marked for journaling */ -- offset += le16_to_cpu(de->rec_len); -- if (le32_to_cpu(de->inode)) { -- de1 = (struct ext3_dir_entry_2 *) ((char *) de + -- EXT3_DIR_REC_LEN(de->name_len)); -- de1->rec_len = -- cpu_to_le16(le16_to_cpu(de->rec_len) - -- EXT3_DIR_REC_LEN(de->name_len)); -- de->rec_len = cpu_to_le16( -- EXT3_DIR_REC_LEN(de->name_len)); -- de = de1; -+ bh2 = ext3_append (handle, dir, &newblock, &err); -+ if (!(bh2)) -+ goto cleanup; -+ node2 = (struct dx_node *)(bh2->b_data); -+ entries2 = node2->entries; -+ node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -+ node2->fake.inode = 0; -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ if (levels) { -+ unsigned icount1 = icount/2, icount2 = icount - icount1; -+ unsigned hash2 = dx_get_hash(entries + icount1); -+ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ err = ext3_journal_get_write_access(handle, -+ frames[0].bh); -+ if (err) -+ goto journal_error; -+ -+ memcpy ((char *) entries2, (char *) (entries + icount1), -+ icount2 * sizeof(struct dx_entry)); -+ dx_set_count (entries, icount1); -+ dx_set_count (entries2, icount2); -+ dx_set_limit (entries2, dx_node_limit(dir)); -+ -+ /* Which index block gets the new entry? */ -+ if (at - entries >= icount1) { -+ frame->at = at = at - entries - icount1 + entries2; -+ frame->entries = entries = entries2; -+ swap(frame->bh, bh2); - } -- de->file_type = EXT3_FT_UNKNOWN; -- if (inode) { -- de->inode = cpu_to_le32(inode->i_ino); -- ext3_set_de_type(dir->i_sb, de, inode->i_mode); -- } else -- de->inode = 0; -- de->name_len = namelen; -- memcpy (de->name, name, namelen); -- /* -- * XXX shouldn't update any times until successful -- * completion of syscall, but too many callers depend -- * on this. -- * -- * XXX similarly, too many callers depend on -- * ext3_new_inode() setting the times, but error -- * recovery deletes the inode, so the worst that can -- * happen is that the times are slightly out of date -- * and/or different from the directory change time. -- */ -- 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; -- BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -- ext3_journal_dirty_metadata(handle, bh); -- brelse(bh); -- return 0; -+ dx_insert_block (frames + 0, hash2, newblock); -+ dxtrace(dx_show_index ("node", frames[1].entries)); -+ dxtrace(dx_show_index ("node", -+ ((struct dx_node *) bh2->b_data)->entries)); -+ err = ext3_journal_dirty_metadata(handle, bh2); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ } else { -+ dxtrace(printk("Creating second level index...\n")); -+ memcpy((char *) entries2, (char *) entries, -+ icount * sizeof(struct dx_entry)); -+ dx_set_limit(entries2, dx_node_limit(dir)); -+ -+ /* Set up root */ -+ dx_set_count(entries, 1); -+ dx_set_block(entries + 0, newblock); -+ ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ -+ /* Add new access path frame */ -+ frame = frames + 1; -+ frame->at = at = at - entries + entries2; -+ frame->entries = entries = entries2; -+ frame->bh = bh2; -+ err = ext3_journal_get_write_access(handle, -+ frame->bh); -+ if (err) -+ goto journal_error; - } -- offset += le16_to_cpu(de->rec_len); -- de = (struct ext3_dir_entry_2 *) -- ((char *) de + le16_to_cpu(de->rec_len)); -+ ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- brelse (bh); -- return -ENOSPC; -+ de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ if (!de) -+ goto cleanup; -+ err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ bh = 0; -+ goto cleanup; -+ -+journal_error: -+ ext3_std_error(dir->i_sb, err); -+cleanup: -+ if (bh) -+ brelse(bh); -+ dx_release(frames); -+ return err; - } -+#endif - - /* - * ext3_delete_entry deletes a directory entry by merging it with the -@@ -451,9 +1543,11 @@ - struct inode * inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -478,9 +1572,11 @@ - struct inode *inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -507,9 +1603,11 @@ - if (dir->i_nlink >= EXT3_LINK_MAX) - return -EMLINK; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -521,7 +1619,7 @@ - - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -- inode->i_size = inode->u.ext3_i.i_disksize = inode->i_sb->s_blocksize; -+ inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; - inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { -@@ -554,21 +1652,19 @@ - inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); -- if (err) -- goto out_no_entry; -+ if (err) { -+ inode->i_nlink = 0; -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - dir->i_nlink++; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - d_instantiate(dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- inode->i_nlink = 0; -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - /* -@@ -655,7 +1751,7 @@ - int err = 0, rc; - - lock_super(sb); -- if (!list_empty(&inode->u.ext3_i.i_orphan)) -+ if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - - /* Orphan handling is only valid for files with data blocks -@@ -696,7 +1792,7 @@ - * This is safe: on error we're going to ignore the orphan list - * anyway on the next recovery. */ - if (!err) -- list_add(&inode->u.ext3_i.i_orphan, &EXT3_SB(sb)->s_orphan); -+ list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", -@@ -714,25 +1810,26 @@ - int ext3_orphan_del(handle_t *handle, struct inode *inode) - { - struct list_head *prev; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct ext3_sb_info *sbi; - ino_t ino_next; - struct ext3_iloc iloc; - int err = 0; - - lock_super(inode->i_sb); -- if (list_empty(&inode->u.ext3_i.i_orphan)) { -+ if (list_empty(&ei->i_orphan)) { - unlock_super(inode->i_sb); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); -- prev = inode->u.ext3_i.i_orphan.prev; -+ prev = ei->i_orphan.prev; - sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %ld from orphan list\n", inode->i_ino); - -- list_del(&inode->u.ext3_i.i_orphan); -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ list_del(&ei->i_orphan); -+ INIT_LIST_HEAD(&ei->i_orphan); - - /* If we're on an error path, we may not have a valid - * transaction handle with which to update the orphan list on -@@ -793,8 +1890,9 @@ - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); -@@ -832,7 +1930,7 @@ - ext3_mark_inode_dirty(handle, inode); - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - - end_rmdir: -@@ -850,8 +1948,9 @@ - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -878,7 +1977,7 @@ - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - inode->i_nlink--; - if (!inode->i_nlink) -@@ -904,9 +2003,11 @@ - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 5); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -916,7 +2017,7 @@ - if (IS_ERR(inode)) - goto out_stop; - -- if (l > sizeof (inode->u.ext3_i.i_data)) { -+ if (l > sizeof (EXT3_I(inode)->i_data)) { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* -@@ -925,8 +2026,12 @@ - * i_size in generic_commit_write(). - */ - err = block_symlink(inode, symname, l); -- if (err) -- goto out_no_entry; -+ if (err) { -+ ext3_dec_count(handle, inode); -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - } else { - inode->i_op = &ext3_fast_symlink_inode_operations; - memcpy((char*)&inode->u.ext3_i.i_data,symname,l); -@@ -938,12 +2043,6 @@ - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- ext3_dec_count(handle, inode); -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - static int ext3_link (struct dentry * old_dentry, -@@ -956,12 +2055,15 @@ - if (S_ISDIR(inode->i_mode)) - return -EPERM; - -- if (inode->i_nlink >= EXT3_LINK_MAX) -+ if (inode->i_nlink >= EXT3_LINK_MAX) { - return -EMLINK; -+ } - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -995,9 +2097,11 @@ - - old_bh = new_bh = dir_bh = NULL; - -- handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + 2); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; -@@ -1070,14 +2174,37 @@ - /* - * ok, that's it - */ -- ext3_delete_entry(handle, old_dir, old_de, old_bh); -+ if (le32_to_cpu(old_de->inode) != old_inode->i_ino || -+ old_de->name_len != old_dentry->d_name.len || -+ strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || -+ (retval = ext3_delete_entry(handle, old_dir, -+ old_de, old_bh)) == -ENOENT) { -+ /* old_de could have moved from under us during htree split, so -+ * make sure that we are deleting the right entry. We might -+ * also be pointing to a stale entry in the unused part of -+ * old_bh so just checking inum and the name isn't enough. */ -+ struct buffer_head *old_bh2; -+ struct ext3_dir_entry_2 *old_de2; -+ -+ old_bh2 = ext3_find_entry(old_dentry, &old_de2); -+ if (old_bh2) { -+ retval = ext3_delete_entry(handle, old_dir, -+ old_de2, old_bh2); -+ brelse(old_bh2); -+ } -+ } -+ if (retval) { -+ ext3_warning(old_dir->i_sb, "ext3_rename", -+ "Deleting old file (%lu), %d, error=%d", -+ old_dir->i_ino, old_dir->i_nlink, retval); -+ } - - if (new_inode) { - new_inode->i_nlink--; - new_inode->i_ctime = CURRENT_TIME; - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; -- old_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(old_dir); - if (dir_bh) { - BUFFER_TRACE(dir_bh, "get_write_access"); - ext3_journal_get_write_access(handle, dir_bh); -@@ -1089,7 +2212,7 @@ - new_inode->i_nlink--; - } else { - new_dir->i_nlink++; -- new_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(new_dir); - ext3_mark_inode_dirty(handle, new_dir); - } - } -Index: linux-2.4.19-pre1/fs/ext3/super.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/super.c 2003-11-20 19:01:58.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/super.c 2003-11-20 23:05:26.000000000 +0300 -@@ -702,6 +702,7 @@ - es->s_mtime = cpu_to_le32(CURRENT_TIME); - ext3_update_dynamic_rev(sb); - EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -+ - ext3_commit_super (sb, es, 1); - if (test_opt (sb, DEBUG)) - printk (KERN_INFO -@@ -712,6 +713,7 @@ - EXT3_BLOCKS_PER_GROUP(sb), - EXT3_INODES_PER_GROUP(sb), - sbi->s_mount_opt); -+ - printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ", - bdevname(sb->s_dev)); - if (EXT3_SB(sb)->s_journal->j_inode == NULL) { -@@ -886,6 +888,7 @@ - return res; - } - -+ - struct super_block * ext3_read_super (struct super_block * sb, void * data, - int silent) - { -@@ -1062,6 +1065,9 @@ - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+ for (i=0; i < 4; i++) -+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); -+ sbi->s_def_hash_version = es->s_def_hash_version; - - if (sbi->s_blocks_per_group > blocksize * 8) { - printk (KERN_ERR -@@ -1744,6 +1750,7 @@ - unregister_filesystem(&ext3_fs_type); - } - -+EXPORT_SYMBOL(ext3_force_commit); - EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); -Index: linux-2.4.19-pre1/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_fs.h 2003-11-20 19:01:38.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_fs.h 2003-11-20 23:05:26.000000000 +0300 -@@ -40,6 +40,11 @@ - #define EXT3FS_VERSION "2.4-0.9.17" - - /* -+ * Always enable hashed directories -+ */ -+#define CONFIG_EXT3_INDEX -+ -+/* - * Debug code - */ - #ifdef EXT3FS_DEBUG -@@ -437,8 +442,11 @@ - /*E0*/ __u32 s_journal_inum; /* inode number of journal file */ - __u32 s_journal_dev; /* device number of journal file */ - __u32 s_last_orphan; /* start of list of inodes to delete */ -- --/*EC*/ __u32 s_reserved[197]; /* Padding to the end of the block */ -+ __u32 s_hash_seed[4]; /* HTREE hash seed */ -+ __u8 s_def_hash_version; /* Default hash version to use */ -+ __u8 s_reserved_char_pad; -+ __u16 s_reserved_word_pad; -+ __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -575,9 +583,46 @@ - #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) - #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ - ~EXT3_DIR_ROUND) -+/* -+ * Hash Tree Directory indexing -+ * (c) Daniel Phillips, 2001 -+ */ -+ -+#ifdef CONFIG_EXT3_INDEX -+ #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ -+ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ -+ (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) -+#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) -+#else -+ #define is_dx(dir) 0 -+#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) -+#endif -+ -+/* Legal values for the dx_root hash_version field: */ -+ -+#define DX_HASH_LEGACY 0 -+#define DX_HASH_HALF_MD4 1 -+#define DX_HASH_TEA 2 -+ -+/* hash info structure used by the directory hash */ -+struct dx_hash_info -+{ -+ u32 hash; -+ u32 minor_hash; -+ int hash_version; -+ u32 *seed; -+}; - - #ifdef __KERNEL__ - /* -+ * Control parameters used by ext3_htree_next_block -+ */ -+#define HASH_NB_ALWAYS 1 -+ -+ -+/* - * Describe an inode's exact location on disk and in memory - */ - struct ext3_iloc -@@ -587,6 +632,27 @@ - unsigned long block_group; - }; - -+ -+/* -+ * This structure is stuffed into the struct file's private_data field -+ * for directories. It is where we put information so that we can do -+ * readdir operations in hash tree order. -+ */ -+struct dir_private_info { -+ rb_root_t root; -+ rb_node_t *curr_node; -+ struct fname *extra_fname; -+ loff_t last_pos; -+ __u32 curr_hash; -+ __u32 curr_minor_hash; -+ __u32 next_hash; -+}; -+ -+/* -+ * Special error return code only used by dx_probe() and its callers. -+ */ -+#define ERR_BAD_DX_DIR -75000 -+ - /* - * Function prototypes - */ -@@ -614,11 +680,20 @@ - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, -- struct ext3_dir_entry_2 *, struct buffer_head *, -- unsigned long); -+ struct ext3_dir_entry_2 *, -+ struct buffer_head *, unsigned long); -+extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent); -+extern void ext3_htree_free_dir_info(struct dir_private_info *p); -+ - /* fsync.c */ - extern int ext3_sync_file (struct file *, struct dentry *, int); - -+/* hash.c */ -+extern int ext3fs_dirhash(const char *name, int len, struct -+ dx_hash_info *hinfo); -+ - /* ialloc.c */ - extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int); - extern void ext3_free_inode (handle_t *, struct inode *); -@@ -650,6 +725,8 @@ - /* namei.c */ - extern int ext3_orphan_add(handle_t *, struct inode *); - extern int ext3_orphan_del(handle_t *, struct inode *); -+extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash); - - /* super.c */ - extern void ext3_error (struct super_block *, const char *, const char *, ...) -Index: linux-2.4.19-pre1/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_fs_sb.h 2003-11-20 19:01:38.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_fs_sb.h 2003-11-20 23:05:26.000000000 +0300 -@@ -62,6 +62,8 @@ - int s_inode_size; - int s_first_ino; - u32 s_next_generation; -+ u32 s_hash_seed[4]; -+ int s_def_hash_version; - - /* Journaling */ - struct inode * s_journal_inode; -Index: linux-2.4.19-pre1/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_jbd.h 2001-12-21 20:42:03.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_jbd.h 2003-11-20 23:05:26.000000000 +0300 -@@ -63,6 +63,8 @@ - - #define EXT3_RESERVE_TRANS_BLOCKS 12 - -+#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, -Index: linux-2.4.19-pre1/include/linux/rbtree.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/rbtree.h 2001-11-22 22:46:18.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/rbtree.h 2003-11-20 23:05:26.000000000 +0300 -@@ -120,6 +120,8 @@ - - extern void rb_insert_color(rb_node_t *, rb_root_t *); - extern void rb_erase(rb_node_t *, rb_root_t *); -+extern rb_node_t *rb_get_first(rb_root_t *root); -+extern rb_node_t *rb_get_next(rb_node_t *n); - - static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link) - { -Index: linux-2.4.19-pre1/lib/rbtree.c -=================================================================== ---- linux-2.4.19-pre1.orig/lib/rbtree.c 2001-09-18 02:30:23.000000000 +0400 -+++ linux-2.4.19-pre1/lib/rbtree.c 2003-11-20 23:25:57.000000000 +0300 -@@ -17,6 +17,8 @@ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - linux/lib/rbtree.c -+ -+ rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002 - */ - - #include <linux/rbtree.h> -@@ -291,3 +293,43 @@ - if (color == RB_BLACK) - __rb_erase_color(child, parent, root); - } -+ -+/* -+ * This function returns the first node (in sort order) of the tree. -+ */ -+rb_node_t *rb_get_first(rb_root_t *root) -+{ -+ rb_node_t *n; -+ -+ n = root->rb_node; -+ if (!n) -+ return 0; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+} -+EXPORT_SYMBOL(rb_get_first); -+ -+/* -+ * Given a node, this function will return the next node in the tree. -+ */ -+rb_node_t *rb_get_next(rb_node_t *n) -+{ -+ rb_node_t *parent; -+ -+ if (n->rb_right) { -+ n = n->rb_right; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+ } else { -+ while ((parent = n->rb_parent)) { -+ if (n == parent->rb_left) -+ return parent; -+ n = parent; -+ } -+ return 0; -+ } -+} -+EXPORT_SYMBOL(rb_get_next); -+ diff --git a/lustre/kernel_patches/patches/ext3-htree-2.4.21-chaos.patch b/lustre/kernel_patches/patches/ext3-htree-2.4.21-chaos.patch deleted file mode 100644 index 4b445f5860..0000000000 --- a/lustre/kernel_patches/patches/ext3-htree-2.4.21-chaos.patch +++ /dev/null @@ -1,2593 +0,0 @@ - fs/ext3/Makefile | 2 - fs/ext3/dir.c | 302 +++++++++ - fs/ext3/file.c | 3 - fs/ext3/hash.c | 215 ++++++ - fs/ext3/namei.c | 1421 ++++++++++++++++++++++++++++++++++++++++----- - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 85 ++ - include/linux/ext3_fs_sb.h | 2 - include/linux/ext3_jbd.h | 2 - include/linux/rbtree.h | 2 - lib/rbtree.c | 42 + - 11 files changed, 1922 insertions(+), 161 deletions(-) - -Index: linux-2.4.21-chaos/fs/ext3/dir.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/dir.c 2002-05-08 01:53:46.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/dir.c 2003-12-12 16:18:17.000000000 +0300 -@@ -21,12 +21,16 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/slab.h> -+#include <linux/rbtree.h> - - static unsigned char ext3_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK - }; - - static int ext3_readdir(struct file *, void *, filldir_t); -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir); - - struct file_operations ext3_dir_operations = { - read: generic_read_dir, -@@ -35,6 +39,17 @@ - fsync: ext3_sync_file, /* BKL held */ - }; - -+ -+static unsigned char get_dtype(struct super_block *sb, int filetype) -+{ -+ if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || -+ (filetype >= EXT3_FT_MAX)) -+ return DT_UNKNOWN; -+ -+ return (ext3_filetype_table[filetype]); -+} -+ -+ - int ext3_check_dir_entry (const char * function, struct inode * dir, - struct ext3_dir_entry_2 * de, - struct buffer_head * bh, -@@ -79,6 +94,16 @@ - - sb = inode->i_sb; - -+ if (is_dx(inode)) { -+ err = ext3_dx_readdir(filp, dirent, filldir); -+ if (err != ERR_BAD_DX_DIR) -+ return err; -+ /* -+ * We don't set the inode dirty flag since it's not -+ * critical that it get flushed back to the disk. -+ */ -+ EXT3_I(filp->f_dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; -+ } - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); -@@ -162,18 +187,12 @@ - * during the copy operation. - */ - unsigned long version = filp->f_version; -- unsigned char d_type = DT_UNKNOWN; - -- if (EXT3_HAS_INCOMPAT_FEATURE(sb, -- EXT3_FEATURE_INCOMPAT_FILETYPE) -- && de->file_type < EXT3_FT_MAX) -- d_type = -- ext3_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, - le32_to_cpu(de->inode), -- d_type); -+ get_dtype(sb, de->file_type)); - if (error) - break; - if (version != filp->f_version) -@@ -188,3 +207,272 @@ - UPDATE_ATIME(inode); - return 0; - } -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * These functions convert from the major/minor hash to an f_pos -+ * value. -+ * -+ * Currently we only use major hash numer. This is unfortunate, but -+ * on 32-bit machines, the same VFS interface is used for lseek and -+ * llseek, so if we use the 64 bit offset, then the 32-bit versions of -+ * lseek/telldir/seekdir will blow out spectacularly, and from within -+ * the ext2 low-level routine, we don't know if we're being called by -+ * a 64-bit version of the system call or the 32-bit version of the -+ * system call. Worse yet, NFSv2 only allows for a 32-bit readdir -+ * cookie. Sigh. -+ */ -+#define hash2pos(major, minor) (major >> 1) -+#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff) -+#define pos2min_hash(pos) (0) -+ -+/* -+ * This structure holds the nodes of the red-black tree used to store -+ * the directory entry in hash order. -+ */ -+struct fname { -+ __u32 hash; -+ __u32 minor_hash; -+ rb_node_t rb_hash; -+ struct fname *next; -+ __u32 inode; -+ __u8 name_len; -+ __u8 file_type; -+ char name[0]; -+}; -+ -+/* -+ * This functoin implements a non-recursive way of freeing all of the -+ * nodes in the red-black tree. -+ */ -+static void free_rb_tree_fname(rb_root_t *root) -+{ -+ rb_node_t *n = root->rb_node; -+ rb_node_t *parent; -+ struct fname *fname; -+ -+ while (n) { -+ /* Do the node's children first */ -+ if ((n)->rb_left) { -+ n = n->rb_left; -+ continue; -+ } -+ if (n->rb_right) { -+ n = n->rb_right; -+ continue; -+ } -+ /* -+ * The node has no children; free it, and then zero -+ * out parent's link to it. Finally go to the -+ * beginning of the loop and try to free the parent -+ * node. -+ */ -+ parent = n->rb_parent; -+ fname = rb_entry(n, struct fname, rb_hash); -+ kfree(fname); -+ if (!parent) -+ root->rb_node = 0; -+ else if (parent->rb_left == n) -+ parent->rb_left = 0; -+ else if (parent->rb_right == n) -+ parent->rb_right = 0; -+ n = parent; -+ } -+ root->rb_node = 0; -+} -+ -+ -+struct dir_private_info *create_dir_info(loff_t pos) -+{ -+ struct dir_private_info *p; -+ -+ p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL); -+ if (!p) -+ return NULL; -+ p->root.rb_node = 0; -+ p->curr_node = 0; -+ p->extra_fname = 0; -+ p->last_pos = 0; -+ p->curr_hash = pos2maj_hash(pos); -+ p->curr_minor_hash = pos2min_hash(pos); -+ p->next_hash = 0; -+ return p; -+} -+ -+void ext3_htree_free_dir_info(struct dir_private_info *p) -+{ -+ free_rb_tree_fname(&p->root); -+ kfree(p); -+} -+ -+/* -+ * Given a directory entry, enter it into the fname rb tree. -+ */ -+int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent) -+{ -+ rb_node_t **p, *parent = NULL; -+ struct fname * fname, *new_fn; -+ struct dir_private_info *info; -+ int len; -+ -+ info = (struct dir_private_info *) dir_file->private_data; -+ p = &info->root.rb_node; -+ -+ /* Create and allocate the fname structure */ -+ len = sizeof(struct fname) + dirent->name_len + 1; -+ new_fn = kmalloc(len, GFP_KERNEL); -+ if (!new_fn) -+ return -ENOMEM; -+ memset(new_fn, 0, len); -+ new_fn->hash = hash; -+ new_fn->minor_hash = minor_hash; -+ new_fn->inode = le32_to_cpu(dirent->inode); -+ new_fn->name_len = dirent->name_len; -+ new_fn->file_type = dirent->file_type; -+ memcpy(new_fn->name, dirent->name, dirent->name_len); -+ new_fn->name[dirent->name_len] = 0; -+ -+ while (*p) { -+ parent = *p; -+ fname = rb_entry(parent, struct fname, rb_hash); -+ -+ /* -+ * If the hash and minor hash match up, then we put -+ * them on a linked list. This rarely happens... -+ */ -+ if ((new_fn->hash == fname->hash) && -+ (new_fn->minor_hash == fname->minor_hash)) { -+ new_fn->next = fname->next; -+ fname->next = new_fn; -+ return 0; -+ } -+ -+ if (new_fn->hash < fname->hash) -+ p = &(*p)->rb_left; -+ else if (new_fn->hash > fname->hash) -+ p = &(*p)->rb_right; -+ else if (new_fn->minor_hash < fname->minor_hash) -+ p = &(*p)->rb_left; -+ else /* if (new_fn->minor_hash > fname->minor_hash) */ -+ p = &(*p)->rb_right; -+ } -+ -+ rb_link_node(&new_fn->rb_hash, parent, p); -+ rb_insert_color(&new_fn->rb_hash, &info->root); -+ return 0; -+} -+ -+ -+ -+/* -+ * This is a helper function for ext3_dx_readdir. It calls filldir -+ * for all entres on the fname linked list. (Normally there is only -+ * one entry on the linked list, unless there are 62 bit hash collisions.) -+ */ -+static int call_filldir(struct file * filp, void * dirent, -+ filldir_t filldir, struct fname *fname) -+{ -+ struct dir_private_info *info = filp->private_data; -+ loff_t curr_pos; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct super_block * sb; -+ int error; -+ -+ sb = inode->i_sb; -+ -+ if (!fname) { -+ printk("call_filldir: called with null fname?!?\n"); -+ return 0; -+ } -+ curr_pos = hash2pos(fname->hash, fname->minor_hash); -+ while (fname) { -+ error = filldir(dirent, fname->name, -+ fname->name_len, curr_pos, -+ fname->inode, -+ get_dtype(sb, fname->file_type)); -+ if (error) { -+ filp->f_pos = curr_pos; -+ info->extra_fname = fname->next; -+ return error; -+ } -+ fname = fname->next; -+ } -+ return 0; -+} -+ -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir) -+{ -+ struct dir_private_info *info = filp->private_data; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct fname *fname; -+ int ret; -+ -+ if (!info) { -+ info = create_dir_info(filp->f_pos); -+ if (!info) -+ return -ENOMEM; -+ filp->private_data = info; -+ } -+ -+ /* Some one has messed with f_pos; reset the world */ -+ if (info->last_pos != filp->f_pos) { -+ free_rb_tree_fname(&info->root); -+ info->curr_node = 0; -+ info->extra_fname = 0; -+ info->curr_hash = pos2maj_hash(filp->f_pos); -+ info->curr_minor_hash = pos2min_hash(filp->f_pos); -+ } -+ -+ /* -+ * If there are any leftover names on the hash collision -+ * chain, return them first. -+ */ -+ if (info->extra_fname && -+ call_filldir(filp, dirent, filldir, info->extra_fname)) -+ goto finished; -+ -+ if (!info->curr_node) -+ info->curr_node = rb_get_first(&info->root); -+ -+ while (1) { -+ /* -+ * Fill the rbtree if we have no more entries, -+ * or the inode has changed since we last read in the -+ * cached entries. -+ */ -+ if ((!info->curr_node) || -+ (filp->f_version != inode->i_version)) { -+ info->curr_node = 0; -+ free_rb_tree_fname(&info->root); -+ filp->f_version = inode->i_version; -+ ret = ext3_htree_fill_tree(filp, info->curr_hash, -+ info->curr_minor_hash, -+ &info->next_hash); -+ if (ret < 0) -+ return ret; -+ if (ret == 0) -+ break; -+ info->curr_node = rb_get_first(&info->root); -+ } -+ -+ fname = rb_entry(info->curr_node, struct fname, rb_hash); -+ info->curr_hash = fname->hash; -+ info->curr_minor_hash = fname->minor_hash; -+ if (call_filldir(filp, dirent, filldir, fname)) -+ break; -+ -+ info->curr_node = rb_get_next(info->curr_node); -+ if (!info->curr_node) { -+ info->curr_hash = info->next_hash; -+ info->curr_minor_hash = 0; -+ } -+ } -+finished: -+ info->last_pos = filp->f_pos; -+ UPDATE_ATIME(inode); -+ return 0; -+} -+#endif -Index: linux-2.4.21-chaos/fs/ext3/file.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/file.c 2003-12-05 07:55:47.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/file.c 2003-12-12 16:18:17.000000000 +0300 -@@ -38,6 +38,9 @@ - { - if (filp->f_mode & FMODE_WRITE) - ext3_discard_prealloc (inode); -+ if (is_dx(inode) && filp->private_data) -+ ext3_htree_free_dir_info(filp->private_data); -+ - return 0; - } - -Index: linux-2.4.21-chaos/fs/ext3/hash.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/hash.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/hash.c 2003-12-12 16:18:17.000000000 +0300 -@@ -0,0 +1,215 @@ -+/* -+ * linux/fs/ext3/hash.c -+ * -+ * Copyright (C) 2002 by Theodore Ts'o -+ * -+ * This file is released under the GPL v2. -+ * -+ * This file may be redistributed under the terms of the GNU Public -+ * License. -+ */ -+ -+#include <linux/fs.h> -+#include <linux/jbd.h> -+#include <linux/sched.h> -+#include <linux/ext3_fs.h> -+ -+#define DELTA 0x9E3779B9 -+ -+static void TEA_transform(__u32 buf[4], __u32 const in[]) -+{ -+ __u32 sum = 0; -+ __u32 b0 = buf[0], b1 = buf[1]; -+ __u32 a = in[0], b = in[1], c = in[2], d = in[3]; -+ int n = 16; -+ -+ do { -+ sum += DELTA; -+ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); -+ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); -+ } while(--n); -+ -+ buf[0] += b0; -+ buf[1] += b1; -+} -+ -+/* F, G and H are basic MD4 functions: selection, majority, parity */ -+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -+#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -+#define H(x, y, z) ((x) ^ (y) ^ (z)) -+ -+/* -+ * The generic round function. The application is so specific that -+ * we don't bother protecting all the arguments with parens, as is generally -+ * good macro practice, in favor of extra legibility. -+ * Rotation is separate from addition to prevent recomputation -+ */ -+#define ROUND(f, a, b, c, d, x, s) \ -+ (a += f(b, c, d) + x, a = (a << s) | (a >> (32-s))) -+#define K1 0 -+#define K2 013240474631UL -+#define K3 015666365641UL -+ -+/* -+ * Basic cut-down MD4 transform. Returns only 32 bits of result. -+ */ -+static void halfMD4Transform (__u32 buf[4], __u32 const in[]) -+{ -+ __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; -+ -+ /* Round 1 */ -+ ROUND(F, a, b, c, d, in[0] + K1, 3); -+ ROUND(F, d, a, b, c, in[1] + K1, 7); -+ ROUND(F, c, d, a, b, in[2] + K1, 11); -+ ROUND(F, b, c, d, a, in[3] + K1, 19); -+ ROUND(F, a, b, c, d, in[4] + K1, 3); -+ ROUND(F, d, a, b, c, in[5] + K1, 7); -+ ROUND(F, c, d, a, b, in[6] + K1, 11); -+ ROUND(F, b, c, d, a, in[7] + K1, 19); -+ -+ /* Round 2 */ -+ ROUND(G, a, b, c, d, in[1] + K2, 3); -+ ROUND(G, d, a, b, c, in[3] + K2, 5); -+ ROUND(G, c, d, a, b, in[5] + K2, 9); -+ ROUND(G, b, c, d, a, in[7] + K2, 13); -+ ROUND(G, a, b, c, d, in[0] + K2, 3); -+ ROUND(G, d, a, b, c, in[2] + K2, 5); -+ ROUND(G, c, d, a, b, in[4] + K2, 9); -+ ROUND(G, b, c, d, a, in[6] + K2, 13); -+ -+ /* Round 3 */ -+ ROUND(H, a, b, c, d, in[3] + K3, 3); -+ ROUND(H, d, a, b, c, in[7] + K3, 9); -+ ROUND(H, c, d, a, b, in[2] + K3, 11); -+ ROUND(H, b, c, d, a, in[6] + K3, 15); -+ ROUND(H, a, b, c, d, in[1] + K3, 3); -+ ROUND(H, d, a, b, c, in[5] + K3, 9); -+ ROUND(H, c, d, a, b, in[0] + K3, 11); -+ ROUND(H, b, c, d, a, in[4] + K3, 15); -+ -+ buf[0] += a; -+ buf[1] += b; -+ buf[2] += c; -+ buf[3] += d; -+} -+ -+#undef ROUND -+#undef F -+#undef G -+#undef H -+#undef K1 -+#undef K2 -+#undef K3 -+ -+/* The old legacy hash */ -+static __u32 dx_hack_hash (const char *name, int len) -+{ -+ __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9; -+ while (len--) { -+ __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373)); -+ -+ if (hash & 0x80000000) hash -= 0x7fffffff; -+ hash1 = hash0; -+ hash0 = hash; -+ } -+ return (hash0 << 1); -+} -+ -+static void str2hashbuf(const char *msg, int len, __u32 *buf, int num) -+{ -+ __u32 pad, val; -+ int i; -+ -+ pad = (__u32)len | ((__u32)len << 8); -+ pad |= pad << 16; -+ -+ val = pad; -+ if (len > num*4) -+ len = num * 4; -+ for (i=0; i < len; i++) { -+ if ((i % 4) == 0) -+ val = pad; -+ val = msg[i] + (val << 8); -+ if ((i % 4) == 3) { -+ *buf++ = val; -+ val = pad; -+ num--; -+ } -+ } -+ if (--num >= 0) -+ *buf++ = val; -+ while (--num >= 0) -+ *buf++ = pad; -+} -+ -+/* -+ * Returns the hash of a filename. If len is 0 and name is NULL, then -+ * this function can be used to test whether or not a hash version is -+ * supported. -+ * -+ * The seed is an 4 longword (32 bits) "secret" which can be used to -+ * uniquify a hash. If the seed is all zero's, then some default seed -+ * may be used. -+ * -+ * A particular hash version specifies whether or not the seed is -+ * represented, and whether or not the returned hash is 32 bits or 64 -+ * bits. 32 bit hashes will return 0 for the minor hash. -+ */ -+int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) -+{ -+ __u32 hash; -+ __u32 minor_hash = 0; -+ const char *p; -+ int i; -+ __u32 in[8], buf[4]; -+ -+ /* Initialize the default seed for the hash checksum functions */ -+ buf[0] = 0x67452301; -+ buf[1] = 0xefcdab89; -+ buf[2] = 0x98badcfe; -+ buf[3] = 0x10325476; -+ -+ /* Check to see if the seed is all zero's */ -+ if (hinfo->seed) { -+ for (i=0; i < 4; i++) { -+ if (hinfo->seed[i]) -+ break; -+ } -+ if (i < 4) -+ memcpy(buf, hinfo->seed, sizeof(buf)); -+ } -+ -+ switch (hinfo->hash_version) { -+ case DX_HASH_LEGACY: -+ hash = dx_hack_hash(name, len); -+ break; -+ case DX_HASH_HALF_MD4: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 8); -+ halfMD4Transform(buf, in); -+ len -= 32; -+ p += 32; -+ } -+ minor_hash = buf[2]; -+ hash = buf[1]; -+ break; -+ case DX_HASH_TEA: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 4); -+ TEA_transform(buf, in); -+ len -= 16; -+ p += 16; -+ } -+ hash = buf[0]; -+ minor_hash = buf[1]; -+ break; -+ default: -+ hinfo->hash = 0; -+ return -1; -+ } -+ hinfo->hash = hash & ~1; -+ hinfo->minor_hash = minor_hash; -+ return 0; -+} -Index: linux-2.4.21-chaos/fs/ext3/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/Makefile 2003-12-12 16:17:59.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/Makefile 2003-12-12 16:18:17.000000000 +0300 -@@ -12,7 +12,7 @@ - export-objs := super.o inode.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o -+ ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.21-chaos/fs/ext3/namei.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/namei.c 2003-07-15 04:41:01.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/namei.c 2003-12-12 16:18:17.000000000 +0300 -@@ -16,6 +16,12 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 -+ * Hash Tree Directory indexing (c) -+ * Daniel Phillips, 2001 -+ * Hash Tree Directory indexing porting -+ * Christopher Li, 2002 -+ * Hash Tree Directory indexing cleanup -+ * Theodore Ts'o, 2002 - */ - - #include <linux/fs.h> -@@ -40,6 +46,642 @@ - #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) - #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) - -+static struct buffer_head *ext3_append(handle_t *handle, -+ struct inode *inode, -+ u32 *block, int *err) -+{ -+ struct buffer_head *bh; -+ -+ *block = inode->i_size >> inode->i_sb->s_blocksize_bits; -+ -+ if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -+ inode->i_size += inode->i_sb->s_blocksize; -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_journal_get_write_access(handle,bh); -+ } -+ return bh; -+} -+ -+#ifndef assert -+#define assert(test) J_ASSERT(test) -+#endif -+ -+#ifndef swap -+#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0) -+#endif -+ -+typedef struct { u32 v; } le_u32; -+typedef struct { u16 v; } le_u16; -+ -+#ifdef DX_DEBUG -+#define dxtrace(command) command -+#else -+#define dxtrace(command) -+#endif -+ -+struct fake_dirent -+{ -+ /*le*/u32 inode; -+ /*le*/u16 rec_len; -+ u8 name_len; -+ u8 file_type; -+}; -+ -+struct dx_countlimit -+{ -+ le_u16 limit; -+ le_u16 count; -+}; -+ -+struct dx_entry -+{ -+ le_u32 hash; -+ le_u32 block; -+}; -+ -+/* -+ * dx_root_info is laid out so that if it should somehow get overlaid by a -+ * dirent the two low bits of the hash version will be zero. Therefore, the -+ * hash version mod 4 should never be 0. Sincerely, the paranoia department. -+ */ -+ -+struct dx_root -+{ -+ struct fake_dirent dot; -+ char dot_name[4]; -+ struct fake_dirent dotdot; -+ char dotdot_name[4]; -+ struct dx_root_info -+ { -+ le_u32 reserved_zero; -+ u8 hash_version; -+ u8 info_length; /* 8 */ -+ u8 indirect_levels; -+ u8 unused_flags; -+ } -+ info; -+ struct dx_entry entries[0]; -+}; -+ -+struct dx_node -+{ -+ struct fake_dirent fake; -+ struct dx_entry entries[0]; -+}; -+ -+ -+struct dx_frame -+{ -+ struct buffer_head *bh; -+ struct dx_entry *entries; -+ struct dx_entry *at; -+}; -+ -+struct dx_map_entry -+{ -+ u32 hash; -+ u32 offs; -+}; -+ -+#ifdef CONFIG_EXT3_INDEX -+static inline unsigned dx_get_block (struct dx_entry *entry); -+static void dx_set_block (struct dx_entry *entry, unsigned value); -+static inline unsigned dx_get_hash (struct dx_entry *entry); -+static void dx_set_hash (struct dx_entry *entry, unsigned value); -+static unsigned dx_get_count (struct dx_entry *entries); -+static unsigned dx_get_limit (struct dx_entry *entries); -+static void dx_set_count (struct dx_entry *entries, unsigned value); -+static void dx_set_limit (struct dx_entry *entries, unsigned value); -+static unsigned dx_root_limit (struct inode *dir, unsigned infosize); -+static unsigned dx_node_limit (struct inode *dir); -+static struct dx_frame *dx_probe(struct dentry *dentry, -+ struct inode *dir, -+ struct dx_hash_info *hinfo, -+ struct dx_frame *frame, -+ int *err); -+static void dx_release (struct dx_frame *frames); -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry map[]); -+static void dx_sort_map(struct dx_map_entry *map, unsigned count); -+static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, -+ struct dx_map_entry *offsets, int count); -+static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); -+static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash); -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err); -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode); -+ -+/* -+ * Future: use high four bits of block for coalesce-on-delete flags -+ * Mask them off for now. -+ */ -+ -+static inline unsigned dx_get_block (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->block.v) & 0x00ffffff; -+} -+ -+static inline void dx_set_block (struct dx_entry *entry, unsigned value) -+{ -+ entry->block.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_hash (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->hash.v); -+} -+ -+static inline void dx_set_hash (struct dx_entry *entry, unsigned value) -+{ -+ entry->hash.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_count (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->count.v); -+} -+ -+static inline unsigned dx_get_limit (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->limit.v); -+} -+ -+static inline void dx_set_count (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->count.v = cpu_to_le16(value); -+} -+ -+static inline void dx_set_limit (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->limit.v = cpu_to_le16(value); -+} -+ -+static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - -+ EXT3_DIR_REC_LEN(2) - infosize; -+ return 0? 20: entry_space / sizeof(struct dx_entry); -+} -+ -+static inline unsigned dx_node_limit (struct inode *dir) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); -+ return 0? 22: entry_space / sizeof(struct dx_entry); -+} -+ -+/* -+ * Debug -+ */ -+#ifdef DX_DEBUG -+struct stats -+{ -+ unsigned names; -+ unsigned space; -+ unsigned bcount; -+}; -+ -+static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, -+ int size, int show_names) -+{ -+ unsigned names = 0, space = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ printk("names: "); -+ while ((char *) de < base + size) -+ { -+ if (de->inode) -+ { -+ if (show_names) -+ { -+ int len = de->name_len; -+ char *name = de->name; -+ while (len--) printk("%c", *name++); -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ printk(":%x.%u ", h.hash, -+ ((char *) de - base)); -+ } -+ space += EXT3_DIR_REC_LEN(de->name_len); -+ names++; -+ } -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ printk("(%i)\n", names); -+ return (struct stats) { names, space, 1 }; -+} -+ -+struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, -+ struct dx_entry *entries, int levels) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count = dx_get_count (entries), names = 0, space = 0, i; -+ unsigned bcount = 0; -+ struct buffer_head *bh; -+ int err; -+ printk("%i indexed blocks...\n", count); -+ for (i = 0; i < count; i++, entries++) -+ { -+ u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; -+ u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; -+ struct stats stats; -+ printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); -+ if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; -+ stats = levels? -+ dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): -+ dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); -+ names += stats.names; -+ space += stats.space; -+ bcount += stats.bcount; -+ brelse (bh); -+ } -+ if (bcount) -+ printk("%snames %u, fullness %u (%u%%)\n", levels?"":" ", -+ names, space/bcount,(space/bcount)*100/blocksize); -+ return (struct stats) { names, space, bcount}; -+} -+#endif /* DX_DEBUG */ -+ -+/* -+ * Probe for a directory leaf block to search. -+ * -+ * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -+ * error in the directory index, and the caller should fall back to -+ * searching the directory normally. The callers of dx_probe **MUST** -+ * check for this error code, and make sure it never gets reflected -+ * back to userspace. -+ */ -+static struct dx_frame * -+dx_probe(struct dentry *dentry, struct inode *dir, -+ struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) -+{ -+ unsigned count, indirect; -+ struct dx_entry *at, *entries, *p, *q, *m; -+ struct dx_root *root; -+ struct buffer_head *bh; -+ struct dx_frame *frame = frame_in; -+ u32 hash; -+ -+ frame->bh = NULL; -+ if (dentry) -+ dir = dentry->d_parent->d_inode; -+ if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) -+ goto fail; -+ root = (struct dx_root *) bh->b_data; -+ if (root->info.hash_version != DX_HASH_TEA && -+ root->info.hash_version != DX_HASH_HALF_MD4 && -+ root->info.hash_version != DX_HASH_LEGACY) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unrecognised inode hash code %d", -+ root->info.hash_version); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ hinfo->hash_version = root->info.hash_version; -+ hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ if (dentry) -+ ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ hash = hinfo->hash; -+ -+ if (root->info.unused_flags & 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash flags: %#06x", -+ root->info.unused_flags); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ if ((indirect = root->info.indirect_levels) > 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash depth: %#06x", -+ root->info.indirect_levels); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ while (1) -+ { -+ count = dx_get_count(entries); -+ assert (count && count <= dx_get_limit(entries)); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ dxtrace(printk(".")); -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ -+ if (0) // linear search cross check -+ { -+ unsigned n = count - 1; -+ at = entries; -+ while (n--) -+ { -+ dxtrace(printk(",")); -+ if (dx_get_hash(++at) > hash) -+ { -+ at--; -+ break; -+ } -+ } -+ assert (at == p - 1); -+ } -+ -+ at = p - 1; -+ dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ frame->bh = bh; -+ frame->entries = entries; -+ frame->at = at; -+ if (!indirect--) return frame; -+ if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ goto fail2; -+ at = entries = ((struct dx_node *) bh->b_data)->entries; -+ assert (dx_get_limit(entries) == dx_node_limit (dir)); -+ frame++; -+ } -+fail2: -+ while (frame >= frame_in) { -+ brelse(frame->bh); -+ frame--; -+ } -+fail: -+ return NULL; -+} -+ -+static void dx_release (struct dx_frame *frames) -+{ -+ if (frames[0].bh == NULL) -+ return; -+ -+ if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ brelse(frames[1].bh); -+ brelse(frames[0].bh); -+} -+ -+/* -+ * This function increments the frame pointer to search the next leaf -+ * block, and reads in the necessary intervening nodes if the search -+ * should be necessary. Whether or not the search is necessary is -+ * controlled by the hash parameter. If the hash value is even, then -+ * the search is only continued if the next block starts with that -+ * hash value. This is used if we are searching for a specific file. -+ * -+ * If the hash value is HASH_NB_ALWAYS, then always go to the next block. -+ * -+ * This function returns 1 if the caller should continue to search, -+ * or 0 if it should not. If there is an error reading one of the -+ * index blocks, it will return -1. -+ * -+ * If start_hash is non-null, it will be filled in with the starting -+ * hash of the next page. -+ */ -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash) -+{ -+ struct dx_frame *p; -+ struct buffer_head *bh; -+ int num_frames = 0; -+ __u32 bhash; -+ -+ *err = ENOENT; -+ p = frame; -+ /* -+ * Find the next leaf page by incrementing the frame pointer. -+ * If we run out of entries in the interior node, loop around and -+ * increment pointer in the parent node. When we break out of -+ * this loop, num_frames indicates the number of interior -+ * nodes need to be read. -+ */ -+ while (1) { -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ break; -+ if (p == frames) -+ return 0; -+ num_frames++; -+ p--; -+ } -+ -+ /* -+ * If the hash is 1, then continue only if the next page has a -+ * continuation hash of any value. This is used for readdir -+ * handling. Otherwise, check to see if the hash matches the -+ * desired contiuation hash. If it doesn't, return since -+ * there's no point to read in the successive index pages. -+ */ -+ bhash = dx_get_hash(p->at); -+ if (start_hash) -+ *start_hash = bhash; -+ if ((hash & 1) == 0) { -+ if ((bhash & ~1) != hash) -+ return 0; -+ } -+ /* -+ * If the hash is HASH_NB_ALWAYS, we always go to the next -+ * block so no check is necessary -+ */ -+ while (num_frames--) { -+ if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -+ 0, err))) -+ return -1; /* Failure */ -+ p++; -+ brelse (p->bh); -+ p->bh = bh; -+ p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ } -+ return 1; -+} -+ -+ -+/* -+ * p is at least 6 bytes before the end of page -+ */ -+static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) -+{ -+ return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); -+} -+ -+/* -+ * This function fills a red-black tree with information from a -+ * directory. We start scanning the directory in hash order, starting -+ * at start_hash and start_minor_hash. -+ * -+ * This function returns the number of entries inserted into the tree, -+ * or a negative error code. -+ */ -+int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash) -+{ -+ struct dx_hash_info hinfo; -+ struct buffer_head *bh; -+ struct ext3_dir_entry_2 *de, *top; -+ static struct dx_frame frames[2], *frame; -+ struct inode *dir; -+ int block, err; -+ int count = 0; -+ int ret; -+ __u32 hashval; -+ -+ dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, -+ start_minor_hash)); -+ dir = dir_file->f_dentry->d_inode; -+ hinfo.hash = start_hash; -+ hinfo.minor_hash = 0; -+ frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ -+ /* Add '.' and '..' from the htree header */ -+ if (!start_hash && !start_minor_hash) { -+ de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; -+ de = ext3_next_entry(de); -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; -+ count += 2; -+ } -+ -+ while (1) { -+ block = dx_get_block(frame->at); -+ dxtrace(printk("Reading block %d\n", block)); -+ if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) -+ goto errout; -+ -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) { -+ ext3fs_dirhash(de->name, de->name_len, &hinfo); -+ if ((hinfo.hash < start_hash) || -+ ((hinfo.hash == start_hash) && -+ (hinfo.minor_hash < start_minor_hash))) -+ continue; -+ if ((err = ext3_htree_store_dirent(dir_file, -+ hinfo.hash, hinfo.minor_hash, de)) != 0) -+ goto errout; -+ count++; -+ } -+ brelse (bh); -+ hashval = ~1; -+ ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, -+ frame, frames, &err, &hashval); -+ if (next_hash) -+ *next_hash = hashval; -+ if (ret == -1) -+ goto errout; -+ /* -+ * Stop if: (a) there are no more entries, or -+ * (b) we have inserted at least one entry and the -+ * next hash value is not a continuation -+ */ -+ if ((ret == 0) || -+ (count && ((hashval & 1) == 0))) -+ break; -+ } -+ dx_release(frames); -+ dxtrace(printk("Fill tree: returned %d entries\n", count)); -+ return count; -+errout: -+ dx_release(frames); -+ return (err); -+} -+ -+ -+/* -+ * Directory block splitting, compacting -+ */ -+ -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) -+{ -+ int count = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ while ((char *) de < base + size) -+ { -+ if (de->name_len && de->inode) { -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ map_tail--; -+ map_tail->hash = h.hash; -+ map_tail->offs = (u32) ((char *) de - base); -+ count++; -+ } -+ /* XXX: do we need to check rec_len == 0 case? -Chris */ -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ return count; -+} -+ -+static void dx_sort_map (struct dx_map_entry *map, unsigned count) -+{ -+ struct dx_map_entry *p, *q, *top = map + count - 1; -+ int more; -+ /* Combsort until bubble sort doesn't suck */ -+ while (count > 2) -+ { -+ count = count*10/13; -+ if (count - 9 < 2) /* 9, 10 -> 11 */ -+ count = 11; -+ for (p = top, q = p - count; q >= map; p--, q--) -+ if (p->hash < q->hash) -+ swap(*p, *q); -+ } -+ /* Garden variety bubble sort */ -+ do { -+ more = 0; -+ q = top; -+ while (q-- > map) -+ { -+ if (q[1].hash >= q[0].hash) -+ continue; -+ swap(*(q+1), *q); -+ more = 1; -+ } -+ } while(more); -+} -+ -+static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+{ -+ struct dx_entry *entries = frame->entries; -+ struct dx_entry *old = frame->at, *new = old + 1; -+ int count = dx_get_count(entries); -+ -+ assert(count < dx_get_limit(entries)); -+ assert(old < entries + count); -+ memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); -+ dx_set_hash(new, hash); -+ dx_set_block(new, block); -+ dx_set_count(entries, count + 1); -+} -+#endif -+ -+ -+static void ext3_update_dx_flag(struct inode *inode) -+{ -+ if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, -+ EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; -+} -+ - /* - * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. - * -@@ -96,6 +738,7 @@ - return 0; - } - -+ - /* - * ext3_find_entry() - * -@@ -107,6 +750,8 @@ - * The returned buffer_head has ->b_count elevated. The caller is expected - * to brelse() it when appropriate. - */ -+ -+ - static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) - { -@@ -121,12 +766,32 @@ - int num = 0; - int nblocks, i, err; - struct inode *dir = dentry->d_parent->d_inode; -+ int namelen; -+ const u8 *name; -+ unsigned blocksize; - - *res_dir = NULL; - sb = dir->i_sb; -- -+ blocksize = sb->s_blocksize; -+ namelen = dentry->d_name.len; -+ name = dentry->d_name.name; -+ if (namelen > EXT3_NAME_LEN) -+ return NULL; -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ /* -+ * On success, or if the error was file not found, -+ * return. Otherwise, fall back to doing a search the -+ * old fashioned way. -+ */ -+ if (bh || (err != ERR_BAD_DX_DIR)) -+ return bh; -+ dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ } -+#endif - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); -- start = dir->u.ext3_i.i_dir_start_lookup; -+ start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) - start = 0; - block = start; -@@ -167,7 +832,7 @@ - i = search_dirblock(bh, dir, dentry, - block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); - if (i == 1) { -- dir->u.ext3_i.i_dir_start_lookup = block; -+ EXT3_I(dir)->i_dir_start_lookup = block; - ret = bh; - goto cleanup_and_exit; - } else { -@@ -198,6 +863,66 @@ - return ret; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err) -+{ -+ struct super_block * sb; -+ struct dx_hash_info hinfo; -+ u32 hash; -+ struct dx_frame frames[2], *frame; -+ struct ext3_dir_entry_2 *de, *top; -+ struct buffer_head *bh; -+ unsigned long block; -+ int retval; -+ int namelen = dentry->d_name.len; -+ const u8 *name = dentry->d_name.name; -+ struct inode *dir = dentry->d_parent->d_inode; -+ -+ sb = dir->i_sb; -+ if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+ return NULL; -+ hash = hinfo.hash; -+ do { -+ block = dx_get_block(frame->at); -+ if (!(bh = ext3_bread (NULL,dir, block, 0, err))) -+ goto errout; -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) -+ if (ext3_match (namelen, name, de)) { -+ if (!ext3_check_dir_entry("ext3_find_entry", -+ dir, de, bh, -+ (block<<EXT3_BLOCK_SIZE_BITS(sb)) -+ +((char *)de - bh->b_data))) { -+ brelse (bh); -+ goto errout; -+ } -+ *res_dir = de; -+ dx_release (frames); -+ return bh; -+ } -+ brelse (bh); -+ /* Check to see if we should continue to search */ -+ retval = ext3_htree_next_block(dir, hash, frame, -+ frames, err, 0); -+ if (retval == -1) { -+ ext3_warning(sb, __FUNCTION__, -+ "error reading index page in directory #%lu", -+ dir->i_ino); -+ goto errout; -+ } -+ } while (retval == 1); -+ -+ *err = -ENOENT; -+errout: -+ dxtrace(printk("%s not found\n", name)); -+ dx_release (frames); -+ return NULL; -+} -+#endif -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -214,8 +939,9 @@ - brelse (bh); - inode = iget(dir->i_sb, ino); - -- if (!inode) -+ if (!inode) { - return ERR_PTR(-EACCES); -+ } - } - d_add(dentry, inode); - return NULL; -@@ -239,6 +965,301 @@ - de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct ext3_dir_entry_2 * -+dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) -+{ -+ unsigned rec_len = 0; -+ -+ while (count--) { -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); -+ de->inode = 0; -+ map++; -+ to += rec_len; -+ } -+ return (struct ext3_dir_entry_2 *) (to - rec_len); -+} -+ -+static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) -+{ -+ struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ unsigned rec_len = 0; -+ -+ prev = to = de; -+ while ((char*)de < base + size) { -+ next = (struct ext3_dir_entry_2 *) ((char *) de + -+ le16_to_cpu(de->rec_len)); -+ if (de->inode && de->name_len) { -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ if (de > to) -+ memmove(to, de, rec_len); -+ to->rec_len = cpu_to_le16(rec_len); -+ prev = to; -+ to = (struct ext3_dir_entry_2 *)((char *) to + rec_len); -+ } -+ de = next; -+ } -+ return prev; -+} -+ -+static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, -+ struct buffer_head **bh,struct dx_frame *frame, -+ struct dx_hash_info *hinfo, int *error) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count, continued; -+ struct buffer_head *bh2; -+ u32 newblock; -+ u32 hash2; -+ struct dx_map_entry *map; -+ char *data1 = (*bh)->b_data, *data2; -+ unsigned split; -+ struct ext3_dir_entry_2 *de = NULL, *de2; -+ int err; -+ -+ bh2 = ext3_append (handle, dir, &newblock, error); -+ if (!(bh2)) { -+ brelse(*bh); -+ *bh = NULL; -+ goto errout; -+ } -+ -+ BUFFER_TRACE(*bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, *bh); -+ if (err) { -+ journal_error: -+ brelse(*bh); -+ brelse(bh2); -+ *bh = NULL; -+ ext3_std_error(dir->i_sb, err); -+ goto errout; -+ } -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ -+ data2 = bh2->b_data; -+ -+ /* create map in the end of data2 block */ -+ map = (struct dx_map_entry *) (data2 + blocksize); -+ count = dx_make_map ((struct ext3_dir_entry_2 *) data1, -+ blocksize, hinfo, map); -+ map -= count; -+ split = count/2; // need to adjust to actual middle -+ dx_sort_map (map, count); -+ hash2 = map[split].hash; -+ continued = hash2 == map[split - 1].hash; -+ dxtrace(printk("Split block %i at %x, %i/%i\n", -+ dx_get_block(frame->at), hash2, split, count-split)); -+ -+ /* Fancy dance to stay within two buffers */ -+ de2 = dx_move_dirents(data1, data2, map + split, count - split); -+ de = dx_pack_dirents(data1,blocksize); -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ -+ /* Which block gets the new entry? */ -+ if (hinfo->hash >= hash2) -+ { -+ swap(*bh, bh2); -+ de = de2; -+ } -+ dx_insert_block (frame, hash2 + continued, newblock); -+ err = ext3_journal_dirty_metadata (handle, bh2); -+ if (err) -+ goto journal_error; -+ err = ext3_journal_dirty_metadata (handle, frame->bh); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ dxtrace(dx_show_index ("frame", frame->entries)); -+errout: -+ return de; -+} -+#endif -+ -+ -+/* -+ * Add a new entry into a directory (leaf) block. If de is non-NULL, -+ * it points to a directory entry which is guaranteed to be large -+ * enough for new directory entry. If de is NULL, then -+ * add_dirent_to_buf will attempt search the directory block for -+ * space. It will return -ENOSPC if no space is available, and -EIO -+ * and -EEXIST if directory entry already exists. -+ * -+ * NOTE! bh is NOT released in the case where ENOSPC is returned. In -+ * all other cases bh is released. -+ */ -+static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct ext3_dir_entry_2 *de, -+ struct buffer_head * bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ unsigned long offset = 0; -+ unsigned short reclen; -+ int nlen, rlen, err; -+ char *top; -+ -+ reclen = EXT3_DIR_REC_LEN(namelen); -+ if (!de) { -+ de = (struct ext3_dir_entry_2 *)bh->b_data; -+ top = bh->b_data + dir->i_sb->s_blocksize - reclen; -+ while ((char *) de <= top) { -+ if (!ext3_check_dir_entry("ext3_add_entry", dir, de, -+ bh, offset)) { -+ brelse (bh); -+ return -EIO; -+ } -+ if (ext3_match (namelen, name, de)) { -+ brelse (bh); -+ return -EEXIST; -+ } -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if ((de->inode? rlen - nlen: rlen) >= reclen) -+ break; -+ de = (struct ext3_dir_entry_2 *)((char *)de + rlen); -+ offset += rlen; -+ } -+ if ((char *) de > top) -+ return -ENOSPC; -+ } -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) { -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return err; -+ } -+ -+ /* By now the buffer is marked for journaling */ -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if (de->inode) { -+ struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ de1->rec_len = cpu_to_le16(rlen - nlen); -+ de->rec_len = cpu_to_le16(nlen); -+ de = de1; -+ } -+ de->file_type = EXT3_FT_UNKNOWN; -+ if (inode) { -+ de->inode = cpu_to_le32(inode->i_ino); -+ ext3_set_de_type(dir->i_sb, de, inode->i_mode); -+ } else -+ de->inode = 0; -+ de->name_len = namelen; -+ memcpy (de->name, name, namelen); -+ /* -+ * XXX shouldn't update any times until successful -+ * completion of syscall, but too many callers depend -+ * on this. -+ * -+ * XXX similarly, too many callers depend on -+ * ext3_new_inode() setting the times, but error -+ * recovery deletes the inode, so the worst that can -+ * happen is that the times are slightly out of date -+ * and/or different from the directory change time. -+ */ -+ dir->i_mtime = dir->i_ctime = CURRENT_TIME; -+ ext3_update_dx_flag(dir); -+ dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return 0; -+} -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * This converts a one block unindexed directory to a 3 block indexed -+ * directory, and adds the dentry to the indexed directory. -+ */ -+static int make_indexed_dir(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct buffer_head *bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ struct buffer_head *bh2; -+ struct dx_root *root; -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries; -+ struct ext3_dir_entry_2 *de, *de2; -+ char *data1, *top; -+ unsigned len; -+ int retval; -+ unsigned blocksize; -+ struct dx_hash_info hinfo; -+ u32 block; -+ -+ blocksize = dir->i_sb->s_blocksize; -+ dxtrace(printk("Creating index\n")); -+ retval = ext3_journal_get_write_access(handle, bh); -+ if (retval) { -+ ext3_std_error(dir->i_sb, retval); -+ brelse(bh); -+ return retval; -+ } -+ root = (struct dx_root *) bh->b_data; -+ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ bh2 = ext3_append (handle, dir, &block, &retval); -+ if (!(bh2)) { -+ brelse(bh); -+ return retval; -+ } -+ data1 = bh2->b_data; -+ -+ /* The 0th block becomes the root, move the dirents out */ -+ de = (struct ext3_dir_entry_2 *)&root->dotdot; -+ de = (struct ext3_dir_entry_2 *)((char *)de + le16_to_cpu(de->rec_len)); -+ len = ((char *) root) + blocksize - (char *) de; -+ memcpy (data1, de, len); -+ de = (struct ext3_dir_entry_2 *) data1; -+ top = data1 + len; -+ while (((char *) de2=(char*)de+le16_to_cpu(de->rec_len)) < top) -+ de = de2; -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ /* Initialize the root; the dot dirents already exist */ -+ de = (struct ext3_dir_entry_2 *) (&root->dotdot); -+ de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); -+ memset (&root->info, 0, sizeof(root->info)); -+ root->info.info_length = sizeof(root->info); -+ root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ entries = root->entries; -+ dx_set_block (entries, 1); -+ dx_set_count (entries, 1); -+ dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info))); -+ -+ /* Initialize as for dx_probe */ -+ hinfo.hash_version = root->info.hash_version; -+ hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ ext3fs_dirhash(name, namelen, &hinfo); -+ frame = frames; -+ frame->entries = entries; -+ frame->at = entries; -+ frame->bh = bh; -+ bh = bh2; -+ de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ dx_release (frames); -+ if (!(de)) -+ return retval; -+ -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} -+#endif -+ - /* - * ext3_add_entry() - * -@@ -249,127 +1270,198 @@ - * may not sleep between calling this and putting something into - * the entry, as someone else might have used it while you slept. - */ -- --/* -- * AKPM: the journalling code here looks wrong on the error paths -- */ - static int ext3_add_entry (handle_t *handle, struct dentry *dentry, - struct inode *inode) - { - struct inode *dir = dentry->d_parent->d_inode; -- const char *name = dentry->d_name.name; -- int namelen = dentry->d_name.len; - unsigned long offset; -- unsigned short rec_len; - struct buffer_head * bh; -- struct ext3_dir_entry_2 * de, * de1; -+ struct ext3_dir_entry_2 *de; - struct super_block * sb; - int retval; -+#ifdef CONFIG_EXT3_INDEX -+ int dx_fallback=0; -+#endif -+ unsigned blocksize; -+ unsigned nlen, rlen; -+ u32 block, blocks; - - sb = dir->i_sb; -- -- if (!namelen) -+ blocksize = sb->s_blocksize; -+ if (!dentry->d_name.len) - return -EINVAL; -- bh = ext3_bread (handle, dir, 0, 0, &retval); -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ retval = ext3_dx_add_entry(handle, dentry, inode); -+ if (!retval || (retval != ERR_BAD_DX_DIR)) -+ return retval; -+ EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; -+ dx_fallback++; -+ ext3_mark_inode_dirty(handle, dir); -+ } -+#endif -+ blocks = dir->i_size >> sb->s_blocksize_bits; -+ for (block = 0, offset = 0; block < blocks; block++) { -+ bh = ext3_bread(handle, dir, block, 0, &retval); -+ if(!bh) -+ return retval; -+ retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (retval != -ENOSPC) -+ return retval; -+ -+#ifdef CONFIG_EXT3_INDEX -+ if (blocks == 1 && !dx_fallback && -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ return make_indexed_dir(handle, dentry, inode, bh); -+#endif -+ brelse(bh); -+ } -+ bh = ext3_append(handle, dir, &block, &retval); - if (!bh) - return retval; -- rec_len = EXT3_DIR_REC_LEN(namelen); -- offset = 0; - de = (struct ext3_dir_entry_2 *) bh->b_data; -- while (1) { -- if ((char *)de >= sb->s_blocksize + bh->b_data) { -- brelse (bh); -- bh = NULL; -- bh = ext3_bread (handle, dir, -- offset >> EXT3_BLOCK_SIZE_BITS(sb), 1, &retval); -- if (!bh) -- return retval; -- if (dir->i_size <= offset) { -- if (dir->i_size == 0) { -- brelse(bh); -- return -ENOENT; -- } -+ de->inode = 0; -+ de->rec_len = cpu_to_le16(rlen = blocksize); -+ nlen = 0; -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} - -- ext3_debug ("creating next block\n"); -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * Returns 0 for success, or a negative error value -+ */ -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries, *at; -+ struct dx_hash_info hinfo; -+ struct buffer_head * bh; -+ struct inode *dir = dentry->d_parent->d_inode; -+ struct super_block * sb = dir->i_sb; -+ struct ext3_dir_entry_2 *de; -+ int err; - -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- de->inode = 0; -- de->rec_len = le16_to_cpu(sb->s_blocksize); -- dir->u.ext3_i.i_disksize = -- dir->i_size = offset + sb->s_blocksize; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); -- } else { -+ frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ entries = frame->entries; -+ at = frame->at; - -- ext3_debug ("skipping to next block\n"); -+ if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ goto cleanup; - -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- } -- } -- if (!ext3_check_dir_entry ("ext3_add_entry", dir, de, bh, -- offset)) { -- brelse (bh); -- return -ENOENT; -- } -- if (ext3_match (namelen, name, de)) { -- brelse (bh); -- return -EEXIST; -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto journal_error; -+ -+ err = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (err != -ENOSPC) { -+ bh = 0; -+ goto cleanup; -+ } -+ -+ /* Block full, should compress but for now just split */ -+ dxtrace(printk("using %u of %u node entries\n", -+ dx_get_count(entries), dx_get_limit(entries))); -+ /* Need to split index? */ -+ if (dx_get_count(entries) == dx_get_limit(entries)) { -+ u32 newblock; -+ unsigned icount = dx_get_count(entries); -+ int levels = frame - frames; -+ struct dx_entry *entries2; -+ struct dx_node *node2; -+ struct buffer_head *bh2; -+ -+ if (levels && (dx_get_count(frames->entries) == -+ dx_get_limit(frames->entries))) { -+ ext3_warning(sb, __FUNCTION__, -+ "Directory index full!\n"); -+ err = -ENOSPC; -+ goto cleanup; - } -- if ((le32_to_cpu(de->inode) == 0 && -- le16_to_cpu(de->rec_len) >= rec_len) || -- (le16_to_cpu(de->rec_len) >= -- EXT3_DIR_REC_LEN(de->name_len) + rec_len)) { -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- /* By now the buffer is marked for journaling */ -- offset += le16_to_cpu(de->rec_len); -- if (le32_to_cpu(de->inode)) { -- de1 = (struct ext3_dir_entry_2 *) ((char *) de + -- EXT3_DIR_REC_LEN(de->name_len)); -- de1->rec_len = -- cpu_to_le16(le16_to_cpu(de->rec_len) - -- EXT3_DIR_REC_LEN(de->name_len)); -- de->rec_len = cpu_to_le16( -- EXT3_DIR_REC_LEN(de->name_len)); -- de = de1; -+ bh2 = ext3_append (handle, dir, &newblock, &err); -+ if (!(bh2)) -+ goto cleanup; -+ node2 = (struct dx_node *)(bh2->b_data); -+ entries2 = node2->entries; -+ node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -+ node2->fake.inode = 0; -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ if (levels) { -+ unsigned icount1 = icount/2, icount2 = icount - icount1; -+ unsigned hash2 = dx_get_hash(entries + icount1); -+ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ err = ext3_journal_get_write_access(handle, -+ frames[0].bh); -+ if (err) -+ goto journal_error; -+ -+ memcpy ((char *) entries2, (char *) (entries + icount1), -+ icount2 * sizeof(struct dx_entry)); -+ dx_set_count (entries, icount1); -+ dx_set_count (entries2, icount2); -+ dx_set_limit (entries2, dx_node_limit(dir)); -+ -+ /* Which index block gets the new entry? */ -+ if (at - entries >= icount1) { -+ frame->at = at = at - entries - icount1 + entries2; -+ frame->entries = entries = entries2; -+ swap(frame->bh, bh2); - } -- de->file_type = EXT3_FT_UNKNOWN; -- if (inode) { -- de->inode = cpu_to_le32(inode->i_ino); -- ext3_set_de_type(dir->i_sb, de, inode->i_mode); -- } else -- de->inode = 0; -- de->name_len = namelen; -- memcpy (de->name, name, namelen); -- /* -- * XXX shouldn't update any times until successful -- * completion of syscall, but too many callers depend -- * on this. -- * -- * XXX similarly, too many callers depend on -- * ext3_new_inode() setting the times, but error -- * recovery deletes the inode, so the worst that can -- * happen is that the times are slightly out of date -- * and/or different from the directory change time. -- */ -- dir->i_mtime = dir->i_ctime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- 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); -- return 0; -+ dx_insert_block (frames + 0, hash2, newblock); -+ dxtrace(dx_show_index ("node", frames[1].entries)); -+ dxtrace(dx_show_index ("node", -+ ((struct dx_node *) bh2->b_data)->entries)); -+ err = ext3_journal_dirty_metadata(handle, bh2); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ } else { -+ dxtrace(printk("Creating second level index...\n")); -+ memcpy((char *) entries2, (char *) entries, -+ icount * sizeof(struct dx_entry)); -+ dx_set_limit(entries2, dx_node_limit(dir)); -+ -+ /* Set up root */ -+ dx_set_count(entries, 1); -+ dx_set_block(entries + 0, newblock); -+ ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ -+ /* Add new access path frame */ -+ frame = frames + 1; -+ frame->at = at = at - entries + entries2; -+ frame->entries = entries = entries2; -+ frame->bh = bh2; -+ err = ext3_journal_get_write_access(handle, -+ frame->bh); -+ if (err) -+ goto journal_error; - } -- offset += le16_to_cpu(de->rec_len); -- de = (struct ext3_dir_entry_2 *) -- ((char *) de + le16_to_cpu(de->rec_len)); -+ ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- brelse (bh); -- return -ENOSPC; -+ de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ if (!de) -+ goto cleanup; -+ err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ bh = 0; -+ goto cleanup; -+ -+journal_error: -+ ext3_std_error(dir->i_sb, err); -+cleanup: -+ if (bh) -+ brelse(bh); -+ dx_release(frames); -+ return err; - } -+#endif - - /* - * ext3_delete_entry deletes a directory entry by merging it with the -@@ -456,9 +1548,11 @@ - struct inode * inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -482,9 +1576,11 @@ - struct inode *inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -513,9 +1609,11 @@ - if (dir->i_nlink >= EXT3_LINK_MAX) - return -EMLINK; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -527,7 +1625,7 @@ - - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -- inode->i_size = inode->u.ext3_i.i_disksize = inode->i_sb->s_blocksize; -+ inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ -@@ -556,21 +1654,19 @@ - brelse (dir_block); - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); -- if (err) -- goto out_no_entry; -+ if (err) { -+ inode->i_nlink = 0; -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - dir->i_nlink++; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - d_instantiate(dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- inode->i_nlink = 0; -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - /* -@@ -657,7 +1753,7 @@ - int err = 0, rc; - - lock_super(sb); -- if (!list_empty(&inode->u.ext3_i.i_orphan)) -+ if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - - /* Orphan handling is only valid for files with data blocks -@@ -698,7 +1794,7 @@ - * This is safe: on error we're going to ignore the orphan list - * anyway on the next recovery. */ - if (!err) -- list_add(&inode->u.ext3_i.i_orphan, &EXT3_SB(sb)->s_orphan); -+ list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", -@@ -716,25 +1812,26 @@ - int ext3_orphan_del(handle_t *handle, struct inode *inode) - { - struct list_head *prev; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct ext3_sb_info *sbi; - unsigned long ino_next; - struct ext3_iloc iloc; - int err = 0; - - lock_super(inode->i_sb); -- if (list_empty(&inode->u.ext3_i.i_orphan)) { -+ if (list_empty(&ei->i_orphan)) { - unlock_super(inode->i_sb); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); -- prev = inode->u.ext3_i.i_orphan.prev; -+ prev = ei->i_orphan.prev; - sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino); - -- list_del(&inode->u.ext3_i.i_orphan); -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ list_del(&ei->i_orphan); -+ INIT_LIST_HEAD(&ei->i_orphan); - - /* If we're on an error path, we may not have a valid - * transaction handle with which to update the orphan list on -@@ -795,8 +1892,9 @@ - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); -@@ -834,7 +1932,7 @@ - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; - ext3_mark_inode_dirty(handle, inode); -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - - end_rmdir: -@@ -852,8 +1950,9 @@ - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -880,7 +1979,7 @@ - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - inode->i_nlink--; - if (!inode->i_nlink) -@@ -906,9 +2005,11 @@ - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 5); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -918,7 +2019,7 @@ - if (IS_ERR(inode)) - goto out_stop; - -- if (l > sizeof (inode->u.ext3_i.i_data)) { -+ if (l > sizeof (EXT3_I(inode)->i_data)) { - inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* -@@ -927,24 +2028,22 @@ - * i_size in generic_commit_write(). - */ - err = block_symlink(inode, symname, l); -- if (err) -- goto out_no_entry; -+ if (err) { -+ ext3_dec_count(handle, inode); -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - } else { - inode->i_op = &ext3_fast_symlink_inode_operations; -- memcpy((char*)&inode->u.ext3_i.i_data,symname,l); -+ memcpy((char*)&EXT3_I(inode)->i_data,symname,l); - inode->i_size = l-1; - } -- inode->u.ext3_i.i_disksize = inode->i_size; -+ EXT3_I(inode)->i_disksize = inode->i_size; - err = ext3_add_nondir(handle, dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- ext3_dec_count(handle, inode); -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - static int ext3_link (struct dentry * old_dentry, -@@ -957,12 +2056,15 @@ - if (S_ISDIR(inode->i_mode)) - return -EPERM; - -- if (inode->i_nlink >= EXT3_LINK_MAX) -+ if (inode->i_nlink >= EXT3_LINK_MAX) { - return -EMLINK; -+ } - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -995,9 +2097,11 @@ - - old_bh = new_bh = dir_bh = NULL; - -- handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + 2); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; -@@ -1070,14 +2174,37 @@ - /* - * ok, that's it - */ -- ext3_delete_entry(handle, old_dir, old_de, old_bh); -+ if (le32_to_cpu(old_de->inode) != old_inode->i_ino || -+ old_de->name_len != old_dentry->d_name.len || -+ strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || -+ (retval = ext3_delete_entry(handle, old_dir, -+ old_de, old_bh)) == -ENOENT) { -+ /* old_de could have moved from under us during htree split, so -+ * make sure that we are deleting the right entry. We might -+ * also be pointing to a stale entry in the unused part of -+ * old_bh so just checking inum and the name isn't enough. */ -+ struct buffer_head *old_bh2; -+ struct ext3_dir_entry_2 *old_de2; -+ -+ old_bh2 = ext3_find_entry(old_dentry, &old_de2); -+ if (old_bh2) { -+ retval = ext3_delete_entry(handle, old_dir, -+ old_de2, old_bh2); -+ brelse(old_bh2); -+ } -+ } -+ if (retval) { -+ ext3_warning(old_dir->i_sb, "ext3_rename", -+ "Deleting old file (%lu), %d, error=%d", -+ old_dir->i_ino, old_dir->i_nlink, retval); -+ } - - if (new_inode) { - new_inode->i_nlink--; - new_inode->i_ctime = CURRENT_TIME; - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; -- old_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(old_dir); - if (dir_bh) { - BUFFER_TRACE(dir_bh, "get_write_access"); - ext3_journal_get_write_access(handle, dir_bh); -@@ -1089,7 +2212,7 @@ - new_inode->i_nlink--; - } else { - new_dir->i_nlink++; -- new_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(new_dir); - ext3_mark_inode_dirty(handle, new_dir); - } - } -Index: linux-2.4.21-chaos/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/super.c 2003-12-12 16:17:59.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/super.c 2003-12-12 16:18:17.000000000 +0300 -@@ -777,6 +777,7 @@ - es->s_mtime = cpu_to_le32(CURRENT_TIME); - ext3_update_dynamic_rev(sb); - EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -+ - ext3_commit_super (sb, es, 1); - if (test_opt (sb, DEBUG)) - printk (KERN_INFO -@@ -787,6 +788,7 @@ - EXT3_BLOCKS_PER_GROUP(sb), - EXT3_INODES_PER_GROUP(sb), - sbi->s_mount_opt); -+ - printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ", - bdevname(sb->s_dev)); - if (EXT3_SB(sb)->s_journal->j_inode == NULL) { -@@ -960,6 +962,7 @@ - return res; - } - -+ - struct super_block * ext3_read_super (struct super_block * sb, void * data, - int silent) - { -@@ -1146,6 +1149,9 @@ - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+ for (i=0; i < 4; i++) -+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); -+ sbi->s_def_hash_version = es->s_def_hash_version; - - if (sbi->s_blocks_per_group > blocksize * 8) { - printk (KERN_ERR -@@ -1938,6 +1944,7 @@ - unregister_filesystem(&ext3_fs_type); - } - -+EXPORT_SYMBOL(ext3_force_commit); - EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); -Index: linux-2.4.21-chaos/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs.h 2003-12-12 16:18:17.000000000 +0300 -@@ -40,6 +40,11 @@ - #define EXT3FS_VERSION "2.4-0.9.19" - - /* -+ * Always enable hashed directories -+ */ -+#define CONFIG_EXT3_INDEX -+ -+/* - * Debug code - */ - #ifdef EXT3FS_DEBUG -@@ -415,8 +420,11 @@ - /*E0*/ __u32 s_journal_inum; /* inode number of journal file */ - __u32 s_journal_dev; /* device number of journal file */ - __u32 s_last_orphan; /* start of list of inodes to delete */ -- --/*EC*/ __u32 s_reserved[197]; /* Padding to the end of the block */ -+ __u32 s_hash_seed[4]; /* HTREE hash seed */ -+ __u8 s_def_hash_version; /* Default hash version to use */ -+ __u8 s_reserved_char_pad; -+ __u16 s_reserved_word_pad; -+ __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -553,9 +561,46 @@ - #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) - #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ - ~EXT3_DIR_ROUND) -+/* -+ * Hash Tree Directory indexing -+ * (c) Daniel Phillips, 2001 -+ */ -+ -+#ifdef CONFIG_EXT3_INDEX -+ #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ -+ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ -+ (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) -+#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) -+#else -+ #define is_dx(dir) 0 -+#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) -+#endif -+ -+/* Legal values for the dx_root hash_version field: */ -+ -+#define DX_HASH_LEGACY 0 -+#define DX_HASH_HALF_MD4 1 -+#define DX_HASH_TEA 2 -+ -+/* hash info structure used by the directory hash */ -+struct dx_hash_info -+{ -+ u32 hash; -+ u32 minor_hash; -+ int hash_version; -+ u32 *seed; -+}; - - #ifdef __KERNEL__ - /* -+ * Control parameters used by ext3_htree_next_block -+ */ -+#define HASH_NB_ALWAYS 1 -+ -+ -+/* - * Describe an inode's exact location on disk and in memory - */ - struct ext3_iloc -@@ -565,6 +610,27 @@ - unsigned long block_group; - }; - -+ -+/* -+ * This structure is stuffed into the struct file's private_data field -+ * for directories. It is where we put information so that we can do -+ * readdir operations in hash tree order. -+ */ -+struct dir_private_info { -+ rb_root_t root; -+ rb_node_t *curr_node; -+ struct fname *extra_fname; -+ loff_t last_pos; -+ __u32 curr_hash; -+ __u32 curr_minor_hash; -+ __u32 next_hash; -+}; -+ -+/* -+ * Special error return code only used by dx_probe() and its callers. -+ */ -+#define ERR_BAD_DX_DIR -75000 -+ - /* - * Function prototypes - */ -@@ -592,11 +658,20 @@ - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, -- struct ext3_dir_entry_2 *, struct buffer_head *, -- unsigned long); -+ struct ext3_dir_entry_2 *, -+ struct buffer_head *, unsigned long); -+extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent); -+extern void ext3_htree_free_dir_info(struct dir_private_info *p); -+ - /* fsync.c */ - extern int ext3_sync_file (struct file *, struct dentry *, int); - -+/* hash.c */ -+extern int ext3fs_dirhash(const char *name, int len, struct -+ dx_hash_info *hinfo); -+ - /* ialloc.c */ - extern struct inode * ext3_new_inode (handle_t *, struct inode *, int); - extern void ext3_free_inode (handle_t *, struct inode *); -@@ -630,6 +705,8 @@ - /* namei.c */ - extern int ext3_orphan_add(handle_t *, struct inode *); - extern int ext3_orphan_del(handle_t *, struct inode *); -+extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash); - - /* super.c */ - extern void ext3_error (struct super_block *, const char *, const char *, ...) -Index: linux-2.4.21-chaos/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs_sb.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs_sb.h 2003-12-12 16:18:17.000000000 +0300 -@@ -62,6 +62,8 @@ - int s_inode_size; - int s_first_ino; - u32 s_next_generation; -+ u32 s_hash_seed[4]; -+ int s_def_hash_version; - - /* Journaling */ - struct inode * s_journal_inode; -Index: linux-2.4.21-chaos/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_jbd.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_jbd.h 2003-12-12 16:18:17.000000000 +0300 -@@ -69,6 +69,8 @@ - - #define EXT3_RESERVE_TRANS_BLOCKS 12U - -+#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, -Index: linux-2.4.21-chaos/include/linux/rbtree.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/rbtree.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/rbtree.h 2003-12-12 16:18:17.000000000 +0300 -@@ -120,6 +120,8 @@ - - extern void rb_insert_color(rb_node_t *, rb_root_t *); - extern void rb_erase(rb_node_t *, rb_root_t *); -+extern rb_node_t *rb_get_first(rb_root_t *root); -+extern rb_node_t *rb_get_next(rb_node_t *n); - - static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link) - { -Index: linux-2.4.21-chaos/lib/rbtree.c -=================================================================== ---- linux-2.4.21-chaos.orig/lib/rbtree.c 2002-09-25 21:14:03.000000000 +0400 -+++ linux-2.4.21-chaos/lib/rbtree.c 2003-12-12 16:18:17.000000000 +0300 -@@ -17,6 +17,8 @@ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - linux/lib/rbtree.c -+ -+ rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002 - */ - - #include <linux/rbtree.h> -@@ -294,3 +296,43 @@ - __rb_erase_color(child, parent, root); - } - EXPORT_SYMBOL(rb_erase); -+ -+/* -+ * This function returns the first node (in sort order) of the tree. -+ */ -+rb_node_t *rb_get_first(rb_root_t *root) -+{ -+ rb_node_t *n; -+ -+ n = root->rb_node; -+ if (!n) -+ return 0; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+} -+EXPORT_SYMBOL(rb_get_first); -+ -+/* -+ * Given a node, this function will return the next node in the tree. -+ */ -+rb_node_t *rb_get_next(rb_node_t *n) -+{ -+ rb_node_t *parent; -+ -+ if (n->rb_right) { -+ n = n->rb_right; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+ } else { -+ while ((parent = n->rb_parent)) { -+ if (n == parent->rb_left) -+ return parent; -+ n = parent; -+ } -+ return 0; -+ } -+} -+EXPORT_SYMBOL(rb_get_next); -+ diff --git a/lustre/kernel_patches/patches/ext3-htree-2.4.22-rh.patch b/lustre/kernel_patches/patches/ext3-htree-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-htree-2.4.22-rh.patch rename to lustre/kernel_patches/patches/ext3-htree-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-htree-rename_fix.patch b/lustre/kernel_patches/patches/ext3-htree-rename_fix.patch deleted file mode 100644 index 75bf2887dc..0000000000 --- a/lustre/kernel_patches/patches/ext3-htree-rename_fix.patch +++ /dev/null @@ -1,24 +0,0 @@ -===== fs/ext3/namei.c 1.52 vs edited ===== ---- 1.52/fs/ext3/namei.c Mon May 10 05:25:34 2004 -+++ edited/fs/ext3/namei.c Thu May 20 19:57:10 2004 -@@ -2264,11 +2264,15 @@ - /* - * ok, that's it - */ -- retval = ext3_delete_entry(handle, old_dir, old_de, old_bh); -- if (retval == -ENOENT) { -- /* -- * old_de could have moved out from under us. -- */ -+ if (le32_to_cpu(old_de->inode) != old_inode->i_ino || -+ old_de->name_len != old_dentry->d_name.len || -+ strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || -+ (retval = ext3_delete_entry(handle, old_dir, -+ old_de, old_bh)) == -ENOENT) { -+ /* old_de could have moved from under us during htree split, so -+ * make sure that we are deleting the right entry. We might -+ * also be pointing to a stale entry in the unused part of -+ * old_bh so just checking inum and the name isn't enough. */ - struct buffer_head *old_bh2; - struct ext3_dir_entry_2 *old_de2; - diff --git a/lustre/kernel_patches/patches/ext3-htree-suse.patch b/lustre/kernel_patches/patches/ext3-htree-suse.patch deleted file mode 100644 index 3e5148ea44..0000000000 --- a/lustre/kernel_patches/patches/ext3-htree-suse.patch +++ /dev/null @@ -1,2557 +0,0 @@ - fs/ext3/Makefile | 2 - fs/ext3/dir.c | 302 +++++++++ - fs/ext3/file.c | 3 - fs/ext3/hash.c | 215 ++++++ - fs/ext3/namei.c | 1420 ++++++++++++++++++++++++++++++++++++++++----- - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 85 ++ - include/linux/ext3_fs_sb.h | 2 - include/linux/ext3_jbd.h | 2 - include/linux/rbtree.h | 2 - lib/rbtree.c | 42 + - 11 files changed, 1921 insertions(+), 161 deletions(-) - -Index: linux-2.4.21-suse/fs/ext3/dir.c -=================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/dir.c 2001-11-10 01:25:04.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/dir.c 2003-10-29 23:17:20.000000000 +0300 -@@ -21,12 +21,16 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/slab.h> -+#include <linux/rbtree.h> - - static unsigned char ext3_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK - }; - - static int ext3_readdir(struct file *, void *, filldir_t); -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir); - - struct file_operations ext3_dir_operations = { - read: generic_read_dir, -@@ -35,6 +39,17 @@ - fsync: ext3_sync_file, /* BKL held */ - }; - -+ -+static unsigned char get_dtype(struct super_block *sb, int filetype) -+{ -+ if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || -+ (filetype >= EXT3_FT_MAX)) -+ return DT_UNKNOWN; -+ -+ return (ext3_filetype_table[filetype]); -+} -+ -+ - int ext3_check_dir_entry (const char * function, struct inode * dir, - struct ext3_dir_entry_2 * de, - struct buffer_head * bh, -@@ -79,6 +94,16 @@ - - sb = inode->i_sb; - -+ if (is_dx(inode)) { -+ err = ext3_dx_readdir(filp, dirent, filldir); -+ if (err != ERR_BAD_DX_DIR) -+ return err; -+ /* -+ * We don't set the inode dirty flag since it's not -+ * critical that it get flushed back to the disk. -+ */ -+ EXT3_I(filp->f_dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; -+ } - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); -@@ -162,18 +187,12 @@ - * during the copy operation. - */ - unsigned long version = filp->f_version; -- unsigned char d_type = DT_UNKNOWN; - -- if (EXT3_HAS_INCOMPAT_FEATURE(sb, -- EXT3_FEATURE_INCOMPAT_FILETYPE) -- && de->file_type < EXT3_FT_MAX) -- d_type = -- ext3_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, - le32_to_cpu(de->inode), -- d_type); -+ get_dtype(sb, de->file_type)); - if (error) - break; - if (version != filp->f_version) -@@ -188,3 +207,272 @@ - UPDATE_ATIME(inode); - return 0; - } -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * These functions convert from the major/minor hash to an f_pos -+ * value. -+ * -+ * Currently we only use major hash numer. This is unfortunate, but -+ * on 32-bit machines, the same VFS interface is used for lseek and -+ * llseek, so if we use the 64 bit offset, then the 32-bit versions of -+ * lseek/telldir/seekdir will blow out spectacularly, and from within -+ * the ext2 low-level routine, we don't know if we're being called by -+ * a 64-bit version of the system call or the 32-bit version of the -+ * system call. Worse yet, NFSv2 only allows for a 32-bit readdir -+ * cookie. Sigh. -+ */ -+#define hash2pos(major, minor) (major >> 1) -+#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff) -+#define pos2min_hash(pos) (0) -+ -+/* -+ * This structure holds the nodes of the red-black tree used to store -+ * the directory entry in hash order. -+ */ -+struct fname { -+ __u32 hash; -+ __u32 minor_hash; -+ rb_node_t rb_hash; -+ struct fname *next; -+ __u32 inode; -+ __u8 name_len; -+ __u8 file_type; -+ char name[0]; -+}; -+ -+/* -+ * This functoin implements a non-recursive way of freeing all of the -+ * nodes in the red-black tree. -+ */ -+static void free_rb_tree_fname(rb_root_t *root) -+{ -+ rb_node_t *n = root->rb_node; -+ rb_node_t *parent; -+ struct fname *fname; -+ -+ while (n) { -+ /* Do the node's children first */ -+ if ((n)->rb_left) { -+ n = n->rb_left; -+ continue; -+ } -+ if (n->rb_right) { -+ n = n->rb_right; -+ continue; -+ } -+ /* -+ * The node has no children; free it, and then zero -+ * out parent's link to it. Finally go to the -+ * beginning of the loop and try to free the parent -+ * node. -+ */ -+ parent = n->rb_parent; -+ fname = rb_entry(n, struct fname, rb_hash); -+ kfree(fname); -+ if (!parent) -+ root->rb_node = 0; -+ else if (parent->rb_left == n) -+ parent->rb_left = 0; -+ else if (parent->rb_right == n) -+ parent->rb_right = 0; -+ n = parent; -+ } -+ root->rb_node = 0; -+} -+ -+ -+struct dir_private_info *create_dir_info(loff_t pos) -+{ -+ struct dir_private_info *p; -+ -+ p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL); -+ if (!p) -+ return NULL; -+ p->root.rb_node = 0; -+ p->curr_node = 0; -+ p->extra_fname = 0; -+ p->last_pos = 0; -+ p->curr_hash = pos2maj_hash(pos); -+ p->curr_minor_hash = pos2min_hash(pos); -+ p->next_hash = 0; -+ return p; -+} -+ -+void ext3_htree_free_dir_info(struct dir_private_info *p) -+{ -+ free_rb_tree_fname(&p->root); -+ kfree(p); -+} -+ -+/* -+ * Given a directory entry, enter it into the fname rb tree. -+ */ -+int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent) -+{ -+ rb_node_t **p, *parent = NULL; -+ struct fname * fname, *new_fn; -+ struct dir_private_info *info; -+ int len; -+ -+ info = (struct dir_private_info *) dir_file->private_data; -+ p = &info->root.rb_node; -+ -+ /* Create and allocate the fname structure */ -+ len = sizeof(struct fname) + dirent->name_len + 1; -+ new_fn = kmalloc(len, GFP_KERNEL); -+ if (!new_fn) -+ return -ENOMEM; -+ memset(new_fn, 0, len); -+ new_fn->hash = hash; -+ new_fn->minor_hash = minor_hash; -+ new_fn->inode = le32_to_cpu(dirent->inode); -+ new_fn->name_len = dirent->name_len; -+ new_fn->file_type = dirent->file_type; -+ memcpy(new_fn->name, dirent->name, dirent->name_len); -+ new_fn->name[dirent->name_len] = 0; -+ -+ while (*p) { -+ parent = *p; -+ fname = rb_entry(parent, struct fname, rb_hash); -+ -+ /* -+ * If the hash and minor hash match up, then we put -+ * them on a linked list. This rarely happens... -+ */ -+ if ((new_fn->hash == fname->hash) && -+ (new_fn->minor_hash == fname->minor_hash)) { -+ new_fn->next = fname->next; -+ fname->next = new_fn; -+ return 0; -+ } -+ -+ if (new_fn->hash < fname->hash) -+ p = &(*p)->rb_left; -+ else if (new_fn->hash > fname->hash) -+ p = &(*p)->rb_right; -+ else if (new_fn->minor_hash < fname->minor_hash) -+ p = &(*p)->rb_left; -+ else /* if (new_fn->minor_hash > fname->minor_hash) */ -+ p = &(*p)->rb_right; -+ } -+ -+ rb_link_node(&new_fn->rb_hash, parent, p); -+ rb_insert_color(&new_fn->rb_hash, &info->root); -+ return 0; -+} -+ -+ -+ -+/* -+ * This is a helper function for ext3_dx_readdir. It calls filldir -+ * for all entres on the fname linked list. (Normally there is only -+ * one entry on the linked list, unless there are 62 bit hash collisions.) -+ */ -+static int call_filldir(struct file * filp, void * dirent, -+ filldir_t filldir, struct fname *fname) -+{ -+ struct dir_private_info *info = filp->private_data; -+ loff_t curr_pos; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct super_block * sb; -+ int error; -+ -+ sb = inode->i_sb; -+ -+ if (!fname) { -+ printk("call_filldir: called with null fname?!?\n"); -+ return 0; -+ } -+ curr_pos = hash2pos(fname->hash, fname->minor_hash); -+ while (fname) { -+ error = filldir(dirent, fname->name, -+ fname->name_len, curr_pos, -+ fname->inode, -+ get_dtype(sb, fname->file_type)); -+ if (error) { -+ filp->f_pos = curr_pos; -+ info->extra_fname = fname->next; -+ return error; -+ } -+ fname = fname->next; -+ } -+ return 0; -+} -+ -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir) -+{ -+ struct dir_private_info *info = filp->private_data; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct fname *fname; -+ int ret; -+ -+ if (!info) { -+ info = create_dir_info(filp->f_pos); -+ if (!info) -+ return -ENOMEM; -+ filp->private_data = info; -+ } -+ -+ /* Some one has messed with f_pos; reset the world */ -+ if (info->last_pos != filp->f_pos) { -+ free_rb_tree_fname(&info->root); -+ info->curr_node = 0; -+ info->extra_fname = 0; -+ info->curr_hash = pos2maj_hash(filp->f_pos); -+ info->curr_minor_hash = pos2min_hash(filp->f_pos); -+ } -+ -+ /* -+ * If there are any leftover names on the hash collision -+ * chain, return them first. -+ */ -+ if (info->extra_fname && -+ call_filldir(filp, dirent, filldir, info->extra_fname)) -+ goto finished; -+ -+ if (!info->curr_node) -+ info->curr_node = rb_get_first(&info->root); -+ -+ while (1) { -+ /* -+ * Fill the rbtree if we have no more entries, -+ * or the inode has changed since we last read in the -+ * cached entries. -+ */ -+ if ((!info->curr_node) || -+ (filp->f_version != inode->i_version)) { -+ info->curr_node = 0; -+ free_rb_tree_fname(&info->root); -+ filp->f_version = inode->i_version; -+ ret = ext3_htree_fill_tree(filp, info->curr_hash, -+ info->curr_minor_hash, -+ &info->next_hash); -+ if (ret < 0) -+ return ret; -+ if (ret == 0) -+ break; -+ info->curr_node = rb_get_first(&info->root); -+ } -+ -+ fname = rb_entry(info->curr_node, struct fname, rb_hash); -+ info->curr_hash = fname->hash; -+ info->curr_minor_hash = fname->minor_hash; -+ if (call_filldir(filp, dirent, filldir, fname)) -+ break; -+ -+ info->curr_node = rb_get_next(info->curr_node); -+ if (!info->curr_node) { -+ info->curr_hash = info->next_hash; -+ info->curr_minor_hash = 0; -+ } -+ } -+finished: -+ info->last_pos = filp->f_pos; -+ UPDATE_ATIME(inode); -+ return 0; -+} -+#endif -Index: linux-2.4.21-suse/fs/ext3/file.c -=================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/file.c 2002-11-29 02:53:15.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/file.c 2003-10-29 23:17:20.000000000 +0300 -@@ -35,6 +35,9 @@ - { - if (filp->f_mode & FMODE_WRITE) - ext3_discard_prealloc (inode); -+ if (is_dx(inode) && filp->private_data) -+ ext3_htree_free_dir_info(filp->private_data); -+ - return 0; - } - -Index: linux-2.4.21-suse/fs/ext3/hash.c -=================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/hash.c 2003-10-29 23:17:20.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/hash.c 2003-10-29 23:17:20.000000000 +0300 -@@ -0,0 +1,215 @@ -+/* -+ * linux/fs/ext3/hash.c -+ * -+ * Copyright (C) 2002 by Theodore Ts'o -+ * -+ * This file is released under the GPL v2. -+ * -+ * This file may be redistributed under the terms of the GNU Public -+ * License. -+ */ -+ -+#include <linux/fs.h> -+#include <linux/jbd.h> -+#include <linux/sched.h> -+#include <linux/ext3_fs.h> -+ -+#define DELTA 0x9E3779B9 -+ -+static void TEA_transform(__u32 buf[4], __u32 const in[]) -+{ -+ __u32 sum = 0; -+ __u32 b0 = buf[0], b1 = buf[1]; -+ __u32 a = in[0], b = in[1], c = in[2], d = in[3]; -+ int n = 16; -+ -+ do { -+ sum += DELTA; -+ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); -+ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); -+ } while(--n); -+ -+ buf[0] += b0; -+ buf[1] += b1; -+} -+ -+/* F, G and H are basic MD4 functions: selection, majority, parity */ -+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -+#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -+#define H(x, y, z) ((x) ^ (y) ^ (z)) -+ -+/* -+ * The generic round function. The application is so specific that -+ * we don't bother protecting all the arguments with parens, as is generally -+ * good macro practice, in favor of extra legibility. -+ * Rotation is separate from addition to prevent recomputation -+ */ -+#define ROUND(f, a, b, c, d, x, s) \ -+ (a += f(b, c, d) + x, a = (a << s) | (a >> (32-s))) -+#define K1 0 -+#define K2 013240474631UL -+#define K3 015666365641UL -+ -+/* -+ * Basic cut-down MD4 transform. Returns only 32 bits of result. -+ */ -+static void halfMD4Transform (__u32 buf[4], __u32 const in[]) -+{ -+ __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; -+ -+ /* Round 1 */ -+ ROUND(F, a, b, c, d, in[0] + K1, 3); -+ ROUND(F, d, a, b, c, in[1] + K1, 7); -+ ROUND(F, c, d, a, b, in[2] + K1, 11); -+ ROUND(F, b, c, d, a, in[3] + K1, 19); -+ ROUND(F, a, b, c, d, in[4] + K1, 3); -+ ROUND(F, d, a, b, c, in[5] + K1, 7); -+ ROUND(F, c, d, a, b, in[6] + K1, 11); -+ ROUND(F, b, c, d, a, in[7] + K1, 19); -+ -+ /* Round 2 */ -+ ROUND(G, a, b, c, d, in[1] + K2, 3); -+ ROUND(G, d, a, b, c, in[3] + K2, 5); -+ ROUND(G, c, d, a, b, in[5] + K2, 9); -+ ROUND(G, b, c, d, a, in[7] + K2, 13); -+ ROUND(G, a, b, c, d, in[0] + K2, 3); -+ ROUND(G, d, a, b, c, in[2] + K2, 5); -+ ROUND(G, c, d, a, b, in[4] + K2, 9); -+ ROUND(G, b, c, d, a, in[6] + K2, 13); -+ -+ /* Round 3 */ -+ ROUND(H, a, b, c, d, in[3] + K3, 3); -+ ROUND(H, d, a, b, c, in[7] + K3, 9); -+ ROUND(H, c, d, a, b, in[2] + K3, 11); -+ ROUND(H, b, c, d, a, in[6] + K3, 15); -+ ROUND(H, a, b, c, d, in[1] + K3, 3); -+ ROUND(H, d, a, b, c, in[5] + K3, 9); -+ ROUND(H, c, d, a, b, in[0] + K3, 11); -+ ROUND(H, b, c, d, a, in[4] + K3, 15); -+ -+ buf[0] += a; -+ buf[1] += b; -+ buf[2] += c; -+ buf[3] += d; -+} -+ -+#undef ROUND -+#undef F -+#undef G -+#undef H -+#undef K1 -+#undef K2 -+#undef K3 -+ -+/* The old legacy hash */ -+static __u32 dx_hack_hash (const char *name, int len) -+{ -+ __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9; -+ while (len--) { -+ __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373)); -+ -+ if (hash & 0x80000000) hash -= 0x7fffffff; -+ hash1 = hash0; -+ hash0 = hash; -+ } -+ return (hash0 << 1); -+} -+ -+static void str2hashbuf(const char *msg, int len, __u32 *buf, int num) -+{ -+ __u32 pad, val; -+ int i; -+ -+ pad = (__u32)len | ((__u32)len << 8); -+ pad |= pad << 16; -+ -+ val = pad; -+ if (len > num*4) -+ len = num * 4; -+ for (i=0; i < len; i++) { -+ if ((i % 4) == 0) -+ val = pad; -+ val = msg[i] + (val << 8); -+ if ((i % 4) == 3) { -+ *buf++ = val; -+ val = pad; -+ num--; -+ } -+ } -+ if (--num >= 0) -+ *buf++ = val; -+ while (--num >= 0) -+ *buf++ = pad; -+} -+ -+/* -+ * Returns the hash of a filename. If len is 0 and name is NULL, then -+ * this function can be used to test whether or not a hash version is -+ * supported. -+ * -+ * The seed is an 4 longword (32 bits) "secret" which can be used to -+ * uniquify a hash. If the seed is all zero's, then some default seed -+ * may be used. -+ * -+ * A particular hash version specifies whether or not the seed is -+ * represented, and whether or not the returned hash is 32 bits or 64 -+ * bits. 32 bit hashes will return 0 for the minor hash. -+ */ -+int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) -+{ -+ __u32 hash; -+ __u32 minor_hash = 0; -+ const char *p; -+ int i; -+ __u32 in[8], buf[4]; -+ -+ /* Initialize the default seed for the hash checksum functions */ -+ buf[0] = 0x67452301; -+ buf[1] = 0xefcdab89; -+ buf[2] = 0x98badcfe; -+ buf[3] = 0x10325476; -+ -+ /* Check to see if the seed is all zero's */ -+ if (hinfo->seed) { -+ for (i=0; i < 4; i++) { -+ if (hinfo->seed[i]) -+ break; -+ } -+ if (i < 4) -+ memcpy(buf, hinfo->seed, sizeof(buf)); -+ } -+ -+ switch (hinfo->hash_version) { -+ case DX_HASH_LEGACY: -+ hash = dx_hack_hash(name, len); -+ break; -+ case DX_HASH_HALF_MD4: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 8); -+ halfMD4Transform(buf, in); -+ len -= 32; -+ p += 32; -+ } -+ minor_hash = buf[2]; -+ hash = buf[1]; -+ break; -+ case DX_HASH_TEA: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 4); -+ TEA_transform(buf, in); -+ len -= 16; -+ p += 16; -+ } -+ hash = buf[0]; -+ minor_hash = buf[1]; -+ break; -+ default: -+ hinfo->hash = 0; -+ return -1; -+ } -+ hinfo->hash = hash & ~1; -+ hinfo->minor_hash = minor_hash; -+ return 0; -+} -Index: linux-2.4.21-suse/fs/ext3/Makefile -=================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/Makefile 2003-10-29 22:39:14.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/Makefile 2003-10-29 23:17:20.000000000 +0300 -@@ -12,7 +12,7 @@ - export-objs := super.o inode.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o -+ ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - - include $(TOPDIR)/Rules.make -Index: linux-2.4.21-suse/fs/ext3/namei.c -=================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/namei.c 2003-06-13 18:51:37.000000000 +0400 -+++ linux-2.4.21-suse/fs/ext3/namei.c 2003-10-29 23:25:23.000000000 +0300 -@@ -16,6 +16,12 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 -+ * Hash Tree Directory indexing (c) -+ * Daniel Phillips, 2001 -+ * Hash Tree Directory indexing porting -+ * Christopher Li, 2002 -+ * Hash Tree Directory indexing cleanup -+ * Theodore Ts'o, 2002 - */ - - #include <linux/fs.h> -@@ -38,6 +44,642 @@ - #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) - #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) - -+static struct buffer_head *ext3_append(handle_t *handle, -+ struct inode *inode, -+ u32 *block, int *err) -+{ -+ struct buffer_head *bh; -+ -+ *block = inode->i_size >> inode->i_sb->s_blocksize_bits; -+ -+ if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -+ inode->i_size += inode->i_sb->s_blocksize; -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_journal_get_write_access(handle,bh); -+ } -+ return bh; -+} -+ -+#ifndef assert -+#define assert(test) J_ASSERT(test) -+#endif -+ -+#ifndef swap -+#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0) -+#endif -+ -+typedef struct { u32 v; } le_u32; -+typedef struct { u16 v; } le_u16; -+ -+#ifdef DX_DEBUG -+#define dxtrace(command) command -+#else -+#define dxtrace(command) -+#endif -+ -+struct fake_dirent -+{ -+ /*le*/u32 inode; -+ /*le*/u16 rec_len; -+ u8 name_len; -+ u8 file_type; -+}; -+ -+struct dx_countlimit -+{ -+ le_u16 limit; -+ le_u16 count; -+}; -+ -+struct dx_entry -+{ -+ le_u32 hash; -+ le_u32 block; -+}; -+ -+/* -+ * dx_root_info is laid out so that if it should somehow get overlaid by a -+ * dirent the two low bits of the hash version will be zero. Therefore, the -+ * hash version mod 4 should never be 0. Sincerely, the paranoia department. -+ */ -+ -+struct dx_root -+{ -+ struct fake_dirent dot; -+ char dot_name[4]; -+ struct fake_dirent dotdot; -+ char dotdot_name[4]; -+ struct dx_root_info -+ { -+ le_u32 reserved_zero; -+ u8 hash_version; -+ u8 info_length; /* 8 */ -+ u8 indirect_levels; -+ u8 unused_flags; -+ } -+ info; -+ struct dx_entry entries[0]; -+}; -+ -+struct dx_node -+{ -+ struct fake_dirent fake; -+ struct dx_entry entries[0]; -+}; -+ -+ -+struct dx_frame -+{ -+ struct buffer_head *bh; -+ struct dx_entry *entries; -+ struct dx_entry *at; -+}; -+ -+struct dx_map_entry -+{ -+ u32 hash; -+ u32 offs; -+}; -+ -+#ifdef CONFIG_EXT3_INDEX -+static inline unsigned dx_get_block (struct dx_entry *entry); -+static void dx_set_block (struct dx_entry *entry, unsigned value); -+static inline unsigned dx_get_hash (struct dx_entry *entry); -+static void dx_set_hash (struct dx_entry *entry, unsigned value); -+static unsigned dx_get_count (struct dx_entry *entries); -+static unsigned dx_get_limit (struct dx_entry *entries); -+static void dx_set_count (struct dx_entry *entries, unsigned value); -+static void dx_set_limit (struct dx_entry *entries, unsigned value); -+static unsigned dx_root_limit (struct inode *dir, unsigned infosize); -+static unsigned dx_node_limit (struct inode *dir); -+static struct dx_frame *dx_probe(struct dentry *dentry, -+ struct inode *dir, -+ struct dx_hash_info *hinfo, -+ struct dx_frame *frame, -+ int *err); -+static void dx_release (struct dx_frame *frames); -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry map[]); -+static void dx_sort_map(struct dx_map_entry *map, unsigned count); -+static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, -+ struct dx_map_entry *offsets, int count); -+static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); -+static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash); -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err); -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode); -+ -+/* -+ * Future: use high four bits of block for coalesce-on-delete flags -+ * Mask them off for now. -+ */ -+ -+static inline unsigned dx_get_block (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->block.v) & 0x00ffffff; -+} -+ -+static inline void dx_set_block (struct dx_entry *entry, unsigned value) -+{ -+ entry->block.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_hash (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->hash.v); -+} -+ -+static inline void dx_set_hash (struct dx_entry *entry, unsigned value) -+{ -+ entry->hash.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_count (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->count.v); -+} -+ -+static inline unsigned dx_get_limit (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->limit.v); -+} -+ -+static inline void dx_set_count (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->count.v = cpu_to_le16(value); -+} -+ -+static inline void dx_set_limit (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->limit.v = cpu_to_le16(value); -+} -+ -+static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - -+ EXT3_DIR_REC_LEN(2) - infosize; -+ return 0? 20: entry_space / sizeof(struct dx_entry); -+} -+ -+static inline unsigned dx_node_limit (struct inode *dir) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); -+ return 0? 22: entry_space / sizeof(struct dx_entry); -+} -+ -+/* -+ * Debug -+ */ -+#ifdef DX_DEBUG -+struct stats -+{ -+ unsigned names; -+ unsigned space; -+ unsigned bcount; -+}; -+ -+static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, -+ int size, int show_names) -+{ -+ unsigned names = 0, space = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ printk("names: "); -+ while ((char *) de < base + size) -+ { -+ if (de->inode) -+ { -+ if (show_names) -+ { -+ int len = de->name_len; -+ char *name = de->name; -+ while (len--) printk("%c", *name++); -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ printk(":%x.%u ", h.hash, -+ ((char *) de - base)); -+ } -+ space += EXT3_DIR_REC_LEN(de->name_len); -+ names++; -+ } -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ printk("(%i)\n", names); -+ return (struct stats) { names, space, 1 }; -+} -+ -+struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, -+ struct dx_entry *entries, int levels) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count = dx_get_count (entries), names = 0, space = 0, i; -+ unsigned bcount = 0; -+ struct buffer_head *bh; -+ int err; -+ printk("%i indexed blocks...\n", count); -+ for (i = 0; i < count; i++, entries++) -+ { -+ u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; -+ u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; -+ struct stats stats; -+ printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); -+ if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; -+ stats = levels? -+ dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): -+ dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); -+ names += stats.names; -+ space += stats.space; -+ bcount += stats.bcount; -+ brelse (bh); -+ } -+ if (bcount) -+ printk("%snames %u, fullness %u (%u%%)\n", levels?"":" ", -+ names, space/bcount,(space/bcount)*100/blocksize); -+ return (struct stats) { names, space, bcount}; -+} -+#endif /* DX_DEBUG */ -+ -+/* -+ * Probe for a directory leaf block to search. -+ * -+ * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -+ * error in the directory index, and the caller should fall back to -+ * searching the directory normally. The callers of dx_probe **MUST** -+ * check for this error code, and make sure it never gets reflected -+ * back to userspace. -+ */ -+static struct dx_frame * -+dx_probe(struct dentry *dentry, struct inode *dir, -+ struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) -+{ -+ unsigned count, indirect; -+ struct dx_entry *at, *entries, *p, *q, *m; -+ struct dx_root *root; -+ struct buffer_head *bh; -+ struct dx_frame *frame = frame_in; -+ u32 hash; -+ -+ frame->bh = NULL; -+ if (dentry) -+ dir = dentry->d_parent->d_inode; -+ if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) -+ goto fail; -+ root = (struct dx_root *) bh->b_data; -+ if (root->info.hash_version != DX_HASH_TEA && -+ root->info.hash_version != DX_HASH_HALF_MD4 && -+ root->info.hash_version != DX_HASH_LEGACY) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unrecognised inode hash code %d", -+ root->info.hash_version); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ hinfo->hash_version = root->info.hash_version; -+ hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ if (dentry) -+ ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ hash = hinfo->hash; -+ -+ if (root->info.unused_flags & 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash flags: %#06x", -+ root->info.unused_flags); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ if ((indirect = root->info.indirect_levels) > 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash depth: %#06x", -+ root->info.indirect_levels); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ while (1) -+ { -+ count = dx_get_count(entries); -+ assert (count && count <= dx_get_limit(entries)); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ dxtrace(printk(".")); -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ -+ if (0) // linear search cross check -+ { -+ unsigned n = count - 1; -+ at = entries; -+ while (n--) -+ { -+ dxtrace(printk(",")); -+ if (dx_get_hash(++at) > hash) -+ { -+ at--; -+ break; -+ } -+ } -+ assert (at == p - 1); -+ } -+ -+ at = p - 1; -+ dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ frame->bh = bh; -+ frame->entries = entries; -+ frame->at = at; -+ if (!indirect--) return frame; -+ if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ goto fail2; -+ at = entries = ((struct dx_node *) bh->b_data)->entries; -+ assert (dx_get_limit(entries) == dx_node_limit (dir)); -+ frame++; -+ } -+fail2: -+ while (frame >= frame_in) { -+ brelse(frame->bh); -+ frame--; -+ } -+fail: -+ return NULL; -+} -+ -+static void dx_release (struct dx_frame *frames) -+{ -+ if (frames[0].bh == NULL) -+ return; -+ -+ if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ brelse(frames[1].bh); -+ brelse(frames[0].bh); -+} -+ -+/* -+ * This function increments the frame pointer to search the next leaf -+ * block, and reads in the necessary intervening nodes if the search -+ * should be necessary. Whether or not the search is necessary is -+ * controlled by the hash parameter. If the hash value is even, then -+ * the search is only continued if the next block starts with that -+ * hash value. This is used if we are searching for a specific file. -+ * -+ * If the hash value is HASH_NB_ALWAYS, then always go to the next block. -+ * -+ * This function returns 1 if the caller should continue to search, -+ * or 0 if it should not. If there is an error reading one of the -+ * index blocks, it will return -1. -+ * -+ * If start_hash is non-null, it will be filled in with the starting -+ * hash of the next page. -+ */ -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash) -+{ -+ struct dx_frame *p; -+ struct buffer_head *bh; -+ int num_frames = 0; -+ __u32 bhash; -+ -+ *err = ENOENT; -+ p = frame; -+ /* -+ * Find the next leaf page by incrementing the frame pointer. -+ * If we run out of entries in the interior node, loop around and -+ * increment pointer in the parent node. When we break out of -+ * this loop, num_frames indicates the number of interior -+ * nodes need to be read. -+ */ -+ while (1) { -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ break; -+ if (p == frames) -+ return 0; -+ num_frames++; -+ p--; -+ } -+ -+ /* -+ * If the hash is 1, then continue only if the next page has a -+ * continuation hash of any value. This is used for readdir -+ * handling. Otherwise, check to see if the hash matches the -+ * desired contiuation hash. If it doesn't, return since -+ * there's no point to read in the successive index pages. -+ */ -+ bhash = dx_get_hash(p->at); -+ if (start_hash) -+ *start_hash = bhash; -+ if ((hash & 1) == 0) { -+ if ((bhash & ~1) != hash) -+ return 0; -+ } -+ /* -+ * If the hash is HASH_NB_ALWAYS, we always go to the next -+ * block so no check is necessary -+ */ -+ while (num_frames--) { -+ if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -+ 0, err))) -+ return -1; /* Failure */ -+ p++; -+ brelse (p->bh); -+ p->bh = bh; -+ p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ } -+ return 1; -+} -+ -+ -+/* -+ * p is at least 6 bytes before the end of page -+ */ -+static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) -+{ -+ return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); -+} -+ -+/* -+ * This function fills a red-black tree with information from a -+ * directory. We start scanning the directory in hash order, starting -+ * at start_hash and start_minor_hash. -+ * -+ * This function returns the number of entries inserted into the tree, -+ * or a negative error code. -+ */ -+int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash) -+{ -+ struct dx_hash_info hinfo; -+ struct buffer_head *bh; -+ struct ext3_dir_entry_2 *de, *top; -+ static struct dx_frame frames[2], *frame; -+ struct inode *dir; -+ int block, err; -+ int count = 0; -+ int ret; -+ __u32 hashval; -+ -+ dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, -+ start_minor_hash)); -+ dir = dir_file->f_dentry->d_inode; -+ hinfo.hash = start_hash; -+ hinfo.minor_hash = 0; -+ frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ -+ /* Add '.' and '..' from the htree header */ -+ if (!start_hash && !start_minor_hash) { -+ de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; -+ de = ext3_next_entry(de); -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; -+ count += 2; -+ } -+ -+ while (1) { -+ block = dx_get_block(frame->at); -+ dxtrace(printk("Reading block %d\n", block)); -+ if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) -+ goto errout; -+ -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) { -+ ext3fs_dirhash(de->name, de->name_len, &hinfo); -+ if ((hinfo.hash < start_hash) || -+ ((hinfo.hash == start_hash) && -+ (hinfo.minor_hash < start_minor_hash))) -+ continue; -+ if ((err = ext3_htree_store_dirent(dir_file, -+ hinfo.hash, hinfo.minor_hash, de)) != 0) -+ goto errout; -+ count++; -+ } -+ brelse (bh); -+ hashval = ~1; -+ ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, -+ frame, frames, &err, &hashval); -+ if (next_hash) -+ *next_hash = hashval; -+ if (ret == -1) -+ goto errout; -+ /* -+ * Stop if: (a) there are no more entries, or -+ * (b) we have inserted at least one entry and the -+ * next hash value is not a continuation -+ */ -+ if ((ret == 0) || -+ (count && ((hashval & 1) == 0))) -+ break; -+ } -+ dx_release(frames); -+ dxtrace(printk("Fill tree: returned %d entries\n", count)); -+ return count; -+errout: -+ dx_release(frames); -+ return (err); -+} -+ -+ -+/* -+ * Directory block splitting, compacting -+ */ -+ -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) -+{ -+ int count = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ while ((char *) de < base + size) -+ { -+ if (de->name_len && de->inode) { -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ map_tail--; -+ map_tail->hash = h.hash; -+ map_tail->offs = (u32) ((char *) de - base); -+ count++; -+ } -+ /* XXX: do we need to check rec_len == 0 case? -Chris */ -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ return count; -+} -+ -+static void dx_sort_map (struct dx_map_entry *map, unsigned count) -+{ -+ struct dx_map_entry *p, *q, *top = map + count - 1; -+ int more; -+ /* Combsort until bubble sort doesn't suck */ -+ while (count > 2) -+ { -+ count = count*10/13; -+ if (count - 9 < 2) /* 9, 10 -> 11 */ -+ count = 11; -+ for (p = top, q = p - count; q >= map; p--, q--) -+ if (p->hash < q->hash) -+ swap(*p, *q); -+ } -+ /* Garden variety bubble sort */ -+ do { -+ more = 0; -+ q = top; -+ while (q-- > map) -+ { -+ if (q[1].hash >= q[0].hash) -+ continue; -+ swap(*(q+1), *q); -+ more = 1; -+ } -+ } while(more); -+} -+ -+static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+{ -+ struct dx_entry *entries = frame->entries; -+ struct dx_entry *old = frame->at, *new = old + 1; -+ int count = dx_get_count(entries); -+ -+ assert(count < dx_get_limit(entries)); -+ assert(old < entries + count); -+ memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); -+ dx_set_hash(new, hash); -+ dx_set_block(new, block); -+ dx_set_count(entries, count + 1); -+} -+#endif -+ -+ -+static void ext3_update_dx_flag(struct inode *inode) -+{ -+ if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, -+ EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; -+} -+ - /* - * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. - * -@@ -94,6 +736,7 @@ - return 0; - } - -+ - /* - * ext3_find_entry() - * -@@ -105,6 +748,8 @@ - * The returned buffer_head has ->b_count elevated. The caller is expected - * to brelse() it when appropriate. - */ -+ -+ - static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) - { -@@ -119,12 +764,32 @@ - int num = 0; - int nblocks, i, err; - struct inode *dir = dentry->d_parent->d_inode; -+ int namelen; -+ const u8 *name; -+ unsigned blocksize; - - *res_dir = NULL; - sb = dir->i_sb; -- -+ blocksize = sb->s_blocksize; -+ namelen = dentry->d_name.len; -+ name = dentry->d_name.name; -+ if (namelen > EXT3_NAME_LEN) -+ return NULL; -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ /* -+ * On success, or if the error was file not found, -+ * return. Otherwise, fall back to doing a search the -+ * old fashioned way. -+ */ -+ if (bh || (err != ERR_BAD_DX_DIR)) -+ return bh; -+ dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ } -+#endif - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); -- start = dir->u.ext3_i.i_dir_start_lookup; -+ start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) - start = 0; - block = start; -@@ -165,7 +830,7 @@ - i = search_dirblock(bh, dir, dentry, - block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); - if (i == 1) { -- dir->u.ext3_i.i_dir_start_lookup = block; -+ EXT3_I(dir)->i_dir_start_lookup = block; - ret = bh; - goto cleanup_and_exit; - } else { -@@ -196,6 +861,66 @@ - return ret; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err) -+{ -+ struct super_block * sb; -+ struct dx_hash_info hinfo; -+ u32 hash; -+ struct dx_frame frames[2], *frame; -+ struct ext3_dir_entry_2 *de, *top; -+ struct buffer_head *bh; -+ unsigned long block; -+ int retval; -+ int namelen = dentry->d_name.len; -+ const u8 *name = dentry->d_name.name; -+ struct inode *dir = dentry->d_parent->d_inode; -+ -+ sb = dir->i_sb; -+ if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+ return NULL; -+ hash = hinfo.hash; -+ do { -+ block = dx_get_block(frame->at); -+ if (!(bh = ext3_bread (NULL,dir, block, 0, err))) -+ goto errout; -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) -+ if (ext3_match (namelen, name, de)) { -+ if (!ext3_check_dir_entry("ext3_find_entry", -+ dir, de, bh, -+ (block<<EXT3_BLOCK_SIZE_BITS(sb)) -+ +((char *)de - bh->b_data))) { -+ brelse (bh); -+ goto errout; -+ } -+ *res_dir = de; -+ dx_release (frames); -+ return bh; -+ } -+ brelse (bh); -+ /* Check to see if we should continue to search */ -+ retval = ext3_htree_next_block(dir, hash, frame, -+ frames, err, 0); -+ if (retval == -1) { -+ ext3_warning(sb, __FUNCTION__, -+ "error reading index page in directory #%lu", -+ dir->i_ino); -+ goto errout; -+ } -+ } while (retval == 1); -+ -+ *err = -ENOENT; -+errout: -+ dxtrace(printk("%s not found\n", name)); -+ dx_release (frames); -+ return NULL; -+} -+#endif -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -212,8 +937,9 @@ - brelse (bh); - inode = iget(dir->i_sb, ino); - -- if (!inode) -+ if (!inode) { - return ERR_PTR(-EACCES); -+ } - } - d_add(dentry, inode); - return NULL; -@@ -237,6 +963,301 @@ - de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct ext3_dir_entry_2 * -+dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) -+{ -+ unsigned rec_len = 0; -+ -+ while (count--) { -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); -+ de->inode = 0; -+ map++; -+ to += rec_len; -+ } -+ return (struct ext3_dir_entry_2 *) (to - rec_len); -+} -+ -+static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) -+{ -+ struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ unsigned rec_len = 0; -+ -+ prev = to = de; -+ while ((char*)de < base + size) { -+ next = (struct ext3_dir_entry_2 *) ((char *) de + -+ le16_to_cpu(de->rec_len)); -+ if (de->inode && de->name_len) { -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ if (de > to) -+ memmove(to, de, rec_len); -+ to->rec_len = cpu_to_le16(rec_len); -+ prev = to; -+ to = (struct ext3_dir_entry_2 *)((char *)to + rec_len); -+ } -+ de = next; -+ } -+ return prev; -+} -+ -+static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, -+ struct buffer_head **bh,struct dx_frame *frame, -+ struct dx_hash_info *hinfo, int *error) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count, continued; -+ struct buffer_head *bh2; -+ u32 newblock; -+ u32 hash2; -+ struct dx_map_entry *map; -+ char *data1 = (*bh)->b_data, *data2; -+ unsigned split; -+ struct ext3_dir_entry_2 *de = NULL, *de2; -+ int err; -+ -+ bh2 = ext3_append (handle, dir, &newblock, error); -+ if (!(bh2)) { -+ brelse(*bh); -+ *bh = NULL; -+ goto errout; -+ } -+ -+ BUFFER_TRACE(*bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, *bh); -+ if (err) { -+ journal_error: -+ brelse(*bh); -+ brelse(bh2); -+ *bh = NULL; -+ ext3_std_error(dir->i_sb, err); -+ goto errout; -+ } -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ -+ data2 = bh2->b_data; -+ -+ /* create map in the end of data2 block */ -+ map = (struct dx_map_entry *) (data2 + blocksize); -+ count = dx_make_map ((struct ext3_dir_entry_2 *) data1, -+ blocksize, hinfo, map); -+ map -= count; -+ split = count/2; // need to adjust to actual middle -+ dx_sort_map (map, count); -+ hash2 = map[split].hash; -+ continued = hash2 == map[split - 1].hash; -+ dxtrace(printk("Split block %i at %x, %i/%i\n", -+ dx_get_block(frame->at), hash2, split, count-split)); -+ -+ /* Fancy dance to stay within two buffers */ -+ de2 = dx_move_dirents(data1, data2, map + split, count - split); -+ de = dx_pack_dirents(data1,blocksize); -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ -+ /* Which block gets the new entry? */ -+ if (hinfo->hash >= hash2) -+ { -+ swap(*bh, bh2); -+ de = de2; -+ } -+ dx_insert_block (frame, hash2 + continued, newblock); -+ err = ext3_journal_dirty_metadata (handle, bh2); -+ if (err) -+ goto journal_error; -+ err = ext3_journal_dirty_metadata (handle, frame->bh); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ dxtrace(dx_show_index ("frame", frame->entries)); -+errout: -+ return de; -+} -+#endif -+ -+ -+/* -+ * Add a new entry into a directory (leaf) block. If de is non-NULL, -+ * it points to a directory entry which is guaranteed to be large -+ * enough for new directory entry. If de is NULL, then -+ * add_dirent_to_buf will attempt search the directory block for -+ * space. It will return -ENOSPC if no space is available, and -EIO -+ * and -EEXIST if directory entry already exists. -+ * -+ * NOTE! bh is NOT released in the case where ENOSPC is returned. In -+ * all other cases bh is released. -+ */ -+static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct ext3_dir_entry_2 *de, -+ struct buffer_head * bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ unsigned long offset = 0; -+ unsigned short reclen; -+ int nlen, rlen, err; -+ char *top; -+ -+ reclen = EXT3_DIR_REC_LEN(namelen); -+ if (!de) { -+ de = (struct ext3_dir_entry_2 *)bh->b_data; -+ top = bh->b_data + dir->i_sb->s_blocksize - reclen; -+ while ((char *) de <= top) { -+ if (!ext3_check_dir_entry("ext3_add_entry", dir, de, -+ bh, offset)) { -+ brelse (bh); -+ return -EIO; -+ } -+ if (ext3_match (namelen, name, de)) { -+ brelse (bh); -+ return -EEXIST; -+ } -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if ((de->inode? rlen - nlen: rlen) >= reclen) -+ break; -+ de = (struct ext3_dir_entry_2 *)((char *)de + rlen); -+ offset += rlen; -+ } -+ if ((char *) de > top) -+ return -ENOSPC; -+ } -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) { -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return err; -+ } -+ -+ /* By now the buffer is marked for journaling */ -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if (de->inode) { -+ struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ de1->rec_len = cpu_to_le16(rlen - nlen); -+ de->rec_len = cpu_to_le16(nlen); -+ de = de1; -+ } -+ de->file_type = EXT3_FT_UNKNOWN; -+ if (inode) { -+ de->inode = cpu_to_le32(inode->i_ino); -+ ext3_set_de_type(dir->i_sb, de, inode->i_mode); -+ } else -+ de->inode = 0; -+ de->name_len = namelen; -+ memcpy (de->name, name, namelen); -+ /* -+ * XXX shouldn't update any times until successful -+ * completion of syscall, but too many callers depend -+ * on this. -+ * -+ * XXX similarly, too many callers depend on -+ * ext3_new_inode() setting the times, but error -+ * recovery deletes the inode, so the worst that can -+ * happen is that the times are slightly out of date -+ * and/or different from the directory change time. -+ */ -+ dir->i_mtime = dir->i_ctime = CURRENT_TIME; -+ ext3_update_dx_flag(dir); -+ dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return 0; -+} -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * This converts a one block unindexed directory to a 3 block indexed -+ * directory, and adds the dentry to the indexed directory. -+ */ -+static int make_indexed_dir(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct buffer_head *bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ struct buffer_head *bh2; -+ struct dx_root *root; -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries; -+ struct ext3_dir_entry_2 *de, *de2; -+ char *data1, *top; -+ unsigned len; -+ int retval; -+ unsigned blocksize; -+ struct dx_hash_info hinfo; -+ u32 block; -+ -+ blocksize = dir->i_sb->s_blocksize; -+ dxtrace(printk("Creating index\n")); -+ retval = ext3_journal_get_write_access(handle, bh); -+ if (retval) { -+ ext3_std_error(dir->i_sb, retval); -+ brelse(bh); -+ return retval; -+ } -+ root = (struct dx_root *) bh->b_data; -+ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ bh2 = ext3_append (handle, dir, &block, &retval); -+ if (!(bh2)) { -+ brelse(bh); -+ return retval; -+ } -+ data1 = bh2->b_data; -+ -+ /* The 0th block becomes the root, move the dirents out */ -+ de = (struct ext3_dir_entry_2 *)&root->dotdot; -+ de = (struct ext3_dir_entry_2 *)((char *)de + le16_to_cpu(de->rec_len)); -+ len = ((char *) root) + blocksize - (char *) de; -+ memcpy (data1, de, len); -+ de = (struct ext3_dir_entry_2 *) data1; -+ top = data1 + len; -+ while (((char *) de2=(char*)de+le16_to_cpu(de->rec_len)) < top) -+ de = de2; -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ /* Initialize the root; the dot dirents already exist */ -+ de = (struct ext3_dir_entry_2 *) (&root->dotdot); -+ de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); -+ memset (&root->info, 0, sizeof(root->info)); -+ root->info.info_length = sizeof(root->info); -+ root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ entries = root->entries; -+ dx_set_block (entries, 1); -+ dx_set_count (entries, 1); -+ dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info))); -+ -+ /* Initialize as for dx_probe */ -+ hinfo.hash_version = root->info.hash_version; -+ hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ ext3fs_dirhash(name, namelen, &hinfo); -+ frame = frames; -+ frame->entries = entries; -+ frame->at = entries; -+ frame->bh = bh; -+ bh = bh2; -+ de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ dx_release (frames); -+ if (!(de)) -+ return retval; -+ -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} -+#endif -+ - /* - * ext3_add_entry() - * -@@ -247,127 +1268,198 @@ - * may not sleep between calling this and putting something into - * the entry, as someone else might have used it while you slept. - */ -- --/* -- * AKPM: the journalling code here looks wrong on the error paths -- */ - static int ext3_add_entry (handle_t *handle, struct dentry *dentry, - struct inode *inode) - { - struct inode *dir = dentry->d_parent->d_inode; -- const char *name = dentry->d_name.name; -- int namelen = dentry->d_name.len; - unsigned long offset; -- unsigned short rec_len; - struct buffer_head * bh; -- struct ext3_dir_entry_2 * de, * de1; -+ struct ext3_dir_entry_2 *de; - struct super_block * sb; - int retval; -+#ifdef CONFIG_EXT3_INDEX -+ int dx_fallback=0; -+#endif -+ unsigned blocksize; -+ unsigned nlen, rlen; -+ u32 block, blocks; - - sb = dir->i_sb; -- -- if (!namelen) -+ blocksize = sb->s_blocksize; -+ if (!dentry->d_name.len) - return -EINVAL; -- bh = ext3_bread (handle, dir, 0, 0, &retval); -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ retval = ext3_dx_add_entry(handle, dentry, inode); -+ if (!retval || (retval != ERR_BAD_DX_DIR)) -+ return retval; -+ EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; -+ dx_fallback++; -+ ext3_mark_inode_dirty(handle, dir); -+ } -+#endif -+ blocks = dir->i_size >> sb->s_blocksize_bits; -+ for (block = 0, offset = 0; block < blocks; block++) { -+ bh = ext3_bread(handle, dir, block, 0, &retval); -+ if(!bh) -+ return retval; -+ retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (retval != -ENOSPC) -+ return retval; -+ -+#ifdef CONFIG_EXT3_INDEX -+ if (blocks == 1 && !dx_fallback && -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ return make_indexed_dir(handle, dentry, inode, bh); -+#endif -+ brelse(bh); -+ } -+ bh = ext3_append(handle, dir, &block, &retval); - if (!bh) - return retval; -- rec_len = EXT3_DIR_REC_LEN(namelen); -- offset = 0; - de = (struct ext3_dir_entry_2 *) bh->b_data; -- while (1) { -- if ((char *)de >= sb->s_blocksize + bh->b_data) { -- brelse (bh); -- bh = NULL; -- bh = ext3_bread (handle, dir, -- offset >> EXT3_BLOCK_SIZE_BITS(sb), 1, &retval); -- if (!bh) -- return retval; -- if (dir->i_size <= offset) { -- if (dir->i_size == 0) { -- brelse(bh); -- return -ENOENT; -- } -+ de->inode = 0; -+ de->rec_len = cpu_to_le16(rlen = blocksize); -+ nlen = 0; -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} - -- ext3_debug ("creating next block\n"); -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * Returns 0 for success, or a negative error value -+ */ -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries, *at; -+ struct dx_hash_info hinfo; -+ struct buffer_head * bh; -+ struct inode *dir = dentry->d_parent->d_inode; -+ struct super_block * sb = dir->i_sb; -+ struct ext3_dir_entry_2 *de; -+ int err; - -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- de->inode = 0; -- de->rec_len = le16_to_cpu(sb->s_blocksize); -- dir->u.ext3_i.i_disksize = -- dir->i_size = offset + sb->s_blocksize; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); -- } else { -+ frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ entries = frame->entries; -+ at = frame->at; - -- ext3_debug ("skipping to next block\n"); -+ if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ goto cleanup; - -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- } -- } -- if (!ext3_check_dir_entry ("ext3_add_entry", dir, de, bh, -- offset)) { -- brelse (bh); -- return -ENOENT; -- } -- if (ext3_match (namelen, name, de)) { -- brelse (bh); -- return -EEXIST; -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto journal_error; -+ -+ err = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (err != -ENOSPC) { -+ bh = 0; -+ goto cleanup; -+ } -+ -+ /* Block full, should compress but for now just split */ -+ dxtrace(printk("using %u of %u node entries\n", -+ dx_get_count(entries), dx_get_limit(entries))); -+ /* Need to split index? */ -+ if (dx_get_count(entries) == dx_get_limit(entries)) { -+ u32 newblock; -+ unsigned icount = dx_get_count(entries); -+ int levels = frame - frames; -+ struct dx_entry *entries2; -+ struct dx_node *node2; -+ struct buffer_head *bh2; -+ -+ if (levels && (dx_get_count(frames->entries) == -+ dx_get_limit(frames->entries))) { -+ ext3_warning(sb, __FUNCTION__, -+ "Directory index full!\n"); -+ err = -ENOSPC; -+ goto cleanup; - } -- if ((le32_to_cpu(de->inode) == 0 && -- le16_to_cpu(de->rec_len) >= rec_len) || -- (le16_to_cpu(de->rec_len) >= -- EXT3_DIR_REC_LEN(de->name_len) + rec_len)) { -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- /* By now the buffer is marked for journaling */ -- offset += le16_to_cpu(de->rec_len); -- if (le32_to_cpu(de->inode)) { -- de1 = (struct ext3_dir_entry_2 *) ((char *) de + -- EXT3_DIR_REC_LEN(de->name_len)); -- de1->rec_len = -- cpu_to_le16(le16_to_cpu(de->rec_len) - -- EXT3_DIR_REC_LEN(de->name_len)); -- de->rec_len = cpu_to_le16( -- EXT3_DIR_REC_LEN(de->name_len)); -- de = de1; -+ bh2 = ext3_append (handle, dir, &newblock, &err); -+ if (!(bh2)) -+ goto cleanup; -+ node2 = (struct dx_node *)(bh2->b_data); -+ entries2 = node2->entries; -+ node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -+ node2->fake.inode = 0; -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ if (levels) { -+ unsigned icount1 = icount/2, icount2 = icount - icount1; -+ unsigned hash2 = dx_get_hash(entries + icount1); -+ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ err = ext3_journal_get_write_access(handle, -+ frames[0].bh); -+ if (err) -+ goto journal_error; -+ -+ memcpy ((char *) entries2, (char *) (entries + icount1), -+ icount2 * sizeof(struct dx_entry)); -+ dx_set_count (entries, icount1); -+ dx_set_count (entries2, icount2); -+ dx_set_limit (entries2, dx_node_limit(dir)); -+ -+ /* Which index block gets the new entry? */ -+ if (at - entries >= icount1) { -+ frame->at = at = at - entries - icount1 + entries2; -+ frame->entries = entries = entries2; -+ swap(frame->bh, bh2); - } -- de->file_type = EXT3_FT_UNKNOWN; -- if (inode) { -- de->inode = cpu_to_le32(inode->i_ino); -- ext3_set_de_type(dir->i_sb, de, inode->i_mode); -- } else -- de->inode = 0; -- de->name_len = namelen; -- memcpy (de->name, name, namelen); -- /* -- * XXX shouldn't update any times until successful -- * completion of syscall, but too many callers depend -- * on this. -- * -- * XXX similarly, too many callers depend on -- * ext3_new_inode() setting the times, but error -- * recovery deletes the inode, so the worst that can -- * happen is that the times are slightly out of date -- * and/or different from the directory change time. -- */ -- dir->i_mtime = dir->i_ctime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- 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); -- return 0; -+ dx_insert_block (frames + 0, hash2, newblock); -+ dxtrace(dx_show_index ("node", frames[1].entries)); -+ dxtrace(dx_show_index ("node", -+ ((struct dx_node *) bh2->b_data)->entries)); -+ err = ext3_journal_dirty_metadata(handle, bh2); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ } else { -+ dxtrace(printk("Creating second level index...\n")); -+ memcpy((char *) entries2, (char *) entries, -+ icount * sizeof(struct dx_entry)); -+ dx_set_limit(entries2, dx_node_limit(dir)); -+ -+ /* Set up root */ -+ dx_set_count(entries, 1); -+ dx_set_block(entries + 0, newblock); -+ ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ -+ /* Add new access path frame */ -+ frame = frames + 1; -+ frame->at = at = at - entries + entries2; -+ frame->entries = entries = entries2; -+ frame->bh = bh2; -+ err = ext3_journal_get_write_access(handle, -+ frame->bh); -+ if (err) -+ goto journal_error; - } -- offset += le16_to_cpu(de->rec_len); -- de = (struct ext3_dir_entry_2 *) -- ((char *) de + le16_to_cpu(de->rec_len)); -+ ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- brelse (bh); -- return -ENOSPC; -+ de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ if (!de) -+ goto cleanup; -+ err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ bh = 0; -+ goto cleanup; -+ -+journal_error: -+ ext3_std_error(dir->i_sb, err); -+cleanup: -+ if (bh) -+ brelse(bh); -+ dx_release(frames); -+ return err; - } -+#endif - - /* - * ext3_delete_entry deletes a directory entry by merging it with the -@@ -454,9 +1546,11 @@ - struct inode * inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -480,9 +1574,11 @@ - struct inode *inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -508,9 +1604,11 @@ - if (dir->i_nlink >= EXT3_LINK_MAX) - return -EMLINK; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -522,7 +1620,7 @@ - - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -- inode->i_size = inode->u.ext3_i.i_disksize = inode->i_sb->s_blocksize; -+ inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; - inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { -@@ -555,21 +1653,19 @@ - inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); -- if (err) -- goto out_no_entry; -+ if (err) { -+ inode->i_nlink = 0; -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - dir->i_nlink++; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - d_instantiate(dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- inode->i_nlink = 0; -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - /* -@@ -656,7 +1752,7 @@ - int err = 0, rc; - - lock_super(sb); -- if (!list_empty(&inode->u.ext3_i.i_orphan)) -+ if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - - /* Orphan handling is only valid for files with data blocks -@@ -697,7 +1793,7 @@ - * This is safe: on error we're going to ignore the orphan list - * anyway on the next recovery. */ - if (!err) -- list_add(&inode->u.ext3_i.i_orphan, &EXT3_SB(sb)->s_orphan); -+ list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", -@@ -794,8 +1890,9 @@ - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); -@@ -833,7 +1930,7 @@ - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; - ext3_mark_inode_dirty(handle, inode); -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - - end_rmdir: -@@ -851,8 +1948,9 @@ - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -879,7 +1977,7 @@ - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - inode->i_nlink--; - if (!inode->i_nlink) -@@ -905,9 +2003,11 @@ - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 5); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -917,7 +2017,7 @@ - if (IS_ERR(inode)) - goto out_stop; - -- if (l > sizeof (inode->u.ext3_i.i_data)) { -+ if (l > sizeof (EXT3_I(inode)->i_data)) { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* -@@ -926,8 +2026,12 @@ - * i_size in generic_commit_write(). - */ - err = block_symlink(inode, symname, l); -- if (err) -- goto out_no_entry; -+ if (err) { -+ ext3_dec_count(handle, inode); -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - } else { - inode->i_op = &ext3_fast_symlink_inode_operations; - memcpy((char*)&inode->u.ext3_i.i_data,symname,l); -@@ -938,12 +2042,6 @@ - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- ext3_dec_count(handle, inode); -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - static int ext3_link (struct dentry * old_dentry, -@@ -956,12 +2054,15 @@ - if (S_ISDIR(inode->i_mode)) - return -EPERM; - -- if (inode->i_nlink >= EXT3_LINK_MAX) -+ if (inode->i_nlink >= EXT3_LINK_MAX) { - return -EMLINK; -+ } - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -994,9 +2095,11 @@ - - old_bh = new_bh = dir_bh = NULL; - -- handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + 2); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; -@@ -1069,14 +2172,37 @@ - /* - * ok, that's it - */ -- ext3_delete_entry(handle, old_dir, old_de, old_bh); -+ if (le32_to_cpu(old_de->inode) != old_inode->i_ino || -+ old_de->name_len != old_dentry->d_name.len || -+ strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || -+ (retval = ext3_delete_entry(handle, old_dir, -+ old_de, old_bh)) == -ENOENT) { -+ /* old_de could have moved from under us during htree split, so -+ * make sure that we are deleting the right entry. We might -+ * also be pointing to a stale entry in the unused part of -+ * old_bh so just checking inum and the name isn't enough. */ -+ struct buffer_head *old_bh2; -+ struct ext3_dir_entry_2 *old_de2; -+ -+ old_bh2 = ext3_find_entry(old_dentry, &old_de2); -+ if (old_bh2) { -+ retval = ext3_delete_entry(handle, old_dir, -+ old_de2, old_bh2); -+ brelse(old_bh2); -+ } -+ } -+ if (retval) { -+ ext3_warning(old_dir->i_sb, "ext3_rename", -+ "Deleting old file (%lu), %d, error=%d", -+ old_dir->i_ino, old_dir->i_nlink, retval); -+ } - - if (new_inode) { - new_inode->i_nlink--; - new_inode->i_ctime = CURRENT_TIME; - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; -- old_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(old_dir); - if (dir_bh) { - BUFFER_TRACE(dir_bh, "get_write_access"); - ext3_journal_get_write_access(handle, dir_bh); -@@ -1088,7 +2210,7 @@ - new_inode->i_nlink--; - } else { - new_dir->i_nlink++; -- new_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(new_dir); - ext3_mark_inode_dirty(handle, new_dir); - } - } -Index: linux-2.4.21-suse/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/super.c 2003-10-29 22:39:14.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/super.c 2003-10-29 23:17:20.000000000 +0300 -@@ -710,6 +710,7 @@ - es->s_mtime = cpu_to_le32(CURRENT_TIME); - ext3_update_dynamic_rev(sb); - EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -+ - ext3_commit_super (sb, es, 1); - if (test_opt (sb, DEBUG)) - printk (KERN_INFO -@@ -720,6 +721,7 @@ - EXT3_BLOCKS_PER_GROUP(sb), - EXT3_INODES_PER_GROUP(sb), - sbi->s_mount_opt); -+ - printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ", - bdevname(sb->s_dev)); - if (EXT3_SB(sb)->s_journal->j_inode == NULL) { -@@ -893,6 +895,7 @@ - return res; - } - -+ - struct super_block * ext3_read_super (struct super_block * sb, void * data, - int silent) - { -@@ -1069,6 +1072,9 @@ - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+ for (i=0; i < 4; i++) -+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); -+ sbi->s_def_hash_version = es->s_def_hash_version; - - if (sbi->s_blocks_per_group > blocksize * 8) { - printk (KERN_ERR -@@ -1770,6 +1776,7 @@ - unregister_filesystem(&ext3_fs_type); - } - -+EXPORT_SYMBOL(ext3_force_commit); - EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); -Index: linux-2.4.21-suse/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-suse.orig/include/linux/ext3_fs.h 2003-06-14 02:28:25.000000000 +0400 -+++ linux-2.4.21-suse/include/linux/ext3_fs.h 2003-10-29 23:17:20.000000000 +0300 -@@ -40,6 +40,11 @@ - #define EXT3FS_VERSION "2.4-0.9.19" - - /* -+ * Always enable hashed directories -+ */ -+#define CONFIG_EXT3_INDEX -+ -+/* - * Debug code - */ - #ifdef EXT3FS_DEBUG -@@ -438,8 +443,11 @@ - /*E0*/ __u32 s_journal_inum; /* inode number of journal file */ - __u32 s_journal_dev; /* device number of journal file */ - __u32 s_last_orphan; /* start of list of inodes to delete */ -- --/*EC*/ __u32 s_reserved[197]; /* Padding to the end of the block */ -+ __u32 s_hash_seed[4]; /* HTREE hash seed */ -+ __u8 s_def_hash_version; /* Default hash version to use */ -+ __u8 s_reserved_char_pad; -+ __u16 s_reserved_word_pad; -+ __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -576,9 +584,46 @@ - #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) - #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ - ~EXT3_DIR_ROUND) -+/* -+ * Hash Tree Directory indexing -+ * (c) Daniel Phillips, 2001 -+ */ -+ -+#ifdef CONFIG_EXT3_INDEX -+ #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ -+ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ -+ (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) -+#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) -+#else -+ #define is_dx(dir) 0 -+#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) -+#endif -+ -+/* Legal values for the dx_root hash_version field: */ -+ -+#define DX_HASH_LEGACY 0 -+#define DX_HASH_HALF_MD4 1 -+#define DX_HASH_TEA 2 -+ -+/* hash info structure used by the directory hash */ -+struct dx_hash_info -+{ -+ u32 hash; -+ u32 minor_hash; -+ int hash_version; -+ u32 *seed; -+}; - - #ifdef __KERNEL__ - /* -+ * Control parameters used by ext3_htree_next_block -+ */ -+#define HASH_NB_ALWAYS 1 -+ -+ -+/* - * Describe an inode's exact location on disk and in memory - */ - struct ext3_iloc -@@ -588,6 +633,27 @@ - unsigned long block_group; - }; - -+ -+/* -+ * This structure is stuffed into the struct file's private_data field -+ * for directories. It is where we put information so that we can do -+ * readdir operations in hash tree order. -+ */ -+struct dir_private_info { -+ rb_root_t root; -+ rb_node_t *curr_node; -+ struct fname *extra_fname; -+ loff_t last_pos; -+ __u32 curr_hash; -+ __u32 curr_minor_hash; -+ __u32 next_hash; -+}; -+ -+/* -+ * Special error return code only used by dx_probe() and its callers. -+ */ -+#define ERR_BAD_DX_DIR -75000 -+ - /* - * Function prototypes - */ -@@ -615,11 +681,20 @@ - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, -- struct ext3_dir_entry_2 *, struct buffer_head *, -- unsigned long); -+ struct ext3_dir_entry_2 *, -+ struct buffer_head *, unsigned long); -+extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent); -+extern void ext3_htree_free_dir_info(struct dir_private_info *p); -+ - /* fsync.c */ - extern int ext3_sync_file (struct file *, struct dentry *, int); - -+/* hash.c */ -+extern int ext3fs_dirhash(const char *name, int len, struct -+ dx_hash_info *hinfo); -+ - /* ialloc.c */ - extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int); - extern void ext3_free_inode (handle_t *, struct inode *); -@@ -652,6 +727,8 @@ - /* namei.c */ - extern int ext3_orphan_add(handle_t *, struct inode *); - extern int ext3_orphan_del(handle_t *, struct inode *); -+extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash); - - /* super.c */ - extern void ext3_error (struct super_block *, const char *, const char *, ...) -Index: linux-2.4.21-suse/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.21-suse.orig/include/linux/ext3_fs_sb.h 2003-06-14 02:26:52.000000000 +0400 -+++ linux-2.4.21-suse/include/linux/ext3_fs_sb.h 2003-10-29 23:17:20.000000000 +0300 -@@ -62,6 +62,8 @@ - int s_inode_size; - int s_first_ino; - u32 s_next_generation; -+ u32 s_hash_seed[4]; -+ int s_def_hash_version; - - /* Journaling */ - struct inode * s_journal_inode; -Index: linux-2.4.21-suse/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.21-suse.orig/include/linux/ext3_jbd.h 2003-06-14 02:28:25.000000000 +0400 -+++ linux-2.4.21-suse/include/linux/ext3_jbd.h 2003-10-29 23:17:20.000000000 +0300 -@@ -63,6 +63,8 @@ - - #define EXT3_RESERVE_TRANS_BLOCKS 12U - -+#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, -Index: linux-2.4.21-suse/include/linux/rbtree.h -=================================================================== ---- linux-2.4.21-suse.orig/include/linux/rbtree.h 2003-06-14 02:26:51.000000000 +0400 -+++ linux-2.4.21-suse/include/linux/rbtree.h 2003-10-29 23:17:20.000000000 +0300 -@@ -120,6 +120,8 @@ - - extern void rb_insert_color(rb_node_t *, rb_root_t *); - extern void rb_erase(rb_node_t *, rb_root_t *); -+extern rb_node_t *rb_get_first(rb_root_t *root); -+extern rb_node_t *rb_get_next(rb_node_t *n); - - static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link) - { -Index: linux-2.4.21-suse/lib/rbtree.c -=================================================================== ---- linux-2.4.21-suse.orig/lib/rbtree.c 2002-08-03 04:39:46.000000000 +0400 -+++ linux-2.4.21-suse/lib/rbtree.c 2003-10-29 23:17:20.000000000 +0300 -@@ -17,6 +17,8 @@ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - linux/lib/rbtree.c -+ -+ rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002 - */ - - #include <linux/rbtree.h> -@@ -294,3 +296,43 @@ - __rb_erase_color(child, parent, root); - } - EXPORT_SYMBOL(rb_erase); -+ -+/* -+ * This function returns the first node (in sort order) of the tree. -+ */ -+rb_node_t *rb_get_first(rb_root_t *root) -+{ -+ rb_node_t *n; -+ -+ n = root->rb_node; -+ if (!n) -+ return 0; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+} -+EXPORT_SYMBOL(rb_get_first); -+ -+/* -+ * Given a node, this function will return the next node in the tree. -+ */ -+rb_node_t *rb_get_next(rb_node_t *n) -+{ -+ rb_node_t *parent; -+ -+ if (n->rb_right) { -+ n = n->rb_right; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+ } else { -+ while ((parent = n->rb_parent)) { -+ if (n == parent->rb_left) -+ return parent; -+ n = parent; -+ } -+ return 0; -+ } -+} -+EXPORT_SYMBOL(rb_get_next); -+ diff --git a/lustre/kernel_patches/patches/ext3-htree.patch b/lustre/kernel_patches/patches/ext3-htree.patch deleted file mode 100644 index 31f2ae3463..0000000000 --- a/lustre/kernel_patches/patches/ext3-htree.patch +++ /dev/null @@ -1,2574 +0,0 @@ - fs/ext3/Makefile | 2 - fs/ext3/dir.c | 302 +++++++++ - fs/ext3/file.c | 3 - fs/ext3/hash.c | 215 ++++++ - fs/ext3/namei.c | 1420 ++++++++++++++++++++++++++++++++++++++++----- - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 85 ++ - include/linux/ext3_fs_sb.h | 2 - include/linux/ext3_jbd.h | 2 - include/linux/rbtree.h | 2 - lib/rbtree.c | 42 + - 11 files changed, 1921 insertions(+), 161 deletions(-) - ---- linux-2.4.18-chaos-pdirops/fs/ext3/dir.c~ext3-htree 2001-11-10 01:25:04.000000000 +0300 -+++ linux-2.4.18-chaos-pdirops-alexey/fs/ext3/dir.c 2003-09-23 12:12:04.000000000 +0400 -@@ -21,12 +21,16 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/slab.h> -+#include <linux/rbtree.h> - - static unsigned char ext3_filetype_table[] = { - DT_UNKNOWN, DT_REG, DT_DIR, DT_CHR, DT_BLK, DT_FIFO, DT_SOCK, DT_LNK - }; - - static int ext3_readdir(struct file *, void *, filldir_t); -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir); - - struct file_operations ext3_dir_operations = { - read: generic_read_dir, -@@ -35,6 +39,17 @@ struct file_operations ext3_dir_operatio - fsync: ext3_sync_file, /* BKL held */ - }; - -+ -+static unsigned char get_dtype(struct super_block *sb, int filetype) -+{ -+ if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || -+ (filetype >= EXT3_FT_MAX)) -+ return DT_UNKNOWN; -+ -+ return (ext3_filetype_table[filetype]); -+} -+ -+ - int ext3_check_dir_entry (const char * function, struct inode * dir, - struct ext3_dir_entry_2 * de, - struct buffer_head * bh, -@@ -79,6 +94,16 @@ static int ext3_readdir(struct file * fi - - sb = inode->i_sb; - -+ if (is_dx(inode)) { -+ err = ext3_dx_readdir(filp, dirent, filldir); -+ if (err != ERR_BAD_DX_DIR) -+ return err; -+ /* -+ * We don't set the inode dirty flag since it's not -+ * critical that it get flushed back to the disk. -+ */ -+ EXT3_I(filp->f_dentry->d_inode)->i_flags &= ~EXT3_INDEX_FL; -+ } - stored = 0; - bh = NULL; - offset = filp->f_pos & (sb->s_blocksize - 1); -@@ -162,18 +187,12 @@ revalidate: - * during the copy operation. - */ - unsigned long version = filp->f_version; -- unsigned char d_type = DT_UNKNOWN; - -- if (EXT3_HAS_INCOMPAT_FEATURE(sb, -- EXT3_FEATURE_INCOMPAT_FILETYPE) -- && de->file_type < EXT3_FT_MAX) -- d_type = -- ext3_filetype_table[de->file_type]; - error = filldir(dirent, de->name, - de->name_len, - filp->f_pos, - le32_to_cpu(de->inode), -- d_type); -+ get_dtype(sb, de->file_type)); - if (error) - break; - if (version != filp->f_version) -@@ -188,3 +207,272 @@ revalidate: - UPDATE_ATIME(inode); - return 0; - } -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * These functions convert from the major/minor hash to an f_pos -+ * value. -+ * -+ * Currently we only use major hash numer. This is unfortunate, but -+ * on 32-bit machines, the same VFS interface is used for lseek and -+ * llseek, so if we use the 64 bit offset, then the 32-bit versions of -+ * lseek/telldir/seekdir will blow out spectacularly, and from within -+ * the ext2 low-level routine, we don't know if we're being called by -+ * a 64-bit version of the system call or the 32-bit version of the -+ * system call. Worse yet, NFSv2 only allows for a 32-bit readdir -+ * cookie. Sigh. -+ */ -+#define hash2pos(major, minor) (major >> 1) -+#define pos2maj_hash(pos) ((pos << 1) & 0xffffffff) -+#define pos2min_hash(pos) (0) -+ -+/* -+ * This structure holds the nodes of the red-black tree used to store -+ * the directory entry in hash order. -+ */ -+struct fname { -+ __u32 hash; -+ __u32 minor_hash; -+ rb_node_t rb_hash; -+ struct fname *next; -+ __u32 inode; -+ __u8 name_len; -+ __u8 file_type; -+ char name[0]; -+}; -+ -+/* -+ * This functoin implements a non-recursive way of freeing all of the -+ * nodes in the red-black tree. -+ */ -+static void free_rb_tree_fname(rb_root_t *root) -+{ -+ rb_node_t *n = root->rb_node; -+ rb_node_t *parent; -+ struct fname *fname; -+ -+ while (n) { -+ /* Do the node's children first */ -+ if ((n)->rb_left) { -+ n = n->rb_left; -+ continue; -+ } -+ if (n->rb_right) { -+ n = n->rb_right; -+ continue; -+ } -+ /* -+ * The node has no children; free it, and then zero -+ * out parent's link to it. Finally go to the -+ * beginning of the loop and try to free the parent -+ * node. -+ */ -+ parent = n->rb_parent; -+ fname = rb_entry(n, struct fname, rb_hash); -+ kfree(fname); -+ if (!parent) -+ root->rb_node = 0; -+ else if (parent->rb_left == n) -+ parent->rb_left = 0; -+ else if (parent->rb_right == n) -+ parent->rb_right = 0; -+ n = parent; -+ } -+ root->rb_node = 0; -+} -+ -+ -+struct dir_private_info *create_dir_info(loff_t pos) -+{ -+ struct dir_private_info *p; -+ -+ p = kmalloc(sizeof(struct dir_private_info), GFP_KERNEL); -+ if (!p) -+ return NULL; -+ p->root.rb_node = 0; -+ p->curr_node = 0; -+ p->extra_fname = 0; -+ p->last_pos = 0; -+ p->curr_hash = pos2maj_hash(pos); -+ p->curr_minor_hash = pos2min_hash(pos); -+ p->next_hash = 0; -+ return p; -+} -+ -+void ext3_htree_free_dir_info(struct dir_private_info *p) -+{ -+ free_rb_tree_fname(&p->root); -+ kfree(p); -+} -+ -+/* -+ * Given a directory entry, enter it into the fname rb tree. -+ */ -+int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent) -+{ -+ rb_node_t **p, *parent = NULL; -+ struct fname * fname, *new_fn; -+ struct dir_private_info *info; -+ int len; -+ -+ info = (struct dir_private_info *) dir_file->private_data; -+ p = &info->root.rb_node; -+ -+ /* Create and allocate the fname structure */ -+ len = sizeof(struct fname) + dirent->name_len + 1; -+ new_fn = kmalloc(len, GFP_KERNEL); -+ if (!new_fn) -+ return -ENOMEM; -+ memset(new_fn, 0, len); -+ new_fn->hash = hash; -+ new_fn->minor_hash = minor_hash; -+ new_fn->inode = le32_to_cpu(dirent->inode); -+ new_fn->name_len = dirent->name_len; -+ new_fn->file_type = dirent->file_type; -+ memcpy(new_fn->name, dirent->name, dirent->name_len); -+ new_fn->name[dirent->name_len] = 0; -+ -+ while (*p) { -+ parent = *p; -+ fname = rb_entry(parent, struct fname, rb_hash); -+ -+ /* -+ * If the hash and minor hash match up, then we put -+ * them on a linked list. This rarely happens... -+ */ -+ if ((new_fn->hash == fname->hash) && -+ (new_fn->minor_hash == fname->minor_hash)) { -+ new_fn->next = fname->next; -+ fname->next = new_fn; -+ return 0; -+ } -+ -+ if (new_fn->hash < fname->hash) -+ p = &(*p)->rb_left; -+ else if (new_fn->hash > fname->hash) -+ p = &(*p)->rb_right; -+ else if (new_fn->minor_hash < fname->minor_hash) -+ p = &(*p)->rb_left; -+ else /* if (new_fn->minor_hash > fname->minor_hash) */ -+ p = &(*p)->rb_right; -+ } -+ -+ rb_link_node(&new_fn->rb_hash, parent, p); -+ rb_insert_color(&new_fn->rb_hash, &info->root); -+ return 0; -+} -+ -+ -+ -+/* -+ * This is a helper function for ext3_dx_readdir. It calls filldir -+ * for all entres on the fname linked list. (Normally there is only -+ * one entry on the linked list, unless there are 62 bit hash collisions.) -+ */ -+static int call_filldir(struct file * filp, void * dirent, -+ filldir_t filldir, struct fname *fname) -+{ -+ struct dir_private_info *info = filp->private_data; -+ loff_t curr_pos; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct super_block * sb; -+ int error; -+ -+ sb = inode->i_sb; -+ -+ if (!fname) { -+ printk("call_filldir: called with null fname?!?\n"); -+ return 0; -+ } -+ curr_pos = hash2pos(fname->hash, fname->minor_hash); -+ while (fname) { -+ error = filldir(dirent, fname->name, -+ fname->name_len, curr_pos, -+ fname->inode, -+ get_dtype(sb, fname->file_type)); -+ if (error) { -+ filp->f_pos = curr_pos; -+ info->extra_fname = fname->next; -+ return error; -+ } -+ fname = fname->next; -+ } -+ return 0; -+} -+ -+static int ext3_dx_readdir(struct file * filp, -+ void * dirent, filldir_t filldir) -+{ -+ struct dir_private_info *info = filp->private_data; -+ struct inode *inode = filp->f_dentry->d_inode; -+ struct fname *fname; -+ int ret; -+ -+ if (!info) { -+ info = create_dir_info(filp->f_pos); -+ if (!info) -+ return -ENOMEM; -+ filp->private_data = info; -+ } -+ -+ /* Some one has messed with f_pos; reset the world */ -+ if (info->last_pos != filp->f_pos) { -+ free_rb_tree_fname(&info->root); -+ info->curr_node = 0; -+ info->extra_fname = 0; -+ info->curr_hash = pos2maj_hash(filp->f_pos); -+ info->curr_minor_hash = pos2min_hash(filp->f_pos); -+ } -+ -+ /* -+ * If there are any leftover names on the hash collision -+ * chain, return them first. -+ */ -+ if (info->extra_fname && -+ call_filldir(filp, dirent, filldir, info->extra_fname)) -+ goto finished; -+ -+ if (!info->curr_node) -+ info->curr_node = rb_get_first(&info->root); -+ -+ while (1) { -+ /* -+ * Fill the rbtree if we have no more entries, -+ * or the inode has changed since we last read in the -+ * cached entries. -+ */ -+ if ((!info->curr_node) || -+ (filp->f_version != inode->i_version)) { -+ info->curr_node = 0; -+ free_rb_tree_fname(&info->root); -+ filp->f_version = inode->i_version; -+ ret = ext3_htree_fill_tree(filp, info->curr_hash, -+ info->curr_minor_hash, -+ &info->next_hash); -+ if (ret < 0) -+ return ret; -+ if (ret == 0) -+ break; -+ info->curr_node = rb_get_first(&info->root); -+ } -+ -+ fname = rb_entry(info->curr_node, struct fname, rb_hash); -+ info->curr_hash = fname->hash; -+ info->curr_minor_hash = fname->minor_hash; -+ if (call_filldir(filp, dirent, filldir, fname)) -+ break; -+ -+ info->curr_node = rb_get_next(info->curr_node); -+ if (!info->curr_node) { -+ info->curr_hash = info->next_hash; -+ info->curr_minor_hash = 0; -+ } -+ } -+finished: -+ info->last_pos = filp->f_pos; -+ UPDATE_ATIME(inode); -+ return 0; -+} -+#endif ---- linux-2.4.18-chaos-pdirops/fs/ext3/file.c~ext3-htree 2003-07-28 17:52:04.000000000 +0400 -+++ linux-2.4.18-chaos-pdirops-alexey/fs/ext3/file.c 2003-09-23 12:11:54.000000000 +0400 -@@ -35,6 +35,9 @@ static int ext3_release_file (struct ino - { - if (filp->f_mode & FMODE_WRITE) - ext3_discard_prealloc (inode); -+ if (is_dx(inode) && filp->private_data) -+ ext3_htree_free_dir_info(filp->private_data); -+ - return 0; - } - ---- /dev/null 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.18-chaos-pdirops-alexey/fs/ext3/hash.c 2003-09-23 12:11:54.000000000 +0400 -@@ -0,0 +1,215 @@ -+/* -+ * linux/fs/ext3/hash.c -+ * -+ * Copyright (C) 2002 by Theodore Ts'o -+ * -+ * This file is released under the GPL v2. -+ * -+ * This file may be redistributed under the terms of the GNU Public -+ * License. -+ */ -+ -+#include <linux/fs.h> -+#include <linux/jbd.h> -+#include <linux/sched.h> -+#include <linux/ext3_fs.h> -+ -+#define DELTA 0x9E3779B9 -+ -+static void TEA_transform(__u32 buf[4], __u32 const in[]) -+{ -+ __u32 sum = 0; -+ __u32 b0 = buf[0], b1 = buf[1]; -+ __u32 a = in[0], b = in[1], c = in[2], d = in[3]; -+ int n = 16; -+ -+ do { -+ sum += DELTA; -+ b0 += ((b1 << 4)+a) ^ (b1+sum) ^ ((b1 >> 5)+b); -+ b1 += ((b0 << 4)+c) ^ (b0+sum) ^ ((b0 >> 5)+d); -+ } while(--n); -+ -+ buf[0] += b0; -+ buf[1] += b1; -+} -+ -+/* F, G and H are basic MD4 functions: selection, majority, parity */ -+#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) -+#define G(x, y, z) (((x) & (y)) + (((x) ^ (y)) & (z))) -+#define H(x, y, z) ((x) ^ (y) ^ (z)) -+ -+/* -+ * The generic round function. The application is so specific that -+ * we don't bother protecting all the arguments with parens, as is generally -+ * good macro practice, in favor of extra legibility. -+ * Rotation is separate from addition to prevent recomputation -+ */ -+#define ROUND(f, a, b, c, d, x, s) \ -+ (a += f(b, c, d) + x, a = (a << s) | (a >> (32-s))) -+#define K1 0 -+#define K2 013240474631UL -+#define K3 015666365641UL -+ -+/* -+ * Basic cut-down MD4 transform. Returns only 32 bits of result. -+ */ -+static void halfMD4Transform (__u32 buf[4], __u32 const in[]) -+{ -+ __u32 a = buf[0], b = buf[1], c = buf[2], d = buf[3]; -+ -+ /* Round 1 */ -+ ROUND(F, a, b, c, d, in[0] + K1, 3); -+ ROUND(F, d, a, b, c, in[1] + K1, 7); -+ ROUND(F, c, d, a, b, in[2] + K1, 11); -+ ROUND(F, b, c, d, a, in[3] + K1, 19); -+ ROUND(F, a, b, c, d, in[4] + K1, 3); -+ ROUND(F, d, a, b, c, in[5] + K1, 7); -+ ROUND(F, c, d, a, b, in[6] + K1, 11); -+ ROUND(F, b, c, d, a, in[7] + K1, 19); -+ -+ /* Round 2 */ -+ ROUND(G, a, b, c, d, in[1] + K2, 3); -+ ROUND(G, d, a, b, c, in[3] + K2, 5); -+ ROUND(G, c, d, a, b, in[5] + K2, 9); -+ ROUND(G, b, c, d, a, in[7] + K2, 13); -+ ROUND(G, a, b, c, d, in[0] + K2, 3); -+ ROUND(G, d, a, b, c, in[2] + K2, 5); -+ ROUND(G, c, d, a, b, in[4] + K2, 9); -+ ROUND(G, b, c, d, a, in[6] + K2, 13); -+ -+ /* Round 3 */ -+ ROUND(H, a, b, c, d, in[3] + K3, 3); -+ ROUND(H, d, a, b, c, in[7] + K3, 9); -+ ROUND(H, c, d, a, b, in[2] + K3, 11); -+ ROUND(H, b, c, d, a, in[6] + K3, 15); -+ ROUND(H, a, b, c, d, in[1] + K3, 3); -+ ROUND(H, d, a, b, c, in[5] + K3, 9); -+ ROUND(H, c, d, a, b, in[0] + K3, 11); -+ ROUND(H, b, c, d, a, in[4] + K3, 15); -+ -+ buf[0] += a; -+ buf[1] += b; -+ buf[2] += c; -+ buf[3] += d; -+} -+ -+#undef ROUND -+#undef F -+#undef G -+#undef H -+#undef K1 -+#undef K2 -+#undef K3 -+ -+/* The old legacy hash */ -+static __u32 dx_hack_hash (const char *name, int len) -+{ -+ __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9; -+ while (len--) { -+ __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373)); -+ -+ if (hash & 0x80000000) hash -= 0x7fffffff; -+ hash1 = hash0; -+ hash0 = hash; -+ } -+ return (hash0 << 1); -+} -+ -+static void str2hashbuf(const char *msg, int len, __u32 *buf, int num) -+{ -+ __u32 pad, val; -+ int i; -+ -+ pad = (__u32)len | ((__u32)len << 8); -+ pad |= pad << 16; -+ -+ val = pad; -+ if (len > num*4) -+ len = num * 4; -+ for (i=0; i < len; i++) { -+ if ((i % 4) == 0) -+ val = pad; -+ val = msg[i] + (val << 8); -+ if ((i % 4) == 3) { -+ *buf++ = val; -+ val = pad; -+ num--; -+ } -+ } -+ if (--num >= 0) -+ *buf++ = val; -+ while (--num >= 0) -+ *buf++ = pad; -+} -+ -+/* -+ * Returns the hash of a filename. If len is 0 and name is NULL, then -+ * this function can be used to test whether or not a hash version is -+ * supported. -+ * -+ * The seed is an 4 longword (32 bits) "secret" which can be used to -+ * uniquify a hash. If the seed is all zero's, then some default seed -+ * may be used. -+ * -+ * A particular hash version specifies whether or not the seed is -+ * represented, and whether or not the returned hash is 32 bits or 64 -+ * bits. 32 bit hashes will return 0 for the minor hash. -+ */ -+int ext3fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo) -+{ -+ __u32 hash; -+ __u32 minor_hash = 0; -+ const char *p; -+ int i; -+ __u32 in[8], buf[4]; -+ -+ /* Initialize the default seed for the hash checksum functions */ -+ buf[0] = 0x67452301; -+ buf[1] = 0xefcdab89; -+ buf[2] = 0x98badcfe; -+ buf[3] = 0x10325476; -+ -+ /* Check to see if the seed is all zero's */ -+ if (hinfo->seed) { -+ for (i=0; i < 4; i++) { -+ if (hinfo->seed[i]) -+ break; -+ } -+ if (i < 4) -+ memcpy(buf, hinfo->seed, sizeof(buf)); -+ } -+ -+ switch (hinfo->hash_version) { -+ case DX_HASH_LEGACY: -+ hash = dx_hack_hash(name, len); -+ break; -+ case DX_HASH_HALF_MD4: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 8); -+ halfMD4Transform(buf, in); -+ len -= 32; -+ p += 32; -+ } -+ minor_hash = buf[2]; -+ hash = buf[1]; -+ break; -+ case DX_HASH_TEA: -+ p = name; -+ while (len > 0) { -+ str2hashbuf(p, len, in, 4); -+ TEA_transform(buf, in); -+ len -= 16; -+ p += 16; -+ } -+ hash = buf[0]; -+ minor_hash = buf[1]; -+ break; -+ default: -+ hinfo->hash = 0; -+ return -1; -+ } -+ hinfo->hash = hash & ~1; -+ hinfo->minor_hash = minor_hash; -+ return 0; -+} ---- linux-2.4.18-chaos-pdirops/fs/ext3/Makefile~ext3-htree 2003-09-23 11:52:24.000000000 +0400 -+++ linux-2.4.18-chaos-pdirops-alexey/fs/ext3/Makefile 2003-09-23 12:11:54.000000000 +0400 -@@ -12,7 +12,7 @@ O_TARGET := ext3.o - export-objs := super.o inode.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o -+ ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - - include $(TOPDIR)/Rules.make ---- linux-2.4.18-chaos-pdirops/fs/ext3/namei.c~ext3-htree 2003-09-23 11:52:34.000000000 +0400 -+++ linux-2.4.18-chaos-pdirops-alexey/fs/ext3/namei.c 2003-09-23 12:12:09.000000000 +0400 -@@ -16,6 +16,12 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - * Directory entry file type support and forward compatibility hooks - * for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998 -+ * Hash Tree Directory indexing (c) -+ * Daniel Phillips, 2001 -+ * Hash Tree Directory indexing porting -+ * Christopher Li, 2002 -+ * Hash Tree Directory indexing cleanup -+ * Theodore Ts'o, 2002 - */ - - #include <linux/fs.h> -@@ -38,6 +44,642 @@ - #define NAMEI_RA_SIZE (NAMEI_RA_CHUNKS * NAMEI_RA_BLOCKS) - #define NAMEI_RA_INDEX(c,b) (((c) * NAMEI_RA_BLOCKS) + (b)) - -+static struct buffer_head *ext3_append(handle_t *handle, -+ struct inode *inode, -+ u32 *block, int *err) -+{ -+ struct buffer_head *bh; -+ -+ *block = inode->i_size >> inode->i_sb->s_blocksize_bits; -+ -+ if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -+ inode->i_size += inode->i_sb->s_blocksize; -+ EXT3_I(inode)->i_disksize = inode->i_size; -+ ext3_journal_get_write_access(handle,bh); -+ } -+ return bh; -+} -+ -+#ifndef assert -+#define assert(test) J_ASSERT(test) -+#endif -+ -+#ifndef swap -+#define swap(x, y) do { typeof(x) z = x; x = y; y = z; } while (0) -+#endif -+ -+typedef struct { u32 v; } le_u32; -+typedef struct { u16 v; } le_u16; -+ -+#ifdef DX_DEBUG -+#define dxtrace(command) command -+#else -+#define dxtrace(command) -+#endif -+ -+struct fake_dirent -+{ -+ /*le*/u32 inode; -+ /*le*/u16 rec_len; -+ u8 name_len; -+ u8 file_type; -+}; -+ -+struct dx_countlimit -+{ -+ le_u16 limit; -+ le_u16 count; -+}; -+ -+struct dx_entry -+{ -+ le_u32 hash; -+ le_u32 block; -+}; -+ -+/* -+ * dx_root_info is laid out so that if it should somehow get overlaid by a -+ * dirent the two low bits of the hash version will be zero. Therefore, the -+ * hash version mod 4 should never be 0. Sincerely, the paranoia department. -+ */ -+ -+struct dx_root -+{ -+ struct fake_dirent dot; -+ char dot_name[4]; -+ struct fake_dirent dotdot; -+ char dotdot_name[4]; -+ struct dx_root_info -+ { -+ le_u32 reserved_zero; -+ u8 hash_version; -+ u8 info_length; /* 8 */ -+ u8 indirect_levels; -+ u8 unused_flags; -+ } -+ info; -+ struct dx_entry entries[0]; -+}; -+ -+struct dx_node -+{ -+ struct fake_dirent fake; -+ struct dx_entry entries[0]; -+}; -+ -+ -+struct dx_frame -+{ -+ struct buffer_head *bh; -+ struct dx_entry *entries; -+ struct dx_entry *at; -+}; -+ -+struct dx_map_entry -+{ -+ u32 hash; -+ u32 offs; -+}; -+ -+#ifdef CONFIG_EXT3_INDEX -+static inline unsigned dx_get_block (struct dx_entry *entry); -+static void dx_set_block (struct dx_entry *entry, unsigned value); -+static inline unsigned dx_get_hash (struct dx_entry *entry); -+static void dx_set_hash (struct dx_entry *entry, unsigned value); -+static unsigned dx_get_count (struct dx_entry *entries); -+static unsigned dx_get_limit (struct dx_entry *entries); -+static void dx_set_count (struct dx_entry *entries, unsigned value); -+static void dx_set_limit (struct dx_entry *entries, unsigned value); -+static unsigned dx_root_limit (struct inode *dir, unsigned infosize); -+static unsigned dx_node_limit (struct inode *dir); -+static struct dx_frame *dx_probe(struct dentry *dentry, -+ struct inode *dir, -+ struct dx_hash_info *hinfo, -+ struct dx_frame *frame, -+ int *err); -+static void dx_release (struct dx_frame *frames); -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry map[]); -+static void dx_sort_map(struct dx_map_entry *map, unsigned count); -+static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, -+ struct dx_map_entry *offsets, int count); -+static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); -+static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash); -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err); -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode); -+ -+/* -+ * Future: use high four bits of block for coalesce-on-delete flags -+ * Mask them off for now. -+ */ -+ -+static inline unsigned dx_get_block (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->block.v) & 0x00ffffff; -+} -+ -+static inline void dx_set_block (struct dx_entry *entry, unsigned value) -+{ -+ entry->block.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_hash (struct dx_entry *entry) -+{ -+ return le32_to_cpu(entry->hash.v); -+} -+ -+static inline void dx_set_hash (struct dx_entry *entry, unsigned value) -+{ -+ entry->hash.v = cpu_to_le32(value); -+} -+ -+static inline unsigned dx_get_count (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->count.v); -+} -+ -+static inline unsigned dx_get_limit (struct dx_entry *entries) -+{ -+ return le16_to_cpu(((struct dx_countlimit *) entries)->limit.v); -+} -+ -+static inline void dx_set_count (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->count.v = cpu_to_le16(value); -+} -+ -+static inline void dx_set_limit (struct dx_entry *entries, unsigned value) -+{ -+ ((struct dx_countlimit *) entries)->limit.v = cpu_to_le16(value); -+} -+ -+static inline unsigned dx_root_limit (struct inode *dir, unsigned infosize) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(1) - -+ EXT3_DIR_REC_LEN(2) - infosize; -+ return 0? 20: entry_space / sizeof(struct dx_entry); -+} -+ -+static inline unsigned dx_node_limit (struct inode *dir) -+{ -+ unsigned entry_space = dir->i_sb->s_blocksize - EXT3_DIR_REC_LEN(0); -+ return 0? 22: entry_space / sizeof(struct dx_entry); -+} -+ -+/* -+ * Debug -+ */ -+#ifdef DX_DEBUG -+struct stats -+{ -+ unsigned names; -+ unsigned space; -+ unsigned bcount; -+}; -+ -+static struct stats dx_show_leaf(struct dx_hash_info *hinfo, struct ext3_dir_entry_2 *de, -+ int size, int show_names) -+{ -+ unsigned names = 0, space = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ printk("names: "); -+ while ((char *) de < base + size) -+ { -+ if (de->inode) -+ { -+ if (show_names) -+ { -+ int len = de->name_len; -+ char *name = de->name; -+ while (len--) printk("%c", *name++); -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ printk(":%x.%u ", h.hash, -+ ((char *) de - base)); -+ } -+ space += EXT3_DIR_REC_LEN(de->name_len); -+ names++; -+ } -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ printk("(%i)\n", names); -+ return (struct stats) { names, space, 1 }; -+} -+ -+struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, -+ struct dx_entry *entries, int levels) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count = dx_get_count (entries), names = 0, space = 0, i; -+ unsigned bcount = 0; -+ struct buffer_head *bh; -+ int err; -+ printk("%i indexed blocks...\n", count); -+ for (i = 0; i < count; i++, entries++) -+ { -+ u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; -+ u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; -+ struct stats stats; -+ printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); -+ if (!(bh = ext3_bread (NULL,dir, block, 0,&err))) continue; -+ stats = levels? -+ dx_show_entries(hinfo, dir, ((struct dx_node *) bh->b_data)->entries, levels - 1): -+ dx_show_leaf(hinfo, (struct ext3_dir_entry_2 *) bh->b_data, blocksize, 0); -+ names += stats.names; -+ space += stats.space; -+ bcount += stats.bcount; -+ brelse (bh); -+ } -+ if (bcount) -+ printk("%snames %u, fullness %u (%u%%)\n", levels?"":" ", -+ names, space/bcount,(space/bcount)*100/blocksize); -+ return (struct stats) { names, space, bcount}; -+} -+#endif /* DX_DEBUG */ -+ -+/* -+ * Probe for a directory leaf block to search. -+ * -+ * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -+ * error in the directory index, and the caller should fall back to -+ * searching the directory normally. The callers of dx_probe **MUST** -+ * check for this error code, and make sure it never gets reflected -+ * back to userspace. -+ */ -+static struct dx_frame * -+dx_probe(struct dentry *dentry, struct inode *dir, -+ struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) -+{ -+ unsigned count, indirect; -+ struct dx_entry *at, *entries, *p, *q, *m; -+ struct dx_root *root; -+ struct buffer_head *bh; -+ struct dx_frame *frame = frame_in; -+ u32 hash; -+ -+ frame->bh = NULL; -+ if (dentry) -+ dir = dentry->d_parent->d_inode; -+ if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) -+ goto fail; -+ root = (struct dx_root *) bh->b_data; -+ if (root->info.hash_version != DX_HASH_TEA && -+ root->info.hash_version != DX_HASH_HALF_MD4 && -+ root->info.hash_version != DX_HASH_LEGACY) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unrecognised inode hash code %d", -+ root->info.hash_version); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ hinfo->hash_version = root->info.hash_version; -+ hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ if (dentry) -+ ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ hash = hinfo->hash; -+ -+ if (root->info.unused_flags & 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash flags: %#06x", -+ root->info.unused_flags); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ if ((indirect = root->info.indirect_levels) > 1) { -+ ext3_warning(dir->i_sb, __FUNCTION__, -+ "Unimplemented inode hash depth: %#06x", -+ root->info.indirect_levels); -+ brelse(bh); -+ *err = ERR_BAD_DX_DIR; -+ goto fail; -+ } -+ -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ while (1) -+ { -+ count = dx_get_count(entries); -+ assert (count && count <= dx_get_limit(entries)); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ dxtrace(printk(".")); -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ -+ if (0) // linear search cross check -+ { -+ unsigned n = count - 1; -+ at = entries; -+ while (n--) -+ { -+ dxtrace(printk(",")); -+ if (dx_get_hash(++at) > hash) -+ { -+ at--; -+ break; -+ } -+ } -+ assert (at == p - 1); -+ } -+ -+ at = p - 1; -+ dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ frame->bh = bh; -+ frame->entries = entries; -+ frame->at = at; -+ if (!indirect--) return frame; -+ if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ goto fail2; -+ at = entries = ((struct dx_node *) bh->b_data)->entries; -+ assert (dx_get_limit(entries) == dx_node_limit (dir)); -+ frame++; -+ } -+fail2: -+ while (frame >= frame_in) { -+ brelse(frame->bh); -+ frame--; -+ } -+fail: -+ return NULL; -+} -+ -+static void dx_release (struct dx_frame *frames) -+{ -+ if (frames[0].bh == NULL) -+ return; -+ -+ if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ brelse(frames[1].bh); -+ brelse(frames[0].bh); -+} -+ -+/* -+ * This function increments the frame pointer to search the next leaf -+ * block, and reads in the necessary intervening nodes if the search -+ * should be necessary. Whether or not the search is necessary is -+ * controlled by the hash parameter. If the hash value is even, then -+ * the search is only continued if the next block starts with that -+ * hash value. This is used if we are searching for a specific file. -+ * -+ * If the hash value is HASH_NB_ALWAYS, then always go to the next block. -+ * -+ * This function returns 1 if the caller should continue to search, -+ * or 0 if it should not. If there is an error reading one of the -+ * index blocks, it will return -1. -+ * -+ * If start_hash is non-null, it will be filled in with the starting -+ * hash of the next page. -+ */ -+static int ext3_htree_next_block(struct inode *dir, __u32 hash, -+ struct dx_frame *frame, -+ struct dx_frame *frames, int *err, -+ __u32 *start_hash) -+{ -+ struct dx_frame *p; -+ struct buffer_head *bh; -+ int num_frames = 0; -+ __u32 bhash; -+ -+ *err = ENOENT; -+ p = frame; -+ /* -+ * Find the next leaf page by incrementing the frame pointer. -+ * If we run out of entries in the interior node, loop around and -+ * increment pointer in the parent node. When we break out of -+ * this loop, num_frames indicates the number of interior -+ * nodes need to be read. -+ */ -+ while (1) { -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ break; -+ if (p == frames) -+ return 0; -+ num_frames++; -+ p--; -+ } -+ -+ /* -+ * If the hash is 1, then continue only if the next page has a -+ * continuation hash of any value. This is used for readdir -+ * handling. Otherwise, check to see if the hash matches the -+ * desired contiuation hash. If it doesn't, return since -+ * there's no point to read in the successive index pages. -+ */ -+ bhash = dx_get_hash(p->at); -+ if (start_hash) -+ *start_hash = bhash; -+ if ((hash & 1) == 0) { -+ if ((bhash & ~1) != hash) -+ return 0; -+ } -+ /* -+ * If the hash is HASH_NB_ALWAYS, we always go to the next -+ * block so no check is necessary -+ */ -+ while (num_frames--) { -+ if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -+ 0, err))) -+ return -1; /* Failure */ -+ p++; -+ brelse (p->bh); -+ p->bh = bh; -+ p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ } -+ return 1; -+} -+ -+ -+/* -+ * p is at least 6 bytes before the end of page -+ */ -+static inline struct ext3_dir_entry_2 *ext3_next_entry(struct ext3_dir_entry_2 *p) -+{ -+ return (struct ext3_dir_entry_2 *)((char*)p + le16_to_cpu(p->rec_len)); -+} -+ -+/* -+ * This function fills a red-black tree with information from a -+ * directory. We start scanning the directory in hash order, starting -+ * at start_hash and start_minor_hash. -+ * -+ * This function returns the number of entries inserted into the tree, -+ * or a negative error code. -+ */ -+int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash) -+{ -+ struct dx_hash_info hinfo; -+ struct buffer_head *bh; -+ struct ext3_dir_entry_2 *de, *top; -+ static struct dx_frame frames[2], *frame; -+ struct inode *dir; -+ int block, err; -+ int count = 0; -+ int ret; -+ __u32 hashval; -+ -+ dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, -+ start_minor_hash)); -+ dir = dir_file->f_dentry->d_inode; -+ hinfo.hash = start_hash; -+ hinfo.minor_hash = 0; -+ frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ -+ /* Add '.' and '..' from the htree header */ -+ if (!start_hash && !start_minor_hash) { -+ de = (struct ext3_dir_entry_2 *) frames[0].bh->b_data; -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; -+ de = ext3_next_entry(de); -+ if ((err = ext3_htree_store_dirent(dir_file, 0, 0, de)) != 0) -+ goto errout; -+ count += 2; -+ } -+ -+ while (1) { -+ block = dx_get_block(frame->at); -+ dxtrace(printk("Reading block %d\n", block)); -+ if (!(bh = ext3_bread (NULL, dir, block, 0, &err))) -+ goto errout; -+ -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + dir->i_sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) { -+ ext3fs_dirhash(de->name, de->name_len, &hinfo); -+ if ((hinfo.hash < start_hash) || -+ ((hinfo.hash == start_hash) && -+ (hinfo.minor_hash < start_minor_hash))) -+ continue; -+ if ((err = ext3_htree_store_dirent(dir_file, -+ hinfo.hash, hinfo.minor_hash, de)) != 0) -+ goto errout; -+ count++; -+ } -+ brelse (bh); -+ hashval = ~1; -+ ret = ext3_htree_next_block(dir, HASH_NB_ALWAYS, -+ frame, frames, &err, &hashval); -+ if (next_hash) -+ *next_hash = hashval; -+ if (ret == -1) -+ goto errout; -+ /* -+ * Stop if: (a) there are no more entries, or -+ * (b) we have inserted at least one entry and the -+ * next hash value is not a continuation -+ */ -+ if ((ret == 0) || -+ (count && ((hashval & 1) == 0))) -+ break; -+ } -+ dx_release(frames); -+ dxtrace(printk("Fill tree: returned %d entries\n", count)); -+ return count; -+errout: -+ dx_release(frames); -+ return (err); -+} -+ -+ -+/* -+ * Directory block splitting, compacting -+ */ -+ -+static int dx_make_map (struct ext3_dir_entry_2 *de, int size, -+ struct dx_hash_info *hinfo, struct dx_map_entry *map_tail) -+{ -+ int count = 0; -+ char *base = (char *) de; -+ struct dx_hash_info h = *hinfo; -+ -+ while ((char *) de < base + size) -+ { -+ if (de->name_len && de->inode) { -+ ext3fs_dirhash(de->name, de->name_len, &h); -+ map_tail--; -+ map_tail->hash = h.hash; -+ map_tail->offs = (u32) ((char *) de - base); -+ count++; -+ } -+ /* XXX: do we need to check rec_len == 0 case? -Chris */ -+ de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ } -+ return count; -+} -+ -+static void dx_sort_map (struct dx_map_entry *map, unsigned count) -+{ -+ struct dx_map_entry *p, *q, *top = map + count - 1; -+ int more; -+ /* Combsort until bubble sort doesn't suck */ -+ while (count > 2) -+ { -+ count = count*10/13; -+ if (count - 9 < 2) /* 9, 10 -> 11 */ -+ count = 11; -+ for (p = top, q = p - count; q >= map; p--, q--) -+ if (p->hash < q->hash) -+ swap(*p, *q); -+ } -+ /* Garden variety bubble sort */ -+ do { -+ more = 0; -+ q = top; -+ while (q-- > map) -+ { -+ if (q[1].hash >= q[0].hash) -+ continue; -+ swap(*(q+1), *q); -+ more = 1; -+ } -+ } while(more); -+} -+ -+static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+{ -+ struct dx_entry *entries = frame->entries; -+ struct dx_entry *old = frame->at, *new = old + 1; -+ int count = dx_get_count(entries); -+ -+ assert(count < dx_get_limit(entries)); -+ assert(old < entries + count); -+ memmove(new + 1, new, (char *)(entries + count) - (char *)(new)); -+ dx_set_hash(new, hash); -+ dx_set_block(new, block); -+ dx_set_count(entries, count + 1); -+} -+#endif -+ -+ -+static void ext3_update_dx_flag(struct inode *inode) -+{ -+ if (!EXT3_HAS_COMPAT_FEATURE(inode->i_sb, -+ EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ EXT3_I(inode)->i_flags &= ~EXT3_INDEX_FL; -+} -+ - /* - * NOTE! unlike strncmp, ext3_match returns 1 for success, 0 for failure. - * -@@ -94,6 +736,7 @@ static int inline search_dirblock(struct - return 0; - } - -+ - /* - * ext3_find_entry() - * -@@ -105,6 +748,8 @@ static int inline search_dirblock(struct - * The returned buffer_head has ->b_count elevated. The caller is expected - * to brelse() it when appropriate. - */ -+ -+ - static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) - { -@@ -119,12 +764,32 @@ static struct buffer_head * ext3_find_en - int num = 0; - int nblocks, i, err; - struct inode *dir = dentry->d_parent->d_inode; -+ int namelen; -+ const u8 *name; -+ unsigned blocksize; - - *res_dir = NULL; - sb = dir->i_sb; -- -+ blocksize = sb->s_blocksize; -+ namelen = dentry->d_name.len; -+ name = dentry->d_name.name; -+ if (namelen > EXT3_NAME_LEN) -+ return NULL; -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ /* -+ * On success, or if the error was file not found, -+ * return. Otherwise, fall back to doing a search the -+ * old fashioned way. -+ */ -+ if (bh || (err != ERR_BAD_DX_DIR)) -+ return bh; -+ dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ } -+#endif - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); -- start = dir->u.ext3_i.i_dir_start_lookup; -+ start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) - start = 0; - block = start; -@@ -166,7 +831,7 @@ restart: - i = search_dirblock(bh, dir, dentry, - block << EXT3_BLOCK_SIZE_BITS(sb), res_dir); - if (i == 1) { -- dir->u.ext3_i.i_dir_start_lookup = block; -+ EXT3_I(dir)->i_dir_start_lookup = block; - ret = bh; - goto cleanup_and_exit; - } else { -@@ -197,6 +862,66 @@ cleanup_and_exit: - return ret; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -+ struct ext3_dir_entry_2 **res_dir, int *err) -+{ -+ struct super_block * sb; -+ struct dx_hash_info hinfo; -+ u32 hash; -+ struct dx_frame frames[2], *frame; -+ struct ext3_dir_entry_2 *de, *top; -+ struct buffer_head *bh; -+ unsigned long block; -+ int retval; -+ int namelen = dentry->d_name.len; -+ const u8 *name = dentry->d_name.name; -+ struct inode *dir = dentry->d_parent->d_inode; -+ -+ sb = dir->i_sb; -+ if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+ return NULL; -+ hash = hinfo.hash; -+ do { -+ block = dx_get_block(frame->at); -+ if (!(bh = ext3_bread (NULL,dir, block, 0, err))) -+ goto errout; -+ de = (struct ext3_dir_entry_2 *) bh->b_data; -+ top = (struct ext3_dir_entry_2 *) ((char *) de + sb->s_blocksize - -+ EXT3_DIR_REC_LEN(0)); -+ for (; de < top; de = ext3_next_entry(de)) -+ if (ext3_match (namelen, name, de)) { -+ if (!ext3_check_dir_entry("ext3_find_entry", -+ dir, de, bh, -+ (block<<EXT3_BLOCK_SIZE_BITS(sb)) -+ +((char *)de - bh->b_data))) { -+ brelse (bh); -+ goto errout; -+ } -+ *res_dir = de; -+ dx_release (frames); -+ return bh; -+ } -+ brelse (bh); -+ /* Check to see if we should continue to search */ -+ retval = ext3_htree_next_block(dir, hash, frame, -+ frames, err, 0); -+ if (retval == -1) { -+ ext3_warning(sb, __FUNCTION__, -+ "error reading index page in directory #%lu", -+ dir->i_ino); -+ goto errout; -+ } -+ } while (retval == 1); -+ -+ *err = -ENOENT; -+errout: -+ dxtrace(printk("%s not found\n", name)); -+ dx_release (frames); -+ return NULL; -+} -+#endif -+ - static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry) - { - struct inode * inode; -@@ -213,8 +938,9 @@ static struct dentry *ext3_lookup(struct - brelse (bh); - inode = iget(dir->i_sb, ino); - -- if (!inode) -+ if (!inode) { - return ERR_PTR(-EACCES); -+ } - } - d_add(dentry, inode); - return NULL; -@@ -238,6 +964,301 @@ static inline void ext3_set_de_type(stru - de->file_type = ext3_type_by_mode[(mode & S_IFMT)>>S_SHIFT]; - } - -+#ifdef CONFIG_EXT3_INDEX -+static struct ext3_dir_entry_2 * -+dx_move_dirents(char *from, char *to, struct dx_map_entry *map, int count) -+{ -+ unsigned rec_len = 0; -+ -+ while (count--) { -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ memcpy (to, de, rec_len); -+ ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); -+ de->inode = 0; -+ map++; -+ to += rec_len; -+ } -+ return (struct ext3_dir_entry_2 *) (to - rec_len); -+} -+ -+static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) -+{ -+ struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ unsigned rec_len = 0; -+ -+ prev = to = de; -+ while ((char*)de < base + size) { -+ next = (struct ext3_dir_entry_2 *) ((char *) de + -+ le16_to_cpu(de->rec_len)); -+ if (de->inode && de->name_len) { -+ rec_len = EXT3_DIR_REC_LEN(de->name_len); -+ if (de > to) -+ memmove(to, de, rec_len); -+ to->rec_len = cpu_to_le16(rec_len); -+ prev = to; -+ to = (struct ext3_dir_entry_2 *)((char *)to + rec_len); -+ } -+ de = next; -+ } -+ return prev; -+} -+ -+static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, -+ struct buffer_head **bh,struct dx_frame *frame, -+ struct dx_hash_info *hinfo, int *error) -+{ -+ unsigned blocksize = dir->i_sb->s_blocksize; -+ unsigned count, continued; -+ struct buffer_head *bh2; -+ u32 newblock; -+ u32 hash2; -+ struct dx_map_entry *map; -+ char *data1 = (*bh)->b_data, *data2; -+ unsigned split; -+ struct ext3_dir_entry_2 *de = NULL, *de2; -+ int err; -+ -+ bh2 = ext3_append (handle, dir, &newblock, error); -+ if (!(bh2)) { -+ brelse(*bh); -+ *bh = NULL; -+ goto errout; -+ } -+ -+ BUFFER_TRACE(*bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, *bh); -+ if (err) { -+ journal_error: -+ brelse(*bh); -+ brelse(bh2); -+ *bh = NULL; -+ ext3_std_error(dir->i_sb, err); -+ goto errout; -+ } -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ -+ data2 = bh2->b_data; -+ -+ /* create map in the end of data2 block */ -+ map = (struct dx_map_entry *) (data2 + blocksize); -+ count = dx_make_map ((struct ext3_dir_entry_2 *) data1, -+ blocksize, hinfo, map); -+ map -= count; -+ split = count/2; // need to adjust to actual middle -+ dx_sort_map (map, count); -+ hash2 = map[split].hash; -+ continued = hash2 == map[split - 1].hash; -+ dxtrace(printk("Split block %i at %x, %i/%i\n", -+ dx_get_block(frame->at), hash2, split, count-split)); -+ -+ /* Fancy dance to stay within two buffers */ -+ de2 = dx_move_dirents(data1, data2, map + split, count - split); -+ de = dx_pack_dirents(data1,blocksize); -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ -+ /* Which block gets the new entry? */ -+ if (hinfo->hash >= hash2) -+ { -+ swap(*bh, bh2); -+ de = de2; -+ } -+ dx_insert_block (frame, hash2 + continued, newblock); -+ err = ext3_journal_dirty_metadata (handle, bh2); -+ if (err) -+ goto journal_error; -+ err = ext3_journal_dirty_metadata (handle, frame->bh); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ dxtrace(dx_show_index ("frame", frame->entries)); -+errout: -+ return de; -+} -+#endif -+ -+ -+/* -+ * Add a new entry into a directory (leaf) block. If de is non-NULL, -+ * it points to a directory entry which is guaranteed to be large -+ * enough for new directory entry. If de is NULL, then -+ * add_dirent_to_buf will attempt search the directory block for -+ * space. It will return -ENOSPC if no space is available, and -EIO -+ * and -EEXIST if directory entry already exists. -+ * -+ * NOTE! bh is NOT released in the case where ENOSPC is returned. In -+ * all other cases bh is released. -+ */ -+static int add_dirent_to_buf(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct ext3_dir_entry_2 *de, -+ struct buffer_head * bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ unsigned long offset = 0; -+ unsigned short reclen; -+ int nlen, rlen, err; -+ char *top; -+ -+ reclen = EXT3_DIR_REC_LEN(namelen); -+ if (!de) { -+ de = (struct ext3_dir_entry_2 *)bh->b_data; -+ top = bh->b_data + dir->i_sb->s_blocksize - reclen; -+ while ((char *) de <= top) { -+ if (!ext3_check_dir_entry("ext3_add_entry", dir, de, -+ bh, offset)) { -+ brelse (bh); -+ return -EIO; -+ } -+ if (ext3_match (namelen, name, de)) { -+ brelse (bh); -+ return -EEXIST; -+ } -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if ((de->inode? rlen - nlen: rlen) >= reclen) -+ break; -+ de = (struct ext3_dir_entry_2 *)((char *)de + rlen); -+ offset += rlen; -+ } -+ if ((char *) de > top) -+ return -ENOSPC; -+ } -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) { -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return err; -+ } -+ -+ /* By now the buffer is marked for journaling */ -+ nlen = EXT3_DIR_REC_LEN(de->name_len); -+ rlen = le16_to_cpu(de->rec_len); -+ if (de->inode) { -+ struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ de1->rec_len = cpu_to_le16(rlen - nlen); -+ de->rec_len = cpu_to_le16(nlen); -+ de = de1; -+ } -+ de->file_type = EXT3_FT_UNKNOWN; -+ if (inode) { -+ de->inode = cpu_to_le32(inode->i_ino); -+ ext3_set_de_type(dir->i_sb, de, inode->i_mode); -+ } else -+ de->inode = 0; -+ de->name_len = namelen; -+ memcpy (de->name, name, namelen); -+ /* -+ * XXX shouldn't update any times until successful -+ * completion of syscall, but too many callers depend -+ * on this. -+ * -+ * XXX similarly, too many callers depend on -+ * ext3_new_inode() setting the times, but error -+ * recovery deletes the inode, so the worst that can -+ * happen is that the times are slightly out of date -+ * and/or different from the directory change time. -+ */ -+ dir->i_mtime = dir->i_ctime = CURRENT_TIME; -+ ext3_update_dx_flag(dir); -+ dir->i_version = ++event; -+ ext3_mark_inode_dirty(handle, dir); -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ ext3_std_error(dir->i_sb, err); -+ brelse(bh); -+ return 0; -+} -+ -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * This converts a one block unindexed directory to a 3 block indexed -+ * directory, and adds the dentry to the indexed directory. -+ */ -+static int make_indexed_dir(handle_t *handle, struct dentry *dentry, -+ struct inode *inode, struct buffer_head *bh) -+{ -+ struct inode *dir = dentry->d_parent->d_inode; -+ const char *name = dentry->d_name.name; -+ int namelen = dentry->d_name.len; -+ struct buffer_head *bh2; -+ struct dx_root *root; -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries; -+ struct ext3_dir_entry_2 *de, *de2; -+ char *data1, *top; -+ unsigned len; -+ int retval; -+ unsigned blocksize; -+ struct dx_hash_info hinfo; -+ u32 block; -+ -+ blocksize = dir->i_sb->s_blocksize; -+ dxtrace(printk("Creating index\n")); -+ retval = ext3_journal_get_write_access(handle, bh); -+ if (retval) { -+ ext3_std_error(dir->i_sb, retval); -+ brelse(bh); -+ return retval; -+ } -+ root = (struct dx_root *) bh->b_data; -+ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ bh2 = ext3_append (handle, dir, &block, &retval); -+ if (!(bh2)) { -+ brelse(bh); -+ return retval; -+ } -+ data1 = bh2->b_data; -+ -+ /* The 0th block becomes the root, move the dirents out */ -+ de = (struct ext3_dir_entry_2 *)&root->dotdot; -+ de = (struct ext3_dir_entry_2 *)((char *)de + le16_to_cpu(de->rec_len)); -+ len = ((char *) root) + blocksize - (char *) de; -+ memcpy (data1, de, len); -+ de = (struct ext3_dir_entry_2 *) data1; -+ top = data1 + len; -+ while (((char *) de2=(char*)de+le16_to_cpu(de->rec_len)) < top) -+ de = de2; -+ de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); -+ /* Initialize the root; the dot dirents already exist */ -+ de = (struct ext3_dir_entry_2 *) (&root->dotdot); -+ de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); -+ memset (&root->info, 0, sizeof(root->info)); -+ root->info.info_length = sizeof(root->info); -+ root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ entries = root->entries; -+ dx_set_block (entries, 1); -+ dx_set_count (entries, 1); -+ dx_set_limit (entries, dx_root_limit(dir, sizeof(root->info))); -+ -+ /* Initialize as for dx_probe */ -+ hinfo.hash_version = root->info.hash_version; -+ hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ ext3fs_dirhash(name, namelen, &hinfo); -+ frame = frames; -+ frame->entries = entries; -+ frame->at = entries; -+ frame->bh = bh; -+ bh = bh2; -+ de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ dx_release (frames); -+ if (!(de)) -+ return retval; -+ -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} -+#endif -+ - /* - * ext3_add_entry() - * -@@ -248,127 +1268,198 @@ static inline void ext3_set_de_type(stru - * may not sleep between calling this and putting something into - * the entry, as someone else might have used it while you slept. - */ -- --/* -- * AKPM: the journalling code here looks wrong on the error paths -- */ - static int ext3_add_entry (handle_t *handle, struct dentry *dentry, - struct inode *inode) - { - struct inode *dir = dentry->d_parent->d_inode; -- const char *name = dentry->d_name.name; -- int namelen = dentry->d_name.len; - unsigned long offset; -- unsigned short rec_len; - struct buffer_head * bh; -- struct ext3_dir_entry_2 * de, * de1; -+ struct ext3_dir_entry_2 *de; - struct super_block * sb; - int retval; -+#ifdef CONFIG_EXT3_INDEX -+ int dx_fallback=0; -+#endif -+ unsigned blocksize; -+ unsigned nlen, rlen; -+ u32 block, blocks; - - sb = dir->i_sb; -- -- if (!namelen) -+ blocksize = sb->s_blocksize; -+ if (!dentry->d_name.len) - return -EINVAL; -- bh = ext3_bread (handle, dir, 0, 0, &retval); -+#ifdef CONFIG_EXT3_INDEX -+ if (is_dx(dir)) { -+ retval = ext3_dx_add_entry(handle, dentry, inode); -+ if (!retval || (retval != ERR_BAD_DX_DIR)) -+ return retval; -+ EXT3_I(dir)->i_flags &= ~EXT3_INDEX_FL; -+ dx_fallback++; -+ ext3_mark_inode_dirty(handle, dir); -+ } -+#endif -+ blocks = dir->i_size >> sb->s_blocksize_bits; -+ for (block = 0, offset = 0; block < blocks; block++) { -+ bh = ext3_bread(handle, dir, block, 0, &retval); -+ if(!bh) -+ return retval; -+ retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (retval != -ENOSPC) -+ return retval; -+ -+#ifdef CONFIG_EXT3_INDEX -+ if (blocks == 1 && !dx_fallback && -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -+ return make_indexed_dir(handle, dentry, inode, bh); -+#endif -+ brelse(bh); -+ } -+ bh = ext3_append(handle, dir, &block, &retval); - if (!bh) - return retval; -- rec_len = EXT3_DIR_REC_LEN(namelen); -- offset = 0; - de = (struct ext3_dir_entry_2 *) bh->b_data; -- while (1) { -- if ((char *)de >= sb->s_blocksize + bh->b_data) { -- brelse (bh); -- bh = NULL; -- bh = ext3_bread (handle, dir, -- offset >> EXT3_BLOCK_SIZE_BITS(sb), 1, &retval); -- if (!bh) -- return retval; -- if (dir->i_size <= offset) { -- if (dir->i_size == 0) { -- brelse(bh); -- return -ENOENT; -- } -+ de->inode = 0; -+ de->rec_len = cpu_to_le16(rlen = blocksize); -+ nlen = 0; -+ return add_dirent_to_buf(handle, dentry, inode, de, bh); -+} - -- ext3_debug ("creating next block\n"); -+#ifdef CONFIG_EXT3_INDEX -+/* -+ * Returns 0 for success, or a negative error value -+ */ -+static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ struct dx_frame frames[2], *frame; -+ struct dx_entry *entries, *at; -+ struct dx_hash_info hinfo; -+ struct buffer_head * bh; -+ struct inode *dir = dentry->d_parent->d_inode; -+ struct super_block * sb = dir->i_sb; -+ struct ext3_dir_entry_2 *de; -+ int err; - -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- de->inode = 0; -- de->rec_len = le16_to_cpu(sb->s_blocksize); -- dir->u.ext3_i.i_disksize = -- dir->i_size = offset + sb->s_blocksize; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- ext3_mark_inode_dirty(handle, dir); -- } else { -+ frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ if (!frame) -+ return err; -+ entries = frame->entries; -+ at = frame->at; - -- ext3_debug ("skipping to next block\n"); -+ if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ goto cleanup; - -- de = (struct ext3_dir_entry_2 *) bh->b_data; -- } -- } -- if (!ext3_check_dir_entry ("ext3_add_entry", dir, de, bh, -- offset)) { -- brelse (bh); -- return -ENOENT; -- } -- if (ext3_match (namelen, name, de)) { -- brelse (bh); -- return -EEXIST; -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto journal_error; -+ -+ err = add_dirent_to_buf(handle, dentry, inode, 0, bh); -+ if (err != -ENOSPC) { -+ bh = 0; -+ goto cleanup; -+ } -+ -+ /* Block full, should compress but for now just split */ -+ dxtrace(printk("using %u of %u node entries\n", -+ dx_get_count(entries), dx_get_limit(entries))); -+ /* Need to split index? */ -+ if (dx_get_count(entries) == dx_get_limit(entries)) { -+ u32 newblock; -+ unsigned icount = dx_get_count(entries); -+ int levels = frame - frames; -+ struct dx_entry *entries2; -+ struct dx_node *node2; -+ struct buffer_head *bh2; -+ -+ if (levels && (dx_get_count(frames->entries) == -+ dx_get_limit(frames->entries))) { -+ ext3_warning(sb, __FUNCTION__, -+ "Directory index full!\n"); -+ err = -ENOSPC; -+ goto cleanup; - } -- if ((le32_to_cpu(de->inode) == 0 && -- le16_to_cpu(de->rec_len) >= rec_len) || -- (le16_to_cpu(de->rec_len) >= -- EXT3_DIR_REC_LEN(de->name_len) + rec_len)) { -- BUFFER_TRACE(bh, "get_write_access"); -- ext3_journal_get_write_access(handle, bh); -- /* By now the buffer is marked for journaling */ -- offset += le16_to_cpu(de->rec_len); -- if (le32_to_cpu(de->inode)) { -- de1 = (struct ext3_dir_entry_2 *) ((char *) de + -- EXT3_DIR_REC_LEN(de->name_len)); -- de1->rec_len = -- cpu_to_le16(le16_to_cpu(de->rec_len) - -- EXT3_DIR_REC_LEN(de->name_len)); -- de->rec_len = cpu_to_le16( -- EXT3_DIR_REC_LEN(de->name_len)); -- de = de1; -+ bh2 = ext3_append (handle, dir, &newblock, &err); -+ if (!(bh2)) -+ goto cleanup; -+ node2 = (struct dx_node *)(bh2->b_data); -+ entries2 = node2->entries; -+ node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -+ node2->fake.inode = 0; -+ BUFFER_TRACE(frame->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, frame->bh); -+ if (err) -+ goto journal_error; -+ if (levels) { -+ unsigned icount1 = icount/2, icount2 = icount - icount1; -+ unsigned hash2 = dx_get_hash(entries + icount1); -+ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ err = ext3_journal_get_write_access(handle, -+ frames[0].bh); -+ if (err) -+ goto journal_error; -+ -+ memcpy ((char *) entries2, (char *) (entries + icount1), -+ icount2 * sizeof(struct dx_entry)); -+ dx_set_count (entries, icount1); -+ dx_set_count (entries2, icount2); -+ dx_set_limit (entries2, dx_node_limit(dir)); -+ -+ /* Which index block gets the new entry? */ -+ if (at - entries >= icount1) { -+ frame->at = at = at - entries - icount1 + entries2; -+ frame->entries = entries = entries2; -+ swap(frame->bh, bh2); - } -- de->file_type = EXT3_FT_UNKNOWN; -- if (inode) { -- de->inode = cpu_to_le32(inode->i_ino); -- ext3_set_de_type(dir->i_sb, de, inode->i_mode); -- } else -- de->inode = 0; -- de->name_len = namelen; -- memcpy (de->name, name, namelen); -- /* -- * XXX shouldn't update any times until successful -- * completion of syscall, but too many callers depend -- * on this. -- * -- * XXX similarly, too many callers depend on -- * ext3_new_inode() setting the times, but error -- * recovery deletes the inode, so the worst that can -- * happen is that the times are slightly out of date -- * and/or different from the directory change time. -- */ -- dir->i_mtime = dir->i_ctime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -- 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); -- return 0; -+ dx_insert_block (frames + 0, hash2, newblock); -+ dxtrace(dx_show_index ("node", frames[1].entries)); -+ dxtrace(dx_show_index ("node", -+ ((struct dx_node *) bh2->b_data)->entries)); -+ err = ext3_journal_dirty_metadata(handle, bh2); -+ if (err) -+ goto journal_error; -+ brelse (bh2); -+ } else { -+ dxtrace(printk("Creating second level index...\n")); -+ memcpy((char *) entries2, (char *) entries, -+ icount * sizeof(struct dx_entry)); -+ dx_set_limit(entries2, dx_node_limit(dir)); -+ -+ /* Set up root */ -+ dx_set_count(entries, 1); -+ dx_set_block(entries + 0, newblock); -+ ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ -+ /* Add new access path frame */ -+ frame = frames + 1; -+ frame->at = at = at - entries + entries2; -+ frame->entries = entries = entries2; -+ frame->bh = bh2; -+ err = ext3_journal_get_write_access(handle, -+ frame->bh); -+ if (err) -+ goto journal_error; - } -- offset += le16_to_cpu(de->rec_len); -- de = (struct ext3_dir_entry_2 *) -- ((char *) de + le16_to_cpu(de->rec_len)); -+ ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- brelse (bh); -- return -ENOSPC; -+ de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ if (!de) -+ goto cleanup; -+ err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ bh = 0; -+ goto cleanup; -+ -+journal_error: -+ ext3_std_error(dir->i_sb, err); -+cleanup: -+ if (bh) -+ brelse(bh); -+ dx_release(frames); -+ return err; - } -+#endif - - /* - * ext3_delete_entry deletes a directory entry by merging it with the -@@ -452,9 +1543,11 @@ static int ext3_create (struct inode * d - struct inode * inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -479,9 +1572,11 @@ static int ext3_mknod (struct inode * di - struct inode *inode; - int err; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -508,9 +1603,11 @@ static int ext3_mkdir(struct inode * dir - if (dir->i_nlink >= EXT3_LINK_MAX) - return -EMLINK; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 3); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -522,7 +1619,7 @@ static int ext3_mkdir(struct inode * dir - - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -- inode->i_size = inode->u.ext3_i.i_disksize = inode->i_sb->s_blocksize; -+ inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; - inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { -@@ -555,21 +1652,19 @@ static int ext3_mkdir(struct inode * dir - inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); -- if (err) -- goto out_no_entry; -+ if (err) { -+ inode->i_nlink = 0; -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - dir->i_nlink++; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - d_instantiate(dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- inode->i_nlink = 0; -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - /* -@@ -656,7 +1751,7 @@ int ext3_orphan_add(handle_t *handle, st - int err = 0, rc; - - lock_super(sb); -- if (!list_empty(&inode->u.ext3_i.i_orphan)) -+ if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - - /* Orphan handling is only valid for files with data blocks -@@ -697,7 +1792,7 @@ int ext3_orphan_add(handle_t *handle, st - * This is safe: on error we're going to ignore the orphan list - * anyway on the next recovery. */ - if (!err) -- list_add(&inode->u.ext3_i.i_orphan, &EXT3_SB(sb)->s_orphan); -+ list_add(&EXT3_I(inode)->i_orphan, &EXT3_SB(sb)->s_orphan); - - jbd_debug(4, "superblock will point to %ld\n", inode->i_ino); - jbd_debug(4, "orphan inode %ld will point to %d\n", -@@ -715,25 +1810,26 @@ out_unlock: - int ext3_orphan_del(handle_t *handle, struct inode *inode) - { - struct list_head *prev; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct ext3_sb_info *sbi; - ino_t ino_next; - struct ext3_iloc iloc; - int err = 0; - - lock_super(inode->i_sb); -- if (list_empty(&inode->u.ext3_i.i_orphan)) { -+ if (list_empty(&ei->i_orphan)) { - unlock_super(inode->i_sb); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); -- prev = inode->u.ext3_i.i_orphan.prev; -+ prev = ei->i_orphan.prev; - sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %ld from orphan list\n", inode->i_ino); - -- list_del(&inode->u.ext3_i.i_orphan); -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ list_del(&ei->i_orphan); -+ INIT_LIST_HEAD(&ei->i_orphan); - - /* If we're on an error path, we may not have a valid - * transaction handle with which to update the orphan list on -@@ -794,8 +1890,9 @@ static int ext3_rmdir (struct inode * di - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); -@@ -833,7 +1930,7 @@ static int ext3_rmdir (struct inode * di - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; - ext3_mark_inode_dirty(handle, inode); -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - - end_rmdir: -@@ -851,8 +1948,9 @@ static int ext3_unlink(struct inode * di - handle_t *handle; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -879,7 +1977,7 @@ static int ext3_unlink(struct inode * di - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -- dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(dir); - ext3_mark_inode_dirty(handle, dir); - inode->i_nlink--; - if (!inode->i_nlink) -@@ -905,9 +2003,11 @@ static int ext3_symlink (struct inode * - if (l > dir->i_sb->s_blocksize) - return -ENAMETOOLONG; - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + 5); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -917,7 +2017,7 @@ static int ext3_symlink (struct inode * - if (IS_ERR(inode)) - goto out_stop; - -- if (l > sizeof (inode->u.ext3_i.i_data)) { -+ if (l > sizeof (EXT3_I(inode)->i_data)) { - inode->i_op = &page_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* -@@ -926,25 +2026,23 @@ static int ext3_symlink (struct inode * - * i_size in generic_commit_write(). - */ - err = block_symlink(inode, symname, l); -- if (err) -- goto out_no_entry; -+ if (err) { -+ ext3_dec_count(handle, inode); -+ ext3_mark_inode_dirty(handle, inode); -+ iput (inode); -+ goto out_stop; -+ } - } else { - inode->i_op = &ext3_fast_symlink_inode_operations; -- memcpy((char*)&inode->u.ext3_i.i_data,symname,l); -+ memcpy((char*)&EXT3_I(inode)->i_data,symname,l); - inode->i_size = l-1; - } -- inode->u.ext3_i.i_disksize = inode->i_size; -+ EXT3_I(inode)->i_disksize = inode->i_size; - err = ext3_add_nondir(handle, dentry, inode); - ext3_mark_inode_dirty(handle, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -- --out_no_entry: -- ext3_dec_count(handle, inode); -- ext3_mark_inode_dirty(handle, inode); -- iput (inode); -- goto out_stop; - } - - static int ext3_link (struct dentry * old_dentry, -@@ -957,12 +2055,15 @@ static int ext3_link (struct dentry * ol - if (S_ISDIR(inode->i_mode)) - return -EPERM; - -- if (inode->i_nlink >= EXT3_LINK_MAX) -+ if (inode->i_nlink >= EXT3_LINK_MAX) { - return -EMLINK; -+ } - -- handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(dir)) - handle->h_sync = 1; -@@ -996,9 +2097,11 @@ static int ext3_rename (struct inode * o - - old_bh = new_bh = dir_bh = NULL; - -- handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + 2); -- if (IS_ERR(handle)) -+ handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); -+ if (IS_ERR(handle)) { - return PTR_ERR(handle); -+ } - - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; -@@ -1071,14 +2174,37 @@ static int ext3_rename (struct inode * o - /* - * ok, that's it - */ -- ext3_delete_entry(handle, old_dir, old_de, old_bh); -+ if (le32_to_cpu(old_de->inode) != old_inode->i_ino || -+ old_de->name_len != old_dentry->d_name.len || -+ strncmp(old_de->name, old_dentry->d_name.name, old_de->name_len) || -+ (retval = ext3_delete_entry(handle, old_dir, -+ old_de, old_bh)) == -ENOENT) { -+ /* old_de could have moved from under us during htree split, so -+ * make sure that we are deleting the right entry. We might -+ * also be pointing to a stale entry in the unused part of -+ * old_bh so just checking inum and the name isn't enough. */ -+ struct buffer_head *old_bh2; -+ struct ext3_dir_entry_2 *old_de2; -+ -+ old_bh2 = ext3_find_entry(old_dentry, &old_de2); -+ if (old_bh2) { -+ retval = ext3_delete_entry(handle, old_dir, -+ old_de2, old_bh2); -+ brelse(old_bh2); -+ } -+ } -+ if (retval) { -+ ext3_warning(old_dir->i_sb, "ext3_rename", -+ "Deleting old file (%lu), %d, error=%d", -+ old_dir->i_ino, old_dir->i_nlink, retval); -+ } - - if (new_inode) { - new_inode->i_nlink--; - new_inode->i_ctime = CURRENT_TIME; - } - old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; -- old_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(old_dir); - if (dir_bh) { - BUFFER_TRACE(dir_bh, "get_write_access"); - ext3_journal_get_write_access(handle, dir_bh); -@@ -1090,7 +2212,7 @@ static int ext3_rename (struct inode * o - new_inode->i_nlink--; - } else { - new_dir->i_nlink++; -- new_dir->u.ext3_i.i_flags &= ~EXT3_INDEX_FL; -+ ext3_update_dx_flag(new_dir); - ext3_mark_inode_dirty(handle, new_dir); - } - } ---- linux-2.4.18-chaos-pdirops/fs/ext3/super.c~ext3-htree 2003-09-23 11:52:24.000000000 +0400 -+++ linux-2.4.18-chaos-pdirops-alexey/fs/ext3/super.c 2003-09-23 12:11:54.000000000 +0400 -@@ -705,6 +705,7 @@ static int ext3_setup_super(struct super - es->s_mtime = cpu_to_le32(CURRENT_TIME); - ext3_update_dynamic_rev(sb); - EXT3_SET_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -+ - ext3_commit_super (sb, es, 1); - if (test_opt (sb, DEBUG)) - printk (KERN_INFO -@@ -715,6 +716,7 @@ static int ext3_setup_super(struct super - EXT3_BLOCKS_PER_GROUP(sb), - EXT3_INODES_PER_GROUP(sb), - sbi->s_mount_opt); -+ - printk(KERN_INFO "EXT3 FS " EXT3FS_VERSION ", " EXT3FS_DATE " on %s, ", - bdevname(sb->s_dev)); - if (EXT3_SB(sb)->s_journal->j_inode == NULL) { -@@ -889,6 +891,7 @@ static loff_t ext3_max_size(int bits) - return res; - } - -+ - struct super_block * ext3_read_super (struct super_block * sb, void * data, - int silent) - { -@@ -1065,6 +1068,9 @@ struct super_block * ext3_read_super (st - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+ for (i=0; i < 4; i++) -+ sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); -+ sbi->s_def_hash_version = es->s_def_hash_version; - - if (sbi->s_blocks_per_group > blocksize * 8) { - printk (KERN_ERR -@@ -1747,6 +1753,7 @@ static void __exit exit_ext3_fs(void) - unregister_filesystem(&ext3_fs_type); - } - -+EXPORT_SYMBOL(ext3_force_commit); - EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); ---- linux-2.4.18-chaos-pdirops/include/linux/ext3_fs.h~ext3-htree 2003-07-28 17:52:17.000000000 +0400 -+++ linux-2.4.18-chaos-pdirops-alexey/include/linux/ext3_fs.h 2003-09-23 12:12:04.000000000 +0400 -@@ -40,6 +40,11 @@ - #define EXT3FS_VERSION "2.4-0.9.18" - - /* -+ * Always enable hashed directories -+ */ -+#define CONFIG_EXT3_INDEX -+ -+/* - * Debug code - */ - #ifdef EXT3FS_DEBUG -@@ -437,8 +442,11 @@ struct ext3_super_block { - /*E0*/ __u32 s_journal_inum; /* inode number of journal file */ - __u32 s_journal_dev; /* device number of journal file */ - __u32 s_last_orphan; /* start of list of inodes to delete */ -- --/*EC*/ __u32 s_reserved[197]; /* Padding to the end of the block */ -+ __u32 s_hash_seed[4]; /* HTREE hash seed */ -+ __u8 s_def_hash_version; /* Default hash version to use */ -+ __u8 s_reserved_char_pad; -+ __u16 s_reserved_word_pad; -+ __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -575,9 +583,46 @@ struct ext3_dir_entry_2 { - #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) - #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ - ~EXT3_DIR_ROUND) -+/* -+ * Hash Tree Directory indexing -+ * (c) Daniel Phillips, 2001 -+ */ -+ -+#ifdef CONFIG_EXT3_INDEX -+ #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ -+ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ -+ (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) -+#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) -+#else -+ #define is_dx(dir) 0 -+#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) -+#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) -+#endif -+ -+/* Legal values for the dx_root hash_version field: */ -+ -+#define DX_HASH_LEGACY 0 -+#define DX_HASH_HALF_MD4 1 -+#define DX_HASH_TEA 2 -+ -+/* hash info structure used by the directory hash */ -+struct dx_hash_info -+{ -+ u32 hash; -+ u32 minor_hash; -+ int hash_version; -+ u32 *seed; -+}; - - #ifdef __KERNEL__ - /* -+ * Control parameters used by ext3_htree_next_block -+ */ -+#define HASH_NB_ALWAYS 1 -+ -+ -+/* - * Describe an inode's exact location on disk and in memory - */ - struct ext3_iloc -@@ -587,6 +632,27 @@ struct ext3_iloc - unsigned long block_group; - }; - -+ -+/* -+ * This structure is stuffed into the struct file's private_data field -+ * for directories. It is where we put information so that we can do -+ * readdir operations in hash tree order. -+ */ -+struct dir_private_info { -+ rb_root_t root; -+ rb_node_t *curr_node; -+ struct fname *extra_fname; -+ loff_t last_pos; -+ __u32 curr_hash; -+ __u32 curr_minor_hash; -+ __u32 next_hash; -+}; -+ -+/* -+ * Special error return code only used by dx_probe() and its callers. -+ */ -+#define ERR_BAD_DX_DIR -75000 -+ - /* - * Function prototypes - */ -@@ -614,11 +680,20 @@ extern struct ext3_group_desc * ext3_get - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, -- struct ext3_dir_entry_2 *, struct buffer_head *, -- unsigned long); -+ struct ext3_dir_entry_2 *, -+ struct buffer_head *, unsigned long); -+extern int ext3_htree_store_dirent(struct file *dir_file, __u32 hash, -+ __u32 minor_hash, -+ struct ext3_dir_entry_2 *dirent); -+extern void ext3_htree_free_dir_info(struct dir_private_info *p); -+ - /* fsync.c */ - extern int ext3_sync_file (struct file *, struct dentry *, int); - -+/* hash.c */ -+extern int ext3fs_dirhash(const char *name, int len, struct -+ dx_hash_info *hinfo); -+ - /* ialloc.c */ - extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int); - extern void ext3_free_inode (handle_t *, struct inode *); -@@ -650,6 +725,8 @@ extern int ext3_ioctl (struct inode *, s - /* namei.c */ - extern int ext3_orphan_add(handle_t *, struct inode *); - extern int ext3_orphan_del(handle_t *, struct inode *); -+extern int ext3_htree_fill_tree(struct file *dir_file, __u32 start_hash, -+ __u32 start_minor_hash, __u32 *next_hash); - - /* super.c */ - extern void ext3_error (struct super_block *, const char *, const char *, ...) ---- linux-2.4.18-chaos-pdirops/include/linux/ext3_fs_sb.h~ext3-htree 2003-07-28 17:52:17.000000000 +0400 -+++ linux-2.4.18-chaos-pdirops-alexey/include/linux/ext3_fs_sb.h 2003-09-23 12:11:54.000000000 +0400 -@@ -62,6 +62,8 @@ struct ext3_sb_info { - int s_inode_size; - int s_first_ino; - u32 s_next_generation; -+ u32 s_hash_seed[4]; -+ int s_def_hash_version; - - /* Journaling */ - struct inode * s_journal_inode; ---- linux-2.4.18-chaos-pdirops/include/linux/ext3_jbd.h~ext3-htree 2001-12-21 20:42:03.000000000 +0300 -+++ linux-2.4.18-chaos-pdirops-alexey/include/linux/ext3_jbd.h 2003-09-23 12:11:54.000000000 +0400 -@@ -63,6 +63,8 @@ extern int ext3_writepage_trans_blocks(s - - #define EXT3_RESERVE_TRANS_BLOCKS 12 - -+#define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, ---- linux-2.4.18-chaos-pdirops/include/linux/rbtree.h~ext3-htree 2001-11-22 22:46:18.000000000 +0300 -+++ linux-2.4.18-chaos-pdirops-alexey/include/linux/rbtree.h 2003-09-23 12:11:54.000000000 +0400 -@@ -120,6 +120,8 @@ rb_root_t; - - extern void rb_insert_color(rb_node_t *, rb_root_t *); - extern void rb_erase(rb_node_t *, rb_root_t *); -+extern rb_node_t *rb_get_first(rb_root_t *root); -+extern rb_node_t *rb_get_next(rb_node_t *n); - - static inline void rb_link_node(rb_node_t * node, rb_node_t * parent, rb_node_t ** rb_link) - { ---- linux-2.4.18-chaos-pdirops/lib/rbtree.c~ext3-htree 2003-09-23 11:52:34.000000000 +0400 -+++ linux-2.4.18-chaos-pdirops-alexey/lib/rbtree.c 2003-09-23 12:11:54.000000000 +0400 -@@ -17,6 +17,8 @@ - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - linux/lib/rbtree.c -+ -+ rb_get_first and rb_get_next written by Theodore Ts'o, 9/8/2002 - */ - - #include <linux/rbtree.h> -@@ -295,3 +297,43 @@ void rb_erase(rb_node_t * node, rb_root_ - __rb_erase_color(child, parent, root); - } - EXPORT_SYMBOL(rb_erase); -+ -+/* -+ * This function returns the first node (in sort order) of the tree. -+ */ -+rb_node_t *rb_get_first(rb_root_t *root) -+{ -+ rb_node_t *n; -+ -+ n = root->rb_node; -+ if (!n) -+ return 0; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+} -+EXPORT_SYMBOL(rb_get_first); -+ -+/* -+ * Given a node, this function will return the next node in the tree. -+ */ -+rb_node_t *rb_get_next(rb_node_t *n) -+{ -+ rb_node_t *parent; -+ -+ if (n->rb_right) { -+ n = n->rb_right; -+ while (n->rb_left) -+ n = n->rb_left; -+ return n; -+ } else { -+ while ((parent = n->rb_parent)) { -+ if (n == parent->rb_left) -+ return parent; -+ n = parent; -+ } -+ return 0; -+ } -+} -+EXPORT_SYMBOL(rb_get_next); -+ - -_ diff --git a/lustre/kernel_patches/patches/ext3-ino_sb_macro-2.4.21-chaos.patch b/lustre/kernel_patches/patches/ext3-ino_sb_macro-2.4.21-chaos.patch deleted file mode 100644 index fb739a5d0c..0000000000 --- a/lustre/kernel_patches/patches/ext3-ino_sb_macro-2.4.21-chaos.patch +++ /dev/null @@ -1,1514 +0,0 @@ -Index: linux-2.4.21-chaos/fs/ext3/balloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/balloc.c 2003-07-15 02:09:35.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/balloc.c 2003-12-12 12:50:34.000000000 +0300 -@@ -46,18 +46,18 @@ - unsigned long desc; - struct ext3_group_desc * gdp; - -- if (block_group >= sb->u.ext3_sb.s_groups_count) { -+ if (block_group >= EXT3_SB(sb)->s_groups_count) { - ext3_error (sb, "ext3_get_group_desc", - "block_group >= groups_count - " - "block_group = %d, groups_count = %lu", -- block_group, sb->u.ext3_sb.s_groups_count); -+ block_group, EXT3_SB(sb)->s_groups_count); - - return NULL; - } - - group_desc = block_group / EXT3_DESC_PER_BLOCK(sb); - desc = block_group % EXT3_DESC_PER_BLOCK(sb); -- if (!sb->u.ext3_sb.s_group_desc[group_desc]) { -+ if (!EXT3_SB(sb)->s_group_desc[group_desc]) { - ext3_error (sb, "ext3_get_group_desc", - "Group descriptor not loaded - " - "block_group = %d, group_desc = %lu, desc = %lu", -@@ -66,9 +66,9 @@ - } - - gdp = (struct ext3_group_desc *) -- sb->u.ext3_sb.s_group_desc[group_desc]->b_data; -+ EXT3_SB(sb)->s_group_desc[group_desc]->b_data; - if (bh) -- *bh = sb->u.ext3_sb.s_group_desc[group_desc]; -+ *bh = EXT3_SB(sb)->s_group_desc[group_desc]; - return gdp + desc; - } - -@@ -104,8 +104,8 @@ - * this group. The IO will be retried next time. - */ - error_out: -- sb->u.ext3_sb.s_block_bitmap_number[bitmap_nr] = block_group; -- sb->u.ext3_sb.s_block_bitmap[bitmap_nr] = bh; -+ EXT3_SB(sb)->s_block_bitmap_number[bitmap_nr] = block_group; -+ EXT3_SB(sb)->s_block_bitmap[bitmap_nr] = bh; - return retval; - } - -@@ -128,16 +128,17 @@ - int i, j, retval = 0; - unsigned long block_bitmap_number; - struct buffer_head * block_bitmap; -+ struct ext3_sb_info *sbi = EXT3_SB(sb); - -- if (block_group >= sb->u.ext3_sb.s_groups_count) -+ if (block_group >= sbi->s_groups_count) - ext3_panic (sb, "load_block_bitmap", - "block_group >= groups_count - " - "block_group = %d, groups_count = %lu", -- block_group, sb->u.ext3_sb.s_groups_count); -+ block_group, EXT3_SB(sb)->s_groups_count); - -- if (sb->u.ext3_sb.s_groups_count <= EXT3_MAX_GROUP_LOADED) { -- if (sb->u.ext3_sb.s_block_bitmap[block_group]) { -- if (sb->u.ext3_sb.s_block_bitmap_number[block_group] == -+ if (sbi->s_groups_count <= EXT3_MAX_GROUP_LOADED) { -+ if (sbi->s_block_bitmap[block_group]) { -+ if (sbi->s_block_bitmap_number[block_group] == - block_group) - return block_group; - ext3_error (sb, "__load_block_bitmap", -@@ -149,21 +150,20 @@ - return block_group; - } - -- for (i = 0; i < sb->u.ext3_sb.s_loaded_block_bitmaps && -- sb->u.ext3_sb.s_block_bitmap_number[i] != block_group; i++) -+ for (i = 0; i < sbi->s_loaded_block_bitmaps && -+ sbi->s_block_bitmap_number[i] != block_group; i++) - ; -- if (i < sb->u.ext3_sb.s_loaded_block_bitmaps && -- sb->u.ext3_sb.s_block_bitmap_number[i] == block_group) { -- block_bitmap_number = sb->u.ext3_sb.s_block_bitmap_number[i]; -- block_bitmap = sb->u.ext3_sb.s_block_bitmap[i]; -+ if (i < sbi->s_loaded_block_bitmaps && -+ sbi->s_block_bitmap_number[i] == block_group) { -+ block_bitmap_number = sbi->s_block_bitmap_number[i]; -+ block_bitmap = sbi->s_block_bitmap[i]; - for (j = i; j > 0; j--) { -- sb->u.ext3_sb.s_block_bitmap_number[j] = -- sb->u.ext3_sb.s_block_bitmap_number[j - 1]; -- sb->u.ext3_sb.s_block_bitmap[j] = -- sb->u.ext3_sb.s_block_bitmap[j - 1]; -+ sbi->s_block_bitmap_number[j] = -+ sbi->s_block_bitmap_number[j - 1]; -+ sbi->s_block_bitmap[j] = sbi->s_block_bitmap[j - 1]; - } -- sb->u.ext3_sb.s_block_bitmap_number[0] = block_bitmap_number; -- sb->u.ext3_sb.s_block_bitmap[0] = block_bitmap; -+ sbi->s_block_bitmap_number[0] = block_bitmap_number; -+ sbi->s_block_bitmap[0] = block_bitmap; - - /* - * There's still one special case here --- if block_bitmap == 0 -@@ -173,17 +173,14 @@ - if (!block_bitmap) - retval = read_block_bitmap (sb, block_group, 0); - } else { -- if (sb->u.ext3_sb.s_loaded_block_bitmaps<EXT3_MAX_GROUP_LOADED) -- sb->u.ext3_sb.s_loaded_block_bitmaps++; -+ if (sbi->s_loaded_block_bitmaps<EXT3_MAX_GROUP_LOADED) -+ sbi->s_loaded_block_bitmaps++; - else -- brelse (sb->u.ext3_sb.s_block_bitmap -- [EXT3_MAX_GROUP_LOADED - 1]); -- for (j = sb->u.ext3_sb.s_loaded_block_bitmaps - 1; -- j > 0; j--) { -- sb->u.ext3_sb.s_block_bitmap_number[j] = -- sb->u.ext3_sb.s_block_bitmap_number[j - 1]; -- sb->u.ext3_sb.s_block_bitmap[j] = -- sb->u.ext3_sb.s_block_bitmap[j - 1]; -+ brelse(sbi->s_block_bitmap[EXT3_MAX_GROUP_LOADED - 1]); -+ for (j = sbi->s_loaded_block_bitmaps - 1; j > 0; j--) { -+ sbi->s_block_bitmap_number[j] = -+ sbi->s_block_bitmap_number[j - 1]; -+ sbi->s_block_bitmap[j] = sbi->s_block_bitmap[j - 1]; - } - retval = read_block_bitmap (sb, block_group, 0); - } -@@ -206,24 +203,25 @@ - static inline int load_block_bitmap (struct super_block * sb, - unsigned int block_group) - { -+ struct ext3_sb_info *sbi = EXT3_SB(sb); - int slot; -- -+ - /* - * Do the lookup for the slot. First of all, check if we're asking - * for the same slot as last time, and did we succeed that last time? - */ -- if (sb->u.ext3_sb.s_loaded_block_bitmaps > 0 && -- sb->u.ext3_sb.s_block_bitmap_number[0] == block_group && -- sb->u.ext3_sb.s_block_bitmap[0]) { -+ if (sbi->s_loaded_block_bitmaps > 0 && -+ sbi->s_block_bitmap_number[0] == block_group && -+ sbi->s_block_bitmap[0]) { - return 0; - } - /* - * Or can we do a fast lookup based on a loaded group on a filesystem - * small enough to be mapped directly into the superblock? - */ -- else if (sb->u.ext3_sb.s_groups_count <= EXT3_MAX_GROUP_LOADED && -- sb->u.ext3_sb.s_block_bitmap_number[block_group]==block_group -- && sb->u.ext3_sb.s_block_bitmap[block_group]) { -+ else if (sbi->s_groups_count <= EXT3_MAX_GROUP_LOADED && -+ sbi->s_block_bitmap_number[block_group] == block_group -+ && sbi->s_block_bitmap[block_group]) { - slot = block_group; - } - /* -@@ -243,7 +241,7 @@ - * If it's a valid slot, we may still have cached a previous IO error, - * in which case the bh in the superblock cache will be zero. - */ -- if (!sb->u.ext3_sb.s_block_bitmap[slot]) -+ if (!sbi->s_block_bitmap[slot]) - return -EIO; - - /* -@@ -275,7 +273,7 @@ - return; - } - lock_super (sb); -- es = sb->u.ext3_sb.s_es; -+ es = EXT3_SB(sb)->s_es; - if (block < le32_to_cpu(es->s_first_data_block) || - block + count < block || - (block + count) > le32_to_cpu(es->s_blocks_count)) { -@@ -305,7 +303,7 @@ - if (bitmap_nr < 0) - goto error_return; - -- bitmap_bh = sb->u.ext3_sb.s_block_bitmap[bitmap_nr]; -+ bitmap_bh = EXT3_SB(sb)->s_block_bitmap[bitmap_nr]; - gdp = ext3_get_group_desc (sb, block_group, &gd_bh); - if (!gdp) - goto error_return; -@@ -330,8 +328,8 @@ - if (err) - goto error_return; - -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "get_write_access"); -- err = ext3_journal_get_write_access(handle, sb->u.ext3_sb.s_sbh); -+ BUFFER_TRACE(EXT3_SB(sb)->s_sbh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); - if (err) - goto error_return; - -@@ -409,8 +407,8 @@ - if (!err) err = ret; - - /* And the superblock */ -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "dirtied superblock"); -- ret = ext3_journal_dirty_metadata(handle, sb->u.ext3_sb.s_sbh); -+ BUFFER_TRACE(EXT3_SB(sb)->s_sbh, "dirtied superblock"); -+ ret = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); - if (!err) err = ret; - - if (overflow && !err) { -@@ -563,12 +561,12 @@ - } - - lock_super (sb); -- es = sb->u.ext3_sb.s_es; -+ es = EXT3_SB(sb)->s_es; - if (le32_to_cpu(es->s_free_blocks_count) <= - le32_to_cpu(es->s_r_blocks_count) && -- ((sb->u.ext3_sb.s_resuid != current->fsuid) && -- (sb->u.ext3_sb.s_resgid == 0 || -- !in_group_p (sb->u.ext3_sb.s_resgid)) && -+ ((EXT3_SB(sb)->s_resuid != current->fsuid) && -+ (EXT3_SB(sb)->s_resgid == 0 || -+ !in_group_p (EXT3_SB(sb)->s_resgid)) && - !capable(CAP_SYS_RESOURCE))) - goto out; - -@@ -598,7 +596,7 @@ - if (bitmap_nr < 0) - goto io_error; - -- bh = sb->u.ext3_sb.s_block_bitmap[bitmap_nr]; -+ bh = EXT3_SB(sb)->s_block_bitmap[bitmap_nr]; - - ext3_debug ("goal is at %d:%d.\n", i, j); - -@@ -621,9 +619,9 @@ - * Now search the rest of the groups. We assume that - * i and gdp correctly point to the last group visited. - */ -- for (k = 0; k < sb->u.ext3_sb.s_groups_count; k++) { -+ for (k = 0; k < EXT3_SB(sb)->s_groups_count; k++) { - i++; -- if (i >= sb->u.ext3_sb.s_groups_count) -+ if (i >= EXT3_SB(sb)->s_groups_count) - i = 0; - gdp = ext3_get_group_desc (sb, i, &bh2); - if (!gdp) { -@@ -635,7 +633,7 @@ - if (bitmap_nr < 0) - goto io_error; - -- bh = sb->u.ext3_sb.s_block_bitmap[bitmap_nr]; -+ bh = EXT3_SB(sb)->s_block_bitmap[bitmap_nr]; - j = find_next_usable_block(-1, bh, - EXT3_BLOCKS_PER_GROUP(sb)); - if (j >= 0) -@@ -673,8 +671,8 @@ - fatal = ext3_journal_get_write_access(handle, bh2); - if (fatal) goto out; - -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "get_write_access"); -- fatal = ext3_journal_get_write_access(handle, sb->u.ext3_sb.s_sbh); -+ BUFFER_TRACE(EXT3_SB(sb)->s_sbh, "get_write_access"); -+ fatal = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); - if (fatal) goto out; - - tmp = j + i * EXT3_BLOCKS_PER_GROUP(sb) -@@ -807,7 +805,7 @@ - if (!fatal) fatal = err; - - BUFFER_TRACE(bh, "journal_dirty_metadata for superblock"); -- err = ext3_journal_dirty_metadata(handle, sb->u.ext3_sb.s_sbh); -+ err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); - if (!fatal) fatal = err; - - sb->s_dirt = 1; -@@ -845,11 +843,11 @@ - int i; - - lock_super (sb); -- es = sb->u.ext3_sb.s_es; -+ es = EXT3_SB(sb)->s_es; - desc_count = 0; - bitmap_count = 0; - gdp = NULL; -- for (i = 0; i < sb->u.ext3_sb.s_groups_count; i++) { -+ for (i = 0; i < EXT3_SB(sb)->s_groups_count; i++) { - gdp = ext3_get_group_desc (sb, i, NULL); - if (!gdp) - continue; -@@ -858,7 +856,7 @@ - if (bitmap_nr < 0) - continue; - -- x = ext3_count_free (sb->u.ext3_sb.s_block_bitmap[bitmap_nr], -+ x = ext3_count_free (EXT3_SB(sb)->s_block_bitmap[bitmap_nr], - sb->s_blocksize); - printk ("group %d: stored = %d, counted = %lu\n", - i, le16_to_cpu(gdp->bg_free_blocks_count), x); -@@ -869,7 +867,7 @@ - unlock_super (sb); - return bitmap_count; - #else -- return le32_to_cpu(sb->u.ext3_sb.s_es->s_free_blocks_count); -+ return le32_to_cpu(EXT3_SB(sb)->s_es->s_free_blocks_count); - #endif - } - -@@ -878,7 +876,7 @@ - unsigned char * map) - { - return ext3_test_bit ((block - -- le32_to_cpu(sb->u.ext3_sb.s_es->s_first_data_block)) % -+ le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block)) % - EXT3_BLOCKS_PER_GROUP(sb), map); - } - -@@ -946,11 +944,11 @@ - struct ext3_group_desc * gdp; - int i; - -- es = sb->u.ext3_sb.s_es; -+ es = EXT3_SB(sb)->s_es; - desc_count = 0; - bitmap_count = 0; - gdp = NULL; -- for (i = 0; i < sb->u.ext3_sb.s_groups_count; i++) { -+ for (i = 0; i < EXT3_SB(sb)->s_groups_count; i++) { - gdp = ext3_get_group_desc (sb, i, NULL); - if (!gdp) - continue; -@@ -984,7 +982,7 @@ - "Inode bitmap for group %d is marked free", - i); - -- for (j = 0; j < sb->u.ext3_sb.s_itb_per_group; j++) -+ for (j = 0; j < EXT3_SB(sb)->s_itb_per_group; j++) - if (!block_in_use (le32_to_cpu(gdp->bg_inode_table) + j, - sb, bh->b_data)) - ext3_error (sb, "ext3_check_blocks_bitmap", -Index: linux-2.4.21-chaos/fs/ext3/dir.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/dir.c 2003-12-12 11:36:13.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/dir.c 2003-12-12 12:50:34.000000000 +0300 -@@ -67,7 +67,7 @@ - else if (((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize) - error_msg = "directory entry across blocks"; - else if (le32_to_cpu(de->inode) > -- le32_to_cpu(dir->i_sb->u.ext3_sb.s_es->s_inodes_count)) -+ le32_to_cpu(EXT3_SB(dir->i_sb)->s_es->s_inodes_count)) - error_msg = "inode out of bounds"; - - if (error_msg != NULL) -Index: linux-2.4.21-chaos/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ialloc.c 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/ialloc.c 2003-12-12 12:53:11.000000000 +0300 -@@ -75,8 +75,8 @@ - * this group. The IO will be retried next time. - */ - error_out: -- sb->u.ext3_sb.s_inode_bitmap_number[bitmap_nr] = block_group; -- sb->u.ext3_sb.s_inode_bitmap[bitmap_nr] = bh; -+ EXT3_SB(sb)->s_inode_bitmap_number[bitmap_nr] = block_group; -+ EXT3_SB(sb)->s_inode_bitmap[bitmap_nr] = bh; - return retval; - } - -@@ -228,7 +228,7 @@ - clear_inode (inode); - - lock_super (sb); -- es = sb->u.ext3_sb.s_es; -+ es = EXT3_SB(sb)->s_es; - if (ino < EXT3_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) { - ext3_error (sb, "ext3_free_inode", - "reserved or nonexistent inode %lu", ino); -@@ -240,7 +240,7 @@ - if (bitmap_nr < 0) - goto error_return; - -- bh = sb->u.ext3_sb.s_inode_bitmap[bitmap_nr]; -+ bh = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]; - - BUFFER_TRACE(bh, "get_write_access"); - fatal = ext3_journal_get_write_access(handle, bh); -@@ -258,8 +258,8 @@ - fatal = ext3_journal_get_write_access(handle, bh2); - if (fatal) goto error_return; - -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "get write access"); -- fatal = ext3_journal_get_write_access(handle, sb->u.ext3_sb.s_sbh); -+ BUFFER_TRACE(EXT3_SB(sb)->s_sbh, "get write access"); -+ fatal = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); - if (fatal) goto error_return; - - if (gdp) { -@@ -274,9 +274,9 @@ - if (!fatal) fatal = err; - es->s_free_inodes_count = - cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) + 1); -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, -+ BUFFER_TRACE(EXT3_SB(sb)->s_sbh, - "call ext3_journal_dirty_metadata"); -- err = ext3_journal_dirty_metadata(handle, sb->u.ext3_sb.s_sbh); -+ err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); - if (!fatal) fatal = err; - } - BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -@@ -307,6 +307,8 @@ - int i, j, avefreei; - struct inode * inode; - int bitmap_nr; -+ struct ext3_inode_info *ei; -+ struct ext3_sb_info *sbi; - struct ext3_group_desc * gdp; - struct ext3_group_desc * tmp; - struct ext3_super_block * es; -@@ -320,19 +322,21 @@ - inode = new_inode(sb); - if (!inode) - return ERR_PTR(-ENOMEM); -- init_rwsem(&inode->u.ext3_i.truncate_sem); -+ sbi = EXT3_SB(sb); -+ ei = EXT3_I(inode); -+ init_rwsem(&ei->truncate_sem); - - lock_super (sb); -- es = sb->u.ext3_sb.s_es; -+ es = sbi->s_es; - repeat: - gdp = NULL; - i = 0; - - if (S_ISDIR(mode)) { - avefreei = le32_to_cpu(es->s_free_inodes_count) / -- sb->u.ext3_sb.s_groups_count; -+ sbi->s_groups_count; - if (!gdp) { -- for (j = 0; j < sb->u.ext3_sb.s_groups_count; j++) { -+ for (j = 0; j < sbi->s_groups_count; j++) { - struct buffer_head *temp_buffer; - tmp = ext3_get_group_desc (sb, j, &temp_buffer); - if (tmp && -@@ -352,7 +356,7 @@ - /* - * Try to place the inode in its parent directory - */ -- i = dir->u.ext3_i.i_block_group; -+ i = EXT3_I(dir)->i_block_group; - tmp = ext3_get_group_desc (sb, i, &bh2); - if (tmp && le16_to_cpu(tmp->bg_free_inodes_count)) - gdp = tmp; -@@ -362,10 +366,10 @@ - * Use a quadratic hash to find a group with a - * free inode - */ -- for (j = 1; j < sb->u.ext3_sb.s_groups_count; j <<= 1) { -+ for (j = 1; j < sbi->s_groups_count; j <<= 1) { - i += j; -- if (i >= sb->u.ext3_sb.s_groups_count) -- i -= sb->u.ext3_sb.s_groups_count; -+ if (i >= sbi->s_groups_count) -+ i -= sbi->s_groups_count; - tmp = ext3_get_group_desc (sb, i, &bh2); - if (tmp && - le16_to_cpu(tmp->bg_free_inodes_count)) { -@@ -378,9 +382,9 @@ - /* - * That failed: try linear search for a free inode - */ -- i = dir->u.ext3_i.i_block_group + 1; -- for (j = 2; j < sb->u.ext3_sb.s_groups_count; j++) { -- if (++i >= sb->u.ext3_sb.s_groups_count) -+ i = EXT3_I(dir)->i_block_group + 1; -+ for (j = 2; j < sbi->s_groups_count; j++) { -+ if (++i >= sbi->s_groups_count) - i = 0; - tmp = ext3_get_group_desc (sb, i, &bh2); - if (tmp && -@@ -401,11 +405,11 @@ - if (bitmap_nr < 0) - goto fail; - -- bh = sb->u.ext3_sb.s_inode_bitmap[bitmap_nr]; -+ bh = sbi->s_inode_bitmap[bitmap_nr]; - - if ((j = ext3_find_first_zero_bit ((unsigned long *) bh->b_data, -- EXT3_INODES_PER_GROUP(sb))) < -- EXT3_INODES_PER_GROUP(sb)) { -+ sbi->s_inodes_per_group)) < -+ sbi->s_inodes_per_group) { - BUFFER_TRACE(bh, "get_write_access"); - err = ext3_journal_get_write_access(handle, bh); - if (err) goto fail; -@@ -459,13 +463,13 @@ - err = ext3_journal_dirty_metadata(handle, bh2); - if (err) goto fail; - -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "get_write_access"); -- err = ext3_journal_get_write_access(handle, sb->u.ext3_sb.s_sbh); -+ BUFFER_TRACE(sbi->s_sbh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, sbi->s_sbh); - if (err) goto fail; - es->s_free_inodes_count = - cpu_to_le32(le32_to_cpu(es->s_free_inodes_count) - 1); -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "call ext3_journal_dirty_metadata"); -- err = ext3_journal_dirty_metadata(handle, sb->u.ext3_sb.s_sbh); -+ BUFFER_TRACE(sbi->s_sbh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, sbi->s_sbh); - sb->s_dirt = 1; - if (err) goto fail; - -@@ -485,35 +489,35 @@ - inode->i_blksize = PAGE_SIZE; - inode->i_blocks = 0; - inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; -- inode->u.ext3_i.i_flags = dir->u.ext3_i.i_flags & ~EXT3_INDEX_FL; -+ ei->i_flags = EXT3_I(dir)->i_flags & ~EXT3_INDEX_FL; - if (S_ISLNK(mode)) -- inode->u.ext3_i.i_flags &= ~(EXT3_IMMUTABLE_FL|EXT3_APPEND_FL); -+ ei->i_flags &= ~(EXT3_IMMUTABLE_FL|EXT3_APPEND_FL); - #ifdef EXT3_FRAGMENTS -- inode->u.ext3_i.i_faddr = 0; -- inode->u.ext3_i.i_frag_no = 0; -- inode->u.ext3_i.i_frag_size = 0; -+ ei->i_faddr = 0; -+ ei->i_frag_no = 0; -+ ei->i_frag_size = 0; - #endif -- inode->u.ext3_i.i_file_acl = 0; -- inode->u.ext3_i.i_dir_acl = 0; -- inode->u.ext3_i.i_dtime = 0; -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ ei->i_file_acl = 0; -+ ei->i_dir_acl = 0; -+ ei->i_dtime = 0; -+ INIT_LIST_HEAD(&ei->i_orphan); - #ifdef EXT3_PREALLOCATE -- inode->u.ext3_i.i_prealloc_count = 0; -+ ei->i_prealloc_count = 0; - #endif -- inode->u.ext3_i.i_block_group = i; -+ ei->i_block_group = i; - - ext3_set_inode_flags(inode); - if (IS_SYNC(inode)) - handle->h_sync = 1; - insert_inode_hash(inode); -- inode->i_generation = sb->u.ext3_sb.s_next_generation++; -+ inode->i_generation = sbi->s_next_generation++; - -- inode->u.ext3_i.i_state = EXT3_STATE_NEW; -+ ei->i_state = EXT3_STATE_NEW; - err = ext3_mark_inode_dirty(handle, inode); - if (err) goto fail; - - #ifdef CONFIG_EXT3_FS_XATTR -- init_rwsem(&inode->u.ext3_i.xattr_sem); -+ init_rwsem(&EXT3_I(inode)->xattr_sem); - #endif - - unlock_super (sb); -@@ -600,19 +604,19 @@ - - unsigned long ext3_count_free_inodes (struct super_block * sb) - { -+ struct ext3_sb_info *sbi = EXT3_SB(sb); -+ struct ext3_super_block *es = sbi->s_es; - #ifdef EXT3FS_DEBUG -- struct ext3_super_block * es; - unsigned long desc_count, bitmap_count, x; - int bitmap_nr; - struct ext3_group_desc * gdp; - int i; - - lock_super (sb); -- es = sb->u.ext3_sb.s_es; - desc_count = 0; - bitmap_count = 0; - gdp = NULL; -- for (i = 0; i < sb->u.ext3_sb.s_groups_count; i++) { -+ for (i = 0; i < sbi->s_groups_count; i++) { - gdp = ext3_get_group_desc (sb, i, NULL); - if (!gdp) - continue; -@@ -621,8 +625,8 @@ - if (bitmap_nr < 0) - continue; - -- x = ext3_count_free (sb->u.ext3_sb.s_inode_bitmap[bitmap_nr], -- EXT3_INODES_PER_GROUP(sb) / 8); -+ x = ext3_count_free(sbi->s_inode_bitmap[bitmap_nr], -+ sbi->s_inodes_per_group / 8); - printk ("group %d: stored = %d, counted = %lu\n", - i, le16_to_cpu(gdp->bg_free_inodes_count), x); - bitmap_count += x; -@@ -632,7 +636,7 @@ - unlock_super (sb); - return desc_count; - #else -- return le32_to_cpu(sb->u.ext3_sb.s_es->s_free_inodes_count); -+ return le32_to_cpu(es->s_free_inodes_count); - #endif - } - -@@ -641,16 +645,18 @@ - void ext3_check_inodes_bitmap (struct super_block * sb) - { - struct ext3_super_block * es; -+ struct ext3_sb_info *sbi; - unsigned long desc_count, bitmap_count, x; - int bitmap_nr; - struct ext3_group_desc * gdp; - int i; - -- es = sb->u.ext3_sb.s_es; -+ sbi = EXT3_SB(sb); -+ es = sbi->s_es; - desc_count = 0; - bitmap_count = 0; - gdp = NULL; -- for (i = 0; i < sb->u.ext3_sb.s_groups_count; i++) { -+ for (i = 0; i < sbi->s_groups_count; i++) { - gdp = ext3_get_group_desc (sb, i, NULL); - if (!gdp) - continue; -@@ -659,7 +665,7 @@ - if (bitmap_nr < 0) - continue; - -- x = ext3_count_free (sb->u.ext3_sb.s_inode_bitmap[bitmap_nr], -+ x = ext3_count_free (sbi->s_inode_bitmap[bitmap_nr], - EXT3_INODES_PER_GROUP(sb) / 8); - if (le16_to_cpu(gdp->bg_free_inodes_count) != x) - ext3_error (sb, "ext3_check_inodes_bitmap", -Index: linux-2.4.21-chaos/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/inode.c 2003-12-05 07:55:47.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/inode.c 2003-12-12 12:55:41.000000000 +0300 -@@ -47,7 +47,7 @@ - */ - static inline int ext3_inode_is_fast_symlink(struct inode *inode) - { -- int ea_blocks = inode->u.ext3_i.i_file_acl ? -+ int ea_blocks = EXT3_I(inode)->i_file_acl ? - (inode->i_sb->s_blocksize >> 9) : 0; - - return (S_ISLNK(inode->i_mode) && -@@ -224,7 +224,7 @@ - * (Well, we could do this if we need to, but heck - it works) - */ - ext3_orphan_del(handle, inode); -- inode->u.ext3_i.i_dtime = CURRENT_TIME; -+ EXT3_I(inode)->i_dtime = CURRENT_TIME; - - /* - * One subtle ordering requirement: if anything has gone wrong -@@ -248,13 +248,14 @@ - void ext3_discard_prealloc (struct inode * inode) - { - #ifdef EXT3_PREALLOCATE -+ struct ext3_inode_info *ei = EXT3_I(inode); - lock_kernel(); - /* Writer: ->i_prealloc* */ -- if (inode->u.ext3_i.i_prealloc_count) { -- unsigned short total = inode->u.ext3_i.i_prealloc_count; -- unsigned long block = inode->u.ext3_i.i_prealloc_block; -- inode->u.ext3_i.i_prealloc_count = 0; -- inode->u.ext3_i.i_prealloc_block = 0; -+ if (ei->i_prealloc_count) { -+ unsigned short total = ei->i_prealloc_count; -+ unsigned long block = ei->i_prealloc_block; -+ ei->i_prealloc_count = 0; -+ ei->i_prealloc_block = 0; - /* Writer: end */ - ext3_free_blocks (inode, block, total); - } -@@ -271,13 +272,15 @@ - unsigned long result; - - #ifdef EXT3_PREALLOCATE -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ - /* Writer: ->i_prealloc* */ -- if (inode->u.ext3_i.i_prealloc_count && -- (goal == inode->u.ext3_i.i_prealloc_block || -- goal + 1 == inode->u.ext3_i.i_prealloc_block)) -+ if (ei->i_prealloc_count && -+ (goal == ei->i_prealloc_block || -+ goal + 1 == ei->i_prealloc_block)) - { -- result = inode->u.ext3_i.i_prealloc_block++; -- inode->u.ext3_i.i_prealloc_count--; -+ result = ei->i_prealloc_block++; -+ ei->i_prealloc_count--; - /* Writer: end */ - ext3_debug ("preallocation hit (%lu/%lu).\n", - ++alloc_hits, ++alloc_attempts); -@@ -287,8 +290,8 @@ - alloc_hits, ++alloc_attempts); - if (S_ISREG(inode->i_mode)) - result = ext3_new_block (inode, goal, -- &inode->u.ext3_i.i_prealloc_count, -- &inode->u.ext3_i.i_prealloc_block, err); -+ &ei->i_prealloc_count, -+ &ei->i_prealloc_block, err); - else - result = ext3_new_block (inode, goal, 0, 0, err); - /* -@@ -422,7 +425,7 @@ - - *err = 0; - /* i_data is not going away, no lock needed */ -- add_chain (chain, NULL, inode->u.ext3_i.i_data + *offsets); -+ add_chain (chain, NULL, EXT3_I(inode)->i_data + *offsets); - if (!p->key) - goto no_block; - while (--depth) { -@@ -466,7 +469,8 @@ - - static inline unsigned long ext3_find_near(struct inode *inode, Indirect *ind) - { -- u32 *start = ind->bh ? (u32*) ind->bh->b_data : inode->u.ext3_i.i_data; -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ u32 *start = ind->bh ? (u32*) ind->bh->b_data : ei->i_data; - u32 *p; - - /* Try to find previous block */ -@@ -482,9 +486,8 @@ - * It is going to be refered from inode itself? OK, just put it into - * the same cylinder group then. - */ -- return (inode->u.ext3_i.i_block_group * -- EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + -- le32_to_cpu(inode->i_sb->u.ext3_sb.s_es->s_first_data_block); -+ return (ei->i_block_group * EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + -+ le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); - } - - /** -@@ -503,14 +506,15 @@ - static int ext3_find_goal(struct inode *inode, long block, Indirect chain[4], - Indirect *partial, unsigned long *goal) - { -+ struct ext3_inode_info *ei = EXT3_I(inode); - /* Writer: ->i_next_alloc* */ -- if (block == inode->u.ext3_i.i_next_alloc_block + 1) { -- inode->u.ext3_i.i_next_alloc_block++; -- inode->u.ext3_i.i_next_alloc_goal++; -+ if (block == ei->i_next_alloc_block + 1) { -+ ei->i_next_alloc_block++; -+ ei->i_next_alloc_goal++; - } - #ifdef SEARCH_FROM_ZERO -- inode->u.ext3_i.i_next_alloc_block = 0; -- inode->u.ext3_i.i_next_alloc_goal = 0; -+ ei->i_next_alloc_block = 0; -+ ei->i_next_alloc_goal = 0; - #endif - /* Writer: end */ - /* Reader: pointers, ->i_next_alloc* */ -@@ -519,8 +523,8 @@ - * try the heuristic for sequential allocation, - * failing that at least try to get decent locality. - */ -- if (block == inode->u.ext3_i.i_next_alloc_block) -- *goal = inode->u.ext3_i.i_next_alloc_goal; -+ if (block == ei->i_next_alloc_block) -+ *goal = ei->i_next_alloc_goal; - if (!*goal) - *goal = ext3_find_near(inode, partial); - #ifdef SEARCH_FROM_ZERO -@@ -646,6 +650,7 @@ - { - int i; - int err = 0; -+ struct ext3_inode_info *ei = EXT3_I(inode); - - /* - * If we're splicing into a [td]indirect block (as opposed to the -@@ -668,11 +673,11 @@ - /* That's it */ - - *where->p = where->key; -- inode->u.ext3_i.i_next_alloc_block = block; -- inode->u.ext3_i.i_next_alloc_goal = le32_to_cpu(where[num-1].key); -+ ei->i_next_alloc_block = block; -+ ei->i_next_alloc_goal = le32_to_cpu(where[num-1].key); - #ifdef SEARCH_FROM_ZERO -- inode->u.ext3_i.i_next_alloc_block = 0; -- inode->u.ext3_i.i_next_alloc_goal = 0; -+ ei->i_next_alloc_block = 0; -+ ei->i_next_alloc_goal = 0; - #endif - /* Writer: end */ - -@@ -756,6 +761,7 @@ - unsigned long goal; - int left; - int depth = ext3_block_to_path(inode, iblock, offsets); -+ struct ext3_inode_info *ei = EXT3_I(inode); - loff_t new_size; - - J_ASSERT(handle != NULL || create == 0); -@@ -809,7 +815,7 @@ - /* - * Block out ext3_truncate while we alter the tree - */ -- down_read(&inode->u.ext3_i.truncate_sem); -+ down_read(&ei->truncate_sem); - err = ext3_alloc_branch(handle, inode, left, goal, - offsets+(partial-chain), partial); - -@@ -821,7 +827,7 @@ - if (!err) - err = ext3_splice_branch(handle, inode, iblock, chain, - partial, left); -- up_read(&inode->u.ext3_i.truncate_sem); -+ up_read(&ei->truncate_sem); - if (err == -EAGAIN) - goto changed; - if (err) -@@ -981,7 +987,7 @@ - struct buffer_head *tmp_bh; - - for (i = 1; -- inode->u.ext3_i.i_prealloc_count && -+ EXT3_I(inode)->i_prealloc_count && - i < EXT3_SB(inode->i_sb)->s_es->s_prealloc_dir_blocks; - i++) { - /* -@@ -1199,8 +1205,8 @@ - kunmap(page); - } - } -- if (inode->i_size > inode->u.ext3_i.i_disksize) { -- inode->u.ext3_i.i_disksize = inode->i_size; -+ if (inode->i_size > EXT3_I(inode)->i_disksize) { -+ EXT3_I(inode)->i_disksize = inode->i_size; - ret2 = ext3_mark_inode_dirty(handle, inode); - if (!ret) - ret = ret2; -@@ -2011,7 +2017,8 @@ - void ext3_truncate(struct inode * inode) - { - handle_t *handle; -- u32 *i_data = inode->u.ext3_i.i_data; -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ u32 *i_data = EXT3_I(inode)->i_data; - int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb); - int offsets[4]; - Indirect chain[4]; -@@ -2072,13 +2079,13 @@ - * on-disk inode. We do this via i_disksize, which is the value which - * ext3 *really* writes onto the disk inode. - */ -- inode->u.ext3_i.i_disksize = inode->i_size; -+ ei->i_disksize = inode->i_size; - - /* - * From here we block out all ext3_get_block() callers who want to - * modify the block allocation tree. - */ -- down_write(&inode->u.ext3_i.truncate_sem); -+ down_write(&ei->truncate_sem); - - if (n == 1) { /* direct blocks */ - ext3_free_data(handle, inode, NULL, i_data+offsets[0], -@@ -2142,7 +2149,7 @@ - case EXT3_TIND_BLOCK: - ; - } -- up_write(&inode->u.ext3_i.truncate_sem); -+ up_write(&ei->truncate_sem); - inode->i_mtime = inode->i_ctime = CURRENT_TIME; - ext3_mark_inode_dirty(handle, inode); - -@@ -2179,6 +2186,8 @@ - - int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc) - { -+ struct super_block *sb = inode->i_sb; -+ struct ext3_sb_info *sbi = EXT3_SB(sb); - struct buffer_head *bh = 0; - unsigned long block; - unsigned long block_group; -@@ -2189,25 +2198,21 @@ - - 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( -- inode->i_sb->u.ext3_sb.s_es->s_inodes_count)) { -- ext3_error (inode->i_sb, "ext3_get_inode_loc", -- "bad inode number: %lu", inode->i_ino); -+ inode->i_ino < EXT3_FIRST_INO(sb)) || -+ inode->i_ino > le32_to_cpu(sbi->s_es->s_inodes_count)) { -+ ext3_error (sb, __FUNCTION__, "bad inode #%lu", inode->i_ino); - goto bad_inode; - } -- block_group = (inode->i_ino - 1) / EXT3_INODES_PER_GROUP(inode->i_sb); -- if (block_group >= inode->i_sb->u.ext3_sb.s_groups_count) { -- ext3_error (inode->i_sb, "ext3_get_inode_loc", -- "group >= groups count"); -+ block_group = (inode->i_ino - 1) / sbi->s_inodes_per_group; -+ if (block_group >= sbi->s_groups_count) { -+ ext3_error(sb, __FUNCTION__, "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 = inode->i_sb->u.ext3_sb.s_group_desc[group_desc]; -+ group_desc = block_group >> sbi->s_desc_per_block_bits; -+ desc = block_group & (sbi->s_desc_per_block - 1); -+ bh = sbi->s_group_desc[group_desc]; - if (!bh) { -- ext3_error (inode->i_sb, "ext3_get_inode_loc", -- "Descriptor not loaded"); -+ ext3_error(sb, __FUNCTION__, "Descriptor not loaded"); - goto bad_inode; - } - -@@ -2215,17 +2220,17 @@ - /* - * 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 = ((inode->i_ino - 1) % sbi->s_inodes_per_group) * -+ sbi->s_inode_size; - 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", -+ (offset >> EXT3_BLOCK_SIZE_BITS(sb)); -+ if (!(bh = sb_bread(sb, block))) { -+ ext3_error (sb, __FUNCTION__, - "unable to read inode block - " - "inode=%lu, block=%lu", inode->i_ino, block); - goto bad_inode; - } -- offset &= (EXT3_BLOCK_SIZE(inode->i_sb) - 1); -+ offset &= (EXT3_BLOCK_SIZE(sb) - 1); - - iloc->bh = bh; - iloc->raw_inode = (struct ext3_inode *) (bh->b_data + offset); -@@ -2239,7 +2244,7 @@ - - void ext3_set_inode_flags(struct inode *inode) - { -- unsigned int flags = inode->u.ext3_i.i_flags; -+ unsigned int flags = EXT3_I(inode)->i_flags; - - inode->i_flags &= ~(S_SYNC|S_APPEND|S_IMMUTABLE|S_NOATIME); - if (flags & EXT3_SYNC_FL) -@@ -2257,6 +2262,7 @@ - { - struct ext3_iloc iloc; - struct ext3_inode *raw_inode; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct buffer_head *bh; - int block; - -@@ -2264,7 +2270,7 @@ - goto bad_inode; - bh = iloc.bh; - raw_inode = iloc.raw_inode; -- init_rwsem(&inode->u.ext3_i.truncate_sem); -+ init_rwsem(&ei->truncate_sem); - inode->i_mode = le16_to_cpu(raw_inode->i_mode); - inode->i_uid = (uid_t)le16_to_cpu(raw_inode->i_uid_low); - inode->i_gid = (gid_t)le16_to_cpu(raw_inode->i_gid_low); -@@ -2277,7 +2283,7 @@ - inode->i_atime = le32_to_cpu(raw_inode->i_atime); - inode->i_ctime = le32_to_cpu(raw_inode->i_ctime); - inode->i_mtime = le32_to_cpu(raw_inode->i_mtime); -- inode->u.ext3_i.i_dtime = le32_to_cpu(raw_inode->i_dtime); -+ ei->i_dtime = le32_to_cpu(raw_inode->i_dtime); - /* We now have enough fields to check if the inode was active or not. - * This is needed because nfsd might try to access dead inodes - * the test is that same one that e2fsck uses -@@ -2285,7 +2291,7 @@ - */ - if (inode->i_nlink == 0) { - if (inode->i_mode == 0 || -- !(inode->i_sb->u.ext3_sb.s_mount_state & EXT3_ORPHAN_FS)) { -+ !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ORPHAN_FS)) { - /* this inode is deleted */ - brelse (bh); - goto bad_inode; -@@ -2300,33 +2306,33 @@ - * size */ - inode->i_blocks = le32_to_cpu(raw_inode->i_blocks); - inode->i_version = ++event; -- inode->u.ext3_i.i_flags = le32_to_cpu(raw_inode->i_flags); -+ ei->i_flags = le32_to_cpu(raw_inode->i_flags); - #ifdef EXT3_FRAGMENTS -- inode->u.ext3_i.i_faddr = le32_to_cpu(raw_inode->i_faddr); -- inode->u.ext3_i.i_frag_no = raw_inode->i_frag; -- inode->u.ext3_i.i_frag_size = raw_inode->i_fsize; -+ ei->i_faddr = le32_to_cpu(raw_inode->i_faddr); -+ ei->i_frag_no = raw_inode->i_frag; -+ ei->i_frag_size = raw_inode->i_fsize; - #endif -- inode->u.ext3_i.i_file_acl = le32_to_cpu(raw_inode->i_file_acl); -+ ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl); - if (!S_ISREG(inode->i_mode)) { -- inode->u.ext3_i.i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl); -+ ei->i_dir_acl = le32_to_cpu(raw_inode->i_dir_acl); - } else { - inode->i_size |= - ((__u64)le32_to_cpu(raw_inode->i_size_high)) << 32; - } -- inode->u.ext3_i.i_disksize = inode->i_size; -+ ei->i_disksize = inode->i_size; - inode->i_generation = le32_to_cpu(raw_inode->i_generation); - #ifdef EXT3_PREALLOCATE -- inode->u.ext3_i.i_prealloc_count = 0; -+ ei->i_prealloc_count = 0; - #endif -- inode->u.ext3_i.i_block_group = iloc.block_group; -+ ei->i_block_group = iloc.block_group; - - /* - * NOTE! The in-memory inode i_data array is in little-endian order - * even on big-endian machines: we do NOT byteswap the block numbers! - */ - for (block = 0; block < EXT3_N_BLOCKS; block++) -- inode->u.ext3_i.i_data[block] = iloc.raw_inode->i_block[block]; -- INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); -+ ei->i_data[block] = iloc.raw_inode->i_block[block]; -+ INIT_LIST_HEAD(&ei->i_orphan); - - if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; -@@ -2350,15 +2356,15 @@ - brelse (iloc.bh); - ext3_set_inode_flags(inode); - #ifdef CONFIG_EXT3_FS_XATTR -- init_rwsem(&inode->u.ext3_i.xattr_sem); -+ init_rwsem(&ei->xattr_sem); - #endif - #ifdef CONFIG_EXT3_FS_POSIX_ACL -- if (inode->u.ext3_i.i_file_acl) { -+ if (ei->i_file_acl) { - /* The filesystem is mounted with ACL support, and there - are extended attributes for this inode. However we do - not yet know whether there are actually any ACLs. */ -- inode->u.ext3_i.i_acl = EXT3_ACL_NOT_CACHED; -- inode->u.ext3_i.i_default_acl = EXT3_ACL_NOT_CACHED; -+ ei->i_acl = EXT3_ACL_NOT_CACHED; -+ ei->i_default_acl = EXT3_ACL_NOT_CACHED; - } - #endif - -@@ -2380,6 +2386,7 @@ - struct ext3_iloc *iloc) - { - struct ext3_inode *raw_inode = iloc->raw_inode; -+ struct ext3_inode_info *ei = EXT3_I(inode); - struct buffer_head *bh = iloc->bh; - int err = 0, rc, block; - -@@ -2397,7 +2404,7 @@ - * Fix up interoperability with old kernels. Otherwise, old inodes get - * re-used with the upper 16 bits of the uid/gid intact - */ -- if(!inode->u.ext3_i.i_dtime) { -+ if(!ei->i_dtime) { - raw_inode->i_uid_high = - cpu_to_le16(high_16_bits(inode->i_uid)); - raw_inode->i_gid_high = -@@ -2415,34 +2422,33 @@ - raw_inode->i_gid_high = 0; - } - raw_inode->i_links_count = cpu_to_le16(inode->i_nlink); -- raw_inode->i_size = cpu_to_le32(inode->u.ext3_i.i_disksize); -+ raw_inode->i_size = cpu_to_le32(ei->i_disksize); - raw_inode->i_atime = cpu_to_le32(inode->i_atime); - raw_inode->i_ctime = cpu_to_le32(inode->i_ctime); - raw_inode->i_mtime = cpu_to_le32(inode->i_mtime); - raw_inode->i_blocks = cpu_to_le32(inode->i_blocks); -- raw_inode->i_dtime = cpu_to_le32(inode->u.ext3_i.i_dtime); -- raw_inode->i_flags = cpu_to_le32(inode->u.ext3_i.i_flags); -+ raw_inode->i_dtime = cpu_to_le32(ei->i_dtime); -+ raw_inode->i_flags = cpu_to_le32(ei->i_flags); - #ifdef EXT3_FRAGMENTS -- raw_inode->i_faddr = cpu_to_le32(inode->u.ext3_i.i_faddr); -- raw_inode->i_frag = inode->u.ext3_i.i_frag_no; -- raw_inode->i_fsize = inode->u.ext3_i.i_frag_size; -+ raw_inode->i_faddr = cpu_to_le32(ei->i_faddr); -+ raw_inode->i_frag = ei->i_frag_no; -+ raw_inode->i_fsize = ei->i_frag_size; - #else - /* If we are not tracking these fields in the in-memory inode, - * then preserve them on disk, but still initialise them to zero - * for new inodes. */ -- if (EXT3_I(inode)->i_state & EXT3_STATE_NEW) { -+ if (ei->i_state & EXT3_STATE_NEW) { - raw_inode->i_faddr = 0; - raw_inode->i_frag = 0; - raw_inode->i_fsize = 0; - } - #endif -- raw_inode->i_file_acl = cpu_to_le32(inode->u.ext3_i.i_file_acl); -+ raw_inode->i_file_acl = cpu_to_le32(ei->i_file_acl); - if (!S_ISREG(inode->i_mode)) { -- raw_inode->i_dir_acl = cpu_to_le32(inode->u.ext3_i.i_dir_acl); -+ raw_inode->i_dir_acl = cpu_to_le32(ei->i_dir_acl); - } else { -- raw_inode->i_size_high = -- cpu_to_le32(inode->u.ext3_i.i_disksize >> 32); -- if (inode->u.ext3_i.i_disksize > 0x7fffffffULL) { -+ raw_inode->i_size_high = cpu_to_le32(ei->i_disksize >> 32); -+ if (ei->i_disksize > MAX_NON_LFS) { - struct super_block *sb = inode->i_sb; - if (!EXT3_HAS_RO_COMPAT_FEATURE(sb, - EXT3_FEATURE_RO_COMPAT_LARGE_FILE) || -@@ -2452,7 +2458,7 @@ - * created, add a flag to the superblock. - */ - err = ext3_journal_get_write_access(handle, -- sb->u.ext3_sb.s_sbh); -+ EXT3_SB(sb)->s_sbh); - if (err) - goto out_brelse; - ext3_update_dynamic_rev(sb); -@@ -2461,7 +2467,7 @@ - sb->s_dirt = 1; - handle->h_sync = 1; - err = ext3_journal_dirty_metadata(handle, -- sb->u.ext3_sb.s_sbh); -+ EXT3_SB(sb)->s_sbh); - } - } - } -@@ -2470,13 +2476,13 @@ - 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] = inode->u.ext3_i.i_data[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) - err = rc; -- EXT3_I(inode)->i_state &= ~EXT3_STATE_NEW; -+ ei->i_state &= ~EXT3_STATE_NEW; - - out_brelse: - brelse (bh); -@@ -2581,7 +2587,7 @@ - } - - error = ext3_orphan_add(handle, inode); -- inode->u.ext3_i.i_disksize = attr->ia_size; -+ EXT3_I(inode)->i_disksize = attr->ia_size; - rc = ext3_mark_inode_dirty(handle, inode); - if (!error) - error = rc; -@@ -2843,9 +2849,9 @@ - */ - - if (val) -- inode->u.ext3_i.i_flags |= EXT3_JOURNAL_DATA_FL; -+ EXT3_I(inode)->i_flags |= EXT3_JOURNAL_DATA_FL; - else -- inode->u.ext3_i.i_flags &= ~EXT3_JOURNAL_DATA_FL; -+ EXT3_I(inode)->i_flags &= ~EXT3_JOURNAL_DATA_FL; - - journal_unlock_updates(journal); - -Index: linux-2.4.21-chaos/fs/ext3/ioctl.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ioctl.c 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/ioctl.c 2003-12-12 12:50:34.000000000 +0300 -@@ -18,13 +18,14 @@ - int ext3_ioctl (struct inode * inode, struct file * filp, unsigned int cmd, - unsigned long arg) - { -+ struct ext3_inode_info *ei = EXT3_I(inode); - unsigned int flags; - - ext3_debug ("cmd = %u, arg = %lu\n", cmd, arg); - - switch (cmd) { - case EXT3_IOC_GETFLAGS: -- flags = inode->u.ext3_i.i_flags & EXT3_FL_USER_VISIBLE; -+ flags = ei->i_flags & EXT3_FL_USER_VISIBLE; - return put_user(flags, (int *) arg); - case EXT3_IOC_SETFLAGS: { - handle_t *handle = NULL; -@@ -42,7 +43,7 @@ - if (get_user(flags, (int *) arg)) - return -EFAULT; - -- oldflags = inode->u.ext3_i.i_flags; -+ oldflags = ei->i_flags; - - /* The JOURNAL_DATA flag is modifiable only by root */ - jflag = flags & EXT3_JOURNAL_DATA_FL; -@@ -79,7 +80,7 @@ - - flags = flags & EXT3_FL_USER_MODIFIABLE; - flags |= oldflags & ~EXT3_FL_USER_MODIFIABLE; -- inode->u.ext3_i.i_flags = flags; -+ ei->i_flags = flags; - - ext3_set_inode_flags(inode); - inode->i_ctime = CURRENT_TIME; -@@ -138,12 +139,12 @@ - int ret = 0; - - set_current_state(TASK_INTERRUPTIBLE); -- add_wait_queue(&sb->u.ext3_sb.ro_wait_queue, &wait); -- if (timer_pending(&sb->u.ext3_sb.turn_ro_timer)) { -+ add_wait_queue(&EXT3_SB(sb)->ro_wait_queue, &wait); -+ if (timer_pending(&EXT3_SB(sb)->turn_ro_timer)) { - schedule(); - ret = 1; - } -- remove_wait_queue(&sb->u.ext3_sb.ro_wait_queue, &wait); -+ remove_wait_queue(&EXT3_SB(sb)->ro_wait_queue, &wait); - return ret; - } - #endif -Index: linux-2.4.21-chaos/fs/ext3/namei.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/namei.c 2003-12-12 11:36:13.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/namei.c 2003-12-12 12:56:27.000000000 +0300 -@@ -343,7 +343,7 @@ - goto fail; - } - hinfo->hash_version = root->info.hash_version; -- hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ hinfo->seed = EXT3_SB(dir->i_sb)->s_hash_seed; - if (dentry) - ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); - hash = hinfo->hash; -@@ -1236,7 +1236,7 @@ - de->rec_len = cpu_to_le16(blocksize - EXT3_DIR_REC_LEN(2)); - memset (&root->info, 0, sizeof(root->info)); - root->info.info_length = sizeof(root->info); -- root->info.hash_version = dir->i_sb->u.ext3_sb.s_def_hash_version; -+ root->info.hash_version = EXT3_SB(dir->i_sb)->s_def_hash_version; - entries = root->entries; - dx_set_block (entries, 1); - dx_set_count (entries, 1); -@@ -1244,7 +1244,7 @@ - - /* Initialize as for dx_probe */ - hinfo.hash_version = root->info.hash_version; -- hinfo.seed = dir->i_sb->u.ext3_sb.s_hash_seed; -+ hinfo.seed = EXT3_SB(dir->i_sb)->s_hash_seed; - ext3fs_dirhash(name, namelen, &hinfo); - frame = frames; - frame->entries = entries; -@@ -1768,8 +1768,8 @@ - J_ASSERT ((S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode)) || inode->i_nlink == 0); - -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "get_write_access"); -- err = ext3_journal_get_write_access(handle, sb->u.ext3_sb.s_sbh); -+ BUFFER_TRACE(EXT3_SB(sb)->s_sbh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); - if (err) - goto out_unlock; - -@@ -1780,7 +1780,7 @@ - /* Insert this inode at the head of the on-disk orphan list... */ - NEXT_ORPHAN(inode) = le32_to_cpu(EXT3_SB(sb)->s_es->s_last_orphan); - EXT3_SB(sb)->s_es->s_last_orphan = cpu_to_le32(inode->i_ino); -- err = ext3_journal_dirty_metadata(handle, sb->u.ext3_sb.s_sbh); -+ err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); - rc = ext3_mark_iloc_dirty(handle, inode, &iloc); - if (!err) - err = rc; -@@ -1854,8 +1854,7 @@ - err = ext3_journal_dirty_metadata(handle, sbi->s_sbh); - } else { - struct ext3_iloc iloc2; -- struct inode *i_prev = -- list_entry(prev, struct inode, u.ext3_i.i_orphan); -+ struct inode *i_prev = orphan_list_entry(prev); - - jbd_debug(4, "orphan inode %lu will point to %lu\n", - i_prev->i_ino, ino_next); -Index: linux-2.4.21-chaos/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/super.c 2003-12-12 12:14:29.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/super.c 2003-12-12 12:50:34.000000000 +0300 -@@ -125,7 +125,7 @@ - /* If no overrides were specified on the mount, then fall back - * to the default behaviour set in the filesystem's superblock - * on disk. */ -- switch (le16_to_cpu(sb->u.ext3_sb.s_es->s_errors)) { -+ switch (le16_to_cpu(EXT3_SB(sb)->s_es->s_errors)) { - case EXT3_ERRORS_PANIC: - return EXT3_ERRORS_PANIC; - case EXT3_ERRORS_RO: -@@ -299,9 +299,9 @@ - return; - - printk (KERN_CRIT "Remounting filesystem read-only\n"); -- sb->u.ext3_sb.s_mount_state |= EXT3_ERROR_FS; -+ EXT3_SB(sb)->s_mount_state |= EXT3_ERROR_FS; - sb->s_flags |= MS_RDONLY; -- sb->u.ext3_sb.s_mount_opt |= EXT3_MOUNT_ABORT; -+ EXT3_SB(sb)->s_mount_opt |= EXT3_MOUNT_ABORT; - journal_abort(EXT3_SB(sb)->s_journal, -EIO); - } - -@@ -407,8 +407,6 @@ - return ret; - } - --#define orphan_list_entry(l) list_entry((l), struct inode, u.ext3_i.i_orphan) -- - static void dump_orphan_list(struct super_block *sb, struct ext3_sb_info *sbi) - { - struct list_head *l; -@@ -889,7 +887,7 @@ - return; - } - -- if (sb->u.ext3_sb.s_mount_state & EXT3_ERROR_FS) { -+ if (EXT3_SB(sb)->s_mount_state & EXT3_ERROR_FS) { - if (es->s_last_orphan) - jbd_debug(1, "Errors on filesystem, " - "clearing orphan list.\n"); -@@ -1571,12 +1569,14 @@ - struct ext3_super_block * es, - int sync) - { -+ struct buffer_head *sbh = EXT3_SB(sb)->s_sbh; -+ - es->s_wtime = cpu_to_le32(CURRENT_TIME); -- BUFFER_TRACE(sb->u.ext3_sb.s_sbh, "marking dirty"); -- mark_buffer_dirty(sb->u.ext3_sb.s_sbh); -+ BUFFER_TRACE(sbh, "marking dirty"); -+ mark_buffer_dirty(sbh); - if (sync) { -- ll_rw_block(WRITE, 1, &sb->u.ext3_sb.s_sbh); -- wait_on_buffer(sb->u.ext3_sb.s_sbh); -+ ll_rw_block(WRITE, 1, &sbh); -+ wait_on_buffer(sbh); - } - } - -@@ -1627,7 +1627,7 @@ - ext3_warning(sb, __FUNCTION__, "Marking fs in need of " - "filesystem check."); - -- sb->u.ext3_sb.s_mount_state |= EXT3_ERROR_FS; -+ EXT3_SB(sb)->s_mount_state |= EXT3_ERROR_FS; - es->s_state |= cpu_to_le16(EXT3_ERROR_FS); - ext3_commit_super (sb, es, 1); - -Index: linux-2.4.21-chaos/fs/ext3/symlink.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/symlink.c 2003-07-15 04:41:01.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/symlink.c 2003-12-12 12:50:34.000000000 +0300 -@@ -24,14 +24,14 @@ - - static int ext3_readlink(struct dentry *dentry, char *buffer, int buflen) - { -- char *s = (char *)dentry->d_inode->u.ext3_i.i_data; -- return vfs_readlink(dentry, buffer, buflen, s); -+ struct ext3_inode_info *ei = EXT3_I(dentry->d_inode); -+ return vfs_readlink(dentry, buffer, buflen, (char *)ei->i_data); - } - - static int ext3_follow_link(struct dentry *dentry, struct nameidata *nd) - { -- char *s = (char *)dentry->d_inode->u.ext3_i.i_data; -- return vfs_follow_link(nd, s); -+ struct ext3_inode_info *ei = EXT3_I(dentry->d_inode); -+ return vfs_follow_link(nd, (char*)ei->i_data); - } - - struct inode_operations ext3_symlink_inode_operations = { -Index: linux-2.4.21-chaos/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs.h 2003-12-12 11:36:14.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs.h 2003-12-12 12:50:34.000000000 +0300 -@@ -87,22 +87,25 @@ - #define EXT3_MIN_BLOCK_SIZE 1024 - #define EXT3_MAX_BLOCK_SIZE 4096 - #define EXT3_MIN_BLOCK_LOG_SIZE 10 -+ - #ifdef __KERNEL__ --# define EXT3_BLOCK_SIZE(s) ((s)->s_blocksize) --#else --# define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) --#endif --#define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) --#ifdef __KERNEL__ --# define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) --#else --# define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) --#endif --#ifdef __KERNEL__ --#define EXT3_ADDR_PER_BLOCK_BITS(s) ((s)->u.ext3_sb.s_addr_per_block_bits) --#define EXT3_INODE_SIZE(s) ((s)->u.ext3_sb.s_inode_size) --#define EXT3_FIRST_INO(s) ((s)->u.ext3_sb.s_first_ino) -+#define EXT3_SB(sb) (&((sb)->u.ext3_sb)) -+#define EXT3_I(inode) (&((inode)->u.ext3_i)) -+ -+#define EXT3_BLOCK_SIZE(s) ((s)->s_blocksize) -+#define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -+#define EXT3_ADDR_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_addr_per_block_bits) -+#define EXT3_INODE_SIZE(s) (EXT3_SB(s)->s_inode_size) -+#define EXT3_FIRST_INO(s) (EXT3_SB(s)->s_first_ino) - #else -+ -+/* Assume that user mode programs are passing in an ext3fs superblock, not -+ * a kernel struct super_block. This will allow us to call the feature-test -+ * macros from user land. */ -+#define EXT3_SB(sb) (sb) -+ -+#define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) -+#define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_log_block_size + 10) - #define EXT3_INODE_SIZE(s) (((s)->s_rev_level == EXT3_GOOD_OLD_REV) ? \ - EXT3_GOOD_OLD_INODE_SIZE : \ - (s)->s_inode_size) -@@ -110,6 +113,7 @@ - EXT3_GOOD_OLD_FIRST_INO : \ - (s)->s_first_ino) - #endif -+#define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) - - /* - * Macro-instructions used to manage fragments -@@ -118,8 +122,8 @@ - #define EXT3_MAX_FRAG_SIZE 4096 - #define EXT3_MIN_FRAG_LOG_SIZE 10 - #ifdef __KERNEL__ --# define EXT3_FRAG_SIZE(s) ((s)->u.ext3_sb.s_frag_size) --# define EXT3_FRAGS_PER_BLOCK(s) ((s)->u.ext3_sb.s_frags_per_block) -+# define EXT3_FRAG_SIZE(s) (EXT3_SB(s)->s_frag_size) -+# define EXT3_FRAGS_PER_BLOCK(s) (EXT3_SB(s)->s_frags_per_block) - #else - # define EXT3_FRAG_SIZE(s) (EXT3_MIN_FRAG_SIZE << (s)->s_log_frag_size) - # define EXT3_FRAGS_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / EXT3_FRAG_SIZE(s)) -@@ -143,15 +147,13 @@ - /* - * Macro-instructions used to manage group descriptors - */ -+# define EXT3_BLOCKS_PER_GROUP(s) (EXT3_SB(s)->s_blocks_per_group) -+# define EXT3_INODES_PER_GROUP(s) (EXT3_SB(s)->s_inodes_per_group) - #ifdef __KERNEL__ --# define EXT3_BLOCKS_PER_GROUP(s) ((s)->u.ext3_sb.s_blocks_per_group) --# define EXT3_DESC_PER_BLOCK(s) ((s)->u.ext3_sb.s_desc_per_block) --# define EXT3_INODES_PER_GROUP(s) ((s)->u.ext3_sb.s_inodes_per_group) --# define EXT3_DESC_PER_BLOCK_BITS(s) ((s)->u.ext3_sb.s_desc_per_block_bits) -+# define EXT3_DESC_PER_BLOCK(s) (EXT3_SB(s)->s_desc_per_block) -+# define EXT3_DESC_PER_BLOCK_BITS(s) (EXT3_SB(s)->s_desc_per_block_bits) - #else --# define EXT3_BLOCKS_PER_GROUP(s) ((s)->s_blocks_per_group) - # define EXT3_DESC_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_group_desc)) --# define EXT3_INODES_PER_GROUP(s) ((s)->s_inodes_per_group) - #endif - - /* -@@ -326,7 +328,7 @@ - #ifndef _LINUX_EXT2_FS_H - #define clear_opt(o, opt) o &= ~EXT3_MOUNT_##opt - #define set_opt(o, opt) o |= EXT3_MOUNT_##opt --#define test_opt(sb, opt) ((sb)->u.ext3_sb.s_mount_opt & \ -+#define test_opt(sb, opt) (EXT3_SB(sb)->s_mount_opt & \ - EXT3_MOUNT_##opt) - #else - #define EXT2_MOUNT_NOLOAD EXT3_MOUNT_NOLOAD -@@ -427,17 +429,11 @@ - __u32 s_reserved[192]; /* Padding to the end of the block */ - }; - --#ifdef __KERNEL__ --#define EXT3_SB(sb) (&((sb)->u.ext3_sb)) --#define EXT3_I(inode) (&((inode)->u.ext3_i)) --#else --/* Assume that user mode programs are passing in an ext3fs superblock, not -- * a kernel struct super_block. This will allow us to call the feature-test -- * macros from user land. */ --#define EXT3_SB(sb) (sb) --#endif -- --#define NEXT_ORPHAN(inode) (inode)->u.ext3_i.i_dtime -+#define NEXT_ORPHAN(inode) EXT3_I(inode)->i_dtime -+static inline struct inode *orphan_list_entry(struct list_head *l) -+{ -+ return list_entry(l, struct inode, u.ext3_i.i_orphan); -+} - - /* - * Codes for operating systems -Index: linux-2.4.21-chaos/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_jbd.h 2003-12-12 11:36:14.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_jbd.h 2003-12-12 12:50:34.000000000 +0300 -@@ -285,7 +285,7 @@ - return 1; - if (test_opt(inode->i_sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA) - return 1; -- if (inode->u.ext3_i.i_flags & EXT3_JOURNAL_DATA_FL) -+ if (EXT3_I(inode)->i_flags & EXT3_JOURNAL_DATA_FL) - return 1; - return 0; - } diff --git a/lustre/kernel_patches/patches/ext3-inode-reuse-2.4.22.patch b/lustre/kernel_patches/patches/ext3-inode-reuse-2.4.22.patch deleted file mode 100644 index 2bbebbf9d8..0000000000 --- a/lustre/kernel_patches/patches/ext3-inode-reuse-2.4.22.patch +++ /dev/null @@ -1,187 +0,0 @@ -Index: linux-2.4.22-ac1/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.22-ac1.orig/fs/ext3/ialloc.c 2003-10-22 14:20:03.000000000 +0400 -+++ linux-2.4.22-ac1/fs/ext3/ialloc.c 2003-10-29 22:32:28.000000000 +0300 -@@ -242,11 +242,16 @@ - - bh = sb->u.ext3_sb.s_inode_bitmap[bitmap_nr]; - -- BUFFER_TRACE(bh, "get_write_access"); -- fatal = ext3_journal_get_write_access(handle, bh); -+ BUFFER_TRACE(bh, "get_undo_access"); -+ fatal = ext3_journal_get_undo_access(handle, bh); - if (fatal) - goto error_return; - -+ /* to prevent inode reusing within single transaction -bzzz */ -+ BUFFER_TRACE(bh, "clear in b_committed_data"); -+ J_ASSERT_BH(bh, bh2jh(bh)->b_committed_data != NULL); -+ ext3_set_bit(bit, bh2jh(bh)->b_committed_data); -+ - /* Ok, now we can actually update the inode bitmaps.. */ - if (!ext3_clear_bit (bit, bh->b_data)) - ext3_error (sb, "ext3_free_inode", -@@ -320,6 +325,43 @@ - return 0; - } - -+static int ext3_test_allocatable(int nr, struct buffer_head *bh) -+{ -+ if (ext3_test_bit(nr, bh->b_data)) -+ return 0; -+ if (!buffer_jbd(bh) || !bh2jh(bh)->b_committed_data) -+ return 1; -+#if 0 -+ if (!ext3_test_bit(nr, bh2jh(bh)->b_committed_data)) -+ printk("EXT3-fs: inode %d was used\n", nr); -+#endif -+ return !ext3_test_bit(nr, bh2jh(bh)->b_committed_data); -+} -+ -+static int ext3_find_usable_inode(struct super_block *sb, -+ struct buffer_head *bh) -+{ -+ int here, maxinodes, next; -+ -+ maxinodes = EXT3_INODES_PER_GROUP(sb); -+ here = 0; -+ -+ while (here < maxinodes) { -+ next = ext3_find_next_zero_bit((unsigned long *) bh->b_data, -+ maxinodes, here); -+ if (next >= maxinodes) -+ return -1; -+ if (ext3_test_allocatable(next, bh)) -+ return next; -+ -+ J_ASSERT_BH(bh, bh2jh(bh)->b_committed_data); -+ here = ext3_find_next_zero_bit -+ ((unsigned long *) bh2jh(bh)->b_committed_data, -+ maxinodes, next); -+ } -+ return -1; -+} -+ - /* - * 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 -@@ -530,7 +572,7 @@ - struct super_block * sb; - struct buffer_head * bh; - struct buffer_head * bh2; -- int group; -+ int group, k; - ino_t ino; - struct inode * inode; - int bitmap_nr; -@@ -569,7 +611,8 @@ - err = ext3_journal_get_write_access(handle, bh); - if (err) goto fail; - -- if (ext3_set_bit(ino, bh->b_data)) { -+ if (!ext3_test_allocatable(ino, bh) || -+ ext3_set_bit(ino, bh->b_data)) { - printk(KERN_ERR "goal inode %lu unavailable\n", goal); - /* Oh well, we tried. */ - goto repeat; -@@ -595,52 +638,63 @@ - group = find_group_other(sb, dir); - - err = -ENOSPC; -- if (!group == -1) -+ if (group == -1) - goto out; - - err = -EIO; -- bitmap_nr = load_inode_bitmap (sb, group); -+ bitmap_nr = load_inode_bitmap(sb, group); - if (bitmap_nr < 0) - goto fail; -- - bh = sb->u.ext3_sb.s_inode_bitmap[bitmap_nr]; -- gdp = ext3_get_group_desc (sb, group, &bh2); - -- if ((ino = ext3_find_first_zero_bit ((unsigned long *) bh->b_data, -- EXT3_INODES_PER_GROUP(sb))) < -- EXT3_INODES_PER_GROUP(sb)) { -- BUFFER_TRACE(bh, "get_write_access"); -- err = ext3_journal_get_write_access(handle, bh); -- if (err) goto fail; -- -- if (ext3_set_bit (ino, bh->b_data)) { -- ext3_error (sb, "ext3_new_inode", -- "bit already set for inode %lu", ino); -- goto repeat; -- } -- BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -- err = ext3_journal_dirty_metadata(handle, bh); -- if (err) goto fail; -- } else { -- if (le16_to_cpu(gdp->bg_free_inodes_count) != 0) { -- ext3_error (sb, "ext3_new_inode", -- "Free inodes count corrupted in group %d", -- group); -- /* Is it really ENOSPC? */ -- err = -ENOSPC; -- if (sb->s_flags & MS_RDONLY) -- goto fail; -- -- BUFFER_TRACE(bh2, "get_write_access"); -- err = ext3_journal_get_write_access(handle, bh2); -- if (err) goto fail; -- gdp->bg_free_inodes_count = 0; -- BUFFER_TRACE(bh2, "call ext3_journal_dirty_metadata"); -- err = ext3_journal_dirty_metadata(handle, bh2); -- if (err) goto fail; -+ /* try to allocate in selected group */ -+ if ((ino = ext3_find_usable_inode(sb, bh)) >= 0) -+ goto find_free; -+ -+ /* can't allocate: try to allocate in ANY another groups */ -+ k = group; -+ gdp = NULL; -+ err = -EIO; -+ for (group = group + 1; group != k; group++) { -+ struct ext3_group_desc *tmp; -+ -+ if (group >= sb->u.ext3_sb.s_groups_count) -+ group = 0; -+ tmp = ext3_get_group_desc(sb, group, &bh2); -+ if (le16_to_cpu(tmp->bg_free_inodes_count) == 0) -+ continue; -+ -+ bitmap_nr = load_inode_bitmap(sb, group); -+ if (bitmap_nr < 0) -+ goto fail; -+ bh = sb->u.ext3_sb.s_inode_bitmap[bitmap_nr]; -+ -+ /* try to allocate in selected group */ -+ if ((ino = ext3_find_usable_inode(sb, bh)) >= 0) { -+ gdp = tmp; -+ break; - } -- goto repeat; - } -+ err = -ENOSPC; -+ if (!gdp) -+ goto out; -+ -+find_free: -+ BUFFER_TRACE(bh, "get_undo_access"); -+ err = ext3_journal_get_undo_access(handle, bh); -+ if (err) -+ goto fail; -+ -+ if (ext3_set_bit(ino, bh->b_data)) { -+ ext3_error (sb, "ext3_new_inode", -+ "bit already set for inode %lu", -+ (unsigned long) ino); -+ goto fail; -+ } -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) -+ goto fail; - - have_bit_and_group: - ino += group * EXT3_INODES_PER_GROUP(sb) + 1; diff --git a/lustre/kernel_patches/patches/ext3-inode-reuse-2.4.20.patch b/lustre/kernel_patches/patches/ext3-inode-reuse-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-inode-reuse-2.4.20.patch rename to lustre/kernel_patches/patches/ext3-inode-reuse-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-inode-reuse-2.6.7.patch b/lustre/kernel_patches/patches/ext3-inode-reuse-2.6.7.patch new file mode 100755 index 0000000000..dd8ab2981e --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-inode-reuse-2.6.7.patch @@ -0,0 +1,120 @@ +Index: linux-2.6.7/fs/ext3/ialloc.c +=================================================================== +--- linux-2.6.7.orig/fs/ext3/ialloc.c 2004-10-05 21:15:58.000000000 +0400 ++++ linux-2.6.7/fs/ext3/ialloc.c 2004-10-06 17:14:39.776562240 +0400 +@@ -144,11 +144,16 @@ + if (!bitmap_bh) + goto error_return; + +- BUFFER_TRACE(bitmap_bh, "get_write_access"); +- fatal = ext3_journal_get_write_access(handle, bitmap_bh); ++ BUFFER_TRACE(bitmap_bh, "get_undo_access"); ++ fatal = ext3_journal_get_undo_access(handle, bitmap_bh, NULL); + if (fatal) + goto error_return; + ++ /* to prevent inode reusing within single transaction -bzzz */ ++ BUFFER_TRACE(bitmap_bh, "clear in b_committed_data"); ++ J_ASSERT_BH(bitmap_bh, bh2jh(bitmap_bh)->b_committed_data != NULL); ++ ext3_set_bit(bit, bh2jh(bitmap_bh)->b_committed_data); ++ + /* Ok, now we can actually update the inode bitmaps.. */ + if (!ext3_clear_bit_atomic(sb_bgl_lock(sbi, block_group), + bit, bitmap_bh->b_data)) +@@ -411,6 +416,16 @@ + } + + /* ++ * this is just to check was block freed in current transaction -bzzz ++ */ ++static int ext3_test_allocatable(int nr, struct buffer_head *bh) ++{ ++ if (!buffer_jbd(bh) || !bh2jh(bh)->b_committed_data) ++ return 1; ++ return !ext3_test_bit(nr, bh2jh(bh)->b_committed_data); ++} ++ ++/* + * 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 +@@ -426,7 +441,7 @@ + struct super_block *sb; + struct buffer_head *bitmap_bh = NULL; + struct buffer_head *bh2; +- int group; ++ int group, credits; + unsigned long ino = 0; + struct inode * inode; + struct ext3_group_desc * gdp = NULL; +@@ -459,16 +474,25 @@ + if (!bitmap_bh) + goto fail; + +- BUFFER_TRACE(bh, "get_write_access"); +- err = ext3_journal_get_write_access(handle, bitmap_bh); ++ BUFFER_TRACE(bh, "get_undo_access"); ++ err = ext3_journal_get_undo_access(handle, bitmap_bh, &credits); + if (err) goto fail; + +- if (ext3_set_bit_atomic(sb_bgl_lock(sbi, group), +- ino, bitmap_bh->b_data)) { ++ if (!ext3_test_allocatable(ino, bitmap_bh) || ++ ext3_set_bit_atomic(sb_bgl_lock(sbi, group), ++ ino, bitmap_bh->b_data)) { + printk(KERN_ERR "goal inode %lu unavailable\n", goal); + /* Oh well, we tried. */ + goto continue_allocation; + } ++ if (!ext3_test_allocatable(ino, bitmap_bh)) { ++ /* in theory it's possible another that thread has ++ * allocated and freed block between test_allocatable() ++ * and set_bit_atomic(). so, we we have to check ++ * this -bzzz */ ++ journal_release_buffer(handle, bitmap_bh, credits); ++ goto continue_allocation; ++ } + + BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); + err = ext3_journal_dirty_metadata(handle, bitmap_bh); +@@ -511,21 +535,29 @@ + int credits = 0; + + BUFFER_TRACE(bitmap_bh, "get_write_access"); +- err = ext3_journal_get_write_access_credits(handle, ++ err = ext3_journal_get_undo_access(handle, + bitmap_bh, &credits); + if (err) + goto fail; + +- if (!ext3_set_bit_atomic(sb_bgl_lock(sbi, group), +- ino, bitmap_bh->b_data)) { +- /* we won it */ +- BUFFER_TRACE(bitmap_bh, +- "call ext3_journal_dirty_metadata"); +- err = ext3_journal_dirty_metadata(handle, +- bitmap_bh); +- if (err) +- goto fail; +- goto got; ++ if (ext3_test_allocatable(ino, bitmap_bh) && ++ !ext3_set_bit_atomic(sb_bgl_lock(sbi, group), ++ ino, bitmap_bh->b_data)) { ++ /* in theory it's possible another that ++ * thread has allocated and freed block ++ * between ext3_test_allocatable() and ++ * set_bit_atomic(). so, we we have to ++ * check this -bzzz */ ++ if (ext3_test_allocatable(ino, bitmap_bh)) { ++ /* we won it */ ++ BUFFER_TRACE(bitmap_bh, ++ "call ext3_journal_dirty_metadata"); ++ err = ext3_journal_dirty_metadata(handle, ++ bitmap_bh); ++ if (err) ++ goto fail; ++ goto got; ++ } + } + /* we lost it */ + journal_release_buffer(handle, bitmap_bh, credits); diff --git a/lustre/kernel_patches/patches/ext3-largefile.patch b/lustre/kernel_patches/patches/ext3-largefile.patch deleted file mode 100644 index aa7a2f25c9..0000000000 --- a/lustre/kernel_patches/patches/ext3-largefile.patch +++ /dev/null @@ -1,16 +0,0 @@ - fs/ext3/inode.c | 2 +- - 1 files changed, 1 insertion(+), 1 deletion(-) - ---- linux-2.4.20/fs/ext3/inode.c~ext3-largefile 2003-04-08 23:35:36.000000000 -0600 -+++ linux-2.4.20-braam/fs/ext3/inode.c 2003-04-08 23:35:36.000000000 -0600 -@@ -2562,7 +2562,7 @@ void ext3_dirty_inode(struct inode *inod - handle_t *handle; - - lock_kernel(); -- handle = ext3_journal_start(inode, 1); -+ handle = ext3_journal_start(inode, 2); - if (IS_ERR(handle)) - goto out; - if (current_handle && - -_ diff --git a/lustre/kernel_patches/patches/ext3-map_inode_page-2.4.21-suse2.patch b/lustre/kernel_patches/patches/ext3-map_inode_page-2.4.21-suse2.patch deleted file mode 100644 index f952079be5..0000000000 --- a/lustre/kernel_patches/patches/ext3-map_inode_page-2.4.21-suse2.patch +++ /dev/null @@ -1,114 +0,0 @@ - - - - fs/ext3/ext3-exports.c | 3 ++ - fs/ext3/inode.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 58 insertions(+) - -Index: linux-2.4.21-suse2/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/inode.c 2004-01-10 15:38:24.000000000 +0300 -+++ linux-2.4.21-suse2/fs/ext3/inode.c 2004-01-10 16:22:45.000000000 +0300 -@@ -3084,7 +3084,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; - -@@ -3105,3 +3105,75 @@ - ret = ret2; - return ret; - } -+ -+/* copied from fs/buffer.c */ -+static void unmap_underlying_metadata(struct buffer_head * bh) -+{ -+ struct buffer_head *old_bh; -+ -+ old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size); -+ if (old_bh) { -+ mark_buffer_clean(old_bh); -+ wait_on_buffer(old_bh); -+ clear_bit(BH_Req, &old_bh->b_state); -+ __brelse(old_bh); -+ } -+} -+ -+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; -+ 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 * blocks_per_page; -+ -+ 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); -+ lock_kernel(); -+ handle = ext3_journal_start(inode, needed_blocks); -+ unlock_kernel(); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ -+ iblock = page->index * blocks_per_page; -+ for (i = 0; i < blocks_per_page; i++, iblock++) { -+ struct buffer_head bh; -+ -+ if (blocks[i] != 0) -+ continue; -+ -+ rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1, 1); -+ if (rc) { -+ printk(KERN_INFO "ext3_map_inode_page: error %d " -+ "allocating block %ld\n", rc, iblock); -+ goto out; -+ } -+ if (buffer_new(&bh)) -+ unmap_underlying_metadata(&bh); -+ blocks[i] = bh.b_blocknr; -+ created[i] = 1; -+ } -+ -+ out: -+ lock_kernel(); -+ ext3_journal_stop(handle, inode); -+ unlock_kernel(); -+ return rc; -+} -Index: linux-2.4.21-suse2/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/ext3-exports.c 2004-01-10 15:38:24.000000000 +0300 -+++ linux-2.4.21-suse2/fs/ext3/ext3-exports.c 2004-01-10 16:22:09.000000000 +0300 -@@ -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); -@@ -19,3 +21,4 @@ - 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.patch b/lustre/kernel_patches/patches/ext3-map_inode_page-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-map_inode_page.patch rename to lustre/kernel_patches/patches/ext3-map_inode_page-2.4.24.patch 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 deleted file mode 100644 index 5c8ba4c44b..0000000000 --- a/lustre/kernel_patches/patches/ext3-map_inode_page_2.4.18.patch +++ /dev/null @@ -1,105 +0,0 @@ - - - - fs/ext3/ext3-exports.c | 3 ++ - fs/ext3/inode.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 58 insertions(+) - -Index: linux-2.4.18-p4smp/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.18-p4smp.orig/fs/ext3/ext3-exports.c Thu Nov 27 22:18:40 2003 -+++ linux-2.4.18-p4smp/fs/ext3/ext3-exports.c Thu Nov 27 22:18:40 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_list); - EXPORT_SYMBOL(ext3_xattr_set); - EXPORT_SYMBOL(ext3_prep_san_write); -+EXPORT_SYMBOL(ext3_map_inode_page); -Index: linux-2.4.18-p4smp/fs/ext3/inode.c -=================================================================== ---- linux-2.4.18-p4smp.orig/fs/ext3/inode.c Thu Nov 27 22:18:40 2003 -+++ linux-2.4.18-p4smp/fs/ext3/inode.c Thu Nov 27 22:20:36 2003 -@@ -3004,3 +3004,75 @@ - ret = ret2; - return ret; - } -+ -+/* copied from fs/buffer.c */ -+static void unmap_underlying_metadata(struct buffer_head * bh) -+{ -+ struct buffer_head *old_bh; -+ -+ old_bh = get_hash_table(bh->b_dev, bh->b_blocknr, bh->b_size); -+ if (old_bh) { -+ mark_buffer_clean(old_bh); -+ wait_on_buffer(old_bh); -+ clear_bit(BH_Req, &old_bh->b_state); -+ __brelse(old_bh); -+ } -+} -+ -+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; -+ 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 * blocks_per_page; -+ -+ 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); -+ lock_kernel(); -+ handle = ext3_journal_start(inode, needed_blocks); -+ unlock_kernel(); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ -+ iblock = page->index * blocks_per_page; -+ for (i = 0; i < blocks_per_page; i++, iblock++) { -+ struct buffer_head bh; -+ -+ if (blocks[i] != 0) -+ continue; -+ -+ rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1); -+ if (rc) { -+ printk(KERN_INFO "ext3_map_inode_page: error %d " -+ "allocating block %ld\n", rc, iblock); -+ goto out; -+ } -+ if (buffer_new(&bh)) -+ unmap_underlying_metadata(&bh); -+ blocks[i] = bh.b_blocknr; -+ created[i] = 1; -+ } -+ -+ out: -+ lock_kernel(); -+ ext3_journal_stop(handle, inode); -+ unlock_kernel(); -+ return rc; -+} diff --git a/lustre/kernel_patches/patches/ext3-mballoc-2.4.21-suse2.patch b/lustre/kernel_patches/patches/ext3-mballoc-2.4.21-suse2.patch deleted file mode 100644 index d9196dd38c..0000000000 --- a/lustre/kernel_patches/patches/ext3-mballoc-2.4.21-suse2.patch +++ /dev/null @@ -1,373 +0,0 @@ -Index: linux-2.4.21-suse2/fs/ext3/balloc.c -=================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/balloc.c 2003-06-13 18:51:37.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/balloc.c 2004-02-06 11:07:16.000000000 +0300 -@@ -11,6 +11,7 @@ - * David S. Miller (davem@caip.rutgers.edu), 1995 - */ - -+#include <linux/module.h> - #include <linux/config.h> - #include <linux/sched.h> - #include <linux/fs.h> -@@ -1007,3 +1008,303 @@ - bitmap_count); - } - #endif -+ -+#define MBDEBUG_ -+#ifdef MBDEBUG -+#define mbdebug(fmt,a...) printk(fmt, ##a) -+#else -+#define mbdebug(fmt,a...) -+#endif -+ -+/* -+ * in alloc_status we track allocation: the best found extent, how many -+ * extents we've skipped, etc -+ */ -+struct alloc_status { -+ struct inode *inode; -+ struct super_block *sb; -+ int goal; /* goal for allocation */ -+ int target_len; /* goal for len */ -+ int start, len; /* the best found extent */ -+ int num; /* number of extent: to limit searching */ -+}; -+ -+/* -+ * ext3_test_extent() compares requested extent with existing in as. -+ * if requested extent is better than that, then replace old one. -+ * then it tries to understand is new extent suitable or not -+ * return 1 if caller can complete searching -+ */ -+inline int ext3_test_extent(struct alloc_status *as, int group, -+ int start, int len) -+{ -+ struct ext3_super_block * es = EXT3_SB(as->sb)->s_es; -+ unsigned long tmp; -+ -+ J_ASSERT(as->target_len >= len); -+ -+ mbdebug("found extent %d:%d\n", start, len); -+ tmp = start + group * EXT3_BLOCKS_PER_GROUP(as->sb) -+ + le32_to_cpu(es->s_first_data_block); -+ -+ /* account requests in order to limit searching */ -+ as->num++; -+ -+ if (as->num == 20) -+ return 1; -+ -+ /* if hit goal, then searching may complete right now */ -+ if (tmp == as->goal) { -+nice: -+ as->start = tmp; -+ as->len = len; -+ return 1; -+ } -+ -+ /* if found extent has length we need, return it right now */ -+ if (as->target_len == len) -+ goto nice; -+ -+ /* first, check is found extent better than we have in as */ -+ if (as->len > len) { -+better: -+ as->start = tmp; -+ as->len = len; -+ return 0; -+ } -+ -+ /* FIXME: more checks! */ -+ as->start = tmp; -+ as->len = len; -+ -+ /* 1) closeness to goal */ -+ -+ /* 2) extent length */ -+ /* 3) number of tested extent (we check all found extents) */ -+ /* */ -+ return 0; -+} -+ -+/* -+ * this routine tries to find upto *len free contig. blocks -+ * return number of found block (+ length of extent in *len) -+ * or -1 if no free blocks at all -+ */ -+int ext3_find_free_extent(struct buffer_head *bh, int goal, int *len, int max) -+{ -+ int i, l = 0; -+ -+repeat: -+ if (goal >= max) -+ return -1; -+ /* find first free block */ -+ i = ext3_find_next_zero_bit(bh->b_data, max, goal); -+ if (i >= max) { -+ /* no free block */ -+ return -1; -+ } -+ /* check upto len block for ability to be allocated */ -+ while (l < *len && i + l < max) { -+ if (!ext3_test_allocatable(i + l, bh)) -+ break; -+ l++; -+ } -+ if (l == 0) { -+ goal = i + 1; -+ goto repeat; -+ } -+ *len = l; -+ return i; -+} -+ -+/* -+ * this routine loops over group, finds free extents and tests them -+ * for some criterias -+ * it may return negative value if group can't be loaded, 0 - if -+ * no good extent can be found, 1 - if good extent found -+ */ -+int ext3_find_extent_in_group(struct alloc_status *as, int group, -+ unsigned long goal, int len) -+{ -+ int k, i, l, bitmap_nr, found = 0; -+ struct super_block *sb = as->sb; -+ int max = EXT3_BLOCKS_PER_GROUP(sb); -+ struct buffer_head *bh, *bmbh; -+ struct ext3_group_desc *gdp; -+ -+ mbdebug("look for %d blocks in group %d starting from %lu\n", -+ len, group, goal); -+ -+ gdp = ext3_get_group_desc(as->sb, group, &bh); -+ if (!gdp) -+ return -EIO; -+ -+ if (le16_to_cpu(gdp->bg_free_blocks_count) == 0) -+ return 0; -+ -+ bitmap_nr = load_block_bitmap(as->sb, group); -+ if (bitmap_nr < 0) -+ return -EIO; -+ -+ bmbh = EXT3_SB(sb)->s_block_bitmap[bitmap_nr]; -+ -+ i = goal; -+ /* scan from goal to the end */ -+repeat: -+ while (i < max) { -+ l = len; -+ k = ext3_find_free_extent(bmbh, i, &l, max); -+ i = k + l; -+ if (k < 0) -+ break; -+ if (ext3_test_extent(as, group, k, l)) { -+ found = 1; -+ goto out; -+ } -+ } -+ -+ if (goal) { -+ /* scan from 0 upto goal */ -+ mbdebug("repeat from %lu in %d\n", goal, group); -+ max = goal - 1; -+ goal = i = 0; -+ goto repeat; -+ } -+out: -+ return found; -+} -+ -+#define check_in_committed(bh,j) \ -+ J_ASSERT_BH((bh), !ext3_test_bit((j), bh2jh((bh))->b_committed_data)) -+ -+int ext3_new_blocks(handle_t *handle, struct inode *inode, int *num, -+ unsigned long goal, int *errp) -+{ -+ struct super_block *sb = inode->i_sb; -+ int first_group, group, bitmap_nr; -+ struct buffer_head *bh, *bmbh; -+ struct ext3_super_block *es; -+ struct ext3_group_desc *gdp; -+ struct alloc_status as; -+ int err, bit, i; -+ -+ J_ASSERT(num && *num > 0); -+ -+ if (DQUOT_ALLOC_BLOCK(inode, *num)) { -+ *errp = -EDQUOT; -+ return 0; -+ } -+ -+ es = EXT3_SB(inode->i_sb)->s_es; -+ -+ *errp = 0; -+ as.target_len = *num; -+ as.sb = sb; -+ as.inode = inode; -+ as.goal = goal; -+ as.start = -1; -+ as.len = 0; -+ as.num = 0; -+ -+ if (goal < le32_to_cpu(es->s_first_data_block) || -+ goal >= le32_to_cpu(es->s_blocks_count)) -+ goal = le32_to_cpu(es->s_first_data_block); -+ -+ lock_super(sb); -+ first_group = (goal - le32_to_cpu(es->s_first_data_block)) / -+ EXT3_BLOCKS_PER_GROUP(sb); -+ goal = (goal - le32_to_cpu(es->s_first_data_block)) % -+ EXT3_BLOCKS_PER_GROUP(sb); -+ group = first_group; -+ do { -+ err = ext3_find_extent_in_group(&as, group, goal, *num); -+ if (err < 0) -+ goto error_out; -+ else if (err) -+ break; -+ -+ /* reset goal for next groups */ -+ goal = 0; -+ -+ /* try next group */ -+ if (++group == EXT3_SB(sb)->s_groups_count) -+ group = 0; -+ } while (group != first_group); -+ -+ if (as.len == 0) { -+ err = -ENOSPC; -+ goto error_out; -+ } -+ -+ /* in the end we've found something, allocate it */ -+ mbdebug("best extent: %u:%u\n", as.start, as.len); -+ -+ group = (as.start - le32_to_cpu(es->s_first_data_block)) / -+ EXT3_BLOCKS_PER_GROUP(sb); -+ bit = (as.start - le32_to_cpu(es->s_first_data_block)) % -+ EXT3_BLOCKS_PER_GROUP(sb); -+ gdp = ext3_get_group_desc(sb, group, &bh); -+ if (!gdp) { -+ err = -EIO; -+ goto error_out; -+ } -+ -+ /* mark block(s) used in bitmap ... */ -+ bitmap_nr = load_block_bitmap(sb, group); -+ if (bitmap_nr < 0) { -+ err = -EIO; -+ goto error_out; -+ } -+ bmbh = EXT3_SB(sb)->s_block_bitmap[bitmap_nr]; -+ /* 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. */ -+ err = ext3_journal_get_undo_access(handle, bmbh); -+ if (err) -+ goto error_out; -+ err = ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+ if (err) -+ goto error_out; -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) -+ goto error_out; -+ for (i = 0; i < as.len; i++) { -+ J_ASSERT(!ext3_test_bit(bit + i, bmbh->b_data)); -+ if (buffer_jbd(bmbh) && bh2jh(bmbh)->b_committed_data) -+ check_in_committed(bmbh, bit + i); -+ set_bit(bit + i, bmbh->b_data); -+ } -+ err = ext3_journal_dirty_metadata(handle, bmbh); -+ if (err) -+ goto error_out; -+ -+ /* ... and correct group descriptor */ -+ gdp->bg_free_blocks_count = -+ cpu_to_le16(le16_to_cpu(gdp->bg_free_blocks_count) - as.len); -+ es->s_free_blocks_count = -+ cpu_to_le32(le32_to_cpu(es->s_free_blocks_count) - as.len); -+ err = ext3_journal_dirty_metadata(handle, bmbh); -+ if (err) -+ goto error_out; -+ err = ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ if (err) -+ goto error_out; -+ sb->s_dirt = 1; -+ -+ if (*num != as.len) -+ DQUOT_FREE_BLOCK(inode, *num - as.len); -+ *num = as.len; -+ -+out: -+ unlock_super(sb); -+ return as.start; -+ -+error_out: -+ as.start = 0; -+ *errp = err; -+ goto out; -+} -+ -+EXPORT_SYMBOL(ext3_new_blocks); -+ -Index: linux-2.4.21-suse2/fs/ext3/file.c -=================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/file.c 2004-02-05 20:42:39.000000000 +0300 -+++ linux-2.4.21-suse2/fs/ext3/file.c 2004-02-06 10:19:59.000000000 +0300 -@@ -70,6 +70,18 @@ - int ret, err; - struct inode *inode = file->f_dentry->d_inode; - -+#if 0 -+ /* allocate all the space to be written */ -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) { -+ int blocksize = inode->i_sb->s_blocksize; -+ unsigned long start, end; -+ -+ start = (unsigned long) *ppos / blocksize; -+ end = ((unsigned long) *ppos + count + blocksize - 1) -+ / blocksize; -+ ext3_ext_allocate_nblocks(inode, start, end - start); -+ } -+#endif - ret = generic_file_write(file, buf, count, ppos); - - /* Skip file flushing code if there was an error, or if nothing -Index: linux-2.4.21-suse2/fs/ext3/Makefile -=================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/Makefile 2004-02-05 20:43:47.000000000 +0300 -+++ linux-2.4.21-suse2/fs/ext3/Makefile 2004-02-06 10:19:59.000000000 +0300 -@@ -14,7 +14,7 @@ - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ - extents.o --export-objs += extents.o -+export-objs += extents.o balloc.o - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.21-suse2/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-suse2.orig/include/linux/ext3_fs.h 2004-02-05 20:42:40.000000000 +0300 -+++ linux-2.4.21-suse2/include/linux/ext3_fs.h 2004-02-06 10:19:59.000000000 +0300 -@@ -58,6 +58,8 @@ - #define ext3_debug(f, a...) do {} while (0) - #endif - -+#define EXT3_MULTIBLOCK_ALLOCATOR 1 -+ - /* - * Special inodes numbers - */ -@@ -668,6 +670,7 @@ - extern struct ext3_group_desc * ext3_get_group_desc(struct super_block * sb, - unsigned int block_group, - struct buffer_head ** bh); -+extern int ext3_new_blocks(handle_t*, struct inode*, int*, unsigned long, int*); - - /* dir.c */ - extern int ext3_check_dir_entry(const char *, struct inode *, diff --git a/lustre/kernel_patches/patches/ext3-mds-num-2.4.21-suse.patch b/lustre/kernel_patches/patches/ext3-mds-num-2.6.7.patch old mode 100644 new mode 100755 similarity index 60% rename from lustre/kernel_patches/patches/ext3-mds-num-2.4.21-suse.patch rename to lustre/kernel_patches/patches/ext3-mds-num-2.6.7.patch index 4a803386fd..f61c9d9b08 --- a/lustre/kernel_patches/patches/ext3-mds-num-2.4.21-suse.patch +++ b/lustre/kernel_patches/patches/ext3-mds-num-2.6.7.patch @@ -1,41 +1,49 @@ -Index: linux-2.4.21-suse2/fs/ext3/namei.c +Index: linux-2.6.7/fs/ext3/namei.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/namei.c 2004-09-12 18:26:52.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/namei.c 2004-09-12 18:27:04.000000000 +0400 -@@ -1100,6 +1100,23 @@ +--- linux-2.6.7.orig/fs/ext3/namei.c 2004-09-12 18:53:33.000000000 +0400 ++++ linux-2.6.7/fs/ext3/namei.c 2004-09-12 19:14:37.000000000 +0400 +@@ -24,6 +24,7 @@ + * Theodore Ts'o, 2002 + */ + ++#include <linux/module.h> + #include <linux/fs.h> + #include <linux/pagemap.h> + #include <linux/jbd.h> +@@ -1150,6 +1151,23 @@ inode = NULL; if (bh) { unsigned long ino = le32_to_cpu(de->inode); -+ unsigned type = de->file_type; -+ __u32 *mds; -+ mds = (__u32 *)((char *) de + EXT3_DIR_REC_LEN(de->name_len)); -+ if ((type & 128) && EXT3_HAS_INCOMPAT_FEATURE(dir->i_sb, -+ EXT3_FEATURE_INCOMPAT_MDSNUM) && -+ mds[0] != EXT3_SB(dir->i_sb)->s_mdsnum) { -+ struct ext3_super_block *es; -+ es = EXT3_SB(dir->i_sb)->s_es; ++ unsigned type = de->file_type; ++ __u32 *mds; ++ mds = (__u32 *)((char *) de + EXT3_DIR_REC_LEN(de->name_len)); ++ if ((type & 128) && EXT3_HAS_INCOMPAT_FEATURE(dir->i_sb, ++ EXT3_FEATURE_INCOMPAT_MDSNUM) && ++ mds[0] != EXT3_SB(dir->i_sb)->s_mdsnum) { ++ struct ext3_super_block *es; ++ es = EXT3_SB(dir->i_sb)->s_es; ++ brelse (bh); ++ dentry->d_flags |= DCACHE_CROSS_REF; ++ dentry->d_generation = mds[1]; ++ dentry->d_mdsnum = mds[0]; ++ dentry->d_inum = ino; + ext3_unlock_htree(dir, lock); -+ brelse (bh); -+ dentry->d_flags |= DCACHE_CROSS_REF; -+ dentry->d_generation = mds[1]; -+ dentry->d_mdsnum = mds[0]; -+ dentry->d_inum = ino; -+ d_add(dentry, NULL); -+ return NULL; -+ } ++ d_add(dentry, NULL); ++ return NULL; ++ } ext3_unlock_htree(dir, lock); brelse (bh); inode = iget(dir->i_sb, ino); -@@ -1139,7 +1156,7 @@ +@@ -1223,7 +1241,7 @@ while (count--) { struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); - rec_len = EXT3_DIR_REC_LEN(de->name_len); + rec_len = EXT3_DIR_REC_LEN_DE(de); memcpy (to, de, rec_len); - ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len); - de->inode = 0; -@@ -1160,7 +1177,7 @@ + ((struct ext3_dir_entry_2 *) to)->rec_len = + cpu_to_le16(rec_len); +@@ -1245,7 +1263,7 @@ next = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); if (de->inode && de->name_len) { @@ -44,7 +52,7 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c if (de > to) memmove(to, de, rec_len); to->rec_len = cpu_to_le16(rec_len); -@@ -1276,6 +1293,7 @@ +@@ -1361,6 +1379,7 @@ struct buffer_head * bh) { struct inode *dir = dentry->d_parent->d_inode; @@ -52,9 +60,9 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c const char *name = dentry->d_name.name; int namelen = dentry->d_name.len; unsigned long offset = 0; -@@ -1284,6 +1302,10 @@ +@@ -1369,6 +1388,10 @@ char *top; - + reclen = EXT3_DIR_REC_LEN(namelen); + if (EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_MDSNUM) + && (dentry->d_flags & DCACHE_CROSS_REF) @@ -63,7 +71,7 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c if (!de) { de = (struct ext3_dir_entry_2 *)bh->b_data; top = bh->b_data + dir->i_sb->s_blocksize - reclen; -@@ -1297,7 +1319,7 @@ +@@ -1382,7 +1405,7 @@ brelse (bh); return -EEXIST; } @@ -72,16 +80,16 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c rlen = le16_to_cpu(de->rec_len); if ((de->inode? rlen - nlen: rlen) >= reclen) break; -@@ -1316,7 +1338,7 @@ +@@ -1401,7 +1424,7 @@ } - + /* By now the buffer is marked for journaling */ - nlen = EXT3_DIR_REC_LEN(de->name_len); + nlen = EXT3_DIR_REC_LEN_DE(de); rlen = le16_to_cpu(de->rec_len); if (de->inode) { struct ext3_dir_entry_2 *de1 = -@@ -1328,8 +1350,20 @@ +@@ -1413,8 +1436,20 @@ de->file_type = EXT3_FT_UNKNOWN; if (inode) { de->inode = cpu_to_le32(inode->i_ino); @@ -104,7 +112,7 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c de->inode = 0; de->name_len = namelen; memcpy (de->name, name, namelen); -@@ -2630,6 +2664,79 @@ +@@ -2721,6 +2756,81 @@ } /* @@ -126,10 +134,10 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c + handle->h_sync = 1; + + err = ext3_add_entry(handle, dentry, NULL); -+ ext3_journal_stop(handle, dir); ++ ext3_journal_stop(handle); + return err; +} -+ ++EXPORT_SYMBOL(ext3_add_dir_entry); +/* + * caller has to make sure directory is protected + */ @@ -140,8 +148,8 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c + struct buffer_head * bh; + struct ext3_dir_entry_2 * de; + handle_t *handle; -+ void *lock; + int retval; ++ void *lock = NULL; + + handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); + if (IS_ERR(handle)) { @@ -153,6 +161,7 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c + + retval = -ENOENT; + bh = ext3_find_entry (dentry, &de, 1, &lock); ++ ext3_unlock_htree(dir, lock); + if (!bh) + goto end_unlink; + @@ -161,7 +170,6 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c + DQUOT_INIT(inode); + + retval = ext3_delete_entry(handle, dir, de, bh); -+ ext3_unlock_htree(dir, lock); + if (retval) + goto end_unlink; + dir->i_ctime = dir->i_mtime = CURRENT_TIME; @@ -176,19 +184,21 @@ Index: linux-2.4.21-suse2/fs/ext3/namei.c + retval = 0; + +end_unlink: -+ ext3_journal_stop(handle, dir); ++ ext3_journal_stop(handle); + brelse (bh); + return retval; +} ++ ++EXPORT_SYMBOL(ext3_del_dir_entry); +/* * directories can handle most operations... */ struct inode_operations ext3_dir_inode_operations = { -Index: linux-2.4.21-suse2/fs/ext3/dir.c +Index: linux-2.6.7/fs/ext3/dir.c =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/dir.c 2004-08-19 13:45:02.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/dir.c 2004-09-12 18:27:04.000000000 +0400 -@@ -42,6 +42,9 @@ +--- linux-2.6.7.orig/fs/ext3/dir.c 2004-08-26 17:11:31.000000000 +0400 ++++ linux-2.6.7/fs/ext3/dir.c 2004-09-12 19:14:37.000000000 +0400 +@@ -53,6 +53,9 @@ static unsigned char get_dtype(struct super_block *sb, int filetype) { @@ -198,63 +208,46 @@ Index: linux-2.4.21-suse2/fs/ext3/dir.c if (!EXT3_HAS_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_FILETYPE) || (filetype >= EXT3_FT_MAX)) return DT_UNKNOWN; -@@ -67,8 +70,10 @@ - else if (((char *) de - bh->b_data) + rlen > dir->i_sb->s_blocksize) +@@ -79,7 +82,8 @@ error_msg = "directory entry across blocks"; else if (le32_to_cpu(de->inode) > -- le32_to_cpu(dir->i_sb->u.ext3_sb.s_es->s_inodes_count)) + le32_to_cpu(EXT3_SB(dir->i_sb)->s_es->s_inodes_count)) - error_msg = "inode out of bounds"; -+ le32_to_cpu(dir->i_sb->u.ext3_sb.s_es->s_inodes_count)) { + if (de->file_type != 128) + error_msg = "inode out of bounds"; -+ } if (error_msg != NULL) ext3_error (dir->i_sb, function, -Index: linux-2.4.21-suse2/fs/ext3/ext3-exports.c +Index: linux-2.6.7/include/linux/ext3_fs.h =================================================================== ---- linux-2.4.21-suse2.orig/fs/ext3/ext3-exports.c 2004-08-19 13:45:03.000000000 +0400 -+++ linux-2.4.21-suse2/fs/ext3/ext3-exports.c 2004-09-12 18:27:04.000000000 +0400 -@@ -27,3 +27,10 @@ - EXPORT_SYMBOL(ext3_decode_error); - EXPORT_SYMBOL(__ext3_std_error); - -+int ext3_add_dir_entry (struct dentry *dentry); -+EXPORT_SYMBOL(ext3_add_dir_entry); -+int ext3_del_dir_entry(struct dentry *dentry); -+EXPORT_SYMBOL(ext3_del_dir_entry); -+ -+ -+ -Index: linux-2.4.21-suse2/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-suse2.orig/include/linux/ext3_fs.h 2004-09-12 18:26:52.000000000 +0400 -+++ linux-2.4.21-suse2/include/linux/ext3_fs.h 2004-09-12 18:28:01.000000000 +0400 -@@ -438,7 +438,8 @@ - __u8 s_def_hash_version; /* Default hash version to use */ - __u8 s_reserved_char_pad; +--- linux-2.6.7.orig/include/linux/ext3_fs.h 2004-09-12 19:14:24.000000000 +0400 ++++ linux-2.6.7/include/linux/ext3_fs.h 2004-09-12 19:15:12.000000000 +0400 +@@ -452,7 +452,8 @@ __u16 s_reserved_word_pad; -- __u32 s_reserved[192]; /* Padding to the end of the block */ -+ __u32 s_mdsnum; -+ __u32 s_reserved[191]; /* Padding to the end of the block */ + __u32 s_default_mount_opts; + __u32 s_first_meta_bg; /* First metablock block group */ +- __u32 s_reserved[190]; /* Padding to the end of the block */ ++ __u32 s_mdsnum; ++ __u32 s_reserved[189]; /* Padding to the end of the block */ }; #ifdef __KERNEL__ -@@ -511,11 +512,13 @@ - #define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002 +@@ -532,12 +533,14 @@ #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ + #define EXT3_FEATURE_INCOMPAT_META_BG 0x0010 +#define EXT3_FEATURE_INCOMPAT_MDSNUM 0x0020 /* direntry has mdsnum */ #define EXT3_FEATURE_INCOMPAT_EXTENTS 0x0040 /* extents support */ #define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ EXT3_FEATURE_INCOMPAT_RECOVER| \ + EXT3_FEATURE_INCOMPAT_META_BG| \ + EXT3_FEATURE_INCOMPAT_MDSNUM| \ EXT3_FEATURE_INCOMPAT_EXTENTS) #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -577,6 +580,9 @@ +@@ -612,6 +615,9 @@ #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ ~EXT3_DIR_ROUND) @@ -264,37 +257,25 @@ Index: linux-2.4.21-suse2/include/linux/ext3_fs.h /* * Hash Tree Directory indexing * (c) Daniel Phillips, 2001 -Index: linux-2.4.21-suse2/include/linux/ext3_fs_sb.h +@@ -827,6 +833,9 @@ + extern void ext3_ext_release(struct super_block *); + extern void ext3_extents_initialize_blockmap(handle_t *, struct inode *); + ++extern int ext3_add_dir_entry(struct dentry *dentry); ++ ++extern int ext3_del_dir_entry(struct dentry *dentry); + #endif /* __KERNEL__ */ + + #define EXT3_IOC_CREATE_INUM _IOW('f', 5, long) +Index: linux-2.6.7/include/linux/ext3_fs_sb.h =================================================================== ---- linux-2.4.21-suse2.orig/include/linux/ext3_fs_sb.h 2004-08-19 14:01:33.000000000 +0400 -+++ linux-2.4.21-suse2/include/linux/ext3_fs_sb.h 2004-09-12 18:27:04.000000000 +0400 -@@ -86,6 +86,7 @@ - wait_queue_head_t s_delete_thread_queue; - wait_queue_head_t s_delete_waiter_queue; +--- linux-2.6.7.orig/include/linux/ext3_fs_sb.h 2004-09-12 18:53:33.000000000 +0400 ++++ linux-2.6.7/include/linux/ext3_fs_sb.h 2004-09-12 19:14:37.000000000 +0400 +@@ -76,6 +76,7 @@ + char *s_qf_names[MAXQUOTAS]; /* Names of quota files with journalled quota */ + int s_jquota_fmt; /* Format of quota to use */ #endif + u32 s_mdsnum; }; #endif /* _LINUX_EXT3_FS_SB */ -Index: linux-2.4.21-suse2/include/linux/dcache.h -=================================================================== ---- linux-2.4.21-suse2.orig/include/linux/dcache.h 2004-08-19 13:46:46.000000000 +0400 -+++ linux-2.4.21-suse2/include/linux/dcache.h 2004-09-12 18:27:04.000000000 +0400 -@@ -121,6 +121,9 @@ - atomic_t d_count; - unsigned int d_flags; - struct inode * d_inode; /* Where the name belongs to - NULL is negative */ -+ unsigned d_inum; /* for cross-fs references (Lustre) */ -+ unsigned d_mdsnum; /* for cross-fs references (Lustre) */ -+ unsigned d_generation; /* for cross-fs references (Lustre) */ - struct dentry * d_parent; /* parent directory */ - struct list_head d_hash; /* lookup hash list */ - struct list_head d_lru; /* d_count = 0 LRU list */ -@@ -195,6 +198,7 @@ - */ - #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ - #define DCACHE_LUSTRE_INVALID 0x0010 /* Lustre invalidated */ -+#define DCACHE_CROSS_REF 0x0020 /* entry points to inode on another MDS */ - - extern spinlock_t dcache_lock; - diff --git a/lustre/kernel_patches/patches/ext3-nlinks-2.4.24.patch b/lustre/kernel_patches/patches/ext3-nlinks-2.4.24.patch new file mode 100644 index 0000000000..f198362931 --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-nlinks-2.4.24.patch @@ -0,0 +1,170 @@ +--- ./fs/ext3/namei.c.orig 2004-08-19 12:53:21.000000000 +0800 ++++ ./fs/ext3/namei.c 2004-08-19 12:44:18.000000000 +0800 +@@ -1541,11 +1541,16 @@ + static inline void ext3_inc_count(handle_t *handle, struct inode *inode) + { + inode->i_nlink++; ++ if (is_dx(inode) && inode->i_nlink > 1) { ++ if (inode->i_nlink >= 65000) /* limit is 16-bit i_links_count */ ++ inode->i_nlink = 1; ++ } + } + + static inline void ext3_dec_count(handle_t *handle, struct inode *inode) + { +- inode->i_nlink--; ++ if (!S_ISDIR(inode->i_mode) || inode->i_nlink > 2) ++ inode->i_nlink--; + } + + static int ext3_add_nondir(handle_t *handle, +@@ -1646,7 +1651,7 @@ + struct ext3_dir_entry_2 * de; + int err; + +- if (dir->i_nlink >= EXT3_LINK_MAX) ++ if (EXT3_DIR_LINK_MAXED(dir)) + return -EMLINK; + + handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + +@@ -1668,7 +1673,7 @@ + inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; + dir_block = ext3_bread (handle, inode, 0, 1, &err); + if (!dir_block) { +- inode->i_nlink--; /* is this nlink == 0? */ ++ ext3_dec_count(handle, inode); /* is this nlink == 0? */ + ext3_mark_inode_dirty(handle, inode); + iput (inode); + goto out_stop; +@@ -1700,7 +1705,7 @@ + iput (inode); + goto out_stop; + } +- dir->i_nlink++; ++ ext3_inc_count(handle, dir); + ext3_update_dx_flag(dir); + ext3_mark_inode_dirty(handle, dir); + d_instantiate(dentry, inode); +@@ -1761,10 +1766,11 @@ + } + de = (struct ext3_dir_entry_2 *) bh->b_data; + } +- if (!ext3_check_dir_entry ("empty_dir", inode, de, bh, +- offset)) { +- brelse (bh); +- return 1; ++ if (!ext3_check_dir_entry("empty_dir", inode, de, bh, offset)) { ++ /* On error skip the de and offset to the next block. */ ++ de = (void *)(bh->b_data + sb->s_blocksize); ++ offset = (offset | (sb->s_blocksize - 1)) + 1; ++ continue; + } + if (le32_to_cpu(de->inode)) { + brelse (bh); +@@ -1957,14 +1963,14 @@ + retval = ext3_delete_entry(handle, dir, de, bh); + if (retval) + goto end_rmdir; +- if (inode->i_nlink != 2) +- ext3_warning (inode->i_sb, "ext3_rmdir", +- "empty directory has nlink!=2 (%d)", +- inode->i_nlink); ++ if (!EXT3_DIR_LINK_EMPTY(inode)) ++ ext3_warning(inode->i_sb, __FUNCTION__, ++ "empty directory has too many links (%d)", ++ inode->i_nlink); + inode->i_version = ++event; + inode->i_nlink = 0; + ext3_orphan_add(handle, inode); +- dir->i_nlink--; ++ ext3_dec_count(handle, dir); + inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; + ext3_mark_inode_dirty(handle, inode); + ext3_update_dx_flag(dir); +@@ -2046,7 +2052,7 @@ + dir->i_ctime = dir->i_mtime = CURRENT_TIME; + ext3_update_dx_flag(dir); + ext3_mark_inode_dirty(handle, dir); +- inode->i_nlink--; ++ ext3_dec_count(handle, inode); + if (!inode->i_nlink) { + ext3_try_to_delay_deletion(inode); + ext3_orphan_add(handle, inode); +@@ -2140,9 +2146,8 @@ + if (S_ISDIR(inode->i_mode)) + return -EPERM; + +- if (inode->i_nlink >= EXT3_LINK_MAX) { ++ if (EXT3_DIR_LINK_MAXED(inode)) + return -EMLINK; +- } + + handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + + EXT3_INDEX_EXTRA_TRANS_BLOCKS); +@@ -2226,8 +2231,8 @@ + if (le32_to_cpu(PARENT_INO(dir_bh->b_data)) != old_dir->i_ino) + goto end_rename; + retval = -EMLINK; +- if (!new_inode && new_dir!=old_dir && +- new_dir->i_nlink >= EXT3_LINK_MAX) ++ if (!new_inode && new_dir != old_dir && ++ EXT3_DIR_LINK_MAXED(new_dir)) + goto end_rename; + } + if (!new_bh) { +@@ -2285,7 +2290,7 @@ + } + + if (new_inode) { +- new_inode->i_nlink--; ++ ext3_dec_count(handle, new_inode); + new_inode->i_ctime = CURRENT_TIME; + } + old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; +@@ -2296,11 +2301,11 @@ + PARENT_INO(dir_bh->b_data) = le32_to_cpu(new_dir->i_ino); + BUFFER_TRACE(dir_bh, "call ext3_journal_dirty_metadata"); + ext3_journal_dirty_metadata(handle, dir_bh); +- old_dir->i_nlink--; ++ ext3_dec_count(handle, old_dir); + if (new_inode) { +- new_inode->i_nlink--; ++ ext3_dec_count(handle, new_inode); + } else { +- new_dir->i_nlink++; ++ ext3_inc_count(handle, new_dir); + ext3_update_dx_flag(new_dir); + ext3_mark_inode_dirty(handle, new_dir); + } +--- ./include/linux/ext3_fs.h.orig 2004-08-19 12:53:52.000000000 +0800 ++++ ./include/linux/ext3_fs.h 2004-08-19 11:06:33.000000000 +0800 +@@ -42,7 +42,7 @@ + /* + * Always enable hashed directories + */ +-#define CONFIG_EXT3_INDEX ++#define CONFIG_EXT3_INDEX 1 + + /* + * Debug code +@@ -581,14 +581,15 @@ + */ + + #ifdef CONFIG_EXT3_INDEX +- #define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ +- EXT3_FEATURE_COMPAT_DIR_INDEX) && \ ++#define is_dx(dir) (EXT3_HAS_COMPAT_FEATURE(dir->i_sb, \ ++ EXT3_FEATURE_COMPAT_DIR_INDEX) && \ + (EXT3_I(dir)->i_flags & EXT3_INDEX_FL)) +-#define EXT3_DIR_LINK_MAX(dir) (!is_dx(dir) && (dir)->i_nlink >= EXT3_LINK_MAX) +-#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || (dir)->i_nlink == 1) ++#define EXT3_DIR_LINK_MAXED(dir) (!is_dx(dir) && (dir)->i_nlink >=EXT3_LINK_MAX) ++#define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2 || \ ++ (is_dx(dir) && (dir)->i_nlink == 1)) + #else + #define is_dx(dir) 0 +-#define EXT3_DIR_LINK_MAX(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) ++#define EXT3_DIR_LINK_MAXED(dir) ((dir)->i_nlink >= EXT3_LINK_MAX) + #define EXT3_DIR_LINK_EMPTY(dir) ((dir)->i_nlink == 2) + #endif + diff --git a/lustre/kernel_patches/patches/ext3-no-write-super-chaos.patch b/lustre/kernel_patches/patches/ext3-no-write-super-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-no-write-super-chaos.patch rename to lustre/kernel_patches/patches/ext3-no-write-super-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-no-write-super.patch b/lustre/kernel_patches/patches/ext3-no-write-super.patch deleted file mode 100644 index d2dcdae689..0000000000 --- a/lustre/kernel_patches/patches/ext3-no-write-super.patch +++ /dev/null @@ -1,22 +0,0 @@ - 0 files changed - ---- linux-2.4.20/fs/ext3/super.c~ext3-no-write-super 2003-08-11 13:20:17.000000000 +0400 -+++ linux-2.4.20-alexey/fs/ext3/super.c 2003-08-11 13:31:35.000000000 +0400 -@@ -1849,7 +1849,6 @@ void ext3_write_super (struct super_bloc - if (down_trylock(&sb->s_lock) == 0) - BUG(); /* aviro detector */ - sb->s_dirt = 0; -- target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); - - /* - * Tricky --- if we are unmounting, the write really does need -@@ -1857,6 +1856,7 @@ void ext3_write_super (struct super_bloc - * sb->s_root. - */ - if (do_sync_supers || !sb->s_root) { -+ target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); - unlock_super(sb); - log_wait_commit(EXT3_SB(sb)->s_journal, target); - lock_super(sb); - -_ diff --git a/lustre/kernel_patches/patches/ext3-noread-2.4.21-chaos.patch b/lustre/kernel_patches/patches/ext3-noread-2.4.21-chaos.patch deleted file mode 100644 index 1903baa358..0000000000 --- a/lustre/kernel_patches/patches/ext3-noread-2.4.21-chaos.patch +++ /dev/null @@ -1,223 +0,0 @@ - fs/ext3/ialloc.c | 47 ++++++++++++++++++++++- - fs/ext3/inode.c | 96 +++++++++++++++++++++++++++++++++++++----------- - include/linux/ext3_fs.h | 2 + - 3 files changed, 121 insertions(+), 24 deletions(-) - -Index: linux-2.4.21-chaos/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ialloc.c 2003-12-12 12:56:39.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ialloc.c 2003-12-12 13:21:50.000000000 +0300 -@@ -290,6 +290,37 @@ - } - - /* -+ * @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) -+{ -+ int bitmap_nr = load_inode_bitmap(sb, block_group); -+ int inodes_per_block; -+ unsigned long inum, iend; -+ struct buffer_head *ibitmap; -+ -+ if (bitmap_nr < 0) -+ 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; -+ ibitmap = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]; -+ 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 -@@ -312,6 +343,7 @@ - struct ext3_group_desc * gdp; - struct ext3_group_desc * tmp; - struct ext3_super_block * es; -+ struct ext3_iloc iloc; - int err = 0; - - /* Cannot create files in a deleted directory */ -@@ -513,8 +545,19 @@ - inode->i_generation = sbi->s_next_generation++; - - ei->i_state = EXT3_STATE_NEW; -- err = ext3_mark_inode_dirty(handle, inode); -- if (err) goto fail; -+ err = ext3_get_inode_loc_new(inode, &iloc, 1); -+ if (err) goto fail; -+ BUFFER_TRACE(iloc->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, iloc.bh); -+ if (err) { -+ brelse(iloc.bh); -+ iloc.bh = NULL; -+ goto fail; -+ } -+ err = ext3_mark_iloc_dirty(handle, inode, &iloc); -+ if (err) goto fail; -+ -+ - - #ifdef CONFIG_EXT3_FS_XATTR - init_rwsem(&EXT3_I(inode)->xattr_sem); -Index: linux-2.4.21-chaos/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/inode.c 2003-12-12 13:01:48.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/inode.c 2003-12-12 13:22:45.000000000 +0300 -@@ -2291,16 +2291,21 @@ - } - #endif /* EXT3_DELETE_THREAD */ - --/* -- * ext3_get_inode_loc returns with an extra refcount against the -- * inode's underlying buffer_head on success. -- */ -- --int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc) -+#define NUM_INODE_PREREAD 16 -+ -+/* -+ * 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 super_block *sb = inode->i_sb; - struct ext3_sb_info *sbi = EXT3_SB(sb); -- struct buffer_head *bh = 0; -+ struct buffer_head *bh[NUM_INODE_PREREAD]; - unsigned long block; - unsigned long block_group; - unsigned long group_desc; -@@ -2322,30 +2327,72 @@ - } - group_desc = block_group >> sbi->s_desc_per_block_bits; - desc = block_group & (sbi->s_desc_per_block - 1); -- bh = sbi->s_group_desc[group_desc]; -- if (!bh) { -+ if (!(sbi->s_group_desc[group_desc])) { - ext3_error(sb, __FUNCTION__, "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) % sbi->s_inodes_per_group) * -- sbi->s_inode_size; -+ offset = ((inode->i_ino - 1) % EXT3_INODES_PER_GROUP(inode->i_sb)); -+ - block = le32_to_cpu(gdp[desc].bg_inode_table) + -- (offset >> EXT3_BLOCK_SIZE_BITS(sb)); -- if (!(bh = sb_bread(sb, block))) { -- ext3_error (sb, __FUNCTION__, -- "unable to read inode block - " -- "inode=%lu, block=%lu", inode->i_ino, block); -- goto bad_inode; -- } -- offset &= (EXT3_BLOCK_SIZE(sb) - 1); -+ (offset * EXT3_INODE_SIZE(sb) >> EXT3_BLOCK_SIZE_BITS(sb)); - -- iloc->bh = bh; -- iloc->raw_inode = (struct ext3_inode *) (bh->b_data + offset); -+ bh[0] = sb_getblk(inode->i_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(inode->i_sb, block_group, offset)) { -+ lock_buffer(bh[0]); -+ memset(bh[0]->b_data, 0, bh[0]->b_size); -+ mark_buffer_uptodate(bh[0], 1); -+ unlock_buffer(bh[0]); -+ } else { -+ unsigned long block_end, itable_end; -+ int count = 1; -+ -+ itable_end = le32_to_cpu(gdp[desc].bg_inode_table) + -+ inode->i_sb->u.ext3_sb.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(inode->i_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(inode->i_sb, __FUNCTION__, -+ "unable to read inode block - " -+ "inode=%lu, block=%lu", inode->i_ino, -+ bh[0]->b_blocknr); -+ goto bad_inode; -+ } -+ } -+ done: -+ offset = (offset * EXT3_INODE_SIZE(inode->i_sb)) & (EXT3_BLOCK_SIZE(inode->i_sb) - 1); -+ -+ iloc->bh = bh[0]; -+ iloc->raw_inode = (struct ext3_inode *)(bh[0]->b_data + offset); - iloc->block_group = block_group; - - return 0; -@@ -2370,6 +2417,11 @@ - } - - -+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) - { - struct ext3_iloc iloc; -Index: linux-2.4.21-chaos/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs.h 2003-12-12 13:01:48.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs.h 2003-12-12 13:21:50.000000000 +0300 -@@ -683,6 +683,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 *sb, 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-noread-2.4.21-suse2.patch b/lustre/kernel_patches/patches/ext3-noread-2.4.21-suse2.patch deleted file mode 100644 index 66274d8aaa..0000000000 --- a/lustre/kernel_patches/patches/ext3-noread-2.4.21-suse2.patch +++ /dev/null @@ -1,218 +0,0 @@ - fs/ext3/ialloc.c | 47 ++++++++++++++++++++++- - fs/ext3/inode.c | 96 +++++++++++++++++++++++++++++++++++++----------- - include/linux/ext3_fs.h | 2 + - 3 files changed, 121 insertions(+), 24 deletions(-) - ---- linux-2.4.20/fs/ext3/ialloc.c~ext3-noread-2.4.20 2003-05-16 12:21:39.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/ialloc.c 2003-05-16 12:21:46.000000000 +0800 -@@ -289,6 +289,37 @@ error_return: - } - - /* -+ * @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) -+{ -+ int bitmap_nr = load_inode_bitmap(sb, block_group); -+ int inodes_per_block; -+ unsigned long inum, iend; -+ struct buffer_head *ibitmap; -+ -+ if (bitmap_nr < 0) -+ 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; -+ ibitmap = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]; -+ 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 -@@ -310,6 +341,7 @@ struct inode * ext3_new_inode (handle_t - struct ext3_group_desc * gdp; - struct ext3_group_desc * tmp; - struct ext3_super_block * es; -+ struct ext3_iloc iloc; - int err = 0; - - /* Cannot create files in a deleted directory */ -@@ -510,8 +542,19 @@ repeat: - inode->i_generation = sb->u.ext3_sb.s_next_generation++; - - inode->u.ext3_i.i_state = EXT3_STATE_NEW; -- err = ext3_mark_inode_dirty(handle, inode); -- if (err) goto fail; -+ err = ext3_get_inode_loc_new(inode, &iloc, 1); -+ if (err) goto fail; -+ BUFFER_TRACE(iloc->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, iloc.bh); -+ if (err) { -+ brelse(iloc.bh); -+ iloc.bh = NULL; -+ goto fail; -+ } -+ err = ext3_mark_iloc_dirty(handle, inode, &iloc); -+ if (err) goto fail; -+ -+ - - #ifdef CONFIG_EXT3_FS_XATTR - init_rwsem(&inode->u.ext3_i.xattr_sem); ---- linux-2.4.20/fs/ext3/inode.c~ext3-noread-2.4.20 2003-05-16 12:21:41.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/inode.c 2003-05-16 12:22:15.000000000 +0800 -@@ -2013,14 +2013,19 @@ out_stop: - ext3_journal_stop(handle, inode); - } - --/* -- * ext3_get_inode_loc returns with an extra refcount against the -- * inode's underlying buffer_head on success. -- */ -- --int ext3_get_inode_loc (struct inode *inode, struct ext3_iloc *iloc) -+#define NUM_INODE_PREREAD 16 -+ -+/* -+ * 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]; - unsigned long block; - unsigned long block_group; - unsigned long group_desc; -@@ -2045,31 +2050,73 @@ int ext3_get_inode_loc (struct inode *in - } - group_desc = block_group >> EXT3_DESC_PER_BLOCK_BITS(inode->i_sb); - desc = block_group & (EXT3_DESC_PER_BLOCK(inode->i_sb) - 1); -- bh = inode->i_sb->u.ext3_sb.s_group_desc[group_desc]; -- if (!bh) { -+ if (!(inode->i_sb->u.ext3_sb.s_group_desc[group_desc])) { - ext3_error (inode->i_sb, "ext3_get_inode_loc", - "Descriptor not loaded"); - goto bad_inode; - } - -- gdp = (struct ext3_group_desc *) bh->b_data; -+ gdp = (struct ext3_group_desc *)(inode->i_sb->u.ext3_sb.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 = ((inode->i_ino - 1) % EXT3_INODES_PER_GROUP(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))) { -- 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 &= (EXT3_BLOCK_SIZE(inode->i_sb) - 1); -+ (offset * EXT3_INODE_SIZE(inode->i_sb) >> EXT3_BLOCK_SIZE_BITS(inode->i_sb)); - -- iloc->bh = bh; -- iloc->raw_inode = (struct ext3_inode *) (bh->b_data + offset); -+ bh[0] = sb_getblk(inode->i_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(inode->i_sb, block_group, offset)) { -+ lock_buffer(bh[0]); -+ memset(bh[0]->b_data, 0, bh[0]->b_size); -+ mark_buffer_uptodate(bh[0], 1); -+ unlock_buffer(bh[0]); -+ } else { -+ unsigned long block_end, itable_end; -+ int count = 1; -+ -+ itable_end = le32_to_cpu(gdp[desc].bg_inode_table) + -+ inode->i_sb->u.ext3_sb.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(inode->i_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(inode->i_sb, __FUNCTION__, -+ "unable to read inode block - " -+ "inode=%lu, block=%lu", inode->i_ino, -+ bh[0]->b_blocknr); -+ goto bad_inode; -+ } -+ } -+ done: -+ offset = (offset * EXT3_INODE_SIZE(inode->i_sb)) & (EXT3_BLOCK_SIZE(inode->i_sb) - 1); -+ -+ iloc->bh = bh[0]; -+ iloc->raw_inode = (struct ext3_inode *)(bh[0]->b_data + offset); - iloc->block_group = block_group; - - return 0; -@@ -2078,6 +2125,11 @@ int ext3_get_inode_loc (struct inode *in - 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) - { - struct ext3_iloc iloc; ---- linux-2.4.20/include/linux/ext3_fs.h~ext3-noread-2.4.20 2003-05-16 12:21:39.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext3_fs.h 2003-05-16 12:21:46.000000000 +0800 -@@ -683,6 +683,8 @@ 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_itable_block_used(struct super_block *sb, 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-noread-2.4.20.patch b/lustre/kernel_patches/patches/ext3-noread-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-noread-2.4.20.patch rename to lustre/kernel_patches/patches/ext3-noread-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-o_direct-1-2.4.18-chaos.patch b/lustre/kernel_patches/patches/ext3-o_direct-1-2.4.18-chaos.patch deleted file mode 100644 index 932ae843b8..0000000000 --- a/lustre/kernel_patches/patches/ext3-o_direct-1-2.4.18-chaos.patch +++ /dev/null @@ -1,198 +0,0 @@ - ---- linux-2.4.18/fs/ext3/inode.c~ext3-o_direct-1-2.4.18-chaos Mon Jul 28 14:13:05 2003 -+++ linux-2.4.18-alexey/fs/ext3/inode.c Mon Jul 28 15:50:14 2003 -@@ -27,6 +27,7 @@ - #include <linux/ext3_jbd.h> - #include <linux/jbd.h> - #include <linux/locks.h> -+#include <linux/iobuf.h> - #include <linux/smp_lock.h> - #include <linux/highuid.h> - #include <linux/quotaops.h> -@@ -733,9 +734,9 @@ err_out: - * The BKL may not be held on entry here. Be sure to take it early. - */ - --static int ext3_get_block_handle(handle_t *handle, struct inode *inode, -- long iblock, -- struct buffer_head *bh_result, int create) -+static int -+ext3_get_block_handle(handle_t *handle, struct inode *inode, long iblock, -+ struct buffer_head *bh_result, int create, int extend_disksize) - { - int err = -EIO; - int offsets[4]; -@@ -816,16 +817,18 @@ out: - if (err) - goto cleanup; - -- new_size = inode->i_size; -- /* -- * This is not racy against ext3_truncate's modification of i_disksize -- * because VM/VFS ensures that the file cannot be extended while -- * truncate is in progress. It is racy between multiple parallel -- * instances of get_block, but we have the BKL. -- */ -- if (new_size > ei->i_disksize) -- ei->i_disksize = new_size; -- -+ if (extend_disksize) { -+ /* -+ * This is not racy against ext3_truncate's modification of -+ * i_disksize because VM/VFS ensures that the file cannot be -+ * extended while truncate is in progress. It is racy between -+ * multiple parallel instances of get_block, but we have BKL. -+ */ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ new_size = inode->i_size; -+ if (new_size > ei->i_disksize) -+ ei->i_disksize = new_size; -+ } - bh_result->b_state |= (1UL << BH_New); - goto got_it; - -@@ -852,7 +855,38 @@ static int ext3_get_block(struct inode * - handle = ext3_journal_current_handle(); - J_ASSERT(handle != 0); - } -- ret = ext3_get_block_handle(handle, inode, iblock, bh_result, create); -+ ret = ext3_get_block_handle(handle, inode, iblock, -+ bh_result, create, 1); -+ return ret; -+} -+ -+#define DIO_CREDITS (EXT3_RESERVE_TRANS_BLOCKS + 32) -+ -+static int -+ext3_direct_io_get_block(struct inode *inode, long iblock, -+ struct buffer_head *bh_result, int create) -+{ -+ handle_t *handle = journal_current_handle(); -+ int ret = 0; -+ -+ lock_kernel(); -+ if (handle && handle->h_buffer_credits <= EXT3_RESERVE_TRANS_BLOCKS) { -+ /* -+ * Getting low on buffer credits... -+ */ -+ if (!ext3_journal_extend(handle, DIO_CREDITS)) { -+ /* -+ * Couldn't extend the transaction. Start a new one -+ */ -+ ret = ext3_journal_restart(handle, DIO_CREDITS); -+ } -+ } -+ if (ret == 0) -+ ret = ext3_get_block_handle(handle, inode, iblock, -+ bh_result, create, 0); -+ if (ret == 0) -+ bh_result->b_size = (1 << inode->i_blkbits); -+ unlock_kernel(); - return ret; - } - -@@ -870,7 +904,7 @@ struct buffer_head *ext3_getblk(handle_t - dummy.b_state = 0; - dummy.b_blocknr = -1000; - buffer_trace_init(&dummy.b_history); -- *errp = ext3_get_block_handle(handle, inode, block, &dummy, create); -+ *errp = ext3_get_block_handle(handle, inode, block, &dummy, create, 1); - if (!*errp && buffer_mapped(&dummy)) { - struct buffer_head *bh; - bh = sb_getblk(inode->i_sb, dummy.b_blocknr); -@@ -1380,6 +1414,67 @@ static int ext3_releasepage(struct page - return journal_try_to_free_buffers(journal, page, wait); - } - -+static int -+ext3_direct_IO(int rw, struct inode *inode, struct kiobuf *iobuf, -+ unsigned long blocknr, int blocksize) -+{ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ handle_t *handle = NULL; -+ int ret; -+ int orphan = 0; -+ loff_t offset = blocknr << inode->i_blkbits; /* ugh */ -+ ssize_t count = iobuf->length; /* ditto */ -+ -+ if (rw == WRITE) { -+ loff_t final_size = offset + count; -+ -+ lock_kernel(); -+ handle = ext3_journal_start(inode, DIO_CREDITS); -+ unlock_kernel(); -+ if (IS_ERR(handle)) { -+ ret = PTR_ERR(handle); -+ goto out; -+ } -+ if (final_size > inode->i_size) { -+ lock_kernel(); -+ ret = ext3_orphan_add(handle, inode); -+ unlock_kernel(); -+ if (ret) -+ goto out_stop; -+ orphan = 1; -+ ei->i_disksize = inode->i_size; -+ } -+ } -+ -+ ret = generic_direct_IO(rw, inode, iobuf, blocknr, -+ blocksize, ext3_direct_io_get_block); -+ -+out_stop: -+ if (handle) { -+ int err; -+ -+ lock_kernel(); -+ if (orphan) -+ ext3_orphan_del(handle, inode); -+ if (orphan && ret > 0) { -+ loff_t end = offset + ret; -+ if (end > inode->i_size) { -+ ei->i_disksize = end; -+ inode->i_size = end; -+ err = ext3_mark_inode_dirty(handle, inode); -+ if (!ret) -+ ret = err; -+ } -+ } -+ err = ext3_journal_stop(handle, inode); -+ if (ret == 0) -+ ret = err; -+ unlock_kernel(); -+ } -+out: -+ return ret; -+ -+} - - struct address_space_operations ext3_aops = { - readpage: ext3_readpage, /* BKL not held. Don't need */ -@@ -1390,6 +1485,7 @@ struct address_space_operations ext3_aop - bmap: ext3_bmap, /* BKL held */ - flushpage: ext3_flushpage, /* BKL not held. Don't need */ - releasepage: ext3_releasepage, /* BKL not held. Don't need */ -+ direct_IO: ext3_direct_IO, /* BKL not held. Don't need */ - }; - - /* -@@ -2987,7 +3083,7 @@ int ext3_prep_san_write(struct inode *in - /* 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; - -@@ -3047,7 +3143,7 @@ int ext3_map_inode_page(struct inode *in - if (blocks[i] != 0) - continue; - -- rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1); -+ rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1, 1); - if (rc) { - printk(KERN_INFO "ext3_map_inode_page: error %d " - "allocating block %ld\n", rc, iblock); - -_ diff --git a/lustre/kernel_patches/patches/ext3-o_direct-1.2.4.20-rh.patch b/lustre/kernel_patches/patches/ext3-o_direct-1.2.4.20-rh.patch deleted file mode 100644 index 1caa289754..0000000000 --- a/lustre/kernel_patches/patches/ext3-o_direct-1.2.4.20-rh.patch +++ /dev/null @@ -1,197 +0,0 @@ - -Index: linux-2.4.20-rh/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20-rh.orig/fs/ext3/inode.c 2003-09-04 18:01:41.000000000 +0800 -+++ linux-2.4.20-rh/fs/ext3/inode.c 2003-09-04 18:18:54.000000000 +0800 -@@ -27,6 +27,7 @@ - #include <linux/ext3_jbd.h> - #include <linux/jbd.h> - #include <linux/locks.h> -+#include <linux/iobuf.h> - #include <linux/smp_lock.h> - #include <linux/highuid.h> - #include <linux/quotaops.h> -@@ -743,9 +744,9 @@ - * The BKL may not be held on entry here. Be sure to take it early. - */ - --static int ext3_get_block_handle(handle_t *handle, struct inode *inode, -- long iblock, -- struct buffer_head *bh_result, int create) -+static int -+ext3_get_block_handle(handle_t *handle, struct inode *inode, long iblock, -+ struct buffer_head *bh_result, int create, int extend_disksize) - { - int err = -EIO; - int offsets[4]; -@@ -825,15 +826,18 @@ - if (err) - goto cleanup; - -- new_size = inode->i_size; -- /* -- * This is not racy against ext3_truncate's modification of i_disksize -- * because VM/VFS ensures that the file cannot be extended while -- * truncate is in progress. It is racy between multiple parallel -- * instances of get_block, but we have the BKL. -- */ -- if (new_size > inode->u.ext3_i.i_disksize) -- inode->u.ext3_i.i_disksize = new_size; -+ if (extend_disksize) { -+ /* -+ * This is not racy against ext3_truncate's modification of -+ * i_disksize because VM/VFS ensures that the file cannot be -+ * extended while truncate is in progress. It is racy between -+ * multiple parallel instances of get_block, but we have BKL. -+ */ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ new_size = inode->i_size; -+ if (new_size > ei->i_disksize) -+ ei->i_disksize = new_size; -+ } - - bh_result->b_state |= (1UL << BH_New); - goto got_it; -@@ -861,7 +865,38 @@ - handle = ext3_journal_current_handle(); - J_ASSERT(handle != 0); - } -- ret = ext3_get_block_handle(handle, inode, iblock, bh_result, create); -+ ret = ext3_get_block_handle(handle, inode, iblock, -+ bh_result, create, 1); -+ return ret; -+} -+ -+#define DIO_CREDITS (EXT3_RESERVE_TRANS_BLOCKS + 32) -+ -+static int -+ext3_direct_io_get_block(struct inode *inode, long iblock, -+ struct buffer_head *bh_result, int create) -+{ -+ handle_t *handle = journal_current_handle(); -+ int ret = 0; -+ -+ lock_kernel(); -+ if (handle && handle->h_buffer_credits <= EXT3_RESERVE_TRANS_BLOCKS) { -+ /* -+ * Getting low on buffer credits... -+ */ -+ if (!ext3_journal_extend(handle, DIO_CREDITS)) { -+ /* -+ * Couldn't extend the transaction. Start a new one -+ */ -+ ret = ext3_journal_restart(handle, DIO_CREDITS); -+ } -+ } -+ if (ret == 0) -+ ret = ext3_get_block_handle(handle, inode, iblock, -+ bh_result, create, 0); -+ if (ret == 0) -+ bh_result->b_size = (1 << inode->i_blkbits); -+ unlock_kernel(); - return ret; - } - -@@ -879,7 +914,7 @@ - dummy.b_state = 0; - dummy.b_blocknr = -1000; - buffer_trace_init(&dummy.b_history); -- *errp = ext3_get_block_handle(handle, inode, block, &dummy, create); -+ *errp = ext3_get_block_handle(handle, inode, block, &dummy, create, 1); - if (!*errp && buffer_mapped(&dummy)) { - struct buffer_head *bh; - bh = sb_getblk(inode->i_sb, dummy.b_blocknr); -@@ -1387,6 +1422,67 @@ - return journal_try_to_free_buffers(journal, page, wait); - } - -+static int -+ext3_direct_IO(int rw, struct inode *inode, struct kiobuf *iobuf, -+ unsigned long blocknr, int blocksize) -+{ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ handle_t *handle = NULL; -+ int ret; -+ int orphan = 0; -+ loff_t offset = blocknr << inode->i_blkbits; /* ugh */ -+ ssize_t count = iobuf->length; /* ditto */ -+ -+ if (rw == WRITE) { -+ loff_t final_size = offset + count; -+ -+ lock_kernel(); -+ handle = ext3_journal_start(inode, DIO_CREDITS); -+ unlock_kernel(); -+ if (IS_ERR(handle)) { -+ ret = PTR_ERR(handle); -+ goto out; -+ } -+ if (final_size > inode->i_size) { -+ lock_kernel(); -+ ret = ext3_orphan_add(handle, inode); -+ unlock_kernel(); -+ if (ret) -+ goto out_stop; -+ orphan = 1; -+ ei->i_disksize = inode->i_size; -+ } -+ } -+ -+ ret = generic_direct_IO(rw, inode, iobuf, blocknr, -+ blocksize, ext3_direct_io_get_block); -+ -+out_stop: -+ if (handle) { -+ int err; -+ -+ lock_kernel(); -+ if (orphan) -+ ext3_orphan_del(handle, inode); -+ if (orphan && ret > 0) { -+ loff_t end = offset + ret; -+ if (end > inode->i_size) { -+ ei->i_disksize = end; -+ inode->i_size = end; -+ err = ext3_mark_inode_dirty(handle, inode); -+ if (!ret) -+ ret = err; -+ } -+ } -+ err = ext3_journal_stop(handle, inode); -+ if (ret == 0) -+ ret = err; -+ unlock_kernel(); -+ } -+out: -+ return ret; -+ -+} - - struct address_space_operations ext3_aops = { - readpage: ext3_readpage, /* BKL not held. Don't need */ -@@ -1397,6 +1493,7 @@ - bmap: ext3_bmap, /* BKL held */ - flushpage: ext3_flushpage, /* BKL not held. Don't need */ - releasepage: ext3_releasepage, /* BKL not held. Don't need */ -+ direct_IO: ext3_direct_IO, /* BKL not held. Don't need */ - }; - - /* -@@ -2970,7 +3067,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; - -@@ -3030,7 +3127,7 @@ - if (blocks[i] != 0) - continue; - -- rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1); -+ rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1, 1); - if (rc) { - printk(KERN_INFO "ext3_map_inode_page: error %d " - "allocating block %ld\n", rc, iblock); diff --git a/lustre/kernel_patches/patches/ext3-o_direct-1.patch b/lustre/kernel_patches/patches/ext3-o_direct-1.patch deleted file mode 100644 index ac716403de..0000000000 --- a/lustre/kernel_patches/patches/ext3-o_direct-1.patch +++ /dev/null @@ -1,177 +0,0 @@ ---- 2.4.20-pre2/fs/ext3/inode.c~ext3-o_direct Thu Aug 15 01:11:02 2002 -+++ 2.4.20-pre2-akpm/fs/ext3/inode.c Thu Aug 15 01:25:55 2002 -@@ -27,6 +27,7 @@ - #include <linux/ext3_jbd.h> - #include <linux/jbd.h> - #include <linux/locks.h> -+#include <linux/iobuf.h> - #include <linux/smp_lock.h> - #include <linux/highuid.h> - #include <linux/quotaops.h> -@@ -716,9 +717,9 @@ err_out: - * The BKL may not be held on entry here. Be sure to take it early. - */ - --static int ext3_get_block_handle(handle_t *handle, struct inode *inode, -- long iblock, -- struct buffer_head *bh_result, int create) -+static int -+ext3_get_block_handle(handle_t *handle, struct inode *inode, long iblock, -+ struct buffer_head *bh_result, int create, int extend_disksize) - { - int err = -EIO; - int offsets[4]; -@@ -798,16 +799,18 @@ out: - if (err) - goto cleanup; - -- new_size = inode->i_size; -- /* -- * This is not racy against ext3_truncate's modification of i_disksize -- * because VM/VFS ensures that the file cannot be extended while -- * truncate is in progress. It is racy between multiple parallel -- * instances of get_block, but we have the BKL. -- */ -- if (new_size > inode->u.ext3_i.i_disksize) -- inode->u.ext3_i.i_disksize = new_size; -- -+ if (extend_disksize) { -+ /* -+ * This is not racy against ext3_truncate's modification of -+ * i_disksize because VM/VFS ensures that the file cannot be -+ * extended while truncate is in progress. It is racy between -+ * multiple parallel instances of get_block, but we have BKL. -+ */ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ new_size = inode->i_size; -+ if (new_size > ei->i_disksize) -+ ei->i_disksize = new_size; -+ } - bh_result->b_state |= (1UL << BH_New); - goto got_it; - -@@ -834,7 +837,38 @@ static int ext3_get_block(struct inode * - handle = ext3_journal_current_handle(); - J_ASSERT(handle != 0); - } -- ret = ext3_get_block_handle(handle, inode, iblock, bh_result, create); -+ ret = ext3_get_block_handle(handle, inode, iblock, -+ bh_result, create, 1); -+ return ret; -+} -+ -+#define DIO_CREDITS (EXT3_RESERVE_TRANS_BLOCKS + 32) -+ -+static int -+ext3_direct_io_get_block(struct inode *inode, long iblock, -+ struct buffer_head *bh_result, int create) -+{ -+ handle_t *handle = journal_current_handle(); -+ int ret = 0; -+ -+ lock_kernel(); -+ if (handle && handle->h_buffer_credits <= EXT3_RESERVE_TRANS_BLOCKS) { -+ /* -+ * Getting low on buffer credits... -+ */ -+ if (!ext3_journal_extend(handle, DIO_CREDITS)) { -+ /* -+ * Couldn't extend the transaction. Start a new one -+ */ -+ ret = ext3_journal_restart(handle, DIO_CREDITS); -+ } -+ } -+ if (ret == 0) -+ ret = ext3_get_block_handle(handle, inode, iblock, -+ bh_result, create, 0); -+ if (ret == 0) -+ bh_result->b_size = (1 << inode->i_blkbits); -+ unlock_kernel(); - return ret; - } - -@@ -852,7 +886,7 @@ struct buffer_head *ext3_getblk(handle_t - dummy.b_state = 0; - dummy.b_blocknr = -1000; - buffer_trace_init(&dummy.b_history); -- *errp = ext3_get_block_handle(handle, inode, block, &dummy, create); -+ *errp = ext3_get_block_handle(handle, inode, block, &dummy, create, 1); - if (!*errp && buffer_mapped(&dummy)) { - struct buffer_head *bh; - bh = sb_getblk(inode->i_sb, dummy.b_blocknr); -@@ -1349,6 +1383,67 @@ static int ext3_releasepage(struct page - return journal_try_to_free_buffers(journal, page, wait); - } - -+static int -+ext3_direct_IO(int rw, struct inode *inode, struct kiobuf *iobuf, -+ unsigned long blocknr, int blocksize) -+{ -+ struct ext3_inode_info *ei = EXT3_I(inode); -+ handle_t *handle = NULL; -+ int ret; -+ int orphan = 0; -+ loff_t offset = blocknr << inode->i_blkbits; /* ugh */ -+ ssize_t count = iobuf->length; /* ditto */ -+ -+ if (rw == WRITE) { -+ loff_t final_size = offset + count; -+ -+ lock_kernel(); -+ handle = ext3_journal_start(inode, DIO_CREDITS); -+ unlock_kernel(); -+ if (IS_ERR(handle)) { -+ ret = PTR_ERR(handle); -+ goto out; -+ } -+ if (final_size > inode->i_size) { -+ lock_kernel(); -+ ret = ext3_orphan_add(handle, inode); -+ unlock_kernel(); -+ if (ret) -+ goto out_stop; -+ orphan = 1; -+ ei->i_disksize = inode->i_size; -+ } -+ } -+ -+ ret = generic_direct_IO(rw, inode, iobuf, blocknr, -+ blocksize, ext3_direct_io_get_block); -+ -+out_stop: -+ if (handle) { -+ int err; -+ -+ lock_kernel(); -+ if (orphan) -+ ext3_orphan_del(handle, inode); -+ if (orphan && ret > 0) { -+ loff_t end = offset + ret; -+ if (end > inode->i_size) { -+ ei->i_disksize = end; -+ inode->i_size = end; -+ err = ext3_mark_inode_dirty(handle, inode); -+ if (!ret) -+ ret = err; -+ } -+ } -+ err = ext3_journal_stop(handle, inode); -+ if (ret == 0) -+ ret = err; -+ unlock_kernel(); -+ } -+out: -+ return ret; -+ -+} - - struct address_space_operations ext3_aops = { - readpage: ext3_readpage, /* BKL not held. Don't need */ -@@ -1359,6 +1454,7 @@ struct address_space_operations ext3_aop - bmap: ext3_bmap, /* BKL held */ - flushpage: ext3_flushpage, /* BKL not held. Don't need */ - releasepage: ext3_releasepage, /* BKL not held. Don't need */ -+ direct_IO: ext3_direct_IO, /* BKL not held. Don't need */ - }; - - /* diff --git a/lustre/kernel_patches/patches/ext3-o_direct-2.4.21-chaos.patch b/lustre/kernel_patches/patches/ext3-o_direct-2.4.21-chaos.patch deleted file mode 100644 index 6f7bf17051..0000000000 --- a/lustre/kernel_patches/patches/ext3-o_direct-2.4.21-chaos.patch +++ /dev/null @@ -1,23 +0,0 @@ - -Index: linux-2.4.21-chaos/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/inode.c 2003-12-12 16:19:13.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/inode.c 2003-12-12 16:19:16.000000000 +0300 -@@ -3154,7 +3154,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; - -@@ -3229,7 +3229,7 @@ - if (blocks[i] != 0) - continue; - -- rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1); -+ rc = ext3_get_block_handle(handle, inode, iblock, &bh, 1, 1); - if (rc) { - printk(KERN_INFO "ext3_map_inode_page: error %d " - "allocating block %ld\n", rc, iblock); diff --git a/lustre/kernel_patches/patches/ext3-orphan_lock-2.4.19-suse.patch b/lustre/kernel_patches/patches/ext3-orphan_lock-2.4.19-suse.patch deleted file mode 100644 index 1e26b8c5b2..0000000000 --- a/lustre/kernel_patches/patches/ext3-orphan_lock-2.4.19-suse.patch +++ /dev/null @@ -1,85 +0,0 @@ -Index: linux-2.4.19/fs/ext3/namei.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/namei.c 2004-04-23 22:36:03.000000000 -0400 -+++ linux-2.4.19/fs/ext3/namei.c 2004-04-23 22:37:37.000000000 -0400 -@@ -1751,8 +1751,8 @@ - struct super_block *sb = inode->i_sb; - struct ext3_iloc iloc; - int err = 0, rc; -- -- lock_super(sb); -+ -+ down(&EXT3_SB(sb)->s_orphan_lock); - if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - -@@ -1800,7 +1800,7 @@ - jbd_debug(4, "orphan inode %ld will point to %d\n", - inode->i_ino, NEXT_ORPHAN(inode)); - out_unlock: -- unlock_super(sb); -+ up(&EXT3_SB(sb)->s_orphan_lock); - ext3_std_error(inode->i_sb, err); - return err; - } -@@ -1813,20 +1813,19 @@ - { - struct list_head *prev; - struct ext3_inode_info *ei = EXT3_I(inode); -- struct ext3_sb_info *sbi; -+ struct ext3_sb_info *sbi = EXT3_SB(inode->i_sb); - unsigned long ino_next; - struct ext3_iloc iloc; - int err = 0; - -- lock_super(inode->i_sb); -+ down(&sbi->s_orphan_lock); - if (list_empty(&ei->i_orphan)) { -- unlock_super(inode->i_sb); -+ up(&sbi->s_orphan_lock); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); - prev = ei->i_orphan.prev; -- sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino); - -@@ -1872,10 +1871,10 @@ - if (err) - goto out_brelse; - --out_err: -+out_err: - ext3_std_error(inode->i_sb, err); - out: -- unlock_super(inode->i_sb); -+ up(&sbi->s_orphan_lock); - return err; - - out_brelse: -Index: linux-2.4.19/fs/ext3/super.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/super.c 2004-04-23 22:30:41.000000000 -0400 -+++ linux-2.4.19/fs/ext3/super.c 2004-04-23 22:36:22.000000000 -0400 -@@ -1179,6 +1179,7 @@ - */ - sb->s_op = &ext3_sops; - INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */ -+ sema_init(&sbi->s_orphan_lock, 1); - - sb->s_root = 0; - -Index: linux-2.4.19/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.19.orig/include/linux/ext3_fs_sb.h 2004-04-23 18:26:27.000000000 -0400 -+++ linux-2.4.19/include/linux/ext3_fs_sb.h 2004-04-23 22:36:22.000000000 -0400 -@@ -69,6 +69,7 @@ - struct inode * s_journal_inode; - struct journal_s * s_journal; - struct list_head s_orphan; -+ struct semaphore s_orphan_lock; - struct block_device *journal_bdev; - #ifdef CONFIG_JBD_DEBUG - struct timer_list turn_ro_timer; /* For turning read-only (crash simulation) */ diff --git a/lustre/kernel_patches/patches/ext3-orphan_lock-2.4.22-rh.patch b/lustre/kernel_patches/patches/ext3-orphan_lock-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-orphan_lock-2.4.22-rh.patch rename to lustre/kernel_patches/patches/ext3-orphan_lock-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-orphan_lock-suse.patch b/lustre/kernel_patches/patches/ext3-orphan_lock-suse.patch deleted file mode 100644 index c3369e6e65..0000000000 --- a/lustre/kernel_patches/patches/ext3-orphan_lock-suse.patch +++ /dev/null @@ -1,81 +0,0 @@ -Index: linux-2.4.21-suse/fs/ext3/namei.c -=================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/namei.c 2003-10-30 02:17:22.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/namei.c 2003-10-30 02:20:53.000000000 +0300 -@@ -1747,8 +1747,8 @@ - struct super_block *sb = inode->i_sb; - struct ext3_iloc iloc; - int err = 0, rc; -- -- lock_super(sb); -+ -+ down(&EXT3_SB(sb)->s_orphan_lock); - if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - -@@ -1796,7 +1796,7 @@ - jbd_debug(4, "orphan inode %ld will point to %d\n", - inode->i_ino, NEXT_ORPHAN(inode)); - out_unlock: -- unlock_super(sb); -+ up(&EXT3_SB(sb)->s_orphan_lock); - ext3_std_error(inode->i_sb, err); - return err; - } -@@ -1808,20 +1808,19 @@ - int ext3_orphan_del(handle_t *handle, struct inode *inode) - { - struct list_head *prev; -- struct ext3_sb_info *sbi; -+ struct ext3_sb_info *sbi = EXT3_SB(inode->i_sb); - unsigned long ino_next; - struct ext3_iloc iloc; - int err = 0; - -- lock_super(inode->i_sb); -+ down(&sbi->s_orphan_lock); - if (list_empty(&inode->u.ext3_i.i_orphan)) { -- unlock_super(inode->i_sb); -+ up(&sbi->s_orphan_lock); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); - prev = inode->u.ext3_i.i_orphan.prev; -- sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino); - -@@ -1870,7 +1869,7 @@ - out_err: - ext3_std_error(inode->i_sb, err); - out: -- unlock_super(inode->i_sb); -+ up(&sbi->s_orphan_lock); - return err; - - out_brelse: -Index: linux-2.4.21-suse/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-suse.orig/fs/ext3/super.c 2003-10-30 02:17:22.000000000 +0300 -+++ linux-2.4.21-suse/fs/ext3/super.c 2003-10-30 02:17:22.000000000 +0300 -@@ -1151,6 +1151,7 @@ - */ - sb->s_op = &ext3_sops; - INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */ -+ sema_init(&sbi->s_orphan_lock, 1); - - sb->s_root = 0; - -Index: linux-2.4.21-suse/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.21-suse.orig/include/linux/ext3_fs_sb.h 2003-10-30 02:17:22.000000000 +0300 -+++ linux-2.4.21-suse/include/linux/ext3_fs_sb.h 2003-10-30 02:17:22.000000000 +0300 -@@ -69,6 +69,7 @@ - struct inode * s_journal_inode; - struct journal_s * s_journal; - struct list_head s_orphan; -+ struct semaphore s_orphan_lock; - unsigned long s_commit_interval; - struct block_device *journal_bdev; - #ifdef CONFIG_JBD_DEBUG diff --git a/lustre/kernel_patches/patches/ext3-orphan_lock.patch b/lustre/kernel_patches/patches/ext3-orphan_lock.patch deleted file mode 100644 index d1e5c8d635..0000000000 --- a/lustre/kernel_patches/patches/ext3-orphan_lock.patch +++ /dev/null @@ -1,79 +0,0 @@ ---- linux/fs/ext3/namei.c.orig Fri Mar 14 14:11:58 2003 -+++ linux/fs/ext3/namei.c Fri Mar 14 14:39:48 2003 -@@ -1406,8 +1409,8 @@ - struct super_block *sb = inode->i_sb; - struct ext3_iloc iloc; - int err = 0, rc; -- -- lock_super(sb); -+ -+ down(&EXT3_SB(sb)->s_orphan_lock); - if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - -@@ -1455,7 +1458,7 @@ - jbd_debug(4, "orphan inode %ld will point to %d\n", - inode->i_ino, NEXT_ORPHAN(inode)); - out_unlock: -- unlock_super(sb); -+ up(&EXT3_SB(sb)->s_orphan_lock); - ext3_std_error(inode->i_sb, err); - return err; - } -@@ -1468,20 +1471,19 @@ - { - struct list_head *prev; - struct ext3_inode_info *ei = EXT3_I(inode); -- struct ext3_sb_info *sbi; -+ struct ext3_sb_info *sbi = EXT3_SB(inode->i_sb); - unsigned long ino_next; - struct ext3_iloc iloc; - int err = 0; - -- lock_super(inode->i_sb); -+ down(&sbi->s_orphan_lock); - if (list_empty(&ei->i_orphan)) { -- unlock_super(inode->i_sb); -+ up(&sbi->s_orphan_lock); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); - prev = ei->i_orphan.prev; -- sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino); - -@@ -1525,10 +1527,10 @@ - if (err) - goto out_brelse; - --out_err: -+out_err: - ext3_std_error(inode->i_sb, err); - out: -- unlock_super(inode->i_sb); -+ up(&sbi->s_orphan_lock); - return err; - - out_brelse: ---- linux/fs/ext3/super.c.orig Fri Mar 14 14:11:58 2003 -+++ linux/fs/ext3/super.c Fri Mar 14 14:36:00 2003 -@@ -1134,6 +1314,7 @@ - */ - sb->s_op = &ext3_sops; - INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */ -+ sema_init(&sbi->s_orphan_lock, 1); - - sb->s_root = 0; - ---- linux/include/linux/ext3_fs_sb.h.orig Tue Feb 11 16:34:33 2003 -+++ linux/include/linux/ext3_fs_sb.h Fri Mar 14 14:30:11 2003 -@@ -67,6 +69,7 @@ - struct inode * s_journal_inode; - struct journal_s * s_journal; - struct list_head s_orphan; -+ struct semaphore s_orphan_lock; - unsigned long s_commit_interval; - struct block_device *journal_bdev; - #ifdef CONFIG_JBD_DEBUG diff --git a/lustre/kernel_patches/patches/ext3-pdirops-2.4.18-chaos.patch b/lustre/kernel_patches/patches/ext3-pdirops-2.4.18-chaos.patch deleted file mode 100644 index f8f514bb1a..0000000000 --- a/lustre/kernel_patches/patches/ext3-pdirops-2.4.18-chaos.patch +++ /dev/null @@ -1,1238 +0,0 @@ - fs/ext3/ialloc.c | 3 - fs/ext3/inode.c | 3 - fs/ext3/namei.c | 582 +++++++++++++++++++++++++++++++++++++--------- - fs/ext3/super.c | 14 + - include/linux/ext3_fs.h | 1 - include/linux/ext3_fs_i.h | 6 - 6 files changed, 500 insertions(+), 109 deletions(-) - ---- linux-2.4.18/fs/ext3/namei.c~ext3-pdirops-2.4.18-chaos 2003-09-01 14:58:06.000000000 +0400 -+++ linux-2.4.18-alexey/fs/ext3/namei.c 2003-09-02 11:46:15.000000000 +0400 -@@ -52,6 +52,9 @@ static struct buffer_head *ext3_append(h - { - struct buffer_head *bh; - -+ /* with parallel dir operations all appends -+ * have to be serialized -bzzz */ -+ down(&EXT3_I(inode)->i_append_sem); - *block = inode->i_size >> inode->i_sb->s_blocksize_bits; - - if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -@@ -59,6 +62,8 @@ static struct buffer_head *ext3_append(h - EXT3_I(inode)->i_disksize = inode->i_size; - ext3_journal_get_write_access(handle,bh); - } -+ up(&EXT3_I(inode)->i_append_sem); -+ - return bh; - } - -@@ -135,6 +140,8 @@ struct dx_frame - struct buffer_head *bh; - struct dx_entry *entries; - struct dx_entry *at; -+ unsigned long leaf; -+ unsigned int curidx; - }; - - struct dx_map_entry -@@ -143,6 +150,30 @@ struct dx_map_entry - u32 offs; - }; - -+/* FIXME: this should be reworked using bb_spin_lock -+ * introduced in -mm tree -+ */ -+#define BH_DXLock 25 -+ -+static inline void dx_lock_bh(struct buffer_head volatile *bh) -+{ -+#ifdef CONFIG_SMP -+ while (test_and_set_bit(BH_DXLock, &bh->b_state)) { -+ while (test_bit(BH_DXLock, &bh->b_state)) -+ cpu_relax(); -+ } -+#endif -+} -+ -+static inline void dx_unlock_bh(struct buffer_head *bh) -+{ -+#ifdef CONFIG_SMP -+ smp_mb__before_clear_bit(); -+ clear_bit(BH_DXLock, &bh->b_state); -+#endif -+} -+ -+ - #ifdef CONFIG_EXT3_INDEX - static inline unsigned dx_get_block (struct dx_entry *entry); - static void dx_set_block (struct dx_entry *entry, unsigned value); -@@ -154,7 +185,7 @@ static void dx_set_count (struct dx_entr - static void dx_set_limit (struct dx_entry *entries, unsigned value); - static unsigned dx_root_limit (struct inode *dir, unsigned infosize); - static unsigned dx_node_limit (struct inode *dir); --static struct dx_frame *dx_probe(struct dentry *dentry, -+static struct dx_frame *dx_probe(struct qstr *name, - struct inode *dir, - struct dx_hash_info *hinfo, - struct dx_frame *frame, -@@ -166,15 +197,18 @@ static void dx_sort_map(struct dx_map_en - static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, - struct dx_map_entry *offsets, int count); - static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); --static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static void dx_insert_block (struct inode *, struct dx_frame *, u32, u32, u32); - static int ext3_htree_next_block(struct inode *dir, __u32 hash, - struct dx_frame *frame, - struct dx_frame *frames, int *err, - __u32 *start_hash); - static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -- struct ext3_dir_entry_2 **res_dir, int *err); -+ struct ext3_dir_entry_2 **res_dir, int *err, -+ int rwlock, void **lock); - static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, - struct inode *inode); -+static inline void *ext3_lock_htree(struct inode *, unsigned long, int); -+static inline void ext3_unlock_htree(struct inode *, void *); - - /* - * Future: use high four bits of block for coalesce-on-delete flags -@@ -307,6 +341,94 @@ struct stats dx_show_entries(struct dx_h - #endif /* DX_DEBUG */ - - /* -+ * dx_find_position -+ * -+ * search position of specified hash in index -+ * -+ */ -+ -+struct dx_entry * dx_find_position(struct dx_entry * entries, u32 hash) -+{ -+ struct dx_entry *p, *q, *m; -+ int count; -+ -+ count = dx_get_count(entries); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ return p - 1; -+} -+ -+/* -+ * returns 1 if path is unchanged -+ */ -+int dx_check_path(struct dx_frame *frame, u32 hash) -+{ -+ struct dx_entry *p; -+ int ret = 1; -+ -+ dx_lock_bh(frame->bh); -+ p = dx_find_position(frame->entries, hash); -+ if (frame->leaf != dx_get_block(p)) -+ ret = 0; -+ dx_unlock_bh(frame->bh); -+ -+ return ret; -+} -+ -+/* -+ * 0 - changed -+ * 1 - hasn't changed -+ */ -+static int -+dx_check_full_path(struct dx_frame *frames, struct dx_hash_info *hinfo) -+{ -+ struct dx_entry *p; -+ struct dx_frame *frame = frames; -+ u32 leaf; -+ -+ /* check first level */ -+ dx_lock_bh(frame->bh); -+ p = dx_find_position(frame->entries, hinfo->hash); -+ leaf = dx_get_block(p); -+ dx_unlock_bh(frame->bh); -+ -+ if (leaf != frame->leaf) -+ return 0; -+ -+ /* is there 2nd level? */ -+ frame++; -+ if (frame->bh == NULL) -+ return 1; -+ -+ /* check second level */ -+ dx_lock_bh(frame->bh); -+ -+ /* probably 1st level got changed, check it */ -+ if (!dx_check_path(frames, hinfo->hash)) { -+ /* path changed */ -+ dx_unlock_bh(frame->bh); -+ return 0; -+ } -+ -+ p = dx_find_position(frame->entries, hinfo->hash); -+ leaf = dx_get_block(p); -+ dx_unlock_bh(frame->bh); -+ -+ if (leaf != frame->leaf) -+ return 0; -+ -+ return 1; -+} -+ -+/* - * Probe for a directory leaf block to search. - * - * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -@@ -316,19 +438,20 @@ struct stats dx_show_entries(struct dx_h - * back to userspace. - */ - static struct dx_frame * --dx_probe(struct dentry *dentry, struct inode *dir, -+dx_probe(struct qstr *name, struct inode *dir, - struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) - { -- unsigned count, indirect; -- struct dx_entry *at, *entries, *p, *q, *m; -+ unsigned indirect; -+ struct dx_entry *at, *entries; - struct dx_root *root; - struct buffer_head *bh; - struct dx_frame *frame = frame_in; - u32 hash; -+ unsigned int curidx; - - frame->bh = NULL; -- if (dentry) -- dir = dentry->d_parent->d_inode; -+ frame[1].bh = NULL; -+ - if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) - goto fail; - root = (struct dx_root *) bh->b_data; -@@ -344,8 +467,8 @@ dx_probe(struct dentry *dentry, struct i - } - hinfo->hash_version = root->info.hash_version; - hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -- if (dentry) -- ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ if (name) -+ ext3fs_dirhash(name->name, name->len, hinfo); - hash = hinfo->hash; - - if (root->info.unused_flags & 1) { -@@ -357,7 +480,19 @@ dx_probe(struct dentry *dentry, struct i - goto fail; - } - -+repeat: -+ curidx = 0; -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ dx_lock_bh(bh); -+ /* indirect must be initialized under bh lock because -+ * 2nd level creation procedure may change it and dx_probe() -+ * will suggest htree is still single-level -bzzz */ - if ((indirect = root->info.indirect_levels) > 1) { -+ dx_unlock_bh(bh); - ext3_warning(dir->i_sb, __FUNCTION__, - "Unimplemented inode hash depth: %#06x", - root->info.indirect_levels); -@@ -365,56 +500,46 @@ dx_probe(struct dentry *dentry, struct i - *err = ERR_BAD_DX_DIR; - goto fail; - } -- -- entries = (struct dx_entry *) (((char *)&root->info) + -- root->info.info_length); -- assert(dx_get_limit(entries) == dx_root_limit(dir, -- root->info.info_length)); -- dxtrace (printk("Look up %x", hash)); -+ - while (1) - { -- count = dx_get_count(entries); -- assert (count && count <= dx_get_limit(entries)); -- p = entries + 1; -- q = entries + count - 1; -- while (p <= q) -- { -- m = p + (q - p)/2; -- dxtrace(printk(".")); -- if (dx_get_hash(m) > hash) -- q = m - 1; -- else -- p = m + 1; -- } -- -- if (0) // linear search cross check -- { -- unsigned n = count - 1; -- at = entries; -- while (n--) -- { -- dxtrace(printk(",")); -- if (dx_get_hash(++at) > hash) -- { -- at--; -- break; -- } -- } -- assert (at == p - 1); -- } -- -- at = p - 1; -- dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ at = dx_find_position(entries, hinfo->hash); -+ dxtrace(printk(" %x->%u\n", -+ at == entries? 0: dx_get_hash(at), -+ dx_get_block(at))); - frame->bh = bh; - frame->entries = entries; - frame->at = at; -- if (!indirect--) return frame; -- if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ frame->curidx = curidx; -+ frame->leaf = dx_get_block(at); -+ if (!indirect--) { -+ dx_unlock_bh(bh); -+ return frame; -+ } -+ -+ /* step into next htree level */ -+ curidx = dx_get_block(at); -+ dx_unlock_bh(bh); -+ if (!(bh = ext3_bread (NULL,dir, frame->leaf, 0, err))) - goto fail2; -+ -+ dx_lock_bh(bh); -+ /* splitting may change root index block and move -+ * hash we're looking for into another index block -+ * so, we have to check this situation and repeat -+ * from begining if path got changed -bzzz */ -+ if (!dx_check_path(frame, hash)) { -+ dx_unlock_bh(bh); -+ bh = frame->bh; -+ indirect++; -+ goto repeat; -+ } -+ - at = entries = ((struct dx_node *) bh->b_data)->entries; - assert (dx_get_limit(entries) == dx_node_limit (dir)); - frame++; - } -+ dx_unlock_bh(bh); - fail2: - while (frame >= frame_in) { - brelse(frame->bh); -@@ -428,8 +553,7 @@ static void dx_release (struct dx_frame - { - if (frames[0].bh == NULL) - return; -- -- if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ if (frames[1].bh != NULL) - brelse(frames[1].bh); - brelse(frames[0].bh); - } -@@ -471,8 +595,10 @@ static int ext3_htree_next_block(struct - * nodes need to be read. - */ - while (1) { -- if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) { -+ p->leaf = dx_get_block(p->at); - break; -+ } - if (p == frames) - return 0; - num_frames++; -@@ -498,13 +624,17 @@ static int ext3_htree_next_block(struct - * block so no check is necessary - */ - while (num_frames--) { -- if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -- 0, err))) -+ u32 idx; -+ -+ idx = p->leaf = dx_get_block(p->at); -+ if (!(bh = ext3_bread(NULL, dir, idx, 0, err))) - return -1; /* Failure */ - p++; - brelse (p->bh); - p->bh = bh; - p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ p->curidx = idx; -+ p->leaf = dx_get_block(p->at); - } - return 1; - } -@@ -544,7 +674,7 @@ int ext3_htree_fill_tree(struct file *di - dir = dir_file->f_dentry->d_inode; - hinfo.hash = start_hash; - hinfo.minor_hash = 0; -- frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ frame = dx_probe(NULL, dir_file->f_dentry->d_inode, &hinfo, frames, &err); - if (!frame) - return err; - -@@ -626,7 +756,8 @@ static int dx_make_map (struct ext3_dir_ - count++; - } - /* XXX: do we need to check rec_len == 0 case? -Chris */ -- de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ de = (struct ext3_dir_entry_2 *)((char*)de + -+ le16_to_cpu(de->rec_len)); - } - return count; - } -@@ -659,7 +790,8 @@ static void dx_sort_map (struct dx_map_e - } while(more); - } - --static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+static void dx_insert_block(struct inode *dir, struct dx_frame *frame, -+ u32 hash, u32 block, u32 idx) - { - struct dx_entry *entries = frame->entries; - struct dx_entry *old = frame->at, *new = old + 1; -@@ -671,6 +803,7 @@ static void dx_insert_block(struct dx_fr - dx_set_hash(new, hash); - dx_set_block(new, block); - dx_set_count(entries, count + 1); -+ - } - #endif - -@@ -753,7 +886,8 @@ static int inline search_dirblock(struct - - - static struct buffer_head * ext3_find_entry (struct dentry *dentry, -- struct ext3_dir_entry_2 ** res_dir) -+ struct ext3_dir_entry_2 ** res_dir, -+ int rwlock, void **lock) - { - struct super_block * sb; - struct buffer_head * bh_use[NAMEI_RA_SIZE]; -@@ -769,6 +903,7 @@ static struct buffer_head * ext3_find_en - int namelen; - const u8 *name; - unsigned blocksize; -+ int do_not_use_dx = 0; - - *res_dir = NULL; - sb = dir->i_sb; -@@ -777,9 +912,10 @@ static struct buffer_head * ext3_find_en - name = dentry->d_name.name; - if (namelen > EXT3_NAME_LEN) - return NULL; -+repeat: - #ifdef CONFIG_EXT3_INDEX - if (is_dx(dir)) { -- bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ bh = ext3_dx_find_entry(dentry, res_dir, &err, rwlock, lock); - /* - * On success, or if the error was file not found, - * return. Otherwise, fall back to doing a search the -@@ -788,8 +924,14 @@ static struct buffer_head * ext3_find_en - if (bh || (err != ERR_BAD_DX_DIR)) - return bh; - dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ do_not_use_dx = 1; - } - #endif -+ *lock = ext3_lock_htree(dir, 0, rwlock); -+ if (is_dx(dir) && !do_not_use_dx) { -+ ext3_unlock_htree(dir, *lock); -+ goto repeat; -+ } - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); - start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) -@@ -861,12 +1003,17 @@ cleanup_and_exit: - /* Clean up the read-ahead blocks */ - for (; ra_ptr < ra_max; ra_ptr++) - brelse (bh_use[ra_ptr]); -+ if (!ret) { -+ ext3_unlock_htree(dir, *lock); -+ *lock = NULL; -+ } - return ret; - } - - #ifdef CONFIG_EXT3_INDEX - static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -- struct ext3_dir_entry_2 **res_dir, int *err) -+ struct ext3_dir_entry_2 **res_dir, int *err, -+ int rwlock, void **lock) - { - struct super_block * sb; - struct dx_hash_info hinfo; -@@ -881,11 +1028,22 @@ static struct buffer_head * ext3_dx_find - struct inode *dir = dentry->d_parent->d_inode; - - sb = dir->i_sb; -- if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+repeat: -+ if (!(frame = dx_probe (&dentry->d_name, dir, &hinfo, frames, err))) - return NULL; -+ -+ *lock = ext3_lock_htree(dir, frame->leaf, rwlock); -+ /* while locking leaf we just found may get splitted -+ * so, we need another leaf. check this */ -+ if (!dx_check_full_path(frames, &hinfo)) { -+ ext3_unlock_htree(dir, *lock); -+ dx_release(frames); -+ goto repeat; -+ } -+ - hash = hinfo.hash; - do { -- block = dx_get_block(frame->at); -+ block = frame->leaf; - if (!(bh = ext3_bread (NULL,dir, block, 0, err))) - goto errout; - de = (struct ext3_dir_entry_2 *) bh->b_data; -@@ -919,6 +1077,8 @@ static struct buffer_head * ext3_dx_find - *err = -ENOENT; - errout: - dxtrace(printk("%s not found\n", name)); -+ ext3_unlock_htree(dir, *lock); -+ *lock = NULL; - dx_release (frames); - return NULL; - } -@@ -931,6 +1091,7 @@ static struct dentry *ext3_lookup(struct - struct ext3_dir_entry_2 * de; - struct buffer_head * bh; - struct dentry *alternate = NULL; -+ void *lock = NULL; - - if (dentry->d_name.len > EXT3_NAME_LEN) - return ERR_PTR(-ENAMETOOLONG); -@@ -938,10 +1099,11 @@ static struct dentry *ext3_lookup(struct - if (ext3_check_for_iopen(dir, dentry)) - return NULL; - -- bh = ext3_find_entry(dentry, &de); -+ bh = ext3_find_entry(dentry, &de, 0, &lock); - inode = NULL; - if (bh) { - unsigned long ino = le32_to_cpu(de->inode); -+ ext3_unlock_htree(dir, lock); - brelse (bh); - inode = iget(dir->i_sb, ino); - -@@ -984,7 +1146,8 @@ dx_move_dirents(char *from, char *to, st - unsigned rec_len = 0; - - while (count--) { -- struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ struct ext3_dir_entry_2 *de = -+ (struct ext3_dir_entry_2 *) (from + map->offs); - rec_len = EXT3_DIR_REC_LEN(de->name_len); - memcpy (to, de, rec_len); - ((struct ext3_dir_entry_2 *) to)->rec_len = rec_len; -@@ -997,7 +1160,8 @@ dx_move_dirents(char *from, char *to, st - - static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) - { -- struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ struct ext3_dir_entry_2 *next, *to, *prev; -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) base; - unsigned rec_len = 0; - - prev = to = de; -@@ -1019,7 +1183,8 @@ static struct ext3_dir_entry_2* dx_pack_ - - static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, - struct buffer_head **bh,struct dx_frame *frame, -- struct dx_hash_info *hinfo, int *error) -+ struct dx_hash_info *hinfo, void **target, -+ int *error) - { - unsigned blocksize = dir->i_sb->s_blocksize; - unsigned count, continued; -@@ -1066,23 +1231,30 @@ static struct ext3_dir_entry_2 *do_split - hash2 = map[split].hash; - continued = hash2 == map[split - 1].hash; - dxtrace(printk("Split block %i at %x, %i/%i\n", -- dx_get_block(frame->at), hash2, split, count-split)); -- -+ frame->leaf, hash2, split, count-split)); -+ - /* Fancy dance to stay within two buffers */ - de2 = dx_move_dirents(data1, data2, map + split, count - split); - de = dx_pack_dirents(data1,blocksize); - de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); - de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -- dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -- dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ dxtrace(dx_show_leaf(hinfo,(struct ext3_dir_entry_2*) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf(hinfo,(struct ext3_dir_entry_2*) data2, blocksize, 1)); - - /* Which block gets the new entry? */ -+ *target = NULL; - if (hinfo->hash >= hash2) - { - swap(*bh, bh2); - de = de2; -- } -- dx_insert_block (frame, hash2 + continued, newblock); -+ -+ /* entry will be stored into new block -+ * we have to lock it before add_dirent_to_buf */ -+ *target = ext3_lock_htree(dir, newblock, 1); -+ } -+ dx_lock_bh(frame->bh); -+ dx_insert_block (dir, frame, hash2 + continued, newblock, frame->curidx); -+ dx_unlock_bh(frame->bh); - err = ext3_journal_dirty_metadata (handle, bh2); - if (err) - goto journal_error; -@@ -1156,7 +1328,8 @@ static int add_dirent_to_buf(handle_t *h - nlen = EXT3_DIR_REC_LEN(de->name_len); - rlen = le16_to_cpu(de->rec_len); - if (de->inode) { -- struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ struct ext3_dir_entry_2 *de1 = -+ (struct ext3_dir_entry_2 *)((char *)de + nlen); - de1->rec_len = cpu_to_le16(rlen - nlen); - de->rec_len = cpu_to_le16(nlen); - de = de1; -@@ -1214,7 +1387,8 @@ static int make_indexed_dir(handle_t *ha - unsigned blocksize; - struct dx_hash_info hinfo; - u32 block; -- -+ void *lock, *new_lock; -+ - blocksize = dir->i_sb->s_blocksize; - dxtrace(printk("Creating index\n")); - retval = ext3_journal_get_write_access(handle, bh); -@@ -1225,7 +1399,6 @@ static int make_indexed_dir(handle_t *ha - } - root = (struct dx_root *) bh->b_data; - -- EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; - bh2 = ext3_append (handle, dir, &block, &retval); - if (!(bh2)) { - brelse(bh); -@@ -1233,6 +1406,8 @@ static int make_indexed_dir(handle_t *ha - } - data1 = bh2->b_data; - -+ lock = ext3_lock_htree(dir, block, 1); -+ - /* The 0th block becomes the root, move the dirents out */ - de = (struct ext3_dir_entry_2 *) &root->info; - len = ((char *) root) + blocksize - (char *) de; -@@ -1261,13 +1436,25 @@ static int make_indexed_dir(handle_t *ha - frame->entries = entries; - frame->at = entries; - frame->bh = bh; -+ frame->curidx = 0; -+ frame->leaf = 0; -+ frame[1].bh = NULL; - bh = bh2; -- de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ de = do_split(handle,dir, &bh, frame, &hinfo, &new_lock, &retval); - dx_release (frames); - if (!(de)) -- return retval; -+ goto cleanup; -+ -+ retval = add_dirent_to_buf(handle, dentry, inode, de, bh); -+cleanup: -+ if (new_lock) -+ ext3_unlock_htree(dir, new_lock); -+ /* we mark directory indexed in order to -+ * avoid races while htree being created -bzzz */ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ ext3_unlock_htree(dir, lock); - -- return add_dirent_to_buf(handle, dentry, inode, de, bh); -+ return retval; - } - #endif - -@@ -1296,11 +1483,13 @@ static int ext3_add_entry (handle_t *han - unsigned blocksize; - unsigned nlen, rlen; - u32 block, blocks; -+ void *lock; - - sb = dir->i_sb; - blocksize = sb->s_blocksize; - if (!dentry->d_name.len) - return -EINVAL; -+repeat: - #ifdef CONFIG_EXT3_INDEX - if (is_dx(dir)) { - retval = ext3_dx_add_entry(handle, dentry, inode); -@@ -1311,36 +1500,53 @@ static int ext3_add_entry (handle_t *han - ext3_mark_inode_dirty(handle, dir); - } - #endif -+ lock = ext3_lock_htree(dir, 0, 1); -+ if (is_dx(dir)) { -+ /* we got lock for block 0 -+ * probably previous holder of the lock -+ * created htree -bzzz */ -+ ext3_unlock_htree(dir, lock); -+ goto repeat; -+ } -+ - blocks = dir->i_size >> sb->s_blocksize_bits; - for (block = 0, offset = 0; block < blocks; block++) { - bh = ext3_bread(handle, dir, block, 0, &retval); -- if(!bh) -+ if(!bh) { -+ ext3_unlock_htree(dir, lock); - return retval; -+ } - retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -- if (retval != -ENOSPC) -+ if (retval != -ENOSPC) { -+ ext3_unlock_htree(dir, lock); - return retval; -+ } - - #ifdef CONFIG_EXT3_INDEX - if (blocks == 1 && !dx_fallback && -- EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -- return make_indexed_dir(handle, dentry, inode, bh); -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) { -+ retval = make_indexed_dir(handle, dentry, inode, bh); -+ ext3_unlock_htree(dir, lock); -+ return retval; -+ } - #endif - brelse(bh); - } - bh = ext3_append(handle, dir, &block, &retval); -- if (!bh) -+ if (!bh) { -+ ext3_unlock_htree(dir, lock); - return retval; -+ } - de = (struct ext3_dir_entry_2 *) bh->b_data; - de->inode = 0; - de->rec_len = cpu_to_le16(rlen = blocksize); - nlen = 0; -- return add_dirent_to_buf(handle, dentry, inode, de, bh); -+ retval = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ ext3_unlock_htree(dir, lock); -+ return retval; - } - - #ifdef CONFIG_EXT3_INDEX --/* -- * Returns 0 for success, or a negative error value -- */ - static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, - struct inode *inode) - { -@@ -1352,15 +1558,28 @@ static int ext3_dx_add_entry(handle_t *h - struct super_block * sb = dir->i_sb; - struct ext3_dir_entry_2 *de; - int err; -- -- frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ int curidx; -+ void *idx_lock, *leaf_lock, *newleaf_lock; -+ -+repeat: -+ frame = dx_probe(&dentry->d_name, dir, &hinfo, frames, &err); - if (!frame) - return err; -- entries = frame->entries; -- at = frame->at; - -- if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ /* we're going to chage leaf, so lock it first */ -+ leaf_lock = ext3_lock_htree(dir, frame->leaf, 1); -+ -+ /* while locking leaf we just found may get splitted -+ * so we need to check this */ -+ if (!dx_check_full_path(frames, &hinfo)) { -+ ext3_unlock_htree(dir, leaf_lock); -+ dx_release(frames); -+ goto repeat; -+ } -+ if (!(bh = ext3_bread(handle,dir, frame->leaf, 0, &err))) { -+ printk("can't ext3_bread(%d) = %d\n", (int) frame->leaf, err); - goto cleanup; -+ } - - BUFFER_TRACE(bh, "get_write_access"); - err = ext3_journal_get_write_access(handle, bh); -@@ -1373,6 +1592,35 @@ static int ext3_dx_add_entry(handle_t *h - goto cleanup; - } - -+ /* our leaf has no enough space. hence, we have to -+ * split it. so lock index for this leaf first */ -+ curidx = frame->curidx; -+ idx_lock = ext3_lock_htree(dir, curidx, 1); -+ -+ /* now check did path get changed? */ -+ dx_release(frames); -+ -+ frame = dx_probe(&dentry->d_name, dentry->d_parent->d_inode, -+ &hinfo, frames, &err); -+ if (!frame) { -+ /* FIXME: error handling here */ -+ brelse(bh); -+ ext3_unlock_htree(dir, idx_lock); -+ return err; -+ } -+ -+ if (frame->curidx != curidx) { -+ /* path has been changed. we have to drop old lock -+ * and repeat */ -+ brelse(bh); -+ ext3_unlock_htree(dir, idx_lock); -+ ext3_unlock_htree(dir, leaf_lock); -+ dx_release(frames); -+ goto repeat; -+ } -+ entries = frame->entries; -+ at = frame->at; -+ - /* Block full, should compress but for now just split */ - dxtrace(printk("using %u of %u node entries\n", - dx_get_count(entries), dx_get_limit(entries))); -@@ -1384,7 +1632,8 @@ static int ext3_dx_add_entry(handle_t *h - struct dx_entry *entries2; - struct dx_node *node2; - struct buffer_head *bh2; -- -+ void *nb_lock; -+ - if (levels && (dx_get_count(frames->entries) == - dx_get_limit(frames->entries))) { - ext3_warning(sb, __FUNCTION__, -@@ -1395,6 +1644,7 @@ static int ext3_dx_add_entry(handle_t *h - bh2 = ext3_append (handle, dir, &newblock, &err); - if (!(bh2)) - goto cleanup; -+ nb_lock = ext3_lock_htree(dir, newblock, 1); - node2 = (struct dx_node *)(bh2->b_data); - entries2 = node2->entries; - node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -@@ -1406,27 +1656,73 @@ static int ext3_dx_add_entry(handle_t *h - if (levels) { - unsigned icount1 = icount/2, icount2 = icount - icount1; - unsigned hash2 = dx_get_hash(entries + icount1); -+ void *ri_lock; -+ -+ /* we have to protect root htree index against -+ * another dx_add_entry() which would want to -+ * split it too -bzzz */ -+ ri_lock = ext3_lock_htree(dir, 0, 1); -+ -+ /* as root index block blocked we must repeat -+ * searching for current position of our 2nd index -bzzz */ -+ dx_lock_bh(frame->bh); -+ frames->at = dx_find_position(frames->entries, hinfo.hash); -+ dx_unlock_bh(frame->bh); -+ - dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -- -- BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); - err = ext3_journal_get_write_access(handle, - frames[0].bh); - if (err) - goto journal_error; -- -+ -+ /* copy index into new one */ - memcpy ((char *) entries2, (char *) (entries + icount1), - icount2 * sizeof(struct dx_entry)); -- dx_set_count (entries, icount1); - dx_set_count (entries2, icount2); - dx_set_limit (entries2, dx_node_limit(dir)); - - /* Which index block gets the new entry? */ - if (at - entries >= icount1) { -+ /* unlock index we won't use */ -+ ext3_unlock_htree(dir, idx_lock); -+ idx_lock = nb_lock; - frame->at = at = at - entries - icount1 + entries2; -- frame->entries = entries = entries2; -+ frame->entries = entries2; -+ frame->curidx = curidx = newblock; - swap(frame->bh, bh2); -+ } else { -+ /* we'll use old index,so new one may be freed */ -+ ext3_unlock_htree(dir, nb_lock); - } -- dx_insert_block (frames + 0, hash2, newblock); -+ -+ /* NOTE: very subtle piece of code -+ * competing dx_probe() may find 2nd level index in root -+ * index, then we insert new index here and set new count -+ * in that 2nd level index. so, dx_probe() may see 2nd -+ * level index w/o hash it looks for. the solution is -+ * to check root index after we locked just founded 2nd -+ * level index -bzzz */ -+ dx_lock_bh(frames[0].bh); -+ dx_insert_block (dir, frames + 0, hash2, newblock, 0); -+ dx_unlock_bh(frames[0].bh); -+ -+ /* now old and new 2nd level index blocks contain -+ * all pointers, so dx_probe() may find it in the both. -+ * it's OK -bzzz */ -+ -+ dx_lock_bh(frame->bh); -+ dx_set_count(entries, icount1); -+ dx_unlock_bh(frame->bh); -+ -+ /* now old 2nd level index block points to first half -+ * of leafs. it's importand that dx_probe() must -+ * check root index block for changes under -+ * dx_lock_bh(frame->bh) -bzzz */ -+ -+ ext3_unlock_htree(dir, ri_lock); -+ - dxtrace(dx_show_index ("node", frames[1].entries)); - dxtrace(dx_show_index ("node", - ((struct dx_node *) bh2->b_data)->entries)); -@@ -1435,38 +1731,61 @@ static int ext3_dx_add_entry(handle_t *h - goto journal_error; - brelse (bh2); - } else { -+ unsigned long leaf = frame->leaf; -+ - dxtrace(printk("Creating second level index...\n")); - memcpy((char *) entries2, (char *) entries, - icount * sizeof(struct dx_entry)); - dx_set_limit(entries2, dx_node_limit(dir)); - - /* Set up root */ -+ dx_lock_bh(frames[0].bh); - dx_set_count(entries, 1); - dx_set_block(entries + 0, newblock); - ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ dx_unlock_bh(frames[0].bh); - - /* Add new access path frame */ - frame = frames + 1; - frame->at = at = at - entries + entries2; - frame->entries = entries = entries2; - frame->bh = bh2; -+ frame->curidx = newblock; -+ frame->leaf = leaf; - err = ext3_journal_get_write_access(handle, - frame->bh); - if (err) - goto journal_error; -+ -+ /* first level index was root. it's already initialized */ -+ /* we my unlock it now */ -+ ext3_unlock_htree(dir, idx_lock); -+ -+ /* current index is just created 2nd level index */ -+ curidx = newblock; -+ idx_lock = nb_lock; - } - ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ de = do_split(handle, dir, &bh, frame, &hinfo, &newleaf_lock, &err); - if (!de) - goto cleanup; -+ -+ /* index splitted */ -+ ext3_unlock_htree(dir, idx_lock); -+ - err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ -+ if (newleaf_lock) -+ ext3_unlock_htree(dir, newleaf_lock); -+ - bh = 0; - goto cleanup; - - journal_error: - ext3_std_error(dir->i_sb, err); - cleanup: -+ ext3_unlock_htree(dir, leaf_lock); - if (bh) - brelse(bh); - dx_release(frames); -@@ -1899,6 +2218,7 @@ static int ext3_rmdir (struct inode * di - struct buffer_head * bh; - struct ext3_dir_entry_2 * de; - handle_t *handle; -+ void *lock; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); - if (IS_ERR(handle)) { -@@ -1906,7 +2226,7 @@ static int ext3_rmdir (struct inode * di - } - - retval = -ENOENT; -- bh = ext3_find_entry (dentry, &de); -+ bh = ext3_find_entry (dentry, &de, 1, &lock); - if (!bh) - goto end_rmdir; - -@@ -1917,14 +2237,19 @@ static int ext3_rmdir (struct inode * di - DQUOT_INIT(inode); - - retval = -EIO; -- if (le32_to_cpu(de->inode) != inode->i_ino) -+ if (le32_to_cpu(de->inode) != inode->i_ino) { -+ ext3_unlock_htree(dir, lock); - goto end_rmdir; -+ } - - retval = -ENOTEMPTY; -- if (!empty_dir (inode)) -+ if (!empty_dir (inode)) { -+ ext3_unlock_htree(dir, lock); - goto end_rmdir; -+ } - - retval = ext3_delete_entry(handle, dir, de, bh); -+ ext3_unlock_htree(dir, lock); - if (retval) - goto end_rmdir; - if (inode->i_nlink != 2) -@@ -1957,6 +2282,7 @@ static int ext3_unlink(struct inode * di - struct buffer_head * bh; - struct ext3_dir_entry_2 * de; - handle_t *handle; -+ void *lock; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); - if (IS_ERR(handle)) { -@@ -1967,7 +2293,7 @@ static int ext3_unlink(struct inode * di - handle->h_sync = 1; - - retval = -ENOENT; -- bh = ext3_find_entry (dentry, &de); -+ bh = ext3_find_entry (dentry, &de, 1, &lock); - if (!bh) - goto end_unlink; - -@@ -1975,8 +2301,10 @@ static int ext3_unlink(struct inode * di - DQUOT_INIT(inode); - - retval = -EIO; -- if (le32_to_cpu(de->inode) != inode->i_ino) -+ if (le32_to_cpu(de->inode) != inode->i_ino) { -+ ext3_unlock_htree(dir, lock); - goto end_unlink; -+ } - - if (!inode->i_nlink) { - ext3_warning (inode->i_sb, "ext3_unlink", -@@ -1985,6 +2313,7 @@ static int ext3_unlink(struct inode * di - inode->i_nlink = 1; - } - retval = ext3_delete_entry(handle, dir, de, bh); -+ ext3_unlock_htree(dir, lock); - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -@@ -2106,6 +2435,7 @@ static int ext3_rename (struct inode * o - struct buffer_head * old_bh, * new_bh, * dir_bh; - struct ext3_dir_entry_2 * old_de, * new_de; - int retval; -+ void *lock1 = NULL, *lock2 = NULL, *lock3 = NULL; - - old_bh = new_bh = dir_bh = NULL; - -@@ -2118,7 +2448,10 @@ static int ext3_rename (struct inode * o - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; - -- old_bh = ext3_find_entry (old_dentry, &old_de); -+ if (old_dentry->d_parent == new_dentry->d_parent) -+ down(&EXT3_I(old_dentry->d_parent->d_inode)->i_rename_sem); -+ -+ old_bh = ext3_find_entry (old_dentry, &old_de, 1, &lock1 /* FIXME */); - /* - * Check for inode number is _not_ due to possible IO errors. - * We might rmdir the source, keep it as pwd of some process -@@ -2131,7 +2464,7 @@ static int ext3_rename (struct inode * o - goto end_rename; - - new_inode = new_dentry->d_inode; -- new_bh = ext3_find_entry (new_dentry, &new_de); -+ new_bh = ext3_find_entry (new_dentry, &new_de, 1, &lock2 /* FIXME */); - if (new_bh) { - if (!new_inode) { - brelse (new_bh); -@@ -2194,7 +2527,7 @@ static int ext3_rename (struct inode * o - struct buffer_head *old_bh2; - struct ext3_dir_entry_2 *old_de2; - -- old_bh2 = ext3_find_entry(old_dentry, &old_de2); -+ old_bh2 = ext3_find_entry(old_dentry, &old_de2, 1, &lock3 /* FIXME */); - if (old_bh2) { - retval = ext3_delete_entry(handle, old_dir, - old_de2, old_bh2); -@@ -2237,6 +2570,14 @@ static int ext3_rename (struct inode * o - retval = 0; - - end_rename: -+ if (lock1) -+ ext3_unlock_htree(old_dentry->d_parent->d_inode, lock1); -+ if (lock2) -+ ext3_unlock_htree(new_dentry->d_parent->d_inode, lock2); -+ if (lock3) -+ ext3_unlock_htree(old_dentry->d_parent->d_inode, lock3); -+ if (old_dentry->d_parent == new_dentry->d_parent) -+ up(&EXT3_I(old_dentry->d_parent->d_inode)->i_rename_sem); - brelse (dir_bh); - brelse (old_bh); - brelse (new_bh); -@@ -2245,6 +2586,29 @@ end_rename: - } - - /* -+ * this locking primitives are used to protect parts -+ * of dir's htree. protection unit is block: leaf or index -+ */ -+static inline void *ext3_lock_htree(struct inode *dir, -+ unsigned long value, int rwlock) -+{ -+ void *lock; -+ -+ if (!test_opt(dir->i_sb, PDIROPS)) -+ return NULL; -+ lock = dynlock_lock(&EXT3_I(dir)->i_htree_lock, value, 1, GFP_KERNEL); -+ return lock; -+} -+ -+static inline void ext3_unlock_htree(struct inode *dir, -+ void *lock) -+{ -+ if (!test_opt(dir->i_sb, PDIROPS) || !lock) -+ return; -+ dynlock_unlock(&EXT3_I(dir)->i_htree_lock, lock); -+} -+ -+/* - * directories can handle most operations... - */ - struct inode_operations ext3_dir_inode_operations = { ---- linux-2.4.18/fs/ext3/super.c~ext3-pdirops-2.4.18-chaos 2003-09-01 16:33:25.000000000 +0400 -+++ linux-2.4.18-alexey/fs/ext3/super.c 2003-09-02 12:46:29.000000000 +0400 -@@ -786,6 +786,8 @@ static int parse_options (char * options - return 0; - } - } -+ else if (!strcmp (this_char, "pdirops")) -+ set_opt (sbi->s_mount_opt, PDIROPS); - else if (!strcmp (this_char, "grpid") || - !strcmp (this_char, "bsdgroups")) - set_opt (*mount_options, GRPID); -@@ -812,6 +814,9 @@ static int parse_options (char * options - if (want_numeric(value, "sb", sb_block)) - return 0; - } -+ else if (!strcmp (this_char, "pdirops")) { -+ set_opt (sbi->s_mount_opt, PDIROPS); -+ } - #ifdef CONFIG_JBD_DEBUG - else if (!strcmp (this_char, "ro-after")) { - unsigned long v; -@@ -969,6 +974,10 @@ static int ext3_setup_super(struct super - ext3_check_inodes_bitmap (sb); - } - #endif -+#ifdef S_PDIROPS -+ if (test_opt (sb, PDIROPS)) -+ sb->s_flags |= S_PDIROPS; -+#endif - setup_ro_after(sb); - return res; - } -@@ -1463,6 +1472,11 @@ struct super_block * ext3_read_super (st - test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": - "writeback"); - -+ if (test_opt(sb, PDIROPS)) { -+ printk (KERN_INFO "EXT3-fs: mounted filesystem with parallel dirops\n"); -+ sb->s_flags |= S_PDIROPS; -+ } -+ - return sb; - - failed_mount3: ---- linux-2.4.18/include/linux/ext3_fs.h~ext3-pdirops-2.4.18-chaos 2003-09-01 14:58:06.000000000 +0400 -+++ linux-2.4.18-alexey/include/linux/ext3_fs.h 2003-09-02 11:46:15.000000000 +0400 -@@ -310,6 +310,7 @@ struct ext3_inode { - /* - * Mount flags - */ -+#define EXT3_MOUNT_PDIROPS 0x800000/* Parallel dir operations */ - #define EXT3_MOUNT_CHECK 0x0001 /* Do mount-time checks */ - #define EXT3_MOUNT_GRPID 0x0004 /* Create files with directory's group */ - #define EXT3_MOUNT_DEBUG 0x0008 /* Some debugging messages */ ---- linux-2.4.18/include/linux/ext3_fs_i.h~ext3-pdirops-2.4.18-chaos 2003-08-29 11:57:30.000000000 +0400 -+++ linux-2.4.18-alexey/include/linux/ext3_fs_i.h 2003-09-02 11:46:15.000000000 +0400 -@@ -17,6 +17,7 @@ - #define _LINUX_EXT3_FS_I - - #include <linux/rwsem.h> -+#include <linux/dynlocks.h> - - /* - * second extended file system inode data in memory -@@ -73,6 +74,11 @@ struct ext3_inode_info { - * by other means, so we have truncate_sem. - */ - struct rw_semaphore truncate_sem; -+ -+ /* following fields for parallel directory operations -bzzz */ -+ struct dynlock i_htree_lock; -+ struct semaphore i_append_sem; -+ struct semaphore i_rename_sem; - }; - - #endif /* _LINUX_EXT3_FS_I */ ---- linux-2.4.18/fs/ext3/inode.c~ext3-pdirops-2.4.18-chaos 2003-09-01 16:33:25.000000000 +0400 -+++ linux-2.4.18-alexey/fs/ext3/inode.c 2003-09-02 11:46:15.000000000 +0400 -@@ -2454,6 +2454,9 @@ void ext3_read_inode(struct inode * inod - } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -+ dynlock_init(&EXT3_I(inode)->i_htree_lock); -+ sema_init(&EXT3_I(inode)->i_rename_sem, 1); -+ sema_init(&EXT3_I(inode)->i_append_sem, 1); - } else if (S_ISLNK(inode->i_mode)) { - if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; ---- linux-2.4.18/fs/ext3/ialloc.c~ext3-pdirops-2.4.18-chaos 2003-09-01 14:58:05.000000000 +0400 -+++ linux-2.4.18-alexey/fs/ext3/ialloc.c 2003-09-02 11:46:15.000000000 +0400 -@@ -601,6 +601,9 @@ repeat: - return ERR_PTR(-EDQUOT); - } - ext3_debug ("allocating inode %lu\n", inode->i_ino); -+ dynlock_init(&EXT3_I(inode)->i_htree_lock); -+ sema_init(&EXT3_I(inode)->i_rename_sem, 1); -+ sema_init(&EXT3_I(inode)->i_append_sem, 1); - return inode; - - fail: - -_ diff --git a/lustre/kernel_patches/patches/ext3-pdirops-2.4.20.patch b/lustre/kernel_patches/patches/ext3-pdirops-2.4.20.patch deleted file mode 100644 index f1e3a6668b..0000000000 --- a/lustre/kernel_patches/patches/ext3-pdirops-2.4.20.patch +++ /dev/null @@ -1,1268 +0,0 @@ - fs/ext3/ialloc.c | 3 - fs/ext3/inode.c | 3 - fs/ext3/namei.c | 582 +++++++++++++++++++++++++++++++++++++--------- - fs/ext3/super.c | 14 + - include/linux/ext3_fs.h | 1 - include/linux/ext3_fs_i.h | 6 - 6 files changed, 500 insertions(+), 109 deletions(-) - -Index: linux-2.4.20/fs/ext3/namei.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/namei.c 2004-05-20 22:47:06.000000000 +0400 -+++ linux-2.4.20/fs/ext3/namei.c 2004-05-20 23:17:37.000000000 +0400 -@@ -51,6 +51,9 @@ - { - struct buffer_head *bh; - -+ /* with parallel dir operations all appends -+ * have to be serialized -bzzz */ -+ down(&EXT3_I(inode)->i_append_sem); - *block = inode->i_size >> inode->i_sb->s_blocksize_bits; - - if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -@@ -58,6 +61,8 @@ - EXT3_I(inode)->i_disksize = inode->i_size; - ext3_journal_get_write_access(handle,bh); - } -+ up(&EXT3_I(inode)->i_append_sem); -+ - return bh; - } - -@@ -134,6 +139,8 @@ - struct buffer_head *bh; - struct dx_entry *entries; - struct dx_entry *at; -+ unsigned long leaf; -+ unsigned int curidx; - }; - - struct dx_map_entry -@@ -142,6 +149,30 @@ - u32 offs; - }; - -+/* FIXME: this should be reworked using bb_spin_lock -+ * introduced in -mm tree -+ */ -+#define BH_DXLock 25 -+ -+static inline void dx_lock_bh(struct buffer_head volatile *bh) -+{ -+#ifdef CONFIG_SMP -+ while (test_and_set_bit(BH_DXLock, &bh->b_state)) { -+ while (test_bit(BH_DXLock, &bh->b_state)) -+ cpu_relax(); -+ } -+#endif -+} -+ -+static inline void dx_unlock_bh(struct buffer_head *bh) -+{ -+#ifdef CONFIG_SMP -+ smp_mb__before_clear_bit(); -+ clear_bit(BH_DXLock, &bh->b_state); -+#endif -+} -+ -+ - #ifdef CONFIG_EXT3_INDEX - static inline unsigned dx_get_block (struct dx_entry *entry); - static void dx_set_block (struct dx_entry *entry, unsigned value); -@@ -153,7 +184,7 @@ - static void dx_set_limit (struct dx_entry *entries, unsigned value); - static unsigned dx_root_limit (struct inode *dir, unsigned infosize); - static unsigned dx_node_limit (struct inode *dir); --static struct dx_frame *dx_probe(struct dentry *dentry, -+static struct dx_frame *dx_probe(struct qstr *name, - struct inode *dir, - struct dx_hash_info *hinfo, - struct dx_frame *frame, -@@ -165,15 +196,18 @@ - static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, - struct dx_map_entry *offsets, int count); - static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); --static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); -+static void dx_insert_block (struct inode *, struct dx_frame *, u32, u32, u32); - static int ext3_htree_next_block(struct inode *dir, __u32 hash, - struct dx_frame *frame, - struct dx_frame *frames, int *err, - __u32 *start_hash); - static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -- struct ext3_dir_entry_2 **res_dir, int *err); -+ struct ext3_dir_entry_2 **res_dir, int *err, -+ int rwlock, void **lock); - static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, - struct inode *inode); -+static inline void *ext3_lock_htree(struct inode *, unsigned long, int); -+static inline void ext3_unlock_htree(struct inode *, void *); - - /* - * Future: use high four bits of block for coalesce-on-delete flags -@@ -306,6 +340,94 @@ - #endif /* DX_DEBUG */ - - /* -+ * dx_find_position -+ * -+ * search position of specified hash in index -+ * -+ */ -+ -+struct dx_entry * dx_find_position(struct dx_entry * entries, u32 hash) -+{ -+ struct dx_entry *p, *q, *m; -+ int count; -+ -+ count = dx_get_count(entries); -+ p = entries + 1; -+ q = entries + count - 1; -+ while (p <= q) -+ { -+ m = p + (q - p)/2; -+ if (dx_get_hash(m) > hash) -+ q = m - 1; -+ else -+ p = m + 1; -+ } -+ return p - 1; -+} -+ -+/* -+ * returns 1 if path is unchanged -+ */ -+int dx_check_path(struct dx_frame *frame, u32 hash) -+{ -+ struct dx_entry *p; -+ int ret = 1; -+ -+ dx_lock_bh(frame->bh); -+ p = dx_find_position(frame->entries, hash); -+ if (frame->leaf != dx_get_block(p)) -+ ret = 0; -+ dx_unlock_bh(frame->bh); -+ -+ return ret; -+} -+ -+/* -+ * 0 - changed -+ * 1 - hasn't changed -+ */ -+static int -+dx_check_full_path(struct dx_frame *frames, struct dx_hash_info *hinfo) -+{ -+ struct dx_entry *p; -+ struct dx_frame *frame = frames; -+ u32 leaf; -+ -+ /* check first level */ -+ dx_lock_bh(frame->bh); -+ p = dx_find_position(frame->entries, hinfo->hash); -+ leaf = dx_get_block(p); -+ dx_unlock_bh(frame->bh); -+ -+ if (leaf != frame->leaf) -+ return 0; -+ -+ /* is there 2nd level? */ -+ frame++; -+ if (frame->bh == NULL) -+ return 1; -+ -+ /* check second level */ -+ dx_lock_bh(frame->bh); -+ -+ /* probably 1st level got changed, check it */ -+ if (!dx_check_path(frames, hinfo->hash)) { -+ /* path changed */ -+ dx_unlock_bh(frame->bh); -+ return 0; -+ } -+ -+ p = dx_find_position(frame->entries, hinfo->hash); -+ leaf = dx_get_block(p); -+ dx_unlock_bh(frame->bh); -+ -+ if (leaf != frame->leaf) -+ return 0; -+ -+ return 1; -+} -+ -+/* - * Probe for a directory leaf block to search. - * - * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -@@ -315,19 +437,20 @@ - * back to userspace. - */ - static struct dx_frame * --dx_probe(struct dentry *dentry, struct inode *dir, -+dx_probe(struct qstr *name, struct inode *dir, - struct dx_hash_info *hinfo, struct dx_frame *frame_in, int *err) - { -- unsigned count, indirect; -- struct dx_entry *at, *entries, *p, *q, *m; -+ unsigned indirect; -+ struct dx_entry *at, *entries; - struct dx_root *root; - struct buffer_head *bh; - struct dx_frame *frame = frame_in; - u32 hash; -+ unsigned int curidx; - - frame->bh = NULL; -- if (dentry) -- dir = dentry->d_parent->d_inode; -+ frame[1].bh = NULL; -+ - if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) - goto fail; - root = (struct dx_root *) bh->b_data; -@@ -343,8 +466,8 @@ - } - hinfo->hash_version = root->info.hash_version; - hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; -- if (dentry) -- ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); -+ if (name) -+ ext3fs_dirhash(name->name, name->len, hinfo); - hash = hinfo->hash; - - if (root->info.unused_flags & 1) { -@@ -356,7 +479,19 @@ - goto fail; - } - -+repeat: -+ curidx = 0; -+ entries = (struct dx_entry *) (((char *)&root->info) + -+ root->info.info_length); -+ assert(dx_get_limit(entries) == dx_root_limit(dir, -+ root->info.info_length)); -+ dxtrace (printk("Look up %x", hash)); -+ dx_lock_bh(bh); -+ /* indirect must be initialized under bh lock because -+ * 2nd level creation procedure may change it and dx_probe() -+ * will suggest htree is still single-level -bzzz */ - if ((indirect = root->info.indirect_levels) > 1) { -+ dx_unlock_bh(bh); - ext3_warning(dir->i_sb, __FUNCTION__, - "Unimplemented inode hash depth: %#06x", - root->info.indirect_levels); -@@ -364,56 +499,46 @@ - *err = ERR_BAD_DX_DIR; - goto fail; - } -- -- entries = (struct dx_entry *) (((char *)&root->info) + -- root->info.info_length); -- assert(dx_get_limit(entries) == dx_root_limit(dir, -- root->info.info_length)); -- dxtrace (printk("Look up %x", hash)); -+ - while (1) - { -- count = dx_get_count(entries); -- assert (count && count <= dx_get_limit(entries)); -- p = entries + 1; -- q = entries + count - 1; -- while (p <= q) -- { -- m = p + (q - p)/2; -- dxtrace(printk(".")); -- if (dx_get_hash(m) > hash) -- q = m - 1; -- else -- p = m + 1; -- } -- -- if (0) // linear search cross check -- { -- unsigned n = count - 1; -- at = entries; -- while (n--) -- { -- dxtrace(printk(",")); -- if (dx_get_hash(++at) > hash) -- { -- at--; -- break; -- } -- } -- assert (at == p - 1); -- } -- -- at = p - 1; -- dxtrace(printk(" %x->%u\n", at == entries? 0: dx_get_hash(at), dx_get_block(at))); -+ at = dx_find_position(entries, hinfo->hash); -+ dxtrace(printk(" %x->%u\n", -+ at == entries? 0: dx_get_hash(at), -+ dx_get_block(at))); - frame->bh = bh; - frame->entries = entries; - frame->at = at; -- if (!indirect--) return frame; -- if (!(bh = ext3_bread (NULL,dir, dx_get_block(at), 0, err))) -+ frame->curidx = curidx; -+ frame->leaf = dx_get_block(at); -+ if (!indirect--) { -+ dx_unlock_bh(bh); -+ return frame; -+ } -+ -+ /* step into next htree level */ -+ curidx = dx_get_block(at); -+ dx_unlock_bh(bh); -+ if (!(bh = ext3_bread (NULL,dir, frame->leaf, 0, err))) - goto fail2; -+ -+ dx_lock_bh(bh); -+ /* splitting may change root index block and move -+ * hash we're looking for into another index block -+ * so, we have to check this situation and repeat -+ * from begining if path got changed -bzzz */ -+ if (!dx_check_path(frame, hash)) { -+ dx_unlock_bh(bh); -+ bh = frame->bh; -+ indirect++; -+ goto repeat; -+ } -+ - at = entries = ((struct dx_node *) bh->b_data)->entries; - assert (dx_get_limit(entries) == dx_node_limit (dir)); - frame++; - } -+ dx_unlock_bh(bh); - fail2: - while (frame >= frame_in) { - brelse(frame->bh); -@@ -427,8 +552,7 @@ - { - if (frames[0].bh == NULL) - return; -- -- if (((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels) -+ if (frames[1].bh != NULL) - brelse(frames[1].bh); - brelse(frames[0].bh); - } -@@ -470,8 +594,10 @@ - * nodes need to be read. - */ - while (1) { -- if (++(p->at) < p->entries + dx_get_count(p->entries)) -+ if (++(p->at) < p->entries + dx_get_count(p->entries)) { -+ p->leaf = dx_get_block(p->at); - break; -+ } - if (p == frames) - return 0; - num_frames++; -@@ -497,13 +623,17 @@ - * block so no check is necessary - */ - while (num_frames--) { -- if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -- 0, err))) -+ u32 idx; -+ -+ idx = p->leaf = dx_get_block(p->at); -+ if (!(bh = ext3_bread(NULL, dir, idx, 0, err))) - return -1; /* Failure */ - p++; - brelse (p->bh); - p->bh = bh; - p->at = p->entries = ((struct dx_node *) bh->b_data)->entries; -+ p->curidx = idx; -+ p->leaf = dx_get_block(p->at); - } - return 1; - } -@@ -543,7 +673,7 @@ - dir = dir_file->f_dentry->d_inode; - hinfo.hash = start_hash; - hinfo.minor_hash = 0; -- frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); -+ frame = dx_probe(NULL, dir_file->f_dentry->d_inode, &hinfo, frames, &err); - if (!frame) - return err; - -@@ -625,7 +755,8 @@ - count++; - } - /* XXX: do we need to check rec_len == 0 case? -Chris */ -- de = (struct ext3_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); -+ de = (struct ext3_dir_entry_2 *)((char*)de + -+ le16_to_cpu(de->rec_len)); - } - return count; - } -@@ -658,7 +789,8 @@ - } while(more); - } - --static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) -+static void dx_insert_block(struct inode *dir, struct dx_frame *frame, -+ u32 hash, u32 block, u32 idx) - { - struct dx_entry *entries = frame->entries; - struct dx_entry *old = frame->at, *new = old + 1; -@@ -670,6 +802,7 @@ - dx_set_hash(new, hash); - dx_set_block(new, block); - dx_set_count(entries, count + 1); -+ - } - #endif - -@@ -752,7 +885,8 @@ - - - static struct buffer_head * ext3_find_entry (struct dentry *dentry, -- struct ext3_dir_entry_2 ** res_dir) -+ struct ext3_dir_entry_2 ** res_dir, -+ int rwlock, void **lock) - { - struct super_block * sb; - struct buffer_head * bh_use[NAMEI_RA_SIZE]; -@@ -768,6 +902,7 @@ - int namelen; - const u8 *name; - unsigned blocksize; -+ int do_not_use_dx = 0; - - *res_dir = NULL; - sb = dir->i_sb; -@@ -776,9 +911,10 @@ - name = dentry->d_name.name; - if (namelen > EXT3_NAME_LEN) - return NULL; -+repeat: - #ifdef CONFIG_EXT3_INDEX - if (is_dx(dir)) { -- bh = ext3_dx_find_entry(dentry, res_dir, &err); -+ bh = ext3_dx_find_entry(dentry, res_dir, &err, rwlock, lock); - /* - * On success, or if the error was file not found, - * return. Otherwise, fall back to doing a search the -@@ -787,8 +923,14 @@ - if (bh || (err != ERR_BAD_DX_DIR)) - return bh; - dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); -+ do_not_use_dx = 1; - } - #endif -+ *lock = ext3_lock_htree(dir, 0, rwlock); -+ if (is_dx(dir) && !do_not_use_dx) { -+ ext3_unlock_htree(dir, *lock); -+ goto repeat; -+ } - nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); - start = EXT3_I(dir)->i_dir_start_lookup; - if (start >= nblocks) -@@ -859,12 +1001,17 @@ - /* Clean up the read-ahead blocks */ - for (; ra_ptr < ra_max; ra_ptr++) - brelse (bh_use[ra_ptr]); -+ if (!ret) { -+ ext3_unlock_htree(dir, *lock); -+ *lock = NULL; -+ } - return ret; - } - - #ifdef CONFIG_EXT3_INDEX - static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, -- struct ext3_dir_entry_2 **res_dir, int *err) -+ struct ext3_dir_entry_2 **res_dir, int *err, -+ int rwlock, void **lock) - { - struct super_block * sb; - struct dx_hash_info hinfo; -@@ -879,11 +1026,22 @@ - struct inode *dir = dentry->d_parent->d_inode; - - sb = dir->i_sb; -- if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) -+repeat: -+ if (!(frame = dx_probe (&dentry->d_name, dir, &hinfo, frames, err))) - return NULL; -+ -+ *lock = ext3_lock_htree(dir, frame->leaf, rwlock); -+ /* while locking leaf we just found may get splitted -+ * so, we need another leaf. check this */ -+ if (!dx_check_full_path(frames, &hinfo)) { -+ ext3_unlock_htree(dir, *lock); -+ dx_release(frames); -+ goto repeat; -+ } -+ - hash = hinfo.hash; - do { -- block = dx_get_block(frame->at); -+ block = frame->leaf; - if (!(bh = ext3_bread (NULL,dir, block, 0, err))) - goto errout; - de = (struct ext3_dir_entry_2 *) bh->b_data; -@@ -917,6 +1075,8 @@ - *err = -ENOENT; - errout: - dxtrace(printk("%s not found\n", name)); -+ ext3_unlock_htree(dir, *lock); -+ *lock = NULL; - dx_release (frames); - return NULL; - } -@@ -927,6 +1087,7 @@ - struct inode * inode; - struct ext3_dir_entry_2 * de; - struct buffer_head * bh; -+ void *lock = NULL; - - if (dentry->d_name.len > EXT3_NAME_LEN) - return ERR_PTR(-ENAMETOOLONG); -@@ -934,10 +1095,11 @@ - if (ext3_check_for_iopen(dir, dentry)) - return NULL; - -- bh = ext3_find_entry(dentry, &de); -+ bh = ext3_find_entry(dentry, &de, 0, &lock); - inode = NULL; - if (bh) { - unsigned long ino = le32_to_cpu(de->inode); -+ ext3_unlock_htree(dir, lock); - brelse (bh); - inode = iget(dir->i_sb, ino); - -@@ -956,6 +1118,7 @@ - struct buffer_head *bh; - struct dentry parent; - struct dentry dentry; -+ void *lock; - - if (len > EXT3_NAME_LEN) - return -ENAMETOOLONG; -@@ -965,9 +1128,10 @@ - dentry.d_name.name = name; - dentry.d_name.len = len; - -- bh = ext3_find_entry(&dentry, &de); -+ bh = ext3_find_entry(&dentry, &de, 0, &lock); - if (bh) { - unsigned long ino = le32_to_cpu(de->inode); -+ ext3_unlock_htree(dir, lock); - brelse (bh); - if (data) - *data = ino; -@@ -1002,7 +1166,8 @@ - unsigned rec_len = 0; - - while (count--) { -- struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) (from + map->offs); -+ struct ext3_dir_entry_2 *de = -+ (struct ext3_dir_entry_2 *) (from + map->offs); - rec_len = EXT3_DIR_REC_LEN(de->name_len); - memcpy (to, de, rec_len); - ((struct ext3_dir_entry_2 *) to)->rec_len = rec_len; -@@ -1015,7 +1180,8 @@ - - static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) - { -- struct ext3_dir_entry_2 *next, *to, *prev, *de = (struct ext3_dir_entry_2 *) base; -+ struct ext3_dir_entry_2 *next, *to, *prev; -+ struct ext3_dir_entry_2 *de = (struct ext3_dir_entry_2 *) base; - unsigned rec_len = 0; - - prev = to = de; -@@ -1037,7 +1203,8 @@ - - static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, - struct buffer_head **bh,struct dx_frame *frame, -- struct dx_hash_info *hinfo, int *error) -+ struct dx_hash_info *hinfo, void **target, -+ int *error) - { - unsigned blocksize = dir->i_sb->s_blocksize; - unsigned count, continued; -@@ -1084,23 +1251,30 @@ - hash2 = map[split].hash; - continued = hash2 == map[split - 1].hash; - dxtrace(printk("Split block %i at %x, %i/%i\n", -- dx_get_block(frame->at), hash2, split, count-split)); -- -+ frame->leaf, hash2, split, count-split)); -+ - /* Fancy dance to stay within two buffers */ - de2 = dx_move_dirents(data1, data2, map + split, count - split); - de = dx_pack_dirents(data1,blocksize); - de->rec_len = cpu_to_le16(data1 + blocksize - (char *) de); - de2->rec_len = cpu_to_le16(data2 + blocksize - (char *) de2); -- dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data1, blocksize, 1)); -- dxtrace(dx_show_leaf (hinfo, (struct ext3_dir_entry_2 *) data2, blocksize, 1)); -+ dxtrace(dx_show_leaf(hinfo,(struct ext3_dir_entry_2*) data1, blocksize, 1)); -+ dxtrace(dx_show_leaf(hinfo,(struct ext3_dir_entry_2*) data2, blocksize, 1)); - - /* Which block gets the new entry? */ -+ *target = NULL; - if (hinfo->hash >= hash2) - { - swap(*bh, bh2); - de = de2; -- } -- dx_insert_block (frame, hash2 + continued, newblock); -+ -+ /* entry will be stored into new block -+ * we have to lock it before add_dirent_to_buf */ -+ *target = ext3_lock_htree(dir, newblock, 1); -+ } -+ dx_lock_bh(frame->bh); -+ dx_insert_block (dir, frame, hash2 + continued, newblock, frame->curidx); -+ dx_unlock_bh(frame->bh); - err = ext3_journal_dirty_metadata (handle, bh2); - if (err) - goto journal_error; -@@ -1174,7 +1348,8 @@ - nlen = EXT3_DIR_REC_LEN(de->name_len); - rlen = le16_to_cpu(de->rec_len); - if (de->inode) { -- struct ext3_dir_entry_2 *de1 = (struct ext3_dir_entry_2 *)((char *)de + nlen); -+ struct ext3_dir_entry_2 *de1 = -+ (struct ext3_dir_entry_2 *)((char *)de + nlen); - de1->rec_len = cpu_to_le16(rlen - nlen); - de->rec_len = cpu_to_le16(nlen); - de = de1; -@@ -1232,7 +1407,8 @@ - unsigned blocksize; - struct dx_hash_info hinfo; - u32 block; -- -+ void *lock, *new_lock; -+ - blocksize = dir->i_sb->s_blocksize; - dxtrace(printk("Creating index\n")); - retval = ext3_journal_get_write_access(handle, bh); -@@ -1243,7 +1419,6 @@ - } - root = (struct dx_root *) bh->b_data; - -- EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; - bh2 = ext3_append (handle, dir, &block, &retval); - if (!(bh2)) { - brelse(bh); -@@ -1251,6 +1426,8 @@ - } - data1 = bh2->b_data; - -+ lock = ext3_lock_htree(dir, block, 1); -+ - /* The 0th block becomes the root, move the dirents out */ - de = (struct ext3_dir_entry_2 *) &root->dotdot; - de = (struct ext3_dir_entry_2 *) ((char *)de + de->rec_len); -@@ -1280,13 +1457,25 @@ - frame->entries = entries; - frame->at = entries; - frame->bh = bh; -+ frame->curidx = 0; -+ frame->leaf = 0; -+ frame[1].bh = NULL; - bh = bh2; -- de = do_split(handle,dir, &bh, frame, &hinfo, &retval); -+ de = do_split(handle,dir, &bh, frame, &hinfo, &new_lock, &retval); - dx_release (frames); - if (!(de)) -- return retval; -+ goto cleanup; -+ -+ retval = add_dirent_to_buf(handle, dentry, inode, de, bh); -+cleanup: -+ if (new_lock) -+ ext3_unlock_htree(dir, new_lock); -+ /* we mark directory indexed in order to -+ * avoid races while htree being created -bzzz */ -+ EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; -+ ext3_unlock_htree(dir, lock); - -- return add_dirent_to_buf(handle, dentry, inode, de, bh); -+ return retval; - } - #endif - -@@ -1315,11 +1504,13 @@ - unsigned blocksize; - unsigned nlen, rlen; - u32 block, blocks; -+ void *lock; - - sb = dir->i_sb; - blocksize = sb->s_blocksize; - if (!dentry->d_name.len) - return -EINVAL; -+repeat: - #ifdef CONFIG_EXT3_INDEX - if (is_dx(dir)) { - retval = ext3_dx_add_entry(handle, dentry, inode); -@@ -1330,36 +1521,53 @@ - ext3_mark_inode_dirty(handle, dir); - } - #endif -+ lock = ext3_lock_htree(dir, 0, 1); -+ if (is_dx(dir)) { -+ /* we got lock for block 0 -+ * probably previous holder of the lock -+ * created htree -bzzz */ -+ ext3_unlock_htree(dir, lock); -+ goto repeat; -+ } -+ - blocks = dir->i_size >> sb->s_blocksize_bits; - for (block = 0, offset = 0; block < blocks; block++) { - bh = ext3_bread(handle, dir, block, 0, &retval); -- if(!bh) -+ if(!bh) { -+ ext3_unlock_htree(dir, lock); - return retval; -+ } - retval = add_dirent_to_buf(handle, dentry, inode, 0, bh); -- if (retval != -ENOSPC) -+ if (retval != -ENOSPC) { -+ ext3_unlock_htree(dir, lock); - return retval; -+ } - - #ifdef CONFIG_EXT3_INDEX - if (blocks == 1 && !dx_fallback && -- EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) -- return make_indexed_dir(handle, dentry, inode, bh); -+ EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_DIR_INDEX)) { -+ retval = make_indexed_dir(handle, dentry, inode, bh); -+ ext3_unlock_htree(dir, lock); -+ return retval; -+ } - #endif - brelse(bh); - } - bh = ext3_append(handle, dir, &block, &retval); -- if (!bh) -+ if (!bh) { -+ ext3_unlock_htree(dir, lock); - return retval; -+ } - de = (struct ext3_dir_entry_2 *) bh->b_data; - de->inode = 0; - de->rec_len = cpu_to_le16(rlen = blocksize); - nlen = 0; -- return add_dirent_to_buf(handle, dentry, inode, de, bh); -+ retval = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ ext3_unlock_htree(dir, lock); -+ return retval; - } - - #ifdef CONFIG_EXT3_INDEX --/* -- * Returns 0 for success, or a negative error value -- */ - static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, - struct inode *inode) - { -@@ -1371,15 +1579,28 @@ - struct super_block * sb = dir->i_sb; - struct ext3_dir_entry_2 *de; - int err; -- -- frame = dx_probe(dentry, 0, &hinfo, frames, &err); -+ int curidx; -+ void *idx_lock, *leaf_lock, *newleaf_lock; -+ -+repeat: -+ frame = dx_probe(&dentry->d_name, dir, &hinfo, frames, &err); - if (!frame) - return err; -- entries = frame->entries; -- at = frame->at; - -- if (!(bh = ext3_bread(handle,dir, dx_get_block(frame->at), 0, &err))) -+ /* we're going to chage leaf, so lock it first */ -+ leaf_lock = ext3_lock_htree(dir, frame->leaf, 1); -+ -+ /* while locking leaf we just found may get splitted -+ * so we need to check this */ -+ if (!dx_check_full_path(frames, &hinfo)) { -+ ext3_unlock_htree(dir, leaf_lock); -+ dx_release(frames); -+ goto repeat; -+ } -+ if (!(bh = ext3_bread(handle,dir, frame->leaf, 0, &err))) { -+ printk("can't ext3_bread(%d) = %d\n", (int) frame->leaf, err); - goto cleanup; -+ } - - BUFFER_TRACE(bh, "get_write_access"); - err = ext3_journal_get_write_access(handle, bh); -@@ -1392,6 +1613,35 @@ - goto cleanup; - } - -+ /* our leaf has no enough space. hence, we have to -+ * split it. so lock index for this leaf first */ -+ curidx = frame->curidx; -+ idx_lock = ext3_lock_htree(dir, curidx, 1); -+ -+ /* now check did path get changed? */ -+ dx_release(frames); -+ -+ frame = dx_probe(&dentry->d_name, dentry->d_parent->d_inode, -+ &hinfo, frames, &err); -+ if (!frame) { -+ /* FIXME: error handling here */ -+ brelse(bh); -+ ext3_unlock_htree(dir, idx_lock); -+ return err; -+ } -+ -+ if (frame->curidx != curidx) { -+ /* path has been changed. we have to drop old lock -+ * and repeat */ -+ brelse(bh); -+ ext3_unlock_htree(dir, idx_lock); -+ ext3_unlock_htree(dir, leaf_lock); -+ dx_release(frames); -+ goto repeat; -+ } -+ entries = frame->entries; -+ at = frame->at; -+ - /* Block full, should compress but for now just split */ - dxtrace(printk("using %u of %u node entries\n", - dx_get_count(entries), dx_get_limit(entries))); -@@ -1403,7 +1653,8 @@ - struct dx_entry *entries2; - struct dx_node *node2; - struct buffer_head *bh2; -- -+ void *nb_lock; -+ - if (levels && (dx_get_count(frames->entries) == - dx_get_limit(frames->entries))) { - ext3_warning(sb, __FUNCTION__, -@@ -1414,6 +1665,7 @@ - bh2 = ext3_append (handle, dir, &newblock, &err); - if (!(bh2)) - goto cleanup; -+ nb_lock = ext3_lock_htree(dir, newblock, 1); - node2 = (struct dx_node *)(bh2->b_data); - entries2 = node2->entries; - node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -@@ -1425,27 +1677,73 @@ - if (levels) { - unsigned icount1 = icount/2, icount2 = icount - icount1; - unsigned hash2 = dx_get_hash(entries + icount1); -+ void *ri_lock; -+ -+ /* we have to protect root htree index against -+ * another dx_add_entry() which would want to -+ * split it too -bzzz */ -+ ri_lock = ext3_lock_htree(dir, 0, 1); -+ -+ /* as root index block blocked we must repeat -+ * searching for current position of our 2nd index -bzzz */ -+ dx_lock_bh(frame->bh); -+ frames->at = dx_find_position(frames->entries, hinfo.hash); -+ dx_unlock_bh(frame->bh); -+ - dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -- -- BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ -+ -+ BUFFER_TRACE(frame->bh, "get_write_access"); - err = ext3_journal_get_write_access(handle, - frames[0].bh); - if (err) - goto journal_error; -- -+ -+ /* copy index into new one */ - memcpy ((char *) entries2, (char *) (entries + icount1), - icount2 * sizeof(struct dx_entry)); -- dx_set_count (entries, icount1); - dx_set_count (entries2, icount2); - dx_set_limit (entries2, dx_node_limit(dir)); - - /* Which index block gets the new entry? */ - if (at - entries >= icount1) { -+ /* unlock index we won't use */ -+ ext3_unlock_htree(dir, idx_lock); -+ idx_lock = nb_lock; - frame->at = at = at - entries - icount1 + entries2; -- frame->entries = entries = entries2; -+ frame->entries = entries2; -+ frame->curidx = curidx = newblock; - swap(frame->bh, bh2); -+ } else { -+ /* we'll use old index,so new one may be freed */ -+ ext3_unlock_htree(dir, nb_lock); - } -- dx_insert_block (frames + 0, hash2, newblock); -+ -+ /* NOTE: very subtle piece of code -+ * competing dx_probe() may find 2nd level index in root -+ * index, then we insert new index here and set new count -+ * in that 2nd level index. so, dx_probe() may see 2nd -+ * level index w/o hash it looks for. the solution is -+ * to check root index after we locked just founded 2nd -+ * level index -bzzz */ -+ dx_lock_bh(frames[0].bh); -+ dx_insert_block (dir, frames + 0, hash2, newblock, 0); -+ dx_unlock_bh(frames[0].bh); -+ -+ /* now old and new 2nd level index blocks contain -+ * all pointers, so dx_probe() may find it in the both. -+ * it's OK -bzzz */ -+ -+ dx_lock_bh(frame->bh); -+ dx_set_count(entries, icount1); -+ dx_unlock_bh(frame->bh); -+ -+ /* now old 2nd level index block points to first half -+ * of leafs. it's importand that dx_probe() must -+ * check root index block for changes under -+ * dx_lock_bh(frame->bh) -bzzz */ -+ -+ ext3_unlock_htree(dir, ri_lock); -+ - dxtrace(dx_show_index ("node", frames[1].entries)); - dxtrace(dx_show_index ("node", - ((struct dx_node *) bh2->b_data)->entries)); -@@ -1454,38 +1752,61 @@ - goto journal_error; - brelse (bh2); - } else { -+ unsigned long leaf = frame->leaf; -+ - dxtrace(printk("Creating second level index...\n")); - memcpy((char *) entries2, (char *) entries, - icount * sizeof(struct dx_entry)); - dx_set_limit(entries2, dx_node_limit(dir)); - - /* Set up root */ -+ dx_lock_bh(frames[0].bh); - dx_set_count(entries, 1); - dx_set_block(entries + 0, newblock); - ((struct dx_root *) frames[0].bh->b_data)->info.indirect_levels = 1; -+ dx_unlock_bh(frames[0].bh); - - /* Add new access path frame */ - frame = frames + 1; - frame->at = at = at - entries + entries2; - frame->entries = entries = entries2; - frame->bh = bh2; -+ frame->curidx = newblock; -+ frame->leaf = leaf; - err = ext3_journal_get_write_access(handle, - frame->bh); - if (err) - goto journal_error; -+ -+ /* first level index was root. it's already initialized */ -+ /* we my unlock it now */ -+ ext3_unlock_htree(dir, idx_lock); -+ -+ /* current index is just created 2nd level index */ -+ curidx = newblock; -+ idx_lock = nb_lock; - } - ext3_journal_dirty_metadata(handle, frames[0].bh); - } -- de = do_split(handle, dir, &bh, frame, &hinfo, &err); -+ de = do_split(handle, dir, &bh, frame, &hinfo, &newleaf_lock, &err); - if (!de) - goto cleanup; -+ -+ /* index splitted */ -+ ext3_unlock_htree(dir, idx_lock); -+ - err = add_dirent_to_buf(handle, dentry, inode, de, bh); -+ -+ if (newleaf_lock) -+ ext3_unlock_htree(dir, newleaf_lock); -+ - bh = 0; - goto cleanup; - - journal_error: - ext3_std_error(dir->i_sb, err); - cleanup: -+ ext3_unlock_htree(dir, leaf_lock); - if (bh) - brelse(bh); - dx_release(frames); -@@ -1929,6 +2250,7 @@ - struct buffer_head * bh; - struct ext3_dir_entry_2 * de; - handle_t *handle; -+ void *lock; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); - if (IS_ERR(handle)) { -@@ -1936,7 +2258,7 @@ - } - - retval = -ENOENT; -- bh = ext3_find_entry (dentry, &de); -+ bh = ext3_find_entry (dentry, &de, 1, &lock); - if (!bh) - goto end_rmdir; - -@@ -1947,14 +2269,19 @@ - DQUOT_INIT(inode); - - retval = -EIO; -- if (le32_to_cpu(de->inode) != inode->i_ino) -+ if (le32_to_cpu(de->inode) != inode->i_ino) { -+ ext3_unlock_htree(dir, lock); - goto end_rmdir; -+ } - - retval = -ENOTEMPTY; -- if (!empty_dir (inode)) -+ if (!empty_dir (inode)) { -+ ext3_unlock_htree(dir, lock); - goto end_rmdir; -+ } - - retval = ext3_delete_entry(handle, dir, de, bh); -+ ext3_unlock_htree(dir, lock); - if (retval) - goto end_rmdir; - if (inode->i_nlink != 2) -@@ -1983,6 +2310,7 @@ - struct buffer_head * bh; - struct ext3_dir_entry_2 * de; - handle_t *handle; -+ void *lock; - - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); - if (IS_ERR(handle)) { -@@ -1993,7 +2321,7 @@ - handle->h_sync = 1; - - retval = -ENOENT; -- bh = ext3_find_entry (dentry, &de); -+ bh = ext3_find_entry (dentry, &de, 1, &lock); - if (!bh) - goto end_unlink; - -@@ -2001,8 +2329,10 @@ - DQUOT_INIT(inode); - - retval = -EIO; -- if (le32_to_cpu(de->inode) != inode->i_ino) -+ if (le32_to_cpu(de->inode) != inode->i_ino) { -+ ext3_unlock_htree(dir, lock); - goto end_unlink; -+ } - - if (!inode->i_nlink) { - ext3_warning (inode->i_sb, "ext3_unlink", -@@ -2011,6 +2341,7 @@ - inode->i_nlink = 1; - } - retval = ext3_delete_entry(handle, dir, de, bh); -+ ext3_unlock_htree(dir, lock); - if (retval) - goto end_unlink; - dir->i_ctime = dir->i_mtime = CURRENT_TIME; -@@ -2147,6 +2478,7 @@ - struct buffer_head * old_bh, * new_bh, * dir_bh; - struct ext3_dir_entry_2 * old_de, * new_de; - int retval; -+ void *lock1 = NULL, *lock2 = NULL, *lock3 = NULL; - - old_bh = new_bh = dir_bh = NULL; - -@@ -2159,7 +2491,10 @@ - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) - handle->h_sync = 1; - -- old_bh = ext3_find_entry (old_dentry, &old_de); -+ if (old_dentry->d_parent == new_dentry->d_parent) -+ down(&EXT3_I(old_dentry->d_parent->d_inode)->i_rename_sem); -+ -+ old_bh = ext3_find_entry (old_dentry, &old_de, 1, &lock1 /* FIXME */); - /* - * Check for inode number is _not_ due to possible IO errors. - * We might rmdir the source, keep it as pwd of some process -@@ -2172,7 +2507,7 @@ - goto end_rename; - - new_inode = new_dentry->d_inode; -- new_bh = ext3_find_entry (new_dentry, &new_de); -+ new_bh = ext3_find_entry (new_dentry, &new_de, 1, &lock2 /* FIXME */); - if (new_bh) { - if (!new_inode) { - brelse (new_bh); -@@ -2235,7 +2570,7 @@ - struct buffer_head *old_bh2; - struct ext3_dir_entry_2 *old_de2; - -- old_bh2 = ext3_find_entry(old_dentry, &old_de2); -+ old_bh2 = ext3_find_entry(old_dentry, &old_de2, 1, &lock3 /* FIXME */); - if (old_bh2) { - retval = ext3_delete_entry(handle, old_dir, - old_de2, old_bh2); -@@ -2278,6 +2613,14 @@ - retval = 0; - - end_rename: -+ if (lock1) -+ ext3_unlock_htree(old_dentry->d_parent->d_inode, lock1); -+ if (lock2) -+ ext3_unlock_htree(new_dentry->d_parent->d_inode, lock2); -+ if (lock3) -+ ext3_unlock_htree(old_dentry->d_parent->d_inode, lock3); -+ if (old_dentry->d_parent == new_dentry->d_parent) -+ up(&EXT3_I(old_dentry->d_parent->d_inode)->i_rename_sem); - brelse (dir_bh); - brelse (old_bh); - brelse (new_bh); -@@ -2286,6 +2629,29 @@ - } - - /* -+ * this locking primitives are used to protect parts -+ * of dir's htree. protection unit is block: leaf or index -+ */ -+static inline void *ext3_lock_htree(struct inode *dir, -+ unsigned long value, int rwlock) -+{ -+ void *lock; -+ -+ if (!test_opt(dir->i_sb, PDIROPS)) -+ return NULL; -+ lock = dynlock_lock(&EXT3_I(dir)->i_htree_lock, value, 1, GFP_KERNEL); -+ return lock; -+} -+ -+static inline void ext3_unlock_htree(struct inode *dir, -+ void *lock) -+{ -+ if (!test_opt(dir->i_sb, PDIROPS) || !lock) -+ return; -+ dynlock_unlock(&EXT3_I(dir)->i_htree_lock, lock); -+} -+ -+/* - * directories can handle most operations... - */ - struct inode_operations ext3_dir_inode_operations = { -Index: linux-2.4.20/fs/ext3/super.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/super.c 2004-05-20 22:47:06.000000000 +0400 -+++ linux-2.4.20/fs/ext3/super.c 2004-05-20 23:16:29.000000000 +0400 -@@ -796,6 +796,8 @@ - return 0; - } - } -+ else if (!strcmp (this_char, "pdirops")) -+ set_opt (sbi->s_mount_opt, PDIROPS); - else if (!strcmp (this_char, "grpid") || - !strcmp (this_char, "bsdgroups")) - set_opt (*mount_options, GRPID); -@@ -822,6 +824,9 @@ - if (want_numeric(value, "sb", sb_block)) - return 0; - } -+ else if (!strcmp (this_char, "pdirops")) { -+ set_opt (sbi->s_mount_opt, PDIROPS); -+ } - #ifdef CONFIG_JBD_DEBUG - else if (!strcmp (this_char, "ro-after")) { - unsigned long v; -@@ -985,6 +990,10 @@ - ext3_check_inodes_bitmap (sb); - } - #endif -+#ifdef S_PDIROPS -+ if (test_opt (sb, PDIROPS)) -+ sb->s_flags |= S_PDIROPS; -+#endif - setup_ro_after(sb); - return res; - } -@@ -1486,6 +1495,11 @@ - test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": - "writeback"); - -+ if (test_opt(sb, PDIROPS)) { -+ printk (KERN_INFO "EXT3-fs: mounted filesystem with parallel dirops\n"); -+ sb->s_flags |= S_PDIROPS; -+ } -+ - return sb; - - failed_mount3: -Index: linux-2.4.20/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/inode.c 2004-05-20 22:47:07.000000000 +0400 -+++ linux-2.4.20/fs/ext3/inode.c 2004-05-20 23:16:29.000000000 +0400 -@@ -2225,6 +2225,9 @@ - } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -+ dynlock_init(&EXT3_I(inode)->i_htree_lock); -+ sema_init(&EXT3_I(inode)->i_rename_sem, 1); -+ sema_init(&EXT3_I(inode)->i_append_sem, 1); - } else if (S_ISLNK(inode->i_mode)) { - if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; -Index: linux-2.4.20/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/ialloc.c 2004-05-20 22:47:06.000000000 +0400 -+++ linux-2.4.20/fs/ext3/ialloc.c 2004-05-20 23:16:29.000000000 +0400 -@@ -607,6 +607,9 @@ - return ERR_PTR(-EDQUOT); - } - ext3_debug ("allocating inode %lu\n", inode->i_ino); -+ dynlock_init(&EXT3_I(inode)->i_htree_lock); -+ sema_init(&EXT3_I(inode)->i_rename_sem, 1); -+ sema_init(&EXT3_I(inode)->i_append_sem, 1); - return inode; - - fail: -Index: linux-2.4.20/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.20.orig/include/linux/ext3_fs.h 2004-05-20 22:47:06.000000000 +0400 -+++ linux-2.4.20/include/linux/ext3_fs.h 2004-05-20 23:16:29.000000000 +0400 -@@ -308,6 +308,7 @@ - /* - * Mount flags - */ -+#define EXT3_MOUNT_PDIROPS 0x800000/* Parallel dir operations */ - #define EXT3_MOUNT_CHECK 0x0001 /* Do mount-time checks */ - #define EXT3_MOUNT_GRPID 0x0004 /* Create files with directory's group */ - #define EXT3_MOUNT_DEBUG 0x0008 /* Some debugging messages */ -Index: linux-2.4.20/include/linux/ext3_fs_i.h -=================================================================== ---- linux-2.4.20.orig/include/linux/ext3_fs_i.h 2004-05-20 22:47:06.000000000 +0400 -+++ linux-2.4.20/include/linux/ext3_fs_i.h 2004-05-20 23:16:29.000000000 +0400 -@@ -17,6 +17,7 @@ - #define _LINUX_EXT3_FS_I - - #include <linux/rwsem.h> -+#include <linux/dynlocks.h> - - /* - * second extended file system inode data in memory -@@ -76,6 +77,11 @@ - * by other means, so we have truncate_sem. - */ - struct rw_semaphore truncate_sem; -+ -+ /* following fields for parallel directory operations -bzzz */ -+ struct dynlock i_htree_lock; -+ struct semaphore i_append_sem; -+ struct semaphore i_rename_sem; - }; - - #endif /* _LINUX_EXT3_FS_I */ diff --git a/lustre/kernel_patches/patches/ext3-pdirops-2.4.20-chaos.patch b/lustre/kernel_patches/patches/ext3-pdirops-2.6.7.patch similarity index 84% rename from lustre/kernel_patches/patches/ext3-pdirops-2.4.20-chaos.patch rename to lustre/kernel_patches/patches/ext3-pdirops-2.6.7.patch index 28badd6470..2d0238622f 100644 --- a/lustre/kernel_patches/patches/ext3-pdirops-2.4.20-chaos.patch +++ b/lustre/kernel_patches/patches/ext3-pdirops-2.6.7.patch @@ -6,11 +6,11 @@ include/linux/ext3_fs_i.h | 6 6 files changed, 500 insertions(+), 109 deletions(-) -Index: linux-2.4.20/fs/ext3/namei.c +Index: linux-2.6.7/fs/ext3/namei.c =================================================================== ---- linux-2.4.20.orig/fs/ext3/namei.c Wed Mar 17 15:37:09 2004 -+++ linux-2.4.20/fs/ext3/namei.c Wed Mar 17 15:37:56 2004 -@@ -51,6 +51,9 @@ +--- linux-2.6.7.orig/fs/ext3/namei.c 2004-08-26 17:12:39.000000000 +0400 ++++ linux-2.6.7/fs/ext3/namei.c 2004-09-07 17:32:13.000000000 +0400 +@@ -53,6 +53,9 @@ { struct buffer_head *bh; @@ -20,7 +20,7 @@ Index: linux-2.4.20/fs/ext3/namei.c *block = inode->i_size >> inode->i_sb->s_blocksize_bits; if ((bh = ext3_bread(handle, inode, *block, 1, err))) { -@@ -58,6 +61,8 @@ +@@ -60,6 +63,8 @@ EXT3_I(inode)->i_disksize = inode->i_size; ext3_journal_get_write_access(handle,bh); } @@ -29,7 +29,7 @@ Index: linux-2.4.20/fs/ext3/namei.c return bh; } -@@ -134,6 +139,8 @@ +@@ -136,6 +141,8 @@ struct buffer_head *bh; struct dx_entry *entries; struct dx_entry *at; @@ -38,7 +38,7 @@ Index: linux-2.4.20/fs/ext3/namei.c }; struct dx_map_entry -@@ -142,6 +149,30 @@ +@@ -144,6 +151,30 @@ u32 offs; }; @@ -69,7 +69,7 @@ Index: linux-2.4.20/fs/ext3/namei.c #ifdef CONFIG_EXT3_INDEX static inline unsigned dx_get_block (struct dx_entry *entry); static void dx_set_block (struct dx_entry *entry, unsigned value); -@@ -153,7 +184,7 @@ +@@ -155,7 +186,7 @@ static void dx_set_limit (struct dx_entry *entries, unsigned value); static unsigned dx_root_limit (struct inode *dir, unsigned infosize); static unsigned dx_node_limit (struct inode *dir); @@ -78,7 +78,7 @@ Index: linux-2.4.20/fs/ext3/namei.c struct inode *dir, struct dx_hash_info *hinfo, struct dx_frame *frame, -@@ -165,15 +196,18 @@ +@@ -167,15 +198,18 @@ static struct ext3_dir_entry_2 *dx_move_dirents (char *from, char *to, struct dx_map_entry *offsets, int count); static struct ext3_dir_entry_2* dx_pack_dirents (char *base, int size); @@ -86,7 +86,7 @@ Index: linux-2.4.20/fs/ext3/namei.c +static void dx_insert_block (struct inode *, struct dx_frame *, u32, u32, u32); static int ext3_htree_next_block(struct inode *dir, __u32 hash, struct dx_frame *frame, - struct dx_frame *frames, int *err, + struct dx_frame *frames, __u32 *start_hash); static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, - struct ext3_dir_entry_2 **res_dir, int *err); @@ -99,7 +99,7 @@ Index: linux-2.4.20/fs/ext3/namei.c /* * Future: use high four bits of block for coalesce-on-delete flags -@@ -306,6 +340,94 @@ +@@ -319,6 +353,94 @@ #endif /* DX_DEBUG */ /* @@ -194,7 +194,7 @@ Index: linux-2.4.20/fs/ext3/namei.c * Probe for a directory leaf block to search. * * dx_probe can return ERR_BAD_DX_DIR, which means there was a format -@@ -315,19 +437,20 @@ +@@ -328,19 +450,20 @@ * back to userspace. */ static struct dx_frame * @@ -220,10 +220,10 @@ Index: linux-2.4.20/fs/ext3/namei.c if (!(bh = ext3_bread (NULL,dir, 0, 0, err))) goto fail; root = (struct dx_root *) bh->b_data; -@@ -343,8 +466,8 @@ +@@ -356,8 +479,8 @@ } hinfo->hash_version = root->info.hash_version; - hinfo->seed = dir->i_sb->u.ext3_sb.s_hash_seed; + hinfo->seed = EXT3_SB(dir->i_sb)->s_hash_seed; - if (dentry) - ext3fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo); + if (name) @@ -231,7 +231,7 @@ Index: linux-2.4.20/fs/ext3/namei.c hash = hinfo->hash; if (root->info.unused_flags & 1) { -@@ -356,7 +479,19 @@ +@@ -369,7 +492,19 @@ goto fail; } @@ -251,7 +251,7 @@ Index: linux-2.4.20/fs/ext3/namei.c ext3_warning(dir->i_sb, __FUNCTION__, "Unimplemented inode hash depth: %#06x", root->info.indirect_levels); -@@ -364,56 +499,46 @@ +@@ -377,56 +512,46 @@ *err = ERR_BAD_DX_DIR; goto fail; } @@ -338,7 +338,7 @@ Index: linux-2.4.20/fs/ext3/namei.c fail2: while (frame >= frame_in) { brelse(frame->bh); -@@ -427,8 +552,7 @@ +@@ -440,8 +565,7 @@ { if (frames[0].bh == NULL) return; @@ -348,7 +348,7 @@ Index: linux-2.4.20/fs/ext3/namei.c brelse(frames[1].bh); brelse(frames[0].bh); } -@@ -470,8 +594,10 @@ +@@ -482,8 +606,10 @@ * nodes need to be read. */ while (1) { @@ -360,17 +360,17 @@ Index: linux-2.4.20/fs/ext3/namei.c if (p == frames) return 0; num_frames++; -@@ -497,13 +623,17 @@ +@@ -509,13 +635,17 @@ * block so no check is necessary */ while (num_frames--) { - if (!(bh = ext3_bread(NULL, dir, dx_get_block(p->at), -- 0, err))) +- 0, &err))) + u32 idx; + + idx = p->leaf = dx_get_block(p->at); -+ if (!(bh = ext3_bread(NULL, dir, idx, 0, err))) - return -1; /* Failure */ ++ if (!(bh = ext3_bread(NULL, dir, idx, 0, &err))) + return err; /* Failure */ p++; brelse (p->bh); p->bh = bh; @@ -380,8 +380,8 @@ Index: linux-2.4.20/fs/ext3/namei.c } return 1; } -@@ -543,7 +673,7 @@ - dir = dir_file->f_dentry->d_inode; +@@ -602,7 +732,7 @@ + } hinfo.hash = start_hash; hinfo.minor_hash = 0; - frame = dx_probe(0, dir_file->f_dentry->d_inode, &hinfo, frames, &err); @@ -389,7 +389,7 @@ Index: linux-2.4.20/fs/ext3/namei.c if (!frame) return err; -@@ -625,7 +755,8 @@ +@@ -674,7 +804,8 @@ count++; } /* XXX: do we need to check rec_len == 0 case? -Chris */ @@ -399,7 +399,7 @@ Index: linux-2.4.20/fs/ext3/namei.c } return count; } -@@ -658,7 +789,8 @@ +@@ -707,7 +838,8 @@ } while(more); } @@ -409,7 +409,7 @@ Index: linux-2.4.20/fs/ext3/namei.c { struct dx_entry *entries = frame->entries; struct dx_entry *old = frame->at, *new = old + 1; -@@ -670,6 +802,7 @@ +@@ -719,6 +851,7 @@ dx_set_hash(new, hash); dx_set_block(new, block); dx_set_count(entries, count + 1); @@ -417,9 +417,9 @@ Index: linux-2.4.20/fs/ext3/namei.c } #endif -@@ -752,7 +885,8 @@ - - +@@ -799,7 +932,8 @@ + * to brelse() it when appropriate. + */ static struct buffer_head * ext3_find_entry (struct dentry *dentry, - struct ext3_dir_entry_2 ** res_dir) + struct ext3_dir_entry_2 ** res_dir, @@ -427,7 +427,7 @@ Index: linux-2.4.20/fs/ext3/namei.c { struct super_block * sb; struct buffer_head * bh_use[NAMEI_RA_SIZE]; -@@ -768,6 +902,7 @@ +@@ -815,6 +949,7 @@ int namelen; const u8 *name; unsigned blocksize; @@ -435,7 +435,7 @@ Index: linux-2.4.20/fs/ext3/namei.c *res_dir = NULL; sb = dir->i_sb; -@@ -776,9 +911,10 @@ +@@ -823,9 +958,10 @@ name = dentry->d_name.name; if (namelen > EXT3_NAME_LEN) return NULL; @@ -447,7 +447,7 @@ Index: linux-2.4.20/fs/ext3/namei.c /* * On success, or if the error was file not found, * return. Otherwise, fall back to doing a search the -@@ -787,8 +923,14 @@ +@@ -834,8 +970,14 @@ if (bh || (err != ERR_BAD_DX_DIR)) return bh; dxtrace(printk("ext3_find_entry: dx failed, falling back\n")); @@ -462,7 +462,7 @@ Index: linux-2.4.20/fs/ext3/namei.c nblocks = dir->i_size >> EXT3_BLOCK_SIZE_BITS(sb); start = EXT3_I(dir)->i_dir_start_lookup; if (start >= nblocks) -@@ -860,12 +1002,17 @@ +@@ -908,12 +1050,17 @@ /* Clean up the read-ahead blocks */ for (; ra_ptr < ra_max; ra_ptr++) brelse (bh_use[ra_ptr]); @@ -481,9 +481,9 @@ Index: linux-2.4.20/fs/ext3/namei.c { struct super_block * sb; struct dx_hash_info hinfo; -@@ -880,11 +1027,22 @@ +@@ -928,11 +1075,22 @@ struct inode *dir = dentry->d_parent->d_inode; - + sb = dir->i_sb; - if (!(frame = dx_probe (dentry, 0, &hinfo, frames, err))) +repeat: @@ -506,7 +506,7 @@ Index: linux-2.4.20/fs/ext3/namei.c if (!(bh = ext3_bread (NULL,dir, block, 0, err))) goto errout; de = (struct ext3_dir_entry_2 *) bh->b_data; -@@ -918,6 +1076,8 @@ +@@ -967,6 +1125,8 @@ *err = -ENOENT; errout: dxtrace(printk("%s not found\n", name)); @@ -515,17 +515,14 @@ Index: linux-2.4.20/fs/ext3/namei.c dx_release (frames); return NULL; } -@@ -928,6 +1088,7 @@ +@@ -977,14 +1137,16 @@ struct inode * inode; struct ext3_dir_entry_2 * de; struct buffer_head * bh; -+ void *lock = NULL; ++ void *lock = NULL; if (dentry->d_name.len > EXT3_NAME_LEN) return ERR_PTR(-ENAMETOOLONG); -@@ -935,10 +1096,11 @@ - if (ext3_check_for_iopen(dir, dentry)) - return NULL; - bh = ext3_find_entry(dentry, &de); + bh = ext3_find_entry(dentry, &de, 0, &lock); @@ -536,7 +533,28 @@ Index: linux-2.4.20/fs/ext3/namei.c brelse (bh); inode = iget(dir->i_sb, ino); -@@ -975,7 +1137,8 @@ +@@ -1006,17 +1168,19 @@ + struct dentry dotdot; + struct ext3_dir_entry_2 * de; + struct buffer_head *bh; ++ void *lock = NULL; + + dotdot.d_name.name = ".."; + dotdot.d_name.len = 2; + dotdot.d_parent = child; /* confusing, isn't it! */ + +- bh = ext3_find_entry(&dotdot, &de); ++ bh = ext3_find_entry(&dotdot, &de, 0, &lock); + inode = NULL; + if (!bh) + return ERR_PTR(-ENOENT); + ino = le32_to_cpu(de->inode); + brelse(bh); ++ ext3_unlock_htree(child->d_inode, lock); + inode = iget(child->d_inode->i_sb, ino); + + if (!inode) +@@ -1055,7 +1219,8 @@ unsigned rec_len = 0; while (count--) { @@ -545,8 +563,8 @@ Index: linux-2.4.20/fs/ext3/namei.c + (struct ext3_dir_entry_2 *) (from + map->offs); rec_len = EXT3_DIR_REC_LEN(de->name_len); memcpy (to, de, rec_len); - ((struct ext3_dir_entry_2 *) to)->rec_len = rec_len; -@@ -988,7 +1151,8 @@ + ((struct ext3_dir_entry_2 *) to)->rec_len = +@@ -1069,7 +1234,8 @@ static struct ext3_dir_entry_2* dx_pack_dirents(char *base, int size) { @@ -556,7 +574,7 @@ Index: linux-2.4.20/fs/ext3/namei.c unsigned rec_len = 0; prev = to = de; -@@ -1010,7 +1174,8 @@ +@@ -1091,7 +1257,8 @@ static struct ext3_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, struct buffer_head **bh,struct dx_frame *frame, @@ -566,7 +584,7 @@ Index: linux-2.4.20/fs/ext3/namei.c { unsigned blocksize = dir->i_sb->s_blocksize; unsigned count, continued; -@@ -1057,23 +1222,30 @@ +@@ -1138,23 +1305,30 @@ hash2 = map[split].hash; continued = hash2 == map[split - 1].hash; dxtrace(printk("Split block %i at %x, %i/%i\n", @@ -603,7 +621,7 @@ Index: linux-2.4.20/fs/ext3/namei.c err = ext3_journal_dirty_metadata (handle, bh2); if (err) goto journal_error; -@@ -1147,7 +1319,8 @@ +@@ -1228,7 +1402,8 @@ nlen = EXT3_DIR_REC_LEN(de->name_len); rlen = le16_to_cpu(de->rec_len); if (de->inode) { @@ -613,34 +631,24 @@ Index: linux-2.4.20/fs/ext3/namei.c de1->rec_len = cpu_to_le16(rlen - nlen); de->rec_len = cpu_to_le16(nlen); de = de1; -@@ -1205,7 +1378,8 @@ - unsigned blocksize; +@@ -1287,6 +1462,7 @@ struct dx_hash_info hinfo; u32 block; -- + struct fake_dirent *fde; + void *lock, *new_lock; -+ + blocksize = dir->i_sb->s_blocksize; dxtrace(printk("Creating index\n")); - retval = ext3_journal_get_write_access(handle, bh); -@@ -1216,7 +1390,6 @@ - } - root = (struct dx_root *) bh->b_data; - -- EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; - bh2 = ext3_append (handle, dir, &block, &retval); - if (!(bh2)) { - brelse(bh); -@@ -1224,6 +1397,8 @@ - } +@@ -1306,6 +1482,8 @@ + EXT3_I(dir)->i_flags |= EXT3_INDEX_FL; data1 = bh2->b_data; + lock = ext3_lock_htree(dir, block, 1); + /* The 0th block becomes the root, move the dirents out */ - de = (struct ext3_dir_entry_2 *) &root->dotdot; - de = (struct ext3_dir_entry_2 *) ((char *)de + de->rec_len); -@@ -1253,13 +1428,25 @@ + fde = &root->dotdot; + de = (struct ext3_dir_entry_2 *)((char *)fde + le16_to_cpu(fde->rec_len)); +@@ -1335,13 +1513,25 @@ frame->entries = entries; frame->at = entries; frame->bh = bh; @@ -669,7 +677,7 @@ Index: linux-2.4.20/fs/ext3/namei.c } #endif -@@ -1288,11 +1475,13 @@ +@@ -1370,11 +1560,13 @@ unsigned blocksize; unsigned nlen, rlen; u32 block, blocks; @@ -683,7 +691,7 @@ Index: linux-2.4.20/fs/ext3/namei.c #ifdef CONFIG_EXT3_INDEX if (is_dx(dir)) { retval = ext3_dx_add_entry(handle, dentry, inode); -@@ -1303,36 +1492,53 @@ +@@ -1385,36 +1577,53 @@ ext3_mark_inode_dirty(handle, dir); } #endif @@ -746,7 +754,7 @@ Index: linux-2.4.20/fs/ext3/namei.c static int ext3_dx_add_entry(handle_t *handle, struct dentry *dentry, struct inode *inode) { -@@ -1344,15 +1550,28 @@ +@@ -1426,15 +1635,28 @@ struct super_block * sb = dir->i_sb; struct ext3_dir_entry_2 *de; int err; @@ -780,7 +788,7 @@ Index: linux-2.4.20/fs/ext3/namei.c BUFFER_TRACE(bh, "get_write_access"); err = ext3_journal_get_write_access(handle, bh); -@@ -1365,6 +1584,35 @@ +@@ -1447,6 +1669,35 @@ goto cleanup; } @@ -816,7 +824,7 @@ Index: linux-2.4.20/fs/ext3/namei.c /* Block full, should compress but for now just split */ dxtrace(printk("using %u of %u node entries\n", dx_get_count(entries), dx_get_limit(entries))); -@@ -1376,7 +1624,8 @@ +@@ -1458,7 +1709,8 @@ struct dx_entry *entries2; struct dx_node *node2; struct buffer_head *bh2; @@ -826,7 +834,7 @@ Index: linux-2.4.20/fs/ext3/namei.c if (levels && (dx_get_count(frames->entries) == dx_get_limit(frames->entries))) { ext3_warning(sb, __FUNCTION__, -@@ -1387,6 +1636,7 @@ +@@ -1469,6 +1721,7 @@ bh2 = ext3_append (handle, dir, &newblock, &err); if (!(bh2)) goto cleanup; @@ -834,12 +842,14 @@ Index: linux-2.4.20/fs/ext3/namei.c node2 = (struct dx_node *)(bh2->b_data); entries2 = node2->entries; node2->fake.rec_len = cpu_to_le16(sb->s_blocksize); -@@ -1398,27 +1648,73 @@ +@@ -1480,27 +1733,73 @@ if (levels) { unsigned icount1 = icount/2, icount2 = icount - icount1; unsigned hash2 = dx_get_hash(entries + icount1); +- dxtrace(printk("Split index %i/%i\n", icount1, icount2)); + void *ri_lock; -+ + +- BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ + /* we have to protect root htree index against + * another dx_add_entry() which would want to + * split it too -bzzz */ @@ -851,17 +861,14 @@ Index: linux-2.4.20/fs/ext3/namei.c + frames->at = dx_find_position(frames->entries, hinfo.hash); + dx_unlock_bh(frame->bh); + - dxtrace(printk("Split index %i/%i\n", icount1, icount2)); -- -- BUFFER_TRACE(frame->bh, "get_write_access"); /* index root */ ++ dxtrace(printk("Split index %i/%i\n", icount1, icount2)); + + BUFFER_TRACE(frame->bh, "get_write_access"); err = ext3_journal_get_write_access(handle, frames[0].bh); if (err) goto journal_error; -- -+ + + /* copy index into new one */ memcpy ((char *) entries2, (char *) (entries + icount1), icount2 * sizeof(struct dx_entry)); @@ -914,7 +921,7 @@ Index: linux-2.4.20/fs/ext3/namei.c dxtrace(dx_show_index ("node", frames[1].entries)); dxtrace(dx_show_index ("node", ((struct dx_node *) bh2->b_data)->entries)); -@@ -1427,38 +1723,61 @@ +@@ -1509,38 +1808,61 @@ goto journal_error; brelse (bh2); } else { @@ -969,7 +976,7 @@ Index: linux-2.4.20/fs/ext3/namei.c + bh = 0; goto cleanup; - + journal_error: ext3_std_error(dir->i_sb, err); cleanup: @@ -977,16 +984,16 @@ Index: linux-2.4.20/fs/ext3/namei.c if (bh) brelse(bh); dx_release(frames); -@@ -1902,6 +2221,7 @@ +@@ -1981,6 +2303,7 @@ struct buffer_head * bh; struct ext3_dir_entry_2 * de; handle_t *handle; + void *lock; - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); - if (IS_ERR(handle)) { -@@ -1909,7 +2229,7 @@ - } + /* Initialize quotas before so that eventual writes go in + * separate transaction */ +@@ -1990,7 +2313,7 @@ + return PTR_ERR(handle); retval = -ENOENT; - bh = ext3_find_entry (dentry, &de); @@ -994,8 +1001,8 @@ Index: linux-2.4.20/fs/ext3/namei.c if (!bh) goto end_rmdir; -@@ -1920,14 +2240,19 @@ - DQUOT_INIT(inode); +@@ -2000,14 +2323,19 @@ + inode = dentry->d_inode; retval = -EIO; - if (le32_to_cpu(de->inode) != inode->i_ino) @@ -1016,15 +1023,15 @@ Index: linux-2.4.20/fs/ext3/namei.c if (retval) goto end_rmdir; if (inode->i_nlink != 2) -@@ -1956,6 +2281,7 @@ +@@ -2040,6 +2368,7 @@ struct buffer_head * bh; struct ext3_dir_entry_2 * de; handle_t *handle; + void *lock; - handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); - if (IS_ERR(handle)) { -@@ -1966,7 +2292,7 @@ + /* Initialize quotas before so that eventual writes go + * in separate transaction */ +@@ -2052,15 +2381,17 @@ handle->h_sync = 1; retval = -ENOENT; @@ -1033,8 +1040,7 @@ Index: linux-2.4.20/fs/ext3/namei.c if (!bh) goto end_unlink; -@@ -1974,8 +2300,10 @@ - DQUOT_INIT(inode); + inode = dentry->d_inode; retval = -EIO; - if (le32_to_cpu(de->inode) != inode->i_ino) @@ -1042,10 +1048,10 @@ Index: linux-2.4.20/fs/ext3/namei.c + ext3_unlock_htree(dir, lock); goto end_unlink; + } - + if (!inode->i_nlink) { ext3_warning (inode->i_sb, "ext3_unlink", -@@ -1984,6 +2312,7 @@ +@@ -2069,6 +2400,7 @@ inode->i_nlink = 1; } retval = ext3_delete_entry(handle, dir, de, bh); @@ -1053,7 +1059,7 @@ Index: linux-2.4.20/fs/ext3/namei.c if (retval) goto end_unlink; dir->i_ctime = dir->i_mtime = CURRENT_TIME; -@@ -2121,6 +2450,7 @@ +@@ -2182,6 +2514,7 @@ struct buffer_head * old_bh, * new_bh, * dir_bh; struct ext3_dir_entry_2 * old_de, * new_de; int retval; @@ -1061,8 +1067,8 @@ Index: linux-2.4.20/fs/ext3/namei.c old_bh = new_bh = dir_bh = NULL; -@@ -2133,7 +2463,10 @@ - if (IS_SYNC(old_dir) || IS_SYNC(new_dir)) +@@ -2197,7 +2530,10 @@ + if (IS_DIRSYNC(old_dir) || IS_DIRSYNC(new_dir)) handle->h_sync = 1; - old_bh = ext3_find_entry (old_dentry, &old_de); @@ -1073,7 +1079,7 @@ Index: linux-2.4.20/fs/ext3/namei.c /* * Check for inode number is _not_ due to possible IO errors. * We might rmdir the source, keep it as pwd of some process -@@ -2146,7 +2479,7 @@ +@@ -2210,7 +2546,7 @@ goto end_rename; new_inode = new_dentry->d_inode; @@ -1082,16 +1088,16 @@ Index: linux-2.4.20/fs/ext3/namei.c if (new_bh) { if (!new_inode) { brelse (new_bh); -@@ -2209,7 +2542,7 @@ +@@ -2274,7 +2610,7 @@ struct buffer_head *old_bh2; struct ext3_dir_entry_2 *old_de2; - + - old_bh2 = ext3_find_entry(old_dentry, &old_de2); + old_bh2 = ext3_find_entry(old_dentry, &old_de2, 1, &lock3 /* FIXME */); if (old_bh2) { retval = ext3_delete_entry(handle, old_dir, old_de2, old_bh2); -@@ -2252,6 +2585,14 @@ +@@ -2317,6 +2653,14 @@ retval = 0; end_rename: @@ -1106,7 +1112,7 @@ Index: linux-2.4.20/fs/ext3/namei.c brelse (dir_bh); brelse (old_bh); brelse (new_bh); -@@ -2260,6 +2601,29 @@ +@@ -2325,6 +2669,29 @@ } /* @@ -1136,96 +1142,53 @@ Index: linux-2.4.20/fs/ext3/namei.c * directories can handle most operations... */ struct inode_operations ext3_dir_inode_operations = { -Index: linux-2.4.20/fs/ext3/super.c +Index: linux-2.6.7/fs/ext3/super.c =================================================================== ---- linux-2.4.20.orig/fs/ext3/super.c Wed Mar 17 15:37:09 2004 -+++ linux-2.4.20/fs/ext3/super.c Wed Mar 17 15:37:10 2004 -@@ -796,6 +796,8 @@ - return 0; - } - } -+ else if (!strcmp (this_char, "pdirops")) -+ set_opt (sbi->s_mount_opt, PDIROPS); - else if (!strcmp (this_char, "grpid") || - !strcmp (this_char, "bsdgroups")) - set_opt (*mount_options, GRPID); -@@ -822,6 +824,9 @@ - if (want_numeric(value, "sb", sb_block)) - return 0; - } -+ else if (!strcmp (this_char, "pdirops")) { -+ set_opt (sbi->s_mount_opt, PDIROPS); -+ } - #ifdef CONFIG_JBD_DEBUG - else if (!strcmp (this_char, "ro-after")) { - unsigned long v; -@@ -985,6 +990,10 @@ - ext3_check_inodes_bitmap (sb); - } +--- linux-2.6.7.orig/fs/ext3/super.c 2004-09-07 14:12:13.000000000 +0400 ++++ linux-2.6.7/fs/ext3/super.c 2004-09-07 17:17:37.000000000 +0400 +@@ -453,6 +453,9 @@ + ei->i_default_acl = EXT3_ACL_NOT_CACHED; #endif -+#ifdef S_PDIROPS -+ if (test_opt (sb, PDIROPS)) -+ sb->s_flags |= S_PDIROPS; -+#endif - setup_ro_after(sb); - return res; + ei->vfs_inode.i_version = 1; ++ dynlock_init(&ei->i_htree_lock); ++ sema_init(&ei->i_rename_sem, 1); ++ sema_init(&ei->i_append_sem, 1); + return &ei->vfs_inode; } -@@ -1484,6 +1493,11 @@ - test_opt(sb,DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA ? "ordered": - "writeback"); -+ if (test_opt(sb, PDIROPS)) { -+ printk (KERN_INFO "EXT3-fs: mounted filesystem with parallel dirops\n"); -+ sb->s_flags |= S_PDIROPS; -+ } -+ - return sb; +@@ -586,7 +589,7 @@ + Opt_commit, Opt_journal_update, Opt_journal_inum, + Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, + Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, +- Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, ++ Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_pdirops, + Opt_ignore, Opt_err, + }; - failed_mount3: -Index: linux-2.4.20/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/inode.c Wed Mar 17 15:37:09 2004 -+++ linux-2.4.20/fs/ext3/inode.c Wed Mar 17 15:37:10 2004 -@@ -2435,6 +2435,9 @@ - } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; -+ dynlock_init(&EXT3_I(inode)->i_htree_lock); -+ sema_init(&EXT3_I(inode)->i_rename_sem, 1); -+ sema_init(&EXT3_I(inode)->i_append_sem, 1); - } else if (S_ISLNK(inode->i_mode)) { - if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; -Index: linux-2.4.20/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.20.orig/fs/ext3/ialloc.c Wed Mar 17 15:37:09 2004 -+++ linux-2.4.20/fs/ext3/ialloc.c Wed Mar 17 15:37:10 2004 -@@ -601,6 +601,9 @@ - return ERR_PTR(-EDQUOT); - } - ext3_debug ("allocating inode %lu\n", inode->i_ino); -+ dynlock_init(&EXT3_I(inode)->i_htree_lock); -+ sema_init(&EXT3_I(inode)->i_rename_sem, 1); -+ sema_init(&EXT3_I(inode)->i_append_sem, 1); - return inode; - - fail: -Index: linux-2.4.20/include/linux/ext3_fs.h +@@ -632,6 +635,7 @@ + {Opt_ignore, "noquota"}, + {Opt_ignore, "quota"}, + {Opt_ignore, "usrquota"}, ++ {Opt_pdirops, "pdirops"}, + {Opt_err, NULL} + }; + +Index: linux-2.6.7/include/linux/ext3_fs.h =================================================================== ---- linux-2.4.20.orig/include/linux/ext3_fs.h Wed Mar 17 15:37:09 2004 -+++ linux-2.4.20/include/linux/ext3_fs.h Wed Mar 17 15:37:10 2004 +--- linux-2.6.7.orig/include/linux/ext3_fs.h 2003-09-19 18:01:10.000000000 +0400 ++++ linux-2.6.7/include/linux/ext3_fs.h 2004-09-07 17:17:37.000000000 +0400 @@ -306,6 +306,7 @@ /* * Mount flags */ +#define EXT3_MOUNT_PDIROPS 0x800000/* Parallel dir operations */ #define EXT3_MOUNT_CHECK 0x0001 /* Do mount-time checks */ + #define EXT3_MOUNT_OLDALLOC 0x0002 /* Don't use the new Orlov allocator */ #define EXT3_MOUNT_GRPID 0x0004 /* Create files with directory's group */ - #define EXT3_MOUNT_DEBUG 0x0008 /* Some debugging messages */ -Index: linux-2.4.20/include/linux/ext3_fs_i.h +Index: linux-2.6.7/include/linux/ext3_fs_i.h =================================================================== ---- linux-2.4.20.orig/include/linux/ext3_fs_i.h Thu Nov 22 11:46:19 2001 -+++ linux-2.4.20/include/linux/ext3_fs_i.h Wed Mar 17 15:37:10 2004 +--- linux-2.6.7.orig/include/linux/ext3_fs_i.h 2003-12-30 08:32:44.000000000 +0300 ++++ linux-2.6.7/include/linux/ext3_fs_i.h 2004-09-07 17:17:37.000000000 +0400 @@ -17,6 +17,7 @@ #define _LINUX_EXT3_FS_I @@ -1234,15 +1197,15 @@ Index: linux-2.4.20/include/linux/ext3_fs_i.h /* * second extended file system inode data in memory -@@ -73,6 +74,11 @@ - * by other means, so we have truncate_sem. +@@ -108,6 +109,11 @@ */ - struct rw_semaphore truncate_sem; -+ -+ /* following fields for parallel directory operations -bzzz */ -+ struct dynlock i_htree_lock; -+ struct semaphore i_append_sem; -+ struct semaphore i_rename_sem; + struct semaphore truncate_sem; + struct inode vfs_inode; ++ ++ /* following fields for parallel directory operations -bzzz */ ++ struct dynlock i_htree_lock; ++ struct semaphore i_append_sem; ++ struct semaphore i_rename_sem; }; #endif /* _LINUX_EXT3_FS_I */ diff --git a/lustre/kernel_patches/patches/ext3-raw-lookup-pdirops.patch b/lustre/kernel_patches/patches/ext3-raw-lookup-pdirops-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-raw-lookup-pdirops.patch rename to lustre/kernel_patches/patches/ext3-raw-lookup-pdirops-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-raw-lookup.patch b/lustre/kernel_patches/patches/ext3-raw-lookup.patch deleted file mode 100644 index 8bd09b61d9..0000000000 --- a/lustre/kernel_patches/patches/ext3-raw-lookup.patch +++ /dev/null @@ -1,63 +0,0 @@ - fs/ext3/namei.c | 29 +++++++++++++++++++++++++++++ - include/linux/fs.h | 1 + - 2 files changed, 30 insertions(+) - -Index: lum/include/linux/fs.h -=================================================================== ---- lum.orig/include/linux/fs.h 2004-06-07 17:25:40.000000000 -0400 -+++ lum/include/linux/fs.h 2004-06-07 17:26:11.000000000 -0400 -@@ -904,6 +904,7 @@ - int (*create) (struct inode *,struct dentry *,int); - int (*create_it) (struct inode *,struct dentry *,int, struct lookup_intent *); - struct dentry * (*lookup) (struct inode *,struct dentry *); -+ int (*lookup_raw) (struct inode *, const char *, int, ino_t *); - struct dentry * (*lookup_it) (struct inode *,struct dentry *, struct nameidata *, struct lookup_intent *, int flags); - int (*link) (struct dentry *,struct inode *,struct dentry *); - int (*link_raw) (struct nameidata *,struct nameidata *); -Index: lum/fs/ext3/namei.c -=================================================================== ---- lum.orig/fs/ext3/namei.c 2004-06-07 17:25:39.000000000 -0400 -+++ lum/fs/ext3/namei.c 2004-06-07 17:25:47.000000000 -0400 -@@ -1128,6 +1128,34 @@ - return iopen_connect_dentry(dentry, inode, 1); - } - -+static int ext3_lookup_raw(struct inode *dir, const char *name, -+ int len, ino_t *data) -+{ -+ struct ext3_dir_entry_2 *de; -+ struct buffer_head *bh; -+ struct dentry parent; -+ struct dentry dentry; -+ -+ if (len > EXT3_NAME_LEN) -+ return -ENAMETOOLONG; -+ -+ parent.d_inode = dir; -+ dentry.d_parent = &parent; -+ dentry.d_name.name = name; -+ dentry.d_name.len = len; -+ -+ bh = ext3_find_entry(&dentry, &de); -+ if (bh) { -+ unsigned long ino = le32_to_cpu(de->inode); -+ brelse (bh); -+ if (data) -+ *data = ino; -+ return 0; /* found name */ -+ } -+ -+ return -ENOENT; -+} -+ - #define S_SHIFT 12 - static unsigned char ext3_type_by_mode[S_IFMT >> S_SHIFT] = { - [S_IFREG >> S_SHIFT] EXT3_FT_REG_FILE, -@@ -2772,6 +2800,7 @@ - struct inode_operations ext3_dir_inode_operations = { - create: ext3_create, /* BKL held */ - lookup: ext3_lookup, /* BKL held */ -+ lookup_raw: ext3_lookup_raw, /* BKL held */ - link: ext3_link, /* BKL held */ - unlink: ext3_unlink, /* BKL held */ - symlink: ext3_symlink, /* BKL held */ diff --git a/lustre/kernel_patches/patches/ext3-record-extents-ea.patch b/lustre/kernel_patches/patches/ext3-record-extents-ea.patch deleted file mode 100644 index fa3554a719..0000000000 --- a/lustre/kernel_patches/patches/ext3-record-extents-ea.patch +++ /dev/null @@ -1,183 +0,0 @@ -Index: linux-2.4.20-8/fs/ext3/super.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/super.c 2004-01-27 19:34:11.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/super.c 2004-01-28 05:57:51.000000000 +0800 -@@ -801,6 +801,8 @@ - set_opt (*mount_options, EXTENTS); - else if (!strcmp (this_char, "extdebug")) - set_opt (*mount_options, EXTDEBUG); -+ else if (!strcmp (this_char, "extents-ea")) -+ set_opt (*mount_options, EXTENTS_EA); - else if (!strcmp (this_char, "grpid") || - !strcmp (this_char, "bsdgroups")) - set_opt (*mount_options, GRPID); -Index: linux-2.4.20-8/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/ialloc.c 2004-01-28 01:02:17.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/ialloc.c 2004-01-28 07:56:56.000000000 +0800 -@@ -18,6 +18,7 @@ - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> - #include <linux/ext3_xattr.h> -+#include <linux/ext3_extents.h> - #include <linux/stat.h> - #include <linux/string.h> - #include <linux/locks.h> -@@ -597,7 +598,7 @@ - EXT3_I(inode)->i_flags |= EXT3_EXTENTS_FL; - ext3_extents_initialize_blockmap(handle, inode); - } -- -+ - err = ext3_mark_iloc_dirty(handle, inode, &iloc); - if (err) goto fail; - -@@ -610,6 +611,12 @@ - return ERR_PTR(-EDQUOT); - } - ext3_debug ("allocating inode %lu\n", inode->i_ino); -+ -+ if (test_opt(sb, EXTENTS_EA)) { -+ EXT3_I(inode)->i_flags |= EXT3_EXTENTS_EA_FL; -+ ext3_init_extents_tree_in_ea(handle, inode); -+ } -+ - return inode; - - fail: -Index: linux-2.4.20-8/fs/ext3/extents-in-ea.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/extents-in-ea.c 2004-01-27 20:21:43.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/extents-in-ea.c 2004-01-28 06:05:26.000000000 +0800 -@@ -30,6 +30,8 @@ - #include <linux/slab.h> - #include <asm/uaccess.h> - -+#define EXTENTS_EA "sparse_extents" -+#define EXTENTS_EA_SIZE 64 - static int ext3_get_ea_write_access(handle_t *handle, void *buffer) - { - struct buffer_head *bh = (struct buffer_head *) buffer; -@@ -81,6 +83,7 @@ - brelse(bh); - } - -+ - int ext3_init_tree_in_ea(struct inode *inode, int name_index, - const char *eaname, int size) - { -@@ -242,7 +245,23 @@ - buf->leaf_num++; - return EXT_CONTINUE; - } -- -+int ext3_init_extents_tree_in_ea(handle_t *handle, struct inode *inode) -+{ -+ return ext3_init_tree_in_ea(inode, EXT3_XATTR_INDEX_EXTENTS, -+ EXTENTS_EA, EXTENTS_EA_SIZE); -+} -+int ext3_insert_extents_in_ea(handle_t *handle, struct inode *inode, -+ unsigned long from, unsigned long num) -+{ -+ return ext3_ext_in_ea_alloc_space(inode, EXT3_XATTR_INDEX_EXTENTS, -+ EXTENTS_EA, from, num); -+} -+int ext3_remove_extents_in_ea(handle_t *handle, struct inode *inode, -+ unsigned long from, unsigned long num) -+{ -+ return ext3_ext_in_ea_remove_space(inode, EXT3_XATTR_INDEX_EXTENTS, -+ EXTENTS_EA, from, num); -+} - struct ea_tree_desc { - int name_index; - char eaname[256]; -Index: linux-2.4.20-8/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/inode.c 2004-01-27 19:34:11.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/inode.c 2004-01-28 06:03:46.000000000 +0800 -@@ -32,7 +32,7 @@ - #include <linux/quotaops.h> - #include <linux/module.h> - #include "iopen.h" -- -+#include <linux/ext3_extents.h> - /* - * SEARCH_FROM_ZERO forces each block allocation to search from the start - * of the filesystem. This is to force rapid reallocation of recently-freed -@@ -852,9 +852,18 @@ - ext3_get_block_wrap(handle_t *handle, struct inode *inode, long block, - struct buffer_head *bh, int create) - { -+ int rc1 = 0, rc2 = 0; -+ - if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) -- return ext3_ext_get_block(handle, inode, block, bh, create); -- return ext3_get_block_handle(handle, inode, block, bh, create); -+ rc1 = ext3_ext_get_block(handle, inode, block, bh, create); -+ rc1 = ext3_get_block_handle(handle, inode, block, bh, create); -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_EA_FL) { -+ if (create) -+ rc2 = ext3_insert_extents_in_ea(handle, inode, block, 1); -+ } -+ if (!rc1) -+ return rc2; -+ return rc1; - } - - /* -@@ -1897,6 +1906,11 @@ - - ext3_discard_prealloc(inode); - -+ if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_EA_FL) { -+ last_block = (inode->i_size + inode->i_sb->s_blocksize - 1) -+ >> EXT3_BLOCK_SIZE_BITS(inode->i_sb); -+ ext3_remove_extents_in_ea(NULL, inode, last_block, 0xffffffff); -+ } - if (EXT3_I(inode)->i_flags & EXT3_EXTENTS_FL) - return ext3_ext_truncate(inode); - -Index: linux-2.4.20-8/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_fs.h 2004-01-27 20:21:43.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_fs.h 2004-01-28 05:57:51.000000000 +0800 -@@ -185,6 +185,7 @@ - #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ - #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ - #define EXT3_EXTENTS_FL 0x00080000 /* Inode uses extents */ -+#define EXT3_EXTENTS_EA_FL 0x00100000 /* Inode uses extents */ - - #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ - #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ -@@ -341,6 +342,7 @@ - #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ - #define EXT3_MOUNT_EXTENTS 0x100000/* Extents support */ - #define EXT3_MOUNT_EXTDEBUG 0x200000/* Extents debug */ -+#define EXT3_MOUNT_EXTENTS_EA 0x400000/* record sparse Extents */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -Index: linux-2.4.20-8/include/linux/ext3_xattr.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_xattr.h 2004-01-27 20:21:42.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_xattr.h 2004-01-28 05:57:51.000000000 +0800 -@@ -24,6 +24,7 @@ - #define EXT3_XATTR_INDEX_TRUSTED 4 - #define EXT3_XATTR_INDEX_LUSTRE 5 - #define EXT3_XATTR_INDEX_SECURITY 6 -+#define EXT3_XATTR_INDEX_EXTENTS 7 - - struct ext3_xattr_header { - __u32 h_magic; /* magic number for identification */ -Index: linux-2.4.20-8/include/linux/ext3_extents.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_extents.h 2004-01-28 05:56:02.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_extents.h 2004-01-28 06:46:15.000000000 +0800 -@@ -209,5 +209,7 @@ - extern struct ext3_ext_path * ext3_ext_find_extent(struct ext3_extents_tree *, int, struct ext3_ext_path *); - - extern int ext3_insert_extents_in_ea(handle_t *handle, struct inode *inode, unsigned long from, unsigned long num); -+extern int ext3_remove_extents_in_ea(handle_t *handle, struct inode *inode, unsigned long from, unsigned long num); -+extern int ext3_init_extents_tree_in_ea(handle_t *handle, struct inode *inode); - #endif /* _LINUX_EXT3_EXTENTS */ - diff --git a/lustre/kernel_patches/patches/ext3-reserve-inode-space-2.4.24.patch b/lustre/kernel_patches/patches/ext3-reserve-inode-space-2.4.24.patch deleted file mode 100644 index 65c64197cf..0000000000 --- a/lustre/kernel_patches/patches/ext3-reserve-inode-space-2.4.24.patch +++ /dev/null @@ -1,238 +0,0 @@ -Index: linux-2.4.24/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/ialloc.c 2004-08-02 22:13:13.000000000 +0400 -+++ linux-2.4.24/fs/ext3/ialloc.c 2004-08-04 01:10:30.000000000 +0400 -@@ -41,6 +41,24 @@ - * when a file system is mounted (see ext3_read_super). - */ - -+/* -+ * this is very simple policy: files with O_INRESERVE goes to last group; -+ * files with no O_INRESERVE goes to all groups, but last. probably we'll -+ * specify group for O_INRESERVE files later -bzzz */ -+static inline int ext3_group_allowed(struct super_block *sb, int mode, int group) -+{ -+ if (!test_opt(sb, INRESERVE) || EXT3_SB(sb)->s_groups_count == 1) -+ return 1; -+ -+ if (mode & EXT3_S_INRESERVE) { -+ if (group != EXT3_SB(sb)->s_groups_count - 1) -+ return 0; -+ } else { -+ if (group == EXT3_SB(sb)->s_groups_count -1 ) -+ return 0; -+ } -+ return 1; -+} - - /* - * Read the inode allocation bitmap for a given block_group, reading -@@ -337,20 +355,33 @@ - return !ext3_test_bit(nr, bh2jh(bh)->b_committed_data); - } - --int ext3_find_group_dir(const struct inode *dir, -+int ext3_find_group_dir(const struct inode *dir, int mode, - struct ext3_group_desc **gdp, - struct buffer_head **bh) - { - struct super_block *sb = dir->i_sb; - struct ext3_super_block *es; - struct ext3_group_desc *tmp; -- int i = 0, j, avefreei; -+ int i = 0, j, ifree, avefreei; - - es = EXT3_SB(sb)->s_es; -- avefreei = le32_to_cpu(es->s_free_inodes_count) / -- sb->u.ext3_sb.s_groups_count; -+ ifree = le32_to_cpu(es->s_free_inodes_count); -+ j = sb->u.ext3_sb.s_groups_count; -+ if (test_opt(sb, INRESERVE) && EXT3_SB(sb)->s_groups_count > 1) { -+ tmp = ext3_get_group_desc(sb, EXT3_SB(sb)->s_groups_count-1, NULL); -+ if (mode & EXT3_S_INRESERVE) { -+ ifree = le16_to_cpu(tmp->bg_free_blocks_count); -+ j = 1; -+ } else { -+ ifree -= le16_to_cpu(tmp->bg_free_blocks_count); -+ j--; -+ } -+ } -+ avefreei = ifree / j; - for (j = 0; j < sb->u.ext3_sb.s_groups_count; j++) { - struct buffer_head *temp_buffer; -+ if (!ext3_group_allowed(sb, mode, j)) -+ continue; - tmp = ext3_get_group_desc(sb, j, &temp_buffer); - if (tmp && le16_to_cpu(tmp->bg_free_inodes_count) && - le16_to_cpu(tmp->bg_free_inodes_count) >= avefreei) { -@@ -366,7 +397,7 @@ - return i; - } - --int ext3_find_group_other(const struct inode *dir, -+int ext3_find_group_other(const struct inode *dir, int mode, - struct ext3_group_desc **gdp, - struct buffer_head **bh) - { -@@ -379,7 +410,8 @@ - */ - i = dir->u.ext3_i.i_block_group; - tmp = ext3_get_group_desc(sb, i, bh); -- if (tmp && le16_to_cpu(tmp->bg_free_inodes_count)) -+ if (tmp && le16_to_cpu(tmp->bg_free_inodes_count) -+ && ext3_group_allowed(sb, mode, i)) - *gdp = tmp; - else { - /* -@@ -390,6 +422,8 @@ - i += j; - if (i >= sb->u.ext3_sb.s_groups_count) - i -= sb->u.ext3_sb.s_groups_count; -+ if (!ext3_group_allowed(sb, mode, i)) -+ continue; - tmp = ext3_get_group_desc (sb, i, bh); - if (tmp && le16_to_cpu(tmp->bg_free_inodes_count)) { - *gdp = tmp; -@@ -405,6 +439,8 @@ - for (j = 2; j < sb->u.ext3_sb.s_groups_count; j++) { - if (++i >= sb->u.ext3_sb.s_groups_count) - i = 0; -+ if (!ext3_group_allowed(sb, mode, i)) -+ continue; - tmp = ext3_get_group_desc (sb, i, bh); - if (tmp && le16_to_cpu(tmp->bg_free_inodes_count)) { - *gdp = tmp; -@@ -421,8 +457,8 @@ - struct buffer_head **bh) - { - if (S_ISDIR(mode)) -- return ext3_find_group_dir(dir, gdp, bh); -- return ext3_find_group_other(dir, gdp, bh); -+ return ext3_find_group_dir(dir, mode, gdp, bh); -+ return ext3_find_group_other(dir, mode, gdp, bh); - } - - static int ext3_find_usable_inode(struct super_block *sb, -@@ -549,6 +585,8 @@ - for (i = i + 1; i != k; i++) { - if (i >= sb->u.ext3_sb.s_groups_count) - i = 0; -+ if (!ext3_group_allowed(sb, mode, i)) -+ continue; - tmp = ext3_get_group_desc(sb, i, &bh2); - if (le16_to_cpu(tmp->bg_free_inodes_count) == 0) - continue; -@@ -588,6 +626,7 @@ - if (buffer_jbd(bh) && bh2jh(bh)->b_committed_data) - J_ASSERT_BH(bh, !ext3_test_bit(j, bh2jh(bh)->b_committed_data)); - -+ J_ASSERT(ext3_group_allowed(sb, mode, i)); - j += i * EXT3_INODES_PER_GROUP(sb) + 1; - if (j < EXT3_FIRST_INO(sb) || j > le32_to_cpu(es->s_inodes_count)) { - ext3_error (sb, "ext3_new_inode", -@@ -628,7 +667,7 @@ - mode |= S_ISGID; - } else - inode->i_gid = current->fsgid; -- inode->i_mode = mode; -+ inode->i_mode = mode & ~EXT3_S_INRESERVE; - - inode->i_ino = j; - /* This is the optimal IO size (for stat), not the fs block size */ -Index: linux-2.4.24/fs/ext3/super.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/super.c 2004-08-02 22:13:12.000000000 +0400 -+++ linux-2.4.24/fs/ext3/super.c 2004-08-04 00:10:07.000000000 +0400 -@@ -723,6 +723,10 @@ - return 0; - *resgid = v; - } -+ else if (!strcmp (this_char, "inrsv")) { -+ set_opt (*mount_options, INRESERVE); -+ J_ASSERT((EXT3_S_INRESERVE & S_IALLUGO) == 0); -+ } - else if (!strcmp (this_char, "resuid")) { - unsigned long v; - if (want_numeric(value, "resuid", &v)) -Index: linux-2.4.24/fs/ext3/namei.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/namei.c 2004-08-02 22:13:13.000000000 +0400 -+++ linux-2.4.24/fs/ext3/namei.c 2004-08-03 03:21:09.000000000 +0400 -@@ -1971,6 +1971,36 @@ - return err; - } - -+static int ext3_create_it (struct inode * dir, struct dentry * dentry, int mode, -+ struct lookup_intent *it) -+{ -+ handle_t *handle; -+ struct inode * inode; -+ int err; -+ -+ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + -+ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); -+ if (IS_ERR(handle)) { -+ return PTR_ERR(handle); -+ } -+ -+ if (IS_SYNC(dir)) -+ handle->h_sync = 1; -+ -+ if (it && it->it_flags & O_INRESERVE) -+ mode |= EXT3_S_INRESERVE; -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); -+ err = PTR_ERR(inode); -+ if (!IS_ERR(inode)) { -+ inode->i_op = &ext3_file_inode_operations; -+ inode->i_fop = &ext3_file_operations; -+ inode->i_mapping->a_ops = &ext3_aops; -+ err = ext3_add_nondir(handle, dentry, inode); -+ } -+ ext3_journal_stop(handle, dir); -+ return err; -+} -+ - static int ext3_mknod (struct inode * dir, struct dentry *dentry, - int mode, int rdev) - { -@@ -2803,6 +2833,7 @@ - */ - struct inode_operations ext3_dir_inode_operations = { - create: ext3_create, /* BKL held */ -+ create_it: ext3_create_it, /* BKL held */ - lookup: ext3_lookup, /* BKL held */ - lookup_raw: ext3_lookup_raw, /* BKL held */ - link: ext3_link, /* BKL held */ -Index: linux-2.4.24/include/asm-i386/fcntl.h -=================================================================== ---- linux-2.4.24.orig/include/asm-i386/fcntl.h 2001-09-18 00:16:30.000000000 +0400 -+++ linux-2.4.24/include/asm-i386/fcntl.h 2004-08-03 01:20:55.000000000 +0400 -@@ -20,6 +20,7 @@ - #define O_LARGEFILE 0100000 - #define O_DIRECTORY 0200000 /* must be a directory */ - #define O_NOFOLLOW 0400000 /* don't follow links */ -+#define O_INRESERVE 01000000 /* allocate inodes in reserved space */ - - #define F_DUPFD 0 /* dup */ - #define F_GETFD 1 /* get close_on_exec */ -Index: linux-2.4.24/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.24.orig/include/linux/ext3_fs.h 2004-08-02 22:13:12.000000000 +0400 -+++ linux-2.4.24/include/linux/ext3_fs.h 2004-08-03 01:03:39.000000000 +0400 -@@ -343,6 +343,7 @@ - #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ - #define EXT3_MOUNT_EXTENTS 0x100000/* Extents support */ - #define EXT3_MOUNT_EXTDEBUG 0x200000/* Extents debug */ -+#define EXT3_MOUNT_INRESERVE 0x400000/* reserve one group for O_INRESERVE */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -482,6 +483,8 @@ - - #define EXT3_GOOD_OLD_INODE_SIZE 128 - -+#define EXT3_S_INRESERVE 01000000 -+ - /* - * Feature set definitions - */ diff --git a/lustre/kernel_patches/patches/ext3-reserve-inode-space-2.6.7.patch b/lustre/kernel_patches/patches/ext3-reserve-inode-space-2.6.7.patch new file mode 100755 index 0000000000..85701aef1c --- /dev/null +++ b/lustre/kernel_patches/patches/ext3-reserve-inode-space-2.6.7.patch @@ -0,0 +1,286 @@ +Index: linux-2.6.7/fs/ext3/ialloc.c +=================================================================== +--- linux-2.6.7.orig/fs/ext3/ialloc.c 2004-08-27 14:28:16.000000000 +0800 ++++ linux-2.6.7/fs/ext3/ialloc.c 2004-08-27 14:29:21.000000000 +0800 +@@ -43,6 +43,24 @@ + * the free blocks count in the block. + */ + ++/* ++ * this is very simple policy: files with O_INRESERVE goes to last group; ++ * files with no O_INRESERVE goes to all groups, but last. probably we'll ++ * specify group for O_INRESERVE files later -bzzz */ ++static inline int ext3_group_allowed(struct super_block *sb, int mode, int group) ++{ ++ if (!test_opt(sb, INRESERVE) || EXT3_SB(sb)->s_groups_count == 1) ++ return 1; ++ ++ if (mode & EXT3_S_INRESERVE) { ++ if (group != EXT3_SB(sb)->s_groups_count - 1) ++ return 0; ++ } else { ++ if (group == EXT3_SB(sb)->s_groups_count -1 ) ++ return 0; ++ } ++ return 1; ++} + + /* + * Read the inode allocation bitmap for a given block_group, reading +@@ -203,7 +221,7 @@ + * For other inodes, search forward from the parent directory\'s block + * group to find a free inode. + */ +-static int find_group_dir(struct super_block *sb, struct inode *parent) ++static int find_group_dir(struct super_block *sb, struct inode *parent, int mode) + { + int ngroups = EXT3_SB(sb)->s_groups_count; + int freei, avefreei; +@@ -215,6 +233,8 @@ + avefreei = freei / ngroups; + + for (group = 0; group < ngroups; group++) { ++ if (!ext3_group_allowed(sb, mode, group)) ++ continue; + desc = ext3_get_group_desc (sb, group, &bh); + if (!desc || !desc->bg_free_inodes_count) + continue; +@@ -258,7 +278,7 @@ + #define INODE_COST 64 + #define BLOCK_COST 256 + +-static int find_group_orlov(struct super_block *sb, struct inode *parent) ++static int find_group_orlov(struct super_block *sb, struct inode *parent, int mode) + { + int parent_group = EXT3_I(parent)->i_block_group; + struct ext3_sb_info *sbi = EXT3_SB(sb); +@@ -288,6 +308,8 @@ + parent_group = (unsigned)group % ngroups; + for (i = 0; i < ngroups; i++) { + group = (parent_group + i) % ngroups; ++ if (!ext3_group_allowed(sb, mode, group)) ++ continue; + desc = ext3_get_group_desc (sb, group, &bh); + if (!desc || !desc->bg_free_inodes_count) + continue; +@@ -357,7 +379,7 @@ + return -1; + } + +-static int find_group_other(struct super_block *sb, struct inode *parent) ++static int find_group_other(struct super_block *sb, struct inode *parent, int mode) + { + int parent_group = EXT3_I(parent)->i_block_group; + int ngroups = EXT3_SB(sb)->s_groups_count; +@@ -393,6 +415,8 @@ + group += i; + if (group >= ngroups) + group -= ngroups; ++ if (!ext3_group_allowed(sb, mode, group)) ++ continue; + desc = ext3_get_group_desc (sb, group, &bh); + if (desc && le16_to_cpu(desc->bg_free_inodes_count) && + le16_to_cpu(desc->bg_free_blocks_count)) +@@ -407,6 +431,8 @@ + for (i = 0; i < ngroups; i++) { + if (++group >= ngroups) + group = 0; ++ if (!ext3_group_allowed(sb, mode, group)) ++ continue; + desc = ext3_get_group_desc (sb, group, &bh); + if (desc && le16_to_cpu(desc->bg_free_inodes_count)) + return group; +@@ -502,40 +528,41 @@ + continue_allocation: + if (S_ISDIR(mode)) { + if (test_opt (sb, OLDALLOC)) +- group = find_group_dir(sb, dir); ++ group = find_group_dir(sb, dir, mode); + else +- group = find_group_orlov(sb, dir); ++ group = find_group_orlov(sb, dir, mode); + } else +- group = find_group_other(sb, dir); ++ group = find_group_other(sb, dir, mode); + + err = -ENOSPC; + if (group == -1) + goto out; + + for (i = 0; i < sbi->s_groups_count; i++) { +- gdp = ext3_get_group_desc(sb, group, &bh2); ++ if (ext3_group_allowed(sb, mode, group)) { ++ gdp = ext3_get_group_desc(sb, group, &bh2); + +- err = -EIO; +- brelse(bitmap_bh); +- bitmap_bh = read_inode_bitmap(sb, group); +- if (!bitmap_bh) +- goto fail; ++ err = -EIO; ++ brelse(bitmap_bh); ++ bitmap_bh = read_inode_bitmap(sb, group); ++ if (!bitmap_bh) ++ goto fail; ++ ++ ino = 0; ++ ++ repeat_in_this_group: ++ ino = ext3_find_next_zero_bit((unsigned long *) ++ bitmap_bh->b_data, EXT3_INODES_PER_GROUP(sb), ino); ++ if (ino < EXT3_INODES_PER_GROUP(sb)) { ++ if (ext3_test_allocatable(ino, bitmap_bh)) { ++ goto got; ++ } ++ J_ASSERT_BH(bitmap_bh, bh2jh(bitmap_bh)->b_committed_data); + +- ino = 0; +- +-repeat_in_this_group: +- ino = ext3_find_next_zero_bit((unsigned long *) +- bitmap_bh->b_data, EXT3_INODES_PER_GROUP(sb), ino); +- if (ino < EXT3_INODES_PER_GROUP(sb)) { +- if (ext3_test_allocatable(ino, bitmap_bh)) { +- goto got; ++ if (++ino < EXT3_INODES_PER_GROUP(sb)) ++ goto repeat_in_this_group; + } +- J_ASSERT_BH(bitmap_bh, bh2jh(bitmap_bh)->b_committed_data); +- +- if (++ino < EXT3_INODES_PER_GROUP(sb)) +- goto repeat_in_this_group; + } +- + /* + * This case is possible in concurrent environment. It is very + * rare. We cannot repeat the find_group_xxx() call because +@@ -548,7 +575,6 @@ + } + err = -ENOSPC; + goto out; +- + got: + BUFFER_TRACE(bitmap_bh, "get_undo_access"); + err = ext3_journal_get_undo_access(handle, bitmap_bh, NULL); +@@ -567,6 +593,7 @@ + if (buffer_jbd(bitmap_bh) && bh2jh(bitmap_bh)->b_committed_data) + J_ASSERT_BH(bitmap_bh, !ext3_test_bit(ino, bh2jh(bitmap_bh)->b_committed_data)); + ++ J_ASSERT(ext3_group_allowed(sb, mode, group)); + ino += group * EXT3_INODES_PER_GROUP(sb) + 1; + if (ino < EXT3_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) { + ext3_error (sb, "ext3_new_inode", +@@ -605,7 +632,7 @@ + mode |= S_ISGID; + } else + inode->i_gid = current->fsgid; +- inode->i_mode = mode; ++ inode->i_mode = mode & ~EXT3_S_INRESERVE; + + inode->i_ino = ino; + /* This is the optimal IO size (for stat), not the fs block size */ +Index: linux-2.6.7/fs/ext3/super.c +=================================================================== +--- linux-2.6.7.orig/fs/ext3/super.c 2004-08-27 12:04:38.000000000 +0800 ++++ linux-2.6.7/fs/ext3/super.c 2004-08-27 14:28:22.000000000 +0800 +@@ -644,6 +644,7 @@ + {Opt_iopen_nopriv, "iopen_nopriv"}, + {Opt_extents, "extents"}, + {Opt_extdebug, "extdebug"}, ++ {Opt_inrsv, "inrsv"}, + {Opt_err, NULL} + }; + +@@ -929,6 +930,10 @@ + case Opt_extdebug: + set_opt (sbi->s_mount_opt, EXTDEBUG); + break; ++ case Opt_inrsv: ++ set_opt (sbi->s_mount_opt, INRESERVE); ++ J_ASSERT((EXT3_S_INRESERVE & S_IALLUGO) == 0); ++ break; + default: + printk (KERN_ERR + "EXT3-fs: Unrecognized mount option \"%s\" " +Index: linux-2.6.7/fs/ext3/namei.c +=================================================================== +--- linux-2.6.7.orig/fs/ext3/namei.c 2004-08-27 13:03:21.000000000 +0800 ++++ linux-2.6.7/fs/ext3/namei.c 2004-08-27 14:36:09.000000000 +0800 +@@ -1701,6 +1701,36 @@ + return err; + } + ++static int ext3_create_it (struct inode * dir, struct dentry * dentry, int mode, ++ struct lookup_intent *it) ++{ ++ handle_t *handle; ++ struct inode * inode; ++ int err; ++ ++ handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + ++ EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3); ++ if (IS_ERR(handle)) { ++ return PTR_ERR(handle); ++ } ++ ++ if (IS_SYNC(dir)) ++ handle->h_sync = 1; ++ ++ if (it && it->it_flags & O_INRESERVE) ++ mode |= EXT3_S_INRESERVE; ++ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); ++ err = PTR_ERR(inode); ++ if (!IS_ERR(inode)) { ++ inode->i_op = &ext3_file_inode_operations; ++ inode->i_fop = &ext3_file_operations; ++ ext3_set_aops(inode); ++ err = ext3_add_nondir(handle, dentry, inode); ++ } ++ ext3_journal_stop(handle, dir); ++ return err; ++} ++ + static int ext3_mknod (struct inode * dir, struct dentry *dentry, + int mode, dev_t rdev) + { +@@ -2462,6 +2492,7 @@ + */ + struct inode_operations ext3_dir_inode_operations = { + .create = ext3_create, ++ .create_it = ext3_create_it, /* BKL held */ + .lookup = ext3_lookup, + .link = ext3_link, + .unlink = ext3_unlink, +Index: linux-2.6.7/include/asm-i386/fcntl.h +=================================================================== +--- linux-2.6.7.orig/include/asm-i386/fcntl.h 2004-06-16 13:19:35.000000000 +0800 ++++ linux-2.6.7/include/asm-i386/fcntl.h 2004-08-27 14:28:22.000000000 +0800 +@@ -20,6 +20,7 @@ + #define O_LARGEFILE 0100000 + #define O_DIRECTORY 0200000 /* must be a directory */ + #define O_NOFOLLOW 0400000 /* don't follow links */ ++#define O_INRESERVE 01000000 /* allocate inodes in reserved space */ + + #define F_DUPFD 0 /* dup */ + #define F_GETFD 1 /* get close_on_exec */ +Index: linux-2.6.7/include/linux/ext3_fs.h +=================================================================== +--- linux-2.6.7.orig/include/linux/ext3_fs.h 2004-08-27 13:03:21.000000000 +0800 ++++ linux-2.6.7/include/linux/ext3_fs.h 2004-08-27 14:28:22.000000000 +0800 +@@ -343,6 +343,7 @@ + #define EXT3_MOUNT_EXTDEBUG 0x20000 /* Extents debug */ + #define EXT3_MOUNT_IOPEN 0x40000 /* Allow access via iopen */ + #define EXT3_MOUNT_IOPEN_NOPRIV 0x80000 /* Make iopen world-readable */ ++#define EXT3_MOUNT_INRESERVE 0x400000/* reserve one group for O_INRESERVE */ + + /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ + #ifndef clear_opt +@@ -493,6 +494,8 @@ + + #define EXT3_GOOD_OLD_INODE_SIZE 128 + ++#define EXT3_S_INRESERVE 01000000 ++ + /* + * Feature set definitions + */ diff --git a/lustre/kernel_patches/patches/ext3-san-2.4.20.patch b/lustre/kernel_patches/patches/ext3-san-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-san-2.4.20.patch rename to lustre/kernel_patches/patches/ext3-san-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-snapfs-2.4.20.patch b/lustre/kernel_patches/patches/ext3-snapfs-2.4.20.patch deleted file mode 100644 index 0caf03456d..0000000000 --- a/lustre/kernel_patches/patches/ext3-snapfs-2.4.20.patch +++ /dev/null @@ -1,3069 +0,0 @@ -%patch -Index: linux-2.4.20-8/fs/ext3/snap.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/snap.c 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/snap.c 2004-01-27 23:59:48.000000000 +0800 -@@ -0,0 +1,2578 @@ -+/* fs/ext3/snap.c -+ * -+ * Copyright (c) 2002 Cluster File Systems, Inc. <info@clusterfs.com> -+ * started by Andreas Dilger <adilger@turbolinux.com> -+ * Peter Braam <braam@mountainviewdata.com> -+ * Harrison Xing <harrisonx@mountainviewdata.com> -+ * Eric Mei <Ericm@clusterfs.com> -+ * -+ * port to 2.4 by Wang Di <wangdi@clusterfs.com> -+ * Eric Mei <ericm@clusterfs.com> -+ * -+ * Functions for implementing snapshots in the ext3 filesystem. They are -+ * intended to hide the internals of the filesystem from the caller in -+ * such a way that the caller doesn't need to know about inode numbers, -+ * how the redirectors are implemented or stored, etc. It may not do that -+ * all yet, but it tries. -+ * -+ * The snapshot inode redirection is stored in the primary/direct inode as -+ * an extended attribute $snap, in the form of little-endian u32 inode -+ * numbers. -+ * -+ */ -+ -+#define EXPORT_SYMTAB -+#include <linux/module.h> -+ -+#include <linux/sched.h> -+#include <linux/jbd.h> -+#include <linux/mm.h> -+#include <linux/slab.h> -+#include <linux/locks.h> -+#include <linux/snap.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#define EXT3_SNAP_ATTR "@snap" -+#define EXT3_SNAP_GENERATION_ATTR "@snap_generation" -+#define EXT3_MAX_SNAPS 20 -+#define EXT3_MAX_SNAP_DATA (sizeof(struct snap_ea)) -+#define EXT3_SNAP_INDEX EXT3_XATTR_INDEX_LUSTRE -+ -+#define EXT3_SNAP_DEBUG -+#ifdef EXT3_SNAP_DEBUG -+ #define snap_debug(f, a...) \ -+ do { \ -+ printk (KERN_INFO "SNAP DEBUG: (%s, %d): %s: ", \ -+ __FILE__, __LINE__, __FUNCTION__); \ -+ printk (f, ## a); \ -+ } while (0) -+ -+ #define snap_err(f, a...) \ -+ do { \ -+ printk (KERN_ERR "SNAP ERROR: (%s, %d): %s: ", \ -+ __FILE__, __LINE__, __FUNCTION__); \ -+ printk (f, ## a); \ -+ } while (0) -+ -+#else -+ #define snap_debug(f, a...) do {} while (0) -+ #define snap_err(f, a...) \ -+ do { \ -+ printk (KERN_ERR "SNAP ERROR: (%s, %d): ", \ -+ __FILE__, __LINE__); \ -+ printk (f, ## a); \ -+ } while (0) -+ -+#endif -+ -+#ifdef EXT3_SNAP_DEBUG -+ #define ALLOC(ptr, cast, size) \ -+ do { \ -+ ptr = (cast)kmalloc((size_t) size, GFP_KERNEL); \ -+ if (ptr == 0) { \ -+ printk(KERN_ERR "kmalloc returns 0 at %s:%d\n", \ -+ __FILE__, __LINE__); \ -+ } else { \ -+ snap_kmem += size; \ -+ printk(KERN_INFO "snap_alloc %d, kmem %ld\n", \ -+ (size_t)size, snap_kmem); \ -+ } \ -+ } while (0) -+ -+ #define FREE(ptr,size) \ -+ do { \ -+ kfree((ptr)); \ -+ snap_kmem -= size; \ -+ printk(KERN_INFO "snap_free %d, kmem %ld\n", \ -+ (size_t)size, snap_kmem); \ -+ } while (0) -+ -+#else -+ #define ALLOC(ptr, cast, size) \ -+ do { \ -+ ptr = (cast)kmalloc((size_t) size, GFP_KERNEL); \ -+ } while (0) -+ -+ #define FREE(ptr,size) \ -+ do { \ -+ kfree((ptr)); \ -+ } while (0) -+ -+#endif /* EXT3_SNAP_DEBUG */ -+ -+#ifdef EXT3_SNAP_DEBUG -+ /* modestr: convert inode mode to string . debug function */ -+ static char * modestr ( umode_t mode ) -+ { -+ if( S_ISREG(mode) ) -+ return "file"; -+ else if(S_ISDIR(mode)) -+ return "dir"; -+ else if(S_ISLNK(mode)) -+ return "link"; -+ else if(S_ISCHR(mode)) -+ return "char"; -+ else if(S_ISBLK(mode)) -+ return "block"; -+ else if(S_ISFIFO(mode)) -+ return "fifo"; -+ else if(S_ISSOCK(mode)) -+ return "sock"; -+ else -+ return "non-known"; -+ } -+#define DEBUG_INODE(inode) \ -+ if(inode && !IS_ERR(inode)) { \ -+ snap_debug("%s ino %lu, i_nlink %u, i_count %d, i_mode %u, i_size %lld, i_blocks %lu\n", \ -+ modestr(inode->i_mode), inode->i_ino, inode->i_nlink, \ -+ atomic_read(&inode->i_count), inode->i_mode, inode->i_size, \ -+ inode->i_blocks); } -+#else -+ #define modestr(mode) do {} while (0) -+ #define DEBUG_INODE(inode) -+ -+#endif /* EXT3_SNAP_DEBUG */ -+/* do file cow on: dir, symlink, regular but fs has filecow flag */ -+ -+#define IS_FILECOW_TYPE(inode) \ -+ (S_ISDIR(inode->i_mode) || \ -+ S_ISLNK(inode->i_mode) || \ -+ (S_ISREG(inode->i_mode) && \ -+ !SNAP_HAS_COMPAT_FEATURE(inode->i_sb, SNAP_FEATURE_COMPAT_BLOCKCOW))) -+ -+#define SNAP_ERROR(err) ((err) < 0 ? (err) : (-(err))) -+/* SNAP_ERROR(err): Make sure we return negative errors for Linux ( return positive errors) */ -+ -+#ifdef DEBUG -+#ifdef __KERNEL__ -+# ifdef __ia64__ -+# define CDEBUG_STACK (THREAD_SIZE - \ -+ ((unsigned long)__builtin_dwarf_cfa() & \ -+ (THREAD_SIZE - 1))) -+# else -+# define CDEBUG_STACK (THREAD_SIZE - \ -+ ((unsigned long)__builtin_frame_address(0) & \ -+ (THREAD_SIZE - 1))) -+# endif -+ -+#define snap_debug_msg(file, fn, line, stack, format, a...) \ -+ printf("(%s:%s,l. %d %d %lu): " format, file, fn, line, \ -+ getpid() , stack, ## a); -+#endif -+ -+#define CDEBUG(mask, format, a...) \ -+do { \ -+ CHECK_STACK(CDEBUG_STACK); \ -+ if (!(mask) || ((mask) & (D_ERROR | D_EMERG))) \ -+ snap_debug_msg(__FILE__, __FUNCTION__, __LINE__, \ -+ CDEBUG_STACK, format, ## a); \ -+} while (0) -+ -+#define CWARN (format, a...) CDEBUG(D_WARNING, format, ## a) -+#define CERROR(format, a...) CDEBUG(D_ERROR, format, ## a) -+#define CEMERG(format, a...) CDEBUG(D_EMERG, format, ## a) -+ -+#define RETURN(rc) \ -+do { \ -+ typeof(rc) RETURN__ret = (rc); \ -+ CDEBUG(D_TRACE, "Process leaving (rc=%lu : %ld : %lx)\n", \ -+ (long)RETURN__ret, (long)RETURN__ret, (long)RETURN__ret);\ -+ return RETURN__ret; \ -+} while (0) -+ -+#define ENTRY \ -+do { \ -+ CDEBUG(D_TRACE, "Process entered\n"); \ -+} while (0) -+ -+#define EXIT \ -+do { \ -+ CDEBUG(D_TRACE, "Process leaving\n"); \ -+} while(0) -+#else -+#define CDEBUG(mask, format, a...) do { } while (0) -+#define CWARN(format, a...) do { } while (0) -+#define CERROR(format, a...) printk("<3>" format, ## a) -+#define CEMERG(format, a...) printk("<0>" format, ## a) -+#define GOTO(label, rc) do { (void)(rc); goto label; } while (0) -+#define RETURN(rc) return (rc) -+#define ENTRY do { } while (0) -+#define EXIT do { } while (0) -+#endif /*DEBUG*/ -+ -+#define SNAP_ATTR_BUF_CNT 10 -+ -+#define SB_LAST_COWED_INO(sb) (EXT3_SB(sb)->s_es->s_last_cowed_pri_ino) -+#define SB_FIRST_COWED_INO(sb) (EXT3_SB(sb)->s_es->s_first_cowed_pri_ino) -+#define SB_SNAPTABLE_INO(sb) (EXT3_SB(sb)->s_es->s_snaptable_ino) -+#define SB_SNAP_LIST_SEM(sb) (EXT3_SB(sb)->s_snap_list_sem) -+#define SB_FEATURE_COMPAT(sb) (EXT3_SB(sb)->s_es->s_feature_compat) -+ -+#define SNAP_HAS_COMPAT_FEATURE(sb,mask) \ -+ (SB_FEATURE_COMPAT(sb) & cpu_to_le32(mask)) -+ -+/* NOTE: these macros are close dependant on the structure of snap ea */ -+#define SNAP_CNT_FROM_SIZE(size) ((((size)-sizeof(ino_t)*2)/2)/sizeof(ino_t)) -+#define SNAP_EA_SIZE_FROM_INDEX(index) (sizeof(ino_t)*2 + 2*sizeof(ino_t)*((index)+1)) -+ -+#define SNAP_EA_INO_BLOCK_SIZE(size) (((size)-sizeof(ino_t)*2)/2) -+#define SNAP_EA_PARENT_OFFSET(size) (sizeof(ino_t)*2 + SNAP_EA_INO_BLOCK_SIZE((size))) -+/*SET FLAGS*/ -+extern int ext3_bmap(struct address_space *mapping, long block); -+extern int ext3_load_inode_bitmap (struct super_block * sb, unsigned int block_group); -+extern int ext3_block_truncate_page(handle_t *handle, struct address_space *mapping, -+ loff_t from); -+/* helper functions to manipulate field 'parent' in snap_ea */ -+static inline int -+set_parent_ino(struct snap_ea *pea, int size, int index, ino_t val) -+{ -+ char * p = (char*) pea; -+ int offset; -+ -+ offset = sizeof(ino_t)*2 + (size - sizeof(ino_t)*2)/2; -+ offset += sizeof(ino_t) * index; -+ *(ino_t*)(p+offset) = val; -+ -+ return 0; -+} -+/* ext3_iterate_cowed_inode: -+ * iterate all the cowed inode with the same index and -+ * run the associate function @repeat -+ * -+ * For @repeat, if it returns non-zero value, it will exit the iterator -+ * -+ * return value: 0 or positive: success -+ * negative: failure -+ * additional: if the return value is positive, it must be the return value -+ * of function @repeat. -+ */ -+ -+static int ext3_iterate_cowed_inode( -+ struct super_block *sb, -+ int (*repeat)(struct inode *inode, void *priv), -+ struct inode **start, -+ void *priv) -+{ -+ struct inode *list_inode = NULL; -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ int err = 0; -+ -+ if (SB_FIRST_COWED_INO(sb) == 0) { -+ snap_debug("no cowed inode in the list\n"); -+ return 0; -+ } -+ -+ /* get head inode in the list */ -+ if (start != NULL && *start != NULL && (*start)->i_ino) -+ list_inode = iget(sb, (*start)->i_ino); -+ else -+ list_inode = iget (sb, le32_to_cpu( SB_FIRST_COWED_INO(sb) )); -+ -+ /* loop for all inode in list */ -+ while (list_inode) { -+ if (!list_inode->i_nlink || is_bad_inode(list_inode)) { -+ snap_err("inode %p, ino %lu, mode %o, nlink %d\n", -+ list_inode, -+ list_inode->i_ino, -+ list_inode->i_mode, -+ list_inode->i_nlink); -+ err = -EIO; -+ goto err_iput; -+ } -+ -+ err = ext3_xattr_get(list_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_err("inode %lu, error %d\n", list_inode->i_ino, err); -+ goto err_iput; -+ } -+ -+ if ((err = (*repeat)(list_inode, priv)) != 0) -+ goto err_iput; -+ -+ iput (list_inode); -+ -+ snaps = (struct snap_ea *) buf; -+ if (le32_to_cpu (snaps->next_ino) != 0) { -+ list_inode = iget(sb, le32_to_cpu(snaps->next_ino)); -+ } -+ else { -+ snap_debug ("cowed inode list end, exit\n"); -+ goto err_free; -+ } -+ } -+err_iput: -+ if (list_inode) -+ iput(list_inode); -+err_free: -+ return err; -+} -+static int get_cowed_ino(struct inode *pri, void *param) -+{ -+ ino_t *find = param; -+ (*find) = pri->i_ino; -+ return 0; -+} -+ -+/* Return 0 for error. */ -+static int get_cowed_ino_end (struct inode *inode) -+{ -+ int rc; -+ ino_t ino = 0; -+ -+ rc = ext3_iterate_cowed_inode(inode->i_sb, &get_cowed_ino, &inode, &ino); -+ -+ if (rc < 0) -+ return 0; -+ else -+ return ino; -+} -+ -+/* find the end of the primary inode, iterate if needed -+ * return 0 if any error found */ -+static inline ino_t find_last_cowed_ino(struct super_block *sb) -+{ -+ struct inode *inode = NULL; -+ ino_t first, last = 0; -+ -+ last = le32_to_cpu(SB_LAST_COWED_INO(sb)); -+ if (last) -+ return last; -+ -+ first = le32_to_cpu(SB_FIRST_COWED_INO(sb)); -+ -+ if (!first) { -+ snap_err("first cowed inode is NULL\n"); -+ goto exit; -+ } -+ -+ inode = iget(sb, first); -+ if (inode) { -+ if (is_bad_inode(inode)) { -+ snap_err("bad inode %lu\n", first); -+ goto exit; -+ } -+ -+ last = get_cowed_ino_end(inode); -+ } -+exit: -+ if (inode) -+ iput(inode); -+ return last; -+} -+ -+/* Insert the primary inode to the cowed inode list -+ * Append it to the list end -+ * -+ * @pri: inode to insert -+ * @buf_pri: the valid ea buf for @pri inode ( excluding the next_ino field) , -+ * it's used to write the ea for @pri inode -+ * -+ * To avoid list broken in abnormal case, it will first write the ea for @pri -+ * inode, and then write ea for the list end inode. Thus list broken is -+ * avoid even if there are errors when writting ea. -+ */ -+static int insert_cowed_ino_to_list (handle_t *handle, struct inode *pri, char *buf_pri) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ struct snap_ea *snaps_pri; -+ struct inode *last_inode = NULL; -+ struct ext3_sb_info *sbi = EXT3_SB(pri->i_sb); -+ int err = 0; -+ -+ snaps_pri = (struct snap_ea *)buf_pri; -+ -+ if (!SB_FIRST_COWED_INO(pri->i_sb)) { -+ /* we set the next_ino and write ea for pri inode */ -+ snaps_pri->next_ino = cpu_to_le32(0); -+ snaps_pri->prev_ino = cpu_to_le32(0); -+ -+ err = ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf_pri, EXT3_MAX_SNAP_DATA, 0); -+ if (err < 0) { -+ snap_err("ino %lu, set_ext_attr err %d\n", pri->i_ino, err); -+ return err; -+ } -+ lock_super(pri->i_sb); -+ ext3_journal_get_write_access(handle, sbi->s_sbh); -+ sbi->s_es->s_first_cowed_pri_ino = cpu_to_le32(pri->i_ino); -+ SB_FIRST_COWED_INO(pri->i_sb) = cpu_to_le32(pri->i_ino); -+ pri->i_sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, sbi->s_sbh); -+ unlock_super(pri->i_sb); -+ EXT3_I(pri)->i_flags |= EXT3_SNAP_PRI_FLAG; -+ return err; -+ } -+ -+ if (!SB_LAST_COWED_INO(pri->i_sb)){ -+ SB_LAST_COWED_INO(pri->i_sb) = find_last_cowed_ino(pri->i_sb); -+ if (!SB_LAST_COWED_INO(pri->i_sb) ){ -+ snap_err("error, last cowed inode is NULL\n"); -+ return (-EINVAL); -+ } -+ } -+ -+ last_inode = iget(pri->i_sb, SB_LAST_COWED_INO(pri->i_sb)); -+ if (!last_inode || is_bad_inode(last_inode)) { -+ iput(last_inode); -+ return -EINVAL; -+ } -+ err = ext3_xattr_get(last_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err == -ENODATA) { -+ snap_debug("no existing attributes - zeroing\n"); -+ memset(buf, 0, EXT3_MAX_SNAP_DATA); -+ } else if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_debug("got err %d when reading attributes\n", err); -+ goto exit; -+ } -+ /*set primary inode EA*/ -+ snaps_pri->next_ino = 0; -+ snaps_pri->prev_ino = cpu_to_le32(last_inode->i_ino); -+ -+ err = ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf_pri, EXT3_MAX_SNAP_DATA, 0); -+ if (err < 0) { -+ snap_debug("set attributes error for inode %lu\n", -+ (ulong)pri->i_ino); -+ goto exit; -+ } -+ -+ /*set last inode EA*/ -+ snaps = (struct snap_ea *) buf; -+ snaps->next_ino = cpu_to_le32(pri->i_ino); -+ err = ext3_xattr_set(handle, last_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA, 0); -+ if(err < 0){ -+ snap_debug("set attributes error for inode %lu\n", -+ (ulong)last_inode->i_ino); -+ goto exit; -+ } -+ -+ EXT3_I(pri)->i_flags |= EXT3_SNAP_PRI_FLAG; -+ -+ /* we update the new cowed ino list end in memory */ -+ SB_LAST_COWED_INO(pri->i_sb) = cpu_to_le32(pri->i_ino); -+ snap_debug("cowed_inode_list_end %lu, append ino=%lu\n", -+ last_inode->i_ino, pri->i_ino); -+exit: -+ if (last_inode) -+ iput(last_inode); -+ -+ return err; -+} -+ -+/* delelte the ino from cowed inode list */ -+static int delete_cowed_ino_from_list (handle_t *handle, struct inode *inode) -+{ -+ ino_t prev_ino = 0, next_ino = 0; -+ struct inode *prev_inode = NULL; -+ struct inode *next_inode = NULL; -+ struct snap_ea *snaps; -+ char buf[EXT3_MAX_SNAP_DATA]; -+ int err = 0; -+ -+ err = ext3_xattr_get(inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_err("get attr inode %lu, error %d\n", inode->i_ino, err); -+ goto err_exit; -+ } -+ -+ snaps = (struct snap_ea *) buf; -+ next_ino = le32_to_cpu(snaps->next_ino); -+ prev_ino = le32_to_cpu(snaps->prev_ino); -+ -+ /* if this is the first cowed ino */ -+ if (inode->i_ino == le32_to_cpu(SB_FIRST_COWED_INO(inode->i_sb))) { -+ SB_FIRST_COWED_INO(inode->i_sb) = cpu_to_le32(next_ino); -+ EXT3_I(inode)->i_flags &= ~EXT3_SNAP_PRI_FLAG; -+ if (next_ino == 0) -+ SB_LAST_COWED_INO(inode->i_sb) = 0; -+ } else { -+ if (!prev_ino) -+ goto err_exit; -+ -+ /* find previous inode and read its ea */ -+ prev_inode = iget(inode->i_sb, prev_ino); -+ if (!prev_inode || is_bad_inode(prev_inode)) -+ goto err_exit; -+ -+ err = ext3_xattr_get(prev_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_err("get attr inode %lu, error %d\n", prev_inode->i_ino, err); -+ goto err_exit; -+ } -+ -+ /* make the previous inode point to the next inode, -+ * but ignore errors because at current version we -+ * didn't use the previous pionter */ -+ snaps = (struct snap_ea *) buf; -+ snaps->next_ino = cpu_to_le32(next_ino); -+ -+ snap_debug("delete ino %lu from list\n", inode->i_ino); -+ -+ err = ext3_xattr_set(handle, prev_inode, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, buf, EXT3_MAX_SNAP_DATA, 0); -+ if (err < 0) { -+ snap_err("err %d setting ea for ino %lu\n", err, prev_inode->i_ino); -+ goto err_exit; -+ } -+ -+ if (next_ino == 0) { -+ SB_LAST_COWED_INO(inode->i_sb) = prev_ino; -+ goto err_exit; -+ } -+ -+ /* make the next inode point to the previous one */ -+ next_inode = iget(inode->i_sb, next_ino); -+ if (!next_inode || is_bad_inode(next_inode)) -+ goto err_exit; -+ -+ err = ext3_xattr_get(next_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_err("set attr inode %lu, error %d\n", next_inode->i_ino, err); -+ goto err_exit; -+ } -+ snaps = ( struct snap_ea *) buf; -+ snaps->prev_ino = cpu_to_le32(prev_ino); -+ -+ err = ext3_xattr_set(handle, next_inode, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, buf, EXT3_MAX_SNAP_DATA, 0); -+ if (err < 0) { -+ snap_err("err %d setting attributes for ino %lu\n", -+ err, next_inode->i_ino); -+ } -+ } -+err_exit: -+ iput(prev_inode); -+ iput(next_inode); -+ return err; -+} -+ -+static inline void lock_list(struct super_block *sb) -+{ -+ down(&SB_SNAP_LIST_SEM(sb)); -+} -+ -+static inline void unlock_list(struct super_block *sb) -+{ -+ up(&SB_SNAP_LIST_SEM(sb)); -+} -+ -+static int ext3_snap_feature (struct super_block *sb, int feature, int op) { -+ -+ int rc = -EINVAL; -+ handle_t *handle; -+ switch (op) { -+ case SNAP_SET_FEATURE: -+ handle = ext3_journal_start(sb->s_root->d_inode, 1); -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+ SB_FEATURE_COMPAT(sb) |= cpu_to_le32(feature); -+ sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ unlock_super(sb); -+ ext3_journal_stop(handle, sb->s_root->d_inode); -+ break; -+ case SNAP_CLEAR_FEATURE: -+ handle = ext3_journal_start(sb->s_root->d_inode, 1); -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+ SB_FEATURE_COMPAT(sb) &= ~cpu_to_le32(feature); -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ sb->s_dirt = 1; -+ unlock_super(sb); -+ ext3_journal_stop(handle, sb->s_root->d_inode); -+ break; -+ case SNAP_HAS_FEATURE: -+ /*FIXME should lock super or not*/ -+ rc = SNAP_HAS_COMPAT_FEATURE(sb, feature); -+ break; -+ default: -+ break; -+ } -+ return rc; -+} -+ -+#ifdef _DEVICE_FAIL_TEST -+/*FIXME later*/ -+extern int loop_discard_io(kdev_t dev, long arg); -+/* -+ * modify failpos to let loop fail at certain point -+ * let pos=0 mean no fail point -+ */ -+static int failpos = 0; -+#define loopfail(pos) \ -+ do{ \ -+ if( pos == failpos ){ \ -+ int i; \ -+ printk(KERN_EMERG "SNAP; hit fail point %d\n", failpos);\ -+ for( i=0; i<15; i++ ) \ -+ loop_discard_io( MKDEV(7,i), 1 ); \ -+ } \ -+ }while(0) -+#else -+#define loopfail(pos) do{}while(0) -+#endif -+ -+/* Save the indirect inode in the snapshot table of the primary inode. */ -+static int ext3_set_indirect(struct inode *pri, int index, ino_t ind_ino, ino_t parent_ino ) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ int err = 0, inlist = 1; -+ int ea_size; -+ handle_t *handle = NULL; -+ -+ snap_debug("(ino %lu, parent %lu): saving ind %lu to index %d\n", -+ pri->i_ino, parent_ino, ind_ino, index); -+ -+ if (index < 0 || index > MAX_SNAPS || !pri) -+ return -EINVAL; -+ /* need lock the list before get_attr() to avoid race */ -+ lock_list(pri->i_sb); -+ /* read ea at first */ -+ err = ext3_xattr_get(pri, EXT3_SNAP_INDEX ,EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err == -ENODATA || err == -ENOATTR) { -+ snap_debug("no extended attributes - zeroing\n"); -+ memset(buf, 0, EXT3_MAX_SNAP_DATA); -+ /* XXX -+ * To judge a inode in list, we only see if it has snap ea. -+ * So take care of snap ea of primary inodes very carefully. -+ * Is it right in snapfs EXT3, check it later? -+ */ -+ inlist = 0; -+ } else if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ goto out_unlock; -+ } -+ -+ handle = ext3_journal_start(pri, SNAP_SETIND_TRANS_BLOCKS); -+ if(!handle) { -+ err = PTR_ERR(handle); -+ goto out_unlock; -+ } -+ -+ snaps = (struct snap_ea *)buf; -+ snaps->ino[index] = cpu_to_le32 (ind_ino); -+ ea_size = EXT3_MAX_SNAP_DATA; -+ -+ set_parent_ino(snaps, ea_size, index, cpu_to_le32(parent_ino)); -+ -+ snap_debug("saving attributes\n"); -+ -+ if (inlist) { -+ err = ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA, 0); -+ } -+ else { -+ /* This will also write the ea for the pri inode, like above */ -+ err = insert_cowed_ino_to_list(handle, pri, buf); -+ } -+ ext3_mark_inode_dirty(handle, pri); -+ ext3_journal_stop(handle, pri); -+out_unlock: -+ unlock_list(pri->i_sb); -+ return err; -+} -+ -+/* -+ * is_redirector - determines if a primary inode is a redirector -+ * @inode: primary inode to test -+ * -+ * Returns 1 if the inode is a redirector, 0 otherwise. -+ */ -+static int is_redirector(struct inode *inode) -+{ -+ int is_redirector = 0; -+ int rc; -+ -+ rc = ext3_xattr_get(inode, EXT3_SNAP_INDEX ,EXT3_SNAP_ATTR, -+ NULL, 0); -+ if (rc > 0 && rc <= MAX_SNAP_DATA) -+ is_redirector = 1; -+ snap_debug("inode %lu %s redirector\n", inode->i_ino, -+ is_redirector ? "is" : "isn't"); -+ return is_redirector; -+} -+ -+/*if it's indirect inode or not */ -+static int is_indirect(struct inode *inode) -+{ -+ if (EXT3_I(inode)->i_flags |= EXT3_COW_FL) -+ return 1; -+ else -+ return 0; -+} -+/* -+ * Copy inode metadata from one inode to another, excluding blocks and size. -+ * FIXME do we copy EA data - ACLs and such (excluding snapshot data)? -+ */ -+static void ext3_copy_meta(handle_t *handle, struct inode *dst, struct inode *src) -+{ -+ int size; -+ -+ dst->i_mode = src->i_mode; -+ dst->i_nlink = src->i_nlink; -+ dst->i_uid = src->i_uid; -+ dst->i_gid = src->i_gid; -+ dst->i_atime = src->i_atime; -+ dst->i_mtime = src->i_mtime; -+ dst->i_ctime = src->i_ctime; -+// dst->i_version = src->i_version; -+ dst->i_attr_flags = src->i_attr_flags; -+ dst->i_generation = src->i_generation; -+ dst->u.ext3_i.i_dtime = src->u.ext3_i.i_dtime; -+ dst->u.ext3_i.i_flags = src->u.ext3_i.i_flags | EXT3_COW_FL; -+#ifdef EXT3_FRAGMENTS -+ dst->u.ext3_i.i_faddr = src->u.ext3_i.i_faddr; -+ dst->u.ext3_i.i_frag_no = src->u.ext3_i.i_frag_no; -+ dst->u.ext3_i.i_frag_size = src->u.ext3_i.i_frag_size; -+#endif -+ if ((size = ext3_xattr_list(src, NULL, 0)) > 0) { -+ char names[size]; -+ char *name; -+ int namelen; -+ -+ if (ext3_xattr_list(src, names, 0) < 0) -+ return; -+ /* -+ * the list of attribute names are stored as NUL terminated -+ * strings, with a double NUL string at the end. -+ */ -+ name = names; -+ while ((namelen = strlen(name))) { -+ int attrlen; -+ char *buf; -+ -+ /* don't copy snap data */ -+ if (!strcmp(name, EXT3_SNAP_ATTR)) { -+ snap_debug("skipping %s item\n", name); -+ continue; -+ } -+ snap_debug("copying %s item\n", name); -+ attrlen = ext3_xattr_get(src, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, NULL, 0); -+ if (attrlen < 0) -+ continue; -+ if ((buf = kmalloc(attrlen, GFP_ATOMIC)) == NULL) -+ break; -+ if (ext3_xattr_get(src, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, buf, attrlen) < 0) -+ continue; -+ if (ext3_xattr_set(handle, dst, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, buf, attrlen, 0) < 0) -+ break; -+ kfree(buf); -+ name += namelen + 1; /* skip name and trailing NUL */ -+ } -+ } -+} -+ -+static inline int ext3_has_ea(struct inode *inode) -+{ -+ return (EXT3_I(inode)->i_file_acl != 0); -+} -+/* XXX This function has a very bad effect to -+ * the performance of filesystem, -+ * will find another way to fix it -+ */ -+static void fs_flushinval_pages(handle_t *handle, struct inode* inode) -+{ -+ if (inode->i_blocks > 0 && inode->i_mapping) { -+ fsync_inode_data_buffers(inode); -+ // ext3_block_truncate_page(handle, inode->i_mapping, inode->i_size); -+ truncate_inode_pages(inode->i_mapping, 0); -+ } -+} -+ -+/* ext3_migrate_data2: -+ * MOVE all the data blocks from inode src to inode dst as well as -+ * COPY all attributes(meta data) from inode src to inode dst. -+ * For extended attributes(EA), we COPY all the EAs but skip the Snap EA from src to dst. -+ * If the dst has Snap EA, then we CAN'T overwrite it. We CAN'T copy the src Snap EA. -+ * XXX for EA, can we change it to MOVE all the EAs(exclude Snap EA) to dst and copy it back to src ? -+ * This is for LAN free backup later. -+ */ -+ -+static int ext3_migrate_data (handle_t *handle, struct inode *dst, struct inode *src) -+{ -+ unsigned long err = 0; -+ /* 512 byte disk blocks per inode block */ -+ int bpib = src->i_sb->s_blocksize >> 9; -+ -+ if((!dst) || (!src)) -+ return -EINVAL; -+ -+ if (dst->i_ino == src->i_ino) -+ return 0; -+ -+ fs_flushinval_pages(handle, src); -+ -+ ext3_copy_meta(handle, dst, src); -+ -+ snap_debug("migrating data blocks from %lu to %lu\n", src->i_ino, dst->i_ino); -+ /* Can't check blocks in case of EAs */ -+ -+ memcpy(EXT3_I(dst)->i_data, EXT3_I(src)->i_data, -+ sizeof(EXT3_I(src)->i_data)); -+ memset(EXT3_I(src)->i_data, 0, sizeof(EXT3_I(src)->i_data)); -+ -+ ext3_discard_prealloc(src); -+ -+ dst->i_size = EXT3_I(dst)->i_disksize = EXT3_I(src)->i_disksize; -+ src->i_size = EXT3_I(src)->i_disksize = 0; -+ -+ dst->i_blocks = src->i_blocks; -+ src->i_blocks = 0; -+ /* Check EA blocks here to modify i_blocks correctly */ -+ if(ext3_has_ea (src)) { -+ src->i_blocks += bpib; -+ if( ! ext3_has_ea (dst) ) -+ if( dst->i_blocks >= bpib ) -+ dst->i_blocks -= bpib; -+ } else { -+ if( ext3_has_ea (dst)) -+ dst->i_blocks += bpib; -+ } -+ -+ snap_debug("migrate data from ino %lu to ino %lu\n", -+ src->i_ino, dst->i_ino); -+ ext3_mark_inode_dirty(handle, src); -+ ext3_mark_inode_dirty(handle, dst); -+ -+ -+ return SNAP_ERROR(err); -+} -+ -+/** -+ * ext3_get_indirect - get a specific indirect inode from a primary inode -+ * @primary: primary (direct) inode -+ * @table: table of @slot + 1 indices in reverse chronological order -+ * @slot: starting slot number to check for indirect inode number -+ * -+ * We locate an indirect inode from a primary inode using the redirection -+ * table stored in the primary inode. Because the desired inode may actually -+ * be in a "newer" slot number than the supplied slot, we are given a table -+ * of indices in chronological order to search for the correct inode number. -+ * We walk table from @slot to 0 looking for a non-zero inode to load. -+ * -+ * To only load a specific index (and fail if it does not exist), you can -+ * pass @table = NULL, and the index number in @slot. If @slot == 0, the -+ * primary inode data is returned. -+ * -+ * We return a pointer to an inode, or an error. If the indirect inode for -+ * the given index does not exist, NULL is returned. -+ */ -+static struct inode *ext3_get_indirect(struct inode *primary, int *table, -+ int slot) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ ino_t ino; -+ struct inode *inode = NULL; -+ int err = 0, index = 0; -+ -+ if (slot < 0 || slot > EXT3_MAX_SNAPS || !primary) -+ return NULL; -+ -+ snap_debug("ino %lu, table %p, slot %d\n", primary->i_ino, table,slot); -+ -+ err = ext3_xattr_get(primary, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err == -ENODATA) { -+ slot = 0; -+ } else if (err < 0) { -+ snap_debug(" attribute read error\n"); -+ return NULL; -+ } -+ snaps = (struct snap_ea *)buf; -+ -+ /* if table is NULL and there is a slot */ -+ if( !table && slot ) { -+ index = slot; -+ ino = le32_to_cpu ( snaps->ino[index] ); -+ if(ino) inode = iget(primary->i_sb, ino); -+ goto err_free; -+ } -+ /* if table is not NULL */ -+ while ( !inode && slot > 0) { -+ index = table[slot]; -+ ino = le32_to_cpu ( snaps->ino[index] ); -+ -+ snap_debug("snap inode at slot %d is %lu\n", slot, ino); -+ if (!ino) { -+ --slot; -+ continue; -+ } -+ inode = iget(primary->i_sb, ino); -+ goto err_free; -+ } -+ if( slot == 0 && table ) { -+ snap_debug("redirector not found, using primary\n"); -+ inode = iget(primary->i_sb, primary->i_ino); -+ } -+err_free: -+ return inode; -+} -+ -+/* get the indirect ino at index of the primary inode -+ * return value: postive: indirect ino number -+ * negative or 0: error -+ */ -+static ino_t ext3_get_indirect_ino(struct inode *primary, int index) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ ino_t ino = 0; -+ int err; -+ -+ if (index < 0 || index > EXT3_MAX_SNAPS || !primary) -+ return 0; -+ -+ err = ext3_xattr_get(primary, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err == -ENOATTR) { -+ ino = -ENOATTR; -+ goto err_free; -+ } else if (err < 0) { -+ snap_err(EXT3_SNAP_ATTR " attribute read error\n"); -+ ino = -EINVAL; -+ goto err_free; -+ } -+ -+ snaps = (struct snap_ea *)buf; -+ ino = le32_to_cpu (snaps->ino[index]); -+ snap_debug("snap ino for %ld at index %d is %lu\n", -+ primary->i_ino, index, ino); -+err_free: -+ return ino; -+} -+/* ext3_copy_block - copy one data block from inode @src to @dst. -+ No lock here. User should do the lock. -+ User should check the return value to see if the result is correct. -+ Return value: -+ 1: The block has been copied successfully -+ 0: No block is copied, usually this is because src has no such blk -+ -1: Error -+*/ -+ -+static int ext3_copy_block (struct inode *dst, struct inode *src, int blk) -+{ -+ struct buffer_head *bh_dst = NULL, *bh_src = NULL; -+ int err = 0; -+ handle_t *handle = NULL; -+ -+ -+ snap_debug("copy blk %d from %lu to %lu \n", blk, src->i_ino, dst->i_ino); -+ /* -+ * ext3_getblk() require handle!=NULL -+ */ -+ if (S_ISREG(src->i_mode)) -+ return 0; -+ -+ handle = ext3_journal_start(dst, SNAP_COPYBLOCK_TRANS_BLOCKS); -+ if( !handle ) -+ return -1; -+ -+ bh_src = ext3_bread(handle, src, blk, 0, &err); -+ if (!bh_src) { -+ snap_err("error for src blk %d, error %d\n", blk, err); -+ goto exit_relese; -+ } -+ bh_dst = ext3_getblk(handle, dst, blk, 1, &err); -+ if (!bh_dst) { -+ snap_err("error for dst blk %d, error %d\n", blk, err); -+ err = -ENOSPC; -+ goto exit_relese; -+ } -+ snap_debug("copy block %lu to %lu (%ld bytes)\n", -+ bh_src->b_blocknr, bh_dst->b_blocknr, -+ src->i_sb->s_blocksize); -+ -+ ext3_journal_get_write_access(handle, bh_dst); -+ -+ memcpy(bh_dst->b_data, bh_src->b_data, src->i_sb->s_blocksize); -+ -+ ext3_journal_dirty_metadata(handle, bh_dst); -+ err = 1; -+exit_relese: -+ if (bh_src) brelse(bh_src); -+ if (bh_dst) brelse(bh_dst); -+ if (handle) -+ ext3_journal_stop(handle, dst); -+ return err; -+} -+ -+#ifdef EXT3_ENABLE_SNAP_ORPHAN -+/* -+ * add one inode to superblock's snap_orphan chain -+ * only add on-disk data for simplicity -+ */ -+static void add_snap_orphan(handle_t *handle, struct inode *pri, struct inode *ind) -+{ -+ struct ext3_sb_info *sb = &pri->i_sb->u.ext3_sb; -+ struct ext3_iloc iloc; -+ -+ if( ext3_get_inode_loc(ind, &iloc) ){ -+ snap_debug("--- get ind loc fail\n"); -+ brelse(iloc.bh); -+ return; -+ } -+ -+ snap_debug("add new ind inode %lu into orphan list," -+ " primary %lu, last orphan %u\n", -+ ind->i_ino, pri->i_ino, -+ sb->s_es->s_last_snap_orphan); -+ lock_super(pri->i_sb); -+ iloc.raw_inode->i_next_snap_orphan = sb->s_es->s_last_snap_orphan; -+ iloc.raw_inode->i_snap_primary = pri->i_ino; -+ ext3_mark_inode_dirty(handle, ind); -+ -+ ext3_journal_get_write_access(handle, sb->s_sbh); -+ sb->s_es->s_last_snap_orphan = ind->i_ino; -+ pri->i_sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, sb->s_sbh); -+ unlock_super(pri->i_sb); -+ brelse(iloc.bh); -+} -+ -+/* -+ * counterpart of add_snap_orphan -+ */ -+static void remove_snap_orphan(handle_t *handle, struct inode *ind) -+{ -+ struct ext3_sb_info *sb = &ind->i_sb->u.ext3_sb; -+ struct inode *pre = NULL, *inode = NULL; -+ struct ext3_iloc iloc, pre_iloc; -+ ino_t ino; -+ -+ lock_super(ind->i_sb); -+ for(ino = sb->s_es->s_last_snap_orphan; ino; ){ -+ snap_debug("found an orphan, ino=%lu\n", ino); -+ inode = iget( ind->i_sb, ino ); -+ if( !inode ){ -+ snap_debug("iget %lu fail\n", ino); -+ break; -+ } -+ if( ext3_get_inode_loc(inode, &iloc) ){ -+ snap_debug("get_inode_loc %lu fail\n", ino); -+ break; -+ } -+ if( ino == ind->i_ino ){ -+ if( !pre ){ -+ snap_debug("found at head of orphan chain\n"); -+ ext3_journal_get_write_access(handle, sb->s_sbh); -+ sb->s_es->s_last_snap_orphan = -+ iloc.raw_inode->i_next_snap_orphan; -+ ext3_journal_dirty_metadata(handle, sb->s_sbh); -+ snap_debug("set new last orphan: %u\n", -+ sb->s_es->s_last_snap_orphan); -+ break; -+ } -+ else { -+ snap_debug("found in middle of orphan chain\n"); -+ if( ext3_get_inode_loc(pre, &pre_iloc) ){ -+ snap_err("get pre_inode loc %lu fail\n", pre->i_ino); -+ break; -+ } -+ pre_iloc.raw_inode->i_next_snap_orphan = -+ iloc.raw_inode->i_next_snap_orphan; -+ ext3_mark_inode_dirty(handle, pre); -+ brelse(pre_iloc.bh); -+ break; -+ } -+ } -+ iput(pre); -+ pre = inode; -+ ino = iloc.raw_inode->i_next_snap_orphan; -+ brelse(iloc.bh); -+ } -+ iput(pre); -+ iput(inode); -+ unlock_super(ind->i_sb); -+ brelse(iloc.bh); -+} -+ -+/* -+ * FIXME: how about crashs again during recovery? -+ */ -+void snap_orphan_cleanup(struct super_block *sb) -+{ -+ ino_t ind_ino, pri_ino; -+ struct inode *ind = NULL, *pri = NULL; -+ struct ext3_iloc ind_iloc; -+ -+ if( (ind_ino = sb->u.ext3_sb.s_es->s_last_snap_orphan) == 0 ){ -+ snap_debug("snap_orphan_cleanup: nothing to do\n"); -+ return; -+ } -+ -+ snap_debug("------ begin cleanup snap orphans ------\n"); -+ do{ -+ ind = iget( sb, ind_ino ); -+ if( !ind ){ -+ snap_err("snap_orphan_cleanup: get " -+ "ind %lu fail\n", ind_ino); -+ break; -+ } -+ -+ if( ext3_get_inode_loc(ind, &ind_iloc) ){ -+ snap_err("snap_orphan_cleanup: get " -+ "iloc %lu fail\n", ind_ino); -+ iput( ind ); -+ break; -+ } -+ -+ ind_ino = sb->u.ext3_sb.s_es->s_last_snap_orphan = -+ ind_iloc.raw_inode->i_next_snap_orphan; -+ pri_ino = ind_iloc.raw_inode->i_snap_primary; -+ -+ pri = iget( sb, pri_ino ); -+ if( !pri ){ -+ snap_err("snap_orphan_cleanup: get primary " -+ "%lu fail\n", pri_ino); -+ iput( ind ); -+ }else -+ restore_snap_inode(pri, ind); -+ }while( ind_ino ); -+ snap_debug("------ end cleanup snap orphans ------\n"); -+ -+ sb->u.ext3_sb.s_es->s_last_snap_orphan = 0; -+ sb->s_dirt = 1; -+} -+#endif -+/* -+ * reserse operation of set_indirect() -+ * we should determine whether we had put pri into primary inode chain, -+ * if not, don't touch it -+ */ -+static void unset_indirect(handle_t *handle, struct inode *pri, struct inode *ind) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ int err, alone=1, index, found; -+ -+ snap_debug("pri %lu, ind %lu\n", pri->i_ino, ind->i_ino); -+ err = ext3_xattr_get(pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, buf, -+ EXT3_MAX_SNAP_DATA); -+ if ( err < 0 ) { -+ if( err == -ENOATTR ){ -+ snap_debug("primary inode has not EA\n"); -+ } -+ else{ -+ snap_debug("get EA error on primary inode," -+ "returned value %d\n", err); -+ } -+ goto exit; -+ } -+ -+ /* find ind's item in the ea */ -+ snaps = (struct snap_ea*)buf; -+ for(index=EXT3_MAX_SNAPS-1, found=-1; index>=0; index--) { -+ if( snaps->ino[index] == ind->i_ino ) -+ found = index; -+ else if( snaps->ino[index] ) -+ alone = 0; -+ } -+ -+ if(found >= 0) { -+ snap_debug("remove from primary inode's EA\n"); -+ snaps->ino[found] = 0; -+ snaps->parent_ino[found] = 0; -+ ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA, 0); -+ if(alone) { -+ snap_debug("delete from primary inodes chain\n"); -+ lock_list(pri->i_sb); -+ delete_cowed_ino_from_list(handle, pri); -+ unlock_list(pri->i_sb); -+ } -+ }else{ -+ snap_debug("didn't found ind in pri's EA, do nothing\n"); -+ } -+ -+exit: -+ return; -+} -+ -+ -+/* -+ * restore all data in @ind to @pri after free data blocks of @pri. -+ * then release @ind -+ */ -+static void restore_snap_inode(struct inode *pri, struct inode *ind) -+{ -+ handle_t *handle; -+ struct inode *tmp; -+ -+ snap_debug("restore from indirect %lu to primary %lu\n", -+ ind->i_ino, pri->i_ino); -+ -+ handle = ext3_journal_start(pri, SNAP_RESTOREORPHAN_TRANS_BLOCKS); -+ if( !handle ) -+ return; -+ -+ /* first: taken from pri's ea, or from fs-wide primary inode chain */ -+ unset_indirect(handle, pri, ind); -+ -+ /* second: throw out half-copied data in pri */ -+ if( pri->i_blocks ){ -+ tmp = ext3_new_inode(handle, pri, (int)pri->i_mode, 0); -+ if( !tmp ){ -+ snap_debug("ext3_new_inode error\n"); -+ goto exit; -+ } -+ -+ ext3_migrate_data(handle, tmp, pri); -+ snap_debug("freeing half-copied %lu blocks\n", tmp->i_blocks ); -+ tmp->i_nlink = 0; -+ iput( tmp ); -+ } -+ -+ /* third: restore ind inode to pri inode */ -+ snap_debug("restore %lu blocks to primary inode %lu\n", -+ ind->i_blocks, pri->i_ino); -+ ext3_migrate_data(handle, pri, ind); -+ -+ /* final: delete ind inode */ -+ ind->i_nlink = 0; -+ iput( ind ); -+ iput( pri ); -+ -+exit: -+ ext3_journal_stop(handle, pri); -+} -+ -+static handle_t * ext3_copy_data(handle_t *handle, struct inode *dst, -+ struct inode *src, int *has_orphan) -+{ -+ unsigned long blocks, blk, cur_blks; -+ int low_credits, save_ref; -+ -+ blocks =(src->i_size + src->i_sb->s_blocksize-1) >> -+ src->i_sb->s_blocksize_bits; -+ low_credits = handle->h_buffer_credits - SNAP_BIGCOPY_TRANS_BLOCKS; -+ -+ snap_debug("%lu blocks need to be copied," -+ "low credits limit %d\n", blocks, low_credits); -+ for (blk = 0, cur_blks= dst->i_blocks; blk < blocks; blk++) { -+ if (!ext3_bmap(src->i_mapping, blk)) -+ continue; -+ if(handle->h_buffer_credits <= low_credits) { -+ int needed = (blocks - blk) * EXT3_DATA_TRANS_BLOCKS; -+ if (needed > 4 * SNAP_COPYBLOCK_TRANS_BLOCKS) -+ needed = 4 * SNAP_COPYBLOCK_TRANS_BLOCKS; -+ if (journal_extend(handle, needed)) { -+ snap_debug("create_indirect:fail to extend " -+ "journal, restart trans\n"); -+ loopfail( 3 ); -+ if(!*has_orphan) { -+ snap_debug("add orphan ino %lu nlink %d to orphan list \n", -+ dst->i_ino, dst->i_nlink); -+#ifdef EXT3_ENABLE_SNAP_ORPHAN -+ add_snap_orphan(handle, dst, src); -+#else -+ ext3_orphan_add(handle, dst); -+#endif -+ *has_orphan = 1; -+ } -+ dst->u.ext3_i.i_disksize = -+ blk * dst->i_sb->s_blocksize; -+ dst->i_blocks = cur_blks; -+ dst->i_mtime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, dst); -+ -+ /* -+ * We can be sure the last handle was stoped -+ * ONLY if the handle's reference count is 1 -+ */ -+ save_ref = handle->h_ref; -+ handle->h_ref = 1; -+ if( ext3_journal_stop(handle, dst) ){ -+ snap_err("fail to stop journal\n"); -+ handle = NULL; -+ break; -+ } -+ loopfail ( 4 ); -+ handle = ext3_journal_start(dst, -+ low_credits + needed); -+ if( !handle ){ -+ snap_err("fail to restart handle\n"); -+ break; -+ } -+ handle->h_ref = save_ref; -+ } -+ } -+ if (ext3_copy_block( dst, src, blk) < 0 ) -+ break; -+ cur_blks += dst->i_sb->s_blocksize / 512; -+ } -+ dst->i_size = dst->u.ext3_i.i_disksize = src->i_size; -+ -+ return handle; -+} -+ -+static int ext3_set_generation(struct inode *inode, unsigned long gen) -+{ -+ handle_t *handle; -+ int err; -+ -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ -+ err = ext3_xattr_set(handle, inode, EXT3_SNAP_INDEX, EXT3_SNAP_GENERATION_ATTR, -+ (char*)&gen, sizeof(int), 0); -+ if (err < 0) { -+ snap_err("ino %lu, set_ext_attr err %d\n", inode->i_ino, err); -+ return err; -+ } -+ -+ ext3_journal_stop(handle, inode); -+ return 0; -+} -+ -+static int ext3_get_generation(struct inode *inode) -+{ -+ int err, gen; -+ -+ err = ext3_xattr_get(inode, EXT3_SNAP_INDEX, EXT3_SNAP_GENERATION_ATTR, -+ (char*)&gen, sizeof(gen)); -+ if (err < 0) { -+ if (err == -ENODATA) { -+ return 0; -+ } else { -+ snap_err("can not get generation from %lu \n", inode->i_ino); -+ return err; -+ } -+ } -+ return gen; -+} -+/** -+ * ext3_create_indirect - copy data, attributes from primary to new indir inode -+ * @pri: primary (source) inode -+ * @index: index in snapshot table where indirect inode should be stored -+ * @delete: flag that the primary inode is being deleted -+ * -+ * We copy all of the data blocks from the @*src inode to the @*dst inode, as -+ * well as copying the attributes from @*src to @*dst. If @delete == 1, then -+ * the primary inode will only be a redirector and will appear deleted. -+ * -+ * FIXME do we move EAs, only non-snap EAs, what? -+ * FIXME we could do readpage/writepage, but we would have to handle block -+ * allocation then, and it ruins sparse files for 1k/2k filesystems, -+ * at the expense of doing a memcpy. -+ */ -+ -+static struct inode *ext3_create_indirect( -+ struct inode *pri, -+ int index, -+ unsigned int gen, -+ ino_t parent_ino, -+ int del) -+{ -+ struct inode *ind; -+ handle_t *handle = NULL; -+ int err = 0; -+ int has_orphan = 0; -+ -+ if( pri == pri->i_sb->u.ext3_sb.s_journal_inode ){ -+ printk( KERN_EMERG "TRY TO COW JOUNRAL\n"); -+ return NULL; -+ } -+ snap_debug("creating indirect inode for %lu at index %d, %s pri\n", -+ pri->i_ino, index, del ? "deleting" : "preserve"); -+ -+ ind = ext3_get_indirect(pri, NULL, index); -+ -+ loopfail( 1 ); -+ -+ handle = ext3_journal_start(pri, SNAP_CREATEIND_TRANS_BLOCKS); -+ if( !handle ) -+ return NULL; -+ /* XXX ? We should pass an err argument to get_indirect and precisely -+ * detect the errors, for some errors, we should exit right away. -+ */ -+ -+ /* if the option is SNAP_DEL_PRI_WITH_IND and there is an indirect, -+ * we just free the primary data blocks and mark this inode delete -+ */ -+ if((del) && ind && !IS_ERR(ind)) { -+ struct inode *tmp; -+ /* for directory, we don't free the data blocks, -+ * or ext3_rmdir will report errors "bad dir, no data blocks" -+ */ -+ snap_debug("del==SNAP_DEL_PRI_WITH_IND && ind\n"); -+ if(!S_ISDIR(pri->i_mode)) { -+ /*Here delete the data of that pri inode. -+ * FIXME later, should throw the blocks of -+ * primary inode directly -+ */ -+ tmp = ext3_new_inode(handle, pri, (int)pri->i_mode, 0); -+ if(tmp) { -+ down(&tmp->i_sem); -+ ext3_migrate_data(handle, tmp, pri); -+ up(&tmp->i_sem); -+ tmp->i_nlink = 0; -+ iput(tmp); -+ } -+ else -+ snap_err("ext3_new_inode error\n"); -+ -+ pri->i_nlink = 1; -+ } -+ -+ pri->u.ext3_i.i_dtime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, pri); -+ err = 0; -+ goto exit; -+ } -+ -+ if (ind && !IS_ERR(ind)) { -+ snap_debug("existing indirect ino %lu for %lu: index %d\n", -+ ind->i_ino, pri->i_ino, index); -+ err = 0; -+ goto exit; -+ } -+ /* XXX: check this, ext3_new_inode, the first arg should be "dir" */ -+ ind = ext3_new_inode(handle, pri, (int)pri->i_mode, 0); -+ if (!ind) -+ goto exit; -+ -+ loopfail( 2 ); -+ -+ snap_debug("got new inode %lu\n", ind->i_ino); -+ ind->i_rdev = pri->i_rdev; -+ ind->i_op = pri->i_op; -+ ext3_set_generation(ind, (unsigned long)gen); -+ /* If we are deleting the primary inode, we want to ensure that it is -+ * written to disk with a non-zero link count, otherwise the next iget -+ * and iput will mark the inode as free (which we don't want, we want -+ * it to stay a redirector). We fix this in ext3_destroy_indirect() -+ * when the last indirect inode is removed. -+ * -+ * We then do what ext3_delete_inode() does so that the metadata will -+ * appear the same as a deleted inode, and we can detect it later. -+ */ -+ if (del) { -+ snap_debug("deleting primary inode\n"); -+ -+ down(&ind->i_sem); -+ err = ext3_migrate_data(handle, ind, pri); -+ if (err) -+ goto exit_unlock; -+ -+ err = ext3_set_indirect(pri, index, ind->i_ino, parent_ino); -+ if (err) -+ goto exit_unlock; -+ -+ /* XXX for directory, we copy the block back -+ * or ext3_rmdir will report errors "bad dir, no data blocks" -+ */ -+ if( S_ISDIR(pri->i_mode)) { -+ handle = ext3_copy_data(handle, pri, ind, &has_orphan); -+ if(!handle) { -+ err = -EINVAL; -+ goto exit_unlock; -+ } -+ } -+ -+ pri->u.ext3_i.i_flags |= EXT3_DEL_FL; -+ ind->u.ext3_i.i_flags |= EXT3_COW_FL; -+ if(S_ISREG(pri->i_mode)) pri->i_nlink = 1; -+ pri->u.ext3_i.i_dtime = CURRENT_TIME; -+ //pri->u.ext3_i.i_generation++; -+ ext3_mark_inode_dirty(handle, pri); -+ ext3_mark_inode_dirty(handle, ind); -+ up(&ind->i_sem); -+ } else { -+ down(&ind->i_sem); -+ err = ext3_migrate_data(handle, ind, pri); -+ if (err) -+ goto exit_unlock; -+ -+ /* for regular files we do blocklevel COW's maybe */ -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, EXT3_FEATURE_COMPAT_BLOCKCOW) -+ && S_ISREG(pri->i_mode)) { -+ -+ snap_debug("ino %lu, do block cow\n",pri->i_ino); -+ /* because after migrate_data , pri->i_size is 0 */ -+ pri->i_size = ind->i_size; -+ } -+ else { -+ int bpib = pri->i_sb->s_blocksize >> 9; -+ snap_debug("ino %lu, do file cow\n", pri->i_ino); -+ -+ /* XXX: can we do this better? -+ * If it's a fast symlink, we should copy i_data back! -+ * The criteria to determine a fast symlink is: -+ * 1) it's a link and its i_blocks is 0 -+ * 2) it's a link and its i_blocks is bpib ( the case -+ * it has been cowed and has ea ) -+ */ -+ if( S_ISLNK(ind->i_mode) && -+ ((ind->i_blocks == 0) || (ext3_has_ea(ind) && ind->i_blocks == bpib))) { -+ snap_debug("ino %lu is fast symlink\n", pri->i_ino); -+ memcpy(EXT3_I(pri)->i_data, EXT3_I(ind)->i_data, -+ sizeof(EXT3_I(ind)->i_data)); -+ pri->i_size = ind->i_size; -+ } -+ else { -+ handle = ext3_copy_data(handle, pri, ind, &has_orphan); -+ if (!handle) -+ goto exit_unlock; -+ } -+ } -+ /* set cow flag for ind */ -+ ind->u.ext3_i.i_flags |= EXT3_COW_FL; -+ pri->u.ext3_i.i_flags &= ~EXT3_COW_FL; -+ -+ ext3_mark_inode_dirty(handle, pri); -+ ext3_mark_inode_dirty(handle, ind); -+ -+ err = ext3_set_indirect(pri, index, ind->i_ino, parent_ino); -+ if (err) -+ goto exit_unlock; -+ -+ up(&ind->i_sem); -+ } -+ -+ if (!EXT3_HAS_COMPAT_FEATURE(pri->i_sb, -+ EXT3_FEATURE_COMPAT_SNAPFS)) { -+ lock_super(pri->i_sb); -+ ext3_journal_get_write_access(handle, pri->i_sb->u.ext3_sb.s_sbh); -+ pri->i_sb->u.ext3_sb.s_es->s_feature_compat |= -+ cpu_to_le32(EXT3_FEATURE_COMPAT_SNAPFS); -+ ext3_journal_dirty_metadata(handle, pri->i_sb->u.ext3_sb.s_sbh); -+ pri->i_sb->s_dirt = 1; -+ unlock_super(pri->i_sb); -+ } -+ if (has_orphan) { -+ snap_debug("del %lu nlink %d from orphan list\n", -+ ind->i_ino, ind->i_nlink); -+#ifdef EXT3_ENABLE_SNAP_ORPHAN -+ remove_snap_orphan(handle, ind); -+#else -+ ext3_orphan_del(handle, ind); -+#endif -+ } -+ ext3_journal_stop(handle, pri); -+ -+ loopfail( 5 ); -+ -+ return ind; -+ -+exit_unlock: -+ up(&ind->i_sem); -+ ind->i_nlink = 0; -+exit: -+ if (has_orphan) { -+ snap_debug("del %lu nlink %d from orphan list\n", -+ ind->i_ino, ind->i_nlink); -+#ifdef EXT3_ENABLE_SNAP_ORPHAN -+ remove_snap_orphan(handle, ind); -+#else -+ ext3_orphan_del(handle, ind); -+#endif -+ } -+ iput(ind); -+ ext3_journal_stop(handle, pri); -+ if (err) -+ snap_err("exiting with error %d\n", err); -+ return NULL; -+} -+ -+ -+/* The following functions are used by destroy_indirect */ -+#define inode_bmap(inode, nr) (EXT3_I(inode)->i_data[(nr)]) -+#define inode_setbmap(inode, nr, physical) (EXT3_I(inode)->i_data[(nr)]=(physical)) -+ -+static inline int block_bmap (struct buffer_head * bh, int nr) -+{ -+ int tmp; -+ -+ if (!bh) -+ return 0; -+ tmp = le32_to_cpu(((u32 *) bh->b_data)[nr]); -+ brelse (bh); -+ return tmp; -+} -+ -+static inline int block_setbmap (handle_t *handle, struct buffer_head * bh, int nr, int physical) -+{ -+ -+ if (!bh) -+ return 0; -+ ext3_journal_get_write_access(handle, bh); -+ ((u32 *) bh->b_data)[nr] = cpu_to_le32(physical); -+ ext3_journal_dirty_metadata(handle, bh); -+ brelse (bh); -+ return 1; -+} -+ -+static int ext3_migrate_block (handle_t *handle, struct inode * dst, struct inode *src, int block) -+{ -+ int i1_d=0, i1_s=0, i2_d=0, i2_s=0, i3_d=0, i3_s=0; -+ int addr_per_block = EXT3_ADDR_PER_BLOCK(src->i_sb); -+ int addr_per_block_bits = EXT3_ADDR_PER_BLOCK_BITS(src->i_sb); -+ unsigned long blksz = src->i_sb->s_blocksize; -+ kdev_t ddev = dst->i_dev; -+ kdev_t sdev = src->i_dev; -+ int physical = 0; -+ -+ if (block < 0) { -+ ext3_warning (src->i_sb, "ext3_migrate_block", "block < 0"); -+ return 0; -+ } -+ if (block >= EXT3_NDIR_BLOCKS + addr_per_block + -+ (1 << (addr_per_block_bits * 2)) + -+ ((1 << (addr_per_block_bits * 2)) << addr_per_block_bits)) { -+ ext3_warning (src->i_sb, "ext3_migrate_block", "block > big"); -+ return 0; -+ } -+ /* EXT3_NDIR_BLOCK */ -+ if (block < EXT3_NDIR_BLOCKS) { -+ if( inode_bmap(dst, block) ) return 0; -+ else { -+ if( (physical = inode_bmap(src, block)) ) { -+ inode_setbmap (dst, block, physical); -+ inode_setbmap (src, block, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ } -+ /* EXT3_IND_BLOCK */ -+ block -= EXT3_NDIR_BLOCKS; -+ if (block < addr_per_block) { -+ i1_d = inode_bmap (dst, EXT3_IND_BLOCK); -+ -+ if (!i1_d) { -+ physical = inode_bmap(src, EXT3_IND_BLOCK); -+ if( physical ) { -+ inode_setbmap (dst, EXT3_IND_BLOCK, physical); -+ inode_setbmap (src, EXT3_IND_BLOCK, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ if( block_bmap (bread (ddev, i1_d, blksz), block )) -+ return 0; -+ -+ i1_s = inode_bmap (src, EXT3_IND_BLOCK); -+ if( !i1_s) return 0; -+ -+ physical = block_bmap ( bread (sdev, i1_s, blksz), block ); -+ -+ if( physical) { -+ block_setbmap(handle, bread(ddev, i1_d, blksz),block,physical); -+ block_setbmap(handle, bread(sdev, i1_s, blksz), block, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ /* EXT3_DIND_BLOCK */ -+ block -= addr_per_block; -+ if (block < (1 << (addr_per_block_bits * 2))) { -+ i1_d = inode_bmap (dst, EXT3_DIND_BLOCK); -+ i1_s = inode_bmap (src, EXT3_DIND_BLOCK); -+ if (!i1_d) { -+ if( (physical = inode_bmap(src, EXT3_DIND_BLOCK)) ) { -+ inode_setbmap (dst, EXT3_DIND_BLOCK, physical); -+ inode_setbmap (src, EXT3_DIND_BLOCK, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ i2_d = block_bmap (bread (ddev, i1_d, blksz), -+ block >> addr_per_block_bits); -+ -+ if (!i2_d) { -+ -+ if( !i1_s) return 0; -+ -+ physical = block_bmap (bread (sdev, i1_s, blksz), -+ block >> addr_per_block_bits); -+ if( physical) { -+ block_setbmap (handle, bread (ddev, i1_d, blksz), -+ block >> addr_per_block_bits, physical); -+ block_setbmap (handle, bread (sdev, i1_s, blksz), -+ block >> addr_per_block_bits, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ physical = block_bmap (bread (ddev, i2_d, -+ blksz), -+ block & (addr_per_block - 1)); -+ if(physical) -+ return 0; -+ else { -+ i2_s = block_bmap (bread (sdev, i1_s, -+ blksz), -+ block >> addr_per_block_bits); -+ if(!i2_s) return 0; -+ -+ physical = block_bmap(bread (sdev, i2_s, -+ blksz), -+ block & (addr_per_block - 1)); -+ if(physical) { -+ block_setbmap(handle, bread (ddev, i2_d, blksz), -+ block & (addr_per_block - 1), physical); -+ block_setbmap(handle, bread (sdev, i2_s, blksz), -+ block & (addr_per_block - 1), 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ -+ } -+ /* EXT3_TIND_BLOCK */ -+ block -= (1 << (addr_per_block_bits * 2)); -+ i1_d = inode_bmap (dst, EXT3_TIND_BLOCK); -+ i1_s = inode_bmap (src, EXT3_TIND_BLOCK); -+ if (!i1_d) { -+ if( (physical = inode_bmap(src, EXT3_TIND_BLOCK)) ) -+ inode_setbmap (dst, EXT3_TIND_BLOCK, physical); -+ else -+ return 0; -+ } -+ i2_d = block_bmap (bread (ddev, i1_d, blksz), -+ block >> (addr_per_block_bits * 2)); -+ -+ if(i1_s) i2_s = block_bmap (bread (sdev, i1_s, blksz), -+ block >> (addr_per_block_bits * 2)); -+ -+ if (!i2_d) { -+ -+ if( !i1_s) return 0; -+ -+ physical = block_bmap (bread (sdev, i1_s, blksz), -+ block >> (addr_per_block_bits * 2)); -+ if(physical) { -+ block_setbmap (handle, bread (ddev, i1_d, blksz), -+ block >> (addr_per_block_bits * 2), physical); -+ block_setbmap (handle, bread (sdev, i1_s, blksz), -+ block >> (addr_per_block_bits * 2), 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ i3_d = block_bmap (bread (ddev, i2_d, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1)); -+ if( i2_s) i3_s = block_bmap (bread (sdev, i2_s, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1)); -+ -+ if (!i3_d) { -+ if (!i2_s) return 0; -+ physical = block_bmap (bread (sdev, i2_s, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1)); -+ if( physical) { -+ block_setbmap (handle, bread (ddev, i2_d, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1), -+ physical); -+ block_setbmap (handle, bread (sdev, i2_s, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1), -+ 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ physical = block_bmap (bread (ddev, i3_d, blksz), -+ block & (addr_per_block - 1)) ; -+ if(physical) return 0; -+ else { -+ if(!i3_s) return 0; -+ physical = block_bmap (bread (sdev, i3_s, blksz), -+ block & (addr_per_block - 1)) ; -+ if( physical) { -+ block_setbmap (handle, bread (ddev, i3_d, blksz), -+ block & (addr_per_block - 1), physical); -+ block_setbmap (handle, bread (sdev, i3_s, blksz), -+ block & (addr_per_block - 1), 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+} -+ -+/* Generate i_blocks from blocks for an inode . -+ * We also calculate EA block here. -+ */ -+static unsigned long calculate_i_blocks(struct inode *inode, int blocks) -+{ -+ /* 512 byte disk blocks per inode block */ -+ int bpib = inode->i_sb->s_blocksize >> 9; -+ int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb); -+ unsigned long i_blocks = 0; -+ int i=0; -+ int j=0; -+ int meta_blocks = 0; -+ -+ if( !inode ) return 0; -+ -+ if( blocks < 0 ) { -+ /* re-calculate blocks here */ -+ blocks = (inode->i_size + inode->i_sb->s_blocksize-1) -+ >> inode->i_sb->s_blocksize_bits; -+ } -+ -+ /* calculate data blocks */ -+ for(i = 0; i < blocks; i++ ) { -+ if(ext3_bmap(inode->i_mapping, i)) -+ i_blocks += bpib; -+ } -+ /* calculate meta blocks */ -+ blocks -= EXT3_NDIR_BLOCKS; -+ if( blocks > 0 ) { -+ meta_blocks++; -+ blocks -= addr_per_block; -+ } -+ if( blocks > 0 ) meta_blocks++; -+ i=0; -+ while( (blocks > 0) && (i < addr_per_block) ) { -+ meta_blocks++; -+ blocks -= addr_per_block; -+ i++; -+ } -+ if ( blocks > 0 ) meta_blocks += 2; -+ i=0; -+ j=0; -+ while( blocks > 0) { -+ meta_blocks++; -+ blocks -= addr_per_block; -+ i++; -+ if(i >= addr_per_block ) { -+ i=0; -+ j++; -+ } -+ if( j >= addr_per_block) { -+ j=0; -+ meta_blocks++; -+ } -+ } -+ /* calculate EA blocks */ -+ if( ext3_has_ea (inode) ) meta_blocks++; -+ -+ i_blocks += meta_blocks * bpib; -+ snap_debug("ino %lu, get i_blocks %lu\n", inode->i_ino, i_blocks); -+ return i_blocks; -+} -+ -+/** -+ * ext3_destroy_indirect - delete an indirect inode from the table -+ * @pri: primary inode -+ * @ind: indirect inode -+ * @index: index of inode that should be deleted -+ * -+ * We delete the @*ind inode, and remove it from the snapshot table. If @*ind -+ * is NULL, we use the inode at @index. -+ */ -+static int ext3_destroy_indirect(struct inode *pri, int index, -+ struct inode *next_ind) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ struct inode *ind; -+ int save = 0; -+ int i=0; -+ int err = 0; -+ handle_t *handle=NULL; -+ time_t ctime; -+ -+ if (index < 0 || index > EXT3_MAX_SNAPS) -+ return 0; -+ -+ if( pri == pri->i_sb->u.ext3_sb.s_journal_inode ){ -+ snap_err("TRY TO DESTROY JOURNAL'S IND\n"); -+ return -EINVAL; -+ } -+ -+ err = ext3_xattr_get(pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0) { -+ snap_err("inode %lu attribute read error\n", pri->i_ino); -+ return err; -+ } -+ -+ snaps = (struct snap_ea *)buf; -+ if ( !snaps->ino[index] ) { -+ snap_err("for pri ino %lu, index %d, redirect ino is 0\n", -+ pri->i_ino, index); -+ return -EINVAL; -+ } -+ -+ snap_debug("for pri ino %lu, reading inode %lu at index %d\n", -+ pri->i_ino, (ulong)le32_to_cpu(snaps->ino[index]), index); -+ -+ ind = iget(pri->i_sb, le32_to_cpu (snaps->ino[index]) ); -+ -+ if ( !ind || IS_ERR(ind) || is_bad_inode(ind)) -+ return -EINVAL; -+ -+ snap_debug("iget ind %lu, ref count = %d\n", -+ ind->i_ino, atomic_read(&ind->i_count)); -+ -+ handle = ext3_journal_start(pri, SNAP_DESTROY_TRANS_BLOCKS); -+ if (!handle) { -+ iput(ind); -+ return -EINVAL; -+ } -+ /* if it's block level cow, first copy the blocks back */ -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, EXT3_FEATURE_COMPAT_BLOCKCOW) && -+ S_ISREG(pri->i_mode)) { -+ -+ int blocks; -+ if (!next_ind) { -+ next_ind = pri; -+ down(&ind->i_sem); -+ } else { -+ double_down(&next_ind->i_sem, &ind->i_sem); -+ } -+ blocks = (next_ind->i_size + next_ind->i_sb->s_blocksize-1) -+ >> next_ind->i_sb->s_blocksize_bits; -+#define FAST_MIGRATE_BLOCK -+#ifdef FAST_MIGRATE_BLOCK -+ snap_debug("migrate block back from ino %lu to %lu\n", -+ ind->i_ino, next_ind->i_ino); -+ -+ for(i = 0; i < blocks; i++) { -+ if( ext3_bmap(next_ind->i_mapping, i) ) -+ continue; -+ if( !ext3_bmap(ind->i_mapping, i) ) -+ continue; -+ ext3_migrate_block(handle, next_ind, ind, i) ; -+ } -+ /* Now re-compute the i_blocks */ -+ /* XXX shall we take care of ind here? probably not */ -+ next_ind->i_blocks = calculate_i_blocks( next_ind, blocks); -+ ext3_mark_inode_dirty(handle, next_ind); -+ -+#else -+ for (i = 0; i < blocks; i++) { -+ if (ext3_bmap(next_ind->i_mapping, i)) -+ continue; -+ if (ext3_copy_block(next_ind, ind, i ) < 0) -+ break; -+ } -+ ext3_mark_inode_dirty(handle, next_ind); -+#endif -+ if (next_ind == pri) -+ up(&ind->i_sem); -+ else -+ double_up(&next_ind->i_sem, &ind->i_sem); -+ -+ } -+ -+ snap_debug("delete indirect ino %lu\n", ind->i_ino); -+ snap_debug("iput ind %lu, ref count = %d\n", -+ ind->i_ino, atomic_read(&ind->i_count)); -+ ind->i_nlink = 0; -+ iput (ind); -+ -+ snaps->ino[index] = cpu_to_le32(0); -+ for (i = 0; i < EXT3_MAX_SNAPS; i++) -+ save += snaps->ino[i]; -+ -+ if(!save) { -+ lock_list(pri->i_sb); -+ delete_cowed_ino_from_list(handle, pri); -+ unlock_list(pri->i_sb); -+ } -+ -+ /* if there are no cowed inode left, then remove snapfs feature */ -+ if(!SB_FIRST_COWED_INO(pri->i_sb)) { -+ -+ lock_super(pri->i_sb); -+ -+ ext3_journal_get_write_access(handle, pri->i_sb->u.ext3_sb.s_sbh); -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, -+ EXT3_FEATURE_COMPAT_SNAPFS)) { -+ pri->i_sb->u.ext3_sb.s_es->s_feature_compat &= -+ cpu_to_le32(~EXT3_FEATURE_COMPAT_SNAPFS); -+ } -+ /* clean up block level cow feature */ -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, -+ EXT3_FEATURE_COMPAT_BLOCKCOW)) { -+ pri->i_sb->u.ext3_sb.s_es->s_feature_compat &= -+ cpu_to_le32(~EXT3_FEATURE_COMPAT_BLOCKCOW); -+ } -+ /* XXX clean the extended attribute feature, -+ * this is not safe, find a better way -+ */ -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, -+ EXT3_FEATURE_COMPAT_EXT_ATTR)) { -+ pri->i_sb->u.ext3_sb.s_es->s_feature_compat &= -+ cpu_to_le32(~EXT3_FEATURE_COMPAT_EXT_ATTR); -+ } -+ -+ ext3_journal_dirty_metadata(handle, pri->i_sb->u.ext3_sb.s_sbh); -+ pri->i_sb->s_dirt = 1; -+ unlock_super(pri->i_sb); -+ } -+ -+ /* -+ * If we are deleting the last indirect inode, and the primary inode -+ * has already been deleted, then mark the primary for deletion also. -+ * Otherwise, if we are deleting the last indirect inode remove the -+ * snaptable from the inode. XXX -+ */ -+ if (!save && pri->u.ext3_i.i_dtime) { -+ snap_debug("deleting primary %lu\n", pri->i_ino); -+ pri->i_nlink = 0; -+ /* reset err to 0 now */ -+ err = 0; -+ } else { -+ snap_debug("%s redirector table\n", -+ save ? "saving" : "deleting"); -+ /* XXX: since set ea will modify i_ctime of pri, -+ so save/restore i_ctime. Need this necessary ? */ -+ ctime = pri->i_ctime; -+ err = ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ save ? buf : NULL, EXT3_MAX_SNAP_DATA, 0); -+ pri->i_ctime = ctime; -+ ext3_mark_inode_dirty(handle, pri); -+ } -+ ext3_journal_stop(handle, pri); -+ return err; -+} -+ -+/* restore a primary inode with the indirect inode at index */ -+static int ext3_restore_indirect(struct inode *pri, int index) -+{ -+ struct inode *ind; -+ struct inode *tmp; -+ int err = 0; -+ handle_t *handle = NULL; -+ -+ if (index < 0 || index > EXT3_MAX_SNAPS) -+ return -EINVAL; -+ -+ if( pri == pri->i_sb->u.ext3_sb.s_journal_inode ){ -+ printk( KERN_EMERG "TRY TO RESTORE JOURNAL\n"); -+ return -EINVAL; -+ } -+ snap_debug("pri ino %lu, index %d\n", pri->i_ino, index); -+ -+ ind = ext3_get_indirect(pri, NULL, index); -+ -+ if ( !ind ) -+ return -EINVAL; -+ -+ snap_debug("restore ino %lu to %lu\n", pri->i_ino, ind->i_ino); -+ -+ handle = ext3_journal_start(pri, SNAP_RESTORE_TRANS_BLOCKS); -+ if( !handle ) -+ return -EINVAL; -+ /* first destroy all the data blocks in primary inode */ -+ /* XXX: check this, ext3_new_inode, the first arg should be "dir" */ -+ tmp = ext3_new_inode(handle, pri, (int)pri->i_mode, 0); -+ if(tmp) { -+ double_down(&pri->i_sem, &tmp->i_sem); -+ ext3_migrate_data(handle, tmp, pri); -+ double_up(&pri->i_sem, &tmp->i_sem); -+ -+ tmp->i_nlink = 0; -+ iput(tmp); -+ } -+ else -+ snap_err("restore_indirect, new_inode err\n"); -+ -+ double_down(&pri->i_sem, &ind->i_sem); -+ ext3_migrate_data(handle, pri, ind); -+ /* clear the cow flag for pri because ind has it */ -+ pri->u.ext3_i.i_flags &= ~EXT3_COW_FL; -+ ext3_mark_inode_dirty(handle, pri); -+ double_up(&pri->i_sem, &ind->i_sem); -+ iput(ind); -+ -+// ext3_destroy_indirect(pri, index); -+ -+ ext3_journal_stop(handle, pri); -+ return err; -+} -+ -+ -+/** -+ * ext3_snap_iterate - iterate through all of the inodes -+ * @sb: filesystem superblock -+ * @repeat: pointer to function called on each valid inode -+ * @start: inode to start iterating at -+ * @priv: private data to the caller/repeat function -+ * -+ * If @start is NULL, then we do not return an inode pointer. If @*start is -+ * NULL, then we start at the beginning of the filesystem, and iterate over -+ * all of the inodes in the system. If @*start is non-NULL, then we start -+ * iterating at this inode. -+ * -+ * We call the repeat function for each inode that is in use. The repeat -+ * function must check if this is a redirector (with is_redirector) if it -+ * only wants to operate on redirector inodes. If there is an error or -+ * the repeat function returns non-zero, we return the last inode operated -+ * on in the @*start parameter. This allows the caller to restart the -+ * iteration at this inode if desired, by returning a positive value. -+ * Negative return values indicate an error. -+ * -+ * NOTE we cannot simply traverse the existing filesystem tree from the root -+ * inode, as there may be disconnected trees from deleted files/dirs -+ * -+ * FIXME If there was a list of inodes with EAs, we could simply walk the list -+ * intead of reading every inode. This is an internal implementation issue. -+ */ -+ -+static int ext3_iterate_all(struct super_block *sb, -+ int (*repeat)(struct inode *inode, void *priv), -+ struct inode **start, void *priv) -+{ -+ struct inode *tmp = NULL; -+ int gstart, gnum; -+ ino_t istart, ibase; -+ int err = 0; -+ -+ if (!start) -+ start = &tmp; -+ if (!*start) { -+ *start = iget(sb, EXT3_ROOT_INO); -+ if (!*start) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ if (is_bad_inode(*start)) { -+ err = -EIO; -+ goto exit; -+ } -+ } -+ if ((*start)->i_ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) { -+ snap_debug("invalid starting inode %ld\n",(*start)->i_ino); -+ err = -EINVAL; -+ goto exit; -+ } -+ if ((*start)->i_ino < EXT3_FIRST_INO(sb)) { -+ if ((err = (*repeat)(*start, priv) != 0)) -+ goto exit; -+ iput(*start); -+ *start = iget(sb, EXT3_FIRST_INO(sb)); -+ if (!*start) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ if (is_bad_inode(*start)) { -+ err = -EIO; -+ goto exit; -+ } -+ } -+ -+ gstart = ((*start)->i_ino - 1) / EXT3_INODES_PER_GROUP(sb); -+ istart = ((*start)->i_ino - 1) % EXT3_INODES_PER_GROUP(sb); -+ ibase = gstart * EXT3_INODES_PER_GROUP(sb); -+ for (gnum = gstart; gnum < EXT3_SB(sb)->s_groups_count; -+ gnum++, ibase += EXT3_INODES_PER_GROUP(sb)) { -+ struct ext3_group_desc * gdp; -+ int bitmap_nr; -+ char *bitmap; -+ int ibyte; -+ -+ gdp = ext3_get_group_desc (sb, gnum, NULL); -+ if (!gdp || le16_to_cpu(gdp->bg_free_inodes_count) == -+ EXT3_INODES_PER_GROUP(sb)) -+ continue; -+ -+ bitmap_nr = ext3_load_inode_bitmap(sb, gnum); -+ if (bitmap_nr < 0) -+ continue; -+ -+ bitmap = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]->b_data; -+ for (ibyte = istart >> 3; -+ ibyte < EXT3_INODES_PER_GROUP(sb) >> 3; -+ ibyte++) -+ { -+ int i; -+ int bit; -+ -+ if (!bitmap[ibyte]) -+ continue; -+ -+ /* FIXME need to verify if bit endianness will -+ * work properly here for all architectures. -+ */ -+ for (i = 1, bit = 1; i <= 8; i++, bit <<= 1) { -+ ino_t ino = ibase + (ibyte << 3) + i; -+ -+ if ((bitmap[ibyte] & bit) == 0) -+ continue; -+ if (*start) { -+ if (ino < (*start)->i_ino) -+ continue; -+ } else { -+ *start = iget(sb, ino); -+ if (!*start) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ if (is_bad_inode(*start)) { -+ err = -EIO; -+ goto exit; -+ } -+ } -+ if ((err = (*repeat)(*start, priv)) != 0) -+ goto exit; -+ iput(*start); -+ *start = NULL; -+ } -+ } -+ istart = 0; -+ } -+exit: -+ iput(tmp); -+ return err; -+} -+ -+static int ext3_iterate(struct super_block *sb, -+ int (*repeat)(struct inode *inode, void *priv), -+ struct inode **start, void *priv, int flag) -+{ -+ switch(flag) { -+ case SNAP_ITERATE_ALL_INODE: -+ return ext3_iterate_all (sb, repeat, start, priv); -+ -+ case SNAP_ITERATE_COWED_INODE: -+ return ext3_iterate_cowed_inode (sb, repeat, start,priv); -+ -+ default: -+ return -EINVAL; -+ } -+} -+ -+static int find_snap_meta_index( -+ struct table_snap_meta_data *snap_meta, -+ char *name) -+{ -+ int i; -+ -+ /* table max length is null*/ -+ for( i = 0; i < TABLE_ITEM_COUNT; i++){ -+ /*compare name Max name Length 15*/ -+ if (snap_meta->array[i].name[0]){ -+ if(!strncmp(snap_meta->array[i].name, name, strlen(name))) -+ return i; -+ } -+ } -+ return -1; /* can not find */ -+} -+ -+int set_snap_meta_index( -+ struct table_snap_meta_data *snap_meta, -+ char *name, -+ int size) -+{ -+ int i; -+ -+ for( i = 0; i < TABLE_ITEM_COUNT; i++){ -+ /*compare name Max name Length 15*/ -+ if (! snap_meta->array[i].name[0]){ -+ strcpy(snap_meta->array[i].name, name); -+ snap_meta->count ++; -+ snap_meta->array[i].start = i * TABLE_ITEM_SIZE + 1; -+ snap_meta->array[i].len = size; -+ return i; -+ } -+ } -+ return -1; /* can not find */ -+} -+ -+static int ext3_get_meta_attr(struct super_block *sb, -+ char* name, char* buf, -+ int *size) -+{ -+ ino_t ino; -+ struct inode *inode; -+ struct buffer_head *bh = NULL; -+ struct table_snap_meta_data *s_attr; -+ unsigned long map_len = 0, left_size; -+ int i, error = 0, index = 0; -+ -+ ino = SB_SNAPTABLE_INO(sb); -+ if (ino == 0){ -+ snap_err("No table file \n"); -+ return -ENODATA; -+ } -+ inode = iget(sb, ino); -+ if(!inode || is_bad_inode(inode)){ -+ snap_err("unable to get table ino %lu\n", ino); -+ error = -ENOENT; -+ goto out_iput; -+ } -+ /*read the table from the table inode*/ -+ bh = ext3_bread(NULL, inode, 0, 0, &error); -+ if (!bh) { -+ snap_err("read table ino %lu, error %d\n", ino, error); -+ error = -ENODATA; -+ goto out_iput; -+ } -+ s_attr = (struct table_snap_meta_data *)(bh->b_data); -+ index = find_snap_meta_index(s_attr, name); -+ if (index < 0) { -+ snap_debug("not exit %s meta attr of table ino %lu \n", -+ name, inode->i_ino); -+ error = 0; -+ goto out_iput; -+ } -+ if (!buf || *size < s_attr->array[index].len) { -+ /*return the size of this meta attr */ -+ error = s_attr->array[index].len; -+ goto out_iput; -+ } -+ map_len = (s_attr->array[index].len + sb->s_blocksize - 1) >> sb->s_blocksize_bits; -+ left_size = *size; -+ for(i = 0; i < map_len; i++) { -+ struct buffer_head *array_bh = NULL; -+ -+ array_bh = ext3_bread(NULL, inode, -+ s_attr->array[index].start + i, -+ 0, &error); -+ if (!array_bh) { -+ snap_err("ino %lu read snap attr offset %d error %d \n", -+ inode->i_ino, (s_attr->array[index].start + i), -+ error); -+ goto out_iput; -+ } -+ if (left_size >= sb->s_blocksize) { -+ memcpy(buf, array_bh->b_data, sb->s_blocksize); -+ }else -+ memcpy(buf, array_bh->b_data, left_size); -+ left_size -= sb->s_blocksize; -+ brelse(array_bh); -+ } -+ *size = s_attr->array[index].len; -+out_iput: -+ brelse(bh); -+ iput(inode); -+ return error; -+} -+ -+static int ext3_set_meta_attr(struct super_block *sb, char* name, -+ char* buf, int size) -+{ -+ struct inode *inode = NULL; -+ handle_t *handle = NULL; -+ struct buffer_head *bh = NULL; -+ struct table_snap_meta_data *s_attr = NULL; -+ unsigned long ino; -+ int i, index = 0, error = 0; -+ unsigned long new_len = 0, left_size; -+ -+ ino = SB_SNAPTABLE_INO(sb); -+ -+ if (ino == 0 && !buf) { -+ snap_debug("no table ino \n"); -+ return 0; -+ } -+ -+ handle = ext3_journal_start(sb->s_root->d_inode, 2*EXT3_SETMETA_TRANS_BLOCKS); -+ if(!handle) -+ return -EINVAL; -+ -+ if (ino == 0) { -+ /*create table inode update table ino*/ -+ inode = ext3_new_inode(handle, sb->s_root->d_inode, (int)S_IFREG, 0); -+ if (!inode) -+ return -EINVAL; -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, sb->u.ext3_sb.s_sbh); -+ SB_SNAPTABLE_INO(sb) = inode->i_ino; -+ ext3_journal_dirty_metadata(handle, sb->u.ext3_sb.s_sbh); -+ sb->s_dirt = 1; -+ unlock_super(sb); -+ -+ } else { -+ inode = iget(sb, ino); -+ if (!inode || !inode->i_nlink || is_bad_inode(inode)) { -+ snap_err("unable to get table ino %lu\n", ino); -+ error = -ENOENT; -+ goto exit; -+ } -+ } -+ /*read the table from the table inode, -+ * If can not find the block just create it*/ -+ bh = ext3_bread(handle, inode, 0, 1, &error); -+ if (!bh) { -+ snap_err("read table ino %lu, error %d\n", ino, error); -+ error = -ENODATA; -+ goto exit; -+ } -+ s_attr = (struct table_snap_meta_data *)(bh->b_data); -+ index = find_snap_meta_index(s_attr, name); -+ if (index < 0 && !buf) { -+ snap_debug("%s meta attr of table ino %lu do not exist\n", -+ name, inode->i_ino); -+ error = 0; -+ brelse(bh); -+ goto exit; -+ } -+ if (!buf) { -+ snap_debug("delete the meta attr %s in the table ino %lu", -+ name, inode->i_ino); -+ /*Here we only delete the entry of the attr -+ *FIXME, should we also delete the block of -+ * this attr -+ */ -+ ext3_journal_get_write_access(handle, bh); -+ memset(s_attr->array[index].name, 0, TABLE_ITEM_NAME_SIZE); -+ s_attr->array[index].len = 0; -+ s_attr->count --; -+ ext3_journal_dirty_metadata(handle, bh); -+ brelse(bh); -+ goto exit; -+ } -+ new_len = (size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; -+ /*find the place to put this attr in that index*/ -+ ext3_journal_get_write_access(handle, bh); -+ if (index < 0){ -+ index = set_snap_meta_index(s_attr, name, size); -+ if (index < 0){ -+ snap_err("table full of ino %lu \n", inode->i_ino); -+ error = index; -+ brelse(bh); -+ goto exit; -+ } -+ } -+ s_attr->array[index].len = size; -+ journal_dirty_metadata(handle, bh); -+ brelse(bh); -+ /*put this attr to the snap table*/ -+ left_size = size; -+ for(i = 0; i < new_len; i++) { -+ struct buffer_head *array_bh = NULL; -+ -+ array_bh = ext3_bread(handle, inode, -+ s_attr->array[index].start + i, 1, &error); -+ if (!array_bh) { -+ snap_err("inode %lu Can not get the block of attr %s\n", -+ inode->i_ino, name); -+ error = -ENOSPC; -+ brelse(array_bh); -+ goto exit; -+ } -+ ext3_journal_get_write_access(handle, array_bh); -+ if (left_size > inode->i_sb->s_blocksize) -+ memcpy(array_bh->b_data, buf, inode->i_sb->s_blocksize); -+ else -+ memcpy(array_bh->b_data, buf, left_size); -+ ext3_journal_dirty_metadata(handle, array_bh); -+ left_size -= inode->i_sb->s_blocksize; -+ brelse(array_bh); -+ } -+exit: -+ if (handle) -+ ext3_journal_stop(handle, sb->s_root->d_inode); -+ iput(inode); -+ return error; -+} -+ -+struct snapshot_operations ext3_snap_operations = { -+ ops_version: SNAP_VERSION(2,0,2), -+ is_redirector: is_redirector, -+ is_indirect: is_indirect, -+ create_indirect: ext3_create_indirect, -+ get_indirect: ext3_get_indirect, -+ get_indirect_ino: ext3_get_indirect_ino, -+ destroy_indirect: ext3_destroy_indirect, -+ restore_indirect: ext3_restore_indirect, -+ iterate: ext3_iterate, -+ copy_block: ext3_copy_block, -+ set_indirect: ext3_set_indirect, -+ snap_feature: ext3_snap_feature, -+ get_generation: ext3_get_generation, -+ set_generation: ext3_set_generation, -+ get_meta_attr: ext3_get_meta_attr, -+ set_meta_attr: ext3_set_meta_attr, -+}; -+ -+EXPORT_SYMBOL(ext3_snap_operations); -+#ifdef SNAP_PROFILE -+EXPORT_SYMBOL(prof_snapdel); -+#endif -+ -+#ifdef SNAP_DEBUG_IOC -+ -+static int print_inode(struct inode *pri, void *index_val) -+{ -+ -+ int err=0; -+ struct snap_ea *snaps; -+ char buf[EXT3_MAX_SNAP_DATA]; -+ int index = *(int *)index_val; -+ -+ err = ext3_xattr_get(primary, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ -+ if (err == -ENODATA) { -+ memset(buf, 0, EXT3_MAX_SNAP_DATA); -+ } -+ else if (err < 0) { -+ snap_err("got err %d when reading attributes\n", err); -+ goto err_exit; -+ } -+ -+ snaps = (struct snap_ea *) buf; -+ -+ if( le32_to_cpu(snaps->ino[index]) == 0 ) { -+ snap_debug("no redirected ino for primary inode %lu\n", -+ primary->i_ino); -+ } -+ else { -+ snap_debug("primary inode %lu , redirected ino=%d\n", -+ primary->i_ino,le32_to_cpu(snaps->ino[index])); -+ } -+err_exit: -+ return err; -+} -+ -+int snap_print(struct super_block *sb, int index) -+{ -+ ext3_iterate_cowed_inode(sb, &print_inode, NULL, &index); -+ return 0; -+} -+ -+static int ext3_snap_destroy_inode(struct inode *primary,void *index_val) -+{ -+ int index = *(int *)index_val; -+ int rc = 0; -+ printk("delete_inode for index %d\n",index); -+ rc = ext3_destroy_indirect(primary,index, NULL); -+ if(rc != 0) -+ printk("ERROR:ext3_destroy_indirect(ino %lu,index %d),ret %d\n", -+ primary->i_ino, index, rc); -+ return 0; -+} -+ -+int ext3_snap_delete(struct super_block *sb, int index) -+{ -+ ext3_iterate(sb, &ext3_snap_destroy_inode, NULL, &index, -+ SNAP_ITERATE_COWED_INODE); -+ return 0; -+} -+#endif -+ -+ -+ -+ -+ -+ -+ -+ -Index: linux-2.4.20-8/fs/ext3/Makefile -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/Makefile 2004-01-27 20:21:42.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/Makefile 2004-01-27 22:45:56.000000000 +0800 -@@ -13,7 +13,7 @@ - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ -- xattr_trusted.o extents.o -+ xattr_trusted.o extents.o snap.o - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.20-8/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/inode.c 2004-01-27 19:34:11.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/inode.c 2004-01-27 22:45:56.000000000 +0800 -@@ -1200,7 +1200,7 @@ - * So, if we see any bmap calls here on a modified, data-journaled file, - * take extra steps to flush any blocks which might be in the cache. - */ --static int ext3_bmap(struct address_space *mapping, long block) -+int ext3_bmap(struct address_space *mapping, long block) - { - struct inode *inode = mapping->host; - journal_t *journal; -Index: linux-2.4.20-8/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/ialloc.c 2004-01-27 19:34:11.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/ialloc.c 2004-01-27 22:45:56.000000000 +0800 -@@ -160,6 +160,13 @@ - return retval; - } - -+/* Export load_inode_bitmap*/ -+int ext3_load_inode_bitmap (struct super_block * sb, -+ unsigned int block_group) -+{ -+ return load_inode_bitmap(sb, block_group); -+} -+ - /* - * NOTE! When we get the inode, we're the only people - * that have access to it, and as such there are no -Index: linux-2.4.20-8/fs/ext3/super.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/super.c 2004-01-27 19:34:11.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/super.c 2004-01-27 22:45:56.000000000 +0800 -@@ -1333,6 +1333,13 @@ - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+#define EXT3_SNAP_FS -+#ifdef EXT3_SNAP_FS -+ init_MUTEX(&(sbi->s_snap_list_sem)); -+ sbi->s_snaptable_ino = le32_to_cpu(es->s_snaptable_ino); -+ sbi->s_first_cowed_pri_ino = le32_to_cpu(es->s_first_cowed_pri_ino); -+ sbi->s_last_cowed_pri_ino = le32_to_cpu(es->s_last_cowed_pri_ino); -+#endif - for (i=0; i < 4; i++) - sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); - sbi->s_def_hash_version = es->s_def_hash_version; -Index: linux-2.4.20-8/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/ext3-exports.c 2004-01-27 19:33:57.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/ext3-exports.c 2004-01-27 22:45:56.000000000 +0800 -@@ -21,6 +21,8 @@ - EXPORT_SYMBOL(ext3_xattr_set); - EXPORT_SYMBOL(ext3_prep_san_write); - EXPORT_SYMBOL(ext3_map_inode_page); -+EXPORT_SYMBOL(ext3_orphan_add); -+EXPORT_SYMBOL(ext3_orphan_del); - - EXPORT_SYMBOL(ext3_abort); - EXPORT_SYMBOL(ext3_decode_error); -Index: linux-2.4.20-8/include/linux/snap.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/snap.h 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-8/include/linux/snap.h 2004-01-27 22:45:56.000000000 +0800 -@@ -0,0 +1,266 @@ -+/* -+ * Copyright (c) 2002 Cluster File Systems, Inc. <info@clusterfs.com> -+ * started by Andreas Dilger <adilger@turbolinux.com> -+ * Peter Braam <braam@mountainviewdata.com> -+ * Harrison Xing <harrisonx@mountainviewdata.com> -+ * -+ * Redesigned 2003 by Peter Braam <braam@clusterfs.com> -+ * Eric Mei <Ericm@clusterfs.com> -+ * Wang Di <wangdi@clusterfs.com> -+ * -+ * Rewriten 2003 by Wang Di <wangdi@clusterfs.com> -+ * Eric Mei <ericm@clusterfs.com> -+ * -+ * Functions for implementing snapshots in the ext3 filesystem. They are -+ * intended to hide the internals of the filesystem from the caller in -+ * such a way that the caller doesn't need to know about inode numbers, -+ * how the redirectors are implemented or stored, etc. It may not do that -+ * all yet, but it tries. -+ * -+ * The snapshot inode redirection is stored in the primary/direct inode as -+ * an extended attribute $snap, in the form of little-endian u32 inode -+ * numbers. -+ * -+ */ -+ -+#ifndef _LINUX_SNAP_H -+#define _LINUX_SNAP_H -+ -+#include <linux/fs.h> -+ -+/* maximum number of snapshots available for users */ -+#define MAX_SNAPS 20 -+ -+/* snap extended attributes definition */ -+#define SNAP_ATTR "@snap" -+struct snap_ea{ -+ int generation; -+ ino_t prev_ino; -+ ino_t next_ino; -+ ino_t ino[MAX_SNAPS+1]; /* including current snapshot */ -+ ino_t parent_ino[MAX_SNAPS+1]; -+}; -+#define MAX_SNAP_DATA (sizeof(struct snap_ea)) -+#if 0 -+/* for compatibility with old 128 max snapshots */ -+#define MAX_SNAP128_DATA (sizeof(struct snap_ea) - (sizeof(ino_t) * 128 * 2)) -+#define ZERO_SNAP_ATTR_TOP(buf) \ -+ do { \ -+ struct snap_ea *p = (struct snap_ea*)buf; \ -+ memset(&p->ino[129], 0, sizeof(ino_t)*128); \ -+ memset(&p->parent_ino[129], 0, sizeof(ino_t)*128); \ -+ } while(0) -+ -+/* snap new ea definition , for logging of new inode */ -+#define SNAP_NEW_INO_ATTR "@snap_new" -+struct snap_new_ea{ -+ ino_t prev_ino; /* reserved. save the inode to a linked list */ -+ ino_t next_ino; -+ int new_index; /* indicate for which index this is a new inode */ -+}; -+#define NULL_NEW_INDEX -1 /* null new index, to clear the snap_new_ea */ -+ -+/* ea to identiry a indirect inode's infomation */ -+#define SNAP_INDIRECT_INFO_ATTR "@snap_indirect_inode_info" -+struct snap_indirect_info { -+ __u32 index; /* which index belongs to */ -+ __u32 reserved[3]; /* reserved */ -+}; -+#endif -+ -+/* snapfs meta data stored in extended attributes of root ino */ -+#define DISK_SNAP_META_ATTR "@disk_snap_meta_attr" -+struct disk_snap_meta_data { -+ ino_t snap_first_cowed_ino; -+ ino_t snap_table_ino; -+ __u32 snap_feature_compat; -+}; -+/*snapfs quota info */ -+ -+#define SNAP_USR_QUOTA 0 -+#define SNAP_GRP_QUOTA 1 -+#define DISK_SNAP_QUOTA_INFO "@disk_snap_quota_info" -+struct quota_info_len { -+ int uid_len; /*uid quota info length */ -+ int gid_len; /*gid quota info length */ -+}; -+/* -+ * Check if the EA @name is Snap EA or not. -+ * Snap EA includes the SNAP_ATTR, SNAP_NEW_INO_ATTR and DISK_SNAP_META_ATTR -+ */ -+ -+#define IS_SNAP_EA(name) ( (!strcmp((name), SNAP_ATTR)) || \ -+ (!strcmp((name), DISK_SNAP_META_ATTR))) -+ -+ -+ -+/* file system features */ -+#define SNAP_FEATURE_COMPAT_SNAPFS 0x0010 -+#define SNAP_FEATURE_COMPAT_BLOCKCOW 0x0020 -+ -+/* constants for snap_feature operations */ -+#define SNAP_CLEAR_FEATURE 0x0 -+#define SNAP_SET_FEATURE 0x1 -+#define SNAP_HAS_FEATURE 0x2 -+ -+/* snap flags for inode, within 1 byte range, each occupy 1 bit */ -+#define SNAP_INO_MAGIC 0x88 /* magic for snap inode */ -+#define SNAP_COW_FLAG 0x01 /* snap redirected inode */ -+#define SNAP_DEL_FLAG 0x02 /* snap deleted inode */ -+#define SNAP_TABLE_FLAG 0x04 /* snap table inode */ -+#define SNAP_PRI_FLAG 0x08 /* primary inode */ -+ -+/* no snapfs attributes for get_indirect_ino */ -+#define ENOSNAPATTR 320 -+ -+/* constants used by iterator */ -+#define SNAP_ITERATE_ALL_INODE 0x0 -+#define SNAP_ITERATE_COWED_INODE 0x1 -+ -+/* constants used by create_indirect */ -+#define SNAP_CREATE_IND_NORMAL 0x0 -+#define SNAP_CREATE_IND_DEL_PRI 0x1 -+ -+/* the data structure represent in the xfs_dinode.pad -+ offset 0: magic (1 byte) -+ offset 1: flag (1 byte) -+ offset 2: gen (4 bytes) -+ offset 6: unused -+ */ -+#define SIZEOF_MAGIC 1 -+#define SIZEOF_FLAG 1 -+#define SIZEOF_GENERATION 4 -+ -+#define MAGIC_OFFSET 0 -+#define FLAG_OFFSET 1 -+#define GENERATION_OFFSET 2 -+ -+#define SNAP_GET_DINODE_MAGIC(dinode) \ -+ (((__u8*)(dinode)->di_pad)[MAGIC_OFFSET]) -+#define SNAP_SET_DINODE_MAGIC(dinode) \ -+ ((__u8*)(dinode)->di_pad)[MAGIC_OFFSET] = (SNAP_INO_MAGIC) -+#define SNAP_GET_DINODE_FLAG(dinode) \ -+ (((__u8*)(dinode)->di_pad)[FLAG_OFFSET]) -+#define SNAP_SET_DINODE_FLAG(dinode, flag) \ -+ (((__u8*)(dinode)->di_pad)[FLAG_OFFSET] |= (flag)) -+#define SNAP_CLEAR_DINODE_FLAG(dinode, flag) \ -+ (((__u8*)(dinode)->di_pad)[FLAG_OFFSET] &= ~(flag)) -+#define SNAP_GET_DINODE_GEN(dinode) \ -+ (le32_to_cpu(*(__u32*)(&((__u8*)(dinode)->di_pad)[GENERATION_OFFSET]))) -+#define SNAP_SET_DINODE_GEN(dinode, gen) \ -+ *(__u32*)(&((__u8*)(dinode)->di_pad)[GENERATION_OFFSET]) = cpu_to_le32(gen) -+ -+#if 0 -+/* header of saving snaptable */ -+struct raw_data { -+ unsigned int size; /* buffer size passed by */ -+ char data[0]; /* followed by actual data */ -+}; -+ -+/* header of on-disk table data */ -+struct disk_snap_table_header { -+ __u32 magic; -+ __u32 version; -+ __u32 datasize; -+}; -+ -+/* table magic and version constant */ -+#define SNAP_TABLE_MAGIC 0xB3A2957F -+#define SNAP_TABLE_VERSION 1 -+ -+ -+#define SNAPTABLE_BLOCKS(sb,size) \ -+ (((size-sizeof(__u32)+sizeof(struct disk_snap_table_header)) \ -+ >> sb->s_blocksize_bits)+1) -+#endif -+ -+#define SNAP_VERSION(a,b,c) \ -+ (((a & 0xFF) << 16) | ((b & 0xFF) << 8) | (c & 0xFF)) -+#define SNAP_VERSION_MAJOR(v) \ -+ ((v >> 16) & 0xFF) -+#define SNAP_VERSION_MINOR(v) \ -+ ((v >> 8) & 0xFF) -+#define SNAP_VERSION_REL(v) \ -+ (v & 0xFF) -+ -+/* for snap meta attr table */ -+#define TABLE_ITEM_COUNT 200 -+#define TABLE_ITEM_SIZE 1000 -+#define TABLE_ITEM_NAME_SIZE 16 -+ -+/*snap table array */ -+struct snap_meta_array { -+ char name[TABLE_ITEM_NAME_SIZE]; -+ int start; /* where is the start of the array */ -+ int len; /* the len of the array */ -+}; -+/* snap table structure for record the information */ -+struct table_snap_meta_data { -+ int count; -+ struct snap_meta_array array[TABLE_ITEM_COUNT]; -+}; -+ -+ -+#if 0 -+#define SNAP_PROFILE -+#else -+#undef SNAP_PROFILE -+#endif -+ -+#ifdef SNAP_PROFILE -+struct profile_snapdel_stat -+{ -+ unsigned long total_tick; /* total time */ -+ unsigned long inodes; /* primary inodes */ -+ -+ unsigned long yield_count; /* for yeild cpu */ -+ unsigned long yield_tick; -+ unsigned long yield_max_tick; -+ -+ unsigned long getea_count; /* for get ea */ -+ unsigned long getea_tick; -+ unsigned long getea_max_tick; -+ -+ unsigned long setea_count; /* for set ea */ -+ unsigned long setea_tick; -+ unsigned long setea_max_tick; -+ -+ unsigned long converge_count; /* for converge */ -+ unsigned long converge_tick; -+ unsigned long converge_max_tick; -+}; -+ -+#endif -+ -+/* snapshot operations */ -+struct snapshot_operations { -+ unsigned int ops_version; -+ int (*is_redirector) (struct inode *inode); -+ int (*is_indirect) (struct inode *inode); -+ struct inode * (*create_indirect) (struct inode *pri, int index, -+ unsigned int gen, ino_t parent_ino, -+ int del); -+ struct inode * (*get_indirect) (struct inode *pri, int *table,int slot); -+ ino_t (*get_indirect_ino) (struct inode *pri, int index); -+ int (*destroy_indirect) (struct inode *pri, int index, -+ struct inode *next_ind); -+ int (*restore_indirect) (struct inode *pri, int index); -+ int (*iterate) (struct super_block *sb, -+ int (*repeat)(struct inode *inode, void *priv), -+ struct inode **start, void *priv, int flag); -+ int (*copy_block) ( struct inode *dst, struct inode *src, int blk); -+ int (*has_block) (struct inode *dst, int blk); -+ int (*set_indirect) (struct inode *pri, int index, -+ ino_t ind_ino, ino_t parent_ino ); -+ int (*snap_feature) (struct super_block *sb, int feature, int op); -+ int (*get_generation) (struct inode *pri); -+ int (*set_generation) (struct inode *pri, unsigned long new_gen); -+ int (*has_del_flag) (struct inode *inode); -+ int (*clear_del_flag) (struct inode *inode); -+ int (*set_meta_attr)(struct super_block *sb, char *name, -+ char *buf, int size); -+ int (*get_meta_attr)(struct super_block *sb, char *name, -+ char *buf, int *size); -+}; -+ -+#endif -Index: linux-2.4.20-8/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_fs.h 2004-01-27 20:21:43.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_fs.h 2004-01-27 22:45:56.000000000 +0800 -@@ -186,6 +186,13 @@ - #define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ - #define EXT3_EXTENTS_FL 0x00080000 /* Inode uses extents */ - -+/* For snapfs in EXT3 flags --- FIXME will find other ways to store it*/ -+#define EXT3_COW_FL 0x00008000 /* inode is snapshot cow */ -+#define EXT3_DEL_FL 0x00010000 /* inode is deleting in snapshot */ -+#define EXT3_SNAP_TABLE_FLAG 0x00020000 /* snap table inode */ -+ /* FIXME For debugging will be removed later*/ -+#define EXT3_SNAP_PRI_FLAG 0x00040000 /* primary inode */ -+ - #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ - #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ - -@@ -219,7 +226,22 @@ - #define EXT3_IOC_EA_TREE_INIT _IOW('f', 13, long) - #define EXT3_IOC_EA_TREE_ALLOCATE _IOW('f', 14, long) - #define EXT3_IOC_EA_TREE_REMOVE _IOW('f', 15, long) -- -+/* the following are for temporary test */ -+/* snapfs ioctls */ -+#define EXT3_IOC_CREATE_INDIR _IOW('v', 3, long) -+#define EXT3_IOC_GET_INDIR _IOW('v', 4, long) -+#define EXT3_IOC_DESTROY_INDIR _IOW('v', 5, long) -+#define EXT3_IOC_IS_REDIR _IOW('v', 6, long) -+#define EXT3_IOC_RESTORE_INDIR _IOW('v', 7, long) -+ -+#define EXT3_IOC_SNAP_SETFILECOW _IOW('v', 10, long) -+ -+/* XXX: the following are for temporary test, can be removed later */ -+#define EXT3_IOC_SNAP_PRINT _IOW('v', 11, long) -+#define EXT3_IOC_SNAP_DELETE _IOW('v', 12, long) -+#define EXT3_IOC_SNAP_RESTORE _IOW('v', 13, long) -+ -+ - - /* - * Structure of an inode on the disk -@@ -443,7 +465,15 @@ - __u8 s_def_hash_version; /* Default hash version to use */ - __u8 s_reserved_char_pad; - __u16 s_reserved_word_pad; -- __u32 s_reserved[192]; /* Padding to the end of the block */ -+ __u32 s_default_mount_opts; -+ __u32 s_first_meta_bg; /* First metablock group */ -+ __u32 s_mkfs_time; /* When the filesystem was created */ -+ /* for snapfs */ -+ __u32 s_first_cowed_pri_ino; /* For snapfs,the first cowed primary inode */ -+ __u32 s_last_cowed_pri_ino; /* last cowed ino in memory */ -+ __u32 s_snaptable_ino; /* snaptable ino in memory */ -+ __u32 s_last_snap_orphan; /* SnapFS: start of cowing indirect inode */ -+ __u32 s_reserved[186]; /* Padding to the end of the block,originally 204 */ - }; - - #ifdef __KERNEL__ -@@ -517,6 +547,9 @@ - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - -+#define EXT3_FEATURE_COMPAT_SNAPFS 0x0010 -+#define EXT3_FEATURE_COMPAT_BLOCKCOW 0x0020 -+ - #define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) -Index: linux-2.4.20-8/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_fs_sb.h 2004-01-27 19:33:54.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_fs_sb.h 2004-01-27 22:45:56.000000000 +0800 -@@ -86,6 +86,13 @@ - wait_queue_head_t s_delete_thread_queue; - wait_queue_head_t s_delete_waiter_queue; - #endif -+#define EXT3_SNAP_FS -+#ifdef EXT3_SNAP_FS -+ struct semaphore s_snap_list_sem; -+ unsigned long s_first_cowed_pri_ino;/* For snapfs,the first cowed primary inode */ -+ unsigned long s_last_cowed_pri_ino; /* last cowed ino in memory */ -+ unsigned long s_snaptable_ino; /* snaptable ino in memory */ -+#endif - }; - - #endif /* _LINUX_EXT3_FS_SB */ -Index: linux-2.4.20-8/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_jbd.h 2004-01-27 19:33:48.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_jbd.h 2004-01-27 22:45:56.000000000 +0800 -@@ -71,6 +71,33 @@ - - #define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 - -+/*snapshot transaction blocks*/ -+ -+#define EXT3_EA_TRANS_BLOCKS EXT3_DATA_TRANS_BLOCKS -+#define EXT3_SETMETA_TRANS_BLOCKS EXT3_DATA_TRANS_BLOCKS -+#define EXT3_NEWINODE_TRANS_BLOCKS 10 -+#define SNAP_INSERTLIST_TRANS_BLOCKS (2 * EXT3_EA_TRANS_BLOCKS + 1) -+#define SNAP_DELETELIST_TRANS_BLOCKS (2 * EXT3_EA_TRANS_BLOCKS + 2) -+#define SNAP_COPYBLOCK_TRANS_BLOCKS (EXT3_DATA_TRANS_BLOCKS) -+#define SNAP_MIGRATEDATA_TRANS_BLOCKS 2 -+#define SNAP_SETIND_TRANS_BLOCKS (SNAP_INSERTLIST_TRANS_BLOCKS + 1) -+#define SNAP_ADDORPHAN_TRANS_BLOCKS 2 -+#define SNAP_REMOVEORPHAN_TRANS_BLOCKS 1 -+#define SNAP_RESTOREORPHAN_TRANS_BLOCKS (EXT3_EA_TRANS_BLOCKS + \ -+ SNAP_DELETELIST_TRANS_BLOCKS + \ -+ EXT3_NEWINODE_TRANS_BLOCKS + \ -+ 2 * SNAP_MIGRATEDATA_TRANS_BLOCKS) -+#define SNAP_BIGCOPY_TRANS_BLOCKS (2 * EXT3_DATA_TRANS_BLOCKS) -+#define SNAP_CREATEIND_TRANS_BLOCKS (EXT3_NEWINODE_TRANS_BLOCKS + \ -+ SNAP_MIGRATEDATA_TRANS_BLOCKS + \ -+ SNAP_SETIND_TRANS_BLOCKS + \ -+ SNAP_BIGCOPY_TRANS_BLOCKS + 3) -+#define SNAP_MIGRATEBLK_TRANS_BLOCKS 2 -+#define SNAP_DESTROY_TRANS_BLOCKS (SNAP_DELETELIST_TRANS_BLOCKS + \ -+ EXT3_EA_TRANS_BLOCKS + 2) -+#define SNAP_RESTORE_TRANS_BLOCKS (EXT3_NEWINODE_TRANS_BLOCKS + \ -+ 2 * SNAP_MIGRATEDATA_TRANS_BLOCKS + 1) -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, - -%diffstat - fs/ext3/Makefile | 2 - fs/ext3/ext3-exports.c | 2 - fs/ext3/ialloc.c | 7 - fs/ext3/inode.c | 2 - fs/ext3/snap.c | 2578 +++++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 37 - include/linux/ext3_fs_sb.h | 7 - include/linux/ext3_jbd.h | 27 - include/linux/snap.h | 266 ++++ - 10 files changed, 2931 insertions(+), 4 deletions(-) - diff --git a/lustre/kernel_patches/patches/ext3-start_this_handle-must-return-error.patch b/lustre/kernel_patches/patches/ext3-start_this_handle-must-return-error.patch deleted file mode 100644 index 10f0326a15..0000000000 --- a/lustre/kernel_patches/patches/ext3-start_this_handle-must-return-error.patch +++ /dev/null @@ -1,22 +0,0 @@ -Index: linux-2.6.0/fs/jbd/transaction.c -=================================================================== ---- linux-2.6.0.orig/fs/jbd/transaction.c 2004-01-05 16:18:59.000000000 +0300 -+++ linux-2.6.0/fs/jbd/transaction.c 2004-01-05 16:19:48.000000000 +0300 -@@ -85,7 +85,7 @@ - int needed; - int nblocks = handle->h_buffer_credits; - transaction_t *new_transaction = NULL; -- int ret; -+ int ret = 0; - - if (nblocks > journal->j_max_transaction_buffers) { - printk(KERN_ERR "JBD: %s wants too many credits (%d > %d)\n", -@@ -231,7 +231,7 @@ - out: - if (new_transaction) - kfree(new_transaction); -- return 0; -+ return ret; - } - - /* Allocate a new handle. This should probably be in a slab... */ diff --git a/lustre/kernel_patches/patches/extN-misc-fixup.patch b/lustre/kernel_patches/patches/ext3-super-ntohl.patch similarity index 59% rename from lustre/kernel_patches/patches/extN-misc-fixup.patch rename to lustre/kernel_patches/patches/ext3-super-ntohl.patch index 65d9347ced..3214908080 100644 --- a/lustre/kernel_patches/patches/extN-misc-fixup.patch +++ b/lustre/kernel_patches/patches/ext3-super-ntohl.patch @@ -1,9 +1,7 @@ - fs/ext3/super.c | 4 ++-- - 1 files changed, 2 insertions(+), 2 deletions(-) - ---- linux-2.4.18-p4smp/fs/ext3/super.c~extN-misc-fixup 2003-07-21 23:07:50.000000000 -0600 -+++ linux-2.4.18-p4smp-braam/fs/ext3/super.c 2003-07-21 23:08:06.000000000 -0600 -@@ -1578,10 +1578,10 @@ static journal_t *ext3_get_dev_journal(s +diff -rupN linux-2.6.6.old/fs/ext3/super.c linux-2.6.6.new/fs/ext3/super.c +--- linux-2.6.6.old/fs/ext3/super.c Mon May 10 05:33:19 2004 ++++ linux-2.6.6.new/fs/ext3/super.c Thu Jun 24 12:28:24 2004 +@@ -1719,10 +1719,10 @@ static journal_t *ext3_get_dev_journal(s printk(KERN_ERR "EXT3-fs: I/O error on journal device\n"); goto out_journal; } @@ -16,5 +14,3 @@ goto out_journal; } EXT3_SB(sb)->journal_bdev = bdev; - -_ diff --git a/lustre/kernel_patches/patches/ext3-truncate-buffer-head.patch b/lustre/kernel_patches/patches/ext3-truncate-buffer-head-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-truncate-buffer-head.patch rename to lustre/kernel_patches/patches/ext3-truncate-buffer-head-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-truncate_blocks.patch b/lustre/kernel_patches/patches/ext3-truncate_blocks.patch deleted file mode 100644 index ce3928d869..0000000000 --- a/lustre/kernel_patches/patches/ext3-truncate_blocks.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-trusted_ea-2.4.20.patch b/lustre/kernel_patches/patches/ext3-trusted_ea-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-trusted_ea-2.4.20.patch rename to lustre/kernel_patches/patches/ext3-trusted_ea-2.4.24.patch diff --git a/lustre/kernel_patches/patches/ext3-trusted_ea-suse-2.4.19.patch b/lustre/kernel_patches/patches/ext3-trusted_ea-suse-2.4.19.patch deleted file mode 100644 index 1c31052e98..0000000000 --- a/lustre/kernel_patches/patches/ext3-trusted_ea-suse-2.4.19.patch +++ /dev/null @@ -1,179 +0,0 @@ - fs/ext3/xattr.c | 12 +++++- - fs/ext3/xattr_trusted.c | 86 +++++++++++++++++++++++++++++++++++++++++++++ - include/linux/ext3_xattr.h | 6 +++ - 3 files changed, 102 insertions(+), 2 deletions(-) - -Index: linux-2.4.19/fs/ext3/xattr.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/xattr.c 2004-04-23 22:44:57.000000000 -0400 -+++ linux-2.4.19/fs/ext3/xattr.c 2004-04-23 22:45:20.000000000 -0400 -@@ -1785,18 +1785,25 @@ - int __init - init_ext3_xattr(void) - { -+ int error; -+ - ext3_xattr_cache = mb_cache_create("ext3_xattr", NULL, - sizeof(struct mb_cache_entry) + - sizeof(struct mb_cache_entry_index), 1, 61); - if (!ext3_xattr_cache) - return -ENOMEM; - -- return 0; -+ error = init_ext3_xattr_trusted(); -+ if (error) -+ mb_cache_destroy(ext3_xattr_cache); -+ -+ return error; - } - - void - exit_ext3_xattr(void) - { -+ exit_ext3_xattr_trusted(); - if (ext3_xattr_cache) - mb_cache_destroy(ext3_xattr_cache); - ext3_xattr_cache = NULL; -@@ -1807,12 +1814,13 @@ - int __init - init_ext3_xattr(void) - { -- return 0; -+ return init_ext3_xattr_trusted(); - } - - void - exit_ext3_xattr(void) - { -+ exit_ext3_xattr_trusted(); - } - - #endif /* CONFIG_EXT3_FS_XATTR_SHARING */ -Index: linux-2.4.19/fs/ext3/xattr_trusted.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/xattr_trusted.c 2003-01-30 05:24:37.000000000 -0500 -+++ linux-2.4.19/fs/ext3/xattr_trusted.c 2004-04-23 22:45:20.000000000 -0400 -@@ -0,0 +1,86 @@ -+/* -+ * linux/fs/ext3/xattr_trusted.c -+ * Handler for trusted extended attributes. -+ * -+ * Copyright (C) 2003 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#define XATTR_TRUSTED_PREFIX "trusted." -+ -+static size_t -+ext3_xattr_trusted_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_TRUSTED_PREFIX)-1; -+ -+ if (!capable(CAP_SYS_ADMIN)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_TRUSTED_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext3_xattr_trusted_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!capable(CAP_SYS_ADMIN)) -+ return -EPERM; -+ return ext3_xattr_get(inode, EXT3_XATTR_INDEX_TRUSTED, name, -+ buffer, size); -+} -+ -+static int -+ext3_xattr_trusted_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ handle_t *handle; -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!capable(CAP_SYS_ADMIN)) -+ return -EPERM; -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ error = ext3_xattr_set(handle, inode, EXT3_XATTR_INDEX_TRUSTED, name, -+ value, size, flags); -+ ext3_journal_stop(handle, inode); -+ -+ return error; -+} -+ -+struct ext3_xattr_handler ext3_xattr_trusted_handler = { -+ .prefix = XATTR_TRUSTED_PREFIX, -+ .list = ext3_xattr_trusted_list, -+ .get = ext3_xattr_trusted_get, -+ .set = ext3_xattr_trusted_set, -+}; -+ -+int __init -+init_ext3_xattr_trusted(void) -+{ -+ return ext3_xattr_register(EXT3_XATTR_INDEX_TRUSTED, -+ &ext3_xattr_trusted_handler); -+} -+ -+void -+exit_ext3_xattr_trusted(void) -+{ -+ ext3_xattr_unregister(EXT3_XATTR_INDEX_TRUSTED, -+ &ext3_xattr_trusted_handler); -+} -Index: linux-2.4.19/fs/ext3/Makefile -=================================================================== ---- linux-2.4.19.orig/fs/ext3/Makefile 2004-04-23 22:38:38.000000000 -0400 -+++ linux-2.4.19/fs/ext3/Makefile 2004-04-23 22:49:23.000000000 -0400 -@@ -12,7 +12,7 @@ - export-objs := super.o inode.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o xattr_trusted.o - obj-m := $(O_TARGET) - - obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -Index: linux-2.4.19/include/linux/ext3_xattr.h -=================================================================== ---- linux-2.4.19.orig/include/linux/ext3_xattr.h 2004-04-23 17:53:54.000000000 -0400 -+++ linux-2.4.19/include/linux/ext3_xattr.h 2004-04-23 22:45:20.000000000 -0400 -@@ -21,6 +21,9 @@ - #define EXT3_XATTR_INDEX_USER 1 - #define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 - #define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+#define EXT3_XATTR_INDEX_TRUSTED 4 -+#define EXT3_XATTR_INDEX_LUSTRE 5 -+#define EXT3_XATTR_INDEX_SECURITY 6 - - struct ext3_xattr_header { - __u32 h_magic; /* magic number for identification */ -@@ -84,6 +87,9 @@ - extern int init_ext3_xattr(void) __init; - extern void exit_ext3_xattr(void); - -+extern int init_ext3_xattr_trusted(void) __init; -+extern void exit_ext3_xattr_trusted(void); -+ - # else /* CONFIG_EXT3_FS_XATTR */ - # define ext3_setxattr NULL - # define ext3_getxattr NULL diff --git a/lustre/kernel_patches/patches/ext3-unmount_sync.patch b/lustre/kernel_patches/patches/ext3-unmount_sync.patch deleted file mode 100644 index c57903c0e2..0000000000 --- a/lustre/kernel_patches/patches/ext3-unmount_sync.patch +++ /dev/null @@ -1,21 +0,0 @@ - fs/ext3/super.c | 7 ++++++- - 1 files changed, 6 insertions(+), 1 deletion(-) - ---- linux-2.4.20/fs/ext3/super.c~ext3-unmount_sync 2003-04-08 23:35:44.000000000 -0600 -+++ linux-2.4.20-braam/fs/ext3/super.c 2003-04-08 23:35:44.000000000 -0600 -@@ -1612,7 +1612,12 @@ void ext3_write_super (struct super_bloc - sb->s_dirt = 0; - target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); - -- if (do_sync_supers) { -+ /* -+ * Tricky --- if we are unmounting, the write really does need -+ * to be synchronous. We can detect that by looking for NULL in -+ * sb->s_root. -+ */ -+ if (do_sync_supers || !sb->s_root) { - unlock_super(sb); - log_wait_commit(EXT3_SB(sb)->s_journal, target); - lock_super(sb); - -_ diff --git a/lustre/kernel_patches/patches/ext3-use-after-free-2.4.19-pre1.patch b/lustre/kernel_patches/patches/ext3-use-after-free-2.4.19-pre1.patch deleted file mode 100644 index 595db54861..0000000000 --- a/lustre/kernel_patches/patches/ext3-use-after-free-2.4.19-pre1.patch +++ /dev/null @@ -1,53 +0,0 @@ - ./fs/ext3/namei.c | 11 +++++------ - 1 files changed, 5 insertions(+), 6 deletions(-) - -Index: linux-2.4.19-pre1/./fs/ext3/namei.c -=================================================================== ---- linux-2.4.19-pre1.orig/./fs/ext3/namei.c 2003-11-21 01:52:06.000000000 +0300 -+++ linux-2.4.19-pre1/./fs/ext3/namei.c 2003-11-21 01:58:15.000000000 +0300 -@@ -1522,8 +1522,11 @@ - { - int err = ext3_add_entry(handle, dentry, inode); - if (!err) { -- d_instantiate(dentry, inode); -- return 0; -+ err = ext3_mark_inode_dirty(handle, inode); -+ if (err == 0) { -+ d_instantiate(dentry, inode); -+ return 0; -+ } - } - ext3_dec_count(handle, inode); - iput(inode); -@@ -1559,7 +1562,6 @@ - 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_journal_stop(handle, dir); -@@ -1586,7 +1588,6 @@ - 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_journal_stop(handle, dir); -@@ -2035,7 +2036,6 @@ - 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); - out_stop: - ext3_journal_stop(handle, dir); -@@ -2069,7 +2069,6 @@ - ext3_inc_count(handle, inode); - atomic_inc(&inode->i_count); - -- ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); - ext3_journal_stop(handle, dir); - return err; diff --git a/lustre/kernel_patches/patches/ext3-use-after-free-suse.patch b/lustre/kernel_patches/patches/ext3-use-after-free-suse.patch deleted file mode 100644 index 5a5dc5a656..0000000000 --- a/lustre/kernel_patches/patches/ext3-use-after-free-suse.patch +++ /dev/null @@ -1,53 +0,0 @@ - ./fs/ext3/namei.c | 11 +++++------ - 1 files changed, 5 insertions(+), 6 deletions(-) - -Index: linux-2.4.19/fs/ext3/namei.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/namei.c 2004-04-23 22:30:41.000000000 -0400 -+++ linux-2.4.19/fs/ext3/namei.c 2004-04-23 22:36:03.000000000 -0400 -@@ -1522,8 +1522,11 @@ - { - int err = ext3_add_entry(handle, dentry, inode); - if (!err) { -- d_instantiate(dentry, inode); -- return 0; -+ err = ext3_mark_inode_dirty(handle, inode); -+ if (err == 0) { -+ d_instantiate(dentry, inode); -+ return 0; -+ } - } - ext3_dec_count(handle, inode); - iput(inode); -@@ -1559,7 +1562,6 @@ - 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_journal_stop(handle, dir); -@@ -1589,7 +1591,6 @@ - #ifdef CONFIG_EXT3_FS_XATTR - inode->i_op = &ext3_special_inode_operations; - #endif -- ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); - } - ext3_journal_stop(handle, dir); -@@ -2039,7 +2040,6 @@ - inode->i_size = l-1; - } - EXT3_I(inode)->i_disksize = inode->i_size; -- ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); - out_stop: - ext3_journal_stop(handle, dir); -@@ -2073,7 +2073,6 @@ - ext3_inc_count(handle, inode); - atomic_inc(&inode->i_count); - -- ext3_mark_inode_dirty(handle, inode); - err = ext3_add_nondir(handle, dentry, inode); - ext3_journal_stop(handle, dir); - return err; diff --git a/lustre/kernel_patches/patches/ext3-use-after-free.patch b/lustre/kernel_patches/patches/ext3-use-after-free.patch deleted file mode 100644 index dd999bfb14..0000000000 --- a/lustre/kernel_patches/patches/ext3-use-after-free.patch +++ /dev/null @@ -1,53 +0,0 @@ - ./fs/ext3/namei.c | 11 +++++------ - 1 files changed, 5 insertions(+), 6 deletions(-) - ---- linux-2.4.20/./fs/ext3/namei.c~ext3-use-after-free 2003-04-08 23:35:51.000000000 -0600 -+++ linux-2.4.20-braam/./fs/ext3/namei.c 2003-04-08 23:35:51.000000000 -0600 -@@ -1521,8 +1521,11 @@ static int ext3_add_nondir(handle_t *han - { - int err = ext3_add_entry(handle, dentry, inode); - if (!err) { -- d_instantiate(dentry, inode); -- return 0; -+ err = ext3_mark_inode_dirty(handle, inode); -+ if (err == 0) { -+ d_instantiate(dentry, inode); -+ return 0; -+ } - } - ext3_dec_count(handle, inode); - iput(inode); -@@ -1559,7 +1562,6 @@ static int ext3_create (struct inode * d - inode->i_fop = &ext3_file_operations; - inode->i_mapping->a_ops = &ext3_aops; - err = ext3_add_nondir(handle, dentry, inode); -- ext3_mark_inode_dirty(handle, inode); - } - ext3_journal_stop(handle, dir); - return err; -@@ -1586,7 +1588,6 @@ static int ext3_mknod (struct inode * di - if (!IS_ERR(inode)) { - init_special_inode(inode, mode, rdev); - err = ext3_add_nondir(handle, dentry, inode); -- ext3_mark_inode_dirty(handle, inode); - } - ext3_journal_stop(handle, dir); - return err; -@@ -2035,7 +2036,6 @@ static int ext3_symlink (struct inode * - } - EXT3_I(inode)->i_disksize = inode->i_size; - err = ext3_add_nondir(handle, dentry, inode); -- ext3_mark_inode_dirty(handle, inode); - out_stop: - ext3_journal_stop(handle, dir); - return err; -@@ -2069,7 +2069,6 @@ static int ext3_link (struct dentry * ol - atomic_inc(&inode->i_count); - - err = ext3_add_nondir(handle, dentry, inode); -- ext3_mark_inode_dirty(handle, inode); - ext3_journal_stop(handle, dir); - return err; - } - -_ diff --git a/lustre/kernel_patches/patches/ext3-xattr-ptr-arith-fix.patch b/lustre/kernel_patches/patches/ext3-xattr-ptr-arith-fix-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/ext3-xattr-ptr-arith-fix.patch rename to lustre/kernel_patches/patches/ext3-xattr-ptr-arith-fix-2.4.24.patch 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 deleted file mode 100644 index 414d60dca6..0000000000 --- a/lustre/kernel_patches/patches/ext3_delete_thread_2.4.20_chaos.patch +++ /dev/null @@ -1,500 +0,0 @@ - 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(+) - -Index: linux-2.4.20-rh-20.9/fs/ext3/super.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/fs/ext3/super.c 2004-01-12 19:27:46.000000000 +0300 -+++ linux-2.4.20-rh-20.9/fs/ext3/super.c 2004-01-13 17:20:31.000000000 +0300 -@@ -400,6 +400,221 @@ - } - } - -+#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, -+ sbi->s_delete_list.next == 0 && sbi->s_delete_inodes == 0); -+} -+ -+/* 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 +622,7 @@ - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ J_ASSERT(sbi->s_delete_inodes == 0); - ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { -@@ -455,7 +671,11 @@ - 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 +744,13 @@ - 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 +1450,7 @@ - } - - 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 -@@ -1614,7 +1842,12 @@ - static int ext3_sync_fs(struct super_block *sb) - { - tid_t target; -- -+ -+ if (atomic_read(&sb->s_active) == 0) { -+ /* fs is being umounted: time to stop delete thread */ -+ ext3_stop_delete_thread(EXT3_SB(sb)); -+ } -+ - sb->s_dirt = 0; - target = log_start_commit(EXT3_SB(sb)->s_journal, NULL); - log_wait_commit(EXT3_SB(sb)->s_journal, target); -@@ -1678,6 +1911,9 @@ - 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"); - -Index: linux-2.4.20-rh-20.9/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/fs/ext3/inode.c 2004-01-12 19:27:46.000000000 +0300 -+++ linux-2.4.20-rh-20.9/fs/ext3/inode.c 2004-01-13 17:15:48.000000000 +0300 -@@ -2017,6 +2017,122 @@ - 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. -Index: linux-2.4.20-rh-20.9/fs/ext3/file.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/fs/ext3/file.c 2004-01-12 19:27:46.000000000 +0300 -+++ linux-2.4.20-rh-20.9/fs/ext3/file.c 2004-01-13 17:15:48.000000000 +0300 -@@ -125,7 +125,11 @@ - }; - - 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 */ -Index: linux-2.4.20-rh-20.9/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/linux/ext3_fs.h 2004-01-12 19:27:46.000000000 +0300 -+++ linux-2.4.20-rh-20.9/include/linux/ext3_fs.h 2004-01-13 17:15:48.000000000 +0300 -@@ -193,6 +193,7 @@ - */ - #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 @@ - #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_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 */ -Index: linux-2.4.20-rh-20.9/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/linux/ext3_fs_sb.h 2004-01-12 19:27:46.000000000 +0300 -+++ linux-2.4.20-rh-20.9/include/linux/ext3_fs_sb.h 2004-01-13 17:15:48.000000000 +0300 -@@ -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 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/ext3_orphan_lock-2.4.20-rh.patch b/lustre/kernel_patches/patches/ext3_orphan_lock-2.4.20-rh.patch deleted file mode 100644 index d029650313..0000000000 --- a/lustre/kernel_patches/patches/ext3_orphan_lock-2.4.20-rh.patch +++ /dev/null @@ -1,82 +0,0 @@ - fs/ext3/namei.c | 15 +++++++-------- - fs/ext3/super.c | 1 + - include/linux/ext3_fs_sb.h | 1 + - 3 files changed, 9 insertions(+), 8 deletions(-) - ---- linux-rh-2.4.20-8/fs/ext3/namei.c~ext3_orphan_lock-2.4.20-rh 2003-05-05 19:49:15.000000000 +0800 -+++ linux-rh-2.4.20-8-root/fs/ext3/namei.c 2003-05-05 20:01:28.000000000 +0800 -@@ -1747,8 +1747,8 @@ int ext3_orphan_add(handle_t *handle, st - struct super_block *sb = inode->i_sb; - struct ext3_iloc iloc; - int err = 0, rc; -- -- lock_super(sb); -+ -+ down(&EXT3_SB(sb)->s_orphan_lock); - if (!list_empty(&EXT3_I(inode)->i_orphan)) - goto out_unlock; - -@@ -1796,7 +1796,7 @@ int ext3_orphan_add(handle_t *handle, st - jbd_debug(4, "orphan inode %ld will point to %d\n", - inode->i_ino, NEXT_ORPHAN(inode)); - out_unlock: -- unlock_super(sb); -+ up(&EXT3_SB(sb)->s_orphan_lock); - ext3_std_error(inode->i_sb, err); - return err; - } -@@ -1809,20 +1809,19 @@ int ext3_orphan_del(handle_t *handle, st - { - struct list_head *prev; - struct ext3_inode_info *ei = EXT3_I(inode); -- struct ext3_sb_info *sbi; -+ struct ext3_sb_info *sbi = EXT3_SB(inode->i_sb); - unsigned long ino_next; - struct ext3_iloc iloc; - int err = 0; - -- lock_super(inode->i_sb); -+ down(&sbi->s_orphan_lock); - if (list_empty(&ei->i_orphan)) { -- unlock_super(inode->i_sb); -+ up(&sbi->s_orphan_lock); - return 0; - } - - ino_next = NEXT_ORPHAN(inode); - prev = ei->i_orphan.prev; -- sbi = EXT3_SB(inode->i_sb); - - jbd_debug(4, "remove inode %lu from orphan list\n", inode->i_ino); - -@@ -1871,7 +1870,7 @@ int ext3_orphan_del(handle_t *handle, st - out_err: - ext3_std_error(inode->i_sb, err); - out: -- unlock_super(inode->i_sb); -+ up(&sbi->s_orphan_lock); - return err; - - out_brelse: ---- linux-rh-2.4.20-8/fs/ext3/super.c~ext3_orphan_lock-2.4.20-rh 2003-05-05 19:49:15.000000000 +0800 -+++ linux-rh-2.4.20-8-root/fs/ext3/super.c 2003-05-05 19:54:09.000000000 +0800 -@@ -1151,6 +1151,7 @@ struct super_block * ext3_read_super (st - */ - sb->s_op = &ext3_sops; - INIT_LIST_HEAD(&sbi->s_orphan); /* unlinked but open files */ -+ sema_init(&sbi->s_orphan_lock, 1); - - sb->s_root = 0; - ---- linux-rh-2.4.20-8/include/linux/ext3_fs_sb.h~ext3_orphan_lock-2.4.20-rh 2003-05-05 19:49:07.000000000 +0800 -+++ linux-rh-2.4.20-8-root/include/linux/ext3_fs_sb.h 2003-05-05 19:54:09.000000000 +0800 -@@ -69,6 +69,7 @@ struct ext3_sb_info { - struct inode * s_journal_inode; - struct journal_s * s_journal; - struct list_head s_orphan; -+ struct semaphore s_orphan_lock; - unsigned long s_commit_interval; - struct block_device *journal_bdev; - #ifdef CONFIG_JBD_DEBUG - -_ diff --git a/lustre/kernel_patches/patches/ext3_snapfs_exports-2.4.24.patch b/lustre/kernel_patches/patches/ext3_snapfs_exports-2.4.24.patch deleted file mode 100644 index fbe62a75b6..0000000000 --- a/lustre/kernel_patches/patches/ext3_snapfs_exports-2.4.24.patch +++ /dev/null @@ -1,75 +0,0 @@ -Index: linux-2.4.24/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.24.orig/include/linux/ext3_fs.h 2004-07-04 20:23:10.000000000 +0800 -+++ linux-2.4.24/include/linux/ext3_fs.h 2004-07-04 20:23:15.000000000 +0800 -@@ -446,7 +446,8 @@ - __u8 s_reserved_char_pad; - __u16 s_reserved_word_pad; - __u32 s_mdsnum; -- __u32 s_reserved[191]; /* Padding to the end of the block */ -+ __u32 s_snaptable_ino; /*snaptable ino*/ -+ __u32 s_reserved[190]; /* Padding to the end of the block */ - }; - - #ifdef __KERNEL__ -@@ -799,7 +800,8 @@ - extern void ext3_ext_init(struct super_block *); - extern void ext3_ext_release(struct super_block *); - extern void ext3_extents_initialize_blockmap(handle_t *, struct inode *); -- -+extern int ext3_bmap(struct address_space *mapping, long block); -+extern int ext3_load_inode_bitmap (struct super_block * sb, unsigned int block_group); - #endif /* __KERNEL__ */ - - #define EXT3_IOC_CREATE_INUM _IOW('f', 5, long) -Index: linux-2.4.24/fs/ext3/inode.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/inode.c 2004-07-04 20:23:09.000000000 +0800 -+++ linux-2.4.24/fs/ext3/inode.c 2004-07-04 20:23:15.000000000 +0800 -@@ -1200,7 +1200,7 @@ - * So, if we see any bmap calls here on a modified, data-journaled file, - * take extra steps to flush any blocks which might be in the cache. - */ --static int ext3_bmap(struct address_space *mapping, long block) -+int ext3_bmap(struct address_space *mapping, long block) - { - struct inode *inode = mapping->host; - journal_t *journal; -Index: linux-2.4.24/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/ext3-exports.c 2004-07-04 20:23:10.000000000 +0800 -+++ linux-2.4.24/fs/ext3/ext3-exports.c 2004-07-04 21:11:42.000000000 +0800 -@@ -26,6 +26,15 @@ - EXPORT_SYMBOL(ext3_decode_error); - EXPORT_SYMBOL(__ext3_std_error); - -+EXPORT_SYMBOL(ext3_bmap); -+EXPORT_SYMBOL(ext3_new_inode); -+EXPORT_SYMBOL(ext3_load_inode_bitmap); -+EXPORT_SYMBOL(ext3_orphan_add); -+EXPORT_SYMBOL(ext3_orphan_del); -+EXPORT_SYMBOL(ext3_discard_prealloc); -+EXPORT_SYMBOL(ext3_get_group_desc); -+EXPORT_SYMBOL(ext3_getblk); -+ - int ext3_add_dir_entry (struct dentry *dentry); - EXPORT_SYMBOL(ext3_add_dir_entry); - int ext3_del_dir_entry(struct dentry *dentry); -Index: linux-2.4.24/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.24.orig/fs/ext3/ialloc.c 2004-07-04 20:23:09.000000000 +0800 -+++ linux-2.4.24/fs/ext3/ialloc.c 2004-07-04 20:23:15.000000000 +0800 -@@ -79,6 +79,13 @@ - return retval; - } - -+/* Export load_inode_bitmap*/ -+int ext3_load_inode_bitmap (struct super_block * sb, -+ unsigned int block_group) -+{ -+ return load_inode_bitmap(sb, block_group); -+} -+ - /* - * load_inode_bitmap loads the inode bitmap for a blocks group - * diff --git a/lustre/kernel_patches/patches/extN-2.4.18-ino_sb_fixup.patch b/lustre/kernel_patches/patches/extN-2.4.18-ino_sb_fixup.patch deleted file mode 100644 index df46643245..0000000000 --- a/lustre/kernel_patches/patches/extN-2.4.18-ino_sb_fixup.patch +++ /dev/null @@ -1,33 +0,0 @@ ---- ./include/linux/ext3_fs.h.orig Tue May 7 17:06:03 2002 -+++ ./include/linux/ext3_fs.h Tue May 7 17:07:11 2002 -@@ -17,6 +17,8 @@ - #define _LINUX_EXT3_FS_H - - #include <linux/types.h> -+#include <linux/ext3_fs_sb.h> -+#include <linux/ext3_fs_i.h> - - /* - * The second extended filesystem constants/structures -@@ -86,8 +88,8 @@ - #define EXT3_MIN_BLOCK_LOG_SIZE 10 - - #ifdef __KERNEL__ --#define EXT3_SB(sb) (&((sb)->u.ext3_sb)) --#define EXT3_I(inode) (&((inode)->u.ext3_i)) -+#define EXT3_SB(sb) ((struct ext3_sb_info *)&((sb)->u.generic_sbp)) -+#define EXT3_I(inode) ((struct ext3_inode_info *)&((inode)->u.generic_ip)) - - #define EXT3_BLOCK_SIZE(s) ((s)->s_blocksize) - #define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -447,7 +447,9 @@ - #define NEXT_ORPHAN(inode) EXT3_I(inode)->i_dtime - static inline struct inode *orphan_list_entry(struct list_head *l) - { -- return list_entry(l, struct inode, u.ext3_i.i_orphan); -+ return ((struct inode *)((char *)l - -+ (unsigned long)(offsetof(struct inode, u.generic_ip) + -+ offsetof(struct ext3_inode_info, i_orphan)))); - } - - /* diff --git a/lustre/kernel_patches/patches/extN-noread.patch b/lustre/kernel_patches/patches/extN-noread.patch deleted file mode 100644 index 305f6fd7b3..0000000000 --- a/lustre/kernel_patches/patches/extN-noread.patch +++ /dev/null @@ -1,235 +0,0 @@ - fs/ext3/ialloc.c | 47 +++++++++++++++++++++- - fs/ext3/inode.c | 99 ++++++++++++++++++++++++++++++++++++------------ - include/linux/ext3_fs.h | 2 - 3 files changed, 122 insertions(+), 26 deletions(-) - ---- linux-2.4.18-chaos52/fs/ext3/ialloc.c~extN-noread 2003-05-16 12:26:29.000000000 +0800 -+++ linux-2.4.18-chaos52-root/fs/ext3/ialloc.c 2003-05-16 12:26:31.000000000 +0800 -@@ -289,6 +289,37 @@ error_return: - } - - /* -+ * @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) -+{ -+ int bitmap_nr = load_inode_bitmap(sb, block_group); -+ int inodes_per_block; -+ unsigned long inum, iend; -+ struct buffer_head *ibitmap; -+ -+ if (bitmap_nr < 0) -+ 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; -+ ibitmap = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]; -+ 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 -@@ -312,6 +343,7 @@ struct inode * ext3_new_inode (handle_t - struct ext3_group_desc * gdp; - struct ext3_group_desc * tmp; - struct ext3_super_block * es; -+ struct ext3_iloc iloc; - int err = 0; - - /* Cannot create files in a deleted directory */ -@@ -505,7 +537,7 @@ repeat: - ei->i_prealloc_count = 0; - #endif - ei->i_block_group = i; -- -+ - if (ei->i_flags & EXT3_SYNC_FL) - inode->i_flags |= S_SYNC; - if (IS_SYNC(inode)) -@@ -514,9 +546,18 @@ repeat: - inode->i_generation = sbi->s_next_generation++; - - ei->i_state = EXT3_STATE_NEW; -- err = ext3_mark_inode_dirty(handle, inode); -+ err = ext3_get_inode_loc_new(inode, &iloc, 1); - if (err) goto fail; -- -+ BUFFER_TRACE(iloc->bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, iloc.bh); -+ if (err) { -+ brelse(iloc.bh); -+ iloc.bh = NULL; -+ goto fail; -+ } -+ err = ext3_mark_iloc_dirty(handle, inode, &iloc); -+ if (err) goto fail; -+ - unlock_super (sb); - if(DQUOT_ALLOC_INODE(inode)) { - DQUOT_DROP(inode); ---- linux-2.4.18-chaos52/fs/ext3/inode.c~extN-noread 2003-05-16 12:26:29.000000000 +0800 -+++ linux-2.4.18-chaos52-root/fs/ext3/inode.c 2003-05-16 12:27:06.000000000 +0800 -@@ -2013,21 +2013,26 @@ out_stop: - --/* -- * 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 super_block *sb = inode->i_sb; - struct ext3_sb_info *sbi = EXT3_SB(sb); -- struct buffer_head *bh = 0; -+ struct buffer_head *bh[NUM_INODE_PREREAD]; - 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(sb)) || -@@ -2042,38 +2047,86 @@ int ext3_get_inode_loc (struct inode *in - } - group_desc = block_group >> sbi->s_desc_per_block_bits; - desc = block_group & (sbi->s_desc_per_block - 1); -- bh = sbi->s_group_desc[group_desc]; -- if (!bh) { -+ if (!sbi->s_group_desc[group_desc]) { - ext3_error(sb, __FUNCTION__, "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) % sbi->s_inodes_per_group) * -- sbi->s_inode_size; -+ offset = ((inode->i_ino - 1) % sbi->s_inodes_per_group); -+ - block = le32_to_cpu(gdp[desc].bg_inode_table) + -- (offset >> EXT3_BLOCK_SIZE_BITS(sb)); -- if (!(bh = sb_bread(sb, block))) { -- ext3_error (sb, __FUNCTION__, -- "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); -+ mark_buffer_uptodate(bh[0], 1); -+ 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=%lu", inode->i_ino, -+ bh[0]->b_blocknr); -+ goto bad_inode; -+ } - } -- offset &= (EXT3_BLOCK_SIZE(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) - { - struct ext3_iloc iloc; ---- linux-2.4.18-chaos52/include/linux/ext3_fs.h~extN-noread 2003-05-16 12:26:29.000000000 +0800 -+++ linux-2.4.18-chaos52-root/include/linux/ext3_fs.h 2003-05-16 12:26:31.000000000 +0800 -@@ -640,6 +640,8 @@ 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_itable_block_used(struct super_block *sb, 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/extN-wantedi-2.4.19-suse.patch b/lustre/kernel_patches/patches/extN-wantedi-2.4.19-suse.patch deleted file mode 100644 index 02cfef1e2b..0000000000 --- a/lustre/kernel_patches/patches/extN-wantedi-2.4.19-suse.patch +++ /dev/null @@ -1,226 +0,0 @@ - fs/ext3/ialloc.c | 40 ++++++++++++++++++++++++++++++++++++++-- - fs/ext3/inode.c | 2 +- - fs/ext3/ioctl.c | 25 +++++++++++++++++++++++++ - fs/ext3/namei.c | 21 +++++++++++++++++---- - include/linux/dcache.h | 5 +++++ - include/linux/ext3_fs.h | 5 ++++- - 6 files changed, 90 insertions(+), 8 deletions(-) - -Index: linux-2.4.19.SuSE/fs/ext3/namei.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/ext3/namei.c Sun Nov 16 01:18:04 2003 -+++ linux-2.4.19.SuSE/fs/ext3/namei.c Sun Nov 16 01:23:20 2003 -@@ -1534,6 +1534,19 @@ - return err; - } - -+static struct inode * ext3_new_inode_wantedi(handle_t *handle, struct inode *dir, -+ int mode, struct dentry *dentry) -+{ -+ unsigned long inum = 0; -+ -+ if (dentry->d_fsdata != NULL) { -+ struct dentry_params *param = -+ (struct dentry_params *) dentry->d_fsdata; -+ inum = param->p_inum; -+ } -+ return ext3_new_inode(handle, dir, mode, inum); -+} -+ - /* - * By the time this is called, we already have created - * the directory cache entry for the new file, but it -@@ -1557,7 +1570,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, mode); -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - inode->i_op = &ext3_file_inode_operations; -@@ -1585,7 +1598,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, mode); -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - init_special_inode(inode, inode->i_mode, rdev); -@@ -1618,7 +1631,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR | mode); -+ inode = ext3_new_inode_wantedi (handle, dir, S_IFDIR | mode, dentry); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -2013,7 +2026,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFLNK|S_IRWXUGO); -+ inode = ext3_new_inode_wantedi (handle, dir, S_IFLNK|S_IRWXUGO, dentry); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -Index: linux-2.4.19.SuSE/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/ext3/ialloc.c Sun Nov 16 01:20:17 2003 -+++ linux-2.4.19.SuSE/fs/ext3/ialloc.c Sun Nov 16 01:24:49 2003 -@@ -330,7 +330,8 @@ - * For other inodes, search forward from the parent directory's block - * group to find a free inode. - */ --struct inode * ext3_new_inode (handle_t *handle, struct inode * dir, int mode) -+struct inode * ext3_new_inode(handle_t *handle, const struct inode * dir, -+ int mode, unsigned long goal) - { - struct super_block * sb; - struct buffer_head * bh; -@@ -355,7 +356,41 @@ - init_rwsem(&inode->u.ext3_i.truncate_sem); - - lock_super (sb); -- es = sb->u.ext3_sb.s_es; -+ es = EXT3_SB(sb)->s_es; -+ -+ if (goal) { -+ i = (goal - 1) / EXT3_INODES_PER_GROUP(sb); -+ j = (goal - 1) % EXT3_INODES_PER_GROUP(sb); -+ gdp = ext3_get_group_desc(sb, i, &bh2); -+ -+ bitmap_nr = load_inode_bitmap (sb, i); -+ if (bitmap_nr < 0) { -+ err = bitmap_nr; -+ goto fail; -+ } -+ -+ bh = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]; -+ -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) goto fail; -+ -+ if (ext3_set_bit(j, bh->b_data)) { -+ printk(KERN_ERR "goal inode %lu unavailable\n", goal); -+ /* Oh well, we tried. */ -+ goto repeat; -+ } -+ -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) goto fail; -+ -+ /* We've shortcircuited the allocation system successfully, -+ * now finish filling in the inode. -+ */ -+ goto have_bit_and_group; -+ } -+ - repeat: - gdp = NULL; - i = 0; -@@ -470,6 +505,7 @@ - } - goto repeat; - } -+ have_bit_and_group: - j += i * EXT3_INODES_PER_GROUP(sb) + 1; - if (j < EXT3_FIRST_INO(sb) || j > le32_to_cpu(es->s_inodes_count)) { - ext3_error (sb, "ext3_new_inode", -Index: linux-2.4.19.SuSE/fs/ext3/inode.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/ext3/inode.c Sun Nov 16 01:20:17 2003 -+++ linux-2.4.19.SuSE/fs/ext3/inode.c Sun Nov 16 01:23:20 2003 -@@ -2168,7 +2168,7 @@ - if (IS_ERR(handle)) - goto out_truncate; - -- new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode); -+ new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode, 0); - if (IS_ERR(new_inode)) { - ext3_debug("truncate inode %lu directly (no new inodes)\n", - old_inode->i_ino); -Index: linux-2.4.19.SuSE/fs/ext3/ioctl.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/ext3/ioctl.c Fri Nov 9 14:25:04 2001 -+++ linux-2.4.19.SuSE/fs/ext3/ioctl.c Sun Nov 16 01:23:20 2003 -@@ -23,6 +23,31 @@ - ext3_debug ("cmd = %u, arg = %lu\n", cmd, arg); - - switch (cmd) { -+ case EXT3_IOC_CREATE_INUM: { -+ char name[32]; -+ struct dentry *dchild, *dparent; -+ int rc = 0; -+ -+ dparent = list_entry(inode->i_dentry.next, struct dentry, -+ d_alias); -+ snprintf(name, sizeof name, "%lu", arg); -+ dchild = lookup_one_len(name, dparent, strlen(name)); -+ if (dchild->d_inode) { -+ printk(KERN_ERR "%*s/%lu already exists (ino %lu)\n", -+ dparent->d_name.len, dparent->d_name.name, arg, -+ dchild->d_inode->i_ino); -+ rc = -EEXIST; -+ } else { -+ dchild->d_fsdata = (void *)arg; -+ rc = vfs_create(inode, dchild, 0644); -+ if (rc) -+ printk(KERN_ERR "vfs_create: %d\n", rc); -+ else if (dchild->d_inode->i_ino != arg) -+ rc = -EEXIST; -+ } -+ dput(dchild); -+ return rc; -+ } - case EXT3_IOC_GETFLAGS: - flags = inode->u.ext3_i.i_flags & EXT3_FL_USER_VISIBLE; - return put_user(flags, (int *) arg); -Index: linux-2.4.19.SuSE/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.19.SuSE.orig/include/linux/ext3_fs.h Sun Nov 16 01:20:17 2003 -+++ linux-2.4.19.SuSE/include/linux/ext3_fs.h Sun Nov 16 01:25:42 2003 -@@ -202,6 +202,7 @@ - #define EXT3_IOC_SETFLAGS _IOW('f', 2, long) - #define EXT3_IOC_GETVERSION _IOR('f', 3, long) - #define EXT3_IOC_SETVERSION _IOW('f', 4, long) -+/* EXT3_IOC_CREATE_INUM at bottom of file (visible to kernel and user). */ - #define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) - #define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) - #ifdef CONFIG_JBD_DEBUG -@@ -674,7 +675,8 @@ - dx_hash_info *hinfo); - - /* ialloc.c */ --extern struct inode * ext3_new_inode (handle_t *, struct inode *, int); -+extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int, -+ unsigned long); - extern void ext3_free_inode (handle_t *, struct inode *); - extern struct inode * ext3_orphan_get (struct super_block *, unsigned long); - extern unsigned long ext3_count_free_inodes (struct super_block *); -@@ -765,4 +767,5 @@ - - #endif /* __KERNEL__ */ - -+#define EXT3_IOC_CREATE_INUM _IOW('f', 5, long) - #endif /* _LINUX_EXT3_FS_H */ -Index: linux-2.4.19.SuSE/include/linux/dcache.h -=================================================================== ---- linux-2.4.19.SuSE.orig/include/linux/dcache.h Sat Nov 15 17:35:46 2003 -+++ linux-2.4.19.SuSE/include/linux/dcache.h Sun Nov 16 01:23:20 2003 -@@ -62,6 +62,11 @@ - - #define IS_ROOT(x) ((x) == (x)->d_parent) - -+struct dentry_params { -+ unsigned long p_inum; -+ void *p_ptr; -+}; -+ - /* - * "quick string" -- eases parameter passing, but more importantly - * saves "metadata" about the string (ie length and the hash). diff --git a/lustre/kernel_patches/patches/extN-wantedi-2.4.21-chaos.patch b/lustre/kernel_patches/patches/extN-wantedi-2.4.21-chaos.patch deleted file mode 100644 index 97bba05326..0000000000 --- a/lustre/kernel_patches/patches/extN-wantedi-2.4.21-chaos.patch +++ /dev/null @@ -1,226 +0,0 @@ - fs/ext3/ialloc.c | 40 ++++++++++++++++++++++++++++++++++++++-- - fs/ext3/inode.c | 2 +- - fs/ext3/ioctl.c | 25 +++++++++++++++++++++++++ - fs/ext3/namei.c | 21 +++++++++++++++++---- - include/linux/dcache.h | 5 +++++ - include/linux/ext3_fs.h | 5 ++++- - 6 files changed, 90 insertions(+), 8 deletions(-) - -Index: linux-2.4.21-chaos/fs/ext3/namei.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/namei.c 2003-12-12 16:18:41.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/namei.c 2003-12-12 16:18:53.000000000 +0300 -@@ -1534,6 +1534,19 @@ - return err; - } - -+static struct inode * ext3_new_inode_wantedi(handle_t *handle, struct inode *dir, -+ int mode, struct dentry *dentry) -+{ -+ unsigned long inum = 0; -+ -+ if (dentry->d_fsdata != NULL) { -+ struct dentry_params *param = -+ (struct dentry_params *) dentry->d_fsdata; -+ inum = param->p_inum; -+ } -+ return ext3_new_inode(handle, dir, mode, inum); -+} -+ - /* - * By the time this is called, we already have created - * the directory cache entry for the new file, but it -@@ -1557,7 +1570,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, mode); -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - inode->i_op = &ext3_file_inode_operations; -@@ -1585,7 +1598,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, mode); -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - init_special_inode(inode, inode->i_mode, rdev); -@@ -1618,7 +1631,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR | mode); -+ inode = ext3_new_inode_wantedi (handle, dir, S_IFDIR | mode, dentry); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -2012,7 +2025,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFLNK|S_IRWXUGO); -+ inode = ext3_new_inode_wantedi (handle, dir, S_IFLNK|S_IRWXUGO, dentry); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -Index: linux-2.4.21-chaos/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ialloc.c 2003-12-12 16:18:52.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ialloc.c 2003-12-12 16:18:53.000000000 +0300 -@@ -330,7 +330,8 @@ - * For other inodes, search forward from the parent directory's block - * group to find a free inode. - */ --struct inode * ext3_new_inode (handle_t *handle, struct inode * dir, int mode) -+struct inode * ext3_new_inode(handle_t *handle, const struct inode * dir, -+ int mode, unsigned long goal) - { - struct super_block * sb; - struct buffer_head * bh; -@@ -359,7 +360,41 @@ - init_rwsem(&ei->truncate_sem); - - lock_super (sb); -- es = sbi->s_es; -+ es = EXT3_SB(sb)->s_es; -+ -+ if (goal) { -+ i = (goal - 1) / EXT3_INODES_PER_GROUP(sb); -+ j = (goal - 1) % EXT3_INODES_PER_GROUP(sb); -+ gdp = ext3_get_group_desc(sb, i, &bh2); -+ -+ bitmap_nr = load_inode_bitmap (sb, i); -+ if (bitmap_nr < 0) { -+ err = bitmap_nr; -+ goto fail; -+ } -+ -+ bh = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]; -+ -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) goto fail; -+ -+ if (ext3_set_bit(j, bh->b_data)) { -+ printk(KERN_ERR "goal inode %lu unavailable\n", goal); -+ /* Oh well, we tried. */ -+ goto repeat; -+ } -+ -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) goto fail; -+ -+ /* We've shortcircuited the allocation system successfully, -+ * now finish filling in the inode. -+ */ -+ goto have_bit_and_group; -+ } -+ - repeat: - gdp = NULL; - i = 0; -@@ -474,6 +509,7 @@ - } - goto repeat; - } -+ have_bit_and_group: - j += i * EXT3_INODES_PER_GROUP(sb) + 1; - if (j < EXT3_FIRST_INO(sb) || j > le32_to_cpu(es->s_inodes_count)) { - ext3_error (sb, "ext3_new_inode", -Index: linux-2.4.21-chaos/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/inode.c 2003-12-12 16:18:52.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/inode.c 2003-12-12 16:18:53.000000000 +0300 -@@ -2233,7 +2233,7 @@ - if (IS_ERR(handle)) - goto out_truncate; - -- new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode); -+ new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode, 0); - if (IS_ERR(new_inode)) { - ext3_debug("truncate inode %lu directly (no new inodes)\n", - old_inode->i_ino); -Index: linux-2.4.21-chaos/fs/ext3/ioctl.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ioctl.c 2003-12-12 16:18:40.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ioctl.c 2003-12-12 16:18:53.000000000 +0300 -@@ -24,6 +24,31 @@ - ext3_debug ("cmd = %u, arg = %lu\n", cmd, arg); - - switch (cmd) { -+ case EXT3_IOC_CREATE_INUM: { -+ char name[32]; -+ struct dentry *dchild, *dparent; -+ int rc = 0; -+ -+ dparent = list_entry(inode->i_dentry.next, struct dentry, -+ d_alias); -+ snprintf(name, sizeof name, "%lu", arg); -+ dchild = lookup_one_len(name, dparent, strlen(name)); -+ if (dchild->d_inode) { -+ printk(KERN_ERR "%*s/%lu already exists (ino %lu)\n", -+ dparent->d_name.len, dparent->d_name.name, arg, -+ dchild->d_inode->i_ino); -+ rc = -EEXIST; -+ } else { -+ dchild->d_fsdata = (void *)arg; -+ rc = vfs_create(inode, dchild, 0644); -+ if (rc) -+ printk(KERN_ERR "vfs_create: %d\n", rc); -+ else if (dchild->d_inode->i_ino != arg) -+ rc = -EEXIST; -+ } -+ dput(dchild); -+ return rc; -+ } - case EXT3_IOC_GETFLAGS: - flags = ei->i_flags & EXT3_FL_USER_VISIBLE; - return put_user(flags, (int *) arg); -Index: linux-2.4.21-chaos/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs.h 2003-12-12 16:18:52.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs.h 2003-12-12 16:18:53.000000000 +0300 -@@ -204,6 +204,7 @@ - #define EXT3_IOC_SETFLAGS _IOW('f', 2, long) - #define EXT3_IOC_GETVERSION _IOR('f', 3, long) - #define EXT3_IOC_SETVERSION _IOW('f', 4, long) -+/* EXT3_IOC_CREATE_INUM at bottom of file (visible to kernel and user). */ - #define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) - #define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) - #ifdef CONFIG_JBD_DEBUG -@@ -671,7 +672,8 @@ - dx_hash_info *hinfo); - - /* ialloc.c */ --extern struct inode * ext3_new_inode (handle_t *, struct inode *, int); -+extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int, -+ unsigned long); - extern void ext3_free_inode (handle_t *, struct inode *); - extern struct inode * ext3_orphan_get (struct super_block *, unsigned long); - extern unsigned long ext3_count_free_inodes (struct super_block *); -@@ -763,4 +765,5 @@ - - #endif /* __KERNEL__ */ - -+#define EXT3_IOC_CREATE_INUM _IOW('f', 5, long) - #endif /* _LINUX_EXT3_FS_H */ -Index: linux-2.4.21-chaos/include/linux/dcache.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/dcache.h 2003-12-12 16:18:06.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/dcache.h 2003-12-12 16:18:53.000000000 +0300 -@@ -63,6 +63,11 @@ - - #define IS_ROOT(x) ((x) == (x)->d_parent) - -+struct dentry_params { -+ unsigned long p_inum; -+ void *p_ptr; -+}; -+ - /* - * "quick string" -- eases parameter passing, but more importantly - * saves "metadata" about the string (ie length and the hash). diff --git a/lustre/kernel_patches/patches/extN-wantedi-2.4.21-suse2.patch b/lustre/kernel_patches/patches/extN-wantedi-2.4.21-suse2.patch deleted file mode 100644 index 400f7a856b..0000000000 --- a/lustre/kernel_patches/patches/extN-wantedi-2.4.21-suse2.patch +++ /dev/null @@ -1,226 +0,0 @@ - fs/ext3/ialloc.c | 40 ++++++++++++++++++++++++++++++++++++++-- - fs/ext3/inode.c | 2 +- - fs/ext3/ioctl.c | 25 +++++++++++++++++++++++++ - fs/ext3/namei.c | 21 +++++++++++++++++---- - include/linux/dcache.h | 5 +++++ - include/linux/ext3_fs.h | 5 ++++- - 6 files changed, 90 insertions(+), 8 deletions(-) - -Index: linux-2.4.21-chaos/fs/ext3/namei.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/namei.c 2003-12-12 16:18:41.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/namei.c 2003-12-12 16:18:53.000000000 +0300 -@@ -1534,6 +1534,19 @@ - return err; - } - -+static struct inode * ext3_new_inode_wantedi(handle_t *handle, struct inode *dir, -+ int mode, struct dentry *dentry) -+{ -+ unsigned long inum = 0; -+ -+ if (dentry->d_fsdata != NULL) { -+ struct dentry_params *param = -+ (struct dentry_params *) dentry->d_fsdata; -+ inum = param->p_inum; -+ } -+ return ext3_new_inode(handle, dir, mode, inum); -+} -+ - /* - * By the time this is called, we already have created - * the directory cache entry for the new file, but it -@@ -1557,7 +1570,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, mode); -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - inode->i_op = &ext3_file_inode_operations; -@@ -1585,7 +1598,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, mode); -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - init_special_inode(inode, inode->i_mode, rdev); -@@ -1618,7 +1631,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR | mode); -+ inode = ext3_new_inode_wantedi (handle, dir, S_IFDIR | mode, dentry); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -2012,7 +2025,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFLNK|S_IRWXUGO); -+ inode = ext3_new_inode_wantedi (handle, dir, S_IFLNK|S_IRWXUGO, dentry); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -Index: linux-2.4.21-chaos/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ialloc.c 2003-12-12 16:18:52.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ialloc.c 2003-12-12 16:18:53.000000000 +0300 -@@ -330,7 +330,8 @@ - * For other inodes, search forward from the parent directory's block - * group to find a free inode. - */ --struct inode * ext3_new_inode (handle_t *handle, struct inode * dir, int mode) -+struct inode * ext3_new_inode(handle_t *handle, const struct inode * dir, -+ int mode, unsigned long goal) - { - struct super_block * sb; - struct buffer_head * bh; -@@ -359,7 +360,41 @@ - init_rwsem(&ei->truncate_sem); - - lock_super (sb); -- es = sb->u.ext3_sb.s_es; -+ es = EXT3_SB(sb)->s_es; -+ -+ if (goal) { -+ i = (goal - 1) / EXT3_INODES_PER_GROUP(sb); -+ j = (goal - 1) % EXT3_INODES_PER_GROUP(sb); -+ gdp = ext3_get_group_desc(sb, i, &bh2); -+ -+ bitmap_nr = load_inode_bitmap (sb, i); -+ if (bitmap_nr < 0) { -+ err = bitmap_nr; -+ goto fail; -+ } -+ -+ bh = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]; -+ -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) goto fail; -+ -+ if (ext3_set_bit(j, bh->b_data)) { -+ printk(KERN_ERR "goal inode %lu unavailable\n", goal); -+ /* Oh well, we tried. */ -+ goto repeat; -+ } -+ -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) goto fail; -+ -+ /* We've shortcircuited the allocation system successfully, -+ * now finish filling in the inode. -+ */ -+ goto have_bit_and_group; -+ } -+ - repeat: - gdp = NULL; - i = 0; -@@ -474,6 +509,7 @@ - } - goto repeat; - } -+ have_bit_and_group: - j += i * EXT3_INODES_PER_GROUP(sb) + 1; - if (j < EXT3_FIRST_INO(sb) || j > le32_to_cpu(es->s_inodes_count)) { - ext3_error (sb, "ext3_new_inode", -Index: linux-2.4.21-chaos/fs/ext3/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/inode.c 2003-12-12 16:18:52.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/inode.c 2003-12-12 16:18:53.000000000 +0300 -@@ -2233,7 +2233,7 @@ - if (IS_ERR(handle)) - goto out_truncate; - -- new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode); -+ new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode, 0); - if (IS_ERR(new_inode)) { - ext3_debug("truncate inode %lu directly (no new inodes)\n", - old_inode->i_ino); -Index: linux-2.4.21-chaos/fs/ext3/ioctl.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ioctl.c 2003-12-12 16:18:40.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ioctl.c 2003-12-12 16:18:53.000000000 +0300 -@@ -24,6 +24,31 @@ - ext3_debug ("cmd = %u, arg = %lu\n", cmd, arg); - - switch (cmd) { -+ case EXT3_IOC_CREATE_INUM: { -+ char name[32]; -+ struct dentry *dchild, *dparent; -+ int rc = 0; -+ -+ dparent = list_entry(inode->i_dentry.next, struct dentry, -+ d_alias); -+ snprintf(name, sizeof name, "%lu", arg); -+ dchild = lookup_one_len(name, dparent, strlen(name)); -+ if (dchild->d_inode) { -+ printk(KERN_ERR "%*s/%lu already exists (ino %lu)\n", -+ dparent->d_name.len, dparent->d_name.name, arg, -+ dchild->d_inode->i_ino); -+ rc = -EEXIST; -+ } else { -+ dchild->d_fsdata = (void *)arg; -+ rc = vfs_create(inode, dchild, 0644); -+ if (rc) -+ printk(KERN_ERR "vfs_create: %d\n", rc); -+ else if (dchild->d_inode->i_ino != arg) -+ rc = -EEXIST; -+ } -+ dput(dchild); -+ return rc; -+ } - case EXT3_IOC_GETFLAGS: - flags = ei->i_flags & EXT3_FL_USER_VISIBLE; - return put_user(flags, (int *) arg); -Index: linux-2.4.21-chaos/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_fs.h 2003-12-12 16:18:52.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_fs.h 2003-12-12 16:18:53.000000000 +0300 -@@ -204,6 +204,7 @@ - #define EXT3_IOC_SETFLAGS _IOW('f', 2, long) - #define EXT3_IOC_GETVERSION _IOR('f', 3, long) - #define EXT3_IOC_SETVERSION _IOW('f', 4, long) -+/* EXT3_IOC_CREATE_INUM at bottom of file (visible to kernel and user). */ - #define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) - #define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) - #ifdef CONFIG_JBD_DEBUG -@@ -671,7 +672,8 @@ - dx_hash_info *hinfo); - - /* ialloc.c */ --extern struct inode * ext3_new_inode (handle_t *, struct inode *, int); -+extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int, -+ unsigned long); - extern void ext3_free_inode (handle_t *, struct inode *); - extern struct inode * ext3_orphan_get (struct super_block *, unsigned long); - extern unsigned long ext3_count_free_inodes (struct super_block *); -@@ -763,4 +765,5 @@ - - #endif /* __KERNEL__ */ - -+#define EXT3_IOC_CREATE_INUM _IOW('f', 5, long) - #endif /* _LINUX_EXT3_FS_H */ -Index: linux-2.4.21-chaos/include/linux/dcache.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/dcache.h 2003-12-12 16:18:06.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/dcache.h 2003-12-12 16:18:53.000000000 +0300 -@@ -63,6 +63,11 @@ - - #define IS_ROOT(x) ((x) == (x)->d_parent) - -+struct dentry_params { -+ unsigned long p_inum; -+ void *p_ptr; -+}; -+ - /* - * "quick string" -- eases parameter passing, but more importantly - * saves "metadata" about the string (ie length and the hash). diff --git a/lustre/kernel_patches/patches/extN-wantedi-2.4.22-rh.patch b/lustre/kernel_patches/patches/extN-wantedi-2.4.22-rh.patch deleted file mode 100644 index 5ec4dab994..0000000000 --- a/lustre/kernel_patches/patches/extN-wantedi-2.4.22-rh.patch +++ /dev/null @@ -1,217 +0,0 @@ - fs/ext3/ialloc.c | 41 +++++++++++++++++++++++++++++++++++++++-- - fs/ext3/inode.c | 2 +- - fs/ext3/ioctl.c | 25 +++++++++++++++++++++++++ - fs/ext3/namei.c | 21 +++++++++++++++++---- - include/linux/dcache.h | 5 +++++ - include/linux/ext3_fs.h | 5 ++++- - 6 files changed, 91 insertions(+), 8 deletions(-) - ---- linux-2.4.22-ac1/fs/ext3/ialloc.c~extN-wantedi-2.4.22-rh 2003-09-26 00:57:29.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/ext3/ialloc.c 2003-09-26 01:00:17.000000000 +0400 -@@ -524,7 +524,8 @@ static int find_group_other(struct super - * group to find a free inode. - */ - struct inode * ext3_new_inode (handle_t *handle, -- const struct inode * dir, int mode) -+ const struct inode * dir, int mode, -+ unsigned long goal) - { - struct super_block * sb; - struct buffer_head * bh; -@@ -549,7 +550,41 @@ struct inode * ext3_new_inode (handle_t - init_rwsem(&inode->u.ext3_i.truncate_sem); - - lock_super (sb); -- es = sb->u.ext3_sb.s_es; -+ es = EXT3_SB(sb)->s_es; -+ -+ if (goal) { -+ group = (goal - 1) / EXT3_INODES_PER_GROUP(sb); -+ ino = (goal - 1) % EXT3_INODES_PER_GROUP(sb); -+ gdp = ext3_get_group_desc(sb, group, &bh2); -+ -+ bitmap_nr = load_inode_bitmap (sb, group); -+ if (bitmap_nr < 0) { -+ err = bitmap_nr; -+ goto fail; -+ } -+ -+ bh = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]; -+ -+ BUFFER_TRACE(bh, "get_write_access"); -+ err = ext3_journal_get_write_access(handle, bh); -+ if (err) goto fail; -+ -+ if (ext3_set_bit(ino, bh->b_data)) { -+ printk(KERN_ERR "goal inode %lu unavailable\n", goal); -+ /* Oh well, we tried. */ -+ goto repeat; -+ } -+ -+ BUFFER_TRACE(bh, "call ext3_journal_dirty_metadata"); -+ err = ext3_journal_dirty_metadata(handle, bh); -+ if (err) goto fail; -+ -+ /* We've shortcircuited the allocation system successfully, -+ * now finish filling in the inode. -+ */ -+ goto have_bit_and_group; -+ } -+ - repeat: - if (S_ISDIR(mode)) { - if (test_opt (sb, OLDALLOC)) -@@ -606,6 +641,8 @@ repeat: - } - goto repeat; - } -+ -+have_bit_and_group: - ino += group * EXT3_INODES_PER_GROUP(sb) + 1; - if (ino < EXT3_FIRST_INO(sb) || ino > le32_to_cpu(es->s_inodes_count)) { - ext3_error (sb, "ext3_new_inode", ---- linux-2.4.22-ac1/fs/ext3/inode.c~extN-wantedi-2.4.22-rh 2003-09-26 00:57:29.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/ext3/inode.c 2003-09-26 00:57:29.000000000 +0400 -@@ -2614,7 +2614,7 @@ void ext3_truncate_thread(struct inode * - if (IS_ERR(handle)) - goto out_truncate; - -- new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode); -+ new_inode = ext3_new_inode(handle, old_inode, old_inode->i_mode, 0); - if (IS_ERR(new_inode)) { - ext3_debug("truncate inode %lu directly (no new inodes)\n", - old_inode->i_ino); ---- linux-2.4.22-ac1/fs/ext3/ioctl.c~extN-wantedi-2.4.22-rh 2003-09-25 14:16:23.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/ext3/ioctl.c 2003-09-26 00:57:29.000000000 +0400 -@@ -23,6 +23,31 @@ int ext3_ioctl (struct inode * inode, st - ext3_debug ("cmd = %u, arg = %lu\n", cmd, arg); - - switch (cmd) { -+ case EXT3_IOC_CREATE_INUM: { -+ char name[32]; -+ struct dentry *dchild, *dparent; -+ int rc = 0; -+ -+ dparent = list_entry(inode->i_dentry.next, struct dentry, -+ d_alias); -+ snprintf(name, sizeof name, "%lu", arg); -+ dchild = lookup_one_len(name, dparent, strlen(name)); -+ if (dchild->d_inode) { -+ printk(KERN_ERR "%*s/%lu already exists (ino %lu)\n", -+ dparent->d_name.len, dparent->d_name.name, arg, -+ dchild->d_inode->i_ino); -+ rc = -EEXIST; -+ } else { -+ dchild->d_fsdata = (void *)arg; -+ rc = vfs_create(inode, dchild, 0644); -+ if (rc) -+ printk(KERN_ERR "vfs_create: %d\n", rc); -+ else if (dchild->d_inode->i_ino != arg) -+ rc = -EEXIST; -+ } -+ dput(dchild); -+ return rc; -+ } - case EXT3_IOC_GETFLAGS: - flags = inode->u.ext3_i.i_flags & EXT3_FL_USER_VISIBLE; - return put_user(flags, (int *) arg); ---- linux-2.4.22-ac1/fs/ext3/namei.c~extN-wantedi-2.4.22-rh 2003-09-26 00:57:28.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/ext3/namei.c 2003-09-26 00:57:29.000000000 +0400 -@@ -1534,6 +1534,19 @@ static int ext3_add_nondir(handle_t *han - return err; - } - -+static struct inode * ext3_new_inode_wantedi(handle_t *handle, struct inode *dir, -+ int mode, struct dentry *dentry) -+{ -+ unsigned long inum = 0; -+ -+ if (dentry->d_fsdata != NULL) { -+ struct dentry_params *param = -+ (struct dentry_params *) dentry->d_fsdata; -+ inum = param->p_inum; -+ } -+ return ext3_new_inode(handle, dir, mode, inum); -+} -+ - /* - * By the time this is called, we already have created - * the directory cache entry for the new file, but it -@@ -1557,7 +1570,7 @@ static int ext3_create (struct inode * d - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, mode); -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - inode->i_op = &ext3_file_inode_operations; -@@ -1585,7 +1598,7 @@ static int ext3_mknod (struct inode * di - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, mode); -+ inode = ext3_new_inode_wantedi (handle, dir, mode, dentry); - err = PTR_ERR(inode); - if (!IS_ERR(inode)) { - init_special_inode(inode, mode, rdev); -@@ -1615,7 +1628,7 @@ static int ext3_mkdir(struct inode * dir - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR | mode); -+ inode = ext3_new_inode_wantedi (handle, dir, S_IFDIR | mode, dentry); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -2010,7 +2023,7 @@ static int ext3_symlink (struct inode * - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFLNK|S_IRWXUGO); -+ inode = ext3_new_inode_wantedi (handle, dir, S_IFLNK|S_IRWXUGO, dentry); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; ---- linux-2.4.22-ac1/include/linux/dcache.h~extN-wantedi-2.4.22-rh 2003-09-26 00:57:27.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/include/linux/dcache.h 2003-09-26 00:57:29.000000000 +0400 -@@ -63,6 +63,11 @@ static inline void intent_init(struct lo - - #define IS_ROOT(x) ((x) == (x)->d_parent) - -+struct dentry_params { -+ unsigned long p_inum; -+ void *p_ptr; -+}; -+ - /* - * "quick string" -- eases parameter passing, but more importantly - * saves "metadata" about the string (ie length and the hash). ---- linux-2.4.22-ac1/include/linux/ext3_fs.h~extN-wantedi-2.4.22-rh 2003-09-26 00:57:29.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/include/linux/ext3_fs.h 2003-09-26 00:57:29.000000000 +0400 -@@ -203,6 +203,7 @@ struct ext3_group_desc - #define EXT3_IOC_SETFLAGS _IOW('f', 2, long) - #define EXT3_IOC_GETVERSION _IOR('f', 3, long) - #define EXT3_IOC_SETVERSION _IOW('f', 4, long) -+/* EXT3_IOC_CREATE_INUM at bottom of file (visible to kernel and user). */ - #define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) - #define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) - #ifdef CONFIG_JBD_DEBUG -@@ -676,7 +677,8 @@ extern int ext3fs_dirhash(const char *na - dx_hash_info *hinfo); - - /* ialloc.c */ --extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int); -+extern struct inode * ext3_new_inode (handle_t *, const struct inode *, int, -+ unsigned long); - extern void ext3_free_inode (handle_t *, struct inode *); - extern struct inode * ext3_orphan_get (struct super_block *, unsigned long); - extern unsigned long ext3_count_free_inodes (struct super_block *); -@@ -769,4 +771,5 @@ extern struct inode_operations ext3_fast - - #endif /* __KERNEL__ */ - -+#define EXT3_IOC_CREATE_INUM _IOW('f', 5, long) - #endif /* _LINUX_EXT3_FS_H */ - -_ diff --git a/lustre/kernel_patches/patches/extN-wantedi.patch b/lustre/kernel_patches/patches/extN-wantedi-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/extN-wantedi.patch rename to lustre/kernel_patches/patches/extN-wantedi-2.4.24.patch diff --git a/lustre/kernel_patches/patches/gfp_memalloc-2.4.20-rh.patch b/lustre/kernel_patches/patches/gfp_memalloc-2.4.20-rh.patch deleted file mode 100644 index 79caa76592..0000000000 --- a/lustre/kernel_patches/patches/gfp_memalloc-2.4.20-rh.patch +++ /dev/null @@ -1,70 +0,0 @@ -Index: linux-2.4.20-rh-20.9/include/linux/mm.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/linux/mm.h 2003-11-13 17:35:48.000000000 +0300 -+++ linux-2.4.20-rh-20.9/include/linux/mm.h 2003-11-17 15:50:22.000000000 +0300 -@@ -713,6 +713,7 @@ - #define __GFP_IO 0x40 /* Can start low memory physical IO? */ - #define __GFP_HIGHIO 0x80 /* Can start high mem physical IO? */ - #define __GFP_FS 0x100 /* Can call down to low-level FS? */ -+#define __GFP_MEMALLOC 0x200 /* like PF_MEMALLOC: see __alloc_pages */ - - #define GFP_NOHIGHIO (__GFP_HIGH | __GFP_WAIT | __GFP_IO) - #define GFP_NOIO (__GFP_HIGH | __GFP_WAIT) -@@ -723,6 +724,7 @@ - #define GFP_KERNEL (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) - #define GFP_NFS (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) - #define GFP_KSWAPD ( __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) -+#define GFP_MEMALLOC __GFP_MEMALLOC - - /* Flag - indicates that the buffer will be suitable for DMA. Ignored on some - platforms, used as appropriate on others */ -Index: linux-2.4.20-rh-20.9/mm/page_alloc.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/mm/page_alloc.c 2003-11-13 17:20:37.000000000 +0300 -+++ linux-2.4.20-rh-20.9/mm/page_alloc.c 2003-11-17 15:51:05.000000000 +0300 -@@ -509,7 +509,8 @@ - /* - * Oh well, we didn't succeed. - */ -- if (!(current->flags & (PF_MEMALLOC|PF_MEMDIE))) { -+ if (!(current->flags & (PF_MEMALLOC|PF_MEMDIE)) && -+ !(gfp_mask & __GFP_MEMALLOC)) { - /* - * Are we dealing with a higher order allocation? - * -@@ -583,7 +583,9 @@ - - /* XXX: is pages_min/4 a good amount to reserve for this? */ - min += z->pages_min / 4; -- if (z->free_pages > min || ((current->flags & PF_MEMALLOC) && !in_interrupt())) { -+ if (z->free_pages > min || -+ (((current->flags & PF_MEMALLOC) || (gfp_mask & __GFP_MEMALLOC)) -+ && !in_interrupt())) { - page = rmqueue(z, order); - if (page) - return page; -Index: linux-2.4.20-rh-20.9/include/linux/slab.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/linux/slab.h 2003-11-13 17:35:48.000000000 +0300 -+++ linux-2.4.20-rh-20.9/include/linux/slab.h 2003-11-17 15:50:22.000000000 +0300 -@@ -23,6 +23,7 @@ - #define SLAB_KERNEL GFP_KERNEL - #define SLAB_NFS GFP_NFS - #define SLAB_DMA GFP_DMA -+#define SLAB_MEMALLOC GFP_MEMALLOC - - #define SLAB_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_HIGHIO|__GFP_FS) - #define SLAB_NO_GROW 0x00001000UL /* don't grow a cache */ -Index: linux-2.4.20-rh-20.9/mm/slab.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/mm/slab.c 2003-09-13 19:34:24.000000000 +0400 -+++ linux-2.4.20-rh-20.9/mm/slab.c 2003-11-17 15:50:22.000000000 +0300 -@@ -1116,7 +1116,7 @@ - /* Be lazy and only check for valid flags here, - * keeping it out of the critical path in kmem_cache_alloc(). - */ -- if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW)) -+ if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW|SLAB_MEMALLOC)) - BUG(); - if (flags & SLAB_NO_GROW) - return 0; diff --git a/lustre/kernel_patches/patches/gfp_memalloc-2.4.21-chaos.patch b/lustre/kernel_patches/patches/gfp_memalloc-2.4.21-chaos.patch deleted file mode 100644 index 46b7b0ef59..0000000000 --- a/lustre/kernel_patches/patches/gfp_memalloc-2.4.21-chaos.patch +++ /dev/null @@ -1,70 +0,0 @@ -Index: linux-2.4.21-chaos/include/linux/mm.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/mm.h 2003-12-12 13:36:59.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/mm.h 2003-12-12 16:15:57.000000000 +0300 -@@ -843,6 +843,7 @@ - #define __GFP_HIGHIO 0x80 /* Can start high mem physical IO? */ - #define __GFP_FS 0x100 /* Can call down to low-level FS? */ - #define __GFP_WIRED 0x200 /* Highmem bias and wired */ -+#define __GFP_MEMALLOC 0x400 /* like PF_MEMALLOC: see __alloc_pages */ - - #define GFP_NOHIGHIO (__GFP_HIGH | __GFP_WAIT | __GFP_IO) - #define GFP_NOIO (__GFP_HIGH | __GFP_WAIT) -@@ -853,6 +854,7 @@ - #define GFP_KERNEL (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) - #define GFP_NFS (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) - #define GFP_KSWAPD ( __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) -+#define GFP_MEMALLOC __GFP_MEMALLOC - - /* Flag - indicates that the buffer will be suitable for DMA. Ignored on some - platforms, used as appropriate on others */ -Index: linux-2.4.21-chaos/include/linux/slab.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/slab.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/slab.h 2003-12-12 16:15:57.000000000 +0300 -@@ -23,6 +23,7 @@ - #define SLAB_KERNEL GFP_KERNEL - #define SLAB_NFS GFP_NFS - #define SLAB_DMA GFP_DMA -+#define SLAB_MEMALLOC GFP_MEMALLOC - - #define SLAB_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_HIGHIO|__GFP_FS) - #define SLAB_NO_GROW 0x00001000UL /* don't grow a cache */ -Index: linux-2.4.21-chaos/mm/page_alloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/mm/page_alloc.c 2003-12-12 11:31:08.000000000 +0300 -+++ linux-2.4.21-chaos/mm/page_alloc.c 2003-12-12 16:15:57.000000000 +0300 -@@ -595,7 +595,8 @@ - /* - * Oh well, we didn't succeed. - */ -- if (!(current->flags & (PF_MEMALLOC|PF_MEMDIE))) { -+ if (!(current->flags & (PF_MEMALLOC|PF_MEMDIE)) && -+ !(gfp_mask & __GFP_MEMALLOC)) { - /* - * Are we dealing with a higher order allocation? - * -@@ -670,7 +671,9 @@ - - /* XXX: is pages_min/4 a good amount to reserve for this? */ - min += z->pages_min / 4; -- if (z->free_pages > min || ((current->flags & PF_MEMALLOC) && !in_interrupt())) { -+ if (z->free_pages > min || -+ (((current->flags & PF_MEMALLOC) || (gfp_mask & __GFP_MEMALLOC)) -+ && !in_interrupt())) { - page = rmqueue(z, order); - if (page) - return page; -Index: linux-2.4.21-chaos/mm/slab.c -=================================================================== ---- linux-2.4.21-chaos.orig/mm/slab.c 2003-12-05 07:55:51.000000000 +0300 -+++ linux-2.4.21-chaos/mm/slab.c 2003-12-12 16:15:57.000000000 +0300 -@@ -1125,7 +1125,7 @@ - /* Be lazy and only check for valid flags here, - * keeping it out of the critical path in kmem_cache_alloc(). - */ -- if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW)) -+ if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW|SLAB_MEMALLOC)) - BUG(); - if (flags & SLAB_NO_GROW) - return 0; diff --git a/lustre/kernel_patches/patches/gfp_memalloc-2.4.22.patch b/lustre/kernel_patches/patches/gfp_memalloc-2.4.22.patch deleted file mode 100644 index 92e79c8c56..0000000000 --- a/lustre/kernel_patches/patches/gfp_memalloc-2.4.22.patch +++ /dev/null @@ -1,59 +0,0 @@ -Index: linux-2.4.20/include/linux/mm.h -=================================================================== ---- linux-2.4.20.orig/include/linux/mm.h 2003-12-01 17:07:14.000000000 +0300 -+++ linux-2.4.20/include/linux/mm.h 2003-12-02 23:17:06.000000000 +0300 -@@ -614,6 +614,7 @@ - #define __GFP_IO 0x40 /* Can start low memory physical IO? */ - #define __GFP_HIGHIO 0x80 /* Can start high mem physical IO? */ - #define __GFP_FS 0x100 /* Can call down to low-level FS? */ -+#define __GFP_MEMALLOC 0x200 /* like PF_MEMALLOC: see __alloc_pages */ - - #define GFP_NOHIGHIO (__GFP_HIGH | __GFP_WAIT | __GFP_IO) - #define GFP_NOIO (__GFP_HIGH | __GFP_WAIT) -@@ -624,6 +625,7 @@ - #define GFP_KERNEL (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) - #define GFP_NFS (__GFP_HIGH | __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) - #define GFP_KSWAPD ( __GFP_WAIT | __GFP_IO | __GFP_HIGHIO | __GFP_FS) -+#define GFP_MEMALLOC __GFP_MEMALLOC - - /* Flag - indicates that the buffer will be suitable for DMA. Ignored on some - platforms, used as appropriate on others */ -Index: linux-2.4.20/mm/page_alloc.c -=================================================================== ---- linux-2.4.20.orig/mm/page_alloc.c 2003-12-01 17:02:43.000000000 +0300 -+++ linux-2.4.20/mm/page_alloc.c 2003-12-02 23:21:56.000000000 +0300 -@@ -377,7 +377,8 @@ - /* here we're in the low on memory slow path */ - - rebalance: -- if (current->flags & (PF_MEMALLOC | PF_MEMDIE)) { -+ if (current->flags & (PF_MEMALLOC | PF_MEMDIE) || -+ (gfp_mask & __GFP_MEMALLOC)) { - zone = zonelist->zones; - for (;;) { - zone_t *z = *(zone++); -Index: linux-2.4.20/include/linux/slab.h -=================================================================== ---- linux-2.4.20.orig/include/linux/slab.h 2003-12-01 17:07:14.000000000 +0300 -+++ linux-2.4.20/include/linux/slab.h 2003-12-02 23:17:06.000000000 +0300 -@@ -23,6 +23,7 @@ - #define SLAB_KERNEL GFP_KERNEL - #define SLAB_NFS GFP_NFS - #define SLAB_DMA GFP_DMA -+#define SLAB_MEMALLOC GFP_MEMALLOC - - #define SLAB_LEVEL_MASK (__GFP_WAIT|__GFP_HIGH|__GFP_IO|__GFP_HIGHIO|__GFP_FS) - #define SLAB_NO_GROW 0x00001000UL /* don't grow a cache */ -Index: linux-2.4.20/mm/slab.c -=================================================================== ---- linux-2.4.20.orig/mm/slab.c 2003-12-01 17:02:34.000000000 +0300 -+++ linux-2.4.20/mm/slab.c 2003-12-02 23:17:06.000000000 +0300 -@@ -1113,7 +1113,7 @@ - /* Be lazy and only check for valid flags here, - * keeping it out of the critical path in kmem_cache_alloc(). - */ -- if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW)) -+ if (flags & ~(SLAB_DMA|SLAB_LEVEL_MASK|SLAB_NO_GROW|SLAB_MEMALLOC)) - BUG(); - if (flags & SLAB_NO_GROW) - return 0; 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 deleted file mode 100644 index 95213baade..0000000000 --- a/lustre/kernel_patches/patches/gpl_header-chaos-2.4.20.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- 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/invalidate_show-2.4.19-pre1.patch b/lustre/kernel_patches/patches/invalidate_show-2.4.19-pre1.patch deleted file mode 100644 index 376558b569..0000000000 --- a/lustre/kernel_patches/patches/invalidate_show-2.4.19-pre1.patch +++ /dev/null @@ -1,121 +0,0 @@ - - - - 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(-) - -Index: linux-2.4.19-pre1/fs/inode.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/inode.c 2003-11-21 02:39:48.000000000 +0300 -+++ linux-2.4.19-pre1/fs/inode.c 2003-11-21 02:39:54.000000000 +0300 -@@ -553,7 +553,8 @@ - /* - * 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; -@@ -578,6 +579,11 @@ - 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 */ -@@ -596,22 +602,23 @@ - /** - * 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); -@@ -637,7 +644,7 @@ - * hold). - */ - shrink_dcache_sb(sb); -- res = invalidate_inodes(sb); -+ res = invalidate_inodes(sb, 0); - drop_super(sb); - } - invalidate_buffers(dev); -Index: linux-2.4.19-pre1/fs/super.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/super.c 2003-11-21 02:39:48.000000000 +0300 -+++ linux-2.4.19-pre1/fs/super.c 2003-11-21 02:40:09.000000000 +0300 -@@ -790,7 +790,7 @@ - fsync_super(sb); - lock_super(sb); - 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); -@@ -799,7 +799,7 @@ - } - - /* Forget any remaining inodes */ -- if (invalidate_inodes(sb)) { -+ if (invalidate_inodes(sb, 1)) { - printk("VFS: Busy inodes after unmount. " - "Self-destruct in 5 seconds. Have a nice day...\n"); - } -Index: linux-2.4.19-pre1/include/linux/fs.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/fs.h 2003-11-21 02:39:53.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/fs.h 2003-11-21 02:39:54.000000000 +0300 -@@ -1214,7 +1214,7 @@ - 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 *); -Index: linux-2.4.19-pre1/fs/smbfs/inode.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/smbfs/inode.c 2003-11-21 02:39:48.000000000 +0300 -+++ linux-2.4.19-pre1/fs/smbfs/inode.c 2003-11-21 02:39:54.000000000 +0300 -@@ -166,7 +166,7 @@ - { - 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/invalidate_show-2.4.20-hp.patch b/lustre/kernel_patches/patches/invalidate_show-2.4.20-hp.patch deleted file mode 100644 index fad6233259..0000000000 --- a/lustre/kernel_patches/patches/invalidate_show-2.4.20-hp.patch +++ /dev/null @@ -1,123 +0,0 @@ - - - - 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(-) - -Index: linux/fs/inode.c -=================================================================== ---- linux.orig/fs/inode.c Mon Feb 2 21:24:21 2004 -+++ linux/fs/inode.c Mon Feb 2 21:27:53 2004 -@@ -632,7 +632,8 @@ - /* - * 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; -@@ -657,6 +658,11 @@ - 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 */ -@@ -675,23 +681,24 @@ - /** - * 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(&inode_unused_pagecache, 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(&inode_unused_pagecache, 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); -@@ -717,7 +724,7 @@ - * hold). - */ - shrink_dcache_sb(sb); -- res = invalidate_inodes(sb); -+ res = invalidate_inodes(sb, 0); - drop_super(sb); - } - invalidate_buffers(dev); -Index: linux/fs/super.c -=================================================================== ---- linux.orig/fs/super.c Mon Feb 2 21:24:21 2004 -+++ linux/fs/super.c Mon Feb 2 21:26:08 2004 -@@ -844,7 +844,7 @@ - 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); -@@ -853,7 +853,7 @@ - } - - /* 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"); - } -Index: linux/include/linux/fs.h -=================================================================== ---- linux.orig/include/linux/fs.h Mon Feb 2 21:24:23 2004 -+++ linux/include/linux/fs.h Mon Feb 2 21:26:08 2004 -@@ -1257,7 +1257,7 @@ - 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 *); -Index: linux/fs/smbfs/inode.c -=================================================================== ---- linux.orig/fs/smbfs/inode.c Thu Nov 28 18:53:15 2002 -+++ linux/fs/smbfs/inode.c Mon Feb 2 21:26:08 2004 -@@ -167,7 +167,7 @@ - { - 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/invalidate_show-2.4.20-rh.patch b/lustre/kernel_patches/patches/invalidate_show-2.4.20-rh.patch deleted file mode 100644 index 6e7d92036a..0000000000 --- a/lustre/kernel_patches/patches/invalidate_show-2.4.20-rh.patch +++ /dev/null @@ -1,114 +0,0 @@ - fs/inode.c | 23 +++++++++++++++-------- - fs/smbfs/inode.c | 2 +- - fs/super.c | 4 ++-- - include/linux/fs.h | 2 +- - 4 files changed, 19 insertions(+), 12 deletions(-) - ---- kernel-2.4.20/fs/inode.c~invalidate_show-2.4.20-rh 2003-05-24 01:56:40.000000000 -0400 -+++ kernel-2.4.20-root/fs/inode.c 2003-06-02 00:35:37.000000000 -0400 -@@ -628,7 +628,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; -@@ -653,6 +654,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 */ -@@ -671,23 +677,24 @@ 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(&inode_unused_pagecache, 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(&inode_unused_pagecache, 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); -@@ -713,7 +720,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/fs/super.c~invalidate_show-2.4.20-rh 2003-05-24 01:56:24.000000000 -0400 -+++ kernel-2.4.20-root/fs/super.c 2003-06-02 00:35:00.000000000 -0400 -@@ -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/include/linux/fs.h~invalidate_show-2.4.20-rh 2003-06-02 00:31:47.000000000 -0400 -+++ kernel-2.4.20-root/include/linux/fs.h 2003-06-02 00:35:00.000000000 -0400 -@@ -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/fs/smbfs/inode.c~invalidate_show-2.4.20-rh 2002-11-28 18:53:15.000000000 -0500 -+++ kernel-2.4.20-root/fs/smbfs/inode.c 2003-06-02 00:35:00.000000000 -0400 -@@ -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/invalidate_show-2.4.21-sles8sp3.patch b/lustre/kernel_patches/patches/invalidate_show-2.4.21-sles8sp3.patch deleted file mode 100644 index 36e59d3b48..0000000000 --- a/lustre/kernel_patches/patches/invalidate_show-2.4.21-sles8sp3.patch +++ /dev/null @@ -1,134 +0,0 @@ - - - - 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(-) - -Index: linux-2.4.21/fs/inode.c -=================================================================== ---- linux-2.4.21.orig/fs/inode.c 2004-04-24 02:38:51.000000000 -0400 -+++ linux-2.4.21/fs/inode.c 2004-04-26 19:41:58.000000000 -0400 -@@ -651,7 +651,8 @@ - /* - * 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; -@@ -676,6 +677,11 @@ - 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 */ -@@ -694,22 +700,23 @@ - /** - * 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); -@@ -735,7 +742,7 @@ - * hold). - */ - shrink_dcache_sb(sb); -- res = invalidate_inodes(sb); -+ res = invalidate_inodes(sb, 0); - drop_super(sb); - } - invalidate_buffers(dev); -Index: linux-2.4.21/fs/super.c -=================================================================== ---- linux-2.4.21.orig/fs/super.c 2004-04-24 02:38:51.000000000 -0400 -+++ linux-2.4.21/fs/super.c 2004-04-26 19:41:58.000000000 -0400 -@@ -932,7 +932,7 @@ - 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); -@@ -941,7 +941,7 @@ - } - - /* 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"); - } -Index: linux-2.4.21/fs/smbfs/inode.c -=================================================================== ---- linux-2.4.21.orig/fs/smbfs/inode.c 2004-04-24 02:38:44.000000000 -0400 -+++ linux-2.4.21/fs/smbfs/inode.c 2004-04-26 19:41:58.000000000 -0400 -@@ -167,7 +167,7 @@ - { - VERBOSE("\n"); - shrink_dcache_sb(SB_of(server)); -- invalidate_inodes(SB_of(server)); -+ invalidate_inodes(SB_of(server), 0); - } - - /* -Index: linux-2.4.21/fs/ntfs/super.c -=================================================================== ---- linux-2.4.21.orig/fs/ntfs/super.c 2004-04-24 02:38:38.000000000 -0400 -+++ linux-2.4.21/fs/ntfs/super.c 2004-04-26 19:42:12.000000000 -0400 -@@ -1604,7 +1604,7 @@ - * method again... FIXME: Do we need to do this twice now because of - * attribute inodes? I think not, so leave as is for now... (AIA) - */ -- if (invalidate_inodes(sb)) { -+ if (invalidate_inodes(sb, 0)) { - ntfs_error(sb, "Busy inodes left. This is most likely a NTFS " - "driver bug."); - /* Copied from fs/super.c. I just love this message. (-; */ -Index: linux-2.4.21/include/linux/fs.h -=================================================================== ---- linux-2.4.21.orig/include/linux/fs.h 2004-04-26 19:06:32.000000000 -0400 -+++ linux-2.4.21/include/linux/fs.h 2004-04-26 19:41:58.000000000 -0400 -@@ -1401,7 +1401,7 @@ - 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 *); diff --git a/lustre/kernel_patches/patches/invalidate_show.patch b/lustre/kernel_patches/patches/invalidate_show-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/invalidate_show.patch rename to lustre/kernel_patches/patches/invalidate_show-2.4.24.patch 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 deleted file mode 100644 index 7c98c45625..0000000000 --- a/lustre/kernel_patches/patches/invalidate_show_2.4.20_chaos.patch +++ /dev/null @@ -1,112 +0,0 @@ - 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/iod-rmap-exports-2.4.20.patch b/lustre/kernel_patches/patches/iod-rmap-exports-2.4.20.patch deleted file mode 100644 index 3fdf3fd900..0000000000 --- a/lustre/kernel_patches/patches/iod-rmap-exports-2.4.20.patch +++ /dev/null @@ -1,86 +0,0 @@ - fs/Makefile | 4 +++- - fs/inode.c | 4 +++- - mm/Makefile | 2 +- - mm/page_alloc.c | 1 + - mm/vmscan.c | 3 +++ - 5 files changed, 11 insertions(+), 3 deletions(-) - ---- linux-rh-2.4.20-6/fs/inode.c~iod-rmap-exports Tue Apr 1 01:01:56 2003 -+++ linux-rh-2.4.20-6-braam/fs/inode.c Tue Apr 1 01:01:56 2003 -@@ -5,6 +5,7 @@ - */ - - #include <linux/config.h> -+#include <linux/module.h> - #include <linux/fs.h> - #include <linux/string.h> - #include <linux/mm.h> -@@ -66,7 +67,8 @@ static LIST_HEAD(anon_hash_chain); /* fo - * NOTE! You also have to own the lock if you change - * the i_state of an inode while it is in use.. - */ --static spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+EXPORT_SYMBOL(inode_lock); - - /* - * Statistics gathering.. ---- linux-rh-2.4.20-6/fs/Makefile~iod-rmap-exports Tue Apr 1 01:01:56 2003 -+++ linux-rh-2.4.20-6-braam/fs/Makefile Tue Apr 1 01:02:34 2003 -@@ -1,3 +1,5 @@ -+ -+ - # - # Makefile for the Linux filesystems. - # -@@ -7,7 +9,7 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o - mod-subdirs := nls - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ ---- linux-rh-2.4.20-6/mm/vmscan.c~iod-rmap-exports Tue Apr 1 01:01:56 2003 -+++ linux-rh-2.4.20-6-braam/mm/vmscan.c Tue Apr 1 01:01:56 2003 -@@ -15,6 +15,8 @@ - * O(1) rmap vm, Arjan van de ven <arjanv@redhat.com> - */ - -+#include <linux/config.h> -+#include <linux/module.h> - #include <linux/slab.h> - #include <linux/kernel_stat.h> - #include <linux/swap.h> -@@ -1061,6 +1063,7 @@ void wakeup_kswapd(unsigned int gfp_mask - set_current_state(TASK_RUNNING); - remove_wait_queue(&kswapd_done, &wait); - } -+EXPORT_SYMBOL(wakeup_kswapd); - - static void wakeup_memwaiters(void) - { ---- linux-rh-2.4.20-6/mm/Makefile~iod-rmap-exports Tue Apr 1 01:01:56 2003 -+++ linux-rh-2.4.20-6-braam/mm/Makefile Tue Apr 1 01:01:56 2003 -@@ -9,7 +9,7 @@ - - O_TARGET := mm.o - --export-objs := shmem.o filemap.o memory.o page_alloc.o mempool.o -+export-objs := shmem.o filemap.o memory.o page_alloc.o mempool.o vmscan.o - - obj-y := memory.o mmap.o filemap.o mprotect.o mlock.o mremap.o \ - vmalloc.o slab.o bootmem.o swap.o vmscan.o page_io.o \ ---- linux-rh-2.4.20-6/mm/page_alloc.c~iod-rmap-exports Tue Apr 1 01:01:56 2003 -+++ linux-rh-2.4.20-6-braam/mm/page_alloc.c Tue Apr 1 01:01:56 2003 -@@ -27,6 +27,7 @@ - - int nr_swap_pages; - pg_data_t *pgdat_list; -+EXPORT_SYMBOL(pgdat_list); - - /* - * - -_ diff --git a/lustre/kernel_patches/patches/iod-rmap-exports-2.4.21-chaos.patch b/lustre/kernel_patches/patches/iod-rmap-exports-2.4.21-chaos.patch deleted file mode 100644 index 63a62744c2..0000000000 --- a/lustre/kernel_patches/patches/iod-rmap-exports-2.4.21-chaos.patch +++ /dev/null @@ -1,94 +0,0 @@ - fs/Makefile | 4 +++- - fs/inode.c | 4 +++- - mm/Makefile | 2 +- - mm/page_alloc.c | 1 + - mm/vmscan.c | 3 +++ - 5 files changed, 11 insertions(+), 3 deletions(-) - -Index: linux-2.4.21-chaos/fs/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/inode.c 2003-12-12 16:18:06.000000000 +0300 -+++ linux-2.4.21-chaos/fs/inode.c 2003-12-12 16:18:08.000000000 +0300 -@@ -5,6 +5,7 @@ - */ - - #include <linux/config.h> -+#include <linux/module.h> - #include <linux/fs.h> - #include <linux/string.h> - #include <linux/mm.h> -@@ -69,7 +70,8 @@ - * NOTE! You also have to own the lock if you change - * the i_state of an inode while it is in use.. - */ --static spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+EXPORT_SYMBOL(inode_lock); - - /* - * Statistics gathering.. -Index: linux-2.4.21-chaos/fs/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/fs/Makefile 2003-07-15 04:41:00.000000000 +0400 -+++ linux-2.4.21-chaos/fs/Makefile 2003-12-12 16:18:08.000000000 +0300 -@@ -1,3 +1,5 @@ -+ -+ - # - # Makefile for the Linux filesystems. - # -@@ -7,7 +9,7 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o - mod-subdirs := nls - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ -Index: linux-2.4.21-chaos/mm/vmscan.c -=================================================================== ---- linux-2.4.21-chaos.orig/mm/vmscan.c 2003-12-05 07:55:51.000000000 +0300 -+++ linux-2.4.21-chaos/mm/vmscan.c 2003-12-12 16:18:08.000000000 +0300 -@@ -15,6 +15,8 @@ - * O(1) rmap vm, Arjan van de ven <arjanv@redhat.com> - */ - -+#include <linux/config.h> -+#include <linux/module.h> - #include <linux/slab.h> - #include <linux/kernel_stat.h> - #include <linux/swap.h> -@@ -1210,6 +1212,7 @@ - set_current_state(TASK_RUNNING); - remove_wait_queue(&kswapd_done, &wait); - } -+EXPORT_SYMBOL(wakeup_kswapd); - - static void wakeup_memwaiters(void) - { -Index: linux-2.4.21-chaos/mm/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/mm/Makefile 2003-07-15 04:41:42.000000000 +0400 -+++ linux-2.4.21-chaos/mm/Makefile 2003-12-12 16:18:08.000000000 +0300 -@@ -9,7 +9,7 @@ - - O_TARGET := mm.o - --export-objs := shmem.o filemap.o memory.o page_alloc.o mempool.o usercopy.o -+export-objs := shmem.o filemap.o memory.o page_alloc.o mempool.o usercopy.o vmscan.o - - obj-y := memory.o mmap.o filemap.o mprotect.o mlock.o mremap.o \ - vmalloc.o slab.o bootmem.o swap.o vmscan.o page_io.o \ -Index: linux-2.4.21-chaos/mm/page_alloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/mm/page_alloc.c 2003-12-05 07:55:51.000000000 +0300 -+++ linux-2.4.21-chaos/mm/page_alloc.c 2003-12-12 16:18:08.000000000 +0300 -@@ -27,6 +27,7 @@ - - int nr_swap_pages; - pg_data_t *pgdat_list; -+EXPORT_SYMBOL(pgdat_list); - - /* - * diff --git a/lustre/kernel_patches/patches/iod-rmap-exports.patch b/lustre/kernel_patches/patches/iod-rmap-exports.patch deleted file mode 100644 index 5ba68dd409..0000000000 --- a/lustre/kernel_patches/patches/iod-rmap-exports.patch +++ /dev/null @@ -1,86 +0,0 @@ - fs/Makefile | 4 +++- - fs/inode.c | 4 +++- - mm/Makefile | 2 +- - mm/page_alloc.c | 1 + - mm/vmscan.c | 3 +++ - 5 files changed, 11 insertions(+), 3 deletions(-) - ---- linux-2.4.18-18/fs/inode.c~iod-rmap-exports Thu Apr 3 00:40:01 2003 -+++ linux-2.4.18-18-braam/fs/inode.c Thu Apr 3 00:40:01 2003 -@@ -5,6 +5,7 @@ - */ - - #include <linux/config.h> -+#include <linux/module.h> - #include <linux/fs.h> - #include <linux/string.h> - #include <linux/mm.h> -@@ -66,7 +67,8 @@ static LIST_HEAD(anon_hash_chain); /* fo - * NOTE! You also have to own the lock if you change - * the i_state of an inode while it is in use.. - */ --static spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+EXPORT_SYMBOL(inode_lock); - - /* - * Statistics gathering.. ---- linux-2.4.18-18/fs/Makefile~iod-rmap-exports Thu Apr 3 00:40:01 2003 -+++ linux-2.4.18-18-braam/fs/Makefile Thu Apr 3 00:40:29 2003 -@@ -1,3 +1,5 @@ -+ -+ - # - # Makefile for the Linux filesystems. - # -@@ -7,7 +9,7 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o -+export-objs := filesystems.o open.o dcache.o buffer.o inode.o - mod-subdirs := nls - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ ---- linux-2.4.18-18/mm/vmscan.c~iod-rmap-exports Thu Apr 3 00:40:01 2003 -+++ linux-2.4.18-18-braam/mm/vmscan.c Thu Apr 3 00:40:01 2003 -@@ -14,6 +14,8 @@ - * Multiqueue VM started 5.8.00, Rik van Riel. - */ - -+#include <linux/config.h> -+#include <linux/module.h> - #include <linux/slab.h> - #include <linux/kernel_stat.h> - #include <linux/swap.h> -@@ -837,6 +839,7 @@ void wakeup_kswapd(unsigned int gfp_mask - set_current_state(TASK_RUNNING); - remove_wait_queue(&kswapd_done, &wait); - } -+EXPORT_SYMBOL(wakeup_kswapd); - - static void wakeup_memwaiters(void) - { ---- linux-2.4.18-18/mm/Makefile~iod-rmap-exports Thu Apr 3 00:40:01 2003 -+++ linux-2.4.18-18-braam/mm/Makefile Thu Apr 3 00:40:01 2003 -@@ -9,7 +9,7 @@ - - O_TARGET := mm.o - --export-objs := shmem.o filemap.o memory.o page_alloc.o mempool.o -+export-objs := shmem.o filemap.o memory.o page_alloc.o mempool.o vmscan.o - - obj-y := memory.o mmap.o filemap.o mprotect.o mlock.o mremap.o \ - vmalloc.o slab.o bootmem.o swap.o vmscan.o page_io.o \ ---- linux-2.4.18-18/mm/page_alloc.c~iod-rmap-exports Thu Apr 3 00:40:01 2003 -+++ linux-2.4.18-18-braam/mm/page_alloc.c Thu Apr 3 00:40:01 2003 -@@ -31,6 +31,7 @@ int nr_active_pages; - int nr_inactive_dirty_pages; - int nr_inactive_clean_pages; - pg_data_t *pgdat_list; -+EXPORT_SYMBOL(pgdat_list); - - /* - * The zone_table array is used to look up the address of the - -_ diff --git a/lustre/kernel_patches/patches/iod-stock-24-exports-2.4.19-suse.patch b/lustre/kernel_patches/patches/iod-stock-24-exports-2.4.19-suse.patch deleted file mode 100644 index 2040fcd9d8..0000000000 --- a/lustre/kernel_patches/patches/iod-stock-24-exports-2.4.19-suse.patch +++ /dev/null @@ -1,52 +0,0 @@ - fs/Makefile | 2 +- - fs/inode.c | 4 +++- - mm/page_alloc.c | 1 + - 3 files changed, 5 insertions(+), 2 deletions(-) - -Index: linux-2.4.19.SuSE/fs/inode.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/inode.c Sat Nov 15 18:02:13 2003 -+++ linux-2.4.19.SuSE/fs/inode.c Sat Nov 15 18:03:04 2003 -@@ -5,6 +5,7 @@ - */ - - #include <linux/config.h> -+#include <linux/module.h> - #include <linux/fs.h> - #include <linux/string.h> - #include <linux/mm.h> -@@ -67,7 +68,8 @@ - * NOTE! You also have to own the lock if you change - * the i_state of an inode while it is in use.. - */ --static spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+EXPORT_SYMBOL(inode_lock); - - /* - * Statistics gathering.. -Index: linux-2.4.19.SuSE/fs/Makefile -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/Makefile Mon Jan 27 05:08:56 2003 -+++ linux-2.4.19.SuSE/fs/Makefile Sat Nov 15 18:03:54 2003 -@@ -7,7 +7,7 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o -+export-objs := filesystems.o open.o dcache.o buffer.o inode.o - mod-subdirs := nls - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ -Index: linux-2.4.19.SuSE/mm/page_alloc.c -=================================================================== ---- linux-2.4.19.SuSE.orig/mm/page_alloc.c Mon Jan 27 05:08:55 2003 -+++ linux-2.4.19.SuSE/mm/page_alloc.c Sat Nov 15 18:03:04 2003 -@@ -32,6 +32,7 @@ - LIST_HEAD(inactive_list); - LIST_HEAD(active_list); - pg_data_t *pgdat_list; -+EXPORT_SYMBOL(pgdat_list); - - /* Used to look up the address of the struct zone encoded in page->zone */ - zone_t *zone_table[MAX_NR_ZONES*MAX_NR_NODES]; diff --git a/lustre/kernel_patches/patches/iod-stock-24-exports_hp.patch b/lustre/kernel_patches/patches/iod-stock-24-exports_hp.patch deleted file mode 100644 index 3035f559ed..0000000000 --- a/lustre/kernel_patches/patches/iod-stock-24-exports_hp.patch +++ /dev/null @@ -1,48 +0,0 @@ - fs/Makefile | 2 +- - fs/inode.c | 4 +++- - mm/page_alloc.c | 1 + - 3 files changed, 5 insertions(+), 2 deletions(-) - ---- linux/fs/inode.c~iod-stock-24-exports_hp Wed Apr 9 10:44:54 2003 -+++ linux-mmonroe/fs/inode.c Wed Apr 9 10:49:50 2003 -@@ -5,6 +5,7 @@ - */ - - #include <linux/config.h> -+#include <linux/module.h> - #include <linux/fs.h> - #include <linux/string.h> - #include <linux/mm.h> -@@ -66,7 +67,8 @@ static LIST_HEAD(anon_hash_chain); /* fo - * NOTE! You also have to own the lock if you change - * the i_state of an inode while it is in use.. - */ --static spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+EXPORT_SYMBOL(inode_lock); - - /* - * Statistics gathering.. ---- linux/fs/Makefile~iod-stock-24-exports_hp Wed Apr 9 10:26:08 2003 -+++ linux-mmonroe/fs/Makefile Wed Apr 9 10:49:50 2003 -@@ -7,7 +7,7 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o inode.o - mod-subdirs := nls xfs - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ ---- linux/mm/page_alloc.c~iod-stock-24-exports_hp Wed Apr 9 10:26:14 2003 -+++ linux-mmonroe/mm/page_alloc.c Wed Apr 9 10:49:50 2003 -@@ -28,6 +28,7 @@ int nr_inactive_pages; - LIST_HEAD(inactive_list); - LIST_HEAD(active_list); - pg_data_t *pgdat_list; -+EXPORT_SYMBOL(pgdat_list); - - /* - * - -_ diff --git a/lustre/kernel_patches/patches/iod-stock-exports-2.4.22-rh.patch b/lustre/kernel_patches/patches/iod-stock-exports-2.4.22-rh.patch deleted file mode 100644 index 8d8790e770..0000000000 --- a/lustre/kernel_patches/patches/iod-stock-exports-2.4.22-rh.patch +++ /dev/null @@ -1,48 +0,0 @@ - fs/Makefile | 2 +- - fs/inode.c | 4 +++- - mm/page_alloc.c | 1 + - 3 files changed, 5 insertions(+), 2 deletions(-) - ---- linux-2.4.22-ac1/fs/inode.c~iod-stock-exports-2.4.22-rh 2003-09-25 14:45:32.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/inode.c 2003-09-25 14:49:41.000000000 +0400 -@@ -5,6 +5,7 @@ - */ - - #include <linux/config.h> -+#include <linux/module.h> - #include <linux/fs.h> - #include <linux/string.h> - #include <linux/mm.h> -@@ -68,7 +69,8 @@ static LIST_HEAD(anon_hash_chain); /* fo - * NOTE! You also have to own the lock if you change - * the i_state of an inode while it is in use.. - */ --static spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+spinlock_t inode_lock = SPIN_LOCK_UNLOCKED; -+EXPORT_SYMBOL(inode_lock); - - /* - * Statistics gathering.. ---- linux-2.4.22-ac1/fs/Makefile~iod-stock-exports-2.4.22-rh 2003-09-25 14:16:28.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/Makefile 2003-09-25 14:50:00.000000000 +0400 -@@ -7,7 +7,7 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o - mod-subdirs := nls xfs - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ ---- linux-2.4.22-ac1/mm/page_alloc.c~iod-stock-exports-2.4.22-rh 2003-09-25 14:16:28.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/mm/page_alloc.c 2003-09-25 14:49:41.000000000 +0400 -@@ -28,6 +28,7 @@ int nr_inactive_pages; - LIST_HEAD(inactive_list); - LIST_HEAD(active_list); - pg_data_t *pgdat_list; -+EXPORT_SYMBOL(pgdat_list); - - /* - * - -_ diff --git a/lustre/kernel_patches/patches/iod-stock-exports-2.4.22.patch b/lustre/kernel_patches/patches/iod-stock-exports-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/iod-stock-exports-2.4.22.patch rename to lustre/kernel_patches/patches/iod-stock-exports-2.4.24.patch diff --git a/lustre/kernel_patches/patches/iopen-2.4.19-suse.patch b/lustre/kernel_patches/patches/iopen-2.4.19-suse.patch deleted file mode 100644 index 01c040cdac..0000000000 --- a/lustre/kernel_patches/patches/iopen-2.4.19-suse.patch +++ /dev/null @@ -1,449 +0,0 @@ - Documentation/filesystems/ext2.txt | 16 ++ - fs/ext3/Makefile | 2 - fs/ext3/inode.c | 4 - fs/ext3/iopen.c | 259 +++++++++++++++++++++++++++++++++++++ - fs/ext3/iopen.h | 13 + - fs/ext3/namei.c | 13 + - fs/ext3/super.c | 11 + - include/linux/ext3_fs.h | 2 - 8 files changed, 318 insertions(+), 2 deletions(-) - -Index: linux-2.4.19/Documentation/filesystems/ext2.txt -=================================================================== ---- linux-2.4.19.orig/Documentation/filesystems/ext2.txt 2001-07-11 18:44:45.000000000 -0400 -+++ linux-2.4.19/Documentation/filesystems/ext2.txt 2004-04-23 22:37:48.000000000 -0400 -@@ -35,6 +35,22 @@ - - 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. - - -Index: linux-2.4.19/fs/ext3/Makefile -=================================================================== ---- linux-2.4.19.orig/fs/ext3/Makefile 2004-04-23 18:26:27.000000000 -0400 -+++ linux-2.4.19/fs/ext3/Makefile 2004-04-23 22:38:38.000000000 -0400 -@@ -11,7 +11,7 @@ - - export-objs := super.o inode.o - --obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -+obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o - obj-m := $(O_TARGET) - -Index: linux-2.4.19/fs/ext3/inode.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/inode.c 2004-04-23 22:37:42.000000000 -0400 -+++ linux-2.4.19/fs/ext3/inode.c 2004-04-23 22:37:48.000000000 -0400 -@@ -34,6 +34,7 @@ - #include <linux/highuid.h> - #include <linux/quotaops.h> - #include <linux/module.h> -+#include "iopen.h" - - /* - * SEARCH_FROM_ZERO forces each block allocation to search from the start -@@ -2350,6 +2351,9 @@ - struct buffer_head *bh; - int block; - -+ if (ext3_iopen_get_inode(inode)) -+ return; -+ - if(ext3_get_inode_loc(inode, &iloc)) - goto bad_inode; - bh = iloc.bh; -Index: linux-2.4.19/fs/ext3/iopen.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/iopen.c 2003-01-30 05:24:37.000000000 -0500 -+++ linux-2.4.19/fs/ext3/iopen.c 2004-04-23 22:37:48.000000000 -0400 -@@ -0,0 +1,258 @@ -+/* -+ * 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. -+ * -+ * -+ * Invariants: -+ * - there is only ever a single DCACHE_NFSD_DISCONNECTED dentry alias -+ * for an inode at one time. -+ * - there are never both connected and DCACHE_NFSD_DISCONNECTED dentry -+ * aliases on an inode at the same time. -+ * -+ * If we have any connected dentry aliases for an inode, use one of those -+ * in iopen_lookup(). Otherwise, we instantiate a single NFSD_DISCONNECTED -+ * dentry for this inode, which thereafter will be found by the dcache -+ * when looking up this inode number in __iopen__, so we don't return here -+ * until it is gone. -+ * -+ * If we get an inode via a regular name lookup, then we "rename" the -+ * NFSD_DISCONNECTED dentry to the proper name and parent. This ensures -+ * existing users of the disconnected dentry will continue to use the same -+ * dentry as the connected users, and there will never be both kinds of -+ * dentry aliases at one time. -+ */ -+ -+#include <linux/sched.h> -+#include <linux/fs.h> -+#include <linux/locks.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(dir->i_sb->u.ext3_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); -+ } -+ -+ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ -+ assert(list_empty(&dentry->d_hash)); /* d_rehash */ -+ -+ /* 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_NFSD_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_NFSD_DISCONNECTED; -+ -+ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ -+ list_add(&dentry->d_alias, &inode->i_dentry); /* d_instantiate */ -+ dentry->d_inode = inode; -+ -+ __d_rehash(dentry, 0); /* d_rehash */ -+ spin_unlock(&dcache_lock); -+ -+ 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; -+} -+ -+/* This function is spliced into ext3_lookup and does the move of a -+ * disconnected dentry (if it exists) to a connected dentry. -+ * Caller must hold dcache_lock. -+ */ -+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 */ -+ list_for_each(lp, &inode->i_dentry) { -+ tmp = list_entry(lp, struct dentry, d_alias); -+ if (tmp->d_flags & DCACHE_NFSD_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) -+ return NULL; -+ -+ /* Move the goal to the de hash queue - like d_move() */ -+ goal->d_flags &= ~DCACHE_NFSD_DISCONNECTED; -+ list_del_init(&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); -+ __d_rehash(goal, 0); -+ -+ 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; -+ inode->u.ext3_i.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; -+} -Index: linux-2.4.19/fs/ext3/iopen.h -=================================================================== ---- linux-2.4.19.orig/fs/ext3/iopen.h 2003-01-30 05:24:37.000000000 -0500 -+++ linux-2.4.19/fs/ext3/iopen.h 2004-04-23 22:37:48.000000000 -0400 -@@ -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); -+extern struct dentry *iopen_connect_dentry(struct dentry *de, -+ struct inode *inode); -Index: linux-2.4.19/fs/ext3/namei.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/namei.c 2004-04-23 22:37:42.000000000 -0400 -+++ linux-2.4.19/fs/ext3/namei.c 2004-04-23 22:37:48.000000000 -0400 -@@ -36,7 +36,7 @@ - #include <linux/string.h> - #include <linux/locks.h> - #include <linux/quotaops.h> -- -+#include "iopen.h" - - /* - * define how far ahead to read directories while searching them. -@@ -928,10 +928,14 @@ - 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) { -@@ -943,7 +947,28 @@ - return ERR_PTR(-EACCES); - } - } -- d_add(dentry, inode); -+ -+ /* verify this dentry is really new */ -+ assert(!dentry->d_inode); -+ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ -+ assert(list_empty(&dentry->d_hash)); /* d_rehash */ -+ assert(list_empty(&dentry->d_subdirs)); -+ -+ spin_lock(&dcache_lock); -+ if (inode && (alternate = iopen_connect_dentry(dentry, inode))) { -+ spin_unlock(&dcache_lock); -+ iput(inode); -+ return alternate; -+ } -+ -+ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ -+ if (inode) /* d_instantiate */ -+ list_add(&dentry->d_alias, &inode->i_dentry); -+ dentry->d_inode = inode; -+ -+ __d_rehash(dentry, 0); /* d_rehash */ -+ spin_unlock(&dcache_lock); -+ - return NULL; - } - -Index: linux-2.4.19/fs/ext3/super.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/super.c 2004-04-23 22:37:42.000000000 -0400 -+++ linux-2.4.19/fs/ext3/super.c 2004-04-23 22:37:48.000000000 -0400 -@@ -861,6 +861,18 @@ - || !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 -Index: linux-2.4.19/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.19.orig/include/linux/ext3_fs.h 2004-04-23 22:37:42.000000000 -0400 -+++ linux-2.4.19/include/linux/ext3_fs.h 2004-04-23 22:37:48.000000000 -0400 -@@ -324,6 +324,8 @@ - #define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - #define EXT3_MOUNT_POSIX_ACL 0x8000 /* POSIX Access Control Lists */ - #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ -+#define EXT3_MOUNT_IOPEN 0x40000 /* Allow access via iopen */ -+#define EXT3_MOUNT_IOPEN_NOPRIV 0x80000 /* 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/iopen-2.4.21-chaos.patch b/lustre/kernel_patches/patches/iopen-2.4.21-chaos.patch deleted file mode 100644 index 62bd8e1618..0000000000 --- a/lustre/kernel_patches/patches/iopen-2.4.21-chaos.patch +++ /dev/null @@ -1,487 +0,0 @@ - Documentation/filesystems/ext2.txt | 16 ++ - fs/ext3/Makefile | 2 - fs/ext3/inode.c | 4 - fs/ext3/iopen.c | 259 +++++++++++++++++++++++++++++++++++++ - fs/ext3/iopen.h | 13 + - fs/ext3/namei.c | 13 + - fs/ext3/super.c | 11 + - include/linux/ext3_fs.h | 2 - 8 files changed, 318 insertions(+), 2 deletions(-) - -Index: linux-ia64/Documentation/filesystems/ext2.txt -=================================================================== ---- linux-ia64.orig/Documentation/filesystems/ext2.txt 2004-03-17 15:47:15.000000000 -0800 -+++ linux-ia64/Documentation/filesystems/ext2.txt 2004-03-17 18:03:15.000000000 -0800 -@@ -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. - - -Index: linux-ia64/fs/ext3/Makefile -=================================================================== ---- linux-ia64.orig/fs/ext3/Makefile 2004-03-17 18:03:14.000000000 -0800 -+++ linux-ia64/fs/ext3/Makefile 2004-03-17 18:03:15.000000000 -0800 -@@ -11,7 +11,7 @@ O_TARGET := ext3.o - - export-objs := ext3-exports.o - --obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -+obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - -Index: linux-ia64/fs/ext3/inode.c -=================================================================== ---- linux-ia64.orig/fs/ext3/inode.c 2004-03-17 18:03:15.000000000 -0800 -+++ linux-ia64/fs/ext3/inode.c 2004-03-17 18:10:36.000000000 -0800 -@@ -34,6 +34,7 @@ - #include <linux/highuid.h> - #include <linux/quotaops.h> - #include <linux/module.h> -+#include "iopen.h" - - /* - * SEARCH_FROM_ZERO forces each block allocation to search from the start -@@ -2430,6 +2431,9 @@ void ext3_read_inode(struct inode * inod - struct buffer_head *bh; - int block; - -+ if (ext3_iopen_get_inode(inode)) -+ return; -+ - if(ext3_get_inode_loc(inode, &iloc)) - goto bad_inode; - bh = iloc.bh; -Index: linux-ia64/fs/ext3/iopen.c -=================================================================== ---- linux-ia64.orig/fs/ext3/iopen.c 2004-03-17 18:02:08.000000000 -0800 -+++ linux-ia64/fs/ext3/iopen.c 2004-03-17 18:10:58.000000000 -0800 -@@ -8,3 +8,275 @@ - * This file may be redistributed under the terms of the GNU General - * Public License. - * -+ * -+ * Invariants: -+ * - there is only ever a single DCACHE_NFSD_DISCONNECTED dentry alias -+ * for an inode at one time. -+ * - there are never both connected and DCACHE_NFSD_DISCONNECTED dentry -+ * aliases on an inode at the same time. -+ * -+ * If we have any connected dentry aliases for an inode, use one of those -+ * in iopen_lookup(). Otherwise, we instantiate a single NFSD_DISCONNECTED -+ * dentry for this inode, which thereafter will be found by the dcache -+ * when looking up this inode number in __iopen__, so we don't return here -+ * until it is gone. -+ * -+ * If we get an inode via a regular name lookup, then we "rename" the -+ * NFSD_DISCONNECTED dentry to the proper name and parent. This ensures -+ * existing users of the disconnected dentry will continue to use the same -+ * dentry as the connected users, and there will never be both kinds of -+ * dentry aliases at one time. -+ */ -+ -+#include <linux/sched.h> -+#include <linux/fs.h> -+#include <linux/locks.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(dir->i_sb->u.ext3_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); -+ } -+ -+ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ -+ assert(list_empty(&dentry->d_hash)); /* d_rehash */ -+ -+ /* 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_NFSD_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_NFSD_DISCONNECTED; -+ -+ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ -+ list_add(&dentry->d_alias, &inode->i_dentry); /* d_instantiate */ -+ dentry->d_inode = inode; -+ -+ __d_rehash(dentry, 0); /* d_rehash */ -+ spin_unlock(&dcache_lock); -+ -+ 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; -+} -+ -+/* This function is spliced into ext3_lookup and does the move of a -+ * disconnected dentry (if it exists) to a connected dentry. -+ */ -+struct dentry *iopen_connect_dentry(struct dentry *dentry, struct inode *inode, -+ int rehash) -+{ -+ struct dentry *tmp, *goal = NULL; -+ struct list_head *lp; -+ -+ /* verify this dentry is really new */ -+ assert(dentry->d_inode == NULL); -+ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ -+ if (rehash) -+ assert(list_empty(&dentry->d_hash)); /* d_rehash */ -+ assert(list_empty(&dentry->d_subdirs)); -+ -+ spin_lock(&dcache_lock); -+ if (!inode) -+ goto do_rehash; -+ -+ /* preferrably return a connected dentry */ -+ list_for_each(lp, &inode->i_dentry) { -+ tmp = list_entry(lp, struct dentry, d_alias); -+ if (tmp->d_flags & DCACHE_NFSD_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) -+ goto do_instantiate; -+ -+ /* Move the goal to the de hash queue - like d_move() */ -+ goal->d_flags &= ~DCACHE_NFSD_DISCONNECTED; -+ list_del_init(&goal->d_hash); -+ -+ list_del(&goal->d_child); -+ list_del(&dentry->d_child); -+ -+ /* Switch the parents and the names.. */ -+ switch_names(goal, dentry); -+ do_switch(goal->d_parent, dentry->d_parent); -+ do_switch(goal->d_name.len, dentry->d_name.len); -+ do_switch(goal->d_name.hash, dentry->d_name.hash); -+ -+ /* And add them back to the (new) parent lists */ -+ list_add(&goal->d_child, &goal->d_parent->d_subdirs); -+ list_add(&dentry->d_child, &dentry->d_parent->d_subdirs); -+ __d_rehash(goal, 0); -+ spin_unlock(&dcache_lock); -+ iput(inode); -+ -+ return goal; -+ -+ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ -+do_instantiate: -+ list_add(&dentry->d_alias, &inode->i_dentry); /* d_instantiate */ -+ dentry->d_inode = inode; -+do_rehash: -+ if (rehash) -+ __d_rehash(dentry, 0); /* d_rehash */ -+ spin_unlock(&dcache_lock); -+ -+ return NULL; -+} -+ -+/* -+ * 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; -+ inode->u.ext3_i.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; -+} -Index: linux-ia64/fs/ext3/iopen.h -=================================================================== ---- linux-ia64.orig/fs/ext3/iopen.h 2004-03-17 15:47:15.000000000 -0800 -+++ linux-ia64/fs/ext3/iopen.h 2004-03-17 18:03:15.000000000 -0800 -@@ -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); -+extern struct dentry *iopen_connect_dentry(struct dentry *dentry, -+ struct inode *inode, int rehash); -Index: linux-ia64/fs/ext3/namei.c -=================================================================== ---- linux-ia64.orig/fs/ext3/namei.c 2004-03-17 18:03:15.000000000 -0800 -+++ linux-ia64/fs/ext3/namei.c 2004-03-17 18:10:35.000000000 -0800 -@@ -36,7 +36,7 @@ - #include <linux/string.h> - #include <linux/locks.h> - #include <linux/quotaops.h> -- -+#include "iopen.h" - - /* - * define how far ahead to read directories while searching them. -@@ -932,6 +932,9 @@ static struct dentry *ext3_lookup(struct - 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) { -@@ -943,8 +946,8 @@ static struct dentry *ext3_lookup(struct - return ERR_PTR(-EACCES); - } - } -- d_add(dentry, inode); -- return NULL; -+ -+ return iopen_connect_dentry(dentry, inode, 1); - } - - #define S_SHIFT 12 -@@ -1935,10 +1938,6 @@ static int ext3_rmdir (struct inode * di - inode->i_nlink); - inode->i_version = ++event; - inode->i_nlink = 0; -- /* There's no need to set i_disksize: the fact that i_nlink is -- * zero will ensure that the right thing happens during any -- * recovery. */ -- inode->i_size = 0; - ext3_orphan_add(handle, inode); - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; -@@ -2057,6 +2056,23 @@ out_stop: - return err; - } - -+/* Like ext3_add_nondir() except for call to iopen_connect_dentry */ -+static int ext3_add_link(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ int err = ext3_add_entry(handle, dentry, inode); -+ if (!err) { -+ err = ext3_mark_inode_dirty(handle, inode); -+ if (err == 0) { -+ (void)iopen_connect_dentry(dentry, inode, 0); -+ return 0; -+ } -+ } -+ ext3_dec_count(handle, inode); -+ iput(inode); -+ return err; -+} -+ - static int ext3_link (struct dentry * old_dentry, - struct inode * dir, struct dentry *dentry) - { -@@ -2084,7 +2100,8 @@ static int ext3_link (struct dentry * ol - ext3_inc_count(handle, inode); - atomic_inc(&inode->i_count); - -- err = ext3_add_nondir(handle, dentry, inode); -+ err = ext3_add_link(handle, dentry, inode); -+ ext3_orphan_del(handle, inode); - ext3_journal_stop(handle, dir); - return err; - } -Index: linux-ia64/fs/ext3/super.c -=================================================================== ---- linux-ia64.orig/fs/ext3/super.c 2004-03-17 18:03:14.000000000 -0800 -+++ linux-ia64/fs/ext3/super.c 2004-03-17 18:10:35.000000000 -0800 -@@ -891,6 +891,18 @@ 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 -Index: linux-ia64/include/linux/ext3_fs.h -=================================================================== ---- linux-ia64.orig/include/linux/ext3_fs.h 2004-03-17 18:03:15.000000000 -0800 -+++ linux-ia64/include/linux/ext3_fs.h 2004-03-17 18:03:15.000000000 -0800 -@@ -328,6 +328,8 @@ struct ext3_inode { - #define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - #define EXT3_MOUNT_POSIX_ACL 0x8000 /* POSIX Access Control Lists */ - #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ -+#define EXT3_MOUNT_IOPEN 0x40000 /* Allow access via iopen */ -+#define EXT3_MOUNT_IOPEN_NOPRIV 0x80000 /* 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/iopen-2.4.21-sles8sp3.patch b/lustre/kernel_patches/patches/iopen-2.4.21-sles8sp3.patch deleted file mode 100644 index 07e49b863e..0000000000 --- a/lustre/kernel_patches/patches/iopen-2.4.21-sles8sp3.patch +++ /dev/null @@ -1,494 +0,0 @@ - Documentation/filesystems/ext2.txt | 16 ++ - fs/ext3/Makefile | 2 - fs/ext3/inode.c | 4 - fs/ext3/iopen.c | 259 +++++++++++++++++++++++++++++++++++++ - fs/ext3/iopen.h | 13 + - fs/ext3/namei.c | 13 + - fs/ext3/super.c | 11 + - include/linux/ext3_fs.h | 2 - 8 files changed, 318 insertions(+), 2 deletions(-) - -Index: kernel-2.4.212l35/Documentation/filesystems/ext2.txt -=================================================================== ---- kernel-2.4.212l35.orig/Documentation/filesystems/ext2.txt 2001-07-11 15:44:45.000000000 -0700 -+++ kernel-2.4.212l35/Documentation/filesystems/ext2.txt 2004-05-06 19:48:32.000000000 -0700 -@@ -35,6 +35,22 @@ - - 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. - - -Index: kernel-2.4.212l35/fs/ext3/Makefile -=================================================================== ---- kernel-2.4.212l35.orig/fs/ext3/Makefile 2004-05-06 19:46:22.000000000 -0700 -+++ kernel-2.4.212l35/fs/ext3/Makefile 2004-05-06 19:48:32.000000000 -0700 -@@ -11,7 +11,7 @@ - - export-objs := ext3-exports.o - --obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -+obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - -Index: kernel-2.4.212l35/fs/ext3/inode.c -=================================================================== ---- kernel-2.4.212l35.orig/fs/ext3/inode.c 2004-05-06 19:46:24.000000000 -0700 -+++ kernel-2.4.212l35/fs/ext3/inode.c 2004-05-06 19:48:32.000000000 -0700 -@@ -34,6 +34,7 @@ - #include <linux/highuid.h> - #include <linux/quotaops.h> - #include <linux/module.h> -+#include "iopen.h" - - /* - * SEARCH_FROM_ZERO forces each block allocation to search from the start -@@ -2252,6 +2253,9 @@ - struct buffer_head *bh; - int block; - -+ if (ext3_iopen_get_inode(inode)) -+ return; -+ - if(ext3_get_inode_loc(inode, &iloc)) - goto bad_inode; - bh = iloc.bh; -Index: kernel-2.4.212l35/fs/ext3/iopen.c -=================================================================== ---- kernel-2.4.212l35.orig/fs/ext3/iopen.c 2003-03-27 11:16:05.000000000 -0800 -+++ kernel-2.4.212l35/fs/ext3/iopen.c 2004-05-06 19:48:41.000000000 -0700 -@@ -0,0 +1,282 @@ -+/* -+ * 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. -+ * -+ * -+ * Invariants: -+ * - there is only ever a single DCACHE_NFSD_DISCONNECTED dentry alias -+ * for an inode at one time. -+ * - there are never both connected and DCACHE_NFSD_DISCONNECTED dentry -+ * aliases on an inode at the same time. -+ * -+ * If we have any connected dentry aliases for an inode, use one of those -+ * in iopen_lookup(). Otherwise, we instantiate a single NFSD_DISCONNECTED -+ * dentry for this inode, which thereafter will be found by the dcache -+ * when looking up this inode number in __iopen__, so we don't return here -+ * until it is gone. -+ * -+ * If we get an inode via a regular name lookup, then we "rename" the -+ * NFSD_DISCONNECTED dentry to the proper name and parent. This ensures -+ * existing users of the disconnected dentry will continue to use the same -+ * dentry as the connected users, and there will never be both kinds of -+ * dentry aliases at one time. -+ */ -+ -+#include <linux/sched.h> -+#include <linux/fs.h> -+#include <linux/locks.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(dir->i_sb->u.ext3_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); -+ } -+ -+ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ -+ assert(list_empty(&dentry->d_hash)); /* d_rehash */ -+ -+ /* 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_NFSD_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_NFSD_DISCONNECTED; -+ -+ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ -+ list_add(&dentry->d_alias, &inode->i_dentry); /* d_instantiate */ -+ dentry->d_inode = inode; -+ -+ __d_rehash(dentry, 0); /* d_rehash */ -+ spin_unlock(&dcache_lock); -+ -+ 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; -+} -+ -+/* This function is spliced into ext3_lookup and does the move of a -+ * disconnected dentry (if it exists) to a connected dentry. -+ */ -+struct dentry *iopen_connect_dentry(struct dentry *dentry, struct inode *inode, -+ int rehash) -+{ -+ struct dentry *tmp, *goal = NULL; -+ struct list_head *lp; -+ -+ /* verify this dentry is really new */ -+ assert(dentry->d_inode == NULL); -+ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ -+ if (rehash) -+ assert(list_empty(&dentry->d_hash)); /* d_rehash */ -+ assert(list_empty(&dentry->d_subdirs)); -+ -+ spin_lock(&dcache_lock); -+ if (!inode) -+ goto do_rehash; -+ -+ /* preferrably return a connected dentry */ -+ list_for_each(lp, &inode->i_dentry) { -+ tmp = list_entry(lp, struct dentry, d_alias); -+ if (tmp->d_flags & DCACHE_NFSD_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) -+ goto do_instantiate; -+ -+ /* Move the goal to the de hash queue - like d_move() */ -+ goal->d_flags &= ~DCACHE_NFSD_DISCONNECTED; -+ list_del_init(&goal->d_hash); -+ -+ list_del(&goal->d_child); -+ list_del(&dentry->d_child); -+ -+ /* Switch the parents and the names.. */ -+ switch_names(goal, dentry); -+ do_switch(goal->d_parent, dentry->d_parent); -+ do_switch(goal->d_name.len, dentry->d_name.len); -+ do_switch(goal->d_name.hash, dentry->d_name.hash); -+ -+ /* And add them back to the (new) parent lists */ -+ list_add(&goal->d_child, &goal->d_parent->d_subdirs); -+ list_add(&dentry->d_child, &dentry->d_parent->d_subdirs); -+ __d_rehash(goal, 0); -+ spin_unlock(&dcache_lock); -+ iput(inode); -+ -+ return goal; -+ -+ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ -+do_instantiate: -+ list_add(&dentry->d_alias, &inode->i_dentry); /* d_instantiate */ -+ dentry->d_inode = inode; -+do_rehash: -+ if (rehash) -+ __d_rehash(dentry, 0); /* d_rehash */ -+ spin_unlock(&dcache_lock); -+ -+ return NULL; -+} -+ -+/* -+ * 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; -+ inode->u.ext3_i.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; -+} -Index: kernel-2.4.212l35/fs/ext3/iopen.h -=================================================================== ---- kernel-2.4.212l35.orig/fs/ext3/iopen.h 2003-03-27 11:16:05.000000000 -0800 -+++ kernel-2.4.212l35/fs/ext3/iopen.h 2004-05-06 19:48:41.000000000 -0700 -@@ -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); -+extern struct dentry *iopen_connect_dentry(struct dentry *dentry, -+ struct inode *inode, int rehash); -Index: kernel-2.4.212l35/fs/ext3/namei.c -=================================================================== ---- kernel-2.4.212l35.orig/fs/ext3/namei.c 2004-05-06 19:46:23.000000000 -0700 -+++ kernel-2.4.212l35/fs/ext3/namei.c 2004-05-06 19:51:48.000000000 -0700 -@@ -36,7 +36,7 @@ - #include <linux/string.h> - #include <linux/locks.h> - #include <linux/quotaops.h> -- -+#include "iopen.h" - - /* - * define how far ahead to read directories while searching them. -@@ -932,6 +932,9 @@ - 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) { -@@ -943,8 +946,8 @@ - return ERR_PTR(-EACCES); - } - } -- d_add(dentry, inode); -- return NULL; -+ -+ return iopen_connect_dentry(dentry, inode, 1); - } - - #define S_SHIFT 12 -@@ -1936,10 +1940,6 @@ - inode->i_nlink); - inode->i_version = ++event; - inode->i_nlink = 0; -- /* There's no need to set i_disksize: the fact that i_nlink is -- * zero will ensure that the right thing happens during any -- * recovery. */ -- inode->i_size = 0; - ext3_orphan_add(handle, inode); - dir->i_nlink--; - inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; -@@ -2058,6 +2058,23 @@ - return err; - } - -+/* Like ext3_add_nondir() except for call to iopen_connect_dentry */ -+static int ext3_add_link(handle_t *handle, struct dentry *dentry, -+ struct inode *inode) -+{ -+ int err = ext3_add_entry(handle, dentry, inode); -+ if (!err) { -+ err = ext3_mark_inode_dirty(handle, inode); -+ if (err == 0) { -+ (void)iopen_connect_dentry(dentry, inode, 0); -+ return 0; -+ } -+ } -+ ext3_dec_count(handle, inode); -+ iput(inode); -+ return err; -+} -+ - static int ext3_link (struct dentry * old_dentry, - struct inode * dir, struct dentry *dentry) - { -@@ -2085,7 +2102,8 @@ - ext3_inc_count(handle, inode); - atomic_inc(&inode->i_count); - -- err = ext3_add_nondir(handle, dentry, inode); -+ err = ext3_add_link(handle, dentry, inode); -+ ext3_orphan_del(handle, inode); - ext3_journal_stop(handle, dir); - return err; - } -Index: kernel-2.4.212l35/fs/ext3/super.c -=================================================================== ---- kernel-2.4.212l35.orig/fs/ext3/super.c 2004-05-06 19:46:23.000000000 -0700 -+++ kernel-2.4.212l35/fs/ext3/super.c 2004-05-06 19:48:32.000000000 -0700 -@@ -869,6 +869,18 @@ - || !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 -Index: kernel-2.4.212l35/include/linux/ext3_fs.h -=================================================================== ---- kernel-2.4.212l35.orig/include/linux/ext3_fs.h 2004-05-06 19:46:24.000000000 -0700 -+++ kernel-2.4.212l35/include/linux/ext3_fs.h 2004-05-06 19:48:32.000000000 -0700 -@@ -324,6 +324,8 @@ - #define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - #define EXT3_MOUNT_POSIX_ACL 0x8000 /* POSIX Access Control Lists */ - #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ -+#define EXT3_MOUNT_IOPEN 0x40000 /* Allow access via iopen */ -+#define EXT3_MOUNT_IOPEN_NOPRIV 0x80000 /* 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/iopen-2.4.20.patch b/lustre/kernel_patches/patches/iopen-2.4.24.patch similarity index 97% rename from lustre/kernel_patches/patches/iopen-2.4.20.patch rename to lustre/kernel_patches/patches/iopen-2.4.24.patch index f40953365a..dc860eef71 100644 --- a/lustre/kernel_patches/patches/iopen-2.4.20.patch +++ b/lustre/kernel_patches/patches/iopen-2.4.24.patch @@ -434,7 +434,7 @@ Index: lum/fs/ext3/namei.c + if (!err) { + err = ext3_mark_inode_dirty(handle, inode); + if (err == 0) { -+ (void)iopen_connect_dentry(dentry, inode, 0); ++ dput(iopen_connect_dentry(dentry, inode, 0)); + return 0; + } + } @@ -483,12 +483,10 @@ Index: lum/include/linux/ext3_fs.h =================================================================== --- lum.orig/include/linux/ext3_fs.h 2004-01-30 14:54:53.000000000 -0700 +++ lum/include/linux/ext3_fs.h 2004-03-09 16:46:46.000000000 -0700 -@@ -322,6 +322,8 @@ - #define EXT3_MOUNT_UPDATE_JOURNAL 0x1000 /* Update the journal format */ - #define EXT3_MOUNT_NO_UID32 0x2000 /* Disable 32-bit UIDs */ +@@ -324,4 +324,6 @@ #define EXT3_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ -+#define EXT3_MOUNT_IOPEN 0x8000 /* Allow access via iopen */ -+#define EXT3_MOUNT_IOPEN_NOPRIV 0x10000 /* Make iopen world-readable */ #define EXT3_MOUNT_ASYNCDEL 0x20000 /* Delayed deletion */ ++#define EXT3_MOUNT_IOPEN 0x40000 /* Allow access via iopen */ ++#define EXT3_MOUNT_IOPEN_NOPRIV 0x80000 /* Make iopen world-readable */ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ diff --git a/lustre/kernel_patches/patches/iopen-2.6-vanilla.patch b/lustre/kernel_patches/patches/iopen-2.6-vanilla.patch index 597cb89b66..cb504d981e 100644 --- a/lustre/kernel_patches/patches/iopen-2.6-vanilla.patch +++ b/lustre/kernel_patches/patches/iopen-2.6-vanilla.patch @@ -1,4 +1,3 @@ - Documentation/filesystems/ext2.txt | 16 ++ fs/ext3/inode.c | 3 fs/ext3/iopen.c | 239 +++++++++++++++++++++++++++++++++++++ fs/ext3/iopen.h | 15 ++ @@ -7,10 +6,23 @@ include/linux/ext3_fs.h | 2 7 files changed, 304 insertions(+), 1 deletion(-) -Index: linux-2.6.4-51.1/fs/ext3/inode.c +Index: linux-stage/fs/ext3/Makefile =================================================================== ---- linux-2.6.4-51.1.orig/fs/ext3/inode.c 2004-04-06 00:31:14.000000000 -0400 -+++ linux-2.6.4-51.1/fs/ext3/inode.c 2004-04-06 00:31:24.000000000 -0400 +--- linux-stage.orig/fs/ext3/Makefile 2004-06-22 21:12:15.000000000 -0400 ++++ linux-stage/fs/ext3/Makefile 2004-06-22 21:13:20.000000000 -0400 +@@ -4,7 +4,7 @@ + + obj-$(CONFIG_EXT3_FS) += ext3.o + +-ext3-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ ++ext3-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ + ioctl.o namei.o super.o symlink.o hash.o + + ext3-$(CONFIG_EXT3_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o +Index: linux-stage/fs/ext3/inode.c +=================================================================== +--- linux-stage.orig/fs/ext3/inode.c 2004-06-22 21:12:16.000000000 -0400 ++++ linux-stage/fs/ext3/inode.c 2004-06-22 21:13:20.000000000 -0400 @@ -37,6 +37,7 @@ #include <linux/mpage.h> #include <linux/uio.h> @@ -19,22 +31,21 @@ Index: linux-2.6.4-51.1/fs/ext3/inode.c #include "acl.h" /* -@@ -2472,6 +2473,8 @@ +@@ -2470,6 +2471,9 @@ 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; -Index: linux-2.6.4-51.1/fs/ext3/iopen.c +Index: linux-stage/fs/ext3/iopen.c =================================================================== ---- linux-2.6.4-51.1.orig/fs/ext3/iopen.c 2004-04-06 00:31:24.000000000 -0400 -+++ linux-2.6.4-51.1/fs/ext3/iopen.c 2004-04-06 00:31:24.000000000 -0400 -@@ -0,0 +1,223 @@ -+ -+ +--- linux-stage.orig/fs/ext3/iopen.c 1969-12-31 19:00:00.000000000 -0500 ++++ linux-stage/fs/ext3/iopen.c 2004-06-22 21:13:20.000000000 -0400 +@@ -0,0 +1,274 @@ +/* + * linux/fs/ext3/iopen.c + * @@ -44,6 +55,25 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + * + * This file may be redistributed under the terms of the GNU General + * Public License. ++ * ++ * ++ * Invariants: ++ * - there is only ever a single DCACHE_NFSD_DISCONNECTED dentry alias ++ * for an inode at one time. ++ * - there are never both connected and DCACHE_NFSD_DISCONNECTED dentry ++ * aliases on an inode at the same time. ++ * ++ * If we have any connected dentry aliases for an inode, use one of those ++ * in iopen_lookup(). Otherwise, we instantiate a single NFSD_DISCONNECTED ++ * dentry for this inode, which thereafter will be found by the dcache ++ * when looking up this inode number in __iopen__, so we don't return here ++ * until it is gone. ++ * ++ * If we get an inode via a regular name lookup, then we "rename" the ++ * NFSD_DISCONNECTED dentry to the proper name and parent. This ensures ++ * existing users of the disconnected dentry will continue to use the same ++ * dentry as the connected users, and there will never be both kinds of ++ * dentry aliases at one time. + */ + +#include <linux/sched.h> @@ -52,6 +82,8 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c +#include <linux/jbd.h> +#include <linux/ext3_fs.h> +#include <linux/smp_lock.h> ++#include <linux/dcache.h> ++#include <linux/security.h> +#include "iopen.h" + +#ifndef assert @@ -63,14 +95,15 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c +/* + * This implements looking up an inode by number. + */ -+static struct dentry *iopen_lookup(struct inode * dir, struct dentry *dentry, struct nameidata *nd) ++static struct dentry *iopen_lookup(struct inode * dir, struct dentry *dentry, ++ struct nameidata *nd) +{ -+ struct inode * inode; ++ 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); + @@ -99,6 +132,9 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + return ERR_PTR(-ENOENT); + } + ++ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ ++ assert(d_unhashed(dentry)); /* d_rehash */ ++ + /* preferrably return a connected dentry */ + spin_lock(&dcache_lock); + list_for_each(lp, &inode->i_dentry) { @@ -110,15 +146,22 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + alternate = list_entry(inode->i_dentry.next, + struct dentry, d_alias); + dget_locked(alternate); -+ alternate->d_vfs_flags |= DCACHE_REFERENCED; ++ spin_lock(&alternate->d_lock); ++ alternate->d_flags |= DCACHE_REFERENCED; ++ spin_unlock(&alternate->d_lock); + iput(inode); + spin_unlock(&dcache_lock); + return alternate; + } + dentry->d_flags |= DCACHE_DISCONNECTED; ++ ++ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ ++ list_add(&dentry->d_alias, &inode->i_dentry); /* d_instantiate */ ++ dentry->d_inode = inode; ++ ++ __d_rehash(dentry, 0); /* d_rehash */ + spin_unlock(&dcache_lock); + -+ d_add(dentry, inode); + return NULL; +} + @@ -126,11 +169,11 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + __typeof__ (x) __tmp = x; \ + x = y; y = __tmp; } while (0) + -+static inline void switch_names(struct dentry * dentry, struct dentry * target) ++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); ++ memcpy(dentry->d_iname, target->d_iname, DNAME_INLINE_LEN_MIN); + old_name = target->d_name.name; + new_name = dentry->d_name.name; + if (old_name == target->d_iname) @@ -141,20 +184,27 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + dentry->d_name.name = old_name; +} + -+ -+struct dentry *iopen_connect_dentry(struct dentry *de, struct inode *inode) ++/* This function is spliced into ext3_lookup and does the move of a ++ * disconnected dentry (if it exists) to a connected dentry. ++ */ ++struct dentry *iopen_connect_dentry(struct dentry *dentry, struct inode *inode, ++ int rehash) +{ + 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)); ++ assert(dentry->d_inode == NULL); ++ assert(list_empty(&dentry->d_alias)); /* d_instantiate */ ++ if (rehash) ++ assert(d_unhashed(dentry)); /* d_rehash */ ++ assert(list_empty(&dentry->d_subdirs)); + ++ spin_lock(&dcache_lock); ++ if (!inode) ++ goto do_rehash; + ++ /* preferrably return a connected dentry */ + list_for_each(lp, &inode->i_dentry) { + tmp = list_entry(lp, struct dentry, d_alias); + if (tmp->d_flags & DCACHE_DISCONNECTED) { @@ -165,16 +215,30 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + break; + } + } -+ spin_unlock(&dcache_lock); + + if (!goal) -+ return NULL; ++ goto do_instantiate; + -+ goal->d_flags &= ~DCACHE_DISCONNECTED; -+ d_rehash(de); -+ d_move(goal, de); ++ /* Move the goal to the de hash queue */ ++ goal->d_flags &= ~ DCACHE_DISCONNECTED; ++ security_d_instantiate(goal, inode); ++ __d_rehash(dentry, 0); ++ __d_move(goal, dentry); ++ spin_unlock(&dcache_lock); ++ iput(inode); + + return goal; ++ ++ /* d_add(), but don't drop dcache_lock before adding dentry to inode */ ++do_instantiate: ++ list_add(&dentry->d_alias, &inode->i_dentry); /* d_instantiate */ ++ dentry->d_inode = inode; ++do_rehash: ++ if (rehash) ++ __d_rehash(dentry, 0); /* d_rehash */ ++ spin_unlock(&dcache_lock); ++ ++ return NULL; +} + +/* @@ -205,9 +269,9 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + * 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) ++int ext3_check_for_iopen(struct inode *dir, struct dentry *dentry) +{ -+ struct inode * inode; ++ struct inode *inode; + + if (dir->i_ino != EXT3_ROOT_INO || + !test_opt(dir->i_sb, IOPEN) || @@ -227,7 +291,7 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + * 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) ++int ext3_iopen_get_inode(struct inode *inode) +{ + if (inode->i_ino != EXT3_BAD_INO) + return 0; @@ -256,10 +320,10 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.c + + return 1; +} -Index: linux-2.6.4-51.1/fs/ext3/iopen.h +Index: linux-stage/fs/ext3/iopen.h =================================================================== ---- linux-2.6.4-51.1.orig/fs/ext3/iopen.h 2004-04-06 00:31:24.000000000 -0400 -+++ linux-2.6.4-51.1/fs/ext3/iopen.h 2004-04-06 00:31:24.000000000 -0400 +--- linux-stage.orig/fs/ext3/iopen.h 1969-12-31 19:00:00.000000000 -0500 ++++ linux-stage/fs/ext3/iopen.h 2004-06-22 21:13:20.000000000 -0400 @@ -0,0 +1,15 @@ +/* + * iopen.h @@ -272,14 +336,14 @@ Index: linux-2.6.4-51.1/fs/ext3/iopen.h + * Public License. + */ + -+extern int ext3_check_for_iopen(struct inode * dir, struct dentry *dentry); -+extern int ext3_iopen_get_inode(struct inode * inode); -+ -+ -Index: linux-2.6.4-51.1/fs/ext3/namei.c ++extern int ext3_check_for_iopen(struct inode *dir, struct dentry *dentry); ++extern int ext3_iopen_get_inode(struct inode *inode); ++extern struct dentry *iopen_connect_dentry(struct dentry *dentry, ++ struct inode *inode, int rehash); +Index: linux-stage/fs/ext3/namei.c =================================================================== ---- linux-2.6.4-51.1.orig/fs/ext3/namei.c 2004-04-06 00:31:11.000000000 -0400 -+++ linux-2.6.4-51.1/fs/ext3/namei.c 2004-04-06 00:31:24.000000000 -0400 +--- linux-stage.orig/fs/ext3/namei.c 2004-06-22 21:12:16.000000000 -0400 ++++ linux-stage/fs/ext3/namei.c 2004-06-22 21:13:20.000000000 -0400 @@ -37,6 +37,7 @@ #include <linux/buffer_head.h> #include <linux/smp_lock.h> @@ -288,108 +352,125 @@ Index: linux-2.6.4-51.1/fs/ext3/namei.c #include "acl.h" /* -@@ -970,15 +971,21 @@ - } - #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; - +@@ -979,6 +980,9 @@ if (dentry->d_name.len > EXT3_NAME_LEN) return ERR_PTR(-ENAMETOOLONG); -+ if (ext3_check_for_iopen(dir, dentry)) -+ return NULL; ++ if (ext3_check_for_iopen(dir, dentry)) ++ return NULL; + - bh = ext3_find_entry(dentry, &de); + bh = ext3_find_entry(dentry, &de, 0, &lock); inode = NULL; if (bh) { -@@ -989,8 +996,14 @@ +@@ -989,10 +993,8 @@ if (!inode) return ERR_PTR(-EACCES); } -+ if (inode && (alternate = iopen_connect_dentry(dentry, inode))) { -+ iput(inode); -+ return alternate; -+ } +- if (inode) +- return d_splice_alias(inode, dentry); +- d_add(dentry, inode); +- return NULL; + - if (inode) - return d_splice_alias(inode, dentry); ++ return iopen_connect_dentry(dentry, inode, 1); + } + + +@@ -2022,10 +2024,6 @@ + inode->i_nlink); + inode->i_version++; + inode->i_nlink = 0; +- /* There's no need to set i_disksize: the fact that i_nlink is +- * zero will ensure that the right thing happens during any +- * recovery. */ +- inode->i_size = 0; + ext3_orphan_add(handle, inode); + inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; + ext3_mark_inode_dirty(handle, inode); +@@ -2145,6 +2143,23 @@ + return err; + } + ++/* Like ext3_add_nondir() except for call to iopen_connect_dentry */ ++static int ext3_add_link(handle_t *handle, struct dentry *dentry, ++ struct inode *inode) ++{ ++ int err = ext3_add_entry(handle, dentry, inode); ++ if (!err) { ++ err = ext3_mark_inode_dirty(handle, inode); ++ if (err == 0) { ++ dput(iopen_connect_dentry(dentry, inode, 0)); ++ return 0; ++ } ++ } ++ ext3_dec_count(handle, inode); ++ iput(inode); ++ return err; ++} + - d_add(dentry, inode); - return NULL; + static int ext3_link (struct dentry * old_dentry, + struct inode * dir, struct dentry *dentry) + { +@@ -2167,7 +2182,8 @@ + ext3_inc_count(handle, inode); + atomic_inc(&inode->i_count); + +- err = ext3_add_nondir(handle, dentry, inode); ++ err = ext3_add_link(handle, dentry, inode); ++ ext3_orphan_del(handle,inode); + ext3_journal_stop(handle); + return err; } -Index: linux-2.6.4-51.1/fs/ext3/super.c +Index: linux-stage/fs/ext3/super.c =================================================================== ---- linux-2.6.4-51.1.orig/fs/ext3/super.c 2004-04-06 00:31:14.000000000 -0400 -+++ linux-2.6.4-51.1/fs/ext3/super.c 2004-04-06 00:31:24.000000000 -0400 -@@ -536,7 +536,7 @@ +--- linux-stage.orig/fs/ext3/super.c 2004-06-22 21:12:16.000000000 -0400 ++++ linux-stage/fs/ext3/super.c 2004-06-22 21:13:51.000000000 -0400 +@@ -583,6 +583,7 @@ Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback, Opt_usrjquota, Opt_grpjquota, Opt_offusrjquota, Opt_offgrpjquota, - Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, -- Opt_ignore, Opt_err, -+ Opt_ignore, Opt_err, Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, + Opt_jqfmt_vfsold, Opt_jqfmt_vfsv0, Opt_pdirops, ++ Opt_iopen, Opt_noiopen, Opt_iopen_nopriv, + Opt_ignore, Opt_err, }; - static match_table_t tokens = { -@@ -575,6 +575,9 @@ - {Opt_ignore, "noquota"}, +@@ -628,6 +629,9 @@ {Opt_ignore, "quota"}, {Opt_ignore, "usrquota"}, + {Opt_pdirops, "pdirops"}, + {Opt_iopen, "iopen"}, + {Opt_noiopen, "noiopen"}, + {Opt_iopen_nopriv, "iopen_nopriv"}, {Opt_err, NULL} }; -@@ -762,6 +765,18 @@ +@@ -893,6 +897,18 @@ case Opt_abort: set_opt(sbi->s_mount_opt, ABORT); break; + case Opt_iopen: -+ set_opt (sbi->s_mount_opt, IOPEN); -+ clear_opt (sbi->s_mount_opt, IOPEN_NOPRIV); ++ set_opt (sbi->s_mount_opt, IOPEN); ++ clear_opt (sbi->s_mount_opt, IOPEN_NOPRIV); + break; + case Opt_noiopen: + clear_opt (sbi->s_mount_opt, IOPEN); -+ clear_opt (sbi->s_mount_opt, IOPEN_NOPRIV); ++ clear_opt (sbi->s_mount_opt, IOPEN_NOPRIV); + break; + case Opt_iopen_nopriv: -+ set_opt (sbi->s_mount_opt, IOPEN); -+ set_opt (sbi->s_mount_opt, IOPEN_NOPRIV); ++ set_opt (sbi->s_mount_opt, IOPEN); ++ set_opt (sbi->s_mount_opt, IOPEN_NOPRIV); + break; case Opt_ignore: break; default: -Index: linux-2.6.4-51.1/include/linux/ext3_fs.h +Index: linux-stage/include/linux/ext3_fs.h =================================================================== ---- linux-2.6.4-51.1.orig/include/linux/ext3_fs.h 2004-04-06 00:31:11.000000000 -0400 -+++ linux-2.6.4-51.1/include/linux/ext3_fs.h 2004-04-06 00:31:24.000000000 -0400 +--- linux-stage.orig/include/linux/ext3_fs.h 2004-06-22 21:12:16.000000000 -0400 ++++ linux-stage/include/linux/ext3_fs.h 2004-06-22 21:13:20.000000000 -0400 @@ -325,6 +325,8 @@ #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 */ ++#define EXT3_MOUNT_IOPEN 0x40000 /* Allow access via iopen */ ++#define EXT3_MOUNT_IOPEN_NOPRIV 0x80000 /* Make iopen world-readable */ /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ #ifndef _LINUX_EXT2_FS_H -Index: linux-2.6.4-51.1/fs/ext3/Makefile -=================================================================== ---- linux-2.6.4-51.1.orig/fs/ext3/Makefile 2004-04-06 00:27:21.000000000 -0400 -+++ linux-2.6.4-51.1/fs/ext3/Makefile 2004-04-06 00:31:42.000000000 -0400 -@@ -5,7 +5,7 @@ - obj-$(CONFIG_EXT3_FS) += ext3.o - - ext3-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o iopen.o - - ext3-$(CONFIG_EXT3_FS_XATTR) += xattr.o xattr_user.o xattr_trusted.o - ext3-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o diff --git a/lustre/kernel_patches/patches/jbd-2.4.18-jcberr.patch b/lustre/kernel_patches/patches/jbd-2.4.18-jcberr.patch deleted file mode 100644 index 81b4136377..0000000000 --- a/lustre/kernel_patches/patches/jbd-2.4.18-jcberr.patch +++ /dev/null @@ -1,274 +0,0 @@ -Index: linux-2.4.19.SuSE/include/linux/jbd.h -=================================================================== ---- linux-2.4.19.SuSE.orig/include/linux/jbd.h Sun Nov 16 13:51:03 2003 -+++ linux-2.4.19.SuSE/include/linux/jbd.h Sun Nov 16 15:10:48 2003 -@@ -283,6 +283,13 @@ - 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 -@@ -313,6 +320,12 @@ - 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 */ -@@ -432,6 +445,10 @@ - - /* 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; - }; - - -@@ -676,6 +693,9 @@ - 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 *); -Index: linux-2.4.19.SuSE/fs/jbd/checkpoint.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/jbd/checkpoint.c Mon Feb 25 11:38:08 2002 -+++ linux-2.4.19.SuSE/fs/jbd/checkpoint.c Sun Nov 16 15:10:48 2003 -@@ -594,7 +594,8 @@ - J_ASSERT (transaction->t_log_list == NULL); - J_ASSERT (transaction->t_checkpoint_list == NULL); - J_ASSERT (transaction->t_updates == 0); -- -+ J_ASSERT (list_empty(&transaction->t_jcb)); -+ - J_ASSERT (transaction->t_journal->j_committing_transaction != - transaction); - -Index: linux-2.4.19.SuSE/fs/jbd/commit.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/jbd/commit.c Mon Jan 27 05:08:04 2003 -+++ linux-2.4.19.SuSE/fs/jbd/commit.c Sun Nov 16 15:13:53 2003 -@@ -485,7 +485,7 @@ - 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. - */ -@@ -576,8 +576,10 @@ - - 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 -@@ -587,9 +589,10 @@ - descriptor = journal_get_descriptor_buffer(journal); - if (!descriptor) { - __journal_abort_hard(journal); -+ unlock_journal(journal); - goto skip_commit; - } -- -+ - /* AKPM: buglet - add `i' to tmp! */ - for (i = 0; i < jh2bh(descriptor)->b_size; i += 512) { - journal_header_t *tmp = -@@ -610,14 +614,32 @@ - 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 - transaction can be removed from any checkpoint list it was on - before. */ - --skip_commit: -+skip_commit: /* The journal should be unlocked by now. */ -+ -+ /* 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"); - -Index: linux-2.4.19.SuSE/fs/jbd/journal.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/jbd/journal.c Mon Jan 27 05:08:00 2003 -+++ linux-2.4.19.SuSE/fs/jbd/journal.c Sun Nov 16 15:10:48 2003 -@@ -59,6 +59,7 @@ - #endif - EXPORT_SYMBOL(journal_flush); - EXPORT_SYMBOL(journal_revoke); -+EXPORT_SYMBOL(journal_callback_set); - - EXPORT_SYMBOL(journal_init_dev); - EXPORT_SYMBOL(journal_init_inode); -Index: linux-2.4.19.SuSE/fs/jbd/transaction.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/jbd/transaction.c Sun Nov 16 01:45:26 2003 -+++ linux-2.4.19.SuSE/fs/jbd/transaction.c Sun Nov 16 15:15:34 2003 -@@ -58,6 +58,7 @@ - transaction->t_state = T_RUNNING; - transaction->t_tid = journal->j_transaction_sequence++; - transaction->t_expires = jiffies + bdflush_interval(); -+ INIT_LIST_HEAD(&transaction->t_jcb); - - /* Set up the commit timer for the new transaction. */ - J_ASSERT (!journal->j_commit_timer_active); -@@ -91,7 +92,14 @@ - transaction_t *transaction; - int needed; - int nblocks = handle->h_buffer_credits; -- -+ -+ if (nblocks > journal->j_max_transaction_buffers) { -+ jbd_debug(1, "JBD: %s wants too many credits (%d > %d)\n", -+ current->comm, nblocks, -+ journal->j_max_transaction_buffers); -+ return -ENOSPC; -+ } -+ - jbd_debug(3, "New handle %p going live.\n", handle); - - repeat: -@@ -202,6 +210,20 @@ - 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. - * -@@ -228,14 +250,11 @@ - 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); -@@ -334,14 +353,11 @@ - - 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); -@@ -1321,6 +1337,28 @@ - #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_tail(&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 -@@ -1385,7 +1423,10 @@ - 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 diff --git a/lustre/kernel_patches/patches/jbd-2.4.19-pre1-jcberr.patch b/lustre/kernel_patches/patches/jbd-2.4.19-pre1-jcberr.patch deleted file mode 100644 index bbbf613d38..0000000000 --- a/lustre/kernel_patches/patches/jbd-2.4.19-pre1-jcberr.patch +++ /dev/null @@ -1,274 +0,0 @@ -Index: linux-2.4.19-pre1/include/linux/jbd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/jbd.h 2003-11-21 03:00:11.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/jbd.h 2003-11-21 03:04:47.000000000 +0300 -@@ -275,6 +275,13 @@ - 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 -@@ -305,6 +312,12 @@ - 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 */ -@@ -424,6 +437,10 @@ - - /* 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; - }; - - -@@ -672,6 +689,9 @@ - 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 *); -Index: linux-2.4.19-pre1/fs/jbd/checkpoint.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/jbd/checkpoint.c 2003-11-21 02:53:20.000000000 +0300 -+++ linux-2.4.19-pre1/fs/jbd/checkpoint.c 2003-11-21 03:04:47.000000000 +0300 -@@ -601,7 +601,8 @@ - J_ASSERT (transaction->t_log_list == NULL); - J_ASSERT (transaction->t_checkpoint_list == NULL); - J_ASSERT (transaction->t_updates == 0); -- -+ J_ASSERT (list_empty(&transaction->t_jcb)); -+ - J_ASSERT (transaction->t_journal->j_committing_transaction != - transaction); - -Index: linux-2.4.19-pre1/fs/jbd/commit.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/jbd/commit.c 2003-11-21 02:53:20.000000000 +0300 -+++ linux-2.4.19-pre1/fs/jbd/commit.c 2003-11-21 03:04:47.000000000 +0300 -@@ -480,7 +480,7 @@ - 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. - */ -@@ -571,8 +571,10 @@ - - 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 -@@ -582,9 +584,10 @@ - descriptor = journal_get_descriptor_buffer(journal); - if (!descriptor) { - __journal_abort_hard(journal); -+ unlock_journal(journal); - goto skip_commit; - } -- -+ - /* AKPM: buglet - add `i' to tmp! */ - for (i = 0; i < jh2bh(descriptor)->b_size; i += 512) { - journal_header_t *tmp = -@@ -605,14 +608,32 @@ - 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 - transaction can be removed from any checkpoint list it was on - before. */ - --skip_commit: -+skip_commit: /* The journal should be unlocked by now. */ -+ -+ /* 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"); - -Index: linux-2.4.19-pre1/fs/jbd/journal.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/jbd/journal.c 2003-11-21 02:53:20.000000000 +0300 -+++ linux-2.4.19-pre1/fs/jbd/journal.c 2003-11-21 03:04:47.000000000 +0300 -@@ -58,6 +58,7 @@ - #endif - EXPORT_SYMBOL(journal_flush); - EXPORT_SYMBOL(journal_revoke); -+EXPORT_SYMBOL(journal_callback_set); - - EXPORT_SYMBOL(journal_init_dev); - EXPORT_SYMBOL(journal_init_inode); -Index: linux-2.4.19-pre1/fs/jbd/transaction.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/jbd/transaction.c 2003-11-21 02:53:20.000000000 +0300 -+++ linux-2.4.19-pre1/fs/jbd/transaction.c 2003-11-21 03:05:14.000000000 +0300 -@@ -57,6 +57,7 @@ - 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); -@@ -90,7 +91,14 @@ - transaction_t *transaction; - int needed; - int nblocks = handle->h_buffer_credits; -- -+ -+ if (nblocks > journal->j_max_transaction_buffers) { -+ jbd_debug(1, "JBD: %s wants too many credits (%d > %d)\n", -+ current->comm, nblocks, -+ journal->j_max_transaction_buffers); -+ return -ENOSPC; -+ } -+ - jbd_debug(3, "New handle %p going live.\n", handle); - - repeat: -@@ -196,6 +204,20 @@ - 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. - * -@@ -222,14 +244,11 @@ - 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); -@@ -328,14 +347,11 @@ - - 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); -@@ -1324,6 +1340,28 @@ - #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_tail(&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 -@@ -1389,7 +1427,10 @@ - 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 diff --git a/lustre/kernel_patches/patches/jbd-commit-tricks.patch b/lustre/kernel_patches/patches/jbd-commit-tricks-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/jbd-commit-tricks.patch rename to lustre/kernel_patches/patches/jbd-commit-tricks-2.4.24.patch diff --git a/lustre/kernel_patches/patches/jbd-ctx_switch.patch b/lustre/kernel_patches/patches/jbd-ctx_switch.patch deleted file mode 100644 index 8d4607f236..0000000000 --- a/lustre/kernel_patches/patches/jbd-ctx_switch.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff -rup linux-2.4.20-uml/fs/jbd/transaction.c linux-2.4.21-rc2/fs/jbd/transaction.c ---- linux-2.4.20-uml/fs/jbd/transaction.c Thu Nov 28 16:53:15 2002 -+++ linux-2.4.21-rc2/fs/jbd/transaction.c Fri May 16 11:00:40 2003 -@@ -666,7 +673,8 @@ repeat: - spin_unlock(&journal_datalist_lock); - unlock_journal(journal); - /* commit wakes up all shadow buffers after IO */ -- sleep_on(&jh2bh(jh)->b_wait); -+ wait_event(jh2bh(jh)->b_wait, -+ jh->b_jlist != BJ_Shadow); - lock_journal(journal); - goto repeat; - } diff --git a/lustre/kernel_patches/patches/jbd-dont-account-blocks-twice.patch b/lustre/kernel_patches/patches/jbd-dont-account-blocks-twice-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/jbd-dont-account-blocks-twice.patch rename to lustre/kernel_patches/patches/jbd-dont-account-blocks-twice-2.4.24.patch diff --git a/lustre/kernel_patches/patches/jbd-flushtime-2.4.19-suse.patch b/lustre/kernel_patches/patches/jbd-flushtime-2.4.19-suse.patch deleted file mode 100644 index 8411137fdd..0000000000 --- a/lustre/kernel_patches/patches/jbd-flushtime-2.4.19-suse.patch +++ /dev/null @@ -1,35 +0,0 @@ -Index: linux-2.4.19.SuSE/fs/jbd/transaction.c -=================================================================== ---- linux-2.4.19.SuSE.orig/fs/jbd/transaction.c Sun Nov 16 01:38:25 2003 -+++ linux-2.4.19.SuSE/fs/jbd/transaction.c Sun Nov 16 01:44:26 2003 -@@ -1094,7 +1094,6 @@ - - spin_lock(&journal_datalist_lock); - set_bit(BH_JBDDirty, &bh->b_state); -- set_buffer_flushtime(bh); - - J_ASSERT_JH(jh, jh->b_transaction != NULL); - -@@ -1995,6 +1994,13 @@ - spin_unlock(&journal_datalist_lock); - } - -+static void jbd_refile_buffer(struct buffer_head *bh) -+{ -+ if (buffer_dirty(bh) && (bh->b_list != BUF_DIRTY)) -+ set_buffer_flushtime(bh); -+ refile_buffer(bh); -+} -+ - /* - * Remove a buffer from its current buffer list in preparation for - * dropping it from its current transaction entirely. If the buffer has -@@ -2022,7 +2028,7 @@ - J_ASSERT_JH(jh, jh->b_transaction->t_state == T_RUNNING); - } else { - /* Onto BUF_DIRTY for writeback */ -- refile_buffer(jh2bh(jh)); -+ jbd_refile_buffer(jh2bh(jh)); - } - } - diff --git a/lustre/kernel_patches/patches/jbd-flushtime.patch b/lustre/kernel_patches/patches/jbd-flushtime.patch deleted file mode 100644 index 938c14286a..0000000000 --- a/lustre/kernel_patches/patches/jbd-flushtime.patch +++ /dev/null @@ -1,34 +0,0 @@ -diff -rup linux-2.4.20-uml/fs/jbd/transaction.c linux-2.4.21-rc2/fs/jbd/transaction.c ---- linux-2.4.20-uml/fs/jbd/transaction.c Thu Nov 28 16:53:15 2002 -+++ linux-2.4.21-rc2/fs/jbd/transaction.c Fri May 16 11:00:40 2003 -@@ -1109,7 +1142,6 @@ int journal_dirty_metadata (handle_t *ha - - spin_lock(&journal_datalist_lock); - set_bit(BH_JBDDirty, &bh->b_state); -- set_buffer_flushtime(bh); - - J_ASSERT_JH(jh, jh->b_transaction != NULL); - -@@ -2035,6 +2093,13 @@ void journal_file_buffer(struct journal_ - spin_unlock(&journal_datalist_lock); - } - -+static void jbd_refile_buffer(struct buffer_head *bh) -+{ -+ if (buffer_dirty(bh) && (bh->b_list != BUF_DIRTY)) -+ set_buffer_flushtime(bh); -+ refile_buffer(bh); -+} -+ - /* - * Remove a buffer from its current buffer list in preparation for - * dropping it from its current transaction entirely. If the buffer has -@@ -2055,7 +2120,7 @@ void __journal_refile_buffer(struct jour - __journal_unfile_buffer(jh); - jh->b_transaction = NULL; - /* Onto BUF_DIRTY for writeback */ -- refile_buffer(jh2bh(jh)); -+ jbd_refile_buffer(jh2bh(jh)); - return; - } - diff --git a/lustre/kernel_patches/patches/jbd-get_write_access.patch b/lustre/kernel_patches/patches/jbd-get_write_access.patch deleted file mode 100644 index ea569dc145..0000000000 --- a/lustre/kernel_patches/patches/jbd-get_write_access.patch +++ /dev/null @@ -1,56 +0,0 @@ -diff -rup linux-2.4.20-uml/fs/jbd/transaction.c linux-2.4.21-rc2/fs/jbd/transaction.c ---- linux-2.4.20-uml/fs/jbd/transaction.c Thu Nov 28 16:53:15 2002 -+++ linux-2.4.21-rc2/fs/jbd/transaction.c Fri May 16 11:00:40 2003 -@@ -735,7 +743,8 @@ done_locked: - int offset; - char *source; - -- J_ASSERT_JH(jh, buffer_uptodate(jh2bh(jh))); -+ J_EXPECT_JH(jh, buffer_uptodate(jh2bh(jh)), -+ "Possible IO failure.\n"); - page = jh2bh(jh)->b_page; - offset = ((unsigned long) jh2bh(jh)->b_data) & ~PAGE_MASK; - source = kmap(page); -diff -rup linux-2.4.20-uml/include/linux/jbd.h linux-2.4.21-rc2/include/linux/jbd.h ---- linux-2.4.20-uml/include/linux/jbd.h Mon Aug 25 16:16:57 2003 -+++ linux-2.4.21-rc2/include/linux/jbd.h Tue May 13 13:28:29 2003 -@@ -40,6 +40,15 @@ - */ - #undef JBD_PARANOID_WRITES - -+/* -+ * Define JBD_PARANIOD_IOFAIL to cause a kernel BUG() if ext3 finds -+ * certain classes of error which can occur due to failed IOs. Under -+ * normal use we want ext3 to continue after such errors, because -+ * hardware _can_ fail, but for debugging purposes when running tests on -+ * known-good hardware we may want to trap these errors. -+ */ -+#undef JBD_PARANOID_IOFAIL -+ - #ifdef CONFIG_JBD_DEBUG - /* - * Define JBD_EXPENSIVE_CHECKING to enable more expensive internal -@@ -232,6 +272,23 @@ void buffer_assertion_failure(struct buf - #define J_ASSERT(assert) do { } while (0) - #endif /* JBD_ASSERTIONS */ - -+#if defined(JBD_PARANOID_IOFAIL) -+#define J_EXPECT(expr, why...) J_ASSERT(expr) -+#define J_EXPECT_BH(bh, expr, why...) J_ASSERT_BH(bh, expr) -+#define J_EXPECT_JH(jh, expr, why...) J_ASSERT_JH(jh, expr) -+#else -+#define __journal_expect(expr, why...) \ -+ do { \ -+ if (!(expr)) { \ -+ printk(KERN_ERR "EXT3-fs unexpected failure: %s;\n", # expr); \ -+ printk(KERN_ERR why); \ -+ } \ -+ } while (0) -+#define J_EXPECT(expr, why...) __journal_expect(expr, ## why) -+#define J_EXPECT_BH(bh, expr, why...) __journal_expect(expr, ## why) -+#define J_EXPECT_JH(jh, expr, why...) __journal_expect(expr, ## why) -+#endif -+ - enum jbd_state_bits { - BH_JWrite - = BH_PrivateStart, /* 1 if being written to log (@@@ DEBUGGING) */ diff --git a/lustre/kernel_patches/patches/kdev-2.4.19-pre1.patch b/lustre/kernel_patches/patches/kdev-2.4.19-pre1.patch deleted file mode 100644 index 5499df3a8d..0000000000 --- a/lustre/kernel_patches/patches/kdev-2.4.19-pre1.patch +++ /dev/null @@ -1,12 +0,0 @@ -Index: linux-2.4.19-pre1/include/linux/kdev_t.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/kdev_t.h 2003-11-20 19:01:38.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/kdev_t.h 2003-11-21 04:02:03.000000000 +0300 -@@ -82,6 +82,7 @@ - #define minor(d) MINOR(d) - #define kdev_same(a,b) (a==b) - #define kdev_none(d) (!(d)) -+#define val_to_kdev(d) ((kdev_t)(d)) - - /* - As long as device numbers in the outside world have 16 bits only, diff --git a/lustre/kernel_patches/patches/kernel_text_address-2.4.18-chaos.patch b/lustre/kernel_patches/patches/kernel_text_address-2.4.18-chaos.patch deleted file mode 100644 index bcfc3723e5..0000000000 --- a/lustre/kernel_patches/patches/kernel_text_address-2.4.18-chaos.patch +++ /dev/null @@ -1,40 +0,0 @@ -Index: linux-2.4.18-chaos/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.18-chaos.orig/arch/i386/kernel/traps.c 2003-07-28 17:51:13.000000000 +0400 -+++ linux-2.4.18-chaos/arch/i386/kernel/traps.c 2003-12-11 02:10:33.000000000 +0300 -@@ -1153,3 +1153,35 @@ - EXPORT_SYMBOL_GPL(nmi_watchdog); - #endif - -+#ifdef CONFIG_MODULES -+extern struct module *module_list; -+extern struct module kernel_module; -+#endif -+ -+int is_kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+#ifdef CONFIG_MODULES -+ struct module *mod; -+#endif -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext); -+ return 1; -+ -+#ifdef CONFIG_MODULES -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+#endif -+ -+ return retval; -+} -+ -+EXPORT_SYMBOL(lookup_symbol); -+EXPORT_SYMBOL_GPL(is_kernel_text_address); diff --git a/lustre/kernel_patches/patches/kernel_text_address-2.4.19-pre1.patch b/lustre/kernel_patches/patches/kernel_text_address-2.4.19-pre1.patch deleted file mode 100644 index df37f7a81a..0000000000 --- a/lustre/kernel_patches/patches/kernel_text_address-2.4.19-pre1.patch +++ /dev/null @@ -1,58 +0,0 @@ -Index: linux-2.4.19-pre1/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/kernel/traps.c 2001-09-30 23:26:08.000000000 +0400 -+++ linux-2.4.19-pre1/arch/i386/kernel/traps.c 2003-11-21 02:31:28.000000000 +0300 -@@ -961,3 +961,40 @@ - cobalt_init(); - #endif - } -+#ifdef CONFIG_MODULES -+extern struct module *module_list; -+extern struct module kernel_module; -+#endif -+ -+int is_kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+#ifdef CONFIG_MODULES -+ struct module *mod; -+#endif -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext); -+ return 1; -+ -+#ifdef CONFIG_MODULES -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+#endif -+ -+ return retval; -+} -+ -+int lookup_symbol(unsigned long address, char *buf, int buflen) -+{ -+ return -ENOSYS; -+} -+ -+EXPORT_SYMBOL_GPL(is_kernel_text_address); -+EXPORT_SYMBOL_GPL(lookup_symbol); -Index: linux-2.4.19-pre1/arch/i386/kernel/Makefile -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/kernel/Makefile 2001-11-10 01:21:21.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/kernel/Makefile 2003-11-21 02:31:46.000000000 +0300 -@@ -14,7 +14,7 @@ - - O_TARGET := kernel.o - --export-objs := mca.o mtrr.o msr.o cpuid.o microcode.o i386_ksyms.o -+export-objs := mca.o mtrr.o msr.o cpuid.o microcode.o i386_ksyms.o traps.o - - obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ - ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \ diff --git a/lustre/kernel_patches/patches/kernel_text_address-2.4.20-rh.patch b/lustre/kernel_patches/patches/kernel_text_address-2.4.20-rh.patch deleted file mode 100644 index 6e78be1c21..0000000000 --- a/lustre/kernel_patches/patches/kernel_text_address-2.4.20-rh.patch +++ /dev/null @@ -1,68 +0,0 @@ -Index: linux-2.4.20-20.9/kernel/kksymoops.c -=================================================================== ---- linux-2.4.20-20.9.orig/kernel/kksymoops.c 2003-08-18 23:16:51.000000000 +0800 -+++ linux-2.4.20-20.9/kernel/kksymoops.c 2003-11-06 18:38:12.000000000 +0800 -@@ -80,3 +80,5 @@ - printk("%s\n",modlist); - #endif - } -+ -+EXPORT_SYMBOL(lookup_symbol); -Index: linux-2.4.20-20.9/kernel/Makefile -=================================================================== ---- linux-2.4.20-20.9.orig/kernel/Makefile 2003-11-06 18:35:56.000000000 +0800 -+++ linux-2.4.20-20.9/kernel/Makefile 2003-11-06 18:42:57.000000000 +0800 -@@ -9,7 +9,7 @@ - - O_TARGET := kernel.o - --export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o printk.o cpufreq.o profile.o -+export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o printk.o cpufreq.o profile.o kksymoops.o - - obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o lowlat.o profile.o \ - module.o exit.o itimer.o info.o time.o softirq.o resource.o \ -Index: linux-2.4.20-20.9/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.20-20.9.orig/arch/i386/kernel/traps.c 2003-11-06 18:35:56.000000000 +0800 -+++ linux-2.4.20-20.9/arch/i386/kernel/traps.c 2003-11-06 18:43:26.000000000 +0800 -@@ -1027,9 +1019,39 @@ - #endif - } - -+#ifdef CONFIG_MODULES -+extern struct module *module_list; -+extern struct module kernel_module; -+#endif -+ -+int is_kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+#ifdef CONFIG_MODULES -+ struct module *mod; -+#endif -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext); -+ return 1; -+ -+#ifdef CONFIG_MODULES -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+#endif -+ -+ return retval; -+} -+ - EXPORT_SYMBOL_GPL(netdump_func); - EXPORT_SYMBOL_GPL(netdump_mode); - #if CONFIG_X86_LOCAL_APIC - EXPORT_SYMBOL_GPL(nmi_watchdog); - #endif -- -+EXPORT_SYMBOL_GPL(is_kernel_text_address); diff --git a/lustre/kernel_patches/patches/kernel_text_address-2.4.20-vanilla.patch b/lustre/kernel_patches/patches/kernel_text_address-2.4.20-vanilla.patch deleted file mode 100644 index 1fe56e16c4..0000000000 --- a/lustre/kernel_patches/patches/kernel_text_address-2.4.20-vanilla.patch +++ /dev/null @@ -1,116 +0,0 @@ -Index: linux-2.4.20-uml/arch/um/kernel/Makefile -=================================================================== ---- linux-2.4.20-uml.orig/arch/um/kernel/Makefile 2003-11-10 13:42:48.000000000 +0800 -+++ linux-2.4.20-uml/arch/um/kernel/Makefile 2003-11-10 13:43:06.000000000 +0800 -@@ -37,7 +37,8 @@ - export-objs-$(CONFIG_GPROF) += gprof_syms.o - export-objs-$(CONFIG_GCOV) += gmon_syms.o - --export-objs = ksyms.o process_kern.o signal_kern.o user_syms.o $(export-objs-y) -+export-objs = ksyms.o process_kern.o signal_kern.o user_syms.o sysrq.o \ -+ $(export-objs-y) - - CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \ - -I/usr/include -I../include -Index: linux-2.4.20-uml/arch/um/kernel/sysrq.c -=================================================================== ---- linux-2.4.20-uml.orig/arch/um/kernel/sysrq.c 2003-11-10 13:42:49.000000000 +0800 -+++ linux-2.4.20-uml/arch/um/kernel/sysrq.c 2003-11-10 13:43:06.000000000 +0800 -@@ -86,6 +86,37 @@ - show_trace((unsigned long *)esp); - } - -+#ifdef CONFIG_MODULES -+extern struct module *module_list; -+extern struct module kernel_module; -+#endif -+ -+int is_kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+#ifdef CONFIG_MODULES -+ struct module *mod; -+#endif -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext) -+ return 1; -+ -+#ifdef CONFIG_MODULES -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+#endif -+ return retval; -+} -+ -+EXPORT_SYMBOL(is_kernel_text_address); -+ - /* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically -Index: linux-2.4.20-uml/arch/i386/kernel/Makefile -=================================================================== ---- linux-2.4.20-uml.orig/arch/i386/kernel/Makefile 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-uml/arch/i386/kernel/Makefile 2003-11-10 14:39:28.000000000 +0800 -@@ -14,7 +14,8 @@ - - O_TARGET := kernel.o - --export-objs := mca.o mtrr.o msr.o cpuid.o microcode.o i386_ksyms.o time.o -+export-objs := mca.o mtrr.o msr.o cpuid.o microcode.o i386_ksyms.o time.o \ -+ traps.o - - obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ - ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \ -Index: linux-2.4.20-uml/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.20-uml.orig/arch/i386/kernel/traps.c 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-uml/arch/i386/kernel/traps.c 2003-11-10 14:53:53.000000000 +0800 -@@ -1004,3 +1004,41 @@ - cobalt_init(); - #endif - } -+ -+#ifdef CONFIG_MODULES -+extern struct module *module_list; -+extern struct module kernel_module; -+#endif -+ -+int is_kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+#ifdef CONFIG_MODULES -+ struct module *mod; -+#endif -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext); -+ return 1; -+ -+#ifdef CONFIG_MODULES -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+#endif -+ -+ return retval; -+} -+ -+int lookup_symbol(unsigned long address, char *buf, int buflen) -+{ -+ return -ENOSYS; -+} -+ -+EXPORT_SYMBOL_GPL(is_kernel_text_address); -+EXPORT_SYMBOL_GPL(lookup_symbol); diff --git a/lustre/kernel_patches/patches/kernel_text_address-2.4.21-sles8sp3.patch b/lustre/kernel_patches/patches/kernel_text_address-2.4.21-sles8sp3.patch deleted file mode 100644 index 0541a48fad..0000000000 --- a/lustre/kernel_patches/patches/kernel_text_address-2.4.21-sles8sp3.patch +++ /dev/null @@ -1,115 +0,0 @@ -Index: linux-2.4.21/arch/um/kernel/Makefile -=================================================================== ---- linux-2.4.21.orig/arch/um/kernel/Makefile 2004-04-24 02:37:58.000000000 -0400 -+++ linux-2.4.21/arch/um/kernel/Makefile 2004-04-24 02:51:03.000000000 -0400 -@@ -37,7 +37,8 @@ - export-objs-$(CONFIG_GPROF) += gprof_syms.o - export-objs-$(CONFIG_GCOV) += gmon_syms.o - --export-objs = ksyms.o process_kern.o signal_kern.o user_syms.o $(export-objs-y) -+export-objs = ksyms.o process_kern.o signal_kern.o user_syms.o sysrq.o \ -+ $(export-objs-y) - - CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \ - -I/usr/include -I../include -Index: linux-2.4.21/arch/um/kernel/sysrq.c -=================================================================== ---- linux-2.4.21.orig/arch/um/kernel/sysrq.c 2004-04-24 02:37:58.000000000 -0400 -+++ linux-2.4.21/arch/um/kernel/sysrq.c 2004-04-24 02:51:03.000000000 -0400 -@@ -86,6 +86,37 @@ - show_trace((unsigned long *)esp); - } - -+#ifdef CONFIG_MODULES -+extern struct module *module_list; -+extern struct module kernel_module; -+#endif -+ -+int is_kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+#ifdef CONFIG_MODULES -+ struct module *mod; -+#endif -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext) -+ return 1; -+ -+#ifdef CONFIG_MODULES -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+#endif -+ return retval; -+} -+ -+EXPORT_SYMBOL(is_kernel_text_address); -+ - /* - * Overrides for Emacs so that we follow Linus's tabbing style. - * Emacs will notice this stuff at the end of the file and automatically -Index: linux-2.4.21/arch/i386/kernel/Makefile -=================================================================== ---- linux-2.4.21.orig/arch/i386/kernel/Makefile 2004-04-24 02:39:05.000000000 -0400 -+++ linux-2.4.21/arch/i386/kernel/Makefile 2004-04-24 02:51:26.000000000 -0400 -@@ -20,7 +20,7 @@ - - O_TARGET := kernel.o - --export-objs := mca.o mtrr.o msr.o cpuid.o microcode.o i386_ksyms.o time.o traps.o dr_alloc.o -+export-objs := mca.o mtrr.o msr.o cpuid.o microcode.o i386_ksyms.o time.o traps.o dr_alloc.o traps.o - - ifdef CONFIG_X86_SPEEDSTEP_ICH - export-objs += speedstep-lib.o -Index: linux-2.4.21/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.21.orig/arch/i386/kernel/traps.c 2004-04-24 02:42:58.000000000 -0400 -+++ linux-2.4.21/arch/i386/kernel/traps.c 2004-04-24 02:51:03.000000000 -0400 -@@ -1339,3 +1339,41 @@ - cobalt_init(); - #endif - } -+ -+#ifdef CONFIG_MODULES -+extern struct module *module_list; -+extern struct module kernel_module; -+#endif -+ -+int is_kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+#ifdef CONFIG_MODULES -+ struct module *mod; -+#endif -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext); -+ return 1; -+ -+#ifdef CONFIG_MODULES -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+#endif -+ -+ return retval; -+} -+ -+int lookup_symbol(unsigned long address, char *buf, int buflen) -+{ -+ return -ENOSYS; -+} -+ -+EXPORT_SYMBOL_GPL(is_kernel_text_address); -+EXPORT_SYMBOL_GPL(lookup_symbol); diff --git a/lustre/kernel_patches/patches/kernel_text_address-2.4.22-vanilla.patch b/lustre/kernel_patches/patches/kernel_text_address-2.4.22-vanilla.patch deleted file mode 100644 index 6e9cd93268..0000000000 --- a/lustre/kernel_patches/patches/kernel_text_address-2.4.22-vanilla.patch +++ /dev/null @@ -1,59 +0,0 @@ -Index: linux-2.4.22-vanilla/arch/i386/kernel/traps.c -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/i386/kernel/traps.c 2003-05-16 05:28:59.000000000 +0400 -+++ linux-2.4.22-vanilla/arch/i386/kernel/traps.c 2003-11-14 00:35:36.000000000 +0300 -@@ -1004,3 +1004,40 @@ - cobalt_init(); - #endif - } -+#ifdef CONFIG_MODULES -+extern struct module *module_list; -+extern struct module kernel_module; -+#endif -+ -+int is_kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+#ifdef CONFIG_MODULES -+ struct module *mod; -+#endif -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext); -+ return 1; -+ -+#ifdef CONFIG_MODULES -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+#endif -+ -+ return retval; -+} -+ -+int lookup_symbol(unsigned long address, char *buf, int buflen) -+{ -+ return -ENOSYS; -+} -+ -+EXPORT_SYMBOL_GPL(is_kernel_text_address); -+EXPORT_SYMBOL_GPL(lookup_symbol); -Index: linux-2.4.22-vanilla/arch/i386/kernel/Makefile -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/i386/kernel/Makefile 2003-11-03 23:22:06.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/i386/kernel/Makefile 2003-11-14 00:30:28.000000000 +0300 -@@ -14,7 +14,8 @@ - - O_TARGET := kernel.o - --export-objs := mca.o mtrr.o msr.o cpuid.o microcode.o i386_ksyms.o time.o setup.o -+export-objs := mca.o mtrr.o msr.o cpuid.o microcode.o i386_ksyms.o time.o \ -+ setup.o traps.o - - obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o vm86.o \ - ptrace.o i8259.o ioport.o ldt.o setup.o time.o sys_i386.o \ diff --git a/lustre/kernel_patches/patches/kksymoops-2.4.24.vanilla.patch b/lustre/kernel_patches/patches/kksymoops-2.4.24.vanilla.patch index 46d9046b85..73a495a562 100644 --- a/lustre/kernel_patches/patches/kksymoops-2.4.24.vanilla.patch +++ b/lustre/kernel_patches/patches/kksymoops-2.4.24.vanilla.patch @@ -1,7 +1,7 @@ -Index: linux-2.4.24/arch/i386/kernel/process.c +Index: linux-2.4.24-b1_4/arch/i386/kernel/process.c =================================================================== ---- linux-2.4.24.orig/arch/i386/kernel/process.c 2004-06-24 09:06:29.000000000 +0400 -+++ linux-2.4.24/arch/i386/kernel/process.c 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/arch/i386/kernel/process.c 2003-11-29 02:26:19.000000000 +0800 ++++ linux-2.4.24-b1_4/arch/i386/kernel/process.c 2004-09-06 17:53:50.000000000 +0800 @@ -33,6 +33,7 @@ #include <linux/reboot.h> #include <linux/init.h> @@ -25,10 +25,10 @@ Index: linux-2.4.24/arch/i386/kernel/process.c if (regs->xcs & 3) printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp); printk(" EFLAGS: %08lx %s\n",regs->eflags, print_tainted()); -Index: linux-2.4.24/arch/i386/kernel/traps.c +Index: linux-2.4.24-b1_4/arch/i386/kernel/traps.c =================================================================== ---- linux-2.4.24.orig/arch/i386/kernel/traps.c 2004-07-14 18:14:26.000000000 +0400 -+++ linux-2.4.24/arch/i386/kernel/traps.c 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/arch/i386/kernel/traps.c 2004-09-06 17:53:35.000000000 +0800 ++++ linux-2.4.24-b1_4/arch/i386/kernel/traps.c 2004-09-06 17:53:50.000000000 +0800 @@ -24,6 +24,7 @@ #include <linux/spinlock.h> #include <linux/interrupt.h> @@ -98,10 +98,10 @@ Index: linux-2.4.24/arch/i386/kernel/traps.c printk("kernel BUG at %s:%d!\n", file, line); no_bug: -Index: linux-2.4.24/arch/i386/config.in +Index: linux-2.4.24-b1_4/arch/i386/config.in =================================================================== ---- linux-2.4.24.orig/arch/i386/config.in 2004-07-14 18:14:27.000000000 +0400 -+++ linux-2.4.24/arch/i386/config.in 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/arch/i386/config.in 2004-09-06 17:53:39.000000000 +0800 ++++ linux-2.4.24-b1_4/arch/i386/config.in 2004-09-06 17:53:50.000000000 +0800 @@ -8,6 +8,7 @@ define_bool CONFIG_SBUS n @@ -110,10 +110,10 @@ Index: linux-2.4.24/arch/i386/config.in mainmenu_option next_comment comment 'Code maturity level options' -Index: linux-2.4.24/arch/i386/vmlinux.lds.S +Index: linux-2.4.24-b1_4/arch/i386/vmlinux.lds.S =================================================================== ---- linux-2.4.24.orig/arch/i386/vmlinux.lds.S 2004-07-14 18:14:27.000000000 +0400 -+++ linux-2.4.24/arch/i386/vmlinux.lds.S 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/arch/i386/vmlinux.lds.S 2004-09-06 17:53:39.000000000 +0800 ++++ linux-2.4.24-b1_4/arch/i386/vmlinux.lds.S 2004-09-06 17:53:50.000000000 +0800 @@ -28,6 +28,11 @@ __ksymtab : { *(__ksymtab) } __stop___ksymtab = .; @@ -126,10 +126,10 @@ Index: linux-2.4.24/arch/i386/vmlinux.lds.S .data : { /* Data */ *(.data) CONSTRUCTORS -Index: linux-2.4.24/include/linux/kernel.h +Index: linux-2.4.24-b1_4/include/linux/kernel.h =================================================================== ---- linux-2.4.24.orig/include/linux/kernel.h 2004-07-13 11:07:11.000000000 +0400 -+++ linux-2.4.24/include/linux/kernel.h 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/include/linux/kernel.h 2004-09-06 17:44:47.000000000 +0800 ++++ linux-2.4.24-b1_4/include/linux/kernel.h 2004-09-06 17:55:19.000000000 +0800 @@ -110,6 +110,8 @@ extern void dump_stack(void); @@ -139,10 +139,10 @@ Index: linux-2.4.24/include/linux/kernel.h #if DEBUG #define pr_debug(fmt,arg...) \ printk(KERN_DEBUG fmt,##arg) -Index: linux-2.4.24/include/linux/kallsyms.h +Index: linux-2.4.24-b1_4/include/linux/kallsyms.h =================================================================== ---- linux-2.4.24.orig/include/linux/kallsyms.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.24/include/linux/kallsyms.h 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/include/linux/kallsyms.h 2003-01-30 18:24:37.000000000 +0800 ++++ linux-2.4.24-b1_4/include/linux/kallsyms.h 2004-09-06 17:53:50.000000000 +0800 @@ -0,0 +1,164 @@ +/* kallsyms headers + Copyright 2000 Keith Owens <kaos@ocs.com.au> @@ -170,7 +170,7 @@ Index: linux-2.4.24/include/linux/kallsyms.h + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + -+#ident "$Id: kksymoops-2.4.24.vanilla.patch,v 1.6 2004/07/18 12:32:35 alex Exp $" ++#ident "$Id: kksymoops-2.4.24.vanilla.patch,v 1.7 2004/10/23 13:47:08 yury Exp $" + +#ifndef MODUTILS_KALLSYMS_H +#define MODUTILS_KALLSYMS_H 1 @@ -308,10 +308,10 @@ Index: linux-2.4.24/include/linux/kallsyms.h + +#endif /* kallsyms.h */ + -Index: linux-2.4.24/kernel/kksymoops.c +Index: linux-2.4.24-b1_4/kernel/kksymoops.c =================================================================== ---- linux-2.4.24.orig/kernel/kksymoops.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.24/kernel/kksymoops.c 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/kernel/kksymoops.c 2003-01-30 18:24:37.000000000 +0800 ++++ linux-2.4.24-b1_4/kernel/kksymoops.c 2004-09-06 17:53:50.000000000 +0800 @@ -0,0 +1,82 @@ +#include <linux/module.h> +#include <linux/string.h> @@ -395,19 +395,10 @@ Index: linux-2.4.24/kernel/kksymoops.c + printk("%s\n",modlist); +#endif +} -Index: linux-2.4.24/kernel/Makefile +Index: linux-2.4.24-b1_4/kernel/Makefile =================================================================== ---- linux-2.4.24.orig/kernel/Makefile 2001-09-17 08:22:40.000000000 +0400 -+++ linux-2.4.24/kernel/Makefile 2004-07-18 16:28:19.000000000 +0400 -@@ -11,7 +11,7 @@ - - export-objs = signal.o sys.o kmod.o context.o ksyms.o pm.o exec_domain.o printk.o - --obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o \ -+obj-y = sched.o dma.o fork.o exec_domain.o panic.o printk.o kksymoops.o kallsyms.o \ - module.o exit.o itimer.o info.o time.o softirq.o resource.o \ - sysctl.o acct.o capability.o ptrace.o timer.o user.o \ - signal.o sys.o kmod.o context.o +--- linux-2.4.24-b1_4.orig/kernel/Makefile 2001-09-17 12:22:40.000000000 +0800 ++++ linux-2.4.24-b1_4/kernel/Makefile 2004-09-06 17:56:17.000000000 +0800 @@ -29,4 +29,7 @@ CFLAGS_sched.o := $(PROFILING) -fno-omit-frame-pointer endif @@ -416,10 +407,10 @@ Index: linux-2.4.24/kernel/Makefile +obj-$(CONFIG_KALLSYMS) += kallsyms.o + include $(TOPDIR)/Rules.make -Index: linux-2.4.24/kernel/kallsyms.c +Index: linux-2.4.24-b1_4/kernel/kallsyms.c =================================================================== ---- linux-2.4.24.orig/kernel/kallsyms.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.24/kernel/kallsyms.c 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/kernel/kallsyms.c 2003-01-30 18:24:37.000000000 +0800 ++++ linux-2.4.24-b1_4/kernel/kallsyms.c 2004-09-06 17:53:50.000000000 +0800 @@ -0,0 +1,227 @@ +/* + * kksymoops.c: in-kernel printing of symbolic oopses and stack traces. @@ -648,10 +639,10 @@ Index: linux-2.4.24/kernel/kallsyms.c + } + return(1); +} -Index: linux-2.4.24/Makefile +Index: linux-2.4.24-b1_4/Makefile =================================================================== ---- linux-2.4.24.orig/Makefile 2004-07-13 11:07:12.000000000 +0400 -+++ linux-2.4.24/Makefile 2004-07-18 16:28:19.000000000 +0400 +--- linux-2.4.24-b1_4.orig/Makefile 2004-09-06 17:44:47.000000000 +0800 ++++ linux-2.4.24-b1_4/Makefile 2004-09-06 17:53:50.000000000 +0800 @@ -45,6 +45,7 @@ MAKEFILES = $(TOPDIR)/.config GENKSYMS = /sbin/genksyms diff --git a/lustre/kernel_patches/patches/kmem_cache_validate.patch b/lustre/kernel_patches/patches/kmem_cache_validate.patch deleted file mode 100644 index 52880d8223..0000000000 --- a/lustre/kernel_patches/patches/kmem_cache_validate.patch +++ /dev/null @@ -1,119 +0,0 @@ - - - - 0 files changed - ---- linux-2.4.18-17.8.0/arch/i386/mm/init.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 -+++ linux-2.4.18-17.8.0-zab/arch/i386/mm/init.c 2002-12-06 14:52:30.000000000 -0800 -@@ -43,6 +43,12 @@ unsigned long highstart_pfn, highend_pfn - static unsigned long totalram_pages; - static unsigned long totalhigh_pages; - -+struct page *check_get_page(unsigned long kaddr) -+{ -+#warning FIXME: Lustre team, is this solid? -+ return virt_to_page(kaddr); -+} -+ - int do_check_pgt_cache(int low, int high) - { - int freed = 0; ---- linux-2.4.18-17.8.0/arch/ia64/mm/init.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 -+++ linux-2.4.18-17.8.0-zab/arch/ia64/mm/init.c 2002-12-06 14:52:30.000000000 -0800 -@@ -37,6 +37,12 @@ unsigned long MAX_DMA_ADDRESS = PAGE_OFF - - static unsigned long totalram_pages; - -+struct page *check_get_page(unsigned long kaddr) -+{ -+#warning FIXME: Lustre team, is this solid? -+ return virt_to_page(kaddr); -+} -+ - int - do_check_pgt_cache (int low, int high) - { ---- linux-2.4.18-17.8.0/include/linux/slab.h~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 -+++ linux-2.4.18-17.8.0-zab/include/linux/slab.h 2002-12-06 14:52:30.000000000 -0800 -@@ -57,6 +57,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 void *kmalloc(size_t, int); - extern void kfree(const void *); ---- linux-2.4.18-17.8.0/kernel/ksyms.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 -+++ linux-2.4.18-17.8.0-zab/kernel/ksyms.c 2002-12-06 14:52:30.000000000 -0800 -@@ -119,6 +119,7 @@ EXPORT_SYMBOL(kmem_cache_destroy); - EXPORT_SYMBOL(kmem_cache_shrink); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); -+EXPORT_SYMBOL(kmem_cache_validate); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); ---- linux-2.4.18-17.8.0/mm/slab.c~kmem_cache_validate 2002-12-06 14:52:30.000000000 -0800 -+++ linux-2.4.18-17.8.0-zab/mm/slab.c 2002-12-06 14:52:30.000000000 -0800 -@@ -1208,6 +1208,59 @@ failed: - * Called with the cache-lock held. - */ - -+extern struct page *check_get_page(unsigned long kaddr); -+struct page *page_mem_map(struct page *page); -+static int kmem_check_cache_obj (kmem_cache_t * cachep, -+ slab_t *slabp, void * objp) -+{ -+ int i; -+ unsigned int objnr; -+ -+#if DEBUG -+ if (cachep->flags & SLAB_RED_ZONE) { -+ objp -= BYTES_PER_WORD; -+ if ( *(unsigned long *)objp != RED_MAGIC2) -+ /* Either write before start, or a double free. */ -+ return 0; -+ if (*(unsigned long *)(objp+cachep->objsize - -+ BYTES_PER_WORD) != RED_MAGIC2) -+ /* Either write past end, or a double free. */ -+ return 0; -+ } -+#endif -+ -+ objnr = (objp-slabp->s_mem)/cachep->objsize; -+ if (objnr >= cachep->num) -+ return 0; -+ if (objp != slabp->s_mem + objnr*cachep->objsize) -+ return 0; -+ -+ /* Check slab's freelist to see if this obj is there. */ -+ for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) { -+ if (i == objnr) -+ return 0; -+ } -+ return 1; -+} -+ -+ -+int kmem_cache_validate(kmem_cache_t *cachep, void *objp) -+{ -+ struct page *page = check_get_page((unsigned long)objp); -+ -+ if (!VALID_PAGE(page)) -+ return 0; -+ -+ if (!PageSlab(page)) -+ return 0; -+ -+ /* XXX check for freed slab objects ? */ -+ if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp)) -+ return 0; -+ -+ return (cachep == GET_PAGE_CACHE(page)); -+} -+ - #if DEBUG - static int kmem_extra_free_checks (kmem_cache_t * cachep, - slab_t *slabp, void * objp) - -_ diff --git a/lustre/kernel_patches/patches/kmem_cache_validate_2.4.20-rh.patch b/lustre/kernel_patches/patches/kmem_cache_validate_2.4.20-rh.patch deleted file mode 100644 index 811382803d..0000000000 --- a/lustre/kernel_patches/patches/kmem_cache_validate_2.4.20-rh.patch +++ /dev/null @@ -1,124 +0,0 @@ - - - - arch/i386/mm/init.c | 6 +++++ - arch/ia64/mm/init.c | 6 +++++ - include/linux/slab.h | 1 - kernel/ksyms.c | 1 - mm/slab.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 5 files changed, 67 insertions(+) - ---- rh-2.4.20/arch/i386/mm/init.c~kmem_cache_validate_2.4.20-rh 2003-04-11 14:05:09.000000000 +0800 -+++ rh-2.4.20-root/arch/i386/mm/init.c 2003-04-13 10:51:58.000000000 +0800 -@@ -43,6 +43,12 @@ unsigned long highstart_pfn, highend_pfn - static unsigned long totalram_pages; - static unsigned long totalhigh_pages; - -+struct page *check_get_page(unsigned long kaddr) -+{ -+#warning FIXME: Lustre team, is this solid? -+ return virt_to_page(kaddr); -+} -+ - int do_check_pgt_cache(int low, int high) - { - return 0; /* FIXME! */ ---- rh-2.4.20/arch/ia64/mm/init.c~kmem_cache_validate_2.4.20-rh 2003-04-11 14:04:43.000000000 +0800 -+++ rh-2.4.20-root/arch/ia64/mm/init.c 2003-04-13 10:51:58.000000000 +0800 -@@ -45,6 +45,12 @@ unsigned long vmalloc_end = VMALLOC_END_ - static struct page *vmem_map; - static unsigned long num_dma_physpages; - -+struct page *check_get_page(unsigned long kaddr) -+{ -+#warning FIXME: Lustre team, is this solid? -+ return virt_to_page(kaddr); -+} -+ - int - do_check_pgt_cache (int low, int high) - { ---- rh-2.4.20/include/linux/slab.h~kmem_cache_validate_2.4.20-rh 2003-04-12 15:46:39.000000000 +0800 -+++ rh-2.4.20-root/include/linux/slab.h 2003-04-13 10:53:00.000000000 +0800 -@@ -57,6 +57,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); ---- rh-2.4.20/kernel/ksyms.c~kmem_cache_validate_2.4.20-rh 2003-04-12 16:15:26.000000000 +0800 -+++ rh-2.4.20-root/kernel/ksyms.c 2003-04-13 10:54:10.000000000 +0800 -@@ -123,6 +123,7 @@ EXPORT_SYMBOL(kmem_cache_destroy); - EXPORT_SYMBOL(kmem_cache_shrink); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); -+EXPORT_SYMBOL(kmem_cache_validate); - EXPORT_SYMBOL(kmem_cache_size); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); ---- rh-2.4.20/mm/slab.c~kmem_cache_validate_2.4.20-rh 2003-04-11 14:04:56.000000000 +0800 -+++ rh-2.4.20-root/mm/slab.c 2003-04-13 10:51:58.000000000 +0800 -@@ -1208,6 +1208,59 @@ failed: - * Called with the cache-lock held. - */ - -+extern struct page *check_get_page(unsigned long kaddr); -+struct page *page_mem_map(struct page *page); -+static int kmem_check_cache_obj (kmem_cache_t * cachep, -+ slab_t *slabp, void * objp) -+{ -+ int i; -+ unsigned int objnr; -+ -+#if DEBUG -+ if (cachep->flags & SLAB_RED_ZONE) { -+ objp -= BYTES_PER_WORD; -+ if ( *(unsigned long *)objp != RED_MAGIC2) -+ /* Either write before start, or a double free. */ -+ return 0; -+ if (*(unsigned long *)(objp+cachep->objsize - -+ BYTES_PER_WORD) != RED_MAGIC2) -+ /* Either write past end, or a double free. */ -+ return 0; -+ } -+#endif -+ -+ objnr = (objp-slabp->s_mem)/cachep->objsize; -+ if (objnr >= cachep->num) -+ return 0; -+ if (objp != slabp->s_mem + objnr*cachep->objsize) -+ return 0; -+ -+ /* Check slab's freelist to see if this obj is there. */ -+ for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) { -+ if (i == objnr) -+ return 0; -+ } -+ return 1; -+} -+ -+ -+int kmem_cache_validate(kmem_cache_t *cachep, void *objp) -+{ -+ struct page *page = check_get_page((unsigned long)objp); -+ -+ if (!VALID_PAGE(page)) -+ return 0; -+ -+ if (!PageSlab(page)) -+ return 0; -+ -+ /* XXX check for freed slab objects ? */ -+ if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp)) -+ return 0; -+ -+ return (cachep == GET_PAGE_CACHE(page)); -+} -+ - #if DEBUG - static int kmem_extra_free_checks (kmem_cache_t * cachep, - slab_t *slabp, void * objp) - -_ diff --git a/lustre/kernel_patches/patches/kmem_cache_validate_2.4.20.patch b/lustre/kernel_patches/patches/kmem_cache_validate_2.4.20.patch deleted file mode 100644 index e802312e68..0000000000 --- a/lustre/kernel_patches/patches/kmem_cache_validate_2.4.20.patch +++ /dev/null @@ -1,116 +0,0 @@ - 0 files changed - ---- linux-2.4.20-8/arch/ia64/mm/init.c~kmem_cache_validate_2.4.20 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-8-root/arch/ia64/mm/init.c 2003-06-01 01:44:13.000000000 +0800 -@@ -45,6 +45,12 @@ static struct page *vmem_map; - static unsigned long num_dma_physpages; - #endif - -+struct page *check_get_page(unsigned long kaddr) -+{ -+#warning FIXME: Lustre team, is this solid? -+ return virt_to_page(kaddr); -+} -+ - int - do_check_pgt_cache (int low, int high) - { ---- linux-2.4.20-8/include/linux/slab.h~kmem_cache_validate_2.4.20 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-8-root/include/linux/slab.h 2003-06-01 01:44:13.000000000 +0800 -@@ -56,6 +56,7 @@ extern kmem_cache_t *kmem_cache_create(c - extern int kmem_cache_destroy(kmem_cache_t *); - extern int kmem_cache_shrink(kmem_cache_t *); - extern void *kmem_cache_alloc(kmem_cache_t *, int); -+extern int kmem_cache_validate(kmem_cache_t *cachep, void *objp); - extern void kmem_cache_free(kmem_cache_t *, void *); - extern unsigned int kmem_cache_size(kmem_cache_t *); - ---- linux-2.4.20-8/kernel/ksyms.c~kmem_cache_validate_2.4.20 2003-06-01 01:44:11.000000000 +0800 -+++ linux-2.4.20-8-root/kernel/ksyms.c 2003-06-01 01:44:13.000000000 +0800 -@@ -103,6 +103,7 @@ EXPORT_SYMBOL(kmem_find_general_cachep); - EXPORT_SYMBOL(kmem_cache_create); - EXPORT_SYMBOL(kmem_cache_destroy); - EXPORT_SYMBOL(kmem_cache_shrink); -+EXPORT_SYMBOL(kmem_cache_validate); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); - EXPORT_SYMBOL(kmem_cache_size); ---- linux-2.4.20-8/mm/slab.c~kmem_cache_validate_2.4.20 2003-06-01 01:44:08.000000000 +0800 -+++ linux-2.4.20-8-root/mm/slab.c 2003-06-01 01:44:13.000000000 +0800 -@@ -1205,6 +1205,59 @@ failed: - * Called with the cache-lock held. - */ - -+extern struct page *check_get_page(unsigned long kaddr); -+struct page *page_mem_map(struct page *page); -+static int kmem_check_cache_obj (kmem_cache_t * cachep, -+ slab_t *slabp, void * objp) -+{ -+ int i; -+ unsigned int objnr; -+ -+#if DEBUG -+ if (cachep->flags & SLAB_RED_ZONE) { -+ objp -= BYTES_PER_WORD; -+ if ( *(unsigned long *)objp != RED_MAGIC2) -+ /* Either write before start, or a double free. */ -+ return 0; -+ if (*(unsigned long *)(objp+cachep->objsize - -+ BYTES_PER_WORD) != RED_MAGIC2) -+ /* Either write past end, or a double free. */ -+ return 0; -+ } -+#endif -+ -+ objnr = (objp-slabp->s_mem)/cachep->objsize; -+ if (objnr >= cachep->num) -+ return 0; -+ if (objp != slabp->s_mem + objnr*cachep->objsize) -+ return 0; -+ -+ /* Check slab's freelist to see if this obj is there. */ -+ for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) { -+ if (i == objnr) -+ return 0; -+ } -+ return 1; -+} -+ -+ -+int kmem_cache_validate(kmem_cache_t *cachep, void *objp) -+{ -+ struct page *page = check_get_page((unsigned long)objp); -+ -+ if (!VALID_PAGE(page)) -+ return 0; -+ -+ if (!PageSlab(page)) -+ return 0; -+ -+ /* XXX check for freed slab objects ? */ -+ if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp)) -+ return 0; -+ -+ return (cachep == GET_PAGE_CACHE(page)); -+} -+ - #if DEBUG - static int kmem_extra_free_checks (kmem_cache_t * cachep, - slab_t *slabp, void * objp) ---- linux-2.4.20-8/arch/i386/mm/init.c~kmem_cache_validate_2.4.20 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-8-root/arch/i386/mm/init.c 2003-06-01 01:46:43.000000000 +0800 -@@ -43,6 +43,12 @@ unsigned long highstart_pfn, highend_pfn - static unsigned long totalram_pages; - static unsigned long totalhigh_pages; - -+struct page *check_get_page(unsigned long kaddr) -+{ -+#warning FIXME: Lustre team, is this solid? -+ return virt_to_page(kaddr); -+} -+ - int do_check_pgt_cache(int low, int high) - { - int freed = 0; - -_ diff --git a/lustre/kernel_patches/patches/kmem_cache_validate_hp.patch b/lustre/kernel_patches/patches/kmem_cache_validate_hp.patch deleted file mode 100644 index aa5cfbba49..0000000000 --- a/lustre/kernel_patches/patches/kmem_cache_validate_hp.patch +++ /dev/null @@ -1,121 +0,0 @@ - arch/i386/mm/init.c | 6 +++++ - arch/ia64/mm/init.c | 6 +++++ - include/linux/slab.h | 1 - kernel/ksyms.c | 1 - mm/slab.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++ - 5 files changed, 67 insertions(+) - ---- linux/arch/ia64/mm/init.c~kmem_cache_validate_hp 2003-04-11 14:24:25.000000000 +0800 -+++ linux-root/arch/ia64/mm/init.c 2003-05-16 20:03:56.000000000 +0800 -@@ -45,6 +45,12 @@ unsigned long vmalloc_end = VMALLOC_END_ - static struct page *vmem_map; - static unsigned long num_dma_physpages; - -+struct page *check_get_page(unsigned long kaddr) -+{ -+#warning FIXME: Lustre team, is this solid? -+ return virt_to_page(kaddr); -+} -+ - int - do_check_pgt_cache (int low, int high) - { ---- linux/include/linux/slab.h~kmem_cache_validate_hp 2002-11-29 07:53:15.000000000 +0800 -+++ linux-root/include/linux/slab.h 2003-05-16 20:03:56.000000000 +0800 -@@ -56,6 +56,7 @@ extern kmem_cache_t *kmem_cache_create(c - extern int kmem_cache_destroy(kmem_cache_t *); - extern int kmem_cache_shrink(kmem_cache_t *); - extern void *kmem_cache_alloc(kmem_cache_t *, int); -+extern int kmem_cache_validate(kmem_cache_t *cachep, void *objp); - extern void kmem_cache_free(kmem_cache_t *, void *); - extern unsigned int kmem_cache_size(kmem_cache_t *); - ---- linux/kernel/ksyms.c~kmem_cache_validate_hp 2003-05-16 20:03:55.000000000 +0800 -+++ linux-root/kernel/ksyms.c 2003-05-16 20:03:56.000000000 +0800 -@@ -119,6 +119,7 @@ EXPORT_SYMBOL(kmem_find_general_cachep); - EXPORT_SYMBOL(kmem_cache_create); - EXPORT_SYMBOL(kmem_cache_destroy); - EXPORT_SYMBOL(kmem_cache_shrink); -+EXPORT_SYMBOL(kmem_cache_validate); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); - EXPORT_SYMBOL(kmem_cache_size); ---- linux/mm/slab.c~kmem_cache_validate_hp 2002-11-29 07:53:15.000000000 +0800 -+++ linux-root/mm/slab.c 2003-05-16 20:03:56.000000000 +0800 -@@ -1205,6 +1205,59 @@ failed: - * Called with the cache-lock held. - */ - -+extern struct page *check_get_page(unsigned long kaddr); -+struct page *page_mem_map(struct page *page); -+static int kmem_check_cache_obj (kmem_cache_t * cachep, -+ slab_t *slabp, void * objp) -+{ -+ int i; -+ unsigned int objnr; -+ -+#if DEBUG -+ if (cachep->flags & SLAB_RED_ZONE) { -+ objp -= BYTES_PER_WORD; -+ if ( *(unsigned long *)objp != RED_MAGIC2) -+ /* Either write before start, or a double free. */ -+ return 0; -+ if (*(unsigned long *)(objp+cachep->objsize - -+ BYTES_PER_WORD) != RED_MAGIC2) -+ /* Either write past end, or a double free. */ -+ return 0; -+ } -+#endif -+ -+ objnr = (objp-slabp->s_mem)/cachep->objsize; -+ if (objnr >= cachep->num) -+ return 0; -+ if (objp != slabp->s_mem + objnr*cachep->objsize) -+ return 0; -+ -+ /* Check slab's freelist to see if this obj is there. */ -+ for (i = slabp->free; i != BUFCTL_END; i = slab_bufctl(slabp)[i]) { -+ if (i == objnr) -+ return 0; -+ } -+ return 1; -+} -+ -+ -+int kmem_cache_validate(kmem_cache_t *cachep, void *objp) -+{ -+ struct page *page = check_get_page((unsigned long)objp); -+ -+ if (!VALID_PAGE(page)) -+ return 0; -+ -+ if (!PageSlab(page)) -+ return 0; -+ -+ /* XXX check for freed slab objects ? */ -+ if (!kmem_check_cache_obj(cachep, GET_PAGE_SLAB(page), objp)) -+ return 0; -+ -+ return (cachep == GET_PAGE_CACHE(page)); -+} -+ - #if DEBUG - static int kmem_extra_free_checks (kmem_cache_t * cachep, - slab_t *slabp, void * objp) ---- linux/arch/i386/mm/init.c~kmem_cache_validate_hp 2003-05-16 20:03:22.000000000 +0800 -+++ linux-root/arch/i386/mm/init.c 2003-05-16 20:06:16.000000000 +0800 -@@ -42,6 +42,12 @@ mmu_gather_t mmu_gathers[NR_CPUS]; - unsigned long highstart_pfn, highend_pfn; - static unsigned long totalram_pages; - static unsigned long totalhigh_pages; -+ -+struct page *check_get_page(unsigned long kaddr) -+{ -+#warning FIXME: Lustre team, is this solid? -+ return virt_to_page(kaddr); -+} - - int do_check_pgt_cache(int low, int high) - { - -_ diff --git a/lustre/kernel_patches/patches/linux-2.4.19-pre1-xattr-0.8.54.patch b/lustre/kernel_patches/patches/linux-2.4.19-pre1-xattr-0.8.54.patch deleted file mode 100644 index e69406862f..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.19-pre1-xattr-0.8.54.patch +++ /dev/null @@ -1,6045 +0,0 @@ - Documentation/Configure.help | 66 ++ - arch/alpha/defconfig | 7 - arch/alpha/kernel/entry.S | 12 - arch/arm/defconfig | 7 - arch/arm/kernel/calls.S | 24 - arch/i386/defconfig | 7 - arch/ia64/defconfig | 7 - arch/ia64/kernel/entry.S | 24 - arch/m68k/defconfig | 7 - arch/mips/defconfig | 7 - arch/mips64/defconfig | 7 - arch/ppc/defconfig | 14 - arch/ppc64/kernel/misc.S | 2 - arch/s390/defconfig | 7 - arch/s390/kernel/entry.S | 24 - arch/s390x/defconfig | 7 - arch/s390x/kernel/entry.S | 24 - arch/s390x/kernel/wrapper32.S | 92 +++ - arch/sparc/defconfig | 7 - arch/sparc/kernel/systbls.S | 10 - arch/sparc64/defconfig | 7 - arch/sparc64/kernel/systbls.S | 20 - fs/Config.in | 14 - fs/Makefile | 3 - fs/ext2/Makefile | 4 - fs/ext2/file.c | 5 - fs/ext2/ialloc.c | 2 - fs/ext2/inode.c | 34 - - fs/ext2/namei.c | 14 - fs/ext2/super.c | 29 - fs/ext2/symlink.c | 14 - fs/ext2/xattr.c | 1212 +++++++++++++++++++++++++++++++++++++++++ - fs/ext2/xattr_user.c | 103 +++ - fs/ext3/Makefile | 10 - fs/ext3/file.c | 5 - fs/ext3/ialloc.c | 2 - fs/ext3/inode.c | 35 - - fs/ext3/namei.c | 21 - fs/ext3/super.c | 36 + - fs/ext3/symlink.c | 14 - fs/ext3/xattr.c | 1225 ++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/xattr_user.c | 111 +++ - fs/jfs/jfs_xattr.h | 6 - fs/jfs/xattr.c | 6 - fs/mbcache.c | 648 ++++++++++++++++++++++ - include/asm-arm/unistd.h | 2 - include/asm-ia64/unistd.h | 13 - include/asm-ppc64/unistd.h | 2 - include/asm-s390/unistd.h | 15 - include/asm-s390x/unistd.h | 15 - include/asm-sparc/unistd.h | 24 - include/asm-sparc64/unistd.h | 24 - include/linux/cache_def.h | 15 - include/linux/errno.h | 4 - include/linux/ext2_fs.h | 31 - - include/linux/ext2_xattr.h | 157 +++++ - include/linux/ext3_fs.h | 31 - - include/linux/ext3_jbd.h | 8 - include/linux/ext3_xattr.h | 157 +++++ - include/linux/fs.h | 2 - include/linux/mbcache.h | 69 ++ - kernel/ksyms.c | 4 - mm/vmscan.c | 35 + - fs/ext3/ext3-exports.c | 14 + - 64 files changed, 4355 insertions(+), 195 deletions(-) - -Index: linux-2.4.19-pre1/Documentation/Configure.help -=================================================================== ---- linux-2.4.19-pre1.orig/Documentation/Configure.help 2004-01-14 01:11:29.000000000 +0300 -+++ linux-2.4.19-pre1/Documentation/Configure.help 2004-01-14 01:11:49.000000000 +0300 -@@ -14035,6 +14035,39 @@ - be compiled as a module, and so this could be dangerous. Most - everyone wants to say Y here. - -+Ext2 extended attributes -+CONFIG_EXT2_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 extended attribute block sharing -+CONFIG_EXT2_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext2 extended user attributes -+CONFIG_EXT2_FS_XATTR_USER -+ This option enables extended user attributes on ext2. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 trusted extended attributes -+CONFIG_EXT2_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext2 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Ext3 journalling file system support (EXPERIMENTAL) - CONFIG_EXT3_FS - This is the journalling version of the Second extended file system -@@ -14067,6 +14100,39 @@ - of your root partition (the one containing the directory /) cannot - be compiled as a module, and so this may be dangerous. - -+Ext3 extended attributes -+CONFIG_EXT3_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 extended attribute block sharing -+CONFIG_EXT3_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext3 extended user attributes -+CONFIG_EXT3_FS_XATTR_USER -+ This option enables extended user attributes on ext3. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 trusted extended attributes -+CONFIG_EXT3_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext3 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Journal Block Device support (JBD for ext3) (EXPERIMENTAL) - CONFIG_JBD - This is a generic journalling layer for block devices. It is -Index: linux-2.4.19-pre1/arch/alpha/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/alpha/defconfig 2001-11-20 02:19:42.000000000 +0300 -+++ linux-2.4.19-pre1/arch/alpha/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ALPHA=y - # CONFIG_UID16 is not set - # CONFIG_RWSEM_GENERIC_SPINLOCK is not set -Index: linux-2.4.19-pre1/arch/alpha/kernel/entry.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/alpha/kernel/entry.S 2001-11-10 00:45:35.000000000 +0300 -+++ linux-2.4.19-pre1/arch/alpha/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 -@@ -1148,3 +1148,16 @@ - .quad sys_gettid - .quad sys_readahead - .quad sys_ni_syscall /* 380, sys_security */ -+ .quad sys_ni_syscall /* 381, sys_tkill */ -+ .quad sys_setxattr -+ .quad sys_lsetxattr -+ .quad sys_fsetxattr -+ .quad sys_getxattr /* 385 */ -+ .quad sys_lgetxattr -+ .quad sys_fgetxattr -+ .quad sys_listxattr -+ .quad sys_llistxattr -+ .quad sys_flistxattr /* 390 */ -+ .quad sys_removexattr -+ .quad sys_lremovexattr -+ .quad sys_fremovexattr -Index: linux-2.4.19-pre1/arch/arm/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/arm/defconfig 2001-05-20 04:43:05.000000000 +0400 -+++ linux-2.4.19-pre1/arch/arm/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ARM=y - # CONFIG_EISA is not set - # CONFIG_SBUS is not set -Index: linux-2.4.19-pre1/arch/arm/kernel/calls.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/arm/kernel/calls.S 2001-10-08 21:39:18.000000000 +0400 -+++ linux-2.4.19-pre1/arch/arm/kernel/calls.S 2004-01-14 01:11:49.000000000 +0300 -@@ -236,6 +236,22 @@ - .long SYMBOL_NAME(sys_mincore) - /* 220 */ .long SYMBOL_NAME(sys_madvise) - .long SYMBOL_NAME(sys_fcntl64) -+ .long SYMBOL_NAME(sys_ni_syscall) /* TUX */ -+ .long SYMBOL_NAME(sys_ni_syscall) /* Security */ -+ .long SYMBOL_NAME(sys_gettid) -+ /* 225 */ .long SYMBOL_NAME(sys_readahead) -+ .long SYMBOL_NAME(sys_setxattr) -+ .long SYMBOL_NAME(sys_lsetxattr) -+ .long SYMBOL_NAME(sys_fsetxattr) -+ .long SYMBOL_NAME(sys_getxattr) -+/* 230 */ .long SYMBOL_NAME(sys_lgetxattr) -+ .long SYMBOL_NAME(sys_fgetxattr) -+ .long SYMBOL_NAME(sys_listxattr) -+ .long SYMBOL_NAME(sys_llistxattr) -+ .long SYMBOL_NAME(sys_flistxattr) -+/* 235 */ .long SYMBOL_NAME(sys_removexattr) -+ .long SYMBOL_NAME(sys_lremovexattr) -+ .long SYMBOL_NAME(sys_fremovexattr) - __syscall_end: - - .rept NR_syscalls - (__syscall_end - __syscall_start) / 4 -Index: linux-2.4.19-pre1/arch/i386/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/defconfig 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_X86=y - CONFIG_ISA=y - # CONFIG_SBUS is not set -Index: linux-2.4.19-pre1/arch/i386/kernel/entry.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/i386/kernel/entry.S 2004-01-14 01:11:46.000000000 +0300 -+++ linux-2.4.19-pre1/arch/i386/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 -@@ -619,18 +619,18 @@ - .long SYMBOL_NAME(sys_ni_syscall) /* Reserved for Security */ - .long SYMBOL_NAME(sys_gettid) - .long SYMBOL_NAME(sys_readahead) /* 225 */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for setxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for lsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for getxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* 230 reserved for lgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for listxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for llistxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for flistxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* 235 reserved for removexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for lremovexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* reserved for fremovexattr */ -+ .long SYMBOL_NAME(sys_setxattr) -+ .long SYMBOL_NAME(sys_lsetxattr) -+ .long SYMBOL_NAME(sys_fsetxattr) -+ .long SYMBOL_NAME(sys_getxattr) -+ .long SYMBOL_NAME(sys_lgetxattr) /* 230 */ -+ .long SYMBOL_NAME(sys_fgetxattr) -+ .long SYMBOL_NAME(sys_listxattr) -+ .long SYMBOL_NAME(sys_llistxattr) -+ .long SYMBOL_NAME(sys_flistxattr) -+ .long SYMBOL_NAME(sys_removexattr) /* 235 */ -+ .long SYMBOL_NAME(sys_lremovexattr) -+ .long SYMBOL_NAME(sys_fremovexattr) - - .rept NR_syscalls-(.-sys_call_table)/4 - .long SYMBOL_NAME(sys_ni_syscall) -Index: linux-2.4.19-pre1/arch/ia64/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/ia64/defconfig 2001-11-10 01:26:17.000000000 +0300 -+++ linux-2.4.19-pre1/arch/ia64/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options -Index: linux-2.4.19-pre1/arch/ia64/kernel/entry.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/ia64/kernel/entry.S 2001-11-10 01:26:17.000000000 +0300 -+++ linux-2.4.19-pre1/arch/ia64/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 -@@ -1130,18 +1130,18 @@ - data8 sys_getdents64 - data8 sys_getunwind // 1215 - data8 sys_readahead -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall // 1220 -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall // 1225 -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -+ data8 sys_setxattr -+ data8 sys_lsetxattr -+ data8 sys_fsetxattr -+ data8 sys_getxattr // 1220 -+ data8 sys_lgetxattr -+ data8 sys_fgetxattr -+ data8 sys_listxattr -+ data8 sys_llistxattr -+ data8 sys_flistxattr // 1225 -+ data8 sys_removexattr -+ data8 sys_lremovexattr -+ data8 sys_fremovexattr - data8 ia64_ni_syscall - data8 ia64_ni_syscall // 1230 - data8 ia64_ni_syscall -Index: linux-2.4.19-pre1/arch/m68k/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/m68k/defconfig 2000-06-19 23:56:08.000000000 +0400 -+++ linux-2.4.19-pre1/arch/m68k/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_UID16=y - - # -Index: linux-2.4.19-pre1/arch/mips/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/mips/defconfig 2001-09-09 21:43:02.000000000 +0400 -+++ linux-2.4.19-pre1/arch/mips/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - # CONFIG_SMP is not set - -Index: linux-2.4.19-pre1/arch/mips64/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/mips64/defconfig 2001-09-09 21:43:02.000000000 +0400 -+++ linux-2.4.19-pre1/arch/mips64/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options -Index: linux-2.4.19-pre1/arch/ppc/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/ppc/defconfig 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/ppc/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_UID16 is not set - # CONFIG_RWSEM_GENERIC_SPINLOCK is not set - CONFIG_RWSEM_XCHGADD_ALGORITHM=y -Index: linux-2.4.19-pre1/arch/s390/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/s390/defconfig 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set -Index: linux-2.4.19-pre1/arch/s390/kernel/entry.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/s390/kernel/entry.S 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 -@@ -599,8 +599,19 @@ - .long sys_fcntl64 - .long sys_ni_syscall /* 222 - reserved for posix_acl */ - .long sys_ni_syscall /* 223 - reserved for posix_acl */ -- .long sys_ni_syscall /* 224 - reserved for posix_acl */ -- .rept 255-224 -+ .long sys_setxattr -+ .long sys_lsetxattr /* 225 */ -+ .long sys_fsetxattr -+ .long sys_getxattr -+ .long sys_lgetxattr -+ .long sys_fgetxattr -+ .long sys_listxattr /* 230 */ -+ .long sys_llistxattr -+ .long sys_flistxattr -+ .long sys_removexattr -+ .long sys_lremovexattr -+ .long sys_fremovexattr /* 235 */ -+ .rept 255-235 - .long sys_ni_syscall - .endr - -Index: linux-2.4.19-pre1/arch/s390x/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/s390x/defconfig 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390x/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set -Index: linux-2.4.19-pre1/arch/s390x/kernel/entry.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/s390x/kernel/entry.S 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390x/kernel/entry.S 2004-01-14 01:11:49.000000000 +0300 -@@ -632,8 +632,19 @@ - .long SYSCALL(sys_ni_syscall,sys32_fcntl64_wrapper) - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 222 - reserved for posix_acl */ - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 223 - reserved for posix_acl */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 224 - reserved for posix_acl */ -- .rept 255-224 -+ .long SYSCALL(sys_setxattr,sys32_setxattr_wrapper) -+ .long SYSCALL(sys_lsetxattr,sys32_lsetxattr_wrapper) /* 225 */ -+ .long SYSCALL(sys_fsetxattr,sys32_fsetxattr_wrapper) -+ .long SYSCALL(sys_getxattr,sys32_getxattr_wrapper) -+ .long SYSCALL(sys_lgetxattr,sys32_lgetxattr_wrapper) -+ .long SYSCALL(sys_fgetxattr,sys32_fgetxattr_wrapper) -+ .long SYSCALL(sys_listxattr,sys32_listxattr_wrapper) /* 230 */ -+ .long SYSCALL(sys_llistxattr,sys32_llistxattr_wrapper) -+ .long SYSCALL(sys_flistxattr,sys32_flistxattr_wrapper) -+ .long SYSCALL(sys_removexattr,sys32_removexattr_wrapper) -+ .long SYSCALL(sys_lremovexattr,sys32_lremovexattr_wrapper) -+ .long SYSCALL(sys_fremovexattr,sys32_fremovexattr_wrapper)/* 235 */ -+ .rept 255-235 - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) - .endr - -Index: linux-2.4.19-pre1/arch/s390x/kernel/wrapper32.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/s390x/kernel/wrapper32.S 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/s390x/kernel/wrapper32.S 2004-01-14 01:11:49.000000000 +0300 -@@ -1091,3 +1091,95 @@ - llgtr %r3,%r3 # struct stat64 * - llgfr %r4,%r4 # long - jg sys32_fstat64 # branch to system call -+ -+ .globl sys32_setxattr_wrapper -+sys32_setxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_setxattr -+ -+ .globl sys32_lsetxattr_wrapper -+sys32_lsetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_lsetxattr -+ -+ .globl sys32_fsetxattr_wrapper -+sys32_fsetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_fsetxattr -+ -+ .globl sys32_getxattr_wrapper -+sys32_getxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_getxattr -+ -+ .globl sys32_lgetxattr_wrapper -+sys32_lgetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_lgetxattr -+ -+ .globl sys32_fgetxattr_wrapper -+sys32_fgetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_fgetxattr -+ -+ .globl sys32_listxattr_wrapper -+sys32_listxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_listxattr -+ -+ .globl sys32_llistxattr_wrapper -+sys32_llistxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_llistxattr -+ -+ .globl sys32_flistxattr_wrapper -+sys32_flistxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_flistxattr -+ -+ .globl sys32_removexattr_wrapper -+sys32_removexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_removexattr -+ -+ .globl sys32_lremovexattr_wrapper -+sys32_lremovexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_lremovexattr -+ -+ .globl sys32_fremovexattr_wrapper -+sys32_fremovexattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ jg sys_fremovexattr -+ -+ -Index: linux-2.4.19-pre1/arch/sparc/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/sparc/defconfig 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/sparc/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_UID16=y - CONFIG_HIGHMEM=y - -Index: linux-2.4.19-pre1/arch/sparc/kernel/systbls.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/sparc/kernel/systbls.S 2001-10-21 21:36:54.000000000 +0400 -+++ linux-2.4.19-pre1/arch/sparc/kernel/systbls.S 2004-01-14 01:11:49.000000000 +0300 -@@ -51,11 +51,11 @@ - /*150*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - /*155*/ .long sys_fcntl64, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount - /*160*/ .long sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_nis_syscall --/*165*/ .long sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall --/*170*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents --/*175*/ .long sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_sigpending, sys_query_module --/*185*/ .long sys_setpgid, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_newuname -+/*165*/ .long sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_setxattr -+/*170*/ .long sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents -+/*175*/ .long sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_query_module -+/*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sys_newuname - /*190*/ .long sys_init_module, sys_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - /*195*/ .long sys_nis_syscall, sys_nis_syscall, sys_getppid, sparc_sigaction, sys_sgetmask - /*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, old_readdir -Index: linux-2.4.19-pre1/arch/sparc64/defconfig -=================================================================== ---- linux-2.4.19-pre1.orig/arch/sparc64/defconfig 2004-01-14 01:10:36.000000000 +0300 -+++ linux-2.4.19-pre1/arch/sparc64/defconfig 2004-01-14 01:11:49.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options -Index: linux-2.4.19-pre1/arch/sparc64/kernel/systbls.S -=================================================================== ---- linux-2.4.19-pre1.orig/arch/sparc64/kernel/systbls.S 2001-10-21 21:36:54.000000000 +0400 -+++ linux-2.4.19-pre1/arch/sparc64/kernel/systbls.S 2004-01-14 01:11:49.000000000 +0300 -@@ -52,11 +52,11 @@ - /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - .word sys32_fcntl64, sys_nis_syscall, sys32_statfs, sys32_fstatfs, sys_oldumount - /*160*/ .word sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_nis_syscall -- .word sys32_quotactl, sys_nis_syscall, sys32_mount, sys_ustat, sys_nis_syscall --/*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_getdents -- .word sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_sigpending, sys32_query_module -- .word sys_setpgid, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sparc64_newuname -+ .word sys32_quotactl, sys_nis_syscall, sys32_mount, sys_ustat, sys_setxattr -+/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys32_getdents -+ .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys32_sigpending, sys32_query_module -+ .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sparc64_newuname - /*190*/ .word sys32_init_module, sparc64_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - .word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys32_sigaction, sys_sgetmask - /*200*/ .word sys_ssetmask, sys_sigsuspend, sys32_newlstat, sys_uselib, old32_readdir -@@ -111,11 +111,11 @@ - /*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - .word sys_nis_syscall, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount - /*160*/ .word sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_utrap_install -- .word sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall --/*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents -- .word sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_query_module -- .word sys_setpgid, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sparc64_newuname -+ .word sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_setxattr -+/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents -+ .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_query_module -+ .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sparc64_newuname - /*190*/ .word sys_init_module, sparc64_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - .word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys_nis_syscall, sys_sgetmask - /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall -Index: linux-2.4.19-pre1/fs/Config.in -=================================================================== ---- linux-2.4.19-pre1.orig/fs/Config.in 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/Config.in 2004-01-14 01:11:49.000000000 +0300 -@@ -22,6 +22,11 @@ - dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL - - tristate 'Ext3 journalling file system support (EXPERIMENTAL)' CONFIG_EXT3_FS -+dep_mbool ' Ext3 extended attributes' CONFIG_EXT3_FS_XATTR $CONFIG_EXT3_FS -+dep_bool ' Ext3 extended attribute block sharing' \ -+ CONFIG_EXT3_FS_XATTR_SHARING $CONFIG_EXT3_FS_XATTR -+dep_bool ' Ext3 extended user attributes' \ -+ CONFIG_EXT3_FS_XATTR_USER $CONFIG_EXT3_FS_XATTR - # CONFIG_JBD could be its own option (even modular), but until there are - # other users than ext3, we will simply make it be the same as CONFIG_EXT3_FS - # dep_tristate ' Journal Block Device support (JBD for ext3)' CONFIG_JBD $CONFIG_EXT3_FS -@@ -77,6 +82,11 @@ - tristate 'ROM file system support' CONFIG_ROMFS_FS - - tristate 'Second extended fs support' CONFIG_EXT2_FS -+dep_mbool ' Ext2 extended attributes' CONFIG_EXT2_FS_XATTR $CONFIG_EXT2_FS -+dep_bool ' Ext2 extended attribute block sharing' \ -+ CONFIG_EXT2_FS_XATTR_SHARING $CONFIG_EXT2_FS_XATTR -+dep_bool ' Ext2 extended user attributes' \ -+ CONFIG_EXT2_FS_XATTR_USER $CONFIG_EXT2_FS_XATTR - - tristate 'System V/Xenix/V7/Coherent file system support' CONFIG_SYSV_FS - -@@ -156,6 +166,10 @@ - fi - fi - -+# Meta block cache for Extended Attributes (ext2/ext3) -+#tristate 'Meta block cache' CONFIG_FS_MBCACHE -+define_tristate CONFIG_FS_MBCACHE y -+ - mainmenu_option next_comment - comment 'Partition Types' - source fs/partitions/Config.in -Index: linux-2.4.19-pre1/fs/Makefile -=================================================================== ---- linux-2.4.19-pre1.orig/fs/Makefile 2004-01-14 01:11:49.000000000 +0300 -+++ linux-2.4.19-pre1/fs/Makefile 2004-01-14 01:11:49.000000000 +0300 -@@ -14,7 +14,7 @@ - super.o block_dev.o char_dev.o stat.o exec.o pipe.o namei.o \ - fcntl.o ioctl.o readdir.o select.o fifo.o locks.o \ - dcache.o inode.o attr.o bad_inode.o file.o iobuf.o dnotify.o \ -- filesystems.o namespace.o seq_file.o -+ filesystems.o namespace.o seq_file.o xattr.o - - ifeq ($(CONFIG_QUOTA),y) - obj-y += dquot.o -@@ -78,6 +78,9 @@ - - obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o - -+export-objs += mbcache.o -+obj-$(CONFIG_FS_MBCACHE) += mbcache.o -+ - # persistent filesystems - obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) - -Index: linux-2.4.19-pre1/fs/ext2/Makefile -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/Makefile 2001-10-11 19:05:18.000000000 +0400 -+++ linux-2.4.19-pre1/fs/ext2/Makefile 2004-01-14 01:11:49.000000000 +0300 -@@ -13,4 +13,8 @@ - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make -Index: linux-2.4.19-pre1/fs/ext2/file.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/file.c 2001-10-11 19:05:18.000000000 +0400 -+++ linux-2.4.19-pre1/fs/ext2/file.c 2004-01-14 01:11:49.000000000 +0300 -@@ -20,6 +20,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/sched.h> - - /* -@@ -51,4 +52,8 @@ - - struct inode_operations ext2_file_inode_operations = { - truncate: ext2_truncate, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.19-pre1/fs/ext2/ialloc.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/ialloc.c 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/ialloc.c 2004-01-14 01:11:49.000000000 +0300 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/locks.h> - #include <linux/quotaops.h> - -@@ -167,6 +168,7 @@ - */ - if (!is_bad_inode(inode)) { - /* Quota is already initialized in iput() */ -+ ext2_xattr_delete_inode(inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - } -Index: linux-2.4.19-pre1/fs/ext2/inode.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/inode.c 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/inode.c 2004-01-14 01:11:49.000000000 +0300 -@@ -39,6 +39,18 @@ - static int ext2_update_inode(struct inode * inode, int do_sync); - - /* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext2_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext2_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ -+/* - * Called at each iput() - */ - void ext2_put_inode (struct inode * inode) -@@ -53,9 +65,7 @@ - { - lock_kernel(); - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - inode->u.ext2_i.i_dtime = CURRENT_TIME; - mark_inode_dirty(inode); -@@ -800,6 +810,8 @@ - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext2_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -889,8 +901,7 @@ - unsigned long offset; - struct ext2_group_desc * gdp; - -- if ((inode->i_ino != EXT2_ROOT_INO && inode->i_ino != EXT2_ACL_IDX_INO && -- inode->i_ino != EXT2_ACL_DATA_INO && -+ if ((inode->i_ino != EXT2_ROOT_INO && - inode->i_ino < EXT2_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu(inode->i_sb->u.ext2_sb.s_es->s_inodes_count)) { - ext2_error (inode->i_sb, "ext2_read_inode", -@@ -975,10 +986,7 @@ - for (block = 0; block < EXT2_N_BLOCKS; block++) - inode->u.ext2_i.i_data[block] = raw_inode->i_block[block]; - -- if (inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext2_file_inode_operations; - inode->i_fop = &ext2_file_operations; - inode->i_mapping->a_ops = &ext2_aops; -@@ -987,15 +995,17 @@ - inode->i_fop = &ext2_dir_operations; - inode->i_mapping->a_ops = &ext2_aops; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext2_inode_is_fast_symlink(inode)) - inode->i_op = &ext2_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - } -- } else -+ } else { -+ inode->i_op = &ext2_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(raw_inode->i_block[0])); -+ } - brelse (bh); - inode->i_attr_flags = 0; - if (inode->u.ext2_i.i_flags & EXT2_SYNC_FL) { -Index: linux-2.4.19-pre1/fs/ext2/namei.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/namei.c 2001-10-04 09:57:36.000000000 +0400 -+++ linux-2.4.19-pre1/fs/ext2/namei.c 2004-01-14 01:11:49.000000000 +0300 -@@ -31,6 +31,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/pagemap.h> - - /* -@@ -136,7 +137,7 @@ - - if (l > sizeof (inode->u.ext2_i.i_data)) { - /* slow symlink */ -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - err = block_symlink(inode, symname, l); - if (err) -@@ -345,4 +346,15 @@ - rmdir: ext2_rmdir, - mknod: ext2_mknod, - rename: ext2_rename, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ -+struct inode_operations ext2_special_inode_operations = { -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.19-pre1/fs/ext2/super.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/super.c 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/super.c 2004-01-14 01:11:49.000000000 +0300 -@@ -21,6 +21,7 @@ - #include <linux/string.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -125,6 +126,7 @@ - int db_count; - int i; - -+ ext2_xattr_put_super(sb); - if (!(sb->s_flags & MS_RDONLY)) { - struct ext2_super_block *es = EXT2_SB(sb)->s_es; - -@@ -175,6 +177,13 @@ - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -424,6 +433,9 @@ - blocksize = BLOCK_SIZE; - - sb->u.ext2_sb.s_mount_opt = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ /* set_opt (sb->u.ext2_sb.s_mount_opt, XATTR_USER); */ -+#endif - if (!parse_options ((char *) data, &sb_block, &resuid, &resgid, - &sb->u.ext2_sb.s_mount_opt)) { - return NULL; -@@ -810,12 +822,27 @@ - - static int __init init_ext2_fs(void) - { -- return register_filesystem(&ext2_fs_type); -+ int error = init_ext2_xattr(); -+ if (error) -+ return error; -+ error = init_ext2_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext2_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext2_xattr_user(); -+fail: -+ exit_ext2_xattr(); -+ return error; - } - - static void __exit exit_ext2_fs(void) - { - unregister_filesystem(&ext2_fs_type); -+ exit_ext2_xattr_user(); -+ exit_ext2_xattr(); - } - - EXPORT_NO_SYMBOLS; -Index: linux-2.4.19-pre1/fs/ext2/symlink.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/symlink.c 2000-09-28 00:41:33.000000000 +0400 -+++ linux-2.4.19-pre1/fs/ext2/symlink.c 2004-01-14 01:11:49.000000000 +0300 -@@ -19,6 +19,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - - static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -32,7 +33,20 @@ - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext2_symlink_inode_operations = { -+ readlink: page_readlink, -+ follow_link: page_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ - struct inode_operations ext2_fast_symlink_inode_operations = { - readlink: ext2_readlink, - follow_link: ext2_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.19-pre1/fs/ext2/xattr.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/xattr.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/xattr.c 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,1212 @@ -+/* -+ * linux/fs/ext2/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT2_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT2_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext2_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+/* These symbols may be needed by a module. */ -+EXPORT_SYMBOL(ext2_xattr_register); -+EXPORT_SYMBOL(ext2_xattr_unregister); -+EXPORT_SYMBOL(ext2_xattr_get); -+EXPORT_SYMBOL(ext2_xattr_list); -+EXPORT_SYMBOL(ext2_xattr_set); -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext2_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext2_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT2_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext2_xattr_set2(struct inode *, struct buffer_head *, -+ struct ext2_xattr_header *); -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+static int ext2_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext2_xattr_cache_find(struct inode *, -+ struct ext2_xattr_header *); -+static void ext2_xattr_cache_remove(struct buffer_head *); -+static void ext2_xattr_rehash(struct ext2_xattr_header *, -+ struct ext2_xattr_entry *); -+ -+static struct mb_cache *ext2_xattr_cache; -+ -+#else -+# define ext2_xattr_cache_insert(bh) 0 -+# define ext2_xattr_cache_find(inode, header) NULL -+# define ext2_xattr_cache_remove(bh) while(0) {} -+# define ext2_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext2_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext2_xattr_sem); -+ -+static inline int -+ext2_xattr_new_block(struct inode *inode, int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block) + -+ EXT2_I(inode)->i_block_group * EXT2_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext2_new_block(inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext2_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext2_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext2_xattr_free_block(struct inode * inode, unsigned long block) -+{ -+ ext2_free_blocks(inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext2_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext2_xattr_free_block(inode, block) \ -+ ext2_free_blocks(inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext2_xattr_handler *ext2_xattr_handlers[EXT2_XATTR_INDEX_MAX]; -+rwlock_t ext2_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext2_xattr_register(int name_index, struct ext2_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ if (!ext2_xattr_handlers[name_index-1]) { -+ ext2_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext2_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext2_xattr_unregister(int name_index, struct ext2_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ ext2_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext2_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static struct ext2_xattr_handler * -+ext2_xattr_resolve_name(const char **name) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext2_handler_lock); -+ for (i=0; i<EXT2_XATTR_INDEX_MAX; i++) { -+ if (ext2_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext2_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext2_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext2_handler_lock); -+ return handler; -+} -+ -+static inline struct ext2_xattr_handler * -+ext2_xattr_handler(int name_index) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ read_lock(&ext2_handler_lock); -+ handler = ext2_xattr_handlers[name_index-1]; -+ read_unlock(&ext2_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext2_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext2_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT2_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT2_I(inode)->i_file_acl) -+ return 0; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT2_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext2_xattr_update_super_block(struct super_block *sb) -+{ -+ if (EXT2_HAS_COMPAT_FEATURE(sb, EXT2_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT2_SB(sb)->s_feature_compat |= EXT2_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT2_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT2_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ mark_buffer_dirty(EXT2_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext2_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_header *header = NULL; -+ struct ext2_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT2_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext2_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(sb, "ext2_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext2_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT2_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT2_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT2_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext2_xattr_cache_remove(bh); -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT2_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT2_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT2_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT2_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext2_xattr_set2(inode, bh, NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT2_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT2_XATTR_PAD, 0, -+ EXT2_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext2_xattr_rehash(header, here); -+ -+ error = ext2_xattr_set2(inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext2_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext2_xattr_set(): Update the file system. -+ */ -+static int -+ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, -+ struct ext2_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext2_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext2_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext2_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT2_I(inode)->i_file_acl != 0; -+ int block = ext2_xattr_new_block(inode, &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+ ext2_xattr_free_block(inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext2_xattr_cache_insert(new_bh); -+ -+ ext2_xattr_update_super_block(sb); -+ } -+ mark_buffer_dirty(new_bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &new_bh); -+ wait_on_buffer(new_bh); -+ error = -EIO; -+ if (buffer_req(new_bh) && !buffer_uptodate(new_bh)) -+ goto cleanup; -+ } -+ } -+ -+ /* Update the inode. */ -+ EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ if (IS_SYNC(inode)) { -+ error = ext2_sync_inode (inode); -+ if (error) -+ goto cleanup; -+ } else -+ mark_inode_dirty(inode); -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext2_xattr_free_block(inode, old_bh->b_blocknr); -+ mark_buffer_clean(old_bh); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext2_xattr_quota_free(inode); -+ mark_buffer_dirty(old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT2_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext2_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext2_xattr_cache_remove(bh); -+ ext2_xattr_free_block(inode, block); -+ bforget(bh); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ mark_buffer_dirty(bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &bh); -+ wait_on_buffer(bh); -+ } -+ ext2_xattr_quota_free(inode); -+ } -+ EXT2_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext2_xattr_sem); -+} -+ -+/* -+ * ext2_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ mb_cache_shrink(ext2_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+/* -+ * ext2_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext2_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext2_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext2_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext2_xattr_cmp(struct ext2_xattr_header *header1, -+ struct ext2_xattr_header *header2) -+{ -+ struct ext2_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT2_XATTR_NEXT(entry1); -+ entry2 = EXT2_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext2_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext2_xattr_cache_find(struct inode *inode, struct ext2_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext2_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT2_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT2_XATTR_REFCOUNT_MAX); -+ } else if (!ext2_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext2_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext2_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext2_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext2_xattr_hash_entry(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT2_XATTR_ROUND) >> EXT2_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext2_xattr_rehash(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ struct ext2_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext2_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT2_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext2_xattr(void) -+{ -+ ext2_xattr_cache = mb_cache_create("ext2_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext2_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+ mb_cache_destroy(ext2_xattr_cache); -+} -+ -+#else /* CONFIG_EXT2_FS_XATTR_SHARING */ -+ -+int __init -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT2_FS_XATTR_SHARING */ -Index: linux-2.4.19-pre1/fs/ext2/xattr_user.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext2/xattr_user.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext2/xattr_user.c 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,103 @@ -+/* -+ * linux/fs/ext2/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+ -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+# include <linux/ext2_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext2_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext2_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_get(inode, EXT2_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext2_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_set(inode, EXT2_XATTR_INDEX_USER, name, -+ value, size, flags); -+} -+ -+struct ext2_xattr_handler ext2_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext2_xattr_user_list, -+ get: ext2_xattr_user_get, -+ set: ext2_xattr_user_set, -+}; -+ -+int __init -+init_ext2_xattr_user(void) -+{ -+ return ext2_xattr_register(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -+ -+void -+exit_ext2_xattr_user(void) -+{ -+ ext2_xattr_unregister(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -Index: linux-2.4.19-pre1/fs/ext3/Makefile -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/Makefile 2004-01-14 01:11:49.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/Makefile 2004-01-14 01:11:49.000000000 +0300 -@@ -1,5 +1,5 @@ - # --# Makefile for the linux ext2-filesystem routines. -+# Makefile for the linux ext3-filesystem routines. - # - # Note! Dependencies are done automagically by 'make dep', which also - # removes any old dependencies. DON'T put your own dependencies here -@@ -9,10 +9,14 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make -Index: linux-2.4.19-pre1/fs/ext3/file.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/file.c 2004-01-14 01:11:49.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/file.c 2004-01-14 01:11:49.000000000 +0300 -@@ -23,6 +23,7 @@ - #include <linux/locks.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - #include <linux/ext3_jbd.h> - #include <linux/smp_lock.h> - -@@ -93,5 +94,9 @@ - struct inode_operations ext3_file_inode_operations = { - truncate: ext3_truncate, /* BKL held */ - setattr: ext3_setattr, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; - -Index: linux-2.4.19-pre1/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/ialloc.c 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/ialloc.c 2004-01-14 01:11:49.000000000 +0300 -@@ -17,6 +17,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/stat.h> - #include <linux/string.h> - #include <linux/locks.h> -@@ -216,6 +217,7 @@ - * as writing the quota to disk may need the lock as well. - */ - DQUOT_INIT(inode); -+ ext3_xattr_delete_inode(handle, inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - -Index: linux-2.4.19-pre1/fs/ext3/inode.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/inode.c 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/inode.c 2004-01-14 01:11:49.000000000 +0300 -@@ -39,6 +39,18 @@ - */ - #undef SEARCH_FROM_ZERO - -+/* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext3_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext3_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ - /* The ext3 forget function must perform a revoke if we are freeing data - * which has been journaled. Metadata (eg. indirect blocks) must be - * revoked in all cases. -@@ -48,7 +60,7 @@ - * still needs to be revoked. - */ - --static int ext3_forget(handle_t *handle, int is_metadata, -+int ext3_forget(handle_t *handle, int is_metadata, - struct inode *inode, struct buffer_head *bh, - int blocknr) - { -@@ -164,9 +176,7 @@ - { - handle_t *handle; - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - - lock_kernel(); -@@ -1845,6 +1855,8 @@ - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext3_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -1992,8 +2004,6 @@ - struct ext3_group_desc * gdp; - - if ((inode->i_ino != EXT3_ROOT_INO && -- inode->i_ino != EXT3_ACL_IDX_INO && -- inode->i_ino != EXT3_ACL_DATA_INO && - inode->i_ino != EXT3_JOURNAL_INO && - inode->i_ino < EXT3_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu( -@@ -2120,10 +2130,7 @@ - - brelse (iloc.bh); - -- if (inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; - inode->i_mapping->a_ops = &ext3_aops; -@@ -2131,15 +2138,17 @@ - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - } -- } else -+ } else { -+ inode->i_op = &ext3_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(iloc.raw_inode->i_block[0])); -+ } - /* inode->i_attr_flags = 0; unused */ - if (inode->u.ext3_i.i_flags & EXT3_SYNC_FL) { - /* inode->i_attr_flags |= ATTR_FLAG_SYNCRONOUS; unused */ -Index: linux-2.4.19-pre1/fs/ext3/namei.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/namei.c 2004-01-14 01:11:49.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/namei.c 2004-01-14 01:11:49.000000000 +0300 -@@ -29,6 +29,7 @@ - #include <linux/sched.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/fcntl.h> - #include <linux/stat.h> - #include <linux/string.h> -@@ -1612,7 +1613,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR); -+ inode = ext3_new_inode (handle, dir, S_IFDIR | mode); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -1620,7 +1621,6 @@ - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; -- inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ -@@ -1647,9 +1647,6 @@ - BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata"); - ext3_journal_dirty_metadata(handle, dir_block); - brelse (dir_block); -- inode->i_mode = S_IFDIR | mode; -- if (dir->i_mode & S_ISGID) -- inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); - if (err) { -@@ -2018,7 +2015,7 @@ - goto out_stop; - - if (l > sizeof (EXT3_I(inode)->i_data)) { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* - * block_symlink() calls back into ext3_prepare/commit_write. -@@ -2245,4 +2242,16 @@ - rmdir: ext3_rmdir, /* BKL held */ - mknod: ext3_mknod, /* BKL held */ - rename: ext3_rename, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; -+ -+struct inode_operations ext3_special_inode_operations = { -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ -Index: linux-2.4.19-pre1/fs/ext3/super.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/super.c 2004-01-14 01:11:49.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/super.c 2004-01-14 01:11:49.000000000 +0300 -@@ -24,6 +24,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -404,6 +405,7 @@ - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { - EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -@@ -499,6 +501,7 @@ - int is_remount) - { - unsigned long *mount_options = &sbi->s_mount_opt; -+ - uid_t *resuid = &sbi->s_resuid; - gid_t *resgid = &sbi->s_resgid; - char * this_char; -@@ -511,6 +514,13 @@ - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -924,6 +934,12 @@ - sbi->s_mount_opt = 0; - sbi->s_resuid = EXT3_DEF_RESUID; - sbi->s_resgid = EXT3_DEF_RESGID; -+ -+ /* Default extended attribute flags */ -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ /* set_opt(sbi->s_mount_opt, XATTR_USER); */ -+#endif -+ - if (!parse_options ((char *) data, &sb_block, sbi, &journal_inum, 0)) { - sb->s_dev = 0; - goto out_fail; -@@ -1742,17 +1758,29 @@ - - static int __init init_ext3_fs(void) - { -- return register_filesystem(&ext3_fs_type); -+ int error = init_ext3_xattr(); -+ if (error) -+ return error; -+ error = init_ext3_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext3_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext3_xattr_user(); -+fail: -+ exit_ext3_xattr(); -+ return error; - } - - static void __exit exit_ext3_fs(void) - { - unregister_filesystem(&ext3_fs_type); -+ exit_ext3_xattr_user(); -+ exit_ext3_xattr(); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); -- - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - MODULE_LICENSE("GPL"); -Index: linux-2.4.19-pre1/fs/ext3/symlink.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/symlink.c 2001-11-10 01:25:04.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/symlink.c 2004-01-14 01:11:49.000000000 +0300 -@@ -20,6 +20,7 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - - static int ext3_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -33,7 +34,20 @@ - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext3_symlink_inode_operations = { -+ readlink: page_readlink, /* BKL not held. Don't need */ -+ follow_link: page_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ - struct inode_operations ext3_fast_symlink_inode_operations = { - readlink: ext3_readlink, /* BKL not held. Don't need */ - follow_link: ext3_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; -Index: linux-2.4.19-pre1/fs/ext3/xattr.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/xattr.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/xattr.c 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,1225 @@ -+/* -+ * linux/fs/ext3/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Ext3 code with a lot of help from Eric Jarman <ejarman@acm.org>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT3_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT3_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext3_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+#define EXT3_EA_USER "user." -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext3_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext3_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT3_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, -+ struct ext3_xattr_header *); -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+static int ext3_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext3_xattr_cache_find(struct inode *, -+ struct ext3_xattr_header *); -+static void ext3_xattr_cache_remove(struct buffer_head *); -+static void ext3_xattr_rehash(struct ext3_xattr_header *, -+ struct ext3_xattr_entry *); -+ -+static struct mb_cache *ext3_xattr_cache; -+ -+#else -+# define ext3_xattr_cache_insert(bh) 0 -+# define ext3_xattr_cache_find(inode, header) NULL -+# define ext3_xattr_cache_remove(bh) while(0) {} -+# define ext3_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext3_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext3_xattr_sem); -+ -+static inline int -+ext3_xattr_new_block(handle_t *handle, struct inode *inode, -+ int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + -+ EXT3_I(inode)->i_block_group * EXT3_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext3_new_block(handle, inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext3_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext3_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext3_xattr_free_block(handle_t *handle, struct inode * inode, -+ unsigned long block) -+{ -+ ext3_free_blocks(handle, inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext3_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext3_xattr_free_block(handle, inode, block) \ -+ ext3_free_blocks(handle, inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext3_xattr_handler *ext3_xattr_handlers[EXT3_XATTR_INDEX_MAX]; -+rwlock_t ext3_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext3_xattr_register(int name_index, struct ext3_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ if (!ext3_xattr_handlers[name_index-1]) { -+ ext3_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext3_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext3_xattr_unregister(int name_index, struct ext3_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ ext3_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext3_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static inline struct ext3_xattr_handler * -+ext3_xattr_resolve_name(const char **name) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext3_handler_lock); -+ for (i=0; i<EXT3_XATTR_INDEX_MAX; i++) { -+ if (ext3_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext3_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext3_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext3_handler_lock); -+ return handler; -+} -+ -+static inline struct ext3_xattr_handler * -+ext3_xattr_handler(int name_index) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ read_lock(&ext3_handler_lock); -+ handler = ext3_xattr_handlers[name_index-1]; -+ read_unlock(&ext3_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext3_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext3_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT3_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT3_I(inode)->i_file_acl) -+ return 0; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext3_xattr_update_super_block(handle_t *handle, -+ struct super_block *sb) -+{ -+ if (EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT3_SB(sb)->s_feature_compat |= EXT3_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT3_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT3_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext3_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_header *header = NULL; -+ struct ext3_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT3_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext3_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(sb, "ext3_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT3_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT3_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT3_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext3_xattr_cache_remove(bh); -+ error = ext3_journal_get_write_access(handle, bh); -+ if (error) -+ goto cleanup; -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT3_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT3_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT3_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT3_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext3_xattr_set2(handle, inode, bh,NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT3_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT3_XATTR_PAD, 0, -+ EXT3_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext3_xattr_rehash(header, here); -+ -+ error = ext3_xattr_set2(handle, inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext3_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext3_xattr_set(): Update the file system. -+ */ -+static int -+ext3_xattr_set2(handle_t *handle, struct inode *inode, -+ struct buffer_head *old_bh, struct ext3_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext3_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext3_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ error = ext3_journal_get_write_access(handle, new_bh); -+ if (error) -+ goto cleanup; -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext3_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT3_I(inode)->i_file_acl != 0; -+ int block = ext3_xattr_new_block(handle, inode, -+ &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+getblk_failed: ext3_xattr_free_block(handle, inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ error = ext3_journal_get_create_access(handle, new_bh); -+ if (error) { -+ unlock_buffer(new_bh); -+ goto getblk_failed; -+ } -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext3_xattr_cache_insert(new_bh); -+ -+ ext3_xattr_update_super_block(handle, sb); -+ } -+ error = ext3_journal_dirty_metadata(handle, new_bh); -+ if (error) -+ goto cleanup; -+ } -+ -+ /* Update the inode. */ -+ EXT3_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, inode); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ error = ext3_journal_get_write_access(handle, old_bh); -+ if (error) -+ goto cleanup; -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext3_xattr_free_block(handle, inode, old_bh->b_blocknr); -+ -+ /* ext3_forget() calls bforget() for us, but we -+ let our caller release old_bh, so we need to -+ duplicate the handle before. */ -+ get_bh(old_bh); -+ ext3_forget(handle, 1, inode, old_bh,old_bh->b_blocknr); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext3_xattr_quota_free(inode); -+ ext3_journal_dirty_metadata(handle, old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT3_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext3_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ext3_journal_get_write_access(handle, bh); -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext3_xattr_cache_remove(bh); -+ ext3_xattr_free_block(handle, inode, block); -+ ext3_forget(handle, 1, inode, bh, block); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ ext3_journal_dirty_metadata(handle, bh); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ ext3_xattr_quota_free(inode); -+ } -+ EXT3_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext3_xattr_sem); -+} -+ -+/* -+ * ext3_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ mb_cache_shrink(ext3_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+/* -+ * ext3_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext3_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext3_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext3_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext3_xattr_cmp(struct ext3_xattr_header *header1, -+ struct ext3_xattr_header *header2) -+{ -+ struct ext3_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT3_XATTR_NEXT(entry1); -+ entry2 = EXT3_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext3_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext3_xattr_cache_find(struct inode *inode, struct ext3_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext3_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT3_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT3_XATTR_REFCOUNT_MAX); -+ } else if (!ext3_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext3_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext3_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext3_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext3_xattr_hash_entry(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT3_XATTR_ROUND) >> EXT3_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext3_xattr_rehash(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ struct ext3_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext3_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT3_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext3_xattr(void) -+{ -+ ext3_xattr_cache = mb_cache_create("ext3_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext3_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+ if (ext3_xattr_cache) -+ mb_cache_destroy(ext3_xattr_cache); -+ ext3_xattr_cache = NULL; -+} -+ -+#else /* CONFIG_EXT3_FS_XATTR_SHARING */ -+ -+int __init -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_SHARING */ -Index: linux-2.4.19-pre1/fs/ext3/xattr_user.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/xattr_user.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/xattr_user.c 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,111 @@ -+/* -+ * linux/fs/ext3/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+# include <linux/ext3_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext3_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext3_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext3_xattr_get(inode, EXT3_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext3_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ handle_t *handle; -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ error = ext3_xattr_set(handle, inode, EXT3_XATTR_INDEX_USER, name, -+ value, size, flags); -+ ext3_journal_stop(handle, inode); -+ -+ return error; -+} -+ -+struct ext3_xattr_handler ext3_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext3_xattr_user_list, -+ get: ext3_xattr_user_get, -+ set: ext3_xattr_user_set, -+}; -+ -+int __init -+init_ext3_xattr_user(void) -+{ -+ return ext3_xattr_register(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} -+ -+void -+exit_ext3_xattr_user(void) -+{ -+ ext3_xattr_unregister(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} -Index: linux-2.4.19-pre1/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/ext3/ext3-exports.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/ext3/ext3-exports.c 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,13 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); -Index: linux-2.4.19-pre1/fs/mbcache.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/mbcache.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/mbcache.c 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,648 @@ -+/* -+ * linux/fs/mbcache.c -+ * (C) 2001-2002 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+/* -+ * Filesystem Meta Information Block Cache (mbcache) -+ * -+ * The mbcache caches blocks of block devices that need to be located -+ * by their device/block number, as well as by other criteria (such -+ * as the block's contents). -+ * -+ * There can only be one cache entry in a cache per device and block number. -+ * Additional indexes need not be unique in this sense. The number of -+ * additional indexes (=other criteria) can be hardwired at compile time -+ * or specified at cache create time. -+ * -+ * Each cache entry is of fixed size. An entry may be `valid' or `invalid' -+ * in the cache. A valid entry is in the main hash tables of the cache, -+ * and may also be in the lru list. An invalid entry is not in any hashes -+ * or lists. -+ * -+ * A valid cache entry is only in the lru list if no handles refer to it. -+ * Invalid cache entries will be freed when the last handle to the cache -+ * entry is released. Entries that cannot be freed immediately are put -+ * back on the lru list. -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+ -+#include <linux/fs.h> -+#include <linux/slab.h> -+#include <linux/sched.h> -+#include <linux/cache_def.h> -+#include <linux/version.h> -+#include <linux/init.h> -+#include <linux/mbcache.h> -+ -+ -+#ifdef MB_CACHE_DEBUG -+# define mb_debug(f...) do { \ -+ printk(KERN_DEBUG f); \ -+ printk("\n"); \ -+ } while (0) -+#define mb_assert(c) do { if (!(c)) \ -+ printk(KERN_ERR "assertion " #c " failed\n"); \ -+ } while(0) -+#else -+# define mb_debug(f...) do { } while(0) -+# define mb_assert(c) do { } while(0) -+#endif -+#define mb_error(f...) do { \ -+ printk(KERN_ERR f); \ -+ printk("\n"); \ -+ } while(0) -+ -+MODULE_AUTHOR("Andreas Gruenbacher <a.gruenbacher@computer.org>"); -+MODULE_DESCRIPTION("Meta block cache (for extended attributes)"); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) -+MODULE_LICENSE("GPL"); -+#endif -+ -+EXPORT_SYMBOL(mb_cache_create); -+EXPORT_SYMBOL(mb_cache_shrink); -+EXPORT_SYMBOL(mb_cache_destroy); -+EXPORT_SYMBOL(mb_cache_entry_alloc); -+EXPORT_SYMBOL(mb_cache_entry_insert); -+EXPORT_SYMBOL(mb_cache_entry_release); -+EXPORT_SYMBOL(mb_cache_entry_takeout); -+EXPORT_SYMBOL(mb_cache_entry_free); -+EXPORT_SYMBOL(mb_cache_entry_dup); -+EXPORT_SYMBOL(mb_cache_entry_get); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+EXPORT_SYMBOL(mb_cache_entry_find_first); -+EXPORT_SYMBOL(mb_cache_entry_find_next); -+#endif -+ -+ -+/* -+ * Global data: list of all mbcache's, lru list, and a spinlock for -+ * accessing cache data structures on SMP machines. The lru list is -+ * global across all mbcaches. -+ */ -+ -+static LIST_HEAD(mb_cache_list); -+static LIST_HEAD(mb_cache_lru_list); -+static spinlock_t mb_cache_spinlock = SPIN_LOCK_UNLOCKED; -+ -+static inline int -+mb_cache_indexes(struct mb_cache *cache) -+{ -+#ifdef MB_CACHE_INDEXES_COUNT -+ return MB_CACHE_INDEXES_COUNT; -+#else -+ return cache->c_indexes_count; -+#endif -+} -+ -+/* -+ * What the mbcache registers as to get shrunk dynamically. -+ */ -+ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask); -+ -+static struct cache_definition mb_cache_definition = { -+ "mb_cache", -+ mb_cache_memory_pressure -+}; -+ -+ -+static inline int -+__mb_cache_entry_is_hashed(struct mb_cache_entry *ce) -+{ -+ return !list_empty(&ce->e_block_list); -+} -+ -+ -+static inline void -+__mb_cache_entry_unhash(struct mb_cache_entry *ce) -+{ -+ int n; -+ -+ if (__mb_cache_entry_is_hashed(ce)) { -+ list_del_init(&ce->e_block_list); -+ for (n=0; n<mb_cache_indexes(ce->e_cache); n++) -+ list_del(&ce->e_indexes[n].o_list); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_forget(struct mb_cache_entry *ce, int gfp_mask) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ -+ mb_assert(atomic_read(&ce->e_used) == 0); -+ if (cache->c_op.free && cache->c_op.free(ce, gfp_mask)) { -+ /* free failed -- put back on the lru list -+ for freeing later. */ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&ce->e_lru_list, &mb_cache_lru_list); -+ spin_unlock(&mb_cache_spinlock); -+ } else { -+ kmem_cache_free(cache->c_entry_cache, ce); -+ atomic_dec(&cache->c_entry_count); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_release_unlock(struct mb_cache_entry *ce) -+{ -+ if (atomic_dec_and_test(&ce->e_used)) { -+ if (__mb_cache_entry_is_hashed(ce)) -+ list_add_tail(&ce->e_lru_list, &mb_cache_lru_list); -+ else { -+ spin_unlock(&mb_cache_spinlock); -+ __mb_cache_entry_forget(ce, GFP_KERNEL); -+ return; -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_memory_pressure() memory pressure callback -+ * -+ * This function is called by the kernel memory management when memory -+ * gets low. -+ * -+ * @priority: Amount by which to shrink the cache (0 = highes priority) -+ * @gfp_mask: (ignored) -+ */ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int count = 0; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &mb_cache_list) { -+ struct mb_cache *cache = -+ list_entry(l, struct mb_cache, c_cache_list); -+ mb_debug("cache %s (%d)", cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ count += atomic_read(&cache->c_entry_count); -+ } -+ mb_debug("trying to free %d of %d entries", -+ count / (priority ? priority : 1), count); -+ if (priority) -+ count /= priority; -+ while (count-- && !list_empty(&mb_cache_lru_list)) { -+ struct mb_cache_entry *ce = -+ list_entry(mb_cache_lru_list.next, -+ struct mb_cache_entry, e_lru_list); -+ list_del(&ce->e_lru_list); -+ __mb_cache_entry_unhash(ce); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), gfp_mask); -+ } -+} -+ -+ -+/* -+ * mb_cache_create() create a new cache -+ * -+ * All entries in one cache are equal size. Cache entries may be from -+ * multiple devices. If this is the first mbcache created, registers -+ * the cache with kernel memory management. Returns NULL if no more -+ * memory was available. -+ * -+ * @name: name of the cache (informal) -+ * @cache_op: contains the callback called when freeing a cache entry -+ * @entry_size: The size of a cache entry, including -+ * struct mb_cache_entry -+ * @indexes_count: number of additional indexes in the cache. Must equal -+ * MB_CACHE_INDEXES_COUNT if the number of indexes is -+ * hardwired. -+ * @bucket_count: number of hash buckets -+ */ -+struct mb_cache * -+mb_cache_create(const char *name, struct mb_cache_op *cache_op, -+ size_t entry_size, int indexes_count, int bucket_count) -+{ -+ int m=0, n; -+ struct mb_cache *cache = NULL; -+ -+ if(entry_size < sizeof(struct mb_cache_entry) + -+ indexes_count * sizeof(struct mb_cache_entry_index)) -+ return NULL; -+ -+ MOD_INC_USE_COUNT; -+ cache = kmalloc(sizeof(struct mb_cache) + -+ indexes_count * sizeof(struct list_head), GFP_KERNEL); -+ if (!cache) -+ goto fail; -+ cache->c_name = name; -+ cache->c_op.free = NULL; -+ if (cache_op) -+ cache->c_op.free = cache_op->free; -+ atomic_set(&cache->c_entry_count, 0); -+ cache->c_bucket_count = bucket_count; -+#ifdef MB_CACHE_INDEXES_COUNT -+ mb_assert(indexes_count == MB_CACHE_INDEXES_COUNT); -+#else -+ cache->c_indexes_count = indexes_count; -+#endif -+ cache->c_block_hash = kmalloc(bucket_count * sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_block_hash) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_block_hash[n]); -+ for (m=0; m<indexes_count; m++) { -+ cache->c_indexes_hash[m] = kmalloc(bucket_count * -+ sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_indexes_hash[m]) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_indexes_hash[m][n]); -+ } -+ cache->c_entry_cache = kmem_cache_create(name, entry_size, 0, -+ 0 /*SLAB_POISON | SLAB_RED_ZONE*/, NULL, NULL); -+ if (!cache->c_entry_cache) -+ goto fail; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&cache->c_cache_list, &mb_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ return cache; -+ -+fail: -+ if (cache) { -+ while (--m >= 0) -+ kfree(cache->c_indexes_hash[m]); -+ if (cache->c_block_hash) -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ } -+ MOD_DEC_USE_COUNT; -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_shrink() -+ * -+ * Removes all cache entires of a device from the cache. All cache entries -+ * currently in use cannot be freed, and thus remain in the cache. -+ * -+ * @cache: which cache to shrink -+ * @dev: which device's cache entries to shrink -+ */ -+void -+mb_cache_shrink(struct mb_cache *cache, kdev_t dev) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_dev == dev) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+} -+ -+ -+/* -+ * mb_cache_destroy() -+ * -+ * Shrinks the cache to its minimum possible size (hopefully 0 entries), -+ * and then destroys it. If this was the last mbcache, un-registers the -+ * mbcache from kernel memory management. -+ */ -+void -+mb_cache_destroy(struct mb_cache *cache) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_cache == cache) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ list_del(&cache->c_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+ -+ if (atomic_read(&cache->c_entry_count) > 0) { -+ mb_error("cache %s: %d orphaned entries", -+ cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ } -+ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)) -+ /* We don't have kmem_cache_destroy() in 2.2.x */ -+ kmem_cache_shrink(cache->c_entry_cache); -+#else -+ kmem_cache_destroy(cache->c_entry_cache); -+#endif -+ for (n=0; n < mb_cache_indexes(cache); n++) -+ kfree(cache->c_indexes_hash[n]); -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ -+ MOD_DEC_USE_COUNT; -+} -+ -+ -+/* -+ * mb_cache_entry_alloc() -+ * -+ * Allocates a new cache entry. The new entry will not be valid initially, -+ * and thus cannot be looked up yet. It should be filled with data, and -+ * then inserted into the cache using mb_cache_entry_insert(). Returns NULL -+ * if no more memory was available. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_alloc(struct mb_cache *cache) -+{ -+ struct mb_cache_entry *ce; -+ -+ atomic_inc(&cache->c_entry_count); -+ ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL); -+ if (ce) { -+ INIT_LIST_HEAD(&ce->e_lru_list); -+ INIT_LIST_HEAD(&ce->e_block_list); -+ ce->e_cache = cache; -+ atomic_set(&ce->e_used, 1); -+ } -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_insert() -+ * -+ * Inserts an entry that was allocated using mb_cache_entry_alloc() into -+ * the cache. After this, the cache entry can be looked up, but is not yet -+ * in the lru list as the caller still holds a handle to it. Returns 0 on -+ * success, or -EBUSY if a cache entry for that device + inode exists -+ * already (this may happen after a failed lookup, if another process has -+ * inserted the same cache entry in the meantime). -+ * -+ * @dev: device the cache entry belongs to -+ * @block: block number -+ * @keys: array of additional keys. There must be indexes_count entries -+ * in the array (as specified when creating the cache). -+ */ -+int -+mb_cache_entry_insert(struct mb_cache_entry *ce, kdev_t dev, -+ unsigned long block, unsigned int keys[]) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ int error = -EBUSY, n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) -+ goto out; -+ } -+ __mb_cache_entry_unhash(ce); -+ ce->e_dev = dev; -+ ce->e_block = block; -+ list_add(&ce->e_block_list, &cache->c_block_hash[bucket]); -+ for (n=0; n<mb_cache_indexes(cache); n++) { -+ ce->e_indexes[n].o_key = keys[n]; -+ bucket = keys[n] % cache->c_bucket_count; -+ list_add(&ce->e_indexes[n].o_list, -+ &cache->c_indexes_hash[n][bucket]); -+ } -+out: -+ spin_unlock(&mb_cache_spinlock); -+ return error; -+} -+ -+ -+/* -+ * mb_cache_entry_release() -+ * -+ * Release a handle to a cache entry. When the last handle to a cache entry -+ * is released it is either freed (if it is invalid) or otherwise inserted -+ * in to the lru list. -+ */ -+void -+mb_cache_entry_release(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_takeout() -+ * -+ * Take a cache entry out of the cache, making it invalid. The entry can later -+ * be re-inserted using mb_cache_entry_insert(), or released using -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_takeout(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_entry_free() -+ * -+ * This is equivalent to the sequence mb_cache_entry_takeout() -- -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_free(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_dup() -+ * -+ * Duplicate a handle to a cache entry (does not duplicate the cache entry -+ * itself). After the call, both the old and the new handle must be released. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_dup(struct mb_cache_entry *ce) -+{ -+ atomic_inc(&ce->e_used); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_get() -+ * -+ * Get a cache entry by device / block number. (There can only be one entry -+ * in the cache per device and block.) Returns NULL if no such cache entry -+ * exists. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_get(struct mb_cache *cache, kdev_t dev, unsigned long block) -+{ -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ ce = list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ goto cleanup; -+ } -+ } -+ ce = NULL; -+ -+cleanup: -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+ -+static struct mb_cache_entry * -+__mb_cache_entry_find(struct list_head *l, struct list_head *head, -+ int index, kdev_t dev, unsigned int key) -+{ -+ while (l != head) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, -+ e_indexes[index].o_list); -+ if (ce->e_dev == dev && ce->e_indexes[index].o_key == key) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ return ce; -+ } -+ l = l->next; -+ } -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_entry_find_first() -+ * -+ * Find the first cache entry on a given device with a certain key in -+ * an additional index. Additonal matches can be found with -+ * mb_cache_entry_find_next(). Returns NULL if no match was found. -+ * -+ * @cache: the cache to search -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_first(struct mb_cache *cache, int index, kdev_t dev, -+ unsigned int key) -+{ -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = cache->c_indexes_hash[index][bucket].next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_find_next() -+ * -+ * Find the next cache entry on a given device with a certain key in an -+ * additional index. Returns NULL if no match could be found. The previous -+ * entry is atomatically released, so that mb_cache_entry_find_next() can -+ * be called like this: -+ * -+ * entry = mb_cache_entry_find_first(); -+ * while (entry) { -+ * ... -+ * entry = mb_cache_entry_find_next(entry, ...); -+ * } -+ * -+ * @prev: The previous match -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_next(struct mb_cache_entry *prev, int index, kdev_t dev, -+ unsigned int key) -+{ -+ struct mb_cache *cache = prev->e_cache; -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = prev->e_indexes[index].o_list.next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ __mb_cache_entry_release_unlock(prev); -+ return ce; -+} -+ -+#endif /* !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) */ -+ -+static int __init init_mbcache(void) -+{ -+ register_cache(&mb_cache_definition); -+ return 0; -+} -+ -+static void __exit exit_mbcache(void) -+{ -+ unregister_cache(&mb_cache_definition); -+} -+ -+module_init(init_mbcache) -+module_exit(exit_mbcache) -+ -Index: linux-2.4.19-pre1/fs/xattr.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/xattr.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/fs/xattr.c 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,355 @@ -+/* -+ File: fs/xattr.c -+ -+ Extended attribute handling. -+ -+ Copyright (C) 2001 by Andreas Gruenbacher <a.gruenbacher@computer.org> -+ Copyright (C) 2001 SGI - Silicon Graphics, Inc <linux-xfs@oss.sgi.com> -+ */ -+#include <linux/fs.h> -+#include <linux/slab.h> -+#include <linux/vmalloc.h> -+#include <linux/smp_lock.h> -+#include <linux/file.h> -+#include <linux/xattr.h> -+#include <asm/uaccess.h> -+ -+/* -+ * Extended attribute memory allocation wrappers, originally -+ * based on the Intermezzo PRESTO_ALLOC/PRESTO_FREE macros. -+ * The vmalloc use here is very uncommon - extended attributes -+ * are supposed to be small chunks of metadata, and it is quite -+ * unusual to have very many extended attributes, so lists tend -+ * to be quite short as well. The 64K upper limit is derived -+ * from the extended attribute size limit used by XFS. -+ * Intentionally allow zero @size for value/list size requests. -+ */ -+static void * -+xattr_alloc(size_t size, size_t limit) -+{ -+ void *ptr; -+ -+ if (size > limit) -+ return ERR_PTR(-E2BIG); -+ -+ if (!size) /* size request, no buffer is needed */ -+ return NULL; -+ else if (size <= PAGE_SIZE) -+ ptr = kmalloc((unsigned long) size, GFP_KERNEL); -+ else -+ ptr = vmalloc((unsigned long) size); -+ if (!ptr) -+ return ERR_PTR(-ENOMEM); -+ return ptr; -+} -+ -+static void -+xattr_free(void *ptr, size_t size) -+{ -+ if (!size) /* size request, no buffer was needed */ -+ return; -+ else if (size <= PAGE_SIZE) -+ kfree(ptr); -+ else -+ vfree(ptr); -+} -+ -+/* -+ * Extended attribute SET operations -+ */ -+static long -+setxattr(struct dentry *d, char *name, void *value, size_t size, int flags) -+{ -+ int error; -+ void *kvalue; -+ char kname[XATTR_NAME_MAX + 1]; -+ -+ if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) -+ return -EINVAL; -+ -+ error = strncpy_from_user(kname, name, sizeof(kname)); -+ if (error == 0 || error == sizeof(kname)) -+ error = -ERANGE; -+ if (error < 0) -+ return error; -+ -+ kvalue = xattr_alloc(size, XATTR_SIZE_MAX); -+ if (IS_ERR(kvalue)) -+ return PTR_ERR(kvalue); -+ -+ if (size > 0 && copy_from_user(kvalue, value, size)) { -+ xattr_free(kvalue, size); -+ return -EFAULT; -+ } -+ -+ error = -EOPNOTSUPP; -+ if (d->d_inode->i_op && d->d_inode->i_op->setxattr) { -+ down(&d->d_inode->i_sem); -+ lock_kernel(); -+ error = d->d_inode->i_op->setxattr(d, kname, kvalue, size, flags); -+ unlock_kernel(); -+ up(&d->d_inode->i_sem); -+ } -+ -+ xattr_free(kvalue, size); -+ return error; -+} -+ -+asmlinkage long -+sys_setxattr(char *path, char *name, void *value, size_t size, int flags) -+{ -+ struct nameidata nd; -+ int error; -+ -+ error = user_path_walk(path, &nd); -+ if (error) -+ return error; -+ error = setxattr(nd.dentry, name, value, size, flags); -+ path_release(&nd); -+ return error; -+} -+ -+asmlinkage long -+sys_lsetxattr(char *path, char *name, void *value, size_t size, int flags) -+{ -+ struct nameidata nd; -+ int error; -+ -+ error = user_path_walk_link(path, &nd); -+ if (error) -+ return error; -+ error = setxattr(nd.dentry, name, value, size, flags); -+ path_release(&nd); -+ return error; -+} -+ -+asmlinkage long -+sys_fsetxattr(int fd, char *name, void *value, size_t size, int flags) -+{ -+ struct file *f; -+ int error = -EBADF; -+ -+ f = fget(fd); -+ if (!f) -+ return error; -+ error = setxattr(f->f_dentry, name, value, size, flags); -+ fput(f); -+ return error; -+} -+ -+/* -+ * Extended attribute GET operations -+ */ -+static ssize_t -+getxattr(struct dentry *d, char *name, void *value, size_t size) -+{ -+ ssize_t error; -+ void *kvalue; -+ char kname[XATTR_NAME_MAX + 1]; -+ -+ error = strncpy_from_user(kname, name, sizeof(kname)); -+ if (error == 0 || error == sizeof(kname)) -+ error = -ERANGE; -+ if (error < 0) -+ return error; -+ -+ kvalue = xattr_alloc(size, XATTR_SIZE_MAX); -+ if (IS_ERR(kvalue)) -+ return PTR_ERR(kvalue); -+ -+ error = -EOPNOTSUPP; -+ if (d->d_inode->i_op && d->d_inode->i_op->getxattr) { -+ down(&d->d_inode->i_sem); -+ lock_kernel(); -+ error = d->d_inode->i_op->getxattr(d, kname, kvalue, size); -+ unlock_kernel(); -+ up(&d->d_inode->i_sem); -+ } -+ -+ if (kvalue && error > 0) -+ if (copy_to_user(value, kvalue, error)) -+ error = -EFAULT; -+ xattr_free(kvalue, size); -+ return error; -+} -+ -+asmlinkage ssize_t -+sys_getxattr(char *path, char *name, void *value, size_t size) -+{ -+ struct nameidata nd; -+ ssize_t error; -+ -+ error = user_path_walk(path, &nd); -+ if (error) -+ return error; -+ error = getxattr(nd.dentry, name, value, size); -+ path_release(&nd); -+ return error; -+} -+ -+asmlinkage ssize_t -+sys_lgetxattr(char *path, char *name, void *value, size_t size) -+{ -+ struct nameidata nd; -+ ssize_t error; -+ -+ error = user_path_walk_link(path, &nd); -+ if (error) -+ return error; -+ error = getxattr(nd.dentry, name, value, size); -+ path_release(&nd); -+ return error; -+} -+ -+asmlinkage ssize_t -+sys_fgetxattr(int fd, char *name, void *value, size_t size) -+{ -+ struct file *f; -+ ssize_t error = -EBADF; -+ -+ f = fget(fd); -+ if (!f) -+ return error; -+ error = getxattr(f->f_dentry, name, value, size); -+ fput(f); -+ return error; -+} -+ -+/* -+ * Extended attribute LIST operations -+ */ -+static ssize_t -+listxattr(struct dentry *d, char *list, size_t size) -+{ -+ ssize_t error; -+ char *klist; -+ -+ klist = (char *)xattr_alloc(size, XATTR_LIST_MAX); -+ if (IS_ERR(klist)) -+ return PTR_ERR(klist); -+ -+ error = -EOPNOTSUPP; -+ if (d->d_inode->i_op && d->d_inode->i_op->listxattr) { -+ down(&d->d_inode->i_sem); -+ lock_kernel(); -+ error = d->d_inode->i_op->listxattr(d, klist, size); -+ unlock_kernel(); -+ up(&d->d_inode->i_sem); -+ } -+ -+ if (klist && error > 0) -+ if (copy_to_user(list, klist, error)) -+ error = -EFAULT; -+ xattr_free(klist, size); -+ return error; -+} -+ -+asmlinkage ssize_t -+sys_listxattr(char *path, char *list, size_t size) -+{ -+ struct nameidata nd; -+ ssize_t error; -+ -+ error = user_path_walk(path, &nd); -+ if (error) -+ return error; -+ error = listxattr(nd.dentry, list, size); -+ path_release(&nd); -+ return error; -+} -+ -+asmlinkage ssize_t -+sys_llistxattr(char *path, char *list, size_t size) -+{ -+ struct nameidata nd; -+ ssize_t error; -+ -+ error = user_path_walk_link(path, &nd); -+ if (error) -+ return error; -+ error = listxattr(nd.dentry, list, size); -+ path_release(&nd); -+ return error; -+} -+ -+asmlinkage ssize_t -+sys_flistxattr(int fd, char *list, size_t size) -+{ -+ struct file *f; -+ ssize_t error = -EBADF; -+ -+ f = fget(fd); -+ if (!f) -+ return error; -+ error = listxattr(f->f_dentry, list, size); -+ fput(f); -+ return error; -+} -+ -+/* -+ * Extended attribute REMOVE operations -+ */ -+static long -+removexattr(struct dentry *d, char *name) -+{ -+ int error; -+ char kname[XATTR_NAME_MAX + 1]; -+ -+ error = strncpy_from_user(kname, name, sizeof(kname)); -+ if (error == 0 || error == sizeof(kname)) -+ error = -ERANGE; -+ if (error < 0) -+ return error; -+ -+ error = -EOPNOTSUPP; -+ if (d->d_inode->i_op && d->d_inode->i_op->removexattr) { -+ down(&d->d_inode->i_sem); -+ lock_kernel(); -+ error = d->d_inode->i_op->removexattr(d, kname); -+ unlock_kernel(); -+ up(&d->d_inode->i_sem); -+ } -+ return error; -+} -+ -+asmlinkage long -+sys_removexattr(char *path, char *name) -+{ -+ struct nameidata nd; -+ int error; -+ -+ error = user_path_walk(path, &nd); -+ if (error) -+ return error; -+ error = removexattr(nd.dentry, name); -+ path_release(&nd); -+ return error; -+} -+ -+asmlinkage long -+sys_lremovexattr(char *path, char *name) -+{ -+ struct nameidata nd; -+ int error; -+ -+ error = user_path_walk_link(path, &nd); -+ if (error) -+ return error; -+ error = removexattr(nd.dentry, name); -+ path_release(&nd); -+ return error; -+} -+ -+asmlinkage long -+sys_fremovexattr(int fd, char *name) -+{ -+ struct file *f; -+ int error = -EBADF; -+ -+ f = fget(fd); -+ if (!f) -+ return error; -+ error = removexattr(f->f_dentry, name); -+ fput(f); -+ return error; -+} -Index: linux-2.4.19-pre1/include/asm-arm/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-arm/unistd.h 2001-08-12 22:14:00.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-arm/unistd.h 2004-01-14 01:11:49.000000000 +0300 -@@ -240,6 +240,18 @@ - #define __NR_mincore (__NR_SYSCALL_BASE+219) - #define __NR_madvise (__NR_SYSCALL_BASE+220) - #define __NR_fcntl64 (__NR_SYSCALL_BASE+221) -+#define __NR_setxattr (__NR_SYSCALL_BASE+226) -+#define __NR_lsetxattr (__NR_SYSCALL_BASE+227) -+#define __NR_fsetxattr (__NR_SYSCALL_BASE+228) -+#define __NR_getxattr (__NR_SYSCALL_BASE+229) -+#define __NR_lgetxattr (__NR_SYSCALL_BASE+230) -+#define __NR_fgetxattr (__NR_SYSCALL_BASE+231) -+#define __NR_listxattr (__NR_SYSCALL_BASE+232) -+#define __NR_llistxattr (__NR_SYSCALL_BASE+233) -+#define __NR_flistxattr (__NR_SYSCALL_BASE+234) -+#define __NR_removexattr (__NR_SYSCALL_BASE+235) -+#define __NR_lremovexattr (__NR_SYSCALL_BASE+236) -+#define __NR_fremovexattr (__NR_SYSCALL_BASE+237) - - /* - * The following SWIs are ARM private. -Index: linux-2.4.19-pre1/include/asm-ia64/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-ia64/unistd.h 2001-11-10 01:26:17.000000000 +0300 -+++ linux-2.4.19-pre1/include/asm-ia64/unistd.h 2004-01-14 01:11:49.000000000 +0300 -@@ -206,6 +206,18 @@ - #define __NR_getdents64 1214 - #define __NR_getunwind 1215 - #define __NR_readahead 1216 -+#define __NR_setxattr 1217 -+#define __NR_lsetxattr 1218 -+#define __NR_fsetxattr 1219 -+#define __NR_getxattr 1220 -+#define __NR_lgetxattr 1221 -+#define __NR_fgetxattr 1222 -+#define __NR_listxattr 1223 -+#define __NR_llistxattr 1224 -+#define __NR_flistxattr 1225 -+#define __NR_removexattr 1226 -+#define __NR_lremovexattr 1227 -+#define __NR_fremovexattr 1228 - - #if !defined(__ASSEMBLY__) && !defined(ASSEMBLER) - -Index: linux-2.4.19-pre1/include/asm-s390/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-s390/unistd.h 2001-10-11 20:43:38.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-s390/unistd.h 2004-01-14 01:11:49.000000000 +0300 -@@ -211,6 +211,18 @@ - #define __NR_mincore 218 - #define __NR_madvise 219 - #define __NR_getdents64 220 -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - - - /* user-visible error numbers are in the range -1 - -122: see <asm-s390/errno.h> */ -Index: linux-2.4.19-pre1/include/asm-s390x/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-s390x/unistd.h 2001-10-11 20:43:38.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-s390x/unistd.h 2004-01-14 01:11:49.000000000 +0300 -@@ -181,6 +181,18 @@ - #define __NR_mincore 218 - #define __NR_madvise 219 - #define __NR_getdents64 220 -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - - - /* user-visible error numbers are in the range -1 - -122: see <asm-s390/errno.h> */ -Index: linux-2.4.19-pre1/include/asm-sparc/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-sparc/unistd.h 2001-10-21 21:36:54.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-sparc/unistd.h 2004-01-14 01:11:49.000000000 +0300 -@@ -184,24 +184,24 @@ - /* #define __NR_exportfs 166 SunOS Specific */ - #define __NR_mount 167 /* Common */ - #define __NR_ustat 168 /* Common */ --/* #define __NR_semsys 169 SunOS Specific */ --/* #define __NR_msgsys 170 SunOS Specific */ --/* #define __NR_shmsys 171 SunOS Specific */ --/* #define __NR_auditsys 172 SunOS Specific */ --/* #define __NR_rfssys 173 SunOS Specific */ -+#define __NR_setxattr 169 /* SunOS: semsys */ -+#define __NR_lsetxattr 170 /* SunOS: msgsys */ -+#define __NR_fsetxattr 171 /* SunOS: shmsys */ -+#define __NR_getxattr 172 /* SunOS: auditsys */ -+#define __NR_lgetxattr 173 /* SunOS: rfssys */ - #define __NR_getdents 174 /* Common */ - #define __NR_setsid 175 /* Common */ - #define __NR_fchdir 176 /* Common */ --/* #define __NR_fchroot 177 SunOS Specific */ --/* #define __NR_vpixsys 178 SunOS Specific */ --/* #define __NR_aioread 179 SunOS Specific */ --/* #define __NR_aiowrite 180 SunOS Specific */ --/* #define __NR_aiowait 181 SunOS Specific */ --/* #define __NR_aiocancel 182 SunOS Specific */ -+#define __NR_fgetxattr 177 /* SunOS: fchroot */ -+#define __NR_listxattr 178 /* SunOS: vpixsys */ -+#define __NR_llistxattr 179 /* SunOS: aioread */ -+#define __NR_flistxattr 180 /* SunOS: aiowrite */ -+#define __NR_removexattr 181 /* SunOS: aiowait */ -+#define __NR_lremovexattr 182 /* SunOS: aiocancel */ - #define __NR_sigpending 183 /* Common */ - #define __NR_query_module 184 /* Linux Specific */ - #define __NR_setpgid 185 /* Common */ --/* #define __NR_pathconf 186 SunOS Specific */ -+#define __NR_fremovexattr 186 /* SunOS: pathconf */ - /* #define __NR_fpathconf 187 SunOS Specific */ - /* #define __NR_sysconf 188 SunOS Specific */ - #define __NR_uname 189 /* Linux Specific */ -Index: linux-2.4.19-pre1/include/asm-sparc64/unistd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/asm-sparc64/unistd.h 2001-10-21 21:36:54.000000000 +0400 -+++ linux-2.4.19-pre1/include/asm-sparc64/unistd.h 2004-01-14 01:11:49.000000000 +0300 -@@ -184,24 +184,24 @@ - /* #define __NR_exportfs 166 SunOS Specific */ - #define __NR_mount 167 /* Common */ - #define __NR_ustat 168 /* Common */ --/* #define __NR_semsys 169 SunOS Specific */ --/* #define __NR_msgsys 170 SunOS Specific */ --/* #define __NR_shmsys 171 SunOS Specific */ --/* #define __NR_auditsys 172 SunOS Specific */ --/* #define __NR_rfssys 173 SunOS Specific */ -+#define __NR_setxattr 169 /* SunOS: semsys */ -+#define __NR_lsetxattr 170 /* SunOS: msgsys */ -+#define __NR_fsetxattr 171 /* SunOS: shmsys */ -+#define __NR_getxattr 172 /* SunOS: auditsys */ -+#define __NR_lgetxattr 173 /* SunOS: rfssys */ - #define __NR_getdents 174 /* Common */ - #define __NR_setsid 175 /* Common */ - #define __NR_fchdir 176 /* Common */ --/* #define __NR_fchroot 177 SunOS Specific */ --/* #define __NR_vpixsys 178 SunOS Specific */ --/* #define __NR_aioread 179 SunOS Specific */ --/* #define __NR_aiowrite 180 SunOS Specific */ --/* #define __NR_aiowait 181 SunOS Specific */ --/* #define __NR_aiocancel 182 SunOS Specific */ -+#define __NR_fgetxattr 177 /* SunOS: fchroot */ -+#define __NR_listxattr 178 /* SunOS: vpixsys */ -+#define __NR_llistxattr 179 /* SunOS: aioread */ -+#define __NR_flistxattr 180 /* SunOS: aiowrite */ -+#define __NR_removexattr 181 /* SunOS: aiowait */ -+#define __NR_lremovexattr 182 /* SunOS: aiocancel */ - #define __NR_sigpending 183 /* Common */ - #define __NR_query_module 184 /* Linux Specific */ - #define __NR_setpgid 185 /* Common */ --/* #define __NR_pathconf 186 SunOS Specific */ -+#define __NR_fremovexattr 186 /* SunOS: pathconf */ - /* #define __NR_fpathconf 187 SunOS Specific */ - /* #define __NR_sysconf 188 SunOS Specific */ - #define __NR_uname 189 /* Linux Specific */ -Index: linux-2.4.19-pre1/include/linux/cache_def.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/cache_def.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/cache_def.h 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,15 @@ -+/* -+ * linux/cache_def.h -+ * Handling of caches defined in drivers, filesystems, ... -+ * -+ * Copyright (C) 2002 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+struct cache_definition { -+ const char *name; -+ void (*shrink)(int, unsigned int); -+ struct list_head link; -+}; -+ -+extern void register_cache(struct cache_definition *); -+extern void unregister_cache(struct cache_definition *); -Index: linux-2.4.19-pre1/include/linux/errno.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/errno.h 2001-02-10 01:46:13.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/errno.h 2004-01-14 01:11:49.000000000 +0300 -@@ -23,4 +23,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ -+ - #endif -Index: linux-2.4.19-pre1/include/linux/ext2_fs.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext2_fs.h 2001-11-22 22:46:52.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext2_fs.h 2004-01-14 01:18:00.000000000 +0300 -@@ -57,8 +57,6 @@ - */ - #define EXT2_BAD_INO 1 /* Bad blocks inode */ - #define EXT2_ROOT_INO 2 /* Root inode */ --#define EXT2_ACL_IDX_INO 3 /* ACL inode */ --#define EXT2_ACL_DATA_INO 4 /* ACL inode */ - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -@@ -86,7 +84,6 @@ - #else - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -121,28 +118,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext2_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext2_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext2_group_desc -@@ -314,6 +289,7 @@ - #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ - #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ -+#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt -@@ -397,6 +373,7 @@ - - #ifdef __KERNEL__ - #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -+#define EXT2_I(inode) (&((inode)->u.ext2_i)) - #else - /* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test -@@ -466,7 +443,7 @@ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff - --#define EXT2_FEATURE_COMPAT_SUPP 0 -+#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -623,8 +600,10 @@ - - /* namei.c */ - extern struct inode_operations ext2_dir_inode_operations; -+extern struct inode_operations ext2_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext2_symlink_inode_operations; - extern struct inode_operations ext2_fast_symlink_inode_operations; - - #endif /* __KERNEL__ */ -Index: linux-2.4.19-pre1/include/linux/ext2_xattr.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext2_xattr.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext2_xattr.h 2004-01-14 01:18:01.000000000 +0300 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext2_xattr.h -+ -+ On-disk format of extended attributes for the ext2 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT2_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT2_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT2_XATTR_INDEX_MAX 10 -+#define EXT2_XATTR_INDEX_USER 1 -+#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext2_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext2_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT2_XATTR_PAD_BITS 2 -+#define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS) -+#define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1) -+#define EXT2_XATTR_LEN(name_len) \ -+ (((name_len) + EXT2_XATTR_ROUND + \ -+ sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND) -+#define EXT2_XATTR_NEXT(entry) \ -+ ( (struct ext2_xattr_entry *)( \ -+ (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT2_XATTR_SIZE(size) \ -+ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT2_FS_XATTR -+ -+struct ext2_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext2_xattr_register(int, struct ext2_xattr_handler *); -+extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); -+ -+extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); -+extern int ext2_removexattr(struct dentry *, const char *); -+ -+extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext2_xattr_list(struct inode *, char *, size_t); -+extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext2_xattr_delete_inode(struct inode *); -+extern void ext2_xattr_put_super(struct super_block *); -+ -+extern int init_ext2_xattr(void) __init; -+extern void exit_ext2_xattr(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR */ -+# define ext2_setxattr NULL -+# define ext2_getxattr NULL -+# define ext2_listxattr NULL -+# define ext2_removexattr NULL -+ -+static inline int -+ext2_xattr_get(struct inode *inode, int name_index, -+ const char *name, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+} -+ -+static inline void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR */ -+ -+# ifdef CONFIG_EXT2_FS_XATTR_USER -+ -+extern int init_ext2_xattr_user(void) __init; -+extern void exit_ext2_xattr_user(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+static inline int -+init_ext2_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr_user(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ -Index: linux-2.4.19-pre1/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_fs.h 2004-01-14 01:11:49.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_fs.h 2004-01-14 01:11:49.000000000 +0300 -@@ -63,8 +63,6 @@ - */ - #define EXT3_BAD_INO 1 /* Bad blocks inode */ - #define EXT3_ROOT_INO 2 /* Root inode */ --#define EXT3_ACL_IDX_INO 3 /* ACL inode */ --#define EXT3_ACL_DATA_INO 4 /* ACL inode */ - #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ - #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ -@@ -94,7 +92,6 @@ - #else - # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry)) - #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -129,28 +126,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext3_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext3_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext3_group_desc -@@ -344,6 +319,7 @@ - #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */ - #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 */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -520,7 +496,7 @@ - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - --#define EXT3_FEATURE_COMPAT_SUPP 0 -+#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) - #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ -@@ -703,6 +679,7 @@ - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - - /* inode.c */ -+extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); - -@@ -771,8 +748,10 @@ - - /* namei.c */ - extern struct inode_operations ext3_dir_inode_operations; -+extern struct inode_operations ext3_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - - -Index: linux-2.4.19-pre1/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_jbd.h 2004-01-14 01:11:49.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_jbd.h 2004-01-14 01:18:04.000000000 +0300 -@@ -30,13 +30,19 @@ - - #define EXT3_SINGLEDATA_TRANS_BLOCKS 8 - -+/* Extended attributes may touch two data buffers, two bitmap buffers, -+ * and two group and summaries. */ -+ -+#define EXT3_XATTR_TRANS_BLOCKS 8 -+ - /* 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 - * quota files too (one for the group, one for the user quota). The - * superblock only gets updated once, of course, so don't bother - * counting that again for the quota updates. */ - --#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS - 2) -+#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \ -+ EXT3_XATTR_TRANS_BLOCKS - 2) - - extern int ext3_writepage_trans_blocks(struct inode *inode); - -Index: linux-2.4.19-pre1/include/linux/ext3_xattr.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/ext3_xattr.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/ext3_xattr.h 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext3_xattr.h -+ -+ On-disk format of extended attributes for the ext3 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT3_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT3_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT3_XATTR_INDEX_MAX 10 -+#define EXT3_XATTR_INDEX_USER 1 -+#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext3_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext3_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT3_XATTR_PAD_BITS 2 -+#define EXT3_XATTR_PAD (1<<EXT3_XATTR_PAD_BITS) -+#define EXT3_XATTR_ROUND (EXT3_XATTR_PAD-1) -+#define EXT3_XATTR_LEN(name_len) \ -+ (((name_len) + EXT3_XATTR_ROUND + \ -+ sizeof(struct ext3_xattr_entry)) & ~EXT3_XATTR_ROUND) -+#define EXT3_XATTR_NEXT(entry) \ -+ ( (struct ext3_xattr_entry *)( \ -+ (char *)(entry) + EXT3_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT3_XATTR_SIZE(size) \ -+ (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT3_FS_XATTR -+ -+struct ext3_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext3_xattr_register(int, struct ext3_xattr_handler *); -+extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *); -+ -+extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); -+extern int ext3_removexattr(struct dentry *, const char *); -+ -+extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext3_xattr_list(struct inode *, char *, size_t); -+extern int ext3_xattr_set(handle_t *handle, struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext3_xattr_delete_inode(handle_t *, struct inode *); -+extern void ext3_xattr_put_super(struct super_block *); -+ -+extern int init_ext3_xattr(void) __init; -+extern void exit_ext3_xattr(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR */ -+# define ext3_setxattr NULL -+# define ext3_getxattr NULL -+# define ext3_listxattr NULL -+# define ext3_removexattr NULL -+ -+static inline int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_list(struct inode *inode, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+} -+ -+static inline void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT3_FS_XATTR */ -+ -+# ifdef CONFIG_EXT3_FS_XATTR_USER -+ -+extern int init_ext3_xattr_user(void) __init; -+extern void exit_ext3_xattr_user(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+static inline int -+init_ext3_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr_user(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ -Index: linux-2.4.19-pre1/include/linux/fs.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/fs.h 2004-01-14 01:11:48.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/fs.h 2004-01-14 01:11:49.000000000 +0300 -@@ -872,6 +872,10 @@ - int (*setattr) (struct dentry *, struct iattr *); - int (*setattr_raw) (struct inode *, struct iattr *); - int (*getattr) (struct dentry *, struct iattr *); -+ int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); -+ ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); -+ ssize_t (*listxattr) (struct dentry *, char *, size_t); -+ int (*removexattr) (struct dentry *, const char *); - }; - - struct seq_file; -Index: linux-2.4.19-pre1/include/linux/mbcache.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/mbcache.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/mbcache.h 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,69 @@ -+/* -+ File: linux/mbcache.h -+ -+ (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+/* Hardwire the number of additional indexes */ -+#define MB_CACHE_INDEXES_COUNT 1 -+ -+struct mb_cache_entry; -+ -+struct mb_cache_op { -+ int (*free)(struct mb_cache_entry *, int); -+}; -+ -+struct mb_cache { -+ struct list_head c_cache_list; -+ const char *c_name; -+ struct mb_cache_op c_op; -+ atomic_t c_entry_count; -+ int c_bucket_count; -+#ifndef MB_CACHE_INDEXES_COUNT -+ int c_indexes_count; -+#endif -+ kmem_cache_t *c_entry_cache; -+ struct list_head *c_block_hash; -+ struct list_head *c_indexes_hash[0]; -+}; -+ -+struct mb_cache_entry_index { -+ struct list_head o_list; -+ unsigned int o_key; -+}; -+ -+struct mb_cache_entry { -+ struct list_head e_lru_list; -+ struct mb_cache *e_cache; -+ atomic_t e_used; -+ kdev_t e_dev; -+ unsigned long e_block; -+ struct list_head e_block_list; -+ struct mb_cache_entry_index e_indexes[0]; -+}; -+ -+/* Functions on caches */ -+ -+struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, -+ int, int); -+void mb_cache_shrink(struct mb_cache *, kdev_t); -+void mb_cache_destroy(struct mb_cache *); -+ -+/* Functions on cache entries */ -+ -+struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *); -+int mb_cache_entry_insert(struct mb_cache_entry *, kdev_t, unsigned long, -+ unsigned int[]); -+void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]); -+void mb_cache_entry_release(struct mb_cache_entry *); -+void mb_cache_entry_takeout(struct mb_cache_entry *); -+void mb_cache_entry_free(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, kdev_t, -+ unsigned long); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, -+ kdev_t, unsigned int); -+struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, -+ kdev_t, unsigned int); -+#endif -Index: linux-2.4.19-pre1/include/linux/xattr.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/xattr.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/xattr.h 2004-01-14 01:11:49.000000000 +0300 -@@ -0,0 +1,15 @@ -+/* -+ File: linux/xattr.h -+ -+ Extended attributes handling. -+ -+ Copyright (C) 2001 by Andreas Gruenbacher <a.gruenbacher@computer.org> -+ Copyright (c) 2001-2002 Silicon Graphics, Inc. All Rights Reserved. -+*/ -+#ifndef _LINUX_XATTR_H -+#define _LINUX_XATTR_H -+ -+#define XATTR_CREATE 0x1 /* set the value, fail if attr already exists */ -+#define XATTR_REPLACE 0x2 /* set the value, fail if attr does not exist */ -+ -+#endif /* _LINUX_XATTR_H */ -Index: linux-2.4.19-pre1/include/linux/kernel.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/kernel.h 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/kernel.h 2004-01-14 01:16:51.000000000 +0300 -@@ -11,6 +11,7 @@ - #include <linux/linkage.h> - #include <linux/stddef.h> - #include <linux/types.h> -+#include <linux/compiler.h> - - /* Optimization barrier */ - /* The "volatile" is due to gcc bugs */ -Index: linux-2.4.19-pre1/include/linux/limits.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/limits.h 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/limits.h 2004-01-14 01:22:08.000000000 +0300 -@@ -13,6 +13,9 @@ - #define NAME_MAX 255 /* # chars in a file name */ - #define PATH_MAX 4096 /* # chars in a path name including nul */ - #define PIPE_BUF 4096 /* # bytes in atomic write to a pipe */ -+#define XATTR_NAME_MAX 255 /* # chars in an extended attribute name */ -+#define XATTR_SIZE_MAX 65536 /* size of an extended attribute value (64k) */ -+#define XATTR_LIST_MAX 65536 /* size of extended attribute namelist (64k) */ - - #define RTSIG_MAX 32 - -Index: linux-2.4.19-pre1/kernel/ksyms.c -=================================================================== ---- linux-2.4.19-pre1.orig/kernel/ksyms.c 2004-01-14 01:11:48.000000000 +0300 -+++ linux-2.4.19-pre1/kernel/ksyms.c 2004-01-14 01:11:49.000000000 +0300 -@@ -11,6 +11,7 @@ - - #include <linux/config.h> - #include <linux/slab.h> -+#include <linux/cache_def.h> - #include <linux/module.h> - #include <linux/blkdev.h> - #include <linux/cdrom.h> -@@ -88,6 +89,7 @@ - EXPORT_SYMBOL(exit_files); - EXPORT_SYMBOL(exit_fs); - EXPORT_SYMBOL(exit_sighand); -+EXPORT_SYMBOL(copy_fs_struct); - - /* internal kernel memory management */ - EXPORT_SYMBOL(_alloc_pages); -@@ -104,6 +106,8 @@ - EXPORT_SYMBOL(kmem_cache_shrink); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); -+EXPORT_SYMBOL(register_cache); -+EXPORT_SYMBOL(unregister_cache); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); -Index: linux-2.4.19-pre1/mm/vmscan.c -=================================================================== ---- linux-2.4.19-pre1.orig/mm/vmscan.c 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/mm/vmscan.c 2004-01-14 01:11:49.000000000 +0300 -@@ -15,6 +15,7 @@ - #include <linux/kernel_stat.h> - #include <linux/swap.h> - #include <linux/swapctl.h> -+#include <linux/cache_def.h> - #include <linux/smp_lock.h> - #include <linux/pagemap.h> - #include <linux/init.h> -@@ -32,6 +33,39 @@ - */ - #define DEF_PRIORITY (6) - -+static DECLARE_MUTEX(other_caches_sem); -+static LIST_HEAD(cache_definitions); -+ -+void register_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_add(&cache->link, &cache_definitions); -+ up(&other_caches_sem); -+} -+ -+void unregister_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_del(&cache->link); -+ up(&other_caches_sem); -+} -+ -+static void shrink_other_caches(unsigned int priority, int gfp_mask) -+{ -+ struct list_head *p; -+ -+ if (down_trylock(&other_caches_sem)) -+ return; -+ -+ list_for_each_prev(p, &cache_definitions) { -+ struct cache_definition *cache = -+ list_entry(p, struct cache_definition, link); -+ -+ cache->shrink(priority, gfp_mask); -+ } -+ up(&other_caches_sem); -+} -+ - /* - * The swap-out function returns 1 if it successfully - * scanned all the pages it was asked to (`count'). -@@ -578,6 +612,7 @@ - - shrink_dcache_memory(priority, gfp_mask); - shrink_icache_memory(priority, gfp_mask); -+ shrink_other_caches(priority, gfp_mask); - #ifdef CONFIG_QUOTA - shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); - #endif diff --git a/lustre/kernel_patches/patches/linux-2.4.19-xattr-0.8.54-suse.patch b/lustre/kernel_patches/patches/linux-2.4.19-xattr-0.8.54-suse.patch deleted file mode 100644 index 79c48fb609..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.19-xattr-0.8.54-suse.patch +++ /dev/null @@ -1,60 +0,0 @@ - ext2/super.c | 3 +-- - ext3/ext3-exports.c | 13 +++++++++++++ - 2 files changed, 14 insertions(+), 2 deletions(-) - -Index: linux-2.4.19/fs/ext2/super.c -=================================================================== ---- linux-2.4.19.orig/fs/ext2/super.c 2004-04-23 17:53:55.000000000 -0400 -+++ linux-2.4.19/fs/ext2/super.c 2004-04-23 22:30:41.000000000 -0400 -@@ -70,6 +70,7 @@ - { - va_list args; - -+ ext2_xattr_put_super(sb); - if (!(sb->s_flags & MS_RDONLY)) { - sb->u.ext2_sb.s_mount_state |= EXT2_ERROR_FS; - sb->u.ext2_sb.s_es->s_state = -Index: linux-2.4.19/fs/ext3/super.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/super.c 2004-04-23 18:26:27.000000000 -0400 -+++ linux-2.4.19/fs/ext3/super.c 2004-04-23 22:30:41.000000000 -0400 -@@ -1827,8 +1827,6 @@ - exit_ext3_xattr(); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); - - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); -Index: linux-2.4.19/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.19.orig/fs/ext3/ext3-exports.c 2003-01-30 05:24:37.000000000 -0500 -+++ linux-2.4.19/fs/ext3/ext3-exports.c 2004-04-23 22:30:41.000000000 -0400 -@@ -0,0 +1,13 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); -Index: linux-2.4.19/fs/ext3/Makefile -=================================================================== ---- linux-2.4.19.orig/fs/ext3/Makefile 2004-04-23 18:26:27.000000000 -0400 -+++ linux-2.4.19/fs/ext3/Makefile 2004-04-23 23:05:20.000000000 -0400 -@@ -9,7 +9,7 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.c - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ - ioctl.o namei.o super.o symlink.o hash.o diff --git a/lustre/kernel_patches/patches/linux-2.4.20-filemap.patch b/lustre/kernel_patches/patches/linux-2.4.20-filemap.patch deleted file mode 100644 index e321e0739b..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.20-filemap.patch +++ /dev/null @@ -1,9 +0,0 @@ -diff -rupN --exclude='ide*' linux-2.4.20.orig/mm/filemap.c linux-2.4.20/mm/filemap.c ---- linux-2.4.20.orig/mm/filemap.c 2002-11-29 01:53:15.000000000 +0200 -+++ linux-2.4.20/mm/filemap.c 2004-02-20 13:52:26.990361912 +0200 -@@ -3195,3 +3195,5 @@ void __init page_cache_init(unsigned lon - panic("Failed to allocate page hash table\n"); - memset((void *)page_hash_table, 0, PAGE_HASH_SIZE * sizeof(struct page *)); - } -+ -+EXPORT_SYMBOL(add_to_page_cache_unique); diff --git a/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54-chaos.patch b/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54-chaos.patch deleted file mode 100644 index 5bdfaffc27..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54-chaos.patch +++ /dev/null @@ -1,5531 +0,0 @@ - Documentation/Configure.help | 66 ++ - arch/alpha/defconfig | 7 - arch/alpha/kernel/entry.S | 12 - arch/arm/defconfig | 7 - arch/arm/kernel/calls.S | 24 - arch/i386/defconfig | 7 - arch/ia64/defconfig | 7 - arch/m68k/defconfig | 7 - arch/mips/defconfig | 7 - arch/mips64/defconfig | 7 - arch/ppc/defconfig | 14 - arch/ppc64/kernel/misc.S | 2 - arch/s390/defconfig | 7 - arch/s390/kernel/entry.S | 24 - arch/s390x/defconfig | 7 - arch/s390x/kernel/entry.S | 24 - arch/s390x/kernel/wrapper32.S | 92 +++ - arch/sparc/defconfig | 7 - arch/sparc/kernel/systbls.S | 10 - arch/sparc64/defconfig | 7 - arch/sparc64/kernel/systbls.S | 20 - fs/Config.in | 14 - fs/Makefile | 3 - fs/ext2/Makefile | 4 - fs/ext2/file.c | 5 - fs/ext2/ialloc.c | 2 - fs/ext2/inode.c | 34 - - fs/ext2/namei.c | 14 - fs/ext2/super.c | 29 - fs/ext2/symlink.c | 14 - fs/ext2/xattr.c | 1212 +++++++++++++++++++++++++++++++++++++++++ - fs/ext2/xattr_user.c | 103 +++ - fs/ext3/Makefile | 10 - fs/ext3/ext3-exports.c | 13 - fs/ext3/file.c | 5 - fs/ext3/ialloc.c | 2 - fs/ext3/inode.c | 35 - - fs/ext3/namei.c | 21 - fs/ext3/super.c | 36 + - fs/ext3/symlink.c | 14 - fs/ext3/xattr.c | 1225 ++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/xattr_user.c | 111 +++ - fs/jfs/jfs_xattr.h | 6 - fs/jfs/xattr.c | 6 - fs/mbcache.c | 648 ++++++++++++++++++++++ - include/asm-arm/unistd.h | 2 - include/asm-ppc64/unistd.h | 2 - include/asm-s390/unistd.h | 15 - include/asm-s390x/unistd.h | 15 - include/asm-sparc/unistd.h | 24 - include/asm-sparc64/unistd.h | 24 - include/linux/cache_def.h | 15 - include/linux/errno.h | 4 - include/linux/ext2_fs.h | 31 - - include/linux/ext2_xattr.h | 157 +++++ - include/linux/ext3_fs.h | 31 - - include/linux/ext3_jbd.h | 8 - include/linux/ext3_xattr.h | 157 +++++ - include/linux/fs.h | 2 - include/linux/mbcache.h | 69 ++ - kernel/ksyms.c | 4 - mm/vmscan.c | 36 + - 62 files changed, 4344 insertions(+), 183 deletions(-) - ---- kernel-2.4.20-6chaos_18_7/Documentation/Configure.help~linux-2.4.20-xattr-0.8.54-chaos 2003-06-23 10:39:21.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/Documentation/Configure.help 2003-07-12 15:34:44.000000000 -0600 -@@ -15253,6 +15253,39 @@ CONFIG_EXT2_FS - be compiled as a module, and so this could be dangerous. Most - everyone wants to say Y here. - -+Ext2 extended attributes -+CONFIG_EXT2_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 extended attribute block sharing -+CONFIG_EXT2_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext2 extended user attributes -+CONFIG_EXT2_FS_XATTR_USER -+ This option enables extended user attributes on ext2. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 trusted extended attributes -+CONFIG_EXT2_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext2 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Ext3 journalling file system support (EXPERIMENTAL) - CONFIG_EXT3_FS - This is the journalling version of the Second extended file system -@@ -15285,6 +15318,39 @@ CONFIG_EXT3_FS - of your root partition (the one containing the directory /) cannot - be compiled as a module, and so this may be dangerous. - -+Ext3 extended attributes -+CONFIG_EXT3_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 extended attribute block sharing -+CONFIG_EXT3_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext3 extended user attributes -+CONFIG_EXT3_FS_XATTR_USER -+ This option enables extended user attributes on ext3. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 trusted extended attributes -+CONFIG_EXT3_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext3 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Journal Block Device support (JBD for ext3) (EXPERIMENTAL) - CONFIG_JBD - This is a generic journalling layer for block devices. It is ---- kernel-2.4.20-6chaos_18_7/arch/alpha/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:54.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/alpha/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ALPHA=y - # CONFIG_UID16 is not set - # CONFIG_RWSEM_GENERIC_SPINLOCK is not set ---- kernel-2.4.20-6chaos_18_7/arch/alpha/kernel/entry.S~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:11:53.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/alpha/kernel/entry.S 2003-07-12 15:34:44.000000000 -0600 -@@ -1162,6 +1162,18 @@ sys_call_table: - .quad sys_readahead - .quad sys_ni_syscall /* 380, sys_security */ - .quad sys_tkill -+ .quad sys_setxattr -+ .quad sys_lsetxattr -+ .quad sys_fsetxattr -+ .quad sys_getxattr /* 385 */ -+ .quad sys_lgetxattr -+ .quad sys_fgetxattr -+ .quad sys_listxattr -+ .quad sys_llistxattr -+ .quad sys_flistxattr /* 390 */ -+ .quad sys_removexattr -+ .quad sys_lremovexattr -+ .quad sys_fremovexattr - - /* Remember to update everything, kids. */ - .ifne (. - sys_call_table) - (NR_SYSCALLS * 8) ---- kernel-2.4.20-6chaos_18_7/arch/arm/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:56.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/arm/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ARM=y - # CONFIG_EISA is not set - # CONFIG_SBUS is not set ---- kernel-2.4.20-6chaos_18_7/arch/arm/kernel/calls.S~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:09:16.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/arm/kernel/calls.S 2003-07-12 15:34:44.000000000 -0600 -@@ -240,18 +240,18 @@ __syscall_start: - .long SYMBOL_NAME(sys_ni_syscall) /* Security */ - .long SYMBOL_NAME(sys_gettid) - /* 225 */ .long SYMBOL_NAME(sys_readahead) -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_setxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_lsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_getxattr */ --/* 230 */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_lgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_listxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_llistxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_flistxattr */ --/* 235 */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_removexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_lremovexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fremovexattr */ -+ .long SYMBOL_NAME(sys_setxattr) -+ .long SYMBOL_NAME(sys_lsetxattr) -+ .long SYMBOL_NAME(sys_fsetxattr) -+ .long SYMBOL_NAME(sys_getxattr) -+/* 230 */ .long SYMBOL_NAME(sys_lgetxattr) -+ .long SYMBOL_NAME(sys_fgetxattr) -+ .long SYMBOL_NAME(sys_listxattr) -+ .long SYMBOL_NAME(sys_llistxattr) -+ .long SYMBOL_NAME(sys_flistxattr) -+/* 235 */ .long SYMBOL_NAME(sys_removexattr) -+ .long SYMBOL_NAME(sys_lremovexattr) -+ .long SYMBOL_NAME(sys_fremovexattr) - .long SYMBOL_NAME(sys_tkill) - /* - * Please check 2.5 _before_ adding calls here, ---- kernel-2.4.20-6chaos_18_7/arch/i386/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:12:00.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/i386/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_X86=y - CONFIG_ISA=y - # CONFIG_SBUS is not set ---- kernel-2.4.20-6chaos_18_7/arch/ia64/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:12:04.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/ia64/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options ---- kernel-2.4.20-6chaos_18_7/arch/m68k/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:55.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/m68k/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_UID16=y - - # ---- kernel-2.4.20-6chaos_18_7/arch/mips/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:58:06.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/mips/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - CONFIG_MIPS32=y - # CONFIG_MIPS64 is not set ---- kernel-2.4.20-6chaos_18_7/arch/mips64/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:58:11.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/mips64/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - # CONFIG_MIPS32 is not set - CONFIG_MIPS64=y ---- kernel-2.4.20-6chaos_18_7/arch/ppc/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:12:20.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/ppc/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_UID16 is not set - # CONFIG_RWSEM_GENERIC_SPINLOCK is not set - CONFIG_RWSEM_XCHGADD_ALGORITHM=y ---- kernel-2.4.20-6chaos_18_7/arch/ppc64/kernel/misc.S~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:58:20.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/ppc64/kernel/misc.S 2003-07-12 15:34:44.000000000 -0600 -@@ -731,6 +731,7 @@ _GLOBAL(sys_call_table32) - .llong .sys_gettid /* 207 */ - #if 0 /* Reserved syscalls */ - .llong .sys_tkill /* 208 */ -+#endif - .llong .sys_setxattr - .llong .sys_lsetxattr /* 210 */ - .llong .sys_fsetxattr -@@ -743,6 +744,7 @@ _GLOBAL(sys_call_table32) - .llong .sys_removexattr - .llong .sys_lremovexattr - .llong .sys_fremovexattr /* 220 */ -+#if 0 /* Reserved syscalls */ - .llong .sys_futex - #endif - .llong .sys_perfmonctl /* Put this here for now ... */ ---- kernel-2.4.20-6chaos_18_7/arch/s390/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:58:20.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/s390/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set ---- kernel-2.4.20-6chaos_18_7/arch/s390/kernel/entry.S~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:58:20.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/s390/kernel/entry.S 2003-07-12 15:34:44.000000000 -0600 -@@ -558,18 +558,18 @@ sys_call_table: - .long sys_fcntl64 - .long sys_ni_syscall - .long sys_ni_syscall -- .long sys_ni_syscall /* 224 - reserved for setxattr */ -- .long sys_ni_syscall /* 225 - reserved for lsetxattr */ -- .long sys_ni_syscall /* 226 - reserved for fsetxattr */ -- .long sys_ni_syscall /* 227 - reserved for getxattr */ -- .long sys_ni_syscall /* 228 - reserved for lgetxattr */ -- .long sys_ni_syscall /* 229 - reserved for fgetxattr */ -- .long sys_ni_syscall /* 230 - reserved for listxattr */ -- .long sys_ni_syscall /* 231 - reserved for llistxattr */ -- .long sys_ni_syscall /* 232 - reserved for flistxattr */ -- .long sys_ni_syscall /* 233 - reserved for removexattr */ -- .long sys_ni_syscall /* 234 - reserved for lremovexattr */ -- .long sys_ni_syscall /* 235 - reserved for fremovexattr */ -+ .long sys_setxattr -+ .long sys_lsetxattr /* 225 */ -+ .long sys_fsetxattr -+ .long sys_getxattr -+ .long sys_lgetxattr -+ .long sys_fgetxattr -+ .long sys_listxattr /* 230 */ -+ .long sys_llistxattr -+ .long sys_flistxattr -+ .long sys_removexattr -+ .long sys_lremovexattr -+ .long sys_fremovexattr /* 235 */ - .long sys_gettid - .long sys_tkill - .rept 255-237 ---- kernel-2.4.20-6chaos_18_7/arch/s390x/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:58:21.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/s390x/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set ---- kernel-2.4.20-6chaos_18_7/arch/s390x/kernel/entry.S~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:58:21.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/s390x/kernel/entry.S 2003-07-12 15:34:44.000000000 -0600 -@@ -591,18 +591,18 @@ sys_call_table: - .long SYSCALL(sys_ni_syscall,sys32_fcntl64_wrapper) - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 224 - reserved for setxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 225 - reserved for lsetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 226 - reserved for fsetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 227 - reserved for getxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 228 - reserved for lgetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 229 - reserved for fgetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 230 - reserved for listxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 231 - reserved for llistxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 232 - reserved for flistxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 233 - reserved for removexattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 234 - reserved for lremovexattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 235 - reserved for fremovexattr */ -+ .long SYSCALL(sys_setxattr,sys32_setxattr_wrapper) -+ .long SYSCALL(sys_lsetxattr,sys32_lsetxattr_wrapper) /* 225 */ -+ .long SYSCALL(sys_fsetxattr,sys32_fsetxattr_wrapper) -+ .long SYSCALL(sys_getxattr,sys32_getxattr_wrapper) -+ .long SYSCALL(sys_lgetxattr,sys32_lgetxattr_wrapper) -+ .long SYSCALL(sys_fgetxattr,sys32_fgetxattr_wrapper) -+ .long SYSCALL(sys_listxattr,sys32_listxattr_wrapper) /* 230 */ -+ .long SYSCALL(sys_llistxattr,sys32_llistxattr_wrapper) -+ .long SYSCALL(sys_flistxattr,sys32_flistxattr_wrapper) -+ .long SYSCALL(sys_removexattr,sys32_removexattr_wrapper) -+ .long SYSCALL(sys_lremovexattr,sys32_lremovexattr_wrapper) -+ .long SYSCALL(sys_fremovexattr,sys32_fremovexattr_wrapper)/* 235 */ - .long SYSCALL(sys_gettid,sys_gettid) - .long SYSCALL(sys_tkill,sys_tkill) - .rept 255-237 ---- kernel-2.4.20-6chaos_18_7/arch/s390x/kernel/wrapper32.S~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:59.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/s390x/kernel/wrapper32.S 2003-07-12 15:34:44.000000000 -0600 -@@ -1091,3 +1091,95 @@ sys32_fstat64_wrapper: - llgtr %r3,%r3 # struct stat64 * - llgfr %r4,%r4 # long - jg sys32_fstat64 # branch to system call -+ -+ .globl sys32_setxattr_wrapper -+sys32_setxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_setxattr -+ -+ .globl sys32_lsetxattr_wrapper -+sys32_lsetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_lsetxattr -+ -+ .globl sys32_fsetxattr_wrapper -+sys32_fsetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_fsetxattr -+ -+ .globl sys32_getxattr_wrapper -+sys32_getxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_getxattr -+ -+ .globl sys32_lgetxattr_wrapper -+sys32_lgetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_lgetxattr -+ -+ .globl sys32_fgetxattr_wrapper -+sys32_fgetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_fgetxattr -+ -+ .globl sys32_listxattr_wrapper -+sys32_listxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_listxattr -+ -+ .globl sys32_llistxattr_wrapper -+sys32_llistxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_llistxattr -+ -+ .globl sys32_flistxattr_wrapper -+sys32_flistxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_flistxattr -+ -+ .globl sys32_removexattr_wrapper -+sys32_removexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_removexattr -+ -+ .globl sys32_lremovexattr_wrapper -+sys32_lremovexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_lremovexattr -+ -+ .globl sys32_fremovexattr_wrapper -+sys32_fremovexattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ jg sys_fremovexattr -+ -+ ---- kernel-2.4.20-6chaos_18_7/arch/sparc/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:10:50.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/sparc/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_UID16=y - CONFIG_HIGHMEM=y - ---- kernel-2.4.20-6chaos_18_7/arch/sparc/kernel/systbls.S~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:10:52.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/sparc/kernel/systbls.S 2003-07-12 15:34:44.000000000 -0600 -@@ -51,11 +51,11 @@ sys_call_table: - /*150*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - /*155*/ .long sys_fcntl64, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount - /*160*/ .long sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_nis_syscall --/*165*/ .long sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall --/*170*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents --/*175*/ .long sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_sigpending, sys_query_module --/*185*/ .long sys_setpgid, sys_nis_syscall, sys_tkill, sys_nis_syscall, sys_newuname -+/*165*/ .long sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_setxattr -+/*170*/ .long sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents -+/*175*/ .long sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_query_module -+/*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sys_newuname - /*190*/ .long sys_init_module, sys_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - /*195*/ .long sys_nis_syscall, sys_nis_syscall, sys_getppid, sparc_sigaction, sys_sgetmask - /*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, old_readdir ---- kernel-2.4.20-6chaos_18_7/arch/sparc64/defconfig~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:12:29.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/sparc64/defconfig 2003-07-12 15:34:44.000000000 -0600 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options ---- kernel-2.4.20-6chaos_18_7/arch/sparc64/kernel/systbls.S~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:10:55.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/arch/sparc64/kernel/systbls.S 2003-07-12 15:34:44.000000000 -0600 -@@ -52,11 +52,11 @@ sys_call_table32: - /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - .word sys32_fcntl64, sys_nis_syscall, sys32_statfs, sys32_fstatfs, sys_oldumount - /*160*/ .word sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_nis_syscall -- .word sys32_quotactl, sys_nis_syscall, sys32_mount, sys_ustat, sys_nis_syscall --/*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_getdents -- .word sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_sigpending, sys32_query_module -- .word sys_setpgid, sys_nis_syscall, sys_tkill, sys_nis_syscall, sparc64_newuname -+ .word sys32_quotactl, sys_nis_syscall, sys32_mount, sys_ustat, sys_setxattr -+/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys32_getdents -+ .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys32_sigpending, sys32_query_module -+ .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sparc64_newuname - /*190*/ .word sys32_init_module, sparc64_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - .word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys32_sigaction, sys_sgetmask - /*200*/ .word sys_ssetmask, sys_sigsuspend, sys32_newlstat, sys_uselib, old32_readdir -@@ -111,11 +111,11 @@ sys_call_table: - /*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - .word sys_nis_syscall, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount - /*160*/ .word sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_utrap_install -- .word sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall --/*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents -- .word sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_query_module -- .word sys_setpgid, sys_nis_syscall, sys_tkill, sys_nis_syscall, sparc64_newuname -+ .word sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_setxattr -+/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents -+ .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_query_module -+ .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sparc64_newuname - /*190*/ .word sys_init_module, sparc64_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - .word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys_nis_syscall, sys_sgetmask - /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall ---- kernel-2.4.20-6chaos_18_7/fs/Config.in~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:14:24.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/Config.in 2003-07-12 15:34:44.000000000 -0600 -@@ -34,6 +34,11 @@ dep_mbool ' Debug Befs' CONFIG_BEFS_DEB - dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL - - tristate 'Ext3 journalling file system support' CONFIG_EXT3_FS -+dep_mbool ' Ext3 extended attributes' CONFIG_EXT3_FS_XATTR $CONFIG_EXT3_FS -+dep_bool ' Ext3 extended attribute block sharing' \ -+ CONFIG_EXT3_FS_XATTR_SHARING $CONFIG_EXT3_FS_XATTR -+dep_bool ' Ext3 extended user attributes' \ -+ CONFIG_EXT3_FS_XATTR_USER $CONFIG_EXT3_FS_XATTR - # CONFIG_JBD could be its own option (even modular), but until there are - # other users than ext3, we will simply make it be the same as CONFIG_EXT3_FS - # dep_tristate ' Journal Block Device support (JBD for ext3)' CONFIG_JBD $CONFIG_EXT3_FS -@@ -93,6 +98,11 @@ dep_mbool ' QNX4FS write support (DANGE - tristate 'ROM file system support' CONFIG_ROMFS_FS - - tristate 'Second extended fs support' CONFIG_EXT2_FS -+dep_mbool ' Ext2 extended attributes' CONFIG_EXT2_FS_XATTR $CONFIG_EXT2_FS -+dep_bool ' Ext2 extended attribute block sharing' \ -+ CONFIG_EXT2_FS_XATTR_SHARING $CONFIG_EXT2_FS_XATTR -+dep_bool ' Ext2 extended user attributes' \ -+ CONFIG_EXT2_FS_XATTR_USER $CONFIG_EXT2_FS_XATTR - - tristate 'System V/Xenix/V7/Coherent file system support' CONFIG_SYSV_FS - -@@ -164,6 +174,10 @@ else - define_tristate CONFIG_ZISOFS_FS n - fi - -+# Meta block cache for Extended Attributes (ext2/ext3) -+#tristate 'Meta block cache' CONFIG_FS_MBCACHE -+define_tristate CONFIG_FS_MBCACHE y -+ - mainmenu_option next_comment - comment 'Partition Types' - source fs/partitions/Config.in ---- kernel-2.4.20-6chaos_18_7/fs/Makefile~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:33:34.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/Makefile 2003-07-12 15:34:44.000000000 -0600 -@@ -84,6 +84,9 @@ obj-y += binfmt_script.o - - obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o - -+export-objs += mbcache.o -+obj-$(CONFIG_FS_MBCACHE) += mbcache.o -+ - # persistent filesystems - obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) - ---- kernel-2.4.20-6chaos_18_7/fs/ext2/Makefile~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:46.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/Makefile 2003-07-12 15:34:44.000000000 -0600 -@@ -13,4 +13,8 @@ obj-y := balloc.o bitmap.o dir.o file - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make ---- kernel-2.4.20-6chaos_18_7/fs/ext2/file.c~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:46.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/file.c 2003-07-12 15:34:44.000000000 -0600 -@@ -20,6 +20,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/sched.h> - - /* -@@ -51,4 +52,8 @@ struct file_operations ext2_file_operati - - struct inode_operations ext2_file_inode_operations = { - truncate: ext2_truncate, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- kernel-2.4.20-6chaos_18_7/fs/ext2/ialloc.c~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:59:09.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/ialloc.c 2003-07-12 15:34:44.000000000 -0600 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/locks.h> - #include <linux/quotaops.h> - -@@ -167,6 +168,7 @@ void ext2_free_inode (struct inode * ino - */ - if (!is_bad_inode(inode)) { - /* Quota is already initialized in iput() */ -+ ext2_xattr_delete_inode(inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - } ---- kernel-2.4.20-6chaos_18_7/fs/ext2/inode.c~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:59:09.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/inode.c 2003-07-12 15:34:44.000000000 -0600 -@@ -39,6 +39,18 @@ MODULE_LICENSE("GPL"); - static int ext2_update_inode(struct inode * inode, int do_sync); - - /* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext2_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext2_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ -+/* - * Called at each iput() - */ - void ext2_put_inode (struct inode * inode) -@@ -53,9 +65,7 @@ void ext2_delete_inode (struct inode * i - { - lock_kernel(); - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - inode->u.ext2_i.i_dtime = CURRENT_TIME; - mark_inode_dirty(inode); -@@ -801,6 +811,8 @@ void ext2_truncate (struct inode * inode - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext2_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -888,8 +900,7 @@ void ext2_read_inode (struct inode * ino - unsigned long offset; - struct ext2_group_desc * gdp; - -- if ((inode->i_ino != EXT2_ROOT_INO && inode->i_ino != EXT2_ACL_IDX_INO && -- inode->i_ino != EXT2_ACL_DATA_INO && -+ if ((inode->i_ino != EXT2_ROOT_INO && - inode->i_ino < EXT2_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu(inode->i_sb->u.ext2_sb.s_es->s_inodes_count)) { - ext2_error (inode->i_sb, "ext2_read_inode", -@@ -974,10 +985,7 @@ void ext2_read_inode (struct inode * ino - for (block = 0; block < EXT2_N_BLOCKS; block++) - inode->u.ext2_i.i_data[block] = raw_inode->i_block[block]; - -- if (inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext2_file_inode_operations; - inode->i_fop = &ext2_file_operations; - inode->i_mapping->a_ops = &ext2_aops; -@@ -986,15 +994,17 @@ void ext2_read_inode (struct inode * ino - inode->i_fop = &ext2_dir_operations; - inode->i_mapping->a_ops = &ext2_aops; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext2_inode_is_fast_symlink(inode)) - inode->i_op = &ext2_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - } -- } else -+ } else { -+ inode->i_op = &ext2_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(raw_inode->i_block[0])); -+ } - brelse (bh); - inode->i_attr_flags = 0; - if (inode->u.ext2_i.i_flags & EXT2_SYNC_FL) { ---- kernel-2.4.20-6chaos_18_7/fs/ext2/namei.c~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:46.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/namei.c 2003-07-12 15:34:44.000000000 -0600 -@@ -31,6 +31,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/pagemap.h> - - /* -@@ -136,7 +137,7 @@ static int ext2_symlink (struct inode * - - if (l > sizeof (inode->u.ext2_i.i_data)) { - /* slow symlink */ -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - err = block_symlink(inode, symname, l); - if (err) -@@ -345,4 +346,15 @@ struct inode_operations ext2_dir_inode_o - rmdir: ext2_rmdir, - mknod: ext2_mknod, - rename: ext2_rename, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ -+struct inode_operations ext2_special_inode_operations = { -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- kernel-2.4.20-6chaos_18_7/fs/ext2/super.c~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:59:09.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/super.c 2003-07-12 15:34:44.000000000 -0600 -@@ -21,6 +21,7 @@ - #include <linux/string.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -125,6 +126,7 @@ void ext2_put_super (struct super_block - int db_count; - int i; - -+ ext2_xattr_put_super(sb); - if (!(sb->s_flags & MS_RDONLY)) { - struct ext2_super_block *es = EXT2_SB(sb)->s_es; - -@@ -175,6 +177,13 @@ static int parse_options (char * options - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -424,6 +433,9 @@ struct super_block * ext2_read_super (st - blocksize = BLOCK_SIZE; - - sb->u.ext2_sb.s_mount_opt = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ /* set_opt (sb->u.ext2_sb.s_mount_opt, XATTR_USER); */ -+#endif - if (!parse_options ((char *) data, &sb_block, &resuid, &resgid, - &sb->u.ext2_sb.s_mount_opt)) { - return NULL; -@@ -813,12 +825,27 @@ static DECLARE_FSTYPE_DEV(ext2_fs_type, - - static int __init init_ext2_fs(void) - { -- return register_filesystem(&ext2_fs_type); -+ int error = init_ext2_xattr(); -+ if (error) -+ return error; -+ error = init_ext2_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext2_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext2_xattr_user(); -+fail: -+ exit_ext2_xattr(); -+ return error; - } - - static void __exit exit_ext2_fs(void) - { - unregister_filesystem(&ext2_fs_type); -+ exit_ext2_xattr_user(); -+ exit_ext2_xattr(); - } - - EXPORT_NO_SYMBOLS; ---- kernel-2.4.20-6chaos_18_7/fs/ext2/symlink.c~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:46.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/symlink.c 2003-07-12 15:34:44.000000000 -0600 -@@ -19,6 +19,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - - static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -32,7 +33,20 @@ static int ext2_follow_link(struct dentr - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext2_symlink_inode_operations = { -+ readlink: page_readlink, -+ follow_link: page_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ - struct inode_operations ext2_fast_symlink_inode_operations = { - readlink: ext2_readlink, - follow_link: ext2_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/xattr.c 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,1212 @@ -+/* -+ * linux/fs/ext2/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT2_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT2_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext2_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+/* These symbols may be needed by a module. */ -+EXPORT_SYMBOL(ext2_xattr_register); -+EXPORT_SYMBOL(ext2_xattr_unregister); -+EXPORT_SYMBOL(ext2_xattr_get); -+EXPORT_SYMBOL(ext2_xattr_list); -+EXPORT_SYMBOL(ext2_xattr_set); -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext2_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext2_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT2_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext2_xattr_set2(struct inode *, struct buffer_head *, -+ struct ext2_xattr_header *); -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+static int ext2_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext2_xattr_cache_find(struct inode *, -+ struct ext2_xattr_header *); -+static void ext2_xattr_cache_remove(struct buffer_head *); -+static void ext2_xattr_rehash(struct ext2_xattr_header *, -+ struct ext2_xattr_entry *); -+ -+static struct mb_cache *ext2_xattr_cache; -+ -+#else -+# define ext2_xattr_cache_insert(bh) 0 -+# define ext2_xattr_cache_find(inode, header) NULL -+# define ext2_xattr_cache_remove(bh) while(0) {} -+# define ext2_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext2_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext2_xattr_sem); -+ -+static inline int -+ext2_xattr_new_block(struct inode *inode, int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block) + -+ EXT2_I(inode)->i_block_group * EXT2_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext2_new_block(inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext2_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext2_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext2_xattr_free_block(struct inode * inode, unsigned long block) -+{ -+ ext2_free_blocks(inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext2_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext2_xattr_free_block(inode, block) \ -+ ext2_free_blocks(inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext2_xattr_handler *ext2_xattr_handlers[EXT2_XATTR_INDEX_MAX]; -+rwlock_t ext2_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext2_xattr_register(int name_index, struct ext2_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ if (!ext2_xattr_handlers[name_index-1]) { -+ ext2_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext2_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext2_xattr_unregister(int name_index, struct ext2_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ ext2_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext2_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static struct ext2_xattr_handler * -+ext2_xattr_resolve_name(const char **name) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext2_handler_lock); -+ for (i=0; i<EXT2_XATTR_INDEX_MAX; i++) { -+ if (ext2_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext2_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext2_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext2_handler_lock); -+ return handler; -+} -+ -+static inline struct ext2_xattr_handler * -+ext2_xattr_handler(int name_index) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ read_lock(&ext2_handler_lock); -+ handler = ext2_xattr_handlers[name_index-1]; -+ read_unlock(&ext2_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext2_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext2_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT2_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT2_I(inode)->i_file_acl) -+ return 0; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT2_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext2_xattr_update_super_block(struct super_block *sb) -+{ -+ if (EXT2_HAS_COMPAT_FEATURE(sb, EXT2_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT2_SB(sb)->s_feature_compat |= EXT2_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT2_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT2_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ mark_buffer_dirty(EXT2_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext2_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_header *header = NULL; -+ struct ext2_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT2_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext2_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(sb, "ext2_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext2_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT2_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT2_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT2_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext2_xattr_cache_remove(bh); -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT2_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT2_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT2_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT2_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext2_xattr_set2(inode, bh, NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT2_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT2_XATTR_PAD, 0, -+ EXT2_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext2_xattr_rehash(header, here); -+ -+ error = ext2_xattr_set2(inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext2_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext2_xattr_set(): Update the file system. -+ */ -+static int -+ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, -+ struct ext2_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext2_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext2_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext2_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT2_I(inode)->i_file_acl != 0; -+ int block = ext2_xattr_new_block(inode, &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+ ext2_xattr_free_block(inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext2_xattr_cache_insert(new_bh); -+ -+ ext2_xattr_update_super_block(sb); -+ } -+ mark_buffer_dirty(new_bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &new_bh); -+ wait_on_buffer(new_bh); -+ error = -EIO; -+ if (buffer_req(new_bh) && !buffer_uptodate(new_bh)) -+ goto cleanup; -+ } -+ } -+ -+ /* Update the inode. */ -+ EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ if (IS_SYNC(inode)) { -+ error = ext2_sync_inode (inode); -+ if (error) -+ goto cleanup; -+ } else -+ mark_inode_dirty(inode); -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext2_xattr_free_block(inode, old_bh->b_blocknr); -+ mark_buffer_clean(old_bh); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext2_xattr_quota_free(inode); -+ mark_buffer_dirty(old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT2_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext2_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext2_xattr_cache_remove(bh); -+ ext2_xattr_free_block(inode, block); -+ bforget(bh); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ mark_buffer_dirty(bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &bh); -+ wait_on_buffer(bh); -+ } -+ ext2_xattr_quota_free(inode); -+ } -+ EXT2_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext2_xattr_sem); -+} -+ -+/* -+ * ext2_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ mb_cache_shrink(ext2_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+/* -+ * ext2_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext2_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext2_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext2_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext2_xattr_cmp(struct ext2_xattr_header *header1, -+ struct ext2_xattr_header *header2) -+{ -+ struct ext2_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT2_XATTR_NEXT(entry1); -+ entry2 = EXT2_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext2_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext2_xattr_cache_find(struct inode *inode, struct ext2_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext2_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT2_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT2_XATTR_REFCOUNT_MAX); -+ } else if (!ext2_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext2_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext2_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext2_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext2_xattr_hash_entry(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT2_XATTR_ROUND) >> EXT2_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext2_xattr_rehash(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ struct ext2_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext2_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT2_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext2_xattr(void) -+{ -+ ext2_xattr_cache = mb_cache_create("ext2_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext2_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+ mb_cache_destroy(ext2_xattr_cache); -+} -+ -+#else /* CONFIG_EXT2_FS_XATTR_SHARING */ -+ -+int __init -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT2_FS_XATTR_SHARING */ ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext2/xattr_user.c 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,103 @@ -+/* -+ * linux/fs/ext2/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+ -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+# include <linux/ext2_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext2_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext2_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_get(inode, EXT2_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext2_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_set(inode, EXT2_XATTR_INDEX_USER, name, -+ value, size, flags); -+} -+ -+struct ext2_xattr_handler ext2_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext2_xattr_user_list, -+ get: ext2_xattr_user_get, -+ set: ext2_xattr_user_set, -+}; -+ -+int __init -+init_ext2_xattr_user(void) -+{ -+ return ext2_xattr_register(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -+ -+void -+exit_ext2_xattr_user(void) -+{ -+ ext2_xattr_unregister(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} ---- kernel-2.4.20-6chaos_18_7/fs/ext3/Makefile~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:33:38.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/Makefile 2003-07-12 15:34:44.000000000 -0600 -@@ -1,5 +1,5 @@ - # --# Makefile for the linux ext2-filesystem routines. -+# Makefile for the linux ext3-filesystem routines. - # - # Note! Dependencies are done automagically by 'make dep', which also - # removes any old dependencies. DON'T put your own dependencies here -@@ -9,10 +9,14 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make ---- kernel-2.4.20-6chaos_18_7/fs/ext3/file.c~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:33:38.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/file.c 2003-07-12 15:34:44.000000000 -0600 -@@ -23,6 +23,7 @@ - #include <linux/locks.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - #include <linux/ext3_jbd.h> - #include <linux/smp_lock.h> - -@@ -126,5 +127,9 @@ struct file_operations ext3_file_operati - struct inode_operations ext3_file_inode_operations = { - truncate: ext3_truncate, /* BKL held */ - setattr: ext3_setattr, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; - ---- kernel-2.4.20-6chaos_18_7/fs/ext3/ialloc.c~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:14:30.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/ialloc.c 2003-07-12 15:34:44.000000000 -0600 -@@ -17,6 +17,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/stat.h> - #include <linux/string.h> - #include <linux/locks.h> -@@ -216,6 +217,7 @@ void ext3_free_inode (handle_t *handle, - * as writing the quota to disk may need the lock as well. - */ - DQUOT_INIT(inode); -+ ext3_xattr_delete_inode(handle, inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - ---- kernel-2.4.20-6chaos_18_7/fs/ext3/inode.c~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:14:30.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/inode.c 2003-07-12 15:34:44.000000000 -0600 -@@ -39,6 +39,18 @@ - */ - #undef SEARCH_FROM_ZERO - -+/* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext3_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext3_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ - /* The ext3 forget function must perform a revoke if we are freeing data - * which has been journaled. Metadata (eg. indirect blocks) must be - * revoked in all cases. -@@ -48,7 +60,7 @@ - * still needs to be revoked. - */ - --static int ext3_forget(handle_t *handle, int is_metadata, -+int ext3_forget(handle_t *handle, int is_metadata, - struct inode *inode, struct buffer_head *bh, - int blocknr) - { -@@ -179,9 +191,7 @@ void ext3_delete_inode (struct inode * i - { - handle_t *handle; - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - - lock_kernel(); -@@ -1874,6 +1884,8 @@ void ext3_truncate(struct inode * inode) - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext3_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -2021,8 +2033,6 @@ int ext3_get_inode_loc (struct inode *in - struct ext3_group_desc * gdp; - - if ((inode->i_ino != EXT3_ROOT_INO && -- inode->i_ino != EXT3_ACL_IDX_INO && -- inode->i_ino != EXT3_ACL_DATA_INO && - inode->i_ino != EXT3_JOURNAL_INO && - inode->i_ino < EXT3_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu( -@@ -2149,10 +2159,7 @@ void ext3_read_inode(struct inode * inod - - brelse (iloc.bh); - -- if (inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; - inode->i_mapping->a_ops = &ext3_aops; -@@ -2160,15 +2167,17 @@ void ext3_read_inode(struct inode * inod - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - } -- } else -+ } else { -+ inode->i_op = &ext3_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(iloc.raw_inode->i_block[0])); -+ } - /* inode->i_attr_flags = 0; unused */ - if (inode->u.ext3_i.i_flags & EXT3_SYNC_FL) { - /* inode->i_attr_flags |= ATTR_FLAG_SYNCRONOUS; unused */ ---- kernel-2.4.20-6chaos_18_7/fs/ext3/namei.c~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:33:43.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/namei.c 2003-07-12 15:34:44.000000000 -0600 -@@ -29,6 +29,7 @@ - #include <linux/sched.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/fcntl.h> - #include <linux/stat.h> - #include <linux/string.h> -@@ -1613,7 +1614,7 @@ static int ext3_mkdir(struct inode * dir - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR); -+ inode = ext3_new_inode (handle, dir, S_IFDIR | mode); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -1621,7 +1622,6 @@ static int ext3_mkdir(struct inode * dir - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; -- inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ -@@ -1648,9 +1648,6 @@ static int ext3_mkdir(struct inode * dir - BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata"); - ext3_journal_dirty_metadata(handle, dir_block); - brelse (dir_block); -- inode->i_mode = S_IFDIR | mode; -- if (dir->i_mode & S_ISGID) -- inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); - if (err) { -@@ -2019,7 +2016,7 @@ static int ext3_symlink (struct inode * - goto out_stop; - - if (l > sizeof (EXT3_I(inode)->i_data)) { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* - * block_symlink() calls back into ext3_prepare/commit_write. -@@ -2245,4 +2242,16 @@ struct inode_operations ext3_dir_inode_o - rmdir: ext3_rmdir, /* BKL held */ - mknod: ext3_mknod, /* BKL held */ - rename: ext3_rename, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; -+ -+struct inode_operations ext3_special_inode_operations = { -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ ---- kernel-2.4.20-6chaos_18_7/fs/ext3/super.c~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:33:38.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/super.c 2003-07-12 15:34:44.000000000 -0600 -@@ -24,6 +24,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -406,6 +407,7 @@ void ext3_put_super (struct super_block - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { - EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -@@ -502,6 +504,7 @@ static int parse_options (char * options - int is_remount) - { - unsigned long *mount_options = &sbi->s_mount_opt; -+ - uid_t *resuid = &sbi->s_resuid; - gid_t *resgid = &sbi->s_resgid; - char * this_char; -@@ -514,6 +517,13 @@ static int parse_options (char * options - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -931,6 +941,12 @@ struct super_block * ext3_read_super (st - sbi->s_mount_opt = 0; - sbi->s_resuid = EXT3_DEF_RESUID; - sbi->s_resgid = EXT3_DEF_RESGID; -+ -+ /* Default extended attribute flags */ -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ /* set_opt(sbi->s_mount_opt, XATTR_USER); */ -+#endif -+ - if (!parse_options ((char *) data, &sb_block, sbi, &journal_inum, 0)) { - sb->s_dev = 0; - goto out_fail; -@@ -1768,17 +1784,29 @@ static DECLARE_FSTYPE_DEV(ext3_fs_type, - - static int __init init_ext3_fs(void) - { -- return register_filesystem(&ext3_fs_type); -+ int error = init_ext3_xattr(); -+ if (error) -+ return error; -+ error = init_ext3_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext3_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext3_xattr_user(); -+fail: -+ exit_ext3_xattr(); -+ return error; - } - - static void __exit exit_ext3_fs(void) - { - unregister_filesystem(&ext3_fs_type); -+ exit_ext3_xattr_user(); -+ exit_ext3_xattr(); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); -- - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - MODULE_LICENSE("GPL"); ---- kernel-2.4.20-6chaos_18_7/fs/ext3/symlink.c~linux-2.4.20-xattr-0.8.54-chaos 2002-05-07 15:53:46.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/symlink.c 2003-07-12 15:34:44.000000000 -0600 -@@ -20,6 +20,7 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - - static int ext3_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -33,7 +34,20 @@ static int ext3_follow_link(struct dentr - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext3_symlink_inode_operations = { -+ readlink: page_readlink, /* BKL not held. Don't need */ -+ follow_link: page_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ - struct inode_operations ext3_fast_symlink_inode_operations = { - readlink: ext3_readlink, /* BKL not held. Don't need */ - follow_link: ext3_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/xattr.c 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,1225 @@ -+/* -+ * linux/fs/ext3/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Ext3 code with a lot of help from Eric Jarman <ejarman@acm.org>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT3_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT3_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext3_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+#define EXT3_EA_USER "user." -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext3_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext3_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT3_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, -+ struct ext3_xattr_header *); -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+static int ext3_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext3_xattr_cache_find(struct inode *, -+ struct ext3_xattr_header *); -+static void ext3_xattr_cache_remove(struct buffer_head *); -+static void ext3_xattr_rehash(struct ext3_xattr_header *, -+ struct ext3_xattr_entry *); -+ -+static struct mb_cache *ext3_xattr_cache; -+ -+#else -+# define ext3_xattr_cache_insert(bh) 0 -+# define ext3_xattr_cache_find(inode, header) NULL -+# define ext3_xattr_cache_remove(bh) while(0) {} -+# define ext3_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext3_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext3_xattr_sem); -+ -+static inline int -+ext3_xattr_new_block(handle_t *handle, struct inode *inode, -+ int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + -+ EXT3_I(inode)->i_block_group * EXT3_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext3_new_block(handle, inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext3_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext3_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext3_xattr_free_block(handle_t *handle, struct inode * inode, -+ unsigned long block) -+{ -+ ext3_free_blocks(handle, inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext3_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext3_xattr_free_block(handle, inode, block) \ -+ ext3_free_blocks(handle, inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext3_xattr_handler *ext3_xattr_handlers[EXT3_XATTR_INDEX_MAX]; -+rwlock_t ext3_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext3_xattr_register(int name_index, struct ext3_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ if (!ext3_xattr_handlers[name_index-1]) { -+ ext3_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext3_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext3_xattr_unregister(int name_index, struct ext3_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ ext3_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext3_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static inline struct ext3_xattr_handler * -+ext3_xattr_resolve_name(const char **name) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext3_handler_lock); -+ for (i=0; i<EXT3_XATTR_INDEX_MAX; i++) { -+ if (ext3_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext3_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext3_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext3_handler_lock); -+ return handler; -+} -+ -+static inline struct ext3_xattr_handler * -+ext3_xattr_handler(int name_index) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ read_lock(&ext3_handler_lock); -+ handler = ext3_xattr_handlers[name_index-1]; -+ read_unlock(&ext3_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext3_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext3_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT3_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT3_I(inode)->i_file_acl) -+ return 0; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext3_xattr_update_super_block(handle_t *handle, -+ struct super_block *sb) -+{ -+ if (EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT3_SB(sb)->s_feature_compat |= EXT3_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT3_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT3_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext3_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_header *header = NULL; -+ struct ext3_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT3_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext3_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(sb, "ext3_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT3_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT3_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT3_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext3_xattr_cache_remove(bh); -+ error = ext3_journal_get_write_access(handle, bh); -+ if (error) -+ goto cleanup; -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT3_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT3_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT3_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT3_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext3_xattr_set2(handle, inode, bh,NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT3_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT3_XATTR_PAD, 0, -+ EXT3_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext3_xattr_rehash(header, here); -+ -+ error = ext3_xattr_set2(handle, inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext3_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext3_xattr_set(): Update the file system. -+ */ -+static int -+ext3_xattr_set2(handle_t *handle, struct inode *inode, -+ struct buffer_head *old_bh, struct ext3_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext3_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext3_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ error = ext3_journal_get_write_access(handle, new_bh); -+ if (error) -+ goto cleanup; -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext3_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT3_I(inode)->i_file_acl != 0; -+ int block = ext3_xattr_new_block(handle, inode, -+ &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+getblk_failed: ext3_xattr_free_block(handle, inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ error = ext3_journal_get_create_access(handle, new_bh); -+ if (error) { -+ unlock_buffer(new_bh); -+ goto getblk_failed; -+ } -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext3_xattr_cache_insert(new_bh); -+ -+ ext3_xattr_update_super_block(handle, sb); -+ } -+ error = ext3_journal_dirty_metadata(handle, new_bh); -+ if (error) -+ goto cleanup; -+ } -+ -+ /* Update the inode. */ -+ EXT3_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, inode); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ error = ext3_journal_get_write_access(handle, old_bh); -+ if (error) -+ goto cleanup; -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext3_xattr_free_block(handle, inode, old_bh->b_blocknr); -+ -+ /* ext3_forget() calls bforget() for us, but we -+ let our caller release old_bh, so we need to -+ duplicate the handle before. */ -+ get_bh(old_bh); -+ ext3_forget(handle, 1, inode, old_bh,old_bh->b_blocknr); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext3_xattr_quota_free(inode); -+ ext3_journal_dirty_metadata(handle, old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT3_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext3_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ext3_journal_get_write_access(handle, bh); -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext3_xattr_cache_remove(bh); -+ ext3_xattr_free_block(handle, inode, block); -+ ext3_forget(handle, 1, inode, bh, block); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ ext3_journal_dirty_metadata(handle, bh); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ ext3_xattr_quota_free(inode); -+ } -+ EXT3_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext3_xattr_sem); -+} -+ -+/* -+ * ext3_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ mb_cache_shrink(ext3_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+/* -+ * ext3_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext3_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext3_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext3_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext3_xattr_cmp(struct ext3_xattr_header *header1, -+ struct ext3_xattr_header *header2) -+{ -+ struct ext3_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT3_XATTR_NEXT(entry1); -+ entry2 = EXT3_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext3_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext3_xattr_cache_find(struct inode *inode, struct ext3_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext3_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT3_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT3_XATTR_REFCOUNT_MAX); -+ } else if (!ext3_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext3_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext3_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext3_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext3_xattr_hash_entry(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT3_XATTR_ROUND) >> EXT3_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext3_xattr_rehash(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ struct ext3_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext3_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT3_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext3_xattr(void) -+{ -+ ext3_xattr_cache = mb_cache_create("ext3_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext3_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+ if (ext3_xattr_cache) -+ mb_cache_destroy(ext3_xattr_cache); -+ ext3_xattr_cache = NULL; -+} -+ -+#else /* CONFIG_EXT3_FS_XATTR_SHARING */ -+ -+int __init -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_SHARING */ ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/xattr_user.c 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,111 @@ -+/* -+ * linux/fs/ext3/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+# include <linux/ext3_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext3_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext3_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext3_xattr_get(inode, EXT3_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext3_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ handle_t *handle; -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ error = ext3_xattr_set(handle, inode, EXT3_XATTR_INDEX_USER, name, -+ value, size, flags); -+ ext3_journal_stop(handle, inode); -+ -+ return error; -+} -+ -+struct ext3_xattr_handler ext3_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext3_xattr_user_list, -+ get: ext3_xattr_user_get, -+ set: ext3_xattr_user_set, -+}; -+ -+int __init -+init_ext3_xattr_user(void) -+{ -+ return ext3_xattr_register(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} -+ -+void -+exit_ext3_xattr_user(void) -+{ -+ ext3_xattr_unregister(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} ---- kernel-2.4.20-6chaos_18_7/fs/jfs/jfs_xattr.h~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:59:11.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/jfs/jfs_xattr.h 2003-07-12 15:34:44.000000000 -0600 -@@ -52,8 +52,10 @@ struct jfs_ea_list { - #define END_EALIST(ealist) \ - ((struct jfs_ea *) (((char *) (ealist)) + EALIST_SIZE(ealist))) - --extern int __jfs_setxattr(struct inode *, const char *, void *, size_t, int); --extern int jfs_setxattr(struct dentry *, const char *, void *, size_t, int); -+extern int __jfs_setxattr(struct inode *, const char *, const void *, size_t, -+ int); -+extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, -+ int); - extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t); - extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t); - extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); ---- kernel-2.4.20-6chaos_18_7/fs/jfs/xattr.c~linux-2.4.20-xattr-0.8.54-chaos 2003-02-14 15:59:11.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/jfs/xattr.c 2003-07-12 15:34:44.000000000 -0600 -@@ -641,7 +641,7 @@ static int ea_put(struct inode *inode, s - } - - static int can_set_xattr(struct inode *inode, const char *name, -- void *value, size_t value_len) -+ const void *value, size_t value_len) - { - if (IS_RDONLY(inode)) - return -EROFS; -@@ -660,7 +660,7 @@ static int can_set_xattr(struct inode *i - return permission(inode, MAY_WRITE); - } - --int __jfs_setxattr(struct inode *inode, const char *name, void *value, -+int __jfs_setxattr(struct inode *inode, const char *name, const void *value, - size_t value_len, int flags) - { - struct jfs_ea_list *ealist; -@@ -799,7 +799,7 @@ int __jfs_setxattr(struct inode *inode, - return rc; - } - --int jfs_setxattr(struct dentry *dentry, const char *name, void *value, -+int jfs_setxattr(struct dentry *dentry, const char *name, const void *value, - size_t value_len, int flags) - { - if (value == NULL) { /* empty EA, do not remove */ ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/mbcache.c 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,648 @@ -+/* -+ * linux/fs/mbcache.c -+ * (C) 2001-2002 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+/* -+ * Filesystem Meta Information Block Cache (mbcache) -+ * -+ * The mbcache caches blocks of block devices that need to be located -+ * by their device/block number, as well as by other criteria (such -+ * as the block's contents). -+ * -+ * There can only be one cache entry in a cache per device and block number. -+ * Additional indexes need not be unique in this sense. The number of -+ * additional indexes (=other criteria) can be hardwired at compile time -+ * or specified at cache create time. -+ * -+ * Each cache entry is of fixed size. An entry may be `valid' or `invalid' -+ * in the cache. A valid entry is in the main hash tables of the cache, -+ * and may also be in the lru list. An invalid entry is not in any hashes -+ * or lists. -+ * -+ * A valid cache entry is only in the lru list if no handles refer to it. -+ * Invalid cache entries will be freed when the last handle to the cache -+ * entry is released. Entries that cannot be freed immediately are put -+ * back on the lru list. -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+ -+#include <linux/fs.h> -+#include <linux/slab.h> -+#include <linux/sched.h> -+#include <linux/cache_def.h> -+#include <linux/version.h> -+#include <linux/init.h> -+#include <linux/mbcache.h> -+ -+ -+#ifdef MB_CACHE_DEBUG -+# define mb_debug(f...) do { \ -+ printk(KERN_DEBUG f); \ -+ printk("\n"); \ -+ } while (0) -+#define mb_assert(c) do { if (!(c)) \ -+ printk(KERN_ERR "assertion " #c " failed\n"); \ -+ } while(0) -+#else -+# define mb_debug(f...) do { } while(0) -+# define mb_assert(c) do { } while(0) -+#endif -+#define mb_error(f...) do { \ -+ printk(KERN_ERR f); \ -+ printk("\n"); \ -+ } while(0) -+ -+MODULE_AUTHOR("Andreas Gruenbacher <a.gruenbacher@computer.org>"); -+MODULE_DESCRIPTION("Meta block cache (for extended attributes)"); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) -+MODULE_LICENSE("GPL"); -+#endif -+ -+EXPORT_SYMBOL(mb_cache_create); -+EXPORT_SYMBOL(mb_cache_shrink); -+EXPORT_SYMBOL(mb_cache_destroy); -+EXPORT_SYMBOL(mb_cache_entry_alloc); -+EXPORT_SYMBOL(mb_cache_entry_insert); -+EXPORT_SYMBOL(mb_cache_entry_release); -+EXPORT_SYMBOL(mb_cache_entry_takeout); -+EXPORT_SYMBOL(mb_cache_entry_free); -+EXPORT_SYMBOL(mb_cache_entry_dup); -+EXPORT_SYMBOL(mb_cache_entry_get); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+EXPORT_SYMBOL(mb_cache_entry_find_first); -+EXPORT_SYMBOL(mb_cache_entry_find_next); -+#endif -+ -+ -+/* -+ * Global data: list of all mbcache's, lru list, and a spinlock for -+ * accessing cache data structures on SMP machines. The lru list is -+ * global across all mbcaches. -+ */ -+ -+static LIST_HEAD(mb_cache_list); -+static LIST_HEAD(mb_cache_lru_list); -+static spinlock_t mb_cache_spinlock = SPIN_LOCK_UNLOCKED; -+ -+static inline int -+mb_cache_indexes(struct mb_cache *cache) -+{ -+#ifdef MB_CACHE_INDEXES_COUNT -+ return MB_CACHE_INDEXES_COUNT; -+#else -+ return cache->c_indexes_count; -+#endif -+} -+ -+/* -+ * What the mbcache registers as to get shrunk dynamically. -+ */ -+ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask); -+ -+static struct cache_definition mb_cache_definition = { -+ "mb_cache", -+ mb_cache_memory_pressure -+}; -+ -+ -+static inline int -+__mb_cache_entry_is_hashed(struct mb_cache_entry *ce) -+{ -+ return !list_empty(&ce->e_block_list); -+} -+ -+ -+static inline void -+__mb_cache_entry_unhash(struct mb_cache_entry *ce) -+{ -+ int n; -+ -+ if (__mb_cache_entry_is_hashed(ce)) { -+ list_del_init(&ce->e_block_list); -+ for (n=0; n<mb_cache_indexes(ce->e_cache); n++) -+ list_del(&ce->e_indexes[n].o_list); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_forget(struct mb_cache_entry *ce, int gfp_mask) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ -+ mb_assert(atomic_read(&ce->e_used) == 0); -+ if (cache->c_op.free && cache->c_op.free(ce, gfp_mask)) { -+ /* free failed -- put back on the lru list -+ for freeing later. */ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&ce->e_lru_list, &mb_cache_lru_list); -+ spin_unlock(&mb_cache_spinlock); -+ } else { -+ kmem_cache_free(cache->c_entry_cache, ce); -+ atomic_dec(&cache->c_entry_count); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_release_unlock(struct mb_cache_entry *ce) -+{ -+ if (atomic_dec_and_test(&ce->e_used)) { -+ if (__mb_cache_entry_is_hashed(ce)) -+ list_add_tail(&ce->e_lru_list, &mb_cache_lru_list); -+ else { -+ spin_unlock(&mb_cache_spinlock); -+ __mb_cache_entry_forget(ce, GFP_KERNEL); -+ return; -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_memory_pressure() memory pressure callback -+ * -+ * This function is called by the kernel memory management when memory -+ * gets low. -+ * -+ * @priority: Amount by which to shrink the cache (0 = highes priority) -+ * @gfp_mask: (ignored) -+ */ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int count = 0; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &mb_cache_list) { -+ struct mb_cache *cache = -+ list_entry(l, struct mb_cache, c_cache_list); -+ mb_debug("cache %s (%d)", cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ count += atomic_read(&cache->c_entry_count); -+ } -+ mb_debug("trying to free %d of %d entries", -+ count / (priority ? priority : 1), count); -+ if (priority) -+ count /= priority; -+ while (count-- && !list_empty(&mb_cache_lru_list)) { -+ struct mb_cache_entry *ce = -+ list_entry(mb_cache_lru_list.next, -+ struct mb_cache_entry, e_lru_list); -+ list_del(&ce->e_lru_list); -+ __mb_cache_entry_unhash(ce); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), gfp_mask); -+ } -+} -+ -+ -+/* -+ * mb_cache_create() create a new cache -+ * -+ * All entries in one cache are equal size. Cache entries may be from -+ * multiple devices. If this is the first mbcache created, registers -+ * the cache with kernel memory management. Returns NULL if no more -+ * memory was available. -+ * -+ * @name: name of the cache (informal) -+ * @cache_op: contains the callback called when freeing a cache entry -+ * @entry_size: The size of a cache entry, including -+ * struct mb_cache_entry -+ * @indexes_count: number of additional indexes in the cache. Must equal -+ * MB_CACHE_INDEXES_COUNT if the number of indexes is -+ * hardwired. -+ * @bucket_count: number of hash buckets -+ */ -+struct mb_cache * -+mb_cache_create(const char *name, struct mb_cache_op *cache_op, -+ size_t entry_size, int indexes_count, int bucket_count) -+{ -+ int m=0, n; -+ struct mb_cache *cache = NULL; -+ -+ if(entry_size < sizeof(struct mb_cache_entry) + -+ indexes_count * sizeof(struct mb_cache_entry_index)) -+ return NULL; -+ -+ MOD_INC_USE_COUNT; -+ cache = kmalloc(sizeof(struct mb_cache) + -+ indexes_count * sizeof(struct list_head), GFP_KERNEL); -+ if (!cache) -+ goto fail; -+ cache->c_name = name; -+ cache->c_op.free = NULL; -+ if (cache_op) -+ cache->c_op.free = cache_op->free; -+ atomic_set(&cache->c_entry_count, 0); -+ cache->c_bucket_count = bucket_count; -+#ifdef MB_CACHE_INDEXES_COUNT -+ mb_assert(indexes_count == MB_CACHE_INDEXES_COUNT); -+#else -+ cache->c_indexes_count = indexes_count; -+#endif -+ cache->c_block_hash = kmalloc(bucket_count * sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_block_hash) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_block_hash[n]); -+ for (m=0; m<indexes_count; m++) { -+ cache->c_indexes_hash[m] = kmalloc(bucket_count * -+ sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_indexes_hash[m]) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_indexes_hash[m][n]); -+ } -+ cache->c_entry_cache = kmem_cache_create(name, entry_size, 0, -+ 0 /*SLAB_POISON | SLAB_RED_ZONE*/, NULL, NULL); -+ if (!cache->c_entry_cache) -+ goto fail; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&cache->c_cache_list, &mb_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ return cache; -+ -+fail: -+ if (cache) { -+ while (--m >= 0) -+ kfree(cache->c_indexes_hash[m]); -+ if (cache->c_block_hash) -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ } -+ MOD_DEC_USE_COUNT; -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_shrink() -+ * -+ * Removes all cache entires of a device from the cache. All cache entries -+ * currently in use cannot be freed, and thus remain in the cache. -+ * -+ * @cache: which cache to shrink -+ * @dev: which device's cache entries to shrink -+ */ -+void -+mb_cache_shrink(struct mb_cache *cache, kdev_t dev) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_dev == dev) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+} -+ -+ -+/* -+ * mb_cache_destroy() -+ * -+ * Shrinks the cache to its minimum possible size (hopefully 0 entries), -+ * and then destroys it. If this was the last mbcache, un-registers the -+ * mbcache from kernel memory management. -+ */ -+void -+mb_cache_destroy(struct mb_cache *cache) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_cache == cache) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ list_del(&cache->c_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+ -+ if (atomic_read(&cache->c_entry_count) > 0) { -+ mb_error("cache %s: %d orphaned entries", -+ cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ } -+ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)) -+ /* We don't have kmem_cache_destroy() in 2.2.x */ -+ kmem_cache_shrink(cache->c_entry_cache); -+#else -+ kmem_cache_destroy(cache->c_entry_cache); -+#endif -+ for (n=0; n < mb_cache_indexes(cache); n++) -+ kfree(cache->c_indexes_hash[n]); -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ -+ MOD_DEC_USE_COUNT; -+} -+ -+ -+/* -+ * mb_cache_entry_alloc() -+ * -+ * Allocates a new cache entry. The new entry will not be valid initially, -+ * and thus cannot be looked up yet. It should be filled with data, and -+ * then inserted into the cache using mb_cache_entry_insert(). Returns NULL -+ * if no more memory was available. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_alloc(struct mb_cache *cache) -+{ -+ struct mb_cache_entry *ce; -+ -+ atomic_inc(&cache->c_entry_count); -+ ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL); -+ if (ce) { -+ INIT_LIST_HEAD(&ce->e_lru_list); -+ INIT_LIST_HEAD(&ce->e_block_list); -+ ce->e_cache = cache; -+ atomic_set(&ce->e_used, 1); -+ } -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_insert() -+ * -+ * Inserts an entry that was allocated using mb_cache_entry_alloc() into -+ * the cache. After this, the cache entry can be looked up, but is not yet -+ * in the lru list as the caller still holds a handle to it. Returns 0 on -+ * success, or -EBUSY if a cache entry for that device + inode exists -+ * already (this may happen after a failed lookup, if another process has -+ * inserted the same cache entry in the meantime). -+ * -+ * @dev: device the cache entry belongs to -+ * @block: block number -+ * @keys: array of additional keys. There must be indexes_count entries -+ * in the array (as specified when creating the cache). -+ */ -+int -+mb_cache_entry_insert(struct mb_cache_entry *ce, kdev_t dev, -+ unsigned long block, unsigned int keys[]) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ int error = -EBUSY, n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) -+ goto out; -+ } -+ __mb_cache_entry_unhash(ce); -+ ce->e_dev = dev; -+ ce->e_block = block; -+ list_add(&ce->e_block_list, &cache->c_block_hash[bucket]); -+ for (n=0; n<mb_cache_indexes(cache); n++) { -+ ce->e_indexes[n].o_key = keys[n]; -+ bucket = keys[n] % cache->c_bucket_count; -+ list_add(&ce->e_indexes[n].o_list, -+ &cache->c_indexes_hash[n][bucket]); -+ } -+out: -+ spin_unlock(&mb_cache_spinlock); -+ return error; -+} -+ -+ -+/* -+ * mb_cache_entry_release() -+ * -+ * Release a handle to a cache entry. When the last handle to a cache entry -+ * is released it is either freed (if it is invalid) or otherwise inserted -+ * in to the lru list. -+ */ -+void -+mb_cache_entry_release(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_takeout() -+ * -+ * Take a cache entry out of the cache, making it invalid. The entry can later -+ * be re-inserted using mb_cache_entry_insert(), or released using -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_takeout(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_entry_free() -+ * -+ * This is equivalent to the sequence mb_cache_entry_takeout() -- -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_free(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_dup() -+ * -+ * Duplicate a handle to a cache entry (does not duplicate the cache entry -+ * itself). After the call, both the old and the new handle must be released. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_dup(struct mb_cache_entry *ce) -+{ -+ atomic_inc(&ce->e_used); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_get() -+ * -+ * Get a cache entry by device / block number. (There can only be one entry -+ * in the cache per device and block.) Returns NULL if no such cache entry -+ * exists. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_get(struct mb_cache *cache, kdev_t dev, unsigned long block) -+{ -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ ce = list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ goto cleanup; -+ } -+ } -+ ce = NULL; -+ -+cleanup: -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+ -+static struct mb_cache_entry * -+__mb_cache_entry_find(struct list_head *l, struct list_head *head, -+ int index, kdev_t dev, unsigned int key) -+{ -+ while (l != head) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, -+ e_indexes[index].o_list); -+ if (ce->e_dev == dev && ce->e_indexes[index].o_key == key) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ return ce; -+ } -+ l = l->next; -+ } -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_entry_find_first() -+ * -+ * Find the first cache entry on a given device with a certain key in -+ * an additional index. Additonal matches can be found with -+ * mb_cache_entry_find_next(). Returns NULL if no match was found. -+ * -+ * @cache: the cache to search -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_first(struct mb_cache *cache, int index, kdev_t dev, -+ unsigned int key) -+{ -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = cache->c_indexes_hash[index][bucket].next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_find_next() -+ * -+ * Find the next cache entry on a given device with a certain key in an -+ * additional index. Returns NULL if no match could be found. The previous -+ * entry is atomatically released, so that mb_cache_entry_find_next() can -+ * be called like this: -+ * -+ * entry = mb_cache_entry_find_first(); -+ * while (entry) { -+ * ... -+ * entry = mb_cache_entry_find_next(entry, ...); -+ * } -+ * -+ * @prev: The previous match -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_next(struct mb_cache_entry *prev, int index, kdev_t dev, -+ unsigned int key) -+{ -+ struct mb_cache *cache = prev->e_cache; -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = prev->e_indexes[index].o_list.next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ __mb_cache_entry_release_unlock(prev); -+ return ce; -+} -+ -+#endif /* !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) */ -+ -+static int __init init_mbcache(void) -+{ -+ register_cache(&mb_cache_definition); -+ return 0; -+} -+ -+static void __exit exit_mbcache(void) -+{ -+ unregister_cache(&mb_cache_definition); -+} -+ -+module_init(init_mbcache) -+module_exit(exit_mbcache) -+ ---- kernel-2.4.20-6chaos_18_7/include/asm-arm/unistd.h~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:14:42.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/asm-arm/unistd.h 2003-07-12 15:34:44.000000000 -0600 -@@ -244,7 +244,6 @@ - #define __NR_security (__NR_SYSCALL_BASE+223) - #define __NR_gettid (__NR_SYSCALL_BASE+224) - #define __NR_readahead (__NR_SYSCALL_BASE+225) --#if 0 /* allocated in 2.5 */ - #define __NR_setxattr (__NR_SYSCALL_BASE+226) - #define __NR_lsetxattr (__NR_SYSCALL_BASE+227) - #define __NR_fsetxattr (__NR_SYSCALL_BASE+228) -@@ -257,7 +256,6 @@ - #define __NR_removexattr (__NR_SYSCALL_BASE+235) - #define __NR_lremovexattr (__NR_SYSCALL_BASE+236) - #define __NR_fremovexattr (__NR_SYSCALL_BASE+237) --#endif - #define __NR_tkill (__NR_SYSCALL_BASE+238) - /* - * Please check 2.5 _before_ adding calls here, ---- kernel-2.4.20-6chaos_18_7/include/asm-ppc64/unistd.h~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:13:42.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/asm-ppc64/unistd.h 2003-07-12 15:34:44.000000000 -0600 -@@ -218,6 +218,7 @@ - #define __NR_gettid 207 - #if 0 /* Reserved syscalls */ - #define __NR_tkill 208 -+#endif - #define __NR_setxattr 209 - #define __NR_lsetxattr 210 - #define __NR_fsetxattr 211 -@@ -230,6 +231,7 @@ - #define __NR_removexattr 218 - #define __NR_lremovexattr 219 - #define __NR_fremovexattr 220 -+#if 0 /* Reserved syscalls */ - #define __NR_futex 221 - #endif - ---- kernel-2.4.20-6chaos_18_7/include/asm-s390/unistd.h~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:13:44.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/asm-s390/unistd.h 2003-07-12 15:34:44.000000000 -0600 -@@ -212,9 +212,18 @@ - #define __NR_madvise 219 - #define __NR_getdents64 220 - #define __NR_fcntl64 221 --/* -- * Numbers 224-235 are reserved for posix acl -- */ -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - #define __NR_gettid 236 - #define __NR_tkill 237 - ---- kernel-2.4.20-6chaos_18_7/include/asm-s390x/unistd.h~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:13:45.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/asm-s390x/unistd.h 2003-07-12 15:34:44.000000000 -0600 -@@ -180,9 +180,18 @@ - #define __NR_pivot_root 217 - #define __NR_mincore 218 - #define __NR_madvise 219 --/* -- * Numbers 224-235 are reserved for posix acl -- */ -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - #define __NR_gettid 236 - #define __NR_tkill 237 - ---- kernel-2.4.20-6chaos_18_7/include/asm-sparc/unistd.h~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:13:46.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/asm-sparc/unistd.h 2003-07-12 15:34:44.000000000 -0600 -@@ -184,24 +184,24 @@ - /* #define __NR_exportfs 166 SunOS Specific */ - #define __NR_mount 167 /* Common */ - #define __NR_ustat 168 /* Common */ --/* #define __NR_semsys 169 SunOS Specific */ --/* #define __NR_msgsys 170 SunOS Specific */ --/* #define __NR_shmsys 171 SunOS Specific */ --/* #define __NR_auditsys 172 SunOS Specific */ --/* #define __NR_rfssys 173 SunOS Specific */ -+#define __NR_setxattr 169 /* SunOS: semsys */ -+#define __NR_lsetxattr 170 /* SunOS: msgsys */ -+#define __NR_fsetxattr 171 /* SunOS: shmsys */ -+#define __NR_getxattr 172 /* SunOS: auditsys */ -+#define __NR_lgetxattr 173 /* SunOS: rfssys */ - #define __NR_getdents 174 /* Common */ - #define __NR_setsid 175 /* Common */ - #define __NR_fchdir 176 /* Common */ --/* #define __NR_fchroot 177 SunOS Specific */ --/* #define __NR_vpixsys 178 SunOS Specific */ --/* #define __NR_aioread 179 SunOS Specific */ --/* #define __NR_aiowrite 180 SunOS Specific */ --/* #define __NR_aiowait 181 SunOS Specific */ --/* #define __NR_aiocancel 182 SunOS Specific */ -+#define __NR_fgetxattr 177 /* SunOS: fchroot */ -+#define __NR_listxattr 178 /* SunOS: vpixsys */ -+#define __NR_llistxattr 179 /* SunOS: aioread */ -+#define __NR_flistxattr 180 /* SunOS: aiowrite */ -+#define __NR_removexattr 181 /* SunOS: aiowait */ -+#define __NR_lremovexattr 182 /* SunOS: aiocancel */ - #define __NR_sigpending 183 /* Common */ - #define __NR_query_module 184 /* Linux Specific */ - #define __NR_setpgid 185 /* Common */ --/* #define __NR_pathconf 186 SunOS Specific */ -+#define __NR_fremovexattr 186 /* SunOS: pathconf */ - #define __NR_tkill 187 /* SunOS: fpathconf */ - /* #define __NR_sysconf 188 SunOS Specific */ - #define __NR_uname 189 /* Linux Specific */ ---- kernel-2.4.20-6chaos_18_7/include/asm-sparc64/unistd.h~linux-2.4.20-xattr-0.8.54-chaos 2002-09-25 11:13:48.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/asm-sparc64/unistd.h 2003-07-12 15:34:44.000000000 -0600 -@@ -184,24 +184,24 @@ - /* #define __NR_exportfs 166 SunOS Specific */ - #define __NR_mount 167 /* Common */ - #define __NR_ustat 168 /* Common */ --/* #define __NR_semsys 169 SunOS Specific */ --/* #define __NR_msgsys 170 SunOS Specific */ --/* #define __NR_shmsys 171 SunOS Specific */ --/* #define __NR_auditsys 172 SunOS Specific */ --/* #define __NR_rfssys 173 SunOS Specific */ -+#define __NR_setxattr 169 /* SunOS: semsys */ -+#define __NR_lsetxattr 170 /* SunOS: msgsys */ -+#define __NR_fsetxattr 171 /* SunOS: shmsys */ -+#define __NR_getxattr 172 /* SunOS: auditsys */ -+#define __NR_lgetxattr 173 /* SunOS: rfssys */ - #define __NR_getdents 174 /* Common */ - #define __NR_setsid 175 /* Common */ - #define __NR_fchdir 176 /* Common */ --/* #define __NR_fchroot 177 SunOS Specific */ --/* #define __NR_vpixsys 178 SunOS Specific */ --/* #define __NR_aioread 179 SunOS Specific */ --/* #define __NR_aiowrite 180 SunOS Specific */ --/* #define __NR_aiowait 181 SunOS Specific */ --/* #define __NR_aiocancel 182 SunOS Specific */ -+#define __NR_fgetxattr 177 /* SunOS: fchroot */ -+#define __NR_listxattr 178 /* SunOS: vpixsys */ -+#define __NR_llistxattr 179 /* SunOS: aioread */ -+#define __NR_flistxattr 180 /* SunOS: aiowrite */ -+#define __NR_removexattr 181 /* SunOS: aiowait */ -+#define __NR_lremovexattr 182 /* SunOS: aiocancel */ - #define __NR_sigpending 183 /* Common */ - #define __NR_query_module 184 /* Linux Specific */ - #define __NR_setpgid 185 /* Common */ --/* #define __NR_pathconf 186 SunOS Specific */ -+#define __NR_fremovexattr 186 /* SunOS: pathconf */ - #define __NR_tkill 187 /* SunOS: fpathconf */ - /* #define __NR_sysconf 188 SunOS Specific */ - #define __NR_uname 189 /* Linux Specific */ ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/cache_def.h 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,15 @@ -+/* -+ * linux/cache_def.h -+ * Handling of caches defined in drivers, filesystems, ... -+ * -+ * Copyright (C) 2002 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+struct cache_definition { -+ const char *name; -+ void (*shrink)(int, unsigned int); -+ struct list_head link; -+}; -+ -+extern void register_cache(struct cache_definition *); -+extern void unregister_cache(struct cache_definition *); ---- kernel-2.4.20-6chaos_18_7/include/linux/errno.h~linux-2.4.20-xattr-0.8.54-chaos 2003-05-15 21:15:06.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/errno.h 2003-07-12 15:34:44.000000000 -0600 -@@ -26,4 +26,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ -+ - #endif ---- kernel-2.4.20-6chaos_18_7/include/linux/ext2_fs.h~linux-2.4.20-xattr-0.8.54-chaos 2003-06-24 11:31:16.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext2_fs.h 2003-07-12 15:34:44.000000000 -0600 -@@ -57,8 +57,6 @@ - */ - #define EXT2_BAD_INO 1 /* Bad blocks inode */ - #define EXT2_ROOT_INO 2 /* Root inode */ --#define EXT2_ACL_IDX_INO 3 /* ACL inode */ --#define EXT2_ACL_DATA_INO 4 /* ACL inode */ - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -@@ -86,7 +84,6 @@ - #else - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -121,28 +118,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext2_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext2_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext2_group_desc -@@ -314,6 +289,7 @@ struct ext2_inode { - #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ - #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ -+#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt -@@ -397,6 +373,7 @@ struct ext2_super_block { - - #ifdef __KERNEL__ - #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -+#define EXT2_I(inode) (&((inode)->u.ext2_i)) - #else - /* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test -@@ -466,7 +443,7 @@ struct ext2_super_block { - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff - --#define EXT2_FEATURE_COMPAT_SUPP 0 -+#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -624,8 +601,10 @@ extern struct address_space_operations e - - /* namei.c */ - extern struct inode_operations ext2_dir_inode_operations; -+extern struct inode_operations ext2_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext2_symlink_inode_operations; - extern struct inode_operations ext2_fast_symlink_inode_operations; - - #endif /* __KERNEL__ */ ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext2_xattr.h 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext2_xattr.h -+ -+ On-disk format of extended attributes for the ext2 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT2_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT2_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT2_XATTR_INDEX_MAX 10 -+#define EXT2_XATTR_INDEX_USER 1 -+#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext2_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext2_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT2_XATTR_PAD_BITS 2 -+#define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS) -+#define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1) -+#define EXT2_XATTR_LEN(name_len) \ -+ (((name_len) + EXT2_XATTR_ROUND + \ -+ sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND) -+#define EXT2_XATTR_NEXT(entry) \ -+ ( (struct ext2_xattr_entry *)( \ -+ (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT2_XATTR_SIZE(size) \ -+ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT2_FS_XATTR -+ -+struct ext2_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext2_xattr_register(int, struct ext2_xattr_handler *); -+extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); -+ -+extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); -+extern int ext2_removexattr(struct dentry *, const char *); -+ -+extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext2_xattr_list(struct inode *, char *, size_t); -+extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext2_xattr_delete_inode(struct inode *); -+extern void ext2_xattr_put_super(struct super_block *); -+ -+extern int init_ext2_xattr(void) __init; -+extern void exit_ext2_xattr(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR */ -+# define ext2_setxattr NULL -+# define ext2_getxattr NULL -+# define ext2_listxattr NULL -+# define ext2_removexattr NULL -+ -+static inline int -+ext2_xattr_get(struct inode *inode, int name_index, -+ const char *name, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+} -+ -+static inline void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR */ -+ -+# ifdef CONFIG_EXT2_FS_XATTR_USER -+ -+extern int init_ext2_xattr_user(void) __init; -+extern void exit_ext2_xattr_user(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+static inline int -+init_ext2_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr_user(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ ---- kernel-2.4.20-6chaos_18_7/include/linux/ext3_fs.h~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:33:41.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext3_fs.h 2003-07-12 15:34:44.000000000 -0600 -@@ -63,8 +63,6 @@ - */ - #define EXT3_BAD_INO 1 /* Bad blocks inode */ - #define EXT3_ROOT_INO 2 /* Root inode */ --#define EXT3_ACL_IDX_INO 3 /* ACL inode */ --#define EXT3_ACL_DATA_INO 4 /* ACL inode */ - #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ - #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ -@@ -94,7 +92,6 @@ - #else - # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry)) - #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -129,28 +126,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext3_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext3_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext3_group_desc -@@ -344,6 +319,7 @@ struct ext3_inode { - #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */ - #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 */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -521,7 +497,7 @@ struct ext3_super_block { - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - --#define EXT3_FEATURE_COMPAT_SUPP 0 -+#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) - #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ -@@ -704,6 +680,7 @@ extern void ext3_check_inodes_bitmap (st - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - - /* inode.c */ -+extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); - -@@ -773,8 +750,10 @@ extern struct address_space_operations e - - /* namei.c */ - extern struct inode_operations ext3_dir_inode_operations; -+extern struct inode_operations ext3_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - - ---- kernel-2.4.20-6chaos_18_7/include/linux/ext3_jbd.h~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:33:38.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext3_jbd.h 2003-07-12 15:34:44.000000000 -0600 -@@ -30,13 +30,19 @@ - - #define EXT3_SINGLEDATA_TRANS_BLOCKS 8U - -+/* Extended attributes may touch two data buffers, two bitmap buffers, -+ * and two group and summaries. */ -+ -+#define EXT3_XATTR_TRANS_BLOCKS 8 -+ - /* 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 - * quota files too (one for the group, one for the user quota). The - * superblock only gets updated once, of course, so don't bother - * counting that again for the quota updates. */ - --#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS - 2) -+#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \ -+ EXT3_XATTR_TRANS_BLOCKS - 2) - - extern int ext3_writepage_trans_blocks(struct inode *inode); - ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/ext3_xattr.h 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext3_xattr.h -+ -+ On-disk format of extended attributes for the ext3 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT3_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT3_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT3_XATTR_INDEX_MAX 10 -+#define EXT3_XATTR_INDEX_USER 1 -+#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext3_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext3_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT3_XATTR_PAD_BITS 2 -+#define EXT3_XATTR_PAD (1<<EXT3_XATTR_PAD_BITS) -+#define EXT3_XATTR_ROUND (EXT3_XATTR_PAD-1) -+#define EXT3_XATTR_LEN(name_len) \ -+ (((name_len) + EXT3_XATTR_ROUND + \ -+ sizeof(struct ext3_xattr_entry)) & ~EXT3_XATTR_ROUND) -+#define EXT3_XATTR_NEXT(entry) \ -+ ( (struct ext3_xattr_entry *)( \ -+ (char *)(entry) + EXT3_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT3_XATTR_SIZE(size) \ -+ (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT3_FS_XATTR -+ -+struct ext3_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext3_xattr_register(int, struct ext3_xattr_handler *); -+extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *); -+ -+extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); -+extern int ext3_removexattr(struct dentry *, const char *); -+ -+extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext3_xattr_list(struct inode *, char *, size_t); -+extern int ext3_xattr_set(handle_t *handle, struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext3_xattr_delete_inode(handle_t *, struct inode *); -+extern void ext3_xattr_put_super(struct super_block *); -+ -+extern int init_ext3_xattr(void) __init; -+extern void exit_ext3_xattr(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR */ -+# define ext3_setxattr NULL -+# define ext3_getxattr NULL -+# define ext3_listxattr NULL -+# define ext3_removexattr NULL -+ -+static inline int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_list(struct inode *inode, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+} -+ -+static inline void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT3_FS_XATTR */ -+ -+# ifdef CONFIG_EXT3_FS_XATTR_USER -+ -+extern int init_ext3_xattr_user(void) __init; -+extern void exit_ext3_xattr_user(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+static inline int -+init_ext3_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr_user(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ ---- kernel-2.4.20-6chaos_18_7/include/linux/fs.h~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:31:35.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/fs.h 2003-07-12 15:34:44.000000000 -0600 -@@ -914,7 +914,7 @@ struct inode_operations { - int (*setattr) (struct dentry *, struct iattr *); - int (*setattr_raw) (struct inode *, struct iattr *); - int (*getattr) (struct dentry *, struct iattr *); -- int (*setxattr) (struct dentry *, const char *, void *, size_t, int); -+ int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); - ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); - ssize_t (*listxattr) (struct dentry *, char *, size_t); - int (*removexattr) (struct dentry *, const char *); ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/include/linux/mbcache.h 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,69 @@ -+/* -+ File: linux/mbcache.h -+ -+ (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+/* Hardwire the number of additional indexes */ -+#define MB_CACHE_INDEXES_COUNT 1 -+ -+struct mb_cache_entry; -+ -+struct mb_cache_op { -+ int (*free)(struct mb_cache_entry *, int); -+}; -+ -+struct mb_cache { -+ struct list_head c_cache_list; -+ const char *c_name; -+ struct mb_cache_op c_op; -+ atomic_t c_entry_count; -+ int c_bucket_count; -+#ifndef MB_CACHE_INDEXES_COUNT -+ int c_indexes_count; -+#endif -+ kmem_cache_t *c_entry_cache; -+ struct list_head *c_block_hash; -+ struct list_head *c_indexes_hash[0]; -+}; -+ -+struct mb_cache_entry_index { -+ struct list_head o_list; -+ unsigned int o_key; -+}; -+ -+struct mb_cache_entry { -+ struct list_head e_lru_list; -+ struct mb_cache *e_cache; -+ atomic_t e_used; -+ kdev_t e_dev; -+ unsigned long e_block; -+ struct list_head e_block_list; -+ struct mb_cache_entry_index e_indexes[0]; -+}; -+ -+/* Functions on caches */ -+ -+struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, -+ int, int); -+void mb_cache_shrink(struct mb_cache *, kdev_t); -+void mb_cache_destroy(struct mb_cache *); -+ -+/* Functions on cache entries */ -+ -+struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *); -+int mb_cache_entry_insert(struct mb_cache_entry *, kdev_t, unsigned long, -+ unsigned int[]); -+void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]); -+void mb_cache_entry_release(struct mb_cache_entry *); -+void mb_cache_entry_takeout(struct mb_cache_entry *); -+void mb_cache_entry_free(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, kdev_t, -+ unsigned long); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, -+ kdev_t, unsigned int); -+struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, -+ kdev_t, unsigned int); -+#endif ---- kernel-2.4.20-6chaos_18_7/kernel/ksyms.c~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:14:02.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/kernel/ksyms.c 2003-07-12 15:35:19.000000000 -0600 -@@ -12,6 +12,7 @@ - #define __KERNEL_SYSCALLS__ - #include <linux/config.h> - #include <linux/slab.h> -+#include <linux/cache_def.h> - #include <linux/smp.h> - #include <linux/module.h> - #include <linux/blkdev.h> -@@ -106,6 +107,7 @@ EXPORT_SYMBOL(do_brk); - EXPORT_SYMBOL(exit_mm); - EXPORT_SYMBOL(exit_files); - EXPORT_SYMBOL(exit_fs); -+EXPORT_SYMBOL(copy_fs_struct); - EXPORT_SYMBOL(exit_sighand); - EXPORT_SYMBOL_GPL(make_pages_present); - -@@ -126,6 +128,8 @@ EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); - EXPORT_SYMBOL(kmem_cache_validate); - EXPORT_SYMBOL(kmem_cache_size); -+EXPORT_SYMBOL(register_cache); -+EXPORT_SYMBOL(unregister_cache); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); ---- kernel-2.4.20-6chaos_18_7/mm/vmscan.c~linux-2.4.20-xattr-0.8.54-chaos 2003-07-12 15:33:34.000000000 -0600 -+++ kernel-2.4.20-6chaos_18_7-braam/mm/vmscan.c 2003-07-12 15:34:44.000000000 -0600 -@@ -21,6 +21,7 @@ - #include <linux/kernel_stat.h> - #include <linux/swap.h> - #include <linux/swapctl.h> -+#include <linux/cache_def.h> - #include <linux/smp_lock.h> - #include <linux/pagemap.h> - #include <linux/init.h> -@@ -444,6 +445,39 @@ static inline void kachunk_cache(struct - - #define BATCH_WORK_AMOUNT 64 - -+static DECLARE_MUTEX(other_caches_sem); -+static LIST_HEAD(cache_definitions); -+ -+void register_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_add(&cache->link, &cache_definitions); -+ up(&other_caches_sem); -+} -+ -+void unregister_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_del(&cache->link); -+ up(&other_caches_sem); -+} -+ -+static void shrink_other_caches(unsigned int priority, int gfp_mask) -+{ -+ struct list_head *p; -+ -+ if (down_trylock(&other_caches_sem)) -+ return; -+ -+ list_for_each_prev(p, &cache_definitions) { -+ struct cache_definition *cache = -+ list_entry(p, struct cache_definition, link); -+ -+ cache->shrink(priority, gfp_mask); -+ } -+ up(&other_caches_sem); -+} -+ - /* - * returns the active cache ratio relative to the total active list - * times 10 (eg. 30% cache returns 3) -@@ -887,7 +921,7 @@ static int do_try_to_free_pages_kswapd(u - - ret += shrink_dcache_memory(DEF_PRIORITY, gfp_mask); - ret += shrink_icache_memory(DEF_PRIORITY, gfp_mask); -- // ret += shrink_other_caches(DEF_PRIORITY, gfp_mask); -+ shrink_other_caches(DEF_PRIORITY, gfp_mask); - #ifdef CONFIG_QUOTA - ret += shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); - #endif ---- /dev/null 2003-01-30 03:24:37.000000000 -0700 -+++ kernel-2.4.20-6chaos_18_7-braam/fs/ext3/ext3-exports.c 2003-07-12 15:34:44.000000000 -0600 -@@ -0,0 +1,13 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); - -_ diff --git a/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54-hp.patch b/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54-hp.patch deleted file mode 100644 index f1365d7b81..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54-hp.patch +++ /dev/null @@ -1,4875 +0,0 @@ - Documentation/Configure.help | 66 ++ - arch/ia64/defconfig | 7 - fs/Config.in | 14 - fs/Makefile | 3 - fs/ext2/Makefile | 4 - fs/ext2/file.c | 5 - fs/ext2/ialloc.c | 2 - fs/ext2/inode.c | 34 - - fs/ext2/namei.c | 14 - fs/ext2/super.c | 29 - fs/ext2/symlink.c | 14 - fs/ext2/xattr.c | 1212 +++++++++++++++++++++++++++++++++++++++++ - fs/ext2/xattr_user.c | 103 +++ - fs/ext3/Makefile | 9 - fs/ext3/ext3-exports.c | 13 - fs/ext3/file.c | 5 - fs/ext3/ialloc.c | 2 - fs/ext3/inode.c | 35 - - fs/ext3/namei.c | 21 - fs/ext3/super.c | 36 + - fs/ext3/symlink.c | 14 - fs/ext3/xattr.c | 1225 ++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/xattr_user.c | 111 +++ - fs/jfs/jfs_xattr.h | 6 - fs/jfs/xattr.c | 6 - fs/mbcache.c | 648 ++++++++++++++++++++++ - include/linux/cache_def.h | 15 - include/linux/errno.h | 4 - include/linux/ext2_fs.h | 31 - - include/linux/ext2_xattr.h | 157 +++++ - include/linux/ext3_fs.h | 31 - - include/linux/ext3_jbd.h | 8 - include/linux/ext3_xattr.h | 157 +++++ - include/linux/fs.h | 2 - include/linux/mbcache.h | 69 ++ - kernel/ksyms.c | 4 - mm/vmscan.c | 35 + - 62 files changed, 4343 insertions(+), 182 deletions(-) - ---- linux/Documentation/Configure.help~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:39:23 2003 -+++ linux-mmonroe/Documentation/Configure.help Fri May 16 08:43:00 2003 -@@ -15309,6 +15309,39 @@ CONFIG_EXT2_FS - be compiled as a module, and so this could be dangerous. Most - everyone wants to say Y here. - -+Ext2 extended attributes -+CONFIG_EXT2_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 extended attribute block sharing -+CONFIG_EXT2_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext2 extended user attributes -+CONFIG_EXT2_FS_XATTR_USER -+ This option enables extended user attributes on ext2. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 trusted extended attributes -+CONFIG_EXT2_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext2 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Ext3 journalling file system support (EXPERIMENTAL) - CONFIG_EXT3_FS - This is the journalling version of the Second extended file system -@@ -15341,6 +15374,39 @@ CONFIG_EXT3_FS - of your root partition (the one containing the directory /) cannot - be compiled as a module, and so this may be dangerous. - -+Ext3 extended attributes -+CONFIG_EXT3_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 extended attribute block sharing -+CONFIG_EXT3_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext3 extended user attributes -+CONFIG_EXT3_FS_XATTR_USER -+ This option enables extended user attributes on ext3. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 trusted extended attributes -+CONFIG_EXT3_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext3 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Journal Block Device support (JBD for ext3) (EXPERIMENTAL) - CONFIG_JBD - This is a generic journalling layer for block devices. It is ---- linux/arch/ia64/defconfig~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:39:14 2003 -+++ linux-mmonroe/arch/ia64/defconfig Fri May 16 08:43:00 2003 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options ---- linux/fs/Config.in~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:39:14 2003 -+++ linux-mmonroe/fs/Config.in Fri May 16 08:43:01 2003 -@@ -35,6 +35,11 @@ dep_mbool ' Debug Befs' CONFIG_BEFS_DEB - dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL - - tristate 'Ext3 journalling file system support' CONFIG_EXT3_FS -+dep_mbool ' Ext3 extended attributes' CONFIG_EXT3_FS_XATTR $CONFIG_EXT3_FS -+dep_bool ' Ext3 extended attribute block sharing' \ -+ CONFIG_EXT3_FS_XATTR_SHARING $CONFIG_EXT3_FS_XATTR -+dep_bool ' Ext3 extended user attributes' \ -+ CONFIG_EXT3_FS_XATTR_USER $CONFIG_EXT3_FS_XATTR - # CONFIG_JBD could be its own option (even modular), but until there are - # other users than ext3, we will simply make it be the same as CONFIG_EXT3_FS - # dep_tristate ' Journal Block Device support (JBD for ext3)' CONFIG_JBD $CONFIG_EXT3_FS -@@ -98,6 +103,11 @@ dep_mbool ' QNX4FS write support (DANGE - tristate 'ROM file system support' CONFIG_ROMFS_FS - - tristate 'Second extended fs support' CONFIG_EXT2_FS -+dep_mbool ' Ext2 extended attributes' CONFIG_EXT2_FS_XATTR $CONFIG_EXT2_FS -+dep_bool ' Ext2 extended attribute block sharing' \ -+ CONFIG_EXT2_FS_XATTR_SHARING $CONFIG_EXT2_FS_XATTR -+dep_bool ' Ext2 extended user attributes' \ -+ CONFIG_EXT2_FS_XATTR_USER $CONFIG_EXT2_FS_XATTR - - tristate 'System V/Xenix/V7/Coherent file system support' CONFIG_SYSV_FS - -@@ -176,6 +186,10 @@ else - define_tristate CONFIG_ZISOFS_FS n - fi - -+# Meta block cache for Extended Attributes (ext2/ext3) -+#tristate 'Meta block cache' CONFIG_FS_MBCACHE -+define_tristate CONFIG_FS_MBCACHE y -+ - mainmenu_option next_comment - comment 'Partition Types' - source fs/partitions/Config.in ---- linux/fs/Makefile~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:46 2003 -+++ linux-mmonroe/fs/Makefile Fri May 16 08:43:01 2003 -@@ -80,6 +80,9 @@ obj-y += binfmt_script.o - - obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o - -+export-objs += mbcache.o -+obj-$(CONFIG_FS_MBCACHE) += mbcache.o -+ - # persistent filesystems - obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) - ---- linux/fs/ext2/Makefile~linux-2.4.20-xattr-0.8.54-hp Thu Oct 11 08:05:18 2001 -+++ linux-mmonroe/fs/ext2/Makefile Fri May 16 08:43:01 2003 -@@ -13,4 +13,8 @@ obj-y := balloc.o bitmap.o dir.o file - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make ---- linux/fs/ext2/file.c~linux-2.4.20-xattr-0.8.54-hp Thu Oct 11 08:05:18 2001 -+++ linux-mmonroe/fs/ext2/file.c Fri May 16 08:43:01 2003 -@@ -20,6 +20,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/sched.h> - - /* -@@ -51,4 +52,8 @@ struct file_operations ext2_file_operati - - struct inode_operations ext2_file_inode_operations = { - truncate: ext2_truncate, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- linux/fs/ext2/ialloc.c~linux-2.4.20-xattr-0.8.54-hp Thu Nov 28 15:53:15 2002 -+++ linux-mmonroe/fs/ext2/ialloc.c Fri May 16 08:43:01 2003 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/locks.h> - #include <linux/quotaops.h> - -@@ -167,6 +168,7 @@ void ext2_free_inode (struct inode * ino - */ - if (!is_bad_inode(inode)) { - /* Quota is already initialized in iput() */ -+ ext2_xattr_delete_inode(inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - } ---- linux/fs/ext2/inode.c~linux-2.4.20-xattr-0.8.54-hp Thu Nov 28 15:53:15 2002 -+++ linux-mmonroe/fs/ext2/inode.c Fri May 16 08:43:01 2003 -@@ -39,6 +39,18 @@ MODULE_LICENSE("GPL"); - static int ext2_update_inode(struct inode * inode, int do_sync); - - /* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext2_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext2_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ -+/* - * Called at each iput() - */ - void ext2_put_inode (struct inode * inode) -@@ -53,9 +65,7 @@ void ext2_delete_inode (struct inode * i - { - lock_kernel(); - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - inode->u.ext2_i.i_dtime = CURRENT_TIME; - mark_inode_dirty(inode); -@@ -801,6 +811,8 @@ void ext2_truncate (struct inode * inode - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext2_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -888,8 +900,7 @@ void ext2_read_inode (struct inode * ino - unsigned long offset; - struct ext2_group_desc * gdp; - -- if ((inode->i_ino != EXT2_ROOT_INO && inode->i_ino != EXT2_ACL_IDX_INO && -- inode->i_ino != EXT2_ACL_DATA_INO && -+ if ((inode->i_ino != EXT2_ROOT_INO && - inode->i_ino < EXT2_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu(inode->i_sb->u.ext2_sb.s_es->s_inodes_count)) { - ext2_error (inode->i_sb, "ext2_read_inode", -@@ -974,10 +985,7 @@ void ext2_read_inode (struct inode * ino - for (block = 0; block < EXT2_N_BLOCKS; block++) - inode->u.ext2_i.i_data[block] = raw_inode->i_block[block]; - -- if (inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext2_file_inode_operations; - inode->i_fop = &ext2_file_operations; - inode->i_mapping->a_ops = &ext2_aops; -@@ -986,15 +994,17 @@ void ext2_read_inode (struct inode * ino - inode->i_fop = &ext2_dir_operations; - inode->i_mapping->a_ops = &ext2_aops; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext2_inode_is_fast_symlink(inode)) - inode->i_op = &ext2_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - } -- } else -+ } else { -+ inode->i_op = &ext2_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(raw_inode->i_block[0])); -+ } - brelse (bh); - inode->i_attr_flags = 0; - if (inode->u.ext2_i.i_flags & EXT2_SYNC_FL) { ---- linux/fs/ext2/namei.c~linux-2.4.20-xattr-0.8.54-hp Wed Oct 3 22:57:36 2001 -+++ linux-mmonroe/fs/ext2/namei.c Fri May 16 08:43:01 2003 -@@ -31,6 +31,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/pagemap.h> - - /* -@@ -136,7 +137,7 @@ static int ext2_symlink (struct inode * - - if (l > sizeof (inode->u.ext2_i.i_data)) { - /* slow symlink */ -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - err = block_symlink(inode, symname, l); - if (err) -@@ -345,4 +346,15 @@ struct inode_operations ext2_dir_inode_o - rmdir: ext2_rmdir, - mknod: ext2_mknod, - rename: ext2_rename, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ -+struct inode_operations ext2_special_inode_operations = { -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- linux/fs/ext2/super.c~linux-2.4.20-xattr-0.8.54-hp Thu Nov 28 15:53:15 2002 -+++ linux-mmonroe/fs/ext2/super.c Fri May 16 08:43:01 2003 -@@ -21,6 +21,7 @@ - #include <linux/string.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -125,6 +126,7 @@ void ext2_put_super (struct super_block - int db_count; - int i; - -+ ext2_xattr_put_super(sb); - if (!(sb->s_flags & MS_RDONLY)) { - struct ext2_super_block *es = EXT2_SB(sb)->s_es; - -@@ -175,6 +177,13 @@ static int parse_options (char * options - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -424,6 +433,9 @@ struct super_block * ext2_read_super (st - blocksize = BLOCK_SIZE; - - sb->u.ext2_sb.s_mount_opt = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ /* set_opt (sb->u.ext2_sb.s_mount_opt, XATTR_USER); */ -+#endif - if (!parse_options ((char *) data, &sb_block, &resuid, &resgid, - &sb->u.ext2_sb.s_mount_opt)) { - return NULL; -@@ -813,12 +825,27 @@ static DECLARE_FSTYPE_DEV(ext2_fs_type, - - static int __init init_ext2_fs(void) - { -- return register_filesystem(&ext2_fs_type); -+ int error = init_ext2_xattr(); -+ if (error) -+ return error; -+ error = init_ext2_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext2_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext2_xattr_user(); -+fail: -+ exit_ext2_xattr(); -+ return error; - } - - static void __exit exit_ext2_fs(void) - { - unregister_filesystem(&ext2_fs_type); -+ exit_ext2_xattr_user(); -+ exit_ext2_xattr(); - } - - EXPORT_NO_SYMBOLS; ---- linux/fs/ext2/symlink.c~linux-2.4.20-xattr-0.8.54-hp Wed Sep 27 13:41:33 2000 -+++ linux-mmonroe/fs/ext2/symlink.c Fri May 16 08:43:01 2003 -@@ -19,6 +19,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - - static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -32,7 +33,20 @@ static int ext2_follow_link(struct dentr - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext2_symlink_inode_operations = { -+ readlink: page_readlink, -+ follow_link: page_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ - struct inode_operations ext2_fast_symlink_inode_operations = { - readlink: ext2_readlink, - follow_link: ext2_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/fs/ext2/xattr.c Fri May 16 08:43:01 2003 -@@ -0,0 +1,1212 @@ -+/* -+ * linux/fs/ext2/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT2_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT2_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext2_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+/* These symbols may be needed by a module. */ -+EXPORT_SYMBOL(ext2_xattr_register); -+EXPORT_SYMBOL(ext2_xattr_unregister); -+EXPORT_SYMBOL(ext2_xattr_get); -+EXPORT_SYMBOL(ext2_xattr_list); -+EXPORT_SYMBOL(ext2_xattr_set); -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext2_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext2_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT2_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext2_xattr_set2(struct inode *, struct buffer_head *, -+ struct ext2_xattr_header *); -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+static int ext2_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext2_xattr_cache_find(struct inode *, -+ struct ext2_xattr_header *); -+static void ext2_xattr_cache_remove(struct buffer_head *); -+static void ext2_xattr_rehash(struct ext2_xattr_header *, -+ struct ext2_xattr_entry *); -+ -+static struct mb_cache *ext2_xattr_cache; -+ -+#else -+# define ext2_xattr_cache_insert(bh) 0 -+# define ext2_xattr_cache_find(inode, header) NULL -+# define ext2_xattr_cache_remove(bh) while(0) {} -+# define ext2_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext2_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext2_xattr_sem); -+ -+static inline int -+ext2_xattr_new_block(struct inode *inode, int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block) + -+ EXT2_I(inode)->i_block_group * EXT2_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext2_new_block(inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext2_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext2_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext2_xattr_free_block(struct inode * inode, unsigned long block) -+{ -+ ext2_free_blocks(inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext2_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext2_xattr_free_block(inode, block) \ -+ ext2_free_blocks(inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext2_xattr_handler *ext2_xattr_handlers[EXT2_XATTR_INDEX_MAX]; -+rwlock_t ext2_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext2_xattr_register(int name_index, struct ext2_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ if (!ext2_xattr_handlers[name_index-1]) { -+ ext2_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext2_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext2_xattr_unregister(int name_index, struct ext2_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ ext2_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext2_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static struct ext2_xattr_handler * -+ext2_xattr_resolve_name(const char **name) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext2_handler_lock); -+ for (i=0; i<EXT2_XATTR_INDEX_MAX; i++) { -+ if (ext2_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext2_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext2_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext2_handler_lock); -+ return handler; -+} -+ -+static inline struct ext2_xattr_handler * -+ext2_xattr_handler(int name_index) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ read_lock(&ext2_handler_lock); -+ handler = ext2_xattr_handlers[name_index-1]; -+ read_unlock(&ext2_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext2_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext2_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT2_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT2_I(inode)->i_file_acl) -+ return 0; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT2_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext2_xattr_update_super_block(struct super_block *sb) -+{ -+ if (EXT2_HAS_COMPAT_FEATURE(sb, EXT2_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT2_SB(sb)->s_feature_compat |= EXT2_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT2_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT2_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ mark_buffer_dirty(EXT2_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext2_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_header *header = NULL; -+ struct ext2_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT2_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext2_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(sb, "ext2_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext2_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT2_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT2_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT2_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext2_xattr_cache_remove(bh); -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT2_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT2_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT2_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT2_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext2_xattr_set2(inode, bh, NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT2_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT2_XATTR_PAD, 0, -+ EXT2_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext2_xattr_rehash(header, here); -+ -+ error = ext2_xattr_set2(inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext2_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext2_xattr_set(): Update the file system. -+ */ -+static int -+ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, -+ struct ext2_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext2_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext2_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext2_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT2_I(inode)->i_file_acl != 0; -+ int block = ext2_xattr_new_block(inode, &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+ ext2_xattr_free_block(inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext2_xattr_cache_insert(new_bh); -+ -+ ext2_xattr_update_super_block(sb); -+ } -+ mark_buffer_dirty(new_bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &new_bh); -+ wait_on_buffer(new_bh); -+ error = -EIO; -+ if (buffer_req(new_bh) && !buffer_uptodate(new_bh)) -+ goto cleanup; -+ } -+ } -+ -+ /* Update the inode. */ -+ EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ if (IS_SYNC(inode)) { -+ error = ext2_sync_inode (inode); -+ if (error) -+ goto cleanup; -+ } else -+ mark_inode_dirty(inode); -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext2_xattr_free_block(inode, old_bh->b_blocknr); -+ mark_buffer_clean(old_bh); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext2_xattr_quota_free(inode); -+ mark_buffer_dirty(old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT2_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext2_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext2_xattr_cache_remove(bh); -+ ext2_xattr_free_block(inode, block); -+ bforget(bh); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ mark_buffer_dirty(bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &bh); -+ wait_on_buffer(bh); -+ } -+ ext2_xattr_quota_free(inode); -+ } -+ EXT2_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext2_xattr_sem); -+} -+ -+/* -+ * ext2_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ mb_cache_shrink(ext2_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+/* -+ * ext2_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext2_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext2_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext2_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext2_xattr_cmp(struct ext2_xattr_header *header1, -+ struct ext2_xattr_header *header2) -+{ -+ struct ext2_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT2_XATTR_NEXT(entry1); -+ entry2 = EXT2_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext2_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext2_xattr_cache_find(struct inode *inode, struct ext2_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext2_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT2_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT2_XATTR_REFCOUNT_MAX); -+ } else if (!ext2_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext2_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext2_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext2_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext2_xattr_hash_entry(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT2_XATTR_ROUND) >> EXT2_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext2_xattr_rehash(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ struct ext2_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext2_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT2_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext2_xattr(void) -+{ -+ ext2_xattr_cache = mb_cache_create("ext2_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext2_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+ mb_cache_destroy(ext2_xattr_cache); -+} -+ -+#else /* CONFIG_EXT2_FS_XATTR_SHARING */ -+ -+int __init -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT2_FS_XATTR_SHARING */ ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/fs/ext2/xattr_user.c Fri May 16 08:43:01 2003 -@@ -0,0 +1,103 @@ -+/* -+ * linux/fs/ext2/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+ -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+# include <linux/ext2_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext2_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext2_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_get(inode, EXT2_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext2_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_set(inode, EXT2_XATTR_INDEX_USER, name, -+ value, size, flags); -+} -+ -+struct ext2_xattr_handler ext2_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext2_xattr_user_list, -+ get: ext2_xattr_user_get, -+ set: ext2_xattr_user_set, -+}; -+ -+int __init -+init_ext2_xattr_user(void) -+{ -+ return ext2_xattr_register(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -+ -+void -+exit_ext2_xattr_user(void) -+{ -+ ext2_xattr_unregister(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} ---- linux/fs/ext3/Makefile~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:46 2003 -+++ linux-mmonroe/fs/ext3/Makefile Fri May 16 08:43:01 2003 -@@ -1,5 +1,5 @@ - # --# Makefile for the linux ext2-filesystem routines. -+# Makefile for the linux ext3-filesystem routines. - # - # Note! Dependencies are done automagically by 'make dep', which also - # removes any old dependencies. DON'T put your own dependencies here -@@ -9,10 +9,13 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - -+obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make ---- linux/fs/ext3/file.c~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:46 2003 -+++ linux-mmonroe/fs/ext3/file.c Fri May 16 08:43:01 2003 -@@ -23,6 +23,7 @@ - #include <linux/locks.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - #include <linux/ext3_jbd.h> - #include <linux/smp_lock.h> - -@@ -126,5 +127,9 @@ struct file_operations ext3_file_operati - struct inode_operations ext3_file_inode_operations = { - truncate: ext3_truncate, /* BKL held */ - setattr: ext3_setattr, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; - ---- linux/fs/ext3/ialloc.c~linux-2.4.20-xattr-0.8.54-hp Thu Nov 28 15:53:15 2002 -+++ linux-mmonroe/fs/ext3/ialloc.c Fri May 16 08:43:01 2003 -@@ -17,6 +17,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/stat.h> - #include <linux/string.h> - #include <linux/locks.h> -@@ -216,6 +217,7 @@ void ext3_free_inode (handle_t *handle, - * as writing the quota to disk may need the lock as well. - */ - DQUOT_INIT(inode); -+ ext3_xattr_delete_inode(handle, inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - ---- linux/fs/ext3/inode.c~linux-2.4.20-xattr-0.8.54-hp Thu Nov 28 15:53:15 2002 -+++ linux-mmonroe/fs/ext3/inode.c Fri May 16 08:43:01 2003 -@@ -39,6 +39,18 @@ - */ - #undef SEARCH_FROM_ZERO - -+/* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext3_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext3_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ - /* The ext3 forget function must perform a revoke if we are freeing data - * which has been journaled. Metadata (eg. indirect blocks) must be - * revoked in all cases. -@@ -48,7 +60,7 @@ - * still needs to be revoked. - */ - --static int ext3_forget(handle_t *handle, int is_metadata, -+int ext3_forget(handle_t *handle, int is_metadata, - struct inode *inode, struct buffer_head *bh, - int blocknr) - { -@@ -164,9 +176,7 @@ void ext3_delete_inode (struct inode * i - { - handle_t *handle; - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - - lock_kernel(); -@@ -1855,6 +1865,8 @@ void ext3_truncate(struct inode * inode) - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext3_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -2002,8 +2014,6 @@ int ext3_get_inode_loc (struct inode *in - struct ext3_group_desc * gdp; - - if ((inode->i_ino != EXT3_ROOT_INO && -- inode->i_ino != EXT3_ACL_IDX_INO && -- inode->i_ino != EXT3_ACL_DATA_INO && - inode->i_ino != EXT3_JOURNAL_INO && - inode->i_ino < EXT3_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu( -@@ -2130,10 +2140,7 @@ void ext3_read_inode(struct inode * inod - - brelse (iloc.bh); - -- if (inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; - inode->i_mapping->a_ops = &ext3_aops; -@@ -2141,15 +2148,17 @@ void ext3_read_inode(struct inode * inod - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - } -- } else -+ } else { -+ inode->i_op = &ext3_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(iloc.raw_inode->i_block[0])); -+ } - /* inode->i_attr_flags = 0; unused */ - if (inode->u.ext3_i.i_flags & EXT3_SYNC_FL) { - /* inode->i_attr_flags |= ATTR_FLAG_SYNCRONOUS; unused */ ---- linux/fs/ext3/namei.c~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:47 2003 -+++ linux-mmonroe/fs/ext3/namei.c Fri May 16 08:43:01 2003 -@@ -29,6 +29,7 @@ - #include <linux/sched.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/fcntl.h> - #include <linux/stat.h> - #include <linux/string.h> -@@ -1611,7 +1612,7 @@ static int ext3_mkdir(struct inode * dir - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR); -+ inode = ext3_new_inode (handle, dir, S_IFDIR | mode); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -1619,7 +1620,6 @@ static int ext3_mkdir(struct inode * dir - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; -- inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ -@@ -1646,9 +1646,6 @@ static int ext3_mkdir(struct inode * dir - BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata"); - ext3_journal_dirty_metadata(handle, dir_block); - brelse (dir_block); -- inode->i_mode = S_IFDIR | mode; -- if (dir->i_mode & S_ISGID) -- inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); - if (err) { -@@ -2017,7 +2014,7 @@ static int ext3_symlink (struct inode * - goto out_stop; - - if (l > sizeof (EXT3_I(inode)->i_data)) { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* - * block_symlink() calls back into ext3_prepare/commit_write. -@@ -2244,4 +2241,16 @@ struct inode_operations ext3_dir_inode_o - rmdir: ext3_rmdir, /* BKL held */ - mknod: ext3_mknod, /* BKL held */ - rename: ext3_rename, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; -+ -+struct inode_operations ext3_special_inode_operations = { -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ ---- linux/fs/ext3/super.c~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:46 2003 -+++ linux-mmonroe/fs/ext3/super.c Fri May 16 08:43:01 2003 -@@ -24,6 +24,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -406,6 +407,7 @@ void ext3_put_super (struct super_block - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { - EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -@@ -502,6 +504,7 @@ static int parse_options (char * options - int is_remount) - { - unsigned long *mount_options = &sbi->s_mount_opt; -+ - uid_t *resuid = &sbi->s_resuid; - gid_t *resgid = &sbi->s_resgid; - char * this_char; -@@ -514,6 +517,13 @@ static int parse_options (char * options - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -931,6 +941,12 @@ struct super_block * ext3_read_super (st - sbi->s_mount_opt = 0; - sbi->s_resuid = EXT3_DEF_RESUID; - sbi->s_resgid = EXT3_DEF_RESGID; -+ -+ /* Default extended attribute flags */ -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ /* set_opt(sbi->s_mount_opt, XATTR_USER); */ -+#endif -+ - if (!parse_options ((char *) data, &sb_block, sbi, &journal_inum, 0)) { - sb->s_dev = 0; - goto out_fail; -@@ -1768,17 +1784,29 @@ static DECLARE_FSTYPE_DEV(ext3_fs_type, - - static int __init init_ext3_fs(void) - { -- return register_filesystem(&ext3_fs_type); -+ int error = init_ext3_xattr(); -+ if (error) -+ return error; -+ error = init_ext3_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext3_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext3_xattr_user(); -+fail: -+ exit_ext3_xattr(); -+ return error; - } - - static void __exit exit_ext3_fs(void) - { - unregister_filesystem(&ext3_fs_type); -+ exit_ext3_xattr_user(); -+ exit_ext3_xattr(); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); -- - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - MODULE_LICENSE("GPL"); ---- linux/fs/ext3/symlink.c~linux-2.4.20-xattr-0.8.54-hp Fri Nov 9 14:25:04 2001 -+++ linux-mmonroe/fs/ext3/symlink.c Fri May 16 08:43:01 2003 -@@ -20,6 +20,7 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - - static int ext3_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -33,7 +34,20 @@ static int ext3_follow_link(struct dentr - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext3_symlink_inode_operations = { -+ readlink: page_readlink, /* BKL not held. Don't need */ -+ follow_link: page_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ - struct inode_operations ext3_fast_symlink_inode_operations = { - readlink: ext3_readlink, /* BKL not held. Don't need */ - follow_link: ext3_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/fs/ext3/xattr.c Fri May 16 08:43:01 2003 -@@ -0,0 +1,1225 @@ -+/* -+ * linux/fs/ext3/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Ext3 code with a lot of help from Eric Jarman <ejarman@acm.org>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT3_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT3_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext3_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+#define EXT3_EA_USER "user." -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext3_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext3_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT3_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, -+ struct ext3_xattr_header *); -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+static int ext3_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext3_xattr_cache_find(struct inode *, -+ struct ext3_xattr_header *); -+static void ext3_xattr_cache_remove(struct buffer_head *); -+static void ext3_xattr_rehash(struct ext3_xattr_header *, -+ struct ext3_xattr_entry *); -+ -+static struct mb_cache *ext3_xattr_cache; -+ -+#else -+# define ext3_xattr_cache_insert(bh) 0 -+# define ext3_xattr_cache_find(inode, header) NULL -+# define ext3_xattr_cache_remove(bh) while(0) {} -+# define ext3_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext3_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext3_xattr_sem); -+ -+static inline int -+ext3_xattr_new_block(handle_t *handle, struct inode *inode, -+ int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + -+ EXT3_I(inode)->i_block_group * EXT3_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext3_new_block(handle, inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext3_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext3_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext3_xattr_free_block(handle_t *handle, struct inode * inode, -+ unsigned long block) -+{ -+ ext3_free_blocks(handle, inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext3_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext3_xattr_free_block(handle, inode, block) \ -+ ext3_free_blocks(handle, inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext3_xattr_handler *ext3_xattr_handlers[EXT3_XATTR_INDEX_MAX]; -+rwlock_t ext3_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext3_xattr_register(int name_index, struct ext3_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ if (!ext3_xattr_handlers[name_index-1]) { -+ ext3_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext3_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext3_xattr_unregister(int name_index, struct ext3_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ ext3_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext3_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static inline struct ext3_xattr_handler * -+ext3_xattr_resolve_name(const char **name) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext3_handler_lock); -+ for (i=0; i<EXT3_XATTR_INDEX_MAX; i++) { -+ if (ext3_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext3_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext3_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext3_handler_lock); -+ return handler; -+} -+ -+static inline struct ext3_xattr_handler * -+ext3_xattr_handler(int name_index) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ read_lock(&ext3_handler_lock); -+ handler = ext3_xattr_handlers[name_index-1]; -+ read_unlock(&ext3_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext3_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext3_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT3_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT3_I(inode)->i_file_acl) -+ return 0; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext3_xattr_update_super_block(handle_t *handle, -+ struct super_block *sb) -+{ -+ if (EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT3_SB(sb)->s_feature_compat |= EXT3_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT3_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT3_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext3_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_header *header = NULL; -+ struct ext3_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT3_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext3_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(sb, "ext3_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT3_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT3_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT3_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext3_xattr_cache_remove(bh); -+ error = ext3_journal_get_write_access(handle, bh); -+ if (error) -+ goto cleanup; -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT3_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT3_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT3_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT3_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext3_xattr_set2(handle, inode, bh,NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT3_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT3_XATTR_PAD, 0, -+ EXT3_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext3_xattr_rehash(header, here); -+ -+ error = ext3_xattr_set2(handle, inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext3_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext3_xattr_set(): Update the file system. -+ */ -+static int -+ext3_xattr_set2(handle_t *handle, struct inode *inode, -+ struct buffer_head *old_bh, struct ext3_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext3_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext3_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ error = ext3_journal_get_write_access(handle, new_bh); -+ if (error) -+ goto cleanup; -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext3_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT3_I(inode)->i_file_acl != 0; -+ int block = ext3_xattr_new_block(handle, inode, -+ &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+getblk_failed: ext3_xattr_free_block(handle, inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ error = ext3_journal_get_create_access(handle, new_bh); -+ if (error) { -+ unlock_buffer(new_bh); -+ goto getblk_failed; -+ } -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext3_xattr_cache_insert(new_bh); -+ -+ ext3_xattr_update_super_block(handle, sb); -+ } -+ error = ext3_journal_dirty_metadata(handle, new_bh); -+ if (error) -+ goto cleanup; -+ } -+ -+ /* Update the inode. */ -+ EXT3_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, inode); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ error = ext3_journal_get_write_access(handle, old_bh); -+ if (error) -+ goto cleanup; -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext3_xattr_free_block(handle, inode, old_bh->b_blocknr); -+ -+ /* ext3_forget() calls bforget() for us, but we -+ let our caller release old_bh, so we need to -+ duplicate the handle before. */ -+ get_bh(old_bh); -+ ext3_forget(handle, 1, inode, old_bh,old_bh->b_blocknr); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext3_xattr_quota_free(inode); -+ ext3_journal_dirty_metadata(handle, old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT3_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext3_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ext3_journal_get_write_access(handle, bh); -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext3_xattr_cache_remove(bh); -+ ext3_xattr_free_block(handle, inode, block); -+ ext3_forget(handle, 1, inode, bh, block); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ ext3_journal_dirty_metadata(handle, bh); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ ext3_xattr_quota_free(inode); -+ } -+ EXT3_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext3_xattr_sem); -+} -+ -+/* -+ * ext3_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ mb_cache_shrink(ext3_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+/* -+ * ext3_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext3_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext3_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext3_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext3_xattr_cmp(struct ext3_xattr_header *header1, -+ struct ext3_xattr_header *header2) -+{ -+ struct ext3_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT3_XATTR_NEXT(entry1); -+ entry2 = EXT3_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext3_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext3_xattr_cache_find(struct inode *inode, struct ext3_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext3_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT3_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT3_XATTR_REFCOUNT_MAX); -+ } else if (!ext3_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext3_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext3_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext3_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext3_xattr_hash_entry(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT3_XATTR_ROUND) >> EXT3_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext3_xattr_rehash(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ struct ext3_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext3_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT3_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext3_xattr(void) -+{ -+ ext3_xattr_cache = mb_cache_create("ext3_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext3_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+ if (ext3_xattr_cache) -+ mb_cache_destroy(ext3_xattr_cache); -+ ext3_xattr_cache = NULL; -+} -+ -+#else /* CONFIG_EXT3_FS_XATTR_SHARING */ -+ -+int __init -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_SHARING */ ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/fs/ext3/xattr_user.c Fri May 16 08:43:01 2003 -@@ -0,0 +1,111 @@ -+/* -+ * linux/fs/ext3/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+# include <linux/ext3_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext3_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext3_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext3_xattr_get(inode, EXT3_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext3_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ handle_t *handle; -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ error = ext3_xattr_set(handle, inode, EXT3_XATTR_INDEX_USER, name, -+ value, size, flags); -+ ext3_journal_stop(handle, inode); -+ -+ return error; -+} -+ -+struct ext3_xattr_handler ext3_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext3_xattr_user_list, -+ get: ext3_xattr_user_get, -+ set: ext3_xattr_user_set, -+}; -+ -+int __init -+init_ext3_xattr_user(void) -+{ -+ return ext3_xattr_register(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} -+ -+void -+exit_ext3_xattr_user(void) -+{ -+ ext3_xattr_unregister(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/fs/ext3/ext3-exports.c Fri May 16 08:43:01 2003 -@@ -0,0 +1,13 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); ---- linux/fs/jfs/jfs_xattr.h~linux-2.4.20-xattr-0.8.54-hp Thu Nov 28 15:53:15 2002 -+++ linux-mmonroe/fs/jfs/jfs_xattr.h Fri May 16 08:43:01 2003 -@@ -52,8 +52,10 @@ struct jfs_ea_list { - #define END_EALIST(ealist) \ - ((struct jfs_ea *) (((char *) (ealist)) + EALIST_SIZE(ealist))) - --extern int __jfs_setxattr(struct inode *, const char *, void *, size_t, int); --extern int jfs_setxattr(struct dentry *, const char *, void *, size_t, int); -+extern int __jfs_setxattr(struct inode *, const char *, const void *, size_t, -+ int); -+extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, -+ int); - extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t); - extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t); - extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); ---- linux/fs/jfs/xattr.c~linux-2.4.20-xattr-0.8.54-hp Thu Nov 28 15:53:15 2002 -+++ linux-mmonroe/fs/jfs/xattr.c Fri May 16 08:43:01 2003 -@@ -641,7 +641,7 @@ static int ea_put(struct inode *inode, s - } - - static int can_set_xattr(struct inode *inode, const char *name, -- void *value, size_t value_len) -+ const void *value, size_t value_len) - { - if (IS_RDONLY(inode)) - return -EROFS; -@@ -660,7 +660,7 @@ static int can_set_xattr(struct inode *i - return permission(inode, MAY_WRITE); - } - --int __jfs_setxattr(struct inode *inode, const char *name, void *value, -+int __jfs_setxattr(struct inode *inode, const char *name, const void *value, - size_t value_len, int flags) - { - struct jfs_ea_list *ealist; -@@ -799,7 +799,7 @@ int __jfs_setxattr(struct inode *inode, - return rc; - } - --int jfs_setxattr(struct dentry *dentry, const char *name, void *value, -+int jfs_setxattr(struct dentry *dentry, const char *name, const void *value, - size_t value_len, int flags) - { - if (value == NULL) { /* empty EA, do not remove */ ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/fs/mbcache.c Fri May 16 08:43:01 2003 -@@ -0,0 +1,648 @@ -+/* -+ * linux/fs/mbcache.c -+ * (C) 2001-2002 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+/* -+ * Filesystem Meta Information Block Cache (mbcache) -+ * -+ * The mbcache caches blocks of block devices that need to be located -+ * by their device/block number, as well as by other criteria (such -+ * as the block's contents). -+ * -+ * There can only be one cache entry in a cache per device and block number. -+ * Additional indexes need not be unique in this sense. The number of -+ * additional indexes (=other criteria) can be hardwired at compile time -+ * or specified at cache create time. -+ * -+ * Each cache entry is of fixed size. An entry may be `valid' or `invalid' -+ * in the cache. A valid entry is in the main hash tables of the cache, -+ * and may also be in the lru list. An invalid entry is not in any hashes -+ * or lists. -+ * -+ * A valid cache entry is only in the lru list if no handles refer to it. -+ * Invalid cache entries will be freed when the last handle to the cache -+ * entry is released. Entries that cannot be freed immediately are put -+ * back on the lru list. -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+ -+#include <linux/fs.h> -+#include <linux/slab.h> -+#include <linux/sched.h> -+#include <linux/cache_def.h> -+#include <linux/version.h> -+#include <linux/init.h> -+#include <linux/mbcache.h> -+ -+ -+#ifdef MB_CACHE_DEBUG -+# define mb_debug(f...) do { \ -+ printk(KERN_DEBUG f); \ -+ printk("\n"); \ -+ } while (0) -+#define mb_assert(c) do { if (!(c)) \ -+ printk(KERN_ERR "assertion " #c " failed\n"); \ -+ } while(0) -+#else -+# define mb_debug(f...) do { } while(0) -+# define mb_assert(c) do { } while(0) -+#endif -+#define mb_error(f...) do { \ -+ printk(KERN_ERR f); \ -+ printk("\n"); \ -+ } while(0) -+ -+MODULE_AUTHOR("Andreas Gruenbacher <a.gruenbacher@computer.org>"); -+MODULE_DESCRIPTION("Meta block cache (for extended attributes)"); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) -+MODULE_LICENSE("GPL"); -+#endif -+ -+EXPORT_SYMBOL(mb_cache_create); -+EXPORT_SYMBOL(mb_cache_shrink); -+EXPORT_SYMBOL(mb_cache_destroy); -+EXPORT_SYMBOL(mb_cache_entry_alloc); -+EXPORT_SYMBOL(mb_cache_entry_insert); -+EXPORT_SYMBOL(mb_cache_entry_release); -+EXPORT_SYMBOL(mb_cache_entry_takeout); -+EXPORT_SYMBOL(mb_cache_entry_free); -+EXPORT_SYMBOL(mb_cache_entry_dup); -+EXPORT_SYMBOL(mb_cache_entry_get); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+EXPORT_SYMBOL(mb_cache_entry_find_first); -+EXPORT_SYMBOL(mb_cache_entry_find_next); -+#endif -+ -+ -+/* -+ * Global data: list of all mbcache's, lru list, and a spinlock for -+ * accessing cache data structures on SMP machines. The lru list is -+ * global across all mbcaches. -+ */ -+ -+static LIST_HEAD(mb_cache_list); -+static LIST_HEAD(mb_cache_lru_list); -+static spinlock_t mb_cache_spinlock = SPIN_LOCK_UNLOCKED; -+ -+static inline int -+mb_cache_indexes(struct mb_cache *cache) -+{ -+#ifdef MB_CACHE_INDEXES_COUNT -+ return MB_CACHE_INDEXES_COUNT; -+#else -+ return cache->c_indexes_count; -+#endif -+} -+ -+/* -+ * What the mbcache registers as to get shrunk dynamically. -+ */ -+ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask); -+ -+static struct cache_definition mb_cache_definition = { -+ "mb_cache", -+ mb_cache_memory_pressure -+}; -+ -+ -+static inline int -+__mb_cache_entry_is_hashed(struct mb_cache_entry *ce) -+{ -+ return !list_empty(&ce->e_block_list); -+} -+ -+ -+static inline void -+__mb_cache_entry_unhash(struct mb_cache_entry *ce) -+{ -+ int n; -+ -+ if (__mb_cache_entry_is_hashed(ce)) { -+ list_del_init(&ce->e_block_list); -+ for (n=0; n<mb_cache_indexes(ce->e_cache); n++) -+ list_del(&ce->e_indexes[n].o_list); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_forget(struct mb_cache_entry *ce, int gfp_mask) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ -+ mb_assert(atomic_read(&ce->e_used) == 0); -+ if (cache->c_op.free && cache->c_op.free(ce, gfp_mask)) { -+ /* free failed -- put back on the lru list -+ for freeing later. */ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&ce->e_lru_list, &mb_cache_lru_list); -+ spin_unlock(&mb_cache_spinlock); -+ } else { -+ kmem_cache_free(cache->c_entry_cache, ce); -+ atomic_dec(&cache->c_entry_count); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_release_unlock(struct mb_cache_entry *ce) -+{ -+ if (atomic_dec_and_test(&ce->e_used)) { -+ if (__mb_cache_entry_is_hashed(ce)) -+ list_add_tail(&ce->e_lru_list, &mb_cache_lru_list); -+ else { -+ spin_unlock(&mb_cache_spinlock); -+ __mb_cache_entry_forget(ce, GFP_KERNEL); -+ return; -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_memory_pressure() memory pressure callback -+ * -+ * This function is called by the kernel memory management when memory -+ * gets low. -+ * -+ * @priority: Amount by which to shrink the cache (0 = highes priority) -+ * @gfp_mask: (ignored) -+ */ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int count = 0; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &mb_cache_list) { -+ struct mb_cache *cache = -+ list_entry(l, struct mb_cache, c_cache_list); -+ mb_debug("cache %s (%d)", cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ count += atomic_read(&cache->c_entry_count); -+ } -+ mb_debug("trying to free %d of %d entries", -+ count / (priority ? priority : 1), count); -+ if (priority) -+ count /= priority; -+ while (count-- && !list_empty(&mb_cache_lru_list)) { -+ struct mb_cache_entry *ce = -+ list_entry(mb_cache_lru_list.next, -+ struct mb_cache_entry, e_lru_list); -+ list_del(&ce->e_lru_list); -+ __mb_cache_entry_unhash(ce); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), gfp_mask); -+ } -+} -+ -+ -+/* -+ * mb_cache_create() create a new cache -+ * -+ * All entries in one cache are equal size. Cache entries may be from -+ * multiple devices. If this is the first mbcache created, registers -+ * the cache with kernel memory management. Returns NULL if no more -+ * memory was available. -+ * -+ * @name: name of the cache (informal) -+ * @cache_op: contains the callback called when freeing a cache entry -+ * @entry_size: The size of a cache entry, including -+ * struct mb_cache_entry -+ * @indexes_count: number of additional indexes in the cache. Must equal -+ * MB_CACHE_INDEXES_COUNT if the number of indexes is -+ * hardwired. -+ * @bucket_count: number of hash buckets -+ */ -+struct mb_cache * -+mb_cache_create(const char *name, struct mb_cache_op *cache_op, -+ size_t entry_size, int indexes_count, int bucket_count) -+{ -+ int m=0, n; -+ struct mb_cache *cache = NULL; -+ -+ if(entry_size < sizeof(struct mb_cache_entry) + -+ indexes_count * sizeof(struct mb_cache_entry_index)) -+ return NULL; -+ -+ MOD_INC_USE_COUNT; -+ cache = kmalloc(sizeof(struct mb_cache) + -+ indexes_count * sizeof(struct list_head), GFP_KERNEL); -+ if (!cache) -+ goto fail; -+ cache->c_name = name; -+ cache->c_op.free = NULL; -+ if (cache_op) -+ cache->c_op.free = cache_op->free; -+ atomic_set(&cache->c_entry_count, 0); -+ cache->c_bucket_count = bucket_count; -+#ifdef MB_CACHE_INDEXES_COUNT -+ mb_assert(indexes_count == MB_CACHE_INDEXES_COUNT); -+#else -+ cache->c_indexes_count = indexes_count; -+#endif -+ cache->c_block_hash = kmalloc(bucket_count * sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_block_hash) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_block_hash[n]); -+ for (m=0; m<indexes_count; m++) { -+ cache->c_indexes_hash[m] = kmalloc(bucket_count * -+ sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_indexes_hash[m]) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_indexes_hash[m][n]); -+ } -+ cache->c_entry_cache = kmem_cache_create(name, entry_size, 0, -+ 0 /*SLAB_POISON | SLAB_RED_ZONE*/, NULL, NULL); -+ if (!cache->c_entry_cache) -+ goto fail; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&cache->c_cache_list, &mb_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ return cache; -+ -+fail: -+ if (cache) { -+ while (--m >= 0) -+ kfree(cache->c_indexes_hash[m]); -+ if (cache->c_block_hash) -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ } -+ MOD_DEC_USE_COUNT; -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_shrink() -+ * -+ * Removes all cache entires of a device from the cache. All cache entries -+ * currently in use cannot be freed, and thus remain in the cache. -+ * -+ * @cache: which cache to shrink -+ * @dev: which device's cache entries to shrink -+ */ -+void -+mb_cache_shrink(struct mb_cache *cache, kdev_t dev) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_dev == dev) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+} -+ -+ -+/* -+ * mb_cache_destroy() -+ * -+ * Shrinks the cache to its minimum possible size (hopefully 0 entries), -+ * and then destroys it. If this was the last mbcache, un-registers the -+ * mbcache from kernel memory management. -+ */ -+void -+mb_cache_destroy(struct mb_cache *cache) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_cache == cache) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ list_del(&cache->c_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+ -+ if (atomic_read(&cache->c_entry_count) > 0) { -+ mb_error("cache %s: %d orphaned entries", -+ cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ } -+ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)) -+ /* We don't have kmem_cache_destroy() in 2.2.x */ -+ kmem_cache_shrink(cache->c_entry_cache); -+#else -+ kmem_cache_destroy(cache->c_entry_cache); -+#endif -+ for (n=0; n < mb_cache_indexes(cache); n++) -+ kfree(cache->c_indexes_hash[n]); -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ -+ MOD_DEC_USE_COUNT; -+} -+ -+ -+/* -+ * mb_cache_entry_alloc() -+ * -+ * Allocates a new cache entry. The new entry will not be valid initially, -+ * and thus cannot be looked up yet. It should be filled with data, and -+ * then inserted into the cache using mb_cache_entry_insert(). Returns NULL -+ * if no more memory was available. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_alloc(struct mb_cache *cache) -+{ -+ struct mb_cache_entry *ce; -+ -+ atomic_inc(&cache->c_entry_count); -+ ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL); -+ if (ce) { -+ INIT_LIST_HEAD(&ce->e_lru_list); -+ INIT_LIST_HEAD(&ce->e_block_list); -+ ce->e_cache = cache; -+ atomic_set(&ce->e_used, 1); -+ } -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_insert() -+ * -+ * Inserts an entry that was allocated using mb_cache_entry_alloc() into -+ * the cache. After this, the cache entry can be looked up, but is not yet -+ * in the lru list as the caller still holds a handle to it. Returns 0 on -+ * success, or -EBUSY if a cache entry for that device + inode exists -+ * already (this may happen after a failed lookup, if another process has -+ * inserted the same cache entry in the meantime). -+ * -+ * @dev: device the cache entry belongs to -+ * @block: block number -+ * @keys: array of additional keys. There must be indexes_count entries -+ * in the array (as specified when creating the cache). -+ */ -+int -+mb_cache_entry_insert(struct mb_cache_entry *ce, kdev_t dev, -+ unsigned long block, unsigned int keys[]) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ int error = -EBUSY, n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) -+ goto out; -+ } -+ __mb_cache_entry_unhash(ce); -+ ce->e_dev = dev; -+ ce->e_block = block; -+ list_add(&ce->e_block_list, &cache->c_block_hash[bucket]); -+ for (n=0; n<mb_cache_indexes(cache); n++) { -+ ce->e_indexes[n].o_key = keys[n]; -+ bucket = keys[n] % cache->c_bucket_count; -+ list_add(&ce->e_indexes[n].o_list, -+ &cache->c_indexes_hash[n][bucket]); -+ } -+out: -+ spin_unlock(&mb_cache_spinlock); -+ return error; -+} -+ -+ -+/* -+ * mb_cache_entry_release() -+ * -+ * Release a handle to a cache entry. When the last handle to a cache entry -+ * is released it is either freed (if it is invalid) or otherwise inserted -+ * in to the lru list. -+ */ -+void -+mb_cache_entry_release(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_takeout() -+ * -+ * Take a cache entry out of the cache, making it invalid. The entry can later -+ * be re-inserted using mb_cache_entry_insert(), or released using -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_takeout(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_entry_free() -+ * -+ * This is equivalent to the sequence mb_cache_entry_takeout() -- -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_free(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_dup() -+ * -+ * Duplicate a handle to a cache entry (does not duplicate the cache entry -+ * itself). After the call, both the old and the new handle must be released. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_dup(struct mb_cache_entry *ce) -+{ -+ atomic_inc(&ce->e_used); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_get() -+ * -+ * Get a cache entry by device / block number. (There can only be one entry -+ * in the cache per device and block.) Returns NULL if no such cache entry -+ * exists. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_get(struct mb_cache *cache, kdev_t dev, unsigned long block) -+{ -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ ce = list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ goto cleanup; -+ } -+ } -+ ce = NULL; -+ -+cleanup: -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+ -+static struct mb_cache_entry * -+__mb_cache_entry_find(struct list_head *l, struct list_head *head, -+ int index, kdev_t dev, unsigned int key) -+{ -+ while (l != head) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, -+ e_indexes[index].o_list); -+ if (ce->e_dev == dev && ce->e_indexes[index].o_key == key) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ return ce; -+ } -+ l = l->next; -+ } -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_entry_find_first() -+ * -+ * Find the first cache entry on a given device with a certain key in -+ * an additional index. Additonal matches can be found with -+ * mb_cache_entry_find_next(). Returns NULL if no match was found. -+ * -+ * @cache: the cache to search -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_first(struct mb_cache *cache, int index, kdev_t dev, -+ unsigned int key) -+{ -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = cache->c_indexes_hash[index][bucket].next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_find_next() -+ * -+ * Find the next cache entry on a given device with a certain key in an -+ * additional index. Returns NULL if no match could be found. The previous -+ * entry is atomatically released, so that mb_cache_entry_find_next() can -+ * be called like this: -+ * -+ * entry = mb_cache_entry_find_first(); -+ * while (entry) { -+ * ... -+ * entry = mb_cache_entry_find_next(entry, ...); -+ * } -+ * -+ * @prev: The previous match -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_next(struct mb_cache_entry *prev, int index, kdev_t dev, -+ unsigned int key) -+{ -+ struct mb_cache *cache = prev->e_cache; -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = prev->e_indexes[index].o_list.next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ __mb_cache_entry_release_unlock(prev); -+ return ce; -+} -+ -+#endif /* !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) */ -+ -+static int __init init_mbcache(void) -+{ -+ register_cache(&mb_cache_definition); -+ return 0; -+} -+ -+static void __exit exit_mbcache(void) -+{ -+ unregister_cache(&mb_cache_definition); -+} -+ -+module_init(init_mbcache) -+module_exit(exit_mbcache) -+ ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/include/linux/cache_def.h Fri May 16 08:43:01 2003 -@@ -0,0 +1,15 @@ -+/* -+ * linux/cache_def.h -+ * Handling of caches defined in drivers, filesystems, ... -+ * -+ * Copyright (C) 2002 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+struct cache_definition { -+ const char *name; -+ void (*shrink)(int, unsigned int); -+ struct list_head link; -+}; -+ -+extern void register_cache(struct cache_definition *); -+extern void unregister_cache(struct cache_definition *); ---- linux/include/linux/errno.h~linux-2.4.20-xattr-0.8.54-hp Fri Feb 9 14:46:13 2001 -+++ linux-mmonroe/include/linux/errno.h Fri May 16 08:43:01 2003 -@@ -23,4 +23,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ -+ - #endif ---- linux/include/linux/ext2_fs.h~linux-2.4.20-xattr-0.8.54-hp Thu Nov 22 11:46:52 2001 -+++ linux-mmonroe/include/linux/ext2_fs.h Fri May 16 08:43:01 2003 -@@ -57,8 +57,6 @@ - */ - #define EXT2_BAD_INO 1 /* Bad blocks inode */ - #define EXT2_ROOT_INO 2 /* Root inode */ --#define EXT2_ACL_IDX_INO 3 /* ACL inode */ --#define EXT2_ACL_DATA_INO 4 /* ACL inode */ - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -@@ -86,7 +84,6 @@ - #else - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -121,28 +118,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext2_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext2_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext2_group_desc -@@ -314,6 +289,7 @@ struct ext2_inode { - #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ - #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ -+#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt -@@ -397,6 +373,7 @@ struct ext2_super_block { - - #ifdef __KERNEL__ - #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -+#define EXT2_I(inode) (&((inode)->u.ext2_i)) - #else - /* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test -@@ -466,7 +443,7 @@ struct ext2_super_block { - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff - --#define EXT2_FEATURE_COMPAT_SUPP 0 -+#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -623,8 +600,10 @@ extern struct address_space_operations e - - /* namei.c */ - extern struct inode_operations ext2_dir_inode_operations; -+extern struct inode_operations ext2_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext2_symlink_inode_operations; - extern struct inode_operations ext2_fast_symlink_inode_operations; - - #endif /* __KERNEL__ */ ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/include/linux/ext2_xattr.h Fri May 16 08:43:01 2003 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext2_xattr.h -+ -+ On-disk format of extended attributes for the ext2 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT2_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT2_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT2_XATTR_INDEX_MAX 10 -+#define EXT2_XATTR_INDEX_USER 1 -+#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext2_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext2_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT2_XATTR_PAD_BITS 2 -+#define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS) -+#define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1) -+#define EXT2_XATTR_LEN(name_len) \ -+ (((name_len) + EXT2_XATTR_ROUND + \ -+ sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND) -+#define EXT2_XATTR_NEXT(entry) \ -+ ( (struct ext2_xattr_entry *)( \ -+ (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT2_XATTR_SIZE(size) \ -+ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT2_FS_XATTR -+ -+struct ext2_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext2_xattr_register(int, struct ext2_xattr_handler *); -+extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); -+ -+extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); -+extern int ext2_removexattr(struct dentry *, const char *); -+ -+extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext2_xattr_list(struct inode *, char *, size_t); -+extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext2_xattr_delete_inode(struct inode *); -+extern void ext2_xattr_put_super(struct super_block *); -+ -+extern int init_ext2_xattr(void) __init; -+extern void exit_ext2_xattr(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR */ -+# define ext2_setxattr NULL -+# define ext2_getxattr NULL -+# define ext2_listxattr NULL -+# define ext2_removexattr NULL -+ -+static inline int -+ext2_xattr_get(struct inode *inode, int name_index, -+ const char *name, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+} -+ -+static inline void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR */ -+ -+# ifdef CONFIG_EXT2_FS_XATTR_USER -+ -+extern int init_ext2_xattr_user(void) __init; -+extern void exit_ext2_xattr_user(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+static inline int -+init_ext2_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr_user(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ ---- linux/include/linux/ext3_fs.h~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:47 2003 -+++ linux-mmonroe/include/linux/ext3_fs.h Fri May 16 08:43:01 2003 -@@ -63,8 +63,6 @@ - */ - #define EXT3_BAD_INO 1 /* Bad blocks inode */ - #define EXT3_ROOT_INO 2 /* Root inode */ --#define EXT3_ACL_IDX_INO 3 /* ACL inode */ --#define EXT3_ACL_DATA_INO 4 /* ACL inode */ - #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ - #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ -@@ -94,7 +92,6 @@ - #else - # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry)) - #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -129,28 +126,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext3_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext3_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext3_group_desc -@@ -344,6 +319,7 @@ struct ext3_inode { - #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */ - #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 */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -520,7 +496,7 @@ struct ext3_super_block { - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - --#define EXT3_FEATURE_COMPAT_SUPP 0 -+#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) - #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ -@@ -703,6 +679,7 @@ extern void ext3_check_inodes_bitmap (st - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - - /* inode.c */ -+extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); - -@@ -771,8 +748,10 @@ extern struct address_space_operations e - - /* namei.c */ - extern struct inode_operations ext3_dir_inode_operations; -+extern struct inode_operations ext3_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - - ---- linux/include/linux/ext3_jbd.h~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:46 2003 -+++ linux-mmonroe/include/linux/ext3_jbd.h Fri May 16 08:43:01 2003 -@@ -30,13 +30,19 @@ - - #define EXT3_SINGLEDATA_TRANS_BLOCKS 8 - -+/* Extended attributes may touch two data buffers, two bitmap buffers, -+ * and two group and summaries. */ -+ -+#define EXT3_XATTR_TRANS_BLOCKS 8 -+ - /* 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 - * quota files too (one for the group, one for the user quota). The - * superblock only gets updated once, of course, so don't bother - * counting that again for the quota updates. */ - --#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS - 2) -+#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \ -+ EXT3_XATTR_TRANS_BLOCKS - 2) - - extern int ext3_writepage_trans_blocks(struct inode *inode); - ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/include/linux/ext3_xattr.h Fri May 16 08:43:01 2003 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext3_xattr.h -+ -+ On-disk format of extended attributes for the ext3 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT3_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT3_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT3_XATTR_INDEX_MAX 10 -+#define EXT3_XATTR_INDEX_USER 1 -+#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext3_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext3_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT3_XATTR_PAD_BITS 2 -+#define EXT3_XATTR_PAD (1<<EXT3_XATTR_PAD_BITS) -+#define EXT3_XATTR_ROUND (EXT3_XATTR_PAD-1) -+#define EXT3_XATTR_LEN(name_len) \ -+ (((name_len) + EXT3_XATTR_ROUND + \ -+ sizeof(struct ext3_xattr_entry)) & ~EXT3_XATTR_ROUND) -+#define EXT3_XATTR_NEXT(entry) \ -+ ( (struct ext3_xattr_entry *)( \ -+ (char *)(entry) + EXT3_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT3_XATTR_SIZE(size) \ -+ (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT3_FS_XATTR -+ -+struct ext3_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext3_xattr_register(int, struct ext3_xattr_handler *); -+extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *); -+ -+extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); -+extern int ext3_removexattr(struct dentry *, const char *); -+ -+extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext3_xattr_list(struct inode *, char *, size_t); -+extern int ext3_xattr_set(handle_t *handle, struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext3_xattr_delete_inode(handle_t *, struct inode *); -+extern void ext3_xattr_put_super(struct super_block *); -+ -+extern int init_ext3_xattr(void) __init; -+extern void exit_ext3_xattr(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR */ -+# define ext3_setxattr NULL -+# define ext3_getxattr NULL -+# define ext3_listxattr NULL -+# define ext3_removexattr NULL -+ -+static inline int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_list(struct inode *inode, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+} -+ -+static inline void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT3_FS_XATTR */ -+ -+# ifdef CONFIG_EXT3_FS_XATTR_USER -+ -+extern int init_ext3_xattr_user(void) __init; -+extern void exit_ext3_xattr_user(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+static inline int -+init_ext3_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr_user(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ ---- linux/include/linux/fs.h~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:46 2003 -+++ linux-mmonroe/include/linux/fs.h Fri May 16 08:43:01 2003 -@@ -909,7 +909,7 @@ struct inode_operations { - int (*setattr) (struct dentry *, struct iattr *); - int (*setattr_raw) (struct inode *, struct iattr *); - int (*getattr) (struct dentry *, struct iattr *); -- int (*setxattr) (struct dentry *, const char *, void *, size_t, int); -+ int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); - ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); - ssize_t (*listxattr) (struct dentry *, char *, size_t); - int (*removexattr) (struct dentry *, const char *); ---- /dev/null Mon May 20 21:11:23 2002 -+++ linux-mmonroe/include/linux/mbcache.h Fri May 16 08:43:01 2003 -@@ -0,0 +1,69 @@ -+/* -+ File: linux/mbcache.h -+ -+ (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+/* Hardwire the number of additional indexes */ -+#define MB_CACHE_INDEXES_COUNT 1 -+ -+struct mb_cache_entry; -+ -+struct mb_cache_op { -+ int (*free)(struct mb_cache_entry *, int); -+}; -+ -+struct mb_cache { -+ struct list_head c_cache_list; -+ const char *c_name; -+ struct mb_cache_op c_op; -+ atomic_t c_entry_count; -+ int c_bucket_count; -+#ifndef MB_CACHE_INDEXES_COUNT -+ int c_indexes_count; -+#endif -+ kmem_cache_t *c_entry_cache; -+ struct list_head *c_block_hash; -+ struct list_head *c_indexes_hash[0]; -+}; -+ -+struct mb_cache_entry_index { -+ struct list_head o_list; -+ unsigned int o_key; -+}; -+ -+struct mb_cache_entry { -+ struct list_head e_lru_list; -+ struct mb_cache *e_cache; -+ atomic_t e_used; -+ kdev_t e_dev; -+ unsigned long e_block; -+ struct list_head e_block_list; -+ struct mb_cache_entry_index e_indexes[0]; -+}; -+ -+/* Functions on caches */ -+ -+struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, -+ int, int); -+void mb_cache_shrink(struct mb_cache *, kdev_t); -+void mb_cache_destroy(struct mb_cache *); -+ -+/* Functions on cache entries */ -+ -+struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *); -+int mb_cache_entry_insert(struct mb_cache_entry *, kdev_t, unsigned long, -+ unsigned int[]); -+void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]); -+void mb_cache_entry_release(struct mb_cache_entry *); -+void mb_cache_entry_takeout(struct mb_cache_entry *); -+void mb_cache_entry_free(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, kdev_t, -+ unsigned long); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, -+ kdev_t, unsigned int); -+struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, -+ kdev_t, unsigned int); -+#endif ---- linux/kernel/ksyms.c~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:42:45 2003 -+++ linux-mmonroe/kernel/ksyms.c Fri May 16 08:43:52 2003 -@@ -11,6 +11,7 @@ - - #include <linux/config.h> - #include <linux/slab.h> -+#include <linux/cache_def.h> - #include <linux/module.h> - #include <linux/blkdev.h> - #include <linux/cdrom.h> -@@ -106,6 +107,7 @@ EXPORT_SYMBOL(exit_mm); - EXPORT_SYMBOL(exit_files); - EXPORT_SYMBOL(exit_fs); - EXPORT_SYMBOL(exit_sighand); -+EXPORT_SYMBOL(copy_fs_struct); - EXPORT_SYMBOL_GPL(make_pages_present); - - /* internal kernel memory management */ -@@ -126,6 +128,8 @@ EXPORT_SYMBOL(kmem_cache_validate); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); - EXPORT_SYMBOL(kmem_cache_size); -+EXPORT_SYMBOL(register_cache); -+EXPORT_SYMBOL(unregister_cache); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); ---- linux/mm/vmscan.c~linux-2.4.20-xattr-0.8.54-hp Fri May 16 08:39:23 2003 -+++ linux-mmonroe/mm/vmscan.c Fri May 16 08:43:01 2003 -@@ -18,6 +18,7 @@ - #include <linux/kernel_stat.h> - #include <linux/swap.h> - #include <linux/swapctl.h> -+#include <linux/cache_def.h> - #include <linux/smp_lock.h> - #include <linux/pagemap.h> - #include <linux/init.h> -@@ -35,6 +36,39 @@ - */ - #define DEF_PRIORITY (6) - -+static DECLARE_MUTEX(other_caches_sem); -+static LIST_HEAD(cache_definitions); -+ -+void register_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_add(&cache->link, &cache_definitions); -+ up(&other_caches_sem); -+} -+ -+void unregister_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_del(&cache->link); -+ up(&other_caches_sem); -+} -+ -+static void shrink_other_caches(unsigned int priority, int gfp_mask) -+{ -+ struct list_head *p; -+ -+ if (down_trylock(&other_caches_sem)) -+ return; -+ -+ list_for_each_prev(p, &cache_definitions) { -+ struct cache_definition *cache = -+ list_entry(p, struct cache_definition, link); -+ -+ cache->shrink(priority, gfp_mask); -+ } -+ up(&other_caches_sem); -+} -+ - /* - * The swap-out function returns 1 if it successfully - * scanned all the pages it was asked to (`count'). -@@ -579,6 +613,7 @@ static int shrink_caches(zone_t * classz - - shrink_dcache_memory(priority, gfp_mask); - shrink_icache_memory(priority, gfp_mask); -+ shrink_other_caches(priority, gfp_mask); - #ifdef CONFIG_QUOTA - shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); - #endif - -_ diff --git a/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54.patch b/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54.patch deleted file mode 100644 index f078ebe3e5..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.20-xattr-0.8.54.patch +++ /dev/null @@ -1,5588 +0,0 @@ - Documentation/Configure.help | 66 ++ - arch/alpha/defconfig | 7 - arch/alpha/kernel/entry.S | 12 - arch/arm/defconfig | 7 - arch/arm/kernel/calls.S | 24 - arch/i386/defconfig | 7 - arch/ia64/defconfig | 7 - arch/ia64/kernel/entry.S | 24 - arch/m68k/defconfig | 7 - arch/mips/defconfig | 7 - arch/mips64/defconfig | 7 - arch/ppc/defconfig | 14 - arch/ppc64/kernel/misc.S | 2 - arch/s390/defconfig | 7 - arch/s390/kernel/entry.S | 24 - arch/s390x/defconfig | 7 - arch/s390x/kernel/entry.S | 24 - arch/s390x/kernel/wrapper32.S | 92 +++ - arch/sparc/defconfig | 7 - arch/sparc/kernel/systbls.S | 10 - arch/sparc64/defconfig | 7 - arch/sparc64/kernel/systbls.S | 20 - fs/Config.in | 14 - fs/Makefile | 3 - fs/ext2/Makefile | 4 - fs/ext2/file.c | 5 - fs/ext2/ialloc.c | 2 - fs/ext2/inode.c | 34 - - fs/ext2/namei.c | 14 - fs/ext2/super.c | 29 - fs/ext2/symlink.c | 14 - fs/ext2/xattr.c | 1212 +++++++++++++++++++++++++++++++++++++++++ - fs/ext2/xattr_user.c | 103 +++ - fs/ext3/Makefile | 10 - fs/ext3/file.c | 5 - fs/ext3/ialloc.c | 2 - fs/ext3/inode.c | 35 - - fs/ext3/namei.c | 21 - fs/ext3/super.c | 36 + - fs/ext3/symlink.c | 14 - fs/ext3/xattr.c | 1225 ++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/xattr_user.c | 111 +++ - fs/jfs/jfs_xattr.h | 6 - fs/jfs/xattr.c | 6 - fs/mbcache.c | 648 ++++++++++++++++++++++ - include/asm-arm/unistd.h | 2 - include/asm-ia64/unistd.h | 13 - include/asm-ppc64/unistd.h | 2 - include/asm-s390/unistd.h | 15 - include/asm-s390x/unistd.h | 15 - include/asm-sparc/unistd.h | 24 - include/asm-sparc64/unistd.h | 24 - include/linux/cache_def.h | 15 - include/linux/errno.h | 4 - include/linux/ext2_fs.h | 31 - - include/linux/ext2_xattr.h | 157 +++++ - include/linux/ext3_fs.h | 31 - - include/linux/ext3_jbd.h | 8 - include/linux/ext3_xattr.h | 157 +++++ - include/linux/fs.h | 2 - include/linux/mbcache.h | 69 ++ - kernel/ksyms.c | 4 - mm/vmscan.c | 35 + - fs/ext3/ext3-exports.c | 14 + - 64 files changed, 4355 insertions(+), 195 deletions(-) - ---- linux-2.4.20/Documentation/Configure.help~linux-2.4.20-xattr-0.8.54 2003-05-05 17:43:06.000000000 +0800 -+++ linux-2.4.20-root/Documentation/Configure.help 2003-05-07 18:08:03.000000000 +0800 -@@ -15242,6 +15242,39 @@ CONFIG_EXT2_FS - be compiled as a module, and so this could be dangerous. Most - everyone wants to say Y here. - -+Ext2 extended attributes -+CONFIG_EXT2_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 extended attribute block sharing -+CONFIG_EXT2_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext2 extended user attributes -+CONFIG_EXT2_FS_XATTR_USER -+ This option enables extended user attributes on ext2. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 trusted extended attributes -+CONFIG_EXT2_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext2 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Ext3 journalling file system support (EXPERIMENTAL) - CONFIG_EXT3_FS - This is the journalling version of the Second extended file system -@@ -15274,6 +15307,39 @@ CONFIG_EXT3_FS - of your root partition (the one containing the directory /) cannot - be compiled as a module, and so this may be dangerous. - -+Ext3 extended attributes -+CONFIG_EXT3_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 extended attribute block sharing -+CONFIG_EXT3_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext3 extended user attributes -+CONFIG_EXT3_FS_XATTR_USER -+ This option enables extended user attributes on ext3. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 trusted extended attributes -+CONFIG_EXT3_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext3 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Journal Block Device support (JBD for ext3) (EXPERIMENTAL) - CONFIG_JBD - This is a generic journalling layer for block devices. It is ---- linux-2.4.20/arch/alpha/defconfig~linux-2.4.20-xattr-0.8.54 2001-11-20 07:19:42.000000000 +0800 -+++ linux-2.4.20-root/arch/alpha/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ALPHA=y - # CONFIG_UID16 is not set - # CONFIG_RWSEM_GENERIC_SPINLOCK is not set ---- linux-2.4.20/arch/alpha/kernel/entry.S~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:42.000000000 +0800 -+++ linux-2.4.20-root/arch/alpha/kernel/entry.S 2003-05-07 18:08:03.000000000 +0800 -@@ -1154,6 +1154,18 @@ sys_call_table: - .quad sys_readahead - .quad sys_ni_syscall /* 380, sys_security */ - .quad sys_tkill -+ .quad sys_setxattr -+ .quad sys_lsetxattr -+ .quad sys_fsetxattr -+ .quad sys_getxattr /* 385 */ -+ .quad sys_lgetxattr -+ .quad sys_fgetxattr -+ .quad sys_listxattr -+ .quad sys_llistxattr -+ .quad sys_flistxattr /* 390 */ -+ .quad sys_removexattr -+ .quad sys_lremovexattr -+ .quad sys_fremovexattr - - /* Remember to update everything, kids. */ - .ifne (. - sys_call_table) - (NR_SYSCALLS * 8) ---- linux-2.4.20/arch/arm/defconfig~linux-2.4.20-xattr-0.8.54 2001-05-20 08:43:05.000000000 +0800 -+++ linux-2.4.20-root/arch/arm/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ARM=y - # CONFIG_EISA is not set - # CONFIG_SBUS is not set ---- linux-2.4.20/arch/arm/kernel/calls.S~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:42.000000000 +0800 -+++ linux-2.4.20-root/arch/arm/kernel/calls.S 2003-05-07 18:08:03.000000000 +0800 -@@ -240,18 +240,18 @@ __syscall_start: - .long SYMBOL_NAME(sys_ni_syscall) /* Security */ - .long SYMBOL_NAME(sys_gettid) - /* 225 */ .long SYMBOL_NAME(sys_readahead) -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_setxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_lsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_getxattr */ --/* 230 */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_lgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_listxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_llistxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_flistxattr */ --/* 235 */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_removexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_lremovexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fremovexattr */ -+ .long SYMBOL_NAME(sys_setxattr) -+ .long SYMBOL_NAME(sys_lsetxattr) -+ .long SYMBOL_NAME(sys_fsetxattr) -+ .long SYMBOL_NAME(sys_getxattr) -+/* 230 */ .long SYMBOL_NAME(sys_lgetxattr) -+ .long SYMBOL_NAME(sys_fgetxattr) -+ .long SYMBOL_NAME(sys_listxattr) -+ .long SYMBOL_NAME(sys_llistxattr) -+ .long SYMBOL_NAME(sys_flistxattr) -+/* 235 */ .long SYMBOL_NAME(sys_removexattr) -+ .long SYMBOL_NAME(sys_lremovexattr) -+ .long SYMBOL_NAME(sys_fremovexattr) - .long SYMBOL_NAME(sys_tkill) - /* - * Please check 2.5 _before_ adding calls here, ---- linux-2.4.20/arch/i386/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-root/arch/i386/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_X86=y - CONFIG_ISA=y - # CONFIG_SBUS is not set ---- linux-2.4.20/arch/ia64/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-root/arch/ia64/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options ---- linux-2.4.20/arch/ia64/kernel/entry.S~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-root/arch/ia64/kernel/entry.S 2003-05-07 18:08:03.000000000 +0800 -@@ -1170,18 +1170,18 @@ sys_call_table: - data8 sys_getdents64 - data8 sys_getunwind // 1215 - data8 sys_readahead -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall // 1220 -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall // 1225 -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -- data8 ia64_ni_syscall -+ data8 sys_setxattr -+ data8 sys_lsetxattr -+ data8 sys_fsetxattr -+ data8 sys_getxattr // 1220 -+ data8 sys_lgetxattr -+ data8 sys_fgetxattr -+ data8 sys_listxattr -+ data8 sys_llistxattr -+ data8 sys_flistxattr // 1225 -+ data8 sys_removexattr -+ data8 sys_lremovexattr -+ data8 sys_fremovexattr - data8 sys_tkill - data8 ia64_ni_syscall // 1230 - data8 ia64_ni_syscall ---- linux-2.4.20/arch/m68k/defconfig~linux-2.4.20-xattr-0.8.54 2000-06-20 03:56:08.000000000 +0800 -+++ linux-2.4.20-root/arch/m68k/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_UID16=y - - # ---- linux-2.4.20/arch/mips/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:10.000000000 +0800 -+++ linux-2.4.20-root/arch/mips/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - CONFIG_MIPS32=y - # CONFIG_MIPS64 is not set ---- linux-2.4.20/arch/mips64/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:10.000000000 +0800 -+++ linux-2.4.20-root/arch/mips64/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - # CONFIG_MIPS32 is not set - CONFIG_MIPS64=y ---- linux-2.4.20/arch/ppc/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/ppc/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_UID16 is not set - # CONFIG_RWSEM_GENERIC_SPINLOCK is not set - CONFIG_RWSEM_XCHGADD_ALGORITHM=y ---- linux-2.4.20/arch/ppc64/kernel/misc.S~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/ppc64/kernel/misc.S 2003-05-07 18:08:03.000000000 +0800 -@@ -731,6 +731,7 @@ _GLOBAL(sys_call_table32) - .llong .sys_gettid /* 207 */ - #if 0 /* Reserved syscalls */ - .llong .sys_tkill /* 208 */ -+#endif - .llong .sys_setxattr - .llong .sys_lsetxattr /* 210 */ - .llong .sys_fsetxattr -@@ -743,6 +744,7 @@ _GLOBAL(sys_call_table32) - .llong .sys_removexattr - .llong .sys_lremovexattr - .llong .sys_fremovexattr /* 220 */ -+#if 0 /* Reserved syscalls */ - .llong .sys_futex - #endif - .llong .sys_perfmonctl /* Put this here for now ... */ ---- linux-2.4.20/arch/s390/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/s390/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set ---- linux-2.4.20/arch/s390/kernel/entry.S~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/s390/kernel/entry.S 2003-05-07 18:08:03.000000000 +0800 -@@ -558,18 +558,18 @@ sys_call_table: - .long sys_fcntl64 - .long sys_ni_syscall - .long sys_ni_syscall -- .long sys_ni_syscall /* 224 - reserved for setxattr */ -- .long sys_ni_syscall /* 225 - reserved for lsetxattr */ -- .long sys_ni_syscall /* 226 - reserved for fsetxattr */ -- .long sys_ni_syscall /* 227 - reserved for getxattr */ -- .long sys_ni_syscall /* 228 - reserved for lgetxattr */ -- .long sys_ni_syscall /* 229 - reserved for fgetxattr */ -- .long sys_ni_syscall /* 230 - reserved for listxattr */ -- .long sys_ni_syscall /* 231 - reserved for llistxattr */ -- .long sys_ni_syscall /* 232 - reserved for flistxattr */ -- .long sys_ni_syscall /* 233 - reserved for removexattr */ -- .long sys_ni_syscall /* 234 - reserved for lremovexattr */ -- .long sys_ni_syscall /* 235 - reserved for fremovexattr */ -+ .long sys_setxattr -+ .long sys_lsetxattr /* 225 */ -+ .long sys_fsetxattr -+ .long sys_getxattr -+ .long sys_lgetxattr -+ .long sys_fgetxattr -+ .long sys_listxattr /* 230 */ -+ .long sys_llistxattr -+ .long sys_flistxattr -+ .long sys_removexattr -+ .long sys_lremovexattr -+ .long sys_fremovexattr /* 235 */ - .long sys_gettid - .long sys_tkill - .rept 255-237 ---- linux-2.4.20/arch/s390x/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/s390x/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set ---- linux-2.4.20/arch/s390x/kernel/entry.S~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/s390x/kernel/entry.S 2003-05-07 18:08:03.000000000 +0800 -@@ -591,18 +591,18 @@ sys_call_table: - .long SYSCALL(sys_ni_syscall,sys32_fcntl64_wrapper) - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 224 - reserved for setxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 225 - reserved for lsetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 226 - reserved for fsetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 227 - reserved for getxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 228 - reserved for lgetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 229 - reserved for fgetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 230 - reserved for listxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 231 - reserved for llistxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 232 - reserved for flistxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 233 - reserved for removexattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 234 - reserved for lremovexattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 235 - reserved for fremovexattr */ -+ .long SYSCALL(sys_setxattr,sys32_setxattr_wrapper) -+ .long SYSCALL(sys_lsetxattr,sys32_lsetxattr_wrapper) /* 225 */ -+ .long SYSCALL(sys_fsetxattr,sys32_fsetxattr_wrapper) -+ .long SYSCALL(sys_getxattr,sys32_getxattr_wrapper) -+ .long SYSCALL(sys_lgetxattr,sys32_lgetxattr_wrapper) -+ .long SYSCALL(sys_fgetxattr,sys32_fgetxattr_wrapper) -+ .long SYSCALL(sys_listxattr,sys32_listxattr_wrapper) /* 230 */ -+ .long SYSCALL(sys_llistxattr,sys32_llistxattr_wrapper) -+ .long SYSCALL(sys_flistxattr,sys32_flistxattr_wrapper) -+ .long SYSCALL(sys_removexattr,sys32_removexattr_wrapper) -+ .long SYSCALL(sys_lremovexattr,sys32_lremovexattr_wrapper) -+ .long SYSCALL(sys_fremovexattr,sys32_fremovexattr_wrapper)/* 235 */ - .long SYSCALL(sys_gettid,sys_gettid) - .long SYSCALL(sys_tkill,sys_tkill) - .rept 255-237 ---- linux-2.4.20/arch/s390x/kernel/wrapper32.S~linux-2.4.20-xattr-0.8.54 2002-02-26 03:37:56.000000000 +0800 -+++ linux-2.4.20-root/arch/s390x/kernel/wrapper32.S 2003-05-07 18:08:03.000000000 +0800 -@@ -1091,3 +1091,95 @@ sys32_fstat64_wrapper: - llgtr %r3,%r3 # struct stat64 * - llgfr %r4,%r4 # long - jg sys32_fstat64 # branch to system call -+ -+ .globl sys32_setxattr_wrapper -+sys32_setxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_setxattr -+ -+ .globl sys32_lsetxattr_wrapper -+sys32_lsetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_lsetxattr -+ -+ .globl sys32_fsetxattr_wrapper -+sys32_fsetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_fsetxattr -+ -+ .globl sys32_getxattr_wrapper -+sys32_getxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_getxattr -+ -+ .globl sys32_lgetxattr_wrapper -+sys32_lgetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_lgetxattr -+ -+ .globl sys32_fgetxattr_wrapper -+sys32_fgetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_fgetxattr -+ -+ .globl sys32_listxattr_wrapper -+sys32_listxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_listxattr -+ -+ .globl sys32_llistxattr_wrapper -+sys32_llistxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_llistxattr -+ -+ .globl sys32_flistxattr_wrapper -+sys32_flistxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_flistxattr -+ -+ .globl sys32_removexattr_wrapper -+sys32_removexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_removexattr -+ -+ .globl sys32_lremovexattr_wrapper -+sys32_lremovexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_lremovexattr -+ -+ .globl sys32_fremovexattr_wrapper -+sys32_fremovexattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ jg sys_fremovexattr -+ -+ ---- linux-2.4.20/arch/sparc/defconfig~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:43.000000000 +0800 -+++ linux-2.4.20-root/arch/sparc/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_UID16=y - CONFIG_HIGHMEM=y - ---- linux-2.4.20/arch/sparc/kernel/systbls.S~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:43.000000000 +0800 -+++ linux-2.4.20-root/arch/sparc/kernel/systbls.S 2003-05-07 18:08:03.000000000 +0800 -@@ -51,11 +51,11 @@ sys_call_table: - /*150*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - /*155*/ .long sys_fcntl64, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount - /*160*/ .long sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_nis_syscall --/*165*/ .long sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall --/*170*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents --/*175*/ .long sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .long sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_sigpending, sys_query_module --/*185*/ .long sys_setpgid, sys_nis_syscall, sys_tkill, sys_nis_syscall, sys_newuname -+/*165*/ .long sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_setxattr -+/*170*/ .long sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents -+/*175*/ .long sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .long sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_sigpending, sys_query_module -+/*185*/ .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sys_newuname - /*190*/ .long sys_init_module, sys_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - /*195*/ .long sys_nis_syscall, sys_nis_syscall, sys_getppid, sparc_sigaction, sys_sgetmask - /*200*/ .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, old_readdir ---- linux-2.4.20/arch/sparc64/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:12.000000000 +0800 -+++ linux-2.4.20-root/arch/sparc64/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options ---- linux-2.4.20/arch/sparc64/kernel/systbls.S~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:43.000000000 +0800 -+++ linux-2.4.20-root/arch/sparc64/kernel/systbls.S 2003-05-07 18:08:03.000000000 +0800 -@@ -52,11 +52,11 @@ sys_call_table32: - /*150*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - .word sys32_fcntl64, sys_nis_syscall, sys32_statfs, sys32_fstatfs, sys_oldumount - /*160*/ .word sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_nis_syscall -- .word sys32_quotactl, sys_nis_syscall, sys32_mount, sys_ustat, sys_nis_syscall --/*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_getdents -- .word sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys32_sigpending, sys32_query_module -- .word sys_setpgid, sys_nis_syscall, sys_tkill, sys_nis_syscall, sparc64_newuname -+ .word sys32_quotactl, sys_nis_syscall, sys32_mount, sys_ustat, sys_setxattr -+/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys32_getdents -+ .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys32_sigpending, sys32_query_module -+ .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sparc64_newuname - /*190*/ .word sys32_init_module, sparc64_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - .word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys32_sigaction, sys_sgetmask - /*200*/ .word sys_ssetmask, sys_sigsuspend, sys32_newlstat, sys_uselib, old32_readdir -@@ -111,11 +111,11 @@ sys_call_table: - /*150*/ .word sys_getsockname, sys_nis_syscall, sys_nis_syscall, sys_poll, sys_getdents64 - .word sys_nis_syscall, sys_nis_syscall, sys_statfs, sys_fstatfs, sys_oldumount - /*160*/ .word sys_nis_syscall, sys_nis_syscall, sys_getdomainname, sys_setdomainname, sys_utrap_install -- .word sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_nis_syscall --/*170*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_getdents -- .word sys_setsid, sys_fchdir, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall --/*180*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_query_module -- .word sys_setpgid, sys_nis_syscall, sys_tkill, sys_nis_syscall, sparc64_newuname -+ .word sys_quotactl, sys_nis_syscall, sys_mount, sys_ustat, sys_setxattr -+/*170*/ .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents -+ .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr -+/*180*/ .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_query_module -+ .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_nis_syscall, sparc64_newuname - /*190*/ .word sys_init_module, sparc64_personality, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall - .word sys_nis_syscall, sys_nis_syscall, sys_getppid, sys_nis_syscall, sys_sgetmask - /*200*/ .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall ---- linux-2.4.20/fs/Config.in~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/Config.in 2003-05-07 18:08:03.000000000 +0800 -@@ -25,6 +25,11 @@ dep_mbool ' Debug Befs' CONFIG_BEFS_DEB - dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL - - tristate 'Ext3 journalling file system support' CONFIG_EXT3_FS -+dep_mbool ' Ext3 extended attributes' CONFIG_EXT3_FS_XATTR $CONFIG_EXT3_FS -+dep_bool ' Ext3 extended attribute block sharing' \ -+ CONFIG_EXT3_FS_XATTR_SHARING $CONFIG_EXT3_FS_XATTR -+dep_bool ' Ext3 extended user attributes' \ -+ CONFIG_EXT3_FS_XATTR_USER $CONFIG_EXT3_FS_XATTR - # CONFIG_JBD could be its own option (even modular), but until there are - # other users than ext3, we will simply make it be the same as CONFIG_EXT3_FS - # dep_tristate ' Journal Block Device support (JBD for ext3)' CONFIG_JBD $CONFIG_EXT3_FS -@@ -84,6 +89,11 @@ dep_mbool ' QNX4FS write support (DANGE - tristate 'ROM file system support' CONFIG_ROMFS_FS - - tristate 'Second extended fs support' CONFIG_EXT2_FS -+dep_mbool ' Ext2 extended attributes' CONFIG_EXT2_FS_XATTR $CONFIG_EXT2_FS -+dep_bool ' Ext2 extended attribute block sharing' \ -+ CONFIG_EXT2_FS_XATTR_SHARING $CONFIG_EXT2_FS_XATTR -+dep_bool ' Ext2 extended user attributes' \ -+ CONFIG_EXT2_FS_XATTR_USER $CONFIG_EXT2_FS_XATTR - - tristate 'System V/Xenix/V7/Coherent file system support' CONFIG_SYSV_FS - -@@ -155,6 +165,10 @@ else - define_tristate CONFIG_ZISOFS_FS n - fi - -+# Meta block cache for Extended Attributes (ext2/ext3) -+#tristate 'Meta block cache' CONFIG_FS_MBCACHE -+define_tristate CONFIG_FS_MBCACHE y -+ - mainmenu_option next_comment - comment 'Partition Types' - source fs/partitions/Config.in ---- linux-2.4.20/fs/Makefile~linux-2.4.20-xattr-0.8.54 2003-05-05 19:00:58.000000000 +0800 -+++ linux-2.4.20-root/fs/Makefile 2003-05-07 18:08:03.000000000 +0800 -@@ -79,6 +79,9 @@ obj-y += binfmt_script.o - - obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o - -+export-objs += mbcache.o -+obj-$(CONFIG_FS_MBCACHE) += mbcache.o -+ - # persistent filesystems - obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) - ---- linux-2.4.20/fs/ext2/Makefile~linux-2.4.20-xattr-0.8.54 2001-10-11 23:05:18.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/Makefile 2003-05-07 18:08:03.000000000 +0800 -@@ -13,4 +13,8 @@ obj-y := balloc.o bitmap.o dir.o file - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make ---- linux-2.4.20/fs/ext2/file.c~linux-2.4.20-xattr-0.8.54 2001-10-11 23:05:18.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/file.c 2003-05-07 18:08:03.000000000 +0800 -@@ -20,6 +20,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/sched.h> - - /* -@@ -51,4 +52,8 @@ struct file_operations ext2_file_operati - - struct inode_operations ext2_file_inode_operations = { - truncate: ext2_truncate, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- linux-2.4.20/fs/ext2/ialloc.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/ialloc.c 2003-05-07 18:08:03.000000000 +0800 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/locks.h> - #include <linux/quotaops.h> - -@@ -167,6 +168,7 @@ void ext2_free_inode (struct inode * ino - */ - if (!is_bad_inode(inode)) { - /* Quota is already initialized in iput() */ -+ ext2_xattr_delete_inode(inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - } ---- linux-2.4.20/fs/ext2/inode.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/inode.c 2003-05-07 18:08:03.000000000 +0800 -@@ -39,6 +39,18 @@ MODULE_LICENSE("GPL"); - static int ext2_update_inode(struct inode * inode, int do_sync); - - /* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext2_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext2_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ -+/* - * Called at each iput() - */ - void ext2_put_inode (struct inode * inode) -@@ -53,9 +65,7 @@ void ext2_delete_inode (struct inode * i - { - lock_kernel(); - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - inode->u.ext2_i.i_dtime = CURRENT_TIME; - mark_inode_dirty(inode); -@@ -801,6 +811,8 @@ void ext2_truncate (struct inode * inode - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext2_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -888,8 +900,7 @@ void ext2_read_inode (struct inode * ino - unsigned long offset; - struct ext2_group_desc * gdp; - -- if ((inode->i_ino != EXT2_ROOT_INO && inode->i_ino != EXT2_ACL_IDX_INO && -- inode->i_ino != EXT2_ACL_DATA_INO && -+ if ((inode->i_ino != EXT2_ROOT_INO && - inode->i_ino < EXT2_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu(inode->i_sb->u.ext2_sb.s_es->s_inodes_count)) { - ext2_error (inode->i_sb, "ext2_read_inode", -@@ -974,10 +985,7 @@ void ext2_read_inode (struct inode * ino - for (block = 0; block < EXT2_N_BLOCKS; block++) - inode->u.ext2_i.i_data[block] = raw_inode->i_block[block]; - -- if (inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext2_file_inode_operations; - inode->i_fop = &ext2_file_operations; - inode->i_mapping->a_ops = &ext2_aops; -@@ -986,15 +994,17 @@ void ext2_read_inode (struct inode * ino - inode->i_fop = &ext2_dir_operations; - inode->i_mapping->a_ops = &ext2_aops; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext2_inode_is_fast_symlink(inode)) - inode->i_op = &ext2_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - } -- } else -+ } else { -+ inode->i_op = &ext2_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(raw_inode->i_block[0])); -+ } - brelse (bh); - inode->i_attr_flags = 0; - if (inode->u.ext2_i.i_flags & EXT2_SYNC_FL) { ---- linux-2.4.20/fs/ext2/namei.c~linux-2.4.20-xattr-0.8.54 2001-10-04 13:57:36.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/namei.c 2003-05-07 18:08:03.000000000 +0800 -@@ -31,6 +31,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/pagemap.h> - - /* -@@ -136,7 +137,7 @@ static int ext2_symlink (struct inode * - - if (l > sizeof (inode->u.ext2_i.i_data)) { - /* slow symlink */ -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - err = block_symlink(inode, symname, l); - if (err) -@@ -345,4 +346,15 @@ struct inode_operations ext2_dir_inode_o - rmdir: ext2_rmdir, - mknod: ext2_mknod, - rename: ext2_rename, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ -+struct inode_operations ext2_special_inode_operations = { -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- linux-2.4.20/fs/ext2/super.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/super.c 2003-05-07 18:08:03.000000000 +0800 -@@ -21,6 +21,7 @@ - #include <linux/string.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -125,6 +126,7 @@ void ext2_put_super (struct super_block - int db_count; - int i; - -+ ext2_xattr_put_super(sb); - if (!(sb->s_flags & MS_RDONLY)) { - struct ext2_super_block *es = EXT2_SB(sb)->s_es; - -@@ -175,6 +177,13 @@ static int parse_options (char * options - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -424,6 +433,9 @@ struct super_block * ext2_read_super (st - blocksize = BLOCK_SIZE; - - sb->u.ext2_sb.s_mount_opt = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ /* set_opt (sb->u.ext2_sb.s_mount_opt, XATTR_USER); */ -+#endif - if (!parse_options ((char *) data, &sb_block, &resuid, &resgid, - &sb->u.ext2_sb.s_mount_opt)) { - return NULL; -@@ -813,12 +825,27 @@ static DECLARE_FSTYPE_DEV(ext2_fs_type, - - static int __init init_ext2_fs(void) - { -- return register_filesystem(&ext2_fs_type); -+ int error = init_ext2_xattr(); -+ if (error) -+ return error; -+ error = init_ext2_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext2_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext2_xattr_user(); -+fail: -+ exit_ext2_xattr(); -+ return error; - } - - static void __exit exit_ext2_fs(void) - { - unregister_filesystem(&ext2_fs_type); -+ exit_ext2_xattr_user(); -+ exit_ext2_xattr(); - } - - EXPORT_NO_SYMBOLS; ---- linux-2.4.20/fs/ext2/symlink.c~linux-2.4.20-xattr-0.8.54 2000-09-28 04:41:33.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/symlink.c 2003-05-07 18:08:03.000000000 +0800 -@@ -19,6 +19,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - - static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -32,7 +33,20 @@ static int ext2_follow_link(struct dentr - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext2_symlink_inode_operations = { -+ readlink: page_readlink, -+ follow_link: page_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ - struct inode_operations ext2_fast_symlink_inode_operations = { - readlink: ext2_readlink, - follow_link: ext2_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/xattr.c 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,1212 @@ -+/* -+ * linux/fs/ext2/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT2_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT2_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext2_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+/* These symbols may be needed by a module. */ -+EXPORT_SYMBOL(ext2_xattr_register); -+EXPORT_SYMBOL(ext2_xattr_unregister); -+EXPORT_SYMBOL(ext2_xattr_get); -+EXPORT_SYMBOL(ext2_xattr_list); -+EXPORT_SYMBOL(ext2_xattr_set); -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext2_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext2_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT2_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext2_xattr_set2(struct inode *, struct buffer_head *, -+ struct ext2_xattr_header *); -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+static int ext2_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext2_xattr_cache_find(struct inode *, -+ struct ext2_xattr_header *); -+static void ext2_xattr_cache_remove(struct buffer_head *); -+static void ext2_xattr_rehash(struct ext2_xattr_header *, -+ struct ext2_xattr_entry *); -+ -+static struct mb_cache *ext2_xattr_cache; -+ -+#else -+# define ext2_xattr_cache_insert(bh) 0 -+# define ext2_xattr_cache_find(inode, header) NULL -+# define ext2_xattr_cache_remove(bh) while(0) {} -+# define ext2_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext2_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext2_xattr_sem); -+ -+static inline int -+ext2_xattr_new_block(struct inode *inode, int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block) + -+ EXT2_I(inode)->i_block_group * EXT2_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext2_new_block(inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext2_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext2_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext2_xattr_free_block(struct inode * inode, unsigned long block) -+{ -+ ext2_free_blocks(inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext2_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext2_xattr_free_block(inode, block) \ -+ ext2_free_blocks(inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext2_xattr_handler *ext2_xattr_handlers[EXT2_XATTR_INDEX_MAX]; -+rwlock_t ext2_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext2_xattr_register(int name_index, struct ext2_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ if (!ext2_xattr_handlers[name_index-1]) { -+ ext2_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext2_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext2_xattr_unregister(int name_index, struct ext2_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ ext2_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext2_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static struct ext2_xattr_handler * -+ext2_xattr_resolve_name(const char **name) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext2_handler_lock); -+ for (i=0; i<EXT2_XATTR_INDEX_MAX; i++) { -+ if (ext2_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext2_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext2_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext2_handler_lock); -+ return handler; -+} -+ -+static inline struct ext2_xattr_handler * -+ext2_xattr_handler(int name_index) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ read_lock(&ext2_handler_lock); -+ handler = ext2_xattr_handlers[name_index-1]; -+ read_unlock(&ext2_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext2_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext2_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT2_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT2_I(inode)->i_file_acl) -+ return 0; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT2_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext2_xattr_update_super_block(struct super_block *sb) -+{ -+ if (EXT2_HAS_COMPAT_FEATURE(sb, EXT2_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT2_SB(sb)->s_feature_compat |= EXT2_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT2_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT2_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ mark_buffer_dirty(EXT2_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext2_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_header *header = NULL; -+ struct ext2_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT2_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext2_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(sb, "ext2_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext2_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT2_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT2_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT2_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext2_xattr_cache_remove(bh); -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT2_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT2_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT2_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT2_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext2_xattr_set2(inode, bh, NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT2_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT2_XATTR_PAD, 0, -+ EXT2_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext2_xattr_rehash(header, here); -+ -+ error = ext2_xattr_set2(inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext2_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext2_xattr_set(): Update the file system. -+ */ -+static int -+ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, -+ struct ext2_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext2_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext2_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext2_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT2_I(inode)->i_file_acl != 0; -+ int block = ext2_xattr_new_block(inode, &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+ ext2_xattr_free_block(inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext2_xattr_cache_insert(new_bh); -+ -+ ext2_xattr_update_super_block(sb); -+ } -+ mark_buffer_dirty(new_bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &new_bh); -+ wait_on_buffer(new_bh); -+ error = -EIO; -+ if (buffer_req(new_bh) && !buffer_uptodate(new_bh)) -+ goto cleanup; -+ } -+ } -+ -+ /* Update the inode. */ -+ EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ if (IS_SYNC(inode)) { -+ error = ext2_sync_inode (inode); -+ if (error) -+ goto cleanup; -+ } else -+ mark_inode_dirty(inode); -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext2_xattr_free_block(inode, old_bh->b_blocknr); -+ mark_buffer_clean(old_bh); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext2_xattr_quota_free(inode); -+ mark_buffer_dirty(old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT2_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext2_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext2_xattr_cache_remove(bh); -+ ext2_xattr_free_block(inode, block); -+ bforget(bh); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ mark_buffer_dirty(bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &bh); -+ wait_on_buffer(bh); -+ } -+ ext2_xattr_quota_free(inode); -+ } -+ EXT2_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext2_xattr_sem); -+} -+ -+/* -+ * ext2_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ mb_cache_shrink(ext2_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+/* -+ * ext2_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext2_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext2_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext2_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext2_xattr_cmp(struct ext2_xattr_header *header1, -+ struct ext2_xattr_header *header2) -+{ -+ struct ext2_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT2_XATTR_NEXT(entry1); -+ entry2 = EXT2_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext2_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext2_xattr_cache_find(struct inode *inode, struct ext2_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext2_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT2_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT2_XATTR_REFCOUNT_MAX); -+ } else if (!ext2_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext2_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext2_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext2_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext2_xattr_hash_entry(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT2_XATTR_ROUND) >> EXT2_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext2_xattr_rehash(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ struct ext2_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext2_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT2_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext2_xattr(void) -+{ -+ ext2_xattr_cache = mb_cache_create("ext2_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext2_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+ mb_cache_destroy(ext2_xattr_cache); -+} -+ -+#else /* CONFIG_EXT2_FS_XATTR_SHARING */ -+ -+int __init -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT2_FS_XATTR_SHARING */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/xattr_user.c 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,103 @@ -+/* -+ * linux/fs/ext2/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+ -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+# include <linux/ext2_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext2_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext2_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_get(inode, EXT2_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext2_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_set(inode, EXT2_XATTR_INDEX_USER, name, -+ value, size, flags); -+} -+ -+struct ext2_xattr_handler ext2_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext2_xattr_user_list, -+ get: ext2_xattr_user_get, -+ set: ext2_xattr_user_set, -+}; -+ -+int __init -+init_ext2_xattr_user(void) -+{ -+ return ext2_xattr_register(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -+ -+void -+exit_ext2_xattr_user(void) -+{ -+ ext2_xattr_unregister(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} ---- linux-2.4.20/fs/ext3/Makefile~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:02.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/Makefile 2003-05-07 18:10:33.000000000 +0800 -@@ -1,5 +1,5 @@ - # --# Makefile for the linux ext2-filesystem routines. -+# Makefile for the linux ext3-filesystem routines. - # - # Note! Dependencies are done automagically by 'make dep', which also - # removes any old dependencies. DON'T put your own dependencies here -@@ -9,10 +9,14 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make ---- linux-2.4.20/fs/ext3/file.c~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:02.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/file.c 2003-05-07 18:08:03.000000000 +0800 -@@ -23,6 +23,7 @@ - #include <linux/locks.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - #include <linux/ext3_jbd.h> - #include <linux/smp_lock.h> - -@@ -126,5 +127,9 @@ struct file_operations ext3_file_operati - struct inode_operations ext3_file_inode_operations = { - truncate: ext3_truncate, /* BKL held */ - setattr: ext3_setattr, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; - ---- linux-2.4.20/fs/ext3/ialloc.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/ialloc.c 2003-05-07 18:08:03.000000000 +0800 -@@ -17,6 +17,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/stat.h> - #include <linux/string.h> - #include <linux/locks.h> -@@ -216,6 +217,7 @@ void ext3_free_inode (handle_t *handle, - * as writing the quota to disk may need the lock as well. - */ - DQUOT_INIT(inode); -+ ext3_xattr_delete_inode(handle, inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - ---- linux-2.4.20/fs/ext3/inode.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/inode.c 2003-05-07 18:08:03.000000000 +0800 -@@ -39,6 +39,18 @@ - */ - #undef SEARCH_FROM_ZERO - -+/* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext3_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext3_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ - /* The ext3 forget function must perform a revoke if we are freeing data - * which has been journaled. Metadata (eg. indirect blocks) must be - * revoked in all cases. -@@ -48,7 +60,7 @@ - * still needs to be revoked. - */ - --static int ext3_forget(handle_t *handle, int is_metadata, -+int ext3_forget(handle_t *handle, int is_metadata, - struct inode *inode, struct buffer_head *bh, - int blocknr) - { -@@ -164,9 +176,7 @@ void ext3_delete_inode (struct inode * i - { - handle_t *handle; - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - - lock_kernel(); -@@ -1855,6 +1865,8 @@ void ext3_truncate(struct inode * inode) - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext3_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -2002,8 +2014,6 @@ int ext3_get_inode_loc (struct inode *in - struct ext3_group_desc * gdp; - - if ((inode->i_ino != EXT3_ROOT_INO && -- inode->i_ino != EXT3_ACL_IDX_INO && -- inode->i_ino != EXT3_ACL_DATA_INO && - inode->i_ino != EXT3_JOURNAL_INO && - inode->i_ino < EXT3_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu( -@@ -2130,10 +2140,7 @@ void ext3_read_inode(struct inode * inod - - brelse (iloc.bh); - -- if (inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; - inode->i_mapping->a_ops = &ext3_aops; -@@ -2141,15 +2148,17 @@ void ext3_read_inode(struct inode * inod - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - } -- } else -+ } else { -+ inode->i_op = &ext3_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(iloc.raw_inode->i_block[0])); -+ } - /* inode->i_attr_flags = 0; unused */ - if (inode->u.ext3_i.i_flags & EXT3_SYNC_FL) { - /* inode->i_attr_flags |= ATTR_FLAG_SYNCRONOUS; unused */ ---- linux-2.4.20/fs/ext3/namei.c~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:05.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/namei.c 2003-05-07 18:08:03.000000000 +0800 -@@ -29,6 +29,7 @@ - #include <linux/sched.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/fcntl.h> - #include <linux/stat.h> - #include <linux/string.h> -@@ -1611,7 +1612,7 @@ static int ext3_mkdir(struct inode * dir - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR); -+ inode = ext3_new_inode (handle, dir, S_IFDIR | mode); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -1619,7 +1620,6 @@ static int ext3_mkdir(struct inode * dir - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; -- inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ -@@ -1646,9 +1646,6 @@ static int ext3_mkdir(struct inode * dir - BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata"); - ext3_journal_dirty_metadata(handle, dir_block); - brelse (dir_block); -- inode->i_mode = S_IFDIR | mode; -- if (dir->i_mode & S_ISGID) -- inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); - if (err) { -@@ -2017,7 +2014,7 @@ static int ext3_symlink (struct inode * - goto out_stop; - - if (l > sizeof (EXT3_I(inode)->i_data)) { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* - * block_symlink() calls back into ext3_prepare/commit_write. -@@ -2244,4 +2241,16 @@ struct inode_operations ext3_dir_inode_o - rmdir: ext3_rmdir, /* BKL held */ - mknod: ext3_mknod, /* BKL held */ - rename: ext3_rename, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; -+ -+struct inode_operations ext3_special_inode_operations = { -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ ---- linux-2.4.20/fs/ext3/super.c~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:02.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/super.c 2003-05-07 18:08:39.000000000 +0800 -@@ -24,6 +24,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -404,6 +405,7 @@ void ext3_put_super (struct super_block - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { - EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -@@ -499,6 +501,7 @@ static int parse_options (char * options - int is_remount) - { - unsigned long *mount_options = &sbi->s_mount_opt; -+ - uid_t *resuid = &sbi->s_resuid; - gid_t *resgid = &sbi->s_resgid; - char * this_char; -@@ -511,6 +514,13 @@ static int parse_options (char * options - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -928,6 +938,12 @@ struct super_block * ext3_read_super (st - sbi->s_mount_opt = 0; - sbi->s_resuid = EXT3_DEF_RESUID; - sbi->s_resgid = EXT3_DEF_RESGID; -+ -+ /* Default extended attribute flags */ -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ /* set_opt(sbi->s_mount_opt, XATTR_USER); */ -+#endif -+ - if (!parse_options ((char *) data, &sb_block, sbi, &journal_inum, 0)) { - sb->s_dev = 0; - goto out_fail; -@@ -1767,17 +1783,29 @@ static DECLARE_FSTYPE_DEV(ext3_fs_type, - - static int __init init_ext3_fs(void) - { -- return register_filesystem(&ext3_fs_type); -+ int error = init_ext3_xattr(); -+ if (error) -+ return error; -+ error = init_ext3_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext3_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext3_xattr_user(); -+fail: -+ exit_ext3_xattr(); -+ return error; - } - - static void __exit exit_ext3_fs(void) - { - unregister_filesystem(&ext3_fs_type); -+ exit_ext3_xattr_user(); -+ exit_ext3_xattr(); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); -- - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - MODULE_LICENSE("GPL"); ---- linux-2.4.20/fs/ext3/symlink.c~linux-2.4.20-xattr-0.8.54 2001-11-10 06:25:04.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/symlink.c 2003-05-07 18:08:03.000000000 +0800 -@@ -20,6 +20,7 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - - static int ext3_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -33,7 +34,20 @@ static int ext3_follow_link(struct dentr - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext3_symlink_inode_operations = { -+ readlink: page_readlink, /* BKL not held. Don't need */ -+ follow_link: page_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ - struct inode_operations ext3_fast_symlink_inode_operations = { - readlink: ext3_readlink, /* BKL not held. Don't need */ - follow_link: ext3_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/xattr.c 2003-05-07 18:09:23.000000000 +0800 -@@ -0,0 +1,1225 @@ -+/* -+ * linux/fs/ext3/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Ext3 code with a lot of help from Eric Jarman <ejarman@acm.org>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT3_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT3_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext3_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+#define EXT3_EA_USER "user." -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext3_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext3_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT3_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, -+ struct ext3_xattr_header *); -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+static int ext3_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext3_xattr_cache_find(struct inode *, -+ struct ext3_xattr_header *); -+static void ext3_xattr_cache_remove(struct buffer_head *); -+static void ext3_xattr_rehash(struct ext3_xattr_header *, -+ struct ext3_xattr_entry *); -+ -+static struct mb_cache *ext3_xattr_cache; -+ -+#else -+# define ext3_xattr_cache_insert(bh) 0 -+# define ext3_xattr_cache_find(inode, header) NULL -+# define ext3_xattr_cache_remove(bh) while(0) {} -+# define ext3_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext3_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext3_xattr_sem); -+ -+static inline int -+ext3_xattr_new_block(handle_t *handle, struct inode *inode, -+ int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + -+ EXT3_I(inode)->i_block_group * EXT3_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext3_new_block(handle, inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext3_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext3_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext3_xattr_free_block(handle_t *handle, struct inode * inode, -+ unsigned long block) -+{ -+ ext3_free_blocks(handle, inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext3_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext3_xattr_free_block(handle, inode, block) \ -+ ext3_free_blocks(handle, inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext3_xattr_handler *ext3_xattr_handlers[EXT3_XATTR_INDEX_MAX]; -+rwlock_t ext3_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext3_xattr_register(int name_index, struct ext3_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ if (!ext3_xattr_handlers[name_index-1]) { -+ ext3_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext3_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext3_xattr_unregister(int name_index, struct ext3_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ ext3_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext3_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static inline struct ext3_xattr_handler * -+ext3_xattr_resolve_name(const char **name) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext3_handler_lock); -+ for (i=0; i<EXT3_XATTR_INDEX_MAX; i++) { -+ if (ext3_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext3_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext3_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext3_handler_lock); -+ return handler; -+} -+ -+static inline struct ext3_xattr_handler * -+ext3_xattr_handler(int name_index) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ read_lock(&ext3_handler_lock); -+ handler = ext3_xattr_handlers[name_index-1]; -+ read_unlock(&ext3_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext3_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext3_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT3_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT3_I(inode)->i_file_acl) -+ return 0; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext3_xattr_update_super_block(handle_t *handle, -+ struct super_block *sb) -+{ -+ if (EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT3_SB(sb)->s_feature_compat |= EXT3_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT3_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT3_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext3_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_header *header = NULL; -+ struct ext3_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT3_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext3_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(sb, "ext3_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT3_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT3_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT3_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext3_xattr_cache_remove(bh); -+ error = ext3_journal_get_write_access(handle, bh); -+ if (error) -+ goto cleanup; -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT3_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT3_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT3_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT3_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext3_xattr_set2(handle, inode, bh,NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT3_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT3_XATTR_PAD, 0, -+ EXT3_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext3_xattr_rehash(header, here); -+ -+ error = ext3_xattr_set2(handle, inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext3_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext3_xattr_set(): Update the file system. -+ */ -+static int -+ext3_xattr_set2(handle_t *handle, struct inode *inode, -+ struct buffer_head *old_bh, struct ext3_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext3_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext3_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ error = ext3_journal_get_write_access(handle, new_bh); -+ if (error) -+ goto cleanup; -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext3_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT3_I(inode)->i_file_acl != 0; -+ int block = ext3_xattr_new_block(handle, inode, -+ &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+getblk_failed: ext3_xattr_free_block(handle, inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ error = ext3_journal_get_create_access(handle, new_bh); -+ if (error) { -+ unlock_buffer(new_bh); -+ goto getblk_failed; -+ } -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext3_xattr_cache_insert(new_bh); -+ -+ ext3_xattr_update_super_block(handle, sb); -+ } -+ error = ext3_journal_dirty_metadata(handle, new_bh); -+ if (error) -+ goto cleanup; -+ } -+ -+ /* Update the inode. */ -+ EXT3_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, inode); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ error = ext3_journal_get_write_access(handle, old_bh); -+ if (error) -+ goto cleanup; -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext3_xattr_free_block(handle, inode, old_bh->b_blocknr); -+ -+ /* ext3_forget() calls bforget() for us, but we -+ let our caller release old_bh, so we need to -+ duplicate the handle before. */ -+ get_bh(old_bh); -+ ext3_forget(handle, 1, inode, old_bh,old_bh->b_blocknr); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext3_xattr_quota_free(inode); -+ ext3_journal_dirty_metadata(handle, old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT3_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext3_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ext3_journal_get_write_access(handle, bh); -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext3_xattr_cache_remove(bh); -+ ext3_xattr_free_block(handle, inode, block); -+ ext3_forget(handle, 1, inode, bh, block); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ ext3_journal_dirty_metadata(handle, bh); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ ext3_xattr_quota_free(inode); -+ } -+ EXT3_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext3_xattr_sem); -+} -+ -+/* -+ * ext3_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ mb_cache_shrink(ext3_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+/* -+ * ext3_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext3_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext3_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext3_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext3_xattr_cmp(struct ext3_xattr_header *header1, -+ struct ext3_xattr_header *header2) -+{ -+ struct ext3_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT3_XATTR_NEXT(entry1); -+ entry2 = EXT3_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext3_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext3_xattr_cache_find(struct inode *inode, struct ext3_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext3_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT3_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT3_XATTR_REFCOUNT_MAX); -+ } else if (!ext3_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext3_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext3_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext3_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext3_xattr_hash_entry(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT3_XATTR_ROUND) >> EXT3_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext3_xattr_rehash(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ struct ext3_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext3_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT3_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext3_xattr(void) -+{ -+ ext3_xattr_cache = mb_cache_create("ext3_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext3_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+ if (ext3_xattr_cache) -+ mb_cache_destroy(ext3_xattr_cache); -+ ext3_xattr_cache = NULL; -+} -+ -+#else /* CONFIG_EXT3_FS_XATTR_SHARING */ -+ -+int __init -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_SHARING */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/xattr_user.c 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,111 @@ -+/* -+ * linux/fs/ext3/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+# include <linux/ext3_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext3_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext3_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext3_xattr_get(inode, EXT3_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext3_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ handle_t *handle; -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ error = ext3_xattr_set(handle, inode, EXT3_XATTR_INDEX_USER, name, -+ value, size, flags); -+ ext3_journal_stop(handle, inode); -+ -+ return error; -+} -+ -+struct ext3_xattr_handler ext3_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext3_xattr_user_list, -+ get: ext3_xattr_user_get, -+ set: ext3_xattr_user_set, -+}; -+ -+int __init -+init_ext3_xattr_user(void) -+{ -+ return ext3_xattr_register(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} -+ -+void -+exit_ext3_xattr_user(void) -+{ -+ ext3_xattr_unregister(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} ---- linux-2.4.20/fs/jfs/jfs_xattr.h~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/jfs/jfs_xattr.h 2003-05-07 18:08:03.000000000 +0800 -@@ -52,8 +52,10 @@ struct jfs_ea_list { - #define END_EALIST(ealist) \ - ((struct jfs_ea *) (((char *) (ealist)) + EALIST_SIZE(ealist))) - --extern int __jfs_setxattr(struct inode *, const char *, void *, size_t, int); --extern int jfs_setxattr(struct dentry *, const char *, void *, size_t, int); -+extern int __jfs_setxattr(struct inode *, const char *, const void *, size_t, -+ int); -+extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, -+ int); - extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t); - extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t); - extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); ---- linux-2.4.20/fs/jfs/xattr.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/jfs/xattr.c 2003-05-07 18:08:03.000000000 +0800 -@@ -641,7 +641,7 @@ static int ea_put(struct inode *inode, s - } - - static int can_set_xattr(struct inode *inode, const char *name, -- void *value, size_t value_len) -+ const void *value, size_t value_len) - { - if (IS_RDONLY(inode)) - return -EROFS; -@@ -660,7 +660,7 @@ static int can_set_xattr(struct inode *i - return permission(inode, MAY_WRITE); - } - --int __jfs_setxattr(struct inode *inode, const char *name, void *value, -+int __jfs_setxattr(struct inode *inode, const char *name, const void *value, - size_t value_len, int flags) - { - struct jfs_ea_list *ealist; -@@ -799,7 +799,7 @@ int __jfs_setxattr(struct inode *inode, - return rc; - } - --int jfs_setxattr(struct dentry *dentry, const char *name, void *value, -+int jfs_setxattr(struct dentry *dentry, const char *name, const void *value, - size_t value_len, int flags) - { - if (value == NULL) { /* empty EA, do not remove */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/mbcache.c 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,648 @@ -+/* -+ * linux/fs/mbcache.c -+ * (C) 2001-2002 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+/* -+ * Filesystem Meta Information Block Cache (mbcache) -+ * -+ * The mbcache caches blocks of block devices that need to be located -+ * by their device/block number, as well as by other criteria (such -+ * as the block's contents). -+ * -+ * There can only be one cache entry in a cache per device and block number. -+ * Additional indexes need not be unique in this sense. The number of -+ * additional indexes (=other criteria) can be hardwired at compile time -+ * or specified at cache create time. -+ * -+ * Each cache entry is of fixed size. An entry may be `valid' or `invalid' -+ * in the cache. A valid entry is in the main hash tables of the cache, -+ * and may also be in the lru list. An invalid entry is not in any hashes -+ * or lists. -+ * -+ * A valid cache entry is only in the lru list if no handles refer to it. -+ * Invalid cache entries will be freed when the last handle to the cache -+ * entry is released. Entries that cannot be freed immediately are put -+ * back on the lru list. -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+ -+#include <linux/fs.h> -+#include <linux/slab.h> -+#include <linux/sched.h> -+#include <linux/cache_def.h> -+#include <linux/version.h> -+#include <linux/init.h> -+#include <linux/mbcache.h> -+ -+ -+#ifdef MB_CACHE_DEBUG -+# define mb_debug(f...) do { \ -+ printk(KERN_DEBUG f); \ -+ printk("\n"); \ -+ } while (0) -+#define mb_assert(c) do { if (!(c)) \ -+ printk(KERN_ERR "assertion " #c " failed\n"); \ -+ } while(0) -+#else -+# define mb_debug(f...) do { } while(0) -+# define mb_assert(c) do { } while(0) -+#endif -+#define mb_error(f...) do { \ -+ printk(KERN_ERR f); \ -+ printk("\n"); \ -+ } while(0) -+ -+MODULE_AUTHOR("Andreas Gruenbacher <a.gruenbacher@computer.org>"); -+MODULE_DESCRIPTION("Meta block cache (for extended attributes)"); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) -+MODULE_LICENSE("GPL"); -+#endif -+ -+EXPORT_SYMBOL(mb_cache_create); -+EXPORT_SYMBOL(mb_cache_shrink); -+EXPORT_SYMBOL(mb_cache_destroy); -+EXPORT_SYMBOL(mb_cache_entry_alloc); -+EXPORT_SYMBOL(mb_cache_entry_insert); -+EXPORT_SYMBOL(mb_cache_entry_release); -+EXPORT_SYMBOL(mb_cache_entry_takeout); -+EXPORT_SYMBOL(mb_cache_entry_free); -+EXPORT_SYMBOL(mb_cache_entry_dup); -+EXPORT_SYMBOL(mb_cache_entry_get); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+EXPORT_SYMBOL(mb_cache_entry_find_first); -+EXPORT_SYMBOL(mb_cache_entry_find_next); -+#endif -+ -+ -+/* -+ * Global data: list of all mbcache's, lru list, and a spinlock for -+ * accessing cache data structures on SMP machines. The lru list is -+ * global across all mbcaches. -+ */ -+ -+static LIST_HEAD(mb_cache_list); -+static LIST_HEAD(mb_cache_lru_list); -+static spinlock_t mb_cache_spinlock = SPIN_LOCK_UNLOCKED; -+ -+static inline int -+mb_cache_indexes(struct mb_cache *cache) -+{ -+#ifdef MB_CACHE_INDEXES_COUNT -+ return MB_CACHE_INDEXES_COUNT; -+#else -+ return cache->c_indexes_count; -+#endif -+} -+ -+/* -+ * What the mbcache registers as to get shrunk dynamically. -+ */ -+ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask); -+ -+static struct cache_definition mb_cache_definition = { -+ "mb_cache", -+ mb_cache_memory_pressure -+}; -+ -+ -+static inline int -+__mb_cache_entry_is_hashed(struct mb_cache_entry *ce) -+{ -+ return !list_empty(&ce->e_block_list); -+} -+ -+ -+static inline void -+__mb_cache_entry_unhash(struct mb_cache_entry *ce) -+{ -+ int n; -+ -+ if (__mb_cache_entry_is_hashed(ce)) { -+ list_del_init(&ce->e_block_list); -+ for (n=0; n<mb_cache_indexes(ce->e_cache); n++) -+ list_del(&ce->e_indexes[n].o_list); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_forget(struct mb_cache_entry *ce, int gfp_mask) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ -+ mb_assert(atomic_read(&ce->e_used) == 0); -+ if (cache->c_op.free && cache->c_op.free(ce, gfp_mask)) { -+ /* free failed -- put back on the lru list -+ for freeing later. */ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&ce->e_lru_list, &mb_cache_lru_list); -+ spin_unlock(&mb_cache_spinlock); -+ } else { -+ kmem_cache_free(cache->c_entry_cache, ce); -+ atomic_dec(&cache->c_entry_count); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_release_unlock(struct mb_cache_entry *ce) -+{ -+ if (atomic_dec_and_test(&ce->e_used)) { -+ if (__mb_cache_entry_is_hashed(ce)) -+ list_add_tail(&ce->e_lru_list, &mb_cache_lru_list); -+ else { -+ spin_unlock(&mb_cache_spinlock); -+ __mb_cache_entry_forget(ce, GFP_KERNEL); -+ return; -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_memory_pressure() memory pressure callback -+ * -+ * This function is called by the kernel memory management when memory -+ * gets low. -+ * -+ * @priority: Amount by which to shrink the cache (0 = highes priority) -+ * @gfp_mask: (ignored) -+ */ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int count = 0; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &mb_cache_list) { -+ struct mb_cache *cache = -+ list_entry(l, struct mb_cache, c_cache_list); -+ mb_debug("cache %s (%d)", cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ count += atomic_read(&cache->c_entry_count); -+ } -+ mb_debug("trying to free %d of %d entries", -+ count / (priority ? priority : 1), count); -+ if (priority) -+ count /= priority; -+ while (count-- && !list_empty(&mb_cache_lru_list)) { -+ struct mb_cache_entry *ce = -+ list_entry(mb_cache_lru_list.next, -+ struct mb_cache_entry, e_lru_list); -+ list_del(&ce->e_lru_list); -+ __mb_cache_entry_unhash(ce); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), gfp_mask); -+ } -+} -+ -+ -+/* -+ * mb_cache_create() create a new cache -+ * -+ * All entries in one cache are equal size. Cache entries may be from -+ * multiple devices. If this is the first mbcache created, registers -+ * the cache with kernel memory management. Returns NULL if no more -+ * memory was available. -+ * -+ * @name: name of the cache (informal) -+ * @cache_op: contains the callback called when freeing a cache entry -+ * @entry_size: The size of a cache entry, including -+ * struct mb_cache_entry -+ * @indexes_count: number of additional indexes in the cache. Must equal -+ * MB_CACHE_INDEXES_COUNT if the number of indexes is -+ * hardwired. -+ * @bucket_count: number of hash buckets -+ */ -+struct mb_cache * -+mb_cache_create(const char *name, struct mb_cache_op *cache_op, -+ size_t entry_size, int indexes_count, int bucket_count) -+{ -+ int m=0, n; -+ struct mb_cache *cache = NULL; -+ -+ if(entry_size < sizeof(struct mb_cache_entry) + -+ indexes_count * sizeof(struct mb_cache_entry_index)) -+ return NULL; -+ -+ MOD_INC_USE_COUNT; -+ cache = kmalloc(sizeof(struct mb_cache) + -+ indexes_count * sizeof(struct list_head), GFP_KERNEL); -+ if (!cache) -+ goto fail; -+ cache->c_name = name; -+ cache->c_op.free = NULL; -+ if (cache_op) -+ cache->c_op.free = cache_op->free; -+ atomic_set(&cache->c_entry_count, 0); -+ cache->c_bucket_count = bucket_count; -+#ifdef MB_CACHE_INDEXES_COUNT -+ mb_assert(indexes_count == MB_CACHE_INDEXES_COUNT); -+#else -+ cache->c_indexes_count = indexes_count; -+#endif -+ cache->c_block_hash = kmalloc(bucket_count * sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_block_hash) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_block_hash[n]); -+ for (m=0; m<indexes_count; m++) { -+ cache->c_indexes_hash[m] = kmalloc(bucket_count * -+ sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_indexes_hash[m]) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_indexes_hash[m][n]); -+ } -+ cache->c_entry_cache = kmem_cache_create(name, entry_size, 0, -+ 0 /*SLAB_POISON | SLAB_RED_ZONE*/, NULL, NULL); -+ if (!cache->c_entry_cache) -+ goto fail; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&cache->c_cache_list, &mb_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ return cache; -+ -+fail: -+ if (cache) { -+ while (--m >= 0) -+ kfree(cache->c_indexes_hash[m]); -+ if (cache->c_block_hash) -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ } -+ MOD_DEC_USE_COUNT; -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_shrink() -+ * -+ * Removes all cache entires of a device from the cache. All cache entries -+ * currently in use cannot be freed, and thus remain in the cache. -+ * -+ * @cache: which cache to shrink -+ * @dev: which device's cache entries to shrink -+ */ -+void -+mb_cache_shrink(struct mb_cache *cache, kdev_t dev) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_dev == dev) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+} -+ -+ -+/* -+ * mb_cache_destroy() -+ * -+ * Shrinks the cache to its minimum possible size (hopefully 0 entries), -+ * and then destroys it. If this was the last mbcache, un-registers the -+ * mbcache from kernel memory management. -+ */ -+void -+mb_cache_destroy(struct mb_cache *cache) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_cache == cache) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ list_del(&cache->c_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+ -+ if (atomic_read(&cache->c_entry_count) > 0) { -+ mb_error("cache %s: %d orphaned entries", -+ cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ } -+ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)) -+ /* We don't have kmem_cache_destroy() in 2.2.x */ -+ kmem_cache_shrink(cache->c_entry_cache); -+#else -+ kmem_cache_destroy(cache->c_entry_cache); -+#endif -+ for (n=0; n < mb_cache_indexes(cache); n++) -+ kfree(cache->c_indexes_hash[n]); -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ -+ MOD_DEC_USE_COUNT; -+} -+ -+ -+/* -+ * mb_cache_entry_alloc() -+ * -+ * Allocates a new cache entry. The new entry will not be valid initially, -+ * and thus cannot be looked up yet. It should be filled with data, and -+ * then inserted into the cache using mb_cache_entry_insert(). Returns NULL -+ * if no more memory was available. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_alloc(struct mb_cache *cache) -+{ -+ struct mb_cache_entry *ce; -+ -+ atomic_inc(&cache->c_entry_count); -+ ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL); -+ if (ce) { -+ INIT_LIST_HEAD(&ce->e_lru_list); -+ INIT_LIST_HEAD(&ce->e_block_list); -+ ce->e_cache = cache; -+ atomic_set(&ce->e_used, 1); -+ } -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_insert() -+ * -+ * Inserts an entry that was allocated using mb_cache_entry_alloc() into -+ * the cache. After this, the cache entry can be looked up, but is not yet -+ * in the lru list as the caller still holds a handle to it. Returns 0 on -+ * success, or -EBUSY if a cache entry for that device + inode exists -+ * already (this may happen after a failed lookup, if another process has -+ * inserted the same cache entry in the meantime). -+ * -+ * @dev: device the cache entry belongs to -+ * @block: block number -+ * @keys: array of additional keys. There must be indexes_count entries -+ * in the array (as specified when creating the cache). -+ */ -+int -+mb_cache_entry_insert(struct mb_cache_entry *ce, kdev_t dev, -+ unsigned long block, unsigned int keys[]) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ int error = -EBUSY, n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) -+ goto out; -+ } -+ __mb_cache_entry_unhash(ce); -+ ce->e_dev = dev; -+ ce->e_block = block; -+ list_add(&ce->e_block_list, &cache->c_block_hash[bucket]); -+ for (n=0; n<mb_cache_indexes(cache); n++) { -+ ce->e_indexes[n].o_key = keys[n]; -+ bucket = keys[n] % cache->c_bucket_count; -+ list_add(&ce->e_indexes[n].o_list, -+ &cache->c_indexes_hash[n][bucket]); -+ } -+out: -+ spin_unlock(&mb_cache_spinlock); -+ return error; -+} -+ -+ -+/* -+ * mb_cache_entry_release() -+ * -+ * Release a handle to a cache entry. When the last handle to a cache entry -+ * is released it is either freed (if it is invalid) or otherwise inserted -+ * in to the lru list. -+ */ -+void -+mb_cache_entry_release(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_takeout() -+ * -+ * Take a cache entry out of the cache, making it invalid. The entry can later -+ * be re-inserted using mb_cache_entry_insert(), or released using -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_takeout(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_entry_free() -+ * -+ * This is equivalent to the sequence mb_cache_entry_takeout() -- -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_free(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_dup() -+ * -+ * Duplicate a handle to a cache entry (does not duplicate the cache entry -+ * itself). After the call, both the old and the new handle must be released. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_dup(struct mb_cache_entry *ce) -+{ -+ atomic_inc(&ce->e_used); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_get() -+ * -+ * Get a cache entry by device / block number. (There can only be one entry -+ * in the cache per device and block.) Returns NULL if no such cache entry -+ * exists. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_get(struct mb_cache *cache, kdev_t dev, unsigned long block) -+{ -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ ce = list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ goto cleanup; -+ } -+ } -+ ce = NULL; -+ -+cleanup: -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+ -+static struct mb_cache_entry * -+__mb_cache_entry_find(struct list_head *l, struct list_head *head, -+ int index, kdev_t dev, unsigned int key) -+{ -+ while (l != head) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, -+ e_indexes[index].o_list); -+ if (ce->e_dev == dev && ce->e_indexes[index].o_key == key) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ return ce; -+ } -+ l = l->next; -+ } -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_entry_find_first() -+ * -+ * Find the first cache entry on a given device with a certain key in -+ * an additional index. Additonal matches can be found with -+ * mb_cache_entry_find_next(). Returns NULL if no match was found. -+ * -+ * @cache: the cache to search -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_first(struct mb_cache *cache, int index, kdev_t dev, -+ unsigned int key) -+{ -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = cache->c_indexes_hash[index][bucket].next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_find_next() -+ * -+ * Find the next cache entry on a given device with a certain key in an -+ * additional index. Returns NULL if no match could be found. The previous -+ * entry is atomatically released, so that mb_cache_entry_find_next() can -+ * be called like this: -+ * -+ * entry = mb_cache_entry_find_first(); -+ * while (entry) { -+ * ... -+ * entry = mb_cache_entry_find_next(entry, ...); -+ * } -+ * -+ * @prev: The previous match -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_next(struct mb_cache_entry *prev, int index, kdev_t dev, -+ unsigned int key) -+{ -+ struct mb_cache *cache = prev->e_cache; -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = prev->e_indexes[index].o_list.next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ __mb_cache_entry_release_unlock(prev); -+ return ce; -+} -+ -+#endif /* !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) */ -+ -+static int __init init_mbcache(void) -+{ -+ register_cache(&mb_cache_definition); -+ return 0; -+} -+ -+static void __exit exit_mbcache(void) -+{ -+ unregister_cache(&mb_cache_definition); -+} -+ -+module_init(init_mbcache) -+module_exit(exit_mbcache) -+ ---- linux-2.4.20/include/asm-arm/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-arm/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -244,7 +244,6 @@ - #define __NR_security (__NR_SYSCALL_BASE+223) - #define __NR_gettid (__NR_SYSCALL_BASE+224) - #define __NR_readahead (__NR_SYSCALL_BASE+225) --#if 0 /* allocated in 2.5 */ - #define __NR_setxattr (__NR_SYSCALL_BASE+226) - #define __NR_lsetxattr (__NR_SYSCALL_BASE+227) - #define __NR_fsetxattr (__NR_SYSCALL_BASE+228) -@@ -257,7 +256,6 @@ - #define __NR_removexattr (__NR_SYSCALL_BASE+235) - #define __NR_lremovexattr (__NR_SYSCALL_BASE+236) - #define __NR_fremovexattr (__NR_SYSCALL_BASE+237) --#endif - #define __NR_tkill (__NR_SYSCALL_BASE+238) - /* - * Please check 2.5 _before_ adding calls here, ---- linux-2.4.20/include/asm-ia64/unistd.h~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/include/asm-ia64/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -206,8 +206,19 @@ - #define __NR_getdents64 1214 - #define __NR_getunwind 1215 - #define __NR_readahead 1216 -+#define __NR_setxattr 1217 -+#define __NR_lsetxattr 1218 -+#define __NR_fsetxattr 1219 -+#define __NR_getxattr 1220 -+#define __NR_lgetxattr 1221 -+#define __NR_fgetxattr 1222 -+#define __NR_listxattr 1223 -+#define __NR_llistxattr 1224 -+#define __NR_flistxattr 1225 -+#define __NR_removexattr 1226 -+#define __NR_lremovexattr 1227 -+#define __NR_fremovexattr 1228 - /* -- * 1217-1228: reserved for xattr - * 1230-1232: reserved for futex and sched_[sg]etaffinity. - */ - #define __NR_tkill 1229 ---- linux-2.4.20/include/asm-ppc64/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-ppc64/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -218,6 +218,7 @@ - #define __NR_gettid 207 - #if 0 /* Reserved syscalls */ - #define __NR_tkill 208 -+#endif - #define __NR_setxattr 209 - #define __NR_lsetxattr 210 - #define __NR_fsetxattr 211 -@@ -230,6 +231,7 @@ - #define __NR_removexattr 218 - #define __NR_lremovexattr 219 - #define __NR_fremovexattr 220 -+#if 0 /* Reserved syscalls */ - #define __NR_futex 221 - #endif - ---- linux-2.4.20/include/asm-s390/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-s390/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -212,9 +212,18 @@ - #define __NR_madvise 219 - #define __NR_getdents64 220 - #define __NR_fcntl64 221 --/* -- * Numbers 224-235 are reserved for posix acl -- */ -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - #define __NR_gettid 236 - #define __NR_tkill 237 - ---- linux-2.4.20/include/asm-s390x/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-s390x/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -180,9 +180,18 @@ - #define __NR_pivot_root 217 - #define __NR_mincore 218 - #define __NR_madvise 219 --/* -- * Numbers 224-235 are reserved for posix acl -- */ -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - #define __NR_gettid 236 - #define __NR_tkill 237 - ---- linux-2.4.20/include/asm-sparc/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-sparc/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -184,24 +184,24 @@ - /* #define __NR_exportfs 166 SunOS Specific */ - #define __NR_mount 167 /* Common */ - #define __NR_ustat 168 /* Common */ --/* #define __NR_semsys 169 SunOS Specific */ --/* #define __NR_msgsys 170 SunOS Specific */ --/* #define __NR_shmsys 171 SunOS Specific */ --/* #define __NR_auditsys 172 SunOS Specific */ --/* #define __NR_rfssys 173 SunOS Specific */ -+#define __NR_setxattr 169 /* SunOS: semsys */ -+#define __NR_lsetxattr 170 /* SunOS: msgsys */ -+#define __NR_fsetxattr 171 /* SunOS: shmsys */ -+#define __NR_getxattr 172 /* SunOS: auditsys */ -+#define __NR_lgetxattr 173 /* SunOS: rfssys */ - #define __NR_getdents 174 /* Common */ - #define __NR_setsid 175 /* Common */ - #define __NR_fchdir 176 /* Common */ --/* #define __NR_fchroot 177 SunOS Specific */ --/* #define __NR_vpixsys 178 SunOS Specific */ --/* #define __NR_aioread 179 SunOS Specific */ --/* #define __NR_aiowrite 180 SunOS Specific */ --/* #define __NR_aiowait 181 SunOS Specific */ --/* #define __NR_aiocancel 182 SunOS Specific */ -+#define __NR_fgetxattr 177 /* SunOS: fchroot */ -+#define __NR_listxattr 178 /* SunOS: vpixsys */ -+#define __NR_llistxattr 179 /* SunOS: aioread */ -+#define __NR_flistxattr 180 /* SunOS: aiowrite */ -+#define __NR_removexattr 181 /* SunOS: aiowait */ -+#define __NR_lremovexattr 182 /* SunOS: aiocancel */ - #define __NR_sigpending 183 /* Common */ - #define __NR_query_module 184 /* Linux Specific */ - #define __NR_setpgid 185 /* Common */ --/* #define __NR_pathconf 186 SunOS Specific */ -+#define __NR_fremovexattr 186 /* SunOS: pathconf */ - #define __NR_tkill 187 /* SunOS: fpathconf */ - /* #define __NR_sysconf 188 SunOS Specific */ - #define __NR_uname 189 /* Linux Specific */ ---- linux-2.4.20/include/asm-sparc64/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-sparc64/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -184,24 +184,24 @@ - /* #define __NR_exportfs 166 SunOS Specific */ - #define __NR_mount 167 /* Common */ - #define __NR_ustat 168 /* Common */ --/* #define __NR_semsys 169 SunOS Specific */ --/* #define __NR_msgsys 170 SunOS Specific */ --/* #define __NR_shmsys 171 SunOS Specific */ --/* #define __NR_auditsys 172 SunOS Specific */ --/* #define __NR_rfssys 173 SunOS Specific */ -+#define __NR_setxattr 169 /* SunOS: semsys */ -+#define __NR_lsetxattr 170 /* SunOS: msgsys */ -+#define __NR_fsetxattr 171 /* SunOS: shmsys */ -+#define __NR_getxattr 172 /* SunOS: auditsys */ -+#define __NR_lgetxattr 173 /* SunOS: rfssys */ - #define __NR_getdents 174 /* Common */ - #define __NR_setsid 175 /* Common */ - #define __NR_fchdir 176 /* Common */ --/* #define __NR_fchroot 177 SunOS Specific */ --/* #define __NR_vpixsys 178 SunOS Specific */ --/* #define __NR_aioread 179 SunOS Specific */ --/* #define __NR_aiowrite 180 SunOS Specific */ --/* #define __NR_aiowait 181 SunOS Specific */ --/* #define __NR_aiocancel 182 SunOS Specific */ -+#define __NR_fgetxattr 177 /* SunOS: fchroot */ -+#define __NR_listxattr 178 /* SunOS: vpixsys */ -+#define __NR_llistxattr 179 /* SunOS: aioread */ -+#define __NR_flistxattr 180 /* SunOS: aiowrite */ -+#define __NR_removexattr 181 /* SunOS: aiowait */ -+#define __NR_lremovexattr 182 /* SunOS: aiocancel */ - #define __NR_sigpending 183 /* Common */ - #define __NR_query_module 184 /* Linux Specific */ - #define __NR_setpgid 185 /* Common */ --/* #define __NR_pathconf 186 SunOS Specific */ -+#define __NR_fremovexattr 186 /* SunOS: pathconf */ - #define __NR_tkill 187 /* SunOS: fpathconf */ - /* #define __NR_sysconf 188 SunOS Specific */ - #define __NR_uname 189 /* Linux Specific */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/include/linux/cache_def.h 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,15 @@ -+/* -+ * linux/cache_def.h -+ * Handling of caches defined in drivers, filesystems, ... -+ * -+ * Copyright (C) 2002 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+struct cache_definition { -+ const char *name; -+ void (*shrink)(int, unsigned int); -+ struct list_head link; -+}; -+ -+extern void register_cache(struct cache_definition *); -+extern void unregister_cache(struct cache_definition *); ---- linux-2.4.20/include/linux/errno.h~linux-2.4.20-xattr-0.8.54 2003-04-14 16:39:03.000000000 +0800 -+++ linux-2.4.20-root/include/linux/errno.h 2003-05-07 18:08:03.000000000 +0800 -@@ -23,4 +23,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ -+ - #endif ---- linux-2.4.20/include/linux/ext2_fs.h~linux-2.4.20-xattr-0.8.54 2003-04-14 16:39:08.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext2_fs.h 2003-05-07 18:08:03.000000000 +0800 -@@ -57,8 +57,6 @@ - */ - #define EXT2_BAD_INO 1 /* Bad blocks inode */ - #define EXT2_ROOT_INO 2 /* Root inode */ --#define EXT2_ACL_IDX_INO 3 /* ACL inode */ --#define EXT2_ACL_DATA_INO 4 /* ACL inode */ - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -@@ -86,7 +84,6 @@ - #else - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -121,28 +118,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext2_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext2_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext2_group_desc -@@ -314,6 +289,7 @@ struct ext2_inode { - #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ - #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ -+#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt -@@ -397,6 +373,7 @@ struct ext2_super_block { - - #ifdef __KERNEL__ - #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -+#define EXT2_I(inode) (&((inode)->u.ext2_i)) - #else - /* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test -@@ -466,7 +443,7 @@ struct ext2_super_block { - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff - --#define EXT2_FEATURE_COMPAT_SUPP 0 -+#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -623,8 +600,10 @@ extern struct address_space_operations e - - /* namei.c */ - extern struct inode_operations ext2_dir_inode_operations; -+extern struct inode_operations ext2_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext2_symlink_inode_operations; - extern struct inode_operations ext2_fast_symlink_inode_operations; - - #endif /* __KERNEL__ */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext2_xattr.h 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext2_xattr.h -+ -+ On-disk format of extended attributes for the ext2 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT2_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT2_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT2_XATTR_INDEX_MAX 10 -+#define EXT2_XATTR_INDEX_USER 1 -+#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext2_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext2_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT2_XATTR_PAD_BITS 2 -+#define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS) -+#define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1) -+#define EXT2_XATTR_LEN(name_len) \ -+ (((name_len) + EXT2_XATTR_ROUND + \ -+ sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND) -+#define EXT2_XATTR_NEXT(entry) \ -+ ( (struct ext2_xattr_entry *)( \ -+ (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT2_XATTR_SIZE(size) \ -+ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT2_FS_XATTR -+ -+struct ext2_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext2_xattr_register(int, struct ext2_xattr_handler *); -+extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); -+ -+extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); -+extern int ext2_removexattr(struct dentry *, const char *); -+ -+extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext2_xattr_list(struct inode *, char *, size_t); -+extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext2_xattr_delete_inode(struct inode *); -+extern void ext2_xattr_put_super(struct super_block *); -+ -+extern int init_ext2_xattr(void) __init; -+extern void exit_ext2_xattr(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR */ -+# define ext2_setxattr NULL -+# define ext2_getxattr NULL -+# define ext2_listxattr NULL -+# define ext2_removexattr NULL -+ -+static inline int -+ext2_xattr_get(struct inode *inode, int name_index, -+ const char *name, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+} -+ -+static inline void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR */ -+ -+# ifdef CONFIG_EXT2_FS_XATTR_USER -+ -+extern int init_ext2_xattr_user(void) __init; -+extern void exit_ext2_xattr_user(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+static inline int -+init_ext2_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr_user(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ ---- linux-2.4.20/include/linux/ext3_fs.h~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:04.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext3_fs.h 2003-05-07 18:08:03.000000000 +0800 -@@ -63,8 +63,6 @@ - */ - #define EXT3_BAD_INO 1 /* Bad blocks inode */ - #define EXT3_ROOT_INO 2 /* Root inode */ --#define EXT3_ACL_IDX_INO 3 /* ACL inode */ --#define EXT3_ACL_DATA_INO 4 /* ACL inode */ - #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ - #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ -@@ -94,7 +92,6 @@ - #else - # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry)) - #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -129,28 +126,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext3_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext3_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext3_group_desc -@@ -344,6 +319,7 @@ struct ext3_inode { - #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */ - #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 */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -520,7 +496,7 @@ struct ext3_super_block { - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - --#define EXT3_FEATURE_COMPAT_SUPP 0 -+#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) - #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ -@@ -703,6 +679,7 @@ extern void ext3_check_inodes_bitmap (st - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - - /* inode.c */ -+extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); - -@@ -771,8 +748,10 @@ extern struct address_space_operations e - - /* namei.c */ - extern struct inode_operations ext3_dir_inode_operations; -+extern struct inode_operations ext3_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - - ---- linux-2.4.20/include/linux/ext3_jbd.h~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:02.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext3_jbd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -30,13 +30,19 @@ - - #define EXT3_SINGLEDATA_TRANS_BLOCKS 8 - -+/* Extended attributes may touch two data buffers, two bitmap buffers, -+ * and two group and summaries. */ -+ -+#define EXT3_XATTR_TRANS_BLOCKS 8 -+ - /* 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 - * quota files too (one for the group, one for the user quota). The - * superblock only gets updated once, of course, so don't bother - * counting that again for the quota updates. */ - --#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS - 2) -+#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \ -+ EXT3_XATTR_TRANS_BLOCKS - 2) - - extern int ext3_writepage_trans_blocks(struct inode *inode); - ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext3_xattr.h 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext3_xattr.h -+ -+ On-disk format of extended attributes for the ext3 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT3_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT3_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT3_XATTR_INDEX_MAX 10 -+#define EXT3_XATTR_INDEX_USER 1 -+#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext3_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext3_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT3_XATTR_PAD_BITS 2 -+#define EXT3_XATTR_PAD (1<<EXT3_XATTR_PAD_BITS) -+#define EXT3_XATTR_ROUND (EXT3_XATTR_PAD-1) -+#define EXT3_XATTR_LEN(name_len) \ -+ (((name_len) + EXT3_XATTR_ROUND + \ -+ sizeof(struct ext3_xattr_entry)) & ~EXT3_XATTR_ROUND) -+#define EXT3_XATTR_NEXT(entry) \ -+ ( (struct ext3_xattr_entry *)( \ -+ (char *)(entry) + EXT3_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT3_XATTR_SIZE(size) \ -+ (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT3_FS_XATTR -+ -+struct ext3_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext3_xattr_register(int, struct ext3_xattr_handler *); -+extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *); -+ -+extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); -+extern int ext3_removexattr(struct dentry *, const char *); -+ -+extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext3_xattr_list(struct inode *, char *, size_t); -+extern int ext3_xattr_set(handle_t *handle, struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext3_xattr_delete_inode(handle_t *, struct inode *); -+extern void ext3_xattr_put_super(struct super_block *); -+ -+extern int init_ext3_xattr(void) __init; -+extern void exit_ext3_xattr(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR */ -+# define ext3_setxattr NULL -+# define ext3_getxattr NULL -+# define ext3_listxattr NULL -+# define ext3_removexattr NULL -+ -+static inline int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_list(struct inode *inode, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+} -+ -+static inline void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT3_FS_XATTR */ -+ -+# ifdef CONFIG_EXT3_FS_XATTR_USER -+ -+extern int init_ext3_xattr_user(void) __init; -+extern void exit_ext3_xattr_user(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+static inline int -+init_ext3_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr_user(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ ---- linux-2.4.20/include/linux/fs.h~linux-2.4.20-xattr-0.8.54 2003-05-05 19:00:55.000000000 +0800 -+++ linux-2.4.20-root/include/linux/fs.h 2003-05-07 18:08:03.000000000 +0800 -@@ -888,7 +888,7 @@ struct inode_operations { - int (*setattr) (struct dentry *, struct iattr *); - int (*setattr_raw) (struct inode *, struct iattr *); - int (*getattr) (struct dentry *, struct iattr *); -- int (*setxattr) (struct dentry *, const char *, void *, size_t, int); -+ int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); - ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); - ssize_t (*listxattr) (struct dentry *, char *, size_t); - int (*removexattr) (struct dentry *, const char *); ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/include/linux/mbcache.h 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,69 @@ -+/* -+ File: linux/mbcache.h -+ -+ (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+/* Hardwire the number of additional indexes */ -+#define MB_CACHE_INDEXES_COUNT 1 -+ -+struct mb_cache_entry; -+ -+struct mb_cache_op { -+ int (*free)(struct mb_cache_entry *, int); -+}; -+ -+struct mb_cache { -+ struct list_head c_cache_list; -+ const char *c_name; -+ struct mb_cache_op c_op; -+ atomic_t c_entry_count; -+ int c_bucket_count; -+#ifndef MB_CACHE_INDEXES_COUNT -+ int c_indexes_count; -+#endif -+ kmem_cache_t *c_entry_cache; -+ struct list_head *c_block_hash; -+ struct list_head *c_indexes_hash[0]; -+}; -+ -+struct mb_cache_entry_index { -+ struct list_head o_list; -+ unsigned int o_key; -+}; -+ -+struct mb_cache_entry { -+ struct list_head e_lru_list; -+ struct mb_cache *e_cache; -+ atomic_t e_used; -+ kdev_t e_dev; -+ unsigned long e_block; -+ struct list_head e_block_list; -+ struct mb_cache_entry_index e_indexes[0]; -+}; -+ -+/* Functions on caches */ -+ -+struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, -+ int, int); -+void mb_cache_shrink(struct mb_cache *, kdev_t); -+void mb_cache_destroy(struct mb_cache *); -+ -+/* Functions on cache entries */ -+ -+struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *); -+int mb_cache_entry_insert(struct mb_cache_entry *, kdev_t, unsigned long, -+ unsigned int[]); -+void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]); -+void mb_cache_entry_release(struct mb_cache_entry *); -+void mb_cache_entry_takeout(struct mb_cache_entry *); -+void mb_cache_entry_free(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, kdev_t, -+ unsigned long); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, -+ kdev_t, unsigned int); -+struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, -+ kdev_t, unsigned int); -+#endif ---- linux-2.4.20/kernel/ksyms.c~linux-2.4.20-xattr-0.8.54 2003-05-05 17:43:15.000000000 +0800 -+++ linux-2.4.20-root/kernel/ksyms.c 2003-05-07 18:08:03.000000000 +0800 -@@ -11,6 +11,7 @@ - - #include <linux/config.h> - #include <linux/slab.h> -+#include <linux/cache_def.h> - #include <linux/module.h> - #include <linux/blkdev.h> - #include <linux/cdrom.h> -@@ -89,6 +90,7 @@ EXPORT_SYMBOL(exit_mm); - EXPORT_SYMBOL(exit_files); - EXPORT_SYMBOL(exit_fs); - EXPORT_SYMBOL(exit_sighand); -+EXPORT_SYMBOL(copy_fs_struct); - - /* internal kernel memory management */ - EXPORT_SYMBOL(_alloc_pages); -@@ -107,6 +109,8 @@ EXPORT_SYMBOL(kmem_cache_validate); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); - EXPORT_SYMBOL(kmem_cache_size); -+EXPORT_SYMBOL(register_cache); -+EXPORT_SYMBOL(unregister_cache); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); ---- linux-2.4.20/mm/vmscan.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/mm/vmscan.c 2003-05-07 18:08:03.000000000 +0800 -@@ -18,6 +18,7 @@ - #include <linux/kernel_stat.h> - #include <linux/swap.h> - #include <linux/swapctl.h> -+#include <linux/cache_def.h> - #include <linux/smp_lock.h> - #include <linux/pagemap.h> - #include <linux/init.h> -@@ -34,6 +35,39 @@ - */ - #define DEF_PRIORITY (6) - -+static DECLARE_MUTEX(other_caches_sem); -+static LIST_HEAD(cache_definitions); -+ -+void register_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_add(&cache->link, &cache_definitions); -+ up(&other_caches_sem); -+} -+ -+void unregister_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_del(&cache->link); -+ up(&other_caches_sem); -+} -+ -+static void shrink_other_caches(unsigned int priority, int gfp_mask) -+{ -+ struct list_head *p; -+ -+ if (down_trylock(&other_caches_sem)) -+ return; -+ -+ list_for_each_prev(p, &cache_definitions) { -+ struct cache_definition *cache = -+ list_entry(p, struct cache_definition, link); -+ -+ cache->shrink(priority, gfp_mask); -+ } -+ up(&other_caches_sem); -+} -+ - /* - * The swap-out function returns 1 if it successfully - * scanned all the pages it was asked to (`count'). -@@ -577,6 +611,7 @@ static int shrink_caches(zone_t * classz - - shrink_dcache_memory(priority, gfp_mask); - shrink_icache_memory(priority, gfp_mask); -+ shrink_other_caches(priority, gfp_mask); - #ifdef CONFIG_QUOTA - shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); - #endif ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-root/fs/ext3/ext3-exports.c 2003-05-05 18:19:11.000000000 +0800 -@@ -0,0 +1,13 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); - -_ diff --git a/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-chaos.patch b/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-chaos.patch deleted file mode 100644 index 8e198f86c7..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-chaos.patch +++ /dev/null @@ -1,2195 +0,0 @@ - Documentation/Configure.help | 66 ++ - arch/alpha/defconfig | 7 - arch/alpha/kernel/entry.S | 12 - arch/arm/defconfig | 7 - arch/arm/kernel/calls.S | 24 - arch/i386/defconfig | 7 - arch/ia64/defconfig | 7 - arch/ia64/kernel/entry.S | 24 - arch/m68k/defconfig | 7 - arch/mips/defconfig | 7 - arch/mips64/defconfig | 7 - arch/ppc/defconfig | 14 - arch/ppc64/kernel/misc.S | 2 - arch/s390/defconfig | 7 - arch/s390/kernel/entry.S | 24 - arch/s390x/defconfig | 7 - arch/s390x/kernel/entry.S | 24 - arch/s390x/kernel/wrapper32.S | 92 +++ - arch/sparc/defconfig | 7 - arch/sparc/kernel/systbls.S | 10 - arch/sparc64/defconfig | 7 - arch/sparc64/kernel/systbls.S | 20 - fs/Config.in | 14 - fs/Makefile | 3 - fs/ext2/Makefile | 4 - fs/ext2/file.c | 5 - fs/ext2/ialloc.c | 2 - fs/ext2/inode.c | 34 - - fs/ext2/namei.c | 14 - fs/ext2/super.c | 29 - fs/ext2/symlink.c | 14 - fs/ext2/xattr.c | 1212 +++++++++++++++++++++++++++++++++++++++++ - fs/ext2/xattr_user.c | 103 +++ - fs/ext3/Makefile | 10 - fs/ext3/file.c | 5 - fs/ext3/ialloc.c | 2 - fs/ext3/inode.c | 35 - - fs/ext3/namei.c | 21 - fs/ext3/super.c | 36 + - fs/ext3/symlink.c | 14 - fs/ext3/xattr.c | 1225 ++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/xattr_user.c | 111 +++ - fs/jfs/jfs_xattr.h | 6 - fs/jfs/xattr.c | 6 - fs/mbcache.c | 648 ++++++++++++++++++++++ - include/asm-arm/unistd.h | 2 - include/asm-ia64/unistd.h | 13 - include/asm-ppc64/unistd.h | 2 - include/asm-s390/unistd.h | 15 - include/asm-s390x/unistd.h | 15 - include/asm-sparc/unistd.h | 24 - include/asm-sparc64/unistd.h | 24 - include/linux/cache_def.h | 15 - include/linux/errno.h | 4 - include/linux/ext2_fs.h | 31 - - include/linux/ext2_xattr.h | 157 +++++ - include/linux/ext3_fs.h | 31 - - include/linux/ext3_jbd.h | 8 - include/linux/ext3_xattr.h | 157 +++++ - include/linux/fs.h | 2 - include/linux/mbcache.h | 69 ++ - kernel/ksyms.c | 4 - mm/vmscan.c | 35 + - fs/ext3/ext3-exports.c | 14 + - 64 files changed, 4355 insertions(+), 195 deletions(-) - -Index: linux-2.4.21-chaos/Documentation/Configure.help -=================================================================== ---- linux-2.4.21-chaos.orig/Documentation/Configure.help 2003-10-04 01:18:57.000000000 +0400 -+++ linux-2.4.21-chaos/Documentation/Configure.help 2003-12-14 15:11:46.000000000 +0300 -@@ -15939,6 +15939,39 @@ - be compiled as a module, and so this could be dangerous. Most - everyone wants to say Y here. - -+Ext2 extended attributes -+CONFIG_EXT2_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 extended attribute block sharing -+CONFIG_EXT2_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext2 extended user attributes -+CONFIG_EXT2_FS_XATTR_USER -+ This option enables extended user attributes on ext2. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 trusted extended attributes -+CONFIG_EXT2_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext2 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Ext3 journalling file system support (EXPERIMENTAL) - CONFIG_EXT3_FS - This is the journalling version of the Second extended file system -@@ -16008,6 +16041,39 @@ - - If unsure, say N. - -+Ext3 extended attributes -+CONFIG_EXT3_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 extended attribute block sharing -+CONFIG_EXT3_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext3 extended user attributes -+CONFIG_EXT3_FS_XATTR_USER -+ This option enables extended user attributes on ext3. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 trusted extended attributes -+CONFIG_EXT3_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext3 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Journal Block Device support (JBD for ext3) (EXPERIMENTAL) - CONFIG_JBD - This is a generic journalling layer for block devices. It is -Index: linux-2.4.21-chaos/fs/Config.in -=================================================================== ---- linux-2.4.21-chaos.orig/fs/Config.in 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/Config.in 2003-12-14 15:11:46.000000000 +0300 -@@ -108,6 +108,11 @@ - tristate 'ROM file system support' CONFIG_ROMFS_FS - - tristate 'Second extended fs support' CONFIG_EXT2_FS -+dep_mbool ' Ext2 extended attributes' CONFIG_EXT2_FS_XATTR $CONFIG_EXT2_FS -+dep_bool ' Ext2 extended attribute block sharing' \ -+ CONFIG_EXT2_FS_XATTR_SHARING $CONFIG_EXT2_FS_XATTR -+dep_bool ' Ext2 extended user attributes' \ -+ CONFIG_EXT2_FS_XATTR_USER $CONFIG_EXT2_FS_XATTR - - tristate 'System V/Xenix/V7/Coherent file system support' CONFIG_SYSV_FS - -@@ -196,6 +201,10 @@ - bool "POSIX ACL helper functions" CONFIG_FS_POSIX_ACL - fi - -+# Meta block cache for Extended Attributes (ext2/ext3) -+#tristate 'Meta block cache' CONFIG_FS_MBCACHE -+define_tristate CONFIG_FS_MBCACHE y -+ - mainmenu_option next_comment - comment 'Partition Types' - source fs/partitions/Config.in -Index: linux-2.4.21-chaos/fs/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/fs/Makefile 2003-12-14 15:09:27.000000000 +0300 -+++ linux-2.4.21-chaos/fs/Makefile 2003-12-14 15:11:46.000000000 +0300 -@@ -95,6 +95,9 @@ - obj-$(CONFIG_NFS_ACL) += solaris_acl.o - obj-$(CONFIG_NFSD_ACL) += solaris_acl.o - -+export-objs += mbcache.o -+obj-$(CONFIG_FS_MBCACHE) += mbcache.o -+ - # persistent filesystems - obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) - -Index: linux-2.4.21-chaos/fs/ext2/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/Makefile 2002-05-08 01:53:46.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext2/Makefile 2003-12-14 15:11:46.000000000 +0300 -@@ -13,4 +13,8 @@ - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make -Index: linux-2.4.21-chaos/fs/ext2/file.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/file.c 2003-07-15 04:41:01.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext2/file.c 2003-12-14 15:11:46.000000000 +0300 -@@ -20,6 +20,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/sched.h> - - /* -@@ -55,4 +56,8 @@ - - struct inode_operations ext2_file_inode_operations = { - truncate: ext2_truncate, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.21-chaos/fs/ext2/ialloc.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/ialloc.c 2003-07-15 02:09:35.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext2/ialloc.c 2003-12-14 15:11:46.000000000 +0300 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/locks.h> - #include <linux/quotaops.h> - -@@ -167,6 +168,7 @@ - */ - if (!is_bad_inode(inode)) { - /* Quota is already initialized in iput() */ -+ ext2_xattr_delete_inode(inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - } -Index: linux-2.4.21-chaos/fs/ext2/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/inode.c 2003-07-15 04:41:01.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext2/inode.c 2003-12-14 15:11:46.000000000 +0300 -@@ -39,6 +39,18 @@ - static int ext2_update_inode(struct inode * inode, int do_sync); - - /* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext2_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext2_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ -+/* - * Called at each iput() - */ - void ext2_put_inode (struct inode * inode) -@@ -53,9 +65,7 @@ - { - lock_kernel(); - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - inode->u.ext2_i.i_dtime = CURRENT_TIME; - mark_inode_dirty(inode); -@@ -802,6 +812,8 @@ - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext2_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -904,8 +916,7 @@ - unsigned long offset; - struct ext2_group_desc * gdp; - -- if ((inode->i_ino != EXT2_ROOT_INO && inode->i_ino != EXT2_ACL_IDX_INO && -- inode->i_ino != EXT2_ACL_DATA_INO && -+ if ((inode->i_ino != EXT2_ROOT_INO && - inode->i_ino < EXT2_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu(inode->i_sb->u.ext2_sb.s_es->s_inodes_count)) { - ext2_error (inode->i_sb, "ext2_read_inode", -@@ -990,10 +1001,7 @@ - for (block = 0; block < EXT2_N_BLOCKS; block++) - inode->u.ext2_i.i_data[block] = raw_inode->i_block[block]; - -- if (inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext2_file_inode_operations; - inode->i_fop = &ext2_file_operations; - inode->i_mapping->a_ops = &ext2_aops; -@@ -1002,15 +1010,17 @@ - inode->i_fop = &ext2_dir_operations; - inode->i_mapping->a_ops = &ext2_aops; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext2_inode_is_fast_symlink(inode)) - inode->i_op = &ext2_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - } -- } else -+ } else { -+ inode->i_op = &ext2_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(raw_inode->i_block[0])); -+ } - brelse (bh); - inode->i_attr_flags = 0; - ext2_set_inode_flags(inode); -Index: linux-2.4.21-chaos/fs/ext2/namei.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/namei.c 2002-05-08 01:53:46.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext2/namei.c 2003-12-14 15:11:46.000000000 +0300 -@@ -31,6 +31,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/pagemap.h> - - /* -@@ -136,7 +137,7 @@ - - if (l > sizeof (inode->u.ext2_i.i_data)) { - /* slow symlink */ -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - err = block_symlink(inode, symname, l); - if (err) -@@ -345,4 +346,15 @@ - rmdir: ext2_rmdir, - mknod: ext2_mknod, - rename: ext2_rename, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ -+struct inode_operations ext2_special_inode_operations = { -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.21-chaos/fs/ext2/super.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/super.c 2003-02-15 01:59:09.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext2/super.c 2003-12-14 15:11:46.000000000 +0300 -@@ -21,6 +21,7 @@ - #include <linux/string.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -125,6 +126,7 @@ - int db_count; - int i; - -+ ext2_xattr_put_super(sb); - if (!(sb->s_flags & MS_RDONLY)) { - struct ext2_super_block *es = EXT2_SB(sb)->s_es; - -@@ -175,6 +177,13 @@ - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -424,6 +433,9 @@ - blocksize = BLOCK_SIZE; - - sb->u.ext2_sb.s_mount_opt = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ /* set_opt (sb->u.ext2_sb.s_mount_opt, XATTR_USER); */ -+#endif - if (!parse_options ((char *) data, &sb_block, &resuid, &resgid, - &sb->u.ext2_sb.s_mount_opt)) { - return NULL; -@@ -813,12 +825,27 @@ - - static int __init init_ext2_fs(void) - { -- return register_filesystem(&ext2_fs_type); -+ int error = init_ext2_xattr(); -+ if (error) -+ return error; -+ error = init_ext2_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext2_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext2_xattr_user(); -+fail: -+ exit_ext2_xattr(); -+ return error; - } - - static void __exit exit_ext2_fs(void) - { - unregister_filesystem(&ext2_fs_type); -+ exit_ext2_xattr_user(); -+ exit_ext2_xattr(); - } - - EXPORT_NO_SYMBOLS; -Index: linux-2.4.21-chaos/fs/ext2/symlink.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/symlink.c 2002-05-08 01:53:46.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext2/symlink.c 2003-12-14 15:11:46.000000000 +0300 -@@ -19,6 +19,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - - static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -32,7 +33,20 @@ - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext2_symlink_inode_operations = { -+ readlink: page_readlink, -+ follow_link: page_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ - struct inode_operations ext2_fast_symlink_inode_operations = { - readlink: ext2_readlink, - follow_link: ext2_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.21-chaos/fs/ext2/xattr.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/xattr.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext2/xattr.c 2003-12-14 15:11:46.000000000 +0300 -@@ -0,0 +1,1212 @@ -+/* -+ * linux/fs/ext2/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT2_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT2_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext2_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+/* These symbols may be needed by a module. */ -+EXPORT_SYMBOL(ext2_xattr_register); -+EXPORT_SYMBOL(ext2_xattr_unregister); -+EXPORT_SYMBOL(ext2_xattr_get); -+EXPORT_SYMBOL(ext2_xattr_list); -+EXPORT_SYMBOL(ext2_xattr_set); -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext2_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext2_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT2_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext2_xattr_set2(struct inode *, struct buffer_head *, -+ struct ext2_xattr_header *); -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+static int ext2_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext2_xattr_cache_find(struct inode *, -+ struct ext2_xattr_header *); -+static void ext2_xattr_cache_remove(struct buffer_head *); -+static void ext2_xattr_rehash(struct ext2_xattr_header *, -+ struct ext2_xattr_entry *); -+ -+static struct mb_cache *ext2_xattr_cache; -+ -+#else -+# define ext2_xattr_cache_insert(bh) 0 -+# define ext2_xattr_cache_find(inode, header) NULL -+# define ext2_xattr_cache_remove(bh) while(0) {} -+# define ext2_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext2_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext2_xattr_sem); -+ -+static inline int -+ext2_xattr_new_block(struct inode *inode, int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block) + -+ EXT2_I(inode)->i_block_group * EXT2_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext2_new_block(inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext2_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext2_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext2_xattr_free_block(struct inode * inode, unsigned long block) -+{ -+ ext2_free_blocks(inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext2_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext2_xattr_free_block(inode, block) \ -+ ext2_free_blocks(inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext2_xattr_handler *ext2_xattr_handlers[EXT2_XATTR_INDEX_MAX]; -+rwlock_t ext2_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext2_xattr_register(int name_index, struct ext2_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ if (!ext2_xattr_handlers[name_index-1]) { -+ ext2_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext2_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext2_xattr_unregister(int name_index, struct ext2_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ ext2_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext2_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static struct ext2_xattr_handler * -+ext2_xattr_resolve_name(const char **name) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext2_handler_lock); -+ for (i=0; i<EXT2_XATTR_INDEX_MAX; i++) { -+ if (ext2_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext2_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext2_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext2_handler_lock); -+ return handler; -+} -+ -+static inline struct ext2_xattr_handler * -+ext2_xattr_handler(int name_index) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ read_lock(&ext2_handler_lock); -+ handler = ext2_xattr_handlers[name_index-1]; -+ read_unlock(&ext2_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext2_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext2_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT2_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT2_I(inode)->i_file_acl) -+ return 0; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT2_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext2_xattr_update_super_block(struct super_block *sb) -+{ -+ if (EXT2_HAS_COMPAT_FEATURE(sb, EXT2_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT2_SB(sb)->s_feature_compat |= EXT2_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT2_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT2_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ mark_buffer_dirty(EXT2_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext2_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_header *header = NULL; -+ struct ext2_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT2_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext2_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(sb, "ext2_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext2_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT2_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT2_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT2_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext2_xattr_cache_remove(bh); -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT2_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT2_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT2_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT2_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext2_xattr_set2(inode, bh, NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT2_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT2_XATTR_PAD, 0, -+ EXT2_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext2_xattr_rehash(header, here); -+ -+ error = ext2_xattr_set2(inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext2_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext2_xattr_set(): Update the file system. -+ */ -+static int -+ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, -+ struct ext2_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext2_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext2_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext2_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT2_I(inode)->i_file_acl != 0; -+ int block = ext2_xattr_new_block(inode, &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+ ext2_xattr_free_block(inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext2_xattr_cache_insert(new_bh); -+ -+ ext2_xattr_update_super_block(sb); -+ } -+ mark_buffer_dirty(new_bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &new_bh); -+ wait_on_buffer(new_bh); -+ error = -EIO; -+ if (buffer_req(new_bh) && !buffer_uptodate(new_bh)) -+ goto cleanup; -+ } -+ } -+ -+ /* Update the inode. */ -+ EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ if (IS_SYNC(inode)) { -+ error = ext2_sync_inode (inode); -+ if (error) -+ goto cleanup; -+ } else -+ mark_inode_dirty(inode); -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext2_xattr_free_block(inode, old_bh->b_blocknr); -+ mark_buffer_clean(old_bh); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext2_xattr_quota_free(inode); -+ mark_buffer_dirty(old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT2_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext2_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext2_xattr_cache_remove(bh); -+ ext2_xattr_free_block(inode, block); -+ bforget(bh); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ mark_buffer_dirty(bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &bh); -+ wait_on_buffer(bh); -+ } -+ ext2_xattr_quota_free(inode); -+ } -+ EXT2_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext2_xattr_sem); -+} -+ -+/* -+ * ext2_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ mb_cache_shrink(ext2_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+/* -+ * ext2_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext2_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext2_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext2_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext2_xattr_cmp(struct ext2_xattr_header *header1, -+ struct ext2_xattr_header *header2) -+{ -+ struct ext2_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT2_XATTR_NEXT(entry1); -+ entry2 = EXT2_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext2_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext2_xattr_cache_find(struct inode *inode, struct ext2_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext2_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT2_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT2_XATTR_REFCOUNT_MAX); -+ } else if (!ext2_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext2_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext2_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext2_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext2_xattr_hash_entry(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT2_XATTR_ROUND) >> EXT2_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext2_xattr_rehash(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ struct ext2_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext2_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT2_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext2_xattr(void) -+{ -+ ext2_xattr_cache = mb_cache_create("ext2_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext2_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+ mb_cache_destroy(ext2_xattr_cache); -+} -+ -+#else /* CONFIG_EXT2_FS_XATTR_SHARING */ -+ -+int __init -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT2_FS_XATTR_SHARING */ -Index: linux-2.4.21-chaos/fs/ext2/xattr_user.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext2/xattr_user.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext2/xattr_user.c 2003-12-14 15:11:46.000000000 +0300 -@@ -0,0 +1,103 @@ -+/* -+ * linux/fs/ext2/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+ -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+# include <linux/ext2_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext2_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext2_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_get(inode, EXT2_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext2_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_set(inode, EXT2_XATTR_INDEX_USER, name, -+ value, size, flags); -+} -+ -+struct ext2_xattr_handler ext2_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext2_xattr_user_list, -+ get: ext2_xattr_user_get, -+ set: ext2_xattr_user_set, -+}; -+ -+int __init -+init_ext2_xattr_user(void) -+{ -+ return ext2_xattr_register(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -+ -+void -+exit_ext2_xattr_user(void) -+{ -+ ext2_xattr_unregister(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -Index: linux-2.4.21-chaos/fs/ext3/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/Makefile 2003-12-14 15:09:30.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/Makefile 2003-12-14 15:11:46.000000000 +0300 -@@ -9,10 +9,10 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.21-chaos/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/super.c 2003-12-14 15:09:30.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/super.c 2003-12-14 15:11:46.000000000 +0300 -@@ -1944,9 +1944,6 @@ - unregister_filesystem(&ext3_fs_type); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); -- - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - MODULE_LICENSE("GPL"); -Index: linux-2.4.21-chaos/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ext3-exports.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ext3-exports.c 2003-12-14 15:11:46.000000000 +0300 -@@ -0,0 +1,14 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_journal_abort_handle); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); -Index: linux-2.4.21-chaos/fs/ext3/xattr_trusted.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/xattr_trusted.c 2003-07-15 04:41:01.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/xattr_trusted.c 2003-12-14 15:11:46.000000000 +0300 -@@ -50,7 +50,7 @@ - return -EINVAL; - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; -- return ext3_xattr_set(inode, EXT3_XATTR_INDEX_TRUSTED, name, -+ return ext3_xattr_set_trans(inode, EXT3_XATTR_INDEX_TRUSTED, name, - value, size, flags); - } - -Index: linux-2.4.21-chaos/fs/ext3/xattr.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/xattr.c 2003-07-30 04:11:55.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/xattr.c 2003-12-14 15:11:46.000000000 +0300 -@@ -868,7 +868,7 @@ - } - - /* -- * ext3_xattr_set() -+ * ext3_xattr_set_trans() - * - * Like ext3_xattr_set_handle, but start from an inode. This extended - * attribute modification is a filesystem transaction by itself. -@@ -876,7 +876,7 @@ - * Returns 0, or a negative error number on failure. - */ - int --ext3_xattr_set(struct inode *inode, int name_index, const char *name, -+ext3_xattr_set_trans(struct inode *inode, int name_index, const char *name, - const void *value, size_t value_len, int flags) - { - handle_t *handle; -@@ -895,6 +895,20 @@ - return error ? error : error2; - } - -+int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, -+ int flags) -+{ -+ int error; -+ -+ lock_kernel(); -+ error = ext3_xattr_set_handle(handle, inode, name_index, name, -+ value, value_len, flags); -+ unlock_kernel(); -+ return error; -+} -+ - /* - * ext3_xattr_delete_inode() - * -Index: linux-2.4.21-chaos/fs/ext3/xattr_user.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/xattr_user.c 2003-07-30 04:11:55.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/xattr_user.c 2003-12-14 15:26:58.000000000 +0300 -@@ -70,7 +70,7 @@ - if (error) - return error; - -- return ext3_xattr_set(inode, EXT3_XATTR_INDEX_USER, name, -+ return ext3_xattr_set_trans(inode, EXT3_XATTR_INDEX_USER, name, - value, size, flags); - } - -Index: linux-2.4.21-chaos/include/linux/errno.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/errno.h 2003-07-15 04:41:12.000000000 +0400 -+++ linux-2.4.21-chaos/include/linux/errno.h 2003-12-14 15:11:46.000000000 +0300 -@@ -26,4 +26,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ -+ - #endif -Index: linux-2.4.21-chaos/include/linux/ext2_fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext2_fs.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext2_fs.h 2003-12-14 15:13:54.000000000 +0300 -@@ -57,8 +57,6 @@ - */ - #define EXT2_BAD_INO 1 /* Bad blocks inode */ - #define EXT2_ROOT_INO 2 /* Root inode */ --#define EXT2_ACL_IDX_INO 3 /* ACL inode */ --#define EXT2_ACL_DATA_INO 4 /* ACL inode */ - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -@@ -86,7 +84,6 @@ - #else - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -121,28 +118,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext2_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext2_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext2_group_desc -@@ -314,6 +289,7 @@ - #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ - #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ -+#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt -@@ -397,6 +373,7 @@ - - #ifdef __KERNEL__ - #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -+#define EXT2_I(inode) (&((inode)->u.ext2_i)) - #else - /* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test -@@ -466,7 +443,7 @@ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff - --#define EXT2_FEATURE_COMPAT_SUPP 0 -+#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -624,8 +601,10 @@ - - /* namei.c */ - extern struct inode_operations ext2_dir_inode_operations; -+extern struct inode_operations ext2_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext2_symlink_inode_operations; - extern struct inode_operations ext2_fast_symlink_inode_operations; - - #endif /* __KERNEL__ */ -Index: linux-2.4.21-chaos/include/linux/ext2_xattr.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext2_xattr.h 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext2_xattr.h 2003-12-14 15:13:54.000000000 +0300 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext2_xattr.h -+ -+ On-disk format of extended attributes for the ext2 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT2_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT2_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT2_XATTR_INDEX_MAX 10 -+#define EXT2_XATTR_INDEX_USER 1 -+#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext2_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext2_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT2_XATTR_PAD_BITS 2 -+#define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS) -+#define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1) -+#define EXT2_XATTR_LEN(name_len) \ -+ (((name_len) + EXT2_XATTR_ROUND + \ -+ sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND) -+#define EXT2_XATTR_NEXT(entry) \ -+ ( (struct ext2_xattr_entry *)( \ -+ (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT2_XATTR_SIZE(size) \ -+ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT2_FS_XATTR -+ -+struct ext2_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext2_xattr_register(int, struct ext2_xattr_handler *); -+extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); -+ -+extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); -+extern int ext2_removexattr(struct dentry *, const char *); -+ -+extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext2_xattr_list(struct inode *, char *, size_t); -+extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext2_xattr_delete_inode(struct inode *); -+extern void ext2_xattr_put_super(struct super_block *); -+ -+extern int init_ext2_xattr(void) __init; -+extern void exit_ext2_xattr(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR */ -+# define ext2_setxattr NULL -+# define ext2_getxattr NULL -+# define ext2_listxattr NULL -+# define ext2_removexattr NULL -+ -+static inline int -+ext2_xattr_get(struct inode *inode, int name_index, -+ const char *name, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+} -+ -+static inline void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR */ -+ -+# ifdef CONFIG_EXT2_FS_XATTR_USER -+ -+extern int init_ext2_xattr_user(void) __init; -+extern void exit_ext2_xattr_user(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+static inline int -+init_ext2_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr_user(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ -Index: linux-2.4.21-chaos/include/linux/ext3_xattr.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_xattr.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_xattr.h 2003-12-14 15:21:13.000000000 +0300 -@@ -82,8 +82,10 @@ - extern int ext3_xattr_list(struct inode *, char *, size_t); - extern int ext3_xattr_set_handle(handle_t *handle, struct inode *, int, - const char *, const void *, size_t, int); --extern int ext3_xattr_set(struct inode *, int, const char *, const void *, -+extern int ext3_xattr_set_trans(struct inode *, int, const char *, const void *, - size_t, int); -+extern int ext3_xattr_set(handle_t *, struct inode *, int, const char *, -+ const void *, size_t, int); - - extern void ext3_xattr_delete_inode(handle_t *, struct inode *); - extern void ext3_xattr_put_super(struct super_block *); diff --git a/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-suse.patch b/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-suse.patch deleted file mode 100644 index da8c15c7f0..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-suse.patch +++ /dev/null @@ -1,5349 +0,0 @@ - Documentation/Configure.help | 66 ++ - arch/alpha/defconfig | 7 - arch/alpha/kernel/entry.S | 12 - arch/arm/defconfig | 7 - arch/arm/kernel/calls.S | 24 - arch/i386/defconfig | 7 - arch/ia64/defconfig | 7 - arch/ia64/kernel/entry.S | 24 - arch/m68k/defconfig | 7 - arch/mips/defconfig | 7 - arch/mips64/defconfig | 7 - arch/ppc/defconfig | 14 - arch/ppc64/kernel/misc.S | 2 - arch/s390/defconfig | 7 - arch/s390/kernel/entry.S | 24 - arch/s390x/defconfig | 7 - arch/s390x/kernel/entry.S | 24 - arch/s390x/kernel/wrapper32.S | 92 +++ - arch/sparc/defconfig | 7 - arch/sparc/kernel/systbls.S | 10 - arch/sparc64/defconfig | 7 - arch/sparc64/kernel/systbls.S | 20 - fs/Config.in | 14 - fs/Makefile | 3 - fs/ext2/Makefile | 4 - fs/ext2/file.c | 5 - fs/ext2/ialloc.c | 2 - fs/ext2/inode.c | 34 - - fs/ext2/namei.c | 14 - fs/ext2/super.c | 29 - fs/ext2/symlink.c | 14 - fs/ext2/xattr.c | 1212 +++++++++++++++++++++++++++++++++++++++++ - fs/ext2/xattr_user.c | 103 +++ - fs/ext3/Makefile | 10 - fs/ext3/file.c | 5 - fs/ext3/ialloc.c | 2 - fs/ext3/inode.c | 35 - - fs/ext3/namei.c | 21 - fs/ext3/super.c | 36 + - fs/ext3/symlink.c | 14 - fs/ext3/xattr.c | 1225 ++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/xattr_user.c | 111 +++ - fs/jfs/jfs_xattr.h | 6 - fs/jfs/xattr.c | 6 - fs/mbcache.c | 648 ++++++++++++++++++++++ - include/asm-arm/unistd.h | 2 - include/asm-ia64/unistd.h | 13 - include/asm-ppc64/unistd.h | 2 - include/asm-s390/unistd.h | 15 - include/asm-s390x/unistd.h | 15 - include/asm-sparc/unistd.h | 24 - include/asm-sparc64/unistd.h | 24 - include/linux/cache_def.h | 15 - include/linux/errno.h | 4 - include/linux/ext2_fs.h | 31 - - include/linux/ext2_xattr.h | 157 +++++ - include/linux/ext3_fs.h | 31 - - include/linux/ext3_jbd.h | 8 - include/linux/ext3_xattr.h | 157 +++++ - include/linux/fs.h | 2 - include/linux/mbcache.h | 69 ++ - kernel/ksyms.c | 4 - mm/vmscan.c | 35 + - fs/ext3/ext3-exports.c | 14 + - 64 files changed, 4355 insertions(+), 195 deletions(-) - ---- linux-2.4.20/Documentation/Configure.help~linux-2.4.20-xattr-0.8.54 2003-05-05 17:43:06.000000000 +0800 -+++ linux-2.4.20-root/Documentation/Configure.help 2003-05-07 18:08:03.000000000 +0800 -@@ -15242,6 +15242,39 @@ CONFIG_EXT2_FS - be compiled as a module, and so this could be dangerous. Most - everyone wants to say Y here. - -+Ext2 extended attributes -+CONFIG_EXT2_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 extended attribute block sharing -+CONFIG_EXT2_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext2 extended user attributes -+CONFIG_EXT2_FS_XATTR_USER -+ This option enables extended user attributes on ext2. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 trusted extended attributes -+CONFIG_EXT2_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext2 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Ext3 journalling file system support (EXPERIMENTAL) - CONFIG_EXT3_FS - This is the journalling version of the Second extended file system -@@ -15274,6 +15307,39 @@ CONFIG_EXT3_FS - of your root partition (the one containing the directory /) cannot - be compiled as a module, and so this may be dangerous. - -+Ext3 extended attributes -+CONFIG_EXT3_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 extended attribute block sharing -+CONFIG_EXT3_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext3 extended user attributes -+CONFIG_EXT3_FS_XATTR_USER -+ This option enables extended user attributes on ext3. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 trusted extended attributes -+CONFIG_EXT3_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext3 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Journal Block Device support (JBD for ext3) (EXPERIMENTAL) - CONFIG_JBD - This is a generic journalling layer for block devices. It is ---- linux-2.4.20/arch/alpha/defconfig~linux-2.4.20-xattr-0.8.54 2001-11-20 07:19:42.000000000 +0800 -+++ linux-2.4.20-root/arch/alpha/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ALPHA=y - # CONFIG_UID16 is not set - # CONFIG_RWSEM_GENERIC_SPINLOCK is not set ---- linux-2.4.20/arch/alpha/kernel/entry.S~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:42.000000000 +0800 -+++ linux-2.4.20-root/arch/alpha/kernel/entry.S 2003-05-07 18:08:03.000000000 +0800 -@@ -1154,6 +1154,18 @@ sys_call_table: - .quad sys_readahead - .quad sys_ni_syscall /* 380, sys_security */ - .quad sys_tkill -+ .quad sys_setxattr -+ .quad sys_lsetxattr -+ .quad sys_fsetxattr -+ .quad sys_getxattr /* 385 */ -+ .quad sys_lgetxattr -+ .quad sys_fgetxattr -+ .quad sys_listxattr -+ .quad sys_llistxattr -+ .quad sys_flistxattr /* 390 */ -+ .quad sys_removexattr -+ .quad sys_lremovexattr -+ .quad sys_fremovexattr - - /* Remember to update everything, kids. */ - .ifne (. - sys_call_table) - (NR_SYSCALLS * 8) ---- linux-2.4.20/arch/arm/defconfig~linux-2.4.20-xattr-0.8.54 2001-05-20 08:43:05.000000000 +0800 -+++ linux-2.4.20-root/arch/arm/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ARM=y - # CONFIG_EISA is not set - # CONFIG_SBUS is not set ---- linux-2.4.20/arch/arm/kernel/calls.S~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:42.000000000 +0800 -+++ linux-2.4.20-root/arch/arm/kernel/calls.S 2003-05-07 18:08:03.000000000 +0800 -@@ -240,18 +240,18 @@ __syscall_start: - .long SYMBOL_NAME(sys_ni_syscall) /* Security */ - .long SYMBOL_NAME(sys_gettid) - /* 225 */ .long SYMBOL_NAME(sys_readahead) -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_setxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_lsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_getxattr */ --/* 230 */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_lgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_listxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_llistxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_flistxattr */ --/* 235 */ .long SYMBOL_NAME(sys_ni_syscall) /* sys_removexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_lremovexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* sys_fremovexattr */ -+ .long SYMBOL_NAME(sys_setxattr) -+ .long SYMBOL_NAME(sys_lsetxattr) -+ .long SYMBOL_NAME(sys_fsetxattr) -+ .long SYMBOL_NAME(sys_getxattr) -+/* 230 */ .long SYMBOL_NAME(sys_lgetxattr) -+ .long SYMBOL_NAME(sys_fgetxattr) -+ .long SYMBOL_NAME(sys_listxattr) -+ .long SYMBOL_NAME(sys_llistxattr) -+ .long SYMBOL_NAME(sys_flistxattr) -+/* 235 */ .long SYMBOL_NAME(sys_removexattr) -+ .long SYMBOL_NAME(sys_lremovexattr) -+ .long SYMBOL_NAME(sys_fremovexattr) - .long SYMBOL_NAME(sys_tkill) - /* - * Please check 2.5 _before_ adding calls here, ---- linux-2.4.20/arch/i386/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-root/arch/i386/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_X86=y - CONFIG_ISA=y - # CONFIG_SBUS is not set ---- linux-2.4.20/arch/ia64/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:09.000000000 +0800 -+++ linux-2.4.20-root/arch/ia64/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options ---- linux-2.4.20/arch/m68k/defconfig~linux-2.4.20-xattr-0.8.54 2000-06-20 03:56:08.000000000 +0800 -+++ linux-2.4.20-root/arch/m68k/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_UID16=y - - # ---- linux-2.4.20/arch/mips/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:10.000000000 +0800 -+++ linux-2.4.20-root/arch/mips/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - CONFIG_MIPS32=y - # CONFIG_MIPS64 is not set ---- linux-2.4.20/arch/mips64/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:10.000000000 +0800 -+++ linux-2.4.20-root/arch/mips64/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - # CONFIG_MIPS32 is not set - CONFIG_MIPS64=y ---- linux-2.4.20/arch/s390/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/s390/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set ---- linux-2.4.20/arch/s390/kernel/entry.S~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/s390/kernel/entry.S 2003-05-07 18:08:03.000000000 +0800 -@@ -558,18 +558,18 @@ sys_call_table: - .long sys_fcntl64 - .long sys_ni_syscall - .long sys_ni_syscall -- .long sys_ni_syscall /* 224 - reserved for setxattr */ -- .long sys_ni_syscall /* 225 - reserved for lsetxattr */ -- .long sys_ni_syscall /* 226 - reserved for fsetxattr */ -- .long sys_ni_syscall /* 227 - reserved for getxattr */ -- .long sys_ni_syscall /* 228 - reserved for lgetxattr */ -- .long sys_ni_syscall /* 229 - reserved for fgetxattr */ -- .long sys_ni_syscall /* 230 - reserved for listxattr */ -- .long sys_ni_syscall /* 231 - reserved for llistxattr */ -- .long sys_ni_syscall /* 232 - reserved for flistxattr */ -- .long sys_ni_syscall /* 233 - reserved for removexattr */ -- .long sys_ni_syscall /* 234 - reserved for lremovexattr */ -- .long sys_ni_syscall /* 235 - reserved for fremovexattr */ -+ .long sys_setxattr -+ .long sys_lsetxattr /* 225 */ -+ .long sys_fsetxattr -+ .long sys_getxattr -+ .long sys_lgetxattr -+ .long sys_fgetxattr -+ .long sys_listxattr /* 230 */ -+ .long sys_llistxattr -+ .long sys_flistxattr -+ .long sys_removexattr -+ .long sys_lremovexattr -+ .long sys_fremovexattr /* 235 */ - .long sys_gettid - .long sys_tkill - .rept 255-237 ---- linux-2.4.20/arch/s390x/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/s390x/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set ---- linux-2.4.20/arch/s390x/kernel/entry.S~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:11.000000000 +0800 -+++ linux-2.4.20-root/arch/s390x/kernel/entry.S 2003-05-07 18:08:03.000000000 +0800 -@@ -591,18 +591,18 @@ sys_call_table: - .long SYSCALL(sys_ni_syscall,sys32_fcntl64_wrapper) - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 224 - reserved for setxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 225 - reserved for lsetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 226 - reserved for fsetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 227 - reserved for getxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 228 - reserved for lgetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 229 - reserved for fgetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 230 - reserved for listxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 231 - reserved for llistxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 232 - reserved for flistxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 233 - reserved for removexattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 234 - reserved for lremovexattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 235 - reserved for fremovexattr */ -+ .long SYSCALL(sys_setxattr,sys32_setxattr_wrapper) -+ .long SYSCALL(sys_lsetxattr,sys32_lsetxattr_wrapper) /* 225 */ -+ .long SYSCALL(sys_fsetxattr,sys32_fsetxattr_wrapper) -+ .long SYSCALL(sys_getxattr,sys32_getxattr_wrapper) -+ .long SYSCALL(sys_lgetxattr,sys32_lgetxattr_wrapper) -+ .long SYSCALL(sys_fgetxattr,sys32_fgetxattr_wrapper) -+ .long SYSCALL(sys_listxattr,sys32_listxattr_wrapper) /* 230 */ -+ .long SYSCALL(sys_llistxattr,sys32_llistxattr_wrapper) -+ .long SYSCALL(sys_flistxattr,sys32_flistxattr_wrapper) -+ .long SYSCALL(sys_removexattr,sys32_removexattr_wrapper) -+ .long SYSCALL(sys_lremovexattr,sys32_lremovexattr_wrapper) -+ .long SYSCALL(sys_fremovexattr,sys32_fremovexattr_wrapper)/* 235 */ - .long SYSCALL(sys_gettid,sys_gettid) - .long SYSCALL(sys_tkill,sys_tkill) - .rept 255-237 ---- linux-2.4.20/arch/s390x/kernel/wrapper32.S~linux-2.4.20-xattr-0.8.54 2002-02-26 03:37:56.000000000 +0800 -+++ linux-2.4.20-root/arch/s390x/kernel/wrapper32.S 2003-05-07 18:08:03.000000000 +0800 -@@ -1091,3 +1091,95 @@ sys32_fstat64_wrapper: - llgtr %r3,%r3 # struct stat64 * - llgfr %r4,%r4 # long - jg sys32_fstat64 # branch to system call -+ -+ .globl sys32_setxattr_wrapper -+sys32_setxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_setxattr -+ -+ .globl sys32_lsetxattr_wrapper -+sys32_lsetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_lsetxattr -+ -+ .globl sys32_fsetxattr_wrapper -+sys32_fsetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_fsetxattr -+ -+ .globl sys32_getxattr_wrapper -+sys32_getxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_getxattr -+ -+ .globl sys32_lgetxattr_wrapper -+sys32_lgetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_lgetxattr -+ -+ .globl sys32_fgetxattr_wrapper -+sys32_fgetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_fgetxattr -+ -+ .globl sys32_listxattr_wrapper -+sys32_listxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_listxattr -+ -+ .globl sys32_llistxattr_wrapper -+sys32_llistxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_llistxattr -+ -+ .globl sys32_flistxattr_wrapper -+sys32_flistxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_flistxattr -+ -+ .globl sys32_removexattr_wrapper -+sys32_removexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_removexattr -+ -+ .globl sys32_lremovexattr_wrapper -+sys32_lremovexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_lremovexattr -+ -+ .globl sys32_fremovexattr_wrapper -+sys32_fremovexattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ jg sys_fremovexattr -+ -+ ---- linux-2.4.20/arch/sparc64/defconfig~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:12.000000000 +0800 -+++ linux-2.4.20-root/arch/sparc64/defconfig 2003-05-07 18:08:03.000000000 +0800 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options ---- linux-2.4.20/fs/Config.in~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/Config.in 2003-05-07 18:08:03.000000000 +0800 -@@ -25,6 +25,11 @@ dep_mbool ' Debug Befs' CONFIG_BEFS_DEB - dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL - - tristate 'Ext3 journalling file system support' CONFIG_EXT3_FS -+dep_mbool ' Ext3 extended attributes' CONFIG_EXT3_FS_XATTR $CONFIG_EXT3_FS -+dep_bool ' Ext3 extended attribute block sharing' \ -+ CONFIG_EXT3_FS_XATTR_SHARING $CONFIG_EXT3_FS_XATTR -+dep_bool ' Ext3 extended user attributes' \ -+ CONFIG_EXT3_FS_XATTR_USER $CONFIG_EXT3_FS_XATTR - # CONFIG_JBD could be its own option (even modular), but until there are - # other users than ext3, we will simply make it be the same as CONFIG_EXT3_FS - # dep_tristate ' Journal Block Device support (JBD for ext3)' CONFIG_JBD $CONFIG_EXT3_FS -@@ -84,6 +89,11 @@ dep_mbool ' QNX4FS write support (DANGE - tristate 'ROM file system support' CONFIG_ROMFS_FS - - tristate 'Second extended fs support' CONFIG_EXT2_FS -+dep_mbool ' Ext2 extended attributes' CONFIG_EXT2_FS_XATTR $CONFIG_EXT2_FS -+dep_bool ' Ext2 extended attribute block sharing' \ -+ CONFIG_EXT2_FS_XATTR_SHARING $CONFIG_EXT2_FS_XATTR -+dep_bool ' Ext2 extended user attributes' \ -+ CONFIG_EXT2_FS_XATTR_USER $CONFIG_EXT2_FS_XATTR - - tristate 'System V/Xenix/V7/Coherent file system support' CONFIG_SYSV_FS - -@@ -155,6 +165,10 @@ else - define_tristate CONFIG_ZISOFS_FS n - fi - -+# Meta block cache for Extended Attributes (ext2/ext3) -+#tristate 'Meta block cache' CONFIG_FS_MBCACHE -+define_tristate CONFIG_FS_MBCACHE y -+ - mainmenu_option next_comment - comment 'Partition Types' - source fs/partitions/Config.in ---- linux-2.4.20/fs/Makefile~linux-2.4.20-xattr-0.8.54 2003-05-05 19:00:58.000000000 +0800 -+++ linux-2.4.20-root/fs/Makefile 2003-05-07 18:08:03.000000000 +0800 -@@ -79,6 +79,9 @@ obj-y += binfmt_script.o - - obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o - -+export-objs += mbcache.o -+obj-$(CONFIG_FS_MBCACHE) += mbcache.o -+ - # persistent filesystems - obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) - ---- linux-2.4.20/fs/ext2/Makefile~linux-2.4.20-xattr-0.8.54 2001-10-11 23:05:18.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/Makefile 2003-05-07 18:08:03.000000000 +0800 -@@ -13,4 +13,8 @@ obj-y := balloc.o bitmap.o dir.o file - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make ---- linux-2.4.20/fs/ext2/file.c~linux-2.4.20-xattr-0.8.54 2001-10-11 23:05:18.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/file.c 2003-05-07 18:08:03.000000000 +0800 -@@ -20,6 +20,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/sched.h> - - /* -@@ -51,4 +52,8 @@ struct file_operations ext2_file_operati - - struct inode_operations ext2_file_inode_operations = { - truncate: ext2_truncate, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- linux-2.4.20/fs/ext2/ialloc.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/ialloc.c 2003-05-07 18:08:03.000000000 +0800 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/locks.h> - #include <linux/quotaops.h> - -@@ -167,6 +168,7 @@ void ext2_free_inode (struct inode * ino - */ - if (!is_bad_inode(inode)) { - /* Quota is already initialized in iput() */ -+ ext2_xattr_delete_inode(inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - } ---- linux-2.4.20/fs/ext2/inode.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/inode.c 2003-05-07 18:08:03.000000000 +0800 -@@ -39,6 +39,18 @@ MODULE_LICENSE("GPL"); - static int ext2_update_inode(struct inode * inode, int do_sync); - - /* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext2_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext2_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ -+/* - * Called at each iput() - */ - void ext2_put_inode (struct inode * inode) -@@ -53,9 +65,7 @@ void ext2_delete_inode (struct inode * i - { - lock_kernel(); - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - inode->u.ext2_i.i_dtime = CURRENT_TIME; - mark_inode_dirty(inode); -@@ -801,6 +811,8 @@ void ext2_truncate (struct inode * inode - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext2_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -888,8 +900,7 @@ void ext2_read_inode (struct inode * ino - unsigned long offset; - struct ext2_group_desc * gdp; - -- if ((inode->i_ino != EXT2_ROOT_INO && inode->i_ino != EXT2_ACL_IDX_INO && -- inode->i_ino != EXT2_ACL_DATA_INO && -+ if ((inode->i_ino != EXT2_ROOT_INO && - inode->i_ino < EXT2_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu(inode->i_sb->u.ext2_sb.s_es->s_inodes_count)) { - ext2_error (inode->i_sb, "ext2_read_inode", -@@ -974,10 +985,7 @@ void ext2_read_inode (struct inode * ino - for (block = 0; block < EXT2_N_BLOCKS; block++) - inode->u.ext2_i.i_data[block] = raw_inode->i_block[block]; - -- if (inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext2_file_inode_operations; - inode->i_fop = &ext2_file_operations; - inode->i_mapping->a_ops = &ext2_aops; -@@ -986,15 +994,17 @@ void ext2_read_inode (struct inode * ino - inode->i_fop = &ext2_dir_operations; - inode->i_mapping->a_ops = &ext2_aops; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext2_inode_is_fast_symlink(inode)) - inode->i_op = &ext2_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - } -- } else -+ } else { -+ inode->i_op = &ext2_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(raw_inode->i_block[0])); -+ } - brelse (bh); - inode->i_attr_flags = 0; - if (inode->u.ext2_i.i_flags & EXT2_SYNC_FL) { ---- linux-2.4.20/fs/ext2/namei.c~linux-2.4.20-xattr-0.8.54 2001-10-04 13:57:36.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/namei.c 2003-05-07 18:08:03.000000000 +0800 -@@ -31,6 +31,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/pagemap.h> - - /* -@@ -136,7 +137,7 @@ static int ext2_symlink (struct inode * - - if (l > sizeof (inode->u.ext2_i.i_data)) { - /* slow symlink */ -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - err = block_symlink(inode, symname, l); - if (err) -@@ -345,4 +346,15 @@ struct inode_operations ext2_dir_inode_o - rmdir: ext2_rmdir, - mknod: ext2_mknod, - rename: ext2_rename, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ -+struct inode_operations ext2_special_inode_operations = { -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- linux-2.4.20/fs/ext2/super.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/super.c 2003-05-07 18:08:03.000000000 +0800 -@@ -21,6 +21,7 @@ - #include <linux/string.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -125,6 +126,7 @@ void ext2_put_super (struct super_block - int db_count; - int i; - -+ ext2_xattr_put_super(sb); - if (!(sb->s_flags & MS_RDONLY)) { - struct ext2_super_block *es = EXT2_SB(sb)->s_es; - -@@ -175,6 +177,13 @@ static int parse_options (char * options - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -424,6 +433,9 @@ struct super_block * ext2_read_super (st - blocksize = BLOCK_SIZE; - - sb->u.ext2_sb.s_mount_opt = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ /* set_opt (sb->u.ext2_sb.s_mount_opt, XATTR_USER); */ -+#endif - if (!parse_options ((char *) data, &sb_block, &resuid, &resgid, - &sb->u.ext2_sb.s_mount_opt)) { - return NULL; -@@ -813,12 +825,27 @@ static DECLARE_FSTYPE_DEV(ext2_fs_type, - - static int __init init_ext2_fs(void) - { -- return register_filesystem(&ext2_fs_type); -+ int error = init_ext2_xattr(); -+ if (error) -+ return error; -+ error = init_ext2_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext2_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext2_xattr_user(); -+fail: -+ exit_ext2_xattr(); -+ return error; - } - - static void __exit exit_ext2_fs(void) - { - unregister_filesystem(&ext2_fs_type); -+ exit_ext2_xattr_user(); -+ exit_ext2_xattr(); - } - - EXPORT_NO_SYMBOLS; ---- linux-2.4.20/fs/ext2/symlink.c~linux-2.4.20-xattr-0.8.54 2000-09-28 04:41:33.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/symlink.c 2003-05-07 18:08:03.000000000 +0800 -@@ -19,6 +19,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - - static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -32,7 +33,20 @@ static int ext2_follow_link(struct dentr - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext2_symlink_inode_operations = { -+ readlink: page_readlink, -+ follow_link: page_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ - struct inode_operations ext2_fast_symlink_inode_operations = { - readlink: ext2_readlink, - follow_link: ext2_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/xattr.c 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,1212 @@ -+/* -+ * linux/fs/ext2/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT2_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT2_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext2_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+/* These symbols may be needed by a module. */ -+EXPORT_SYMBOL(ext2_xattr_register); -+EXPORT_SYMBOL(ext2_xattr_unregister); -+EXPORT_SYMBOL(ext2_xattr_get); -+EXPORT_SYMBOL(ext2_xattr_list); -+EXPORT_SYMBOL(ext2_xattr_set); -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext2_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext2_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT2_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext2_xattr_set2(struct inode *, struct buffer_head *, -+ struct ext2_xattr_header *); -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+static int ext2_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext2_xattr_cache_find(struct inode *, -+ struct ext2_xattr_header *); -+static void ext2_xattr_cache_remove(struct buffer_head *); -+static void ext2_xattr_rehash(struct ext2_xattr_header *, -+ struct ext2_xattr_entry *); -+ -+static struct mb_cache *ext2_xattr_cache; -+ -+#else -+# define ext2_xattr_cache_insert(bh) 0 -+# define ext2_xattr_cache_find(inode, header) NULL -+# define ext2_xattr_cache_remove(bh) while(0) {} -+# define ext2_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext2_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext2_xattr_sem); -+ -+static inline int -+ext2_xattr_new_block(struct inode *inode, int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block) + -+ EXT2_I(inode)->i_block_group * EXT2_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext2_new_block(inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext2_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext2_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext2_xattr_free_block(struct inode * inode, unsigned long block) -+{ -+ ext2_free_blocks(inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext2_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext2_xattr_free_block(inode, block) \ -+ ext2_free_blocks(inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext2_xattr_handler *ext2_xattr_handlers[EXT2_XATTR_INDEX_MAX]; -+rwlock_t ext2_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext2_xattr_register(int name_index, struct ext2_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ if (!ext2_xattr_handlers[name_index-1]) { -+ ext2_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext2_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext2_xattr_unregister(int name_index, struct ext2_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ ext2_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext2_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static struct ext2_xattr_handler * -+ext2_xattr_resolve_name(const char **name) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext2_handler_lock); -+ for (i=0; i<EXT2_XATTR_INDEX_MAX; i++) { -+ if (ext2_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext2_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext2_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext2_handler_lock); -+ return handler; -+} -+ -+static inline struct ext2_xattr_handler * -+ext2_xattr_handler(int name_index) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ read_lock(&ext2_handler_lock); -+ handler = ext2_xattr_handlers[name_index-1]; -+ read_unlock(&ext2_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext2_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext2_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT2_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT2_I(inode)->i_file_acl) -+ return 0; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT2_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext2_xattr_update_super_block(struct super_block *sb) -+{ -+ if (EXT2_HAS_COMPAT_FEATURE(sb, EXT2_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT2_SB(sb)->s_feature_compat |= EXT2_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT2_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT2_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ mark_buffer_dirty(EXT2_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext2_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_header *header = NULL; -+ struct ext2_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT2_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext2_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(sb, "ext2_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext2_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT2_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT2_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT2_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext2_xattr_cache_remove(bh); -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT2_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT2_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT2_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT2_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext2_xattr_set2(inode, bh, NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT2_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT2_XATTR_PAD, 0, -+ EXT2_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext2_xattr_rehash(header, here); -+ -+ error = ext2_xattr_set2(inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext2_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext2_xattr_set(): Update the file system. -+ */ -+static int -+ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, -+ struct ext2_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext2_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext2_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext2_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT2_I(inode)->i_file_acl != 0; -+ int block = ext2_xattr_new_block(inode, &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+ ext2_xattr_free_block(inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext2_xattr_cache_insert(new_bh); -+ -+ ext2_xattr_update_super_block(sb); -+ } -+ mark_buffer_dirty(new_bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &new_bh); -+ wait_on_buffer(new_bh); -+ error = -EIO; -+ if (buffer_req(new_bh) && !buffer_uptodate(new_bh)) -+ goto cleanup; -+ } -+ } -+ -+ /* Update the inode. */ -+ EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ if (IS_SYNC(inode)) { -+ error = ext2_sync_inode (inode); -+ if (error) -+ goto cleanup; -+ } else -+ mark_inode_dirty(inode); -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext2_xattr_free_block(inode, old_bh->b_blocknr); -+ mark_buffer_clean(old_bh); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext2_xattr_quota_free(inode); -+ mark_buffer_dirty(old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT2_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext2_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext2_xattr_cache_remove(bh); -+ ext2_xattr_free_block(inode, block); -+ bforget(bh); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ mark_buffer_dirty(bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &bh); -+ wait_on_buffer(bh); -+ } -+ ext2_xattr_quota_free(inode); -+ } -+ EXT2_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext2_xattr_sem); -+} -+ -+/* -+ * ext2_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ mb_cache_shrink(ext2_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+/* -+ * ext2_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext2_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext2_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext2_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext2_xattr_cmp(struct ext2_xattr_header *header1, -+ struct ext2_xattr_header *header2) -+{ -+ struct ext2_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT2_XATTR_NEXT(entry1); -+ entry2 = EXT2_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext2_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext2_xattr_cache_find(struct inode *inode, struct ext2_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext2_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT2_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT2_XATTR_REFCOUNT_MAX); -+ } else if (!ext2_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext2_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext2_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext2_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext2_xattr_hash_entry(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT2_XATTR_ROUND) >> EXT2_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext2_xattr_rehash(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ struct ext2_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext2_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT2_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext2_xattr(void) -+{ -+ ext2_xattr_cache = mb_cache_create("ext2_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext2_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+ mb_cache_destroy(ext2_xattr_cache); -+} -+ -+#else /* CONFIG_EXT2_FS_XATTR_SHARING */ -+ -+int __init -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT2_FS_XATTR_SHARING */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/ext2/xattr_user.c 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,103 @@ -+/* -+ * linux/fs/ext2/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+ -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+# include <linux/ext2_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext2_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext2_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_get(inode, EXT2_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext2_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_set(inode, EXT2_XATTR_INDEX_USER, name, -+ value, size, flags); -+} -+ -+struct ext2_xattr_handler ext2_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext2_xattr_user_list, -+ get: ext2_xattr_user_get, -+ set: ext2_xattr_user_set, -+}; -+ -+int __init -+init_ext2_xattr_user(void) -+{ -+ return ext2_xattr_register(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -+ -+void -+exit_ext2_xattr_user(void) -+{ -+ ext2_xattr_unregister(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} ---- linux-2.4.20/fs/ext3/Makefile~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:02.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/Makefile 2003-05-07 18:10:33.000000000 +0800 -@@ -1,5 +1,5 @@ - # --# Makefile for the linux ext2-filesystem routines. -+# Makefile for the linux ext3-filesystem routines. - # - # Note! Dependencies are done automagically by 'make dep', which also - # removes any old dependencies. DON'T put your own dependencies here -@@ -9,10 +9,14 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make ---- linux-2.4.20/fs/ext3/file.c~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:02.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/file.c 2003-05-07 18:08:03.000000000 +0800 -@@ -23,6 +23,7 @@ - #include <linux/locks.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - #include <linux/ext3_jbd.h> - #include <linux/smp_lock.h> - -@@ -126,5 +127,9 @@ struct file_operations ext3_file_operati - struct inode_operations ext3_file_inode_operations = { - truncate: ext3_truncate, /* BKL held */ - setattr: ext3_setattr, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; - ---- linux-2.4.20/fs/ext3/ialloc.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/ialloc.c 2003-05-07 18:08:03.000000000 +0800 -@@ -17,6 +17,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/stat.h> - #include <linux/string.h> - #include <linux/locks.h> -@@ -216,6 +217,7 @@ void ext3_free_inode (handle_t *handle, - * as writing the quota to disk may need the lock as well. - */ - DQUOT_INIT(inode); -+ ext3_xattr_delete_inode(handle, inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - ---- linux-2.4.20/fs/ext3/inode.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/inode.c 2003-05-07 18:08:03.000000000 +0800 -@@ -39,6 +39,18 @@ - */ - #undef SEARCH_FROM_ZERO - -+/* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext3_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext3_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ - /* The ext3 forget function must perform a revoke if we are freeing data - * which has been journaled. Metadata (eg. indirect blocks) must be - * revoked in all cases. -@@ -48,7 +60,7 @@ - * still needs to be revoked. - */ - --static int ext3_forget(handle_t *handle, int is_metadata, -+int ext3_forget(handle_t *handle, int is_metadata, - struct inode *inode, struct buffer_head *bh, - int blocknr) - { -@@ -164,9 +176,7 @@ void ext3_delete_inode (struct inode * i - { - handle_t *handle; - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - - lock_kernel(); -@@ -1855,6 +1865,8 @@ void ext3_truncate(struct inode * inode) - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext3_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -2002,8 +2014,6 @@ int ext3_get_inode_loc (struct inode *in - struct ext3_group_desc * gdp; - - if ((inode->i_ino != EXT3_ROOT_INO && -- inode->i_ino != EXT3_ACL_IDX_INO && -- inode->i_ino != EXT3_ACL_DATA_INO && - inode->i_ino != EXT3_JOURNAL_INO && - inode->i_ino < EXT3_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu( -@@ -2130,10 +2140,7 @@ void ext3_read_inode(struct inode * inod - - brelse (iloc.bh); - -- if (inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; - inode->i_mapping->a_ops = &ext3_aops; -@@ -2141,15 +2148,17 @@ void ext3_read_inode(struct inode * inod - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - } -- } else -+ } else { -+ inode->i_op = &ext3_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(iloc.raw_inode->i_block[0])); -+ } - ext3_set_inode_flags(inode); - return; - ---- linux-2.4.20/fs/ext3/namei.c~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:05.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/namei.c 2003-05-07 18:08:03.000000000 +0800 -@@ -29,6 +29,7 @@ - #include <linux/sched.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/fcntl.h> - #include <linux/stat.h> - #include <linux/string.h> -@@ -1611,7 +1612,7 @@ static int ext3_mkdir(struct inode * dir - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR); -+ inode = ext3_new_inode (handle, dir, S_IFDIR | mode); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -1619,7 +1620,6 @@ static int ext3_mkdir(struct inode * dir - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; -- inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ -@@ -1646,9 +1646,6 @@ static int ext3_mkdir(struct inode * dir - BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata"); - ext3_journal_dirty_metadata(handle, dir_block); - brelse (dir_block); -- inode->i_mode = S_IFDIR | mode; -- if (dir->i_mode & S_ISGID) -- inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); - if (err) { -@@ -2017,7 +2014,7 @@ static int ext3_symlink (struct inode * - goto out_stop; - - if (l > sizeof (EXT3_I(inode)->i_data)) { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* - * block_symlink() calls back into ext3_prepare/commit_write. -@@ -2244,4 +2241,16 @@ struct inode_operations ext3_dir_inode_o - rmdir: ext3_rmdir, /* BKL held */ - mknod: ext3_mknod, /* BKL held */ - rename: ext3_rename, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; -+ -+struct inode_operations ext3_special_inode_operations = { -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ ---- linux-2.4.20/fs/ext3/super.c~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:02.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/super.c 2003-05-07 18:08:39.000000000 +0800 -@@ -24,6 +24,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -404,6 +405,7 @@ void ext3_put_super (struct super_block - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { - EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -@@ -499,6 +501,7 @@ static int parse_options (char * options - int is_remount) - { - unsigned long *mount_options = &sbi->s_mount_opt; -+ - uid_t *resuid = &sbi->s_resuid; - gid_t *resgid = &sbi->s_resgid; - char * this_char; -@@ -511,6 +514,13 @@ static int parse_options (char * options - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -928,6 +938,12 @@ struct super_block * ext3_read_super (st - sbi->s_mount_opt = 0; - sbi->s_resuid = EXT3_DEF_RESUID; - sbi->s_resgid = EXT3_DEF_RESGID; -+ -+ /* Default extended attribute flags */ -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ /* set_opt(sbi->s_mount_opt, XATTR_USER); */ -+#endif -+ - if (!parse_options ((char *) data, &sb_block, sbi, &journal_inum, 0)) { - sb->s_dev = 0; - goto out_fail; -@@ -1767,17 +1783,29 @@ static DECLARE_FSTYPE_DEV(ext3_fs_type, - - static int __init init_ext3_fs(void) - { -- return register_filesystem(&ext3_fs_type); -+ int error = init_ext3_xattr(); -+ if (error) -+ return error; -+ error = init_ext3_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext3_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext3_xattr_user(); -+fail: -+ exit_ext3_xattr(); -+ return error; - } - - static void __exit exit_ext3_fs(void) - { - unregister_filesystem(&ext3_fs_type); -+ exit_ext3_xattr_user(); -+ exit_ext3_xattr(); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); -- - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - MODULE_LICENSE("GPL"); ---- linux-2.4.20/fs/ext3/symlink.c~linux-2.4.20-xattr-0.8.54 2001-11-10 06:25:04.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/symlink.c 2003-05-07 18:08:03.000000000 +0800 -@@ -20,6 +20,7 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - - static int ext3_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -33,7 +34,20 @@ static int ext3_follow_link(struct dentr - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext3_symlink_inode_operations = { -+ readlink: page_readlink, /* BKL not held. Don't need */ -+ follow_link: page_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ - struct inode_operations ext3_fast_symlink_inode_operations = { - readlink: ext3_readlink, /* BKL not held. Don't need */ - follow_link: ext3_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/xattr.c 2003-05-07 18:09:23.000000000 +0800 -@@ -0,0 +1,1225 @@ -+/* -+ * linux/fs/ext3/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Ext3 code with a lot of help from Eric Jarman <ejarman@acm.org>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT3_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT3_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext3_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+#define EXT3_EA_USER "user." -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext3_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext3_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT3_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, -+ struct ext3_xattr_header *); -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+static int ext3_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext3_xattr_cache_find(struct inode *, -+ struct ext3_xattr_header *); -+static void ext3_xattr_cache_remove(struct buffer_head *); -+static void ext3_xattr_rehash(struct ext3_xattr_header *, -+ struct ext3_xattr_entry *); -+ -+static struct mb_cache *ext3_xattr_cache; -+ -+#else -+# define ext3_xattr_cache_insert(bh) 0 -+# define ext3_xattr_cache_find(inode, header) NULL -+# define ext3_xattr_cache_remove(bh) while(0) {} -+# define ext3_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext3_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext3_xattr_sem); -+ -+static inline int -+ext3_xattr_new_block(handle_t *handle, struct inode *inode, -+ int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + -+ EXT3_I(inode)->i_block_group * EXT3_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext3_new_block(handle, inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext3_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext3_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext3_xattr_free_block(handle_t *handle, struct inode * inode, -+ unsigned long block) -+{ -+ ext3_free_blocks(handle, inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext3_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext3_xattr_free_block(handle, inode, block) \ -+ ext3_free_blocks(handle, inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext3_xattr_handler *ext3_xattr_handlers[EXT3_XATTR_INDEX_MAX]; -+rwlock_t ext3_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext3_xattr_register(int name_index, struct ext3_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ if (!ext3_xattr_handlers[name_index-1]) { -+ ext3_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext3_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext3_xattr_unregister(int name_index, struct ext3_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ ext3_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext3_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static inline struct ext3_xattr_handler * -+ext3_xattr_resolve_name(const char **name) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext3_handler_lock); -+ for (i=0; i<EXT3_XATTR_INDEX_MAX; i++) { -+ if (ext3_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext3_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext3_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext3_handler_lock); -+ return handler; -+} -+ -+static inline struct ext3_xattr_handler * -+ext3_xattr_handler(int name_index) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ read_lock(&ext3_handler_lock); -+ handler = ext3_xattr_handlers[name_index-1]; -+ read_unlock(&ext3_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext3_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext3_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT3_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT3_I(inode)->i_file_acl) -+ return 0; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext3_xattr_update_super_block(handle_t *handle, -+ struct super_block *sb) -+{ -+ if (EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT3_SB(sb)->s_feature_compat |= EXT3_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT3_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT3_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext3_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_header *header = NULL; -+ struct ext3_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT3_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext3_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(sb, "ext3_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT3_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT3_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT3_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext3_xattr_cache_remove(bh); -+ error = ext3_journal_get_write_access(handle, bh); -+ if (error) -+ goto cleanup; -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT3_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT3_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT3_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT3_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext3_xattr_set2(handle, inode, bh,NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT3_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT3_XATTR_PAD, 0, -+ EXT3_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext3_xattr_rehash(header, here); -+ -+ error = ext3_xattr_set2(handle, inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext3_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext3_xattr_set(): Update the file system. -+ */ -+static int -+ext3_xattr_set2(handle_t *handle, struct inode *inode, -+ struct buffer_head *old_bh, struct ext3_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext3_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext3_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ error = ext3_journal_get_write_access(handle, new_bh); -+ if (error) -+ goto cleanup; -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext3_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT3_I(inode)->i_file_acl != 0; -+ int block = ext3_xattr_new_block(handle, inode, -+ &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+getblk_failed: ext3_xattr_free_block(handle, inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ error = ext3_journal_get_create_access(handle, new_bh); -+ if (error) { -+ unlock_buffer(new_bh); -+ goto getblk_failed; -+ } -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext3_xattr_cache_insert(new_bh); -+ -+ ext3_xattr_update_super_block(handle, sb); -+ } -+ error = ext3_journal_dirty_metadata(handle, new_bh); -+ if (error) -+ goto cleanup; -+ } -+ -+ /* Update the inode. */ -+ EXT3_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, inode); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ error = ext3_journal_get_write_access(handle, old_bh); -+ if (error) -+ goto cleanup; -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext3_xattr_free_block(handle, inode, old_bh->b_blocknr); -+ -+ /* ext3_forget() calls bforget() for us, but we -+ let our caller release old_bh, so we need to -+ duplicate the handle before. */ -+ get_bh(old_bh); -+ ext3_forget(handle, 1, inode, old_bh,old_bh->b_blocknr); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext3_xattr_quota_free(inode); -+ ext3_journal_dirty_metadata(handle, old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT3_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext3_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ext3_journal_get_write_access(handle, bh); -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext3_xattr_cache_remove(bh); -+ ext3_xattr_free_block(handle, inode, block); -+ ext3_forget(handle, 1, inode, bh, block); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ ext3_journal_dirty_metadata(handle, bh); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ ext3_xattr_quota_free(inode); -+ } -+ EXT3_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext3_xattr_sem); -+} -+ -+/* -+ * ext3_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ mb_cache_shrink(ext3_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+/* -+ * ext3_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext3_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext3_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext3_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext3_xattr_cmp(struct ext3_xattr_header *header1, -+ struct ext3_xattr_header *header2) -+{ -+ struct ext3_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT3_XATTR_NEXT(entry1); -+ entry2 = EXT3_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext3_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext3_xattr_cache_find(struct inode *inode, struct ext3_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext3_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT3_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT3_XATTR_REFCOUNT_MAX); -+ } else if (!ext3_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext3_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext3_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext3_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext3_xattr_hash_entry(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT3_XATTR_ROUND) >> EXT3_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext3_xattr_rehash(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ struct ext3_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext3_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT3_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext3_xattr(void) -+{ -+ ext3_xattr_cache = mb_cache_create("ext3_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext3_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+ if (ext3_xattr_cache) -+ mb_cache_destroy(ext3_xattr_cache); -+ ext3_xattr_cache = NULL; -+} -+ -+#else /* CONFIG_EXT3_FS_XATTR_SHARING */ -+ -+int __init -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_SHARING */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/ext3/xattr_user.c 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,111 @@ -+/* -+ * linux/fs/ext3/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+# include <linux/ext3_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext3_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext3_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext3_xattr_get(inode, EXT3_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext3_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ handle_t *handle; -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ error = ext3_xattr_set(handle, inode, EXT3_XATTR_INDEX_USER, name, -+ value, size, flags); -+ ext3_journal_stop(handle, inode); -+ -+ return error; -+} -+ -+struct ext3_xattr_handler ext3_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext3_xattr_user_list, -+ get: ext3_xattr_user_get, -+ set: ext3_xattr_user_set, -+}; -+ -+int __init -+init_ext3_xattr_user(void) -+{ -+ return ext3_xattr_register(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} -+ -+void -+exit_ext3_xattr_user(void) -+{ -+ ext3_xattr_unregister(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} ---- linux-2.4.20/fs/jfs/jfs_xattr.h~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/jfs/jfs_xattr.h 2003-05-07 18:08:03.000000000 +0800 -@@ -52,8 +52,10 @@ struct jfs_ea_list { - #define END_EALIST(ealist) \ - ((struct jfs_ea *) (((char *) (ealist)) + EALIST_SIZE(ealist))) - --extern int __jfs_setxattr(struct inode *, const char *, void *, size_t, int); --extern int jfs_setxattr(struct dentry *, const char *, void *, size_t, int); -+extern int __jfs_setxattr(struct inode *, const char *, const void *, size_t, -+ int); -+extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, -+ int); - extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t); - extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t); - extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); ---- linux-2.4.20/fs/jfs/xattr.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/fs/jfs/xattr.c 2003-05-07 18:08:03.000000000 +0800 -@@ -641,7 +641,7 @@ static int ea_put(struct inode *inode, s - } - - static int can_set_xattr(struct inode *inode, const char *name, -- void *value, size_t value_len) -+ const void *value, size_t value_len) - { - if (IS_RDONLY(inode)) - return -EROFS; -@@ -660,7 +660,7 @@ static int can_set_xattr(struct inode *i - return permission(inode, MAY_WRITE); - } - --int __jfs_setxattr(struct inode *inode, const char *name, void *value, -+int __jfs_setxattr(struct inode *inode, const char *name, const void *value, - size_t value_len, int flags) - { - struct jfs_ea_list *ealist; -@@ -799,7 +799,7 @@ int __jfs_setxattr(struct inode *inode, - return rc; - } - --int jfs_setxattr(struct dentry *dentry, const char *name, void *value, -+int jfs_setxattr(struct dentry *dentry, const char *name, const void *value, - size_t value_len, int flags) - { - if (value == NULL) { /* empty EA, do not remove */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/fs/mbcache.c 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,648 @@ -+/* -+ * linux/fs/mbcache.c -+ * (C) 2001-2002 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+/* -+ * Filesystem Meta Information Block Cache (mbcache) -+ * -+ * The mbcache caches blocks of block devices that need to be located -+ * by their device/block number, as well as by other criteria (such -+ * as the block's contents). -+ * -+ * There can only be one cache entry in a cache per device and block number. -+ * Additional indexes need not be unique in this sense. The number of -+ * additional indexes (=other criteria) can be hardwired at compile time -+ * or specified at cache create time. -+ * -+ * Each cache entry is of fixed size. An entry may be `valid' or `invalid' -+ * in the cache. A valid entry is in the main hash tables of the cache, -+ * and may also be in the lru list. An invalid entry is not in any hashes -+ * or lists. -+ * -+ * A valid cache entry is only in the lru list if no handles refer to it. -+ * Invalid cache entries will be freed when the last handle to the cache -+ * entry is released. Entries that cannot be freed immediately are put -+ * back on the lru list. -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+ -+#include <linux/fs.h> -+#include <linux/slab.h> -+#include <linux/sched.h> -+#include <linux/cache_def.h> -+#include <linux/version.h> -+#include <linux/init.h> -+#include <linux/mbcache.h> -+ -+ -+#ifdef MB_CACHE_DEBUG -+# define mb_debug(f...) do { \ -+ printk(KERN_DEBUG f); \ -+ printk("\n"); \ -+ } while (0) -+#define mb_assert(c) do { if (!(c)) \ -+ printk(KERN_ERR "assertion " #c " failed\n"); \ -+ } while(0) -+#else -+# define mb_debug(f...) do { } while(0) -+# define mb_assert(c) do { } while(0) -+#endif -+#define mb_error(f...) do { \ -+ printk(KERN_ERR f); \ -+ printk("\n"); \ -+ } while(0) -+ -+MODULE_AUTHOR("Andreas Gruenbacher <a.gruenbacher@computer.org>"); -+MODULE_DESCRIPTION("Meta block cache (for extended attributes)"); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) -+MODULE_LICENSE("GPL"); -+#endif -+ -+EXPORT_SYMBOL(mb_cache_create); -+EXPORT_SYMBOL(mb_cache_shrink); -+EXPORT_SYMBOL(mb_cache_destroy); -+EXPORT_SYMBOL(mb_cache_entry_alloc); -+EXPORT_SYMBOL(mb_cache_entry_insert); -+EXPORT_SYMBOL(mb_cache_entry_release); -+EXPORT_SYMBOL(mb_cache_entry_takeout); -+EXPORT_SYMBOL(mb_cache_entry_free); -+EXPORT_SYMBOL(mb_cache_entry_dup); -+EXPORT_SYMBOL(mb_cache_entry_get); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+EXPORT_SYMBOL(mb_cache_entry_find_first); -+EXPORT_SYMBOL(mb_cache_entry_find_next); -+#endif -+ -+ -+/* -+ * Global data: list of all mbcache's, lru list, and a spinlock for -+ * accessing cache data structures on SMP machines. The lru list is -+ * global across all mbcaches. -+ */ -+ -+static LIST_HEAD(mb_cache_list); -+static LIST_HEAD(mb_cache_lru_list); -+static spinlock_t mb_cache_spinlock = SPIN_LOCK_UNLOCKED; -+ -+static inline int -+mb_cache_indexes(struct mb_cache *cache) -+{ -+#ifdef MB_CACHE_INDEXES_COUNT -+ return MB_CACHE_INDEXES_COUNT; -+#else -+ return cache->c_indexes_count; -+#endif -+} -+ -+/* -+ * What the mbcache registers as to get shrunk dynamically. -+ */ -+ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask); -+ -+static struct cache_definition mb_cache_definition = { -+ "mb_cache", -+ mb_cache_memory_pressure -+}; -+ -+ -+static inline int -+__mb_cache_entry_is_hashed(struct mb_cache_entry *ce) -+{ -+ return !list_empty(&ce->e_block_list); -+} -+ -+ -+static inline void -+__mb_cache_entry_unhash(struct mb_cache_entry *ce) -+{ -+ int n; -+ -+ if (__mb_cache_entry_is_hashed(ce)) { -+ list_del_init(&ce->e_block_list); -+ for (n=0; n<mb_cache_indexes(ce->e_cache); n++) -+ list_del(&ce->e_indexes[n].o_list); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_forget(struct mb_cache_entry *ce, int gfp_mask) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ -+ mb_assert(atomic_read(&ce->e_used) == 0); -+ if (cache->c_op.free && cache->c_op.free(ce, gfp_mask)) { -+ /* free failed -- put back on the lru list -+ for freeing later. */ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&ce->e_lru_list, &mb_cache_lru_list); -+ spin_unlock(&mb_cache_spinlock); -+ } else { -+ kmem_cache_free(cache->c_entry_cache, ce); -+ atomic_dec(&cache->c_entry_count); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_release_unlock(struct mb_cache_entry *ce) -+{ -+ if (atomic_dec_and_test(&ce->e_used)) { -+ if (__mb_cache_entry_is_hashed(ce)) -+ list_add_tail(&ce->e_lru_list, &mb_cache_lru_list); -+ else { -+ spin_unlock(&mb_cache_spinlock); -+ __mb_cache_entry_forget(ce, GFP_KERNEL); -+ return; -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_memory_pressure() memory pressure callback -+ * -+ * This function is called by the kernel memory management when memory -+ * gets low. -+ * -+ * @priority: Amount by which to shrink the cache (0 = highes priority) -+ * @gfp_mask: (ignored) -+ */ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int count = 0; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &mb_cache_list) { -+ struct mb_cache *cache = -+ list_entry(l, struct mb_cache, c_cache_list); -+ mb_debug("cache %s (%d)", cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ count += atomic_read(&cache->c_entry_count); -+ } -+ mb_debug("trying to free %d of %d entries", -+ count / (priority ? priority : 1), count); -+ if (priority) -+ count /= priority; -+ while (count-- && !list_empty(&mb_cache_lru_list)) { -+ struct mb_cache_entry *ce = -+ list_entry(mb_cache_lru_list.next, -+ struct mb_cache_entry, e_lru_list); -+ list_del(&ce->e_lru_list); -+ __mb_cache_entry_unhash(ce); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), gfp_mask); -+ } -+} -+ -+ -+/* -+ * mb_cache_create() create a new cache -+ * -+ * All entries in one cache are equal size. Cache entries may be from -+ * multiple devices. If this is the first mbcache created, registers -+ * the cache with kernel memory management. Returns NULL if no more -+ * memory was available. -+ * -+ * @name: name of the cache (informal) -+ * @cache_op: contains the callback called when freeing a cache entry -+ * @entry_size: The size of a cache entry, including -+ * struct mb_cache_entry -+ * @indexes_count: number of additional indexes in the cache. Must equal -+ * MB_CACHE_INDEXES_COUNT if the number of indexes is -+ * hardwired. -+ * @bucket_count: number of hash buckets -+ */ -+struct mb_cache * -+mb_cache_create(const char *name, struct mb_cache_op *cache_op, -+ size_t entry_size, int indexes_count, int bucket_count) -+{ -+ int m=0, n; -+ struct mb_cache *cache = NULL; -+ -+ if(entry_size < sizeof(struct mb_cache_entry) + -+ indexes_count * sizeof(struct mb_cache_entry_index)) -+ return NULL; -+ -+ MOD_INC_USE_COUNT; -+ cache = kmalloc(sizeof(struct mb_cache) + -+ indexes_count * sizeof(struct list_head), GFP_KERNEL); -+ if (!cache) -+ goto fail; -+ cache->c_name = name; -+ cache->c_op.free = NULL; -+ if (cache_op) -+ cache->c_op.free = cache_op->free; -+ atomic_set(&cache->c_entry_count, 0); -+ cache->c_bucket_count = bucket_count; -+#ifdef MB_CACHE_INDEXES_COUNT -+ mb_assert(indexes_count == MB_CACHE_INDEXES_COUNT); -+#else -+ cache->c_indexes_count = indexes_count; -+#endif -+ cache->c_block_hash = kmalloc(bucket_count * sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_block_hash) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_block_hash[n]); -+ for (m=0; m<indexes_count; m++) { -+ cache->c_indexes_hash[m] = kmalloc(bucket_count * -+ sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_indexes_hash[m]) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_indexes_hash[m][n]); -+ } -+ cache->c_entry_cache = kmem_cache_create(name, entry_size, 0, -+ 0 /*SLAB_POISON | SLAB_RED_ZONE*/, NULL, NULL); -+ if (!cache->c_entry_cache) -+ goto fail; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&cache->c_cache_list, &mb_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ return cache; -+ -+fail: -+ if (cache) { -+ while (--m >= 0) -+ kfree(cache->c_indexes_hash[m]); -+ if (cache->c_block_hash) -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ } -+ MOD_DEC_USE_COUNT; -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_shrink() -+ * -+ * Removes all cache entires of a device from the cache. All cache entries -+ * currently in use cannot be freed, and thus remain in the cache. -+ * -+ * @cache: which cache to shrink -+ * @dev: which device's cache entries to shrink -+ */ -+void -+mb_cache_shrink(struct mb_cache *cache, kdev_t dev) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_dev == dev) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+} -+ -+ -+/* -+ * mb_cache_destroy() -+ * -+ * Shrinks the cache to its minimum possible size (hopefully 0 entries), -+ * and then destroys it. If this was the last mbcache, un-registers the -+ * mbcache from kernel memory management. -+ */ -+void -+mb_cache_destroy(struct mb_cache *cache) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_cache == cache) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ list_del(&cache->c_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+ -+ if (atomic_read(&cache->c_entry_count) > 0) { -+ mb_error("cache %s: %d orphaned entries", -+ cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ } -+ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)) -+ /* We don't have kmem_cache_destroy() in 2.2.x */ -+ kmem_cache_shrink(cache->c_entry_cache); -+#else -+ kmem_cache_destroy(cache->c_entry_cache); -+#endif -+ for (n=0; n < mb_cache_indexes(cache); n++) -+ kfree(cache->c_indexes_hash[n]); -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ -+ MOD_DEC_USE_COUNT; -+} -+ -+ -+/* -+ * mb_cache_entry_alloc() -+ * -+ * Allocates a new cache entry. The new entry will not be valid initially, -+ * and thus cannot be looked up yet. It should be filled with data, and -+ * then inserted into the cache using mb_cache_entry_insert(). Returns NULL -+ * if no more memory was available. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_alloc(struct mb_cache *cache) -+{ -+ struct mb_cache_entry *ce; -+ -+ atomic_inc(&cache->c_entry_count); -+ ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL); -+ if (ce) { -+ INIT_LIST_HEAD(&ce->e_lru_list); -+ INIT_LIST_HEAD(&ce->e_block_list); -+ ce->e_cache = cache; -+ atomic_set(&ce->e_used, 1); -+ } -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_insert() -+ * -+ * Inserts an entry that was allocated using mb_cache_entry_alloc() into -+ * the cache. After this, the cache entry can be looked up, but is not yet -+ * in the lru list as the caller still holds a handle to it. Returns 0 on -+ * success, or -EBUSY if a cache entry for that device + inode exists -+ * already (this may happen after a failed lookup, if another process has -+ * inserted the same cache entry in the meantime). -+ * -+ * @dev: device the cache entry belongs to -+ * @block: block number -+ * @keys: array of additional keys. There must be indexes_count entries -+ * in the array (as specified when creating the cache). -+ */ -+int -+mb_cache_entry_insert(struct mb_cache_entry *ce, kdev_t dev, -+ unsigned long block, unsigned int keys[]) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ int error = -EBUSY, n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) -+ goto out; -+ } -+ __mb_cache_entry_unhash(ce); -+ ce->e_dev = dev; -+ ce->e_block = block; -+ list_add(&ce->e_block_list, &cache->c_block_hash[bucket]); -+ for (n=0; n<mb_cache_indexes(cache); n++) { -+ ce->e_indexes[n].o_key = keys[n]; -+ bucket = keys[n] % cache->c_bucket_count; -+ list_add(&ce->e_indexes[n].o_list, -+ &cache->c_indexes_hash[n][bucket]); -+ } -+out: -+ spin_unlock(&mb_cache_spinlock); -+ return error; -+} -+ -+ -+/* -+ * mb_cache_entry_release() -+ * -+ * Release a handle to a cache entry. When the last handle to a cache entry -+ * is released it is either freed (if it is invalid) or otherwise inserted -+ * in to the lru list. -+ */ -+void -+mb_cache_entry_release(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_takeout() -+ * -+ * Take a cache entry out of the cache, making it invalid. The entry can later -+ * be re-inserted using mb_cache_entry_insert(), or released using -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_takeout(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_entry_free() -+ * -+ * This is equivalent to the sequence mb_cache_entry_takeout() -- -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_free(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_dup() -+ * -+ * Duplicate a handle to a cache entry (does not duplicate the cache entry -+ * itself). After the call, both the old and the new handle must be released. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_dup(struct mb_cache_entry *ce) -+{ -+ atomic_inc(&ce->e_used); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_get() -+ * -+ * Get a cache entry by device / block number. (There can only be one entry -+ * in the cache per device and block.) Returns NULL if no such cache entry -+ * exists. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_get(struct mb_cache *cache, kdev_t dev, unsigned long block) -+{ -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ ce = list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ goto cleanup; -+ } -+ } -+ ce = NULL; -+ -+cleanup: -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+ -+static struct mb_cache_entry * -+__mb_cache_entry_find(struct list_head *l, struct list_head *head, -+ int index, kdev_t dev, unsigned int key) -+{ -+ while (l != head) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, -+ e_indexes[index].o_list); -+ if (ce->e_dev == dev && ce->e_indexes[index].o_key == key) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ return ce; -+ } -+ l = l->next; -+ } -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_entry_find_first() -+ * -+ * Find the first cache entry on a given device with a certain key in -+ * an additional index. Additonal matches can be found with -+ * mb_cache_entry_find_next(). Returns NULL if no match was found. -+ * -+ * @cache: the cache to search -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_first(struct mb_cache *cache, int index, kdev_t dev, -+ unsigned int key) -+{ -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = cache->c_indexes_hash[index][bucket].next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_find_next() -+ * -+ * Find the next cache entry on a given device with a certain key in an -+ * additional index. Returns NULL if no match could be found. The previous -+ * entry is atomatically released, so that mb_cache_entry_find_next() can -+ * be called like this: -+ * -+ * entry = mb_cache_entry_find_first(); -+ * while (entry) { -+ * ... -+ * entry = mb_cache_entry_find_next(entry, ...); -+ * } -+ * -+ * @prev: The previous match -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_next(struct mb_cache_entry *prev, int index, kdev_t dev, -+ unsigned int key) -+{ -+ struct mb_cache *cache = prev->e_cache; -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = prev->e_indexes[index].o_list.next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ __mb_cache_entry_release_unlock(prev); -+ return ce; -+} -+ -+#endif /* !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) */ -+ -+static int __init init_mbcache(void) -+{ -+ register_cache(&mb_cache_definition); -+ return 0; -+} -+ -+static void __exit exit_mbcache(void) -+{ -+ unregister_cache(&mb_cache_definition); -+} -+ -+module_init(init_mbcache) -+module_exit(exit_mbcache) -+ ---- linux-2.4.20/include/asm-arm/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-arm/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -244,7 +244,6 @@ - #define __NR_security (__NR_SYSCALL_BASE+223) - #define __NR_gettid (__NR_SYSCALL_BASE+224) - #define __NR_readahead (__NR_SYSCALL_BASE+225) --#if 0 /* allocated in 2.5 */ - #define __NR_setxattr (__NR_SYSCALL_BASE+226) - #define __NR_lsetxattr (__NR_SYSCALL_BASE+227) - #define __NR_fsetxattr (__NR_SYSCALL_BASE+228) -@@ -257,7 +256,6 @@ - #define __NR_removexattr (__NR_SYSCALL_BASE+235) - #define __NR_lremovexattr (__NR_SYSCALL_BASE+236) - #define __NR_fremovexattr (__NR_SYSCALL_BASE+237) --#endif - #define __NR_tkill (__NR_SYSCALL_BASE+238) - /* - * Please check 2.5 _before_ adding calls here, ---- linux-2.4.20/include/asm-ppc64/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-ppc64/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -218,6 +218,7 @@ - #define __NR_gettid 207 - #if 0 /* Reserved syscalls */ - #define __NR_tkill 208 -+#endif - #define __NR_setxattr 209 - #define __NR_lsetxattr 210 - #define __NR_fsetxattr 211 -@@ -230,6 +231,7 @@ - #define __NR_removexattr 218 - #define __NR_lremovexattr 219 - #define __NR_fremovexattr 220 -+#if 0 /* Reserved syscalls */ - #define __NR_futex 221 - #endif - ---- linux-2.4.20/include/asm-s390/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-s390/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -212,9 +212,18 @@ - #define __NR_getdents64 220 - #define __NR_fcntl64 221 - #define __NR_readahead 222 --/* -- * Numbers 224-235 are reserved for posix acl -- */ -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - #define __NR_gettid 236 - #define __NR_tkill 237 - ---- linux-2.4.20/include/asm-s390x/unistd.h~linux-2.4.20-xattr-0.8.54 2002-08-03 08:39:45.000000000 +0800 -+++ linux-2.4.20-root/include/asm-s390x/unistd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -180,9 +180,18 @@ - #define __NR_mincore 218 - #define __NR_madvise 219 - #define __NR_readahead 222 --/* -- * Numbers 224-235 are reserved for posix acl -- */ -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - #define __NR_gettid 236 - #define __NR_tkill 237 - ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/include/linux/cache_def.h 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,15 @@ -+/* -+ * linux/cache_def.h -+ * Handling of caches defined in drivers, filesystems, ... -+ * -+ * Copyright (C) 2002 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+struct cache_definition { -+ const char *name; -+ void (*shrink)(int, unsigned int); -+ struct list_head link; -+}; -+ -+extern void register_cache(struct cache_definition *); -+extern void unregister_cache(struct cache_definition *); ---- linux-2.4.20/include/linux/errno.h~linux-2.4.20-xattr-0.8.54 2003-04-14 16:39:03.000000000 +0800 -+++ linux-2.4.20-root/include/linux/errno.h 2003-05-07 18:08:03.000000000 +0800 -@@ -23,4 +23,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ -+ - #endif ---- linux-2.4.20/include/linux/ext2_fs.h~linux-2.4.20-xattr-0.8.54 2003-04-14 16:39:08.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext2_fs.h 2003-05-07 18:08:03.000000000 +0800 -@@ -57,8 +57,6 @@ - */ - #define EXT2_BAD_INO 1 /* Bad blocks inode */ - #define EXT2_ROOT_INO 2 /* Root inode */ --#define EXT2_ACL_IDX_INO 3 /* ACL inode */ --#define EXT2_ACL_DATA_INO 4 /* ACL inode */ - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -@@ -86,7 +84,6 @@ - #else - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -121,28 +118,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext2_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext2_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext2_group_desc -@@ -314,6 +289,7 @@ struct ext2_inode { - #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ - #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ -+#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt -@@ -397,6 +373,7 @@ struct ext2_super_block { - - #ifdef __KERNEL__ - #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -+#define EXT2_I(inode) (&((inode)->u.ext2_i)) - #else - /* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test -@@ -466,7 +443,7 @@ struct ext2_super_block { - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff - --#define EXT2_FEATURE_COMPAT_SUPP 0 -+#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -623,8 +600,10 @@ extern struct address_space_operations e - - /* namei.c */ - extern struct inode_operations ext2_dir_inode_operations; -+extern struct inode_operations ext2_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext2_symlink_inode_operations; - extern struct inode_operations ext2_fast_symlink_inode_operations; - - #endif /* __KERNEL__ */ ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext2_xattr.h 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext2_xattr.h -+ -+ On-disk format of extended attributes for the ext2 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT2_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT2_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT2_XATTR_INDEX_MAX 10 -+#define EXT2_XATTR_INDEX_USER 1 -+#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext2_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext2_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT2_XATTR_PAD_BITS 2 -+#define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS) -+#define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1) -+#define EXT2_XATTR_LEN(name_len) \ -+ (((name_len) + EXT2_XATTR_ROUND + \ -+ sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND) -+#define EXT2_XATTR_NEXT(entry) \ -+ ( (struct ext2_xattr_entry *)( \ -+ (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT2_XATTR_SIZE(size) \ -+ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT2_FS_XATTR -+ -+struct ext2_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext2_xattr_register(int, struct ext2_xattr_handler *); -+extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); -+ -+extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); -+extern int ext2_removexattr(struct dentry *, const char *); -+ -+extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext2_xattr_list(struct inode *, char *, size_t); -+extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext2_xattr_delete_inode(struct inode *); -+extern void ext2_xattr_put_super(struct super_block *); -+ -+extern int init_ext2_xattr(void) __init; -+extern void exit_ext2_xattr(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR */ -+# define ext2_setxattr NULL -+# define ext2_getxattr NULL -+# define ext2_listxattr NULL -+# define ext2_removexattr NULL -+ -+static inline int -+ext2_xattr_get(struct inode *inode, int name_index, -+ const char *name, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+} -+ -+static inline void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR */ -+ -+# ifdef CONFIG_EXT2_FS_XATTR_USER -+ -+extern int init_ext2_xattr_user(void) __init; -+extern void exit_ext2_xattr_user(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+static inline int -+init_ext2_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr_user(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ ---- linux-2.4.20/include/linux/ext3_fs.h~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:04.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext3_fs.h 2003-05-07 18:08:03.000000000 +0800 -@@ -63,8 +63,6 @@ - */ - #define EXT3_BAD_INO 1 /* Bad blocks inode */ - #define EXT3_ROOT_INO 2 /* Root inode */ --#define EXT3_ACL_IDX_INO 3 /* ACL inode */ --#define EXT3_ACL_DATA_INO 4 /* ACL inode */ - #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ - #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ -@@ -94,7 +92,6 @@ - #else - # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry)) - #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -129,28 +126,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext3_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext3_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext3_group_desc -@@ -344,6 +319,7 @@ struct ext3_inode { - #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */ - #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 */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -520,7 +496,7 @@ struct ext3_super_block { - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - --#define EXT3_FEATURE_COMPAT_SUPP 0 -+#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) - #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ -@@ -703,6 +679,7 @@ extern void ext3_check_inodes_bitmap (st - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - - /* inode.c */ -+extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); - -@@ -771,8 +748,10 @@ extern struct address_space_operations e - - /* namei.c */ - extern struct inode_operations ext3_dir_inode_operations; -+extern struct inode_operations ext3_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - - ---- linux-2.4.20/include/linux/ext3_jbd.h~linux-2.4.20-xattr-0.8.54 2003-05-05 19:01:02.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext3_jbd.h 2003-05-07 18:08:03.000000000 +0800 -@@ -30,13 +30,19 @@ - - #define EXT3_SINGLEDATA_TRANS_BLOCKS 8 - -+/* Extended attributes may touch two data buffers, two bitmap buffers, -+ * and two group and summaries. */ -+ -+#define EXT3_XATTR_TRANS_BLOCKS 8 -+ - /* 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 - * quota files too (one for the group, one for the user quota). The - * superblock only gets updated once, of course, so don't bother - * counting that again for the quota updates. */ - --#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS - 2) -+#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \ -+ EXT3_XATTR_TRANS_BLOCKS - 2) - - extern int ext3_writepage_trans_blocks(struct inode *inode); - ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/include/linux/ext3_xattr.h 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext3_xattr.h -+ -+ On-disk format of extended attributes for the ext3 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT3_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT3_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT3_XATTR_INDEX_MAX 10 -+#define EXT3_XATTR_INDEX_USER 1 -+#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext3_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext3_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT3_XATTR_PAD_BITS 2 -+#define EXT3_XATTR_PAD (1<<EXT3_XATTR_PAD_BITS) -+#define EXT3_XATTR_ROUND (EXT3_XATTR_PAD-1) -+#define EXT3_XATTR_LEN(name_len) \ -+ (((name_len) + EXT3_XATTR_ROUND + \ -+ sizeof(struct ext3_xattr_entry)) & ~EXT3_XATTR_ROUND) -+#define EXT3_XATTR_NEXT(entry) \ -+ ( (struct ext3_xattr_entry *)( \ -+ (char *)(entry) + EXT3_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT3_XATTR_SIZE(size) \ -+ (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT3_FS_XATTR -+ -+struct ext3_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext3_xattr_register(int, struct ext3_xattr_handler *); -+extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *); -+ -+extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); -+extern int ext3_removexattr(struct dentry *, const char *); -+ -+extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext3_xattr_list(struct inode *, char *, size_t); -+extern int ext3_xattr_set(handle_t *handle, struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext3_xattr_delete_inode(handle_t *, struct inode *); -+extern void ext3_xattr_put_super(struct super_block *); -+ -+extern int init_ext3_xattr(void) __init; -+extern void exit_ext3_xattr(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR */ -+# define ext3_setxattr NULL -+# define ext3_getxattr NULL -+# define ext3_listxattr NULL -+# define ext3_removexattr NULL -+ -+static inline int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_list(struct inode *inode, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+} -+ -+static inline void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT3_FS_XATTR */ -+ -+# ifdef CONFIG_EXT3_FS_XATTR_USER -+ -+extern int init_ext3_xattr_user(void) __init; -+extern void exit_ext3_xattr_user(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+static inline int -+init_ext3_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr_user(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ ---- linux-2.4.20/include/linux/fs.h~linux-2.4.20-xattr-0.8.54 2003-05-05 19:00:55.000000000 +0800 -+++ linux-2.4.20-root/include/linux/fs.h 2003-05-07 18:08:03.000000000 +0800 -@@ -888,7 +888,7 @@ struct inode_operations { - int (*setattr) (struct dentry *, struct iattr *); - int (*setattr_raw) (struct inode *, struct iattr *); - int (*getattr) (struct dentry *, struct iattr *); -- int (*setxattr) (struct dentry *, const char *, void *, size_t, int); -+ int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); - ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); - ssize_t (*listxattr) (struct dentry *, char *, size_t); - int (*removexattr) (struct dentry *, const char *); ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-root/include/linux/mbcache.h 2003-05-07 18:08:03.000000000 +0800 -@@ -0,0 +1,69 @@ -+/* -+ File: linux/mbcache.h -+ -+ (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+/* Hardwire the number of additional indexes */ -+#define MB_CACHE_INDEXES_COUNT 1 -+ -+struct mb_cache_entry; -+ -+struct mb_cache_op { -+ int (*free)(struct mb_cache_entry *, int); -+}; -+ -+struct mb_cache { -+ struct list_head c_cache_list; -+ const char *c_name; -+ struct mb_cache_op c_op; -+ atomic_t c_entry_count; -+ int c_bucket_count; -+#ifndef MB_CACHE_INDEXES_COUNT -+ int c_indexes_count; -+#endif -+ kmem_cache_t *c_entry_cache; -+ struct list_head *c_block_hash; -+ struct list_head *c_indexes_hash[0]; -+}; -+ -+struct mb_cache_entry_index { -+ struct list_head o_list; -+ unsigned int o_key; -+}; -+ -+struct mb_cache_entry { -+ struct list_head e_lru_list; -+ struct mb_cache *e_cache; -+ atomic_t e_used; -+ kdev_t e_dev; -+ unsigned long e_block; -+ struct list_head e_block_list; -+ struct mb_cache_entry_index e_indexes[0]; -+}; -+ -+/* Functions on caches */ -+ -+struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, -+ int, int); -+void mb_cache_shrink(struct mb_cache *, kdev_t); -+void mb_cache_destroy(struct mb_cache *); -+ -+/* Functions on cache entries */ -+ -+struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *); -+int mb_cache_entry_insert(struct mb_cache_entry *, kdev_t, unsigned long, -+ unsigned int[]); -+void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]); -+void mb_cache_entry_release(struct mb_cache_entry *); -+void mb_cache_entry_takeout(struct mb_cache_entry *); -+void mb_cache_entry_free(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, kdev_t, -+ unsigned long); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, -+ kdev_t, unsigned int); -+struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, -+ kdev_t, unsigned int); -+#endif ---- linux-2.4.20/kernel/ksyms.c~linux-2.4.20-xattr-0.8.54 2003-05-05 17:43:15.000000000 +0800 -+++ linux-2.4.20-root/kernel/ksyms.c 2003-05-07 18:08:03.000000000 +0800 -@@ -11,6 +11,7 @@ - - #include <linux/config.h> - #include <linux/slab.h> -+#include <linux/cache_def.h> - #include <linux/module.h> - #include <linux/blkdev.h> - #include <linux/cdrom.h> -@@ -89,6 +90,7 @@ EXPORT_SYMBOL(exit_mm); - EXPORT_SYMBOL(exit_files); - EXPORT_SYMBOL(exit_fs); - EXPORT_SYMBOL(exit_sighand); -+EXPORT_SYMBOL(copy_fs_struct); - - /* internal kernel memory management */ - EXPORT_SYMBOL(_alloc_pages); -@@ -107,6 +109,8 @@ EXPORT_SYMBOL(kmem_cache_validate); - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); - EXPORT_SYMBOL(kmem_cache_size); -+EXPORT_SYMBOL(register_cache); -+EXPORT_SYMBOL(unregister_cache); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); ---- linux-2.4.20/mm/vmscan.c~linux-2.4.20-xattr-0.8.54 2002-11-29 07:53:15.000000000 +0800 -+++ linux-2.4.20-root/mm/vmscan.c 2003-05-07 18:08:03.000000000 +0800 -@@ -18,6 +18,7 @@ - #include <linux/kernel_stat.h> - #include <linux/swap.h> - #include <linux/swapctl.h> -+#include <linux/cache_def.h> - #include <linux/smp_lock.h> - #include <linux/pagemap.h> - #include <linux/init.h> -@@ -34,6 +35,39 @@ - */ - #define DEF_PRIORITY (6) - -+static DECLARE_MUTEX(other_caches_sem); -+static LIST_HEAD(cache_definitions); -+ -+void register_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_add(&cache->link, &cache_definitions); -+ up(&other_caches_sem); -+} -+ -+void unregister_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_del(&cache->link); -+ up(&other_caches_sem); -+} -+ -+static void shrink_other_caches(unsigned int priority, int gfp_mask) -+{ -+ struct list_head *p; -+ -+ if (down_trylock(&other_caches_sem)) -+ return; -+ -+ list_for_each_prev(p, &cache_definitions) { -+ struct cache_definition *cache = -+ list_entry(p, struct cache_definition, link); -+ -+ cache->shrink(priority, gfp_mask); -+ } -+ up(&other_caches_sem); -+} -+ - /* - * The swap-out function returns 1 if it successfully - * scanned all the pages it was asked to (`count'). -@@ -577,6 +611,7 @@ static int shrink_caches(zone_t * classz - - shrink_dcache_memory(priority, gfp_mask); - shrink_icache_memory(priority, gfp_mask); -+ shrink_other_caches(priority, gfp_mask); - #ifdef CONFIG_QUOTA - shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); - #endif ---- /dev/null 2003-01-30 18:24:37.000000000 +0800 -+++ linux-root/fs/ext3/ext3-exports.c 2003-05-05 18:19:11.000000000 +0800 -@@ -0,0 +1,13 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); - -_ diff --git a/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-suse2.patch b/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-suse2.patch deleted file mode 100644 index 0a8891fc3a..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.21-xattr-0.8.54-suse2.patch +++ /dev/null @@ -1,258 +0,0 @@ - Documentation/Configure.help | 66 ++ - arch/alpha/defconfig | 7 - arch/alpha/kernel/entry.S | 12 - arch/arm/defconfig | 7 - arch/arm/kernel/calls.S | 24 - arch/i386/defconfig | 7 - arch/ia64/defconfig | 7 - arch/ia64/kernel/entry.S | 24 - arch/m68k/defconfig | 7 - arch/mips/defconfig | 7 - arch/mips64/defconfig | 7 - arch/ppc/defconfig | 14 - arch/ppc64/kernel/misc.S | 2 - arch/s390/defconfig | 7 - arch/s390/kernel/entry.S | 24 - arch/s390x/defconfig | 7 - arch/s390x/kernel/entry.S | 24 - arch/s390x/kernel/wrapper32.S | 92 +++ - arch/sparc/defconfig | 7 - arch/sparc/kernel/systbls.S | 10 - arch/sparc64/defconfig | 7 - arch/sparc64/kernel/systbls.S | 20 - fs/Config.in | 14 - fs/Makefile | 3 - fs/ext2/Makefile | 4 - fs/ext2/file.c | 5 - fs/ext2/ialloc.c | 2 - fs/ext2/inode.c | 34 - - fs/ext2/namei.c | 14 - fs/ext2/super.c | 29 - fs/ext2/symlink.c | 14 - fs/ext2/xattr.c | 1212 +++++++++++++++++++++++++++++++++++++++++ - fs/ext2/xattr_user.c | 103 +++ - fs/ext3/Makefile | 10 - fs/ext3/file.c | 5 - fs/ext3/ialloc.c | 2 - fs/ext3/inode.c | 35 - - fs/ext3/namei.c | 21 - fs/ext3/super.c | 36 + - fs/ext3/symlink.c | 14 - fs/ext3/xattr.c | 1225 ++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/xattr_user.c | 111 +++ - fs/jfs/jfs_xattr.h | 6 - fs/jfs/xattr.c | 6 - fs/mbcache.c | 648 ++++++++++++++++++++++ - include/asm-arm/unistd.h | 2 - include/asm-ia64/unistd.h | 13 - include/asm-ppc64/unistd.h | 2 - include/asm-s390/unistd.h | 15 - include/asm-s390x/unistd.h | 15 - include/asm-sparc/unistd.h | 24 - include/asm-sparc64/unistd.h | 24 - include/linux/cache_def.h | 15 - include/linux/errno.h | 4 - include/linux/ext2_fs.h | 31 - - include/linux/ext2_xattr.h | 157 +++++ - include/linux/ext3_fs.h | 31 - - include/linux/ext3_jbd.h | 8 - include/linux/ext3_xattr.h | 157 +++++ - include/linux/fs.h | 2 - include/linux/mbcache.h | 69 ++ - kernel/ksyms.c | 4 - mm/vmscan.c | 35 + - fs/ext3/ext3-exports.c | 14 + - 64 files changed, 4355 insertions(+), 195 deletions(-) - -Index: linux-2.4.21-chaos/Documentation/Configure.help -=================================================================== ---- linux-2.4.21-chaos.orig/Documentation/Configure.help 2003-10-04 01:18:57.000000000 +0400 -+++ linux-2.4.21-chaos/Documentation/Configure.help 2003-12-14 15:11:46.000000000 +0300 -@@ -16008,6 +16041,39 @@ - - If unsure, say N. - -+Ext3 extended attributes -+CONFIG_EXT3_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 extended attribute block sharing -+CONFIG_EXT3_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext3 extended user attributes -+CONFIG_EXT3_FS_XATTR_USER -+ This option enables extended user attributes on ext3. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 trusted extended attributes -+CONFIG_EXT3_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext3 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Journal Block Device support (JBD for ext3) (EXPERIMENTAL) - CONFIG_JBD - This is a generic journalling layer for block devices. It is -Index: linux-2.4.21-chaos/fs/ext3/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/Makefile 2003-12-14 15:09:30.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/Makefile 2003-12-14 15:11:46.000000000 +0300 -@@ -9,10 +9,10 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.21-chaos/fs/ext3/super.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/super.c 2003-12-14 15:09:30.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/super.c 2003-12-14 15:11:46.000000000 +0300 -@@ -1944,9 +1944,6 @@ - unregister_filesystem(&ext3_fs_type); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); -- - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - MODULE_LICENSE("GPL"); -Index: linux-2.4.21-chaos/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/ext3-exports.c 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.4.21-chaos/fs/ext3/ext3-exports.c 2003-12-14 15:11:46.000000000 +0300 -@@ -0,0 +1,14 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_journal_abort_handle); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); -Index: linux-2.4.21-chaos/fs/ext3/xattr_trusted.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/xattr_trusted.c 2003-07-15 04:41:01.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/xattr_trusted.c 2003-12-14 15:11:46.000000000 +0300 -@@ -50,7 +50,7 @@ - return -EINVAL; - if (!capable(CAP_SYS_ADMIN)) - return -EPERM; -- return ext3_xattr_set(inode, EXT3_XATTR_INDEX_TRUSTED, name, -+ return ext3_xattr_set_trans(inode, EXT3_XATTR_INDEX_TRUSTED, name, - value, size, flags); - } - -Index: linux-2.4.21-chaos/fs/ext3/xattr.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/xattr.c 2003-07-30 04:11:55.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/xattr.c 2003-12-14 15:11:46.000000000 +0300 -@@ -868,7 +868,7 @@ - } - - /* -- * ext3_xattr_set() -+ * ext3_xattr_set_trans() - * - * Like ext3_xattr_set_handle, but start from an inode. This extended - * attribute modification is a filesystem transaction by itself. -@@ -876,7 +876,7 @@ - * Returns 0, or a negative error number on failure. - */ - int --ext3_xattr_set(struct inode *inode, int name_index, const char *name, -+ext3_xattr_set_trans(struct inode *inode, int name_index, const char *name, - const void *value, size_t value_len, int flags) - { - handle_t *handle; -@@ -895,6 +895,20 @@ - return error ? error : error2; - } - -+int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, -+ int flags) -+{ -+ int error; -+ -+ lock_kernel(); -+ error = ext3_xattr_set_handle(handle, inode, name_index, name, -+ value, value_len, flags); -+ unlock_kernel(); -+ return error; -+} -+ - /* - * ext3_xattr_delete_inode() - * -Index: linux-2.4.21-chaos/fs/ext3/xattr_user.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/ext3/xattr_user.c 2003-07-30 04:11:55.000000000 +0400 -+++ linux-2.4.21-chaos/fs/ext3/xattr_user.c 2003-12-14 15:26:58.000000000 +0300 -@@ -70,7 +70,7 @@ - if (error) - return error; - -- return ext3_xattr_set(inode, EXT3_XATTR_INDEX_USER, name, -+ return ext3_xattr_set_trans(inode, EXT3_XATTR_INDEX_USER, name, - value, size, flags); - } - -Index: linux-2.4.21-chaos/include/linux/errno.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/errno.h 2003-07-15 04:41:12.000000000 +0400 -+++ linux-2.4.21-chaos/include/linux/errno.h 2003-12-14 15:11:46.000000000 +0300 -@@ -26,4 +26,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ -+ - #endif -Index: linux-2.4.21-chaos/include/linux/ext3_xattr.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/ext3_xattr.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/ext3_xattr.h 2003-12-14 15:21:13.000000000 +0300 -@@ -82,8 +82,10 @@ - extern int ext3_xattr_list(struct inode *, char *, size_t); - extern int ext3_xattr_set_handle(handle_t *handle, struct inode *, int, - const char *, const void *, size_t, int); --extern int ext3_xattr_set(struct inode *, int, const char *, const void *, -+extern int ext3_xattr_set_trans(struct inode *, int, const char *, const void *, - size_t, int); -+extern int ext3_xattr_set(handle_t *, struct inode *, int, const char *, -+ const void *, size_t, int); - - extern void ext3_xattr_delete_inode(handle_t *, struct inode *); - extern void ext3_xattr_put_super(struct super_block *); diff --git a/lustre/kernel_patches/patches/linux-2.4.22-xattr-0.8.54.patch b/lustre/kernel_patches/patches/linux-2.4.22-xattr-0.8.54.patch deleted file mode 100644 index fd5f0c24da..0000000000 --- a/lustre/kernel_patches/patches/linux-2.4.22-xattr-0.8.54.patch +++ /dev/null @@ -1,5466 +0,0 @@ - Documentation/Configure.help | 66 ++ - arch/alpha/defconfig | 7 - arch/alpha/kernel/entry.S | 12 - arch/arm/defconfig | 7 - arch/arm/kernel/calls.S | 24 - arch/i386/defconfig | 7 - arch/ia64/defconfig | 7 - arch/ia64/kernel/entry.S | 24 - arch/m68k/defconfig | 7 - arch/mips/defconfig | 7 - arch/mips64/defconfig | 7 - arch/ppc/defconfig | 14 - arch/ppc64/kernel/misc.S | 2 - arch/s390/defconfig | 7 - arch/s390/kernel/entry.S | 24 - arch/s390x/defconfig | 7 - arch/s390x/kernel/entry.S | 24 - arch/s390x/kernel/wrapper32.S | 92 +++ - arch/sparc/defconfig | 7 - arch/sparc/kernel/systbls.S | 10 - arch/sparc64/defconfig | 7 - arch/sparc64/kernel/systbls.S | 20 - fs/Config.in | 14 - fs/Makefile | 3 - fs/ext2/Makefile | 4 - fs/ext2/file.c | 5 - fs/ext2/ialloc.c | 2 - fs/ext2/inode.c | 34 - - fs/ext2/namei.c | 14 - fs/ext2/super.c | 29 - fs/ext2/symlink.c | 14 - fs/ext2/xattr.c | 1212 +++++++++++++++++++++++++++++++++++++++++ - fs/ext2/xattr_user.c | 103 +++ - fs/ext3/Makefile | 10 - fs/ext3/file.c | 5 - fs/ext3/ialloc.c | 2 - fs/ext3/inode.c | 35 - - fs/ext3/namei.c | 21 - fs/ext3/super.c | 36 + - fs/ext3/symlink.c | 14 - fs/ext3/xattr.c | 1225 ++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/xattr_user.c | 111 +++ - fs/jfs/jfs_xattr.h | 6 - fs/jfs/xattr.c | 6 - fs/mbcache.c | 648 ++++++++++++++++++++++ - include/asm-arm/unistd.h | 2 - include/asm-ia64/unistd.h | 13 - include/asm-ppc64/unistd.h | 2 - include/asm-s390/unistd.h | 15 - include/asm-s390x/unistd.h | 15 - include/asm-sparc/unistd.h | 24 - include/asm-sparc64/unistd.h | 24 - include/linux/cache_def.h | 15 - include/linux/errno.h | 4 - include/linux/ext2_fs.h | 31 - - include/linux/ext2_xattr.h | 157 +++++ - include/linux/ext3_fs.h | 31 - - include/linux/ext3_jbd.h | 8 - include/linux/ext3_xattr.h | 157 +++++ - include/linux/fs.h | 2 - include/linux/mbcache.h | 69 ++ - kernel/ksyms.c | 4 - mm/vmscan.c | 35 + - fs/ext3/ext3-exports.c | 14 + - 64 files changed, 4355 insertions(+), 195 deletions(-) - -Index: linux-2.4.22-vanilla/Documentation/Configure.help -=================================================================== ---- linux-2.4.22-vanilla.orig/Documentation/Configure.help 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/Documentation/Configure.help 2003-12-02 23:55:38.000000000 +0300 -@@ -15613,6 +15613,39 @@ - be compiled as a module, and so this could be dangerous. Most - everyone wants to say Y here. - -+Ext2 extended attributes -+CONFIG_EXT2_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 extended attribute block sharing -+CONFIG_EXT2_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext2 extended user attributes -+CONFIG_EXT2_FS_XATTR_USER -+ This option enables extended user attributes on ext2. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext2 trusted extended attributes -+CONFIG_EXT2_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext2 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Ext3 journalling file system support (EXPERIMENTAL) - CONFIG_EXT3_FS - This is the journalling version of the Second extended file system -@@ -15645,6 +15678,39 @@ - of your root partition (the one containing the directory /) cannot - be compiled as a module, and so this may be dangerous. - -+Ext3 extended attributes -+CONFIG_EXT3_FS_XATTR -+ Extended attributes are name:value pairs associated with inodes by -+ the kernel or by users (see the attr(5) manual page, or visit -+ <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 extended attribute block sharing -+CONFIG_EXT3_FS_XATTR_SHARING -+ This options enables code for sharing identical extended attribute -+ blocks among multiple inodes. -+ -+ Usually, say Y. -+ -+Ext3 extended user attributes -+CONFIG_EXT3_FS_XATTR_USER -+ This option enables extended user attributes on ext3. Processes can -+ associate extended user attributes with inodes to store additional -+ information such as the character encoding of files, etc. (see the -+ attr(5) manual page, or visit <http://acl.bestbits.at/> for details). -+ -+ If unsure, say N. -+ -+Ext3 trusted extended attributes -+CONFIG_EXT3_FS_XATTR_TRUSTED -+ This option enables extended attributes on ext3 that are accessible -+ (and visible) only to users capable of CAP_SYS_ADMIN. Usually this -+ is only the super user. Trusted extended attributes are meant for -+ implementing system/security services. -+ -+ If unsure, say N. -+ - Journal Block Device support (JBD for ext3) (EXPERIMENTAL) - CONFIG_JBD - This is a generic journalling layer for block devices. It is -Index: linux-2.4.22-vanilla/arch/alpha/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/alpha/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/alpha/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ALPHA=y - # CONFIG_UID16 is not set - # CONFIG_RWSEM_GENERIC_SPINLOCK is not set -Index: linux-2.4.22-vanilla/arch/alpha/kernel/entry.S -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/alpha/kernel/entry.S 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/alpha/kernel/entry.S 2003-12-02 23:55:38.000000000 +0300 -@@ -1154,6 +1154,18 @@ - .quad sys_readahead - .quad sys_ni_syscall /* 380, sys_security */ - .quad sys_tkill -+ .quad sys_setxattr -+ .quad sys_lsetxattr -+ .quad sys_fsetxattr -+ .quad sys_getxattr /* 385 */ -+ .quad sys_lgetxattr -+ .quad sys_fgetxattr -+ .quad sys_listxattr -+ .quad sys_llistxattr -+ .quad sys_flistxattr /* 390 */ -+ .quad sys_removexattr -+ .quad sys_lremovexattr -+ .quad sys_fremovexattr - - /* Remember to update everything, kids. */ - .ifne (. - sys_call_table) - (NR_SYSCALLS * 8) -Index: linux-2.4.22-vanilla/arch/arm/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/arm/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/arm/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_ARM=y - # CONFIG_EISA is not set - # CONFIG_SBUS is not set -Index: linux-2.4.22-vanilla/arch/arm/kernel/calls.S -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/arm/kernel/calls.S 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/arm/kernel/calls.S 2003-12-02 23:55:38.000000000 +0300 -@@ -240,18 +240,18 @@ - .long SYMBOL_NAME(sys_ni_syscall) /* Security */ - .long SYMBOL_NAME(sys_gettid) - /* 225 */ .long SYMBOL_NAME(sys_readahead) -- .long SYMBOL_NAME(sys_ni_syscall) /* setxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* lsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* fsetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* getxattr */ --/* 230 */ .long SYMBOL_NAME(sys_ni_syscall) /* lgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* fgetxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* listxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* llistxattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* flistxattr */ --/* 235 */ .long SYMBOL_NAME(sys_ni_syscall) /* removexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* lremovexattr */ -- .long SYMBOL_NAME(sys_ni_syscall) /* fremovexattr */ -+ .long SYMBOL_NAME(sys_setxattr) -+ .long SYMBOL_NAME(sys_lsetxattr) -+ .long SYMBOL_NAME(sys_fsetxattr) -+ .long SYMBOL_NAME(sys_getxattr) -+/* 230 */ .long SYMBOL_NAME(sys_lgetxattr) -+ .long SYMBOL_NAME(sys_fgetxattr) -+ .long SYMBOL_NAME(sys_listxattr) -+ .long SYMBOL_NAME(sys_llistxattr) -+ .long SYMBOL_NAME(sys_flistxattr) -+/* 235 */ .long SYMBOL_NAME(sys_removexattr) -+ .long SYMBOL_NAME(sys_lremovexattr) -+ .long SYMBOL_NAME(sys_fremovexattr) - .long SYMBOL_NAME(sys_tkill) - .long SYMBOL_NAME(sys_ni_syscall) /* sendfile64 */ - /* 240 */ .long SYMBOL_NAME(sys_ni_syscall) /* futex */ -Index: linux-2.4.22-vanilla/arch/i386/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/i386/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/i386/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_X86=y - CONFIG_ISA=y - # CONFIG_SBUS is not set -Index: linux-2.4.22-vanilla/arch/ia64/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/ia64/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/ia64/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options -Index: linux-2.4.22-vanilla/arch/m68k/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/m68k/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/m68k/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_UID16=y - - # -Index: linux-2.4.22-vanilla/arch/mips/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/mips/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/mips/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - CONFIG_MIPS32=y - # CONFIG_MIPS64 is not set -Index: linux-2.4.22-vanilla/arch/mips64/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/mips64/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/mips64/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - CONFIG_MIPS=y - # CONFIG_MIPS32 is not set - CONFIG_MIPS64=y -Index: linux-2.4.22-vanilla/arch/s390/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/s390/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/s390/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set -Index: linux-2.4.22-vanilla/arch/s390/kernel/entry.S -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/s390/kernel/entry.S 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/s390/kernel/entry.S 2003-12-02 23:55:38.000000000 +0300 -@@ -558,18 +558,18 @@ - .long sys_fcntl64 - .long sys_readahead - .long sys_ni_syscall -- .long sys_ni_syscall /* 224 - reserved for setxattr */ -- .long sys_ni_syscall /* 225 - reserved for lsetxattr */ -- .long sys_ni_syscall /* 226 - reserved for fsetxattr */ -- .long sys_ni_syscall /* 227 - reserved for getxattr */ -- .long sys_ni_syscall /* 228 - reserved for lgetxattr */ -- .long sys_ni_syscall /* 229 - reserved for fgetxattr */ -- .long sys_ni_syscall /* 230 - reserved for listxattr */ -- .long sys_ni_syscall /* 231 - reserved for llistxattr */ -- .long sys_ni_syscall /* 232 - reserved for flistxattr */ -- .long sys_ni_syscall /* 233 - reserved for removexattr */ -- .long sys_ni_syscall /* 234 - reserved for lremovexattr */ -- .long sys_ni_syscall /* 235 - reserved for fremovexattr */ -+ .long sys_setxattr -+ .long sys_lsetxattr /* 225 */ -+ .long sys_fsetxattr -+ .long sys_getxattr -+ .long sys_lgetxattr -+ .long sys_fgetxattr -+ .long sys_listxattr /* 230 */ -+ .long sys_llistxattr -+ .long sys_flistxattr -+ .long sys_removexattr -+ .long sys_lremovexattr -+ .long sys_fremovexattr /* 235 */ - .long sys_gettid - .long sys_tkill - .rept 255-237 -Index: linux-2.4.22-vanilla/arch/s390x/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/s390x/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/s390x/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - # CONFIG_ISA is not set - # CONFIG_EISA is not set - # CONFIG_MCA is not set -Index: linux-2.4.22-vanilla/arch/s390x/kernel/entry.S -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/s390x/kernel/entry.S 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/s390x/kernel/entry.S 2003-12-02 23:55:38.000000000 +0300 -@@ -591,18 +591,18 @@ - .long SYSCALL(sys_ni_syscall,sys32_fcntl64_wrapper) - .long SYSCALL(sys_readahead,sys32_readahead) - .long SYSCALL(sys_ni_syscall,sys_ni_syscall) -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 224 - reserved for setxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 225 - reserved for lsetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 226 - reserved for fsetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 227 - reserved for getxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 228 - reserved for lgetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 229 - reserved for fgetxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 230 - reserved for listxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 231 - reserved for llistxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 232 - reserved for flistxattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 233 - reserved for removexattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 234 - reserved for lremovexattr */ -- .long SYSCALL(sys_ni_syscall,sys_ni_syscall) /* 235 - reserved for fremovexattr */ -+ .long SYSCALL(sys_setxattr,sys32_setxattr_wrapper) -+ .long SYSCALL(sys_lsetxattr,sys32_lsetxattr_wrapper) /* 225 */ -+ .long SYSCALL(sys_fsetxattr,sys32_fsetxattr_wrapper) -+ .long SYSCALL(sys_getxattr,sys32_getxattr_wrapper) -+ .long SYSCALL(sys_lgetxattr,sys32_lgetxattr_wrapper) -+ .long SYSCALL(sys_fgetxattr,sys32_fgetxattr_wrapper) -+ .long SYSCALL(sys_listxattr,sys32_listxattr_wrapper) /* 230 */ -+ .long SYSCALL(sys_llistxattr,sys32_llistxattr_wrapper) -+ .long SYSCALL(sys_flistxattr,sys32_flistxattr_wrapper) -+ .long SYSCALL(sys_removexattr,sys32_removexattr_wrapper) -+ .long SYSCALL(sys_lremovexattr,sys32_lremovexattr_wrapper) -+ .long SYSCALL(sys_fremovexattr,sys32_fremovexattr_wrapper)/* 235 */ - .long SYSCALL(sys_gettid,sys_gettid) - .long SYSCALL(sys_tkill,sys_tkill) - .rept 255-237 -Index: linux-2.4.22-vanilla/arch/s390x/kernel/wrapper32.S -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/s390x/kernel/wrapper32.S 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/s390x/kernel/wrapper32.S 2003-12-02 23:55:38.000000000 +0300 -@@ -1098,6 +1098,98 @@ - llgfr %r4,%r4 # long - jg sys32_fstat64 # branch to system call - -+ .globl sys32_setxattr_wrapper -+sys32_setxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_setxattr -+ -+ .globl sys32_lsetxattr_wrapper -+sys32_lsetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_lsetxattr -+ -+ .globl sys32_fsetxattr_wrapper -+sys32_fsetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ lgfr %r6,%r6 # int -+ jg sys_fsetxattr -+ -+ .globl sys32_getxattr_wrapper -+sys32_getxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_getxattr -+ -+ .globl sys32_lgetxattr_wrapper -+sys32_lgetxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_lgetxattr -+ -+ .globl sys32_fgetxattr_wrapper -+sys32_fgetxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgtr %r4,%r4 # void * -+ llgfr %r5,%r5 # size_t -+ jg sys_fgetxattr -+ -+ .globl sys32_listxattr_wrapper -+sys32_listxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_listxattr -+ -+ .globl sys32_llistxattr_wrapper -+sys32_llistxattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_llistxattr -+ -+ .globl sys32_flistxattr_wrapper -+sys32_flistxattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ llgfr %r4,%r4 # size_t -+ jg sys_flistxattr -+ -+ .globl sys32_removexattr_wrapper -+sys32_removexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_removexattr -+ -+ .globl sys32_lremovexattr_wrapper -+sys32_lremovexattr_wrapper: -+ llgtr %r2,%r2 # char * -+ llgtr %r3,%r3 # char * -+ jg sys_lremovexattr -+ -+ .globl sys32_fremovexattr_wrapper -+sys32_fremovexattr_wrapper: -+ lgfr %r2,%r2 # int -+ llgtr %r3,%r3 # char * -+ jg sys_fremovexattr -+ -+ -+ - .globl sys32_stime_wrapper - sys32_stime_wrapper: - llgtr %r2,%r2 # int * -Index: linux-2.4.22-vanilla/arch/sparc64/defconfig -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/sparc64/defconfig 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/sparc64/defconfig 2003-12-02 23:55:38.000000000 +0300 -@@ -1,6 +1,13 @@ - # - # Automatically generated make config: don't edit - # -+CONFIG_EXT3_FS_XATTR=y -+# CONFIG_EXT3_FS_XATTR_SHARING is not set -+# CONFIG_EXT3_FS_XATTR_USER is not set -+# CONFIG_EXT2_FS_XATTR is not set -+# CONFIG_EXT2_FS_XATTR_SHARING is not set -+# CONFIG_EXT2_FS_XATTR_USER is not set -+# CONFIG_FS_MBCACHE is not set - - # - # Code maturity level options -Index: linux-2.4.22-vanilla/fs/Config.in -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/Config.in 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/Config.in 2003-12-02 23:55:38.000000000 +0300 -@@ -29,6 +29,11 @@ - dep_tristate 'BFS file system support (EXPERIMENTAL)' CONFIG_BFS_FS $CONFIG_EXPERIMENTAL - - tristate 'Ext3 journalling file system support' CONFIG_EXT3_FS -+dep_mbool ' Ext3 extended attributes' CONFIG_EXT3_FS_XATTR $CONFIG_EXT3_FS -+dep_bool ' Ext3 extended attribute block sharing' \ -+ CONFIG_EXT3_FS_XATTR_SHARING $CONFIG_EXT3_FS_XATTR -+dep_bool ' Ext3 extended user attributes' \ -+ CONFIG_EXT3_FS_XATTR_USER $CONFIG_EXT3_FS_XATTR - # CONFIG_JBD could be its own option (even modular), but until there are - # other users than ext3, we will simply make it be the same as CONFIG_EXT3_FS - # dep_tristate ' Journal Block Device support (JBD for ext3)' CONFIG_JBD $CONFIG_EXT3_FS -@@ -88,6 +93,11 @@ - tristate 'ROM file system support' CONFIG_ROMFS_FS - - tristate 'Second extended fs support' CONFIG_EXT2_FS -+dep_mbool ' Ext2 extended attributes' CONFIG_EXT2_FS_XATTR $CONFIG_EXT2_FS -+dep_bool ' Ext2 extended attribute block sharing' \ -+ CONFIG_EXT2_FS_XATTR_SHARING $CONFIG_EXT2_FS_XATTR -+dep_bool ' Ext2 extended user attributes' \ -+ CONFIG_EXT2_FS_XATTR_USER $CONFIG_EXT2_FS_XATTR - - tristate 'System V/Xenix/V7/Coherent file system support' CONFIG_SYSV_FS - -@@ -160,6 +170,10 @@ - define_tristate CONFIG_ZISOFS_FS n - fi - -+# Meta block cache for Extended Attributes (ext2/ext3) -+#tristate 'Meta block cache' CONFIG_FS_MBCACHE -+define_tristate CONFIG_FS_MBCACHE y -+ - mainmenu_option next_comment - comment 'Partition Types' - source fs/partitions/Config.in -Index: linux-2.4.22-vanilla/fs/Makefile -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/Makefile 2003-12-02 23:55:36.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/Makefile 2003-12-02 23:55:38.000000000 +0300 -@@ -77,6 +77,9 @@ - - obj-$(CONFIG_BINFMT_ELF) += binfmt_elf.o - -+export-objs += mbcache.o -+obj-$(CONFIG_FS_MBCACHE) += mbcache.o -+ - # persistent filesystems - obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) - -Index: linux-2.4.22-vanilla/fs/ext2/Makefile -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/Makefile 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/Makefile 2003-12-02 23:55:38.000000000 +0300 -@@ -13,4 +13,8 @@ - ioctl.o namei.o super.o symlink.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT2_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make -Index: linux-2.4.22-vanilla/fs/ext2/file.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/file.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/file.c 2003-12-02 23:55:38.000000000 +0300 -@@ -20,6 +20,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/sched.h> - - /* -@@ -51,4 +52,8 @@ - - struct inode_operations ext2_file_inode_operations = { - truncate: ext2_truncate, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.22-vanilla/fs/ext2/ialloc.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/ialloc.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/ialloc.c 2003-12-02 23:55:38.000000000 +0300 -@@ -15,6 +15,7 @@ - #include <linux/config.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/locks.h> - #include <linux/quotaops.h> - -@@ -167,6 +168,7 @@ - */ - if (!is_bad_inode(inode)) { - /* Quota is already initialized in iput() */ -+ ext2_xattr_delete_inode(inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - } -Index: linux-2.4.22-vanilla/fs/ext2/inode.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/inode.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/inode.c 2003-12-02 23:55:38.000000000 +0300 -@@ -39,6 +39,18 @@ - static int ext2_update_inode(struct inode * inode, int do_sync); - - /* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext2_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext2_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ -+/* - * Called at each iput() - */ - void ext2_put_inode (struct inode * inode) -@@ -53,9 +65,7 @@ - { - lock_kernel(); - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - inode->u.ext2_i.i_dtime = CURRENT_TIME; - mark_inode_dirty(inode); -@@ -801,6 +811,8 @@ - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext2_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -903,8 +915,7 @@ - unsigned long offset; - struct ext2_group_desc * gdp; - -- if ((inode->i_ino != EXT2_ROOT_INO && inode->i_ino != EXT2_ACL_IDX_INO && -- inode->i_ino != EXT2_ACL_DATA_INO && -+ if ((inode->i_ino != EXT2_ROOT_INO && - inode->i_ino < EXT2_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu(inode->i_sb->u.ext2_sb.s_es->s_inodes_count)) { - ext2_error (inode->i_sb, "ext2_read_inode", -@@ -989,10 +1000,7 @@ - for (block = 0; block < EXT2_N_BLOCKS; block++) - inode->u.ext2_i.i_data[block] = raw_inode->i_block[block]; - -- if (inode->i_ino == EXT2_ACL_IDX_INO || -- inode->i_ino == EXT2_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext2_file_inode_operations; - inode->i_fop = &ext2_file_operations; - inode->i_mapping->a_ops = &ext2_aops; -@@ -1001,15 +1009,17 @@ - inode->i_fop = &ext2_dir_operations; - inode->i_mapping->a_ops = &ext2_aops; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext2_inode_is_fast_symlink(inode)) - inode->i_op = &ext2_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - } -- } else -+ } else { -+ inode->i_op = &ext2_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(raw_inode->i_block[0])); -+ } - brelse (bh); - inode->i_attr_flags = 0; - ext2_set_inode_flags(inode); -Index: linux-2.4.22-vanilla/fs/ext2/namei.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/namei.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/namei.c 2003-12-02 23:55:38.000000000 +0300 -@@ -31,6 +31,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/pagemap.h> - - /* -@@ -136,7 +137,7 @@ - - if (l > sizeof (inode->u.ext2_i.i_data)) { - /* slow symlink */ -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext2_symlink_inode_operations; - inode->i_mapping->a_ops = &ext2_aops; - err = block_symlink(inode, symname, l); - if (err) -@@ -345,4 +346,15 @@ - rmdir: ext2_rmdir, - mknod: ext2_mknod, - rename: ext2_rename, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ -+struct inode_operations ext2_special_inode_operations = { -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.22-vanilla/fs/ext2/super.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/super.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/super.c 2003-12-02 23:55:38.000000000 +0300 -@@ -21,6 +21,7 @@ - #include <linux/string.h> - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -125,6 +126,7 @@ - int db_count; - int i; - -+ ext2_xattr_put_super(sb); - if (!(sb->s_flags & MS_RDONLY)) { - struct ext2_super_block *es = EXT2_SB(sb)->s_es; - -@@ -175,6 +177,13 @@ - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -424,6 +433,9 @@ - blocksize = BLOCK_SIZE; - - sb->u.ext2_sb.s_mount_opt = 0; -+#ifdef CONFIG_EXT2_FS_XATTR_USER -+ /* set_opt (sb->u.ext2_sb.s_mount_opt, XATTR_USER); */ -+#endif - if (!parse_options ((char *) data, &sb_block, &resuid, &resgid, - &sb->u.ext2_sb.s_mount_opt)) { - return NULL; -@@ -813,12 +825,27 @@ - - static int __init init_ext2_fs(void) - { -- return register_filesystem(&ext2_fs_type); -+ int error = init_ext2_xattr(); -+ if (error) -+ return error; -+ error = init_ext2_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext2_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext2_xattr_user(); -+fail: -+ exit_ext2_xattr(); -+ return error; - } - - static void __exit exit_ext2_fs(void) - { - unregister_filesystem(&ext2_fs_type); -+ exit_ext2_xattr_user(); -+ exit_ext2_xattr(); - } - - EXPORT_NO_SYMBOLS; -Index: linux-2.4.22-vanilla/fs/ext2/symlink.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/symlink.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/symlink.c 2003-12-02 23:55:38.000000000 +0300 -@@ -19,6 +19,7 @@ - - #include <linux/fs.h> - #include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> - - static int ext2_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -32,7 +33,20 @@ - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext2_symlink_inode_operations = { -+ readlink: page_readlink, -+ follow_link: page_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, -+}; -+ - struct inode_operations ext2_fast_symlink_inode_operations = { - readlink: ext2_readlink, - follow_link: ext2_follow_link, -+ setxattr: ext2_setxattr, -+ getxattr: ext2_getxattr, -+ listxattr: ext2_listxattr, -+ removexattr: ext2_removexattr, - }; -Index: linux-2.4.22-vanilla/fs/ext2/xattr.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/xattr.c 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/xattr.c 2003-12-02 23:55:38.000000000 +0300 -@@ -0,0 +1,1212 @@ -+/* -+ * linux/fs/ext2/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT2_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT2_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext2_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+/* These symbols may be needed by a module. */ -+EXPORT_SYMBOL(ext2_xattr_register); -+EXPORT_SYMBOL(ext2_xattr_unregister); -+EXPORT_SYMBOL(ext2_xattr_get); -+EXPORT_SYMBOL(ext2_xattr_list); -+EXPORT_SYMBOL(ext2_xattr_set); -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext2_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext2_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT2_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext2_xattr_set2(struct inode *, struct buffer_head *, -+ struct ext2_xattr_header *); -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+static int ext2_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext2_xattr_cache_find(struct inode *, -+ struct ext2_xattr_header *); -+static void ext2_xattr_cache_remove(struct buffer_head *); -+static void ext2_xattr_rehash(struct ext2_xattr_header *, -+ struct ext2_xattr_entry *); -+ -+static struct mb_cache *ext2_xattr_cache; -+ -+#else -+# define ext2_xattr_cache_insert(bh) 0 -+# define ext2_xattr_cache_find(inode, header) NULL -+# define ext2_xattr_cache_remove(bh) while(0) {} -+# define ext2_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext2_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext2_xattr_sem); -+ -+static inline int -+ext2_xattr_new_block(struct inode *inode, int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT2_SB(sb)->s_es->s_first_data_block) + -+ EXT2_I(inode)->i_block_group * EXT2_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext2_new_block(inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext2_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext2_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext2_xattr_free_block(struct inode * inode, unsigned long block) -+{ -+ ext2_free_blocks(inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext2_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext2_xattr_free_block(inode, block) \ -+ ext2_free_blocks(inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext2_xattr_handler *ext2_xattr_handlers[EXT2_XATTR_INDEX_MAX]; -+rwlock_t ext2_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext2_xattr_register(int name_index, struct ext2_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ if (!ext2_xattr_handlers[name_index-1]) { -+ ext2_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext2_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext2_xattr_unregister(int name_index, struct ext2_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT2_XATTR_INDEX_MAX) { -+ write_lock(&ext2_handler_lock); -+ ext2_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext2_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static struct ext2_xattr_handler * -+ext2_xattr_resolve_name(const char **name) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext2_handler_lock); -+ for (i=0; i<EXT2_XATTR_INDEX_MAX; i++) { -+ if (ext2_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext2_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext2_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext2_handler_lock); -+ return handler; -+} -+ -+static inline struct ext2_xattr_handler * -+ext2_xattr_handler(int name_index) -+{ -+ struct ext2_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT2_XATTR_INDEX_MAX) { -+ read_lock(&ext2_handler_lock); -+ handler = ext2_xattr_handlers[name_index-1]; -+ read_unlock(&ext2_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext2_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext2_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext2_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext2_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext2_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext2_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT2_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT2_I(inode)->i_file_acl) -+ return 0; -+ block = EXT2_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(inode->i_sb, "ext2_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ struct ext2_xattr_entry *next = -+ EXT2_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext2_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT2_XATTR_NEXT(entry)) { -+ struct ext2_xattr_handler *handler; -+ -+ handler = ext2_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT2_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext2_xattr_update_super_block(struct super_block *sb) -+{ -+ if (EXT2_HAS_COMPAT_FEATURE(sb, EXT2_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT2_SB(sb)->s_feature_compat |= EXT2_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT2_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT2_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ mark_buffer_dirty(EXT2_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext2_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext2_xattr_header *header = NULL; -+ struct ext2_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT2_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext2_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext2_error(sb, "ext2_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext2_xattr_entry *next = EXT2_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext2_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT2_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT2_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT2_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext2_xattr_cache_remove(bh); -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT2_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT2_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT2_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT2_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext2_xattr_set2(inode, bh, NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT2_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT2_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT2_XATTR_PAD, 0, -+ EXT2_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext2_xattr_rehash(header, here); -+ -+ error = ext2_xattr_set2(inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext2_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext2_xattr_set(): Update the file system. -+ */ -+static int -+ext2_xattr_set2(struct inode *inode, struct buffer_head *old_bh, -+ struct ext2_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext2_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext2_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext2_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT2_I(inode)->i_file_acl != 0; -+ int block = ext2_xattr_new_block(inode, &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+ ext2_xattr_free_block(inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext2_xattr_cache_insert(new_bh); -+ -+ ext2_xattr_update_super_block(sb); -+ } -+ mark_buffer_dirty(new_bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &new_bh); -+ wait_on_buffer(new_bh); -+ error = -EIO; -+ if (buffer_req(new_bh) && !buffer_uptodate(new_bh)) -+ goto cleanup; -+ } -+ } -+ -+ /* Update the inode. */ -+ EXT2_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ if (IS_SYNC(inode)) { -+ error = ext2_sync_inode (inode); -+ if (error) -+ goto cleanup; -+ } else -+ mark_inode_dirty(inode); -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext2_xattr_free_block(inode, old_bh->b_blocknr); -+ mark_buffer_clean(old_bh); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext2_xattr_quota_free(inode); -+ mark_buffer_dirty(old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext2_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT2_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext2_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT2_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext2_error(inode->i_sb, "ext2_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext2_xattr_cache_remove(bh); -+ ext2_xattr_free_block(inode, block); -+ bforget(bh); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ mark_buffer_dirty(bh); -+ if (IS_SYNC(inode)) { -+ ll_rw_block(WRITE, 1, &bh); -+ wait_on_buffer(bh); -+ } -+ ext2_xattr_quota_free(inode); -+ } -+ EXT2_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext2_xattr_sem); -+} -+ -+/* -+ * ext2_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ mb_cache_shrink(ext2_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT2_FS_XATTR_SHARING -+ -+/* -+ * ext2_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext2_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext2_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext2_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext2_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext2_xattr_cmp(struct ext2_xattr_header *header1, -+ struct ext2_xattr_header *header2) -+{ -+ struct ext2_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT2_XATTR_NEXT(entry1); -+ entry2 = EXT2_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext2_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext2_xattr_cache_find(struct inode *inode, struct ext2_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext2_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext2_error(inode->i_sb, "ext2_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT2_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT2_XATTR_REFCOUNT_MAX); -+ } else if (!ext2_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext2_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext2_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext2_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext2_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext2_xattr_hash_entry(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT2_XATTR_ROUND) >> EXT2_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext2_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext2_xattr_rehash(struct ext2_xattr_header *header, -+ struct ext2_xattr_entry *entry) -+{ -+ struct ext2_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext2_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT2_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext2_xattr(void) -+{ -+ ext2_xattr_cache = mb_cache_create("ext2_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext2_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+ mb_cache_destroy(ext2_xattr_cache); -+} -+ -+#else /* CONFIG_EXT2_FS_XATTR_SHARING */ -+ -+int __init -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext2_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT2_FS_XATTR_SHARING */ -Index: linux-2.4.22-vanilla/fs/ext2/xattr_user.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext2/xattr_user.c 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext2/xattr_user.c 2003-12-02 23:55:38.000000000 +0300 -@@ -0,0 +1,103 @@ -+/* -+ * linux/fs/ext2/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <linux/ext2_xattr.h> -+ -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+# include <linux/ext2_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext2_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext2_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_get(inode, EXT2_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext2_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT2_FS_POSIX_ACL -+ error = ext2_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ return ext2_xattr_set(inode, EXT2_XATTR_INDEX_USER, name, -+ value, size, flags); -+} -+ -+struct ext2_xattr_handler ext2_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext2_xattr_user_list, -+ get: ext2_xattr_user_get, -+ set: ext2_xattr_user_set, -+}; -+ -+int __init -+init_ext2_xattr_user(void) -+{ -+ return ext2_xattr_register(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -+ -+void -+exit_ext2_xattr_user(void) -+{ -+ ext2_xattr_unregister(EXT2_XATTR_INDEX_USER, -+ &ext2_xattr_user_handler); -+} -Index: linux-2.4.22-vanilla/fs/ext3/Makefile -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/Makefile 2003-12-02 23:55:37.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/Makefile 2003-12-02 23:55:38.000000000 +0300 -@@ -1,5 +1,5 @@ - # --# Makefile for the linux ext2-filesystem routines. -+# Makefile for the linux ext3-filesystem routines. - # - # Note! Dependencies are done automagically by 'make dep', which also - # removes any old dependencies. DON'T put your own dependencies here -@@ -9,10 +9,14 @@ - - O_TARGET := ext3.o - --export-objs := super.o inode.o -+export-objs := ext3-exports.o - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o \ -- ioctl.o namei.o super.o symlink.o hash.o -+ ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o - obj-m := $(O_TARGET) - -+export-objs += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR) += xattr.o -+obj-$(CONFIG_EXT3_FS_XATTR_USER) += xattr_user.o -+ - include $(TOPDIR)/Rules.make -Index: linux-2.4.22-vanilla/fs/ext3/file.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/file.c 2003-12-02 23:55:37.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/file.c 2003-12-02 23:55:38.000000000 +0300 -@@ -23,6 +23,7 @@ - #include <linux/locks.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - #include <linux/ext3_jbd.h> - #include <linux/smp_lock.h> - -@@ -127,5 +128,9 @@ - struct inode_operations ext3_file_inode_operations = { - truncate: ext3_truncate, /* BKL held */ - setattr: ext3_setattr, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; - -Index: linux-2.4.22-vanilla/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/ialloc.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/ialloc.c 2003-12-02 23:55:38.000000000 +0300 -@@ -17,6 +17,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/stat.h> - #include <linux/string.h> - #include <linux/locks.h> -@@ -216,6 +217,7 @@ - * as writing the quota to disk may need the lock as well. - */ - DQUOT_INIT(inode); -+ ext3_xattr_delete_inode(handle, inode); - DQUOT_FREE_INODE(inode); - DQUOT_DROP(inode); - -Index: linux-2.4.22-vanilla/fs/ext3/inode.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/inode.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/inode.c 2003-12-02 23:55:38.000000000 +0300 -@@ -39,6 +39,18 @@ - */ - #undef SEARCH_FROM_ZERO - -+/* -+ * Test whether an inode is a fast symlink. -+ */ -+static inline int ext3_inode_is_fast_symlink(struct inode *inode) -+{ -+ int ea_blocks = inode->u.ext3_i.i_file_acl ? -+ (inode->i_sb->s_blocksize >> 9) : 0; -+ -+ return (S_ISLNK(inode->i_mode) && -+ inode->i_blocks - ea_blocks == 0); -+} -+ - /* The ext3 forget function must perform a revoke if we are freeing data - * which has been journaled. Metadata (eg. indirect blocks) must be - * revoked in all cases. -@@ -48,7 +60,7 @@ - * still needs to be revoked. - */ - --static int ext3_forget(handle_t *handle, int is_metadata, -+int ext3_forget(handle_t *handle, int is_metadata, - struct inode *inode, struct buffer_head *bh, - int blocknr) - { -@@ -179,9 +191,7 @@ - { - handle_t *handle; - -- if (is_bad_inode(inode) || -- inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -+ if (is_bad_inode(inode)) - goto no_delete; - - lock_kernel(); -@@ -1870,6 +1880,8 @@ - if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || - S_ISLNK(inode->i_mode))) - return; -+ if (ext3_inode_is_fast_symlink(inode)) -+ return; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - return; - -@@ -2017,8 +2029,6 @@ - struct ext3_group_desc * gdp; - - if ((inode->i_ino != EXT3_ROOT_INO && -- inode->i_ino != EXT3_ACL_IDX_INO && -- inode->i_ino != EXT3_ACL_DATA_INO && - inode->i_ino != EXT3_JOURNAL_INO && - inode->i_ino < EXT3_FIRST_INO(inode->i_sb)) || - inode->i_ino > le32_to_cpu( -@@ -2159,10 +2169,7 @@ - inode->u.ext3_i.i_data[block] = iloc.raw_inode->i_block[block]; - INIT_LIST_HEAD(&inode->u.ext3_i.i_orphan); - -- if (inode->i_ino == EXT3_ACL_IDX_INO || -- inode->i_ino == EXT3_ACL_DATA_INO) -- /* Nothing to do */ ; -- else if (S_ISREG(inode->i_mode)) { -+ if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext3_file_inode_operations; - inode->i_fop = &ext3_file_operations; - inode->i_mapping->a_ops = &ext3_aops; -@@ -2170,15 +2177,17 @@ - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - } else if (S_ISLNK(inode->i_mode)) { -- if (!inode->i_blocks) -+ if (ext3_inode_is_fast_symlink(inode)) - inode->i_op = &ext3_fast_symlink_inode_operations; - else { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - } -- } else -+ } else { -+ inode->i_op = &ext3_special_inode_operations; - init_special_inode(inode, inode->i_mode, - le32_to_cpu(iloc.raw_inode->i_block[0])); -+ } - brelse(iloc.bh); - ext3_set_inode_flags(inode); - return; -Index: linux-2.4.22-vanilla/fs/ext3/namei.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/namei.c 2003-12-02 23:55:37.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/namei.c 2003-12-02 23:55:38.000000000 +0300 -@@ -29,6 +29,7 @@ - #include <linux/sched.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/fcntl.h> - #include <linux/stat.h> - #include <linux/string.h> -@@ -1613,7 +1614,7 @@ - if (IS_SYNC(dir)) - handle->h_sync = 1; - -- inode = ext3_new_inode (handle, dir, S_IFDIR); -+ inode = ext3_new_inode (handle, dir, S_IFDIR | mode); - err = PTR_ERR(inode); - if (IS_ERR(inode)) - goto out_stop; -@@ -1621,7 +1622,6 @@ - inode->i_op = &ext3_dir_inode_operations; - inode->i_fop = &ext3_dir_operations; - inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize; -- inode->i_blocks = 0; - dir_block = ext3_bread (handle, inode, 0, 1, &err); - if (!dir_block) { - inode->i_nlink--; /* is this nlink == 0? */ -@@ -1648,9 +1648,6 @@ - BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata"); - ext3_journal_dirty_metadata(handle, dir_block); - brelse (dir_block); -- inode->i_mode = S_IFDIR | mode; -- if (dir->i_mode & S_ISGID) -- inode->i_mode |= S_ISGID; - ext3_mark_inode_dirty(handle, inode); - err = ext3_add_entry (handle, dentry, inode); - if (err) { -@@ -2019,7 +2016,7 @@ - goto out_stop; - - if (l > sizeof (EXT3_I(inode)->i_data)) { -- inode->i_op = &page_symlink_inode_operations; -+ inode->i_op = &ext3_symlink_inode_operations; - inode->i_mapping->a_ops = &ext3_aops; - /* - * block_symlink() calls back into ext3_prepare/commit_write. -@@ -2244,4 +2241,16 @@ - rmdir: ext3_rmdir, /* BKL held */ - mknod: ext3_mknod, /* BKL held */ - rename: ext3_rename, /* BKL held */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; -+ -+struct inode_operations ext3_special_inode_operations = { -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ -Index: linux-2.4.22-vanilla/fs/ext3/super.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/super.c 2003-12-02 23:55:37.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/super.c 2003-12-02 23:56:03.000000000 +0300 -@@ -24,6 +24,7 @@ - #include <linux/jbd.h> - #include <linux/ext3_fs.h> - #include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> - #include <linux/slab.h> - #include <linux/init.h> - #include <linux/locks.h> -@@ -406,6 +407,7 @@ - kdev_t j_dev = sbi->s_journal->j_dev; - int i; - -+ ext3_xattr_put_super(sb); - journal_destroy(sbi->s_journal); - if (!(sb->s_flags & MS_RDONLY)) { - EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -@@ -505,6 +507,7 @@ - int is_remount) - { - unsigned long *mount_options = &sbi->s_mount_opt; -+ - uid_t *resuid = &sbi->s_resuid; - gid_t *resgid = &sbi->s_resgid; - char * this_char; -@@ -517,6 +520,13 @@ - this_char = strtok (NULL, ",")) { - if ((value = strchr (this_char, '=')) != NULL) - *value++ = 0; -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ if (!strcmp (this_char, "user_xattr")) -+ set_opt (*mount_options, XATTR_USER); -+ else if (!strcmp (this_char, "nouser_xattr")) -+ clear_opt (*mount_options, XATTR_USER); -+ else -+#endif - if (!strcmp (this_char, "bsddf")) - clear_opt (*mount_options, MINIX_DF); - else if (!strcmp (this_char, "nouid32")) { -@@ -934,6 +944,12 @@ - sbi->s_mount_opt = 0; - sbi->s_resuid = EXT3_DEF_RESUID; - sbi->s_resgid = EXT3_DEF_RESGID; -+ -+ /* Default extended attribute flags */ -+#ifdef CONFIG_EXT3_FS_XATTR_USER -+ /* set_opt(sbi->s_mount_opt, XATTR_USER); */ -+#endif -+ - if (!parse_options ((char *) data, &sb_block, sbi, &journal_inum, 0)) { - sb->s_dev = 0; - goto out_fail; -@@ -1822,22 +1838,35 @@ - - static int __init init_ext3_fs(void) - { -+ int error; - #ifdef CONFIG_QUOTA - init_dquot_operations(&ext3_qops); - old_sync_dquot = ext3_qops.sync_dquot; - ext3_qops.sync_dquot = ext3_sync_dquot; - #endif -- return register_filesystem(&ext3_fs_type); -+ error = init_ext3_xattr(); -+ if (error) -+ return error; -+ error = init_ext3_xattr_user(); -+ if (error) -+ goto fail; -+ error = register_filesystem(&ext3_fs_type); -+ if (!error) -+ return 0; -+ -+ exit_ext3_xattr_user(); -+fail: -+ exit_ext3_xattr(); -+ return error; - } - - static void __exit exit_ext3_fs(void) - { - unregister_filesystem(&ext3_fs_type); -+ exit_ext3_xattr_user(); -+ exit_ext3_xattr(); - } - --EXPORT_SYMBOL(ext3_force_commit); --EXPORT_SYMBOL(ext3_bread); -- - MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); - MODULE_DESCRIPTION("Second Extended Filesystem with journaling extensions"); - MODULE_LICENSE("GPL"); -Index: linux-2.4.22-vanilla/fs/ext3/symlink.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/symlink.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/symlink.c 2003-12-02 23:55:38.000000000 +0300 -@@ -20,6 +20,7 @@ - #include <linux/fs.h> - #include <linux/jbd.h> - #include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> - - static int ext3_readlink(struct dentry *dentry, char *buffer, int buflen) - { -@@ -33,7 +34,20 @@ - return vfs_follow_link(nd, s); - } - -+struct inode_operations ext3_symlink_inode_operations = { -+ readlink: page_readlink, /* BKL not held. Don't need */ -+ follow_link: page_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ -+}; -+ - struct inode_operations ext3_fast_symlink_inode_operations = { - readlink: ext3_readlink, /* BKL not held. Don't need */ - follow_link: ext3_follow_link, /* BKL not held. Don't need */ -+ setxattr: ext3_setxattr, /* BKL held */ -+ getxattr: ext3_getxattr, /* BKL held */ -+ listxattr: ext3_listxattr, /* BKL held */ -+ removexattr: ext3_removexattr, /* BKL held */ - }; -Index: linux-2.4.22-vanilla/fs/ext3/xattr.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/xattr.c 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/xattr.c 2003-12-02 23:55:38.000000000 +0300 -@@ -0,0 +1,1225 @@ -+/* -+ * linux/fs/ext3/xattr.c -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ * -+ * Fix by Harrison Xing <harrison@mountainviewdata.com>. -+ * Ext3 code with a lot of help from Eric Jarman <ejarman@acm.org>. -+ * Extended attributes for symlinks and special files added per -+ * suggestion of Luka Renko <luka.renko@hermes.si>. -+ */ -+ -+/* -+ * Extended attributes are stored on disk blocks allocated outside of -+ * any inode. The i_file_acl field is then made to point to this allocated -+ * block. If all extended attributes of an inode are identical, these -+ * inodes may share the same extended attribute block. Such situations -+ * are automatically detected by keeping a cache of recent attribute block -+ * numbers and hashes over the block's contents in memory. -+ * -+ * -+ * Extended attribute block layout: -+ * -+ * +------------------+ -+ * | header | -+ * | entry 1 | | -+ * | entry 2 | | growing downwards -+ * | entry 3 | v -+ * | four null bytes | -+ * | . . . | -+ * | value 1 | ^ -+ * | value 3 | | growing upwards -+ * | value 2 | | -+ * +------------------+ -+ * -+ * The block header is followed by multiple entry descriptors. These entry -+ * descriptors are variable in size, and alligned to EXT3_XATTR_PAD -+ * byte boundaries. The entry descriptors are sorted by attribute name, -+ * so that two extended attribute blocks can be compared efficiently. -+ * -+ * Attribute values are aligned to the end of the block, stored in -+ * no specific order. They are also padded to EXT3_XATTR_PAD byte -+ * boundaries. No additional gaps are left between them. -+ * -+ * Locking strategy -+ * ---------------- -+ * The VFS already holds the BKL and the inode->i_sem semaphore when any of -+ * the xattr inode operations are called, so we are guaranteed that only one -+ * processes accesses extended attributes of an inode at any time. -+ * -+ * For writing we also grab the ext3_xattr_sem semaphore. This ensures that -+ * only a single process is modifying an extended attribute block, even -+ * if the block is shared among inodes. -+ * -+ * Note for porting to 2.5 -+ * ----------------------- -+ * The BKL will no longer be held in the xattr inode operations. -+ */ -+ -+#include <linux/module.h> -+#include <linux/fs.h> -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+#include <linux/mbcache.h> -+#include <linux/quotaops.h> -+#include <asm/semaphore.h> -+#include <linux/compatmac.h> -+ -+#define EXT3_EA_USER "user." -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+# define mark_buffer_dirty(bh) mark_buffer_dirty(bh, 1) -+#endif -+ -+#define HDR(bh) ((struct ext3_xattr_header *)((bh)->b_data)) -+#define ENTRY(ptr) ((struct ext3_xattr_entry *)(ptr)) -+#define FIRST_ENTRY(bh) ENTRY(HDR(bh)+1) -+#define IS_LAST_ENTRY(entry) (*(__u32 *)(entry) == 0) -+ -+#ifdef EXT3_XATTR_DEBUG -+# define ea_idebug(inode, f...) do { \ -+ printk(KERN_DEBUG "inode %s:%ld: ", \ -+ kdevname(inode->i_dev), inode->i_ino); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+# define ea_bdebug(bh, f...) do { \ -+ printk(KERN_DEBUG "block %s:%ld: ", \ -+ kdevname(bh->b_dev), bh->b_blocknr); \ -+ printk(f); \ -+ printk("\n"); \ -+ } while (0) -+#else -+# define ea_idebug(f...) -+# define ea_bdebug(f...) -+#endif -+ -+static int ext3_xattr_set2(handle_t *, struct inode *, struct buffer_head *, -+ struct ext3_xattr_header *); -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+static int ext3_xattr_cache_insert(struct buffer_head *); -+static struct buffer_head *ext3_xattr_cache_find(struct inode *, -+ struct ext3_xattr_header *); -+static void ext3_xattr_cache_remove(struct buffer_head *); -+static void ext3_xattr_rehash(struct ext3_xattr_header *, -+ struct ext3_xattr_entry *); -+ -+static struct mb_cache *ext3_xattr_cache; -+ -+#else -+# define ext3_xattr_cache_insert(bh) 0 -+# define ext3_xattr_cache_find(inode, header) NULL -+# define ext3_xattr_cache_remove(bh) while(0) {} -+# define ext3_xattr_rehash(header, entry) while(0) {} -+#endif -+ -+/* -+ * If a file system does not share extended attributes among inodes, -+ * we should not need the ext3_xattr_sem semaphore. However, the -+ * filesystem may still contain shared blocks, so we always take -+ * the lock. -+ */ -+ -+DECLARE_MUTEX(ext3_xattr_sem); -+ -+static inline int -+ext3_xattr_new_block(handle_t *handle, struct inode *inode, -+ int * errp, int force) -+{ -+ struct super_block *sb = inode->i_sb; -+ int goal = le32_to_cpu(EXT3_SB(sb)->s_es->s_first_data_block) + -+ EXT3_I(inode)->i_block_group * EXT3_BLOCKS_PER_GROUP(sb); -+ -+ /* How can we enforce the allocation? */ -+ int block = ext3_new_block(handle, inode, goal, 0, 0, errp); -+#ifdef OLD_QUOTAS -+ if (!*errp) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#endif -+ return block; -+} -+ -+static inline int -+ext3_xattr_quota_alloc(struct inode *inode, int force) -+{ -+ /* How can we enforce the allocation? */ -+#ifdef OLD_QUOTAS -+ int error = DQUOT_ALLOC_BLOCK(inode->i_sb, inode, 1); -+ if (!error) -+ inode->i_blocks += inode->i_sb->s_blocksize >> 9; -+#else -+ int error = DQUOT_ALLOC_BLOCK(inode, 1); -+#endif -+ return error; -+} -+ -+#ifdef OLD_QUOTAS -+ -+static inline void -+ext3_xattr_quota_free(struct inode *inode) -+{ -+ DQUOT_FREE_BLOCK(inode->i_sb, inode, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+static inline void -+ext3_xattr_free_block(handle_t *handle, struct inode * inode, -+ unsigned long block) -+{ -+ ext3_free_blocks(handle, inode, block, 1); -+ inode->i_blocks -= inode->i_sb->s_blocksize >> 9; -+} -+ -+#else -+# define ext3_xattr_quota_free(inode) \ -+ DQUOT_FREE_BLOCK(inode, 1) -+# define ext3_xattr_free_block(handle, inode, block) \ -+ ext3_free_blocks(handle, inode, block, 1) -+#endif -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) -+ -+static inline struct buffer_head * -+sb_bread(struct super_block *sb, int block) -+{ -+ return bread(sb->s_dev, block, sb->s_blocksize); -+} -+ -+static inline struct buffer_head * -+sb_getblk(struct super_block *sb, int block) -+{ -+ return getblk(sb->s_dev, block, sb->s_blocksize); -+} -+ -+#endif -+ -+struct ext3_xattr_handler *ext3_xattr_handlers[EXT3_XATTR_INDEX_MAX]; -+rwlock_t ext3_handler_lock = RW_LOCK_UNLOCKED; -+ -+int -+ext3_xattr_register(int name_index, struct ext3_xattr_handler *handler) -+{ -+ int error = -EINVAL; -+ -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ if (!ext3_xattr_handlers[name_index-1]) { -+ ext3_xattr_handlers[name_index-1] = handler; -+ error = 0; -+ } -+ write_unlock(&ext3_handler_lock); -+ } -+ return error; -+} -+ -+void -+ext3_xattr_unregister(int name_index, struct ext3_xattr_handler *handler) -+{ -+ if (name_index > 0 || name_index <= EXT3_XATTR_INDEX_MAX) { -+ write_lock(&ext3_handler_lock); -+ ext3_xattr_handlers[name_index-1] = NULL; -+ write_unlock(&ext3_handler_lock); -+ } -+} -+ -+static inline const char * -+strcmp_prefix(const char *a, const char *a_prefix) -+{ -+ while (*a_prefix && *a == *a_prefix) { -+ a++; -+ a_prefix++; -+ } -+ return *a_prefix ? NULL : a; -+} -+ -+/* -+ * Decode the extended attribute name, and translate it into -+ * the name_index and name suffix. -+ */ -+static inline struct ext3_xattr_handler * -+ext3_xattr_resolve_name(const char **name) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ int i; -+ -+ if (!*name) -+ return NULL; -+ read_lock(&ext3_handler_lock); -+ for (i=0; i<EXT3_XATTR_INDEX_MAX; i++) { -+ if (ext3_xattr_handlers[i]) { -+ const char *n = strcmp_prefix(*name, -+ ext3_xattr_handlers[i]->prefix); -+ if (n) { -+ handler = ext3_xattr_handlers[i]; -+ *name = n; -+ break; -+ } -+ } -+ } -+ read_unlock(&ext3_handler_lock); -+ return handler; -+} -+ -+static inline struct ext3_xattr_handler * -+ext3_xattr_handler(int name_index) -+{ -+ struct ext3_xattr_handler *handler = NULL; -+ if (name_index > 0 && name_index <= EXT3_XATTR_INDEX_MAX) { -+ read_lock(&ext3_handler_lock); -+ handler = ext3_xattr_handlers[name_index-1]; -+ read_unlock(&ext3_handler_lock); -+ } -+ return handler; -+} -+ -+/* -+ * Inode operation getxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_getxattr(struct dentry *dentry, const char *name, -+ void *buffer, size_t size) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->get(inode, name, buffer, size); -+} -+ -+/* -+ * Inode operation listxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+ssize_t -+ext3_listxattr(struct dentry *dentry, char *buffer, size_t size) -+{ -+ return ext3_xattr_list(dentry->d_inode, buffer, size); -+} -+ -+/* -+ * Inode operation setxattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_setxattr(struct dentry *dentry, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ if (size == 0) -+ value = ""; /* empty EA, do not remove */ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, value, size, flags); -+} -+ -+/* -+ * Inode operation removexattr() -+ * -+ * dentry->d_inode->i_sem down -+ * BKL held [before 2.5.x] -+ */ -+int -+ext3_removexattr(struct dentry *dentry, const char *name) -+{ -+ struct ext3_xattr_handler *handler; -+ struct inode *inode = dentry->d_inode; -+ -+ handler = ext3_xattr_resolve_name(&name); -+ if (!handler) -+ return -ENOTSUP; -+ return handler->set(inode, name, NULL, 0, XATTR_REPLACE); -+} -+ -+/* -+ * ext3_xattr_get() -+ * -+ * Copy an extended attribute into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size; -+ char *end; -+ int name_len, error; -+ -+ ea_idebug(inode, "name=%d.%s, buffer=%p, buffer_size=%ld", -+ name_index, name, buffer, (long)buffer_size); -+ -+ if (name == NULL) -+ return -EINVAL; -+ if (!EXT3_I(inode)->i_file_acl) -+ return -ENOATTR; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_get", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* find named attribute */ -+ name_len = strlen(name); -+ -+ error = -ERANGE; -+ if (name_len > 255) -+ goto cleanup; -+ entry = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (name_index == entry->e_name_index && -+ name_len == entry->e_name_len && -+ memcmp(name, entry->e_name, name_len) == 0) -+ goto found; -+ entry = next; -+ } -+ /* Check the remaining name entries */ -+ while (!IS_LAST_ENTRY(entry)) { -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ entry = next; -+ } -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ error = -ENOATTR; -+ goto cleanup; -+found: -+ /* check the buffer size */ -+ if (entry->e_value_block != 0) -+ goto bad_block; -+ size = le32_to_cpu(entry->e_value_size); -+ if (size > inode->i_sb->s_blocksize || -+ le16_to_cpu(entry->e_value_offs) + size > inode->i_sb->s_blocksize) -+ goto bad_block; -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (buffer) { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ /* return value of attribute */ -+ memcpy(buffer, bh->b_data + le16_to_cpu(entry->e_value_offs), -+ size); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_list() -+ * -+ * Copy a list of attribute names into the buffer -+ * provided, or compute the buffer size required. -+ * Buffer is NULL to compute the size of the buffer required. -+ * -+ * Returns a negative error number on failure, or the number of bytes -+ * used / required on success. -+ */ -+int -+ext3_xattr_list(struct inode *inode, char *buffer, size_t buffer_size) -+{ -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_entry *entry; -+ unsigned int block, size = 0; -+ char *buf, *end; -+ int error; -+ -+ ea_idebug(inode, "buffer=%p, buffer_size=%ld", -+ buffer, (long)buffer_size); -+ -+ if (!EXT3_I(inode)->i_file_acl) -+ return 0; -+ block = EXT3_I(inode)->i_file_acl; -+ ea_idebug(inode, "reading block %d", block); -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) -+ return -EIO; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), le32_to_cpu(HDR(bh)->h_refcount)); -+ end = bh->b_data + bh->b_size; -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(inode->i_sb, "ext3_xattr_list", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* compute the size required for the list of attribute names */ -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ struct ext3_xattr_entry *next = -+ EXT3_XATTR_NEXT(entry); -+ if ((char *)next >= end) -+ goto bad_block; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ size += handler->list(NULL, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ -+ if (ext3_xattr_cache_insert(bh)) -+ ea_idebug(inode, "cache insert failed"); -+ if (!buffer) { -+ error = size; -+ goto cleanup; -+ } else { -+ error = -ERANGE; -+ if (size > buffer_size) -+ goto cleanup; -+ } -+ -+ /* list the attribute names */ -+ buf = buffer; -+ for (entry = FIRST_ENTRY(bh); !IS_LAST_ENTRY(entry); -+ entry = EXT3_XATTR_NEXT(entry)) { -+ struct ext3_xattr_handler *handler; -+ -+ handler = ext3_xattr_handler(entry->e_name_index); -+ if (handler) -+ buf += handler->list(buf, inode, entry->e_name, -+ entry->e_name_len); -+ } -+ error = size; -+ -+cleanup: -+ brelse(bh); -+ -+ return error; -+} -+ -+/* -+ * If the EXT3_FEATURE_COMPAT_EXT_ATTR feature of this file system is -+ * not set, set it. -+ */ -+static void ext3_xattr_update_super_block(handle_t *handle, -+ struct super_block *sb) -+{ -+ if (EXT3_HAS_COMPAT_FEATURE(sb, EXT3_FEATURE_COMPAT_EXT_ATTR)) -+ return; -+ -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) -+ EXT3_SB(sb)->s_feature_compat |= EXT3_FEATURE_COMPAT_EXT_ATTR; -+#endif -+ EXT3_SB(sb)->s_es->s_feature_compat |= -+ cpu_to_le32(EXT3_FEATURE_COMPAT_EXT_ATTR); -+ sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ unlock_super(sb); -+} -+ -+/* -+ * ext3_xattr_set() -+ * -+ * Create, replace or remove an extended attribute for this inode. Buffer -+ * is NULL to remove an existing extended attribute, and non-NULL to -+ * either replace an existing extended attribute, or create a new extended -+ * attribute. The flags XATTR_REPLACE and XATTR_CREATE -+ * specify that an extended attribute must exist and must not exist -+ * previous to the call, respectively. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t value_len, int flags) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *bh = NULL; -+ struct ext3_xattr_header *header = NULL; -+ struct ext3_xattr_entry *here, *last; -+ unsigned int name_len; -+ int block = EXT3_I(inode)->i_file_acl; -+ int min_offs = sb->s_blocksize, not_found = 1, free, error; -+ char *end; -+ -+ /* -+ * header -- Points either into bh, or to a temporarily -+ * allocated buffer. -+ * here -- The named entry found, or the place for inserting, within -+ * the block pointed to by header. -+ * last -- Points right after the last named entry within the block -+ * pointed to by header. -+ * min_offs -- The offset of the first value (values are aligned -+ * towards the end of the block). -+ * end -- Points right after the block pointed to by header. -+ */ -+ -+ ea_idebug(inode, "name=%d.%s, value=%p, value_len=%ld", -+ name_index, name, value, (long)value_len); -+ -+ if (IS_RDONLY(inode)) -+ return -EROFS; -+ if (IS_IMMUTABLE(inode) || IS_APPEND(inode)) -+ return -EPERM; -+ if (value == NULL) -+ value_len = 0; -+ if (name == NULL) -+ return -EINVAL; -+ name_len = strlen(name); -+ if (name_len > 255 || value_len > sb->s_blocksize) -+ return -ERANGE; -+ down(&ext3_xattr_sem); -+ -+ if (block) { -+ /* The inode already has an extended attribute block. */ -+ bh = sb_bread(sb, block); -+ error = -EIO; -+ if (!bh) -+ goto cleanup; -+ ea_bdebug(bh, "b_count=%d, refcount=%d", -+ atomic_read(&(bh->b_count)), -+ le32_to_cpu(HDR(bh)->h_refcount)); -+ header = HDR(bh); -+ end = bh->b_data + bh->b_size; -+ if (header->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ header->h_blocks != cpu_to_le32(1)) { -+bad_block: ext3_error(sb, "ext3_xattr_set", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ /* Find the named attribute. */ -+ here = FIRST_ENTRY(bh); -+ while (!IS_LAST_ENTRY(here)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(here); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!here->e_value_block && here->e_value_size) { -+ int offs = le16_to_cpu(here->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ not_found = name_index - here->e_name_index; -+ if (!not_found) -+ not_found = name_len - here->e_name_len; -+ if (!not_found) -+ not_found = memcmp(name, here->e_name,name_len); -+ if (not_found <= 0) -+ break; -+ here = next; -+ } -+ last = here; -+ /* We still need to compute min_offs and last. */ -+ while (!IS_LAST_ENTRY(last)) { -+ struct ext3_xattr_entry *next = EXT3_XATTR_NEXT(last); -+ if ((char *)next >= end) -+ goto bad_block; -+ if (!last->e_value_block && last->e_value_size) { -+ int offs = le16_to_cpu(last->e_value_offs); -+ if (offs < min_offs) -+ min_offs = offs; -+ } -+ last = next; -+ } -+ -+ /* Check whether we have enough space left. */ -+ free = min_offs - ((char*)last - (char*)header) - sizeof(__u32); -+ } else { -+ /* We will use a new extended attribute block. */ -+ free = sb->s_blocksize - -+ sizeof(struct ext3_xattr_header) - sizeof(__u32); -+ here = last = NULL; /* avoid gcc uninitialized warning. */ -+ } -+ -+ if (not_found) { -+ /* Request to remove a nonexistent attribute? */ -+ error = -ENOATTR; -+ if (flags & XATTR_REPLACE) -+ goto cleanup; -+ error = 0; -+ if (value == NULL) -+ goto cleanup; -+ else -+ free -= EXT3_XATTR_LEN(name_len); -+ } else { -+ /* Request to create an existing attribute? */ -+ error = -EEXIST; -+ if (flags & XATTR_CREATE) -+ goto cleanup; -+ if (!here->e_value_block && here->e_value_size) { -+ unsigned int size = le32_to_cpu(here->e_value_size); -+ -+ if (le16_to_cpu(here->e_value_offs) + size > -+ sb->s_blocksize || size > sb->s_blocksize) -+ goto bad_block; -+ free += EXT3_XATTR_SIZE(size); -+ } -+ } -+ free -= EXT3_XATTR_SIZE(value_len); -+ error = -ENOSPC; -+ if (free < 0) -+ goto cleanup; -+ -+ /* Here we know that we can set the new attribute. */ -+ -+ if (header) { -+ if (header->h_refcount == cpu_to_le32(1)) { -+ ea_bdebug(bh, "modifying in-place"); -+ ext3_xattr_cache_remove(bh); -+ error = ext3_journal_get_write_access(handle, bh); -+ if (error) -+ goto cleanup; -+ } else { -+ int offset; -+ -+ ea_bdebug(bh, "cloning"); -+ header = kmalloc(bh->b_size, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memcpy(header, HDR(bh), bh->b_size); -+ header->h_refcount = cpu_to_le32(1); -+ offset = (char *)header - bh->b_data; -+ here = ENTRY((char *)here + offset); -+ last = ENTRY((char *)last + offset); -+ } -+ } else { -+ /* Allocate a buffer where we construct the new block. */ -+ header = kmalloc(sb->s_blocksize, GFP_KERNEL); -+ error = -ENOMEM; -+ if (header == NULL) -+ goto cleanup; -+ memset(header, 0, sb->s_blocksize); -+ end = (char *)header + sb->s_blocksize; -+ header->h_magic = cpu_to_le32(EXT3_XATTR_MAGIC); -+ header->h_blocks = header->h_refcount = cpu_to_le32(1); -+ last = here = ENTRY(header+1); -+ } -+ -+ if (not_found) { -+ /* Insert the new name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ int rest = (char *)last - (char *)here; -+ memmove((char *)here + size, here, rest); -+ memset(here, 0, size); -+ here->e_name_index = name_index; -+ here->e_name_len = name_len; -+ memcpy(here->e_name, name, name_len); -+ } else { -+ /* Remove the old value. */ -+ if (!here->e_value_block && here->e_value_size) { -+ char *first_val = (char *)header + min_offs; -+ int offs = le16_to_cpu(here->e_value_offs); -+ char *val = (char *)header + offs; -+ size_t size = EXT3_XATTR_SIZE( -+ le32_to_cpu(here->e_value_size)); -+ memmove(first_val + size, first_val, val - first_val); -+ memset(first_val, 0, size); -+ here->e_value_offs = 0; -+ min_offs += size; -+ -+ /* Adjust all value offsets. */ -+ last = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(last)) { -+ int o = le16_to_cpu(last->e_value_offs); -+ if (!last->e_value_block && o < offs) -+ last->e_value_offs = -+ cpu_to_le16(o + size); -+ last = EXT3_XATTR_NEXT(last); -+ } -+ } -+ if (value == NULL) { -+ /* Remove this attribute. */ -+ if (EXT3_XATTR_NEXT(ENTRY(header+1)) == last) { -+ /* This block is now empty. */ -+ error = ext3_xattr_set2(handle, inode, bh,NULL); -+ goto cleanup; -+ } else { -+ /* Remove the old name. */ -+ int size = EXT3_XATTR_LEN(name_len); -+ last = ENTRY((char *)last - size); -+ memmove(here, (char*)here + size, -+ (char*)last - (char*)here); -+ memset(last, 0, size); -+ } -+ } -+ } -+ -+ if (value != NULL) { -+ /* Insert the new value. */ -+ here->e_value_size = cpu_to_le32(value_len); -+ if (value_len) { -+ size_t size = EXT3_XATTR_SIZE(value_len); -+ char *val = (char *)header + min_offs - size; -+ here->e_value_offs = -+ cpu_to_le16((char *)val - (char *)header); -+ memset(val + size - EXT3_XATTR_PAD, 0, -+ EXT3_XATTR_PAD); /* Clear the pad bytes. */ -+ memcpy(val, value, value_len); -+ } -+ } -+ ext3_xattr_rehash(header, here); -+ -+ error = ext3_xattr_set2(handle, inode, bh, header); -+ -+cleanup: -+ brelse(bh); -+ if (!(bh && header == HDR(bh))) -+ kfree(header); -+ up(&ext3_xattr_sem); -+ -+ return error; -+} -+ -+/* -+ * Second half of ext3_xattr_set(): Update the file system. -+ */ -+static int -+ext3_xattr_set2(handle_t *handle, struct inode *inode, -+ struct buffer_head *old_bh, struct ext3_xattr_header *header) -+{ -+ struct super_block *sb = inode->i_sb; -+ struct buffer_head *new_bh = NULL; -+ int error; -+ -+ if (header) { -+ new_bh = ext3_xattr_cache_find(inode, header); -+ if (new_bh) { -+ /* -+ * We found an identical block in the cache. -+ * The old block will be released after updating -+ * the inode. -+ */ -+ ea_bdebug(old_bh, "reusing block %ld", -+ new_bh->b_blocknr); -+ -+ error = -EDQUOT; -+ if (ext3_xattr_quota_alloc(inode, 1)) -+ goto cleanup; -+ -+ error = ext3_journal_get_write_access(handle, new_bh); -+ if (error) -+ goto cleanup; -+ HDR(new_bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(new_bh)->h_refcount) + 1); -+ ea_bdebug(new_bh, "refcount now=%d", -+ le32_to_cpu(HDR(new_bh)->h_refcount)); -+ } else if (old_bh && header == HDR(old_bh)) { -+ /* Keep this block. */ -+ new_bh = old_bh; -+ (void)ext3_xattr_cache_insert(new_bh); -+ } else { -+ /* We need to allocate a new block */ -+ int force = EXT3_I(inode)->i_file_acl != 0; -+ int block = ext3_xattr_new_block(handle, inode, -+ &error, force); -+ if (error) -+ goto cleanup; -+ ea_idebug(inode, "creating block %d", block); -+ -+ new_bh = sb_getblk(sb, block); -+ if (!new_bh) { -+getblk_failed: ext3_xattr_free_block(handle, inode, block); -+ error = -EIO; -+ goto cleanup; -+ } -+ lock_buffer(new_bh); -+ error = ext3_journal_get_create_access(handle, new_bh); -+ if (error) { -+ unlock_buffer(new_bh); -+ goto getblk_failed; -+ } -+ memcpy(new_bh->b_data, header, new_bh->b_size); -+ mark_buffer_uptodate(new_bh, 1); -+ unlock_buffer(new_bh); -+ (void)ext3_xattr_cache_insert(new_bh); -+ -+ ext3_xattr_update_super_block(handle, sb); -+ } -+ error = ext3_journal_dirty_metadata(handle, new_bh); -+ if (error) -+ goto cleanup; -+ } -+ -+ /* Update the inode. */ -+ EXT3_I(inode)->i_file_acl = new_bh ? new_bh->b_blocknr : 0; -+ inode->i_ctime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, inode); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ -+ error = 0; -+ if (old_bh && old_bh != new_bh) { -+ /* -+ * If there was an old block, and we are not still using it, -+ * we now release the old block. -+ */ -+ unsigned int refcount = le32_to_cpu(HDR(old_bh)->h_refcount); -+ -+ error = ext3_journal_get_write_access(handle, old_bh); -+ if (error) -+ goto cleanup; -+ if (refcount == 1) { -+ /* Free the old block. */ -+ ea_bdebug(old_bh, "freeing"); -+ ext3_xattr_free_block(handle, inode, old_bh->b_blocknr); -+ -+ /* ext3_forget() calls bforget() for us, but we -+ let our caller release old_bh, so we need to -+ duplicate the handle before. */ -+ get_bh(old_bh); -+ ext3_forget(handle, 1, inode, old_bh,old_bh->b_blocknr); -+ } else { -+ /* Decrement the refcount only. */ -+ refcount--; -+ HDR(old_bh)->h_refcount = cpu_to_le32(refcount); -+ ext3_xattr_quota_free(inode); -+ ext3_journal_dirty_metadata(handle, old_bh); -+ ea_bdebug(old_bh, "refcount now=%d", refcount); -+ } -+ } -+ -+cleanup: -+ if (old_bh != new_bh) -+ brelse(new_bh); -+ -+ return error; -+} -+ -+/* -+ * ext3_xattr_delete_inode() -+ * -+ * Free extended attribute resources associated with this inode. This -+ * is called immediately before an inode is freed. -+ */ -+void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+ struct buffer_head *bh; -+ unsigned int block = EXT3_I(inode)->i_file_acl; -+ -+ if (!block) -+ return; -+ down(&ext3_xattr_sem); -+ -+ bh = sb_bread(inode->i_sb, block); -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: block %d read error", inode->i_ino, block); -+ goto cleanup; -+ } -+ ea_bdebug(bh, "b_count=%d", atomic_read(&(bh->b_count))); -+ if (HDR(bh)->h_magic != cpu_to_le32(EXT3_XATTR_MAGIC) || -+ HDR(bh)->h_blocks != cpu_to_le32(1)) { -+ ext3_error(inode->i_sb, "ext3_xattr_delete_inode", -+ "inode %ld: bad block %d", inode->i_ino, block); -+ goto cleanup; -+ } -+ ext3_journal_get_write_access(handle, bh); -+ ea_bdebug(bh, "refcount now=%d", le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ if (HDR(bh)->h_refcount == cpu_to_le32(1)) { -+ ext3_xattr_cache_remove(bh); -+ ext3_xattr_free_block(handle, inode, block); -+ ext3_forget(handle, 1, inode, bh, block); -+ bh = NULL; -+ } else { -+ HDR(bh)->h_refcount = cpu_to_le32( -+ le32_to_cpu(HDR(bh)->h_refcount) - 1); -+ ext3_journal_dirty_metadata(handle, bh); -+ if (IS_SYNC(inode)) -+ handle->h_sync = 1; -+ ext3_xattr_quota_free(inode); -+ } -+ EXT3_I(inode)->i_file_acl = 0; -+ -+cleanup: -+ brelse(bh); -+ up(&ext3_xattr_sem); -+} -+ -+/* -+ * ext3_xattr_put_super() -+ * -+ * This is called when a file system is unmounted. -+ */ -+void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ mb_cache_shrink(ext3_xattr_cache, sb->s_dev); -+#endif -+} -+ -+#ifdef CONFIG_EXT3_FS_XATTR_SHARING -+ -+/* -+ * ext3_xattr_cache_insert() -+ * -+ * Create a new entry in the extended attribute cache, and insert -+ * it unless such an entry is already in the cache. -+ * -+ * Returns 0, or a negative error number on failure. -+ */ -+static int -+ext3_xattr_cache_insert(struct buffer_head *bh) -+{ -+ __u32 hash = le32_to_cpu(HDR(bh)->h_hash); -+ struct mb_cache_entry *ce; -+ int error; -+ -+ ce = mb_cache_entry_alloc(ext3_xattr_cache); -+ if (!ce) -+ return -ENOMEM; -+ error = mb_cache_entry_insert(ce, bh->b_dev, bh->b_blocknr, &hash); -+ if (error) { -+ mb_cache_entry_free(ce); -+ if (error == -EBUSY) { -+ ea_bdebug(bh, "already in cache (%d cache entries)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ error = 0; -+ } -+ } else { -+ ea_bdebug(bh, "inserting [%x] (%d cache entries)", (int)hash, -+ atomic_read(&ext3_xattr_cache->c_entry_count)); -+ mb_cache_entry_release(ce); -+ } -+ return error; -+} -+ -+/* -+ * ext3_xattr_cmp() -+ * -+ * Compare two extended attribute blocks for equality. -+ * -+ * Returns 0 if the blocks are equal, 1 if they differ, and -+ * a negative error number on errors. -+ */ -+static int -+ext3_xattr_cmp(struct ext3_xattr_header *header1, -+ struct ext3_xattr_header *header2) -+{ -+ struct ext3_xattr_entry *entry1, *entry2; -+ -+ entry1 = ENTRY(header1+1); -+ entry2 = ENTRY(header2+1); -+ while (!IS_LAST_ENTRY(entry1)) { -+ if (IS_LAST_ENTRY(entry2)) -+ return 1; -+ if (entry1->e_hash != entry2->e_hash || -+ entry1->e_name_len != entry2->e_name_len || -+ entry1->e_value_size != entry2->e_value_size || -+ memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) -+ return 1; -+ if (entry1->e_value_block != 0 || entry2->e_value_block != 0) -+ return -EIO; -+ if (memcmp((char *)header1 + le16_to_cpu(entry1->e_value_offs), -+ (char *)header2 + le16_to_cpu(entry2->e_value_offs), -+ le32_to_cpu(entry1->e_value_size))) -+ return 1; -+ -+ entry1 = EXT3_XATTR_NEXT(entry1); -+ entry2 = EXT3_XATTR_NEXT(entry2); -+ } -+ if (!IS_LAST_ENTRY(entry2)) -+ return 1; -+ return 0; -+} -+ -+/* -+ * ext3_xattr_cache_find() -+ * -+ * Find an identical extended attribute block. -+ * -+ * Returns a pointer to the block found, or NULL if such a block was -+ * not found or an error occurred. -+ */ -+static struct buffer_head * -+ext3_xattr_cache_find(struct inode *inode, struct ext3_xattr_header *header) -+{ -+ __u32 hash = le32_to_cpu(header->h_hash); -+ struct mb_cache_entry *ce; -+ -+ if (!header->h_hash) -+ return NULL; /* never share */ -+ ea_idebug(inode, "looking for cached blocks [%x]", (int)hash); -+ ce = mb_cache_entry_find_first(ext3_xattr_cache, 0, inode->i_dev, hash); -+ while (ce) { -+ struct buffer_head *bh = sb_bread(inode->i_sb, ce->e_block); -+ -+ if (!bh) { -+ ext3_error(inode->i_sb, "ext3_xattr_cache_find", -+ "inode %ld: block %ld read error", -+ inode->i_ino, ce->e_block); -+ } else if (le32_to_cpu(HDR(bh)->h_refcount) > -+ EXT3_XATTR_REFCOUNT_MAX) { -+ ea_idebug(inode, "block %ld refcount %d>%d",ce->e_block, -+ le32_to_cpu(HDR(bh)->h_refcount), -+ EXT3_XATTR_REFCOUNT_MAX); -+ } else if (!ext3_xattr_cmp(header, HDR(bh))) { -+ ea_bdebug(bh, "b_count=%d",atomic_read(&(bh->b_count))); -+ mb_cache_entry_release(ce); -+ return bh; -+ } -+ brelse(bh); -+ ce = mb_cache_entry_find_next(ce, 0, inode->i_dev, hash); -+ } -+ return NULL; -+} -+ -+/* -+ * ext3_xattr_cache_remove() -+ * -+ * Remove the cache entry of a block from the cache. Called when a -+ * block becomes invalid. -+ */ -+static void -+ext3_xattr_cache_remove(struct buffer_head *bh) -+{ -+ struct mb_cache_entry *ce; -+ -+ ce = mb_cache_entry_get(ext3_xattr_cache, bh->b_dev, bh->b_blocknr); -+ if (ce) { -+ ea_bdebug(bh, "removing (%d cache entries remaining)", -+ atomic_read(&ext3_xattr_cache->c_entry_count)-1); -+ mb_cache_entry_free(ce); -+ } else -+ ea_bdebug(bh, "no cache entry"); -+} -+ -+#define NAME_HASH_SHIFT 5 -+#define VALUE_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_hash_entry() -+ * -+ * Compute the hash of an extended attribute. -+ */ -+static inline void ext3_xattr_hash_entry(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ __u32 hash = 0; -+ char *name = entry->e_name; -+ int n; -+ -+ for (n=0; n < entry->e_name_len; n++) { -+ hash = (hash << NAME_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - NAME_HASH_SHIFT)) ^ -+ *name++; -+ } -+ -+ if (entry->e_value_block == 0 && entry->e_value_size != 0) { -+ __u32 *value = (__u32 *)((char *)header + -+ le16_to_cpu(entry->e_value_offs)); -+ for (n = (le32_to_cpu(entry->e_value_size) + -+ EXT3_XATTR_ROUND) >> EXT3_XATTR_PAD_BITS; n; n--) { -+ hash = (hash << VALUE_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - VALUE_HASH_SHIFT)) ^ -+ le32_to_cpu(*value++); -+ } -+ } -+ entry->e_hash = cpu_to_le32(hash); -+} -+ -+#undef NAME_HASH_SHIFT -+#undef VALUE_HASH_SHIFT -+ -+#define BLOCK_HASH_SHIFT 16 -+ -+/* -+ * ext3_xattr_rehash() -+ * -+ * Re-compute the extended attribute hash value after an entry has changed. -+ */ -+static void ext3_xattr_rehash(struct ext3_xattr_header *header, -+ struct ext3_xattr_entry *entry) -+{ -+ struct ext3_xattr_entry *here; -+ __u32 hash = 0; -+ -+ ext3_xattr_hash_entry(header, entry); -+ here = ENTRY(header+1); -+ while (!IS_LAST_ENTRY(here)) { -+ if (!here->e_hash) { -+ /* Block is not shared if an entry's hash value == 0 */ -+ hash = 0; -+ break; -+ } -+ hash = (hash << BLOCK_HASH_SHIFT) ^ -+ (hash >> (8*sizeof(hash) - BLOCK_HASH_SHIFT)) ^ -+ le32_to_cpu(here->e_hash); -+ here = EXT3_XATTR_NEXT(here); -+ } -+ header->h_hash = cpu_to_le32(hash); -+} -+ -+#undef BLOCK_HASH_SHIFT -+ -+int __init -+init_ext3_xattr(void) -+{ -+ ext3_xattr_cache = mb_cache_create("ext3_xattr", NULL, -+ sizeof(struct mb_cache_entry) + -+ sizeof(struct mb_cache_entry_index), 1, 61); -+ if (!ext3_xattr_cache) -+ return -ENOMEM; -+ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+ if (ext3_xattr_cache) -+ mb_cache_destroy(ext3_xattr_cache); -+ ext3_xattr_cache = NULL; -+} -+ -+#else /* CONFIG_EXT3_FS_XATTR_SHARING */ -+ -+int __init -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+void -+exit_ext3_xattr(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_SHARING */ -Index: linux-2.4.22-vanilla/fs/ext3/xattr_user.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/xattr_user.c 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/xattr_user.c 2003-12-02 23:55:39.000000000 +0300 -@@ -0,0 +1,111 @@ -+/* -+ * linux/fs/ext3/xattr_user.c -+ * Handler for extended user attributes. -+ * -+ * Copyright (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+#include <linux/module.h> -+#include <linux/string.h> -+#include <linux/fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+# include <linux/ext3_acl.h> -+#endif -+ -+#define XATTR_USER_PREFIX "user." -+ -+static size_t -+ext3_xattr_user_list(char *list, struct inode *inode, -+ const char *name, int name_len) -+{ -+ const int prefix_len = sizeof(XATTR_USER_PREFIX)-1; -+ -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return 0; -+ -+ if (list) { -+ memcpy(list, XATTR_USER_PREFIX, prefix_len); -+ memcpy(list+prefix_len, name, name_len); -+ list[prefix_len + name_len] = '\0'; -+ } -+ return prefix_len + name_len + 1; -+} -+ -+static int -+ext3_xattr_user_get(struct inode *inode, const char *name, -+ void *buffer, size_t size) -+{ -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_READ); -+#else -+ error = permission(inode, MAY_READ); -+#endif -+ if (error) -+ return error; -+ -+ return ext3_xattr_get(inode, EXT3_XATTR_INDEX_USER, name, -+ buffer, size); -+} -+ -+static int -+ext3_xattr_user_set(struct inode *inode, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ handle_t *handle; -+ int error; -+ -+ if (strcmp(name, "") == 0) -+ return -EINVAL; -+ if (!test_opt(inode->i_sb, XATTR_USER)) -+ return -ENOTSUP; -+ if ( !S_ISREG(inode->i_mode) && -+ (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) -+ return -EPERM; -+#ifdef CONFIG_EXT3_FS_POSIX_ACL -+ error = ext3_permission_locked(inode, MAY_WRITE); -+#else -+ error = permission(inode, MAY_WRITE); -+#endif -+ if (error) -+ return error; -+ -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ if (IS_ERR(handle)) -+ return PTR_ERR(handle); -+ error = ext3_xattr_set(handle, inode, EXT3_XATTR_INDEX_USER, name, -+ value, size, flags); -+ ext3_journal_stop(handle, inode); -+ -+ return error; -+} -+ -+struct ext3_xattr_handler ext3_xattr_user_handler = { -+ prefix: XATTR_USER_PREFIX, -+ list: ext3_xattr_user_list, -+ get: ext3_xattr_user_get, -+ set: ext3_xattr_user_set, -+}; -+ -+int __init -+init_ext3_xattr_user(void) -+{ -+ return ext3_xattr_register(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} -+ -+void -+exit_ext3_xattr_user(void) -+{ -+ ext3_xattr_unregister(EXT3_XATTR_INDEX_USER, -+ &ext3_xattr_user_handler); -+} -Index: linux-2.4.22-vanilla/fs/jfs/jfs_xattr.h -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/jfs/jfs_xattr.h 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/jfs/jfs_xattr.h 2003-12-02 23:55:39.000000000 +0300 -@@ -52,8 +52,10 @@ - #define END_EALIST(ealist) \ - ((struct jfs_ea *) (((char *) (ealist)) + EALIST_SIZE(ealist))) - --extern int __jfs_setxattr(struct inode *, const char *, void *, size_t, int); --extern int jfs_setxattr(struct dentry *, const char *, void *, size_t, int); -+extern int __jfs_setxattr(struct inode *, const char *, const void *, size_t, -+ int); -+extern int jfs_setxattr(struct dentry *, const char *, const void *, size_t, -+ int); - extern ssize_t __jfs_getxattr(struct inode *, const char *, void *, size_t); - extern ssize_t jfs_getxattr(struct dentry *, const char *, void *, size_t); - extern ssize_t jfs_listxattr(struct dentry *, char *, size_t); -Index: linux-2.4.22-vanilla/fs/jfs/xattr.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/jfs/xattr.c 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/jfs/xattr.c 2003-12-02 23:55:39.000000000 +0300 -@@ -641,7 +641,7 @@ - } - - static int can_set_xattr(struct inode *inode, const char *name, -- void *value, size_t value_len) -+ const void *value, size_t value_len) - { - if (IS_RDONLY(inode)) - return -EROFS; -@@ -660,7 +660,7 @@ - return permission(inode, MAY_WRITE); - } - --int __jfs_setxattr(struct inode *inode, const char *name, void *value, -+int __jfs_setxattr(struct inode *inode, const char *name, const void *value, - size_t value_len, int flags) - { - struct jfs_ea_list *ealist; -@@ -799,7 +799,7 @@ - return rc; - } - --int jfs_setxattr(struct dentry *dentry, const char *name, void *value, -+int jfs_setxattr(struct dentry *dentry, const char *name, const void *value, - size_t value_len, int flags) - { - if (value == NULL) { /* empty EA, do not remove */ -Index: linux-2.4.22-vanilla/fs/mbcache.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/mbcache.c 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/mbcache.c 2003-12-02 23:55:39.000000000 +0300 -@@ -0,0 +1,648 @@ -+/* -+ * linux/fs/mbcache.c -+ * (C) 2001-2002 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+/* -+ * Filesystem Meta Information Block Cache (mbcache) -+ * -+ * The mbcache caches blocks of block devices that need to be located -+ * by their device/block number, as well as by other criteria (such -+ * as the block's contents). -+ * -+ * There can only be one cache entry in a cache per device and block number. -+ * Additional indexes need not be unique in this sense. The number of -+ * additional indexes (=other criteria) can be hardwired at compile time -+ * or specified at cache create time. -+ * -+ * Each cache entry is of fixed size. An entry may be `valid' or `invalid' -+ * in the cache. A valid entry is in the main hash tables of the cache, -+ * and may also be in the lru list. An invalid entry is not in any hashes -+ * or lists. -+ * -+ * A valid cache entry is only in the lru list if no handles refer to it. -+ * Invalid cache entries will be freed when the last handle to the cache -+ * entry is released. Entries that cannot be freed immediately are put -+ * back on the lru list. -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+ -+#include <linux/fs.h> -+#include <linux/slab.h> -+#include <linux/sched.h> -+#include <linux/cache_def.h> -+#include <linux/version.h> -+#include <linux/init.h> -+#include <linux/mbcache.h> -+ -+ -+#ifdef MB_CACHE_DEBUG -+# define mb_debug(f...) do { \ -+ printk(KERN_DEBUG f); \ -+ printk("\n"); \ -+ } while (0) -+#define mb_assert(c) do { if (!(c)) \ -+ printk(KERN_ERR "assertion " #c " failed\n"); \ -+ } while(0) -+#else -+# define mb_debug(f...) do { } while(0) -+# define mb_assert(c) do { } while(0) -+#endif -+#define mb_error(f...) do { \ -+ printk(KERN_ERR f); \ -+ printk("\n"); \ -+ } while(0) -+ -+MODULE_AUTHOR("Andreas Gruenbacher <a.gruenbacher@computer.org>"); -+MODULE_DESCRIPTION("Meta block cache (for extended attributes)"); -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) -+MODULE_LICENSE("GPL"); -+#endif -+ -+EXPORT_SYMBOL(mb_cache_create); -+EXPORT_SYMBOL(mb_cache_shrink); -+EXPORT_SYMBOL(mb_cache_destroy); -+EXPORT_SYMBOL(mb_cache_entry_alloc); -+EXPORT_SYMBOL(mb_cache_entry_insert); -+EXPORT_SYMBOL(mb_cache_entry_release); -+EXPORT_SYMBOL(mb_cache_entry_takeout); -+EXPORT_SYMBOL(mb_cache_entry_free); -+EXPORT_SYMBOL(mb_cache_entry_dup); -+EXPORT_SYMBOL(mb_cache_entry_get); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+EXPORT_SYMBOL(mb_cache_entry_find_first); -+EXPORT_SYMBOL(mb_cache_entry_find_next); -+#endif -+ -+ -+/* -+ * Global data: list of all mbcache's, lru list, and a spinlock for -+ * accessing cache data structures on SMP machines. The lru list is -+ * global across all mbcaches. -+ */ -+ -+static LIST_HEAD(mb_cache_list); -+static LIST_HEAD(mb_cache_lru_list); -+static spinlock_t mb_cache_spinlock = SPIN_LOCK_UNLOCKED; -+ -+static inline int -+mb_cache_indexes(struct mb_cache *cache) -+{ -+#ifdef MB_CACHE_INDEXES_COUNT -+ return MB_CACHE_INDEXES_COUNT; -+#else -+ return cache->c_indexes_count; -+#endif -+} -+ -+/* -+ * What the mbcache registers as to get shrunk dynamically. -+ */ -+ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask); -+ -+static struct cache_definition mb_cache_definition = { -+ "mb_cache", -+ mb_cache_memory_pressure -+}; -+ -+ -+static inline int -+__mb_cache_entry_is_hashed(struct mb_cache_entry *ce) -+{ -+ return !list_empty(&ce->e_block_list); -+} -+ -+ -+static inline void -+__mb_cache_entry_unhash(struct mb_cache_entry *ce) -+{ -+ int n; -+ -+ if (__mb_cache_entry_is_hashed(ce)) { -+ list_del_init(&ce->e_block_list); -+ for (n=0; n<mb_cache_indexes(ce->e_cache); n++) -+ list_del(&ce->e_indexes[n].o_list); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_forget(struct mb_cache_entry *ce, int gfp_mask) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ -+ mb_assert(atomic_read(&ce->e_used) == 0); -+ if (cache->c_op.free && cache->c_op.free(ce, gfp_mask)) { -+ /* free failed -- put back on the lru list -+ for freeing later. */ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&ce->e_lru_list, &mb_cache_lru_list); -+ spin_unlock(&mb_cache_spinlock); -+ } else { -+ kmem_cache_free(cache->c_entry_cache, ce); -+ atomic_dec(&cache->c_entry_count); -+ } -+} -+ -+ -+static inline void -+__mb_cache_entry_release_unlock(struct mb_cache_entry *ce) -+{ -+ if (atomic_dec_and_test(&ce->e_used)) { -+ if (__mb_cache_entry_is_hashed(ce)) -+ list_add_tail(&ce->e_lru_list, &mb_cache_lru_list); -+ else { -+ spin_unlock(&mb_cache_spinlock); -+ __mb_cache_entry_forget(ce, GFP_KERNEL); -+ return; -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_memory_pressure() memory pressure callback -+ * -+ * This function is called by the kernel memory management when memory -+ * gets low. -+ * -+ * @priority: Amount by which to shrink the cache (0 = highes priority) -+ * @gfp_mask: (ignored) -+ */ -+static void -+mb_cache_memory_pressure(int priority, unsigned int gfp_mask) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int count = 0; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &mb_cache_list) { -+ struct mb_cache *cache = -+ list_entry(l, struct mb_cache, c_cache_list); -+ mb_debug("cache %s (%d)", cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ count += atomic_read(&cache->c_entry_count); -+ } -+ mb_debug("trying to free %d of %d entries", -+ count / (priority ? priority : 1), count); -+ if (priority) -+ count /= priority; -+ while (count-- && !list_empty(&mb_cache_lru_list)) { -+ struct mb_cache_entry *ce = -+ list_entry(mb_cache_lru_list.next, -+ struct mb_cache_entry, e_lru_list); -+ list_del(&ce->e_lru_list); -+ __mb_cache_entry_unhash(ce); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), gfp_mask); -+ } -+} -+ -+ -+/* -+ * mb_cache_create() create a new cache -+ * -+ * All entries in one cache are equal size. Cache entries may be from -+ * multiple devices. If this is the first mbcache created, registers -+ * the cache with kernel memory management. Returns NULL if no more -+ * memory was available. -+ * -+ * @name: name of the cache (informal) -+ * @cache_op: contains the callback called when freeing a cache entry -+ * @entry_size: The size of a cache entry, including -+ * struct mb_cache_entry -+ * @indexes_count: number of additional indexes in the cache. Must equal -+ * MB_CACHE_INDEXES_COUNT if the number of indexes is -+ * hardwired. -+ * @bucket_count: number of hash buckets -+ */ -+struct mb_cache * -+mb_cache_create(const char *name, struct mb_cache_op *cache_op, -+ size_t entry_size, int indexes_count, int bucket_count) -+{ -+ int m=0, n; -+ struct mb_cache *cache = NULL; -+ -+ if(entry_size < sizeof(struct mb_cache_entry) + -+ indexes_count * sizeof(struct mb_cache_entry_index)) -+ return NULL; -+ -+ MOD_INC_USE_COUNT; -+ cache = kmalloc(sizeof(struct mb_cache) + -+ indexes_count * sizeof(struct list_head), GFP_KERNEL); -+ if (!cache) -+ goto fail; -+ cache->c_name = name; -+ cache->c_op.free = NULL; -+ if (cache_op) -+ cache->c_op.free = cache_op->free; -+ atomic_set(&cache->c_entry_count, 0); -+ cache->c_bucket_count = bucket_count; -+#ifdef MB_CACHE_INDEXES_COUNT -+ mb_assert(indexes_count == MB_CACHE_INDEXES_COUNT); -+#else -+ cache->c_indexes_count = indexes_count; -+#endif -+ cache->c_block_hash = kmalloc(bucket_count * sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_block_hash) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_block_hash[n]); -+ for (m=0; m<indexes_count; m++) { -+ cache->c_indexes_hash[m] = kmalloc(bucket_count * -+ sizeof(struct list_head), -+ GFP_KERNEL); -+ if (!cache->c_indexes_hash[m]) -+ goto fail; -+ for (n=0; n<bucket_count; n++) -+ INIT_LIST_HEAD(&cache->c_indexes_hash[m][n]); -+ } -+ cache->c_entry_cache = kmem_cache_create(name, entry_size, 0, -+ 0 /*SLAB_POISON | SLAB_RED_ZONE*/, NULL, NULL); -+ if (!cache->c_entry_cache) -+ goto fail; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_add(&cache->c_cache_list, &mb_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ return cache; -+ -+fail: -+ if (cache) { -+ while (--m >= 0) -+ kfree(cache->c_indexes_hash[m]); -+ if (cache->c_block_hash) -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ } -+ MOD_DEC_USE_COUNT; -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_shrink() -+ * -+ * Removes all cache entires of a device from the cache. All cache entries -+ * currently in use cannot be freed, and thus remain in the cache. -+ * -+ * @cache: which cache to shrink -+ * @dev: which device's cache entries to shrink -+ */ -+void -+mb_cache_shrink(struct mb_cache *cache, kdev_t dev) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_dev == dev) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+} -+ -+ -+/* -+ * mb_cache_destroy() -+ * -+ * Shrinks the cache to its minimum possible size (hopefully 0 entries), -+ * and then destroys it. If this was the last mbcache, un-registers the -+ * mbcache from kernel memory management. -+ */ -+void -+mb_cache_destroy(struct mb_cache *cache) -+{ -+ LIST_HEAD(free_list); -+ struct list_head *l, *ltmp; -+ int n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &mb_cache_lru_list) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_lru_list); -+ if (ce->e_cache == cache) { -+ list_del(&ce->e_lru_list); -+ list_add_tail(&ce->e_lru_list, &free_list); -+ __mb_cache_entry_unhash(ce); -+ } -+ } -+ list_del(&cache->c_cache_list); -+ spin_unlock(&mb_cache_spinlock); -+ list_for_each_safe(l, ltmp, &free_list) { -+ __mb_cache_entry_forget(list_entry(l, struct mb_cache_entry, -+ e_lru_list), GFP_KERNEL); -+ } -+ -+ if (atomic_read(&cache->c_entry_count) > 0) { -+ mb_error("cache %s: %d orphaned entries", -+ cache->c_name, -+ atomic_read(&cache->c_entry_count)); -+ } -+ -+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,3,0)) -+ /* We don't have kmem_cache_destroy() in 2.2.x */ -+ kmem_cache_shrink(cache->c_entry_cache); -+#else -+ kmem_cache_destroy(cache->c_entry_cache); -+#endif -+ for (n=0; n < mb_cache_indexes(cache); n++) -+ kfree(cache->c_indexes_hash[n]); -+ kfree(cache->c_block_hash); -+ kfree(cache); -+ -+ MOD_DEC_USE_COUNT; -+} -+ -+ -+/* -+ * mb_cache_entry_alloc() -+ * -+ * Allocates a new cache entry. The new entry will not be valid initially, -+ * and thus cannot be looked up yet. It should be filled with data, and -+ * then inserted into the cache using mb_cache_entry_insert(). Returns NULL -+ * if no more memory was available. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_alloc(struct mb_cache *cache) -+{ -+ struct mb_cache_entry *ce; -+ -+ atomic_inc(&cache->c_entry_count); -+ ce = kmem_cache_alloc(cache->c_entry_cache, GFP_KERNEL); -+ if (ce) { -+ INIT_LIST_HEAD(&ce->e_lru_list); -+ INIT_LIST_HEAD(&ce->e_block_list); -+ ce->e_cache = cache; -+ atomic_set(&ce->e_used, 1); -+ } -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_insert() -+ * -+ * Inserts an entry that was allocated using mb_cache_entry_alloc() into -+ * the cache. After this, the cache entry can be looked up, but is not yet -+ * in the lru list as the caller still holds a handle to it. Returns 0 on -+ * success, or -EBUSY if a cache entry for that device + inode exists -+ * already (this may happen after a failed lookup, if another process has -+ * inserted the same cache entry in the meantime). -+ * -+ * @dev: device the cache entry belongs to -+ * @block: block number -+ * @keys: array of additional keys. There must be indexes_count entries -+ * in the array (as specified when creating the cache). -+ */ -+int -+mb_cache_entry_insert(struct mb_cache_entry *ce, kdev_t dev, -+ unsigned long block, unsigned int keys[]) -+{ -+ struct mb_cache *cache = ce->e_cache; -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ int error = -EBUSY, n; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) -+ goto out; -+ } -+ __mb_cache_entry_unhash(ce); -+ ce->e_dev = dev; -+ ce->e_block = block; -+ list_add(&ce->e_block_list, &cache->c_block_hash[bucket]); -+ for (n=0; n<mb_cache_indexes(cache); n++) { -+ ce->e_indexes[n].o_key = keys[n]; -+ bucket = keys[n] % cache->c_bucket_count; -+ list_add(&ce->e_indexes[n].o_list, -+ &cache->c_indexes_hash[n][bucket]); -+ } -+out: -+ spin_unlock(&mb_cache_spinlock); -+ return error; -+} -+ -+ -+/* -+ * mb_cache_entry_release() -+ * -+ * Release a handle to a cache entry. When the last handle to a cache entry -+ * is released it is either freed (if it is invalid) or otherwise inserted -+ * in to the lru list. -+ */ -+void -+mb_cache_entry_release(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_takeout() -+ * -+ * Take a cache entry out of the cache, making it invalid. The entry can later -+ * be re-inserted using mb_cache_entry_insert(), or released using -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_takeout(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ spin_unlock(&mb_cache_spinlock); -+} -+ -+ -+/* -+ * mb_cache_entry_free() -+ * -+ * This is equivalent to the sequence mb_cache_entry_takeout() -- -+ * mb_cache_entry_release(). -+ */ -+void -+mb_cache_entry_free(struct mb_cache_entry *ce) -+{ -+ spin_lock(&mb_cache_spinlock); -+ mb_assert(list_empty(&ce->e_lru_list)); -+ __mb_cache_entry_unhash(ce); -+ __mb_cache_entry_release_unlock(ce); -+} -+ -+ -+/* -+ * mb_cache_entry_dup() -+ * -+ * Duplicate a handle to a cache entry (does not duplicate the cache entry -+ * itself). After the call, both the old and the new handle must be released. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_dup(struct mb_cache_entry *ce) -+{ -+ atomic_inc(&ce->e_used); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_get() -+ * -+ * Get a cache entry by device / block number. (There can only be one entry -+ * in the cache per device and block.) Returns NULL if no such cache entry -+ * exists. -+ */ -+struct mb_cache_entry * -+mb_cache_entry_get(struct mb_cache *cache, kdev_t dev, unsigned long block) -+{ -+ unsigned int bucket = (HASHDEV(dev) + block) % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ spin_lock(&mb_cache_spinlock); -+ list_for_each(l, &cache->c_block_hash[bucket]) { -+ ce = list_entry(l, struct mb_cache_entry, e_block_list); -+ if (ce->e_dev == dev && ce->e_block == block) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ goto cleanup; -+ } -+ } -+ ce = NULL; -+ -+cleanup: -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+ -+static struct mb_cache_entry * -+__mb_cache_entry_find(struct list_head *l, struct list_head *head, -+ int index, kdev_t dev, unsigned int key) -+{ -+ while (l != head) { -+ struct mb_cache_entry *ce = -+ list_entry(l, struct mb_cache_entry, -+ e_indexes[index].o_list); -+ if (ce->e_dev == dev && ce->e_indexes[index].o_key == key) { -+ if (!list_empty(&ce->e_lru_list)) -+ list_del_init(&ce->e_lru_list); -+ atomic_inc(&ce->e_used); -+ return ce; -+ } -+ l = l->next; -+ } -+ return NULL; -+} -+ -+ -+/* -+ * mb_cache_entry_find_first() -+ * -+ * Find the first cache entry on a given device with a certain key in -+ * an additional index. Additonal matches can be found with -+ * mb_cache_entry_find_next(). Returns NULL if no match was found. -+ * -+ * @cache: the cache to search -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_first(struct mb_cache *cache, int index, kdev_t dev, -+ unsigned int key) -+{ -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = cache->c_indexes_hash[index][bucket].next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ spin_unlock(&mb_cache_spinlock); -+ return ce; -+} -+ -+ -+/* -+ * mb_cache_entry_find_next() -+ * -+ * Find the next cache entry on a given device with a certain key in an -+ * additional index. Returns NULL if no match could be found. The previous -+ * entry is atomatically released, so that mb_cache_entry_find_next() can -+ * be called like this: -+ * -+ * entry = mb_cache_entry_find_first(); -+ * while (entry) { -+ * ... -+ * entry = mb_cache_entry_find_next(entry, ...); -+ * } -+ * -+ * @prev: The previous match -+ * @index: the number of the additonal index to search (0<=index<indexes_count) -+ * @dev: the device the cache entry should belong to -+ * @key: the key in the index -+ */ -+struct mb_cache_entry * -+mb_cache_entry_find_next(struct mb_cache_entry *prev, int index, kdev_t dev, -+ unsigned int key) -+{ -+ struct mb_cache *cache = prev->e_cache; -+ unsigned int bucket = key % cache->c_bucket_count; -+ struct list_head *l; -+ struct mb_cache_entry *ce; -+ -+ mb_assert(index < mb_cache_indexes(cache)); -+ spin_lock(&mb_cache_spinlock); -+ l = prev->e_indexes[index].o_list.next; -+ ce = __mb_cache_entry_find(l, &cache->c_indexes_hash[index][bucket], -+ index, dev, key); -+ __mb_cache_entry_release_unlock(prev); -+ return ce; -+} -+ -+#endif /* !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) */ -+ -+static int __init init_mbcache(void) -+{ -+ register_cache(&mb_cache_definition); -+ return 0; -+} -+ -+static void __exit exit_mbcache(void) -+{ -+ unregister_cache(&mb_cache_definition); -+} -+ -+module_init(init_mbcache) -+module_exit(exit_mbcache) -+ -Index: linux-2.4.22-vanilla/include/asm-arm/unistd.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/asm-arm/unistd.h 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/include/asm-arm/unistd.h 2003-12-02 23:55:39.000000000 +0300 -@@ -250,7 +250,6 @@ - #define __NR_security (__NR_SYSCALL_BASE+223) - #define __NR_gettid (__NR_SYSCALL_BASE+224) - #define __NR_readahead (__NR_SYSCALL_BASE+225) --#if 0 /* allocated in 2.5 */ - #define __NR_setxattr (__NR_SYSCALL_BASE+226) - #define __NR_lsetxattr (__NR_SYSCALL_BASE+227) - #define __NR_fsetxattr (__NR_SYSCALL_BASE+228) -@@ -263,7 +262,6 @@ - #define __NR_removexattr (__NR_SYSCALL_BASE+235) - #define __NR_lremovexattr (__NR_SYSCALL_BASE+236) - #define __NR_fremovexattr (__NR_SYSCALL_BASE+237) --#endif - #define __NR_tkill (__NR_SYSCALL_BASE+238) - #if 0 /* allocated in 2.5 */ - #define __NR_sendfile64 (__NR_SYSCALL_BASE+239) -Index: linux-2.4.22-vanilla/include/asm-ppc64/unistd.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/asm-ppc64/unistd.h 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/include/asm-ppc64/unistd.h 2003-12-02 23:55:39.000000000 +0300 -@@ -218,6 +218,7 @@ - #define __NR_mincore 206 - #define __NR_gettid 207 - #define __NR_tkill 208 -+#endif - #define __NR_setxattr 209 - #define __NR_lsetxattr 210 - #define __NR_fsetxattr 211 -@@ -230,6 +231,7 @@ - #define __NR_removexattr 218 - #define __NR_lremovexattr 219 - #define __NR_fremovexattr 220 -+#if 0 /* Reserved syscalls */ - #define __NR_futex 221 - #define __NR_sched_setaffinity 222 - #define __NR_sched_getaffinity 223 -Index: linux-2.4.22-vanilla/include/asm-s390/unistd.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/asm-s390/unistd.h 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/include/asm-s390/unistd.h 2003-12-02 23:55:39.000000000 +0300 -@@ -213,9 +213,18 @@ - #define __NR_getdents64 220 - #define __NR_fcntl64 221 - #define __NR_readahead 222 --/* -- * Numbers 224-235 are reserved for posix acl -- */ -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - #define __NR_gettid 236 - #define __NR_tkill 237 - -Index: linux-2.4.22-vanilla/include/asm-s390x/unistd.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/asm-s390x/unistd.h 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/include/asm-s390x/unistd.h 2003-12-02 23:55:39.000000000 +0300 -@@ -181,9 +181,18 @@ - #define __NR_mincore 218 - #define __NR_madvise 219 - #define __NR_readahead 222 --/* -- * Numbers 224-235 are reserved for posix acl -- */ -+#define __NR_setxattr 224 -+#define __NR_lsetxattr 225 -+#define __NR_fsetxattr 226 -+#define __NR_getxattr 227 -+#define __NR_lgetxattr 228 -+#define __NR_fgetxattr 229 -+#define __NR_listxattr 230 -+#define __NR_llistxattr 231 -+#define __NR_flistxattr 232 -+#define __NR_removexattr 233 -+#define __NR_lremovexattr 234 -+#define __NR_fremovexattr 235 - #define __NR_gettid 236 - #define __NR_tkill 237 - -Index: linux-2.4.22-vanilla/include/linux/cache_def.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/cache_def.h 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/cache_def.h 2003-12-02 23:55:39.000000000 +0300 -@@ -0,0 +1,15 @@ -+/* -+ * linux/cache_def.h -+ * Handling of caches defined in drivers, filesystems, ... -+ * -+ * Copyright (C) 2002 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+ */ -+ -+struct cache_definition { -+ const char *name; -+ void (*shrink)(int, unsigned int); -+ struct list_head link; -+}; -+ -+extern void register_cache(struct cache_definition *); -+extern void unregister_cache(struct cache_definition *); -Index: linux-2.4.22-vanilla/include/linux/errno.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/errno.h 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/errno.h 2003-12-02 23:55:39.000000000 +0300 -@@ -23,4 +23,8 @@ - - #endif - -+/* Defined for extended attributes */ -+#define ENOATTR ENODATA /* No such attribute */ -+#define ENOTSUP EOPNOTSUPP /* Operation not supported */ -+ - #endif -Index: linux-2.4.22-vanilla/include/linux/ext2_fs.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/ext2_fs.h 2003-11-03 23:41:26.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/ext2_fs.h 2003-12-02 23:55:39.000000000 +0300 -@@ -57,8 +57,6 @@ - */ - #define EXT2_BAD_INO 1 /* Bad blocks inode */ - #define EXT2_ROOT_INO 2 /* Root inode */ --#define EXT2_ACL_IDX_INO 3 /* ACL inode */ --#define EXT2_ACL_DATA_INO 4 /* ACL inode */ - #define EXT2_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT2_UNDEL_DIR_INO 6 /* Undelete directory inode */ - -@@ -86,7 +84,6 @@ - #else - # define EXT2_BLOCK_SIZE(s) (EXT2_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT2_ACLE_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (struct ext2_acl_entry)) - #define EXT2_ADDR_PER_BLOCK(s) (EXT2_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT2_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -121,28 +118,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext2_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext2_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext2_group_desc -@@ -314,6 +289,7 @@ - #define EXT2_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */ - #define EXT2_MOUNT_MINIX_DF 0x0080 /* Mimics the Minix statfs */ - #define EXT2_MOUNT_NO_UID32 0x0200 /* Disable 32-bit UIDs */ -+#define EXT2_MOUNT_XATTR_USER 0x4000 /* Extended user attributes */ - - #define clear_opt(o, opt) o &= ~EXT2_MOUNT_##opt - #define set_opt(o, opt) o |= EXT2_MOUNT_##opt -@@ -397,6 +373,7 @@ - - #ifdef __KERNEL__ - #define EXT2_SB(sb) (&((sb)->u.ext2_sb)) -+#define EXT2_I(inode) (&((inode)->u.ext2_i)) - #else - /* Assume that user mode programs are passing in an ext2fs superblock, not - * a kernel struct super_block. This will allow us to call the feature-test -@@ -466,7 +443,7 @@ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 - #define EXT2_FEATURE_INCOMPAT_ANY 0xffffffff - --#define EXT2_FEATURE_COMPAT_SUPP 0 -+#define EXT2_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT2_FEATURE_INCOMPAT_SUPP EXT2_FEATURE_INCOMPAT_FILETYPE - #define EXT2_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \ - EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \ -@@ -624,8 +601,10 @@ - - /* namei.c */ - extern struct inode_operations ext2_dir_inode_operations; -+extern struct inode_operations ext2_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext2_symlink_inode_operations; - extern struct inode_operations ext2_fast_symlink_inode_operations; - - #endif /* __KERNEL__ */ -Index: linux-2.4.22-vanilla/include/linux/ext2_xattr.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/ext2_xattr.h 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/ext2_xattr.h 2003-12-02 23:55:39.000000000 +0300 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext2_xattr.h -+ -+ On-disk format of extended attributes for the ext2 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT2_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT2_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT2_XATTR_INDEX_MAX 10 -+#define EXT2_XATTR_INDEX_USER 1 -+#define EXT2_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT2_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext2_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext2_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT2_XATTR_PAD_BITS 2 -+#define EXT2_XATTR_PAD (1<<EXT2_XATTR_PAD_BITS) -+#define EXT2_XATTR_ROUND (EXT2_XATTR_PAD-1) -+#define EXT2_XATTR_LEN(name_len) \ -+ (((name_len) + EXT2_XATTR_ROUND + \ -+ sizeof(struct ext2_xattr_entry)) & ~EXT2_XATTR_ROUND) -+#define EXT2_XATTR_NEXT(entry) \ -+ ( (struct ext2_xattr_entry *)( \ -+ (char *)(entry) + EXT2_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT2_XATTR_SIZE(size) \ -+ (((size) + EXT2_XATTR_ROUND) & ~EXT2_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT2_FS_XATTR -+ -+struct ext2_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext2_xattr_register(int, struct ext2_xattr_handler *); -+extern void ext2_xattr_unregister(int, struct ext2_xattr_handler *); -+ -+extern int ext2_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext2_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext2_listxattr(struct dentry *, char *, size_t); -+extern int ext2_removexattr(struct dentry *, const char *); -+ -+extern int ext2_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext2_xattr_list(struct inode *, char *, size_t); -+extern int ext2_xattr_set(struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext2_xattr_delete_inode(struct inode *); -+extern void ext2_xattr_put_super(struct super_block *); -+ -+extern int init_ext2_xattr(void) __init; -+extern void exit_ext2_xattr(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR */ -+# define ext2_setxattr NULL -+# define ext2_getxattr NULL -+# define ext2_listxattr NULL -+# define ext2_removexattr NULL -+ -+static inline int -+ext2_xattr_get(struct inode *inode, int name_index, -+ const char *name, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_list(struct inode *inode, char *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext2_xattr_set(struct inode *inode, int name_index, const char *name, -+ const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext2_xattr_delete_inode(struct inode *inode) -+{ -+} -+ -+static inline void -+ext2_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext2_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR */ -+ -+# ifdef CONFIG_EXT2_FS_XATTR_USER -+ -+extern int init_ext2_xattr_user(void) __init; -+extern void exit_ext2_xattr_user(void); -+ -+# else /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+static inline int -+init_ext2_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext2_xattr_user(void) -+{ -+} -+ -+# endif /* CONFIG_EXT2_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ -Index: linux-2.4.22-vanilla/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/ext3_fs.h 2003-12-02 23:55:37.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/ext3_fs.h 2003-12-02 23:55:39.000000000 +0300 -@@ -63,8 +63,6 @@ - */ - #define EXT3_BAD_INO 1 /* Bad blocks inode */ - #define EXT3_ROOT_INO 2 /* Root inode */ --#define EXT3_ACL_IDX_INO 3 /* ACL inode */ --#define EXT3_ACL_DATA_INO 4 /* ACL inode */ - #define EXT3_BOOT_LOADER_INO 5 /* Boot loader inode */ - #define EXT3_UNDEL_DIR_INO 6 /* Undelete directory inode */ - #define EXT3_RESIZE_INO 7 /* Reserved group descriptors inode */ -@@ -94,7 +92,6 @@ - #else - # define EXT3_BLOCK_SIZE(s) (EXT3_MIN_BLOCK_SIZE << (s)->s_log_block_size) - #endif --#define EXT3_ACLE_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (struct ext3_acl_entry)) - #define EXT3_ADDR_PER_BLOCK(s) (EXT3_BLOCK_SIZE(s) / sizeof (__u32)) - #ifdef __KERNEL__ - # define EXT3_BLOCK_SIZE_BITS(s) ((s)->s_blocksize_bits) -@@ -129,28 +126,6 @@ - #endif - - /* -- * ACL structures -- */ --struct ext3_acl_header /* Header of Access Control Lists */ --{ -- __u32 aclh_size; -- __u32 aclh_file_count; -- __u32 aclh_acle_count; -- __u32 aclh_first_acle; --}; -- --struct ext3_acl_entry /* Access Control List Entry */ --{ -- __u32 acle_size; -- __u16 acle_perms; /* Access permissions */ -- __u16 acle_type; /* Type of entry */ -- __u16 acle_tag; /* User or group identity */ -- __u16 acle_pad1; -- __u32 acle_next; /* Pointer on next entry for the */ -- /* same inode or on next free entry */ --}; -- --/* - * Structure of a blocks group descriptor - */ - struct ext3_group_desc -@@ -344,6 +319,7 @@ - #define EXT3_MOUNT_WRITEBACK_DATA 0x0C00 /* No data ordering */ - #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 */ - - /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */ - #ifndef _LINUX_EXT2_FS_H -@@ -521,7 +497,7 @@ - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - --#define EXT3_FEATURE_COMPAT_SUPP 0 -+#define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) - #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ -@@ -704,6 +680,7 @@ - extern unsigned long ext3_count_free (struct buffer_head *, unsigned); - - /* inode.c */ -+extern int ext3_forget(handle_t *, int, struct inode *, struct buffer_head *, 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 *); - -@@ -773,8 +750,10 @@ - - /* namei.c */ - extern struct inode_operations ext3_dir_inode_operations; -+extern struct inode_operations ext3_special_inode_operations; - - /* symlink.c */ -+extern struct inode_operations ext3_symlink_inode_operations; - extern struct inode_operations ext3_fast_symlink_inode_operations; - - -Index: linux-2.4.22-vanilla/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/ext3_jbd.h 2003-12-02 23:55:37.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/ext3_jbd.h 2003-12-02 23:55:39.000000000 +0300 -@@ -30,13 +30,19 @@ - - #define EXT3_SINGLEDATA_TRANS_BLOCKS 8U - -+/* Extended attributes may touch two data buffers, two bitmap buffers, -+ * and two group and summaries. */ -+ -+#define EXT3_XATTR_TRANS_BLOCKS 8 -+ - /* 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 - * quota files too (one for the group, one for the user quota). The - * superblock only gets updated once, of course, so don't bother - * counting that again for the quota updates. */ - --#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS - 2) -+#define EXT3_DATA_TRANS_BLOCKS (3 * EXT3_SINGLEDATA_TRANS_BLOCKS + \ -+ EXT3_XATTR_TRANS_BLOCKS - 2) - - extern int ext3_writepage_trans_blocks(struct inode *inode); - -Index: linux-2.4.22-vanilla/include/linux/ext3_xattr.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/ext3_xattr.h 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/ext3_xattr.h 2003-12-02 23:55:39.000000000 +0300 -@@ -0,0 +1,157 @@ -+/* -+ File: linux/ext3_xattr.h -+ -+ On-disk format of extended attributes for the ext3 filesystem. -+ -+ (C) 2001 Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/xattr.h> -+ -+/* Magic value in attribute blocks */ -+#define EXT3_XATTR_MAGIC 0xEA020000 -+ -+/* Maximum number of references to one attribute block */ -+#define EXT3_XATTR_REFCOUNT_MAX 1024 -+ -+/* Name indexes */ -+#define EXT3_XATTR_INDEX_MAX 10 -+#define EXT3_XATTR_INDEX_USER 1 -+#define EXT3_XATTR_INDEX_POSIX_ACL_ACCESS 2 -+#define EXT3_XATTR_INDEX_POSIX_ACL_DEFAULT 3 -+ -+struct ext3_xattr_header { -+ __u32 h_magic; /* magic number for identification */ -+ __u32 h_refcount; /* reference count */ -+ __u32 h_blocks; /* number of disk blocks used */ -+ __u32 h_hash; /* hash value of all attributes */ -+ __u32 h_reserved[4]; /* zero right now */ -+}; -+ -+struct ext3_xattr_entry { -+ __u8 e_name_len; /* length of name */ -+ __u8 e_name_index; /* attribute name index */ -+ __u16 e_value_offs; /* offset in disk block of value */ -+ __u32 e_value_block; /* disk block attribute is stored on (n/i) */ -+ __u32 e_value_size; /* size of attribute value */ -+ __u32 e_hash; /* hash value of name and value */ -+ char e_name[0]; /* attribute name */ -+}; -+ -+#define EXT3_XATTR_PAD_BITS 2 -+#define EXT3_XATTR_PAD (1<<EXT3_XATTR_PAD_BITS) -+#define EXT3_XATTR_ROUND (EXT3_XATTR_PAD-1) -+#define EXT3_XATTR_LEN(name_len) \ -+ (((name_len) + EXT3_XATTR_ROUND + \ -+ sizeof(struct ext3_xattr_entry)) & ~EXT3_XATTR_ROUND) -+#define EXT3_XATTR_NEXT(entry) \ -+ ( (struct ext3_xattr_entry *)( \ -+ (char *)(entry) + EXT3_XATTR_LEN((entry)->e_name_len)) ) -+#define EXT3_XATTR_SIZE(size) \ -+ (((size) + EXT3_XATTR_ROUND) & ~EXT3_XATTR_ROUND) -+ -+#ifdef __KERNEL__ -+ -+# ifdef CONFIG_EXT3_FS_XATTR -+ -+struct ext3_xattr_handler { -+ char *prefix; -+ size_t (*list)(char *list, struct inode *inode, const char *name, -+ int name_len); -+ int (*get)(struct inode *inode, const char *name, void *buffer, -+ size_t size); -+ int (*set)(struct inode *inode, const char *name, const void *buffer, -+ size_t size, int flags); -+}; -+ -+extern int ext3_xattr_register(int, struct ext3_xattr_handler *); -+extern void ext3_xattr_unregister(int, struct ext3_xattr_handler *); -+ -+extern int ext3_setxattr(struct dentry *, const char *, const void *, size_t, int); -+extern ssize_t ext3_getxattr(struct dentry *, const char *, void *, size_t); -+extern ssize_t ext3_listxattr(struct dentry *, char *, size_t); -+extern int ext3_removexattr(struct dentry *, const char *); -+ -+extern int ext3_xattr_get(struct inode *, int, const char *, void *, size_t); -+extern int ext3_xattr_list(struct inode *, char *, size_t); -+extern int ext3_xattr_set(handle_t *handle, struct inode *, int, const char *, const void *, size_t, int); -+ -+extern void ext3_xattr_delete_inode(handle_t *, struct inode *); -+extern void ext3_xattr_put_super(struct super_block *); -+ -+extern int init_ext3_xattr(void) __init; -+extern void exit_ext3_xattr(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR */ -+# define ext3_setxattr NULL -+# define ext3_getxattr NULL -+# define ext3_listxattr NULL -+# define ext3_removexattr NULL -+ -+static inline int -+ext3_xattr_get(struct inode *inode, int name_index, const char *name, -+ void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_list(struct inode *inode, void *buffer, size_t size) -+{ -+ return -ENOTSUP; -+} -+ -+static inline int -+ext3_xattr_set(handle_t *handle, struct inode *inode, int name_index, -+ const char *name, const void *value, size_t size, int flags) -+{ -+ return -ENOTSUP; -+} -+ -+static inline void -+ext3_xattr_delete_inode(handle_t *handle, struct inode *inode) -+{ -+} -+ -+static inline void -+ext3_xattr_put_super(struct super_block *sb) -+{ -+} -+ -+static inline int -+init_ext3_xattr(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr(void) -+{ -+} -+ -+# endif /* CONFIG_EXT3_FS_XATTR */ -+ -+# ifdef CONFIG_EXT3_FS_XATTR_USER -+ -+extern int init_ext3_xattr_user(void) __init; -+extern void exit_ext3_xattr_user(void); -+ -+# else /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+static inline int -+init_ext3_xattr_user(void) -+{ -+ return 0; -+} -+ -+static inline void -+exit_ext3_xattr_user(void) -+{ -+} -+ -+#endif /* CONFIG_EXT3_FS_XATTR_USER */ -+ -+#endif /* __KERNEL__ */ -+ -Index: linux-2.4.22-vanilla/include/linux/fs.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/fs.h 2003-12-02 23:55:35.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/fs.h 2003-12-02 23:55:39.000000000 +0300 -@@ -913,7 +913,7 @@ - int (*setattr) (struct dentry *, struct iattr *); - int (*setattr_raw) (struct inode *, struct iattr *); - int (*getattr) (struct dentry *, struct iattr *); -- int (*setxattr) (struct dentry *, const char *, void *, size_t, int); -+ int (*setxattr) (struct dentry *, const char *, const void *, size_t, int); - ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); - ssize_t (*listxattr) (struct dentry *, char *, size_t); - int (*removexattr) (struct dentry *, const char *); -Index: linux-2.4.22-vanilla/include/linux/mbcache.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/mbcache.h 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/mbcache.h 2003-12-02 23:55:39.000000000 +0300 -@@ -0,0 +1,69 @@ -+/* -+ File: linux/mbcache.h -+ -+ (C) 2001 by Andreas Gruenbacher, <a.gruenbacher@computer.org> -+*/ -+ -+/* Hardwire the number of additional indexes */ -+#define MB_CACHE_INDEXES_COUNT 1 -+ -+struct mb_cache_entry; -+ -+struct mb_cache_op { -+ int (*free)(struct mb_cache_entry *, int); -+}; -+ -+struct mb_cache { -+ struct list_head c_cache_list; -+ const char *c_name; -+ struct mb_cache_op c_op; -+ atomic_t c_entry_count; -+ int c_bucket_count; -+#ifndef MB_CACHE_INDEXES_COUNT -+ int c_indexes_count; -+#endif -+ kmem_cache_t *c_entry_cache; -+ struct list_head *c_block_hash; -+ struct list_head *c_indexes_hash[0]; -+}; -+ -+struct mb_cache_entry_index { -+ struct list_head o_list; -+ unsigned int o_key; -+}; -+ -+struct mb_cache_entry { -+ struct list_head e_lru_list; -+ struct mb_cache *e_cache; -+ atomic_t e_used; -+ kdev_t e_dev; -+ unsigned long e_block; -+ struct list_head e_block_list; -+ struct mb_cache_entry_index e_indexes[0]; -+}; -+ -+/* Functions on caches */ -+ -+struct mb_cache * mb_cache_create(const char *, struct mb_cache_op *, size_t, -+ int, int); -+void mb_cache_shrink(struct mb_cache *, kdev_t); -+void mb_cache_destroy(struct mb_cache *); -+ -+/* Functions on cache entries */ -+ -+struct mb_cache_entry *mb_cache_entry_alloc(struct mb_cache *); -+int mb_cache_entry_insert(struct mb_cache_entry *, kdev_t, unsigned long, -+ unsigned int[]); -+void mb_cache_entry_rehash(struct mb_cache_entry *, unsigned int[]); -+void mb_cache_entry_release(struct mb_cache_entry *); -+void mb_cache_entry_takeout(struct mb_cache_entry *); -+void mb_cache_entry_free(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_dup(struct mb_cache_entry *); -+struct mb_cache_entry *mb_cache_entry_get(struct mb_cache *, kdev_t, -+ unsigned long); -+#if !defined(MB_CACHE_INDEXES_COUNT) || (MB_CACHE_INDEXES_COUNT > 0) -+struct mb_cache_entry *mb_cache_entry_find_first(struct mb_cache *cache, int, -+ kdev_t, unsigned int); -+struct mb_cache_entry *mb_cache_entry_find_next(struct mb_cache_entry *, int, -+ kdev_t, unsigned int); -+#endif -Index: linux-2.4.22-vanilla/kernel/ksyms.c -=================================================================== ---- linux-2.4.22-vanilla.orig/kernel/ksyms.c 2003-12-02 23:55:34.000000000 +0300 -+++ linux-2.4.22-vanilla/kernel/ksyms.c 2003-12-02 23:55:39.000000000 +0300 -@@ -11,6 +11,7 @@ - - #include <linux/config.h> - #include <linux/slab.h> -+#include <linux/cache_def.h> - #include <linux/module.h> - #include <linux/blkdev.h> - #include <linux/cdrom.h> -@@ -91,6 +92,7 @@ - EXPORT_SYMBOL(exit_files); - EXPORT_SYMBOL(exit_fs); - EXPORT_SYMBOL(exit_sighand); -+EXPORT_SYMBOL(copy_fs_struct); - - /* internal kernel memory management */ - EXPORT_SYMBOL(_alloc_pages); -@@ -108,6 +110,8 @@ - EXPORT_SYMBOL(kmem_cache_alloc); - EXPORT_SYMBOL(kmem_cache_free); - EXPORT_SYMBOL(kmem_cache_size); -+EXPORT_SYMBOL(register_cache); -+EXPORT_SYMBOL(unregister_cache); - EXPORT_SYMBOL(kmalloc); - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); -Index: linux-2.4.22-vanilla/mm/vmscan.c -=================================================================== ---- linux-2.4.22-vanilla.orig/mm/vmscan.c 2003-11-03 23:41:27.000000000 +0300 -+++ linux-2.4.22-vanilla/mm/vmscan.c 2003-12-02 23:55:39.000000000 +0300 -@@ -18,6 +18,7 @@ - #include <linux/kernel_stat.h> - #include <linux/swap.h> - #include <linux/swapctl.h> -+#include <linux/cache_def.h> - #include <linux/smp_lock.h> - #include <linux/pagemap.h> - #include <linux/init.h> -@@ -34,6 +35,39 @@ - */ - #define DEF_PRIORITY (6) - -+static DECLARE_MUTEX(other_caches_sem); -+static LIST_HEAD(cache_definitions); -+ -+void register_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_add(&cache->link, &cache_definitions); -+ up(&other_caches_sem); -+} -+ -+void unregister_cache(struct cache_definition *cache) -+{ -+ down(&other_caches_sem); -+ list_del(&cache->link); -+ up(&other_caches_sem); -+} -+ -+static void shrink_other_caches(unsigned int priority, int gfp_mask) -+{ -+ struct list_head *p; -+ -+ if (down_trylock(&other_caches_sem)) -+ return; -+ -+ list_for_each_prev(p, &cache_definitions) { -+ struct cache_definition *cache = -+ list_entry(p, struct cache_definition, link); -+ -+ cache->shrink(priority, gfp_mask); -+ } -+ up(&other_caches_sem); -+} -+ - /* - * The swap-out function returns 1 if it successfully - * scanned all the pages it was asked to (`count'). -@@ -577,6 +611,7 @@ - - shrink_dcache_memory(priority, gfp_mask); - shrink_icache_memory(priority, gfp_mask); -+ shrink_other_caches(priority, gfp_mask); - #ifdef CONFIG_QUOTA - shrink_dqcache_memory(DEF_PRIORITY, gfp_mask); - #endif -Index: linux-2.4.22-vanilla/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/ext3/ext3-exports.c 2003-12-02 23:55:38.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/ext3/ext3-exports.c 2003-12-02 23:55:39.000000000 +0300 -@@ -0,0 +1,13 @@ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_xattr.h> -+ -+EXPORT_SYMBOL(ext3_force_commit); -+EXPORT_SYMBOL(ext3_bread); -+EXPORT_SYMBOL(ext3_xattr_register); -+EXPORT_SYMBOL(ext3_xattr_unregister); -+EXPORT_SYMBOL(ext3_xattr_get); -+EXPORT_SYMBOL(ext3_xattr_list); -+EXPORT_SYMBOL(ext3_xattr_set); diff --git a/lustre/kernel_patches/patches/listman-2.4.21-chaos.patch b/lustre/kernel_patches/patches/listman-2.4.21-chaos.patch deleted file mode 100644 index 6c85e492ad..0000000000 --- a/lustre/kernel_patches/patches/listman-2.4.21-chaos.patch +++ /dev/null @@ -1,26 +0,0 @@ -Index: linux-2.4.21-chaos/include/linux/list.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/list.h 2003-12-05 16:54:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/list.h 2003-12-12 16:08:20.000000000 +0300 -@@ -241,6 +241,21 @@ - pos = list_entry(pos->member.next, typeof(*pos), member), \ - prefetch(pos->member.next)) - -+#ifndef list_for_each_entry_safe -+/** -+ * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry -+ * @pos: the type * to use as a loop counter. -+ * @n: another type * to use as temporary storage -+ * @head: the head for your list. -+ * @member: the name of the list_struct within the struct. -+ */ -+#define list_for_each_entry_safe(pos, n, head, member) \ -+ for (pos = list_entry((head)->next, typeof(*pos), member), \ -+ n = list_entry(pos->member.next, typeof(*pos), member); \ -+ &pos->member != (head); \ -+ pos = n, n = list_entry(n->member.next, typeof(*n), member)) -+#endif -+ - #define list_first(head) (((head)->next != (head)) ? (head)->next: (struct list_head *) 0) - - #endif /* __KERNEL__ || _LVM_H_INCLUDE */ diff --git a/lustre/kernel_patches/patches/listman-2.4.20.patch b/lustre/kernel_patches/patches/listman-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/listman-2.4.20.patch rename to lustre/kernel_patches/patches/listman-2.4.24.patch diff --git a/lustre/kernel_patches/patches/lookup_bdev_init_intent.patch b/lustre/kernel_patches/patches/lookup_bdev_init_intent.patch new file mode 100644 index 0000000000..5555427f91 --- /dev/null +++ b/lustre/kernel_patches/patches/lookup_bdev_init_intent.patch @@ -0,0 +1,12 @@ +Index: linux-2.6.7/fs/block_dev.c +=================================================================== +--- linux-2.6.7.orig/fs/block_dev.c 2004-06-16 13:20:26.000000000 +0800 ++++ linux-2.6.7/fs/block_dev.c 2004-08-30 17:36:57.000000000 +0800 +@@ -832,6 +832,7 @@ + if (!path || !*path) + return ERR_PTR(-EINVAL); + ++ intent_init(&nd.intent, IT_LOOKUP); + error = path_lookup(path, LOOKUP_FOLLOW, &nd); + if (error) + return ERR_PTR(error); diff --git a/lustre/kernel_patches/patches/loop-sync-2.4.21-suse.patch b/lustre/kernel_patches/patches/loop-sync-2.4.21-suse.patch deleted file mode 100644 index c0f0f1d06f..0000000000 --- a/lustre/kernel_patches/patches/loop-sync-2.4.21-suse.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- linux/drivers/block/loop.c. 2004-05-11 16:27:23.000000000 -0700 -+++ linux/drivers/block/loop.c 2004-05-11 16:28:50.000000000 -0700 -@@ -978,7 +978,7 @@ static int lo_release(struct inode *inod - - lo = &loop_dev[dev]; - -- if (!(lo->lo_flags & LO_FLAGS_READ_ONLY)) { -+ if (!(lo->lo_flags & LO_FLAGS_READ_ONLY) && lo->lo_device != 0) { - fsync_dev(lo->lo_device); - invalidate_buffers(lo->lo_device); - } diff --git a/lustre/kernel_patches/patches/loop_device_get_info.patch b/lustre/kernel_patches/patches/loop_device_get_info.patch deleted file mode 100644 index d45d64b402..0000000000 --- a/lustre/kernel_patches/patches/loop_device_get_info.patch +++ /dev/null @@ -1,57 +0,0 @@ -Index: linux-2.4.20-8/drivers/block/loop.c -=================================================================== ---- linux-2.4.20-8.orig/drivers/block/loop.c 2002-11-29 07:53:12.000000000 +0800 -+++ linux-2.4.20-8/drivers/block/loop.c 2004-01-10 00:02:33.000000000 +0800 -@@ -843,6 +843,31 @@ - } - return copy_to_user(arg, &info, sizeof(info)) ? -EFAULT : 0; - } -+static int loop_get_info(struct loop_device *lo, struct loop_info *arg) -+{ -+ struct loop_info info; -+ struct file *file = lo->lo_backing_file; -+ -+ if (lo->lo_state != Lo_bound) -+ return -ENXIO; -+ if (!arg) -+ return -EINVAL; -+ memset(&info, 0, sizeof(info)); -+ info.lo_number = lo->lo_number; -+ info.lo_device = kdev_t_to_nr(file->f_dentry->d_inode->i_dev); -+ info.lo_inode = file->f_dentry->d_inode->i_ino; -+ info.lo_rdevice = kdev_t_to_nr(lo->lo_device); -+ info.lo_offset = lo->lo_offset; -+ info.lo_flags = lo->lo_flags; -+ strncpy(info.lo_name, lo->lo_name, LO_NAME_SIZE); -+ info.lo_encrypt_type = lo->lo_encrypt_type; -+ if (lo->lo_encrypt_key_size && capable(CAP_SYS_ADMIN)) { -+ info.lo_encrypt_key_size = lo->lo_encrypt_key_size; -+ memcpy(info.lo_encrypt_key, lo->lo_encrypt_key, -+ lo->lo_encrypt_key_size); -+ } -+ return memcpy(arg, &info, sizeof(info)) ? -EFAULT : 0; -+} - - static int lo_ioctl(struct inode * inode, struct file * file, - unsigned int cmd, unsigned long arg) -@@ -875,6 +900,9 @@ - case LOOP_GET_STATUS: - err = loop_get_status(lo, (struct loop_info *) arg); - break; -+ case LOOP_GET_INFO: -+ err = loop_get_info(lo, (struct loop_info *) arg); -+ break; - case BLKGETSIZE: - if (lo->lo_state != Lo_bound) { - err = -ENXIO; -Index: linux-2.4.20-8/include/linux/loop.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/loop.h 2001-09-18 04:16:30.000000000 +0800 -+++ linux-2.4.20-8/include/linux/loop.h 2004-01-09 23:50:17.000000000 +0800 -@@ -151,5 +151,6 @@ - #define LOOP_CLR_FD 0x4C01 - #define LOOP_SET_STATUS 0x4C02 - #define LOOP_GET_STATUS 0x4C03 -+#define LOOP_GET_INFO 0x4C04 - - #endif diff --git a/lustre/kernel_patches/patches/lustre_build.patch b/lustre/kernel_patches/patches/lustre_build.patch deleted file mode 100644 index 70f6a37d4b..0000000000 --- a/lustre/kernel_patches/patches/lustre_build.patch +++ /dev/null @@ -1,33 +0,0 @@ - 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/mcore-2.4.20-8.patch b/lustre/kernel_patches/patches/mcore-2.4.20-8.patch deleted file mode 100644 index c8b80ebcfd..0000000000 --- a/lustre/kernel_patches/patches/mcore-2.4.20-8.patch +++ /dev/null @@ -1,2738 +0,0 @@ -? linux/.config -? linux/include/linux/autoconf.h -? linux/include/linux/modules -Index: linux/Makefile -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/Makefile,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.1 -diff -u -r1.3.2.1 -r1.3.2.1.2.1 ---- linux/Makefile 12 Mar 2003 19:48:52 -0000 1.3.2.1 -+++ linux/Makefile 1 Apr 2003 12:17:40 -0000 1.3.2.1.2.1 -@@ -99,6 +99,10 @@ - CFLAGS += -fomit-frame-pointer - endif - AFLAGS := -D__ASSEMBLY__ $(CPPFLAGS) -+ifeq ($(CONFIG_MCL_COREDUMP),y) -+ CFLAGS += -g -+endif -+ - - # - # ROOT_DEV specifies the default root-device when making the image. -Index: linux/Documentation/Configure.help -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/Documentation/Configure.help,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.1 -diff -u -r1.3.2.1 -r1.3.2.1.2.1 ---- linux/Documentation/Configure.help 12 Mar 2003 19:48:52 -0000 1.3.2.1 -+++ linux/Documentation/Configure.help 1 Apr 2003 12:17:40 -0000 1.3.2.1.2.1 -@@ -21660,6 +21660,35 @@ - This option allows you to run the kernel with data cache disabled. - Say Y if you experience CPM lock-ups. - -+Boot kernel image support -+CONFIG_BOOTIMG -+ Add support for booting a new Linux kernel from a running Linux -+ system. You need to download the bootimg(8) utility from -+ ftp://icaftp.epfl.ch/pub/people/almesber/misc/bootimg-current.tar.gz -+ in order to use this functionality. -+ -+Protect SMP configuration tables -+CONFIG_BOOTIMG_SMP -+ On SMP systems, the BIOS stores tables with configuration data in -+ memory and an SMP-enabled kernel reads these tables. However, a -+ kernel without SMP support will overwrite such tables. If a kernel -+ without SMP support used bootimg to boot an SMP-enabled kernel, the -+ latter will probably crash when trying to read the SMP tables. The -+ CONFIG_BOOTIMG_SMP option enables minimal support for scanning and -+ protecting of SMP configuration tables also for kernels without SMP -+ support. -+ -+In-memory kernel core dump facility -+CONFIG_MCL_COREDUMP -+ In conjunction with bootimg, this allows you to get kernel core dumps -+ of your system at panic() time. The panic call is modified so that it -+ calls the core dump facility and reboots the system. On the way back -+ up, the kernel dump image is written out to disk by the accompanying -+ init script. You can use the crash analysis tool to analyze the core -+ dump. This tool can be found at : -+ -+ http://www.missioncriticallinux.com/download -+ - # - # m68k-specific kernel options - # Documented by Chris Lawrence <mailto:quango@themall.net> et al. -Index: linux/arch/i386/config.in -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/config.in,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.2 -diff -u -r1.3.2.1 -r1.3.2.1.2.2 ---- linux/arch/i386/config.in 12 Mar 2003 19:49:05 -0000 1.3.2.1 -+++ linux/arch/i386/config.in 1 Apr 2003 19:35:12 -0000 1.3.2.1.2.2 -@@ -502,6 +502,12 @@ - bool ' Magic SysRq key' CONFIG_MAGIC_SYSRQ - bool ' Spinlock debugging' CONFIG_DEBUG_SPINLOCK - bool ' Compile the kernel with frame pointers' CONFIG_FRAME_POINTER -+ if [ "$CONFIG_FRAME_POINTER " != "n" ]; then -+ bool ' Kernel Core Dump Facility' CONFIG_MCL_COREDUMP -+ if [ "$CONFIG_MCL_COREDUMP" = "y" ]; then -+ bool ' Reboot using bootimg' CONFIG_BOOTIMG -+ fi -+ fi - fi - - endmenu -Index: linux/arch/i386/vmlinux.lds -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/vmlinux.lds,v -retrieving revision 1.1.1.1.4.1 -retrieving revision 1.1.1.1.4.1.2.1 -diff -u -r1.1.1.1.4.1 -r1.1.1.1.4.1.2.1 ---- linux/arch/i386/vmlinux.lds 12 Mar 2003 19:49:05 -0000 1.1.1.1.4.1 -+++ linux/arch/i386/vmlinux.lds 1 Apr 2003 12:17:40 -0000 1.1.1.1.4.1.2.1 -@@ -19,6 +19,13 @@ - .rodata : { *(.rodata) *(.rodata.*) } - .kstrtab : { *(.kstrtab) } - -+ . = ALIGN(16); /* Relocatable bootimage code */ -+ __bootimg_start = .; -+ .bootimg : { -+ *(.bootimg) -+ } -+ __bootimg_end = .; -+ - . = ALIGN(16); /* Exception table */ - __start___ex_table = .; - __ex_table : { *(__ex_table) } -Index: linux/arch/i386/boot/setup.S -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/boot/setup.S,v -retrieving revision 1.2.2.1 -retrieving revision 1.2.2.1.2.1 -diff -u -r1.2.2.1 -r1.2.2.1.2.1 ---- linux/arch/i386/boot/setup.S 12 Mar 2003 19:49:05 -0000 1.2.2.1 -+++ linux/arch/i386/boot/setup.S 1 Apr 2003 12:17:40 -0000 1.2.2.1.2.1 -@@ -105,16 +105,22 @@ - # flags, unused bits must be zero (RFU) bit within loadflags - loadflags: - LOADED_HIGH = 1 # If set, the kernel is loaded high -+RELOADS_GDT = 2 # if set, kernel reloads GDT, such that -+ # boot loader does not have to provide -+ # GDT in a "safe" memory location - CAN_USE_HEAP = 0x80 # If set, the loader also has set - # heap_end_ptr to tell how much - # space behind setup.S can be used for - # heap purposes. - # Only the loader knows what is free --#ifndef __BIG_KERNEL__ -- .byte 0 --#else -- .byte LOADED_HIGH -+_FLAGS = 0 -+#ifdef __BIG_KERNEL__ -+ _FLAGS = _FLAGS | LOADED_HIGH - #endif -+#ifdef CONFIG_BOOTIMG -+ _FLAGS = _FLAGS | RELOADS_GDT -+#endif -+ .byte _FLAGS - - setup_move_size: .word 0x8000 # size to move, when setup is not - # loaded at 0x90000. We will move setup -Index: linux/arch/i386/kernel/Makefile -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/kernel/Makefile,v -retrieving revision 1.2.2.1 -retrieving revision 1.2.2.1.2.1 -diff -u -r1.2.2.1 -r1.2.2.1.2.1 ---- linux/arch/i386/kernel/Makefile 12 Mar 2003 19:49:05 -0000 1.2.2.1 -+++ linux/arch/i386/kernel/Makefile 1 Apr 2003 12:17:40 -0000 1.2.2.1.2.1 -@@ -49,6 +49,7 @@ - obj-$(CONFIG_X86_LONGRUN) += longrun.o - obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o - obj-$(CONFIG_PROFILING) += profile.o -+obj-$(CONFIG_MCL_COREDUMP) += crash.o - - - include $(TOPDIR)/Rules.make -Index: linux/arch/i386/kernel/crash.c -=================================================================== -RCS file: linux/arch/i386/kernel/crash.c -diff -N linux/arch/i386/kernel/crash.c ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ linux/arch/i386/kernel/crash.c 1 Apr 2003 12:17:40 -0000 1.1.6.1 -@@ -0,0 +1,82 @@ -+/* -+ * linux/arch/i386/crash.c -+ * -+ * Architecture dependant code for MCL in-memory core dump. -+ */ -+#include <linux/sched.h> -+#include <linux/types.h> -+#include <linux/smp.h> -+#include <linux/crash.h> -+#include <linux/reboot.h> -+#include <linux/bootimg.h> -+ -+inline void crash_save_regs(void) { -+ static unsigned long regs[8]; -+ -+ __asm__ __volatile__("movl %%ebx,%0" : "=m"(regs[0])); -+ __asm__ __volatile__("movl %%ecx,%0" : "=m"(regs[1])); -+ __asm__ __volatile__("movl %%edx,%0" : "=m"(regs[2])); -+ __asm__ __volatile__("movl %%esi,%0" : "=m"(regs[3])); -+ __asm__ __volatile__("movl %%edi,%0" : "=m"(regs[4])); -+ __asm__ __volatile__("movl %%ebp,%0" : "=m"(regs[5])); -+ __asm__ __volatile__("movl %%eax,%0" : "=m"(regs[6])); -+ __asm__ __volatile__("movl %%esp,%0" : "=m"(regs[7])); -+ -+ panic_regs = regs; -+} -+ -+/* -+ * Save the current stack pointer and EIP. -+ */ -+void crash_save_current_state(struct task_struct *tp) -+{ -+ /* -+ * Here we save ebp instead of esp just in case the compiler -+ * decides to put an extra push in before we execute this -+ * instruction (thus invalidating our frame pointer). -+ */ -+ asm volatile("movl %%ebp,%0":"=m" (*(u_long *)&tp->thread.esp)); -+ tp->thread.eip = (u_long)crash_save_current_state; -+ panic_ksp[smp_processor_id()] = tp->thread.esp; -+ mb(); -+ -+ save_core(); -+ -+ crash_halt_or_reboot(1); -+} -+ -+/* -+ * If we are not the panicking thread, we simply halt. Otherwise, -+ * we take care of calling the reboot code. -+ */ -+void crash_halt_or_reboot(int boot_cpu) -+{ -+#ifdef CONFIG_SMP -+ if (!boot_cpu) { -+ stop_this_cpu(NULL); -+ /* NOTREACHED */ -+ } -+#endif -+ machine_restart(NULL); -+} -+ -+void crash_cleanup_smp_state(void) -+{ -+ /* -+ * Here we duplicate smp_send_stop. Crash_halt_or_reboot() calls -+ * stop_this_cpu. We now know that we are the only one running, -+ * so we finish off the smp_send_stop function. -+ */ -+ __cli(); -+#ifdef CONFIG_SMP -+ disable_local_APIC(); -+#endif -+} -+ -+/* -+ * Core dump IPI -+ */ -+void smp_crash_funnel_cpu(void) -+{ -+ crash_save_current_state(current); -+} -Index: linux/arch/i386/kernel/nmi.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/kernel/nmi.c,v -retrieving revision 1.2.2.1 -retrieving revision 1.2.2.1.2.1 -diff -u -r1.2.2.1 -r1.2.2.1.2.1 ---- linux/arch/i386/kernel/nmi.c 12 Mar 2003 19:49:06 -0000 1.2.2.1 -+++ linux/arch/i386/kernel/nmi.c 1 Apr 2003 12:17:40 -0000 1.2.2.1.2.1 -@@ -374,11 +374,18 @@ - bust_spinlocks(1); - printk("NMI Watchdog detected LOCKUP on CPU%d, eip %08lx, registers:\n", cpu, regs->eip); - show_registers(regs); -+#ifdef CONFIG_MCL_COREDUMP -+ spin_unlock(&nmi_print_lock); -+ bust_spinlocks(0); -+ panic("die"); -+ /* NOTREACHED */ -+#else - printk("console shuts up ...\n"); - console_silent(); - spin_unlock(&nmi_print_lock); - bust_spinlocks(0); - do_exit(SIGSEGV); -+#endif - } - } else { - last_irq_sums[cpu] = sum; -Index: linux/arch/i386/kernel/process.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/kernel/process.c,v -retrieving revision 1.2.2.2 -retrieving revision 1.2.2.2.2.1 -diff -u -r1.2.2.2 -r1.2.2.2.2.1 ---- linux/arch/i386/kernel/process.c 1 Apr 2003 02:11:17 -0000 1.2.2.2 -+++ linux/arch/i386/kernel/process.c 1 Apr 2003 12:17:40 -0000 1.2.2.2.2.1 -@@ -50,6 +50,9 @@ - #ifdef CONFIG_MATH_EMULATION - #include <asm/math_emu.h> - #endif -+#ifdef CONFIG_BOOTIMG -+#include <linux/bootimg.h> -+#endif - - #include <linux/irq.h> - -@@ -377,7 +380,21 @@ - - void machine_restart(char * __unused) - { -+#ifdef CONFIG_MCL_COREDUMP -+ extern char *panicmsg; -+ /* -+ * Only call bootimg if we have a valid descriptor and -+ * we are in a panic() context. -+ */ -+ if (panicmsg) -+#endif -+#ifdef CONFIG_BOOTIMG -+ if (bootimg_dsc.page_dir) -+ boot_image(); -+#endif -+ - #if CONFIG_SMP -+{ - int cpuid; - - cpuid = GET_APIC_ID(apic_read(APIC_ID)); -@@ -413,6 +430,7 @@ - if (!netdump_func) - smp_send_stop(); - disable_IO_APIC(); -+} - #endif - - if(!reboot_thru_bios) { -Index: linux/arch/i386/kernel/setup.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/kernel/setup.c,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.2 -diff -u -r1.3.2.1 -r1.3.2.1.2.2 ---- linux/arch/i386/kernel/setup.c 12 Mar 2003 19:49:06 -0000 1.3.2.1 -+++ linux/arch/i386/kernel/setup.c 1 Apr 2003 17:55:35 -0000 1.3.2.1.2.2 -@@ -116,6 +116,9 @@ - #include <asm/mpspec.h> - #include <asm/mmu_context.h> - #include <asm/edd.h> -+#ifdef CONFIG_MCL_COREDUMP -+#include <linux/crash.h> -+#endif - /* - * Machine setup.. - */ -@@ -973,6 +976,7 @@ - static unsigned long __init setup_memory(void) - { - unsigned long bootmap_size, start_pfn, max_low_pfn; -+ unsigned long bootmap_pages = 0UL, crash_pages = 0UL; - - /* - * partially used pages are not usable - thus -@@ -992,6 +996,21 @@ - printk(KERN_NOTICE "%ldMB HIGHMEM available.\n", - pages_to_mb(highend_pfn - highstart_pfn)); - #endif -+ -+#ifdef CONFIG_MCL_COREDUMP -+ bootmap_pages = bootmem_bootmap_pages(max_low_pfn); -+ crash_pages = crash_pages_needed(); -+ -+ printk("start_pfn: %d, bootmap_pages: %d\n", start_pfn, bootmap_pages); -+ -+ crash_init((u_long)phys_to_virt(PFN_PHYS(start_pfn)), -+ (u_long)phys_to_virt(PFN_PHYS(LOW_OFFSET + start_pfn)), -+ (u_long)phys_to_virt(PFN_PHYS(LOW_OFFSET + start_pfn + -+ crash_pages))); -+ -+ printk("new start_pfn: %08lx\n", PFN_PHYS(start_pfn)); -+ printk("crash map starts at %lx\n",(start_pfn+bootmap_pages)*PAGE_SIZE); -+#endif - printk(KERN_NOTICE "%ldMB LOWMEM available.\n", - pages_to_mb(max_low_pfn)); - /* -@@ -1007,8 +1026,8 @@ - * the (very unlikely) case of us accidentally initializing the - * bootmem allocator with an invalid RAM area. - */ -- reserve_bootmem(HIGH_MEMORY, (PFN_PHYS(start_pfn) + -- bootmap_size + PAGE_SIZE-1) - (HIGH_MEMORY)); -+ reserve_bootmem(HIGH_MEMORY, (PFN_PHYS(start_pfn) + bootmap_size + -+ ((1+crash_pages)*PAGE_SIZE) + PAGE_SIZE-1) - (HIGH_MEMORY)); - - /* - * reserve physical page 0 - it's a special BIOS page on many boxes, -@@ -1016,6 +1035,16 @@ - */ - reserve_bootmem(0, PAGE_SIZE); - -+#ifdef CONFIG_BOOTIMG -+ /* -+ * bootimg(8) reads the old parameter block. Note that the copy in -+ * empty_zero_page will vanish when mem_init runs. (Should we -+ * memcpy(phys_to_virt(0x90000), PARAM, PAGE_SIZE); -+ * now ?) -+ */ -+ reserve_bootmem(0x90000, PAGE_SIZE); -+#endif -+ - #ifdef CONFIG_SMP - /* - * But first pinch a few for the stack/trampoline stuff -@@ -1032,6 +1061,7 @@ - find_smp_config(); - #endif - #ifdef CONFIG_BLK_DEV_INITRD -+ printk("caution: initrd may overwrite dump\n"); /* phro */ - if (LOADER_TYPE && INITRD_START) { - if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) { - reserve_bootmem(INITRD_START, INITRD_SIZE); -@@ -1172,6 +1202,12 @@ - smp_alloc_memory(); /* AP processor realmode stacks in low memory*/ - #endif - paging_init(); -+#ifdef CONFIG_MCL_COREDUMP -+ /* -+ * Reserve crash pages -+ */ -+ crash_mark_dump_reserved(); -+#endif - #ifdef CONFIG_X86_LOCAL_APIC - /* - * get boot-time SMP configuration: -Index: linux/arch/i386/kernel/smp.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/kernel/smp.c,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.1 -diff -u -r1.3.2.1 -r1.3.2.1.2.1 ---- linux/arch/i386/kernel/smp.c 12 Mar 2003 19:49:06 -0000 1.3.2.1 -+++ linux/arch/i386/kernel/smp.c 1 Apr 2003 12:17:40 -0000 1.3.2.1.2.1 -@@ -23,6 +23,9 @@ - #include <asm/pgalloc.h> - #include <asm/smpboot.h> - -+#ifdef CONFIG_MCL_COREDUMP -+#include <asm/crash.h> -+#endif - /* - * Some notes on x86 processor bugs affecting SMP operation: - * -@@ -579,7 +582,7 @@ - return 0; - } - --static void stop_this_cpu (void * dummy) -+void stop_this_cpu (void * dummy) - { - /* - * Remove this CPU: -Index: linux/arch/i386/kernel/traps.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/kernel/traps.c,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.1 -diff -u -r1.3.2.1 -r1.3.2.1.2.1 ---- linux/arch/i386/kernel/traps.c 12 Mar 2003 19:49:06 -0000 1.3.2.1 -+++ linux/arch/i386/kernel/traps.c 1 Apr 2003 12:17:40 -0000 1.3.2.1.2.1 -@@ -52,6 +52,10 @@ - #include <linux/irq.h> - #include <linux/module.h> - -+#ifdef CONFIG_MCL_COREDUMP -+#include <linux/crash.h> -+#endif -+ - asmlinkage int system_call(void); - asmlinkage void lcall7(void); - asmlinkage void lcall27(void); -@@ -309,7 +313,11 @@ - netdump_func(regs); - bust_spinlocks(0); - spin_unlock_irq(&die_lock); -- do_exit(SIGSEGV); -+#ifdef CONFIG_MCL_COREDUMP -+ if(panic_on_oops) -+ panic("die"); -+#endif -+ do_exit(SIGSEGV);/* NOTREACHED */ - } - - static inline void die_if_kernel(const char * str, struct pt_regs * regs, long err) -Index: linux/drivers/char/misc.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/drivers/char/misc.c,v -retrieving revision 1.2 -retrieving revision 1.2.4.1 -diff -u -r1.2 -r1.2.4.1 ---- linux/drivers/char/misc.c 25 Sep 2002 17:11:05 -0000 1.2 -+++ linux/drivers/char/misc.c 1 Apr 2003 12:17:41 -0000 1.2.4.1 -@@ -78,6 +78,8 @@ - extern int i8k_init(void); - extern int lcd_init(void); - -+extern int crash_init_chrdev(void); -+ - static int misc_read_proc(char *buf, char **start, off_t offset, - int len, int *eof, void *private) - { -@@ -255,6 +257,9 @@ - int __init misc_init(void) - { - create_proc_read_entry("misc", 0, 0, misc_read_proc, NULL); -+#ifdef CONFIG_MCL_COREDUMP -+ crash_init_chrdev(); -+#endif - #ifdef CONFIG_MVME16x - rtc_MK48T08_init(); - #endif -Index: linux/drivers/char/sysrq.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/drivers/char/sysrq.c,v -retrieving revision 1.2.2.1 -retrieving revision 1.2.2.1.2.2 -diff -u -r1.2.2.1 -r1.2.2.1.2.2 ---- linux/drivers/char/sysrq.c 12 Mar 2003 19:49:47 -0000 1.2.2.1 -+++ linux/drivers/char/sysrq.c 1 Apr 2003 17:55:35 -0000 1.2.2.1.2.2 -@@ -97,7 +97,18 @@ - action_msg: "Resetting", - }; - -- -+#ifdef CONFIG_MCL_COREDUMP -+/* kernel core dump sysrq */ -+static void sysrq_handle_coredump(int key, struct pt_regs *pt_regs, -+ struct kbd_struct *kbd, struct tty_struct *ttty) { -+ panic("sysrq"); -+} -+static struct sysrq_key_op sysrq_coredump_op = { -+ handler: sysrq_handle_coredump, -+ help_msg: "Crash", -+ action_msg: "Dumping core", -+}; -+#endif - - /* SYNC SYSRQ HANDLERS BLOCK */ - -@@ -334,7 +345,11 @@ - it is handled specially on the spark - and will never arive */ - /* b */ &sysrq_reboot_op, -+#ifdef CONFIG_MCL_COREDUMP -+/* c */ &sysrq_coredump_op, -+#else - /* c */ NULL, -+#endif - /* d */ NULL, - /* e */ &sysrq_term_op, - /* f */ NULL, -Index: linux/include/asm-i386/bootimg.h -=================================================================== -RCS file: linux/include/asm-i386/bootimg.h -diff -N linux/include/asm-i386/bootimg.h ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ linux/include/asm-i386/bootimg.h 1 Apr 2003 12:17:41 -0000 1.1.6.1 -@@ -0,0 +1,141 @@ -+/* asm-i386/bootimg.h - Boot image, i386-specific code */ -+ -+/* Written 2000 by Werner Almesberger */ -+ -+/* -+ * When porting bootimg(2) to a new architcture, you need to adapt the -+ * functions and definitions in this file. -+ */ -+ -+ -+#ifndef _ASM_I386_BOOTIMG_H -+#define _ASM_I386_BOOTIMG_H -+ -+#include <linux/config.h> -+#include <asm/system.h> -+ -+#ifdef CONFIG_SMP -+#include <linux/smp.h> -+#include <linux/irq.h> -+#endif -+ -+ -+/* -+ * The memory page with the code currently executing has been copied from -+ * old_page to new_page. Jump there. -+ * -+ * Note: flush_icache_range has already been called on the new page. -+ */ -+ -+static inline void jump_relocated(unsigned long old_page,unsigned long new_page) -+{ -+ int tmp; -+ -+ __asm__ __volatile__( -+ "stc\n\t" -+ "call 1f\n" -+ "1:\tjnc 2f\n\t" -+ "popl %0\n\t" -+ "addl %1,%0\n\t" -+ "addl %1,%%esp\n\t" -+ "clc\n\t" -+ "jmp *%0\n" -+ "2:" -+ : "=&r" (tmp) : "r" (new_page-old_page)); -+} -+ -+ -+/* -+ * Stop paging, such that -+ * - page tables can be overwritten -+ * - all physical memory can be accessed -+ * - all physical memory is identity-mapped -+ * -+ * (Other rules are possible, but need to be encoded in bootimg(8).) -+ */ -+ -+static inline void stop_paging(void) -+{ -+ unsigned long msw; -+ -+ __asm__ __volatile__( -+ "movl %%cr0,%0\n\t" -+ "andl $0x7fffffff,%0\n\t" -+ "movl %0,%%cr0\n\t" -+ "jmp 1f\n\t" /* i486 and such */ -+ "1:" -+ -+/* Clear the PAE bit in register %cr4 if we were in PAE mode. The initial -+ * page table set up by the new kernel's bootstrap code is non-PAE regardless -+ * of whether the new kernel is a PAE kernel. By clearing the PAE bit here, -+ * we make sure the bootstrap code doesn't accidentally enable PAE mode when -+ * it turns on address translation. -+ */ -+#ifdef CONFIG_X86_PAE -+ "movl %%cr4,%0\n\t" -+ "andl $0xffffffdf,%0\n\t" -+ "movl %0,%%cr4\n\t" -+#endif -+ -+ : "=&r" (msw) : : "memory"); -+} -+ -+ -+/* -+ * Stop any remaining concurrency in the system. If become_only_thread fails -+ * but the system is still usable, become_only_thread should return an error -+ * code. If no recovery is possible, it may as well panic. -+ */ -+ -+static inline int become_only_thread(void) -+{ -+#ifdef CONFIG_SMP -+ smp_send_stop(); -+ disable_IO_APIC(); -+#endif -+ cli(); -+ return 0; -+} -+ -+ -+/* -+ * A conservative estimate of the number of bytes relocate_and_jump allocated -+ * on the stack. This is only used for sanity checking before running code, -+ * because we can't recover from failure in relocate_and_jump. -+ */ -+ -+#define RESERVE_MIN_RELOC_STACK 256 -+ -+ -+/* -+ * Change the stack pointer such that stack is at the end of the specified -+ * page. No data on the old stack will be accessed anymore, so no copying is -+ * required. -+ */ -+ -+static inline void stack_on_page(void *page) -+{ -+ __asm__ __volatile__( -+ "push %%ds\n\t" -+ "pop %%ss\n\t" -+ "movl %0,%%esp\n\t" -+ "addl $0x1000,%%esp\n\t" -+ : : "r" (page)); -+} -+ -+/* -+ * Set up things such that the kernel will be comfortable (e.g. some -+ * architectures expect the boot loader to set registers in certain ways), -+ * and then jump to the kernel's entry address. -+ */ -+ -+static inline void jump_to_kernel(void (*kernel_entry)(void)) -+{ -+ __asm__ __volatile__( -+ "mov $0x90000,%%esi\n\t" -+ : : ); -+ -+ kernel_entry(); -+} -+ -+#endif -Index: linux/include/asm-i386/crash.h -=================================================================== -RCS file: linux/include/asm-i386/crash.h -diff -N linux/include/asm-i386/crash.h ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ linux/include/asm-i386/crash.h 1 Apr 2003 12:17:41 -0000 1.1.6.1 -@@ -0,0 +1,15 @@ -+#ifndef __ASM_CRASH_H -+#define __ASM_CRASH_H -+ -+#define UPPER_MEM_BACKUP 0 -+#define LOWER_MEM_FORWARD 0 -+#define LOW_OFFSET 100 -+ -+/* -+ * These two functions are inlined on alpha. That's why they appear -+ * in the arch dependent include file. -+ */ -+void crash_save_current_state(struct task_struct *); -+void crash_halt_or_reboot(int); -+ -+#endif -Index: linux/include/linux/bootimg.h -=================================================================== -RCS file: linux/include/linux/bootimg.h -diff -N linux/include/linux/bootimg.h ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ linux/include/linux/bootimg.h 1 Apr 2003 12:17:41 -0000 1.1.6.1 -@@ -0,0 +1,84 @@ -+/* linux/bootimg.h - Boot image, general definitions */ -+ -+/* Written 2000 by Werner Almesberger */ -+ -+ -+#ifndef _LINUX_BOOTIMG_H -+#define _LINUX_BOOTIMG_H -+ -+ -+/* -+ * Constraints on image_map: -+ * - each image_map[n] is the virtual address of a page-sized memory region -+ * readable by the user -+ * - currently, image_map[n] is not required to be page-aligned, but this may -+ * change in the future if we want to map pages directly to lower memory -+ * pressure (NB: mapping works for ELF and plain binary images, but usually -+ * not for (b)zImages, because the prepended boot and setup sectors -+ * mis-align them) -+ * -+ * Constraints on load_map: -+ * - each load_map[] is the physical address of a page in RAM -+ */ -+ -+struct boot_image { -+ void **image_map; /* pointers to image pages in user memory */ -+ int pages; /* length in pages */ -+ unsigned long *load_map;/* list of destination pages (physical addr) */ -+ unsigned long start; /* jump to this physical address */ -+ int flags; /* for future use, must be zero for now */ -+}; -+ -+ -+#ifdef __KERNEL__ -+ -+#define __bootimg __attribute__ ((__section__ (".bootimg"))) -+ -+ -+struct bootimg_dsc { -+ unsigned long self; /* code page ALL ADDRESSES */ -+ unsigned long scratch; /* scratch page ARE PHYSICAL !*/ -+ unsigned long **page_dir; /* src & dst page tables */ -+ void (*jump_to)(void); /* start address */ -+ int pages; /* number of pages */ -+ unsigned long csum; /* Kernel Image checksum */ -+}; -+ -+/* -+ * page_dir contains pointers to pages containing pointers to pages. We call -+ * page_dir a "directory" and the page page_dir[n] points to a "table". The -+ * first PAGES_PER_TABLE/2 entries of page_dir are for source pages, and other -+ * half are for destination pages. -+ */ -+ -+/* -+ * Note that the definitions used here do not necessarily correspond to the -+ * architecture-specific PTRS_PER_PTE, __pte_offset, etc. -+ */ -+ -+#define PAGES_PER_TABLE (PAGE_SIZE/sizeof(void *)) -+#define FROM_TABLE(i) ((i)/PAGES_PER_TABLE) -+#define TO_TABLE(i) ((i)/PAGES_PER_TABLE+PAGES_PER_TABLE/2) -+#define PAGE_NR(i) ((i) % PAGES_PER_TABLE) -+ -+ -+extern char __bootimg_start,__bootimg_end; /* linker segment boundaries */ -+extern unsigned long *unity_page; /* unity-mapped page for i386 */ -+ -+/* -+ * relocate_and_jump runs in its own page with its own stack. This makes it -+ * difficult to pass parameters. The solution chosen here is to use the global -+ * variable bootimg_dsc, which is copied into an "auto" variable by -+ * relocate_and_jump before any copying or relocation takes place. -+ */ -+ -+extern struct bootimg_dsc bootimg_dsc; -+ -+typedef void (*relocate_and_jump_t)(void); -+ -+void relocate_and_jump(void); -+int boot_image(void); -+ -+#endif /* __KERNEL__ */ -+ -+#endif -Index: linux/include/linux/crash.h -=================================================================== -RCS file: linux/include/linux/crash.h -diff -N linux/include/linux/crash.h ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ linux/include/linux/crash.h 1 Apr 2003 12:17:41 -0000 1.1.6.1 -@@ -0,0 +1,119 @@ -+#ifndef __LINUX_CRASH_H -+#define __LINUX_CRASH_H -+ -+/* defines for interfacing with user-space (ioctls, etc) */ -+struct ioctl_getdump { -+ unsigned long kva; -+ unsigned long buf; -+}; -+ -+#define CRASH_IOC_MAGIC 'C' -+ -+#define CRASH_IOCFREEDUMP _IO(CRASH_IOC_MAGIC, 0) -+#define CRASH_IOCGETDUMP _IOWR(CRASH_IOC_MAGIC, 1, struct ioctl_getdump) -+#define CRASH_IOCBOOTIMG _IOWR(CRASH_IOC_MAGIC, 2, struct boot_image) -+#define CRASH_IOCVERSION _IO(CRASH_IOC_MAGIC, 3) -+ -+/* kernel-only part of crash.h */ -+#ifdef __KERNEL__ -+#include <asm/crash.h> -+ -+#define CRASH_K_MINOR (1) -+#define CRASH_K_MAJOR (0) -+ -+/* -+ * Crash prototypes. -+ */ -+void save_core(void); -+void crash_mark_dump_reserved(void); -+void crash_init(u_long bootmap_va, u_long crash_va, u_long end_alloc_va); -+u_long crash_pages_needed(void); -+void smp_crash_funnel_cpu(void); -+void crash_cleanup_smp_state(void); -+ -+/* -+ * Arch dependant crash.c funcs -+ */ -+void crash_save_current_state(struct task_struct *); -+void crash_halt_or_reboot(int); -+inline void crash_save_regs(void); -+ -+/* -+ * Crash globals -+ */ -+extern u_long crash_dump_header; -+extern volatile u_long panic_ksp[]; -+extern volatile int crash_release; -+extern int panic_on_oops; -+extern char *panicmsg; -+extern int panic_processor; -+extern int crash_perform_sync; -+extern unsigned long *panic_regs; -+ -+/* -+ * symbols not exported by linux header files -+ */ -+extern void stop_this_cpu(void *); -+ -+/* struct crash_map_hdr located at byte offset 0 */ -+/* on-disk formats */ -+ -+#define trunc_page(x) ((void *)(((unsigned long)(x)) & ~((unsigned long)(PAGE_SIZE - 1)))) -+#define round_page(x) trunc_page(((unsigned long)(x)) + ((unsigned long)(PAGE_SIZE - 1))) -+ -+#define CRASH_MAGIC 0x9a8bccdd -+#define CRASH_SOURCE_PAGES 128 -+#define CRASH_SUB_MAP_BYTES ((u_long)round_page((CRASH_SOURCE_PAGES+1)*sizeof(u_long))) -+#define CRASH_SUB_MAP_PAGES (CRASH_SUB_MAP_BYTES / PAGE_SIZE) -+#define CRASH_UNCOMPR_BUF_PAGES (CRASH_SOURCE_PAGES + CRASH_SUB_MAP_PAGES) -+#define CRASH_COMPR_BUF_PAGES (CRASH_UNCOMPR_BUF_PAGES + (CRASH_UNCOMPR_BUF_PAGES/4)) -+#define CRASH_COMPESS_PRIME_PAGES (2*CRASH_COMPR_BUF_PAGES) -+#define CRASH_ZALLOC_PAGES 16*5*2 /* 2 to handle crash in crash */ -+#define CRASH_LOW_WATER_PAGES 100 -+ -+#define CRASH_CPU_TIMEOUT 5000 /* 5 sec wait for other cpus to stop */ -+ -+#define CRASH_MARK_RESERVED(addr) (set_bit(PG_reserved,&mem_map[MAP_NR(addr)].flags)) -+#define CRASH_CLEAR_RESERVED(addr) (clear_bit(PG_reserved,&mem_map[MAP_NR(addr)].flags)) -+#define CRASH_MARK_BOOT_RESERVED(addr) reserve_bootmem(virt_to_phys((void *)addr), PAGE_SIZE); -+ -+typedef int boolean_t; -+ -+#define TRUE 1 -+#define FALSE 0 -+ -+/* mem structure */ -+struct mem_crash_map_hdr { -+ long magic[4]; /* identify crash dump */ -+ u_long map; /* location of map */ -+ u_long map_pages; -+ u_long data_pages; -+ u_long compr_units; -+ u_long boot_reserved_start; -+ u_long boot_reserved_end; -+}; -+struct mem_crash_map_entry { -+ u_long src_va; /* source start of larger non-contig -+ * block. a src_va of -1 means that -+ * the dest_page_va is the location of -+ * the next map page */ -+ u_long dest_page_va; /* dest of this sub block */ -+ u_long check_sum; /* check_sum for dest data */ -+}; -+ -+/* file structure */ -+struct crash_map_hdr { -+ long magic[4]; /* identify crash dump */ -+ int blk_size; /* block size for this device */ -+ int map_block; /* location of map */ -+ int map_blocks; /* number of blocks for map */ -+}; -+struct crash_map_entry { -+ u_long start_va; /* virtual address */ -+ char *exp_data; /* expanded data in memory */ -+ int start_blk; /* device location */ -+ int num_blks; -+}; -+ -+#endif /* __KERNEL__ */ -+#endif /* __LINUX_CRASH_H */ -Index: linux/include/linux/mm.h -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/include/linux/mm.h,v -retrieving revision 1.2.2.1 -retrieving revision 1.2.2.1.2.2 -diff -u -r1.2.2.1 -r1.2.2.1.2.2 ---- linux/include/linux/mm.h 12 Mar 2003 19:51:27 -0000 1.2.2.1 -+++ linux/include/linux/mm.h 1 Apr 2003 17:55:35 -0000 1.2.2.1.2.2 -@@ -331,6 +331,11 @@ - #define PG_lru 18 - #define PG_active_cache 19 - #define PG_fs_1 20 /* Filesystem specific */ -+#ifdef CONFIG_MCL_COREDUMP -+#define PG_free 21 -+#define PG_shm 22 -+#define PG_anon 23 -+#endif - - /* Make it prettier to test the above... */ - #define UnlockPage(page) unlock_page(page) -@@ -452,6 +457,11 @@ - #define PageSetSlab(page) set_bit(PG_slab, &(page)->flags) - #define PageClearSlab(page) clear_bit(PG_slab, &(page)->flags) - #define PageReserved(page) test_bit(PG_reserved, &(page)->flags) -+#ifdef CONFIG_MCL_COREDUMP -+#define PageFree(page) (test_bit(PG_free, &(page)->flags)) -+#define PageAnon(page) (test_bit(PG_anon, &(page)->flags)) -+#define PageShm(page) (test_bit(PG_shm, &(page)->flags)) -+#endif - - #define PageActiveAnon(page) test_bit(PG_active_anon, &(page)->flags) - #define SetPageActiveAnon(page) set_bit(PG_active_anon, &(page)->flags) -Index: linux/include/linux/reboot.h -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/include/linux/reboot.h,v -retrieving revision 1.1.1.1 -retrieving revision 1.1.1.1.10.2 -diff -u -r1.1.1.1 -r1.1.1.1.10.2 ---- linux/include/linux/reboot.h 7 May 2002 21:53:47 -0000 1.1.1.1 -+++ linux/include/linux/reboot.h 1 Apr 2003 17:55:35 -0000 1.1.1.1.10.2 -@@ -20,6 +20,7 @@ - * CAD_OFF Ctrl-Alt-Del sequence sends SIGINT to init task. - * POWER_OFF Stop OS and remove all power from system, if possible. - * RESTART2 Restart system using given command string. -+ * COREDUMP We're taking a core dump, secondary cpus already stopped. - */ - - #define LINUX_REBOOT_CMD_RESTART 0x01234567 -@@ -28,7 +29,9 @@ - #define LINUX_REBOOT_CMD_CAD_OFF 0x00000000 - #define LINUX_REBOOT_CMD_POWER_OFF 0x4321FEDC - #define LINUX_REBOOT_CMD_RESTART2 0xA1B2C3D4 -- -+#ifdef CONFIG_MCL_COREDUMP -+#define LINUX_REBOOT_CMD_COREDUMP 0x9A8BCCDD -+#endif - - #ifdef __KERNEL__ - -Index: linux/include/linux/sysctl.h -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/include/linux/sysctl.h,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.1 -diff -u -r1.3.2.1 -r1.3.2.1.2.1 ---- linux/include/linux/sysctl.h 12 Mar 2003 19:51:30 -0000 1.3.2.1 -+++ linux/include/linux/sysctl.h 1 Apr 2003 12:17:41 -0000 1.3.2.1.2.1 -@@ -126,6 +126,7 @@ - KERN_CADPID=54, /* int: PID of the process to notify on CAD */ - KERN_CORE_PATTERN=56, /* string: pattern for core-files */ - KERN_PID_MAX=55, /* int: max PID value of processes */ -+ KERN_PANIC_ON_OOPS /* int: panic on oops enabled */ - }; - - -Index: linux/init/main.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/init/main.c,v -retrieving revision 1.2.2.1 -retrieving revision 1.2.2.1.2.1 -diff -u -r1.2.2.1 -r1.2.2.1.2.1 ---- linux/init/main.c 12 Mar 2003 19:51:35 -0000 1.2.2.1 -+++ linux/init/main.c 1 Apr 2003 12:17:41 -0000 1.2.2.1.2.1 -@@ -70,6 +70,10 @@ - #include <asm/smp.h> - #endif - -+#ifdef CONFIG_BOOTIMG -+#include <linux/bootimg.h> -+#endif -+ - /* - * Versions of gcc older than that listed below may actually compile - * and link okay, but the end product can have subtle run time bugs. -@@ -352,10 +356,14 @@ - { - char * command_line; - extern char saved_command_line[]; -+#if defined(CONFIG_BOOTIMG) && defined(CONFIG_X86_LOCAL_APIC) -+ unsigned long value; -+#endif - /* - * Interrupts are still disabled. Do necessary setups, then - * enable them - */ -+ printk("start_kernel\n"); - lock_kernel(); - printk(linux_banner); - setup_arch(&command_line); -@@ -373,12 +381,26 @@ - * this. But we do want output early, in case something goes wrong. - */ - console_init(); -+ -+#ifdef CONFIG_BOOTIMG -+ unity_page = alloc_bootmem_pages(PAGE_SIZE); -+ printk("unity_page addr: %p\n",unity_page); -+#endif - #ifdef CONFIG_MODULES - init_modules(); - #endif - profile_init(); - kmem_cache_init(); - sti(); -+#if defined(CONFIG_BOOTIMG) && defined(CONFIG_X86_LOCAL_APIC) -+ /* If we don't make sure the APIC is enabled, AND the LVT0 -+ * register is programmed properly, we won't get timer interrupts -+ */ -+ setup_local_APIC(); -+ -+ value = apic_read(APIC_LVT0); -+ apic_write_around(APIC_LVT0, value & ~APIC_LVT_MASKED); -+#endif - calibrate_delay(); - #ifdef CONFIG_BLK_DEV_INITRD - if (initrd_start && !initrd_below_start_ok && -Index: linux/kernel/Makefile -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/kernel/Makefile,v -retrieving revision 1.1.1.1.4.1 -retrieving revision 1.1.1.1.4.1.2.1 -diff -u -r1.1.1.1.4.1 -r1.1.1.1.4.1.2.1 ---- linux/kernel/Makefile 12 Mar 2003 19:51:36 -0000 1.1.1.1.4.1 -+++ linux/kernel/Makefile 1 Apr 2003 12:17:41 -0000 1.1.1.1.4.1.2.1 -@@ -22,7 +22,8 @@ - obj-$(CONFIG_PM) += pm.o - obj-$(CONFIG_KALLSYMS) += kallsyms.o - obj-$(CONFIG_CPU_FREQ) += cpufreq.o -- -+obj-$(CONFIG_BOOTIMG) += bootimg.o bootimg_pic.o -+obj-$(CONFIG_MCL_COREDUMP) += crash.o - - ifneq ($(CONFIG_IA64),y) - # According to Alan Modra <alan@linuxcare.com.au>, the -fno-omit-frame-pointer is -Index: linux/kernel/bootimg.c -=================================================================== -RCS file: linux/kernel/bootimg.c -diff -N linux/kernel/bootimg.c ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ linux/kernel/bootimg.c 1 Apr 2003 12:17:41 -0000 1.1.6.1 -@@ -0,0 +1,301 @@ -+/* bootimg.c - Boot another (kernel) image */ -+ -+/* Written 2000 by Werner Almesberger */ -+ -+ -+#include <linux/config.h> -+#include <linux/kernel.h> -+#include <linux/errno.h> -+#include <linux/mm.h> -+#include <linux/capability.h> -+#include <linux/bootimg.h> -+#include <asm/bootimg.h> -+#include <asm/uaccess.h> -+#include <asm/io.h> -+#include <asm/pgtable.h> -+#include <linux/delay.h> -+ -+#if 0 -+#define DPRINTK_CONT(format,args...) printk(format,##args) -+#else -+#define DPRINTK_CONT(format,args...) -+#endif -+#define DPRINTK(format,args...) DPRINTK_CONT(KERN_DEBUG format,##args) -+ -+unsigned long **bootimg_page_dir; -+ -+struct bootimg_dsc bootimg_dsc; /* communication with PIC */ -+unsigned long *unity_page; /* unity-mapped page for i386 */ -+ -+static unsigned long bootimg_checksum(unsigned long **page_dir, int num_pages) -+{ -+ unsigned long checksum, *page; -+ int i, j; -+ -+ checksum = 0; -+ -+ for (i = 0; i < num_pages; i++) { -+ page = __va((unsigned long *) -+ page_dir[FROM_TABLE(i)][PAGE_NR(i)]); -+ -+ for (j = 0; j < PAGES_PER_TABLE; j++) -+ checksum ^= page[j]; -+ -+ checksum ^= page_dir[TO_TABLE(i)][PAGE_NR(i)]; -+ } -+ -+ return checksum; -+} -+ -+#ifdef CONFIG_X86_PAE -+ -+static unsigned long get_identity_mapped_page(void) -+{ -+ pgd_t *pgd; -+ pmd_t *pmd; -+ unsigned long phys_addr, page_base; -+ -+ /* Set up a 2 Mb identity-mapped page. */ -+ -+ phys_addr = virt_to_phys(unity_page); -+ pgd = pgd_offset(current->active_mm, phys_addr); -+ pmd = pmd_offset(pgd, phys_addr); -+ -+ /* We hardcode this rather than using PMD_MASK just in case the PAE -+ * mode setup ever changes so that 2 Mb pages are no longer used. -+ */ -+ page_base = phys_addr & ~((1 << 21) - 1); -+ -+ set_pmd(pmd, __pmd(page_base | _PAGE_PSE | _KERNPG_TABLE)); -+ __flush_tlb_one(phys_addr); -+ -+ return (unsigned long) unity_page; -+} -+ -+#else -+ -+static unsigned long get_identity_mapped_page(void) -+{ -+ set_pgd(pgd_offset(current->active_mm,virt_to_phys(unity_page)), -+ __pgd((_KERNPG_TABLE + _PAGE_PSE + (virt_to_phys(unity_page)&PGDIR_MASK)))); -+ __flush_tlb_one(virt_to_phys(unity_page)); -+ return (unsigned long)unity_page; -+} -+ -+#endif -+ -+#if 0 /* Perhaps we'll need this in the future? */ -+static void unmap_identity_mapped_page(void) -+{ -+ set_pgd(pgd_offset(current->active_mm,virt_to_phys(unity_page)),__pgd(0)); -+ __flush_tlb(); -+} -+#endif -+ -+static int fill_page_dir(unsigned long **page_dir,struct boot_image *image) -+{ -+ int i, count=0; -+ -+ memset(page_dir,0,PAGE_SIZE); -+ for (i = 0; i < image->pages; i += PAGES_PER_TABLE) { -+ unsigned long **table; -+ int bytes_left; -+ -+ table = page_dir+FROM_TABLE(i); -+ *table = (unsigned long *) get_free_page(GFP_KERNEL); -+ if (!*table) return -ENOMEM; -+ -+ memset(*table,0,PAGE_SIZE); -+ DPRINTK("page %d: from table %p @ %p\n",i,*table,table); -+ table = page_dir+TO_TABLE(i); -+ *table = (unsigned long *) get_free_page(GFP_KERNEL); -+ if (!*table) return -ENOMEM; -+ -+ bytes_left = (image->pages-i)*sizeof(unsigned long); -+ if (copy_from_user(*table,image->load_map+i, -+ bytes_left > PAGE_SIZE ? PAGE_SIZE : bytes_left)) -+ return -EFAULT; -+ DPRINTK("page %d: to table %p @ %p\n",i,*table,table); -+ count+=2; /* 2 pages per loop */ -+ } -+ -+ for (i = 0; i < image->pages; i++) { -+ unsigned long page = get_free_page(GFP_KERNEL); -+ void *src; -+ -+ if (!page) return -ENOMEM; -+ count++; -+ -+ page_dir[FROM_TABLE(i)][PAGE_NR(i)] = -+ virt_to_phys((void *) page); -+ if (get_user(src,image->image_map+i) || -+ copy_from_user((void *) page,src,PAGE_SIZE)) -+ return -EFAULT; -+ -+ DPRINTK("page %d: %p->%p->%p @ %p\n",i,src,(void *) page, -+ (void *) page_dir[FROM_TABLE(i)][PAGE_NR(i)], -+ &page_dir[FROM_TABLE(i)][PAGE_NR(i)]); -+ } -+ -+ DPRINTK("fill_page_dir: %d pages allocated\n", count); -+ -+ return 0; -+} -+ -+ -+static void free_page_dir(unsigned long **page_dir) -+{ -+ int i,j,count=0; -+ -+ for (i = 0; i < PAGES_PER_TABLE/2; i++) -+ if (page_dir[i]) -+ for (j = 0; j < PAGES_PER_TABLE; j++) -+ if (page_dir[i][j]) { -+ free_page((unsigned long) -+ phys_to_virt(page_dir[i][j])); -+ count++; -+ } -+ for (i = 0; i < PAGES_PER_TABLE; i++) -+ if (page_dir[i]) { -+ free_page((unsigned long) *page_dir[i]); -+ count++; -+ } -+ DPRINTK("free_page_dir: %d pages freed\n", count); -+} -+ -+ -+static void convert_table_refs_to_phys(unsigned long **page_dir) -+{ -+ int i; -+ -+ DPRINTK("PAGES_PER_TABLE: %d\n",PAGES_PER_TABLE); -+ for (i = 0; i < PAGES_PER_TABLE; i++) -+ if (page_dir[i]) { -+ DPRINTK("table %i: mapped %p -> ",i,page_dir[i]); -+ page_dir[i] = (unsigned long *) -+ virt_to_phys(page_dir[i]); -+ DPRINTK_CONT("%p\n",page_dir[i]); -+ } -+} -+ -+ -+ -+static int fill_bootimg_dsc(struct boot_image *image) -+{ -+ unsigned long scratch; -+ int error = -ENOMEM; -+ -+ if(bootimg_page_dir) { -+ /* free previously allocated memory */ -+ free_page_dir(bootimg_page_dir); -+ free_page((unsigned long) bootimg_page_dir); -+ DPRINTK("free_page (bootimg_page_dir)\n"); -+ } -+ -+ bootimg_page_dir = (unsigned long **) get_free_page(GFP_KERNEL); -+ if (!bootimg_page_dir) goto out0; -+ DPRINTK("get_free_page (bootimg_page_dir)\n"); -+ -+ error = fill_page_dir(bootimg_page_dir,image); -+ if (error) goto out1; -+ -+ if(!bootimg_dsc.scratch) { -+ scratch = get_free_page(GFP_KERNEL); -+ DPRINTK("get_free_page (scratch)\n"); -+ } else -+ scratch = 1; /* already allocated */ -+ -+ if (!scratch) goto out1; -+ /* -+ * Not all architectures need the code to be identity-mapped, but it -+ * can't hurt ... -+ */ -+ DPRINTK("bootimg_page_dir: mapped %p -> ",bootimg_page_dir); -+ bootimg_dsc.page_dir = (unsigned long **) virt_to_phys(bootimg_page_dir); -+ DPRINTK_CONT("%p\n",bootimg_dsc.page_dir); -+ if(!bootimg_dsc.scratch) -+ bootimg_dsc.scratch = virt_to_phys((void *) scratch); -+ bootimg_dsc.jump_to = (void (*)(void)) image->start; -+ bootimg_dsc.pages = image->pages; -+ bootimg_dsc.csum = bootimg_checksum(bootimg_page_dir, image->pages); -+ -+ return 0; -+ -+out1: -+ free_page_dir(bootimg_page_dir); -+ free_page((unsigned long) bootimg_page_dir); -+ DPRINTK("free_page (bootimg_page_dir)\n"); -+ bootimg_page_dir = 0; -+out0: -+ return error; -+} -+ -+extern char *panicmsg; -+int boot_image() -+{ -+ relocate_and_jump_t code; -+ unsigned long code_page; -+ int error = -ENOMEM; -+ -+ if (bootimg_checksum(__va(bootimg_dsc.page_dir),bootimg_dsc.pages) -+ != bootimg_dsc.csum) -+ printk("Checksum of kernel image failed. Rebooting via BIOS\n"); -+ -+ code_page = get_identity_mapped_page(); -+ if (!code_page) goto out3; -+ code = (relocate_and_jump_t) virt_to_phys((void *) code_page); -+ memcpy(code,&__bootimg_start,&__bootimg_end-&__bootimg_start); -+ flush_icache_range(&__bootimg_start, &__bootimg_end-&__bootimg_start); -+ -+ bootimg_dsc.self = (unsigned long) code; -+ printk(KERN_INFO "Running boot code at 0x%p\n",code); -+ -+ /* -+ * The point of no return. Not even printk may work after a successful -+ * return from become_only_thread. -+ */ -+ -+ if (!panicmsg) { -+ error = become_only_thread(); -+ if (error) goto out3; -+ } else { -+#ifdef CONFIG_SMP -+ disable_IO_APIC(); -+#endif -+ __cli(); -+ } -+ -+ convert_table_refs_to_phys((unsigned long **)__va(bootimg_dsc.page_dir)); -+ stack_on_page(code); -+ -+ code(); -+ -+ panic("PIC code exec failed"); -+out3: -+ printk("boot_image() failed!\n"); -+ for(;;); -+} -+ -+/* changed from asmlinkage because we're called via an IOCTL on /dev/crash now */ -+int sys_bootimg(struct boot_image *user_dsc) -+{ -+ struct boot_image dsc; -+ -+ if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_MODULE)) return -EPERM; -+ if (&__bootimg_end-&__bootimg_start > PAGE_SIZE-RESERVE_MIN_RELOC_STACK) -+ { -+ printk(KERN_ERR "boot_image: PIC too large (%d bytes)\n", -+ &__bootimg_end-&__bootimg_start); -+ return -EIO; -+ } -+ if ((void *) relocate_and_jump != (void *) &__bootimg_start) { -+ printk(KERN_ERR "boot_image: relocate_and_jump is mis-placed" -+ "(0x%p != 0x%p)\n",relocate_and_jump,&__bootimg_start); -+ return -EIO; -+ } -+ -+ if (copy_from_user(&dsc,user_dsc,sizeof(dsc))) return -EFAULT; -+ if (dsc.pages >= PAGES_PER_TABLE*PAGES_PER_TABLE/2) return -EFBIG; -+ if (dsc.flags) return -EINVAL; /* for future use */ -+ return fill_bootimg_dsc(&dsc); -+} -Index: linux/kernel/bootimg_pic.c -=================================================================== -RCS file: linux/kernel/bootimg_pic.c -diff -N linux/kernel/bootimg_pic.c ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ linux/kernel/bootimg_pic.c 1 Apr 2003 12:17:41 -0000 1.1.6.1 -@@ -0,0 +1,91 @@ -+/* bootimg_pic.c - Boot image, position-independent code */ -+ -+/* Written 2000 by Werner Almesberger */ -+ -+/* -+ * Strongly inspired by FiPaBoL designed mainly by Otfried Cheong and Roger -+ * Gammans, and written by the latter. -+ */ -+ -+/* -+ * This code is position-independent and must fit in a single page ! -+ * Furthermore, everything (text+data+stack) has to go into the -+ * .bootimg segment. -+ */ -+ -+ -+#include <linux/config.h> -+#include <linux/kernel.h> -+#include <linux/errno.h> -+#include <linux/mm.h> -+#include <linux/bootimg.h> -+#include <asm/bootimg.h> -+ -+#include <asm/io.h> -+ -+#define copy_and_swap(from,to) \ -+ ( { my_copy_page(from,to); \ -+ tmp = from; \ -+ from = to; \ -+ to = tmp; } ) -+ -+ -+static inline void my_copy_page(unsigned long from,unsigned long to) -+{ -+ unsigned long end = from+PAGE_SIZE; -+ -+ do *((unsigned long *) to)++ = *((unsigned long *) from)++; -+ while (from != end); -+} -+ -+ -+void __bootimg relocate_and_jump(void) -+{ -+ struct bootimg_dsc dsc = bootimg_dsc; -+ int i; -+ -+ stop_paging(); -+ for (i = 0; i < dsc.pages; i++) { -+ unsigned long from,to,tmp; -+ -+ from = dsc.page_dir[FROM_TABLE(i)][PAGE_NR(i)]; -+ to = dsc.page_dir[TO_TABLE(i)][PAGE_NR(i)]; -+ if (from == to) continue; -+ if (to == dsc.self) { -+ copy_and_swap(dsc.self,dsc.scratch); -+ /* WARNING: flush_icache_range MUST BE INLINED !!! */ -+ flush_icache_range(dsc.self,dsc.self+PAGE_SIZE-1); -+ jump_relocated(dsc.scratch,dsc.self); -+ } -+ else if (to == (unsigned long) dsc.page_dir) -+ copy_and_swap((unsigned long) dsc.page_dir,dsc.scratch); -+ else { -+ /* -+ * O((n^2-n)/2), sigh ... -+ */ -+ unsigned long **table; -+ int j; -+ -+ for (j = i+1; j < dsc.pages; j++) { -+ table = dsc.page_dir+FROM_TABLE(j); -+ if (((unsigned long) *table) == to) { -+ copy_and_swap(*table,dsc.scratch); -+ break; -+ } -+ if ((*table)[PAGE_NR(j)] == to) { -+ copy_and_swap((*table)[PAGE_NR(j)], -+ dsc.scratch); -+ break; -+ } -+ table = dsc.page_dir+TO_TABLE(j); -+ if (((unsigned long) *table) == to) { -+ copy_and_swap(*table,dsc.scratch); -+ break; -+ } -+ } -+ } -+ my_copy_page(from,to); -+ dsc.scratch = from; -+ } -+ jump_to_kernel(dsc.jump_to); -+} -Index: linux/kernel/crash.c -=================================================================== -RCS file: linux/kernel/crash.c -diff -N linux/kernel/crash.c ---- /dev/null 1 Jan 1970 00:00:00 -0000 -+++ linux/kernel/crash.c 1 Apr 2003 12:17:41 -0000 1.1.6.1 -@@ -0,0 +1,886 @@ -+#include <linux/locks.h> -+#include <linux/slab.h> -+#include <linux/crash.h> -+#include <linux/vmalloc.h> -+#include <linux/mm.h> -+#include <linux/fs.h> -+#include <linux/ext2_fs.h> -+#include <asm/param.h> -+#include <asm/uaccess.h> -+#include <linux/zlib.h> -+#include <linux/reboot.h> -+#include <linux/delay.h> -+#include <asm/io.h> -+#include <linux/miscdevice.h> -+#include <linux/bootmem.h> -+ -+#ifdef CONFIG_BOOTIMG -+#include <linux/bootimg.h> -+#endif -+ -+static void crash_print_data_around(u_long p); -+static void crash_free_page(u_long addr); -+static int crash_chksum_page(u_long pg_addr, u_long * sum_addr); -+static void *czalloc(void *arg, unsigned int items, unsigned int size); -+static void czfree(void *arg, void *ptr); -+static u_long crash_alloc_dest_page(void); -+static void crash_free_dest_page(u_long dest); -+static void init_dest_page_alloc(void); -+static int crash_audit_maps(void); -+static u_long crash_get_source_page(void); -+static u_long crash_update_map(u_long map, u_long src_base, u_long dest, u_long * pages); -+static int crash_reset_stream(z_stream * stream); -+static boolean_t crash_is_kseg(u_long addr); -+static u_long *crash_link(u_long p); -+static int crash_chksum(u_long limit, u_long * sum_addr); -+static int crash_audit_map_page(u_long map); -+static void crash_wait_cpus(void); -+static int crash_is_dir_page(struct page *page); -+ -+/* for the /dev/crash interface */ -+int crash_init_chrdev(void); -+static int crashdev_ioctl(struct inode *, struct file *, unsigned int, unsigned long); -+ -+#define CRASH_DEBUG 1 -+ -+#ifdef CONFIG_BOOTIMG -+extern int sys_bootimg(struct boot_image *); -+#endif -+ -+static u_long crash_compr_buf; -+static u_long crash_uncompr_buf; -+static u_long crash_dump_header = 0; -+static u_long crash_dest_free_list = 0; -+static u_long crash_debug = 0; -+ -+static u_long crash_cur_pfn; -+ -+static u_long src_pages_skipped = 0; -+static u_long src_pages_saved = 0; -+static u_long dest_pages_free = 0; -+ -+/* this information is saved from within panic() */ -+char *panicmsg = (char *)0; -+int panic_processor = 0; -+int crash_perform_sync = 0; -+ -+u_int console_crash = 0; /* should be moved to alpha branch */ -+ -+// typedef struct task_struct *task_t; -+ -+/* -+ * Threads active at time of panic: -+ */ -+volatile task_t *panic_threads[NR_CPUS]; -+volatile unsigned long panic_ksp[NR_CPUS]; -+unsigned long *panic_regs = NULL; -+ -+int panic_on_oops; /* for /proc/sys/kernel/panic_on_oops */ -+ -+extern unsigned long max_low_pfn; -+ -+u_long crash_zalloc_start; // , crash_zalloc_end, crash_zalloc_cur; -+ -+/* -+ * Crash Kernel API functions below -+ * crash_pages_needed, computes pages needed for header and compression temp -+ * crash_init, partitions out the allocated pages, sets defaults and -+ * initializes the character device. -+ * crash_mark_dump_reserved, marks pages reserved from a previous dump. -+ * save_core, called at panic time to save a dump to memory. -+ */ -+u_long crash_pages_needed(void) -+{ -+ /* one for the header */ -+ return (1 + CRASH_ZALLOC_PAGES + CRASH_UNCOMPR_BUF_PAGES + CRASH_COMPR_BUF_PAGES); -+} -+ -+void crash_init(u_long bootmap_va, u_long crash_va, u_long end_alloc_va) -+{ -+ struct mem_crash_map_hdr *header; -+ int i; -+ -+ /* the default behavior is not NOT panic on a kernel OOPS */ -+ panic_on_oops = 0; -+ -+ printk("crash_init (crash_va: %08lx)\n", crash_va); -+ for (i = 0; i < NR_CPUS; i++) -+ panic_threads[i] = 0; -+ crash_dump_header = crash_va; -+ crash_va += PAGE_SIZE; -+ crash_zalloc_start = crash_va; -+ crash_va += CRASH_ZALLOC_PAGES * PAGE_SIZE; -+ crash_uncompr_buf = crash_va; -+ crash_va += CRASH_UNCOMPR_BUF_PAGES * PAGE_SIZE; -+ crash_compr_buf = crash_va; -+ crash_va += CRASH_COMPR_BUF_PAGES * PAGE_SIZE; -+#if 0 -+ if (crash_va != end_alloc_va) -+ panic("crash_init inconsistency-1\n"); -+#endif -+ -+ header = (struct mem_crash_map_hdr *)crash_dump_header; -+#ifdef CRASH_DEBUG -+ printk("crash_dump_header %p {\n", header); -+ printk(" magic[0] = %lx\n", header->magic[0]); -+ printk(" map = %lx\n", header->map); -+ printk(" map_pages = %lx\n", header->map_pages); -+ printk(" data_pages = %lx\n", header->data_pages); -+ printk(" compr_units = %lx\n", header->compr_units); -+ printk(" boot_reserved_start = %lx\n", header->boot_reserved_start); -+ printk(" boot_reserved_end = %lx\n", header->boot_reserved_end); -+#endif -+ -+ if (header->magic[0] == CRASH_MAGIC) { -+ printk("crash found\n"); -+ if ((header->boot_reserved_start != bootmap_va) || -+ (header->boot_reserved_end != end_alloc_va)) { -+ /* crash audit will catch the corruption */ -+ printk("crash_init inconsistency, dump may be corrupted\n"); -+ } -+ } else { -+printk("memset..."); -+ memset(header, 0, sizeof(*header)); -+printk("done\n"); -+ } -+ -+ header->boot_reserved_start = bootmap_va; -+ header->boot_reserved_end = end_alloc_va; -+ -+} -+ -+void crash_mark_dump_reserved(void) -+{ -+ struct mem_crash_map_hdr *header; -+ struct mem_crash_map_entry *m; -+ -+ header = (struct mem_crash_map_hdr *)crash_dump_header; -+ if (header->magic[0] != CRASH_MAGIC) -+ return; -+ m = (struct mem_crash_map_entry *)header->map; -+#ifdef CRASH_DEBUG -+ printk("\n\n\ncrash_mark_dump_reserved\n\n"); -+ printk("crash_dump_header %p {\n", header); -+ printk(" magic[0] = %lx\n", header->magic[0]); -+ printk(" map = %lx\n", header->map); -+ printk(" map_pages = %lx\n", header->map_pages); -+ printk(" data_pages = %lx\n", header->data_pages); -+ printk(" compr_units = %lx\n", header->compr_units); -+ printk(" boot_reserved_start = %lx\n", header->boot_reserved_start); -+ printk(" boot_reserved_end = %lx\n", header->boot_reserved_end); -+ printk("mem_crash_map_entry %p {\n", m); -+ printk(" src_va = %lx\n", m->src_va); -+ printk(" dest_page_va = %lx\n", m->dest_page_va); -+ printk(" check_sum = %lx\n", m->check_sum); -+#endif -+ -+ if (crash_audit_maps()) { -+ header->magic[0] = 0; -+ return; -+ } -+ -+ m = (struct mem_crash_map_entry *)header->map; -+ again: -+ CRASH_MARK_BOOT_RESERVED(m); -+ for (; m->src_va; m++) { -+ if (m->src_va == -1) { -+ m = (struct mem_crash_map_entry *)m->dest_page_va; -+ goto again; -+ } -+ CRASH_MARK_BOOT_RESERVED(m->dest_page_va); -+ } -+ return; -+} -+ -+void save_core(void) -+{ -+ int i, j, k; -+ z_stream stream; -+ int err; -+ struct task_struct *tp; -+ struct mem_crash_map_hdr *header; -+ u_long *sub_map; -+ u_long map; -+ u_long src, dest, unc, cp, src_base, comp_pages; -+ -+ k = 0; -+ dest = 0; -+ __cli(); -+ tp = current; -+ mb(); -+ if (smp_processor_id() != 0) { /* boot_cpu_id is always 0, i think */ -+ panic_threads[smp_processor_id()] = tp; -+ crash_halt_or_reboot(0); -+ } else { -+ if (console_crash) -+ panic_threads[smp_processor_id()] = &init_task_union.task; -+ else -+ panic_threads[smp_processor_id()] = tp; -+ -+ crash_wait_cpus(); -+ } -+ -+ printk("save_core: started on CPU%d\n", smp_processor_id()); -+ if (!crash_dump_header) { -+ printk("save_core: not initialized\n"); -+ return; -+ } -+ -+ header = (struct mem_crash_map_hdr *)crash_dump_header; -+ header->magic[0] = 0; -+ header->map_pages = 0; -+ header->data_pages = 0; -+ header->compr_units = 0; -+ header->map = 0; -+ -+ stream.workspace=(void*)crash_zalloc_start; -+ // stream.zalloc = czalloc; -+ // stream.zfree = czfree; -+ // stream.opaque = (voidpf) 0; -+ stream.next_out = (Bytef *) crash_compr_buf; -+ stream.avail_out = (uInt) (CRASH_COMPR_BUF_PAGES * PAGE_SIZE); -+ stream.next_in = (Bytef *) crash_uncompr_buf; -+ stream.avail_in = (uInt) (CRASH_UNCOMPR_BUF_PAGES * PAGE_SIZE); -+ err = zlib_deflateInit(&stream, Z_BEST_SPEED); -+ if (err != Z_OK) { -+ printk("save_core: bad return %d from deflateInit\n", err); -+ return; -+ } -+ -+ init_dest_page_alloc(); -+ header->map = map = crash_update_map(0, 0, 0, &header->map_pages); -+ if (!map) { -+ printk("save_core: no dest pages\n"); -+ return; -+ } -+ crash_cur_pfn = 0; -+ src_base = 0; -+ src = 0; -+ for (;;) { -+ sub_map = (u_long *) crash_uncompr_buf; -+ unc = crash_uncompr_buf + CRASH_SUB_MAP_PAGES * PAGE_SIZE; -+ for (i = 0; i < CRASH_SOURCE_PAGES; i++) { -+ src = crash_get_source_page(); -+ if (!src) -+ break; -+ if (!i) -+ src_base = src; -+ if (!crash_is_kseg(unc) || !crash_is_kseg(src)) { -+ printk("unc = 0x%lx, src = 0x%lx, i = %d\n", unc, src, i); -+ i = src = 0; -+ break; -+ } -+ memcpy((void *)unc, (void *)src, PAGE_SIZE); -+ unc += PAGE_SIZE; -+ *sub_map++ = src; -+ } -+ *sub_map = 0; -+ if (!i && !src) -+ break; -+ err = zlib_deflate(&stream, Z_FINISH); -+ if (!(err == Z_STREAM_END)) { -+ zlib_deflateEnd(&stream); -+ printk("save_core: bad return %d from deflate, src_base = 0x%lx\n", err, -+ src_base); -+ return; -+ } -+ comp_pages = (u_long) round_page(stream.total_out) / PAGE_SIZE; -+ if (crash_debug) -+ printk("src_base = 0x%lx compressed data in 0x%lx pages\n", src_base, -+ comp_pages); -+ -+ cp = crash_compr_buf; -+ j = 0; -+ if (crash_debug) -+ printk("\nsrc = %lx\n", src_base); -+ else { -+ printk("."); -+ if (!(k++ % 64)) -+ printk("\n"); -+ } -+ for (i = 0; i < comp_pages; i++) { -+ dest = crash_alloc_dest_page(); -+ if (crash_debug) { -+ printk("%lx ", dest); -+ if (!(j++ % 8)) -+ printk("\n"); -+ } -+ header->data_pages++; -+ if (!dest) { -+ printk("save_core: no dest pages\n"); -+ return; -+ } -+ if (!crash_is_kseg(dest) || !crash_is_kseg(cp)) { -+ printk("dest = 0x%lx, cp = 0x%lx, i = %d, comp_pages = 0x%lx\n", -+ dest, cp, i, comp_pages); -+ src = 0; -+ break; -+ } -+ memcpy((void *)dest, (void *)cp, PAGE_SIZE); -+ cp += PAGE_SIZE; -+ map = crash_update_map(map, src_base, dest, &header->map_pages); /* links a new map page, if necessary */ -+ if (!map) { -+ printk("save_core: no map\n"); -+ return; -+ } -+ } -+ header->compr_units++; -+ if (!src) -+ break; -+ if (crash_reset_stream(&stream)) -+ return; -+ } -+ -+ map = crash_update_map(map, 0, 0, &header->map_pages); -+ header->magic[0] = CRASH_MAGIC; -+ -+ if (crash_audit_maps()) { -+ header->magic[0] = 0; -+ return; -+ } -+ -+ printk("\nsave_core: src pages skipped = 0x%lx src pages saved = 0x%lx\n", -+ src_pages_skipped, src_pages_saved); -+ printk("save_core: data_pages = 0x%lx map_pages = 0x%lx\n", header->data_pages, -+ header->map_pages); -+ printk("save_core: completed, crash_dump_header = 0x%lx\n", crash_dump_header); -+} -+ -+/* helper functions private to this file */ -+static int crash_reset_stream(z_stream * stream) -+{ -+ int err; -+ -+ stream->workspace=(void*)crash_zalloc_start; -+ // stream->zalloc = czalloc; -+ // stream->zfree = czfree; -+ // stream->opaque = (voidpf) 0; -+ stream->next_out = (Bytef *) crash_compr_buf; -+ stream->avail_out = (uInt) (CRASH_COMPR_BUF_PAGES * PAGE_SIZE); -+ stream->next_in = (Bytef *) crash_uncompr_buf; -+ stream->avail_in = (uInt) (CRASH_UNCOMPR_BUF_PAGES * PAGE_SIZE); -+ err = zlib_deflateReset(stream); -+ if (err != Z_OK) { -+ printk("crash_reset_stream: bad return %d from deflateReset\n", err); -+ return 1; -+ } -+ return 0; -+} -+ -+static u_long crash_alloc_dest_page(void) -+{ -+ u_long addr; -+ -+ addr = crash_dest_free_list; -+ if (addr) { -+ crash_dest_free_list = *(u_long *) addr; -+ dest_pages_free--; -+ } else -+ printk("crash_alloc_dest_page: free list empty\n"); -+ return addr; -+} -+ -+static void crash_free_dest_page(u_long dest) -+{ -+ if (!dest) { -+ printk("crash_free_dest_page: freeing addr 0\n"); -+ return; -+ } -+ dest_pages_free++; -+ dest = (u_long) trunc_page(dest); -+ *(u_long *) dest = crash_dest_free_list; -+ crash_dest_free_list = dest; -+} -+ -+/* -+ * Stolen from setup.c -+ */ -+#define PFN_PHYS(x) ((x) << PAGE_SHIFT) -+ -+static void init_dest_page_alloc(void) -+{ -+ u_long va; -+ long i; -+ struct page *page; -+ struct mem_crash_map_hdr *header; -+ -+ header = (struct mem_crash_map_hdr *)crash_dump_header; -+ for (i = ((1 << 24) >> PAGE_SHIFT) + LOWER_MEM_FORWARD; -+ i < (max_low_pfn - UPPER_MEM_BACKUP); i++) { -+ va = (u_long) phys_to_virt(PFN_PHYS(i)); -+ if ((va >= header->boot_reserved_start) && (va < header->boot_reserved_end)) -+ continue; -+ page = mem_map + i; -+ if (PageLocked(page) || PageReserved(page)) -+ continue; -+ if (PageFree(page) || PageAnon(page) || PageShm(page) || page->buffers) -+ crash_free_dest_page(va); -+ } -+ if (crash_debug) -+ printk("init_dest_page_alloc: dest_pages_free = 0x%lx\n", dest_pages_free); -+} -+ -+static int crash_is_dir_page(struct page *page) { -+ struct inode *tmp_inode; -+ -+ if(page->mapping && page->mapping->host) { -+ tmp_inode = (struct inode *)page->mapping->host; -+ if((tmp_inode->i_sb->s_magic == EXT2_SUPER_MAGIC) && -+ (S_ISDIR(tmp_inode->i_mode))) -+ return 1; -+ } -+ -+ return 0; -+} -+ -+static u_long crash_get_source_page(void) -+{ -+ struct page *page; -+ u_long va; -+ -+ while (crash_cur_pfn < max_low_pfn) { -+ page = mem_map + crash_cur_pfn; -+ if (!(PageFree(page) || PageAnon(page) || PageShm(page) || page->buffers)) -+ break; -+ src_pages_skipped++; -+ crash_cur_pfn++; -+ } -+ if (crash_cur_pfn == max_low_pfn) -+ return 0; -+ -+ va = (u_long) phys_to_virt(PFN_PHYS(crash_cur_pfn)); -+ src_pages_saved++; -+ crash_cur_pfn++; -+ return va; -+} -+ -+static u_long crash_update_map(u_long map, u_long src_base, u_long dest, u_long * pages) -+{ -+ struct mem_crash_map_entry *m; -+ -+ -+ if (!map) { -+ (*pages)++; -+ return crash_alloc_dest_page(); -+ } -+ m = (struct mem_crash_map_entry *)map; -+ m->src_va = src_base; -+ m->dest_page_va = dest; -+ if (dest) -+ if (crash_chksum_page(dest, &m->check_sum)) -+ return 0; -+ -+ map += sizeof(struct mem_crash_map_entry); -+ -+ m = (struct mem_crash_map_entry *)map; -+ if (!src_base) { /* end of list */ -+ if (crash_chksum((u_long) m, &m->src_va)) -+ return 0; -+ } else if ((map + 3 * sizeof(struct mem_crash_map_entry)) > (u_long) round_page(map)) { -+ m->src_va = -1; -+ map = m->dest_page_va = crash_alloc_dest_page(); -+ if (crash_debug) -+ printk("\nm = 0x%lx m->src_va = 0x%lx m->dest_page_va = 0x%lx\n", -+ (u_long) trunc_page(m), m->src_va, m->dest_page_va); -+ m++; -+ if (crash_chksum((u_long) m, &m->src_va)) -+ return 0; -+ if (crash_debug) -+ printk("m = 0x%lx chksum = m->src_va = 0x%lx\n", (u_long) trunc_page(m), -+ m->src_va); -+ if (crash_audit_map_page((u_long) m)) -+ return 0; -+ (*pages)++; -+ } -+ return map; -+} -+ -+static int crash_chksum(u_long limit, u_long * sum_addr) -+{ -+ u_long sum; -+ u_long *addr; -+ -+ if (!crash_is_kseg(limit)) { -+ printk("bad addr = 0x%lx to crash_chksum\n", limit); -+ return 1; -+ } -+ sum = 0; -+ addr = (u_long *) trunc_page(limit); -+ for (; (u_long) addr < limit; addr++) -+ sum += *addr; -+ *sum_addr = sum; -+ return 0; -+} -+ -+static int crash_chksum_page(u_long pg_addr, u_long * sum_addr) -+{ -+ u_long sum, limit; -+ u_long *addr; -+ -+ if (!crash_is_kseg(pg_addr)) { -+ printk("bad addr = 0x%lx to crash_chksum_page\n", pg_addr); -+ return 1; -+ } -+ -+ sum = 0; -+ addr = (u_long *) trunc_page(pg_addr); -+ limit = (u_long) addr + PAGE_SIZE; -+ for (; (u_long) addr < limit; addr++) -+ sum += *addr; -+ *sum_addr = sum; -+ return 0; -+} -+ -+static int crash_audit_maps(void) -+{ -+ u_long m, count; -+ u_long *link_addr; -+ struct mem_crash_map_hdr *header; -+ -+ header = (struct mem_crash_map_hdr *)crash_dump_header; -+ if (header->magic[0] != CRASH_MAGIC) -+ return 1; -+ -+ link_addr = &header->map; -+ m = header->map; -+ -+ count = 0; -+ for (;;) { -+ if (!crash_is_kseg(m)) { -+ printk("crash_audit_maps: bad link 0x%lx at 0x%lx\n", m, -+ (u_long) link_addr); -+ return 1; -+ } -+ if (crash_audit_map_page(m)) { -+ printk("audit failed while on map page %ld\n", count); -+ return 1; -+ } -+ if (!crash_link(m)) -+ break; -+ link_addr = crash_link(m); -+ m = *link_addr; -+ -+ count++; -+ } -+ return 0; -+} -+ -+static int crash_audit_map_page(u_long map) -+{ -+ struct mem_crash_map_entry *m; -+ u_long sum; -+ -+ if (!map || !crash_is_kseg(map)) { -+ printk("crash_audit_map_page: bad map = 0x%lx\n", map); -+ return 1; -+ } -+ map = (u_long) trunc_page((u_long) map); -+ m = (struct mem_crash_map_entry *)map; -+ for (;;) { -+ if ((m->src_va == -1) || (m->src_va == 0)) { -+ m++; -+ if (crash_chksum((u_long) m, &sum)) -+ return 1; -+ if (m->src_va != sum) { -+ printk("crash_audit_map_page: checksum failure1\n"); -+ printk("m = 0x%lx, sum = 0x%lx, m->src_va = 0x%lx\n", -+ (u_long) m, (u_long) sum, (u_long) m->src_va); -+ crash_print_data_around((u_long) & m->src_va); -+ return 1; -+ } else { -+ return 0; -+ } -+ } else { -+ if (crash_chksum_page((u_long) m->dest_page_va, &sum) -+ || (m->check_sum != sum)) { -+ printk("crash_audit_map_page: checksum failure2\n"); -+ printk -+ ("dest_page_va = 0x%lx, &dest_page_va = 0x%lx, sum = 0x%lx, m->check_sum = 0x%lx\n", -+ (u_long) m->dest_page_va, (u_long) (&m->check_sum), -+ (u_long) sum, (u_long) m->check_sum); -+ crash_print_data_around((u_long) & m->check_sum); -+ return 1; -+ } -+ } -+ m++; -+ } -+} -+ -+static void crash_print_data_around(u_long p) -+{ -+ u_long *a; -+ int i; -+ -+ if (!crash_is_kseg(p)) { -+ printk("crash_print_data_around: p = 0x%lx not kseg\n", p); -+ return; -+ } -+ a = (u_long *) p; -+ a -= 20; -+ for (i = 0; i < 40; i++) -+ printk("%lx\n", *a++); -+} -+ -+#ifdef CRASH_DEBUG -+static void crash_print_map_page(u_long map) -+{ -+ struct mem_crash_map_entry *m; -+ int j = 0; -+ u_long sum; -+ -+ map = (u_long) trunc_page((u_long) map); -+ m = (struct mem_crash_map_entry *)map; -+ for (;;) { -+ printk("%lx %lx %lx ", m->src_va, m->dest_page_va, m->check_sum); -+ if (!(j++ % 4)) -+ printk("\n"); -+ if ((m->src_va == -1) || (m->src_va == 0)) { -+ m++; -+ printk("%lx %lx ", m->src_va, m->dest_page_va); -+ if (crash_chksum((u_long) m, &sum)); -+ else -+ printk("\nchksum = 0x%lx\n", sum); -+ return; -+ } -+ m++; -+ } -+} -+#endif /* CRASH_DEBUG */ -+ -+static void crash_wait_cpus(void) -+{ -+ int i; -+ int msecs = 0; -+ -+ for (i = 0; i < smp_num_cpus; i++) { -+ if (i != smp_processor_id()) { -+ while (!panic_threads[i]) { -+ msecs++; -+ mdelay(1); -+ if (msecs > CRASH_CPU_TIMEOUT) { -+ /* if other cpus are still running -+ * we have to halt, otherwise we could -+ * risk using buffer cache pages which -+ * could subsequently get flushed to disk. -+ */ -+ printk("Unable to halt other CPUs, halting system.\n"); -+ crash_halt_or_reboot(0); -+ } -+ } -+ } -+ } -+ -+ crash_cleanup_smp_state(); -+} -+ -+ -+#if 0 -+static void *czalloc(void *arg, unsigned int items, unsigned int size) -+{ -+ u_long nbytes; -+ u_long addr; -+ -+ nbytes = (u_long) (items * size); -+ nbytes = (u_long) round_page(nbytes); -+ if ((crash_zalloc_cur + nbytes) > crash_zalloc_end) -+ return 0; -+ addr = crash_zalloc_cur; -+ crash_zalloc_cur += nbytes; -+ return ((void *)addr); -+} -+ -+static void czfree(void *arg, void *ptr) -+{ -+ printk("zfree: ptr = 0x%lx\n", (u_long) ptr); -+} -+#endif -+ -+static boolean_t crash_is_kseg(u_long addr) -+{ -+ u_long phys; -+ -+ phys = virt_to_phys((void *)addr); -+ if (phys < PFN_PHYS(max_low_pfn)) -+ return TRUE; -+ else -+ return FALSE; -+} -+ -+static u_long *crash_link(u_long p) -+{ -+ struct mem_crash_map_entry *m; -+ -+ p = (u_long) trunc_page(p); -+ m = (struct mem_crash_map_entry *)p; -+ for (; m->src_va; m++) -+ if (m->src_va == -1) -+ return &m->dest_page_va; -+ -+ return 0; -+} -+ -+/* Call this after data written to disk. */ -+static int crash_free_crashmem(void) -+{ -+ struct mem_crash_map_hdr *header; -+ struct mem_crash_map_entry *m, *last_m; -+ -+ if (crash_debug) -+ printk("crash_free_crashmem: \n"); -+ -+ header = (struct mem_crash_map_hdr *)crash_dump_header; -+ if (crash_audit_maps()) { -+ header->magic[0] = 0; -+ return 1; -+ } -+ m = (struct mem_crash_map_entry *)header->map; -+ again: -+ for (; m->src_va; m++) { -+ if (m->src_va == -1) { -+ last_m = m; -+ m = (struct mem_crash_map_entry *)m->dest_page_va; -+ crash_free_page((unsigned long)last_m); -+ goto again; -+ } -+ crash_free_page(m->dest_page_va); -+ } -+ if (crash_debug) -+ printk("crash_free_crashmem: 0x%lx freed\n", -+ (header->data_pages + header->map_pages) * PAGE_SIZE); -+ header->magic[0] = 0; -+ return 0; -+} -+ -+static void crash_free_page(u_long addr) -+{ -+ struct page *page; -+ -+ page = virt_to_page(addr); -+ ClearPageReserved(page); -+ set_page_count(page, 1); -+ __free_page(page); -+} -+ -+static int get_dump_helper(u_long kva, u_long buf) -+{ -+ struct page *page; -+ struct mem_crash_map_hdr *header; -+ -+ header = (struct mem_crash_map_hdr *)crash_dump_header; -+ if (header->magic[0] != CRASH_MAGIC) -+ return 1; -+ -+ if (!kva) { -+ if (crash_audit_maps()) { -+ printk("get_dump_helper: audit failure\n"); -+ header->magic[0] = 0; -+ return 1; -+ } -+ page = virt_to_page((u_long) crash_dump_header); -+ if (!PageReserved(page)) { -+ printk("not reserved: crash_dump_header = 0x%lx\n", crash_dump_header); -+ return 1; -+ } -+ if (copy_to_user((char *)buf, (char *)crash_dump_header, -+ sizeof(struct mem_crash_map_hdr))) { -+ printk("get_dump_helper: copy_to_user failed1\n"); -+ return 1; -+ } -+ } else { -+ page = virt_to_page(kva); -+ if (!PageReserved(page)) { -+ printk("not reserved: kva = 0x%lx\n", kva); -+ return 1; -+ } -+ if (copy_to_user((char *)buf, (char *)trunc_page(kva), PAGE_SIZE)) { -+ printk("get_dump_helper: copy_to_user failed2\n"); -+ return 1; -+ } -+ } -+ return 0; -+} -+ -+static void free_dump_helper(void) -+{ -+ struct mem_crash_map_hdr *header; -+ -+ header = (struct mem_crash_map_hdr *)crash_dump_header; -+ if (header->magic[0] != CRASH_MAGIC) -+ return; -+ if (crash_debug) -+ printk("free_dump_helper\n"); -+ crash_free_crashmem(); -+} -+ -+static int crashdev_open(struct inode *inode, struct file *file) -+{ -+ /* always return success -- nothing to do here */ -+ return 0; -+} -+ -+/* character device implementation */ -+static struct file_operations crashdev_fops = { -+ ioctl:crashdev_ioctl, -+ open:crashdev_open, -+}; -+ -+static struct miscdevice crash_miscdev = { -+ 190, "crash", &crashdev_fops -+}; -+ -+int crash_init_chrdev(void) -+{ -+ int result; -+ -+ result = misc_register(&crash_miscdev); -+ -+ if (result < 0) -+ printk(KERN_WARNING "crash: can't register crash device (c 10 190)\n"); -+ -+ return result; -+} -+ -+/* call the original syscalls, just to get things going */ -+static int crashdev_ioctl(struct inode *inode, struct file *file, -+ unsigned int cmd, unsigned long arg) -+{ -+ int retval = 0; -+ -+ switch (cmd) { -+ case CRASH_IOCFREEDUMP: -+ free_dump_helper(); -+ break; -+ -+ case CRASH_IOCGETDUMP: -+ if (crash_debug) { -+ printk("crashdev_ioctl: get dump\n"); -+ printk("vals: %08lx %08lx\n", -+ ((struct ioctl_getdump *)arg)->kva, -+ ((struct ioctl_getdump *)arg)->buf); -+ } -+ -+ retval = get_dump_helper((u_long) ((struct ioctl_getdump *)arg)->kva, -+ (u_long) ((struct ioctl_getdump *)arg)->buf); -+ break; -+ -+#ifdef CONFIG_BOOTIMG -+ case CRASH_IOCBOOTIMG: -+ if (crash_debug) -+ printk("crashdev_ioctl: bootimg\n"); -+ -+ retval = sys_bootimg((struct boot_image *)arg); -+ break; -+#endif -+ -+ case CRASH_IOCVERSION: -+ if (crash_debug) -+ printk("crashdev_ioctl: version\n"); -+ retval = CRASH_K_MINOR | (CRASH_K_MAJOR << 16); -+ break; -+ -+ default: -+ return -EINVAL; -+ } -+ -+ return retval; -+} -Index: linux/kernel/module.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/kernel/module.c,v -retrieving revision 1.1.1.1.4.1 -retrieving revision 1.1.1.1.4.1.2.1 -diff -u -r1.1.1.1.4.1 -r1.1.1.1.4.1.2.1 ---- linux/kernel/module.c 12 Mar 2003 19:51:36 -0000 1.1.1.1.4.1 -+++ linux/kernel/module.c 1 Apr 2003 12:17:41 -0000 1.1.1.1.4.1.2.1 -@@ -311,7 +311,14 @@ - error = -EEXIST; - goto err1; - } -+#if defined(CONFIG_MCL_COREDUMP) -+ /* Call vmalloc_32 instead of module_map (vmalloc for i386) -+ * to avoid being mapped in highmem where mcore can't see us. -+ */ -+ if ((mod = (struct module *)vmalloc_32(size)) == NULL) { -+#else - if ((mod = (struct module *)module_map(size)) == NULL) { -+#endif - error = -ENOMEM; - goto err1; - } -Index: linux/kernel/panic.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/kernel/panic.c,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.1 -diff -u -r1.3.2.1 -r1.3.2.1.2.1 ---- linux/kernel/panic.c 12 Mar 2003 19:51:36 -0000 1.3.2.1 -+++ linux/kernel/panic.c 1 Apr 2003 12:17:41 -0000 1.3.2.1.2.1 -@@ -19,6 +19,10 @@ - #include <linux/vt_kern.h> - #include <linux/pc_keyb.h> - -+#ifdef CONFIG_MCL_COREDUMP -+#include <linux/crash.h> -+#endif -+ - asmlinkage void sys_sync(void); /* it's really int */ - - int panic_timeout; -@@ -197,20 +201,43 @@ - unsigned long caller = (unsigned long) __builtin_return_address(0); - #endif - -+#ifdef CONFIG_MCL_COREDUMP -+ crash_save_regs(); -+#endif -+ - bust_spinlocks(1); - va_start(args, fmt); - vsprintf(buf, fmt, args); - va_end(args); - printk(KERN_EMERG "Kernel panic: %s\n",buf); -+ -+#ifdef CONFIG_MCL_COREDUMP -+ if (!panicmsg) { -+ panicmsg = buf; -+ panic_processor = smp_processor_id(); -+ mb(); -+ } -+#endif -+ - if (netdump_func) - BUG(); - if (in_interrupt()) - printk(KERN_EMERG "In interrupt handler - not syncing\n"); - else if (!current->pid) - printk(KERN_EMERG "In idle task - not syncing\n"); -+#ifdef CONFIG_MCL_COREDUMP -+ else if (crash_perform_sync) -+#else - else -+#endif - sys_sync(); -+ - bust_spinlocks(0); -+ -+#ifdef CONFIG_MCL_COREDUMP -+ smp_call_function((void *)smp_crash_funnel_cpu,0,0,0); -+ crash_save_current_state(current); -+#endif - - #ifdef CONFIG_SMP - smp_send_stop(); -Index: linux/kernel/sysctl.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/kernel/sysctl.c,v -retrieving revision 1.2.2.1 -retrieving revision 1.2.2.1.2.1 -diff -u -r1.2.2.1 -r1.2.2.1.2.1 ---- linux/kernel/sysctl.c 12 Mar 2003 19:51:36 -0000 1.2.2.1 -+++ linux/kernel/sysctl.c 1 Apr 2003 12:17:41 -0000 1.2.2.1.2.1 -@@ -37,6 +37,10 @@ - #include <linux/nfs_fs.h> - #endif - -+#ifdef CONFIG_MCL_COREDUMP -+#include <linux/crash.h> -+#endif -+ - #if defined(CONFIG_SYSCTL) - - /* External variables not in a header file. */ -@@ -247,6 +251,10 @@ - {KERN_SYSRQ, "sysrq", &sysrq_enabled, sizeof (int), - 0644, NULL, &proc_dointvec}, - #endif -+#ifdef CONFIG_MCL_COREDUMP -+ {KERN_PANIC_ON_OOPS, "panic_on_oops", &panic_on_oops, sizeof(int), -+ 0644, NULL, &proc_dointvec}, -+#endif - {KERN_CADPID, "cad_pid", &cad_pid, sizeof (int), - 0600, NULL, &proc_dointvec}, - {KERN_MAX_THREADS, "threads-max", &max_threads, sizeof(int), -Index: linux/lib/Config.in -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/lib/Config.in,v -retrieving revision 1.2 -retrieving revision 1.2.4.1 -diff -u -r1.2 -r1.2.4.1 ---- linux/lib/Config.in 14 Feb 2003 22:59:23 -0000 1.2 -+++ linux/lib/Config.in 1 Apr 2003 12:17:41 -0000 1.2.4.1 -@@ -23,12 +23,14 @@ - fi - fi - --if [ "$CONFIG_PPP_DEFLATE" = "y" -o \ -+if [ "$CONFIG_MCL_COREDUMP" = "y" -o \ -+ "$CONFIG_PPP_DEFLATE" = "y" -o \ - "$CONFIG_JFFS2_FS" = "y" ]; then - define_tristate CONFIG_ZLIB_DEFLATE y - else - if [ "$CONFIG_PPP_DEFLATE" = "m" -o \ -- "$CONFIG_JFFS2_FS" = "m" ]; then -+ "$CONFIG_JFFS2_FS" = "m" -o \ -+ "$CONFIG_MCL_COREDUMP" = "m" ]; then - define_tristate CONFIG_ZLIB_DEFLATE m - else - tristate 'zlib compression support' CONFIG_ZLIB_DEFLATE -Index: linux/mm/memory.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/mm/memory.c,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.1 -diff -u -r1.3.2.1 -r1.3.2.1.2.1 ---- linux/mm/memory.c 12 Mar 2003 19:51:37 -0000 1.3.2.1 -+++ linux/mm/memory.c 1 Apr 2003 12:17:41 -0000 1.3.2.1.2.1 -@@ -1381,6 +1381,10 @@ - } - lock_page(page); - -+#ifdef CONFIG_MCL_COREDUMP -+ set_bit(PG_anon, &page->flags); -+#endif -+ - /* - * Back out if somebody else faulted in this pte while we - * released the page table lock. -@@ -1470,6 +1474,9 @@ - mm->rss++; - flush_page_to_ram(page); - entry = pte_mkwrite(pte_mkdirty(mk_pte(page, vma->vm_page_prot))); -+#ifdef CONFIG_MCL_COREDUMP -+ set_bit(PG_anon, &page->flags); -+#endif - lru_cache_add(page); - } - -Index: linux/mm/page_alloc.c -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/mm/page_alloc.c,v -retrieving revision 1.3.2.1 -retrieving revision 1.3.2.1.2.1 -diff -u -r1.3.2.1 -r1.3.2.1.2.1 ---- linux/mm/page_alloc.c 12 Mar 2003 19:51:37 -0000 1.3.2.1 -+++ linux/mm/page_alloc.c 1 Apr 2003 12:17:41 -0000 1.3.2.1.2.1 -@@ -95,6 +95,10 @@ - struct page *base; - per_cpu_t *per_cpu; - zone_t *zone; -+#ifdef CONFIG_MCL_COREDUMP -+ struct page *pagemap; -+ int count = 1<<order; -+#endif - - /* - * Yes, think what happens when other parts of the kernel take -@@ -163,6 +167,15 @@ - - spin_lock(&zone->lock); - -+#ifdef CONFIG_MCL_COREDUMP -+ pagemap = page; -+ do { -+ pagemap->flags |= (1<<PG_free); -+ pagemap->flags &= ~((1<<PG_anon)|(1<<PG_shm)); -+ pagemap++; -+ } while(--count); -+#endif -+ - zone->free_pages -= mask; - - while (mask + (1 << (MAX_ORDER-1))) { -@@ -268,6 +281,16 @@ - zone->free_pages -= 1UL << order; - - page = expand(zone, page, index, order, curr_order, area); -+#ifdef CONFIG_MCL_COREDUMP -+ { -+ struct page *pagemap = page; -+ int count = 1<<order; -+ do { -+ pagemap->flags &= ~(1<<PG_free); -+ pagemap++; -+ } while (--count); -+ } -+#endif - spin_unlock_irqrestore(&zone->lock, flags); - - set_page_count(page, 1); -Index: linux/arch/i386//boot/compressed/head.S -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/boot/compressed/head.S,v -retrieving revision 1.1.1.1 -retrieving revision 1.1.1.1.12.6 -diff -u -r1.1.1.1 -r1.1.1.1.12.6 ---- linux/arch/i386//boot/compressed/head.S 7 May 2002 21:53:54 -0000 1.1.1.1 -+++ linux/arch/i386//boot/compressed/head.S 5 Apr 2003 05:51:27 -0000 1.1.1.1.12.6 -@@ -23,6 +23,7 @@ - */ - .text - -+#include <linux/config.h> - #include <linux/linkage.h> - #include <asm/segment.h> - -@@ -31,6 +32,55 @@ - startup_32: - cld - cli -+ -+#ifdef CONFIG_BOOTIMG -+/* -+ * GDT is invalid if we're booted by bootimg, so reload it now -+ */ -+ lgdt %cs:gdt_descr -+ ljmp $(__KERNEL_CS),$1f -+ -+gdt_table_limit = gdt_table_end - gdt_table - 1 -+gdt_descr: -+ .word gdt_table_limit -+ .long gdt_table -+ -+gdt_table: /* stolen from arch/i386/kernel/head.S */ -+ .quad 0x0000000000000000 /* NULL descriptor */ -+ .quad 0x0000000000000000 /* 0x0b reserved */ -+ .quad 0x0000000000000000 /* 0x13 reserved */ -+ .quad 0x0000000000000000 /* 0x1b reserved */ -+ .quad 0x00cffa000000ffff /* 0x23 user 4GB code at 0x00000000 */ -+ .quad 0x00cff2000000ffff /* 0x2b user 4GB data at 0x00000000 */ -+ .quad 0x0000000000000000 /* 0x33 TLS entry 1 */ -+ .quad 0x0000000000000000 /* 0x3b TLS entry 2 */ -+ .quad 0x0000000000000000 /* 0x43 TLS entry 3 */ -+ .quad 0x0000000000000000 /* 0x4b reserved */ -+ .quad 0x0000000000000000 /* 0x53 reserved */ -+ .quad 0x0000000000000000 /* 0x5b reserved */ -+ -+ .quad 0x00cf9a000000ffff /* 0x60 kernel 4GB code at 0x00000000 */ -+ .quad 0x00cf92000000ffff /* 0x68 kernel 4GB data at 0x00000000 */ -+ .quad 0x0000000000000000 /* 0x70 TSS descriptor */ -+ .quad 0x0000000000000000 /* 0x78 LDT descriptor */ -+ -+ /* Segments used for calling PnP BIOS */ -+ .quad 0x00c09a0000000000 /* 0x80 32-bit code */ -+ .quad 0x00809a0000000000 /* 0x88 16-bit code */ -+ .quad 0x0080920000000000 /* 0x90 16-bit data */ -+ .quad 0x0080920000000000 /* 0x98 16-bit data */ -+ .quad 0x0080920000000000 /* 0xa0 16-bit data */ -+ /* -+ * The APM segments have byte granularity and their bases -+ * and limits are set at run time. -+ */ -+ .quad 0x00409a0000000000 /* 0xa8 APM CS code */ -+ .quad 0x00009a0000000000 /* 0xb0 APM CS 16 code (16 bit) */ -+ .quad 0x0040920000000000 /* 0xb8 APM DS data */ -+gdt_table_end: -+ -+1: -+#endif - movl $(__KERNEL_DS),%eax - movl %eax,%ds - movl %eax,%es -@@ -92,7 +142,6 @@ - cld - rep - movsl -- - popl %esi # discard the address - popl %ebx # real mode pointer - popl %esi # low_buffer_start -@@ -124,5 +173,10 @@ - movsl - movl %ebx,%esi # Restore setup pointer - xorl %ebx,%ebx -+#ifdef CONFIG_BOOTIMG -+ movl $0x100000,%eax -+ jmpl *%eax -+#else - ljmp $(__KERNEL_CS), $0x100000 -+#endif - move_routine_end: -Index: linux/arch/i386//kernel/head.S -=================================================================== -RCS file: /chaos/cvs/kernel-rh/linux/arch/i386/kernel/head.S,v -retrieving revision 1.2.2.1 -retrieving revision 1.2.2.1.2.5 -diff -u -r1.2.2.1 -r1.2.2.1.2.5 ---- linux/arch/i386//kernel/head.S 12 Mar 2003 19:49:06 -0000 1.2.2.1 -+++ linux/arch/i386//kernel/head.S 5 Apr 2003 05:51:27 -0000 1.2.2.1.2.5 -@@ -42,6 +42,21 @@ - * On entry, %esi points to the real-mode code as a 32-bit pointer. - */ - startup_32: -+#ifdef CONFIG_BOOTIMG -+/* -+ * GDT is invalid if we're booted by bootimg, so reload it now -+ */ -+ lgdt %cs:_gdt_descr-__PAGE_OFFSET -+ ljmp $(__KERNEL_CS),$1f-__PAGE_OFFSET -+ -+gdt_limit = SYMBOL_NAME(cpu_gdt_table_end) - SYMBOL_NAME(cpu_gdt_table) - 1 -+ -+_gdt_descr: -+ .word gdt_limit -+ .long SYMBOL_NAME(cpu_gdt_table)-__PAGE_OFFSET -+ -+1: -+#endif - /* - * Set segments to known values - */ -@@ -452,6 +467,7 @@ - .quad 0x00409a0000000000 /* 0xa8 APM CS code */ - .quad 0x00009a0000000000 /* 0xb0 APM CS 16 code (16 bit) */ - .quad 0x0040920000000000 /* 0xb8 APM DS data */ -+ENTRY(cpu_gdt_table_end) - - #if CONFIG_SMP - .fill (NR_CPUS-1)*GDT_ENTRIES,8,0 /* other CPU's GDT */ diff --git a/lustre/kernel_patches/patches/mkdep-revert-rh-2.4.patch b/lustre/kernel_patches/patches/mkdep-revert-rh-2.4.patch deleted file mode 100644 index 5cc34b8536..0000000000 --- a/lustre/kernel_patches/patches/mkdep-revert-rh-2.4.patch +++ /dev/null @@ -1,50 +0,0 @@ -Index: linux-2.4.20-30.9/scripts/mkdep.c -=================================================================== ---- linux-2.4.20-30.9.orig/scripts/mkdep.c 2004-02-19 19:40:51.000000000 -0500 -+++ linux-2.4.20-30.9/scripts/mkdep.c 2004-04-28 17:24:54.000000000 -0400 -@@ -48,8 +48,6 @@ - char __depname[512] = "\n\t@touch "; - #define depname (__depname+9) - int hasdep; --char cwd[PATH_MAX]; --int lcwd; - - struct path_struct { - int len; -@@ -204,22 +202,8 @@ - memcpy(path->buffer+path->len, name, len); - path->buffer[path->len+len] = '\0'; - if (access(path->buffer, F_OK) == 0) { -- int l = lcwd + strlen(path->buffer); -- char name2[l+2], *p; -- if (path->buffer[0] == '/') { -- memcpy(name2, path->buffer, l+1); -- } -- else { -- memcpy(name2, cwd, lcwd); -- name2[lcwd] = '/'; -- memcpy(name2+lcwd+1, path->buffer, path->len+len+1); -- } -- while ((p = strstr(name2, "/../"))) { -- *p = '\0'; -- strcpy(strrchr(name2, '/'), p+3); -- } - do_depname(); -- printf(" \\\n %s", name2); -+ printf(" \\\n %s", path->buffer); - return; - } - } -@@ -601,12 +585,6 @@ - return 1; - } - -- if (!getcwd(cwd, sizeof(cwd))) { -- fprintf(stderr, "mkdep: getcwd() failed %m\n"); -- return 1; -- } -- lcwd = strlen(cwd); -- - add_path("."); /* for #include "..." */ - - while (++argv, --argc > 0) { diff --git a/lustre/kernel_patches/patches/netconsole-2.4.20-rh.patch b/lustre/kernel_patches/patches/netconsole-2.4.20-rh.patch deleted file mode 100644 index c5f1ed0308..0000000000 --- a/lustre/kernel_patches/patches/netconsole-2.4.20-rh.patch +++ /dev/null @@ -1,469 +0,0 @@ -Index: linux-2.4.20-rh/drivers/net/netconsole.c -=================================================================== ---- linux-2.4.20-rh.orig/drivers/net/netconsole.c 2003-07-22 16:02:23.000000000 +0800 -+++ linux-2.4.20-rh/drivers/net/netconsole.c 2003-11-11 07:42:33.000000000 +0800 -@@ -12,6 +12,8 @@ - * - * 2001-09-17 started by Ingo Molnar. - * 2002-03-14 simultaneous syslog packet option by Michael K. Johnson -+ * 2003-10-30 Add sysrq command processing by Wangdi <wangdi@clusterfs.com> -+ * - */ - - /**************************************************************** -@@ -51,6 +53,7 @@ - #include <linux/tty_driver.h> - #include <linux/etherdevice.h> - #include <linux/elf.h> -+#include "netconsole.h" - - static struct net_device *netconsole_dev; - static u16 source_port, netdump_target_port, netlog_target_port, syslog_target_port; -@@ -62,12 +65,11 @@ - static unsigned int mhz = 500, idle_timeout; - static unsigned long long mhz_cycles, jiffy_cycles; - --#include "netconsole.h" - - #define MAX_UDP_CHUNK 1460 - #define MAX_PRINT_CHUNK (MAX_UDP_CHUNK-HEADER_LEN) - --#define DEBUG 0 -+#define DEBUG 0 - #if DEBUG - # define Dprintk(x...) printk(KERN_INFO x) - #else -@@ -187,6 +189,22 @@ - } - } - } -+void (*irqfunc)(int, void *, struct pt_regs *); -+ -+static void netdump_poll(struct net_device *dev) -+{ -+ int budget = 1; -+ -+ disable_irq(dev->irq); -+ -+ irqfunc(dev->irq, dev, 0); -+ -+ if(dev->poll && test_bit(__LINK_STATE_RX_SCHED, &dev->state)) -+ dev->poll(dev, &budget); -+ -+ enable_irq(dev->irq); -+ -+} - - static struct sk_buff * alloc_netconsole_skb(struct net_device *dev, int len, int reserve) - { -@@ -209,7 +227,7 @@ - once = 0; - } - Dprintk("alloc skb: polling controller ...\n"); -- dev->poll_controller(dev); -+ netdump_poll(dev); - goto repeat; - } - } -@@ -231,7 +249,7 @@ - spin_unlock(&dev->xmit_lock); - - Dprintk("xmit skb: polling controller ...\n"); -- dev->poll_controller(dev); -+ netdump_poll(dev); - zap_completion_queue(); - goto repeat_poll; - } -@@ -426,18 +444,79 @@ - static spinlock_t sequence_lock = SPIN_LOCK_UNLOCKED; - static unsigned int log_offset; - -+static int thread_stopped = 0; -+/*Interrupt function for netdump */ -+static int sysrq_mode = 0; -+static int stop_sysrq_thread = 0; -+#define Set_Sysrq_mode() (sysrq_mode = 1) -+#define Clear_Sysrq_mode() (sysrq_mode = 0) -+static char send_cache[MAX_PRINT_CHUNK]; -+static unsigned int send_cache_pos = 0; -+wait_queue_head_t sysrq_thread_queue; -+wait_queue_head_t sysrq_thread_waiter_queue; -+ -+#define SEND_MSG_BUFFER(buf, len) \ -+do \ -+{ \ -+ reply_t reply; \ -+ unsigned int flags; \ -+ __save_flags(flags); \ -+ __cli(); \ -+ reply.code = REPLY_LOG; \ -+ reply.nr = 0; \ -+ reply.info = 0; \ -+ spin_lock(&sequence_lock); \ -+ send_netlog_skb(dev, buf, len, &reply); \ -+ spin_unlock(&sequence_lock); \ -+ __restore_flags(flags); \ -+}while(0); -+ -+void netconsole_do_sysrq(req_t *req) -+{ -+ struct pt_regs regs; -+ struct net_device *dev = netconsole_dev; -+ -+ if (!dev) -+ return; -+ Set_Sysrq_mode(); -+ get_current_regs(®s); -+ handle_sysrq((int)req->from, ®s, NULL); -+ -+ if (send_cache_pos != 0){ -+ SEND_MSG_BUFFER(send_cache, send_cache_pos); -+ memset(send_cache, 0, MAX_PRINT_CHUNK); -+ send_cache_pos = 0; -+ } -+ -+ Clear_Sysrq_mode(); -+} - static void write_netconsole_msg(struct console *con, const char *msg0, unsigned int msg_len) - { - int len, left, i; - struct net_device *dev; - const char *msg = msg0; - reply_t reply; -- -+ - dev = netconsole_dev; - if (!dev || netdump_mode) - return; -- -- if (dev->poll_controller && netif_running(dev)) { -+ if (sysrq_mode){ -+ unsigned long total_len = send_cache_pos + msg_len; -+ unsigned long left_len = msg_len; -+ while (total_len >= MAX_PRINT_CHUNK){ -+ unsigned long send_len = MAX_PRINT_CHUNK - send_cache_pos; -+ memcpy(send_cache + send_cache_pos, msg, send_len); -+ SEND_MSG_BUFFER(send_cache, MAX_PRINT_CHUNK); -+ send_cache_pos = 0; -+ total_len -= MAX_PRINT_CHUNK; -+ left_len -= send_len; -+ } -+ if (left_len > 0){ -+ memcpy(send_cache + send_cache_pos, msg + (msg_len -left_len), left_len); -+ send_cache_pos += left_len; -+ } -+ return; -+ }else if (netif_running(dev)) { - unsigned long flags; - - __save_flags(flags); -@@ -567,8 +646,6 @@ - req_t *req; - struct net_device *dev; - -- if (!netdump_mode) -- return NET_RX_SUCCESS; - #if DEBUG - { - static int packet_count; -@@ -722,8 +799,16 @@ - Dprintk("... netdump from: %08x.\n", req->from); - Dprintk("... netdump to: %08x.\n", req->to); - -- add_new_req(req); -+ if (netdump_mode) -+ add_new_req(req); -+ else if (req->command == COMM_SYSRQ){ -+ add_new_req(req); -+ wake_up(&sysrq_thread_queue); -+ return NET_RX_DROP; -+ } - out: -+ if (!netdump_mode) -+ return NET_RX_SUCCESS; - return NET_RX_DROP; - } - -@@ -763,6 +848,7 @@ - kunmap_atomic(kaddr, KM_NETDUMP); - } - -+ - /* - * This function waits for the client to acknowledge the receipt - * of the netdump startup reply, with the possibility of packets -@@ -792,7 +878,7 @@ - // wait 1 sec. - udelay(100); - Dprintk("handshake: polling controller ...\n"); -- dev->poll_controller(dev); -+ netdump_poll(dev); - zap_completion_queue(); - req = get_new_req(); - if (req) -@@ -904,7 +990,7 @@ - while (netdump_mode) { - __cli(); - Dprintk("main netdump loop: polling controller ...\n"); -- dev->poll_controller(dev); -+ netdump_poll(dev); - zap_completion_queue(); - #if !CLI - __sti(); -@@ -1009,6 +1095,32 @@ - printk("NETDUMP END!\n"); - __restore_flags(flags); - } -+static int netconsole_sysrq_schedule(void *arg) -+{ -+ struct task_struct *tsk = current; -+ -+ sprintf(tsk->comm, "sysrq_schedule"); -+ sigfillset(&tsk->blocked); -+ -+ /* main loop */ -+ thread_stopped = 0; -+ for (;;) { -+ wait_event_interruptible(sysrq_thread_queue, -+ !list_empty(&request_list) || stop_sysrq_thread); -+ while (!list_empty(&request_list)) { -+ req_t *req = get_new_req(); -+ if (req->command == COMM_SYSRQ) -+ netconsole_do_sysrq(req); -+ } -+ if (stop_sysrq_thread) -+ break; -+ wake_up(&sysrq_thread_waiter_queue); -+ } -+ thread_stopped = 1; -+ wake_up(&sysrq_thread_waiter_queue); -+ return 0; -+} -+ - - static char *dev; - static int netdump_target_eth_byte0 = 255; -@@ -1087,11 +1199,12 @@ - - static struct console netconsole = - { flags: CON_ENABLED, write: write_netconsole_msg }; -- - static int init_netconsole(void) - { - struct net_device *ndev = NULL; - struct in_device *in_dev; -+ struct irqaction *action; -+ int rc = 0; - - printk(KERN_INFO "netlog: using network device <%s>\n", dev); - // this will be valid once the device goes up. -@@ -1101,10 +1214,6 @@ - printk(KERN_ERR "netlog: network device %s does not exist, aborting.\n", dev); - return -1; - } -- if (!ndev->poll_controller) { -- printk(KERN_ERR "netlog: %s's network driver does not implement netlogging yet, aborting.\n", dev); -- return -1; -- } - in_dev = in_dev_get(ndev); - if (!in_dev) { - printk(KERN_ERR "netlog: network device %s is not an IP protocol device, aborting.\n", dev); -@@ -1137,8 +1246,6 @@ - if (!netdump_target_ip && !netlog_target_ip && !syslog_target_ip) { - printk(KERN_ERR "netlog: target_ip parameter not specified, aborting.\n"); - return -1; -- } -- if (netdump_target_ip) { - #define IP(x) ((unsigned char *)&netdump_target_ip)[x] - printk(KERN_INFO "netlog: using netdump target IP %u.%u.%u.%u\n", - IP(3), IP(2), IP(1), IP(0)); -@@ -1214,12 +1321,27 @@ - - mhz_cycles = (unsigned long long)mhz * 1000000ULL; - jiffy_cycles = (unsigned long long)mhz * (1000000/HZ); -- -- INIT_LIST_HEAD(&request_list); -- -+ - ndev->rx_hook = netconsole_rx_hook; - netdump_func = netconsole_netdump; - netconsole_dev = ndev; -+ /* find irq function of the ndev*/ -+ action=find_irq_action(ndev->irq, ndev); -+ if (!action) { -+ printk(KERN_ERR "couldn't find irq handler for <%s>", dev); -+ return -1; -+ } -+ irqfunc = action->handler; -+ -+ stop_sysrq_thread = 0; -+ INIT_LIST_HEAD(&request_list); -+ init_waitqueue_head(&sysrq_thread_queue); -+ init_waitqueue_head(&sysrq_thread_waiter_queue); -+ if ((rc = kernel_thread(netconsole_sysrq_schedule, NULL, 0)) < 0 ){ -+ printk(KERN_ERR "Can not start netconsole sysrq thread: rc %d\n", rc); -+ return -1; -+ } -+ - #define STARTUP_MSG "[...network console startup...]\n" - write_netconsole_msg(NULL, STARTUP_MSG, strlen(STARTUP_MSG)); - -@@ -1230,7 +1352,11 @@ - - static void cleanup_netconsole(void) - { -- printk(KERN_INFO "netlog: network logging shut down.\n"); -+ stop_sysrq_thread = 1; -+ -+ wake_up(&sysrq_thread_queue); -+ wait_event(sysrq_thread_waiter_queue, thread_stopped); -+ printk(KERN_INFO"netlog: network logging shut down.\n"); - unregister_console(&netconsole); - - #define SHUTDOWN_MSG "[...network console shutdown...]\n" -Index: linux-2.4.20-rh/drivers/net/netconsole.h -=================================================================== ---- linux-2.4.20-rh.orig/drivers/net/netconsole.h 2003-07-22 16:02:23.000000000 +0800 -+++ linux-2.4.20-rh/drivers/net/netconsole.h 2003-10-30 01:48:45.000000000 +0800 -@@ -29,7 +29,7 @@ - * - ****************************************************************/ - --#define NETCONSOLE_VERSION 0x04 -+#define NETCONSOLE_VERSION 0x03 - - enum netdump_commands { - COMM_NONE = 0, -@@ -42,6 +42,8 @@ - COMM_START_NETDUMP_ACK = 7, - COMM_GET_REGS = 8, - COMM_SHOW_STATE = 9, -+ COMM_START_WRITE_NETDUMP_ACK = 10, -+ COMM_SYSRQ = 11, - }; - - #define NETDUMP_REQ_SIZE (8+4*4) -@@ -69,6 +71,7 @@ - REPLY_REGS = 10, - REPLY_MAGIC = 11, - REPLY_SHOW_STATE = 12, -+ REPLY_SYSRQ = 13, - }; - - typedef struct netdump_reply_s { -@@ -78,4 +81,22 @@ - } reply_t; - - #define HEADER_LEN (1 + sizeof(reply_t)) -- -+/* for netconsole */ -+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(); -+} -+ -Index: linux-2.4.20-rh/arch/i386/kernel/irq.c -=================================================================== ---- linux-2.4.20-rh.orig/arch/i386/kernel/irq.c 2003-10-30 08:29:38.000000000 +0800 -+++ linux-2.4.20-rh/arch/i386/kernel/irq.c 2003-10-30 08:30:13.000000000 +0800 -@@ -1043,7 +1043,20 @@ - register_irq_proc(irq); - return 0; - } -+struct irqaction *find_irq_action(unsigned int irq, void *dev_id) -+{ -+ struct irqaction *a, *r=0; - -+ spin_lock_irq(&irq_desc[irq].lock); -+ for(a=irq_desc[irq].action; a; a=a->next) { -+ if(a->dev_id == dev_id) { -+ r=a; -+ break; -+ } -+ } -+ spin_unlock_irq(&irq_desc[irq].lock); -+ return r; -+} - - static struct proc_dir_entry * root_irq_dir; - static struct proc_dir_entry * irq_dir [NR_IRQS]; -Index: linux-2.4.20-rh/net/core/dev.c -=================================================================== ---- linux-2.4.20-rh.orig/net/core/dev.c 2003-10-29 01:40:26.000000000 +0800 -+++ linux-2.4.20-rh/net/core/dev.c 2003-10-30 01:48:45.000000000 +0800 -@@ -1475,6 +1475,16 @@ - - skb_bond(skb); - -+ if (unlikely(skb->dev->rx_hook != NULL)) { -+ int ret; -+ -+ ret = skb->dev->rx_hook(skb); -+ if (ret == NET_RX_DROP){ -+ kfree_skb(skb); -+ return ret; -+ } -+ } -+ - netdev_rx_stat[smp_processor_id()].total++; - - #ifdef CONFIG_NET_FASTROUTE -Index: linux-2.4.20-rh/include/asm-i386/irq.h -=================================================================== ---- linux-2.4.20-rh.orig/include/asm-i386/irq.h 2003-10-28 16:18:18.000000000 +0800 -+++ linux-2.4.20-rh/include/asm-i386/irq.h 2003-10-30 10:24:49.000000000 +0800 -@@ -38,7 +38,7 @@ - extern void disable_irq_nosync(unsigned int); - extern void enable_irq(unsigned int); - extern void release_x86_irqs(struct task_struct *); -- -+extern struct irqaction *find_irq_action(unsigned int irq, void *dev_id); - #ifdef CONFIG_X86_LOCAL_APIC - #define ARCH_HAS_NMI_WATCHDOG /* See include/linux/nmi.h */ - #endif -Index: linux-2.4.20-rh/arch/i386/kernel/i386_ksyms.c -=================================================================== ---- linux-2.4.20-rh.orig/arch/i386/kernel/i386_ksyms.c 2003-10-28 19:44:57.000000000 +0800 -+++ linux-2.4.20-rh/arch/i386/kernel/i386_ksyms.c 2003-10-30 11:14:55.000000000 +0800 -@@ -68,6 +68,7 @@ - EXPORT_SYMBOL(iounmap); - EXPORT_SYMBOL(enable_irq); - EXPORT_SYMBOL(disable_irq); -+EXPORT_SYMBOL(find_irq_action); - EXPORT_SYMBOL(disable_irq_nosync); - EXPORT_SYMBOL(probe_irq_mask); - EXPORT_SYMBOL(kernel_thread); -@@ -199,7 +200,6 @@ - EXPORT_SYMBOL(edd); - EXPORT_SYMBOL(eddnr); - #endif -- - EXPORT_SYMBOL_GPL(show_mem); - EXPORT_SYMBOL_GPL(show_state); - EXPORT_SYMBOL_GPL(show_regs); -Index: linux-2.4.20-rh/kernel/panic.c -=================================================================== ---- linux-2.4.20-rh.orig/kernel/panic.c 2003-10-31 07:25:19.000000000 +0800 -+++ linux-2.4.20-rh/kernel/panic.c 2003-10-31 07:25:59.000000000 +0800 -@@ -219,8 +219,6 @@ - } - #endif - -- if (netdump_func) -- BUG(); - if (in_interrupt()) - printk(KERN_EMERG "In interrupt handler - not syncing\n"); - else if (!current->pid) diff --git a/lustre/kernel_patches/patches/netconsole-over-netpoll.patch b/lustre/kernel_patches/patches/netconsole-over-netpoll.patch deleted file mode 100644 index c715c8427b..0000000000 --- a/lustre/kernel_patches/patches/netconsole-over-netpoll.patch +++ /dev/null @@ -1,416 +0,0 @@ - Documentation/networking/netconsole.txt | 57 ++++++++ - arch/i386/kernel/i386_ksyms.c | 8 + - arch/i386/kernel/irq.c | 12 + - drivers/net/Kconfig | 7 + - drivers/net/Makefile | 1 - drivers/net/netconsole.c | 217 ++++++++++++++++++++++++++++++++ - include/asm-i386/netconsole.h | 6 - net/Kconfig | 2 - net/core/dev.c | 3 - 9 files changed, 311 insertions(+), 2 deletions(-) - ---- linux-2.6.0-test6/arch/i386/kernel/i386_ksyms.c~netconsole-over-netpoll 2003-10-14 17:44:04.000000000 +0400 -+++ linux-2.6.0-test6-alexey/arch/i386/kernel/i386_ksyms.c 2003-10-14 17:45:08.000000000 +0400 -@@ -34,7 +34,7 @@ - #include <asm/nmi.h> - #include <asm/edd.h> - #include <asm/ist.h> -- -+#include <asm/netconsole.h> - extern void dump_thread(struct pt_regs *, struct user *); - extern spinlock_t rtc_lock; - -@@ -211,6 +211,12 @@ EXPORT_SYMBOL(edd); - EXPORT_SYMBOL(eddnr); - #endif - -+#ifdef CONFIG_NETCONSOLE -+EXPORT_SYMBOL(netconsole_sysrq_req); -+EXPORT_SYMBOL(netconsole_do_sysrq); -+EXPORT_SYMBOL(netif_in_poll); -+#endif -+ - #if defined(CONFIG_X86_SPEEDSTEP_SMI) || defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE) - EXPORT_SYMBOL(ist_info); - #endif ---- linux-2.6.0-test6/arch/i386/kernel/irq.c~netconsole-over-netpoll 2003-10-14 17:45:03.000000000 +0400 -+++ linux-2.6.0-test6-alexey/arch/i386/kernel/irq.c 2003-10-14 17:45:08.000000000 +0400 -@@ -45,6 +45,7 @@ - #include <asm/desc.h> - #include <asm/irq.h> - #include <asm/kgdb.h> -+#include <asm/netconsole.h> - - /* - * Linux has a controller-independent x86 interrupt architecture. -@@ -510,6 +511,17 @@ out: - BREAKPOINT; - } - #endif -+#ifdef CONFIG_NETCONSOLE -+ /* -+ * We need to do this after clearing out of all the interrupt -+ * machinery because kgdb will reenter the NIC driver and the IRQ -+ * system. synchronize_irq() (at least) will deadlock. -+ */ -+ if (netconsole_sysrq_req && !netif_in_poll) { -+ netconsole_sysrq_req = 0; -+ HANDLE_NETCONSOLE; -+ } -+#endif - return 1; - } - ---- /dev/null 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.6.0-test6-alexey/Documentation/networking/netconsole.txt 2003-10-14 17:45:08.000000000 +0400 -@@ -0,0 +1,57 @@ -+ -+started by Ingo Molnar <mingo@redhat.com>, 2001.09.17 -+2.6 port and netpoll api by Matt Mackall <mpm@selenic.com>, Sep 9 2003 -+ -+Please send bug reports to Matt Mackall <mpm@selenic.com> -+ -+This module logs kernel printk messages over UDP allowing debugging of -+problem where disk logging fails and serial consoles are impractical. -+ -+It can be used either built-in or as a module. As a built-in, -+netconsole initializes immediately after NIC cards and will bring up -+the specified interface as soon as possible. While this doesn't allow -+capture of early kernel panics, it does capture most of the boot -+process. -+ -+It takes a string configuration parameter "netconsole" in the -+following format: -+ -+ netconsole=[src-port]@[src-ip]/[<dev>],[tgt-port]@<tgt-ip>/[tgt-macaddr] -+ -+ where -+ src-port source for UDP packets (defaults to 6666) -+ src-ip source IP to use (interface address) -+ dev network interface (eth0) -+ tgt-port port for logging agent (514) -+ tgt-ip IP address for logging agent -+ tgt-macaddr ethernet MAC address for logging agent (broadcast) -+ -+Examples: -+ -+ linux netconsole=4444@10.0.0.1/eth1,9353@10.0.0.2/12:34:56:78:9a:bc -+ -+ or -+ -+ insmod netconsole netconsole=@/,@10.0.0.2/ -+ -+Built-in netconsole starts immediately after the TCP stack is -+initialized and attempts to bring up the supplied dev at the supplied -+address. -+ -+The remote host can run either 'netcat -u -l -p <port>' or syslogd. -+ -+WARNING: the default target ethernet setting uses the broadcast -+ethernet address to send packets, which can cause increased load on -+other systems on the same ethernet segment. -+ -+NOTE: the network device (eth1 in the above case) can run any kind -+of other network traffic, netconsole is not intrusive. Netconsole -+might cause slight delays in other traffic if the volume of kernel -+messages is high, but should have no other impact. -+ -+Netconsole was designed to be as instantaneous as possible, to -+enable the logging of even the most critical kernel bugs. It works -+from IRQ contexts as well, and does not enable interrupts while -+sending packets. Due to these unique needs, configuration can not -+be more automatic, and some fundamental limitations will remain: -+only IP networks, UDP packets and ethernet devices are supported. ---- linux-2.6.0-test6/drivers/net/Kconfig~netconsole-over-netpoll 2003-10-14 17:44:05.000000000 +0400 -+++ linux-2.6.0-test6-alexey/drivers/net/Kconfig 2003-10-14 17:45:08.000000000 +0400 -@@ -2444,6 +2444,13 @@ config SHAPER - config NET_POLL_CONTROLLER - def_bool KGDB - -+config NETCONSOLE -+ tristate "Network console logging support" -+ depends on NETDEVICES -+ ---help--- -+ If you want to log kernel messages over the network, enable this. -+ See Documentation/networking/netconsole.txt for details. -+ - source "drivers/net/wan/Kconfig" - - source "drivers/net/pcmcia/Kconfig" ---- linux-2.6.0-test6/drivers/net/Makefile~netconsole-over-netpoll 2003-10-14 17:45:04.000000000 +0400 -+++ linux-2.6.0-test6-alexey/drivers/net/Makefile 2003-10-14 17:45:08.000000000 +0400 -@@ -109,6 +109,7 @@ ifeq ($(CONFIG_SLIP_COMPRESSED),y) - endif - # Must come after all NICs it might use - obj-$(CONFIG_KGDB) += kgdb_eth.o -+obj-$(CONFIG_NETCONSOLE) += netconsole.o - - obj-$(CONFIG_DUMMY) += dummy.o - obj-$(CONFIG_DE600) += de600.o ---- /dev/null 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.6.0-test6-alexey/drivers/net/netconsole.c 2003-10-14 17:45:56.000000000 +0400 -@@ -0,0 +1,217 @@ -+/* -+ * linux/drivers/net/netconsole.c -+ * -+ * 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. -+ * 2003-08-11 2.6 port by Matt Mackall -+ * simplified options -+ * generic card hooks -+ * works non-modular -+ * 2003-09-07 rewritten with netpoll api -+ * 2003-09-27 updated by wangdi <wangdi@clusterfs.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. -+ * -+ * 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/mm.h> -+#include <linux/tty.h> -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/console.h> -+#include <linux/tty_driver.h> -+#include <linux/module.h> -+#include <linux/moduleparam.h> -+#include <linux/string.h> -+#include <linux/sysrq.h> -+#include <linux/smp.h> -+#include <linux/netpoll.h> -+#include <linux/dump.h> -+#include <linux/dump_netdev.h> -+#include <asm/unaligned.h> -+#include <asm/dump.h> -+#include <asm/netconsole.h> -+ -+MODULE_AUTHOR("Maintainer: Matt Mackall <mpm@selenic.com>"); -+MODULE_DESCRIPTION("Console driver for network interfaces"); -+MODULE_LICENSE("GPL"); -+ -+static char config[256]; -+module_param_string(netconsole, config, 256, 0); -+MODULE_PARM_DESC(netconsole, " netconsole=[src-port]@[src-ip]/[dev],[tgt-port]@<tgt-ip>/[tgt-macaddr]\n"); -+ -+static void rx_hook(struct netpoll *np, int port, char *msg, int len); -+ -+static int sysrq_mode = 0; -+ -+static req_t req; -+unsigned int netconsole_sysrq_req = 0; -+unsigned int netif_in_poll = 0; -+static unsigned int handle_sysrq_progress = 0; -+#define Set_Sysrq_mode() (sysrq_mode = 1) -+#define Clear_Sysrq_mode() (sysrq_mode = 0) -+ -+static struct netpoll np = { -+ .name = "netconsole", -+ .dev_name = "eth0", -+ .rx_hook = rx_hook, -+ .local_port = 6666, -+ .remote_port = 6666, -+ .remote_mac = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, -+}; -+ -+#define MAX_PRINT_CHUNK 1000 -+#define MAX_SEND_BUFFER_LEN (MAX_PRINT_CHUNK + 200) -+ -+static char send_buf[MAX_SEND_BUFFER_LEN]; -+static char send_cache[MAX_PRINT_CHUNK]; -+static unsigned int send_cache_pos = 0; -+ -+static void send_msg_buffer(struct netpoll *np, const char *msg, int len) -+{ -+ reply_t reply; -+ -+ send_buf[0] = NETCONSOLE_VERSION; -+ reply.code = REPLY_LOG; -+ reply.nr = 0; -+ reply.info = 0; -+ -+ put_unaligned(htonl(reply.nr), (u32 *) (send_buf + 1)); -+ put_unaligned(htonl(reply.code), (u32 *) (send_buf + 5)); -+ put_unaligned(htonl(reply.info), (u32 *) (send_buf+ 9)); -+ -+ memcpy(send_buf + 1 + sizeof(reply_t), msg, len); -+ netpoll_send_udp(np, send_buf, len + 1 + sizeof(reply_t)); -+ return; -+} -+static void write_msg(struct console *con, const char *msg, unsigned int len) -+{ -+ unsigned long total_len = send_cache_pos + len; -+ unsigned long left_len = len; -+ unsigned long flags; -+ -+ if (!sysrq_mode) -+ return; -+ if (!np.dev) -+ return; -+ while (total_len >= MAX_PRINT_CHUNK){ -+ unsigned long send_len = MAX_PRINT_CHUNK - send_cache_pos; -+ memcpy(send_cache + send_cache_pos, msg, send_len); -+ local_irq_save(flags); -+#if 0 -+ for(left = send_len; left; ) { -+ frag = min(left, MAX_PRINT_CHUNK); -+ send_msg_buffer(&np, send_buffer, frag); -+ msg += frag; -+ left -= frag; -+ } -+#endif -+ send_msg_buffer(&np, send_cache, MAX_PRINT_CHUNK); -+ send_cache_pos = 0; -+ local_irq_restore(flags); -+ total_len -= MAX_PRINT_CHUNK; -+ left_len -= send_len; -+ } -+ if (left_len > 0){ -+ memcpy(send_cache + send_cache_pos, msg + (len -left_len), left_len); -+ send_cache_pos += left_len; -+ } -+} -+void netconsole_do_sysrq() -+{ -+ struct pt_regs regs; -+ unsigned long flags; -+ -+ handle_sysrq_progress = 1; -+ Set_Sysrq_mode(); -+ get_current_regs(®s); -+ handle_sysrq((int)req.from, ®s, NULL); -+ -+ if (send_cache_pos != 0){ -+ local_irq_save(flags); -+ send_msg_buffer(&np, send_cache, send_cache_pos); -+ send_cache_pos = 0; -+ local_irq_restore(flags); -+ } -+ -+ handle_sysrq_progress = 0; -+ Clear_Sysrq_mode(); -+} -+static void rx_hook(struct netpoll *np, int port, char *msg, int len) -+{ -+ /* add sysrq support */ -+ req_t *__req; -+ -+ if (handle_sysrq_progress) -+ goto out; -+ __req = (req_t *)(msg); -+ if(len < (sizeof(req_t))) -+ goto out; -+ -+ if ((ntohl(__req->command) != COMM_SYSRQ)) -+ goto out; -+ /*FIXME should check magic, but did not have good ways*/ -+ -+ 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); -+ netconsole_sysrq_req = 1; -+out: -+ return ; -+} -+ -+static struct console netconsole = { -+ .flags = CON_ENABLED | CON_PRINTBUFFER, -+ .write = write_msg -+}; -+ -+static int option_setup(char *opt) -+{ -+ return netpoll_parse_options(&np, opt); -+} -+ -+__setup("netconsole=", option_setup); -+ -+static int init_netconsole(void) -+{ -+ if(strlen(config) && option_setup(config)) -+ return 1; -+ -+ if(!np.remote_ip || netpoll_setup(&np)) -+ return 1; -+ register_console(&netconsole); -+ printk(KERN_INFO "netconsole: network logging started\n"); -+ return 0; -+} -+ -+static void cleanup_netconsole(void) -+{ -+ unregister_console(&netconsole); -+ netpoll_cleanup(&np); -+} -+ -+module_init(init_netconsole); -+module_exit(cleanup_netconsole); ---- /dev/null 2003-01-30 13:24:37.000000000 +0300 -+++ linux-2.6.0-test6-alexey/include/asm-i386/netconsole.h 2003-10-14 17:45:08.000000000 +0400 -@@ -0,0 +1,6 @@ -+extern unsigned int netconsole_sysrq_req; -+extern void netconsole_do_sysrq(void); -+extern unsigned int netif_in_poll; -+#ifndef HANDLE_NETCONSOLE -+#define HANDLE_NETCONSOLE netconsole_do_sysrq() -+#endif ---- linux-2.6.0-test6/net/core/dev.c~netconsole-over-netpoll 2003-10-14 17:45:03.000000000 +0400 -+++ linux-2.6.0-test6-alexey/net/core/dev.c 2003-10-14 17:45:08.000000000 +0400 -@@ -109,6 +109,7 @@ - #include <linux/wireless.h> /* Note : will define WIRELESS_EXT */ - #include <net/iw_handler.h> - #endif /* CONFIG_NET_RADIO */ -+#include <asm/netconsole.h> - #include <asm/current.h> - - #ifdef CONFIG_KGDB -@@ -1687,6 +1688,7 @@ static void net_rx_action(struct softirq - preempt_disable(); - local_irq_disable(); - -+ netif_in_poll = 1; - while (!list_empty(&queue->poll_list)) { - struct net_device *dev; - -@@ -1711,6 +1713,7 @@ static void net_rx_action(struct softirq - local_irq_disable(); - } - } -+ netif_in_poll = 0; - out: - local_irq_enable(); - preempt_enable(); ---- linux-2.6.0-test6/net/Kconfig~netconsole-over-netpoll 2003-10-14 17:45:03.000000000 +0400 -+++ linux-2.6.0-test6-alexey/net/Kconfig 2003-10-14 17:45:08.000000000 +0400 -@@ -671,6 +671,6 @@ source "net/irda/Kconfig" - source "net/bluetooth/Kconfig" - - config NETPOLL -- def_bool KGDB -+ def_bool KGDB || NETCONSOLE - - endmenu - -_ diff --git a/lustre/kernel_patches/patches/nfs-cifs-intent-2.6-vanilla.patch b/lustre/kernel_patches/patches/nfs-cifs-intent-2.6-vanilla.patch new file mode 100644 index 0000000000..0c4f64bcac --- /dev/null +++ b/lustre/kernel_patches/patches/nfs-cifs-intent-2.6-vanilla.patch @@ -0,0 +1,117 @@ +Index: linux-2.6.7-vanilla/fs/nfs/dir.c +=================================================================== +--- linux-2.6.7-vanilla.orig/fs/nfs/dir.c 2004-07-01 12:24:53.588555336 +0300 ++++ linux-2.6.7-vanilla/fs/nfs/dir.c 2004-07-01 12:37:42.595648488 +0300 +@@ -778,7 +778,7 @@ + if (nd->flags & LOOKUP_DIRECTORY) + return 0; + /* Are we trying to write to a read only partition? */ +- if (IS_RDONLY(dir) && (nd->intent.open.flags & (O_CREAT|O_TRUNC|FMODE_WRITE))) ++ if (IS_RDONLY(dir) && (nd->intent.it_flags & (O_CREAT|O_TRUNC|FMODE_WRITE))) + return 0; + return 1; + } +@@ -799,7 +799,7 @@ + dentry->d_op = NFS_PROTO(dir)->dentry_ops; + + /* Let vfs_create() deal with O_EXCL */ +- if (nd->intent.open.flags & O_EXCL) ++ if (nd->intent.it_flags & O_EXCL) + goto no_entry; + + /* Open the file on the server */ +@@ -807,7 +807,7 @@ + /* Revalidate parent directory attribute cache */ + nfs_revalidate_inode(NFS_SERVER(dir), dir); + +- if (nd->intent.open.flags & O_CREAT) { ++ if (nd->intent.it_flags & O_CREAT) { + nfs_begin_data_update(dir); + inode = nfs4_atomic_open(dir, dentry, nd); + nfs_end_data_update(dir); +@@ -823,7 +823,7 @@ + break; + /* This turned out not to be a regular file */ + case -ELOOP: +- if (!(nd->intent.open.flags & O_NOFOLLOW)) ++ if (!(nd->intent.it_flags & O_NOFOLLOW)) + goto no_open; + /* case -EISDIR: */ + /* case -EINVAL: */ +@@ -857,7 +857,7 @@ + dir = parent->d_inode; + if (!is_atomic_open(dir, nd)) + goto no_open; +- openflags = nd->intent.open.flags; ++ openflags = nd->intent.it_flags; + if (openflags & O_CREAT) { + /* If this is a negative dentry, just drop it */ + if (!inode) +Index: linux-2.6.7-vanilla/fs/nfs/nfs4proc.c +=================================================================== +--- linux-2.6.7-vanilla.orig/fs/nfs/nfs4proc.c 2004-07-01 12:09:22.000000000 +0300 ++++ linux-2.6.7-vanilla/fs/nfs/nfs4proc.c 2004-07-01 12:37:42.598648032 +0300 +@@ -475,17 +475,17 @@ + struct nfs4_state *state; + + if (nd->flags & LOOKUP_CREATE) { +- attr.ia_mode = nd->intent.open.create_mode; ++ attr.ia_mode = nd->intent.it_create_mode; + attr.ia_valid = ATTR_MODE; + if (!IS_POSIXACL(dir)) + attr.ia_mode &= ~current->fs->umask; + } else { + attr.ia_valid = 0; +- BUG_ON(nd->intent.open.flags & O_CREAT); ++ BUG_ON(nd->intent.it_flags & O_CREAT); + } + + cred = rpcauth_lookupcred(NFS_SERVER(dir)->client->cl_auth, 0); +- state = nfs4_do_open(dir, &dentry->d_name, nd->intent.open.flags, &attr, cred); ++ state = nfs4_do_open(dir, &dentry->d_name, nd->intent.it_flags, &attr, cred); + put_rpccred(cred); + if (IS_ERR(state)) + return (struct inode *)state; +Index: linux-2.6.7-vanilla/fs/cifs/dir.c +=================================================================== +--- linux-2.6.7-vanilla.orig/fs/cifs/dir.c 2004-07-01 12:09:20.000000000 +0300 ++++ linux-2.6.7-vanilla/fs/cifs/dir.c 2004-07-01 12:38:17.695312528 +0300 +@@ -175,23 +175,23 @@ + } + + if(nd) { +- if ((nd->intent.open.flags & O_ACCMODE) == O_RDONLY) ++ if ((nd->intent.it_flags & O_ACCMODE) == O_RDONLY) + desiredAccess = GENERIC_READ; +- else if ((nd->intent.open.flags & O_ACCMODE) == O_WRONLY) { ++ else if ((nd->intent.it_flags & O_ACCMODE) == O_WRONLY) { + desiredAccess = GENERIC_WRITE; + write_only = TRUE; +- } else if ((nd->intent.open.flags & O_ACCMODE) == O_RDWR) { ++ } else if ((nd->intent.it_flags & O_ACCMODE) == O_RDWR) { + /* GENERIC_ALL is too much permission to request */ + /* can cause unnecessary access denied on create */ + /* desiredAccess = GENERIC_ALL; */ + desiredAccess = GENERIC_READ | GENERIC_WRITE; + } + +- if((nd->intent.open.flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) ++ if((nd->intent.it_flags & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) + disposition = FILE_CREATE; +- else if((nd->intent.open.flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) ++ else if((nd->intent.it_flags & (O_CREAT | O_TRUNC)) == (O_CREAT | O_TRUNC)) + disposition = FILE_OVERWRITE_IF; +- else if((nd->intent.open.flags & O_CREAT) == O_CREAT) ++ else if((nd->intent.it_flags & O_CREAT) == O_CREAT) + disposition = FILE_OPEN_IF; + else { + cFYI(1,("Create flag not set in create function")); +@@ -361,7 +361,7 @@ + parent_dir_inode, direntry->d_name.name, direntry)); + + if(nd) { /* BB removeme */ +- cFYI(1,("In lookup nd flags 0x%x open intent flags 0x%x",nd->flags,nd->intent.open.flags)); ++ cFYI(1,("In lookup nd flags 0x%x open intent flags 0x%x",nd->flags,nd->intent.it_flags)); + } /* BB removeme BB */ + /* BB Add check of incoming data - e.g. frame not longer than maximum SMB - let server check the namelen BB */ + diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.19-pre1.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.19-pre1.patch deleted file mode 100644 index 0e4acd0e76..0000000000 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.19-pre1.patch +++ /dev/null @@ -1,757 +0,0 @@ - fs/Makefile | 3 - fs/file_table.c | 11 ++ - fs/inode.c | 23 ++++- - fs/namei.c | 12 ++ - fs/nfsd/export.c | 5 + - fs/nfsd/nfsfh.c | 65 +++++++++++++- - fs/nfsd/vfs.c | 240 ++++++++++++++++++++++++++++++++++++++++++++++++----- - include/linux/fs.h | 10 ++ - kernel/ksyms.c | 2 - 9 files changed, 337 insertions(+), 34 deletions(-) - -Index: linux-2.4.19-pre1/fs/file_table.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/file_table.c 2001-09-18 00:16:30.000000000 +0400 -+++ linux-2.4.19-pre1/fs/file_table.c 2003-11-21 02:02:35.000000000 +0300 -@@ -82,7 +82,8 @@ - * and call the open function (if any). The caller must verify that - * inode->i_fop is not NULL. - */ --int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+int init_private_file_it(struct file *filp, struct dentry *dentry, int mode, -+ struct lookup_intent *it) - { - memset(filp, 0, sizeof(*filp)); - filp->f_mode = mode; -@@ -90,12 +91,20 @@ - filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; -+ if (it) -+ filp->f_it = it; - filp->f_op = dentry->d_inode->i_fop; - if (filp->f_op->open) - return filp->f_op->open(dentry->d_inode, filp); - else - return 0; - } -+EXPORT_SYMBOL(init_private_file_it); -+ -+int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+{ -+ return init_private_file_it(filp, dentry, mode, NULL); -+} - - void fput(struct file * file) - { -Index: linux-2.4.19-pre1/fs/inode.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/inode.c 2003-11-20 19:24:08.000000000 +0300 -+++ linux-2.4.19-pre1/fs/inode.c 2003-11-21 02:02:35.000000000 +0300 -@@ -971,9 +971,10 @@ - } - - --struct inode *iget4(struct super_block *sb, unsigned long ino, find_inode_t find_actor, void *opaque) -+static inline struct inode *ifind(struct super_block *sb, unsigned long ino, -+ struct list_head *head, -+ find_inode_t find_actor, void *opaque) - { -- struct list_head * head = inode_hashtable + hash(sb,ino); - struct inode * inode; - - spin_lock(&inode_lock); -@@ -986,6 +987,24 @@ - } - spin_unlock(&inode_lock); - -+ return NULL; -+} -+ -+struct inode *ilookup4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ return ifind(sb, ino, head, find_actor, opaque); -+} -+ -+struct inode *iget4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ struct inode *inode = ifind(sb, ino, head, find_actor, opaque); -+ if (inode) -+ return inode; -+ - /* - * get_new_inode() will do the right thing, re-trying the search - * in case it had to block at any point. -Index: linux-2.4.19-pre1/fs/Makefile -=================================================================== ---- linux-2.4.19-pre1.orig/fs/Makefile 2003-11-21 01:51:50.000000000 +0300 -+++ linux-2.4.19-pre1/fs/Makefile 2003-11-21 02:02:35.000000000 +0300 -@@ -7,7 +7,8 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o inode.o -+export-objs := filesystems.o open.o dcache.o buffer.o inode.o namei.o \ -+ file_table.o - mod-subdirs := nls - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ -Index: linux-2.4.19-pre1/fs/namei.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/namei.c 2003-11-20 19:16:40.000000000 +0300 -+++ linux-2.4.19-pre1/fs/namei.c 2003-11-21 02:02:35.000000000 +0300 -@@ -22,6 +22,7 @@ - #include <linux/dnotify.h> - #include <linux/smp_lock.h> - #include <linux/personality.h> -+#include <linux/module.h> - - #include <asm/namei.h> - #include <asm/uaccess.h> -@@ -100,6 +101,7 @@ - it->it_op_release(it); - - } -+EXPORT_SYMBOL(intent_release); - - /* In order to reduce some races, while at the same time doing additional - * checking and hopefully speeding things up, we copy filenames to the -@@ -878,7 +880,8 @@ - - - /* 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; -@@ -898,11 +901,16 @@ - } - this.hash = end_name_hash(hash); - -- return lookup_hash_it(&this, base, NULL); -+ return lookup_hash_it(&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() - * -Index: linux-2.4.19-pre1/fs/nfsd/export.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/nfsd/export.c 2001-10-04 09:57:36.000000000 +0400 -+++ linux-2.4.19-pre1/fs/nfsd/export.c 2003-11-21 02:13:10.000000000 +0300 -@@ -196,6 +196,11 @@ - goto out_unlock; - - inode = nd.dentry->d_inode; -+ if ((inode->i_sb->s_type->fs_flags & FS_NFSEXP_FSID) && -+ !(nxp->ex_flags & NFSEXP_FSID)) { -+ nxp->ex_dev = inode->i_sb->s_dev; -+ nxp->ex_flags |= NFSEXP_FSID; -+ } - err = -EINVAL; - if (inode->i_dev != dev || inode->i_ino != nxp->ex_ino) { - printk(KERN_DEBUG "exp_export: i_dev = %x, dev = %x\n", -Index: linux-2.4.19-pre1/fs/nfsd/nfsfh.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/nfsd/nfsfh.c 2001-10-04 09:59:22.000000000 +0400 -+++ linux-2.4.19-pre1/fs/nfsd/nfsfh.c 2003-11-21 02:14:53.000000000 +0300 -@@ -36,6 +36,15 @@ - int sequence; /* sequence counter */ - }; - -+static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) -+{ -+ if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); -+ else -+ return inode->i_op->lookup(inode, dentry); -+ -+} -+ - /* - * A rather strange filldir function to capture - * the name matching the specified inode number. -@@ -75,6 +84,8 @@ - int error; - struct file file; - struct nfsd_getdents_callback buffer; -+ struct lookup_intent it; -+ struct file *filp = NULL; - - error = -ENOTDIR; - if (!dir || !S_ISDIR(dir->i_mode)) -@@ -85,9 +96,37 @@ - /* - * Open the directory ... - */ -- error = init_private_file(&file, dentry, FMODE_READ); -- if (error) -+ if (dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if ((dentry->d_flags & DCACHE_NFSD_DISCONNECTED) && -+ (dentry->d_parent == dentry) ) { -+ it.it_op_release = NULL; -+ /* -+ * XXX Temporary Hack: Simulating init_private_file without -+ * f_op->open for disconnected dentry Since we don't have actual -+ * dentry->d_name to revalidate in revalidate_it() -+ */ -+ filp = &file; -+ memset(filp, 0, sizeof(*filp)); -+ filp->f_mode = FMODE_READ; -+ atomic_set(&filp->f_count, 1); -+ filp->f_dentry = dentry; -+ filp->f_uid = current->fsuid; -+ filp->f_gid = current->fsgid; -+ filp->f_op = dentry->d_inode->i_fop; -+ error = 0; -+ } else { -+ intent_init(&it, IT_OPEN, 0); -+ error = revalidate_it(dentry, &it); -+ if (error) -+ goto out; -+ error = init_private_file_it(&file, dentry, FMODE_READ, &it); -+ } -+ } else { -+ error = init_private_file_it(&file, dentry, FMODE_READ, NULL); -+ } -+ if (error) - goto out; -+ - error = -EINVAL; - if (!file.f_op->readdir) - goto out_close; -@@ -113,9 +152,13 @@ - } - - out_close: -- if (file.f_op->release) -+ if (file.f_op->release && !filp) - file.f_op->release(dir, &file); - out: -+ if (dentry->d_op && -+ dentry->d_op->d_revalidate_it && -+ it.it_op_release && !filp) -+ intent_release(&it); - return error; - } - -@@ -273,7 +316,7 @@ - /* I'm going to assume that if the returned dentry is different, then - * it is well connected. But nobody returns different dentrys do they? - */ -- pdentry = child->d_inode->i_op->lookup(child->d_inode, tdentry); -+ pdentry = lookup_it(child->d_inode, tdentry); - d_drop(tdentry); /* we never want ".." hashed */ - if (!pdentry && tdentry->d_inode == NULL) { - /* File system cannot find ".." ... sad but possible */ -@@ -304,6 +347,8 @@ - igrab(tdentry->d_inode); - pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; - } -+ if (child->d_op && child->d_op->d_revalidate_it) -+ pdentry->d_op = child->d_op; - } - if (pdentry == NULL) - pdentry = ERR_PTR(-ENOMEM); -@@ -461,6 +506,8 @@ - struct dentry *pdentry; - struct inode *parent; - -+ if (result->d_op && result->d_op->d_revalidate_it) -+ dentry->d_op = result->d_op; - pdentry = nfsd_findparent(dentry); - err = PTR_ERR(pdentry); - if (IS_ERR(pdentry)) -@@ -650,6 +697,11 @@ - - inode = dentry->d_inode; - -+ /* cache coherency for non-device filesystems */ -+ if (inode->i_op && inode->i_op->revalidate_it) { -+ inode->i_op->revalidate_it(dentry, NULL); -+ } -+ - /* Type check. The correct error return for type mismatches - * does not seem to be generally agreed upon. SunOS seems to - * use EISDIR if file isn't S_IFREG; a comment in the NFSv3 -@@ -880,8 +932,9 @@ - dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - out_uptodate: -- printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -- dentry->d_parent->d_name.name, dentry->d_name.name); -+ if(!dentry->d_parent->d_inode->i_op->mkdir_raw) -+ printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -+ dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - } - -Index: linux-2.4.19-pre1/fs/nfsd/vfs.c -=================================================================== ---- linux-2.4.19-pre1.orig/fs/nfsd/vfs.c 2001-12-21 20:41:55.000000000 +0300 -+++ linux-2.4.19-pre1/fs/nfsd/vfs.c 2003-11-21 02:15:47.000000000 +0300 -@@ -77,6 +77,128 @@ - static struct raparms * raparml; - static struct raparms * raparm_cache; - -+static int link_raw(struct dentry *dold, struct dentry *ddir, -+ struct dentry *dnew) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = dold }; -+ struct nameidata nd = { .dentry = ddir, .last = dnew->d_name }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->link_raw(&old_nd, &nd); -+ d_instantiate(dnew, dold->d_inode); -+ if(dold->d_inode->i_op && dold->d_inode->i_op->revalidate_it) -+ dold->d_inode->i_op->revalidate_it(dnew, NULL); -+ -+ return err; -+} -+ -+static int unlink_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->unlink_raw(&nd); -+ if (!err) -+ d_delete(rdentry); -+ -+ return err; -+} -+ -+static int rmdir_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->rmdir_raw(&nd); -+ if(!err) { -+ rdentry->d_inode->i_flags |= S_DEAD; -+ d_delete(rdentry); -+ } -+ -+ return err; -+} -+ -+static int symlink_raw(struct dentry *dentry, char *fname, int flen, -+ char *path) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->symlink_raw(&nd, path); -+ -+ return err; -+} -+ -+static int mkdir_raw(struct dentry *dentry, char *fname, int flen, int mode) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mkdir_raw(&nd, mode); -+ -+ return err; -+} -+ -+static int mknod_raw(struct dentry *dentry, char *fname, int flen, int mode, -+ dev_t dev) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mknod_raw(&nd, mode, dev); -+ -+ return err; -+} -+ -+static int rename_raw(struct dentry *fdentry, struct dentry *tdentry, -+ struct dentry *odentry, struct dentry *ndentry) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = fdentry, .last = odentry->d_name}; -+ struct nameidata new_nd = { .dentry = tdentry, .last = ndentry->d_name}; -+ struct inode_operations *op = old_nd.dentry->d_inode->i_op; -+ err = op->rename_raw(&old_nd, &new_nd); -+ d_move(odentry, ndentry); -+ -+ return err; -+} -+ -+static int setattr_raw(struct inode *inode, struct iattr *iap) -+{ -+ int err; -+ -+ iap->ia_valid |= ATTR_RAW; -+ err = inode->i_op->setattr_raw(inode, iap); -+ -+ return err; -+} -+ -+int revalidate_it(struct dentry *dentry, struct lookup_intent *it) -+{ -+ int err = 0; -+ -+ if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && -+ !d_invalidate(dentry)) { -+ dput(dentry); -+ err = -EINVAL; -+ dentry = NULL; -+ return err; -+ } -+ } -+ -+ return err; -+} -+ - /* - * Look up one component of a pathname. - * N.B. After this call _both_ fhp and resfh need an fh_put -@@ -303,7 +425,10 @@ - } - err = nfserr_notsync; - if (!check_guard || guardtime == inode->i_ctime) { -- err = notify_change(dentry, iap); -+ if ( dentry->d_inode->i_op && dentry->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dentry->d_inode, iap); -+ else -+ err = notify_change(dentry, iap); - err = nfserrno(err); - } - if (size_change) { -@@ -430,6 +555,7 @@ - { - struct dentry *dentry; - struct inode *inode; -+ struct lookup_intent it; - int err; - - /* If we get here, then the client has already done an "open", and (hopefully) -@@ -476,6 +602,14 @@ - filp->f_mode = FMODE_READ; - } - -+ intent_init(&it, IT_OPEN, (filp->f_flags & ~O_ACCMODE) | filp->f_mode); -+ -+ err = revalidate_it(dentry, &it); -+ if (err) -+ goto out_nfserr; -+ -+ filp->f_it = ⁢ -+ - err = 0; - if (filp->f_op && filp->f_op->open) { - err = filp->f_op->open(inode, filp); -@@ -490,7 +624,11 @@ - atomic_dec(&filp->f_count); - } - } -+ - out_nfserr: -+ if (it.it_op_release) -+ intent_release(&it); -+ - if (err) - err = nfserrno(err); - out: -@@ -812,7 +950,7 @@ - { - struct dentry *dentry, *dchild; - struct inode *dirp; -- int err; -+ int err, error = -EOPNOTSUPP; - - err = nfserr_perm; - if (!flen) -@@ -828,20 +966,44 @@ - dentry = fhp->fh_dentry; - dirp = dentry->d_inode; - -+ switch (type) { -+ case S_IFDIR: -+ if (dirp->i_op->mkdir_raw) -+ error = mkdir_raw(dentry, fname, flen, iap->ia_mode); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFIFO: -+ case S_IFSOCK: -+ case S_IFREG: -+ if (dirp->i_op->mknod_raw) { -+ if (type == S_IFREG) -+ rdev = 0; -+ error = mknod_raw(dentry, fname, flen, iap->ia_mode, rdev); -+ } -+ break; -+ default: -+ printk("nfsd: bad file type %o in nfsd_create\n", type); -+ } -+ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - /* - * Check whether the response file handle has been verified yet. - * If it has, the parent directory should already be locked. - */ -- if (!resfhp->fh_dentry) { -- /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ -- fh_lock(fhp); -+ if (!resfhp->fh_dentry || dirp->i_op->lookup_it) { -+ /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create -+ and nfsd_proc_create in case of lustre -+ */ -+ if (!resfhp->fh_dentry) -+ fh_lock(fhp); - dchild = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dchild); - if (IS_ERR(dchild)) - goto out_nfserr; -+ resfhp->fh_dentry = NULL; - err = fh_compose(resfhp, fhp->fh_export, dchild, fhp); - if (err) - goto out; -@@ -862,10 +1024,12 @@ - * Make sure the child dentry is still negative ... - */ - err = nfserr_exist; -- if (dchild->d_inode) { -- dprintk("nfsd_create: dentry %s/%s not negative!\n", -- dentry->d_name.name, dchild->d_name.name); -- goto out; -+ if ( error == -EOPNOTSUPP) { -+ if (dchild->d_inode) { -+ dprintk("nfsd_create: dentry %s/%s not negative!\n", -+ dentry->d_name.name, dchild->d_name.name); -+ goto out; -+ } - } - - if (!(iap->ia_valid & ATTR_MODE)) -@@ -878,16 +1042,19 @@ - err = nfserr_perm; - switch (type) { - case S_IFREG: -- err = vfs_create(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_create(dirp, dchild, iap->ia_mode); - break; - case S_IFDIR: -- err = vfs_mkdir(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mkdir(dirp, dchild, iap->ia_mode); - break; - case S_IFCHR: - case S_IFBLK: - case S_IFIFO: - case S_IFSOCK: -- err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); - break; - default: - printk("nfsd: bad file type %o in nfsd_create\n", type); -@@ -956,7 +1123,13 @@ - /* Get all the sanity checks out of the way before - * we lock the parent. */ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if (dirp->i_op->mknod_raw) { -+ err = mknod_raw(dentry, fname, flen, iap->ia_mode, 0); -+ if (err && err != -EOPNOTSUPP) -+ goto out; -+ } -+ -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - fh_lock(fhp); - -@@ -1007,6 +1180,8 @@ - case NFS3_CREATE_GUARDED: - err = nfserr_exist; - } -+ if(dirp->i_op->mknod_raw) -+ err = 0; - goto out; - } - -@@ -1113,7 +1288,7 @@ - struct iattr *iap) - { - struct dentry *dentry, *dnew; -- int err, cerr; -+ int err, cerr, error = -EOPNOTSUPP; - - err = nfserr_noent; - if (!flen || !plen) -@@ -1127,12 +1302,18 @@ - goto out; - fh_lock(fhp); - dentry = fhp->fh_dentry; -+ -+ if (dentry->d_inode->i_op->symlink_raw) -+ error = symlink_raw(dentry, fname, flen, path); -+ - dnew = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dnew); - if (IS_ERR(dnew)) - goto out_nfserr; - -- err = vfs_symlink(dentry->d_inode, dnew, path); -+ err = error; -+ if (err == -EOPNOTSUPP || !dentry->d_inode->i_op->symlink_raw) -+ err = vfs_symlink(dentry->d_inode, dnew, path); - if (!err) { - if (EX_ISSYNC(fhp->fh_export)) - nfsd_sync_dir(dentry); -@@ -1142,7 +1323,10 @@ - iap->ia_valid |= ATTR_CTIME; - iap->ia_mode = (iap->ia_mode&S_IALLUGO) - | S_IFLNK; -- err = notify_change(dnew, iap); -+ if (dnew->d_inode->i_op && dnew->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dnew->d_inode, iap); -+ else -+ err = notify_change(dnew, iap); - if (!err && EX_ISSYNC(fhp->fh_export)) - write_inode_now(dentry->d_inode, 1); - } -@@ -1200,7 +1384,10 @@ - dold = tfhp->fh_dentry; - dest = dold->d_inode; - -- err = vfs_link(dold, dirp, dnew); -+ if (dirp->i_op->link_raw) -+ err = link_raw(dold, ddir, dnew); -+ else -+ err = vfs_link(dold, dirp, dnew); - if (!err) { - if (EX_ISSYNC(ffhp->fh_export)) { - nfsd_sync_dir(ddir); -@@ -1285,7 +1472,10 @@ - err = nfserr_perm; - } else - #endif -- err = vfs_rename(fdir, odentry, tdir, ndentry); -+ if(fdir->i_op->rename_raw) -+ err = rename_raw(fdentry, tdentry, odentry, ndentry); -+ else -+ err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!err && EX_ISSYNC(tfhp->fh_export)) { - nfsd_sync_dir(tdentry); - nfsd_sync_dir(fdentry); -@@ -1306,7 +1496,7 @@ - fill_post_wcc(tfhp); - double_up(&tdir->i_sem, &fdir->i_sem); - ffhp->fh_locked = tfhp->fh_locked = 0; -- -+ - out: - return err; - } -@@ -1352,9 +1542,15 @@ - err = nfserr_perm; - } else - #endif -- err = vfs_unlink(dirp, rdentry); -+ if (dirp->i_op->unlink_raw) -+ err = unlink_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_unlink(dirp, rdentry); - } else { /* It's RMDIR */ -- err = vfs_rmdir(dirp, rdentry); -+ if (dirp->i_op->rmdir_raw) -+ err = rmdir_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_rmdir(dirp, rdentry); - } - - dput(rdentry); -Index: linux-2.4.19-pre1/include/linux/fs.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/fs.h 2003-11-21 02:00:20.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/fs.h 2003-11-21 02:02:36.000000000 +0300 -@@ -93,6 +93,9 @@ - #define FS_SINGLE 8 /* Filesystem that can have only one superblock */ - #define FS_NOMOUNT 16 /* Never mount from userland */ - #define FS_LITTER 32 /* Keeps the tree in dcache */ -+#define FS_NFSEXP_FSID 64 /* Use file system specific fsid for -+ * exporting non device filesystems. -+ */ - #define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon - * as nfs_rename() will be cleaned up - */ -@@ -1081,6 +1084,9 @@ - struct nameidata *nd, struct lookup_intent *it); - extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, - int flags, struct lookup_intent *it); -+extern int revalidate_it(struct dentry *dentry, struct lookup_intent *it); -+extern int init_private_file_it(struct file *, struct dentry *dentry, int mode, -+ struct lookup_intent *it); - extern int filp_close(struct file *, fl_owner_t id); - extern char * getname(const char *); - -@@ -1342,6 +1348,8 @@ - extern int follow_down(struct vfsmount **, struct dentry **); - extern int follow_up(struct vfsmount **, struct dentry **); - extern struct dentry * lookup_one_len(const char *, struct dentry *, int); -+extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, -+ struct lookup_intent *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); - #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) - #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) -@@ -1355,6 +1363,8 @@ - - typedef int (*find_inode_t)(struct inode *, unsigned long, void *); - extern struct inode * iget4(struct super_block *, unsigned long, find_inode_t, void *); -+extern struct inode * ilookup4(struct super_block *, unsigned long, -+ find_inode_t, void *); - static inline struct inode *iget(struct super_block *sb, unsigned long ino) - { - return iget4(sb, ino, NULL, NULL); -Index: linux-2.4.19-pre1/kernel/ksyms.c -=================================================================== ---- linux-2.4.19-pre1.orig/kernel/ksyms.c 2003-11-21 01:51:50.000000000 +0300 -+++ linux-2.4.19-pre1/kernel/ksyms.c 2003-11-21 02:02:36.000000000 +0300 -@@ -140,6 +140,7 @@ - EXPORT_SYMBOL(igrab); - EXPORT_SYMBOL(iunique); - EXPORT_SYMBOL(iget4); -+EXPORT_SYMBOL(ilookup4); - EXPORT_SYMBOL(iput); - EXPORT_SYMBOL(force_delete); - EXPORT_SYMBOL(follow_up); -@@ -150,6 +151,7 @@ - EXPORT_SYMBOL(path_release); - EXPORT_SYMBOL(__user_walk); - EXPORT_SYMBOL(lookup_one_len); -+EXPORT_SYMBOL(lookup_one_len_it); - EXPORT_SYMBOL(lookup_hash); - EXPORT_SYMBOL(sys_close); - EXPORT_SYMBOL(dcache_lock); diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch deleted file mode 100644 index 347b401390..0000000000 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-hp.patch +++ /dev/null @@ -1,741 +0,0 @@ - fs/Makefile | 3 - fs/file_table.c | 11 ++ - fs/inode.c | 23 ++++- - fs/namei.c | 12 ++ - fs/nfsd/export.c | 5 + - fs/nfsd/nfsfh.c | 65 +++++++++++++- - fs/nfsd/vfs.c | 240 ++++++++++++++++++++++++++++++++++++++++++++++++----- - include/linux/fs.h | 10 ++ - kernel/ksyms.c | 2 - 9 files changed, 337 insertions(+), 34 deletions(-) - ---- linux-2.4.20-hp4-pnnl13/fs/file_table.c~nfs_export_kernel-2.4.20-hp 2002-11-29 02:53:15.000000000 +0300 -+++ linux-2.4.20-hp4-pnnl13-alexey/fs/file_table.c 2003-10-08 10:54:08.000000000 +0400 -@@ -82,7 +82,8 @@ struct file * get_empty_filp(void) - * and call the open function (if any). The caller must verify that - * inode->i_fop is not NULL. - */ --int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+int init_private_file_it(struct file *filp, struct dentry *dentry, int mode, -+ struct lookup_intent *it) - { - memset(filp, 0, sizeof(*filp)); - filp->f_mode = mode; -@@ -90,12 +91,20 @@ int init_private_file(struct file *filp, - filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; -+ if (it) -+ filp->f_it = it; - filp->f_op = dentry->d_inode->i_fop; - if (filp->f_op->open) - return filp->f_op->open(dentry->d_inode, filp); - else - return 0; - } -+EXPORT_SYMBOL(init_private_file_it); -+ -+int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+{ -+ return init_private_file_it(filp, dentry, mode, NULL); -+} - - void fput(struct file * file) - { ---- linux-2.4.20-hp4-pnnl13/fs/inode.c~nfs_export_kernel-2.4.20-hp 2003-09-14 17:34:20.000000000 +0400 -+++ linux-2.4.20-hp4-pnnl13-alexey/fs/inode.c 2003-10-08 11:38:11.000000000 +0400 -@@ -964,9 +964,10 @@ struct inode *igrab(struct inode *inode) - return inode; - } - --struct inode *iget4_locked(struct super_block *sb, unsigned long ino, find_inode_t find_actor, void *opaque) -+struct inode *ifind(struct super_block *sb, unsigned long ino, -+ struct list_head *head, -+ find_inode_t find_actor, void *opaque) - { -- struct list_head * head = inode_hashtable + hash(sb,ino); - struct inode * inode; - - spin_lock(&inode_lock); -@@ -979,6 +980,24 @@ struct inode *iget4_locked(struct super_ - } - spin_unlock(&inode_lock); - -+ return NULL; -+} -+ -+struct inode *ilookup4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ return ifind(sb, ino, head, find_actor, opaque); -+} -+ -+struct inode *iget4_locked(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ struct inode *inode = ifind(sb, ino, head, find_actor, opaque); -+ if (inode) -+ return inode; -+ - /* - * get_new_inode() will do the right thing, re-trying the search - * in case it had to block at any point. ---- linux-2.4.20-hp4-pnnl13/fs/Makefile~nfs_export_kernel-2.4.20-hp 2003-09-14 17:34:22.000000000 +0400 -+++ linux-2.4.20-hp4-pnnl13-alexey/fs/Makefile 2003-10-08 10:54:37.000000000 +0400 -@@ -7,7 +7,8 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o inode.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o inode.o \ -+ namei.o file_table.o - mod-subdirs := nls xfs - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ ---- linux-2.4.20-hp4-pnnl13/fs/namei.c~nfs_export_kernel-2.4.20-hp 2003-09-14 17:34:20.000000000 +0400 -+++ linux-2.4.20-hp4-pnnl13-alexey/fs/namei.c 2003-10-08 10:54:08.000000000 +0400 -@@ -22,6 +22,7 @@ - #include <linux/dnotify.h> - #include <linux/smp_lock.h> - #include <linux/personality.h> -+#include <linux/module.h> - - #include <asm/namei.h> - #include <asm/uaccess.h> -@@ -100,6 +101,7 @@ void intent_release(struct lookup_intent - it->it_op_release(it); - - } -+EXPORT_SYMBOL(intent_release); - - /* In order to reduce some races, while at the same time doing additional - * checking and hopefully speeding things up, we copy filenames to the -@@ -917,7 +919,8 @@ struct dentry * lookup_hash(struct qstr - - - /* SMP-safe */ --struct dentry * lookup_one_len(const char * name, struct dentry * base, int len) -+struct dentry * lookup_one_len_it(const char * name, struct dentry * base, -+ int len, struct lookup_intent *it) - { - unsigned long hash; - struct qstr this; -@@ -937,11 +940,16 @@ struct dentry * lookup_one_len(const cha - } - this.hash = end_name_hash(hash); - -- return lookup_hash_it(&this, base, NULL); -+ return lookup_hash_it(&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() - * ---- linux-2.4.20-hp4-pnnl13/fs/nfsd/export.c~nfs_export_kernel-2.4.20-hp 2002-11-29 02:53:15.000000000 +0300 -+++ linux-2.4.20-hp4-pnnl13-alexey/fs/nfsd/export.c 2003-10-08 10:54:08.000000000 +0400 -@@ -222,6 +222,11 @@ exp_export(struct nfsctl_export *nxp) - inode = nd.dentry->d_inode; - dev = inode->i_dev; - ino = inode->i_ino; -+ if ((inode->i_sb->s_type->fs_flags & FS_NFSEXP_FSID) && -+ !(nxp->ex_flags & NFSEXP_FSID)) { -+ nxp->ex_dev = inode->i_sb->s_dev; -+ nxp->ex_flags |= NFSEXP_FSID; -+ } - err = -EINVAL; - - exp = exp_get(clp, dev, ino); ---- linux-2.4.20-hp4-pnnl13/fs/nfsd/nfsfh.c~nfs_export_kernel-2.4.20-hp 2002-11-29 02:53:15.000000000 +0300 -+++ linux-2.4.20-hp4-pnnl13-alexey/fs/nfsd/nfsfh.c 2003-10-08 10:54:08.000000000 +0400 -@@ -36,6 +36,15 @@ struct nfsd_getdents_callback { - int sequence; /* sequence counter */ - }; - -+static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) -+{ -+ if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); -+ else -+ return inode->i_op->lookup(inode, dentry); -+ -+} -+ - /* - * A rather strange filldir function to capture - * the name matching the specified inode number. -@@ -75,6 +84,8 @@ static int nfsd_get_name(struct dentry * - int error; - struct file file; - struct nfsd_getdents_callback buffer; -+ struct lookup_intent it; -+ struct file *filp = NULL; - - error = -ENOTDIR; - if (!dir || !S_ISDIR(dir->i_mode)) -@@ -85,9 +96,37 @@ static int nfsd_get_name(struct dentry * - /* - * Open the directory ... - */ -- error = init_private_file(&file, dentry, FMODE_READ); -- if (error) -+ if (dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if ((dentry->d_flags & DCACHE_NFSD_DISCONNECTED) && -+ (dentry->d_parent == dentry) ) { -+ it.it_op_release = NULL; -+ /* -+ * XXX Temporary Hack: Simulating init_private_file without -+ * f_op->open for disconnected dentry Since we don't have actual -+ * dentry->d_name to revalidate in revalidate_it() -+ */ -+ filp = &file; -+ memset(filp, 0, sizeof(*filp)); -+ filp->f_mode = FMODE_READ; -+ atomic_set(&filp->f_count, 1); -+ filp->f_dentry = dentry; -+ filp->f_uid = current->fsuid; -+ filp->f_gid = current->fsgid; -+ filp->f_op = dentry->d_inode->i_fop; -+ error = 0; -+ } else { -+ intent_init(&it, IT_OPEN, 0); -+ error = revalidate_it(dentry, &it); -+ if (error) -+ goto out; -+ error = init_private_file_it(&file, dentry, FMODE_READ, &it); -+ } -+ } else { -+ error = init_private_file_it(&file, dentry, FMODE_READ, NULL); -+ } -+ if (error) - goto out; -+ - error = -EINVAL; - if (!file.f_op->readdir) - goto out_close; -@@ -113,9 +152,13 @@ static int nfsd_get_name(struct dentry * - } - - out_close: -- if (file.f_op->release) -+ if (file.f_op->release && !filp) - file.f_op->release(dir, &file); - out: -+ if (dentry->d_op && -+ dentry->d_op->d_revalidate_it && -+ it.it_op_release && !filp) -+ intent_release(&it); - return error; - } - -@@ -274,7 +317,7 @@ struct dentry *nfsd_findparent(struct de - * it is well connected. But nobody returns different dentrys do they? - */ - down(&child->d_inode->i_sem); -- pdentry = child->d_inode->i_op->lookup(child->d_inode, tdentry); -+ pdentry = lookup_it(child->d_inode, tdentry); - up(&child->d_inode->i_sem); - d_drop(tdentry); /* we never want ".." hashed */ - if (!pdentry && tdentry->d_inode == NULL) { -@@ -306,6 +349,8 @@ struct dentry *nfsd_findparent(struct de - igrab(tdentry->d_inode); - pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; - } -+ if (child->d_op && child->d_op->d_revalidate_it) -+ pdentry->d_op = child->d_op; - } - if (pdentry == NULL) - pdentry = ERR_PTR(-ENOMEM); -@@ -463,6 +508,8 @@ find_fh_dentry(struct super_block *sb, _ - struct dentry *pdentry; - struct inode *parent; - -+ if (result->d_op && result->d_op->d_revalidate_it) -+ dentry->d_op = result->d_op; - pdentry = nfsd_findparent(dentry); - err = PTR_ERR(pdentry); - if (IS_ERR(pdentry)) -@@ -662,6 +709,11 @@ fh_verify(struct svc_rqst *rqstp, struct - - inode = dentry->d_inode; - -+ /* cache coherency for non-device filesystems */ -+ if (inode->i_op && inode->i_op->revalidate_it) { -+ inode->i_op->revalidate_it(dentry, NULL); -+ } -+ - /* Type check. The correct error return for type mismatches - * does not seem to be generally agreed upon. SunOS seems to - * use EISDIR if file isn't S_IFREG; a comment in the NFSv3 -@@ -900,8 +952,9 @@ out_negative: - dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - out_uptodate: -- printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -- dentry->d_parent->d_name.name, dentry->d_name.name); -+ if(!dentry->d_parent->d_inode->i_op->mkdir_raw) -+ printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -+ dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - } - ---- linux-2.4.20-hp4-pnnl13/fs/nfsd/vfs.c~nfs_export_kernel-2.4.20-hp 2002-11-29 02:53:15.000000000 +0300 -+++ linux-2.4.20-hp4-pnnl13-alexey/fs/nfsd/vfs.c 2003-10-08 10:54:08.000000000 +0400 -@@ -77,6 +77,128 @@ struct raparms { - static struct raparms * raparml; - static struct raparms * raparm_cache; - -+static int link_raw(struct dentry *dold, struct dentry *ddir, -+ struct dentry *dnew) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = dold }; -+ struct nameidata nd = { .dentry = ddir, .last = dnew->d_name }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->link_raw(&old_nd, &nd); -+ d_instantiate(dnew, dold->d_inode); -+ if(dold->d_inode->i_op && dold->d_inode->i_op->revalidate_it) -+ dold->d_inode->i_op->revalidate_it(dnew, NULL); -+ -+ return err; -+} -+ -+static int unlink_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->unlink_raw(&nd); -+ if (!err) -+ d_delete(rdentry); -+ -+ return err; -+} -+ -+static int rmdir_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->rmdir_raw(&nd); -+ if(!err) { -+ rdentry->d_inode->i_flags |= S_DEAD; -+ d_delete(rdentry); -+ } -+ -+ return err; -+} -+ -+static int symlink_raw(struct dentry *dentry, char *fname, int flen, -+ char *path) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->symlink_raw(&nd, path); -+ -+ return err; -+} -+ -+static int mkdir_raw(struct dentry *dentry, char *fname, int flen, int mode) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mkdir_raw(&nd, mode); -+ -+ return err; -+} -+ -+static int mknod_raw(struct dentry *dentry, char *fname, int flen, int mode, -+ dev_t dev) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mknod_raw(&nd, mode, dev); -+ -+ return err; -+} -+ -+static int rename_raw(struct dentry *fdentry, struct dentry *tdentry, -+ struct dentry *odentry, struct dentry *ndentry) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = fdentry, .last = odentry->d_name}; -+ struct nameidata new_nd = { .dentry = tdentry, .last = ndentry->d_name}; -+ struct inode_operations *op = old_nd.dentry->d_inode->i_op; -+ err = op->rename_raw(&old_nd, &new_nd); -+ d_move(odentry, ndentry); -+ -+ return err; -+} -+ -+static int setattr_raw(struct inode *inode, struct iattr *iap) -+{ -+ int err; -+ -+ iap->ia_valid |= ATTR_RAW; -+ err = inode->i_op->setattr_raw(inode, iap); -+ -+ return err; -+} -+ -+int revalidate_it(struct dentry *dentry, struct lookup_intent *it) -+{ -+ int err = 0; -+ -+ if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && -+ !d_invalidate(dentry)) { -+ dput(dentry); -+ err = -EINVAL; -+ dentry = NULL; -+ return err; -+ } -+ } -+ -+ return err; -+} -+ - /* - * Look up one component of a pathname. - * N.B. After this call _both_ fhp and resfh need an fh_put -@@ -300,7 +422,10 @@ nfsd_setattr(struct svc_rqst *rqstp, str - } - err = nfserr_notsync; - if (!check_guard || guardtime == inode->i_ctime) { -- err = notify_change(dentry, iap); -+ if ( dentry->d_inode->i_op && dentry->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dentry->d_inode, iap); -+ else -+ err = notify_change(dentry, iap); - err = nfserrno(err); - } - if (size_change) { -@@ -427,6 +552,7 @@ nfsd_open(struct svc_rqst *rqstp, struct - { - struct dentry *dentry; - struct inode *inode; -+ struct lookup_intent it; - int err; - - /* If we get here, then the client has already done an "open", and (hopefully) -@@ -473,6 +599,14 @@ nfsd_open(struct svc_rqst *rqstp, struct - filp->f_mode = FMODE_READ; - } - -+ intent_init(&it, IT_OPEN, (filp->f_flags & ~O_ACCMODE) | filp->f_mode); -+ -+ err = revalidate_it(dentry, &it); -+ if (err) -+ goto out_nfserr; -+ -+ filp->f_it = ⁢ -+ - err = 0; - if (filp->f_op && filp->f_op->open) { - err = filp->f_op->open(inode, filp); -@@ -487,7 +621,11 @@ nfsd_open(struct svc_rqst *rqstp, struct - atomic_dec(&filp->f_count); - } - } -+ - out_nfserr: -+ if (it.it_op_release) -+ intent_release(&it); -+ - if (err) - err = nfserrno(err); - out: -@@ -818,7 +956,7 @@ nfsd_create(struct svc_rqst *rqstp, stru - { - struct dentry *dentry, *dchild; - struct inode *dirp; -- int err; -+ int err, error = -EOPNOTSUPP; - - err = nfserr_perm; - if (!flen) -@@ -834,20 +972,44 @@ nfsd_create(struct svc_rqst *rqstp, stru - dentry = fhp->fh_dentry; - dirp = dentry->d_inode; - -+ switch (type) { -+ case S_IFDIR: -+ if (dirp->i_op->mkdir_raw) -+ error = mkdir_raw(dentry, fname, flen, iap->ia_mode); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFIFO: -+ case S_IFSOCK: -+ case S_IFREG: -+ if (dirp->i_op->mknod_raw) { -+ if (type == S_IFREG) -+ rdev = 0; -+ error = mknod_raw(dentry, fname, flen, iap->ia_mode, rdev); -+ } -+ break; -+ default: -+ printk("nfsd: bad file type %o in nfsd_create\n", type); -+ } -+ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - /* - * Check whether the response file handle has been verified yet. - * If it has, the parent directory should already be locked. - */ -- if (!resfhp->fh_dentry) { -- /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ -- fh_lock(fhp); -+ if (!resfhp->fh_dentry || dirp->i_op->lookup_it) { -+ /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create -+ and nfsd_proc_create in case of lustre -+ */ -+ if (!resfhp->fh_dentry) -+ fh_lock(fhp); - dchild = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dchild); - if (IS_ERR(dchild)) - goto out_nfserr; -+ resfhp->fh_dentry = NULL; - err = fh_compose(resfhp, fhp->fh_export, dchild, fhp); - if (err) - goto out; -@@ -868,10 +1030,12 @@ nfsd_create(struct svc_rqst *rqstp, stru - * Make sure the child dentry is still negative ... - */ - err = nfserr_exist; -- if (dchild->d_inode) { -- dprintk("nfsd_create: dentry %s/%s not negative!\n", -- dentry->d_name.name, dchild->d_name.name); -- goto out; -+ if ( error == -EOPNOTSUPP) { -+ if (dchild->d_inode) { -+ dprintk("nfsd_create: dentry %s/%s not negative!\n", -+ dentry->d_name.name, dchild->d_name.name); -+ goto out; -+ } - } - - if (!(iap->ia_valid & ATTR_MODE)) -@@ -884,16 +1048,19 @@ nfsd_create(struct svc_rqst *rqstp, stru - err = nfserr_perm; - switch (type) { - case S_IFREG: -- err = vfs_create(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_create(dirp, dchild, iap->ia_mode); - break; - case S_IFDIR: -- err = vfs_mkdir(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mkdir(dirp, dchild, iap->ia_mode); - break; - case S_IFCHR: - case S_IFBLK: - case S_IFIFO: - case S_IFSOCK: -- err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); - break; - default: - printk("nfsd: bad file type %o in nfsd_create\n", type); -@@ -962,7 +1129,13 @@ nfsd_create_v3(struct svc_rqst *rqstp, s - /* Get all the sanity checks out of the way before - * we lock the parent. */ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if (dirp->i_op->mknod_raw) { -+ err = mknod_raw(dentry, fname, flen, iap->ia_mode, 0); -+ if (err && err != -EOPNOTSUPP) -+ goto out; -+ } -+ -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - fh_lock(fhp); - -@@ -1013,6 +1186,8 @@ nfsd_create_v3(struct svc_rqst *rqstp, s - case NFS3_CREATE_GUARDED: - err = nfserr_exist; - } -+ if(dirp->i_op->mknod_raw) -+ err = 0; - goto out; - } - -@@ -1119,7 +1294,7 @@ nfsd_symlink(struct svc_rqst *rqstp, str - struct iattr *iap) - { - struct dentry *dentry, *dnew; -- int err, cerr; -+ int err, cerr, error = -EOPNOTSUPP; - - err = nfserr_noent; - if (!flen || !plen) -@@ -1133,12 +1308,18 @@ nfsd_symlink(struct svc_rqst *rqstp, str - goto out; - fh_lock(fhp); - dentry = fhp->fh_dentry; -+ -+ if (dentry->d_inode->i_op->symlink_raw) -+ error = symlink_raw(dentry, fname, flen, path); -+ - dnew = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dnew); - if (IS_ERR(dnew)) - goto out_nfserr; - -- err = vfs_symlink(dentry->d_inode, dnew, path); -+ err = error; -+ if (err == -EOPNOTSUPP || !dentry->d_inode->i_op->symlink_raw) -+ err = vfs_symlink(dentry->d_inode, dnew, path); - if (!err) { - if (EX_ISSYNC(fhp->fh_export)) - nfsd_sync_dir(dentry); -@@ -1148,7 +1329,10 @@ nfsd_symlink(struct svc_rqst *rqstp, str - iap->ia_valid |= ATTR_CTIME; - iap->ia_mode = (iap->ia_mode&S_IALLUGO) - | S_IFLNK; -- err = notify_change(dnew, iap); -+ if (dnew->d_inode->i_op && dnew->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dnew->d_inode, iap); -+ else -+ err = notify_change(dnew, iap); - if (!err && EX_ISSYNC(fhp->fh_export)) - write_inode_now(dentry->d_inode, 1); - } -@@ -1206,7 +1390,10 @@ nfsd_link(struct svc_rqst *rqstp, struct - dold = tfhp->fh_dentry; - dest = dold->d_inode; - -- err = vfs_link(dold, dirp, dnew); -+ if (dirp->i_op->link_raw) -+ err = link_raw(dold, ddir, dnew); -+ else -+ err = vfs_link(dold, dirp, dnew); - if (!err) { - if (EX_ISSYNC(ffhp->fh_export)) { - nfsd_sync_dir(ddir); -@@ -1291,7 +1478,10 @@ nfsd_rename(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_rename(fdir, odentry, tdir, ndentry); -+ if(fdir->i_op->rename_raw) -+ err = rename_raw(fdentry, tdentry, odentry, ndentry); -+ else -+ err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!err && EX_ISSYNC(tfhp->fh_export)) { - nfsd_sync_dir(tdentry); - nfsd_sync_dir(fdentry); -@@ -1312,7 +1502,7 @@ nfsd_rename(struct svc_rqst *rqstp, stru - fill_post_wcc(tfhp); - double_up(&tdir->i_sem, &fdir->i_sem); - ffhp->fh_locked = tfhp->fh_locked = 0; -- -+ - out: - return err; - } -@@ -1358,9 +1548,15 @@ nfsd_unlink(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_unlink(dirp, rdentry); -+ if (dirp->i_op->unlink_raw) -+ err = unlink_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_unlink(dirp, rdentry); - } else { /* It's RMDIR */ -- err = vfs_rmdir(dirp, rdentry); -+ if (dirp->i_op->rmdir_raw) -+ err = rmdir_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_rmdir(dirp, rdentry); - } - - dput(rdentry); ---- linux-2.4.20-hp4-pnnl13/include/linux/fs.h~nfs_export_kernel-2.4.20-hp 2003-09-14 17:34:24.000000000 +0400 -+++ linux-2.4.20-hp4-pnnl13-alexey/include/linux/fs.h 2003-10-08 11:39:07.000000000 +0400 -@@ -93,6 +93,9 @@ extern int leases_enable, dir_notify_ena - #define FS_SINGLE 8 /* Filesystem that can have only one superblock */ - #define FS_NOMOUNT 16 /* Never mount from userland */ - #define FS_LITTER 32 /* Keeps the tree in dcache */ -+#define FS_NFSEXP_FSID 64 /* Use file system specific fsid for -+ * exporting non device filesystems. -+ */ - #define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon - * as nfs_rename() will be cleaned up - */ -@@ -1116,6 +1119,9 @@ extern int open_namei_it(const char *fil - struct nameidata *nd, struct lookup_intent *it); - extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, - int flags, struct lookup_intent *it); -+extern int revalidate_it(struct dentry *dentry, struct lookup_intent *it); -+extern int init_private_file_it(struct file *, struct dentry *dentry, int mode, -+ struct lookup_intent *it); - extern int filp_close(struct file *, fl_owner_t id); - extern char * getname(const char *); - -@@ -1386,6 +1392,8 @@ extern void path_release(struct nameidat - extern int follow_down(struct vfsmount **, struct dentry **); - extern int follow_up(struct vfsmount **, struct dentry **); - extern struct dentry * lookup_one_len(const char *, struct dentry *, int); -+extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, -+ struct lookup_intent *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); - #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) - #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) -@@ -1403,6 +1411,8 @@ typedef int (*find_inode_t)(struct inode - - extern struct inode * iget4_locked(struct super_block *, unsigned long, - find_inode_t, void *); -+extern struct inode * ilookup4(struct super_block *, unsigned long, -+ find_inode_t, void *); - - static inline struct inode *iget4(struct super_block *sb, unsigned long ino, - find_inode_t find_actor, void *opaque) ---- linux-2.4.20-hp4-pnnl13/kernel/ksyms.c~nfs_export_kernel-2.4.20-hp 2003-09-14 17:34:22.000000000 +0400 -+++ linux-2.4.20-hp4-pnnl13-alexey/kernel/ksyms.c 2003-10-08 11:39:42.000000000 +0400 -@@ -169,6 +169,7 @@ EXPORT_SYMBOL(fget); - EXPORT_SYMBOL(igrab); - EXPORT_SYMBOL(iunique); - EXPORT_SYMBOL(iget4_locked); -+EXPORT_SYMBOL(ilookup4); - EXPORT_SYMBOL(unlock_new_inode); - EXPORT_SYMBOL(iput); - EXPORT_SYMBOL(inode_init_once); -@@ -181,6 +182,7 @@ EXPORT_SYMBOL(path_walk); - EXPORT_SYMBOL(path_release); - EXPORT_SYMBOL(__user_walk); - EXPORT_SYMBOL(lookup_one_len); -+EXPORT_SYMBOL(lookup_one_len_it); - EXPORT_SYMBOL(lookup_hash); - EXPORT_SYMBOL(sys_close); - EXPORT_SYMBOL(dcache_lock); - -_ diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-rh.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-rh.patch deleted file mode 100644 index 99a5fb67ef..0000000000 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20-rh.patch +++ /dev/null @@ -1,741 +0,0 @@ - fs/Makefile | 3 - fs/file_table.c | 11 ++ - fs/inode.c | 23 ++++- - fs/namei.c | 12 ++ - fs/nfsd/export.c | 5 + - fs/nfsd/nfsfh.c | 65 +++++++++++++- - fs/nfsd/vfs.c | 240 ++++++++++++++++++++++++++++++++++++++++++++++++----- - include/linux/fs.h | 10 ++ - kernel/ksyms.c | 2 - 9 files changed, 337 insertions(+), 34 deletions(-) - ---- linux-2.4.20-rh-20.9/fs/file_table.c~nfs_export_kernel-2.4.20-rh 2002-11-29 02:53:15.000000000 +0300 -+++ linux-2.4.20-rh-20.9-alexey/fs/file_table.c 2003-10-08 10:48:38.000000000 +0400 -@@ -82,7 +82,8 @@ struct file * get_empty_filp(void) - * and call the open function (if any). The caller must verify that - * inode->i_fop is not NULL. - */ --int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+int init_private_file_it(struct file *filp, struct dentry *dentry, int mode, -+ struct lookup_intent *it) - { - memset(filp, 0, sizeof(*filp)); - filp->f_mode = mode; -@@ -90,12 +91,20 @@ int init_private_file(struct file *filp, - filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; -+ if (it) -+ filp->f_it = it; - filp->f_op = dentry->d_inode->i_fop; - if (filp->f_op->open) - return filp->f_op->open(dentry->d_inode, filp); - else - return 0; - } -+EXPORT_SYMBOL(init_private_file_it); -+ -+int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+{ -+ return init_private_file_it(filp, dentry, mode, NULL); -+} - - void fput(struct file * file) - { ---- linux-2.4.20-rh-20.9/fs/inode.c~nfs_export_kernel-2.4.20-rh 2003-09-14 17:35:22.000000000 +0400 -+++ linux-2.4.20-rh-20.9-alexey/fs/inode.c 2003-10-08 10:48:38.000000000 +0400 -@@ -1063,9 +1063,10 @@ struct inode *igrab(struct inode *inode) - } - - --struct inode *iget4(struct super_block *sb, unsigned long ino, find_inode_t find_actor, void *opaque) -+static inline struct inode *ifind(struct super_block *sb, unsigned long ino, -+ struct list_head *head, -+ find_inode_t find_actor, void *opaque) - { -- struct list_head * head = inode_hashtable + hash(sb,ino); - struct inode * inode; - - spin_lock(&inode_lock); -@@ -1078,6 +1079,24 @@ struct inode *iget4(struct super_block * - } - spin_unlock(&inode_lock); - -+ return NULL; -+} -+ -+struct inode *ilookup4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ return ifind(sb, ino, head, find_actor, opaque); -+} -+ -+struct inode *iget4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ struct inode *inode = ifind(sb, ino, head, find_actor, opaque); -+ if (inode) -+ return inode; -+ - /* - * get_new_inode() will do the right thing, re-trying the search - * in case it had to block at any point. ---- linux-2.4.20-rh-20.9/fs/Makefile~nfs_export_kernel-2.4.20-rh 2003-09-14 17:35:20.000000000 +0400 -+++ linux-2.4.20-rh-20.9-alexey/fs/Makefile 2003-10-08 10:49:33.000000000 +0400 -@@ -9,7 +9,8 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o \ -+ namei.o file_table.o - mod-subdirs := nls - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ ---- linux-2.4.20-rh-20.9/fs/namei.c~nfs_export_kernel-2.4.20-rh 2003-09-14 17:35:22.000000000 +0400 -+++ linux-2.4.20-rh-20.9-alexey/fs/namei.c 2003-10-08 10:48:38.000000000 +0400 -@@ -22,6 +22,7 @@ - #include <linux/dnotify.h> - #include <linux/smp_lock.h> - #include <linux/personality.h> -+#include <linux/module.h> - - #include <asm/namei.h> - #include <asm/uaccess.h> -@@ -100,6 +101,7 @@ void intent_release(struct lookup_intent - it->it_op_release(it); - - } -+EXPORT_SYMBOL(intent_release); - - static void *lock_dir(struct inode *dir, struct qstr *name) - { -@@ -959,7 +961,8 @@ struct dentry * lookup_hash(struct qstr - - - /* SMP-safe */ --struct dentry * lookup_one_len(const char * name, struct dentry * base, int len) -+struct dentry * lookup_one_len_it(const char * name, struct dentry * base, -+ int len, struct lookup_intent *it) - { - unsigned long hash; - struct qstr this; -@@ -979,11 +982,16 @@ struct dentry * lookup_one_len(const cha - } - this.hash = end_name_hash(hash); - -- return lookup_hash_it(&this, base, NULL); -+ return lookup_hash_it(&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() - * ---- linux-2.4.20-rh-20.9/fs/nfsd/export.c~nfs_export_kernel-2.4.20-rh 2003-09-13 19:34:35.000000000 +0400 -+++ linux-2.4.20-rh-20.9-alexey/fs/nfsd/export.c 2003-10-08 10:48:38.000000000 +0400 -@@ -222,6 +222,11 @@ exp_export(struct nfsctl_export *nxp) - inode = nd.dentry->d_inode; - dev = inode->i_dev; - ino = inode->i_ino; -+ if ((inode->i_sb->s_type->fs_flags & FS_NFSEXP_FSID) && -+ !(nxp->ex_flags & NFSEXP_FSID)) { -+ nxp->ex_dev = inode->i_sb->s_dev; -+ nxp->ex_flags |= NFSEXP_FSID; -+ } - err = -EINVAL; - - exp = exp_get(clp, dev, ino); ---- linux-2.4.20-rh-20.9/fs/nfsd/nfsfh.c~nfs_export_kernel-2.4.20-rh 2003-09-13 19:34:15.000000000 +0400 -+++ linux-2.4.20-rh-20.9-alexey/fs/nfsd/nfsfh.c 2003-10-08 10:48:38.000000000 +0400 -@@ -36,6 +36,15 @@ struct nfsd_getdents_callback { - int sequence; /* sequence counter */ - }; - -+static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) -+{ -+ if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); -+ else -+ return inode->i_op->lookup(inode, dentry); -+ -+} -+ - /* - * A rather strange filldir function to capture - * the name matching the specified inode number. -@@ -75,6 +84,8 @@ static int nfsd_get_name(struct dentry * - int error; - struct file file; - struct nfsd_getdents_callback buffer; -+ struct lookup_intent it; -+ struct file *filp = NULL; - - error = -ENOTDIR; - if (!dir || !S_ISDIR(dir->i_mode)) -@@ -85,9 +96,37 @@ static int nfsd_get_name(struct dentry * - /* - * Open the directory ... - */ -- error = init_private_file(&file, dentry, FMODE_READ); -- if (error) -+ if (dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if ((dentry->d_flags & DCACHE_NFSD_DISCONNECTED) && -+ (dentry->d_parent == dentry) ) { -+ it.it_op_release = NULL; -+ /* -+ * XXX Temporary Hack: Simulating init_private_file without -+ * f_op->open for disconnected dentry Since we don't have actual -+ * dentry->d_name to revalidate in revalidate_it() -+ */ -+ filp = &file; -+ memset(filp, 0, sizeof(*filp)); -+ filp->f_mode = FMODE_READ; -+ atomic_set(&filp->f_count, 1); -+ filp->f_dentry = dentry; -+ filp->f_uid = current->fsuid; -+ filp->f_gid = current->fsgid; -+ filp->f_op = dentry->d_inode->i_fop; -+ error = 0; -+ } else { -+ intent_init(&it, IT_OPEN, 0); -+ error = revalidate_it(dentry, &it); -+ if (error) -+ goto out; -+ error = init_private_file_it(&file, dentry, FMODE_READ, &it); -+ } -+ } else { -+ error = init_private_file_it(&file, dentry, FMODE_READ, NULL); -+ } -+ if (error) - goto out; -+ - error = -EINVAL; - if (!file.f_op->readdir) - goto out_close; -@@ -113,9 +152,13 @@ static int nfsd_get_name(struct dentry * - } - - out_close: -- if (file.f_op->release) -+ if (file.f_op->release && !filp) - file.f_op->release(dir, &file); - out: -+ if (dentry->d_op && -+ dentry->d_op->d_revalidate_it && -+ it.it_op_release && !filp) -+ intent_release(&it); - return error; - } - -@@ -274,7 +317,7 @@ struct dentry *nfsd_findparent(struct de - * it is well connected. But nobody returns different dentrys do they? - */ - down(&child->d_inode->i_sem); -- pdentry = child->d_inode->i_op->lookup(child->d_inode, tdentry); -+ pdentry = lookup_it(child->d_inode, tdentry); - up(&child->d_inode->i_sem); - d_drop(tdentry); /* we never want ".." hashed */ - if (!pdentry && tdentry->d_inode == NULL) { -@@ -306,6 +349,8 @@ struct dentry *nfsd_findparent(struct de - igrab(tdentry->d_inode); - pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; - } -+ if (child->d_op && child->d_op->d_revalidate_it) -+ pdentry->d_op = child->d_op; - } - if (pdentry == NULL) - pdentry = ERR_PTR(-ENOMEM); -@@ -463,6 +508,8 @@ find_fh_dentry(struct super_block *sb, _ - struct dentry *pdentry; - struct inode *parent; - -+ if (result->d_op && result->d_op->d_revalidate_it) -+ dentry->d_op = result->d_op; - pdentry = nfsd_findparent(dentry); - err = PTR_ERR(pdentry); - if (IS_ERR(pdentry)) -@@ -669,6 +716,11 @@ fh_verify(struct svc_rqst *rqstp, struct - - inode = dentry->d_inode; - -+ /* cache coherency for non-device filesystems */ -+ if (inode->i_op && inode->i_op->revalidate_it) { -+ inode->i_op->revalidate_it(dentry, NULL); -+ } -+ - /* Type check. The correct error return for type mismatches - * does not seem to be generally agreed upon. SunOS seems to - * use EISDIR if file isn't S_IFREG; a comment in the NFSv3 -@@ -912,8 +964,9 @@ out_negative: - dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - out_uptodate: -- printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -- dentry->d_parent->d_name.name, dentry->d_name.name); -+ if(!dentry->d_parent->d_inode->i_op->mkdir_raw) -+ printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -+ dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - } - ---- linux-2.4.20-rh-20.9/fs/nfsd/vfs.c~nfs_export_kernel-2.4.20-rh 2003-09-13 19:34:15.000000000 +0400 -+++ linux-2.4.20-rh-20.9-alexey/fs/nfsd/vfs.c 2003-10-08 10:48:38.000000000 +0400 -@@ -77,6 +77,128 @@ struct raparms { - static struct raparms * raparml; - static struct raparms * raparm_cache; - -+static int link_raw(struct dentry *dold, struct dentry *ddir, -+ struct dentry *dnew) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = dold }; -+ struct nameidata nd = { .dentry = ddir, .last = dnew->d_name }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->link_raw(&old_nd, &nd); -+ d_instantiate(dnew, dold->d_inode); -+ if(dold->d_inode->i_op && dold->d_inode->i_op->revalidate_it) -+ dold->d_inode->i_op->revalidate_it(dnew, NULL); -+ -+ return err; -+} -+ -+static int unlink_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->unlink_raw(&nd); -+ if (!err) -+ d_delete(rdentry); -+ -+ return err; -+} -+ -+static int rmdir_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->rmdir_raw(&nd); -+ if(!err) { -+ rdentry->d_inode->i_flags |= S_DEAD; -+ d_delete(rdentry); -+ } -+ -+ return err; -+} -+ -+static int symlink_raw(struct dentry *dentry, char *fname, int flen, -+ char *path) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->symlink_raw(&nd, path); -+ -+ return err; -+} -+ -+static int mkdir_raw(struct dentry *dentry, char *fname, int flen, int mode) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mkdir_raw(&nd, mode); -+ -+ return err; -+} -+ -+static int mknod_raw(struct dentry *dentry, char *fname, int flen, int mode, -+ dev_t dev) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mknod_raw(&nd, mode, dev); -+ -+ return err; -+} -+ -+static int rename_raw(struct dentry *fdentry, struct dentry *tdentry, -+ struct dentry *odentry, struct dentry *ndentry) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = fdentry, .last = odentry->d_name}; -+ struct nameidata new_nd = { .dentry = tdentry, .last = ndentry->d_name}; -+ struct inode_operations *op = old_nd.dentry->d_inode->i_op; -+ err = op->rename_raw(&old_nd, &new_nd); -+ d_move(odentry, ndentry); -+ -+ return err; -+} -+ -+static int setattr_raw(struct inode *inode, struct iattr *iap) -+{ -+ int err; -+ -+ iap->ia_valid |= ATTR_RAW; -+ err = inode->i_op->setattr_raw(inode, iap); -+ -+ return err; -+} -+ -+int revalidate_it(struct dentry *dentry, struct lookup_intent *it) -+{ -+ int err = 0; -+ -+ if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && -+ !d_invalidate(dentry)) { -+ dput(dentry); -+ err = -EINVAL; -+ dentry = NULL; -+ return err; -+ } -+ } -+ -+ return err; -+} -+ - /* - * Look up one component of a pathname. - * N.B. After this call _both_ fhp and resfh need an fh_put -@@ -302,7 +424,10 @@ nfsd_setattr(struct svc_rqst *rqstp, str - } - err = nfserr_notsync; - if (!check_guard || guardtime == inode->i_ctime) { -- err = notify_change(dentry, iap); -+ if ( dentry->d_inode->i_op && dentry->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dentry->d_inode, iap); -+ else -+ err = notify_change(dentry, iap); - err = nfserrno(err); - } - if (size_change) { -@@ -429,6 +554,7 @@ nfsd_open(struct svc_rqst *rqstp, struct - { - struct dentry *dentry; - struct inode *inode; -+ struct lookup_intent it; - int err; - - /* If we get here, then the client has already done an "open", and (hopefully) -@@ -475,6 +601,14 @@ nfsd_open(struct svc_rqst *rqstp, struct - filp->f_mode = FMODE_READ; - } - -+ intent_init(&it, IT_OPEN, (filp->f_flags & ~O_ACCMODE) | filp->f_mode); -+ -+ err = revalidate_it(dentry, &it); -+ if (err) -+ goto out_nfserr; -+ -+ filp->f_it = ⁢ -+ - err = 0; - if (filp->f_op && filp->f_op->open) { - err = filp->f_op->open(inode, filp); -@@ -489,7 +623,11 @@ nfsd_open(struct svc_rqst *rqstp, struct - atomic_dec(&filp->f_count); - } - } -+ - out_nfserr: -+ if (it.it_op_release) -+ intent_release(&it); -+ - if (err) - err = nfserrno(err); - out: -@@ -820,7 +958,7 @@ nfsd_create(struct svc_rqst *rqstp, stru - { - struct dentry *dentry, *dchild; - struct inode *dirp; -- int err; -+ int err, error = -EOPNOTSUPP; - - err = nfserr_perm; - if (!flen) -@@ -836,20 +974,44 @@ nfsd_create(struct svc_rqst *rqstp, stru - dentry = fhp->fh_dentry; - dirp = dentry->d_inode; - -+ switch (type) { -+ case S_IFDIR: -+ if (dirp->i_op->mkdir_raw) -+ error = mkdir_raw(dentry, fname, flen, iap->ia_mode); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFIFO: -+ case S_IFSOCK: -+ case S_IFREG: -+ if (dirp->i_op->mknod_raw) { -+ if (type == S_IFREG) -+ rdev = 0; -+ error = mknod_raw(dentry, fname, flen, iap->ia_mode, rdev); -+ } -+ break; -+ default: -+ printk("nfsd: bad file type %o in nfsd_create\n", type); -+ } -+ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - /* - * Check whether the response file handle has been verified yet. - * If it has, the parent directory should already be locked. - */ -- if (!resfhp->fh_dentry) { -- /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ -- fh_lock(fhp); -+ if (!resfhp->fh_dentry || dirp->i_op->lookup_it) { -+ /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create -+ and nfsd_proc_create in case of lustre -+ */ -+ if (!resfhp->fh_dentry) -+ fh_lock(fhp); - dchild = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dchild); - if (IS_ERR(dchild)) - goto out_nfserr; -+ resfhp->fh_dentry = NULL; - err = fh_compose(resfhp, fhp->fh_export, dchild, fhp); - if (err) - goto out; -@@ -870,10 +1032,12 @@ nfsd_create(struct svc_rqst *rqstp, stru - * Make sure the child dentry is still negative ... - */ - err = nfserr_exist; -- if (dchild->d_inode) { -- dprintk("nfsd_create: dentry %s/%s not negative!\n", -- dentry->d_name.name, dchild->d_name.name); -- goto out; -+ if ( error == -EOPNOTSUPP) { -+ if (dchild->d_inode) { -+ dprintk("nfsd_create: dentry %s/%s not negative!\n", -+ dentry->d_name.name, dchild->d_name.name); -+ goto out; -+ } - } - - if (!(iap->ia_valid & ATTR_MODE)) -@@ -886,16 +1050,19 @@ nfsd_create(struct svc_rqst *rqstp, stru - err = nfserr_perm; - switch (type) { - case S_IFREG: -- err = vfs_create(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_create(dirp, dchild, iap->ia_mode); - break; - case S_IFDIR: -- err = vfs_mkdir(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mkdir(dirp, dchild, iap->ia_mode); - break; - case S_IFCHR: - case S_IFBLK: - case S_IFIFO: - case S_IFSOCK: -- err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); - break; - default: - printk("nfsd: bad file type %o in nfsd_create\n", type); -@@ -964,7 +1131,13 @@ nfsd_create_v3(struct svc_rqst *rqstp, s - /* Get all the sanity checks out of the way before - * we lock the parent. */ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if (dirp->i_op->mknod_raw) { -+ err = mknod_raw(dentry, fname, flen, iap->ia_mode, 0); -+ if (err && err != -EOPNOTSUPP) -+ goto out; -+ } -+ -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - fh_lock(fhp); - -@@ -1015,6 +1188,8 @@ nfsd_create_v3(struct svc_rqst *rqstp, s - case NFS3_CREATE_GUARDED: - err = nfserr_exist; - } -+ if(dirp->i_op->mknod_raw) -+ err = 0; - goto out; - } - -@@ -1121,7 +1296,7 @@ nfsd_symlink(struct svc_rqst *rqstp, str - struct iattr *iap) - { - struct dentry *dentry, *dnew; -- int err, cerr; -+ int err, cerr, error = -EOPNOTSUPP; - - err = nfserr_noent; - if (!flen || !plen) -@@ -1135,12 +1310,18 @@ nfsd_symlink(struct svc_rqst *rqstp, str - goto out; - fh_lock(fhp); - dentry = fhp->fh_dentry; -+ -+ if (dentry->d_inode->i_op->symlink_raw) -+ error = symlink_raw(dentry, fname, flen, path); -+ - dnew = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dnew); - if (IS_ERR(dnew)) - goto out_nfserr; - -- err = vfs_symlink(dentry->d_inode, dnew, path); -+ err = error; -+ if (err == -EOPNOTSUPP || !dentry->d_inode->i_op->symlink_raw) -+ err = vfs_symlink(dentry->d_inode, dnew, path); - if (!err) { - if (EX_ISSYNC(fhp->fh_export)) - nfsd_sync_dir(dentry); -@@ -1150,7 +1331,10 @@ nfsd_symlink(struct svc_rqst *rqstp, str - iap->ia_valid |= ATTR_CTIME; - iap->ia_mode = (iap->ia_mode&S_IALLUGO) - | S_IFLNK; -- err = notify_change(dnew, iap); -+ if (dnew->d_inode->i_op && dnew->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dnew->d_inode, iap); -+ else -+ err = notify_change(dnew, iap); - if (!err && EX_ISSYNC(fhp->fh_export)) - write_inode_now(dentry->d_inode, 1); - } -@@ -1208,7 +1392,10 @@ nfsd_link(struct svc_rqst *rqstp, struct - dold = tfhp->fh_dentry; - dest = dold->d_inode; - -- err = vfs_link(dold, dirp, dnew); -+ if (dirp->i_op->link_raw) -+ err = link_raw(dold, ddir, dnew); -+ else -+ err = vfs_link(dold, dirp, dnew); - if (!err) { - if (EX_ISSYNC(ffhp->fh_export)) { - nfsd_sync_dir(ddir); -@@ -1293,7 +1480,10 @@ nfsd_rename(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_rename(fdir, odentry, tdir, ndentry); -+ if(fdir->i_op->rename_raw) -+ err = rename_raw(fdentry, tdentry, odentry, ndentry); -+ else -+ err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!err && EX_ISSYNC(tfhp->fh_export)) { - nfsd_sync_dir(tdentry); - nfsd_sync_dir(fdentry); -@@ -1314,7 +1504,7 @@ nfsd_rename(struct svc_rqst *rqstp, stru - fill_post_wcc(tfhp); - double_up(&tdir->i_sem, &fdir->i_sem); - ffhp->fh_locked = tfhp->fh_locked = 0; -- -+ - out: - return err; - } -@@ -1360,9 +1550,15 @@ nfsd_unlink(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_unlink(dirp, rdentry); -+ if (dirp->i_op->unlink_raw) -+ err = unlink_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_unlink(dirp, rdentry); - } else { /* It's RMDIR */ -- err = vfs_rmdir(dirp, rdentry); -+ if (dirp->i_op->rmdir_raw) -+ err = rmdir_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_rmdir(dirp, rdentry); - } - - dput(rdentry); ---- linux-2.4.20-rh-20.9/include/linux/fs.h~nfs_export_kernel-2.4.20-rh 2003-09-14 17:35:22.000000000 +0400 -+++ linux-2.4.20-rh-20.9-alexey/include/linux/fs.h 2003-10-08 10:48:38.000000000 +0400 -@@ -94,6 +94,9 @@ extern int leases_enable, dir_notify_ena - #define FS_SINGLE 8 /* Filesystem that can have only one superblock */ - #define FS_NOMOUNT 16 /* Never mount from userland */ - #define FS_LITTER 32 /* Keeps the tree in dcache */ -+#define FS_NFSEXP_FSID 64 /* Use file system specific fsid for -+ * exporting non device filesystems. -+ */ - #define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon - * as nfs_rename() will be cleaned up - */ -@@ -1124,6 +1127,9 @@ extern int open_namei_it(const char *fil - struct nameidata *nd, struct lookup_intent *it); - extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, - int flags, struct lookup_intent *it); -+extern int revalidate_it(struct dentry *dentry, struct lookup_intent *it); -+extern int init_private_file_it(struct file *, struct dentry *dentry, int mode, -+ struct lookup_intent *it); - extern int filp_close(struct file *, fl_owner_t id); - extern char * getname(const char *); - -@@ -1423,6 +1429,8 @@ extern void path_release(struct nameidat - extern int follow_down(struct vfsmount **, struct dentry **); - extern int follow_up(struct vfsmount **, struct dentry **); - extern struct dentry * lookup_one_len(const char *, struct dentry *, int); -+extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, -+ struct lookup_intent *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); - #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) - #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) -@@ -1439,6 +1447,8 @@ extern ino_t iunique(struct super_block - - typedef int (*find_inode_t)(struct inode *, unsigned long, void *); - extern struct inode * iget4(struct super_block *, unsigned long, find_inode_t, void *); -+extern struct inode * ilookup4(struct super_block *, unsigned long, -+ find_inode_t, void *); - static inline struct inode *iget(struct super_block *sb, unsigned long ino) - { - return iget4(sb, ino, NULL, NULL); ---- linux-2.4.20-rh-20.9/kernel/ksyms.c~nfs_export_kernel-2.4.20-rh 2003-09-14 17:35:20.000000000 +0400 -+++ linux-2.4.20-rh-20.9-alexey/kernel/ksyms.c 2003-10-08 10:48:38.000000000 +0400 -@@ -164,6 +164,7 @@ EXPORT_SYMBOL(fget); - EXPORT_SYMBOL(igrab); - EXPORT_SYMBOL(iunique); - EXPORT_SYMBOL(iget4); -+EXPORT_SYMBOL(ilookup4); - EXPORT_SYMBOL(iput); - EXPORT_SYMBOL(inode_init_once); - EXPORT_SYMBOL(force_delete); -@@ -175,6 +176,7 @@ EXPORT_SYMBOL(path_walk); - EXPORT_SYMBOL(path_release); - EXPORT_SYMBOL(__user_walk); - EXPORT_SYMBOL(lookup_one_len); -+EXPORT_SYMBOL(lookup_one_len_it); - EXPORT_SYMBOL(lookup_hash); - EXPORT_SYMBOL(sys_close); - EXPORT_SYMBOL(sys_read); - -_ diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20.patch deleted file mode 100644 index 4c67428244..0000000000 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.20.patch +++ /dev/null @@ -1,737 +0,0 @@ -diff -uprN linux/fs/Makefile linux-2.4.20/fs/Makefile ---- linux/fs/Makefile Sun Oct 5 21:52:51 2003 -+++ linux-2.4.20/fs/Makefile Sun Oct 5 21:47:45 2003 -@@ -7,7 +7,8 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o inode.o -+export-objs := filesystems.o open.o dcache.o buffer.o inode.o namei.o \ -+ file_table.o - mod-subdirs := nls - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ -diff -uprN linux/fs/file_table.c linux-2.4.20/fs/file_table.c ---- linux/fs/file_table.c Fri Nov 29 05:23:15 2002 -+++ linux-2.4.20/fs/file_table.c Sun Oct 5 21:47:45 2003 -@@ -82,7 +82,8 @@ struct file * get_empty_filp(void) - * and call the open function (if any). The caller must verify that - * inode->i_fop is not NULL. - */ --int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+int init_private_file_it(struct file *filp, struct dentry *dentry, int mode, -+ struct lookup_intent *it) - { - memset(filp, 0, sizeof(*filp)); - filp->f_mode = mode; -@@ -90,12 +91,20 @@ int init_private_file(struct file *filp, - filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; -+ if (it) -+ filp->f_it = it; - filp->f_op = dentry->d_inode->i_fop; - if (filp->f_op->open) - return filp->f_op->open(dentry->d_inode, filp); - else - return 0; - } -+EXPORT_SYMBOL(init_private_file_it); -+ -+int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+{ -+ return init_private_file_it(filp, dentry, mode, NULL); -+} - - void fput(struct file * file) - { -diff -uprN linux/fs/inode.c linux-2.4.20/fs/inode.c ---- linux/fs/inode.c Sun Oct 5 21:52:49 2003 -+++ linux-2.4.20/fs/inode.c Sun Oct 5 21:47:45 2003 -@@ -970,9 +970,10 @@ struct inode *igrab(struct inode *inode) - } - - --struct inode *iget4(struct super_block *sb, unsigned long ino, find_inode_t find_actor, void *opaque) -+static inline struct inode *ifind(struct super_block *sb, unsigned long ino, -+ struct list_head *head, -+ find_inode_t find_actor, void *opaque) - { -- struct list_head * head = inode_hashtable + hash(sb,ino); - struct inode * inode; - - spin_lock(&inode_lock); -@@ -985,6 +986,24 @@ struct inode *iget4(struct super_block * - } - spin_unlock(&inode_lock); - -+ return NULL; -+} -+ -+struct inode *ilookup4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ return ifind(sb, ino, head, find_actor, opaque); -+} -+ -+struct inode *iget4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ struct inode *inode = ifind(sb, ino, head, find_actor, opaque); -+ if (inode) -+ return inode; -+ - /* - * get_new_inode() will do the right thing, re-trying the search - * in case it had to block at any point. -diff -uprN linux/fs/namei.c linux-2.4.20/fs/namei.c ---- linux/fs/namei.c Sun Oct 5 21:52:48 2003 -+++ linux-2.4.20/fs/namei.c Sun Oct 5 21:47:45 2003 -@@ -22,6 +22,7 @@ - #include <linux/dnotify.h> - #include <linux/smp_lock.h> - #include <linux/personality.h> -+#include <linux/module.h> - - #include <asm/namei.h> - #include <asm/uaccess.h> -@@ -100,6 +101,7 @@ void intent_release(struct lookup_intent - it->it_op_release(it); - - } -+EXPORT_SYMBOL(intent_release); - - /* In order to reduce some races, while at the same time doing additional - * checking and hopefully speeding things up, we copy filenames to the -@@ -900,7 +902,8 @@ struct dentry * lookup_hash(struct qstr - - - /* SMP-safe */ --struct dentry * lookup_one_len(const char * name, struct dentry * base, int len) -+struct dentry * lookup_one_len_it(const char * name, struct dentry * base, -+ int len, struct lookup_intent *it) - { - unsigned long hash; - struct qstr this; -@@ -920,11 +923,16 @@ struct dentry * lookup_one_len(const cha - } - this.hash = end_name_hash(hash); - -- return lookup_hash_it(&this, base, NULL, NULL); -+ return lookup_hash_it(&this, base, NULL, 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() - * -diff -uprN linux/fs/nfsd/export.c linux-2.4.20/fs/nfsd/export.c ---- linux/fs/nfsd/export.c Fri Nov 29 05:23:15 2002 -+++ linux-2.4.20/fs/nfsd/export.c Sun Oct 5 22:25:20 2003 -@@ -222,6 +222,11 @@ exp_export(struct nfsctl_export *nxp) - inode = nd.dentry->d_inode; - dev = inode->i_dev; - ino = inode->i_ino; -+ if ((inode->i_sb->s_type->fs_flags & FS_NFSEXP_FSID) && -+ !(nxp->ex_flags & NFSEXP_FSID)) { -+ nxp->ex_dev = inode->i_sb->s_dev; -+ nxp->ex_flags |= NFSEXP_FSID; -+ } - err = -EINVAL; - - exp = exp_get(clp, dev, ino); -diff -uprN linux/fs/nfsd/nfsfh.c linux-2.4.20/fs/nfsd/nfsfh.c ---- linux/fs/nfsd/nfsfh.c Fri Nov 29 05:23:15 2002 -+++ linux-2.4.20/fs/nfsd/nfsfh.c Sun Oct 5 21:47:45 2003 -@@ -36,6 +36,15 @@ struct nfsd_getdents_callback { - int sequence; /* sequence counter */ - }; - -+static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) -+{ -+ if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); -+ else -+ return inode->i_op->lookup(inode, dentry); -+ -+} -+ - /* - * A rather strange filldir function to capture - * the name matching the specified inode number. -@@ -75,6 +84,8 @@ static int nfsd_get_name(struct dentry * - int error; - struct file file; - struct nfsd_getdents_callback buffer; -+ struct lookup_intent it; -+ struct file *filp = NULL; - - error = -ENOTDIR; - if (!dir || !S_ISDIR(dir->i_mode)) -@@ -85,9 +96,37 @@ static int nfsd_get_name(struct dentry * - /* - * Open the directory ... - */ -- error = init_private_file(&file, dentry, FMODE_READ); -- if (error) -+ if (dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if ((dentry->d_flags & DCACHE_NFSD_DISCONNECTED) && -+ (dentry->d_parent == dentry) ) { -+ it.it_op_release = NULL; -+ /* -+ * XXX Temporary Hack: Simulating init_private_file without -+ * f_op->open for disconnected dentry Since we don't have actual -+ * dentry->d_name to revalidate in revalidate_it() -+ */ -+ filp = &file; -+ memset(filp, 0, sizeof(*filp)); -+ filp->f_mode = FMODE_READ; -+ atomic_set(&filp->f_count, 1); -+ filp->f_dentry = dentry; -+ filp->f_uid = current->fsuid; -+ filp->f_gid = current->fsgid; -+ filp->f_op = dentry->d_inode->i_fop; -+ error = 0; -+ } else { -+ intent_init(&it, IT_OPEN, 0); -+ error = revalidate_it(dentry, &it); -+ if (error) -+ goto out; -+ error = init_private_file_it(&file, dentry, FMODE_READ, &it); -+ } -+ } else { -+ error = init_private_file_it(&file, dentry, FMODE_READ, NULL); -+ } -+ if (error) - goto out; -+ - error = -EINVAL; - if (!file.f_op->readdir) - goto out_close; -@@ -113,9 +152,13 @@ static int nfsd_get_name(struct dentry * - } - - out_close: -- if (file.f_op->release) -+ if (file.f_op->release && !filp) - file.f_op->release(dir, &file); - out: -+ if (dentry->d_op && -+ dentry->d_op->d_revalidate_it && -+ it.it_op_release && !filp) -+ intent_release(&it); - return error; - } - -@@ -274,7 +317,7 @@ struct dentry *nfsd_findparent(struct de - * it is well connected. But nobody returns different dentrys do they? - */ - down(&child->d_inode->i_sem); -- pdentry = child->d_inode->i_op->lookup(child->d_inode, tdentry); -+ pdentry = lookup_it(child->d_inode, tdentry); - up(&child->d_inode->i_sem); - d_drop(tdentry); /* we never want ".." hashed */ - if (!pdentry && tdentry->d_inode == NULL) { -@@ -306,6 +349,8 @@ struct dentry *nfsd_findparent(struct de - igrab(tdentry->d_inode); - pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; - } -+ if (child->d_op && child->d_op->d_revalidate_it) -+ pdentry->d_op = child->d_op; - } - if (pdentry == NULL) - pdentry = ERR_PTR(-ENOMEM); -@@ -463,6 +508,8 @@ find_fh_dentry(struct super_block *sb, _ - struct dentry *pdentry; - struct inode *parent; - -+ if (result->d_op && result->d_op->d_revalidate_it) -+ dentry->d_op = result->d_op; - pdentry = nfsd_findparent(dentry); - err = PTR_ERR(pdentry); - if (IS_ERR(pdentry)) -@@ -662,6 +709,11 @@ fh_verify(struct svc_rqst *rqstp, struct - - inode = dentry->d_inode; - -+ /* cache coherency for non-device filesystems */ -+ if (inode->i_op && inode->i_op->revalidate_it) { -+ inode->i_op->revalidate_it(dentry, NULL); -+ } -+ - /* Type check. The correct error return for type mismatches - * does not seem to be generally agreed upon. SunOS seems to - * use EISDIR if file isn't S_IFREG; a comment in the NFSv3 -@@ -900,8 +952,9 @@ out_negative: - dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - out_uptodate: -- printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -- dentry->d_parent->d_name.name, dentry->d_name.name); -+ if(!dentry->d_parent->d_inode->i_op->mkdir_raw) -+ printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -+ dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - } - -diff -uprN linux/fs/nfsd/vfs.c linux-2.4.20/fs/nfsd/vfs.c ---- linux/fs/nfsd/vfs.c Fri Nov 29 05:23:15 2002 -+++ linux-2.4.20/fs/nfsd/vfs.c Sun Oct 5 21:47:45 2003 -@@ -77,6 +77,128 @@ struct raparms { - static struct raparms * raparml; - static struct raparms * raparm_cache; - -+static int link_raw(struct dentry *dold, struct dentry *ddir, -+ struct dentry *dnew) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = dold }; -+ struct nameidata nd = { .dentry = ddir, .last = dnew->d_name }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->link_raw(&old_nd, &nd); -+ d_instantiate(dnew, dold->d_inode); -+ if(dold->d_inode->i_op && dold->d_inode->i_op->revalidate_it) -+ dold->d_inode->i_op->revalidate_it(dnew, NULL); -+ -+ return err; -+} -+ -+static int unlink_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->unlink_raw(&nd); -+ if (!err) -+ d_delete(rdentry); -+ -+ return err; -+} -+ -+static int rmdir_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->rmdir_raw(&nd); -+ if(!err) { -+ rdentry->d_inode->i_flags |= S_DEAD; -+ d_delete(rdentry); -+ } -+ -+ return err; -+} -+ -+static int symlink_raw(struct dentry *dentry, char *fname, int flen, -+ char *path) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->symlink_raw(&nd, path); -+ -+ return err; -+} -+ -+static int mkdir_raw(struct dentry *dentry, char *fname, int flen, int mode) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mkdir_raw(&nd, mode); -+ -+ return err; -+} -+ -+static int mknod_raw(struct dentry *dentry, char *fname, int flen, int mode, -+ dev_t dev) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mknod_raw(&nd, mode, dev); -+ -+ return err; -+} -+ -+static int rename_raw(struct dentry *fdentry, struct dentry *tdentry, -+ struct dentry *odentry, struct dentry *ndentry) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = fdentry, .last = odentry->d_name}; -+ struct nameidata new_nd = { .dentry = tdentry, .last = ndentry->d_name}; -+ struct inode_operations *op = old_nd.dentry->d_inode->i_op; -+ err = op->rename_raw(&old_nd, &new_nd); -+ d_move(odentry, ndentry); -+ -+ return err; -+} -+ -+static int setattr_raw(struct inode *inode, struct iattr *iap) -+{ -+ int err; -+ -+ iap->ia_valid |= ATTR_RAW; -+ err = inode->i_op->setattr_raw(inode, iap); -+ -+ return err; -+} -+ -+int revalidate_it(struct dentry *dentry, struct lookup_intent *it) -+{ -+ int err = 0; -+ -+ if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && -+ !d_invalidate(dentry)) { -+ dput(dentry); -+ err = -EINVAL; -+ dentry = NULL; -+ return err; -+ } -+ } -+ -+ return err; -+} -+ - /* - * Look up one component of a pathname. - * N.B. After this call _both_ fhp and resfh need an fh_put -@@ -300,7 +422,10 @@ nfsd_setattr(struct svc_rqst *rqstp, str - } - err = nfserr_notsync; - if (!check_guard || guardtime == inode->i_ctime) { -- err = notify_change(dentry, iap); -+ if ( dentry->d_inode->i_op && dentry->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dentry->d_inode, iap); -+ else -+ err = notify_change(dentry, iap); - err = nfserrno(err); - } - if (size_change) { -@@ -427,6 +552,7 @@ nfsd_open(struct svc_rqst *rqstp, struct - { - struct dentry *dentry; - struct inode *inode; -+ struct lookup_intent it; - int err; - - /* If we get here, then the client has already done an "open", and (hopefully) -@@ -473,6 +599,14 @@ nfsd_open(struct svc_rqst *rqstp, struct - filp->f_mode = FMODE_READ; - } - -+ intent_init(&it, IT_OPEN, (filp->f_flags & ~O_ACCMODE) | filp->f_mode); -+ -+ err = revalidate_it(dentry, &it); -+ if (err) -+ goto out_nfserr; -+ -+ filp->f_it = ⁢ -+ - err = 0; - if (filp->f_op && filp->f_op->open) { - err = filp->f_op->open(inode, filp); -@@ -487,7 +621,11 @@ nfsd_open(struct svc_rqst *rqstp, struct - atomic_dec(&filp->f_count); - } - } -+ - out_nfserr: -+ if (it.it_op_release) -+ intent_release(&it); -+ - if (err) - err = nfserrno(err); - out: -@@ -818,7 +956,7 @@ nfsd_create(struct svc_rqst *rqstp, stru - { - struct dentry *dentry, *dchild; - struct inode *dirp; -- int err; -+ int err, error = -EOPNOTSUPP; - - err = nfserr_perm; - if (!flen) -@@ -834,20 +972,44 @@ nfsd_create(struct svc_rqst *rqstp, stru - dentry = fhp->fh_dentry; - dirp = dentry->d_inode; - -+ switch (type) { -+ case S_IFDIR: -+ if (dirp->i_op->mkdir_raw) -+ error = mkdir_raw(dentry, fname, flen, iap->ia_mode); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFIFO: -+ case S_IFSOCK: -+ case S_IFREG: -+ if (dirp->i_op->mknod_raw) { -+ if (type == S_IFREG) -+ rdev = 0; -+ error = mknod_raw(dentry, fname, flen, iap->ia_mode, rdev); -+ } -+ break; -+ default: -+ printk("nfsd: bad file type %o in nfsd_create\n", type); -+ } -+ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - /* - * Check whether the response file handle has been verified yet. - * If it has, the parent directory should already be locked. - */ -- if (!resfhp->fh_dentry) { -- /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ -- fh_lock(fhp); -+ if (!resfhp->fh_dentry || dirp->i_op->lookup_it) { -+ /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create -+ and nfsd_proc_create in case of lustre -+ */ -+ if (!resfhp->fh_dentry) -+ fh_lock(fhp); - dchild = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dchild); - if (IS_ERR(dchild)) - goto out_nfserr; -+ resfhp->fh_dentry = NULL; - err = fh_compose(resfhp, fhp->fh_export, dchild, fhp); - if (err) - goto out; -@@ -868,10 +1030,12 @@ nfsd_create(struct svc_rqst *rqstp, stru - * Make sure the child dentry is still negative ... - */ - err = nfserr_exist; -- if (dchild->d_inode) { -- dprintk("nfsd_create: dentry %s/%s not negative!\n", -- dentry->d_name.name, dchild->d_name.name); -- goto out; -+ if ( error == -EOPNOTSUPP) { -+ if (dchild->d_inode) { -+ dprintk("nfsd_create: dentry %s/%s not negative!\n", -+ dentry->d_name.name, dchild->d_name.name); -+ goto out; -+ } - } - - if (!(iap->ia_valid & ATTR_MODE)) -@@ -884,16 +1048,19 @@ nfsd_create(struct svc_rqst *rqstp, stru - err = nfserr_perm; - switch (type) { - case S_IFREG: -- err = vfs_create(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_create(dirp, dchild, iap->ia_mode); - break; - case S_IFDIR: -- err = vfs_mkdir(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mkdir(dirp, dchild, iap->ia_mode); - break; - case S_IFCHR: - case S_IFBLK: - case S_IFIFO: - case S_IFSOCK: -- err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); - break; - default: - printk("nfsd: bad file type %o in nfsd_create\n", type); -@@ -962,7 +1129,13 @@ nfsd_create_v3(struct svc_rqst *rqstp, s - /* Get all the sanity checks out of the way before - * we lock the parent. */ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if (dirp->i_op->mknod_raw) { -+ err = mknod_raw(dentry, fname, flen, iap->ia_mode, 0); -+ if (err && err != -EOPNOTSUPP) -+ goto out; -+ } -+ -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - fh_lock(fhp); - -@@ -1013,6 +1186,8 @@ nfsd_create_v3(struct svc_rqst *rqstp, s - case NFS3_CREATE_GUARDED: - err = nfserr_exist; - } -+ if(dirp->i_op->mknod_raw) -+ err = 0; - goto out; - } - -@@ -1119,7 +1294,7 @@ nfsd_symlink(struct svc_rqst *rqstp, str - struct iattr *iap) - { - struct dentry *dentry, *dnew; -- int err, cerr; -+ int err, cerr, error = -EOPNOTSUPP; - - err = nfserr_noent; - if (!flen || !plen) -@@ -1133,12 +1308,18 @@ nfsd_symlink(struct svc_rqst *rqstp, str - goto out; - fh_lock(fhp); - dentry = fhp->fh_dentry; -+ -+ if (dentry->d_inode->i_op->symlink_raw) -+ error = symlink_raw(dentry, fname, flen, path); -+ - dnew = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dnew); - if (IS_ERR(dnew)) - goto out_nfserr; - -- err = vfs_symlink(dentry->d_inode, dnew, path); -+ err = error; -+ if (err == -EOPNOTSUPP || !dentry->d_inode->i_op->symlink_raw) -+ err = vfs_symlink(dentry->d_inode, dnew, path); - if (!err) { - if (EX_ISSYNC(fhp->fh_export)) - nfsd_sync_dir(dentry); -@@ -1148,7 +1329,10 @@ nfsd_symlink(struct svc_rqst *rqstp, str - iap->ia_valid |= ATTR_CTIME; - iap->ia_mode = (iap->ia_mode&S_IALLUGO) - | S_IFLNK; -- err = notify_change(dnew, iap); -+ if (dnew->d_inode->i_op && dnew->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dnew->d_inode, iap); -+ else -+ err = notify_change(dnew, iap); - if (!err && EX_ISSYNC(fhp->fh_export)) - write_inode_now(dentry->d_inode, 1); - } -@@ -1206,7 +1390,10 @@ nfsd_link(struct svc_rqst *rqstp, struct - dold = tfhp->fh_dentry; - dest = dold->d_inode; - -- err = vfs_link(dold, dirp, dnew); -+ if (dirp->i_op->link_raw) -+ err = link_raw(dold, ddir, dnew); -+ else -+ err = vfs_link(dold, dirp, dnew); - if (!err) { - if (EX_ISSYNC(ffhp->fh_export)) { - nfsd_sync_dir(ddir); -@@ -1291,7 +1478,10 @@ nfsd_rename(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_rename(fdir, odentry, tdir, ndentry); -+ if(fdir->i_op->rename_raw) -+ err = rename_raw(fdentry, tdentry, odentry, ndentry); -+ else -+ err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!err && EX_ISSYNC(tfhp->fh_export)) { - nfsd_sync_dir(tdentry); - nfsd_sync_dir(fdentry); -@@ -1312,7 +1502,7 @@ nfsd_rename(struct svc_rqst *rqstp, stru - fill_post_wcc(tfhp); - double_up(&tdir->i_sem, &fdir->i_sem); - ffhp->fh_locked = tfhp->fh_locked = 0; -- -+ - out: - return err; - } -@@ -1358,9 +1548,15 @@ nfsd_unlink(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_unlink(dirp, rdentry); -+ if (dirp->i_op->unlink_raw) -+ err = unlink_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_unlink(dirp, rdentry); - } else { /* It's RMDIR */ -- err = vfs_rmdir(dirp, rdentry); -+ if (dirp->i_op->rmdir_raw) -+ err = rmdir_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_rmdir(dirp, rdentry); - } - - dput(rdentry); -diff -uprN linux/include/linux/fs.h linux-2.4.20/include/linux/fs.h ---- linux/include/linux/fs.h Sun Oct 5 21:52:56 2003 -+++ linux-2.4.20/include/linux/fs.h Sun Oct 5 22:25:20 2003 -@@ -93,6 +93,9 @@ extern int leases_enable, dir_notify_ena - #define FS_SINGLE 8 /* Filesystem that can have only one superblock */ - #define FS_NOMOUNT 16 /* Never mount from userland */ - #define FS_LITTER 32 /* Keeps the tree in dcache */ -+#define FS_NFSEXP_FSID 64 /* Use file system specific fsid for -+ * exporting non device filesystems. -+ */ - #define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon - * as nfs_rename() will be cleaned up - */ -@@ -1099,6 +1102,9 @@ extern int open_namei_it(const char *fil - struct nameidata *nd, struct lookup_intent *it); - extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, - int flags, struct lookup_intent *it); -+extern int revalidate_it(struct dentry *dentry, struct lookup_intent *it); -+extern int init_private_file_it(struct file *, struct dentry *dentry, int mode, -+ struct lookup_intent *it); - extern int filp_close(struct file *, fl_owner_t id); - extern char * getname(const char *); - -@@ -1369,6 +1375,8 @@ extern void path_release(struct nameidat - extern int follow_down(struct vfsmount **, struct dentry **); - extern int follow_up(struct vfsmount **, struct dentry **); - extern struct dentry * lookup_one_len(const char *, struct dentry *, int); -+extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, -+ struct lookup_intent *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *, struct nameidata *); - #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) - #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) -@@ -1382,6 +1390,8 @@ extern ino_t iunique(struct super_block - - typedef int (*find_inode_t)(struct inode *, unsigned long, void *); - extern struct inode * iget4(struct super_block *, unsigned long, find_inode_t, void *); -+extern struct inode * ilookup4(struct super_block *, unsigned long, -+ find_inode_t, void *); - static inline struct inode *iget(struct super_block *sb, unsigned long ino) - { - return iget4(sb, ino, NULL, NULL); -diff -uprN linux/kernel/ksyms.c linux-2.4.20/kernel/ksyms.c ---- linux/kernel/ksyms.c Sun Oct 5 21:52:51 2003 -+++ linux-2.4.20/kernel/ksyms.c Sun Oct 5 22:25:20 2003 -@@ -146,6 +146,7 @@ EXPORT_SYMBOL(fget); - EXPORT_SYMBOL(igrab); - EXPORT_SYMBOL(iunique); - EXPORT_SYMBOL(iget4); -+EXPORT_SYMBOL(ilookup4); - EXPORT_SYMBOL(iput); - EXPORT_SYMBOL(force_delete); - EXPORT_SYMBOL(follow_up); -@@ -156,6 +157,7 @@ EXPORT_SYMBOL(path_walk); - EXPORT_SYMBOL(path_release); - EXPORT_SYMBOL(__user_walk); - EXPORT_SYMBOL(lookup_one_len); -+EXPORT_SYMBOL(lookup_one_len_it); - EXPORT_SYMBOL(lookup_hash); - EXPORT_SYMBOL(sys_close); - EXPORT_SYMBOL(dcache_lock); diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch deleted file mode 100644 index 5d3064c763..0000000000 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-chaos.patch +++ /dev/null @@ -1,746 +0,0 @@ - fs/Makefile | 3 - fs/file_table.c | 11 ++ - fs/inode.c | 23 ++++- - fs/namei.c | 12 ++ - fs/nfsd/export.c | 5 + - fs/nfsd/nfsfh.c | 65 +++++++++++++- - fs/nfsd/vfs.c | 235 ++++++++++++++++++++++++++++++++++++++++++++++++----- - include/linux/fs.h | 11 ++ - kernel/ksyms.c | 2 - 9 files changed, 333 insertions(+), 34 deletions(-) - -Index: linux-2.4.21-chaos/fs/file_table.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/file_table.c 2003-07-15 04:41:00.000000000 +0400 -+++ linux-2.4.21-chaos/fs/file_table.c 2003-12-12 16:19:25.000000000 +0300 -@@ -82,7 +82,8 @@ - * and call the open function (if any). The caller must verify that - * inode->i_fop is not NULL. - */ --int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+int init_private_file_it(struct file *filp, struct dentry *dentry, int mode, -+ struct lookup_intent *it) - { - memset(filp, 0, sizeof(*filp)); - filp->f_mode = mode; -@@ -90,12 +91,20 @@ - filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; -+ if (it) -+ filp->f_it = it; - filp->f_op = dentry->d_inode->i_fop; - if (filp->f_op->open) - return filp->f_op->open(dentry->d_inode, filp); - else - return 0; - } -+EXPORT_SYMBOL(init_private_file_it); -+ -+int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+{ -+ return init_private_file_it(filp, dentry, mode, NULL); -+} - - void fput(struct file * file) - { -Index: linux-2.4.21-chaos/fs/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/inode.c 2003-12-12 16:18:15.000000000 +0300 -+++ linux-2.4.21-chaos/fs/inode.c 2003-12-12 16:19:25.000000000 +0300 -@@ -1054,9 +1054,10 @@ - return inode; - } - --struct inode *iget4_locked(struct super_block *sb, unsigned long ino, find_inode_t find_actor, void *opaque) -+struct inode *ifind(struct super_block *sb, unsigned long ino, -+ struct list_head *head, -+ find_inode_t find_actor, void *opaque) - { -- struct list_head * head = inode_hashtable + hash(sb,ino); - struct inode * inode; - - spin_lock(&inode_lock); -@@ -1069,6 +1070,24 @@ - } - spin_unlock(&inode_lock); - -+ return NULL; -+} -+ -+struct inode *ilookup4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ return ifind(sb, ino, head, find_actor, opaque); -+} -+ -+struct inode *iget4_locked(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ struct inode *inode = ifind(sb, ino, head, find_actor, opaque); -+ if (inode) -+ return inode; -+ - /* - * get_new_inode() will do the right thing, re-trying the search - * in case it had to block at any point. -Index: linux-2.4.21-chaos/fs/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/fs/Makefile 2003-12-12 16:18:36.000000000 +0300 -+++ linux-2.4.21-chaos/fs/Makefile 2003-12-12 16:19:25.000000000 +0300 -@@ -9,7 +9,8 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o \ -+ namei.o file_table.o - mod-subdirs := nls - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ -Index: linux-2.4.21-chaos/fs/namei.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/namei.c 2003-12-12 16:18:06.000000000 +0300 -+++ linux-2.4.21-chaos/fs/namei.c 2003-12-12 16:19:25.000000000 +0300 -@@ -22,6 +22,7 @@ - #include <linux/dnotify.h> - #include <linux/smp_lock.h> - #include <linux/personality.h> -+#include <linux/module.h> - - #include <asm/namei.h> - #include <asm/uaccess.h> -@@ -100,6 +101,7 @@ - it->it_op_release(it); - - } -+EXPORT_SYMBOL(intent_release); - - /* In order to reduce some races, while at the same time doing additional - * checking and hopefully speeding things up, we copy filenames to the -@@ -910,7 +912,8 @@ - - - /* 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; -@@ -930,11 +933,16 @@ - } - this.hash = end_name_hash(hash); - -- return lookup_hash_it(&this, base, NULL); -+ return lookup_hash_it(&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() - * -Index: linux-2.4.21-chaos/fs/nfsd/export.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/nfsd/export.c 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/nfsd/export.c 2003-12-12 16:19:25.000000000 +0300 -@@ -223,6 +223,11 @@ - inode = nd.dentry->d_inode; - dev = inode->i_dev; - ino = inode->i_ino; -+ if ((inode->i_sb->s_type->fs_flags & FS_NFSEXP_FSID) && -+ !(nxp->ex_flags & NFSEXP_FSID)) { -+ nxp->ex_dev = inode->i_sb->s_dev; -+ nxp->ex_flags |= NFSEXP_FSID; -+ } - err = -EINVAL; - - exp = exp_get(clp, dev, ino); -Index: linux-2.4.21-chaos/fs/nfsd/nfsfh.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/nfsd/nfsfh.c 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/nfsd/nfsfh.c 2003-12-12 16:19:25.000000000 +0300 -@@ -36,6 +36,15 @@ - int sequence; /* sequence counter */ - }; - -+static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) -+{ -+ if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); -+ else -+ return inode->i_op->lookup(inode, dentry); -+ -+} -+ - /* - * A rather strange filldir function to capture - * the name matching the specified inode number. -@@ -75,6 +84,8 @@ - int error; - struct file file; - struct nfsd_getdents_callback buffer; -+ struct lookup_intent it; -+ struct file *filp = NULL; - - error = -ENOTDIR; - if (!dir || !S_ISDIR(dir->i_mode)) -@@ -85,9 +96,37 @@ - /* - * Open the directory ... - */ -- error = init_private_file(&file, dentry, FMODE_READ); -- if (error) -+ if (dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if ((dentry->d_flags & DCACHE_NFSD_DISCONNECTED) && -+ (dentry->d_parent == dentry) ) { -+ it.it_op_release = NULL; -+ /* -+ * XXX Temporary Hack: Simulating init_private_file without -+ * f_op->open for disconnected dentry Since we don't have actual -+ * dentry->d_name to revalidate in revalidate_it() -+ */ -+ filp = &file; -+ memset(filp, 0, sizeof(*filp)); -+ filp->f_mode = FMODE_READ; -+ atomic_set(&filp->f_count, 1); -+ filp->f_dentry = dentry; -+ filp->f_uid = current->fsuid; -+ filp->f_gid = current->fsgid; -+ filp->f_op = dentry->d_inode->i_fop; -+ error = 0; -+ } else { -+ intent_init(&it, IT_OPEN, 0); -+ error = revalidate_it(dentry, &it); -+ if (error) -+ goto out; -+ error = init_private_file_it(&file, dentry, FMODE_READ, &it); -+ } -+ } else { -+ error = init_private_file_it(&file, dentry, FMODE_READ, NULL); -+ } -+ if (error) - goto out; -+ - error = -EINVAL; - if (!file.f_op->readdir) - goto out_close; -@@ -113,9 +152,13 @@ - } - - out_close: -- if (file.f_op->release) -+ if (file.f_op->release && !filp) - file.f_op->release(dir, &file); - out: -+ if (dentry->d_op && -+ dentry->d_op->d_revalidate_it && -+ it.it_op_release && !filp) -+ intent_release(&it); - return error; - } - -@@ -274,7 +317,7 @@ - * it is well connected. But nobody returns different dentrys do they? - */ - down(&child->d_inode->i_sem); -- pdentry = child->d_inode->i_op->lookup(child->d_inode, tdentry); -+ pdentry = lookup_it(child->d_inode, tdentry); - up(&child->d_inode->i_sem); - d_drop(tdentry); /* we never want ".." hashed */ - if (!pdentry && tdentry->d_inode == NULL) { -@@ -307,6 +350,8 @@ - pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; - pdentry->d_op = child->d_op; - } -+ if (child->d_op && child->d_op->d_revalidate_it) -+ pdentry->d_op = child->d_op; - } - if (pdentry == NULL) - pdentry = ERR_PTR(-ENOMEM); -@@ -464,6 +509,8 @@ - struct dentry *pdentry; - struct inode *parent; - -+ if (result->d_op && result->d_op->d_revalidate_it) -+ dentry->d_op = result->d_op; - pdentry = nfsd_findparent(dentry); - err = PTR_ERR(pdentry); - if (IS_ERR(pdentry)) -@@ -672,6 +719,11 @@ - - inode = dentry->d_inode; - -+ /* cache coherency for non-device filesystems */ -+ if (inode->i_op && inode->i_op->revalidate_it) { -+ inode->i_op->revalidate_it(dentry, NULL); -+ } -+ - /* Type check. The correct error return for type mismatches - * does not seem to be generally agreed upon. SunOS seems to - * use EISDIR if file isn't S_IFREG; a comment in the NFSv3 -@@ -905,8 +957,9 @@ - dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - out_uptodate: -- printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -- dentry->d_parent->d_name.name, dentry->d_name.name); -+ if(!dentry->d_parent->d_inode->i_op->mkdir_raw) -+ printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -+ dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - } - -Index: linux-2.4.21-chaos/fs/nfsd/vfs.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/nfsd/vfs.c 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/nfsd/vfs.c 2003-12-12 16:19:25.000000000 +0300 -@@ -78,6 +78,128 @@ - static struct raparms * raparml; - static struct raparms * raparm_cache; - -+static int link_raw(struct dentry *dold, struct dentry *ddir, -+ struct dentry *dnew) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = dold }; -+ struct nameidata nd = { .dentry = ddir, .last = dnew->d_name }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->link_raw(&old_nd, &nd); -+ d_instantiate(dnew, dold->d_inode); -+ if(dold->d_inode->i_op && dold->d_inode->i_op->revalidate_it) -+ dold->d_inode->i_op->revalidate_it(dnew, NULL); -+ -+ return err; -+} -+ -+static int unlink_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->unlink_raw(&nd); -+ if (!err) -+ d_delete(rdentry); -+ -+ return err; -+} -+ -+static int rmdir_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->rmdir_raw(&nd); -+ if(!err) { -+ rdentry->d_inode->i_flags |= S_DEAD; -+ d_delete(rdentry); -+ } -+ -+ return err; -+} -+ -+static int symlink_raw(struct dentry *dentry, char *fname, int flen, -+ char *path) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->symlink_raw(&nd, path); -+ -+ return err; -+} -+ -+static int mkdir_raw(struct dentry *dentry, char *fname, int flen, int mode) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mkdir_raw(&nd, mode); -+ -+ return err; -+} -+ -+static int mknod_raw(struct dentry *dentry, char *fname, int flen, int mode, -+ dev_t dev) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mknod_raw(&nd, mode, dev); -+ -+ return err; -+} -+ -+static int rename_raw(struct dentry *fdentry, struct dentry *tdentry, -+ struct dentry *odentry, struct dentry *ndentry) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = fdentry, .last = odentry->d_name}; -+ struct nameidata new_nd = { .dentry = tdentry, .last = ndentry->d_name}; -+ struct inode_operations *op = old_nd.dentry->d_inode->i_op; -+ err = op->rename_raw(&old_nd, &new_nd); -+ d_move(odentry, ndentry); -+ -+ return err; -+} -+ -+static int setattr_raw(struct inode *inode, struct iattr *iap) -+{ -+ int err; -+ -+ iap->ia_valid |= ATTR_RAW; -+ err = inode->i_op->setattr_raw(inode, iap); -+ -+ return err; -+} -+ -+int revalidate_it(struct dentry *dentry, struct lookup_intent *it) -+{ -+ int err = 0; -+ -+ if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && -+ !d_invalidate(dentry)) { -+ dput(dentry); -+ err = -EINVAL; -+ dentry = NULL; -+ return err; -+ } -+ } -+ -+ return err; -+} -+ - /* - * Look up one component of a pathname. - * N.B. After this call _both_ fhp and resfh need an fh_put -@@ -303,7 +425,10 @@ - } - err = nfserr_notsync; - if (!check_guard || guardtime == inode->i_ctime) { -- err = notify_change(dentry, iap); -+ if ( dentry->d_inode->i_op && dentry->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dentry->d_inode, iap); -+ else -+ err = notify_change(dentry, iap); - err = nfserrno(err); - } - if (size_change) { -@@ -430,6 +555,7 @@ - { - struct dentry *dentry; - struct inode *inode; -+ struct lookup_intent it; - int err; - - /* If we get here, then the client has already done an "open", and (hopefully) -@@ -476,6 +602,14 @@ - filp->f_mode = FMODE_READ; - } - -+ intent_init(&it, IT_OPEN, (filp->f_flags & ~O_ACCMODE) | filp->f_mode); -+ -+ err = revalidate_it(dentry, &it); -+ if (err) -+ goto out_nfserr; -+ -+ filp->f_it = ⁢ -+ - err = 0; - if (filp->f_op && filp->f_op->open) { - err = filp->f_op->open(inode, filp); -@@ -490,7 +624,11 @@ - atomic_dec(&filp->f_count); - } - } -+ - out_nfserr: -+ if (it.it_op_release) -+ intent_release(&it); -+ - if (err) - err = nfserrno(err); - out: -@@ -821,7 +959,7 @@ - { - struct dentry *dentry, *dchild; - struct inode *dirp; -- int err; -+ int err, error = -EOPNOTSUPP; - - err = nfserr_perm; - if (!flen) -@@ -837,20 +975,44 @@ - dentry = fhp->fh_dentry; - dirp = dentry->d_inode; - -+ switch (type) { -+ case S_IFDIR: -+ if (dirp->i_op->mkdir_raw) -+ error = mkdir_raw(dentry, fname, flen, iap->ia_mode); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFIFO: -+ case S_IFSOCK: -+ case S_IFREG: -+ if (dirp->i_op->mknod_raw) { -+ if (type == S_IFREG) -+ rdev = 0; -+ error = mknod_raw(dentry, fname, flen, iap->ia_mode, rdev); -+ } -+ break; -+ default: -+ printk("nfsd: bad file type %o in nfsd_create\n", type); -+ } -+ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - /* - * Check whether the response file handle has been verified yet. - * If it has, the parent directory should already be locked. - */ -- if (!resfhp->fh_dentry) { -- /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ -- fh_lock(fhp); -+ if (!resfhp->fh_dentry || dirp->i_op->lookup_it) { -+ /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create -+ and nfsd_proc_create in case of lustre -+ */ -+ if (!resfhp->fh_dentry) -+ fh_lock(fhp); - dchild = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dchild); - if (IS_ERR(dchild)) - goto out_nfserr; -+ resfhp->fh_dentry = NULL; - err = fh_compose(resfhp, fhp->fh_export, dchild, fhp); - if (err) - goto out; -@@ -871,10 +1033,12 @@ - * Make sure the child dentry is still negative ... - */ - err = nfserr_exist; -- if (dchild->d_inode) { -- dprintk("nfsd_create: dentry %s/%s not negative!\n", -- dentry->d_name.name, dchild->d_name.name); -- goto out; -+ if ( error == -EOPNOTSUPP) { -+ if (dchild->d_inode) { -+ dprintk("nfsd_create: dentry %s/%s not negative!\n", -+ dentry->d_name.name, dchild->d_name.name); -+ goto out; -+ } - } - - if (!(iap->ia_valid & ATTR_MODE)) -@@ -887,16 +1051,19 @@ - err = nfserr_perm; - switch (type) { - case S_IFREG: -- err = vfs_create(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_create(dirp, dchild, iap->ia_mode); - break; - case S_IFDIR: -- err = vfs_mkdir(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mkdir(dirp, dchild, iap->ia_mode); - break; - case S_IFCHR: - case S_IFBLK: - case S_IFIFO: - case S_IFSOCK: -- err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); - break; - default: - printk("nfsd: bad file type %o in nfsd_create\n", type); -@@ -965,7 +1132,13 @@ - /* Get all the sanity checks out of the way before - * we lock the parent. */ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if (dirp->i_op->mknod_raw) { -+ err = mknod_raw(dentry, fname, flen, iap->ia_mode, 0); -+ if (err && err != -EOPNOTSUPP) -+ goto out; -+ } -+ -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - fh_lock(fhp); - -@@ -1016,6 +1189,8 @@ - case NFS3_CREATE_GUARDED: - err = nfserr_exist; - } -+ if(dirp->i_op->mknod_raw) -+ err = 0; - goto out; - } - -@@ -1122,7 +1297,7 @@ - struct iattr *iap) - { - struct dentry *dentry, *dnew; -- int err, cerr; -+ int err, cerr, error = -EOPNOTSUPP; - - err = nfserr_noent; - if (!flen || !plen) -@@ -1136,12 +1311,18 @@ - goto out; - fh_lock(fhp); - dentry = fhp->fh_dentry; -+ -+ if (dentry->d_inode->i_op->symlink_raw) -+ error = symlink_raw(dentry, fname, flen, path); -+ - dnew = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dnew); - if (IS_ERR(dnew)) - goto out_nfserr; - -- err = vfs_symlink(dentry->d_inode, dnew, path); -+ err = error; -+ if (err == -EOPNOTSUPP || !dentry->d_inode->i_op->symlink_raw) -+ err = vfs_symlink(dentry->d_inode, dnew, path); - if (!err) { - if (EX_ISSYNC(fhp->fh_export)) - nfsd_sync_dir(dentry); -@@ -1211,7 +1392,10 @@ - dold = tfhp->fh_dentry; - dest = dold->d_inode; - -- err = vfs_link(dold, dirp, dnew); -+ if (dirp->i_op->link_raw) -+ err = link_raw(dold, ddir, dnew); -+ else -+ err = vfs_link(dold, dirp, dnew); - if (!err) { - if (EX_ISSYNC(ffhp->fh_export)) { - nfsd_sync_dir(ddir); -@@ -1296,7 +1480,10 @@ - err = nfserr_perm; - } else - #endif -- err = vfs_rename(fdir, odentry, tdir, ndentry); -+ if(fdir->i_op->rename_raw) -+ err = rename_raw(fdentry, tdentry, odentry, ndentry); -+ else -+ err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!err && EX_ISSYNC(tfhp->fh_export)) { - nfsd_sync_dir(tdentry); - nfsd_sync_dir(fdentry); -@@ -1317,7 +1504,7 @@ - fill_post_wcc(tfhp); - double_up(&tdir->i_sem, &fdir->i_sem); - ffhp->fh_locked = tfhp->fh_locked = 0; -- -+ - out: - return err; - } -@@ -1363,9 +1550,15 @@ - err = nfserr_perm; - } else - #endif -- err = vfs_unlink(dirp, rdentry); -+ if (dirp->i_op->unlink_raw) -+ err = unlink_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_unlink(dirp, rdentry); - } else { /* It's RMDIR */ -- err = vfs_rmdir(dirp, rdentry); -+ if (dirp->i_op->rmdir_raw) -+ err = rmdir_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_rmdir(dirp, rdentry); - } - - dput(rdentry); -Index: linux-2.4.21-chaos/include/linux/fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/fs.h 2003-12-12 16:19:23.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/fs.h 2003-12-12 16:19:25.000000000 +0300 -@@ -93,6 +93,9 @@ - #define FS_SINGLE 8 /* Filesystem that can have only one superblock */ - #define FS_NOMOUNT 16 /* Never mount from userland */ - #define FS_LITTER 32 /* Keeps the tree in dcache */ -+#define FS_NFSEXP_FSID 64 /* Use file system specific fsid for -+ * exporting non device filesystems. -+ */ - #define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon - * as nfs_rename() will be cleaned up - */ -@@ -1159,6 +1162,9 @@ - struct nameidata *nd, struct lookup_intent *it); - extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, - int flags, struct lookup_intent *it); -+extern int revalidate_it(struct dentry *dentry, struct lookup_intent *it); -+extern int init_private_file_it(struct file *, struct dentry *dentry, int mode, -+ struct lookup_intent *it); - extern int filp_close(struct file *, fl_owner_t id); - extern char * getname(const char *); - -@@ -1458,6 +1464,8 @@ - extern int follow_down(struct vfsmount **, struct dentry **); - extern int follow_up(struct vfsmount **, struct dentry **); - extern struct dentry * lookup_one_len(const char *, struct dentry *, int); -+extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, -+ struct lookup_intent *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); - #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) - #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) -@@ -1477,7 +1485,8 @@ - - extern struct inode * iget4_locked(struct super_block *, unsigned long, - find_inode_t, void *); -- -+extern struct inode * ilookup4(struct super_block *, unsigned long, -+ find_inode_t, void *); - static inline struct inode *iget4(struct super_block *sb, unsigned long ino, - find_inode_t find_actor, void *opaque) - { -Index: linux-2.4.21-chaos/kernel/ksyms.c -=================================================================== ---- linux-2.4.21-chaos.orig/kernel/ksyms.c 2003-12-12 16:18:36.000000000 +0300 -+++ linux-2.4.21-chaos/kernel/ksyms.c 2003-12-12 16:19:25.000000000 +0300 -@@ -178,6 +178,7 @@ - EXPORT_SYMBOL(igrab); - EXPORT_SYMBOL(iunique); - EXPORT_SYMBOL(iget4_locked); -+EXPORT_SYMBOL(ilookup4); - EXPORT_SYMBOL(unlock_new_inode); - EXPORT_SYMBOL(iput); - EXPORT_SYMBOL(inode_init_once); -@@ -191,6 +192,7 @@ - EXPORT_SYMBOL(path_release); - EXPORT_SYMBOL(__user_walk); - EXPORT_SYMBOL(lookup_one_len); -+EXPORT_SYMBOL(lookup_one_len_it); - EXPORT_SYMBOL(lookup_hash); - - EXPORT_SYMBOL(sys_close); diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-suse2.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-suse2.patch deleted file mode 100644 index f8fd564579..0000000000 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.21-suse2.patch +++ /dev/null @@ -1,746 +0,0 @@ - fs/Makefile | 3 - fs/file_table.c | 11 ++ - fs/inode.c | 23 ++++- - fs/namei.c | 12 ++ - fs/nfsd/export.c | 5 + - fs/nfsd/nfsfh.c | 65 +++++++++++++- - fs/nfsd/vfs.c | 235 ++++++++++++++++++++++++++++++++++++++++++++++++----- - include/linux/fs.h | 11 ++ - kernel/ksyms.c | 2 - 9 files changed, 333 insertions(+), 34 deletions(-) - -Index: linux-2.4.21-chaos/fs/file_table.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/file_table.c 2003-07-15 04:41:00.000000000 +0400 -+++ linux-2.4.21-chaos/fs/file_table.c 2003-12-12 16:19:25.000000000 +0300 -@@ -82,7 +82,8 @@ - * and call the open function (if any). The caller must verify that - * inode->i_fop is not NULL. - */ --int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+int init_private_file_it(struct file *filp, struct dentry *dentry, int mode, -+ struct lookup_intent *it) - { - memset(filp, 0, sizeof(*filp)); - filp->f_mode = mode; -@@ -90,12 +91,20 @@ - filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; -+ if (it) -+ filp->f_it = it; - filp->f_op = dentry->d_inode->i_fop; - if (filp->f_op->open) - return filp->f_op->open(dentry->d_inode, filp); - else - return 0; - } -+EXPORT_SYMBOL(init_private_file_it); -+ -+int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+{ -+ return init_private_file_it(filp, dentry, mode, NULL); -+} - - void fput(struct file * file) - { -Index: linux-2.4.21-chaos/fs/inode.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/inode.c 2003-12-12 16:18:15.000000000 +0300 -+++ linux-2.4.21-chaos/fs/inode.c 2003-12-12 16:19:25.000000000 +0300 -@@ -1054,9 +1054,10 @@ - return inode; - } - --struct inode *iget4_locked(struct super_block *sb, unsigned long ino, find_inode_t find_actor, void *opaque) -+struct inode *ifind(struct super_block *sb, unsigned long ino, -+ struct list_head *head, -+ find_inode_t find_actor, void *opaque) - { -- struct list_head * head = inode_hashtable + hash(sb,ino); - struct inode * inode; - - spin_lock(&inode_lock); -@@ -1069,6 +1070,24 @@ - } - spin_unlock(&inode_lock); - -+ return NULL; -+} -+ -+struct inode *ilookup4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ return ifind(sb, ino, head, find_actor, opaque); -+} -+ -+struct inode *iget4_locked(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ struct inode *inode = ifind(sb, ino, head, find_actor, opaque); -+ if (inode) -+ return inode; -+ - /* - * get_new_inode() will do the right thing, re-trying the search - * in case it had to block at any point. -Index: linux-2.4.21-chaos/fs/Makefile -=================================================================== ---- linux-2.4.21-chaos.orig/fs/Makefile 2003-12-12 16:18:36.000000000 +0300 -+++ linux-2.4.21-chaos/fs/Makefile 2003-12-12 16:19:25.000000000 +0300 -@@ -9,7 +9,8 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o inode.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o inode.o \ -+ namei.o file_table.o - mod-subdirs := nls xfs - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ -Index: linux-2.4.21-chaos/fs/namei.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/namei.c 2003-12-12 16:18:06.000000000 +0300 -+++ linux-2.4.21-chaos/fs/namei.c 2003-12-12 16:19:25.000000000 +0300 -@@ -22,6 +22,7 @@ - #include <linux/dnotify.h> - #include <linux/smp_lock.h> - #include <linux/personality.h> -+#include <linux/module.h> - - #include <asm/namei.h> - #include <asm/uaccess.h> -@@ -100,6 +101,7 @@ - it->it_op_release(it); - - } -+EXPORT_SYMBOL(intent_release); - - /* In order to reduce some races, while at the same time doing additional - * checking and hopefully speeding things up, we copy filenames to the -@@ -910,7 +912,8 @@ - - - /* 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; -@@ -930,11 +933,16 @@ - } - this.hash = end_name_hash(hash); - -- return lookup_hash_it(&this, base, NULL); -+ return lookup_hash_it(&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() - * -Index: linux-2.4.21-chaos/fs/nfsd/export.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/nfsd/export.c 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/nfsd/export.c 2003-12-12 16:19:25.000000000 +0300 -@@ -223,6 +223,11 @@ - inode = nd.dentry->d_inode; - dev = inode->i_dev; - ino = inode->i_ino; -+ if ((inode->i_sb->s_type->fs_flags & FS_NFSEXP_FSID) && -+ !(nxp->ex_flags & NFSEXP_FSID)) { -+ nxp->ex_dev = inode->i_sb->s_dev; -+ nxp->ex_flags |= NFSEXP_FSID; -+ } - err = -EINVAL; - - exp = exp_get(clp, dev, ino); -Index: linux-2.4.21-chaos/fs/nfsd/nfsfh.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/nfsd/nfsfh.c 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/nfsd/nfsfh.c 2003-12-12 16:19:25.000000000 +0300 -@@ -36,6 +36,15 @@ - int sequence; /* sequence counter */ - }; - -+static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) -+{ -+ if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); -+ else -+ return inode->i_op->lookup(inode, dentry); -+ -+} -+ - /* - * A rather strange filldir function to capture - * the name matching the specified inode number. -@@ -75,6 +84,8 @@ - int error; - struct file file; - struct nfsd_getdents_callback buffer; -+ struct lookup_intent it; -+ struct file *filp = NULL; - - error = -ENOTDIR; - if (!dir || !S_ISDIR(dir->i_mode)) -@@ -85,9 +96,37 @@ - /* - * Open the directory ... - */ -- error = init_private_file(&file, dentry, FMODE_READ); -- if (error) -+ if (dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if ((dentry->d_flags & DCACHE_NFSD_DISCONNECTED) && -+ (dentry->d_parent == dentry) ) { -+ it.it_op_release = NULL; -+ /* -+ * XXX Temporary Hack: Simulating init_private_file without -+ * f_op->open for disconnected dentry Since we don't have actual -+ * dentry->d_name to revalidate in revalidate_it() -+ */ -+ filp = &file; -+ memset(filp, 0, sizeof(*filp)); -+ filp->f_mode = FMODE_READ; -+ atomic_set(&filp->f_count, 1); -+ filp->f_dentry = dentry; -+ filp->f_uid = current->fsuid; -+ filp->f_gid = current->fsgid; -+ filp->f_op = dentry->d_inode->i_fop; -+ error = 0; -+ } else { -+ intent_init(&it, IT_OPEN, 0); -+ error = revalidate_it(dentry, &it); -+ if (error) -+ goto out; -+ error = init_private_file_it(&file, dentry, FMODE_READ, &it); -+ } -+ } else { -+ error = init_private_file_it(&file, dentry, FMODE_READ, NULL); -+ } -+ if (error) - goto out; -+ - error = -EINVAL; - if (!file.f_op->readdir) - goto out_close; -@@ -113,9 +152,13 @@ - } - - out_close: -- if (file.f_op->release) -+ if (file.f_op->release && !filp) - file.f_op->release(dir, &file); - out: -+ if (dentry->d_op && -+ dentry->d_op->d_revalidate_it && -+ it.it_op_release && !filp) -+ intent_release(&it); - return error; - } - -@@ -274,7 +317,7 @@ - * it is well connected. But nobody returns different dentrys do they? - */ - down(&child->d_inode->i_sem); -- pdentry = child->d_inode->i_op->lookup(child->d_inode, tdentry); -+ pdentry = lookup_it(child->d_inode, tdentry); - up(&child->d_inode->i_sem); - d_drop(tdentry); /* we never want ".." hashed */ - if (!pdentry && tdentry->d_inode == NULL) { -@@ -307,6 +350,8 @@ - pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; - pdentry->d_op = child->d_op; - } -+ if (child->d_op && child->d_op->d_revalidate_it) -+ pdentry->d_op = child->d_op; - } - if (pdentry == NULL) - pdentry = ERR_PTR(-ENOMEM); -@@ -464,6 +509,8 @@ - struct dentry *pdentry; - struct inode *parent; - -+ if (result->d_op && result->d_op->d_revalidate_it) -+ dentry->d_op = result->d_op; - pdentry = nfsd_findparent(dentry); - err = PTR_ERR(pdentry); - if (IS_ERR(pdentry)) -@@ -672,6 +719,11 @@ - - inode = dentry->d_inode; - -+ /* cache coherency for non-device filesystems */ -+ if (inode->i_op && inode->i_op->revalidate_it) { -+ inode->i_op->revalidate_it(dentry, NULL); -+ } -+ - /* Type check. The correct error return for type mismatches - * does not seem to be generally agreed upon. SunOS seems to - * use EISDIR if file isn't S_IFREG; a comment in the NFSv3 -@@ -905,8 +957,9 @@ - dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - out_uptodate: -- printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -- dentry->d_parent->d_name.name, dentry->d_name.name); -+ if(!dentry->d_parent->d_inode->i_op->mkdir_raw) -+ printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -+ dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - } - -Index: linux-2.4.21-chaos/fs/nfsd/vfs.c -=================================================================== ---- linux-2.4.21-chaos.orig/fs/nfsd/vfs.c 2003-09-19 03:49:54.000000000 +0400 -+++ linux-2.4.21-chaos/fs/nfsd/vfs.c 2003-12-12 16:19:25.000000000 +0300 -@@ -78,6 +78,128 @@ - static struct raparms * raparml; - static struct raparms * raparm_cache; - -+static int link_raw(struct dentry *dold, struct dentry *ddir, -+ struct dentry *dnew) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = dold }; -+ struct nameidata nd = { .dentry = ddir, .last = dnew->d_name }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->link_raw(&old_nd, &nd); -+ d_instantiate(dnew, dold->d_inode); -+ if(dold->d_inode->i_op && dold->d_inode->i_op->revalidate_it) -+ dold->d_inode->i_op->revalidate_it(dnew, NULL); -+ -+ return err; -+} -+ -+static int unlink_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->unlink_raw(&nd); -+ if (!err) -+ d_delete(rdentry); -+ -+ return err; -+} -+ -+static int rmdir_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->rmdir_raw(&nd); -+ if(!err) { -+ rdentry->d_inode->i_flags |= S_DEAD; -+ d_delete(rdentry); -+ } -+ -+ return err; -+} -+ -+static int symlink_raw(struct dentry *dentry, char *fname, int flen, -+ char *path) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->symlink_raw(&nd, path); -+ -+ return err; -+} -+ -+static int mkdir_raw(struct dentry *dentry, char *fname, int flen, int mode) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mkdir_raw(&nd, mode); -+ -+ return err; -+} -+ -+static int mknod_raw(struct dentry *dentry, char *fname, int flen, int mode, -+ dev_t dev) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mknod_raw(&nd, mode, dev); -+ -+ return err; -+} -+ -+static int rename_raw(struct dentry *fdentry, struct dentry *tdentry, -+ struct dentry *odentry, struct dentry *ndentry) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = fdentry, .last = odentry->d_name}; -+ struct nameidata new_nd = { .dentry = tdentry, .last = ndentry->d_name}; -+ struct inode_operations *op = old_nd.dentry->d_inode->i_op; -+ err = op->rename_raw(&old_nd, &new_nd); -+ d_move(odentry, ndentry); -+ -+ return err; -+} -+ -+static int setattr_raw(struct inode *inode, struct iattr *iap) -+{ -+ int err; -+ -+ iap->ia_valid |= ATTR_RAW; -+ err = inode->i_op->setattr_raw(inode, iap); -+ -+ return err; -+} -+ -+int revalidate_it(struct dentry *dentry, struct lookup_intent *it) -+{ -+ int err = 0; -+ -+ if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && -+ !d_invalidate(dentry)) { -+ dput(dentry); -+ err = -EINVAL; -+ dentry = NULL; -+ return err; -+ } -+ } -+ -+ return err; -+} -+ - /* - * Look up one component of a pathname. - * N.B. After this call _both_ fhp and resfh need an fh_put -@@ -303,7 +425,10 @@ - } - err = nfserr_notsync; - if (!check_guard || guardtime == inode->i_ctime) { -- err = notify_change(dentry, iap); -+ if ( dentry->d_inode->i_op && dentry->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dentry->d_inode, iap); -+ else -+ err = notify_change(dentry, iap); - err = nfserrno(err); - } - if (size_change) { -@@ -430,6 +555,7 @@ - { - struct dentry *dentry; - struct inode *inode; -+ struct lookup_intent it; - int err; - - /* If we get here, then the client has already done an "open", and (hopefully) -@@ -476,6 +602,14 @@ - filp->f_mode = FMODE_READ; - } - -+ intent_init(&it, IT_OPEN, (filp->f_flags & ~O_ACCMODE) | filp->f_mode); -+ -+ err = revalidate_it(dentry, &it); -+ if (err) -+ goto out_nfserr; -+ -+ filp->f_it = ⁢ -+ - err = 0; - if (filp->f_op && filp->f_op->open) { - err = filp->f_op->open(inode, filp); -@@ -490,7 +624,11 @@ - atomic_dec(&filp->f_count); - } - } -+ - out_nfserr: -+ if (it.it_op_release) -+ intent_release(&it); -+ - if (err) - err = nfserrno(err); - out: -@@ -821,7 +959,7 @@ - { - struct dentry *dentry, *dchild; - struct inode *dirp; -- int err; -+ int err, error = -EOPNOTSUPP; - - err = nfserr_perm; - if (!flen) -@@ -837,20 +975,44 @@ - dentry = fhp->fh_dentry; - dirp = dentry->d_inode; - -+ switch (type) { -+ case S_IFDIR: -+ if (dirp->i_op->mkdir_raw) -+ error = mkdir_raw(dentry, fname, flen, iap->ia_mode); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFIFO: -+ case S_IFSOCK: -+ case S_IFREG: -+ if (dirp->i_op->mknod_raw) { -+ if (type == S_IFREG) -+ rdev = 0; -+ error = mknod_raw(dentry, fname, flen, iap->ia_mode, rdev); -+ } -+ break; -+ default: -+ printk("nfsd: bad file type %o in nfsd_create\n", type); -+ } -+ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - /* - * Check whether the response file handle has been verified yet. - * If it has, the parent directory should already be locked. - */ -- if (!resfhp->fh_dentry) { -- /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ -- fh_lock(fhp); -+ if (!resfhp->fh_dentry || dirp->i_op->lookup_it) { -+ /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create -+ and nfsd_proc_create in case of lustre -+ */ -+ if (!resfhp->fh_dentry) -+ fh_lock(fhp); - dchild = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dchild); - if (IS_ERR(dchild)) - goto out_nfserr; -+ resfhp->fh_dentry = NULL; - err = fh_compose(resfhp, fhp->fh_export, dchild, fhp); - if (err) - goto out; -@@ -871,10 +1033,12 @@ - * Make sure the child dentry is still negative ... - */ - err = nfserr_exist; -- if (dchild->d_inode) { -- dprintk("nfsd_create: dentry %s/%s not negative!\n", -- dentry->d_name.name, dchild->d_name.name); -- goto out; -+ if ( error == -EOPNOTSUPP) { -+ if (dchild->d_inode) { -+ dprintk("nfsd_create: dentry %s/%s not negative!\n", -+ dentry->d_name.name, dchild->d_name.name); -+ goto out; -+ } - } - - if (!(iap->ia_valid & ATTR_MODE)) -@@ -887,16 +1051,19 @@ - err = nfserr_perm; - switch (type) { - case S_IFREG: -- err = vfs_create(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_create(dirp, dchild, iap->ia_mode); - break; - case S_IFDIR: -- err = vfs_mkdir(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mkdir(dirp, dchild, iap->ia_mode); - break; - case S_IFCHR: - case S_IFBLK: - case S_IFIFO: - case S_IFSOCK: -- err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); - break; - default: - printk("nfsd: bad file type %o in nfsd_create\n", type); -@@ -965,7 +1132,13 @@ - /* Get all the sanity checks out of the way before - * we lock the parent. */ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if (dirp->i_op->mknod_raw) { -+ err = mknod_raw(dentry, fname, flen, iap->ia_mode, 0); -+ if (err && err != -EOPNOTSUPP) -+ goto out; -+ } -+ -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - fh_lock(fhp); - -@@ -1016,6 +1189,8 @@ - case NFS3_CREATE_GUARDED: - err = nfserr_exist; - } -+ if(dirp->i_op->mknod_raw) -+ err = 0; - goto out; - } - -@@ -1122,7 +1297,7 @@ - struct iattr *iap) - { - struct dentry *dentry, *dnew; -- int err, cerr; -+ int err, cerr, error = -EOPNOTSUPP; - - err = nfserr_noent; - if (!flen || !plen) -@@ -1136,12 +1311,18 @@ - goto out; - fh_lock(fhp); - dentry = fhp->fh_dentry; -+ -+ if (dentry->d_inode->i_op->symlink_raw) -+ error = symlink_raw(dentry, fname, flen, path); -+ - dnew = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dnew); - if (IS_ERR(dnew)) - goto out_nfserr; - -- err = vfs_symlink(dentry->d_inode, dnew, path); -+ err = error; -+ if (err == -EOPNOTSUPP || !dentry->d_inode->i_op->symlink_raw) -+ err = vfs_symlink(dentry->d_inode, dnew, path); - if (!err) { - if (EX_ISSYNC(fhp->fh_export)) - nfsd_sync_dir(dentry); -@@ -1211,7 +1392,10 @@ - dold = tfhp->fh_dentry; - dest = dold->d_inode; - -- err = vfs_link(dold, dirp, dnew); -+ if (dirp->i_op->link_raw) -+ err = link_raw(dold, ddir, dnew); -+ else -+ err = vfs_link(dold, dirp, dnew); - if (!err) { - if (EX_ISSYNC(ffhp->fh_export)) { - nfsd_sync_dir(ddir); -@@ -1296,7 +1480,10 @@ - err = nfserr_perm; - } else - #endif -- err = vfs_rename(fdir, odentry, tdir, ndentry); -+ if(fdir->i_op->rename_raw) -+ err = rename_raw(fdentry, tdentry, odentry, ndentry); -+ else -+ err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!err && EX_ISSYNC(tfhp->fh_export)) { - nfsd_sync_dir(tdentry); - nfsd_sync_dir(fdentry); -@@ -1317,7 +1504,7 @@ - fill_post_wcc(tfhp); - double_up(&tdir->i_sem, &fdir->i_sem); - ffhp->fh_locked = tfhp->fh_locked = 0; -- -+ - out: - return err; - } -@@ -1363,9 +1550,15 @@ - err = nfserr_perm; - } else - #endif -- err = vfs_unlink(dirp, rdentry); -+ if (dirp->i_op->unlink_raw) -+ err = unlink_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_unlink(dirp, rdentry); - } else { /* It's RMDIR */ -- err = vfs_rmdir(dirp, rdentry); -+ if (dirp->i_op->rmdir_raw) -+ err = rmdir_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_rmdir(dirp, rdentry); - } - - dput(rdentry); -Index: linux-2.4.21-chaos/include/linux/fs.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/fs.h 2003-12-12 16:19:23.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/fs.h 2003-12-12 16:19:25.000000000 +0300 -@@ -93,6 +93,9 @@ - #define FS_SINGLE 8 /* Filesystem that can have only one superblock */ - #define FS_NOMOUNT 16 /* Never mount from userland */ - #define FS_LITTER 32 /* Keeps the tree in dcache */ -+#define FS_NFSEXP_FSID 64 /* Use file system specific fsid for -+ * exporting non device filesystems. -+ */ - #define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon - * as nfs_rename() will be cleaned up - */ -@@ -1159,6 +1162,9 @@ - struct nameidata *nd, struct lookup_intent *it); - extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, - int flags, struct lookup_intent *it); -+extern int revalidate_it(struct dentry *dentry, struct lookup_intent *it); -+extern int init_private_file_it(struct file *, struct dentry *dentry, int mode, -+ struct lookup_intent *it); - extern int filp_close(struct file *, fl_owner_t id); - extern char * getname(const char *); - -@@ -1458,6 +1464,8 @@ - extern int follow_down(struct vfsmount **, struct dentry **); - extern int follow_up(struct vfsmount **, struct dentry **); - extern struct dentry * lookup_one_len(const char *, struct dentry *, int); -+extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, -+ struct lookup_intent *); - extern struct dentry * __lookup_hash(struct qstr *, struct dentry *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); - #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) -@@ -1477,7 +1485,8 @@ - - extern struct inode * iget4_locked(struct super_block *, unsigned long, - find_inode_t, void *); -- -+extern struct inode * ilookup4(struct super_block *, unsigned long, -+ find_inode_t, void *); - static inline struct inode *iget4(struct super_block *sb, unsigned long ino, - find_inode_t find_actor, void *opaque) - { -Index: linux-2.4.21-chaos/kernel/ksyms.c -=================================================================== ---- linux-2.4.21-chaos.orig/kernel/ksyms.c 2003-12-12 16:18:36.000000000 +0300 -+++ linux-2.4.21-chaos/kernel/ksyms.c 2003-12-12 16:19:25.000000000 +0300 -@@ -178,6 +178,7 @@ - EXPORT_SYMBOL(igrab); - EXPORT_SYMBOL(iunique); - EXPORT_SYMBOL(iget4_locked); -+EXPORT_SYMBOL(ilookup4); - EXPORT_SYMBOL(unlock_new_inode); - EXPORT_SYMBOL(iput); - EXPORT_SYMBOL(inode_init_once); -@@ -191,6 +192,7 @@ - EXPORT_SYMBOL(path_release); - EXPORT_SYMBOL(__user_walk); - EXPORT_SYMBOL(lookup_one_len); -+EXPORT_SYMBOL(lookup_one_len_it); - EXPORT_SYMBOL(lookup_hash); - - EXPORT_SYMBOL(sys_close); diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22-rh.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22-rh.patch deleted file mode 100644 index 6e7133456e..0000000000 --- a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22-rh.patch +++ /dev/null @@ -1,730 +0,0 @@ - fs/Makefile | 3 - fs/file_table.c | 11 ++ - fs/inode.c | 23 ++++- - fs/namei.c | 12 ++ - fs/nfsd/export.c | 5 + - fs/nfsd/nfsfh.c | 65 +++++++++++++- - fs/nfsd/vfs.c | 235 ++++++++++++++++++++++++++++++++++++++++++++++++----- - include/linux/fs.h | 11 ++ - kernel/ksyms.c | 2 - 9 files changed, 333 insertions(+), 34 deletions(-) - ---- linux-2.4.22-ac1/fs/file_table.c~nfs_export_kernel-2.4.22-rh 2002-11-29 02:53:15.000000000 +0300 -+++ linux-2.4.22-ac1-alexey/fs/file_table.c 2003-10-08 13:41:27.000000000 +0400 -@@ -82,7 +82,8 @@ struct file * get_empty_filp(void) - * and call the open function (if any). The caller must verify that - * inode->i_fop is not NULL. - */ --int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+int init_private_file_it(struct file *filp, struct dentry *dentry, int mode, -+ struct lookup_intent *it) - { - memset(filp, 0, sizeof(*filp)); - filp->f_mode = mode; -@@ -90,12 +91,20 @@ int init_private_file(struct file *filp, - filp->f_dentry = dentry; - filp->f_uid = current->fsuid; - filp->f_gid = current->fsgid; -+ if (it) -+ filp->f_it = it; - filp->f_op = dentry->d_inode->i_fop; - if (filp->f_op->open) - return filp->f_op->open(dentry->d_inode, filp); - else - return 0; - } -+EXPORT_SYMBOL(init_private_file_it); -+ -+int init_private_file(struct file *filp, struct dentry *dentry, int mode) -+{ -+ return init_private_file_it(filp, dentry, mode, NULL); -+} - - void fput(struct file * file) - { ---- linux-2.4.22-ac1/fs/inode.c~nfs_export_kernel-2.4.22-rh 2003-09-26 00:57:28.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/inode.c 2003-10-08 13:43:31.000000000 +0400 -@@ -998,9 +998,10 @@ struct inode *igrab(struct inode *inode) - return inode; - } - --struct inode *iget4_locked(struct super_block *sb, unsigned long ino, find_inode_t find_actor, void *opaque) -+struct inode *ifind(struct super_block *sb, unsigned long ino, -+ struct list_head *head, -+ find_inode_t find_actor, void *opaque) - { -- struct list_head * head = inode_hashtable + hash(sb,ino); - struct inode * inode; - - spin_lock(&inode_lock); -@@ -1013,6 +1014,24 @@ struct inode *iget4_locked(struct super_ - } - spin_unlock(&inode_lock); - -+ return NULL; -+} -+ -+struct inode *ilookup4(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ return ifind(sb, ino, head, find_actor, opaque); -+} -+ -+struct inode *iget4_locked(struct super_block *sb, unsigned long ino, -+ find_inode_t find_actor, void *opaque) -+{ -+ struct list_head * head = inode_hashtable + hash(sb,ino); -+ struct inode *inode = ifind(sb, ino, head, find_actor, opaque); -+ if (inode) -+ return inode; -+ - /* - * get_new_inode() will do the right thing, re-trying the search - * in case it had to block at any point. ---- linux-2.4.22-ac1/fs/Makefile~nfs_export_kernel-2.4.22-rh 2003-09-26 00:57:28.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/Makefile 2003-10-08 13:41:55.000000000 +0400 -@@ -7,7 +7,8 @@ - - O_TARGET := fs.o - --export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o -+export-objs := filesystems.o open.o dcache.o buffer.o dquot.o dcookies.o inode.o \ -+ namei.o file_table.o - mod-subdirs := nls xfs - - obj-y := open.o read_write.o devices.o file_table.o buffer.o \ ---- linux-2.4.22-ac1/fs/namei.c~nfs_export_kernel-2.4.22-rh 2003-09-26 00:57:27.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/namei.c 2003-10-08 13:41:27.000000000 +0400 -@@ -22,6 +22,7 @@ - #include <linux/dnotify.h> - #include <linux/smp_lock.h> - #include <linux/personality.h> -+#include <linux/module.h> - - #include <asm/namei.h> - #include <asm/uaccess.h> -@@ -100,6 +101,7 @@ void intent_release(struct lookup_intent - it->it_op_release(it); - - } -+EXPORT_SYMBOL(intent_release); - - /* In order to reduce some races, while at the same time doing additional - * checking and hopefully speeding things up, we copy filenames to the -@@ -903,7 +905,8 @@ struct dentry * lookup_hash(struct qstr - - - /* SMP-safe */ --struct dentry * lookup_one_len(const char * name, struct dentry * base, int len) -+struct dentry * lookup_one_len_it(const char * name, struct dentry * base, -+ int len, struct lookup_intent *it) - { - unsigned long hash; - struct qstr this; -@@ -923,11 +926,16 @@ struct dentry * lookup_one_len(const cha - } - this.hash = end_name_hash(hash); - -- return lookup_hash_it(&this, base, NULL); -+ return lookup_hash_it(&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() - * ---- linux-2.4.22-ac1/fs/nfsd/export.c~nfs_export_kernel-2.4.22-rh 2003-09-25 14:16:29.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/nfsd/export.c 2003-10-08 13:41:27.000000000 +0400 -@@ -223,6 +223,11 @@ exp_export(struct nfsctl_export *nxp) - inode = nd.dentry->d_inode; - dev = inode->i_dev; - ino = inode->i_ino; -+ if ((inode->i_sb->s_type->fs_flags & FS_NFSEXP_FSID) && -+ !(nxp->ex_flags & NFSEXP_FSID)) { -+ nxp->ex_dev = inode->i_sb->s_dev; -+ nxp->ex_flags |= NFSEXP_FSID; -+ } - err = -EINVAL; - - exp = exp_get(clp, dev, ino); ---- linux-2.4.22-ac1/fs/nfsd/nfsfh.c~nfs_export_kernel-2.4.22-rh 2003-08-25 15:44:43.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/nfsd/nfsfh.c 2003-10-08 13:41:27.000000000 +0400 -@@ -36,6 +36,15 @@ struct nfsd_getdents_callback { - int sequence; /* sequence counter */ - }; - -+static struct dentry *lookup_it(struct inode *inode, struct dentry * dentry) -+{ -+ if (inode->i_op->lookup_it) -+ return inode->i_op->lookup_it(inode, dentry, NULL, NULL, 0); -+ else -+ return inode->i_op->lookup(inode, dentry); -+ -+} -+ - /* - * A rather strange filldir function to capture - * the name matching the specified inode number. -@@ -75,6 +84,8 @@ static int nfsd_get_name(struct dentry * - int error; - struct file file; - struct nfsd_getdents_callback buffer; -+ struct lookup_intent it; -+ struct file *filp = NULL; - - error = -ENOTDIR; - if (!dir || !S_ISDIR(dir->i_mode)) -@@ -85,9 +96,37 @@ static int nfsd_get_name(struct dentry * - /* - * Open the directory ... - */ -- error = init_private_file(&file, dentry, FMODE_READ); -- if (error) -+ if (dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if ((dentry->d_flags & DCACHE_NFSD_DISCONNECTED) && -+ (dentry->d_parent == dentry) ) { -+ it.it_op_release = NULL; -+ /* -+ * XXX Temporary Hack: Simulating init_private_file without -+ * f_op->open for disconnected dentry Since we don't have actual -+ * dentry->d_name to revalidate in revalidate_it() -+ */ -+ filp = &file; -+ memset(filp, 0, sizeof(*filp)); -+ filp->f_mode = FMODE_READ; -+ atomic_set(&filp->f_count, 1); -+ filp->f_dentry = dentry; -+ filp->f_uid = current->fsuid; -+ filp->f_gid = current->fsgid; -+ filp->f_op = dentry->d_inode->i_fop; -+ error = 0; -+ } else { -+ intent_init(&it, IT_OPEN, 0); -+ error = revalidate_it(dentry, &it); -+ if (error) -+ goto out; -+ error = init_private_file_it(&file, dentry, FMODE_READ, &it); -+ } -+ } else { -+ error = init_private_file_it(&file, dentry, FMODE_READ, NULL); -+ } -+ if (error) - goto out; -+ - error = -EINVAL; - if (!file.f_op->readdir) - goto out_close; -@@ -113,9 +152,13 @@ static int nfsd_get_name(struct dentry * - } - - out_close: -- if (file.f_op->release) -+ if (file.f_op->release && !filp) - file.f_op->release(dir, &file); - out: -+ if (dentry->d_op && -+ dentry->d_op->d_revalidate_it && -+ it.it_op_release && !filp) -+ intent_release(&it); - return error; - } - -@@ -274,7 +317,7 @@ struct dentry *nfsd_findparent(struct de - * it is well connected. But nobody returns different dentrys do they? - */ - down(&child->d_inode->i_sem); -- pdentry = child->d_inode->i_op->lookup(child->d_inode, tdentry); -+ pdentry = lookup_it(child->d_inode, tdentry); - up(&child->d_inode->i_sem); - d_drop(tdentry); /* we never want ".." hashed */ - if (!pdentry && tdentry->d_inode == NULL) { -@@ -306,6 +349,8 @@ struct dentry *nfsd_findparent(struct de - igrab(tdentry->d_inode); - pdentry->d_flags |= DCACHE_NFSD_DISCONNECTED; - } -+ if (child->d_op && child->d_op->d_revalidate_it) -+ pdentry->d_op = child->d_op; - } - if (pdentry == NULL) - pdentry = ERR_PTR(-ENOMEM); -@@ -463,6 +508,8 @@ find_fh_dentry(struct super_block *sb, _ - struct dentry *pdentry; - struct inode *parent; - -+ if (result->d_op && result->d_op->d_revalidate_it) -+ dentry->d_op = result->d_op; - pdentry = nfsd_findparent(dentry); - err = PTR_ERR(pdentry); - if (IS_ERR(pdentry)) -@@ -669,6 +716,11 @@ fh_verify(struct svc_rqst *rqstp, struct - - inode = dentry->d_inode; - -+ /* cache coherency for non-device filesystems */ -+ if (inode->i_op && inode->i_op->revalidate_it) { -+ inode->i_op->revalidate_it(dentry, NULL); -+ } -+ - /* Type check. The correct error return for type mismatches - * does not seem to be generally agreed upon. SunOS seems to - * use EISDIR if file isn't S_IFREG; a comment in the NFSv3 -@@ -902,8 +954,9 @@ out_negative: - dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - out_uptodate: -- printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -- dentry->d_parent->d_name.name, dentry->d_name.name); -+ if(!dentry->d_parent->d_inode->i_op->mkdir_raw) -+ printk(KERN_ERR "fh_update: %s/%s already up-to-date!\n", -+ dentry->d_parent->d_name.name, dentry->d_name.name); - goto out; - } - ---- linux-2.4.22-ac1/fs/nfsd/vfs.c~nfs_export_kernel-2.4.22-rh 2003-08-25 15:44:43.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/fs/nfsd/vfs.c 2003-10-08 13:41:27.000000000 +0400 -@@ -77,6 +77,128 @@ struct raparms { - static struct raparms * raparml; - static struct raparms * raparm_cache; - -+static int link_raw(struct dentry *dold, struct dentry *ddir, -+ struct dentry *dnew) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = dold }; -+ struct nameidata nd = { .dentry = ddir, .last = dnew->d_name }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->link_raw(&old_nd, &nd); -+ d_instantiate(dnew, dold->d_inode); -+ if(dold->d_inode->i_op && dold->d_inode->i_op->revalidate_it) -+ dold->d_inode->i_op->revalidate_it(dnew, NULL); -+ -+ return err; -+} -+ -+static int unlink_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->unlink_raw(&nd); -+ if (!err) -+ d_delete(rdentry); -+ -+ return err; -+} -+ -+static int rmdir_raw(struct dentry *dentry, char *fname, int flen, -+ struct dentry *rdentry) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->rmdir_raw(&nd); -+ if(!err) { -+ rdentry->d_inode->i_flags |= S_DEAD; -+ d_delete(rdentry); -+ } -+ -+ return err; -+} -+ -+static int symlink_raw(struct dentry *dentry, char *fname, int flen, -+ char *path) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->symlink_raw(&nd, path); -+ -+ return err; -+} -+ -+static int mkdir_raw(struct dentry *dentry, char *fname, int flen, int mode) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mkdir_raw(&nd, mode); -+ -+ return err; -+} -+ -+static int mknod_raw(struct dentry *dentry, char *fname, int flen, int mode, -+ dev_t dev) -+{ -+ int err; -+ struct qstr last = { .name = fname, .len = flen }; -+ struct nameidata nd = { .dentry = dentry, .last = last }; -+ struct inode_operations *op = nd.dentry->d_inode->i_op; -+ err = op->mknod_raw(&nd, mode, dev); -+ -+ return err; -+} -+ -+static int rename_raw(struct dentry *fdentry, struct dentry *tdentry, -+ struct dentry *odentry, struct dentry *ndentry) -+{ -+ int err; -+ -+ struct nameidata old_nd = { .dentry = fdentry, .last = odentry->d_name}; -+ struct nameidata new_nd = { .dentry = tdentry, .last = ndentry->d_name}; -+ struct inode_operations *op = old_nd.dentry->d_inode->i_op; -+ err = op->rename_raw(&old_nd, &new_nd); -+ d_move(odentry, ndentry); -+ -+ return err; -+} -+ -+static int setattr_raw(struct inode *inode, struct iattr *iap) -+{ -+ int err; -+ -+ iap->ia_valid |= ATTR_RAW; -+ err = inode->i_op->setattr_raw(inode, iap); -+ -+ return err; -+} -+ -+int revalidate_it(struct dentry *dentry, struct lookup_intent *it) -+{ -+ int err = 0; -+ -+ if (dentry && dentry->d_op && dentry->d_op->d_revalidate_it) { -+ if (!dentry->d_op->d_revalidate_it(dentry, 0, NULL, it) && -+ !d_invalidate(dentry)) { -+ dput(dentry); -+ err = -EINVAL; -+ dentry = NULL; -+ return err; -+ } -+ } -+ -+ return err; -+} -+ - /* - * Look up one component of a pathname. - * N.B. After this call _both_ fhp and resfh need an fh_put -@@ -302,7 +424,10 @@ nfsd_setattr(struct svc_rqst *rqstp, str - } - err = nfserr_notsync; - if (!check_guard || guardtime == inode->i_ctime) { -- err = notify_change(dentry, iap); -+ if ( dentry->d_inode->i_op && dentry->d_inode->i_op->setattr_raw) -+ err = setattr_raw(dentry->d_inode, iap); -+ else -+ err = notify_change(dentry, iap); - err = nfserrno(err); - } - if (size_change) { -@@ -429,6 +554,7 @@ nfsd_open(struct svc_rqst *rqstp, struct - { - struct dentry *dentry; - struct inode *inode; -+ struct lookup_intent it; - int err; - - /* If we get here, then the client has already done an "open", and (hopefully) -@@ -475,6 +601,14 @@ nfsd_open(struct svc_rqst *rqstp, struct - filp->f_mode = FMODE_READ; - } - -+ intent_init(&it, IT_OPEN, (filp->f_flags & ~O_ACCMODE) | filp->f_mode); -+ -+ err = revalidate_it(dentry, &it); -+ if (err) -+ goto out_nfserr; -+ -+ filp->f_it = ⁢ -+ - err = 0; - if (filp->f_op && filp->f_op->open) { - err = filp->f_op->open(inode, filp); -@@ -489,7 +623,11 @@ nfsd_open(struct svc_rqst *rqstp, struct - atomic_dec(&filp->f_count); - } - } -+ - out_nfserr: -+ if (it.it_op_release) -+ intent_release(&it); -+ - if (err) - err = nfserrno(err); - out: -@@ -820,7 +958,7 @@ nfsd_create(struct svc_rqst *rqstp, stru - { - struct dentry *dentry, *dchild; - struct inode *dirp; -- int err; -+ int err, error = -EOPNOTSUPP; - - err = nfserr_perm; - if (!flen) -@@ -836,20 +974,44 @@ nfsd_create(struct svc_rqst *rqstp, stru - dentry = fhp->fh_dentry; - dirp = dentry->d_inode; - -+ switch (type) { -+ case S_IFDIR: -+ if (dirp->i_op->mkdir_raw) -+ error = mkdir_raw(dentry, fname, flen, iap->ia_mode); -+ break; -+ case S_IFCHR: -+ case S_IFBLK: -+ case S_IFIFO: -+ case S_IFSOCK: -+ case S_IFREG: -+ if (dirp->i_op->mknod_raw) { -+ if (type == S_IFREG) -+ rdev = 0; -+ error = mknod_raw(dentry, fname, flen, iap->ia_mode, rdev); -+ } -+ break; -+ default: -+ printk("nfsd: bad file type %o in nfsd_create\n", type); -+ } -+ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - /* - * Check whether the response file handle has been verified yet. - * If it has, the parent directory should already be locked. - */ -- if (!resfhp->fh_dentry) { -- /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create */ -- fh_lock(fhp); -+ if (!resfhp->fh_dentry || dirp->i_op->lookup_it) { -+ /* called from nfsd_proc_mkdir, or possibly nfsd3_proc_create -+ and nfsd_proc_create in case of lustre -+ */ -+ if (!resfhp->fh_dentry) -+ fh_lock(fhp); - dchild = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dchild); - if (IS_ERR(dchild)) - goto out_nfserr; -+ resfhp->fh_dentry = NULL; - err = fh_compose(resfhp, fhp->fh_export, dchild, fhp); - if (err) - goto out; -@@ -870,10 +1032,12 @@ nfsd_create(struct svc_rqst *rqstp, stru - * Make sure the child dentry is still negative ... - */ - err = nfserr_exist; -- if (dchild->d_inode) { -- dprintk("nfsd_create: dentry %s/%s not negative!\n", -- dentry->d_name.name, dchild->d_name.name); -- goto out; -+ if ( error == -EOPNOTSUPP) { -+ if (dchild->d_inode) { -+ dprintk("nfsd_create: dentry %s/%s not negative!\n", -+ dentry->d_name.name, dchild->d_name.name); -+ goto out; -+ } - } - - if (!(iap->ia_valid & ATTR_MODE)) -@@ -886,16 +1050,19 @@ nfsd_create(struct svc_rqst *rqstp, stru - err = nfserr_perm; - switch (type) { - case S_IFREG: -- err = vfs_create(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_create(dirp, dchild, iap->ia_mode); - break; - case S_IFDIR: -- err = vfs_mkdir(dirp, dchild, iap->ia_mode); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mkdir(dirp, dchild, iap->ia_mode); - break; - case S_IFCHR: - case S_IFBLK: - case S_IFIFO: - case S_IFSOCK: -- err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); -+ if (error == -EOPNOTSUPP) -+ err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); - break; - default: - printk("nfsd: bad file type %o in nfsd_create\n", type); -@@ -964,7 +1131,13 @@ nfsd_create_v3(struct svc_rqst *rqstp, s - /* Get all the sanity checks out of the way before - * we lock the parent. */ - err = nfserr_notdir; -- if(!dirp->i_op || !dirp->i_op->lookup) -+ if (dirp->i_op->mknod_raw) { -+ err = mknod_raw(dentry, fname, flen, iap->ia_mode, 0); -+ if (err && err != -EOPNOTSUPP) -+ goto out; -+ } -+ -+ if(!dirp->i_op || !(dirp->i_op->lookup || dirp->i_op->lookup_it)) - goto out; - fh_lock(fhp); - -@@ -1015,6 +1188,8 @@ nfsd_create_v3(struct svc_rqst *rqstp, s - case NFS3_CREATE_GUARDED: - err = nfserr_exist; - } -+ if(dirp->i_op->mknod_raw) -+ err = 0; - goto out; - } - -@@ -1121,7 +1296,7 @@ nfsd_symlink(struct svc_rqst *rqstp, str - struct iattr *iap) - { - struct dentry *dentry, *dnew; -- int err, cerr; -+ int err, cerr, error = -EOPNOTSUPP; - - err = nfserr_noent; - if (!flen || !plen) -@@ -1135,12 +1310,18 @@ nfsd_symlink(struct svc_rqst *rqstp, str - goto out; - fh_lock(fhp); - dentry = fhp->fh_dentry; -+ -+ if (dentry->d_inode->i_op->symlink_raw) -+ error = symlink_raw(dentry, fname, flen, path); -+ - dnew = lookup_one_len(fname, dentry, flen); - err = PTR_ERR(dnew); - if (IS_ERR(dnew)) - goto out_nfserr; - -- err = vfs_symlink(dentry->d_inode, dnew, path); -+ err = error; -+ if (err == -EOPNOTSUPP || !dentry->d_inode->i_op->symlink_raw) -+ err = vfs_symlink(dentry->d_inode, dnew, path); - if (!err) { - if (EX_ISSYNC(fhp->fh_export)) - nfsd_sync_dir(dentry); -@@ -1210,7 +1391,10 @@ nfsd_link(struct svc_rqst *rqstp, struct - dold = tfhp->fh_dentry; - dest = dold->d_inode; - -- err = vfs_link(dold, dirp, dnew); -+ if (dirp->i_op->link_raw) -+ err = link_raw(dold, ddir, dnew); -+ else -+ err = vfs_link(dold, dirp, dnew); - if (!err) { - if (EX_ISSYNC(ffhp->fh_export)) { - nfsd_sync_dir(ddir); -@@ -1295,7 +1479,10 @@ nfsd_rename(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_rename(fdir, odentry, tdir, ndentry); -+ if(fdir->i_op->rename_raw) -+ err = rename_raw(fdentry, tdentry, odentry, ndentry); -+ else -+ err = vfs_rename(fdir, odentry, tdir, ndentry); - if (!err && EX_ISSYNC(tfhp->fh_export)) { - nfsd_sync_dir(tdentry); - nfsd_sync_dir(fdentry); -@@ -1316,7 +1503,7 @@ nfsd_rename(struct svc_rqst *rqstp, stru - fill_post_wcc(tfhp); - double_up(&tdir->i_sem, &fdir->i_sem); - ffhp->fh_locked = tfhp->fh_locked = 0; -- -+ - out: - return err; - } -@@ -1362,9 +1549,15 @@ nfsd_unlink(struct svc_rqst *rqstp, stru - err = nfserr_perm; - } else - #endif -- err = vfs_unlink(dirp, rdentry); -+ if (dirp->i_op->unlink_raw) -+ err = unlink_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_unlink(dirp, rdentry); - } else { /* It's RMDIR */ -- err = vfs_rmdir(dirp, rdentry); -+ if (dirp->i_op->rmdir_raw) -+ err = rmdir_raw(dentry, fname, flen, rdentry); -+ else -+ err = vfs_rmdir(dirp, rdentry); - } - - dput(rdentry); ---- linux-2.4.22-ac1/include/linux/fs.h~nfs_export_kernel-2.4.22-rh 2003-09-26 01:00:26.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/include/linux/fs.h 2003-10-08 13:44:53.000000000 +0400 -@@ -93,6 +93,9 @@ extern int leases_enable, dir_notify_ena - #define FS_SINGLE 8 /* Filesystem that can have only one superblock */ - #define FS_NOMOUNT 16 /* Never mount from userland */ - #define FS_LITTER 32 /* Keeps the tree in dcache */ -+#define FS_NFSEXP_FSID 64 /* Use file system specific fsid for -+ * exporting non device filesystems. -+ */ - #define FS_ALWAYS_REVAL 16384 /* Always revalidate dentries returned by - link_path_walk */ - #define FS_ODD_RENAME 32768 /* Temporary stuff; will go away as soon -@@ -1121,6 +1124,9 @@ extern int open_namei_it(const char *fil - struct nameidata *nd, struct lookup_intent *it); - extern struct file *dentry_open_it(struct dentry *dentry, struct vfsmount *mnt, - int flags, struct lookup_intent *it); -+extern int revalidate_it(struct dentry *dentry, struct lookup_intent *it); -+extern int init_private_file_it(struct file *, struct dentry *dentry, int mode, -+ struct lookup_intent *it); - extern int filp_close(struct file *, fl_owner_t id); - extern char * getname(const char *); - -@@ -1420,6 +1426,8 @@ extern void path_release(struct nameidat - extern int follow_down(struct vfsmount **, struct dentry **); - extern int follow_up(struct vfsmount **, struct dentry **); - extern struct dentry * lookup_one_len(const char *, struct dentry *, int); -+extern struct dentry * lookup_one_len_it(const char *, struct dentry *, int, -+ struct lookup_intent *); - extern struct dentry * lookup_hash(struct qstr *, struct dentry *); - #define user_path_walk(name,nd) __user_walk(name, LOOKUP_FOLLOW|LOOKUP_POSITIVE, nd) - #define user_path_walk_link(name,nd) __user_walk(name, LOOKUP_POSITIVE, nd) -@@ -1439,7 +1447,8 @@ typedef int (*find_inode_t)(struct inode - - extern struct inode * iget4_locked(struct super_block *, unsigned long, - find_inode_t, void *); -- -+extern struct inode * ilookup4(struct super_block *, unsigned long, -+ find_inode_t, void *); - static inline struct inode *iget4(struct super_block *sb, unsigned long ino, - find_inode_t find_actor, void *opaque) - { ---- linux-2.4.22-ac1/kernel/ksyms.c~nfs_export_kernel-2.4.22-rh 2003-09-26 00:57:28.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/kernel/ksyms.c 2003-10-08 13:45:20.000000000 +0400 -@@ -165,6 +165,7 @@ EXPORT_SYMBOL(fget); - EXPORT_SYMBOL(igrab); - EXPORT_SYMBOL(iunique); - EXPORT_SYMBOL(iget4_locked); -+EXPORT_SYMBOL(ilookup4); - EXPORT_SYMBOL(unlock_new_inode); - EXPORT_SYMBOL(iput); - EXPORT_SYMBOL(inode_init_once); -@@ -178,6 +179,7 @@ EXPORT_SYMBOL(path_walk); - EXPORT_SYMBOL(path_release); - EXPORT_SYMBOL(__user_walk); - EXPORT_SYMBOL(lookup_one_len); -+EXPORT_SYMBOL(lookup_one_len_it); - EXPORT_SYMBOL(lookup_hash); - EXPORT_SYMBOL(sys_close); - EXPORT_SYMBOL(dcache_lock); - -_ diff --git a/lustre/kernel_patches/patches/nfs_export_kernel-2.4.22.patch b/lustre/kernel_patches/patches/nfs_export_kernel-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/nfs_export_kernel-2.4.22.patch rename to lustre/kernel_patches/patches/nfs_export_kernel-2.4.24.patch diff --git a/lustre/kernel_patches/patches/pagecache-lock-2.4.21-chaos.patch b/lustre/kernel_patches/patches/pagecache-lock-2.4.21-chaos.patch deleted file mode 100644 index 88f951b9ca..0000000000 --- a/lustre/kernel_patches/patches/pagecache-lock-2.4.21-chaos.patch +++ /dev/null @@ -1,21 +0,0 @@ -Index: linux-2.4.21-chaos/include/linux/swap.h -=================================================================== ---- linux-2.4.21-chaos.orig/include/linux/swap.h 2003-12-12 16:24:33.000000000 +0300 -+++ linux-2.4.21-chaos/include/linux/swap.h 2003-12-12 16:41:15.000000000 +0300 -@@ -95,7 +95,7 @@ - extern atomic_t page_cache_size; - extern atomic_t buffermem_pages; - --#if 1 -+#if 0 - - static inline void - lock_pagecache(void) { br_write_lock(BR_PAGECACHE_LOCK); } -@@ -110,6 +110,7 @@ - - extern spinlock_cacheline_t pagecache_lock_cacheline; - #define __pagecache_lock (pagecache_lock_cacheline.lock) -+#define pagecache_lock (pagecache_lock_cacheline.lock) - - static inline void - lock_pagecache(void) { spin_lock(&__pagecache_lock); } diff --git a/lustre/kernel_patches/patches/procfs-ndynamic-2.4.21-suse2.patch b/lustre/kernel_patches/patches/procfs-ndynamic-2.4.21-suse2.patch deleted file mode 100644 index 65f4926cc6..0000000000 --- a/lustre/kernel_patches/patches/procfs-ndynamic-2.4.21-suse2.patch +++ /dev/null @@ -1,16 +0,0 @@ -Index: linux-2.4.21-suse2/include/linux/proc_fs.h -=================================================================== ---- linux-2.4.21-suse2.orig/include/linux/proc_fs.h 2004-01-12 09:56:51.000000000 +0300 -+++ linux-2.4.21-suse2/include/linux/proc_fs.h 2004-01-12 20:25:55.000000000 +0300 -@@ -25,11 +25,7 @@ - /* Finally, the dynamically allocatable proc entries are reserved: */ - - #define PROC_DYNAMIC_FIRST 4096 --#ifdef CONFIG_PPC64 - #define PROC_NDYNAMIC 16384 --#else --#define PROC_NDYNAMIC 4096 --#endif - - #define PROC_SUPER_MAGIC 0x9fa0 - diff --git a/lustre/kernel_patches/patches/procfs-ndynamic-2.4.patch b/lustre/kernel_patches/patches/procfs-ndynamic-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/procfs-ndynamic-2.4.patch rename to lustre/kernel_patches/patches/procfs-ndynamic-2.4.24.patch diff --git a/lustre/kernel_patches/patches/qlogic-suse-2.4.21-2.patch b/lustre/kernel_patches/patches/qlogic-suse-2.4.21-2.patch deleted file mode 100644 index b082a07eff..0000000000 --- a/lustre/kernel_patches/patches/qlogic-suse-2.4.21-2.patch +++ /dev/null @@ -1,75673 +0,0 @@ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/BUILD_KERNEL.txt linux-2.4.21-x86_64/drivers/scsi/qla2xxx/BUILD_KERNEL.txt ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/BUILD_KERNEL.txt 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/BUILD_KERNEL.txt 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,216 @@ -+ Build a Custom kernel with QLogic Fibre Channel Driver -+ -+1.0 Building a Custom Kernel to Load the Driver -+------------------------------------------------- -+ -+Since it is not feasible to construct a single set of kernel build -+instructions for every possible hardware or software configuration, -+the following instructions are provided as an example of how to compile -+the driver into the Linux kernel. The user may be required to make -+some adjustments in the procedure for their particular system hardware -+or software configuration. The kernel source tree is referenced below -+as /usr/src/linux. -+ -+ -+This process is only supported on RedHat 7.1/7.2 and SuSE 7.3/ -+Enterprise 7. The kernel source tree is referenced below -+as /usr/src/linux. Under the RedHat distribution, the normal -+directory path is /usr/src/linux-2.4. For SuSE distributions, -+the kernel source is usually located in /usr/src/linux. -+ -+Prerequisites: -+ -+ a) Verify that both kernel-headers and kernel-source -+ RPMS are already installed. -+ -+ # rpm -qa | grep kernel -+ -+ If the kernel-headers and kernel-source RPMs are -+ not installed, install from the distribution's CD -+ with the following commands: -+ -+ # rpm -i kernel-sources* -+ # rpm -i kernel-headers* -+ -+1. Make a special QLogic Directory under kernel source tree -+ -+ # mkdir /usr/src/linux/drivers/scsi/qla2xxx/ -+ # cd /usr/src/linux/drivers/scsi/qla2xxx/ -+ # tar xvzf qla2x00src-v6.0.X.tgz -+ # rm -f makefile -+ # cp -f Makefile.kernel Makefile -+ -+2. Edit the Makefile under the kernel scsi directory -+ -+ # cd /usr/src/linux/drivers/scsi -+ # vi Makefile -+ -+ Look for the following line: -+ -+ subdir-$(CONFIG_SCSI_AIC7XXX) += aic7xxx -+ -+ And add the following lines: -+ -+ subdir-$(CONFIG_SCSI_QLOGIC_QLA2XXX) += qla2xxx -+ ifeq ($(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2200),y) -+ SUB_DIRS += qla2xxx -+ MOD_IN_SUB_DIRS += qla2xxx -+ else -+ ifeq ($(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2200),m) -+ MOD_IN_SUB_DIRS += qla2xxx -+ endif -+ endif -+ ifeq ($(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2300),y) -+ SUB_DIRS += qla2xxx -+ MOD_IN_SUB_DIRS += qla2xxx -+ else -+ ifeq ($(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2300),m) -+ MOD_IN_SUB_DIRS += qla2xxx -+ endif -+ endif -+ -+ The edited lines should read as: -+ -+ subdir-$(CONFIG_SCSI_AIC7XXX) += aic7xxx -+ subdir-$(CONFIG_SCSI_QLOGIC_QLA2XXX) += qla2xxx -+ ifeq ($(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2200),y) -+ SUB_DIRS += qla2xxx -+ MOD_IN_SUB_DIRS += qla2xxx -+ else -+ ifeq ($(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2200),m) -+ MOD_IN_SUB_DIRS += qla2xxx -+ endif -+ endif -+ ifeq ($(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2300),y) -+ SUB_DIRS += qla2xxx -+ MOD_IN_SUB_DIRS += qla2xxx -+ else -+ ifeq ($(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2300),m) -+ MOD_IN_SUB_DIRS += qla2xxx -+ endif -+ endif -+ -+ NOTE: For Redhat Distributions (7.1 and 7.2) :- -+ -+ Locate the following line: -+ -+ obj-$(CONFIG_SCSI_QLOGIC_QLA2100) += qla2x00.o -+ -+ Add the following lines below that: -+ -+ obj-$(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2200) += qla2xxx/qla2200.o -+ obj-$(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2300) += qla2xxx/qla2300.o -+ -+ Append the following lines to the end of the Makefile: -+ -+ qla2xxx/qla2200.o: -+ cd qla2xxx; make qla2200.o -+ -+ qla2xxx/qla2300.o: -+ cd qla2xxx; make qla2300.o -+ -+ NOTE: For SuSE Distributions (7.2 and 7.3) :- -+ -+ Locate the following line: -+ -+ obj-$(CONFIG_SCSI_QLOGIC_QLA2200) += qla2200.o -+ obj-$(CONFIG_SCSI_QLOGIC_QLA2300) += qla2300.o -+ -+ Add the following lines below that: -+ -+ obj-$(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2200) += qla2xxx/qla2200.o -+ obj-$(CONFIG_SCSI_QLOGIC_QLA2XXX_QLA2300) += qla2xxx/qla2300.o -+ -+ Append the following lines to the end of the Makefile: -+ -+ qla2xxx/qla2200.o: -+ cd qla2xxx; make qla2200.o -+ -+ qla2xxx/qla2300.o: -+ cd qla2xxx; make qla2300.o -+ -+4. Edit the Config.in file under the kernel scsi directory -+ -+ # cd /usr/src/linux/drivers/scsi -+ # vi Config.in -+ -+ NOTE: For Redhat Distributions (7.1 and 7.2) :- -+ -+ Locate the following lines: -+ -+ dep_tristate 'Qlogic QLA 2100 FC SCSI support' CONFIG_SCSI_QLOGIC_QLA2100 $CONFIG_SCSI -+ dep_tristate 'Qlogic QLA 2200 FC SCSI support' CONFIG_SCSI_QLOGIC_QLA2200 $CONFIG_SCSI -+ -+ Add the following line below that: -+ -+ source drivers/scsi/qla2xxx/Config.in -+ -+ NOTE: For SuSE Distributions (7.2 and 7.3) :- -+ -+ Locate the following lines: -+ -+ dep_tristate 'Qlogic QLA2200 SCSI support' CONFIG_SCSI_QLOGIC_QLA2200 $CONFIG_SCSI -+ dep_tristate 'Qlogic QLA2300 SCSI support' CONFIG_SCSI_QLOGIC_QLA2300 $CONFIG_SCSI -+ -+ Add the following lines below that: -+ -+ source drivers/scsi/qla2xxx/Config.in -+ -+5. Remove any reference to older QLogic FC drivers -+ -+ 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: -+ -+ For Redhat Distributions (7.2 with 2.4.9-21 or above) :- -+ -+ # cd /usr/src/linux/drivers/addon/qla2200 -+ # mv qla2200.o qla2200_rh.o -+ # mv qla2300.o qla2300_rh.o -+ # cd /lib/modules/<kernel_version>/kernel/drivers/addon/qla2200 -+ # mv qla2200.o qla2200_rh.o -+ # mv qla2300.o qla2300_rh.o -+ -+ For SuSE Distributions (Enterprise 7 and above, 7.3 and above) :- -+ -+ # cd /usr/src/linux/drivers/scsi -+ # mv qla2200.o qla2200_su.o -+ # mv qla2300.o qla2300_su.o -+ # cd /lib/modules/<kernel_version>/kernel/drivers/scsi -+ # mv qla2200.o qla2200_su.o -+ # mv qla2300.o qla2300_su.o -+ -+6. Configure the kernel to load the new QLogic driver. -+ -+ # cd /usr/src/linux -+ # make menuconfig -+ -+ - Select "SCSI Support" <Enter> -+ -+ - Select "SCSI Generic Support" <Space bar> <Space bar> -+ -+ - Select "SCSI low-level drivers" <Enter> -+ -+ - Select "Qlogic QLA 2XXX v6 FC SCSI support" <Enter> -+ -+ - Select "Qlogic QLA 2200 v6 FC SCSI support" <Space bar> <Space bar> -+ -+ OR -+ -+ - Select "Qlogic QLA 2300 v6 FC SCSI support" <Space bar> <Space bar> -+ -+ - Select Exit to go back to the SCSI Support menu. -+ -+ - Select Exit to go back to the Main Menu. -+ -+ - Select Exit to exit the Main Menu. -+ -+ The system prompts: "Do you wish to save your new kernel -+ configuration?" Select "Yes." The system saves a new config -+ file called ".config" in the current directory. -+ -+7. Build Kernel -+ -+ # make dep bzImage modules modules_install -+ -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/drvrinstall linux-2.4.21-x86_64/drivers/scsi/qla2xxx/drvrinstall ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/drvrinstall 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/drvrinstall 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,9 @@ -+#!/bin/bash -+ -+# Install QLA2X00 driver. -+ -+echo "Extracting QLogic driver source..." -+ -+tar xfz ./qla2x00src-*.tgz -+ -+echo "Done." -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/exioct.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/exioct.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/exioct.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/exioct.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -195,6 +195,8 @@ - * EXT_SC_GET_BEACON_STATE,EXT_SC_SET_BEACON_STATE for the - * led blinking feature. - * -+ * Rev. 5.30 July 21, 2003 -+ * RL - Added new statistics fields in HBA_PORT_STAT struct. - */ - - #ifndef _EXIOCT_H -@@ -651,6 +653,7 @@ typedef struct _EXT_DEST_ADDR { - #define EXT_DEF_DESTTYPE_SCSI 5 - - /* Statistic */ -+#if defined(linux) /* Linux */ - typedef struct _EXT_HBA_PORT_STAT { - UINT32 ControllerErrorCount; /* 4 */ - UINT32 DeviceErrorCount; /* 4 */ -@@ -664,8 +667,35 @@ typedef struct _EXT_HBA_PORT_STAT { - UINT32 PrimitiveSeqProtocolErrorCount;/* 4 */ - UINT32 InvalidTransmissionWordCount; /* 4 */ - UINT32 InvalidCRCCount; /* 4 */ -- UINT32 Reserved[16]; /* 64 */ -+ uint64_t InputRequestCount; /* 8 */ -+ uint64_t OutputRequestCount; /* 8 */ -+ uint64_t ControlRequestCount; /* 8 */ -+ uint64_t InputMBytes; /* 8 */ -+ uint64_t OutputMBytes; /* 8 */ -+ UINT32 Reserved[6]; /* 24 */ - } EXT_HBA_PORT_STAT, *PEXT_HBA_PORT_STAT; /* 112 */ -+#else -+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 */ -+ UINT64 InputRequestCount; /* 8 */ -+ UINT64 OutputRequestCount; /* 8 */ -+ UINT64 ControlRequestCount; /* 8 */ -+ UINT64 InputMBytes; /* 8 */ -+ UINT64 OutputMBytes; /* 8 */ -+ UINT32 Reserved[6]; /* 24 */ -+} EXT_HBA_PORT_STAT, *PEXT_HBA_PORT_STAT; /* 112 */ -+#endif - - - /* Driver property */ -@@ -757,7 +787,8 @@ typedef struct _EXT_SCSI_PASSTHRU { - UINT8 Direction; - UINT8 CdbLength; - UINT8 Cdb[EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH]; -- UINT32 Reserved[14]; -+ UINT32 Timeout; -+ UINT32 Reserved[13]; - UINT16 Reserved2; - UINT16 SenseLength; - UINT8 SenseData[256]; -@@ -769,7 +800,8 @@ typedef struct _EXT_FC_SCSI_PASSTHRU { - UINT8 Direction; - UINT8 CdbLength; - UINT8 Cdb[EXT_DEF_SCSI_PASSTHRU_CDB_LENGTH]; -- UINT32 Reserved[14]; -+ UINT32 Timeout; -+ UINT32 Reserved[13]; - UINT16 Reserved2; - UINT16 SenseLength; - UINT8 SenseData[256]; -@@ -821,6 +853,7 @@ typedef struct _EXT_ASYNC_EVENT { - #define EXT_DEF_GET_HIDDEN_DEVICE 0x4 - #define EXT_DEF_GET_FABRIC_DEVICE 0x8 - #define EXT_DEF_GET_LOOP_DEVICE 0x10 -+#define EXT_DEF_GET_TRUE_NN_DEVICE 0x1000 - - /* Each entry in device database */ - typedef struct _EXT_DEVICEDATAENTRY -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/exioctln.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/exioctln.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/exioctln.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/exioctln.h 2004-04-22 19:42:21.000000000 -0700 -@@ -149,7 +149,7 @@ typedef struct track_instance { - _IOWR(QLMULTIPATH_MAGIC, idx, sizeof(EXT_IOCTL)) - - #ifndef APILIB -- #if CONFIG_PPC64 -+ #if defined(QLA_CONFIG_COMPAT) - #define QL_IOCTL_CMD(idx) (QL_IOCTL_BASE(idx) - 0x40000) - #else - #define QL_IOCTL_CMD(idx) QL_IOCTL_BASE(idx) -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/inioct.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/inioct.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/inioct.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/inioct.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/libinstall linux-2.4.21-x86_64/drivers/scsi/qla2xxx/libinstall ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/libinstall 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/libinstall 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,77 @@ -+#!/bin/sh -+ -+# Install QLSDM library. Check /etc/hba.conf -+ -+echo "Setting up QLogic HBA API library..." -+echo "Please make sure the /usr/lib/libqlsdm.so file is not in use." -+ -+APIDIR=ApiPkg -+ -+mkdir -p ${APIDIR} -+cd ${APIDIR} -+ -+tar xfz ../qlapi*rel.tgz -+ -+# Make sure we install with correct permission -+ -+chmod 500 ./lib/* -+ -+# First, some clean up. -+MAIN_QLLIB_COPY=./lib/libqlsdm.so -+rm -f $MAIN_QLLIB_COPY -+rm -f /usr/lib/libqlsdm.a -+ -+# Right now we only support/check for IA32 and IA64 bit platforms. -+# Later need to add support for PPC64 -+ -+if [ $HOSTTYPE == ia64 ] -+then -+ ln ./lib/libqlsdm-ia64.so $MAIN_QLLIB_COPY -+else -+ ln ./lib/libqlsdm-ia32.so $MAIN_QLLIB_COPY -+fi -+ -+cp --suffix=.bak --backup=simple $MAIN_QLLIB_COPY /usr/lib -+ -+# Now check the hba.conf file -+ -+if [ -s /etc/hba.conf ] -+then -+ -+ if [ -r /etc/hba.conf ] && [ -w /etc/hba.conf ] -+ then -+ grep -v qla2x00 /etc/hba.conf > ./tmp.conf -+ -+ if [ -s ./tmp.conf ] -+ then -+ rm -f /etc/hba.conf.bak -+ mv /etc/hba.conf /etc/hba.conf.bak -+ sed '$r ./hba.conf' ./tmp.conf > /etc/hba.conf -+ fi -+ -+ rm ./tmp.conf -+ else -+ echo "Cannot update /etc/hba.conf. Permission denied." -+ exit -+ fi -+ -+else -+ cp ./hba.conf /etc -+fi -+ -+# Now check the library data file -+ -+if [ -s /tmp/qlsdm.dat ] -+then -+ if [ -r /tmp/qlsdm.dat ] && [ -w /tmp/qlsdm.dat ] -+ then -+ rm -f /tmp/qlsdm.dat -+ else -+ echo "Cannot delete /tmp/qlsdm.dat. Permission denied." -+ exit -+ fi -+fi -+ -+echo "Done." -+ -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/libremove linux-2.4.21-x86_64/drivers/scsi/qla2xxx/libremove ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/libremove 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/libremove 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,13 @@ -+#!/bin/bash -+ -+# Remove QLSDM library. Edit /etc/hba.conf -+ -+echo "Removing QLogic HBA API library..." -+ -+rm -rf /usr/lib/libqlsdm.so -+grep -v qla2x00 /etc/hba.conf > /tmp/tmp.conf -+cp --suffix=.bak --backup=simple /tmp/tmp.conf /etc/hba.conf -+rm /tmp/tmp.conf -+rm -f /tmp/qlsdm.dat -+ -+echo "Done." -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/listops.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/listops.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/listops.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/listops.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -31,6 +31,47 @@ - pos = n, n = pos->next ) - #endif - -+ -+#if !defined(list_for_each_entry) -+#define list_for_each_entry(pos, head, member) \ -+ for (pos = list_entry((head)->next, typeof(*pos), member); \ -+ &pos->member != (head); \ -+ pos = list_entry(pos->member.next, typeof(*pos), member)) -+ -+#endif -+#if !defined(list_for_each_entry_safe) -+#define list_for_each_entry_safe(pos, n, head, member) \ -+ for (pos = list_entry((head)->next, typeof(*pos), member), \ -+ n = list_entry(pos->member.next, typeof(*pos), member); \ -+ &pos->member != (head); \ -+ pos = n, n = list_entry(n->member.next, typeof(*n), member)) -+#endif -+ -+/* Non-standard definitions. */ -+static inline void __qla_list_splice(struct list_head *list, -+ struct list_head *head) -+{ -+ struct list_head *first = list->next; -+ struct list_head *last = list->prev; -+ struct list_head *at = head->next; -+ -+ first->prev = head; -+ head->next = first; -+ -+ last->next = at; -+ at->prev = last; -+ -+} -+ -+static inline void qla_list_splice_init(struct list_head *list, -+ struct list_head *head) -+{ -+ if (!list_empty(list)) { -+ __qla_list_splice(list, head); -+ INIT_LIST_HEAD(list); -+ } -+} -+ - /* __add_to_done_queue() - * - * Place SRB command on done queue. -@@ -96,7 +137,6 @@ __add_to_retry_queue(struct scsi_qla_hos - 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; - } -@@ -177,8 +217,6 @@ __del_from_retry_queue(struct scsi_qla_h - { - 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--; -@@ -309,15 +347,20 @@ __add_to_pending_queue_head(struct scsi_ - sp->state = SRB_PENDING_STATE; - } - --static inline void -+/* returns 1 if the queue was empty before the add */ -+static inline int - add_to_pending_queue(struct scsi_qla_host *ha, srb_t *sp) - { - unsigned long flags; -- -+ int ret; -+ - spin_lock_irqsave(&ha->list_lock, flags); -+ ret = list_empty(&ha->pending_queue); - __add_to_pending_queue(ha, sp); - spin_unlock_irqrestore(&ha->list_lock, flags); -+ return ret; - } -+ - static inline void - add_to_pending_queue_head(struct scsi_qla_host *ha, srb_t *sp) - { -@@ -394,4 +437,4 @@ del_from_pending_queue(struct scsi_qla_h - - spin_unlock_irqrestore(&ha->list_lock, flags); - } -- -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/Makefile linux-2.4.21-x86_64/drivers/scsi/qla2xxx/Makefile ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/Makefile 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/Makefile 2004-04-22 19:42:21.000000000 -0700 -@@ -16,6 +16,52 @@ ifeq ($(CONFIG_SMP),y) - QLA_FLAGS += -D__SMP__ -DCONFIG_SMP - endif - -+SHT_FLAGS := $(CFLAGS) -+check_sht = $(shell \ -+ echo "\#include <linux/config.h>" > check_sht.c ; \ -+ echo "\#include <linux/version.h>" >> check_sht.c ; \ -+ echo "\#include <linux/types.h>" >> check_sht.c ; \ -+ echo "\#include <linux/init.h>" >> check_sht.c ; \ -+ echo "\#include <linux/blk.h>" >> check_sht.c ; \ -+ echo "\#include \"sd.h\"" >> check_sht.c ; \ -+ echo "\#include \"scsi.h\"" >> check_sht.c ; \ -+ echo "\#include \"hosts.h\"" >> check_sht.c ; \ -+ echo "struct SHT test_sht;" >> check_sht.c ; \ -+ echo "void test_func(void) { test_sht.$(1) = 1; }" >> check_sht.c ; \ -+ if $(CC) $(SHT_FLAGS) -o /dev/null -c check_sht.c > /dev/null 2>&1 ; \ -+ then \ -+ echo "$(2)" ; \ -+ fi ; \ -+ rm check_sht*) -+ -+QLA_FLAGS += $(call check_sht,highmem_io,-DSHT_HAS_HIGHMEM_IO) -+QLA_FLAGS += $(call check_sht,can_dma_32,-DSHT_HAS_CAN_DMA_32) -+QLA_FLAGS += $(call check_sht,single_sg_ok,-DSHT_HAS_SINGLE_SG_OK) -+QLA_FLAGS += $(call check_sht,can_do_varyio,-DSHT_HAS_CAN_DO_VARYIO) -+QLA_FLAGS += $(call check_sht,vary_io,-DSHT_HAS_VARY_IO) -+QLA_FLAGS += $(call check_sht,need_plug_timer,-DSHT_HAS_NEED_PLUG_TIMER) -+ -+SH_FLAGS := $(CFLAGS) -+check_sh = $(shell \ -+ echo "\#include <linux/config.h>" > check_sh.c ; \ -+ echo "\#include <linux/version.h>" >> check_sh.c ; \ -+ echo "\#include <linux/types.h>" >> check_sh.c ; \ -+ echo "\#include <linux/init.h>" >> check_sh.c ; \ -+ echo "\#include <linux/blk.h>" >> check_sh.c ; \ -+ echo "\#include \"sd.h\"" >> check_sh.c ; \ -+ echo "\#include \"scsi.h\"" >> check_sh.c ; \ -+ echo "\#include \"hosts.h\"" >> check_sh.c ; \ -+ echo "struct Scsi_Host test_sh;" >> check_sh.c ; \ -+ echo "void test_func(void) { test_sh.$(1) = 0; }" >> check_sh.c ; \ -+ if $(CC) $(SH_FLAGS) -o /dev/null -c check_sh.c > /dev/null 2>&1 ; \ -+ then \ -+ echo "$(2)" ; \ -+ fi ; \ -+ rm check_sh*) -+ -+QLA_FLAGS += $(call check_sh,host_lock,-DSH_HAS_HOST_LOCK) -+QLA_FLAGS += $(call check_sh,can_queue_mask,-DSH_HAS_CAN_QUEUE_MASK) -+ - qla2100.o: $(SRC_FILES) - $(CC) $(CFLAGS) $(QLA_FLAGS) -DISP2100 -c qla2100.c -o $@ - -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2100_fw.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2100_fw.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2100_fw.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2100_fw.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2200_fw.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2200_fw.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2200_fw.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2200_fw.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -25,7 +25,7 @@ - * * - ************************************************************************/ - /* -- * Firmware Version 2.02.04 (08:24 Feb 28, 2003) -+ * Firmware Version 2.02.06 (08:46 Jun 26, 2003) - */ - - #ifdef UNIQUE_FW_NAME -@@ -35,15 +35,15 @@ unsigned short risc_code_version = 2*102 - #endif - - #ifdef UNIQUE_FW_NAME --unsigned char fw2200tp_version_str[] = {2,2,4}; -+unsigned char fw2200tp_version_str[] = {2,2,6}; - #else --unsigned char firmware_version[] = {2,2,4}; -+unsigned char firmware_version[] = {2,2,6}; - #endif - - #ifdef UNIQUE_FW_NAME --#define fw2200tp_VERSION_STRING "2.02.04" -+#define fw2200tp_VERSION_STRING "2.02.06" - #else --#define FW_VERSION_STRING "2.02.04" -+#define FW_VERSION_STRING "2.02.06" - #endif - - #ifdef UNIQUE_FW_NAME -@@ -57,17 +57,17 @@ unsigned short fw2200tp_code01[] = { - #else - unsigned short risc_code01[] = { - #endif -- 0x0470, 0x0000, 0x0000, 0xa463, 0x0000, 0x0002, 0x0002, 0x0004, -+ 0x0470, 0x0000, 0x0000, 0xa46f, 0x0000, 0x0002, 0x0002, 0x0006, - 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, 0x3420, 0x2020, 0x2020, 0x2400, 0x20c1, -+ 0x322e, 0x3032, 0x2e30, 0x3620, 0x2020, 0x2020, 0x2400, 0x20c1, - 0x0005, 0x2001, 0x017f, 0x2003, 0x0000, 0x20c9, 0xbaff, 0x2091, - 0x2000, 0x2059, 0x0000, 0x2b78, 0x7823, 0x0004, 0x2089, 0x296a, - 0x2051, 0xb500, 0x2a70, 0x2029, 0xed00, 0x2031, 0xffff, 0x2039, -- 0xece9, 0x2021, 0x0200, 0x0804, 0x1468, 0x20a1, 0xb463, 0xa00e, -- 0x20a9, 0x089d, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a, -+ 0xece9, 0x2021, 0x0200, 0x0804, 0x1468, 0x20a1, 0xb46f, 0xa00e, -+ 0x20a9, 0x0891, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a, - 0x746e, 0x20a1, 0xbd00, 0x7164, 0x810d, 0x810d, 0x810d, 0x810d, - 0xa18c, 0x000f, 0x2001, 0x000b, 0xa112, 0xa00e, 0x21a8, 0x41a4, - 0x3400, 0x8211, 0x1dd8, 0x7164, 0x3400, 0xa102, 0x0120, 0x0218, -@@ -76,65 +76,65 @@ unsigned short risc_code01[] = { - 0xa112, 0x20a1, 0x1000, 0xa00e, 0x21a8, 0x41a4, 0x8211, 0x1de0, - 0x2009, 0xb500, 0x3400, 0xa102, 0x0120, 0x0218, 0x20a8, 0xa00e, - 0x41a4, 0x080c, 0x1411, 0x080c, 0x1632, 0x080c, 0x17cf, 0x080c, -- 0x1fa2, 0x080c, 0x4c00, 0x080c, 0x85b9, 0x080c, 0x15bb, 0x080c, -- 0x2ec4, 0x080c, 0x5d8b, 0x080c, 0x5342, 0x080c, 0x68cf, 0x080c, -- 0x2510, 0x080c, 0x6b62, 0x080c, 0x63bc, 0x080c, 0x23ca, 0x080c, -+ 0x1fa2, 0x080c, 0x4bff, 0x080c, 0x85bf, 0x080c, 0x15bb, 0x080c, -+ 0x2ec4, 0x080c, 0x5d8a, 0x080c, 0x5341, 0x080c, 0x68ce, 0x080c, -+ 0x2510, 0x080c, 0x6b61, 0x080c, 0x63bb, 0x080c, 0x23ca, 0x080c, - 0x24de, 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, 0x3f09, 0x080c, -- 0x2eeb, 0x080c, 0x5dd9, 0x080c, 0x54f1, 0x080c, 0x68fa, 0x0c80, -+ 0x2a70, 0x7000, 0xa08e, 0x0003, 0x1158, 0x080c, 0x3f08, 0x080c, -+ 0x2eeb, 0x080c, 0x5dd8, 0x080c, 0x54f0, 0x080c, 0x68f9, 0x0c80, - 0x000b, 0x0c98, 0x10e4, 0x10e5, 0x1210, 0x10e2, 0x12dd, 0x140e, - 0x140f, 0x1410, 0x080c, 0x1515, 0x0005, 0x0126, 0x00f6, 0x2091, - 0x8000, 0x7000, 0xa086, 0x0001, 0x1904, 0x11ed, 0x080c, 0x1588, -- 0x080c, 0x5ad0, 0x0150, 0x080c, 0x5af6, 0x15c0, 0x2079, 0x0100, -- 0x7828, 0xa085, 0x1800, 0x782a, 0x0488, 0x080c, 0x5a08, 0x7000, -+ 0x080c, 0x5acf, 0x0150, 0x080c, 0x5af5, 0x15c0, 0x2079, 0x0100, -+ 0x7828, 0xa085, 0x1800, 0x782a, 0x0488, 0x080c, 0x5a07, 0x7000, - 0xa086, 0x0001, 0x1904, 0x11ed, 0x708c, 0xa086, 0x0028, 0x1904, - 0x11ed, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827, -- 0xffff, 0x7a28, 0xa295, 0x1e2f, 0x7a2a, 0x2011, 0x59a3, 0x080c, -- 0x699d, 0x2011, 0x5996, 0x080c, 0x6a5d, 0x2011, 0x59e5, 0x080c, -- 0x699d, 0x2011, 0x4add, 0x080c, 0x699d, 0x2011, 0x8030, 0x2019, -- 0x0000, 0x708b, 0x0000, 0x080c, 0x1de9, 0x00e8, 0x080c, 0x4490, -- 0x2079, 0x0100, 0x7844, 0xa005, 0x1904, 0x11ed, 0x2011, 0x4add, -- 0x080c, 0x699d, 0x2011, 0x59e5, 0x080c, 0x699d, 0x080c, 0x1de9, -+ 0xffff, 0x7a28, 0xa295, 0x1e2f, 0x7a2a, 0x2011, 0x59a2, 0x080c, -+ 0x699c, 0x2011, 0x5995, 0x080c, 0x6a5c, 0x2011, 0x59e4, 0x080c, -+ 0x699c, 0x2011, 0x4adc, 0x080c, 0x699c, 0x2011, 0x8030, 0x2019, -+ 0x0000, 0x708b, 0x0000, 0x080c, 0x1de9, 0x00e8, 0x080c, 0x448f, -+ 0x2079, 0x0100, 0x7844, 0xa005, 0x1904, 0x11ed, 0x2011, 0x4adc, -+ 0x080c, 0x699c, 0x2011, 0x59e4, 0x080c, 0x699c, 0x080c, 0x1de9, - 0x2001, 0xb78d, 0x2004, 0x780e, 0x7840, 0xa084, 0xfffb, 0x7842, -- 0x2011, 0x8010, 0x73cc, 0x080c, 0x3ecd, 0x723c, 0xc284, 0x723e, -- 0x2001, 0xb50c, 0x200c, 0xc1ac, 0x2102, 0x080c, 0x7f36, 0x2011, -- 0x0004, 0x080c, 0x9c5a, 0x080c, 0x524e, 0x080c, 0x5ad0, 0x0158, -- 0x080c, 0x4be9, 0x0140, 0x708b, 0x0001, 0x70c7, 0x0000, 0x080c, -- 0x462d, 0x0804, 0x11ed, 0x080c, 0x530a, 0x0120, 0x7a0c, 0xc2b4, -- 0x7a0e, 0x0060, 0x7073, 0x0000, 0x080c, 0xa002, 0x70d4, 0xd09c, -- 0x1128, 0x70a0, 0xa005, 0x0110, 0x080c, 0x4bc7, 0x70df, 0x0000, -- 0x70db, 0x0000, 0x72d4, 0x080c, 0x5ad0, 0x1178, 0x2011, 0x0000, -+ 0x2011, 0x8010, 0x73cc, 0x080c, 0x3ecc, 0x723c, 0xc284, 0x723e, -+ 0x2001, 0xb50c, 0x200c, 0xc1ac, 0x2102, 0x080c, 0x7f35, 0x2011, -+ 0x0004, 0x080c, 0x9c60, 0x080c, 0x524d, 0x080c, 0x5acf, 0x0158, -+ 0x080c, 0x4be8, 0x0140, 0x708b, 0x0001, 0x70c7, 0x0000, 0x080c, -+ 0x462c, 0x0804, 0x11ed, 0x080c, 0x5309, 0x0120, 0x7a0c, 0xc2b4, -+ 0x7a0e, 0x0060, 0x7073, 0x0000, 0x080c, 0xa008, 0x70d4, 0xd09c, -+ 0x1128, 0x70a0, 0xa005, 0x0110, 0x080c, 0x4bc6, 0x70df, 0x0000, -+ 0x70db, 0x0000, 0x72d4, 0x080c, 0x5acf, 0x1178, 0x2011, 0x0000, - 0x0016, 0x080c, 0x28eb, 0x2019, 0xb78f, 0x211a, 0x001e, 0x7053, - 0xffff, 0x7057, 0x00ef, 0x7077, 0x0000, 0x2079, 0xb552, 0x7804, -- 0xd0ac, 0x0108, 0xc295, 0x72d6, 0x080c, 0x5ad0, 0x0118, 0xa296, -- 0x0004, 0x0548, 0x2011, 0x0001, 0x080c, 0x9c5a, 0x709b, 0x0000, -+ 0xd0ac, 0x0108, 0xc295, 0x72d6, 0x080c, 0x5acf, 0x0118, 0xa296, -+ 0x0004, 0x0548, 0x2011, 0x0001, 0x080c, 0x9c60, 0x709b, 0x0000, - 0x709f, 0xffff, 0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, - 0x7828, 0xa085, 0x0003, 0x782a, 0x00fe, 0x080c, 0x2ab8, 0x2011, -- 0x0005, 0x080c, 0x8076, 0x080c, 0x7174, 0x080c, 0x5ad0, 0x0148, -+ 0x0005, 0x080c, 0x8075, 0x080c, 0x7173, 0x080c, 0x5acf, 0x0148, - 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x28eb, 0x61e2, 0x001e, - 0x00ce, 0x012e, 0x0420, 0x709b, 0x0000, 0x709f, 0xffff, 0x7003, - 0x0002, 0x00f6, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0xa085, -- 0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, 0x080c, 0x8076, 0x080c, -- 0x7174, 0x080c, 0x5ad0, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, -+ 0x0003, 0x782a, 0x00fe, 0x2011, 0x0005, 0x080c, 0x8075, 0x080c, -+ 0x7173, 0x080c, 0x5acf, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, - 0x080c, 0x28eb, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, -- 0x00c6, 0x080c, 0x5ad0, 0x1118, 0x20a9, 0x0100, 0x0010, 0x20a9, -- 0x0082, 0x080c, 0x5ad0, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009, -+ 0x00c6, 0x080c, 0x5acf, 0x1118, 0x20a9, 0x0100, 0x0010, 0x20a9, -+ 0x0082, 0x080c, 0x5acf, 0x1118, 0x2009, 0x0000, 0x0010, 0x2009, - 0x007e, 0x080c, 0x2d97, 0x8108, 0x1f04, 0x1201, 0x00ce, 0x7073, - 0x0000, 0x7074, 0xa084, 0x00ff, 0x7076, 0x70a3, 0x0000, 0x0005, - 0x0126, 0x2091, 0x8000, 0x7000, 0xa086, 0x0002, 0x1904, 0x12db, -- 0x709c, 0xa086, 0xffff, 0x0130, 0x080c, 0x2ab8, 0x080c, 0x7174, -+ 0x709c, 0xa086, 0xffff, 0x0130, 0x080c, 0x2ab8, 0x080c, 0x7173, - 0x0804, 0x12db, 0x70d4, 0xd0ac, 0x1110, 0xd09c, 0x0540, 0xd084, - 0x0530, 0x0006, 0x0016, 0x2001, 0x0103, 0x2009, 0xb78d, 0x210c, - 0x2102, 0x001e, 0x000e, 0xd08c, 0x01d0, 0x70d8, 0xa086, 0xffff, -- 0x0190, 0x080c, 0x2c17, 0x080c, 0x7174, 0x70d4, 0xd094, 0x1904, -+ 0x0190, 0x080c, 0x2c17, 0x080c, 0x7173, 0x70d4, 0xd094, 0x1904, - 0x12db, 0x2011, 0x0001, 0x2019, 0x0000, 0x080c, 0x2c4f, 0x080c, -- 0x7174, 0x0804, 0x12db, 0x70dc, 0xa005, 0x1904, 0x12db, 0x7098, -+ 0x7173, 0x0804, 0x12db, 0x70dc, 0xa005, 0x1904, 0x12db, 0x7098, - 0xa005, 0x1904, 0x12db, 0x70d4, 0xd0a4, 0x0118, 0xd0b4, 0x0904, -- 0x12db, 0x080c, 0x530a, 0x1904, 0x12db, 0x2001, 0xb553, 0x2004, -+ 0x12db, 0x080c, 0x5309, 0x1904, 0x12db, 0x2001, 0xb553, 0x2004, - 0xd0ac, 0x01c8, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, -- 0x0016, 0x080c, 0x4faa, 0x1118, 0x6000, 0xd0ec, 0x1138, 0x001e, -+ 0x0016, 0x080c, 0x4fa9, 0x1118, 0x6000, 0xd0ec, 0x1138, 0x001e, - 0x8108, 0x1f04, 0x1268, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, - 0x015e, 0x0804, 0x12db, 0x0006, 0x0016, 0x2001, 0x0103, 0x2009, - 0xb78d, 0x210c, 0x2102, 0x001e, 0x000e, 0x71a8, 0x81ff, 0x11b0, -@@ -143,55 +143,55 @@ unsigned short risc_code01[] = { - 0x8007, 0x7174, 0x810f, 0x20a9, 0x0002, 0x40a1, 0x20a1, 0xb7d2, - 0x2009, 0x0000, 0x080c, 0x14fb, 0x2001, 0x0000, 0x810f, 0x20a9, - 0x0002, 0x40a1, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, 0x709f, -- 0xffff, 0x080c, 0x1581, 0xa006, 0x080c, 0x27c3, 0x080c, 0x3f3f, -- 0x00f6, 0x2079, 0x0100, 0x080c, 0x5af6, 0x0150, 0x080c, 0x5ad0, -+ 0xffff, 0x080c, 0x1581, 0xa006, 0x080c, 0x27c3, 0x080c, 0x3f3e, -+ 0x00f6, 0x2079, 0x0100, 0x080c, 0x5af5, 0x0150, 0x080c, 0x5acf, - 0x7828, 0x0118, 0xa084, 0xe1ff, 0x0010, 0xa084, 0xffdf, 0x782a, - 0x00fe, 0x2001, 0xb7e1, 0x2004, 0xa086, 0x0005, 0x1120, 0x2011, -- 0x0000, 0x080c, 0x8076, 0x2011, 0x0000, 0x080c, 0x8080, 0x080c, -- 0x7174, 0x080c, 0x7231, 0x012e, 0x0005, 0x0016, 0x0046, 0x00f6, -+ 0x0000, 0x080c, 0x8075, 0x2011, 0x0000, 0x080c, 0x807f, 0x080c, -+ 0x7173, 0x080c, 0x7230, 0x012e, 0x0005, 0x0016, 0x0046, 0x00f6, - 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2009, 0xb534, 0x2104, -- 0xa005, 0x1110, 0x080c, 0x2917, 0x2009, 0x00f7, 0x080c, 0x4bb0, -+ 0xa005, 0x1110, 0x080c, 0x2917, 0x2009, 0x00f7, 0x080c, 0x4baf, - 0x7940, 0xa18c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, - 0x0040, 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, -- 0x7954, 0xd1ac, 0x1904, 0x134b, 0x080c, 0x5ae2, 0x0158, 0x080c, -- 0x5af6, 0x1128, 0x2001, 0xb79e, 0x2003, 0x0000, 0x0070, 0x080c, -- 0x5ad8, 0x0dc0, 0x2001, 0xb79e, 0x2003, 0xaaaa, 0x2001, 0xb79f, -- 0x2003, 0x0001, 0x080c, 0x5a08, 0x0058, 0x080c, 0x5ad0, 0x0140, -- 0x2009, 0x00f8, 0x080c, 0x4bb0, 0x7843, 0x0090, 0x7843, 0x0010, -- 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x5ad0, 0x0138, -+ 0x7954, 0xd1ac, 0x1904, 0x134b, 0x080c, 0x5ae1, 0x0158, 0x080c, -+ 0x5af5, 0x1128, 0x2001, 0xb79e, 0x2003, 0x0000, 0x0070, 0x080c, -+ 0x5ad7, 0x0dc0, 0x2001, 0xb79e, 0x2003, 0xaaaa, 0x2001, 0xb79f, -+ 0x2003, 0x0001, 0x080c, 0x5a07, 0x0058, 0x080c, 0x5acf, 0x0140, -+ 0x2009, 0x00f8, 0x080c, 0x4baf, 0x7843, 0x0090, 0x7843, 0x0010, -+ 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x5acf, 0x0138, - 0x7824, 0xd0ac, 0x1904, 0x13f5, 0x1f04, 0x132a, 0x0070, 0x7824, -- 0x080c, 0x5aec, 0x0118, 0xd0ac, 0x1904, 0x13f5, 0xa084, 0x1800, -+ 0x080c, 0x5aeb, 0x0118, 0xd0ac, 0x1904, 0x13f5, 0xa084, 0x1800, - 0x0d98, 0x7003, 0x0001, 0x0804, 0x13f5, 0x2001, 0x0001, 0x080c, - 0x27c3, 0x0804, 0x1404, 0x7850, 0xa084, 0x0180, 0x7852, 0x782f, -- 0x0020, 0x20a9, 0x0046, 0x1d04, 0x1353, 0x080c, 0x6a45, 0x1f04, -+ 0x0020, 0x20a9, 0x0046, 0x1d04, 0x1353, 0x080c, 0x6a44, 0x1f04, - 0x1353, 0x7850, 0xa084, 0x0180, 0xa085, 0x0400, 0x7852, 0x782f, -- 0x0000, 0x080c, 0x5ae2, 0x0158, 0x080c, 0x5af6, 0x1128, 0x2001, -- 0xb79e, 0x2003, 0x0000, 0x0070, 0x080c, 0x5ad8, 0x0dc0, 0x2001, -+ 0x0000, 0x080c, 0x5ae1, 0x0158, 0x080c, 0x5af5, 0x1128, 0x2001, -+ 0xb79e, 0x2003, 0x0000, 0x0070, 0x080c, 0x5ad7, 0x0dc0, 0x2001, - 0xb79e, 0x2003, 0xaaaa, 0x2001, 0xb79f, 0x2003, 0x0001, 0x080c, -- 0x5a08, 0x0020, 0x2009, 0x00f8, 0x080c, 0x4bb0, 0x20a9, 0x000e, -+ 0x5a07, 0x0020, 0x2009, 0x00f8, 0x080c, 0x4baf, 0x20a9, 0x000e, - 0xe000, 0x1f04, 0x1380, 0x7850, 0xa084, 0x0180, 0xa085, 0x1400, -- 0x7852, 0x080c, 0x5ad0, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, -+ 0x7852, 0x080c, 0x5acf, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, - 0x2021, 0xe678, 0x2019, 0xea60, 0x7820, 0xd09c, 0x1558, 0x080c, -- 0x5ad0, 0x05d8, 0x7824, 0xd0ac, 0x1904, 0x13f5, 0x080c, 0x5af6, -+ 0x5acf, 0x05d8, 0x7824, 0xd0ac, 0x1904, 0x13f5, 0x080c, 0x5af5, - 0x1508, 0x0046, 0x2021, 0x0190, 0x8421, 0x1df0, 0x004e, 0x8421, - 0x11c8, 0x7827, 0x0048, 0x20a9, 0x01f4, 0x1d04, 0x13ad, 0x080c, -- 0x6a45, 0x1f04, 0x13ad, 0x7824, 0xa084, 0x0068, 0x15c8, 0x2001, -+ 0x6a44, 0x1f04, 0x13ad, 0x7824, 0xa084, 0x0068, 0x15c8, 0x2001, - 0xb79e, 0x2003, 0xaaaa, 0x2001, 0xb79f, 0x2003, 0x0001, 0x7003, -- 0x0001, 0x0498, 0x1d04, 0x13c6, 0x080c, 0x6a45, 0x8319, 0x1960, -+ 0x0001, 0x0498, 0x1d04, 0x13c6, 0x080c, 0x6a44, 0x8319, 0x1960, - 0x2009, 0xb534, 0x2104, 0x8000, 0x200a, 0xa084, 0xfff0, 0x0120, -- 0x200b, 0x0000, 0x080c, 0x2917, 0x00d8, 0x080c, 0x5ae2, 0x1140, -- 0xa4a2, 0x0064, 0x1128, 0x080c, 0x5aa7, 0x7003, 0x0001, 0x00a8, -- 0x7827, 0x1800, 0xe000, 0xe000, 0x7824, 0x080c, 0x5aec, 0x0110, -+ 0x200b, 0x0000, 0x080c, 0x2917, 0x00d8, 0x080c, 0x5ae1, 0x1140, -+ 0xa4a2, 0x0064, 0x1128, 0x080c, 0x5aa6, 0x7003, 0x0001, 0x00a8, -+ 0x7827, 0x1800, 0xe000, 0xe000, 0x7824, 0x080c, 0x5aeb, 0x0110, - 0xd0ac, 0x1158, 0xa084, 0x1800, 0x09a8, 0x7003, 0x0001, 0x0028, - 0x2001, 0x0001, 0x080c, 0x27c3, 0x0048, 0x2001, 0xb534, 0x2003, - 0x0000, 0x7827, 0x0048, 0x7828, 0xc09d, 0x782a, 0x7850, 0xa084, - 0x0180, 0xa085, 0x0400, 0x7852, 0x015e, 0x003e, 0x000e, 0x080c, - 0x1558, 0x012e, 0x00fe, 0x004e, 0x001e, 0x0005, 0x0005, 0x0005, - 0x0005, 0x2a70, 0x2061, 0xb7c1, 0x2063, 0x0002, 0x6007, 0x0002, -- 0x600b, 0x0004, 0x600f, 0x0017, 0x2001, 0xb79e, 0x2003, 0x0000, -+ 0x600b, 0x0006, 0x600f, 0x0017, 0x2001, 0xb79e, 0x2003, 0x0000, - 0x708b, 0x0000, 0x2009, 0x0100, 0x2104, 0xa082, 0x0002, 0x0218, - 0x7053, 0xffff, 0x0010, 0x7053, 0x0000, 0x705b, 0xffff, 0x7073, -- 0x0000, 0x7077, 0x0000, 0x080c, 0xa002, 0x2061, 0xb78e, 0x6003, -+ 0x0000, 0x7077, 0x0000, 0x080c, 0xa008, 0x2061, 0xb78e, 0x6003, - 0x0909, 0x6007, 0x0000, 0x600b, 0x8800, 0x600f, 0x0200, 0x6013, - 0x00ff, 0x6017, 0x000f, 0x601b, 0x0000, 0x601f, 0x07d0, 0x2061, - 0xb796, 0x6003, 0x8000, 0x6007, 0x0000, 0x600b, 0x0000, 0x600f, -@@ -216,7 +216,7 @@ unsigned short risc_code01[] = { - 0xe000, 0xe000, 0x2c1c, 0x2061, 0x7fff, 0x2c04, 0x2061, 0xffff, - 0x2262, 0xa306, 0x1110, 0xc195, 0x0008, 0xc19d, 0x2011, 0x0001, - 0x2019, 0x14f3, 0x0010, 0x0804, 0x1469, 0x3800, 0xa084, 0xfffc, -- 0xa205, 0x20c0, 0x0837, 0x2011, 0x0000, 0x080c, 0x4faa, 0x1178, -+ 0xa205, 0x20c0, 0x0837, 0x2011, 0x0000, 0x080c, 0x4fa9, 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, -@@ -303,10 +303,10 @@ unsigned short risc_code01[] = { - 0x000d, 0x20a0, 0x2099, 0x0014, 0x7803, 0x0040, 0x20a9, 0x0020, - 0x53a5, 0x2001, 0xb5fa, 0x2004, 0xd0bc, 0x0148, 0x2001, 0xb603, - 0x2004, 0xa080, 0x000d, 0x20a0, 0x20a9, 0x0020, 0x53a5, 0x015e, -- 0x014e, 0x013e, 0x7007, 0x0000, 0x080c, 0x5e70, 0x080c, 0x166c, -- 0x0005, 0x2011, 0x8003, 0x080c, 0x3ecd, 0x0cf8, 0xa18c, 0x0700, -+ 0x014e, 0x013e, 0x7007, 0x0000, 0x080c, 0x5e6f, 0x080c, 0x166c, -+ 0x0005, 0x2011, 0x8003, 0x080c, 0x3ecc, 0x0cf8, 0xa18c, 0x0700, - 0x1148, 0x2001, 0xb628, 0x2003, 0x0100, 0x7007, 0x0000, 0x080c, -- 0x166c, 0x0005, 0x2011, 0x8004, 0x080c, 0x3ecd, 0x0cf8, 0x0126, -+ 0x166c, 0x0005, 0x2011, 0x8004, 0x080c, 0x3ecc, 0x0cf8, 0x0126, - 0x2091, 0x2200, 0x2079, 0x0030, 0x2071, 0xb823, 0x7003, 0x0000, - 0x700f, 0xb82f, 0x7013, 0xb82f, 0x780f, 0x00f6, 0x7803, 0x0004, - 0x012e, 0x0005, 0x6934, 0xa184, 0x0007, 0x0002, 0x17ee, 0x182c, -@@ -345,7 +345,7 @@ unsigned short risc_code01[] = { - 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, 0x1949, 0x2009, 0x0048, 0x080c, 0x8646, -+ 0xa18e, 0x0004, 0x1904, 0x1949, 0x2009, 0x0048, 0x080c, 0x864c, - 0x0804, 0x1949, 0x6808, 0xa005, 0x05a0, 0x7000, 0xa005, 0x0588, - 0x700c, 0x7110, 0xa106, 0x1118, 0x7004, 0xa406, 0x1550, 0x2001, - 0x0005, 0x2004, 0xd08c, 0x0160, 0x0046, 0x080c, 0x1b06, 0x004e, -@@ -354,7 +354,7 @@ unsigned short risc_code01[] = { - 0xd08c, 0x1d50, 0x7804, 0xa084, 0x6000, 0x0118, 0xa086, 0x6000, - 0x19f0, 0x7818, 0x6812, 0x781c, 0x6816, 0x7803, 0x0004, 0x7003, - 0x0000, 0x6100, 0xa18e, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, -- 0x8646, 0x00ce, 0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, -+ 0x864c, 0x00ce, 0x00de, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x0026, - 0x0036, 0x0046, 0x0056, 0x2071, 0xb823, 0x7000, 0xa086, 0x0000, - 0x0904, 0x19b3, 0x7004, 0xac06, 0x1904, 0x19a5, 0x2079, 0x0030, - 0x7000, 0xa086, 0x0003, 0x0904, 0x19a5, 0x7804, 0xd0fc, 0x15c8, -@@ -363,7 +363,7 @@ unsigned short risc_code01[] = { - 0x1540, 0x080c, 0x1e6e, 0x0026, 0x0056, 0x7803, 0x0004, 0x7804, - 0xd0ac, 0x1de8, 0x7803, 0x0002, 0x7803, 0x0009, 0x7003, 0x0003, - 0x7007, 0x0000, 0x005e, 0x002e, 0x2001, 0x015d, 0x2003, 0x0000, -- 0x080c, 0x5ad0, 0x1138, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b52, -+ 0x080c, 0x5acf, 0x1138, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b51, - 0x006e, 0x0058, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, - 0x0020, 0x080c, 0x1b06, 0x0804, 0x1955, 0x0156, 0x20a9, 0x0009, - 0x2009, 0xb82f, 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, -@@ -382,7 +382,7 @@ unsigned short risc_code01[] = { - 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, 0x9f94, 0x09e0, 0x601c, 0xa08e, -+ 0x003e, 0x004e, 0x0018, 0x080c, 0x9f9a, 0x09e0, 0x601c, 0xa08e, - 0x0008, 0x0904, 0x19e0, 0xa08e, 0x000a, 0x0904, 0x19e0, 0x2001, - 0xb574, 0x2004, 0xd0b4, 0x1140, 0x6018, 0x2004, 0xd0bc, 0x1120, - 0x6817, 0x7fff, 0x6813, 0xffff, 0x080c, 0x2305, 0x1918, 0x0804, -@@ -406,10 +406,10 @@ unsigned short risc_code01[] = { - 0x6800, 0xa506, 0x1160, 0x6804, 0xa406, 0x1148, 0x6808, 0xa706, - 0x1130, 0x680c, 0xa606, 0x0018, 0xc9fc, 0x080c, 0x22a7, 0x2168, - 0x0005, 0x080c, 0x1515, 0x080c, 0x1f55, 0x7004, 0x2060, 0x00d6, -- 0x6010, 0x2068, 0x7003, 0x0000, 0x080c, 0x1dfe, 0x080c, 0x9c54, -+ 0x6010, 0x2068, 0x7003, 0x0000, 0x080c, 0x1dfe, 0x080c, 0x9c5a, - 0x0170, 0x6808, 0x8001, 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, - 0x682b, 0xffff, 0x682f, 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, -- 0x080c, 0x9924, 0x0804, 0x1d2b, 0x080c, 0x1515, 0x0126, 0x2091, -+ 0x080c, 0x992a, 0x0804, 0x1d2b, 0x080c, 0x1515, 0x0126, 0x2091, - 0x2200, 0x0006, 0x0016, 0x2b68, 0x6818, 0x2060, 0x7904, 0x7803, - 0x0002, 0xa184, 0x0700, 0x1978, 0xa184, 0x0003, 0xa086, 0x0003, - 0x0d58, 0x7000, 0x0002, 0x1b23, 0x1b29, 0x1c3a, 0x1d06, 0x1d1a, -@@ -427,10 +427,10 @@ unsigned short risc_code01[] = { - 0x2500, 0xa405, 0x0128, 0x080c, 0x22bd, 0x6850, 0xc0fd, 0x6852, - 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6808, 0x8001, - 0x680a, 0x1148, 0x684c, 0xd0e4, 0x0130, 0x7004, 0x2060, 0x2009, -- 0x0048, 0x080c, 0x8646, 0x7000, 0xa086, 0x0004, 0x0904, 0x1d2b, -+ 0x0048, 0x080c, 0x864c, 0x7000, 0xa086, 0x0004, 0x0904, 0x1d2b, - 0x7003, 0x0000, 0x080c, 0x19ba, 0x0804, 0x1d2b, 0x0056, 0x7d0c, -- 0xd5bc, 0x1110, 0x080c, 0xb3fb, 0x005e, 0x080c, 0x1dfe, 0x00f6, -- 0x7004, 0x2078, 0x080c, 0x5306, 0x0118, 0x7820, 0xc0f5, 0x7822, -+ 0xd5bc, 0x1110, 0x080c, 0xb407, 0x005e, 0x080c, 0x1dfe, 0x00f6, -+ 0x7004, 0x2078, 0x080c, 0x5305, 0x0118, 0x7820, 0xc0f5, 0x7822, - 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, - 0x697c, 0x791a, 0x6980, 0x791e, 0x0804, 0x1d2b, 0x7004, 0x00c6, - 0x2060, 0x6020, 0x00ce, 0xd0f4, 0x0120, 0x6808, 0x8001, 0x680a, -@@ -441,13 +441,13 @@ unsigned short risc_code01[] = { - 0x2060, 0x601c, 0xa086, 0x000a, 0x11a0, 0x0156, 0x20a9, 0x0009, - 0x2009, 0xb82f, 0x2104, 0xac06, 0x1108, 0x200a, 0xa188, 0x0003, - 0x1f04, 0x1bf2, 0x015e, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, -- 0x8646, 0x080c, 0x19ba, 0x0804, 0x1d2b, 0x7818, 0x6812, 0x781c, -+ 0x864c, 0x080c, 0x19ba, 0x0804, 0x1d2b, 0x7818, 0x6812, 0x781c, - 0x6816, 0x7814, 0x7908, 0xa18c, 0x0fff, 0xa192, 0x0841, 0x1a04, - 0x1ae3, 0xa188, 0x0007, 0x8114, 0x8214, 0x8214, 0xa10a, 0x8104, - 0x8004, 0x8004, 0xa20a, 0x810b, 0x810b, 0x810b, 0x080c, 0x1e99, - 0x7803, 0x0004, 0x780f, 0xffff, 0x7803, 0x0001, 0x7804, 0xd0fc, - 0x0de8, 0x7803, 0x0002, 0x7803, 0x0004, 0x780f, 0x00f6, 0x7004, -- 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x080c, 0x8646, 0x080c, -+ 0x7007, 0x0000, 0x2060, 0x2009, 0x0048, 0x080c, 0x864c, 0x080c, - 0x1eef, 0x0838, 0x8001, 0x7002, 0xd194, 0x01b0, 0x7804, 0xd0fc, - 0x1904, 0x1cd6, 0xd09c, 0x0138, 0x7804, 0xd0fc, 0x1904, 0x1cd6, - 0xd09c, 0x1904, 0x1cda, 0x8aff, 0x0904, 0x1d2b, 0x2009, 0x0001, -@@ -464,8 +464,8 @@ unsigned short risc_code01[] = { - 0x0020, 0x6810, 0xa31a, 0x6814, 0xa213, 0x00de, 0xd194, 0x0904, - 0x1b63, 0x2a00, 0x6826, 0x2c00, 0x681a, 0x2800, 0x6832, 0x6808, - 0x8001, 0x680a, 0x6b2a, 0x6a2e, 0x003e, 0x002e, 0x0804, 0x1c01, -- 0x0056, 0x7d0c, 0x080c, 0xb3fb, 0x005e, 0x080c, 0x1dfe, 0x00f6, -- 0x7004, 0x2078, 0x080c, 0x5306, 0x0118, 0x7820, 0xc0f5, 0x7822, -+ 0x0056, 0x7d0c, 0x080c, 0xb407, 0x005e, 0x080c, 0x1dfe, 0x00f6, -+ 0x7004, 0x2078, 0x080c, 0x5305, 0x0118, 0x7820, 0xc0f5, 0x7822, - 0x00fe, 0x682b, 0xffff, 0x682f, 0xffff, 0x6808, 0x8001, 0x680a, - 0x697c, 0x791a, 0x6980, 0x791e, 0x0804, 0x1d2b, 0x7804, 0xd09c, - 0x0904, 0x1b0e, 0x7c20, 0x7824, 0xa405, 0x1904, 0x1b0e, 0x7818, -@@ -475,7 +475,7 @@ unsigned short risc_code01[] = { - 0x7834, 0xa406, 0x1138, 0x7838, 0xa706, 0x1120, 0x783c, 0xa606, - 0x0904, 0x1b0e, 0x7803, 0x0002, 0x0804, 0x1c67, 0x7803, 0x0004, - 0x7003, 0x0000, 0x7004, 0xa00d, 0x0150, 0x6808, 0x8001, 0x680a, -- 0x1130, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x8646, 0x080c, -+ 0x1130, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x864c, 0x080c, - 0x19ba, 0x0088, 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, - 0x6010, 0xa005, 0x0da0, 0x2068, 0x6808, 0x8000, 0x680a, 0x6c28, - 0x6b2c, 0x080c, 0x19d5, 0x001e, 0x000e, 0x012e, 0x0005, 0x700c, -@@ -505,9 +505,9 @@ unsigned short risc_code01[] = { - 0x0005, 0x0126, 0x2091, 0x2200, 0x7000, 0xa086, 0x0003, 0x1160, - 0x700c, 0x7110, 0xa106, 0x0140, 0x080c, 0x295c, 0x20e1, 0x9028, - 0x700f, 0xb82f, 0x7013, 0xb82f, 0x012e, 0x0005, 0x00c6, 0x080c, -- 0x5ad0, 0x11b8, 0x2001, 0x0160, 0x2003, 0x0000, 0x2001, 0x0138, -+ 0x5acf, 0x11b8, 0x2001, 0x0160, 0x2003, 0x0000, 0x2001, 0x0138, - 0x2003, 0x0000, 0x2011, 0x00c8, 0xe000, 0xe000, 0x8211, 0x1de0, -- 0x04b1, 0x0066, 0x2031, 0x0000, 0x080c, 0x5b52, 0x006e, 0x00ce, -+ 0x04b1, 0x0066, 0x2031, 0x0000, 0x080c, 0x5b51, 0x006e, 0x00ce, - 0x0005, 0x080c, 0x1e6e, 0x080c, 0x295c, 0x20e1, 0x9028, 0x700c, - 0x7110, 0xa106, 0x01c0, 0x2104, 0xa005, 0x0130, 0x2060, 0x6010, - 0x2060, 0x6008, 0x8001, 0x600a, 0xa188, 0x0003, 0xa182, 0xb84a, -@@ -520,7 +520,7 @@ unsigned short risc_code01[] = { - 0x600a, 0xa188, 0x0003, 0xa182, 0xb84a, 0x0210, 0x2009, 0xb82f, - 0x7112, 0x0c50, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x2001, 0x0138, - 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, -- 0x080c, 0x5ad0, 0x1148, 0x2021, 0x0002, 0x1d04, 0x1e7d, 0x2091, -+ 0x080c, 0x5acf, 0x1148, 0x2021, 0x0002, 0x1d04, 0x1e7d, 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, -@@ -557,7 +557,7 @@ unsigned short risc_code01[] = { - 0x2079, 0x0010, 0x000e, 0x783e, 0x000e, 0x783a, 0x000e, 0x7836, - 0x000e, 0x7832, 0x000e, 0x7822, 0x000e, 0x7802, 0x00fe, 0x00ee, - 0x0030, 0x00fe, 0x00ee, 0x7804, 0xd0ac, 0x190c, 0x1515, 0x080c, -- 0x7231, 0x0005, 0x00e6, 0x2071, 0xb84a, 0x7003, 0x0000, 0x00ee, -+ 0x7230, 0x0005, 0x00e6, 0x2071, 0xb84a, 0x7003, 0x0000, 0x00ee, - 0x0005, 0x00d6, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x1904, - 0x201f, 0x6934, 0xa184, 0x0007, 0x0002, 0x1fbd, 0x200a, 0x1fbd, - 0x1fbd, 0x1fbd, 0x1ff1, 0x1fd0, 0x1fbf, 0x080c, 0x1515, 0x684c, -@@ -604,12 +604,12 @@ unsigned short risc_code01[] = { - 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, - 0x1515, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, - 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x00d6, 0x6010, -- 0x2068, 0x080c, 0x9c54, 0x0118, 0x6850, 0xc0bd, 0x6852, 0x601c, -+ 0x2068, 0x080c, 0x9c5a, 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, 0x9924, 0x00ce, -+ 0x6866, 0x7004, 0x2060, 0x00de, 0x00c6, 0x080c, 0x992a, 0x00ce, - 0x2001, 0xb7ef, 0x2004, 0xac06, 0x1150, 0x20e1, 0x9040, 0x080c, -- 0x8257, 0x2011, 0x0000, 0x080c, 0x8080, 0x080c, 0x7231, 0x002e, -+ 0x825d, 0x2011, 0x0000, 0x080c, 0x807f, 0x080c, 0x7230, 0x002e, - 0x0804, 0x2204, 0x0126, 0x2091, 0x2400, 0x0006, 0x0016, 0x00f6, - 0x00e6, 0x00d6, 0x00c6, 0x2079, 0x0020, 0x2071, 0xb84a, 0x2b68, - 0x6818, 0x2060, 0x7904, 0x7803, 0x0002, 0xa184, 0x0700, 0x1904, -@@ -637,7 +637,7 @@ unsigned short risc_code01[] = { - 0x001e, 0x000e, 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0xb84a, - 0x7000, 0xa086, 0x0000, 0x05d0, 0x2079, 0x0020, 0x0016, 0x2009, - 0x0207, 0x210c, 0xd194, 0x0198, 0x2009, 0x020c, 0x210c, 0xa184, -- 0x0003, 0x0168, 0x080c, 0xb444, 0x2001, 0x0133, 0x2004, 0xa005, -+ 0x0003, 0x0168, 0x080c, 0xb450, 0x2001, 0x0133, 0x2004, 0xa005, - 0x090c, 0x1515, 0x20e1, 0x9040, 0x2001, 0x020c, 0x2102, 0x2009, - 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0xa106, 0x1110, 0x20e1, - 0x9040, 0x7804, 0xd0fc, 0x09d8, 0x080c, 0x214a, 0x7000, 0xa086, -@@ -645,11 +645,11 @@ unsigned short risc_code01[] = { - 0x20e1, 0x9040, 0x7803, 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, - 0x0005, 0x0026, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xb84a, - 0x2079, 0x0020, 0x7000, 0xa086, 0x0000, 0x0540, 0x7004, 0x2060, -- 0x6010, 0x2068, 0x080c, 0x9c54, 0x0158, 0x6850, 0xc0b5, 0x6852, -+ 0x6010, 0x2068, 0x080c, 0x9c5a, 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, 0x9924, 0x20e1, 0x9040, -- 0x080c, 0x8257, 0x2011, 0x0000, 0x080c, 0x8080, 0x00fe, 0x00ee, -+ 0x7003, 0x0000, 0x7004, 0x2060, 0x080c, 0x992a, 0x20e1, 0x9040, -+ 0x080c, 0x825d, 0x2011, 0x0000, 0x080c, 0x807f, 0x00fe, 0x00ee, - 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, 0x6a14, 0xa205, 0x1d00, - 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, 0x1fa9, 0x2001, 0x0105, - 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, 0x7003, 0x0000, -@@ -697,17 +697,17 @@ unsigned short risc_code01[] = { - 0x1f04, 0x23e6, 0x20e1, 0x9080, 0x783b, 0x001f, 0x20e1, 0x8700, - 0x012e, 0x0005, 0x0126, 0x2091, 0x2600, 0x781c, 0xd0a4, 0x190c, - 0x24ad, 0xa084, 0x0007, 0x0002, 0x2416, 0x2404, 0x2407, 0x240a, -- 0x240f, 0x2411, 0x2413, 0x2415, 0x080c, 0x63c5, 0x0078, 0x080c, -- 0x6404, 0x0060, 0x080c, 0x63c5, 0x080c, 0x6404, 0x0038, 0x0041, -+ 0x240f, 0x2411, 0x2413, 0x2415, 0x080c, 0x63c4, 0x0078, 0x080c, -+ 0x6403, 0x0060, 0x080c, 0x63c4, 0x080c, 0x6403, 0x0038, 0x0041, - 0x0028, 0x0031, 0x0018, 0x0021, 0x0008, 0x0011, 0x012e, 0x0005, -- 0x0006, 0x0016, 0x0026, 0x080c, 0xb444, 0x7930, 0xa184, 0x0003, -+ 0x0006, 0x0016, 0x0026, 0x080c, 0xb450, 0x7930, 0xa184, 0x0003, - 0x01b0, 0x2001, 0xb7ef, 0x2004, 0xa005, 0x0170, 0x2001, 0x0133, - 0x2004, 0xa005, 0x090c, 0x1515, 0x00c6, 0x2001, 0xb7ef, 0x2064, -- 0x080c, 0x9924, 0x00ce, 0x04b8, 0x20e1, 0x9040, 0x04a0, 0xa184, -+ 0x080c, 0x992a, 0x00ce, 0x04b8, 0x20e1, 0x9040, 0x04a0, 0xa184, - 0x0030, 0x01e0, 0x6a00, 0xa286, 0x0003, 0x1108, 0x00a0, 0x080c, -- 0x5ad0, 0x1178, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, -- 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5b14, 0x080c, 0x5a08, -- 0x0010, 0x080c, 0x4b20, 0x080c, 0x24b0, 0x00a8, 0xa184, 0x00c0, -+ 0x5acf, 0x1178, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, -+ 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5b13, 0x080c, 0x5a07, -+ 0x0010, 0x080c, 0x4b1f, 0x080c, 0x24b0, 0x00a8, 0xa184, 0x00c0, - 0x0168, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0xb823, 0x080c, - 0x1dfe, 0x005e, 0x004e, 0x003e, 0x00ee, 0x0028, 0xa184, 0x0300, - 0x0110, 0x20e1, 0x9020, 0x7932, 0x002e, 0x001e, 0x000e, 0x0005, -@@ -735,93 +735,93 @@ unsigned short risc_code01[] = { - 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, - 0xa184, 0x1e2c, 0x1118, 0xa184, 0x0007, 0x002a, 0xa195, 0x0004, - 0xa284, 0x0007, 0x0002, 0x254d, 0x2533, 0x2536, 0x2539, 0x253e, -- 0x2540, 0x2544, 0x2548, 0x080c, 0x6b75, 0x00b8, 0x080c, 0x6c50, -- 0x00a0, 0x080c, 0x6c50, 0x080c, 0x6b75, 0x0078, 0x0099, 0x0068, -- 0x080c, 0x6b75, 0x0079, 0x0048, 0x080c, 0x6c50, 0x0059, 0x0028, -- 0x080c, 0x6c50, 0x080c, 0x6b75, 0x0029, 0x002e, 0x001e, 0x000e, -+ 0x2540, 0x2544, 0x2548, 0x080c, 0x6b74, 0x00b8, 0x080c, 0x6c4f, -+ 0x00a0, 0x080c, 0x6c4f, 0x080c, 0x6b74, 0x0078, 0x0099, 0x0068, -+ 0x080c, 0x6b74, 0x0079, 0x0048, 0x080c, 0x6c4f, 0x0059, 0x0028, -+ 0x080c, 0x6c4f, 0x080c, 0x6b74, 0x0029, 0x002e, 0x001e, 0x000e, - 0x012e, 0x0005, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, -- 0x2766, 0x080c, 0x5ad0, 0x0578, 0x7000, 0xa086, 0x0003, 0x0198, -- 0x6024, 0xa084, 0x1800, 0x0178, 0x080c, 0x5af6, 0x0118, 0x080c, -- 0x5ae2, 0x1148, 0x6027, 0x0020, 0x6043, 0x0000, 0x2001, 0xb79e, -- 0x2003, 0xaaaa, 0x0458, 0x080c, 0x5af6, 0x15d0, 0x6024, 0xa084, -+ 0x2766, 0x080c, 0x5acf, 0x0578, 0x7000, 0xa086, 0x0003, 0x0198, -+ 0x6024, 0xa084, 0x1800, 0x0178, 0x080c, 0x5af5, 0x0118, 0x080c, -+ 0x5ae1, 0x1148, 0x6027, 0x0020, 0x6043, 0x0000, 0x2001, 0xb79e, -+ 0x2003, 0xaaaa, 0x0458, 0x080c, 0x5af5, 0x15d0, 0x6024, 0xa084, - 0x1800, 0x1108, 0x04a8, 0x2001, 0xb79e, 0x2003, 0xaaaa, 0x2001, - 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, 0x080c, -- 0x5a08, 0x0804, 0x2766, 0xd1ac, 0x1518, 0x6024, 0xd0dc, 0x1170, -+ 0x5a07, 0x0804, 0x2766, 0xd1ac, 0x1518, 0x6024, 0xd0dc, 0x1170, - 0xd0e4, 0x1188, 0xd0d4, 0x11a0, 0xd0cc, 0x0130, 0x708c, 0xa086, -- 0x0028, 0x1110, 0x080c, 0x5c5f, 0x0804, 0x2766, 0x2001, 0xb79f, -+ 0x0028, 0x1110, 0x080c, 0x5c5e, 0x0804, 0x2766, 0x2001, 0xb79f, - 0x2003, 0x0000, 0x0048, 0x2001, 0xb79f, 0x2003, 0x0002, 0x0020, -- 0x080c, 0x5bd2, 0x0804, 0x2766, 0x080c, 0x5d04, 0x0804, 0x2766, -- 0xd1ac, 0x0904, 0x26ae, 0x080c, 0x5ad0, 0x11d8, 0x6027, 0x0020, -- 0x0006, 0x0026, 0x0036, 0x080c, 0x5aec, 0x1170, 0x2001, 0xb79f, -- 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, 0x080c, 0x5a08, -+ 0x080c, 0x5bd1, 0x0804, 0x2766, 0x080c, 0x5d03, 0x0804, 0x2766, -+ 0xd1ac, 0x0904, 0x26ae, 0x080c, 0x5acf, 0x11d8, 0x6027, 0x0020, -+ 0x0006, 0x0026, 0x0036, 0x080c, 0x5aeb, 0x1170, 0x2001, 0xb79f, -+ 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, 0x080c, 0x5a07, - 0x003e, 0x002e, 0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, -- 0x5aa7, 0x0016, 0x0046, 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138, -+ 0x5aa6, 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, 0x3ecd, 0x003e, 0xa196, 0xff00, 0x05b8, 0x7054, -+ 0x8016, 0x080c, 0x3ecc, 0x003e, 0xa196, 0xff00, 0x05b8, 0x7054, - 0xa084, 0x00ff, 0x810f, 0xa116, 0x0588, 0x7130, 0xd184, 0x1570, - 0x2011, 0xb553, 0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, 0x2011, - 0xb553, 0x2214, 0xd2ac, 0x1510, 0x6240, 0xa294, 0x0010, 0x0130, - 0x6248, 0xa294, 0xff00, 0xa296, 0xff00, 0x01c0, 0x7030, 0xd08c, - 0x0904, 0x267b, 0x7034, 0xd08c, 0x1140, 0x2001, 0xb50c, 0x200c, - 0xd1ac, 0x1904, 0x267b, 0xc1ad, 0x2102, 0x0036, 0x73cc, 0x2011, -- 0x8013, 0x080c, 0x3ecd, 0x003e, 0x0804, 0x267b, 0x7034, 0xd08c, -+ 0x8013, 0x080c, 0x3ecc, 0x003e, 0x0804, 0x267b, 0x7034, 0xd08c, - 0x1140, 0x2001, 0xb50c, 0x200c, 0xd1ac, 0x1904, 0x267b, 0xc1ad, -- 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c, 0x3ecd, 0x003e, -+ 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c, 0x3ecc, 0x003e, - 0x7130, 0xc185, 0x7132, 0x2011, 0xb553, 0x220c, 0xd1a4, 0x01d0, -- 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x6b1b, 0x2019, -- 0x000e, 0x080c, 0xb059, 0xa484, 0x00ff, 0xa080, 0x2dc4, 0x200d, -+ 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x6b1a, 0x2019, -+ 0x000e, 0x080c, 0xb065, 0xa484, 0x00ff, 0xa080, 0x2dc4, 0x200d, - 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x080c, -- 0xb0dc, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, -+ 0xb0e8, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, - 0x0004, 0x080c, 0x2c6f, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, -- 0x2009, 0x0000, 0x080c, 0x4faa, 0x1110, 0x080c, 0x4c0c, 0x8108, -+ 0x2009, 0x0000, 0x080c, 0x4fa9, 0x1110, 0x080c, 0x4c0b, 0x8108, - 0x1f04, 0x2672, 0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, -- 0x8076, 0x2011, 0x0002, 0x080c, 0x8080, 0x080c, 0x7f5a, 0x0036, -- 0x2019, 0x0000, 0x080c, 0x7fe5, 0x003e, 0x60e3, 0x0000, 0x001e, -+ 0x8075, 0x2011, 0x0002, 0x080c, 0x807f, 0x080c, 0x7f59, 0x0036, -+ 0x2019, 0x0000, 0x080c, 0x7fe4, 0x003e, 0x60e3, 0x0000, 0x001e, - 0x2001, 0xb500, 0x2014, 0xa296, 0x0004, 0x1128, 0xd19c, 0x11b0, - 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0xb523, 0x2003, -- 0x0000, 0x6027, 0x0020, 0x080c, 0x5af6, 0x1140, 0x0016, 0x2009, -- 0x07d0, 0x2011, 0x59e5, 0x080c, 0x6a23, 0x001e, 0xd194, 0x0904, -- 0x2766, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x2717, 0x080c, 0x6a11, -- 0x080c, 0x7d7b, 0x6027, 0x0004, 0x00f6, 0x2019, 0xb7e9, 0x2304, -+ 0x0000, 0x6027, 0x0020, 0x080c, 0x5af5, 0x1140, 0x0016, 0x2009, -+ 0x07d0, 0x2011, 0x59e4, 0x080c, 0x6a22, 0x001e, 0xd194, 0x0904, -+ 0x2766, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x2717, 0x080c, 0x6a10, -+ 0x080c, 0x7d7a, 0x6027, 0x0004, 0x00f6, 0x2019, 0xb7e9, 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, -- 0x7091, 0x080c, 0x7174, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, -- 0x080c, 0x8617, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, -+ 0x7090, 0x080c, 0x7173, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, -+ 0x080c, 0x861d, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x0005, - 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0xa084, 0x4000, 0x0120, - 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, 0x00c6, 0x2061, 0xb7e0, - 0x6028, 0xa09a, 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, -- 0x7d6e, 0x0804, 0x2765, 0x2019, 0xb7e9, 0x2304, 0xa065, 0x0120, -- 0x2009, 0x0027, 0x080c, 0x8646, 0x00ce, 0x0804, 0x2765, 0xd2bc, -- 0x0904, 0x2765, 0x080c, 0x6a1e, 0x6014, 0xa084, 0x0184, 0xa085, -+ 0x7d6d, 0x0804, 0x2765, 0x2019, 0xb7e9, 0x2304, 0xa065, 0x0120, -+ 0x2009, 0x0027, 0x080c, 0x864c, 0x00ce, 0x0804, 0x2765, 0xd2bc, -+ 0x0904, 0x2765, 0x080c, 0x6a1d, 0x6014, 0xa084, 0x0184, 0xa085, - 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, - 0xa084, 0x4000, 0x0120, 0x6803, 0x1000, 0x6803, 0x0000, 0x00de, - 0x00c6, 0x2061, 0xb7e0, 0x6044, 0xa09a, 0x00c8, 0x12f0, 0x8000, - 0x6046, 0x603c, 0x00ce, 0xa005, 0x0540, 0x2009, 0x07d0, 0x080c, -- 0x6a16, 0xa080, 0x0007, 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, -+ 0x6a15, 0xa080, 0x0007, 0x2004, 0xa086, 0x0006, 0x1138, 0x6114, - 0xa18c, 0x0184, 0xa18d, 0x0012, 0x6116, 0x00b8, 0x6114, 0xa18c, - 0x0184, 0xa18d, 0x0016, 0x6116, 0x0080, 0x0036, 0x2019, 0x0001, -- 0x080c, 0x7fe5, 0x003e, 0x2019, 0xb7ef, 0x2304, 0xa065, 0x0120, -- 0x2009, 0x004f, 0x080c, 0x8646, 0x00ce, 0x001e, 0xd19c, 0x0904, -+ 0x080c, 0x7fe4, 0x003e, 0x2019, 0xb7ef, 0x2304, 0xa065, 0x0120, -+ 0x2009, 0x004f, 0x080c, 0x864c, 0x00ce, 0x001e, 0xd19c, 0x0904, - 0x27bf, 0x7034, 0xd0ac, 0x1560, 0x0016, 0x0156, 0x6027, 0x0008, - 0x602f, 0x0020, 0x20a9, 0x0006, 0x1d04, 0x2774, 0x2091, 0x6000, - 0x1f04, 0x2774, 0x602f, 0x0000, 0x6150, 0xa185, 0x1400, 0x6052, - 0x20a9, 0x0366, 0x1d04, 0x2782, 0x2091, 0x6000, 0x6020, 0xd09c, - 0x1130, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, 0x0480, 0x080c, - 0x2907, 0x1f04, 0x2782, 0x015e, 0x6152, 0x001e, 0x6027, 0x0008, -- 0x0016, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x8076, -- 0x2011, 0x0002, 0x080c, 0x8080, 0x080c, 0x7f5a, 0x0036, 0x2019, -- 0x0000, 0x080c, 0x7fe5, 0x003e, 0x60e3, 0x0000, 0x080c, 0xb423, -- 0x080c, 0xb43e, 0xa085, 0x0001, 0x080c, 0x5b14, 0x2001, 0xb500, -+ 0x0016, 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x8075, -+ 0x2011, 0x0002, 0x080c, 0x807f, 0x080c, 0x7f59, 0x0036, 0x2019, -+ 0x0000, 0x080c, 0x7fe4, 0x003e, 0x60e3, 0x0000, 0x080c, 0xb42f, -+ 0x080c, 0xb44a, 0xa085, 0x0001, 0x080c, 0x5b13, 0x2001, 0xb500, - 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, 0x12dd, 0x001e, 0xa18c, - 0xffd0, 0x6126, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, - 0x0126, 0x2091, 0x8000, 0x2071, 0xb500, 0x71c4, 0x70c6, 0xa116, -- 0x0500, 0x81ff, 0x0128, 0x2011, 0x8011, 0x080c, 0x3ecd, 0x00c8, -- 0x2011, 0x8012, 0x080c, 0x3ecd, 0x2001, 0xb572, 0x2004, 0xd0fc, -- 0x1180, 0x0036, 0x00c6, 0x080c, 0x2892, 0x080c, 0x7f36, 0x2061, -+ 0x0500, 0x81ff, 0x0128, 0x2011, 0x8011, 0x080c, 0x3ecc, 0x00c8, -+ 0x2011, 0x8012, 0x080c, 0x3ecc, 0x2001, 0xb572, 0x2004, 0xd0fc, -+ 0x1180, 0x0036, 0x00c6, 0x080c, 0x2892, 0x080c, 0x7f35, 0x2061, - 0x0100, 0x2019, 0x0028, 0x2009, 0x0000, 0x080c, 0x2c6f, 0x00ce, - 0x003e, 0x012e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, - 0x00c6, 0x00f6, 0x0006, 0x0026, 0x2061, 0x0100, 0xa190, 0x280b, -@@ -829,14 +829,14 @@ unsigned short risc_code01[] = { - 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, 0x66b2, -+ 0x2130, 0xa094, 0xff00, 0x1110, 0x81ff, 0x0118, 0x080c, 0x66b1, - 0x0038, 0xa080, 0x2dc4, 0x200d, 0xa18c, 0xff00, 0x810f, 0xa006, - 0x0005, 0xa080, 0x2dc4, 0x200d, 0xa18c, 0x00ff, 0x0005, 0x00d6, - 0x2069, 0x0140, 0x2001, 0xb515, 0x2003, 0x00ef, 0x20a9, 0x0010, - 0xa006, 0x6852, 0x6856, 0x1f04, 0x2842, 0x00de, 0x0005, 0x0006, - 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0xb515, 0x2102, 0x8114, - 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0xa006, -- 0x82ff, 0x1128, 0xa184, 0x000f, 0xa080, 0xb452, 0x2005, 0x6856, -+ 0x82ff, 0x1128, 0xa184, 0x000f, 0xa080, 0xb45e, 0x2005, 0x6856, - 0x8211, 0x1f04, 0x2857, 0x002e, 0x00de, 0x000e, 0x0005, 0x00c6, - 0x2061, 0xb500, 0x6030, 0x0110, 0xc09d, 0x0008, 0xc09c, 0x6032, - 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, 0x0006, 0x2069, -@@ -844,13 +844,13 @@ unsigned short risc_code01[] = { - 0x22a8, 0x2001, 0x0402, 0x0018, 0x22a8, 0x2001, 0x0404, 0x680e, - 0x1f04, 0x2887, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, - 0x015e, 0x0005, 0x2001, 0xb553, 0x2004, 0xd0c4, 0x0150, 0xd0a4, -- 0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xb0dc, -+ 0x0140, 0xa006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xb0e8, - 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, 0x6b41, 0x2011, 0x0030, 0x2200, 0x8007, 0xa085, 0x004c, -+ 0x080c, 0x6b40, 0x2011, 0x0030, 0x2200, 0x8007, 0xa085, 0x004c, - 0x78c2, 0x2009, 0x0204, 0x210c, 0x2200, 0xa100, 0x2009, 0x0138, -- 0x200a, 0x080c, 0x5ad0, 0x1118, 0x2009, 0xb78f, 0x200a, 0x002e, -+ 0x200a, 0x080c, 0x5acf, 0x1118, 0x2009, 0xb78f, 0x200a, 0x002e, - 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, - 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, - 0x2014, 0xa184, 0x0003, 0x0110, 0x0804, 0x1b04, 0x002e, 0x001e, -@@ -912,10 +912,10 @@ unsigned short risc_code01[] = { - 0x23f2, 0x0098, 0x0106, 0x0006, 0x080c, 0x28d6, 0x080c, 0x2519, - 0x080c, 0x239c, 0x080c, 0x23f2, 0x0040, 0x20d1, 0x0000, 0x20d1, - 0x0001, 0x20d1, 0x0000, 0x080c, 0x1515, 0x000e, 0x010e, 0x000d, -- 0x00c6, 0x0026, 0x0046, 0x2021, 0x0000, 0x080c, 0x530a, 0x1904, -+ 0x00c6, 0x0026, 0x0046, 0x2021, 0x0000, 0x080c, 0x5309, 0x1904, - 0x2b95, 0x72d4, 0x2001, 0xb79e, 0x2004, 0xa005, 0x1110, 0xd29c, - 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x2b95, 0x080c, 0x2b99, -- 0x0804, 0x2b95, 0xd2cc, 0x1904, 0x2b95, 0x080c, 0x5ad0, 0x1120, -+ 0x0804, 0x2b95, 0xd2cc, 0x1904, 0x2b95, 0x080c, 0x5acf, 0x1120, - 0x709f, 0xffff, 0x0804, 0x2b95, 0xd294, 0x0120, 0x709f, 0xffff, - 0x0804, 0x2b95, 0x2001, 0xb515, 0x203c, 0x7288, 0xd284, 0x0904, - 0x2b37, 0xd28c, 0x1904, 0x2b37, 0x0036, 0x739c, 0xa38e, 0xffff, -@@ -923,7 +923,7 @@ unsigned short risc_code01[] = { - 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, 0x281d, 0x080c, 0x4f4e, -+ 0x003e, 0x0428, 0x2009, 0x0000, 0x080c, 0x281d, 0x080c, 0x4f4d, - 0x11b8, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1150, 0x7030, - 0xd08c, 0x0118, 0x6000, 0xd0bc, 0x0120, 0x080c, 0x2bac, 0x0140, - 0x0028, 0x080c, 0x2cdd, 0x080c, 0x2bda, 0x0110, 0x8318, 0x0818, -@@ -932,51 +932,51 @@ unsigned short risc_code01[] = { - 0xa096, 0xffff, 0x1120, 0x2009, 0x0000, 0x28a8, 0x0050, 0xa812, - 0x0220, 0x2008, 0xa802, 0x20a8, 0x0020, 0x709f, 0xffff, 0x0804, - 0x2b95, 0x2700, 0x0156, 0x0016, 0xa106, 0x05a0, 0xc484, 0x080c, -- 0x4faa, 0x0120, 0x080c, 0x4f4e, 0x15a8, 0x0008, 0xc485, 0x6004, -+ 0x4fa9, 0x0120, 0x080c, 0x4f4d, 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, 0x4f6d, -+ 0x00ff, 0xa082, 0x0006, 0x02b0, 0xd484, 0x1118, 0x080c, 0x4f6c, - 0x0028, 0x080c, 0x2d6a, 0x0170, 0x080c, 0x2d97, 0x0058, 0x080c, - 0x2cdd, 0x080c, 0x2bda, 0x0170, 0x0028, 0x080c, 0x2d6a, 0x0110, - 0x0419, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x2b51, 0x709f, - 0xffff, 0x0018, 0x001e, 0x015e, 0x719e, 0x004e, 0x002e, 0x00ce, - 0x0005, 0x00c6, 0x0016, 0x709f, 0x0001, 0x2009, 0x007e, 0x080c, -- 0x4f4e, 0x1138, 0x080c, 0x2cdd, 0x04a9, 0x0118, 0x70d4, 0xc0bd, -+ 0x4f4d, 0x1138, 0x080c, 0x2cdd, 0x04a9, 0x0118, 0x70d4, 0xc0bd, - 0x70d6, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, - 0x2c68, 0x2001, 0xb557, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, -- 0x9ed0, 0x01d8, 0x2d00, 0x601a, 0x080c, 0xa021, 0x601f, 0x0001, -- 0x2001, 0x0000, 0x080c, 0x4eec, 0x2001, 0x0000, 0x080c, 0x4efe, -+ 0x9ed6, 0x01d8, 0x2d00, 0x601a, 0x080c, 0xa027, 0x601f, 0x0001, -+ 0x2001, 0x0000, 0x080c, 0x4eeb, 0x2001, 0x0000, 0x080c, 0x4efd, - 0x0126, 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, -- 0x0004, 0x080c, 0x8646, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, -+ 0x0004, 0x080c, 0x864c, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, - 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x2001, -- 0xb557, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, 0x9ed0, 0x0550, -+ 0xb557, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, 0x9ed6, 0x0550, - 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, 0xa086, 0x007e, - 0x0140, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1110, 0x080c, -- 0x2c9c, 0x080c, 0xa021, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, -- 0x4eec, 0x2001, 0x0002, 0x080c, 0x4efe, 0x0126, 0x2091, 0x8000, -- 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0002, 0x080c, 0x8646, -+ 0x2c9c, 0x080c, 0xa027, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, -+ 0x4eeb, 0x2001, 0x0002, 0x080c, 0x4efd, 0x0126, 0x2091, 0x8000, -+ 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0002, 0x080c, 0x864c, - 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, -- 0x0026, 0x2009, 0x0080, 0x080c, 0x4f4e, 0x1120, 0x0031, 0x0110, -+ 0x0026, 0x2009, 0x0080, 0x080c, 0x4f4d, 0x1120, 0x0031, 0x0110, - 0x70db, 0xffff, 0x002e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, -- 0x00c6, 0x2c68, 0x080c, 0x85c1, 0x01e8, 0x2d00, 0x601a, 0x080c, -- 0xa021, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4eec, 0x2001, -- 0x0002, 0x080c, 0x4efe, 0x0126, 0x2091, 0x8000, 0x080c, 0x2c9c, -- 0x70dc, 0x8000, 0x70de, 0x012e, 0x2009, 0x0002, 0x080c, 0x8646, -+ 0x00c6, 0x2c68, 0x080c, 0x85c7, 0x01e8, 0x2d00, 0x601a, 0x080c, -+ 0xa027, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4eeb, 0x2001, -+ 0x0002, 0x080c, 0x4efd, 0x0126, 0x2091, 0x8000, 0x080c, 0x2c9c, -+ 0x70dc, 0x8000, 0x70de, 0x012e, 0x2009, 0x0002, 0x080c, 0x864c, - 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, -- 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x4f4e, -- 0x1190, 0x2c68, 0x080c, 0x85c1, 0x0170, 0x2d00, 0x601a, 0x6312, -- 0x601f, 0x0001, 0x620a, 0x080c, 0xa021, 0x2009, 0x0022, 0x080c, -- 0x8646, 0xa085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, -- 0x00c6, 0x0066, 0x0036, 0x0026, 0x080c, 0x6e02, 0x080c, 0x6da5, -- 0x080c, 0x9069, 0x2130, 0x81ff, 0x0128, 0x20a9, 0x007e, 0x2009, -+ 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x4f4d, -+ 0x1190, 0x2c68, 0x080c, 0x85c7, 0x0170, 0x2d00, 0x601a, 0x6312, -+ 0x601f, 0x0001, 0x620a, 0x080c, 0xa027, 0x2009, 0x0022, 0x080c, -+ 0x864c, 0xa085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, -+ 0x00c6, 0x0066, 0x0036, 0x0026, 0x080c, 0x6e01, 0x080c, 0x6da4, -+ 0x080c, 0x906f, 0x2130, 0x81ff, 0x0128, 0x20a9, 0x007e, 0x2009, - 0x0000, 0x0020, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, -- 0x4faa, 0x1120, 0x080c, 0x51ab, 0x080c, 0x4c0c, 0x001e, 0x8108, -+ 0x4fa9, 0x1120, 0x080c, 0x51aa, 0x080c, 0x4c0b, 0x001e, 0x8108, - 0x1f04, 0x2c86, 0x86ff, 0x1110, 0x080c, 0x11f0, 0x002e, 0x003e, - 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0026, - 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, -- 0x6df6, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d03, 0x2c08, 0x080c, -- 0xae76, 0x007e, 0x001e, 0x2e60, 0x080c, 0x51ab, 0x6210, 0x6314, -- 0x080c, 0x4c0c, 0x6212, 0x6316, 0x001e, 0x002e, 0x003e, 0x00ce, -+ 0x6df5, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d02, 0x2c08, 0x080c, -+ 0xae82, 0x007e, 0x001e, 0x2e60, 0x080c, 0x51aa, 0x6210, 0x6314, -+ 0x080c, 0x4c0b, 0x6212, 0x6316, 0x001e, 0x002e, 0x003e, 0x00ce, - 0x00ee, 0x0005, 0x00e6, 0x0006, 0x6018, 0xa080, 0x0028, 0x2004, - 0xa086, 0x0080, 0x0150, 0x2071, 0xb500, 0x7098, 0xa005, 0x0110, - 0x8001, 0x709a, 0x000e, 0x00ee, 0x0005, 0x2071, 0xb500, 0x70dc, -@@ -984,20 +984,20 @@ unsigned short risc_code01[] = { - 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x0156, - 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0098, 0x2001, 0xb553, - 0x2004, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0xa006, 0x0046, 0x2020, -- 0x2009, 0x002d, 0x080c, 0xb0dc, 0x004e, 0x20a9, 0x00ff, 0x2011, -+ 0x2009, 0x002d, 0x080c, 0xb0e8, 0x004e, 0x20a9, 0x00ff, 0x2011, - 0x0000, 0x0026, 0xa28e, 0x007e, 0x0904, 0x2d49, 0xa28e, 0x007f, - 0x0904, 0x2d49, 0xa28e, 0x0080, 0x05e0, 0xa288, 0xb635, 0x210c, - 0x81ff, 0x05b8, 0x8fff, 0x1148, 0x2001, 0xb7be, 0x0006, 0x2003, - 0x0001, 0x04d9, 0x000e, 0x2003, 0x0000, 0x00c6, 0x2160, 0x2001, -- 0x0001, 0x080c, 0x5314, 0x00ce, 0x2019, 0x0029, 0x080c, 0x6df6, -- 0x0076, 0x2039, 0x0000, 0x080c, 0x6d03, 0x00c6, 0x0026, 0x2160, -+ 0x0001, 0x080c, 0x5313, 0x00ce, 0x2019, 0x0029, 0x080c, 0x6df5, -+ 0x0076, 0x2039, 0x0000, 0x080c, 0x6d02, 0x00c6, 0x0026, 0x2160, - 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x1118, 0x6007, 0x0404, - 0x0028, 0x2001, 0x0004, 0x8007, 0xa215, 0x6206, 0x002e, 0x00ce, -- 0x0016, 0x2c08, 0x080c, 0xae76, 0x001e, 0x007e, 0x2160, 0x080c, -- 0x51ab, 0x002e, 0x8210, 0x1f04, 0x2d01, 0x015e, 0x001e, 0x002e, -+ 0x0016, 0x2c08, 0x080c, 0xae82, 0x001e, 0x007e, 0x2160, 0x080c, -+ 0x51aa, 0x002e, 0x8210, 0x1f04, 0x2d01, 0x015e, 0x001e, 0x002e, - 0x003e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, - 0x2001, 0xb553, 0x2004, 0xd0c4, 0x0148, 0xd0a4, 0x0138, 0xa006, -- 0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xb0dc, 0x001e, 0x002e, -+ 0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xb0e8, 0x001e, 0x002e, - 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7288, 0x82ff, - 0x01f8, 0x2011, 0xb553, 0x2214, 0xd2ac, 0x11d0, 0x2100, 0x080c, - 0x2831, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, 0xa2e0, 0xbcc0, -@@ -1005,10 +1005,10 @@ unsigned short risc_code01[] = { - 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, 0x8293, 0x002e, 0x080c, 0xb381, -+ 0x0026, 0x2019, 0x0029, 0x080c, 0x8299, 0x002e, 0x080c, 0xb38d, - 0x003e, 0x002e, 0x001e, 0xa180, 0xb635, 0x2004, 0xa065, 0x0158, - 0x0016, 0x00c6, 0x2061, 0xb8f4, 0x001e, 0x611a, 0x080c, 0x2c9c, -- 0x001e, 0x080c, 0x4f6d, 0x012e, 0x00ce, 0x001e, 0x0005, 0x2001, -+ 0x001e, 0x080c, 0x4f6c, 0x012e, 0x00ce, 0x001e, 0x0005, 0x2001, - 0xb535, 0x2004, 0xd0cc, 0x0005, 0x7eef, 0x7de8, 0x7ce4, 0x80e2, - 0x7be1, 0x80e0, 0x80dc, 0x80da, 0x7ad9, 0x80d6, 0x80d5, 0x80d4, - 0x80d3, 0x80d2, 0x80d1, 0x79ce, 0x78cd, 0x80cc, 0x80cb, 0x80ca, -@@ -1063,89 +1063,89 @@ unsigned short risc_code01[] = { - 0x2fc6, 0x2fc6, 0x3282, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, - 0x3294, 0x329e, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, - 0x0002, 0x32c8, 0x331c, 0x3377, 0x3391, 0x2fc6, 0x33c2, 0x37f5, -- 0x4234, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, -- 0x2fc6, 0x300c, 0x300f, 0x37f7, 0x2fc6, 0x3804, 0x42cd, 0x4328, -- 0x438c, 0x2fc6, 0x43ef, 0x4419, 0x4438, 0x446a, 0x2fc6, 0x2fc6, -+ 0x4233, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, -+ 0x2fc6, 0x300c, 0x300f, 0x37f7, 0x2fc6, 0x3804, 0x42cc, 0x4327, -+ 0x438b, 0x2fc6, 0x43ee, 0x4418, 0x4437, 0x4469, 0x2fc6, 0x2fc6, - 0x2fc6, 0x3808, 0x39ad, 0x39c7, 0x39e5, 0x3a46, 0x3aa6, 0x3ab1, -- 0x3ae9, 0x3af8, 0x3b07, 0x3b0a, 0x3b2d, 0x3b77, 0x3bed, 0x3bfa, -- 0x3cfb, 0x3e24, 0x3e4d, 0x3f4b, 0x3f6d, 0x3f79, 0x3fb2, 0x4076, -- 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x40de, 0x40f9, 0x416b, 0x421d, -- 0x713c, 0x0000, 0x2021, 0x4000, 0x080c, 0x3eaa, 0x0126, 0x2091, -+ 0x3ae9, 0x3af8, 0x3b07, 0x3b0a, 0x3b2d, 0x3b79, 0x3bef, 0x3bfc, -+ 0x3cfd, 0x3e23, 0x3e4c, 0x3f4a, 0x3f6c, 0x3f78, 0x3fb1, 0x4075, -+ 0x2fc6, 0x2fc6, 0x2fc6, 0x2fc6, 0x40dd, 0x40f8, 0x416a, 0x421c, -+ 0x713c, 0x0000, 0x2021, 0x4000, 0x080c, 0x3ea9, 0x0126, 0x2091, - 0x8000, 0x0e04, 0x2fb6, 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, 0x3eb7, 0x7823, 0x0004, 0x7824, -+ 0x7a2c, 0x7824, 0x7930, 0x0804, 0x3eb6, 0x7823, 0x0004, 0x7824, - 0x0807, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804, -- 0x3eba, 0x7924, 0x7828, 0x2114, 0x200a, 0x0804, 0x2faa, 0x7924, -+ 0x3eb9, 0x7924, 0x7828, 0x2114, 0x200a, 0x0804, 0x2faa, 0x7924, - 0x2114, 0x0804, 0x2faa, 0x2099, 0x0009, 0x20a1, 0x0009, 0x20a9, - 0x0007, 0x53a3, 0x7924, 0x7a28, 0x7b2c, 0x0804, 0x2faa, 0x7824, -- 0x2060, 0x0090, 0x2009, 0x0002, 0x2011, 0x0002, 0x2019, 0x0004, -+ 0x2060, 0x0090, 0x2009, 0x0002, 0x2011, 0x0002, 0x2019, 0x0006, - 0x783b, 0x0017, 0x0804, 0x2faa, 0x7d38, 0x7c3c, 0x0840, 0x7d38, - 0x7c3c, 0x0888, 0x2061, 0x1000, 0xe10c, 0xa006, 0x2c15, 0xa200, - 0x8c60, 0x8109, 0x1dd8, 0x2010, 0xa005, 0x0904, 0x2faa, 0x0804, - 0x2fcc, 0x2069, 0xb552, 0x7824, 0x7930, 0xa11a, 0x1a04, 0x2fd2, - 0x8019, 0x0904, 0x2fd2, 0x684a, 0x6942, 0x782c, 0x6852, 0x7828, -- 0x6856, 0xa006, 0x685a, 0x685e, 0x080c, 0x5da6, 0x0804, 0x2faa, -+ 0x6856, 0xa006, 0x685a, 0x685e, 0x080c, 0x5da5, 0x0804, 0x2faa, - 0x2069, 0xb552, 0x7824, 0x7934, 0xa11a, 0x1a04, 0x2fd2, 0x8019, - 0x0904, 0x2fd2, 0x684e, 0x6946, 0x782c, 0x6862, 0x7828, 0x6866, -- 0xa006, 0x686a, 0x686e, 0x080c, 0x53d6, 0x0804, 0x2faa, 0xa02e, -+ 0xa006, 0x686a, 0x686e, 0x080c, 0x53d5, 0x0804, 0x2faa, 0xa02e, - 0x2520, 0x81ff, 0x1904, 0x2fcf, 0x7924, 0x7b28, 0x7a2c, 0x20a9, -- 0x0005, 0x20a1, 0xb589, 0x41a1, 0x080c, 0x3e76, 0x0904, 0x2fcf, -- 0x2009, 0x0020, 0x080c, 0x3eb7, 0x701b, 0x3067, 0x0005, 0x6834, -+ 0x0005, 0x20a1, 0xb589, 0x41a1, 0x080c, 0x3e75, 0x0904, 0x2fcf, -+ 0x2009, 0x0020, 0x080c, 0x3eb6, 0x701b, 0x3067, 0x0005, 0x6834, - 0x2008, 0xa084, 0x00ff, 0xa096, 0x0011, 0x0138, 0xa096, 0x0019, - 0x0120, 0xa096, 0x0015, 0x1904, 0x2fcf, 0x810f, 0xa18c, 0x00ff, - 0x0904, 0x2fcf, 0x710e, 0x700c, 0x8001, 0x0528, 0x700e, 0x080c, -- 0x3e76, 0x0904, 0x2fcf, 0x2009, 0x0020, 0x2061, 0xb5d2, 0x6224, -+ 0x3e75, 0x0904, 0x2fcf, 0x2009, 0x0020, 0x2061, 0xb5d2, 0x6224, - 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, 0x0000, 0xa4a1, -- 0x0000, 0xa5a9, 0x0000, 0x080c, 0x3eb7, 0x701b, 0x3098, 0x0005, -+ 0x0000, 0xa5a9, 0x0000, 0x080c, 0x3eb6, 0x701b, 0x3098, 0x0005, - 0x6834, 0xa084, 0x00ff, 0xa096, 0x0002, 0x0120, 0xa096, 0x000a, - 0x1904, 0x2fcf, 0x08c0, 0x7010, 0x2068, 0x6838, 0xc0fd, 0x683a, -- 0x080c, 0x4e4a, 0x1128, 0x7007, 0x0003, 0x701b, 0x30b2, 0x0005, -- 0x080c, 0x54dc, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x2099, -+ 0x080c, 0x4e49, 0x1128, 0x7007, 0x0003, 0x701b, 0x30b2, 0x0005, -+ 0x080c, 0x54db, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x2099, - 0xb589, 0x530a, 0x2100, 0xa210, 0xa399, 0x0000, 0xa4a1, 0x0000, - 0xa5a9, 0x0000, 0xad80, 0x000d, 0x2009, 0x0020, 0x012e, 0x0804, -- 0x3eba, 0x61ac, 0x7824, 0x60ae, 0x0804, 0x2faa, 0x2091, 0x8000, -+ 0x3eb9, 0x61ac, 0x7824, 0x60ae, 0x0804, 0x2faa, 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, 0x2fcf, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x4faa, -+ 0x1904, 0x2fcf, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x4fa9, - 0x1904, 0x2fd2, 0x7e38, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0210, -- 0x0804, 0x2fd2, 0x7c28, 0x7d2c, 0x080c, 0x5172, 0xd28c, 0x1118, -- 0x080c, 0x511b, 0x0010, 0x080c, 0x514b, 0x1518, 0x2061, 0xbd00, -+ 0x0804, 0x2fd2, 0x7c28, 0x7d2c, 0x080c, 0x5171, 0xd28c, 0x1118, -+ 0x080c, 0x511a, 0x0010, 0x080c, 0x514a, 0x1518, 0x2061, 0xbd00, - 0x0126, 0x2091, 0x8000, 0x6000, 0xa086, 0x0000, 0x0148, 0x6010, - 0xa06d, 0x0130, 0x683c, 0xa406, 0x1118, 0x6840, 0xa506, 0x0150, - 0x012e, 0xace0, 0x0018, 0x2001, 0xb517, 0x2004, 0xac02, 0x1a04, -- 0x2fcf, 0x0c30, 0x080c, 0x9924, 0x012e, 0x0904, 0x2fcf, 0x0804, -- 0x2faa, 0xa00e, 0x2001, 0x0005, 0x080c, 0x54dc, 0x0126, 0x2091, -- 0x8000, 0x080c, 0x9ecc, 0x080c, 0x5409, 0x012e, 0x0804, 0x2faa, -- 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e8b, 0x0904, 0x2fd2, 0x080c, -- 0x5070, 0x0904, 0x2fcf, 0x080c, 0x517e, 0x0904, 0x2fcf, 0x0804, -- 0x2faa, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e9b, 0x0904, 0x2fd2, -- 0x080c, 0x51ea, 0x0904, 0x2fcf, 0x2019, 0x0005, 0x7924, 0x080c, -- 0x5199, 0x0904, 0x2fcf, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x2fd2, -- 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x69a9, 0x0804, 0x2faa, -+ 0x2fcf, 0x0c30, 0x080c, 0x992a, 0x012e, 0x0904, 0x2fcf, 0x0804, -+ 0x2faa, 0xa00e, 0x2001, 0x0005, 0x080c, 0x54db, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x9ed2, 0x080c, 0x5408, 0x012e, 0x0804, 0x2faa, -+ 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e8a, 0x0904, 0x2fd2, 0x080c, -+ 0x506f, 0x0904, 0x2fcf, 0x080c, 0x517d, 0x0904, 0x2fcf, 0x0804, -+ 0x2faa, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e9a, 0x0904, 0x2fd2, -+ 0x080c, 0x51e9, 0x0904, 0x2fcf, 0x2019, 0x0005, 0x7924, 0x080c, -+ 0x5198, 0x0904, 0x2fcf, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x2fd2, -+ 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x69a8, 0x0804, 0x2faa, - 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, - 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x01f8, 0x2508, 0x080c, -- 0x4faa, 0x11d8, 0x080c, 0x51ea, 0x1128, 0x2009, 0x0002, 0x62b4, -- 0x2518, 0x00c0, 0x2019, 0x0004, 0xa00e, 0x080c, 0x5199, 0x1118, -+ 0x4fa9, 0x11d8, 0x080c, 0x51e9, 0x1128, 0x2009, 0x0002, 0x62b4, -+ 0x2518, 0x00c0, 0x2019, 0x0004, 0xa00e, 0x080c, 0x5198, 0x1118, - 0x2009, 0x0006, 0x0078, 0x7824, 0xa08a, 0x1000, 0x1270, 0x8003, -- 0x800b, 0x810b, 0xa108, 0x080c, 0x69a9, 0x8529, 0x1ae0, 0x012e, -+ 0x800b, 0x810b, 0xa108, 0x080c, 0x69a8, 0x8529, 0x1ae0, 0x012e, - 0x0804, 0x2faa, 0x012e, 0x0804, 0x2fcf, 0x012e, 0x0804, 0x2fd2, -- 0x080c, 0x3e8b, 0x0904, 0x2fd2, 0x080c, 0x50d6, 0x080c, 0x5172, -- 0x0804, 0x2faa, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e8b, 0x0904, -- 0x2fd2, 0x080c, 0x50c7, 0x080c, 0x5172, 0x0804, 0x2faa, 0x81ff, -- 0x1904, 0x2fcf, 0x080c, 0x3e8b, 0x0904, 0x2fd2, 0x080c, 0x514d, -- 0x0904, 0x2fcf, 0x080c, 0x4e8e, 0x080c, 0x5114, 0x080c, 0x5172, -- 0x0804, 0x2faa, 0x080c, 0x3e8b, 0x0904, 0x2fd2, 0x080c, 0x5070, -- 0x0904, 0x2fcf, 0x62a0, 0x2019, 0x0005, 0x00c6, 0x080c, 0x51ab, -- 0x2061, 0x0000, 0x080c, 0x6df6, 0x0076, 0x2039, 0x0000, 0x080c, -- 0x6d03, 0x2009, 0x0000, 0x080c, 0xae76, 0x007e, 0x00ce, 0x080c, -- 0x5172, 0x0804, 0x2faa, 0x080c, 0x3e8b, 0x0904, 0x2fd2, 0x080c, -- 0x5172, 0x2208, 0x0804, 0x2faa, 0x0156, 0x00d6, 0x00e6, 0x2069, -+ 0x080c, 0x3e8a, 0x0904, 0x2fd2, 0x080c, 0x50d5, 0x080c, 0x5171, -+ 0x0804, 0x2faa, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e8a, 0x0904, -+ 0x2fd2, 0x080c, 0x50c6, 0x080c, 0x5171, 0x0804, 0x2faa, 0x81ff, -+ 0x1904, 0x2fcf, 0x080c, 0x3e8a, 0x0904, 0x2fd2, 0x080c, 0x514c, -+ 0x0904, 0x2fcf, 0x080c, 0x4e8d, 0x080c, 0x5113, 0x080c, 0x5171, -+ 0x0804, 0x2faa, 0x080c, 0x3e8a, 0x0904, 0x2fd2, 0x080c, 0x506f, -+ 0x0904, 0x2fcf, 0x62a0, 0x2019, 0x0005, 0x00c6, 0x080c, 0x51aa, -+ 0x2061, 0x0000, 0x080c, 0x6df5, 0x0076, 0x2039, 0x0000, 0x080c, -+ 0x6d02, 0x2009, 0x0000, 0x080c, 0xae82, 0x007e, 0x00ce, 0x080c, -+ 0x5171, 0x0804, 0x2faa, 0x080c, 0x3e8a, 0x0904, 0x2fd2, 0x080c, -+ 0x5171, 0x2208, 0x0804, 0x2faa, 0x0156, 0x00d6, 0x00e6, 0x2069, - 0xb614, 0x6810, 0x6914, 0xa10a, 0x1210, 0x2009, 0x0000, 0x6816, - 0x2011, 0x0000, 0x2019, 0x0000, 0x20a9, 0x007e, 0x2069, 0xb635, - 0x2d04, 0xa075, 0x0130, 0x704c, 0x0071, 0xa210, 0x7080, 0x0059, -@@ -1156,18 +1156,18 @@ unsigned short risc_code01[] = { - 0x81ff, 0x1904, 0x2fcf, 0x6150, 0xa190, 0x2dc4, 0x2215, 0xa294, - 0x00ff, 0x6370, 0x83ff, 0x0108, 0x6274, 0x67d4, 0xd79c, 0x0118, - 0x2031, 0x0001, 0x0090, 0xd7ac, 0x0118, 0x2031, 0x0003, 0x0068, -- 0xd7a4, 0x0118, 0x2031, 0x0002, 0x0040, 0x080c, 0x5ad0, 0x1118, -+ 0xd7a4, 0x0118, 0x2031, 0x0002, 0x0040, 0x080c, 0x5acf, 0x1118, - 0x2031, 0x0004, 0x0010, 0x2031, 0x0000, 0x7e3a, 0x7f3e, 0x0804, - 0x2faa, 0x6140, 0x6244, 0x2019, 0xb7b6, 0x231c, 0x0804, 0x2faa, - 0x0126, 0x2091, 0x8000, 0x6134, 0xa006, 0x2010, 0x6338, 0x012e, -- 0x0804, 0x2faa, 0x080c, 0x3e9b, 0x0904, 0x2fd2, 0x6244, 0x6338, -+ 0x0804, 0x2faa, 0x080c, 0x3e9a, 0x0904, 0x2fd2, 0x6244, 0x6338, - 0x0804, 0x2faa, 0x6140, 0x6244, 0x7824, 0x6042, 0x7b28, 0x6346, - 0x2069, 0xb552, 0x831f, 0xa305, 0x6816, 0x782c, 0x2069, 0xb7b6, - 0x2d1c, 0x206a, 0x0804, 0x2faa, 0x0126, 0x2091, 0x8000, 0x7824, - 0x6036, 0x782c, 0x603a, 0x012e, 0x0804, 0x2faa, 0x7838, 0xa005, - 0x01a8, 0x7828, 0xa025, 0x0904, 0x2fd2, 0x782c, 0xa02d, 0x0904, -- 0x2fd2, 0xa00e, 0x080c, 0x4faa, 0x1120, 0x6244, 0x6338, 0x6446, -- 0x653a, 0xa186, 0x00ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x3e9b, -+ 0x2fd2, 0xa00e, 0x080c, 0x4fa9, 0x1120, 0x6244, 0x6338, 0x6446, -+ 0x653a, 0xa186, 0x00ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x3e9a, - 0x0904, 0x2fd2, 0x7828, 0xa00d, 0x0904, 0x2fd2, 0x782c, 0xa005, - 0x0904, 0x2fd2, 0x6244, 0x6146, 0x6338, 0x603a, 0x0804, 0x2faa, - 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, 0x1904, 0x2fcf, 0x00c6, -@@ -1175,32 +1175,32 @@ unsigned short risc_code01[] = { - 0x1130, 0x2001, 0xb515, 0x2004, 0xa085, 0xff00, 0x0078, 0xa182, - 0x007f, 0x16a0, 0xa188, 0x2dc4, 0x210d, 0xa18c, 0x00ff, 0x2001, - 0xb515, 0x2004, 0xa116, 0x0550, 0x810f, 0xa105, 0x0126, 0x2091, -- 0x8000, 0x0006, 0x080c, 0x85c1, 0x000e, 0x01e0, 0x601a, 0x600b, -- 0xbc09, 0x601f, 0x0001, 0x080c, 0x3e76, 0x01d8, 0x6837, 0x0000, -+ 0x8000, 0x0006, 0x080c, 0x85c7, 0x000e, 0x01e0, 0x601a, 0x600b, -+ 0xbc09, 0x601f, 0x0001, 0x080c, 0x3e75, 0x01d8, 0x6837, 0x0000, - 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b, -- 0x3370, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, 0x8646, 0x012e, -+ 0x3370, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, 0x864c, 0x012e, - 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x2fcf, 0x00ce, 0x0804, -- 0x2fd2, 0x080c, 0x8617, 0x0cb0, 0x2001, 0xb500, 0x2004, 0xa086, -+ 0x2fd2, 0x080c, 0x861d, 0x0cb0, 0x2001, 0xb500, 0x2004, 0xa086, - 0x0003, 0x1904, 0x2fcf, 0x00c6, 0x2061, 0x0100, 0x7924, 0x810f, - 0xa18c, 0x00ff, 0xa196, 0x00ff, 0x1130, 0x2001, 0xb515, 0x2004, - 0xa085, 0xff00, 0x0078, 0xa182, 0x007f, 0x16a0, 0xa188, 0x2dc4, - 0x210d, 0xa18c, 0x00ff, 0x2001, 0xb515, 0x2004, 0xa116, 0x0550, -- 0x810f, 0xa105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x85c1, -+ 0x810f, 0xa105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x85c7, - 0x000e, 0x01e0, 0x601a, 0x600b, 0xbc05, 0x601f, 0x0001, 0x080c, -- 0x3e76, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, -+ 0x3e75, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, - 0x6838, 0xc0fd, 0x683a, 0x701b, 0x3370, 0x2d00, 0x6012, 0x2009, -- 0x0032, 0x080c, 0x8646, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, -- 0x0804, 0x2fcf, 0x00ce, 0x0804, 0x2fd2, 0x080c, 0x8617, 0x0cb0, -+ 0x0032, 0x080c, 0x864c, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, -+ 0x0804, 0x2fcf, 0x00ce, 0x0804, 0x2fd2, 0x080c, 0x861d, 0x0cb0, - 0x6830, 0xa086, 0x0100, 0x0904, 0x2fcf, 0x0804, 0x2faa, 0x2061, - 0xb874, 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, 0x0178, 0x6104, - 0x6208, 0x2a60, 0x6068, 0x783a, 0x60b4, 0x783e, 0x60b0, 0x2019, - 0x0072, 0x201a, 0x6348, 0x012e, 0x0804, 0x2faa, 0xa00e, 0x2110, -- 0x0c80, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x5ad0, 0x0904, 0x2fcf, -+ 0x0c80, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x5acf, 0x0904, 0x2fcf, - 0x0126, 0x2091, 0x8000, 0x6248, 0x6068, 0xa202, 0x0248, 0xa085, -- 0x0001, 0x080c, 0x2867, 0x080c, 0x462d, 0x012e, 0x0804, 0x2faa, -+ 0x0001, 0x080c, 0x2867, 0x080c, 0x462c, 0x012e, 0x0804, 0x2faa, - 0x012e, 0x0804, 0x2fd2, 0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, - 0xb7bf, 0x2070, 0x2061, 0xb552, 0x6008, 0x2072, 0x2009, 0x0000, -- 0x2011, 0x1000, 0x080c, 0x6b41, 0x7206, 0x00ee, 0x00ce, 0x001e, -+ 0x2011, 0x1000, 0x080c, 0x6b40, 0x7206, 0x00ee, 0x00ce, 0x001e, - 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7824, 0xa084, 0x0007, - 0x0002, 0x33d4, 0x33dd, 0x33e4, 0x33d1, 0x33d1, 0x33d1, 0x33d1, - 0x33d1, 0x012e, 0x0804, 0x2fd2, 0x2009, 0x0114, 0x2104, 0xa085, -@@ -1308,10 +1308,10 @@ unsigned short risc_code01[] = { - 0x00c6, 0x2061, 0x0200, 0x2001, 0xb7c0, 0x2004, 0x601a, 0x2061, - 0x0100, 0x2001, 0xb7bf, 0x2004, 0x60ce, 0x6004, 0xc0ac, 0xa085, - 0x0200, 0x6006, 0x2001, 0x0074, 0x2004, 0xa005, 0x01f8, 0x2038, -- 0x2001, 0x0076, 0x2024, 0x2001, 0x0077, 0x201c, 0x080c, 0x3e76, -+ 0x2001, 0x0076, 0x2024, 0x2001, 0x0077, 0x201c, 0x080c, 0x3e75, - 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, 0x0007, 0x0220, - 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, 0x6818, 0xa080, -- 0x000d, 0x04b1, 0x1d90, 0x2d00, 0x681a, 0x0088, 0x080c, 0x3e76, -+ 0x000d, 0x04b1, 0x1d90, 0x2d00, 0x681a, 0x0088, 0x080c, 0x3e75, - 0x6833, 0x000d, 0x2070, 0x6827, 0x0001, 0x2d00, 0x681a, 0x2001, - 0x0076, 0x2004, 0x2072, 0x2001, 0x0077, 0x2004, 0x7006, 0x2061, - 0x0020, 0x2079, 0x0100, 0x2001, 0xb7bf, 0x2004, 0x6012, 0x20e1, -@@ -1322,14 +1322,14 @@ unsigned short risc_code01[] = { - 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, 0x3e76, 0x00ce, 0x6018, -+ 0x00c6, 0x00d6, 0x2d60, 0x00c6, 0x080c, 0x3e75, 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, -- 0x3e76, 0x2d60, 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, -+ 0x3e75, 0x2d60, 0x6833, 0x000d, 0x6f26, 0x2d00, 0x681a, 0xa78a, - 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0xa03e, - 0x6818, 0xa080, 0x000d, 0x080c, 0x3768, 0x1d88, 0x2d00, 0x681a, -- 0x00e0, 0x080c, 0x3e76, 0x2d60, 0x6033, 0x000d, 0x2070, 0x6027, -+ 0x00e0, 0x080c, 0x3e75, 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, -@@ -1338,9 +1338,9 @@ unsigned short risc_code01[] = { - 0x0030, 0x2003, 0x0009, 0x00ee, 0x0005, 0x0804, 0x2faa, 0x0126, - 0x2091, 0x8000, 0x20a9, 0x0012, 0x2001, 0xb540, 0x20a0, 0xa006, - 0x40a4, 0x012e, 0x0804, 0x2faa, 0x7d38, 0x7c3c, 0x0804, 0x3051, -- 0x080c, 0x3e76, 0x0904, 0x2fcf, 0x080c, 0x5ad0, 0x0110, 0x080c, -- 0x4bf1, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, -- 0x3eb7, 0x701b, 0x381c, 0x0005, 0xade8, 0x000d, 0x6800, 0xa005, -+ 0x080c, 0x3e75, 0x0904, 0x2fcf, 0x080c, 0x5acf, 0x0110, 0x080c, -+ 0x4bf0, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, -+ 0x3eb6, 0x701b, 0x381c, 0x0005, 0xade8, 0x000d, 0x6800, 0xa005, - 0x0904, 0x2fd2, 0x6804, 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x2fd2, - 0xd094, 0x00c6, 0x2061, 0x0100, 0x6104, 0x0138, 0x6200, 0xa292, - 0x0005, 0x0218, 0xa18c, 0xffdf, 0x0010, 0xa18d, 0x0020, 0x6106, -@@ -1354,9 +1354,9 @@ unsigned short risc_code01[] = { - 0x0904, 0x2fd2, 0x6810, 0xa005, 0x0904, 0x2fd2, 0x6848, 0x6940, - 0xa10a, 0x1a04, 0x2fd2, 0x8001, 0x0904, 0x2fd2, 0x684c, 0x6944, - 0xa10a, 0x1a04, 0x2fd2, 0x8001, 0x0904, 0x2fd2, 0x6804, 0xd0fc, -- 0x0560, 0x080c, 0x3e76, 0x0904, 0x2fcf, 0x2009, 0x0014, 0x7a2c, -+ 0x0560, 0x080c, 0x3e75, 0x0904, 0x2fcf, 0x2009, 0x0014, 0x7a2c, - 0x7b28, 0x7c3c, 0x7d38, 0xa290, 0x0038, 0xa399, 0x0000, 0x080c, -- 0x3eb7, 0x701b, 0x389c, 0x0005, 0xade8, 0x000d, 0x20a9, 0x0014, -+ 0x3eb6, 0x701b, 0x389c, 0x0005, 0xade8, 0x000d, 0x20a9, 0x0014, - 0x2d98, 0x2069, 0xb56e, 0x2da0, 0x53a3, 0x7010, 0xa0e8, 0x000d, - 0x2001, 0xb572, 0x200c, 0xd1e4, 0x0140, 0x00c6, 0x2061, 0x0100, - 0x6004, 0xa085, 0x0b00, 0x6006, 0x00ce, 0x2009, 0xb7b1, 0x200b, -@@ -1364,7 +1364,7 @@ unsigned short risc_code01[] = { - 0x2009, 0x017f, 0x200a, 0x3200, 0xa084, 0x003f, 0xa085, 0x3020, - 0x2090, 0x20a9, 0x001c, 0x2d98, 0x2069, 0xb552, 0x2da0, 0x53a3, - 0x6814, 0xa08c, 0x00ff, 0x6142, 0x8007, 0xa084, 0x00ff, 0x6046, -- 0x080c, 0x5da6, 0x080c, 0x536d, 0x080c, 0x53d6, 0x6000, 0xa086, -+ 0x080c, 0x5da5, 0x080c, 0x536c, 0x080c, 0x53d5, 0x6000, 0xa086, - 0x0000, 0x1904, 0x3997, 0x6808, 0x602a, 0x080c, 0x2470, 0x0006, - 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e, 0x0268, 0x2009, - 0x0170, 0x200b, 0x0080, 0xe000, 0xe000, 0x200b, 0x0000, 0x0036, -@@ -1373,3955 +1373,3956 @@ unsigned short risc_code01[] = { - 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, 0xb7c6, 0x40a1, 0x080c, 0x6a69, 0x6904, 0xd1fc, 0x0520, -+ 0x20a1, 0xb7c6, 0x40a1, 0x080c, 0x6a68, 0x6904, 0xd1fc, 0x0520, - 0x00c6, 0x2009, 0x0000, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, -- 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, 0x635d, 0x6878, -+ 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, 0x635c, 0x6878, - 0x6016, 0x6874, 0x2008, 0xa084, 0xff00, 0x8007, 0x600a, 0xa184, - 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, - 0x0001, 0x1f04, 0x3931, 0x00ce, 0x2069, 0xb552, 0x2001, 0xb79e, - 0x6a80, 0xa294, 0x0030, 0xa28e, 0x0000, 0x0170, 0xa28e, 0x0010, - 0x0118, 0xa28e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x28eb, - 0x2001, 0xb78f, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, -- 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x5ad0, 0x0128, -- 0x080c, 0x40d0, 0x0110, 0x080c, 0x2867, 0x60c8, 0xa005, 0x01d0, -- 0x6003, 0x0001, 0x2009, 0x397d, 0x00e0, 0x080c, 0x5ad0, 0x1178, -- 0x2011, 0x59a3, 0x080c, 0x699d, 0x2011, 0x5996, 0x080c, 0x6a5d, -- 0x2001, 0xb79f, 0x2003, 0x0000, 0x080c, 0x5a08, 0x0040, 0x080c, -- 0x4b20, 0x0028, 0x6003, 0x0004, 0x2009, 0x3997, 0x0010, 0x0804, -+ 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x5acf, 0x0128, -+ 0x080c, 0x40cf, 0x0110, 0x080c, 0x2867, 0x60c8, 0xa005, 0x01d0, -+ 0x6003, 0x0001, 0x2009, 0x397d, 0x00e0, 0x080c, 0x5acf, 0x1178, -+ 0x2011, 0x59a2, 0x080c, 0x699c, 0x2011, 0x5995, 0x080c, 0x6a5c, -+ 0x2001, 0xb79f, 0x2003, 0x0000, 0x080c, 0x5a07, 0x0040, 0x080c, -+ 0x4b1f, 0x0028, 0x6003, 0x0004, 0x2009, 0x3997, 0x0010, 0x0804, - 0x2faa, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x0258, 0x2001, - 0x0170, 0x2004, 0xa084, 0x00ff, 0xa086, 0x004c, 0x1118, 0x2091, - 0x309d, 0x0817, 0x2091, 0x301d, 0x0817, 0x6000, 0xa086, 0x0000, - 0x0904, 0x2fcf, 0x2069, 0xb552, 0x7830, 0x6842, 0x7834, 0x6846, - 0x6804, 0xd0fc, 0x0118, 0x2009, 0x0030, 0x0010, 0x2009, 0x001c, -- 0x2d00, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eba, 0xa006, -- 0x080c, 0x2867, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x5ad0, 0x1178, -+ 0x2d00, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eb9, 0xa006, -+ 0x080c, 0x2867, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x5acf, 0x1178, - 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, -- 0xa085, 0x0001, 0x080c, 0x5b14, 0x080c, 0x5a08, 0x0020, 0x080c, -- 0x4bf1, 0x080c, 0x4b20, 0x0804, 0x2faa, 0x81ff, 0x1904, 0x2fcf, -- 0x080c, 0x5ad0, 0x1110, 0x0804, 0x2fcf, 0x6188, 0x81ff, 0x0198, -+ 0xa085, 0x0001, 0x080c, 0x5b13, 0x080c, 0x5a07, 0x0020, 0x080c, -+ 0x4bf0, 0x080c, 0x4b1f, 0x0804, 0x2faa, 0x81ff, 0x1904, 0x2fcf, -+ 0x080c, 0x5acf, 0x1110, 0x0804, 0x2fcf, 0x6188, 0x81ff, 0x0198, - 0x703f, 0x0000, 0x2001, 0xbcc0, 0x2009, 0x0040, 0x7a2c, 0x7b28, -- 0x7c3c, 0x7d38, 0x0126, 0x2091, 0x8000, 0x080c, 0x3eba, 0x701b, -+ 0x7c3c, 0x7d38, 0x0126, 0x2091, 0x8000, 0x080c, 0x3eb9, 0x701b, - 0x2fa8, 0x012e, 0x0005, 0x703f, 0x0001, 0x00d6, 0x2069, 0xbcc0, - 0x20a9, 0x0040, 0x20a1, 0xbcc0, 0x2019, 0xffff, 0x43a4, 0x6550, - 0xa588, 0x2dc4, 0x210d, 0xa18c, 0x00ff, 0x216a, 0xa00e, 0x2011, -- 0x0002, 0x2100, 0xa506, 0x01a8, 0x080c, 0x4faa, 0x1190, 0x6014, -+ 0x0002, 0x2100, 0xa506, 0x01a8, 0x080c, 0x4fa9, 0x1190, 0x6014, - 0x821c, 0x0238, 0xa398, 0xbcc0, 0xa085, 0xff00, 0x8007, 0x201a, - 0x0038, 0xa398, 0xbcc0, 0x2324, 0xa4a4, 0xff00, 0xa405, 0x201a, - 0x8210, 0x8108, 0xa182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, - 0x2d0c, 0xa105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0xbcc0, -- 0x2099, 0xbcc0, 0x080c, 0x4b90, 0x0804, 0x39f2, 0x080c, 0x3e9b, -- 0x0904, 0x2fd2, 0x00c6, 0x080c, 0x3e76, 0x00ce, 0x1120, 0x2009, -+ 0x2099, 0xbcc0, 0x080c, 0x4b8f, 0x0804, 0x39f2, 0x080c, 0x3e9a, -+ 0x0904, 0x2fd2, 0x00c6, 0x080c, 0x3e75, 0x00ce, 0x1120, 0x2009, - 0x0002, 0x0804, 0x2fcf, 0x2001, 0xb553, 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, 0x9dd4, 0x1120, 0x2009, 0x0003, 0x0804, -- 0x2fcf, 0x7007, 0x0003, 0x701b, 0x3a7e, 0x0005, 0x080c, 0x3e9b, -+ 0xc0fd, 0x683a, 0x080c, 0x9dda, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x2fcf, 0x7007, 0x0003, 0x701b, 0x3a7e, 0x0005, 0x080c, 0x3e9a, - 0x0904, 0x2fd2, 0x20a9, 0x002b, 0x2c98, 0xade8, 0x0002, 0x2da0, - 0x53a3, 0x20a9, 0x0004, 0xac80, 0x0006, 0x2098, 0xad80, 0x0006, -- 0x20a0, 0x080c, 0x4b90, 0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, -- 0xad80, 0x000a, 0x20a0, 0x080c, 0x4b90, 0x2d00, 0x2009, 0x002b, -- 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eba, 0x81ff, 0x1904, -- 0x2fcf, 0x080c, 0x3e8b, 0x0904, 0x2fd2, 0x080c, 0x5187, 0x0804, -+ 0x20a0, 0x080c, 0x4b8f, 0x20a9, 0x0004, 0xac80, 0x000a, 0x2098, -+ 0xad80, 0x000a, 0x20a0, 0x080c, 0x4b8f, 0x2d00, 0x2009, 0x002b, -+ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eb9, 0x81ff, 0x1904, -+ 0x2fcf, 0x080c, 0x3e8a, 0x0904, 0x2fd2, 0x080c, 0x5186, 0x0804, - 0x2faa, 0x81ff, 0x1904, 0x2fcf, 0x7828, 0xa08a, 0x1000, 0x1a04, -- 0x2fd2, 0x080c, 0x3e9b, 0x0904, 0x2fd2, 0x080c, 0x51ea, 0x0904, -- 0x2fcf, 0x2019, 0x0004, 0xa00e, 0x080c, 0x5199, 0x7924, 0x810f, -+ 0x2fd2, 0x080c, 0x3e9a, 0x0904, 0x2fd2, 0x080c, 0x51e9, 0x0904, -+ 0x2fcf, 0x2019, 0x0004, 0xa00e, 0x080c, 0x5198, 0x7924, 0x810f, - 0x7a28, 0x0011, 0x0804, 0x2faa, 0xa186, 0x00ff, 0x0110, 0x0071, - 0x0060, 0x2029, 0x007e, 0x2061, 0xb500, 0x6450, 0x2400, 0xa506, -- 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x4faa, -- 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x69a9, -- 0x0005, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e8b, 0x0904, 0x2fd2, -- 0x080c, 0x5070, 0x0904, 0x2fcf, 0x080c, 0x5190, 0x0804, 0x2faa, -- 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e8b, 0x0904, 0x2fd2, 0x080c, -- 0x5070, 0x0904, 0x2fcf, 0x080c, 0x517e, 0x0804, 0x2faa, 0x6100, -- 0x0804, 0x2faa, 0x080c, 0x3e9b, 0x0904, 0x2fd2, 0x2001, 0xb500, -+ 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x4fa9, -+ 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x69a8, -+ 0x0005, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e8a, 0x0904, 0x2fd2, -+ 0x080c, 0x506f, 0x0904, 0x2fcf, 0x080c, 0x518f, 0x0804, 0x2faa, -+ 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e8a, 0x0904, 0x2fd2, 0x080c, -+ 0x506f, 0x0904, 0x2fcf, 0x080c, 0x517d, 0x0804, 0x2faa, 0x6100, -+ 0x0804, 0x2faa, 0x080c, 0x3e9a, 0x0904, 0x2fd2, 0x2001, 0xb500, - 0x2004, 0xa086, 0x0003, 0x1904, 0x2fcf, 0x00d6, 0xace8, 0x000a, - 0x7924, 0xd184, 0x0110, 0xace8, 0x0006, 0x680c, 0x8007, 0x783e, - 0x6808, 0x8007, 0x783a, 0x6b04, 0x831f, 0x6a00, 0x8217, 0x00de, -- 0x6100, 0xa18c, 0x0200, 0x0804, 0x2faa, 0x7824, 0xa09c, 0x00ff, -- 0xa39a, 0x0003, 0x1a04, 0x2fcf, 0x6250, 0xa294, 0x00ff, 0xa084, -- 0xff00, 0x8007, 0xa206, 0x1150, 0x2001, 0xb540, 0x2009, 0x000c, -- 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eba, 0x81ff, 0x1904, -- 0x2fcf, 0x080c, 0x3e9b, 0x0904, 0x2fd2, 0x6004, 0xa084, 0x00ff, -- 0xa086, 0x0006, 0x1904, 0x2fcf, 0x00c6, 0x080c, 0x3e76, 0x00ce, -- 0x0904, 0x2fcf, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, -- 0x9d80, 0x0904, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x3b68, 0x0005, -- 0x6830, 0xa086, 0x0100, 0x0904, 0x2fcf, 0xad80, 0x000e, 0x2009, -- 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eba, 0xa006, -- 0x080c, 0x2867, 0x7824, 0xa084, 0x00ff, 0xa086, 0x00ff, 0x0118, -- 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x5ad0, 0x0110, 0x080c, 0x4bf1, -- 0x7828, 0xa08a, 0x1000, 0x1a04, 0x2fd2, 0x7924, 0xa18c, 0xff00, -- 0x810f, 0xa186, 0x00ff, 0x0138, 0xa182, 0x007f, 0x1a04, 0x2fd2, -- 0x2100, 0x080c, 0x2831, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, -- 0x2061, 0xb7f3, 0x601b, 0x0000, 0x601f, 0x0000, 0x080c, 0x5ad0, -- 0x1178, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, -- 0x0001, 0xa085, 0x0001, 0x080c, 0x5b14, 0x080c, 0x5a08, 0x0420, -- 0x2011, 0x0003, 0x080c, 0x8076, 0x2011, 0x0002, 0x080c, 0x8080, -- 0x080c, 0x7f5a, 0x0036, 0x2019, 0x0000, 0x080c, 0x7fe5, 0x003e, -- 0x2061, 0x0100, 0x2001, 0xb515, 0x2004, 0xa084, 0x00ff, 0x810f, -- 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, -- 0x2011, 0x4b55, 0x080c, 0x6a23, 0x7924, 0xa18c, 0xff00, 0x810f, -- 0x080c, 0x5ad0, 0x1110, 0x2009, 0x00ff, 0x7a28, 0x080c, 0x3acc, -- 0x012e, 0x00ce, 0x002e, 0x0804, 0x2faa, 0x7924, 0xa18c, 0xff00, -- 0x810f, 0x00c6, 0x080c, 0x4f4e, 0x2c08, 0x00ce, 0x1904, 0x2fd2, -- 0x0804, 0x2faa, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x2fcf, -- 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, -- 0x2fcf, 0x080c, 0x3e76, 0x1120, 0x2009, 0x0002, 0x0804, 0x2fcf, -- 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3eb7, 0x701b, -- 0x3c1a, 0x0005, 0x2009, 0x0080, 0x080c, 0x4faa, 0x1130, 0x6004, -- 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, 0x2021, 0x400a, 0x0804, -- 0x2fac, 0x00d6, 0xade8, 0x000d, 0x6900, 0x6a08, 0x6b0c, 0x6c10, -- 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0904, 0x3c91, 0xa0be, -- 0x0112, 0x0904, 0x3c91, 0xa0be, 0x0113, 0x0904, 0x3c91, 0xa0be, -- 0x0114, 0x0904, 0x3c91, 0xa0be, 0x0117, 0x0904, 0x3c91, 0xa0be, -- 0x011a, 0x0904, 0x3c91, 0xa0be, 0x011c, 0x0904, 0x3c91, 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, 0x2fd2, 0xad80, 0x0010, 0x20a9, 0x0007, 0x080c, -- 0x3cd7, 0xad80, 0x000e, 0x20a9, 0x0001, 0x080c, 0x3cd7, 0x0048, -- 0xad80, 0x000c, 0x080c, 0x3ce5, 0x0050, 0xad80, 0x000e, 0x080c, -- 0x3ce5, 0xad80, 0x000c, 0x20a9, 0x0001, 0x080c, 0x3cd7, 0x00c6, -- 0x080c, 0x3e76, 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, 0x9d9c, 0x1120, 0x2009, -- 0x0003, 0x0804, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x3cce, 0x0005, -- 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804, 0x2fcf, 0x6820, 0xa086, -- 0x8001, 0x1904, 0x2faa, 0x2009, 0x0004, 0x0804, 0x2fcf, 0x0016, -- 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, 0x8108, 0x280a, -- 0x8108, 0x1f04, 0x3cd9, 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, -- 0x2fcf, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, -- 0x0804, 0x2fcf, 0x7924, 0x2140, 0xa18c, 0xff00, 0x810f, 0x60d4, -- 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x2fd2, 0xa182, 0x00ff, -- 0x1a04, 0x2fd2, 0x7a2c, 0x7b28, 0x6070, 0xa306, 0x1140, 0x6074, -- 0xa24e, 0x0904, 0x2fd2, 0xa9cc, 0xff00, 0x0904, 0x2fd2, 0x00c6, -- 0x080c, 0x3dc4, 0x2c68, 0x00ce, 0x0538, 0xa0c6, 0x4000, 0x1180, -- 0x00c6, 0x0006, 0x2d60, 0x2009, 0x0000, 0x080c, 0x524b, 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, 0x2fac, 0x2d00, 0x7022, 0x0016, 0x00b6, -- 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x85c1, 0x05d8, 0x2d00, 0x601a, -- 0x080c, 0xa021, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x3e76, -- 0x00ce, 0x2b70, 0x1150, 0x080c, 0x8617, 0x00ee, 0x00ce, 0x00be, -- 0x001e, 0x2009, 0x0002, 0x0804, 0x2fcf, 0x6837, 0x0000, 0x683b, -- 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, 0xd88c, -- 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2c9c, -- 0x012e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4eec, 0x2001, -- 0x0002, 0x080c, 0x4efe, 0x2009, 0x0002, 0x080c, 0x8646, 0xa085, -- 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, 0x2009, 0x0003, -- 0x0804, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x3da7, 0x0005, 0x6830, -- 0xa086, 0x0100, 0x7020, 0x2060, 0x1138, 0x2009, 0x0004, 0x6204, -- 0xa294, 0x00ff, 0x0804, 0x2fcf, 0x2009, 0x0000, 0x6838, 0xd0f4, -- 0x1904, 0x2faa, 0x080c, 0x524b, 0x1108, 0xc185, 0x6000, 0xd0bc, -- 0x0108, 0xc18d, 0x0804, 0x2faa, 0x00e6, 0x00d6, 0x2029, 0x0000, -- 0x2001, 0xb535, 0x2004, 0xd0ac, 0x0138, 0x2021, 0x0000, 0x20a9, -- 0x00ff, 0x2071, 0xb635, 0x0030, 0x2021, 0x0080, 0x20a9, 0x007f, -- 0x2071, 0xb6b5, 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, 0xb535, -- 0x2004, 0xd0ac, 0x19a8, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, -- 0x1f04, 0x3dda, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, -- 0x0001, 0x0030, 0x080c, 0x4f4e, 0x1dd0, 0x6312, 0x6216, 0xa006, -- 0xa005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x2fcf, 0x080c, -- 0x3e76, 0x0904, 0x2fcf, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, -- 0x7824, 0xa005, 0x0904, 0x2fd2, 0xa096, 0x00ff, 0x0120, 0xa092, -- 0x0004, 0x1a04, 0x2fd2, 0x2010, 0x2d18, 0x080c, 0x2c4f, 0x0904, -- 0x2fcf, 0x7007, 0x0003, 0x701b, 0x3e46, 0x0005, 0x6830, 0xa086, -- 0x0100, 0x0904, 0x2fcf, 0x0804, 0x2faa, 0x7924, 0xa18c, 0xff00, -+ 0x6100, 0xa18c, 0x0200, 0x0804, 0x2faa, 0x7824, 0xa09c, 0x0003, -+ 0xd0b4, 0x1160, 0xa39a, 0x0003, 0x1a04, 0x2fcf, 0x6250, 0xa294, -+ 0x00ff, 0xa084, 0xff00, 0x8007, 0xa206, 0x1150, 0x2001, 0xb540, -+ 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eb9, -+ 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e9a, 0x0904, 0x2fd2, 0x6004, -+ 0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x2fcf, 0x00c6, 0x080c, -+ 0x3e75, 0x00ce, 0x0904, 0x2fcf, 0x6837, 0x0000, 0x6838, 0xc0fd, -+ 0x683a, 0x080c, 0x9d86, 0x0904, 0x2fcf, 0x7007, 0x0003, 0x701b, -+ 0x3b6a, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x2fcf, 0xad80, -+ 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, -+ 0x3eb9, 0xa006, 0x080c, 0x2867, 0x7824, 0xa084, 0x00ff, 0xa086, -+ 0x00ff, 0x0118, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x5acf, 0x0110, -+ 0x080c, 0x4bf0, 0x7828, 0xa08a, 0x1000, 0x1a04, 0x2fd2, 0x7924, -+ 0xa18c, 0xff00, 0x810f, 0xa186, 0x00ff, 0x0138, 0xa182, 0x007f, -+ 0x1a04, 0x2fd2, 0x2100, 0x080c, 0x2831, 0x0026, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x2061, 0xb7f3, 0x601b, 0x0000, 0x601f, 0x0000, -+ 0x080c, 0x5acf, 0x1178, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, -+ 0xb500, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5b13, 0x080c, -+ 0x5a07, 0x0420, 0x2011, 0x0003, 0x080c, 0x8075, 0x2011, 0x0002, -+ 0x080c, 0x807f, 0x080c, 0x7f59, 0x0036, 0x2019, 0x0000, 0x080c, -+ 0x7fe4, 0x003e, 0x2061, 0x0100, 0x2001, 0xb515, 0x2004, 0xa084, -+ 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, -+ 0x2009, 0x002d, 0x2011, 0x4b54, 0x080c, 0x6a22, 0x7924, 0xa18c, -+ 0xff00, 0x810f, 0x080c, 0x5acf, 0x1110, 0x2009, 0x00ff, 0x7a28, -+ 0x080c, 0x3acc, 0x012e, 0x00ce, 0x002e, 0x0804, 0x2faa, 0x7924, -+ 0xa18c, 0xff00, 0x810f, 0x00c6, 0x080c, 0x4f4d, 0x2c08, 0x00ce, -+ 0x1904, 0x2fd2, 0x0804, 0x2faa, 0x81ff, 0x0120, 0x2009, 0x0001, -+ 0x0804, 0x2fcf, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, -+ 0x0005, 0x0804, 0x2fcf, 0x080c, 0x3e75, 0x1120, 0x2009, 0x0002, -+ 0x0804, 0x2fcf, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, -+ 0x3eb6, 0x701b, 0x3c1c, 0x0005, 0x2009, 0x0080, 0x080c, 0x4fa9, -+ 0x1130, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, 0x2021, -+ 0x400a, 0x0804, 0x2fac, 0x00d6, 0xade8, 0x000d, 0x6900, 0x6a08, -+ 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, 0x0100, 0x0904, -+ 0x3c93, 0xa0be, 0x0112, 0x0904, 0x3c93, 0xa0be, 0x0113, 0x0904, -+ 0x3c93, 0xa0be, 0x0114, 0x0904, 0x3c93, 0xa0be, 0x0117, 0x0904, -+ 0x3c93, 0xa0be, 0x011a, 0x0904, 0x3c93, 0xa0be, 0x011c, 0x0904, -+ 0x3c93, 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, 0x2fd2, 0xad80, 0x0010, 0x20a9, -+ 0x0007, 0x080c, 0x3cd9, 0xad80, 0x000e, 0x20a9, 0x0001, 0x080c, -+ 0x3cd9, 0x0048, 0xad80, 0x000c, 0x080c, 0x3ce7, 0x0050, 0xad80, -+ 0x000e, 0x080c, 0x3ce7, 0xad80, 0x000c, 0x20a9, 0x0001, 0x080c, -+ 0x3cd9, 0x00c6, 0x080c, 0x3e75, 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, 0x9da2, -+ 0x1120, 0x2009, 0x0003, 0x0804, 0x2fcf, 0x7007, 0x0003, 0x701b, -+ 0x3cd0, 0x0005, 0x00ce, 0x00de, 0x2009, 0x0002, 0x0804, 0x2fcf, -+ 0x6820, 0xa086, 0x8001, 0x1904, 0x2faa, 0x2009, 0x0004, 0x0804, -+ 0x2fcf, 0x0016, 0x2008, 0x2044, 0x8000, 0x204c, 0x8000, 0x290a, -+ 0x8108, 0x280a, 0x8108, 0x1f04, 0x3cdb, 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, 0x2fcf, 0x60d4, 0xd0ac, 0x1130, 0xd09c, 0x1120, -+ 0x2009, 0x0005, 0x0804, 0x2fcf, 0x7924, 0x2140, 0xa18c, 0xff00, - 0x810f, 0x60d4, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x2fd2, -- 0xa182, 0x00ff, 0x1a04, 0x2fd2, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x9c84, 0x1188, 0xa190, 0xb635, 0x2204, 0xa065, 0x0160, 0x080c, -- 0x4c0c, 0x2001, 0xb535, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, -- 0x012e, 0x0804, 0x2faa, 0x012e, 0x0804, 0x2fcf, 0x080c, 0x15f8, -- 0x0188, 0xa006, 0x6802, 0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, -- 0x7016, 0x0030, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, -- 0xad80, 0x000d, 0x0005, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, -- 0x4faa, 0x1130, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0208, -- 0xa066, 0x8cff, 0x0005, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c, -- 0x4faa, 0x1128, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0208, 0xa066, -- 0x8cff, 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, -- 0x080c, 0x160f, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, 0x2031, -- 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0xb5d2, 0x6606, 0x6112, -- 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x1643, -- 0x7007, 0x0002, 0x701b, 0x2faa, 0x0005, 0x00f6, 0x0126, 0x2091, -- 0x8000, 0x2079, 0x0000, 0x2001, 0xb590, 0x2004, 0xa005, 0x1168, -- 0x0e04, 0x3ee5, 0x7818, 0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a, -- 0x781b, 0x0001, 0x2091, 0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6, -- 0x2071, 0xb582, 0x7138, 0xa182, 0x0010, 0x0218, 0x7030, 0x2060, -- 0x0078, 0x7030, 0xa0e0, 0x0004, 0xac82, 0xb5d2, 0x0210, 0x2061, -- 0xb592, 0x2c00, 0x7032, 0x81ff, 0x1108, 0x7036, 0x8108, 0x713a, -- 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, -- 0x0005, 0x00e6, 0x2071, 0xb582, 0x7038, 0xa005, 0x0570, 0x0126, -- 0x2091, 0x8000, 0x0e04, 0x3f3c, 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, 0xb592, 0x7037, 0xb592, -- 0x00ce, 0x0048, 0xac80, 0x0004, 0xa0fa, 0xb5d2, 0x0210, 0x2001, -- 0xb592, 0x7036, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, -- 0x2001, 0xb553, 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, -- 0x3ecd, 0x002e, 0x0005, 0x81ff, 0x1904, 0x2fcf, 0x0126, 0x2091, -- 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x5ad0, -- 0x1178, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, -- 0x0001, 0xa085, 0x0001, 0x080c, 0x5b14, 0x080c, 0x5a08, 0x0010, -- 0x080c, 0x4b20, 0x012e, 0x0804, 0x2faa, 0x7824, 0x2008, 0xa18c, -- 0xfffd, 0x1128, 0x61e0, 0xa10d, 0x61e2, 0x0804, 0x2faa, 0x0804, -- 0x2fd2, 0x81ff, 0x1904, 0x2fcf, 0x6000, 0xa086, 0x0003, 0x1904, -- 0x2fcf, 0x2001, 0xb553, 0x2004, 0xd0ac, 0x1904, 0x2fcf, 0x080c, -- 0x3e9b, 0x0904, 0x2fd2, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, -- 0x1120, 0x7828, 0xa005, 0x0904, 0x2faa, 0x00c6, 0x080c, 0x3e76, -- 0x00ce, 0x0904, 0x2fcf, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, -- 0xc0fd, 0x683a, 0x080c, 0x9e65, 0x0904, 0x2fcf, 0x7007, 0x0003, -- 0x701b, 0x3fab, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x2fcf, -- 0x0804, 0x2faa, 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, 0x1904, -- 0x2fcf, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e76, -- 0x0904, 0x2fcf, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, -- 0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x080c, 0x4faa, -- 0x1904, 0x4025, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0130, -- 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x1904, 0x4025, 0x2001, 0xb553, -- 0x2004, 0xd0ac, 0x1128, 0x080c, 0x524b, 0x1110, 0xd79c, 0x05e8, -- 0xd794, 0x1110, 0xd784, 0x0158, 0xac80, 0x0006, 0x2098, 0x3400, -- 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3ce5, 0xd794, 0x0148, 0xac80, -- 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3ce5, -- 0x21a2, 0xd794, 0x01d8, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, -- 0x0002, 0x53a3, 0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, -- 0x2098, 0x3400, 0x20a9, 0x0002, 0x53a3, 0x080c, 0x3cd7, 0xac80, -- 0x0026, 0x2098, 0x20a9, 0x0002, 0x53a3, 0x0008, 0x94a0, 0xd794, -- 0x0110, 0xa6b0, 0x000b, 0xa6b0, 0x0005, 0x8108, 0x2001, 0xb535, -- 0x2004, 0xd0ac, 0x0118, 0xa186, 0x0100, 0x0040, 0xd78c, 0x0120, -- 0xa186, 0x0100, 0x0170, 0x0018, 0xa186, 0x007e, 0x0150, 0xd794, -- 0x0118, 0xa686, 0x0020, 0x0010, 0xa686, 0x0028, 0x0150, 0x0804, -- 0x3fce, 0x86ff, 0x1120, 0x7120, 0x810b, 0x0804, 0x2faa, 0x702f, -- 0x0001, 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xb5d2, -- 0x6007, 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e, -- 0x6532, 0x2c10, 0x080c, 0x1643, 0x7007, 0x0002, 0x701b, 0x4061, -- 0x0005, 0x702c, 0xa005, 0x1170, 0x711c, 0x7024, 0x20a0, 0x7728, -- 0x2031, 0x0000, 0x2061, 0xb5d2, 0x6224, 0x6328, 0x642c, 0x6530, -- 0x0804, 0x3fce, 0x7120, 0x810b, 0x0804, 0x2faa, 0x2029, 0x007e, -- 0x7924, 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007, 0xa0e2, -- 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa184, 0x00ff, -- 0xa0e2, 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa284, -- 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, -- 0x2fd2, 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x2fd2, 0xa502, -- 0x0a04, 0x2fd2, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, -- 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa384, 0x00ff, 0xa0e2, 0x0020, -- 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa484, 0xff00, 0x8007, -- 0xa0e2, 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa484, -- 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, -- 0x2061, 0xb7b9, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x2faa, -- 0x0006, 0x2001, 0xb553, 0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, -- 0x2001, 0xb572, 0x2004, 0xd0bc, 0x000e, 0x0005, 0x6168, 0x7a24, -- 0x6300, 0x82ff, 0x1118, 0x7926, 0x0804, 0x2faa, 0x83ff, 0x1904, -- 0x2fd2, 0x2001, 0xfff0, 0xa200, 0x1a04, 0x2fd2, 0x2019, 0xffff, -- 0x606c, 0xa302, 0xa200, 0x0a04, 0x2fd2, 0x7926, 0x626a, 0x0804, -- 0x2faa, 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, 0x1904, 0x2fcf, -- 0x7c28, 0x7d24, 0x7e38, 0x7f2c, 0x080c, 0x3e76, 0x0904, 0x2fcf, -- 0x2009, 0x0000, 0x2019, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, -- 0xad80, 0x0003, 0x7026, 0x20a0, 0xa1e0, 0xb635, 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, 0x2faa, 0x702f, 0x0001, -- 0x711e, 0x7020, 0xa300, 0x7022, 0x2061, 0xb5d2, 0x6007, 0x0000, -- 0x6312, 0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732, 0x2c10, -- 0x080c, 0x1643, 0x7007, 0x0002, 0x701b, 0x4157, 0x0005, 0x702c, -- 0xa005, 0x1168, 0x711c, 0x7024, 0x20a0, 0x2019, 0x0000, 0x2061, -- 0xb5d2, 0x6424, 0x6528, 0x662c, 0x6730, 0x0804, 0x4114, 0x7120, -- 0x810c, 0x0804, 0x2faa, 0x81ff, 0x1904, 0x2fcf, 0x60d4, 0xd0ac, -- 0x1118, 0xd09c, 0x0904, 0x2fcf, 0x080c, 0x3e76, 0x0904, 0x2fcf, -- 0x7924, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3eb7, 0x701b, -- 0x4182, 0x0005, 0x00d6, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, -- 0x0148, 0xa0be, 0x7100, 0x0130, 0xa0be, 0x7200, 0x0118, 0x00de, -- 0x0804, 0x2fd2, 0x6820, 0x6924, 0x080c, 0x281d, 0x1510, 0x080c, -- 0x4f4e, 0x11f8, 0x7122, 0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c, -- 0x3e76, 0x01b8, 0x080c, 0x3e76, 0x01a0, 0x00ce, 0x00de, 0x6837, -- 0x0000, 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, -- 0x080c, 0x9db8, 0x0904, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x41bc, -- 0x0005, 0x00de, 0x0804, 0x2fcf, 0x7120, 0x080c, 0x2d97, 0x6820, -- 0xa086, 0x8001, 0x0904, 0x2fcf, 0x2d00, 0x701e, 0x6804, 0xa080, -- 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x4b90, -- 0x000e, 0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, -- 0xb5d2, 0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x1108, -- 0x0018, 0xa7c6, 0x7100, 0x1140, 0xa6c2, 0x0004, 0x0a04, 0x2fd2, -- 0x2009, 0x0004, 0x0804, 0x3eba, 0xa7c6, 0x7200, 0x1904, 0x2fd2, -- 0xa6c2, 0x0054, 0x0a04, 0x2fd2, 0x600e, 0x6013, 0x002a, 0x6226, -- 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x1643, 0x7007, 0x0002, -- 0x701b, 0x4203, 0x0005, 0x701c, 0x2068, 0x6804, 0xa080, 0x0001, -- 0x2004, 0xa080, 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, -- 0x080c, 0x4b90, 0x000e, 0x2009, 0x002a, 0x2061, 0xb5d2, 0x6224, -- 0x6328, 0x642c, 0x6530, 0x0804, 0x3eba, 0x81ff, 0x1904, 0x2fcf, -- 0x792c, 0x2001, 0xb7a0, 0x2102, 0x080c, 0x3e8b, 0x0904, 0x2fd2, -- 0x080c, 0x5070, 0x0904, 0x2fcf, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x51a2, 0x012e, 0x0804, 0x2faa, 0x7824, 0xd08c, 0x1118, 0xd084, -- 0x0904, 0x3a46, 0x080c, 0x3e9b, 0x0904, 0x2fd2, 0x00c6, 0x080c, -- 0x3e76, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x2fcf, 0x6004, -- 0xa084, 0x00ff, 0xa086, 0x0006, 0x0128, 0xa08e, 0x0004, 0x0110, -- 0xa08e, 0x0005, 0x15b8, 0x7824, 0xd08c, 0x0120, 0x6000, 0xc08c, -- 0x6002, 0x0030, 0x2001, 0xb553, 0x2004, 0xd0b4, 0x0904, 0x3a82, -- 0x7824, 0xa084, 0xff00, 0xa08e, 0x7e00, 0x0904, 0x3a82, 0xa08e, -- 0x7f00, 0x0904, 0x3a82, 0xa08e, 0x8000, 0x0904, 0x3a82, 0x6000, -- 0xd08c, 0x1904, 0x3a82, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, -- 0x080c, 0x9dd4, 0x1120, 0x2009, 0x0003, 0x0804, 0x2fcf, 0x7007, -- 0x0003, 0x701b, 0x4284, 0x0005, 0x080c, 0x3e9b, 0x0904, 0x2fd2, -- 0x0804, 0x3a82, 0x2009, 0xb531, 0x210c, 0x81ff, 0x0120, 0x2009, -- 0x0001, 0x0804, 0x2fcf, 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, -- 0x0120, 0x2009, 0x0007, 0x0804, 0x2fcf, 0x2001, 0xb553, 0x2004, -- 0xd0ac, 0x0120, 0x2009, 0x0008, 0x0804, 0x2fcf, 0x609c, 0xd0a4, -- 0x1118, 0xd0ac, 0x1904, 0x3a82, 0x6837, 0x0000, 0x6833, 0x0000, -- 0x6838, 0xc0fd, 0x683a, 0x080c, 0x9e65, 0x1120, 0x2009, 0x0003, -- 0x0804, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x42bf, 0x0005, 0x6830, -- 0xa086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x2fcf, 0x080c, -- 0x3e9b, 0x0904, 0x2fd2, 0x0804, 0x4253, 0x81ff, 0x2009, 0x0001, -- 0x1904, 0x2fcf, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904, -- 0x2fcf, 0x2001, 0xb553, 0x2004, 0xd0ac, 0x2009, 0x0008, 0x1904, -- 0x2fcf, 0x080c, 0x3e9b, 0x0904, 0x2fd2, 0x6004, 0xa084, 0x00ff, -- 0xa086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2fcf, 0x00c6, 0x080c, -- 0x3e76, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2fcf, 0x6837, 0x0000, -- 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194, 0xff00, -- 0xa18c, 0x00ff, 0xa006, 0x82ff, 0x1128, 0xc0ed, 0x6952, 0x792c, -- 0x6956, 0x0048, 0xa28e, 0x0100, 0x1904, 0x2fd2, 0xc0e5, 0x6853, -- 0x0000, 0x6857, 0x0000, 0x683e, 0x080c, 0xa022, 0x2009, 0x0003, -- 0x0904, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x431f, 0x0005, 0x6830, -- 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, 0x2fcf, 0x0804, 0x2faa, -- 0x81ff, 0x2009, 0x0001, 0x1904, 0x2fcf, 0x6000, 0xa086, 0x0003, -- 0x2009, 0x0007, 0x1904, 0x2fcf, 0x080c, 0x3e9b, 0x0904, 0x2fd2, -- 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x1904, -- 0x2fcf, 0x00c6, 0x080c, 0x3e76, 0x00ce, 0x2009, 0x0002, 0x0904, -- 0x2fcf, 0xad80, 0x000f, 0x2009, 0x0008, 0x7a2c, 0x7b28, 0x7c3c, -- 0x7d38, 0x080c, 0x3eb7, 0x701b, 0x4356, 0x0005, 0x00d6, 0xade8, -- 0x000f, 0x6800, 0xa086, 0x0500, 0x1140, 0x6804, 0xa005, 0x1128, -- 0x6808, 0xa084, 0xff00, 0x1108, 0x0018, 0x00de, 0x1904, 0x2fd2, -- 0x00de, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, -- 0x00c6, 0x080c, 0x3e9b, 0x1118, 0x00ce, 0x0804, 0x2fd2, 0x080c, -- 0xa071, 0x2009, 0x0003, 0x00ce, 0x0904, 0x2fcf, 0x7007, 0x0003, -- 0x701b, 0x4383, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, -- 0x0904, 0x2fcf, 0x0804, 0x2faa, 0x81ff, 0x0120, 0x2009, 0x0001, -- 0x0804, 0x2fcf, 0x6000, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007, -- 0x0804, 0x2fcf, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0xa6b4, 0x00ff, -- 0x080c, 0x4faa, 0x1904, 0x2fd2, 0xa186, 0x007f, 0x0150, 0x6004, -- 0xa084, 0x00ff, 0xa086, 0x0006, 0x0120, 0x2009, 0x0009, 0x0804, -- 0x2fcf, 0x00c6, 0x080c, 0x3e76, 0x00ce, 0x1120, 0x2009, 0x0002, -- 0x0804, 0x2fcf, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x2001, -- 0x0100, 0x8007, 0x680a, 0x080c, 0x9def, 0x1120, 0x2009, 0x0003, -- 0x0804, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x43cf, 0x0005, 0x6808, -- 0x8007, 0xa086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x2fcf, -- 0x68b0, 0x6836, 0x6810, 0x8007, 0xa084, 0x00ff, 0x800c, 0x6814, -- 0x8007, 0xa084, 0x00ff, 0x8004, 0xa080, 0x0002, 0xa108, 0xad80, -- 0x0004, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eba, 0x080c, -- 0x3e76, 0x1120, 0x2009, 0x0002, 0x0804, 0x2fcf, 0x7924, 0xa194, -- 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804, 0x2fd2, -- 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3eb7, -- 0x701b, 0x440b, 0x0005, 0x2001, 0xb52a, 0x2003, 0x0001, 0xad80, -- 0x000d, 0x2098, 0x20a9, 0x001a, 0x20a1, 0xb7c6, 0x53a3, 0x0804, -- 0x2faa, 0x080c, 0x3e76, 0x1120, 0x2009, 0x0002, 0x0804, 0x2fcf, -- 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff, 0x0110, -- 0x0804, 0x2fd2, 0x2099, 0xb7c6, 0x20a0, 0x20a9, 0x001a, 0x53a3, -- 0x2009, 0x001a, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eba, -- 0x7824, 0xa08a, 0x1000, 0x1a04, 0x2fd2, 0x0126, 0x2091, 0x8000, -- 0x8003, 0x800b, 0x810b, 0xa108, 0x00c6, 0x2061, 0xb7f3, 0x6142, -- 0x00ce, 0x012e, 0x0804, 0x2faa, 0x00c6, 0x080c, 0x5ad0, 0x1188, -+ 0xa182, 0x00ff, 0x1a04, 0x2fd2, 0x7a2c, 0x7b28, 0x6070, 0xa306, -+ 0x1140, 0x6074, 0xa24e, 0x0904, 0x2fd2, 0xa9cc, 0xff00, 0x0904, -+ 0x2fd2, 0x00c6, 0x080c, 0x3dc5, 0x2c68, 0x00ce, 0x0530, 0xa0c6, -+ 0x4000, 0x1178, 0x00c6, 0x0006, 0x2d60, 0xa00e, 0x080c, 0x524a, -+ 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, 0x2fac, 0x2d00, 0x7022, 0x0016, -+ 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x85c7, 0x05d8, 0x2d00, -+ 0x601a, 0x080c, 0xa027, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, -+ 0x3e75, 0x00ce, 0x2b70, 0x1150, 0x080c, 0x861d, 0x00ee, 0x00ce, -+ 0x00be, 0x001e, 0x2009, 0x0002, 0x0804, 0x2fcf, 0x6837, 0x0000, -+ 0x683b, 0x0000, 0x2d00, 0x6012, 0x6833, 0x0000, 0x6838, 0xc0fd, -+ 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x2c9c, 0x012e, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x4eeb, -+ 0x2001, 0x0002, 0x080c, 0x4efd, 0x2009, 0x0002, 0x080c, 0x864c, -+ 0xa085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x1120, 0x2009, -+ 0x0003, 0x0804, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x3da8, 0x0005, -+ 0x6830, 0xa086, 0x0100, 0x7020, 0x2060, 0x1138, 0x2009, 0x0004, -+ 0x6204, 0xa294, 0x00ff, 0x0804, 0x2fcf, 0x2009, 0x0000, 0x6838, -+ 0xd0f4, 0x1904, 0x2faa, 0x080c, 0x524a, 0x1108, 0xc185, 0x6000, -+ 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x2faa, 0x00e6, 0x00d6, 0xa02e, -+ 0x2001, 0xb535, 0x2004, 0xd0ac, 0x0130, 0xa026, 0x20a9, 0x00ff, -+ 0x2071, 0xb635, 0x0030, 0x2021, 0x0080, 0x20a9, 0x007f, 0x2071, -+ 0xb6b5, 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, 0xb535, 0x2004, -+ 0xd0ac, 0x19a8, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, -+ 0x3dd9, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, -+ 0x0030, 0x080c, 0x4f4d, 0x1dd0, 0x6312, 0x6216, 0xa006, 0xa005, -+ 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x2fcf, 0x080c, 0x3e75, -+ 0x0904, 0x2fcf, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7824, -+ 0xa005, 0x0904, 0x2fd2, 0xa096, 0x00ff, 0x0120, 0xa092, 0x0004, -+ 0x1a04, 0x2fd2, 0x2010, 0x2d18, 0x080c, 0x2c4f, 0x0904, 0x2fcf, -+ 0x7007, 0x0003, 0x701b, 0x3e45, 0x0005, 0x6830, 0xa086, 0x0100, -+ 0x0904, 0x2fcf, 0x0804, 0x2faa, 0x7924, 0xa18c, 0xff00, 0x810f, -+ 0x60d4, 0xd0ac, 0x1120, 0xa182, 0x0080, 0x0a04, 0x2fd2, 0xa182, -+ 0x00ff, 0x1a04, 0x2fd2, 0x0126, 0x2091, 0x8000, 0x080c, 0x9c8a, -+ 0x1188, 0xa190, 0xb635, 0x2204, 0xa065, 0x0160, 0x080c, 0x4c0b, -+ 0x2001, 0xb535, 0x2004, 0xd0ac, 0x0110, 0x6017, 0x0000, 0x012e, -+ 0x0804, 0x2faa, 0x012e, 0x0804, 0x2fcf, 0x080c, 0x15f8, 0x0188, -+ 0xa006, 0x6802, 0x7010, 0xa005, 0x1120, 0x2d00, 0x7012, 0x7016, -+ 0x0030, 0x7014, 0x6802, 0x2060, 0x2d00, 0x6006, 0x7016, 0xad80, -+ 0x000d, 0x0005, 0x7924, 0x810f, 0xa18c, 0x00ff, 0x080c, 0x4fa9, -+ 0x1130, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, 0x0208, 0xa066, -+ 0x8cff, 0x0005, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0x080c, 0x4fa9, -+ 0x1128, 0xa6b4, 0x00ff, 0xa682, 0x4000, 0x0208, 0xa066, 0x8cff, -+ 0x0005, 0x0016, 0x7110, 0x81ff, 0x0128, 0x2168, 0x6904, 0x080c, -+ 0x160f, 0x0cc8, 0x7112, 0x7116, 0x001e, 0x0005, 0x2031, 0x0001, -+ 0x0010, 0x2031, 0x0000, 0x2061, 0xb5d2, 0x6606, 0x6112, 0x600e, -+ 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, 0x080c, 0x1643, 0x7007, -+ 0x0002, 0x701b, 0x2faa, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, -+ 0x2079, 0x0000, 0x2001, 0xb590, 0x2004, 0xa005, 0x1168, 0x0e04, -+ 0x3ee4, 0x7818, 0xd084, 0x1140, 0x7a22, 0x7b26, 0x7c2a, 0x781b, -+ 0x0001, 0x2091, 0x4080, 0x0408, 0x0016, 0x00c6, 0x00e6, 0x2071, -+ 0xb582, 0x7138, 0xa182, 0x0010, 0x0218, 0x7030, 0x2060, 0x0078, -+ 0x7030, 0xa0e0, 0x0004, 0xac82, 0xb5d2, 0x0210, 0x2061, 0xb592, -+ 0x2c00, 0x7032, 0x81ff, 0x1108, 0x7036, 0x8108, 0x713a, 0x2262, -+ 0x6306, 0x640a, 0x00ee, 0x00ce, 0x001e, 0x012e, 0x00fe, 0x0005, -+ 0x00e6, 0x2071, 0xb582, 0x7038, 0xa005, 0x0570, 0x0126, 0x2091, -+ 0x8000, 0x0e04, 0x3f3b, 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, 0xb592, 0x7037, 0xb592, 0x00ce, -+ 0x0048, 0xac80, 0x0004, 0xa0fa, 0xb5d2, 0x0210, 0x2001, 0xb592, -+ 0x7036, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x0026, 0x2001, -+ 0xb553, 0x2004, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x3ecc, -+ 0x002e, 0x0005, 0x81ff, 0x1904, 0x2fcf, 0x0126, 0x2091, 0x8000, -+ 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x5acf, 0x1178, - 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, -- 0xa085, 0x0001, 0x080c, 0x5b14, 0x080c, 0x5a08, 0x080c, 0x1515, -- 0x0038, 0x2061, 0xb500, 0x6030, 0xc09d, 0x6032, 0x080c, 0x4b20, -- 0x00ce, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0xb7f3, -- 0x7924, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7838, -- 0x606a, 0x783c, 0x6066, 0x7828, 0x6062, 0x782c, 0x605e, 0x2061, -- 0xb7a1, 0x2001, 0xb808, 0x600e, 0x6013, 0x0001, 0x6017, 0x0002, -- 0x6007, 0x0000, 0x6037, 0x0000, 0x00ce, 0x012e, 0x0804, 0x2faa, -- 0x0126, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb500, 0x6044, -- 0xd0a4, 0x11b0, 0xd084, 0x0118, 0x080c, 0x4607, 0x0068, 0xd08c, -- 0x0118, 0x080c, 0x4528, 0x0040, 0xd094, 0x0118, 0x080c, 0x44f9, -- 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, -- 0x4bb0, 0x00f0, 0x6040, 0xa084, 0x0010, 0xa085, 0x0140, 0x6042, -- 0x6043, 0x0000, 0x707b, 0x0000, 0x7097, 0x0001, 0x70bb, 0x0000, -- 0x70d7, 0x0000, 0x2009, 0xbcc0, 0x200b, 0x0000, 0x708b, 0x0000, -- 0x707f, 0x000a, 0x2009, 0x000a, 0x2011, 0x4ad6, 0x080c, 0x6a23, -- 0x0005, 0x0156, 0x2001, 0xb574, 0x2004, 0xd08c, 0x0110, 0x7053, -- 0xffff, 0x707c, 0xa005, 0x1510, 0x2011, 0x4ad6, 0x080c, 0x699d, -- 0x6040, 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9, 0x00c8, -- 0x6044, 0xd08c, 0x1168, 0x1f04, 0x4510, 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, 0x1515, -- 0x0005, 0x4534, 0x4584, 0x4606, 0x00f6, 0x7083, 0x0001, 0x20e1, -- 0xa000, 0xe000, 0x20e1, 0x8700, 0x080c, 0x2470, 0x20e1, 0x9080, -- 0x20e1, 0x4000, 0x2079, 0xbb00, 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, 0xbb0c, 0x207b, 0x1101, -- 0x7807, 0x0000, 0x2099, 0xb505, 0x20a1, 0xbb0e, 0x20a9, 0x0004, -- 0x53a3, 0x2079, 0xbb12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, -- 0xbb00, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, -- 0x600f, 0x0000, 0x080c, 0x4b07, 0x00fe, 0x7087, 0x0000, 0x6043, -- 0x0008, 0x6043, 0x0000, 0x0005, 0x00d6, 0x7084, 0x7087, 0x0000, -- 0xa025, 0x0904, 0x45ee, 0x6020, 0xd0b4, 0x1904, 0x45ec, 0x7194, -- 0x81ff, 0x0904, 0x45dc, 0xa486, 0x000c, 0x1904, 0x45e7, 0xa480, -- 0x0018, 0x8004, 0x20a8, 0x2011, 0xbb80, 0x2019, 0xbb00, 0x220c, -- 0x2304, 0xa106, 0x11b8, 0x8210, 0x8318, 0x1f04, 0x459f, 0x6043, -- 0x0004, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x7083, -- 0x0002, 0x708f, 0x0002, 0x2009, 0x07d0, 0x2011, 0x4add, 0x080c, -- 0x6a23, 0x0490, 0x2069, 0xbb80, 0x6930, 0xa18e, 0x1101, 0x1538, -- 0x6834, 0xa005, 0x1520, 0x6900, 0xa18c, 0x00ff, 0x1118, 0x6804, -- 0xa005, 0x0190, 0x2011, 0xbb8e, 0x2019, 0xb505, 0x20a9, 0x0004, -- 0x220c, 0x2304, 0xa102, 0x0230, 0x1190, 0x8210, 0x8318, 0x1f04, -- 0x45d0, 0x0068, 0x7097, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, -- 0x2099, 0xbb80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, -- 0x0008, 0x6043, 0x0000, 0x0010, 0x00de, 0x0005, 0x6040, 0xa085, -- 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x60c3, 0x000c, 0x2011, -- 0xb7ea, 0x2013, 0x0000, 0x7087, 0x0000, 0x20e1, 0x9080, 0x60a3, -- 0x0056, 0x60a7, 0x9575, 0x080c, 0x7d72, 0x0c30, 0x0005, 0x708c, -- 0xa08a, 0x001d, 0x1210, 0x0023, 0x0010, 0x080c, 0x1515, 0x0005, -- 0x463a, 0x4649, 0x4671, 0x468a, 0x46ae, 0x46d6, 0x46fa, 0x472b, -- 0x474f, 0x4777, 0x47ae, 0x47d6, 0x47f2, 0x4808, 0x4828, 0x483b, -- 0x4843, 0x4873, 0x4897, 0x48bf, 0x48e3, 0x4914, 0x4951, 0x4980, -- 0x499c, 0x49db, 0x49fb, 0x4a14, 0x4a15, 0x00c6, 0x2061, 0xb500, -- 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9, 0x6006, -- 0x00ce, 0x0005, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0002, -- 0x708f, 0x0001, 0x2009, 0x07d0, 0x2011, 0x4add, 0x080c, 0x6a23, -- 0x0005, 0x00f6, 0x7084, 0xa086, 0x0014, 0x1508, 0x6043, 0x0000, -- 0x6020, 0xd0b4, 0x11e0, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1102, -- 0x11a0, 0x7834, 0xa005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70b8, -- 0xa005, 0x1110, 0x70bb, 0x0001, 0x2011, 0x4add, 0x080c, 0x699d, -- 0x708f, 0x0010, 0x080c, 0x4843, 0x0010, 0x080c, 0x4b20, 0x00fe, -- 0x0005, 0x708f, 0x0003, 0x6043, 0x0004, 0x2011, 0x4add, 0x080c, -- 0x699d, 0x080c, 0x4b98, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, -- 0x000a, 0x20a3, 0x0000, 0x1f04, 0x4681, 0x60c3, 0x0014, 0x080c, -- 0x4b07, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4add, -- 0x080c, 0x699d, 0xa086, 0x0014, 0x11a8, 0x2079, 0xbb80, 0x7a30, -- 0xa296, 0x1102, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, -- 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0004, -- 0x0029, 0x0010, 0x080c, 0x4b20, 0x00fe, 0x0005, 0x708f, 0x0005, -- 0x080c, 0x4b98, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, -- 0xbb8e, 0x080c, 0x4be9, 0x1160, 0x7078, 0xa005, 0x1148, 0x7150, -- 0xa186, 0xffff, 0x0128, 0x080c, 0x4aa1, 0x0110, 0x080c, 0x4bc7, -+ 0xa085, 0x0001, 0x080c, 0x5b13, 0x080c, 0x5a07, 0x0010, 0x080c, -+ 0x4b1f, 0x012e, 0x0804, 0x2faa, 0x7824, 0x2008, 0xa18c, 0xfffd, -+ 0x1128, 0x61e0, 0xa10d, 0x61e2, 0x0804, 0x2faa, 0x0804, 0x2fd2, -+ 0x81ff, 0x1904, 0x2fcf, 0x6000, 0xa086, 0x0003, 0x1904, 0x2fcf, -+ 0x2001, 0xb553, 0x2004, 0xd0ac, 0x1904, 0x2fcf, 0x080c, 0x3e9a, -+ 0x0904, 0x2fd2, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1120, -+ 0x7828, 0xa005, 0x0904, 0x2faa, 0x00c6, 0x080c, 0x3e75, 0x00ce, -+ 0x0904, 0x2fcf, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, -+ 0x683a, 0x080c, 0x9e6b, 0x0904, 0x2fcf, 0x7007, 0x0003, 0x701b, -+ 0x3faa, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, 0x2fcf, 0x0804, -+ 0x2faa, 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, 0x1904, 0x2fcf, -+ 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3e75, 0x0904, -+ 0x2fcf, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, 0x0000, 0x702f, -+ 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x080c, 0x4fa9, 0x1904, -+ 0x4024, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, 0x0130, 0xa0c4, -+ 0xff00, 0xa8c6, 0x0600, 0x1904, 0x4024, 0x2001, 0xb553, 0x2004, -+ 0xd0ac, 0x1128, 0x080c, 0x524a, 0x1110, 0xd79c, 0x05e8, 0xd794, -+ 0x1110, 0xd784, 0x0158, 0xac80, 0x0006, 0x2098, 0x3400, 0x20a9, -+ 0x0004, 0x53a3, 0x080c, 0x3ce7, 0xd794, 0x0148, 0xac80, 0x000a, -+ 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3ce7, 0x21a2, -+ 0xd794, 0x01d8, 0xac80, 0x0000, 0x2098, 0x94a0, 0x20a9, 0x0002, -+ 0x53a3, 0xac80, 0x0003, 0x20a6, 0x94a0, 0xac80, 0x0004, 0x2098, -+ 0x3400, 0x20a9, 0x0002, 0x53a3, 0x080c, 0x3cd9, 0xac80, 0x0026, -+ 0x2098, 0x20a9, 0x0002, 0x53a3, 0x0008, 0x94a0, 0xd794, 0x0110, -+ 0xa6b0, 0x000b, 0xa6b0, 0x0005, 0x8108, 0x2001, 0xb535, 0x2004, -+ 0xd0ac, 0x0118, 0xa186, 0x0100, 0x0040, 0xd78c, 0x0120, 0xa186, -+ 0x0100, 0x0170, 0x0018, 0xa186, 0x007e, 0x0150, 0xd794, 0x0118, -+ 0xa686, 0x0020, 0x0010, 0xa686, 0x0028, 0x0150, 0x0804, 0x3fcd, -+ 0x86ff, 0x1120, 0x7120, 0x810b, 0x0804, 0x2faa, 0x702f, 0x0001, -+ 0x711e, 0x7020, 0xa600, 0x7022, 0x772a, 0x2061, 0xb5d2, 0x6007, -+ 0x0000, 0x6612, 0x7024, 0x600e, 0x6226, 0x632a, 0x642e, 0x6532, -+ 0x2c10, 0x080c, 0x1643, 0x7007, 0x0002, 0x701b, 0x4060, 0x0005, -+ 0x702c, 0xa005, 0x1170, 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, -+ 0x0000, 0x2061, 0xb5d2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, -+ 0x3fcd, 0x7120, 0x810b, 0x0804, 0x2faa, 0x2029, 0x007e, 0x7924, -+ 0x7a28, 0x7b2c, 0x7c38, 0xa184, 0xff00, 0x8007, 0xa0e2, 0x0020, -+ 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa184, 0x00ff, 0xa0e2, -+ 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa284, 0xff00, -+ 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, -+ 0xa284, 0x00ff, 0xa0e2, 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, -+ 0x2fd2, 0xa384, 0xff00, 0x8007, 0xa0e2, 0x0020, 0x0a04, 0x2fd2, -+ 0xa502, 0x0a04, 0x2fd2, 0xa384, 0x00ff, 0xa0e2, 0x0020, 0x0a04, -+ 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa484, 0xff00, 0x8007, 0xa0e2, -+ 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0xa484, 0x00ff, -+ 0xa0e2, 0x0020, 0x0a04, 0x2fd2, 0xa502, 0x0a04, 0x2fd2, 0x2061, -+ 0xb7b9, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x2faa, 0x0006, -+ 0x2001, 0xb553, 0x2004, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x2001, -+ 0xb572, 0x2004, 0xd0bc, 0x000e, 0x0005, 0x6168, 0x7a24, 0x6300, -+ 0x82ff, 0x1118, 0x7926, 0x0804, 0x2faa, 0x83ff, 0x1904, 0x2fd2, -+ 0x2001, 0xfff0, 0xa200, 0x1a04, 0x2fd2, 0x2019, 0xffff, 0x606c, -+ 0xa302, 0xa200, 0x0a04, 0x2fd2, 0x7926, 0x626a, 0x0804, 0x2faa, -+ 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, 0x1904, 0x2fcf, 0x7c28, -+ 0x7d24, 0x7e38, 0x7f2c, 0x080c, 0x3e75, 0x0904, 0x2fcf, 0x2009, -+ 0x0000, 0x2019, 0x0000, 0x7023, 0x0000, 0x702f, 0x0000, 0xad80, -+ 0x0003, 0x7026, 0x20a0, 0xa1e0, 0xb635, 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, 0x2faa, 0x702f, 0x0001, 0x711e, -+ 0x7020, 0xa300, 0x7022, 0x2061, 0xb5d2, 0x6007, 0x0000, 0x6312, -+ 0x7024, 0x600e, 0x6426, 0x652a, 0x662e, 0x6732, 0x2c10, 0x080c, -+ 0x1643, 0x7007, 0x0002, 0x701b, 0x4156, 0x0005, 0x702c, 0xa005, -+ 0x1168, 0x711c, 0x7024, 0x20a0, 0x2019, 0x0000, 0x2061, 0xb5d2, -+ 0x6424, 0x6528, 0x662c, 0x6730, 0x0804, 0x4113, 0x7120, 0x810c, -+ 0x0804, 0x2faa, 0x81ff, 0x1904, 0x2fcf, 0x60d4, 0xd0ac, 0x1118, -+ 0xd09c, 0x0904, 0x2fcf, 0x080c, 0x3e75, 0x0904, 0x2fcf, 0x7924, -+ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3eb6, 0x701b, 0x4181, -+ 0x0005, 0x00d6, 0xade8, 0x000d, 0x6828, 0xa0be, 0x7000, 0x0148, -+ 0xa0be, 0x7100, 0x0130, 0xa0be, 0x7200, 0x0118, 0x00de, 0x0804, -+ 0x2fd2, 0x6820, 0x6924, 0x080c, 0x281d, 0x1510, 0x080c, 0x4f4d, -+ 0x11f8, 0x7122, 0x6612, 0x6516, 0x6e18, 0x00c6, 0x080c, 0x3e75, -+ 0x01b8, 0x080c, 0x3e75, 0x01a0, 0x00ce, 0x00de, 0x6837, 0x0000, -+ 0x6838, 0xc0fd, 0x683a, 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, -+ 0x9dbe, 0x0904, 0x2fcf, 0x7007, 0x0003, 0x701b, 0x41bb, 0x0005, -+ 0x00de, 0x0804, 0x2fcf, 0x7120, 0x080c, 0x2d97, 0x6820, 0xa086, -+ 0x8001, 0x0904, 0x2fcf, 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, -+ 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x4b8f, 0x000e, -+ 0xade8, 0x000d, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x2061, 0xb5d2, -+ 0x6007, 0x0000, 0x6e00, 0x6f28, 0xa7c6, 0x7000, 0x1108, 0x0018, -+ 0xa7c6, 0x7100, 0x1140, 0xa6c2, 0x0004, 0x0a04, 0x2fd2, 0x2009, -+ 0x0004, 0x0804, 0x3eb9, 0xa7c6, 0x7200, 0x1904, 0x2fd2, 0xa6c2, -+ 0x0054, 0x0a04, 0x2fd2, 0x600e, 0x6013, 0x002a, 0x6226, 0x632a, -+ 0x642e, 0x6532, 0x2c10, 0x080c, 0x1643, 0x7007, 0x0002, 0x701b, -+ 0x4202, 0x0005, 0x701c, 0x2068, 0x6804, 0xa080, 0x0001, 0x2004, -+ 0xa080, 0x0002, 0x0006, 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, -+ 0x4b8f, 0x000e, 0x2009, 0x002a, 0x2061, 0xb5d2, 0x6224, 0x6328, -+ 0x642c, 0x6530, 0x0804, 0x3eb9, 0x81ff, 0x1904, 0x2fcf, 0x792c, -+ 0x2001, 0xb7a0, 0x2102, 0x080c, 0x3e8a, 0x0904, 0x2fd2, 0x080c, -+ 0x506f, 0x0904, 0x2fcf, 0x0126, 0x2091, 0x8000, 0x080c, 0x51a1, -+ 0x012e, 0x0804, 0x2faa, 0x7824, 0xd08c, 0x1118, 0xd084, 0x0904, -+ 0x3a46, 0x080c, 0x3e9a, 0x0904, 0x2fd2, 0x00c6, 0x080c, 0x3e75, -+ 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x2fcf, 0x6004, 0xa084, -+ 0x00ff, 0xa086, 0x0006, 0x0128, 0xa08e, 0x0004, 0x0110, 0xa08e, -+ 0x0005, 0x15b8, 0x7824, 0xd08c, 0x0120, 0x6000, 0xc08c, 0x6002, -+ 0x0030, 0x2001, 0xb553, 0x2004, 0xd0b4, 0x0904, 0x3a82, 0x7824, -+ 0xa084, 0xff00, 0xa08e, 0x7e00, 0x0904, 0x3a82, 0xa08e, 0x7f00, -+ 0x0904, 0x3a82, 0xa08e, 0x8000, 0x0904, 0x3a82, 0x6000, 0xd08c, -+ 0x1904, 0x3a82, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, -+ 0x9dda, 0x1120, 0x2009, 0x0003, 0x0804, 0x2fcf, 0x7007, 0x0003, -+ 0x701b, 0x4283, 0x0005, 0x080c, 0x3e9a, 0x0904, 0x2fd2, 0x0804, -+ 0x3a82, 0x2009, 0xb531, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, -+ 0x0804, 0x2fcf, 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, 0x0120, -+ 0x2009, 0x0007, 0x0804, 0x2fcf, 0x2001, 0xb553, 0x2004, 0xd0ac, -+ 0x0120, 0x2009, 0x0008, 0x0804, 0x2fcf, 0x609c, 0xd0a4, 0x1118, -+ 0xd0ac, 0x1904, 0x3a82, 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, -+ 0xc0fd, 0x683a, 0x080c, 0x9e6b, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x2fcf, 0x7007, 0x0003, 0x701b, 0x42be, 0x0005, 0x6830, 0xa086, -+ 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x2fcf, 0x080c, 0x3e9a, -+ 0x0904, 0x2fd2, 0x0804, 0x4252, 0x81ff, 0x2009, 0x0001, 0x1904, -+ 0x2fcf, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x2fcf, -+ 0x2001, 0xb553, 0x2004, 0xd0ac, 0x2009, 0x0008, 0x1904, 0x2fcf, -+ 0x080c, 0x3e9a, 0x0904, 0x2fd2, 0x6004, 0xa084, 0x00ff, 0xa086, -+ 0x0006, 0x2009, 0x0009, 0x1904, 0x2fcf, 0x00c6, 0x080c, 0x3e75, -+ 0x00ce, 0x2009, 0x0002, 0x0904, 0x2fcf, 0x6837, 0x0000, 0x6833, -+ 0x0000, 0x6838, 0xc0fd, 0x683a, 0x7928, 0xa194, 0xff00, 0xa18c, -+ 0x00ff, 0xa006, 0x82ff, 0x1128, 0xc0ed, 0x6952, 0x792c, 0x6956, -+ 0x0048, 0xa28e, 0x0100, 0x1904, 0x2fd2, 0xc0e5, 0x6853, 0x0000, -+ 0x6857, 0x0000, 0x683e, 0x080c, 0xa028, 0x2009, 0x0003, 0x0904, -+ 0x2fcf, 0x7007, 0x0003, 0x701b, 0x431e, 0x0005, 0x6830, 0xa086, -+ 0x0100, 0x2009, 0x0004, 0x0904, 0x2fcf, 0x0804, 0x2faa, 0x81ff, -+ 0x2009, 0x0001, 0x1904, 0x2fcf, 0x6000, 0xa086, 0x0003, 0x2009, -+ 0x0007, 0x1904, 0x2fcf, 0x080c, 0x3e9a, 0x0904, 0x2fd2, 0x6004, -+ 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, 0x1904, 0x2fcf, -+ 0x00c6, 0x080c, 0x3e75, 0x00ce, 0x2009, 0x0002, 0x0904, 0x2fcf, -+ 0xad80, 0x000f, 0x2009, 0x0008, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, -+ 0x080c, 0x3eb6, 0x701b, 0x4355, 0x0005, 0x00d6, 0xade8, 0x000f, -+ 0x6800, 0xa086, 0x0500, 0x1140, 0x6804, 0xa005, 0x1128, 0x6808, -+ 0xa084, 0xff00, 0x1108, 0x0018, 0x00de, 0x1904, 0x2fd2, 0x00de, -+ 0x6837, 0x0000, 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x00c6, -+ 0x080c, 0x3e9a, 0x1118, 0x00ce, 0x0804, 0x2fd2, 0x080c, 0xa077, -+ 0x2009, 0x0003, 0x00ce, 0x0904, 0x2fcf, 0x7007, 0x0003, 0x701b, -+ 0x4382, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, 0x0904, -+ 0x2fcf, 0x0804, 0x2faa, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, -+ 0x2fcf, 0x6000, 0xa086, 0x0003, 0x0120, 0x2009, 0x0007, 0x0804, -+ 0x2fcf, 0x7e24, 0x860f, 0xa18c, 0x00ff, 0xa6b4, 0x00ff, 0x080c, -+ 0x4fa9, 0x1904, 0x2fd2, 0xa186, 0x007f, 0x0150, 0x6004, 0xa084, -+ 0x00ff, 0xa086, 0x0006, 0x0120, 0x2009, 0x0009, 0x0804, 0x2fcf, -+ 0x00c6, 0x080c, 0x3e75, 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, -+ 0x2fcf, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x2001, 0x0100, -+ 0x8007, 0x680a, 0x080c, 0x9df5, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x2fcf, 0x7007, 0x0003, 0x701b, 0x43ce, 0x0005, 0x6808, 0x8007, -+ 0xa086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x2fcf, 0x68b0, -+ 0x6836, 0x6810, 0x8007, 0xa084, 0x00ff, 0x800c, 0x6814, 0x8007, -+ 0xa084, 0x00ff, 0x8004, 0xa080, 0x0002, 0xa108, 0xad80, 0x0004, -+ 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eb9, 0x080c, 0x3e75, -+ 0x1120, 0x2009, 0x0002, 0x0804, 0x2fcf, 0x7924, 0xa194, 0xff00, -+ 0xa18c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804, 0x2fd2, 0x2009, -+ 0x001a, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x3eb6, 0x701b, -+ 0x440a, 0x0005, 0x2001, 0xb52a, 0x2003, 0x0001, 0xad80, 0x000d, -+ 0x2098, 0x20a9, 0x001a, 0x20a1, 0xb7c6, 0x53a3, 0x0804, 0x2faa, -+ 0x080c, 0x3e75, 0x1120, 0x2009, 0x0002, 0x0804, 0x2fcf, 0x7924, -+ 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, 0x82ff, 0x0110, 0x0804, -+ 0x2fd2, 0x2099, 0xb7c6, 0x20a0, 0x20a9, 0x001a, 0x53a3, 0x2009, -+ 0x001a, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x3eb9, 0x7824, -+ 0xa08a, 0x1000, 0x1a04, 0x2fd2, 0x0126, 0x2091, 0x8000, 0x8003, -+ 0x800b, 0x810b, 0xa108, 0x00c6, 0x2061, 0xb7f3, 0x6142, 0x00ce, -+ 0x012e, 0x0804, 0x2faa, 0x00c6, 0x080c, 0x5acf, 0x1188, 0x2001, -+ 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, 0xa085, -+ 0x0001, 0x080c, 0x5b13, 0x080c, 0x5a07, 0x080c, 0x1515, 0x0038, -+ 0x2061, 0xb500, 0x6030, 0xc09d, 0x6032, 0x080c, 0x4b1f, 0x00ce, -+ 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0xb7f3, 0x7924, -+ 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7838, 0x606a, -+ 0x783c, 0x6066, 0x7828, 0x6062, 0x782c, 0x605e, 0x2061, 0xb7a1, -+ 0x2001, 0xb808, 0x600e, 0x6013, 0x0001, 0x6017, 0x0002, 0x6007, -+ 0x0000, 0x6037, 0x0000, 0x00ce, 0x012e, 0x0804, 0x2faa, 0x0126, -+ 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb500, 0x6044, 0xd0a4, -+ 0x11b0, 0xd084, 0x0118, 0x080c, 0x4606, 0x0068, 0xd08c, 0x0118, -+ 0x080c, 0x4527, 0x0040, 0xd094, 0x0118, 0x080c, 0x44f8, 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, 0x4baf, -+ 0x00f0, 0x6040, 0xa084, 0x0010, 0xa085, 0x0140, 0x6042, 0x6043, -+ 0x0000, 0x707b, 0x0000, 0x7097, 0x0001, 0x70bb, 0x0000, 0x70d7, -+ 0x0000, 0x2009, 0xbcc0, 0x200b, 0x0000, 0x708b, 0x0000, 0x707f, -+ 0x000a, 0x2009, 0x000a, 0x2011, 0x4ad5, 0x080c, 0x6a22, 0x0005, -+ 0x0156, 0x2001, 0xb574, 0x2004, 0xd08c, 0x0110, 0x7053, 0xffff, -+ 0x707c, 0xa005, 0x1510, 0x2011, 0x4ad5, 0x080c, 0x699c, 0x6040, -+ 0xa094, 0x0010, 0xa285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, -+ 0xd08c, 0x1168, 0x1f04, 0x450f, 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, 0x1515, 0x0005, -+ 0x4533, 0x4583, 0x4605, 0x00f6, 0x7083, 0x0001, 0x20e1, 0xa000, -+ 0xe000, 0x20e1, 0x8700, 0x080c, 0x2470, 0x20e1, 0x9080, 0x20e1, -+ 0x4000, 0x2079, 0xbb00, 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, 0xbb0c, 0x207b, 0x1101, 0x7807, -+ 0x0000, 0x2099, 0xb505, 0x20a1, 0xbb0e, 0x20a9, 0x0004, 0x53a3, -+ 0x2079, 0xbb12, 0x207b, 0x0000, 0x7807, 0x0000, 0x2099, 0xbb00, -+ 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x60c3, 0x000c, 0x600f, -+ 0x0000, 0x080c, 0x4b06, 0x00fe, 0x7087, 0x0000, 0x6043, 0x0008, -+ 0x6043, 0x0000, 0x0005, 0x00d6, 0x7084, 0x7087, 0x0000, 0xa025, -+ 0x0904, 0x45ed, 0x6020, 0xd0b4, 0x1904, 0x45eb, 0x7194, 0x81ff, -+ 0x0904, 0x45db, 0xa486, 0x000c, 0x1904, 0x45e6, 0xa480, 0x0018, -+ 0x8004, 0x20a8, 0x2011, 0xbb80, 0x2019, 0xbb00, 0x220c, 0x2304, -+ 0xa106, 0x11b8, 0x8210, 0x8318, 0x1f04, 0x459e, 0x6043, 0x0004, -+ 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0006, 0x7083, 0x0002, -+ 0x708f, 0x0002, 0x2009, 0x07d0, 0x2011, 0x4adc, 0x080c, 0x6a22, -+ 0x0490, 0x2069, 0xbb80, 0x6930, 0xa18e, 0x1101, 0x1538, 0x6834, -+ 0xa005, 0x1520, 0x6900, 0xa18c, 0x00ff, 0x1118, 0x6804, 0xa005, -+ 0x0190, 0x2011, 0xbb8e, 0x2019, 0xb505, 0x20a9, 0x0004, 0x220c, -+ 0x2304, 0xa102, 0x0230, 0x1190, 0x8210, 0x8318, 0x1f04, 0x45cf, -+ 0x0068, 0x7097, 0x0000, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, -+ 0xbb80, 0x20a1, 0x020b, 0x20a9, 0x0014, 0x53a6, 0x6043, 0x0008, -+ 0x6043, 0x0000, 0x0010, 0x00de, 0x0005, 0x6040, 0xa085, 0x0100, -+ 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x60c3, 0x000c, 0x2011, 0xb7ea, -+ 0x2013, 0x0000, 0x7087, 0x0000, 0x20e1, 0x9080, 0x60a3, 0x0056, -+ 0x60a7, 0x9575, 0x080c, 0x7d71, 0x0c30, 0x0005, 0x708c, 0xa08a, -+ 0x001d, 0x1210, 0x0023, 0x0010, 0x080c, 0x1515, 0x0005, 0x4639, -+ 0x4648, 0x4670, 0x4689, 0x46ad, 0x46d5, 0x46f9, 0x472a, 0x474e, -+ 0x4776, 0x47ad, 0x47d5, 0x47f1, 0x4807, 0x4827, 0x483a, 0x4842, -+ 0x4872, 0x4896, 0x48be, 0x48e2, 0x4913, 0x4950, 0x497f, 0x499b, -+ 0x49da, 0x49fa, 0x4a13, 0x4a14, 0x00c6, 0x2061, 0xb500, 0x6003, -+ 0x0007, 0x2061, 0x0100, 0x6004, 0xa084, 0xfff9, 0x6006, 0x00ce, -+ 0x0005, 0x608b, 0xbc94, 0x608f, 0xf0f0, 0x6043, 0x0002, 0x708f, -+ 0x0001, 0x2009, 0x07d0, 0x2011, 0x4adc, 0x080c, 0x6a22, 0x0005, -+ 0x00f6, 0x7084, 0xa086, 0x0014, 0x1508, 0x6043, 0x0000, 0x6020, -+ 0xd0b4, 0x11e0, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1102, 0x11a0, -+ 0x7834, 0xa005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, -+ 0x1110, 0x70bb, 0x0001, 0x2011, 0x4adc, 0x080c, 0x699c, 0x708f, -+ 0x0010, 0x080c, 0x4842, 0x0010, 0x080c, 0x4b1f, 0x00fe, 0x0005, -+ 0x708f, 0x0003, 0x6043, 0x0004, 0x2011, 0x4adc, 0x080c, 0x699c, -+ 0x080c, 0x4b97, 0x20a3, 0x1102, 0x20a3, 0x0000, 0x20a9, 0x000a, -+ 0x20a3, 0x0000, 0x1f04, 0x4680, 0x60c3, 0x0014, 0x080c, 0x4b06, -+ 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4adc, 0x080c, -+ 0x699c, 0xa086, 0x0014, 0x11a8, 0x2079, 0xbb80, 0x7a30, 0xa296, -+ 0x1102, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, -+ 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0004, 0x0029, -+ 0x0010, 0x080c, 0x4b1f, 0x00fe, 0x0005, 0x708f, 0x0005, 0x080c, -+ 0x4b97, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0xbb8e, -+ 0x080c, 0x4be8, 0x1160, 0x7078, 0xa005, 0x1148, 0x7150, 0xa186, -+ 0xffff, 0x0128, 0x080c, 0x4aa0, 0x0110, 0x080c, 0x4bc6, 0x20a9, -+ 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, -+ 0x60c3, 0x0014, 0x080c, 0x4b06, 0x0005, 0x00f6, 0x7084, 0xa005, -+ 0x01f0, 0x2011, 0x4adc, 0x080c, 0x699c, 0xa086, 0x0014, 0x11a8, -+ 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834, 0xa005, -+ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, -+ 0x0001, 0x708f, 0x0006, 0x0029, 0x0010, 0x080c, 0x4b1f, 0x00fe, -+ 0x0005, 0x708f, 0x0007, 0x080c, 0x4b97, 0x20a3, 0x1104, 0x20a3, -+ 0x0000, 0x3430, 0x2011, 0xbb8e, 0x080c, 0x4be8, 0x11a8, 0x7078, -+ 0xa005, 0x1190, 0x7158, 0xa186, 0xffff, 0x0170, 0xa180, 0x2dc4, -+ 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4aa0, 0x0128, 0x080c, -+ 0x40d6, 0x0110, 0x080c, 0x2867, 0x20a9, 0x0008, 0x2298, 0x26a0, -+ 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, -+ 0x4b06, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4adc, -+ 0x080c, 0x699c, 0xa086, 0x0014, 0x11a8, 0x2079, 0xbb80, 0x7a30, -+ 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, -+ 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0008, -+ 0x0029, 0x0010, 0x080c, 0x4b1f, 0x00fe, 0x0005, 0x708f, 0x0009, -+ 0x080c, 0x4b97, 0x20a3, 0x1105, 0x20a3, 0x0100, 0x3430, 0x080c, -+ 0x4be8, 0x1150, 0x7078, 0xa005, 0x1138, 0x080c, 0x4a15, 0x1170, -+ 0xa085, 0x0001, 0x080c, 0x2867, 0x20a9, 0x0008, 0x2099, 0xbb8e, -+ 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, -+ 0x080c, 0x4b06, 0x0010, 0x080c, 0x462c, 0x0005, 0x00f6, 0x7084, -+ 0xa005, 0x0588, 0x2011, 0x4adc, 0x080c, 0x699c, 0xa086, 0x0014, -+ 0x1540, 0x2079, 0xbb80, 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, 0x4827, -+ 0x0010, 0x080c, 0x4b1f, 0x00fe, 0x0005, 0x708f, 0x000b, 0x2011, -+ 0xbb0e, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, -+ 0x0002, 0x2009, 0x0000, 0x41a4, 0x080c, 0x4b97, 0x20a3, 0x1106, -+ 0x20a3, 0x0000, 0x080c, 0x4be8, 0x0118, 0x2013, 0x0000, 0x0020, -+ 0x7054, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, -+ 0x60c3, 0x0084, 0x080c, 0x4b06, 0x0005, 0x00f6, 0x7084, 0xa005, -+ 0x01b0, 0x2011, 0x4adc, 0x080c, 0x699c, 0xa086, 0x0084, 0x1168, -+ 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, 0xa005, -+ 0x1120, 0x708f, 0x000c, 0x0029, 0x0010, 0x080c, 0x4b1f, 0x00fe, -+ 0x0005, 0x708f, 0x000d, 0x080c, 0x4b97, 0x20a3, 0x1107, 0x20a3, -+ 0x0000, 0x2099, 0xbb8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, -+ 0x20a3, 0x0000, 0x60c3, 0x0084, 0x080c, 0x4b06, 0x0005, 0x00f6, -+ 0x7084, 0xa005, 0x01d0, 0x2011, 0x4adc, 0x080c, 0x699c, 0xa086, -+ 0x0084, 0x1188, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1107, 0x1158, -+ 0x7834, 0xa005, 0x1140, 0x708b, 0x0001, 0x080c, 0x4b89, 0x708f, -+ 0x000e, 0x0029, 0x0010, 0x080c, 0x4b1f, 0x00fe, 0x0005, 0x708f, -+ 0x000f, 0x7087, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, -+ 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x4adc, 0x080c, -+ 0x6990, 0x0005, 0x7084, 0xa005, 0x0120, 0x2011, 0x4adc, 0x080c, -+ 0x699c, 0x0005, 0x708f, 0x0011, 0x080c, 0x4be8, 0x11a0, 0x7170, -+ 0x81ff, 0x0188, 0x2009, 0x0000, 0x7074, 0xa084, 0x00ff, 0x080c, -+ 0x281d, 0xa186, 0x007e, 0x0138, 0xa186, 0x0080, 0x0120, 0x2011, -+ 0xbb8e, 0x080c, 0x4aa0, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, -+ 0xbb80, 0x20a1, 0x020b, 0x7484, 0xa480, 0x0018, 0xa080, 0x0007, -+ 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, 0x080c, -+ 0x4b06, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4adc, -+ 0x080c, 0x699c, 0xa086, 0x0014, 0x11a8, 0x2079, 0xbb80, 0x7a30, -+ 0xa296, 0x1103, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, -+ 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, 0x0012, -+ 0x0029, 0x0010, 0x080c, 0x4b1f, 0x00fe, 0x0005, 0x708f, 0x0013, -+ 0x080c, 0x4ba3, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, -+ 0xbb8e, 0x080c, 0x4be8, 0x1160, 0x7078, 0xa005, 0x1148, 0x7150, -+ 0xa186, 0xffff, 0x0128, 0x080c, 0x4aa0, 0x0110, 0x080c, 0x4bc6, - 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, -- 0x0000, 0x60c3, 0x0014, 0x080c, 0x4b07, 0x0005, 0x00f6, 0x7084, -- 0xa005, 0x01f0, 0x2011, 0x4add, 0x080c, 0x699d, 0xa086, 0x0014, -- 0x11a8, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834, -+ 0x0000, 0x60c3, 0x0014, 0x080c, 0x4b06, 0x0005, 0x00f6, 0x7084, -+ 0xa005, 0x01f0, 0x2011, 0x4adc, 0x080c, 0x699c, 0xa086, 0x0014, -+ 0x11a8, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, - 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, -- 0x70bb, 0x0001, 0x708f, 0x0006, 0x0029, 0x0010, 0x080c, 0x4b20, -- 0x00fe, 0x0005, 0x708f, 0x0007, 0x080c, 0x4b98, 0x20a3, 0x1104, -- 0x20a3, 0x0000, 0x3430, 0x2011, 0xbb8e, 0x080c, 0x4be9, 0x11a8, -+ 0x70bb, 0x0001, 0x708f, 0x0014, 0x0029, 0x0010, 0x080c, 0x4b1f, -+ 0x00fe, 0x0005, 0x708f, 0x0015, 0x080c, 0x4ba3, 0x20a3, 0x1104, -+ 0x20a3, 0x0000, 0x3430, 0x2011, 0xbb8e, 0x080c, 0x4be8, 0x11a8, - 0x7078, 0xa005, 0x1190, 0x7158, 0xa186, 0xffff, 0x0170, 0xa180, -- 0x2dc4, 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4aa1, 0x0128, -- 0x080c, 0x40d7, 0x0110, 0x080c, 0x2867, 0x20a9, 0x0008, 0x2298, -+ 0x2dc4, 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4aa0, 0x0128, -+ 0x080c, 0x40d6, 0x0110, 0x080c, 0x2867, 0x20a9, 0x0008, 0x2298, - 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, -- 0x080c, 0x4b07, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, -- 0x4add, 0x080c, 0x699d, 0xa086, 0x0014, 0x11a8, 0x2079, 0xbb80, -- 0x7a30, 0xa296, 0x1104, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, -- 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, -- 0x0008, 0x0029, 0x0010, 0x080c, 0x4b20, 0x00fe, 0x0005, 0x708f, -- 0x0009, 0x080c, 0x4b98, 0x20a3, 0x1105, 0x20a3, 0x0100, 0x3430, -- 0x080c, 0x4be9, 0x1150, 0x7078, 0xa005, 0x1138, 0x080c, 0x4a16, -+ 0x080c, 0x4b06, 0x0005, 0x00f6, 0x7084, 0xa005, 0x05b8, 0x2011, -+ 0x4adc, 0x080c, 0x699c, 0xa086, 0x0014, 0x1570, 0x2079, 0xbb80, -+ 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, 0xb574, 0x2004, 0xd0a4, 0x1110, 0x70d7, 0x0008, -+ 0x708f, 0x0016, 0x0029, 0x0010, 0x080c, 0x4b1f, 0x00fe, 0x0005, -+ 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xbb80, 0x20a1, 0x020b, -+ 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xbb8e, 0x708f, 0x0017, -+ 0x080c, 0x4be8, 0x1150, 0x7078, 0xa005, 0x1138, 0x080c, 0x4a15, - 0x1170, 0xa085, 0x0001, 0x080c, 0x2867, 0x20a9, 0x0008, 0x2099, - 0xbb8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, -- 0x0014, 0x080c, 0x4b07, 0x0010, 0x080c, 0x462d, 0x0005, 0x00f6, -- 0x7084, 0xa005, 0x0588, 0x2011, 0x4add, 0x080c, 0x699d, 0xa086, -- 0x0014, 0x1540, 0x2079, 0xbb80, 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, -- 0x4828, 0x0010, 0x080c, 0x4b20, 0x00fe, 0x0005, 0x708f, 0x000b, -- 0x2011, 0xbb0e, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x43a4, -- 0x20a9, 0x0002, 0x2009, 0x0000, 0x41a4, 0x080c, 0x4b98, 0x20a3, -- 0x1106, 0x20a3, 0x0000, 0x080c, 0x4be9, 0x0118, 0x2013, 0x0000, -- 0x0020, 0x7054, 0xa085, 0x0100, 0x2012, 0x2298, 0x20a9, 0x0042, -- 0x53a6, 0x60c3, 0x0084, 0x080c, 0x4b07, 0x0005, 0x00f6, 0x7084, -- 0xa005, 0x01b0, 0x2011, 0x4add, 0x080c, 0x699d, 0xa086, 0x0084, -- 0x1168, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, -- 0xa005, 0x1120, 0x708f, 0x000c, 0x0029, 0x0010, 0x080c, 0x4b20, -- 0x00fe, 0x0005, 0x708f, 0x000d, 0x080c, 0x4b98, 0x20a3, 0x1107, -- 0x20a3, 0x0000, 0x2099, 0xbb8e, 0x20a9, 0x0040, 0x53a6, 0x20a3, -- 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x080c, 0x4b07, 0x0005, -- 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011, 0x4add, 0x080c, 0x699d, -- 0xa086, 0x0084, 0x1188, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1107, -- 0x1158, 0x7834, 0xa005, 0x1140, 0x708b, 0x0001, 0x080c, 0x4b8a, -- 0x708f, 0x000e, 0x0029, 0x0010, 0x080c, 0x4b20, 0x00fe, 0x0005, -- 0x708f, 0x000f, 0x7087, 0x0000, 0x608b, 0xbc85, 0x608f, 0xb5b5, -- 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x4add, -- 0x080c, 0x6991, 0x0005, 0x7084, 0xa005, 0x0120, 0x2011, 0x4add, -- 0x080c, 0x699d, 0x0005, 0x708f, 0x0011, 0x080c, 0x4be9, 0x11a0, -- 0x7170, 0x81ff, 0x0188, 0x2009, 0x0000, 0x7074, 0xa084, 0x00ff, -- 0x080c, 0x281d, 0xa186, 0x007e, 0x0138, 0xa186, 0x0080, 0x0120, -- 0x2011, 0xbb8e, 0x080c, 0x4aa1, 0x20e1, 0x9080, 0x20e1, 0x4000, -+ 0x0014, 0x080c, 0x4b06, 0x0010, 0x080c, 0x462c, 0x0005, 0x00f6, -+ 0x7084, 0xa005, 0x01b0, 0x2011, 0x4adc, 0x080c, 0x699c, 0xa086, -+ 0x0084, 0x1168, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1106, 0x1138, -+ 0x7834, 0xa005, 0x1120, 0x708f, 0x0018, 0x0029, 0x0010, 0x080c, -+ 0x4b1f, 0x00fe, 0x0005, 0x708f, 0x0019, 0x080c, 0x4ba3, 0x20a3, -+ 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, 0xbb8e, 0x2039, 0xbb0e, -+ 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x080c, 0x4be8, 0x11e8, 0x2728, -+ 0x2514, 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, 0x00ff, -+ 0x8007, 0xa205, 0x202a, 0x7054, 0x2310, 0x8214, 0xa2a0, 0xbb0e, -+ 0x2414, 0xa38c, 0x0001, 0x0118, 0xa294, 0xff00, 0x0018, 0xa294, -+ 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9, 0x0040, -+ 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, 0x080c, -+ 0x4b06, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011, 0x4adc, -+ 0x080c, 0x699c, 0xa086, 0x0084, 0x1188, 0x2079, 0xbb80, 0x7a30, -+ 0xa296, 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x708b, 0x0001, -+ 0x080c, 0x4b89, 0x708f, 0x001a, 0x0029, 0x0010, 0x080c, 0x4b1f, -+ 0x00fe, 0x0005, 0x708f, 0x001b, 0x20e1, 0x9080, 0x20e1, 0x4000, - 0x2099, 0xbb80, 0x20a1, 0x020b, 0x7484, 0xa480, 0x0018, 0xa080, -- 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0014, -- 0x080c, 0x4b07, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, -- 0x4add, 0x080c, 0x699d, 0xa086, 0x0014, 0x11a8, 0x2079, 0xbb80, -- 0x7a30, 0xa296, 0x1103, 0x1178, 0x7834, 0xa005, 0x1160, 0x7a38, -- 0xd2fc, 0x0128, 0x70b8, 0xa005, 0x1110, 0x70bb, 0x0001, 0x708f, -- 0x0012, 0x0029, 0x0010, 0x080c, 0x4b20, 0x00fe, 0x0005, 0x708f, -- 0x0013, 0x080c, 0x4ba4, 0x20a3, 0x1103, 0x20a3, 0x0000, 0x3430, -- 0x2011, 0xbb8e, 0x080c, 0x4be9, 0x1160, 0x7078, 0xa005, 0x1148, -- 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, 0x4aa1, 0x0110, 0x080c, -- 0x4bc7, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, -- 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4b07, 0x0005, 0x00f6, -- 0x7084, 0xa005, 0x01f0, 0x2011, 0x4add, 0x080c, 0x699d, 0xa086, -- 0x0014, 0x11a8, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1104, 0x1178, -- 0x7834, 0xa005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70b8, 0xa005, -- 0x1110, 0x70bb, 0x0001, 0x708f, 0x0014, 0x0029, 0x0010, 0x080c, -- 0x4b20, 0x00fe, 0x0005, 0x708f, 0x0015, 0x080c, 0x4ba4, 0x20a3, -- 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, 0xbb8e, 0x080c, 0x4be9, -- 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, 0xa186, 0xffff, 0x0170, -- 0xa180, 0x2dc4, 0x200d, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4aa1, -- 0x0128, 0x080c, 0x40d7, 0x0110, 0x080c, 0x2867, 0x20a9, 0x0008, -- 0x2298, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, -- 0x0014, 0x080c, 0x4b07, 0x0005, 0x00f6, 0x7084, 0xa005, 0x05b8, -- 0x2011, 0x4add, 0x080c, 0x699d, 0xa086, 0x0014, 0x1570, 0x2079, -- 0xbb80, 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, 0xb574, 0x2004, 0xd0a4, 0x1110, 0x70d7, -- 0x0008, 0x708f, 0x0016, 0x0029, 0x0010, 0x080c, 0x4b20, 0x00fe, -- 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xbb80, 0x20a1, -- 0x020b, 0x20a9, 0x000e, 0x53a6, 0x3430, 0x2011, 0xbb8e, 0x708f, -- 0x0017, 0x080c, 0x4be9, 0x1150, 0x7078, 0xa005, 0x1138, 0x080c, -- 0x4a16, 0x1170, 0xa085, 0x0001, 0x080c, 0x2867, 0x20a9, 0x0008, -- 0x2099, 0xbb8e, 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, -- 0x60c3, 0x0014, 0x080c, 0x4b07, 0x0010, 0x080c, 0x462d, 0x0005, -- 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, 0x4add, 0x080c, 0x699d, -- 0xa086, 0x0084, 0x1168, 0x2079, 0xbb80, 0x7a30, 0xa296, 0x1106, -- 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, 0x0018, 0x0029, 0x0010, -- 0x080c, 0x4b20, 0x00fe, 0x0005, 0x708f, 0x0019, 0x080c, 0x4ba4, -- 0x20a3, 0x1106, 0x20a3, 0x0000, 0x3430, 0x2099, 0xbb8e, 0x2039, -- 0xbb0e, 0x27a0, 0x20a9, 0x0040, 0x53a3, 0x080c, 0x4be9, 0x11e8, -- 0x2728, 0x2514, 0x8207, 0xa084, 0x00ff, 0x8000, 0x2018, 0xa294, -- 0x00ff, 0x8007, 0xa205, 0x202a, 0x7054, 0x2310, 0x8214, 0xa2a0, -- 0xbb0e, 0x2414, 0xa38c, 0x0001, 0x0118, 0xa294, 0xff00, 0x0018, -- 0xa294, 0x00ff, 0x8007, 0xa215, 0x2222, 0x2798, 0x26a0, 0x20a9, -- 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0084, -- 0x080c, 0x4b07, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, 0x2011, -- 0x4add, 0x080c, 0x699d, 0xa086, 0x0084, 0x1188, 0x2079, 0xbb80, -- 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, 0x708b, -- 0x0001, 0x080c, 0x4b8a, 0x708f, 0x001a, 0x0029, 0x0010, 0x080c, -- 0x4b20, 0x00fe, 0x0005, 0x708f, 0x001b, 0x20e1, 0x9080, 0x20e1, -- 0x4000, 0x2099, 0xbb80, 0x20a1, 0x020b, 0x7484, 0xa480, 0x0018, -- 0xa080, 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, -- 0x0084, 0x080c, 0x4b07, 0x0005, 0x0005, 0x0005, 0x0086, 0x0096, -- 0x2029, 0xb553, 0x252c, 0x20a9, 0x0008, 0x2041, 0xbb0e, 0x28a0, -- 0x2099, 0xbb8e, 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, -- 0x0110, 0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, -- 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x4a2b, -- 0x0804, 0x4a99, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0xa1a6, 0x3fff, -- 0x0d90, 0x0020, 0xa1a6, 0x3fff, 0x0904, 0x4a99, 0xa18d, 0xc000, -- 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, -- 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, -- 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x4a51, 0x04d0, 0x23a8, -- 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x4a63, 0x2328, 0x8529, -- 0xa2be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0xa73a, -- 0x000e, 0x27a8, 0xa5a8, 0x0010, 0x1f04, 0x4a72, 0x7552, 0xa5c8, -- 0x2dc4, 0x292d, 0xa5ac, 0x00ff, 0x7576, 0x6532, 0x6536, 0x0016, -- 0x2508, 0x080c, 0x2847, 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, 0x1515, 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, 0x2dc4, 0x242d, 0xa5ac, 0x00ff, 0x7576, 0x6532, -- 0x6536, 0x0016, 0x2508, 0x080c, 0x2847, 0x001e, 0x60e7, 0x0000, -- 0x65ea, 0x707b, 0x0001, 0xa084, 0x0000, 0x0005, 0x00e6, 0x2071, -- 0xb500, 0x707f, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, -- 0x0100, 0x2071, 0x0140, 0x080c, 0x7d7b, 0x7004, 0xa084, 0x4000, -- 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, 0x0126, 0x2091, 0x8000, -- 0x2071, 0xb523, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, -- 0x00f7, 0x080c, 0x4bb0, 0x001e, 0xa094, 0x0010, 0xa285, 0x0080, -- 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, -- 0x2091, 0x8000, 0x2011, 0xb7ea, 0x2013, 0x0000, 0x7087, 0x0000, -- 0x012e, 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, -- 0x7d72, 0x2009, 0x07d0, 0x2011, 0x4add, 0x080c, 0x6a23, 0x0005, -- 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2011, 0x0003, -- 0x080c, 0x8076, 0x2011, 0x0002, 0x080c, 0x8080, 0x080c, 0x7f5a, -- 0x0036, 0x2019, 0x0000, 0x080c, 0x7fe5, 0x003e, 0x2009, 0x00f7, -- 0x080c, 0x4bb0, 0x2061, 0xb7f3, 0x601b, 0x0000, 0x601f, 0x0000, -- 0x2061, 0xb500, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, -- 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4b55, 0x080c, 0x6991, -- 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, -- 0x2091, 0x8000, 0x2071, 0x0100, 0x080c, 0x7d7b, 0x2071, 0x0140, -- 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, -- 0x080c, 0x5ad8, 0x01a8, 0x080c, 0x5af6, 0x1190, 0x2001, 0xb79e, -- 0x2003, 0xaaaa, 0x0016, 0x080c, 0x28eb, 0x2001, 0xb78f, 0x2102, -- 0x001e, 0x2001, 0xb79f, 0x2003, 0x0000, 0x080c, 0x5a08, 0x0030, -- 0x2001, 0x0001, 0x080c, 0x27c3, 0x080c, 0x4b20, 0x012e, 0x000e, -- 0x00ee, 0x0005, 0x20a9, 0x0040, 0x20a1, 0xbcc0, 0x2099, 0xbb8e, -- 0x3304, 0x8007, 0x20a2, 0x9398, 0x94a0, 0x1f04, 0x4b90, 0x0005, -- 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, 0xbb00, 0x20a1, 0x020b, -- 0x20a9, 0x000c, 0x53a6, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, -- 0x2099, 0xbb80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, -- 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0xb531, 0x2004, -- 0xa005, 0x1138, 0x2001, 0xb515, 0x2004, 0xa084, 0x00ff, 0xa105, -- 0x0010, 0xa185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, -- 0x0046, 0x2001, 0xb553, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, -- 0x2009, 0x002a, 0x080c, 0xb0dc, 0x2001, 0xb50c, 0x200c, 0xc195, -- 0x2102, 0x2019, 0x002a, 0x2009, 0x0000, 0x080c, 0x2c6f, 0x004e, -- 0x001e, 0x0005, 0x080c, 0x4b20, 0x708f, 0x0000, 0x7087, 0x0000, -- 0x0005, 0x0006, 0x2001, 0xb50c, 0x2004, 0xd09c, 0x0100, 0x000e, -- 0x0005, 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, -- 0x200c, 0xa18d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, -- 0x0156, 0x20a9, 0x00ff, 0x2009, 0xb635, 0xa006, 0x200a, 0x8108, -- 0x1f04, 0x4c06, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, -- 0x0146, 0x2069, 0xb552, 0xa006, 0x6002, 0x6007, 0x0707, 0x600a, -- 0x600e, 0x6012, 0xa198, 0x2dc4, 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, 0x160f, 0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0110, -- 0x080c, 0x160f, 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, 0x4d1b, -- 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x4d20, 0x2001, -- 0xb50c, 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, 0xb50c, 0x2004, -- 0xd084, 0x1904, 0x4d03, 0xa188, 0xb635, 0x2104, 0xa065, 0x0904, -- 0x4d03, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904, 0x4d03, -- 0x6000, 0xd0c4, 0x0904, 0x4d03, 0x0068, 0xa188, 0xb635, 0x2104, -- 0xa065, 0x0904, 0x4ce7, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, -- 0x1904, 0x4cec, 0x60a4, 0xa00d, 0x0118, 0x080c, 0x51d5, 0x05d0, -- 0x60a8, 0xa00d, 0x0188, 0x080c, 0x5220, 0x1170, 0x694c, 0xd1fc, -- 0x1118, 0x080c, 0x4edf, 0x0448, 0x080c, 0x4e8e, 0x694c, 0xd1ec, -- 0x1520, 0x080c, 0x50c7, 0x0408, 0x694c, 0xa184, 0xa000, 0x0178, -- 0xd1ec, 0x0140, 0xd1fc, 0x0118, 0x080c, 0x50d6, 0x0028, 0x080c, -- 0x50d6, 0x0028, 0xd1fc, 0x0118, 0x080c, 0x4e8e, 0x0070, 0x6050, -- 0xa00d, 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0028, -- 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, 0x6cab, 0xa006, -- 0x012e, 0x0005, 0x2001, 0x0005, 0x2009, 0x0000, 0x04e8, 0x2001, -- 0x0028, 0x2009, 0x0000, 0x04c0, 0xa082, 0x0006, 0x12a0, 0x2001, -- 0xb535, 0x2004, 0xd0ac, 0x1160, 0x60a0, 0xd0bc, 0x1148, 0x6100, -- 0xd1fc, 0x0904, 0x4ca2, 0x2001, 0x0029, 0x2009, 0x1000, 0x0420, -- 0x2001, 0x0028, 0x00a8, 0x2009, 0xb50c, 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, 0x4d7a, 0xa188, 0xb635, 0x2104, 0xa065, -- 0x01c0, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x11a8, 0x2c70, -- 0x080c, 0x85c1, 0x05e8, 0x2e00, 0x601a, 0x2d00, 0x6012, 0x600b, -- 0xffff, 0x601f, 0x000a, 0x2009, 0x0003, 0x080c, 0x8646, 0xa006, -- 0x0460, 0x2001, 0x0028, 0x0440, 0xa082, 0x0006, 0x1298, 0x2001, -- 0xb535, 0x2004, 0xd0ac, 0x1158, 0x60a0, 0xd0bc, 0x1140, 0x6100, -- 0xd1fc, 0x09e8, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, -- 0x0028, 0x0090, 0x2009, 0xb50c, 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, 0xb500, 0x6944, 0xa18c, 0xff00, 0x810f, -- 0xa182, 0x00ff, 0x1a04, 0x4e45, 0x080c, 0x4faa, 0x11a0, 0x6004, -- 0xa084, 0x00ff, 0xa082, 0x0006, 0x1270, 0x6864, 0xa0c6, 0x006f, -- 0x0150, 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1904, 0x4e2e, 0x60a0, -- 0xd0bc, 0x1904, 0x4e2e, 0x6864, 0xa0c6, 0x006f, 0x0118, 0x2008, -- 0x0804, 0x4df7, 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, 0x3dc4, 0x2c70, 0x0550, 0x2009, 0x0000, 0x2011, -- 0x0000, 0xa0c6, 0x4000, 0x1160, 0x0006, 0x2e60, 0x080c, 0x524b, -- 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, -- 0x85c1, 0x1138, 0x2001, 0x4005, 0x2009, 0x0003, 0x2011, 0x0000, -- 0x0c80, 0x2e00, 0x601a, 0x080c, 0xa021, 0x2d00, 0x6012, 0x601f, -- 0x0001, 0x6838, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091, -- 0x8000, 0x080c, 0x2c9c, 0x012e, 0x2001, 0x0000, 0x080c, 0x4eec, -- 0x2001, 0x0002, 0x080c, 0x4efe, 0x2009, 0x0002, 0x080c, 0x8646, -- 0xa006, 0xa005, 0x012e, 0x00ee, 0x00fe, 0x0005, 0x2001, 0x0028, -- 0x2009, 0x0000, 0x0cb0, 0x2009, 0xb50c, 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, -- 0xb635, 0x2104, 0xa065, 0x01b8, 0x6004, 0xa084, 0x00ff, 0xa08e, -- 0x0006, 0x11b0, 0x684c, 0xd0ec, 0x0120, 0x080c, 0x50d6, 0x0431, -- 0x0030, 0x0421, 0x684c, 0xd0fc, 0x0110, 0x080c, 0x50c7, 0x080c, -- 0x5114, 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, 0xb7e0, 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, 0xb553, 0x2004, 0xd0a4, -- 0x0140, 0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x1110, 0x2011, -- 0x0600, 0x000e, 0xa294, 0xff00, 0xa215, 0x6206, 0x0006, 0xa086, -- 0x0006, 0x1128, 0x6290, 0x82ff, 0x1110, 0x080c, 0x1515, 0x000e, -- 0x00ce, 0x012e, 0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6218, -- 0x2260, 0x6204, 0x0006, 0xa086, 0x0006, 0x1178, 0x609c, 0xd0a4, -- 0x0160, 0x2001, 0xb553, 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, 0xb635, 0x2204, -- 0xa065, 0x1180, 0x0016, 0x00d6, 0x080c, 0x15df, 0x2d60, 0x00de, -- 0x001e, 0x0d80, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, 0x0000, -- 0x080c, 0x4c0c, 0xa006, 0x002e, 0x0005, 0x0126, 0x2091, 0x8000, -- 0x0026, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x0480, 0x00d6, -- 0xa190, 0xb635, 0x2204, 0xa06d, 0x0540, 0x2013, 0x0000, 0x00d6, -- 0x00c6, 0x2d60, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x160f, 0x60a8, -- 0xa06d, 0x0110, 0x080c, 0x160f, 0x00ce, 0x00de, 0x00d6, 0x00c6, -- 0x68ac, 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6010, 0x2068, -- 0x080c, 0x9c54, 0x0110, 0x080c, 0x161f, 0x080c, 0x8617, 0x00ce, -- 0x0c88, 0x00ce, 0x00de, 0x080c, 0x160f, 0x00de, 0xa006, 0x002e, -- 0x012e, 0x0005, 0x0016, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, -- 0x0030, 0xa188, 0xb635, 0x2104, 0xa065, 0x0dc0, 0xa006, 0x001e, -- 0x0005, 0x00d6, 0x0156, 0x0136, 0x0146, 0x600b, 0x0000, 0x600f, -- 0x0000, 0x6000, 0xc08c, 0x6002, 0x080c, 0x5ad0, 0x1558, 0x60a0, -- 0xa086, 0x007e, 0x2069, 0xbb90, 0x0130, 0x2001, 0xb535, 0x2004, -- 0xd0ac, 0x1500, 0x0098, 0x2d04, 0xd0e4, 0x01e0, 0x00d6, 0x2069, -- 0xbb8e, 0x00c6, 0x2061, 0xb7b2, 0x6810, 0x2062, 0x6814, 0x6006, -- 0x6818, 0x600a, 0x681c, 0x600e, 0x00ce, 0x00de, 0x8d69, 0x2d04, -- 0x2069, 0x0140, 0xa005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069, -- 0xb500, 0x68a6, 0x2069, 0xbb8e, 0x6808, 0x605e, 0x6810, 0x6062, -- 0x6138, 0xa10a, 0x0208, 0x603a, 0x6814, 0x6066, 0x2099, 0xbb96, -- 0xac88, 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xbb9a, -- 0xac88, 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xbbae, -- 0x6808, 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076, -- 0x60a0, 0xa086, 0x007e, 0x1120, 0x2069, 0xbb8e, 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, -- 0xbb8d, 0x2e04, 0x6896, 0x2071, 0xbb8e, 0x7004, 0x689a, 0x701c, -- 0x689e, 0x6a00, 0x2009, 0xb572, 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, -- 0x5082, 0x080c, 0x1515, 0x260a, 0x8210, 0x6a06, 0x0098, 0x080c, -- 0x15f8, 0x01a8, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88, 0x0004, -- 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x509a, 0x6807, -- 0x0001, 0x6e12, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006, -- 0x0cd8, 0x0126, 0x2091, 0x8000, 0x00d6, 0x60a4, 0xa00d, 0x01a0, -- 0x2168, 0x6800, 0xa005, 0x1160, 0x080c, 0x51d5, 0x1168, 0x200b, -- 0xffff, 0x6804, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6806, 0x0020, -- 0x080c, 0x160f, 0x60a7, 0x0000, 0x00de, 0x012e, 0x0005, 0x0126, -- 0x2091, 0x8000, 0x080c, 0x5233, 0x0010, 0x080c, 0x4e8e, 0x080c, -- 0x514d, 0x1dd8, 0x080c, 0x5114, 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, 0x50e8, 0x080c, -- 0x1515, 0x260a, 0x8210, 0x6a56, 0x0098, 0x080c, 0x15f8, 0x01d0, -- 0x2d00, 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, -- 0x200b, 0xffff, 0x8108, 0x1f04, 0x5100, 0x6857, 0x0001, 0x6e62, -- 0x0010, 0x080c, 0x4edf, 0x0089, 0x1de0, 0xa085, 0x0001, 0x012e, -- 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x6cab, 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, 0x811f, 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, 0x51cf, 0x1110, 0x2011, 0x0001, -- 0x080c, 0x521a, 0x1110, 0xa295, 0x0002, 0x0005, 0x080c, 0x524b, -- 0x0118, 0x080c, 0x9d09, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, -- 0x524b, 0x0118, 0x080c, 0x9c99, 0x0010, 0xa085, 0x0001, 0x0005, -- 0x080c, 0x524b, 0x0118, 0x080c, 0x9cec, 0x0010, 0xa085, 0x0001, -- 0x0005, 0x080c, 0x524b, 0x0118, 0x080c, 0x9cb5, 0x0010, 0xa085, -- 0x0001, 0x0005, 0x080c, 0x524b, 0x0118, 0x080c, 0x9d25, 0x0010, -- 0xa085, 0x0001, 0x0005, 0x0126, 0x0006, 0x00d6, 0x2091, 0x8000, -- 0x6080, 0xa06d, 0x01a0, 0x6800, 0x0006, 0x6837, 0x0103, 0x6b4a, -- 0x6847, 0x0000, 0x080c, 0x9ec6, 0x0006, 0x6000, 0xd0fc, 0x0110, -- 0x080c, 0xb37d, 0x000e, 0x080c, 0x5409, 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, 0x51de, 0xa085, 0x0001, 0x0008, 0xa006, -- 0x00ee, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d, -- 0x1128, 0x080c, 0x15f8, 0x01a0, 0x2d00, 0x60a6, 0x6803, 0x0001, -- 0x6807, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, -- 0x8108, 0x1f04, 0x51fe, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, -- 0xa006, 0x0cd8, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d, -- 0x0130, 0x60a7, 0x0000, 0x080c, 0x160f, 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, 0x5229, 0xa085, -- 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x0c19, 0x1188, -- 0x200b, 0xffff, 0x00d6, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, -- 0x0218, 0x8001, 0x6856, 0x0020, 0x080c, 0x160f, 0x60ab, 0x0000, -- 0x00de, 0x012e, 0x0005, 0x609c, 0xd0a4, 0x0005, 0x00f6, 0x080c, -- 0x5ad0, 0x01b0, 0x71b8, 0x81ff, 0x1198, 0x71d4, 0xd19c, 0x0180, -- 0x2001, 0x007e, 0xa080, 0xb635, 0x2004, 0xa07d, 0x0148, 0x7804, -- 0xa084, 0x00ff, 0xa086, 0x0006, 0x1118, 0x7800, 0xc0ed, 0x7802, -- 0x2079, 0xb552, 0x7804, 0xd0a4, 0x01e8, 0x0156, 0x00c6, 0x20a9, -- 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x4faa, 0x1168, 0x6004, -- 0xa084, 0xff00, 0x8007, 0xa096, 0x0004, 0x0118, 0xa086, 0x0006, -- 0x1118, 0x6000, 0xc0ed, 0x6002, 0x001e, 0x8108, 0x1f04, 0x5273, -- 0x00ce, 0x015e, 0x080c, 0x530a, 0x0120, 0x2001, 0xb7b5, 0x200c, -- 0x0038, 0x2079, 0xb552, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, -- 0x2011, 0x529e, 0x080c, 0x6a23, 0x00fe, 0x0005, 0x2011, 0x529e, -- 0x080c, 0x699d, 0x080c, 0x530a, 0x01f0, 0x2001, 0xb6b3, 0x2004, -- 0xa080, 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xb553, 0x2004, -- 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, 0x529e, 0x080c, 0x6a23, -- 0x00e6, 0x2071, 0xb500, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c, -- 0x2ab8, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, -- 0x0000, 0x0016, 0x080c, 0x4faa, 0x1530, 0x6000, 0xd0ec, 0x0518, -- 0x0046, 0x62a0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, -- 0x080c, 0xb0dc, 0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, -- 0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, 0x0029, 0x080c, 0x6df6, -- 0x0076, 0x2039, 0x0000, 0x080c, 0x6d03, 0x2009, 0x0000, 0x080c, -- 0xae76, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x52c9, 0x00ce, -- 0x015e, 0x0005, 0x00c6, 0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, -- 0x00ce, 0x0005, 0x7818, 0x2004, 0xd0ac, 0x0005, 0x7818, 0x2004, -- 0xd0bc, 0x0005, 0x00f6, 0x2001, 0xb6b3, 0x2004, 0xa07d, 0x0110, -- 0x7800, 0xd0ec, 0x00fe, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000, -- 0x0006, 0x62a0, 0xa290, 0xb635, 0x2204, 0xac06, 0x190c, 0x1515, -- 0x000e, 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0x6202, -- 0x002e, 0x012e, 0x0005, 0x2011, 0xb535, 0x2204, 0xd0cc, 0x0138, -- 0x2001, 0xb7b3, 0x200c, 0x2011, 0x5338, 0x080c, 0x6a23, 0x0005, -- 0x2011, 0x5338, 0x080c, 0x699d, 0x2011, 0xb535, 0x2204, 0xc0cc, -- 0x2012, 0x0005, 0x2071, 0xb614, 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, 0xb77d, 0x7003, 0xb614, -- 0x7007, 0x0000, 0x700b, 0x0000, 0x700f, 0xb75d, 0x7013, 0x0020, -- 0x7017, 0x0040, 0x7037, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, -- 0xb735, 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, 0xb553, -- 0x2004, 0xd0fc, 0x1150, 0x2001, 0xb553, 0x2004, 0xa00e, 0xd09c, -- 0x0108, 0x8108, 0x7102, 0x0804, 0x53d3, 0x2001, 0xb572, 0x200c, -- 0xa184, 0x000f, 0x2009, 0xb573, 0x210c, 0x0002, 0x537b, 0x53ae, -- 0x53b5, 0x53bf, 0x53c4, 0x537b, 0x537b, 0x537b, 0x539e, 0x537b, -- 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, 0x537b, 0x7003, 0x0004, -- 0x0136, 0x0146, 0x0156, 0x2099, 0xb576, 0x20a1, 0xb786, 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, -- 0xb614, 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, 0x5462, -- 0x6804, 0xa00d, 0x0188, 0x00d6, 0x2071, 0xb500, 0xa016, 0x702c, -- 0x2168, 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, -- 0x70b4, 0xa200, 0x70b6, 0x00de, 0x2071, 0xb614, 0x701c, 0xa005, -- 0x1904, 0x5472, 0x20a9, 0x0032, 0x0f04, 0x5470, 0x0e04, 0x542c, -- 0x2071, 0xb735, 0x7200, 0x82ff, 0x05d8, 0x6934, 0xa186, 0x0103, -- 0x1904, 0x5480, 0x6948, 0x6844, 0xa105, 0x1540, 0x2009, 0x8020, -- 0x2200, 0x0002, 0x5470, 0x5447, 0x5498, 0x54a4, 0x5470, 0x2071, -- 0x0000, 0x20a9, 0x0032, 0x0f04, 0x5470, 0x7018, 0xd084, 0x1dd8, -- 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, -- 0x4080, 0x2071, 0xb500, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70b4, -- 0x8000, 0x70b6, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844, 0xa086, -- 0x0100, 0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020, 0x0880, -- 0x2071, 0xb614, 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, 0x5440, -- 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, 0x5459, 0x718c, -- 0x7084, 0xa10a, 0x0a04, 0x5459, 0x2071, 0x0000, 0x7018, 0xd084, -- 0x1904, 0x5459, 0x2071, 0xb735, 0x7000, 0xa086, 0x0002, 0x1150, -- 0x080c, 0x5723, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, -- 0x0804, 0x5459, 0x080c, 0x574d, 0x2071, 0x0000, 0x701b, 0x0001, -- 0x2091, 0x4080, 0x0804, 0x5459, 0x0006, 0x684c, 0x0006, 0x6837, -- 0x0103, 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, -- 0x40a4, 0x000e, 0xa084, 0x00ff, 0x684e, 0x000e, 0x684a, 0x6952, -- 0x0005, 0x2071, 0xb614, 0x7004, 0x0002, 0x54ff, 0x5510, 0x570e, -- 0x570f, 0x571c, 0x5722, 0x5500, 0x56ff, 0x5695, 0x56eb, 0x0005, -- 0x0126, 0x2091, 0x8000, 0x0e04, 0x550f, 0x2009, 0x000d, 0x7030, -- 0x200a, 0x2091, 0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x012e, -- 0x2069, 0xb7f3, 0x683c, 0xa005, 0x03f8, 0x11f0, 0x0126, 0x2091, -- 0x8000, 0x2069, 0x0000, 0x6934, 0x2001, 0xb620, 0x2004, 0xa10a, -- 0x0170, 0x0e04, 0x5533, 0x2069, 0x0000, 0x6818, 0xd084, 0x1158, -- 0x2009, 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x2069, -- 0xb7f3, 0x683f, 0xffff, 0x012e, 0x2069, 0xb500, 0x6848, 0x6968, -- 0xa102, 0x2069, 0xb735, 0x688a, 0x6984, 0x701c, 0xa06d, 0x0120, -- 0x81ff, 0x0904, 0x5589, 0x00a0, 0x81ff, 0x0904, 0x564f, 0x2071, -- 0xb735, 0x7184, 0x7088, 0xa10a, 0x1258, 0x7190, 0x2071, 0xb7f3, -- 0x7038, 0xa005, 0x0128, 0x1b04, 0x564f, 0x713a, 0x0804, 0x564f, -- 0x2071, 0xb735, 0x718c, 0x0126, 0x2091, 0x8000, 0x7084, 0xa10a, -- 0x0a04, 0x566a, 0x0e04, 0x560b, 0x2071, 0x0000, 0x7018, 0xd084, -- 0x1904, 0x560b, 0x2001, 0xffff, 0x2071, 0xb7f3, 0x703a, 0x2071, -- 0xb735, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, 0x5723, 0x2071, -- 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x560b, 0x080c, -- 0x574d, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, -- 0x560b, 0x2071, 0xb735, 0x7000, 0xa005, 0x0904, 0x5631, 0x6934, -- 0xa186, 0x0103, 0x1904, 0x560e, 0x684c, 0xd0bc, 0x1904, 0x5631, -- 0x6948, 0x6844, 0xa105, 0x1904, 0x5626, 0x2009, 0x8020, 0x2071, -- 0xb735, 0x7000, 0x0002, 0x5631, 0x55f1, 0x55c9, 0x55db, 0x55a8, -- 0x0136, 0x0146, 0x0156, 0x2099, 0xb576, 0x20a1, 0xb786, 0x20a9, -- 0x0004, 0x53a3, 0x015e, 0x014e, 0x013e, 0x2071, 0xb77d, 0xad80, -- 0x000f, 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000, -- 0x2e10, 0x080c, 0x1643, 0x2071, 0xb614, 0x7007, 0x0009, 0x0804, -- 0x564f, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x564f, 0xae90, -- 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xb614, 0x080c, -- 0x57a4, 0x0804, 0x564f, 0x7084, 0x8008, 0xa092, 0x000f, 0x1a04, -- 0x564f, 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210, -- 0x6840, 0x2012, 0x7186, 0x2071, 0xb614, 0x080c, 0x57a4, 0x0804, -- 0x564f, 0x0126, 0x2091, 0x8000, 0x0e04, 0x560b, 0x2071, 0x0000, -- 0x7018, 0xd084, 0x1180, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, -- 0x701b, 0x0001, 0x2091, 0x4080, 0x012e, 0x2071, 0xb614, 0x080c, -- 0x57a4, 0x0804, 0x564f, 0x012e, 0x0804, 0x564f, 0xa18c, 0x00ff, -- 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, 0x0118, 0xa18e, 0x001f, -- 0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, 0xa084, 0x00ff, 0xa086, -- 0x0001, 0x1178, 0x2009, 0x8021, 0x0804, 0x559f, 0x6844, 0xa086, -- 0x0100, 0x1138, 0x6868, 0xa005, 0x1120, 0x2009, 0x8020, 0x0804, -- 0x559f, 0x2071, 0xb614, 0x080c, 0x57b6, 0x01c8, 0x2071, 0xb614, -- 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, 0x1130, -- 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x7007, 0x0003, -- 0x080c, 0x57cf, 0x7050, 0xa086, 0x0100, 0x0904, 0x570f, 0x0126, -- 0x2091, 0x8000, 0x2071, 0xb614, 0x7008, 0xa086, 0x0001, 0x1180, -- 0x0e04, 0x5668, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, 0x4080, -- 0x700b, 0x0000, 0x7004, 0xa086, 0x0006, 0x1110, 0x7007, 0x0001, -- 0x012e, 0x0005, 0x2071, 0xb614, 0x080c, 0x57b6, 0x0518, 0x2071, -- 0xb735, 0x7084, 0x700a, 0x20a9, 0x0020, 0x2099, 0xb736, 0x20a1, -- 0xb75d, 0x53a3, 0x7087, 0x0000, 0x2071, 0xb614, 0x2069, 0xb77d, -- 0x706c, 0x6826, 0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832, -- 0x2d10, 0x080c, 0x1643, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071, -- 0xb7f3, 0x703a, 0x012e, 0x0804, 0x564f, 0x2069, 0xb77d, 0x6808, -- 0xa08e, 0x0000, 0x0904, 0x56ea, 0xa08e, 0x0200, 0x0904, 0x56e8, -- 0xa08e, 0x0100, 0x1904, 0x56ea, 0x0126, 0x2091, 0x8000, 0x0e04, -- 0x56e6, 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, 0xb75a, -- 0x2004, 0xa005, 0x1190, 0x6934, 0x2069, 0xb735, 0x689c, 0x699e, -- 0x2069, 0xb7f3, 0xa102, 0x1118, 0x683c, 0xa005, 0x1368, 0x2001, -- 0xb75b, 0x200c, 0x810d, 0x693e, 0x0038, 0x2009, 0x8040, 0x6922, -- 0x681b, 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x012e, 0x0010, -- 0x7007, 0x0005, 0x0005, 0x2001, 0xb77f, 0x2004, 0xa08e, 0x0100, -- 0x1128, 0x7007, 0x0001, 0x080c, 0x57a4, 0x0005, 0xa08e, 0x0000, -- 0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, 0x0005, 0x0005, 0x701c, -- 0xa06d, 0x0158, 0x080c, 0x57b6, 0x0140, 0x7007, 0x0003, 0x080c, -- 0x57cf, 0x7050, 0xa086, 0x0100, 0x0110, 0x0005, 0x0005, 0x7050, -- 0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, 0x0030, 0xa086, 0x0200, -- 0x1110, 0x7007, 0x0005, 0x0005, 0x080c, 0x5772, 0x7006, 0x080c, -- 0x57a4, 0x0005, 0x0005, 0x00e6, 0x0156, 0x2071, 0xb735, 0x7184, -- 0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, 0x0000, -- 0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, 0x5747, 0x2014, 0x722a, -- 0x8000, 0x0f04, 0x5747, 0x2014, 0x722e, 0x8000, 0x0f04, 0x5747, -- 0x2014, 0x723a, 0x8000, 0x0f04, 0x5747, 0x2014, 0x723e, 0xa180, -- 0x8030, 0x7022, 0x015e, 0x00ee, 0x0005, 0x00e6, 0x0156, 0x2071, -- 0xb735, 0x7184, 0x81ff, 0x01d8, 0xa006, 0x7086, 0xae80, 0x0003, -- 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x2014, 0x722a, -- 0x8000, 0x0f04, 0x5769, 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, 0x579e, -- 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, 0x160f, 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, 0xb812, 0x2104, 0xc08d, 0x200a, 0x012e, 0x080c, -- 0x165f, 0x0005, 0x708c, 0xa08a, 0x0029, 0x1220, 0xa082, 0x001d, -- 0x0033, 0x0010, 0x080c, 0x1515, 0x6027, 0x1e00, 0x0005, 0x58dd, -- 0x5858, 0x5870, 0x58ad, 0x58ce, 0x5908, 0x591a, 0x5870, 0x58f4, -- 0x57fc, 0x582a, 0x57fb, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, -- 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, -- 0xb7c5, 0x2d04, 0x7002, 0x080c, 0x5bd2, 0x6028, 0xa085, 0x0600, -- 0x602a, 0x00b0, 0x708f, 0x0028, 0x2069, 0xb7c5, 0x2d04, 0x7002, -- 0x6028, 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, -- 0x2071, 0xb823, 0x080c, 0x1dfe, 0x005e, 0x004e, 0x003e, 0x00ee, -- 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0xa005, 0x1180, -- 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, 0xb7c5, 0x2d04, -- 0x7002, 0x080c, 0x5c5f, 0x6028, 0xa085, 0x0600, 0x602a, 0x00b0, -- 0x708f, 0x0028, 0x2069, 0xb7c5, 0x2d04, 0x7002, 0x6028, 0xa085, -- 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0xb823, -- 0x080c, 0x1dfe, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, -- 0x6803, 0x0090, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x5985, 0xd1d4, -- 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x708f, 0x0020, 0x080c, -- 0x5985, 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, 0x5b00, 0x080c, 0x24b0, 0x0156, 0x6803, 0x0100, -- 0x20a9, 0x0014, 0x6804, 0xd0dc, 0x1118, 0x1f04, 0x588a, 0x0048, -- 0x20a9, 0x0014, 0x6803, 0x0080, 0x6804, 0xd0d4, 0x1130, 0x1f04, -- 0x5894, 0x080c, 0x5b21, 0x015e, 0x0078, 0x015e, 0x708f, 0x0028, -- 0x0058, 0x708f, 0x001e, 0x0040, 0x708f, 0x001d, 0x0028, 0x708f, -- 0x0020, 0x0010, 0x708f, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, -- 0xc0b4, 0x600e, 0x080c, 0x5b00, 0x080c, 0x24b0, 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, 0x1e47, 0x708f, -- 0x001e, 0x0010, 0x708f, 0x001d, 0x0005, 0x080c, 0x59f7, 0x6124, -- 0xd1dc, 0x1188, 0x080c, 0x5985, 0x0016, 0x080c, 0x1e47, 0x001e, -- 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x708f, 0x001e, 0x0020, 0x708f, -- 0x001f, 0x080c, 0x5985, 0x0005, 0x6803, 0x00a0, 0x6124, 0xd1d4, -- 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x708f, -- 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x0021, 0x0005, -- 0x080c, 0x59f7, 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, 0xb500, 0x2091, 0x8000, 0x080c, 0x5ad0, -- 0x11e8, 0x2001, 0xb50c, 0x200c, 0xd1b4, 0x01c0, 0xc1b4, 0x2102, -- 0x6027, 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc, 0x0158, 0x6803, -- 0x00a0, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, -- 0x0001, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x5aec, -- 0x0150, 0x080c, 0x5ae2, 0x1138, 0x2001, 0x0001, 0x080c, 0x27c3, -- 0x080c, 0x5aa7, 0x00a0, 0x080c, 0x59f4, 0x0178, 0x2001, 0x0001, -- 0x080c, 0x27c3, 0x708c, 0xa086, 0x001e, 0x0120, 0x708c, 0xa086, -- 0x0022, 0x1118, 0x708f, 0x0025, 0x0010, 0x708f, 0x0021, 0x012e, -- 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x5996, -- 0x080c, 0x6a5d, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, -- 0x5996, 0x080c, 0x6a54, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, -- 0x0016, 0x080c, 0x7d7b, 0x2071, 0xb500, 0x080c, 0x5931, 0x001e, -- 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, -- 0x00e6, 0x00f6, 0x0126, 0x080c, 0x7d7b, 0x2061, 0x0100, 0x2069, -- 0x0140, 0x2071, 0xb500, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, -- 0x2011, 0x0003, 0x080c, 0x8076, 0x2011, 0x0002, 0x080c, 0x8080, -- 0x080c, 0x7f5a, 0x080c, 0x6a11, 0x0036, 0x2019, 0x0000, 0x080c, -- 0x7fe5, 0x003e, 0x60e3, 0x0000, 0x080c, 0xb423, 0x080c, 0xb43e, -- 0x2001, 0xb500, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, 0x12dd, -- 0x2001, 0x0001, 0x080c, 0x27c3, 0x012e, 0x00fe, 0x00ee, 0x00de, -- 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x2001, 0xb500, 0x2004, -- 0xa086, 0x0004, 0x0140, 0x2001, 0xb79e, 0x2003, 0xaaaa, 0x2001, -- 0xb79f, 0x2003, 0x0000, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, -- 0xa086, 0x00c0, 0x0160, 0x6803, 0x00c0, 0x0156, 0x20a9, 0x002d, -- 0x1d04, 0x5a00, 0x2091, 0x6000, 0x1f04, 0x5a00, 0x015e, 0x0005, -- 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, -- 0xb500, 0x2001, 0xb79f, 0x200c, 0xa186, 0x0000, 0x0158, 0xa186, -- 0x0001, 0x0158, 0xa186, 0x0002, 0x0158, 0xa186, 0x0003, 0x0158, -- 0x0804, 0x5a95, 0x708f, 0x0022, 0x0040, 0x708f, 0x0021, 0x0028, -- 0x708f, 0x0023, 0x0020, 0x708f, 0x0024, 0x6043, 0x0000, 0x60e3, -- 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2872, 0x0026, -- 0x2011, 0x0003, 0x080c, 0x8076, 0x2011, 0x0002, 0x080c, 0x8080, -- 0x080c, 0x7f5a, 0x0036, 0x2019, 0x0000, 0x080c, 0x7fe5, 0x003e, -- 0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, -- 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, -- 0x6024, 0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, 0x5aa3, 0x6800, -- 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4, 0x1130, 0x6803, -- 0x0100, 0x1f04, 0x5a58, 0x080c, 0x5b21, 0x012e, 0x015e, 0x080c, -- 0x5ae2, 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, 0x0006, 0xa085, -- 0x0020, 0x6052, 0x080c, 0x5b21, 0xa006, 0x8001, 0x1df0, 0x000e, -- 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x5b21, 0x0016, -- 0x0026, 0x2009, 0x00c8, 0x2011, 0x59a3, 0x080c, 0x6a23, 0x002e, -- 0x001e, 0x2001, 0xb79f, 0x2003, 0x0004, 0x080c, 0x57e2, 0x080c, -- 0x5ae2, 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, 0x2001, -- 0xb79f, 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, -+ 0x0007, 0xa084, 0x03f8, 0x8004, 0x20a8, 0x53a6, 0x60c3, 0x0084, -+ 0x080c, 0x4b06, 0x0005, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, -+ 0xb553, 0x252c, 0x20a9, 0x0008, 0x2041, 0xbb0e, 0x28a0, 0x2099, -+ 0xbb8e, 0x53a3, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0110, -+ 0x2011, 0x0000, 0x2800, 0xa200, 0x200c, 0xa1a6, 0xffff, 0x1148, -+ 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x4a2a, 0x0804, -+ 0x4a98, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0xa1a6, 0x3fff, 0x0d90, -+ 0x0020, 0xa1a6, 0x3fff, 0x0904, 0x4a98, 0xa18d, 0xc000, 0x20a9, -+ 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, -+ 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, -+ 0x8319, 0x0008, 0x8318, 0x1f04, 0x4a50, 0x04d0, 0x23a8, 0x2021, -+ 0x0001, 0x8426, 0x8425, 0x1f04, 0x4a62, 0x2328, 0x8529, 0xa2be, -+ 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0xa73a, 0x000e, -+ 0x27a8, 0xa5a8, 0x0010, 0x1f04, 0x4a71, 0x7552, 0xa5c8, 0x2dc4, -+ 0x292d, 0xa5ac, 0x00ff, 0x7576, 0x6532, 0x6536, 0x0016, 0x2508, -+ 0x080c, 0x2847, 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, 0x1515, 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, 0x2dc4, 0x242d, 0xa5ac, 0x00ff, 0x7576, 0x6532, 0x6536, -+ 0x0016, 0x2508, 0x080c, 0x2847, 0x001e, 0x60e7, 0x0000, 0x65ea, -+ 0x707b, 0x0001, 0xa084, 0x0000, 0x0005, 0x00e6, 0x2071, 0xb500, -+ 0x707f, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, -+ 0x2071, 0x0140, 0x080c, 0x7d7a, 0x7004, 0xa084, 0x4000, 0x0120, -+ 0x7003, 0x1000, 0x7003, 0x0000, 0x0126, 0x2091, 0x8000, 0x2071, -+ 0xb523, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, -+ 0x080c, 0x4baf, 0x001e, 0xa094, 0x0010, 0xa285, 0x0080, 0x7842, -+ 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0x2011, 0xb7ea, 0x2013, 0x0000, 0x7087, 0x0000, 0x012e, -+ 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x7d71, -+ 0x2009, 0x07d0, 0x2011, 0x4adc, 0x080c, 0x6a22, 0x0005, 0x0016, -+ 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2011, 0x0003, 0x080c, -+ 0x8075, 0x2011, 0x0002, 0x080c, 0x807f, 0x080c, 0x7f59, 0x0036, -+ 0x2019, 0x0000, 0x080c, 0x7fe4, 0x003e, 0x2009, 0x00f7, 0x080c, -+ 0x4baf, 0x2061, 0xb7f3, 0x601b, 0x0000, 0x601f, 0x0000, 0x2061, -+ 0xb500, 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, -+ 0x0010, 0x2009, 0x002d, 0x2011, 0x4b54, 0x080c, 0x6990, 0x012e, -+ 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x0100, 0x080c, 0x7d7a, 0x2071, 0x0140, 0x7004, -+ 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, 0x0000, 0x080c, -+ 0x5ad7, 0x01a8, 0x080c, 0x5af5, 0x1190, 0x2001, 0xb79e, 0x2003, -+ 0xaaaa, 0x0016, 0x080c, 0x28eb, 0x2001, 0xb78f, 0x2102, 0x001e, -+ 0x2001, 0xb79f, 0x2003, 0x0000, 0x080c, 0x5a07, 0x0030, 0x2001, -+ 0x0001, 0x080c, 0x27c3, 0x080c, 0x4b1f, 0x012e, 0x000e, 0x00ee, -+ 0x0005, 0x20a9, 0x0040, 0x20a1, 0xbcc0, 0x2099, 0xbb8e, 0x3304, -+ 0x8007, 0x20a2, 0x9398, 0x94a0, 0x1f04, 0x4b8f, 0x0005, 0x20e1, -+ 0x9080, 0x20e1, 0x4000, 0x2099, 0xbb00, 0x20a1, 0x020b, 0x20a9, -+ 0x000c, 0x53a6, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x2099, -+ 0xbb80, 0x20a1, 0x020b, 0x20a9, 0x000c, 0x53a6, 0x0005, 0x00c6, -+ 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0xb531, 0x2004, 0xa005, -+ 0x1138, 0x2001, 0xb515, 0x2004, 0xa084, 0x00ff, 0xa105, 0x0010, -+ 0xa185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, -+ 0x2001, 0xb553, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, -+ 0x002a, 0x080c, 0xb0e8, 0x2001, 0xb50c, 0x200c, 0xc195, 0x2102, -+ 0x2019, 0x002a, 0x2009, 0x0000, 0x080c, 0x2c6f, 0x004e, 0x001e, -+ 0x0005, 0x080c, 0x4b1f, 0x708f, 0x0000, 0x7087, 0x0000, 0x0005, -+ 0x0006, 0x2001, 0xb50c, 0x2004, 0xd09c, 0x0100, 0x000e, 0x0005, -+ 0x0006, 0x0016, 0x0126, 0x2091, 0x8000, 0x2001, 0x0101, 0x200c, -+ 0xa18d, 0x0006, 0x2102, 0x012e, 0x001e, 0x000e, 0x0005, 0x0156, -+ 0x20a9, 0x00ff, 0x2009, 0xb635, 0xa006, 0x200a, 0x8108, 0x1f04, -+ 0x4c05, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, -+ 0x2069, 0xb552, 0xa006, 0x6002, 0x6007, 0x0707, 0x600a, 0x600e, -+ 0x6012, 0xa198, 0x2dc4, 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, 0x160f, 0x60a7, 0x0000, 0x60a8, 0xa06d, 0x0110, 0x080c, -+ 0x160f, 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, 0x4d1a, 0xa18c, -+ 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, 0x4d1f, 0x2001, 0xb50c, -+ 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, 0xb50c, 0x2004, 0xd084, -+ 0x1904, 0x4d02, 0xa188, 0xb635, 0x2104, 0xa065, 0x0904, 0x4d02, -+ 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904, 0x4d02, 0x6000, -+ 0xd0c4, 0x0904, 0x4d02, 0x0068, 0xa188, 0xb635, 0x2104, 0xa065, -+ 0x0904, 0x4ce6, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x1904, -+ 0x4ceb, 0x60a4, 0xa00d, 0x0118, 0x080c, 0x51d4, 0x05d0, 0x60a8, -+ 0xa00d, 0x0188, 0x080c, 0x521f, 0x1170, 0x694c, 0xd1fc, 0x1118, -+ 0x080c, 0x4ede, 0x0448, 0x080c, 0x4e8d, 0x694c, 0xd1ec, 0x1520, -+ 0x080c, 0x50c6, 0x0408, 0x694c, 0xa184, 0xa000, 0x0178, 0xd1ec, -+ 0x0140, 0xd1fc, 0x0118, 0x080c, 0x50d5, 0x0028, 0x080c, 0x50d5, -+ 0x0028, 0xd1fc, 0x0118, 0x080c, 0x4e8d, 0x0070, 0x6050, 0xa00d, -+ 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, 0x6052, 0x0028, 0x2d00, -+ 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, 0x6caa, 0xa006, 0x012e, -+ 0x0005, 0x2001, 0x0005, 0x2009, 0x0000, 0x04e8, 0x2001, 0x0028, -+ 0x2009, 0x0000, 0x04c0, 0xa082, 0x0006, 0x12a0, 0x2001, 0xb535, -+ 0x2004, 0xd0ac, 0x1160, 0x60a0, 0xd0bc, 0x1148, 0x6100, 0xd1fc, -+ 0x0904, 0x4ca1, 0x2001, 0x0029, 0x2009, 0x1000, 0x0420, 0x2001, -+ 0x0028, 0x00a8, 0x2009, 0xb50c, 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, 0x4d79, 0xa188, 0xb635, 0x2104, 0xa065, 0x01c0, -+ 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, 0x11a8, 0x2c70, 0x080c, -+ 0x85c7, 0x05e8, 0x2e00, 0x601a, 0x2d00, 0x6012, 0x600b, 0xffff, -+ 0x601f, 0x000a, 0x2009, 0x0003, 0x080c, 0x864c, 0xa006, 0x0460, -+ 0x2001, 0x0028, 0x0440, 0xa082, 0x0006, 0x1298, 0x2001, 0xb535, -+ 0x2004, 0xd0ac, 0x1158, 0x60a0, 0xd0bc, 0x1140, 0x6100, 0xd1fc, -+ 0x09e8, 0x2001, 0x0029, 0x2009, 0x1000, 0x00a8, 0x2001, 0x0028, -+ 0x0090, 0x2009, 0xb50c, 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, 0xb500, 0x6944, 0xa18c, 0xff00, 0x810f, 0xa182, -+ 0x00ff, 0x1a04, 0x4e44, 0x080c, 0x4fa9, 0x11a0, 0x6004, 0xa084, -+ 0x00ff, 0xa082, 0x0006, 0x1270, 0x6864, 0xa0c6, 0x006f, 0x0150, -+ 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1904, 0x4e2d, 0x60a0, 0xd0bc, -+ 0x1904, 0x4e2d, 0x6864, 0xa0c6, 0x006f, 0x0118, 0x2008, 0x0804, -+ 0x4df6, 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, 0x3dc5, 0x2c70, 0x0550, 0x2009, 0x0000, 0x2011, 0x0000, -+ 0xa0c6, 0x4000, 0x1160, 0x0006, 0x2e60, 0x080c, 0x524a, 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, 0x85c7, -+ 0x1138, 0x2001, 0x4005, 0x2009, 0x0003, 0x2011, 0x0000, 0x0c80, -+ 0x2e00, 0x601a, 0x080c, 0xa027, 0x2d00, 0x6012, 0x601f, 0x0001, -+ 0x6838, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x2c9c, 0x012e, 0x2001, 0x0000, 0x080c, 0x4eeb, 0x2001, -+ 0x0002, 0x080c, 0x4efd, 0x2009, 0x0002, 0x080c, 0x864c, 0xa006, -+ 0xa005, 0x012e, 0x00ee, 0x00fe, 0x0005, 0x2001, 0x0028, 0x2009, -+ 0x0000, 0x0cb0, 0x2009, 0xb50c, 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, 0xb635, -+ 0x2104, 0xa065, 0x01b8, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, -+ 0x11b0, 0x684c, 0xd0ec, 0x0120, 0x080c, 0x50d5, 0x0431, 0x0030, -+ 0x0421, 0x684c, 0xd0fc, 0x0110, 0x080c, 0x50c6, 0x080c, 0x5113, -+ 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, -+ 0xb7e0, 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, 0xb553, 0x2004, 0xd0a4, 0x0140, -+ 0xa284, 0xff00, 0x8007, 0xa086, 0x0007, 0x1110, 0x2011, 0x0600, -+ 0x000e, 0xa294, 0xff00, 0xa215, 0x6206, 0x0006, 0xa086, 0x0006, -+ 0x1128, 0x6290, 0x82ff, 0x1110, 0x080c, 0x1515, 0x000e, 0x00ce, -+ 0x012e, 0x0005, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6218, 0x2260, -+ 0x6204, 0x0006, 0xa086, 0x0006, 0x1178, 0x609c, 0xd0a4, 0x0160, -+ 0x2001, 0xb553, 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, 0xb635, 0x2204, 0xa065, -+ 0x1180, 0x0016, 0x00d6, 0x080c, 0x15df, 0x2d60, 0x00de, 0x001e, -+ 0x0d80, 0x2c00, 0x2012, 0x60a7, 0x0000, 0x60ab, 0x0000, 0x080c, -+ 0x4c0b, 0xa006, 0x002e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0026, -+ 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x0480, 0x00d6, 0xa190, -+ 0xb635, 0x2204, 0xa06d, 0x0540, 0x2013, 0x0000, 0x00d6, 0x00c6, -+ 0x2d60, 0x60a4, 0xa06d, 0x0110, 0x080c, 0x160f, 0x60a8, 0xa06d, -+ 0x0110, 0x080c, 0x160f, 0x00ce, 0x00de, 0x00d6, 0x00c6, 0x68ac, -+ 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6010, 0x2068, 0x080c, -+ 0x9c5a, 0x0110, 0x080c, 0x161f, 0x080c, 0x861d, 0x00ce, 0x0c88, -+ 0x00ce, 0x00de, 0x080c, 0x160f, 0x00de, 0xa006, 0x002e, 0x012e, -+ 0x0005, 0x0016, 0xa182, 0x00ff, 0x0218, 0xa085, 0x0001, 0x0030, -+ 0xa188, 0xb635, 0x2104, 0xa065, 0x0dc0, 0xa006, 0x001e, 0x0005, -+ 0x00d6, 0x0156, 0x0136, 0x0146, 0x600b, 0x0000, 0x600f, 0x0000, -+ 0x6000, 0xc08c, 0x6002, 0x080c, 0x5acf, 0x1558, 0x60a0, 0xa086, -+ 0x007e, 0x2069, 0xbb90, 0x0130, 0x2001, 0xb535, 0x2004, 0xd0ac, -+ 0x1500, 0x0098, 0x2d04, 0xd0e4, 0x01e0, 0x00d6, 0x2069, 0xbb8e, -+ 0x00c6, 0x2061, 0xb7b2, 0x6810, 0x2062, 0x6814, 0x6006, 0x6818, -+ 0x600a, 0x681c, 0x600e, 0x00ce, 0x00de, 0x8d69, 0x2d04, 0x2069, -+ 0x0140, 0xa005, 0x1110, 0x2001, 0x0001, 0x6886, 0x2069, 0xb500, -+ 0x68a6, 0x2069, 0xbb8e, 0x6808, 0x605e, 0x6810, 0x6062, 0x6138, -+ 0xa10a, 0x0208, 0x603a, 0x6814, 0x6066, 0x2099, 0xbb96, 0xac88, -+ 0x000a, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2099, 0xbb9a, 0xac88, -+ 0x0006, 0x21a0, 0x20a9, 0x0004, 0x53a3, 0x2069, 0xbbae, 0x6808, -+ 0x606a, 0x690c, 0x616e, 0x6810, 0x6072, 0x6818, 0x6076, 0x60a0, -+ 0xa086, 0x007e, 0x1120, 0x2069, 0xbb8e, 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, 0xbb8d, -+ 0x2e04, 0x6896, 0x2071, 0xbb8e, 0x7004, 0x689a, 0x701c, 0x689e, -+ 0x6a00, 0x2009, 0xb572, 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, 0x5081, -+ 0x080c, 0x1515, 0x260a, 0x8210, 0x6a06, 0x0098, 0x080c, 0x15f8, -+ 0x01a8, 0x2d00, 0x60a6, 0x6803, 0x0000, 0xad88, 0x0004, 0x20a9, -+ 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, 0x5099, 0x6807, 0x0001, -+ 0x6e12, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, -+ 0x0126, 0x2091, 0x8000, 0x00d6, 0x60a4, 0xa00d, 0x01a0, 0x2168, -+ 0x6800, 0xa005, 0x1160, 0x080c, 0x51d4, 0x1168, 0x200b, 0xffff, -+ 0x6804, 0xa08a, 0x0002, 0x0218, 0x8001, 0x6806, 0x0020, 0x080c, -+ 0x160f, 0x60a7, 0x0000, 0x00de, 0x012e, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x5232, 0x0010, 0x080c, 0x4e8d, 0x080c, 0x514c, -+ 0x1dd8, 0x080c, 0x5113, 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, 0x50e7, 0x080c, 0x1515, -+ 0x260a, 0x8210, 0x6a56, 0x0098, 0x080c, 0x15f8, 0x01d0, 0x2d00, -+ 0x60aa, 0x6853, 0x0000, 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b, -+ 0xffff, 0x8108, 0x1f04, 0x50ff, 0x6857, 0x0001, 0x6e62, 0x0010, -+ 0x080c, 0x4ede, 0x0089, 0x1de0, 0xa085, 0x0001, 0x012e, 0x00de, -+ 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, 0x080c, 0x6caa, -+ 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, 0x811e, 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, 0x51ce, 0x1110, 0x2011, 0x0001, 0x080c, -+ 0x5219, 0x1110, 0xa295, 0x0002, 0x0005, 0x080c, 0x524a, 0x0118, -+ 0x080c, 0x9d0f, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x524a, -+ 0x0118, 0x080c, 0x9c9f, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, -+ 0x524a, 0x0118, 0x080c, 0x9cf2, 0x0010, 0xa085, 0x0001, 0x0005, -+ 0x080c, 0x524a, 0x0118, 0x080c, 0x9cbb, 0x0010, 0xa085, 0x0001, -+ 0x0005, 0x080c, 0x524a, 0x0118, 0x080c, 0x9d2b, 0x0010, 0xa085, -+ 0x0001, 0x0005, 0x0126, 0x0006, 0x00d6, 0x2091, 0x8000, 0x6080, -+ 0xa06d, 0x01a0, 0x6800, 0x0006, 0x6837, 0x0103, 0x6b4a, 0x6847, -+ 0x0000, 0x080c, 0x9ecc, 0x0006, 0x6000, 0xd0fc, 0x0110, 0x080c, -+ 0xb389, 0x000e, 0x080c, 0x5408, 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, 0x51dd, 0xa085, 0x0001, 0x0008, 0xa006, 0x00ee, -+ 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x1128, -+ 0x080c, 0x15f8, 0x01a0, 0x2d00, 0x60a6, 0x6803, 0x0001, 0x6807, -+ 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, -+ 0x1f04, 0x51fd, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006, -+ 0x0cd8, 0x00d6, 0x0126, 0x2091, 0x8000, 0x60a4, 0xa06d, 0x0130, -+ 0x60a7, 0x0000, 0x080c, 0x160f, 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, 0x5228, 0xa085, 0x0001, -+ 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x0c19, 0x1188, 0x200b, -+ 0xffff, 0x00d6, 0x60a8, 0x2068, 0x6854, 0xa08a, 0x0002, 0x0218, -+ 0x8001, 0x6856, 0x0020, 0x080c, 0x160f, 0x60ab, 0x0000, 0x00de, -+ 0x012e, 0x0005, 0x609c, 0xd0a4, 0x0005, 0x00f6, 0x080c, 0x5acf, -+ 0x01b0, 0x71b8, 0x81ff, 0x1198, 0x71d4, 0xd19c, 0x0180, 0x2001, -+ 0x007e, 0xa080, 0xb635, 0x2004, 0xa07d, 0x0148, 0x7804, 0xa084, -+ 0x00ff, 0xa086, 0x0006, 0x1118, 0x7800, 0xc0ed, 0x7802, 0x2079, -+ 0xb552, 0x7804, 0xd0a4, 0x01e8, 0x0156, 0x00c6, 0x20a9, 0x007f, -+ 0x2009, 0x0000, 0x0016, 0x080c, 0x4fa9, 0x1168, 0x6004, 0xa084, -+ 0xff00, 0x8007, 0xa096, 0x0004, 0x0118, 0xa086, 0x0006, 0x1118, -+ 0x6000, 0xc0ed, 0x6002, 0x001e, 0x8108, 0x1f04, 0x5272, 0x00ce, -+ 0x015e, 0x080c, 0x5309, 0x0120, 0x2001, 0xb7b5, 0x200c, 0x0038, -+ 0x2079, 0xb552, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, -+ 0x529d, 0x080c, 0x6a22, 0x00fe, 0x0005, 0x2011, 0x529d, 0x080c, -+ 0x699c, 0x080c, 0x5309, 0x01f0, 0x2001, 0xb6b3, 0x2004, 0xa080, -+ 0x0000, 0x200c, 0xc1ec, 0x2102, 0x2001, 0xb553, 0x2004, 0xd0a4, -+ 0x0130, 0x2009, 0x07d0, 0x2011, 0x529d, 0x080c, 0x6a22, 0x00e6, -+ 0x2071, 0xb500, 0x7073, 0x0000, 0x7077, 0x0000, 0x080c, 0x2ab8, -+ 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, -+ 0x0016, 0x080c, 0x4fa9, 0x1530, 0x6000, 0xd0ec, 0x0518, 0x0046, -+ 0x62a0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0x0029, 0x080c, -+ 0xb0e8, 0x6000, 0xc0e5, 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, -+ 0xa085, 0x0700, 0x6006, 0x2019, 0x0029, 0x080c, 0x6df5, 0x0076, -+ 0x2039, 0x0000, 0x080c, 0x6d02, 0x2009, 0x0000, 0x080c, 0xae82, -+ 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x52c8, 0x00ce, 0x015e, -+ 0x0005, 0x00c6, 0x6018, 0x2060, 0x6000, 0xc0ec, 0x6002, 0x00ce, -+ 0x0005, 0x7818, 0x2004, 0xd0ac, 0x0005, 0x7818, 0x2004, 0xd0bc, -+ 0x0005, 0x00f6, 0x2001, 0xb6b3, 0x2004, 0xa07d, 0x0110, 0x7800, -+ 0xd0ec, 0x00fe, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000, 0x0006, -+ 0x62a0, 0xa290, 0xb635, 0x2204, 0xac06, 0x190c, 0x1515, 0x000e, -+ 0x6200, 0xa005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0x6202, 0x002e, -+ 0x012e, 0x0005, 0x2011, 0xb535, 0x2204, 0xd0cc, 0x0138, 0x2001, -+ 0xb7b3, 0x200c, 0x2011, 0x5337, 0x080c, 0x6a22, 0x0005, 0x2011, -+ 0x5337, 0x080c, 0x699c, 0x2011, 0xb535, 0x2204, 0xc0cc, 0x2012, -+ 0x0005, 0x2071, 0xb614, 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, 0xb77d, 0x7003, 0xb614, 0x7007, -+ 0x0000, 0x700b, 0x0000, 0x700f, 0xb75d, 0x7013, 0x0020, 0x7017, -+ 0x0040, 0x7037, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0xb735, -+ 0xa00e, 0x7186, 0x718a, 0x7097, 0x0001, 0x2001, 0xb553, 0x2004, -+ 0xd0fc, 0x1150, 0x2001, 0xb553, 0x2004, 0xa00e, 0xd09c, 0x0108, -+ 0x8108, 0x7102, 0x0804, 0x53d2, 0x2001, 0xb572, 0x200c, 0xa184, -+ 0x000f, 0x2009, 0xb573, 0x210c, 0x0002, 0x537a, 0x53ad, 0x53b4, -+ 0x53be, 0x53c3, 0x537a, 0x537a, 0x537a, 0x539d, 0x537a, 0x537a, -+ 0x537a, 0x537a, 0x537a, 0x537a, 0x537a, 0x7003, 0x0004, 0x0136, -+ 0x0146, 0x0156, 0x2099, 0xb576, 0x20a1, 0xb786, 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, 0xb614, -+ 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, 0x5461, 0x6804, -+ 0xa00d, 0x0188, 0x00d6, 0x2071, 0xb500, 0xa016, 0x702c, 0x2168, -+ 0x6904, 0x206a, 0x8210, 0x2d00, 0x81ff, 0x1dc8, 0x702e, 0x70b4, -+ 0xa200, 0x70b6, 0x00de, 0x2071, 0xb614, 0x701c, 0xa005, 0x1904, -+ 0x5471, 0x20a9, 0x0032, 0x0f04, 0x546f, 0x0e04, 0x542b, 0x2071, -+ 0xb735, 0x7200, 0x82ff, 0x05d8, 0x6934, 0xa186, 0x0103, 0x1904, -+ 0x547f, 0x6948, 0x6844, 0xa105, 0x1540, 0x2009, 0x8020, 0x2200, -+ 0x0002, 0x546f, 0x5446, 0x5497, 0x54a3, 0x546f, 0x2071, 0x0000, -+ 0x20a9, 0x0032, 0x0f04, 0x546f, 0x7018, 0xd084, 0x1dd8, 0x7122, -+ 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, -+ 0x2071, 0xb500, 0x702c, 0x206a, 0x2d00, 0x702e, 0x70b4, 0x8000, -+ 0x70b6, 0x002e, 0x00ee, 0x015e, 0x0005, 0x6844, 0xa086, 0x0100, -+ 0x1130, 0x6868, 0xa005, 0x1118, 0x2009, 0x8020, 0x0880, 0x2071, -+ 0xb614, 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, 0x543f, 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, 0x5458, 0x718c, 0x7084, -+ 0xa10a, 0x0a04, 0x5458, 0x2071, 0x0000, 0x7018, 0xd084, 0x1904, -+ 0x5458, 0x2071, 0xb735, 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, -+ 0x5722, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, -+ 0x5458, 0x080c, 0x574c, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, -+ 0x4080, 0x0804, 0x5458, 0x0006, 0x684c, 0x0006, 0x6837, 0x0103, -+ 0x20a9, 0x001c, 0xad80, 0x0011, 0x20a0, 0x2001, 0x0000, 0x40a4, -+ 0x000e, 0xa084, 0x00ff, 0x684e, 0x000e, 0x684a, 0x6952, 0x0005, -+ 0x2071, 0xb614, 0x7004, 0x0002, 0x54fe, 0x550f, 0x570d, 0x570e, -+ 0x571b, 0x5721, 0x54ff, 0x56fe, 0x5694, 0x56ea, 0x0005, 0x0126, -+ 0x2091, 0x8000, 0x0e04, 0x550e, 0x2009, 0x000d, 0x7030, 0x200a, -+ 0x2091, 0x4080, 0x7007, 0x0001, 0x700b, 0x0000, 0x012e, 0x2069, -+ 0xb7f3, 0x683c, 0xa005, 0x03f8, 0x11f0, 0x0126, 0x2091, 0x8000, -+ 0x2069, 0x0000, 0x6934, 0x2001, 0xb620, 0x2004, 0xa10a, 0x0170, -+ 0x0e04, 0x5532, 0x2069, 0x0000, 0x6818, 0xd084, 0x1158, 0x2009, -+ 0x8040, 0x6922, 0x681b, 0x0001, 0x2091, 0x4080, 0x2069, 0xb7f3, -+ 0x683f, 0xffff, 0x012e, 0x2069, 0xb500, 0x6848, 0x6968, 0xa102, -+ 0x2069, 0xb735, 0x688a, 0x6984, 0x701c, 0xa06d, 0x0120, 0x81ff, -+ 0x0904, 0x5588, 0x00a0, 0x81ff, 0x0904, 0x564e, 0x2071, 0xb735, -+ 0x7184, 0x7088, 0xa10a, 0x1258, 0x7190, 0x2071, 0xb7f3, 0x7038, -+ 0xa005, 0x0128, 0x1b04, 0x564e, 0x713a, 0x0804, 0x564e, 0x2071, -+ 0xb735, 0x718c, 0x0126, 0x2091, 0x8000, 0x7084, 0xa10a, 0x0a04, -+ 0x5669, 0x0e04, 0x560a, 0x2071, 0x0000, 0x7018, 0xd084, 0x1904, -+ 0x560a, 0x2001, 0xffff, 0x2071, 0xb7f3, 0x703a, 0x2071, 0xb735, -+ 0x7000, 0xa086, 0x0002, 0x1150, 0x080c, 0x5722, 0x2071, 0x0000, -+ 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x560a, 0x080c, 0x574c, -+ 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x560a, -+ 0x2071, 0xb735, 0x7000, 0xa005, 0x0904, 0x5630, 0x6934, 0xa186, -+ 0x0103, 0x1904, 0x560d, 0x684c, 0xd0bc, 0x1904, 0x5630, 0x6948, -+ 0x6844, 0xa105, 0x1904, 0x5625, 0x2009, 0x8020, 0x2071, 0xb735, -+ 0x7000, 0x0002, 0x5630, 0x55f0, 0x55c8, 0x55da, 0x55a7, 0x0136, -+ 0x0146, 0x0156, 0x2099, 0xb576, 0x20a1, 0xb786, 0x20a9, 0x0004, -+ 0x53a3, 0x015e, 0x014e, 0x013e, 0x2071, 0xb77d, 0xad80, 0x000f, -+ 0x700e, 0x7013, 0x0002, 0x7007, 0x0002, 0x700b, 0x0000, 0x2e10, -+ 0x080c, 0x1643, 0x2071, 0xb614, 0x7007, 0x0009, 0x0804, 0x564e, -+ 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x564e, 0xae90, 0x0003, -+ 0xa210, 0x683c, 0x2012, 0x7186, 0x2071, 0xb614, 0x080c, 0x57a3, -+ 0x0804, 0x564e, 0x7084, 0x8008, 0xa092, 0x000f, 0x1a04, 0x564e, -+ 0xae90, 0x0003, 0x8003, 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, -+ 0x2012, 0x7186, 0x2071, 0xb614, 0x080c, 0x57a3, 0x0804, 0x564e, -+ 0x0126, 0x2091, 0x8000, 0x0e04, 0x560a, 0x2071, 0x0000, 0x7018, -+ 0xd084, 0x1180, 0x7122, 0x683c, 0x7026, 0x6840, 0x702a, 0x701b, -+ 0x0001, 0x2091, 0x4080, 0x012e, 0x2071, 0xb614, 0x080c, 0x57a3, -+ 0x0804, 0x564e, 0x012e, 0x0804, 0x564e, 0xa18c, 0x00ff, 0xa186, -+ 0x0017, 0x0130, 0xa186, 0x001e, 0x0118, 0xa18e, 0x001f, 0x11c0, -+ 0x684c, 0xd0cc, 0x01a8, 0x6850, 0xa084, 0x00ff, 0xa086, 0x0001, -+ 0x1178, 0x2009, 0x8021, 0x0804, 0x559e, 0x6844, 0xa086, 0x0100, -+ 0x1138, 0x6868, 0xa005, 0x1120, 0x2009, 0x8020, 0x0804, 0x559e, -+ 0x2071, 0xb614, 0x080c, 0x57b5, 0x01c8, 0x2071, 0xb614, 0x700f, -+ 0x0001, 0x6934, 0xa184, 0x00ff, 0xa086, 0x0003, 0x1130, 0x810f, -+ 0xa18c, 0x00ff, 0x8101, 0x0108, 0x710e, 0x7007, 0x0003, 0x080c, -+ 0x57ce, 0x7050, 0xa086, 0x0100, 0x0904, 0x570e, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0xb614, 0x7008, 0xa086, 0x0001, 0x1180, 0x0e04, -+ 0x5667, 0x2009, 0x000d, 0x7030, 0x200a, 0x2091, 0x4080, 0x700b, -+ 0x0000, 0x7004, 0xa086, 0x0006, 0x1110, 0x7007, 0x0001, 0x012e, -+ 0x0005, 0x2071, 0xb614, 0x080c, 0x57b5, 0x0518, 0x2071, 0xb735, -+ 0x7084, 0x700a, 0x20a9, 0x0020, 0x2099, 0xb736, 0x20a1, 0xb75d, -+ 0x53a3, 0x7087, 0x0000, 0x2071, 0xb614, 0x2069, 0xb77d, 0x706c, -+ 0x6826, 0x7070, 0x682a, 0x7074, 0x682e, 0x7078, 0x6832, 0x2d10, -+ 0x080c, 0x1643, 0x7007, 0x0008, 0x2001, 0xffff, 0x2071, 0xb7f3, -+ 0x703a, 0x012e, 0x0804, 0x564e, 0x2069, 0xb77d, 0x6808, 0xa08e, -+ 0x0000, 0x0904, 0x56e9, 0xa08e, 0x0200, 0x0904, 0x56e7, 0xa08e, -+ 0x0100, 0x1904, 0x56e9, 0x0126, 0x2091, 0x8000, 0x0e04, 0x56e5, -+ 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, 0xb75a, 0x2004, -+ 0xa005, 0x1190, 0x6934, 0x2069, 0xb735, 0x689c, 0x699e, 0x2069, -+ 0xb7f3, 0xa102, 0x1118, 0x683c, 0xa005, 0x1368, 0x2001, 0xb75b, -+ 0x200c, 0x810d, 0x693e, 0x0038, 0x2009, 0x8040, 0x6922, 0x681b, -+ 0x0001, 0x2091, 0x4080, 0x7007, 0x0001, 0x012e, 0x0010, 0x7007, -+ 0x0005, 0x0005, 0x2001, 0xb77f, 0x2004, 0xa08e, 0x0100, 0x1128, -+ 0x7007, 0x0001, 0x080c, 0x57a3, 0x0005, 0xa08e, 0x0000, 0x0de0, -+ 0xa08e, 0x0200, 0x1dc8, 0x7007, 0x0005, 0x0005, 0x701c, 0xa06d, -+ 0x0158, 0x080c, 0x57b5, 0x0140, 0x7007, 0x0003, 0x080c, 0x57ce, -+ 0x7050, 0xa086, 0x0100, 0x0110, 0x0005, 0x0005, 0x7050, 0xa09e, -+ 0x0100, 0x1118, 0x7007, 0x0004, 0x0030, 0xa086, 0x0200, 0x1110, -+ 0x7007, 0x0005, 0x0005, 0x080c, 0x5771, 0x7006, 0x080c, 0x57a3, -+ 0x0005, 0x0005, 0x00e6, 0x0156, 0x2071, 0xb735, 0x7184, 0x81ff, -+ 0x0500, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, 0x0000, 0x21a8, -+ 0x2014, 0x7226, 0x8000, 0x0f04, 0x5746, 0x2014, 0x722a, 0x8000, -+ 0x0f04, 0x5746, 0x2014, 0x722e, 0x8000, 0x0f04, 0x5746, 0x2014, -+ 0x723a, 0x8000, 0x0f04, 0x5746, 0x2014, 0x723e, 0xa180, 0x8030, -+ 0x7022, 0x015e, 0x00ee, 0x0005, 0x00e6, 0x0156, 0x2071, 0xb735, -+ 0x7184, 0x81ff, 0x01d8, 0xa006, 0x7086, 0xae80, 0x0003, 0x2071, -+ 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x2014, 0x722a, 0x8000, -+ 0x0f04, 0x5768, 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, 0x579d, 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, 0x160f, 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, 0xb812, 0x2104, 0xc08d, 0x200a, 0x012e, 0x080c, 0x165f, -+ 0x0005, 0x708c, 0xa08a, 0x0029, 0x1220, 0xa082, 0x001d, 0x0033, -+ 0x0010, 0x080c, 0x1515, 0x6027, 0x1e00, 0x0005, 0x58dc, 0x5857, -+ 0x586f, 0x58ac, 0x58cd, 0x5907, 0x5919, 0x586f, 0x58f3, 0x57fb, -+ 0x5829, 0x57fa, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0xa005, -+ 0x1180, 0x6808, 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, 0xb7c5, -+ 0x2d04, 0x7002, 0x080c, 0x5bd1, 0x6028, 0xa085, 0x0600, 0x602a, -+ 0x00b0, 0x708f, 0x0028, 0x2069, 0xb7c5, 0x2d04, 0x7002, 0x6028, -+ 0xa085, 0x0600, 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, -+ 0xb823, 0x080c, 0x1dfe, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, -+ 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, 0xa005, 0x1180, 0x6808, -+ 0xa005, 0x1518, 0x708f, 0x0028, 0x2069, 0xb7c5, 0x2d04, 0x7002, -+ 0x080c, 0x5c5e, 0x6028, 0xa085, 0x0600, 0x602a, 0x00b0, 0x708f, -+ 0x0028, 0x2069, 0xb7c5, 0x2d04, 0x7002, 0x6028, 0xa085, 0x0600, -+ 0x602a, 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0xb823, 0x080c, -+ 0x1dfe, 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x6803, -+ 0x0090, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x5984, 0xd1d4, 0x1160, -+ 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x708f, 0x0020, 0x080c, 0x5984, -+ 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, 0x5aff, 0x080c, 0x24b0, 0x0156, 0x6803, 0x0100, 0x20a9, -+ 0x0014, 0x6804, 0xd0dc, 0x1118, 0x1f04, 0x5889, 0x0048, 0x20a9, -+ 0x0014, 0x6803, 0x0080, 0x6804, 0xd0d4, 0x1130, 0x1f04, 0x5893, -+ 0x080c, 0x5b20, 0x015e, 0x0078, 0x015e, 0x708f, 0x0028, 0x0058, -+ 0x708f, 0x001e, 0x0040, 0x708f, 0x001d, 0x0028, 0x708f, 0x0020, -+ 0x0010, 0x708f, 0x001f, 0x0005, 0x60e3, 0x0001, 0x600c, 0xc0b4, -+ 0x600e, 0x080c, 0x5aff, 0x080c, 0x24b0, 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, 0x1e47, 0x708f, 0x001e, -+ 0x0010, 0x708f, 0x001d, 0x0005, 0x080c, 0x59f6, 0x6124, 0xd1dc, -+ 0x1188, 0x080c, 0x5984, 0x0016, 0x080c, 0x1e47, 0x001e, 0xd1d4, -+ 0x1128, 0xd1e4, 0x0138, 0x708f, 0x001e, 0x0020, 0x708f, 0x001f, -+ 0x080c, 0x5984, 0x0005, 0x6803, 0x00a0, 0x6124, 0xd1d4, 0x1160, -+ 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x708f, 0x001e, -+ 0x0028, 0x708f, 0x001d, 0x0010, 0x708f, 0x0021, 0x0005, 0x080c, -+ 0x59f6, 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, 0xb500, 0x2091, 0x8000, 0x080c, 0x5acf, 0x11e8, -+ 0x2001, 0xb50c, 0x200c, 0xd1b4, 0x01c0, 0xc1b4, 0x2102, 0x6027, -+ 0x0200, 0xe000, 0xe000, 0x6024, 0xd0cc, 0x0158, 0x6803, 0x00a0, -+ 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, -+ 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x5aeb, 0x0150, -+ 0x080c, 0x5ae1, 0x1138, 0x2001, 0x0001, 0x080c, 0x27c3, 0x080c, -+ 0x5aa6, 0x00a0, 0x080c, 0x59f3, 0x0178, 0x2001, 0x0001, 0x080c, -+ 0x27c3, 0x708c, 0xa086, 0x001e, 0x0120, 0x708c, 0xa086, 0x0022, -+ 0x1118, 0x708f, 0x0025, 0x0010, 0x708f, 0x0021, 0x012e, 0x00ee, -+ 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x5995, 0x080c, -+ 0x6a5c, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x5995, -+ 0x080c, 0x6a53, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, -+ 0x080c, 0x7d7a, 0x2071, 0xb500, 0x080c, 0x5930, 0x001e, 0x00fe, -+ 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, -+ 0x00f6, 0x0126, 0x080c, 0x7d7a, 0x2061, 0x0100, 0x2069, 0x0140, -+ 0x2071, 0xb500, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011, -+ 0x0003, 0x080c, 0x8075, 0x2011, 0x0002, 0x080c, 0x807f, 0x080c, -+ 0x7f59, 0x080c, 0x6a10, 0x0036, 0x2019, 0x0000, 0x080c, 0x7fe4, -+ 0x003e, 0x60e3, 0x0000, 0x080c, 0xb42f, 0x080c, 0xb44a, 0x2001, -+ 0xb500, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, 0x12dd, 0x2001, -+ 0x0001, 0x080c, 0x27c3, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x003e, 0x002e, 0x001e, 0x0005, 0x2001, 0xb500, 0x2004, 0xa086, -+ 0x0004, 0x0140, 0x2001, 0xb79e, 0x2003, 0xaaaa, 0x2001, 0xb79f, -+ 0x2003, 0x0000, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, 0xa086, -+ 0x00c0, 0x0160, 0x6803, 0x00c0, 0x0156, 0x20a9, 0x002d, 0x1d04, -+ 0x59ff, 0x2091, 0x6000, 0x1f04, 0x59ff, 0x015e, 0x0005, 0x00c6, - 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb500, -- 0x2001, 0xb79e, 0x2003, 0x0000, 0x2001, 0xb78f, 0x2003, 0x0000, -- 0x708f, 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, -- 0x080c, 0x2872, 0x6803, 0x0000, 0x6043, 0x0090, 0x6043, 0x0010, -- 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, -- 0x0006, 0x2001, 0xb79e, 0x2004, 0xa086, 0xaaaa, 0x000e, 0x0005, -- 0x0006, 0x2001, 0xb572, 0x2004, 0xa084, 0x0030, 0xa086, 0x0000, -- 0x000e, 0x0005, 0x0006, 0x2001, 0xb572, 0x2004, 0xa084, 0x0030, -- 0xa086, 0x0030, 0x000e, 0x0005, 0x0006, 0x2001, 0xb572, 0x2004, -- 0xa084, 0x0030, 0xa086, 0x0010, 0x000e, 0x0005, 0x0006, 0x2001, -- 0xb572, 0x2004, 0xa084, 0x0030, 0xa086, 0x0020, 0x000e, 0x0005, -- 0x2001, 0xb50c, 0x2004, 0xd0a4, 0x0170, 0x080c, 0x2892, 0x0036, -- 0x0016, 0x2009, 0x0000, 0x2019, 0x0028, 0x080c, 0x2c6f, 0x001e, -- 0x003e, 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071, 0xb50c, 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, 0x2872, 0x6800, -- 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0, 0x000e, 0x6052, -- 0x6050, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, -- 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb500, 0x6020, -- 0xa084, 0x0080, 0x0138, 0x2001, 0xb50c, 0x200c, 0xc1bd, 0x2102, -- 0x0804, 0x5bca, 0x2001, 0xb50c, 0x200c, 0xc1bc, 0x2102, 0x6028, -- 0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803, 0x0090, 0x20a9, -- 0x0384, 0x6024, 0xd0cc, 0x1508, 0x1d04, 0x5b79, 0x2091, 0x6000, -- 0x1f04, 0x5b79, 0x2011, 0x0003, 0x080c, 0x8076, 0x2011, 0x0002, -- 0x080c, 0x8080, 0x080c, 0x7f5a, 0x2019, 0x0000, 0x080c, 0x7fe5, -- 0x6803, 0x00a0, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, -- 0x2003, 0x0001, 0xa085, 0x0001, 0x0468, 0x86ff, 0x1110, 0x080c, -- 0x1e47, 0x60e3, 0x0000, 0x2001, 0xb78f, 0x2004, 0x080c, 0x2872, -- 0x60e2, 0x080c, 0x24b0, 0x6803, 0x0080, 0x20a9, 0x0384, 0x6027, -- 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0138, 0x1d04, -- 0x5baf, 0x2091, 0x6000, 0x1f04, 0x5baf, 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, 0xb500, 0x2069, 0x0140, 0x6020, -- 0xa084, 0x00c0, 0x0120, 0x6884, 0xa005, 0x1904, 0x5c26, 0x6803, -- 0x0088, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, 0x080c, -- 0x2872, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, 0x6808, 0xa005, -- 0x01c0, 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069, -- 0xb7c5, 0x7000, 0x206a, 0x708f, 0x0026, 0x7003, 0x0001, 0x20a9, -- 0x0002, 0x1d04, 0x5c09, 0x2091, 0x6000, 0x1f04, 0x5c09, 0x0804, -- 0x5c57, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, -- 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0520, 0xa084, 0x1a00, 0x1508, -- 0x1d04, 0x5c15, 0x2091, 0x6000, 0x1f04, 0x5c15, 0x2011, 0x0003, -- 0x080c, 0x8076, 0x2011, 0x0002, 0x080c, 0x8080, 0x080c, 0x7f5a, -- 0x2019, 0x0000, 0x080c, 0x7fe5, 0x6803, 0x00a0, 0x2001, 0xb79f, -- 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, 0xa085, 0x0001, -- 0x00b0, 0x080c, 0x24b0, 0x6803, 0x0080, 0x2069, 0x0140, 0x60e3, -+ 0x2001, 0xb79f, 0x200c, 0xa186, 0x0000, 0x0158, 0xa186, 0x0001, -+ 0x0158, 0xa186, 0x0002, 0x0158, 0xa186, 0x0003, 0x0158, 0x0804, -+ 0x5a94, 0x708f, 0x0022, 0x0040, 0x708f, 0x0021, 0x0028, 0x708f, -+ 0x0023, 0x0020, 0x708f, 0x0024, 0x6043, 0x0000, 0x60e3, 0x0000, -+ 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x2872, 0x0026, 0x2011, -+ 0x0003, 0x080c, 0x8075, 0x2011, 0x0002, 0x080c, 0x807f, 0x080c, -+ 0x7f59, 0x0036, 0x2019, 0x0000, 0x080c, 0x7fe4, 0x003e, 0x002e, -+ 0x7000, 0xa08e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, -+ 0x0020, 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, -+ 0xd0ac, 0x0120, 0x012e, 0x015e, 0x0804, 0x5aa2, 0x6800, 0xa084, -+ 0x00a0, 0xc0bd, 0x6802, 0x6904, 0xd1d4, 0x1130, 0x6803, 0x0100, -+ 0x1f04, 0x5a57, 0x080c, 0x5b20, 0x012e, 0x015e, 0x080c, 0x5ae1, -+ 0x01a8, 0x6044, 0xa005, 0x0168, 0x6050, 0x0006, 0xa085, 0x0020, -+ 0x6052, 0x080c, 0x5b20, 0xa006, 0x8001, 0x1df0, 0x000e, 0x6052, -+ 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x5b20, 0x0016, 0x0026, -+ 0x2009, 0x00c8, 0x2011, 0x59a2, 0x080c, 0x6a22, 0x002e, 0x001e, -+ 0x2001, 0xb79f, 0x2003, 0x0004, 0x080c, 0x57e1, 0x080c, 0x5ae1, -+ 0x0148, 0x6804, 0xd0d4, 0x1130, 0xd0dc, 0x1100, 0x2001, 0xb79f, -+ 0x2003, 0x0000, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, -+ 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb500, 0x2001, -+ 0xb79e, 0x2003, 0x0000, 0x2001, 0xb78f, 0x2003, 0x0000, 0x708f, -+ 0x0000, 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, 0x080c, -+ 0x2872, 0x6803, 0x0000, 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, -+ 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, -+ 0x2001, 0xb79e, 0x2004, 0xa086, 0xaaaa, 0x000e, 0x0005, 0x0006, -+ 0x2001, 0xb572, 0x2004, 0xa084, 0x0030, 0xa086, 0x0000, 0x000e, -+ 0x0005, 0x0006, 0x2001, 0xb572, 0x2004, 0xa084, 0x0030, 0xa086, -+ 0x0030, 0x000e, 0x0005, 0x0006, 0x2001, 0xb572, 0x2004, 0xa084, -+ 0x0030, 0xa086, 0x0010, 0x000e, 0x0005, 0x0006, 0x2001, 0xb572, -+ 0x2004, 0xa084, 0x0030, 0xa086, 0x0020, 0x000e, 0x0005, 0x2001, -+ 0xb50c, 0x2004, 0xd0a4, 0x0170, 0x080c, 0x2892, 0x0036, 0x0016, -+ 0x2009, 0x0000, 0x2019, 0x0028, 0x080c, 0x2c6f, 0x001e, 0x003e, -+ 0xa006, 0x0009, 0x0005, 0x00e6, 0x2071, 0xb50c, 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, 0x2872, 0x6800, 0xa084, -+ 0x00a0, 0xc0bd, 0x6802, 0x6803, 0x00a0, 0x000e, 0x6052, 0x6050, -+ 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, -+ 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0xb500, 0x6020, 0xa084, -+ 0x0080, 0x0138, 0x2001, 0xb50c, 0x200c, 0xc1bd, 0x2102, 0x0804, -+ 0x5bc9, 0x2001, 0xb50c, 0x200c, 0xc1bc, 0x2102, 0x6028, 0xa084, -+ 0xe1ff, 0x602a, 0x6027, 0x0200, 0x6803, 0x0090, 0x20a9, 0x0384, -+ 0x6024, 0xd0cc, 0x1508, 0x1d04, 0x5b78, 0x2091, 0x6000, 0x1f04, -+ 0x5b78, 0x2011, 0x0003, 0x080c, 0x8075, 0x2011, 0x0002, 0x080c, -+ 0x807f, 0x080c, 0x7f59, 0x2019, 0x0000, 0x080c, 0x7fe4, 0x6803, -+ 0x00a0, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, -+ 0x0001, 0xa085, 0x0001, 0x0468, 0x86ff, 0x1120, 0x080c, 0x1e47, -+ 0x080c, 0x24b0, 0x60e3, 0x0000, 0x2001, 0xb78f, 0x2004, 0x080c, -+ 0x2872, 0x60e2, 0x6803, 0x0080, 0x20a9, 0x0384, 0x6027, 0x1e00, -+ 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0138, 0x1d04, 0x5bae, -+ 0x2091, 0x6000, 0x1f04, 0x5bae, 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, 0xb500, 0x2069, 0x0140, 0x6020, 0xa084, -+ 0x00c0, 0x0120, 0x6884, 0xa005, 0x1904, 0x5c25, 0x6803, 0x0088, -+ 0x60e3, 0x0000, 0x6887, 0x0000, 0x2001, 0x0000, 0x080c, 0x2872, -+ 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, 0x6808, 0xa005, 0x01c0, -+ 0x6028, 0xa084, 0xfbff, 0x602a, 0x6027, 0x0400, 0x2069, 0xb7c5, -+ 0x7000, 0x206a, 0x708f, 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, -+ 0x1d04, 0x5c08, 0x2091, 0x6000, 0x1f04, 0x5c08, 0x0804, 0x5c56, -+ 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, -+ 0xe000, 0x6024, 0xa10c, 0x0520, 0xa084, 0x1a00, 0x1508, 0x1d04, -+ 0x5c14, 0x2091, 0x6000, 0x1f04, 0x5c14, 0x2011, 0x0003, 0x080c, -+ 0x8075, 0x2011, 0x0002, 0x080c, 0x807f, 0x080c, 0x7f59, 0x2019, -+ 0x0000, 0x080c, 0x7fe4, 0x6803, 0x00a0, 0x2001, 0xb79f, 0x2003, -+ 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, 0xa085, 0x0001, 0x00b0, -+ 0x080c, 0x24b0, 0x6803, 0x0080, 0x2069, 0x0140, 0x60e3, 0x0000, -+ 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, -+ 0xb78f, 0x2004, 0x080c, 0x2872, 0x60e2, 0xa006, 0x00ee, 0x00de, -+ 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, -+ 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, -+ 0xb500, 0x6020, 0xa084, 0x00c0, 0x01e0, 0x2011, 0x0003, 0x080c, -+ 0x8075, 0x2011, 0x0002, 0x080c, 0x807f, 0x080c, 0x7f59, 0x2019, -+ 0x0000, 0x080c, 0x7fe4, 0x2069, 0x0140, 0x6803, 0x00a0, 0x2001, -+ 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, 0x0804, -+ 0x5cfb, 0x2001, 0xb50c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, -+ 0x080c, 0x598a, 0x2069, 0x0140, 0x080c, 0x24b0, 0x6803, 0x0080, -+ 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, 0x6808, -+ 0xa005, 0x01c0, 0x6028, 0xa084, 0xfdff, 0x602a, 0x6027, 0x0200, -+ 0x2069, 0xb7c5, 0x7000, 0x206a, 0x708f, 0x0027, 0x7003, 0x0001, -+ 0x20a9, 0x0002, 0x1d04, 0x5cb2, 0x2091, 0x6000, 0x1f04, 0x5cb2, -+ 0x0804, 0x5cfb, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, -+ 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0, 0x1d04, 0x5cba, 0x0006, -+ 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x68f9, 0x00ee, 0x00de, -+ 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0xb7f3, 0x7018, 0x00ee, -+ 0xa005, 0x1d00, 0x0500, 0x0026, 0x2011, 0x59a2, 0x080c, 0x699c, -+ 0x2011, 0x5995, 0x080c, 0x6a5c, 0x002e, 0x2069, 0x0140, 0x60e3, - 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, -- 0x2001, 0xb78f, 0x2004, 0x080c, 0x2872, 0x60e2, 0xa006, 0x00ee, -- 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, -- 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, -- 0x2071, 0xb500, 0x6020, 0xa084, 0x00c0, 0x01e0, 0x2011, 0x0003, -- 0x080c, 0x8076, 0x2011, 0x0002, 0x080c, 0x8080, 0x080c, 0x7f5a, -- 0x2019, 0x0000, 0x080c, 0x7fe5, 0x2069, 0x0140, 0x6803, 0x00a0, -- 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, -- 0x0804, 0x5cfc, 0x2001, 0xb50c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, -- 0x2102, 0x080c, 0x598b, 0x2069, 0x0140, 0x080c, 0x24b0, 0x6803, -- 0x0080, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0xa005, 0x1118, -- 0x6808, 0xa005, 0x01c0, 0x6028, 0xa084, 0xfdff, 0x602a, 0x6027, -- 0x0200, 0x2069, 0xb7c5, 0x7000, 0x206a, 0x708f, 0x0027, 0x7003, -- 0x0001, 0x20a9, 0x0002, 0x1d04, 0x5cb3, 0x2091, 0x6000, 0x1f04, -- 0x5cb3, 0x0804, 0x5cfc, 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, -- 0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, 0x11b0, 0x1d04, 0x5cbb, -- 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x68fa, 0x00ee, -- 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0xb7f3, 0x7018, -- 0x00ee, 0xa005, 0x1d00, 0x0500, 0x0026, 0x2011, 0x59a3, 0x080c, -- 0x699d, 0x2011, 0x5996, 0x080c, 0x6a5d, 0x002e, 0x2069, 0x0140, -- 0x60e3, 0x0000, 0x70a4, 0xa005, 0x1118, 0x6887, 0x0001, 0x0008, -- 0x6886, 0x2001, 0xb78f, 0x2004, 0x080c, 0x2872, 0x60e2, 0x2001, -- 0xb50c, 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, -- 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, -- 0x0046, 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb500, 0x7130, -- 0xd184, 0x1180, 0x2011, 0xb553, 0x2214, 0xd2ec, 0x0138, 0xc18d, -- 0x7132, 0x2011, 0xb553, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, -- 0x0904, 0x5d69, 0x7130, 0xc185, 0x7132, 0x2011, 0xb553, 0x220c, -- 0xd1a4, 0x0530, 0x0016, 0x2019, 0x000e, 0x080c, 0xb059, 0x0156, -- 0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, 0x007e, 0x01a0, 0xa186, -- 0x0080, 0x0188, 0x080c, 0x4faa, 0x1170, 0x8127, 0xa006, 0x0016, -- 0x2009, 0x000e, 0x080c, 0xb0dc, 0x2009, 0x0001, 0x2011, 0x0100, -- 0x080c, 0x6b1b, 0x001e, 0x8108, 0x1f04, 0x5d34, 0x015e, 0x001e, -- 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c, -- 0x2c6f, 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, -- 0x080c, 0x4faa, 0x1110, 0x080c, 0x4c0c, 0x8108, 0x1f04, 0x5d60, -- 0x015e, 0x080c, 0x1e47, 0x2011, 0x0003, 0x080c, 0x8076, 0x2011, -- 0x0002, 0x080c, 0x8080, 0x080c, 0x7f5a, 0x0036, 0x2019, 0x0000, -- 0x080c, 0x7fe5, 0x003e, 0x60e3, 0x0000, 0x2001, 0xb500, 0x2003, -- 0x0001, 0x080c, 0x5a08, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, -- 0x001e, 0x015e, 0x0005, 0x2071, 0xb5e2, 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, -- 0xb5e2, 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, 0xb5e2, 0x7004, 0x0043, 0x700c, 0x0002, -- 0x5de5, 0x5ddc, 0x5ddc, 0x5ddc, 0x5ddc, 0x0005, 0x5e3b, 0x5e3c, -- 0x5e6e, 0x5e6f, 0x5e39, 0x5ebd, 0x5ec2, 0x5ef3, 0x5ef4, 0x5f0f, -- 0x5f10, 0x5f11, 0x5f12, 0x5f13, 0x5f14, 0x5fca, 0x5ff1, 0x700c, -- 0x0002, 0x5dfe, 0x5e39, 0x5e39, 0x5e3a, 0x5e3a, 0x7830, 0x7930, -- 0xa106, 0x0120, 0x7830, 0x7930, 0xa106, 0x1510, 0x7030, 0xa10a, -- 0x01f8, 0x1210, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x12d0, 0x080c, -- 0x15df, 0x01b0, 0x2d00, 0x705a, 0x7063, 0x0040, 0x2001, 0x0003, -- 0x7057, 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, 0xb812, -- 0x2104, 0xc085, 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, 0x165f, -- 0x0005, 0x080c, 0x15df, 0x0de0, 0x2d00, 0x705a, 0x080c, 0x15df, -- 0x1108, 0x0c10, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004, -- 0x08f8, 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, 0x5e43, 0x5e46, -- 0x5e54, 0x5e6d, 0x5e6d, 0x080c, 0x5df7, 0x0005, 0x0126, 0x8001, -- 0x700e, 0x7058, 0x0006, 0x080c, 0x6344, 0x0120, 0x2091, 0x8000, -- 0x080c, 0x5df7, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, -- 0x6344, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, -- 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x003a, 0x1218, 0x00db, -- 0x012e, 0x0005, 0x012e, 0x080c, 0x5f15, 0x0005, 0x0005, 0x0005, -- 0x00e6, 0x2071, 0xb5e2, 0x700c, 0x0002, 0x5e7a, 0x5e7a, 0x5e7a, -- 0x5e7c, 0x5e7f, 0x00ee, 0x0005, 0x700f, 0x0001, 0x0010, 0x700f, -- 0x0002, 0x00ee, 0x0005, 0x5f15, 0x5f15, 0x5f31, 0x5f15, 0x60ae, -- 0x5f15, 0x5f15, 0x5f15, 0x5f15, 0x5f15, 0x5f31, 0x60f0, 0x6133, -- 0x617c, 0x6190, 0x5f15, 0x5f15, 0x5f4d, 0x5f31, 0x5f15, 0x5f15, -- 0x5fa7, 0x623c, 0x6257, 0x5f15, 0x5f4d, 0x5f15, 0x5f15, 0x5f15, -- 0x5f15, 0x5f9d, 0x6257, 0x5f15, 0x5f15, 0x5f15, 0x5f15, 0x5f15, -- 0x5f15, 0x5f15, 0x5f15, 0x5f15, 0x5f61, 0x5f15, 0x5f15, 0x5f15, -- 0x5f15, 0x5f15, 0x5f15, 0x5f15, 0x5f15, 0x5f15, 0x6362, 0x5f15, -- 0x5f15, 0x5f15, 0x5f15, 0x5f15, 0x5f76, 0x7020, 0x2068, 0x080c, -- 0x160f, 0x0005, 0x700c, 0x0002, 0x5ec9, 0x5ecc, 0x5eda, 0x5ef2, -- 0x5ef2, 0x080c, 0x5df7, 0x0005, 0x0126, 0x8001, 0x700e, 0x7058, -- 0x0006, 0x080c, 0x6344, 0x0120, 0x2091, 0x8000, 0x080c, 0x5df7, -- 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, 0x6344, 0x7058, -- 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, -- 0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b, 0x012e, 0x0005, -- 0x012e, 0x0419, 0x0005, 0x0005, 0x0005, 0x5f15, 0x5f31, 0x609a, -- 0x5f15, 0x5f31, 0x5f15, 0x5f31, 0x5f31, 0x5f15, 0x5f31, 0x609a, -- 0x5f31, 0x5f31, 0x5f31, 0x5f31, 0x5f31, 0x5f15, 0x5f31, 0x609a, -- 0x5f15, 0x5f15, 0x5f31, 0x5f15, 0x5f15, 0x5f15, 0x5f31, 0x0005, -- 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x7007, 0x0001, 0x6838, -- 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x5409, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, -- 0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x5409, 0x012e, -- 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a, -- 0x0126, 0x2091, 0x8000, 0x080c, 0x5409, 0x012e, 0x0005, 0x7007, -- 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x0126, 0x2091, -- 0x8000, 0x080c, 0x5409, 0x012e, 0x0005, 0x6834, 0x8007, 0xa084, -- 0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x605a, -- 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x605a, -- 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x5f23, 0x8001, -- 0x1120, 0x7007, 0x0001, 0x0804, 0x6077, 0x7007, 0x0006, 0x7012, -- 0x2d00, 0x7016, 0x701a, 0x704b, 0x6077, 0x0005, 0x6834, 0x8007, -- 0xa084, 0x00ff, 0xa086, 0x0001, 0x1904, 0x5f23, 0x7007, 0x0001, -- 0x2009, 0xb531, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff, -- 0x683a, 0x6853, 0x0000, 0x080c, 0x4d83, 0x1108, 0x0005, 0x0126, -- 0x2091, 0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x5409, -- 0x012e, 0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0, -- 0xa086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x626f, 0x2d00, -- 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1, -- 0xb60d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x5f3f, -- 0x6a84, 0xa28a, 0x0002, 0x1a04, 0x5f3f, 0x82ff, 0x1138, 0x6888, -- 0x698c, 0xa105, 0x0118, 0x2001, 0x602d, 0x0018, 0xa280, 0x6023, -- 0x2005, 0x70c6, 0x7010, 0xa015, 0x0904, 0x600f, 0x080c, 0x15df, -- 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, -- 0x1643, 0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118, -- 0x7007, 0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x160f, 0x7014, -- 0x2068, 0x0804, 0x5f3f, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, -- 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x5fca, 0x7014, -- 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c, -- 0xa105, 0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, -- 0x0904, 0x626f, 0x04b8, 0x6025, 0x6029, 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, 0xb531, 0x210c, 0x81ff, 0x1198, 0x6838, -- 0xa084, 0x00ff, 0x683a, 0x080c, 0x4c65, 0x1108, 0x0005, 0x080c, -- 0x54dc, 0x0126, 0x2091, 0x8000, 0x080c, 0x9ec6, 0x080c, 0x5409, -- 0x012e, 0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, 0x2009, -- 0xb531, 0x210c, 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01c0, 0x6838, -- 0xa084, 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x4d27, 0x1108, -- 0x0005, 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, 0x5409, -- 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, 0x4faa, 0x11b8, 0x0066, 0x6e50, 0x080c, 0x50a9, -- 0x006e, 0x0088, 0x0046, 0x2011, 0xb50c, 0x2224, 0xc484, 0x2412, -- 0x004e, 0x00c6, 0x080c, 0x4faa, 0x1110, 0x080c, 0x520a, 0x8108, -- 0x1f04, 0x60da, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, 0x160f, -- 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x5409, 0x012e, 0x0005, -- 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xb553, 0x2004, -- 0xd0a4, 0x0580, 0x2061, 0xb874, 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, 0x6333, 0x012e, 0x0804, 0x632d, 0x012e, 0x0804, 0x6327, -- 0x012e, 0x0804, 0x632a, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, -- 0x2001, 0xb553, 0x2004, 0xd0a4, 0x05e0, 0x2061, 0xb874, 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, 0x6333, 0x012e, 0x0804, -- 0x6330, 0x012e, 0x0804, 0x632d, 0x0126, 0x2091, 0x8000, 0x7007, -- 0x0001, 0x2061, 0xb874, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, -- 0x0220, 0x630a, 0x012e, 0x0804, 0x6341, 0x012e, 0x0804, 0x6330, -- 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, -- 0x0148, 0x00c6, 0x2061, 0xb874, 0x6000, 0xa084, 0xfcff, 0x6002, -- 0x00ce, 0x0448, 0x6858, 0xa005, 0x05d0, 0x685c, 0xa065, 0x0598, -- 0x2001, 0xb531, 0x2004, 0xa005, 0x0118, 0x080c, 0x9e17, 0x0068, -- 0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950, -- 0x6156, 0x2009, 0x0041, 0x080c, 0x8646, 0x6958, 0xa18c, 0xff00, -- 0xa186, 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, 0xfdff, -- 0x080c, 0x6b1b, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, 0xb874, -- 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, -- 0x012e, 0x0804, 0x6333, 0x00ce, 0x012e, 0x0804, 0x632d, 0x6954, -- 0xa186, 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, 0x0045, -- 0x0528, 0xa186, 0x002a, 0x1130, 0x2001, 0xb50c, 0x200c, 0xc194, -- 0x2102, 0x08c8, 0xa186, 0x0020, 0x0170, 0xa186, 0x0029, 0x1d18, -- 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4faa, 0x1960, 0x6000, -- 0xc0e4, 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, 0x0024, -- 0x2001, 0xb7b6, 0x2004, 0x6016, 0x0804, 0x61cb, 0x685c, 0xa065, -- 0x0950, 0x00e6, 0x6860, 0xa075, 0x2001, 0xb531, 0x2004, 0xa005, -- 0x0150, 0x080c, 0x9e17, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9e17, -- 0x00ee, 0x0804, 0x61cb, 0x6020, 0xc0dc, 0xc0d5, 0x6022, 0x2e60, -- 0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, 0x6874, -- 0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x6c8e, 0x080c, -- 0x7174, 0x00ee, 0x0804, 0x61cb, 0x2061, 0xb874, 0x6000, 0xd084, -- 0x0190, 0xd08c, 0x1904, 0x6341, 0x0126, 0x2091, 0x8000, 0x6204, -- 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x6341, 0x012e, 0x6853, -- 0x0016, 0x0804, 0x633a, 0x6853, 0x0007, 0x0804, 0x633a, 0x6834, -- 0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x5f23, 0x0078, 0x2030, -- 0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, 0x0006, -- 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x626f, 0x0005, 0x00e6, -- 0x0126, 0x2091, 0x8000, 0xa03e, 0x2009, 0xb531, 0x210c, 0x81ff, -- 0x1904, 0x62ed, 0x2009, 0xb50c, 0x210c, 0xd194, 0x1904, 0x6317, -- 0x6848, 0x2070, 0xae82, 0xbd00, 0x0a04, 0x62e1, 0x2001, 0xb517, -- 0x2004, 0xae02, 0x1a04, 0x62e1, 0x711c, 0xa186, 0x0006, 0x1904, -- 0x62d0, 0x7018, 0xa005, 0x0904, 0x62ed, 0x2004, 0xd0e4, 0x1904, -- 0x6312, 0x2061, 0xb874, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, -- 0x1550, 0x7020, 0xd0dc, 0x1904, 0x631a, 0x6853, 0x0000, 0x6803, -- 0x0000, 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, 0xd0f4, -- 0x1904, 0x631d, 0x2e60, 0x080c, 0x6a77, 0x012e, 0x00ee, 0x0005, -- 0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, 0xd0f4, -- 0x1904, 0x631d, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853, -- 0x0006, 0x0804, 0x633a, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8, -- 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x4faa, 0x15d8, 0x6000, -- 0xd0e4, 0x15c0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002, -- 0x0498, 0x6853, 0x0008, 0x0480, 0x6853, 0x000e, 0x0468, 0x6853, -- 0x0017, 0x0450, 0x6853, 0x0035, 0x0438, 0x2001, 0xb572, 0x2004, -- 0xd0fc, 0x01e8, 0x6848, 0x2070, 0xae82, 0xbd00, 0x02c0, 0x605c, -- 0xae02, 0x12a8, 0x711c, 0xa186, 0x0006, 0x1188, 0x7018, 0xa005, -- 0x0170, 0x2004, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0xa086, -- 0x0007, 0x1904, 0x627a, 0x7003, 0x0002, 0x0804, 0x627a, 0x6853, -- 0x0028, 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, 0x6853, -- 0x002a, 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002, -- 0x6017, 0x0014, 0x080c, 0xacd4, 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, 0x5409, 0x012e, -- 0x0005, 0x080c, 0x160f, 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, 0x6a6e, -- 0x00de, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x7007, -- 0x0001, 0x6a44, 0xa282, 0x0004, 0x1a04, 0x63ad, 0xd284, 0x0170, -- 0x6a4c, 0xa290, 0xb635, 0x2204, 0xa065, 0x6004, 0x05e0, 0x8007, -- 0xa084, 0x00ff, 0xa084, 0x0006, 0x1108, 0x04a8, 0x2c10, 0x080c, -- 0x85c1, 0x1118, 0x080c, 0x9ed0, 0x05a0, 0x621a, 0x6844, 0x0002, -- 0x638c, 0x6391, 0x6394, 0x639a, 0x2019, 0x0002, 0x080c, 0xb059, -- 0x0060, 0x080c, 0xaff0, 0x0048, 0x2019, 0x0002, 0x6950, 0x080c, -- 0xb00b, 0x0018, 0x6950, 0x080c, 0xaff0, 0x080c, 0x8617, 0x6857, -- 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x5409, 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, 0x2dbf, 0x11d0, 0x080c, 0x6604, 0x0098, -- 0x20e1, 0x0004, 0x3d60, 0xd1bc, 0x1108, 0x3e60, 0xac84, 0x0007, -- 0x1170, 0xac82, 0xbd00, 0x0258, 0x685c, 0xac02, 0x1240, 0x2009, -- 0x0047, 0x080c, 0x8646, 0x7a1c, 0xd284, 0x1938, 0x0005, 0xa016, -- 0x080c, 0x185e, 0x0cc0, 0x0cd8, 0x781c, 0xd08c, 0x0500, 0x0156, -- 0x0136, 0x0146, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076, -- 0x1538, 0xa484, 0x7000, 0xa086, 0x1000, 0x11a8, 0x080c, 0x647f, -- 0x01f8, 0x20e1, 0x3000, 0x7828, 0x7828, 0x080c, 0x649b, 0x014e, -- 0x013e, 0x015e, 0x2009, 0xb7e8, 0x2104, 0xa005, 0x1108, 0x0005, -- 0x080c, 0x7174, 0x0ce0, 0xa484, 0x7000, 0x1548, 0x080c, 0x647f, -- 0x01d8, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x0d10, 0x00a0, -- 0xd5a4, 0x0178, 0x0056, 0x0046, 0x080c, 0x1e6e, 0x080c, 0x24b0, -- 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x004e, 0x005e, -- 0x0048, 0x04a9, 0x6887, 0x0000, 0x080c, 0xb3d3, 0x20e1, 0x3000, -- 0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e, 0x0880, 0x0439, -- 0x1130, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x1d68, 0x080c, -- 0xb3d3, 0x20e1, 0x3000, 0x7828, 0x7828, 0x0056, 0x080c, 0x6875, -- 0x005e, 0x0c40, 0x2001, 0xb50e, 0x2004, 0xd08c, 0x0178, 0x2001, -- 0xb500, 0x2004, 0xa086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, -- 0x8048, 0x2518, 0x080c, 0x3ecd, 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, 0x6709, 0x0005, 0xa196, -- 0x2000, 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118, 0x080c, 0x4490, -- 0x0ca8, 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80, 0x080c, 0x67b5, -- 0x0c68, 0x00c6, 0x6a84, 0x82ff, 0x0904, 0x65fe, 0x7110, 0xa18c, -- 0xff00, 0x810f, 0xa196, 0x0001, 0x0120, 0xa196, 0x0023, 0x1904, -- 0x65fe, 0xa08e, 0x0023, 0x1570, 0x080c, 0x6850, 0x0904, 0x65fe, -- 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150, 0x7034, 0xa005, -- 0x1904, 0x65fe, 0x2009, 0x0015, 0x080c, 0x8646, 0x0804, 0x65fe, -- 0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, 0x2009, 0x0015, -- 0x080c, 0x8646, 0x0804, 0x65fe, 0xa08e, 0x0100, 0x1904, 0x65fe, -- 0x7034, 0xa005, 0x1904, 0x65fe, 0x2009, 0x0016, 0x080c, 0x8646, -- 0x0804, 0x65fe, 0xa08e, 0x0022, 0x1904, 0x65fe, 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, -- 0x2847, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x281d, -- 0x6952, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0xb500, -- 0x70a6, 0x00ee, 0x7034, 0xa005, 0x1904, 0x65fe, 0x2009, 0x0017, -- 0x0804, 0x65c4, 0xa08e, 0x0400, 0x1158, 0x7034, 0xa005, 0x1904, -- 0x65fe, 0x68d4, 0xc0a5, 0x68d6, 0x2009, 0x0030, 0x0804, 0x65c4, -- 0xa08e, 0x0500, 0x1140, 0x7034, 0xa005, 0x1904, 0x65fe, 0x2009, -- 0x0018, 0x0804, 0x65c4, 0xa08e, 0x2010, 0x1120, 0x2009, 0x0019, -- 0x0804, 0x65c4, 0xa08e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, -- 0x65c4, 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005, 0x1904, 0x65fe, -- 0x2009, 0x001b, 0x0804, 0x65c4, 0xa08e, 0x5000, 0x1140, 0x7034, -- 0xa005, 0x1904, 0x65fe, 0x2009, 0x001c, 0x0804, 0x65c4, 0xa08e, -- 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, 0x65c4, 0xa08e, 0x1200, -- 0x1140, 0x7034, 0xa005, 0x1904, 0x65fe, 0x2009, 0x0024, 0x0804, -- 0x65c4, 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, 0xbb8d, -- 0x8208, 0x2204, 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, -- 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x3ecd, 0x004e, -- 0x8108, 0x1f04, 0x65a7, 0x2009, 0x0023, 0x0070, 0xa08e, 0x6000, -- 0x1118, 0x2009, 0x003f, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009, -- 0x0045, 0x0010, 0x2009, 0x001d, 0x0016, 0x2011, 0xbb83, 0x2204, -- 0x8211, 0x220c, 0x080c, 0x281d, 0x1598, 0x080c, 0x4f4e, 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, 0x85c1, 0x0168, 0x001e, 0x611a, 0x601f, -- 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x8646, 0x00ce, 0x0005, -- 0x001e, 0x0ce0, 0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, 0x6658, -- 0x1904, 0x6655, 0xa28e, 0x0033, 0x11e8, 0x080c, 0x6850, 0x0904, -- 0x6655, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, 0x7034, -- 0xa005, 0x15d8, 0x2009, 0x0015, 0x080c, 0x8646, 0x04b0, 0xa08e, -- 0x0100, 0x1598, 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c, -- 0x8646, 0x0458, 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, 0x1400, -- 0x1520, 0x2009, 0x0038, 0x0016, 0x2011, 0xbb83, 0x2204, 0x8211, -- 0x220c, 0x080c, 0x281d, 0x11c0, 0x080c, 0x4f4e, 0x11a8, 0x6612, -- 0x6516, 0x00c6, 0x080c, 0x85c1, 0x0170, 0x001e, 0x611a, 0x080c, -- 0xa021, 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x8646, -- 0x080c, 0x7174, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x0005, -- 0x00f6, 0x00d6, 0x0026, 0x0016, 0x0136, 0x0146, 0x0156, 0x3c00, -- 0x0006, 0x2079, 0x0030, 0x2069, 0x0200, 0x080c, 0x1f2d, 0x1590, -- 0x080c, 0x1dd2, 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, 0x1515, 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, 0x185e, 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, -- 0x6704, 0xa596, 0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, 0xa596, -- 0xfffc, 0x1118, 0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, 0x2019, -- 0xb535, 0x231c, 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, -- 0x2071, 0xb635, 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071, -- 0xb6b6, 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, 0x66e1, 0x82ff, 0x1118, 0xa085, -- 0x0001, 0x0018, 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e, -- 0x0005, 0xa084, 0x0007, 0x000a, 0x0005, 0x6715, 0x6715, 0x6715, -- 0x6862, 0x6715, 0x6716, 0x672b, 0x67a0, 0x0005, 0x7110, 0xd1bc, -- 0x0188, 0x7120, 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xbd00, -- 0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046, -- 0x080c, 0x8646, 0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, 0x677e, -- 0x7110, 0xd1bc, 0x1904, 0x677e, 0x2011, 0xbb83, 0x2204, 0x8211, -- 0x220c, 0x080c, 0x281d, 0x1904, 0x677e, 0x080c, 0x4f4e, 0x15f0, -- 0x6612, 0x6516, 0x6000, 0xd0ec, 0x15c8, 0x6204, 0xa294, 0xff00, -- 0x8217, 0xa286, 0x0006, 0x0148, 0x6204, 0xa294, 0x00ff, 0xa286, -- 0x0006, 0x11a0, 0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, 0x85c1, -- 0x001e, 0x0530, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, -- 0x6152, 0x2009, 0x0044, 0x080c, 0x8646, 0x00c0, 0x00c6, 0x080c, -- 0x85c1, 0x001e, 0x0198, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, -- 0xa286, 0x0004, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, -- 0x6003, 0x0001, 0x080c, 0x6cd4, 0x080c, 0x7174, 0x00ce, 0x0005, -- 0x2001, 0xb50d, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, -- 0x3ecd, 0x00c6, 0x080c, 0x9ed0, 0x001e, 0x0d80, 0x611a, 0x601f, -- 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x6013, 0x0300, 0x6003, -- 0x0001, 0x6007, 0x0041, 0x080c, 0x6c8e, 0x080c, 0x7174, 0x08f0, -- 0x7110, 0xd1bc, 0x0188, 0x7020, 0x2060, 0xac84, 0x0007, 0x1160, -- 0xac82, 0xbd00, 0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, -- 0x2009, 0x0045, 0x080c, 0x8646, 0x0005, 0x0006, 0x080c, 0x2dbf, -- 0x000e, 0x1168, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, -- 0x1130, 0xa084, 0x000f, 0xa08a, 0x0006, 0x1208, 0x000b, 0x0005, -- 0x67ce, 0x67cf, 0x67ce, 0x67ce, 0x6838, 0x6844, 0x0005, 0x7110, -- 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x6837, 0x700c, 0x7108, -- 0x080c, 0x281d, 0x1904, 0x6837, 0x080c, 0x4f4e, 0x1904, 0x6837, -- 0x6612, 0x6516, 0x6204, 0x7110, 0xd1bc, 0x01f8, 0xa28c, 0x00ff, -- 0xa186, 0x0004, 0x0118, 0xa186, 0x0006, 0x15c8, 0x00c6, 0x080c, -- 0x6850, 0x00ce, 0x0904, 0x6837, 0x00c6, 0x080c, 0x85c1, 0x001e, -- 0x05f0, 0x611a, 0x080c, 0xa021, 0x601f, 0x0002, 0x7120, 0x610a, -- 0x2009, 0x0088, 0x080c, 0x8646, 0x0490, 0xa28c, 0x00ff, 0xa186, -- 0x0006, 0x0160, 0xa186, 0x0004, 0x0148, 0xa294, 0xff00, 0x8217, -- 0xa286, 0x0004, 0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, 0x080c, -- 0x85c1, 0x001e, 0x01e0, 0x611a, 0x080c, 0xa021, 0x601f, 0x0005, -- 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x8646, 0x0080, 0x00c6, -- 0x080c, 0x85c1, 0x001e, 0x0158, 0x611a, 0x080c, 0xa021, 0x601f, -- 0x0004, 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x8646, 0x0005, -- 0x7110, 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, -- 0x0089, 0x080c, 0x8646, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, -- 0x0130, 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x8646, 0x0005, -- 0x7020, 0x2060, 0xac84, 0x0007, 0x1158, 0xac82, 0xbd00, 0x0240, -- 0x2001, 0xb517, 0x2004, 0xac02, 0x1218, 0xa085, 0x0001, 0x0005, -- 0xa006, 0x0ce8, 0x7110, 0xd1bc, 0x1178, 0x7024, 0x2060, 0xac84, -- 0x0007, 0x1150, 0xac82, 0xbd00, 0x0238, 0x685c, 0xac02, 0x1220, -- 0x2009, 0x0051, 0x080c, 0x8646, 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, 0x85c1, -- 0x0598, 0x0066, 0x00c6, 0x0046, 0x2011, 0xbb83, 0x2204, 0x8211, -- 0x220c, 0x080c, 0x281d, 0x1580, 0x080c, 0x4f4e, 0x1568, 0x6612, -- 0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c, 0xa021, 0x080c, -- 0x15f8, 0x01f0, 0x2d00, 0x6056, 0x6803, 0x0000, 0x6837, 0x0000, -- 0x6c3a, 0xadf8, 0x000f, 0x20a9, 0x000e, 0x2fa0, 0x2e98, 0x53a3, -- 0x006e, 0x6612, 0x6007, 0x003e, 0x601f, 0x0001, 0x6003, 0x0001, -- 0x080c, 0x6cd4, 0x080c, 0x7174, 0x00fe, 0x00de, 0x00ce, 0x0005, -- 0x080c, 0x8617, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x2071, -- 0xb7f3, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7076, -- 0x7012, 0x7017, 0xbd00, 0x7007, 0x0000, 0x7026, 0x702b, 0x7d92, -- 0x7032, 0x7037, 0x7df2, 0x703b, 0xffff, 0x703f, 0xffff, 0x7042, -- 0x7047, 0x444c, 0x704a, 0x705b, 0x6a2c, 0x2001, 0xb7a1, 0x2003, -- 0x0003, 0x2001, 0xb7a3, 0x2003, 0x0100, 0x3a00, 0xa084, 0x0005, -- 0x706e, 0x0005, 0x2071, 0xb7f3, 0x1d04, 0x698c, 0x2091, 0x6000, -- 0x700c, 0x8001, 0x700e, 0x1518, 0x700f, 0x0361, 0x7007, 0x0001, -- 0x0126, 0x2091, 0x8000, 0x7040, 0xa00d, 0x0128, 0x8109, 0x7142, -- 0x1110, 0x7044, 0x080f, 0x00c6, 0x2061, 0xb500, 0x6034, 0x00ce, -- 0xd0cc, 0x0180, 0x3a00, 0xa084, 0x0005, 0x726c, 0xa216, 0x0150, -- 0x706e, 0x2011, 0x8043, 0x2018, 0x080c, 0x3ecd, 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, 0x7e37, 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, 0x69b2, 0x69b3, -- 0x69cb, 0x00e6, 0x2071, 0xb7f3, 0x7018, 0xa005, 0x1120, 0x711a, -- 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, -- 0xb7f3, 0x701c, 0xa206, 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, -- 0x0005, 0x00e6, 0x2071, 0xb7f3, 0x6088, 0xa102, 0x0208, 0x618a, -- 0x00ee, 0x0005, 0x0005, 0x7110, 0x080c, 0x4faa, 0x1158, 0x6088, -- 0x8001, 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x7174, 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, 0x7007, -- 0x0002, 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, -- 0x603c, 0xa005, 0x0128, 0x8001, 0x603e, 0x1110, 0x080c, 0x9f0f, -- 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, 0x99df, 0x012e, 0xac88, 0x0018, 0x7116, 0x2001, -- 0xed00, 0xa102, 0x0220, 0x7017, 0xbd00, 0x7007, 0x0000, 0x0005, -- 0x00e6, 0x2071, 0xb7f3, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, -- 0x0005, 0x2001, 0xb7fc, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, -- 0xb7f3, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0xb7ff, -- 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0xb7f3, 0x711a, 0x721e, -- 0x700b, 0x0009, 0x00ee, 0x0005, 0x00c6, 0x0026, 0x7054, 0x8000, -- 0x7056, 0x2061, 0xb7a1, 0x6008, 0xa086, 0x0000, 0x0158, 0x7068, -- 0x6032, 0x7064, 0x602e, 0x7060, 0x602a, 0x705c, 0x6026, 0x2c10, -- 0x080c, 0x1643, 0x002e, 0x00ce, 0x0005, 0x0006, 0x0016, 0x00c6, -- 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x68fa, 0x00fe, 0x00ee, 0x00de, -- 0x00ce, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0xb7f3, 0x7176, -- 0x727a, 0x7073, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, -- 0xb7f3, 0x7078, 0xa206, 0x1110, 0x7076, 0x707a, 0x000e, 0x00ee, -- 0x0005, 0x00c6, 0x2061, 0xb874, 0x00ce, 0x0005, 0xa184, 0x000f, -- 0x8003, 0x8003, 0x8003, 0xa080, 0xb874, 0x2060, 0x0005, 0x6854, -- 0xa08a, 0x199a, 0x0210, 0x2001, 0x1999, 0xa005, 0x1150, 0x00c6, -- 0x2061, 0xb874, 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, 0x6af2, -- 0x0005, 0xd0fc, 0x0138, 0xa084, 0x0003, 0x0120, 0xa086, 0x0003, -- 0x1904, 0x6aec, 0x6020, 0xd0d4, 0x0130, 0xc0d4, 0x6022, 0x6860, -- 0x602a, 0x685c, 0x602e, 0x2009, 0xb574, 0x2104, 0xd084, 0x0138, -- 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x8646, 0x0005, 0x87ff, -- 0x1120, 0x2009, 0x0043, 0x080c, 0x8646, 0x0005, 0xd0fc, 0x0130, -- 0xa084, 0x0003, 0x0118, 0xa086, 0x0003, 0x11f0, 0x87ff, 0x1120, -- 0x2009, 0x0042, 0x080c, 0x8646, 0x0005, 0xd0fc, 0x0160, 0xa084, -- 0x0003, 0xa08e, 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, -- 0x080c, 0x8646, 0x0005, 0x0061, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, -- 0x0043, 0x080c, 0x8646, 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, 0xb874, 0x6200, -- 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, -- 0x5409, 0x6010, 0xa06d, 0x0076, 0x2039, 0x0000, 0x190c, 0x6a77, -- 0x007e, 0x00de, 0x0005, 0x0156, 0x00c6, 0x2061, 0xb874, 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, 0x6b38, 0x8086, 0x818e, -- 0x0005, 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, -- 0x8213, 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x6b48, 0x0028, -- 0xa11a, 0x2308, 0x8210, 0x1f04, 0x6b48, 0x0006, 0x3200, 0xa084, -- 0xefff, 0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, -- 0x1000, 0x0cb8, 0x0126, 0x2091, 0x2800, 0x2079, 0xb7e0, 0x012e, -- 0x00d6, 0x2069, 0xb7e0, 0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, -- 0xa085, 0x8001, 0x206a, 0x00de, 0x0005, 0x00c6, 0x6027, 0x0001, -- 0x7804, 0xa084, 0x0007, 0x0002, 0x6b86, 0x6ba7, 0x6bfa, 0x6b8c, -- 0x6ba7, 0x6b86, 0x6b84, 0x6b84, 0x080c, 0x1515, 0x080c, 0x6a11, -- 0x080c, 0x7174, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, -- 0x0005, 0x2011, 0x4add, 0x080c, 0x699d, 0x7828, 0xa092, 0x00c8, -- 0x1228, 0x8000, 0x782a, 0x080c, 0x4b17, 0x0c88, 0x080c, 0x4add, -- 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0c40, 0x080c, -- 0x6a11, 0x3c00, 0x0006, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, -- 0x000e, 0x20e0, 0x82ff, 0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, -- 0x0000, 0x7824, 0xa065, 0x090c, 0x1515, 0x2009, 0x0013, 0x080c, -- 0x8646, 0x00ce, 0x0005, 0x3900, 0xa082, 0xb92c, 0x1210, 0x080c, -- 0x832c, 0x00c6, 0x7824, 0xa065, 0x090c, 0x1515, 0x7804, 0xa086, -- 0x0004, 0x0904, 0x6c3a, 0x7828, 0xa092, 0x2710, 0x1230, 0x8000, -- 0x782a, 0x00ce, 0x080c, 0x7d6e, 0x0c20, 0x6104, 0xa186, 0x0003, -- 0x1188, 0x00e6, 0x2071, 0xb500, 0x70e0, 0x00ee, 0xd08c, 0x0150, -- 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb500, 0x080c, 0x4b20, -- 0x00ee, 0x00ce, 0x080c, 0xb438, 0x2009, 0x0014, 0x080c, 0x8646, -- 0x00ce, 0x0838, 0x2001, 0xb7fc, 0x2003, 0x0000, 0x62c0, 0x82ff, -- 0x1160, 0x782b, 0x0000, 0x7824, 0xa065, 0x090c, 0x1515, 0x2009, -- 0x0013, 0x080c, 0x869a, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x3900, -- 0xa082, 0xb92c, 0x1210, 0x080c, 0x832c, 0x7824, 0xa005, 0x090c, -- 0x1515, 0x781c, 0xa06d, 0x090c, 0x1515, 0x6800, 0xc0dc, 0x6802, -- 0x7924, 0x2160, 0x080c, 0x8617, 0x693c, 0x81ff, 0x090c, 0x1515, -- 0x8109, 0x693e, 0x6854, 0xa015, 0x0110, 0x7a1e, 0x0010, 0x7918, -- 0x791e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, 0x080c, -- 0x7174, 0x0888, 0x6104, 0xa186, 0x0002, 0x0128, 0xa186, 0x0004, -- 0x0110, 0x0804, 0x6bd3, 0x7808, 0xac06, 0x0904, 0x6bd3, 0x080c, -- 0x7091, 0x080c, 0x6cd4, 0x00ce, 0x080c, 0x7174, 0x0804, 0x6bc1, -- 0x00c6, 0x6027, 0x0002, 0x62c8, 0x60c4, 0xa205, 0x1178, 0x793c, -- 0xa1e5, 0x0000, 0x0130, 0x2009, 0x0049, 0x080c, 0x8646, 0x00ce, -- 0x0005, 0x2011, 0xb7ff, 0x2013, 0x0000, 0x0cc8, 0x3908, 0xa192, -- 0xb92c, 0x1210, 0x080c, 0x832c, 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, -- 0xb7e0, 0x6020, 0x8000, 0x6022, 0x6010, 0xa005, 0x0148, 0xa080, -- 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, -- 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0xb7e0, 0x6000, 0xd0d4, -- 0x0168, 0x6820, 0x8000, 0x6822, 0xa086, 0x0001, 0x1110, 0x2c00, -- 0x681e, 0x6804, 0xa084, 0x0007, 0x0804, 0x717a, 0xc0d5, 0x6002, -- 0x6818, 0xa005, 0x0158, 0x6056, 0x605b, 0x0000, 0x0006, 0x2c00, -- 0x681a, 0x00de, 0x685a, 0x2069, 0xb7e0, 0x0c18, 0x6056, 0x605a, -- 0x2c00, 0x681a, 0x681e, 0x08e8, 0x0006, 0x0016, 0x00c6, 0x0126, -- 0x2091, 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0xb7e0, 0x6020, -- 0x8000, 0x6022, 0x6008, 0xa005, 0x0148, 0xa080, 0x0003, 0x2102, -- 0x610a, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, 0x610a, -- 0x0cc0, 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0xb7e0, 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, 0xb7e0, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, -- 0x0904, 0x6d7c, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, -- 0x6d77, 0x87ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x6d77, 0x703c, -- 0xac06, 0x1190, 0x0036, 0x2019, 0x0001, 0x080c, 0x7fe5, 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, 0x9c54, -- 0x01c8, 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x1580, 0x6837, -- 0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, -- 0x9ec6, 0x080c, 0xb374, 0x080c, 0x5409, 0x007e, 0x003e, 0x001e, -- 0x080c, 0x9e0b, 0x080c, 0x9e17, 0x00ce, 0x0804, 0x6d17, 0x2c78, -- 0x600c, 0x2060, 0x0804, 0x6d17, 0x85ff, 0x0120, 0x0036, 0x080c, -- 0x7231, 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, -- 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, -- 0xa086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xb374, -- 0x080c, 0xb08d, 0x007e, 0x003e, 0x001e, 0x08a0, 0x601c, 0xa086, -- 0x000a, 0x0904, 0x6d61, 0x0804, 0x6d5f, 0x0006, 0x0066, 0x00c6, -- 0x00d6, 0x00f6, 0x2031, 0x0000, 0x0126, 0x2091, 0x8000, 0x2079, -- 0xb7e0, 0x7838, 0xa065, 0x0568, 0x600c, 0x0006, 0x600f, 0x0000, -- 0x783c, 0xac06, 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x7fe5, -- 0x7833, 0x0000, 0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, -- 0x784b, 0x0000, 0x003e, 0x080c, 0x9c54, 0x0178, 0x6010, 0x2068, -- 0x601c, 0xa086, 0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, 0x6847, -- 0x0000, 0x080c, 0x5409, 0x080c, 0x9e0b, 0x080c, 0x9e17, 0x000e, -- 0x0888, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x006e, -- 0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, 0xb08d, -- 0x0c60, 0x601c, 0xa086, 0x000a, 0x0d08, 0x08f0, 0x0016, 0x0026, -- 0x0086, 0x2041, 0x0000, 0x0099, 0x080c, 0x6ec4, 0x008e, 0x002e, -- 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0xb7e0, 0x2091, 0x8000, -- 0x080c, 0x6f51, 0x080c, 0x6fc3, 0x012e, 0x00fe, 0x0005, 0x00f6, -- 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, -- 0x8000, 0x2071, 0xb7e0, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, -- 0x6e9a, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x6e95, -- 0x88ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x6e95, 0x7024, 0xac06, -- 0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x6a11, -- 0x080c, 0x7d7b, 0x68c3, 0x0000, 0x080c, 0x8247, 0x7027, 0x0000, -+ 0x2001, 0xb78f, 0x2004, 0x080c, 0x2872, 0x60e2, 0x2001, 0xb50c, -+ 0x200c, 0xc1b4, 0x2102, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, -+ 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x0046, -+ 0x00c6, 0x00e6, 0x2061, 0x0100, 0x2071, 0xb500, 0x7130, 0xd184, -+ 0x1180, 0x2011, 0xb553, 0x2214, 0xd2ec, 0x0138, 0xc18d, 0x7132, -+ 0x2011, 0xb553, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, -+ 0x5d68, 0x7130, 0xc185, 0x7132, 0x2011, 0xb553, 0x220c, 0xd1a4, -+ 0x0530, 0x0016, 0x2019, 0x000e, 0x080c, 0xb065, 0x0156, 0x20a9, -+ 0x007f, 0x2009, 0x0000, 0xa186, 0x007e, 0x01a0, 0xa186, 0x0080, -+ 0x0188, 0x080c, 0x4fa9, 0x1170, 0x8127, 0xa006, 0x0016, 0x2009, -+ 0x000e, 0x080c, 0xb0e8, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, -+ 0x6b1a, 0x001e, 0x8108, 0x1f04, 0x5d33, 0x015e, 0x001e, 0xd1ac, -+ 0x1148, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c, 0x2c6f, -+ 0x001e, 0x0070, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0x080c, -+ 0x4fa9, 0x1110, 0x080c, 0x4c0b, 0x8108, 0x1f04, 0x5d5f, 0x015e, -+ 0x080c, 0x1e47, 0x2011, 0x0003, 0x080c, 0x8075, 0x2011, 0x0002, -+ 0x080c, 0x807f, 0x080c, 0x7f59, 0x0036, 0x2019, 0x0000, 0x080c, -+ 0x7fe4, 0x003e, 0x60e3, 0x0000, 0x2001, 0xb500, 0x2003, 0x0001, -+ 0x080c, 0x5a07, 0x00ee, 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0x0005, 0x2071, 0xb5e2, 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, 0xb5e2, -+ 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, 0xb5e2, 0x7004, 0x0043, 0x700c, 0x0002, 0x5de4, -+ 0x5ddb, 0x5ddb, 0x5ddb, 0x5ddb, 0x0005, 0x5e3a, 0x5e3b, 0x5e6d, -+ 0x5e6e, 0x5e38, 0x5ebc, 0x5ec1, 0x5ef2, 0x5ef3, 0x5f0e, 0x5f0f, -+ 0x5f10, 0x5f11, 0x5f12, 0x5f13, 0x5fc9, 0x5ff0, 0x700c, 0x0002, -+ 0x5dfd, 0x5e38, 0x5e38, 0x5e39, 0x5e39, 0x7830, 0x7930, 0xa106, -+ 0x0120, 0x7830, 0x7930, 0xa106, 0x1510, 0x7030, 0xa10a, 0x01f8, -+ 0x1210, 0x712c, 0xa10a, 0xa18a, 0x0002, 0x12d0, 0x080c, 0x15df, -+ 0x01b0, 0x2d00, 0x705a, 0x7063, 0x0040, 0x2001, 0x0003, 0x7057, -+ 0x0000, 0x0126, 0x0006, 0x2091, 0x8000, 0x2009, 0xb812, 0x2104, -+ 0xc085, 0x200a, 0x000e, 0x700e, 0x012e, 0x080c, 0x165f, 0x0005, -+ 0x080c, 0x15df, 0x0de0, 0x2d00, 0x705a, 0x080c, 0x15df, 0x1108, -+ 0x0c10, 0x2d00, 0x7086, 0x7063, 0x0080, 0x2001, 0x0004, 0x08f8, -+ 0x0005, 0x0005, 0x0005, 0x700c, 0x0002, 0x5e42, 0x5e45, 0x5e53, -+ 0x5e6c, 0x5e6c, 0x080c, 0x5df6, 0x0005, 0x0126, 0x8001, 0x700e, -+ 0x7058, 0x0006, 0x080c, 0x6343, 0x0120, 0x2091, 0x8000, 0x080c, -+ 0x5df6, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, 0x6343, -+ 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, -+ 0x6834, 0xa084, 0x00ff, 0xa08a, 0x003a, 0x1218, 0x00db, 0x012e, -+ 0x0005, 0x012e, 0x080c, 0x5f14, 0x0005, 0x0005, 0x0005, 0x00e6, -+ 0x2071, 0xb5e2, 0x700c, 0x0002, 0x5e79, 0x5e79, 0x5e79, 0x5e7b, -+ 0x5e7e, 0x00ee, 0x0005, 0x700f, 0x0001, 0x0010, 0x700f, 0x0002, -+ 0x00ee, 0x0005, 0x5f14, 0x5f14, 0x5f30, 0x5f14, 0x60ad, 0x5f14, -+ 0x5f14, 0x5f14, 0x5f14, 0x5f14, 0x5f30, 0x60ef, 0x6132, 0x617b, -+ 0x618f, 0x5f14, 0x5f14, 0x5f4c, 0x5f30, 0x5f14, 0x5f14, 0x5fa6, -+ 0x623b, 0x6256, 0x5f14, 0x5f4c, 0x5f14, 0x5f14, 0x5f14, 0x5f14, -+ 0x5f9c, 0x6256, 0x5f14, 0x5f14, 0x5f14, 0x5f14, 0x5f14, 0x5f14, -+ 0x5f14, 0x5f14, 0x5f14, 0x5f60, 0x5f14, 0x5f14, 0x5f14, 0x5f14, -+ 0x5f14, 0x5f14, 0x5f14, 0x5f14, 0x5f14, 0x6361, 0x5f14, 0x5f14, -+ 0x5f14, 0x5f14, 0x5f14, 0x5f75, 0x7020, 0x2068, 0x080c, 0x160f, -+ 0x0005, 0x700c, 0x0002, 0x5ec8, 0x5ecb, 0x5ed9, 0x5ef1, 0x5ef1, -+ 0x080c, 0x5df6, 0x0005, 0x0126, 0x8001, 0x700e, 0x7058, 0x0006, -+ 0x080c, 0x6343, 0x0120, 0x2091, 0x8000, 0x080c, 0x5df6, 0x00de, -+ 0x0048, 0x0126, 0x8001, 0x700e, 0x080c, 0x6343, 0x7058, 0x2068, -+ 0x7084, 0x705a, 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, -+ 0x00ff, 0xa08a, 0x001a, 0x1218, 0x003b, 0x012e, 0x0005, 0x012e, -+ 0x0419, 0x0005, 0x0005, 0x0005, 0x5f14, 0x5f30, 0x6099, 0x5f14, -+ 0x5f30, 0x5f14, 0x5f30, 0x5f30, 0x5f14, 0x5f30, 0x6099, 0x5f30, -+ 0x5f30, 0x5f30, 0x5f30, 0x5f30, 0x5f14, 0x5f30, 0x6099, 0x5f14, -+ 0x5f14, 0x5f30, 0x5f14, 0x5f14, 0x5f14, 0x5f30, 0x0005, 0x0005, -+ 0x0005, 0x0005, 0x0005, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, -+ 0x00ff, 0xc0d5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x5408, -+ 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0e5, -+ 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x5408, 0x012e, 0x0005, -+ 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0ed, 0x683a, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x5408, 0x012e, 0x0005, 0x7007, 0x0001, -+ 0x6838, 0xa084, 0x00ff, 0xc0dd, 0x683a, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x5408, 0x012e, 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, -+ 0x0988, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x6059, 0x7007, -+ 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x6059, 0x0005, -+ 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x5f22, 0x8001, 0x1120, -+ 0x7007, 0x0001, 0x0804, 0x6076, 0x7007, 0x0006, 0x7012, 0x2d00, -+ 0x7016, 0x701a, 0x704b, 0x6076, 0x0005, 0x6834, 0x8007, 0xa084, -+ 0x00ff, 0xa086, 0x0001, 0x1904, 0x5f22, 0x7007, 0x0001, 0x2009, -+ 0xb531, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff, 0x683a, -+ 0x6853, 0x0000, 0x080c, 0x4d82, 0x1108, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x5408, 0x012e, -+ 0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0, 0xa086, -+ 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x626e, 0x2d00, 0x7016, -+ 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1, 0xb60d, -+ 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x5f3e, 0x6a84, -+ 0xa28a, 0x0002, 0x1a04, 0x5f3e, 0x82ff, 0x1138, 0x6888, 0x698c, -+ 0xa105, 0x0118, 0x2001, 0x602c, 0x0018, 0xa280, 0x6022, 0x2005, -+ 0x70c6, 0x7010, 0xa015, 0x0904, 0x600e, 0x080c, 0x15df, 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, 0x1643, -+ 0x7090, 0xa08e, 0x0100, 0x0170, 0xa086, 0x0200, 0x0118, 0x7007, -+ 0x0010, 0x0005, 0x7020, 0x2068, 0x080c, 0x160f, 0x7014, 0x2068, -+ 0x0804, 0x5f3e, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, 0x0000, -+ 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x5fc9, 0x7014, 0x2068, -+ 0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c, 0xa105, -+ 0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, 0x0904, -+ 0x626e, 0x04b8, 0x6024, 0x6028, 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, 0xb531, 0x210c, 0x81ff, 0x1198, 0x6838, 0xa084, -+ 0x00ff, 0x683a, 0x080c, 0x4c64, 0x1108, 0x0005, 0x080c, 0x54db, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x9ecc, 0x080c, 0x5408, 0x012e, -+ 0x0ca0, 0x2001, 0x0028, 0x2009, 0x0000, 0x0c80, 0x2009, 0xb531, -+ 0x210c, 0x81ff, 0x11b0, 0x6858, 0xa005, 0x01c0, 0x6838, 0xa084, -+ 0x00ff, 0x683a, 0x6853, 0x0000, 0x080c, 0x4d26, 0x1108, 0x0005, -+ 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, 0x5408, 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, 0x4fa9, 0x11b8, 0x0066, 0x6e50, 0x080c, 0x50a8, 0x006e, -+ 0x0088, 0x0046, 0x2011, 0xb50c, 0x2224, 0xc484, 0x2412, 0x004e, -+ 0x00c6, 0x080c, 0x4fa9, 0x1110, 0x080c, 0x5209, 0x8108, 0x1f04, -+ 0x60d9, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, 0x160f, 0x0005, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x5408, 0x012e, 0x0005, 0x0126, -+ 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, 0xb553, 0x2004, 0xd0a4, -+ 0x0580, 0x2061, 0xb874, 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, -+ 0x6332, 0x012e, 0x0804, 0x632c, 0x012e, 0x0804, 0x6326, 0x012e, -+ 0x0804, 0x6329, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2001, -+ 0xb553, 0x2004, 0xd0a4, 0x05e0, 0x2061, 0xb874, 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, 0x6332, 0x012e, 0x0804, 0x632f, -+ 0x012e, 0x0804, 0x632c, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, -+ 0x2061, 0xb874, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, -+ 0x630a, 0x012e, 0x0804, 0x6340, 0x012e, 0x0804, 0x632f, 0x0126, -+ 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0x684c, 0xd0ac, 0x0148, -+ 0x00c6, 0x2061, 0xb874, 0x6000, 0xa084, 0xfcff, 0x6002, 0x00ce, -+ 0x0448, 0x6858, 0xa005, 0x05d0, 0x685c, 0xa065, 0x0598, 0x2001, -+ 0xb531, 0x2004, 0xa005, 0x0118, 0x080c, 0x9e1d, 0x0068, 0x6013, -+ 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950, 0x6156, -+ 0x2009, 0x0041, 0x080c, 0x864c, 0x6958, 0xa18c, 0xff00, 0xa186, -+ 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, 0xfdff, 0x080c, -+ 0x6b1a, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, 0xb874, 0x6000, -+ 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, -+ 0x0804, 0x6332, 0x00ce, 0x012e, 0x0804, 0x632c, 0x6954, 0xa186, -+ 0x002e, 0x0d40, 0xa186, 0x002d, 0x0d28, 0xa186, 0x0045, 0x0528, -+ 0xa186, 0x002a, 0x1130, 0x2001, 0xb50c, 0x200c, 0xc194, 0x2102, -+ 0x08c8, 0xa186, 0x0020, 0x0170, 0xa186, 0x0029, 0x1d18, 0x6944, -+ 0xa18c, 0xff00, 0x810f, 0x080c, 0x4fa9, 0x1960, 0x6000, 0xc0e4, -+ 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, 0x0024, 0x2001, -+ 0xb7b6, 0x2004, 0x6016, 0x0804, 0x61ca, 0x685c, 0xa065, 0x0950, -+ 0x00e6, 0x6860, 0xa075, 0x2001, 0xb531, 0x2004, 0xa005, 0x0150, -+ 0x080c, 0x9e1d, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9e1d, 0x00ee, -+ 0x0804, 0x61ca, 0x6020, 0xc0dc, 0xc0d5, 0x6022, 0x2e60, 0x6007, -+ 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, 0x6874, 0x602a, -+ 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x6c8d, 0x080c, 0x7173, -+ 0x00ee, 0x0804, 0x61ca, 0x2061, 0xb874, 0x6000, 0xd084, 0x0190, -+ 0xd08c, 0x1904, 0x6340, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, -+ 0x0220, 0x6206, 0x012e, 0x0804, 0x6340, 0x012e, 0x6853, 0x0016, -+ 0x0804, 0x6339, 0x6853, 0x0007, 0x0804, 0x6339, 0x6834, 0x8007, -+ 0xa084, 0x00ff, 0x1118, 0x080c, 0x5f22, 0x0078, 0x2030, 0x8001, -+ 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, 0x0006, 0x7012, -+ 0x2d00, 0x7016, 0x701a, 0x704b, 0x626e, 0x0005, 0x00e6, 0x0126, -+ 0x2091, 0x8000, 0xa03e, 0x2009, 0xb531, 0x210c, 0x81ff, 0x1904, -+ 0x62ec, 0x2009, 0xb50c, 0x210c, 0xd194, 0x1904, 0x6316, 0x6848, -+ 0x2070, 0xae82, 0xbd00, 0x0a04, 0x62e0, 0x2001, 0xb517, 0x2004, -+ 0xae02, 0x1a04, 0x62e0, 0x711c, 0xa186, 0x0006, 0x1904, 0x62cf, -+ 0x7018, 0xa005, 0x0904, 0x62ec, 0x2004, 0xd0e4, 0x1904, 0x6311, -+ 0x2061, 0xb874, 0x6100, 0xa184, 0x0301, 0xa086, 0x0001, 0x1550, -+ 0x7020, 0xd0dc, 0x1904, 0x6319, 0x6853, 0x0000, 0x6803, 0x0000, -+ 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, 0xd0f4, 0x1904, -+ 0x631c, 0x2e60, 0x080c, 0x6a76, 0x012e, 0x00ee, 0x0005, 0x2068, -+ 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, 0xd0f4, 0x1904, -+ 0x631c, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, 0x6853, 0x0006, -+ 0x0804, 0x6339, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, 0x00b8, 0x6944, -+ 0xa18c, 0xff00, 0x810f, 0x080c, 0x4fa9, 0x15d8, 0x6000, 0xd0e4, -+ 0x15c0, 0x711c, 0xa186, 0x0007, 0x1118, 0x6853, 0x0002, 0x0498, -+ 0x6853, 0x0008, 0x0480, 0x6853, 0x000e, 0x0468, 0x6853, 0x0017, -+ 0x0450, 0x6853, 0x0035, 0x0438, 0x2001, 0xb572, 0x2004, 0xd0fc, -+ 0x01e8, 0x6848, 0x2070, 0xae82, 0xbd00, 0x02c0, 0x605c, 0xae02, -+ 0x12a8, 0x711c, 0xa186, 0x0006, 0x1188, 0x7018, 0xa005, 0x0170, -+ 0x2004, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0xa086, 0x0007, -+ 0x1904, 0x6279, 0x7003, 0x0002, 0x0804, 0x6279, 0x6853, 0x0028, -+ 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, 0x6853, 0x002a, -+ 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, 0x0002, 0x6017, -+ 0x0014, 0x080c, 0xace0, 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, 0x5408, 0x012e, 0x0005, -+ 0x080c, 0x160f, 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, 0x6a6d, 0x00de, -+ 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x7007, 0x0001, -+ 0x6a44, 0xa282, 0x0004, 0x1a04, 0x63ac, 0xd284, 0x0170, 0x6a4c, -+ 0xa290, 0xb635, 0x2204, 0xa065, 0x6004, 0x05e0, 0x8007, 0xa084, -+ 0x00ff, 0xa084, 0x0006, 0x1108, 0x04a8, 0x2c10, 0x080c, 0x85c7, -+ 0x1118, 0x080c, 0x9ed6, 0x05a0, 0x621a, 0x6844, 0x0002, 0x638b, -+ 0x6390, 0x6393, 0x6399, 0x2019, 0x0002, 0x080c, 0xb065, 0x0060, -+ 0x080c, 0xaffc, 0x0048, 0x2019, 0x0002, 0x6950, 0x080c, 0xb017, -+ 0x0018, 0x6950, 0x080c, 0xaffc, 0x080c, 0x861d, 0x6857, 0x0000, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x5408, 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, 0x2dbf, 0x11d0, 0x080c, 0x6603, 0x0098, 0x20e1, -+ 0x0004, 0x3d60, 0xd1bc, 0x1108, 0x3e60, 0xac84, 0x0007, 0x1170, -+ 0xac82, 0xbd00, 0x0258, 0x685c, 0xac02, 0x1240, 0x2009, 0x0047, -+ 0x080c, 0x864c, 0x7a1c, 0xd284, 0x1938, 0x0005, 0xa016, 0x080c, -+ 0x185e, 0x0cc0, 0x0cd8, 0x781c, 0xd08c, 0x0500, 0x0156, 0x0136, -+ 0x0146, 0x20e1, 0x3000, 0x3d20, 0x3e28, 0xa584, 0x0076, 0x1538, -+ 0xa484, 0x7000, 0xa086, 0x1000, 0x11a8, 0x080c, 0x647e, 0x01f8, -+ 0x20e1, 0x3000, 0x7828, 0x7828, 0x080c, 0x649a, 0x014e, 0x013e, -+ 0x015e, 0x2009, 0xb7e8, 0x2104, 0xa005, 0x1108, 0x0005, 0x080c, -+ 0x7173, 0x0ce0, 0xa484, 0x7000, 0x1548, 0x080c, 0x647e, 0x01d8, -+ 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x0d10, 0x00a0, 0xd5a4, -+ 0x0178, 0x0056, 0x0046, 0x080c, 0x1e6e, 0x080c, 0x24b0, 0x2001, -+ 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x004e, 0x005e, 0x0048, -+ 0x04a9, 0x6887, 0x0000, 0x080c, 0xb3df, 0x20e1, 0x3000, 0x7828, -+ 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e, 0x0880, 0x0439, 0x1130, -+ 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, 0x1d68, 0x080c, 0xb3df, -+ 0x20e1, 0x3000, 0x7828, 0x7828, 0x0056, 0x080c, 0x6874, 0x005e, -+ 0x0c40, 0x2001, 0xb50e, 0x2004, 0xd08c, 0x0178, 0x2001, 0xb500, -+ 0x2004, 0xa086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, -+ 0x2518, 0x080c, 0x3ecc, 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, 0x6708, 0x0005, 0xa196, 0x2000, -+ 0x1148, 0x6900, 0xa18e, 0x0001, 0x1118, 0x080c, 0x448f, 0x0ca8, -+ 0x0039, 0x0c98, 0xa196, 0x8000, 0x1d80, 0x080c, 0x67b4, 0x0c68, -+ 0x00c6, 0x6a84, 0x82ff, 0x0904, 0x65fd, 0x7110, 0xa18c, 0xff00, -+ 0x810f, 0xa196, 0x0001, 0x0120, 0xa196, 0x0023, 0x1904, 0x65fd, -+ 0xa08e, 0x0023, 0x1570, 0x080c, 0x684f, 0x0904, 0x65fd, 0x7124, -+ 0x610a, 0x7030, 0xa08e, 0x0200, 0x1150, 0x7034, 0xa005, 0x1904, -+ 0x65fd, 0x2009, 0x0015, 0x080c, 0x864c, 0x0804, 0x65fd, 0xa08e, -+ 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, -+ 0x864c, 0x0804, 0x65fd, 0xa08e, 0x0100, 0x1904, 0x65fd, 0x7034, -+ 0xa005, 0x1904, 0x65fd, 0x2009, 0x0016, 0x080c, 0x864c, 0x0804, -+ 0x65fd, 0xa08e, 0x0022, 0x1904, 0x65fd, 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, 0x2847, -+ 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x281d, 0x6952, -+ 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0xb500, 0x70a6, -+ 0x00ee, 0x7034, 0xa005, 0x1904, 0x65fd, 0x2009, 0x0017, 0x0804, -+ 0x65c3, 0xa08e, 0x0400, 0x1158, 0x7034, 0xa005, 0x1904, 0x65fd, -+ 0x68d4, 0xc0a5, 0x68d6, 0x2009, 0x0030, 0x0804, 0x65c3, 0xa08e, -+ 0x0500, 0x1140, 0x7034, 0xa005, 0x1904, 0x65fd, 0x2009, 0x0018, -+ 0x0804, 0x65c3, 0xa08e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, -+ 0x65c3, 0xa08e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x65c3, -+ 0xa08e, 0x5200, 0x1140, 0x7034, 0xa005, 0x1904, 0x65fd, 0x2009, -+ 0x001b, 0x0804, 0x65c3, 0xa08e, 0x5000, 0x1140, 0x7034, 0xa005, -+ 0x1904, 0x65fd, 0x2009, 0x001c, 0x0804, 0x65c3, 0xa08e, 0x1300, -+ 0x1120, 0x2009, 0x0034, 0x0804, 0x65c3, 0xa08e, 0x1200, 0x1140, -+ 0x7034, 0xa005, 0x1904, 0x65fd, 0x2009, 0x0024, 0x0804, 0x65c3, -+ 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, 0xbb8d, 0x8208, -+ 0x2204, 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, -+ 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x3ecc, 0x004e, 0x8108, -+ 0x1f04, 0x65a6, 0x2009, 0x0023, 0x0070, 0xa08e, 0x6000, 0x1118, -+ 0x2009, 0x003f, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009, 0x0045, -+ 0x0010, 0x2009, 0x001d, 0x0016, 0x2011, 0xbb83, 0x2204, 0x8211, -+ 0x220c, 0x080c, 0x281d, 0x1598, 0x080c, 0x4f4d, 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, 0x85c7, 0x0168, 0x001e, 0x611a, 0x601f, 0x0004, -+ 0x7120, 0x610a, 0x001e, 0x080c, 0x864c, 0x00ce, 0x0005, 0x001e, -+ 0x0ce0, 0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, 0x6657, 0x1904, -+ 0x6654, 0xa28e, 0x0033, 0x11e8, 0x080c, 0x684f, 0x0904, 0x6654, -+ 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, 0x7034, 0xa005, -+ 0x15d8, 0x2009, 0x0015, 0x080c, 0x864c, 0x04b0, 0xa08e, 0x0100, -+ 0x1598, 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c, 0x864c, -+ 0x0458, 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, 0x1400, 0x1520, -+ 0x2009, 0x0038, 0x0016, 0x2011, 0xbb83, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x281d, 0x11c0, 0x080c, 0x4f4d, 0x11a8, 0x6612, 0x6516, -+ 0x00c6, 0x080c, 0x85c7, 0x0170, 0x001e, 0x611a, 0x080c, 0xa027, -+ 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x864c, 0x080c, -+ 0x7173, 0x0010, 0x00ce, 0x001e, 0x004e, 0x00ce, 0x0005, 0x00f6, -+ 0x00d6, 0x0026, 0x0016, 0x0136, 0x0146, 0x0156, 0x3c00, 0x0006, -+ 0x2079, 0x0030, 0x2069, 0x0200, 0x080c, 0x1f2d, 0x1590, 0x080c, -+ 0x1dd2, 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, 0x1515, 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, 0x185e, 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, 0x6703, -+ 0xa596, 0xfffe, 0x1118, 0x2009, 0x007e, 0x04e8, 0xa596, 0xfffc, -+ 0x1118, 0x2009, 0x0080, 0x04b8, 0x2011, 0x0000, 0x2019, 0xb535, -+ 0x231c, 0xd3ac, 0x0138, 0x2021, 0x0000, 0x20a9, 0x00ff, 0x2071, -+ 0xb635, 0x0030, 0x2021, 0x0081, 0x20a9, 0x007e, 0x2071, 0xb6b6, -+ 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, 0x66e0, 0x82ff, 0x1118, 0xa085, 0x0001, -+ 0x0018, 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e, 0x0005, -+ 0xa084, 0x0007, 0x000a, 0x0005, 0x6714, 0x6714, 0x6714, 0x6861, -+ 0x6714, 0x6715, 0x672a, 0x679f, 0x0005, 0x7110, 0xd1bc, 0x0188, -+ 0x7120, 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xbd00, 0x0248, -+ 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, -+ 0x864c, 0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, 0x677d, 0x7110, -+ 0xd1bc, 0x1904, 0x677d, 0x2011, 0xbb83, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x281d, 0x1904, 0x677d, 0x080c, 0x4f4d, 0x15f0, 0x6612, -+ 0x6516, 0x6000, 0xd0ec, 0x15c8, 0x6204, 0xa294, 0xff00, 0x8217, -+ 0xa286, 0x0006, 0x0148, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, -+ 0x11a0, 0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, 0x85c7, 0x001e, -+ 0x0530, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, -+ 0x2009, 0x0044, 0x080c, 0x864c, 0x00c0, 0x00c6, 0x080c, 0x85c7, -+ 0x001e, 0x0198, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, -+ 0x0004, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, -+ 0x0001, 0x080c, 0x6cd3, 0x080c, 0x7173, 0x00ce, 0x0005, 0x2001, -+ 0xb50d, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x3ecc, -+ 0x00c6, 0x080c, 0x9ed6, 0x001e, 0x0d80, 0x611a, 0x601f, 0x0006, -+ 0x7120, 0x610a, 0x7130, 0x6152, 0x6013, 0x0300, 0x6003, 0x0001, -+ 0x6007, 0x0041, 0x080c, 0x6c8d, 0x080c, 0x7173, 0x08f0, 0x7110, -+ 0xd1bc, 0x0188, 0x7020, 0x2060, 0xac84, 0x0007, 0x1160, 0xac82, -+ 0xbd00, 0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, -+ 0x0045, 0x080c, 0x864c, 0x0005, 0x0006, 0x080c, 0x2dbf, 0x000e, -+ 0x1168, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x1130, -+ 0xa084, 0x000f, 0xa08a, 0x0006, 0x1208, 0x000b, 0x0005, 0x67cd, -+ 0x67ce, 0x67cd, 0x67cd, 0x6837, 0x6843, 0x0005, 0x7110, 0xd1bc, -+ 0x0120, 0x702c, 0xd084, 0x0904, 0x6836, 0x700c, 0x7108, 0x080c, -+ 0x281d, 0x1904, 0x6836, 0x080c, 0x4f4d, 0x1904, 0x6836, 0x6612, -+ 0x6516, 0x6204, 0x7110, 0xd1bc, 0x01f8, 0xa28c, 0x00ff, 0xa186, -+ 0x0004, 0x0118, 0xa186, 0x0006, 0x15c8, 0x00c6, 0x080c, 0x684f, -+ 0x00ce, 0x0904, 0x6836, 0x00c6, 0x080c, 0x85c7, 0x001e, 0x05f0, -+ 0x611a, 0x080c, 0xa027, 0x601f, 0x0002, 0x7120, 0x610a, 0x2009, -+ 0x0088, 0x080c, 0x864c, 0x0490, 0xa28c, 0x00ff, 0xa186, 0x0006, -+ 0x0160, 0xa186, 0x0004, 0x0148, 0xa294, 0xff00, 0x8217, 0xa286, -+ 0x0004, 0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, 0x080c, 0x85c7, -+ 0x001e, 0x01e0, 0x611a, 0x080c, 0xa027, 0x601f, 0x0005, 0x7120, -+ 0x610a, 0x2009, 0x0088, 0x080c, 0x864c, 0x0080, 0x00c6, 0x080c, -+ 0x85c7, 0x001e, 0x0158, 0x611a, 0x080c, 0xa027, 0x601f, 0x0004, -+ 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x864c, 0x0005, 0x7110, -+ 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089, -+ 0x080c, 0x864c, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, -+ 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x864c, 0x0005, 0x7020, -+ 0x2060, 0xac84, 0x0007, 0x1158, 0xac82, 0xbd00, 0x0240, 0x2001, -+ 0xb517, 0x2004, 0xac02, 0x1218, 0xa085, 0x0001, 0x0005, 0xa006, -+ 0x0ce8, 0x7110, 0xd1bc, 0x1178, 0x7024, 0x2060, 0xac84, 0x0007, -+ 0x1150, 0xac82, 0xbd00, 0x0238, 0x685c, 0xac02, 0x1220, 0x2009, -+ 0x0051, 0x080c, 0x864c, 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, 0x85c7, 0x0598, -+ 0x0066, 0x00c6, 0x0046, 0x2011, 0xbb83, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x281d, 0x1580, 0x080c, 0x4f4d, 0x1568, 0x6612, 0x6516, -+ 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c, 0xa027, 0x080c, 0x15f8, -+ 0x01f0, 0x2d00, 0x6056, 0x6803, 0x0000, 0x6837, 0x0000, 0x6c3a, -+ 0xadf8, 0x000f, 0x20a9, 0x000e, 0x2fa0, 0x2e98, 0x53a3, 0x006e, -+ 0x6612, 0x6007, 0x003e, 0x601f, 0x0001, 0x6003, 0x0001, 0x080c, -+ 0x6cd3, 0x080c, 0x7173, 0x00fe, 0x00de, 0x00ce, 0x0005, 0x080c, -+ 0x861d, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x2071, 0xb7f3, -+ 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, 0x7076, 0x7012, -+ 0x7017, 0xbd00, 0x7007, 0x0000, 0x7026, 0x702b, 0x7d91, 0x7032, -+ 0x7037, 0x7df1, 0x703b, 0xffff, 0x703f, 0xffff, 0x7042, 0x7047, -+ 0x444b, 0x704a, 0x705b, 0x6a2b, 0x2001, 0xb7a1, 0x2003, 0x0003, -+ 0x2001, 0xb7a3, 0x2003, 0x0100, 0x3a00, 0xa084, 0x0005, 0x706e, -+ 0x0005, 0x2071, 0xb7f3, 0x1d04, 0x698b, 0x2091, 0x6000, 0x700c, -+ 0x8001, 0x700e, 0x1518, 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, -+ 0x2091, 0x8000, 0x7040, 0xa00d, 0x0128, 0x8109, 0x7142, 0x1110, -+ 0x7044, 0x080f, 0x00c6, 0x2061, 0xb500, 0x6034, 0x00ce, 0xd0cc, -+ 0x0180, 0x3a00, 0xa084, 0x0005, 0x726c, 0xa216, 0x0150, 0x706e, -+ 0x2011, 0x8043, 0x2018, 0x080c, 0x3ecc, 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, 0x7e36, 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, 0x69b1, 0x69b2, 0x69ca, -+ 0x00e6, 0x2071, 0xb7f3, 0x7018, 0xa005, 0x1120, 0x711a, 0x721e, -+ 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0xb7f3, -+ 0x701c, 0xa206, 0x1110, 0x701a, 0x701e, 0x000e, 0x00ee, 0x0005, -+ 0x00e6, 0x2071, 0xb7f3, 0x6088, 0xa102, 0x0208, 0x618a, 0x00ee, -+ 0x0005, 0x0005, 0x7110, 0x080c, 0x4fa9, 0x1158, 0x6088, 0x8001, -+ 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, 0x080c, 0x7173, -+ 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, 0x7007, 0x0002, -+ 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x603c, -+ 0xa005, 0x0128, 0x8001, 0x603e, 0x1110, 0x080c, 0x9f15, 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, 0x99e5, 0x012e, 0xac88, 0x0018, 0x7116, 0x2001, 0xed00, -+ 0xa102, 0x0220, 0x7017, 0xbd00, 0x7007, 0x0000, 0x0005, 0x00e6, -+ 0x2071, 0xb7f3, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, -+ 0x2001, 0xb7fc, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0xb7f3, -+ 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0xb7ff, 0x2013, -+ 0x0000, 0x0005, 0x00e6, 0x2071, 0xb7f3, 0x711a, 0x721e, 0x700b, -+ 0x0009, 0x00ee, 0x0005, 0x00c6, 0x0026, 0x7054, 0x8000, 0x7056, -+ 0x2061, 0xb7a1, 0x6008, 0xa086, 0x0000, 0x0158, 0x7068, 0x6032, -+ 0x7064, 0x602e, 0x7060, 0x602a, 0x705c, 0x6026, 0x2c10, 0x080c, -+ 0x1643, 0x002e, 0x00ce, 0x0005, 0x0006, 0x0016, 0x00c6, 0x00d6, -+ 0x00e6, 0x00f6, 0x080c, 0x68f9, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0xb7f3, 0x7176, 0x727a, -+ 0x7073, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0xb7f3, -+ 0x7078, 0xa206, 0x1110, 0x7076, 0x707a, 0x000e, 0x00ee, 0x0005, -+ 0x00c6, 0x2061, 0xb874, 0x00ce, 0x0005, 0xa184, 0x000f, 0x8003, -+ 0x8003, 0x8003, 0xa080, 0xb874, 0x2060, 0x0005, 0x6854, 0xa08a, -+ 0x199a, 0x0210, 0x2001, 0x1999, 0xa005, 0x1150, 0x00c6, 0x2061, -+ 0xb874, 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, 0x6af1, 0x0005, -+ 0xd0fc, 0x0138, 0xa084, 0x0003, 0x0120, 0xa086, 0x0003, 0x1904, -+ 0x6aeb, 0x6020, 0xd0d4, 0x0130, 0xc0d4, 0x6022, 0x6860, 0x602a, -+ 0x685c, 0x602e, 0x2009, 0xb574, 0x2104, 0xd084, 0x0138, 0x87ff, -+ 0x1120, 0x2009, 0x0042, 0x080c, 0x864c, 0x0005, 0x87ff, 0x1120, -+ 0x2009, 0x0043, 0x080c, 0x864c, 0x0005, 0xd0fc, 0x0130, 0xa084, -+ 0x0003, 0x0118, 0xa086, 0x0003, 0x11f0, 0x87ff, 0x1120, 0x2009, -+ 0x0042, 0x080c, 0x864c, 0x0005, 0xd0fc, 0x0160, 0xa084, 0x0003, -+ 0xa08e, 0x0002, 0x0148, 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, -+ 0x864c, 0x0005, 0x0061, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, -+ 0x080c, 0x864c, 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, 0xb874, 0x6200, 0xd28c, -+ 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, 0x5408, -+ 0x6010, 0xa06d, 0x0076, 0x2039, 0x0000, 0x190c, 0x6a76, 0x007e, -+ 0x00de, 0x0005, 0x0156, 0x00c6, 0x2061, 0xb874, 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, 0x6b37, 0x8086, 0x818e, 0x0005, -+ 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, -+ 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x6b47, 0x0028, 0xa11a, -+ 0x2308, 0x8210, 0x1f04, 0x6b47, 0x0006, 0x3200, 0xa084, 0xefff, -+ 0x2080, 0x000e, 0x015e, 0x0005, 0x0006, 0x3200, 0xa085, 0x1000, -+ 0x0cb8, 0x0126, 0x2091, 0x2800, 0x2079, 0xb7e0, 0x012e, 0x00d6, -+ 0x2069, 0xb7e0, 0x6803, 0x0005, 0x2069, 0x0004, 0x2d04, 0xa085, -+ 0x8001, 0x206a, 0x00de, 0x0005, 0x00c6, 0x6027, 0x0001, 0x7804, -+ 0xa084, 0x0007, 0x0002, 0x6b85, 0x6ba6, 0x6bf9, 0x6b8b, 0x6ba6, -+ 0x6b85, 0x6b83, 0x6b83, 0x080c, 0x1515, 0x080c, 0x6a10, 0x080c, -+ 0x7173, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, -+ 0x2011, 0x4adc, 0x080c, 0x699c, 0x7828, 0xa092, 0x00c8, 0x1228, -+ 0x8000, 0x782a, 0x080c, 0x4b16, 0x0c88, 0x080c, 0x4adc, 0x7807, -+ 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0c40, 0x080c, 0x6a10, -+ 0x3c00, 0x0006, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x000e, -+ 0x20e0, 0x82ff, 0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, -+ 0x7824, 0xa065, 0x090c, 0x1515, 0x2009, 0x0013, 0x080c, 0x864c, -+ 0x00ce, 0x0005, 0x3900, 0xa082, 0xb92c, 0x1210, 0x080c, 0x8332, -+ 0x00c6, 0x7824, 0xa065, 0x090c, 0x1515, 0x7804, 0xa086, 0x0004, -+ 0x0904, 0x6c39, 0x7828, 0xa092, 0x2710, 0x1230, 0x8000, 0x782a, -+ 0x00ce, 0x080c, 0x7d6d, 0x0c20, 0x6104, 0xa186, 0x0003, 0x1188, -+ 0x00e6, 0x2071, 0xb500, 0x70e0, 0x00ee, 0xd08c, 0x0150, 0x00c6, -+ 0x00e6, 0x2061, 0x0100, 0x2071, 0xb500, 0x080c, 0x4b1f, 0x00ee, -+ 0x00ce, 0x080c, 0xb444, 0x2009, 0x0014, 0x080c, 0x864c, 0x00ce, -+ 0x0838, 0x2001, 0xb7fc, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, -+ 0x782b, 0x0000, 0x7824, 0xa065, 0x090c, 0x1515, 0x2009, 0x0013, -+ 0x080c, 0x86a0, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, -+ 0xb92c, 0x1210, 0x080c, 0x8332, 0x7824, 0xa005, 0x090c, 0x1515, -+ 0x781c, 0xa06d, 0x090c, 0x1515, 0x6800, 0xc0dc, 0x6802, 0x7924, -+ 0x2160, 0x080c, 0x861d, 0x693c, 0x81ff, 0x090c, 0x1515, 0x8109, -+ 0x693e, 0x6854, 0xa015, 0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, -+ 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, 0x080c, 0x7173, -+ 0x0888, 0x6104, 0xa186, 0x0002, 0x0128, 0xa186, 0x0004, 0x0110, -+ 0x0804, 0x6bd2, 0x7808, 0xac06, 0x0904, 0x6bd2, 0x080c, 0x7090, -+ 0x080c, 0x6cd3, 0x00ce, 0x080c, 0x7173, 0x0804, 0x6bc0, 0x00c6, -+ 0x6027, 0x0002, 0x62c8, 0x60c4, 0xa205, 0x1178, 0x793c, 0xa1e5, -+ 0x0000, 0x0130, 0x2009, 0x0049, 0x080c, 0x864c, 0x00ce, 0x0005, -+ 0x2011, 0xb7ff, 0x2013, 0x0000, 0x0cc8, 0x3908, 0xa192, 0xb92c, -+ 0x1210, 0x080c, 0x8332, 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, 0xb7e0, -+ 0x6020, 0x8000, 0x6022, 0x6010, 0xa005, 0x0148, 0xa080, 0x0003, -+ 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x6116, -+ 0x6112, 0x0cc0, 0x00d6, 0x2069, 0xb7e0, 0x6000, 0xd0d4, 0x0168, -+ 0x6820, 0x8000, 0x6822, 0xa086, 0x0001, 0x1110, 0x2c00, 0x681e, -+ 0x6804, 0xa084, 0x0007, 0x0804, 0x7179, 0xc0d5, 0x6002, 0x6818, -+ 0xa005, 0x0158, 0x6056, 0x605b, 0x0000, 0x0006, 0x2c00, 0x681a, -+ 0x00de, 0x685a, 0x2069, 0xb7e0, 0x0c18, 0x6056, 0x605a, 0x2c00, -+ 0x681a, 0x681e, 0x08e8, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, -+ 0x8000, 0x600f, 0x0000, 0x2c08, 0x2061, 0xb7e0, 0x6020, 0x8000, -+ 0x6022, 0x6008, 0xa005, 0x0148, 0xa080, 0x0003, 0x2102, 0x610a, -+ 0x012e, 0x00ce, 0x001e, 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, -+ 0x00c6, 0x600f, 0x0000, 0x2c08, 0x2061, 0xb7e0, 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, -+ 0xb7e0, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, -+ 0x6d7b, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x6d76, -+ 0x87ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x6d76, 0x703c, 0xac06, -+ 0x1190, 0x0036, 0x2019, 0x0001, 0x080c, 0x7fe4, 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, 0x9c5a, 0x01c8, -+ 0x6010, 0x2068, 0x601c, 0xa086, 0x0003, 0x1580, 0x6837, 0x0103, -+ 0x6b4a, 0x6847, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0x9ecc, -+ 0x080c, 0xb380, 0x080c, 0x5408, 0x007e, 0x003e, 0x001e, 0x080c, -+ 0x9e11, 0x080c, 0x9e1d, 0x00ce, 0x0804, 0x6d16, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0x6d16, 0x85ff, 0x0120, 0x0036, 0x080c, 0x7230, -+ 0x003e, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, -+ 0x007e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, -+ 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xb380, 0x080c, -+ 0xb099, 0x007e, 0x003e, 0x001e, 0x08a0, 0x601c, 0xa086, 0x000a, -+ 0x0904, 0x6d60, 0x0804, 0x6d5e, 0x0006, 0x0066, 0x00c6, 0x00d6, -+ 0x00f6, 0x2031, 0x0000, 0x0126, 0x2091, 0x8000, 0x2079, 0xb7e0, -+ 0x7838, 0xa065, 0x0568, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, -+ 0xac06, 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x7fe4, 0x7833, -+ 0x0000, 0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, 0x784b, -+ 0x0000, 0x003e, 0x080c, 0x9c5a, 0x0178, 0x6010, 0x2068, 0x601c, -+ 0xa086, 0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -+ 0x080c, 0x5408, 0x080c, 0x9e11, 0x080c, 0x9e1d, 0x000e, 0x0888, -+ 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, -+ 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, 0xb099, 0x0c60, -+ 0x601c, 0xa086, 0x000a, 0x0d08, 0x08f0, 0x0016, 0x0026, 0x0086, -+ 0x2041, 0x0000, 0x0099, 0x080c, 0x6ec3, 0x008e, 0x002e, 0x001e, -+ 0x0005, 0x00f6, 0x0126, 0x2079, 0xb7e0, 0x2091, 0x8000, 0x080c, -+ 0x6f50, 0x080c, 0x6fc2, 0x012e, 0x00fe, 0x0005, 0x00f6, 0x00e6, -+ 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, -+ 0x2071, 0xb7e0, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x6e99, -+ 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, 0x6e94, 0x88ff, -+ 0x0120, 0x6050, 0xa106, 0x1904, 0x6e94, 0x7024, 0xac06, 0x1538, -+ 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x6a10, 0x080c, -+ 0x7d7a, 0x68c3, 0x0000, 0x080c, 0x824d, 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, 0x9c5a, 0x01b8, 0x601c, 0xa086, -+ 0x0003, 0x1540, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016, -+ 0x0036, 0x0086, 0x080c, 0x9ecc, 0x080c, 0xb380, 0x080c, 0x5408, -+ 0x008e, 0x003e, 0x001e, 0x080c, 0x9e11, 0x080c, 0x9e1d, 0x080c, -+ 0x811e, 0x00ce, 0x0804, 0x6e1d, 0x2c78, 0x600c, 0x2060, 0x0804, -+ 0x6e1d, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, -+ 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, 0x0016, 0x0036, -+ 0x0086, 0x080c, 0xb380, 0x080c, 0xb099, 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, 0xb635, 0x2004, 0xa065, 0x0904, 0x6f4c, 0x00f6, 0x00e6, -+ 0x00d6, 0x0066, 0x2071, 0xb7e0, 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, 0x4ed4, 0x0904, 0x6f48, 0x7624, -+ 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, 0x00d6, -+ 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, 0x6a10, 0x080c, -+ 0x7d7a, 0x68c3, 0x0000, 0x080c, 0x824d, 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, 0x9e1d, 0x00ce, 0x0048, 0x00de, 0x00c6, -+ 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x6ef3, 0x8dff, -+ 0x0158, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0x9ecc, -+ 0x080c, 0xb380, 0x080c, 0x5408, 0x080c, 0x811e, 0x0804, 0x6ef3, -+ 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x0005, -+ 0x0006, 0x0066, 0x00c6, 0x00d6, 0x2031, 0x0000, 0x7814, 0xa065, -+ 0x0904, 0x6fa2, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, 0xac06, -+ 0x1540, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, 0x6a10, -+ 0x080c, 0x7d7a, 0x68c3, 0x0000, 0x080c, 0x824d, 0x7827, 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, 0x9c54, 0x01b8, 0x601c, -- 0xa086, 0x0003, 0x1540, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -- 0x0016, 0x0036, 0x0086, 0x080c, 0x9ec6, 0x080c, 0xb374, 0x080c, -- 0x5409, 0x008e, 0x003e, 0x001e, 0x080c, 0x9e0b, 0x080c, 0x9e17, -- 0x080c, 0x811f, 0x00ce, 0x0804, 0x6e1e, 0x2c78, 0x600c, 0x2060, -- 0x0804, 0x6e1e, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, -- 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, 0x0016, -- 0x0036, 0x0086, 0x080c, 0xb374, 0x080c, 0xb08d, 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, 0xb635, 0x2004, 0xa065, 0x0904, 0x6f4d, 0x00f6, -- 0x00e6, 0x00d6, 0x0066, 0x2071, 0xb7e0, 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, 0x4ed5, 0x0904, 0x6f49, -- 0x7624, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, -- 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, 0x6a11, -- 0x080c, 0x7d7b, 0x68c3, 0x0000, 0x080c, 0x8247, 0x7027, 0x0000, -+ 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x2c30, -+ 0x00b0, 0x6010, 0x2068, 0x080c, 0x9c5a, 0x0168, 0x601c, 0xa086, -+ 0x0003, 0x11b8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, -+ 0x5408, 0x080c, 0x9e11, 0x080c, 0x9e1d, 0x080c, 0x811e, 0x000e, -+ 0x0804, 0x6f57, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, -+ 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, 0xb099, 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, 0x7028, 0x6054, 0x0006, 0x6057, 0x0000, 0x605b, 0x0000, -+ 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x4ed4, 0x0904, 0x7025, -+ 0x7e24, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, 0x15c0, -+ 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, 0x6a10, -+ 0x080c, 0x7d7a, 0x68c3, 0x0000, 0x080c, 0x824d, 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, 0x9e17, 0x00ce, 0x0048, 0x00de, -- 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x6ef4, -- 0x8dff, 0x0158, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, -- 0x9ec6, 0x080c, 0xb374, 0x080c, 0x5409, 0x080c, 0x811f, 0x0804, -- 0x6ef4, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, -- 0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x2031, 0x0000, 0x7814, -- 0xa065, 0x0904, 0x6fa3, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, -- 0xac06, 0x1540, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, -- 0x6a11, 0x080c, 0x7d7b, 0x68c3, 0x0000, 0x080c, 0x8247, 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, 0x9c54, 0x0168, 0x601c, -- 0xa086, 0x0003, 0x11b8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -- 0x080c, 0x5409, 0x080c, 0x9e0b, 0x080c, 0x9e17, 0x080c, 0x811f, -- 0x000e, 0x0804, 0x6f58, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, -- 0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, 0xb08d, -- 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, 0x7029, 0x6054, 0x0006, 0x6057, 0x0000, 0x605b, -- 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x4ed5, 0x0904, -- 0x7026, 0x7e24, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, -- 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, -- 0x6a11, 0x080c, 0x7d7b, 0x68c3, 0x0000, 0x080c, 0x8247, 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, 0x9e17, 0x00ce, 0x0048, -- 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, -- 0x6fd5, 0x8dff, 0x0138, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -- 0x080c, 0x5409, 0x080c, 0x811f, 0x0804, 0x6fd5, 0x000e, 0x0804, -- 0x6fc8, 0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, -- 0x00e6, 0x00d6, 0x0066, 0x6000, 0xd0dc, 0x01a0, 0x604c, 0xa06d, -- 0x0188, 0x6848, 0xa606, 0x1170, 0x2071, 0xb7e0, 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, 0x7d7b, 0x78c3, 0x0000, 0x080c, -- 0x8247, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0xa384, -- 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x2079, 0x0100, -- 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x8247, 0x003e, -- 0x080c, 0x4ed5, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, -- 0x2660, 0x080c, 0x8617, 0x00ce, 0x6837, 0x0103, 0x6b4a, 0x6847, -- 0x0000, 0x080c, 0x9ec6, 0x080c, 0x5409, 0x080c, 0x811f, 0x00fe, -- 0x0005, 0x00e6, 0x00c6, 0x2071, 0xb7e0, 0x7004, 0xa084, 0x0007, -- 0x0002, 0x70a3, 0x70a6, 0x70bc, 0x70d5, 0x7112, 0x70a3, 0x70a1, -- 0x70a1, 0x080c, 0x1515, 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, 0x4ed5, -- 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, 0x811f, 0x600c, 0xa015, 0x0120, -- 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, -- 0xac06, 0x1160, 0x080c, 0x811f, 0x600c, 0xa015, 0x0120, 0x7216, -- 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x601c, 0xa086, -- 0x0003, 0x1198, 0x6018, 0x2060, 0x080c, 0x4ed5, 0x6000, 0xc0dc, -- 0x6002, 0x080c, 0x811f, 0x701c, 0xa065, 0x0138, 0x6054, 0xa015, -- 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, -- 0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x811f, 0x600c, -- 0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x8247, 0x7027, -- 0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6, -- 0x2069, 0xb7e0, 0x6830, 0xa084, 0x0003, 0x0002, 0x7134, 0x7136, -- 0x715a, 0x7132, 0x080c, 0x1515, 0x00de, 0x0005, 0x00c6, 0x6840, -- 0xa086, 0x0001, 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, 0xa015, -- 0x0170, 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, -- 0x2011, 0xb7ff, 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, 0xb7e0, 0x6804, -- 0xa084, 0x0007, 0x0002, 0x7185, 0x7221, 0x7221, 0x7221, 0x7221, -- 0x7223, 0x7183, 0x7183, 0x080c, 0x1515, 0x6820, 0xa005, 0x1110, -- 0x00de, 0x0005, 0x00c6, 0x680c, 0xa065, 0x0150, 0x6807, 0x0004, -- 0x6826, 0x682b, 0x0000, 0x080c, 0x7273, 0x00ce, 0x00de, 0x0005, -- 0x6814, 0xa065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, -- 0x080c, 0x7273, 0x00ce, 0x00de, 0x0005, 0x00e6, 0x0036, 0x6a1c, -- 0xa2f5, 0x0000, 0x0904, 0x721d, 0x704c, 0xa00d, 0x0118, 0x7088, -- 0xa005, 0x01a0, 0x7054, 0xa075, 0x0120, 0xa20e, 0x0904, 0x721d, -- 0x0028, 0x6818, 0xa20e, 0x0904, 0x721d, 0x2070, 0x704c, 0xa00d, -- 0x0d88, 0x7088, 0xa005, 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038, -- 0xa302, 0x1e40, 0x080c, 0x85ee, 0x0904, 0x721d, 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, 0xb535, -- 0x2004, 0xd0ac, 0x1110, 0xd1bc, 0x0150, 0x7100, 0xd1f4, 0x0120, -- 0x7114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, -- 0x2dc4, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x080c, -- 0x78a3, 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, 0x7273, 0x00ce, 0x00de, -- 0x0005, 0x00f6, 0x00d6, 0x2069, 0xb7e0, 0x6830, 0xa086, 0x0000, -- 0x11d0, 0x2001, 0xb50c, 0x200c, 0xd1bc, 0x1560, 0x6838, 0xa07d, -- 0x0190, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, -- 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x2021, 0x1130, -- 0x012e, 0x080c, 0x7bec, 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, -- 0x5b52, 0x006e, 0x0858, 0x601c, 0xa084, 0x000f, 0x000b, 0x0005, -- 0x7281, 0x7286, 0x7744, 0x7860, 0x7286, 0x7744, 0x7860, 0x7281, -- 0x7286, 0x080c, 0x7091, 0x080c, 0x7174, 0x0005, 0x0156, 0x0136, -- 0x0146, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1515, -- 0x6118, 0x2178, 0x79a0, 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1110, -- 0xd1bc, 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff, -- 0x0040, 0x2009, 0x0000, 0x0028, 0xa1f8, 0x2dc4, 0x2f0d, 0xa18c, -- 0x00ff, 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, 0x1a04, -- 0x72fa, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, -- 0x73a9, 0x73f4, 0x7421, 0x74ee, 0x751c, 0x7524, 0x754a, 0x755b, -- 0x756c, 0x7574, 0x758a, 0x7574, 0x75eb, 0x755b, 0x760c, 0x7614, -- 0x756c, 0x7614, 0x7625, 0x72f8, 0x72f8, 0x72f8, 0x72f8, 0x72f8, -- 0x72f8, 0x72f8, 0x72f8, 0x72f8, 0x72f8, 0x72f8, 0x7e86, 0x7eab, -- 0x7ec0, 0x7ee3, 0x7f04, 0x754a, 0x72f8, 0x754a, 0x7574, 0x72f8, -- 0x7421, 0x74ee, 0x72f8, 0x8349, 0x7574, 0x72f8, 0x8369, 0x7574, -- 0x72f8, 0x756c, 0x73a2, 0x730d, 0x72f8, 0x838e, 0x8403, 0x84da, -- 0x72f8, 0x84eb, 0x7545, 0x8507, 0x72f8, 0x7f19, 0x8562, 0x72f8, -- 0x080c, 0x1515, 0x2100, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, -- 0x015e, 0x0005, 0x730b, 0x730b, 0x730b, 0x7341, 0x735f, 0x7375, -- 0x730b, 0x730b, 0x730b, 0x080c, 0x1515, 0x00d6, 0x20a1, 0x020b, -- 0x080c, 0x7642, 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, 0x7d68, -- 0x00de, 0x0005, 0x00d6, 0x7818, 0x2068, 0x68a0, 0x2069, 0xb500, -- 0x6ad4, 0xd2ac, 0x1110, 0xd0bc, 0x0110, 0xa085, 0x0001, 0x00de, -- 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x7642, 0x20a3, 0x0500, -- 0x20a3, 0x0000, 0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, -- 0x20a2, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, -- 0x20a2, 0x60c3, 0x0010, 0x080c, 0x7d68, 0x00de, 0x0005, 0x0156, -- 0x0146, 0x20a1, 0x020b, 0x080c, 0x7642, 0x20a3, 0x7800, 0x20a3, -- 0x0000, 0x7808, 0x8007, 0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0008, -- 0x080c, 0x7d68, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, -- 0x020b, 0x080c, 0x76de, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, -- 0xdf10, 0x20a3, 0x0034, 0x2099, 0xb505, 0x20a9, 0x0004, 0x53a6, -- 0x2099, 0xb501, 0x20a9, 0x0004, 0x53a6, 0x2099, 0xb7c6, 0x20a9, -- 0x001a, 0x3304, 0x8007, 0x20a2, 0x9398, 0x1f04, 0x7391, 0x20a3, -- 0x0000, 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x7d68, 0x014e, -- 0x015e, 0x0005, 0x2001, 0xb515, 0x2004, 0x609a, 0x080c, 0x7d68, -- 0x0005, 0x20a1, 0x020b, 0x080c, 0x7642, 0x20a3, 0x5200, 0x20a3, -- 0x0000, 0x00d6, 0x2069, 0xb552, 0x6804, 0xd084, 0x0150, 0x6828, -- 0x20a3, 0x0000, 0x0016, 0x080c, 0x2831, 0x21a2, 0x001e, 0x00de, -- 0x0028, 0x00de, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, -- 0x2099, 0xb505, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb501, 0x53a6, -- 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, -- 0x2004, 0xa082, 0x007f, 0x0238, 0x2001, 0xb51c, 0x20a6, 0x2001, -- 0xb51d, 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xb515, 0x2004, -- 0xa084, 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, -- 0x001c, 0x080c, 0x7d68, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7642, -- 0x20a3, 0x0500, 0x20a3, 0x0000, 0x2001, 0xb535, 0x2004, 0xd0ac, -- 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, 0x0238, -- 0x2001, 0xb51c, 0x20a6, 0x2001, 0xb51d, 0x20a6, 0x0040, 0x20a3, -- 0x0000, 0x2001, 0xb515, 0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a9, -- 0x0004, 0x2099, 0xb505, 0x53a6, 0x60c3, 0x0010, 0x080c, 0x7d68, -- 0x0005, 0x20a1, 0x020b, 0x080c, 0x7642, 0x00c6, 0x7818, 0x2060, -- 0x2001, 0x0000, 0x080c, 0x5314, 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, 0x74b0, 0x2001, 0xb535, -- 0x2004, 0xd0a4, 0x01c8, 0x2099, 0xb78e, 0x33a6, 0x9398, 0x20a3, -- 0x0000, 0x9398, 0x3304, 0xa084, 0x2000, 0x20a2, 0x9398, 0x33a6, -- 0x9398, 0x20a3, 0x0000, 0x9398, 0x2001, 0x2710, 0x20a2, 0x9398, -- 0x33a6, 0x9398, 0x33a6, 0x00d0, 0x2099, 0xb78e, 0x33a6, 0x9398, -- 0x33a6, 0x9398, 0x3304, 0x080c, 0x5ad0, 0x1118, 0xa084, 0x37ff, -- 0x0010, 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, -- 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, -- 0x2099, 0xb505, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb501, 0x53a6, -- 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x748a, 0x20a9, 0x0008, -- 0x20a3, 0x0000, 0x1f04, 0x7490, 0x2099, 0xb796, 0x3304, 0xc0dd, -- 0x20a2, 0x2001, 0xb572, 0x2004, 0xd0e4, 0x0158, 0x20a3, 0x0000, -- 0x20a3, 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6, 0x20a9, 0x0004, -- 0x0010, 0x20a9, 0x0007, 0x20a3, 0x0000, 0x1f04, 0x74ab, 0x0468, -- 0x2001, 0xb535, 0x2004, 0xd0a4, 0x0140, 0x2001, 0xb78f, 0x2004, -- 0x60e3, 0x0000, 0x080c, 0x2872, 0x60e2, 0x2099, 0xb78e, 0x20a9, -- 0x0008, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb505, 0x53a6, 0x20a9, -- 0x0004, 0x2099, 0xb501, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, -- 0x1f04, 0x74ce, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x74d4, -- 0x2099, 0xb796, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, -- 0x0000, 0x1f04, 0x74df, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, -- 0x74e5, 0x60c3, 0x0074, 0x080c, 0x7d68, 0x0005, 0x20a1, 0x020b, -- 0x080c, 0x7642, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, -- 0x20a3, 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, -- 0x00f6, 0x2079, 0xb552, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, -- 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0xa085, 0x0002, 0x00d6, -- 0x0804, 0x75cd, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, -- 0x0014, 0x080c, 0x7d68, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7642, -- 0x20a3, 0x5000, 0x0804, 0x743c, 0x20a1, 0x020b, 0x080c, 0x7642, -- 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, 0x7d68, 0x0005, 0x20a1, 0x020b, 0x080c, -- 0x76d6, 0x0020, 0x20a1, 0x020b, 0x080c, 0x76de, 0x20a3, 0x0200, -- 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, -- 0x080c, 0x7d68, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76de, 0x20a3, -- 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, -- 0x0008, 0x080c, 0x7d68, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76de, -- 0x20a3, 0x0200, 0x0804, 0x743c, 0x20a1, 0x020b, 0x080c, 0x76de, -- 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005, 0x0110, 0x20a2, -- 0x0010, 0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, -- 0x7d68, 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x76de, 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, 0xb552, 0x7904, 0x00fe, 0xd1ac, 0x1110, -- 0xa085, 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0x2009, 0xb574, -- 0x210c, 0xd184, 0x1110, 0xa085, 0x0002, 0x0026, 0x2009, 0xb572, -- 0x210c, 0xd1e4, 0x0130, 0xc0c5, 0xa094, 0x0030, 0xa296, 0x0010, -- 0x0140, 0xd1ec, 0x0130, 0xa094, 0x0030, 0xa296, 0x0010, 0x0108, -- 0xc0bd, 0x002e, 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x080c, -- 0x7d68, 0x00de, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76de, 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, 0x7d68, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76de, -- 0x20a3, 0x0200, 0x0804, 0x73af, 0x20a1, 0x020b, 0x080c, 0x76de, -- 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, -- 0x60c3, 0x0008, 0x080c, 0x7d68, 0x0005, 0x20e1, 0x9080, 0x20e1, -- 0x4000, 0x20a1, 0x020b, 0x080c, 0x76de, 0x20a3, 0x0100, 0x20a3, -- 0x0000, 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, -- 0x7d68, 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, 0xb515, 0x2214, 0x2001, 0xb79e, -- 0x2004, 0xa005, 0x0118, 0x2011, 0xb51d, 0x2214, 0x22a2, 0x04d0, -- 0xa286, 0x007f, 0x1138, 0x00d6, 0xa385, 0x00ff, 0x20a2, 0x20a3, -- 0xfffd, 0x00c8, 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1110, 0xd2bc, -- 0x01c8, 0xa286, 0x0080, 0x00d6, 0x1130, 0xa385, 0x00ff, 0x20a2, -- 0x20a3, 0xfffc, 0x0040, 0xa2e8, 0xb635, 0x2d6c, 0x6810, 0xa305, -- 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, -- 0x00de, 0x0080, 0x00d6, 0xa2e8, 0xb635, 0x2d6c, 0x6810, 0xa305, -- 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, -- 0x2214, 0x22a2, 0xa485, 0x0029, 0x20a2, 0x004e, 0x003e, 0x20a3, -- 0x0000, 0x080c, 0x7d57, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, -- 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x0026, -- 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc, -- 0x22a2, 0x00d6, 0x2069, 0xb51c, 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, 0xb535, 0x2214, -- 0xd2ac, 0x1118, 0xa092, 0x007e, 0x02d8, 0x00d6, 0xa0e8, 0xb635, -- 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x6810, 0xa005, -- 0x1140, 0x6814, 0xa005, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffe, -- 0x0028, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, -- 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, -- 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, -- 0xa485, 0x0098, 0x20a2, 0x20a3, 0x0000, 0x004e, 0x003e, 0x080c, -- 0x7d57, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, -- 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x080c, 0x7d57, 0x22a2, -- 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x7810, 0x20a2, 0x20a3, 0x0000, -- 0x20a3, 0x0000, 0x002e, 0x0005, 0x00c6, 0x00f6, 0x6004, 0xa08a, -- 0x0085, 0x0a0c, 0x1515, 0xa08a, 0x008c, 0x1a0c, 0x1515, 0x6118, -+ 0x8001, 0x603e, 0x2660, 0x080c, 0x9e1d, 0x00ce, 0x0048, 0x00de, -+ 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x6fd4, -+ 0x8dff, 0x0138, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, -+ 0x5408, 0x080c, 0x811e, 0x0804, 0x6fd4, 0x000e, 0x0804, 0x6fc7, -+ 0x781e, 0x781a, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, 0x00e6, -+ 0x00d6, 0x0066, 0x6000, 0xd0dc, 0x01a0, 0x604c, 0xa06d, 0x0188, -+ 0x6848, 0xa606, 0x1170, 0x2071, 0xb7e0, 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, 0x7d7a, 0x78c3, 0x0000, 0x080c, 0x824d, -+ 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0xa384, 0x1000, -+ 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x2079, 0x0100, 0x7824, -+ 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x824d, 0x003e, 0x080c, -+ 0x4ed4, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, 0x2660, -+ 0x080c, 0x861d, 0x00ce, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -+ 0x080c, 0x9ecc, 0x080c, 0x5408, 0x080c, 0x811e, 0x00fe, 0x0005, -+ 0x00e6, 0x00c6, 0x2071, 0xb7e0, 0x7004, 0xa084, 0x0007, 0x0002, -+ 0x70a2, 0x70a5, 0x70bb, 0x70d4, 0x7111, 0x70a2, 0x70a0, 0x70a0, -+ 0x080c, 0x1515, 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, 0x4ed4, 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, 0x811e, 0x600c, 0xa015, 0x0120, 0x720e, -+ 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, 0x7014, 0xac06, -+ 0x1160, 0x080c, 0x811e, 0x600c, 0xa015, 0x0120, 0x7216, 0x600f, -+ 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x601c, 0xa086, 0x0003, -+ 0x1198, 0x6018, 0x2060, 0x080c, 0x4ed4, 0x6000, 0xc0dc, 0x6002, -+ 0x080c, 0x811e, 0x701c, 0xa065, 0x0138, 0x6054, 0xa015, 0x0110, -+ 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, -+ 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x811e, 0x600c, 0xa015, -+ 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x824d, 0x7027, 0x0000, -+ 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, 0x00d6, 0x2069, -+ 0xb7e0, 0x6830, 0xa084, 0x0003, 0x0002, 0x7133, 0x7135, 0x7159, -+ 0x7131, 0x080c, 0x1515, 0x00de, 0x0005, 0x00c6, 0x6840, 0xa086, -+ 0x0001, 0x01b8, 0x683c, 0xa065, 0x0130, 0x600c, 0xa015, 0x0170, -+ 0x6a3a, 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, -+ 0xb7ff, 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, 0xb7e0, 0x6804, 0xa084, -+ 0x0007, 0x0002, 0x7184, 0x7220, 0x7220, 0x7220, 0x7220, 0x7222, -+ 0x7182, 0x7182, 0x080c, 0x1515, 0x6820, 0xa005, 0x1110, 0x00de, -+ 0x0005, 0x00c6, 0x680c, 0xa065, 0x0150, 0x6807, 0x0004, 0x6826, -+ 0x682b, 0x0000, 0x080c, 0x7272, 0x00ce, 0x00de, 0x0005, 0x6814, -+ 0xa065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, -+ 0x7272, 0x00ce, 0x00de, 0x0005, 0x00e6, 0x0036, 0x6a1c, 0xa2f5, -+ 0x0000, 0x0904, 0x721c, 0x704c, 0xa00d, 0x0118, 0x7088, 0xa005, -+ 0x01a0, 0x7054, 0xa075, 0x0120, 0xa20e, 0x0904, 0x721c, 0x0028, -+ 0x6818, 0xa20e, 0x0904, 0x721c, 0x2070, 0x704c, 0xa00d, 0x0d88, -+ 0x7088, 0xa005, 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, -+ 0x1e40, 0x080c, 0x85f4, 0x0904, 0x721c, 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, 0xb535, 0x2004, -+ 0xd0ac, 0x1110, 0xd1bc, 0x0150, 0x7100, 0xd1f4, 0x0120, 0x7114, -+ 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, 0x2dc4, -+ 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0x080c, 0x78a2, -+ 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, 0x7272, 0x00ce, 0x00de, 0x0005, -+ 0x00f6, 0x00d6, 0x2069, 0xb7e0, 0x6830, 0xa086, 0x0000, 0x11d0, -+ 0x2001, 0xb50c, 0x200c, 0xd1bc, 0x1560, 0x6838, 0xa07d, 0x0190, -+ 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, -+ 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x2021, 0x1130, 0x012e, -+ 0x080c, 0x7beb, 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, 0x5b51, -+ 0x006e, 0x0858, 0x601c, 0xa084, 0x000f, 0x000b, 0x0005, 0x7280, -+ 0x7285, 0x7743, 0x785f, 0x7285, 0x7743, 0x785f, 0x7280, 0x7285, -+ 0x080c, 0x7090, 0x080c, 0x7173, 0x0005, 0x0156, 0x0136, 0x0146, -+ 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1515, 0x6118, - 0x2178, 0x79a0, 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd1bc, - 0x0150, 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, - 0x2009, 0x0000, 0x0028, 0xa1f8, 0x2dc4, 0x2f0d, 0xa18c, 0x00ff, -- 0x2c78, 0x2061, 0x0100, 0x619a, 0xa082, 0x0085, 0x001b, 0x00fe, -- 0x00ce, 0x0005, 0x777b, 0x7785, 0x77a0, 0x7779, 0x7779, 0x7779, -- 0x777b, 0x080c, 0x1515, 0x0146, 0x20a1, 0x020b, 0x04a1, 0x60c3, -- 0x0000, 0x080c, 0x7d68, 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, -- 0x080c, 0x77ec, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, -- 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, -- 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x7d68, 0x014e, 0x0005, -- 0x0146, 0x20a1, 0x020b, 0x080c, 0x7826, 0x20a3, 0x0003, 0x20a3, -- 0x0300, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, -- 0x7d68, 0x014e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, -+ 0x2c78, 0x2061, 0x0100, 0x619a, 0xa08a, 0x0040, 0x1a04, 0x72f9, -+ 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x73a8, -+ 0x73f3, 0x7420, 0x74ed, 0x751b, 0x7523, 0x7549, 0x755a, 0x756b, -+ 0x7573, 0x7589, 0x7573, 0x75ea, 0x755a, 0x760b, 0x7613, 0x756b, -+ 0x7613, 0x7624, 0x72f7, 0x72f7, 0x72f7, 0x72f7, 0x72f7, 0x72f7, -+ 0x72f7, 0x72f7, 0x72f7, 0x72f7, 0x72f7, 0x7e85, 0x7eaa, 0x7ebf, -+ 0x7ee2, 0x7f03, 0x7549, 0x72f7, 0x7549, 0x7573, 0x72f7, 0x7420, -+ 0x74ed, 0x72f7, 0x834f, 0x7573, 0x72f7, 0x836f, 0x7573, 0x72f7, -+ 0x756b, 0x73a1, 0x730c, 0x72f7, 0x8394, 0x8409, 0x84e0, 0x72f7, -+ 0x84f1, 0x7544, 0x850d, 0x72f7, 0x7f18, 0x8568, 0x72f7, 0x080c, -+ 0x1515, 0x2100, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, -+ 0x0005, 0x730a, 0x730a, 0x730a, 0x7340, 0x735e, 0x7374, 0x730a, -+ 0x730a, 0x730a, 0x080c, 0x1515, 0x00d6, 0x20a1, 0x020b, 0x080c, -+ 0x7641, 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, 0x7d67, 0x00de, -+ 0x0005, 0x00d6, 0x7818, 0x2068, 0x68a0, 0x2069, 0xb500, 0x6ad4, -+ 0xd2ac, 0x1110, 0xd0bc, 0x0110, 0xa085, 0x0001, 0x00de, 0x0005, -+ 0x00d6, 0x20a1, 0x020b, 0x080c, 0x7641, 0x20a3, 0x0500, 0x20a3, -+ 0x0000, 0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, -+ 0x6810, 0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, -+ 0x60c3, 0x0010, 0x080c, 0x7d67, 0x00de, 0x0005, 0x0156, 0x0146, -+ 0x20a1, 0x020b, 0x080c, 0x7641, 0x20a3, 0x7800, 0x20a3, 0x0000, -+ 0x7808, 0x8007, 0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, -+ 0x7d67, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, -+ 0x080c, 0x76dd, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a3, 0xdf10, -+ 0x20a3, 0x0034, 0x2099, 0xb505, 0x20a9, 0x0004, 0x53a6, 0x2099, -+ 0xb501, 0x20a9, 0x0004, 0x53a6, 0x2099, 0xb7c6, 0x20a9, 0x001a, -+ 0x3304, 0x8007, 0x20a2, 0x9398, 0x1f04, 0x7390, 0x20a3, 0x0000, -+ 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x7d67, 0x014e, 0x015e, -+ 0x0005, 0x2001, 0xb515, 0x2004, 0x609a, 0x080c, 0x7d67, 0x0005, -+ 0x20a1, 0x020b, 0x080c, 0x7641, 0x20a3, 0x5200, 0x20a3, 0x0000, -+ 0x00d6, 0x2069, 0xb552, 0x6804, 0xd084, 0x0150, 0x6828, 0x20a3, -+ 0x0000, 0x0016, 0x080c, 0x2831, 0x21a2, 0x001e, 0x00de, 0x0028, -+ 0x00de, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, -+ 0xb505, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb501, 0x53a6, 0x2001, -+ 0xb535, 0x2004, 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, -+ 0xa082, 0x007f, 0x0238, 0x2001, 0xb51c, 0x20a6, 0x2001, 0xb51d, -+ 0x20a6, 0x0040, 0x20a3, 0x0000, 0x2001, 0xb515, 0x2004, 0xa084, -+ 0x00ff, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, -+ 0x080c, 0x7d67, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7641, 0x20a3, -+ 0x0500, 0x20a3, 0x0000, 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1138, -+ 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007f, 0x0238, 0x2001, -+ 0xb51c, 0x20a6, 0x2001, 0xb51d, 0x20a6, 0x0040, 0x20a3, 0x0000, -+ 0x2001, 0xb515, 0x2004, 0xa084, 0x00ff, 0x20a2, 0x20a9, 0x0004, -+ 0x2099, 0xb505, 0x53a6, 0x60c3, 0x0010, 0x080c, 0x7d67, 0x0005, -+ 0x20a1, 0x020b, 0x080c, 0x7641, 0x00c6, 0x7818, 0x2060, 0x2001, -+ 0x0000, 0x080c, 0x5313, 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, 0x74af, 0x2001, 0xb535, 0x2004, -+ 0xd0a4, 0x01c8, 0x2099, 0xb78e, 0x33a6, 0x9398, 0x20a3, 0x0000, -+ 0x9398, 0x3304, 0xa084, 0x2000, 0x20a2, 0x9398, 0x33a6, 0x9398, -+ 0x20a3, 0x0000, 0x9398, 0x2001, 0x2710, 0x20a2, 0x9398, 0x33a6, -+ 0x9398, 0x33a6, 0x00d0, 0x2099, 0xb78e, 0x33a6, 0x9398, 0x33a6, -+ 0x9398, 0x3304, 0x080c, 0x5acf, 0x1118, 0xa084, 0x37ff, 0x0010, -+ 0xa084, 0x3fff, 0x20a2, 0x9398, 0x33a6, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a9, 0x0004, 0x2099, -+ 0xb505, 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb501, 0x53a6, 0x20a9, -+ 0x0008, 0x20a3, 0x0000, 0x1f04, 0x7489, 0x20a9, 0x0008, 0x20a3, -+ 0x0000, 0x1f04, 0x748f, 0x2099, 0xb796, 0x3304, 0xc0dd, 0x20a2, -+ 0x2001, 0xb572, 0x2004, 0xd0e4, 0x0158, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x9398, 0x9398, 0x9398, 0x33a6, 0x20a9, 0x0004, 0x0010, -+ 0x20a9, 0x0007, 0x20a3, 0x0000, 0x1f04, 0x74aa, 0x0468, 0x2001, -+ 0xb535, 0x2004, 0xd0a4, 0x0140, 0x2001, 0xb78f, 0x2004, 0x60e3, -+ 0x0000, 0x080c, 0x2872, 0x60e2, 0x2099, 0xb78e, 0x20a9, 0x0008, -+ 0x53a6, 0x20a9, 0x0004, 0x2099, 0xb505, 0x53a6, 0x20a9, 0x0004, -+ 0x2099, 0xb501, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, -+ 0x74cd, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x74d3, 0x2099, -+ 0xb796, 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, -+ 0x1f04, 0x74de, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x74e4, -+ 0x60c3, 0x0074, 0x080c, 0x7d67, 0x0005, 0x20a1, 0x020b, 0x080c, -+ 0x7641, 0x20a3, 0x2010, 0x20a3, 0x0014, 0x20a3, 0x0800, 0x20a3, -+ 0x2000, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x00f6, -+ 0x2079, 0xb552, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, 0x0020, -+ 0xd1a4, 0x0110, 0xa085, 0x0010, 0xa085, 0x0002, 0x00d6, 0x0804, -+ 0x75cc, 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, -+ 0x080c, 0x7d67, 0x0005, 0x20a1, 0x020b, 0x080c, 0x7641, 0x20a3, -+ 0x5000, 0x0804, 0x743b, 0x20a1, 0x020b, 0x080c, 0x7641, 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, 0x7d67, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76d5, -+ 0x0020, 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, 0x0200, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, -+ 0x7d67, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, 0x0100, -+ 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, -+ 0x080c, 0x7d67, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, -+ 0x0200, 0x0804, 0x743b, 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, -+ 0x0100, 0x20a3, 0x0000, 0x7828, 0xa005, 0x0110, 0x20a2, 0x0010, -+ 0x20a3, 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d67, -+ 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x76dd, 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, 0xb552, 0x7904, 0x00fe, 0xd1ac, 0x1110, 0xa085, -+ 0x0020, 0xd1a4, 0x0110, 0xa085, 0x0010, 0x2009, 0xb574, 0x210c, -+ 0xd184, 0x1110, 0xa085, 0x0002, 0x0026, 0x2009, 0xb572, 0x210c, -+ 0xd1e4, 0x0130, 0xc0c5, 0xa094, 0x0030, 0xa296, 0x0010, 0x0140, -+ 0xd1ec, 0x0130, 0xa094, 0x0030, 0xa296, 0x0010, 0x0108, 0xc0bd, -+ 0x002e, 0x20a2, 0x20a2, 0x20a2, 0x60c3, 0x0014, 0x080c, 0x7d67, -+ 0x00de, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76dd, 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, 0x7d67, 0x0005, 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, -+ 0x0200, 0x0804, 0x73ae, 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, -+ 0x0100, 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, -+ 0x0008, 0x080c, 0x7d67, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, -+ 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, 0x0100, 0x20a3, 0x0000, -+ 0x20a3, 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x7d67, -+ 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, 0xb515, 0x2214, 0x2001, 0xb79e, 0x2004, -+ 0xa005, 0x0118, 0x2011, 0xb51d, 0x2214, 0x22a2, 0x04d0, 0xa286, -+ 0x007f, 0x1138, 0x00d6, 0xa385, 0x00ff, 0x20a2, 0x20a3, 0xfffd, -+ 0x00c8, 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1110, 0xd2bc, 0x01c8, -+ 0xa286, 0x0080, 0x00d6, 0x1130, 0xa385, 0x00ff, 0x20a2, 0x20a3, -+ 0xfffc, 0x0040, 0xa2e8, 0xb635, 0x2d6c, 0x6810, 0xa305, 0x20a2, -+ 0x6814, 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, -+ 0x0080, 0x00d6, 0xa2e8, 0xb635, 0x2d6c, 0x6810, 0xa305, 0x20a2, -+ 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, -+ 0x22a2, 0xa485, 0x0029, 0x20a2, 0x004e, 0x003e, 0x20a3, 0x0000, -+ 0x080c, 0x7d56, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, 0xffff, -+ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x0026, 0x20e1, -+ 0x9080, 0x20e1, 0x4000, 0x20a3, 0x02ff, 0x2011, 0xfffc, 0x22a2, -+ 0x00d6, 0x2069, 0xb51c, 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, 0xb535, 0x2214, 0xd2ac, -+ 0x1118, 0xa092, 0x007e, 0x02d8, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, -+ 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, 0x6810, 0xa005, 0x1140, -+ 0x6814, 0xa005, 0x1128, 0x20a3, 0x00ff, 0x20a3, 0xfffe, 0x0028, -+ 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0080, 0x00d6, -+ 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa305, 0x20a2, 0x6814, 0x20a2, -+ 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, 0xa485, -+ 0x0098, 0x20a2, 0x20a3, 0x0000, 0x004e, 0x003e, 0x080c, 0x7d56, -+ 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, -+ 0x20a3, 0x0000, 0x002e, 0x0005, 0x080c, 0x7d56, 0x22a2, 0x20a3, -+ 0x0000, 0x7a08, 0x22a2, 0x7810, 0x20a2, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x002e, 0x0005, 0x00c6, 0x00f6, 0x6004, 0xa08a, 0x0085, -+ 0x0a0c, 0x1515, 0xa08a, 0x008c, 0x1a0c, 0x1515, 0x6118, 0x2178, -+ 0x79a0, 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, -+ 0x7900, 0xd1f4, 0x0120, 0x7914, 0xa18c, 0x00ff, 0x0040, 0x2009, -+ 0x0000, 0x0028, 0xa1f8, 0x2dc4, 0x2f0d, 0xa18c, 0x00ff, 0x2c78, -+ 0x2061, 0x0100, 0x619a, 0xa082, 0x0085, 0x001b, 0x00fe, 0x00ce, -+ 0x0005, 0x777a, 0x7784, 0x779f, 0x7778, 0x7778, 0x7778, 0x777a, -+ 0x080c, 0x1515, 0x0146, 0x20a1, 0x020b, 0x04a1, 0x60c3, 0x0000, -+ 0x080c, 0x7d67, 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, -+ 0x77eb, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, -+ 0x20a2, 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x60c3, 0x000c, 0x080c, 0x7d67, 0x014e, 0x0005, 0x0146, -+ 0x20a1, 0x020b, 0x080c, 0x7825, 0x20a3, 0x0003, 0x20a3, 0x0300, -+ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x7d67, -+ 0x014e, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, -+ 0xa080, 0x0028, 0x2004, 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1118, -+ 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, -+ 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, 0x2da6, -+ 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, -+ 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, -+ 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, 0x20a3, 0x0009, 0x20a3, -+ 0x0000, 0x0804, 0x76a8, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, - 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb535, 0x2214, 0xd2ac, - 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, -- 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, -+ 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, - 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb635, -- 0x2d6c, 0x6810, 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x00de, -- 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, 0x20a3, 0x0009, -- 0x20a3, 0x0000, 0x0804, 0x76a9, 0x0026, 0x20e1, 0x9080, 0x20e1, -- 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb535, 0x2214, -- 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, 0xb635, -- 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, -- 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, -- 0xb635, 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, -- 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, 0x2001, -- 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804, 0x7735, 0x0026, 0x20e1, -- 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, -- 0xb535, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, -+ 0x2d6c, 0x6810, 0xa085, 0x8400, 0x20a2, 0x6814, 0x20a2, 0x00de, -+ 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, 0x2001, 0x0099, -+ 0x20a2, 0x20a3, 0x0000, 0x0804, 0x7734, 0x0026, 0x20e1, 0x9080, -+ 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb535, -+ 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0288, 0x00d6, 0xa0e8, -+ 0xb635, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, 0x20a2, -+ 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, - 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, 0x6814, -- 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, -- 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x8500, 0x20a2, -- 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, -- 0x22a2, 0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804, 0x7735, -- 0x00c6, 0x00f6, 0x2c78, 0x7804, 0xa08a, 0x0040, 0x0a0c, 0x1515, -- 0xa08a, 0x0053, 0x1a0c, 0x1515, 0x7918, 0x2160, 0x61a0, 0x2011, -- 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x6100, 0xd1f4, -- 0x0120, 0x6114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, -- 0xa1e0, 0x2dc4, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, -- 0xa082, 0x0040, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x78a3, 0x79af, -- 0x794c, 0x7b61, 0x78a1, 0x78a1, 0x78a1, 0x78a1, 0x78a1, 0x78a1, -- 0x78a1, 0x80d8, 0x80e8, 0x80f8, 0x8108, 0x78a1, 0x8518, 0x78a1, -- 0x80c7, 0x080c, 0x1515, 0x00d6, 0x0156, 0x0146, 0x780b, 0xffff, -- 0x20a1, 0x020b, 0x080c, 0x7903, 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, 0xb7fc, 0x2003, -- 0x07d0, 0x2001, 0xb7fb, 0x2003, 0x0009, 0x080c, 0x17e2, 0x014e, -- 0x015e, 0x00de, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, -- 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, -- 0x7818, 0xa080, 0x0028, 0x2004, 0x2019, 0xb535, 0x231c, 0xd3ac, -- 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, -- 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, 0x2da6, -- 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, -- 0x6810, 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, -- 0x0000, 0x2009, 0xb515, 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, 0x7d68, 0x014e, 0x013e, -- 0x015e, 0x00de, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, -- 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, 0xb535, 0x2214, 0xd2ac, -- 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, -- 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, 0x2da6, -- 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, -- 0x6810, 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, -- 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, 0x20a3, 0x0889, 0x20a3, -- 0x0000, 0x080c, 0x7d57, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, -- 0x2fa2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6, -- 0x0156, 0x0136, 0x0146, 0x7810, 0xa0ec, 0xf000, 0x0168, 0xa06d, -- 0x080c, 0x5302, 0x0148, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, -- 0x1118, 0x7820, 0xc0cd, 0x7822, 0x20a1, 0x020b, 0x080c, 0x7b17, -- 0xa016, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, -- 0xf000, 0x1130, 0x7810, 0xa084, 0x0700, 0x8007, 0x0043, 0x0010, -- 0xa006, 0x002b, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x79e9, -- 0x7a7e, 0x7a8e, 0x7ac0, 0x7ad3, 0x7aee, 0x7af7, 0x79e7, 0x080c, -- 0x1515, 0x0016, 0x0036, 0x694c, 0xa18c, 0x0003, 0x0118, 0xa186, -- 0x0003, 0x1170, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, -- 0x6868, 0x20a2, 0x6864, 0x20a2, 0x003e, 0x001e, 0x0804, 0x7aca, -- 0xa186, 0x0001, 0x190c, 0x1515, 0x6b78, 0x7820, 0xd0cc, 0x0108, -- 0xc3e5, 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, -- 0x20a2, 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, -- 0x0904, 0x7a78, 0xd3c4, 0x0110, 0x687c, 0xa108, 0xd3cc, 0x0110, -- 0x6874, 0xa108, 0x0156, 0x20a9, 0x000d, 0xad80, 0x0020, 0x201c, -- 0x831f, 0x23a2, 0x8000, 0x1f04, 0x7a27, 0x015e, 0x22a2, 0x22a2, -- 0x22a2, 0xa184, 0x0003, 0x0904, 0x7a78, 0x20a1, 0x020b, 0x20e1, -- 0x9080, 0x20e1, 0x4000, 0x0006, 0x7818, 0xa080, 0x0028, 0x2004, -- 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, -+ 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, -+ 0x2001, 0x0099, 0x20a2, 0x20a3, 0x0000, 0x0804, 0x7734, 0x00c6, -+ 0x00f6, 0x2c78, 0x7804, 0xa08a, 0x0040, 0x0a0c, 0x1515, 0xa08a, -+ 0x0053, 0x1a0c, 0x1515, 0x7918, 0x2160, 0x61a0, 0x2011, 0xb535, -+ 0x2214, 0xd2ac, 0x1110, 0xd1bc, 0x0150, 0x6100, 0xd1f4, 0x0120, -+ 0x6114, 0xa18c, 0x00ff, 0x0040, 0x2009, 0x0000, 0x0028, 0xa1e0, -+ 0x2dc4, 0x2c0d, 0xa18c, 0x00ff, 0x2061, 0x0100, 0x619a, 0xa082, -+ 0x0040, 0x001b, 0x00fe, 0x00ce, 0x0005, 0x78a2, 0x79ae, 0x794b, -+ 0x7b60, 0x78a0, 0x78a0, 0x78a0, 0x78a0, 0x78a0, 0x78a0, 0x78a0, -+ 0x80d7, 0x80e7, 0x80f7, 0x8107, 0x78a0, 0x851e, 0x78a0, 0x80c6, -+ 0x080c, 0x1515, 0x00d6, 0x0156, 0x0146, 0x780b, 0xffff, 0x20a1, -+ 0x020b, 0x080c, 0x7902, 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, 0xb7fc, 0x2003, 0x07d0, -+ 0x2001, 0xb7fb, 0x2003, 0x0009, 0x080c, 0x17e2, 0x014e, 0x015e, -+ 0x00de, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7a18, 0xa280, -+ 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x7818, -+ 0xa080, 0x0028, 0x2004, 0x2019, 0xb535, 0x231c, 0xd3ac, 0x1110, -+ 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, -+ 0x0600, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, -+ 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, -+ 0xa085, 0x0600, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, -+ 0x2009, 0xb515, 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, 0x7d67, 0x014e, 0x013e, 0x015e, -+ 0x00de, 0x0005, 0x0026, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, -+ 0xa080, 0x0028, 0x2004, 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1110, -+ 0xd0bc, 0x0188, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, -+ 0x0500, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, -+ 0x2da6, 0x00de, 0x0088, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, -+ 0xa085, 0x0500, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, -+ 0x2011, 0xb515, 0x2214, 0x22a2, 0x20a3, 0x0889, 0x20a3, 0x0000, -+ 0x080c, 0x7d56, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, -+ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6, 0x0156, -+ 0x0136, 0x0146, 0x7810, 0xa0ec, 0xf000, 0x0168, 0xa06d, 0x080c, -+ 0x5301, 0x0148, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x1118, -+ 0x7820, 0xc0cd, 0x7822, 0x20a1, 0x020b, 0x080c, 0x7b16, 0xa016, -+ 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, -+ 0x1130, 0x7810, 0xa084, 0x0700, 0x8007, 0x0043, 0x0010, 0xa006, -+ 0x002b, 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x79e8, 0x7a7d, -+ 0x7a8d, 0x7abf, 0x7ad2, 0x7aed, 0x7af6, 0x79e6, 0x080c, 0x1515, -+ 0x0016, 0x0036, 0x694c, 0xa18c, 0x0003, 0x0118, 0xa186, 0x0003, -+ 0x1170, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, 0x6868, -+ 0x20a2, 0x6864, 0x20a2, 0x003e, 0x001e, 0x0804, 0x7ac9, 0xa186, -+ 0x0001, 0x190c, 0x1515, 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, -+ 0x23a2, 0x6868, 0x20a2, 0x6864, 0x20a2, 0x22a2, 0x6874, 0x20a2, -+ 0x22a2, 0x687c, 0x20a2, 0x2009, 0x0018, 0xa384, 0x0300, 0x0904, -+ 0x7a77, 0xd3c4, 0x0110, 0x687c, 0xa108, 0xd3cc, 0x0110, 0x6874, -+ 0xa108, 0x0156, 0x20a9, 0x000d, 0xad80, 0x0020, 0x201c, 0x831f, -+ 0x23a2, 0x8000, 0x1f04, 0x7a26, 0x015e, 0x22a2, 0x22a2, 0x22a2, -+ 0xa184, 0x0003, 0x0904, 0x7a77, 0x20a1, 0x020b, 0x20e1, 0x9080, -+ 0x20e1, 0x4000, 0x0006, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, -+ 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, -+ 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, -+ 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, - 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, -- 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, -- 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, -- 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, -- 0x22a2, 0x000e, 0x7b20, 0xd3cc, 0x0118, 0x20a3, 0x0889, 0x0010, -- 0x20a3, 0x0898, 0x20a2, 0x080c, 0x7d57, 0x22a2, 0x20a3, 0x0000, -- 0x61c2, 0x003e, 0x001e, 0x080c, 0x7d68, 0x0005, 0x2011, 0x0008, -- 0x2001, 0xb50d, 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, 0x7d68, 0x0005, -- 0x2011, 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, -- 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, -- 0x080c, 0x7d68, 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, 0x7d68, 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, 0x7aca, 0x0026, -- 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, -- 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, -+ 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, -+ 0x000e, 0x7b20, 0xd3cc, 0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, -+ 0x0898, 0x20a2, 0x080c, 0x7d56, 0x22a2, 0x20a3, 0x0000, 0x61c2, -+ 0x003e, 0x001e, 0x080c, 0x7d67, 0x0005, 0x2011, 0x0008, 0x2001, -+ 0xb50d, 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, 0x7d67, 0x0005, 0x2011, -+ 0x0028, 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, -+ 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x080c, -+ 0x7d67, 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, 0x7d67, 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, 0x7ac9, 0x0026, 0x20e1, -+ 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, -+ 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, -+ 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, 0x20a2, -+ 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, - 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, 0x6814, -- 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, -- 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0700, 0x20a2, -- 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, -- 0x22a2, 0x7820, 0xd0cc, 0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, -- 0x0898, 0x20a3, 0x0000, 0x080c, 0x7d57, 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, 0x7b7b, 0x7b7b, 0x7b7d, 0x7b7b, 0x7b7b, -- 0x7b7b, 0x7b9f, 0x7b7b, 0x080c, 0x1515, 0x7910, 0xa18c, 0xf8ff, -- 0xa18d, 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x00f9, -- 0x00d6, 0x2069, 0xb552, 0x6804, 0xd0bc, 0x0130, 0x682c, 0xa084, -- 0x00ff, 0x8007, 0x20a2, 0x0010, 0x20a3, 0x3f00, 0x00de, 0x22a2, -- 0x22a2, 0x22a2, 0x60c3, 0x0001, 0x080c, 0x7d68, 0x0005, 0x20a1, -- 0x020b, 0x2009, 0x0003, 0x0019, 0x20a3, 0x7f00, 0x0c80, 0x0026, -+ 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, -+ 0x7820, 0xd0cc, 0x0118, 0x20a3, 0x0889, 0x0010, 0x20a3, 0x0898, -+ 0x20a3, 0x0000, 0x080c, 0x7d56, 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, 0x7b7a, 0x7b7a, 0x7b7c, 0x7b7a, 0x7b7a, 0x7b7a, -+ 0x7b9e, 0x7b7a, 0x080c, 0x1515, 0x7910, 0xa18c, 0xf8ff, 0xa18d, -+ 0x0600, 0x7912, 0x20a1, 0x020b, 0x2009, 0x0003, 0x00f9, 0x00d6, -+ 0x2069, 0xb552, 0x6804, 0xd0bc, 0x0130, 0x682c, 0xa084, 0x00ff, -+ 0x8007, 0x20a2, 0x0010, 0x20a3, 0x3f00, 0x00de, 0x22a2, 0x22a2, -+ 0x22a2, 0x60c3, 0x0001, 0x080c, 0x7d67, 0x0005, 0x20a1, 0x020b, -+ 0x2009, 0x0003, 0x0019, 0x20a3, 0x7f00, 0x0c80, 0x0026, 0x20e1, -+ 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, 0x2011, -+ 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, 0xa0e8, -+ 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, 0x20a2, -+ 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, 0x00d6, -+ 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, -+ 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, 0x22a2, -+ 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x080c, 0x7d56, 0x22a2, -+ 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, -+ 0x0036, 0x2061, 0x0100, 0x2071, 0xb500, 0x7154, 0x7818, 0x2068, -+ 0x68a0, 0x2028, 0x76d4, 0xd6ac, 0x1130, 0xd0bc, 0x1120, 0x6910, -+ 0x6a14, 0x7454, 0x0020, 0x6910, 0x6a14, 0x7370, 0x7474, 0x781c, -+ 0xa0be, 0x0006, 0x0904, 0x7ca1, 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, 0x85b9, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, -+ 0x0110, 0x2009, 0x1b58, 0x080c, 0x6a15, 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, 0x85b9, 0x2009, -+ 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, -+ 0x080c, 0x6a15, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, -+ 0x0005, 0x7810, 0x2070, 0x704c, 0xa084, 0x0003, 0xa086, 0x0002, -+ 0x0904, 0x7cf7, 0x2001, 0xb535, 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, 0x85b6, 0x0804, 0x7c8f, 0x2001, -+ 0xb535, 0x2004, 0xd0ac, 0x1110, 0xd5bc, 0x0138, 0xa185, 0x0700, -+ 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, 0xa185, 0x0700, 0x6062, -+ 0x6266, 0x606b, 0x0000, 0x646e, 0x080c, 0x5301, 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, 0x85b9, -+ 0x0804, 0x7c8f, 0x080c, 0x85b6, 0x0804, 0x7c8f, 0x7a18, 0xa280, -+ 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, 0x0005, -+ 0x00d6, 0x2069, 0xb7e0, 0x6843, 0x0001, 0x00de, 0x0005, 0x20e1, -+ 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x0019, 0x080c, 0x6a07, -+ 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, 0x5acf, 0x1198, 0x2001, 0xb7fc, 0x2004, 0xa005, -+ 0x15b8, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b51, 0x006e, 0x1118, -+ 0x080c, 0x6a07, 0x0468, 0x00c6, 0x2061, 0xb7e0, 0x00d8, 0x6904, -+ 0xa194, 0x4000, 0x0550, 0x0831, 0x6803, 0x1000, 0x6803, 0x0000, -+ 0x00c6, 0x2061, 0xb7e0, 0x6128, 0xa192, 0x00c8, 0x1258, 0x8108, -+ 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x6a07, 0x080c, -+ 0x7d71, 0x0070, 0x6124, 0xa1e5, 0x0000, 0x0140, 0x080c, 0xb444, -+ 0x080c, 0x6a10, 0x2009, 0x0014, 0x080c, 0x864c, 0x00ce, 0x0000, -+ 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0xb7fc, 0x2004, -+ 0xa005, 0x1db0, 0x00c6, 0x2061, 0xb7e0, 0x6128, 0xa192, 0x0003, -+ 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x6a07, 0x080c, 0x4b1f, -+ 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x6a1d, -+ 0x2071, 0xb7e0, 0x713c, 0x81ff, 0x0590, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x080c, 0x5acf, 0x11a8, 0x0036, 0x2019, 0x0002, 0x080c, -+ 0x7fe4, 0x003e, 0x713c, 0x2160, 0x080c, 0xb444, 0x2009, 0x004a, -+ 0x080c, 0x864c, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b51, 0x006e, -+ 0x00b0, 0x6904, 0xa194, 0x4000, 0x01c0, 0x6803, 0x1000, 0x6803, -+ 0x0000, 0x0036, 0x2019, 0x0001, 0x080c, 0x7fe4, 0x003e, 0x713c, -+ 0x2160, 0x080c, 0xb444, 0x2009, 0x004a, 0x080c, 0x864c, 0x002e, -+ 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c58, 0x0026, 0x00e6, -+ 0x2071, 0xb7e0, 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, 0xb7e0, 0x7018, -+ 0x2068, 0x8dff, 0x0188, 0x68a0, 0xa406, 0x0118, 0x6854, 0x2068, -+ 0x0cc0, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648, 0x2d60, 0x080c, -+ 0x511a, 0x0110, 0xa085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, -+ 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x20a1, 0x020b, 0x080c, -+ 0x7641, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x781c, -+ 0xa086, 0x0004, 0x1110, 0x6098, 0x0018, 0x2001, 0xb515, 0x2004, -+ 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9, 0x0010, 0xa006, -+ 0x20a2, 0x1f04, 0x7ea0, 0x20a2, 0x20a2, 0x60c3, 0x002c, 0x080c, -+ 0x7d67, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x7641, -+ 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, -+ 0x60c3, 0x0008, 0x080c, 0x7d67, 0x014e, 0x015e, 0x0005, 0x0156, -+ 0x0146, 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, 0x0200, 0x20a3, -+ 0x0000, 0x20a9, 0x0006, 0x2011, 0xb540, 0x2019, 0xb541, 0x23a6, -+ 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x1f04, 0x7ecf, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c, 0x7d67, 0x014e, -+ 0x015e, 0x0005, 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, -+ 0x080c, 0x76b6, 0x080c, 0x76cc, 0x7810, 0xa080, 0x0000, 0x2004, -+ 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, -+ 0xa080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x7d67, 0x002e, 0x001e, -+ 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, -+ 0x7641, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, -+ 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d67, 0x014e, 0x015e, 0x0005, -+ 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x7641, -+ 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017, 0x2098, 0x7808, -+ 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2, 0x080c, 0x7d67, -+ 0x002e, 0x001e, 0x014e, 0x015e, 0x0005, 0x00e6, 0x00c6, 0x0006, -+ 0x0126, 0x2091, 0x8000, 0x2071, 0xb7e0, 0x700c, 0x2060, 0x8cff, -+ 0x0178, 0x080c, 0x9e58, 0x1110, 0x080c, 0x8c19, 0x600c, 0x0006, -+ 0x080c, 0xa01f, 0x080c, 0x861d, 0x080c, 0x811e, 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, 0xb7e0, 0x7024, 0x2060, 0x8cff, 0x05a0, 0x080c, 0x7d7a, -+ 0x68c3, 0x0000, 0x080c, 0x6a10, 0x2009, 0x0013, 0x080c, 0x864c, -+ 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, -+ 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, -+ 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x7f7a, 0x7804, -+ 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x6824, -+ 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, -+ 0x012e, 0x0005, 0x2001, 0xb500, 0x2004, 0xa096, 0x0001, 0x0590, -+ 0xa096, 0x0004, 0x0578, 0x080c, 0x6a10, 0x6814, 0xa084, 0x0001, -+ 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, -+ 0x4adc, 0x080c, 0x699c, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, -+ 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, -+ 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, -+ 0x1f04, 0x7fbd, 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, 0xb7e0, 0x703c, 0x2060, 0x8cff, -+ 0x0904, 0x806b, 0xa386, 0x0002, 0x1128, 0x6814, 0xa084, 0x0002, -+ 0x0904, 0x806b, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, -+ 0x8109, 0x1df0, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x080c, 0x6a1d, -+ 0x080c, 0x220c, 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, 0x2021, -+ 0x0169, 0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x1500, 0x68af, -+ 0x95f5, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, -+ 0x0020, 0x2071, 0xb84a, 0x6814, 0xa084, 0x0184, 0xa085, 0x0012, -+ 0x6816, 0x7803, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0xa386, -+ 0x0002, 0x1128, 0x7884, 0xa005, 0x1110, 0x7887, 0x0001, 0x2001, -+ 0xb7b1, 0x2004, 0x200a, 0x004e, 0xa39d, 0x0000, 0x1120, 0x2009, -+ 0x0049, 0x080c, 0x864c, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0158, -+ 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, -+ 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, -+ 0x1f04, 0x804d, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, -+ 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, -+ 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, -+ 0x8000, 0x2069, 0xb7e0, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, -+ 0x0126, 0x2091, 0x8000, 0x2069, 0xb7e0, 0x6a32, 0x012e, 0x00de, -+ 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006, 0x0126, 0x2071, -+ 0xb7e0, 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, 0x9e1d, 0x080c, -+ 0x811e, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, 0x08b8, 0x012e, -+ 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0156, 0x0146, -+ 0x20a1, 0x020b, 0x080c, 0x7902, 0x7810, 0x20a2, 0xa006, 0x20a2, -+ 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, 0x8116, 0x0156, -+ 0x0146, 0x20a1, 0x020b, 0x080c, 0x7902, 0x7810, 0x20a2, 0xa006, -+ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0478, 0x0156, -+ 0x0146, 0x20a1, 0x020b, 0x080c, 0x7902, 0x7810, 0x20a2, 0xa006, -+ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x00f8, 0x0156, -+ 0x0146, 0x20a1, 0x020b, 0x080c, 0x7902, 0x7810, 0x20a2, 0xa006, -+ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, 0x0156, -+ 0x0146, 0x20a1, 0x020b, 0x080c, 0x7902, 0x7810, 0x20a2, 0xa006, -+ 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x0089, 0x60c3, -+ 0x0020, 0x080c, 0x7d67, 0x014e, 0x015e, 0x0005, 0x00e6, 0x2071, -+ 0xb7e0, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022, 0x00ee, 0x0005, -+ 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x812a, 0x20a2, 0x20a2, 0x0005, -+ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, -+ 0x2091, 0x8000, 0x2071, 0xb7e0, 0x7614, 0x2660, 0x2678, 0x2039, -+ 0x0001, 0x87ff, 0x0904, 0x81c6, 0x8cff, 0x0904, 0x81c6, 0x601c, -+ 0xa086, 0x0006, 0x1904, 0x81c1, 0x88ff, 0x0138, 0x2800, 0xac06, -+ 0x1904, 0x81c1, 0x2039, 0x0000, 0x0050, 0x6018, 0xa206, 0x1904, -+ 0x81c1, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x81c1, 0x7024, -+ 0xac06, 0x1598, 0x2069, 0x0100, 0x68c0, 0xa005, 0x1160, 0x6824, -+ 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x6a10, 0x080c, 0x824d, -+ 0x7027, 0x0000, 0x0410, 0x080c, 0x6a10, 0x6820, 0xd0b4, 0x0110, -+ 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0x824d, -+ 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, 0x9c5a, 0x0110, 0x080c, 0xb099, -+ 0x080c, 0x9e1d, 0x080c, 0x811e, 0x88ff, 0x1190, 0x00ce, 0x0804, -+ 0x8141, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8141, 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, 0xb7e0, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x823d, -+ 0x601c, 0xa086, 0x0006, 0x1904, 0x8238, 0x87ff, 0x0128, 0x2700, -+ 0xac06, 0x1904, 0x8238, 0x0048, 0x6018, 0xa206, 0x1904, 0x8238, -+ 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8, 0x703c, 0xac06, 0x1180, -+ 0x0036, 0x2019, 0x0001, 0x080c, 0x7fe4, 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, 0x9c5a, 0x0110, 0x080c, -+ 0xb099, 0x080c, 0x9e1d, 0x87ff, 0x1190, 0x00ce, 0x0804, 0x81e5, -+ 0x2c78, 0x600c, 0x2060, 0x0804, 0x81e5, 0xa006, 0x012e, 0x000e, -+ 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6017, -+ 0x0000, 0x00ce, 0xa7bd, 0x0001, 0x0c88, 0x00e6, 0x2071, 0xb7e0, -+ 0x2001, 0xb500, 0x2004, 0xa086, 0x0002, 0x1118, 0x7007, 0x0005, -+ 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, -+ 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb7e0, -+ 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, 0xb7e0, 0x760c, 0x2660, 0x2678, 0x8cff, -+ 0x0904, 0x8323, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, -+ 0x831e, 0x7024, 0xac06, 0x1508, 0x2069, 0x0100, 0x68c0, 0xa005, -+ 0x0904, 0x82fa, 0x080c, 0x7d7a, 0x68c3, 0x0000, 0x080c, 0x824d, -+ 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, -+ 0x9e47, 0x1158, 0x080c, 0x2cc2, 0x080c, 0x9e58, 0x11f0, 0x080c, -+ 0x8c19, 0x00d8, 0x080c, 0x824d, 0x08c0, 0x080c, 0x9e58, 0x1118, -+ 0x080c, 0x8c19, 0x0090, 0x6010, 0x2068, 0x080c, 0x9c5a, 0x0168, -+ 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, 0x6b4a, 0x6847, -+ 0x0000, 0x080c, 0x5408, 0x080c, 0x9e11, 0x080c, 0xa01f, 0x080c, -+ 0x9e1d, 0x080c, 0x811e, 0x00ce, 0x0804, 0x82a7, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0x82a7, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00de, -+ 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1d30, 0x080c, -+ 0xb099, 0x0c18, 0x0036, 0x0156, 0x0136, 0x0146, 0x3908, 0xa006, -+ 0xa190, 0x0020, 0x221c, 0xa39e, 0x2ab7, 0x1118, 0x8210, 0x8000, -+ 0x0cc8, 0xa005, 0x0138, 0x20a9, 0x0020, 0x2198, 0xa110, 0x22a0, -+ 0x22c8, 0x53a3, 0x014e, 0x013e, 0x015e, 0x003e, 0x0005, 0x00d6, -+ 0x20a1, 0x020b, 0x080c, 0x76dd, 0x20a3, 0x0200, 0x20a3, 0x0014, -+ 0x60c3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x2099, 0xb7b9, -+ 0x20a9, 0x0004, 0x53a6, 0x20a3, 0x0004, 0x20a3, 0x7878, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x080c, 0x7d67, 0x00de, 0x0005, 0x20a1, -+ 0x020b, 0x080c, 0x76dd, 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, 0x7d67, 0x0005, 0x00d6, 0x0016, 0x2f68, 0x2009, -+ 0x0035, 0x080c, 0xa10a, 0x1904, 0x8402, 0x20a1, 0x020b, 0x080c, -+ 0x7641, 0x20a3, 0x1300, 0x20a3, 0x0000, 0x7828, 0x2068, 0x681c, -+ 0xa086, 0x0003, 0x0580, 0x7818, 0xa080, 0x0028, 0x2014, 0x2001, -+ 0xb535, 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, 0xb635, -+ 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x00e8, 0x20a3, 0x0000, -+ 0x6098, 0x20a2, 0x00c0, 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1138, -+ 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007e, 0x0240, 0x00d6, -+ 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0020, 0x20a3, -+ 0x0000, 0x6034, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, 0x7d67, 0x001e, -+ 0x00de, 0x0005, 0x7817, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, -+ 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168, 0x691c, 0xa186, 0x0006, -+ 0x01c0, 0xa186, 0x0003, 0x0904, 0x8478, 0xa186, 0x0005, 0x0904, -+ 0x8461, 0xa186, 0x0004, 0x05b8, 0xa186, 0x0008, 0x0904, 0x8469, -+ 0x7807, 0x0037, 0x7813, 0x1700, 0x080c, 0x84e0, 0x002e, 0x00de, -+ 0x0005, 0x080c, 0x849c, 0x2009, 0x4000, 0x6800, 0x0002, 0x8442, -+ 0x844d, 0x8444, 0x844d, 0x8449, 0x8442, 0x8442, 0x844d, 0x844d, -+ 0x844d, 0x844d, 0x8442, 0x8442, 0x8442, 0x8442, 0x8442, 0x844d, -+ 0x8442, 0x844d, 0x080c, 0x1515, 0x6820, 0xd0e4, 0x0110, 0xd0cc, -+ 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000, 0x6828, 0x20a2, 0x682c, -+ 0x20a2, 0x0804, 0x8492, 0x080c, 0x849c, 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, -+ 0x7d67, 0x002e, 0x00de, 0x0005, 0x0036, 0x0046, 0x0056, 0x0066, -+ 0x20a1, 0x020b, 0x080c, 0x76dd, 0xa006, 0x20a3, 0x0200, 0x20a2, -+ 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, 0x0028, 0x2004, -+ 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1118, 0xa092, 0x007e, 0x0268, -+ 0x00d6, 0x2069, 0xb51c, 0x2d2c, 0x8d68, 0x2d34, 0xa0e8, 0xb635, -+ 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, 0x76dd, 0x20a3, 0x0100, 0x20a3, 0x0000, -+ 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d67, -+ 0x0005, 0x20a1, 0x020b, 0x080c, 0x7639, 0x20a3, 0x1400, 0x20a3, -+ 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, 0x20a2, 0x782c, -+ 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, 0x20a3, 0x0000, -+ 0x60c3, 0x0010, 0x080c, 0x7d67, 0x0005, 0x20a1, 0x020b, 0x080c, -+ 0x76d5, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, 0x20a2, 0x7810, -+ 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d67, 0x0005, 0x0146, 0x20a1, -+ 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c, 0x7d67, 0x014e, 0x0005, - 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, 0x0028, 0x2004, - 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd0bc, 0x0188, 0x00d6, -- 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, 0x6814, -- 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0088, -- 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0100, 0x20a2, -- 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x2011, 0xb515, 0x2214, -- 0x22a2, 0x20a3, 0x0888, 0xa18d, 0x0008, 0x21a2, 0x080c, 0x7d57, -- 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, -- 0x20a3, 0x0000, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0056, -- 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0xb500, 0x7154, 0x7818, -- 0x2068, 0x68a0, 0x2028, 0x76d4, 0xd6ac, 0x1130, 0xd0bc, 0x1120, -- 0x6910, 0x6a14, 0x7454, 0x0020, 0x6910, 0x6a14, 0x7370, 0x7474, -- 0x781c, 0xa0be, 0x0006, 0x0904, 0x7ca2, 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, 0x85b3, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, -- 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x6a16, 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, 0x85b3, -- 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, 0xa005, 0x0110, 0x2009, -- 0x1b58, 0x080c, 0x6a16, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, -- 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, 0xa084, 0x0003, 0xa086, -- 0x0002, 0x0904, 0x7cf8, 0x2001, 0xb535, 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, 0x85b0, 0x0804, 0x7c90, -- 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1110, 0xd5bc, 0x0138, 0xa185, -- 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, 0x0038, 0xa185, 0x0700, -- 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, 0x080c, 0x5302, 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, -- 0x85b3, 0x0804, 0x7c90, 0x080c, 0x85b0, 0x0804, 0x7c90, 0x7a18, -- 0xa280, 0x0023, 0x2014, 0x8210, 0xa294, 0x00ff, 0x2202, 0x8217, -- 0x0005, 0x00d6, 0x2069, 0xb7e0, 0x6843, 0x0001, 0x00de, 0x0005, -- 0x20e1, 0x9080, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x0019, 0x080c, -- 0x6a08, 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, 0x5ad0, 0x1198, 0x2001, 0xb7fc, 0x2004, -- 0xa005, 0x15b8, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b52, 0x006e, -- 0x1118, 0x080c, 0x6a08, 0x0468, 0x00c6, 0x2061, 0xb7e0, 0x00d8, -- 0x6904, 0xa194, 0x4000, 0x0550, 0x0831, 0x6803, 0x1000, 0x6803, -- 0x0000, 0x00c6, 0x2061, 0xb7e0, 0x6128, 0xa192, 0x00c8, 0x1258, -- 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x6a08, -- 0x080c, 0x7d72, 0x0070, 0x6124, 0xa1e5, 0x0000, 0x0140, 0x080c, -- 0xb438, 0x080c, 0x6a11, 0x2009, 0x0014, 0x080c, 0x8646, 0x00ce, -- 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0xb7fc, -- 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, 0xb7e0, 0x6128, 0xa192, -- 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x6a08, 0x080c, -- 0x4b20, 0x0c38, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, -- 0x6a1e, 0x2071, 0xb7e0, 0x713c, 0x81ff, 0x0590, 0x2061, 0x0100, -- 0x2069, 0x0140, 0x080c, 0x5ad0, 0x11a8, 0x0036, 0x2019, 0x0002, -- 0x080c, 0x7fe5, 0x003e, 0x713c, 0x2160, 0x080c, 0xb438, 0x2009, -- 0x004a, 0x080c, 0x8646, 0x0066, 0x2031, 0x0001, 0x080c, 0x5b52, -- 0x006e, 0x00b0, 0x6904, 0xa194, 0x4000, 0x01c0, 0x6803, 0x1000, -- 0x6803, 0x0000, 0x0036, 0x2019, 0x0001, 0x080c, 0x7fe5, 0x003e, -- 0x713c, 0x2160, 0x080c, 0xb438, 0x2009, 0x004a, 0x080c, 0x8646, -- 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0c58, 0x0026, -- 0x00e6, 0x2071, 0xb7e0, 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, 0xb7e0, -- 0x7018, 0x2068, 0x8dff, 0x0188, 0x68a0, 0xa406, 0x0118, 0x6854, -- 0x2068, 0x0cc0, 0x6010, 0x2060, 0x643c, 0x6540, 0x6648, 0x2d60, -- 0x080c, 0x511b, 0x0110, 0xa085, 0x0001, 0x012e, 0x000e, 0x004e, -- 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x20a1, 0x020b, -- 0x080c, 0x7642, 0x20a3, 0x1200, 0x20a3, 0x0000, 0x20a3, 0x0000, -- 0x781c, 0xa086, 0x0004, 0x1110, 0x6098, 0x0018, 0x2001, 0xb515, -- 0x2004, 0x20a2, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x20a9, 0x0010, -- 0xa006, 0x20a2, 0x1f04, 0x7ea1, 0x20a2, 0x20a2, 0x60c3, 0x002c, -- 0x080c, 0x7d68, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, -- 0x7642, 0x20a3, 0x0f00, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, -- 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d68, 0x014e, 0x015e, 0x0005, -- 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x76de, 0x20a3, 0x0200, -- 0x20a3, 0x0000, 0x20a9, 0x0006, 0x2011, 0xb540, 0x2019, 0xb541, -- 0x23a6, 0x22a6, 0xa398, 0x0002, 0xa290, 0x0002, 0x1f04, 0x7ed0, -- 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x001c, 0x080c, 0x7d68, -- 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, -- 0x020b, 0x080c, 0x76b7, 0x080c, 0x76cd, 0x7810, 0xa080, 0x0000, -- 0x2004, 0xa080, 0x0015, 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, -- 0x53a6, 0xa080, 0x0004, 0x8003, 0x60c2, 0x080c, 0x7d68, 0x002e, -- 0x001e, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, -- 0x080c, 0x7642, 0x20a3, 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000, -- 0x7808, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d68, 0x014e, 0x015e, -- 0x0005, 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, -- 0x7642, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0017, 0x2098, -- 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0x8003, 0x60c2, 0x080c, -- 0x7d68, 0x002e, 0x001e, 0x014e, 0x015e, 0x0005, 0x00e6, 0x00c6, -- 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xb7e0, 0x700c, 0x2060, -- 0x8cff, 0x0178, 0x080c, 0x9e52, 0x1110, 0x080c, 0x8c13, 0x600c, -- 0x0006, 0x080c, 0xa019, 0x080c, 0x8617, 0x080c, 0x811f, 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, 0xb7e0, 0x7024, 0x2060, 0x8cff, 0x05a0, 0x080c, -- 0x7d7b, 0x68c3, 0x0000, 0x080c, 0x6a11, 0x2009, 0x0013, 0x080c, -- 0x8646, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, -- 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, -- 0x0078, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x7f7b, -- 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, -- 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, 0x00de, 0x00ee, 0x00fe, -- 0x015e, 0x012e, 0x0005, 0x2001, 0xb500, 0x2004, 0xa096, 0x0001, -- 0x0590, 0xa096, 0x0004, 0x0578, 0x080c, 0x6a11, 0x6814, 0xa084, -- 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, -- 0x2011, 0x4add, 0x080c, 0x699d, 0x20a9, 0x01f4, 0x6824, 0xd094, -- 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, -- 0x1000, 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, 0x6827, 0x0001, -- 0x0010, 0x1f04, 0x7fbe, 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, 0xb7e0, 0x703c, 0x2060, -- 0x8cff, 0x0904, 0x806c, 0xa386, 0x0002, 0x1128, 0x6814, 0xa084, -- 0x0002, 0x0904, 0x806c, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, -- 0x00fa, 0x8109, 0x1df0, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x080c, -- 0x6a1e, 0x080c, 0x220c, 0x0046, 0x2009, 0x017f, 0x200b, 0x00a5, -- 0x2021, 0x0169, 0x2404, 0xa084, 0x000f, 0xa086, 0x0004, 0x1500, -- 0x68af, 0x95f5, 0x68c7, 0x0000, 0x68cb, 0x0008, 0x00e6, 0x00f6, -- 0x2079, 0x0020, 0x2071, 0xb84a, 0x6814, 0xa084, 0x0184, 0xa085, -- 0x0012, 0x6816, 0x7803, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, -- 0xa386, 0x0002, 0x1128, 0x7884, 0xa005, 0x1110, 0x7887, 0x0001, -- 0x2001, 0xb7b1, 0x2004, 0x200a, 0x004e, 0xa39d, 0x0000, 0x1120, -- 0x2009, 0x0049, 0x080c, 0x8646, 0x20a9, 0x03e8, 0x6824, 0xd094, -- 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, -- 0x1000, 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827, 0x0002, -- 0x0010, 0x1f04, 0x804e, 0x7804, 0xa084, 0x1000, 0x0120, 0x7803, -- 0x0100, 0x7803, 0x0000, 0x6824, 0x000e, 0x001e, 0x002e, 0x00ce, -- 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, -- 0x2091, 0x8000, 0x2069, 0xb7e0, 0x6a06, 0x012e, 0x00de, 0x0005, -- 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0xb7e0, 0x6a32, 0x012e, -- 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0006, 0x0126, -- 0x2071, 0xb7e0, 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, 0x9e17, -- 0x080c, 0x811f, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, 0x08b8, -- 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0156, -- 0x0146, 0x20a1, 0x020b, 0x080c, 0x7903, 0x7810, 0x20a2, 0xa006, -- 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, 0x8117, -- 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x7903, 0x7810, 0x20a2, -- 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, 0x0478, -- 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x7903, 0x7810, 0x20a2, -- 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, 0x00f8, -- 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x7903, 0x7810, 0x20a2, -- 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, 0x0078, -- 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x7903, 0x7810, 0x20a2, -- 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, 0x0089, -- 0x60c3, 0x0020, 0x080c, 0x7d68, 0x014e, 0x015e, 0x0005, 0x00e6, -- 0x2071, 0xb7e0, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022, 0x00ee, -- 0x0005, 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x812b, 0x20a2, 0x20a2, -- 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, -- 0x0126, 0x2091, 0x8000, 0x2071, 0xb7e0, 0x7614, 0x2660, 0x2678, -- 0x2039, 0x0001, 0x87ff, 0x0904, 0x81c0, 0x8cff, 0x0904, 0x81c0, -- 0x601c, 0xa086, 0x0006, 0x1904, 0x81bb, 0x88ff, 0x0138, 0x2800, -- 0xac06, 0x1904, 0x81bb, 0x2039, 0x0000, 0x0050, 0x6018, 0xa206, -- 0x1904, 0x81bb, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x81bb, -- 0x7024, 0xac06, 0x1560, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0518, -- 0x080c, 0x6a11, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, -- 0x0008, 0x68c3, 0x0000, 0x080c, 0x8247, 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, 0x9c54, 0x0110, -- 0x080c, 0xb08d, 0x080c, 0x9e17, 0x080c, 0x811f, 0x88ff, 0x1190, -- 0x00ce, 0x0804, 0x8142, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8142, -- 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, 0xb7e0, 0x7638, 0x2660, 0x2678, 0x8cff, -- 0x0904, 0x8237, 0x601c, 0xa086, 0x0006, 0x1904, 0x8232, 0x87ff, -- 0x0128, 0x2700, 0xac06, 0x1904, 0x8232, 0x0048, 0x6018, 0xa206, -- 0x1904, 0x8232, 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8, 0x703c, -- 0xac06, 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x7fe5, 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, 0x9c54, -- 0x0110, 0x080c, 0xb08d, 0x080c, 0x9e17, 0x87ff, 0x1190, 0x00ce, -- 0x0804, 0x81df, 0x2c78, 0x600c, 0x2060, 0x0804, 0x81df, 0xa006, -- 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, -- 0x0005, 0x6017, 0x0000, 0x00ce, 0xa7bd, 0x0001, 0x0c88, 0x00e6, -- 0x2071, 0xb7e0, 0x2001, 0xb500, 0x2004, 0xa086, 0x0002, 0x1118, -- 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, -- 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, -- 0x2071, 0xb7e0, 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, 0xb7e0, 0x760c, 0x2660, -- 0x2678, 0x8cff, 0x0904, 0x831d, 0x6018, 0xa080, 0x0028, 0x2004, -- 0xa206, 0x1904, 0x8318, 0x7024, 0xac06, 0x1508, 0x2069, 0x0100, -- 0x68c0, 0xa005, 0x0904, 0x82f4, 0x080c, 0x7d7b, 0x68c3, 0x0000, -- 0x080c, 0x8247, 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, 0x9e41, 0x1158, 0x080c, 0x2cc2, 0x080c, 0x9e52, -- 0x11f0, 0x080c, 0x8c13, 0x00d8, 0x080c, 0x8247, 0x08c0, 0x080c, -- 0x9e52, 0x1118, 0x080c, 0x8c13, 0x0090, 0x6010, 0x2068, 0x080c, -- 0x9c54, 0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, -- 0x6b4a, 0x6847, 0x0000, 0x080c, 0x5409, 0x080c, 0x9e0b, 0x080c, -- 0xa019, 0x080c, 0x9e17, 0x080c, 0x811f, 0x00ce, 0x0804, 0x82a1, -- 0x2c78, 0x600c, 0x2060, 0x0804, 0x82a1, 0x012e, 0x000e, 0x006e, -- 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, -- 0x1d30, 0x080c, 0xb08d, 0x0c18, 0x0036, 0x0156, 0x0136, 0x0146, -- 0x3908, 0xa006, 0xa190, 0x0020, 0x221c, 0xa39e, 0x2ab7, 0x1118, -- 0x8210, 0x8000, 0x0cc8, 0xa005, 0x0138, 0x20a9, 0x0020, 0x2198, -- 0xa110, 0x22a0, 0x22c8, 0x53a3, 0x014e, 0x013e, 0x015e, 0x003e, -- 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x76de, 0x20a3, 0x0200, -- 0x20a3, 0x0014, 0x60c3, 0x0014, 0x20a3, 0x0000, 0x20a3, 0x0000, -- 0x2099, 0xb7b9, 0x20a9, 0x0004, 0x53a6, 0x20a3, 0x0004, 0x20a3, -- 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x080c, 0x7d68, 0x00de, -- 0x0005, 0x20a1, 0x020b, 0x080c, 0x76de, 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, 0x7d68, 0x0005, 0x00d6, 0x0016, -- 0x2f68, 0x2009, 0x0035, 0x080c, 0xa104, 0x1904, 0x83fc, 0x20a1, -- 0x020b, 0x080c, 0x7642, 0x20a3, 0x1300, 0x20a3, 0x0000, 0x7828, -- 0x2068, 0x681c, 0xa086, 0x0003, 0x0580, 0x7818, 0xa080, 0x0028, -- 0x2014, 0x2001, 0xb535, 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, 0xb635, 0x2d6c, 0x6810, 0x20a2, 0x6814, 0x20a2, 0x00e8, -- 0x20a3, 0x0000, 0x6098, 0x20a2, 0x00c0, 0x2001, 0xb535, 0x2004, -- 0xd0ac, 0x1138, 0x7818, 0xa080, 0x0028, 0x2004, 0xa082, 0x007e, -- 0x0240, 0x00d6, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, -- 0x0020, 0x20a3, 0x0000, 0x6034, 0x20a2, 0x7834, 0x20a2, 0x7838, -- 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x000c, 0x080c, -- 0x7d68, 0x001e, 0x00de, 0x0005, 0x7817, 0x0001, 0x7803, 0x0006, -- 0x001e, 0x00de, 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168, 0x691c, -- 0xa186, 0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x8472, 0xa186, -- 0x0005, 0x0904, 0x845b, 0xa186, 0x0004, 0x05b8, 0xa186, 0x0008, -- 0x0904, 0x8463, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c, 0x84da, -- 0x002e, 0x00de, 0x0005, 0x080c, 0x8496, 0x2009, 0x4000, 0x6800, -- 0x0002, 0x843c, 0x8447, 0x843e, 0x8447, 0x8443, 0x843c, 0x843c, -- 0x8447, 0x8447, 0x8447, 0x8447, 0x843c, 0x843c, 0x843c, 0x843c, -- 0x843c, 0x8447, 0x843c, 0x8447, 0x080c, 0x1515, 0x6820, 0xd0e4, -- 0x0110, 0xd0cc, 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000, 0x6828, -- 0x20a2, 0x682c, 0x20a2, 0x0804, 0x848c, 0x080c, 0x8496, 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, 0x7d68, 0x002e, 0x00de, 0x0005, 0x0036, 0x0046, -- 0x0056, 0x0066, 0x20a1, 0x020b, 0x080c, 0x76de, 0xa006, 0x20a3, -- 0x0200, 0x20a2, 0x7934, 0x21a2, 0x7938, 0x21a2, 0x7818, 0xa080, -- 0x0028, 0x2004, 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1118, 0xa092, -- 0x007e, 0x0268, 0x00d6, 0x2069, 0xb51c, 0x2d2c, 0x8d68, 0x2d34, -- 0xa0e8, 0xb635, 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, 0x76de, 0x20a3, 0x0100, -- 0x20a3, 0x0000, 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, -- 0x080c, 0x7d68, 0x0005, 0x20a1, 0x020b, 0x080c, 0x763a, 0x20a3, -- 0x1400, 0x20a3, 0x0000, 0x7834, 0x20a2, 0x7838, 0x20a2, 0x7828, -- 0x20a2, 0x782c, 0x20a2, 0x7830, 0xa084, 0x00ff, 0x8007, 0x20a2, -- 0x20a3, 0x0000, 0x60c3, 0x0010, 0x080c, 0x7d68, 0x0005, 0x20a1, -- 0x020b, 0x080c, 0x76d6, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, -- 0x20a2, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x7d68, 0x0005, -- 0x0146, 0x20a1, 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c, 0x7d68, -- 0x014e, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x7818, 0xa080, -- 0x0028, 0x2004, 0x2011, 0xb535, 0x2214, 0xd2ac, 0x1110, 0xd0bc, -- 0x0188, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0300, -- 0x20a2, 0x6814, 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, -- 0x00de, 0x0078, 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, -- 0x0300, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x6234, -- 0x22a2, 0x20a3, 0x0819, 0x20a3, 0x0000, 0x080c, 0x7d57, 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, -- 0x7d72, 0x080c, 0x6a08, 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, 0xbd00, 0x2a70, 0x7068, 0x704a, 0x704f, 0xbd00, -- 0x0005, 0x00e6, 0x0126, 0x2071, 0xb500, 0x2091, 0x8000, 0x7548, -- 0xa582, 0x0010, 0x0608, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, -+ 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0300, 0x20a2, 0x6814, -+ 0x20a2, 0x2069, 0xb51c, 0x2da6, 0x8d68, 0x2da6, 0x00de, 0x0078, -+ 0x00d6, 0xa0e8, 0xb635, 0x2d6c, 0x6810, 0xa085, 0x0300, 0x20a2, -+ 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, 0x6234, 0x22a2, 0x20a3, -+ 0x0819, 0x20a3, 0x0000, 0x080c, 0x7d56, 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, 0x7d71, 0x080c, -+ 0x6a07, 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, -+ 0xbd00, 0x2a70, 0x7068, 0x704a, 0x704f, 0xbd00, 0x0005, 0x00e6, -+ 0x0126, 0x2071, 0xb500, 0x2091, 0x8000, 0x7548, 0xa582, 0x0010, -+ 0x0608, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, -+ 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xbd00, 0x0c98, -+ 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, -+ 0x1230, 0x754e, 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, -+ 0xbd00, 0x0cc0, 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xb500, 0x7548, -+ 0xa582, 0x0010, 0x0600, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, - 0x0148, 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, - 0xbd00, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, -- 0x705c, 0xa502, 0x1230, 0x754e, 0xa085, 0x0001, 0x012e, 0x00ee, -- 0x0005, 0x704f, 0xbd00, 0x0cc0, 0xa006, 0x0cc0, 0x00e6, 0x2071, -- 0xb500, 0x7548, 0xa582, 0x0010, 0x0600, 0x704c, 0x2060, 0x6000, -- 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, -- 0x0cb0, 0x2061, 0xbd00, 0x0c98, 0x6003, 0x0008, 0x8529, 0x754a, -- 0xaca8, 0x0018, 0x705c, 0xa502, 0x1228, 0x754e, 0xa085, 0x0001, -- 0x00ee, 0x0005, 0x704f, 0xbd00, 0x0cc8, 0xa006, 0x0cc8, 0xac82, -- 0xbd00, 0x0a0c, 0x1515, 0x2001, 0xb517, 0x2004, 0xac02, 0x1a0c, -- 0x1515, 0xa006, 0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, -- 0x601f, 0x0000, 0x6003, 0x0000, 0x6052, 0x6056, 0x6022, 0x6026, -- 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x2061, 0xb500, -- 0x6048, 0x8000, 0x604a, 0xa086, 0x0001, 0x0108, 0x0005, 0x0126, -- 0x2091, 0x8000, 0x080c, 0x7174, 0x012e, 0x0cc0, 0x601c, 0xa084, -- 0x000f, 0x0002, 0x8655, 0x8664, 0x867f, 0x869a, 0xa148, 0xa163, -- 0xa17e, 0x8655, 0x8664, 0x8655, 0x86b5, 0xa186, 0x0013, 0x1128, -- 0x080c, 0x7091, 0x080c, 0x7174, 0x0005, 0xa18e, 0x0047, 0x1118, -- 0xa016, 0x080c, 0x185e, 0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, -- 0x1a0c, 0x1515, 0x0013, 0x006e, 0x0005, 0x867d, 0x8a95, 0x8c4d, -- 0x867d, 0x8cc2, 0x8773, 0x867d, 0x867d, 0x8a27, 0x90e9, 0x867d, -- 0x867d, 0x867d, 0x867d, 0x867d, 0x867d, 0x080c, 0x1515, 0x0066, -- 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1515, 0x0013, 0x006e, 0x0005, -- 0x8698, 0x971c, 0x8698, 0x8698, 0x8698, 0x8698, 0x8698, 0x8698, -- 0x96c7, 0x9888, 0x8698, 0x9749, 0x97c0, 0x9749, 0x97c0, 0x8698, -- 0x080c, 0x1515, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1515, -- 0x0013, 0x006e, 0x0005, 0x86b3, 0x912a, 0x91f4, 0x932f, 0x948b, -- 0x86b3, 0x86b3, 0x86b3, 0x9104, 0x9677, 0x967a, 0x86b3, 0x86b3, -- 0x86b3, 0x86b3, 0x96a4, 0x080c, 0x1515, 0x0066, 0x6000, 0xa0b2, -- 0x0010, 0x1a0c, 0x1515, 0x0013, 0x006e, 0x0005, 0x86ce, 0x86ce, -- 0x86ce, 0x86fc, 0x8749, 0x86ce, 0x86ce, 0x86ce, 0x86d0, 0x86ce, -- 0x86ce, 0x86ce, 0x86ce, 0x86ce, 0x86ce, 0x86ce, 0x080c, 0x1515, -- 0xa186, 0x0003, 0x190c, 0x1515, 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, 0x1fa9, 0x080c, 0x6cf1, 0x0126, 0x2091, 0x8000, -- 0x080c, 0x7231, 0x012e, 0x0005, 0xa182, 0x0047, 0x0002, 0x8708, -- 0x8708, 0x870a, 0x8723, 0x8708, 0x8708, 0x8708, 0x8708, 0x8735, -- 0x080c, 0x1515, 0x00d6, 0x0016, 0x080c, 0x7127, 0x080c, 0x7231, -- 0x6003, 0x0004, 0x6110, 0x2168, 0x684f, 0x0020, 0x685c, 0x685a, -- 0x6874, 0x687e, 0x6878, 0x6882, 0x6897, 0x0000, 0x689b, 0x0000, -- 0x001e, 0x00de, 0x0005, 0x080c, 0x7127, 0x00d6, 0x6110, 0x2168, -- 0x080c, 0x9c54, 0x0120, 0x684b, 0x0006, 0x080c, 0x5409, 0x00de, -- 0x080c, 0x8617, 0x080c, 0x7231, 0x0005, 0x080c, 0x7127, 0x080c, -- 0x2c9c, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9c54, 0x0120, 0x684b, -- 0x0029, 0x080c, 0x5409, 0x00de, 0x080c, 0x8617, 0x080c, 0x7231, -- 0x0005, 0xa182, 0x0047, 0x0002, 0x8757, 0x8766, 0x8755, 0x8755, -- 0x8755, 0x8755, 0x8755, 0x8755, 0x8755, 0x080c, 0x1515, 0x00d6, -- 0x6010, 0x2068, 0x684c, 0xc0f4, 0x684e, 0x00de, 0x20e1, 0x0005, -- 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x185e, 0x0005, 0x00d6, 0x6110, -- 0x2168, 0x684b, 0x0000, 0x6853, 0x0000, 0x080c, 0x5409, 0x00de, -- 0x080c, 0x8617, 0x0005, 0xa1b6, 0x0015, 0x1118, 0x080c, 0x8617, -- 0x0030, 0xa1b6, 0x0016, 0x190c, 0x1515, 0x080c, 0x8617, 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, 0x878e, 0x00e6, 0x080c, 0x9c54, 0x0130, 0x6010, 0x2070, -- 0x7007, 0x0000, 0x7037, 0x0103, 0x00ee, 0x080c, 0x8617, 0x0005, -- 0x00d6, 0x0036, 0x7330, 0xa386, 0x0200, 0x1130, 0x6018, 0x2068, -- 0x6813, 0x00ff, 0x6817, 0xfffd, 0x6010, 0xa005, 0x0130, 0x2068, -- 0x6807, 0x0000, 0x6837, 0x0103, 0x6b32, 0x080c, 0x8617, 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, 0x8617, -- 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, 0x4b90, 0x00e6, 0x080c, -- 0x9c54, 0x0140, 0x6010, 0x2070, 0x7007, 0x0000, 0x7034, 0x70b2, -- 0x7037, 0x0103, 0x00ee, 0x080c, 0x8617, 0x001e, 0x0005, 0x00e6, -- 0x00d6, 0x603f, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, -- 0xa104, 0x001e, 0x1168, 0x0026, 0x6228, 0x2268, 0x002e, 0x2071, -- 0xbb8c, 0x6b1c, 0xa386, 0x0003, 0x0130, 0xa386, 0x0006, 0x0128, -- 0x080c, 0x8617, 0x0020, 0x0031, 0x0010, 0x080c, 0x88f0, 0x00de, -- 0x00ee, 0x0005, 0x00f6, 0x6810, 0x2078, 0xa186, 0x0015, 0x0904, -- 0x88d7, 0xa18e, 0x0016, 0x1904, 0x88ee, 0x700c, 0xa08c, 0xff00, -- 0xa186, 0x1700, 0x0120, 0xa186, 0x0300, 0x1904, 0x88b6, 0x8fff, -- 0x1138, 0x6800, 0xa086, 0x000f, 0x0904, 0x889a, 0x0804, 0x88ec, -- 0x6808, 0xa086, 0xffff, 0x1904, 0x88d9, 0x784c, 0xa084, 0x0060, -- 0xa086, 0x0020, 0x1150, 0x797c, 0x7810, 0xa106, 0x1904, 0x88d9, -- 0x7980, 0x7814, 0xa106, 0x1904, 0x88d9, 0x080c, 0x9e0b, 0x6858, -- 0x7852, 0x784c, 0xc0dc, 0xc0f4, 0xc0d4, 0x784e, 0x0026, 0xa00e, -- 0x6a14, 0x2001, 0x000a, 0x080c, 0x6b41, 0x7854, 0xa20a, 0x0208, -- 0x8011, 0x7a56, 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, -- 0x9a03, 0x00ce, 0x0804, 0x88ec, 0x00c6, 0x00d6, 0x2f68, 0x6838, -- 0xd0fc, 0x1118, 0x080c, 0x4c65, 0x0010, 0x080c, 0x4e4a, 0x00de, -- 0x00ce, 0x1904, 0x88d9, 0x00c6, 0x2d60, 0x080c, 0x8617, 0x00ce, -- 0x0804, 0x88ec, 0x00c6, 0x080c, 0x9ed0, 0x0190, 0x6013, 0x0000, -- 0x6818, 0x601a, 0x080c, 0xa021, 0x601f, 0x0003, 0x6904, 0x00c6, -- 0x2d60, 0x080c, 0x8617, 0x00ce, 0x080c, 0x8646, 0x00ce, 0x04e0, -- 0x2001, 0xb7b8, 0x2004, 0x683e, 0x00ce, 0x04b0, 0x7008, 0xa086, -- 0x000b, 0x11a0, 0x6018, 0x200c, 0xc1bc, 0x2102, 0x00c6, 0x2d60, -- 0x7853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, -- 0x080c, 0x6c8e, 0x080c, 0x7174, 0x00ce, 0x00f0, 0x700c, 0xa086, -- 0x2a00, 0x1138, 0x2001, 0xb7b8, 0x2004, 0x683e, 0x00a8, 0x0481, -- 0x00a8, 0x8fff, 0x090c, 0x1515, 0x00c6, 0x00d6, 0x2d60, 0x2f68, -- 0x6837, 0x0103, 0x684b, 0x0003, 0x080c, 0x98f7, 0x080c, 0x9e0b, -- 0x080c, 0x9e17, 0x00de, 0x00ce, 0x080c, 0x8617, 0x00fe, 0x0005, -- 0xa186, 0x0015, 0x1128, 0x2001, 0xb7b8, 0x2004, 0x683e, 0x0068, -- 0xa18e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xb32e, -- 0x080c, 0x6af0, 0x080c, 0x8617, 0x00ce, 0x080c, 0x8617, 0x0005, -- 0x0026, 0x0036, 0x0046, 0x7228, 0x7c80, 0x7b7c, 0xd2f4, 0x0130, -- 0x2001, 0xb7b8, 0x2004, 0x683e, 0x0804, 0x896a, 0x00c6, 0x2d60, -- 0x080c, 0x9917, 0x00ce, 0x6804, 0xa086, 0x0050, 0x1168, 0x00c6, -- 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x6c8e, -- 0x080c, 0x7174, 0x00ce, 0x04f0, 0x6800, 0xa086, 0x000f, 0x01c8, -- 0x8fff, 0x090c, 0x1515, 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, 0x9f5d, 0x080c, -- 0x7174, 0x0010, 0x080c, 0x8617, 0x004e, 0x003e, 0x002e, 0x0005, -- 0x00e6, 0x00d6, 0x0026, 0x6034, 0x2068, 0x6a1c, 0xa286, 0x0007, -- 0x0904, 0x89ce, 0xa286, 0x0002, 0x0904, 0x89ce, 0xa286, 0x0000, -- 0x0904, 0x89ce, 0x6808, 0x6338, 0xa306, 0x1904, 0x89ce, 0x2071, -- 0xbb8c, 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, 0x9c54, -- 0x090c, 0x1515, 0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, -- 0x601f, 0x0002, 0x080c, 0x6c8e, 0x080c, 0x7174, 0x00ce, 0x0030, -- 0x6034, 0x2070, 0x2001, 0xb7b8, 0x2004, 0x703e, 0x080c, 0x8617, -- 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, 0x90d4, 0x002e, 0x003e, 0x015e, -- 0x11d8, 0x0156, 0x0036, 0x0026, 0xae90, 0x000c, 0xa290, 0x0008, -- 0x20a9, 0x0004, 0xad98, 0x0006, 0x080c, 0x90d4, 0x002e, 0x003e, -- 0x015e, 0x1150, 0x7038, 0x680a, 0x703c, 0x680e, 0x6800, 0xc08d, -- 0x6802, 0x00de, 0x0804, 0x879a, 0x080c, 0x2c9c, 0x00c6, 0x080c, -- 0x85c1, 0x2f00, 0x601a, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, -- 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x4efe, 0x080c, -- 0x4f2b, 0x080c, 0x6cd4, 0x080c, 0x7174, 0x00ce, 0x0c10, 0x2100, -- 0xa1b2, 0x0080, 0x1a0c, 0x1515, 0xa1b2, 0x0040, 0x1a04, 0x8a8b, -- 0x0002, 0x8a7f, 0x8a73, 0x8a7f, 0x8a7f, 0x8a7f, 0x8a7f, 0x8a71, -- 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, -- 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, -- 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, -- 0x8a7f, 0x8a71, 0x8a7f, 0x8a7f, 0x8a71, 0x8a71, 0x8a71, 0x8a71, -- 0x8a71, 0x8a7f, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, -- 0x8a71, 0x8a71, 0x8a71, 0x8a7f, 0x8a7f, 0x8a71, 0x8a71, 0x8a71, -- 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a71, 0x8a7f, 0x8a71, -- 0x8a71, 0x080c, 0x1515, 0x6003, 0x0001, 0x6106, 0x080c, 0x6cd4, -- 0x0126, 0x2091, 0x8000, 0x080c, 0x7174, 0x012e, 0x0005, 0x6003, -- 0x0001, 0x6106, 0x080c, 0x6cd4, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x7174, 0x012e, 0x0005, 0x2600, 0x0002, 0x8a7f, 0x8a7f, 0x8a93, -- 0x8a7f, 0x8a7f, 0x8a93, 0x080c, 0x1515, 0x6004, 0xa0b2, 0x0080, -- 0x1a0c, 0x1515, 0xa1b6, 0x0013, 0x0904, 0x8b45, 0xa1b6, 0x0027, -- 0x1904, 0x8b0b, 0x080c, 0x7091, 0x6004, 0x080c, 0x9e41, 0x0190, -- 0x080c, 0x9e52, 0x0904, 0x8b05, 0xa08e, 0x0021, 0x0904, 0x8b08, -- 0xa08e, 0x0022, 0x0904, 0x8b05, 0xa08e, 0x003d, 0x0904, 0x8b08, -- 0x0804, 0x8afe, 0x080c, 0x2cc2, 0x2001, 0x0007, 0x080c, 0x4efe, -- 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, 0x8c13, 0xa186, 0x007e, -- 0x1148, 0x2001, 0xb535, 0x2014, 0xc285, 0x080c, 0x5ad0, 0x1108, -- 0xc2ad, 0x2202, 0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019, -- 0x0028, 0x080c, 0x8293, 0x002e, 0x080c, 0xb381, 0x003e, 0x002e, -- 0x001e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, -- 0x6df6, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d03, 0x00c6, 0x6018, -- 0xa065, 0x0110, 0x080c, 0x51ab, 0x00ce, 0x2c08, 0x080c, 0xae76, -- 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0x4f6d, 0x080c, 0xa019, -- 0x080c, 0x8617, 0x080c, 0x7174, 0x0005, 0x080c, 0x8c13, 0x0cb0, -- 0x080c, 0x8c41, 0x0c98, 0xa186, 0x0014, 0x1db0, 0x080c, 0x7091, -- 0x080c, 0x2c9c, 0x080c, 0x9e41, 0x1188, 0x080c, 0x2cc2, 0x6018, -- 0xa080, 0x0028, 0x200c, 0x080c, 0x8c13, 0xa186, 0x007e, 0x1128, -- 0x2001, 0xb535, 0x200c, 0xc185, 0x2102, 0x08c0, 0x080c, 0x9e52, -- 0x1118, 0x080c, 0x8c13, 0x0890, 0x6004, 0xa08e, 0x0032, 0x1158, -- 0x00e6, 0x00f6, 0x2071, 0xb582, 0x2079, 0x0000, 0x080c, 0x2fcf, -- 0x00fe, 0x00ee, 0x0818, 0x6004, 0xa08e, 0x0021, 0x0d50, 0xa08e, -- 0x0022, 0x090c, 0x8c13, 0x0804, 0x8afe, 0xa0b2, 0x0040, 0x1a04, -- 0x8c08, 0x2008, 0x0002, 0x8b8d, 0x8b8e, 0x8b91, 0x8b94, 0x8b97, -- 0x8b9a, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, -- 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, -- 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, -- 0x8b8b, 0x8b9d, 0x8bac, 0x8b8b, 0x8bae, 0x8bac, 0x8b8b, 0x8b8b, -- 0x8b8b, 0x8b8b, 0x8b8b, 0x8bac, 0x8bac, 0x8b8b, 0x8b8b, 0x8b8b, -- 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8b8b, 0x8be8, 0x8bac, 0x8b8b, -- 0x8ba8, 0x8b8b, 0x8b8b, 0x8b8b, 0x8ba9, 0x8b8b, 0x8b8b, 0x8b8b, -- 0x8bac, 0x8bdf, 0x8b8b, 0x080c, 0x1515, 0x00f0, 0x2001, 0x000b, -- 0x0460, 0x2001, 0x0003, 0x0448, 0x2001, 0x0005, 0x0430, 0x2001, -- 0x0001, 0x0418, 0x2001, 0x0009, 0x0400, 0x080c, 0x7091, 0x6003, -- 0x0005, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x080c, 0x7174, 0x00a0, -- 0x0018, 0x0010, 0x080c, 0x4efe, 0x0804, 0x8bf9, 0x080c, 0x7091, -- 0x2001, 0xb7b6, 0x2004, 0x6016, 0x2001, 0xb7b8, 0x2004, 0x603e, -- 0x6003, 0x0004, 0x080c, 0x7174, 0x0005, 0x080c, 0x4efe, 0x080c, -- 0x7091, 0x6003, 0x0002, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x0036, -- 0x2019, 0xb55d, 0x2304, 0xa084, 0xff00, 0x1120, 0x2001, 0xb7b6, -- 0x201c, 0x0040, 0x8007, 0xa09a, 0x0004, 0x0ec0, 0x8003, 0x801b, -- 0x831b, 0xa318, 0x6316, 0x003e, 0x080c, 0x7174, 0x08e8, 0x080c, -- 0x7091, 0x080c, 0xa019, 0x080c, 0x8617, 0x080c, 0x7174, 0x08a0, -- 0x00e6, 0x00f6, 0x2071, 0xb582, 0x2079, 0x0000, 0x080c, 0x2fcf, -- 0x00fe, 0x00ee, 0x080c, 0x7091, 0x080c, 0x8617, 0x080c, 0x7174, -- 0x0818, 0x080c, 0x7091, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x6003, -- 0x0002, 0x2001, 0xb7b6, 0x2004, 0x6016, 0x080c, 0x7174, 0x0005, -- 0x2600, 0x2008, 0x0002, 0x8c11, 0x8c11, 0x8c11, 0x8bf9, 0x8bf9, -- 0x8c11, 0x080c, 0x1515, 0x00e6, 0x0026, 0x0016, 0x080c, 0x9c54, -- 0x0508, 0x6010, 0x2070, 0x7034, 0xa086, 0x0139, 0x1148, 0x2001, -- 0x0030, 0x2009, 0x0000, 0x2011, 0x4005, 0x080c, 0xa0d0, 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, 0x1515, -- 0x6604, 0xa6b6, 0x0043, 0x1120, 0x080c, 0xa08c, 0x0804, 0x8cb2, -- 0x6604, 0xa6b6, 0x0033, 0x1120, 0x080c, 0xa03c, 0x0804, 0x8cb2, -- 0x6604, 0xa6b6, 0x0028, 0x1120, 0x080c, 0x9e82, 0x0804, 0x8cb2, -- 0x6604, 0xa6b6, 0x0029, 0x1118, 0x080c, 0x9e99, 0x04d8, 0x6604, -- 0xa6b6, 0x001f, 0x1118, 0x080c, 0x8780, 0x04a0, 0x6604, 0xa6b6, -- 0x0000, 0x1118, 0x080c, 0x89d4, 0x0468, 0x6604, 0xa6b6, 0x0022, -- 0x1118, 0x080c, 0x87a8, 0x0430, 0x6604, 0xa6b6, 0x0035, 0x1118, -- 0x080c, 0x880f, 0x00f8, 0x6604, 0xa6b6, 0x0039, 0x1118, 0x080c, -- 0x8970, 0x00c0, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c, 0x87c2, -- 0x0088, 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x87e2, 0x0050, -- 0xa1b6, 0x0015, 0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016, 0x1118, -- 0x0804, 0x8e76, 0x0005, 0x080c, 0x865d, 0x0ce0, 0x8cd9, 0x8cdc, -- 0x8cd9, 0x8d1e, 0x8cd9, 0x8e03, 0x8e84, 0x8cd9, 0x8cd9, 0x8e52, -- 0x8cd9, 0x8e66, 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005, 0x3d18, -- 0x3e20, 0x2c10, 0x080c, 0x185e, 0x0005, 0x00e6, 0xacf0, 0x0004, -- 0x2e74, 0x7000, 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x8617, -- 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, 0xb500, 0x7084, -- 0xa086, 0x0074, 0x1530, 0x080c, 0xae4d, 0x11b0, 0x00d6, 0x6018, -- 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110, 0xc0c5, -- 0x6802, 0x00d9, 0x00de, 0x2001, 0x0006, 0x080c, 0x4efe, 0x080c, -- 0x2cc2, 0x080c, 0x8617, 0x0078, 0x2001, 0x000a, 0x080c, 0x4efe, -- 0x080c, 0x2cc2, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x6cd4, -- 0x0010, 0x080c, 0x8df0, 0x00ee, 0x0005, 0x6800, 0xd084, 0x0168, -- 0x2001, 0x0000, 0x080c, 0x4eec, 0x2069, 0xb552, 0x6804, 0xd0a4, -- 0x0120, 0x2001, 0x0006, 0x080c, 0x4f2b, 0x0005, 0x00d6, 0x2011, -- 0xb521, 0x2204, 0xa086, 0x0074, 0x1904, 0x8ded, 0x6018, 0x2068, -- 0x6aa0, 0xa286, 0x007e, 0x1120, 0x080c, 0x8f9c, 0x0804, 0x8d8c, -- 0x080c, 0x8f92, 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, 0x4efe, 0x080c, 0x2cc2, 0x080c, 0x8617, -- 0x0804, 0x8dee, 0x00e6, 0x2071, 0xb535, 0x2e04, 0xd09c, 0x0188, -- 0x2071, 0xbb80, 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, 0xa0d0, 0x0840, -- 0x2001, 0x0004, 0x080c, 0x4efe, 0x6003, 0x0001, 0x6007, 0x0003, -- 0x080c, 0x6cd4, 0x0804, 0x8dee, 0x685c, 0xd0e4, 0x01d8, 0x080c, -- 0x9fcc, 0x080c, 0x5ad0, 0x0118, 0xd0dc, 0x1904, 0x8d48, 0x2011, -- 0xb535, 0x2204, 0xc0ad, 0x2012, 0x2001, 0xb78f, 0x2004, 0x00f6, -- 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2872, 0x78e2, 0x00fe, -- 0x0804, 0x8d48, 0x080c, 0xa002, 0x2011, 0xb535, 0x2204, 0xc0a5, -- 0x2012, 0x0006, 0x080c, 0xaf6f, 0x000e, 0x1904, 0x8d48, 0xc0b5, -- 0x2012, 0x2001, 0x0006, 0x080c, 0x4efe, 0x2001, 0x0000, 0x080c, -- 0x4eec, 0x00c6, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, -- 0x7932, 0x7936, 0x00fe, 0x080c, 0x2847, 0x00f6, 0x2079, 0xb500, -- 0x7976, 0x2100, 0x2009, 0x0000, 0x080c, 0x281d, 0x7952, 0x00fe, -- 0x8108, 0x080c, 0x4f4e, 0x2c00, 0x00ce, 0x1904, 0x8d48, 0x601a, -- 0x2001, 0x0002, 0x080c, 0x4efe, 0x601f, 0x0001, 0x6003, 0x0001, -- 0x6007, 0x0002, 0x080c, 0x6cd4, 0x0008, 0x0011, 0x00de, 0x0005, -- 0x2001, 0x0007, 0x080c, 0x4efe, 0x2001, 0xb500, 0x2004, 0xa086, -- 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x4f2b, 0x080c, 0x2cc2, -- 0x080c, 0x8617, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071, 0xb500, -- 0x7084, 0xa086, 0x0014, 0x15f0, 0x7000, 0xa086, 0x0003, 0x1128, -- 0x6010, 0xa005, 0x1110, 0x080c, 0x3f3f, 0x00d6, 0x6018, 0x2068, -- 0x080c, 0x504c, 0x080c, 0x8d0d, 0x00de, 0x080c, 0x904b, 0x1550, -- 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0518, 0x2001, -- 0x0006, 0x080c, 0x4efe, 0x00e6, 0x6010, 0xa075, 0x01a8, 0x7034, -- 0xa084, 0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, 0x0000, 0x2009, -- 0x0000, 0x2011, 0x4000, 0x080c, 0xa0d0, 0x0030, 0x7007, 0x0000, -- 0x7037, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2cc2, 0x080c, -- 0x8617, 0x0020, 0x080c, 0x8c13, 0x080c, 0x8df0, 0x001e, 0x002e, -- 0x00ee, 0x0005, 0x2011, 0xb521, 0x2204, 0xa086, 0x0014, 0x1158, -- 0x2001, 0x0002, 0x080c, 0x4efe, 0x6003, 0x0001, 0x6007, 0x0001, -- 0x080c, 0x6cd4, 0x0010, 0x080c, 0x8df0, 0x0005, 0x2011, 0xb521, -- 0x2204, 0xa086, 0x0004, 0x1138, 0x2001, 0x0007, 0x080c, 0x4efe, -- 0x080c, 0x8617, 0x0010, 0x080c, 0x8df0, 0x0005, 0x000b, 0x0005, -- 0x8cd9, 0x8e8f, 0x8cd9, 0x8ec3, 0x8cd9, 0x8f4e, 0x8e84, 0x8cd9, -- 0x8cd9, 0x8f61, 0x8cd9, 0x8f71, 0x6604, 0xa686, 0x0003, 0x0904, -- 0x8e03, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x8617, 0x0005, 0x00d6, -- 0x00c6, 0x080c, 0x8f81, 0x1178, 0x2001, 0x0000, 0x080c, 0x4eec, -- 0x2001, 0x0002, 0x080c, 0x4efe, 0x6003, 0x0001, 0x6007, 0x0002, -- 0x080c, 0x6cd4, 0x00e8, 0x2009, 0xbb8e, 0x2104, 0xa086, 0x0009, -- 0x1160, 0x6018, 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0170, -- 0x8001, 0x6842, 0x6017, 0x000a, 0x0058, 0x2009, 0xbb8f, 0x2104, -- 0xa084, 0xff00, 0xa086, 0x1900, 0x1108, 0x08d0, 0x080c, 0x8df0, -- 0x00ce, 0x00de, 0x0005, 0x0026, 0x2011, 0x0000, 0x080c, 0x8f8f, -- 0x00d6, 0x2069, 0xb79e, 0x2d04, 0xa005, 0x0168, 0x6018, 0x2068, -- 0x68a0, 0xa086, 0x007e, 0x1138, 0x2069, 0xb51d, 0x2d04, 0x8000, -- 0x206a, 0x00de, 0x0010, 0x00de, 0x0078, 0x2001, 0x0000, 0x080c, -- 0x4eec, 0x2001, 0x0002, 0x080c, 0x4efe, 0x6003, 0x0001, 0x6007, -- 0x0002, 0x080c, 0x6cd4, 0x0480, 0x00d6, 0x6010, 0x2068, 0x080c, -- 0x9c54, 0x00de, 0x0108, 0x6a34, 0x080c, 0x8c13, 0x2009, 0xbb8e, -- 0x2134, 0xa6b4, 0x00ff, 0xa686, 0x0005, 0x0500, 0xa686, 0x000b, -- 0x01c8, 0x2009, 0xbb8f, 0x2104, 0xa084, 0xff00, 0x1118, 0xa686, -- 0x0009, 0x01a0, 0xa086, 0x1900, 0x1168, 0xa686, 0x0009, 0x0170, -- 0x2001, 0x0004, 0x080c, 0x4efe, 0x2001, 0x0028, 0x6016, 0x6007, -- 0x004b, 0x0010, 0x080c, 0x8df0, 0x002e, 0x0005, 0x00d6, 0xa286, -- 0x0139, 0x0160, 0x6010, 0x2068, 0x080c, 0x9c54, 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, 0xb500, 0x080c, 0x4bc7, -- 0x00ee, 0x0010, 0x080c, 0x2c9c, 0x00de, 0x0860, 0x080c, 0x8f8f, -- 0x1158, 0x2001, 0x0004, 0x080c, 0x4efe, 0x6003, 0x0001, 0x6007, -- 0x0003, 0x080c, 0x6cd4, 0x0020, 0x080c, 0x8c13, 0x080c, 0x8df0, -- 0x0005, 0x0469, 0x1158, 0x2001, 0x0008, 0x080c, 0x4efe, 0x6003, -- 0x0001, 0x6007, 0x0005, 0x080c, 0x6cd4, 0x0010, 0x080c, 0x8df0, -- 0x0005, 0x00e9, 0x1158, 0x2001, 0x000a, 0x080c, 0x4efe, 0x6003, -- 0x0001, 0x6007, 0x0001, 0x080c, 0x6cd4, 0x0010, 0x080c, 0x8df0, -- 0x0005, 0x2009, 0xbb8e, 0x2104, 0xa086, 0x0003, 0x1138, 0x2009, -- 0xbb8f, 0x2104, 0xa084, 0xff00, 0xa086, 0x2a00, 0x0005, 0xa085, -- 0x0001, 0x0005, 0x00c6, 0x0016, 0xac88, 0x0006, 0x2164, 0x080c, -- 0x4fb9, 0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036, -- 0x0016, 0x6018, 0x2068, 0x2071, 0xb535, 0x2e04, 0xa085, 0x0003, -- 0x2072, 0x080c, 0x9020, 0x0560, 0x2009, 0xb535, 0x2104, 0xc0cd, -- 0x200a, 0x2001, 0xb553, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, -- 0x2009, 0x002a, 0x080c, 0xb0dc, 0x2001, 0xb50c, 0x200c, 0xc195, -- 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, 0x2c6f, 0x2071, -- 0xb500, 0x080c, 0x2ab8, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009, -- 0x007f, 0x080c, 0x2d97, 0x8108, 0x1f04, 0x8fd1, 0x015e, 0x00ce, -- 0x080c, 0x8f92, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xbb80, -- 0x2079, 0x0100, 0x2e04, 0xa084, 0x00ff, 0x2069, 0xb51c, 0x206a, -- 0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0xb51d, 0x206a, 0x78ea, -- 0x7832, 0x7836, 0x2010, 0xa084, 0xff00, 0x001e, 0xa105, 0x2009, -- 0xb528, 0x200a, 0x2200, 0xa084, 0x00ff, 0x2008, 0x080c, 0x2847, -- 0x080c, 0x5ad0, 0x0170, 0x2069, 0xbb8e, 0x2071, 0xb7b2, 0x6810, -- 0x2072, 0x6814, 0x7006, 0x6818, 0x700a, 0x681c, 0x700e, 0x080c, -- 0x9fcc, 0x0040, 0x2001, 0x0006, 0x080c, 0x4efe, 0x080c, 0x2cc2, -- 0x080c, 0x8617, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, -- 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, 0xb528, 0x231c, 0x83ff, -- 0x01e8, 0x2071, 0xbb80, 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, -- 0xff00, 0xa205, 0xa306, 0x1190, 0x2011, 0xbb96, 0xad98, 0x000a, -- 0x20a9, 0x0004, 0x080c, 0x90d4, 0x1148, 0x2011, 0xbb9a, 0xad98, -- 0x0006, 0x20a9, 0x0004, 0x080c, 0x90d4, 0x1100, 0x015e, 0x00ee, -- 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0xbb8c, 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, 0xb7e9, 0x252c, 0x2021, -- 0xb7ef, 0x2424, 0x2061, 0xbd00, 0x2071, 0xb500, 0x7248, 0x7068, -- 0xa202, 0x16f0, 0x080c, 0xb104, 0x05a0, 0x671c, 0xa786, 0x0001, -- 0x0580, 0xa786, 0x0007, 0x0568, 0x2500, 0xac06, 0x0550, 0x2400, -- 0xac06, 0x0538, 0x00c6, 0x6000, 0xa086, 0x0004, 0x1110, 0x080c, -- 0x194d, 0xa786, 0x0008, 0x1148, 0x080c, 0x9e52, 0x1130, 0x00ce, -- 0x080c, 0x8c13, 0x080c, 0x9e17, 0x00a0, 0x6010, 0x2068, 0x080c, -- 0x9c54, 0x0160, 0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, -- 0x6847, 0x0000, 0x080c, 0x5409, 0x080c, 0x9e0b, 0x080c, 0x9e17, -- 0x00ce, 0xace0, 0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0x907e, -- 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, -- 0x00ee, 0x0005, 0xa786, 0x0006, 0x1118, 0x080c, 0xb08d, 0x0c30, -- 0xa786, 0x000a, 0x09e0, 0x08c8, 0x220c, 0x2304, 0xa106, 0x1130, -- 0x8210, 0x8318, 0x1f04, 0x90d4, 0xa006, 0x0005, 0x2304, 0xa102, -- 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, -- 0x0005, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1515, 0x080c, 0x9e41, -- 0x0120, 0x080c, 0x9e52, 0x0168, 0x0028, 0x080c, 0x2cc2, 0x080c, -- 0x9e52, 0x0138, 0x080c, 0x7091, 0x080c, 0x8617, 0x080c, 0x7174, -- 0x0005, 0x080c, 0x8c13, 0x0cb0, 0xa182, 0x0040, 0x0002, 0x911a, -- 0x911a, 0x911a, 0x911a, 0x911a, 0x911a, 0x911a, 0x911a, 0x911a, -- 0x911a, 0x911a, 0x911c, 0x911c, 0x911c, 0x911c, 0x911a, 0x911a, -- 0x911a, 0x911c, 0x080c, 0x1515, 0x600b, 0xffff, 0x6003, 0x0001, -- 0x6106, 0x080c, 0x6c8e, 0x0126, 0x2091, 0x8000, 0x080c, 0x7174, -- 0x012e, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, -- 0x0804, 0x91b6, 0xa186, 0x0027, 0x11e8, 0x080c, 0x7091, 0x080c, -- 0x2c9c, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9c54, 0x0168, 0x6837, -- 0x0103, 0x684b, 0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, -- 0x080c, 0x5409, 0x080c, 0x9e0b, 0x00de, 0x080c, 0x8617, 0x080c, -- 0x7174, 0x0005, 0xa186, 0x0014, 0x1120, 0x6004, 0xa082, 0x0040, -- 0x0428, 0xa186, 0x0046, 0x0138, 0xa186, 0x0045, 0x0120, 0xa186, -- 0x0047, 0x190c, 0x1515, 0x2001, 0x0109, 0x2004, 0xd084, 0x0198, -- 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x6b75, -- 0x002e, 0x001e, 0x000e, 0x012e, 0xe000, 0x6000, 0xa086, 0x0002, -- 0x1110, 0x0804, 0x91f4, 0x080c, 0x865d, 0x0005, 0x0002, 0x9194, -- 0x9192, 0x9192, 0x9192, 0x9192, 0x9192, 0x9192, 0x9192, 0x9192, -- 0x9192, 0x9192, 0x91af, 0x91af, 0x91af, 0x91af, 0x9192, 0x91af, -- 0x9192, 0x91af, 0x080c, 0x1515, 0x080c, 0x7091, 0x00d6, 0x6110, -- 0x2168, 0x080c, 0x9c54, 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, -- 0x6847, 0x0000, 0x6850, 0xc0ec, 0x6852, 0x080c, 0x5409, 0x080c, -- 0x9e0b, 0x00de, 0x080c, 0x8617, 0x080c, 0x7174, 0x0005, 0x080c, -- 0x7091, 0x080c, 0x8617, 0x080c, 0x7174, 0x0005, 0x0002, 0x91cc, -- 0x91ca, 0x91ca, 0x91ca, 0x91ca, 0x91ca, 0x91ca, 0x91ca, 0x91ca, -- 0x91ca, 0x91ca, 0x91de, 0x91de, 0x91de, 0x91de, 0x91ca, 0x91ed, -- 0x91ca, 0x91de, 0x080c, 0x1515, 0x080c, 0x7091, 0x2001, 0xb7b8, -- 0x2004, 0x603e, 0x6003, 0x0002, 0x080c, 0x7174, 0x6010, 0xa088, -- 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x0005, 0x080c, 0x7091, -- 0x2001, 0xb7b6, 0x2004, 0x6016, 0x2001, 0xb7b8, 0x2004, 0x603e, -- 0x6003, 0x000f, 0x080c, 0x7174, 0x0005, 0x080c, 0x7091, 0x080c, -- 0x8617, 0x080c, 0x7174, 0x0005, 0xa182, 0x0040, 0x0002, 0x920a, -- 0x920a, 0x920a, 0x920a, 0x920a, 0x920c, 0x92f1, 0x9320, 0x920a, -- 0x920a, 0x920a, 0x920a, 0x920a, 0x920a, 0x920a, 0x920a, 0x920a, -- 0x920a, 0x920a, 0x080c, 0x1515, 0x00e6, 0x00d6, 0x603f, 0x0000, -- 0x2071, 0xbb80, 0x7124, 0x610a, 0x2071, 0xbb8c, 0x6110, 0x2168, -- 0x7614, 0xa6b4, 0x0fff, 0x86ff, 0x0904, 0x92ba, 0xa68c, 0x0c00, -- 0x0518, 0x00f6, 0x2c78, 0x080c, 0x5306, 0x00fe, 0x01c8, 0x684c, -- 0xd0ac, 0x01b0, 0x6020, 0xd0dc, 0x1198, 0x6850, 0xd0bc, 0x1180, -- 0x7318, 0x6814, 0xa306, 0x1904, 0x92cd, 0x731c, 0x6810, 0xa31e, -- 0x0138, 0xd6d4, 0x0904, 0x92cd, 0x6b14, 0xa305, 0x1904, 0x92cd, -- 0x7318, 0x6b62, 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, -- 0x0518, 0xa186, 0x0028, 0x1128, 0x080c, 0x9e30, 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, -- 0xbb99, 0x2004, 0xa005, 0x1118, 0xc6c4, 0x0804, 0x921b, 0x7328, -- 0x732c, 0x6b56, 0x83ff, 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, -- 0x0008, 0x0036, 0x2308, 0x2019, 0xbb98, 0xad90, 0x0019, 0x080c, -- 0x9907, 0x003e, 0xd6cc, 0x0904, 0x92e0, 0x7124, 0x695a, 0x81ff, -- 0x0904, 0x92e0, 0xa192, 0x0021, 0x1260, 0x2071, 0xbb98, 0x831c, -- 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x9907, 0x080c, 0xa131, -- 0x04b8, 0x6838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c68, -- 0x00f6, 0x2d78, 0x080c, 0x98ac, 0x00fe, 0x080c, 0xa131, 0x080c, -- 0x98f7, 0x0440, 0x00f6, 0x2c78, 0x080c, 0x5306, 0x00fe, 0x0190, -- 0x684c, 0xd0ac, 0x0178, 0x6020, 0xd0dc, 0x1160, 0x6850, 0xd0bc, -- 0x1148, 0x6810, 0x6914, 0xa105, 0x0128, 0x080c, 0x9f2f, 0x00de, -- 0x00ee, 0x00f0, 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, -- 0xd0ac, 0x0130, 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x947d, -- 0x080c, 0x5409, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, -- 0x6a3e, 0x080c, 0x9efd, 0x00de, 0x00ee, 0x1110, 0x080c, 0x8617, -- 0x0005, 0x00f6, 0x6003, 0x0003, 0x2079, 0xbb8c, 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, 0x1fa9, 0x080c, 0x6cf1, 0x080c, 0x7231, 0x0005, -- 0x2001, 0xb7b8, 0x2004, 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, -- 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x185e, 0x0005, 0xa182, -- 0x0040, 0x0002, 0x9345, 0x9345, 0x9345, 0x9345, 0x9345, 0x9347, -- 0x93da, 0x9345, 0x9345, 0x93f0, 0x9454, 0x9345, 0x9345, 0x9345, -- 0x9345, 0x9463, 0x9345, 0x9345, 0x9345, 0x080c, 0x1515, 0x0076, -- 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xbb8c, 0x6110, 0x2178, 0x7614, -- 0xa6b4, 0x0fff, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, -- 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x93d5, -- 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, -- 0x785e, 0xa284, 0x0300, 0x0904, 0x93d5, 0x080c, 0x15f8, 0x090c, -- 0x1515, 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, 0xbb98, 0xad90, 0x0019, 0x080c, 0x9907, 0x003e, -- 0xd6cc, 0x01d8, 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, -- 0x1250, 0x2071, 0xbb98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, -- 0x080c, 0x9907, 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, -- 0x695a, 0x0c78, 0x2d78, 0x080c, 0x98ac, 0x00de, 0x00ee, 0x00fe, -- 0x007e, 0x0005, 0x00f6, 0x6003, 0x0003, 0x2079, 0xbb8c, 0x7c04, -- 0x7b00, 0x7e0c, 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, -- 0x7d0e, 0x00fe, 0x2c10, 0x080c, 0x1fa9, 0x080c, 0x7d61, 0x0005, -- 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x5306, 0x00fe, 0x0120, 0x2001, -- 0xb7b8, 0x2004, 0x603e, 0x6003, 0x0002, 0x080c, 0x7127, 0x080c, -- 0x7231, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, 0x9452, 0xd1cc, -- 0x0540, 0x6948, 0x6838, 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, -- 0x6850, 0x0006, 0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, -- 0x0156, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0x941a, -- 0x015e, 0x000e, 0x6852, 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, -- 0x161f, 0x0418, 0x0016, 0x080c, 0x161f, 0x00de, 0x080c, 0x98f7, -- 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, 0x5409, 0x080c, 0x9efd, 0x1110, -- 0x080c, 0x8617, 0x00de, 0x0005, 0x2019, 0x0001, 0x080c, 0x7fe5, -- 0x6003, 0x0002, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x080c, 0x7127, -- 0x080c, 0x7231, 0x0005, 0x080c, 0x7127, 0x080c, 0x2c9c, 0x00d6, -- 0x6110, 0x2168, 0x080c, 0x9c54, 0x0150, 0x6837, 0x0103, 0x684b, -- 0x0029, 0x6847, 0x0000, 0x080c, 0x5409, 0x080c, 0x9e0b, 0x00de, -- 0x080c, 0x8617, 0x080c, 0x7231, 0x0005, 0x684b, 0x0015, 0xd1fc, -- 0x0138, 0x684b, 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, -- 0x6962, 0x685e, 0x0005, 0xa182, 0x0040, 0x0002, 0x94a1, 0x94a1, -- 0x94a1, 0x94a1, 0x94a1, 0x94a3, 0x94a1, 0x955e, 0x956a, 0x94a1, -- 0x94a1, 0x94a1, 0x94a1, 0x94a1, 0x94a1, 0x94a1, 0x94a1, 0x94a1, -- 0x94a1, 0x080c, 0x1515, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, -- 0xbb8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, -- 0x080c, 0x5306, 0x00fe, 0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, -- 0xd0f4, 0x0120, 0x080c, 0x9f2f, 0x0804, 0x9559, 0x7e46, 0x7f4c, -- 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, -- 0x6a3e, 0x86ff, 0x0904, 0x954f, 0xa694, 0xff00, 0xa284, 0x0c00, -- 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, -- 0x954d, 0xa686, 0x0100, 0x1140, 0x2001, 0xbb99, 0x2004, 0xa005, -- 0x1118, 0xc6c4, 0x7e46, 0x0c28, 0x080c, 0x15f8, 0x090c, 0x1515, -- 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, -+ 0x705c, 0xa502, 0x1228, 0x754e, 0xa085, 0x0001, 0x00ee, 0x0005, -+ 0x704f, 0xbd00, 0x0cc8, 0xa006, 0x0cc8, 0xac82, 0xbd00, 0x0a0c, -+ 0x1515, 0x2001, 0xb517, 0x2004, 0xac02, 0x1a0c, 0x1515, 0xa006, -+ 0x6006, 0x600a, 0x600e, 0x6012, 0x6016, 0x601a, 0x601f, 0x0000, -+ 0x6003, 0x0000, 0x6052, 0x6056, 0x6022, 0x6026, 0x602a, 0x602e, -+ 0x6032, 0x6036, 0x603a, 0x603e, 0x2061, 0xb500, 0x6048, 0x8000, -+ 0x604a, 0xa086, 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x7173, 0x012e, 0x0cc0, 0x601c, 0xa084, 0x000f, 0x0002, -+ 0x865b, 0x866a, 0x8685, 0x86a0, 0xa152, 0xa16d, 0xa188, 0x865b, -+ 0x866a, 0x865b, 0x86bb, 0xa186, 0x0013, 0x1128, 0x080c, 0x7090, -+ 0x080c, 0x7173, 0x0005, 0xa18e, 0x0047, 0x1118, 0xa016, 0x080c, -+ 0x185e, 0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1515, -+ 0x0013, 0x006e, 0x0005, 0x8683, 0x8a9b, 0x8c53, 0x8683, 0x8cc8, -+ 0x8779, 0x8683, 0x8683, 0x8a2d, 0x90ef, 0x8683, 0x8683, 0x8683, -+ 0x8683, 0x8683, 0x8683, 0x080c, 0x1515, 0x0066, 0x6000, 0xa0b2, -+ 0x0010, 0x1a0c, 0x1515, 0x0013, 0x006e, 0x0005, 0x869e, 0x9722, -+ 0x869e, 0x869e, 0x869e, 0x869e, 0x869e, 0x869e, 0x96cd, 0x988e, -+ 0x869e, 0x974f, 0x97c6, 0x974f, 0x97c6, 0x869e, 0x080c, 0x1515, -+ 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1515, 0x0013, 0x006e, -+ 0x0005, 0x86b9, 0x9130, 0x91fa, 0x9335, 0x9491, 0x86b9, 0x86b9, -+ 0x86b9, 0x910a, 0x967d, 0x9680, 0x86b9, 0x86b9, 0x86b9, 0x86b9, -+ 0x96aa, 0x080c, 0x1515, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, -+ 0x1515, 0x0013, 0x006e, 0x0005, 0x86d4, 0x86d4, 0x86d4, 0x8702, -+ 0x874f, 0x86d4, 0x86d4, 0x86d4, 0x86d6, 0x86d4, 0x86d4, 0x86d4, -+ 0x86d4, 0x86d4, 0x86d4, 0x86d4, 0x080c, 0x1515, 0xa186, 0x0003, -+ 0x190c, 0x1515, 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, -+ 0x1fa9, 0x080c, 0x6cf0, 0x0126, 0x2091, 0x8000, 0x080c, 0x7230, -+ 0x012e, 0x0005, 0xa182, 0x0047, 0x0002, 0x870e, 0x870e, 0x8710, -+ 0x8729, 0x870e, 0x870e, 0x870e, 0x870e, 0x873b, 0x080c, 0x1515, -+ 0x00d6, 0x0016, 0x080c, 0x7126, 0x080c, 0x7230, 0x6003, 0x0004, -+ 0x6110, 0x2168, 0x684f, 0x0020, 0x685c, 0x685a, 0x6874, 0x687e, -+ 0x6878, 0x6882, 0x6897, 0x0000, 0x689b, 0x0000, 0x001e, 0x00de, -+ 0x0005, 0x080c, 0x7126, 0x00d6, 0x6110, 0x2168, 0x080c, 0x9c5a, -+ 0x0120, 0x684b, 0x0006, 0x080c, 0x5408, 0x00de, 0x080c, 0x861d, -+ 0x080c, 0x7230, 0x0005, 0x080c, 0x7126, 0x080c, 0x2c9c, 0x00d6, -+ 0x6110, 0x2168, 0x080c, 0x9c5a, 0x0120, 0x684b, 0x0029, 0x080c, -+ 0x5408, 0x00de, 0x080c, 0x861d, 0x080c, 0x7230, 0x0005, 0xa182, -+ 0x0047, 0x0002, 0x875d, 0x876c, 0x875b, 0x875b, 0x875b, 0x875b, -+ 0x875b, 0x875b, 0x875b, 0x080c, 0x1515, 0x00d6, 0x6010, 0x2068, -+ 0x684c, 0xc0f4, 0x684e, 0x00de, 0x20e1, 0x0005, 0x3d18, 0x3e20, -+ 0x2c10, 0x080c, 0x185e, 0x0005, 0x00d6, 0x6110, 0x2168, 0x684b, -+ 0x0000, 0x6853, 0x0000, 0x080c, 0x5408, 0x00de, 0x080c, 0x861d, -+ 0x0005, 0xa1b6, 0x0015, 0x1118, 0x080c, 0x861d, 0x0030, 0xa1b6, -+ 0x0016, 0x190c, 0x1515, 0x080c, 0x861d, 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, 0x8794, -+ 0x00e6, 0x080c, 0x9c5a, 0x0130, 0x6010, 0x2070, 0x7007, 0x0000, -+ 0x7037, 0x0103, 0x00ee, 0x080c, 0x861d, 0x0005, 0x00d6, 0x0036, -+ 0x7330, 0xa386, 0x0200, 0x1130, 0x6018, 0x2068, 0x6813, 0x00ff, -+ 0x6817, 0xfffd, 0x6010, 0xa005, 0x0130, 0x2068, 0x6807, 0x0000, -+ 0x6837, 0x0103, 0x6b32, 0x080c, 0x861d, 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, 0x861d, 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, 0x4b8f, 0x00e6, 0x080c, 0x9c5a, 0x0140, -+ 0x6010, 0x2070, 0x7007, 0x0000, 0x7034, 0x70b2, 0x7037, 0x0103, -+ 0x00ee, 0x080c, 0x861d, 0x001e, 0x0005, 0x00e6, 0x00d6, 0x603f, -+ 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xa10a, 0x001e, -+ 0x1168, 0x0026, 0x6228, 0x2268, 0x002e, 0x2071, 0xbb8c, 0x6b1c, -+ 0xa386, 0x0003, 0x0130, 0xa386, 0x0006, 0x0128, 0x080c, 0x861d, -+ 0x0020, 0x0031, 0x0010, 0x080c, 0x88f6, 0x00de, 0x00ee, 0x0005, -+ 0x00f6, 0x6810, 0x2078, 0xa186, 0x0015, 0x0904, 0x88dd, 0xa18e, -+ 0x0016, 0x1904, 0x88f4, 0x700c, 0xa08c, 0xff00, 0xa186, 0x1700, -+ 0x0120, 0xa186, 0x0300, 0x1904, 0x88bc, 0x8fff, 0x1138, 0x6800, -+ 0xa086, 0x000f, 0x0904, 0x88a0, 0x0804, 0x88f2, 0x6808, 0xa086, -+ 0xffff, 0x1904, 0x88df, 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, -+ 0x1150, 0x797c, 0x7810, 0xa106, 0x1904, 0x88df, 0x7980, 0x7814, -+ 0xa106, 0x1904, 0x88df, 0x080c, 0x9e11, 0x6858, 0x7852, 0x784c, -+ 0xc0dc, 0xc0f4, 0xc0d4, 0x784e, 0x0026, 0xa00e, 0x6a14, 0x2001, -+ 0x000a, 0x080c, 0x6b40, 0x7854, 0xa20a, 0x0208, 0x8011, 0x7a56, -+ 0x82ff, 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0x9a09, 0x00ce, -+ 0x0804, 0x88f2, 0x00c6, 0x00d6, 0x2f68, 0x6838, 0xd0fc, 0x1118, -+ 0x080c, 0x4c64, 0x0010, 0x080c, 0x4e49, 0x00de, 0x00ce, 0x1904, -+ 0x88df, 0x00c6, 0x2d60, 0x080c, 0x861d, 0x00ce, 0x0804, 0x88f2, -+ 0x00c6, 0x080c, 0x9ed6, 0x0190, 0x6013, 0x0000, 0x6818, 0x601a, -+ 0x080c, 0xa027, 0x601f, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, -+ 0x861d, 0x00ce, 0x080c, 0x864c, 0x00ce, 0x04e0, 0x2001, 0xb7b8, -+ 0x2004, 0x683e, 0x00ce, 0x04b0, 0x7008, 0xa086, 0x000b, 0x11a0, -+ 0x6018, 0x200c, 0xc1bc, 0x2102, 0x00c6, 0x2d60, 0x7853, 0x0003, -+ 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x6c8d, -+ 0x080c, 0x7173, 0x00ce, 0x00f0, 0x700c, 0xa086, 0x2a00, 0x1138, -+ 0x2001, 0xb7b8, 0x2004, 0x683e, 0x00a8, 0x0481, 0x00a8, 0x8fff, -+ 0x090c, 0x1515, 0x00c6, 0x00d6, 0x2d60, 0x2f68, 0x6837, 0x0103, -+ 0x684b, 0x0003, 0x080c, 0x98fd, 0x080c, 0x9e11, 0x080c, 0x9e1d, -+ 0x00de, 0x00ce, 0x080c, 0x861d, 0x00fe, 0x0005, 0xa186, 0x0015, -+ 0x1128, 0x2001, 0xb7b8, 0x2004, 0x683e, 0x0068, 0xa18e, 0x0016, -+ 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xb33a, 0x080c, 0x6aef, -+ 0x080c, 0x861d, 0x00ce, 0x080c, 0x861d, 0x0005, 0x0026, 0x0036, -+ 0x0046, 0x7228, 0x7c80, 0x7b7c, 0xd2f4, 0x0130, 0x2001, 0xb7b8, -+ 0x2004, 0x683e, 0x0804, 0x8970, 0x00c6, 0x2d60, 0x080c, 0x991d, -+ 0x00ce, 0x6804, 0xa086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, -+ 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x6c8d, 0x080c, 0x7173, -+ 0x00ce, 0x04f0, 0x6800, 0xa086, 0x000f, 0x01c8, 0x8fff, 0x090c, -+ 0x1515, 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, 0x9f63, 0x080c, 0x7173, 0x0010, -+ 0x080c, 0x861d, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, -+ 0x0026, 0x6034, 0x2068, 0x6a1c, 0xa286, 0x0007, 0x0904, 0x89d4, -+ 0xa286, 0x0002, 0x0904, 0x89d4, 0xa286, 0x0000, 0x0904, 0x89d4, -+ 0x6808, 0x6338, 0xa306, 0x1904, 0x89d4, 0x2071, 0xbb8c, 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, 0x9c5a, 0x090c, 0x1515, -+ 0x6853, 0x0003, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, -+ 0x080c, 0x6c8d, 0x080c, 0x7173, 0x00ce, 0x0030, 0x6034, 0x2070, -+ 0x2001, 0xb7b8, 0x2004, 0x703e, 0x080c, 0x861d, 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, 0x90da, 0x002e, 0x003e, 0x015e, 0x11d8, 0x0156, -+ 0x0036, 0x0026, 0xae90, 0x000c, 0xa290, 0x0008, 0x20a9, 0x0004, -+ 0xad98, 0x0006, 0x080c, 0x90da, 0x002e, 0x003e, 0x015e, 0x1150, -+ 0x7038, 0x680a, 0x703c, 0x680e, 0x6800, 0xc08d, 0x6802, 0x00de, -+ 0x0804, 0x87a0, 0x080c, 0x2c9c, 0x00c6, 0x080c, 0x85c7, 0x2f00, -+ 0x601a, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, -+ 0x0001, 0x2001, 0x0007, 0x080c, 0x4efd, 0x080c, 0x4f2a, 0x080c, -+ 0x6cd3, 0x080c, 0x7173, 0x00ce, 0x0c10, 0x2100, 0xa1b2, 0x0080, -+ 0x1a0c, 0x1515, 0xa1b2, 0x0040, 0x1a04, 0x8a91, 0x0002, 0x8a85, -+ 0x8a79, 0x8a85, 0x8a85, 0x8a85, 0x8a85, 0x8a77, 0x8a77, 0x8a77, -+ 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, -+ 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, -+ 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a85, 0x8a77, -+ 0x8a85, 0x8a85, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a85, -+ 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, -+ 0x8a77, 0x8a85, 0x8a85, 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a77, -+ 0x8a77, 0x8a77, 0x8a77, 0x8a77, 0x8a85, 0x8a77, 0x8a77, 0x080c, -+ 0x1515, 0x6003, 0x0001, 0x6106, 0x080c, 0x6cd3, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x7173, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, -+ 0x080c, 0x6cd3, 0x0126, 0x2091, 0x8000, 0x080c, 0x7173, 0x012e, -+ 0x0005, 0x2600, 0x0002, 0x8a85, 0x8a85, 0x8a99, 0x8a85, 0x8a85, -+ 0x8a99, 0x080c, 0x1515, 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x1515, -+ 0xa1b6, 0x0013, 0x0904, 0x8b4b, 0xa1b6, 0x0027, 0x1904, 0x8b11, -+ 0x080c, 0x7090, 0x6004, 0x080c, 0x9e47, 0x0190, 0x080c, 0x9e58, -+ 0x0904, 0x8b0b, 0xa08e, 0x0021, 0x0904, 0x8b0e, 0xa08e, 0x0022, -+ 0x0904, 0x8b0b, 0xa08e, 0x003d, 0x0904, 0x8b0e, 0x0804, 0x8b04, -+ 0x080c, 0x2cc2, 0x2001, 0x0007, 0x080c, 0x4efd, 0x6018, 0xa080, -+ 0x0028, 0x200c, 0x080c, 0x8c19, 0xa186, 0x007e, 0x1148, 0x2001, -+ 0xb535, 0x2014, 0xc285, 0x080c, 0x5acf, 0x1108, 0xc2ad, 0x2202, -+ 0x0016, 0x0026, 0x0036, 0x2110, 0x0026, 0x2019, 0x0028, 0x080c, -+ 0x8299, 0x002e, 0x080c, 0xb38d, 0x003e, 0x002e, 0x001e, 0x0016, -+ 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x6df5, 0x0076, -+ 0x2039, 0x0000, 0x080c, 0x6d02, 0x00c6, 0x6018, 0xa065, 0x0110, -+ 0x080c, 0x51aa, 0x00ce, 0x2c08, 0x080c, 0xae82, 0x007e, 0x003e, -+ 0x002e, 0x001e, 0x080c, 0x4f6c, 0x080c, 0xa01f, 0x080c, 0x861d, -+ 0x080c, 0x7173, 0x0005, 0x080c, 0x8c19, 0x0cb0, 0x080c, 0x8c47, -+ 0x0c98, 0xa186, 0x0014, 0x1db0, 0x080c, 0x7090, 0x080c, 0x2c9c, -+ 0x080c, 0x9e47, 0x1188, 0x080c, 0x2cc2, 0x6018, 0xa080, 0x0028, -+ 0x200c, 0x080c, 0x8c19, 0xa186, 0x007e, 0x1128, 0x2001, 0xb535, -+ 0x200c, 0xc185, 0x2102, 0x08c0, 0x080c, 0x9e58, 0x1118, 0x080c, -+ 0x8c19, 0x0890, 0x6004, 0xa08e, 0x0032, 0x1158, 0x00e6, 0x00f6, -+ 0x2071, 0xb582, 0x2079, 0x0000, 0x080c, 0x2fcf, 0x00fe, 0x00ee, -+ 0x0818, 0x6004, 0xa08e, 0x0021, 0x0d50, 0xa08e, 0x0022, 0x090c, -+ 0x8c19, 0x0804, 0x8b04, 0xa0b2, 0x0040, 0x1a04, 0x8c0e, 0x2008, -+ 0x0002, 0x8b93, 0x8b94, 0x8b97, 0x8b9a, 0x8b9d, 0x8ba0, 0x8b91, -+ 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, -+ 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, -+ 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8ba3, -+ 0x8bb2, 0x8b91, 0x8bb4, 0x8bb2, 0x8b91, 0x8b91, 0x8b91, 0x8b91, -+ 0x8b91, 0x8bb2, 0x8bb2, 0x8b91, 0x8b91, 0x8b91, 0x8b91, 0x8b91, -+ 0x8b91, 0x8b91, 0x8b91, 0x8bee, 0x8bb2, 0x8b91, 0x8bae, 0x8b91, -+ 0x8b91, 0x8b91, 0x8baf, 0x8b91, 0x8b91, 0x8b91, 0x8bb2, 0x8be5, -+ 0x8b91, 0x080c, 0x1515, 0x00f0, 0x2001, 0x000b, 0x0460, 0x2001, -+ 0x0003, 0x0448, 0x2001, 0x0005, 0x0430, 0x2001, 0x0001, 0x0418, -+ 0x2001, 0x0009, 0x0400, 0x080c, 0x7090, 0x6003, 0x0005, 0x2001, -+ 0xb7b8, 0x2004, 0x603e, 0x080c, 0x7173, 0x00a0, 0x0018, 0x0010, -+ 0x080c, 0x4efd, 0x0804, 0x8bff, 0x080c, 0x7090, 0x2001, 0xb7b6, -+ 0x2004, 0x6016, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x6003, 0x0004, -+ 0x080c, 0x7173, 0x0005, 0x080c, 0x4efd, 0x080c, 0x7090, 0x6003, -+ 0x0002, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x0036, 0x2019, 0xb55d, -+ 0x2304, 0xa084, 0xff00, 0x1120, 0x2001, 0xb7b6, 0x201c, 0x0040, -+ 0x8007, 0xa09a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0xa318, -+ 0x6316, 0x003e, 0x080c, 0x7173, 0x08e8, 0x080c, 0x7090, 0x080c, -+ 0xa01f, 0x080c, 0x861d, 0x080c, 0x7173, 0x08a0, 0x00e6, 0x00f6, -+ 0x2071, 0xb582, 0x2079, 0x0000, 0x080c, 0x2fcf, 0x00fe, 0x00ee, -+ 0x080c, 0x7090, 0x080c, 0x861d, 0x080c, 0x7173, 0x0818, 0x080c, -+ 0x7090, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x6003, 0x0002, 0x2001, -+ 0xb7b6, 0x2004, 0x6016, 0x080c, 0x7173, 0x0005, 0x2600, 0x2008, -+ 0x0002, 0x8c17, 0x8c17, 0x8c17, 0x8bff, 0x8bff, 0x8c17, 0x080c, -+ 0x1515, 0x00e6, 0x0026, 0x0016, 0x080c, 0x9c5a, 0x0508, 0x6010, -+ 0x2070, 0x7034, 0xa086, 0x0139, 0x1148, 0x2001, 0x0030, 0x2009, -+ 0x0000, 0x2011, 0x4005, 0x080c, 0xa0d6, 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, 0x1515, 0x6604, 0xa6b6, -+ 0x0043, 0x1120, 0x080c, 0xa092, 0x0804, 0x8cb8, 0x6604, 0xa6b6, -+ 0x0033, 0x1120, 0x080c, 0xa042, 0x0804, 0x8cb8, 0x6604, 0xa6b6, -+ 0x0028, 0x1120, 0x080c, 0x9e88, 0x0804, 0x8cb8, 0x6604, 0xa6b6, -+ 0x0029, 0x1118, 0x080c, 0x9e9f, 0x04d8, 0x6604, 0xa6b6, 0x001f, -+ 0x1118, 0x080c, 0x8786, 0x04a0, 0x6604, 0xa6b6, 0x0000, 0x1118, -+ 0x080c, 0x89da, 0x0468, 0x6604, 0xa6b6, 0x0022, 0x1118, 0x080c, -+ 0x87ae, 0x0430, 0x6604, 0xa6b6, 0x0035, 0x1118, 0x080c, 0x8815, -+ 0x00f8, 0x6604, 0xa6b6, 0x0039, 0x1118, 0x080c, 0x8976, 0x00c0, -+ 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c, 0x87c8, 0x0088, 0x6604, -+ 0xa6b6, 0x0044, 0x1118, 0x080c, 0x87e8, 0x0050, 0xa1b6, 0x0015, -+ 0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016, 0x1118, 0x0804, 0x8e7c, -+ 0x0005, 0x080c, 0x8663, 0x0ce0, 0x8cdf, 0x8ce2, 0x8cdf, 0x8d24, -+ 0x8cdf, 0x8e09, 0x8e8a, 0x8cdf, 0x8cdf, 0x8e58, 0x8cdf, 0x8e6c, -+ 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, -+ 0x080c, 0x185e, 0x0005, 0x00e6, 0xacf0, 0x0004, 0x2e74, 0x7000, -+ 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x861d, 0x0005, 0xe000, -+ 0xe000, 0x0005, 0x00e6, 0x2071, 0xb500, 0x7084, 0xa086, 0x0074, -+ 0x1530, 0x080c, 0xae59, 0x11b0, 0x00d6, 0x6018, 0x2068, 0x7030, -+ 0xd08c, 0x0128, 0x6800, 0xd0bc, 0x0110, 0xc0c5, 0x6802, 0x00d9, -+ 0x00de, 0x2001, 0x0006, 0x080c, 0x4efd, 0x080c, 0x2cc2, 0x080c, -+ 0x861d, 0x0078, 0x2001, 0x000a, 0x080c, 0x4efd, 0x080c, 0x2cc2, -+ 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x6cd3, 0x0010, 0x080c, -+ 0x8df6, 0x00ee, 0x0005, 0x6800, 0xd084, 0x0168, 0x2001, 0x0000, -+ 0x080c, 0x4eeb, 0x2069, 0xb552, 0x6804, 0xd0a4, 0x0120, 0x2001, -+ 0x0006, 0x080c, 0x4f2a, 0x0005, 0x00d6, 0x2011, 0xb521, 0x2204, -+ 0xa086, 0x0074, 0x1904, 0x8df3, 0x6018, 0x2068, 0x6aa0, 0xa286, -+ 0x007e, 0x1120, 0x080c, 0x8fa2, 0x0804, 0x8d92, 0x080c, 0x8f98, -+ 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, 0x4efd, 0x080c, 0x2cc2, 0x080c, 0x861d, 0x0804, 0x8df4, -+ 0x00e6, 0x2071, 0xb535, 0x2e04, 0xd09c, 0x0188, 0x2071, 0xbb80, -+ 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, 0xa0d6, 0x0840, 0x2001, 0x0004, -+ 0x080c, 0x4efd, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x6cd3, -+ 0x0804, 0x8df4, 0x685c, 0xd0e4, 0x01d8, 0x080c, 0x9fd2, 0x080c, -+ 0x5acf, 0x0118, 0xd0dc, 0x1904, 0x8d4e, 0x2011, 0xb535, 0x2204, -+ 0xc0ad, 0x2012, 0x2001, 0xb78f, 0x2004, 0x00f6, 0x2079, 0x0100, -+ 0x78e3, 0x0000, 0x080c, 0x2872, 0x78e2, 0x00fe, 0x0804, 0x8d4e, -+ 0x080c, 0xa008, 0x2011, 0xb535, 0x2204, 0xc0a5, 0x2012, 0x0006, -+ 0x080c, 0xaf7b, 0x000e, 0x1904, 0x8d4e, 0xc0b5, 0x2012, 0x2001, -+ 0x0006, 0x080c, 0x4efd, 0x2001, 0x0000, 0x080c, 0x4eeb, 0x00c6, -+ 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, -+ 0x00fe, 0x080c, 0x2847, 0x00f6, 0x2079, 0xb500, 0x7976, 0x2100, -+ 0x2009, 0x0000, 0x080c, 0x281d, 0x7952, 0x00fe, 0x8108, 0x080c, -+ 0x4f4d, 0x2c00, 0x00ce, 0x1904, 0x8d4e, 0x601a, 0x2001, 0x0002, -+ 0x080c, 0x4efd, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, -+ 0x080c, 0x6cd3, 0x0008, 0x0011, 0x00de, 0x0005, 0x2001, 0x0007, -+ 0x080c, 0x4efd, 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, 0x1120, -+ 0x2001, 0x0007, 0x080c, 0x4f2a, 0x080c, 0x2cc2, 0x080c, 0x861d, -+ 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071, 0xb500, 0x7084, 0xa086, -+ 0x0014, 0x15f0, 0x7000, 0xa086, 0x0003, 0x1128, 0x6010, 0xa005, -+ 0x1110, 0x080c, 0x3f3e, 0x00d6, 0x6018, 0x2068, 0x080c, 0x504b, -+ 0x080c, 0x8d13, 0x00de, 0x080c, 0x9051, 0x1550, 0x00d6, 0x6018, -+ 0x2068, 0x6890, 0x00de, 0xa005, 0x0518, 0x2001, 0x0006, 0x080c, -+ 0x4efd, 0x00e6, 0x6010, 0xa075, 0x01a8, 0x7034, 0xa084, 0x00ff, -+ 0xa086, 0x0039, 0x1148, 0x2001, 0x0000, 0x2009, 0x0000, 0x2011, -+ 0x4000, 0x080c, 0xa0d6, 0x0030, 0x7007, 0x0000, 0x7037, 0x0103, -+ 0x7033, 0x0200, 0x00ee, 0x080c, 0x2cc2, 0x080c, 0x861d, 0x0020, -+ 0x080c, 0x8c19, 0x080c, 0x8df6, 0x001e, 0x002e, 0x00ee, 0x0005, -+ 0x2011, 0xb521, 0x2204, 0xa086, 0x0014, 0x1158, 0x2001, 0x0002, -+ 0x080c, 0x4efd, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x6cd3, -+ 0x0010, 0x080c, 0x8df6, 0x0005, 0x2011, 0xb521, 0x2204, 0xa086, -+ 0x0004, 0x1138, 0x2001, 0x0007, 0x080c, 0x4efd, 0x080c, 0x861d, -+ 0x0010, 0x080c, 0x8df6, 0x0005, 0x000b, 0x0005, 0x8cdf, 0x8e95, -+ 0x8cdf, 0x8ec9, 0x8cdf, 0x8f54, 0x8e8a, 0x8cdf, 0x8cdf, 0x8f67, -+ 0x8cdf, 0x8f77, 0x6604, 0xa686, 0x0003, 0x0904, 0x8e09, 0xa6b6, -+ 0x001e, 0x1110, 0x080c, 0x861d, 0x0005, 0x00d6, 0x00c6, 0x080c, -+ 0x8f87, 0x1178, 0x2001, 0x0000, 0x080c, 0x4eeb, 0x2001, 0x0002, -+ 0x080c, 0x4efd, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6cd3, -+ 0x00e8, 0x2009, 0xbb8e, 0x2104, 0xa086, 0x0009, 0x1160, 0x6018, -+ 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0170, 0x8001, 0x6842, -+ 0x6017, 0x000a, 0x0058, 0x2009, 0xbb8f, 0x2104, 0xa084, 0xff00, -+ 0xa086, 0x1900, 0x1108, 0x08d0, 0x080c, 0x8df6, 0x00ce, 0x00de, -+ 0x0005, 0x0026, 0x2011, 0x0000, 0x080c, 0x8f95, 0x00d6, 0x2069, -+ 0xb79e, 0x2d04, 0xa005, 0x0168, 0x6018, 0x2068, 0x68a0, 0xa086, -+ 0x007e, 0x1138, 0x2069, 0xb51d, 0x2d04, 0x8000, 0x206a, 0x00de, -+ 0x0010, 0x00de, 0x0078, 0x2001, 0x0000, 0x080c, 0x4eeb, 0x2001, -+ 0x0002, 0x080c, 0x4efd, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, -+ 0x6cd3, 0x0480, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9c5a, 0x00de, -+ 0x0108, 0x6a34, 0x080c, 0x8c19, 0x2009, 0xbb8e, 0x2134, 0xa6b4, -+ 0x00ff, 0xa686, 0x0005, 0x0500, 0xa686, 0x000b, 0x01c8, 0x2009, -+ 0xbb8f, 0x2104, 0xa084, 0xff00, 0x1118, 0xa686, 0x0009, 0x01a0, -+ 0xa086, 0x1900, 0x1168, 0xa686, 0x0009, 0x0170, 0x2001, 0x0004, -+ 0x080c, 0x4efd, 0x2001, 0x0028, 0x6016, 0x6007, 0x004b, 0x0010, -+ 0x080c, 0x8df6, 0x002e, 0x0005, 0x00d6, 0xa286, 0x0139, 0x0160, -+ 0x6010, 0x2068, 0x080c, 0x9c5a, 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, 0xb500, 0x080c, 0x4bc6, 0x00ee, 0x0010, -+ 0x080c, 0x2c9c, 0x00de, 0x0860, 0x080c, 0x8f95, 0x1158, 0x2001, -+ 0x0004, 0x080c, 0x4efd, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, -+ 0x6cd3, 0x0020, 0x080c, 0x8c19, 0x080c, 0x8df6, 0x0005, 0x0469, -+ 0x1158, 0x2001, 0x0008, 0x080c, 0x4efd, 0x6003, 0x0001, 0x6007, -+ 0x0005, 0x080c, 0x6cd3, 0x0010, 0x080c, 0x8df6, 0x0005, 0x00e9, -+ 0x1158, 0x2001, 0x000a, 0x080c, 0x4efd, 0x6003, 0x0001, 0x6007, -+ 0x0001, 0x080c, 0x6cd3, 0x0010, 0x080c, 0x8df6, 0x0005, 0x2009, -+ 0xbb8e, 0x2104, 0xa086, 0x0003, 0x1138, 0x2009, 0xbb8f, 0x2104, -+ 0xa084, 0xff00, 0xa086, 0x2a00, 0x0005, 0xa085, 0x0001, 0x0005, -+ 0x00c6, 0x0016, 0xac88, 0x0006, 0x2164, 0x080c, 0x4fb8, 0x001e, -+ 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, 0x6018, -+ 0x2068, 0x2071, 0xb535, 0x2e04, 0xa085, 0x0003, 0x2072, 0x080c, -+ 0x9026, 0x0560, 0x2009, 0xb535, 0x2104, 0xc0cd, 0x200a, 0x2001, -+ 0xb553, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, 0x2009, 0x002a, -+ 0x080c, 0xb0e8, 0x2001, 0xb50c, 0x200c, 0xc195, 0x2102, 0x2019, -+ 0x002a, 0x2009, 0x0001, 0x080c, 0x2c6f, 0x2071, 0xb500, 0x080c, -+ 0x2ab8, 0x00c6, 0x0156, 0x20a9, 0x0081, 0x2009, 0x007f, 0x080c, -+ 0x2d97, 0x8108, 0x1f04, 0x8fd7, 0x015e, 0x00ce, 0x080c, 0x8f98, -+ 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xbb80, 0x2079, 0x0100, -+ 0x2e04, 0xa084, 0x00ff, 0x2069, 0xb51c, 0x206a, 0x78e6, 0x0006, -+ 0x8e70, 0x2e04, 0x2069, 0xb51d, 0x206a, 0x78ea, 0x7832, 0x7836, -+ 0x2010, 0xa084, 0xff00, 0x001e, 0xa105, 0x2009, 0xb528, 0x200a, -+ 0x2200, 0xa084, 0x00ff, 0x2008, 0x080c, 0x2847, 0x080c, 0x5acf, -+ 0x0170, 0x2069, 0xbb8e, 0x2071, 0xb7b2, 0x6810, 0x2072, 0x6814, -+ 0x7006, 0x6818, 0x700a, 0x681c, 0x700e, 0x080c, 0x9fd2, 0x0040, -+ 0x2001, 0x0006, 0x080c, 0x4efd, 0x080c, 0x2cc2, 0x080c, 0x861d, -+ 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x0026, 0x0036, -+ 0x00e6, 0x0156, 0x2019, 0xb528, 0x231c, 0x83ff, 0x01e8, 0x2071, -+ 0xbb80, 0x2e14, 0xa294, 0x00ff, 0x7004, 0xa084, 0xff00, 0xa205, -+ 0xa306, 0x1190, 0x2011, 0xbb96, 0xad98, 0x000a, 0x20a9, 0x0004, -+ 0x080c, 0x90da, 0x1148, 0x2011, 0xbb9a, 0xad98, 0x0006, 0x20a9, -+ 0x0004, 0x080c, 0x90da, 0x1100, 0x015e, 0x00ee, 0x003e, 0x002e, -+ 0x0005, 0x00e6, 0x2071, 0xbb8c, 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, 0xb7e9, 0x252c, 0x2021, 0xb7ef, 0x2424, -+ 0x2061, 0xbd00, 0x2071, 0xb500, 0x7248, 0x7068, 0xa202, 0x16f0, -+ 0x080c, 0xb110, 0x05a0, 0x671c, 0xa786, 0x0001, 0x0580, 0xa786, -+ 0x0007, 0x0568, 0x2500, 0xac06, 0x0550, 0x2400, 0xac06, 0x0538, -+ 0x00c6, 0x6000, 0xa086, 0x0004, 0x1110, 0x080c, 0x194d, 0xa786, -+ 0x0008, 0x1148, 0x080c, 0x9e58, 0x1130, 0x00ce, 0x080c, 0x8c19, -+ 0x080c, 0x9e1d, 0x00a0, 0x6010, 0x2068, 0x080c, 0x9c5a, 0x0160, -+ 0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -+ 0x080c, 0x5408, 0x080c, 0x9e11, 0x080c, 0x9e1d, 0x00ce, 0xace0, -+ 0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0x9084, 0x012e, 0x000e, -+ 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, -+ 0xa786, 0x0006, 0x1118, 0x080c, 0xb099, 0x0c30, 0xa786, 0x000a, -+ 0x09e0, 0x08c8, 0x220c, 0x2304, 0xa106, 0x1130, 0x8210, 0x8318, -+ 0x1f04, 0x90da, 0xa006, 0x0005, 0x2304, 0xa102, 0x0218, 0x2001, -+ 0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, 0x0005, 0x6004, -+ 0xa08a, 0x0080, 0x1a0c, 0x1515, 0x080c, 0x9e47, 0x0120, 0x080c, -+ 0x9e58, 0x0168, 0x0028, 0x080c, 0x2cc2, 0x080c, 0x9e58, 0x0138, -+ 0x080c, 0x7090, 0x080c, 0x861d, 0x080c, 0x7173, 0x0005, 0x080c, -+ 0x8c19, 0x0cb0, 0xa182, 0x0040, 0x0002, 0x9120, 0x9120, 0x9120, -+ 0x9120, 0x9120, 0x9120, 0x9120, 0x9120, 0x9120, 0x9120, 0x9120, -+ 0x9122, 0x9122, 0x9122, 0x9122, 0x9120, 0x9120, 0x9120, 0x9122, -+ 0x080c, 0x1515, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, -+ 0x6c8d, 0x0126, 0x2091, 0x8000, 0x080c, 0x7173, 0x012e, 0x0005, -+ 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0x91bc, -+ 0xa186, 0x0027, 0x11e8, 0x080c, 0x7090, 0x080c, 0x2c9c, 0x00d6, -+ 0x6110, 0x2168, 0x080c, 0x9c5a, 0x0168, 0x6837, 0x0103, 0x684b, -+ 0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x080c, 0x5408, -+ 0x080c, 0x9e11, 0x00de, 0x080c, 0x861d, 0x080c, 0x7173, 0x0005, -+ 0xa186, 0x0014, 0x1120, 0x6004, 0xa082, 0x0040, 0x0428, 0xa186, -+ 0x0046, 0x0138, 0xa186, 0x0045, 0x0120, 0xa186, 0x0047, 0x190c, -+ 0x1515, 0x2001, 0x0109, 0x2004, 0xd084, 0x0198, 0x0126, 0x2091, -+ 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x6b74, 0x002e, 0x001e, -+ 0x000e, 0x012e, 0xe000, 0x6000, 0xa086, 0x0002, 0x1110, 0x0804, -+ 0x91fa, 0x080c, 0x8663, 0x0005, 0x0002, 0x919a, 0x9198, 0x9198, -+ 0x9198, 0x9198, 0x9198, 0x9198, 0x9198, 0x9198, 0x9198, 0x9198, -+ 0x91b5, 0x91b5, 0x91b5, 0x91b5, 0x9198, 0x91b5, 0x9198, 0x91b5, -+ 0x080c, 0x1515, 0x080c, 0x7090, 0x00d6, 0x6110, 0x2168, 0x080c, -+ 0x9c5a, 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, -+ 0x6850, 0xc0ec, 0x6852, 0x080c, 0x5408, 0x080c, 0x9e11, 0x00de, -+ 0x080c, 0x861d, 0x080c, 0x7173, 0x0005, 0x080c, 0x7090, 0x080c, -+ 0x861d, 0x080c, 0x7173, 0x0005, 0x0002, 0x91d2, 0x91d0, 0x91d0, -+ 0x91d0, 0x91d0, 0x91d0, 0x91d0, 0x91d0, 0x91d0, 0x91d0, 0x91d0, -+ 0x91e4, 0x91e4, 0x91e4, 0x91e4, 0x91d0, 0x91f3, 0x91d0, 0x91e4, -+ 0x080c, 0x1515, 0x080c, 0x7090, 0x2001, 0xb7b8, 0x2004, 0x603e, -+ 0x6003, 0x0002, 0x080c, 0x7173, 0x6010, 0xa088, 0x0013, 0x2104, -+ 0xa085, 0x0400, 0x200a, 0x0005, 0x080c, 0x7090, 0x2001, 0xb7b6, -+ 0x2004, 0x6016, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x6003, 0x000f, -+ 0x080c, 0x7173, 0x0005, 0x080c, 0x7090, 0x080c, 0x861d, 0x080c, -+ 0x7173, 0x0005, 0xa182, 0x0040, 0x0002, 0x9210, 0x9210, 0x9210, -+ 0x9210, 0x9210, 0x9212, 0x92f7, 0x9326, 0x9210, 0x9210, 0x9210, -+ 0x9210, 0x9210, 0x9210, 0x9210, 0x9210, 0x9210, 0x9210, 0x9210, -+ 0x080c, 0x1515, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2071, 0xbb80, -+ 0x7124, 0x610a, 0x2071, 0xbb8c, 0x6110, 0x2168, 0x7614, 0xa6b4, -+ 0x0fff, 0x86ff, 0x0904, 0x92c0, 0xa68c, 0x0c00, 0x0518, 0x00f6, -+ 0x2c78, 0x080c, 0x5305, 0x00fe, 0x01c8, 0x684c, 0xd0ac, 0x01b0, -+ 0x6020, 0xd0dc, 0x1198, 0x6850, 0xd0bc, 0x1180, 0x7318, 0x6814, -+ 0xa306, 0x1904, 0x92d3, 0x731c, 0x6810, 0xa31e, 0x0138, 0xd6d4, -+ 0x0904, 0x92d3, 0x6b14, 0xa305, 0x1904, 0x92d3, 0x7318, 0x6b62, -+ 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0518, 0xa186, -+ 0x0028, 0x1128, 0x080c, 0x9e36, 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, 0xbb99, 0x2004, -+ 0xa005, 0x1118, 0xc6c4, 0x0804, 0x9221, 0x7328, 0x732c, 0x6b56, - 0x83ff, 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, -- 0x2308, 0x2019, 0xbb98, 0xad90, 0x0019, 0x080c, 0x9907, 0x003e, -- 0xd6cc, 0x01d8, 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, -- 0x1250, 0x2071, 0xbb98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, -- 0x080c, 0x9907, 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, -- 0x695a, 0x0c78, 0x2d78, 0x080c, 0x98ac, 0xd6dc, 0x1110, 0xa006, -- 0x0030, 0x2001, 0x0001, 0x2071, 0xbb8c, 0x7218, 0x731c, 0x080c, -- 0x18b1, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, 0x2001, 0xb7b8, -- 0x2004, 0x603e, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, -- 0x185e, 0x0005, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x00d6, 0x6003, -- 0x0002, 0x6110, 0x2168, 0x694c, 0xd1e4, 0x0904, 0x9675, 0x603f, -- 0x0000, 0x00f6, 0x2c78, 0x080c, 0x5306, 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, -- 0x9f2f, 0x0804, 0x9675, 0x694c, 0xd1cc, 0x0904, 0x9645, 0x6948, -- 0x6838, 0xd0fc, 0x0904, 0x9608, 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, -- 0xa0b9, 0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, -- 0x684b, 0x0007, 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, -- 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x947d, 0x6848, 0x784a, -- 0x6860, 0x7862, 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98, 0x000d, -- 0x2009, 0x0020, 0x0156, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, -- 0x1f04, 0x95f4, 0x015e, 0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, -- 0x080c, 0xa131, 0x001e, 0x2168, 0x080c, 0x161f, 0x0804, 0x9670, -- 0x0016, 0x00f6, 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, -- 0x01e0, 0xa086, 0x0028, 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, -- 0x00e8, 0xd1dc, 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, -- 0xa0b9, 0x0118, 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, -- 0x684b, 0x0007, 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, -- 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x947d, 0x6860, 0x7862, -- 0x685c, 0x785e, 0x684c, 0x784e, 0x00fe, 0x080c, 0x161f, 0x00de, -- 0x080c, 0xa131, 0x080c, 0x98f7, 0x0458, 0x6837, 0x0103, 0x6944, -- 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, -- 0x684b, 0x001c, 0x00d8, 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, -- 0xa0b9, 0x0118, 0x6944, 0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, -- 0x684b, 0x0007, 0x0058, 0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, -- 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x947d, 0x080c, 0x5409, -- 0x080c, 0x9efd, 0x1110, 0x080c, 0x8617, 0x00de, 0x0005, 0x080c, -- 0x7091, 0x0010, 0x080c, 0x7127, 0x080c, 0x9c54, 0x01c0, 0x00d6, -- 0x6110, 0x2168, 0x6837, 0x0103, 0x2009, 0xb50c, 0x210c, 0xd18c, -- 0x11c0, 0xd184, 0x1198, 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, -- 0x080c, 0xb374, 0x6847, 0x0000, 0x080c, 0x5409, 0x00de, 0x080c, -- 0x8617, 0x080c, 0x7174, 0x080c, 0x7231, 0x0005, 0x684b, 0x0004, -- 0x0c88, 0x684b, 0x0004, 0x0c70, 0xa182, 0x0040, 0x0002, 0x96ba, -- 0x96ba, 0x96ba, 0x96ba, 0x96ba, 0x96bc, 0x96ba, 0x96bf, 0x96ba, -- 0x96ba, 0x96ba, 0x96ba, 0x96ba, 0x96ba, 0x96ba, 0x96ba, 0x96ba, -- 0x96ba, 0x96ba, 0x080c, 0x1515, 0x080c, 0x8617, 0x0005, 0x0006, -- 0x0026, 0xa016, 0x080c, 0x185e, 0x002e, 0x000e, 0x0005, 0xa182, -- 0x0085, 0x0002, 0x96d3, 0x96d1, 0x96d1, 0x96df, 0x96d1, 0x96d1, -- 0x96d1, 0x080c, 0x1515, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c8e, -- 0x0126, 0x2091, 0x8000, 0x080c, 0x7174, 0x012e, 0x0005, 0x0026, -- 0x0056, 0x00d6, 0x00e6, 0x2071, 0xbb80, 0x7224, 0x6212, 0x7220, -- 0x080c, 0x9c44, 0x01a0, 0x2268, 0x6800, 0xa086, 0x0000, 0x0178, -- 0x6018, 0x6d18, 0xa52e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0x9917, -- 0x00ce, 0x0128, 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, -- 0x0087, 0x6003, 0x0001, 0x080c, 0x6c8e, 0x080c, 0x7174, 0x00f6, -- 0x2278, 0x080c, 0x5306, 0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, -- 0x00c6, 0x2260, 0x603f, 0x0000, 0x080c, 0x9f2f, 0x00ce, 0x00ee, -- 0x00de, 0x005e, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, -- 0xa08a, 0x0085, 0x0a0c, 0x1515, 0xa08a, 0x008c, 0x1a0c, 0x1515, -- 0xa082, 0x0085, 0x0072, 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, -- 0x190c, 0x1515, 0x080c, 0x7091, 0x080c, 0x9e17, 0x080c, 0x7174, -- 0x0005, 0x9740, 0x9742, 0x9742, 0x9740, 0x9740, 0x9740, 0x9740, -- 0x080c, 0x1515, 0x080c, 0x7091, 0x080c, 0x9e17, 0x080c, 0x7174, -- 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, -- 0x04a8, 0xa186, 0x0027, 0x11e8, 0x080c, 0x7091, 0x080c, 0x2c9c, -- 0x00d6, 0x6010, 0x2068, 0x080c, 0x9c54, 0x0150, 0x6837, 0x0103, -- 0x6847, 0x0000, 0x684b, 0x0029, 0x080c, 0x5409, 0x080c, 0x9e0b, -- 0x00de, 0x080c, 0x8617, 0x080c, 0x7174, 0x0005, 0x080c, 0x865d, -- 0x0ce0, 0xa186, 0x0014, 0x1dd0, 0x080c, 0x7091, 0x00d6, 0x6010, -- 0x2068, 0x080c, 0x9c54, 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, -- 0x684b, 0x0006, 0x6850, 0xc0ec, 0x6852, 0x08f0, 0x0002, 0x9790, -- 0x978e, 0x978e, 0x978e, 0x978e, 0x978e, 0x97a8, 0x080c, 0x1515, -- 0x080c, 0x7091, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, -- 0x0118, 0xa186, 0x0035, 0x1118, 0x2001, 0xb7b6, 0x0010, 0x2001, -- 0xb7b7, 0x2004, 0x6016, 0x6003, 0x000c, 0x080c, 0x7174, 0x0005, -- 0x080c, 0x7091, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, -- 0x0118, 0xa186, 0x0035, 0x1118, 0x2001, 0xb7b6, 0x0010, 0x2001, -- 0xb7b7, 0x2004, 0x6016, 0x6003, 0x000e, 0x080c, 0x7174, 0x0005, -- 0xa182, 0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, -- 0x865d, 0x0005, 0x97d1, 0x97d1, 0x97d1, 0x97d1, 0x97d3, 0x982c, -- 0x97d1, 0x080c, 0x1515, 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x5306, -- 0x00fe, 0x0168, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, -- 0x0118, 0xa186, 0x0035, 0x1118, 0x00de, 0x0804, 0x983f, 0x080c, -- 0x9c54, 0x1118, 0x080c, 0x9e0b, 0x00f0, 0x6010, 0x2068, 0x684c, -- 0xd0e4, 0x1110, 0x080c, 0x9e0b, 0x6837, 0x0103, 0x6850, 0xd0b4, -- 0x0128, 0x684b, 0x0006, 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, -- 0x684b, 0x0002, 0x0020, 0x684b, 0x0005, 0x080c, 0x9ecc, 0x6847, -- 0x0000, 0x080c, 0x5409, 0x2c68, 0x080c, 0x85c1, 0x01c0, 0x6003, -- 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0xbb8e, 0x210c, -- 0x6136, 0x2009, 0xbb8f, 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, -- 0xa021, 0x6950, 0x6152, 0x601f, 0x0001, 0x080c, 0x6c8e, 0x2d60, -- 0x080c, 0x8617, 0x00de, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x5306, -- 0x00fe, 0x0598, 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, -- 0x0130, 0xa186, 0x001e, 0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, -- 0x2c68, 0x080c, 0xa104, 0x1904, 0x9884, 0x080c, 0x85c1, 0x01d8, -- 0x6106, 0x6003, 0x0001, 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, -- 0x612a, 0x692c, 0x612e, 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, -- 0x6136, 0x6938, 0x613a, 0x6950, 0x6152, 0x080c, 0xa021, 0x080c, -- 0x6c8e, 0x080c, 0x7174, 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, -- 0x080c, 0x9c54, 0x01c8, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, -- 0xc0ec, 0x6852, 0x684b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, -- 0x0002, 0x0020, 0x684b, 0x0005, 0x080c, 0x9ecc, 0x6847, 0x0000, -- 0x080c, 0x5409, 0x080c, 0x9e0b, 0x00de, 0x080c, 0x8617, 0x0005, -- 0x0016, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9c54, 0x0140, 0x6837, -- 0x0103, 0x684b, 0x0028, 0x6847, 0x0000, 0x080c, 0x5409, 0x00de, -- 0x001e, 0xa186, 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, -- 0x0027, 0x0118, 0x080c, 0x865d, 0x0030, 0x080c, 0x7091, 0x080c, -- 0x9e17, 0x080c, 0x7174, 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, -- 0x2029, 0x0001, 0xa182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, -- 0x2130, 0x2069, 0xbb98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, -- 0xaf90, 0x001d, 0x080c, 0x9907, 0xa6b2, 0x0020, 0x7804, 0xa06d, -- 0x0110, 0x080c, 0x161f, 0x080c, 0x15f8, 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, -- 0x5409, 0x2f68, 0x0cb8, 0x080c, 0x5409, 0x00fe, 0x0005, 0x0156, -- 0xa184, 0x0001, 0x0108, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, -- 0x2012, 0x8318, 0x8210, 0x1f04, 0x990e, 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, 0x994e, 0x994e, 0x9949, 0x9970, 0x993c, 0x9949, 0x9970, -- 0x9949, 0x9949, 0x993c, 0x9949, 0x080c, 0x1515, 0x0036, 0x2019, -- 0x0010, 0x080c, 0xacd4, 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, -- 0x0005, 0xa006, 0x0005, 0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, -- 0x11d8, 0x6010, 0x2068, 0x080c, 0x9c54, 0x01c0, 0x6834, 0xa086, -- 0x0139, 0x1128, 0x684b, 0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, -- 0x2001, 0x0005, 0x080c, 0x54dc, 0x080c, 0x9ecc, 0x080c, 0x5409, -- 0x080c, 0x8617, 0xa085, 0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, -- 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1515, 0x000b, 0x0005, 0x9987, -- 0x99a8, 0x9989, 0x99c7, 0x99a5, 0x9987, 0x9949, 0x994e, 0x994e, -- 0x9949, 0x9949, 0x9949, 0x9949, 0x9949, 0x9949, 0x9949, 0x080c, -- 0x1515, 0x86ff, 0x11b8, 0x601c, 0xa086, 0x0006, 0x0198, 0x00d6, -- 0x6010, 0x2068, 0x080c, 0x9c54, 0x0110, 0x080c, 0x9ecc, 0x00de, -- 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x6c8e, -- 0x080c, 0x7174, 0xa085, 0x0001, 0x0005, 0x080c, 0x194d, 0x0c08, -- 0x00e6, 0x2071, 0xb7e0, 0x7024, 0xac06, 0x1110, 0x080c, 0x7f5a, -- 0x601c, 0xa084, 0x000f, 0xa086, 0x0006, 0x1150, 0x0086, 0x0096, -- 0x2049, 0x0001, 0x2c40, 0x080c, 0x8131, 0x009e, 0x008e, 0x0010, -- 0x080c, 0x7e59, 0x00ee, 0x1928, 0x080c, 0x9949, 0x0005, 0x0036, -- 0x00e6, 0x2071, 0xb7e0, 0x703c, 0xac06, 0x1140, 0x2019, 0x0000, -- 0x080c, 0x7fe5, 0x00ee, 0x003e, 0x0804, 0x9989, 0x080c, 0x8257, -- 0x00ee, 0x003e, 0x1904, 0x9989, 0x080c, 0x9949, 0x0005, 0x00c6, -- 0x601c, 0xa084, 0x000f, 0x0013, 0x00ce, 0x0005, 0x99f8, 0x9a65, -- 0x9bb3, 0x9a03, 0x9e17, 0x99f8, 0xacc6, 0x8617, 0x9a65, 0x99f1, -- 0x9c1e, 0x080c, 0x1515, 0x080c, 0x9e52, 0x1110, 0x080c, 0x8c13, -- 0x0005, 0x080c, 0x7091, 0x080c, 0x7174, 0x080c, 0x8617, 0x0005, -- 0x6017, 0x0001, 0x0005, 0x080c, 0x9c54, 0x0120, 0x6010, 0xa080, -- 0x0019, 0x2c02, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1515, 0x000b, -- 0x0005, 0x9a21, 0x9a23, 0x9a43, 0x9a55, 0x9a62, 0x9a21, 0x99f8, -- 0x99f8, 0x99f8, 0x9a55, 0x9a55, 0x9a21, 0x9a21, 0x9a21, 0x9a21, -- 0x9a5f, 0x080c, 0x1515, 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, -- 0x7052, 0x2071, 0xb7e0, 0x7024, 0xac06, 0x0190, 0x080c, 0x7e59, -- 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xb7b7, -- 0x2004, 0x6016, 0x080c, 0x6c8e, 0x080c, 0x7174, 0x00ee, 0x0005, -- 0x6017, 0x0001, 0x0cd8, 0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, -- 0x6852, 0x00de, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, -- 0x080c, 0x6c8e, 0x080c, 0x7174, 0x0005, 0x00d6, 0x6017, 0x0001, -- 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, -- 0x8617, 0x0005, 0x080c, 0x194d, 0x08f0, 0x6000, 0xa08a, 0x0010, -- 0x1a0c, 0x1515, 0x000b, 0x0005, 0x9a7c, 0x9a00, 0x9a7e, 0x9a7c, -- 0x9a7e, 0x9a7e, 0x99f9, 0x9a7c, 0x99f3, 0x99f3, 0x9a7c, 0x9a7c, -- 0x9a7c, 0x9a7c, 0x9a7c, 0x9a7c, 0x080c, 0x1515, 0x00d6, 0x6018, -- 0x2068, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, -- 0x1515, 0x000b, 0x0005, 0x9a97, 0x9b59, 0x9a99, 0x9ad7, 0x9a99, -- 0x9ad7, 0x9a99, 0x9aa7, 0x9a97, 0x9ad7, 0x9a97, 0x9ac3, 0x080c, -- 0x1515, 0x6004, 0xa08e, 0x0016, 0x05a8, 0xa08e, 0x0004, 0x0590, -- 0xa08e, 0x0002, 0x0578, 0xa08e, 0x004b, 0x0904, 0x9b55, 0x6004, -- 0x080c, 0x9e52, 0x0904, 0x9b72, 0xa08e, 0x0021, 0x0904, 0x9b76, -- 0xa08e, 0x0022, 0x0904, 0x9b72, 0xa08e, 0x003d, 0x0904, 0x9b76, -- 0xa08e, 0x0039, 0x0904, 0x9b7a, 0xa08e, 0x0035, 0x0904, 0x9b7a, -- 0xa08e, 0x001e, 0x0188, 0xa08e, 0x0001, 0x1150, 0x00d6, 0x6018, -- 0x2068, 0x6804, 0xa084, 0x00ff, 0x00de, 0xa086, 0x0006, 0x0110, -- 0x080c, 0x2c9c, 0x080c, 0x8c13, 0x080c, 0x9e17, 0x0005, 0x00c6, -- 0x00d6, 0x6104, 0xa186, 0x0016, 0x0904, 0x9b46, 0xa186, 0x0002, -- 0x15d8, 0x2001, 0xb535, 0x2004, 0xd08c, 0x1198, 0x080c, 0x5ad0, -- 0x1180, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, -- 0x0001, 0xa085, 0x0001, 0x080c, 0x5b14, 0x080c, 0x5a08, 0x0804, -- 0x9b9c, 0x6018, 0x2068, 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1904, -- 0x9b9c, 0x68a0, 0xd0bc, 0x1904, 0x9b9c, 0x6840, 0xa084, 0x00ff, -- 0xa005, 0x0190, 0x8001, 0x6842, 0x6013, 0x0000, 0x601f, 0x0007, -- 0x6017, 0x0398, 0x603f, 0x0000, 0x080c, 0x85c1, 0x0128, 0x2d00, -- 0x601a, 0x601f, 0x0001, 0x0450, 0x00de, 0x00ce, 0x6004, 0xa08e, -- 0x0002, 0x11a8, 0x6018, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, -- 0x1170, 0x2009, 0xb535, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, -- 0xb500, 0x080c, 0x4bc7, 0x00ee, 0x080c, 0x8c13, 0x0020, 0x080c, -- 0x8c13, 0x080c, 0x2c9c, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x2cc2, 0x012e, 0x00ee, 0x080c, 0x9e17, 0x0005, 0x2001, 0x0002, -- 0x080c, 0x4efe, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6cd4, -- 0x080c, 0x7174, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2cc2, 0x0804, -- 0x9ad2, 0x00c6, 0x00d6, 0x6104, 0xa186, 0x0016, 0x0d38, 0x6018, -- 0x2068, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0904, 0x9b1c, 0x8001, -- 0x6842, 0x6003, 0x0001, 0x080c, 0x6cd4, 0x080c, 0x7174, 0x00de, -- 0x00ce, 0x0898, 0x080c, 0x8c13, 0x0804, 0x9ad4, 0x080c, 0x8c41, -- 0x0804, 0x9ad4, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xa104, 0x00de, -- 0x0118, 0x080c, 0x8617, 0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, -- 0x00ff, 0xa105, 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, -- 0x0002, 0x6038, 0x600a, 0x2001, 0xb7b7, 0x2004, 0x6016, 0x080c, -- 0x6c8e, 0x080c, 0x7174, 0x0005, 0x00de, 0x00ce, 0x080c, 0x8c13, -- 0x080c, 0x2c9c, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2cc2, -- 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, -- 0x012e, 0x00ee, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1515, -- 0x000b, 0x0005, 0x9bca, 0x9bca, 0x9bca, 0x9bca, 0x9bca, 0x9bca, -- 0x9bca, 0x9bca, 0x9bca, 0x99f8, 0x9bca, 0x9a00, 0x9bcc, 0x9a00, -- 0x9bd9, 0x9bca, 0x080c, 0x1515, 0x6004, 0xa086, 0x008b, 0x0148, -- 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x6c8e, 0x080c, 0x7174, -- 0x0005, 0x080c, 0x9e0b, 0x080c, 0x9c54, 0x0580, 0x080c, 0x2c9c, -- 0x00d6, 0x080c, 0x9c54, 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, -- 0x684b, 0x0006, 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, -- 0x5409, 0x2c68, 0x080c, 0x85c1, 0x0150, 0x6818, 0x601a, 0x080c, -- 0xa021, 0x00c6, 0x2d60, 0x080c, 0x9e17, 0x00ce, 0x0008, 0x2d60, -- 0x00de, 0x6013, 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, -- 0x0001, 0x080c, 0x6cd4, 0x080c, 0x7174, 0x0078, 0x6030, 0xa08c, -- 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, -- 0x080c, 0x2c9c, 0x08b0, 0x080c, 0x9e17, 0x0005, 0x6000, 0xa08a, -- 0x0010, 0x1a0c, 0x1515, 0x000b, 0x0005, 0x9c35, 0x9c35, 0x9c35, -- 0x9c37, 0x9c37, 0x9c35, 0x9c35, 0x9c35, 0x9c35, 0x9c35, 0x9c35, -- 0x9c35, 0x9c35, 0x9c35, 0x9c35, 0x9c35, 0x080c, 0x1515, 0x080c, -- 0x8257, 0x190c, 0x1515, 0x6110, 0x2168, 0x684b, 0x0006, 0x080c, -- 0x5409, 0x080c, 0x8617, 0x0005, 0xa284, 0x0007, 0x1158, 0xa282, -- 0xbd00, 0x0240, 0x2001, 0xb517, 0x2004, 0xa202, 0x1218, 0xa085, -- 0x0001, 0x0005, 0xa006, 0x0ce8, 0x0026, 0x6210, 0xa294, 0xf000, -- 0x002e, 0x0005, 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, -- 0x8000, 0x2061, 0xbd00, 0x2071, 0xb500, 0x7348, 0x7068, 0xa302, -- 0x12a8, 0x601c, 0xa206, 0x1160, 0x080c, 0x9fac, 0x0148, 0x080c, -- 0x9e52, 0x1110, 0x080c, 0x8c13, 0x00c6, 0x080c, 0x8617, 0x00ce, -- 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, 0x0c38, 0x012e, 0x000e, -- 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0xa188, -- 0xb635, 0x210c, 0x81ff, 0x0128, 0x2061, 0xb8f4, 0x611a, 0x080c, -- 0x2c9c, 0xa006, 0x0010, 0xa085, 0x0001, 0x001e, 0x00ce, 0x00ee, -- 0x0005, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, -- 0x85c1, 0x005e, 0x0180, 0x6612, 0x651a, 0x080c, 0xa021, 0x601f, -- 0x0003, 0x2009, 0x004b, 0x080c, 0x8646, 0xa085, 0x0001, 0x012e, -- 0x005e, 0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, -- 0x2091, 0x8000, 0x62a0, 0x00c6, 0x080c, 0x9ed0, 0x005e, 0x0550, -- 0x6013, 0x0000, 0x651a, 0x080c, 0xa021, 0x601f, 0x0003, 0x0016, -- 0x00c6, 0x2560, 0x080c, 0x51ab, 0x00ce, 0x080c, 0x6df6, 0x0076, -- 0x2039, 0x0000, 0x080c, 0x6d03, 0x2c08, 0x080c, 0xae76, 0x007e, -- 0x001e, 0xd184, 0x0128, 0x080c, 0x8617, 0xa085, 0x0001, 0x0030, -- 0x2009, 0x004c, 0x080c, 0x8646, 0xa085, 0x0001, 0x012e, 0x005e, -- 0x00ce, 0x0005, 0xa006, 0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, -- 0x080c, 0x85c1, 0x2c78, 0x00ce, 0x0180, 0x7e12, 0x2c00, 0x781a, -- 0x781f, 0x0003, 0x2021, 0x0005, 0x080c, 0x9d4a, 0x2f60, 0x2009, -- 0x004d, 0x080c, 0x8646, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, -- 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x85c1, 0x2c78, -- 0x00ce, 0x0178, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, -- 0x0005, 0x0481, 0x2f60, 0x2009, 0x004e, 0x080c, 0x8646, 0xa085, -- 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, -- 0x00c6, 0x080c, 0x85c1, 0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, -- 0x781a, 0x781f, 0x0003, 0x2021, 0x0004, 0x00a1, 0x2001, 0xb7a0, -- 0x2004, 0xd0fc, 0x0120, 0x2f60, 0x080c, 0x8617, 0x0028, 0x2f60, -- 0x2009, 0x0052, 0x080c, 0x8646, 0xa085, 0x0001, 0x004e, 0x00ce, -- 0x00fe, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x514d, 0x0118, 0x2001, 0x9d4f, 0x0028, 0x080c, 0x511d, 0x0158, -- 0x2001, 0x9d55, 0x0006, 0xa00e, 0x2400, 0x080c, 0x54dc, 0x080c, -- 0x5409, 0x000e, 0x0807, 0x2418, 0x080c, 0x7030, 0x62a0, 0x0086, -- 0x2041, 0x0001, 0x2039, 0x0001, 0x2608, 0x080c, 0x6e0f, 0x008e, -- 0x080c, 0x6d03, 0x2f08, 0x2648, 0x080c, 0xae76, 0x613c, 0x81ff, -- 0x090c, 0x6ec4, 0x080c, 0x7174, 0x012e, 0x007e, 0x009e, 0x0005, -- 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c1, 0x001e, -- 0x0188, 0x660a, 0x611a, 0x080c, 0xa021, 0x601f, 0x0001, 0x2d00, -- 0x6012, 0x2009, 0x001f, 0x080c, 0x8646, 0xa085, 0x0001, 0x012e, -- 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, -- 0x00c6, 0x080c, 0x85c1, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, -- 0xa021, 0x601f, 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, -- 0x8646, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, -- 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c1, 0x001e, -- 0x0188, 0x660a, 0x611a, 0x080c, 0xa021, 0x601f, 0x0001, 0x2d00, -- 0x6012, 0x2009, 0x003d, 0x080c, 0x8646, 0xa085, 0x0001, 0x012e, -- 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, -- 0x00c6, 0x080c, 0x9ed0, 0x001e, 0x0180, 0x611a, 0x080c, 0xa021, -- 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0000, 0x080c, 0x8646, -- 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, -- 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c1, 0x001e, 0x0188, -- 0x660a, 0x611a, 0x080c, 0xa021, 0x601f, 0x0001, 0x2d00, 0x6012, -- 0x2009, 0x0044, 0x080c, 0x8646, 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, 0xb7b6, 0x2004, 0x0006, 0xa082, 0x0051, 0x000e, 0x0208, -- 0x8004, 0x6016, 0x080c, 0xb32e, 0x603f, 0x0000, 0x000e, 0x0005, -- 0x0066, 0x00c6, 0x00d6, 0x2031, 0xb553, 0x2634, 0xd6e4, 0x0128, -- 0x6618, 0x2660, 0x6e48, 0x080c, 0x50d6, 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, 0x85c1, 0x001e, 0x0190, 0x611a, 0x080c, -- 0xa021, 0x601f, 0x0001, 0x2d00, 0x6012, 0x080c, 0x2c9c, 0x2009, -- 0x0028, 0x080c, 0x8646, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -- 0xa006, 0x0cd8, 0xa186, 0x0015, 0x1178, 0x2011, 0xb521, 0x2204, -- 0xa086, 0x0074, 0x1148, 0x080c, 0x8f92, 0x6003, 0x0001, 0x6007, -- 0x0029, 0x080c, 0x6cd4, 0x0020, 0x080c, 0x8c13, 0x080c, 0x8617, -- 0x0005, 0xa186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x4efe, -- 0x00e8, 0xa186, 0x0015, 0x11e8, 0x2011, 0xb521, 0x2204, 0xa086, -- 0x0014, 0x11b8, 0x00d6, 0x6018, 0x2068, 0x080c, 0x504c, 0x00de, -- 0x080c, 0x904b, 0x1170, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, -- 0xa005, 0x0138, 0x2001, 0x0006, 0x080c, 0x4efe, 0x080c, 0x879a, -- 0x0020, 0x080c, 0x8c13, 0x080c, 0x8617, 0x0005, 0x6848, 0xa086, -- 0x0005, 0x1108, 0x0009, 0x0005, 0x6850, 0xc0ad, 0x6852, 0x0005, -- 0x00e6, 0x0126, 0x2071, 0xb500, 0x2091, 0x8000, 0x7548, 0xa582, -- 0x0001, 0x0608, 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, -- 0xace0, 0x0018, 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xbd00, -- 0x0c98, 0x6003, 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, -- 0xa502, 0x1230, 0x754e, 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, -- 0x704f, 0xbd00, 0x0cc0, 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xbb8c, -- 0x7014, 0xd0e4, 0x0150, 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, -- 0x0050, 0x080c, 0x6c8e, 0x080c, 0x7174, 0x00ee, 0x0005, 0x00c6, -- 0x00f6, 0x2c78, 0x080c, 0x5306, 0x00fe, 0x0120, 0x601c, 0xa084, -- 0x000f, 0x0013, 0x00ce, 0x0005, 0x99f8, 0x9f27, 0x9f2a, 0x9f2d, -- 0xb11b, 0xb136, 0xb139, 0x99f8, 0x99f8, 0x080c, 0x1515, 0xe000, -- 0xe000, 0x0005, 0xe000, 0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, -- 0x2c78, 0x080c, 0x5306, 0x0538, 0x080c, 0x85c1, 0x1128, 0x2001, -- 0xb7b8, 0x2004, 0x783e, 0x00f8, 0x7818, 0x601a, 0x080c, 0xa021, -- 0x781c, 0xa086, 0x0003, 0x0128, 0x7808, 0x6036, 0x2f00, 0x603a, -- 0x0020, 0x7808, 0x603a, 0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, -- 0x6007, 0x0035, 0x6003, 0x0001, 0x7950, 0x6152, 0x080c, 0x6c8e, -- 0x080c, 0x7174, 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, 0x6c8e, 0x6803, -- 0x0002, 0x00fe, 0x001e, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x5306, -- 0x1118, 0xa085, 0x0001, 0x0070, 0x6020, 0xd0f4, 0x1150, 0xc0f5, -- 0x6022, 0x6010, 0x2078, 0x7828, 0x603a, 0x782c, 0x6036, 0x080c, -- 0x194d, 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, 0xb7b2, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, -- 0x080c, 0x6b41, 0x2001, 0xb7b6, 0x82ff, 0x1110, 0x2011, 0x0014, -- 0x2202, 0x2001, 0xb7b4, 0x200c, 0x8000, 0x2014, 0x2071, 0xb78e, -- 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x6b41, 0x2001, 0xb7b7, -- 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2009, 0xb7b8, 0xa280, -- 0x000a, 0x200a, 0x080c, 0x532b, 0x00ee, 0x003e, 0x002e, 0x001e, -- 0x000e, 0x0005, 0x0006, 0x00e6, 0x2001, 0xb7b6, 0x2003, 0x0028, -- 0x2001, 0xb7b7, 0x2003, 0x0014, 0x2071, 0xb78e, 0x701b, 0x0000, -- 0x701f, 0x07d0, 0x2001, 0xb7b8, 0x2003, 0x001e, 0x00ee, 0x000e, -- 0x0005, 0x00d6, 0x6054, 0xa06d, 0x0110, 0x080c, 0x160f, 0x00de, -- 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, -- 0x85c1, 0x001e, 0x0178, 0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, -- 0x6012, 0x2009, 0x0033, 0x080c, 0x8646, 0xa085, 0x0001, 0x012e, -- 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, -- 0xb500, 0xa186, 0x0015, 0x1500, 0x7084, 0xa086, 0x0018, 0x11e0, -- 0x6010, 0x2068, 0x6a3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x7332, -- 0x01d8, 0x7070, 0x6a50, 0xa206, 0x1160, 0x7074, 0x6a54, 0xa206, -- 0x1140, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, -- 0x2ce1, 0x080c, 0x879a, 0x0020, 0x080c, 0x8c13, 0x080c, 0x8617, -- 0x00fe, 0x00ee, 0x00de, 0x0005, 0x7054, 0x6a54, 0xa206, 0x0d48, -- 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c1, -- 0x001e, 0x0180, 0x611a, 0x080c, 0xa021, 0x601f, 0x0001, 0x2d00, -- 0x6012, 0x2009, 0x0043, 0x080c, 0x8646, 0xa085, 0x0001, 0x012e, -- 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, -- 0xb500, 0xa186, 0x0015, 0x11c0, 0x7084, 0xa086, 0x0004, 0x11a0, -- 0x6010, 0xa0e8, 0x000f, 0x2c78, 0x080c, 0x7332, 0x01a8, 0x7070, -- 0x6a08, 0xa206, 0x1130, 0x7074, 0x6a0c, 0xa206, 0x1110, 0x080c, -- 0x2c9c, 0x080c, 0x879a, 0x0020, 0x080c, 0x8c13, 0x080c, 0x8617, -- 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, 0x524b, 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, 0x5409, 0x6013, -- 0x0000, 0x003e, 0x00de, 0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, -- 0x0035, 0x0110, 0x6a34, 0x0008, 0x6a28, 0x080c, 0x9c44, 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, 0x947d, 0x0005, -+ 0x2308, 0x2019, 0xbb98, 0xad90, 0x0019, 0x080c, 0x990d, 0x003e, -+ 0xd6cc, 0x0904, 0x92e6, 0x7124, 0x695a, 0x81ff, 0x0904, 0x92e6, -+ 0xa192, 0x0021, 0x1260, 0x2071, 0xbb98, 0x831c, 0x2300, 0xae18, -+ 0xad90, 0x001d, 0x080c, 0x990d, 0x080c, 0xa137, 0x04b8, 0x6838, -+ 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c68, 0x00f6, 0x2d78, -+ 0x080c, 0x98b2, 0x00fe, 0x080c, 0xa137, 0x080c, 0x98fd, 0x0440, -+ 0x00f6, 0x2c78, 0x080c, 0x5305, 0x00fe, 0x0190, 0x684c, 0xd0ac, -+ 0x0178, 0x6020, 0xd0dc, 0x1160, 0x6850, 0xd0bc, 0x1148, 0x6810, -+ 0x6914, 0xa105, 0x0128, 0x080c, 0x9f35, 0x00de, 0x00ee, 0x00f0, -+ 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0130, -+ 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0x9483, 0x080c, 0x5408, -+ 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x080c, -+ 0x9f03, 0x00de, 0x00ee, 0x1110, 0x080c, 0x861d, 0x0005, 0x00f6, -+ 0x6003, 0x0003, 0x2079, 0xbb8c, 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, -+ 0x1fa9, 0x080c, 0x6cf0, 0x080c, 0x7230, 0x0005, 0x2001, 0xb7b8, -+ 0x2004, 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, -+ 0x3e20, 0x2c10, 0x080c, 0x185e, 0x0005, 0xa182, 0x0040, 0x0002, -+ 0x934b, 0x934b, 0x934b, 0x934b, 0x934b, 0x934d, 0x93e0, 0x934b, -+ 0x934b, 0x93f6, 0x945a, 0x934b, 0x934b, 0x934b, 0x934b, 0x9469, -+ 0x934b, 0x934b, 0x934b, 0x080c, 0x1515, 0x0076, 0x00f6, 0x00e6, -+ 0x00d6, 0x2071, 0xbb8c, 0x6110, 0x2178, 0x7614, 0xa6b4, 0x0fff, -+ 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, 0x6218, 0x2268, 0x6a3c, 0x82ff, -+ 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0x93db, 0xa694, 0xff00, -+ 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, -+ 0x0300, 0x0904, 0x93db, 0x080c, 0x15f8, 0x090c, 0x1515, 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, -+ 0xbb98, 0xad90, 0x0019, 0x080c, 0x990d, 0x003e, 0xd6cc, 0x01d8, -+ 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, -+ 0xbb98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x990d, -+ 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, -+ 0x2d78, 0x080c, 0x98b2, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, -+ 0x00f6, 0x6003, 0x0003, 0x2079, 0xbb8c, 0x7c04, 0x7b00, 0x7e0c, -+ 0x7d08, 0x6010, 0x2078, 0x7c12, 0x7b16, 0x7e0a, 0x7d0e, 0x00fe, -+ 0x2c10, 0x080c, 0x1fa9, 0x080c, 0x7d60, 0x0005, 0x00d6, 0x00f6, -+ 0x2c78, 0x080c, 0x5305, 0x00fe, 0x0120, 0x2001, 0xb7b8, 0x2004, -+ 0x603e, 0x6003, 0x0002, 0x080c, 0x7126, 0x080c, 0x7230, 0x6110, -+ 0x2168, 0x694c, 0xd1e4, 0x0904, 0x9458, 0xd1cc, 0x0540, 0x6948, -+ 0x6838, 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, -+ 0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156, 0x21a8, -+ 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0x9420, 0x015e, 0x000e, -+ 0x6852, 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x161f, 0x0418, -+ 0x0016, 0x080c, 0x161f, 0x00de, 0x080c, 0x98fd, 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, 0x5408, 0x080c, 0x9f03, 0x1110, 0x080c, 0x861d, -+ 0x00de, 0x0005, 0x2019, 0x0001, 0x080c, 0x7fe4, 0x6003, 0x0002, -+ 0x2001, 0xb7b8, 0x2004, 0x603e, 0x080c, 0x7126, 0x080c, 0x7230, -+ 0x0005, 0x080c, 0x7126, 0x080c, 0x2c9c, 0x00d6, 0x6110, 0x2168, -+ 0x080c, 0x9c5a, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, -+ 0x0000, 0x080c, 0x5408, 0x080c, 0x9e11, 0x00de, 0x080c, 0x861d, -+ 0x080c, 0x7230, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138, 0x684b, -+ 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962, 0x685e, -+ 0x0005, 0xa182, 0x0040, 0x0002, 0x94a7, 0x94a7, 0x94a7, 0x94a7, -+ 0x94a7, 0x94a9, 0x94a7, 0x9564, 0x9570, 0x94a7, 0x94a7, 0x94a7, -+ 0x94a7, 0x94a7, 0x94a7, 0x94a7, 0x94a7, 0x94a7, 0x94a7, 0x080c, -+ 0x1515, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xbb8c, 0x6110, -+ 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c, 0x5305, -+ 0x00fe, 0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, 0xd0f4, 0x0120, -+ 0x080c, 0x9f35, 0x0804, 0x955f, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, -+ 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff, -+ 0x0904, 0x9555, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, -+ 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0x9553, 0xa686, -+ 0x0100, 0x1140, 0x2001, 0xbb99, 0x2004, 0xa005, 0x1118, 0xc6c4, -+ 0x7e46, 0x0c28, 0x080c, 0x15f8, 0x090c, 0x1515, 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, -+ 0xbb98, 0xad90, 0x0019, 0x080c, 0x990d, 0x003e, 0xd6cc, 0x01d8, -+ 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, -+ 0xbb98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0x990d, -+ 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, -+ 0x2d78, 0x080c, 0x98b2, 0xd6dc, 0x1110, 0xa006, 0x0030, 0x2001, -+ 0x0001, 0x2071, 0xbb8c, 0x7218, 0x731c, 0x080c, 0x18b1, 0x00de, -+ 0x00ee, 0x00fe, 0x007e, 0x0005, 0x2001, 0xb7b8, 0x2004, 0x603e, -+ 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x185e, 0x0005, -+ 0x2001, 0xb7b8, 0x2004, 0x603e, 0x00d6, 0x6003, 0x0002, 0x6110, -+ 0x2168, 0x694c, 0xd1e4, 0x0904, 0x967b, 0x603f, 0x0000, 0x00f6, -+ 0x2c78, 0x080c, 0x5305, 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, 0x9f35, 0x0804, -+ 0x967b, 0x694c, 0xd1cc, 0x0904, 0x964b, 0x6948, 0x6838, 0xd0fc, -+ 0x0904, 0x960e, 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, 0xa0bf, 0x0118, -+ 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, -+ 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, -+ 0xa115, 0x0110, 0x080c, 0x9483, 0x6848, 0x784a, 0x6860, 0x7862, -+ 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98, 0x000d, 0x2009, 0x0020, -+ 0x0156, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0x95fa, -+ 0x015e, 0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, 0x080c, 0xa137, -+ 0x001e, 0x2168, 0x080c, 0x161f, 0x0804, 0x9676, 0x0016, 0x00f6, -+ 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0, 0xa086, -+ 0x0028, 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8, 0xd1dc, -+ 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xa0bf, 0x0118, -+ 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, -+ 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, -+ 0xa115, 0x0110, 0x080c, 0x9483, 0x6860, 0x7862, 0x685c, 0x785e, -+ 0x684c, 0x784e, 0x00fe, 0x080c, 0x161f, 0x00de, 0x080c, 0xa137, -+ 0x080c, 0x98fd, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, -+ 0xa0b6, 0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, 0x684b, 0x001c, -+ 0x00d8, 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0xa0bf, 0x0118, -+ 0x6944, 0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, 0x684b, 0x0007, -+ 0x0058, 0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, -+ 0xa115, 0x0110, 0x080c, 0x9483, 0x080c, 0x5408, 0x080c, 0x9f03, -+ 0x1110, 0x080c, 0x861d, 0x00de, 0x0005, 0x080c, 0x7090, 0x0010, -+ 0x080c, 0x7126, 0x080c, 0x9c5a, 0x01c0, 0x00d6, 0x6110, 0x2168, -+ 0x6837, 0x0103, 0x2009, 0xb50c, 0x210c, 0xd18c, 0x11c0, 0xd184, -+ 0x1198, 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c, 0xb380, -+ 0x6847, 0x0000, 0x080c, 0x5408, 0x00de, 0x080c, 0x861d, 0x080c, -+ 0x7173, 0x080c, 0x7230, 0x0005, 0x684b, 0x0004, 0x0c88, 0x684b, -+ 0x0004, 0x0c70, 0xa182, 0x0040, 0x0002, 0x96c0, 0x96c0, 0x96c0, -+ 0x96c0, 0x96c0, 0x96c2, 0x96c0, 0x96c5, 0x96c0, 0x96c0, 0x96c0, -+ 0x96c0, 0x96c0, 0x96c0, 0x96c0, 0x96c0, 0x96c0, 0x96c0, 0x96c0, -+ 0x080c, 0x1515, 0x080c, 0x861d, 0x0005, 0x0006, 0x0026, 0xa016, -+ 0x080c, 0x185e, 0x002e, 0x000e, 0x0005, 0xa182, 0x0085, 0x0002, -+ 0x96d9, 0x96d7, 0x96d7, 0x96e5, 0x96d7, 0x96d7, 0x96d7, 0x080c, -+ 0x1515, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c8d, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x7173, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, -+ 0x00e6, 0x2071, 0xbb80, 0x7224, 0x6212, 0x7220, 0x080c, 0x9c4a, -+ 0x01a0, 0x2268, 0x6800, 0xa086, 0x0000, 0x0178, 0x6018, 0x6d18, -+ 0xa52e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0x991d, 0x00ce, 0x0128, -+ 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, -+ 0x0001, 0x080c, 0x6c8d, 0x080c, 0x7173, 0x00f6, 0x2278, 0x080c, -+ 0x5305, 0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, 0x00c6, 0x2260, -+ 0x603f, 0x0000, 0x080c, 0x9f35, 0x00ce, 0x00ee, 0x00de, 0x005e, -+ 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085, -+ 0x0a0c, 0x1515, 0xa08a, 0x008c, 0x1a0c, 0x1515, 0xa082, 0x0085, -+ 0x0072, 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1515, -+ 0x080c, 0x7090, 0x080c, 0x9e1d, 0x080c, 0x7173, 0x0005, 0x9746, -+ 0x9748, 0x9748, 0x9746, 0x9746, 0x9746, 0x9746, 0x080c, 0x1515, -+ 0x080c, 0x7090, 0x080c, 0x9e1d, 0x080c, 0x7173, 0x0005, 0xa186, -+ 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04a8, 0xa186, -+ 0x0027, 0x11e8, 0x080c, 0x7090, 0x080c, 0x2c9c, 0x00d6, 0x6010, -+ 0x2068, 0x080c, 0x9c5a, 0x0150, 0x6837, 0x0103, 0x6847, 0x0000, -+ 0x684b, 0x0029, 0x080c, 0x5408, 0x080c, 0x9e11, 0x00de, 0x080c, -+ 0x861d, 0x080c, 0x7173, 0x0005, 0x080c, 0x8663, 0x0ce0, 0xa186, -+ 0x0014, 0x1dd0, 0x080c, 0x7090, 0x00d6, 0x6010, 0x2068, 0x080c, -+ 0x9c5a, 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0006, -+ 0x6850, 0xc0ec, 0x6852, 0x08f0, 0x0002, 0x9796, 0x9794, 0x9794, -+ 0x9794, 0x9794, 0x9794, 0x97ae, 0x080c, 0x1515, 0x080c, 0x7090, -+ 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, -+ 0x0035, 0x1118, 0x2001, 0xb7b6, 0x0010, 0x2001, 0xb7b7, 0x2004, -+ 0x6016, 0x6003, 0x000c, 0x080c, 0x7173, 0x0005, 0x080c, 0x7090, -+ 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, -+ 0x0035, 0x1118, 0x2001, 0xb7b6, 0x0010, 0x2001, 0xb7b7, 0x2004, -+ 0x6016, 0x6003, 0x000e, 0x080c, 0x7173, 0x0005, 0xa182, 0x008c, -+ 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x8663, 0x0005, -+ 0x97d7, 0x97d7, 0x97d7, 0x97d7, 0x97d9, 0x9832, 0x97d7, 0x080c, -+ 0x1515, 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x5305, 0x00fe, 0x0168, -+ 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, -+ 0x0035, 0x1118, 0x00de, 0x0804, 0x9845, 0x080c, 0x9c5a, 0x1118, -+ 0x080c, 0x9e11, 0x00f0, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x1110, -+ 0x080c, 0x9e11, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0x684b, -+ 0x0006, 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, -+ 0x0020, 0x684b, 0x0005, 0x080c, 0x9ed2, 0x6847, 0x0000, 0x080c, -+ 0x5408, 0x2c68, 0x080c, 0x85c7, 0x01c0, 0x6003, 0x0001, 0x6007, -+ 0x001e, 0x600b, 0xffff, 0x2009, 0xbb8e, 0x210c, 0x6136, 0x2009, -+ 0xbb8f, 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, 0xa027, 0x6950, -+ 0x6152, 0x601f, 0x0001, 0x080c, 0x6c8d, 0x2d60, 0x080c, 0x861d, -+ 0x00de, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x5305, 0x00fe, 0x0598, -+ 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, 0x0130, 0xa186, -+ 0x001e, 0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, 0x2c68, 0x080c, -+ 0xa10a, 0x1904, 0x988a, 0x080c, 0x85c7, 0x01d8, 0x6106, 0x6003, -+ 0x0001, 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, -+ 0x612e, 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, -+ 0x613a, 0x6950, 0x6152, 0x080c, 0xa027, 0x080c, 0x6c8d, 0x080c, -+ 0x7173, 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, 0x080c, 0x9c5a, -+ 0x01c8, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0xc0ec, 0x6852, -+ 0x684b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020, -+ 0x684b, 0x0005, 0x080c, 0x9ed2, 0x6847, 0x0000, 0x080c, 0x5408, -+ 0x080c, 0x9e11, 0x00de, 0x080c, 0x861d, 0x0005, 0x0016, 0x00d6, -+ 0x6010, 0x2068, 0x080c, 0x9c5a, 0x0140, 0x6837, 0x0103, 0x684b, -+ 0x0028, 0x6847, 0x0000, 0x080c, 0x5408, 0x00de, 0x001e, 0xa186, -+ 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, -+ 0x080c, 0x8663, 0x0030, 0x080c, 0x7090, 0x080c, 0x9e1d, 0x080c, -+ 0x7173, 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029, 0x0001, -+ 0xa182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x2069, -+ 0xbb98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90, 0x001d, -+ 0x080c, 0x990d, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0110, 0x080c, -+ 0x161f, 0x080c, 0x15f8, 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, 0x5408, 0x2f68, -+ 0x0cb8, 0x080c, 0x5408, 0x00fe, 0x0005, 0x0156, 0xa184, 0x0001, -+ 0x0108, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, -+ 0x8210, 0x1f04, 0x9914, 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, 0x9954, -+ 0x9954, 0x994f, 0x9976, 0x9942, 0x994f, 0x9976, 0x994f, 0x994f, -+ 0x9942, 0x994f, 0x080c, 0x1515, 0x0036, 0x2019, 0x0010, 0x080c, -+ 0xace0, 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0xa006, -+ 0x0005, 0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, 0x11d8, 0x6010, -+ 0x2068, 0x080c, 0x9c5a, 0x01c0, 0x6834, 0xa086, 0x0139, 0x1128, -+ 0x684b, 0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, 0x2001, 0x0005, -+ 0x080c, 0x54db, 0x080c, 0x9ed2, 0x080c, 0x5408, 0x080c, 0x861d, -+ 0xa085, 0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000, 0xa08a, -+ 0x0010, 0x1a0c, 0x1515, 0x000b, 0x0005, 0x998d, 0x99ae, 0x998f, -+ 0x99cd, 0x99ab, 0x998d, 0x994f, 0x9954, 0x9954, 0x994f, 0x994f, -+ 0x994f, 0x994f, 0x994f, 0x994f, 0x994f, 0x080c, 0x1515, 0x86ff, -+ 0x11b8, 0x601c, 0xa086, 0x0006, 0x0198, 0x00d6, 0x6010, 0x2068, -+ 0x080c, 0x9c5a, 0x0110, 0x080c, 0x9ed2, 0x00de, 0x6007, 0x0085, -+ 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x6c8d, 0x080c, 0x7173, -+ 0xa085, 0x0001, 0x0005, 0x080c, 0x194d, 0x0c08, 0x00e6, 0x2071, -+ 0xb7e0, 0x7024, 0xac06, 0x1110, 0x080c, 0x7f59, 0x601c, 0xa084, -+ 0x000f, 0xa086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, -+ 0x2c40, 0x080c, 0x8130, 0x009e, 0x008e, 0x0010, 0x080c, 0x7e58, -+ 0x00ee, 0x1928, 0x080c, 0x994f, 0x0005, 0x0036, 0x00e6, 0x2071, -+ 0xb7e0, 0x703c, 0xac06, 0x1140, 0x2019, 0x0000, 0x080c, 0x7fe4, -+ 0x00ee, 0x003e, 0x0804, 0x998f, 0x080c, 0x825d, 0x00ee, 0x003e, -+ 0x1904, 0x998f, 0x080c, 0x994f, 0x0005, 0x00c6, 0x601c, 0xa084, -+ 0x000f, 0x0013, 0x00ce, 0x0005, 0x99fe, 0x9a6b, 0x9bb9, 0x9a09, -+ 0x9e1d, 0x99fe, 0xacd2, 0xa14e, 0x9a6b, 0x99f7, 0x9c24, 0x080c, -+ 0x1515, 0x080c, 0x9e58, 0x1110, 0x080c, 0x8c19, 0x0005, 0x080c, -+ 0x7090, 0x080c, 0x7173, 0x080c, 0x861d, 0x0005, 0x6017, 0x0001, -+ 0x0005, 0x080c, 0x9c5a, 0x0120, 0x6010, 0xa080, 0x0019, 0x2c02, -+ 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1515, 0x000b, 0x0005, 0x9a27, -+ 0x9a29, 0x9a49, 0x9a5b, 0x9a68, 0x9a27, 0x99fe, 0x99fe, 0x99fe, -+ 0x9a5b, 0x9a5b, 0x9a27, 0x9a27, 0x9a27, 0x9a27, 0x9a65, 0x080c, -+ 0x1515, 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, -+ 0xb7e0, 0x7024, 0xac06, 0x0190, 0x080c, 0x7e58, 0x6007, 0x0085, -+ 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xb7b7, 0x2004, 0x6016, -+ 0x080c, 0x6c8d, 0x080c, 0x7173, 0x00ee, 0x0005, 0x6017, 0x0001, -+ 0x0cd8, 0x00d6, 0x6010, 0x2068, 0x6850, 0xc0b5, 0x6852, 0x00de, -+ 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x6c8d, -+ 0x080c, 0x7173, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010, 0x2068, -+ 0x6850, 0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x861d, 0x0005, -+ 0x080c, 0x194d, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1515, -+ 0x000b, 0x0005, 0x9a82, 0x9a06, 0x9a84, 0x9a82, 0x9a84, 0x9a84, -+ 0x99ff, 0x9a82, 0x99f9, 0x99f9, 0x9a82, 0x9a82, 0x9a82, 0x9a82, -+ 0x9a82, 0x9a82, 0x080c, 0x1515, 0x00d6, 0x6018, 0x2068, 0x6804, -+ 0xa084, 0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x1515, 0x000b, -+ 0x0005, 0x9a9d, 0x9b5f, 0x9a9f, 0x9add, 0x9a9f, 0x9add, 0x9a9f, -+ 0x9aad, 0x9a9d, 0x9add, 0x9a9d, 0x9ac9, 0x080c, 0x1515, 0x6004, -+ 0xa08e, 0x0016, 0x05a8, 0xa08e, 0x0004, 0x0590, 0xa08e, 0x0002, -+ 0x0578, 0xa08e, 0x004b, 0x0904, 0x9b5b, 0x6004, 0x080c, 0x9e58, -+ 0x0904, 0x9b78, 0xa08e, 0x0021, 0x0904, 0x9b7c, 0xa08e, 0x0022, -+ 0x0904, 0x9b78, 0xa08e, 0x003d, 0x0904, 0x9b7c, 0xa08e, 0x0039, -+ 0x0904, 0x9b80, 0xa08e, 0x0035, 0x0904, 0x9b80, 0xa08e, 0x001e, -+ 0x0188, 0xa08e, 0x0001, 0x1150, 0x00d6, 0x6018, 0x2068, 0x6804, -+ 0xa084, 0x00ff, 0x00de, 0xa086, 0x0006, 0x0110, 0x080c, 0x2c9c, -+ 0x080c, 0x8c19, 0x080c, 0x9e1d, 0x0005, 0x00c6, 0x00d6, 0x6104, -+ 0xa186, 0x0016, 0x0904, 0x9b4c, 0xa186, 0x0002, 0x15d8, 0x2001, -+ 0xb535, 0x2004, 0xd08c, 0x1198, 0x080c, 0x5acf, 0x1180, 0x2001, -+ 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, 0xa085, -+ 0x0001, 0x080c, 0x5b13, 0x080c, 0x5a07, 0x0804, 0x9ba2, 0x6018, -+ 0x2068, 0x2001, 0xb535, 0x2004, 0xd0ac, 0x1904, 0x9ba2, 0x68a0, -+ 0xd0bc, 0x1904, 0x9ba2, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0190, -+ 0x8001, 0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, -+ 0x603f, 0x0000, 0x080c, 0x85c7, 0x0128, 0x2d00, 0x601a, 0x601f, -+ 0x0001, 0x0450, 0x00de, 0x00ce, 0x6004, 0xa08e, 0x0002, 0x11a8, -+ 0x6018, 0xa080, 0x0028, 0x2004, 0xa086, 0x007e, 0x1170, 0x2009, -+ 0xb535, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0xb500, 0x080c, -+ 0x4bc6, 0x00ee, 0x080c, 0x8c19, 0x0020, 0x080c, 0x8c19, 0x080c, -+ 0x2c9c, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2cc2, 0x012e, -+ 0x00ee, 0x080c, 0x9e1d, 0x0005, 0x2001, 0x0002, 0x080c, 0x4efd, -+ 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6cd3, 0x080c, 0x7173, -+ 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2cc2, 0x0804, 0x9ad8, 0x00c6, -+ 0x00d6, 0x6104, 0xa186, 0x0016, 0x0d38, 0x6018, 0x2068, 0x6840, -+ 0xa084, 0x00ff, 0xa005, 0x0904, 0x9b22, 0x8001, 0x6842, 0x6003, -+ 0x0001, 0x080c, 0x6cd3, 0x080c, 0x7173, 0x00de, 0x00ce, 0x0898, -+ 0x080c, 0x8c19, 0x0804, 0x9ada, 0x080c, 0x8c47, 0x0804, 0x9ada, -+ 0x00d6, 0x2c68, 0x6104, 0x080c, 0xa10a, 0x00de, 0x0118, 0x080c, -+ 0x861d, 0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, -+ 0x6032, 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x6038, -+ 0x600a, 0x2001, 0xb7b7, 0x2004, 0x6016, 0x080c, 0x6c8d, 0x080c, -+ 0x7173, 0x0005, 0x00de, 0x00ce, 0x080c, 0x8c19, 0x080c, 0x2c9c, -+ 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2cc2, 0x6013, 0x0000, -+ 0x601f, 0x0007, 0x6017, 0x0398, 0x603f, 0x0000, 0x012e, 0x00ee, -+ 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1515, 0x000b, 0x0005, -+ 0x9bd0, 0x9bd0, 0x9bd0, 0x9bd0, 0x9bd0, 0x9bd0, 0x9bd0, 0x9bd0, -+ 0x9bd0, 0x99fe, 0x9bd0, 0x9a06, 0x9bd2, 0x9a06, 0x9bdf, 0x9bd0, -+ 0x080c, 0x1515, 0x6004, 0xa086, 0x008b, 0x0148, 0x6007, 0x008b, -+ 0x6003, 0x000d, 0x080c, 0x6c8d, 0x080c, 0x7173, 0x0005, 0x080c, -+ 0x9e11, 0x080c, 0x9c5a, 0x0580, 0x080c, 0x2c9c, 0x00d6, 0x080c, -+ 0x9c5a, 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006, -+ 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x5408, 0x2c68, -+ 0x080c, 0x85c7, 0x0150, 0x6818, 0x601a, 0x080c, 0xa027, 0x00c6, -+ 0x2d60, 0x080c, 0x9e1d, 0x00ce, 0x0008, 0x2d60, 0x00de, 0x6013, -+ 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, -+ 0x6cd3, 0x080c, 0x7173, 0x0078, 0x6030, 0xa08c, 0xff00, 0x810f, -+ 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x080c, 0x2c9c, -+ 0x08b0, 0x080c, 0x9e1d, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, -+ 0x1515, 0x000b, 0x0005, 0x9c3b, 0x9c3b, 0x9c3b, 0x9c3d, 0x9c3d, -+ 0x9c3b, 0x9c3b, 0x9c3b, 0x9c3b, 0x9c3b, 0x9c3b, 0x9c3b, 0x9c3b, -+ 0x9c3b, 0x9c3b, 0x9c3b, 0x080c, 0x1515, 0x080c, 0x825d, 0x190c, -+ 0x1515, 0x6110, 0x2168, 0x684b, 0x0006, 0x080c, 0x5408, 0x080c, -+ 0x861d, 0x0005, 0xa284, 0x0007, 0x1158, 0xa282, 0xbd00, 0x0240, -+ 0x2001, 0xb517, 0x2004, 0xa202, 0x1218, 0xa085, 0x0001, 0x0005, -+ 0xa006, 0x0ce8, 0x0026, 0x6210, 0xa294, 0xf000, 0x002e, 0x0005, -+ 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, -+ 0xbd00, 0x2071, 0xb500, 0x7348, 0x7068, 0xa302, 0x12a8, 0x601c, -+ 0xa206, 0x1160, 0x080c, 0x9fb2, 0x0148, 0x080c, 0x9e58, 0x1110, -+ 0x080c, 0x8c19, 0x00c6, 0x080c, 0x861d, 0x00ce, 0xace0, 0x0018, -+ 0x705c, 0xac02, 0x1208, 0x0c38, 0x012e, 0x000e, 0x003e, 0x00ce, -+ 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0xa188, 0xb635, 0x210c, -+ 0x81ff, 0x0128, 0x2061, 0xb8f4, 0x611a, 0x080c, 0x2c9c, 0xa006, -+ 0x0010, 0xa085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, -+ 0x0056, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c7, 0x005e, -+ 0x0180, 0x6612, 0x651a, 0x080c, 0xa027, 0x601f, 0x0003, 0x2009, -+ 0x004b, 0x080c, 0x864c, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, -+ 0x0005, 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, -+ 0x62a0, 0x00c6, 0x080c, 0x9ed6, 0x005e, 0x0550, 0x6013, 0x0000, -+ 0x651a, 0x080c, 0xa027, 0x601f, 0x0003, 0x0016, 0x00c6, 0x2560, -+ 0x080c, 0x51aa, 0x00ce, 0x080c, 0x6df5, 0x0076, 0x2039, 0x0000, -+ 0x080c, 0x6d02, 0x2c08, 0x080c, 0xae82, 0x007e, 0x001e, 0xd184, -+ 0x0128, 0x080c, 0x861d, 0xa085, 0x0001, 0x0030, 0x2009, 0x004c, -+ 0x080c, 0x864c, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, -+ 0xa006, 0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x85c7, -+ 0x2c78, 0x00ce, 0x0180, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, -+ 0x2021, 0x0005, 0x080c, 0x9d50, 0x2f60, 0x2009, 0x004d, 0x080c, -+ 0x864c, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, -+ 0x00c6, 0x0046, 0x00c6, 0x080c, 0x85c7, 0x2c78, 0x00ce, 0x0178, -+ 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x0481, -+ 0x2f60, 0x2009, 0x004e, 0x080c, 0x864c, 0xa085, 0x0001, 0x004e, -+ 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, -+ 0x85c7, 0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, 0x781a, 0x781f, -+ 0x0003, 0x2021, 0x0004, 0x00a1, 0x2001, 0xb7a0, 0x2004, 0xd0fc, -+ 0x0120, 0x2f60, 0x080c, 0x861d, 0x0028, 0x2f60, 0x2009, 0x0052, -+ 0x080c, 0x864c, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, -+ 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x514c, 0x0118, -+ 0x2001, 0x9d55, 0x0028, 0x080c, 0x511c, 0x0158, 0x2001, 0x9d5b, -+ 0x0006, 0xa00e, 0x2400, 0x080c, 0x54db, 0x080c, 0x5408, 0x000e, -+ 0x0807, 0x2418, 0x080c, 0x702f, 0x62a0, 0x0086, 0x2041, 0x0001, -+ 0x2039, 0x0001, 0x2608, 0x080c, 0x6e0e, 0x008e, 0x080c, 0x6d02, -+ 0x2f08, 0x2648, 0x080c, 0xae82, 0x613c, 0x81ff, 0x090c, 0x6ec3, -+ 0x080c, 0x7173, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c7, 0x001e, 0x0188, 0x660a, -+ 0x611a, 0x080c, 0xa027, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -+ 0x001f, 0x080c, 0x864c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, -+ 0x85c7, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xa027, 0x601f, -+ 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x864c, 0xa085, -+ 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c7, 0x001e, 0x0188, 0x660a, -+ 0x611a, 0x080c, 0xa027, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -+ 0x003d, 0x080c, 0x864c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, -+ 0x9ed6, 0x001e, 0x0180, 0x611a, 0x080c, 0xa027, 0x601f, 0x0001, -+ 0x2d00, 0x6012, 0x2009, 0x0000, 0x080c, 0x864c, 0xa085, 0x0001, -+ 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, -+ 0x8000, 0x00c6, 0x080c, 0x85c7, 0x001e, 0x0188, 0x660a, 0x611a, -+ 0x080c, 0xa027, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0044, -+ 0x080c, 0x864c, 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, 0xb7b6, -+ 0x2004, 0x0006, 0xa082, 0x0051, 0x000e, 0x0208, 0x8004, 0x6016, -+ 0x080c, 0xb33a, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066, 0x00c6, -+ 0x00d6, 0x2031, 0xb553, 0x2634, 0xd6e4, 0x0128, 0x6618, 0x2660, -+ 0x6e48, 0x080c, 0x50d5, 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, 0x85c7, 0x001e, 0x0190, 0x611a, 0x080c, 0xa027, 0x601f, -+ 0x0001, 0x2d00, 0x6012, 0x080c, 0x2c9c, 0x2009, 0x0028, 0x080c, -+ 0x864c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, -+ 0xa186, 0x0015, 0x1178, 0x2011, 0xb521, 0x2204, 0xa086, 0x0074, -+ 0x1148, 0x080c, 0x8f98, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, -+ 0x6cd3, 0x0020, 0x080c, 0x8c19, 0x080c, 0x861d, 0x0005, 0xa186, -+ 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x4efd, 0x00e8, 0xa186, -+ 0x0015, 0x11e8, 0x2011, 0xb521, 0x2204, 0xa086, 0x0014, 0x11b8, -+ 0x00d6, 0x6018, 0x2068, 0x080c, 0x504b, 0x00de, 0x080c, 0x9051, -+ 0x1170, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0138, -+ 0x2001, 0x0006, 0x080c, 0x4efd, 0x080c, 0x87a0, 0x0020, 0x080c, -+ 0x8c19, 0x080c, 0x861d, 0x0005, 0x6848, 0xa086, 0x0005, 0x1108, -+ 0x0009, 0x0005, 0x6850, 0xc0ad, 0x6852, 0x0005, 0x00e6, 0x0126, -+ 0x2071, 0xb500, 0x2091, 0x8000, 0x7548, 0xa582, 0x0001, 0x0608, -+ 0x704c, 0x2060, 0x6000, 0xa086, 0x0000, 0x0148, 0xace0, 0x0018, -+ 0x705c, 0xac02, 0x1208, 0x0cb0, 0x2061, 0xbd00, 0x0c98, 0x6003, -+ 0x0008, 0x8529, 0x754a, 0xaca8, 0x0018, 0x705c, 0xa502, 0x1230, -+ 0x754e, 0xa085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x704f, 0xbd00, -+ 0x0cc0, 0xa006, 0x0cc0, 0x00e6, 0x2071, 0xbb8c, 0x7014, 0xd0e4, -+ 0x0150, 0x6013, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, -+ 0x6c8d, 0x080c, 0x7173, 0x00ee, 0x0005, 0x00c6, 0x00f6, 0x2c78, -+ 0x080c, 0x5305, 0x00fe, 0x0120, 0x601c, 0xa084, 0x000f, 0x0013, -+ 0x00ce, 0x0005, 0x99fe, 0x9f2d, 0x9f30, 0x9f33, 0xb127, 0xb142, -+ 0xb145, 0x99fe, 0x99fe, 0x080c, 0x1515, 0xe000, 0xe000, 0x0005, -+ 0xe000, 0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, 0x2c78, 0x080c, -+ 0x5305, 0x0538, 0x080c, 0x85c7, 0x1128, 0x2001, 0xb7b8, 0x2004, -+ 0x783e, 0x00f8, 0x7818, 0x601a, 0x080c, 0xa027, 0x781c, 0xa086, -+ 0x0003, 0x0128, 0x7808, 0x6036, 0x2f00, 0x603a, 0x0020, 0x7808, -+ 0x603a, 0x2f00, 0x6036, 0x602a, 0x601f, 0x0001, 0x6007, 0x0035, -+ 0x6003, 0x0001, 0x7950, 0x6152, 0x080c, 0x6c8d, 0x080c, 0x7173, -+ 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, 0x6c8d, 0x6803, 0x0002, 0x00fe, -+ 0x001e, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x5305, 0x1118, 0xa085, -+ 0x0001, 0x0070, 0x6020, 0xd0f4, 0x1150, 0xc0f5, 0x6022, 0x6010, -+ 0x2078, 0x7828, 0x603a, 0x782c, 0x6036, 0x080c, 0x194d, 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, -+ 0xb7b2, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x6b40, -+ 0x2001, 0xb7b6, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, -+ 0xb7b4, 0x200c, 0x8000, 0x2014, 0x2071, 0xb78e, 0x711a, 0x721e, -+ 0x2001, 0x0064, 0x080c, 0x6b40, 0x2001, 0xb7b7, 0x82ff, 0x1110, -+ 0x2011, 0x0014, 0x2202, 0x2009, 0xb7b8, 0xa280, 0x000a, 0x200a, -+ 0x080c, 0x532a, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, -+ 0x0006, 0x00e6, 0x2001, 0xb7b6, 0x2003, 0x0028, 0x2001, 0xb7b7, -+ 0x2003, 0x0014, 0x2071, 0xb78e, 0x701b, 0x0000, 0x701f, 0x07d0, -+ 0x2001, 0xb7b8, 0x2003, 0x001e, 0x00ee, 0x000e, 0x0005, 0x00d6, -+ 0x6054, 0xa06d, 0x0110, 0x080c, 0x160f, 0x00de, 0x0005, 0x0005, -+ 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c7, 0x001e, -+ 0x0178, 0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -+ 0x0033, 0x080c, 0x864c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0xa006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xb500, 0xa186, -+ 0x0015, 0x1500, 0x7084, 0xa086, 0x0018, 0x11e0, 0x6010, 0x2068, -+ 0x6a3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x7331, 0x01d8, 0x7070, -+ 0x6a50, 0xa206, 0x1160, 0x7074, 0x6a54, 0xa206, 0x1140, 0x6218, -+ 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2ce1, 0x080c, -+ 0x87a0, 0x0020, 0x080c, 0x8c19, 0x080c, 0x861d, 0x00fe, 0x00ee, -+ 0x00de, 0x0005, 0x7054, 0x6a54, 0xa206, 0x0d48, 0x0c80, 0x00c6, -+ 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x85c7, 0x001e, 0x0180, -+ 0x611a, 0x080c, 0xa027, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -+ 0x0043, 0x080c, 0x864c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0xa006, 0x0cd8, 0x00d6, 0x00e6, 0x00f6, 0x2071, 0xb500, 0xa186, -+ 0x0015, 0x11c0, 0x7084, 0xa086, 0x0004, 0x11a0, 0x6010, 0xa0e8, -+ 0x000f, 0x2c78, 0x080c, 0x7331, 0x01a8, 0x7070, 0x6a08, 0xa206, -+ 0x1130, 0x7074, 0x6a0c, 0xa206, 0x1110, 0x080c, 0x2c9c, 0x080c, -+ 0x87a0, 0x0020, 0x080c, 0x8c19, 0x080c, 0x861d, 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, -+ 0x524a, 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, 0x5408, 0x6013, 0x0000, 0x003e, -+ 0x00de, 0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, 0x0035, 0x0110, -+ 0x6a34, 0x0008, 0x6a28, 0x080c, 0x9c4a, 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, 0x9483, 0x0005, 0x080c, 0x861d, -+ 0x0804, 0x7173, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1515, -+ 0x0013, 0x006e, 0x0005, 0xa16b, 0xa646, 0xa76c, 0xa16b, 0xa16b, -+ 0xa16b, 0xa16b, 0xa16b, 0xa1a3, 0xa7f0, 0xa16b, 0xa16b, 0xa16b, -+ 0xa16b, 0xa16b, 0xa16b, 0x080c, 0x1515, 0x0066, 0x6000, 0xa0b2, -+ 0x0010, 0x1a0c, 0x1515, 0x0013, 0x006e, 0x0005, 0xa186, 0xac77, -+ 0xa186, 0xa186, 0xa186, 0xa186, 0xa186, 0xa186, 0xac39, 0xacbf, -+ 0xa186, 0xb26c, 0xb29c, 0xb26c, 0xb29c, 0xa186, 0x080c, 0x1515, - 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1515, 0x0013, 0x006e, -- 0x0005, 0xa161, 0xa63c, 0xa762, 0xa161, 0xa161, 0xa161, 0xa161, -- 0xa161, 0xa199, 0xa7e6, 0xa161, 0xa161, 0xa161, 0xa161, 0xa161, -- 0xa161, 0x080c, 0x1515, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, -- 0x1515, 0x0013, 0x006e, 0x0005, 0xa17c, 0xac6b, 0xa17c, 0xa17c, -- 0xa17c, 0xa17c, 0xa17c, 0xa17c, 0xac2f, 0xacb3, 0xa17c, 0xb260, -- 0xb290, 0xb260, 0xb290, 0xa17c, 0x080c, 0x1515, 0x0066, 0x6000, -- 0xa0b2, 0x0010, 0x1a0c, 0x1515, 0x0013, 0x006e, 0x0005, 0xa197, -- 0xa936, 0xaa03, 0xaa30, 0xaab4, 0xa197, 0xaba1, 0xab4c, 0xa7f2, -- 0xac05, 0xac1a, 0xa197, 0xa197, 0xa197, 0xa197, 0xa197, 0x080c, -- 0x1515, 0xa1b2, 0x0080, 0x1a0c, 0x1515, 0x2100, 0xa1b2, 0x0040, -- 0x1a04, 0xa5b0, 0x0002, 0xa1e3, 0xa3ae, 0xa1e3, 0xa1e3, 0xa1e3, -- 0xa3b5, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, -- 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, -- 0xa1e3, 0xa1e3, 0xa1e5, 0xa243, 0xa252, 0xa2a0, 0xa2be, 0xa33c, -- 0xa39b, 0xa1e3, 0xa1e3, 0xa3b8, 0xa1e3, 0xa1e3, 0xa3cb, 0xa3d6, -- 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, 0xa461, 0xa1e3, 0xa1e3, -- 0xa474, 0xa1e3, 0xa1e3, 0xa42c, 0xa1e3, 0xa1e3, 0xa1e3, 0xa48c, -- 0xa1e3, 0xa1e3, 0xa1e3, 0xa506, 0xa1e3, 0xa1e3, 0xa1e3, 0xa1e3, -- 0xa1e3, 0xa1e3, 0xa577, 0x080c, 0x1515, 0x080c, 0x530a, 0x1150, -- 0x2001, 0xb535, 0x2004, 0xd0cc, 0x1128, 0xa084, 0x0009, 0xa086, -- 0x0008, 0x1140, 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, -- 0x0804, 0xa3a9, 0x080c, 0x52fa, 0x00e6, 0x00c6, 0x0036, 0x0026, -- 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, -- 0x6df6, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d03, 0x2c08, 0x080c, -- 0xae76, 0x007e, 0x001e, 0x2e60, 0x080c, 0x51ab, 0x001e, 0x002e, -- 0x003e, 0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, 0x080c, 0x4fb9, -- 0x00ce, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, -- 0x0278, 0x080c, 0xadba, 0x1904, 0xa29a, 0x080c, 0xad5a, 0x1120, -- 0x6007, 0x0008, 0x0804, 0xa3a9, 0x6007, 0x0009, 0x0804, 0xa3a9, -- 0x080c, 0xaf6f, 0x0128, 0x080c, 0xadba, 0x0d78, 0x0804, 0xa29a, -- 0x6013, 0x1900, 0x0c88, 0x080c, 0x2dbf, 0x1904, 0xa5ad, 0x6106, -- 0x080c, 0xad14, 0x6007, 0x0006, 0x0804, 0xa3a9, 0x6007, 0x0007, -- 0x0804, 0xa3a9, 0x080c, 0xb2c4, 0x1904, 0xa5ad, 0x080c, 0x2dbf, -- 0x1904, 0xa5ad, 0x00d6, 0x6618, 0x2668, 0x6e04, 0xa684, 0x00ff, -- 0xa082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, 0x4eec, 0xa6b4, -- 0xff00, 0x8637, 0xa686, 0x0006, 0x0188, 0xa686, 0x0004, 0x0170, -- 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0140, 0xa686, 0x0004, -- 0x0128, 0xa686, 0x0005, 0x0110, 0x00de, 0x00e0, 0x080c, 0xae18, -- 0x11a0, 0xa686, 0x0006, 0x1150, 0x0026, 0x6218, 0xa290, 0x0028, -- 0x2214, 0x2009, 0x0000, 0x080c, 0x2ce1, 0x002e, 0x080c, 0x504c, -- 0x6007, 0x000a, 0x00de, 0x0804, 0xa3a9, 0x6007, 0x000b, 0x00de, -- 0x0804, 0xa3a9, 0x080c, 0x2c9c, 0x6007, 0x0001, 0x0804, 0xa3a9, -- 0x080c, 0xb2c4, 0x1904, 0xa5ad, 0x080c, 0x2dbf, 0x1904, 0xa5ad, -- 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707, 0x0d50, -- 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, -- 0x2ce1, 0x002e, 0x6007, 0x000c, 0x0804, 0xa3a9, 0x080c, 0x530a, -+ 0x0005, 0xa1a1, 0xa940, 0xaa0d, 0xaa3a, 0xaabe, 0xa1a1, 0xabab, -+ 0xab56, 0xa7fc, 0xac0f, 0xac24, 0xa1a1, 0xa1a1, 0xa1a1, 0xa1a1, -+ 0xa1a1, 0x080c, 0x1515, 0xa1b2, 0x0080, 0x1a0c, 0x1515, 0x2100, -+ 0xa1b2, 0x0040, 0x1a04, 0xa5ba, 0x0002, 0xa1ed, 0xa3b8, 0xa1ed, -+ 0xa1ed, 0xa1ed, 0xa3bf, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, -+ 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, -+ 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ef, 0xa24d, 0xa25c, 0xa2aa, -+ 0xa2c8, 0xa346, 0xa3a5, 0xa1ed, 0xa1ed, 0xa3c2, 0xa1ed, 0xa1ed, -+ 0xa3d5, 0xa3e0, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa46b, -+ 0xa1ed, 0xa1ed, 0xa47e, 0xa1ed, 0xa1ed, 0xa436, 0xa1ed, 0xa1ed, -+ 0xa1ed, 0xa496, 0xa1ed, 0xa1ed, 0xa1ed, 0xa510, 0xa1ed, 0xa1ed, -+ 0xa1ed, 0xa1ed, 0xa1ed, 0xa1ed, 0xa581, 0x080c, 0x1515, 0x080c, -+ 0x5309, 0x1150, 0x2001, 0xb535, 0x2004, 0xd0cc, 0x1128, 0xa084, -+ 0x0009, 0xa086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602b, 0x0009, -+ 0x6013, 0x0000, 0x0804, 0xa3b3, 0x080c, 0x52f9, 0x00e6, 0x00c6, -+ 0x0036, 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, -+ 0x0029, 0x080c, 0x6df5, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d02, -+ 0x2c08, 0x080c, 0xae82, 0x007e, 0x001e, 0x2e60, 0x080c, 0x51aa, -+ 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, -+ 0x080c, 0x4fb8, 0x00ce, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, -+ 0xa082, 0x0006, 0x0278, 0x080c, 0xadc6, 0x1904, 0xa2a4, 0x080c, -+ 0xad66, 0x1120, 0x6007, 0x0008, 0x0804, 0xa3b3, 0x6007, 0x0009, -+ 0x0804, 0xa3b3, 0x080c, 0xaf7b, 0x0128, 0x080c, 0xadc6, 0x0d78, -+ 0x0804, 0xa2a4, 0x6013, 0x1900, 0x0c88, 0x080c, 0x2dbf, 0x1904, -+ 0xa5b7, 0x6106, 0x080c, 0xad20, 0x6007, 0x0006, 0x0804, 0xa3b3, -+ 0x6007, 0x0007, 0x0804, 0xa3b3, 0x080c, 0xb2d0, 0x1904, 0xa5b7, -+ 0x080c, 0x2dbf, 0x1904, 0xa5b7, 0x00d6, 0x6618, 0x2668, 0x6e04, -+ 0xa684, 0x00ff, 0xa082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, -+ 0x4eeb, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0188, 0xa686, -+ 0x0004, 0x0170, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0140, -+ 0xa686, 0x0004, 0x0128, 0xa686, 0x0005, 0x0110, 0x00de, 0x00e0, -+ 0x080c, 0xae24, 0x11a0, 0xa686, 0x0006, 0x1150, 0x0026, 0x6218, -+ 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2ce1, 0x002e, -+ 0x080c, 0x504b, 0x6007, 0x000a, 0x00de, 0x0804, 0xa3b3, 0x6007, -+ 0x000b, 0x00de, 0x0804, 0xa3b3, 0x080c, 0x2c9c, 0x6007, 0x0001, -+ 0x0804, 0xa3b3, 0x080c, 0xb2d0, 0x1904, 0xa5b7, 0x080c, 0x2dbf, -+ 0x1904, 0xa5b7, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, -+ 0x0707, 0x0d50, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, -+ 0x0000, 0x080c, 0x2ce1, 0x002e, 0x6007, 0x000c, 0x0804, 0xa3b3, -+ 0x080c, 0x5309, 0x1140, 0x2001, 0xb535, 0x2004, 0xa084, 0x0009, -+ 0xa086, 0x0008, 0x1110, 0x0804, 0xa1fc, 0x080c, 0x52f9, 0x6618, -+ 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, -+ 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x4f2a, 0x002e, 0x0050, -+ 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, -+ 0x1904, 0xa2a4, 0x080c, 0xae31, 0x1120, 0x6007, 0x000e, 0x0804, -+ 0xa3b3, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, -+ 0x8427, 0x0046, 0x080c, 0x2c9c, 0x004e, 0x0016, 0xa006, 0x2009, -+ 0xb553, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xb0e8, -+ 0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, -+ 0x004e, 0x6007, 0x0001, 0x0804, 0xa3b3, 0x2001, 0x0001, 0x080c, -+ 0x4eeb, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, -+ 0xb505, 0x2011, 0xbb90, 0x080c, 0x90da, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0xa005, 0x0168, 0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, -+ 0x0a04, 0xa2a4, 0xa682, 0x0007, 0x0a04, 0xa2f2, 0x0804, 0xa2a4, -+ 0x6013, 0x1900, 0x6007, 0x0009, 0x0804, 0xa3b3, 0x080c, 0x5309, - 0x1140, 0x2001, 0xb535, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, -- 0x1110, 0x0804, 0xa1f2, 0x080c, 0x52fa, 0x6618, 0xa6b0, 0x0001, -- 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, 0x1138, 0x0026, -- 0x2001, 0x0006, 0x080c, 0x4f2b, 0x002e, 0x0050, 0xa6b4, 0xff00, -- 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xa29a, -- 0x080c, 0xae25, 0x1120, 0x6007, 0x000e, 0x0804, 0xa3a9, 0x0046, -- 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046, -- 0x080c, 0x2c9c, 0x004e, 0x0016, 0xa006, 0x2009, 0xb553, 0x210c, -- 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xb0dc, 0x6018, 0x00d6, -- 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007, -- 0x0001, 0x0804, 0xa3a9, 0x2001, 0x0001, 0x080c, 0x4eec, 0x0156, -+ 0x1110, 0x0804, 0xa1fc, 0x080c, 0x52f9, 0x6618, 0xa6b0, 0x0001, -+ 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06b8, 0xa6b4, 0xff00, -+ 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xa2a4, -+ 0x080c, 0xae59, 0x1138, 0x080c, 0xad66, 0x1120, 0x6007, 0x0010, -+ 0x0804, 0xa3b3, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, -+ 0x00ff, 0x8427, 0x0046, 0x080c, 0x2c9c, 0x004e, 0x0016, 0xa006, -+ 0x2009, 0xb553, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, -+ 0xb0e8, 0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, -+ 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xaf7b, 0x0140, -+ 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0950, 0x0804, 0xa2a4, -+ 0x6013, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2dbf, 0x1904, -+ 0xa5b7, 0x080c, 0xb2d0, 0x1904, 0xa5b7, 0x080c, 0xa5df, 0x1904, -+ 0xa2a4, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x6cd3, 0x0005, -+ 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x6cd3, 0x0cc0, 0x6007, -+ 0x0005, 0x0cc0, 0x080c, 0xb2d0, 0x1904, 0xa5b7, 0x080c, 0x2dbf, -+ 0x1904, 0xa5b7, 0x080c, 0xa5df, 0x1904, 0xa2a4, 0x6007, 0x0020, -+ 0x6003, 0x0001, 0x080c, 0x6cd3, 0x0005, 0x080c, 0x2dbf, 0x1904, -+ 0xa5b7, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x6cd3, 0x0005, -+ 0x080c, 0xb2d0, 0x1904, 0xa5b7, 0x080c, 0x2dbf, 0x1904, 0xa5b7, -+ 0x080c, 0xa5df, 0x1904, 0xa2a4, 0x0016, 0x0026, 0x2011, 0xbb91, -+ 0x2214, 0xa286, 0xffff, 0x0190, 0x2c08, 0x080c, 0x9c4a, 0x01e0, -+ 0x2260, 0x2011, 0xbb90, 0x2214, 0x6008, 0xa206, 0x11a8, 0x6018, -+ 0xa190, 0x0006, 0x2214, 0xa206, 0x01e8, 0x0070, 0x2011, 0xbb90, -+ 0x2214, 0x2c08, 0xa006, 0x080c, 0xb0ba, 0x11a0, 0x2011, 0xbb91, -+ 0x2214, 0xa286, 0xffff, 0x01c0, 0x2160, 0x6007, 0x0026, 0x6013, -+ 0x1700, 0x2011, 0xbb89, 0x2214, 0xa296, 0xffff, 0x1180, 0x6007, -+ 0x0025, 0x0068, 0x601c, 0xa086, 0x0007, 0x1d70, 0x6004, 0xa086, -+ 0x0024, 0x1110, 0x080c, 0x861d, 0x2160, 0x6007, 0x0025, 0x6003, -+ 0x0001, 0x080c, 0x6cd3, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, -+ 0x080c, 0x4eeb, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, -+ 0x2019, 0xb505, 0x2011, 0xbb96, 0x080c, 0x90da, 0x003e, 0x002e, -+ 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xa3b3, 0x080c, -+ 0x8df6, 0x080c, 0x5acf, 0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, -+ 0x5aeb, 0x1158, 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, -+ 0x2003, 0x0001, 0x080c, 0x5a07, 0x0010, 0x080c, 0x5aa6, 0x003e, -+ 0x002e, 0x000e, 0x0005, 0x080c, 0x2dbf, 0x1904, 0xa5b7, 0x080c, -+ 0xa5df, 0x1904, 0xa2a4, 0x6106, 0x080c, 0xa5fb, 0x6007, 0x002b, -+ 0x0804, 0xa3b3, 0x6007, 0x002c, 0x0804, 0xa3b3, 0x080c, 0xb2d0, -+ 0x1904, 0xa5b7, 0x080c, 0x2dbf, 0x1904, 0xa5b7, 0x080c, 0xa5df, -+ 0x1904, 0xa2a4, 0x6106, 0x080c, 0xa5ff, 0x1120, 0x6007, 0x002e, -+ 0x0804, 0xa3b3, 0x6007, 0x002f, 0x0804, 0xa3b3, 0x080c, 0x2dbf, -+ 0x1904, 0xa5b7, 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080, 0x0001, -+ 0x200c, 0xa184, 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184, 0xff00, -+ 0x8007, 0xa086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, -+ 0xa3b8, 0x2001, 0xb572, 0x2004, 0xd0e4, 0x0904, 0xa50d, 0x2071, -+ 0xbb8c, 0x7010, 0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, -+ 0xb553, 0x2004, 0xd0a4, 0x0140, 0x6018, 0x2068, 0x6810, 0xa106, -+ 0x1118, 0x6814, 0xa206, 0x01f8, 0x2001, 0xb553, 0x2004, 0xd0ac, -+ 0x1590, 0x2069, 0xb500, 0x6874, 0xa206, 0x1568, 0x6870, 0xa106, -+ 0x1550, 0x7210, 0x080c, 0x9c4a, 0x0558, 0x080c, 0xb154, 0x0540, -+ 0x622a, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x6c8d, 0x00ce, -+ 0x00de, 0x00ee, 0x0005, 0x7214, 0xa286, 0xffff, 0x0150, 0x080c, -+ 0x9c4a, 0x01b0, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x1180, -+ 0x0c08, 0x7210, 0x2c08, 0xa085, 0x0001, 0x080c, 0xb0ba, 0x2c10, -+ 0x2160, 0x0130, 0x08b8, 0x6007, 0x0037, 0x6013, 0x1500, 0x08d8, -+ 0x6007, 0x0037, 0x6013, 0x1700, 0x08b0, 0x6007, 0x0012, 0x0898, -+ 0x080c, 0x2dbf, 0x1904, 0xa5b7, 0x6018, 0xa080, 0x0001, 0x2004, -+ 0xa084, 0xff00, 0x8007, 0xa086, 0x0006, 0x1904, 0xa3b8, 0x00e6, -+ 0x00d6, 0x00c6, 0x2001, 0xb572, 0x2004, 0xd0e4, 0x0904, 0xa579, -+ 0x2069, 0xb500, 0x2071, 0xbb8c, 0x7008, 0x6036, 0x720c, 0x623a, -+ 0xa286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0xa085, 0x0001, -+ 0x080c, 0xb0ba, 0x2c10, 0x00ce, 0x0588, 0x080c, 0x9c4a, 0x0570, -+ 0x00c6, 0x0026, 0x2260, 0x080c, 0x991d, 0x002e, 0x00ce, 0x7118, -+ 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0158, 0xa186, 0x0005, -+ 0x0118, 0xa186, 0x0007, 0x1178, 0xa280, 0x0004, 0x2004, 0xa005, -+ 0x0150, 0x0056, 0x7510, 0x7614, 0x080c, 0xb16b, 0x005e, 0x00ce, -+ 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, -+ 0x2a00, 0x6003, 0x0001, 0x080c, 0x6c8d, 0x0c88, 0x6007, 0x003b, -+ 0x602b, 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x080c, 0x6c8d, -+ 0x0c30, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0804, -+ 0xa4e3, 0x00e6, 0x0026, 0x080c, 0x5309, 0x0558, 0x080c, 0x52f9, -+ 0x080c, 0xb34b, 0x1520, 0x2071, 0xb500, 0x70d4, 0xc085, 0x70d6, -+ 0x00f6, 0x2079, 0x0100, 0x72a0, 0xa284, 0x00ff, 0x7072, 0x78e6, -+ 0xa284, 0xff00, 0x7274, 0xa205, 0x7076, 0x78ea, 0x00fe, 0x70df, -+ 0x0000, 0x2001, 0xb553, 0x2004, 0xd0a4, 0x0120, 0x2011, 0xb7f9, -+ 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2ab8, 0x0010, 0x080c, -+ 0xb377, 0x002e, 0x00ee, 0x080c, 0x861d, 0x0804, 0xa3b7, 0x080c, -+ 0x861d, 0x0005, 0x2600, 0x0002, 0xa5c5, 0xa5c5, 0xa5c5, 0xa5c5, -+ 0xa5c5, 0xa5c7, 0xa5c5, 0xa5c5, 0xa5c5, 0x080c, 0x1515, 0x080c, -+ 0xb2d0, 0x1d68, 0x080c, 0x2dbf, 0x1d50, 0x0089, 0x1138, 0x6007, -+ 0x0045, 0x6003, 0x0001, 0x080c, 0x6cd3, 0x0005, 0x080c, 0x2c9c, -+ 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x6cd3, 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, -+ 0x281d, 0x1130, 0x2110, 0x2009, 0x0000, 0x080c, 0x2ce1, 0x0018, -+ 0xa085, 0x0001, 0x0008, 0xa006, 0x00de, 0x0005, 0x2069, 0xbb8d, -+ 0x6800, 0xa082, 0x0010, 0x1228, 0x6013, 0x0000, 0xa085, 0x0001, -+ 0x0008, 0xa006, 0x0005, 0x6013, 0x0000, 0x2069, 0xbb8c, 0x6808, -+ 0xa084, 0xff00, 0xa086, 0x0800, 0x1140, 0x6800, 0xa084, 0x00ff, -+ 0xa08e, 0x0014, 0x0110, 0xa08e, 0x0010, 0x0005, 0x6004, 0xa0b2, -+ 0x0080, 0x1a0c, 0x1515, 0xa1b6, 0x0013, 0x1130, 0x2008, 0xa1b2, -+ 0x0040, 0x1a04, 0xa746, 0x0092, 0xa1b6, 0x0027, 0x0120, 0xa1b6, -+ 0x0014, 0x190c, 0x1515, 0x2001, 0x0007, 0x080c, 0x4f2a, 0x080c, -+ 0x7090, 0x080c, 0x9e1d, 0x080c, 0x7173, 0x0005, 0xa6a6, 0xa6a8, -+ 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a8, 0xa6ba, 0xa73f, 0xa70a, 0xa73f, -+ 0xa71b, 0xa73f, 0xa6ba, 0xa73f, 0xa737, 0xa73f, 0xa737, 0xa73f, -+ 0xa73f, 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a6, -+ 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a8, 0xa6a6, 0xa73f, 0xa6a6, -+ 0xa6a6, 0xa73f, 0xa6a6, 0xa73c, 0xa73f, 0xa6a6, 0xa6a6, 0xa6a6, -+ 0xa6a6, 0xa73f, 0xa73f, 0xa6a6, 0xa73f, 0xa73f, 0xa6a6, 0xa6b4, -+ 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a6, 0xa73b, 0xa73f, 0xa6a6, 0xa6a6, -+ 0xa73f, 0xa73f, 0xa6a6, 0xa6a6, 0xa6a6, 0xa6a6, 0x080c, 0x1515, -+ 0x080c, 0x7090, 0x2001, 0xb7b6, 0x2004, 0x6016, 0x6003, 0x0002, -+ 0x080c, 0x7173, 0x0804, 0xa745, 0x2001, 0x0000, 0x080c, 0x4eeb, -+ 0x0804, 0xa73f, 0x00f6, 0x2079, 0xb552, 0x7804, 0x00fe, 0xd0ac, -+ 0x1904, 0xa73f, 0x2001, 0x0000, 0x080c, 0x4eeb, 0x6018, 0xa080, -+ 0x0004, 0x2004, 0xa086, 0x00ff, 0x1140, 0x00f6, 0x2079, 0xb500, -+ 0x7898, 0x8000, 0x789a, 0x00fe, 0x00e0, 0x00c6, 0x6018, 0x2060, -+ 0x6000, 0xd0f4, 0x1140, 0x6010, 0xa005, 0x0128, 0x00ce, 0x080c, -+ 0x3f3e, 0x0804, 0xa73f, 0x00ce, 0x2001, 0xb500, 0x2004, 0xa086, -+ 0x0002, 0x1138, 0x00f6, 0x2079, 0xb500, 0x7898, 0x8000, 0x789a, -+ 0x00fe, 0x2001, 0x0002, 0x080c, 0x4efd, 0x080c, 0x7090, 0x601f, -+ 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6cd3, 0x080c, -+ 0x7173, 0x00c6, 0x6118, 0x2160, 0x2009, 0x0001, 0x080c, 0x69a8, -+ 0x00ce, 0x04d8, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa6b4, -+ 0xff00, 0x8637, 0xa686, 0x0006, 0x0550, 0xa686, 0x0004, 0x0538, -+ 0x2001, 0x0004, 0x0410, 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, -+ 0x1110, 0x080c, 0x3f3e, 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, 0x4f2a, 0x080c, -+ 0x7090, 0x080c, 0x861d, 0x080c, 0x7173, 0x0005, 0x2600, 0x0002, -+ 0xa751, 0xa751, 0xa751, 0xa751, 0xa751, 0xa753, 0xa751, 0xa751, -+ 0xa751, 0x080c, 0x1515, 0x080c, 0x7090, 0x080c, 0x861d, 0x080c, -+ 0x7173, 0x0005, 0x0016, 0x00d6, 0x6118, 0x2168, 0x6900, 0xd184, -+ 0x0140, 0x080c, 0x4efd, 0x2001, 0x0000, 0x080c, 0x4eeb, 0x080c, -+ 0x2cc2, 0x00de, 0x001e, 0x0005, 0x00d6, 0x6618, 0x2668, 0x6804, -+ 0xa084, 0xff00, 0x8007, 0x00de, 0xa0b2, 0x000c, 0x1a0c, 0x1515, -+ 0xa1b6, 0x0015, 0x1110, 0x003b, 0x0028, 0xa1b6, 0x0016, 0x190c, -+ 0x1515, 0x006b, 0x0005, 0x8cdf, 0x8cdf, 0x8cdf, 0x8cdf, 0x8cdf, -+ 0x8cdf, 0xa7dc, 0xa79b, 0x8cdf, 0x8cdf, 0x8cdf, 0x8cdf, 0x8cdf, -+ 0x8cdf, 0x8cdf, 0x8cdf, 0x8cdf, 0x8cdf, 0xa7dc, 0xa7e3, 0x8cdf, -+ 0x8cdf, 0x8cdf, 0x8cdf, 0x00f6, 0x2079, 0xb552, 0x7804, 0xd0ac, -+ 0x11e0, 0x6018, 0xa07d, 0x01c8, 0x7800, 0xd0f4, 0x1118, 0x7810, -+ 0xa005, 0x1198, 0x2001, 0x0000, 0x080c, 0x4eeb, 0x2001, 0x0002, -+ 0x080c, 0x4efd, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, -+ 0x080c, 0x6cd3, 0x080c, 0x7173, 0x00e8, 0x2011, 0xbb83, 0x2204, -+ 0x8211, 0x220c, 0x080c, 0x281d, 0x11a8, 0x00c6, 0x080c, 0x4fa9, -+ 0x0120, 0x00ce, 0x080c, 0x861d, 0x0068, 0x6010, 0x0006, 0x6014, -+ 0x0006, 0x080c, 0x4c0b, 0x000e, 0x6016, 0x000e, 0x6012, 0x00ce, -+ 0x080c, 0x861d, 0x00fe, 0x0005, 0x6604, 0xa6b6, 0x001e, 0x1110, -+ 0x080c, 0x861d, 0x0005, 0x080c, 0x8f95, 0x1138, 0x6003, 0x0001, -+ 0x6007, 0x0001, 0x080c, 0x6cd3, 0x0010, 0x080c, 0x861d, 0x0005, -+ 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1515, 0x080c, 0x7090, 0x080c, -+ 0x9e1d, 0x080c, 0x7173, 0x0005, 0xa182, 0x0040, 0x0002, 0xa812, -+ 0xa812, 0xa812, 0xa812, 0xa814, 0xa812, 0xa812, 0xa812, 0xa812, -+ 0xa812, 0xa812, 0xa812, 0xa812, 0xa812, 0xa812, 0xa812, 0xa812, -+ 0xa812, 0xa812, 0x080c, 0x1515, 0x00d6, 0x00e6, 0x00f6, 0x0156, -+ 0x0046, 0x0026, 0x6218, 0xa280, 0x002b, 0x2004, 0xa005, 0x0120, -+ 0x2021, 0x0000, 0x080c, 0xb31c, 0x6106, 0x2071, 0xbb80, 0x7444, -+ 0xa4a4, 0xff00, 0x0904, 0xa878, 0xa486, 0x2000, 0x1130, 0x2009, -+ 0x0001, 0x2011, 0x0200, 0x080c, 0x6b1a, 0x080c, 0x15f8, 0x090c, -+ 0x1515, 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, -+ 0x5408, 0x001e, 0xa486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, -+ 0xb065, 0x0804, 0xa8d5, 0xa486, 0x0400, 0x1130, 0x2019, 0x0002, -+ 0x080c, 0xb017, 0x0804, 0xa8d5, 0xa486, 0x0200, 0x1110, 0x080c, -+ 0xaffc, 0xa486, 0x1000, 0x1110, 0x080c, 0xb04a, 0x0804, 0xa8d5, -+ 0x2069, 0xb874, 0x6a00, 0xd284, 0x0904, 0xa93c, 0xa284, 0x0300, -+ 0x1904, 0xa935, 0x6804, 0xa005, 0x0904, 0xa91d, 0x2d78, 0x6003, -+ 0x0007, 0x080c, 0x15df, 0x0904, 0xa8dc, 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, 0xbb90, 0xad90, 0x0015, 0x200c, -+ 0x810f, 0x2112, 0x8000, 0x8210, 0x1f04, 0xa8c7, 0x200c, 0x6982, -+ 0x8000, 0x200c, 0x697e, 0x080c, 0x5408, 0x002e, 0x004e, 0x015e, -+ 0x00fe, 0x00ee, 0x00de, 0x0005, 0x2001, 0xb50e, 0x2004, 0xd084, -+ 0x0120, 0x080c, 0x15f8, 0x1904, 0xa88d, 0x6013, 0x0100, 0x6003, -+ 0x0001, 0x6007, 0x0041, 0x080c, 0x6c8d, 0x080c, 0x7173, 0x0c28, -+ 0x2069, 0xbb92, 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200, 0x11a8, -+ 0x2069, 0xbb80, 0x686c, 0xa084, 0x00ff, 0x0016, 0x6110, 0xa18c, -+ 0x0700, 0xa10d, 0x6112, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, -+ 0x080c, 0x6c8d, 0x080c, 0x7173, 0x0840, 0x6868, 0x602a, 0x686c, -+ 0x602e, 0x6013, 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, -+ 0x6c8d, 0x080c, 0x7173, 0x0804, 0xa8d5, 0x2001, 0xb50d, 0x2004, -+ 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x3ecc, 0x6013, 0x0300, -+ 0x0010, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, -+ 0x6c8d, 0x080c, 0x7173, 0x0804, 0xa8d5, 0x6013, 0x0500, 0x0c98, -+ 0x6013, 0x0600, 0x0804, 0xa8f0, 0x6013, 0x0200, 0x0804, 0xa8f0, -+ 0xa186, 0x0013, 0x1170, 0x6004, 0xa08a, 0x0040, 0x0a0c, 0x1515, -+ 0xa08a, 0x0053, 0x1a0c, 0x1515, 0xa082, 0x0040, 0x2008, 0x0804, -+ 0xa9ca, 0xa186, 0x0051, 0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, -+ 0xa086, 0x0041, 0x0518, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, -+ 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x6b74, -+ 0x002e, 0x001e, 0x000e, 0x012e, 0x6000, 0xa086, 0x0002, 0x1170, -+ 0x0804, 0xaa0d, 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, -+ 0x1515, 0x6004, 0xa082, 0x0040, 0x2008, 0x001a, 0x080c, 0x8663, -+ 0x0005, 0xa994, 0xa996, 0xa996, 0xa9ba, 0xa994, 0xa994, 0xa994, -+ 0xa994, 0xa994, 0xa994, 0xa994, 0xa994, 0xa994, 0xa994, 0xa994, -+ 0xa994, 0xa994, 0xa994, 0xa994, 0x080c, 0x1515, 0x080c, 0x7090, -+ 0x080c, 0x7173, 0x0036, 0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, -+ 0xf000, 0x01a8, 0x6003, 0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, -+ 0x2019, 0x0004, 0x080c, 0xb099, 0x6013, 0x0000, 0x6014, 0xa005, -+ 0x1120, 0x2001, 0xb7b7, 0x2004, 0x6016, 0x6003, 0x0007, 0x00de, -+ 0x003e, 0x0005, 0x00d6, 0x080c, 0x7090, 0x080c, 0x7173, 0x080c, -+ 0x9c5a, 0x0120, 0x6010, 0x2068, 0x080c, 0x160f, 0x080c, 0x9e1d, -+ 0x00de, 0x0005, 0x0002, 0xa9de, 0xa9fb, 0xa9e7, 0xaa07, 0xa9de, -+ 0xa9de, 0xa9de, 0xa9de, 0xa9de, 0xa9de, 0xa9de, 0xa9de, 0xa9de, -+ 0xa9de, 0xa9de, 0xa9de, 0xa9de, 0xa9de, 0xa9de, 0x080c, 0x1515, -+ 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x080c, -+ 0x7090, 0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, -+ 0x0007, 0x2009, 0x0043, 0x080c, 0x864c, 0x0010, 0x6003, 0x0002, -+ 0x080c, 0x7173, 0x0005, 0x080c, 0x7090, 0x080c, 0xb2d7, 0x1120, -+ 0x080c, 0x6aef, 0x080c, 0x861d, 0x080c, 0x7173, 0x0005, 0x080c, -+ 0x7090, 0x2009, 0x0041, 0x0804, 0xab56, 0xa182, 0x0040, 0x0002, -+ 0xaa23, 0xaa25, 0xaa23, 0xaa23, 0xaa23, 0xaa23, 0xaa23, 0xaa26, -+ 0xaa23, 0xaa23, 0xaa23, 0xaa23, 0xaa23, 0xaa23, 0xaa23, 0xaa23, -+ 0xaa23, 0xaa31, 0xaa23, 0x080c, 0x1515, 0x0005, 0x6003, 0x0004, -+ 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x185e, -+ 0x0005, 0x00d6, 0x080c, 0x6aef, 0x00de, 0x080c, 0xb33a, 0x080c, -+ 0x861d, 0x0005, 0xa182, 0x0040, 0x0002, 0xaa50, 0xaa50, 0xaa50, -+ 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa52, 0xaa50, 0xaa55, 0xaa8e, -+ 0xaa50, 0xaa50, 0xaa50, 0xaa50, 0xaa8e, 0xaa50, 0xaa50, 0xaa50, -+ 0x080c, 0x1515, 0x080c, 0x8663, 0x0005, 0x2001, 0xb572, 0x2004, -+ 0xd0e4, 0x0158, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x0228, -+ 0x2001, 0x011f, 0x2004, 0x6036, 0x0010, 0x6037, 0x0000, 0x080c, -+ 0x7126, 0x080c, 0x7230, 0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, -+ 0x0150, 0xa08c, 0x0003, 0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, -+ 0x00de, 0x0804, 0xab56, 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, -+ 0x6aef, 0x00de, 0x0005, 0x080c, 0xb2d7, 0x0110, 0x00de, 0x0005, -+ 0x080c, 0x6aef, 0x080c, 0x861d, 0x00de, 0x0ca0, 0x0036, 0x080c, -+ 0x7126, 0x080c, 0x7230, 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, 0xb099, 0x6014, -+ 0xa005, 0x1128, 0x2001, 0xb7b7, 0x2004, 0x8003, 0x6016, 0x6013, -+ 0x0000, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, 0xa186, 0x0013, -+ 0x1150, 0x6004, 0xa086, 0x0042, 0x190c, 0x1515, 0x080c, 0x7090, -+ 0x080c, 0x7173, 0x0005, 0xa186, 0x0027, 0x0118, 0xa186, 0x0014, -+ 0x1180, 0x6004, 0xa086, 0x0042, 0x190c, 0x1515, 0x2001, 0x0007, -+ 0x080c, 0x4f2a, 0x080c, 0x7090, 0x080c, 0x9e1d, 0x080c, 0x7173, -+ 0x0005, 0xa182, 0x0040, 0x0002, 0xaaf7, 0xaaf7, 0xaaf7, 0xaaf7, -+ 0xaaf7, 0xaaf7, 0xaaf7, 0xaaf9, 0xab05, 0xaaf7, 0xaaf7, 0xaaf7, -+ 0xaaf7, 0xaaf7, 0xaaf7, 0xaaf7, 0xaaf7, 0xaaf7, 0xaaf7, 0x080c, -+ 0x1515, 0x0036, 0x0046, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, -+ 0x080c, 0x185e, 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, 0x6aef, 0x00de, 0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, -+ 0x5305, 0x00fe, 0x000e, 0x0120, 0x6003, 0x0002, 0x00de, 0x0005, -+ 0x2009, 0xb50d, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, -+ 0x6003, 0x0006, 0x0021, 0x080c, 0x6af1, 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, -+ 0x1515, 0x6020, 0xd0dc, 0x090c, 0x1515, 0x0005, 0xab79, 0xab80, -+ 0xab8c, 0xab98, 0xab79, 0xab79, 0xab79, 0xaba7, 0xab79, 0xab7b, -+ 0xab7b, 0xab79, 0xab79, 0xab79, 0xab79, 0xab7b, 0xab79, 0xab7b, -+ 0xab79, 0x080c, 0x1515, 0x6020, 0xd0dc, 0x090c, 0x1515, 0x0005, -+ 0x6003, 0x0001, 0x6106, 0x080c, 0x6c8d, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x7173, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, -+ 0x6c8d, 0x0126, 0x2091, 0x8000, 0x080c, 0x7173, 0x012e, 0x0005, -+ 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1fa9, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x6cf0, 0x080c, 0x7230, 0x012e, 0x0005, 0xa016, -+ 0x080c, 0x185e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, -+ 0xa182, 0x0040, 0x0023, 0x00de, 0x003e, 0x012e, 0x0005, 0xabc7, -+ 0xabc9, 0xabdb, 0xabf6, 0xabc7, 0xabc7, 0xabc7, 0xac0b, 0xabc7, -+ 0xabc7, 0xabc7, 0xabc7, 0xabc7, 0xabc7, 0xabc7, 0xabc7, 0x080c, -+ 0x1515, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, -+ 0xa39e, 0x0003, 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c8d, -+ 0x080c, 0x7173, 0x0498, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, -+ 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, -+ 0x080c, 0x6c8d, 0x080c, 0x7173, 0x0408, 0x6013, 0x0000, 0x6017, -+ 0x0000, 0x2019, 0x0004, 0x080c, 0xb099, 0x00c0, 0x6010, 0x2068, -+ 0x684c, 0xd0fc, 0x0d90, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, -+ 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1fa9, 0x080c, 0x6cf0, -+ 0x080c, 0x7230, 0x0018, 0xa016, 0x080c, 0x185e, 0x0005, 0x080c, -+ 0x7090, 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168, 0x080c, 0xb380, -+ 0x0036, 0x2019, 0x0029, 0x080c, 0xb099, 0x003e, 0x00de, 0x080c, -+ 0x9e1d, 0x080c, 0x7173, 0x0005, 0x080c, 0x7126, 0x6110, 0x81ff, -+ 0x0158, 0x00d6, 0x2168, 0x080c, 0xb380, 0x0036, 0x2019, 0x0029, -+ 0x080c, 0xb099, 0x003e, 0x00de, 0x080c, 0x9e1d, 0x080c, 0x7230, -+ 0x0005, 0xa182, 0x0085, 0x0002, 0xac45, 0xac43, 0xac43, 0xac51, -+ 0xac43, 0xac43, 0xac43, 0x080c, 0x1515, 0x6003, 0x000b, 0x6106, -+ 0x080c, 0x6c8d, 0x0126, 0x2091, 0x8000, 0x080c, 0x7173, 0x012e, -+ 0x0005, 0x0026, 0x00e6, 0x080c, 0xb2d0, 0x0118, 0x080c, 0x861d, -+ 0x00d8, 0x2071, 0xbb80, 0x7224, 0x6212, 0x7220, 0x080c, 0xaf47, -+ 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0xa296, -+ 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, 0x6c8d, -+ 0x080c, 0x7173, 0x080c, 0x7230, 0x00ee, 0x002e, 0x0005, 0xa186, -+ 0x0013, 0x1160, 0x6004, 0xa08a, 0x0085, 0x0a0c, 0x1515, 0xa08a, -+ 0x008c, 0x1a0c, 0x1515, 0xa082, 0x0085, 0x00a2, 0xa186, 0x0027, -+ 0x0130, 0xa186, 0x0014, 0x0118, 0x080c, 0x8663, 0x0050, 0x2001, -+ 0x0007, 0x080c, 0x4f2a, 0x080c, 0x7090, 0x080c, 0x9e1d, 0x080c, -+ 0x7173, 0x0005, 0xaca1, 0xaca3, 0xaca3, 0xaca1, 0xaca1, 0xaca1, -+ 0xaca1, 0x080c, 0x1515, 0x080c, 0x7090, 0x080c, 0x9e1d, 0x080c, -+ 0x7173, 0x0005, 0xa182, 0x0085, 0x0a0c, 0x1515, 0xa182, 0x008c, -+ 0x1a0c, 0x1515, 0xa182, 0x0085, 0x0002, 0xacbc, 0xacbc, 0xacbc, -+ 0xacbe, 0xacbc, 0xacbc, 0xacbc, 0x080c, 0x1515, 0x0005, 0xa186, -+ 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, -+ 0x080c, 0x8663, 0x0030, 0x080c, 0x7090, 0x080c, 0x9e1d, 0x080c, -+ 0x7173, 0x0005, 0x0036, 0x080c, 0xb33a, 0x603f, 0x0000, 0x2019, -+ 0x000b, 0x0031, 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, -+ 0x0126, 0x0036, 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x2049, -+ 0x0000, 0x080c, 0x8130, 0x009e, 0x008e, 0x1578, 0x0076, 0x2c38, -+ 0x080c, 0x81d6, 0x007e, 0x1548, 0x6000, 0xa086, 0x0000, 0x0528, -+ 0x601c, 0xa086, 0x0007, 0x0508, 0x00d6, 0x6000, 0xa086, 0x0004, -+ 0x1150, 0x080c, 0xb33a, 0x601f, 0x0007, 0x2001, 0xb7b6, 0x2004, -+ 0x6016, 0x080c, 0x194d, 0x6010, 0x2068, 0x080c, 0x9c5a, 0x0110, -+ 0x080c, 0xb099, 0x00de, 0x6013, 0x0000, 0x080c, 0xb33a, 0x601f, -+ 0x0007, 0x2001, 0xb7b6, 0x2004, 0x6016, 0x003e, 0x012e, 0x0005, -+ 0x00f6, 0x00c6, 0x0036, 0x0156, 0x2079, 0xbb80, 0x7938, 0x783c, -+ 0x080c, 0x281d, 0x15b0, 0x0016, 0x00c6, 0x080c, 0x4fa9, 0x1578, -+ 0x001e, 0x002e, 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x8299, -+ 0x080c, 0x6df5, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d02, 0x007e, -+ 0x001e, 0x0076, 0x2039, 0x0000, 0x080c, 0xae82, 0x007e, 0x080c, -+ 0x51aa, 0x0026, 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, -+ 0x0118, 0xa286, 0x0004, 0x1118, 0x62a0, 0x080c, 0x2d55, 0x002e, -+ 0x001e, 0x080c, 0x4c0b, 0x6612, 0x6516, 0xa006, 0x0010, 0x00ce, -+ 0x001e, 0x015e, 0x003e, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, -+ 0x00e6, 0x0016, 0x2009, 0xb521, 0x2104, 0xa086, 0x0074, 0x1904, -+ 0xadbb, 0x2069, 0xbb8e, 0x690c, 0xa182, 0x0100, 0x06c0, 0x6908, -+ 0xa184, 0x8000, 0x05e8, 0x2001, 0xb79e, 0x2004, 0xa005, 0x1160, -+ 0x6018, 0x2070, 0x7010, 0xa084, 0x00ff, 0x0118, 0x7000, 0xd0f4, -+ 0x0118, 0xa184, 0x0800, 0x0560, 0x6910, 0xa18a, 0x0001, 0x0610, -+ 0x6914, 0x2069, 0xbbae, 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, 0x4fb8, 0x00ce, 0x04c0, 0x2011, 0xbb96, 0xad98, -+ 0x000a, 0x20a9, 0x0004, 0x080c, 0x90da, 0x1580, 0x2011, 0xbb9a, -+ 0xad98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x90da, 0x1538, 0x0046, -+ 0x0016, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xb553, -+ 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xb0e8, 0x6800, -+ 0xc0e5, 0x6802, 0x2019, 0x0029, 0x080c, 0x6df5, 0x0076, 0x2039, -+ 0x0000, 0x080c, 0x6d02, 0x2c08, 0x080c, 0xae82, 0x007e, 0x2001, -+ 0x0007, 0x080c, 0x4f2a, 0x001e, 0x004e, 0xa006, 0x015e, 0x003e, -+ 0x002e, 0x00de, 0x00ce, 0x0005, 0x00d6, 0x2069, 0xbb8e, 0x6800, -+ 0xa086, 0x0800, 0x0118, 0x6013, 0x0000, 0x0008, 0xa006, 0x00de, -+ 0x0005, 0x00c6, 0x00f6, 0x0016, 0x0026, 0x0036, 0x0156, 0x2079, -+ 0xbb8c, 0x7930, 0x7834, 0x080c, 0x281d, 0x11a0, 0x080c, 0x4fa9, -+ 0x1188, 0x2011, 0xbb90, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, -+ 0x90da, 0x1140, 0x2011, 0xbb94, 0xac98, 0x0006, 0x20a9, 0x0004, -+ 0x080c, 0x90da, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce, -+ 0x0005, 0x00c6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, -+ 0xbb83, 0x2204, 0x8211, 0x220c, 0x080c, 0x281d, 0x11a0, 0x080c, -+ 0x4fa9, 0x1188, 0x2011, 0xbb96, 0xac98, 0x000a, 0x20a9, 0x0004, -+ 0x080c, 0x90da, 0x1140, 0x2011, 0xbb9a, 0xac98, 0x0006, 0x20a9, -+ 0x0004, 0x080c, 0x90da, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, -+ 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, -+ 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, 0xb7e9, -+ 0x252c, 0x2021, 0xb7ef, 0x2424, 0x2061, 0xbd00, 0x2071, 0xb500, -+ 0x7648, 0x7068, 0x81ff, 0x0150, 0x0006, 0xa186, 0xb8f4, 0x000e, -+ 0x0128, 0x8001, 0xa602, 0x1a04, 0xaf03, 0x0018, 0xa606, 0x0904, -+ 0xaf03, 0x2100, 0xac06, 0x0904, 0xaefa, 0x080c, 0xb110, 0x0904, -+ 0xaefa, 0x671c, 0xa786, 0x0001, 0x0904, 0xaf1e, 0xa786, 0x0004, -+ 0x0904, 0xaf1e, 0xa786, 0x0007, 0x05e8, 0x2500, 0xac06, 0x05d0, -+ 0x2400, 0xac06, 0x05b8, 0x080c, 0xb120, 0x15a0, 0x88ff, 0x0118, -+ 0x6050, 0xa906, 0x1578, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1120, -+ 0x0016, 0x080c, 0x194d, 0x001e, 0xa786, 0x0008, 0x1148, 0x080c, -+ 0x9e58, 0x1130, 0x080c, 0x8c19, 0x00de, 0x080c, 0x9e1d, 0x00d0, -+ 0x6010, 0x2068, 0x080c, 0x9c5a, 0x0190, 0xa786, 0x0003, 0x1528, -+ 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0xb380, 0x0016, -+ 0x080c, 0x9ecc, 0x080c, 0x5408, 0x001e, 0x080c, 0x9e11, 0x00de, -+ 0x080c, 0x9e1d, 0xace0, 0x0018, 0x2001, 0xb517, 0x2004, 0xac02, -+ 0x1210, 0x0804, 0xae96, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, -+ 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0xa786, 0x0006, 0x1150, -+ 0xa386, 0x0005, 0x0128, 0x080c, 0xb380, 0x080c, 0xb099, 0x08f8, -+ 0x00de, 0x0c00, 0xa786, 0x000a, 0x0968, 0x0850, 0x080c, 0xb120, -+ 0x19c8, 0x81ff, 0x09b8, 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, -+ 0x0130, 0xa180, 0x0001, 0x2004, 0xa086, 0x002d, 0x1958, 0x6000, -+ 0xa086, 0x0002, 0x1938, 0x080c, 0x9e47, 0x0130, 0x080c, 0x9e58, -+ 0x1908, 0x080c, 0x8c19, 0x0038, 0x080c, 0x2cc2, 0x080c, 0x9e58, -+ 0x1110, 0x080c, 0x8c19, 0x080c, 0x9e1d, 0x0804, 0xaefa, 0x00c6, -+ 0x00e6, 0x0016, 0x2c08, 0x2170, 0xa006, 0x080c, 0xb0ba, 0x001e, -+ 0x0120, 0x601c, 0xa084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, -+ 0xaf60, 0xaf60, 0xaf60, 0xaf60, 0xaf60, 0xaf60, 0xaf62, 0xaf60, -+ 0xa006, 0x0005, 0x0046, 0x0016, 0x7018, 0xa080, 0x0028, 0x2024, -+ 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x080c, 0xb0e8, -+ 0x001e, 0x004e, 0x0036, 0x2019, 0x0002, 0x080c, 0xace0, 0x003e, -+ 0xa085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x4eeb, 0x0156, - 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xb505, 0x2011, -- 0xbb90, 0x080c, 0x90d4, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, -- 0x0168, 0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04, 0xa29a, -- 0xa682, 0x0007, 0x0a04, 0xa2e8, 0x0804, 0xa29a, 0x6013, 0x1900, -- 0x6007, 0x0009, 0x0804, 0xa3a9, 0x080c, 0x530a, 0x1140, 0x2001, -- 0xb535, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, 0x0804, -- 0xa1f2, 0x080c, 0x52fa, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, -- 0x00ff, 0xa082, 0x0006, 0x06b8, 0xa6b4, 0xff00, 0x8637, 0xa686, -- 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xa29a, 0x080c, 0xae4d, -- 0x1138, 0x080c, 0xad5a, 0x1120, 0x6007, 0x0010, 0x0804, 0xa3a9, -- 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, -- 0x0046, 0x080c, 0x2c9c, 0x004e, 0x0016, 0xa006, 0x2009, 0xb553, -- 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xb0dc, 0x6018, -- 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, -- 0x6007, 0x0001, 0x00f0, 0x080c, 0xaf6f, 0x0140, 0xa6b4, 0xff00, -- 0x8637, 0xa686, 0x0006, 0x0950, 0x0804, 0xa29a, 0x6013, 0x1900, -- 0x6007, 0x0009, 0x0070, 0x080c, 0x2dbf, 0x1904, 0xa5ad, 0x080c, -- 0xb2c4, 0x1904, 0xa5ad, 0x080c, 0xa5d5, 0x1904, 0xa29a, 0x6007, -- 0x0012, 0x6003, 0x0001, 0x080c, 0x6cd4, 0x0005, 0x6007, 0x0001, -- 0x6003, 0x0001, 0x080c, 0x6cd4, 0x0cc0, 0x6007, 0x0005, 0x0cc0, -- 0x080c, 0xb2c4, 0x1904, 0xa5ad, 0x080c, 0x2dbf, 0x1904, 0xa5ad, -- 0x080c, 0xa5d5, 0x1904, 0xa29a, 0x6007, 0x0020, 0x6003, 0x0001, -- 0x080c, 0x6cd4, 0x0005, 0x080c, 0x2dbf, 0x1904, 0xa5ad, 0x6007, -- 0x0023, 0x6003, 0x0001, 0x080c, 0x6cd4, 0x0005, 0x080c, 0xb2c4, -- 0x1904, 0xa5ad, 0x080c, 0x2dbf, 0x1904, 0xa5ad, 0x080c, 0xa5d5, -- 0x1904, 0xa29a, 0x0016, 0x0026, 0x2011, 0xbb91, 0x2214, 0xa286, -- 0xffff, 0x0190, 0x2c08, 0x080c, 0x9c44, 0x01e0, 0x2260, 0x2011, -- 0xbb90, 0x2214, 0x6008, 0xa206, 0x11a8, 0x6018, 0xa190, 0x0006, -- 0x2214, 0xa206, 0x01e8, 0x0070, 0x2011, 0xbb90, 0x2214, 0x2c08, -- 0xa006, 0x080c, 0xb0ae, 0x11a0, 0x2011, 0xbb91, 0x2214, 0xa286, -- 0xffff, 0x01c0, 0x2160, 0x6007, 0x0026, 0x6013, 0x1700, 0x2011, -- 0xbb89, 0x2214, 0xa296, 0xffff, 0x1180, 0x6007, 0x0025, 0x0068, -- 0x601c, 0xa086, 0x0007, 0x1d70, 0x6004, 0xa086, 0x0024, 0x1110, -- 0x080c, 0x8617, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, -- 0x6cd4, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x4eec, -- 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xb505, -- 0x2011, 0xbb96, 0x080c, 0x90d4, 0x003e, 0x002e, 0x001e, 0x015e, -- 0x0120, 0x6007, 0x0031, 0x0804, 0xa3a9, 0x080c, 0x8df0, 0x080c, -- 0x5ad0, 0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, 0x5aec, 0x1158, -- 0x2001, 0xb79f, 0x2003, 0x0001, 0x2001, 0xb500, 0x2003, 0x0001, -- 0x080c, 0x5a08, 0x0010, 0x080c, 0x5aa7, 0x003e, 0x002e, 0x000e, -- 0x0005, 0x080c, 0x2dbf, 0x1904, 0xa5ad, 0x080c, 0xa5d5, 0x1904, -- 0xa29a, 0x6106, 0x080c, 0xa5f1, 0x6007, 0x002b, 0x0804, 0xa3a9, -- 0x6007, 0x002c, 0x0804, 0xa3a9, 0x080c, 0xb2c4, 0x1904, 0xa5ad, -- 0x080c, 0x2dbf, 0x1904, 0xa5ad, 0x080c, 0xa5d5, 0x1904, 0xa29a, -- 0x6106, 0x080c, 0xa5f5, 0x1120, 0x6007, 0x002e, 0x0804, 0xa3a9, -- 0x6007, 0x002f, 0x0804, 0xa3a9, 0x080c, 0x2dbf, 0x1904, 0xa5ad, -- 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080, 0x0001, 0x200c, 0xa184, -- 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184, 0xff00, 0x8007, 0xa086, -- 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xa3ae, 0x2001, -- 0xb572, 0x2004, 0xd0e4, 0x0904, 0xa503, 0x2071, 0xbb8c, 0x7010, -- 0x6036, 0x7014, 0x603a, 0x7108, 0x720c, 0x2001, 0xb553, 0x2004, -- 0xd0a4, 0x0140, 0x6018, 0x2068, 0x6810, 0xa106, 0x1118, 0x6814, -- 0xa206, 0x01f8, 0x2001, 0xb553, 0x2004, 0xd0ac, 0x1590, 0x2069, -- 0xb500, 0x6874, 0xa206, 0x1568, 0x6870, 0xa106, 0x1550, 0x7210, -- 0x080c, 0x9c44, 0x0558, 0x080c, 0xb148, 0x0540, 0x622a, 0x6007, -- 0x0036, 0x6003, 0x0001, 0x080c, 0x6c8e, 0x00ce, 0x00de, 0x00ee, -- 0x0005, 0x7214, 0xa286, 0xffff, 0x0150, 0x080c, 0x9c44, 0x01b0, -- 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x1180, 0x0c08, 0x7210, -- 0x2c08, 0xa085, 0x0001, 0x080c, 0xb0ae, 0x2c10, 0x2160, 0x0130, -- 0x08b8, 0x6007, 0x0037, 0x6013, 0x1500, 0x08d8, 0x6007, 0x0037, -- 0x6013, 0x1700, 0x08b0, 0x6007, 0x0012, 0x0898, 0x080c, 0x2dbf, -- 0x1904, 0xa5ad, 0x6018, 0xa080, 0x0001, 0x2004, 0xa084, 0xff00, -- 0x8007, 0xa086, 0x0006, 0x1904, 0xa3ae, 0x00e6, 0x00d6, 0x00c6, -- 0x2001, 0xb572, 0x2004, 0xd0e4, 0x0904, 0xa56f, 0x2069, 0xb500, -- 0x2071, 0xbb8c, 0x7008, 0x6036, 0x720c, 0x623a, 0xa286, 0xffff, -- 0x1150, 0x7208, 0x00c6, 0x2c08, 0xa085, 0x0001, 0x080c, 0xb0ae, -- 0x2c10, 0x00ce, 0x0588, 0x080c, 0x9c44, 0x0570, 0x00c6, 0x0026, -- 0x2260, 0x080c, 0x9917, 0x002e, 0x00ce, 0x7118, 0xa18c, 0xff00, -- 0x810f, 0xa186, 0x0001, 0x0158, 0xa186, 0x0005, 0x0118, 0xa186, -- 0x0007, 0x1178, 0xa280, 0x0004, 0x2004, 0xa005, 0x0150, 0x0056, -- 0x7510, 0x7614, 0x080c, 0xb15f, 0x005e, 0x00ce, 0x00de, 0x00ee, -- 0x0005, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003, -- 0x0001, 0x080c, 0x6c8e, 0x0c88, 0x6007, 0x003b, 0x602b, 0x0009, -- 0x6013, 0x1700, 0x6003, 0x0001, 0x080c, 0x6c8e, 0x0c30, 0x6007, -- 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0804, 0xa4d9, 0x00e6, -- 0x0026, 0x080c, 0x530a, 0x0558, 0x080c, 0x52fa, 0x080c, 0xb33f, -- 0x1520, 0x2071, 0xb500, 0x70d4, 0xc085, 0x70d6, 0x00f6, 0x2079, -- 0x0100, 0x72a0, 0xa284, 0x00ff, 0x7072, 0x78e6, 0xa284, 0xff00, -- 0x7274, 0xa205, 0x7076, 0x78ea, 0x00fe, 0x70df, 0x0000, 0x2001, -- 0xb553, 0x2004, 0xd0a4, 0x0120, 0x2011, 0xb7f9, 0x2013, 0x07d0, -- 0xd0ac, 0x1128, 0x080c, 0x2ab8, 0x0010, 0x080c, 0xb36b, 0x002e, -- 0x00ee, 0x080c, 0x8617, 0x0804, 0xa3ad, 0x080c, 0x8617, 0x0005, -- 0x2600, 0x0002, 0xa5bb, 0xa5bb, 0xa5bb, 0xa5bb, 0xa5bb, 0xa5bd, -- 0xa5bb, 0xa5bb, 0xa5bb, 0x080c, 0x1515, 0x080c, 0xb2c4, 0x1d68, -- 0x080c, 0x2dbf, 0x1d50, 0x0089, 0x1138, 0x6007, 0x0045, 0x6003, -- 0x0001, 0x080c, 0x6cd4, 0x0005, 0x080c, 0x2c9c, 0x6007, 0x0001, -- 0x6003, 0x0001, 0x080c, 0x6cd4, 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, 0x281d, 0x1130, -- 0x2110, 0x2009, 0x0000, 0x080c, 0x2ce1, 0x0018, 0xa085, 0x0001, -- 0x0008, 0xa006, 0x00de, 0x0005, 0x2069, 0xbb8d, 0x6800, 0xa082, -- 0x0010, 0x1228, 0x6013, 0x0000, 0xa085, 0x0001, 0x0008, 0xa006, -- 0x0005, 0x6013, 0x0000, 0x2069, 0xbb8c, 0x6808, 0xa084, 0xff00, -- 0xa086, 0x0800, 0x1140, 0x6800, 0xa084, 0x00ff, 0xa08e, 0x0014, -- 0x0110, 0xa08e, 0x0010, 0x0005, 0x6004, 0xa0b2, 0x0080, 0x1a0c, -- 0x1515, 0xa1b6, 0x0013, 0x1130, 0x2008, 0xa1b2, 0x0040, 0x1a04, -- 0xa73c, 0x0092, 0xa1b6, 0x0027, 0x0120, 0xa1b6, 0x0014, 0x190c, -- 0x1515, 0x2001, 0x0007, 0x080c, 0x4f2b, 0x080c, 0x7091, 0x080c, -- 0x9e17, 0x080c, 0x7174, 0x0005, 0xa69c, 0xa69e, 0xa69c, 0xa69c, -- 0xa69c, 0xa69e, 0xa6b0, 0xa735, 0xa700, 0xa735, 0xa711, 0xa735, -- 0xa6b0, 0xa735, 0xa72d, 0xa735, 0xa72d, 0xa735, 0xa735, 0xa69c, -- 0xa69c, 0xa69c, 0xa69c, 0xa69c, 0xa69c, 0xa69c, 0xa69c, 0xa69c, -- 0xa69c, 0xa69c, 0xa69e, 0xa69c, 0xa735, 0xa69c, 0xa69c, 0xa735, -- 0xa69c, 0xa732, 0xa735, 0xa69c, 0xa69c, 0xa69c, 0xa69c, 0xa735, -- 0xa735, 0xa69c, 0xa735, 0xa735, 0xa69c, 0xa6aa, 0xa69c, 0xa69c, -- 0xa69c, 0xa69c, 0xa731, 0xa735, 0xa69c, 0xa69c, 0xa735, 0xa735, -- 0xa69c, 0xa69c, 0xa69c, 0xa69c, 0x080c, 0x1515, 0x080c, 0x7091, -- 0x2001, 0xb7b6, 0x2004, 0x6016, 0x6003, 0x0002, 0x080c, 0x7174, -- 0x0804, 0xa73b, 0x2001, 0x0000, 0x080c, 0x4eec, 0x0804, 0xa735, -- 0x00f6, 0x2079, 0xb552, 0x7804, 0x00fe, 0xd0ac, 0x1904, 0xa735, -- 0x2001, 0x0000, 0x080c, 0x4eec, 0x6018, 0xa080, 0x0004, 0x2004, -- 0xa086, 0x00ff, 0x1140, 0x00f6, 0x2079, 0xb500, 0x7898, 0x8000, -- 0x789a, 0x00fe, 0x00e0, 0x00c6, 0x6018, 0x2060, 0x6000, 0xd0f4, -- 0x1140, 0x6010, 0xa005, 0x0128, 0x00ce, 0x080c, 0x3f3f, 0x0804, -- 0xa735, 0x00ce, 0x2001, 0xb500, 0x2004, 0xa086, 0x0002, 0x1138, -- 0x00f6, 0x2079, 0xb500, 0x7898, 0x8000, 0x789a, 0x00fe, 0x2001, -- 0x0002, 0x080c, 0x4efe, 0x080c, 0x7091, 0x601f, 0x0001, 0x6003, -- 0x0001, 0x6007, 0x0002, 0x080c, 0x6cd4, 0x080c, 0x7174, 0x00c6, -- 0x6118, 0x2160, 0x2009, 0x0001, 0x080c, 0x69a9, 0x00ce, 0x04d8, -- 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, -- 0xa686, 0x0006, 0x0550, 0xa686, 0x0004, 0x0538, 0x2001, 0x0004, -- 0x0410, 0x2001, 0xb500, 0x2004, 0xa086, 0x0003, 0x1110, 0x080c, -- 0x3f3f, 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, 0x4f2b, 0x080c, 0x7091, 0x080c, -- 0x8617, 0x080c, 0x7174, 0x0005, 0x2600, 0x0002, 0xa747, 0xa747, -- 0xa747, 0xa747, 0xa747, 0xa749, 0xa747, 0xa747, 0xa747, 0x080c, -- 0x1515, 0x080c, 0x7091, 0x080c, 0x8617, 0x080c, 0x7174, 0x0005, -- 0x0016, 0x00d6, 0x6118, 0x2168, 0x6900, 0xd184, 0x0140, 0x080c, -- 0x4efe, 0x2001, 0x0000, 0x080c, 0x4eec, 0x080c, 0x2cc2, 0x00de, -- 0x001e, 0x0005, 0x00d6, 0x6618, 0x2668, 0x6804, 0xa084, 0xff00, -- 0x8007, 0x00de, 0xa0b2, 0x000c, 0x1a0c, 0x1515, 0xa1b6, 0x0015, -- 0x1110, 0x003b, 0x0028, 0xa1b6, 0x0016, 0x190c, 0x1515, 0x006b, -- 0x0005, 0x8cd9, 0x8cd9, 0x8cd9, 0x8cd9, 0x8cd9, 0x8cd9, 0xa7d2, -- 0xa791, 0x8cd9, 0x8cd9, 0x8cd9, 0x8cd9, 0x8cd9, 0x8cd9, 0x8cd9, -- 0x8cd9, 0x8cd9, 0x8cd9, 0xa7d2, 0xa7d9, 0x8cd9, 0x8cd9, 0x8cd9, -- 0x8cd9, 0x00f6, 0x2079, 0xb552, 0x7804, 0xd0ac, 0x11e0, 0x6018, -- 0xa07d, 0x01c8, 0x7800, 0xd0f4, 0x1118, 0x7810, 0xa005, 0x1198, -- 0x2001, 0x0000, 0x080c, 0x4eec, 0x2001, 0x0002, 0x080c, 0x4efe, -- 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x6cd4, -- 0x080c, 0x7174, 0x00e8, 0x2011, 0xbb83, 0x2204, 0x8211, 0x220c, -- 0x080c, 0x281d, 0x11a8, 0x00c6, 0x080c, 0x4faa, 0x0120, 0x00ce, -- 0x080c, 0x8617, 0x0068, 0x6010, 0x0006, 0x6014, 0x0006, 0x080c, -- 0x4c0c, 0x000e, 0x6016, 0x000e, 0x6012, 0x00ce, 0x080c, 0x8617, -- 0x00fe, 0x0005, 0x6604, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x8617, -- 0x0005, 0x080c, 0x8f8f, 0x1138, 0x6003, 0x0001, 0x6007, 0x0001, -- 0x080c, 0x6cd4, 0x0010, 0x080c, 0x8617, 0x0005, 0x6004, 0xa08a, -- 0x0080, 0x1a0c, 0x1515, 0x080c, 0x7091, 0x080c, 0x9e17, 0x080c, -- 0x7174, 0x0005, 0xa182, 0x0040, 0x0002, 0xa808, 0xa808, 0xa808, -- 0xa808, 0xa80a, 0xa808, 0xa808, 0xa808, 0xa808, 0xa808, 0xa808, -- 0xa808, 0xa808, 0xa808, 0xa808, 0xa808, 0xa808, 0xa808, 0xa808, -- 0x080c, 0x1515, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0046, 0x0026, -- 0x6218, 0xa280, 0x002b, 0x2004, 0xa005, 0x0120, 0x2021, 0x0000, -- 0x080c, 0xb310, 0x6106, 0x2071, 0xbb80, 0x7444, 0xa4a4, 0xff00, -- 0x0904, 0xa86e, 0xa486, 0x2000, 0x1130, 0x2009, 0x0001, 0x2011, -- 0x0200, 0x080c, 0x6b1b, 0x080c, 0x15f8, 0x090c, 0x1515, 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, 0x5409, 0x001e, -- 0xa486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xb059, 0x0804, -- 0xa8cb, 0xa486, 0x0400, 0x1130, 0x2019, 0x0002, 0x080c, 0xb00b, -- 0x0804, 0xa8cb, 0xa486, 0x0200, 0x1110, 0x080c, 0xaff0, 0xa486, -- 0x1000, 0x1110, 0x080c, 0xb03e, 0x0804, 0xa8cb, 0x2069, 0xb874, -- 0x6a00, 0xd284, 0x0904, 0xa932, 0xa284, 0x0300, 0x1904, 0xa92b, -- 0x6804, 0xa005, 0x0904, 0xa913, 0x2d78, 0x6003, 0x0007, 0x080c, -- 0x15df, 0x0904, 0xa8d2, 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, 0xbb90, 0xad90, 0x0015, 0x200c, 0x810f, 0x2112, -- 0x8000, 0x8210, 0x1f04, 0xa8bd, 0x200c, 0x6982, 0x8000, 0x200c, -- 0x697e, 0x080c, 0x5409, 0x002e, 0x004e, 0x015e, 0x00fe, 0x00ee, -- 0x00de, 0x0005, 0x2001, 0xb50e, 0x2004, 0xd084, 0x0120, 0x080c, -- 0x15f8, 0x1904, 0xa883, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, -- 0x0041, 0x080c, 0x6c8e, 0x080c, 0x7174, 0x0c28, 0x2069, 0xbb92, -- 0x2d04, 0xa084, 0xff00, 0xa086, 0x1200, 0x11a8, 0x2069, 0xbb80, -- 0x686c, 0xa084, 0x00ff, 0x0016, 0x6110, 0xa18c, 0x0700, 0xa10d, -- 0x6112, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, 0x6c8e, -- 0x080c, 0x7174, 0x0840, 0x6868, 0x602a, 0x686c, 0x602e, 0x6013, -- 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6c8e, 0x080c, -- 0x7174, 0x0804, 0xa8cb, 0x2001, 0xb50d, 0x2004, 0xd0ec, 0x0120, -- 0x2011, 0x8049, 0x080c, 0x3ecd, 0x6013, 0x0300, 0x0010, 0x6013, -- 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x6c8e, 0x080c, -- 0x7174, 0x0804, 0xa8cb, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600, -- 0x0804, 0xa8e6, 0x6013, 0x0200, 0x0804, 0xa8e6, 0xa186, 0x0013, -- 0x1170, 0x6004, 0xa08a, 0x0040, 0x0a0c, 0x1515, 0xa08a, 0x0053, -- 0x1a0c, 0x1515, 0xa082, 0x0040, 0x2008, 0x0804, 0xa9c0, 0xa186, -- 0x0051, 0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, 0xa086, 0x0041, -- 0x0518, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, -- 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x6b75, 0x002e, 0x001e, -- 0x000e, 0x012e, 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0xaa03, -- 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1515, 0x6004, -- 0xa082, 0x0040, 0x2008, 0x001a, 0x080c, 0x865d, 0x0005, 0xa98a, -- 0xa98c, 0xa98c, 0xa9b0, 0xa98a, 0xa98a, 0xa98a, 0xa98a, 0xa98a, -- 0xa98a, 0xa98a, 0xa98a, 0xa98a, 0xa98a, 0xa98a, 0xa98a, 0xa98a, -- 0xa98a, 0xa98a, 0x080c, 0x1515, 0x080c, 0x7091, 0x080c, 0x7174, -- 0x0036, 0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, 0xf000, 0x01a8, -- 0x6003, 0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, 0x2019, 0x0004, -- 0x080c, 0xb08d, 0x6013, 0x0000, 0x6014, 0xa005, 0x1120, 0x2001, -- 0xb7b7, 0x2004, 0x6016, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, -- 0x00d6, 0x080c, 0x7091, 0x080c, 0x7174, 0x080c, 0x9c54, 0x0120, -- 0x6010, 0x2068, 0x080c, 0x160f, 0x080c, 0x9e17, 0x00de, 0x0005, -- 0x0002, 0xa9d4, 0xa9f1, 0xa9dd, 0xa9fd, 0xa9d4, 0xa9d4, 0xa9d4, -- 0xa9d4, 0xa9d4, 0xa9d4, 0xa9d4, 0xa9d4, 0xa9d4, 0xa9d4, 0xa9d4, -- 0xa9d4, 0xa9d4, 0xa9d4, 0xa9d4, 0x080c, 0x1515, 0x6010, 0xa088, -- 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x080c, 0x7091, 0x6010, -- 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, -- 0x0043, 0x080c, 0x8646, 0x0010, 0x6003, 0x0002, 0x080c, 0x7174, -- 0x0005, 0x080c, 0x7091, 0x080c, 0xb2cb, 0x1120, 0x080c, 0x6af0, -- 0x080c, 0x8617, 0x080c, 0x7174, 0x0005, 0x080c, 0x7091, 0x2009, -- 0x0041, 0x0804, 0xab4c, 0xa182, 0x0040, 0x0002, 0xaa19, 0xaa1b, -- 0xaa19, 0xaa19, 0xaa19, 0xaa19, 0xaa19, 0xaa1c, 0xaa19, 0xaa19, -- 0xaa19, 0xaa19, 0xaa19, 0xaa19, 0xaa19, 0xaa19, 0xaa19, 0xaa27, -- 0xaa19, 0x080c, 0x1515, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1, -- 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x185e, 0x0005, 0x00d6, -- 0x080c, 0x6af0, 0x00de, 0x080c, 0xb32e, 0x080c, 0x8617, 0x0005, -- 0xa182, 0x0040, 0x0002, 0xaa46, 0xaa46, 0xaa46, 0xaa46, 0xaa46, -- 0xaa46, 0xaa46, 0xaa48, 0xaa46, 0xaa4b, 0xaa84, 0xaa46, 0xaa46, -- 0xaa46, 0xaa46, 0xaa84, 0xaa46, 0xaa46, 0xaa46, 0x080c, 0x1515, -- 0x080c, 0x865d, 0x0005, 0x2001, 0xb572, 0x2004, 0xd0e4, 0x0158, -- 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x0228, 0x2001, 0x011f, -- 0x2004, 0x6036, 0x0010, 0x6037, 0x0000, 0x080c, 0x7127, 0x080c, -- 0x7231, 0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, -- 0x0003, 0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, 0x00de, 0x0804, -- 0xab4c, 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x6af0, 0x00de, -- 0x0005, 0x080c, 0xb2cb, 0x0110, 0x00de, 0x0005, 0x080c, 0x6af0, -- 0x080c, 0x8617, 0x00de, 0x0ca0, 0x0036, 0x080c, 0x7127, 0x080c, -- 0x7231, 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, 0xb08d, 0x6014, 0xa005, 0x1128, -- 0x2001, 0xb7b7, 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, -- 0x0007, 0x00de, 0x003e, 0x0005, 0xa186, 0x0013, 0x1150, 0x6004, -- 0xa086, 0x0042, 0x190c, 0x1515, 0x080c, 0x7091, 0x080c, 0x7174, -- 0x0005, 0xa186, 0x0027, 0x0118, 0xa186, 0x0014, 0x1180, 0x6004, -- 0xa086, 0x0042, 0x190c, 0x1515, 0x2001, 0x0007, 0x080c, 0x4f2b, -- 0x080c, 0x7091, 0x080c, 0x9e17, 0x080c, 0x7174, 0x0005, 0xa182, -- 0x0040, 0x0002, 0xaaed, 0xaaed, 0xaaed, 0xaaed, 0xaaed, 0xaaed, -- 0xaaed, 0xaaef, 0xaafb, 0xaaed, 0xaaed, 0xaaed, 0xaaed, 0xaaed, -- 0xaaed, 0xaaed, 0xaaed, 0xaaed, 0xaaed, 0x080c, 0x1515, 0x0036, -- 0x0046, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x185e, -- 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, 0x6af0, -- 0x00de, 0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, 0x5306, 0x00fe, -- 0x000e, 0x0120, 0x6003, 0x0002, 0x00de, 0x0005, 0x2009, 0xb50d, -- 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, -- 0x0021, 0x080c, 0x6af2, 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, 0x1515, 0x6020, -- 0xd0dc, 0x090c, 0x1515, 0x0005, 0xab6f, 0xab76, 0xab82, 0xab8e, -- 0xab6f, 0xab6f, 0xab6f, 0xab9d, 0xab6f, 0xab71, 0xab71, 0xab6f, -- 0xab6f, 0xab6f, 0xab6f, 0xab71, 0xab6f, 0xab71, 0xab6f, 0x080c, -- 0x1515, 0x6020, 0xd0dc, 0x090c, 0x1515, 0x0005, 0x6003, 0x0001, -- 0x6106, 0x080c, 0x6c8e, 0x0126, 0x2091, 0x8000, 0x080c, 0x7174, -- 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c8e, 0x0126, -- 0x2091, 0x8000, 0x080c, 0x7174, 0x012e, 0x0005, 0x6003, 0x0003, -- 0x6106, 0x2c10, 0x080c, 0x1fa9, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x6cf1, 0x080c, 0x7231, 0x012e, 0x0005, 0xa016, 0x080c, 0x185e, -- 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0xa182, 0x0040, -- 0x0023, 0x00de, 0x003e, 0x012e, 0x0005, 0xabbd, 0xabbf, 0xabd1, -- 0xabec, 0xabbd, 0xabbd, 0xabbd, 0xac01, 0xabbd, 0xabbd, 0xabbd, -- 0xabbd, 0xabbd, 0xabbd, 0xabbd, 0xabbd, 0x080c, 0x1515, 0x6010, -- 0x2068, 0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, 0xa39e, 0x0003, -- 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c8e, 0x080c, 0x7174, -- 0x0498, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, 0xa09c, 0x0003, -- 0xa39e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x6c8e, -- 0x080c, 0x7174, 0x0408, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, -- 0x0004, 0x080c, 0xb08d, 0x00c0, 0x6010, 0x2068, 0x684c, 0xd0fc, -- 0x0d90, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, 0x6003, 0x0003, -- 0x6106, 0x2c10, 0x080c, 0x1fa9, 0x080c, 0x6cf1, 0x080c, 0x7231, -- 0x0018, 0xa016, 0x080c, 0x185e, 0x0005, 0x080c, 0x7091, 0x6110, -- 0x81ff, 0x0158, 0x00d6, 0x2168, 0x080c, 0xb374, 0x0036, 0x2019, -- 0x0029, 0x080c, 0xb08d, 0x003e, 0x00de, 0x080c, 0x9e17, 0x080c, -- 0x7174, 0x0005, 0x080c, 0x7127, 0x6110, 0x81ff, 0x0158, 0x00d6, -- 0x2168, 0x080c, 0xb374, 0x0036, 0x2019, 0x0029, 0x080c, 0xb08d, -- 0x003e, 0x00de, 0x080c, 0x9e17, 0x080c, 0x7231, 0x0005, 0xa182, -- 0x0085, 0x0002, 0xac3b, 0xac39, 0xac39, 0xac47, 0xac39, 0xac39, -- 0xac39, 0x080c, 0x1515, 0x6003, 0x000b, 0x6106, 0x080c, 0x6c8e, -- 0x0126, 0x2091, 0x8000, 0x080c, 0x7174, 0x012e, 0x0005, 0x0026, -- 0x00e6, 0x080c, 0xb2c4, 0x0118, 0x080c, 0x8617, 0x00c8, 0x2071, -- 0xbb80, 0x7224, 0x6212, 0x7220, 0x080c, 0xaf3b, 0x0118, 0x6007, -- 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x1110, -- 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, 0x6c8e, 0x080c, 0x7174, -- 0x00ee, 0x002e, 0x0005, 0xa186, 0x0013, 0x1160, 0x6004, 0xa08a, -- 0x0085, 0x0a0c, 0x1515, 0xa08a, 0x008c, 0x1a0c, 0x1515, 0xa082, -- 0x0085, 0x00a2, 0xa186, 0x0027, 0x0130, 0xa186, 0x0014, 0x0118, -- 0x080c, 0x865d, 0x0050, 0x2001, 0x0007, 0x080c, 0x4f2b, 0x080c, -- 0x7091, 0x080c, 0x9e17, 0x080c, 0x7174, 0x0005, 0xac95, 0xac97, -- 0xac97, 0xac95, 0xac95, 0xac95, 0xac95, 0x080c, 0x1515, 0x080c, -- 0x7091, 0x080c, 0x9e17, 0x080c, 0x7174, 0x0005, 0xa182, 0x0085, -- 0x0a0c, 0x1515, 0xa182, 0x008c, 0x1a0c, 0x1515, 0xa182, 0x0085, -- 0x0002, 0xacb0, 0xacb0, 0xacb0, 0xacb2, 0xacb0, 0xacb0, 0xacb0, -- 0x080c, 0x1515, 0x0005, 0xa186, 0x0013, 0x0148, 0xa186, 0x0014, -- 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x865d, 0x0030, 0x080c, -- 0x7091, 0x080c, 0x9e17, 0x080c, 0x7174, 0x0005, 0x0036, 0x080c, -- 0xb32e, 0x603f, 0x0000, 0x2019, 0x000b, 0x0031, 0x601f, 0x0006, -- 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, -- 0x0086, 0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, 0x8131, 0x009e, -- 0x008e, 0x1578, 0x0076, 0x2c38, 0x080c, 0x81d0, 0x007e, 0x1548, -- 0x6000, 0xa086, 0x0000, 0x0528, 0x601c, 0xa086, 0x0007, 0x0508, -- 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, 0xb32e, 0x601f, -- 0x0007, 0x2001, 0xb7b6, 0x2004, 0x6016, 0x080c, 0x194d, 0x6010, -- 0x2068, 0x080c, 0x9c54, 0x0110, 0x080c, 0xb08d, 0x00de, 0x6013, -- 0x0000, 0x080c, 0xb32e, 0x601f, 0x0007, 0x2001, 0xb7b6, 0x2004, -- 0x6016, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x0036, 0x0156, -- 0x2079, 0xbb80, 0x7938, 0x783c, 0x080c, 0x281d, 0x15b0, 0x0016, -- 0x00c6, 0x080c, 0x4faa, 0x1578, 0x001e, 0x002e, 0x0026, 0x0016, -- 0x2019, 0x0029, 0x080c, 0x8293, 0x080c, 0x6df6, 0x0076, 0x2039, -- 0x0000, 0x080c, 0x6d03, 0x007e, 0x001e, 0x0076, 0x2039, 0x0000, -- 0x080c, 0xae76, 0x007e, 0x080c, 0x51ab, 0x0026, 0x6204, 0xa294, -- 0xff00, 0x8217, 0xa286, 0x0006, 0x0118, 0xa286, 0x0004, 0x1118, -- 0x62a0, 0x080c, 0x2d55, 0x002e, 0x001e, 0x080c, 0x4c0c, 0x6612, -- 0x6516, 0xa006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00ce, -- 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x2009, 0xb521, -- 0x2104, 0xa086, 0x0074, 0x1904, 0xadaf, 0x2069, 0xbb8e, 0x690c, -- 0xa182, 0x0100, 0x06c0, 0x6908, 0xa184, 0x8000, 0x05e8, 0x2001, -- 0xb79e, 0x2004, 0xa005, 0x1160, 0x6018, 0x2070, 0x7010, 0xa084, -- 0x00ff, 0x0118, 0x7000, 0xd0f4, 0x0118, 0xa184, 0x0800, 0x0560, -- 0x6910, 0xa18a, 0x0001, 0x0610, 0x6914, 0x2069, 0xbbae, 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, 0x4fb9, 0x00ce, -- 0x04c0, 0x2011, 0xbb96, 0xad98, 0x000a, 0x20a9, 0x0004, 0x080c, -- 0x90d4, 0x1580, 0x2011, 0xbb9a, 0xad98, 0x0006, 0x20a9, 0x0004, -- 0x080c, 0x90d4, 0x1538, 0x0046, 0x0016, 0x6aa0, 0xa294, 0x00ff, -- 0x8227, 0xa006, 0x2009, 0xb553, 0x210c, 0xd1a4, 0x0138, 0x2009, -- 0x0029, 0x080c, 0xb0dc, 0x6800, 0xc0e5, 0x6802, 0x2019, 0x0029, -- 0x080c, 0x6df6, 0x0076, 0x2039, 0x0000, 0x080c, 0x6d03, 0x2c08, -- 0x080c, 0xae76, 0x007e, 0x2001, 0x0007, 0x080c, 0x4f2b, 0x001e, -- 0x004e, 0xa006, 0x015e, 0x003e, 0x002e, 0x00de, 0x00ce, 0x0005, -- 0x00d6, 0x2069, 0xbb8e, 0x6800, 0xa086, 0x0800, 0x0118, 0x6013, -- 0x0000, 0x0008, 0xa006, 0x00de, 0x0005, 0x00c6, 0x00f6, 0x0016, -- 0x0026, 0x0036, 0x0156, 0x2079, 0xbb8c, 0x7930, 0x7834, 0x080c, -- 0x281d, 0x11a0, 0x080c, 0x4faa, 0x1188, 0x2011, 0xbb90, 0xac98, -- 0x000a, 0x20a9, 0x0004, 0x080c, 0x90d4, 0x1140, 0x2011, 0xbb94, -- 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x90d4, 0x015e, 0x003e, -- 0x002e, 0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, 0x0006, 0x0016, -- 0x0026, 0x0036, 0x0156, 0x2011, 0xbb83, 0x2204, 0x8211, 0x220c, -- 0x080c, 0x281d, 0x11a0, 0x080c, 0x4faa, 0x1188, 0x2011, 0xbb96, -- 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0x90d4, 0x1140, 0x2011, -- 0xbb9a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0x90d4, 0x015e, -- 0x003e, 0x002e, 0x001e, 0x000e, 0x00ce, 0x0005, 0x00e6, 0x00c6, -- 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, -- 0x8000, 0x2740, 0x2029, 0xb7e9, 0x252c, 0x2021, 0xb7ef, 0x2424, -- 0x2061, 0xbd00, 0x2071, 0xb500, 0x7648, 0x7068, 0x81ff, 0x0150, -- 0x0006, 0xa186, 0xb8f4, 0x000e, 0x0128, 0x8001, 0xa602, 0x1a04, -- 0xaef7, 0x0018, 0xa606, 0x0904, 0xaef7, 0x2100, 0xac06, 0x0904, -- 0xaeee, 0x080c, 0xb104, 0x0904, 0xaeee, 0x671c, 0xa786, 0x0001, -- 0x0904, 0xaf12, 0xa786, 0x0004, 0x0904, 0xaf12, 0xa786, 0x0007, -- 0x05e8, 0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, 0x05b8, 0x080c, -- 0xb114, 0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, 0x1578, 0x00d6, -- 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x194d, 0x001e, -- 0xa786, 0x0008, 0x1148, 0x080c, 0x9e52, 0x1130, 0x080c, 0x8c13, -- 0x00de, 0x080c, 0x9e17, 0x00d0, 0x6010, 0x2068, 0x080c, 0x9c54, -- 0x0190, 0xa786, 0x0003, 0x1528, 0x6837, 0x0103, 0x6b4a, 0x6847, -- 0x0000, 0x080c, 0xb374, 0x0016, 0x080c, 0x9ec6, 0x080c, 0x5409, -- 0x001e, 0x080c, 0x9e0b, 0x00de, 0x080c, 0x9e17, 0xace0, 0x0018, -- 0x2001, 0xb517, 0x2004, 0xac02, 0x1210, 0x0804, 0xae8a, 0x012e, -- 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, -- 0x0005, 0xa786, 0x0006, 0x1150, 0xa386, 0x0005, 0x0128, 0x080c, -- 0xb374, 0x080c, 0xb08d, 0x08f8, 0x00de, 0x0c00, 0xa786, 0x000a, -- 0x0968, 0x0850, 0x080c, 0xb114, 0x19c8, 0x81ff, 0x09b8, 0xa180, -- 0x0001, 0x2004, 0xa086, 0x0018, 0x0130, 0xa180, 0x0001, 0x2004, -- 0xa086, 0x002d, 0x1958, 0x6000, 0xa086, 0x0002, 0x1938, 0x080c, -- 0x9e41, 0x0130, 0x080c, 0x9e52, 0x1908, 0x080c, 0x8c13, 0x0038, -- 0x080c, 0x2cc2, 0x080c, 0x9e52, 0x1110, 0x080c, 0x8c13, 0x080c, -- 0x9e17, 0x0804, 0xaeee, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, -- 0xa006, 0x080c, 0xb0ae, 0x001e, 0x0120, 0x601c, 0xa084, 0x000f, -- 0x001b, 0x00ee, 0x00ce, 0x0005, 0xaf54, 0xaf54, 0xaf54, 0xaf54, -- 0xaf54, 0xaf54, 0xaf56, 0xaf54, 0xa006, 0x0005, 0x0046, 0x0016, -- 0x7018, 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, -- 0x2009, 0x0020, 0x080c, 0xb0dc, 0x001e, 0x004e, 0x0036, 0x2019, -- 0x0002, 0x080c, 0xacd4, 0x003e, 0xa085, 0x0001, 0x0005, 0x2001, -- 0x0001, 0x080c, 0x4eec, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, -- 0x0004, 0x2019, 0xb505, 0x2011, 0xbb96, 0x080c, 0x90d4, 0x003e, -- 0x002e, 0x001e, 0x015e, 0xa005, 0x0005, 0x00f6, 0x00e6, 0x00c6, -- 0x0086, 0x0076, 0x0066, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, -- 0x2061, 0xbd00, 0x2079, 0x0001, 0x8fff, 0x0904, 0xafe3, 0x2071, -- 0xb500, 0x7648, 0x7068, 0x8001, 0xa602, 0x1a04, 0xafe3, 0x88ff, -- 0x0128, 0x2800, 0xac06, 0x15b0, 0x2079, 0x0000, 0x080c, 0xb104, -- 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, 0xb32e, 0x601f, 0x0007, 0x2001, 0xb7b6, -- 0x2004, 0x6016, 0x080c, 0x194d, 0x6010, 0x2068, 0x080c, 0x9c54, -- 0x0120, 0x0046, 0x080c, 0xb08d, 0x004e, 0x00de, 0x080c, 0x9e17, -- 0x88ff, 0x1198, 0xace0, 0x0018, 0x2001, 0xb517, 0x2004, 0xac02, -- 0x1210, 0x0804, 0xaf94, 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, 0x8131, -- 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x81d0, 0x080c, 0xaf85, -- 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, -- 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, -- 0x0036, 0x080c, 0x4faa, 0x11b0, 0x2c10, 0x0056, 0x0086, 0x2041, -- 0x0000, 0x2508, 0x2029, 0x0001, 0x0096, 0x2049, 0x0000, 0x080c, -- 0x8131, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x81d0, 0x080c, -- 0xaf85, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xb017, 0x015e, -- 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e, 0x0005, 0x0076, 0x0056, -- 0x6218, 0x0086, 0x2041, 0x0000, 0x2029, 0x0001, 0x2019, 0x0048, -- 0x0096, 0x2049, 0x0000, 0x080c, 0x8131, 0x009e, 0x008e, 0x2039, -- 0x0000, 0x080c, 0x81d0, 0x2c20, 0x080c, 0xaf85, 0x005e, 0x007e, -- 0x0005, 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, -- 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x4faa, -- 0x11c0, 0x2c10, 0x0086, 0x2041, 0x0000, 0x2828, 0x0046, 0x2021, -- 0x0001, 0x080c, 0xb310, 0x004e, 0x0096, 0x2049, 0x0000, 0x080c, -- 0x8131, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x81d0, 0x080c, -- 0xaf85, 0x003e, 0x001e, 0x8108, 0x1f04, 0xb064, 0x015e, 0x00ce, -- 0x007e, 0x005e, 0x004e, 0x002e, 0x0005, 0x0016, 0x00f6, 0x3800, -- 0xd08c, 0x0130, 0xad82, 0x1000, 0x02b0, 0xad82, 0xb500, 0x0230, -- 0xad82, 0xed00, 0x0280, 0xad82, 0xffff, 0x1268, 0x6800, 0xa07d, -- 0x0138, 0x6803, 0x0000, 0x6b52, 0x080c, 0x5409, 0x2f68, 0x0cb0, -- 0x6b52, 0x080c, 0x5409, 0x00fe, 0x001e, 0x0005, 0x00e6, 0x0046, -- 0x0036, 0x2061, 0xbd00, 0xa005, 0x1138, 0x2071, 0xb500, 0x7448, -- 0x7068, 0x8001, 0xa402, 0x12d8, 0x2100, 0xac06, 0x0168, 0x6000, -- 0xa086, 0x0000, 0x0148, 0x6008, 0xa206, 0x1130, 0x6018, 0xa1a0, -- 0x0006, 0x2424, 0xa406, 0x0140, 0xace0, 0x0018, 0x2001, 0xb517, -- 0x2004, 0xac02, 0x1220, 0x0c40, 0xa085, 0x0001, 0x0008, 0xa006, -- 0x003e, 0x004e, 0x00ee, 0x0005, 0x00d6, 0x0006, 0x080c, 0x15f8, -- 0x000e, 0x090c, 0x1515, 0x6837, 0x010d, 0x685e, 0x0026, 0x2010, -- 0x080c, 0x9c44, 0x2001, 0x0000, 0x0120, 0x2200, 0xa080, 0x0014, -- 0x2004, 0x002e, 0x684a, 0x6956, 0x6c46, 0x684f, 0x0000, 0x2001, -- 0xb7be, 0x2004, 0x6852, 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, -- 0x080c, 0x5409, 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, 0xb7b7, 0x2004, 0x6016, -- 0x080c, 0x6c8e, 0x080c, 0x7174, 0x001e, 0x0005, 0xe000, 0xe000, -- 0x0005, 0x6020, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0x9f2f, -- 0x0030, 0x080c, 0xb32e, 0x080c, 0x6af0, 0x080c, 0x8617, 0x0005, -- 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, 0x0002, 0xb157, 0xb157, -- 0xb157, 0xb15c, 0xb157, 0xb159, 0xb159, 0xb157, 0xb159, 0xa006, -- 0x0005, 0x00c6, 0x2260, 0x00ce, 0xa085, 0x0001, 0x0005, 0xa280, -- 0x0007, 0x2004, 0xa084, 0x000f, 0x0002, 0xb16e, 0xb16e, 0xb16e, -- 0xb16e, 0xb16e, 0xb16e, 0xb179, 0xb16e, 0xb16e, 0x6007, 0x003b, -- 0x602b, 0x0009, 0x6013, 0x2a00, 0x6003, 0x0001, 0x080c, 0x6c8e, -- 0x0005, 0x00c6, 0x2260, 0x080c, 0xb32e, 0x603f, 0x0000, 0x6020, -- 0xc0f4, 0xc0cc, 0x6022, 0x6037, 0x0000, 0x00ce, 0x00d6, 0x2268, -- 0xa186, 0x0007, 0x1904, 0xb1d4, 0x6810, 0xa005, 0x0138, 0xa080, -- 0x0013, 0x2004, 0xd0fc, 0x1110, 0x00de, 0x08c0, 0x6007, 0x003a, -- 0x6003, 0x0001, 0x080c, 0x6c8e, 0x080c, 0x7174, 0x00c6, 0x2d60, -- 0x6100, 0xa186, 0x0002, 0x1904, 0xb25d, 0x6010, 0xa005, 0x1138, -- 0x6000, 0xa086, 0x0007, 0x190c, 0x1515, 0x0804, 0xb25d, 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, 0xab4c, 0x0804, 0xb25d, -- 0x2009, 0x0041, 0x0804, 0xb257, 0xa186, 0x0005, 0x15f0, 0x6810, -- 0xa080, 0x0013, 0x2004, 0xd0bc, 0x1118, 0x00de, 0x0804, 0xb16e, -- 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x1515, 0x0804, 0xb18c, 0x6007, -- 0x003a, 0x6003, 0x0001, 0x080c, 0x6c8e, 0x080c, 0x7174, 0x00c6, -- 0x2d60, 0x6100, 0xa186, 0x0002, 0x0120, 0xa186, 0x0004, 0x1904, -- 0xb25d, 0x2071, 0xb823, 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, 0xb257, 0x0036, 0x00d6, 0x00d6, -- 0x080c, 0x15f8, 0x003e, 0x090c, 0x1515, 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, 0x5409, 0x2019, 0x0045, 0x6008, 0x2068, -- 0x080c, 0xacd4, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, -- 0x6017, 0x0000, 0x603f, 0x0000, 0x00de, 0x003e, 0x0038, 0x603f, -- 0x0000, 0x6003, 0x0007, 0x080c, 0xab4c, 0x00ce, 0x00de, 0x0005, -- 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x00c2, -- 0xa186, 0x0027, 0x1178, 0x080c, 0x7091, 0x0036, 0x00d6, 0x6010, -- 0x2068, 0x2019, 0x0004, 0x080c, 0xb08d, 0x00de, 0x003e, 0x080c, -- 0x7174, 0x0005, 0xa186, 0x0014, 0x0d70, 0x080c, 0x865d, 0x0005, -- 0xb289, 0xb287, 0xb287, 0xb287, 0xb287, 0xb287, 0xb289, 0x080c, -- 0x1515, 0x080c, 0x7091, 0x6003, 0x000c, 0x080c, 0x7174, 0x0005, -- 0xa182, 0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, -- 0x865d, 0x0005, 0xb2a1, 0xb2a1, 0xb2a1, 0xb2a1, 0xb2a3, 0xb2c1, -- 0xb2a1, 0x080c, 0x1515, 0x00d6, 0x2c68, 0x080c, 0x85c1, 0x01a0, -- 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0xbb8e, 0x210c, 0x6136, -- 0x2009, 0xbb8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a, -- 0x601f, 0x0004, 0x080c, 0x6c8e, 0x2d60, 0x080c, 0x8617, 0x00de, -- 0x0005, 0x080c, 0x8617, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, -- 0xd0ec, 0x00ee, 0x0005, 0x6010, 0xa08c, 0xf000, 0x0904, 0xb30f, -- 0xa080, 0x0013, 0x200c, 0xd1ec, 0x05d0, 0x2001, 0xb572, 0x2004, -- 0xd0ec, 0x05a8, 0x6003, 0x0002, 0x6020, 0xc0e5, 0x6022, 0xd1ac, -- 0x0180, 0x00f6, 0x2c78, 0x080c, 0x5302, 0x00fe, 0x0150, 0x2001, -- 0xb7b8, 0x2004, 0x603e, 0x2009, 0xb572, 0x210c, 0xd1f4, 0x11e8, -- 0x0080, 0x2009, 0xb572, 0x210c, 0xd1f4, 0x0128, 0x6020, 0xc0e4, -- 0x6022, 0xa006, 0x00a0, 0x2001, 0xb7b8, 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, 0x6af0, 0x080c, 0x8617, 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, 0xb528, 0x2204, 0xa084, 0x00ff, 0x2019, -- 0xbb8e, 0x2334, 0xa636, 0x11d8, 0x8318, 0x2334, 0x2204, 0xa084, -- 0xff00, 0xa636, 0x11a0, 0x2011, 0xbb90, 0x6018, 0xa098, 0x000a, -- 0x20a9, 0x0004, 0x080c, 0x90d4, 0x1150, 0x2011, 0xbb94, 0x6018, -- 0xa098, 0x0006, 0x20a9, 0x0004, 0x080c, 0x90d4, 0x1100, 0x015e, -- 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, 0xb500, 0x080c, 0x4bc7, -- 0x080c, 0x2ab8, 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, 0xb7e9, 0x252c, 0x2021, -- 0xb7ef, 0x2424, 0x2061, 0xbd00, 0x2071, 0xb500, 0x7648, 0x7068, -- 0xa606, 0x0578, 0x671c, 0xa786, 0x0001, 0x0118, 0xa786, 0x0008, -- 0x1500, 0x2500, 0xac06, 0x01e8, 0x2400, 0xac06, 0x01d0, 0x080c, -- 0xb104, 0x01b8, 0x080c, 0xb114, 0x11a0, 0x6000, 0xa086, 0x0004, -- 0x1120, 0x0016, 0x080c, 0x194d, 0x001e, 0x080c, 0x9e41, 0x1110, -- 0x080c, 0x2cc2, 0x080c, 0x9e52, 0x1110, 0x080c, 0x8c13, 0x080c, -- 0x9e17, 0xace0, 0x0018, 0x2001, 0xb517, 0x2004, 0xac02, 0x1208, -- 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, -- 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, -- 0x8000, 0x2071, 0xb540, 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, 0xb54a, 0x04c9, 0x001e, 0x00ee, -- 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, -- 0x8000, 0x2071, 0xb540, 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, 0xb54a, 0x0089, 0x001e, 0x00ee, -- 0x000e, 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, -- 0x2071, 0xb542, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e04, -- 0x8000, 0x2072, 0x1220, 0x8e70, 0x2e04, 0x8000, 0x2072, 0x0005, -- 0x00e6, 0x2071, 0xb540, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, -- 0xb544, 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, -- 0x8000, 0x2071, 0xb540, 0x7044, 0x8000, 0x7046, 0x00ee, 0x000e, -- 0x012e, 0x0005, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, -- 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, -- 0x4000, 0x8000, 0xada0 -+ 0xbb96, 0x080c, 0x90da, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, -+ 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0026, -+ 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0xbd00, 0x2079, 0x0001, -+ 0x8fff, 0x0904, 0xafef, 0x2071, 0xb500, 0x7648, 0x7068, 0x8001, -+ 0xa602, 0x1a04, 0xafef, 0x88ff, 0x0128, 0x2800, 0xac06, 0x15b0, -+ 0x2079, 0x0000, 0x080c, 0xb110, 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, 0xb33a, -+ 0x601f, 0x0007, 0x2001, 0xb7b6, 0x2004, 0x6016, 0x080c, 0x194d, -+ 0x6010, 0x2068, 0x080c, 0x9c5a, 0x0120, 0x0046, 0x080c, 0xb099, -+ 0x004e, 0x00de, 0x080c, 0x9e1d, 0x88ff, 0x1198, 0xace0, 0x0018, -+ 0x2001, 0xb517, 0x2004, 0xac02, 0x1210, 0x0804, 0xafa0, 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, 0x8130, 0x009e, 0x008e, 0x2039, 0x0000, -+ 0x080c, 0x81d6, 0x080c, 0xaf91, 0x005e, 0x007e, 0x0005, 0x0026, -+ 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, -+ 0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x4fa9, 0x11b0, -+ 0x2c10, 0x0056, 0x0086, 0x2041, 0x0000, 0x2508, 0x2029, 0x0001, -+ 0x0096, 0x2049, 0x0000, 0x080c, 0x8130, 0x009e, 0x008e, 0x2039, -+ 0x0000, 0x080c, 0x81d6, 0x080c, 0xaf91, 0x005e, 0x003e, 0x001e, -+ 0x8108, 0x1f04, 0xb023, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, -+ 0x002e, 0x0005, 0x0076, 0x0056, 0x6218, 0x0086, 0x2041, 0x0000, -+ 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x2049, 0x0000, 0x080c, -+ 0x8130, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x81d6, 0x2c20, -+ 0x080c, 0xaf91, 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, 0x0056, -+ 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x007f, 0x2009, 0x0000, -+ 0x0016, 0x0036, 0x080c, 0x4fa9, 0x11c0, 0x2c10, 0x0086, 0x2041, -+ 0x0000, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xb31c, 0x004e, -+ 0x0096, 0x2049, 0x0000, 0x080c, 0x8130, 0x009e, 0x008e, 0x2039, -+ 0x0000, 0x080c, 0x81d6, 0x080c, 0xaf91, 0x003e, 0x001e, 0x8108, -+ 0x1f04, 0xb070, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x002e, -+ 0x0005, 0x0016, 0x00f6, 0x3800, 0xd08c, 0x0130, 0xad82, 0x1000, -+ 0x02b0, 0xad82, 0xb500, 0x0230, 0xad82, 0xed00, 0x0280, 0xad82, -+ 0xffff, 0x1268, 0x6800, 0xa07d, 0x0138, 0x6803, 0x0000, 0x6b52, -+ 0x080c, 0x5408, 0x2f68, 0x0cb0, 0x6b52, 0x080c, 0x5408, 0x00fe, -+ 0x001e, 0x0005, 0x00e6, 0x0046, 0x0036, 0x2061, 0xbd00, 0xa005, -+ 0x1138, 0x2071, 0xb500, 0x7448, 0x7068, 0x8001, 0xa402, 0x12d8, -+ 0x2100, 0xac06, 0x0168, 0x6000, 0xa086, 0x0000, 0x0148, 0x6008, -+ 0xa206, 0x1130, 0x6018, 0xa1a0, 0x0006, 0x2424, 0xa406, 0x0140, -+ 0xace0, 0x0018, 0x2001, 0xb517, 0x2004, 0xac02, 0x1220, 0x0c40, -+ 0xa085, 0x0001, 0x0008, 0xa006, 0x003e, 0x004e, 0x00ee, 0x0005, -+ 0x00d6, 0x0006, 0x080c, 0x15f8, 0x000e, 0x090c, 0x1515, 0x6837, -+ 0x010d, 0x685e, 0x0026, 0x2010, 0x080c, 0x9c4a, 0x2001, 0x0000, -+ 0x0120, 0x2200, 0xa080, 0x0014, 0x2004, 0x002e, 0x684a, 0x6956, -+ 0x6c46, 0x684f, 0x0000, 0x2001, 0xb7be, 0x2004, 0x6852, 0xa006, -+ 0x68b2, 0x6802, 0x683a, 0x685a, 0x080c, 0x5408, 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, 0xb7b7, 0x2004, 0x6016, 0x080c, 0x6c8d, 0x080c, 0x7173, -+ 0x001e, 0x0005, 0xe000, 0xe000, 0x0005, 0x6020, 0xd0e4, 0x0158, -+ 0xd0cc, 0x0118, 0x080c, 0x9f35, 0x0030, 0x080c, 0xb33a, 0x080c, -+ 0x6aef, 0x080c, 0x861d, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, -+ 0x000f, 0x0002, 0xb163, 0xb163, 0xb163, 0xb168, 0xb163, 0xb165, -+ 0xb165, 0xb163, 0xb165, 0xa006, 0x0005, 0x00c6, 0x2260, 0x00ce, -+ 0xa085, 0x0001, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, 0x000f, -+ 0x0002, 0xb17a, 0xb17a, 0xb17a, 0xb17a, 0xb17a, 0xb17a, 0xb185, -+ 0xb17a, 0xb17a, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, 0x2a00, -+ 0x6003, 0x0001, 0x080c, 0x6c8d, 0x0005, 0x00c6, 0x2260, 0x080c, -+ 0xb33a, 0x603f, 0x0000, 0x6020, 0xc0f4, 0xc0cc, 0x6022, 0x6037, -+ 0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186, 0x0007, 0x1904, 0xb1e0, -+ 0x6810, 0xa005, 0x0138, 0xa080, 0x0013, 0x2004, 0xd0fc, 0x1110, -+ 0x00de, 0x08c0, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x6c8d, -+ 0x080c, 0x7173, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, 0x1904, -+ 0xb269, 0x6010, 0xa005, 0x1138, 0x6000, 0xa086, 0x0007, 0x190c, -+ 0x1515, 0x0804, 0xb269, 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, 0xab56, 0x0804, 0xb269, 0x2009, 0x0041, 0x0804, 0xb263, -+ 0xa186, 0x0005, 0x15f0, 0x6810, 0xa080, 0x0013, 0x2004, 0xd0bc, -+ 0x1118, 0x00de, 0x0804, 0xb17a, 0xd0b4, 0x0128, 0xd0fc, 0x090c, -+ 0x1515, 0x0804, 0xb198, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, -+ 0x6c8d, 0x080c, 0x7173, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, -+ 0x0120, 0xa186, 0x0004, 0x1904, 0xb269, 0x2071, 0xb823, 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, -+ 0xb263, 0x0036, 0x00d6, 0x00d6, 0x080c, 0x15f8, 0x003e, 0x090c, -+ 0x1515, 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, 0x5408, -+ 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xace0, 0x2d00, 0x600a, -+ 0x601f, 0x0006, 0x6003, 0x0007, 0x6017, 0x0000, 0x603f, 0x0000, -+ 0x00de, 0x003e, 0x0038, 0x603f, 0x0000, 0x6003, 0x0007, 0x080c, -+ 0xab56, 0x00ce, 0x00de, 0x0005, 0xa186, 0x0013, 0x1128, 0x6004, -+ 0xa082, 0x0085, 0x2008, 0x00c2, 0xa186, 0x0027, 0x1178, 0x080c, -+ 0x7090, 0x0036, 0x00d6, 0x6010, 0x2068, 0x2019, 0x0004, 0x080c, -+ 0xb099, 0x00de, 0x003e, 0x080c, 0x7173, 0x0005, 0xa186, 0x0014, -+ 0x0d70, 0x080c, 0x8663, 0x0005, 0xb295, 0xb293, 0xb293, 0xb293, -+ 0xb293, 0xb293, 0xb295, 0x080c, 0x1515, 0x080c, 0x7090, 0x6003, -+ 0x000c, 0x080c, 0x7173, 0x0005, 0xa182, 0x008c, 0x1220, 0xa182, -+ 0x0085, 0x0208, 0x001a, 0x080c, 0x8663, 0x0005, 0xb2ad, 0xb2ad, -+ 0xb2ad, 0xb2ad, 0xb2af, 0xb2cd, 0xb2ad, 0x080c, 0x1515, 0x00d6, -+ 0x2c68, 0x080c, 0x85c7, 0x01a0, 0x6003, 0x0001, 0x6007, 0x001e, -+ 0x2009, 0xbb8e, 0x210c, 0x6136, 0x2009, 0xbb8f, 0x210c, 0x613a, -+ 0x600b, 0xffff, 0x6918, 0x611a, 0x601f, 0x0004, 0x080c, 0x6c8d, -+ 0x2d60, 0x080c, 0x861d, 0x00de, 0x0005, 0x080c, 0x861d, 0x0005, -+ 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec, 0x00ee, 0x0005, 0x6010, -+ 0xa08c, 0xf000, 0x0904, 0xb31b, 0xa080, 0x0013, 0x200c, 0xd1ec, -+ 0x05d0, 0x2001, 0xb572, 0x2004, 0xd0ec, 0x05a8, 0x6003, 0x0002, -+ 0x6020, 0xc0e5, 0x6022, 0xd1ac, 0x0180, 0x00f6, 0x2c78, 0x080c, -+ 0x5301, 0x00fe, 0x0150, 0x2001, 0xb7b8, 0x2004, 0x603e, 0x2009, -+ 0xb572, 0x210c, 0xd1f4, 0x11e8, 0x0080, 0x2009, 0xb572, 0x210c, -+ 0xd1f4, 0x0128, 0x6020, 0xc0e4, 0x6022, 0xa006, 0x00a0, 0x2001, -+ 0xb7b8, 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, 0x6aef, 0x080c, -+ 0x861d, 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, 0xb528, -+ 0x2204, 0xa084, 0x00ff, 0x2019, 0xbb8e, 0x2334, 0xa636, 0x11d8, -+ 0x8318, 0x2334, 0x2204, 0xa084, 0xff00, 0xa636, 0x11a0, 0x2011, -+ 0xbb90, 0x6018, 0xa098, 0x000a, 0x20a9, 0x0004, 0x080c, 0x90da, -+ 0x1150, 0x2011, 0xbb94, 0x6018, 0xa098, 0x0006, 0x20a9, 0x0004, -+ 0x080c, 0x90da, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, -+ 0x2071, 0xb500, 0x080c, 0x4bc6, 0x080c, 0x2ab8, 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, 0xb7e9, 0x252c, 0x2021, 0xb7ef, 0x2424, 0x2061, 0xbd00, -+ 0x2071, 0xb500, 0x7648, 0x7068, 0xa606, 0x0578, 0x671c, 0xa786, -+ 0x0001, 0x0118, 0xa786, 0x0008, 0x1500, 0x2500, 0xac06, 0x01e8, -+ 0x2400, 0xac06, 0x01d0, 0x080c, 0xb110, 0x01b8, 0x080c, 0xb120, -+ 0x11a0, 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x194d, -+ 0x001e, 0x080c, 0x9e47, 0x1110, 0x080c, 0x2cc2, 0x080c, 0x9e58, -+ 0x1110, 0x080c, 0x8c19, 0x080c, 0x9e1d, 0xace0, 0x0018, 0x2001, -+ 0xb517, 0x2004, 0xac02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, -+ 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, 0x00ee, 0x0005, 0x0126, -+ 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0xb540, 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, -+ 0xb54a, 0x04c9, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, -+ 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, 0xb540, 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, -+ 0xb54a, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0126, -+ 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xb542, 0x0021, 0x00ee, -+ 0x000e, 0x012e, 0x0005, 0x2e04, 0x8000, 0x2072, 0x1220, 0x8e70, -+ 0x2e04, 0x8000, 0x2072, 0x0005, 0x00e6, 0x2071, 0xb540, 0x0c99, -+ 0x00ee, 0x0005, 0x00e6, 0x2071, 0xb544, 0x0c69, 0x00ee, 0x0005, -+ 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xb540, 0x7044, -+ 0x8000, 0x7046, 0x00ee, 0x000e, 0x012e, 0x0005, 0x0001, 0x0002, -+ 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, -+ 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x2440 - }; - #ifdef UNIQUE_FW_NAME --unsigned short fw2200tp_length01 = 0xa463; -+unsigned short fw2200tp_length01 = 0xa46f; - #else --unsigned short risc_code_length01 = 0xa463; -+unsigned short risc_code_length01 = 0xa46f; - #endif - -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2200ip_fw.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2200ip_fw.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2200ip_fw.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2200ip_fw.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -24,8 +24,9 @@ - * expanded LUN addressing for FCTAPE * - * * - ************************************************************************/ -+ - /* -- * Firmware Version 2.02.04 (08:22 Feb 28, 2003) -+ * Firmware Version 2.02.06 (08:44 Jun 26, 2003) - */ - - #ifdef UNIQUE_FW_NAME -@@ -35,15 +36,15 @@ unsigned short risc_code_version = 2*102 - #endif - - #ifdef UNIQUE_FW_NAME --unsigned char fw2200ip_version_str[] = {2,2,4}; -+unsigned char fw2200ip_version_str[] = {2,2,6}; - #else --unsigned char firmware_version[] = {2,2,4}; -+unsigned char firmware_version[] = {2,2,6}; - #endif - - #ifdef UNIQUE_FW_NAME --#define fw2200ip_VERSION_STRING "2.02.04" -+#define fw2200ip_VERSION_STRING "2.02.06" - #else --#define FW_VERSION_STRING "2.02.04" -+#define FW_VERSION_STRING "2.02.06" - #endif - - #ifdef UNIQUE_FW_NAME -@@ -57,17 +58,17 @@ unsigned short fw2200ip_code01[] = { - #else - unsigned short risc_code01[] = { - #endif -- 0x0470, 0x0000, 0x0000, 0xb5b9, 0x0000, 0x0002, 0x0002, 0x0004, -+ 0x0470, 0x0000, 0x0000, 0xb5df, 0x0000, 0x0002, 0x0002, 0x0006, - 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, 0x3420, 0x2020, 0x2020, 0x2400, 0x20c1, -+ 0x322e, 0x3032, 0x2e30, 0x3620, 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, 0xc5b9, 0xa00e, -- 0x20a9, 0x0847, 0x41a4, 0x3400, 0x7562, 0x7666, 0x775e, 0x746a, -+ 0xfde9, 0x2021, 0x0200, 0x0804, 0x146c, 0x20a1, 0xc5df, 0xa00e, -+ 0x20a9, 0x0821, 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, -@@ -76,65 +77,65 @@ unsigned short risc_code01[] = { - 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, 0x957e, 0x080c, 0x15bf, 0x080c, -- 0x306e, 0x080c, 0x61dd, 0x080c, 0x5743, 0x080c, 0x7147, 0x080c, -- 0x6edf, 0x080c, 0x265b, 0x080c, 0x7860, 0x080c, 0x68c0, 0x080c, -+ 0x2061, 0x080c, 0x4f54, 0x080c, 0x959e, 0x080c, 0x15bf, 0x080c, -+ 0x306e, 0x080c, 0x61f6, 0x080c, 0x575c, 0x080c, 0x7160, 0x080c, -+ 0x6ef8, 0x080c, 0x265b, 0x080c, 0x7879, 0x080c, 0x68d9, 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, -+ 0x40d2, 0x080c, 0x3095, 0x080c, 0x6244, 0x080c, 0x595c, 0x080c, -+ 0x719d, 0x080c, 0x6f23, 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, -+ 0x1904, 0x11f1, 0x080c, 0x158c, 0x080c, 0x5f3b, 0x0150, 0x080c, -+ 0x5f61, 0x15c0, 0x2079, 0x0100, 0x7828, 0xa085, 0x1800, 0x782a, -+ 0x0488, 0x080c, 0x5e73, 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, -+ 0x7a2a, 0x2011, 0x5e0e, 0x080c, 0x6fc6, 0x2011, 0x5e01, 0x080c, -+ 0x7089, 0x2011, 0x5e50, 0x080c, 0x6fc6, 0x2011, 0x4e31, 0x080c, -+ 0x6fc6, 0x2011, 0x8030, 0x2019, 0x0000, 0x708b, 0x0000, 0x080c, -+ 0x1eae, 0x00e8, 0x080c, 0x47e4, 0x2079, 0x0100, 0x7844, 0xa005, -+ 0x1904, 0x11f1, 0x2011, 0x4e31, 0x080c, 0x6fc6, 0x2011, 0x5e50, -+ 0x080c, 0x6fc6, 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, 0xac90, 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, 0xb038, 0x70d4, 0xd09c, 0x1128, 0x70a0, 0xa005, 0x0110, -- 0x080c, 0x4f02, 0x70df, 0x0000, 0x70db, 0x0000, 0x72d4, 0x080c, -- 0x5f22, 0x1178, 0x2011, 0x0000, 0x0016, 0x080c, 0x2a95, 0x2019, -+ 0x4096, 0x723c, 0xc284, 0x723e, 0x2001, 0xc60c, 0x200c, 0xc1ac, -+ 0x2102, 0x080c, 0x8de3, 0x2011, 0x0004, 0x080c, 0xacb0, 0x080c, -+ 0x55fa, 0x080c, 0x5f3b, 0x0158, 0x080c, 0x4f3d, 0x0140, 0x708b, -+ 0x0001, 0x70c7, 0x0000, 0x080c, 0x4981, 0x0804, 0x11f1, 0x080c, -+ 0x5724, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x0060, 0x7073, 0x0000, -+ 0x080c, 0xb058, 0x70d4, 0xd09c, 0x1128, 0x70a0, 0xa005, 0x0110, -+ 0x080c, 0x4f1b, 0x70df, 0x0000, 0x70db, 0x0000, 0x72d4, 0x080c, -+ 0x5f3b, 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, 0xac90, 0x709b, 0x0000, 0x709f, 0xffff, 0x7003, 0x0002, -+ 0x080c, 0x5f3b, 0x0118, 0xa296, 0x0004, 0x0548, 0x2011, 0x0001, -+ 0x080c, 0xacb0, 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, -+ 0x00fe, 0x080c, 0x2c62, 0x2011, 0x0005, 0x080c, 0x8f27, 0x080c, -+ 0x7ead, 0x080c, 0x5f3b, 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, -+ 0x0005, 0x080c, 0x8f27, 0x080c, 0x7ead, 0x080c, 0x5f3b, 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, -+ 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5f3b, 0x1118, -+ 0x20a9, 0x0100, 0x0010, 0x20a9, 0x0082, 0x080c, 0x5f3b, 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, -+ 0x080c, 0x2c62, 0x080c, 0x7ead, 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, -+ 0x7ead, 0x70d4, 0xd094, 0x1904, 0x12df, 0x2011, 0x0001, 0x2019, -+ 0x0000, 0x080c, 0x2df9, 0x080c, 0x7ead, 0x0804, 0x12df, 0x70dc, - 0xa005, 0x1904, 0x12df, 0x7098, 0xa005, 0x1904, 0x12df, 0x70d4, -- 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x12df, 0x080c, 0x570b, 0x1904, -+ 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x12df, 0x080c, 0x5724, 0x1904, - 0x12df, 0x2001, 0xc653, 0x2004, 0xd0ac, 0x01c8, 0x0156, 0x00c6, -- 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x533d, 0x1118, -+ 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x5356, 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, -@@ -144,55 +145,55 @@ unsigned short risc_code01[] = { - 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, -+ 0x080c, 0x296d, 0x080c, 0x4108, 0x00f6, 0x2079, 0x0100, 0x080c, -+ 0x5f61, 0x0150, 0x080c, 0x5f3b, 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, -+ 0xa086, 0x0005, 0x1120, 0x2011, 0x0000, 0x080c, 0x8f27, 0x2011, -+ 0x0000, 0x080c, 0x8f31, 0x080c, 0x7ead, 0x080c, 0x7f87, 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, -+ 0x2009, 0x00f7, 0x080c, 0x4f04, 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, -+ 0x080c, 0x5f4d, 0x0158, 0x080c, 0x5f61, 0x1128, 0x2001, 0xc8e5, -+ 0x2003, 0x0000, 0x0070, 0x080c, 0x5f43, 0x0dc0, 0x2001, 0xc8e5, -+ 0x2003, 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x080c, 0x5e73, -+ 0x0058, 0x080c, 0x5f3b, 0x0140, 0x2009, 0x00f8, 0x080c, 0x4f04, - 0x7843, 0x0090, 0x7843, 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, -- 0x1138, 0x080c, 0x5f22, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x13f9, -- 0x1f04, 0x132e, 0x0070, 0x7824, 0x080c, 0x5f3e, 0x0118, 0xd0ac, -+ 0x1138, 0x080c, 0x5f3b, 0x0138, 0x7824, 0xd0ac, 0x1904, 0x13f9, -+ 0x1f04, 0x132e, 0x0070, 0x7824, 0x080c, 0x5f57, 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, -+ 0x1357, 0x080c, 0x7071, 0x1f04, 0x1357, 0x7850, 0xa084, 0x0180, -+ 0xa085, 0x0400, 0x7852, 0x782f, 0x0000, 0x080c, 0x5f4d, 0x0158, -+ 0x080c, 0x5f61, 0x1128, 0x2001, 0xc8e5, 0x2003, 0x0000, 0x0070, -+ 0x080c, 0x5f43, 0x0dc0, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x2001, -+ 0xc8e6, 0x2003, 0x0001, 0x080c, 0x5e73, 0x0020, 0x2009, 0x00f8, -+ 0x080c, 0x4f04, 0x20a9, 0x000e, 0xe000, 0x1f04, 0x1384, 0x7850, -+ 0xa084, 0x0180, 0xa085, 0x1400, 0x7852, 0x080c, 0x5f3b, 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, -+ 0x7820, 0xd09c, 0x1558, 0x080c, 0x5f3b, 0x05d8, 0x7824, 0xd0ac, -+ 0x1904, 0x13f9, 0x080c, 0x5f61, 0x1508, 0x0046, 0x2021, 0x0190, - 0x8421, 0x1df0, 0x004e, 0x8421, 0x11c8, 0x7827, 0x0048, 0x20a9, -- 0x01f4, 0x1d04, 0x13b1, 0x080c, 0x7058, 0x1f04, 0x13b1, 0x7824, -+ 0x01f4, 0x1d04, 0x13b1, 0x080c, 0x7071, 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, -+ 0x080c, 0x7071, 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, -+ 0x00d8, 0x080c, 0x5f4d, 0x1140, 0xa4a2, 0x0064, 0x1128, 0x080c, -+ 0x5f12, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0xe000, 0xe000, -+ 0x7824, 0x080c, 0x5f57, 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, 0x0004, 0x600f, 0x0037, -+ 0x2063, 0x0002, 0x6007, 0x0002, 0x600b, 0x0006, 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, -- 0xb038, 0x2061, 0xc8d5, 0x6003, 0x0909, 0x6007, 0x0000, 0x600b, -+ 0xb058, 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, -@@ -217,7 +218,7 @@ unsigned short risc_code01[] = { - 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, -+ 0x0000, 0x080c, 0x5356, 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, -@@ -305,15 +306,15 @@ unsigned short risc_code01[] = { - 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, -+ 0x013e, 0x7007, 0x0000, 0x080c, 0x62db, 0x080c, 0x1676, 0x0005, -+ 0x2011, 0x8003, 0x080c, 0x4096, 0x0cf8, 0xa18c, 0x0700, 0x1148, - 0x2001, 0xc748, 0x2003, 0x0100, 0x7007, 0x0000, 0x080c, 0x1676, -- 0x0005, 0x2011, 0x8004, 0x080c, 0x407d, 0x0cf8, 0x0126, 0x2091, -+ 0x0005, 0x2011, 0x8004, 0x080c, 0x4096, 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, -+ 0x1858, 0x080c, 0x769d, 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, -@@ -346,7 +347,7 @@ unsigned short risc_code01[] = { - 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, 0x960c, 0x04f8, -+ 0x0004, 0x1904, 0x194f, 0x2009, 0x0048, 0x080c, 0x962c, 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, -@@ -354,7 +355,7 @@ unsigned short risc_code01[] = { - 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, 0x960c, 0x00ce, -+ 0xa18e, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, 0x962c, 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, -@@ -363,8 +364,8 @@ unsigned short risc_code01[] = { - 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, -+ 0x005e, 0x002e, 0x2001, 0x015d, 0x2003, 0x0000, 0x080c, 0x5f3b, -+ 0x1138, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fbd, 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, -@@ -372,19 +373,19 @@ unsigned short risc_code01[] = { - 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, -+ 0x080c, 0x783d, 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, -+ 0x769d, 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, -+ 0x0cc0, 0x080c, 0x769d, 0x1128, 0x080c, 0x1953, 0x080c, 0x7633, - 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, 0xafca, 0x0990, -+ 0xa303, 0x6816, 0x003e, 0x004e, 0x0018, 0x080c, 0xafea, 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, -@@ -405,11 +406,11 @@ unsigned short risc_code01[] = { - 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, -+ 0x00de, 0x00d6, 0x080c, 0x7313, 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, -+ 0xffff, 0x1130, 0x2d10, 0x00de, 0x00d6, 0x080c, 0x7313, 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, -@@ -422,38 +423,38 @@ unsigned short risc_code01[] = { - 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, 0xac8a, 0x0170, 0x6808, 0x8001, -+ 0x0000, 0x080c, 0x1ec3, 0x080c, 0xacaa, 0x0170, 0x6808, 0x8001, - 0x680a, 0x697c, 0x6912, 0x6980, 0x6916, 0x682b, 0xffff, 0x682f, -- 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c, 0xa95a, 0x0804, -+ 0xffff, 0x6850, 0xc0bd, 0x6852, 0x00de, 0x080c, 0xa97a, 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, -+ 0xd1bc, 0x15c0, 0x080c, 0x769d, 0x1508, 0xd1dc, 0x1598, 0x6864, - 0x8000, 0x6866, 0xd19c, 0x0140, 0x7004, 0x2060, 0x2009, 0x0102, -- 0x080c, 0x960c, 0x0804, 0x1cbc, 0x8aff, 0x0130, 0x2009, 0x0001, -+ 0x080c, 0x962c, 0x0804, 0x1cbc, 0x8aff, 0x0130, 0x2009, 0x0001, - 0x080c, 0x1a5f, 0x0804, 0x1dec, 0x7004, 0x2060, 0x080c, 0x24e0, -- 0x080c, 0x761a, 0x7007, 0x0000, 0x0804, 0x1c45, 0xd19c, 0x1904, -+ 0x080c, 0x7633, 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, -+ 0x1c4b, 0x080c, 0x769d, 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, -+ 0x0028, 0x080c, 0x769d, 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, 0x960c, -+ 0xd0e4, 0x0130, 0x7004, 0x2060, 0x2009, 0x0048, 0x080c, 0x962c, - 0x7000, 0xa086, 0x0004, 0x0904, 0x1dec, 0x7003, 0x0000, 0x080c, - 0x19c0, 0x0804, 0x1dec, 0x0056, 0x7d0c, 0xd5bc, 0x1110, 0x080c, -- 0xc551, 0x005e, 0x080c, 0x1ec3, 0x7004, 0x2060, 0x601c, 0xa086, -- 0x0009, 0x1140, 0x2009, 0x0106, 0x080c, 0x960c, 0x7007, 0x0000, -- 0x0804, 0x1dec, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56c3, 0x0118, -+ 0xc577, 0x005e, 0x080c, 0x1ec3, 0x7004, 0x2060, 0x601c, 0xa086, -+ 0x0009, 0x1140, 0x2009, 0x0106, 0x080c, 0x962c, 0x7007, 0x0000, -+ 0x0804, 0x1dec, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56dc, 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, -@@ -464,14 +465,14 @@ unsigned short risc_code01[] = { - 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, 0x960c, 0x080c, 0x19c0, 0x0804, 0x1dec, -+ 0x2009, 0x0048, 0x080c, 0x962c, 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, 0x960c, 0x080c, 0x1fae, 0x0838, 0x8001, 0x7002, 0xd194, -+ 0x080c, 0x962c, 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, -@@ -487,8 +488,8 @@ unsigned short risc_code01[] = { - 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, 0xc551, 0x005e, -- 0x080c, 0x1ec3, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56c3, 0x0118, -+ 0x002e, 0x0804, 0x1cbc, 0x0056, 0x7d0c, 0x080c, 0xc577, 0x005e, -+ 0x080c, 0x1ec3, 0x00f6, 0x7004, 0x2078, 0x080c, 0x56dc, 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, -@@ -499,14 +500,14 @@ unsigned short risc_code01[] = { - 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, 0x960c, -+ 0x601c, 0xa086, 0x0009, 0x1110, 0x080c, 0x1519, 0x080c, 0x962c, - 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, -+ 0x6820, 0xd0d4, 0x1904, 0x1e94, 0x6810, 0x2068, 0x080c, 0x769d, - 0x0904, 0x1e94, 0x6850, 0xd0fc, 0x05a8, 0x8108, 0x2104, 0x6b2c, - 0xa306, 0x1904, 0x1e94, 0x8108, 0x2104, 0x6a28, 0xa206, 0x1904, - 0x1e94, 0x6850, 0xc0fc, 0xc0f5, 0x6852, 0x686c, 0x7822, 0x701a, -@@ -529,10 +530,10 @@ unsigned short risc_code01[] = { - 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, -+ 0xc977, 0x012e, 0x0005, 0x00c6, 0x080c, 0x5f3b, 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, -+ 0x0000, 0x080c, 0x5fbd, 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, -@@ -544,7 +545,7 @@ unsigned short risc_code01[] = { - 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, -+ 0x5f3b, 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, -@@ -580,7 +581,7 @@ unsigned short risc_code01[] = { - 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, -+ 0x00fe, 0x00ee, 0x7804, 0xd0ac, 0x190c, 0x1519, 0x080c, 0x7f87, - 0x0005, 0x00e6, 0x2071, 0xc992, 0x7003, 0x0000, 0x00ee, 0x0005, - 0x00d6, 0xa280, 0x0004, 0x206c, 0x694c, 0xd1dc, 0x1904, 0x20ed, - 0x6934, 0xa184, 0x0007, 0x0002, 0x207c, 0x20d8, 0x207c, 0x207e, -@@ -632,13 +633,13 @@ unsigned short risc_code01[] = { - 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, 0xac8a, 0x0118, 0x6850, 0xc0bd, -+ 0x00d6, 0x6010, 0x2068, 0x080c, 0xacaa, 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, -- 0xa95a, 0x00ce, 0x2001, 0xc936, 0x2004, 0xac06, 0x1150, 0x20e1, -- 0x9040, 0x080c, 0x90ef, 0x2011, 0x0000, 0x080c, 0x8f18, 0x080c, -- 0x7f6e, 0x002e, 0x0804, 0x22e6, 0x0126, 0x2091, 0x2400, 0x0006, -+ 0xa97a, 0x00ce, 0x2001, 0xc936, 0x2004, 0xac06, 0x1150, 0x20e1, -+ 0x9040, 0x080c, 0x910f, 0x2011, 0x0000, 0x080c, 0x8f31, 0x080c, -+ 0x7f87, 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, -@@ -665,7 +666,7 @@ unsigned short risc_code01[] = { - 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, 0xc59a, 0x2001, 0x0133, -+ 0x210c, 0xa184, 0x0003, 0x0168, 0x080c, 0xc5c0, 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, -@@ -673,11 +674,11 @@ unsigned short risc_code01[] = { - 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, 0xac8a, 0x0158, 0x6850, -+ 0x7004, 0x2060, 0x6010, 0x2068, 0x080c, 0xacaa, 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, 0xa95a, -- 0x20e1, 0x9040, 0x080c, 0x90ef, 0x2011, 0x0000, 0x080c, 0x8f18, -+ 0x7803, 0x0004, 0x7003, 0x0000, 0x7004, 0x2060, 0x080c, 0xa97a, -+ 0x20e1, 0x9040, 0x080c, 0x910f, 0x2011, 0x0000, 0x080c, 0x8f31, - 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x0005, 0x6810, 0x6a14, - 0xa205, 0x1d00, 0x684c, 0xc0dc, 0x684e, 0x2c10, 0x080c, 0x2068, - 0x2001, 0x0105, 0x2003, 0x0010, 0x20e1, 0x9040, 0x7803, 0x0004, -@@ -698,8 +699,8 @@ unsigned short risc_code01[] = { - 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, -+ 0x2001, 0xc765, 0x2004, 0x2010, 0x080c, 0x72c6, 0x2009, 0xc699, -+ 0x2104, 0xa084, 0xfffc, 0x200a, 0x080c, 0x7238, 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, -@@ -729,7 +730,7 @@ unsigned short risc_code01[] = { - 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, -+ 0x2004, 0x2068, 0x080c, 0x769d, 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, -@@ -739,16 +740,16 @@ unsigned short risc_code01[] = { - 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, 0xc59a, -+ 0x68e2, 0x0078, 0x080c, 0x692f, 0x0060, 0x080c, 0x68e2, 0x080c, -+ 0x692f, 0x0038, 0x0041, 0x0028, 0x0031, 0x0018, 0x0021, 0x0008, -+ 0x0011, 0x012e, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xc5c0, - 0x7930, 0xa184, 0x0003, 0x01b0, 0x2001, 0xc936, 0x2004, 0xa005, - 0x0170, 0x2001, 0x0133, 0x2004, 0xa005, 0x090c, 0x1519, 0x00c6, -- 0x2001, 0xc936, 0x2064, 0x080c, 0xa95a, 0x00ce, 0x04b8, 0x20e1, -+ 0x2001, 0xc936, 0x2064, 0x080c, 0xa97a, 0x00ce, 0x04b8, 0x20e1, - 0x9040, 0x04a0, 0xa184, 0x0030, 0x01e0, 0x6a00, 0xa286, 0x0003, -- 0x1108, 0x00a0, 0x080c, 0x5f22, 0x1178, 0x2001, 0xc8e6, 0x2003, -+ 0x1108, 0x00a0, 0x080c, 0x5f3b, 0x1178, 0x2001, 0xc8e6, 0x2003, - 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, -- 0x5f66, 0x080c, 0x5e5a, 0x0010, 0x080c, 0x4e5b, 0x080c, 0x25fb, -+ 0x5f7f, 0x080c, 0x5e73, 0x0010, 0x080c, 0x4e74, 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, -@@ -780,85 +781,85 @@ unsigned short risc_code01[] = { - 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, -+ 0x26a1, 0x26a4, 0x26a9, 0x26ab, 0x26af, 0x26b3, 0x080c, 0x788c, -+ 0x00b8, 0x080c, 0x7967, 0x00a0, 0x080c, 0x7967, 0x080c, 0x788c, -+ 0x0078, 0x0099, 0x0068, 0x080c, 0x788c, 0x0079, 0x0048, 0x080c, -+ 0x7967, 0x0059, 0x0028, 0x080c, 0x7967, 0x080c, 0x788c, 0x0029, - 0x002e, 0x001e, 0x000e, 0x012e, 0x0005, 0x6124, 0x6028, 0xd09c, -- 0x0118, 0xd19c, 0x1904, 0x2910, 0x080c, 0x5f22, 0x0578, 0x7000, -+ 0x0118, 0xd19c, 0x1904, 0x2910, 0x080c, 0x5f3b, 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, -+ 0x5f61, 0x0118, 0x080c, 0x5f4d, 0x1148, 0x6027, 0x0020, 0x6043, -+ 0x0000, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x0458, 0x080c, 0x5f61, - 0x15d0, 0x6024, 0xa084, 0x1800, 0x1108, 0x04a8, 0x2001, 0xc8e5, - 0x2003, 0xaaaa, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, -- 0x2003, 0x0001, 0x080c, 0x5e5a, 0x0804, 0x2910, 0xd1ac, 0x1518, -+ 0x2003, 0x0001, 0x080c, 0x5e73, 0x0804, 0x2910, 0xd1ac, 0x1518, - 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1188, 0xd0d4, 0x11a0, 0xd0cc, -- 0x0130, 0x708c, 0xa086, 0x0028, 0x1110, 0x080c, 0x60b1, 0x0804, -+ 0x0130, 0x708c, 0xa086, 0x0028, 0x1110, 0x080c, 0x60ca, 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, -+ 0x2003, 0x0002, 0x0020, 0x080c, 0x603d, 0x0804, 0x2910, 0x080c, -+ 0x616f, 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, -+ 0xc3bc, 0x632a, 0x003e, 0x080c, 0x5f3b, 0x11d8, 0x6027, 0x0020, -+ 0x0006, 0x0026, 0x0036, 0x080c, 0x5f57, 0x1170, 0x2001, 0xc8e6, -+ 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0x080c, 0x5e73, - 0x003e, 0x002e, 0x000e, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, -- 0x5ef9, 0x0016, 0x0046, 0x00c6, 0x644c, 0xa486, 0xf0f0, 0x1138, -+ 0x5f12, 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, -+ 0x8016, 0x080c, 0x4096, 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, -+ 0x8013, 0x080c, 0x4096, 0x003e, 0x0804, 0x2819, 0x7034, 0xd08c, - 0x1140, 0x2001, 0xc60c, 0x200c, 0xd1ac, 0x1904, 0x2819, 0xc1ad, -- 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c, 0x407d, 0x003e, -+ 0x2102, 0x0036, 0x73cc, 0x2011, 0x8013, 0x080c, 0x4096, 0x003e, - 0x7130, 0xc185, 0x7132, 0x2011, 0xc653, 0x220c, 0xd1a4, 0x01d0, -- 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x712e, 0x2019, -- 0x000e, 0x080c, 0xc100, 0xa484, 0x00ff, 0xa080, 0x2f6e, 0x200d, -+ 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x7147, 0x2019, -+ 0x000e, 0x080c, 0xc126, 0xa484, 0x00ff, 0xa080, 0x2f6e, 0x200d, - 0xa18c, 0xff00, 0x810f, 0x8127, 0xa006, 0x2009, 0x000e, 0x080c, -- 0xc183, 0x001e, 0x0016, 0x2009, 0x0000, 0x2019, 0x0004, 0x080c, -+ 0xc1a9, 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, -+ 0x080c, 0x5356, 0x1110, 0x080c, 0x4f60, 0x8108, 0x1f04, 0x2810, -+ 0x015e, 0x00ce, 0x004e, 0x2011, 0x0003, 0x080c, 0x8f27, 0x2011, -+ 0x0002, 0x080c, 0x8f31, 0x080c, 0x8e07, 0x0036, 0x2019, 0x0000, -+ 0x080c, 0x8e92, 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, -+ 0x0020, 0x080c, 0x5f61, 0x1140, 0x0016, 0x2009, 0x07d0, 0x2011, -+ 0x5e50, 0x080c, 0x704f, 0x001e, 0xd194, 0x0904, 0x2910, 0x0016, -+ 0x6220, 0xd2b4, 0x0904, 0x28b5, 0x080c, 0x703d, 0x080c, 0x8c0e, - 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, 0x95dc, -+ 0x1000, 0x6803, 0x0000, 0x618e, 0x628a, 0x080c, 0x7dca, 0x080c, -+ 0x7ead, 0x7810, 0x2070, 0x7037, 0x0103, 0x2f60, 0x080c, 0x95fc, - 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, -+ 0x00c8, 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0x8c01, 0x0804, - 0x290f, 0x2019, 0xc930, 0x2304, 0xa065, 0x0120, 0x2009, 0x0027, -- 0x080c, 0x960c, 0x00ce, 0x0804, 0x290f, 0xd2bc, 0x0904, 0x290f, -- 0x080c, 0x7031, 0x6014, 0xa084, 0x0184, 0xa085, 0x0010, 0x6016, -+ 0x080c, 0x962c, 0x00ce, 0x0804, 0x290f, 0xd2bc, 0x0904, 0x290f, -+ 0x080c, 0x704a, 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, -+ 0x00ce, 0xa005, 0x05a0, 0x2009, 0x07d0, 0x080c, 0x7042, 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, -+ 0x00b0, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e92, 0x003e, 0x2019, - 0xc936, 0x2304, 0xa065, 0x0150, 0x2009, 0x004f, 0x601c, 0xa086, -- 0x0009, 0x1110, 0x2009, 0x0105, 0x080c, 0x960c, 0x00ce, 0x001e, -+ 0x0009, 0x1110, 0x2009, 0x0105, 0x080c, 0x962c, 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, -@@ -866,16 +867,16 @@ unsigned short risc_code01[] = { - 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, 0xc579, 0x080c, 0xc594, 0xa085, 0x0001, 0x080c, 0x5f66, -+ 0x080c, 0x8f27, 0x2011, 0x0002, 0x080c, 0x8f31, 0x080c, 0x8e07, -+ 0x0036, 0x2019, 0x0000, 0x080c, 0x8e92, 0x003e, 0x60e3, 0x0000, -+ 0x080c, 0xc59f, 0x080c, 0xc5ba, 0xa085, 0x0001, 0x080c, 0x5f7f, - 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, -+ 0x4096, 0x00c8, 0x2011, 0x8012, 0x080c, 0x4096, 0x2001, 0xc672, - 0x2004, 0xd0fc, 0x1180, 0x0036, 0x00c6, 0x080c, 0x2a3c, 0x080c, -- 0x8dca, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0000, 0x080c, -+ 0x8de3, 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, -@@ -883,13 +884,13 @@ unsigned short risc_code01[] = { - 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, -+ 0x080c, 0x6bf9, 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, 0xc5a8, -+ 0x0000, 0xa006, 0x82ff, 0x1128, 0xa184, 0x000f, 0xa080, 0xc5ce, - 0x2005, 0x6856, 0x8211, 0x1f04, 0x2a01, 0x002e, 0x00de, 0x000e, - 0x0005, 0x00c6, 0x2061, 0xc600, 0x6030, 0x0110, 0xc09d, 0x0008, - 0xc09c, 0x6032, 0x00ce, 0x0005, 0x0156, 0x00d6, 0x0026, 0x0016, -@@ -898,12 +899,12 @@ unsigned short risc_code01[] = { - 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, 0xc183, 0x004e, 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, -+ 0x080c, 0xc1a9, 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, -+ 0x2018, 0x2300, 0x080c, 0x7858, 0x2011, 0x0030, 0x2200, 0x8007, - 0xa085, 0x004c, 0x78c2, 0x2009, 0x0204, 0x210c, 0x2200, 0xa100, -- 0x2009, 0x0138, 0x200a, 0x080c, 0x5f22, 0x1118, 0x2009, 0xc8d6, -+ 0x2009, 0x0138, 0x200a, 0x080c, 0x5f3b, 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, -@@ -966,10 +967,10 @@ unsigned short risc_code01[] = { - 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, -+ 0x5724, 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, -+ 0x5f3b, 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, -@@ -977,7 +978,7 @@ unsigned short risc_code01[] = { - 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, -+ 0x080c, 0x52fa, 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, -@@ -985,51 +986,51 @@ unsigned short risc_code01[] = { - 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, -+ 0xc484, 0x080c, 0x5356, 0x0120, 0x080c, 0x52fa, 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, -+ 0x080c, 0x5319, 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, -+ 0x007e, 0x080c, 0x52fa, 0x1138, 0x080c, 0x2e87, 0x04a9, 0x0118, - 0x70d4, 0xc0bd, 0x70d6, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, - 0x00d6, 0x00c6, 0x2c68, 0x2001, 0xc657, 0x2004, 0xa084, 0x00ff, -- 0x6842, 0x080c, 0xaf06, 0x01d8, 0x2d00, 0x601a, 0x080c, 0xb057, -- 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x527f, 0x2001, 0x0000, -- 0x080c, 0x5291, 0x0126, 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, -- 0x012e, 0x2009, 0x0004, 0x080c, 0x960c, 0xa085, 0x0001, 0x00ce, -+ 0x6842, 0x080c, 0xaf26, 0x01d8, 0x2d00, 0x601a, 0x080c, 0xb077, -+ 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, 0x5298, 0x2001, 0x0000, -+ 0x080c, 0x52aa, 0x0126, 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, -+ 0x012e, 0x2009, 0x0004, 0x080c, 0x962c, 0xa085, 0x0001, 0x00ce, - 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, - 0x2c68, 0x2001, 0xc657, 0x2004, 0xa084, 0x00ff, 0x6842, 0x080c, -- 0xaf06, 0x0550, 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, -+ 0xaf26, 0x0550, 0x2d00, 0x601a, 0x6800, 0xc0c4, 0x6802, 0x68a0, - 0xa086, 0x007e, 0x0140, 0x6804, 0xa084, 0x00ff, 0xa086, 0x0006, -- 0x1110, 0x080c, 0x2e46, 0x080c, 0xb057, 0x601f, 0x0001, 0x2001, -- 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x0126, -+ 0x1110, 0x080c, 0x2e46, 0x080c, 0xb077, 0x601f, 0x0001, 0x2001, -+ 0x0000, 0x080c, 0x5298, 0x2001, 0x0002, 0x080c, 0x52aa, 0x0126, - 0x2091, 0x8000, 0x7098, 0x8000, 0x709a, 0x012e, 0x2009, 0x0002, -- 0x080c, 0x960c, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, -- 0x0005, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x52e1, 0x1120, -+ 0x080c, 0x962c, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, -+ 0x0005, 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x52fa, 0x1120, - 0x0031, 0x0110, 0x70db, 0xffff, 0x002e, 0x00ce, 0x0005, 0x0016, -- 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, 0x9586, 0x01e8, 0x2d00, -- 0x601a, 0x080c, 0xb057, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, -- 0x527f, 0x2001, 0x0002, 0x080c, 0x5291, 0x0126, 0x2091, 0x8000, -+ 0x0076, 0x00d6, 0x00c6, 0x2c68, 0x080c, 0x95a6, 0x01e8, 0x2d00, -+ 0x601a, 0x080c, 0xb077, 0x601f, 0x0001, 0x2001, 0x0000, 0x080c, -+ 0x5298, 0x2001, 0x0002, 0x080c, 0x52aa, 0x0126, 0x2091, 0x8000, - 0x080c, 0x2e46, 0x70dc, 0x8000, 0x70de, 0x012e, 0x2009, 0x0002, -- 0x080c, 0x960c, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, -+ 0x080c, 0x962c, 0xa085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, - 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, -- 0x080c, 0x52e1, 0x1190, 0x2c68, 0x080c, 0x9586, 0x0170, 0x2d00, -- 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x080c, 0xb057, 0x2009, -- 0x0022, 0x080c, 0x960c, 0xa085, 0x0001, 0x012e, 0x00de, 0x00ce, -- 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x080c, 0x7b22, -- 0x080c, 0x7abb, 0x080c, 0xa089, 0x2130, 0x81ff, 0x0128, 0x20a9, -+ 0x080c, 0x52fa, 0x1190, 0x2c68, 0x080c, 0x95a6, 0x0170, 0x2d00, -+ 0x601a, 0x6312, 0x601f, 0x0001, 0x620a, 0x080c, 0xb077, 0x2009, -+ 0x0022, 0x080c, 0x962c, 0xa085, 0x0001, 0x012e, 0x00de, 0x00ce, -+ 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x080c, 0x7b3b, -+ 0x080c, 0x7ad4, 0x080c, 0xa0a9, 0x2130, 0x81ff, 0x0128, 0x20a9, - 0x007e, 0x2009, 0x0000, 0x0020, 0x20a9, 0x007f, 0x2009, 0x0000, -- 0x0016, 0x080c, 0x533d, 0x1120, 0x080c, 0x553e, 0x080c, 0x4f47, -+ 0x0016, 0x080c, 0x5356, 0x1120, 0x080c, 0x5557, 0x080c, 0x4f60, - 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, 0xbeea, 0x007e, 0x001e, 0x2e60, 0x080c, 0x553e, -- 0x6210, 0x6314, 0x080c, 0x4f47, 0x6212, 0x6316, 0x001e, 0x002e, -+ 0x0029, 0x080c, 0x7b2f, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a27, -+ 0x2c08, 0x080c, 0xbf10, 0x007e, 0x001e, 0x2e60, 0x080c, 0x5557, -+ 0x6210, 0x6314, 0x080c, 0x4f60, 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, -@@ -1037,20 +1038,20 @@ unsigned short risc_code01[] = { - 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, 0xc183, 0x004e, 0x20a9, -+ 0x0046, 0x2020, 0x2009, 0x002d, 0x080c, 0xc1a9, 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, -+ 0x2160, 0x2001, 0x0001, 0x080c, 0x572e, 0x00ce, 0x2019, 0x0029, -+ 0x080c, 0x7b2f, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a27, 0x00c6, - 0x0026, 0x2160, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, 0x1118, - 0x6007, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0xa215, 0x6206, -- 0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xbeea, 0x001e, 0x007e, -- 0x2160, 0x080c, 0x553e, 0x002e, 0x8210, 0x1f04, 0x2eab, 0x015e, -+ 0x002e, 0x00ce, 0x0016, 0x2c08, 0x080c, 0xbf10, 0x001e, 0x007e, -+ 0x2160, 0x080c, 0x5557, 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, 0xc183, -+ 0x0138, 0xa006, 0x2220, 0x8427, 0x2009, 0x0029, 0x080c, 0xc1a9, - 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, - 0x7288, 0x82ff, 0x01f8, 0x2011, 0xc653, 0x2214, 0xd2ac, 0x11d0, - 0x2100, 0x080c, 0x29db, 0x81ff, 0x01b8, 0x2019, 0x0001, 0x8314, -@@ -1058,10 +1059,10 @@ unsigned short risc_code01[] = { - 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, 0x912b, 0x002e, -- 0x080c, 0xc4d7, 0x003e, 0x002e, 0x001e, 0xa180, 0xc77b, 0x2004, -+ 0x0036, 0x2110, 0x0026, 0x2019, 0x0029, 0x080c, 0x914b, 0x002e, -+ 0x080c, 0xc4fd, 0x003e, 0x002e, 0x001e, 0xa180, 0xc77b, 0x2004, - 0xa065, 0x0158, 0x0016, 0x00c6, 0x2061, 0xca3c, 0x001e, 0x611a, -- 0x080c, 0x2e46, 0x001e, 0x080c, 0x5300, 0x012e, 0x00ce, 0x001e, -+ 0x080c, 0x2e46, 0x001e, 0x080c, 0x5319, 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, -@@ -1116,89 +1117,89 @@ unsigned short risc_code01[] = { - 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, -+ 0x356c, 0x399f, 0x4588, 0x3170, 0x3170, 0x3170, 0x3170, 0x3170, - 0x3170, 0x3170, 0x3170, 0x31b6, 0x31b9, 0x39a1, 0x3170, 0x39ae, -- 0x4608, 0x4663, 0x46c7, 0x3170, 0x472a, 0x4754, 0x4773, 0x47a5, -+ 0x4621, 0x467c, 0x46e0, 0x3170, 0x4743, 0x476d, 0x478c, 0x47be, - 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, -+ 0x3c50, 0x3c5b, 0x3c93, 0x3ca2, 0x3cb1, 0x3cb4, 0x3cd7, 0x3d23, -+ 0x3d99, 0x3da6, 0x3ea7, 0x3fed, 0x4016, 0x4114, 0x4136, 0x4142, -+ 0x417b, 0x424b, 0x42a5, 0x436b, 0x43bd, 0x441d, 0x4432, 0x444d, -+ 0x44bf, 0x4571, 0x713c, 0x0000, 0x2021, 0x4000, 0x080c, 0x4073, - 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, -+ 0x2520, 0x7b28, 0x7a2c, 0x7824, 0x7930, 0x0804, 0x4080, 0x7823, - 0x0004, 0x7824, 0x0807, 0xa02e, 0x2520, 0x7b28, 0x7a2c, 0x7824, -- 0x7930, 0x0804, 0x406a, 0x7924, 0x7828, 0x2114, 0x200a, 0x0804, -+ 0x7930, 0x0804, 0x4083, 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, 0x0004, 0x783b, 0x0037, 0x0804, 0x3154, 0x7d38, 0x7c3c, -+ 0x2019, 0x0006, 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, -+ 0x6852, 0x7828, 0x6856, 0xa006, 0x685a, 0x685e, 0x080c, 0x6211, - 0x0804, 0x3154, 0x2069, 0xc652, 0x7824, 0x7934, 0xa11a, 0x1a04, - 0x317c, 0x8019, 0x0904, 0x317c, 0x684e, 0x6946, 0x782c, 0x6862, -- 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x080c, 0x57d7, 0x0804, -+ 0x7828, 0x6866, 0xa006, 0x686a, 0x686e, 0x080c, 0x57f0, 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, -+ 0x7a2c, 0x20a9, 0x0005, 0x20a1, 0xc6a9, 0x41a1, 0x080c, 0x403f, -+ 0x0904, 0x3179, 0x2009, 0x0020, 0x080c, 0x4080, 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, -+ 0x700e, 0x080c, 0x403f, 0x0904, 0x3179, 0x2009, 0x0020, 0x2061, - 0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0xa290, 0x0040, 0xa399, -- 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x080c, 0x4067, 0x701b, -+ 0x0000, 0xa4a1, 0x0000, 0xa5a9, 0x0000, 0x080c, 0x4080, 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, -+ 0xc0fd, 0x683a, 0x080c, 0x51f6, 0x1128, 0x7007, 0x0003, 0x701b, -+ 0x325c, 0x0005, 0x080c, 0x5947, 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, -+ 0x012e, 0x0804, 0x4083, 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, -+ 0x080c, 0x5356, 0x1904, 0x317c, 0x7e38, 0xa684, 0x3fff, 0xa082, -+ 0x4000, 0x0210, 0x0804, 0x317c, 0x7c28, 0x7d2c, 0x080c, 0x551e, -+ 0xd28c, 0x1118, 0x080c, 0x54c7, 0x0010, 0x080c, 0x54f7, 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, 0xa95a, 0x012e, 0x0904, -- 0x3179, 0x0804, 0x3154, 0xa00e, 0x2001, 0x0005, 0x080c, 0x592e, -- 0x0126, 0x2091, 0x8000, 0x080c, 0xaf02, 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, -+ 0xac02, 0x1a04, 0x3179, 0x0c30, 0x080c, 0xa97a, 0x012e, 0x0904, -+ 0x3179, 0x0804, 0x3154, 0xa00e, 0x2001, 0x0005, 0x080c, 0x5947, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0xaf22, 0x080c, 0x5823, 0x012e, -+ 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x4054, 0x0904, -+ 0x317c, 0x080c, 0x541c, 0x0904, 0x3179, 0x080c, 0x552a, 0x0904, -+ 0x3179, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x4064, -+ 0x0904, 0x317c, 0x080c, 0x5596, 0x0904, 0x3179, 0x2019, 0x0005, -+ 0x7924, 0x080c, 0x5545, 0x0904, 0x3179, 0x7828, 0xa08a, 0x1000, -+ 0x1a04, 0x317c, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x6fd2, - 0x0804, 0x3154, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, - 0x0001, 0x0450, 0x2029, 0x00ff, 0x6450, 0x2400, 0xa506, 0x01f8, -- 0x2508, 0x080c, 0x533d, 0x11d8, 0x080c, 0x557d, 0x1128, 0x2009, -+ 0x2508, 0x080c, 0x5356, 0x11d8, 0x080c, 0x5596, 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, -+ 0x5545, 0x1118, 0x2009, 0x0006, 0x0078, 0x7824, 0xa08a, 0x1000, -+ 0x1270, 0x8003, 0x800b, 0x810b, 0xa108, 0x080c, 0x6fd2, 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, 0xbeea, 0x007e, -- 0x00ce, 0x080c, 0x5505, 0x0804, 0x3154, 0x080c, 0x403b, 0x0904, -- 0x317c, 0x080c, 0x5505, 0x2208, 0x0804, 0x3154, 0x0156, 0x00d6, -+ 0x0804, 0x317c, 0x080c, 0x4054, 0x0904, 0x317c, 0x080c, 0x5482, -+ 0x080c, 0x551e, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, -+ 0x4054, 0x0904, 0x317c, 0x080c, 0x5473, 0x080c, 0x551e, 0x0804, -+ 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x4054, 0x0904, 0x317c, -+ 0x080c, 0x54f9, 0x0904, 0x3179, 0x080c, 0x523a, 0x080c, 0x54c0, -+ 0x080c, 0x551e, 0x0804, 0x3154, 0x080c, 0x4054, 0x0904, 0x317c, -+ 0x080c, 0x541c, 0x0904, 0x3179, 0x62a0, 0x2019, 0x0005, 0x00c6, -+ 0x080c, 0x5557, 0x2061, 0x0000, 0x080c, 0x7b2f, 0x0076, 0x2039, -+ 0x0000, 0x080c, 0x7a27, 0x2009, 0x0000, 0x080c, 0xbf10, 0x007e, -+ 0x00ce, 0x080c, 0x551e, 0x0804, 0x3154, 0x080c, 0x4054, 0x0904, -+ 0x317c, 0x080c, 0x551e, 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, -@@ -1210,50 +1211,50 @@ unsigned short risc_code01[] = { - 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, -+ 0x5f3b, 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, -+ 0x6338, 0x012e, 0x0804, 0x3154, 0x080c, 0x4064, 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, -+ 0xa02d, 0x0904, 0x317c, 0xa00e, 0x080c, 0x5356, 0x1120, 0x6244, - 0x6338, 0x6446, 0x653a, 0xa186, 0x00ff, 0x0190, 0x8108, 0x0ca0, -- 0x080c, 0x404b, 0x0904, 0x317c, 0x7828, 0xa00d, 0x0904, 0x317c, -+ 0x080c, 0x4064, 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, 0x9586, 0x000e, 0x01e0, -- 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x080c, 0x4026, 0x01d8, -+ 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x95a6, 0x000e, 0x01e0, -+ 0x601a, 0x600b, 0xbc09, 0x601f, 0x0001, 0x080c, 0x403f, 0x01d8, - 0x6837, 0x0000, 0x7007, 0x0003, 0x6833, 0x0000, 0x6838, 0xc0fd, - 0x683a, 0x701b, 0x351a, 0x2d00, 0x6012, 0x2009, 0x0032, 0x080c, -- 0x960c, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3179, -- 0x00ce, 0x0804, 0x317c, 0x080c, 0x95dc, 0x0cb0, 0x2001, 0xc600, -+ 0x962c, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3179, -+ 0x00ce, 0x0804, 0x317c, 0x080c, 0x95fc, 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, 0x9586, 0x000e, 0x01e0, 0x601a, 0x600b, 0xbc05, 0x601f, -- 0x0001, 0x080c, 0x4026, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, -+ 0x080c, 0x95a6, 0x000e, 0x01e0, 0x601a, 0x600b, 0xbc05, 0x601f, -+ 0x0001, 0x080c, 0x403f, 0x01d8, 0x6837, 0x0000, 0x7007, 0x0003, - 0x6833, 0x0000, 0x6838, 0xc0fd, 0x683a, 0x701b, 0x351a, 0x2d00, -- 0x6012, 0x2009, 0x0032, 0x080c, 0x960c, 0x012e, 0x00ce, 0x0005, -+ 0x6012, 0x2009, 0x0032, 0x080c, 0x962c, 0x012e, 0x00ce, 0x0005, - 0x012e, 0x00ce, 0x0804, 0x3179, 0x00ce, 0x0804, 0x317c, 0x080c, -- 0x95dc, 0x0cb0, 0x6830, 0xa086, 0x0100, 0x0904, 0x3179, 0x0804, -+ 0x95fc, 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, -+ 0xa00e, 0x2110, 0x0c80, 0x81ff, 0x1904, 0x3179, 0x080c, 0x5f3b, - 0x0904, 0x3179, 0x0126, 0x2091, 0x8000, 0x6248, 0x6068, 0xa202, -- 0x0248, 0xa085, 0x0001, 0x080c, 0x2a11, 0x080c, 0x4968, 0x012e, -+ 0x0248, 0xa085, 0x0001, 0x080c, 0x2a11, 0x080c, 0x4981, 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, -+ 0x2009, 0x0000, 0x2011, 0x1000, 0x080c, 0x7858, 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, -@@ -1362,10 +1363,10 @@ unsigned short risc_code01[] = { - 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, -+ 0x080c, 0x403f, 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, -+ 0x080c, 0x403f, 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, -@@ -1375,14 +1376,14 @@ unsigned short risc_code01[] = { - 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, -+ 0x87ff, 0x0180, 0x00c6, 0x00d6, 0x2d60, 0x00c6, 0x080c, 0x403f, - 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, -+ 0x201c, 0x080c, 0x403f, 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, -+ 0x2d00, 0x681a, 0x00e0, 0x080c, 0x403f, 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, -@@ -1391,9 +1392,9 @@ unsigned short risc_code01[] = { - 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, -+ 0x0804, 0x31fb, 0x080c, 0x403f, 0x0904, 0x3179, 0x080c, 0x5f3b, -+ 0x0110, 0x080c, 0x4f45, 0x2009, 0x001c, 0x7a2c, 0x7b28, 0x7c3c, -+ 0x7d38, 0x080c, 0x4080, 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, -@@ -1407,9 +1408,9 @@ unsigned short risc_code01[] = { - 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, -+ 0x6804, 0xd0fc, 0x0560, 0x080c, 0x403f, 0x0904, 0x3179, 0x2009, - 0x0014, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0xa290, 0x0038, 0xa399, -- 0x0000, 0x080c, 0x4067, 0x701b, 0x3a46, 0x0005, 0xade8, 0x000d, -+ 0x0000, 0x080c, 0x4080, 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, -@@ -1417,7 +1418,7 @@ unsigned short risc_code01[] = { - 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, -+ 0x00ff, 0x6046, 0x080c, 0x6211, 0x080c, 0x5787, 0x080c, 0x57f0, - 0x6000, 0xa086, 0x0000, 0x1904, 0x3b41, 0x6808, 0x602a, 0x080c, - 0x25bb, 0x0006, 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x000e, - 0x0268, 0x2009, 0x0170, 0x200b, 0x0080, 0xe000, 0xe000, 0x200b, -@@ -1426,2759 +1427,2763 @@ unsigned short risc_code01[] = { - 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, -+ 0x20a9, 0x0004, 0x20a1, 0xc90d, 0x40a1, 0x080c, 0x7095, 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, -+ 0x6806, 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, -+ 0x5f3b, 0x0128, 0x080c, 0x4424, 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, -+ 0x5f3b, 0x1178, 0x2011, 0x5e0e, 0x080c, 0x6fc6, 0x2011, 0x5e01, -+ 0x080c, 0x7089, 0x2001, 0xc8e6, 0x2003, 0x0000, 0x080c, 0x5e73, -+ 0x0040, 0x080c, 0x4e74, 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, -+ 0x4083, 0xa006, 0x080c, 0x2a11, 0x81ff, 0x1904, 0x3179, 0x080c, -+ 0x5f3b, 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, -+ 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f7f, 0x080c, 0x5e73, -+ 0x0020, 0x080c, 0x4f45, 0x080c, 0x4e74, 0x0804, 0x3154, 0x81ff, -+ 0x1904, 0x3179, 0x080c, 0x5f3b, 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, -+ 0x4083, 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, -+ 0xa00e, 0x2011, 0x0002, 0x2100, 0xa506, 0x01a8, 0x080c, 0x5356, - 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, -+ 0x20a1, 0xcdc0, 0x2099, 0xcdc0, 0x080c, 0x4ee4, 0x0804, 0x3b9c, -+ 0x080c, 0x4064, 0x0904, 0x317c, 0x00c6, 0x080c, 0x403f, 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, 0xae0a, 0x1120, 0x2009, -+ 0x0000, 0x6838, 0xc0fd, 0x683a, 0x080c, 0xae2a, 0x1120, 0x2009, - 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x3c28, 0x0005, -- 0x080c, 0x404b, 0x0904, 0x317c, 0x20a9, 0x002b, 0x2c98, 0xade8, -+ 0x080c, 0x4064, 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, -+ 0xad80, 0x0006, 0x20a0, 0x080c, 0x4ee4, 0x20a9, 0x0004, 0xac80, -+ 0x000a, 0x2098, 0xad80, 0x000a, 0x20a0, 0x080c, 0x4ee4, 0x2d00, -+ 0x2009, 0x002b, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x0804, 0x4083, -+ 0x81ff, 0x1904, 0x3179, 0x080c, 0x4054, 0x0904, 0x317c, 0x080c, -+ 0x5533, 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x7828, 0xa08a, -+ 0x1000, 0x1a04, 0x317c, 0x080c, 0x4064, 0x0904, 0x317c, 0x080c, -+ 0x5596, 0x0904, 0x3179, 0x2019, 0x0004, 0xa00e, 0x080c, 0x5545, - 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, -+ 0x080c, 0x5356, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0xa108, -+ 0x080c, 0x6fd2, 0x0005, 0x81ff, 0x1904, 0x3179, 0x080c, 0x4054, -+ 0x0904, 0x317c, 0x080c, 0x541c, 0x0904, 0x3179, 0x080c, 0x553c, -+ 0x0804, 0x3154, 0x81ff, 0x1904, 0x3179, 0x080c, 0x4054, 0x0904, -+ 0x317c, 0x080c, 0x541c, 0x0904, 0x3179, 0x080c, 0x552a, 0x0804, -+ 0x3154, 0x6100, 0x0804, 0x3154, 0x080c, 0x4064, 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, 0xadb6, 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, 0xadd2, -- 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, 0x9586, 0x05d8, -- 0x2d00, 0x601a, 0x080c, 0xb057, 0x2e58, 0x00ee, 0x00e6, 0x00c6, -- 0x080c, 0x4026, 0x00ce, 0x2b70, 0x1150, 0x080c, 0x95dc, 0x00ee, -+ 0xa09c, 0x0003, 0xd0b4, 0x1160, 0xa39a, 0x0003, 0x1a04, 0x3179, -+ 0x6250, 0xa294, 0x00ff, 0xa084, 0xff00, 0x8007, 0xa206, 0x1150, -+ 0x2001, 0xc640, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, -+ 0x0804, 0x4083, 0x81ff, 0x1904, 0x3179, 0x080c, 0x4064, 0x0904, -+ 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x1904, 0x3179, -+ 0x00c6, 0x080c, 0x403f, 0x00ce, 0x0904, 0x3179, 0x6837, 0x0000, -+ 0x6838, 0xc0fd, 0x683a, 0x080c, 0xadd6, 0x0904, 0x3179, 0x7007, -+ 0x0003, 0x701b, 0x3d14, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, -+ 0x3179, 0xad80, 0x000e, 0x2009, 0x000c, 0x7a2c, 0x7b28, 0x7c3c, -+ 0x7d38, 0x0804, 0x4083, 0xa006, 0x080c, 0x2a11, 0x7824, 0xa084, -+ 0x00ff, 0xa086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3179, 0x080c, -+ 0x5f3b, 0x0110, 0x080c, 0x4f45, 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, 0x5f3b, 0x1178, 0x2001, 0xc8e6, 0x2003, -+ 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, -+ 0x5f7f, 0x080c, 0x5e73, 0x0420, 0x2011, 0x0003, 0x080c, 0x8f27, -+ 0x2011, 0x0002, 0x080c, 0x8f31, 0x080c, 0x8e07, 0x0036, 0x2019, -+ 0x0000, 0x080c, 0x8e92, 0x003e, 0x2061, 0x0100, 0x2001, 0xc615, -+ 0x2004, 0xa084, 0x00ff, 0x810f, 0xa105, 0x604a, 0x6043, 0x0090, -+ 0x6043, 0x0010, 0x2009, 0x002d, 0x2011, 0x4ea9, 0x080c, 0x704f, -+ 0x7924, 0xa18c, 0xff00, 0x810f, 0x080c, 0x5f3b, 0x1110, 0x2009, -+ 0x00ff, 0x7a28, 0x080c, 0x3c76, 0x012e, 0x00ce, 0x002e, 0x0804, -+ 0x3154, 0x7924, 0xa18c, 0xff00, 0x810f, 0x00c6, 0x080c, 0x52fa, -+ 0x2c08, 0x00ce, 0x1904, 0x317c, 0x0804, 0x3154, 0x81ff, 0x0120, -+ 0x2009, 0x0001, 0x0804, 0x3179, 0x60d4, 0xd0ac, 0x1130, 0xd09c, -+ 0x1120, 0x2009, 0x0005, 0x0804, 0x3179, 0x080c, 0x403f, 0x1120, -+ 0x2009, 0x0002, 0x0804, 0x3179, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, -+ 0x7d38, 0x080c, 0x4080, 0x701b, 0x3dc6, 0x0005, 0x2009, 0x0080, -+ 0x080c, 0x5356, 0x1130, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, -+ 0x0120, 0x2021, 0x400a, 0x0804, 0x3156, 0x00d6, 0xade8, 0x000d, -+ 0x6900, 0x6a08, 0x6b0c, 0x6c10, 0x6d14, 0x6e18, 0x6820, 0xa0be, -+ 0x0100, 0x0904, 0x3e3d, 0xa0be, 0x0112, 0x0904, 0x3e3d, 0xa0be, -+ 0x0113, 0x0904, 0x3e3d, 0xa0be, 0x0114, 0x0904, 0x3e3d, 0xa0be, -+ 0x0117, 0x0904, 0x3e3d, 0xa0be, 0x011a, 0x0904, 0x3e3d, 0xa0be, -+ 0x011c, 0x0904, 0x3e3d, 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, 0x3e83, 0xad80, 0x000e, 0x20a9, -+ 0x0001, 0x080c, 0x3e83, 0x0048, 0xad80, 0x000c, 0x080c, 0x3e91, -+ 0x0050, 0xad80, 0x000e, 0x080c, 0x3e91, 0xad80, 0x000c, 0x20a9, -+ 0x0001, 0x080c, 0x3e83, 0x00c6, 0x080c, 0x403f, 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, 0xadf2, 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, -+ 0x0003, 0x701b, 0x3e7a, 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, 0x3e85, 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, 0x3f89, 0x2c68, 0x00ce, -+ 0x05a0, 0x0086, 0xa0c6, 0x4000, 0x008e, 0x11c8, 0x00c6, 0x0006, -+ 0x2d60, 0xd88c, 0x1140, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, -+ 0x0110, 0xc89d, 0x0400, 0xa00e, 0x080c, 0x55f7, 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, 0x000e, 0x00ce, 0x2d00, 0x7022, 0x0016, -+ 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x95a6, 0x0904, 0x3f5e, -+ 0x2d00, 0x601a, 0x080c, 0xb077, 0x2e58, 0x00ee, 0x00e6, 0x00c6, -+ 0x080c, 0x403f, 0x00ce, 0x2b70, 0x1150, 0x080c, 0x95fc, 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, -- 0x960c, 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, -- 0xacba, 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, 0xae9b, 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, 0x9586, 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, 0x960c, -- 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, 0xadee, 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, 0xae0a, 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, 0xae9b, -- 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, -- 0xb058, 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, 0xb0a7, 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, 0xae25, -- 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, -+ 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0x683a, 0xd89c, 0x1130, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x2e46, 0x012e, 0x601f, 0x0001, 0x2001, -+ 0x0000, 0x080c, 0x5298, 0xd89c, 0x0138, 0x2001, 0x0004, 0x080c, -+ 0x52aa, 0x2009, 0x0003, 0x0030, 0x2001, 0x0002, 0x080c, 0x52aa, -+ 0x2009, 0x0002, 0x080c, 0x962c, 0xa085, 0x0001, 0x00ee, 0x00ce, -+ 0x00be, 0x001e, 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, -+ 0x0003, 0x701b, 0x3f6c, 0x0005, 0x6830, 0xa086, 0x0100, 0x7020, -+ 0x2060, 0x1138, 0x2009, 0x0004, 0x6204, 0xa294, 0x00ff, 0x0804, -+ 0x3179, 0x2009, 0x0000, 0x6838, 0xd0f4, 0x1904, 0x3154, 0x080c, -+ 0x55f7, 0x1108, 0xc185, 0x6000, 0xd0bc, 0x0108, 0xc18d, 0x0804, -+ 0x3154, 0x00e6, 0x00d6, 0xa02e, 0x2001, 0xc635, 0x2004, 0xd0ac, -+ 0x0130, 0xa026, 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, 0x5706, 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, 0x3f9d, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, -+ 0x2001, 0x0001, 0x0030, 0x080c, 0x52fa, 0x1dd0, 0x6312, 0x6216, -+ 0xa006, 0xa005, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x1904, 0x3179, -+ 0x080c, 0x403f, 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, 0x400f, 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, 0xacda, 0x1188, 0xa190, 0xc77b, 0x2204, 0xa065, 0x0160, -+ 0x080c, 0x4f60, 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, 0x5356, 0x1130, 0x7e28, 0xa684, 0x3fff, 0xa082, 0x4000, -+ 0x0208, 0xa066, 0x8cff, 0x0005, 0x7e24, 0x860f, 0xa18c, 0x00ff, -+ 0x080c, 0x5356, 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, 0x40ae, 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, 0x4105, 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, 0x4096, 0x002e, 0x0005, 0x81ff, 0x1904, 0x3179, 0x0126, -+ 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, -+ 0x5f3b, 0x1178, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, -+ 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f7f, 0x080c, 0x5e73, -+ 0x0010, 0x080c, 0x4e74, 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, 0x4064, 0x0904, 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, -+ 0x0006, 0x1120, 0x7828, 0xa005, 0x0904, 0x3154, 0x00c6, 0x080c, -+ 0x403f, 0x00ce, 0x0904, 0x3179, 0x6837, 0x0000, 0x6833, 0x0000, -+ 0x6838, 0xc0fd, 0x683a, 0x080c, 0xaebb, 0x0904, 0x3179, 0x7007, -+ 0x0003, 0x701b, 0x4174, 0x0005, 0x6830, 0xa086, 0x0100, 0x0904, -+ 0x3179, 0x0804, 0x3154, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, -+ 0x1904, 0x3179, 0x7f24, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, -+ 0x403f, 0x0904, 0x3179, 0x2009, 0x0000, 0x2031, 0x0000, 0x7023, -+ 0x0000, 0x702f, 0x0000, 0xad80, 0x0005, 0x7026, 0x20a0, 0x080c, -+ 0x5356, 0x1904, 0x41fa, 0x6004, 0xa0c4, 0x00ff, 0xa8c6, 0x0006, -+ 0x0148, 0xa0c4, 0xff00, 0xa8c6, 0x0600, 0x0120, 0x080c, 0x5706, -+ 0x1904, 0x41fa, 0xd794, 0x1110, 0xd784, 0x0158, 0xac80, 0x0006, -+ 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, 0x080c, 0x3e91, 0xd794, -+ 0x0148, 0xac80, 0x000a, 0x2098, 0x3400, 0x20a9, 0x0004, 0x53a3, -+ 0x080c, 0x3e91, 0xa186, 0x007e, 0x0178, 0xa186, 0x0080, 0x0160, -+ 0x6004, 0xa084, 0x00ff, 0xa0c2, 0x0006, 0x1210, 0xc1fd, 0x0020, -+ 0x080c, 0x55f7, 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, 0x3e83, 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, 0x4197, 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, 0x4236, 0x0005, 0x702c, 0xa005, -+ 0x1170, 0x711c, 0x7024, 0x20a0, 0x7728, 0x2031, 0x0000, 0x2061, -+ 0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, 0x4197, 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, 0x403f, 0x0904, -+ 0x3179, 0x2009, 0x0020, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, -+ 0x4080, 0x701b, 0x42b4, 0x0005, 0x0126, 0xade8, 0x000d, 0x2001, -+ 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, 0xc96a, 0x700c, 0x7110, -+ 0xa106, 0x1de0, 0x00ee, 0x2091, 0x8000, 0x6800, 0xa005, 0x0904, -+ 0x4348, 0x6804, 0x2008, 0xa18c, 0xffe0, 0x1904, 0x4348, 0x680c, -+ 0xa005, 0x0904, 0x4348, 0xa082, 0xff01, 0x1a04, 0x4348, 0x6810, -+ 0xa082, 0x005c, 0x0a04, 0x4348, 0x6824, 0x2008, 0xa082, 0x0008, -+ 0x0a04, 0x4348, 0xa182, 0x0400, 0x1a04, 0x4348, 0x080c, 0x73ad, -+ 0x6820, 0x8000, 0x6822, 0x6944, 0x6820, 0xa102, 0x0a04, 0x4348, -+ 0x6828, 0x6944, 0x810c, 0xa102, 0x0a04, 0x4348, 0x6840, 0xa082, -+ 0x000f, 0x1a04, 0x4348, 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, 0x435f, 0x684e, -+ 0x080c, 0x7274, 0x05d8, 0x080c, 0x7171, 0x080c, 0x56ae, 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, 0x748e, 0x080c, 0x749d, 0x080c, 0x7160, 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, 0x76a8, 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, 0x403f, 0x0904, 0x3179, 0x080c, 0x4080, 0x701b, 0x4399, -+ 0x0005, 0x080c, 0x95a6, 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, -+ 0x962c, 0x0804, 0x3154, 0x0804, 0x3179, 0x2001, 0xc756, 0x200c, -+ 0xa18e, 0x0000, 0x0904, 0x441b, 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, 0x43eb, 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, 0x748e, -+ 0x080c, 0x749d, 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, 0x403f, 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, 0x44ab, 0x0005, 0x702c, 0xa005, 0x1168, 0x711c, 0x7024, -+ 0x20a0, 0x2019, 0x0000, 0x2061, 0xc6f2, 0x6424, 0x6528, 0x662c, -+ 0x6730, 0x0804, 0x4468, 0x7120, 0x810c, 0x0804, 0x3154, 0x81ff, -+ 0x1904, 0x3179, 0x60d4, 0xd0ac, 0x1118, 0xd09c, 0x0904, 0x3179, -+ 0x080c, 0x403f, 0x0904, 0x3179, 0x7924, 0x7a2c, 0x7b28, 0x7c3c, -+ 0x7d38, 0x080c, 0x4080, 0x701b, 0x44d6, 0x0005, 0x00d6, 0xade8, -+ 0x000d, 0x6828, 0xa0be, 0x7000, 0x0148, 0xa0be, 0x7100, 0x0130, -+ 0xa0be, 0x7200, 0x0118, 0x00de, 0x0804, 0x317c, 0x6820, 0x6924, -+ 0x080c, 0x29c7, 0x1510, 0x080c, 0x52fa, 0x11f8, 0x7122, 0x6612, -+ 0x6516, 0x6e18, 0x00c6, 0x080c, 0x403f, 0x01b8, 0x080c, 0x403f, -+ 0x01a0, 0x00ce, 0x00de, 0x6837, 0x0000, 0x6838, 0xc0fd, 0x683a, -+ 0x6823, 0x0000, 0x6804, 0x2068, 0x080c, 0xae0e, 0x0904, 0x3179, -+ 0x7007, 0x0003, 0x701b, 0x4510, 0x0005, 0x00de, 0x0804, 0x3179, -+ 0x7120, 0x080c, 0x2f41, 0x6820, 0xa086, 0x8001, 0x0904, 0x3179, -+ 0x2d00, 0x701e, 0x6804, 0xa080, 0x0002, 0x0006, 0x20a9, 0x002a, -+ 0x2098, 0x20a0, 0x080c, 0x4ee4, 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, 0x4083, -+ 0xa7c6, 0x7200, 0x1904, 0x317c, 0xa6c2, 0x0054, 0x0a04, 0x317c, -+ 0x600e, 0x6013, 0x002a, 0x6226, 0x632a, 0x642e, 0x6532, 0x2c10, -+ 0x080c, 0x164d, 0x7007, 0x0002, 0x701b, 0x4557, 0x0005, 0x701c, -+ 0x2068, 0x6804, 0xa080, 0x0001, 0x2004, 0xa080, 0x0002, 0x0006, -+ 0x20a9, 0x002a, 0x2098, 0x20a0, 0x080c, 0x4ee4, 0x000e, 0x2009, -+ 0x002a, 0x2061, 0xc6f2, 0x6224, 0x6328, 0x642c, 0x6530, 0x0804, -+ 0x4083, 0x81ff, 0x1904, 0x3179, 0x792c, 0x2001, 0xc8e7, 0x2102, -+ 0x080c, 0x4054, 0x0904, 0x317c, 0x080c, 0x541c, 0x0904, 0x3179, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x554e, 0x012e, 0x0804, 0x3154, -+ 0x7824, 0xd08c, 0x1118, 0xd084, 0x0904, 0x3bf0, 0x080c, 0x4064, -+ 0x0904, 0x317c, 0x00c6, 0x080c, 0x403f, 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, 0xae2a, 0x1120, 0x2009, -+ 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, 0x701b, 0x45d8, 0x0005, -+ 0x080c, 0x4064, 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, -+ 0xaebb, 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, -+ 0x701b, 0x4613, 0x0005, 0x6830, 0xa086, 0x0100, 0x1120, 0x2009, -+ 0x0004, 0x0804, 0x3179, 0x080c, 0x4064, 0x0904, 0x317c, 0x0804, -+ 0x45a7, 0x81ff, 0x2009, 0x0001, 0x1904, 0x3179, 0x6000, 0xa086, -+ 0x0003, 0x2009, 0x0007, 0x1904, 0x3179, 0x2001, 0xc653, 0x2004, -+ 0xd0ac, 0x2009, 0x0008, 0x1904, 0x3179, 0x080c, 0x4064, 0x0904, -+ 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, 0x2009, 0x0009, -+ 0x1904, 0x3179, 0x00c6, 0x080c, 0x403f, 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, 0xb078, 0x2009, 0x0003, 0x0904, 0x3179, 0x7007, 0x0003, -+ 0x701b, 0x4673, 0x0005, 0x6830, 0xa086, 0x0100, 0x2009, 0x0004, -+ 0x0904, 0x3179, 0x0804, 0x3154, 0x81ff, 0x2009, 0x0001, 0x1904, -+ 0x3179, 0x6000, 0xa086, 0x0003, 0x2009, 0x0007, 0x1904, 0x3179, -+ 0x080c, 0x4064, 0x0904, 0x317c, 0x6004, 0xa084, 0x00ff, 0xa086, -+ 0x0006, 0x2009, 0x0009, 0x1904, 0x3179, 0x00c6, 0x080c, 0x403f, -+ 0x00ce, 0x2009, 0x0002, 0x0904, 0x3179, 0xad80, 0x000f, 0x2009, -+ 0x0008, 0x7a2c, 0x7b28, 0x7c3c, 0x7d38, 0x080c, 0x4080, 0x701b, -+ 0x46aa, 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, 0x4064, 0x1118, -+ 0x00ce, 0x0804, 0x317c, 0x080c, 0xb0c7, 0x2009, 0x0003, 0x00ce, -+ 0x0904, 0x3179, 0x7007, 0x0003, 0x701b, 0x46d7, 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, 0x5356, 0x1904, 0x317c, -+ 0xa186, 0x007f, 0x0150, 0x6004, 0xa084, 0x00ff, 0xa086, 0x0006, -+ 0x0120, 0x2009, 0x0009, 0x0804, 0x3179, 0x00c6, 0x080c, 0x403f, -+ 0x00ce, 0x1120, 0x2009, 0x0002, 0x0804, 0x3179, 0x6837, 0x0000, -+ 0x6838, 0xc0fd, 0x683a, 0x2001, 0x0100, 0x8007, 0x680a, 0x080c, -+ 0xae45, 0x1120, 0x2009, 0x0003, 0x0804, 0x3179, 0x7007, 0x0003, -+ 0x701b, 0x4723, 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, 0x4083, 0x080c, 0x403f, 0x1120, 0x2009, 0x0002, -+ 0x0804, 0x3179, 0x7924, 0xa194, 0xff00, 0xa18c, 0x00ff, 0x8217, -+ 0x82ff, 0x0110, 0x0804, 0x317c, 0x2009, 0x001a, 0x7a2c, 0x7b28, -+ 0x7c3c, 0x7d38, 0x080c, 0x4080, 0x701b, 0x475f, 0x0005, 0x2001, -+ 0xc62a, 0x2003, 0x0001, 0xad80, 0x000d, 0x2098, 0x20a9, 0x001a, -+ 0x20a1, 0xc90d, 0x53a3, 0x0804, 0x3154, 0x080c, 0x403f, 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, 0x4083, 0x7824, 0xa08a, 0x1000, 0x1a04, -+ 0x317c, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0xa108, -+ 0x00c6, 0x2061, 0xc93a, 0x6142, 0x00ce, 0x012e, 0x0804, 0x3154, -+ 0x00c6, 0x080c, 0x5f3b, 0x1188, 0x2001, 0xc8e6, 0x2003, 0x0001, -+ 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, 0x0001, 0x080c, 0x5f7f, -+ 0x080c, 0x5e73, 0x080c, 0x1519, 0x0038, 0x2061, 0xc600, 0x6030, -+ 0xc09d, 0x6032, 0x080c, 0x4e74, 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, 0x495b, 0x0068, 0xd08c, 0x0118, 0x080c, 0x487c, 0x0040, -+ 0xd094, 0x0118, 0x080c, 0x484d, 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, 0x4f04, 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, 0x4e2a, 0x080c, 0x704f, 0x0005, 0x0156, 0x2001, 0xc674, -+ 0x2004, 0xd08c, 0x0110, 0x7053, 0xffff, 0x707c, 0xa005, 0x1510, -+ 0x2011, 0x4e2a, 0x080c, 0x6fc6, 0x6040, 0xa094, 0x0010, 0xa285, -+ 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, -+ 0x4864, 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, 0x4888, 0x48d8, 0x495a, -+ 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, 0x4e5b, -+ 0x00fe, 0x7087, 0x0000, 0x6043, 0x0008, 0x6043, 0x0000, 0x0005, -+ 0x00d6, 0x7084, 0x7087, 0x0000, 0xa025, 0x0904, 0x4942, 0x6020, -+ 0xd0b4, 0x1904, 0x4940, 0x7194, 0x81ff, 0x0904, 0x4930, 0xa486, -+ 0x000c, 0x1904, 0x493b, 0xa480, 0x0018, 0x8004, 0x20a8, 0x2011, -+ 0xcc80, 0x2019, 0xcc00, 0x220c, 0x2304, 0xa106, 0x11b8, 0x8210, -+ 0x8318, 0x1f04, 0x48f3, 0x6043, 0x0004, 0x608b, 0xbc94, 0x608f, -+ 0xf0f0, 0x6043, 0x0006, 0x7083, 0x0002, 0x708f, 0x0002, 0x2009, -+ 0x07d0, 0x2011, 0x4e31, 0x080c, 0x704f, 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, 0x4924, 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, -+ 0x8c05, 0x0c30, 0x0005, 0x708c, 0xa08a, 0x001d, 0x1210, 0x0023, -+ 0x0010, 0x080c, 0x1519, 0x0005, 0x498e, 0x499d, 0x49c5, 0x49de, -+ 0x4a02, 0x4a2a, 0x4a4e, 0x4a7f, 0x4aa3, 0x4acb, 0x4b02, 0x4b2a, -+ 0x4b46, 0x4b5c, 0x4b7c, 0x4b8f, 0x4b97, 0x4bc7, 0x4beb, 0x4c13, -+ 0x4c37, 0x4c68, 0x4ca5, 0x4cd4, 0x4cf0, 0x4d2f, 0x4d4f, 0x4d68, -+ 0x4d69, 0x00c6, 0x2061, 0xc600, 0x6003, 0x0007, 0x2061, 0x0100, -+ 0x6004, 0xa084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x608b, 0xbc94, -+ 0x608f, 0xf0f0, 0x6043, 0x0002, 0x708f, 0x0001, 0x2009, 0x07d0, -+ 0x2011, 0x4e31, 0x080c, 0x704f, 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, -- 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, -+ 0x2011, 0x4e31, 0x080c, 0x6fc6, 0x708f, 0x0010, 0x080c, 0x4b97, -+ 0x0010, 0x080c, 0x4e74, 0x00fe, 0x0005, 0x708f, 0x0003, 0x6043, -+ 0x0004, 0x2011, 0x4e31, 0x080c, 0x6fc6, 0x080c, 0x4eec, 0x20a3, -+ 0x1102, 0x20a3, 0x0000, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, -+ 0x49d5, 0x60c3, 0x0014, 0x080c, 0x4e5b, 0x0005, 0x00f6, 0x7084, -+ 0xa005, 0x01f0, 0x2011, 0x4e31, 0x080c, 0x6fc6, 0xa086, 0x0014, -+ 0x11a8, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1102, 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, -+ 0x70bb, 0x0001, 0x708f, 0x0004, 0x0029, 0x0010, 0x080c, 0x4e74, -+ 0x00fe, 0x0005, 0x708f, 0x0005, 0x080c, 0x4eec, 0x20a3, 0x1103, -+ 0x20a3, 0x0000, 0x3430, 0x2011, 0xcc8e, 0x080c, 0x4f3d, 0x1160, - 0x7078, 0xa005, 0x1148, 0x7150, 0xa186, 0xffff, 0x0128, 0x080c, -- 0x4ddc, 0x0110, 0x080c, 0x4f02, 0x20a9, 0x0008, 0x2298, 0x26a0, -+ 0x4df5, 0x0110, 0x080c, 0x4f1b, 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, -+ 0x4e5b, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e31, -+ 0x080c, 0x6fc6, 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, 0x4e74, 0x00fe, 0x0005, 0x708f, 0x0007, -+ 0x080c, 0x4eec, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, 0x2011, -+ 0xcc8e, 0x080c, 0x4f3d, 0x11a8, 0x7078, 0xa005, 0x1190, 0x7158, - 0xa186, 0xffff, 0x0170, 0xa180, 0x2f6e, 0x200d, 0xa18c, 0xff00, -- 0x810f, 0x080c, 0x4ddc, 0x0128, 0x080c, 0x4412, 0x0110, 0x080c, -+ 0x810f, 0x080c, 0x4df5, 0x0128, 0x080c, 0x442b, 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, -+ 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e5b, 0x0005, 0x00f6, -+ 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e31, 0x080c, 0x6fc6, 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, -+ 0x4e74, 0x00fe, 0x0005, 0x708f, 0x0009, 0x080c, 0x4eec, 0x20a3, -+ 0x1105, 0x20a3, 0x0100, 0x3430, 0x080c, 0x4f3d, 0x1150, 0x7078, -+ 0xa005, 0x1138, 0x080c, 0x4d6a, 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, -+ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e5b, 0x0010, -+ 0x080c, 0x4981, 0x0005, 0x00f6, 0x7084, 0xa005, 0x0588, 0x2011, -+ 0x4e31, 0x080c, 0x6fc6, 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, 0x4b7c, 0x0010, 0x080c, 0x4e74, -+ 0x00fe, 0x0005, 0x708f, 0x000b, 0x2011, 0xcc0e, 0x22a0, 0x20a9, -+ 0x0040, 0x2019, 0xffff, 0x43a4, 0x20a9, 0x0002, 0x2009, 0x0000, -+ 0x41a4, 0x080c, 0x4eec, 0x20a3, 0x1106, 0x20a3, 0x0000, 0x080c, -+ 0x4f3d, 0x0118, 0x2013, 0x0000, 0x0020, 0x7054, 0xa085, 0x0100, -+ 0x2012, 0x2298, 0x20a9, 0x0042, 0x53a6, 0x60c3, 0x0084, 0x080c, -+ 0x4e5b, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, 0x2011, 0x4e31, -+ 0x080c, 0x6fc6, 0xa086, 0x0084, 0x1168, 0x2079, 0xcc80, 0x7a30, -+ 0xa296, 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, 0x708f, 0x000c, -+ 0x0029, 0x0010, 0x080c, 0x4e74, 0x00fe, 0x0005, 0x708f, 0x000d, -+ 0x080c, 0x4eec, 0x20a3, 0x1107, 0x20a3, 0x0000, 0x2099, 0xcc8e, -+ 0x20a9, 0x0040, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, -+ 0x0084, 0x080c, 0x4e5b, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01d0, -+ 0x2011, 0x4e31, 0x080c, 0x6fc6, 0xa086, 0x0084, 0x1188, 0x2079, -+ 0xcc80, 0x7a30, 0xa296, 0x1107, 0x1158, 0x7834, 0xa005, 0x1140, -+ 0x708b, 0x0001, 0x080c, 0x4ede, 0x708f, 0x000e, 0x0029, 0x0010, -+ 0x080c, 0x4e74, 0x00fe, 0x0005, 0x708f, 0x000f, 0x7087, 0x0000, -+ 0x608b, 0xbc85, 0x608f, 0xb5b5, 0x6043, 0x0005, 0x6043, 0x0004, -+ 0x2009, 0x07d0, 0x2011, 0x4e31, 0x080c, 0x6fba, 0x0005, 0x7084, -+ 0xa005, 0x0120, 0x2011, 0x4e31, 0x080c, 0x6fc6, 0x0005, 0x708f, -+ 0x0011, 0x080c, 0x4f3d, 0x11a0, 0x7170, 0x81ff, 0x0188, 0x2009, -+ 0x0000, 0x7074, 0xa084, 0x00ff, 0x080c, 0x29c7, 0xa186, 0x007e, -+ 0x0138, 0xa186, 0x0080, 0x0120, 0x2011, 0xcc8e, 0x080c, 0x4df5, - 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, 0xc183, 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, -- 0x9586, 0x0568, 0x2e00, 0x601a, 0x2d00, 0x6012, 0x601f, 0x0009, -- 0x600b, 0x0000, 0x6844, 0xa08e, 0xff00, 0x1110, 0x600b, 0x8000, -- 0x2009, 0x0100, 0x080c, 0x960c, 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, 0x9586, 0x05e8, 0x2e00, 0x601a, -- 0x2d00, 0x6012, 0x600b, 0xffff, 0x601f, 0x000a, 0x2009, 0x0003, -- 0x080c, 0x960c, 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, 0x9586, 0x1138, 0x2001, 0x4005, 0x2009, -- 0x0003, 0x2011, 0x0000, 0x0c80, 0x2e00, 0x601a, 0x080c, 0xb057, -- 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, 0x960c, 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, 0xac8a, 0x0110, 0x080c, 0x1629, -- 0x080c, 0x95dc, 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, 0xad3f, 0x0010, 0xa085, -- 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xaccf, 0x0010, -- 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, 0xad22, -- 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, 0x080c, -- 0xaceb, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55de, 0x0118, -- 0x080c, 0xad5b, 0x0010, 0xa085, 0x0001, 0x0005, 0x0126, 0x0006, -- 0x00d6, 0x2091, 0x8000, 0x6080, 0xa06d, 0x01a0, 0x6800, 0x0006, -- 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0xaefc, 0x0006, -- 0x6000, 0xd0fc, 0x0110, 0x080c, 0xc4d3, 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, 0xc183, 0x6000, 0xc0e5, 0xc0ec, -- 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, 0x6006, 0x2019, -- 0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, -- 0x2009, 0x0000, 0x080c, 0xbeea, 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, -+ 0x20a8, 0x53a6, 0x60c3, 0x0014, 0x080c, 0x4e5b, 0x0005, 0x00f6, -+ 0x7084, 0xa005, 0x01f0, 0x2011, 0x4e31, 0x080c, 0x6fc6, 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, -+ 0x4e74, 0x00fe, 0x0005, 0x708f, 0x0013, 0x080c, 0x4ef8, 0x20a3, -+ 0x1103, 0x20a3, 0x0000, 0x3430, 0x2011, 0xcc8e, 0x080c, 0x4f3d, -+ 0x1160, 0x7078, 0xa005, 0x1148, 0x7150, 0xa186, 0xffff, 0x0128, -+ 0x080c, 0x4df5, 0x0110, 0x080c, 0x4f1b, 0x20a9, 0x0008, 0x2298, -+ 0x26a0, 0x53a6, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, -+ 0x080c, 0x4e5b, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01f0, 0x2011, -+ 0x4e31, 0x080c, 0x6fc6, 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, 0x4e74, 0x00fe, 0x0005, 0x708f, -+ 0x0015, 0x080c, 0x4ef8, 0x20a3, 0x1104, 0x20a3, 0x0000, 0x3430, -+ 0x2011, 0xcc8e, 0x080c, 0x4f3d, 0x11a8, 0x7078, 0xa005, 0x1190, -+ 0x7158, 0xa186, 0xffff, 0x0170, 0xa180, 0x2f6e, 0x200d, 0xa18c, -+ 0xff00, 0x810f, 0x080c, 0x4df5, 0x0128, 0x080c, 0x442b, 0x0110, -+ 0x080c, 0x2a11, 0x20a9, 0x0008, 0x2298, 0x26a0, 0x53a6, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e5b, 0x0005, -+ 0x00f6, 0x7084, 0xa005, 0x05b8, 0x2011, 0x4e31, 0x080c, 0x6fc6, -+ 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, 0x4e74, 0x00fe, 0x0005, 0x20e1, 0x9080, 0x20e1, -+ 0x4000, 0x2099, 0xcc80, 0x20a1, 0x020b, 0x20a9, 0x000e, 0x53a6, -+ 0x3430, 0x2011, 0xcc8e, 0x708f, 0x0017, 0x080c, 0x4f3d, 0x1150, -+ 0x7078, 0xa005, 0x1138, 0x080c, 0x4d6a, 0x1170, 0xa085, 0x0001, -+ 0x080c, 0x2a11, 0x20a9, 0x0008, 0x2099, 0xcc8e, 0x26a0, 0x53a6, -+ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, 0x4e5b, -+ 0x0010, 0x080c, 0x4981, 0x0005, 0x00f6, 0x7084, 0xa005, 0x01b0, -+ 0x2011, 0x4e31, 0x080c, 0x6fc6, 0xa086, 0x0084, 0x1168, 0x2079, -+ 0xcc80, 0x7a30, 0xa296, 0x1106, 0x1138, 0x7834, 0xa005, 0x1120, -+ 0x708f, 0x0018, 0x0029, 0x0010, 0x080c, 0x4e74, 0x00fe, 0x0005, -+ 0x708f, 0x0019, 0x080c, 0x4ef8, 0x20a3, 0x1106, 0x20a3, 0x0000, -+ 0x3430, 0x2099, 0xcc8e, 0x2039, 0xcc0e, 0x27a0, 0x20a9, 0x0040, -+ 0x53a3, 0x080c, 0x4f3d, 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, 0x4e5b, 0x0005, 0x00f6, -+ 0x7084, 0xa005, 0x01d0, 0x2011, 0x4e31, 0x080c, 0x6fc6, 0xa086, -+ 0x0084, 0x1188, 0x2079, 0xcc80, 0x7a30, 0xa296, 0x1107, 0x1158, -+ 0x7834, 0xa005, 0x1140, 0x708b, 0x0001, 0x080c, 0x4ede, 0x708f, -+ 0x001a, 0x0029, 0x0010, 0x080c, 0x4e74, 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, 0x4e5b, 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, 0x4d7f, 0x0804, 0x4ded, 0x82ff, 0x1160, -+ 0xd5d4, 0x0120, 0xa1a6, 0x3fff, 0x0d90, 0x0020, 0xa1a6, 0x3fff, -+ 0x0904, 0x4ded, 0xa18d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, -+ 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, -+ 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, -+ 0x1f04, 0x4da5, 0x04d0, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, -+ 0x1f04, 0x4db7, 0x2328, 0x8529, 0xa2be, 0x0007, 0x0158, 0x0006, -+ 0x2039, 0x0007, 0x2200, 0xa73a, 0x000e, 0x27a8, 0xa5a8, 0x0010, -+ 0x1f04, 0x4dc6, 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, -+ 0x8c0e, 0x7004, 0xa084, 0x4000, 0x0120, 0x7003, 0x1000, 0x7003, -+ 0x0000, 0x0126, 0x2091, 0x8000, 0x2071, 0xc623, 0x2073, 0x0000, -+ 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x4f04, 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, 0x8c05, 0x2009, 0x07d0, 0x2011, -+ 0x4e31, 0x080c, 0x704f, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x2011, 0x0003, 0x080c, 0x8f27, 0x2011, 0x0002, -+ 0x080c, 0x8f31, 0x080c, 0x8e07, 0x0036, 0x2019, 0x0000, 0x080c, -+ 0x8e92, 0x003e, 0x2009, 0x00f7, 0x080c, 0x4f04, 0x2061, 0xc93a, -+ 0x601b, 0x0000, 0x601f, 0x0000, 0x2061, 0xc600, 0x6003, 0x0001, -+ 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x002d, -+ 0x2011, 0x4ea9, 0x080c, 0x6fba, 0x012e, 0x00ce, 0x002e, 0x001e, -+ 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x0100, -+ 0x080c, 0x8c0e, 0x2071, 0x0140, 0x7004, 0xa084, 0x4000, 0x0120, -+ 0x7003, 0x1000, 0x7003, 0x0000, 0x080c, 0x5f43, 0x01a8, 0x080c, -+ 0x5f61, 0x1190, 0x2001, 0xc8e5, 0x2003, 0xaaaa, 0x0016, 0x080c, -+ 0x2a95, 0x2001, 0xc8d6, 0x2102, 0x001e, 0x2001, 0xc8e6, 0x2003, -+ 0x0000, 0x080c, 0x5e73, 0x0030, 0x2001, 0x0001, 0x080c, 0x296d, -+ 0x080c, 0x4e74, 0x012e, 0x000e, 0x00ee, 0x0005, 0x20a9, 0x0040, -+ 0x20a1, 0xcdc0, 0x2099, 0xcc8e, 0x3304, 0x8007, 0x20a2, 0x9398, -+ 0x94a0, 0x1f04, 0x4ee4, 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, 0xc1a9, -+ 0x2001, 0xc60c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x2009, -+ 0x0000, 0x080c, 0x2e19, 0x004e, 0x001e, 0x0005, 0x080c, 0x4e74, -+ 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, 0x4f5a, 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, 0x5075, 0xa18c, 0xff00, 0x810f, 0xa182, 0x00ff, 0x1a04, -+ 0x507a, 0x2001, 0xc60c, 0x2004, 0xa084, 0x0003, 0x01c0, 0x2001, -+ 0xc60c, 0x2004, 0xd084, 0x1904, 0x505d, 0xa188, 0xc77b, 0x2104, -+ 0xa065, 0x0904, 0x505d, 0x6004, 0xa084, 0x00ff, 0xa08e, 0x0006, -+ 0x1904, 0x505d, 0x6000, 0xd0c4, 0x0904, 0x505d, 0x0068, 0xa188, -+ 0xc77b, 0x2104, 0xa065, 0x0904, 0x5041, 0x6004, 0xa084, 0x00ff, -+ 0xa08e, 0x0006, 0x1904, 0x5046, 0x60a4, 0xa00d, 0x0118, 0x080c, -+ 0x5581, 0x05d0, 0x60a8, 0xa00d, 0x0188, 0x080c, 0x55cc, 0x1170, -+ 0x694c, 0xd1fc, 0x1118, 0x080c, 0x528b, 0x0448, 0x080c, 0x523a, -+ 0x694c, 0xd1ec, 0x1520, 0x080c, 0x5473, 0x0408, 0x694c, 0xa184, -+ 0xa000, 0x0178, 0xd1ec, 0x0140, 0xd1fc, 0x0118, 0x080c, 0x5482, -+ 0x0028, 0x080c, 0x5482, 0x0028, 0xd1fc, 0x0118, 0x080c, 0x523a, -+ 0x0070, 0x6050, 0xa00d, 0x0130, 0x2d00, 0x200a, 0x6803, 0x0000, -+ 0x6052, 0x0028, 0x2d00, 0x6052, 0x604e, 0x6803, 0x0000, 0x080c, -+ 0x79cf, 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, 0x4ffc, 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, 0x5706, 0x11d8, 0x2c70, -+ 0x080c, 0x95a6, 0x0568, 0x2e00, 0x601a, 0x2d00, 0x6012, 0x601f, -+ 0x0009, 0x600b, 0x0000, 0x6844, 0xa08e, 0xff00, 0x1110, 0x600b, -+ 0x8000, 0x2009, 0x0100, 0x080c, 0x962c, 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, 0x5126, -+ 0xa188, 0xc77b, 0x2104, 0xa065, 0x01c0, 0x6004, 0xa084, 0x00ff, -+ 0xa08e, 0x0006, 0x11a8, 0x2c70, 0x080c, 0x95a6, 0x05e8, 0x2e00, -+ 0x601a, 0x2d00, 0x6012, 0x600b, 0xffff, 0x601f, 0x000a, 0x2009, -+ 0x0003, 0x080c, 0x962c, 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, 0x51f1, -+ 0x080c, 0x5356, 0x11a0, 0x6004, 0xa084, 0x00ff, 0xa082, 0x0006, -+ 0x1270, 0x6864, 0xa0c6, 0x006f, 0x0150, 0x2001, 0xc635, 0x2004, -+ 0xd0ac, 0x1904, 0x51da, 0x60a0, 0xd0bc, 0x1904, 0x51da, 0x6864, -+ 0xa0c6, 0x006f, 0x0118, 0x2008, 0x0804, 0x51a3, 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, 0x3f89, 0x2c70, -+ 0x0550, 0x2009, 0x0000, 0x2011, 0x0000, 0xa0c6, 0x4000, 0x1160, -+ 0x0006, 0x2e60, 0x080c, 0x55f7, 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, 0x95a6, 0x1138, 0x2001, 0x4005, -+ 0x2009, 0x0003, 0x2011, 0x0000, 0x0c80, 0x2e00, 0x601a, 0x080c, -+ 0xb077, 0x2d00, 0x6012, 0x601f, 0x0001, 0x6838, 0xd88c, 0x0108, -+ 0xc0f5, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e46, 0x012e, -+ 0x2001, 0x0000, 0x080c, 0x5298, 0x2001, 0x0002, 0x080c, 0x52aa, -+ 0x2009, 0x0002, 0x080c, 0x962c, 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, 0x5482, 0x0431, 0x0030, 0x0421, 0x684c, 0xd0fc, -+ 0x0110, 0x080c, 0x5473, 0x080c, 0x54c0, 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, 0x4f60, 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, 0xacaa, 0x0110, 0x080c, -+ 0x1629, 0x080c, 0x95fc, 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, 0x5f3b, 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, 0x542e, 0x080c, 0x1519, 0x260a, -+ 0x8210, 0x6a06, 0x0098, 0x080c, 0x1602, 0x01a8, 0x2d00, 0x60a6, -+ 0x6803, 0x0000, 0xad88, 0x0004, 0x20a9, 0x0010, 0x200b, 0xffff, -+ 0x8108, 0x1f04, 0x5446, 0x6807, 0x0001, 0x6e12, 0xa085, 0x0001, -+ 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, 0x0126, 0x2091, 0x8000, -+ 0x00d6, 0x60a4, 0xa00d, 0x01a0, 0x2168, 0x6800, 0xa005, 0x1160, -+ 0x080c, 0x5581, 0x1168, 0x200b, 0xffff, 0x6804, 0xa08a, 0x0002, -+ 0x0218, 0x8001, 0x6806, 0x0020, 0x080c, 0x1619, 0x60a7, 0x0000, -+ 0x00de, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x55df, -+ 0x0010, 0x080c, 0x523a, 0x080c, 0x54f9, 0x1dd8, 0x080c, 0x54c0, -+ 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, 0x5494, 0x080c, 0x1519, 0x260a, 0x8210, 0x6a56, -+ 0x0098, 0x080c, 0x1602, 0x01d0, 0x2d00, 0x60aa, 0x6853, 0x0000, -+ 0xad88, 0x0018, 0x20a9, 0x0010, 0x200b, 0xffff, 0x8108, 0x1f04, -+ 0x54ac, 0x6857, 0x0001, 0x6e62, 0x0010, 0x080c, 0x528b, 0x0089, -+ 0x1de0, 0xa085, 0x0001, 0x012e, 0x00de, 0x0005, 0xa006, 0x0cd8, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x79cf, 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, 0x8fd0, -+ 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, -+ 0x557b, 0x1110, 0x2011, 0x0001, 0x080c, 0x55c6, 0x1110, 0xa295, -+ 0x0002, 0x0005, 0x080c, 0x55f7, 0x0118, 0x080c, 0xad5f, 0x0010, -+ 0xa085, 0x0001, 0x0005, 0x080c, 0x55f7, 0x0118, 0x080c, 0xacef, -+ 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55f7, 0x0118, 0x080c, -+ 0xad42, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55f7, 0x0118, -+ 0x080c, 0xad0b, 0x0010, 0xa085, 0x0001, 0x0005, 0x080c, 0x55f7, -+ 0x0118, 0x080c, 0xad7b, 0x0010, 0xa085, 0x0001, 0x0005, 0x0126, -+ 0x0006, 0x00d6, 0x2091, 0x8000, 0x6080, 0xa06d, 0x01a0, 0x6800, -+ 0x0006, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0xaf1c, -+ 0x0006, 0x6000, 0xd0fc, 0x0110, 0x080c, 0xc4f9, 0x000e, 0x080c, -+ 0x5823, 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, 0x558a, -+ 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, 0x55aa, 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, 0x55d5, 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, 0x5f3b, 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, 0x5356, 0x1168, 0x6004, 0xa084, 0xff00, 0x8007, 0xa096, -+ 0x0004, 0x0118, 0xa086, 0x0006, 0x1118, 0x6000, 0xc0ed, 0x6002, -+ 0x001e, 0x8108, 0x1f04, 0x561f, 0x00ce, 0x015e, 0x080c, 0x5724, -+ 0x0120, 0x2001, 0xc8fc, 0x200c, 0x0038, 0x2079, 0xc652, 0x7804, -+ 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, 0x564a, 0x080c, 0x704f, -+ 0x00fe, 0x0005, 0x2011, 0x564a, 0x080c, 0x6fc6, 0x080c, 0x5724, -+ 0x01f0, 0x2001, 0xc7f9, 0x2004, 0xa080, 0x0000, 0x200c, 0xc1ec, -+ 0x2102, 0x2001, 0xc653, 0x2004, 0xd0a4, 0x0130, 0x2009, 0x07d0, -+ 0x2011, 0x564a, 0x080c, 0x704f, 0x00e6, 0x2071, 0xc600, 0x7073, -+ 0x0000, 0x7077, 0x0000, 0x080c, 0x2c62, 0x00ee, 0x04b0, 0x0156, -+ 0x00c6, 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x080c, 0x5356, -+ 0x1530, 0x6000, 0xd0ec, 0x0518, 0x0046, 0x62a0, 0xa294, 0x00ff, -+ 0x8227, 0xa006, 0x2009, 0x0029, 0x080c, 0xc1a9, 0x6000, 0xc0e5, -+ 0xc0ec, 0x6002, 0x6004, 0xa084, 0x00ff, 0xa085, 0x0700, 0x6006, -+ 0x2019, 0x0029, 0x080c, 0x7b2f, 0x0076, 0x2039, 0x0000, 0x080c, -+ 0x7a27, 0x2009, 0x0000, 0x080c, 0xbf10, 0x007e, 0x004e, 0x001e, -+ 0x8108, 0x1f04, 0x5675, 0x00ce, 0x015e, 0x0005, 0x00c6, 0x6018, -+ 0x2060, 0x6000, 0xc0ec, 0x6002, 0x00ce, 0x0005, 0x00c6, 0x00d6, -+ 0x080c, 0x15e5, 0x2d60, 0x0508, 0x2009, 0x00ff, 0x60a7, 0x0000, -+ 0x60ab, 0x0000, 0x080c, 0x4f60, 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, 0x5356, 0x1178, 0x2c70, 0x70ac, 0xa005, -+ 0x0158, 0x2060, 0x620c, 0x0026, 0x6010, 0x2068, 0x080c, 0x7633, -+ 0x002e, 0x2260, 0x82ff, 0x1db0, 0x001e, 0x8108, 0x1f04, 0x56e9, -+ 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, 0x5752, 0x080c, -+ 0x704f, 0x0005, 0x2011, 0x5752, 0x080c, 0x6fc6, 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, 0x57ed, 0x2001, -+ 0xc672, 0x200c, 0xa184, 0x000f, 0x2009, 0xc673, 0x210c, 0x0002, -+ 0x5795, 0x57c8, 0x57cf, 0x57d9, 0x57de, 0x5795, 0x5795, 0x5795, -+ 0x57b8, 0x5795, 0x5795, 0x5795, 0x5795, 0x5795, 0x5795, 0x5795, -+ 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, 0x587c, 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, 0x588c, 0x20a9, 0x0032, 0x0f04, 0x588a, -+ 0x0e04, 0x5846, 0x2071, 0xc87b, 0x7200, 0x82ff, 0x05d8, 0x6934, -+ 0xa186, 0x0103, 0x1904, 0x589a, 0x6948, 0x6844, 0xa105, 0x1540, -+ 0x2009, 0x8020, 0x2200, 0x0002, 0x588a, 0x5861, 0x5901, 0x590e, -+ 0x588a, 0x2071, 0x0000, 0x20a9, 0x0032, 0x0f04, 0x588a, 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, 0x585a, 0x6848, 0xa005, 0x1960, 0x2009, 0x8022, -+ 0x0804, 0x585a, 0x2071, 0x0000, 0x7018, 0xd084, 0x1918, 0x00e6, -+ 0x2071, 0xc682, 0x7140, 0x00ee, 0x6838, 0xa102, 0x0a04, 0x588a, -+ 0x684c, 0xa005, 0x1158, 0x00e6, 0x2071, 0xc682, 0x7004, 0x00ee, -+ 0xd08c, 0x1904, 0x588a, 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, -+ 0x586f, 0x7084, 0x8008, 0xa092, 0x001e, 0x1a04, 0x588a, 0x7186, -+ 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x0080, 0x7084, 0x8008, -+ 0xa092, 0x000f, 0x1a04, 0x588a, 0x7186, 0xae90, 0x0003, 0x8003, -+ 0xa210, 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7088, 0xa10a, -+ 0x0a04, 0x5873, 0x718c, 0x7084, 0xa10a, 0x0a04, 0x5873, 0x2071, -+ 0x0000, 0x7018, 0xd084, 0x1904, 0x5873, 0x2071, 0xc87b, 0x7000, -+ 0xa086, 0x0002, 0x1150, 0x080c, 0x5b8e, 0x2071, 0x0000, 0x701b, -+ 0x0001, 0x2091, 0x4080, 0x0804, 0x5873, 0x080c, 0x5bb8, 0x2071, -+ 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, 0x0804, 0x5873, 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, -+ 0x596a, 0x597b, 0x5b79, 0x5b7a, 0x5b87, 0x5b8d, 0x596b, 0x5b6a, -+ 0x5b00, 0x5b56, 0x0005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x597a, -+ 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, 0x599e, 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, 0x59f4, 0x00a0, 0x81ff, -+ 0x0904, 0x5aba, 0x2071, 0xc87b, 0x7184, 0x7088, 0xa10a, 0x1258, -+ 0x7190, 0x2071, 0xc93a, 0x7038, 0xa005, 0x0128, 0x1b04, 0x5aba, -+ 0x713a, 0x0804, 0x5aba, 0x2071, 0xc87b, 0x718c, 0x0126, 0x2091, -+ 0x8000, 0x7084, 0xa10a, 0x0a04, 0x5ad5, 0x0e04, 0x5a76, 0x2071, -+ 0x0000, 0x7018, 0xd084, 0x1904, 0x5a76, 0x2001, 0xffff, 0x2071, -+ 0xc93a, 0x703a, 0x2071, 0xc87b, 0x7000, 0xa086, 0x0002, 0x1150, -+ 0x080c, 0x5b8e, 0x2071, 0x0000, 0x701b, 0x0001, 0x2091, 0x4080, -+ 0x0804, 0x5a76, 0x080c, 0x5bb8, 0x2071, 0x0000, 0x701b, 0x0001, -+ 0x2091, 0x4080, 0x0804, 0x5a76, 0x2071, 0xc87b, 0x7000, 0xa005, -+ 0x0904, 0x5a9c, 0x6934, 0xa186, 0x0103, 0x1904, 0x5a79, 0x684c, -+ 0xd0bc, 0x1904, 0x5a9c, 0x6948, 0x6844, 0xa105, 0x1904, 0x5a91, -+ 0x2009, 0x8020, 0x2071, 0xc87b, 0x7000, 0x0002, 0x5a9c, 0x5a5c, -+ 0x5a34, 0x5a46, 0x5a13, 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, 0x5aba, 0x7084, 0x8008, 0xa092, 0x001e, -+ 0x1a04, 0x5aba, 0xae90, 0x0003, 0xa210, 0x683c, 0x2012, 0x7186, -+ 0x2071, 0xc734, 0x080c, 0x5c0f, 0x0804, 0x5aba, 0x7084, 0x8008, -+ 0xa092, 0x000f, 0x1a04, 0x5aba, 0xae90, 0x0003, 0x8003, 0xa210, -+ 0x683c, 0x2012, 0x8210, 0x6840, 0x2012, 0x7186, 0x2071, 0xc734, -+ 0x080c, 0x5c0f, 0x0804, 0x5aba, 0x0126, 0x2091, 0x8000, 0x0e04, -+ 0x5a76, 0x2071, 0x0000, 0x7018, 0xd084, 0x1180, 0x7122, 0x683c, -+ 0x7026, 0x6840, 0x702a, 0x701b, 0x0001, 0x2091, 0x4080, 0x012e, -+ 0x2071, 0xc734, 0x080c, 0x5c0f, 0x0804, 0x5aba, 0x012e, 0x0804, -+ 0x5aba, 0xa18c, 0x00ff, 0xa186, 0x0017, 0x0130, 0xa186, 0x001e, -+ 0x0118, 0xa18e, 0x001f, 0x11c0, 0x684c, 0xd0cc, 0x01a8, 0x6850, -+ 0xa084, 0x00ff, 0xa086, 0x0001, 0x1178, 0x2009, 0x8021, 0x0804, -+ 0x5a0a, 0x6844, 0xa086, 0x0100, 0x1138, 0x6868, 0xa005, 0x1120, -+ 0x2009, 0x8020, 0x0804, 0x5a0a, 0x2071, 0xc734, 0x080c, 0x5c21, -+ 0x01c8, 0x2071, 0xc734, 0x700f, 0x0001, 0x6934, 0xa184, 0x00ff, -+ 0xa086, 0x0003, 0x1130, 0x810f, 0xa18c, 0x00ff, 0x8101, 0x0108, -+ 0x710e, 0x7007, 0x0003, 0x080c, 0x5c3a, 0x7050, 0xa086, 0x0100, -+ 0x0904, 0x5b7a, 0x0126, 0x2091, 0x8000, 0x2071, 0xc734, 0x7008, -+ 0xa086, 0x0001, 0x1180, 0x0e04, 0x5ad3, 0x2009, 0x000d, 0x7030, -+ 0x200a, 0x2091, 0x4080, 0x700b, 0x0000, 0x7004, 0xa086, 0x0006, -+ 0x1110, 0x7007, 0x0001, 0x012e, 0x0005, 0x2071, 0xc734, 0x080c, -+ 0x5c21, 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, 0x5aba, -+ 0x2069, 0xc8c3, 0x6808, 0xa08e, 0x0000, 0x0904, 0x5b55, 0xa08e, -+ 0x0200, 0x0904, 0x5b53, 0xa08e, 0x0100, 0x1904, 0x5b55, 0x0126, -+ 0x2091, 0x8000, 0x0e04, 0x5b51, 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, 0x5c0f, -+ 0x0005, 0xa08e, 0x0000, 0x0de0, 0xa08e, 0x0200, 0x1dc8, 0x7007, -+ 0x0005, 0x0005, 0x701c, 0xa06d, 0x0158, 0x080c, 0x5c21, 0x0140, -+ 0x7007, 0x0003, 0x080c, 0x5c3a, 0x7050, 0xa086, 0x0100, 0x0110, -+ 0x0005, 0x0005, 0x7050, 0xa09e, 0x0100, 0x1118, 0x7007, 0x0004, -+ 0x0030, 0xa086, 0x0200, 0x1110, 0x7007, 0x0005, 0x0005, 0x080c, -+ 0x5bdd, 0x7006, 0x080c, 0x5c0f, 0x0005, 0x0005, 0x00e6, 0x0156, -+ 0x2071, 0xc87b, 0x7184, 0x81ff, 0x0500, 0xa006, 0x7086, 0xae80, -+ 0x0003, 0x2071, 0x0000, 0x21a8, 0x2014, 0x7226, 0x8000, 0x0f04, -+ 0x5bb2, 0x2014, 0x722a, 0x8000, 0x0f04, 0x5bb2, 0x2014, 0x722e, -+ 0x8000, 0x0f04, 0x5bb2, 0x2014, 0x723a, 0x8000, 0x0f04, 0x5bb2, -+ 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, 0x5bd4, 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, 0x5c09, 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, 0x5d48, 0x5cc3, 0x5cdb, 0x5d18, 0x5d39, 0x5d73, -+ 0x5d85, 0x5cdb, 0x5d5f, 0x5c67, 0x5c95, 0x5c66, 0x0005, 0x00d6, -+ 0x2069, 0x0200, 0x6804, 0xa005, 0x1180, 0x6808, 0xa005, 0x1518, -+ 0x708f, 0x0028, 0x2069, 0xc90c, 0x2d04, 0x7002, 0x080c, 0x603d, -+ 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, 0x60ca, 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, 0x5df0, 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, -+ 0x708f, 0x0020, 0x080c, 0x5df0, 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, 0x5f6b, 0x080c, 0x25fb, -+ 0x0156, 0x6803, 0x0100, 0x20a9, 0x0014, 0x6804, 0xd0dc, 0x1118, -+ 0x1f04, 0x5cf5, 0x0048, 0x20a9, 0x0014, 0x6803, 0x0080, 0x6804, -+ 0xd0d4, 0x1130, 0x1f04, 0x5cff, 0x080c, 0x5f8c, 0x015e, 0x0078, -+ 0x015e, 0x708f, 0x0028, 0x0058, 0x708f, 0x001e, 0x0040, 0x708f, -+ 0x001d, 0x0028, 0x708f, 0x0020, 0x0010, 0x708f, 0x001f, 0x0005, -+ 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x5f6b, 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, 0x5e62, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x5df0, 0x0016, -+ 0x080c, 0x1f06, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x708f, -+ 0x001e, 0x0020, 0x708f, 0x001f, 0x080c, 0x5df0, 0x0005, 0x6803, -+ 0x00a0, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, 0x1128, -+ 0xd1e4, 0x0140, 0x708f, 0x001e, 0x0028, 0x708f, 0x001d, 0x0010, -+ 0x708f, 0x0021, 0x0005, 0x080c, 0x5e62, 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, 0x5f3b, 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, 0x5f57, 0x0150, 0x080c, 0x5f4d, 0x1138, 0x2001, -+ 0x0001, 0x080c, 0x296d, 0x080c, 0x5f12, 0x00a0, 0x080c, 0x5e5f, -+ 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, 0x5e01, 0x080c, 0x7089, 0x002e, 0x0016, 0x0026, -+ 0x2009, 0x0064, 0x2011, 0x5e01, 0x080c, 0x7080, 0x002e, 0x001e, -+ 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, 0x8c0e, 0x2071, 0xc600, -+ 0x080c, 0x5d9c, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, -+ 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x8c0e, - 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, 0xc579, -- 0x080c, 0xc594, 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, -- 0x1110, 0x080c, 0x1f06, 0x60e3, 0x0000, 0x2001, 0xc8d6, 0x2004, -- 0x080c, 0x2a1c, 0x60e2, 0x080c, 0x25fb, 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, -+ 0x6028, 0xc09c, 0x602a, 0x2011, 0x0003, 0x080c, 0x8f27, 0x2011, -+ 0x0002, 0x080c, 0x8f31, 0x080c, 0x8e07, 0x080c, 0x703d, 0x0036, -+ 0x2019, 0x0000, 0x080c, 0x8e92, 0x003e, 0x60e3, 0x0000, 0x080c, -+ 0xc59f, 0x080c, 0xc5ba, 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, 0x5e6b, 0x2091, 0x6000, 0x1f04, -+ 0x5e6b, 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, 0x5f00, 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, 0x8f27, 0x2011, -+ 0x0002, 0x080c, 0x8f31, 0x080c, 0x8e07, 0x0036, 0x2019, 0x0000, -+ 0x080c, 0x8e92, 0x003e, 0x002e, 0x7000, 0xa08e, 0x0004, 0x0118, -+ 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, 0x2091, -+ 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0120, 0x012e, 0x015e, -+ 0x0804, 0x5f0e, 0x6800, 0xa084, 0x00a0, 0xc0bd, 0x6802, 0x6904, -+ 0xd1d4, 0x1130, 0x6803, 0x0100, 0x1f04, 0x5ec3, 0x080c, 0x5f8c, -+ 0x012e, 0x015e, 0x080c, 0x5f4d, 0x01a8, 0x6044, 0xa005, 0x0168, -+ 0x6050, 0x0006, 0xa085, 0x0020, 0x6052, 0x080c, 0x5f8c, 0xa006, -+ 0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, -+ 0x080c, 0x5f8c, 0x0016, 0x0026, 0x2009, 0x00c8, 0x2011, 0x5e0e, -+ 0x080c, 0x704f, 0x002e, 0x001e, 0x2001, 0xc8e6, 0x2003, 0x0004, -+ 0x080c, 0x5c4d, 0x080c, 0x5f4d, 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, 0x6035, 0x2001, 0xc60c, 0x200c, -+ 0xc1bc, 0x2102, 0x6028, 0xa084, 0xe1ff, 0x602a, 0x6027, 0x0200, -+ 0x6803, 0x0090, 0x20a9, 0x0384, 0x6024, 0xd0cc, 0x1508, 0x1d04, -+ 0x5fe4, 0x2091, 0x6000, 0x1f04, 0x5fe4, 0x2011, 0x0003, 0x080c, -+ 0x8f27, 0x2011, 0x0002, 0x080c, 0x8f31, 0x080c, 0x8e07, 0x2019, -+ 0x0000, 0x080c, 0x8e92, 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, 0x601a, 0x2091, 0x6000, 0x1f04, 0x601a, -+ 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, 0x6091, 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, 0x6074, 0x2091, 0x6000, -+ 0x1f04, 0x6074, 0x0804, 0x60c2, 0x2069, 0x0140, 0x20a9, 0x0384, -+ 0x6027, 0x1e00, 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x0520, -+ 0xa084, 0x1a00, 0x1508, 0x1d04, 0x6080, 0x2091, 0x6000, 0x1f04, -+ 0x6080, 0x2011, 0x0003, 0x080c, 0x8f27, 0x2011, 0x0002, 0x080c, -+ 0x8f31, 0x080c, 0x8e07, 0x2019, 0x0000, 0x080c, 0x8e92, 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, 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, -- 0xc100, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, 0x007e, -- 0x01a0, 0xa186, 0x0080, 0x0188, 0x080c, 0x533d, 0x1170, 0x8127, -- 0xa006, 0x0016, 0x2009, 0x000e, 0x080c, 0xc183, 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, 0xaefc, 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, 0xae4d, 0x0068, -- 0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, 0x6950, -- 0x6156, 0x2009, 0x0041, 0x080c, 0x960c, 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, 0xae4d, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xae4d, -- 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, 0xbd48, 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, 0x9586, 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, 0x960c, 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, 0x95dc, 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, 0x9586, 0x1118, 0x080c, 0xaf06, -- 0x05a0, 0x621a, 0x6844, 0x0002, 0x6890, 0x6895, 0x6898, 0x689e, -- 0x2019, 0x0002, 0x080c, 0xc100, 0x0060, 0x080c, 0xc097, 0x0048, -- 0x2019, 0x0002, 0x6950, 0x080c, 0xc0b2, 0x0018, 0x6950, 0x080c, -- 0xc097, 0x080c, 0x95dc, 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, 0x960c, 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, 0xc529, -- 0x20e1, 0x3000, 0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, 0x015e, -- 0x0880, 0x0439, 0x1130, 0x7000, 0xa084, 0xff00, 0xa086, 0x8100, -- 0x1d68, 0x080c, 0xc529, 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, 0x960c, -- 0x0804, 0x6b2c, 0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, 0x1130, -- 0x2009, 0x0015, 0x080c, 0x960c, 0x0804, 0x6b2c, 0xa08e, 0x0100, -- 0x1904, 0x6b2c, 0x7034, 0xa005, 0x1904, 0x6b2c, 0x2009, 0x0016, -- 0x080c, 0x960c, 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, 0x9586, 0x0168, 0x001e, 0x611a, 0x601f, 0x0004, 0x7120, -- 0x610a, 0x001e, 0x080c, 0x960c, 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, 0x960c, 0x04b0, 0xa08e, 0x0100, 0x1598, -- 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c, 0x960c, 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, 0x9586, 0x0170, 0x001e, 0x611a, 0x080c, 0xb057, 0x601f, -- 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x960c, 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, 0x960c, -- 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, 0x9586, 0x001e, 0x0530, -- 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, 0x2009, -- 0x0044, 0x080c, 0x960c, 0x00c0, 0x00c6, 0x080c, 0x9586, 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, 0xaf06, 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, 0x960c, 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, 0x9586, 0x001e, 0x05f0, 0x611a, -- 0x080c, 0xb057, 0x601f, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, -- 0x080c, 0x960c, 0x0490, 0xa28c, 0x00ff, 0xa186, 0x0006, 0x0160, -- 0xa186, 0x0004, 0x0148, 0xa294, 0xff00, 0x8217, 0xa286, 0x0004, -- 0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, 0x080c, 0x9586, 0x001e, -- 0x01e0, 0x611a, 0x080c, 0xb057, 0x601f, 0x0005, 0x7120, 0x610a, -- 0x2009, 0x0088, 0x080c, 0x960c, 0x0080, 0x00c6, 0x080c, 0x9586, -- 0x001e, 0x0158, 0x611a, 0x080c, 0xb057, 0x601f, 0x0004, 0x7120, -- 0x610a, 0x2009, 0x0001, 0x080c, 0x960c, 0x0005, 0x7110, 0xd1bc, -- 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, -- 0x960c, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, 0x7124, -- 0x610a, 0x2009, 0x008a, 0x080c, 0x960c, 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, 0x9586, 0x01b8, -- 0x20e1, 0x0002, 0x3e08, 0xd19c, 0x0118, 0x6124, 0xc19d, 0x6126, -- 0x2e00, 0x601a, 0x620a, 0x601f, 0x0009, 0x2009, 0x0101, 0x080c, -- 0x960c, 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, 0x960c, 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, 0x9586, 0x0598, 0x0066, 0x00c6, 0x0046, 0x2011, 0xcc83, -- 0x2204, 0x8211, 0x220c, 0x080c, 0x29c7, 0x1580, 0x080c, 0x52e1, -- 0x1568, 0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, 0x080c, -- 0xb057, 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, 0x95dc, 0x006e, 0x0cc0, 0x004e, 0x00ce, -- 0x0cc8, 0x0156, 0x0046, 0x2e00, 0xa0a0, 0x000e, 0x2404, 0x2020, -- 0x8427, 0xa4a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0003, 0x2019, -- 0xc606, 0x2011, 0xcc9b, 0x080c, 0xa0fc, 0x11d8, 0xd48c, 0x0148, -- 0x20a9, 0x0003, 0x2019, 0xc602, 0x2011, 0xcc9f, 0x080c, 0xa0fc, -- 0x1180, 0xd494, 0x0170, 0x080c, 0x7694, 0x0148, 0x20a9, 0x0008, -- 0x2019, 0xc69a, 0x2011, 0xccaa, 0x080c, 0xa111, 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, 0xa0fc, -- 0x11d8, 0xd48c, 0x0148, 0x20a9, 0x0003, 0x2019, 0xc602, 0x2011, -- 0xcc97, 0x080c, 0xa0fc, 0x1180, 0xd494, 0x0170, 0x080c, 0x7694, -- 0x0148, 0x20a9, 0x0008, 0x2019, 0xc69a, 0x2011, 0xcca2, 0x080c, -- 0xa111, 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, 0xaf45, -- 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, 0xaa15, 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, -- 0x960c, 0x0005, 0x87ff, 0x1120, 0x2009, 0x0043, 0x080c, 0x960c, -- 0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, 0x0118, 0xa086, 0x0003, -- 0x11f0, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x960c, 0x0005, -- 0xd0fc, 0x0160, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0148, 0x87ff, -- 0x1120, 0x2009, 0x0041, 0x080c, 0x960c, 0x0005, 0x0061, 0x0ce8, -- 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x960c, 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, 0x95dc, 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, 0x95dc, 0x00de, -- 0x0005, 0x080c, 0x7e47, 0x00f6, 0x00d6, 0x6110, 0x2178, 0x080c, -- 0xac8a, 0x0150, 0x00e6, 0x6018, 0x2070, 0xa006, 0x70b2, 0x70b6, -- 0x00ee, 0x2f68, 0x080c, 0x580a, 0x00de, 0x00fe, 0x080c, 0x95dc, -- 0x080c, 0x7f6e, 0x0005, 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, -- 0x6110, 0x2168, 0x080c, 0xac8a, 0x0120, 0x684b, 0x0029, 0x080c, -- 0x580a, 0x00de, 0x080c, 0x95dc, 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, 0x95dc, 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, -- 0x95dc, 0x0005, 0x00d6, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6110, -- 0x2168, 0x684b, 0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, -- 0x68bb, 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, -- 0x95dc, 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, 0x90ef, 0x6110, 0x2168, -- 0x684b, 0x0006, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, 0x68bb, -- 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x580a, 0x080c, 0x95dc, -- 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, 0x90ef, 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, 0x960c, 0x00ce, -- 0x0005, 0x3900, 0xa082, 0xca74, 0x1210, 0x080c, 0x91c4, 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, 0xc58e, 0x2009, 0x0014, 0x080c, 0x960c, 0x00ce, 0x0838, -- 0x2001, 0xc943, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, 0x782b, -- 0x0000, 0x7824, 0xa065, 0x090c, 0x1519, 0x2009, 0x0013, 0x080c, -- 0x9660, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, 0xca74, -- 0x1210, 0x080c, 0x91c4, 0x7824, 0xa005, 0x090c, 0x1519, 0x781c, -- 0xa06d, 0x090c, 0x1519, 0x6800, 0xc0dc, 0x6802, 0x7924, 0x2160, -- 0x080c, 0x95dc, 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, 0x960c, 0x00ce, 0x0005, 0x2011, 0xc946, 0x2013, -- 0x0000, 0x0cc8, 0x3908, 0xa192, 0xca74, 0x1210, 0x080c, 0x91c4, -- 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, 0xac8a, 0x01c8, 0x6010, 0x2068, 0x601c, 0xa086, -- 0x0003, 0x1580, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x0016, -- 0x0036, 0x0076, 0x080c, 0xaefc, 0x080c, 0xc4ca, 0x080c, 0x580a, -- 0x007e, 0x003e, 0x001e, 0x080c, 0xae41, 0x080c, 0xae4d, 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, 0x95dc, -- 0x08b0, 0x0016, 0x0036, 0x0076, 0x080c, 0xc4ca, 0x080c, 0xc134, -- 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, 0xac8a, 0x0178, 0x6010, 0x2068, 0x601c, 0xa086, -- 0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, -- 0x580a, 0x080c, 0xae41, 0x080c, 0xae4d, 0x000e, 0x0888, 0x7e3a, -- 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, 0x0005, -- 0x601c, 0xa086, 0x0006, 0x0150, 0x601c, 0xa086, 0x0009, 0x1148, -- 0x6b4a, 0x080c, 0x580a, 0x080c, 0x95dc, 0x0c38, 0x080c, 0xc134, -- 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, 0x90df, 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, -+ 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, 0x8f27, 0x2011, 0x0002, 0x080c, -+ 0x8f31, 0x080c, 0x8e07, 0x2019, 0x0000, 0x080c, 0x8e92, 0x2069, -+ 0x0140, 0x6803, 0x00a0, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, -+ 0xc600, 0x2003, 0x0001, 0x0804, 0x6167, 0x2001, 0xc60c, 0x200c, -+ 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x5df6, 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, 0x611e, -+ 0x2091, 0x6000, 0x1f04, 0x611e, 0x0804, 0x6167, 0x6027, 0x1e00, -+ 0x2009, 0x1e00, 0xe000, 0x6024, 0xa10c, 0x01c8, 0xa084, 0x1c00, -+ 0x11b0, 0x1d04, 0x6126, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, -+ 0x080c, 0x6f23, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, -+ 0x2071, 0xc93a, 0x7018, 0x00ee, 0xa005, 0x1d00, 0x0500, 0x0026, -+ 0x2011, 0x5e0e, 0x080c, 0x6fc6, 0x2011, 0x5e01, 0x080c, 0x7089, -+ 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, 0x61d4, 0x7130, 0xc185, 0x7132, -+ 0x2011, 0xc653, 0x220c, 0xd1a4, 0x0530, 0x0016, 0x2019, 0x000e, -+ 0x080c, 0xc126, 0x0156, 0x20a9, 0x007f, 0x2009, 0x0000, 0xa186, -+ 0x007e, 0x01a0, 0xa186, 0x0080, 0x0188, 0x080c, 0x5356, 0x1170, -+ 0x8127, 0xa006, 0x0016, 0x2009, 0x000e, 0x080c, 0xc1a9, 0x2009, -+ 0x0001, 0x2011, 0x0100, 0x080c, 0x7147, 0x001e, 0x8108, 0x1f04, -+ 0x619f, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0000, -+ 0x2019, 0x0004, 0x080c, 0x2e19, 0x001e, 0x0070, 0x0156, 0x20a9, -+ 0x007f, 0x2009, 0x0000, 0x080c, 0x5356, 0x1110, 0x080c, 0x4f60, -+ 0x8108, 0x1f04, 0x61cb, 0x015e, 0x080c, 0x1f06, 0x2011, 0x0003, -+ 0x080c, 0x8f27, 0x2011, 0x0002, 0x080c, 0x8f31, 0x080c, 0x8e07, -+ 0x0036, 0x2019, 0x0000, 0x080c, 0x8e92, 0x003e, 0x60e3, 0x0000, -+ 0x2001, 0xc600, 0x2003, 0x0001, 0x080c, 0x5e73, 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, 0x6250, 0x6247, 0x6247, 0x6247, 0x6247, -+ 0x0005, 0x62a6, 0x62a7, 0x62d9, 0x62da, 0x62a4, 0x6328, 0x632d, -+ 0x635e, 0x635f, 0x637a, 0x637b, 0x637c, 0x637d, 0x637e, 0x637f, -+ 0x644a, 0x6471, 0x700c, 0x0002, 0x6269, 0x62a4, 0x62a4, 0x62a5, -+ 0x62a5, 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, 0x62ae, 0x62b1, 0x62bf, 0x62d8, 0x62d8, 0x080c, 0x6262, -+ 0x0005, 0x0126, 0x8001, 0x700e, 0x7058, 0x0006, 0x080c, 0x67ed, -+ 0x0120, 0x2091, 0x8000, 0x080c, 0x6262, 0x00de, 0x0048, 0x0126, -+ 0x8001, 0x700e, 0x080c, 0x67ed, 0x7058, 0x2068, 0x7084, 0x705a, -+ 0x6803, 0x0000, 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, -+ 0x003a, 0x1218, 0x00db, 0x012e, 0x0005, 0x012e, 0x080c, 0x6380, -+ 0x0005, 0x0005, 0x0005, 0x00e6, 0x2071, 0xc702, 0x700c, 0x0002, -+ 0x62e5, 0x62e5, 0x62e5, 0x62e7, 0x62ea, 0x00ee, 0x0005, 0x700f, -+ 0x0001, 0x0010, 0x700f, 0x0002, 0x00ee, 0x0005, 0x6380, 0x6380, -+ 0x639c, 0x6380, 0x6557, 0x6380, 0x6380, 0x6380, 0x6380, 0x6380, -+ 0x639c, 0x6599, 0x65dc, 0x6625, 0x6639, 0x6380, 0x6380, 0x63b8, -+ 0x639c, 0x63cc, 0x6380, 0x6427, 0x66e5, 0x6700, 0x6380, 0x63b8, -+ 0x6380, 0x63cc, 0x6380, 0x6380, 0x641d, 0x6700, 0x6380, 0x6380, -+ 0x6380, 0x6380, 0x6380, 0x6380, 0x6380, 0x6380, 0x6380, 0x63e1, -+ 0x6380, 0x6380, 0x6380, 0x6380, 0x6380, 0x6380, 0x6380, 0x6380, -+ 0x6380, 0x687f, 0x6380, 0x680b, 0x6380, 0x680b, 0x6380, 0x63f6, -+ 0x7020, 0x2068, 0x080c, 0x1619, 0x0005, 0x700c, 0x0002, 0x6334, -+ 0x6337, 0x6345, 0x635d, 0x635d, 0x080c, 0x6262, 0x0005, 0x0126, -+ 0x8001, 0x700e, 0x7058, 0x0006, 0x080c, 0x67ed, 0x0120, 0x2091, -+ 0x8000, 0x080c, 0x6262, 0x00de, 0x0048, 0x0126, 0x8001, 0x700e, -+ 0x080c, 0x67ed, 0x7058, 0x2068, 0x7084, 0x705a, 0x6803, 0x0000, -+ 0x6807, 0x0000, 0x6834, 0xa084, 0x00ff, 0xa08a, 0x001a, 0x1218, -+ 0x003b, 0x012e, 0x0005, 0x012e, 0x0419, 0x0005, 0x0005, 0x0005, -+ 0x6380, 0x639c, 0x6543, 0x6380, 0x639c, 0x6380, 0x639c, 0x639c, -+ 0x6380, 0x639c, 0x6543, 0x639c, 0x639c, 0x639c, 0x639c, 0x639c, -+ 0x6380, 0x639c, 0x6543, 0x6380, 0x6380, 0x639c, 0x6380, 0x6380, -+ 0x6380, 0x639c, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, -+ 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0d5, 0x683a, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x5823, 0x012e, 0x0005, 0x7007, 0x0001, -+ 0x6838, 0xa084, 0x00ff, 0xc0e5, 0x683a, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x5823, 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, -+ 0x00ff, 0xc0ed, 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x5823, -+ 0x012e, 0x0005, 0x7007, 0x0001, 0x6838, 0xa084, 0x00ff, 0xc0dd, -+ 0x683a, 0x0126, 0x2091, 0x8000, 0x080c, 0x5823, 0x012e, 0x0005, -+ 0x6834, 0x8007, 0xa084, 0x00ff, 0x0988, 0x8001, 0x1120, 0x7007, -+ 0x0001, 0x0804, 0x64da, 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, -+ 0x701a, 0x704b, 0x64da, 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, -+ 0x0904, 0x638e, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x64f7, -+ 0x7007, 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x64f7, -+ 0x0005, 0x6834, 0x8007, 0xa084, 0x00ff, 0x0904, 0x638e, 0x8001, -+ 0x1120, 0x7007, 0x0001, 0x0804, 0x6520, 0x7007, 0x0006, 0x7012, -+ 0x2d00, 0x7016, 0x701a, 0x704b, 0x6520, 0x0005, 0x6834, 0x8007, -+ 0xa084, 0x00ff, 0xa086, 0x0001, 0x1904, 0x638e, 0x7007, 0x0001, -+ 0x2009, 0xc631, 0x210c, 0x81ff, 0x11a8, 0x6838, 0xa084, 0x00ff, -+ 0x683a, 0x6853, 0x0000, 0x080c, 0x512f, 0x1108, 0x0005, 0x0126, -+ 0x2091, 0x8000, 0x6837, 0x0139, 0x684a, 0x6952, 0x080c, 0x5823, -+ 0x012e, 0x0ca0, 0x2001, 0x0028, 0x0c90, 0x684c, 0xa084, 0x00c0, -+ 0xa086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x6718, 0x2d00, -+ 0x7016, 0x701a, 0x20a9, 0x0004, 0xa080, 0x0024, 0x2098, 0x20a1, -+ 0xc72d, 0x53a3, 0x6858, 0x7012, 0xa082, 0x0401, 0x1a04, 0x63aa, -+ 0x6a84, 0xa28a, 0x0002, 0x1a04, 0x63aa, 0x82ff, 0x1138, 0x6888, -+ 0x698c, 0xa105, 0x0118, 0x2001, 0x64ad, 0x0018, 0xa280, 0x64a3, -+ 0x2005, 0x70c6, 0x7010, 0xa015, 0x0904, 0x648f, 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, 0x63aa, 0x7020, 0x2068, 0x7018, 0x6802, 0x6807, -+ 0x0000, 0x2d08, 0x2068, 0x6906, 0x711a, 0x0804, 0x644a, 0x7014, -+ 0x2068, 0x7007, 0x0001, 0x6884, 0xa005, 0x1128, 0x6888, 0x698c, -+ 0xa105, 0x0108, 0x00b1, 0x6834, 0xa084, 0x00ff, 0xa086, 0x001e, -+ 0x0904, 0x6718, 0x04b8, 0x64a5, 0x64a9, 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, 0x4fbf, 0x1108, 0x0005, 0x080c, -+ 0x5947, 0x0126, 0x2091, 0x8000, 0x080c, 0xaf1c, 0x080c, 0x5823, -+ 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, 0x5081, 0x1108, 0x0005, 0x684a, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x5823, 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, 0x50d3, -+ 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0x684a, 0x6952, 0x080c, -+ 0x5823, 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, 0x5356, 0x11b8, 0x0066, 0x6e50, 0x080c, -+ 0x5455, 0x006e, 0x0088, 0x0046, 0x2011, 0xc60c, 0x2224, 0xc484, -+ 0x2412, 0x004e, 0x00c6, 0x080c, 0x5356, 0x1110, 0x080c, 0x55b6, -+ 0x8108, 0x1f04, 0x6583, 0x00ce, 0x684c, 0xd084, 0x1118, 0x080c, -+ 0x1619, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x5823, 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, 0x67dc, 0x012e, 0x0804, 0x67d6, 0x012e, 0x0804, -+ 0x67d0, 0x012e, 0x0804, 0x67d3, 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, 0x67dc, 0x012e, -+ 0x0804, 0x67d9, 0x012e, 0x0804, 0x67d6, 0x0126, 0x2091, 0x8000, -+ 0x7007, 0x0001, 0x2061, 0xc9bc, 0x6300, 0xd38c, 0x1120, 0x6308, -+ 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x67ea, 0x012e, 0x0804, -+ 0x67d9, 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, 0xae6d, -+ 0x0068, 0x6013, 0x0400, 0x6057, 0x0000, 0x694c, 0xd1a4, 0x0110, -+ 0x6950, 0x6156, 0x2009, 0x0041, 0x080c, 0x962c, 0x6958, 0xa18c, -+ 0xff00, 0xa186, 0x2000, 0x1140, 0x0026, 0x2009, 0x0000, 0x2011, -+ 0xfdff, 0x080c, 0x7147, 0x002e, 0x684c, 0xd0c4, 0x0148, 0x2061, -+ 0xc9bc, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, -+ 0x00ce, 0x012e, 0x0804, 0x67dc, 0x00ce, 0x012e, 0x0804, 0x67d6, -+ 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, 0x5356, 0x1960, -+ 0x6000, 0xc0e4, 0x6002, 0x0840, 0x685c, 0xa065, 0x09a8, 0x6007, -+ 0x0024, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x0804, 0x6674, 0x685c, -+ 0xa065, 0x0950, 0x00e6, 0x6860, 0xa075, 0x2001, 0xc631, 0x2004, -+ 0xa005, 0x0150, 0x080c, 0xae6d, 0x8eff, 0x0118, 0x2e60, 0x080c, -+ 0xae6d, 0x00ee, 0x0804, 0x6674, 0x6020, 0xc0dc, 0xc0d5, 0x6022, -+ 0x2e60, 0x6007, 0x003a, 0x6870, 0xa005, 0x0130, 0x6007, 0x003b, -+ 0x6874, 0x602a, 0x6878, 0x6012, 0x6003, 0x0001, 0x080c, 0x79b2, -+ 0x080c, 0x7ead, 0x00ee, 0x0804, 0x6674, 0x2061, 0xc9bc, 0x6000, -+ 0xd084, 0x0190, 0xd08c, 0x1904, 0x67ea, 0x0126, 0x2091, 0x8000, -+ 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x67ea, 0x012e, -+ 0x6853, 0x0016, 0x0804, 0x67e3, 0x6853, 0x0007, 0x0804, 0x67e3, -+ 0x6834, 0x8007, 0xa084, 0x00ff, 0x1118, 0x080c, 0x638e, 0x0078, -+ 0x2030, 0x8001, 0x1120, 0x7007, 0x0001, 0x0051, 0x0040, 0x7007, -+ 0x0006, 0x7012, 0x2d00, 0x7016, 0x701a, 0x704b, 0x6718, 0x0005, -+ 0x00e6, 0x0126, 0x2091, 0x8000, 0xa03e, 0x2009, 0xc631, 0x210c, -+ 0x81ff, 0x1904, 0x6796, 0x2009, 0xc60c, 0x210c, 0xd194, 0x1904, -+ 0x67c0, 0x6848, 0x2070, 0xae82, 0xce00, 0x0a04, 0x678a, 0x2001, -+ 0xc617, 0x2004, 0xae02, 0x1a04, 0x678a, 0x711c, 0xa186, 0x0006, -+ 0x1904, 0x6779, 0x7018, 0xa005, 0x0904, 0x6796, 0x2004, 0xd0e4, -+ 0x1904, 0x67bb, 0x2061, 0xc9bc, 0x6100, 0xa184, 0x0301, 0xa086, -+ 0x0001, 0x1550, 0x7020, 0xd0dc, 0x1904, 0x67c3, 0x6853, 0x0000, -+ 0x6803, 0x0000, 0x2d08, 0x7010, 0xa005, 0x1158, 0x7112, 0x684c, -+ 0xd0f4, 0x1904, 0x67c6, 0x2e60, 0x080c, 0x70a3, 0x012e, 0x00ee, -+ 0x0005, 0x2068, 0x6800, 0xa005, 0x1de0, 0x6902, 0x2168, 0x684c, -+ 0xd0f4, 0x1904, 0x67c6, 0x012e, 0x00ee, 0x0005, 0x012e, 0x00ee, -+ 0x6853, 0x0006, 0x0804, 0x67e3, 0xd184, 0x0dc0, 0xd1c4, 0x11a8, -+ 0x00b8, 0x6944, 0xa18c, 0xff00, 0x810f, 0x080c, 0x5356, 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, 0x6723, 0x7003, 0x0002, 0x0804, 0x6723, -+ 0x6853, 0x0028, 0x0010, 0x6853, 0x0029, 0x012e, 0x00ee, 0x0418, -+ 0x6853, 0x002a, 0x0cd0, 0x6853, 0x0045, 0x0cb8, 0x2e60, 0x2019, -+ 0x0002, 0x6017, 0x0014, 0x080c, 0xbd6e, 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, 0x5823, -+ 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, -+ 0x709a, 0x00de, 0x0005, 0x2001, 0xc756, 0x2004, 0xa086, 0x0000, -+ 0x0904, 0x6866, 0x080c, 0x76a8, 0x0904, 0x6869, 0x6868, 0xa084, -+ 0x0007, 0x0904, 0x685d, 0x080c, 0x95a6, 0x0904, 0x6860, 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, 0x5356, 0x2c00, 0x00ce, 0x11b0, 0x601a, 0x601f, 0x0001, -+ 0x2009, 0x0040, 0x6834, 0xa084, 0x00ff, 0xa086, 0x0035, 0x0110, -+ 0x2009, 0x0041, 0x080c, 0x962c, 0x0005, 0x684b, 0x0101, 0x0078, -+ 0x684b, 0x002c, 0x0060, 0x684b, 0x0028, 0x0080, 0x684b, 0x0104, -+ 0x0030, 0x684b, 0x0105, 0x0018, 0x684b, 0x0106, 0x0038, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x5823, 0x012e, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x5823, 0x012e, 0x080c, 0x95fc, 0x0005, 0x00d6, -+ 0x00c6, 0x0036, 0x0026, 0x0016, 0x7007, 0x0001, 0x6a44, 0xa282, -+ 0x0004, 0x1a04, 0x68ca, 0xd284, 0x0170, 0x6a4c, 0xa290, 0xc77b, -+ 0x2204, 0xa065, 0x6004, 0x05e0, 0x8007, 0xa084, 0x00ff, 0xa084, -+ 0x0006, 0x1108, 0x04a8, 0x2c10, 0x080c, 0x95a6, 0x1118, 0x080c, -+ 0xaf26, 0x05a0, 0x621a, 0x6844, 0x0002, 0x68a9, 0x68ae, 0x68b1, -+ 0x68b7, 0x2019, 0x0002, 0x080c, 0xc126, 0x0060, 0x080c, 0xc0bd, -+ 0x0048, 0x2019, 0x0002, 0x6950, 0x080c, 0xc0d8, 0x0018, 0x6950, -+ 0x080c, 0xc0bd, 0x080c, 0x95fc, 0x6857, 0x0000, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x5823, 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, 0x6b4b, 0x0400, 0x20e1, 0x0004, 0x3d60, -+ 0xd1bc, 0x1170, 0x2100, 0xa084, 0xff00, 0xa086, 0x0500, 0x1138, -+ 0x0026, 0x2c10, 0x080c, 0x6da9, 0x002e, 0x01a0, 0x0070, 0x3e60, -+ 0xac84, 0x0007, 0x1178, 0xac82, 0xce00, 0x0260, 0x685c, 0xac02, -+ 0x1248, 0x2009, 0x0047, 0x080c, 0x962c, 0x7a1c, 0xd284, 0x1904, -+ 0x68e2, 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, 0x69aa, 0x01f8, 0x20e1, 0x3000, 0x7828, 0x7828, -+ 0x080c, 0x69c6, 0x014e, 0x013e, 0x015e, 0x2009, 0xc92f, 0x2104, -+ 0xa005, 0x1108, 0x0005, 0x080c, 0x7ead, 0x0ce0, 0xa484, 0x7000, -+ 0x1548, 0x080c, 0x69aa, 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, -+ 0xc54f, 0x20e1, 0x3000, 0x7828, 0x7828, 0x00b9, 0x014e, 0x013e, -+ 0x015e, 0x0880, 0x0439, 0x1130, 0x7000, 0xa084, 0xff00, 0xa086, -+ 0x8100, 0x1d68, 0x080c, 0xc54f, 0x20e1, 0x3000, 0x7828, 0x7828, -+ 0x0056, 0x080c, 0x6e38, 0x005e, 0x0c40, 0x2001, 0xc60e, 0x2004, -+ 0xd08c, 0x0178, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1148, -+ 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, 0x4096, 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, -+ 0x6c50, 0x0005, 0xa196, 0x2000, 0x1148, 0x6900, 0xa18e, 0x0001, -+ 0x1118, 0x080c, 0x47e4, 0x0ca8, 0x0039, 0x0c98, 0xa196, 0x8000, -+ 0x1d80, 0x080c, 0x6cfc, 0x0c68, 0x00c6, 0x6a84, 0x82ff, 0x0904, -+ 0x6b45, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa196, 0x0001, 0x0120, -+ 0xa196, 0x0023, 0x1904, 0x6b45, 0xa08e, 0x0023, 0x1570, 0x080c, -+ 0x6d97, 0x0904, 0x6b45, 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, -+ 0x1150, 0x7034, 0xa005, 0x1904, 0x6b45, 0x2009, 0x0015, 0x080c, -+ 0x962c, 0x0804, 0x6b45, 0xa08e, 0x0214, 0x0118, 0xa08e, 0x0210, -+ 0x1130, 0x2009, 0x0015, 0x080c, 0x962c, 0x0804, 0x6b45, 0xa08e, -+ 0x0100, 0x1904, 0x6b45, 0x7034, 0xa005, 0x1904, 0x6b45, 0x2009, -+ 0x0016, 0x080c, 0x962c, 0x0804, 0x6b45, 0xa08e, 0x0022, 0x1904, -+ 0x6b45, 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, -+ 0x6b45, 0x2009, 0x0017, 0x0804, 0x6b0b, 0xa08e, 0x0400, 0x1158, -+ 0x7034, 0xa005, 0x1904, 0x6b45, 0x68d4, 0xc0a5, 0x68d6, 0x2009, -+ 0x0030, 0x0804, 0x6b0b, 0xa08e, 0x0500, 0x1140, 0x7034, 0xa005, -+ 0x1904, 0x6b45, 0x2009, 0x0018, 0x0804, 0x6b0b, 0xa08e, 0x2010, -+ 0x1120, 0x2009, 0x0019, 0x0804, 0x6b0b, 0xa08e, 0x2110, 0x1120, -+ 0x2009, 0x001a, 0x0804, 0x6b0b, 0xa08e, 0x5200, 0x1140, 0x7034, -+ 0xa005, 0x1904, 0x6b45, 0x2009, 0x001b, 0x0804, 0x6b0b, 0xa08e, -+ 0x5000, 0x1140, 0x7034, 0xa005, 0x1904, 0x6b45, 0x2009, 0x001c, -+ 0x0804, 0x6b0b, 0xa08e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, -+ 0x6b0b, 0xa08e, 0x1200, 0x1140, 0x7034, 0xa005, 0x1904, 0x6b45, -+ 0x2009, 0x0024, 0x0804, 0x6b0b, 0xa08c, 0xff00, 0xa18e, 0x2400, -+ 0x1120, 0x2009, 0x002d, 0x0804, 0x6b0b, 0xa08c, 0xff00, 0xa18e, -+ 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x6b0b, 0xa08e, 0x0f00, -+ 0x1120, 0x2009, 0x0020, 0x0804, 0x6b0b, 0xa08e, 0x5300, 0x1108, -+ 0x00d8, 0xa08e, 0x6104, 0x11c0, 0x2011, 0xcc8d, 0x8208, 0x2204, -+ 0xa082, 0x0004, 0x20a8, 0x95ac, 0x95ac, 0x2011, 0x8015, 0x211c, -+ 0x8108, 0x0046, 0x2124, 0x080c, 0x4096, 0x004e, 0x8108, 0x1f04, -+ 0x6ad5, 0x2009, 0x0023, 0x0438, 0xa08e, 0x6000, 0x1118, 0x2009, -+ 0x003f, 0x0408, 0xa08e, 0x5400, 0x1158, 0x080c, 0x6e92, 0x1904, -+ 0x6b45, 0x2009, 0x0046, 0x0016, 0x2001, 0xc8d3, 0x2064, 0x0498, -+ 0xa08e, 0x5500, 0x1140, 0x080c, 0x6ec5, 0x2009, 0x0041, 0x0158, -+ 0x2009, 0x0042, 0x0040, 0xa08e, 0x7800, 0x1118, 0x2009, 0x0045, -+ 0x0010, 0x2009, 0x001d, 0x0016, 0x2011, 0xcc83, 0x2204, 0x8211, -+ 0x220c, 0x080c, 0x29c7, 0x1598, 0x080c, 0x52fa, 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, 0x95a6, 0x0168, 0x001e, 0x611a, 0x601f, 0x0004, -+ 0x7120, 0x610a, 0x001e, 0x080c, 0x962c, 0x00ce, 0x0005, 0x001e, -+ 0x0ce0, 0x00ce, 0x0ce0, 0x00c6, 0x0046, 0x080c, 0x6b9f, 0x1904, -+ 0x6b9c, 0xa28e, 0x0033, 0x11e8, 0x080c, 0x6d97, 0x0904, 0x6b9c, -+ 0x7124, 0x610a, 0x7030, 0xa08e, 0x0200, 0x1140, 0x7034, 0xa005, -+ 0x15d8, 0x2009, 0x0015, 0x080c, 0x962c, 0x04b0, 0xa08e, 0x0100, -+ 0x1598, 0x7034, 0xa005, 0x1580, 0x2009, 0x0016, 0x080c, 0x962c, -+ 0x0458, 0xa28e, 0x0032, 0x1540, 0x7030, 0xa08e, 0x1400, 0x1520, -+ 0x2009, 0x0038, 0x0016, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x29c7, 0x11c0, 0x080c, 0x52fa, 0x11a8, 0x6612, 0x6516, -+ 0x00c6, 0x080c, 0x95a6, 0x0170, 0x001e, 0x611a, 0x080c, 0xb077, -+ 0x601f, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x962c, 0x080c, -+ 0x7ead, 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, 0x6c4b, -+ 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, 0x6c28, 0x82ff, 0x1118, 0xa085, 0x0001, -+ 0x0018, 0xc2fc, 0x2208, 0xa006, 0x00de, 0x00ee, 0x004e, 0x0005, -+ 0xa084, 0x0007, 0x000a, 0x0005, 0x6c5c, 0x6c5c, 0x6c5c, 0x6e25, -+ 0x6c5c, 0x6c5d, 0x6c72, 0x6ce7, 0x0005, 0x7110, 0xd1bc, 0x0188, -+ 0x7120, 0x2160, 0xac8c, 0x0007, 0x1160, 0xac8a, 0xce00, 0x0248, -+ 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, -+ 0x962c, 0x0005, 0x00c6, 0xa484, 0x01ff, 0x0904, 0x6cc5, 0x7110, -+ 0xd1bc, 0x1904, 0x6cc5, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x29c7, 0x1904, 0x6cc5, 0x080c, 0x52fa, 0x15f0, 0x6612, -+ 0x6516, 0x6000, 0xd0ec, 0x15c8, 0x6204, 0xa294, 0xff00, 0x8217, -+ 0xa286, 0x0006, 0x0148, 0x6204, 0xa294, 0x00ff, 0xa286, 0x0006, -+ 0x11a0, 0xa295, 0x0600, 0x6206, 0x00c6, 0x080c, 0x95a6, 0x001e, -+ 0x0530, 0x611a, 0x601f, 0x0006, 0x7120, 0x610a, 0x7130, 0x6152, -+ 0x2009, 0x0044, 0x080c, 0x962c, 0x00c0, 0x00c6, 0x080c, 0x95a6, -+ 0x001e, 0x0198, 0x611a, 0x601f, 0x0004, 0x7120, 0x610a, 0xa286, -+ 0x0004, 0x1118, 0x6007, 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, -+ 0x0001, 0x080c, 0x79f8, 0x080c, 0x7ead, 0x00ce, 0x0005, 0x2001, -+ 0xc60d, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4096, -+ 0x00c6, 0x080c, 0xaf26, 0x001e, 0x0d80, 0x611a, 0x601f, 0x0006, -+ 0x7120, 0x610a, 0x7130, 0x6152, 0x6013, 0x0300, 0x6003, 0x0001, -+ 0x6007, 0x0041, 0x080c, 0x79b2, 0x080c, 0x7ead, 0x08f0, 0x7110, -+ 0xd1bc, 0x0188, 0x7020, 0x2060, 0xac84, 0x0007, 0x1160, 0xac82, -+ 0xce00, 0x0248, 0x685c, 0xac02, 0x1230, 0x7124, 0x610a, 0x2009, -+ 0x0045, 0x080c, 0x962c, 0x0005, 0x0006, 0x080c, 0x2f69, 0x000e, -+ 0x1168, 0x7110, 0xa18c, 0xff00, 0x810f, 0xa18e, 0x0000, 0x1130, -+ 0xa084, 0x000f, 0xa08a, 0x0006, 0x1208, 0x000b, 0x0005, 0x6d15, -+ 0x6d16, 0x6d15, 0x6d15, 0x6d7f, 0x6d8b, 0x0005, 0x7110, 0xd1bc, -+ 0x0120, 0x702c, 0xd084, 0x0904, 0x6d7e, 0x700c, 0x7108, 0x080c, -+ 0x29c7, 0x1904, 0x6d7e, 0x080c, 0x52fa, 0x1904, 0x6d7e, 0x6612, -+ 0x6516, 0x6204, 0x7110, 0xd1bc, 0x01f8, 0xa28c, 0x00ff, 0xa186, -+ 0x0004, 0x0118, 0xa186, 0x0006, 0x15c8, 0x00c6, 0x080c, 0x6d97, -+ 0x00ce, 0x0904, 0x6d7e, 0x00c6, 0x080c, 0x95a6, 0x001e, 0x05f0, -+ 0x611a, 0x080c, 0xb077, 0x601f, 0x0002, 0x7120, 0x610a, 0x2009, -+ 0x0088, 0x080c, 0x962c, 0x0490, 0xa28c, 0x00ff, 0xa186, 0x0006, -+ 0x0160, 0xa186, 0x0004, 0x0148, 0xa294, 0xff00, 0x8217, 0xa286, -+ 0x0004, 0x0118, 0xa286, 0x0006, 0x1188, 0x00c6, 0x080c, 0x95a6, -+ 0x001e, 0x01e0, 0x611a, 0x080c, 0xb077, 0x601f, 0x0005, 0x7120, -+ 0x610a, 0x2009, 0x0088, 0x080c, 0x962c, 0x0080, 0x00c6, 0x080c, -+ 0x95a6, 0x001e, 0x0158, 0x611a, 0x080c, 0xb077, 0x601f, 0x0004, -+ 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x962c, 0x0005, 0x7110, -+ 0xd1bc, 0x0140, 0x00a1, 0x0130, 0x7124, 0x610a, 0x2009, 0x0089, -+ 0x080c, 0x962c, 0x0005, 0x7110, 0xd1bc, 0x0140, 0x0041, 0x0130, -+ 0x7124, 0x610a, 0x2009, 0x008a, 0x080c, 0x962c, 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, 0x6e20, -+ 0x2001, 0xc756, 0x2004, 0xa086, 0x0000, 0x0904, 0x6e20, 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, 0x6e20, 0x20e1, -+ 0x0001, 0x3d08, 0x3e00, 0x0156, 0x080c, 0x29c7, 0x015e, 0x15c0, -+ 0x080c, 0x5356, 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, 0x7603, 0x11d8, 0x0080, 0x080c, 0x95a6, -+ 0x01b8, 0x20e1, 0x0002, 0x3e08, 0xd19c, 0x0118, 0x6124, 0xc19d, -+ 0x6126, 0x2e00, 0x601a, 0x620a, 0x601f, 0x0009, 0x2009, 0x0101, -+ 0x080c, 0x962c, 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, 0x962c, 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, 0x95a6, 0x0598, 0x0066, 0x00c6, 0x0046, 0x2011, -+ 0xcc83, 0x2204, 0x8211, 0x220c, 0x080c, 0x29c7, 0x1580, 0x080c, -+ 0x52fa, 0x1568, 0x6612, 0x6516, 0x2c00, 0x004e, 0x00ce, 0x601a, -+ 0x080c, 0xb077, 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, 0x79f8, 0x080c, 0x7ead, 0x00fe, -+ 0x00de, 0x00ce, 0x0005, 0x080c, 0x95fc, 0x006e, 0x0cc0, 0x004e, -+ 0x00ce, 0x0cc8, 0x0156, 0x0046, 0x2e00, 0xa0a0, 0x000e, 0x2404, -+ 0x2020, 0x8427, 0xa4a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0003, -+ 0x2019, 0xc606, 0x2011, 0xcc9b, 0x080c, 0xa11c, 0x11d8, 0xd48c, -+ 0x0148, 0x20a9, 0x0003, 0x2019, 0xc602, 0x2011, 0xcc9f, 0x080c, -+ 0xa11c, 0x1180, 0xd494, 0x0170, 0x080c, 0x76ad, 0x0148, 0x20a9, -+ 0x0008, 0x2019, 0xc69a, 0x2011, 0xccaa, 0x080c, 0xa131, 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, -+ 0xa11c, 0x11d8, 0xd48c, 0x0148, 0x20a9, 0x0003, 0x2019, 0xc602, -+ 0x2011, 0xcc97, 0x080c, 0xa11c, 0x1180, 0xd494, 0x0170, 0x080c, -+ 0x76ad, 0x0148, 0x20a9, 0x0008, 0x2019, 0xc69a, 0x2011, 0xcca2, -+ 0x080c, 0xa131, 0x0010, 0xa085, 0x0001, 0x004e, 0x015e, 0x0005, -+ 0x2071, 0xc93a, 0x7003, 0x0003, 0x700f, 0x0361, 0xa006, 0x701a, -+ 0x7076, 0x7012, 0x7017, 0xce00, 0x7007, 0x0000, 0x7026, 0x702b, -+ 0x8c25, 0x7032, 0x7037, 0x8c85, 0x703b, 0xffff, 0x703f, 0xffff, -+ 0x7042, 0x7047, 0x47a0, 0x704a, 0x705b, 0x7058, 0x2001, 0xc8e8, -+ 0x2003, 0x0003, 0x2001, 0xc8ea, 0x2003, 0x0100, 0x3a00, 0xa084, -+ 0x0005, 0x706e, 0x0005, 0x2071, 0xc93a, 0x1d04, 0x6fb5, 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, 0x4096, 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, 0x8ce1, 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, 0x6fdb, -+ 0x6fdc, 0x6ff4, 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, 0x5356, 0x1158, -+ 0x6088, 0x8001, 0x0240, 0x608a, 0x1130, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x7ead, 0x012e, 0x8108, 0xa182, 0x00ff, 0x0218, 0xa00e, -+ 0x7007, 0x0002, 0x7112, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, -+ 0x8000, 0x603c, 0xa005, 0x0128, 0x8001, 0x603e, 0x1110, 0x080c, -+ 0xaf65, 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, 0xaa35, 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, -+ 0x6f23, 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, 0x711e, 0x0005, 0xd0fc, 0x0138, 0xa084, -+ 0x0003, 0x0120, 0xa086, 0x0003, 0x1904, 0x7118, 0x6020, 0xd0d4, -+ 0x0130, 0xc0d4, 0x6022, 0x6860, 0x602a, 0x685c, 0x602e, 0x2009, -+ 0xc674, 0x2104, 0xd084, 0x0138, 0x87ff, 0x1120, 0x2009, 0x0042, -+ 0x080c, 0x962c, 0x0005, 0x87ff, 0x1120, 0x2009, 0x0043, 0x080c, -+ 0x962c, 0x0005, 0xd0fc, 0x0130, 0xa084, 0x0003, 0x0118, 0xa086, -+ 0x0003, 0x11f0, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, 0x962c, -+ 0x0005, 0xd0fc, 0x0160, 0xa084, 0x0003, 0xa08e, 0x0002, 0x0148, -+ 0x87ff, 0x1120, 0x2009, 0x0041, 0x080c, 0x962c, 0x0005, 0x0061, -+ 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x962c, 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, 0x5823, 0x6010, 0xa06d, 0x0076, -+ 0x2039, 0x0000, 0x190c, 0x70a3, 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, 0x71a7, 0x71a0, 0x71a0, 0x0005, -+ 0x71b1, 0x7202, 0x7203, 0x7204, 0x7205, 0x7218, 0x7219, 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, 0x7246, 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, 0x7295, 0x2200, 0xa102, -+ 0x0208, 0x2208, 0x713a, 0x080c, 0x7390, 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, 0x720a, -+ 0x720d, 0x7217, 0x080c, 0x71af, 0x0005, 0x0126, 0x8001, 0x700e, -+ 0x7138, 0x0041, 0x2091, 0x8000, 0x080c, 0x71af, 0x012e, 0x0005, -+ 0x0005, 0x0005, 0x7018, 0xa100, 0x7214, 0xa21a, 0x1130, 0x701c, -+ 0x7052, 0x7020, 0x7056, 0xa006, 0x0068, 0x0006, 0x080c, 0x7390, -+ 0x2100, 0x7250, 0xa210, 0x7252, 0x1220, 0x7054, 0xa081, 0x0000, -+ 0x7056, 0x000e, 0x2f08, 0xa188, 0x0070, 0x200a, 0x701a, 0x0005, -+ 0x00e6, 0x2071, 0xc755, 0x700c, 0x0002, 0x7240, 0x7240, 0x7242, -+ 0x00ee, 0x0005, 0x700f, 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0x00d6, 0x00e6, 0x2071, 0xc76f, 0x702c, 0xa005, 0x0178, -+ 0x2068, 0x6964, 0x080c, 0x7295, 0x2100, 0x2208, 0xa102, 0x0238, -+ 0x6800, 0x702e, 0x080c, 0x75d2, 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, 0x7444, 0x0168, 0x080c, 0x7476, -+ 0x2d00, 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, 0x0007, -+ 0x00ee, 0x00de, 0x0005, 0xa00e, 0x0cd8, 0x00e6, 0x00d6, 0x00c6, -+ 0x2071, 0xc76f, 0x721c, 0x2100, 0xa202, 0x1618, 0x080c, 0x7476, -+ 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, 0x7390, 0x810c, 0x2100, 0xa318, -+ 0x8003, 0x2228, 0x2021, 0x0054, 0xa402, 0xa532, 0x0208, 0x2028, -+ 0x2500, 0x8004, 0x20a8, 0x23a0, 0xe000, 0xe000, 0xe000, 0x53a5, -+ 0x2508, 0x080c, 0x7399, 0x2130, 0x7014, 0xa600, 0x7016, 0x2600, -+ 0x711c, 0xa102, 0x701e, 0x7004, 0xa600, 0x2008, 0xa082, 0x0007, -+ 0x1180, 0x7000, 0x2004, 0xa005, 0x1140, 0x2009, 0x0001, 0x0026, -+ 0x080c, 0x7295, 0x002e, 0x7000, 0x2004, 0x7002, 0x7007, 0x0000, -+ 0x0008, 0x7106, 0x2500, 0xa212, 0x1910, 0x012e, 0x00ee, 0x014e, -+ 0x013e, 0x015e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x00d6, 0x080c, -+ 0x7359, 0x15e0, 0x2170, 0x2805, 0xac68, 0x2900, 0x0002, 0x732f, -+ 0x732f, 0x7333, 0x732f, 0x7333, 0x732f, 0x732f, 0x732f, 0x732f, -+ 0x732f, 0x733c, 0x732f, 0x733c, 0x732f, 0x732f, 0x732f, 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, 0x7485, 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, 0x73db, 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, 0x73ee, 0x0870, 0x6c16, 0x00ee, -+ 0x0005, 0x00e6, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2e00, 0x2060, -+ 0x2071, 0xc76f, 0x2009, 0x0001, 0x0026, 0x080c, 0x7295, 0x002e, -+ 0x7300, 0xa398, 0x0003, 0x7104, 0x080c, 0x7390, 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, 0x7295, -+ 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, -+ 0x754b, 0x2071, 0xc682, 0x20e1, 0x0002, 0x3d08, 0xd19c, 0x0140, -+ 0x2069, 0xc600, 0x6a28, 0x761c, 0x7114, 0x2041, 0x0000, 0x0028, -+ 0x7118, 0x720c, 0x7620, 0x7008, 0x2040, 0x080c, 0x7640, 0x0904, -+ 0x754b, 0x7004, 0xd084, 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, -+ 0x0020, 0x2021, 0x002c, 0x2029, 0x000a, 0x080c, 0x1602, 0x0904, -+ 0x7543, 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, 0x73f1, 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, 0x73f1, 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, 0x7263, 0x6018, 0x2070, -+ 0xa006, 0x70b2, 0x70b6, 0x08b1, 0x080c, 0x95fc, 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, 0x4096, 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, 0x4096, 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, -+ 0x4096, 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, 0x76cb, 0x76cb, 0x76cb, 0x76cd, 0x7728, -+ 0x76cb, 0x76cb, 0x76cb, 0x7766, 0x76cb, 0x77c3, 0x76cb, 0x76cb, -+ 0x76cb, 0x76cb, 0x76cb, 0x080c, 0x1519, 0xa182, 0x0100, 0x0002, -+ 0x76df, 0x76df, 0x76df, 0x76e1, 0x76fa, 0x7714, 0x76df, 0x76df, -+ 0x76df, 0x76df, 0x76df, 0x76df, 0x76df, 0x76df, 0x76df, 0x080c, -+ 0x1519, 0x00d6, 0x080c, 0x7e60, 0x080c, 0x7f87, 0x6110, 0x2168, -+ 0x684b, 0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, 0x68bb, -+ 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x5823, 0x080c, 0x95fc, -+ 0x00de, 0x0005, 0x080c, 0x7e60, 0x00f6, 0x00d6, 0x6110, 0x2178, -+ 0x080c, 0xacaa, 0x0150, 0x00e6, 0x6018, 0x2070, 0xa006, 0x70b2, -+ 0x70b6, 0x00ee, 0x2f68, 0x080c, 0x5823, 0x00de, 0x00fe, 0x080c, -+ 0x95fc, 0x080c, 0x7f87, 0x0005, 0x080c, 0x7e60, 0x080c, 0x2e46, -+ 0x00d6, 0x6110, 0x2168, 0x080c, 0xacaa, 0x0120, 0x684b, 0x0029, -+ 0x080c, 0x5823, 0x00de, 0x080c, 0x95fc, 0x080c, 0x7f87, 0x0005, -+ 0xa182, 0x0100, 0x0002, 0x773a, 0x773c, 0x7744, 0x773a, 0x773a, -+ 0x773a, 0x7761, 0x773a, 0x773a, 0x773a, 0x773a, 0x773a, 0x773a, -+ 0x773a, 0x773a, 0x080c, 0x1519, 0x20e1, 0x0005, 0x3d18, 0x3e20, -+ 0x2c10, 0x080c, 0x1870, 0x0005, 0x00d6, 0x00e6, 0x2001, 0xc756, -+ 0x2004, 0xa086, 0x0000, 0x6110, 0x1118, 0x080c, 0x1629, 0x0028, -+ 0x2168, 0x080c, 0x756e, 0x080c, 0x5823, 0x6018, 0x2070, 0xa006, -+ 0x70b2, 0x70b6, 0x080c, 0x7612, 0x00ee, 0x00de, 0x080c, 0x95fc, -+ 0x0005, 0x080c, 0x7633, 0x080c, 0x56e0, 0x0005, 0xa182, 0x0100, -+ 0x0002, 0x777b, 0x77a1, 0x7779, 0x7779, 0x7779, 0x7779, 0x7779, -+ 0x7779, 0x7779, 0x7779, 0x7779, 0x7779, 0x7779, 0x7779, 0x7779, -+ 0x7779, 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, 0x7a15, 0x0126, 0x2091, 0x8000, 0x080c, 0x7f87, 0x012e, -+ 0x0005, 0x6003, 0x0004, 0x630a, 0x080c, 0x74b9, 0x0168, 0x6012, -+ 0x600f, 0x0000, 0x080c, 0x760d, 0x20e1, 0x0005, 0x3d18, 0x3e20, -+ 0x2c10, 0x080c, 0x1870, 0x0005, 0x2011, 0x0000, 0x080c, 0x1870, -+ 0x00e6, 0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, 0x0000, 0x00ee, -+ 0x080c, 0x95fc, 0x0005, 0x00d6, 0x080c, 0x7e60, 0x080c, 0x7f87, -+ 0x6110, 0x2168, 0x684b, 0x0000, 0x00d6, 0x6018, 0x2068, 0x6008, -+ 0x68b6, 0x68bb, 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x5823, -+ 0x080c, 0x95fc, 0x00de, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, -+ 0x1519, 0x000b, 0x0005, 0x77f3, 0x77f3, 0x77f3, 0x77f5, 0x780a, -+ 0x77f3, 0x77f3, 0x77f3, 0x77f3, 0x77f3, 0x77f3, 0x77f3, 0x77f3, -+ 0x77f3, 0x77f3, 0x77f3, 0x080c, 0x1519, 0x080c, 0x910f, 0x6110, -+ 0x2168, 0x684b, 0x0006, 0x00d6, 0x6018, 0x2068, 0x6008, 0x68b6, -+ 0x68bb, 0x0500, 0xa006, 0x68b2, 0x00de, 0x080c, 0x5823, 0x080c, -+ 0x95fc, 0x0005, 0x080c, 0x7633, 0x0005, 0x6000, 0xa08a, 0x0010, -+ 0x1a0c, 0x1519, 0x000b, 0x0005, 0x7824, 0x7824, 0x7824, 0x7826, -+ 0x7836, 0x7824, 0x7824, 0x7824, 0x7824, 0x7824, 0x7824, 0x7824, -+ 0x7824, 0x7824, 0x7824, 0x7824, 0x080c, 0x1519, 0x0036, 0x00e6, -+ 0x2071, 0xc927, 0x703c, 0xac06, 0x1120, 0x2019, 0x0000, 0x080c, -+ 0x8e92, 0x080c, 0x910f, 0x00ee, 0x003e, 0x0005, 0x00d6, 0x6010, -+ 0x2068, 0x080c, 0x7633, 0x00de, 0x0005, 0x080c, 0x769d, 0x1150, -+ 0x6024, 0xd09c, 0x1138, 0x6810, 0x2009, 0xffff, 0xa102, 0x2020, -+ 0x2019, 0x0000, 0x0005, 0x20a9, 0x0010, 0xa006, 0x8004, 0x8086, -+ 0x818e, 0x1208, 0xa200, 0x1f04, 0x784f, 0x8086, 0x818e, 0x0005, -+ 0x0156, 0x20a9, 0x0010, 0xa005, 0x01b8, 0xa11a, 0x12a8, 0x8213, -+ 0x818d, 0x0228, 0xa11a, 0x1220, 0x1f04, 0x785f, 0x0028, 0xa11a, -+ 0x2308, 0x8210, 0x1f04, 0x785f, 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, 0x789d, 0x78be, 0x7911, 0x78a3, 0x78be, -+ 0x789d, 0x789b, 0x789b, 0x080c, 0x1519, 0x080c, 0x703d, 0x080c, -+ 0x7ead, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, 0x0005, -+ 0x2011, 0x4e31, 0x080c, 0x6fc6, 0x7828, 0xa092, 0x00c8, 0x1228, -+ 0x8000, 0x782a, 0x080c, 0x4e6b, 0x0c88, 0x080c, 0x4e31, 0x7807, -+ 0x0003, 0x7827, 0x0000, 0x782b, 0x0000, 0x0c40, 0x080c, 0x703d, -+ 0x3c00, 0x0006, 0x2011, 0x0209, 0x20e1, 0x4000, 0x2214, 0x000e, -+ 0x20e0, 0x82ff, 0x0178, 0x62c0, 0x82ff, 0x1160, 0x782b, 0x0000, -+ 0x7824, 0xa065, 0x090c, 0x1519, 0x2009, 0x0013, 0x080c, 0x962c, -+ 0x00ce, 0x0005, 0x3900, 0xa082, 0xca74, 0x1210, 0x080c, 0x91e4, -+ 0x00c6, 0x7824, 0xa065, 0x090c, 0x1519, 0x7804, 0xa086, 0x0004, -+ 0x0904, 0x7951, 0x7828, 0xa092, 0x2710, 0x1230, 0x8000, 0x782a, -+ 0x00ce, 0x080c, 0x8c01, 0x0c20, 0x6104, 0xa186, 0x0003, 0x1188, -+ 0x00e6, 0x2071, 0xc600, 0x70e0, 0x00ee, 0xd08c, 0x0150, 0x00c6, -+ 0x00e6, 0x2061, 0x0100, 0x2071, 0xc600, 0x080c, 0x4e74, 0x00ee, -+ 0x00ce, 0x080c, 0xc5b4, 0x2009, 0x0014, 0x080c, 0x962c, 0x00ce, -+ 0x0838, 0x2001, 0xc943, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, -+ 0x782b, 0x0000, 0x7824, 0xa065, 0x090c, 0x1519, 0x2009, 0x0013, -+ 0x080c, 0x9680, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x3900, 0xa082, -+ 0xca74, 0x1210, 0x080c, 0x91e4, 0x7824, 0xa005, 0x090c, 0x1519, -+ 0x781c, 0xa06d, 0x090c, 0x1519, 0x6800, 0xc0dc, 0x6802, 0x7924, -+ 0x2160, 0x080c, 0x95fc, 0x693c, 0x81ff, 0x090c, 0x1519, 0x8109, -+ 0x693e, 0x6854, 0xa015, 0x0110, 0x7a1e, 0x0010, 0x7918, 0x791e, -+ 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, 0x00ce, 0x080c, 0x7ead, -+ 0x0888, 0x6104, 0xa186, 0x0002, 0x0128, 0xa186, 0x0004, 0x0110, -+ 0x0804, 0x78ea, 0x7808, 0xac06, 0x0904, 0x78ea, 0x080c, 0x7dca, -+ 0x080c, 0x79f8, 0x00ce, 0x080c, 0x7ead, 0x0804, 0x78d8, 0x00c6, -+ 0x6027, 0x0002, 0x62c8, 0x60c4, 0xa205, 0x11a8, 0x793c, 0xa1e5, -+ 0x0000, 0x0160, 0x2009, 0x0049, 0x601c, 0xa086, 0x0009, 0x1110, -+ 0x2009, 0x0103, 0x080c, 0x962c, 0x00ce, 0x0005, 0x2011, 0xc946, -+ 0x2013, 0x0000, 0x0cc8, 0x3908, 0xa192, 0xca74, 0x1210, 0x080c, -+ 0x91e4, 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, 0x7eb3, 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, 0x7aa0, 0x6018, 0xa080, -+ 0x0028, 0x2004, 0xa206, 0x1904, 0x7a9b, 0x87ff, 0x0120, 0x6050, -+ 0xa106, 0x1904, 0x7a9b, 0x703c, 0xac06, 0x1190, 0x0036, 0x2019, -+ 0x0001, 0x080c, 0x8e92, 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, 0x6010, 0x2068, 0x080c, 0xac8a, 0x01b8, 0x601c, -- 0xa086, 0x0003, 0x1540, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -- 0x0016, 0x0036, 0x0086, 0x080c, 0xaefc, 0x080c, 0xc4ca, 0x080c, -- 0x580a, 0x008e, 0x003e, 0x001e, 0x080c, 0xae41, 0x080c, 0xae4d, -- 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, 0xc4ca, 0x080c, 0xc134, 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, 0x90df, 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, 0xae4d, 0x00ce, 0x0048, 0x00de, -- 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x7c14, -- 0x8dff, 0x0158, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, -- 0xaefc, 0x080c, 0xc4ca, 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, 0x90df, 0x7827, -+ 0x600f, 0x0000, 0x080c, 0xacaa, 0x01c8, 0x6010, 0x2068, 0x601c, -+ 0xa086, 0x0003, 0x1580, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -+ 0x0016, 0x0036, 0x0076, 0x080c, 0xaf1c, 0x080c, 0xc4f0, 0x080c, -+ 0x5823, 0x007e, 0x003e, 0x001e, 0x080c, 0xae61, 0x080c, 0xae6d, -+ 0x00ce, 0x0804, 0x7a3b, 0x2c78, 0x600c, 0x2060, 0x0804, 0x7a3b, -+ 0x85ff, 0x0120, 0x0036, 0x080c, 0x7f87, 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, 0x5823, 0x080c, -+ 0x95fc, 0x08b0, 0x0016, 0x0036, 0x0076, 0x080c, 0xc4f0, 0x080c, -+ 0xc15a, 0x007e, 0x003e, 0x001e, 0x0848, 0x601c, 0xa086, 0x000a, -+ 0x0904, 0x7a85, 0x0804, 0x7a83, 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, 0x8e92, 0x7833, -+ 0x0000, 0x783f, 0x0000, 0x7843, 0x0000, 0x7847, 0x0000, 0x784b, -+ 0x0000, 0x003e, 0x080c, 0xacaa, 0x0178, 0x6010, 0x2068, 0x601c, -+ 0xa086, 0x0003, 0x11b0, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -+ 0x080c, 0x5823, 0x080c, 0xae61, 0x080c, 0xae6d, 0x000e, 0x0888, -+ 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, 0x00ce, 0x006e, 0x000e, -+ 0x0005, 0x601c, 0xa086, 0x0006, 0x0150, 0x601c, 0xa086, 0x0009, -+ 0x1148, 0x6b4a, 0x080c, 0x5823, 0x080c, 0x95fc, 0x0c38, 0x080c, -+ 0xc15a, 0x0c10, 0x601c, 0xa086, 0x000a, 0x09b8, 0x08a0, 0x0016, -+ 0x0026, 0x0086, 0x2041, 0x0000, 0x0099, 0x080c, 0x7bfd, 0x008e, -+ 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0xc927, 0x2091, -+ 0x8000, 0x080c, 0x7c8a, 0x080c, 0x7cfc, 0x012e, 0x00fe, 0x0005, -+ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, -+ 0x2091, 0x8000, 0x2071, 0xc927, 0x7614, 0x2660, 0x2678, 0x8cff, -+ 0x0904, 0x7bd3, 0x6018, 0xa080, 0x0028, 0x2004, 0xa206, 0x1904, -+ 0x7bce, 0x88ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x7bce, 0x7024, -+ 0xac06, 0x1538, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, 0x080c, -+ 0x703d, 0x080c, 0x8c0e, 0x68c3, 0x0000, 0x080c, 0x90ff, 0x7027, - 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, 0xac8a, 0x0168, 0x601c, -- 0xa086, 0x0003, 0x11b8, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -- 0x080c, 0x580a, 0x080c, 0xae41, 0x080c, 0xae4d, 0x080c, 0x8fb7, -- 0x000e, 0x0804, 0x7c78, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, -- 0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, 0xc134, -- 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, -+ 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, 0xacaa, 0x01b8, -+ 0x601c, 0xa086, 0x0003, 0x1540, 0x6837, 0x0103, 0x6b4a, 0x6847, -+ 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xaf1c, 0x080c, 0xc4f0, -+ 0x080c, 0x5823, 0x008e, 0x003e, 0x001e, 0x080c, 0xae61, 0x080c, -+ 0xae6d, 0x080c, 0x8fd0, 0x00ce, 0x0804, 0x7b57, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0x7b57, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, -+ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, 0x1158, -+ 0x0016, 0x0036, 0x0086, 0x080c, 0xc4f0, 0x080c, 0xc15a, 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, 0x7c86, -+ 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, 0x5281, 0x0904, -+ 0x7c82, 0x7624, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, 0xad06, - 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, 0x080c, -- 0x7024, 0x080c, 0x8bf5, 0x68c3, 0x0000, 0x080c, 0x90df, 0x7827, -+ 0x703d, 0x080c, 0x8c0e, 0x68c3, 0x0000, 0x080c, 0x90ff, 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, 0xae4d, 0x00ce, 0x0048, -+ 0x0110, 0x8001, 0x603e, 0x2660, 0x080c, 0xae6d, 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, -- 0x90df, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, 0xa384, -- 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x2079, 0x0100, -- 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x90df, 0x003e, -- 0x080c, 0x5268, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, 0x603e, -- 0x2660, 0x080c, 0x95dc, 0x00ce, 0x6837, 0x0103, 0x6b4a, 0x6847, -- 0x0000, 0x080c, 0xaefc, 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, 0x90df, 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, -- 0x95b3, 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, -- 0x91e1, 0x82f1, 0x8075, 0x9201, 0x82f1, 0x8075, 0x82e9, 0x811f, -- 0x808a, 0x8075, 0x9226, 0x929b, 0x9372, 0x8075, 0x9383, 0x82c2, -- 0x939f, 0x8075, 0x8dad, 0x93fa, 0x8075, 0x080c, 0x1519, 0x2100, -- 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x9451, -- 0x9500, 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, -+ 0x7c2d, 0x8dff, 0x0158, 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, -+ 0x080c, 0xaf1c, 0x080c, 0xc4f0, 0x080c, 0x5823, 0x080c, 0x8fd0, -+ 0x0804, 0x7c2d, 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, -+ 0x00ce, 0x0005, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x2031, 0x0000, -+ 0x7814, 0xa065, 0x0904, 0x7cdc, 0x600c, 0x0006, 0x600f, 0x0000, -+ 0x7824, 0xac06, 0x1540, 0x2069, 0x0100, 0x68c0, 0xa005, 0x01f0, -+ 0x080c, 0x703d, 0x080c, 0x8c0e, 0x68c3, 0x0000, 0x080c, 0x90ff, -+ 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, 0xacaa, 0x0168, -+ 0x601c, 0xa086, 0x0003, 0x11b8, 0x6837, 0x0103, 0x6b4a, 0x6847, -+ 0x0000, 0x080c, 0x5823, 0x080c, 0xae61, 0x080c, 0xae6d, 0x080c, -+ 0x8fd0, 0x000e, 0x0804, 0x7c91, 0x7e16, 0x7e12, 0x00de, 0x00ce, -+ 0x006e, 0x000e, 0x0005, 0x601c, 0xa086, 0x0006, 0x1118, 0x080c, -+ 0xc15a, 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, 0x7d62, 0x6054, 0x0006, 0x6057, 0x0000, -+ 0x605b, 0x0000, 0x6000, 0xc0d4, 0xc0dc, 0x6002, 0x080c, 0x5281, -+ 0x0904, 0x7d5f, 0x7e24, 0x86ff, 0x05e8, 0xa680, 0x0004, 0x2004, -+ 0xad06, 0x15c0, 0x00d6, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0548, -+ 0x080c, 0x703d, 0x080c, 0x8c0e, 0x68c3, 0x0000, 0x080c, 0x90ff, -+ 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, 0xae6d, 0x00ce, -+ 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, -+ 0x0804, 0x7d0e, 0x8dff, 0x0138, 0x6837, 0x0103, 0x6b4a, 0x6847, -+ 0x0000, 0x080c, 0x5823, 0x080c, 0x8fd0, 0x0804, 0x7d0e, 0x000e, -+ 0x0804, 0x7d01, 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, 0x8c0e, 0x78c3, 0x0000, -+ 0x080c, 0x90ff, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, 0x7b04, -+ 0xa384, 0x1000, 0x0120, 0x7803, 0x0100, 0x7803, 0x0000, 0x2079, -+ 0x0100, 0x7824, 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0x90ff, -+ 0x003e, 0x080c, 0x5281, 0x00c6, 0x603c, 0xa005, 0x0110, 0x8001, -+ 0x603e, 0x2660, 0x080c, 0x95fc, 0x00ce, 0x6837, 0x0103, 0x6b4a, -+ 0x6847, 0x0000, 0x080c, 0xaf1c, 0x080c, 0x5823, 0x080c, 0x8fd0, -+ 0x00fe, 0x0005, 0x00e6, 0x00c6, 0x2071, 0xc927, 0x7004, 0xa084, -+ 0x0007, 0x0002, 0x7ddc, 0x7ddf, 0x7df5, 0x7e0e, 0x7e4b, 0x7ddc, -+ 0x7dda, 0x7dda, 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, -+ 0x5281, 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, 0x8fd0, 0x600c, 0xa015, -+ 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, 0x0430, -+ 0x7014, 0xac06, 0x1160, 0x080c, 0x8fd0, 0x600c, 0xa015, 0x0120, -+ 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, 0x601c, -+ 0xa086, 0x0003, 0x1198, 0x6018, 0x2060, 0x080c, 0x5281, 0x6000, -+ 0xc0dc, 0x6002, 0x080c, 0x8fd0, 0x701c, 0xa065, 0x0138, 0x6054, -+ 0xa015, 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, 0x0000, -+ 0x00ce, 0x00ee, 0x0005, 0x7024, 0xa065, 0x0140, 0x080c, 0x8fd0, -+ 0x600c, 0xa015, 0x0150, 0x720e, 0x600f, 0x0000, 0x080c, 0x90ff, -+ 0x7027, 0x0000, 0x00ce, 0x00ee, 0x0005, 0x720e, 0x720a, 0x0cb0, -+ 0x00d6, 0x2069, 0xc927, 0x6830, 0xa084, 0x0003, 0x0002, 0x7e6d, -+ 0x7e6f, 0x7e93, 0x7e6b, 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, 0x7f87, 0x000e, 0x00de, 0x0005, 0x000e, -+ 0x0002, 0x7edb, 0x7f77, 0x7f77, 0x7f77, 0x7f77, 0x7f79, 0x7ed9, -+ 0x7ed9, 0x080c, 0x1519, 0x6820, 0xa005, 0x1110, 0x00de, 0x0005, -+ 0x00c6, 0x680c, 0xa065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, -+ 0x0000, 0x080c, 0x8009, 0x00ce, 0x00de, 0x0005, 0x6814, 0xa065, -+ 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x8009, -+ 0x00ce, 0x00de, 0x0005, 0x00e6, 0x0036, 0x6a1c, 0xa2f5, 0x0000, -+ 0x0904, 0x7f73, 0x704c, 0xa00d, 0x0118, 0x7088, 0xa005, 0x01a0, -+ 0x7054, 0xa075, 0x0120, 0xa20e, 0x0904, 0x7f73, 0x0028, 0x6818, -+ 0xa20e, 0x0904, 0x7f73, 0x2070, 0x704c, 0xa00d, 0x0d88, 0x7088, -+ 0xa005, 0x1d70, 0x2e00, 0x681e, 0x733c, 0x7038, 0xa302, 0x1e40, -+ 0x080c, 0x95d3, 0x0904, 0x7f73, 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, 0x8639, 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, 0x8009, 0x00ce, 0x00de, 0x0005, 0x00f6, -+ 0x00d6, 0x2069, 0xc927, 0x6830, 0xa086, 0x0000, 0x1904, 0x7fe4, -+ 0x2001, 0xc60c, 0x200c, 0xd1bc, 0x1904, 0x7fff, 0x6838, 0xa07d, -+ 0x0904, 0x7fe4, 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, 0x8982, 0x0028, 0x080c, -+ 0x89fb, 0x0010, 0x080c, 0x8a7f, 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, 0x5fbd, 0x006e, 0x0804, -+ 0x7f96, 0x601c, 0xa084, 0x000f, 0x000b, 0x0005, 0x8017, 0x801c, -+ 0x84da, 0x85f6, 0x801c, 0x84da, 0x85f6, 0x8017, 0x801c, 0x080c, -+ 0x7dca, 0x080c, 0x7ead, 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, 0x8090, 0x0033, -+ 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, 0x813f, 0x818a, -+ 0x81b7, 0x8284, 0x82b2, 0x82ba, 0x82e0, 0x82f1, 0x8302, 0x830a, -+ 0x8320, 0x830a, 0x8381, 0x82f1, 0x83a2, 0x83aa, 0x8302, 0x83aa, -+ 0x83bb, 0x808e, 0x808e, 0x808e, 0x808e, 0x808e, 0x808e, 0x808e, -+ 0x808e, 0x808e, 0x808e, 0x808e, 0x8d33, 0x8d58, 0x8d6d, 0x8d90, -+ 0x8db1, 0x82e0, 0x808e, 0x82e0, 0x830a, 0x808e, 0x81b7, 0x8284, -+ 0x808e, 0x9201, 0x830a, 0x808e, 0x9221, 0x830a, 0x808e, 0x8302, -+ 0x8138, 0x80a3, 0x808e, 0x9246, 0x92bb, 0x9392, 0x808e, 0x93a3, -+ 0x82db, 0x93bf, 0x808e, 0x8dc6, 0x941a, 0x808e, 0x080c, 0x1519, -+ 0x2100, 0x0033, 0x00fe, 0x00ce, 0x014e, 0x013e, 0x015e, 0x0005, -+ 0x9471, 0x9520, 0x80a1, 0x80d7, 0x80f5, 0x810b, 0x80a1, 0x82e0, -+ 0x80a1, 0x080c, 0x1519, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x83d8, -+ 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, 0x8bfb, 0x00de, 0x0005, -+ 0x00d6, 0x7818, 0x2068, 0x68a0, 0x2069, 0xc600, 0x6ad4, 0xd2ac, -+ 0x1110, 0xd0bc, 0x0110, 0xa085, 0x0001, 0x00de, 0x0005, 0x00d6, -+ 0x20a1, 0x020b, 0x080c, 0x83d8, 0x20a3, 0x0500, 0x20a3, 0x0000, -+ 0x7810, 0xa0e8, 0x000f, 0x6808, 0x20a2, 0x680c, 0x20a2, 0x6810, -+ 0x20a2, 0x6814, 0x20a2, 0x6818, 0x20a2, 0x681c, 0x20a2, 0x60c3, -+ 0x0010, 0x080c, 0x8bfb, 0x00de, 0x0005, 0x0156, 0x0146, 0x20a1, -+ 0x020b, 0x080c, 0x83d8, 0x20a3, 0x7800, 0x20a3, 0x0000, 0x7808, -+ 0x8007, 0x20a2, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8bfb, -+ 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, -+ 0x8474, 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, 0x8127, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x60c3, 0x004c, 0x080c, 0x8bfb, 0x014e, 0x015e, 0x0005, -+ 0x2001, 0xc615, 0x2004, 0x609a, 0x080c, 0x8bfb, 0x0005, 0x20a1, -+ 0x020b, 0x080c, 0x83d8, 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, -+ 0x8bfb, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83d8, 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, 0x8bfb, 0x0005, 0x20a1, -+ 0x020b, 0x080c, 0x83d8, 0x00c6, 0x7818, 0x2060, 0x2001, 0x0000, -+ 0x080c, 0x572e, 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, 0x8246, 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, 0x5f3b, 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, 0x8220, 0x20a9, 0x0008, 0x20a3, 0x0000, -+ 0x1f04, 0x8226, 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, 0x8241, 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, 0x8264, -+ 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x826a, 0x2099, 0xc8dd, -+ 0x20a9, 0x0008, 0x53a6, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, -+ 0x8275, 0x20a9, 0x000a, 0x20a3, 0x0000, 0x1f04, 0x827b, 0x60c3, -+ 0x0074, 0x080c, 0x8bfb, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83d8, -+ 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, 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, -+ 0x0110, 0xa085, 0x0010, 0xa085, 0x0002, 0x00d6, 0x0804, 0x8363, -+ 0x20a2, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, 0x080c, -+ 0x8bfb, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83d8, 0x20a3, 0x5000, -+ 0x0804, 0x81d2, 0x20a1, 0x020b, 0x080c, 0x83d8, 0x20a3, 0x2110, -+ 0x20a3, 0x0014, 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, 0x845b, 0x20a3, 0x0200, 0x0804, -- 0x812c, 0x20a1, 0x020b, 0x080c, 0x845b, 0x20a3, 0x0100, 0x20a3, -+ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0014, -+ 0x080c, 0x8bfb, 0x0005, 0x20a1, 0x020b, 0x080c, 0x846c, 0x0020, -+ 0x20a1, 0x020b, 0x080c, 0x8474, 0x20a3, 0x0200, 0x20a3, 0x0000, -+ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x8bfb, -+ 0x0005, 0x20a1, 0x020b, 0x080c, 0x8474, 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, -+ 0x8bfb, 0x0005, 0x20a1, 0x020b, 0x080c, 0x8474, 0x20a3, 0x0200, -+ 0x0804, 0x81d2, 0x20a1, 0x020b, 0x080c, 0x8474, 0x20a3, 0x0100, -+ 0x20a3, 0x0000, 0x7828, 0xa005, 0x0110, 0x20a2, 0x0010, 0x20a3, -+ 0x0003, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x8bfb, 0x0005, -+ 0x00d6, 0x20a1, 0x020b, 0x080c, 0x8474, 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, 0x8bfb, 0x00de, -+ 0x0005, 0x20a1, 0x020b, 0x080c, 0x8474, 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, -+ 0x8bfb, 0x0005, 0x20a1, 0x020b, 0x080c, 0x8474, 0x20a3, 0x0200, -+ 0x0804, 0x8145, 0x20a1, 0x020b, 0x080c, 0x8474, 0x20a3, 0x0100, -+ 0x20a3, 0x0000, 0x20a3, 0x0003, 0x20a3, 0x2a00, 0x60c3, 0x0008, -+ 0x080c, 0x8bfb, 0x0005, 0x20e1, 0x9080, 0x20e1, 0x4000, 0x20a1, -+ 0x020b, 0x080c, 0x8474, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x20a3, -+ 0x000b, 0x20a3, 0x0000, 0x60c3, 0x0008, 0x080c, 0x8bfb, 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, -+ 0x8bea, 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, 0x8bea, 0x22a2, -+ 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x002e, 0x0005, 0x080c, 0x8bea, 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, -+ 0x8511, 0x851b, 0x8536, 0x850f, 0x850f, 0x850f, 0x8511, 0x080c, -+ 0x1519, 0x0146, 0x20a1, 0x020b, 0x04a1, 0x60c3, 0x0000, 0x080c, -+ 0x8bfb, 0x014e, 0x0005, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8582, -+ 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x7810, 0x20a2, -+ 0x20a3, 0x0000, 0x20a3, 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, -+ 0x60c3, 0x000c, 0x080c, 0x8bfb, 0x014e, 0x0005, 0x0146, 0x20a1, -+ 0x020b, 0x080c, 0x85bc, 0x20a3, 0x0003, 0x20a3, 0x0300, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x0004, 0x080c, 0x8bfb, 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, -- 0x8400, 0x20a2, 0x6814, 0x20a2, 0x2069, 0xc61c, 0x2da6, 0x8d68, -+ 0x8100, 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, 0x93b0, 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, -+ 0xa085, 0x8100, 0x20a2, 0x6814, 0x20a2, 0x00de, 0x20a3, 0x0000, -+ 0x2011, 0xc615, 0x2214, 0x22a2, 0x20a3, 0x0009, 0x20a3, 0x0000, -+ 0x0804, 0x843f, 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, 0x84cb, 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, -+ 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, 0x84cb, 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, 0x8639, 0x8745, 0x86e2, 0x88f7, -+ 0x8637, 0x8637, 0x8637, 0x8637, 0x8637, 0x8637, 0x8637, 0x8f89, -+ 0x8f99, 0x8fa9, 0x8fb9, 0x8637, 0x93d0, 0x8637, 0x8f78, 0x080c, -+ 0x1519, 0x00d6, 0x0156, 0x0146, 0x780b, 0xffff, 0x20a1, 0x020b, -+ 0x080c, 0x8699, 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, 0x8bfb, 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, -+ 0x8bea, 0x22a2, 0x20a3, 0x0000, 0x7a08, 0x22a2, 0x2fa2, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x002e, 0x0005, 0x00d6, 0x0156, 0x0136, -+ 0x0146, 0x7810, 0xa0ec, 0xf000, 0x0168, 0xa06d, 0x080c, 0x56d8, -+ 0x0148, 0x684c, 0xa084, 0x2020, 0xa086, 0x2020, 0x1118, 0x7820, -+ 0xc0cd, 0x7822, 0x20a1, 0x020b, 0x080c, 0x88ad, 0xa016, 0x22a2, -+ 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x7810, 0xa084, 0xf000, 0x1130, -+ 0x7810, 0xa084, 0x0700, 0x8007, 0x0043, 0x0010, 0xa006, 0x002b, -+ 0x014e, 0x013e, 0x015e, 0x00de, 0x0005, 0x877f, 0x8814, 0x8824, -+ 0x8856, 0x8869, 0x8884, 0x888d, 0x877d, 0x080c, 0x1519, 0x0016, -+ 0x0036, 0x694c, 0xa18c, 0x0003, 0x0118, 0xa186, 0x0003, 0x1170, -+ 0x6b78, 0x7820, 0xd0cc, 0x0108, 0xc3e5, 0x23a2, 0x6868, 0x20a2, -+ 0x6864, 0x20a2, 0x003e, 0x001e, 0x0804, 0x8860, 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, 0x880e, -+ 0xd3c4, 0x0110, 0x687c, 0xa108, 0xd3cc, 0x0110, 0x6874, 0xa108, -+ 0x0156, 0x20a9, 0x000d, 0xad80, 0x0020, 0x201c, 0x831f, 0x23a2, -+ 0x8000, 0x1f04, 0x87bd, 0x015e, 0x22a2, 0x22a2, 0x22a2, 0xa184, -+ 0x0003, 0x0904, 0x880e, 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, 0x8bea, 0x22a2, 0x20a3, 0x0000, 0x61c2, 0x003e, -+ 0x001e, 0x080c, 0x8bfb, 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, 0x8bfb, 0x0005, 0x2011, 0x0028, -+ 0x7820, 0xd0cc, 0x0108, 0xc2e5, 0x22a2, 0xa016, 0x22a2, 0x22a2, -+ 0x22a2, 0x22a2, 0x22a2, 0x22a2, 0x60c3, 0x0018, 0x080c, 0x8bfb, -+ 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, 0x8bfb, 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, 0x8860, 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, 0x8bea, 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, 0x8911, 0x8911, 0x8913, 0x8911, 0x8911, 0x8911, 0x8935, -+ 0x8911, 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, 0x8bfb, 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, 0x8bea, 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, 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, 0x944b, 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, 0x944b, 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, 0x9448, -- 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, 0x944b, 0x0804, 0x8b0a, 0x080c, 0x9448, 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, 0xc58e, 0x080c, 0x7024, 0x2009, 0x0014, 0x080c, -- 0x960c, 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, 0xc58e, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, 0x1138, -- 0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, 0x080c, -- 0x960c, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fa4, 0x006e, 0x0408, -- 0x6904, 0xa194, 0x4000, 0x0518, 0x6803, 0x1000, 0x6803, 0x0000, -- 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x003e, 0x713c, 0x2160, -- 0x080c, 0xc58e, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, 0x1138, -- 0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, 0x080c, -- 0x960c, 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, -+ 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, 0x7042, 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, 0x7042, 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, 0x8b35, -+ 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, 0x946b, 0x2009, 0x07d0, -+ 0x60c4, 0xa084, 0xfff0, 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, -+ 0x7042, 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, 0x946b, 0x2009, 0x07d0, 0x60c4, 0xa084, 0xfff0, -+ 0xa005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x7042, 0x003e, 0x004e, -+ 0x005e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7810, 0x2070, 0x704c, -+ 0xa084, 0x0003, 0xa086, 0x0002, 0x0904, 0x8b8b, 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, -+ 0x9468, 0x0804, 0x8b23, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1110, -+ 0xd5bc, 0x0138, 0xa185, 0x0700, 0x6062, 0x6266, 0x636a, 0x646e, -+ 0x0038, 0xa185, 0x0700, 0x6062, 0x6266, 0x606b, 0x0000, 0x646e, -+ 0x080c, 0x56d8, 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, 0x946b, 0x0804, 0x8b23, 0x080c, 0x9468, -+ 0x0804, 0x8b23, 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, 0x7034, 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, 0x5f3b, 0x1198, -+ 0x2001, 0xc943, 0x2004, 0xa005, 0x15b8, 0x0066, 0x2031, 0x0001, -+ 0x080c, 0x5fbd, 0x006e, 0x1118, 0x080c, 0x7034, 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, 0x7034, 0x080c, 0x8c05, 0x0070, 0x6124, 0xa1e5, -+ 0x0000, 0x0140, 0x080c, 0xc5b4, 0x080c, 0x703d, 0x2009, 0x0014, -+ 0x080c, 0x962c, 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, -+ 0x0005, 0x2001, 0xc943, 0x2004, 0xa005, 0x1db0, 0x00c6, 0x2061, -+ 0xc927, 0x6128, 0xa192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, -+ 0x080c, 0x7034, 0x080c, 0x4e74, 0x0c38, 0x00c6, 0x00d6, 0x00e6, -+ 0x0016, 0x0026, 0x080c, 0x704a, 0x2071, 0xc927, 0x713c, 0x81ff, -+ 0x0904, 0x8cda, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x5f3b, -+ 0x1500, 0x0036, 0x2019, 0x0002, 0x080c, 0x8e92, 0x003e, 0x713c, -+ 0x2160, 0x080c, 0xc5b4, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, -+ 0x1138, 0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, -+ 0x080c, 0x962c, 0x0066, 0x2031, 0x0001, 0x080c, 0x5fbd, 0x006e, -+ 0x0408, 0x6904, 0xa194, 0x4000, 0x0518, 0x6803, 0x1000, 0x6803, -+ 0x0000, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e92, 0x003e, 0x713c, -+ 0x2160, 0x080c, 0xc5b4, 0x2009, 0x004a, 0x621c, 0xa296, 0x0009, -+ 0x1138, 0x6110, 0xa188, 0x0012, 0x200b, 0x0006, 0x2009, 0x0104, -+ 0x080c, 0x962c, 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, 0x54c7, 0x0110, -+ 0xa085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, 0x00ce, -+ 0x00de, 0x00ee, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83d8, 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, -+ 0x8d4e, 0x20a2, 0x20a2, 0x60c3, 0x002c, 0x080c, 0x8bfb, 0x0005, -+ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x83d8, 0x20a3, 0x0f00, - 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, 0xae88, -- 0x1110, 0x080c, 0x9c02, 0x600c, 0x0006, 0x080c, 0xb04f, 0x080c, -- 0x95dc, 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, 0x960c, 0x20a9, 0x01f4, 0x6824, -+ 0x080c, 0x8bfb, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, 0x20a1, -+ 0x020b, 0x080c, 0x8474, 0x20a3, 0x0200, 0x20a3, 0x0000, 0x20a9, -+ 0x0006, 0x2011, 0xc640, 0x2019, 0xc641, 0x23a6, 0x22a6, 0xa398, -+ 0x0002, 0xa290, 0x0002, 0x1f04, 0x8d7d, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x60c3, 0x001c, 0x080c, 0x8bfb, 0x014e, 0x015e, 0x0005, -+ 0x0156, 0x0146, 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x844d, -+ 0x080c, 0x8463, 0x7810, 0xa080, 0x0000, 0x2004, 0xa080, 0x0015, -+ 0x2098, 0x7808, 0xa088, 0x0002, 0x21a8, 0x53a6, 0xa080, 0x0004, -+ 0x8003, 0x60c2, 0x080c, 0x8bfb, 0x002e, 0x001e, 0x014e, 0x015e, -+ 0x0005, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x83d8, 0x20a3, -+ 0x6200, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x7808, 0x20a2, 0x60c3, -+ 0x0008, 0x080c, 0x8bfb, 0x014e, 0x015e, 0x0005, 0x0156, 0x0146, -+ 0x0016, 0x0026, 0x20a1, 0x020b, 0x080c, 0x83d8, 0x7810, 0xa080, -+ 0x0000, 0x2004, 0xa080, 0x0017, 0x2098, 0x7808, 0xa088, 0x0002, -+ 0x21a8, 0x53a6, 0x8003, 0x60c2, 0x080c, 0x8bfb, 0x002e, 0x001e, -+ 0x014e, 0x015e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0xc927, 0x700c, 0x2060, 0x8cff, 0x0178, 0x080c, -+ 0xaea8, 0x1110, 0x080c, 0x9c22, 0x600c, 0x0006, 0x080c, 0xb06f, -+ 0x080c, 0x95fc, 0x080c, 0x8fd0, 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, 0x8c0e, 0x68c3, 0x0000, -+ 0x080c, 0x703d, 0x2009, 0x0013, 0x080c, 0x962c, 0x20a9, 0x01f4, -+ 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, 0x7804, 0xa084, 0x4000, -+ 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, 0x0078, 0xd084, 0x0118, -+ 0x6827, 0x0001, 0x0010, 0x1f04, 0x8e28, 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, 0x703d, 0x6814, 0xa084, 0x0001, 0x0110, 0x68a7, -+ 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x2011, 0x4e31, 0x080c, -+ 0x6fc6, 0x20a9, 0x01f4, 0x6824, 0xd094, 0x0158, 0x6827, 0x0004, -+ 0x7804, 0xa084, 0x4000, 0x01a0, 0x7803, 0x1000, 0x7803, 0x0000, -+ 0x0078, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, 0x1f04, 0x8e6b, -+ 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, 0x8f1d, -+ 0xa386, 0x0002, 0x1128, 0x6814, 0xa084, 0x0002, 0x0904, 0x8f1d, -+ 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, -+ 0x68c7, 0x0000, 0x68cb, 0x0008, 0x080c, 0x704a, 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, 0x962c, 0x20a9, 0x03e8, 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, 0x1000, 0x7803, 0x0000, 0x0078, 0xd08c, 0x0118, 0x6827, -+ 0x0002, 0x0010, 0x1f04, 0x8eff, 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, 0x960c, 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, 0xae4d, -- 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, 0x9058, 0x8cff, 0x0904, 0x9058, -- 0x601c, 0xa086, 0x0006, 0x1904, 0x9053, 0x88ff, 0x0138, 0x2800, -- 0xac06, 0x1904, 0x9053, 0x2039, 0x0000, 0x0050, 0x6018, 0xa206, -- 0x1904, 0x9053, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, 0x9053, -- 0x7024, 0xac06, 0x1560, 0x2069, 0x0100, 0x68c0, 0xa005, 0x0518, -- 0x080c, 0x7024, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, -- 0x0008, 0x68c3, 0x0000, 0x080c, 0x90df, 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, -+ 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, -+ 0xae6d, 0x080c, 0x8fd0, 0x00ce, 0x08d8, 0x2c78, 0x600c, 0x2060, -+ 0x08b8, 0x012e, 0x000e, 0x006e, 0x00ce, 0x00ee, 0x00fe, 0x0005, -+ 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8699, 0x7810, 0x20a2, -+ 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x1000, 0x0804, -+ 0x8fc8, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8699, 0x7810, -+ 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x4000, -+ 0x0478, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8699, 0x7810, -+ 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x2000, -+ 0x00f8, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8699, 0x7810, -+ 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0400, -+ 0x0078, 0x0156, 0x0146, 0x20a1, 0x020b, 0x080c, 0x8699, 0x7810, -+ 0x20a2, 0xa006, 0x20a2, 0x20a2, 0x20a2, 0x20a2, 0x20a3, 0x0200, -+ 0x0089, 0x60c3, 0x0020, 0x080c, 0x8bfb, 0x014e, 0x015e, 0x0005, -+ 0x00e6, 0x2071, 0xc927, 0x7020, 0xa005, 0x0110, 0x8001, 0x7022, -+ 0x00ee, 0x0005, 0x20a9, 0x0008, 0x20a2, 0x1f04, 0x8fdc, 0x20a2, -+ 0x20a2, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, -+ 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0xc927, 0x7614, 0x2660, -+ 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0x9078, 0x8cff, 0x0904, -+ 0x9078, 0x601c, 0xa086, 0x0006, 0x1904, 0x9073, 0x88ff, 0x0138, -+ 0x2800, 0xac06, 0x1904, 0x9073, 0x2039, 0x0000, 0x0050, 0x6018, -+ 0xa206, 0x1904, 0x9073, 0x85ff, 0x0120, 0x6050, 0xa106, 0x1904, -+ 0x9073, 0x7024, 0xac06, 0x1598, 0x2069, 0x0100, 0x68c0, 0xa005, -+ 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x703d, -+ 0x080c, 0x90ff, 0x7027, 0x0000, 0x0410, 0x080c, 0x703d, 0x6820, -+ 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, -+ 0x080c, 0x90ff, 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, 0xac8a, 0x0110, -- 0x080c, 0xc134, 0x080c, 0xae4d, 0x080c, 0x8fb7, 0x88ff, 0x1190, -- 0x00ce, 0x0804, 0x8fda, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8fda, -+ 0x1158, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0xacaa, 0x0110, -+ 0x080c, 0xc15a, 0x080c, 0xae6d, 0x080c, 0x8fd0, 0x88ff, 0x1190, -+ 0x00ce, 0x0804, 0x8ff3, 0x2c78, 0x600c, 0x2060, 0x0804, 0x8ff3, - 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, 0x90cf, 0x601c, 0xa086, 0x0006, 0x1904, 0x90ca, 0x87ff, -- 0x0128, 0x2700, 0xac06, 0x1904, 0x90ca, 0x0048, 0x6018, 0xa206, -- 0x1904, 0x90ca, 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8, 0x703c, -- 0xac06, 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e79, 0x7033, -+ 0x0904, 0x90ef, 0x601c, 0xa086, 0x0006, 0x1904, 0x90ea, 0x87ff, -+ 0x0128, 0x2700, 0xac06, 0x1904, 0x90ea, 0x0048, 0x6018, 0xa206, -+ 0x1904, 0x90ea, 0x85ff, 0x0118, 0x6050, 0xa106, 0x15d8, 0x703c, -+ 0xac06, 0x1180, 0x0036, 0x2019, 0x0001, 0x080c, 0x8e92, 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, 0xac8a, -- 0x0110, 0x080c, 0xc134, 0x080c, 0xae4d, 0x87ff, 0x1190, 0x00ce, -- 0x0804, 0x9077, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9077, 0xa006, -+ 0x0008, 0x2678, 0x600f, 0x0000, 0x6010, 0x2068, 0x080c, 0xacaa, -+ 0x0110, 0x080c, 0xc15a, 0x080c, 0xae6d, 0x87ff, 0x1190, 0x00ce, -+ 0x0804, 0x9097, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9097, 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, -@@ -4192,38 +4197,38 @@ unsigned short risc_code01[] = { - 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, 0x91b5, 0x6018, 0xa080, 0x0028, 0x2004, -- 0xa206, 0x1904, 0x91b0, 0x7024, 0xac06, 0x1508, 0x2069, 0x0100, -- 0x68c0, 0xa005, 0x0904, 0x918c, 0x080c, 0x8bf5, 0x68c3, 0x0000, -- 0x080c, 0x90df, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, -+ 0x2678, 0x8cff, 0x0904, 0x91d5, 0x6018, 0xa080, 0x0028, 0x2004, -+ 0xa206, 0x1904, 0x91d0, 0x7024, 0xac06, 0x1508, 0x2069, 0x0100, -+ 0x68c0, 0xa005, 0x0904, 0x91ac, 0x080c, 0x8c0e, 0x68c3, 0x0000, -+ 0x080c, 0x90ff, 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, 0xae77, 0x1158, 0x080c, 0x2e6c, 0x080c, 0xae88, -- 0x11f0, 0x080c, 0x9c02, 0x00d8, 0x080c, 0x90df, 0x08c0, 0x080c, -- 0xae88, 0x1118, 0x080c, 0x9c02, 0x0090, 0x6010, 0x2068, 0x080c, -- 0xac8a, 0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, -- 0x6b4a, 0x6847, 0x0000, 0x080c, 0x580a, 0x080c, 0xae41, 0x080c, -- 0xb04f, 0x080c, 0xae4d, 0x080c, 0x8fb7, 0x00ce, 0x0804, 0x9139, -- 0x2c78, 0x600c, 0x2060, 0x0804, 0x9139, 0x012e, 0x000e, 0x006e, -+ 0x0000, 0x080c, 0xae97, 0x1158, 0x080c, 0x2e6c, 0x080c, 0xaea8, -+ 0x11f0, 0x080c, 0x9c22, 0x00d8, 0x080c, 0x90ff, 0x08c0, 0x080c, -+ 0xaea8, 0x1118, 0x080c, 0x9c22, 0x0090, 0x6010, 0x2068, 0x080c, -+ 0xacaa, 0x0168, 0x601c, 0xa086, 0x0003, 0x11f8, 0x6837, 0x0103, -+ 0x6b4a, 0x6847, 0x0000, 0x080c, 0x5823, 0x080c, 0xae61, 0x080c, -+ 0xb06f, 0x080c, 0xae6d, 0x080c, 0x8fd0, 0x00ce, 0x0804, 0x9159, -+ 0x2c78, 0x600c, 0x2060, 0x0804, 0x9159, 0x012e, 0x000e, 0x006e, - 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601c, 0xa086, 0x0006, -- 0x1d30, 0x080c, 0xc134, 0x0c18, 0x0036, 0x0156, 0x0136, 0x0146, -+ 0x1d30, 0x080c, 0xc15a, 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, -+ 0x0005, 0x00d6, 0x20a1, 0x020b, 0x080c, 0x8474, 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, -+ 0x7878, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x080c, 0x8bfb, 0x00de, -+ 0x0005, 0x20a1, 0x020b, 0x080c, 0x8474, 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, 0xb13a, 0x1904, 0x9294, 0x20a1, -- 0x020b, 0x080c, 0x83bf, 0x20a3, 0x1300, 0x20a3, 0x0000, 0x7828, -+ 0x0000, 0x60c3, 0x0018, 0x080c, 0x8bfb, 0x0005, 0x00d6, 0x0016, -+ 0x2f68, 0x2009, 0x0035, 0x080c, 0xb15a, 0x1904, 0x92b4, 0x20a1, -+ 0x020b, 0x080c, 0x83d8, 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, -@@ -4235,17 +4240,17 @@ unsigned short risc_code01[] = { - 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, -+ 0x8bfb, 0x001e, 0x00de, 0x0005, 0x7817, 0x0001, 0x7803, 0x0006, - 0x001e, 0x00de, 0x0005, 0x00d6, 0x0026, 0x7928, 0x2168, 0x691c, -- 0xa186, 0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x930a, 0xa186, -- 0x0005, 0x0904, 0x92f3, 0xa186, 0x0004, 0x05b8, 0xa186, 0x0008, -- 0x0904, 0x92fb, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c, 0x9372, -- 0x002e, 0x00de, 0x0005, 0x080c, 0x932e, 0x2009, 0x4000, 0x6800, -- 0x0002, 0x92d4, 0x92df, 0x92d6, 0x92df, 0x92db, 0x92d4, 0x92d4, -- 0x92df, 0x92df, 0x92df, 0x92df, 0x92d4, 0x92d4, 0x92d4, 0x92d4, -- 0x92d4, 0x92df, 0x92d4, 0x92df, 0x080c, 0x1519, 0x6820, 0xd0e4, -+ 0xa186, 0x0006, 0x01c0, 0xa186, 0x0003, 0x0904, 0x932a, 0xa186, -+ 0x0005, 0x0904, 0x9313, 0xa186, 0x0004, 0x05b8, 0xa186, 0x0008, -+ 0x0904, 0x931b, 0x7807, 0x0037, 0x7813, 0x1700, 0x080c, 0x9392, -+ 0x002e, 0x00de, 0x0005, 0x080c, 0x934e, 0x2009, 0x4000, 0x6800, -+ 0x0002, 0x92f4, 0x92ff, 0x92f6, 0x92ff, 0x92fb, 0x92f4, 0x92f4, -+ 0x92ff, 0x92ff, 0x92ff, 0x92ff, 0x92f4, 0x92f4, 0x92f4, 0x92f4, -+ 0x92f4, 0x92ff, 0x92f4, 0x92ff, 0x080c, 0x1519, 0x6820, 0xd0e4, - 0x0110, 0xd0cc, 0x0110, 0xa00e, 0x0010, 0x2009, 0x2000, 0x6828, -- 0x20a2, 0x682c, 0x20a2, 0x0804, 0x9324, 0x080c, 0x932e, 0x20a3, -+ 0x20a2, 0x682c, 0x20a2, 0x0804, 0x9344, 0x080c, 0x934e, 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, -@@ -4254,8 +4259,8 @@ unsigned short risc_code01[] = { - 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, -+ 0x0018, 0x080c, 0x8bfb, 0x002e, 0x00de, 0x0005, 0x0036, 0x0046, -+ 0x0056, 0x0066, 0x20a1, 0x020b, 0x080c, 0x8474, 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, -@@ -4263,26 +4268,26 @@ unsigned short risc_code01[] = { - 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, -+ 0x003e, 0x0005, 0x20a1, 0x020b, 0x080c, 0x8474, 0x20a3, 0x0100, - 0x20a3, 0x0000, 0x20a3, 0x0009, 0x7810, 0x20a2, 0x60c3, 0x0008, -- 0x080c, 0x8be2, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83b7, 0x20a3, -+ 0x080c, 0x8bfb, 0x0005, 0x20a1, 0x020b, 0x080c, 0x83d0, 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, -+ 0x20a3, 0x0000, 0x60c3, 0x0010, 0x080c, 0x8bfb, 0x0005, 0x20a1, -+ 0x020b, 0x080c, 0x846c, 0x20a3, 0x0100, 0x20a3, 0x0000, 0x7828, -+ 0x20a2, 0x7810, 0x20a2, 0x60c3, 0x0008, 0x080c, 0x8bfb, 0x0005, -+ 0x0146, 0x20a1, 0x020b, 0x0031, 0x60c3, 0x0000, 0x080c, 0x8bfb, - 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, -+ 0x22a2, 0x20a3, 0x0819, 0x20a3, 0x0000, 0x080c, 0x8bea, 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, -+ 0x8c05, 0x080c, 0x7034, 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, -@@ -4294,41 +4299,41 @@ unsigned short risc_code01[] = { - 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, -+ 0x0026, 0x080c, 0x8bea, 0x22a2, 0x20a3, 0x0000, 0x2fa2, 0x20a3, - 0xffff, 0x20a3, 0x0000, 0x20a3, 0x0000, 0x002e, 0x20a3, 0x5400, -- 0x20a3, 0x0000, 0x080c, 0x768f, 0x11b8, 0x0016, 0x7810, 0xa080, -+ 0x20a3, 0x0000, 0x080c, 0x76a8, 0x11b8, 0x0016, 0x7810, 0xa080, - 0x000d, 0x20a9, 0x0014, 0x200c, 0x810f, 0x21a2, 0x8000, 0x1f04, -- 0x9483, 0x20a9, 0x0012, 0x2001, 0x0000, 0x20a3, 0x0000, 0x1f04, -- 0x948d, 0x001e, 0x0804, 0x94fb, 0x7810, 0x0016, 0x00c6, 0x00d6, -+ 0x94a3, 0x20a9, 0x0012, 0x2001, 0x0000, 0x20a3, 0x0000, 0x1f04, -+ 0x94ad, 0x001e, 0x0804, 0x951b, 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, 0x94b1, 0x20a9, 0x0004, -- 0x2009, 0xc601, 0x2104, 0x20a2, 0x8108, 0x1f04, 0x94ba, 0x20a9, -+ 0xc605, 0x2104, 0x20a2, 0x8108, 0x1f04, 0x94d1, 0x20a9, 0x0004, -+ 0x2009, 0xc601, 0x2104, 0x20a2, 0x8108, 0x1f04, 0x94da, 0x20a9, - 0x0004, 0x2d08, 0xa188, 0x001d, 0x2104, 0x8007, 0x20a2, 0x8108, -- 0x1f04, 0x94c4, 0x20a9, 0x0004, 0x2d08, 0xa188, 0x0021, 0x2104, -- 0x8007, 0x20a2, 0x8108, 0x1f04, 0x94cf, 0x080c, 0x7694, 0x1138, -- 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x94da, 0x0050, 0x20a9, -+ 0x1f04, 0x94e4, 0x20a9, 0x0004, 0x2d08, 0xa188, 0x0021, 0x2104, -+ 0x8007, 0x20a2, 0x8108, 0x1f04, 0x94ef, 0x080c, 0x76ad, 0x1138, -+ 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x94fa, 0x0050, 0x20a9, - 0x0008, 0x2009, 0xc69a, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, -- 0x94e3, 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, 0x2104, 0x8007, -- 0x20a2, 0x8108, 0x1f04, 0x94ee, 0x00de, 0x00ce, 0x001e, 0x20a3, -- 0x0000, 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x8be2, 0x0005, -- 0x20a1, 0x020b, 0x080c, 0x83bf, 0x20a3, 0x5500, 0x20a3, 0x0000, -+ 0x9503, 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, 0x2104, 0x8007, -+ 0x20a2, 0x8108, 0x1f04, 0x950e, 0x00de, 0x00ce, 0x001e, 0x20a3, -+ 0x0000, 0x20a3, 0x0000, 0x60c3, 0x004c, 0x080c, 0x8bfb, 0x0005, -+ 0x20a1, 0x020b, 0x080c, 0x83d8, 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, 0x9530, 0x20a9, 0x0004, -+ 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x9550, 0x20a9, 0x0004, - 0x2d08, 0xa188, 0x0021, 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, -- 0x953b, 0x20a9, 0x0004, 0x2009, 0xc605, 0x2104, 0x20a2, 0x8108, -- 0x1f04, 0x9545, 0x20a9, 0x0004, 0x2009, 0xc601, 0x2104, 0x20a2, -- 0x8108, 0x1f04, 0x954e, 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, -- 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x9558, 0x080c, 0x7694, -- 0x1138, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x9563, 0x0050, -+ 0x955b, 0x20a9, 0x0004, 0x2009, 0xc605, 0x2104, 0x20a2, 0x8108, -+ 0x1f04, 0x9565, 0x20a9, 0x0004, 0x2009, 0xc601, 0x2104, 0x20a2, -+ 0x8108, 0x1f04, 0x956e, 0x20a9, 0x0008, 0x2d08, 0xa188, 0x0025, -+ 0x2104, 0x8007, 0x20a2, 0x8108, 0x1f04, 0x9578, 0x080c, 0x76ad, -+ 0x1138, 0x20a9, 0x0008, 0x20a3, 0x0000, 0x1f04, 0x9583, 0x0050, - 0x20a9, 0x0008, 0x2009, 0xc69a, 0x2104, 0x8007, 0x20a2, 0x8108, -- 0x1f04, 0x956c, 0x00de, 0x00ce, 0x001e, 0x20a3, 0x0000, 0x20a3, -- 0x0000, 0x60c3, 0x004c, 0x080c, 0x8be2, 0x0005, 0x2061, 0xce00, -+ 0x1f04, 0x958c, 0x00de, 0x00ce, 0x001e, 0x20a3, 0x0000, 0x20a3, -+ 0x0000, 0x60c3, 0x004c, 0x080c, 0x8bfb, 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, -@@ -4346,102 +4351,102 @@ unsigned short risc_code01[] = { - 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, -- 0x961b, 0x962a, 0x9645, 0x9660, 0xb17e, 0xb199, 0xb1b4, 0x961b, -- 0x962a, 0x7699, 0x967b, 0xa186, 0x0013, 0x1128, 0x080c, 0x7db1, -- 0x080c, 0x7e94, 0x0005, 0xa18e, 0x0047, 0x1118, 0xa016, 0x080c, -+ 0x080c, 0x7ead, 0x012e, 0x0cc0, 0x601c, 0xa084, 0x000f, 0x0002, -+ 0x963b, 0x964a, 0x9665, 0x9680, 0xb1a2, 0xb1bd, 0xb1d8, 0x963b, -+ 0x964a, 0x76b2, 0x969b, 0xa186, 0x0013, 0x1128, 0x080c, 0x7dca, -+ 0x080c, 0x7ead, 0x0005, 0xa18e, 0x0047, 0x1118, 0xa016, 0x080c, - 0x1870, 0x0005, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, -- 0x0013, 0x006e, 0x0005, 0x9643, 0x9a71, 0x9c3c, 0x9643, 0x9cb9, -- 0x9739, 0x9643, 0x9643, 0x9a03, 0xa11f, 0x9643, 0x9643, 0x9643, -- 0x9643, 0x9643, 0x9643, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, -- 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0x965e, 0xa752, -- 0x965e, 0x965e, 0x965e, 0x965e, 0x965e, 0x965e, 0xa6fd, 0xa8be, -- 0x965e, 0xa77f, 0xa7f6, 0xa77f, 0xa7f6, 0x965e, 0x080c, 0x1519, -+ 0x0013, 0x006e, 0x0005, 0x9663, 0x9a91, 0x9c5c, 0x9663, 0x9cd9, -+ 0x9759, 0x9663, 0x9663, 0x9a23, 0xa13f, 0x9663, 0x9663, 0x9663, -+ 0x9663, 0x9663, 0x9663, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, -+ 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0x967e, 0xa772, -+ 0x967e, 0x967e, 0x967e, 0x967e, 0x967e, 0x967e, 0xa71d, 0xa8de, -+ 0x967e, 0xa79f, 0xa816, 0xa79f, 0xa816, 0x967e, 0x080c, 0x1519, - 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, -- 0x0005, 0x9679, 0xa160, 0xa22a, 0xa365, 0xa4c1, 0x9679, 0x9679, -- 0x9679, 0xa13a, 0xa6ad, 0xa6b0, 0x9679, 0x9679, 0x9679, 0x9679, -- 0xa6da, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, -- 0x1519, 0x0013, 0x006e, 0x0005, 0x9694, 0x9694, 0x9694, 0x96c2, -- 0x970f, 0x9694, 0x9694, 0x9694, 0x9696, 0x9694, 0x9694, 0x9694, -- 0x9694, 0x9694, 0x9694, 0x9694, 0x080c, 0x1519, 0xa186, 0x0003, -+ 0x0005, 0x9699, 0xa180, 0xa24a, 0xa385, 0xa4e1, 0x9699, 0x9699, -+ 0x9699, 0xa15a, 0xa6cd, 0xa6d0, 0x9699, 0x9699, 0x9699, 0x9699, -+ 0xa6fa, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, -+ 0x1519, 0x0013, 0x006e, 0x0005, 0x96b4, 0x96b4, 0x96b4, 0x96e2, -+ 0x972f, 0x96b4, 0x96b4, 0x96b4, 0x96b6, 0x96b4, 0x96b4, 0x96b4, -+ 0x96b4, 0x96b4, 0x96b4, 0x96b4, 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, 0x96ce, 0x96ce, 0x96d0, -- 0x96e9, 0x96ce, 0x96ce, 0x96ce, 0x96ce, 0x96fb, 0x080c, 0x1519, -- 0x00d6, 0x0016, 0x080c, 0x7e47, 0x080c, 0x7f6e, 0x6003, 0x0004, -+ 0x2068, 0x080c, 0x7a15, 0x0126, 0x2091, 0x8000, 0x080c, 0x7f87, -+ 0x012e, 0x0005, 0xa182, 0x0047, 0x0002, 0x96ee, 0x96ee, 0x96f0, -+ 0x9709, 0x96ee, 0x96ee, 0x96ee, 0x96ee, 0x971b, 0x080c, 0x1519, -+ 0x00d6, 0x0016, 0x080c, 0x7e60, 0x080c, 0x7f87, 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, 0xac8a, -- 0x0120, 0x684b, 0x0006, 0x080c, 0x580a, 0x00de, 0x080c, 0x95dc, -- 0x080c, 0x7f6e, 0x0005, 0x080c, 0x7e47, 0x080c, 0x2e46, 0x00d6, -- 0x6110, 0x2168, 0x080c, 0xac8a, 0x0120, 0x684b, 0x0029, 0x080c, -- 0x580a, 0x00de, 0x080c, 0x95dc, 0x080c, 0x7f6e, 0x0005, 0xa182, -- 0x0047, 0x0002, 0x971d, 0x972c, 0x971b, 0x971b, 0x971b, 0x971b, -- 0x971b, 0x971b, 0x971b, 0x080c, 0x1519, 0x00d6, 0x6010, 0x2068, -+ 0x0005, 0x080c, 0x7e60, 0x00d6, 0x6110, 0x2168, 0x080c, 0xacaa, -+ 0x0120, 0x684b, 0x0006, 0x080c, 0x5823, 0x00de, 0x080c, 0x95fc, -+ 0x080c, 0x7f87, 0x0005, 0x080c, 0x7e60, 0x080c, 0x2e46, 0x00d6, -+ 0x6110, 0x2168, 0x080c, 0xacaa, 0x0120, 0x684b, 0x0029, 0x080c, -+ 0x5823, 0x00de, 0x080c, 0x95fc, 0x080c, 0x7f87, 0x0005, 0xa182, -+ 0x0047, 0x0002, 0x973d, 0x974c, 0x973b, 0x973b, 0x973b, 0x973b, -+ 0x973b, 0x973b, 0x973b, 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, 0x95dc, -- 0x0005, 0xa1b6, 0x0015, 0x1118, 0x080c, 0x95dc, 0x0030, 0xa1b6, -- 0x0016, 0x190c, 0x1519, 0x080c, 0x95dc, 0x0005, 0x20a9, 0x000e, -+ 0x0000, 0x6853, 0x0000, 0x080c, 0x5823, 0x00de, 0x080c, 0x95fc, -+ 0x0005, 0xa1b6, 0x0015, 0x1118, 0x080c, 0x95fc, 0x0030, 0xa1b6, -+ 0x0016, 0x190c, 0x1519, 0x080c, 0x95fc, 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, 0x9754, -- 0x00e6, 0x080c, 0xac8a, 0x0130, 0x6010, 0x2070, 0x7007, 0x0000, -- 0x7037, 0x0103, 0x00ee, 0x080c, 0x95dc, 0x0005, 0x00d6, 0x0036, -+ 0xa5a8, 0x0002, 0xa398, 0x0002, 0xa4a0, 0x0002, 0x1f04, 0x9774, -+ 0x00e6, 0x080c, 0xacaa, 0x0130, 0x6010, 0x2070, 0x7007, 0x0000, -+ 0x7037, 0x0103, 0x00ee, 0x080c, 0x95fc, 0x0005, 0x00d6, 0x0036, - 0x7330, 0xa386, 0x0200, 0x1130, 0x6018, 0x2068, 0x6813, 0x00ff, - 0x6817, 0xfffd, 0x6010, 0xa005, 0x0130, 0x2068, 0x6807, 0x0000, -- 0x6837, 0x0103, 0x6b32, 0x080c, 0x95dc, 0x003e, 0x00de, 0x0005, -+ 0x6837, 0x0103, 0x6b32, 0x080c, 0x95fc, 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, 0x95dc, 0x001e, 0x0005, -+ 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x95fc, 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, 0xac8a, 0x0140, -+ 0x0002, 0x20a0, 0x080c, 0x4ee4, 0x00e6, 0x080c, 0xacaa, 0x0140, - 0x6010, 0x2070, 0x7007, 0x0000, 0x7034, 0x70b2, 0x7037, 0x0103, -- 0x00ee, 0x080c, 0x95dc, 0x001e, 0x0005, 0x0016, 0x2009, 0x0000, -+ 0x00ee, 0x080c, 0x95fc, 0x001e, 0x0005, 0x0016, 0x2009, 0x0000, - 0x7030, 0xa086, 0x0200, 0x0110, 0x2009, 0x0001, 0x00d6, 0x6010, -- 0xa06d, 0x090c, 0x1519, 0x694a, 0x080c, 0x580a, 0x00de, 0x080c, -- 0x95dc, 0x001e, 0x0005, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, -- 0x0016, 0x2009, 0x0035, 0x080c, 0xb13a, 0x001e, 0x1168, 0x0026, -+ 0xa06d, 0x090c, 0x1519, 0x694a, 0x080c, 0x5823, 0x00de, 0x080c, -+ 0x95fc, 0x001e, 0x0005, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2c68, -+ 0x0016, 0x2009, 0x0035, 0x080c, 0xb15a, 0x001e, 0x1168, 0x0026, - 0x6228, 0x2268, 0x002e, 0x2071, 0xcc8c, 0x6b1c, 0xa386, 0x0003, -- 0x0130, 0xa386, 0x0006, 0x0128, 0x080c, 0x95dc, 0x0020, 0x0031, -- 0x0010, 0x080c, 0x98cc, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, -- 0x2078, 0xa186, 0x0015, 0x0904, 0x98b3, 0xa18e, 0x0016, 0x1904, -- 0x98ca, 0x700c, 0xa08c, 0xff00, 0xa186, 0x1700, 0x0120, 0xa186, -- 0x0300, 0x1904, 0x9892, 0x8fff, 0x1138, 0x6800, 0xa086, 0x000f, -- 0x0904, 0x9876, 0x0804, 0x98c8, 0x6808, 0xa086, 0xffff, 0x1904, -- 0x98b5, 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x1150, 0x797c, -- 0x7810, 0xa106, 0x1904, 0x98b5, 0x7980, 0x7814, 0xa106, 0x1904, -- 0x98b5, 0x080c, 0xae41, 0x6858, 0x7852, 0x784c, 0xc0dc, 0xc0f4, -+ 0x0130, 0xa386, 0x0006, 0x0128, 0x080c, 0x95fc, 0x0020, 0x0031, -+ 0x0010, 0x080c, 0x98ec, 0x00de, 0x00ee, 0x0005, 0x00f6, 0x6810, -+ 0x2078, 0xa186, 0x0015, 0x0904, 0x98d3, 0xa18e, 0x0016, 0x1904, -+ 0x98ea, 0x700c, 0xa08c, 0xff00, 0xa186, 0x1700, 0x0120, 0xa186, -+ 0x0300, 0x1904, 0x98b2, 0x8fff, 0x1138, 0x6800, 0xa086, 0x000f, -+ 0x0904, 0x9896, 0x0804, 0x98e8, 0x6808, 0xa086, 0xffff, 0x1904, -+ 0x98d5, 0x784c, 0xa084, 0x0060, 0xa086, 0x0020, 0x1150, 0x797c, -+ 0x7810, 0xa106, 0x1904, 0x98d5, 0x7980, 0x7814, 0xa106, 0x1904, -+ 0x98d5, 0x080c, 0xae61, 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, 0xaa39, 0x00ce, 0x0804, 0x98c8, -- 0x00c6, 0x00d6, 0x2f68, 0x6838, 0xd0fc, 0x1118, 0x080c, 0x4fa6, -- 0x0010, 0x080c, 0x51dd, 0x00de, 0x00ce, 0x1904, 0x98b5, 0x00c6, -- 0x2d60, 0x080c, 0x95dc, 0x00ce, 0x0804, 0x98c8, 0x00c6, 0x080c, -- 0xaf06, 0x0190, 0x6013, 0x0000, 0x6818, 0x601a, 0x080c, 0xb057, -- 0x601f, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x95dc, 0x00ce, -- 0x080c, 0x960c, 0x00ce, 0x04e0, 0x2001, 0xc8ff, 0x2004, 0x683e, -+ 0x7858, 0x7854, 0xa20a, 0x0208, 0x8011, 0x7a56, 0x82ff, 0x002e, -+ 0x1138, 0x00c6, 0x2d60, 0x080c, 0xaa59, 0x00ce, 0x0804, 0x98e8, -+ 0x00c6, 0x00d6, 0x2f68, 0x6838, 0xd0fc, 0x1118, 0x080c, 0x4fbf, -+ 0x0010, 0x080c, 0x51f6, 0x00de, 0x00ce, 0x1904, 0x98d5, 0x00c6, -+ 0x2d60, 0x080c, 0x95fc, 0x00ce, 0x0804, 0x98e8, 0x00c6, 0x080c, -+ 0xaf26, 0x0190, 0x6013, 0x0000, 0x6818, 0x601a, 0x080c, 0xb077, -+ 0x601f, 0x0003, 0x6904, 0x00c6, 0x2d60, 0x080c, 0x95fc, 0x00ce, -+ 0x080c, 0x962c, 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, -+ 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x79b2, 0x080c, 0x7ead, - 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, 0xa92d, 0x080c, 0xae41, 0x080c, 0xae4d, 0x00de, 0x00ce, -- 0x080c, 0x95dc, 0x00fe, 0x0005, 0xa186, 0x0015, 0x1128, 0x2001, -+ 0x080c, 0xa94d, 0x080c, 0xae61, 0x080c, 0xae6d, 0x00de, 0x00ce, -+ 0x080c, 0x95fc, 0x00fe, 0x0005, 0xa186, 0x0015, 0x1128, 0x2001, - 0xc8ff, 0x2004, 0x683e, 0x0068, 0xa18e, 0x0016, 0x1160, 0x00c6, -- 0x2d00, 0x2060, 0x080c, 0xc3d5, 0x080c, 0x7103, 0x080c, 0x95dc, -- 0x00ce, 0x080c, 0x95dc, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, -+ 0x2d00, 0x2060, 0x080c, 0xc3fb, 0x080c, 0x711c, 0x080c, 0x95fc, -+ 0x00ce, 0x080c, 0x95fc, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, - 0x7c80, 0x7b7c, 0xd2f4, 0x0130, 0x2001, 0xc8ff, 0x2004, 0x683e, -- 0x0804, 0x9946, 0x00c6, 0x2d60, 0x080c, 0xa94d, 0x00ce, 0x6804, -+ 0x0804, 0x9966, 0x00c6, 0x2d60, 0x080c, 0xa96d, 0x00ce, 0x6804, - 0xa086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, -- 0x6007, 0x0050, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00ce, 0x04f0, -+ 0x6007, 0x0050, 0x080c, 0x79b2, 0x080c, 0x7ead, 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, -@@ -4449,235 +4454,235 @@ unsigned short risc_code01[] = { - 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, 0xaf93, 0x080c, 0x7e94, 0x0010, 0x080c, 0x95dc, -+ 0x682e, 0x080c, 0xafb3, 0x080c, 0x7ead, 0x0010, 0x080c, 0x95fc, - 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x6034, -- 0x2068, 0x6a1c, 0xa286, 0x0007, 0x0904, 0x99aa, 0xa286, 0x0002, -- 0x0904, 0x99aa, 0xa286, 0x0000, 0x0904, 0x99aa, 0x6808, 0x6338, -- 0xa306, 0x1904, 0x99aa, 0x2071, 0xcc8c, 0xa186, 0x0015, 0x05e0, -+ 0x2068, 0x6a1c, 0xa286, 0x0007, 0x0904, 0x99ca, 0xa286, 0x0002, -+ 0x0904, 0x99ca, 0xa286, 0x0000, 0x0904, 0x99ca, 0x6808, 0x6338, -+ 0xa306, 0x1904, 0x99ca, 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, 0xac8a, 0x090c, 0x1519, 0x6853, 0x0003, -- 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, -- 0x080c, 0x7e94, 0x00ce, 0x0030, 0x6034, 0x2070, 0x2001, 0xc8ff, -- 0x2004, 0x703e, 0x080c, 0x95dc, 0x002e, 0x00de, 0x00ee, 0x0005, -+ 0x6010, 0x2068, 0x080c, 0xacaa, 0x090c, 0x1519, 0x6853, 0x0003, -+ 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x79b2, -+ 0x080c, 0x7ead, 0x00ce, 0x0030, 0x6034, 0x2070, 0x2001, 0xc8ff, -+ 0x2004, 0x703e, 0x080c, 0x95fc, 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, -- 0xa0fc, 0x002e, 0x003e, 0x015e, 0x11d8, 0x0156, 0x0036, 0x0026, -+ 0xa11c, 0x002e, 0x003e, 0x015e, 0x11d8, 0x0156, 0x0036, 0x0026, - 0xae90, 0x000c, 0xa290, 0x0008, 0x20a9, 0x0004, 0xad98, 0x0006, -- 0x080c, 0xa0fc, 0x002e, 0x003e, 0x015e, 0x1150, 0x7038, 0x680a, -- 0x703c, 0x680e, 0x6800, 0xc08d, 0x6802, 0x00de, 0x0804, 0x9760, -- 0x080c, 0x2e46, 0x00c6, 0x080c, 0x9586, 0x2f00, 0x601a, 0x6013, -+ 0x080c, 0xa11c, 0x002e, 0x003e, 0x015e, 0x1150, 0x7038, 0x680a, -+ 0x703c, 0x680e, 0x6800, 0xc08d, 0x6802, 0x00de, 0x0804, 0x9780, -+ 0x080c, 0x2e46, 0x00c6, 0x080c, 0x95a6, 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, 0x9a67, 0x0002, 0x9a5b, 0x9a4f, 0x9a5b, -- 0x9a5b, 0x9a5b, 0x9a5b, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, -- 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, -- 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, -- 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a5b, 0x9a4d, 0x9a5b, 0x9a5b, -- 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a5b, 0x9a4d, 0x9a4d, -- 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a5b, -- 0x9a5b, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, 0x9a4d, -- 0x9a4d, 0x9a4d, 0x9a5b, 0x9a4d, 0x9a4d, 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, 0x9a5b, 0x9a5b, 0x9a6f, 0x9a5b, 0x9a5b, 0x9a6f, 0x080c, -+ 0x0007, 0x080c, 0x52aa, 0x080c, 0x52d7, 0x080c, 0x79f8, 0x080c, -+ 0x7ead, 0x00ce, 0x0c10, 0x2100, 0xa1b2, 0x0080, 0x1a0c, 0x1519, -+ 0xa1b2, 0x0040, 0x1a04, 0x9a87, 0x0002, 0x9a7b, 0x9a6f, 0x9a7b, -+ 0x9a7b, 0x9a7b, 0x9a7b, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, -+ 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, -+ 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, -+ 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a7b, 0x9a6d, 0x9a7b, 0x9a7b, -+ 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a7b, 0x9a6d, 0x9a6d, -+ 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a7b, -+ 0x9a7b, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, 0x9a6d, -+ 0x9a6d, 0x9a6d, 0x9a7b, 0x9a6d, 0x9a6d, 0x080c, 0x1519, 0x6003, -+ 0x0001, 0x6106, 0x080c, 0x79f8, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x7ead, 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x79f8, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x7ead, 0x012e, 0x0005, 0x2600, -+ 0x0002, 0x9a7b, 0x9a7b, 0x9a8f, 0x9a7b, 0x9a7b, 0x9a8f, 0x080c, - 0x1519, 0x6004, 0xa0b2, 0x0080, 0x1a0c, 0x1519, 0xa1b6, 0x0013, -- 0x0904, 0x9b21, 0xa1b6, 0x0027, 0x1904, 0x9ae7, 0x080c, 0x7db1, -- 0x6004, 0x080c, 0xae77, 0x0190, 0x080c, 0xae88, 0x0904, 0x9ae1, -- 0xa08e, 0x0021, 0x0904, 0x9ae4, 0xa08e, 0x0022, 0x0904, 0x9ae1, -- 0xa08e, 0x003d, 0x0904, 0x9ae4, 0x0804, 0x9ada, 0x080c, 0x2e6c, -- 0x2001, 0x0007, 0x080c, 0x5291, 0x6018, 0xa080, 0x0028, 0x200c, -- 0x080c, 0x9c02, 0xa186, 0x007e, 0x1148, 0x2001, 0xc635, 0x2014, -- 0xc285, 0x080c, 0x5f22, 0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, -- 0x0036, 0x2110, 0x0026, 0x2019, 0x0028, 0x080c, 0x912b, 0x002e, -- 0x080c, 0xc4d7, 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, 0xbeea, 0x007e, 0x003e, 0x002e, 0x001e, -- 0x080c, 0x5300, 0x080c, 0xb04f, 0x080c, 0x95dc, 0x080c, 0x7e94, -- 0x0005, 0x080c, 0x9c02, 0x0cb0, 0x080c, 0x9c30, 0x0c98, 0xa186, -- 0x0014, 0x1db0, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x080c, 0xae77, -+ 0x0904, 0x9b41, 0xa1b6, 0x0027, 0x1904, 0x9b07, 0x080c, 0x7dca, -+ 0x6004, 0x080c, 0xae97, 0x0190, 0x080c, 0xaea8, 0x0904, 0x9b01, -+ 0xa08e, 0x0021, 0x0904, 0x9b04, 0xa08e, 0x0022, 0x0904, 0x9b01, -+ 0xa08e, 0x003d, 0x0904, 0x9b04, 0x0804, 0x9afa, 0x080c, 0x2e6c, -+ 0x2001, 0x0007, 0x080c, 0x52aa, 0x6018, 0xa080, 0x0028, 0x200c, -+ 0x080c, 0x9c22, 0xa186, 0x007e, 0x1148, 0x2001, 0xc635, 0x2014, -+ 0xc285, 0x080c, 0x5f3b, 0x1108, 0xc2ad, 0x2202, 0x0016, 0x0026, -+ 0x0036, 0x2110, 0x0026, 0x2019, 0x0028, 0x080c, 0x914b, 0x002e, -+ 0x080c, 0xc4fd, 0x003e, 0x002e, 0x001e, 0x0016, 0x0026, 0x0036, -+ 0x2110, 0x2019, 0x0028, 0x080c, 0x7b2f, 0x0076, 0x2039, 0x0000, -+ 0x080c, 0x7a27, 0x00c6, 0x6018, 0xa065, 0x0110, 0x080c, 0x5557, -+ 0x00ce, 0x2c08, 0x080c, 0xbf10, 0x007e, 0x003e, 0x002e, 0x001e, -+ 0x080c, 0x5319, 0x080c, 0xb06f, 0x080c, 0x95fc, 0x080c, 0x7ead, -+ 0x0005, 0x080c, 0x9c22, 0x0cb0, 0x080c, 0x9c50, 0x0c98, 0xa186, -+ 0x0014, 0x1db0, 0x080c, 0x7dca, 0x080c, 0x2e46, 0x080c, 0xae97, - 0x1188, 0x080c, 0x2e6c, 0x6018, 0xa080, 0x0028, 0x200c, 0x080c, -- 0x9c02, 0xa186, 0x007e, 0x1128, 0x2001, 0xc635, 0x200c, 0xc185, -- 0x2102, 0x08c0, 0x080c, 0xae88, 0x1118, 0x080c, 0x9c02, 0x0890, -+ 0x9c22, 0xa186, 0x007e, 0x1128, 0x2001, 0xc635, 0x200c, 0xc185, -+ 0x2102, 0x08c0, 0x080c, 0xaea8, 0x1118, 0x080c, 0x9c22, 0x0890, - 0x6004, 0xa08e, 0x0032, 0x1158, 0x00e6, 0x00f6, 0x2071, 0xc6a2, - 0x2079, 0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x0818, 0x6004, -- 0xa08e, 0x0021, 0x0d50, 0xa08e, 0x0022, 0x090c, 0x9c02, 0x0804, -- 0x9ada, 0xa0b2, 0x0040, 0x1a04, 0x9be4, 0x2008, 0x0002, 0x9b69, -- 0x9b6a, 0x9b6d, 0x9b70, 0x9b73, 0x9b76, 0x9b67, 0x9b67, 0x9b67, -- 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, -- 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, -- 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b79, 0x9b88, 0x9b67, -- 0x9b8a, 0x9b88, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b88, -- 0x9b88, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, 0x9b67, -- 0x9b67, 0x9bc4, 0x9b88, 0x9b67, 0x9b84, 0x9b67, 0x9b67, 0x9b67, -- 0x9b85, 0x9b67, 0x9b67, 0x9b67, 0x9b88, 0x9bbb, 0x9b67, 0x080c, -+ 0xa08e, 0x0021, 0x0d50, 0xa08e, 0x0022, 0x090c, 0x9c22, 0x0804, -+ 0x9afa, 0xa0b2, 0x0040, 0x1a04, 0x9c04, 0x2008, 0x0002, 0x9b89, -+ 0x9b8a, 0x9b8d, 0x9b90, 0x9b93, 0x9b96, 0x9b87, 0x9b87, 0x9b87, -+ 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, -+ 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, -+ 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b99, 0x9ba8, 0x9b87, -+ 0x9baa, 0x9ba8, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9ba8, -+ 0x9ba8, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, 0x9b87, -+ 0x9b87, 0x9be4, 0x9ba8, 0x9b87, 0x9ba4, 0x9b87, 0x9b87, 0x9b87, -+ 0x9ba5, 0x9b87, 0x9b87, 0x9b87, 0x9ba8, 0x9bdb, 0x9b87, 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, 0x9bd5, 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, 0x6016, -- 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003, 0x0004, 0x080c, 0x7e94, -- 0x0005, 0x080c, 0x5291, 0x080c, 0x7db1, 0x6003, 0x0002, 0x2001, -+ 0x0400, 0x080c, 0x7dca, 0x6003, 0x0005, 0x2001, 0xc8ff, 0x2004, -+ 0x603e, 0x080c, 0x7ead, 0x00a0, 0x0018, 0x0010, 0x080c, 0x52aa, -+ 0x0804, 0x9bf5, 0x080c, 0x7dca, 0x2001, 0xc8fd, 0x2004, 0x6016, -+ 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003, 0x0004, 0x080c, 0x7ead, -+ 0x0005, 0x080c, 0x52aa, 0x080c, 0x7dca, 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, 0xb04f, 0x080c, -- 0x95dc, 0x080c, 0x7e94, 0x08a0, 0x00e6, 0x00f6, 0x2071, 0xc6a2, -- 0x2079, 0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x080c, 0x7db1, -- 0x080c, 0x95dc, 0x080c, 0x7e94, 0x0818, 0x080c, 0x7db1, 0x2001, -+ 0x080c, 0x7ead, 0x08e8, 0x080c, 0x7dca, 0x080c, 0xb06f, 0x080c, -+ 0x95fc, 0x080c, 0x7ead, 0x08a0, 0x00e6, 0x00f6, 0x2071, 0xc6a2, -+ 0x2079, 0x0000, 0x080c, 0x3179, 0x00fe, 0x00ee, 0x080c, 0x7dca, -+ 0x080c, 0x95fc, 0x080c, 0x7ead, 0x0818, 0x080c, 0x7dca, 0x2001, - 0xc8ff, 0x2004, 0x603e, 0x6003, 0x0002, 0x2001, 0xc8fd, 0x2004, -- 0x6016, 0x080c, 0x7e94, 0x0005, 0x2600, 0x2008, 0x0002, 0x9bef, -- 0x9bd5, 0x9bed, 0x9bd5, 0x9bd5, 0x9bed, 0x080c, 0x1519, 0x080c, -- 0x7db1, 0x00d6, 0x6010, 0x2068, 0x080c, 0x768f, 0x1118, 0x080c, -- 0x1619, 0x0010, 0x080c, 0x580a, 0x00de, 0x080c, 0x95dc, 0x080c, -- 0x7e94, 0x0005, 0x00e6, 0x0026, 0x0016, 0x080c, 0xac8a, 0x0508, -+ 0x6016, 0x080c, 0x7ead, 0x0005, 0x2600, 0x2008, 0x0002, 0x9c0f, -+ 0x9bf5, 0x9c0d, 0x9bf5, 0x9bf5, 0x9c0d, 0x080c, 0x1519, 0x080c, -+ 0x7dca, 0x00d6, 0x6010, 0x2068, 0x080c, 0x76a8, 0x1118, 0x080c, -+ 0x1619, 0x0010, 0x080c, 0x5823, 0x00de, 0x080c, 0x95fc, 0x080c, -+ 0x7ead, 0x0005, 0x00e6, 0x0026, 0x0016, 0x080c, 0xacaa, 0x0508, - 0x6010, 0x2070, 0x7034, 0xa086, 0x0139, 0x1148, 0x2001, 0x0030, -- 0x2009, 0x0000, 0x2011, 0x4005, 0x080c, 0xb106, 0x0090, 0x7038, -+ 0x2009, 0x0000, 0x2011, 0x4005, 0x080c, 0xb126, 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, 0xb0c2, 0x0804, 0x9ca9, 0x6604, -- 0xa6b6, 0x0033, 0x1120, 0x080c, 0xb072, 0x0804, 0x9ca9, 0x6604, -- 0xa6b6, 0x0028, 0x1120, 0x080c, 0xaeb8, 0x0804, 0x9ca9, 0x6604, -- 0xa6b6, 0x0029, 0x1120, 0x080c, 0xaecf, 0x0804, 0x9ca9, 0x6604, -- 0xa6b6, 0x001f, 0x1118, 0x080c, 0x9746, 0x04d8, 0x6604, 0xa6b6, -- 0x0000, 0x1118, 0x080c, 0x99b0, 0x04a0, 0x6604, 0xa6b6, 0x0022, -- 0x1118, 0x080c, 0x976e, 0x0468, 0x6604, 0xa6b6, 0x0035, 0x1118, -- 0x080c, 0x97eb, 0x0430, 0x6604, 0xa6b6, 0x0039, 0x1118, 0x080c, -- 0x994c, 0x00f8, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c, 0x9788, -- 0x00c0, 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x97a8, 0x0088, -- 0x6604, 0xa6b6, 0x0041, 0x1118, 0x080c, 0x97d5, 0x0050, 0xa1b6, -+ 0xa6b6, 0x0043, 0x1120, 0x080c, 0xb0e2, 0x0804, 0x9cc9, 0x6604, -+ 0xa6b6, 0x0033, 0x1120, 0x080c, 0xb092, 0x0804, 0x9cc9, 0x6604, -+ 0xa6b6, 0x0028, 0x1120, 0x080c, 0xaed8, 0x0804, 0x9cc9, 0x6604, -+ 0xa6b6, 0x0029, 0x1120, 0x080c, 0xaeef, 0x0804, 0x9cc9, 0x6604, -+ 0xa6b6, 0x001f, 0x1118, 0x080c, 0x9766, 0x04d8, 0x6604, 0xa6b6, -+ 0x0000, 0x1118, 0x080c, 0x99d0, 0x04a0, 0x6604, 0xa6b6, 0x0022, -+ 0x1118, 0x080c, 0x978e, 0x0468, 0x6604, 0xa6b6, 0x0035, 0x1118, -+ 0x080c, 0x980b, 0x0430, 0x6604, 0xa6b6, 0x0039, 0x1118, 0x080c, -+ 0x996c, 0x00f8, 0x6604, 0xa6b6, 0x003d, 0x1118, 0x080c, 0x97a8, -+ 0x00c0, 0x6604, 0xa6b6, 0x0044, 0x1118, 0x080c, 0x97c8, 0x0088, -+ 0x6604, 0xa6b6, 0x0041, 0x1118, 0x080c, 0x97f5, 0x0050, 0xa1b6, - 0x0015, 0x1110, 0x0053, 0x0028, 0xa1b6, 0x0016, 0x1118, 0x0804, -- 0x9e8c, 0x0005, 0x080c, 0x9623, 0x0ce0, 0x9cd3, 0x9cd6, 0x9cd3, -- 0x9d1a, 0x9cd3, 0x9e13, 0x9e9a, 0x9cd3, 0x9cd3, 0x9e64, 0x9cd3, -- 0x9e7a, 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005, 0x3d18, 0x3e20, -+ 0x9eac, 0x0005, 0x080c, 0x9643, 0x0ce0, 0x9cf3, 0x9cf6, 0x9cf3, -+ 0x9d3a, 0x9cf3, 0x9e33, 0x9eba, 0x9cf3, 0x9cf3, 0x9e84, 0x9cf3, -+ 0x9e9a, 0xa1b6, 0x0048, 0x0140, 0x20e1, 0x0005, 0x3d18, 0x3e20, - 0x2c10, 0x080c, 0x1870, 0x0005, 0x00e6, 0xacf0, 0x0004, 0x2e74, -- 0x7000, 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x95dc, 0x0005, -- 0x080c, 0x95dc, 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, -- 0xc600, 0x7084, 0xa086, 0x0074, 0x1530, 0x080c, 0xbec1, 0x11b0, -+ 0x7000, 0x2070, 0x7037, 0x0103, 0x00ee, 0x080c, 0x95fc, 0x0005, -+ 0x080c, 0x95fc, 0x0005, 0xe000, 0xe000, 0x0005, 0x00e6, 0x2071, -+ 0xc600, 0x7084, 0xa086, 0x0074, 0x1530, 0x080c, 0xbee7, 0x11b0, - 0x00d6, 0x6018, 0x2068, 0x7030, 0xd08c, 0x0128, 0x6800, 0xd0bc, - 0x0110, 0xc0c5, 0x6802, 0x00e9, 0x00de, 0x2001, 0x0006, 0x080c, -- 0x5291, 0x080c, 0x2e6c, 0x080c, 0x95dc, 0x0088, 0x2001, 0x000a, -- 0x080c, 0x5291, 0x080c, 0x2e6c, 0x6003, 0x0001, 0x6007, 0x0001, -- 0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9dee, 0x00ee, -- 0x0005, 0x6800, 0xd084, 0x0168, 0x2001, 0x0000, 0x080c, 0x527f, -+ 0x52aa, 0x080c, 0x2e6c, 0x080c, 0x95fc, 0x0088, 0x2001, 0x000a, -+ 0x080c, 0x52aa, 0x080c, 0x2e6c, 0x6003, 0x0001, 0x6007, 0x0001, -+ 0x080c, 0x79f8, 0x0020, 0x2001, 0x0001, 0x080c, 0x9e0e, 0x00ee, -+ 0x0005, 0x6800, 0xd084, 0x0168, 0x2001, 0x0000, 0x080c, 0x5298, - 0x2069, 0xc652, 0x6804, 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, -- 0x52be, 0x0005, 0x00d6, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, -- 0x1904, 0x9de9, 0x6018, 0x2068, 0x6aa0, 0xa286, 0x007e, 0x1120, -- 0x080c, 0x9fbc, 0x0804, 0x9d88, 0x080c, 0x9fb2, 0x6018, 0x2068, -+ 0x52d7, 0x0005, 0x00d6, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, -+ 0x1904, 0x9e09, 0x6018, 0x2068, 0x6aa0, 0xa286, 0x007e, 0x1120, -+ 0x080c, 0x9fdc, 0x0804, 0x9da8, 0x080c, 0x9fd2, 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, 0x95dc, 0x0804, 0x9dec, 0x00e6, 0x2071, -+ 0x6837, 0x0103, 0x6833, 0x0200, 0x2001, 0x0006, 0x080c, 0x52aa, -+ 0x080c, 0x2e6c, 0x080c, 0x95fc, 0x0804, 0x9e0c, 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, 0xb106, 0x0840, 0x2001, 0x0004, 0x080c, 0x5291, -- 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x79df, 0x0804, 0x9dec, -- 0x685c, 0xd0e4, 0x01d8, 0x080c, 0xb002, 0x080c, 0x5f22, 0x0118, -- 0xd0dc, 0x1904, 0x9d44, 0x2011, 0xc635, 0x2204, 0xc0ad, 0x2012, -+ 0x4000, 0x080c, 0xb126, 0x0840, 0x2001, 0x0004, 0x080c, 0x52aa, -+ 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x79f8, 0x0804, 0x9e0c, -+ 0x685c, 0xd0e4, 0x01d8, 0x080c, 0xb022, 0x080c, 0x5f3b, 0x0118, -+ 0xd0dc, 0x1904, 0x9d64, 0x2011, 0xc635, 0x2204, 0xc0ad, 0x2012, - 0x2001, 0xc8d6, 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, -- 0x080c, 0x2a1c, 0x78e2, 0x00fe, 0x0804, 0x9d44, 0x080c, 0xb038, -- 0x2011, 0xc635, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xc016, -- 0x000e, 0x1904, 0x9d44, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, -- 0x5291, 0x2001, 0x0000, 0x080c, 0x527f, 0x00c6, 0x2009, 0x00ef, -+ 0x080c, 0x2a1c, 0x78e2, 0x00fe, 0x0804, 0x9d64, 0x080c, 0xb058, -+ 0x2011, 0xc635, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xc03c, -+ 0x000e, 0x1904, 0x9d64, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, -+ 0x52aa, 0x2001, 0x0000, 0x080c, 0x5298, 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, 0x9d44, 0x601a, 0x2001, 0x0002, 0x080c, 0x5291, -- 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, -+ 0x080c, 0x29c7, 0x7952, 0x00fe, 0x8108, 0x080c, 0x52fa, 0x2c00, -+ 0x00ce, 0x1904, 0x9d64, 0x601a, 0x2001, 0x0002, 0x080c, 0x52aa, -+ 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79f8, - 0x0018, 0x2001, 0x0001, 0x0011, 0x00de, 0x0005, 0x0066, 0x2030, -- 0xa005, 0x0170, 0x2001, 0x0007, 0x080c, 0x5291, 0x2001, 0xc600, -- 0x2004, 0xa086, 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x52be, -+ 0xa005, 0x0170, 0x2001, 0x0007, 0x080c, 0x52aa, 0x2001, 0xc600, -+ 0x2004, 0xa086, 0x0003, 0x1120, 0x2001, 0x0007, 0x080c, 0x52d7, - 0x2600, 0xa005, 0x1150, 0x6010, 0xa080, 0x000e, 0x2004, 0xd0fc, -- 0x1120, 0x2011, 0x8014, 0x080c, 0x407d, 0x080c, 0x2e6c, 0x080c, -- 0x95dc, 0x006e, 0x0005, 0x00e6, 0x0026, 0x0016, 0x2071, 0xc600, -+ 0x1120, 0x2011, 0x8014, 0x080c, 0x4096, 0x080c, 0x2e6c, 0x080c, -+ 0x95fc, 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, 0x9d09, 0x00de, 0x080c, 0xa06b, 0x1550, -+ 0x6010, 0xa005, 0x1110, 0x080c, 0x4108, 0x00d6, 0x6018, 0x2068, -+ 0x080c, 0x53f8, 0x080c, 0x9d29, 0x00de, 0x080c, 0xa08b, 0x1550, - 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0518, 0x2001, -- 0x0006, 0x080c, 0x5291, 0x00e6, 0x6010, 0xa075, 0x01a8, 0x7034, -+ 0x0006, 0x080c, 0x52aa, 0x00e6, 0x6010, 0xa075, 0x01a8, 0x7034, - 0xa084, 0x00ff, 0xa086, 0x0039, 0x1148, 0x2001, 0x0000, 0x2009, -- 0x0000, 0x2011, 0x4000, 0x080c, 0xb106, 0x0030, 0x7007, 0x0000, -+ 0x0000, 0x2011, 0x4000, 0x080c, 0xb126, 0x0030, 0x7007, 0x0000, - 0x7037, 0x0103, 0x7033, 0x0200, 0x00ee, 0x080c, 0x2e6c, 0x080c, -- 0x95dc, 0x0030, 0x080c, 0x9c02, 0x2001, 0x0000, 0x080c, 0x9dee, -+ 0x95fc, 0x0030, 0x080c, 0x9c22, 0x2001, 0x0000, 0x080c, 0x9e0e, - 0x001e, 0x002e, 0x00ee, 0x0005, 0x2011, 0xc621, 0x2204, 0xa086, -- 0x0014, 0x1158, 0x2001, 0x0002, 0x080c, 0x5291, 0x6003, 0x0001, -- 0x6007, 0x0001, 0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, -- 0x9dee, 0x0005, 0x2011, 0xc621, 0x2204, 0xa086, 0x0004, 0x1138, -- 0x2001, 0x0007, 0x080c, 0x5291, 0x080c, 0x95dc, 0x0020, 0x2001, -- 0x0001, 0x080c, 0x9dee, 0x0005, 0x000b, 0x0005, 0x9cd3, 0x9ea5, -- 0x9cd3, 0x9edb, 0x9cd3, 0x9f68, 0x9e9a, 0x9cd0, 0x9cd3, 0x9f7d, -- 0x9cd3, 0x9f8f, 0x6604, 0xa686, 0x0003, 0x0904, 0x9e13, 0xa6b6, -- 0x001e, 0x1110, 0x080c, 0x95dc, 0x0005, 0x00d6, 0x00c6, 0x080c, -- 0x9fa1, 0x1178, 0x2001, 0x0000, 0x080c, 0x527f, 0x2001, 0x0002, -- 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, -+ 0x0014, 0x1158, 0x2001, 0x0002, 0x080c, 0x52aa, 0x6003, 0x0001, -+ 0x6007, 0x0001, 0x080c, 0x79f8, 0x0020, 0x2001, 0x0001, 0x080c, -+ 0x9e0e, 0x0005, 0x2011, 0xc621, 0x2204, 0xa086, 0x0004, 0x1138, -+ 0x2001, 0x0007, 0x080c, 0x52aa, 0x080c, 0x95fc, 0x0020, 0x2001, -+ 0x0001, 0x080c, 0x9e0e, 0x0005, 0x000b, 0x0005, 0x9cf3, 0x9ec5, -+ 0x9cf3, 0x9efb, 0x9cf3, 0x9f88, 0x9eba, 0x9cf0, 0x9cf3, 0x9f9d, -+ 0x9cf3, 0x9faf, 0x6604, 0xa686, 0x0003, 0x0904, 0x9e33, 0xa6b6, -+ 0x001e, 0x1110, 0x080c, 0x95fc, 0x0005, 0x00d6, 0x00c6, 0x080c, -+ 0x9fc1, 0x1178, 0x2001, 0x0000, 0x080c, 0x5298, 0x2001, 0x0002, -+ 0x080c, 0x52aa, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79f8, - 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, 0x9dee, -- 0x00ce, 0x00de, 0x0005, 0x0026, 0x2011, 0x0000, 0x080c, 0x9faf, -+ 0xa086, 0x1900, 0x1108, 0x08d0, 0x2001, 0x0001, 0x080c, 0x9e0e, -+ 0x00ce, 0x00de, 0x0005, 0x0026, 0x2011, 0x0000, 0x080c, 0x9fcf, - 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, -- 0xac8a, 0x00de, 0x0108, 0x6a34, 0x080c, 0x9c02, 0x2009, 0xcc8e, -+ 0x5298, 0x2001, 0x0002, 0x080c, 0x52aa, 0x6003, 0x0001, 0x6007, -+ 0x0002, 0x080c, 0x79f8, 0x0490, 0x00d6, 0x6010, 0x2068, 0x080c, -+ 0xacaa, 0x00de, 0x0108, 0x6a34, 0x080c, 0x9c22, 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, 0x9dee, 0x002e, 0x0005, -- 0x00d6, 0xa286, 0x0139, 0x0160, 0x6010, 0x2068, 0x080c, 0xac8a, -+ 0x2001, 0x0004, 0x080c, 0x52aa, 0x2001, 0x0028, 0x6016, 0x6007, -+ 0x004b, 0x0020, 0x2001, 0x0001, 0x080c, 0x9e0e, 0x002e, 0x0005, -+ 0x00d6, 0xa286, 0x0139, 0x0160, 0x6010, 0x2068, 0x080c, 0xacaa, - 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, 0x9faf, 0x1158, 0x2001, 0x0004, 0x080c, 0x5291, 0x6003, -- 0x0001, 0x6007, 0x0003, 0x080c, 0x79df, 0x0030, 0x080c, 0x9c02, -- 0x2001, 0x0000, 0x080c, 0x9dee, 0x0005, 0x0489, 0x1158, 0x2001, -- 0x0008, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, -- 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9dee, 0x0005, 0x00f9, -- 0x1158, 0x2001, 0x000a, 0x080c, 0x5291, 0x6003, 0x0001, 0x6007, -- 0x0001, 0x080c, 0x79df, 0x0020, 0x2001, 0x0001, 0x080c, 0x9dee, -+ 0x080c, 0x4f1b, 0x00ee, 0x0010, 0x080c, 0x2e46, 0x00de, 0x0850, -+ 0x080c, 0x9fcf, 0x1158, 0x2001, 0x0004, 0x080c, 0x52aa, 0x6003, -+ 0x0001, 0x6007, 0x0003, 0x080c, 0x79f8, 0x0030, 0x080c, 0x9c22, -+ 0x2001, 0x0000, 0x080c, 0x9e0e, 0x0005, 0x0489, 0x1158, 0x2001, -+ 0x0008, 0x080c, 0x52aa, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, -+ 0x79f8, 0x0020, 0x2001, 0x0001, 0x080c, 0x9e0e, 0x0005, 0x00f9, -+ 0x1158, 0x2001, 0x000a, 0x080c, 0x52aa, 0x6003, 0x0001, 0x6007, -+ 0x0001, 0x080c, 0x79f8, 0x0020, 0x2001, 0x0001, 0x080c, 0x9e0e, - 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, -+ 0x5365, 0x001e, 0x00ce, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x0036, - 0x0016, 0x6018, 0x2068, 0x2071, 0xc635, 0x2e04, 0xa085, 0x0003, -- 0x2072, 0x080c, 0xa040, 0x0560, 0x2009, 0xc635, 0x2104, 0xc0cd, -+ 0x2072, 0x080c, 0xa060, 0x0560, 0x2009, 0xc635, 0x2104, 0xc0cd, - 0x200a, 0x2001, 0xc653, 0x2004, 0xd0a4, 0x0158, 0xa006, 0x2020, -- 0x2009, 0x002a, 0x080c, 0xc183, 0x2001, 0xc60c, 0x200c, 0xc195, -+ 0x2009, 0x002a, 0x080c, 0xc1a9, 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, 0x9ff1, 0x015e, 0x00ce, -- 0x080c, 0x9fb2, 0x6813, 0x00ff, 0x6817, 0xfffe, 0x2071, 0xcc80, -+ 0x007f, 0x080c, 0x2f41, 0x8108, 0x1f04, 0xa011, 0x015e, 0x00ce, -+ 0x080c, 0x9fd2, 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, -+ 0x080c, 0x5f3b, 0x0170, 0x2069, 0xcc8e, 0x2071, 0xc8f9, 0x6810, - 0x2072, 0x6814, 0x7006, 0x6818, 0x700a, 0x681c, 0x700e, 0x080c, -- 0xb002, 0x0040, 0x2001, 0x0006, 0x080c, 0x5291, 0x080c, 0x2e6c, -- 0x080c, 0x95dc, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, 0x0005, -+ 0xb022, 0x0040, 0x2001, 0x0006, 0x080c, 0x52aa, 0x080c, 0x2e6c, -+ 0x080c, 0x95fc, 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, 0xa0fc, 0x1148, 0x2011, 0xcc9a, 0xad98, -- 0x0006, 0x20a9, 0x0004, 0x080c, 0xa0fc, 0x1100, 0x015e, 0x00ee, -+ 0x20a9, 0x0004, 0x080c, 0xa11c, 0x1148, 0x2011, 0xcc9a, 0xad98, -+ 0x0006, 0x20a9, 0x0004, 0x080c, 0xa11c, 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, -@@ -4685,103 +4690,103 @@ unsigned short risc_code01[] = { - 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, 0xc1ab, 0x05a0, 0x671c, 0xa786, 0x0001, -+ 0xa202, 0x16f0, 0x080c, 0xc1d1, 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, 0xae88, 0x1130, 0x00ce, -- 0x080c, 0x9c02, 0x080c, 0xae4d, 0x00a0, 0x6010, 0x2068, 0x080c, -- 0xac8a, 0x0160, 0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, -- 0x6847, 0x0000, 0x080c, 0x580a, 0x080c, 0xae41, 0x080c, 0xae4d, -- 0x00ce, 0xace0, 0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0xa09e, -+ 0x1953, 0xa786, 0x0008, 0x1148, 0x080c, 0xaea8, 0x1130, 0x00ce, -+ 0x080c, 0x9c22, 0x080c, 0xae6d, 0x00a0, 0x6010, 0x2068, 0x080c, -+ 0xacaa, 0x0160, 0xa786, 0x0003, 0x11e8, 0x6837, 0x0103, 0x6b4a, -+ 0x6847, 0x0000, 0x080c, 0x5823, 0x080c, 0xae61, 0x080c, 0xae6d, -+ 0x00ce, 0xace0, 0x0018, 0x705c, 0xac02, 0x1210, 0x0804, 0xa0be, - 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x00de, -- 0x00ee, 0x0005, 0xa786, 0x0006, 0x1118, 0x080c, 0xc134, 0x0c30, -- 0xa786, 0x0009, 0x1128, 0x2009, 0x0106, 0x080c, 0x960c, 0x0c00, -+ 0x00ee, 0x0005, 0xa786, 0x0006, 0x1118, 0x080c, 0xc15a, 0x0c30, -+ 0xa786, 0x0009, 0x1128, 0x2009, 0x0106, 0x080c, 0x962c, 0x0c00, - 0xa786, 0x000a, 0x09a0, 0x0888, 0x220c, 0x2304, 0xa106, 0x1130, -- 0x8210, 0x8318, 0x1f04, 0xa0fc, 0xa006, 0x0005, 0x2304, 0xa102, -+ 0x8210, 0x8318, 0x1f04, 0xa11c, 0xa006, 0x0005, 0x2304, 0xa102, - 0x0218, 0x2001, 0x0001, 0x0010, 0x2001, 0x0000, 0xa18d, 0x0001, - 0x0005, 0x220c, 0x810f, 0x2304, 0xa106, 0x1130, 0x8210, 0x8318, -- 0x1f04, 0xa111, 0xa006, 0x0005, 0xa18d, 0x0001, 0x0005, 0x6004, -- 0xa08a, 0x0080, 0x1a0c, 0x1519, 0x080c, 0xae77, 0x0120, 0x080c, -- 0xae88, 0x0168, 0x0028, 0x080c, 0x2e6c, 0x080c, 0xae88, 0x0138, -- 0x080c, 0x7db1, 0x080c, 0x95dc, 0x080c, 0x7e94, 0x0005, 0x080c, -- 0x9c02, 0x0cb0, 0xa182, 0x0040, 0x0002, 0xa150, 0xa150, 0xa150, -- 0xa150, 0xa150, 0xa150, 0xa150, 0xa150, 0xa150, 0xa150, 0xa150, -- 0xa152, 0xa152, 0xa152, 0xa152, 0xa150, 0xa150, 0xa150, 0xa152, -+ 0x1f04, 0xa131, 0xa006, 0x0005, 0xa18d, 0x0001, 0x0005, 0x6004, -+ 0xa08a, 0x0080, 0x1a0c, 0x1519, 0x080c, 0xae97, 0x0120, 0x080c, -+ 0xaea8, 0x0168, 0x0028, 0x080c, 0x2e6c, 0x080c, 0xaea8, 0x0138, -+ 0x080c, 0x7dca, 0x080c, 0x95fc, 0x080c, 0x7ead, 0x0005, 0x080c, -+ 0x9c22, 0x0cb0, 0xa182, 0x0040, 0x0002, 0xa170, 0xa170, 0xa170, -+ 0xa170, 0xa170, 0xa170, 0xa170, 0xa170, 0xa170, 0xa170, 0xa170, -+ 0xa172, 0xa172, 0xa172, 0xa172, 0xa170, 0xa170, 0xa170, 0xa172, - 0x080c, 0x1519, 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, -- 0x7999, 0x0126, 0x2091, 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, -- 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0xa1ec, -- 0xa186, 0x0027, 0x11e8, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x00d6, -- 0x6110, 0x2168, 0x080c, 0xac8a, 0x0168, 0x6837, 0x0103, 0x684b, -- 0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x080c, 0x580a, -- 0x080c, 0xae41, 0x00de, 0x080c, 0x95dc, 0x080c, 0x7e94, 0x0005, -+ 0x79b2, 0x0126, 0x2091, 0x8000, 0x080c, 0x7ead, 0x012e, 0x0005, -+ 0xa186, 0x0013, 0x1128, 0x6004, 0xa082, 0x0040, 0x0804, 0xa20c, -+ 0xa186, 0x0027, 0x11e8, 0x080c, 0x7dca, 0x080c, 0x2e46, 0x00d6, -+ 0x6110, 0x2168, 0x080c, 0xacaa, 0x0168, 0x6837, 0x0103, 0x684b, -+ 0x0029, 0x6847, 0x0000, 0x694c, 0xc1c5, 0x694e, 0x080c, 0x5823, -+ 0x080c, 0xae61, 0x00de, 0x080c, 0x95fc, 0x080c, 0x7ead, 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, -+ 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x788c, 0x002e, 0x001e, - 0x000e, 0x012e, 0xe000, 0x6000, 0xa086, 0x0002, 0x1110, 0x0804, -- 0xa22a, 0x080c, 0x9623, 0x0005, 0x0002, 0xa1ca, 0xa1c8, 0xa1c8, -- 0xa1c8, 0xa1c8, 0xa1c8, 0xa1c8, 0xa1c8, 0xa1c8, 0xa1c8, 0xa1c8, -- 0xa1e5, 0xa1e5, 0xa1e5, 0xa1e5, 0xa1c8, 0xa1e5, 0xa1c8, 0xa1e5, -- 0x080c, 0x1519, 0x080c, 0x7db1, 0x00d6, 0x6110, 0x2168, 0x080c, -- 0xac8a, 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, -- 0x6850, 0xc0ec, 0x6852, 0x080c, 0x580a, 0x080c, 0xae41, 0x00de, -- 0x080c, 0x95dc, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, -- 0x95dc, 0x080c, 0x7e94, 0x0005, 0x0002, 0xa202, 0xa200, 0xa200, -- 0xa200, 0xa200, 0xa200, 0xa200, 0xa200, 0xa200, 0xa200, 0xa200, -- 0xa214, 0xa214, 0xa214, 0xa214, 0xa200, 0xa223, 0xa200, 0xa214, -- 0x080c, 0x1519, 0x080c, 0x7db1, 0x2001, 0xc8ff, 0x2004, 0x603e, -- 0x6003, 0x0002, 0x080c, 0x7e94, 0x6010, 0xa088, 0x0013, 0x2104, -- 0xa085, 0x0400, 0x200a, 0x0005, 0x080c, 0x7db1, 0x2001, 0xc8fd, -+ 0xa24a, 0x080c, 0x9643, 0x0005, 0x0002, 0xa1ea, 0xa1e8, 0xa1e8, -+ 0xa1e8, 0xa1e8, 0xa1e8, 0xa1e8, 0xa1e8, 0xa1e8, 0xa1e8, 0xa1e8, -+ 0xa205, 0xa205, 0xa205, 0xa205, 0xa1e8, 0xa205, 0xa1e8, 0xa205, -+ 0x080c, 0x1519, 0x080c, 0x7dca, 0x00d6, 0x6110, 0x2168, 0x080c, -+ 0xacaa, 0x0168, 0x6837, 0x0103, 0x684b, 0x0006, 0x6847, 0x0000, -+ 0x6850, 0xc0ec, 0x6852, 0x080c, 0x5823, 0x080c, 0xae61, 0x00de, -+ 0x080c, 0x95fc, 0x080c, 0x7ead, 0x0005, 0x080c, 0x7dca, 0x080c, -+ 0x95fc, 0x080c, 0x7ead, 0x0005, 0x0002, 0xa222, 0xa220, 0xa220, -+ 0xa220, 0xa220, 0xa220, 0xa220, 0xa220, 0xa220, 0xa220, 0xa220, -+ 0xa234, 0xa234, 0xa234, 0xa234, 0xa220, 0xa243, 0xa220, 0xa234, -+ 0x080c, 0x1519, 0x080c, 0x7dca, 0x2001, 0xc8ff, 0x2004, 0x603e, -+ 0x6003, 0x0002, 0x080c, 0x7ead, 0x6010, 0xa088, 0x0013, 0x2104, -+ 0xa085, 0x0400, 0x200a, 0x0005, 0x080c, 0x7dca, 0x2001, 0xc8fd, - 0x2004, 0x6016, 0x2001, 0xc8ff, 0x2004, 0x603e, 0x6003, 0x000f, -- 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, 0x95dc, 0x080c, -- 0x7e94, 0x0005, 0xa182, 0x0040, 0x0002, 0xa240, 0xa240, 0xa240, -- 0xa240, 0xa240, 0xa242, 0xa327, 0xa356, 0xa240, 0xa240, 0xa240, -- 0xa240, 0xa240, 0xa240, 0xa240, 0xa240, 0xa240, 0xa240, 0xa240, -+ 0x080c, 0x7ead, 0x0005, 0x080c, 0x7dca, 0x080c, 0x95fc, 0x080c, -+ 0x7ead, 0x0005, 0xa182, 0x0040, 0x0002, 0xa260, 0xa260, 0xa260, -+ 0xa260, 0xa260, 0xa262, 0xa347, 0xa376, 0xa260, 0xa260, 0xa260, -+ 0xa260, 0xa260, 0xa260, 0xa260, 0xa260, 0xa260, 0xa260, 0xa260, - 0x080c, 0x1519, 0x00e6, 0x00d6, 0x603f, 0x0000, 0x2071, 0xcc80, - 0x7124, 0x610a, 0x2071, 0xcc8c, 0x6110, 0x2168, 0x7614, 0xa6b4, -- 0x0fff, 0x86ff, 0x0904, 0xa2f0, 0xa68c, 0x0c00, 0x0518, 0x00f6, -- 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x01c8, 0x684c, 0xd0ac, 0x01b0, -+ 0x0fff, 0x86ff, 0x0904, 0xa310, 0xa68c, 0x0c00, 0x0518, 0x00f6, -+ 0x2c78, 0x080c, 0x56dc, 0x00fe, 0x01c8, 0x684c, 0xd0ac, 0x01b0, - 0x6020, 0xd0dc, 0x1198, 0x6850, 0xd0bc, 0x1180, 0x7318, 0x6814, -- 0xa306, 0x1904, 0xa303, 0x731c, 0x6810, 0xa31e, 0x0138, 0xd6d4, -- 0x0904, 0xa303, 0x6b14, 0xa305, 0x1904, 0xa303, 0x7318, 0x6b62, -+ 0xa306, 0x1904, 0xa323, 0x731c, 0x6810, 0xa31e, 0x0138, 0xd6d4, -+ 0x0904, 0xa323, 0x6b14, 0xa305, 0x1904, 0xa323, 0x7318, 0x6b62, - 0x731c, 0x6b5e, 0xa68c, 0x00ff, 0xa186, 0x0002, 0x0518, 0xa186, -- 0x0028, 0x1128, 0x080c, 0xae66, 0x684b, 0x001c, 0x00e8, 0xd6dc, -+ 0x0028, 0x1128, 0x080c, 0xae86, 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, 0xa251, 0x7328, 0x732c, 0x6b56, -+ 0xa005, 0x1118, 0xc6c4, 0x0804, 0xa271, 0x7328, 0x732c, 0x6b56, - 0x83ff, 0x0170, 0xa38a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, -- 0x2308, 0x2019, 0xcc98, 0xad90, 0x0019, 0x080c, 0xa93d, 0x003e, -- 0xd6cc, 0x0904, 0xa316, 0x7124, 0x695a, 0x81ff, 0x0904, 0xa316, -+ 0x2308, 0x2019, 0xcc98, 0xad90, 0x0019, 0x080c, 0xa95d, 0x003e, -+ 0xd6cc, 0x0904, 0xa336, 0x7124, 0x695a, 0x81ff, 0x0904, 0xa336, - 0xa192, 0x0021, 0x1260, 0x2071, 0xcc98, 0x831c, 0x2300, 0xae18, -- 0xad90, 0x001d, 0x080c, 0xa93d, 0x080c, 0xb167, 0x04b8, 0x6838, -+ 0xad90, 0x001d, 0x080c, 0xa95d, 0x080c, 0xb187, 0x04b8, 0x6838, - 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c68, 0x00f6, 0x2d78, -- 0x080c, 0xa8e2, 0x00fe, 0x080c, 0xb167, 0x080c, 0xa92d, 0x0440, -- 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0190, 0x684c, 0xd0ac, -+ 0x080c, 0xa902, 0x00fe, 0x080c, 0xb187, 0x080c, 0xa94d, 0x0440, -+ 0x00f6, 0x2c78, 0x080c, 0x56dc, 0x00fe, 0x0190, 0x684c, 0xd0ac, - 0x0178, 0x6020, 0xd0dc, 0x1160, 0x6850, 0xd0bc, 0x1148, 0x6810, -- 0x6914, 0xa105, 0x0128, 0x080c, 0xaf65, 0x00de, 0x00ee, 0x00f0, -+ 0x6914, 0xa105, 0x0128, 0x080c, 0xaf85, 0x00de, 0x00ee, 0x00f0, - 0x684b, 0x0000, 0x6837, 0x0103, 0x6e46, 0x684c, 0xd0ac, 0x0130, -- 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0xa4b3, 0x080c, 0x580a, -+ 0x6810, 0x6914, 0xa115, 0x0110, 0x080c, 0xa4d3, 0x080c, 0x5823, - 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x080c, -- 0xaf33, 0x00de, 0x00ee, 0x1110, 0x080c, 0x95dc, 0x0005, 0x00f6, -+ 0xaf53, 0x00de, 0x00ee, 0x1110, 0x080c, 0x95fc, 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, -+ 0x2068, 0x080c, 0x7a15, 0x080c, 0x7f87, 0x0005, 0x2001, 0xc8ff, - 0x2004, 0x603e, 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, - 0x3e20, 0x2c10, 0x080c, 0x1870, 0x0005, 0xa182, 0x0040, 0x0002, -- 0xa37b, 0xa37b, 0xa37b, 0xa37b, 0xa37b, 0xa37d, 0xa410, 0xa37b, -- 0xa37b, 0xa426, 0xa48a, 0xa37b, 0xa37b, 0xa37b, 0xa37b, 0xa499, -- 0xa37b, 0xa37b, 0xa37b, 0x080c, 0x1519, 0x0076, 0x00f6, 0x00e6, -+ 0xa39b, 0xa39b, 0xa39b, 0xa39b, 0xa39b, 0xa39d, 0xa430, 0xa39b, -+ 0xa39b, 0xa446, 0xa4aa, 0xa39b, 0xa39b, 0xa39b, 0xa39b, 0xa4b9, -+ 0xa39b, 0xa39b, 0xa39b, 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, 0xa40b, 0xa694, 0xff00, -+ 0x0110, 0x8211, 0x6a3e, 0x86ff, 0x0904, 0xa42b, 0xa694, 0xff00, - 0xa284, 0x0c00, 0x0120, 0x7018, 0x7862, 0x701c, 0x785e, 0xa284, -- 0x0300, 0x0904, 0xa40b, 0x080c, 0x1602, 0x090c, 0x1519, 0x2d00, -+ 0x0300, 0x0904, 0xa42b, 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, -@@ -4790,43 +4795,43 @@ unsigned short risc_code01[] = { - 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, 0xa93d, 0x003e, 0xd6cc, 0x01d8, -+ 0xcc98, 0xad90, 0x0019, 0x080c, 0xa95d, 0x003e, 0xd6cc, 0x01d8, - 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, -- 0xcc98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa93d, -+ 0xcc98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa95d, - 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, -- 0x2d78, 0x080c, 0xa8e2, 0x00de, 0x00ee, 0x00fe, 0x007e, 0x0005, -+ 0x2d78, 0x080c, 0xa902, 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, 0xa488, 0xd1cc, 0x0540, 0x6948, -+ 0x2c10, 0x080c, 0x2068, 0x080c, 0x8bf4, 0x0005, 0x00d6, 0x00f6, -+ 0x2c78, 0x080c, 0x56dc, 0x00fe, 0x0120, 0x2001, 0xc8ff, 0x2004, -+ 0x603e, 0x6003, 0x0002, 0x080c, 0x7e60, 0x080c, 0x7f87, 0x6110, -+ 0x2168, 0x694c, 0xd1e4, 0x0904, 0xa4a8, 0xd1cc, 0x0540, 0x6948, - 0x6838, 0xd0fc, 0x01e8, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, - 0xad90, 0x000d, 0xa198, 0x000d, 0x2009, 0x0020, 0x0156, 0x21a8, -- 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa450, 0x015e, 0x000e, -+ 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa470, 0x015e, 0x000e, - 0x6852, 0x000e, 0x684e, 0x001e, 0x2168, 0x080c, 0x1629, 0x0418, -- 0x0016, 0x080c, 0x1629, 0x00de, 0x080c, 0xa92d, 0x00e0, 0x6837, -+ 0x0016, 0x080c, 0x1629, 0x00de, 0x080c, 0xa94d, 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, 0xaf33, 0x1110, 0x080c, 0x95dc, -- 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, 0xac8a, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, -- 0x0000, 0x080c, 0x580a, 0x080c, 0xae41, 0x00de, 0x080c, 0x95dc, -- 0x080c, 0x7f6e, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138, 0x684b, -+ 0x0000, 0x080c, 0x5823, 0x080c, 0xaf53, 0x1110, 0x080c, 0x95fc, -+ 0x00de, 0x0005, 0x2019, 0x0001, 0x080c, 0x8e92, 0x6003, 0x0002, -+ 0x2001, 0xc8ff, 0x2004, 0x603e, 0x080c, 0x7e60, 0x080c, 0x7f87, -+ 0x0005, 0x080c, 0x7e60, 0x080c, 0x2e46, 0x00d6, 0x6110, 0x2168, -+ 0x080c, 0xacaa, 0x0150, 0x6837, 0x0103, 0x684b, 0x0029, 0x6847, -+ 0x0000, 0x080c, 0x5823, 0x080c, 0xae61, 0x00de, 0x080c, 0x95fc, -+ 0x080c, 0x7f87, 0x0005, 0x684b, 0x0015, 0xd1fc, 0x0138, 0x684b, - 0x0007, 0x8002, 0x8000, 0x810a, 0xa189, 0x0000, 0x6962, 0x685e, -- 0x0005, 0xa182, 0x0040, 0x0002, 0xa4d7, 0xa4d7, 0xa4d7, 0xa4d7, -- 0xa4d7, 0xa4d9, 0xa4d7, 0xa594, 0xa5a0, 0xa4d7, 0xa4d7, 0xa4d7, -- 0xa4d7, 0xa4d7, 0xa4d7, 0xa4d7, 0xa4d7, 0xa4d7, 0xa4d7, 0x080c, -+ 0x0005, 0xa182, 0x0040, 0x0002, 0xa4f7, 0xa4f7, 0xa4f7, 0xa4f7, -+ 0xa4f7, 0xa4f9, 0xa4f7, 0xa5b4, 0xa5c0, 0xa4f7, 0xa4f7, 0xa4f7, -+ 0xa4f7, 0xa4f7, 0xa4f7, 0xa4f7, 0xa4f7, 0xa4f7, 0xa4f7, 0x080c, - 0x1519, 0x0076, 0x00f6, 0x00e6, 0x00d6, 0x2071, 0xcc8c, 0x6110, -- 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c, 0x56c3, -+ 0x2178, 0x7614, 0xa6b4, 0x0fff, 0x00f6, 0x2c78, 0x080c, 0x56dc, - 0x00fe, 0x0150, 0xa684, 0x00ff, 0x1138, 0x6020, 0xd0f4, 0x0120, -- 0x080c, 0xaf65, 0x0804, 0xa58f, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, -+ 0x080c, 0xaf85, 0x0804, 0xa5af, 0x7e46, 0x7f4c, 0xc7e5, 0x7f4e, - 0x6218, 0x2268, 0x6a3c, 0x82ff, 0x0110, 0x8211, 0x6a3e, 0x86ff, -- 0x0904, 0xa585, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, -- 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0xa583, 0xa686, -+ 0x0904, 0xa5a5, 0xa694, 0xff00, 0xa284, 0x0c00, 0x0120, 0x7018, -+ 0x7862, 0x701c, 0x785e, 0xa284, 0x0300, 0x0904, 0xa5a3, 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, -@@ -4837,314 +4842,314 @@ unsigned short risc_code01[] = { - 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, 0xa93d, 0x003e, 0xd6cc, 0x01d8, -+ 0xcc98, 0xad90, 0x0019, 0x080c, 0xa95d, 0x003e, 0xd6cc, 0x01d8, - 0x7124, 0x695a, 0x81ff, 0x01b8, 0xa192, 0x0021, 0x1250, 0x2071, -- 0xcc98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa93d, -+ 0xcc98, 0x831c, 0x2300, 0xae18, 0xad90, 0x001d, 0x080c, 0xa95d, - 0x0050, 0x7838, 0xd0fc, 0x0120, 0x2009, 0x0020, 0x695a, 0x0c78, -- 0x2d78, 0x080c, 0xa8e2, 0xd6dc, 0x1110, 0xa006, 0x0030, 0x2001, -+ 0x2d78, 0x080c, 0xa902, 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, 0xa6ab, 0x603f, 0x0000, 0x00f6, -- 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0560, 0x6814, 0x6910, 0xa115, -+ 0x2168, 0x694c, 0xd1e4, 0x0904, 0xa6cb, 0x603f, 0x0000, 0x00f6, -+ 0x2c78, 0x080c, 0x56dc, 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, 0xaf65, 0x0804, -- 0xa6ab, 0x694c, 0xd1cc, 0x0904, 0xa67b, 0x6948, 0x6838, 0xd0fc, -- 0x0904, 0xa63e, 0x0016, 0x684c, 0x0006, 0x6850, 0x0006, 0x00f6, -+ 0x2068, 0x683c, 0x8000, 0x683e, 0x00de, 0x080c, 0xaf85, 0x0804, -+ 0xa6cb, 0x694c, 0xd1cc, 0x0904, 0xa69b, 0x6948, 0x6838, 0xd0fc, -+ 0x0904, 0xa65e, 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, 0xb0ef, 0x0118, -+ 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xb10f, 0x0118, - 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, - 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, -- 0xa115, 0x0110, 0x080c, 0xa4b3, 0x6848, 0x784a, 0x6860, 0x7862, -+ 0xa115, 0x0110, 0x080c, 0xa4d3, 0x6848, 0x784a, 0x6860, 0x7862, - 0x685c, 0x785e, 0xad90, 0x000d, 0xaf98, 0x000d, 0x2009, 0x0020, -- 0x0156, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa62a, -- 0x015e, 0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, 0x080c, 0xb167, -- 0x001e, 0x2168, 0x080c, 0x1629, 0x0804, 0xa6a6, 0x0016, 0x00f6, -+ 0x0156, 0x21a8, 0x2304, 0x2012, 0x8318, 0x8210, 0x1f04, 0xa64a, -+ 0x015e, 0x00fe, 0x000e, 0x6852, 0x000e, 0x684e, 0x080c, 0xb187, -+ 0x001e, 0x2168, 0x080c, 0x1629, 0x0804, 0xa6c6, 0x0016, 0x00f6, - 0x2178, 0x7944, 0xa184, 0x00ff, 0xa0b6, 0x0002, 0x01e0, 0xa086, - 0x0028, 0x1128, 0x684b, 0x001c, 0x784b, 0x001c, 0x00e8, 0xd1dc, -- 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xb0ef, 0x0118, -+ 0x0158, 0x684b, 0x0015, 0x784b, 0x0015, 0x080c, 0xb10f, 0x0118, - 0x7944, 0xc1dc, 0x7946, 0x0080, 0xd1d4, 0x0128, 0x684b, 0x0007, - 0x784b, 0x0007, 0x0048, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, -- 0xa115, 0x0110, 0x080c, 0xa4b3, 0x6860, 0x7862, 0x685c, 0x785e, -- 0x684c, 0x784e, 0x00fe, 0x080c, 0x1629, 0x00de, 0x080c, 0xb167, -- 0x080c, 0xa92d, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, -+ 0xa115, 0x0110, 0x080c, 0xa4d3, 0x6860, 0x7862, 0x685c, 0x785e, -+ 0x684c, 0x784e, 0x00fe, 0x080c, 0x1629, 0x00de, 0x080c, 0xb187, -+ 0x080c, 0xa94d, 0x0458, 0x6837, 0x0103, 0x6944, 0xa184, 0x00ff, - 0xa0b6, 0x0002, 0x01b0, 0xa086, 0x0028, 0x1118, 0x684b, 0x001c, -- 0x00d8, 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0xb0ef, 0x0118, -+ 0x00d8, 0xd1dc, 0x0148, 0x684b, 0x0015, 0x080c, 0xb10f, 0x0118, - 0x6944, 0xc1dc, 0x6946, 0x0080, 0xd1d4, 0x0118, 0x684b, 0x0007, - 0x0058, 0x684b, 0x0000, 0x684c, 0xd0ac, 0x0130, 0x6810, 0x6914, -- 0xa115, 0x0110, 0x080c, 0xa4b3, 0x080c, 0x580a, 0x080c, 0xaf33, -- 0x1110, 0x080c, 0x95dc, 0x00de, 0x0005, 0x080c, 0x7db1, 0x0010, -- 0x080c, 0x7e47, 0x080c, 0xac8a, 0x01c0, 0x00d6, 0x6110, 0x2168, -+ 0xa115, 0x0110, 0x080c, 0xa4d3, 0x080c, 0x5823, 0x080c, 0xaf53, -+ 0x1110, 0x080c, 0x95fc, 0x00de, 0x0005, 0x080c, 0x7dca, 0x0010, -+ 0x080c, 0x7e60, 0x080c, 0xacaa, 0x01c0, 0x00d6, 0x6110, 0x2168, - 0x6837, 0x0103, 0x2009, 0xc60c, 0x210c, 0xd18c, 0x11c0, 0xd184, -- 0x1198, 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c, 0xc4ca, -- 0x6847, 0x0000, 0x080c, 0x580a, 0x00de, 0x080c, 0x95dc, 0x080c, -- 0x7e94, 0x080c, 0x7f6e, 0x0005, 0x684b, 0x0004, 0x0c88, 0x684b, -- 0x0004, 0x0c70, 0xa182, 0x0040, 0x0002, 0xa6f0, 0xa6f0, 0xa6f0, -- 0xa6f0, 0xa6f0, 0xa6f2, 0xa6f0, 0xa6f5, 0xa6f0, 0xa6f0, 0xa6f0, -- 0xa6f0, 0xa6f0, 0xa6f0, 0xa6f0, 0xa6f0, 0xa6f0, 0xa6f0, 0xa6f0, -- 0x080c, 0x1519, 0x080c, 0x95dc, 0x0005, 0x0006, 0x0026, 0xa016, -+ 0x1198, 0x6108, 0x694a, 0xa18e, 0x0029, 0x1110, 0x080c, 0xc4f0, -+ 0x6847, 0x0000, 0x080c, 0x5823, 0x00de, 0x080c, 0x95fc, 0x080c, -+ 0x7ead, 0x080c, 0x7f87, 0x0005, 0x684b, 0x0004, 0x0c88, 0x684b, -+ 0x0004, 0x0c70, 0xa182, 0x0040, 0x0002, 0xa710, 0xa710, 0xa710, -+ 0xa710, 0xa710, 0xa712, 0xa710, 0xa715, 0xa710, 0xa710, 0xa710, -+ 0xa710, 0xa710, 0xa710, 0xa710, 0xa710, 0xa710, 0xa710, 0xa710, -+ 0x080c, 0x1519, 0x080c, 0x95fc, 0x0005, 0x0006, 0x0026, 0xa016, - 0x080c, 0x1870, 0x002e, 0x000e, 0x0005, 0xa182, 0x0085, 0x0002, -- 0xa709, 0xa707, 0xa707, 0xa715, 0xa707, 0xa707, 0xa707, 0x080c, -- 0x1519, 0x6003, 0x0001, 0x6106, 0x080c, 0x7999, 0x0126, 0x2091, -- 0x8000, 0x080c, 0x7e94, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, -- 0x00e6, 0x2071, 0xcc80, 0x7224, 0x6212, 0x7220, 0x080c, 0xac7a, -+ 0xa729, 0xa727, 0xa727, 0xa735, 0xa727, 0xa727, 0xa727, 0x080c, -+ 0x1519, 0x6003, 0x0001, 0x6106, 0x080c, 0x79b2, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x7ead, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, -+ 0x00e6, 0x2071, 0xcc80, 0x7224, 0x6212, 0x7220, 0x080c, 0xac9a, - 0x01a0, 0x2268, 0x6800, 0xa086, 0x0000, 0x0178, 0x6018, 0x6d18, -- 0xa52e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xa94d, 0x00ce, 0x0128, -+ 0xa52e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xa96d, 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, 0xaf65, 0x00ce, 0x00ee, 0x00de, 0x005e, -+ 0x0001, 0x080c, 0x79b2, 0x080c, 0x7ead, 0x00f6, 0x2278, 0x080c, -+ 0x56dc, 0x00fe, 0x0150, 0x6820, 0xd0ec, 0x0138, 0x00c6, 0x2260, -+ 0x603f, 0x0000, 0x080c, 0xaf85, 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, 0xae4d, 0x080c, 0x7e94, 0x0005, 0xa776, -- 0xa778, 0xa778, 0xa776, 0xa776, 0xa776, 0xa776, 0x080c, 0x1519, -- 0x080c, 0x7db1, 0x080c, 0xae4d, 0x080c, 0x7e94, 0x0005, 0xa186, -+ 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, 0x7ead, 0x0005, 0xa796, -+ 0xa798, 0xa798, 0xa796, 0xa796, 0xa796, 0xa796, 0x080c, 0x1519, -+ 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, 0x7ead, 0x0005, 0xa186, - 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x04a8, 0xa186, -- 0x0027, 0x11e8, 0x080c, 0x7db1, 0x080c, 0x2e46, 0x00d6, 0x6010, -- 0x2068, 0x080c, 0xac8a, 0x0150, 0x6837, 0x0103, 0x6847, 0x0000, -- 0x684b, 0x0029, 0x080c, 0x580a, 0x080c, 0xae41, 0x00de, 0x080c, -- 0x95dc, 0x080c, 0x7e94, 0x0005, 0x080c, 0x9623, 0x0ce0, 0xa186, -- 0x0014, 0x1dd0, 0x080c, 0x7db1, 0x00d6, 0x6010, 0x2068, 0x080c, -- 0xac8a, 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0006, -- 0x6850, 0xc0ec, 0x6852, 0x08f0, 0x0002, 0xa7c6, 0xa7c4, 0xa7c4, -- 0xa7c4, 0xa7c4, 0xa7c4, 0xa7de, 0x080c, 0x1519, 0x080c, 0x7db1, -+ 0x0027, 0x11e8, 0x080c, 0x7dca, 0x080c, 0x2e46, 0x00d6, 0x6010, -+ 0x2068, 0x080c, 0xacaa, 0x0150, 0x6837, 0x0103, 0x6847, 0x0000, -+ 0x684b, 0x0029, 0x080c, 0x5823, 0x080c, 0xae61, 0x00de, 0x080c, -+ 0x95fc, 0x080c, 0x7ead, 0x0005, 0x080c, 0x9643, 0x0ce0, 0xa186, -+ 0x0014, 0x1dd0, 0x080c, 0x7dca, 0x00d6, 0x6010, 0x2068, 0x080c, -+ 0xacaa, 0x0d60, 0x6837, 0x0103, 0x6847, 0x0000, 0x684b, 0x0006, -+ 0x6850, 0xc0ec, 0x6852, 0x08f0, 0x0002, 0xa7e6, 0xa7e4, 0xa7e4, -+ 0xa7e4, 0xa7e4, 0xa7e4, 0xa7fe, 0x080c, 0x1519, 0x080c, 0x7dca, - 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, - 0x0035, 0x1118, 0x2001, 0xc8fd, 0x0010, 0x2001, 0xc8fe, 0x2004, -- 0x6016, 0x6003, 0x000c, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, -+ 0x6016, 0x6003, 0x000c, 0x080c, 0x7ead, 0x0005, 0x080c, 0x7dca, - 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, 0x9623, 0x0005, -- 0xa807, 0xa807, 0xa807, 0xa807, 0xa809, 0xa862, 0xa807, 0x080c, -- 0x1519, 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0168, -+ 0x6016, 0x6003, 0x000e, 0x080c, 0x7ead, 0x0005, 0xa182, 0x008c, -+ 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x9643, 0x0005, -+ 0xa827, 0xa827, 0xa827, 0xa827, 0xa829, 0xa882, 0xa827, 0x080c, -+ 0x1519, 0x00d6, 0x00f6, 0x2c78, 0x080c, 0x56dc, 0x00fe, 0x0168, - 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0039, 0x0118, 0xa186, -- 0x0035, 0x1118, 0x00de, 0x0804, 0xa875, 0x080c, 0xac8a, 0x1118, -- 0x080c, 0xae41, 0x00f0, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x1110, -- 0x080c, 0xae41, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0x684b, -+ 0x0035, 0x1118, 0x00de, 0x0804, 0xa895, 0x080c, 0xacaa, 0x1118, -+ 0x080c, 0xae61, 0x00f0, 0x6010, 0x2068, 0x684c, 0xd0e4, 0x1110, -+ 0x080c, 0xae61, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0x684b, - 0x0006, 0xc0ec, 0x6852, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, -- 0x0020, 0x684b, 0x0005, 0x080c, 0xaf02, 0x6847, 0x0000, 0x080c, -- 0x580a, 0x2c68, 0x080c, 0x9586, 0x01c0, 0x6003, 0x0001, 0x6007, -+ 0x0020, 0x684b, 0x0005, 0x080c, 0xaf22, 0x6847, 0x0000, 0x080c, -+ 0x5823, 0x2c68, 0x080c, 0x95a6, 0x01c0, 0x6003, 0x0001, 0x6007, - 0x001e, 0x600b, 0xffff, 0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, -- 0xcc8f, 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, 0xb057, 0x6950, -- 0x6152, 0x601f, 0x0001, 0x080c, 0x7999, 0x2d60, 0x080c, 0x95dc, -- 0x00de, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56c3, 0x00fe, 0x0598, -+ 0xcc8f, 0x210c, 0x613a, 0x6918, 0x611a, 0x080c, 0xb077, 0x6950, -+ 0x6152, 0x601f, 0x0001, 0x080c, 0x79b2, 0x2d60, 0x080c, 0x95fc, -+ 0x00de, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56dc, 0x00fe, 0x0598, - 0x6030, 0xa08c, 0xff00, 0x810f, 0xa186, 0x0035, 0x0130, 0xa186, - 0x001e, 0x0118, 0xa186, 0x0039, 0x1530, 0x00d6, 0x2c68, 0x080c, -- 0xb13a, 0x1904, 0xa8ba, 0x080c, 0x9586, 0x01d8, 0x6106, 0x6003, -+ 0xb15a, 0x1904, 0xa8da, 0x080c, 0x95a6, 0x01d8, 0x6106, 0x6003, - 0x0001, 0x601f, 0x0001, 0x6918, 0x611a, 0x6928, 0x612a, 0x692c, - 0x612e, 0x6930, 0xa18c, 0x00ff, 0x6132, 0x6934, 0x6136, 0x6938, -- 0x613a, 0x6950, 0x6152, 0x080c, 0xb057, 0x080c, 0x7999, 0x080c, -- 0x7e94, 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, 0x080c, 0xac8a, -+ 0x613a, 0x6950, 0x6152, 0x080c, 0xb077, 0x080c, 0x79b2, 0x080c, -+ 0x7ead, 0x2d60, 0x00f8, 0x00d6, 0x6010, 0x2068, 0x080c, 0xacaa, - 0x01c8, 0x6837, 0x0103, 0x6850, 0xd0b4, 0x0128, 0xc0ec, 0x6852, - 0x684b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0x684b, 0x0002, 0x0020, -- 0x684b, 0x0005, 0x080c, 0xaf02, 0x6847, 0x0000, 0x080c, 0x580a, -- 0x080c, 0xae41, 0x00de, 0x080c, 0x95dc, 0x0005, 0x0016, 0x00d6, -- 0x6010, 0x2068, 0x080c, 0xac8a, 0x0140, 0x6837, 0x0103, 0x684b, -- 0x0028, 0x6847, 0x0000, 0x080c, 0x580a, 0x00de, 0x001e, 0xa186, -+ 0x684b, 0x0005, 0x080c, 0xaf22, 0x6847, 0x0000, 0x080c, 0x5823, -+ 0x080c, 0xae61, 0x00de, 0x080c, 0x95fc, 0x0005, 0x0016, 0x00d6, -+ 0x6010, 0x2068, 0x080c, 0xacaa, 0x0140, 0x6837, 0x0103, 0x684b, -+ 0x0028, 0x6847, 0x0000, 0x080c, 0x5823, 0x00de, 0x001e, 0xa186, - 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, -- 0x080c, 0x9623, 0x0030, 0x080c, 0x7db1, 0x080c, 0xae4d, 0x080c, -- 0x7e94, 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029, 0x0001, -+ 0x080c, 0x9643, 0x0030, 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, -+ 0x7ead, 0x0005, 0x0056, 0x0066, 0x00d6, 0x00f6, 0x2029, 0x0001, - 0xa182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x2069, - 0xcc98, 0x831c, 0x2300, 0xad18, 0x2009, 0x0020, 0xaf90, 0x001d, -- 0x080c, 0xa93d, 0xa6b2, 0x0020, 0x7804, 0xa06d, 0x0110, 0x080c, -+ 0x080c, 0xa95d, 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, -+ 0x6804, 0xa07d, 0x0130, 0x6807, 0x0000, 0x080c, 0x5823, 0x2f68, -+ 0x0cb8, 0x080c, 0x5823, 0x00fe, 0x0005, 0x0156, 0xa184, 0x0001, - 0x0108, 0x8108, 0x810c, 0x21a8, 0x2304, 0x8007, 0x2012, 0x8318, -- 0x8210, 0x1f04, 0xa944, 0x015e, 0x0005, 0x0066, 0x0126, 0x2091, -+ 0x8210, 0x1f04, 0xa964, 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, 0xa984, -- 0xa984, 0xa97f, 0xa9a6, 0xa972, 0xa97f, 0xa9a6, 0xa97f, 0xa972, -- 0x77f4, 0xa97f, 0x080c, 0x1519, 0x0036, 0x2019, 0x0010, 0x080c, -- 0xbd48, 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0xa006, -+ 0x601c, 0xa084, 0x000f, 0x001b, 0x006e, 0x012e, 0x0005, 0xa9a4, -+ 0xa9a4, 0xa99f, 0xa9c6, 0xa992, 0xa99f, 0xa9c6, 0xa99f, 0xa992, -+ 0x780d, 0xa99f, 0x080c, 0x1519, 0x0036, 0x2019, 0x0010, 0x080c, -+ 0xbd6e, 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0xa006, - 0x0005, 0xa085, 0x0001, 0x0005, 0x00d6, 0x86ff, 0x11d8, 0x6010, -- 0x2068, 0x080c, 0xac8a, 0x01c0, 0x6834, 0xa086, 0x0139, 0x1128, -+ 0x2068, 0x080c, 0xacaa, 0x01c0, 0x6834, 0xa086, 0x0139, 0x1128, - 0x684b, 0x0005, 0x6853, 0x0000, 0x0028, 0xa00e, 0x2001, 0x0005, -- 0x080c, 0x592e, 0x080c, 0xaf02, 0x080c, 0x580a, 0x080c, 0x95dc, -+ 0x080c, 0x5947, 0x080c, 0xaf22, 0x080c, 0x5823, 0x080c, 0x95fc, - 0xa085, 0x0001, 0x00de, 0x0005, 0xa006, 0x0ce0, 0x6000, 0xa08a, -- 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xa9bd, 0xa9de, 0xa9bf, -- 0xa9fd, 0xa9db, 0xa9bd, 0xa97f, 0xa984, 0xa984, 0xa97f, 0xa97f, -- 0xa97f, 0xa97f, 0xa97f, 0xa97f, 0xa97f, 0x080c, 0x1519, 0x86ff, -+ 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xa9dd, 0xa9fe, 0xa9df, -+ 0xaa1d, 0xa9fb, 0xa9dd, 0xa99f, 0xa9a4, 0xa9a4, 0xa99f, 0xa99f, -+ 0xa99f, 0xa99f, 0xa99f, 0xa99f, 0xa99f, 0x080c, 0x1519, 0x86ff, - 0x11b8, 0x601c, 0xa086, 0x0006, 0x0198, 0x00d6, 0x6010, 0x2068, -- 0x080c, 0xac8a, 0x0110, 0x080c, 0xaf02, 0x00de, 0x6007, 0x0085, -- 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x7999, 0x080c, 0x7e94, -+ 0x080c, 0xacaa, 0x0110, 0x080c, 0xaf22, 0x00de, 0x6007, 0x0085, -+ 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x79b2, 0x080c, 0x7ead, - 0xa085, 0x0001, 0x0005, 0x080c, 0x1953, 0x0c08, 0x00e6, 0x2071, -- 0xc927, 0x7024, 0xac06, 0x1110, 0x080c, 0x8dee, 0x601c, 0xa084, -+ 0xc927, 0x7024, 0xac06, 0x1110, 0x080c, 0x8e07, 0x601c, 0xa084, - 0x000f, 0xa086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, -- 0x2c40, 0x080c, 0x8fc9, 0x009e, 0x008e, 0x0010, 0x080c, 0x8ced, -- 0x00ee, 0x1928, 0x080c, 0xa97f, 0x0005, 0x0036, 0x00e6, 0x2071, -- 0xc927, 0x703c, 0xac06, 0x1140, 0x2019, 0x0000, 0x080c, 0x8e79, -- 0x00ee, 0x003e, 0x0804, 0xa9bf, 0x080c, 0x90ef, 0x00ee, 0x003e, -- 0x1904, 0xa9bf, 0x080c, 0xa97f, 0x0005, 0x00c6, 0x601c, 0xa084, -- 0x000f, 0x0013, 0x00ce, 0x0005, 0xaa2e, 0xaa9b, 0xabe9, 0xaa39, -- 0xae4d, 0xaa2e, 0xbd3a, 0x95dc, 0xaa9b, 0x77c3, 0xac54, 0x080c, -- 0x1519, 0x080c, 0xae88, 0x1110, 0x080c, 0x9c02, 0x0005, 0x080c, -- 0x7db1, 0x080c, 0x7e94, 0x080c, 0x95dc, 0x0005, 0x6017, 0x0001, -- 0x0005, 0x080c, 0xac8a, 0x0120, 0x6010, 0xa080, 0x0019, 0x2c02, -- 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xaa57, -- 0xaa59, 0xaa79, 0xaa8b, 0xaa98, 0xaa57, 0xaa2e, 0xaa2e, 0xaa2e, -- 0xaa8b, 0xaa8b, 0xaa57, 0xaa57, 0xaa57, 0xaa57, 0xaa95, 0x080c, -+ 0x2c40, 0x080c, 0x8fe2, 0x009e, 0x008e, 0x0010, 0x080c, 0x8d06, -+ 0x00ee, 0x1928, 0x080c, 0xa99f, 0x0005, 0x0036, 0x00e6, 0x2071, -+ 0xc927, 0x703c, 0xac06, 0x1140, 0x2019, 0x0000, 0x080c, 0x8e92, -+ 0x00ee, 0x003e, 0x0804, 0xa9df, 0x080c, 0x910f, 0x00ee, 0x003e, -+ 0x1904, 0xa9df, 0x080c, 0xa99f, 0x0005, 0x00c6, 0x601c, 0xa084, -+ 0x000f, 0x0013, 0x00ce, 0x0005, 0xaa4e, 0xaabb, 0xac09, 0xaa59, -+ 0xae6d, 0xaa4e, 0xbd60, 0xb19e, 0xaabb, 0x77dc, 0xac74, 0x080c, -+ 0x1519, 0x080c, 0xaea8, 0x1110, 0x080c, 0x9c22, 0x0005, 0x080c, -+ 0x7dca, 0x080c, 0x7ead, 0x080c, 0x95fc, 0x0005, 0x6017, 0x0001, -+ 0x0005, 0x080c, 0xacaa, 0x0120, 0x6010, 0xa080, 0x0019, 0x2c02, -+ 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, 0x000b, 0x0005, 0xaa77, -+ 0xaa79, 0xaa99, 0xaaab, 0xaab8, 0xaa77, 0xaa4e, 0xaa4e, 0xaa4e, -+ 0xaaab, 0xaaab, 0xaa77, 0xaa77, 0xaa77, 0xaa77, 0xaab5, 0x080c, - 0x1519, 0x00e6, 0x6010, 0x2070, 0x7050, 0xc0b5, 0x7052, 0x2071, -- 0xc927, 0x7024, 0xac06, 0x0190, 0x080c, 0x8ced, 0x6007, 0x0085, -+ 0xc927, 0x7024, 0xac06, 0x0190, 0x080c, 0x8d06, 0x6007, 0x0085, - 0x6003, 0x000b, 0x601f, 0x0002, 0x2001, 0xc8fe, 0x2004, 0x6016, -- 0x080c, 0x7999, 0x080c, 0x7e94, 0x00ee, 0x0005, 0x6017, 0x0001, -+ 0x080c, 0x79b2, 0x080c, 0x7ead, 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, 0x95dc, 0x0005, -+ 0x6007, 0x0085, 0x6003, 0x000b, 0x601f, 0x0002, 0x080c, 0x79b2, -+ 0x080c, 0x7ead, 0x0005, 0x00d6, 0x6017, 0x0001, 0x6010, 0x2068, -+ 0x6850, 0xc0b5, 0x6852, 0x00de, 0x0005, 0x080c, 0x95fc, 0x0005, - 0x080c, 0x1953, 0x08f0, 0x6000, 0xa08a, 0x0010, 0x1a0c, 0x1519, -- 0x000b, 0x0005, 0xaab2, 0xaa36, 0xaab4, 0xaab2, 0xaab4, 0xaab4, -- 0xaa2f, 0xaab2, 0xaa29, 0xaa29, 0xaab2, 0xaab2, 0xaab2, 0xaab2, -- 0xaab2, 0xaab2, 0x080c, 0x1519, 0x00d6, 0x6018, 0x2068, 0x6804, -+ 0x000b, 0x0005, 0xaad2, 0xaa56, 0xaad4, 0xaad2, 0xaad4, 0xaad4, -+ 0xaa4f, 0xaad2, 0xaa49, 0xaa49, 0xaad2, 0xaad2, 0xaad2, 0xaad2, -+ 0xaad2, 0xaad2, 0x080c, 0x1519, 0x00d6, 0x6018, 0x2068, 0x6804, - 0xa084, 0x00ff, 0x00de, 0xa08a, 0x000c, 0x1a0c, 0x1519, 0x000b, -- 0x0005, 0xaacd, 0xab8f, 0xaacf, 0xab0d, 0xaacf, 0xab0d, 0xaacf, -- 0xaadd, 0xaacd, 0xab0d, 0xaacd, 0xaaf9, 0x080c, 0x1519, 0x6004, -+ 0x0005, 0xaaed, 0xabaf, 0xaaef, 0xab2d, 0xaaef, 0xab2d, 0xaaef, -+ 0xaafd, 0xaaed, 0xab2d, 0xaaed, 0xab19, 0x080c, 0x1519, 0x6004, - 0xa08e, 0x0016, 0x05a8, 0xa08e, 0x0004, 0x0590, 0xa08e, 0x0002, -- 0x0578, 0xa08e, 0x004b, 0x0904, 0xab8b, 0x6004, 0x080c, 0xae88, -- 0x0904, 0xaba8, 0xa08e, 0x0021, 0x0904, 0xabac, 0xa08e, 0x0022, -- 0x0904, 0xaba8, 0xa08e, 0x003d, 0x0904, 0xabac, 0xa08e, 0x0039, -- 0x0904, 0xabb0, 0xa08e, 0x0035, 0x0904, 0xabb0, 0xa08e, 0x001e, -+ 0x0578, 0xa08e, 0x004b, 0x0904, 0xabab, 0x6004, 0x080c, 0xaea8, -+ 0x0904, 0xabc8, 0xa08e, 0x0021, 0x0904, 0xabcc, 0xa08e, 0x0022, -+ 0x0904, 0xabc8, 0xa08e, 0x003d, 0x0904, 0xabcc, 0xa08e, 0x0039, -+ 0x0904, 0xabd0, 0xa08e, 0x0035, 0x0904, 0xabd0, 0xa08e, 0x001e, - 0x0188, 0xa08e, 0x0001, 0x1150, 0x00d6, 0x6018, 0x2068, 0x6804, - 0xa084, 0x00ff, 0x00de, 0xa086, 0x0006, 0x0110, 0x080c, 0x2e46, -- 0x080c, 0x9c02, 0x080c, 0xae4d, 0x0005, 0x00c6, 0x00d6, 0x6104, -- 0xa186, 0x0016, 0x0904, 0xab7c, 0xa186, 0x0002, 0x15d8, 0x2001, -- 0xc635, 0x2004, 0xd08c, 0x1198, 0x080c, 0x5f22, 0x1180, 0x2001, -+ 0x080c, 0x9c22, 0x080c, 0xae6d, 0x0005, 0x00c6, 0x00d6, 0x6104, -+ 0xa186, 0x0016, 0x0904, 0xab9c, 0xa186, 0x0002, 0x15d8, 0x2001, -+ 0xc635, 0x2004, 0xd08c, 0x1198, 0x080c, 0x5f3b, 0x1180, 0x2001, - 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, 0x2003, 0x0001, 0xa085, -- 0x0001, 0x080c, 0x5f66, 0x080c, 0x5e5a, 0x0804, 0xabd2, 0x6018, -- 0x2068, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1904, 0xabd2, 0x68a0, -- 0xd0bc, 0x1904, 0xabd2, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0190, -+ 0x0001, 0x080c, 0x5f7f, 0x080c, 0x5e73, 0x0804, 0xabf2, 0x6018, -+ 0x2068, 0x2001, 0xc635, 0x2004, 0xd0ac, 0x1904, 0xabf2, 0x68a0, -+ 0xd0bc, 0x1904, 0xabf2, 0x6840, 0xa084, 0x00ff, 0xa005, 0x0190, - 0x8001, 0x6842, 0x6013, 0x0000, 0x601f, 0x0007, 0x6017, 0x0398, -- 0x603f, 0x0000, 0x080c, 0x9586, 0x0128, 0x2d00, 0x601a, 0x601f, -+ 0x603f, 0x0000, 0x080c, 0x95a6, 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, 0x9c02, 0x0020, 0x080c, 0x9c02, 0x080c, -+ 0x4f1b, 0x00ee, 0x080c, 0x9c22, 0x0020, 0x080c, 0x9c22, 0x080c, - 0x2e46, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x2e6c, 0x012e, -- 0x00ee, 0x080c, 0xae4d, 0x0005, 0x2001, 0x0002, 0x080c, 0x5291, -- 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79df, 0x080c, 0x7e94, -- 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2e6c, 0x0804, 0xab08, 0x00c6, -+ 0x00ee, 0x080c, 0xae6d, 0x0005, 0x2001, 0x0002, 0x080c, 0x52aa, -+ 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79f8, 0x080c, 0x7ead, -+ 0x00de, 0x00ce, 0x0c80, 0x080c, 0x2e6c, 0x0804, 0xab28, 0x00c6, - 0x00d6, 0x6104, 0xa186, 0x0016, 0x0d38, 0x6018, 0x2068, 0x6840, -- 0xa084, 0x00ff, 0xa005, 0x0904, 0xab52, 0x8001, 0x6842, 0x6003, -- 0x0001, 0x080c, 0x79df, 0x080c, 0x7e94, 0x00de, 0x00ce, 0x0898, -- 0x080c, 0x9c02, 0x0804, 0xab0a, 0x080c, 0x9c30, 0x0804, 0xab0a, -- 0x00d6, 0x2c68, 0x6104, 0x080c, 0xb13a, 0x00de, 0x0118, 0x080c, -- 0x95dc, 0x00b8, 0x6004, 0x8007, 0x6130, 0xa18c, 0x00ff, 0xa105, -+ 0xa084, 0x00ff, 0xa005, 0x0904, 0xab72, 0x8001, 0x6842, 0x6003, -+ 0x0001, 0x080c, 0x79f8, 0x080c, 0x7ead, 0x00de, 0x00ce, 0x0898, -+ 0x080c, 0x9c22, 0x0804, 0xab2a, 0x080c, 0x9c50, 0x0804, 0xab2a, -+ 0x00d6, 0x2c68, 0x6104, 0x080c, 0xb15a, 0x00de, 0x0118, 0x080c, -+ 0x95fc, 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, 0x9c02, 0x080c, 0x2e46, -+ 0x600a, 0x2001, 0xc8fe, 0x2004, 0x6016, 0x080c, 0x79b2, 0x080c, -+ 0x7ead, 0x0005, 0x00de, 0x00ce, 0x080c, 0x9c22, 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, -- 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, 0xac00, -- 0xac00, 0xaa2e, 0xac00, 0xaa36, 0xac02, 0xaa36, 0xac0f, 0xac00, -+ 0xac20, 0xac20, 0xac20, 0xac20, 0xac20, 0xac20, 0xac20, 0xac20, -+ 0xac20, 0xaa4e, 0xac20, 0xaa56, 0xac22, 0xaa56, 0xac2f, 0xac20, - 0x080c, 0x1519, 0x6004, 0xa086, 0x008b, 0x0148, 0x6007, 0x008b, -- 0x6003, 0x000d, 0x080c, 0x7999, 0x080c, 0x7e94, 0x0005, 0x080c, -- 0xae41, 0x080c, 0xac8a, 0x0580, 0x080c, 0x2e46, 0x00d6, 0x080c, -- 0xac8a, 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006, -- 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x580a, 0x2c68, -- 0x080c, 0x9586, 0x0150, 0x6818, 0x601a, 0x080c, 0xb057, 0x00c6, -- 0x2d60, 0x080c, 0xae4d, 0x00ce, 0x0008, 0x2d60, 0x00de, 0x6013, -+ 0x6003, 0x000d, 0x080c, 0x79b2, 0x080c, 0x7ead, 0x0005, 0x080c, -+ 0xae61, 0x080c, 0xacaa, 0x0580, 0x080c, 0x2e46, 0x00d6, 0x080c, -+ 0xacaa, 0x0168, 0x6010, 0x2068, 0x6837, 0x0103, 0x684b, 0x0006, -+ 0x6847, 0x0000, 0x6850, 0xc0ed, 0x6852, 0x080c, 0x5823, 0x2c68, -+ 0x080c, 0x95a6, 0x0150, 0x6818, 0x601a, 0x080c, 0xb077, 0x00c6, -+ 0x2d60, 0x080c, 0xae6d, 0x00ce, 0x0008, 0x2d60, 0x00de, 0x6013, - 0x0000, 0x601f, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, -- 0x79df, 0x080c, 0x7e94, 0x0078, 0x6030, 0xa08c, 0xff00, 0x810f, -+ 0x79f8, 0x080c, 0x7ead, 0x0078, 0x6030, 0xa08c, 0xff00, 0x810f, - 0xa186, 0x0039, 0x0118, 0xa186, 0x0035, 0x1118, 0x080c, 0x2e46, -- 0x08b0, 0x080c, 0xae4d, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, -- 0x1519, 0x000b, 0x0005, 0xac6b, 0xac6b, 0xac6b, 0xac6d, 0xac6d, -- 0xac6b, 0xac6b, 0xac6b, 0xac6b, 0xac6b, 0xac6b, 0xac6b, 0xac6b, -- 0xac6b, 0xac6b, 0xac6b, 0x080c, 0x1519, 0x080c, 0x90ef, 0x190c, -- 0x1519, 0x6110, 0x2168, 0x684b, 0x0006, 0x080c, 0x580a, 0x080c, -- 0x95dc, 0x0005, 0xa284, 0x0007, 0x1158, 0xa282, 0xce00, 0x0240, -+ 0x08b0, 0x080c, 0xae6d, 0x0005, 0x6000, 0xa08a, 0x0010, 0x1a0c, -+ 0x1519, 0x000b, 0x0005, 0xac8b, 0xac8b, 0xac8b, 0xac8d, 0xac8d, -+ 0xac8b, 0xac8b, 0xac8b, 0xac8b, 0xac8b, 0xac8b, 0xac8b, 0xac8b, -+ 0xac8b, 0xac8b, 0xac8b, 0x080c, 0x1519, 0x080c, 0x910f, 0x190c, -+ 0x1519, 0x6110, 0x2168, 0x684b, 0x0006, 0x080c, 0x5823, 0x080c, -+ 0x95fc, 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, 0xafe2, 0x0148, 0x080c, 0xae88, 0x1110, -- 0x080c, 0x9c02, 0x00c6, 0x080c, 0x95dc, 0x00ce, 0xace0, 0x0018, -+ 0xa206, 0x1160, 0x080c, 0xb002, 0x0148, 0x080c, 0xaea8, 0x1110, -+ 0x080c, 0x9c22, 0x00c6, 0x080c, 0x95fc, 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, 0x9586, 0x005e, -- 0x0180, 0x6612, 0x651a, 0x080c, 0xb057, 0x601f, 0x0003, 0x2009, -- 0x004b, 0x080c, 0x960c, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, -+ 0x0056, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x95a6, 0x005e, -+ 0x0180, 0x6612, 0x651a, 0x080c, 0xb077, 0x601f, 0x0003, 0x2009, -+ 0x004b, 0x080c, 0x962c, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, - 0x0005, 0xa006, 0x0cd0, 0x00c6, 0x0056, 0x0126, 0x2091, 0x8000, -- 0x62a0, 0x00c6, 0x080c, 0xaf06, 0x005e, 0x0550, 0x6013, 0x0000, -- 0x651a, 0x080c, 0xb057, 0x601f, 0x0003, 0x0016, 0x00c6, 0x2560, -- 0x080c, 0x553e, 0x00ce, 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, -- 0x080c, 0x7a0e, 0x2c08, 0x080c, 0xbeea, 0x007e, 0x001e, 0xd184, -- 0x0128, 0x080c, 0x95dc, 0xa085, 0x0001, 0x0030, 0x2009, 0x004c, -- 0x080c, 0x960c, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, -- 0xa006, 0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x9586, -+ 0x62a0, 0x00c6, 0x080c, 0xaf26, 0x005e, 0x0550, 0x6013, 0x0000, -+ 0x651a, 0x080c, 0xb077, 0x601f, 0x0003, 0x0016, 0x00c6, 0x2560, -+ 0x080c, 0x5557, 0x00ce, 0x080c, 0x7b2f, 0x0076, 0x2039, 0x0000, -+ 0x080c, 0x7a27, 0x2c08, 0x080c, 0xbf10, 0x007e, 0x001e, 0xd184, -+ 0x0128, 0x080c, 0x95fc, 0xa085, 0x0001, 0x0030, 0x2009, 0x004c, -+ 0x080c, 0x962c, 0xa085, 0x0001, 0x012e, 0x005e, 0x00ce, 0x0005, -+ 0xa006, 0x0cd0, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, 0x95a6, - 0x2c78, 0x00ce, 0x0180, 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, -- 0x2021, 0x0005, 0x080c, 0xad80, 0x2f60, 0x2009, 0x004d, 0x080c, -- 0x960c, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, -- 0x00c6, 0x0046, 0x00c6, 0x080c, 0x9586, 0x2c78, 0x00ce, 0x0178, -+ 0x2021, 0x0005, 0x080c, 0xada0, 0x2f60, 0x2009, 0x004d, 0x080c, -+ 0x962c, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, -+ 0x00c6, 0x0046, 0x00c6, 0x080c, 0x95a6, 0x2c78, 0x00ce, 0x0178, - 0x7e12, 0x2c00, 0x781a, 0x781f, 0x0003, 0x2021, 0x0005, 0x0481, -- 0x2f60, 0x2009, 0x004e, 0x080c, 0x960c, 0xa085, 0x0001, 0x004e, -+ 0x2f60, 0x2009, 0x004e, 0x080c, 0x962c, 0xa085, 0x0001, 0x004e, - 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x00c6, 0x080c, -- 0x9586, 0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, 0x781a, 0x781f, -+ 0x95a6, 0x2c78, 0x00ce, 0x01c0, 0x7e12, 0x2c00, 0x781a, 0x781f, - 0x0003, 0x2021, 0x0004, 0x00a1, 0x2001, 0xc8e7, 0x2004, 0xd0fc, -- 0x0120, 0x2f60, 0x080c, 0x95dc, 0x0028, 0x2f60, 0x2009, 0x0052, -- 0x080c, 0x960c, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, -- 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x54e0, 0x0118, -- 0x2001, 0xad85, 0x0028, 0x080c, 0x54b0, 0x0158, 0x2001, 0xad8b, -- 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, 0xbeea, 0x613c, 0x81ff, 0x090c, 0x7be4, -- 0x080c, 0x7e94, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, -- 0x2091, 0x8000, 0x00c6, 0x080c, 0x9586, 0x001e, 0x0188, 0x660a, -- 0x611a, 0x080c, 0xb057, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -- 0x001f, 0x080c, 0x960c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0x0120, 0x2f60, 0x080c, 0x95fc, 0x0028, 0x2f60, 0x2009, 0x0052, -+ 0x080c, 0x962c, 0xa085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, -+ 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, 0x54f9, 0x0118, -+ 0x2001, 0xada5, 0x0028, 0x080c, 0x54c9, 0x0158, 0x2001, 0xadab, -+ 0x0006, 0xa00e, 0x2400, 0x080c, 0x5947, 0x080c, 0x5823, 0x000e, -+ 0x0807, 0x2418, 0x080c, 0x7d69, 0x62a0, 0x0086, 0x2041, 0x0001, -+ 0x2039, 0x0001, 0x2608, 0x080c, 0x7b48, 0x008e, 0x080c, 0x7a27, -+ 0x2f08, 0x2648, 0x080c, 0xbf10, 0x613c, 0x81ff, 0x090c, 0x7bfd, -+ 0x080c, 0x7ead, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x00c6, 0x080c, 0x95a6, 0x001e, 0x0188, 0x660a, -+ 0x611a, 0x080c, 0xb077, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -+ 0x001f, 0x080c, 0x962c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, - 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, -- 0x9586, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xb057, 0x601f, -- 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x960c, 0xa085, -+ 0x95a6, 0x001e, 0x0188, 0x660a, 0x611a, 0x080c, 0xb077, 0x601f, -+ 0x0008, 0x2d00, 0x6012, 0x2009, 0x0021, 0x080c, 0x962c, 0xa085, - 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, -- 0x2091, 0x8000, 0x00c6, 0x080c, 0x9586, 0x001e, 0x0188, 0x660a, -- 0x611a, 0x080c, 0xb057, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -- 0x003d, 0x080c, 0x960c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0x2091, 0x8000, 0x00c6, 0x080c, 0x95a6, 0x001e, 0x0188, 0x660a, -+ 0x611a, 0x080c, 0xb077, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -+ 0x003d, 0x080c, 0x962c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, - 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, -- 0xaf06, 0x001e, 0x0180, 0x611a, 0x080c, 0xb057, 0x601f, 0x0001, -- 0x2d00, 0x6012, 0x2009, 0x0000, 0x080c, 0x960c, 0xa085, 0x0001, -+ 0xaf26, 0x001e, 0x0180, 0x611a, 0x080c, 0xb077, 0x601f, 0x0001, -+ 0x2d00, 0x6012, 0x2009, 0x0000, 0x080c, 0x962c, 0xa085, 0x0001, - 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, 0x00c6, 0x0126, 0x2091, -- 0x8000, 0x00c6, 0x080c, 0x9586, 0x001e, 0x0188, 0x660a, 0x611a, -- 0x080c, 0xb057, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0044, -- 0x080c, 0x960c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, -+ 0x8000, 0x00c6, 0x080c, 0x95a6, 0x001e, 0x0188, 0x660a, 0x611a, -+ 0x080c, 0xb077, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, 0x0044, -+ 0x080c, 0x962c, 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, 0xc3d5, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066, 0x00c6, -+ 0x080c, 0xc3fb, 0x603f, 0x0000, 0x000e, 0x0005, 0x0066, 0x00c6, - 0x00d6, 0x2031, 0xc653, 0x2634, 0xd6e4, 0x0128, 0x6618, 0x2660, -- 0x6e48, 0x080c, 0x5469, 0x00de, 0x00ce, 0x006e, 0x0005, 0x0006, -+ 0x6e48, 0x080c, 0x5482, 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, 0x9586, 0x001e, 0x0190, 0x611a, 0x080c, 0xb057, 0x601f, -+ 0x080c, 0x95a6, 0x001e, 0x0190, 0x611a, 0x080c, 0xb077, 0x601f, - 0x0001, 0x2d00, 0x6012, 0x080c, 0x2e46, 0x2009, 0x0028, 0x080c, -- 0x960c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, -+ 0x962c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, 0xa006, 0x0cd8, - 0xa186, 0x0015, 0x1178, 0x2011, 0xc621, 0x2204, 0xa086, 0x0074, -- 0x1148, 0x080c, 0x9fb2, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, -- 0x79df, 0x0020, 0x080c, 0x9c02, 0x080c, 0x95dc, 0x0005, 0xa186, -- 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x5291, 0x00e8, 0xa186, -+ 0x1148, 0x080c, 0x9fd2, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, -+ 0x79f8, 0x0020, 0x080c, 0x9c22, 0x080c, 0x95fc, 0x0005, 0xa186, -+ 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x52aa, 0x00e8, 0xa186, - 0x0015, 0x11e8, 0x2011, 0xc621, 0x2204, 0xa086, 0x0014, 0x11b8, -- 0x00d6, 0x6018, 0x2068, 0x080c, 0x53df, 0x00de, 0x080c, 0xa06b, -+ 0x00d6, 0x6018, 0x2068, 0x080c, 0x53f8, 0x00de, 0x080c, 0xa08b, - 0x1170, 0x00d6, 0x6018, 0x2068, 0x6890, 0x00de, 0xa005, 0x0138, -- 0x2001, 0x0006, 0x080c, 0x5291, 0x080c, 0x9760, 0x0020, 0x080c, -- 0x9c02, 0x080c, 0x95dc, 0x0005, 0x6848, 0xa086, 0x0005, 0x1108, -+ 0x2001, 0x0006, 0x080c, 0x52aa, 0x080c, 0x9780, 0x0020, 0x080c, -+ 0x9c22, 0x080c, 0x95fc, 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, -@@ -5153,24 +5158,24 @@ unsigned short risc_code01[] = { - 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, 0xaa2e, 0xaf5d, 0xaf60, 0xaf63, 0xc1c2, 0xc1dd, -- 0xc1e0, 0xaa2e, 0xaa2e, 0x080c, 0x1519, 0xe000, 0xe000, 0x0005, -+ 0x79b2, 0x080c, 0x7ead, 0x00ee, 0x0005, 0x00c6, 0x00f6, 0x2c78, -+ 0x080c, 0x56dc, 0x00fe, 0x0120, 0x601c, 0xa084, 0x000f, 0x0013, -+ 0x00ce, 0x0005, 0xaa4e, 0xaf7d, 0xaf80, 0xaf83, 0xc1e8, 0xc203, -+ 0xc206, 0xaa4e, 0xaa4e, 0x080c, 0x1519, 0xe000, 0xe000, 0x0005, - 0xe000, 0xe000, 0x0005, 0x0009, 0x0005, 0x00f6, 0x2c78, 0x080c, -- 0x56c3, 0x0538, 0x080c, 0x9586, 0x1128, 0x2001, 0xc8ff, 0x2004, -- 0x783e, 0x00f8, 0x7818, 0x601a, 0x080c, 0xb057, 0x781c, 0xa086, -+ 0x56dc, 0x0538, 0x080c, 0x95a6, 0x1128, 0x2001, 0xc8ff, 0x2004, -+ 0x783e, 0x00f8, 0x7818, 0x601a, 0x080c, 0xb077, 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, -+ 0x6003, 0x0001, 0x7950, 0x6152, 0x080c, 0x79b2, 0x080c, 0x7ead, - 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, -+ 0x0039, 0x6003, 0x0001, 0x080c, 0x79b2, 0x6803, 0x0002, 0x00fe, -+ 0x001e, 0x0005, 0x00f6, 0x2c78, 0x080c, 0x56dc, 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, -@@ -5178,705 +5183,705 @@ unsigned short risc_code01[] = { - 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, -+ 0xc8f9, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, 0x080c, 0x7858, - 0x2001, 0xc8fd, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, - 0xc8fb, 0x200c, 0x8000, 0x2014, 0x2071, 0xc8d5, 0x711a, 0x721e, -- 0x2001, 0x0064, 0x080c, 0x783f, 0x2001, 0xc8fe, 0x82ff, 0x1110, -+ 0x2001, 0x0064, 0x080c, 0x7858, 0x2001, 0xc8fe, 0x82ff, 0x1110, - 0x2011, 0x0014, 0x2202, 0x2009, 0xc8ff, 0xa280, 0x000a, 0x200a, -- 0x080c, 0x572c, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, -+ 0x080c, 0x5745, 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, 0x9586, 0x001e, -+ 0x00c6, 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x95a6, 0x001e, - 0x0178, 0x611a, 0x0ca1, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -- 0x0033, 0x080c, 0x960c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0x0033, 0x080c, 0x962c, 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, -+ 0x6a3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x80c8, 0x01d8, 0x7070, - 0x6a50, 0xa206, 0x1160, 0x7074, 0x6a54, 0xa206, 0x1140, 0x6218, - 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2e8b, 0x080c, -- 0x9760, 0x0020, 0x080c, 0x9c02, 0x080c, 0x95dc, 0x00fe, 0x00ee, -+ 0x9780, 0x0020, 0x080c, 0x9c22, 0x080c, 0x95fc, 0x00fe, 0x00ee, - 0x00de, 0x0005, 0x7054, 0x6a54, 0xa206, 0x0d48, 0x0c80, 0x00c6, -- 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x9586, 0x001e, 0x0180, -- 0x611a, 0x080c, 0xb057, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -- 0x0043, 0x080c, 0x960c, 0xa085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0x0126, 0x2091, 0x8000, 0x00c6, 0x080c, 0x95a6, 0x001e, 0x0180, -+ 0x611a, 0x080c, 0xb077, 0x601f, 0x0001, 0x2d00, 0x6012, 0x2009, -+ 0x0043, 0x080c, 0x962c, 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, -+ 0x000f, 0x2c78, 0x080c, 0x80c8, 0x01a8, 0x7070, 0x6a08, 0xa206, - 0x1130, 0x7074, 0x6a0c, 0xa206, 0x1110, 0x080c, 0x2e46, 0x080c, -- 0x9760, 0x0020, 0x080c, 0x9c02, 0x080c, 0x95dc, 0x00fe, 0x00ee, -+ 0x9780, 0x0020, 0x080c, 0x9c22, 0x080c, 0x95fc, 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, -+ 0x55f7, 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, -+ 0x00ff, 0x686e, 0x00ce, 0x080c, 0x5823, 0x6013, 0x0000, 0x003e, - 0x00de, 0x0005, 0x00c6, 0x0026, 0x0016, 0xa186, 0x0035, 0x0110, -- 0x6a34, 0x0008, 0x6a28, 0x080c, 0xac7a, 0x01f0, 0x2260, 0x611c, -+ 0x6a34, 0x0008, 0x6a28, 0x080c, 0xac9a, 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, 0xa4b3, 0x0005, 0x0066, 0x6000, -- 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0xb197, -- 0xb6ae, 0xb7d6, 0xb197, 0xb197, 0xb197, 0xb197, 0xb197, 0xb1cf, -- 0xb85a, 0xb197, 0xb197, 0xb197, 0xb197, 0xb197, 0xb197, 0x080c, -- 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, -- 0x006e, 0x0005, 0xb1b2, 0xbcdf, 0xb1b2, 0xb1b2, 0xb1b2, 0xb1b2, -- 0xb1b2, 0xb1b2, 0xbca3, 0xbd27, 0xb1b2, 0xc307, 0xc337, 0xc307, -- 0xc337, 0xb1b2, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, 0x0010, -- 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0xb1cd, 0xb9aa, 0xba77, -- 0xbaa4, 0xbb28, 0xb1cd, 0xbc15, 0xbbc0, 0xb866, 0xbc79, 0xbc8e, -- 0xb1cd, 0xb1cd, 0xb1cd, 0xb1cd, 0xb1cd, 0x080c, 0x1519, 0xa1b2, -- 0x0080, 0x1a0c, 0x1519, 0x2100, 0xa1b2, 0x0040, 0x1a04, 0xb5e6, -- 0x0002, 0xb219, 0xb3e4, 0xb219, 0xb219, 0xb219, 0xb3eb, 0xb219, -- 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, -- 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, -- 0xb21b, 0xb279, 0xb288, 0xb2d6, 0xb2f4, 0xb372, 0xb3d1, 0xb219, -- 0xb219, 0xb3ee, 0xb219, 0xb219, 0xb401, 0xb40c, 0xb219, 0xb219, -- 0xb219, 0xb219, 0xb219, 0xb497, 0xb219, 0xb219, 0xb4aa, 0xb219, -- 0xb219, 0xb462, 0xb219, 0xb219, 0xb219, 0xb4c2, 0xb219, 0xb219, -- 0xb219, 0xb53c, 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, 0xb219, -- 0xb5ad, 0x080c, 0x1519, 0x080c, 0x570b, 0x1150, 0x2001, 0xc635, -- 0x2004, 0xd0cc, 0x1128, 0xa084, 0x0009, 0xa086, 0x0008, 0x1140, -- 0x6007, 0x0009, 0x602b, 0x0009, 0x6013, 0x0000, 0x0804, 0xb3df, -- 0x080c, 0x568d, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6218, -- 0x2270, 0x72a0, 0x0026, 0x2019, 0x0029, 0x080c, 0x7b16, 0x0076, -- 0x2039, 0x0000, 0x080c, 0x7a0e, 0x2c08, 0x080c, 0xbeea, 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, -- 0xbe2e, 0x1904, 0xb2d0, 0x080c, 0xbdce, 0x1120, 0x6007, 0x0008, -- 0x0804, 0xb3df, 0x6007, 0x0009, 0x0804, 0xb3df, 0x080c, 0xc016, -- 0x0128, 0x080c, 0xbe2e, 0x0d78, 0x0804, 0xb2d0, 0x6013, 0x1900, -- 0x0c88, 0x080c, 0x2f69, 0x1904, 0xb5e3, 0x6106, 0x080c, 0xbd88, -- 0x6007, 0x0006, 0x0804, 0xb3df, 0x6007, 0x0007, 0x0804, 0xb3df, -- 0x080c, 0xc36b, 0x1904, 0xb5e3, 0x080c, 0x2f69, 0x1904, 0xb5e3, -- 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, 0xbe8c, 0x11a0, 0xa686, -- 0x0006, 0x1150, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, -- 0x0000, 0x080c, 0x2e8b, 0x002e, 0x080c, 0x53df, 0x6007, 0x000a, -- 0x00de, 0x0804, 0xb3df, 0x6007, 0x000b, 0x00de, 0x0804, 0xb3df, -- 0x080c, 0x2e46, 0x6007, 0x0001, 0x0804, 0xb3df, 0x080c, 0xc36b, -- 0x1904, 0xb5e3, 0x080c, 0x2f69, 0x1904, 0xb5e3, 0x6618, 0x00d6, -- 0x2668, 0x6e04, 0x00de, 0xa686, 0x0707, 0x0d50, 0x0026, 0x6218, -+ 0x6810, 0x6914, 0xa115, 0x190c, 0xa4d3, 0x0005, 0x080c, 0x95fc, -+ 0x0804, 0x7ead, 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, -+ 0x0013, 0x006e, 0x0005, 0xb1bb, 0xb6d2, 0xb7fa, 0xb1bb, 0xb1bb, -+ 0xb1bb, 0xb1bb, 0xb1bb, 0xb1f3, 0xb87e, 0xb1bb, 0xb1bb, 0xb1bb, -+ 0xb1bb, 0xb1bb, 0xb1bb, 0x080c, 0x1519, 0x0066, 0x6000, 0xa0b2, -+ 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, 0x0005, 0xb1d6, 0xbd05, -+ 0xb1d6, 0xb1d6, 0xb1d6, 0xb1d6, 0xb1d6, 0xb1d6, 0xbcc7, 0xbd4d, -+ 0xb1d6, 0xc32d, 0xc35d, 0xc32d, 0xc35d, 0xb1d6, 0x080c, 0x1519, -+ 0x0066, 0x6000, 0xa0b2, 0x0010, 0x1a0c, 0x1519, 0x0013, 0x006e, -+ 0x0005, 0xb1f1, 0xb9ce, 0xba9b, 0xbac8, 0xbb4c, 0xb1f1, 0xbc39, -+ 0xbbe4, 0xb88a, 0xbc9d, 0xbcb2, 0xb1f1, 0xb1f1, 0xb1f1, 0xb1f1, -+ 0xb1f1, 0x080c, 0x1519, 0xa1b2, 0x0080, 0x1a0c, 0x1519, 0x2100, -+ 0xa1b2, 0x0040, 0x1a04, 0xb60a, 0x0002, 0xb23d, 0xb408, 0xb23d, -+ 0xb23d, 0xb23d, 0xb40f, 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb23d, -+ 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb23d, -+ 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb23f, 0xb29d, 0xb2ac, 0xb2fa, -+ 0xb318, 0xb396, 0xb3f5, 0xb23d, 0xb23d, 0xb412, 0xb23d, 0xb23d, -+ 0xb425, 0xb430, 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb4bb, -+ 0xb23d, 0xb23d, 0xb4ce, 0xb23d, 0xb23d, 0xb486, 0xb23d, 0xb23d, -+ 0xb23d, 0xb4e6, 0xb23d, 0xb23d, 0xb23d, 0xb560, 0xb23d, 0xb23d, -+ 0xb23d, 0xb23d, 0xb23d, 0xb23d, 0xb5d1, 0x080c, 0x1519, 0x080c, -+ 0x5724, 0x1150, 0x2001, 0xc635, 0x2004, 0xd0cc, 0x1128, 0xa084, -+ 0x0009, 0xa086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602b, 0x0009, -+ 0x6013, 0x0000, 0x0804, 0xb403, 0x080c, 0x56a6, 0x00e6, 0x00c6, -+ 0x0036, 0x0026, 0x0016, 0x6218, 0x2270, 0x72a0, 0x0026, 0x2019, -+ 0x0029, 0x080c, 0x7b2f, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a27, -+ 0x2c08, 0x080c, 0xbf10, 0x007e, 0x001e, 0x2e60, 0x080c, 0x5557, -+ 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6618, 0x00c6, 0x2660, -+ 0x080c, 0x5365, 0x00ce, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, -+ 0xa082, 0x0006, 0x0278, 0x080c, 0xbe54, 0x1904, 0xb2f4, 0x080c, -+ 0xbdf4, 0x1120, 0x6007, 0x0008, 0x0804, 0xb403, 0x6007, 0x0009, -+ 0x0804, 0xb403, 0x080c, 0xc03c, 0x0128, 0x080c, 0xbe54, 0x0d78, -+ 0x0804, 0xb2f4, 0x6013, 0x1900, 0x0c88, 0x080c, 0x2f69, 0x1904, -+ 0xb607, 0x6106, 0x080c, 0xbdae, 0x6007, 0x0006, 0x0804, 0xb403, -+ 0x6007, 0x0007, 0x0804, 0xb403, 0x080c, 0xc391, 0x1904, 0xb607, -+ 0x080c, 0x2f69, 0x1904, 0xb607, 0x00d6, 0x6618, 0x2668, 0x6e04, -+ 0xa684, 0x00ff, 0xa082, 0x0006, 0x1220, 0x2001, 0x0001, 0x080c, -+ 0x5298, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0188, 0xa686, -+ 0x0004, 0x0170, 0x6e04, 0xa6b4, 0x00ff, 0xa686, 0x0006, 0x0140, -+ 0xa686, 0x0004, 0x0128, 0xa686, 0x0005, 0x0110, 0x00de, 0x00e0, -+ 0x080c, 0xbeb2, 0x11a0, 0xa686, 0x0006, 0x1150, 0x0026, 0x6218, - 0xa290, 0x0028, 0x2214, 0x2009, 0x0000, 0x080c, 0x2e8b, 0x002e, -- 0x6007, 0x000c, 0x0804, 0xb3df, 0x080c, 0x570b, 0x1140, 0x2001, -- 0xc635, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, 0x0804, -- 0xb228, 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, 0xb2d0, 0x080c, 0xbe99, -- 0x1120, 0x6007, 0x000e, 0x0804, 0xb3df, 0x0046, 0x6418, 0xa4a0, -- 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046, 0x080c, 0x2e46, -- 0x004e, 0x0016, 0xa006, 0x2009, 0xc653, 0x210c, 0xd1a4, 0x0158, -- 0x2009, 0x0029, 0x080c, 0xc183, 0x6018, 0x00d6, 0x2068, 0x6800, -- 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, -- 0xb3df, 0x2001, 0x0001, 0x080c, 0x527f, 0x0156, 0x0016, 0x0026, -- 0x0036, 0x20a9, 0x0004, 0x2019, 0xc605, 0x2011, 0xcc90, 0x080c, -- 0xa0fc, 0x003e, 0x002e, 0x001e, 0x015e, 0xa005, 0x0168, 0xa6b4, -- 0xff00, 0x8637, 0xa682, 0x0004, 0x0a04, 0xb2d0, 0xa682, 0x0007, -- 0x0a04, 0xb31e, 0x0804, 0xb2d0, 0x6013, 0x1900, 0x6007, 0x0009, -- 0x0804, 0xb3df, 0x080c, 0x570b, 0x1140, 0x2001, 0xc635, 0x2004, -- 0xa084, 0x0009, 0xa086, 0x0008, 0x1110, 0x0804, 0xb228, 0x080c, -- 0x568d, 0x6618, 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, -- 0x0006, 0x06b8, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004, 0x0120, -- 0xa686, 0x0006, 0x1904, 0xb2d0, 0x080c, 0xbec1, 0x1138, 0x080c, -- 0xbdce, 0x1120, 0x6007, 0x0010, 0x0804, 0xb3df, 0x0046, 0x6418, -- 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, 0x8427, 0x0046, 0x080c, -- 0x2e46, 0x004e, 0x0016, 0xa006, 0x2009, 0xc653, 0x210c, 0xd1a4, -- 0x0158, 0x2009, 0x0029, 0x080c, 0xc183, 0x6018, 0x00d6, 0x2068, -- 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, 0x004e, 0x6007, 0x0001, -- 0x00f0, 0x080c, 0xc016, 0x0140, 0xa6b4, 0xff00, 0x8637, 0xa686, -- 0x0006, 0x0950, 0x0804, 0xb2d0, 0x6013, 0x1900, 0x6007, 0x0009, -- 0x0070, 0x080c, 0x2f69, 0x1904, 0xb5e3, 0x080c, 0xc36b, 0x1904, -- 0xb5e3, 0x080c, 0xb647, 0x1904, 0xb2d0, 0x6007, 0x0012, 0x6003, -- 0x0001, 0x080c, 0x79df, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, -- 0x080c, 0x79df, 0x0cc0, 0x6007, 0x0005, 0x0cc0, 0x080c, 0xc36b, -- 0x1904, 0xb5e3, 0x080c, 0x2f69, 0x1904, 0xb5e3, 0x080c, 0xb647, -- 0x1904, 0xb2d0, 0x6007, 0x0020, 0x6003, 0x0001, 0x080c, 0x79df, -- 0x0005, 0x080c, 0x2f69, 0x1904, 0xb5e3, 0x6007, 0x0023, 0x6003, -- 0x0001, 0x080c, 0x79df, 0x0005, 0x080c, 0xc36b, 0x1904, 0xb5e3, -- 0x080c, 0x2f69, 0x1904, 0xb5e3, 0x080c, 0xb647, 0x1904, 0xb2d0, -- 0x0016, 0x0026, 0x2011, 0xcc91, 0x2214, 0xa286, 0xffff, 0x0190, -- 0x2c08, 0x080c, 0xac7a, 0x01e0, 0x2260, 0x2011, 0xcc90, 0x2214, -- 0x6008, 0xa206, 0x11a8, 0x6018, 0xa190, 0x0006, 0x2214, 0xa206, -- 0x01e8, 0x0070, 0x2011, 0xcc90, 0x2214, 0x2c08, 0xa006, 0x080c, -- 0xc155, 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, 0x95dc, -- 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, 0xa0fc, 0x003e, 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, -- 0x0031, 0x0804, 0xb3df, 0x080c, 0x9dee, 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, 0xb5e3, 0x080c, 0xb647, 0x1904, 0xb2d0, 0x6106, -- 0x080c, 0xb663, 0x6007, 0x002b, 0x0804, 0xb3df, 0x6007, 0x002c, -- 0x0804, 0xb3df, 0x080c, 0xc36b, 0x1904, 0xb5e3, 0x080c, 0x2f69, -- 0x1904, 0xb5e3, 0x080c, 0xb647, 0x1904, 0xb2d0, 0x6106, 0x080c, -- 0xb667, 0x1120, 0x6007, 0x002e, 0x0804, 0xb3df, 0x6007, 0x002f, -- 0x0804, 0xb3df, 0x080c, 0x2f69, 0x1904, 0xb5e3, 0x00e6, 0x00d6, -- 0x00c6, 0x6018, 0xa080, 0x0001, 0x200c, 0xa184, 0x00ff, 0xa086, -- 0x0006, 0x0158, 0xa184, 0xff00, 0x8007, 0xa086, 0x0006, 0x0128, -- 0x00ce, 0x00de, 0x00ee, 0x0804, 0xb3e4, 0x2001, 0xc672, 0x2004, -- 0xd0e4, 0x0904, 0xb539, 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, 0xac7a, -- 0x0558, 0x080c, 0xc1ef, 0x0540, 0x622a, 0x6007, 0x0036, 0x6003, -- 0x0001, 0x080c, 0x7999, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, -- 0xa286, 0xffff, 0x0150, 0x080c, 0xac7a, 0x01b0, 0xa280, 0x0002, -- 0x2004, 0x7110, 0xa106, 0x1180, 0x0c08, 0x7210, 0x2c08, 0xa085, -- 0x0001, 0x080c, 0xc155, 0x2c10, 0x2160, 0x0130, 0x08b8, 0x6007, -- 0x0037, 0x6013, 0x1500, 0x08d8, 0x6007, 0x0037, 0x6013, 0x1700, -- 0x08b0, 0x6007, 0x0012, 0x0898, 0x080c, 0x2f69, 0x1904, 0xb5e3, -- 0x6018, 0xa080, 0x0001, 0x2004, 0xa084, 0xff00, 0x8007, 0xa086, -- 0x0006, 0x1904, 0xb3e4, 0x00e6, 0x00d6, 0x00c6, 0x2001, 0xc672, -- 0x2004, 0xd0e4, 0x0904, 0xb5a5, 0x2069, 0xc600, 0x2071, 0xcc8c, -- 0x7008, 0x6036, 0x720c, 0x623a, 0xa286, 0xffff, 0x1150, 0x7208, -- 0x00c6, 0x2c08, 0xa085, 0x0001, 0x080c, 0xc155, 0x2c10, 0x00ce, -- 0x0588, 0x080c, 0xac7a, 0x0570, 0x00c6, 0x0026, 0x2260, 0x080c, -- 0xa94d, 0x002e, 0x00ce, 0x7118, 0xa18c, 0xff00, 0x810f, 0xa186, -- 0x0001, 0x0158, 0xa186, 0x0005, 0x0118, 0xa186, 0x0007, 0x1178, -- 0xa280, 0x0004, 0x2004, 0xa005, 0x0150, 0x0056, 0x7510, 0x7614, -- 0x080c, 0xc206, 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, 0xb50f, 0x00e6, 0x0026, 0x080c, -- 0x570b, 0x0558, 0x080c, 0x568d, 0x080c, 0xc3e6, 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, 0xc412, 0x002e, 0x00ee, 0x080c, -- 0x95dc, 0x0804, 0xb3e3, 0x080c, 0x95dc, 0x0005, 0x2600, 0x0002, -- 0xb5f1, 0xb625, 0xb636, 0xb5f1, 0xb5f1, 0xb5f3, 0xb60c, 0xb5f1, -- 0xb5f1, 0x080c, 0x1519, 0x080c, 0xc36b, 0x1d68, 0x080c, 0x2f69, -- 0x1d50, 0x080c, 0xb647, 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, 0xc41b, 0x080c, 0x95dc, 0x0005, 0x2009, 0x0046, -- 0x080c, 0xc441, 0x080c, 0x95dc, 0x0005, 0x080c, 0x2f69, 0x1904, -- 0xb5e3, 0x2009, 0x0041, 0x080c, 0xc441, 0x6007, 0x0047, 0x6003, -- 0x0001, 0x080c, 0x79df, 0x080c, 0x7e94, 0x0005, 0x080c, 0x2f69, -- 0x1904, 0xb5e3, 0x2009, 0x0042, 0x080c, 0xc441, 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, 0xb7b0, 0x0092, 0xa1b6, 0x0027, 0x0120, 0xa1b6, -- 0x0014, 0x190c, 0x1519, 0x2001, 0x0007, 0x080c, 0x52be, 0x080c, -- 0x7db1, 0x080c, 0xae4d, 0x080c, 0x7e94, 0x0005, 0xb70e, 0xb710, -- 0xb70e, 0xb70e, 0xb70e, 0xb710, 0xb722, 0xb7a9, 0xb772, 0xb7a9, -- 0xb785, 0xb7a9, 0xb722, 0xb7a9, 0xb7a1, 0xb7a9, 0xb7a1, 0xb7a9, -- 0xb7a9, 0xb70e, 0xb70e, 0xb70e, 0xb70e, 0xb70e, 0xb70e, 0xb70e, -- 0xb70e, 0xb70e, 0xb70e, 0xb70e, 0xb710, 0xb70e, 0xb7a9, 0xb70e, -- 0xb70e, 0xb7a9, 0xb70e, 0xb7a6, 0xb7a9, 0xb70e, 0xb70e, 0xb70e, -- 0xb70e, 0xb7a9, 0xb7a9, 0xb70e, 0xb7a9, 0xb7a9, 0xb70e, 0xb71c, -- 0xb70e, 0xb70e, 0xb70e, 0xb70e, 0xb7a5, 0xb7a9, 0xb70e, 0xb70e, -- 0xb7a9, 0xb7a9, 0xb70e, 0xb70e, 0xb70e, 0xb70e, 0x080c, 0x1519, -- 0x080c, 0x7db1, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x6003, 0x0002, -- 0x080c, 0x7e94, 0x0804, 0xb7af, 0x2001, 0x0000, 0x080c, 0x527f, -- 0x0804, 0xb7a9, 0x00f6, 0x2079, 0xc652, 0x7804, 0x00fe, 0xd0ac, -- 0x1904, 0xb7a9, 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, 0xb7a9, 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, 0x95dc, 0x080c, 0x7e94, 0x0005, -- 0x2600, 0x0002, 0xb7bb, 0xb7bb, 0xb7bb, 0xb7bb, 0xb7bb, 0xb7bd, -- 0xb7bb, 0xb7bd, 0xb7bb, 0x080c, 0x1519, 0x080c, 0x7db1, 0x080c, -- 0x95dc, 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, 0x9cd3, 0x9cd3, 0x9cd3, -- 0x9cd3, 0x9cd3, 0x9cd3, 0xb846, 0xb805, 0x9cd3, 0x9cd3, 0x9cd3, -- 0x9cd3, 0x9cd3, 0x9cd3, 0x9cd3, 0x9cd3, 0x9cd3, 0x9cd3, 0xb846, -- 0xb84d, 0x9cd3, 0x9cd3, 0x9cd3, 0x9cd3, 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, 0x95dc, 0x0068, 0x6010, -- 0x0006, 0x6014, 0x0006, 0x080c, 0x4f47, 0x000e, 0x6016, 0x000e, -- 0x6012, 0x00ce, 0x080c, 0x95dc, 0x00fe, 0x0005, 0x6604, 0xa6b6, -- 0x001e, 0x1110, 0x080c, 0x95dc, 0x0005, 0x080c, 0x9faf, 0x1138, -- 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x79df, 0x0010, 0x080c, -- 0x95dc, 0x0005, 0x6004, 0xa08a, 0x0080, 0x1a0c, 0x1519, 0x080c, -- 0x7db1, 0x080c, 0xae4d, 0x080c, 0x7e94, 0x0005, 0xa182, 0x0040, -- 0x0002, 0xb87c, 0xb87c, 0xb87c, 0xb87c, 0xb87e, 0xb87c, 0xb87c, -- 0xb87c, 0xb87c, 0xb87c, 0xb87c, 0xb87c, 0xb87c, 0xb87c, 0xb87c, -- 0xb87c, 0xb87c, 0xb87c, 0xb87c, 0x080c, 0x1519, 0x00d6, 0x00e6, -- 0x00f6, 0x0156, 0x0046, 0x0026, 0x6218, 0xa280, 0x002f, 0x2004, -- 0xa005, 0x0120, 0x2021, 0x0000, 0x080c, 0xc3b7, 0x6106, 0x2071, -- 0xcc80, 0x7444, 0xa4a4, 0xff00, 0x0904, 0xb8e2, 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, 0xc100, 0x0804, 0xb93f, 0xa486, 0x0400, 0x1130, -- 0x2019, 0x0002, 0x080c, 0xc0b2, 0x0804, 0xb93f, 0xa486, 0x0200, -- 0x1110, 0x080c, 0xc097, 0xa486, 0x1000, 0x1110, 0x080c, 0xc0e5, -- 0x0804, 0xb93f, 0x2069, 0xc9bc, 0x6a00, 0xd284, 0x0904, 0xb9a6, -- 0xa284, 0x0300, 0x1904, 0xb99f, 0x6804, 0xa005, 0x0904, 0xb987, -- 0x2d78, 0x6003, 0x0007, 0x080c, 0x15e5, 0x0904, 0xb946, 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, 0xb931, -- 0x200c, 0x6982, 0x8000, 0x200c, 0x697e, 0x080c, 0x580a, 0x002e, -- 0x004e, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x0005, 0x2001, 0xc60e, -- 0x2004, 0xd084, 0x0120, 0x080c, 0x1602, 0x1904, 0xb8f7, 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, 0xb93f, 0x2001, -- 0xc60d, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x407d, -- 0x6013, 0x0300, 0x0010, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, -- 0x0041, 0x080c, 0x7999, 0x080c, 0x7e94, 0x0804, 0xb93f, 0x6013, -- 0x0500, 0x0c98, 0x6013, 0x0600, 0x0804, 0xb95a, 0x6013, 0x0200, -- 0x0804, 0xb95a, 0xa186, 0x0013, 0x1170, 0x6004, 0xa08a, 0x0040, -- 0x0a0c, 0x1519, 0xa08a, 0x0053, 0x1a0c, 0x1519, 0xa082, 0x0040, -- 0x2008, 0x0804, 0xba34, 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, 0xba77, 0xa186, 0x0027, 0x0120, 0xa186, -- 0x0014, 0x190c, 0x1519, 0x6004, 0xa082, 0x0040, 0x2008, 0x001a, -- 0x080c, 0x9623, 0x0005, 0xb9fe, 0xba00, 0xba00, 0xba24, 0xb9fe, -- 0xb9fe, 0xb9fe, 0xb9fe, 0xb9fe, 0xb9fe, 0xb9fe, 0xb9fe, 0xb9fe, -- 0xb9fe, 0xb9fe, 0xb9fe, 0xb9fe, 0xb9fe, 0xb9fe, 0x080c, 0x1519, -- 0x080c, 0x7db1, 0x080c, 0x7e94, 0x0036, 0x00d6, 0x6010, 0xa06d, -- 0x01c0, 0xad84, 0xf000, 0x01a8, 0x6003, 0x0002, 0x6018, 0x2004, -- 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xc134, 0x6013, 0x0000, -- 0x6014, 0xa005, 0x1120, 0x2001, 0xc8fe, 0x2004, 0x6016, 0x6003, -- 0x0007, 0x00de, 0x003e, 0x0005, 0x00d6, 0x080c, 0x7db1, 0x080c, -- 0x7e94, 0x080c, 0xac8a, 0x0120, 0x6010, 0x2068, 0x080c, 0x1619, -- 0x080c, 0xae4d, 0x00de, 0x0005, 0x0002, 0xba48, 0xba65, 0xba51, -- 0xba71, 0xba48, 0xba48, 0xba48, 0xba48, 0xba48, 0xba48, 0xba48, -- 0xba48, 0xba48, 0xba48, 0xba48, 0xba48, 0xba48, 0xba48, 0xba48, -- 0x080c, 0x1519, 0x6010, 0xa088, 0x0013, 0x2104, 0xa085, 0x0400, -- 0x200a, 0x080c, 0x7db1, 0x6010, 0xa080, 0x0013, 0x2004, 0xd0b4, -- 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, 0x960c, 0x0010, -- 0x6003, 0x0002, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7db1, 0x080c, -- 0xc372, 0x1120, 0x080c, 0x7103, 0x080c, 0x95dc, 0x080c, 0x7e94, -- 0x0005, 0x080c, 0x7db1, 0x2009, 0x0041, 0x0804, 0xbbc0, 0xa182, -- 0x0040, 0x0002, 0xba8d, 0xba8f, 0xba8d, 0xba8d, 0xba8d, 0xba8d, -- 0xba8d, 0xba90, 0xba8d, 0xba8d, 0xba8d, 0xba8d, 0xba8d, 0xba8d, -- 0xba8d, 0xba8d, 0xba8d, 0xba9b, 0xba8d, 0x080c, 0x1519, 0x0005, -- 0x6003, 0x0004, 0x6110, 0x20e1, 0x0005, 0x3d18, 0x3e20, 0x2c10, -- 0x080c, 0x1870, 0x0005, 0x00d6, 0x080c, 0x7103, 0x00de, 0x080c, -- 0xc3d5, 0x080c, 0x95dc, 0x0005, 0xa182, 0x0040, 0x0002, 0xbaba, -- 0xbaba, 0xbaba, 0xbaba, 0xbaba, 0xbaba, 0xbaba, 0xbabc, 0xbaba, -- 0xbabf, 0xbaf8, 0xbaba, 0xbaba, 0xbaba, 0xbaba, 0xbaf8, 0xbaba, -- 0xbaba, 0xbaba, 0x080c, 0x1519, 0x080c, 0x9623, 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, 0xbbc0, 0x6003, 0x0007, 0x6017, -- 0x0000, 0x080c, 0x7103, 0x00de, 0x0005, 0x080c, 0xc372, 0x0110, -- 0x00de, 0x0005, 0x080c, 0x7103, 0x080c, 0x95dc, 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, -- 0xc134, 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, 0xae4d, -- 0x080c, 0x7e94, 0x0005, 0xa182, 0x0040, 0x0002, 0xbb61, 0xbb61, -- 0xbb61, 0xbb61, 0xbb61, 0xbb61, 0xbb61, 0xbb63, 0xbb6f, 0xbb61, -- 0xbb61, 0xbb61, 0xbb61, 0xbb61, 0xbb61, 0xbb61, 0xbb61, 0xbb61, -- 0xbb61, 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, -- 0xbbe3, 0xbbea, 0xbbf6, 0xbc02, 0xbbe3, 0xbbe3, 0xbbe3, 0xbc11, -- 0xbbe3, 0xbbe5, 0xbbe5, 0xbbe3, 0xbbe3, 0xbbe3, 0xbbe3, 0xbbe5, -- 0xbbe3, 0xbbe5, 0xbbe3, 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, 0xbc31, 0xbc33, 0xbc45, 0xbc60, 0xbc31, 0xbc31, 0xbc31, -- 0xbc75, 0xbc31, 0xbc31, 0xbc31, 0xbc31, 0xbc31, 0xbc31, 0xbc31, -- 0xbc31, 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, 0xc134, 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, 0xc4ca, 0x0036, 0x2019, 0x0029, 0x080c, 0xc134, 0x003e, -- 0x00de, 0x080c, 0xae4d, 0x080c, 0x7e94, 0x0005, 0x080c, 0x7e47, -- 0x6110, 0x81ff, 0x0158, 0x00d6, 0x2168, 0x080c, 0xc4ca, 0x0036, -- 0x2019, 0x0029, 0x080c, 0xc134, 0x003e, 0x00de, 0x080c, 0xae4d, -- 0x080c, 0x7f6e, 0x0005, 0xa182, 0x0085, 0x0002, 0xbcaf, 0xbcad, -- 0xbcad, 0xbcbb, 0xbcad, 0xbcad, 0xbcad, 0x080c, 0x1519, 0x6003, -- 0x000b, 0x6106, 0x080c, 0x7999, 0x0126, 0x2091, 0x8000, 0x080c, -- 0x7e94, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xc36b, 0x0118, -- 0x080c, 0x95dc, 0x00c8, 0x2071, 0xcc80, 0x7224, 0x6212, 0x7220, -- 0x080c, 0xbfe2, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, -- 0x7224, 0xa296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, -- 0x080c, 0x7999, 0x080c, 0x7e94, 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, 0x9623, 0x0050, 0x2001, -- 0x0007, 0x080c, 0x52be, 0x080c, 0x7db1, 0x080c, 0xae4d, 0x080c, -- 0x7e94, 0x0005, 0xbd09, 0xbd0b, 0xbd0b, 0xbd09, 0xbd09, 0xbd09, -- 0xbd09, 0x080c, 0x1519, 0x080c, 0x7db1, 0x080c, 0xae4d, 0x080c, -- 0x7e94, 0x0005, 0xa182, 0x0085, 0x0a0c, 0x1519, 0xa182, 0x008c, -- 0x1a0c, 0x1519, 0xa182, 0x0085, 0x0002, 0xbd24, 0xbd24, 0xbd24, -- 0xbd26, 0xbd24, 0xbd24, 0xbd24, 0x080c, 0x1519, 0x0005, 0xa186, -- 0x0013, 0x0148, 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, -- 0x080c, 0x9623, 0x0030, 0x080c, 0x7db1, 0x080c, 0xae4d, 0x080c, -- 0x7e94, 0x0005, 0x0036, 0x080c, 0xc3d5, 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, 0x9068, 0x007e, 0x1548, 0x6000, 0xa086, 0x0000, 0x0528, -- 0x601c, 0xa086, 0x0007, 0x0508, 0x00d6, 0x6000, 0xa086, 0x0004, -- 0x1150, 0x080c, 0xc3d5, 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, -- 0x6016, 0x080c, 0x1953, 0x6010, 0x2068, 0x080c, 0xac8a, 0x0110, -- 0x080c, 0xc134, 0x00de, 0x6013, 0x0000, 0x080c, 0xc3d5, 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, 0x912b, -- 0x080c, 0x7b16, 0x0076, 0x2039, 0x0000, 0x080c, 0x7a0e, 0x007e, -- 0x001e, 0x0076, 0x2039, 0x0000, 0x080c, 0xbeea, 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, -- 0xbe23, 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, 0xa0fc, 0x1580, 0x2011, 0xcc9a, -- 0xad98, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa0fc, 0x1538, 0x0046, -- 0x0016, 0x6aa0, 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xc653, -- 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xc183, 0x6800, -- 0xc0e5, 0x6802, 0x2019, 0x0029, 0x080c, 0x7b16, 0x0076, 0x2039, -- 0x0000, 0x080c, 0x7a0e, 0x2c08, 0x080c, 0xbeea, 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, -- 0xa0fc, 0x1140, 0x2011, 0xcc94, 0xac98, 0x0006, 0x20a9, 0x0004, -- 0x080c, 0xa0fc, 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, 0xa0fc, 0x1140, 0x2011, 0xcc9a, 0xac98, 0x0006, 0x20a9, -- 0x0004, 0x080c, 0xa0fc, 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, 0xbf6b, 0x0018, 0xa606, 0x0904, -- 0xbf6b, 0x2100, 0xac06, 0x0904, 0xbf62, 0x080c, 0xc1ab, 0x0904, -- 0xbf62, 0x671c, 0xa786, 0x0001, 0x0904, 0xbfb4, 0xa786, 0x0004, -- 0x0904, 0xbfb4, 0xa786, 0x0007, 0x05e8, 0x2500, 0xac06, 0x05d0, -- 0x2400, 0xac06, 0x05b8, 0x080c, 0xc1bb, 0x15a0, 0x88ff, 0x0118, -- 0x6050, 0xa906, 0x1578, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1120, -- 0x0016, 0x080c, 0x1953, 0x001e, 0xa786, 0x0008, 0x1148, 0x080c, -- 0xae88, 0x1130, 0x080c, 0x9c02, 0x00de, 0x080c, 0xae4d, 0x00d0, -- 0x6010, 0x2068, 0x080c, 0xac8a, 0x0190, 0xa786, 0x0003, 0x1528, -- 0x6837, 0x0103, 0x6b4a, 0x6847, 0x0000, 0x080c, 0xc4ca, 0x0016, -- 0x080c, 0xaefc, 0x080c, 0x580a, 0x001e, 0x080c, 0xae41, 0x00de, -- 0x080c, 0xae4d, 0xace0, 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, -- 0x1210, 0x0804, 0xbefe, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, -- 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0xa786, 0x0006, 0x1150, -- 0xa386, 0x0005, 0x0128, 0x080c, 0xc4ca, 0x080c, 0xc134, 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, 0xac8a, 0x0140, 0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, -- 0x0000, 0x080c, 0x580a, 0x00de, 0x00ee, 0x00c6, 0x080c, 0x95dc, -- 0x00ce, 0x080c, 0x7f6e, 0x00de, 0x0804, 0xbf62, 0xa786, 0x000a, -- 0x0904, 0xbf52, 0x0804, 0xbf50, 0x080c, 0xc1bb, 0x1904, 0xbf62, -- 0x81ff, 0x0904, 0xbf62, 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, -- 0x0138, 0xa180, 0x0001, 0x2004, 0xa086, 0x002d, 0x1904, 0xbf62, -- 0x6000, 0xa086, 0x0002, 0x1904, 0xbf62, 0x080c, 0xae77, 0x0138, -- 0x080c, 0xae88, 0x1904, 0xbf62, 0x080c, 0x9c02, 0x0038, 0x080c, -- 0x2e6c, 0x080c, 0xae88, 0x1110, 0x080c, 0x9c02, 0x080c, 0xae4d, -- 0x0804, 0xbf62, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0xa006, -- 0x080c, 0xc155, 0x001e, 0x0120, 0x601c, 0xa084, 0x000f, 0x001b, -- 0x00ee, 0x00ce, 0x0005, 0xbffb, 0xbffb, 0xbffb, 0xbffb, 0xbffb, -- 0xbffb, 0xbffd, 0xbffb, 0xa006, 0x0005, 0x0046, 0x0016, 0x7018, -- 0xa080, 0x0028, 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, -- 0x0020, 0x080c, 0xc183, 0x001e, 0x004e, 0x0036, 0x2019, 0x0002, -- 0x080c, 0xbd48, 0x003e, 0xa085, 0x0001, 0x0005, 0x2001, 0x0001, -- 0x080c, 0x527f, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, -- 0x2019, 0xc605, 0x2011, 0xcc96, 0x080c, 0xa0fc, 0x003e, 0x002e, -- 0x001e, 0x015e, 0xa005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, -- 0x0076, 0x0066, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, -- 0xce00, 0x2079, 0x0001, 0x8fff, 0x0904, 0xc08a, 0x2071, 0xc600, -- 0x7648, 0x7068, 0x8001, 0xa602, 0x1a04, 0xc08a, 0x88ff, 0x0128, -- 0x2800, 0xac06, 0x15b0, 0x2079, 0x0000, 0x080c, 0xc1ab, 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, 0xc3d5, 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, -- 0x6016, 0x080c, 0x1953, 0x6010, 0x2068, 0x080c, 0xac8a, 0x0120, -- 0x0046, 0x080c, 0xc134, 0x004e, 0x00de, 0x080c, 0xae4d, 0x88ff, -- 0x1198, 0xace0, 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1210, -- 0x0804, 0xc03b, 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, 0x9068, 0x080c, 0xc02c, 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, 0x9068, 0x080c, 0xc02c, -- 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xc0be, 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, 0x9068, 0x2c20, 0x080c, 0xc02c, 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, 0xc3b7, 0x004e, 0x0096, 0x2049, 0x0000, 0x080c, 0x8fc9, -- 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x9068, 0x080c, 0xc02c, -- 0x003e, 0x001e, 0x8108, 0x1f04, 0xc10b, 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, -- 0xac7a, 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, 0xaf65, 0x0030, -- 0x080c, 0xc3d5, 0x080c, 0x7103, 0x080c, 0x95dc, 0x0005, 0xa280, -- 0x0007, 0x2004, 0xa084, 0x000f, 0x0002, 0xc1fe, 0xc1fe, 0xc1fe, -- 0xc203, 0xc1fe, 0xc200, 0xc200, 0xc1fe, 0xc200, 0xa006, 0x0005, -- 0x00c6, 0x2260, 0x00ce, 0xa085, 0x0001, 0x0005, 0xa280, 0x0007, -- 0x2004, 0xa084, 0x000f, 0x0002, 0xc215, 0xc215, 0xc215, 0xc215, -- 0xc215, 0xc215, 0xc220, 0xc215, 0xc215, 0x6007, 0x003b, 0x602b, -- 0x0009, 0x6013, 0x2a00, 0x6003, 0x0001, 0x080c, 0x7999, 0x0005, -- 0x00c6, 0x2260, 0x080c, 0xc3d5, 0x603f, 0x0000, 0x6020, 0xc0f4, -- 0xc0cc, 0x6022, 0x6037, 0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186, -- 0x0007, 0x1904, 0xc27b, 0x6810, 0xa005, 0x0138, 0xa080, 0x0013, -- 0x2004, 0xd0fc, 0x1110, 0x00de, 0x08c0, 0x6007, 0x003a, 0x6003, -- 0x0001, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00c6, 0x2d60, 0x6100, -- 0xa186, 0x0002, 0x1904, 0xc304, 0x6010, 0xa005, 0x1138, 0x6000, -- 0xa086, 0x0007, 0x190c, 0x1519, 0x0804, 0xc304, 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, 0xbbc0, 0x0804, 0xc304, 0x2009, -- 0x0041, 0x0804, 0xc2fe, 0xa186, 0x0005, 0x15f0, 0x6810, 0xa080, -- 0x0013, 0x2004, 0xd0bc, 0x1118, 0x00de, 0x0804, 0xc215, 0xd0b4, -- 0x0128, 0xd0fc, 0x090c, 0x1519, 0x0804, 0xc233, 0x6007, 0x003a, -- 0x6003, 0x0001, 0x080c, 0x7999, 0x080c, 0x7e94, 0x00c6, 0x2d60, -- 0x6100, 0xa186, 0x0002, 0x0120, 0xa186, 0x0004, 0x1904, 0xc304, -- 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, 0xc2fe, 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, -- 0xbd48, 0x2d00, 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017, -- 0x0000, 0x603f, 0x0000, 0x00de, 0x003e, 0x0038, 0x603f, 0x0000, -- 0x6003, 0x0007, 0x080c, 0xbbc0, 0x00ce, 0x00de, 0x0005, 0xa186, -- 0x0013, 0x1128, 0x6004, 0xa082, 0x0085, 0x2008, 0x00c2, 0xa186, -- 0x0027, 0x1178, 0x080c, 0x7db1, 0x0036, 0x00d6, 0x6010, 0x2068, -- 0x2019, 0x0004, 0x080c, 0xc134, 0x00de, 0x003e, 0x080c, 0x7e94, -- 0x0005, 0xa186, 0x0014, 0x0d70, 0x080c, 0x9623, 0x0005, 0xc330, -- 0xc32e, 0xc32e, 0xc32e, 0xc32e, 0xc32e, 0xc330, 0x080c, 0x1519, -- 0x080c, 0x7db1, 0x6003, 0x000c, 0x080c, 0x7e94, 0x0005, 0xa182, -- 0x008c, 0x1220, 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x9623, -- 0x0005, 0xc348, 0xc348, 0xc348, 0xc348, 0xc34a, 0xc368, 0xc348, -- 0x080c, 0x1519, 0x00d6, 0x2c68, 0x080c, 0x9586, 0x01a0, 0x6003, -- 0x0001, 0x6007, 0x001e, 0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, -- 0xcc8f, 0x210c, 0x613a, 0x600b, 0xffff, 0x6918, 0x611a, 0x601f, -- 0x0004, 0x080c, 0x7999, 0x2d60, 0x080c, 0x95dc, 0x00de, 0x0005, -- 0x080c, 0x95dc, 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec, -- 0x00ee, 0x0005, 0x6010, 0xa08c, 0xf000, 0x0904, 0xc3b6, 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, 0x95dc, 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, 0xa0fc, 0x1150, 0x2011, 0xcc94, 0x6018, 0xa098, -- 0x0006, 0x20a9, 0x0004, 0x080c, 0xa0fc, 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, 0xc4bd, 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, 0xc1ab, 0x01b8, -- 0x080c, 0xc1bb, 0x11a0, 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, -- 0x080c, 0x1953, 0x001e, 0x080c, 0xae77, 0x1110, 0x080c, 0x2e6c, -- 0x080c, 0xae88, 0x1110, 0x080c, 0x9c02, 0x080c, 0xae4d, 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, -- 0x28b5 -+ 0x080c, 0x53f8, 0x6007, 0x000a, 0x00de, 0x0804, 0xb403, 0x6007, -+ 0x000b, 0x00de, 0x0804, 0xb403, 0x080c, 0x2e46, 0x6007, 0x0001, -+ 0x0804, 0xb403, 0x080c, 0xc391, 0x1904, 0xb607, 0x080c, 0x2f69, -+ 0x1904, 0xb607, 0x6618, 0x00d6, 0x2668, 0x6e04, 0x00de, 0xa686, -+ 0x0707, 0x0d50, 0x0026, 0x6218, 0xa290, 0x0028, 0x2214, 0x2009, -+ 0x0000, 0x080c, 0x2e8b, 0x002e, 0x6007, 0x000c, 0x0804, 0xb403, -+ 0x080c, 0x5724, 0x1140, 0x2001, 0xc635, 0x2004, 0xa084, 0x0009, -+ 0xa086, 0x0008, 0x1110, 0x0804, 0xb24c, 0x080c, 0x56a6, 0x6618, -+ 0xa6b0, 0x0001, 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06e8, -+ 0x1138, 0x0026, 0x2001, 0x0006, 0x080c, 0x52d7, 0x002e, 0x0050, -+ 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, -+ 0x1904, 0xb2f4, 0x080c, 0xbebf, 0x1120, 0x6007, 0x000e, 0x0804, -+ 0xb403, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, 0x00ff, -+ 0x8427, 0x0046, 0x080c, 0x2e46, 0x004e, 0x0016, 0xa006, 0x2009, -+ 0xc653, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, 0xc1a9, -+ 0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, 0x001e, -+ 0x004e, 0x6007, 0x0001, 0x0804, 0xb403, 0x2001, 0x0001, 0x080c, -+ 0x5298, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, -+ 0xc605, 0x2011, 0xcc90, 0x080c, 0xa11c, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0xa005, 0x0168, 0xa6b4, 0xff00, 0x8637, 0xa682, 0x0004, -+ 0x0a04, 0xb2f4, 0xa682, 0x0007, 0x0a04, 0xb342, 0x0804, 0xb2f4, -+ 0x6013, 0x1900, 0x6007, 0x0009, 0x0804, 0xb403, 0x080c, 0x5724, -+ 0x1140, 0x2001, 0xc635, 0x2004, 0xa084, 0x0009, 0xa086, 0x0008, -+ 0x1110, 0x0804, 0xb24c, 0x080c, 0x56a6, 0x6618, 0xa6b0, 0x0001, -+ 0x2634, 0xa684, 0x00ff, 0xa082, 0x0006, 0x06b8, 0xa6b4, 0xff00, -+ 0x8637, 0xa686, 0x0004, 0x0120, 0xa686, 0x0006, 0x1904, 0xb2f4, -+ 0x080c, 0xbee7, 0x1138, 0x080c, 0xbdf4, 0x1120, 0x6007, 0x0010, -+ 0x0804, 0xb403, 0x0046, 0x6418, 0xa4a0, 0x0028, 0x2424, 0xa4a4, -+ 0x00ff, 0x8427, 0x0046, 0x080c, 0x2e46, 0x004e, 0x0016, 0xa006, -+ 0x2009, 0xc653, 0x210c, 0xd1a4, 0x0158, 0x2009, 0x0029, 0x080c, -+ 0xc1a9, 0x6018, 0x00d6, 0x2068, 0x6800, 0xc0e5, 0x6802, 0x00de, -+ 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, 0xc03c, 0x0140, -+ 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, 0x0950, 0x0804, 0xb2f4, -+ 0x6013, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, 0x2f69, 0x1904, -+ 0xb607, 0x080c, 0xc391, 0x1904, 0xb607, 0x080c, 0xb66b, 0x1904, -+ 0xb2f4, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, 0x79f8, 0x0005, -+ 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x79f8, 0x0cc0, 0x6007, -+ 0x0005, 0x0cc0, 0x080c, 0xc391, 0x1904, 0xb607, 0x080c, 0x2f69, -+ 0x1904, 0xb607, 0x080c, 0xb66b, 0x1904, 0xb2f4, 0x6007, 0x0020, -+ 0x6003, 0x0001, 0x080c, 0x79f8, 0x0005, 0x080c, 0x2f69, 0x1904, -+ 0xb607, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x79f8, 0x0005, -+ 0x080c, 0xc391, 0x1904, 0xb607, 0x080c, 0x2f69, 0x1904, 0xb607, -+ 0x080c, 0xb66b, 0x1904, 0xb2f4, 0x0016, 0x0026, 0x2011, 0xcc91, -+ 0x2214, 0xa286, 0xffff, 0x0190, 0x2c08, 0x080c, 0xac9a, 0x01e0, -+ 0x2260, 0x2011, 0xcc90, 0x2214, 0x6008, 0xa206, 0x11a8, 0x6018, -+ 0xa190, 0x0006, 0x2214, 0xa206, 0x01e8, 0x0070, 0x2011, 0xcc90, -+ 0x2214, 0x2c08, 0xa006, 0x080c, 0xc17b, 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, 0x95fc, 0x2160, 0x6007, 0x0025, 0x6003, -+ 0x0001, 0x080c, 0x79f8, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, -+ 0x080c, 0x5298, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, -+ 0x2019, 0xc605, 0x2011, 0xcc96, 0x080c, 0xa11c, 0x003e, 0x002e, -+ 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xb403, 0x080c, -+ 0x9e0e, 0x080c, 0x5f3b, 0x11b0, 0x0006, 0x0026, 0x0036, 0x080c, -+ 0x5f57, 0x1158, 0x2001, 0xc8e6, 0x2003, 0x0001, 0x2001, 0xc600, -+ 0x2003, 0x0001, 0x080c, 0x5e73, 0x0010, 0x080c, 0x5f12, 0x003e, -+ 0x002e, 0x000e, 0x0005, 0x080c, 0x2f69, 0x1904, 0xb607, 0x080c, -+ 0xb66b, 0x1904, 0xb2f4, 0x6106, 0x080c, 0xb687, 0x6007, 0x002b, -+ 0x0804, 0xb403, 0x6007, 0x002c, 0x0804, 0xb403, 0x080c, 0xc391, -+ 0x1904, 0xb607, 0x080c, 0x2f69, 0x1904, 0xb607, 0x080c, 0xb66b, -+ 0x1904, 0xb2f4, 0x6106, 0x080c, 0xb68b, 0x1120, 0x6007, 0x002e, -+ 0x0804, 0xb403, 0x6007, 0x002f, 0x0804, 0xb403, 0x080c, 0x2f69, -+ 0x1904, 0xb607, 0x00e6, 0x00d6, 0x00c6, 0x6018, 0xa080, 0x0001, -+ 0x200c, 0xa184, 0x00ff, 0xa086, 0x0006, 0x0158, 0xa184, 0xff00, -+ 0x8007, 0xa086, 0x0006, 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, -+ 0xb408, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0904, 0xb55d, 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, 0xac9a, 0x0558, 0x080c, 0xc215, 0x0540, -+ 0x622a, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x79b2, 0x00ce, -+ 0x00de, 0x00ee, 0x0005, 0x7214, 0xa286, 0xffff, 0x0150, 0x080c, -+ 0xac9a, 0x01b0, 0xa280, 0x0002, 0x2004, 0x7110, 0xa106, 0x1180, -+ 0x0c08, 0x7210, 0x2c08, 0xa085, 0x0001, 0x080c, 0xc17b, 0x2c10, -+ 0x2160, 0x0130, 0x08b8, 0x6007, 0x0037, 0x6013, 0x1500, 0x08d8, -+ 0x6007, 0x0037, 0x6013, 0x1700, 0x08b0, 0x6007, 0x0012, 0x0898, -+ 0x080c, 0x2f69, 0x1904, 0xb607, 0x6018, 0xa080, 0x0001, 0x2004, -+ 0xa084, 0xff00, 0x8007, 0xa086, 0x0006, 0x1904, 0xb408, 0x00e6, -+ 0x00d6, 0x00c6, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0904, 0xb5c9, -+ 0x2069, 0xc600, 0x2071, 0xcc8c, 0x7008, 0x6036, 0x720c, 0x623a, -+ 0xa286, 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0xa085, 0x0001, -+ 0x080c, 0xc17b, 0x2c10, 0x00ce, 0x0588, 0x080c, 0xac9a, 0x0570, -+ 0x00c6, 0x0026, 0x2260, 0x080c, 0xa96d, 0x002e, 0x00ce, 0x7118, -+ 0xa18c, 0xff00, 0x810f, 0xa186, 0x0001, 0x0158, 0xa186, 0x0005, -+ 0x0118, 0xa186, 0x0007, 0x1178, 0xa280, 0x0004, 0x2004, 0xa005, -+ 0x0150, 0x0056, 0x7510, 0x7614, 0x080c, 0xc22c, 0x005e, 0x00ce, -+ 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, -+ 0x2a00, 0x6003, 0x0001, 0x080c, 0x79b2, 0x0c88, 0x6007, 0x003b, -+ 0x602b, 0x0009, 0x6013, 0x1700, 0x6003, 0x0001, 0x080c, 0x79b2, -+ 0x0c30, 0x6007, 0x003b, 0x602b, 0x000b, 0x6013, 0x0000, 0x0804, -+ 0xb533, 0x00e6, 0x0026, 0x080c, 0x5724, 0x0558, 0x080c, 0x56a6, -+ 0x080c, 0xc40c, 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, -+ 0xc438, 0x002e, 0x00ee, 0x080c, 0x95fc, 0x0804, 0xb407, 0x080c, -+ 0x95fc, 0x0005, 0x2600, 0x0002, 0xb615, 0xb649, 0xb65a, 0xb615, -+ 0xb615, 0xb617, 0xb630, 0xb615, 0xb615, 0x080c, 0x1519, 0x080c, -+ 0xc391, 0x1d68, 0x080c, 0x2f69, 0x1d50, 0x080c, 0xb66b, 0x1138, -+ 0x6007, 0x0045, 0x6003, 0x0001, 0x080c, 0x79f8, 0x0005, 0x080c, -+ 0x2e46, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x79f8, 0x0005, -+ 0x080c, 0x2f69, 0x19a0, 0x080c, 0x76a8, 0x1160, 0x2e00, 0xa080, -+ 0x0010, 0x2004, 0x8007, 0xd084, 0x0110, 0x080c, 0xc441, 0x080c, -+ 0x95fc, 0x0005, 0x2009, 0x0046, 0x080c, 0xc467, 0x080c, 0x95fc, -+ 0x0005, 0x080c, 0x2f69, 0x1904, 0xb607, 0x2009, 0x0041, 0x080c, -+ 0xc467, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x79f8, 0x080c, -+ 0x7ead, 0x0005, 0x080c, 0x2f69, 0x1904, 0xb607, 0x2009, 0x0042, -+ 0x080c, 0xc467, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x79f8, -+ 0x080c, 0x7ead, 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, 0xb7d4, 0x0092, -+ 0xa1b6, 0x0027, 0x0120, 0xa1b6, 0x0014, 0x190c, 0x1519, 0x2001, -+ 0x0007, 0x080c, 0x52d7, 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, -+ 0x7ead, 0x0005, 0xb732, 0xb734, 0xb732, 0xb732, 0xb732, 0xb734, -+ 0xb746, 0xb7cd, 0xb796, 0xb7cd, 0xb7a9, 0xb7cd, 0xb746, 0xb7cd, -+ 0xb7c5, 0xb7cd, 0xb7c5, 0xb7cd, 0xb7cd, 0xb732, 0xb732, 0xb732, -+ 0xb732, 0xb732, 0xb732, 0xb732, 0xb732, 0xb732, 0xb732, 0xb732, -+ 0xb734, 0xb732, 0xb7cd, 0xb732, 0xb732, 0xb7cd, 0xb732, 0xb7ca, -+ 0xb7cd, 0xb732, 0xb732, 0xb732, 0xb732, 0xb7cd, 0xb7cd, 0xb732, -+ 0xb7cd, 0xb7cd, 0xb732, 0xb740, 0xb732, 0xb732, 0xb732, 0xb732, -+ 0xb7c9, 0xb7cd, 0xb732, 0xb732, 0xb7cd, 0xb7cd, 0xb732, 0xb732, -+ 0xb732, 0xb732, 0x080c, 0x1519, 0x080c, 0x7dca, 0x2001, 0xc8fd, -+ 0x2004, 0x6016, 0x6003, 0x0002, 0x080c, 0x7ead, 0x0804, 0xb7d3, -+ 0x2001, 0x0000, 0x080c, 0x5298, 0x0804, 0xb7cd, 0x00f6, 0x2079, -+ 0xc652, 0x7804, 0x00fe, 0xd0ac, 0x1904, 0xb7cd, 0x2001, 0x0000, -+ 0x080c, 0x5298, 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, 0x4108, 0x0804, 0xb7cd, 0x00ce, -+ 0x2001, 0xc600, 0x2004, 0xa086, 0x0002, 0x1138, 0x00f6, 0x2079, -+ 0xc600, 0x7898, 0x8000, 0x789a, 0x00fe, 0x2001, 0x0002, 0x080c, -+ 0x52aa, 0x080c, 0x7dca, 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, -+ 0x0002, 0x080c, 0x79f8, 0x080c, 0x7ead, 0x00c6, 0x6118, 0x2160, -+ 0x2009, 0x0001, 0x080c, 0x6fd2, 0x00ce, 0x04e8, 0x6618, 0x00d6, -+ 0x2668, 0x6e04, 0x00de, 0xa6b4, 0xff00, 0x8637, 0xa686, 0x0006, -+ 0x0560, 0xa686, 0x0004, 0x0548, 0x080c, 0x7682, 0x2001, 0x0004, -+ 0x0410, 0x2001, 0xc600, 0x2004, 0xa086, 0x0003, 0x1110, 0x080c, -+ 0x4108, 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, 0x52d7, 0x080c, 0x7dca, 0x080c, -+ 0x95fc, 0x080c, 0x7ead, 0x0005, 0x2600, 0x0002, 0xb7df, 0xb7df, -+ 0xb7df, 0xb7df, 0xb7df, 0xb7e1, 0xb7df, 0xb7e1, 0xb7df, 0x080c, -+ 0x1519, 0x080c, 0x7dca, 0x080c, 0x95fc, 0x080c, 0x7ead, 0x0005, -+ 0x0016, 0x00d6, 0x6118, 0x2168, 0x6900, 0xd184, 0x0140, 0x080c, -+ 0x52aa, 0x2001, 0x0000, 0x080c, 0x5298, 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, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3, 0xb86a, -+ 0xb829, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3, -+ 0x9cf3, 0x9cf3, 0x9cf3, 0xb86a, 0xb871, 0x9cf3, 0x9cf3, 0x9cf3, -+ 0x9cf3, 0x00f6, 0x2079, 0xc652, 0x7804, 0xd0ac, 0x11e0, 0x6018, -+ 0xa07d, 0x01c8, 0x7800, 0xd0f4, 0x1118, 0x7810, 0xa005, 0x1198, -+ 0x2001, 0x0000, 0x080c, 0x5298, 0x2001, 0x0002, 0x080c, 0x52aa, -+ 0x601f, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x79f8, -+ 0x080c, 0x7ead, 0x00e8, 0x2011, 0xcc83, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x29c7, 0x11a8, 0x00c6, 0x080c, 0x5356, 0x0120, 0x00ce, -+ 0x080c, 0x95fc, 0x0068, 0x6010, 0x0006, 0x6014, 0x0006, 0x080c, -+ 0x4f60, 0x000e, 0x6016, 0x000e, 0x6012, 0x00ce, 0x080c, 0x95fc, -+ 0x00fe, 0x0005, 0x6604, 0xa6b6, 0x001e, 0x1110, 0x080c, 0x95fc, -+ 0x0005, 0x080c, 0x9fcf, 0x1138, 0x6003, 0x0001, 0x6007, 0x0001, -+ 0x080c, 0x79f8, 0x0010, 0x080c, 0x95fc, 0x0005, 0x6004, 0xa08a, -+ 0x0080, 0x1a0c, 0x1519, 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, -+ 0x7ead, 0x0005, 0xa182, 0x0040, 0x0002, 0xb8a0, 0xb8a0, 0xb8a0, -+ 0xb8a0, 0xb8a2, 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a0, -+ 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a0, 0xb8a0, -+ 0x080c, 0x1519, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0046, 0x0026, -+ 0x6218, 0xa280, 0x002f, 0x2004, 0xa005, 0x0120, 0x2021, 0x0000, -+ 0x080c, 0xc3dd, 0x6106, 0x2071, 0xcc80, 0x7444, 0xa4a4, 0xff00, -+ 0x0904, 0xb906, 0xa486, 0x2000, 0x1130, 0x2009, 0x0001, 0x2011, -+ 0x0200, 0x080c, 0x7147, 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, 0x5823, 0x001e, -+ 0xa486, 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xc126, 0x0804, -+ 0xb963, 0xa486, 0x0400, 0x1130, 0x2019, 0x0002, 0x080c, 0xc0d8, -+ 0x0804, 0xb963, 0xa486, 0x0200, 0x1110, 0x080c, 0xc0bd, 0xa486, -+ 0x1000, 0x1110, 0x080c, 0xc10b, 0x0804, 0xb963, 0x2069, 0xc9bc, -+ 0x6a00, 0xd284, 0x0904, 0xb9ca, 0xa284, 0x0300, 0x1904, 0xb9c3, -+ 0x6804, 0xa005, 0x0904, 0xb9ab, 0x2d78, 0x6003, 0x0007, 0x080c, -+ 0x15e5, 0x0904, 0xb96a, 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, 0xb955, 0x200c, 0x6982, 0x8000, 0x200c, -+ 0x697e, 0x080c, 0x5823, 0x002e, 0x004e, 0x015e, 0x00fe, 0x00ee, -+ 0x00de, 0x0005, 0x2001, 0xc60e, 0x2004, 0xd084, 0x0120, 0x080c, -+ 0x1602, 0x1904, 0xb91b, 0x6013, 0x0100, 0x6003, 0x0001, 0x6007, -+ 0x0041, 0x080c, 0x79b2, 0x080c, 0x7ead, 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, 0x79b2, -+ 0x080c, 0x7ead, 0x0840, 0x6868, 0x602a, 0x686c, 0x602e, 0x6013, -+ 0x0200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x79b2, 0x080c, -+ 0x7ead, 0x0804, 0xb963, 0x2001, 0xc60d, 0x2004, 0xd0ec, 0x0120, -+ 0x2011, 0x8049, 0x080c, 0x4096, 0x6013, 0x0300, 0x0010, 0x6013, -+ 0x0100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x79b2, 0x080c, -+ 0x7ead, 0x0804, 0xb963, 0x6013, 0x0500, 0x0c98, 0x6013, 0x0600, -+ 0x0804, 0xb97e, 0x6013, 0x0200, 0x0804, 0xb97e, 0xa186, 0x0013, -+ 0x1170, 0x6004, 0xa08a, 0x0040, 0x0a0c, 0x1519, 0xa08a, 0x0053, -+ 0x1a0c, 0x1519, 0xa082, 0x0040, 0x2008, 0x0804, 0xba58, 0xa186, -+ 0x0051, 0x0138, 0xa186, 0x0047, 0x11d8, 0x6004, 0xa086, 0x0041, -+ 0x0518, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x0126, 0x2091, -+ 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x788c, 0x002e, 0x001e, -+ 0x000e, 0x012e, 0x6000, 0xa086, 0x0002, 0x1170, 0x0804, 0xba9b, -+ 0xa186, 0x0027, 0x0120, 0xa186, 0x0014, 0x190c, 0x1519, 0x6004, -+ 0xa082, 0x0040, 0x2008, 0x001a, 0x080c, 0x9643, 0x0005, 0xba22, -+ 0xba24, 0xba24, 0xba48, 0xba22, 0xba22, 0xba22, 0xba22, 0xba22, -+ 0xba22, 0xba22, 0xba22, 0xba22, 0xba22, 0xba22, 0xba22, 0xba22, -+ 0xba22, 0xba22, 0x080c, 0x1519, 0x080c, 0x7dca, 0x080c, 0x7ead, -+ 0x0036, 0x00d6, 0x6010, 0xa06d, 0x01c0, 0xad84, 0xf000, 0x01a8, -+ 0x6003, 0x0002, 0x6018, 0x2004, 0xd0bc, 0x1178, 0x2019, 0x0004, -+ 0x080c, 0xc15a, 0x6013, 0x0000, 0x6014, 0xa005, 0x1120, 0x2001, -+ 0xc8fe, 0x2004, 0x6016, 0x6003, 0x0007, 0x00de, 0x003e, 0x0005, -+ 0x00d6, 0x080c, 0x7dca, 0x080c, 0x7ead, 0x080c, 0xacaa, 0x0120, -+ 0x6010, 0x2068, 0x080c, 0x1619, 0x080c, 0xae6d, 0x00de, 0x0005, -+ 0x0002, 0xba6c, 0xba89, 0xba75, 0xba95, 0xba6c, 0xba6c, 0xba6c, -+ 0xba6c, 0xba6c, 0xba6c, 0xba6c, 0xba6c, 0xba6c, 0xba6c, 0xba6c, -+ 0xba6c, 0xba6c, 0xba6c, 0xba6c, 0x080c, 0x1519, 0x6010, 0xa088, -+ 0x0013, 0x2104, 0xa085, 0x0400, 0x200a, 0x080c, 0x7dca, 0x6010, -+ 0xa080, 0x0013, 0x2004, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, -+ 0x0043, 0x080c, 0x962c, 0x0010, 0x6003, 0x0002, 0x080c, 0x7ead, -+ 0x0005, 0x080c, 0x7dca, 0x080c, 0xc398, 0x1120, 0x080c, 0x711c, -+ 0x080c, 0x95fc, 0x080c, 0x7ead, 0x0005, 0x080c, 0x7dca, 0x2009, -+ 0x0041, 0x0804, 0xbbe4, 0xa182, 0x0040, 0x0002, 0xbab1, 0xbab3, -+ 0xbab1, 0xbab1, 0xbab1, 0xbab1, 0xbab1, 0xbab4, 0xbab1, 0xbab1, -+ 0xbab1, 0xbab1, 0xbab1, 0xbab1, 0xbab1, 0xbab1, 0xbab1, 0xbabf, -+ 0xbab1, 0x080c, 0x1519, 0x0005, 0x6003, 0x0004, 0x6110, 0x20e1, -+ 0x0005, 0x3d18, 0x3e20, 0x2c10, 0x080c, 0x1870, 0x0005, 0x00d6, -+ 0x080c, 0x711c, 0x00de, 0x080c, 0xc3fb, 0x080c, 0x95fc, 0x0005, -+ 0xa182, 0x0040, 0x0002, 0xbade, 0xbade, 0xbade, 0xbade, 0xbade, -+ 0xbade, 0xbade, 0xbae0, 0xbade, 0xbae3, 0xbb1c, 0xbade, 0xbade, -+ 0xbade, 0xbade, 0xbb1c, 0xbade, 0xbade, 0xbade, 0x080c, 0x1519, -+ 0x080c, 0x9643, 0x0005, 0x2001, 0xc672, 0x2004, 0xd0e4, 0x0158, -+ 0x2001, 0x0100, 0x2004, 0xa082, 0x0005, 0x0228, 0x2001, 0x011f, -+ 0x2004, 0x6036, 0x0010, 0x6037, 0x0000, 0x080c, 0x7e60, 0x080c, -+ 0x7f87, 0x6010, 0x00d6, 0x2068, 0x684c, 0xd0fc, 0x0150, 0xa08c, -+ 0x0003, 0xa18e, 0x0002, 0x0168, 0x2009, 0x0041, 0x00de, 0x0804, -+ 0xbbe4, 0x6003, 0x0007, 0x6017, 0x0000, 0x080c, 0x711c, 0x00de, -+ 0x0005, 0x080c, 0xc398, 0x0110, 0x00de, 0x0005, 0x080c, 0x711c, -+ 0x080c, 0x95fc, 0x00de, 0x0ca0, 0x0036, 0x080c, 0x7e60, 0x080c, -+ 0x7f87, 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, 0xc15a, 0x6014, 0xa005, 0x1128, -+ 0x2001, 0xc8fe, 0x2004, 0x8003, 0x6016, 0x6013, 0x0000, 0x6003, -+ 0x0007, 0x00de, 0x003e, 0x0005, 0xa186, 0x0013, 0x1150, 0x6004, -+ 0xa086, 0x0042, 0x190c, 0x1519, 0x080c, 0x7dca, 0x080c, 0x7ead, -+ 0x0005, 0xa186, 0x0027, 0x0118, 0xa186, 0x0014, 0x1180, 0x6004, -+ 0xa086, 0x0042, 0x190c, 0x1519, 0x2001, 0x0007, 0x080c, 0x52d7, -+ 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, 0x7ead, 0x0005, 0xa182, -+ 0x0040, 0x0002, 0xbb85, 0xbb85, 0xbb85, 0xbb85, 0xbb85, 0xbb85, -+ 0xbb85, 0xbb87, 0xbb93, 0xbb85, 0xbb85, 0xbb85, 0xbb85, 0xbb85, -+ 0xbb85, 0xbb85, 0xbb85, 0xbb85, 0xbb85, 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, 0x711c, -+ 0x00de, 0x0005, 0x0006, 0x00f6, 0x2c78, 0x080c, 0x56dc, 0x00fe, -+ 0x000e, 0x0120, 0x6003, 0x0002, 0x00de, 0x0005, 0x2009, 0xc60d, -+ 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, -+ 0x0021, 0x080c, 0x711e, 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, 0xbc07, 0xbc0e, 0xbc1a, 0xbc26, -+ 0xbc07, 0xbc07, 0xbc07, 0xbc35, 0xbc07, 0xbc09, 0xbc09, 0xbc07, -+ 0xbc07, 0xbc07, 0xbc07, 0xbc09, 0xbc07, 0xbc09, 0xbc07, 0x080c, -+ 0x1519, 0x6020, 0xd0dc, 0x090c, 0x1519, 0x0005, 0x6003, 0x0001, -+ 0x6106, 0x080c, 0x79b2, 0x0126, 0x2091, 0x8000, 0x080c, 0x7ead, -+ 0x012e, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x79b2, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x7ead, 0x012e, 0x0005, 0x6003, 0x0003, -+ 0x6106, 0x2c10, 0x080c, 0x2068, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x7a15, 0x080c, 0x7f87, 0x012e, 0x0005, 0xa016, 0x080c, 0x1870, -+ 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x00d6, 0xa182, 0x0040, -+ 0x0023, 0x00de, 0x003e, 0x012e, 0x0005, 0xbc55, 0xbc57, 0xbc69, -+ 0xbc84, 0xbc55, 0xbc55, 0xbc55, 0xbc99, 0xbc55, 0xbc55, 0xbc55, -+ 0xbc55, 0xbc55, 0xbc55, 0xbc55, 0xbc55, 0x080c, 0x1519, 0x6010, -+ 0x2068, 0x684c, 0xd0fc, 0x01f8, 0xa09c, 0x0003, 0xa39e, 0x0003, -+ 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, 0x79b2, 0x080c, 0x7ead, -+ 0x0498, 0x6010, 0x2068, 0x684c, 0xd0fc, 0x0168, 0xa09c, 0x0003, -+ 0xa39e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x080c, 0x79b2, -+ 0x080c, 0x7ead, 0x0408, 0x6013, 0x0000, 0x6017, 0x0000, 0x2019, -+ 0x0004, 0x080c, 0xc15a, 0x00c0, 0x6010, 0x2068, 0x684c, 0xd0fc, -+ 0x0d90, 0xa09c, 0x0003, 0xa39e, 0x0003, 0x0d68, 0x6003, 0x0003, -+ 0x6106, 0x2c10, 0x080c, 0x2068, 0x080c, 0x7a15, 0x080c, 0x7f87, -+ 0x0018, 0xa016, 0x080c, 0x1870, 0x0005, 0x080c, 0x7dca, 0x6110, -+ 0x81ff, 0x0158, 0x00d6, 0x2168, 0x080c, 0xc4f0, 0x0036, 0x2019, -+ 0x0029, 0x080c, 0xc15a, 0x003e, 0x00de, 0x080c, 0xae6d, 0x080c, -+ 0x7ead, 0x0005, 0x080c, 0x7e60, 0x6110, 0x81ff, 0x0158, 0x00d6, -+ 0x2168, 0x080c, 0xc4f0, 0x0036, 0x2019, 0x0029, 0x080c, 0xc15a, -+ 0x003e, 0x00de, 0x080c, 0xae6d, 0x080c, 0x7f87, 0x0005, 0xa182, -+ 0x0085, 0x0002, 0xbcd3, 0xbcd1, 0xbcd1, 0xbcdf, 0xbcd1, 0xbcd1, -+ 0xbcd1, 0x080c, 0x1519, 0x6003, 0x000b, 0x6106, 0x080c, 0x79b2, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x7ead, 0x012e, 0x0005, 0x0026, -+ 0x00e6, 0x080c, 0xc391, 0x0118, 0x080c, 0x95fc, 0x00d8, 0x2071, -+ 0xcc80, 0x7224, 0x6212, 0x7220, 0x080c, 0xc008, 0x0118, 0x6007, -+ 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0xa296, 0xffff, 0x1110, -+ 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, 0x79b2, 0x080c, 0x7ead, -+ 0x080c, 0x7f87, 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, 0x9643, 0x0050, 0x2001, 0x0007, 0x080c, -+ 0x52d7, 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, 0x7ead, 0x0005, -+ 0xbd2f, 0xbd31, 0xbd31, 0xbd2f, 0xbd2f, 0xbd2f, 0xbd2f, 0x080c, -+ 0x1519, 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, 0x7ead, 0x0005, -+ 0xa182, 0x0085, 0x0a0c, 0x1519, 0xa182, 0x008c, 0x1a0c, 0x1519, -+ 0xa182, 0x0085, 0x0002, 0xbd4a, 0xbd4a, 0xbd4a, 0xbd4c, 0xbd4a, -+ 0xbd4a, 0xbd4a, 0x080c, 0x1519, 0x0005, 0xa186, 0x0013, 0x0148, -+ 0xa186, 0x0014, 0x0130, 0xa186, 0x0027, 0x0118, 0x080c, 0x9643, -+ 0x0030, 0x080c, 0x7dca, 0x080c, 0xae6d, 0x080c, 0x7ead, 0x0005, -+ 0x0036, 0x080c, 0xc3fb, 0x603f, 0x0000, 0x2019, 0x000b, 0x0031, -+ 0x601f, 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, -+ 0x2091, 0x8000, 0x0086, 0x2c40, 0x0096, 0x2049, 0x0000, 0x080c, -+ 0x8fe2, 0x009e, 0x008e, 0x1578, 0x0076, 0x2c38, 0x080c, 0x9088, -+ 0x007e, 0x1548, 0x6000, 0xa086, 0x0000, 0x0528, 0x601c, 0xa086, -+ 0x0007, 0x0508, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1150, 0x080c, -+ 0xc3fb, 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x080c, -+ 0x1953, 0x6010, 0x2068, 0x080c, 0xacaa, 0x0110, 0x080c, 0xc15a, -+ 0x00de, 0x6013, 0x0000, 0x080c, 0xc3fb, 0x601f, 0x0007, 0x2001, -+ 0xc8fd, 0x2004, 0x6016, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, -+ 0x0036, 0x0156, 0x2079, 0xcc80, 0x7938, 0x783c, 0x080c, 0x29c7, -+ 0x15b0, 0x0016, 0x00c6, 0x080c, 0x5356, 0x1578, 0x001e, 0x002e, -+ 0x0026, 0x0016, 0x2019, 0x0029, 0x080c, 0x914b, 0x080c, 0x7b2f, -+ 0x0076, 0x2039, 0x0000, 0x080c, 0x7a27, 0x007e, 0x001e, 0x0076, -+ 0x2039, 0x0000, 0x080c, 0xbf10, 0x007e, 0x080c, 0x5557, 0x0026, -+ 0x6204, 0xa294, 0xff00, 0x8217, 0xa286, 0x0006, 0x0118, 0xa286, -+ 0x0004, 0x1118, 0x62a0, 0x080c, 0x2eff, 0x002e, 0x001e, 0x080c, -+ 0x4f60, 0x6612, 0x6516, 0xa006, 0x0010, 0x00ce, 0x001e, 0x015e, -+ 0x003e, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x0016, -+ 0x2009, 0xc621, 0x2104, 0xa086, 0x0074, 0x1904, 0xbe49, 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, -+ 0x5365, 0x00ce, 0x04c0, 0x2011, 0xcc96, 0xad98, 0x000a, 0x20a9, -+ 0x0004, 0x080c, 0xa11c, 0x1580, 0x2011, 0xcc9a, 0xad98, 0x0006, -+ 0x20a9, 0x0004, 0x080c, 0xa11c, 0x1538, 0x0046, 0x0016, 0x6aa0, -+ 0xa294, 0x00ff, 0x8227, 0xa006, 0x2009, 0xc653, 0x210c, 0xd1a4, -+ 0x0138, 0x2009, 0x0029, 0x080c, 0xc1a9, 0x6800, 0xc0e5, 0x6802, -+ 0x2019, 0x0029, 0x080c, 0x7b2f, 0x0076, 0x2039, 0x0000, 0x080c, -+ 0x7a27, 0x2c08, 0x080c, 0xbf10, 0x007e, 0x2001, 0x0007, 0x080c, -+ 0x52d7, 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, 0x5356, 0x1188, 0x2011, -+ 0xcc90, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa11c, 0x1140, -+ 0x2011, 0xcc94, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, 0xa11c, -+ 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00ce, 0x0005, 0x00c6, -+ 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, 0xcc83, 0x2204, -+ 0x8211, 0x220c, 0x080c, 0x29c7, 0x11a0, 0x080c, 0x5356, 0x1188, -+ 0x2011, 0xcc96, 0xac98, 0x000a, 0x20a9, 0x0004, 0x080c, 0xa11c, -+ 0x1140, 0x2011, 0xcc9a, 0xac98, 0x0006, 0x20a9, 0x0004, 0x080c, -+ 0xa11c, 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, 0xbf91, 0x0018, 0xa606, 0x0904, 0xbf91, 0x2100, -+ 0xac06, 0x0904, 0xbf88, 0x080c, 0xc1d1, 0x0904, 0xbf88, 0x671c, -+ 0xa786, 0x0001, 0x0904, 0xbfda, 0xa786, 0x0004, 0x0904, 0xbfda, -+ 0xa786, 0x0007, 0x05e8, 0x2500, 0xac06, 0x05d0, 0x2400, 0xac06, -+ 0x05b8, 0x080c, 0xc1e1, 0x15a0, 0x88ff, 0x0118, 0x6050, 0xa906, -+ 0x1578, 0x00d6, 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, -+ 0x1953, 0x001e, 0xa786, 0x0008, 0x1148, 0x080c, 0xaea8, 0x1130, -+ 0x080c, 0x9c22, 0x00de, 0x080c, 0xae6d, 0x00d0, 0x6010, 0x2068, -+ 0x080c, 0xacaa, 0x0190, 0xa786, 0x0003, 0x1528, 0x6837, 0x0103, -+ 0x6b4a, 0x6847, 0x0000, 0x080c, 0xc4f0, 0x0016, 0x080c, 0xaf1c, -+ 0x080c, 0x5823, 0x001e, 0x080c, 0xae61, 0x00de, 0x080c, 0xae6d, -+ 0xace0, 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1210, 0x0804, -+ 0xbf24, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, -+ 0x00ce, 0x00ee, 0x0005, 0xa786, 0x0006, 0x1150, 0xa386, 0x0005, -+ 0x0128, 0x080c, 0xc4f0, 0x080c, 0xc15a, 0x08f8, 0x00de, 0x0c00, -+ 0xa786, 0x0009, 0x1548, 0x6000, 0xa086, 0x0004, 0x1128, 0x00c6, -+ 0x080c, 0x7633, 0x00ce, 0x00e8, 0x6000, 0xa086, 0x0003, 0x11c8, -+ 0x080c, 0x7e60, 0x00e6, 0x00d6, 0x6110, 0x2168, 0x080c, 0xacaa, -+ 0x0140, 0x6018, 0x2070, 0x70b3, 0x0000, 0x70b7, 0x0000, 0x080c, -+ 0x5823, 0x00de, 0x00ee, 0x00c6, 0x080c, 0x95fc, 0x00ce, 0x080c, -+ 0x7f87, 0x00de, 0x0804, 0xbf88, 0xa786, 0x000a, 0x0904, 0xbf78, -+ 0x0804, 0xbf76, 0x080c, 0xc1e1, 0x1904, 0xbf88, 0x81ff, 0x0904, -+ 0xbf88, 0xa180, 0x0001, 0x2004, 0xa086, 0x0018, 0x0138, 0xa180, -+ 0x0001, 0x2004, 0xa086, 0x002d, 0x1904, 0xbf88, 0x6000, 0xa086, -+ 0x0002, 0x1904, 0xbf88, 0x080c, 0xae97, 0x0138, 0x080c, 0xaea8, -+ 0x1904, 0xbf88, 0x080c, 0x9c22, 0x0038, 0x080c, 0x2e6c, 0x080c, -+ 0xaea8, 0x1110, 0x080c, 0x9c22, 0x080c, 0xae6d, 0x0804, 0xbf88, -+ 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0xa006, 0x080c, 0xc17b, -+ 0x001e, 0x0120, 0x601c, 0xa084, 0x000f, 0x001b, 0x00ee, 0x00ce, -+ 0x0005, 0xc021, 0xc021, 0xc021, 0xc021, 0xc021, 0xc021, 0xc023, -+ 0xc021, 0xa006, 0x0005, 0x0046, 0x0016, 0x7018, 0xa080, 0x0028, -+ 0x2024, 0xa4a4, 0x00ff, 0x8427, 0x2c00, 0x2009, 0x0020, 0x080c, -+ 0xc1a9, 0x001e, 0x004e, 0x0036, 0x2019, 0x0002, 0x080c, 0xbd6e, -+ 0x003e, 0xa085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x5298, -+ 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0xc605, -+ 0x2011, 0xcc96, 0x080c, 0xa11c, 0x003e, 0x002e, 0x001e, 0x015e, -+ 0xa005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, -+ 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0xce00, 0x2079, -+ 0x0001, 0x8fff, 0x0904, 0xc0b0, 0x2071, 0xc600, 0x7648, 0x7068, -+ 0x8001, 0xa602, 0x1a04, 0xc0b0, 0x88ff, 0x0128, 0x2800, 0xac06, -+ 0x15b0, 0x2079, 0x0000, 0x080c, 0xc1d1, 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, -+ 0xc3fb, 0x601f, 0x0007, 0x2001, 0xc8fd, 0x2004, 0x6016, 0x080c, -+ 0x1953, 0x6010, 0x2068, 0x080c, 0xacaa, 0x0120, 0x0046, 0x080c, -+ 0xc15a, 0x004e, 0x00de, 0x080c, 0xae6d, 0x88ff, 0x1198, 0xace0, -+ 0x0018, 0x2001, 0xc617, 0x2004, 0xac02, 0x1210, 0x0804, 0xc061, -+ 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, 0x8fe2, 0x009e, 0x008e, 0x2039, -+ 0x0000, 0x080c, 0x9088, 0x080c, 0xc052, 0x005e, 0x007e, 0x0005, -+ 0x0026, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, -+ 0x20a9, 0x007f, 0x2009, 0x0000, 0x0016, 0x0036, 0x080c, 0x5356, -+ 0x11b0, 0x2c10, 0x0056, 0x0086, 0x2041, 0x0000, 0x2508, 0x2029, -+ 0x0001, 0x0096, 0x2049, 0x0000, 0x080c, 0x8fe2, 0x009e, 0x008e, -+ 0x2039, 0x0000, 0x080c, 0x9088, 0x080c, 0xc052, 0x005e, 0x003e, -+ 0x001e, 0x8108, 0x1f04, 0xc0e4, 0x015e, 0x00ce, 0x007e, 0x005e, -+ 0x004e, 0x002e, 0x0005, 0x0076, 0x0056, 0x6218, 0x0086, 0x2041, -+ 0x0000, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x2049, 0x0000, -+ 0x080c, 0x8fe2, 0x009e, 0x008e, 0x2039, 0x0000, 0x080c, 0x9088, -+ 0x2c20, 0x080c, 0xc052, 0x005e, 0x007e, 0x0005, 0x0026, 0x0046, -+ 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x007f, 0x2009, -+ 0x0000, 0x0016, 0x0036, 0x080c, 0x5356, 0x11c0, 0x2c10, 0x0086, -+ 0x2041, 0x0000, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, 0xc3dd, -+ 0x004e, 0x0096, 0x2049, 0x0000, 0x080c, 0x8fe2, 0x009e, 0x008e, -+ 0x2039, 0x0000, 0x080c, 0x9088, 0x080c, 0xc052, 0x003e, 0x001e, -+ 0x8108, 0x1f04, 0xc131, 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, 0x5823, 0x2f68, 0x0cb0, 0x6b52, 0x080c, 0x5823, -+ 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, 0xac9a, 0x2001, -+ 0x0000, 0x0120, 0x2200, 0xa080, 0x0014, 0x2004, 0x002e, 0x684a, -+ 0x6956, 0x6c46, 0x684f, 0x0000, 0x2001, 0xc905, 0x2004, 0x6852, -+ 0xa006, 0x68b2, 0x6802, 0x683a, 0x685a, 0x080c, 0x5823, 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, 0x79b2, 0x080c, -+ 0x7ead, 0x001e, 0x0005, 0xe000, 0xe000, 0x0005, 0x6020, 0xd0e4, -+ 0x0158, 0xd0cc, 0x0118, 0x080c, 0xaf85, 0x0030, 0x080c, 0xc3fb, -+ 0x080c, 0x711c, 0x080c, 0x95fc, 0x0005, 0xa280, 0x0007, 0x2004, -+ 0xa084, 0x000f, 0x0002, 0xc224, 0xc224, 0xc224, 0xc229, 0xc224, -+ 0xc226, 0xc226, 0xc224, 0xc226, 0xa006, 0x0005, 0x00c6, 0x2260, -+ 0x00ce, 0xa085, 0x0001, 0x0005, 0xa280, 0x0007, 0x2004, 0xa084, -+ 0x000f, 0x0002, 0xc23b, 0xc23b, 0xc23b, 0xc23b, 0xc23b, 0xc23b, -+ 0xc246, 0xc23b, 0xc23b, 0x6007, 0x003b, 0x602b, 0x0009, 0x6013, -+ 0x2a00, 0x6003, 0x0001, 0x080c, 0x79b2, 0x0005, 0x00c6, 0x2260, -+ 0x080c, 0xc3fb, 0x603f, 0x0000, 0x6020, 0xc0f4, 0xc0cc, 0x6022, -+ 0x6037, 0x0000, 0x00ce, 0x00d6, 0x2268, 0xa186, 0x0007, 0x1904, -+ 0xc2a1, 0x6810, 0xa005, 0x0138, 0xa080, 0x0013, 0x2004, 0xd0fc, -+ 0x1110, 0x00de, 0x08c0, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, -+ 0x79b2, 0x080c, 0x7ead, 0x00c6, 0x2d60, 0x6100, 0xa186, 0x0002, -+ 0x1904, 0xc32a, 0x6010, 0xa005, 0x1138, 0x6000, 0xa086, 0x0007, -+ 0x190c, 0x1519, 0x0804, 0xc32a, 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, 0xbbe4, 0x0804, 0xc32a, 0x2009, 0x0041, 0x0804, -+ 0xc324, 0xa186, 0x0005, 0x15f0, 0x6810, 0xa080, 0x0013, 0x2004, -+ 0xd0bc, 0x1118, 0x00de, 0x0804, 0xc23b, 0xd0b4, 0x0128, 0xd0fc, -+ 0x090c, 0x1519, 0x0804, 0xc259, 0x6007, 0x003a, 0x6003, 0x0001, -+ 0x080c, 0x79b2, 0x080c, 0x7ead, 0x00c6, 0x2d60, 0x6100, 0xa186, -+ 0x0002, 0x0120, 0xa186, 0x0004, 0x1904, 0xc32a, 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, 0xc324, 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, -+ 0x5823, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xbd6e, 0x2d00, -+ 0x600a, 0x601f, 0x0006, 0x6003, 0x0007, 0x6017, 0x0000, 0x603f, -+ 0x0000, 0x00de, 0x003e, 0x0038, 0x603f, 0x0000, 0x6003, 0x0007, -+ 0x080c, 0xbbe4, 0x00ce, 0x00de, 0x0005, 0xa186, 0x0013, 0x1128, -+ 0x6004, 0xa082, 0x0085, 0x2008, 0x00c2, 0xa186, 0x0027, 0x1178, -+ 0x080c, 0x7dca, 0x0036, 0x00d6, 0x6010, 0x2068, 0x2019, 0x0004, -+ 0x080c, 0xc15a, 0x00de, 0x003e, 0x080c, 0x7ead, 0x0005, 0xa186, -+ 0x0014, 0x0d70, 0x080c, 0x9643, 0x0005, 0xc356, 0xc354, 0xc354, -+ 0xc354, 0xc354, 0xc354, 0xc356, 0x080c, 0x1519, 0x080c, 0x7dca, -+ 0x6003, 0x000c, 0x080c, 0x7ead, 0x0005, 0xa182, 0x008c, 0x1220, -+ 0xa182, 0x0085, 0x0208, 0x001a, 0x080c, 0x9643, 0x0005, 0xc36e, -+ 0xc36e, 0xc36e, 0xc36e, 0xc370, 0xc38e, 0xc36e, 0x080c, 0x1519, -+ 0x00d6, 0x2c68, 0x080c, 0x95a6, 0x01a0, 0x6003, 0x0001, 0x6007, -+ 0x001e, 0x2009, 0xcc8e, 0x210c, 0x6136, 0x2009, 0xcc8f, 0x210c, -+ 0x613a, 0x600b, 0xffff, 0x6918, 0x611a, 0x601f, 0x0004, 0x080c, -+ 0x79b2, 0x2d60, 0x080c, 0x95fc, 0x00de, 0x0005, 0x080c, 0x95fc, -+ 0x0005, 0x00e6, 0x6018, 0x2070, 0x7000, 0xd0ec, 0x00ee, 0x0005, -+ 0x6010, 0xa08c, 0xf000, 0x0904, 0xc3dc, 0xa080, 0x0013, 0x200c, -+ 0xd1ec, 0x05d0, 0x2001, 0xc672, 0x2004, 0xd0ec, 0x05a8, 0x6003, -+ 0x0002, 0x6020, 0xc0e5, 0x6022, 0xd1ac, 0x0180, 0x00f6, 0x2c78, -+ 0x080c, 0x56d8, 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, 0x711c, -+ 0x080c, 0x95fc, 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, -+ 0xa11c, 0x1150, 0x2011, 0xcc94, 0x6018, 0xa098, 0x0006, 0x20a9, -+ 0x0004, 0x080c, 0xa11c, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, -+ 0x00e6, 0x2071, 0xc600, 0x080c, 0x4f1b, 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, 0x3e91, 0x080c, 0x5823, 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, 0xc4e3, 0x00de, 0x002e, 0x080c, 0x5823, 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, 0xc1d1, 0x01b8, 0x080c, 0xc1e1, -+ 0x11a0, 0x6000, 0xa086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1953, -+ 0x001e, 0x080c, 0xae97, 0x1110, 0x080c, 0x2e6c, 0x080c, 0xaea8, -+ 0x1110, 0x080c, 0x9c22, 0x080c, 0xae6d, 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, 0xaedc - }; - #ifdef UNIQUE_FW_NAME --unsigned short fw2200ip_length01 = 0xb5b9; -+unsigned short fw2200ip_length01 = 0xb5df; - #else --unsigned short risc_code_length01 = 0xb5b9; -+unsigned short risc_code_length01 = 0xb5df; - #endif - -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2300flx_fw.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2300flx_fw.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2300flx_fw.h 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2300flx_fw.h 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,6903 @@ -+/****************************************************************************** -+ * 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. -+ * -+ ******************************************************************************/ -+ -+/************************************************************************ -+ * * -+ * --- ISP2300 Initiator/Target Firmware --- * -+ * with Fabric (Public Loop), Point-point, * -+ * expanded LUN addressing for FCTAPE, and 2K port logins * -+ * FibreLite enabled * -+ * * -+ ********************************************************************** */ -+/* -+ * Firmware Version 3.02.28 (13:56 Apr 03, 2004) -+ */ -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2300flx_version = 3*1024+2; -+#else -+unsigned short risc_code_version = 3*1024+2; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned char fw2300flx_version_str[] = {3, 2,28}; -+#else -+unsigned char firmware_version[] = {3, 2,28}; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+#define fw2300flx_VERSION_STRING "3.02.28" -+#else -+#define FW_VERSION_STRING "3.02.28" -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2300flx_addr01 = 0x0800 ; -+#else -+unsigned short risc_code_addr01 = 0x0800 ; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2300flx_code01[] = { -+#else -+unsigned short risc_code01[] = { -+#endif -+ 0x0470, 0x0000, 0x0000, 0xd59a, 0x0000, 0x0003, 0x0002, 0x001c, -+ 0x0317, 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, 0x2e32, 0x3820, 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, 0x20c9, 0x1bff, 0x2059, 0x0000, 0x2b78, -+ 0x7883, 0x0004, 0x2089, 0x2b4e, 0x2051, 0x1800, 0x2a70, 0x20e1, -+ 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e2f, 0x2029, -+ 0x2480, 0x2031, 0xffff, 0x2039, 0x2450, 0x2021, 0x0050, 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, 0x756a, 0x766e, 0x7766, 0x7472, 0x7476, -+ 0x00e6, 0x2071, 0x1a98, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x716c, -+ 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001, -+ 0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x716c, 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, 0x0f03, 0x080c, -+ 0x5cdf, 0x080c, 0x9dc8, 0x080c, 0x10ba, 0x080c, 0x129f, 0x080c, -+ 0x1a53, 0x080c, 0x0d46, 0x080c, 0x103f, 0x080c, 0x3238, 0x080c, -+ 0x72aa, 0x080c, 0x661d, 0x080c, 0x7f73, 0x080c, 0x230a, 0x080c, -+ 0x82a0, 0x080c, 0x7933, 0x080c, 0x2147, 0x080c, 0x227b, 0x080c, -+ 0x22ff, 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, 0x1187, 0x2071, 0x1800, 0x7003, -+ 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, -+ 0x499e, 0x080c, 0x325f, 0x080c, 0x731b, 0x080c, 0x6add, 0x080c, -+ 0x7f9c, 0x080c, 0x2ab8, 0x0c68, 0x000b, 0x0c88, 0x0940, 0x0941, -+ 0x0ad8, 0x093e, 0x0b8f, 0x0d45, 0x0d45, 0x0d45, 0x080c, 0x0db4, -+ 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, -+ 0x1904, 0x0aab, 0x080c, 0x0e71, 0x080c, 0x6fb2, 0x0150, 0x080c, -+ 0x6fd5, 0x15a0, 0x2079, 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, -+ 0x0468, 0x080c, 0x6ee4, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aab, -+ 0x7094, 0x9086, 0x0028, 0x1904, 0x0aab, 0x080c, 0x7f6b, 0x080c, -+ 0x7f5d, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, 0x0100, 0x7827, -+ 0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, 0x2011, 0x6e33, 0x080c, -+ 0x8038, 0x2011, 0x6e26, 0x080c, 0x810c, 0x2011, 0x5b3a, 0x080c, -+ 0x8038, 0x2011, 0x8030, 0x901e, 0x7392, 0x04d0, 0x080c, 0x53e7, -+ 0x2079, 0x0100, 0x7844, 0x9005, 0x1904, 0x0aab, 0x2011, 0x5b3a, -+ 0x080c, 0x8038, 0x2011, 0x6e33, 0x080c, 0x8038, 0x2011, 0x6e26, -+ 0x080c, 0x810c, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, -+ 0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, 0x1977, 0x2004, 0x9005, -+ 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, 0x5c87, 0x00ce, 0x0804, -+ 0x0aab, 0x780f, 0x006b, 0x7a28, 0x080c, 0x6fba, 0x0118, 0x9295, -+ 0x5e2f, 0x0010, 0x9295, 0x402f, 0x7a2a, 0x2011, 0x8010, 0x73d4, -+ 0x2001, 0x1978, 0x2003, 0x0001, 0x080c, 0x297e, 0x080c, 0x48d9, -+ 0x7244, 0xc284, 0x7246, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, -+ 0x2102, 0x080c, 0x963f, 0x2011, 0x0004, 0x080c, 0xbb27, 0x080c, -+ 0x6461, 0x080c, 0x6fb2, 0x1120, 0x080c, 0x29c2, 0x02e0, 0x0400, -+ 0x080c, 0x5c8e, 0x0140, 0x7093, 0x0001, 0x70cf, 0x0000, 0x080c, -+ 0x55b4, 0x0804, 0x0aab, 0x080c, 0x5386, 0xd094, 0x0188, 0x2011, -+ 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x538a, 0xd0d4, 0x1118, -+ 0x080c, 0x29c2, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088, -+ 0x080c, 0x538a, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, -+ 0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x655a, -+ 0x0008, 0x2012, 0x080c, 0x6520, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, -+ 0x00a8, 0x707b, 0x0000, 0x080c, 0x6fb2, 0x1130, 0x70ac, 0x9005, -+ 0x1168, 0x080c, 0xbf63, 0x0050, 0x080c, 0xbf63, 0x70d8, 0xd09c, -+ 0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5c64, 0x70e3, 0x0000, -+ 0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x29ca, 0x0228, 0x2011, -+ 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x6fb2, 0x1178, -+ 0x9016, 0x0016, 0x2009, 0x0002, 0x2019, 0x193e, 0x211a, 0x001e, -+ 0x705b, 0xffff, 0x705f, 0x00ef, 0x707f, 0x0000, 0x0020, 0x2019, -+ 0x193e, 0x201b, 0x0000, 0x2079, 0x1853, 0x7804, 0xd0ac, 0x0108, -+ 0xc295, 0x72da, 0x080c, 0x6fb2, 0x0118, 0x9296, 0x0004, 0x0548, -+ 0x2011, 0x0001, 0x080c, 0xbb27, 0x70a7, 0x0000, 0x70ab, 0xffff, -+ 0x7003, 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, -+ 0x0003, 0x782a, 0x00fe, 0x080c, 0x2dbb, 0x2011, 0x0005, 0x080c, -+ 0x9771, 0x080c, 0x8973, 0x080c, 0x6fb2, 0x0148, 0x00c6, 0x2061, -+ 0x0100, 0x0016, 0x2009, 0x0002, 0x61e2, 0x001e, 0x00ce, 0x012e, -+ 0x0420, 0x70a7, 0x0000, 0x70ab, 0xffff, 0x7003, 0x0002, 0x00f6, -+ 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, -+ 0x00fe, 0x2011, 0x0005, 0x080c, 0x9771, 0x080c, 0x8973, 0x080c, -+ 0x6fb2, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002, -+ 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, -+ 0x080c, 0x6fb2, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, -+ 0x080c, 0x6fb2, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, -+ 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, -+ 0x090c, 0x30d5, 0x8108, 0x1f04, 0x0abf, 0x707b, 0x0000, 0x707c, -+ 0x9084, 0x00ff, 0x707e, 0x70af, 0x0000, 0x00be, 0x00ce, 0x0005, -+ 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, -+ 0x0b8c, 0x70a8, 0x9086, 0xffff, 0x0130, 0x080c, 0x2dbb, 0x080c, -+ 0x8973, 0x0804, 0x0b8c, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0540, -+ 0xd084, 0x0530, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, -+ 0xd08c, 0x01f0, 0x70dc, 0x9086, 0xffff, 0x01b0, 0x080c, 0x2f46, -+ 0x080c, 0x8973, 0x70d8, 0xd094, 0x1904, 0x0b8c, 0x2011, 0x0001, -+ 0x080c, 0xc212, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2f80, -+ 0x080c, 0x8973, 0x0804, 0x0b8c, 0x70e0, 0x9005, 0x1904, 0x0b8c, -+ 0x70a4, 0x9005, 0x1904, 0x0b8c, 0x70d8, 0xd0a4, 0x0118, 0xd0b4, -+ 0x0904, 0x0b8c, 0x080c, 0x6520, 0x1904, 0x0b8c, 0x080c, 0x6573, -+ 0x1904, 0x0b8c, 0x080c, 0x655a, 0x01c0, 0x0156, 0x00c6, 0x20a9, -+ 0x007f, 0x900e, 0x0016, 0x080c, 0x623e, 0x1118, 0xb800, 0xd0ec, -+ 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b32, 0x00ce, 0x015e, 0x0028, -+ 0x001e, 0x00ce, 0x015e, 0x0804, 0x0b8c, 0x0006, 0x2001, 0x0103, -+ 0x2003, 0x006b, 0x000e, 0x2011, 0x1984, 0x080c, 0x0f73, 0x2011, -+ 0x199e, 0x080c, 0x0f73, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, -+ 0x70ab, 0xffff, 0x080c, 0x0e53, 0x9006, 0x080c, 0x260c, 0x0036, -+ 0x0046, 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4a76, 0x004e, -+ 0x003e, 0x00f6, 0x2079, 0x0100, 0x080c, 0x6fd5, 0x0150, 0x080c, -+ 0x6fb2, 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, -+ 0x782a, 0x00fe, 0x2001, 0x19b9, 0x2004, 0x9086, 0x0005, 0x1120, -+ 0x2011, 0x0000, 0x080c, 0x9771, 0x2011, 0x0000, 0x080c, 0x977b, -+ 0x080c, 0x8973, 0x080c, 0x8a4e, 0x012e, 0x00be, 0x0005, 0x0016, -+ 0x0046, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, -+ 0x918c, 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5c4d, 0x7940, -+ 0x918c, 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, -+ 0xd19c, 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, -+ 0xd1ac, 0x1904, 0x0c1c, 0x2001, 0x1978, 0x2004, 0x9005, 0x1518, -+ 0x080c, 0x2a45, 0x1148, 0x2001, 0x0001, 0x080c, 0x29ad, 0x2001, -+ 0x0001, 0x080c, 0x2990, 0x00b8, 0x080c, 0x2a4d, 0x1138, 0x9006, -+ 0x080c, 0x29ad, 0x9006, 0x080c, 0x2990, 0x0068, 0x080c, 0x2a55, -+ 0x1d50, 0x2001, 0x1969, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, -+ 0x27a7, 0x0804, 0x0cfc, 0x080c, 0x6fc3, 0x0148, 0x080c, 0x6fd5, -+ 0x1118, 0x080c, 0x72a5, 0x0050, 0x080c, 0x6fba, 0x0dd0, 0x080c, -+ 0x72a0, 0x080c, 0x7296, 0x080c, 0x6ee4, 0x0058, 0x080c, 0x6fb2, -+ 0x0140, 0x2009, 0x00f8, 0x080c, 0x5c4d, 0x7843, 0x0090, 0x7843, -+ 0x0010, 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x6fb2, -+ 0x0138, 0x7824, 0xd0ac, 0x1904, 0x0d01, 0x1f04, 0x0bfb, 0x0070, -+ 0x7824, 0x080c, 0x6fcc, 0x0118, 0xd0ac, 0x1904, 0x0d01, 0x9084, -+ 0x1800, 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d01, 0x2001, 0x0001, -+ 0x080c, 0x260c, 0x0804, 0x0d14, 0x2001, 0x1978, 0x2004, 0x9005, -+ 0x1518, 0x080c, 0x2a45, 0x1148, 0x2001, 0x0001, 0x080c, 0x29ad, -+ 0x2001, 0x0001, 0x080c, 0x2990, 0x00b8, 0x080c, 0x2a4d, 0x1138, -+ 0x9006, 0x080c, 0x29ad, 0x9006, 0x080c, 0x2990, 0x0068, 0x080c, -+ 0x2a55, 0x1d50, 0x2001, 0x1969, 0x2004, 0xd0fc, 0x0108, 0x0020, -+ 0x080c, 0x27a7, 0x0804, 0x0cfc, 0x7850, 0x9085, 0x0040, 0x7852, -+ 0x7938, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2a5d, 0x9085, -+ 0x2000, 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c55, 0x080c, -+ 0x80ec, 0x1f04, 0x0c55, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, -+ 0x7852, 0x793a, 0x080c, 0x6fc3, 0x0148, 0x080c, 0x6fd5, 0x1118, -+ 0x080c, 0x72a5, 0x0050, 0x080c, 0x6fba, 0x0dd0, 0x080c, 0x72a0, -+ 0x080c, 0x7296, 0x080c, 0x6ee4, 0x0020, 0x2009, 0x00f8, 0x080c, -+ 0x5c4d, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c7b, 0x7850, 0x9085, -+ 0x1400, 0x7852, 0x080c, 0x6fb2, 0x0120, 0x7843, 0x0090, 0x7843, -+ 0x0010, 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x80ec, 0x7820, -+ 0xd09c, 0x1588, 0x080c, 0x6fb2, 0x0904, 0x0ce1, 0x7824, 0xd0ac, -+ 0x1904, 0x0d01, 0x080c, 0x6fd5, 0x1530, 0x0046, 0x2021, 0x0320, -+ 0x8421, 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2a5d, 0x7824, -+ 0x9084, 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, -+ 0x2004, 0x9084, 0x9000, 0x0110, 0x080c, 0x0d22, 0x8421, 0x1158, -+ 0x1d04, 0x0cbc, 0x080c, 0x80ec, 0x080c, 0x72a0, 0x080c, 0x7296, -+ 0x7003, 0x0001, 0x04f0, 0x8319, 0x1940, 0x1d04, 0x0cc9, 0x080c, -+ 0x80ec, 0x2009, 0x196c, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, -+ 0x1178, 0x200b, 0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, -+ 0x2a3e, 0x7924, 0x080c, 0x2a5d, 0xd19c, 0x0110, 0x080c, 0x297e, -+ 0x00d8, 0x080c, 0x6fc3, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, -+ 0x6f8a, 0x7003, 0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2a5d, -+ 0x7824, 0x080c, 0x6fcc, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, -+ 0x0950, 0x7003, 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x260c, -+ 0x0078, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, -+ 0x0002, 0x7906, 0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, -+ 0x7850, 0x9085, 0x0400, 0x7852, 0x2001, 0x1978, 0x2003, 0x0000, -+ 0x9006, 0x78f2, 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, -+ 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, 0x0d0c, 0x80ec, 0x015e, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x001e, -+ 0x000e, 0x0005, 0x00e6, 0x2071, 0x1894, 0x7004, 0x9086, 0x0001, -+ 0x1110, 0x080c, 0x325f, 0x00ee, 0x0005, 0x0005, 0x2a70, 0x2061, -+ 0x197c, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x001c, 0x600f, -+ 0x0317, 0x2001, 0x194d, 0x900e, 0x2102, 0x7192, 0x2001, 0x0100, -+ 0x2004, 0x9082, 0x0002, 0x0218, 0x705b, 0xffff, 0x0008, 0x715a, -+ 0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xbf63, 0x70e7, 0x00c0, -+ 0x2061, 0x193d, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, 0x600f, -+ 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, 0x07d0, -+ 0x2061, 0x1945, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, 0x0200, -+ 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, 0x195a, -+ 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, 0x2020, -+ 0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, 0x623e, 0x1178, -+ 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, 0xff00, -+ 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, 0x8108, -+ 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, 0x2079, -+ 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, 0x0db6, -+ 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, 0x1a72, 0x7a08, 0x226a, -+ 0x2069, 0x1a73, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, 0x782c, -+ 0x2019, 0x1a80, 0x201a, 0x2019, 0x1a83, 0x9016, 0x7808, 0xd09c, -+ 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1a98, 0x0108, -+ 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, 0x1a81, -+ 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, 0x1a52, -+ 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, 0x8318, -+ 0x1f04, 0x0e03, 0x002e, 0x003e, 0x00de, 0x015e, 0x2079, 0x1800, -+ 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, -+ 0x0180, 0x2001, 0x19ea, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, -+ 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, -+ 0x1001, 0x080c, 0x5395, 0x1108, 0x0099, 0x0cd8, 0x0005, 0x918c, -+ 0x03ff, 0x2001, 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, -+ 0x2800, 0x0010, 0x918d, 0x2000, 0x2001, 0x017f, 0x2102, 0x0005, -+ 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, 0x0ecb, 0x20a9, 0x0900, -+ 0x080c, 0x0eec, 0x2011, 0x0040, 0x080c, 0x0ecb, 0x20a9, 0x0900, -+ 0x080c, 0x0eec, 0x0c78, 0x0026, 0x080c, 0x0ed8, 0x1118, 0x2011, -+ 0x0040, 0x0098, 0x2011, 0x010e, 0x2214, 0x9294, 0x0007, 0x9296, -+ 0x0007, 0x0118, 0x2011, 0xa880, 0x0010, 0x2011, 0x6840, 0xd0e4, -+ 0x70eb, 0x0000, 0x1128, 0x70eb, 0x0fa0, 0x080c, 0x0edd, 0x002e, -+ 0x0005, 0x0026, 0x080c, 0x0ed8, 0x0128, 0xd0a4, 0x1138, 0x2011, -+ 0xcdd5, 0x0010, 0x2011, 0x0080, 0x080c, 0x0edd, 0x002e, 0x0005, -+ 0x0026, 0x70eb, 0x0000, 0x080c, 0x0ed8, 0x1148, 0x080c, 0x2a55, -+ 0x1118, 0x2011, 0x8484, 0x0058, 0x2011, 0x8282, 0x0040, 0x080c, -+ 0x2a55, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, 0x080c, -+ 0x0edd, 0x002e, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1800, 0xd0b4, -+ 0x70e4, 0x1110, 0xc0e4, 0x0048, 0x0006, 0x3b00, 0x9084, 0xff3f, -+ 0x20d8, 0x000e, 0x70eb, 0x0000, 0xc0e5, 0x0079, 0x000e, 0x00ee, -+ 0x0005, 0x00e6, 0x2071, 0x1800, 0xd0e4, 0x70e4, 0x1110, 0xc0dc, -+ 0x0008, 0xc0dd, 0x0011, 0x00ee, 0x0005, 0x70e6, 0x7000, 0x9084, -+ 0x0007, 0x000b, 0x0005, 0x0e9a, 0x0e71, 0x0e71, 0x0e53, 0x0e80, -+ 0x0e71, 0x0e71, 0x0e80, 0x0016, 0x3b08, 0x3a00, 0x9104, 0x918d, -+ 0x00c0, 0x21d8, 0x9084, 0xff3f, 0x9205, 0x20d0, 0x001e, 0x0005, -+ 0x2001, 0x1839, 0x2004, 0xd0dc, 0x0005, 0x9e86, 0x1800, 0x190c, -+ 0x0db4, 0x70e4, 0xd0e4, 0x0108, 0xc2e5, 0x72e6, 0xd0e4, 0x1118, -+ 0x9294, 0x00c0, 0x0c01, 0x0005, 0x1d04, 0x0eec, 0x2091, 0x6000, -+ 0x1f04, 0x0eec, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, -+ 0x918c, 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, -+ 0x894d, 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, -+ 0x1883, 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, 0x1893, 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, -+ 0x0ef3, 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, -+ 0x0036, 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, -+ 0x1dd8, 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff, 0x11c0, -+ 0x9006, 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, -+ 0x4001, 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, -+ 0x4001, 0x7078, 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002, 0x4001, -+ 0x9298, 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d94, 0x2001, 0x0000, -+ 0x810f, 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, -+ 0xa807, 0x0000, 0x0006, 0x080c, 0x101d, 0x009e, 0x0cb0, 0x0005, -+ 0x00e6, 0x2071, 0x1800, 0x080c, 0x1096, 0x090c, 0x0db4, 0x00ee, -+ 0x0005, 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, -+ 0x8000, 0x00c9, 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016, 0x9045, -+ 0x0158, 0x8210, 0x9906, 0x090c, 0x0db4, 0x2300, 0x9202, 0x0120, -+ 0x1a0c, 0x0db4, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, -+ 0x00ee, 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x1906, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, -+ 0x0128, 0x9906, 0x090c, 0x0db4, 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, 0x080c, 0x7f5d, 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, 0x1883, -+ 0x7000, 0x9005, 0x11a0, 0x2001, 0x0492, 0xa802, 0x2048, 0x2009, -+ 0x2480, 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, -+ 0x9886, 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, -+ 0x1883, 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, 0x0492, 0x0288, 0x9982, -+ 0x0800, 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x1883, -+ 0x7010, 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, -+ 0x9006, 0x0cd8, 0x00e6, 0x2071, 0x19e9, 0x7007, 0x0000, 0x9006, -+ 0x701e, 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, -+ 0x7012, 0x2071, 0x0080, 0x9006, 0x20a9, 0x0040, 0x7022, 0x1f04, -+ 0x10ce, 0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, -+ 0x00e6, 0xa06f, 0x0000, 0x2071, 0x19e9, 0x701c, 0x9088, 0x19f3, -+ 0x280a, 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, -+ 0x0db4, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, -+ 0x00fe, 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, -+ 0x2071, 0x19e9, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, -+ 0x0021, 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, -+ 0x1110, 0x7007, 0x0006, 0x7000, 0x0002, 0x1117, 0x1115, 0x1115, -+ 0x1115, 0x128e, 0x128e, 0x128e, 0x128e, 0x080c, 0x0db4, 0x701c, -+ 0x7120, 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, -+ 0x1110, 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19f3, 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, -+ 0x19e9, 0x2104, 0xc095, 0x200a, 0x080c, 0x10f4, 0x0005, 0x0016, -+ 0x00e6, 0x2071, 0x19e9, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, -+ 0x190c, 0x0dad, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, -+ 0x7004, 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1105, 0x11ad, -+ 0x11e1, 0x0db4, 0x0db4, 0x129a, 0x0db4, 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, 0x114a, 0x0005, 0x7008, -+ 0x0096, 0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, -+ 0x1105, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, -+ 0x0ca0, 0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, -+ 0x7802, 0x7804, 0x7806, 0x080c, 0x115f, 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, 0x18af, 0x2004, 0x9906, 0x1128, -+ 0xa89c, 0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, -+ 0x00d6, 0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, -+ 0x080f, 0x008e, 0x00de, 0x009e, 0x080c, 0x10f4, 0x0005, 0x00de, -+ 0x009e, 0x080c, 0x10f4, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, -+ 0xa0a0, 0x904d, 0x090c, 0x0db4, 0xa06c, 0x908e, 0x0100, 0x0130, -+ 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x687f, -+ 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x101d, 0x009e, -+ 0x0005, 0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0db4, 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, 0x10d5, 0x00e8, 0xa97c, -+ 0xa894, 0x0016, 0x0006, 0x080c, 0x687f, 0x000e, 0x001e, 0xd1fc, -+ 0x1138, 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0x9e32, 0x00ce, -+ 0x7008, 0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x101d, -+ 0x7007, 0x0000, 0x080c, 0x10f4, 0x00ae, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, -+ 0x012e, 0x0005, 0x7007, 0x0000, 0x080c, 0x1105, 0x0005, 0x0126, -+ 0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1a33, 0x7003, 0x0000, -+ 0x78bf, 0x00f6, 0x781b, 0x4800, 0x00c1, 0x7803, 0x0003, 0x780f, -+ 0x0000, 0x20a9, 0x0254, 0x2061, 0xd8e3, 0x2c0d, 0x7912, 0xe104, -+ 0x9ce0, 0x0002, 0x7916, 0x1f04, 0x12b5, 0x7807, 0x0007, 0x7803, -+ 0x0000, 0x7803, 0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, -+ 0x7808, 0xd09c, 0x0110, 0x7820, 0x0cd8, 0x2001, 0x1a34, 0x2003, -+ 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, -+ 0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, -+ 0x782b, 0x1a52, 0x781f, 0xff00, 0x781b, 0xb700, 0x2001, 0x0200, -+ 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a52, 0x602f, -+ 0x1cd0, 0x2001, 0x1819, 0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b, -+ 0x1f26, 0x2001, 0x3138, 0xd0fc, 0x190c, 0x0db4, 0x2001, 0x0003, -+ 0x2004, 0xd0d4, 0x1118, 0x783f, 0x3138, 0x0020, 0x9084, 0xc000, -+ 0x783f, 0xb138, 0x00ce, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, -+ 0x9184, 0x0070, 0x190c, 0x0dad, 0xd19c, 0x0158, 0x7820, 0x908c, -+ 0xf000, 0x15e8, 0x908a, 0x0024, 0x1a0c, 0x0db4, 0x0023, 0x012e, -+ 0x0005, 0x012e, 0x0005, 0x1347, 0x1347, 0x135e, 0x1363, 0x1367, -+ 0x136c, 0x1394, 0x1398, 0x13a6, 0x13aa, 0x1347, 0x1434, 0x1438, -+ 0x149b, 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, -+ 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x136e, 0x1347, -+ 0x1347, 0x1347, 0x1347, 0x1347, 0x1347, 0x134b, 0x1349, 0x080c, -+ 0x0db4, 0x080c, 0x0dad, 0x080c, 0x14a2, 0x2009, 0x1a4b, 0x2104, -+ 0x8000, 0x200a, 0x080c, 0x7a07, 0x080c, 0x1958, 0x0005, 0x2009, -+ 0x0048, 0x2060, 0x080c, 0x9eac, 0x012e, 0x0005, 0x7004, 0xc085, -+ 0xc0b5, 0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, -+ 0x14a2, 0x080c, 0x15de, 0x0005, 0x080c, 0x0db4, 0x080c, 0x14a2, -+ 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, -+ 0x0048, 0x080c, 0x9eac, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, -+ 0x03e8, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, -+ 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x14a7, 0x2001, -+ 0x0307, 0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, -+ 0x080c, 0x14a2, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, -+ 0x009e, 0x2009, 0x0048, 0x080c, 0x9eac, 0x0005, 0x080c, 0x14a2, -+ 0x080c, 0x0db4, 0x080c, 0x14a2, 0x080c, 0x141f, 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, 0x0db4, 0x2001, 0x020d, 0x2003, -+ 0x0050, 0x2003, 0x0020, 0x0480, 0x78ab, 0x0004, 0x7803, 0x0001, -+ 0x080c, 0x1438, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, -+ 0x0db4, 0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, -+ 0x080c, 0x7a07, 0x080c, 0x1958, 0x080c, 0xbb17, 0x0158, 0xa9ac, -+ 0xa936, 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, -+ 0xc0bd, 0xa882, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0bc, 0x6024, 0x190c, 0xbefc, 0x2029, 0x00c8, 0x8529, 0x0128, -+ 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xd88c, -+ 0xd5a4, 0x1118, 0x080c, 0x14a7, 0x0005, 0x080c, 0x7a07, 0x080c, -+ 0x1958, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, -+ 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, -+ 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x1518, 0x00fe, -+ 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, -+ 0x7104, 0x9184, 0x0004, 0x190c, 0x0db4, 0xd184, 0x1189, 0xd19c, -+ 0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, -+ 0x0020, 0x080c, 0x14a7, 0x0005, 0x81ff, 0x190c, 0x0db4, 0x0005, -+ 0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15e0, 0x2071, -+ 0x0200, 0x080c, 0x15d2, 0x6014, 0x9005, 0x05a8, 0x0096, 0x2048, -+ 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, -+ 0x0048, 0x1548, 0x601c, 0xd084, 0x11d8, 0x00f6, 0x2c78, 0x080c, -+ 0x1648, 0x00fe, 0x00a8, 0x00f6, 0x2c78, 0x080c, 0x1790, 0x00fe, -+ 0x2009, 0x01f4, 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, -+ 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040, -+ 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x12c5, 0x7803, 0x0001, -+ 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, -+ 0x0020, 0x0069, 0x0ca8, 0x0031, 0x2060, 0x2009, 0x0053, 0x080c, -+ 0x9eac, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, -+ 0x141f, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510, -+ 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, -+ 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841, -+ 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, -+ 0x080c, 0x150a, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, -+ 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, -+ 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, -+ 0x7a07, 0x080c, 0x1958, 0x0090, 0x7827, 0x0015, 0x782b, 0x0000, -+ 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, 0x0020, -+ 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, 0x0005, -+ 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 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, 0x130c, 0x00ce, 0x002e, 0x001e, 0x000e, -+ 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, -+ 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, -+ 0x080c, 0x0db4, 0x2009, 0x180c, 0x2104, 0xc0f4, 0x200a, 0x2009, -+ 0xff00, 0x8109, 0x0904, 0x1596, 0x7a18, 0x9284, 0x0030, 0x0904, -+ 0x1591, 0x9284, 0x0048, 0x9086, 0x0008, 0x1904, 0x1591, 0x2001, -+ 0x0109, 0x2004, 0xd08c, 0x01f0, 0x0006, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x0126, 0x2091, 0x2800, 0x00f6, 0x0026, 0x0016, -+ 0x2009, 0x1a4d, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x83aa, -+ 0x001e, 0x002e, 0x00fe, 0x012e, 0x015e, 0x014e, 0x013e, 0x01de, -+ 0x01ce, 0x000e, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x01d0, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x00f6, 0x0016, -+ 0x2009, 0x1a4e, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x1d4a, -+ 0x001e, 0x00fe, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, -+ 0x000e, 0x7818, 0xd0bc, 0x1904, 0x1541, 0x0005, 0x2001, 0x180c, -+ 0x2004, 0xd0f4, 0x1528, 0x7a18, 0x9284, 0x0030, 0x0508, 0x9284, -+ 0x0048, 0x9086, 0x0008, 0x11e0, 0x2001, 0x19c7, 0x2004, 0x9005, -+ 0x01b8, 0x2001, 0x1a36, 0x2004, 0x9086, 0x0000, 0x0188, 0x2009, -+ 0x1a4c, 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x9430, 0x2009, -+ 0x180c, 0x2104, 0xc0f5, 0x200a, 0x2009, 0xff00, 0x0804, 0x1541, -+ 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, -+ 0x080c, 0x153a, 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, -+ 0x080c, 0x0db4, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, -+ 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, -+ 0x2071, 0x0200, 0x0c79, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, -+ 0x0904, 0x163d, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, -+ 0x0904, 0x163d, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, -+ 0x00ce, 0x918e, 0x0039, 0x1904, 0x163d, 0x9c06, 0x15f0, 0x0126, -+ 0x2091, 0x2600, 0x080c, 0x794e, 0x012e, 0x7358, 0x745c, 0x6014, -+ 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0bc, 0x190c, 0xbed7, 0xab42, 0xac3e, 0x2001, 0x1875, 0x2004, -+ 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, -+ 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, -+ 0x080c, 0x1f46, 0x1190, 0x080c, 0x17eb, 0x2a00, 0xa816, 0x0130, -+ 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, -+ 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, -+ 0x0020, 0x001e, 0x00ee, 0x080c, 0x14a7, 0x0005, 0x080c, 0x0db4, -+ 0x0016, 0x2009, 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, -+ 0x001e, 0x2ff0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, -+ 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, -+ 0x000f, 0x9088, 0x1f26, 0x2165, 0x0002, 0x167c, 0x16c9, 0x167c, -+ 0x167c, 0x167c, 0x16ab, 0x167c, 0x1680, 0x1675, 0x16c0, 0x167c, -+ 0x167c, 0x167c, 0x1785, 0x1694, 0x168a, 0xa964, 0x918c, 0x00ff, -+ 0x918e, 0x0048, 0x0904, 0x16c0, 0x9085, 0x0001, 0x0804, 0x177c, -+ 0xa87c, 0xd0bc, 0x0dc8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, -+ 0x0804, 0x16d0, 0xa87c, 0xd0bc, 0x0d78, 0xa890, 0xa842, 0xa88c, -+ 0xa83e, 0xa888, 0x0804, 0x171f, 0xa87c, 0xd0bc, 0x0d28, 0xa890, -+ 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0db4, 0xa164, -+ 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1f26, 0x2065, 0xa888, 0xd19c, -+ 0x1904, 0x171f, 0x0428, 0xa87c, 0xd0ac, 0x0970, 0xa804, 0x9045, -+ 0x090c, 0x0db4, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1f26, -+ 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x171f, 0x0080, -+ 0xa87c, 0xd0ac, 0x0904, 0x167c, 0x9006, 0xa842, 0xa83e, 0x0804, -+ 0x171f, 0xa87c, 0xd0ac, 0x0904, 0x167c, 0x9006, 0xa842, 0xa83e, -+ 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002, -+ 0x16f3, 0x16f3, 0x16f5, 0x16f3, 0x16f3, 0x16f3, 0x16fb, 0x16f3, -+ 0x16f3, 0x16f3, 0x1701, 0x16f3, 0x16f3, 0x16f3, 0x1707, 0x16f3, -+ 0x16f3, 0x16f3, 0x170d, 0x16f3, 0x16f3, 0x16f3, 0x1713, 0x16f3, -+ 0x16f3, 0x16f3, 0x1719, 0x080c, 0x0db4, 0xa574, 0xa478, 0xa37c, -+ 0xa280, 0x0804, 0x1764, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, -+ 0x1764, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1764, 0xa5a4, -+ 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1764, 0xa5b4, 0xa4b8, 0xa3bc, -+ 0xa2c0, 0x0804, 0x1764, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, -+ 0x1764, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1764, 0x2c05, -+ 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002, 0x1742, -+ 0x1740, 0x1740, 0x1740, 0x1740, 0x1740, 0x1749, 0x1740, 0x1740, -+ 0x1740, 0x1740, 0x1740, 0x1750, 0x1740, 0x1740, 0x1740, 0x1740, -+ 0x1740, 0x1757, 0x1740, 0x1740, 0x1740, 0x1740, 0x1740, 0x175e, -+ 0x080c, 0x0db4, 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, 0x1158, 0x3e60, 0x601c, 0xc085, 0x601e, -+ 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, 0x2800, -+ 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c78, 0x0804, 0x167c, 0x0016, -+ 0x2009, 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, -+ 0x2ff0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048, -+ 0x2940, 0xa80e, 0x2061, 0x1f21, 0xa813, 0x1f21, 0x2c05, 0xa80a, -+ 0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0db4, 0x9006, 0xa842, -+ 0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0xadcc, 0xacd0, -+ 0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, -+ 0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0xa864, -+ 0x9084, 0x00ff, 0x9086, 0x0008, 0x1120, 0x8109, 0xa916, 0x0128, -+ 0x0078, 0x918a, 0x0002, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085, -+ 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, -+ 0xa804, 0x9045, 0x090c, 0x0db4, 0xa80e, 0xa064, 0xa81a, 0x9084, -+ 0x000f, 0x9080, 0x1f26, 0x2015, 0x82ff, 0x090c, 0x0db4, 0xaa12, -+ 0x2205, 0xa80a, 0x0c10, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, -+ 0x2d00, 0x0002, 0x18e0, 0x1842, 0x1842, 0x18e0, 0x18e0, 0x18da, -+ 0x18e0, 0x1842, 0x1891, 0x1891, 0x1891, 0x18e0, 0x18e0, 0x18e0, -+ 0x18d7, 0x1891, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, -+ 0xdd9c, 0x0904, 0x18e2, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, -+ 0x9082, 0x001b, 0x0002, 0x182e, 0x182c, 0x182c, 0x182c, 0x182c, -+ 0x182c, 0x1832, 0x182c, 0x182c, 0x182c, 0x182c, 0x182c, 0x1836, -+ 0x182c, 0x182c, 0x182c, 0x182c, 0x182c, 0x183a, 0x182c, 0x182c, -+ 0x182c, 0x182c, 0x182c, 0x183e, 0x080c, 0x0db4, 0xa774, 0xa678, -+ 0x0804, 0x18e2, 0xa78c, 0xa690, 0x0804, 0x18e2, 0xa7a4, 0xa6a8, -+ 0x0804, 0x18e2, 0xa7bc, 0xa6c0, 0x0804, 0x18e2, 0xa7d4, 0xa6d8, -+ 0x0804, 0x18e2, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082, -+ 0x001b, 0x0002, 0x1865, 0x1865, 0x1867, 0x1865, 0x1865, 0x1865, -+ 0x186d, 0x1865, 0x1865, 0x1865, 0x1873, 0x1865, 0x1865, 0x1865, -+ 0x1879, 0x1865, 0x1865, 0x1865, 0x187f, 0x1865, 0x1865, 0x1865, -+ 0x1885, 0x1865, 0x1865, 0x1865, 0x188b, 0x080c, 0x0db4, 0xa574, -+ 0xa478, 0xa37c, 0xa280, 0x0804, 0x18e2, 0xa584, 0xa488, 0xa38c, -+ 0xa290, 0x0804, 0x18e2, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, -+ 0x18e2, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x18e2, 0xa5b4, -+ 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x18e2, 0xa5c4, 0xa4c8, 0xa3cc, -+ 0xa2d0, 0x0804, 0x18e2, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, -+ 0x18e2, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, -+ 0x0002, 0x18b4, 0x18b2, 0x18b2, 0x18b2, 0x18b2, 0x18b2, 0x18bb, -+ 0x18b2, 0x18b2, 0x18b2, 0x18b2, 0x18b2, 0x18c2, 0x18b2, 0x18b2, -+ 0x18b2, 0x18b2, 0x18b2, 0x18c9, 0x18b2, 0x18b2, 0x18b2, 0x18b2, -+ 0x18b2, 0x18d0, 0x080c, 0x0db4, 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, 0x1ede, 0x1904, 0x17eb, 0x900e, 0x0050, -+ 0x080c, 0x0db4, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, -+ 0x080c, 0x1ede, 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, 0x9eac, 0x0005, 0x0126, 0x00c6, 0x2091, -+ 0x2200, 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, -+ 0x9186, 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, -+ 0x0008, 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, -+ 0x130c, 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, -+ 0x00c6, 0x7808, 0xd09c, 0x190c, 0x130c, 0x00ce, 0x2001, 0x0038, -+ 0x080c, 0x19e5, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, -+ 0x190c, 0x0db4, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, -+ 0x080c, 0x19f4, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x19e1, -+ 0x7827, 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, -+ 0x00f6, 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, -+ 0x080c, 0x6fb2, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, -+ 0x0160, 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, -+ 0x1de0, 0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x7062, 0x006e, -+ 0x0005, 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, -+ 0x2202, 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2a69, 0x2009, -+ 0x003c, 0x080c, 0x2268, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, -+ 0x9084, 0x003c, 0x1de0, 0x080c, 0x7f5d, 0x70a0, 0x70a2, 0x7098, -+ 0x709a, 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, -+ 0x2079, 0x0300, 0x080c, 0x12c5, 0x7803, 0x0001, 0x00fe, 0x00ee, -+ 0x0005, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, -+ 0x202c, 0x2003, 0x0000, 0x080c, 0x6fb2, 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, 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, -+ 0x1518, 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15c3, 0x7930, -+ 0x0005, 0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, -+ 0x0007, 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, -+ 0x1a52, 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0db4, -+ 0x781f, 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, -+ 0x0c01, 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, -+ 0x0891, 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, -+ 0x0101, 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, -+ 0x0040, 0x0140, 0x2001, 0x0030, 0x080c, 0x19eb, 0x9186, 0x0040, -+ 0x190c, 0x0db4, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, -+ 0xd1c4, 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, -+ 0x00de, 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, -+ 0x0100, 0x791c, 0x9184, 0x0007, 0x090c, 0x0db4, 0xa001, 0xa001, -+ 0x781f, 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2071, 0x1a36, -+ 0x2079, 0x0090, 0x012e, 0x0005, 0x9280, 0x0005, 0x2004, 0x2048, -+ 0xa97c, 0xd1dc, 0x1904, 0x1ae7, 0xa964, 0x9184, 0x0007, 0x0002, -+ 0x1a70, 0x1ad2, 0x1a87, 0x1a87, 0x1a87, 0x1aba, 0x1a9a, 0x1a89, -+ 0x918c, 0x00ff, 0x9186, 0x0008, 0x1170, 0xa87c, 0xd0b4, 0x0904, -+ 0x1d05, 0x9006, 0xa842, 0xa83e, 0xa988, 0x2900, 0xa85a, 0xa813, -+ 0x1f21, 0x0804, 0x1ae3, 0x9186, 0x0048, 0x0904, 0x1ad2, 0x080c, -+ 0x0db4, 0xa87c, 0xd0b4, 0x0904, 0x1d05, 0xa890, 0xa842, 0xa83a, -+ 0xa88c, 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa988, -+ 0x0804, 0x1ada, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1d38, -+ 0xa87c, 0xd0b4, 0x0904, 0x1d05, 0xa890, 0xa842, 0xa83a, 0xa88c, -+ 0xa83e, 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa804, 0xa85a, -+ 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, 0x1f26, 0x2005, 0xa812, -+ 0xa988, 0x0448, 0x918c, 0x00ff, 0x9186, 0x0015, 0x1540, 0xa87c, -+ 0xd0b4, 0x0904, 0x1d05, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, -+ 0x000f, 0x9080, 0x1f26, 0x2005, 0xa812, 0xa988, 0x9006, 0xa842, -+ 0xa83e, 0x0088, 0xa87c, 0xd0b4, 0x0904, 0x1d05, 0xa988, 0x9006, -+ 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa864, 0x9084, 0x000f, 0x9080, -+ 0x1f26, 0x2005, 0xa812, 0xa916, 0xa87c, 0xc0dd, 0xa87e, 0x0005, -+ 0x00f6, 0x2079, 0x0090, 0x782c, 0xd0fc, 0x190c, 0x1d4a, 0x00e6, -+ 0x2071, 0x1a36, 0x7000, 0x9005, 0x1904, 0x1b50, 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, 0x1500, 0xa93c, 0xa834, 0x9106, 0x11e0, 0x0006, -+ 0x0016, 0xa938, 0xa834, 0x9105, 0x0118, 0x001e, 0x000e, 0x0098, -+ 0x001e, 0x000e, 0x8aff, 0x01c8, 0x0126, 0x2091, 0x8000, 0x2009, -+ 0x0306, 0x200b, 0x0808, 0x00d9, 0x0108, 0x00c9, 0x012e, 0x9006, -+ 0x00ee, 0x00fe, 0x0005, 0x0036, 0x0046, 0xab38, 0xac34, 0x080c, -+ 0x1f46, 0x004e, 0x003e, 0x0d30, 0x0c98, 0x9085, 0x0001, 0x0c80, -+ 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, 0x0000, 0x0005, 0x0076, -+ 0x0066, 0x0056, 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1cfe, -+ 0x700c, 0x7214, 0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1cfd, -+ 0x9705, 0x0904, 0x1cfd, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, -+ 0x2d00, 0x0002, 0x1c92, 0x1bd2, 0x1bd2, 0x1c92, 0x1c92, 0x1c6f, -+ 0x1c92, 0x1bd2, 0x1c76, 0x1c21, 0x1c21, 0x1c92, 0x1c92, 0x1c92, -+ 0x1c69, 0x1c21, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, -+ 0xdd9c, 0x0904, 0x1c94, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, -+ 0x9082, 0x001b, 0x0002, 0x1bbe, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, -+ 0x1bbc, 0x1bc2, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bc6, -+ 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bbc, 0x1bca, 0x1bbc, 0x1bbc, -+ 0x1bbc, 0x1bbc, 0x1bbc, 0x1bce, 0x080c, 0x0db4, 0xa774, 0xa678, -+ 0x0804, 0x1c94, 0xa78c, 0xa690, 0x0804, 0x1c94, 0xa7a4, 0xa6a8, -+ 0x0804, 0x1c94, 0xa7bc, 0xa6c0, 0x0804, 0x1c94, 0xa7d4, 0xa6d8, -+ 0x0804, 0x1c94, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082, -+ 0x001b, 0x0002, 0x1bf5, 0x1bf5, 0x1bf7, 0x1bf5, 0x1bf5, 0x1bf5, -+ 0x1bfd, 0x1bf5, 0x1bf5, 0x1bf5, 0x1c03, 0x1bf5, 0x1bf5, 0x1bf5, -+ 0x1c09, 0x1bf5, 0x1bf5, 0x1bf5, 0x1c0f, 0x1bf5, 0x1bf5, 0x1bf5, -+ 0x1c15, 0x1bf5, 0x1bf5, 0x1bf5, 0x1c1b, 0x080c, 0x0db4, 0xa574, -+ 0xa478, 0xa37c, 0xa280, 0x0804, 0x1c94, 0xa584, 0xa488, 0xa38c, -+ 0xa290, 0x0804, 0x1c94, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, -+ 0x1c94, 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1c94, 0xa5b4, -+ 0xa4b8, 0xa3bc, 0xa2c0, 0x0804, 0x1c94, 0xa5c4, 0xa4c8, 0xa3cc, -+ 0xa2d0, 0x0804, 0x1c94, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, -+ 0x1c94, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, -+ 0x0002, 0x1c44, 0x1c42, 0x1c42, 0x1c42, 0x1c42, 0x1c42, 0x1c4c, -+ 0x1c42, 0x1c42, 0x1c42, 0x1c42, 0x1c42, 0x1c54, 0x1c42, 0x1c42, -+ 0x1c42, 0x1c42, 0x1c42, 0x1c5b, 0x1c42, 0x1c42, 0x1c42, 0x1c42, -+ 0x1c42, 0x1c62, 0x080c, 0x0db4, 0xa56c, 0xa470, 0xa774, 0xa678, -+ 0xa37c, 0xa280, 0x0804, 0x1c94, 0xa584, 0xa488, 0xa78c, 0xa690, -+ 0xa394, 0xa298, 0x0804, 0x1c94, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, -+ 0xa3ac, 0xa2b0, 0x04c8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, -+ 0xa2c8, 0x0490, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, -+ 0x0458, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1518, 0x080c, -+ 0x1ede, 0x1904, 0x1b6d, 0x900e, 0x0804, 0x1cfe, 0xab64, 0x939c, -+ 0x00ff, 0x9386, 0x0048, 0x1180, 0x00c6, 0x7004, 0x2060, 0x6004, -+ 0x9086, 0x0043, 0x00ce, 0x0904, 0x1c21, 0xab9c, 0x9016, 0xad8c, -+ 0xac90, 0xaf94, 0xae98, 0x0040, 0x9386, 0x0008, 0x0904, 0x1c21, -+ 0x080c, 0x0db4, 0x080c, 0x0db4, 0x2009, 0x030f, 0x2104, 0xd0fc, -+ 0x0530, 0x0066, 0x2009, 0x0306, 0x2104, 0x9084, 0x0030, 0x15c8, -+ 0x2031, 0x1000, 0x200b, 0x4000, 0x2600, 0x9302, 0x928b, 0x0000, -+ 0xa82e, 0xa932, 0x0278, 0x9105, 0x0168, 0x2011, 0x0000, 0x2618, -+ 0x2600, 0x9500, 0xa81e, 0x9481, 0x0000, 0xa822, 0xa880, 0xc0fd, -+ 0xa882, 0x0020, 0xa82f, 0x0000, 0xa833, 0x0000, 0x006e, 0x7b12, -+ 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, 0x782b, 0x0001, 0x7000, -+ 0x8000, 0x7002, 0xa83c, 0x9300, 0xa83e, 0xa840, 0x9201, 0xa842, -+ 0x700c, 0x9300, 0x700e, 0x7010, 0x9201, 0x7012, 0x080c, 0x1ede, -+ 0x0428, 0x2031, 0x0080, 0x9584, 0x007f, 0x0108, 0x9632, 0x7124, -+ 0x7000, 0x9086, 0x0000, 0x1198, 0xc185, 0x7126, 0x2009, 0x0306, -+ 0x2104, 0xd0b4, 0x1904, 0x1ca4, 0x200b, 0x4040, 0x2009, 0x1a4f, -+ 0x2104, 0x8000, 0x0a04, 0x1ca4, 0x200a, 0x0804, 0x1ca4, 0xc18d, -+ 0x7126, 0xd184, 0x1d58, 0x0804, 0x1ca4, 0x9006, 0x002e, 0x003e, -+ 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, 0x0db4, 0x0026, -+ 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, 0x7003, 0x0000, -+ 0x7004, 0x0016, 0x080c, 0x1b60, 0x001e, 0x2060, 0x6014, 0x2048, -+ 0x080c, 0xbb17, 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, 0xb74a, 0x00ce, 0x2001, 0x19c7, -+ 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c, 0x2268, 0x080c, -+ 0x98ea, 0x2011, 0x0000, 0x080c, 0x977b, 0x080c, 0x8a4e, 0x002e, -+ 0x0804, 0x1e8e, 0x0126, 0x2091, 0x2400, 0xa858, 0x2040, 0x792c, -+ 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1d07, 0x7000, 0x0002, -+ 0x1e8e, 0x1d5c, 0x1ddc, 0x1e8c, 0x8001, 0x7002, 0x7027, 0x0000, -+ 0xd19c, 0x1158, 0x8aff, 0x0904, 0x1da9, 0x080c, 0x1b67, 0x0904, -+ 0x1e8e, 0x080c, 0x1b67, 0x0804, 0x1e8e, 0x782b, 0x0004, 0xd194, -+ 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x1518, 0xa87c, 0xc0f5, -+ 0xa87e, 0x00f8, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x0016, 0x7910, -+ 0xa82c, 0x9100, 0xa82e, 0x7914, 0xa830, 0x9101, 0xa832, 0x001e, -+ 0x7810, 0x931a, 0x7814, 0x9213, 0x7800, 0xa81e, 0x7804, 0xa822, -+ 0xab3e, 0xaa42, 0x003e, 0x002e, 0x080c, 0x1ef9, 0xa880, 0xc0fd, -+ 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00, 0xa812, 0x7003, -+ 0x0000, 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, 0x0000, 0x0804, -+ 0x1e8e, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, -+ 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x0036, -+ 0x2019, 0x1000, 0x8319, 0x090c, 0x0db4, 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, -+ 0x080c, 0x1b60, 0x0804, 0x1e8e, 0x8001, 0x7002, 0x7024, 0x8004, -+ 0x7026, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, 0x1d4f, 0xd19c, -+ 0x1904, 0x1e8a, 0x8aff, 0x0904, 0x1e8e, 0x080c, 0x1b67, 0x0804, -+ 0x1e8e, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, 0x1ef9, 0xdd9c, -+ 0x1904, 0x1e49, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x9082, -+ 0x001b, 0x0002, 0x1e1d, 0x1e1d, 0x1e1f, 0x1e1d, 0x1e1d, 0x1e1d, -+ 0x1e25, 0x1e1d, 0x1e1d, 0x1e1d, 0x1e2b, 0x1e1d, 0x1e1d, 0x1e1d, -+ 0x1e31, 0x1e1d, 0x1e1d, 0x1e1d, 0x1e37, 0x1e1d, 0x1e1d, 0x1e1d, -+ 0x1e3d, 0x1e1d, 0x1e1d, 0x1e1d, 0x1e43, 0x080c, 0x0db4, 0xa07c, -+ 0x931a, 0xa080, 0x9213, 0x0804, 0x1d7e, 0xa08c, 0x931a, 0xa090, -+ 0x9213, 0x0804, 0x1d7e, 0xa09c, 0x931a, 0xa0a0, 0x9213, 0x0804, -+ 0x1d7e, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1d7e, 0xa0bc, -+ 0x931a, 0xa0c0, 0x9213, 0x0804, 0x1d7e, 0xa0cc, 0x931a, 0xa0d0, -+ 0x9213, 0x0804, 0x1d7e, 0xa0dc, 0x931a, 0xa0e0, 0x9213, 0x0804, -+ 0x1d7e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, -+ 0x0002, 0x1e6c, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e72, -+ 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e78, 0x1e6a, 0x1e6a, -+ 0x1e6a, 0x1e6a, 0x1e6a, 0x1e7e, 0x1e6a, 0x1e6a, 0x1e6a, 0x1e6a, -+ 0x1e6a, 0x1e84, 0x080c, 0x0db4, 0xa07c, 0x931a, 0xa080, 0x9213, -+ 0x0804, 0x1d7e, 0xa094, 0x931a, 0xa098, 0x9213, 0x0804, 0x1d7e, -+ 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1d7e, 0xa0c4, 0x931a, -+ 0xa0c8, 0x9213, 0x0804, 0x1d7e, 0xa0dc, 0x931a, 0xa0e0, 0x9213, -+ 0x0804, 0x1d7e, 0x0804, 0x1d7a, 0x080c, 0x0db4, 0x012e, 0x0005, -+ 0x00f6, 0x00e6, 0x2071, 0x1a36, 0x7000, 0x9086, 0x0000, 0x0904, -+ 0x1ed9, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, -+ 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xd8d5, -+ 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0db4, 0x0016, 0x2009, -+ 0x0040, 0x080c, 0x2268, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, -+ 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, -+ 0x0040, 0x080c, 0x2268, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0x1d4a, -+ 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, 0x782c, 0xd0ac, -+ 0x1de8, 0x2009, 0x0040, 0x080c, 0x2268, 0x782b, 0x0002, 0x7003, -+ 0x0000, 0x080c, 0x1b60, 0x00ee, 0x00fe, 0x0005, 0xa880, 0xd0fc, -+ 0x11a8, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, 0x0005, 0xa004, -+ 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, -+ 0x1f26, 0x2065, 0x8cff, 0x090c, 0x0db4, 0x8a51, 0x0005, 0x2050, -+ 0x0005, 0xa880, 0xd0fc, 0x11b8, 0x8a50, 0x8c61, 0x2c05, 0x9005, -+ 0x1190, 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, 0x1108, 0x2900, -+ 0x2040, 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, 0x1f36, 0x2065, -+ 0x8cff, 0x090c, 0x0db4, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, -+ 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, -+ 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1f19, -+ 0x1f15, 0x0000, 0x0000, 0x1f23, 0x0000, 0x1f19, 0x1f20, 0x1f20, -+ 0x1f1d, 0x0000, 0x0000, 0x0000, 0x1f23, 0x1f20, 0x0000, 0x1f1b, -+ 0x1f1b, 0x0000, 0x0000, 0x1f23, 0x0000, 0x1f1b, 0x1f21, 0x1f21, -+ 0x1f21, 0x0000, 0x0000, 0x0000, 0x1f23, 0x1f21, 0x00c6, 0x00d6, -+ 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x2125, 0x2940, -+ 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008, 0x1118, -+ 0x2061, 0x1f21, 0x00d0, 0x9de0, 0x1f26, 0x9d86, 0x0007, 0x0130, -+ 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, -+ 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x2125, -+ 0xa004, 0x9045, 0x0904, 0x2125, 0x08d8, 0x2c05, 0x9005, 0x0904, -+ 0x200d, 0xdd9c, 0x1904, 0x1fc9, 0x908a, 0x0036, 0x1a0c, 0x0db4, -+ 0x9082, 0x001b, 0x0002, 0x1f9e, 0x1f9e, 0x1fa0, 0x1f9e, 0x1f9e, -+ 0x1f9e, 0x1fa6, 0x1f9e, 0x1f9e, 0x1f9e, 0x1fac, 0x1f9e, 0x1f9e, -+ 0x1f9e, 0x1fb2, 0x1f9e, 0x1f9e, 0x1f9e, 0x1fb8, 0x1f9e, 0x1f9e, -+ 0x1f9e, 0x1fbe, 0x1f9e, 0x1f9e, 0x1f9e, 0x1fc4, 0x080c, 0x0db4, -+ 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x2003, 0xa08c, 0x9422, -+ 0xa090, 0x931b, 0x0804, 0x2003, 0xa09c, 0x9422, 0xa0a0, 0x931b, -+ 0x0804, 0x2003, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x2003, -+ 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x2003, 0xa0cc, 0x9422, -+ 0xa0d0, 0x931b, 0x0804, 0x2003, 0xa0dc, 0x9422, 0xa0e0, 0x931b, -+ 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0db4, 0x9082, 0x001b, 0x0002, -+ 0x1feb, 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1ff0, 0x1fe9, -+ 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1ff5, 0x1fe9, 0x1fe9, 0x1fe9, -+ 0x1fe9, 0x1fe9, 0x1ffa, 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, 0x1fe9, -+ 0x1fff, 0x080c, 0x0db4, 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, 0x2125, 0x8c60, 0x0804, 0x1f75, 0xa004, 0x9045, 0x0904, -+ 0x2125, 0x0804, 0x1f50, 0x8a51, 0x0904, 0x2125, 0x8c60, 0x2c05, -+ 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x2125, 0xa064, 0x90ec, -+ 0x000f, 0x9de0, 0x1f26, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, -+ 0x0804, 0x211a, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, -+ 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x20b7, 0x9082, 0x001b, 0x0002, -+ 0x2053, 0x2053, 0x2055, 0x2053, 0x2053, 0x2053, 0x2063, 0x2053, -+ 0x2053, 0x2053, 0x2071, 0x2053, 0x2053, 0x2053, 0x207f, 0x2053, -+ 0x2053, 0x2053, 0x208d, 0x2053, 0x2053, 0x2053, 0x209b, 0x2053, -+ 0x2053, 0x2053, 0x20a9, 0x080c, 0x0db4, 0xa17c, 0x2400, 0x9122, -+ 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa074, 0x9420, 0xa078, -+ 0x9319, 0x0804, 0x2115, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, -+ 0x911b, 0x0a0c, 0x0db4, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, -+ 0x2115, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, -+ 0x0db4, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x2115, 0xa1ac, -+ 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa0a4, -+ 0x9420, 0xa0a8, 0x9319, 0x0804, 0x2115, 0xa1bc, 0x2400, 0x9122, -+ 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa0b4, 0x9420, 0xa0b8, -+ 0x9319, 0x0804, 0x2115, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, -+ 0x911b, 0x0a0c, 0x0db4, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, -+ 0x2115, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, -+ 0x0db4, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x2115, 0x9082, -+ 0x001b, 0x0002, 0x20d5, 0x20d3, 0x20d3, 0x20d3, 0x20d3, 0x20d3, -+ 0x20e2, 0x20d3, 0x20d3, 0x20d3, 0x20d3, 0x20d3, 0x20ef, 0x20d3, -+ 0x20d3, 0x20d3, 0x20d3, 0x20d3, 0x20fc, 0x20d3, 0x20d3, 0x20d3, -+ 0x20d3, 0x20d3, 0x2109, 0x080c, 0x0db4, 0xa17c, 0x2400, 0x9122, -+ 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa06c, 0x9420, 0xa070, -+ 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, -+ 0x0a0c, 0x0db4, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, -+ 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa09c, -+ 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, -+ 0x2300, 0x911b, 0x0a0c, 0x0db4, 0xa0b4, 0x9420, 0xa0b8, 0x9319, -+ 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, -+ 0x0db4, 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, 0xd0bc, 0x190c, -+ 0x0dad, 0x9084, 0x0007, 0x0002, 0x2146, 0x1d4a, 0x2146, 0x213c, -+ 0x213f, 0x2142, 0x213f, 0x2142, 0x080c, 0x1d4a, 0x0005, 0x080c, -+ 0x118f, 0x0005, 0x080c, 0x1d4a, 0x080c, 0x118f, 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, 0x2265, 0x7900, 0xd1dc, 0x1118, 0x9084, -+ 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x218d, 0x2185, 0x794e, -+ 0x2185, 0x2187, 0x2187, 0x2187, 0x2187, 0x7934, 0x2185, 0x2189, -+ 0x2185, 0x2187, 0x2185, 0x2187, 0x2185, 0x080c, 0x0db4, 0x0031, -+ 0x0020, 0x080c, 0x7934, 0x080c, 0x794e, 0x0005, 0x0006, 0x0016, -+ 0x0026, 0x080c, 0xd8d5, 0x7930, 0x9184, 0x0003, 0x01c0, 0x2001, -+ 0x19c7, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, 0x2004, 0x9005, -+ 0x090c, 0x0db4, 0x00c6, 0x2001, 0x19c7, 0x2064, 0x080c, 0xb74a, -+ 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x2268, 0x00d0, 0x9184, -+ 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, 0x6fb2, -+ 0x1138, 0x080c, 0x7296, 0x080c, 0x5cd1, 0x080c, 0x6ee4, 0x0010, -+ 0x080c, 0x5b90, 0x080c, 0x79fd, 0x0041, 0x0018, 0x9184, 0x9540, -+ 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, -+ 0x0056, 0x2071, 0x1a33, 0x080c, 0x1958, 0x005e, 0x004e, 0x003e, -+ 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128, -+ 0x2001, 0x1940, 0x2102, 0x2001, 0x1948, 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, 0x0dad, -+ 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, 0x2a63, 0x080c, 0x297e, -+ 0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084, 0x000c, 0x6150, -+ 0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, 0xb17f, 0x9085, -+ 0x2000, 0x6052, 0x2009, 0x196e, 0x2011, 0x196f, 0x6358, 0x939c, -+ 0x38f0, 0x2320, 0x080c, 0x29c2, 0x1238, 0x939d, 0x4003, 0x94a5, -+ 0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203, 0x94a5, 0x8603, -+ 0x230a, 0x2412, 0x9006, 0x080c, 0x29ad, 0x9006, 0x080c, 0x2990, -+ 0x20a9, 0x0012, 0x1d04, 0x22ba, 0x2091, 0x6000, 0x1f04, 0x22ba, -+ 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, -+ 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x269c, 0x2009, 0x00ef, -+ 0x6132, 0x6136, 0x080c, 0x26ac, 0x60e7, 0x0000, 0x61ea, 0x60e3, -+ 0x0002, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, 0x602f, -+ 0x0000, 0x6007, 0x149f, 0x60bb, 0x0000, 0x20a9, 0x0018, 0x60bf, -+ 0x0000, 0x1f04, 0x22e7, 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, 0x2347, 0x232d, 0x2330, -+ 0x2333, 0x2338, 0x233a, 0x233e, 0x2342, 0x080c, 0x82dd, 0x00b8, -+ 0x080c, 0x83aa, 0x00a0, 0x080c, 0x83aa, 0x080c, 0x82dd, 0x0078, -+ 0x0099, 0x0068, 0x080c, 0x82dd, 0x0079, 0x0048, 0x080c, 0x83aa, -+ 0x0059, 0x0028, 0x080c, 0x83aa, 0x080c, 0x82dd, 0x0029, 0x002e, -+ 0x001e, 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, -+ 0x0118, 0xd19c, 0x1904, 0x2595, 0xd1f4, 0x190c, 0x0dad, 0x080c, -+ 0x6fb2, 0x0904, 0x23a2, 0x080c, 0xc212, 0x1120, 0x7000, 0x9086, -+ 0x0003, 0x0570, 0x6024, 0x9084, 0x1800, 0x0550, 0x080c, 0x6fd5, -+ 0x0118, 0x080c, 0x6fc3, 0x1520, 0x6027, 0x0020, 0x6043, 0x0000, -+ 0x080c, 0xc212, 0x0168, 0x080c, 0x6fd5, 0x1150, 0x2001, 0x1978, -+ 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x6e33, 0x0804, 0x2598, -+ 0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001, 0x00d6, 0x2069, 0x0140, -+ 0x080c, 0x7009, 0x00de, 0x1904, 0x2598, 0x080c, 0x72a0, 0x0428, -+ 0x080c, 0x6fd5, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, -+ 0x080c, 0x72a0, 0x080c, 0x7296, 0x080c, 0x5cd1, 0x080c, 0x6ee4, -+ 0x0804, 0x2595, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, -+ 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7094, 0x9086, 0x0028, -+ 0x1110, 0x080c, 0x7185, 0x0804, 0x2595, 0x080c, 0x729b, 0x0048, -+ 0x2001, 0x194e, 0x2003, 0x0002, 0x0020, 0x080c, 0x70eb, 0x0804, -+ 0x2595, 0x080c, 0x721f, 0x0804, 0x2595, 0xd1ac, 0x0904, 0x24b6, -+ 0x080c, 0x6fb2, 0x11c0, 0x6027, 0x0020, 0x0006, 0x0026, 0x0036, -+ 0x080c, 0x6fcc, 0x1158, 0x080c, 0x7296, 0x080c, 0x5cd1, 0x080c, -+ 0x6ee4, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, 0x003e, 0x002e, -+ 0x000e, 0x080c, 0x6f8a, 0x0016, 0x0046, 0x00c6, 0x644c, 0x9486, -+ 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, 0x0090, 0x6043, -+ 0x0010, 0x74d6, 0x948c, 0xff00, 0x7038, 0xd084, 0x0178, 0x9186, -+ 0xf800, 0x1160, 0x7044, 0xd084, 0x1148, 0xc085, 0x7046, 0x0036, -+ 0x2418, 0x2011, 0x8016, 0x080c, 0x48d9, 0x003e, 0x080c, 0xc20b, -+ 0x1904, 0x2493, 0x9196, 0xff00, 0x05a8, 0x705c, 0x9084, 0x00ff, -+ 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, 0xd184, 0x1550, -+ 0x080c, 0x3133, 0x0128, 0xc18d, 0x7132, 0x080c, 0x655a, 0x1510, -+ 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, 0xff00, 0x9296, -+ 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2493, 0x7038, 0xd08c, -+ 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2493, 0xc1ad, -+ 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, 0x48d9, 0x003e, -+ 0x0804, 0x2493, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, -+ 0xd1ac, 0x1904, 0x2493, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, -+ 0x8013, 0x080c, 0x48d9, 0x003e, 0x7130, 0xc185, 0x7132, 0x2011, -+ 0x1854, 0x220c, 0x00f0, 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, -+ 0x080c, 0x822f, 0x2019, 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, -+ 0xd4a6, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x3138, 0x200d, 0x918c, -+ 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, 0x080c, 0xd52a, -+ 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, -+ 0x080c, 0x2fa5, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, -+ 0x900e, 0x080c, 0x623e, 0x1110, 0x080c, 0x5ceb, 0x8108, 0x1f04, -+ 0x2489, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0x9db8, 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, 0x1825, 0x2003, 0x0000, 0x6027, 0x0020, 0xd194, 0x0904, -+ 0x2595, 0x0016, 0x6220, 0xd2b4, 0x0904, 0x253e, 0x080c, 0x80b8, -+ 0x080c, 0x93ac, 0x6027, 0x0004, 0x00f6, 0x2019, 0x19c1, 0x2304, -+ 0x907d, 0x0904, 0x250d, 0x7804, 0x9086, 0x0032, 0x15f0, 0x00d6, -+ 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, 0x782c, 0x685e, 0x7808, -+ 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, 0x8001, 0x1df0, 0x6043, -+ 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, 0x080c, 0x2b24, 0x2001, -+ 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, 0x080c, 0x2a3e, 0x6904, -+ 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, -+ 0x080c, 0x2b14, 0x080c, 0x886e, 0x080c, 0x8973, 0x7814, 0x2048, -+ 0xa867, 0x0103, 0x2f60, 0x080c, 0x9e32, 0x009e, 0x00ee, 0x00ce, -+ 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, 0x00fe, 0x00d6, 0x2069, -+ 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2b24, 0x00de, -+ 0x00c6, 0x2061, 0x19b8, 0x6028, 0x080c, 0xc212, 0x0120, 0x909a, -+ 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, 0x1238, 0x8000, 0x602a, -+ 0x00ce, 0x080c, 0x9388, 0x0804, 0x2594, 0x2061, 0x0100, 0x62c0, -+ 0x080c, 0x9c43, 0x2019, 0x19c1, 0x2304, 0x9065, 0x0120, 0x2009, -+ 0x0027, 0x080c, 0x9eac, 0x00ce, 0x0804, 0x2594, 0xd2bc, 0x0904, -+ 0x2581, 0x080c, 0x80c5, 0x6014, 0x9084, 0x1984, 0x9085, 0x0010, -+ 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, -+ 0x4000, 0x0110, 0x080c, 0x2b24, 0x00de, 0x00c6, 0x2061, 0x19b8, -+ 0x6044, 0x080c, 0xc212, 0x0120, 0x909a, 0x0003, 0x1628, 0x0018, -+ 0x909a, 0x00c8, 0x1608, 0x8000, 0x6046, 0x603c, 0x00ce, 0x9005, -+ 0x0558, 0x2009, 0x07d0, 0x080c, 0x80bd, 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, -+ 0x96d8, 0x003e, 0x2019, 0x19c7, 0x2304, 0x9065, 0x0120, 0x2009, -+ 0x004f, 0x080c, 0x9eac, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x2607, -+ 0x7038, 0xd0ac, 0x1904, 0x25dc, 0x0016, 0x0156, 0x6027, 0x0008, -+ 0x6050, 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, -+ 0x080c, 0x2a5d, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, -+ 0x25af, 0x080c, 0x80ec, 0x1f04, 0x25af, 0x6050, 0x9085, 0x0400, -+ 0x9084, 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x25bd, -+ 0x6150, 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x25c6, -+ 0x080c, 0x80ec, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, -+ 0x6027, 0x0008, 0x04a0, 0x080c, 0x2a25, 0x1f04, 0x25c6, 0x015e, -+ 0x6152, 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, -+ 0x080c, 0x9db8, 0x60e3, 0x0000, 0x080c, 0xd8b4, 0x080c, 0xd8cf, -+ 0x080c, 0x538a, 0xd0fc, 0x1138, 0x080c, 0xc20b, 0x1120, 0x9085, -+ 0x0001, 0x080c, 0x6ff9, 0x9006, 0x080c, 0x2b14, 0x2009, 0x0002, -+ 0x080c, 0x2a63, 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004, 0x080c, -+ 0x0e80, 0x00ee, 0x6027, 0x0008, 0x080c, 0x0b8f, 0x001e, 0x918c, -+ 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, -+ 0x00e6, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71cc, -+ 0x70ce, 0x9116, 0x0904, 0x265b, 0x81ff, 0x01a0, 0x2009, 0x0000, -+ 0x080c, 0x2a63, 0x2011, 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, -+ 0x0007, 0x1118, 0x2019, 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, -+ 0x48d9, 0x0448, 0x2001, 0x1979, 0x200c, 0x81ff, 0x1140, 0x2001, -+ 0x0109, 0x2004, 0xd0b4, 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, -+ 0x2011, 0x8012, 0x080c, 0x48d9, 0x080c, 0x0e80, 0x080c, 0x538a, -+ 0xd0fc, 0x1188, 0x080c, 0xc20b, 0x1170, 0x00c6, 0x080c, 0x26f7, -+ 0x080c, 0x963f, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002, -+ 0x080c, 0x2fa5, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e, -+ 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, -+ 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac, 0x11c8, 0x81ff, -+ 0x01e8, 0x2011, 0x181e, 0x2204, 0x9106, 0x1190, 0x2011, 0x181f, -+ 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148, 0x2011, -+ 0x181f, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206, 0x1120, -+ 0x2500, 0x080c, 0x7c57, 0x0048, 0x9584, 0x00ff, 0x9080, 0x3138, -+ 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, 0x3138, -+ 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, -+ 0x1817, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, 0x6856, -+ 0x1f04, 0x26a7, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, -+ 0x0140, 0x2001, 0x1817, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, -+ 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, 0x9184, -+ 0x000f, 0x9080, 0xdd89, 0x2005, 0x6856, 0x8211, 0x1f04, 0x26bc, -+ 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, 0x26ec, 0x680f, -+ 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x080c, -+ 0x5386, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, -+ 0x2009, 0x002e, 0x080c, 0xd52a, 0x004e, 0x0005, 0x00f6, 0x0016, -+ 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x2763, 0x080c, -+ 0x29c2, 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, 0x8270, 0x928c, 0xff00, 0x0110, 0x2011, -+ 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, 0x0138, -+ 0x220a, 0x080c, 0x6fb2, 0x1118, 0x2009, 0x193e, 0x220a, 0x002e, -+ 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, -+ 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, -+ 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0dad, 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, 0x1961, 0x2004, 0x908a, -+ 0x0007, 0x1a0c, 0x0db4, 0x0033, 0x00ee, 0x002e, 0x001e, 0x000e, -+ 0x015e, 0x0005, 0x27c1, 0x27df, 0x2803, 0x2805, 0x282e, 0x2830, -+ 0x2832, 0x2001, 0x0001, 0x080c, 0x260c, 0x080c, 0x2a20, 0x2001, -+ 0x1963, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006, -+ 0x20a9, 0x0009, 0x080c, 0x29de, 0x2001, 0x1961, 0x2003, 0x0006, -+ 0x2009, 0x001e, 0x2011, 0x2833, 0x080c, 0x80ca, 0x0005, 0x2009, -+ 0x1966, 0x200b, 0x0000, 0x2001, 0x196b, 0x2003, 0x0036, 0x2001, -+ 0x196a, 0x2003, 0x002a, 0x2001, 0x1963, 0x2003, 0x0001, 0x9006, -+ 0x080c, 0x2990, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x29de, -+ 0x2001, 0x1961, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2833, -+ 0x080c, 0x80ca, 0x0005, 0x080c, 0x0db4, 0x2001, 0x196b, 0x2003, -+ 0x0036, 0x2001, 0x1963, 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005, -+ 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, -+ 0x2990, 0x2001, 0x1967, 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9, -+ 0x0009, 0x080c, 0x29de, 0x2001, 0x1961, 0x2003, 0x0006, 0x2009, -+ 0x001e, 0x2011, 0x2833, 0x080c, 0x80ca, 0x0005, 0x080c, 0x0db4, -+ 0x080c, 0x0db4, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, -+ 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, 0x1963, -+ 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0db4, 0x0043, 0x012e, 0x015e, -+ 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x2855, 0x2875, -+ 0x28b5, 0x28e5, 0x2909, 0x2919, 0x291b, 0x080c, 0x29d2, 0x11b0, -+ 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1969, 0x2104, 0x7a38, -+ 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085, -+ 0x200a, 0x2001, 0x1961, 0x2003, 0x0001, 0x0030, 0x080c, 0x293f, -+ 0x2001, 0xffff, 0x080c, 0x27d0, 0x0005, 0x080c, 0x291d, 0x05e0, -+ 0x2009, 0x196a, 0x2104, 0x8001, 0x200a, 0x080c, 0x29d2, 0x1178, -+ 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, 0x0005, 0x9296, -+ 0x0005, 0x0518, 0x2009, 0x1969, 0x2104, 0xc085, 0x200a, 0x2009, -+ 0x1966, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, 0x080c, -+ 0x2925, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, -+ 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x29ad, -+ 0x2001, 0x1963, 0x2003, 0x0002, 0x0028, 0x2001, 0x1961, 0x2003, -+ 0x0003, 0x0010, 0x080c, 0x27f2, 0x0005, 0x080c, 0x291d, 0x0560, -+ 0x2009, 0x196a, 0x2104, 0x8001, 0x200a, 0x080c, 0x29d2, 0x1168, -+ 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x1961, 0x2003, 0x0003, -+ 0x2001, 0x1962, 0x2003, 0x0000, 0x00b8, 0x2009, 0x196a, 0x2104, -+ 0x9005, 0x1118, 0x080c, 0x2962, 0x0010, 0x080c, 0x2932, 0x080c, -+ 0x2925, 0x2009, 0x1966, 0x200b, 0x0000, 0x2001, 0x1963, 0x2003, -+ 0x0001, 0x080c, 0x27f2, 0x0000, 0x0005, 0x04b9, 0x0508, 0x080c, -+ 0x29d2, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1967, -+ 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, 0x2001, -+ 0x196c, 0x2003, 0x000a, 0x2009, 0x1969, 0x2104, 0xc0fd, 0x200a, -+ 0x0038, 0x0419, 0x2001, 0x1963, 0x2003, 0x0004, 0x080c, 0x281d, -+ 0x0005, 0x0099, 0x0168, 0x080c, 0x29d2, 0x1138, 0x7850, 0x9084, -+ 0xefff, 0x7852, 0x080c, 0x2809, 0x0018, 0x0079, 0x080c, 0x281d, -+ 0x0005, 0x080c, 0x0db4, 0x080c, 0x0db4, 0x2009, 0x196b, 0x2104, -+ 0x8001, 0x200a, 0x090c, 0x297e, 0x0005, 0x7a38, 0x9294, 0x0005, -+ 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, -+ 0x29ad, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, -+ 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2990, 0x0005, 0x2009, -+ 0x1966, 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, -+ 0x29ad, 0x0005, 0x0086, 0x2001, 0x1969, 0x2004, 0x9084, 0x7fff, -+ 0x090c, 0x0db4, 0x2009, 0x1968, 0x2144, 0x8846, 0x280a, 0x9844, -+ 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, 0x0db4, 0x9006, -+ 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156, -+ 0x2001, 0x1961, 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04, -+ 0x2984, 0x2001, 0x1968, 0x2003, 0x8000, 0x015e, 0x000e, 0x0005, -+ 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, -+ 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196e, 0x210c, 0x795a, -+ 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009, -+ 0x196f, 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, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, -+ 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x2a5d, -+ 0xd09c, 0x1110, 0x1f04, 0x29d5, 0x015e, 0x0005, 0x0126, 0x0016, -+ 0x0006, 0x2091, 0x8000, 0x7850, 0x9085, 0x0040, 0x7852, 0x7850, -+ 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2a5d, 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, 0x2a0b, 0x080c, 0x80ec, 0x1f04, -+ 0x2a0b, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, 0x080c, -+ 0x2a5d, 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, 0x2a2f, 0x0028, 0x7854, 0xd08c, 0x1110, -+ 0x1f04, 0x2a35, 0x00fe, 0x015e, 0x000e, 0x0005, 0x1d04, 0x2a3e, -+ 0x080c, 0x80ec, 0x1f04, 0x2a3e, 0x0005, 0x0006, 0x2001, 0x196d, -+ 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x2001, 0x196d, -+ 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, 0x0006, 0x2001, 0x196d, -+ 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, 0xa001, 0xa001, 0xa001, -+ 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, 0x1979, 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, 0x1588, 0x2009, 0x00a2, 0x080c, 0x0e2f, -+ 0x2019, 0x0160, 0x2324, 0x2011, 0x0003, 0x2009, 0x0169, 0x2104, -+ 0x9084, 0x0007, 0x210c, 0x918c, 0x0007, 0x910e, 0x1db0, 0x9086, -+ 0x0003, 0x11b8, 0x2304, 0x9402, 0x02a0, 0x1d60, 0x8211, 0x1d68, -+ 0x84ff, 0x0170, 0x2001, 0x0141, 0x200c, 0x918c, 0xff00, 0x9186, -+ 0x0100, 0x0130, 0x2009, 0x180c, 0x2104, 0xc0dd, 0x200a, 0x0008, -+ 0x0419, 0x2009, 0x0000, 0x080c, 0x0e2f, 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, 0x04b9, 0x001e, 0x9184, 0x0003, -+ 0x01e0, 0x0036, 0x0016, 0x2019, 0x0141, 0x6124, 0x918c, 0x0028, -+ 0x1120, 0x2304, 0x9084, 0x2800, 0x0dc0, 0x001e, 0x919c, 0xffe4, -+ 0x9184, 0x0001, 0x0118, 0x9385, 0x0009, 0x6016, 0x9184, 0x0002, -+ 0x0118, 0x9385, 0x0012, 0x6016, 0x003e, 0x2001, 0x180c, 0x200c, -+ 0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, 0x0026, 0x080c, 0x6fcc, -+ 0x0108, 0xc0bc, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, -+ 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, -+ 0x2114, 0x9294, 0x0001, 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, -+ 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, -+ 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, -+ 0x2009, 0x0140, 0x2104, 0x1128, 0x080c, 0x6fcc, 0x0110, 0xc0bc, -+ 0x0008, 0xc0bd, 0x200a, 0x001e, 0x000e, 0x0005, 0x2dba, 0x2dba, -+ 0x2bde, 0x2bde, 0x2bea, 0x2bea, 0x2bf6, 0x2bf6, 0x2c04, 0x2c04, -+ 0x2c10, 0x2c10, 0x2c1e, 0x2c1e, 0x2c2c, 0x2c2c, 0x2c3e, 0x2c3e, -+ 0x2c4a, 0x2c4a, 0x2c58, 0x2c58, 0x2c76, 0x2c76, 0x2c96, 0x2c96, -+ 0x2c66, 0x2c66, 0x2c86, 0x2c86, 0x2ca4, 0x2ca4, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2cb6, 0x2cb6, -+ 0x2cc2, 0x2cc2, 0x2cd0, 0x2cd0, 0x2cde, 0x2cde, 0x2cee, 0x2cee, -+ 0x2cfc, 0x2cfc, 0x2d0c, 0x2d0c, 0x2d1c, 0x2d1c, 0x2d2e, 0x2d2e, -+ 0x2d3c, 0x2d3c, 0x2d4c, 0x2d4c, 0x2d6e, 0x2d6e, 0x2d90, 0x2d90, -+ 0x2d5c, 0x2d5c, 0x2d7f, 0x2d7f, 0x2d9f, 0x2d9f, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, -+ 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x2c3c, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2313, -+ 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x212b, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b, -+ 0x080c, 0x2313, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2166, 0x0804, 0x2db2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x2313, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b, -+ 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b, 0x080c, 0x2313, -+ 0x080c, 0x2166, 0x0804, 0x2db2, 0xa001, 0x0cf0, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x130c, -+ 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2313, 0x080c, 0x130c, 0x0804, 0x2db2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x212b, 0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2313, -+ 0x080c, 0x130c, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b, -+ 0x080c, 0x2313, 0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b, -+ 0x080c, 0x130c, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x130c, -+ 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x212b, 0x080c, 0x2313, -+ 0x080c, 0x130c, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, -+ 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x2313, 0x0804, 0x2db2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x2766, 0x080c, 0x212b, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, -+ 0x080c, 0x212b, 0x080c, 0x2313, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, -+ 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x2313, -+ 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x212b, -+ 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x212b, -+ 0x080c, 0x2313, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, -+ 0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x2313, -+ 0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x212b, -+ 0x080c, 0x130c, 0x0804, 0x2db2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, 0x080c, 0x2313, -+ 0x080c, 0x130c, 0x080c, 0x2166, 0x0804, 0x2db2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2766, -+ 0x080c, 0x212b, 0x080c, 0x2313, 0x080c, 0x130c, 0x0498, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2766, 0x080c, 0x212b, 0x080c, 0x130c, 0x080c, 0x2166, 0x0410, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x2766, 0x080c, 0x130c, 0x080c, 0x2166, 0x0098, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2766, 0x080c, 0x212b, 0x080c, 0x2313, 0x080c, 0x130c, 0x080c, -+ 0x2166, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, -+ 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, -+ 0x080c, 0x6520, 0x1904, 0x2ec1, 0x72d8, 0x2001, 0x194d, 0x2004, -+ 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, -+ 0x2ec1, 0x080c, 0x2ec6, 0x0804, 0x2ec1, 0xd2cc, 0x1904, 0x2ec1, -+ 0x080c, 0x6fb2, 0x1120, 0x70ab, 0xffff, 0x0804, 0x2ec1, 0xd294, -+ 0x0120, 0x70ab, 0xffff, 0x0804, 0x2ec1, 0x080c, 0x312e, 0x0160, -+ 0x080c, 0xc212, 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2e53, -+ 0x70ab, 0xffff, 0x0804, 0x2ec1, 0x2001, 0x1817, 0x203c, 0x7290, -+ 0xd284, 0x0904, 0x2e53, 0xd28c, 0x1904, 0x2e53, 0x0036, 0x73a8, -+ 0x938e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1c80, -+ 0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, -+ 0x9084, 0x00ff, 0x970e, 0x05a8, 0x908e, 0x0000, 0x0590, 0x908e, -+ 0x00ff, 0x1150, 0x7230, 0xd284, 0x1588, 0x7290, 0xc28d, 0x7292, -+ 0x70ab, 0xffff, 0x003e, 0x0478, 0x0026, 0x2011, 0x0010, 0x080c, -+ 0x6586, 0x002e, 0x0118, 0x70ab, 0xffff, 0x0410, 0x900e, 0x080c, -+ 0x2663, 0x080c, 0x61de, 0x11c0, 0x080c, 0x6562, 0x1168, 0x7030, -+ 0xd08c, 0x0130, 0xb800, 0xd0bc, 0x0138, 0x080c, 0x645e, 0x0120, -+ 0x080c, 0x2edf, 0x0148, 0x0028, 0x080c, 0x301f, 0x080c, 0x2f0b, -+ 0x0118, 0x8318, 0x0804, 0x2e05, 0x73aa, 0x0010, 0x70ab, 0xffff, -+ 0x003e, 0x0804, 0x2ec1, 0x9780, 0x3138, 0x203d, 0x97bc, 0xff00, -+ 0x873f, 0x2041, 0x007e, 0x70a8, 0x9096, 0xffff, 0x1118, 0x900e, -+ 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, -+ 0x70ab, 0xffff, 0x0804, 0x2ec1, 0x2700, 0x0156, 0x0016, 0x9106, -+ 0x0904, 0x2eb6, 0x0026, 0x2011, 0x0010, 0x080c, 0x6586, 0x002e, -+ 0x0120, 0x2009, 0xffff, 0x0804, 0x2ebe, 0xc484, 0x080c, 0x623e, -+ 0x0138, 0x080c, 0xc212, 0x1590, 0x080c, 0x61de, 0x15b8, 0x0008, -+ 0xc485, 0x080c, 0x6562, 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, -+ 0xd0bc, 0x11e0, 0x7290, 0xd28c, 0x0180, 0x080c, 0x6562, 0x9082, -+ 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c, 0x6202, 0x0028, 0x080c, -+ 0x30aa, 0x01a0, 0x080c, 0x30d5, 0x0088, 0x080c, 0x301f, 0x080c, -+ 0xc212, 0x1160, 0x080c, 0x2f0b, 0x0188, 0x0040, 0x080c, 0xc212, -+ 0x1118, 0x080c, 0x30aa, 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, -+ 0x015e, 0x1f04, 0x2e6c, 0x70ab, 0xffff, 0x0018, 0x001e, 0x015e, -+ 0x71aa, 0x004e, 0x002e, 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, -+ 0x70ab, 0x0001, 0x2009, 0x007e, 0x080c, 0x61de, 0x1168, 0xb813, -+ 0x00ff, 0xb817, 0xfffe, 0x080c, 0x301f, 0x04a9, 0x0128, 0x70d8, -+ 0xc0bd, 0x70da, 0x080c, 0xbf63, 0x001e, 0x00ce, 0x0005, 0x0016, -+ 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, -+ 0xb842, 0x080c, 0x9e7f, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xbf8c, -+ 0x6023, 0x0001, 0x9006, 0x080c, 0x617b, 0x2001, 0x0000, 0x080c, -+ 0x618f, 0x0126, 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, -+ 0x2009, 0x0004, 0x080c, 0x9eac, 0x9085, 0x0001, 0x00ce, 0x00de, -+ 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, -+ 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x9e7f, 0x0548, -+ 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, -+ 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, -+ 0x2fda, 0x080c, 0xbf8c, 0x6023, 0x0001, 0x9006, 0x080c, 0x617b, -+ 0x2001, 0x0002, 0x080c, 0x618f, 0x0126, 0x2091, 0x8000, 0x70a4, -+ 0x8000, 0x70a6, 0x012e, 0x2009, 0x0002, 0x080c, 0x9eac, 0x9085, -+ 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, -+ 0x0026, 0x2009, 0x0080, 0x080c, 0x61de, 0x1140, 0xb813, 0x00ff, -+ 0xb817, 0xfffc, 0x0039, 0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, -+ 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, 0x9ddc, -+ 0x01d0, 0x2b00, 0x6012, 0x080c, 0xbf8c, 0x6023, 0x0001, 0x9006, -+ 0x080c, 0x617b, 0x2001, 0x0002, 0x080c, 0x618f, 0x0126, 0x2091, -+ 0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e, 0x2009, 0x0002, 0x080c, -+ 0x9eac, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, -+ 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, -+ 0x61de, 0x11b8, 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8bf, 0x0004, -+ 0x080c, 0x9ddc, 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, -+ 0x620a, 0x080c, 0xbf8c, 0x2009, 0x0022, 0x080c, 0x9eac, 0x9085, -+ 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, -+ 0x0036, 0x0026, 0x00b6, 0x21f0, 0x080c, 0x857c, 0x080c, 0x850b, -+ 0x080c, 0x9c8a, 0x080c, 0xad77, 0x3e08, 0x2130, 0x81ff, 0x0120, -+ 0x20a9, 0x007e, 0x900e, 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, -+ 0x080c, 0x623e, 0x1140, 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, -+ 0x1110, 0x080c, 0x5ceb, 0x001e, 0x8108, 0x1f04, 0x2fbf, 0x9686, -+ 0x0001, 0x190c, 0x3102, 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, -+ 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0046, 0x0036, 0x0026, 0x0016, -+ 0x00b6, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, -+ 0x8571, 0x0076, 0x2039, 0x0000, 0x080c, 0x8469, 0x2c08, 0x080c, -+ 0xd29b, 0x007e, 0x001e, 0xba10, 0xbb14, 0xbcb0, 0x080c, 0x5ceb, -+ 0xba12, 0xbb16, 0xbcb2, 0x00be, 0x001e, 0x002e, 0x003e, 0x004e, -+ 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058, -+ 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, 0x70a4, -+ 0x9005, 0x0110, 0x8001, 0x70a6, 0x000e, 0x00ee, 0x0005, 0x2071, -+ 0x1800, 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2, 0x0ca8, 0xb800, -+ 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0046, -+ 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, -+ 0x0001, 0x0070, 0x080c, 0x5386, 0xd0c4, 0x0138, 0x0030, 0x9006, -+ 0x2020, 0x2009, 0x002d, 0x080c, 0xd52a, 0x20a9, 0x0800, 0x9016, -+ 0x0026, 0x928e, 0x007e, 0x0904, 0x3089, 0x928e, 0x007f, 0x0904, -+ 0x3089, 0x928e, 0x0080, 0x05e8, 0x9288, 0x1000, 0x210c, 0x81ff, -+ 0x05c0, 0x8fff, 0x1148, 0x2001, 0x195f, 0x0006, 0x2003, 0x0001, -+ 0x04f1, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, -+ 0x0001, 0x080c, 0x652c, 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, -+ 0x8571, 0x0076, 0x2039, 0x0000, 0x080c, 0x8469, 0x00b6, 0x00c6, -+ 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, -+ 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, -+ 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, 0xd29b, 0x001e, -+ 0x007e, 0x002e, 0x8210, 0x1f04, 0x3040, 0x015e, 0x001e, 0x002e, -+ 0x003e, 0x004e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, -+ 0x0026, 0x0016, 0x080c, 0x5386, 0xd0c4, 0x0140, 0xd0a4, 0x0130, -+ 0x9006, 0x2220, 0x2009, 0x0029, 0x080c, 0xd52a, 0x001e, 0x002e, -+ 0x004e, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7290, 0x82ff, -+ 0x01e8, 0x080c, 0x655a, 0x11d0, 0x2100, 0x080c, 0x2696, 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, 0x1a80, -+ 0x001e, 0x6112, 0x080c, 0x2fda, 0x001e, 0x080c, 0x6202, 0x012e, -+ 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, 0x2110, 0x080c, 0x9926, -+ 0x080c, 0xd7e2, 0x002e, 0x001e, 0x0005, 0x2001, 0x1836, 0x2004, -+ 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, 0x6fb2, 0x1118, 0x20a9, -+ 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, 0x6fb2, 0x1110, 0x900e, -+ 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, -+ 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, 0x6202, 0x8108, 0x1f04, -+ 0x3113, 0x2061, 0x1800, 0x607b, 0x0000, 0x607c, 0x9084, 0x00ff, -+ 0x607e, 0x60af, 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, 0x1875, -+ 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1854, 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, 0x1894, 0x7003, 0x0002, 0x9006, 0x7016, 0x701a, 0x704a, -+ 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, -+ 0x7007, 0x0001, 0x080c, 0x1004, 0x090c, 0x0db4, 0x2900, 0x706a, -+ 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, 0x1004, 0x090c, 0x0db4, -+ 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x0005, 0x2071, -+ 0x1894, 0x7004, 0x0002, 0x3267, 0x3268, 0x327b, 0x328f, 0x0005, -+ 0x1004, 0x3278, 0x0e04, 0x3278, 0x2079, 0x0000, 0x0126, 0x2091, -+ 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, 0x0001, 0x012e, 0x0468, -+ 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, 0x2061, 0x18ae, 0x2c4c, -+ 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, 0x0200, 0x0904, 0x3363, -+ 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, 0x701c, 0x0807, 0x7014, -+ 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, -+ 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, 0x0108, 0x0005, 0x2079, -+ 0x0000, 0x2061, 0x1800, 0x701c, 0x0807, 0x2061, 0x1800, 0x7880, -+ 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, 0x2100, 0x908a, 0x003f, -+ 0x1a04, 0x3360, 0x61cc, 0x0804, 0x32f5, 0x3337, 0x336f, 0x3379, -+ 0x337d, 0x3387, 0x338d, 0x3391, 0x33a1, 0x33a4, 0x33ae, 0x33b3, -+ 0x33b8, 0x33c3, 0x33ce, 0x33dd, 0x33ec, 0x33fa, 0x3411, 0x342c, -+ 0x3360, 0x34d5, 0x3513, 0x35b9, 0x35ca, 0x35ed, 0x3360, 0x3360, -+ 0x3360, 0x3625, 0x3641, 0x364a, 0x3679, 0x367f, 0x3360, 0x36c5, -+ 0x3360, 0x3360, 0x3360, 0x3360, 0x3360, 0x36d0, 0x36d9, 0x36e1, -+ 0x36e3, 0x3360, 0x3360, 0x3360, 0x3360, 0x3360, 0x3360, 0x370f, -+ 0x3360, 0x3360, 0x3360, 0x3360, 0x3360, 0x372c, 0x3787, 0x3360, -+ 0x3360, 0x3360, 0x3360, 0x3360, 0x3360, 0x0002, 0x37b1, 0x37b4, -+ 0x3813, 0x382c, 0x385c, 0x3afa, 0x3360, 0x4f5f, 0x3360, 0x3360, -+ 0x3360, 0x3360, 0x3360, 0x3360, 0x3360, 0x3360, 0x33ae, 0x33b3, -+ 0x401b, 0x53aa, 0x4031, 0x4fee, 0x503f, 0x5142, 0x3360, 0x51a4, -+ 0x51e0, 0x5211, 0x5315, 0x523e, 0x5295, 0x3360, 0x4035, 0x41d6, -+ 0x41ec, 0x4211, 0x4276, 0x42ea, 0x430a, 0x4381, 0x43dd, 0x4439, -+ 0x443c, 0x4461, 0x4501, 0x4567, 0x456f, 0x46a1, 0x4803, 0x4837, -+ 0x4a81, 0x3360, 0x4a9f, 0x4b62, 0x4c38, 0x3360, 0x3360, 0x3360, -+ 0x3360, 0x4c9e, 0x4cb9, 0x456f, 0x4eff, 0x714c, 0x0000, 0x2021, -+ 0x4000, 0x080c, 0x48b5, 0x0126, 0x2091, 0x8000, 0x0e04, 0x3341, -+ 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, -+ 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, -+ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, -+ 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, -+ 0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, 0x0898, 0x2021, 0x4003, -+ 0x0880, 0x2021, 0x4005, 0x0868, 0x2021, 0x4006, 0x0850, 0x2039, -+ 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, -+ 0x48c2, 0x7883, 0x0004, 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, -+ 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x48c5, 0x7984, -+ 0x7888, 0x2114, 0x200a, 0x0804, 0x3337, 0x7984, 0x2114, 0x0804, -+ 0x3337, 0x20e1, 0x0000, 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, -+ 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, -+ 0x3337, 0x7884, 0x2060, 0x04d8, 0x2009, 0x0003, 0x2011, 0x0002, -+ 0x2019, 0x001c, 0x789b, 0x0317, 0x0804, 0x3337, 0x2039, 0x0001, -+ 0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, -+ 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x336c, 0x2138, 0x7d98, -+ 0x7c9c, 0x0804, 0x3373, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, -+ 0x336c, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x3381, 0x79a0, 0x9182, -+ 0x0040, 0x0210, 0x0804, 0x336c, 0x21e8, 0x7984, 0x7888, 0x20a9, -+ 0x0001, 0x21a0, 0x4004, 0x0804, 0x3337, 0x2061, 0x0800, 0xe10c, -+ 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, -+ 0x0904, 0x3337, 0x0804, 0x3366, 0x79a0, 0x9182, 0x0040, 0x0210, -+ 0x0804, 0x336c, 0x21e0, 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, -+ 0x0804, 0x3337, 0x2069, 0x1853, 0x7884, 0x7990, 0x911a, 0x1a04, -+ 0x336c, 0x8019, 0x0904, 0x336c, 0x684a, 0x6942, 0x788c, 0x6852, -+ 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, 0x080c, 0x72c7, 0x0804, -+ 0x3337, 0x2069, 0x1853, 0x7884, 0x7994, 0x911a, 0x1a04, 0x336c, -+ 0x8019, 0x0904, 0x336c, 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, -+ 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x6664, 0x012e, 0x0804, 0x3337, 0x902e, 0x2520, 0x81ff, 0x0120, -+ 0x2009, 0x0001, 0x0804, 0x3369, 0x7984, 0x7b88, 0x7a8c, 0x20a9, -+ 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189c, 0x4101, 0x080c, 0x4879, -+ 0x1120, 0x2009, 0x0002, 0x0804, 0x3369, 0x2009, 0x0020, 0xa85c, -+ 0x9080, 0x0019, 0xaf60, 0x080c, 0x48c2, 0x701f, 0x3450, 0x0005, -+ 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096, -+ 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, 0x9096, 0x0048, 0x0120, -+ 0x9096, 0x0029, 0x1904, 0x3369, 0x810f, 0x918c, 0x00ff, 0x0904, -+ 0x3369, 0x7112, 0x7010, 0x8001, 0x0560, 0x7012, 0x080c, 0x4879, -+ 0x1120, 0x2009, 0x0002, 0x0804, 0x3369, 0x2009, 0x0020, 0x7068, -+ 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0x9290, 0x0040, 0x9399, -+ 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, -+ 0xaf60, 0x080c, 0x48c2, 0x701f, 0x348e, 0x0005, 0xa864, 0x9084, -+ 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, 0x000a, 0x1904, 0x3369, -+ 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, -+ 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x5ddd, -+ 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, -+ 0x080c, 0x60f4, 0x1128, 0x7007, 0x0003, 0x701f, 0x34ba, 0x0005, -+ 0x080c, 0x6ac6, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, -+ 0x0001, 0x2099, 0x189c, 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, -+ 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, -+ 0x0020, 0x012e, 0xaf60, 0x0804, 0x48c5, 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, -+ 0x19ea, 0x2004, 0x9005, 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, -+ 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, 0x2003, 0x1001, 0x2071, -+ 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, 0x3369, 0x7984, 0x080c, -+ 0x623e, 0x1904, 0x336c, 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, -+ 0x1a04, 0x336c, 0x7c88, 0x7d8c, 0x080c, 0x63a1, 0x080c, 0x6370, -+ 0x0000, 0x1518, 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, -+ 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, -+ 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001, -+ 0x1819, 0x2004, 0x9c02, 0x1a04, 0x3369, 0x0c30, 0x080c, 0xb74a, -+ 0x012e, 0x0904, 0x3369, 0x0804, 0x3337, 0x900e, 0x2001, 0x0005, -+ 0x080c, 0x6ac6, 0x0126, 0x2091, 0x8000, 0x080c, 0xbe0c, 0x080c, -+ 0x688c, 0x012e, 0x0804, 0x3337, 0x00a6, 0x2950, 0xb198, 0x080c, -+ 0x623e, 0x1904, 0x35a6, 0xb6a4, 0x9684, 0x3fff, 0x9082, 0x4000, -+ 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x63a1, 0x080c, 0x6370, 0x1520, -+ 0x2061, 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, -+ 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, -+ 0x9506, 0x0158, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, -+ 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, 0xb74a, 0x012e, -+ 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, 0x0005, 0x080c, -+ 0x6ac6, 0x0126, 0x2091, 0x8000, 0x080c, 0xbe0c, 0x080c, 0x687f, -+ 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, 0x3369, 0x080c, 0x4890, 0x0904, 0x336c, -+ 0x080c, 0x6305, 0x0904, 0x3369, 0x080c, 0x63a7, 0x0904, 0x3369, -+ 0x0804, 0x4301, 0x81ff, 0x1904, 0x3369, 0x080c, 0x48ac, 0x0904, -+ 0x336c, 0x080c, 0x6435, 0x0904, 0x3369, 0x2019, 0x0005, 0x79a8, -+ 0x080c, 0x63c2, 0x0904, 0x3369, 0x7888, 0x908a, 0x1000, 0x1a04, -+ 0x336c, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8046, 0x7984, -+ 0xd184, 0x1904, 0x3337, 0x0804, 0x4301, 0x0126, 0x2091, 0x8000, -+ 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, 0x07ff, 0x6458, -+ 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x623e, 0x11d8, 0x080c, -+ 0x6435, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, 0x00c0, 0x2019, -+ 0x0004, 0x900e, 0x080c, 0x63c2, 0x1118, 0x2009, 0x0006, 0x0078, -+ 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, 0x810b, 0x9108, -+ 0x080c, 0x8046, 0x8529, 0x1ae0, 0x012e, 0x0804, 0x3337, 0x012e, -+ 0x0804, 0x3369, 0x012e, 0x0804, 0x336c, 0x080c, 0x4890, 0x0904, -+ 0x336c, 0x080c, 0x6305, 0x0904, 0x3369, 0xbaa0, 0x2019, 0x0005, -+ 0x00c6, 0x9066, 0x080c, 0x8571, 0x0076, 0x903e, 0x080c, 0x8469, -+ 0x900e, 0x080c, 0xd29b, 0x007e, 0x00ce, 0x080c, 0x63a1, 0x0804, -+ 0x3337, 0x080c, 0x4890, 0x0904, 0x336c, 0x080c, 0x63a1, 0x2208, -+ 0x0804, 0x3337, 0x0156, 0x00d6, 0x00e6, 0x2069, 0x1906, 0x6810, -+ 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, -+ 0x007e, 0x2069, 0x1000, 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, -+ 0x9210, 0x8d68, 0x1f04, 0x365b, 0x2300, 0x9218, 0x00ee, 0x00de, -+ 0x015e, 0x0804, 0x3337, 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, -+ 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, -+ 0x0005, 0x2069, 0x1906, 0x6910, 0x62b8, 0x0804, 0x3337, 0x81ff, -+ 0x0120, 0x2009, 0x0001, 0x0804, 0x3369, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x539a, 0x0128, 0x2009, 0x0007, 0x012e, 0x0804, 0x3369, -+ 0x012e, 0x6158, 0x9190, 0x3138, 0x2215, 0x9294, 0x00ff, 0x6378, -+ 0x83ff, 0x0108, 0x627c, 0x67d8, 0x97c4, 0x000a, 0x98c6, 0x000a, -+ 0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, 0x0022, 0x98c6, 0x0022, -+ 0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, 0x0012, 0x98c6, 0x0012, -+ 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, 0x6fb2, 0x1118, 0x2031, -+ 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, 0x0005, 0x0804, 0x3369, -+ 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x3337, 0x6148, 0x624c, 0x2019, -+ 0x1957, 0x231c, 0x2001, 0x1958, 0x2004, 0x789a, 0x0804, 0x3337, -+ 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, 0x6340, 0x012e, 0x0804, -+ 0x3337, 0x080c, 0x48ac, 0x0904, 0x336c, 0xba44, 0xbb38, 0x0804, -+ 0x3337, 0x080c, 0x0db4, 0x080c, 0x48ac, 0x2110, 0x0904, 0x336c, -+ 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, 0x0140, 0x9084, 0xff00, -+ 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, 0x3369, 0x0126, 0x2091, -+ 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x9926, 0x080c, -+ 0x8571, 0x0076, 0x903e, 0x080c, 0x8469, 0x900e, 0x080c, 0xd29b, -+ 0x007e, 0x00ce, 0xb807, 0x0407, 0x012e, 0x0804, 0x3337, 0x6148, -+ 0x624c, 0x7884, 0x604a, 0x7b88, 0x634e, 0x2069, 0x1853, 0x831f, -+ 0x9305, 0x6816, 0x788c, 0x2069, 0x1957, 0x2d1c, 0x206a, 0x7e98, -+ 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1958, 0x2d04, -+ 0x266a, 0x789a, 0x0804, 0x3337, 0x0126, 0x2091, 0x8000, 0x6138, -+ 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0e9b, 0xd0c4, 0x01a8, -+ 0x00d6, 0x78a8, 0x2009, 0x196e, 0x200a, 0x78ac, 0x2011, 0x196f, -+ 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, -+ 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e, 0x2011, -+ 0x0114, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0080, 0x0010, -+ 0x918c, 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4, -+ 0x190c, 0x0eb1, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, -+ 0x2012, 0x012e, 0x0804, 0x3337, 0x00f6, 0x2079, 0x1800, 0x7a38, -+ 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, -+ 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, 0x4000, -+ 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, -+ 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x336c, 0x788c, 0x902d, -+ 0x0904, 0x336c, 0x900e, 0x080c, 0x623e, 0x1120, 0xba44, 0xbb38, -+ 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, -+ 0x48ac, 0x0904, 0x336c, 0x7888, 0x900d, 0x0904, 0x336c, 0x788c, -+ 0x9005, 0x0904, 0x336c, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, -+ 0x3337, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x539a, -+ 0x1904, 0x3369, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, -+ 0x1130, 0x2001, 0x1817, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, -+ 0x007f, 0x16e0, 0x9188, 0x3138, 0x210d, 0x918c, 0x00ff, 0x2001, -+ 0x1817, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, 0x9105, -+ 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0x9ddc, 0x000e, 0x0510, -+ 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x61e4, 0x2b08, 0x00be, -+ 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4879, 0x01d0, 0x9006, -+ 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f, -+ 0x380c, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x9eac, 0x012e, -+ 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x3369, 0x00ce, 0x0804, -+ 0x336c, 0x080c, 0x9e32, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, -+ 0x3369, 0x0804, 0x3337, 0x2061, 0x1a41, 0x0126, 0x2091, 0x8000, -+ 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x6350, -+ 0x6070, 0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, -+ 0x3337, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x3369, 0x080c, -+ 0x6fb2, 0x0904, 0x3369, 0x0126, 0x2091, 0x8000, 0x6250, 0x6070, -+ 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x26cc, 0x080c, 0x55b4, -+ 0x012e, 0x0804, 0x3337, 0x012e, 0x0804, 0x336c, 0x0006, 0x0016, -+ 0x00c6, 0x00e6, 0x2001, 0x197a, 0x2070, 0x2061, 0x1853, 0x6008, -+ 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x8270, 0x7206, 0x00ee, -+ 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, -+ 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x3339, 0x7884, 0xd0fc, -+ 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, 0x012e, -+ 0x0804, 0x336c, 0x2001, 0x002a, 0x2004, 0x2069, 0x1853, 0x6908, -+ 0x9102, 0x1230, 0x012e, 0x0804, 0x336c, 0x012e, 0x0804, 0x3369, -+ 0x080c, 0x9db1, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x38d7, 0x00c6, -+ 0x080c, 0x4879, 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, 0x3a5d, 0x0928, -+ 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808, -+ 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, -+ 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, -+ 0x48c2, 0x701f, 0x399a, 0x7023, 0x0001, 0x012e, 0x0005, 0x0046, -+ 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, -+ 0x080c, 0x3846, 0x2001, 0x1970, 0x2003, 0x0000, 0x2021, 0x000a, -+ 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, 0x32e1, -+ 0x60bf, 0x0012, 0x080c, 0x3acc, 0x080c, 0x3a8b, 0x00f6, 0x00e6, -+ 0x0086, 0x2940, 0x2071, 0x1a36, 0x2079, 0x0090, 0x00d6, 0x2069, -+ 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, 0x780e, -+ 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, -+ 0x3e5f, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3d8c, 0x080c, 0x3c91, -+ 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, 0x080c, -+ 0x3ed3, 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, 0x181f, 0x2004, 0x9106, 0x1168, -+ 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, 0x0138, -+ 0x080c, 0x3c9b, 0x080c, 0x3a86, 0x0058, 0x080c, 0x3a86, 0x080c, -+ 0x3df7, 0x080c, 0x3d82, 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, 0x129f, 0x2009, 0x0028, 0x080c, 0x2268, -+ 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, 0x2001, 0x1970, 0x2004, -+ 0x9005, 0x1118, 0x012e, 0x0804, 0x3337, 0x012e, 0x2021, 0x400c, -+ 0x0804, 0x3339, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, -+ 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, -+ 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, 0x39f6, 0x2048, 0x1f04, -+ 0x39aa, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, 0xa930, -+ 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x0096, -+ 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, 0x0103, 0x0170, 0x8906, -+ 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, -+ 0x080c, 0x48c2, 0x701f, 0x399a, 0x00b0, 0x8906, 0x8006, 0x8007, -+ 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, -+ 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, 0x0f68, 0x000e, 0x080c, -+ 0x48c5, 0x701f, 0x399a, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, -+ 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, -+ 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, 0x3a5b, 0x0450, 0x7014, -+ 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, 0x007f, 0x080c, 0x61de, -+ 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, -+ 0xbfdb, 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, -+ 0x003e, 0x002e, 0x001e, 0x0904, 0x3369, 0x0016, 0x0026, 0x0036, -+ 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, -+ 0x3a2d, 0x7007, 0x0003, 0x0804, 0x39eb, 0xa830, 0x9086, 0x0100, -+ 0x2021, 0x400c, 0x0904, 0x3339, 0x0076, 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, 0x0f68, 0x000e, 0x080c, 0x48c5, 0x007e, 0x701f, 0x399a, -+ 0x7023, 0x0001, 0x0005, 0x0804, 0x3337, 0x0156, 0x00c6, 0xa814, -+ 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, -+ 0x81ff, 0x0168, 0x0016, 0x080c, 0x4879, 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, 0x1970, -+ 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, -+ 0x2001, 0x197b, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x197a, -+ 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x080c, 0x4879, 0xa813, -+ 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, -+ 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, -+ 0x0100, 0x2001, 0x197a, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, -+ 0x2268, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, -+ 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, -+ 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, 0x080c, 0x4879, 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, -+ 0x2a55, 0x1130, 0x9006, 0x080c, 0x29ad, 0x9006, 0x080c, 0x2990, -+ 0x7884, 0x9084, 0x0007, 0x0002, 0x3b17, 0x3b20, 0x3b29, 0x3b14, -+ 0x3b14, 0x3b14, 0x3b14, 0x3b14, 0x012e, 0x0804, 0x336c, 0x2009, -+ 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, 0x080c, 0x3ce5, 0x00c0, -+ 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, 0x200a, 0x080c, 0x3ce5, -+ 0x0078, 0x080c, 0x6fb2, 0x1128, 0x012e, 0x2009, 0x0016, 0x0804, -+ 0x3369, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x3339, -+ 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, -+ 0x080c, 0x3846, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, -+ 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, 0x3fae, 0x080c, 0x3efe, -+ 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a36, -+ 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, -+ 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, -+ 0x3e5f, 0x080c, 0x2a5d, 0x080c, 0x2a5d, 0x080c, 0x2a5d, 0x080c, -+ 0x2a5d, 0x080c, 0x3e5f, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3d8c, -+ 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3c9b, 0x2001, 0x0004, -+ 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, -+ 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, -+ 0x3369, 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, -+ 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, -+ 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, 0x3d6a, 0x2d00, 0x9c05, -+ 0x9b05, 0x0120, 0x080c, 0x3c9b, 0x0804, 0x3c48, 0x080c, 0x3ed3, -+ 0x080c, 0x3df7, 0x080c, 0x3d4d, 0x080c, 0x3d82, 0x00f6, 0x2079, -+ 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3c9b, 0x00fe, -+ 0x0804, 0x3c48, 0x00fe, 0x080c, 0x3c91, 0x1150, 0x8d68, 0x2001, -+ 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3c9b, 0x0080, -+ 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, -+ 0x0038, 0x2001, 0x1a33, 0x2004, 0x9086, 0x0000, 0x1904, 0x3b98, -+ 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, -+ 0x9605, 0x0904, 0x3c48, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, -+ 0x9b05, 0x1904, 0x3c48, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, -+ 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a33, 0x2003, 0x0003, -+ 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, -+ 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, -+ 0x2268, 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, -+ 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, -+ 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, 0x3c1f, 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, 0x3b52, -+ 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, -+ 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, -+ 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x129f, 0x7884, -+ 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x2009, 0x0028, 0x080c, -+ 0x2268, 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, 0x3337, 0x012e, 0x2021, 0x400c, 0x0804, -+ 0x3339, 0x9085, 0x0001, 0x1d04, 0x3c9a, 0x2091, 0x6000, 0x8420, -+ 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, 0x2001, -+ 0x032a, 0x2003, 0x0004, 0x2001, 0x1a33, 0x2003, 0x0000, 0x0071, -+ 0x2009, 0x0048, 0x080c, 0x2268, 0x2001, 0x0227, 0x2024, 0x2402, -+ 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, 0x00e6, -+ 0x2071, 0x1a36, 0x7000, 0x9086, 0x0000, 0x0520, 0x2079, 0x0090, -+ 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, -+ 0x2009, 0x0040, 0x080c, 0x2268, 0x782c, 0xd0fc, 0x0d88, 0x080c, -+ 0x3ed3, 0x7000, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, 0x782c, -+ 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2268, 0x782b, 0x0002, -+ 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, -+ 0x2001, 0x1817, 0x200c, 0x7932, 0x7936, 0x080c, 0x26ac, 0x7850, -+ 0x9084, 0xfbff, 0x9085, 0x0030, 0x7852, 0x2019, 0x01f4, 0x8319, -+ 0x1df0, 0x9084, 0xffcf, 0x9085, 0x2000, 0x7852, 0x20a9, 0x0046, -+ 0x1d04, 0x3d00, 0x2091, 0x6000, 0x1f04, 0x3d00, 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, 0x3d20, 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, 0x2b14, 0x7827, 0x0020, 0x7843, 0x0000, 0x9006, 0x080c, -+ 0x2b14, 0x7827, 0x0048, 0x00fe, 0x0005, 0x7884, 0xd0ac, 0x11c8, -+ 0x00f6, 0x00e6, 0x2071, 0x1a33, 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, -+ 0x197b, 0x2004, 0x70e2, 0x080c, 0x3a7c, 0x1188, 0x2001, 0x181f, -+ 0x2004, 0x2009, 0x181e, 0x210c, 0x918c, 0x00ff, 0x706e, 0x716a, -+ 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, 0x702c, -+ 0x9085, 0x0002, 0x702e, 0x2009, 0x1817, 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, 0x0092, -+ 0x7016, 0x080c, 0x3ed3, 0x00f6, 0x2071, 0x1a33, 0x2079, 0x0320, -+ 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, 0x780e, -+ 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0, 0x792c, -+ 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, 0x3e5f, -+ 0x2011, 0x0001, 0x080c, 0x3e5f, 0x00fe, 0x00ee, 0x0005, 0x00f6, -+ 0x00e6, 0x2071, 0x1a33, 0x2079, 0x0320, 0x792c, 0xd1fc, 0x0904, -+ 0x3e5c, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x3e58, 0x7000, -+ 0x0002, 0x3e5c, 0x3e0d, 0x3e3d, 0x3e58, 0xd1bc, 0x1170, 0xd1dc, -+ 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x3e5f, 0x0904, -+ 0x3e5c, 0x080c, 0x3e5f, 0x0804, 0x3e5c, 0x00f6, 0x2079, 0x0300, -+ 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, 0x7812, -+ 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, 0x3d6a, -+ 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, 0xd0ec, -+ 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, 0x9184, -+ 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3e01, 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, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016, 0xa058, 0x2048, -+ 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c, 0x938a, 0x0007, -+ 0x1a0c, 0x0db4, 0x9398, 0x3e8d, 0x231d, 0x083f, 0x9080, 0x0004, -+ 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e, 0x908a, 0x0035, -+ 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a, 0x2001, 0x0019, -+ 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3eca, 0x3ec1, 0x3eb8, -+ 0x3eaf, 0x3ea6, 0x3e9d, 0x3e94, 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, -+ 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, 0x7912, 0xa9b0, 0x7916, -+ 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912, 0xa9c0, -+ 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc, 0x7912, -+ 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071, 0x1a36, -+ 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, 0x2940, -+ 0x9026, 0x7000, 0x0002, 0x3efa, 0x3ee6, 0x3ef1, 0x8001, 0x7002, -+ 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3e5f, 0x190c, 0x3e5f, -+ 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, 0x1d38, 0x2011, 0x0001, -+ 0x080c, 0x3e5f, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x00e6, -+ 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x197b, 0x2004, 0x601a, -+ 0x2061, 0x0100, 0x2001, 0x197a, 0x2004, 0x60ce, 0x6104, 0xc1ac, -+ 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, 0x2001, -+ 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x4879, 0xa813, -+ 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, -+ 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, -+ 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3f76, 0x1d68, 0x2900, -+ 0xa85a, 0x00d0, 0x080c, 0x4879, 0xa813, 0x0019, 0xa817, 0x0001, -+ 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, -+ 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0xa86e, -+ 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090, 0x2079, 0x0100, -+ 0x2001, 0x197a, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x2268, -+ 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, 0x2001, -+ 0x002b, 0x2004, 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, 0x4879, -+ 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, 0x4879, 0x2940, 0xa813, 0x0019, -+ 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, 0x2009, -+ 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, 0xa85c, -+ 0x9080, 0x0019, 0x009e, 0x080c, 0x3f76, 0x1d68, 0x2900, 0xa85a, -+ 0x00d8, 0x080c, 0x4879, 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, 0x1a33, 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, 0x0013, -+ 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, 0x2009, 0x013c, -+ 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, 0x0804, -+ 0x3337, 0x7d98, 0x7c9c, 0x0804, 0x342e, 0x080c, 0x6fb2, 0x190c, -+ 0x5c96, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, -+ 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x48c2, 0x701f, 0x4049, -+ 0x0005, 0x080c, 0x5395, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, -+ 0x20d8, 0x21d0, 0x2069, 0x1853, 0x6800, 0x9005, 0x0904, 0x336c, -+ 0x6804, 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, 0x336c, 0x9288, 0x3138, -+ 0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130, 0x6828, 0x908a, -+ 0x007f, 0x1a04, 0x336c, 0x605a, 0x6888, 0x9084, 0x0030, 0x8004, -+ 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x1982, 0x9080, 0x279f, -+ 0x2005, 0x200a, 0x000e, 0x2009, 0x1983, 0x9080, 0x27a3, 0x2005, -+ 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x336c, 0x908a, 0x0841, -+ 0x1a04, 0x336c, 0x9084, 0x0007, 0x1904, 0x336c, 0x680c, 0x9005, -+ 0x0904, 0x336c, 0x6810, 0x9005, 0x0904, 0x336c, 0x6848, 0x6940, -+ 0x910a, 0x1a04, 0x336c, 0x8001, 0x0904, 0x336c, 0x684c, 0x6944, -+ 0x910a, 0x1a04, 0x336c, 0x8001, 0x0904, 0x336c, 0x2009, 0x1952, -+ 0x200b, 0x0000, 0x2001, 0x1875, 0x2004, 0xd0c4, 0x0140, 0x7884, -+ 0x200a, 0x2009, 0x017f, 0x200a, 0x3b00, 0xc085, 0x20d8, 0x6814, -+ 0x908c, 0x00ff, 0x614a, 0x8007, 0x9084, 0x00ff, 0x604e, 0x080c, -+ 0x72c7, 0x080c, 0x662f, 0x080c, 0x6664, 0x6808, 0x602a, 0x080c, -+ 0x21da, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, 0x200b, -+ 0x0000, 0x0036, 0x6b08, 0x080c, 0x2706, 0x003e, 0x6000, 0x9086, -+ 0x0000, 0x1904, 0x41c6, 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, -+ 0x1984, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, 0x199e, -+ 0x20e9, 0x0001, 0x4001, 0x080c, 0x8141, 0x00c6, 0x900e, 0x20a9, -+ 0x0001, 0x6b70, 0xd384, 0x0510, 0x0068, 0x2009, 0x0100, 0x210c, -+ 0x918e, 0x0008, 0x1110, 0x839d, 0x0010, 0x83f5, 0x3e18, 0x12b0, -+ 0x3508, 0x8109, 0x080c, 0x7892, 0x6878, 0x6016, 0x6874, 0x2008, -+ 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, -+ 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x4135, -+ 0x00ce, 0x00c6, 0x2061, 0x196d, 0x2063, 0x0001, 0x9006, 0x080c, -+ 0x29ad, 0x9006, 0x080c, 0x2990, 0x0000, 0x00ce, 0x00e6, 0x2c70, -+ 0x080c, 0x0e80, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, -+ 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, -+ 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, -+ 0x194d, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, -+ 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, -+ 0x277b, 0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, -+ 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x6fb2, -+ 0x0128, 0x080c, 0x4c92, 0x0110, 0x080c, 0x26cc, 0x60d0, 0x9005, -+ 0x01c0, 0x6003, 0x0001, 0x2009, 0x41ae, 0x00d0, 0x080c, 0x6fb2, -+ 0x1168, 0x2011, 0x6e33, 0x080c, 0x8038, 0x2011, 0x6e26, 0x080c, -+ 0x810c, 0x080c, 0x729b, 0x080c, 0x6ee4, 0x0040, 0x080c, 0x5b90, -+ 0x0028, 0x6003, 0x0004, 0x2009, 0x41c6, 0x0010, 0x0804, 0x3337, -+ 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, -+ 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, 0x0817, 0x6000, 0x9086, -+ 0x0000, 0x0904, 0x3369, 0x2069, 0x1853, 0x7890, 0x6842, 0x7894, -+ 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, -+ 0x2039, 0x0001, 0x0804, 0x48c5, 0x9006, 0x080c, 0x26cc, 0x81ff, -+ 0x1904, 0x3369, 0x080c, 0x6fb2, 0x11b0, 0x080c, 0x7296, 0x080c, -+ 0x5cd1, 0x080c, 0x3133, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, -+ 0xc212, 0x0130, 0x080c, 0x6fd5, 0x1118, 0x080c, 0x6f8a, 0x0038, -+ 0x080c, 0x6ee4, 0x0020, 0x080c, 0x5c96, 0x080c, 0x5b90, 0x0804, -+ 0x3337, 0x81ff, 0x1904, 0x3369, 0x080c, 0x6fb2, 0x1110, 0x0804, -+ 0x3369, 0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1c80, -+ 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, -+ 0x8000, 0x2039, 0x0001, 0x080c, 0x48c5, 0x701f, 0x3335, 0x012e, -+ 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1c80, 0x20a9, 0x0040, -+ 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, 0xffff, 0x4304, 0x6558, -+ 0x9588, 0x3138, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, -+ 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x623e, 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, 0x5c21, 0x0804, 0x421e, 0x080c, 0x48ac, -+ 0x0904, 0x336c, 0x080c, 0x4879, 0x1120, 0x2009, 0x0002, 0x0804, -+ 0x3369, 0x080c, 0x5386, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, -+ 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, -+ 0x312e, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, -+ 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, -+ 0x080c, 0xbce0, 0x1120, 0x2009, 0x0003, 0x0804, 0x3369, 0x7007, -+ 0x0003, 0x701f, 0x42ac, 0x0005, 0x080c, 0x48ac, 0x0904, 0x336c, -+ 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, 0x0f68, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, -+ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, -+ 0x0f68, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, -+ 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, -+ 0x0804, 0x48c5, 0x81ff, 0x1904, 0x3369, 0x080c, 0x4890, 0x0904, -+ 0x336c, 0x080c, 0x63b0, 0x0904, 0x3369, 0x0058, 0xa878, 0x9005, -+ 0x0120, 0x2009, 0x0004, 0x0804, 0x3369, 0xa974, 0xaa94, 0x0804, -+ 0x3337, 0x080c, 0x538e, 0x0904, 0x3337, 0x701f, 0x42f6, 0x7007, -+ 0x0003, 0x0005, 0x81ff, 0x1904, 0x3369, 0x7888, 0x908a, 0x1000, -+ 0x1a04, 0x336c, 0x080c, 0x48ac, 0x0904, 0x336c, 0x080c, 0x6562, -+ 0x0120, 0x080c, 0x656a, 0x1904, 0x336c, 0x080c, 0x6435, 0x0904, -+ 0x3369, 0x2019, 0x0004, 0x900e, 0x080c, 0x63c2, 0x0904, 0x3369, -+ 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, -+ 0x080c, 0x48aa, 0x01e0, 0x080c, 0x6562, 0x0118, 0x080c, 0x656a, -+ 0x11b0, 0x080c, 0x6435, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, -+ 0x2019, 0x0004, 0x080c, 0x63c2, 0x2009, 0x0003, 0x0120, 0xa998, -+ 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, -+ 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, -+ 0x4000, 0x080c, 0x538e, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, -+ 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, -+ 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6458, 0x2400, 0x9506, -+ 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x623e, -+ 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8046, -+ 0x0005, 0x81ff, 0x1904, 0x3369, 0x798c, 0x2001, 0x1951, 0x918c, -+ 0x8000, 0x2102, 0x080c, 0x4890, 0x0904, 0x336c, 0x080c, 0x6562, -+ 0x0120, 0x080c, 0x656a, 0x1904, 0x336c, 0x080c, 0x6305, 0x0904, -+ 0x3369, 0x080c, 0x63b9, 0x0904, 0x3369, 0x2001, 0x1951, 0x2004, -+ 0xd0fc, 0x1904, 0x3337, 0x0804, 0x4301, 0xa9a0, 0x2001, 0x1951, -+ 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x489d, 0x01a0, 0x080c, -+ 0x6562, 0x0118, 0x080c, 0x656a, 0x1170, 0x080c, 0x6305, 0x2009, -+ 0x0002, 0x0128, 0x080c, 0x63b9, 0x1170, 0x2009, 0x0003, 0xa897, -+ 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, -+ 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1951, 0x2004, -+ 0xd0fc, 0x1128, 0x080c, 0x538e, 0x0110, 0x9006, 0x0018, 0x900e, -+ 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904, 0x3369, -+ 0x798c, 0x2001, 0x1950, 0x918c, 0x8000, 0x2102, 0x080c, 0x4890, -+ 0x0904, 0x336c, 0x080c, 0x6562, 0x0120, 0x080c, 0x656a, 0x1904, -+ 0x336c, 0x080c, 0x6305, 0x0904, 0x3369, 0x080c, 0x63a7, 0x0904, -+ 0x3369, 0x2001, 0x1950, 0x2004, 0xd0fc, 0x1904, 0x3337, 0x0804, -+ 0x4301, 0xa9a0, 0x2001, 0x1950, 0x918c, 0x8000, 0xc18d, 0x2102, -+ 0x080c, 0x489d, 0x01a0, 0x080c, 0x6562, 0x0118, 0x080c, 0x656a, -+ 0x1170, 0x080c, 0x6305, 0x2009, 0x0002, 0x0128, 0x080c, 0x63a7, -+ 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, -+ 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, -+ 0x4000, 0x2001, 0x1950, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x538e, -+ 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, -+ 0x0005, 0x6100, 0x0804, 0x3337, 0x080c, 0x48ac, 0x0904, 0x336c, -+ 0x080c, 0x539a, 0x1904, 0x3369, 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, -+ 0x3337, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1148, 0x939a, 0x0003, -+ 0x1a04, 0x3369, 0x6258, 0x7884, 0x9206, 0x1904, 0x44b1, 0x2031, -+ 0x1848, 0x2009, 0x013c, 0x2136, 0x2001, 0x1840, 0x2009, 0x000c, -+ 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0006, 0x78a8, -+ 0x9084, 0x0080, 0x11c8, 0x0006, 0x0036, 0x2001, 0x1a4f, 0x201c, -+ 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a50, 0x201c, 0x7b9e, 0x2003, -+ 0x0000, 0x2001, 0x1a51, 0x201c, 0x7ba2, 0x2003, 0x0000, 0x003e, -+ 0x000e, 0x000e, 0x0804, 0x48c5, 0x000e, 0x2031, 0x0000, 0x2061, -+ 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, -+ 0xa496, 0xa59a, 0x080c, 0x10d5, 0x7007, 0x0002, 0x701f, 0x44d1, -+ 0x0005, 0x81ff, 0x1904, 0x3369, 0x080c, 0x48ac, 0x0904, 0x336c, -+ 0x080c, 0x6562, 0x1904, 0x3369, 0x00c6, 0x080c, 0x4879, 0x00ce, -+ 0x0904, 0x3369, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, -+ 0x080c, 0xbc86, 0x0904, 0x3369, 0x7007, 0x0003, 0x701f, 0x44eb, -+ 0x0005, 0x080c, 0x401b, 0x0006, 0x0036, 0x2001, 0x1a4f, 0x201c, -+ 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a50, 0x201c, 0x7b9e, 0x2003, -+ 0x0000, 0x2001, 0x1a51, 0x201c, 0x7ba2, 0x2003, 0x0000, 0x003e, -+ 0x000e, 0x0804, 0x3337, 0xa830, 0x9086, 0x0100, 0x0904, 0x3369, -+ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, -+ 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, -+ 0x48c5, 0x9006, 0x080c, 0x26cc, 0x78a8, 0x9084, 0x00ff, 0x9086, -+ 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3369, 0x080c, 0x6fb2, 0x0110, -+ 0x080c, 0x5c96, 0x7888, 0x908a, 0x1000, 0x1a04, 0x336c, 0x7984, -+ 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x336c, 0x2100, -+ 0x080c, 0x2696, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, -+ 0x19cb, 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, -+ 0x0000, 0x080c, 0x6fb2, 0x1158, 0x080c, 0x7296, 0x080c, 0x5cd1, -+ 0x9085, 0x0001, 0x080c, 0x6ff9, 0x080c, 0x6ee4, 0x00d0, 0x080c, -+ 0x9db8, 0x2061, 0x0100, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, -+ 0x810f, 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, -+ 0x196a, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5bbc, 0x080c, -+ 0x80ca, 0x7984, 0x080c, 0x6fb2, 0x1110, 0x2009, 0x00ff, 0x7a88, -+ 0x080c, 0x4364, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3337, 0x7984, -+ 0x080c, 0x61de, 0x2b08, 0x1904, 0x336c, 0x0804, 0x3337, 0x81ff, -+ 0x0120, 0x2009, 0x0001, 0x0804, 0x3369, 0x60d8, 0xd0ac, 0x1130, -+ 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3369, 0x080c, 0x4879, -+ 0x1120, 0x2009, 0x0002, 0x0804, 0x3369, 0x7984, 0x9192, 0x0021, -+ 0x1a04, 0x336c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, -+ 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x48c2, 0x701f, 0x459f, -+ 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x4e44, 0x0005, 0x2009, -+ 0x0080, 0x080c, 0x623e, 0x1118, 0x080c, 0x6562, 0x0120, 0x2021, -+ 0x400a, 0x0804, 0x3339, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, -+ 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x4638, -+ 0x90be, 0x0112, 0x0904, 0x4638, 0x90be, 0x0113, 0x0904, 0x4638, -+ 0x90be, 0x0114, 0x0904, 0x4638, 0x90be, 0x0117, 0x0904, 0x4638, -+ 0x90be, 0x011a, 0x0904, 0x4638, 0x90be, 0x011c, 0x0904, 0x4638, -+ 0x90be, 0x0121, 0x0904, 0x461f, 0x90be, 0x0131, 0x0904, 0x461f, -+ 0x90be, 0x0171, 0x0904, 0x4638, 0x90be, 0x0173, 0x0904, 0x4638, -+ 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x4643, -+ 0x90be, 0x0212, 0x0904, 0x462c, 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, 0x336c, 0x7028, 0x9080, -+ 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, -+ 0x080c, 0x4681, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, -+ 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4681, 0x00c8, 0x7028, -+ 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, -+ 0x0001, 0x080c, 0x468e, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, -+ 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x468e, -+ 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, -+ 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4879, 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, 0xbca1, 0x1120, -+ 0x2009, 0x0003, 0x0804, 0x3369, 0x7007, 0x0003, 0x701f, 0x4678, -+ 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x3369, -+ 0xa820, 0x9086, 0x8001, 0x1904, 0x3337, 0x2009, 0x0004, 0x0804, -+ 0x3369, 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, 0x3369, 0x60d8, -+ 0xd0ac, 0x1160, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804, 0x3369, -+ 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3369, 0x7984, 0x78a8, -+ 0x2040, 0x080c, 0x9db1, 0x1120, 0x9182, 0x007f, 0x0a04, 0x336c, -+ 0x9186, 0x00ff, 0x0904, 0x336c, 0x9182, 0x0800, 0x1a04, 0x336c, -+ 0x7a8c, 0x7b88, 0x6078, 0x9306, 0x1140, 0x607c, 0x924e, 0x0904, -+ 0x336c, 0x99cc, 0xff00, 0x0904, 0x336c, 0x0126, 0x2091, 0x8000, -+ 0x0026, 0x2011, 0x8008, 0x080c, 0x6586, 0x002e, 0x0140, 0x918d, -+ 0x8000, 0x080c, 0x65d0, 0x1118, 0x2001, 0x4009, 0x0458, 0x080c, -+ 0x4793, 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006, 0x900e, -+ 0x080c, 0x645e, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090, -+ 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009, -+ 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005, -+ 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x3339, 0x2b00, 0x7026, -+ 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x9e7f, 0x0904, -+ 0x4760, 0x2b00, 0x6012, 0x080c, 0xbf8c, 0x2e58, 0x00ee, 0x00e6, -+ 0x00c6, 0x080c, 0x4879, 0x00ce, 0x2b70, 0x1158, 0x080c, 0x9e32, -+ 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, -+ 0x3369, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, -+ 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x2fda, 0x6023, -+ 0x0001, 0x9006, 0x080c, 0x617b, 0x2001, 0x0002, 0x080c, 0x618f, -+ 0x2009, 0x0002, 0x080c, 0x9eac, 0x78a8, 0xd094, 0x0138, 0x00ee, -+ 0x7024, 0x00e6, 0x2058, 0xb8bc, 0xc08d, 0xb8be, 0x9085, 0x0001, -+ 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, -+ 0x0804, 0x3369, 0x7007, 0x0003, 0x701f, 0x476f, 0x0005, 0xa830, -+ 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x3339, -+ 0x9086, 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, -+ 0x9294, 0x00ff, 0x0804, 0x52e3, 0x900e, 0xa868, 0xd0f4, 0x1904, -+ 0x3337, 0x080c, 0x645e, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, -+ 0xc18d, 0x0804, 0x3337, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, -+ 0x47db, 0x902e, 0x080c, 0x9db1, 0x0130, 0x9026, 0x20a9, 0x0800, -+ 0x2071, 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071, -+ 0x107f, 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, 0x15e8, 0x2428, -+ 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, 0x0030, 0x94ce, -+ 0x0080, 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, 0x00ff, 0x11d8, -+ 0xc5fd, 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11b8, 0xbe14, -+ 0x2600, 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, 0xd884, 0x0568, -+ 0xd894, 0x1558, 0x080c, 0x6562, 0x1540, 0x2001, 0x4000, 0x0430, -+ 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, -+ 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c, 0x9db1, -+ 0x1930, 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x47a9, -+ 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, -+ 0x080c, 0x61de, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, -+ 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, -+ 0x3369, 0x080c, 0x4879, 0x1120, 0x2009, 0x0002, 0x0804, 0x3369, -+ 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, -+ 0x336c, 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x336c, -+ 0x2010, 0x2918, 0x080c, 0x2f80, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x3369, 0x7007, 0x0003, 0x701f, 0x482e, 0x0005, 0xa830, 0x9086, -+ 0x0100, 0x1904, 0x3337, 0x2009, 0x0004, 0x0804, 0x3369, 0x7984, -+ 0x080c, 0x9db1, 0x1120, 0x9182, 0x007f, 0x0a04, 0x336c, 0x9186, -+ 0x00ff, 0x0904, 0x336c, 0x9182, 0x0800, 0x1a04, 0x336c, 0x2001, -+ 0x9000, 0x080c, 0x533e, 0x1904, 0x3369, 0x0804, 0x3337, 0xa998, -+ 0x080c, 0x9db1, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, -+ 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x533e, -+ 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, 0x0feb, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, -+ 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, -+ 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, -+ 0x7984, 0x080c, 0x623e, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, -+ 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x623e, -+ 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, -+ 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x623e, -+ 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, -+ 0x0128, 0x2148, 0xa904, 0x080c, 0x101d, 0x0cc8, 0x7116, 0x711a, -+ 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, -+ 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, -+ 0xa496, 0xa59a, 0x080c, 0x10d5, 0x7007, 0x0002, 0x701f, 0x3337, -+ 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, -+ 0x18a6, 0x2004, 0x9005, 0x1190, 0x0e04, 0x48f6, 0x7a36, 0x7833, -+ 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, -+ 0x2004, 0xd084, 0x190c, 0x1187, 0x0804, 0x495c, 0x0016, 0x0086, -+ 0x0096, 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044, 0x9005, 0x1540, -+ 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x0feb, -+ 0x0904, 0x4954, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, -+ 0x9080, 0x1f26, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, -+ 0x2001, 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061, 0x18b0, 0x2c00, -+ 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460, -+ 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016, -+ 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x2060, 0x001e, 0x8108, 0x2105, -+ 0x9005, 0xa146, 0x1520, 0x080c, 0x0feb, 0x1130, 0x8109, 0xa946, -+ 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, -+ 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, -+ 0x1f26, 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, -+ 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, -+ 0x9082, 0x001b, 0x0002, 0x497e, 0x497e, 0x4980, 0x497e, 0x497e, -+ 0x497e, 0x4984, 0x497e, 0x497e, 0x497e, 0x4988, 0x497e, 0x497e, -+ 0x497e, 0x498c, 0x497e, 0x497e, 0x497e, 0x4990, 0x497e, 0x497e, -+ 0x497e, 0x4994, 0x497e, 0x497e, 0x497e, 0x4999, 0x080c, 0x0db4, -+ 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, -+ 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, -+ 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, -+ 0x4957, 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4957, 0x00e6, 0x2071, -+ 0x1894, 0x7048, 0x9005, 0x0904, 0x4a30, 0x0126, 0x2091, 0x8000, -+ 0x0e04, 0x4a2f, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, -+ 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, -+ 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0db4, 0x2060, 0x001e, -+ 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, 0x4a32, 0xa804, 0x9005, -+ 0x090c, 0x0db4, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, -+ 0x0002, 0x9080, 0x1f26, 0x2005, 0xa04a, 0x0804, 0x4a32, 0x703c, -+ 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, -+ 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, -+ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x87ff, 0x0118, -+ 0x2748, 0x080c, 0x101d, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, -+ 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, 0x101d, 0x9006, 0x7042, -+ 0x7046, 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420, 0x7040, 0x9005, -+ 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, -+ 0x18f0, 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0, 0x9006, 0x703e, -+ 0x703a, 0x7044, 0x9005, 0x090c, 0x0db4, 0x2048, 0xa800, 0x9005, -+ 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1f26, 0x2005, -+ 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, -+ 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4a51, 0x4a51, -+ 0x4a53, 0x4a51, 0x4a51, 0x4a51, 0x4a58, 0x4a51, 0x4a51, 0x4a51, -+ 0x4a5d, 0x4a51, 0x4a51, 0x4a51, 0x4a62, 0x4a51, 0x4a51, 0x4a51, -+ 0x4a67, 0x4a51, 0x4a51, 0x4a51, 0x4a6c, 0x4a51, 0x4a51, 0x4a51, -+ 0x4a71, 0x080c, 0x0db4, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x49dd, -+ 0xaa84, 0xab88, 0xac8c, 0x0804, 0x49dd, 0xaa94, 0xab98, 0xac9c, -+ 0x0804, 0x49dd, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x49dd, 0xaab4, -+ 0xabb8, 0xacbc, 0x0804, 0x49dd, 0xaac4, 0xabc8, 0xaccc, 0x0804, -+ 0x49dd, 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x49dd, 0x0026, 0x080c, -+ 0x5386, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x48d9, 0x002e, -+ 0x0005, 0x81ff, 0x1904, 0x3369, 0x0126, 0x2091, 0x8000, 0x6030, -+ 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x6fb2, 0x1158, 0x080c, -+ 0x7296, 0x080c, 0x5cd1, 0x9085, 0x0001, 0x080c, 0x6ff9, 0x080c, -+ 0x6ee4, 0x0010, 0x080c, 0x5b90, 0x012e, 0x0804, 0x3337, 0x81ff, -+ 0x0120, 0x2009, 0x0001, 0x0804, 0x3369, 0x080c, 0x539a, 0x0120, -+ 0x2009, 0x0007, 0x0804, 0x3369, 0x080c, 0x655a, 0x0120, 0x2009, -+ 0x0008, 0x0804, 0x3369, 0x0026, 0x2011, 0x0010, 0x080c, 0x6586, -+ 0x002e, 0x0140, 0x7984, 0x080c, 0x65d0, 0x1120, 0x2009, 0x4009, -+ 0x0804, 0x3369, 0x080c, 0x312e, 0x0128, 0x7984, 0x080c, 0x61de, -+ 0x1904, 0x336c, 0x080c, 0x48ac, 0x0904, 0x336c, 0x2b00, 0x7026, -+ 0x080c, 0x6562, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, -+ 0x080c, 0x645e, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0x0804, 0x3337, 0x080c, 0x4879, 0x0904, 0x3369, 0x9006, 0xa866, -+ 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xbd3a, 0x0904, 0x3369, -+ 0x7888, 0xd094, 0x0118, 0xb8bc, 0xc08d, 0xb8be, 0x7007, 0x0003, -+ 0x701f, 0x4b47, 0x0005, 0x2061, 0x1800, 0x080c, 0x539a, 0x2009, -+ 0x0007, 0x1578, 0x080c, 0x655a, 0x0118, 0x2009, 0x0008, 0x0448, -+ 0x080c, 0x312e, 0x0120, 0xa998, 0x080c, 0x61de, 0x1530, 0x080c, -+ 0x48aa, 0x0518, 0x080c, 0x6562, 0xa89c, 0x1168, 0x9084, 0x0005, -+ 0x1150, 0x900e, 0x080c, 0x645e, 0x1108, 0xc185, 0xb800, 0xd0bc, -+ 0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xbd3a, -+ 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, -+ 0x2008, 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x3339, -+ 0x9086, 0x0100, 0x7024, 0x2058, 0x1110, 0x0804, 0x52e3, 0x900e, -+ 0x080c, 0x645e, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0x0804, 0x3337, 0x080c, 0x539a, 0x0120, 0x2009, 0x0007, 0x0804, -+ 0x3369, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4879, -+ 0x1120, 0x2009, 0x0002, 0x0804, 0x3369, 0x900e, 0x2130, 0x7126, -+ 0x7132, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, -+ 0x20a0, 0x080c, 0x623e, 0x1904, 0x4be5, 0x080c, 0x6562, 0x0120, -+ 0x080c, 0x656a, 0x1904, 0x4be5, 0x080c, 0x655a, 0x1130, 0x080c, -+ 0x645e, 0x1118, 0xd79c, 0x0904, 0x4be5, 0xd794, 0x1110, 0xd784, -+ 0x01a8, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400, -+ 0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, -+ 0x20e0, 0x20a9, 0x0002, 0x080c, 0x468e, 0x0048, 0x20a9, 0x0004, -+ 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x468e, 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, 0x4681, 0x9c80, -+ 0x0026, 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, -+ 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x9db1, -+ 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, -+ 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, -+ 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4b81, 0x86ff, -+ 0x1120, 0x7124, 0x810b, 0x0804, 0x3337, 0x7033, 0x0001, 0x7122, -+ 0x7024, 0x9600, 0x7026, 0x772e, 0x2061, 0x18ae, 0x2c44, 0xa06b, -+ 0x0000, 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, -+ 0xa496, 0xa59a, 0x080c, 0x10d5, 0x7007, 0x0002, 0x701f, 0x4c21, -+ 0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, -+ 0x9036, 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, -+ 0xa494, 0xa598, 0x0804, 0x4b81, 0x7124, 0x810b, 0x0804, 0x3337, -+ 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, -+ 0x8007, 0x90e2, 0x0020, 0x0a04, 0x336c, 0x9502, 0x0a04, 0x336c, -+ 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x336c, 0x9502, 0x0a04, -+ 0x336c, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x336c, -+ 0x9502, 0x0a04, 0x336c, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, -+ 0x336c, 0x9502, 0x0a04, 0x336c, 0x9384, 0xff00, 0x8007, 0x90e2, -+ 0x0020, 0x0a04, 0x336c, 0x9502, 0x0a04, 0x336c, 0x9384, 0x00ff, -+ 0x90e2, 0x0020, 0x0a04, 0x336c, 0x9502, 0x0a04, 0x336c, 0x9484, -+ 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x336c, 0x9502, 0x0a04, -+ 0x336c, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x336c, 0x9502, -+ 0x0a04, 0x336c, 0x2061, 0x195a, 0x6102, 0x6206, 0x630a, 0x640e, -+ 0x0804, 0x3337, 0x0006, 0x080c, 0x5386, 0xd0cc, 0x000e, 0x0005, -+ 0x0006, 0x080c, 0x538a, 0xd0bc, 0x000e, 0x0005, 0x6170, 0x7a84, -+ 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x3337, 0x83ff, 0x1904, -+ 0x336c, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x336c, 0x2019, 0xffff, -+ 0x6074, 0x9302, 0x9200, 0x0a04, 0x336c, 0x7986, 0x6272, 0x0804, -+ 0x3337, 0x080c, 0x539a, 0x1904, 0x3369, 0x7c88, 0x7d84, 0x7e98, -+ 0x7f8c, 0x080c, 0x4879, 0x0904, 0x3369, 0x900e, 0x901e, 0x7326, -+ 0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, -+ 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6562, -+ 0x0118, 0x080c, 0x656a, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, -+ 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, -+ 0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, -+ 0x900e, 0x2001, 0x0003, 0x080c, 0x8270, 0x2208, 0x0804, 0x3337, -+ 0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18ae, -+ 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, -+ 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x10d5, 0x7007, 0x0002, -+ 0x701f, 0x4d13, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, -+ 0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa48c, -+ 0xa590, 0xa694, 0xa798, 0x0804, 0x4cd1, 0x7224, 0x900e, 0x2001, -+ 0x0003, 0x080c, 0x8270, 0x2208, 0x0804, 0x3337, 0x00f6, 0x00e6, -+ 0x080c, 0x539a, 0x2009, 0x0007, 0x1904, 0x4da6, 0x2071, 0x1894, -+ 0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x4da6, 0xac9c, 0xad98, -+ 0xaea4, 0xafa0, 0x0096, 0x080c, 0x1004, 0x2009, 0x0002, 0x0904, -+ 0x4da6, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, -+ 0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, -+ 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6562, 0x0118, 0x080c, 0x656a, -+ 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, -+ 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, -+ 0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, -+ 0x080c, 0x8270, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, -+ 0x81ff, 0x090c, 0x0db4, 0x2148, 0x080c, 0x101d, 0x9006, 0x705e, -+ 0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, -+ 0x9300, 0x7056, 0x2061, 0x18af, 0x2c44, 0xa37a, 0x7058, 0xa076, -+ 0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4db2, -+ 0x000e, 0xa0a2, 0x080c, 0x10d5, 0x9006, 0x0048, 0x009e, 0xa897, -+ 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, -+ 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0db4, 0x00e6, -+ 0x2071, 0x1894, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, -+ 0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158, -+ 0x7150, 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590, -+ 0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, -+ 0x4000, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x8270, 0xaa9a, -+ 0x715c, 0x81ff, 0x090c, 0x0db4, 0x2148, 0x080c, 0x101d, 0x705f, -+ 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x688c, -+ 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, -+ 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6562, 0x0118, -+ 0x080c, 0x656a, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, -+ 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, -+ 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, -+ 0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0db4, 0x2148, -+ 0x080c, 0x101d, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, -+ 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x688c, 0x012e, 0xa09f, -+ 0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, -+ 0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, -+ 0x10d5, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, -+ 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, -+ 0x0804, 0x336c, 0xa884, 0xa988, 0x080c, 0x2663, 0x1518, 0x080c, -+ 0x61de, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x4879, -+ 0x01c8, 0x080c, 0x4879, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, -+ 0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xbcc1, -+ 0x1120, 0x2009, 0x0003, 0x0804, 0x3369, 0x7007, 0x0003, 0x701f, -+ 0x4e7f, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x3369, 0x7124, -+ 0x080c, 0x30d5, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, -+ 0x0804, 0x3369, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, -+ 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, -+ 0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, -+ 0x002a, 0x080c, 0x0f68, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, -+ 0x18ae, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, -+ 0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, -+ 0x0004, 0x000e, 0x007e, 0x0804, 0x48c5, 0x97c6, 0x7200, 0x11b8, -+ 0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18ae, 0x2c44, -+ 0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, -+ 0x080c, 0x10d5, 0x7007, 0x0002, 0x701f, 0x4edb, 0x0005, 0x000e, -+ 0x007e, 0x0804, 0x336c, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, -+ 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, -+ 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, -+ 0x080c, 0x0f68, 0x2100, 0x2238, 0x2061, 0x18ae, 0x2c44, 0xa28c, -+ 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x48c5, 0x81ff, -+ 0x1904, 0x3369, 0x798c, 0x2001, 0x194f, 0x918c, 0x8000, 0x2102, -+ 0x080c, 0x4890, 0x0904, 0x336c, 0x080c, 0x6562, 0x0120, 0x080c, -+ 0x656a, 0x1904, 0x336c, 0x080c, 0x6305, 0x0904, 0x3369, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x63cb, 0x012e, 0x0904, 0x3369, 0x2001, -+ 0x194f, 0x2004, 0xd0fc, 0x1904, 0x3337, 0x0804, 0x4301, 0xa9a0, -+ 0x2001, 0x194f, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x489d, -+ 0x01a0, 0x080c, 0x6562, 0x0118, 0x080c, 0x656a, 0x1170, 0x080c, -+ 0x6305, 0x2009, 0x0002, 0x0128, 0x080c, 0x63cb, 0x1170, 0x2009, -+ 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, -+ 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, -+ 0x194f, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x538e, 0x0110, 0x9006, -+ 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, -+ 0xd08c, 0x1118, 0xd084, 0x0904, 0x4276, 0x080c, 0x48ac, 0x0904, -+ 0x336c, 0x080c, 0x4879, 0x1120, 0x2009, 0x0002, 0x0804, 0x3369, -+ 0x080c, 0x6562, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, -+ 0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, -+ 0x080c, 0x5386, 0xd0b4, 0x0904, 0x42b0, 0x7884, 0x908e, 0x007e, -+ 0x0904, 0x42b0, 0x908e, 0x007f, 0x0904, 0x42b0, 0x908e, 0x0080, -+ 0x0904, 0x42b0, 0xb800, 0xd08c, 0x1904, 0x42b0, 0xa867, 0x0000, -+ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xbce0, 0x1120, 0x2009, 0x0003, -+ 0x0804, 0x3369, 0x7007, 0x0003, 0x701f, 0x4fa7, 0x0005, 0x080c, -+ 0x48ac, 0x0904, 0x336c, 0x0804, 0x42b0, 0x080c, 0x312e, 0x0108, -+ 0x0005, 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, -+ 0x0804, 0x3369, 0x080c, 0x539a, 0x0120, 0x2009, 0x0007, 0x0804, -+ 0x3369, 0x080c, 0x655a, 0x0120, 0x2009, 0x0008, 0x0804, 0x3369, -+ 0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x42b0, 0x9006, 0xa866, -+ 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xbd3a, 0x1120, 0x2009, -+ 0x0003, 0x0804, 0x3369, 0x7007, 0x0003, 0x701f, 0x4fe0, 0x0005, -+ 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x52e3, -+ 0x080c, 0x48ac, 0x0904, 0x336c, 0x0804, 0x4f79, 0x81ff, 0x2009, -+ 0x0001, 0x1904, 0x3369, 0x080c, 0x539a, 0x2009, 0x0007, 0x1904, -+ 0x3369, 0x080c, 0x655a, 0x0120, 0x2009, 0x0008, 0x0804, 0x3369, -+ 0x080c, 0x48ac, 0x0904, 0x336c, 0x080c, 0x6562, 0x2009, 0x0009, -+ 0x1904, 0x3369, 0x080c, 0x4879, 0x2009, 0x0002, 0x0904, 0x3369, -+ 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, -+ 0xff00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, -+ 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x336c, 0xc0e5, -+ 0xa952, 0xa956, 0xa83e, 0x080c, 0xbf8d, 0x2009, 0x0003, 0x0904, -+ 0x3369, 0x7007, 0x0003, 0x701f, 0x5036, 0x0005, 0xa830, 0x9086, -+ 0x0100, 0x2009, 0x0004, 0x0904, 0x3369, 0x0804, 0x3337, 0x7aa8, -+ 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x539a, 0x1188, -+ 0x2009, 0x0014, 0x0804, 0x3369, 0xd2dc, 0x1568, 0x81ff, 0x2009, -+ 0x0001, 0x1904, 0x3369, 0x080c, 0x539a, 0x2009, 0x0007, 0x1904, -+ 0x3369, 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x5361, 0x0804, -+ 0x3337, 0xd2fc, 0x0158, 0x080c, 0x48ac, 0x0904, 0x336c, 0x7984, -+ 0x9284, 0x9000, 0x080c, 0x533e, 0x0804, 0x3337, 0x080c, 0x48ac, -+ 0x0904, 0x336c, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, -+ 0x0009, 0x1904, 0x511f, 0x080c, 0x4879, 0x2009, 0x0002, 0x0904, -+ 0x511f, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, -+ 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x48c2, 0x701f, 0x5090, 0x0005, -+ 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, -+ 0x9084, 0xff00, 0x0110, 0x1904, 0x336c, 0xa866, 0xa832, 0xa868, -+ 0xc0fd, 0xa86a, 0x080c, 0x48ac, 0x1110, 0x0804, 0x336c, 0x2009, -+ 0x0043, 0x080c, 0xbff5, 0x2009, 0x0003, 0x0904, 0x511f, 0x7007, -+ 0x0003, 0x701f, 0x50b4, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, -+ 0x0004, 0x0904, 0x511f, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, -+ 0x533e, 0x0804, 0x3337, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, -+ 0xd2ec, 0x0168, 0x080c, 0x539a, 0x1150, 0x2009, 0x0014, 0x04f0, -+ 0x2061, 0x1800, 0x080c, 0x539a, 0x2009, 0x0007, 0x15b8, 0xd2f4, -+ 0x0128, 0x9284, 0x5000, 0x080c, 0x5361, 0x0050, 0xd2fc, 0x0178, -+ 0x080c, 0x48aa, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x533e, -+ 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, -+ 0x48aa, 0x0510, 0x080c, 0x6562, 0x2009, 0x0009, 0x11b8, 0xa8c4, -+ 0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, -+ 0xff00, 0x1190, 0x080c, 0x48aa, 0x1108, 0x0070, 0x2009, 0x004b, -+ 0x080c, 0xbff5, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, -+ 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, -+ 0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, -+ 0xd2dc, 0x0904, 0x3369, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, -+ 0x080c, 0x533e, 0x001e, 0x1904, 0x3369, 0x0804, 0x3337, 0x00f6, -+ 0x2d78, 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, -+ 0xa998, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x533e, 0x001e, 0x9085, -+ 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x3369, -+ 0x080c, 0x539a, 0x0120, 0x2009, 0x0007, 0x0804, 0x3369, 0x7984, -+ 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x623e, 0x1904, 0x336c, 0x9186, -+ 0x007f, 0x0138, 0x080c, 0x6562, 0x0120, 0x2009, 0x0009, 0x0804, -+ 0x3369, 0x080c, 0x4879, 0x1120, 0x2009, 0x0002, 0x0804, 0x3369, -+ 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, -+ 0xa80a, 0x080c, 0xbcfa, 0x1120, 0x2009, 0x0003, 0x0804, 0x3369, -+ 0x7007, 0x0003, 0x701f, 0x517d, 0x0005, 0xa808, 0x8007, 0x9086, -+ 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x3369, 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, 0x48c5, 0x080c, 0x4879, 0x1120, 0x2009, -+ 0x0002, 0x0804, 0x3369, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, -+ 0x8217, 0x82ff, 0x1118, 0x7023, 0x1984, 0x0040, 0x92c6, 0x0001, -+ 0x1118, 0x7023, 0x199e, 0x0010, 0x0804, 0x336c, 0x2009, 0x001a, -+ 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, -+ 0x080c, 0x48c2, 0x701f, 0x51cd, 0x0005, 0x2001, 0x182d, 0x2003, -+ 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, -+ 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x3337, -+ 0x080c, 0x4879, 0x1120, 0x2009, 0x0002, 0x0804, 0x3369, 0x7984, -+ 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, -+ 0x1984, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x199e, 0x0010, -+ 0x0804, 0x336c, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, -+ 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, -+ 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, -+ 0x48c5, 0x7884, 0x908a, 0x1000, 0x1a04, 0x336c, 0x0126, 0x2091, -+ 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19cb, -+ 0x6142, 0x00ce, 0x012e, 0x0804, 0x3337, 0x00c6, 0x080c, 0x6fb2, -+ 0x1160, 0x080c, 0x7296, 0x080c, 0x5cd1, 0x9085, 0x0001, 0x080c, -+ 0x6ff9, 0x080c, 0x6ee4, 0x080c, 0x0db4, 0x2061, 0x1800, 0x6030, -+ 0xc09d, 0x6032, 0x080c, 0x5b90, 0x00ce, 0x0005, 0x00c6, 0x2001, -+ 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x3369, 0x7884, 0x9005, -+ 0x0188, 0x7888, 0x2061, 0x196d, 0x2c0c, 0x2062, 0x080c, 0x2a45, -+ 0x01a0, 0x080c, 0x2a4d, 0x0188, 0x080c, 0x2a55, 0x0170, 0x2162, -+ 0x0804, 0x336c, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, -+ 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, -+ 0x1548, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, 0x2011, -+ 0x0003, 0x080c, 0x9771, 0x2011, 0x0002, 0x080c, 0x977b, 0x002e, -+ 0x080c, 0x9662, 0x0036, 0x901e, 0x080c, 0x96d8, 0x003e, 0x60e3, -+ 0x0000, 0x080c, 0xd8b4, 0x080c, 0xd8cf, 0x9085, 0x0001, 0x080c, -+ 0x6ff9, 0x9006, 0x080c, 0x2b14, 0x2001, 0x1800, 0x2003, 0x0004, -+ 0x6027, 0x0008, 0x00ce, 0x0804, 0x3337, 0x81ff, 0x0120, 0x2009, -+ 0x0001, 0x0804, 0x3369, 0x080c, 0x539a, 0x0120, 0x2009, 0x0007, -+ 0x0804, 0x3369, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x623e, -+ 0x1904, 0x336c, 0x9186, 0x007f, 0x0138, 0x080c, 0x6562, 0x0120, -+ 0x2009, 0x0009, 0x0804, 0x3369, 0x080c, 0x4879, 0x1120, 0x2009, -+ 0x0002, 0x0804, 0x3369, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, -+ 0x080c, 0xbcfd, 0x1120, 0x2009, 0x0003, 0x0804, 0x3369, 0x7007, -+ 0x0003, 0x701f, 0x52cc, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, -+ 0x2009, 0x0004, 0x0804, 0x3369, 0xa8e0, 0xa866, 0xa834, 0x8007, -+ 0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, -+ 0xaf60, 0x0804, 0x48c5, 0xa898, 0x9086, 0x000d, 0x1904, 0x3369, -+ 0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x52f0, 0x0010, -+ 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, -+ 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, -+ 0x799a, 0xa9a8, 0x799e, 0x080c, 0x48b5, 0x2091, 0x4080, 0x2001, -+ 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x7007, 0x0001, 0x2091, -+ 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, -+ 0x00c6, 0x2061, 0x19cb, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, -+ 0x604b, 0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, -+ 0x788c, 0x605e, 0x2001, 0x19d9, 0x2044, 0x2001, 0x19e0, 0xa076, -+ 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, -+ 0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, 0x3337, 0x0126, 0x2091, -+ 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, -+ 0xbb64, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, -+ 0x905d, 0x0160, 0x080c, 0x5ceb, 0x080c, 0x9db1, 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, 0x5369, 0x015e, 0x012e, 0x0005, 0x2001, 0x1854, -+ 0x2004, 0x0005, 0x2001, 0x1873, 0x2004, 0x0005, 0x0006, 0x2001, -+ 0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, -+ 0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, -+ 0x0016, 0x00e6, 0x2071, 0x1894, 0x7108, 0x910d, 0x710a, 0x00ee, -+ 0x001e, 0x0005, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x336c, 0x810c, -+ 0x0016, 0x080c, 0x4879, 0x080c, 0x0ef3, 0x2100, 0x2238, 0x7d84, -+ 0x7c88, 0x7b8c, 0x7a90, 0x001e, 0x080c, 0x48c2, 0x701f, 0x53c1, -+ 0x0005, 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, -+ 0x810c, 0x2061, 0x18ae, 0x2c44, 0xa770, 0xa074, 0x2071, 0x1894, -+ 0x080c, 0x48c5, 0x701f, 0x53d5, 0x0005, 0x2061, 0x18ae, 0x2c44, -+ 0x0016, 0x0026, 0xa270, 0xa174, 0x080c, 0x0efb, 0x002e, 0x001e, -+ 0x080c, 0x0fa8, 0x9006, 0xa802, 0xa806, 0x0804, 0x3337, 0x0126, -+ 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, -+ 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, -+ 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, 0x5590, 0x0068, 0xd08c, -+ 0x0118, 0x080c, 0x5499, 0x0040, 0xd094, 0x0118, 0x080c, 0x5469, -+ 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, -+ 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, -+ 0x7094, 0x9005, 0x000e, 0x0120, 0x7097, 0x0000, 0x708f, 0x0000, -+ 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, -+ 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, -+ 0x9296, 0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, -+ 0x0100, 0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, -+ 0x5c4d, 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, -+ 0x6043, 0x0000, 0x7083, 0x0000, 0x709f, 0x0001, 0x70c3, 0x0000, -+ 0x70db, 0x0000, 0x2009, 0x1c80, 0x200b, 0x0000, 0x7093, 0x0000, -+ 0x7087, 0x000f, 0x2009, 0x000f, 0x2011, 0x5b33, 0x080c, 0x80ca, -+ 0x0005, 0x2001, 0x1875, 0x2004, 0xd08c, 0x0110, 0x705b, 0xffff, -+ 0x7084, 0x9005, 0x1528, 0x2011, 0x5b33, 0x080c, 0x8038, 0x6040, -+ 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, -+ 0xd08c, 0x1168, 0x1f04, 0x547f, 0x6242, 0x7097, 0x0000, 0x6040, -+ 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, -+ 0x7097, 0x0000, 0x708b, 0x0000, 0x9006, 0x080c, 0x5cd6, 0x0000, -+ 0x0005, 0x7088, 0x908a, 0x0003, 0x1a0c, 0x0db4, 0x000b, 0x0005, -+ 0x54a3, 0x54f4, 0x558f, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, -+ 0x708b, 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, -+ 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x54b2, -+ 0x080c, 0x0db4, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, -+ 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, -+ 0x5cb2, 0x2079, 0x1c00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, -+ 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1c0e, 0x20a9, -+ 0x0004, 0x4003, 0x080c, 0x9c3f, 0x20e1, 0x0001, 0x2099, 0x1c00, -+ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, -+ 0x000c, 0x600f, 0x0000, 0x080c, 0x5b64, 0x00fe, 0x9006, 0x708e, -+ 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, 0x708c, 0x708f, 0x0000, -+ 0x9025, 0x0904, 0x556c, 0x6020, 0xd0b4, 0x1904, 0x556a, 0x719c, -+ 0x81ff, 0x0904, 0x5558, 0x9486, 0x000c, 0x1904, 0x5565, 0x9480, -+ 0x0018, 0x8004, 0x20a8, 0x080c, 0x5cab, 0x2011, 0x0260, 0x2019, -+ 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, -+ 0x5511, 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, -+ 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, 0x708b, 0x0002, 0x7097, -+ 0x0002, 0x2009, 0x07d0, 0x2011, 0x5b3a, 0x080c, 0x80ca, 0x080c, -+ 0x5cb2, 0x04c0, 0x080c, 0x5cab, 0x2079, 0x0260, 0x7930, 0x918e, -+ 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, -+ 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, 0x5cab, 0x2011, 0x026e, -+ 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, -+ 0x11a0, 0x8210, 0x8318, 0x1f04, 0x554c, 0x0078, 0x709f, 0x0000, -+ 0x080c, 0x5cab, 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, 0x9c3f, 0x20e1, 0x0001, 0x2099, -+ 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, -+ 0x60c3, 0x000c, 0x2011, 0x19c2, 0x2013, 0x0000, 0x708f, 0x0000, -+ 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x93a3, 0x08d8, 0x0005, -+ 0x7094, 0x908a, 0x001d, 0x1a0c, 0x0db4, 0x000b, 0x0005, 0x55c1, -+ 0x55d4, 0x55fd, 0x561d, 0x5643, 0x5672, 0x5698, 0x56d0, 0x56f6, -+ 0x5724, 0x575f, 0x5797, 0x57b5, 0x57e0, 0x5802, 0x581d, 0x5827, -+ 0x585b, 0x5881, 0x58b0, 0x58d6, 0x590e, 0x5952, 0x598f, 0x59b0, -+ 0x5a09, 0x5a2b, 0x5a59, 0x5a59, 0x00c6, 0x2061, 0x1800, 0x6003, -+ 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, -+ 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, -+ 0x0100, 0x6043, 0x0002, 0x7097, 0x0001, 0x2009, 0x07d0, 0x2011, -+ 0x5b3a, 0x080c, 0x80ca, 0x0005, 0x00f6, 0x708c, 0x9086, 0x0014, -+ 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x5cab, 0x2079, -+ 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, -+ 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, -+ 0x2011, 0x5b3a, 0x080c, 0x8038, 0x7097, 0x0010, 0x080c, 0x5827, -+ 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0003, -+ 0x6043, 0x0004, 0x2011, 0x5b3a, 0x080c, 0x8038, 0x080c, 0x5c2f, -+ 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, -+ 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x5612, 0x60c3, -+ 0x0014, 0x080c, 0x5b64, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, -+ 0x0500, 0x2011, 0x5b3a, 0x080c, 0x8038, 0x9086, 0x0014, 0x11b8, -+ 0x080c, 0x5cab, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, -+ 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, -+ 0x1110, 0x70c3, 0x0001, 0x7097, 0x0004, 0x0029, 0x0010, 0x080c, -+ 0x5c87, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0005, 0x080c, 0x5c2f, -+ 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5cab, -+ 0x080c, 0x5c8e, 0x1170, 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, -+ 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5ae7, 0x0168, 0x080c, -+ 0x5c64, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, -+ 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b64, -+ 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b3a, -+ 0x080c, 0x8038, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5cab, 0x2079, -+ 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, -+ 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, -+ 0x7097, 0x0006, 0x0029, 0x0010, 0x080c, 0x5c87, 0x00fe, 0x0005, -+ 0x00f6, 0x7097, 0x0007, 0x080c, 0x5c2f, 0x2079, 0x0240, 0x7833, -+ 0x1104, 0x7837, 0x0000, 0x080c, 0x5cab, 0x080c, 0x5c8e, 0x11b8, -+ 0x7080, 0x9005, 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, -+ 0x3138, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, -+ 0x5ae7, 0x0180, 0x080c, 0x4c98, 0x0110, 0x080c, 0x26cc, 0x20a9, -+ 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, -+ 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b64, 0x00fe, 0x0005, -+ 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b3a, 0x080c, 0x8038, -+ 0x9086, 0x0014, 0x11b8, 0x080c, 0x5cab, 0x2079, 0x0260, 0x7a30, -+ 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, -+ 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0008, -+ 0x0029, 0x0010, 0x080c, 0x5c87, 0x00fe, 0x0005, 0x00f6, 0x7097, -+ 0x0009, 0x080c, 0x5c2f, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, -+ 0x0100, 0x080c, 0x5c8e, 0x1150, 0x7080, 0x9005, 0x1138, 0x080c, -+ 0x5a5a, 0x1188, 0x9085, 0x0001, 0x080c, 0x26cc, 0x20a9, 0x0008, -+ 0x080c, 0x5cab, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, -+ 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b64, 0x0010, -+ 0x080c, 0x55b4, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x05a8, -+ 0x2011, 0x5b3a, 0x080c, 0x8038, 0x9086, 0x0014, 0x1560, 0x080c, -+ 0x5cab, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, -+ 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, -+ 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x000a, -+ 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c0, -+ 0x9005, 0x1110, 0x70c3, 0x0001, 0x7093, 0x0000, 0x7097, 0x000e, -+ 0x080c, 0x5802, 0x0010, 0x080c, 0x5c87, 0x00fe, 0x0005, 0x00f6, -+ 0x7097, 0x000b, 0x2011, 0x1c0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, -+ 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, 0x5c2f, 0x2079, 0x0240, -+ 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5c8e, 0x0118, 0x2013, -+ 0x0000, 0x0020, 0x705c, 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, -+ 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, 0x8210, 0x8108, 0x9186, -+ 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, -+ 0x5784, 0x60c3, 0x0084, 0x080c, 0x5b64, 0x00fe, 0x0005, 0x00f6, -+ 0x708c, 0x9005, 0x01c0, 0x2011, 0x5b3a, 0x080c, 0x8038, 0x9086, -+ 0x0084, 0x1178, 0x080c, 0x5cab, 0x2079, 0x0260, 0x7a30, 0x9296, -+ 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, 0x7097, 0x000c, 0x0029, -+ 0x0010, 0x080c, 0x5c87, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000d, -+ 0x080c, 0x5c2f, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, -+ 0x080c, 0x5cab, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, -+ 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, -+ 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, -+ 0x1f04, 0x57c8, 0x60c3, 0x0084, 0x080c, 0x5b64, 0x00fe, 0x0005, -+ 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, 0x5b3a, 0x080c, 0x8038, -+ 0x9086, 0x0084, 0x1198, 0x080c, 0x5cab, 0x2079, 0x0260, 0x7a30, -+ 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7093, 0x0001, -+ 0x080c, 0x5c01, 0x7097, 0x000e, 0x0029, 0x0010, 0x080c, 0x5c87, -+ 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, 0x5cd6, 0x7097, 0x000f, -+ 0x708f, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, -+ 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, -+ 0x2011, 0x5b3a, 0x080c, 0x802c, 0x0005, 0x708c, 0x9005, 0x0130, -+ 0x2011, 0x5b3a, 0x080c, 0x8038, 0x7097, 0x0000, 0x0005, 0x7097, -+ 0x0011, 0x080c, 0x9c3f, 0x080c, 0x5cab, 0x20e1, 0x0000, 0x2099, -+ 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x748c, 0x9480, 0x0018, -+ 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, -+ 0x5c8e, 0x11a0, 0x7178, 0x81ff, 0x0188, 0x900e, 0x707c, 0x9084, -+ 0x00ff, 0x0160, 0x080c, 0x2663, 0x9186, 0x007e, 0x0138, 0x9186, -+ 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, 0x5ae7, 0x60c3, 0x0014, -+ 0x080c, 0x5b64, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, -+ 0x5b3a, 0x080c, 0x8038, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5cab, -+ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, -+ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, -+ 0x0001, 0x7097, 0x0012, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, -+ 0x0005, 0x00f6, 0x7097, 0x0013, 0x080c, 0x5c3d, 0x2079, 0x0240, -+ 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5cab, 0x080c, 0x5c8e, -+ 0x1170, 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, 0xffff, 0x0138, -+ 0x2011, 0x0008, 0x080c, 0x5ae7, 0x0168, 0x080c, 0x5c64, 0x20a9, -+ 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, -+ 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b64, 0x00fe, 0x0005, -+ 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b3a, 0x080c, 0x8038, -+ 0x9086, 0x0014, 0x11b8, 0x080c, 0x5cab, 0x2079, 0x0260, 0x7a30, -+ 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, -+ 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0014, -+ 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, -+ 0x0015, 0x080c, 0x5c3d, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, -+ 0x0000, 0x080c, 0x5cab, 0x080c, 0x5c8e, 0x11b8, 0x7080, 0x9005, -+ 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, 0x3138, 0x200d, -+ 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5ae7, 0x0180, -+ 0x080c, 0x4c98, 0x0110, 0x080c, 0x26cc, 0x20a9, 0x0008, 0x20e1, -+ 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, -+ 0x60c3, 0x0014, 0x080c, 0x5b64, 0x00fe, 0x0005, 0x00f6, 0x708c, -+ 0x9005, 0x05f0, 0x2011, 0x5b3a, 0x080c, 0x8038, 0x9086, 0x0014, -+ 0x15a8, 0x080c, 0x5cab, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, -+ 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, -+ 0x9085, 0x0001, 0x080c, 0x5cd6, 0x7a38, 0xd2fc, 0x0128, 0x70c0, -+ 0x9005, 0x1110, 0x70c3, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, -+ 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x9085, -+ 0x0001, 0x080c, 0x5cd6, 0x7093, 0x0000, 0x7a38, 0xd2f4, 0x0110, -+ 0x70db, 0x0008, 0x7097, 0x0016, 0x0029, 0x0010, 0x708f, 0x0000, -+ 0x00fe, 0x0005, 0x080c, 0x9c3f, 0x080c, 0x5cab, 0x20e1, 0x0000, -+ 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, -+ 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, -+ 0x2012, 0x2011, 0x026e, 0x7097, 0x0017, 0x080c, 0x5c8e, 0x1150, -+ 0x7080, 0x9005, 0x1138, 0x080c, 0x5a5a, 0x1188, 0x9085, 0x0001, -+ 0x080c, 0x26cc, 0x20a9, 0x0008, 0x080c, 0x5cab, 0x20e1, 0x0000, -+ 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, -+ 0x0014, 0x080c, 0x5b64, 0x0010, 0x080c, 0x55b4, 0x0005, 0x00f6, -+ 0x708c, 0x9005, 0x01d8, 0x2011, 0x5b3a, 0x080c, 0x8038, 0x9086, -+ 0x0084, 0x1190, 0x080c, 0x5cab, 0x2079, 0x0260, 0x7a30, 0x9296, -+ 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x5cd6, -+ 0x7097, 0x0018, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, -+ 0x00f6, 0x7097, 0x0019, 0x080c, 0x5c3d, 0x2079, 0x0240, 0x7833, -+ 0x1106, 0x7837, 0x0000, 0x080c, 0x5cab, 0x2009, 0x026e, 0x2039, -+ 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, -+ 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x59c3, -+ 0x2039, 0x1c0e, 0x080c, 0x5c8e, 0x11e8, 0x2728, 0x2514, 0x8207, -+ 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, -+ 0x202a, 0x705c, 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, 0x59f6, 0x60c3, 0x0084, 0x080c, 0x5b64, 0x00fe, -+ 0x0005, 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, 0x5b3a, 0x080c, -+ 0x8038, 0x9086, 0x0084, 0x1198, 0x080c, 0x5cab, 0x2079, 0x0260, -+ 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7093, -+ 0x0001, 0x080c, 0x5c01, 0x7097, 0x001a, 0x0029, 0x0010, 0x708f, -+ 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x5cd6, 0x7097, -+ 0x001b, 0x080c, 0x9c3f, 0x080c, 0x5cab, 0x2011, 0x0260, 0x2009, -+ 0x0240, 0x748c, 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, 0x5a42, 0x60c3, 0x0084, 0x080c, 0x5b64, -+ 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0x1854, 0x252c, 0x20a9, -+ 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x5cab, -+ 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, -+ 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, -+ 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, -+ 0x5a74, 0x0804, 0x5ae3, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, -+ 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5ae3, 0x918d, -+ 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, -+ 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, -+ 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x5a9a, 0x04d8, -+ 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x5aac, 0x2328, -+ 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, -+ 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5abb, 0x755a, -+ 0x95c8, 0x3138, 0x292d, 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, -+ 0x0016, 0x2508, 0x080c, 0x26ac, 0x001e, 0x60e7, 0x0000, 0x65ea, -+ 0x2018, 0x2304, 0x9405, 0x201a, 0x7083, 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, 0x715a, 0x91a0, 0x3138, -+ 0x242d, 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016, 0x2508, -+ 0x080c, 0x26ac, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7083, 0x0001, -+ 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7087, 0x0000, -+ 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, -+ 0x080c, 0x5bf0, 0x080c, 0x93ac, 0x7004, 0x9084, 0x4000, 0x0110, -+ 0x080c, 0x2b24, 0x0126, 0x2091, 0x8000, 0x2071, 0x1825, 0x2073, -+ 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5c4d, -+ 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, -+ 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x29ca, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, -+ 0x19c2, 0x2013, 0x0000, 0x708f, 0x0000, 0x012e, 0x60a3, 0x0056, -+ 0x60a7, 0x9575, 0x080c, 0x93a3, 0x6144, 0xd184, 0x0120, 0x7194, -+ 0x918d, 0x2000, 0x0018, 0x7188, 0x918d, 0x1000, 0x2011, 0x196a, -+ 0x2112, 0x2009, 0x07d0, 0x2011, 0x5b3a, 0x080c, 0x80ca, 0x0005, -+ 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9db8, -+ 0x2009, 0x00f7, 0x080c, 0x5c4d, 0x2061, 0x19cb, 0x900e, 0x611a, -+ 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, -+ 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x196a, 0x200b, -+ 0x0000, 0x2009, 0x002d, 0x2011, 0x5bbc, 0x080c, 0x802c, 0x012e, -+ 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, -+ 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x93ac, 0x2071, 0x0140, -+ 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2b24, 0x080c, 0x6fba, -+ 0x0188, 0x080c, 0x6fd5, 0x1170, 0x080c, 0x72a0, 0x0016, 0x080c, -+ 0x277b, 0x2001, 0x193e, 0x2102, 0x001e, 0x080c, 0x729b, 0x080c, -+ 0x6ee4, 0x0050, 0x2009, 0x0001, 0x080c, 0x2a63, 0x2001, 0x0001, -+ 0x080c, 0x260c, 0x080c, 0x5b90, 0x012e, 0x000e, 0x00ee, 0x0005, -+ 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, -+ 0x8017, 0x2001, 0x196a, 0x201c, 0x080c, 0x48d9, 0x003e, 0x002e, -+ 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x080c, -+ 0x5cab, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, -+ 0x080c, 0x5ca5, 0x2099, 0x0260, 0x20a1, 0x1c92, 0x0051, 0x20a9, -+ 0x000e, 0x080c, 0x5ca8, 0x2099, 0x0260, 0x20a1, 0x1cb2, 0x0009, -+ 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, -+ 0x8108, 0x8210, 0x1f04, 0x5c25, 0x002e, 0x001e, 0x0005, 0x080c, -+ 0x9c3f, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, -+ 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0x9c3f, 0x080c, -+ 0x5cab, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, -+ 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, -+ 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, 0x9005, 0x1138, 0x2001, -+ 0x1817, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, -+ 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x655e, -+ 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xd52a, 0x2001, -+ 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, -+ 0x2fa5, 0x080c, 0xc212, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, -+ 0x0007, 0x080c, 0x4a76, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, -+ 0x5b90, 0x7097, 0x0000, 0x708f, 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, 0x1977, -+ 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, -+ 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, -+ 0x5ce5, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, -+ 0x2069, 0x1853, 0x9006, 0xb802, 0xb8be, 0xb807, 0x0707, 0xb80a, -+ 0xb80e, 0xb812, 0x9198, 0x3138, 0x231d, 0x939c, 0x00ff, 0xbb16, -+ 0x0016, 0x0026, 0xb8b2, 0x080c, 0x9db1, 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, 0x101d, 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, 0x5dbb, -+ 0x9182, 0x0800, 0x1a04, 0x5dbf, 0x2001, 0x180c, 0x2004, 0x9084, -+ 0x0003, 0x1904, 0x5dc5, 0x9188, 0x1000, 0x2104, 0x905d, 0x0518, -+ 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, 0x900d, -+ 0x1904, 0x5dd7, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, 0xb852, -+ 0xb84e, 0x080c, 0x840e, 0x9006, 0x012e, 0x0005, 0x00a6, 0x2150, -+ 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, 0x2001, -+ 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, -+ 0x0006, 0x1290, 0x080c, 0x9db1, 0x1160, 0xb8a0, 0x9084, 0xff80, -+ 0x1140, 0xb900, 0xd1fc, 0x0990, 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, -+ 0x6562, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5d6e, 0x080c, -+ 0x63da, 0x0904, 0x5d87, 0x0804, 0x5d72, 0x00b6, 0x00e6, 0x0126, -+ 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x5e58, 0x9188, -+ 0x1000, 0x2104, 0x905d, 0x0904, 0x5e30, 0xb8a0, 0x9086, 0x007f, -+ 0x0178, 0x080c, 0x656a, 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, -+ 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x6562, 0x1598, -+ 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, -+ 0x2010, 0x080c, 0xbb05, 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, -+ 0x5e5a, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, -+ 0x5e5a, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, -+ 0x9ddc, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, -+ 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0x9eac, 0x9006, 0x0458, -+ 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, 0x9db1, -+ 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, -+ 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, 0x5eef, 0x5eaa, 0x5ec1, 0x5eef, 0x5eef, 0x5eef, -+ 0x5eef, 0x5eef, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, 0x61de, -+ 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x5ef7, 0xb814, 0x9206, -+ 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x4793, 0x0150, -+ 0x04b0, 0x080c, 0x623e, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, -+ 0x9206, 0x1568, 0x080c, 0x9ddc, 0x0530, 0x2b00, 0x6012, 0x080c, -+ 0xbf8c, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, -+ 0x9086, 0x0001, 0x1170, 0x080c, 0x2fda, 0x9006, 0x080c, 0x617b, -+ 0x2001, 0x0002, 0x080c, 0x618f, 0x2001, 0x0200, 0xb86e, 0xb893, -+ 0x0002, 0x2009, 0x0003, 0x080c, 0x9eac, 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, 0x60cc, 0x90c6, 0x0056, 0x0904, 0x60d0, 0x90c6, -+ 0x0066, 0x0904, 0x60d4, 0x90c6, 0x0067, 0x0904, 0x60d8, 0x90c6, -+ 0x0068, 0x0904, 0x60dc, 0x90c6, 0x0071, 0x0904, 0x60e0, 0x90c6, -+ 0x0074, 0x0904, 0x60e4, 0x90c6, 0x007c, 0x0904, 0x60e8, 0x90c6, -+ 0x007e, 0x0904, 0x60ec, 0x90c6, 0x0037, 0x0904, 0x60f0, 0x9016, -+ 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x60c7, 0x9182, -+ 0x0800, 0x1a04, 0x60c7, 0x080c, 0x623e, 0x1198, 0xb804, 0x9084, -+ 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, -+ 0x080c, 0x9db1, 0x1904, 0x60b0, 0xb8a0, 0x9084, 0xff80, 0x1904, -+ 0x60b0, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, -+ 0x6010, 0x90c6, 0x0064, 0x0904, 0x6039, 0x2008, 0x0804, 0x5fd3, -+ 0xa998, 0xa8b0, 0x2040, 0x080c, 0x9db1, 0x1120, 0x9182, 0x007f, -+ 0x0a04, 0x5fd3, 0x9186, 0x00ff, 0x0904, 0x5fd3, 0x9182, 0x0800, -+ 0x1a04, 0x5fd3, 0xaaa0, 0xab9c, 0x7878, 0x9306, 0x1188, 0x787c, -+ 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, 0x5fd3, -+ 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804, 0x5fd3, -+ 0x080c, 0x4793, 0x0904, 0x5fdc, 0x900e, 0x9016, 0x90c6, 0x4000, -+ 0x1558, 0x0006, 0x080c, 0x645e, 0x1108, 0xc185, 0xb800, 0xd0bc, -+ 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, -+ 0x080c, 0x0f68, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x0035, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, -+ 0x080c, 0x0f68, 0x000e, 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, -+ 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, -+ 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, -+ 0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, -+ 0x2001, 0x0030, 0x900e, 0x0470, 0x080c, 0x9ddc, 0x1130, 0x2001, -+ 0x4005, 0x2009, 0x0003, 0x9016, 0x0c80, 0x2b00, 0x6012, 0x080c, -+ 0xbf8c, 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, -+ 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x2fda, 0x012e, -+ 0x9006, 0x080c, 0x617b, 0x2001, 0x0002, 0x080c, 0x618f, 0x2009, -+ 0x0002, 0x080c, 0x9eac, 0xa8b0, 0xd094, 0x0118, 0xb8bc, 0xc08d, -+ 0xb8be, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, -+ 0x080c, 0x539a, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, -+ 0x080c, 0x623e, 0x1904, 0x5fce, 0x9186, 0x007f, 0x0130, 0x080c, -+ 0x6562, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, 0x0feb, -+ 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, -+ 0x080c, 0xbcfd, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, -+ 0x5fd5, 0xa998, 0xaeb0, 0x080c, 0x623e, 0x1904, 0x5fce, 0x0096, -+ 0x080c, 0x0feb, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, 0x608d, -+ 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, 0x0f68, 0x009e, 0xa87b, 0x0000, -+ 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, 0x5386, -+ 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, -+ 0xa89b, 0x000c, 0x00b0, 0x080c, 0x6562, 0x0118, 0xa89b, 0x0009, -+ 0x0080, 0x080c, 0x539a, 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, -+ 0xbce0, 0x1904, 0x6009, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, -+ 0x5fd5, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, -+ 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, -+ 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, -+ 0x122f, 0x080c, 0xa334, 0x1904, 0x6009, 0x2009, 0x0002, 0x08e8, -+ 0x2001, 0x0028, 0x900e, 0x0804, 0x600a, 0x2009, 0x180c, 0x210c, -+ 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, -+ 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x600a, 0x2001, -+ 0x0029, 0x900e, 0x0804, 0x600a, 0x080c, 0x355c, 0x0804, 0x600b, -+ 0x080c, 0x50c3, 0x0804, 0x600b, 0x080c, 0x432c, 0x0804, 0x600b, -+ 0x080c, 0x43a5, 0x0804, 0x600b, 0x080c, 0x4401, 0x0804, 0x600b, -+ 0x080c, 0x484f, 0x0804, 0x600b, 0x080c, 0x4afb, 0x0804, 0x600b, -+ 0x080c, 0x4d2e, 0x0804, 0x600b, 0x080c, 0x4f27, 0x0804, 0x600b, -+ 0x080c, 0x376c, 0x0804, 0x600b, 0x00b6, 0xa974, 0xae78, 0x9684, -+ 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800, 0x1268, 0x9188, -+ 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x6562, 0x1148, 0x00e9, -+ 0x080c, 0x6369, 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, 0x19b8, 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, 0x655e, -+ 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, -+ 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, -+ 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0db4, 0x000e, 0x00ce, -+ 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, -+ 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, -+ 0xd0a4, 0x0150, 0x080c, 0x655a, 0x1138, 0x9284, 0x00ff, 0x9086, -+ 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, -+ 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, -+ 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, -+ 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x0feb, 0x2958, 0x009e, -+ 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, 0xb8b6, 0x9006, -+ 0xb8a6, 0x080c, 0x5ceb, 0x9006, 0x0010, 0x9085, 0x0001, 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, 0x101d, 0x00d6, 0x00c6, 0xb8ac, 0x2060, 0x8cff, -+ 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xbb17, 0x0110, -+ 0x080c, 0x0f9d, 0x080c, 0x9e32, 0x00ce, 0x0c88, 0x00ce, 0x00de, -+ 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, 0x102d, 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, -+ 0x6fb2, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0x9db1, -+ 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1953, -+ 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, -+ 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, -+ 0x6886, 0x2069, 0x1800, 0x68b2, 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, 0x1873, 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, 0x0db4, 0x3c00, 0x20e8, -+ 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, -+ 0x014e, 0x013e, 0x0060, 0x080c, 0x0feb, 0x0170, 0x2900, 0xb8a6, -+ 0xa803, 0x0000, 0x080c, 0x63fa, 0xa807, 0x0001, 0xae12, 0x9085, -+ 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, -+ 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, -+ 0x080c, 0x6409, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, -+ 0xa806, 0x0020, 0x080c, 0x101d, 0xb8a7, 0x0000, 0x009e, 0x012e, -+ 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x840e, 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, -+ 0x97b0, 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, 0x00a6, -+ 0x2150, 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, 0x012e, -+ 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, -+ 0x645e, 0x0128, 0x080c, 0xbbd4, 0x0010, 0x9085, 0x0001, 0x0005, -+ 0x080c, 0x645e, 0x0128, 0x080c, 0xbb79, 0x0010, 0x9085, 0x0001, -+ 0x0005, 0x080c, 0x645e, 0x0128, 0x080c, 0xbbd1, 0x0010, 0x9085, -+ 0x0001, 0x0005, 0x080c, 0x645e, 0x0128, 0x080c, 0xbb98, 0x0010, -+ 0x9085, 0x0001, 0x0005, 0x080c, 0x645e, 0x0128, 0x080c, 0xbc15, -+ 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, 0x0feb, 0x0168, 0x2900, -+ 0xb8a6, 0x080c, 0x63fa, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, -+ 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, -+ 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, -+ 0x101d, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, -+ 0x0005, 0x00b6, 0x00f6, 0x080c, 0x6fb2, 0x01b0, 0x71c0, 0x81ff, -+ 0x1198, 0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, -+ 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, -+ 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1853, 0x7804, 0x00d0, -+ 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x623e, 0x1168, -+ 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, -+ 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, -+ 0x6484, 0x015e, 0x080c, 0x6520, 0x0120, 0x2001, 0x1956, 0x200c, -+ 0x0030, 0x2079, 0x1853, 0x7804, 0x0030, 0x2009, 0x07d0, 0x2011, -+ 0x64ae, 0x080c, 0x80ca, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011, -+ 0x64ae, 0x080c, 0x8038, 0x080c, 0x6520, 0x01d8, 0x2001, 0x107e, -+ 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x655e, 0x0130, -+ 0x2009, 0x07d0, 0x2011, 0x64ae, 0x080c, 0x80ca, 0x00e6, 0x2071, -+ 0x1800, 0x9006, 0x707a, 0x705c, 0x707e, 0x080c, 0x2dbb, 0x00ee, -+ 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, -+ 0x623e, 0x1538, 0xb800, 0xd0ec, 0x0520, 0x0046, 0xbaa0, 0x2220, -+ 0x9006, 0x2009, 0x0029, 0x080c, 0xd52a, 0xb800, 0xc0e5, 0xc0ec, -+ 0xb802, 0x080c, 0x655a, 0x2001, 0x0707, 0x1128, 0xb804, 0x9084, -+ 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, 0x0029, 0x080c, 0x8571, -+ 0x0076, 0x903e, 0x080c, 0x8469, 0x900e, 0x080c, 0xd29b, 0x007e, -+ 0x004e, 0x001e, 0x8108, 0x1f04, 0x64d6, 0x00ce, 0x015e, 0x00be, -+ 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, 0xc0ec, 0xb802, 0x00be, -+ 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ac, 0x0005, -+ 0x6010, 0x00b6, 0x905d, 0x0108, 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, 0x0db4, -+ 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, -+ 0x002e, 0x012e, 0x0005, 0x2011, 0x1836, 0x2204, 0xd0cc, 0x0138, -+ 0x2001, 0x1954, 0x200c, 0x2011, 0x6550, 0x080c, 0x80ca, 0x0005, -+ 0x2011, 0x6550, 0x080c, 0x8038, 0x2011, 0x1836, 0x2204, 0xc0cc, -+ 0x2012, 0x0005, 0x080c, 0x5386, 0xd0ac, 0x0005, 0x080c, 0x5386, -+ 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, -+ 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, -+ 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xc212, 0x0158, -+ 0x70d8, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, -+ 0x0110, 0xb8bc, 0xd094, 0x00fe, 0x00be, 0x0005, 0x0006, 0x0016, -+ 0x0036, 0x0046, 0x0076, 0x00b6, 0x2001, 0x1817, 0x203c, 0x9780, -+ 0x3138, 0x203d, 0x97bc, 0xff00, 0x873f, 0x9006, 0x2018, 0x2008, -+ 0x9284, 0x8000, 0x0110, 0x2019, 0x0001, 0x9294, 0x7fff, 0x2100, -+ 0x9706, 0x0190, 0x91a0, 0x1000, 0x2404, 0x905d, 0x0168, 0xb804, -+ 0x9084, 0x00ff, 0x9086, 0x0006, 0x1138, 0x83ff, 0x0118, 0xb89c, -+ 0xd0a4, 0x0110, 0x8211, 0x0158, 0x8108, 0x83ff, 0x0120, 0x9182, -+ 0x0800, 0x0e28, 0x0068, 0x9182, 0x007e, 0x0e08, 0x0048, 0x00be, -+ 0x007e, 0x004e, 0x003e, 0x001e, 0x9085, 0x0001, 0x000e, 0x0005, -+ 0x00be, 0x007e, 0x004e, 0x003e, 0x001e, 0x9006, 0x000e, 0x0005, -+ 0x0046, 0x0056, 0x0076, 0x00b6, 0x2100, 0x9084, 0x7fff, 0x9080, -+ 0x1000, 0x2004, 0x905d, 0x0130, 0xb804, 0x9084, 0x00ff, 0x9086, -+ 0x0006, 0x0550, 0x9184, 0x8000, 0x0580, 0x2001, 0x1817, 0x203c, -+ 0x9780, 0x3138, 0x203d, 0x97bc, 0xff00, 0x873f, 0x9006, 0x2020, -+ 0x2400, 0x9706, 0x01a0, 0x94a8, 0x1000, 0x2504, 0x905d, 0x0178, -+ 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1148, 0xb89c, 0xd0a4, -+ 0x0130, 0xb814, 0x9206, 0x1118, 0xb810, 0x9306, 0x0128, 0x8420, -+ 0x9482, 0x0800, 0x0e28, 0x0048, 0x918c, 0x7fff, 0x00be, 0x007e, -+ 0x005e, 0x004e, 0x9085, 0x0001, 0x0005, 0x918c, 0x7fff, 0x00be, -+ 0x007e, 0x005e, 0x004e, 0x9006, 0x0005, 0x2071, 0x1906, 0x7003, -+ 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, -+ 0x700a, 0x7046, 0x2001, 0x1919, 0x2003, 0x0000, 0x0005, 0x0016, -+ 0x00e6, 0x2071, 0x191a, 0x900e, 0x710a, 0x080c, 0x5386, 0xd0fc, -+ 0x1140, 0x080c, 0x5386, 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, -+ 0x0400, 0x2001, 0x1873, 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, -+ 0x6639, 0x6639, 0x6639, 0x6639, 0x6639, 0x6650, 0x665e, 0x6639, -+ 0x7003, 0x0003, 0x2009, 0x1874, 0x210c, 0x9184, 0xff00, 0x8007, -+ 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, -+ 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, -+ 0x9005, 0x1150, 0x00e6, 0x2071, 0x1906, 0x7028, 0xc085, 0x702a, -+ 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, -+ 0x7308, 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, 0x1906, 0x7028, 0xc084, 0x702a, 0x7007, -+ 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0xa868, -+ 0xd0fc, 0x11d8, 0x00e6, 0x0026, 0x2001, 0x191a, 0x2004, 0x9005, -+ 0x0904, 0x6891, 0xa87c, 0xd0bc, 0x1904, 0x6891, 0xa978, 0xa874, -+ 0x9105, 0x1904, 0x6891, 0x2001, 0x191a, 0x2004, 0x0002, 0x6891, -+ 0x66ea, 0x6726, 0x6726, 0x6891, 0x6726, 0x0005, 0xa868, 0xd0fc, -+ 0x1500, 0x00e6, 0x0026, 0x2009, 0x191a, 0x210c, 0x81ff, 0x0904, -+ 0x6891, 0xa87c, 0xd0cc, 0x0904, 0x6891, 0xa880, 0x9084, 0x00ff, -+ 0x9086, 0x0001, 0x1904, 0x6891, 0x9186, 0x0003, 0x0904, 0x6726, -+ 0x9186, 0x0005, 0x0904, 0x6726, 0xa84f, 0x8021, 0xa853, 0x0017, -+ 0x0028, 0x0005, 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1906, -+ 0x701c, 0x9005, 0x1904, 0x6a51, 0x0e04, 0x6a9c, 0x2071, 0x0000, -+ 0xa84c, 0x7082, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, -+ 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, -+ 0x1187, 0x2071, 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, -+ 0x1158, 0xa802, 0x2900, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, -+ 0x7f5d, 0x002e, 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, -+ 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, -+ 0x00f6, 0x2079, 0x0050, 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, -+ 0x9005, 0x1904, 0x6815, 0x782c, 0x908c, 0x0780, 0x190c, 0x6bc3, -+ 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6744, 0x6815, -+ 0x6769, 0x67b0, 0x080c, 0x0db4, 0x2071, 0x1800, 0x2900, 0x7822, -+ 0xa804, 0x900d, 0x1170, 0x2071, 0x19cb, 0x703c, 0x9005, 0x1328, -+ 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, -+ 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, -+ 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7f5d, -+ 0x0c10, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1580, -+ 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, -+ 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, 0x00ee, 0x0058, -+ 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, -+ 0x70be, 0x080c, 0x7f5d, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bc3, -+ 0xd0a4, 0x19f0, 0x2071, 0x19cb, 0x703c, 0x9005, 0x1328, 0x2001, -+ 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7f5d, 0x0800, -+ 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, -+ 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7f5d, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd0a4, 0x1d60, 0x00ee, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd09c, 0x11a0, 0x009e, 0x2900, -+ 0x7822, 0xa804, 0x900d, 0x1560, 0x2071, 0x19cb, 0x703c, 0x9005, -+ 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, -+ 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, -+ 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, -+ 0x900d, 0x1170, 0x2071, 0x19cb, 0x703c, 0x9005, 0x1328, 0x2001, -+ 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, -+ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, -+ 0x7f5d, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, -+ 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, -+ 0x2148, 0xa804, 0x900d, 0x1904, 0x686a, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6bc3, 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, -+ 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd09c, 0x0d68, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd0a4, 0x01b0, 0x00e6, 0x7824, -+ 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, -+ 0x8000, 0x70be, 0x080c, 0x7f5d, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x6bc3, 0xd0a4, 0x1d60, 0x00ee, 0x2071, 0x19cb, 0x703c, 0x9005, -+ 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, -+ 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, -+ 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, -+ 0x9200, 0x70be, 0x080c, 0x7f5d, 0x00ee, 0x0804, 0x6825, 0xa868, -+ 0xd0fc, 0x1904, 0x68cd, 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, -+ 0x190c, 0x0f9d, 0x009e, 0x0018, 0xa868, 0xd0fc, 0x15f0, 0x00e6, -+ 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, 0x2071, 0x1800, -+ 0x70e8, 0x8001, 0x01d0, 0x1678, 0x2071, 0x1906, 0xa803, 0x0000, -+ 0x7010, 0x9005, 0x1904, 0x69cb, 0x782c, 0x908c, 0x0780, 0x190c, -+ 0x6bc3, 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x68ce, -+ 0x69cb, 0x68e9, 0x695a, 0x080c, 0x0db4, 0x70eb, 0x0fa0, 0x71e4, -+ 0x8107, 0x9106, 0x9094, 0x00c0, 0x9184, 0xff3f, 0x9205, 0x70e6, -+ 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, -+ 0x9205, 0x20d0, 0x0888, 0x70ea, 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, 0x080c, 0x7f5d, -+ 0x0c60, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, -+ 0x6949, 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, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, -+ 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x7f5d, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd0a4, 0x19f0, 0x0e04, 0x6940, -+ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, -+ 0x6833, 0x0013, 0x00de, 0x2001, 0x1917, 0x200c, 0xc184, 0x2102, -+ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, -+ 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x2001, 0x1917, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, -+ 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, -+ 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x7f5d, -+ 0x0804, 0x68fc, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, -+ 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, -+ 0x7f5d, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd0a4, 0x1d60, -+ 0x00ee, 0x0e04, 0x699e, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, -+ 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, -+ 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, -+ 0x1187, 0x2009, 0x1919, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6bc3, 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, 0x080c, 0x7f5d, 0x00fe, -+ 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, -+ 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, -+ 0x900d, 0x1904, 0x6a3c, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bc3, -+ 0xd09c, 0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, -+ 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, -+ 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd09c, 0x0d50, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd0a4, 0x05c8, 0x00e6, -+ 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, -+ 0x70bc, 0x8000, 0x70be, 0x080c, 0x7f5d, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6bc3, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6a35, 0x7838, -+ 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, -+ 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, -+ 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x2009, 0x1919, 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, 0x080c, 0x7f5d, 0x00ee, 0x0804, -+ 0x69db, 0x2071, 0x1906, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, -+ 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, -+ 0x2148, 0xa804, 0x900d, 0x1128, 0x1e04, 0x6a7c, 0x002e, 0x00ee, -+ 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, -+ 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, -+ 0x080c, 0x7f5d, 0x0e04, 0x6a66, 0x2071, 0x1906, 0x701c, 0x2048, -+ 0xa84c, 0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, -+ 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, -+ 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x2071, 0x1906, 0x080c, -+ 0x6baf, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1906, 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, 0x080c, 0x7f5d, 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, 0x1906, 0x7004, -+ 0x0002, 0x6ae7, 0x6ae8, 0x6bae, 0x6ae8, 0x0db4, 0x6bae, 0x0005, -+ 0x2001, 0x191a, 0x2004, 0x0002, 0x6af2, 0x6af2, 0x6b47, 0x6b48, -+ 0x6af2, 0x6b48, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6bce, 0x701c, -+ 0x904d, 0x01e0, 0xa84c, 0x9005, 0x01d8, 0x0e04, 0x6b16, 0xa94c, -+ 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, -+ 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, -+ 0x190c, 0x1187, 0x2071, 0x1906, 0x080c, 0x6baf, 0x012e, 0x0470, -+ 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd09c, -+ 0x2071, 0x1906, 0x1510, 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, -+ 0x9184, 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, -+ 0x8101, 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, -+ 0x00de, 0x2071, 0x1906, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, -+ 0xa800, 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, -+ 0x00d6, 0x2008, 0x2069, 0x19cb, 0x683c, 0x9005, 0x0760, 0x0158, -+ 0x9186, 0x0003, 0x0540, 0x2001, 0x1814, 0x2004, 0x2009, 0x1a98, -+ 0x210c, 0x9102, 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, -+ 0x693c, 0x6838, 0x9106, 0x0190, 0x0e04, 0x6b7a, 0x2069, 0x0000, -+ 0x6837, 0x8040, 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, -+ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x2069, 0x19cb, -+ 0x683f, 0xffff, 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, -+ 0x6c3f, 0x701c, 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, -+ 0x0780, 0x15c9, 0xd09c, 0x1500, 0x2071, 0x1906, 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, 0x101d, -+ 0x0005, 0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, 0x6bc5, 0x0006, -+ 0x0016, 0x2001, 0x8004, 0x0006, 0x0804, 0x0dbd, 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, 0x1187, 0x2009, 0x1919, 0x200b, 0x0000, 0x00fe, 0x009e, -+ 0x0005, 0x782c, 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, -+ 0x1919, 0x2104, 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, -+ 0x2071, 0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, -+ 0x1148, 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, 0x0218, 0x7022, -+ 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, -+ 0x70bc, 0x8000, 0x70be, 0x080c, 0x7f5d, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6bc3, 0xd0a4, 0x19f0, 0x7838, 0x7938, 0x910e, 0x1de0, -+ 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, -+ 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x1187, 0x2009, -+ 0x1919, 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, 0x1187, 0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x6bc3, 0xd0a4, 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, -+ 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, -+ 0x7f5d, 0x782c, 0x9094, 0x0780, 0x190c, 0x6bc3, 0xd0a4, 0x1d70, -+ 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x191a, 0x6808, 0x690a, -+ 0x2069, 0x19cb, 0x9102, 0x1118, 0x683c, 0x9005, 0x1328, 0x2001, -+ 0x191b, 0x200c, 0x810d, 0x693e, 0x00de, 0x00ee, 0x00fe, 0x0005, -+ 0x7094, 0x908a, 0x0029, 0x1a0c, 0x0db4, 0x9082, 0x001d, 0x001b, -+ 0x6027, 0x1e00, 0x0005, 0x6d67, 0x6ced, 0x6d09, 0x6d33, 0x6d56, -+ 0x6d96, 0x6da8, 0x6d09, 0x6d7e, 0x6ca8, 0x6cd6, 0x6ca7, 0x0005, -+ 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, -+ 0x1518, 0x7097, 0x0028, 0x2069, 0x1960, 0x2d04, 0x7002, 0x080c, -+ 0x70eb, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x7097, 0x0028, -+ 0x2069, 0x1960, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, -+ 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a33, 0x080c, 0x1958, -+ 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, -+ 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x7097, -+ 0x0028, 0x2069, 0x1960, 0x2d04, 0x7002, 0x080c, 0x7185, 0x6028, -+ 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, -+ 0x080c, 0x2b14, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x6e15, -+ 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7097, 0x0020, -+ 0x080c, 0x6e15, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, -+ 0x0005, 0x2001, 0x0088, 0x080c, 0x2b14, 0x6124, 0xd1cc, 0x11e8, -+ 0xd1dc, 0x11c0, 0xd1e4, 0x1198, 0x9184, 0x1e00, 0x11d8, 0x080c, -+ 0x1982, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x6fde, -+ 0x2001, 0x0080, 0x080c, 0x2b14, 0x7097, 0x0028, 0x0058, 0x7097, -+ 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, 0x7097, 0x0020, 0x0010, -+ 0x7097, 0x001f, 0x0005, 0x080c, 0x1982, 0x60e3, 0x0001, 0x600c, -+ 0xc0b4, 0x600e, 0x080c, 0x6fde, 0x2001, 0x0080, 0x080c, 0x2b14, -+ 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, -+ 0x1e00, 0x1158, 0x7097, 0x0028, 0x0040, 0x7097, 0x001e, 0x0028, -+ 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, 0x2001, 0x00a0, -+ 0x080c, 0x2b14, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, -+ 0x1982, 0x7097, 0x001e, 0x0010, 0x7097, 0x001d, 0x0005, 0x080c, -+ 0x6e98, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x6e15, 0x0016, 0x080c, -+ 0x1982, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x7097, 0x001e, -+ 0x0020, 0x7097, 0x001f, 0x080c, 0x6e15, 0x0005, 0x0006, 0x2001, -+ 0x00a0, 0x080c, 0x2b14, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, -+ 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7097, 0x001e, 0x0028, -+ 0x7097, 0x001d, 0x0010, 0x7097, 0x0021, 0x0005, 0x080c, 0x6e98, -+ 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7097, -+ 0x001e, 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, -+ 0x0006, 0x2001, 0x0090, 0x080c, 0x2b14, 0x000e, 0x6124, 0xd1d4, -+ 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x7097, -+ 0x001e, 0x0040, 0x7097, 0x001d, 0x0028, 0x7097, 0x0020, 0x0010, -+ 0x7097, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, -+ 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, -+ 0x080c, 0x6fb2, 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, -+ 0xc1b4, 0x2102, 0x6027, 0x0200, 0x080c, 0x2a5d, 0x6024, 0xd0cc, -+ 0x0148, 0x2001, 0x00a0, 0x080c, 0x2b14, 0x080c, 0x7296, 0x080c, -+ 0x5cd1, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x6fcc, -+ 0x0150, 0x080c, 0x6fc3, 0x1138, 0x2001, 0x0001, 0x080c, 0x260c, -+ 0x080c, 0x6f8a, 0x00a0, 0x080c, 0x6e95, 0x0178, 0x2001, 0x0001, -+ 0x080c, 0x260c, 0x7094, 0x9086, 0x001e, 0x0120, 0x7094, 0x9086, -+ 0x0022, 0x1118, 0x7097, 0x0025, 0x0010, 0x7097, 0x0021, 0x012e, -+ 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x6e26, -+ 0x080c, 0x810c, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, -+ 0x6e26, 0x080c, 0x8103, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, -+ 0x0016, 0x080c, 0x93ac, 0x2071, 0x1800, 0x080c, 0x6dc3, 0x001e, -+ 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, -+ 0x00e6, 0x00f6, 0x0126, 0x080c, 0x93ac, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, -+ 0x2011, 0x0003, 0x080c, 0x9771, 0x2011, 0x0002, 0x080c, 0x977b, -+ 0x080c, 0x9662, 0x080c, 0x80b8, 0x0036, 0x901e, 0x080c, 0x96d8, -+ 0x003e, 0x60e3, 0x0000, 0x080c, 0xd8b4, 0x080c, 0xd8cf, 0x2009, -+ 0x0004, 0x080c, 0x2a63, 0x080c, 0x297e, 0x2001, 0x1800, 0x2003, -+ 0x0004, 0x6027, 0x0008, 0x2011, 0x6e26, 0x080c, 0x810c, 0x080c, -+ 0x6fcc, 0x0118, 0x9006, 0x080c, 0x2b14, 0x080c, 0x0b8f, 0x2001, -+ 0x0001, 0x080c, 0x260c, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, 0x6e33, -+ 0x2071, 0x19cb, 0x701c, 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, -+ 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, -+ 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, -+ 0x080c, 0x2b14, 0x0156, 0x20a9, 0x002d, 0x1d04, 0x6ea5, 0x2091, -+ 0x6000, 0x1f04, 0x6ea5, 0x015e, 0x00d6, 0x2069, 0x1800, 0x6898, -+ 0x8001, 0x0220, 0x0118, 0x689a, 0x00de, 0x0005, 0x689b, 0x0014, -+ 0x68e4, 0xd0dc, 0x0dc8, 0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, -+ 0x8118, 0x0c90, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x2071, 0x1800, 0x080c, 0x72a5, 0x2001, 0x193e, 0x2003, -+ 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c, 0x26d7, 0x9006, -+ 0x080c, 0x2b14, 0x080c, 0x5b90, 0x6027, 0xffff, 0x602b, 0x182f, -+ 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, -+ 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, 0x194e, 0x200c, -+ 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, 0x0002, -+ 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x6f7a, 0x7097, 0x0022, -+ 0x0040, 0x7097, 0x0021, 0x0028, 0x7097, 0x0023, 0x0010, 0x7097, -+ 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, -+ 0x26d7, 0x0026, 0x080c, 0x9db8, 0x002e, 0x7000, 0x908e, 0x0004, -+ 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, -+ 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, -+ 0x015e, 0x080c, 0xc212, 0x0118, 0x9006, 0x080c, 0x2b3e, 0x0804, -+ 0x6f86, 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2a5d, -+ 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, 0x2b14, 0x1f04, -+ 0x6f24, 0x080c, 0x7009, 0x012e, 0x015e, 0x080c, 0x6fc3, 0x01a8, -+ 0x6044, 0x9005, 0x0168, 0x6050, 0x0006, 0x9085, 0x0020, 0x6052, -+ 0x080c, 0x7009, 0x9006, 0x8001, 0x1df0, 0x000e, 0x6052, 0x0028, -+ 0x6804, 0xd0d4, 0x1110, 0x080c, 0x7009, 0x080c, 0xc212, 0x0118, -+ 0x9006, 0x080c, 0x2b3e, 0x0016, 0x0026, 0x7000, 0x908e, 0x0004, -+ 0x0130, 0x2009, 0x00c8, 0x2011, 0x6e33, 0x080c, 0x80ca, 0x002e, -+ 0x001e, 0x080c, 0x7f54, 0x7034, 0xc085, 0x7036, 0x2001, 0x194e, -+ 0x2003, 0x0004, 0x080c, 0x6c90, 0x080c, 0x6fc3, 0x0138, 0x6804, -+ 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x729b, 0x00ee, 0x00de, -+ 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x2071, 0x1800, 0x080c, 0x7f6b, 0x080c, 0x7f5d, 0x080c, -+ 0x72a5, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, 0x7096, 0x60e2, -+ 0x6886, 0x080c, 0x26d7, 0x9006, 0x080c, 0x2b14, 0x6043, 0x0090, -+ 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, 0x00ee, 0x00de, -+ 0x00ce, 0x0005, 0x0006, 0x2001, 0x194d, 0x2004, 0x9086, 0xaaaa, -+ 0x000e, 0x0005, 0x0006, 0x080c, 0x538a, 0x9084, 0x0030, 0x9086, -+ 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x538a, 0x9084, 0x0030, -+ 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c, 0x538a, 0x9084, -+ 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006, 0x080c, 0x538a, -+ 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, -+ 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180, 0x0020, 0x080c, -+ 0x26f7, 0x900e, 0x0028, 0x080c, 0x655a, 0x1dc8, 0x2009, 0x0002, -+ 0x2019, 0x0028, 0x080c, 0x2fa5, 0x9006, 0x0019, 0x001e, 0x003e, -+ 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, 0xc20b, -+ 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, 0x701e, -+ 0x2091, 0x6000, 0x1f04, 0x701e, 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, 0x26d7, 0x2001, 0x00a0, 0x0006, 0x080c, -+ 0xc212, 0x000e, 0x0130, 0x080c, 0x2b32, 0x9006, 0x080c, 0x2b3e, -+ 0x0010, 0x080c, 0x2b14, 0x000e, 0x6052, 0x6050, 0x0006, 0xc0e5, -+ 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, 0x29d2, 0x00fe, 0x000e, -+ 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, -+ 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x6020, -+ 0x9084, 0x0080, 0x0138, 0x2001, 0x180c, 0x200c, 0xc1c5, 0x2102, -+ 0x0804, 0x70dd, 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, 0x6028, -+ 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x2001, 0x0090, 0x080c, -+ 0x2b14, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1518, 0x1d04, 0x708b, -+ 0x2091, 0x6000, 0x1f04, 0x708b, 0x2011, 0x0003, 0x080c, 0x9771, -+ 0x2011, 0x0002, 0x080c, 0x977b, 0x080c, 0x9662, 0x901e, 0x080c, -+ 0x96d8, 0x2001, 0x00a0, 0x080c, 0x2b14, 0x080c, 0x7296, 0x080c, -+ 0x5cd1, 0x080c, 0xc212, 0x0110, 0x080c, 0x0d22, 0x9085, 0x0001, -+ 0x0490, 0x86ff, 0x1110, 0x080c, 0x1982, 0x60e3, 0x0000, 0x2001, -+ 0x0002, 0x080c, 0x26d7, 0x60e2, 0x2001, 0x0080, 0x080c, 0x2b14, -+ 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2a5d, -+ 0x6024, 0x910c, 0x0138, 0x1d04, 0x70c2, 0x2091, 0x6000, 0x1f04, -+ 0x70c2, 0x0810, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70b0, 0x9005, -+ 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, 0xc212, 0x0110, -+ 0x080c, 0x0d22, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, -+ 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, -+ 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x7000, 0x9086, -+ 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, 0x9084, 0x5540, 0x9086, -+ 0x5540, 0x1128, 0x2069, 0x1a49, 0x2d04, 0x8000, 0x206a, 0x2069, -+ 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, -+ 0x7150, 0x2001, 0x0088, 0x080c, 0x2b14, 0x9006, 0x60e2, 0x6886, -+ 0x080c, 0x26d7, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, -+ 0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x6027, 0x0400, -+ 0x2069, 0x1960, 0x7000, 0x206a, 0x7097, 0x0026, 0x7003, 0x0001, -+ 0x20a9, 0x0002, 0x1d04, 0x7132, 0x2091, 0x6000, 0x1f04, 0x7132, -+ 0x0804, 0x717d, 0x2069, 0x0140, 0x20a9, 0x0384, 0x6027, 0x1e00, -+ 0x2009, 0x1e00, 0x080c, 0x2a5d, 0x6024, 0x910c, 0x0508, 0x9084, -+ 0x1a00, 0x11f0, 0x1d04, 0x713e, 0x2091, 0x6000, 0x1f04, 0x713e, -+ 0x2011, 0x0003, 0x080c, 0x9771, 0x2011, 0x0002, 0x080c, 0x977b, -+ 0x080c, 0x9662, 0x901e, 0x080c, 0x96d8, 0x2001, 0x00a0, 0x080c, -+ 0x2b14, 0x080c, 0x7296, 0x080c, 0x5cd1, 0x9085, 0x0001, 0x00a8, -+ 0x2001, 0x0080, 0x080c, 0x2b14, 0x2069, 0x0140, 0x60e3, 0x0000, -+ 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, -+ 0x0002, 0x080c, 0x26d7, 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, 0x9771, -+ 0x2011, 0x0002, 0x080c, 0x977b, 0x080c, 0x9662, 0x901e, 0x080c, -+ 0x96d8, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x2b14, 0x080c, -+ 0x7296, 0x080c, 0x5cd1, 0x0804, 0x7217, 0x2001, 0x180c, 0x200c, -+ 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6e1b, 0x2069, 0x0140, -+ 0x2001, 0x0080, 0x080c, 0x2b14, 0x60e3, 0x0000, 0x2069, 0x0200, -+ 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0180, 0x6028, 0x9084, -+ 0xfdff, 0x602a, 0x6027, 0x0200, 0x2069, 0x1960, 0x7000, 0x206a, -+ 0x7097, 0x0027, 0x7003, 0x0001, 0x0804, 0x7217, 0x6027, 0x1e00, -+ 0x2009, 0x1e00, 0x080c, 0x2a5d, 0x6024, 0x910c, 0x01c8, 0x9084, -+ 0x1c00, 0x11b0, 0x1d04, 0x71d6, 0x0006, 0x0016, 0x00c6, 0x00d6, -+ 0x00e6, 0x080c, 0x7f9c, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, -+ 0x00e6, 0x2071, 0x19cb, 0x7018, 0x00ee, 0x9005, 0x19f8, 0x01f8, -+ 0x0026, 0x2011, 0x6e33, 0x080c, 0x8038, 0x2011, 0x6e26, 0x080c, -+ 0x810c, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b0, 0x9005, -+ 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x0002, 0x080c, -+ 0x26d7, 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, 0xc20b, 0x1904, 0x7284, 0x7130, 0xd184, -+ 0x1170, 0x080c, 0x3133, 0x0138, 0xc18d, 0x7132, 0x2011, 0x1854, -+ 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, 0x7284, 0x2011, -+ 0x1854, 0x220c, 0x0438, 0x0016, 0x2019, 0x000e, 0x080c, 0xd4a6, -+ 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, -+ 0x9186, 0x0080, 0x0188, 0x080c, 0x623e, 0x1170, 0x2120, 0x9006, -+ 0x0016, 0x2009, 0x000e, 0x080c, 0xd52a, 0x2009, 0x0001, 0x2011, -+ 0x0100, 0x080c, 0x822f, 0x001e, 0x8108, 0x1f04, 0x724d, 0x00be, -+ 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, -+ 0x0004, 0x080c, 0x2fa5, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, -+ 0x007f, 0x900e, 0x080c, 0x623e, 0x1110, 0x080c, 0x5ceb, 0x8108, -+ 0x1f04, 0x727a, 0x00be, 0x015e, 0x080c, 0x1982, 0x080c, 0x9db8, -+ 0x60e3, 0x0000, 0x080c, 0x5cd1, 0x080c, 0x6ee4, 0x00ee, 0x00ce, -+ 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x194e, -+ 0x2003, 0x0001, 0x0005, 0x2001, 0x194e, 0x2003, 0x0000, 0x0005, -+ 0x2001, 0x194d, 0x2003, 0xaaaa, 0x0005, 0x2001, 0x194d, 0x2003, -+ 0x0000, 0x0005, 0x2071, 0x18f0, 0x7003, 0x0000, 0x7007, 0x0000, -+ 0x080c, 0x1004, 0x090c, 0x0db4, 0xa8ab, 0xdcb0, 0x2900, 0x704e, -+ 0x080c, 0x1004, 0x090c, 0x0db4, 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, 0x18f0, -+ 0x6807, 0x0001, 0x00de, 0x080c, 0x7897, 0x9006, 0x00ee, 0x0005, -+ 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x2011, 0x0100, 0x2214, -+ 0x9296, 0x0008, 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x1f04, -+ 0x730c, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18f0, 0x7004, -+ 0x0002, 0x732b, 0x732c, 0x7363, 0x73be, 0x74ff, 0x7329, 0x7329, -+ 0x7529, 0x080c, 0x0db4, 0x0005, 0x2079, 0x0040, 0x782c, 0x908c, -+ 0x0780, 0x190c, 0x7923, 0xd0a4, 0x01f0, 0x7824, 0x2048, 0x9006, -+ 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x0040, 0x0608, -+ 0x00b8, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, 0x1160, 0x7104, -+ 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, 0x9186, 0x0003, -+ 0x19e8, 0x080c, 0x73be, 0x782c, 0xd09c, 0x090c, 0x7897, 0x0005, -+ 0x9082, 0x005a, 0x1218, 0x2100, 0x003b, 0x0c18, 0x080c, 0x73f4, -+ 0x0c90, 0x00e3, 0x08f0, 0x0005, 0x73f4, 0x73f4, 0x73f4, 0x73f4, -+ 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x7416, 0x73f4, 0x73f4, 0x73f4, -+ 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, -+ 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, -+ 0x7400, 0x73f4, 0x75fe, 0x73f4, 0x73f4, 0x73f4, 0x7416, 0x73f4, -+ 0x7400, 0x763f, 0x7680, 0x76c7, 0x76db, 0x73f4, 0x73f4, 0x7416, -+ 0x7400, 0x73f4, 0x73f4, 0x74d3, 0x7786, 0x77a1, 0x73f4, 0x7416, -+ 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x74c9, 0x77a1, 0x73f4, 0x73f4, -+ 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x742a, -+ 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, -+ 0x73f4, 0x78c7, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x743e, -+ 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x73f4, 0x2079, 0x0040, -+ 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, 0x78c0, 0xd0a4, -+ 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, -+ 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, -+ 0x7897, 0x0005, 0x73f4, 0x7400, 0x75ea, 0x73f4, 0x7400, 0x73f4, -+ 0x7400, 0x7400, 0x73f4, 0x7400, 0x75ea, 0x7400, 0x7400, 0x7400, -+ 0x7400, 0x7400, 0x73f4, 0x7400, 0x75ea, 0x73f4, 0x73f4, 0x7400, -+ 0x73f4, 0x73f4, 0x73f4, 0x7400, 0x00e6, 0x2071, 0x18f0, 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, 0x688c, 0x012e, 0x0005, 0xa864, 0x8007, -+ 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, -+ 0x75a8, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, -+ 0x75a8, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, -+ 0x1120, 0x7007, 0x0001, 0x0804, 0x75c3, 0x7007, 0x0003, 0x7012, -+ 0x2900, 0x7016, 0x701a, 0x704b, 0x75c3, 0x0005, 0xa864, 0x8007, -+ 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, 0x73fc, 0x7007, 0x0001, -+ 0x2009, 0x1833, 0x210c, 0x81ff, 0x1904, 0x74a0, 0xa994, 0x9186, -+ 0x006f, 0x0188, 0x9186, 0x0074, 0x15b0, 0x0026, 0x2011, 0x0010, -+ 0x080c, 0x6586, 0x002e, 0x0578, 0x0016, 0xa998, 0x080c, 0x65d0, -+ 0x001e, 0x1548, 0x0400, 0x080c, 0x6fb2, 0x0140, 0xa897, 0x4005, -+ 0xa89b, 0x0016, 0x2001, 0x0030, 0x900e, 0x0438, 0x0026, 0x2011, -+ 0x8008, 0x080c, 0x6586, 0x002e, 0x01b0, 0x0016, 0x0026, 0x0036, -+ 0xa998, 0xaaa0, 0xab9c, 0x918d, 0x8000, 0x080c, 0x65d0, 0x003e, -+ 0x002e, 0x001e, 0x1140, 0xa897, 0x4005, 0xa89b, 0x4009, 0x2001, -+ 0x0030, 0x900e, 0x0050, 0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, -+ 0x0000, 0x080c, 0x5f00, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, -+ 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x688c, 0x012e, 0x0ca0, -+ 0xa994, 0x9186, 0x0071, 0x0904, 0x744e, 0x9186, 0x0064, 0x0904, -+ 0x744e, 0x9186, 0x007c, 0x0904, 0x744e, 0x9186, 0x0028, 0x0904, -+ 0x744e, 0x9186, 0x0038, 0x0904, 0x744e, 0x9186, 0x0078, 0x0904, -+ 0x744e, 0x9186, 0x005f, 0x0904, 0x744e, 0x9186, 0x0056, 0x0904, -+ 0x744e, 0xa897, 0x4005, 0xa89b, 0x0001, 0x2001, 0x0030, 0x900e, -+ 0x0860, 0xa87c, 0x9084, 0x00c0, 0x9086, 0x00c0, 0x1120, 0x7007, -+ 0x0001, 0x0804, 0x77b8, 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, 0x7404, 0xaab4, 0x928a, 0x0002, -+ 0x1a04, 0x7404, 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, -+ 0x2001, 0x7566, 0x0018, 0x9280, 0x755c, 0x2005, 0x7056, 0x7010, -+ 0x9015, 0x0904, 0x7547, 0x080c, 0x1004, 0x1118, 0x7007, 0x0004, -+ 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, 0xe000, 0xa866, 0x7050, -+ 0x2040, 0xa95c, 0xe004, 0x9100, 0xa076, 0xa860, 0xa072, 0xe008, -+ 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, -+ 0x9296, 0x0004, 0x0108, 0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, -+ 0x10d5, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086, 0x0200, 0x0118, -+ 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, 0x080c, 0x101d, 0x7014, -+ 0x2048, 0x0804, 0x7404, 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, -+ 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804, 0x74ff, 0x7014, -+ 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, -+ 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, -+ 0x0904, 0x77b8, 0x0804, 0x75a8, 0x755e, 0x7562, 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, 0x5d4d, 0x1108, -+ 0x0005, 0x080c, 0x6ac6, 0x0126, 0x2091, 0x8000, 0x080c, 0xbe06, -+ 0x080c, 0x688c, 0x012e, 0x0ca0, 0x080c, 0xc20b, 0x1d70, 0x2001, -+ 0x0028, 0x900e, 0x0c70, 0x2009, 0x1833, 0x210c, 0x81ff, 0x11d8, -+ 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, -+ 0x080c, 0x5e62, 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c, 0x5ddd, -+ 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, -+ 0x688c, 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, 0x623e, -+ 0x11b8, 0x0066, 0xae80, 0x080c, 0x634e, 0x006e, 0x0088, 0x0046, -+ 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, -+ 0x623e, 0x1110, 0x080c, 0x644e, 0x8108, 0x1f04, 0x7627, 0x00ce, -+ 0xa87c, 0xd084, 0x1120, 0x080c, 0x101d, 0x00be, 0x0005, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x688c, 0x012e, 0x00be, 0x0005, 0x0126, -+ 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x655e, 0x0580, 0x2061, -+ 0x1a41, 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, 0x7881, 0x012e, -+ 0x0804, 0x787b, 0x012e, 0x0804, 0x7875, 0x012e, 0x0804, 0x7878, -+ 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x655e, 0x05e0, -+ 0x2061, 0x1a41, 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, -+ 0x7881, 0x012e, 0x0804, 0x787e, 0x012e, 0x0804, 0x787b, 0x0126, -+ 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a41, 0x6300, 0xd38c, -+ 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, 0x788f, -+ 0x012e, 0x0804, 0x787e, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, -+ 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a41, -+ 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, -+ 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1833, 0x2004, 0x9005, -+ 0x0118, 0x080c, 0x9e62, 0x0068, 0x6017, 0xf400, 0x605b, 0x0000, -+ 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x615a, 0x2009, 0x0041, 0x080c, -+ 0x9eac, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, -+ 0x900e, 0x2011, 0xfdff, 0x080c, 0x822f, 0x002e, 0xa87c, 0xd0c4, -+ 0x0148, 0x2061, 0x1a41, 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, -+ 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7881, 0x00ce, -+ 0x012e, 0x00be, 0x0804, 0x787b, 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, 0x623e, -+ 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, -+ 0x6007, 0x0024, 0x2001, 0x1957, 0x2004, 0x601a, 0x0804, 0x7716, -+ 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001, 0x1833, -+ 0x2004, 0x9005, 0x0150, 0x080c, 0x9e62, 0x8eff, 0x0118, 0x2e60, -+ 0x080c, 0x9e62, 0x00ee, 0x0804, 0x7716, 0x6024, 0xc0dc, 0xc0d5, -+ 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, -+ 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x00ee, 0x0804, 0x7716, 0x2061, 0x1a41, -+ 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x788f, 0x0126, 0x2091, -+ 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, 0x788f, -+ 0x012e, 0xa883, 0x0016, 0x0804, 0x7888, 0xa883, 0x0007, 0x0804, -+ 0x7888, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, -+ 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x73fc, 0x0040, 0x7007, -+ 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x77b8, 0x0005, -+ 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, -+ 0x61cc, 0x81ff, 0x1904, 0x783a, 0x6130, 0xd194, 0x1904, 0x7864, -+ 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x0a04, 0x782e, 0x6064, 0x9e02, -+ 0x1a04, 0x782e, 0x7120, 0x9186, 0x0006, 0x1904, 0x7820, 0x7010, -+ 0x905d, 0x0904, 0x783a, 0xb800, 0xd0e4, 0x1904, 0x785e, 0x2061, -+ 0x1a41, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, -+ 0xd0dc, 0x1904, 0x7867, 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, -+ 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x786a, -+ 0x080c, 0x5386, 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, -+ 0x080c, 0x814f, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, -+ 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x786a, -+ 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, -+ 0x00be, 0x0804, 0x7888, 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, -+ 0xa974, 0x080c, 0x623e, 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, -+ 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, -+ 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, -+ 0x0035, 0x0430, 0x080c, 0x538a, 0xd0fc, 0x01e8, 0xa878, 0x2070, -+ 0x9e82, 0x1cd0, 0x02c0, 0x6064, 0x9e02, 0x12a8, 0x7120, 0x9186, -+ 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, -+ 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, 0x77c4, 0x7003, -+ 0x0002, 0x0804, 0x77c4, 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, -+ 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, -+ 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, -+ 0xd0e5, 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, 0x688c, 0x012e, 0x0005, 0x080c, -+ 0x101d, 0x0005, 0x00d6, 0x080c, 0x8146, 0x00de, 0x0005, 0x00d6, -+ 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, -+ 0x01d8, 0x908c, 0x0780, 0x190c, 0x7923, 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, 0x7923, 0x000e, 0x0005, 0x00d6, -+ 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, -+ 0x9282, 0x0004, 0x1a04, 0x7914, 0xa97c, 0x9188, 0x1000, 0x2104, -+ 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, -+ 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, 0x9ddc, 0x1118, -+ 0x080c, 0x9e7f, 0x05a8, 0x6212, 0xa874, 0x0002, 0x78f2, 0x78f7, -+ 0x78fa, 0x7900, 0x2019, 0x0002, 0x080c, 0xd4a6, 0x0060, 0x080c, -+ 0xd442, 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, 0xd45d, 0x0018, -+ 0xa980, 0x080c, 0xd442, 0x080c, 0x9e32, 0xa887, 0x0000, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x688c, 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, 0x7925, 0x0006, -+ 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, 0x0dbd, 0x2001, 0x1833, -+ 0x2004, 0x9005, 0x0005, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, -+ 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, -+ 0xd1ec, 0x1120, 0x080c, 0x14a7, 0x00fe, 0x0005, 0x2001, 0x020d, -+ 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, -+ 0x0904, 0x79a5, 0x68bc, 0x90aa, 0x0005, 0x0a04, 0x7f54, 0x7d44, -+ 0x7c40, 0x9584, 0x00f6, 0x1510, 0x9484, 0x7000, 0x0140, 0x908a, -+ 0x2000, 0x1260, 0x9584, 0x0700, 0x8007, 0x0804, 0x79ac, 0x7000, -+ 0x9084, 0xff00, 0x9086, 0x8100, 0x0da8, 0x00b0, 0x9484, 0x0fff, -+ 0x1130, 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, -+ 0xd88c, 0x080c, 0x7e99, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, -+ 0x1118, 0x080c, 0x7ef7, 0x19c0, 0xd5a4, 0x0148, 0x0046, 0x0056, -+ 0x080c, 0x7a07, 0x080c, 0x21cd, 0x005e, 0x004e, 0x0020, 0x080c, -+ 0xd88c, 0x7817, 0x0140, 0x080c, 0x6fb2, 0x0168, 0x2001, 0x0111, -+ 0x2004, 0xd08c, 0x0140, 0x688f, 0x0000, 0x2001, 0x0110, 0x2003, -+ 0x0008, 0x2003, 0x0000, 0x080c, 0x79e8, 0x2001, 0x19c1, 0x2004, -+ 0x9005, 0x090c, 0x8973, 0x0005, 0x0002, 0x79be, 0x7cbb, 0x79b5, -+ 0x79b5, 0x79b5, 0x79b5, 0x79b5, 0x79b5, 0x7817, 0x0140, 0x2001, -+ 0x19c1, 0x2004, 0x9005, 0x090c, 0x8973, 0x0005, 0x7000, 0x908c, -+ 0xff00, 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x688e, 0x9286, -+ 0x2000, 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x53e7, -+ 0x0070, 0x080c, 0x7a27, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, -+ 0x7bf6, 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x7dc9, 0x7817, -+ 0x0140, 0x2001, 0x19c1, 0x2004, 0x9005, 0x090c, 0x8973, 0x0005, -+ 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, -+ 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, -+ 0x080c, 0x48d9, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, -+ 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, -+ 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, -+ 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, -+ 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, -+ 0x48d9, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, -+ 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, -+ 0x9096, 0x0023, 0x1904, 0x7bc7, 0x9186, 0x0023, 0x15c0, 0x080c, -+ 0x7e5e, 0x0904, 0x7bc7, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, -+ 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, -+ 0x7bc7, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, -+ 0x0015, 0x080c, 0x9eac, 0x0804, 0x7bc7, 0x908e, 0x0214, 0x0118, -+ 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0x9eac, 0x0804, -+ 0x7bc7, 0x908e, 0x0100, 0x1904, 0x7bc7, 0x7034, 0x9005, 0x1904, -+ 0x7bc7, 0x2009, 0x0016, 0x080c, 0x9eac, 0x0804, 0x7bc7, 0x9186, -+ 0x0022, 0x1904, 0x7bc7, 0x7030, 0x908e, 0x0300, 0x1580, 0x68d8, -+ 0xd0a4, 0x0528, 0xc0b5, 0x68da, 0x7100, 0x918c, 0x00ff, 0x697a, -+ 0x7004, 0x687e, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, -+ 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x26ac, 0x7932, 0x7936, -+ 0x001e, 0x000e, 0x00fe, 0x080c, 0x2663, 0x695a, 0x703c, 0x00e6, -+ 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b2, 0x00ee, 0x7034, -+ 0x9005, 0x1904, 0x7bc7, 0x2009, 0x0017, 0x0804, 0x7b77, 0x908e, -+ 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x7bc7, 0x080c, 0x6fb2, -+ 0x0120, 0x2009, 0x001d, 0x0804, 0x7b77, 0x68d8, 0xc0a5, 0x68da, -+ 0x2009, 0x0030, 0x0804, 0x7b77, 0x908e, 0x0500, 0x1140, 0x7034, -+ 0x9005, 0x1904, 0x7bc7, 0x2009, 0x0018, 0x0804, 0x7b77, 0x908e, -+ 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x7b77, 0x908e, 0x2110, -+ 0x1120, 0x2009, 0x001a, 0x0804, 0x7b77, 0x908e, 0x5200, 0x1140, -+ 0x7034, 0x9005, 0x1904, 0x7bc7, 0x2009, 0x001b, 0x0804, 0x7b77, -+ 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x7bc7, 0x2009, -+ 0x001c, 0x0804, 0x7b77, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, -+ 0x0804, 0x7b77, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, -+ 0x7bc7, 0x2009, 0x0024, 0x0804, 0x7b77, 0x908c, 0xff00, 0x918e, -+ 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, -+ 0x0904, 0x7b77, 0x080c, 0xc8b8, 0x1904, 0x7bc7, 0x0804, 0x7b75, -+ 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, -+ 0x7b77, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x7b77, -+ 0x908e, 0x6104, 0x1528, 0x2029, 0x0205, 0x2011, 0x026d, 0x8208, -+ 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, -+ 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x48d9, 0x004e, 0x8108, -+ 0x0f04, 0x7b43, 0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, -+ 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, 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, 0x6838, 0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016, -+ 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2663, 0x1904, -+ 0x7bca, 0x080c, 0x61de, 0x1904, 0x7bca, 0xbe12, 0xbd16, 0x001e, -+ 0x0016, 0x080c, 0x6fb2, 0x01c0, 0x68d8, 0xd08c, 0x1148, 0x7000, -+ 0x9084, 0x00ff, 0x1188, 0x7004, 0x9084, 0xff00, 0x1168, 0x0040, -+ 0x6878, 0x9606, 0x1148, 0x687c, 0x9506, 0x9084, 0xff00, 0x1120, -+ 0x9584, 0x00ff, 0xb8b2, 0x0080, 0xb8b0, 0x9005, 0x1168, 0x9186, -+ 0x0046, 0x1150, 0x6878, 0x9606, 0x1138, 0x687c, 0x9506, 0x9084, -+ 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0x9ddc, 0x01a8, 0x2b08, -+ 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, -+ 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0x9eac, 0x00ce, -+ 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, -+ 0x0120, 0x2011, 0x8049, 0x080c, 0x48d9, 0x080c, 0x9e7f, 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, 0x8439, 0x08a0, 0x080c, 0x30fd, -+ 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, -+ 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, -+ 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x7e5e, 0x0904, 0x7c53, -+ 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, -+ 0x15d0, 0x2009, 0x0015, 0x080c, 0x9eac, 0x04a8, 0x908e, 0x0100, -+ 0x1590, 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0x9eac, -+ 0x0450, 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, -+ 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x2663, 0x11b8, 0x080c, 0x61de, 0x11a0, 0xbe12, 0xbd16, -+ 0x080c, 0x9ddc, 0x0178, 0x2b08, 0x6112, 0x080c, 0xbf8c, 0x6023, -+ 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0x9eac, 0x080c, 0x8973, -+ 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, 0x7cb5, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, -+ 0x7cb5, 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, 0x7c8a, 0x82ff, 0x1118, -+ 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, -+ 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, -+ 0x000f, 0x0002, 0x7cd2, 0x7cd2, 0x7cd2, 0x7e70, 0x7cd2, 0x7cdb, -+ 0x7d06, 0x7d94, 0x7cd2, 0x7cd2, 0x7cd2, 0x7cd2, 0x7cd2, 0x7cd2, -+ 0x7cd2, 0x7cd2, 0x7817, 0x0140, 0x2001, 0x19c1, 0x2004, 0x9005, -+ 0x090c, 0x8973, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, -+ 0x2160, 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6864, -+ 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, -+ 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, -+ 0x2009, 0x0046, 0x080c, 0x9eac, 0x7817, 0x0140, 0x2001, 0x19c1, -+ 0x2004, 0x9005, 0x090c, 0x8973, 0x00be, 0x0005, 0x00b6, 0x00c6, -+ 0x9484, 0x0fff, 0x0904, 0x7d6a, 0x7110, 0xd1bc, 0x1904, 0x7d6a, -+ 0x7108, 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, -+ 0x15b0, 0x81ff, 0x15a0, 0x9080, 0x3138, 0x200d, 0x918c, 0xff00, -+ 0x810f, 0x2001, 0x0080, 0x9106, 0x0904, 0x7d6a, 0x080c, 0x61de, -+ 0x1904, 0x7d6a, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, 0xba04, -+ 0x9294, 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0x9ddc, 0x05e8, -+ 0x2b08, 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006, -+ 0x7120, 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xcb14, -+ 0x0408, 0x080c, 0x6562, 0x1138, 0xb807, 0x0606, 0x0c30, 0x190c, -+ 0x7c57, 0x11c0, 0x0898, 0x080c, 0x9ddc, 0x2b08, 0x0198, 0x6112, -+ 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, -+ 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8439, -+ 0x080c, 0x8973, 0x7817, 0x0140, 0x2001, 0x19c1, 0x2004, 0x9005, -+ 0x090c, 0x8973, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, -+ 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d9, 0x080c, 0x9e7f, -+ 0x0d48, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, -+ 0x6156, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x08b0, 0x00b6, 0x7110, 0xd1bc, 0x01e8, -+ 0x7020, 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8, -+ 0x6864, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, -+ 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, -+ 0x610a, 0x2009, 0x0045, 0x080c, 0x9eac, 0x7817, 0x0140, 0x2001, -+ 0x19c1, 0x2004, 0x9005, 0x090c, 0x8973, 0x00be, 0x0005, 0x6120, -+ 0x9186, 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, -+ 0x0005, 0x080c, 0x30fd, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, -+ 0x9086, 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, -+ 0x000b, 0x0005, 0x7de0, 0x7de1, 0x7de0, 0x7de0, 0x7e40, 0x7e4f, -+ 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, -+ 0x7e3e, 0x700c, 0x7108, 0x080c, 0x2663, 0x1904, 0x7e3e, 0x080c, -+ 0x61de, 0x1904, 0x7e3e, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, -+ 0x080c, 0x6562, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, -+ 0x7e5e, 0x00ce, 0x05d8, 0x080c, 0x9ddc, 0x2b08, 0x05b8, 0x6112, -+ 0x080c, 0xbf8c, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, -+ 0x080c, 0x9eac, 0x0458, 0x080c, 0x6562, 0x0148, 0x9086, 0x0004, -+ 0x0130, 0x080c, 0x656a, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, -+ 0x9ddc, 0x2b08, 0x01d8, 0x6112, 0x080c, 0xbf8c, 0x6023, 0x0005, -+ 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0x9eac, 0x0078, 0x080c, -+ 0x9ddc, 0x2b08, 0x0158, 0x6112, 0x080c, 0xbf8c, 0x6023, 0x0004, -+ 0x7120, 0x610a, 0x2009, 0x0001, 0x080c, 0x9eac, 0x00be, 0x0005, -+ 0x7110, 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x7dbf, 0x1130, -+ 0x7124, 0x610a, 0x2009, 0x0089, 0x080c, 0x9eac, 0x0005, 0x7110, -+ 0xd1bc, 0x0158, 0x0059, 0x0148, 0x080c, 0x7dbf, 0x1130, 0x7124, -+ 0x610a, 0x2009, 0x008a, 0x080c, 0x9eac, 0x0005, 0x7020, 0x2060, -+ 0x9c84, 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, 0x1819, -+ 0x2004, 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, -+ 0x00b6, 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0007, -+ 0x11b0, 0x9c82, 0x1cd0, 0x0298, 0x6864, 0x9c02, 0x1280, 0x7008, -+ 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, -+ 0xb914, 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x9eac, 0x7817, -+ 0x0140, 0x2001, 0x19c1, 0x2004, 0x9005, 0x090c, 0x8973, 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, 0x9ddc, 0x05b8, 0x0066, 0x00c6, 0x0046, -+ 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2663, 0x15a0, -+ 0x080c, 0x61de, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, -+ 0x6012, 0x080c, 0xbf8c, 0x080c, 0x0feb, 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, 0x8439, 0x080c, 0x8973, 0x00fe, 0x009e, 0x00ce, 0x0005, -+ 0x080c, 0x9e32, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, -+ 0x7000, 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, -+ 0x1904, 0x7f4e, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, -+ 0x9005, 0x1904, 0x7f50, 0x7030, 0x908e, 0x0400, 0x0904, 0x7f50, -+ 0x908e, 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, -+ 0x11d8, 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, -+ 0x080c, 0x6520, 0x0558, 0x68ac, 0x9084, 0x00ff, 0x7100, 0x918c, -+ 0x00ff, 0x9106, 0x1518, 0x687c, 0x69ac, 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, 0x7e5e, -+ 0x0128, 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, -+ 0x9085, 0x0001, 0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, -+ 0xc0e5, 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, -+ 0x7834, 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, -+ 0x7802, 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, -+ 0x7036, 0x00ee, 0x0005, 0x2071, 0x19cb, 0x7003, 0x0003, 0x700f, -+ 0x0361, 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1cd0, 0x7007, -+ 0x0000, 0x7026, 0x702b, 0x93c2, 0x7032, 0x7037, 0x9430, 0x703f, -+ 0xffff, 0x7042, 0x7047, 0x5225, 0x704a, 0x705b, 0x80d3, 0x080c, -+ 0x1004, 0x090c, 0x0db4, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, -+ 0x0100, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19cb, 0x1d04, 0x8027, -+ 0x2091, 0x6000, 0x700c, 0x8001, 0x700e, 0x1510, 0x2001, 0x1875, -+ 0x2004, 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, -+ 0x20d1, 0x0001, 0x20d1, 0x0000, 0x080c, 0x0db4, 0x700f, 0x0361, -+ 0x7007, 0x0001, 0x0126, 0x2091, 0x8000, 0x080c, 0x8118, 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, 0x953d, 0x0010, -+ 0x7034, 0x080f, 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, 0x804f, 0x8050, 0x806c, 0x00e6, 0x2071, 0x19cb, 0x7018, -+ 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, -+ 0x00e6, 0x0006, 0x2071, 0x19cb, 0x701c, 0x9206, 0x1120, 0x701a, -+ 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, -+ 0x19cb, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, -+ 0x00b6, 0x7110, 0x080c, 0x623e, 0x1168, 0xb888, 0x8001, 0x0250, -+ 0xb88a, 0x1140, 0x0126, 0x2091, 0x8000, 0x0016, 0x080c, 0x8973, -+ 0x001e, 0x012e, 0x8108, 0x9182, 0x0800, 0x0218, 0x900e, 0x7007, -+ 0x0002, 0x7112, 0x00be, 0x0005, 0x7014, 0x2060, 0x0126, 0x2091, -+ 0x8000, 0x6040, 0x9005, 0x0128, 0x8001, 0x6042, 0x1110, 0x080c, -+ 0xbe1d, 0x6018, 0x9005, 0x0528, 0x8001, 0x601a, 0x1510, 0x6120, -+ 0x9186, 0x0003, 0x0118, 0x9186, 0x0006, 0x11c8, 0x080c, 0xbb17, -+ 0x01b0, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082, -+ 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, -+ 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, 0x0110, 0x080c, -+ 0xb815, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x1819, 0x2004, -+ 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x0005, 0x00e6, -+ 0x2071, 0x19cb, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, -+ 0x2001, 0x19d4, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19cb, -+ 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x19d7, 0x2013, -+ 0x0000, 0x0005, 0x00e6, 0x2071, 0x19cb, 0x711a, 0x721e, 0x700b, -+ 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056, -+ 0x2001, 0x19d9, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068, -+ 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c, -+ 0x10d5, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6, -+ 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x7f9c, -+ 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, -+ 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19cb, 0x7172, 0x7276, -+ 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19cb, -+ 0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, -+ 0x2069, 0x1800, 0x69e4, 0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140, -+ 0x6a50, 0x6870, 0x9202, 0x0288, 0x8117, 0x9294, 0x00c0, 0x0088, -+ 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, 0x69e6, -+ 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, 0x9094, -+ 0x00c0, 0x9184, 0xff3f, 0x9205, 0x68e6, 0x080c, 0x0ecb, 0x002e, -+ 0x0005, 0x00c6, 0x2061, 0x1a41, 0x00ce, 0x0005, 0x9184, 0x000f, -+ 0x8003, 0x8003, 0x8003, 0x9080, 0x1a41, 0x2060, 0x0005, 0xa884, -+ 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a41, -+ 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, -+ 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, -+ 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x81d9, 0xd0b4, 0x1168, -+ 0xd0bc, 0x1904, 0x81b2, 0x2009, 0x0006, 0x080c, 0x8206, 0x0005, -+ 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x0160, 0x908c, -+ 0x0003, 0x0120, 0x918e, 0x0003, 0x1904, 0x8200, 0x908c, 0x2020, -+ 0x918e, 0x2020, 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1875, -+ 0x2104, 0xd084, 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, -+ 0x9eac, 0x0005, 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, 0x9eac, -+ 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, 0x8200, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, -+ 0x0076, 0x00f6, 0x2c78, 0x080c, 0x1648, 0x00fe, 0x007e, 0x87ff, -+ 0x1120, 0x2009, 0x0042, 0x080c, 0x9eac, 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, 0x9eac, 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, -+ 0x2009, 0x0043, 0x080c, 0x9eac, 0x0cb0, 0x6110, 0x00b6, 0x2158, -+ 0xb900, 0x00be, 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, -+ 0x2009, 0x0004, 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, -+ 0xbb17, 0x0518, 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, -+ 0x0001, 0x1188, 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, -+ 0x00c6, 0x2061, 0x1a41, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, -+ 0x0208, 0x6206, 0x00ce, 0x080c, 0x66c6, 0x6014, 0x904d, 0x0076, -+ 0x2039, 0x0000, 0x190c, 0x814f, 0x007e, 0x009e, 0x0005, 0x0156, -+ 0x00c6, 0x2061, 0x1a41, 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, 0x8251, 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, 0x827b, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, -+ 0x827b, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, -+ 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, -+ 0x0126, 0x2091, 0x2800, 0x2079, 0x19b8, 0x012e, 0x00d6, 0x2069, -+ 0x19b8, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, -+ 0x2069, 0x0200, 0x080c, 0x9c3f, 0x0401, 0x080c, 0x9c2a, 0x00e9, -+ 0x080c, 0x9c2d, 0x00d1, 0x080c, 0x9c30, 0x00b9, 0x080c, 0x9c33, -+ 0x00a1, 0x080c, 0x9c36, 0x0089, 0x080c, 0x9c39, 0x0071, 0x080c, -+ 0x9c3c, 0x0059, 0x01de, 0x014e, 0x015e, 0x2069, 0x0004, 0x2d04, -+ 0x9085, 0x8001, 0x206a, 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1, -+ 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, 0x00c6, 0x6027, 0x0001, -+ 0x7804, 0x9084, 0x0007, 0x0002, 0x82ee, 0x8312, 0x8351, 0x82f4, -+ 0x8312, 0x82ee, 0x82ec, 0x82ec, 0x080c, 0x0db4, 0x080c, 0x80b8, -+ 0x080c, 0x8973, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, -+ 0x0005, 0x2011, 0x5b3a, 0x080c, 0x8038, 0x7828, 0x9092, 0x00c8, -+ 0x1228, 0x8000, 0x782a, 0x080c, 0x5b7a, 0x0c88, 0x62c0, 0x080c, -+ 0x9c43, 0x080c, 0x5b3a, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, -+ 0x0000, 0x0c28, 0x080c, 0x80b8, 0x6220, 0xd2a4, 0x0160, 0x782b, -+ 0x0000, 0x7824, 0x9065, 0x090c, 0x0db4, 0x2009, 0x0013, 0x080c, -+ 0x9eac, 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0db4, -+ 0x7828, 0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, -+ 0x29ca, 0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c, -+ 0x0db4, 0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x8973, -+ 0x0c00, 0x080c, 0x9388, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, -+ 0x9c43, 0x080c, 0xd8c9, 0x2009, 0x0014, 0x080c, 0x9eac, 0x00ce, -+ 0x0880, 0x2001, 0x19d4, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, -+ 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0db4, 0x2009, 0x0013, -+ 0x080c, 0x9efe, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, -+ 0x9005, 0x090c, 0x0db4, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000, -+ 0x782a, 0x00de, 0x00ce, 0x00be, 0x080c, 0x29ca, 0x02f0, 0x00b6, -+ 0x00c6, 0x00d6, 0x781c, 0x905d, 0x090c, 0x0db4, 0xb800, 0xc0dc, -+ 0xb802, 0x7924, 0x2160, 0x080c, 0x9e32, 0xb93c, 0x81ff, 0x090c, -+ 0x0db4, 0x8109, 0xb93e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, -+ 0x00ce, 0x00be, 0x080c, 0x8973, 0x0868, 0x080c, 0x9388, 0x0850, -+ 0x2011, 0x0130, 0x2214, 0x080c, 0x9c43, 0x080c, 0xd8c9, 0x7824, -+ 0x9065, 0x2009, 0x0014, 0x080c, 0x9eac, 0x00de, 0x00ce, 0x00be, -+ 0x0804, 0x8362, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, -+ 0x1d4a, 0x6024, 0x6027, 0x0002, 0xd0f4, 0x1580, 0x62c8, 0x60c4, -+ 0x9205, 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, -+ 0x9eac, 0x00ce, 0x0005, 0x2011, 0x19d7, 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, 0x9eac, 0x08a0, 0x7848, 0xc085, 0x784a, -+ 0x0880, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, -+ 0x0000, 0x2c08, 0x2061, 0x19b8, 0x6020, 0x8000, 0x6022, 0x6010, -+ 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, -+ 0x001e, 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, -+ 0x19b8, 0xb800, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086, -+ 0x0001, 0x1110, 0x2b00, 0x681e, 0x00de, 0x0804, 0x8973, 0x00de, -+ 0x0005, 0xc0d5, 0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b, -+ 0x0000, 0x0086, 0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, -+ 0x2069, 0x19b8, 0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e, -+ 0x08d8, 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, -+ 0x0000, 0x2c08, 0x2061, 0x19b8, 0x6020, 0x8000, 0x6022, 0x6008, -+ 0x9005, 0x0148, 0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, -+ 0x001e, 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, -+ 0x0000, 0x2c08, 0x2061, 0x19b8, 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, 0x19b8, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, -+ 0x0904, 0x84e0, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x84db, -+ 0x87ff, 0x0120, 0x6054, 0x9106, 0x1904, 0x84db, 0x703c, 0x9c06, -+ 0x1178, 0x0036, 0x2019, 0x0001, 0x080c, 0x96d8, 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, 0xbb17, 0x01c8, 0x6014, 0x2048, 0x6020, -+ 0x9086, 0x0003, 0x1590, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, -+ 0x0016, 0x0036, 0x0076, 0x080c, 0xbe06, 0x080c, 0xd7d3, 0x080c, -+ 0x688c, 0x007e, 0x003e, 0x001e, 0x080c, 0xbd00, 0x080c, 0x9e62, -+ 0x00ce, 0x0804, 0x847f, 0x2c78, 0x600c, 0x2060, 0x0804, 0x847f, -+ 0x85ff, 0x0120, 0x0036, 0x080c, 0x8a4e, 0x003e, 0x012e, 0x000e, -+ 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x009e, 0x00be, -+ 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, -+ 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xd7d3, 0x080c, 0xd4d5, -+ 0x007e, 0x003e, 0x001e, 0x0890, 0x6020, 0x9086, 0x000a, 0x0904, -+ 0x84c5, 0x0804, 0x84c3, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, -+ 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19b8, 0x7838, -+ 0x9065, 0x0904, 0x855b, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, -+ 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0x96d8, 0x7833, -+ 0x0000, 0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c, -+ 0xbb17, 0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1568, -+ 0x3e08, 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6040, 0x9005, 0x1180, -+ 0x2001, 0x1959, 0x2004, 0x6042, 0x0058, 0xa867, 0x0103, 0xab7a, -+ 0xa877, 0x0000, 0x080c, 0x687f, 0x080c, 0xbd00, 0x080c, 0x9e62, -+ 0x000e, 0x0804, 0x8518, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, -+ 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, -+ 0x1118, 0x080c, 0xd4d5, 0x0c50, 0x6020, 0x9086, 0x000a, 0x09f8, -+ 0x08e0, 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, 0x080c, 0x865a, -+ 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, 0x2079, 0x19b8, -+ 0x2091, 0x8000, 0x080c, 0x86f1, 0x080c, 0x877f, 0x012e, 0x00fe, -+ 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, -+ 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7614, -+ 0x2660, 0x2678, 0x8cff, 0x0904, 0x861f, 0x6010, 0x2058, 0xb8a0, -+ 0x9206, 0x1904, 0x861a, 0x88ff, 0x0120, 0x6054, 0x9106, 0x1904, -+ 0x861a, 0x7024, 0x9c06, 0x1558, 0x2069, 0x0100, 0x6820, 0xd0a4, -+ 0x1508, 0x080c, 0x80b8, 0x080c, 0x93ac, 0x68c3, 0x0000, 0x080c, -+ 0x98da, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, -+ 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, -+ 0x2b14, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, -+ 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x0804, 0x861a, 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, 0xbb17, 0x01e8, 0x6020, 0x9086, -+ 0x0003, 0x1580, 0x080c, 0xbd1d, 0x1118, 0x080c, 0xa7c0, 0x0098, -+ 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, -+ 0x080c, 0xbe06, 0x080c, 0xd7d3, 0x080c, 0x688c, 0x008e, 0x003e, -+ 0x001e, 0x080c, 0xbd00, 0x080c, 0x9e62, 0x080c, 0x97b0, 0x00ce, -+ 0x0804, 0x859a, 0x2c78, 0x600c, 0x2060, 0x0804, 0x859a, 0x012e, -+ 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, -+ 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, -+ 0x0086, 0x080c, 0xd7d3, 0x080c, 0xd4d5, 0x008e, 0x003e, 0x001e, -+ 0x08d0, 0x080c, 0xa7c0, 0x6020, 0x9086, 0x0002, 0x1160, 0x6004, -+ 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x8600, 0x9086, 0x008b, -+ 0x0904, 0x8600, 0x0840, 0x6020, 0x9086, 0x0005, 0x1920, 0x6004, -+ 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, 0x008b, 0x09b0, -+ 0x0804, 0x8613, 0x00b6, 0x00a6, 0x0096, 0x00c6, 0x0006, 0x0126, -+ 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x0904, 0x86ea, -+ 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19b8, 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, 0x6171, 0x0904, -+ 0x86e6, 0x7624, 0x86ff, 0x0904, 0x86d5, 0x9680, 0x0005, 0x2004, -+ 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0560, -+ 0x080c, 0x80b8, 0x080c, 0x93ac, 0x68c3, 0x0000, 0x080c, 0x98da, -+ 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, -+ 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, -+ 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, -+ 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, -+ 0x080c, 0x9e62, 0x00ce, 0x0048, 0x00de, 0x00c6, 0x2660, 0x6003, -+ 0x0009, 0x630a, 0x00ce, 0x0804, 0x868d, 0x89ff, 0x0158, 0xa867, -+ 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xbe06, 0x080c, 0xd7d3, -+ 0x080c, 0x688c, 0x080c, 0x97b0, 0x0804, 0x868d, 0x006e, 0x00de, -+ 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, 0x00ae, 0x00be, -+ 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7814, -+ 0x9065, 0x0904, 0x8752, 0x600c, 0x0006, 0x600f, 0x0000, 0x7824, -+ 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, -+ 0x80b8, 0x080c, 0x93ac, 0x68c3, 0x0000, 0x080c, 0x98da, 0x7827, -+ 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, -+ 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, 0x2069, -+ 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, -+ 0x080c, 0x6518, 0x1520, 0x6003, 0x0009, 0x630a, 0x2c30, 0x00f8, -+ 0x6014, 0x2048, 0x080c, 0xbb15, 0x01b0, 0x6020, 0x9086, 0x0003, -+ 0x1508, 0x080c, 0xbd1d, 0x1118, 0x080c, 0xa7c0, 0x0060, 0x080c, -+ 0x6518, 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, -+ 0x688c, 0x080c, 0xbd00, 0x080c, 0x9e62, 0x080c, 0x97b0, 0x000e, -+ 0x0804, 0x86f8, 0x7e16, 0x7e12, 0x00de, 0x00ce, 0x006e, 0x000e, -+ 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, 0x080c, 0xd4d5, -+ 0x0c50, 0x080c, 0xa7c0, 0x6020, 0x9086, 0x0002, 0x1150, 0x6004, -+ 0x0006, 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, 0x008b, 0x0978, -+ 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, 0x0006, 0x9086, -+ 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, 0x0860, 0x0006, -+ 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6, 0x7818, 0x905d, 0x0904, -+ 0x87ff, 0xb854, 0x0006, 0x9006, 0xb856, 0xb85a, 0xb800, 0xc0d4, -+ 0xc0dc, 0xb802, 0x080c, 0x6171, 0x0904, 0x87fc, 0x7e24, 0x86ff, -+ 0x0904, 0x87ef, 0x9680, 0x0005, 0x2004, 0x9906, 0x1904, 0x87ef, -+ 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x87e6, 0x080c, -+ 0x80b8, 0x080c, 0x93ac, 0x68c3, 0x0000, 0x080c, 0x98da, 0x7827, -+ 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, -+ 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, 0x2069, -+ 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x00de, -+ 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, 0xd0bc, 0x0150, -+ 0x9680, 0x0010, 0x200c, 0x81ff, 0x1518, 0x2009, 0x1959, 0x210c, -+ 0x2102, 0x00f0, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, -+ 0x600f, 0x0000, 0x080c, 0x9e62, 0x00ce, 0x0048, 0x00de, 0x00c6, -+ 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x8792, 0x89ff, -+ 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x688c, -+ 0x080c, 0x97b0, 0x0804, 0x8792, 0x000e, 0x0804, 0x8786, 0x781e, -+ 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, 0x000e, 0x0005, -+ 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, 0x01a0, 0xb84c, -+ 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, 0x19b8, 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, 0x93ac, 0x78c3, -+ 0x0000, 0x080c, 0x98da, 0x7027, 0x0000, 0x0036, 0x2079, 0x0140, -+ 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, -+ 0x9006, 0x080c, 0x2b14, 0x2079, 0x0100, 0x7824, 0xd084, 0x0110, -+ 0x7827, 0x0001, 0x080c, 0x98da, 0x003e, 0x080c, 0x6171, 0x00c6, -+ 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, 0x080c, 0x9e32, -+ 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xbe06, -+ 0x080c, 0x688c, 0x080c, 0x97b0, 0x00fe, 0x0005, 0x00b6, 0x00e6, -+ 0x00c6, 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, 0x2001, 0x180c, -+ 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19b8, 0x7004, 0x9084, 0x0007, -+ 0x0002, 0x888b, 0x888f, 0x88a6, 0x88cf, 0x890d, 0x888b, 0x88a6, -+ 0x8889, 0x080c, 0x0db4, 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, 0x6171, 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, 0x8973, 0x0ca8, 0x7218, 0x721e, 0x080c, -+ 0x8973, 0x0c80, 0xc2ec, 0x2202, 0x080c, 0x8a4e, 0x0c58, 0x7024, -+ 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, 0x080c, 0x97b0, 0x600c, -+ 0x9015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, 0x720e, 0x720a, -+ 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, 0x97b0, 0x600c, 0x9015, -+ 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, 0x7212, 0x00b8, -+ 0x6020, 0x9086, 0x0003, 0x1198, 0x6010, 0x2058, 0x080c, 0x6171, -+ 0xb800, 0xc0dc, 0xb802, 0x080c, 0x97b0, 0x701c, 0x9065, 0x0138, -+ 0xb854, 0x9015, 0x0110, 0x721e, 0x0010, 0x7218, 0x721e, 0x7027, -+ 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, 0x9065, 0x0140, -+ 0x080c, 0x97b0, 0x600c, 0x9015, 0x0158, 0x720e, 0x600f, 0x0000, -+ 0x080c, 0x98da, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, -+ 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, 0x19b8, 0x6830, 0x9084, -+ 0x0003, 0x0002, 0x8930, 0x8932, 0x8956, 0x892e, 0x080c, 0x0db4, -+ 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001, 0x01b8, 0x683c, -+ 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a, 0x600f, 0x0000, -+ 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x19d7, 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, 0x2001, 0x180c, 0x200c, -+ 0xc1e5, 0x2102, 0x0005, 0x2001, 0x180c, 0x200c, 0xd1ec, 0x0120, -+ 0xc1ec, 0x2102, 0x080c, 0x8a4e, 0x2001, 0x19c4, 0x2004, 0x9086, -+ 0x0001, 0x0d58, 0x00d6, 0x2069, 0x19b8, 0x6804, 0x9084, 0x0007, -+ 0x0002, 0x8993, 0x8a36, 0x8a36, 0x8a36, 0x8a36, 0x8a38, 0x8a36, -+ 0x8991, 0x080c, 0x0db4, 0x6820, 0x9005, 0x1110, 0x00de, 0x0005, -+ 0x00c6, 0x680c, 0x9065, 0x0150, 0x6807, 0x0004, 0x6826, 0x682b, -+ 0x0000, 0x080c, 0x8aa4, 0x00ce, 0x00de, 0x0005, 0x6814, 0x9065, -+ 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, 0x8aa4, -+ 0x00ce, 0x00de, 0x0005, 0x00b6, 0x00e6, 0x6a1c, 0x92dd, 0x0000, -+ 0x0904, 0x8a22, 0xb84c, 0x900d, 0x0118, 0xb888, 0x9005, 0x01a0, -+ 0xb854, 0x905d, 0x0120, 0x920e, 0x0904, 0x8a22, 0x0028, 0x6818, -+ 0x920e, 0x0904, 0x8a22, 0x2058, 0xb84c, 0x900d, 0x0d88, 0xb888, -+ 0x9005, 0x1d70, 0x2b00, 0x681e, 0xbb3c, 0xb838, 0x9302, 0x1e40, -+ 0x080c, 0x9e09, 0x0904, 0x8a22, 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, 0x8fdc, 0x2069, 0x19b8, 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, -+ 0x9c63, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, 0x0005, -+ 0x00c6, 0x680c, 0x9065, 0x0138, 0x6807, 0x0004, 0x6826, 0x682b, -+ 0x0000, 0x080c, 0x8aa4, 0x00ce, 0x00de, 0x0005, 0x2001, 0x180c, -+ 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe, 0x0005, 0x00f6, 0x00d6, -+ 0x2069, 0x19b8, 0x6830, 0x9086, 0x0000, 0x1548, 0x2001, 0x180c, -+ 0x2014, 0xd2e4, 0x0130, 0xc2e4, 0x2202, 0x080c, 0x8982, 0x2069, -+ 0x19b8, 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, 0x1ae8, 0x1178, 0x012e, 0x080c, 0x9209, 0x00de, -+ 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c, -+ 0x7062, 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, 0x8a46, 0x6020, 0x9084, 0x000f, 0x000b, -+ 0x0005, 0x8ab8, 0x8abd, 0x8f16, 0x8fa5, 0x8abd, 0x8f16, 0x8fa5, -+ 0x8ab8, 0x8abd, 0x8ab8, 0x8ab8, 0x8ab8, 0x8ab8, 0x8ab8, 0x8ab8, -+ 0x080c, 0x886e, 0x080c, 0x8973, 0x0005, 0x00b6, 0x0156, 0x0136, -+ 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, -+ 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0db4, -+ 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, -+ 0x0040, 0x1a04, 0x8b29, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8ca0, -+ 0x8cdb, 0x8d04, 0x8da7, 0x8dc8, 0x8dce, 0x8ddb, 0x8de3, 0x8def, -+ 0x8df5, 0x8e06, 0x8df5, 0x8e5d, 0x8de3, 0x8e69, 0x8e6f, 0x8def, -+ 0x8e6f, 0x8e7b, 0x8b27, 0x8b27, 0x8b27, 0x8b27, 0x8b27, 0x8b27, -+ 0x8b27, 0x8b27, 0x8b27, 0x8b27, 0x8b27, 0x958f, 0x95b2, 0x95c3, -+ 0x95e3, 0x9615, 0x8ddb, 0x8b27, 0x8ddb, 0x8df5, 0x8b27, 0x8d04, -+ 0x8da7, 0x8b27, 0x99c7, 0x8df5, 0x8b27, 0x99e3, 0x8df5, 0x8b27, -+ 0x8def, 0x8c9a, 0x8b4a, 0x8b27, 0x99ff, 0x9a6c, 0x9b43, 0x8b27, -+ 0x9b50, 0x8dd8, 0x9b7b, 0x8b27, 0x961f, 0x9ba8, 0x8b27, 0x080c, -+ 0x0db4, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, -+ 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, 0x8b48, 0x8b48, -+ 0x8b48, 0x8b71, 0x8c1d, 0x8c28, 0x8b48, 0x8b48, 0x8b48, 0x8c6f, -+ 0x8c7b, 0x8b8c, 0x8b48, 0x8ba7, 0x8bdb, 0x9d25, 0x9d6a, 0x8df5, -+ 0x080c, 0x0db4, 0x00d6, 0x0096, 0x080c, 0x8e8e, 0x7003, 0x2414, -+ 0x7007, 0x0018, 0x700b, 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e, -+ 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, 0x080c, 0x9380, -+ 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, -+ 0x080c, 0x9db1, 0x1118, 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, -+ 0x0005, 0x00d6, 0x0096, 0x080c, 0x8e8e, 0x7003, 0x0500, 0x7814, -+ 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, -+ 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, -+ 0x9380, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8e8e, -+ 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, -+ 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, -+ 0x60c3, 0x0010, 0x080c, 0x9380, 0x009e, 0x00de, 0x0005, 0x00d6, -+ 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x8e8e, 0x20e9, 0x0000, -+ 0x2001, 0x1974, 0x2003, 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, -+ 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, -+ 0x2098, 0x2001, 0x1974, 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, -+ 0x224d, 0x080c, 0xc81a, 0x9006, 0x080c, 0x224d, 0x001e, 0xa804, -+ 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, 0x9380, 0x012e, -+ 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x8ed9, 0x20e9, 0x0000, 0x2001, 0x1974, 0x2003, 0x0000, -+ 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, -+ 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, -+ 0x2098, 0x2001, 0x1974, 0x0016, 0x200c, 0x080c, 0xc81a, 0x001e, -+ 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, -+ 0x080c, 0x0f9d, 0x080c, 0x9380, 0x012e, 0x009e, 0x00de, 0x0005, -+ 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, -+ 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, 0x8e8e, 0x7003, -+ 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, 0x0804, 0x9380, -+ 0x00d6, 0x00e6, 0x080c, 0x8ed9, 0x7814, 0x9084, 0xff00, 0x2073, -+ 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073, -+ 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68, -+ 0x8e70, 0x1f04, 0x8c3e, 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, -+ 0x8d68, 0x8e70, 0x1f04, 0x8c47, 0x2069, 0x1984, 0x9086, 0xdf00, -+ 0x0110, 0x2069, 0x199e, 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, -+ 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, -+ 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x8c55, -+ 0x60c3, 0x004c, 0x080c, 0x9380, 0x00ee, 0x00de, 0x0005, 0x080c, -+ 0x8e8e, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, -+ 0x0008, 0x0804, 0x9380, 0x00d6, 0x0026, 0x0016, 0x080c, 0x8ed9, -+ 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, -+ 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, 0x2073, 0x0000, -+ 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x9380, 0x001e, 0x002e, -+ 0x00de, 0x0005, 0x2001, 0x1817, 0x2004, 0x609a, 0x0804, 0x9380, -+ 0x080c, 0x8e8e, 0x7003, 0x5200, 0x2069, 0x1853, 0x6804, 0xd084, -+ 0x0130, 0x6828, 0x0016, 0x080c, 0x2696, 0x710e, 0x001e, 0x20a9, -+ 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, -+ 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x0254, -+ 0x4003, 0x080c, 0x9db1, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, -+ 0x2001, 0x181e, 0x2004, 0x7032, 0x2001, 0x181f, 0x2004, 0x7036, -+ 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7036, 0x60c3, -+ 0x001c, 0x0804, 0x9380, 0x080c, 0x8e8e, 0x7003, 0x0500, 0x080c, -+ 0x9db1, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181e, -+ 0x2004, 0x700a, 0x2001, 0x181f, 0x2004, 0x700e, 0x0030, 0x2001, -+ 0x1817, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, 0x0004, 0x20e1, -+ 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, -+ 0x60c3, 0x0010, 0x0804, 0x9380, 0x080c, 0x8e8e, 0x9006, 0x080c, -+ 0x652c, 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, 0x8d6f, 0x00d6, 0x2069, 0x193d, 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, -+ 0x6fb2, 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, 0x9c2a, -+ 0x2069, 0x1945, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, -+ 0x538a, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a0, 0x2001, -+ 0x1836, 0x2004, 0xd0a4, 0x0168, 0x0016, 0x2009, 0x0002, 0x60e0, -+ 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x26d7, 0x61e2, -+ 0x001e, 0x20e1, 0x0001, 0x2099, 0x193d, 0x20e9, 0x0000, 0x20a1, -+ 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, -+ 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, -+ 0x025a, 0x4003, 0x080c, 0x9c2a, 0x20a1, 0x024e, 0x20a9, 0x0008, -+ 0x2099, 0x1945, 0x4003, 0x60c3, 0x0074, 0x0804, 0x9380, 0x080c, -+ 0x8e8e, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, -+ 0x2000, 0x9006, 0x00f6, 0x2079, 0x1853, 0x7904, 0x00fe, 0xd1ac, -+ 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x9085, 0x0002, -+ 0x00d6, 0x0804, 0x8e3e, 0x7026, 0x60c3, 0x0014, 0x0804, 0x9380, -+ 0x080c, 0x8e8e, 0x7003, 0x5000, 0x0804, 0x8d1e, 0x080c, 0x8e8e, -+ 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x9380, -+ 0x080c, 0x8ed0, 0x0010, 0x080c, 0x8ed9, 0x7003, 0x0200, 0x60c3, -+ 0x0004, 0x0804, 0x9380, 0x080c, 0x8ed9, 0x7003, 0x0100, 0x700b, -+ 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9380, 0x080c, -+ 0x8ed9, 0x7003, 0x0200, 0x0804, 0x8d1e, 0x080c, 0x8ed9, 0x7003, -+ 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, -+ 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9380, 0x00d6, 0x080c, -+ 0x8ed9, 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, 0x1853, 0x7904, 0x00fe, -+ 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, 0x2009, -+ 0x1875, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, 0x2009, -+ 0x1873, 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, 0x9380, 0x080c, 0x8ed9, 0x7003, -+ 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, 0x0804, -+ 0x9380, 0x080c, 0x8ed9, 0x7003, 0x0200, 0x0804, 0x8ca4, 0x080c, -+ 0x8ed9, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, -+ 0x0008, 0x0804, 0x9380, 0x080c, 0x8ed9, 0x7003, 0x0100, 0x700b, -+ 0x000b, 0x60c3, 0x0008, 0x0804, 0x9380, 0x0026, 0x00d6, 0x0036, -+ 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, 0x00d6, -+ 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, 0x9c3f, -+ 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, -+ 0x700a, 0x687c, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, 0x003e, -+ 0x00de, 0x080c, 0x936e, 0x721a, 0x9f95, 0x0000, 0x7222, 0x7027, -+ 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, 0x9c3f, -+ 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, 0x6878, -+ 0x700a, 0x687c, 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, 0x9c3f, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, -+ 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, 0x1128, -+ 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6878, 0x700a, 0x687c, -+ 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, 0x00de, -+ 0x080c, 0x936e, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, -+ 0x024c, 0x002e, 0x0005, 0x080c, 0x936e, 0x721a, 0x7a08, 0x7222, -+ 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, -+ 0x908a, 0x0085, 0x0a0c, 0x0db4, 0x908a, 0x0092, 0x1a0c, 0x0db4, -+ 0x6110, 0x2158, 0xb9b0, 0x2c78, 0x2061, 0x0100, 0x619a, 0x9082, -+ 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, -+ 0x8f47, 0x8f56, 0x8f61, 0x8f45, 0x8f45, 0x8f45, 0x8f47, 0x8f45, -+ 0x8f45, 0x8f45, 0x8f45, 0x8f45, 0x8f45, 0x080c, 0x0db4, 0x0411, -+ 0x60c3, 0x0000, 0x0026, 0x080c, 0x29ca, 0x0228, 0x2011, 0x0101, -+ 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x9380, 0x0431, 0x7808, -+ 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, 0x0804, -+ 0x9380, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, 0x0004, -+ 0x0804, 0x9380, 0x0026, 0x080c, 0x9c3f, 0xb810, 0x9085, 0x8100, -+ 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, -+ 0x700e, 0x7013, 0x0009, 0x0804, 0x8ea9, 0x0026, 0x080c, 0x9c3f, -+ 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, -+ 0x6878, 0x700a, 0x687c, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, -+ 0x8f0b, 0x0026, 0x080c, 0x9c3f, 0xb810, 0x9085, 0x8500, 0x7002, -+ 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, -+ 0x2001, 0x0099, 0x7012, 0x0804, 0x8f0b, 0x00b6, 0x00c6, 0x00d6, -+ 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, 0x7804, -+ 0x908a, 0x0040, 0x0a0c, 0x0db4, 0x908a, 0x0054, 0x1a0c, 0x0db4, -+ 0x7910, 0x2158, 0xb9b0, 0x2061, 0x0100, 0x619a, 0x9082, 0x0040, -+ 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, 0x8fdc, -+ 0x9098, 0x906b, 0x91ba, 0x8fda, 0x8fda, 0x8fda, 0x8fda, 0x8fda, -+ 0x8fda, 0x8fda, 0x978d, 0x9795, 0x979d, 0x97a5, 0x8fda, 0x9b87, -+ 0x8fda, 0x9785, 0x080c, 0x0db4, 0x0096, 0x780b, 0xffff, 0x080c, -+ 0x9047, 0x7914, 0x2148, 0xa978, 0x7956, 0xae64, 0x96b4, 0x00ff, -+ 0x9686, 0x0008, 0x1148, 0xa8b4, 0x7032, 0xa8b8, 0x7036, 0xa8bc, -+ 0x703a, 0xa8c0, 0x703e, 0x0008, 0x7132, 0xa97c, 0x9184, 0x000f, -+ 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, 0x2001, 0x0004, -+ 0x0018, 0x9084, 0x0006, 0x8004, 0x2010, 0x785c, 0x9084, 0x00ff, -+ 0x8007, 0x9205, 0x7042, 0xd1ac, 0x0158, 0x7047, 0x0002, 0x9686, -+ 0x0008, 0x1118, 0x080c, 0x1787, 0x0010, 0x080c, 0x1648, 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, 0x19d4, 0x2003, -+ 0x07d0, 0x2001, 0x19d3, 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, -+ 0x6a78, 0x720a, 0x6a7c, 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, 0x9380, 0x6813, 0x0008, -+ 0xb810, 0x9085, 0x0500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, -+ 0x6878, 0x700a, 0x687c, 0x700e, 0x7013, 0x0889, 0x080c, 0x936e, -+ 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x0005, -+ 0x00d6, 0x0096, 0x080c, 0x9198, 0x7814, 0x2048, 0x080c, 0xbb15, -+ 0x1130, 0x7814, 0x9084, 0x0700, 0x8007, 0x0033, 0x0010, 0x9006, -+ 0x001b, 0x009e, 0x00de, 0x0005, 0x90b6, 0x911f, 0x912f, 0x9155, -+ 0x9161, 0x9172, 0x917a, 0x90b4, 0x080c, 0x0db4, 0x0016, 0x0036, -+ 0xa97c, 0x918c, 0x0003, 0x0118, 0x9186, 0x0003, 0x1198, 0xaba8, -+ 0x7824, 0xd0cc, 0x1168, 0x7316, 0xa898, 0x701a, 0xa894, 0x701e, -+ 0x003e, 0x001e, 0x2001, 0x1982, 0x2004, 0x60c2, 0x0804, 0x9380, -+ 0xc3e5, 0x0c88, 0x9186, 0x0001, 0x190c, 0x0db4, 0xaba8, 0x7824, -+ 0xd0cc, 0x1904, 0x911c, 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, 0x9380, 0xc3e5, 0x0804, 0x90db, 0x2011, -+ 0x0008, 0x2001, 0x180f, 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, 0x9380, 0x2011, 0x0028, 0x7824, -+ 0xd0cc, 0x1128, 0x7216, 0x60c3, 0x0018, 0x0804, 0x9380, 0x0cd0, -+ 0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc, 0x0108, 0xc2e5, 0x7216, -+ 0x702f, 0x0008, 0x7858, 0x9084, 0x00ff, 0x7036, 0x60c3, 0x0020, -+ 0x0804, 0x9380, 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, 0x6878, 0x700a, 0x687c, 0x700e, 0x7824, -+ 0xd0cc, 0x1168, 0x7013, 0x0898, 0x080c, 0x936e, 0x721a, 0x7a08, -+ 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, 0x7013, -+ 0x0889, 0x0c90, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, -+ 0x001e, 0x0005, 0x91ca, 0x91ca, 0x91cc, 0x91ca, 0x91ca, 0x91ca, -+ 0x91e6, 0x91ca, 0x080c, 0x0db4, 0x7914, 0x918c, 0x08ff, 0x918d, -+ 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1853, 0x6804, -+ 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, -+ 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, 0x9380, 0x2009, 0x0003, -+ 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0x9c3f, 0x001e, -+ 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, -+ 0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, -+ 0x7116, 0x080c, 0x936e, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, -+ 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, -+ 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, -+ 0x2028, 0xb910, 0xba14, 0x7378, 0x747c, 0x7820, 0x90be, 0x0006, -+ 0x0904, 0x92dd, 0x90be, 0x000a, 0x1904, 0x9299, 0xb8b0, 0x609e, -+ 0x7814, 0x2048, 0xa87c, 0xd0fc, 0x0558, 0xaf90, 0x9784, 0xff00, -+ 0x9105, 0x6062, 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, -+ 0xa878, 0xc0fc, 0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0198, -+ 0x2039, 0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, -+ 0x0038, 0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, -+ 0xb8b0, 0x609e, 0x0050, 0x2039, 0x0029, 0x9705, 0x6072, 0x0cc0, -+ 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, 0x9c24, 0x2009, 0x07d0, 0x60c4, -+ 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x80bd, -+ 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, -+ 0x0005, 0x7804, 0x9086, 0x0040, 0x0904, 0x9319, 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, -+ 0x9c24, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, -+ 0x2009, 0x1b58, 0x080c, 0x80bd, 0x003e, 0x004e, 0x005e, 0x00ce, -+ 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, -+ 0x9084, 0x0003, 0x9086, 0x0002, 0x0904, 0x9335, 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, 0x9c01, 0x0804, -+ 0x92c9, 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, 0x92ac, 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, 0x9c24, -+ 0x0804, 0x92c9, 0x080c, 0x9c01, 0x0804, 0x92c9, 0x7a10, 0x00b6, -+ 0x2258, 0xba8c, 0x8210, 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, -+ 0x0005, 0x00d6, 0x2069, 0x19b8, 0x6843, 0x0001, 0x00de, 0x0005, -+ 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x80af, 0x0005, -+ 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, -+ 0x0128, 0x0089, 0x080c, 0x80af, 0x001e, 0x0005, 0xc1e5, 0x2001, -+ 0x180c, 0x2102, 0x2001, 0x19b9, 0x2003, 0x0000, 0x2001, 0x19c1, -+ 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, 0x6fb2, 0x11e8, 0x2001, 0x19d4, 0x2004, -+ 0x9005, 0x1904, 0x9412, 0x0066, 0x2031, 0x0001, 0x080c, 0x7062, -+ 0x006e, 0x1160, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, -+ 0xd084, 0x090c, 0x0db4, 0x080c, 0x80af, 0x0460, 0x00c6, 0x2061, -+ 0x19b8, 0x00d0, 0x6904, 0x9194, 0x4000, 0x0548, 0x080c, 0x93ac, -+ 0x080c, 0x2b24, 0x00c6, 0x2061, 0x19b8, 0x6128, 0x9192, 0x0008, -+ 0x1258, 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, -+ 0x80af, 0x080c, 0x93a3, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, -+ 0x080c, 0xd8c9, 0x080c, 0x80b8, 0x2009, 0x0014, 0x080c, 0x9eac, -+ 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, -+ 0x19d4, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b8, 0x6128, -+ 0x9192, 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x80af, -+ 0x080c, 0x5b90, 0x2009, 0x1852, 0x2114, 0x8210, 0x220a, 0x0c10, -+ 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x80c5, -+ 0x2071, 0x19b8, 0x713c, 0x81ff, 0x0904, 0x94a2, 0x2061, 0x0100, -+ 0x2069, 0x0140, 0x080c, 0x6fb2, 0x11b0, 0x0036, 0x2019, 0x0002, -+ 0x080c, 0x96d8, 0x003e, 0x713c, 0x2160, 0x080c, 0xd8c9, 0x2009, -+ 0x004a, 0x080c, 0x9eac, 0x0066, 0x2031, 0x0001, 0x080c, 0x7062, -+ 0x006e, 0x0804, 0x94a2, 0x080c, 0x94ae, 0x0904, 0x94a2, 0x6904, -+ 0xd1f4, 0x0904, 0x94a9, 0x080c, 0x2b24, 0x00c6, 0x703c, 0x9065, -+ 0x090c, 0x0db4, 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, 0x2a77, 0x6014, -+ 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, 0x2060, 0x2009, -+ 0x0049, 0x080c, 0x9eac, 0x0070, 0x0036, 0x2019, 0x0001, 0x080c, -+ 0x96d8, 0x003e, 0x713c, 0x2160, 0x080c, 0xd8c9, 0x2009, 0x004a, -+ 0x080c, 0x9eac, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, -+ 0x0005, 0xd1ec, 0x1904, 0x9463, 0x0804, 0x9465, 0x00d6, 0x00c6, -+ 0x0096, 0x703c, 0x9065, 0x090c, 0x0db4, 0x2001, 0x1836, 0x2004, -+ 0xd09c, 0x1904, 0x953a, 0x2001, 0x0306, 0x200c, 0x9184, 0x0030, -+ 0x0904, 0x953a, 0x9184, 0x0048, 0x9086, 0x0008, 0x1904, 0x953a, -+ 0x2001, 0x020b, 0x2004, 0xd0fc, 0x0904, 0x953a, 0xd08c, 0x0904, -+ 0x953a, 0x2009, 0x1a50, 0x2104, 0x8000, 0x0208, 0x200a, 0x2069, -+ 0x0100, 0x6914, 0x918c, 0x0184, 0x918d, 0x0010, 0x6916, 0x69c8, -+ 0x2011, 0x0020, 0x68c8, 0x9106, 0x1570, 0x8211, 0x1dd8, 0x2001, -+ 0x0306, 0x2003, 0x4800, 0x2001, 0x009a, 0x2003, 0x0004, 0x2001, -+ 0x1a36, 0x2003, 0x0000, 0x2001, 0x1a3f, 0x2003, 0x0000, 0x6a88, -+ 0x698c, 0x2200, 0x9105, 0x1120, 0x2c10, 0x080c, 0x1a5c, 0x0040, -+ 0x6014, 0x2048, 0xaa3a, 0xa936, 0x6ac4, 0x69c8, 0xa946, 0xaa4a, -+ 0x0126, 0x00c6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1ae8, 0x190c, -+ 0x0db4, 0x012e, 0x0090, 0x2009, 0x1a51, 0x2104, 0x8000, 0x0208, -+ 0x200a, 0x69c8, 0x2011, 0x0020, 0x8211, 0x1df0, 0x68c8, 0x9106, -+ 0x1dc0, 0x69c4, 0x68c8, 0x9105, 0x0160, 0x6824, 0xd08c, 0x0110, -+ 0x6827, 0x0002, 0x7048, 0xc085, 0x704a, 0x0079, 0x7048, 0xc084, -+ 0x704a, 0x2009, 0x07d0, 0x080c, 0x80bd, 0x9006, 0x009e, 0x00ce, -+ 0x00de, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x0026, 0x00e6, 0x2071, -+ 0x19b8, 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, 0x19b8, 0x7018, -+ 0x2058, 0x8bff, 0x0190, 0xb8a0, 0x9406, 0x0118, 0xb854, 0x2058, -+ 0x0cc0, 0x6014, 0x0096, 0x2048, 0xac6c, 0xad70, 0xae78, 0x009e, -+ 0x080c, 0x6370, 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, 0x004e, -+ 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, 0x080c, -+ 0x8e8e, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c, 0x7016, 0x00c6, -+ 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005, 0x0130, 0x00b6, -+ 0x2058, 0xb810, 0xb914, 0x00be, 0x0020, 0x2061, 0x1800, 0x6078, -+ 0x617c, 0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, 0x60c3, 0x002c, -+ 0x0804, 0x9380, 0x080c, 0x8e8e, 0x7003, 0x0f00, 0x7808, 0xd09c, -+ 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, 0x700e, 0x60c3, -+ 0x0008, 0x0804, 0x9380, 0x0156, 0x080c, 0x8ed9, 0x7003, 0x0200, -+ 0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, 0x2011, 0x1840, -+ 0x2019, 0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, 0x2276, 0x8e70, -+ 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0x95d4, 0x60c3, 0x001c, -+ 0x015e, 0x0804, 0x9380, 0x0016, 0x0026, 0x080c, 0x8eb5, 0x080c, -+ 0x8ec7, 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, 0x9380, -+ 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0x9c2a, -+ 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, 0x8e8e, 0x7003, -+ 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9380, 0x0016, -+ 0x0026, 0x080c, 0x8e8e, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, -+ 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, -+ 0x0023, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, -+ 0x8003, 0x60c2, 0x080c, 0x9380, 0x002e, 0x001e, 0x0005, 0x00e6, -+ 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x700c, -+ 0x2060, 0x8cff, 0x0178, 0x080c, 0xbd1d, 0x1110, 0x080c, 0xa7c0, -+ 0x600c, 0x0006, 0x080c, 0xbf84, 0x080c, 0x9e32, 0x080c, 0x97b0, -+ 0x00ce, 0x0c78, 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce, -+ 0x00ee, 0x0005, 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, -+ 0x0066, 0x0026, 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, -+ 0x200c, 0x918c, 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, -+ 0x2071, 0x19b8, 0x7024, 0x2060, 0x8cff, 0x01f8, 0x080c, 0x93ac, -+ 0x6ac0, 0x68c3, 0x0000, 0x080c, 0x80b8, 0x00c6, 0x2061, 0x0100, -+ 0x080c, 0x9c43, 0x00ce, 0x20a9, 0x01f4, 0x0461, 0x2009, 0x0013, -+ 0x080c, 0x9eac, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, -+ 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, -+ 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x80b8, -+ 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, -+ 0x68c3, 0x0000, 0x2011, 0x5b3a, 0x080c, 0x8038, 0x20a9, 0x01f4, -+ 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, -+ 0x9084, 0x4000, 0x190c, 0x2b24, 0x0090, 0xd084, 0x0118, 0x6827, -+ 0x0001, 0x0010, 0x1f04, 0x96ba, 0x7804, 0x9084, 0x1000, 0x0138, -+ 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, 0x0005, -+ 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, -+ 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, -+ 0xdbff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b8, -+ 0x703c, 0x2060, 0x8cff, 0x0904, 0x9766, 0x9386, 0x0002, 0x1128, -+ 0x6814, 0x9084, 0x0002, 0x0904, 0x9766, 0x68af, 0x95f5, 0x6817, -+ 0x0010, 0x2009, 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, -+ 0x080c, 0x80c5, 0x080c, 0x1e90, 0x0046, 0x2009, 0x00a5, 0x080c, -+ 0x0e2f, 0x2021, 0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, -+ 0x11f8, 0x68af, 0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, -+ 0x2079, 0x0090, 0x2071, 0x1a36, 0x6814, 0x9084, 0x1984, 0x9085, -+ 0x0012, 0x6816, 0x782b, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, -+ 0x9386, 0x0002, 0x1128, 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, -+ 0x2001, 0x1952, 0x200c, 0x080c, 0x0e2f, 0x004e, 0x20a9, 0x03e8, -+ 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, -+ 0x190c, 0x2b24, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, -+ 0x1f04, 0x9740, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, -+ 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, 0x6827, 0x4000, 0x6824, -+ 0x83ff, 0x1120, 0x2009, 0x0049, 0x080c, 0x9eac, 0x000e, 0x001e, -+ 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, -+ 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19b8, 0x6a06, -+ 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, -+ 0x19b8, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, 0x9047, 0x7854, -+ 0x7032, 0x7042, 0x7047, 0x1000, 0x00f8, 0x080c, 0x9047, 0x7854, -+ 0x7032, 0x7042, 0x7047, 0x4000, 0x00b8, 0x080c, 0x9047, 0x7854, -+ 0x7032, 0x7042, 0x7047, 0x2000, 0x0078, 0x080c, 0x9047, 0x7854, -+ 0x7032, 0x7042, 0x7047, 0x0400, 0x0038, 0x080c, 0x9047, 0x7854, -+ 0x7032, 0x7042, 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x9380, -+ 0x00e6, 0x2071, 0x19b8, 0x7020, 0x9005, 0x0110, 0x8001, 0x7022, -+ 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, -+ 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7614, 0x2660, -+ 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0x9855, 0x8cff, 0x0904, -+ 0x9855, 0x6020, 0x9086, 0x0006, 0x1904, 0x9850, 0x88ff, 0x0138, -+ 0x2800, 0x9c06, 0x1904, 0x9850, 0x2039, 0x0000, 0x0050, 0x6010, -+ 0x9b06, 0x1904, 0x9850, 0x85ff, 0x0120, 0x6054, 0x9106, 0x1904, -+ 0x9850, 0x7024, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, -+ 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x80b8, -+ 0x080c, 0x98da, 0x7027, 0x0000, 0x0428, 0x080c, 0x80b8, 0x6820, -+ 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, -+ 0x080c, 0x98da, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, -+ 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, -+ 0x080c, 0x2b14, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, -+ 0x0001, 0x003e, 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, 0xbb15, 0x0110, 0x080c, 0xd4d5, 0x009e, 0x080c, -+ 0x9e62, 0x080c, 0x97b0, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x97cb, -+ 0x2c78, 0x600c, 0x2060, 0x0804, 0x97cb, 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, 0x19b8, 0x7638, 0x2660, 0x2678, 0x8cff, 0x0904, 0x98c9, -+ 0x6020, 0x9086, 0x0006, 0x1904, 0x98c4, 0x87ff, 0x0128, 0x2700, -+ 0x9c06, 0x1904, 0x98c4, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, -+ 0x0118, 0x6054, 0x9106, 0x15c0, 0x703c, 0x9c06, 0x1168, 0x0036, -+ 0x2019, 0x0001, 0x080c, 0x96d8, 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, 0xbb15, 0x0110, 0x080c, 0xd4d5, 0x080c, 0x9e62, 0x87ff, -+ 0x1198, 0x00ce, 0x0804, 0x9875, 0x2c78, 0x600c, 0x2060, 0x0804, -+ 0x9875, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, -+ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, -+ 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19b8, 0x2001, 0x1800, 0x2004, -+ 0x9086, 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, -+ 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, -+ 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 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, 0x19b8, 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, -+ 0x99b6, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, -+ 0x99b1, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, -+ 0x0904, 0x998d, 0x080c, 0x93ac, 0x68c3, 0x0000, 0x080c, 0x98da, -+ 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, -+ 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, 0x9006, 0x080c, 0x2b14, -+ 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, 0xbd0c, 0x1158, 0x080c, 0x3003, 0x080c, -+ 0xbd1d, 0x11f0, 0x080c, 0xa7c0, 0x00d8, 0x080c, 0x98da, 0x08c0, -+ 0x080c, 0xbd1d, 0x1118, 0x080c, 0xa7c0, 0x0090, 0x6014, 0x2048, -+ 0x080c, 0xbb15, 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, -+ 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x687f, 0x080c, 0xbd00, -+ 0x080c, 0xbf84, 0x080c, 0x9e62, 0x080c, 0x97b0, 0x00ce, 0x0804, -+ 0x9936, 0x2c78, 0x600c, 0x2060, 0x0804, 0x9936, 0x012e, 0x000e, -+ 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, -+ 0x6020, 0x9086, 0x0006, 0x1d20, 0x080c, 0xd4d5, 0x0c08, 0x00d6, -+ 0x080c, 0x8ed9, 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, -+ 0x20e1, 0x0001, 0x2099, 0x195a, 0x20e9, 0x0000, 0x20a1, 0x0250, -+ 0x20a9, 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, -+ 0x9380, 0x00de, 0x0005, 0x080c, 0x8ed9, 0x700b, 0x0800, 0x7814, -+ 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c, -+ 0x7026, 0x7858, 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7858, -+ 0x9084, 0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, 0x9380, 0x00b6, -+ 0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xc18a, -+ 0x00de, 0x1904, 0x9a64, 0x080c, 0x8e8e, 0x7003, 0x1300, 0x782c, -+ 0x080c, 0x9b66, 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, -+ 0x2058, 0xbaa0, 0x080c, 0x9db1, 0x11d8, 0x9286, 0x007e, 0x1128, -+ 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128, -+ 0x700b, 0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180, -+ 0x9286, 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, -+ 0x92d8, 0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, -+ 0x6098, 0x700e, 0x00a8, 0x080c, 0x9db1, 0x1130, 0x7810, 0x2058, -+ 0xb8a0, 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, 0x181e, 0x2d04, -+ 0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, -+ 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, -+ 0x080c, 0x9380, 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, -+ 0x001e, 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, -+ 0x9186, 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, 0x9ade, 0x9186, -+ 0x0005, 0x0904, 0x9ac7, 0x9186, 0x0004, 0x05d8, 0x9186, 0x0008, -+ 0x0904, 0x9acf, 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, -+ 0x080c, 0x9b43, 0x0005, 0x080c, 0x9b04, 0x00d6, 0x0026, 0x792c, -+ 0x2168, 0x2009, 0x4000, 0x6800, 0x0002, 0x9aa8, 0x9ab3, 0x9aaa, -+ 0x9ab3, 0x9aaf, 0x9aa8, 0x9aa8, 0x9ab3, 0x9ab3, 0x9ab3, 0x9ab3, -+ 0x9aa8, 0x9aa8, 0x9aa8, 0x9aa8, 0x9aa8, 0x9ab3, 0x9aa8, 0x9ab3, -+ 0x080c, 0x0db4, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, -+ 0x0010, 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, -+ 0x9afd, 0x080c, 0x9b04, 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, 0x9380, 0x00b6, 0x0036, 0x0046, 0x0056, -+ 0x0066, 0x080c, 0x8ed9, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, -+ 0x793c, 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0x9db1, 0x1118, -+ 0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, 0x181e, 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, 0x8ed9, 0x7003, 0x0100, 0x782c, -+ 0x700a, 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9380, -+ 0x080c, 0x8e85, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, -+ 0x700e, 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, -+ 0x8007, 0x701a, 0x60c3, 0x0010, 0x0804, 0x9380, 0x00e6, 0x2071, -+ 0x0240, 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8bc, -+ 0xd084, 0x0120, 0x7848, 0x702a, 0x7844, 0x702e, 0x00be, 0x00fe, -+ 0x000e, 0x00ee, 0x0005, 0x080c, 0x8ed0, 0x7003, 0x0100, 0x782c, -+ 0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9380, 0x0021, -+ 0x60c3, 0x0000, 0x0804, 0x9380, 0x00d6, 0x080c, 0x9c3f, 0xb810, -+ 0x9085, 0x0300, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, -+ 0x700a, 0x687c, 0x700e, 0x7013, 0x0819, 0x080c, 0x936e, 0x721a, -+ 0x2f10, 0x7222, 0x7a08, 0x7226, 0x2071, 0x024c, 0x00de, 0x0005, -+ 0x00a9, 0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, -+ 0x080c, 0x29ca, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, -+ 0x002e, 0x080c, 0x93a3, 0x080c, 0x80af, 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, 0x9c3f, 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, 0x1983, 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, 0xa878, -+ 0x6056, 0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946, 0xa84a, 0x6023, -+ 0x0003, 0x6007, 0x0040, 0x6003, 0x0003, 0x600b, 0xffff, 0xa817, -+ 0x0001, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813, 0x1f24, 0x080c, -+ 0x8456, 0x0126, 0x2091, 0x8000, 0x080c, 0x8a4e, 0x012e, 0x009e, -+ 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00a6, 0x0096, -+ 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x760c, 0x2660, -+ 0x2678, 0x8cff, 0x0904, 0x9d11, 0x7024, 0x9c06, 0x1520, 0x2069, -+ 0x0100, 0x68c0, 0x9005, 0x0904, 0x9ce8, 0x080c, 0x93ac, 0x68c3, -+ 0x0000, 0x080c, 0x98da, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, -+ 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2b14, -+ 0x9006, 0x080c, 0x2b14, 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, 0xbd0c, 0x1158, -+ 0x080c, 0x3003, 0x080c, 0xbd1d, 0x11f0, 0x080c, 0xa7c0, 0x00d8, -+ 0x080c, 0x98da, 0x08c0, 0x080c, 0xbd1d, 0x1118, 0x080c, 0xa7c0, -+ 0x0090, 0x6014, 0x2048, 0x080c, 0xbb15, 0x0168, 0x6020, 0x9086, -+ 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, -+ 0x688c, 0x080c, 0xbd00, 0x080c, 0xbf84, 0x080c, 0x9e62, 0x080c, -+ 0x97b0, 0x00ce, 0x0804, 0x9c99, 0x2c78, 0x600c, 0x2060, 0x0804, -+ 0x9c99, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, 0x006e, 0x009e, -+ 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, -+ 0x0006, 0x1d08, 0x080c, 0xd4d5, 0x08f0, 0x00d6, 0x0156, 0x080c, -+ 0x8ed9, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, -+ 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, -+ 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, -+ 0x080c, 0x6fb2, 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, 0x9d59, 0x60c3, 0x0020, 0x080c, 0x9380, 0x015e, -+ 0x00de, 0x0005, 0x0156, 0x080c, 0x8ed9, 0x7a14, 0x82ff, 0x0168, -+ 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, -+ 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, -+ 0x001c, 0x700f, 0x0001, 0x2011, 0x198e, 0x2204, 0x8007, 0x701a, -+ 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082, -+ 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7022, 0x2001, 0x181f, -+ 0x2004, 0x7026, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, -+ 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, -+ 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804, -+ 0x9380, 0x0006, 0x2001, 0x1836, 0x2004, 0xd0ac, 0x000e, 0x0005, -+ 0x2011, 0x0003, 0x080c, 0x9771, 0x2011, 0x0002, 0x080c, 0x977b, -+ 0x080c, 0x9662, 0x0036, 0x901e, 0x080c, 0x96d8, 0x003e, 0x0005, -+ 0x2071, 0x1883, 0x7000, 0x9005, 0x0140, 0x2001, 0x0976, 0x2071, -+ 0x1800, 0x7072, 0x7076, 0x7067, 0xffe0, 0x2071, 0x1800, 0x7070, -+ 0x7052, 0x7057, 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, -+ 0x2091, 0x8000, 0x7550, 0x9582, 0x0010, 0x0608, 0x7054, 0x2060, -+ 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7064, 0x9c02, -+ 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, -+ 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1230, 0x7556, 0x9085, -+ 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc0, 0x9006, -+ 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7550, 0x9582, 0x0010, 0x0600, -+ 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, -+ 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, -+ 0x0008, 0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, 0x1228, -+ 0x7556, 0x9085, 0x0001, 0x00ee, 0x0005, 0x7057, 0x1cd0, 0x0cc8, -+ 0x9006, 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0db4, 0x2001, 0x1819, -+ 0x2004, 0x9c02, 0x1a0c, 0x0db4, 0x9006, 0x6006, 0x600a, 0x600e, -+ 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, -+ 0x6056, 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, -+ 0x603e, 0x6042, 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x9086, -+ 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x8973, -+ 0x012e, 0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, 0x601c, -+ 0xd084, 0x190c, 0x190d, 0x6017, 0x0000, 0x6023, 0x0007, 0x2001, -+ 0x1957, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, -+ 0x601a, 0x080c, 0xd787, 0x6043, 0x0000, 0x000e, 0x0005, 0x00e6, -+ 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, 0x0001, -+ 0x0608, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, -+ 0x0018, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, -+ 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x0018, 0x7064, 0x9502, -+ 0x1230, 0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x7057, -+ 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, -+ 0x9ebf, 0x9ec8, 0x9ee3, 0x9efe, 0xc238, 0xc255, 0xc270, 0x9ebf, -+ 0x9ec8, 0x9ebf, 0x9f1a, 0x9ebf, 0x9ebf, 0x9ebf, 0x9ebf, 0x9186, -+ 0x0013, 0x1128, 0x080c, 0x886e, 0x080c, 0x8973, 0x0005, 0x0005, -+ 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x0013, 0x006e, -+ 0x0005, 0x9ee1, 0xa639, 0xa807, 0x9ee1, 0xa895, 0xa1fd, 0x9ee1, -+ 0x9ee1, 0xa5bb, 0xae37, 0x9ee1, 0x9ee1, 0x9ee1, 0x9ee1, 0x9ee1, -+ 0x9ee1, 0x080c, 0x0db4, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, -+ 0x0db4, 0x0013, 0x006e, 0x0005, 0x9efc, 0xb50b, 0x9efc, 0x9efc, -+ 0x9efc, 0x9efc, 0x9efc, 0x9efc, 0xb4b0, 0xb68d, 0x9efc, 0xb54c, -+ 0xb5cb, 0xb54c, 0xb5cb, 0x9efc, 0x080c, 0x0db4, 0x6000, 0x9082, -+ 0x0016, 0x1a0c, 0x0db4, 0x6000, 0x0002, 0x9f18, 0xae7e, 0xaf63, -+ 0xb093, 0xb23e, 0x9f18, 0x9f18, 0x9f18, 0xae52, 0xb43c, 0xb43f, -+ 0x9f18, 0x9f18, 0x9f18, 0x9f18, 0xb46e, 0x9f18, 0x9f18, 0x9f18, -+ 0x080c, 0x0db4, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, -+ 0x0013, 0x006e, 0x0005, 0x9f33, 0x9f33, 0x9f76, 0xa015, 0xa0aa, -+ 0x9f33, 0x9f33, 0x9f33, 0x9f35, 0x9f33, 0x9f33, 0x9f33, 0x9f33, -+ 0x9f33, 0x9f33, 0x9f33, 0x080c, 0x0db4, 0x9186, 0x004c, 0x0588, -+ 0x9186, 0x0003, 0x190c, 0x0db4, 0x0096, 0x601c, 0xc0ed, 0x601e, -+ 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, -+ 0xc0b5, 0xa87e, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0x9006, 0xa836, -+ 0xa83a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, -+ 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x2c10, 0x080c, 0x1a5c, -+ 0x080c, 0x8456, 0x0126, 0x2091, 0x8000, 0x080c, 0x8a4e, 0x012e, -+ 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, -+ 0xa0cc, 0x080c, 0xc22a, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, -+ 0x00f6, 0x2079, 0x1800, 0x7a8c, 0x6014, 0x2048, 0xa87c, 0xd0ec, -+ 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 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, -+ 0x9fdd, 0x9fdd, 0x9fd8, 0x9fdb, 0x9fdd, 0x9fd5, 0x9fc8, 0x9fc8, -+ 0x9fc8, 0x9fc8, 0x9fc8, 0x9fc8, 0x9fc8, 0x9fc8, 0x9fc8, 0x9fc8, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, -+ 0x00fe, 0x009e, 0x00de, 0x080c, 0x0db4, 0x080c, 0xaa76, 0x0028, -+ 0x080c, 0xab99, 0x0010, 0x080c, 0xac88, 0x00fe, 0x00ee, 0x00de, -+ 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0xa18a, -+ 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, -+ 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, -+ 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x1249, -+ 0x080c, 0xa334, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, -+ 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0x9e32, 0x2001, -+ 0x002c, 0x900e, 0x080c, 0xa1f0, 0x0c70, 0x91b6, 0x0015, 0x0170, -+ 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0db4, 0x91b2, -+ 0x0050, 0x1a0c, 0x0db4, 0x9182, 0x0047, 0x00ca, 0x2001, 0x0109, -+ 0x2004, 0xd08c, 0x0198, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, -+ 0x0026, 0x080c, 0x83aa, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, -+ 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0x9f76, 0x0005, 0xa048, -+ 0xa048, 0xa04a, 0xa080, 0xa048, 0xa048, 0xa048, 0xa048, 0xa093, -+ 0x080c, 0x0db4, 0x00d6, 0x0016, 0x0096, 0x080c, 0x8923, 0x080c, -+ 0x8a4e, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, -+ 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, -+ 0x0000, 0x900e, 0x080c, 0xa1f0, 0x080c, 0x9e32, 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, 0x8923, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xbb17, -+ 0x0120, 0xa87b, 0x0006, 0x080c, 0x688c, 0x009e, 0x00de, 0x080c, -+ 0x9e32, 0x0804, 0x8a4e, 0x080c, 0x8923, 0x080c, 0x2fda, 0x080c, -+ 0xc227, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xbb17, 0x0120, -+ 0xa87b, 0x0029, 0x080c, 0x688c, 0x009e, 0x00de, 0x080c, 0x9e32, -+ 0x0804, 0x8a4e, 0x9182, 0x0047, 0x0002, 0xa0ba, 0xa0bc, 0xa0ba, -+ 0xa0ba, 0xa0ba, 0xa0ba, 0xa0ba, 0xa0ba, 0xa0ba, 0xa0ba, 0xa0ba, -+ 0xa0ba, 0xa0bc, 0x080c, 0x0db4, 0x00d6, 0x0096, 0x080c, 0x150f, -+ 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x688c, -+ 0x009e, 0x00de, 0x0804, 0x9e32, 0x0026, 0x0036, 0x0056, 0x0066, -+ 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x0feb, 0x000e, 0x090c, -+ 0x0db4, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, -+ 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, 0x9188, -+ 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, -+ 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, -+ 0x1228, 0x2011, 0x001f, 0x080c, 0xb712, 0x04c0, 0x2130, 0x2009, -+ 0x0034, 0x2011, 0x001f, 0x080c, 0xb712, 0x96b2, 0x0034, 0xb004, -+ 0x904d, 0x0110, 0x080c, 0x0f9d, 0x080c, 0x0feb, 0x01d0, 0x8528, -+ 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, -+ 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xb712, 0x00b8, 0x96b2, -+ 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xb712, -+ 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, 0x688c, 0x000e, 0x2048, -+ 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, -+ 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x0feb, -+ 0x000e, 0x090c, 0x0db4, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, -+ 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, -+ 0x1800, 0x798c, 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, 0x688c, 0x009e, 0x00fe, -+ 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, -+ 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, -+ 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, -+ 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, -+ 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, 0x0feb, 0x2900, 0x009e, -+ 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, -+ 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, -+ 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, -+ 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, -+ 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, -+ 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, -+ 0x2e98, 0x2310, 0x84ff, 0x0904, 0xa19f, 0x0804, 0xa1a1, 0x9085, -+ 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, -+ 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, -+ 0x687f, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, -+ 0x080c, 0x9e32, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0db4, 0x080c, -+ 0x9e32, 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, 0xbb17, -+ 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, -+ 0x0804, 0x9e32, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, -+ 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8bf, 0x0000, 0x00be, 0x6014, -+ 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, -+ 0x080c, 0x9e32, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, -+ 0x0cc8, 0x0006, 0x0016, 0x080c, 0xc212, 0x0188, 0x6014, 0x9005, -+ 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, -+ 0x0022, 0x080c, 0xa611, 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, 0x9e32, 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, -+ 0xb712, 0x080c, 0xbb17, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, -+ 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9e32, 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, 0xb712, 0x009e, 0x080c, 0xbb17, 0x0148, 0xa804, 0x9005, -+ 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, -+ 0x9e32, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, -+ 0x9086, 0x0100, 0x1118, 0x080c, 0xa7c0, 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, 0x122f, -+ 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x0feb, -+ 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, -+ 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, -+ 0xad9a, 0x0086, 0x2940, 0x080c, 0x10d5, 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, 0xc18a, 0x001e, -+ 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, -+ 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0x9e32, 0x0020, 0x0039, -+ 0x0010, 0x080c, 0xa446, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, -+ 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0xa42e, 0x918e, 0x0016, -+ 0x1904, 0xa444, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, -+ 0x9186, 0x0300, 0x1904, 0xa408, 0x89ff, 0x1138, 0x6800, 0x9086, -+ 0x000f, 0x0904, 0xa3eb, 0x0804, 0xa442, 0x6808, 0x9086, 0xffff, -+ 0x1904, 0xa430, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, -+ 0xa83c, 0xa940, 0x9105, 0x1904, 0xa430, 0x6824, 0xd0b4, 0x1904, -+ 0xa430, 0x080c, 0xbd00, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, -+ 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, -+ 0x8270, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, -+ 0x1138, 0x00c6, 0x2d60, 0x080c, 0xb83c, 0x00ce, 0x0804, 0xa442, -+ 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5d4d, 0x0010, 0x080c, -+ 0x60f4, 0x00ce, 0x1904, 0xa430, 0x00c6, 0x2d60, 0x080c, 0x9e32, -+ 0x00ce, 0x0804, 0xa442, 0x00c6, 0x080c, 0x9e7f, 0x0198, 0x6017, -+ 0x0000, 0x6810, 0x6012, 0x080c, 0xbf8c, 0x6023, 0x0003, 0x6904, -+ 0x00c6, 0x2d60, 0x080c, 0x9e32, 0x00ce, 0x080c, 0x9eac, 0x00ce, -+ 0x0804, 0xa442, 0x2001, 0x1959, 0x2004, 0x6842, 0x00ce, 0x04d0, -+ 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, -+ 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, -+ 0xc1cc, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00, -+ 0x1138, 0x2001, 0x1959, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0, -+ 0x89ff, 0x090c, 0x0db4, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, -+ 0xa87b, 0x0003, 0x080c, 0x66a7, 0x080c, 0xbd00, 0x080c, 0x9e62, -+ 0x00de, 0x00ce, 0x080c, 0x9e32, 0x009e, 0x0005, 0x9186, 0x0015, -+ 0x1128, 0x2001, 0x1959, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, -+ 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xd787, 0x080c, 0x8204, -+ 0x080c, 0x9e32, 0x00ce, 0x080c, 0x9e32, 0x0005, 0x0026, 0x0036, -+ 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1959, -+ 0x2004, 0x6842, 0x0804, 0xa4c0, 0x00c6, 0x2d60, 0x080c, 0xb73d, -+ 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, -+ 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x83f1, 0x080c, 0x8973, -+ 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c, -+ 0x0db4, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178, -+ 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001, -+ 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c, -+ 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838, -+ 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306, -+ 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a, -+ 0x2001, 0x0005, 0x6832, 0x080c, 0xbe83, 0x080c, 0x8973, 0x0010, -+ 0x080c, 0x9e32, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, -+ 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, -+ 0x00be, 0x9206, 0x1904, 0xa52b, 0x700c, 0x6210, 0x00b6, 0x2258, -+ 0xba14, 0x00be, 0x9206, 0x1904, 0xa52b, 0x6038, 0x2068, 0x6824, -+ 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xa52b, 0x9286, -+ 0x0002, 0x0904, 0xa52b, 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, 0xbb17, 0x090c, 0x0db4, 0xa87b, 0x0003, 0x009e, 0x080c, -+ 0xc1cc, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, -+ 0x1959, 0x2004, 0x7042, 0x080c, 0x9e32, 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, 0xae0d, 0x002e, 0x003e, -+ 0x015e, 0x009e, 0x1904, 0xa59a, 0x0096, 0x0156, 0x0036, 0x0026, -+ 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, -+ 0xae0d, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, -+ 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, -+ 0x00fe, 0x009e, 0x00be, 0x0804, 0xa235, 0x0096, 0x2048, 0xaa12, -+ 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, -+ 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, -+ 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x122f, 0x080c, 0xa334, -+ 0x0130, 0x00fe, 0x009e, 0x080c, 0x9e32, 0x00be, 0x0005, 0x080c, -+ 0xa7c0, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x2fda, 0x080c, 0xc227, -+ 0x00fe, 0x00c6, 0x080c, 0x9ddc, 0x2f00, 0x6012, 0x6017, 0x0000, -+ 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, -+ 0x080c, 0x618f, 0x080c, 0x61bb, 0x080c, 0x8439, 0x080c, 0x8973, -+ 0x00ce, 0x0804, 0xa56d, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0db4, -+ 0x91b2, 0x0040, 0x1a04, 0xa623, 0x0002, 0xa611, 0xa611, 0xa607, -+ 0xa611, 0xa611, 0xa611, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, -+ 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, -+ 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, -+ 0xa605, 0xa605, 0xa605, 0xa605, 0xa611, 0xa605, 0xa611, 0xa611, -+ 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa607, 0xa605, 0xa605, -+ 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa611, -+ 0xa611, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, 0xa605, -+ 0xa605, 0xa605, 0xa611, 0xa605, 0xa605, 0x080c, 0x0db4, 0x0066, -+ 0x00b6, 0x6610, 0x2658, 0xb8bc, 0xc08c, 0xb8be, 0x00be, 0x006e, -+ 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, -+ 0x8439, 0x0010, 0x080c, 0x83f1, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x8973, 0x012e, 0x0005, 0x2600, 0x0002, 0xa637, 0xa637, 0xa637, -+ 0xa611, 0xa611, 0xa637, 0xa637, 0xa637, 0xa637, 0xa611, 0xa637, -+ 0xa611, 0xa637, 0xa611, 0xa637, 0xa637, 0xa637, 0xa637, 0x080c, -+ 0x0db4, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0db4, 0x91b6, 0x0013, -+ 0x0904, 0xa6fb, 0x91b6, 0x0027, 0x1904, 0xa6b6, 0x080c, 0x886e, -+ 0x6004, 0x080c, 0xbd0c, 0x01b0, 0x080c, 0xbd1d, 0x01a8, 0x908e, -+ 0x0021, 0x0904, 0xa6b3, 0x908e, 0x0022, 0x1130, 0x080c, 0xa261, -+ 0x0904, 0xa6af, 0x0804, 0xa6b0, 0x908e, 0x003d, 0x0904, 0xa6b3, -+ 0x0804, 0xa6a9, 0x080c, 0x3003, 0x2001, 0x0007, 0x080c, 0x618f, -+ 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa7c0, 0x9186, -+ 0x007e, 0x1148, 0x2001, 0x1836, 0x2014, 0xc285, 0x080c, 0x6fb2, -+ 0x1108, 0xc2ad, 0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, -+ 0x080c, 0xd7e2, 0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, -+ 0x2019, 0x0028, 0x080c, 0x8571, 0x0076, 0x903e, 0x080c, 0x8469, -+ 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xd29b, -+ 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xc227, 0x0016, 0x080c, -+ 0xbf84, 0x080c, 0x9e32, 0x001e, 0x080c, 0x30d5, 0x080c, 0x8973, -+ 0x0030, 0x080c, 0xbf84, 0x080c, 0x9e32, 0x080c, 0x8973, 0x0005, -+ 0x080c, 0xa7c0, 0x0cb0, 0x080c, 0xa7fc, 0x0c98, 0x9186, 0x0014, -+ 0x1db0, 0x080c, 0x886e, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, -+ 0xa261, 0x0d68, 0x080c, 0x2fda, 0x080c, 0xc227, 0x080c, 0xbd0c, -+ 0x1190, 0x080c, 0x3003, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, -+ 0x080c, 0xa7c0, 0x9186, 0x007e, 0x1128, 0x2001, 0x1836, 0x200c, -+ 0xc185, 0x2102, 0x0870, 0x080c, 0xbd1d, 0x1118, 0x080c, 0xa7c0, -+ 0x0840, 0x6004, 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, -+ 0x1894, 0x2079, 0x0000, 0x080c, 0x3369, 0x00fe, 0x00ee, 0x0804, -+ 0xa6a9, 0x6004, 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, 0x090c, -+ 0xa7c0, 0x0804, 0xa6a9, 0x90b2, 0x0040, 0x1a04, 0xa7a9, 0x2008, -+ 0x0002, 0xa743, 0xa744, 0xa747, 0xa74a, 0xa74d, 0xa750, 0xa741, -+ 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, -+ 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, -+ 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, 0xa753, -+ 0xa75e, 0xa741, 0xa760, 0xa75e, 0xa741, 0xa741, 0xa741, 0xa741, -+ 0xa741, 0xa75e, 0xa75e, 0xa741, 0xa741, 0xa741, 0xa741, 0xa741, -+ 0xa741, 0xa741, 0xa741, 0xa790, 0xa75e, 0xa741, 0xa75a, 0xa741, -+ 0xa741, 0xa741, 0xa75b, 0xa741, 0xa741, 0xa741, 0xa75e, 0xa787, -+ 0xa741, 0x080c, 0x0db4, 0x00d0, 0x2001, 0x000b, 0x0410, 0x2001, -+ 0x0003, 0x00f8, 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, 0x00c8, -+ 0x2001, 0x0009, 0x00b0, 0x080c, 0x886e, 0x6003, 0x0005, 0x080c, -+ 0x8973, 0x0070, 0x0018, 0x0010, 0x080c, 0x618f, 0x0804, 0xa7a1, -+ 0x080c, 0x886e, 0x080c, 0xc22a, 0x6003, 0x0004, 0x080c, 0x8973, -+ 0x0005, 0x080c, 0x618f, 0x080c, 0x886e, 0x6003, 0x0002, 0x0036, -+ 0x2019, 0x185e, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1957, -+ 0x201c, 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, -+ 0x831b, 0x9318, 0x631a, 0x003e, 0x080c, 0x8973, 0x0c08, 0x080c, -+ 0x886e, 0x080c, 0xbf84, 0x080c, 0x9e32, 0x080c, 0x8973, 0x08c0, -+ 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, 0x0000, 0x080c, 0x3369, -+ 0x00fe, 0x00ee, 0x080c, 0x886e, 0x080c, 0x9e32, 0x080c, 0x8973, -+ 0x0838, 0x080c, 0x886e, 0x6003, 0x0002, 0x080c, 0xc22a, 0x0804, -+ 0x8973, 0x2600, 0x2008, 0x0002, 0xa7be, 0xa7be, 0xa7be, 0xa7a1, -+ 0xa7a1, 0xa7be, 0xa7be, 0xa7be, 0xa7be, 0xa7a1, 0xa7be, 0xa7a1, -+ 0xa7be, 0xa7a1, 0xa7be, 0xa7be, 0xa7be, 0xa7be, 0x080c, 0x0db4, -+ 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, 0xbb17, 0x0568, 0x6014, -+ 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, -+ 0x1148, 0x080c, 0x512f, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, -+ 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, -+ 0xc0f1, 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, -+ 0x0db4, 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xc010, 0x0804, -+ 0xa884, 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xc059, 0x0804, -+ 0xa884, 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xc085, 0x0804, -+ 0xa884, 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xbfa6, 0x0804, -+ 0xa884, 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xbd56, 0x0804, -+ 0xa884, 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xbd97, 0x0804, -+ 0xa884, 0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0xa20a, 0x04e0, -+ 0x6604, 0x96b6, 0x0000, 0x1118, 0x080c, 0xa531, 0x04a8, 0x6604, -+ 0x96b6, 0x0022, 0x1118, 0x080c, 0xa242, 0x0470, 0x6604, 0x96b6, -+ 0x0035, 0x1118, 0x080c, 0xa352, 0x0438, 0x6604, 0x96b6, 0x0039, -+ 0x1118, 0x080c, 0xa4c6, 0x0400, 0x6604, 0x96b6, 0x003d, 0x1118, -+ 0x080c, 0xa27a, 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, -+ 0xa2b6, 0x0090, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0xa2e1, -+ 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, -+ 0x1128, 0x00be, 0x0804, 0xab42, 0x00be, 0x0005, 0x080c, 0x9ec7, -+ 0x0cd8, 0xa8a1, 0xa8a4, 0xa8a1, 0xa8e8, 0xa8a1, 0xaa76, 0xab4f, -+ 0xa8a1, 0xa8a1, 0xab1c, 0xa8a1, 0xab30, 0x0096, 0x080c, 0x150f, -+ 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, -+ 0x9e32, 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708c, -+ 0x9086, 0x0074, 0x1540, 0x080c, 0xd26c, 0x11b0, 0x6010, 0x00b6, -+ 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, -+ 0xb802, 0x00e9, 0x00be, 0x2001, 0x0006, 0x080c, 0x618f, 0x080c, -+ 0x3003, 0x080c, 0x9e32, 0x0088, 0x2001, 0x000a, 0x080c, 0x618f, -+ 0x080c, 0x3003, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x8439, -+ 0x080c, 0x8973, 0x0010, 0x080c, 0xaa61, 0x00ee, 0x0005, 0x00d6, -+ 0xb800, 0xd084, 0x0158, 0x9006, 0x080c, 0x617b, 0x2069, 0x1853, -+ 0x6804, 0x0020, 0x2001, 0x0006, 0x080c, 0x61bb, 0x00de, 0x0005, -+ 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, -+ 0x1904, 0xaa3a, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, -+ 0x080c, 0xac93, 0x0804, 0xa99f, 0x00d6, 0x080c, 0x6fb2, 0x0198, -+ 0x0026, 0x2011, 0x0010, 0x080c, 0x6586, 0x002e, 0x05c8, 0x080c, -+ 0x539a, 0x1540, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, -+ 0xa833, 0xdead, 0x00f8, 0x0026, 0x2011, 0x8008, 0x080c, 0x6586, -+ 0x002e, 0x0530, 0x6014, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, -+ 0x0039, 0x1140, 0x2001, 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, -+ 0xc0f1, 0x0040, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, -+ 0xa833, 0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, 0x3003, -+ 0x080c, 0x9e32, 0x001e, 0x080c, 0x30d5, 0x00de, 0x0804, 0xaa3b, -+ 0x00de, 0x080c, 0xac88, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, -+ 0x1510, 0x6014, 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, -+ 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, -+ 0x080c, 0xc0f1, 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, -+ 0x0200, 0x2001, 0x0006, 0x080c, 0x618f, 0x080c, 0x3003, 0x080c, -+ 0x9e32, 0x0804, 0xaa3b, 0x080c, 0xaa49, 0x6014, 0x9005, 0x0190, -+ 0x2048, 0xa868, 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, -+ 0x0039, 0x1d08, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, -+ 0xc0f1, 0x08f8, 0x080c, 0xaa3f, 0x0160, 0x9006, 0x080c, 0x617b, -+ 0x2001, 0x0004, 0x080c, 0x61bb, 0x2001, 0x0007, 0x080c, 0x618f, -+ 0x08a0, 0x2001, 0x0004, 0x080c, 0x618f, 0x6003, 0x0001, 0x6007, -+ 0x0003, 0x080c, 0x8439, 0x080c, 0x8973, 0x0804, 0xaa3b, 0xb85c, -+ 0xd0e4, 0x01d0, 0x080c, 0xbf26, 0x080c, 0x6fb2, 0x0118, 0xd0dc, -+ 0x1904, 0xa961, 0x2011, 0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, -+ 0x0002, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x26d7, -+ 0x78e2, 0x00fe, 0x0804, 0xa961, 0x080c, 0xbf63, 0x2011, 0x1836, -+ 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xd3c5, 0x000e, 0x1904, -+ 0xa961, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x618f, 0x9006, -+ 0x080c, 0x617b, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, -+ 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, -+ 0x00ff, 0x78e6, 0x707a, 0x7010, 0x78ea, 0x707e, 0x908c, 0x00ff, -+ 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x26ac, 0x00f6, -+ 0x2100, 0x900e, 0x080c, 0x2663, 0x795a, 0x00fe, 0x9186, 0x0081, -+ 0x01d8, 0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, -+ 0x0100, 0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, -+ 0x080c, 0x26ac, 0x00f6, 0x2079, 0x1800, 0x797e, 0x2100, 0x900e, -+ 0x080c, 0x2663, 0x795a, 0x00fe, 0x8108, 0x080c, 0x61de, 0x2b00, -+ 0x00ce, 0x1904, 0xa961, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, -+ 0x0150, 0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, -+ 0x027d, 0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x618f, 0x6023, -+ 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8439, 0x080c, -+ 0x8973, 0x0008, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, -+ 0x1810, 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1854, 0x2004, 0xd0ac, -+ 0x0005, 0x00e6, 0x080c, 0xd83b, 0x0190, 0x2071, 0x0260, 0x7108, -+ 0x720c, 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, -+ 0x2058, 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, -+ 0x0005, 0x2030, 0x2001, 0x0007, 0x080c, 0x618f, 0x080c, 0x539a, -+ 0x1120, 0x2001, 0x0007, 0x080c, 0x61bb, 0x080c, 0x3003, 0x6020, -+ 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, 0x9e32, 0x00b6, 0x00e6, -+ 0x0026, 0x0016, 0x2071, 0x1800, 0x708c, 0x9086, 0x0014, 0x1904, -+ 0xab13, 0x00d6, 0x080c, 0x6fb2, 0x0198, 0x0026, 0x2011, 0x0010, -+ 0x080c, 0x6586, 0x002e, 0x05c8, 0x080c, 0x539a, 0x1540, 0x6014, -+ 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, -+ 0x0026, 0x2011, 0x8008, 0x080c, 0x6586, 0x002e, 0x0530, 0x6014, -+ 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, -+ 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xc0f1, 0x0040, 0x6014, -+ 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, -+ 0x2058, 0xb9a0, 0x0016, 0x080c, 0x3003, 0x080c, 0x9e32, 0x001e, -+ 0x080c, 0x30d5, 0x00de, 0x0804, 0xab17, 0x00de, 0x080c, 0x539a, -+ 0x1170, 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, -+ 0xbba0, 0x2021, 0x0006, 0x080c, 0x4a76, 0x004e, 0x003e, 0x00d6, -+ 0x6010, 0x2058, 0x080c, 0x62d9, 0x080c, 0xa8d7, 0x00de, 0x080c, -+ 0xad59, 0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, -+ 0x0006, 0x080c, 0x618f, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, -+ 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, -+ 0x2011, 0x4000, 0x080c, 0xc0f1, 0x0060, 0xa864, 0x9084, 0x00ff, -+ 0x9086, 0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, -+ 0x0200, 0x009e, 0x080c, 0x3003, 0x6020, 0x9086, 0x000a, 0x0138, -+ 0x080c, 0x9e32, 0x0020, 0x080c, 0xa7c0, 0x080c, 0xaa61, 0x001e, -+ 0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, 0x1823, 0x2204, 0x9086, -+ 0x0014, 0x1160, 0x2001, 0x0002, 0x080c, 0x618f, 0x6003, 0x0001, -+ 0x6007, 0x0001, 0x080c, 0x8439, 0x0804, 0x8973, 0x0804, 0xaa61, -+ 0x2030, 0x2011, 0x1823, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, -+ 0x000b, 0x1120, 0x2001, 0x0007, 0x080c, 0x618f, 0x0804, 0x9e32, -+ 0x0804, 0xaa61, 0x0002, 0xa8a1, 0xab5a, 0xa8a1, 0xab99, 0xa8a1, -+ 0xac44, 0xab4f, 0xa8a1, 0xa8a1, 0xac57, 0xa8a1, 0xac67, 0x6604, -+ 0x9686, 0x0003, 0x0904, 0xaa76, 0x96b6, 0x001e, 0x1110, 0x080c, -+ 0x9e32, 0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xac77, 0x11a0, -+ 0x9006, 0x080c, 0x617b, 0x080c, 0x2fda, 0x080c, 0xc227, 0x2001, -+ 0x0002, 0x080c, 0x618f, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, -+ 0x8439, 0x080c, 0x8973, 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, -+ 0x2fda, 0x080c, 0xc227, 0x080c, 0xaa61, 0x00ce, 0x00de, 0x00be, -+ 0x0005, 0x0096, 0x00b6, 0x0026, 0x9016, 0x080c, 0xac85, 0x00d6, -+ 0x2069, 0x194d, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, -+ 0x9086, 0x007e, 0x1138, 0x2069, 0x181f, 0x2d04, 0x8000, 0x206a, -+ 0x00de, 0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x617b, 0x2001, -+ 0x0002, 0x080c, 0x618f, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, -+ 0x8439, 0x080c, 0x8973, 0x0804, 0xac14, 0x080c, 0xbb17, 0x01b0, -+ 0x6014, 0x2048, 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, -+ 0x0016, 0x2001, 0x0002, 0x080c, 0xc14b, 0x00b0, 0x6014, 0x2048, -+ 0xa864, 0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, -+ 0x2004, 0xd0dc, 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, -+ 0x9005, 0x1110, 0x9006, 0x0c38, 0x080c, 0xa7c0, 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, 0x618f, 0x2001, 0x0028, 0x601a, 0x6007, -+ 0x0052, 0x0010, 0x080c, 0xaa61, 0x002e, 0x00be, 0x009e, 0x0005, -+ 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xbb17, 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, 0x5c64, 0x00ee, -+ 0x0010, 0x080c, 0x2fda, 0x0870, 0x080c, 0xac85, 0x1160, 0x2001, -+ 0x0004, 0x080c, 0x618f, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, -+ 0x8439, 0x0804, 0x8973, 0x080c, 0xa7c0, 0x0804, 0xaa61, 0x0469, -+ 0x1160, 0x2001, 0x0008, 0x080c, 0x618f, 0x6003, 0x0001, 0x6007, -+ 0x0005, 0x080c, 0x8439, 0x0804, 0x8973, 0x0804, 0xaa61, 0x00e9, -+ 0x1160, 0x2001, 0x000a, 0x080c, 0x618f, 0x6003, 0x0001, 0x6007, -+ 0x0001, 0x080c, 0x8439, 0x0804, 0x8973, 0x0804, 0xaa61, 0x2009, -+ 0x026e, 0x2104, 0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, -+ 0x9084, 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, -+ 0x00b6, 0x00c6, 0x0016, 0x6110, 0x2158, 0x080c, 0x624d, 0x001e, -+ 0x00ce, 0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, -+ 0x0016, 0x6010, 0x2058, 0x2009, 0x1836, 0x2104, 0x9085, 0x0003, -+ 0x200a, 0x080c, 0xad2b, 0x0560, 0x2009, 0x1836, 0x2104, 0xc0cd, -+ 0x200a, 0x080c, 0x655e, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, -+ 0x080c, 0xd52a, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, -+ 0x002a, 0x2009, 0x0001, 0x080c, 0x2fa5, 0x00e6, 0x2071, 0x1800, -+ 0x080c, 0x2dbb, 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, -+ 0x007f, 0x080c, 0x30d5, 0x8108, 0x1f04, 0xacc9, 0x015e, 0x00ce, -+ 0x080c, 0xac88, 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, -+ 0x181e, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0x181f, -+ 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, -+ 0x9105, 0x2009, 0x182b, 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, -+ 0x080c, 0x26ac, 0x080c, 0x6fb2, 0x0170, 0x2071, 0x0260, 0x2069, -+ 0x1953, 0x7048, 0x206a, 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, -+ 0x680e, 0x080c, 0xbf26, 0x0040, 0x2001, 0x0006, 0x080c, 0x618f, -+ 0x080c, 0x3003, 0x080c, 0x9e32, 0x001e, 0x003e, 0x00de, 0x00ee, -+ 0x00fe, 0x00be, 0x0005, 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, -+ 0x2019, 0x182b, 0x231c, 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, -+ 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, -+ 0x2011, 0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, -+ 0xae0d, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, -+ 0x080c, 0xae0d, 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, 0x19c1, 0x252c, 0x2021, 0x19c7, 0x2424, -+ 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7250, 0x7070, 0x9202, 0x1a04, -+ 0xade5, 0x080c, 0xd55b, 0x0904, 0xadde, 0x6720, 0x9786, 0x0007, -+ 0x0904, 0xadde, 0x2500, 0x9c06, 0x0904, 0xadde, 0x2400, 0x9c06, -+ 0x05e8, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, -+ 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1580, 0x00c6, 0x6000, -+ 0x9086, 0x0004, 0x1110, 0x080c, 0x190d, 0x9786, 0x000a, 0x0148, -+ 0x080c, 0xbd1d, 0x1130, 0x00ce, 0x080c, 0xa7c0, 0x080c, 0x9e62, -+ 0x00e8, 0x6014, 0x2048, 0x080c, 0xbb17, 0x01a8, 0x9786, 0x0003, -+ 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, -+ 0x2048, 0x080c, 0x0f9d, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, -+ 0x687f, 0x080c, 0xbd00, 0x080c, 0x9e62, 0x00ce, 0x9ce0, 0x0018, -+ 0x7064, 0x9c02, 0x1210, 0x0804, 0xad8c, 0x012e, 0x000e, 0x002e, -+ 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9786, -+ 0x0006, 0x1118, 0x080c, 0xd4d5, 0x0c30, 0x9786, 0x000a, 0x0998, -+ 0x0880, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, -+ 0xadf9, 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, 0x0db4, 0x080c, 0xbd0c, 0x0120, 0x080c, -+ 0xbd1d, 0x0168, 0x0028, 0x080c, 0x3003, 0x080c, 0xbd1d, 0x0138, -+ 0x080c, 0x886e, 0x080c, 0x9e32, 0x080c, 0x8973, 0x0005, 0x080c, -+ 0xa7c0, 0x0cb0, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, -+ 0x000a, 0x0005, 0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae6e, -+ 0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae6e, 0xae70, 0xae70, 0xae70, -+ 0xae70, 0xae6e, 0xae6e, 0xae6e, 0xae70, 0xae6e, 0x080c, 0x0db4, -+ 0x600b, 0xffff, 0x6003, 0x0001, 0x6106, 0x080c, 0x83f1, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x8973, 0x012e, 0x0005, 0x9186, 0x0013, -+ 0x1128, 0x6004, 0x9082, 0x0040, 0x0804, 0xaf25, 0x9186, 0x0027, -+ 0x1520, 0x080c, 0x886e, 0x080c, 0x2fda, 0x080c, 0xc227, 0x0096, -+ 0x6114, 0x2148, 0x080c, 0xbb17, 0x0198, 0x080c, 0xbd1d, 0x1118, -+ 0x080c, 0xa7c0, 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, -+ 0x0000, 0xa97c, 0xc1c5, 0xa97e, 0x080c, 0x688c, 0x080c, 0xbd00, -+ 0x009e, 0x080c, 0x9e32, 0x0804, 0x8973, 0x9186, 0x0014, 0x1120, -+ 0x6004, 0x9082, 0x0040, 0x04a0, 0x9186, 0x0046, 0x0150, 0x9186, -+ 0x0045, 0x0138, 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, 0x190c, -+ 0x0db4, 0x2001, 0x0109, 0x2004, 0xd084, 0x0508, 0x0126, 0x2091, -+ 0x2800, 0x0006, 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, -+ 0x2079, 0x19b8, 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x82dd, -+ 0x00ce, 0x00ee, 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, -+ 0xa001, 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xaf63, 0x0005, -+ 0x0002, 0xaeff, 0xaefd, 0xaefd, 0xaefd, 0xaefd, 0xaefd, 0xaefd, -+ 0xaefd, 0xaefd, 0xaefd, 0xaefd, 0xaf1a, 0xaf1a, 0xaf1a, 0xaf1a, -+ 0xaefd, 0xaf1a, 0xaefd, 0xaf1a, 0xaefd, 0x080c, 0x0db4, 0x080c, -+ 0x886e, 0x0096, 0x6114, 0x2148, 0x080c, 0xbb17, 0x0168, 0xa867, -+ 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, -+ 0x080c, 0x688c, 0x080c, 0xbd00, 0x009e, 0x080c, 0x9e32, 0x080c, -+ 0x8973, 0x0005, 0x080c, 0x886e, 0x080c, 0xbd1d, 0x090c, 0xa7c0, -+ 0x080c, 0x9e32, 0x080c, 0x8973, 0x0005, 0x0002, 0xaf3c, 0xaf3a, -+ 0xaf3a, 0xaf3a, 0xaf3a, 0xaf3a, 0xaf3a, 0xaf3a, 0xaf3a, 0xaf3a, -+ 0xaf3a, 0xaf53, 0xaf53, 0xaf53, 0xaf53, 0xaf3a, 0xaf5d, 0xaf3a, -+ 0xaf53, 0xaf3a, 0x080c, 0x0db4, 0x0096, 0x080c, 0x886e, 0x6014, -+ 0x2048, 0x2001, 0x1959, 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, -+ 0x6003, 0x0004, 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005, -+ 0x6003, 0x0002, 0x0cb8, 0x080c, 0x886e, 0x080c, 0xc22a, 0x080c, -+ 0xc22f, 0x6003, 0x000f, 0x0804, 0x8973, 0x080c, 0x886e, 0x080c, -+ 0x9e32, 0x0804, 0x8973, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, -+ 0x0208, 0x000a, 0x0005, 0xaf7f, 0xaf7f, 0xaf7f, 0xaf7f, 0xaf7f, -+ 0xaf81, 0xb05e, 0xaf7f, 0xb092, 0xaf7f, 0xaf7f, 0xaf7f, 0xaf7f, -+ 0xaf7f, 0xaf7f, 0xaf7f, 0xaf7f, 0xaf7f, 0xaf7f, 0xb092, 0x080c, -+ 0x0db4, 0x00b6, 0x0096, 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, -+ 0x86ff, 0x1528, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xb04d, -+ 0xa87b, 0x0000, 0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, -+ 0xa834, 0xa938, 0x9115, 0x190c, 0xb227, 0x080c, 0x66a7, 0x6210, -+ 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4, -+ 0x1904, 0xb031, 0x080c, 0x9e32, 0x009e, 0x00be, 0x0005, 0x968c, -+ 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xb035, -+ 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, 0xaf88, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, -+ 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, -+ 0x2011, 0x0025, 0x080c, 0xb712, 0x003e, 0xd6cc, 0x0904, 0xaf9d, -+ 0x7154, 0xa98a, 0x81ff, 0x0904, 0xaf9d, 0x9192, 0x0021, 0x1278, -+ 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, 0xb712, 0x2011, -+ 0x0205, 0x2013, 0x0000, 0x080c, 0xc1b7, 0x0804, 0xaf9d, 0xa868, -+ 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, -+ 0x080c, 0xb6b1, 0x00ae, 0x080c, 0xc1b7, 0x080c, 0xb702, 0x0804, -+ 0xaf9f, 0x080c, 0xbe10, 0x0804, 0xafac, 0xa87c, 0xd0ac, 0x0904, -+ 0xafb8, 0xa880, 0xd0bc, 0x1904, 0xafb8, 0x7348, 0xa838, 0x9306, -+ 0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, 0xafb8, 0xd6d4, 0x0190, -+ 0xab38, 0x9305, 0x0904, 0xafb8, 0x0068, 0xa87c, 0xd0ac, 0x0904, -+ 0xaf90, 0xa838, 0xa934, 0x9105, 0x0904, 0xaf90, 0xa880, 0xd0bc, -+ 0x1904, 0xaf90, 0x080c, 0xbe4a, 0x0804, 0xafac, 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, 0x1a5c, 0x080c, 0x8456, 0x080c, 0x8a4e, -+ 0x009e, 0x0005, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, -+ 0x0208, 0x000a, 0x0005, 0xb0af, 0xb0af, 0xb0af, 0xb0af, 0xb0af, -+ 0xb0b1, 0xb147, 0xb0af, 0xb0af, 0xb15e, 0xb1ea, 0xb0af, 0xb0af, -+ 0xb0af, 0xb0af, 0xb1ff, 0xb0af, 0xb0af, 0xb0af, 0xb0af, 0x080c, -+ 0x0db4, 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, 0xb142, 0x9694, 0xff00, 0x9284, 0x0c00, -+ 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, -+ 0xb142, 0x080c, 0x0feb, 0x090c, 0x0db4, 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, 0xb712, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, -+ 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, -+ 0x0029, 0x080c, 0xb712, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, -+ 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, -+ 0x080c, 0xb6b1, 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, 0x1a5c, 0x0804, 0x9379, 0x6003, 0x0002, -+ 0x6004, 0x9086, 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, -+ 0xd0ac, 0x0160, 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, -+ 0x080c, 0x1648, 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, -+ 0x009e, 0x080c, 0x886e, 0x080c, 0x8973, 0x0096, 0x2001, 0x1959, -+ 0x2004, 0x6042, 0x080c, 0x8923, 0x080c, 0x8a4e, 0x6114, 0x2148, -+ 0xa97c, 0xd1e4, 0x0904, 0xb1e5, 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, 0x0f9d, 0x001e, -+ 0x0440, 0x0016, 0x080c, 0x0f9d, 0x009e, 0xa974, 0x0016, 0x080c, -+ 0xb702, 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, 0x66a7, -+ 0x001e, 0xd1e4, 0x1120, 0x080c, 0x9e32, 0x009e, 0x0005, 0x080c, -+ 0xbe10, 0x0cd8, 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x886e, -+ 0x080c, 0x8973, 0x2019, 0x0001, 0x080c, 0x96d8, 0x6003, 0x0002, -+ 0x080c, 0xc22f, 0x080c, 0x8923, 0x080c, 0x8a4e, 0x0005, 0x6004, -+ 0x9086, 0x0040, 0x1120, 0x080c, 0x886e, 0x080c, 0x8973, 0x2019, -+ 0x0001, 0x080c, 0x96d8, 0x080c, 0x8923, 0x080c, 0x2fda, 0x080c, -+ 0xc227, 0x0096, 0x6114, 0x2148, 0x080c, 0xbb17, 0x0150, 0xa867, -+ 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0x080c, 0x688c, 0x080c, -+ 0xbd00, 0x009e, 0x080c, 0x9e32, 0x080c, 0x8a4e, 0x0005, 0xa87b, -+ 0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, -+ 0x9189, 0x0000, 0x0006, 0x0016, 0x2009, 0x1a4a, 0x2104, 0x8000, -+ 0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054, -+ 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb25a, 0xb25a, -+ 0xb25a, 0xb25a, 0xb25a, 0xb25c, 0xb25a, 0xb25a, 0xb302, 0xb25a, -+ 0xb25a, 0xb25a, 0xb25a, 0xb25a, 0xb25a, 0xb25a, 0xb25a, 0xb25a, -+ 0xb25a, 0xb433, 0x080c, 0x0db4, 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, 0xb2fb, 0x9694, -+ 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, -+ 0x9284, 0x0300, 0x0904, 0xb2fb, 0x9686, 0x0100, 0x1130, 0x7064, -+ 0x9005, 0x1118, 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x0feb, 0x090c, -+ 0x0db4, 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, 0xb712, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, -+ 0x81ff, 0x01c8, 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, -+ 0x2011, 0x0029, 0x080c, 0xb712, 0x2011, 0x0205, 0x2013, 0x0000, -+ 0x0050, 0xb068, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, -+ 0x2950, 0x080c, 0xb6b1, 0x080c, 0x18eb, 0x009e, 0x00ee, 0x00ae, -+ 0x007e, 0x0005, 0x2001, 0x1959, 0x2004, 0x6042, 0x0096, 0x6114, -+ 0x2148, 0xa83c, 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, -+ 0x6003, 0x0002, 0xa97c, 0xd1e4, 0x0904, 0xb42e, 0x6043, 0x0000, -+ 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, -+ 0x0904, 0xb3fd, 0xa978, 0xa868, 0xd0fc, 0x0904, 0xb3be, 0x0016, -+ 0xa87c, 0x0006, 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, -+ 0x00ff, 0x90b6, 0x0002, 0x0904, 0xb38c, 0x9086, 0x0028, 0x1904, -+ 0xb378, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x0804, 0xb394, 0x6024, -+ 0xd0f4, 0x11d0, 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, -+ 0x9206, 0x1120, 0xa88c, 0xaa34, 0x9206, 0x0988, 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, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, -+ 0x2048, 0x080c, 0x0f9d, 0x009e, 0x080c, 0xbe4a, 0x0804, 0xb42e, -+ 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xc0da, -+ 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, -+ 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, -+ 0xa938, 0x9115, 0x190c, 0xb227, 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, 0xc1b7, 0x001e, 0xa874, 0x0006, -+ 0x2148, 0x080c, 0x0f9d, 0x001e, 0x0804, 0xb42a, 0x0016, 0x00a6, -+ 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, -+ 0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, -+ 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xc0da, 0x0118, -+ 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, -+ 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, -+ 0x9115, 0x190c, 0xb227, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, -+ 0xb07e, 0x00ae, 0x080c, 0x0f9d, 0x009e, 0x080c, 0xc1b7, 0xa974, -+ 0x0016, 0x080c, 0xb702, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, -+ 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, -+ 0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, -+ 0xc0da, 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, -+ 0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, -+ 0xa834, 0xa938, 0x9115, 0x190c, 0xb227, 0xa974, 0x0016, 0x080c, -+ 0x66a7, 0x001e, 0xd1e4, 0x1120, 0x080c, 0x9e32, 0x009e, 0x0005, -+ 0x080c, 0xbe10, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, -+ 0x190c, 0x18f9, 0x009e, 0x0005, 0x080c, 0x886e, 0x0010, 0x080c, -+ 0x8923, 0x080c, 0xbb17, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, -+ 0xbd1d, 0x1118, 0x080c, 0xa7c0, 0x00a0, 0xa867, 0x0103, 0x2009, -+ 0x180c, 0x210c, 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, -+ 0x918e, 0x0029, 0x1110, 0x080c, 0xd7d3, 0xa877, 0x0000, 0x080c, -+ 0x688c, 0x009e, 0x080c, 0x9e32, 0x080c, 0x8973, 0x0804, 0x8a4e, -+ 0xa87b, 0x0004, 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, -+ 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb48a, 0xb48a, -+ 0xb48a, 0xb48a, 0xb48a, 0xb48c, 0xb48a, 0xb48a, 0xb48a, 0xb48a, -+ 0xb48a, 0xb48a, 0xb48a, 0xb48a, 0xb48a, 0xb48a, 0xb48a, 0xb48a, -+ 0xb48a, 0xb48a, 0x080c, 0x0db4, 0x080c, 0x538e, 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, 0x688c, 0x009e, 0x0804, 0x9e32, -+ 0x9182, 0x0085, 0x0002, 0xb4c2, 0xb4c0, 0xb4c0, 0xb4ce, 0xb4c0, -+ 0xb4c0, 0xb4c0, 0xb4c0, 0xb4c0, 0xb4c0, 0xb4c0, 0xb4c0, 0xb4c0, -+ 0x080c, 0x0db4, 0x6003, 0x0001, 0x6106, 0x080c, 0x83f1, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x8973, 0x012e, 0x0005, 0x0026, 0x0056, -+ 0x00d6, 0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, -+ 0xbb05, 0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, -+ 0x6d10, 0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xb73d, 0x00ce, -+ 0x0128, 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, -+ 0x6003, 0x0001, 0x080c, 0x83f1, 0x080c, 0x8973, 0x9280, 0x0004, -+ 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, -+ 0x0128, 0x00c6, 0x2260, 0x080c, 0xbe4a, 0x00ce, 0x00ee, 0x00de, -+ 0x005e, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, -+ 0x0085, 0x0a0c, 0x0db4, 0x908a, 0x0092, 0x1a0c, 0x0db4, 0x9082, -+ 0x0085, 0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, -+ 0x0db4, 0x080c, 0x886e, 0x0096, 0x6014, 0x2048, 0x080c, 0xbb17, -+ 0x0140, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, -+ 0x688c, 0x009e, 0x080c, 0x9e62, 0x0804, 0x8973, 0xb543, 0xb545, -+ 0xb545, 0xb543, 0xb543, 0xb543, 0xb543, 0xb543, 0xb543, 0xb543, -+ 0xb543, 0xb543, 0xb543, 0x080c, 0x0db4, 0x080c, 0x886e, 0x080c, -+ 0x9e62, 0x080c, 0x8973, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, -+ 0x9082, 0x0085, 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, -+ 0x886e, 0x080c, 0x2fda, 0x080c, 0xc227, 0x0096, 0x6014, 0x2048, -+ 0x080c, 0xbb17, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, -+ 0x0029, 0x080c, 0x688c, 0x080c, 0xbd00, 0x009e, 0x080c, 0x9e32, -+ 0x080c, 0x8973, 0x0005, 0x080c, 0x9ec7, 0x0ce0, 0x9186, 0x0014, -+ 0x1dd0, 0x080c, 0x886e, 0x0096, 0x6014, 0x2048, 0x080c, 0xbb17, -+ 0x0d60, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, -+ 0xc0ec, 0xa882, 0x08f0, 0x0002, 0xb59b, 0xb599, 0xb599, 0xb599, -+ 0xb599, 0xb599, 0xb5b3, 0xb599, 0xb599, 0xb599, 0xb599, 0xb599, -+ 0xb599, 0x080c, 0x0db4, 0x080c, 0x886e, 0x6034, 0x908c, 0xff00, -+ 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, -+ 0x1957, 0x0010, 0x2001, 0x1958, 0x2004, 0x601a, 0x6003, 0x000c, -+ 0x080c, 0x8973, 0x0005, 0x080c, 0x886e, 0x6034, 0x908c, 0xff00, -+ 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, -+ 0x1957, 0x0010, 0x2001, 0x1958, 0x2004, 0x601a, 0x6003, 0x000e, -+ 0x080c, 0x8973, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, -+ 0x0208, 0x0012, 0x0804, 0x9ec7, 0xb5e1, 0xb5e1, 0xb5e1, 0xb5e1, -+ 0xb5e3, 0xb630, 0xb5e1, 0xb5e1, 0xb5e1, 0xb5e1, 0xb5e1, 0xb5e1, -+ 0xb5e1, 0x080c, 0x0db4, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, -+ 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xb644, -+ 0x080c, 0xbb17, 0x1118, 0x080c, 0xbd00, 0x0068, 0x6014, 0x2048, -+ 0xa87c, 0xd0e4, 0x1110, 0x080c, 0xbd00, 0xa867, 0x0103, 0x080c, -+ 0xc1f2, 0x080c, 0x688c, 0x00d6, 0x2c68, 0x080c, 0x9ddc, 0x01d0, -+ 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, -+ 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, -+ 0x080c, 0xbf8c, 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x83f1, -+ 0x080c, 0x8973, 0x2d60, 0x00de, 0x080c, 0x9e32, 0x009e, 0x0005, -+ 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, -+ 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, -+ 0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xc18a, -+ 0x11f0, 0x080c, 0x9ddc, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, -+ 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, -+ 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, -+ 0x6156, 0x080c, 0xbf8c, 0x080c, 0x83f1, 0x080c, 0x8973, 0x2d60, -+ 0x00de, 0x0804, 0x9e32, 0x0096, 0x6014, 0x2048, 0x080c, 0xbb17, -+ 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, -+ 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, -+ 0xa87b, 0x0005, 0x080c, 0xbe0c, 0xa877, 0x0000, 0x080c, 0x688c, -+ 0x080c, 0xbd00, 0x009e, 0x0804, 0x9e32, 0x0016, 0x0096, 0x6014, -+ 0x2048, 0x080c, 0xbb17, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, -+ 0xa877, 0x0000, 0x080c, 0x688c, 0x009e, 0x001e, 0x9186, 0x0013, -+ 0x0148, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, -+ 0x9ec7, 0x0030, 0x080c, 0x886e, 0x080c, 0x9e62, 0x080c, 0x8973, -+ 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, -+ 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, -+ 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xb712, 0x96b2, -+ 0x0020, 0xb004, 0x904d, 0x0110, 0x080c, 0x0f9d, 0x080c, 0x0feb, -+ 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, 0x688c, 0x2a48, 0x0cb8, 0x080c, 0x688c, -+ 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, 0xb778, -+ 0xb778, 0xb773, 0xb79a, 0xb766, 0xb773, 0xb79a, 0xb773, 0xb766, -+ 0xb766, 0xb773, 0xb773, 0xb773, 0xb766, 0xb766, 0x080c, 0x0db4, -+ 0x0036, 0x2019, 0x0010, 0x080c, 0xd0e5, 0x6023, 0x0006, 0x6003, -+ 0x0007, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, -+ 0x0096, 0x86ff, 0x11d8, 0x6014, 0x2048, 0x080c, 0xbb17, 0x01c0, -+ 0xa864, 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, -+ 0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x6ac6, 0x080c, 0xbe0c, -+ 0x080c, 0x687f, 0x080c, 0x9e62, 0x9085, 0x0001, 0x009e, 0x0005, -+ 0x9006, 0x0ce0, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x0002, -+ 0xb7b0, 0xb7de, 0xb7b2, 0xb7ff, 0xb7d9, 0xb7b0, 0xb773, 0xb778, -+ 0xb778, 0xb773, 0xb773, 0xb773, 0xb773, 0xb773, 0xb773, 0xb773, -+ 0x080c, 0x0db4, 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, -+ 0x0096, 0x6014, 0x2048, 0x080c, 0xbb17, 0x0158, 0xa87c, 0xd0cc, -+ 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0f9d, 0x009e, 0x080c, -+ 0xbe0c, 0x009e, 0x080c, 0xc1cc, 0x6007, 0x0085, 0x6003, 0x000b, -+ 0x6023, 0x0002, 0x080c, 0x83f1, 0x080c, 0x8973, 0x9085, 0x0001, -+ 0x0005, 0x0066, 0x080c, 0x190d, 0x006e, 0x08a0, 0x00e6, 0x2071, -+ 0x19b8, 0x7024, 0x9c06, 0x1120, 0x080c, 0x9662, 0x00ee, 0x0850, -+ 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, -+ 0x2049, 0x0001, 0x2c40, 0x080c, 0x97ba, 0x009e, 0x008e, 0x0010, -+ 0x080c, 0x955f, 0x00ee, 0x1904, 0xb7b2, 0x0804, 0xb773, 0x0036, -+ 0x00e6, 0x2071, 0x19b8, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, -+ 0x96d8, 0x00ee, 0x003e, 0x0804, 0xb7b2, 0x080c, 0x98ea, 0x00ee, -+ 0x003e, 0x1904, 0xb7b2, 0x0804, 0xb773, 0x00c6, 0x6020, 0x9084, -+ 0x000f, 0x0013, 0x00ce, 0x0005, 0xb832, 0xb8fb, 0xba62, 0xb83c, -+ 0x9e62, 0xb832, 0xd0d7, 0xc234, 0xb8fb, 0xb82b, 0xbae1, 0xb82b, -+ 0xb82b, 0xb82b, 0xb82b, 0x080c, 0x0db4, 0x080c, 0xbd1d, 0x1110, -+ 0x080c, 0xa7c0, 0x0005, 0x080c, 0x886e, 0x080c, 0x8973, 0x0804, -+ 0x9e32, 0x601b, 0x0001, 0x0005, 0x080c, 0xbb17, 0x0130, 0x6014, -+ 0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, -+ 0x1a0c, 0x0db4, 0x0002, 0xb85b, 0xb85d, 0xb881, 0xb895, 0xb8b9, -+ 0xb85b, 0xb832, 0xb832, 0xb832, 0xb895, 0xb895, 0xb85b, 0xb85b, -+ 0xb85b, 0xb85b, 0xb89f, 0x080c, 0x0db4, 0x00e6, 0x6014, 0x0096, -+ 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b8, 0x7024, -+ 0x9c06, 0x01a0, 0x080c, 0x955f, 0x080c, 0xc1cc, 0x6007, 0x0085, -+ 0x6003, 0x000b, 0x6023, 0x0002, 0x2001, 0x1958, 0x2004, 0x601a, -+ 0x080c, 0x83f1, 0x080c, 0x8973, 0x00ee, 0x0005, 0x601b, 0x0001, -+ 0x0cd8, 0x0096, 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, -+ 0x080c, 0xc1cc, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, -+ 0x080c, 0x83f1, 0x080c, 0x8973, 0x0005, 0x0096, 0x601b, 0x0001, -+ 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, -+ 0x538e, 0x01a8, 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, -+ 0x0103, 0xa87b, 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, -+ 0xa897, 0x4005, 0xa89b, 0x0004, 0x080c, 0x688c, 0x009e, 0x0804, -+ 0x9e32, 0x6014, 0x0096, 0x904d, 0x05c8, 0xa97c, 0xd1e4, 0x05b0, -+ 0x2001, 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, -+ 0x009e, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0030, -+ 0x2c08, 0x080c, 0x1518, 0x2001, 0x030c, 0x2004, 0x9086, 0x0041, -+ 0x11a0, 0x6014, 0x0096, 0x904d, 0x090c, 0x0db4, 0xa880, 0xd0f4, -+ 0x1130, 0xc0f5, 0xa882, 0x009e, 0x601b, 0x0002, 0x0070, 0x009e, -+ 0x2001, 0x0037, 0x2c08, 0x080c, 0x1518, 0x6000, 0x9086, 0x0004, -+ 0x1120, 0x2009, 0x0048, 0x080c, 0x9eac, 0x0005, 0x009e, 0x080c, -+ 0x190d, 0x0804, 0xb881, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, -+ 0x000b, 0x0005, 0xb912, 0xb839, 0xb914, 0xb912, 0xb914, 0xb914, -+ 0xb833, 0xb912, 0xb82d, 0xb82d, 0xb912, 0xb912, 0xb912, 0xb912, -+ 0xb912, 0xb912, 0x080c, 0x0db4, 0x6010, 0x00b6, 0x2058, 0xb804, -+ 0x9084, 0x00ff, 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0db4, 0x00b6, -+ 0x0013, 0x00be, 0x0005, 0xb92f, 0xb9fc, 0xb931, 0xb971, 0xb931, -+ 0xb971, 0xb931, 0xb93f, 0xb92f, 0xb971, 0xb92f, 0xb960, 0x080c, -+ 0x0db4, 0x6004, 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, -+ 0x908e, 0x0002, 0x0590, 0x908e, 0x0052, 0x0904, 0xb9f8, 0x6004, -+ 0x080c, 0xbd1d, 0x0904, 0xba15, 0x908e, 0x0004, 0x1110, 0x080c, -+ 0x3003, 0x908e, 0x0021, 0x0904, 0xba19, 0x908e, 0x0022, 0x0904, -+ 0xba5d, 0x908e, 0x003d, 0x0904, 0xba19, 0x908e, 0x0039, 0x0904, -+ 0xba1d, 0x908e, 0x0035, 0x0904, 0xba1d, 0x908e, 0x001e, 0x0178, -+ 0x908e, 0x0001, 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, -+ 0x9086, 0x0006, 0x0110, 0x080c, 0x2fda, 0x080c, 0xa7c0, 0x0804, -+ 0x9e62, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xb9e9, -+ 0x9186, 0x0002, 0x1904, 0xb9be, 0x2001, 0x1836, 0x2004, 0xd08c, -+ 0x11c8, 0x080c, 0x6fb2, 0x11b0, 0x080c, 0xc212, 0x0138, 0x080c, -+ 0x6fd5, 0x1120, 0x080c, 0x6ec2, 0x0804, 0xba46, 0x2001, 0x194e, -+ 0x2003, 0x0001, 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x6ee4, -+ 0x0804, 0xba46, 0x6010, 0x2058, 0x2001, 0x1836, 0x2004, 0xd0ac, -+ 0x1904, 0xba46, 0xb8a0, 0x9084, 0xff80, 0x1904, 0xba46, 0xb840, -+ 0x9084, 0x00ff, 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, -+ 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0x9ddc, -+ 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, 0x5c64, 0x00ee, 0x080c, 0xa7c0, 0x0030, -+ 0x080c, 0xa7c0, 0x080c, 0x2fda, 0x080c, 0xc227, 0x00e6, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x3003, 0x012e, 0x00ee, 0x080c, 0x9e62, -+ 0x0005, 0x2001, 0x0002, 0x080c, 0x618f, 0x6003, 0x0001, 0x6007, -+ 0x0002, 0x080c, 0x8439, 0x080c, 0x8973, 0x00de, 0x00ce, 0x0c80, -+ 0x080c, 0x3003, 0x0804, 0xb96d, 0x00c6, 0x00d6, 0x6104, 0x9186, -+ 0x0016, 0x0d38, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, -+ 0x0904, 0xb9be, 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x8439, -+ 0x080c, 0x8973, 0x00de, 0x00ce, 0x0898, 0x080c, 0xa7c0, 0x0804, -+ 0xb96f, 0x080c, 0xa7fc, 0x0804, 0xb96f, 0x00d6, 0x2c68, 0x6104, -+ 0x080c, 0xc18a, 0x00de, 0x0118, 0x080c, 0x9e32, 0x00f0, 0x6004, -+ 0x8007, 0x6134, 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, -+ 0x6003, 0x000b, 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1958, -+ 0x2004, 0x601a, 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, -+ 0x2160, 0x080c, 0x83f1, 0x080c, 0x8973, 0x0005, 0x00de, 0x00ce, -+ 0x080c, 0xa7c0, 0x080c, 0x2fda, 0x00e6, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x3003, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, -+ 0x6043, 0x0000, 0x012e, 0x00ee, 0x0005, 0x080c, 0xa261, 0x1904, -+ 0xba15, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x0096, -+ 0x00d6, 0x001b, 0x00de, 0x009e, 0x0005, 0xba7d, 0xba7d, 0xba7d, -+ 0xba7d, 0xba7d, 0xba7d, 0xba7d, 0xba7d, 0xba7d, 0xb832, 0xba7d, -+ 0xb839, 0xba7f, 0xb839, 0xba8c, 0xba7d, 0x080c, 0x0db4, 0x6004, -+ 0x9086, 0x008b, 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x0005, 0x080c, 0xc206, 0x0118, 0x080c, -+ 0xc219, 0x0010, 0x080c, 0xc227, 0x080c, 0xbd00, 0x080c, 0xbb17, -+ 0x0570, 0x080c, 0x2fda, 0x080c, 0xbb17, 0x0168, 0x6014, 0x2048, -+ 0xa867, 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, -+ 0xa882, 0x080c, 0x688c, 0x2c68, 0x080c, 0x9ddc, 0x0150, 0x6810, -+ 0x6012, 0x080c, 0xbf8c, 0x00c6, 0x2d60, 0x080c, 0x9e62, 0x00ce, -+ 0x0008, 0x2d60, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, -+ 0x6003, 0x0001, 0x080c, 0x8439, 0x080c, 0x8973, 0x00c8, 0x080c, -+ 0xc206, 0x0138, 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x2fda, -+ 0x08d0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, -+ 0x9186, 0x0035, 0x1118, 0x080c, 0x2fda, 0x0868, 0x080c, 0x9e62, -+ 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0db4, 0x0002, 0xbaf7, -+ 0xbaf7, 0xbaf9, 0xbaf9, 0xbaf9, 0xbaf7, 0xbaf7, 0x9e62, 0xbaf7, -+ 0xbaf7, 0xbaf7, 0xbaf7, 0xbaf7, 0xbaf7, 0xbaf7, 0xbaf7, 0x080c, -+ 0x0db4, 0x080c, 0x98ea, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, -+ 0x080c, 0x688c, 0x009e, 0x0804, 0x9e32, 0x9284, 0x0007, 0x1158, -+ 0x9282, 0x1cd0, 0x0240, 0x2001, 0x1819, 0x2004, 0x9202, 0x1218, -+ 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, -+ 0x0006, 0x6014, 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, -+ 0xf000, 0x0110, 0x080c, 0x1096, 0x000e, 0x009e, 0x0005, 0x00e6, -+ 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1cd0, -+ 0x2071, 0x1800, 0x7350, 0x7070, 0x9302, 0x1640, 0x6020, 0x9206, -+ 0x11f8, 0x080c, 0xc212, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, -+ 0x9086, 0x0004, 0x1148, 0x080c, 0x2fda, 0x080c, 0xc227, 0x00c6, -+ 0x080c, 0x9e62, 0x00ce, 0x0060, 0x080c, 0xbf06, 0x0148, 0x080c, -+ 0xbd1d, 0x1110, 0x080c, 0xa7c0, 0x00c6, 0x080c, 0x9e32, 0x00ce, -+ 0x9ce0, 0x0018, 0x7064, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, -+ 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, -+ 0x1000, 0x210c, 0x81ff, 0x0128, 0x2061, 0x1a80, 0x6112, 0x080c, -+ 0x2fda, 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, -+ 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9ddc, 0x01b0, -+ 0x6656, 0x2b00, 0x6012, 0x080c, 0x538e, 0x0118, 0x080c, 0xbc44, -+ 0x0168, 0x080c, 0xbf8c, 0x6023, 0x0003, 0x2009, 0x004b, 0x080c, -+ 0x9eac, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, -+ 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0x9e7f, 0x0560, -+ 0x6057, 0x0000, 0x2b00, 0x6012, 0x080c, 0xbf8c, 0x6023, 0x0003, -+ 0x0016, 0x080c, 0x8571, 0x0076, 0x903e, 0x080c, 0x8469, 0x2c08, -+ 0x080c, 0xd29b, 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0x9e32, -+ 0x9085, 0x0001, 0x0070, 0x080c, 0x538e, 0x0128, 0xd18c, 0x1170, -+ 0x080c, 0xbc44, 0x0148, 0x2009, 0x004c, 0x080c, 0x9eac, 0x9085, -+ 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, -+ 0x0c90, 0x2009, 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, -+ 0x0046, 0x0016, 0x080c, 0x9ddc, 0x2c78, 0x0590, 0x7e56, 0x2b00, -+ 0x7812, 0x7823, 0x0003, 0x2021, 0x0005, 0x080c, 0xbc56, 0x9186, -+ 0x004d, 0x0118, 0x9186, 0x004e, 0x0148, 0x2001, 0x1951, 0x200c, -+ 0xd1fc, 0x0168, 0x2f60, 0x080c, 0x9e32, 0x00d0, 0x2001, 0x1950, -+ 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9e32, 0x0088, 0x2f60, -+ 0x080c, 0x538e, 0x0138, 0xd18c, 0x1118, 0x04f1, 0x0148, 0x0010, -+ 0x2900, 0x7816, 0x001e, 0x0016, 0x080c, 0x9eac, 0x9085, 0x0001, -+ 0x001e, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, -+ 0x080c, 0x9ddc, 0x2c78, 0x0508, 0x7e56, 0x2b00, 0x7812, 0x7823, -+ 0x0003, 0x0096, 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, 0x194f, -+ 0x200c, 0xd1fc, 0x0120, 0x2f60, 0x080c, 0x9e32, 0x0060, 0x2f60, -+ 0x080c, 0x538e, 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, -+ 0x0052, 0x080c, 0x9eac, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, -+ 0x0005, 0x2900, 0x7816, 0x0c98, 0x00c6, 0x080c, 0x4879, 0x00ce, -+ 0x1120, 0x080c, 0x9e32, 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, -+ 0x8000, 0x2900, 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x6372, 0x0158, 0x2001, 0xbc5b, -+ 0x0006, 0x900e, 0x2400, 0x080c, 0x6ac6, 0x080c, 0x688c, 0x000e, -+ 0x0807, 0x2418, 0x080c, 0x8808, 0xbaa0, 0x0086, 0x2041, 0x0001, -+ 0x2039, 0x0001, 0x2608, 0x080c, 0x8589, 0x008e, 0x080c, 0x8469, -+ 0x2f08, 0x2648, 0x080c, 0xd29b, 0xb93c, 0x81ff, 0x090c, 0x865a, -+ 0x080c, 0x8973, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x9ddc, 0x0190, 0x660a, 0x2b08, 0x6112, -+ 0x080c, 0xbf8c, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, -+ 0x080c, 0x9eac, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, -+ 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e7f, 0x01b8, -+ 0x660a, 0x2b08, 0x6112, 0x080c, 0xbf8c, 0x6023, 0x0008, 0x2900, -+ 0x6016, 0x00f6, 0x2c78, 0x080c, 0x1648, 0x00fe, 0x2009, 0x0021, -+ 0x080c, 0x9eac, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, -+ 0x0cd8, 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, -+ 0x080c, 0x9ddc, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbf8c, -+ 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0x9eac, -+ 0x9085, 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, -+ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e7f, 0x0188, 0x2b08, -+ 0x6112, 0x080c, 0xbf8c, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, -+ 0x0000, 0x080c, 0x9eac, 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, 0x6020, -+ 0x9086, 0x0004, 0x0190, 0x6014, 0x904d, 0x080c, 0xbb17, 0x0168, -+ 0xa864, 0x9086, 0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, -+ 0xa868, 0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, -+ 0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9e7f, -+ 0x0198, 0x2b08, 0x6112, 0x080c, 0xbf8c, 0x6023, 0x0001, 0x2900, -+ 0x6016, 0x080c, 0x2fda, 0x2009, 0x0028, 0x080c, 0x9eac, 0x9085, -+ 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, -+ 0x11a8, 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, -+ 0x080c, 0xaa49, 0x00be, 0x080c, 0xac88, 0x6003, 0x0001, 0x6007, -+ 0x0029, 0x080c, 0x8439, 0x080c, 0x8973, 0x0078, 0x6014, 0x0096, -+ 0x2048, 0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, -+ 0xc14b, 0x080c, 0xa7c0, 0x080c, 0x9e32, 0x0005, 0x0096, 0x6014, -+ 0x904d, 0x090c, 0x0db4, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, -+ 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x688c, 0x012e, 0x009e, 0x080c, 0x9e32, 0x0c30, 0x0096, -+ 0x9186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x618f, 0x00e8, -+ 0x9186, 0x0015, 0x1510, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, -+ 0x11e0, 0x6010, 0x00b6, 0x2058, 0x080c, 0x62d9, 0x00be, 0x080c, -+ 0xad59, 0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, -+ 0x0160, 0x2001, 0x0006, 0x080c, 0x618f, 0x6014, 0x2048, 0xa868, -+ 0xd0fc, 0x0170, 0x080c, 0xa235, 0x0048, 0x6014, 0x2048, 0xa868, -+ 0xd0fc, 0x0528, 0x080c, 0xa7c0, 0x080c, 0x9e32, 0x009e, 0x0005, -+ 0x6014, 0x6310, 0x2358, 0x904d, 0x090c, 0x0db4, 0xa87b, 0x0000, -+ 0xa883, 0x0000, 0xa897, 0x4000, 0x900e, 0x080c, 0x645e, 0x1108, -+ 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x688c, 0x012e, 0x080c, 0x9e32, 0x08f8, 0x6014, -+ 0x904d, 0x090c, 0x0db4, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, -+ 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x688c, 0x012e, 0x080c, 0x9e32, 0x0840, 0xa878, 0x9086, -+ 0x0005, 0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, -+ 0x6043, 0x0000, 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, -+ 0x080c, 0x83f1, 0x080c, 0x8973, 0x0005, 0x00c6, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, -+ 0x0013, 0x00ce, 0x0005, 0xb832, 0xbe3c, 0xbe3c, 0xbe3f, 0xd579, -+ 0xd594, 0xd597, 0xb832, 0xb832, 0xb832, 0xb832, 0xb832, 0xb832, -+ 0xb832, 0xb832, 0x080c, 0x0db4, 0xa001, 0xa001, 0x0005, 0x0096, -+ 0x6014, 0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, -+ 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, -+ 0x0550, 0x2001, 0x1833, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, -+ 0x080c, 0x9ddc, 0x0508, 0x7810, 0x6012, 0x080c, 0xbf8c, 0x7820, -+ 0x9086, 0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, -+ 0x7808, 0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, -+ 0x0035, 0x6003, 0x0001, 0x7954, 0x6156, 0x080c, 0x83f1, 0x080c, -+ 0x8973, 0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1959, -+ 0x2004, 0x6042, 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, -+ 0xd0e4, 0x0180, 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, -+ 0xa88f, 0x0000, 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, -+ 0x080c, 0x0f9d, 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, -+ 0x0002, 0x9086, 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, -+ 0x681c, 0xc085, 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, -+ 0x0c00, 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, -+ 0x693c, 0x9103, 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, -+ 0x683a, 0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, -+ 0x6954, 0x6156, 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, -+ 0x080c, 0x83f1, 0x080c, 0x8973, 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, 0x1953, 0x200c, 0x8000, 0x2014, -+ 0x2001, 0x0032, 0x080c, 0x8270, 0x2001, 0x1957, 0x82ff, 0x1110, -+ 0x2011, 0x0014, 0x2202, 0x2001, 0x1955, 0x200c, 0x8000, 0x2014, -+ 0x2071, 0x193d, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x8270, -+ 0x2001, 0x1958, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, -+ 0x1959, 0x9288, 0x000a, 0x2102, 0x2001, 0x1a61, 0x2102, 0x2001, -+ 0x0032, 0x080c, 0x1518, 0x080c, 0x6543, 0x00ee, 0x003e, 0x002e, -+ 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1957, -+ 0x2003, 0x0028, 0x2001, 0x1958, 0x2003, 0x0014, 0x2071, 0x193d, -+ 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, 0x1959, 0x2009, 0x001e, -+ 0x2102, 0x2001, 0x1a61, 0x2102, 0x2001, 0x0032, 0x080c, 0x1518, -+ 0x00ee, 0x001e, 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, -+ 0x080c, 0x101d, 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x9ddc, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, -+ 0x0001, 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, 0x9eac, 0x9085, -+ 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, -+ 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1500, 0x708c, 0x9086, -+ 0x0018, 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, -+ 0x080c, 0x8b63, 0x01d8, 0x7078, 0xaa50, 0x9206, 0x1160, 0x707c, -+ 0xaa54, 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, -+ 0x900e, 0x080c, 0x3023, 0x080c, 0xa235, 0x0020, 0x080c, 0xa7c0, -+ 0x080c, 0x9e32, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa54, -+ 0x9206, 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x9ddc, 0x0188, 0x2b08, 0x6112, 0x080c, 0xbf8c, 0x6023, 0x0001, -+ 0x2900, 0x6016, 0x2009, 0x004d, 0x080c, 0x9eac, 0x9085, 0x0001, -+ 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, -+ 0x8000, 0x0016, 0x080c, 0x9ddc, 0x0180, 0x2b08, 0x6112, 0x080c, -+ 0xbf8c, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0x9eac, -+ 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, -+ 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, -+ 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1568, 0x718c, 0x6014, -+ 0x2048, 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, -+ 0x1971, 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, -+ 0x8006, 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, -+ 0x001b, 0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x080c, 0xc7ce, -+ 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, -+ 0xa867, 0x0103, 0x0010, 0x080c, 0xa7c0, 0x080c, 0x9e32, 0x00fe, -+ 0x00ee, 0x009e, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, -+ 0x0005, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, -+ 0x11b8, 0x708c, 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, -+ 0x080c, 0x8b63, 0x01a8, 0x7078, 0xaa74, 0x9206, 0x1130, 0x707c, -+ 0xaa78, 0x9206, 0x1110, 0x080c, 0x2fda, 0x080c, 0xa235, 0x0020, -+ 0x080c, 0xa7c0, 0x080c, 0x9e32, 0x00fe, 0x00ee, 0x009e, 0x0005, -+ 0x705c, 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, -+ 0x2071, 0x1800, 0x9186, 0x0015, 0x1550, 0x708c, 0x9086, 0x0004, -+ 0x1530, 0x6014, 0x2048, 0x2c78, 0x080c, 0x8b63, 0x05f0, 0x7078, -+ 0xaacc, 0x9206, 0x1180, 0x707c, 0xaad0, 0x9206, 0x1160, 0x080c, -+ 0x2fda, 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, -+ 0x533e, 0x001e, 0x0010, 0x080c, 0x512f, 0x080c, 0xbb17, 0x0508, -+ 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0080, 0x080c, -+ 0xbb17, 0x01b8, 0x6014, 0x2048, 0x080c, 0x512f, 0x1d70, 0xa87b, -+ 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, -+ 0x2091, 0x8000, 0xa867, 0x0139, 0x080c, 0x688c, 0x012e, 0x080c, -+ 0x9e32, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaad0, 0x9206, -+ 0x0930, 0x0888, 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, 0x080c, 0xbb17, 0x0904, 0xc147, -+ 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, -+ 0x6310, 0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, -+ 0x080c, 0x645e, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0xaa96, 0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x0031, 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, -+ 0x080c, 0x0f68, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, -+ 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f68, 0x00ce, 0x0090, -+ 0xaa96, 0x3918, 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, -+ 0x0110, 0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, -+ 0x00ff, 0xa89e, 0x080c, 0x687f, 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, 0x2663, -+ 0x2118, 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, -+ 0x7c3c, 0x2011, 0x8018, 0x080c, 0x48d9, 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, 0xbb05, 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, 0xb227, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, -+ 0x0036, 0x901e, 0x0499, 0x01e0, 0x080c, 0xbb17, 0x01c8, 0x080c, -+ 0xbd00, 0x6037, 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, -+ 0xa87c, 0x080c, 0xbd1d, 0x1118, 0x080c, 0xa7c0, 0x0040, 0xa867, -+ 0x0103, 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x688c, 0x009e, -+ 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, -+ 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, -+ 0x0005, 0x080c, 0xbe0c, 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, -+ 0x2004, 0xd0ec, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, -+ 0x000e, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, -+ 0x0005, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, -+ 0x2021, 0x0007, 0x080c, 0x4a76, 0x004e, 0x003e, 0x0005, 0x0c51, -+ 0x1d81, 0x0005, 0x2001, 0x1957, 0x2004, 0x601a, 0x0005, 0x2001, -+ 0x1959, 0x2004, 0x6042, 0x0005, 0x080c, 0x9e32, 0x0804, 0x8973, -+ 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0db4, 0x001b, -+ 0x006e, 0x00be, 0x0005, 0xc253, 0xc92b, 0xca86, 0xc253, 0xc253, -+ 0xc253, 0xc253, 0xc253, 0xc28a, 0xcb08, 0xc253, 0xc253, 0xc253, -+ 0xc253, 0xc253, 0xc253, 0x080c, 0x0db4, 0x0066, 0x6000, 0x90b2, -+ 0x0016, 0x1a0c, 0x0db4, 0x0013, 0x006e, 0x0005, 0xc26e, 0xd070, -+ 0xc26e, 0xc26e, 0xc26e, 0xc26e, 0xc26e, 0xc26e, 0xd01d, 0xd0c4, -+ 0xc26e, 0xd6b4, 0xd6ea, 0xd6b4, 0xd6ea, 0xc26e, 0x080c, 0x0db4, -+ 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0db4, 0x6000, 0x000a, 0x0005, -+ 0xc288, 0xcce5, 0xcdd5, 0xcdf7, 0xceb6, 0xc288, 0xcf94, 0xcf3e, -+ 0xcb14, 0xcff3, 0xd008, 0xc288, 0xc288, 0xc288, 0xc288, 0xc288, -+ 0x080c, 0x0db4, 0x91b2, 0x0053, 0x1a0c, 0x0db4, 0x2100, 0x91b2, -+ 0x0040, 0x1a04, 0xc6cc, 0x0002, 0xc2d4, 0xc4bd, 0xc2d4, 0xc2d4, -+ 0xc2d4, 0xc4c6, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, -+ 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, -+ 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d6, 0xc339, 0xc348, 0xc3ac, 0xc3d7, -+ 0xc44f, 0xc4a8, 0xc2d4, 0xc2d4, 0xc4c9, 0xc2d4, 0xc2d4, 0xc4de, -+ 0xc4eb, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc2d4, 0xc56e, 0xc2d4, -+ 0xc2d4, 0xc582, 0xc2d4, 0xc2d4, 0xc53d, 0xc2d4, 0xc2d4, 0xc2d4, -+ 0xc59a, 0xc2d4, 0xc2d4, 0xc2d4, 0xc617, 0xc2d4, 0xc2d4, 0xc2d4, -+ 0xc2d4, 0xc2d4, 0xc2d4, 0xc694, 0x080c, 0x0db4, 0x080c, 0x6520, -+ 0x1150, 0x2001, 0x1836, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, -+ 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, -+ 0x0000, 0x0804, 0xc4b6, 0x080c, 0x6509, 0x00e6, 0x00c6, 0x0036, -+ 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, -+ 0x080c, 0x8571, 0x0076, 0x903e, 0x080c, 0x8469, 0x2c08, 0x080c, -+ 0xd29b, 0x007e, 0x001e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, -+ 0x6610, 0x2658, 0x080c, 0x624d, 0xbe04, 0x9684, 0x00ff, 0x9082, -+ 0x0006, 0x1268, 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, 0xbaa0, -+ 0x00be, 0x2c08, 0x080c, 0xd862, 0x002e, 0x001e, 0x1178, 0x080c, -+ 0xd1ce, 0x1904, 0xc3a4, 0x080c, 0xd16a, 0x1120, 0x6007, 0x0008, -+ 0x0804, 0xc4b6, 0x6007, 0x0009, 0x0804, 0xc4b6, 0x080c, 0xd3c5, -+ 0x0128, 0x080c, 0xd1ce, 0x0d78, 0x0804, 0xc3a4, 0x6017, 0x1900, -+ 0x0c88, 0x080c, 0x30fd, 0x1904, 0xc6c9, 0x6106, 0x080c, 0xd11f, -+ 0x6007, 0x0006, 0x0804, 0xc4b6, 0x6007, 0x0007, 0x0804, 0xc4b6, -+ 0x080c, 0xd726, 0x1904, 0xc6c9, 0x080c, 0x30fd, 0x1904, 0xc6c9, -+ 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, -+ 0x1220, 0x2001, 0x0001, 0x080c, 0x617b, 0x96b4, 0xff00, 0x8637, -+ 0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, -+ 0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, -+ 0x0005, 0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, -+ 0x9084, 0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, -+ 0x9084, 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, -+ 0x00b0, 0x00ee, 0x080c, 0xd231, 0x1190, 0x9686, 0x0006, 0x1140, -+ 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x3023, 0x002e, -+ 0x080c, 0x62d9, 0x6007, 0x000a, 0x00de, 0x0804, 0xc4b6, 0x6007, -+ 0x000b, 0x00de, 0x0804, 0xc4b6, 0x080c, 0x2fda, 0x080c, 0xc227, -+ 0x6007, 0x0001, 0x0804, 0xc4b6, 0x080c, 0xd726, 0x1904, 0xc6c9, -+ 0x080c, 0x30fd, 0x1904, 0xc6c9, 0x2071, 0x0260, 0x7034, 0x90b4, -+ 0x0003, 0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, -+ 0x1910, 0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, -+ 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x3023, 0x002e, 0x6007, -+ 0x000c, 0x2001, 0x0001, 0x080c, 0xd842, 0x0804, 0xc4b6, 0x080c, -+ 0x6520, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, -+ 0x0008, 0x1110, 0x0804, 0xc2e3, 0x080c, 0x6509, 0x6610, 0x2658, -+ 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c0, 0x1138, 0x0026, -+ 0x2001, 0x0006, 0x080c, 0x61bb, 0x002e, 0x0050, 0x96b4, 0xff00, -+ 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc3a4, -+ 0x080c, 0xd23e, 0x1120, 0x6007, 0x000e, 0x0804, 0xc4b6, 0x0046, -+ 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x2fda, 0x080c, 0xc227, -+ 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048, 0x2009, -+ 0x0029, 0x080c, 0xd52a, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, -+ 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xc4b6, 0x2001, 0x0001, -+ 0x080c, 0x617b, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, -+ 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xadf9, 0x003e, 0x002e, -+ 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, -+ 0x0004, 0x0a04, 0xc3a4, 0x9682, 0x0007, 0x0a04, 0xc400, 0x0804, -+ 0xc3a4, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc4b6, 0x080c, -+ 0x6520, 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, -+ 0x0008, 0x1110, 0x0804, 0xc2e3, 0x080c, 0x6509, 0x6610, 0x2658, -+ 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0690, 0x0150, 0x96b4, -+ 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, -+ 0xc3a4, 0x080c, 0xd26c, 0x1130, 0x080c, 0xd16a, 0x1118, 0x6007, -+ 0x0010, 0x04e0, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, -+ 0x2fda, 0x080c, 0xc227, 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, -+ 0x210c, 0x0048, 0x2009, 0x0029, 0x080c, 0xd52a, 0x6010, 0x2058, -+ 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, -+ 0x080c, 0xd3c5, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, -+ 0x0980, 0x0804, 0xc3a4, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, -+ 0x080c, 0x30fd, 0x1904, 0xc6c9, 0x080c, 0xd726, 0x1904, 0xc6c9, -+ 0x080c, 0xc869, 0x1904, 0xc3a4, 0x6007, 0x0012, 0x6003, 0x0001, -+ 0x080c, 0x8439, 0x080c, 0x8973, 0x0005, 0x6007, 0x0001, 0x6003, -+ 0x0001, 0x080c, 0x8439, 0x080c, 0x8973, 0x0cb0, 0x6007, 0x0005, -+ 0x0c68, 0x080c, 0xd726, 0x1904, 0xc6c9, 0x080c, 0x30fd, 0x1904, -+ 0xc6c9, 0x080c, 0xc869, 0x1904, 0xc3a4, 0x6007, 0x0020, 0x6003, -+ 0x0001, 0x080c, 0x8439, 0x080c, 0x8973, 0x0005, 0x080c, 0x30fd, -+ 0x1904, 0xc6c9, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x8439, -+ 0x080c, 0x8973, 0x0005, 0x080c, 0xd726, 0x1904, 0xc6c9, 0x080c, -+ 0x30fd, 0x1904, 0xc6c9, 0x080c, 0xc869, 0x1904, 0xc3a4, 0x0016, -+ 0x0026, 0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, -+ 0x2c08, 0x080c, 0xbb05, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, -+ 0x1188, 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, -+ 0x7240, 0x2c08, 0x9006, 0x080c, 0xd4fc, 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, 0x9e32, -+ 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x8439, 0x080c, -+ 0x8973, 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, -+ 0x617b, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, -+ 0x1805, 0x2011, 0x0276, 0x080c, 0xadf9, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xc4b6, 0x080c, 0xaa61, -+ 0x080c, 0x6fb2, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x6fcc, -+ 0x1138, 0x080c, 0x7296, 0x080c, 0x5cd1, 0x080c, 0x6ee4, 0x0010, -+ 0x080c, 0x6f8a, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x30fd, -+ 0x1904, 0xc6c9, 0x080c, 0xc869, 0x1904, 0xc3a4, 0x6106, 0x080c, -+ 0xc885, 0x1120, 0x6007, 0x002b, 0x0804, 0xc4b6, 0x6007, 0x002c, -+ 0x0804, 0xc4b6, 0x080c, 0xd726, 0x1904, 0xc6c9, 0x080c, 0x30fd, -+ 0x1904, 0xc6c9, 0x080c, 0xc869, 0x1904, 0xc3a4, 0x6106, 0x080c, -+ 0xc88a, 0x1120, 0x6007, 0x002e, 0x0804, 0xc4b6, 0x6007, 0x002f, -+ 0x0804, 0xc4b6, 0x080c, 0x30fd, 0x1904, 0xc6c9, 0x00e6, 0x00d6, -+ 0x00c6, 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, -+ 0x0158, 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, -+ 0x00de, 0x00ee, 0x0804, 0xc4bd, 0x080c, 0x538a, 0xd0e4, 0x0904, -+ 0xc614, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, -+ 0x720c, 0x080c, 0x655e, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, -+ 0x1118, 0xb814, 0x9206, 0x0510, 0x080c, 0x655a, 0x15b8, 0x2069, -+ 0x1800, 0x687c, 0x9206, 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, -+ 0x080c, 0xbb05, 0x0590, 0x080c, 0xc754, 0x0578, 0x080c, 0xd5a6, -+ 0x0560, 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x83f1, -+ 0x080c, 0x8973, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, -+ 0xffff, 0x0150, 0x080c, 0xbb05, 0x01c0, 0x9280, 0x0002, 0x2004, -+ 0x7110, 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, -+ 0x080c, 0xd4fc, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, -+ 0x602f, 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, -+ 0x0003, 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, -+ 0x30fd, 0x1904, 0xc6c9, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, -+ 0x8007, 0x9086, 0x0006, 0x1904, 0xc4bd, 0x00e6, 0x00d6, 0x00c6, -+ 0x080c, 0x538a, 0xd0e4, 0x0904, 0xc68c, 0x2069, 0x1800, 0x2071, -+ 0x026c, 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, -+ 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd4fc, 0x2c10, -+ 0x00ce, 0x05e8, 0x080c, 0xbb05, 0x05d0, 0x7108, 0x9280, 0x0002, -+ 0x2004, 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xb73d, -+ 0x002e, 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, -+ 0x0178, 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, -+ 0x0005, 0x2004, 0x9005, 0x0170, 0x080c, 0xc754, 0x0904, 0xc60d, -+ 0x0056, 0x7510, 0x7614, 0x080c, 0xd5bf, 0x005e, 0x00ce, 0x00de, -+ 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, -+ 0x6003, 0x0001, 0x080c, 0x83f1, 0x080c, 0x8973, 0x0c78, 0x6007, -+ 0x003b, 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, -+ 0x6017, 0x0000, 0x0804, 0xc5e4, 0x00e6, 0x0026, 0x080c, 0x6520, -+ 0x0550, 0x080c, 0x6509, 0x080c, 0xd798, 0x1518, 0x2071, 0x1800, -+ 0x70d8, 0x9085, 0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72ac, -+ 0x9284, 0x00ff, 0x707a, 0x78e6, 0x9284, 0xff00, 0x727c, 0x9205, -+ 0x707e, 0x78ea, 0x00fe, 0x70e3, 0x0000, 0x080c, 0x655e, 0x0120, -+ 0x2011, 0x19d1, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2dbb, -+ 0x0010, 0x080c, 0xd7ca, 0x002e, 0x00ee, 0x080c, 0x9e32, 0x0804, -+ 0xc4bc, 0x080c, 0x9e32, 0x0005, 0x2600, 0x0002, 0xc6e0, 0xc6e0, -+ 0xc6e0, 0xc6e0, 0xc6e0, 0xc6e2, 0xc6e0, 0xc6e0, 0xc6e0, 0xc6e0, -+ 0xc6ff, 0xc6e0, 0xc6e0, 0xc6e0, 0xc711, 0xc71e, 0xc74f, 0xc6e0, -+ 0x080c, 0x0db4, 0x080c, 0xd726, 0x1d20, 0x080c, 0x30fd, 0x1d08, -+ 0x080c, 0xc869, 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, -+ 0x0001, 0x080c, 0x8439, 0x0005, 0x080c, 0x2fda, 0x080c, 0xc227, -+ 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x8439, 0x0005, 0x080c, -+ 0xd726, 0x1938, 0x080c, 0x30fd, 0x1920, 0x080c, 0xc869, 0x1d60, -+ 0x703c, 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x8439, -+ 0x0005, 0x080c, 0xc771, 0x0904, 0xc6c9, 0x6007, 0x004e, 0x6003, -+ 0x0001, 0x080c, 0x8439, 0x080c, 0x8973, 0x0005, 0x6007, 0x004f, -+ 0x6017, 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, -+ 0x0001, 0x1160, 0x7140, 0x2001, 0x198e, 0x2004, 0x9106, 0x11b0, -+ 0x7144, 0x2001, 0x198f, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, -+ 0x1168, 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, -+ 0x2019, 0x000a, 0x080c, 0xae0d, 0x009e, 0x0110, 0x6017, 0x0001, -+ 0x6003, 0x0001, 0x080c, 0x8439, 0x080c, 0x8973, 0x0005, 0x6007, -+ 0x0050, 0x703c, 0x6016, 0x0ca0, 0x0016, 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, 0x001e, -+ 0x0005, 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, -+ 0x2091, 0x8000, 0x2071, 0x1800, 0x708c, 0x908a, 0x00f9, 0x16e8, -+ 0x20e1, 0x0000, 0x2001, 0x1971, 0x2003, 0x0000, 0x080c, 0x1004, -+ 0x05a0, 0x2900, 0x6016, 0x708c, 0x8004, 0xa816, 0x908a, 0x001e, -+ 0x02d0, 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, -+ 0x9080, 0x001b, 0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x0471, -+ 0x001e, 0x2940, 0x080c, 0x1004, 0x01c0, 0x2900, 0xa006, 0x2100, -+ 0x81ff, 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, -+ 0x9080, 0x001b, 0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x00b1, -+ 0x001e, 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, 0x1800, 0x708f, -+ 0x0000, 0x6014, 0x2048, 0x080c, 0x0f9d, 0x9006, 0x012e, 0x01de, -+ 0x01ce, 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, -+ 0x0026, 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, 0x080c, 0x2241, -+ 0x2099, 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, -+ 0x4003, 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x2241, -+ 0x2099, 0x0260, 0x0ca8, 0x080c, 0x2241, 0x2061, 0x1971, 0x6004, -+ 0x2098, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, -+ 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x2241, 0x2099, 0x0260, -+ 0x0ca8, 0x2061, 0x1971, 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, 0x2259, 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, -+ 0x9312, 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, -+ 0x01f8, 0x22a8, 0x8108, 0x080c, 0x2259, 0x20a1, 0x0240, 0x0c98, -+ 0x080c, 0x2259, 0x2061, 0x1974, 0x6004, 0x20a0, 0x6008, 0x3518, -+ 0x9312, 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, -+ 0x0138, 0x22a8, 0x8108, 0x080c, 0x2259, 0x20a1, 0x0240, 0x0c98, -+ 0x2061, 0x1974, 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, 0x080c, 0xc901, -+ 0x00de, 0x0005, 0x00d6, 0x080c, 0xc90e, 0x1520, 0x680c, 0x908c, -+ 0xff00, 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, -+ 0xd1e4, 0x0130, 0x9006, 0x080c, 0xd842, 0x2009, 0x0001, 0x0078, -+ 0xd1ec, 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824, 0x080c, 0x2663, -+ 0x1148, 0x2001, 0x0001, 0x080c, 0xd842, 0x2110, 0x900e, 0x080c, -+ 0x3023, 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, -+ 0x00b6, 0x00c6, 0x080c, 0x9e7f, 0x05a8, 0x0016, 0x0026, 0x00c6, -+ 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2663, 0x1578, -+ 0x080c, 0x61de, 0x1560, 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, -+ 0x2b00, 0x6012, 0x080c, 0xd726, 0x11d8, 0x080c, 0x30fd, 0x11c0, -+ 0x080c, 0xc869, 0x0510, 0x2001, 0x0007, 0x080c, 0x618f, 0x2001, -+ 0x0007, 0x080c, 0x61bb, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, -+ 0x0001, 0x6003, 0x0001, 0x080c, 0x8439, 0x080c, 0x8973, 0x0010, -+ 0x080c, 0x9e32, 0x9085, 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, -+ 0x9e32, 0x00ce, 0x002e, 0x001e, 0x0ca8, 0x080c, 0x9e32, 0x9006, -+ 0x0c98, 0x2069, 0x026d, 0x6800, 0x9082, 0x0010, 0x1228, 0x6017, -+ 0x0000, 0x9085, 0x0001, 0x0008, 0x9006, 0x0005, 0x6017, 0x0000, -+ 0x2069, 0x026c, 0x6808, 0x9084, 0xff00, 0x9086, 0x0800, 0x1190, -+ 0x6904, 0x9186, 0x0018, 0x0118, 0x9186, 0x0014, 0x1158, 0x810f, -+ 0x6800, 0x9084, 0x00ff, 0x910d, 0x615a, 0x908e, 0x0014, 0x0110, -+ 0x908e, 0x0010, 0x0005, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0db4, -+ 0x91b6, 0x0013, 0x1130, 0x2008, 0x91b2, 0x0040, 0x1a04, 0xca56, -+ 0x0092, 0x91b6, 0x0027, 0x0120, 0x91b6, 0x0014, 0x190c, 0x0db4, -+ 0x2001, 0x0007, 0x080c, 0x61bb, 0x080c, 0x886e, 0x080c, 0x9e62, -+ 0x080c, 0x8973, 0x0005, 0xc98b, 0xc98d, 0xc98b, 0xc98b, 0xc98b, -+ 0xc98d, 0xc99c, 0xca4f, 0xc9ee, 0xca4f, 0xca00, 0xca4f, 0xc99c, -+ 0xca4f, 0xca47, 0xca4f, 0xca47, 0xca4f, 0xca4f, 0xc98b, 0xc98b, -+ 0xc98b, 0xc98b, 0xc98b, 0xc98b, 0xc98b, 0xc98b, 0xc98b, 0xc98b, -+ 0xc98b, 0xc98d, 0xc98b, 0xca4f, 0xc98b, 0xc98b, 0xca4f, 0xc98b, -+ 0xca4c, 0xca4f, 0xc98b, 0xc98b, 0xc98b, 0xc98b, 0xca4f, 0xca4f, -+ 0xc98b, 0xca4f, 0xca4f, 0xc98b, 0xc997, 0xc98b, 0xc98b, 0xc98b, -+ 0xc98b, 0xca4b, 0xca4f, 0xc98b, 0xc98b, 0xca4f, 0xca4f, 0xc98b, -+ 0xc98b, 0xc98b, 0xc98b, 0x080c, 0x0db4, 0x080c, 0x886e, 0x080c, -+ 0xc22a, 0x6003, 0x0002, 0x080c, 0x8973, 0x0804, 0xca55, 0x9006, -+ 0x080c, 0x617b, 0x0804, 0xca4f, 0x080c, 0x655a, 0x1904, 0xca4f, -+ 0x9006, 0x080c, 0x617b, 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, -+ 0x1140, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, -+ 0x0428, 0x6010, 0x2058, 0xb8b0, 0x9005, 0x1178, 0x080c, 0xc212, -+ 0x1904, 0xca4f, 0x0036, 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, -+ 0x4a76, 0x004e, 0x003e, 0x0804, 0xca4f, 0x080c, 0x312e, 0x1904, -+ 0xca4f, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, -+ 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, 0x00fe, 0x2001, 0x0002, -+ 0x080c, 0x618f, 0x080c, 0x886e, 0x6023, 0x0001, 0x6003, 0x0001, -+ 0x6007, 0x0002, 0x080c, 0x8439, 0x080c, 0x8973, 0x6110, 0x2158, -+ 0x2009, 0x0001, 0x080c, 0x8046, 0x0804, 0xca55, 0x6610, 0x2658, -+ 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0904, 0xca4f, -+ 0x9686, 0x0004, 0x0904, 0xca4f, 0x2001, 0x0004, 0x0804, 0xca4d, -+ 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, -+ 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4a76, 0x004e, -+ 0x003e, 0x2001, 0x0006, 0x080c, 0xca73, 0x6610, 0x2658, 0xbe04, -+ 0x0066, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, -+ 0x2001, 0x0006, 0x080c, 0x61bb, 0x9284, 0x00ff, 0x908e, 0x0007, -+ 0x1120, 0x2001, 0x0006, 0x080c, 0x618f, 0x080c, 0x655a, 0x11f8, -+ 0x2001, 0x1836, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, -+ 0x9686, 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, -+ 0x78a6, 0x00fe, 0x0804, 0xc9d6, 0x2001, 0x0004, 0x0030, 0x2001, -+ 0x0006, 0x0449, 0x0020, 0x0018, 0x0010, 0x080c, 0x61bb, 0x080c, -+ 0x886e, 0x080c, 0x9e32, 0x080c, 0x8973, 0x0005, 0x2600, 0x0002, -+ 0xca6a, 0xca6a, 0xca6a, 0xca6a, 0xca6a, 0xca6c, 0xca6a, 0xca6a, -+ 0xca6a, 0xca6a, 0xca6c, 0xca6a, 0xca6a, 0xca6a, 0xca6c, 0xca6c, -+ 0xca6c, 0xca6c, 0x080c, 0x0db4, 0x080c, 0x886e, 0x080c, 0x9e32, -+ 0x080c, 0x8973, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, -+ 0xb900, 0xd184, 0x0138, 0x080c, 0x618f, 0x9006, 0x080c, 0x617b, -+ 0x080c, 0x3003, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, -+ 0xb804, 0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0db4, -+ 0x91b6, 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, -+ 0x0db4, 0x006b, 0x0005, 0xa8a1, 0xa8a1, 0xa8a1, 0xa8a1, 0xa8a1, -+ 0xa8a1, 0xcaf2, 0xcab3, 0xa8a1, 0xa8a1, 0xa8a1, 0xa8a1, 0xa8a1, -+ 0xa8a1, 0xa8a1, 0xa8a1, 0xa8a1, 0xa8a1, 0xcaf2, 0xcaf9, 0xa8a1, -+ 0xa8a1, 0xa8a1, 0xa8a1, 0x00f6, 0x080c, 0x655a, 0x11d8, 0x080c, -+ 0xc212, 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb8b0, 0x9005, 0x0190, -+ 0x9006, 0x080c, 0x617b, 0x2001, 0x0002, 0x080c, 0x618f, 0x6023, -+ 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x8439, 0x080c, -+ 0x8973, 0x00f0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, -+ 0x2663, 0x11b0, 0x080c, 0x623e, 0x0118, 0x080c, 0x9e32, 0x0080, -+ 0xb810, 0x0006, 0xb814, 0x0006, 0xb8b0, 0x0006, 0x080c, 0x5ceb, -+ 0x000e, 0xb8b2, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0x9e32, -+ 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9e32, -+ 0x0005, 0x080c, 0xac85, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001, -+ 0x080c, 0x8439, 0x080c, 0x8973, 0x0010, 0x080c, 0x9e32, 0x0005, -+ 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0db4, 0x080c, 0x886e, 0x080c, -+ 0x9e62, 0x080c, 0x8973, 0x0005, 0x9182, 0x0040, 0x0002, 0xcb2a, -+ 0xcb2a, 0xcb2a, 0xcb2a, 0xcb2c, 0xcb2a, 0xcb2a, 0xcb2a, 0xcb2a, -+ 0xcb2a, 0xcb2a, 0xcb2a, 0xcb2a, 0xcb2a, 0xcb2a, 0xcb2a, 0xcb2a, -+ 0xcb2a, 0xcb2a, 0x080c, 0x0db4, 0x0096, 0x00b6, 0x00d6, 0x00e6, -+ 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11a8, -+ 0x6106, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xcb92, -+ 0x080c, 0xd836, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, -+ 0x2011, 0x0200, 0x080c, 0x822f, 0x0020, 0x9026, 0x080c, 0xd76b, -+ 0x0c38, 0x080c, 0x0feb, 0x090c, 0x0db4, 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, 0x688c, -+ 0x001e, 0x080c, 0xd836, 0x1904, 0xcbf2, 0x9486, 0x2000, 0x1130, -+ 0x2019, 0x0017, 0x080c, 0xd4a6, 0x0804, 0xcbf2, 0x9486, 0x0200, -+ 0x1120, 0x080c, 0xd442, 0x0804, 0xcbf2, 0x9486, 0x0400, 0x0120, -+ 0x9486, 0x1000, 0x1904, 0xcbf2, 0x2019, 0x0002, 0x080c, 0xd45d, -+ 0x0804, 0xcbf2, 0x2069, 0x1a41, 0x6a00, 0xd284, 0x0904, 0xcc5c, -+ 0x9284, 0x0300, 0x1904, 0xcc55, 0x6804, 0x9005, 0x0904, 0xcc3d, -+ 0x2d78, 0x6003, 0x0007, 0x080c, 0x1004, 0x0904, 0xcbfe, 0x7800, -+ 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, -+ 0x180f, 0x2004, 0xd084, 0x1904, 0xcc60, 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, 0xcbfa, 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, 0x688c, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, -+ 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810, -+ 0x2004, 0xd084, 0x0120, 0x080c, 0x0feb, 0x1904, 0xcba7, 0x6017, -+ 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x83f1, 0x080c, -+ 0x8973, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, -+ 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, -+ 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, -+ 0x080c, 0x83f1, 0x080c, 0x8973, 0x0828, 0x6868, 0x602e, 0x686c, -+ 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x0804, 0xcbf2, 0x2001, 0x180e, 0x2004, -+ 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d9, 0x6017, 0xf300, -+ 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x0804, 0xcbf2, 0x6017, 0xf500, 0x0c98, -+ 0x6017, 0xf600, 0x0804, 0xcc12, 0x6017, 0xf200, 0x0804, 0xcc12, -+ 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, -+ 0x7044, 0x9084, 0x0003, 0x9080, 0xcbfa, 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, 0x0db4, -+ 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, -+ 0x9080, 0x0029, 0x20a0, 0x2011, 0xccdc, 0x2041, 0x0001, 0x223d, -+ 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, -+ 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, -+ 0x2098, 0x0c68, 0x2950, 0x080c, 0x1004, 0x0170, 0x2900, 0xb002, -+ 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, -+ 0x080c, 0x101d, 0x0cc8, 0x080c, 0x101d, 0x0804, 0xcbfe, 0x2548, -+ 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, -+ 0x080c, 0xd4d5, 0x0804, 0xcbf2, 0x8010, 0x0004, 0x801a, 0x0006, -+ 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, -+ 0x6004, 0x908a, 0x0054, 0x1a0c, 0x0db4, 0x9082, 0x0040, 0x0a0c, -+ 0x0db4, 0x2008, 0x0804, 0xcd8d, 0x9186, 0x0051, 0x0108, 0x00c0, -+ 0x2001, 0x0109, 0x2004, 0xd084, 0x0904, 0xcd3e, 0x0126, 0x2091, -+ 0x2800, 0x0006, 0x0016, 0x0026, 0x080c, 0x82dd, 0x002e, 0x001e, -+ 0x000e, 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xcdd5, -+ 0x9186, 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, -+ 0x0500, 0x190c, 0x0db4, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, -+ 0x00c6, 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006, -+ 0x0016, 0x0026, 0x080c, 0x82dd, 0x002e, 0x001e, 0x000e, 0x00ce, -+ 0x012e, 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0db4, 0x0804, -+ 0xceb6, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0x9ec7, -+ 0x0005, 0xcd54, 0xcd56, 0xcd56, 0xcd7d, 0xcd54, 0xcd54, 0xcd54, -+ 0xcd54, 0xcd54, 0xcd54, 0xcd54, 0xcd54, 0xcd54, 0xcd54, 0xcd54, -+ 0xcd54, 0xcd54, 0xcd54, 0xcd54, 0x080c, 0x0db4, 0x080c, 0x886e, -+ 0x080c, 0x8973, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c, -+ 0xbb17, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xd4d5, 0x6017, -+ 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1958, 0x2004, 0x601a, -+ 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x886e, -+ 0x080c, 0x8973, 0x080c, 0xbb17, 0x0120, 0x6014, 0x2048, 0x080c, -+ 0x101d, 0x080c, 0x9e62, 0x009e, 0x0005, 0x0002, 0xcda1, 0xcdb8, -+ 0xcda3, 0xcdcf, 0xcda1, 0xcda1, 0xcda1, 0xcda1, 0xcda1, 0xcda1, -+ 0xcda1, 0xcda1, 0xcda1, 0xcda1, 0xcda1, 0xcda1, 0xcda1, 0xcda1, -+ 0xcda1, 0x080c, 0x0db4, 0x0096, 0x080c, 0x886e, 0x6014, 0x2048, -+ 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, -+ 0x9eac, 0x0010, 0x6003, 0x0004, 0x080c, 0x8973, 0x009e, 0x0005, -+ 0x080c, 0x886e, 0x080c, 0xbb17, 0x0138, 0x6114, 0x0096, 0x2148, -+ 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x8204, 0x080c, 0x9e32, -+ 0x080c, 0x8973, 0x0005, 0x080c, 0xd72f, 0x0db0, 0x0cc8, 0x080c, -+ 0x886e, 0x2009, 0x0041, 0x0804, 0xcf3e, 0x9182, 0x0040, 0x0002, -+ 0xcdeb, 0xcded, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdeb, -+ 0xcdeb, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdeb, 0xcdeb, -+ 0xcdeb, 0xcdee, 0xcdeb, 0x080c, 0x0db4, 0x0005, 0x00d6, 0x080c, -+ 0x8204, 0x00de, 0x080c, 0xd787, 0x080c, 0x9e32, 0x0005, 0x9182, -+ 0x0040, 0x0002, 0xce0d, 0xce0d, 0xce0d, 0xce0d, 0xce0d, 0xce0d, -+ 0xce0d, 0xce0d, 0xce0d, 0xce0f, 0xce7e, 0xce0d, 0xce0d, 0xce0d, -+ 0xce0d, 0xce7e, 0xce0d, 0xce0d, 0xce0d, 0x080c, 0x0db4, 0x2001, -+ 0x0105, 0x2004, 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, -+ 0x2001, 0x0131, 0x2004, 0x9105, 0x1904, 0xce7e, 0x2009, 0x180c, -+ 0x2104, 0xd0d4, 0x0904, 0xce7e, 0xc0d4, 0x200a, 0x2009, 0x0105, -+ 0x2104, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x1873, -+ 0x2004, 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x8923, 0x6014, -+ 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, -+ 0x0002, 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, -+ 0x8a4e, 0x2009, 0x0041, 0x009e, 0x0804, 0xcf3e, 0x080c, 0x8a4e, -+ 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x8204, 0x009e, 0x0005, -+ 0x2001, 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, -+ 0x2004, 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, -+ 0xd1cc, 0x0110, 0x080c, 0x2a77, 0x080c, 0x8a4e, 0x6014, 0x2048, -+ 0xa97c, 0xd1ec, 0x1130, 0x080c, 0x8204, 0x080c, 0x9e32, 0x009e, -+ 0x0005, 0x080c, 0xd72f, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, -+ 0x200c, 0xc1d4, 0x2102, 0x0036, 0x080c, 0x8923, 0x080c, 0x8a4e, -+ 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, 0xd4d5, 0x6018, -+ 0x9005, 0x1128, 0x2001, 0x1958, 0x2004, 0x8003, 0x601a, 0x6017, -+ 0x0000, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, -+ 0x0002, 0xcecd, 0xcecd, 0xcecd, 0xcecd, 0xcecd, 0xcecd, 0xcecd, -+ 0xcecd, 0xcecf, 0xcecd, 0xcecd, 0xcecd, 0xcecd, 0xcecd, 0xcecd, -+ 0xcecd, 0xcecd, 0xcecd, 0xcecd, 0xcf1a, 0x080c, 0x0db4, 0x6014, -+ 0x0096, 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, -+ 0x00be, 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, -+ 0x2009, 0x0041, 0x009e, 0x0804, 0xcf3e, 0x6003, 0x0007, 0x601b, -+ 0x0000, 0x080c, 0x8204, 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, -+ 0x180e, 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, -+ 0x0006, 0x00e9, 0x080c, 0x8206, 0x009e, 0x0005, 0x6003, 0x0002, -+ 0x009e, 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x150f, 0x1904, -+ 0xcecf, 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, -+ 0x9105, 0x1120, 0x080c, 0x150f, 0x1904, 0xcecf, 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, -+ 0x0db4, 0x6024, 0xd0dc, 0x090c, 0x0db4, 0x0005, 0xcf61, 0xcf6d, -+ 0xcf79, 0xcf85, 0xcf61, 0xcf61, 0xcf61, 0xcf61, 0xcf68, 0xcf63, -+ 0xcf63, 0xcf61, 0xcf61, 0xcf61, 0xcf61, 0xcf63, 0xcf61, 0xcf63, -+ 0xcf61, 0x080c, 0x0db4, 0x6024, 0xd0dc, 0x090c, 0x0db4, 0x0005, -+ 0x6014, 0x9005, 0x190c, 0x0db4, 0x0005, 0x6003, 0x0001, 0x6106, -+ 0x080c, 0x83f1, 0x0126, 0x2091, 0x8000, 0x080c, 0x8973, 0x012e, -+ 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, 0x83f1, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x8973, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, -+ 0x2c10, 0x080c, 0x1a5c, 0x0126, 0x2091, 0x8000, 0x080c, 0x8456, -+ 0x080c, 0x8a4e, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, -+ 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, -+ 0xcfb0, 0xcfb2, 0xcfc4, 0xcfde, 0xcfb0, 0xcfb0, 0xcfb0, 0xcfb0, -+ 0xcfb0, 0xcfb0, 0xcfb0, 0xcfb0, 0xcfb0, 0xcfb0, 0xcfb0, 0xcfb0, -+ 0x080c, 0x0db4, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x01f8, 0x909c, -+ 0x0003, 0x939e, 0x0003, 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc, -+ 0x0168, 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, 0x0001, -+ 0x6106, 0x080c, 0x83f1, 0x080c, 0x8973, 0x00e0, 0x901e, 0x6316, -+ 0x631a, 0x2019, 0x0004, 0x080c, 0xd4d5, 0x00a0, 0x6014, 0x2048, -+ 0xa87c, 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70, -+ 0x6003, 0x0003, 0x6106, 0x2c10, 0x080c, 0x1a5c, 0x080c, 0x8456, -+ 0x080c, 0x8a4e, 0x0005, 0x080c, 0x886e, 0x6114, 0x81ff, 0x0158, -+ 0x0096, 0x2148, 0x080c, 0xd7d3, 0x0036, 0x2019, 0x0029, 0x080c, -+ 0xd4d5, 0x003e, 0x009e, 0x080c, 0x9e62, 0x080c, 0x8973, 0x0005, -+ 0x080c, 0x8923, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, -+ 0xd7d3, 0x0036, 0x2019, 0x0029, 0x080c, 0xd4d5, 0x003e, 0x009e, -+ 0x080c, 0x9e62, 0x080c, 0x8a4e, 0x0005, 0x9182, 0x0085, 0x0002, -+ 0xd02f, 0xd02d, 0xd02d, 0xd03b, 0xd02d, 0xd02d, 0xd02d, 0xd02d, -+ 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0xd02d, 0x080c, 0x0db4, 0x6003, -+ 0x000b, 0x6106, 0x080c, 0x83f1, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x8973, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xd726, 0x0118, -+ 0x080c, 0x9e32, 0x0450, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, -+ 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, -+ 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0xa152, 0x7220, 0x080c, -+ 0xd37b, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, -+ 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, -+ 0x83f1, 0x080c, 0x8973, 0x080c, 0x8a4e, 0x00ee, 0x002e, 0x0005, -+ 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0db4, -+ 0x908a, 0x0092, 0x1a0c, 0x0db4, 0x9082, 0x0085, 0x00a2, 0x9186, -+ 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x9ec7, 0x0050, -+ 0x2001, 0x0007, 0x080c, 0x61bb, 0x080c, 0x886e, 0x080c, 0x9e62, -+ 0x080c, 0x8973, 0x0005, 0xd0a0, 0xd0a2, 0xd0a2, 0xd0a0, 0xd0a0, -+ 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, 0xd0a0, -+ 0x080c, 0x0db4, 0x080c, 0x886e, 0x080c, 0x9e62, 0x080c, 0x8973, -+ 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0db4, 0x9182, 0x0092, 0x1a0c, -+ 0x0db4, 0x9182, 0x0085, 0x0002, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c3, -+ 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c1, 0xd0c1, -+ 0xd0c1, 0x080c, 0x0db4, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, -+ 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0x9ec7, 0x0030, -+ 0x080c, 0x886e, 0x080c, 0x9e62, 0x080c, 0x8973, 0x0005, 0x0036, -+ 0x080c, 0xd787, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023, -+ 0x0006, 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, -+ 0x8000, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x97ba, 0x009e, -+ 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0x9865, 0x007e, 0x1520, -+ 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0, -+ 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xd787, 0x080c, 0xc22a, -+ 0x080c, 0x190d, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xbb17, -+ 0x0110, 0x080c, 0xd4d5, 0x009e, 0x6017, 0x0000, 0x080c, 0xd787, -+ 0x6023, 0x0007, 0x080c, 0xc22a, 0x003e, 0x012e, 0x0005, 0x00f6, -+ 0x00c6, 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, -+ 0x080c, 0x2663, 0x15c8, 0x0016, 0x00c6, 0x080c, 0x623e, 0x1590, -+ 0x001e, 0x00c6, 0x2160, 0x080c, 0xc227, 0x00ce, 0x002e, 0x0026, -+ 0x0016, 0x2019, 0x0029, 0x080c, 0x9926, 0x080c, 0x8571, 0x0076, -+ 0x903e, 0x080c, 0x8469, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c, -+ 0xd29b, 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, -+ 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x3097, -+ 0x002e, 0xbcb0, 0x001e, 0x080c, 0x5ceb, 0xbe12, 0xbd16, 0xbcb2, -+ 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, -+ 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1823, -+ 0x2104, 0x9086, 0x0074, 0x1904, 0xd1c3, 0x2069, 0x0260, 0x6944, -+ 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xd1c0, -+ 0x2001, 0x194d, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8b0, -+ 0x9005, 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, -+ 0x0648, 0x080c, 0xd83b, 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, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, -+ 0x8217, 0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, -+ 0x624d, 0x0804, 0xd22a, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, -+ 0x2b48, 0x2019, 0x000a, 0x080c, 0xae0d, 0x009e, 0x15a0, 0x2011, -+ 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, -+ 0xae0d, 0x009e, 0x1540, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, -+ 0x2009, 0x1854, 0x210c, 0x0038, 0x2009, 0x0029, 0x080c, 0xd52a, -+ 0xb800, 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x8571, 0x0076, -+ 0x2039, 0x0000, 0x080c, 0x8469, 0x2c08, 0x080c, 0xd29b, 0x007e, -+ 0x2001, 0x0007, 0x080c, 0x61bb, 0x2001, 0x0007, 0x080c, 0x618f, -+ 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, 0x2663, 0x11d0, 0x080c, 0x623e, 0x11b8, 0x2011, 0x0270, -+ 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xae0d, -+ 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, -+ 0x2019, 0x0006, 0x080c, 0xae0d, 0x009e, 0x015e, 0x003e, 0x002e, -+ 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, -+ 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, -+ 0x2663, 0x11d0, 0x080c, 0x623e, 0x11b8, 0x2011, 0x0276, 0x20a9, -+ 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xae0d, 0x009e, -+ 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, -+ 0x0006, 0x080c, 0xae0d, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, -+ 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, -+ 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, -+ 0x19c1, 0x252c, 0x2021, 0x19c7, 0x2424, 0x2061, 0x1cd0, 0x2071, -+ 0x1800, 0x7650, 0x7070, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1a80, -+ 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xd334, 0x0018, 0x9606, -+ 0x0904, 0xd334, 0x2100, 0x9c06, 0x0904, 0xd32b, 0x080c, 0xd56b, -+ 0x1904, 0xd32b, 0x080c, 0xd858, 0x0904, 0xd32b, 0x080c, 0xd55b, -+ 0x0904, 0xd32b, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, 0x312e, -+ 0x0904, 0xd34f, 0x6004, 0x9086, 0x0000, 0x1904, 0xd34f, 0x9786, -+ 0x0004, 0x0904, 0xd34f, 0x9786, 0x0007, 0x0904, 0xd32b, 0x2500, -+ 0x9c06, 0x0904, 0xd32b, 0x2400, 0x9c06, 0x05e8, 0x88ff, 0x0118, -+ 0x6054, 0x9906, 0x15c0, 0x0096, 0x6000, 0x9086, 0x0004, 0x1120, -+ 0x0016, 0x080c, 0x190d, 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, -+ 0xbd1d, 0x1130, 0x080c, 0xa7c0, 0x009e, 0x080c, 0x9e62, 0x0418, -+ 0x6014, 0x2048, 0x080c, 0xbb17, 0x01d8, 0x9786, 0x0003, 0x1570, -+ 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, -+ 0x080c, 0x0f9d, 0x009e, 0xab7a, 0xa877, 0x0000, 0x080c, 0xd7d3, -+ 0x0016, 0x080c, 0xbe06, 0x080c, 0x687f, 0x001e, 0x080c, 0xbd00, -+ 0x009e, 0x080c, 0x9e62, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, -+ 0x9c02, 0x1210, 0x0804, 0xd2af, 0x012e, 0x002e, 0x004e, 0x005e, -+ 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, -+ 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, 0xd7d3, 0x080c, 0xd4d5, -+ 0x08f8, 0x009e, 0x0c00, 0x9786, 0x000a, 0x0920, 0x0808, 0x81ff, -+ 0x09d0, 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0130, 0x9180, -+ 0x0001, 0x2004, 0x9086, 0x002d, 0x1970, 0x6000, 0x9086, 0x0002, -+ 0x1950, 0x080c, 0xbd0c, 0x0130, 0x080c, 0xbd1d, 0x1920, 0x080c, -+ 0xa7c0, 0x0038, 0x080c, 0x3003, 0x080c, 0xbd1d, 0x1110, 0x080c, -+ 0xa7c0, 0x080c, 0x9e62, 0x0804, 0xd32b, 0xa864, 0x9084, 0x00ff, -+ 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, -+ 0x9006, 0x080c, 0xd4fc, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, -+ 0x001b, 0x00ee, 0x00ce, 0x0005, 0xd39a, 0xd39a, 0xd39a, 0xd39a, -+ 0xd39a, 0xd39a, 0xd39c, 0xd39a, 0xd39a, 0xd39a, 0xd39a, 0x9e62, -+ 0x9e62, 0xd39a, 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, -+ 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, -+ 0xd52a, 0x001e, 0x004e, 0x2019, 0x0002, 0x080c, 0xd0e5, 0x003e, -+ 0x9085, 0x0001, 0x0005, 0x0096, 0x080c, 0xbb17, 0x0140, 0x6014, -+ 0x904d, 0x080c, 0xb74a, 0x687b, 0x0005, 0x080c, 0x688c, 0x009e, -+ 0x080c, 0x9e62, 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, -+ 0x617b, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, -+ 0x1805, 0x2011, 0x0276, 0x080c, 0xadf9, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, -+ 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1cd0, -+ 0x2079, 0x0001, 0x8fff, 0x0904, 0xd435, 0x2071, 0x1800, 0x7650, -+ 0x7070, 0x8001, 0x9602, 0x1a04, 0xd435, 0x88ff, 0x0120, 0x2800, -+ 0x9c06, 0x1590, 0x2078, 0x080c, 0xd55b, 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, 0xd787, -+ 0x080c, 0xc22a, 0x080c, 0x190d, 0x6023, 0x0007, 0x6014, 0x2048, -+ 0x080c, 0xbb17, 0x0120, 0x0046, 0x080c, 0xd4d5, 0x004e, 0x009e, -+ 0x080c, 0x9e62, 0x88ff, 0x1198, 0x9ce0, 0x0018, 0x2001, 0x1819, -+ 0x2004, 0x9c02, 0x1210, 0x0804, 0xd3ea, 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, 0x97ba, 0x009e, 0x008e, 0x903e, 0x080c, 0x9865, 0x080c, -+ 0xd3db, 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, -+ 0x0076, 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, -+ 0x0016, 0x0036, 0x080c, 0x623e, 0x1190, 0x0056, 0x0086, 0x9046, -+ 0x2508, 0x2029, 0x0001, 0x0096, 0x904e, 0x080c, 0x97ba, 0x009e, -+ 0x008e, 0x903e, 0x080c, 0x9865, 0x080c, 0xd3db, 0x005e, 0x003e, -+ 0x001e, 0x8108, 0x1f04, 0xd468, 0x015e, 0x00ce, 0x007e, 0x005e, -+ 0x004e, 0x00be, 0x0005, 0x00b6, 0x0076, 0x0056, 0x6210, 0x2258, -+ 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, 0x904e, -+ 0x080c, 0x97ba, 0x009e, 0x008e, 0x903e, 0x080c, 0x9865, 0x2c20, -+ 0x080c, 0xd3db, 0x005e, 0x007e, 0x00be, 0x0005, 0x00b6, 0x0046, -+ 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, -+ 0x0016, 0x0036, 0x080c, 0x623e, 0x11a0, 0x0086, 0x9046, 0x2828, -+ 0x0046, 0x2021, 0x0001, 0x080c, 0xd76b, 0x004e, 0x0096, 0x904e, -+ 0x080c, 0x97ba, 0x009e, 0x008e, 0x903e, 0x080c, 0x9865, 0x080c, -+ 0xd3db, 0x003e, 0x001e, 0x8108, 0x1f04, 0xd4b0, 0x015e, 0x00ce, -+ 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x0016, 0x00f6, 0x080c, -+ 0xbb15, 0x0198, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, -+ 0xa800, 0x907d, 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x688c, -+ 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x688c, 0x00fe, 0x001e, 0x0005, -+ 0xa800, 0x907d, 0x0130, 0xa803, 0x0000, 0x080c, 0x688c, 0x2f48, -+ 0x0cb8, 0x080c, 0x688c, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, -+ 0x1cd0, 0x9005, 0x1138, 0x2071, 0x1800, 0x7450, 0x7070, 0x8001, -+ 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, 0x6000, 0x9086, 0x0000, -+ 0x0148, 0x6008, 0x9206, 0x1130, 0x6010, 0x91a0, 0x0004, 0x2424, -+ 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, 0x9c02, -+ 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e, -+ 0x00ee, 0x0005, 0x0096, 0x0006, 0x080c, 0x0feb, 0x000e, 0x090c, -+ 0x0db4, 0xaae2, 0xa867, 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, -+ 0xbb05, 0x2001, 0x0000, 0x0120, 0x2200, 0x9080, 0x0015, 0x2004, -+ 0x002e, 0xa87a, 0x9186, 0x0020, 0x0110, 0xa8e3, 0xffff, 0xa986, -+ 0xac76, 0xa87f, 0x0000, 0x2001, 0x195f, 0x2004, 0xa882, 0x9006, -+ 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x688c, -+ 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, 0x1958, 0x2004, 0x601a, 0x080c, 0x83f1, -+ 0x080c, 0x8973, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, -+ 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xbe4a, 0x0030, 0x080c, -+ 0xd787, 0x080c, 0x8204, 0x080c, 0x9e32, 0x0005, 0x9280, 0x0008, -+ 0x2004, 0x9084, 0x000f, 0x0002, 0xd5ba, 0xd5ba, 0xd5ba, 0xd5bc, -+ 0xd5ba, 0xd5bc, 0xd5bc, 0xd5ba, 0xd5bc, 0xd5ba, 0xd5ba, 0xd5ba, -+ 0xd5ba, 0xd5ba, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, -+ 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd5d3, 0xd5d3, 0xd5d3, -+ 0xd5d3, 0xd5d3, 0xd5d3, 0xd5e0, 0xd5d3, 0xd5d3, 0xd5d3, 0xd5d3, -+ 0xd5d3, 0xd5d3, 0xd5d3, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, -+ 0x2a00, 0x6003, 0x0001, 0x080c, 0x83f1, 0x080c, 0x8973, 0x0005, -+ 0x0096, 0x00c6, 0x2260, 0x080c, 0xd787, 0x6043, 0x0000, 0x6024, -+ 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, -+ 0x9186, 0x0007, 0x1904, 0xd639, 0x6814, 0x9005, 0x0138, 0x2048, -+ 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, -+ 0x6003, 0x0001, 0x080c, 0x83f1, 0x080c, 0x8973, 0x00c6, 0x2d60, -+ 0x6100, 0x9186, 0x0002, 0x1904, 0xd6b0, 0x6014, 0x9005, 0x1138, -+ 0x6000, 0x9086, 0x0007, 0x190c, 0x0db4, 0x0804, 0xd6b0, 0x2048, -+ 0x080c, 0xbb17, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, -+ 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1168, -+ 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, 0x2009, -+ 0x0043, 0x080c, 0xcf3e, 0x0804, 0xd6b0, 0x2009, 0x0041, 0x0804, -+ 0xd6aa, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, 0xd0bc, -+ 0x1120, 0x00de, 0x009e, 0x0804, 0xd5d3, 0xd0b4, 0x0128, 0xd0fc, -+ 0x090c, 0x0db4, 0x0804, 0xd5f4, 0x6007, 0x003a, 0x6003, 0x0001, -+ 0x080c, 0x83f1, 0x080c, 0x8973, 0x00c6, 0x2d60, 0x6100, 0x9186, -+ 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xd6b0, 0x6814, 0x2048, -+ 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, 0xa982, -+ 0x00f6, 0x2c78, 0x080c, 0x1648, 0x00fe, 0x2009, 0x0042, 0x04d0, -+ 0x0036, 0x080c, 0x0feb, 0x090c, 0x0db4, 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, -+ 0x688c, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xd0e5, 0x2d00, -+ 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x6342, -+ 0x003e, 0x0038, 0x6043, 0x0000, 0x6003, 0x0007, 0x080c, 0xcf3e, -+ 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, -+ 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, -+ 0x886e, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, -+ 0xd4d5, 0x009e, 0x003e, 0x080c, 0x8973, 0x0005, 0x9186, 0x0014, -+ 0x0d70, 0x080c, 0x9ec7, 0x0005, 0xd6e3, 0xd6e1, 0xd6e1, 0xd6e1, -+ 0xd6e1, 0xd6e1, 0xd6e3, 0xd6e1, 0xd6e1, 0xd6e1, 0xd6e1, 0xd6e1, -+ 0xd6e1, 0x080c, 0x0db4, 0x080c, 0x886e, 0x6003, 0x000c, 0x080c, -+ 0x8973, 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, -+ 0x001a, 0x080c, 0x9ec7, 0x0005, 0xd701, 0xd701, 0xd701, 0xd701, -+ 0xd703, 0xd723, 0xd701, 0xd701, 0xd701, 0xd701, 0xd701, 0xd701, -+ 0xd701, 0x080c, 0x0db4, 0x00d6, 0x2c68, 0x080c, 0x9ddc, 0x01b0, -+ 0x6003, 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, -+ 0x2009, 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, -+ 0x6023, 0x0004, 0x080c, 0x83f1, 0x080c, 0x8973, 0x2d60, 0x080c, -+ 0x9e32, 0x00de, 0x0005, 0x080c, 0x9e32, 0x0005, 0x00e6, 0x6010, -+ 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, -+ 0x1873, 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, -+ 0x6026, 0xd0cc, 0x0150, 0x2001, 0x1959, 0x2004, 0x6042, 0x2009, -+ 0x1873, 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1873, 0x210c, -+ 0xd1f4, 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, -+ 0x1959, 0x200c, 0x2001, 0x1957, 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, 0x8204, 0x080c, 0x9e32, 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, 0x182b, 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, 0xae0d, 0x009e, -+ 0x1168, 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, -+ 0x2019, 0x0006, 0x080c, 0xae0d, 0x009e, 0x1100, 0x015e, 0x003e, -+ 0x002e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5c64, 0x080c, -+ 0x2dbb, 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5, -+ 0xa882, 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, -+ 0x0046, 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, 0x19c1, -+ 0x252c, 0x2021, 0x19c7, 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, -+ 0x7650, 0x7070, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, -+ 0x9786, 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, -+ 0x01d0, 0x080c, 0xd55b, 0x01b8, 0x080c, 0xd56b, 0x11a0, 0x6000, -+ 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x190d, 0x001e, 0x080c, -+ 0xbd0c, 0x1110, 0x080c, 0x3003, 0x080c, 0xbd1d, 0x1110, 0x080c, -+ 0xa7c0, 0x080c, 0x9e62, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, -+ 0x9c02, 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, -+ 0x006e, 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001, 0x1810, -+ 0x2004, 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1836, 0x2004, 0xd09c, -+ 0x000e, 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, 0xc212, 0x0168, -+ 0x2019, 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0, -+ 0x00be, 0x2021, 0x0004, 0x080c, 0x4a76, 0x004e, 0x003e, 0x000e, -+ 0x6004, 0x9086, 0x0001, 0x1128, 0x080c, 0x9926, 0x080c, 0x9e62, -+ 0x9006, 0x0005, 0x00e6, 0x00c6, 0x00b6, 0x0046, 0x2061, 0x1cd0, -+ 0x2071, 0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12b8, 0x2100, -+ 0x9c06, 0x0148, 0x6000, 0x9086, 0x0000, 0x0128, 0x6010, 0x2058, -+ 0xb8a0, 0x9206, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x1819, 0x2004, -+ 0x9c02, 0x1220, 0x0c60, 0x9085, 0x0001, 0x0008, 0x9006, 0x004e, -+ 0x00be, 0x00ce, 0x00ee, 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, 0x0003, 0x000b, 0x04a6, 0x0000, 0xc000, -+ 0x0001, 0x8064, 0x0008, 0x0010, 0x0000, 0x8066, 0x0000, 0x0101, -+ 0x0008, 0x4407, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, 0x580d, -+ 0x000b, 0x798e, 0x0003, 0x50db, 0x000b, 0x4c0a, 0x0003, 0xbac0, -+ 0x0009, 0x008a, 0x0000, 0x0c0a, 0x000b, 0x15fe, 0x0008, 0x340a, -+ 0x0003, 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000, -+ 0x0000, 0x1627, 0x0003, 0x808c, 0x0008, 0x0001, 0x0000, 0x0000, -+ 0x0007, 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, 0x0000, 0x0821, -+ 0x0003, 0x4022, 0x0000, 0x0022, 0x000b, 0x4122, 0x0008, 0x4447, -+ 0x0002, 0x0e4f, 0x000b, 0x0bfe, 0x0008, 0x11a0, 0x0001, 0x122d, -+ 0x000b, 0x0ca0, 0x0001, 0x122d, 0x000b, 0x9180, 0x0001, 0x0004, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, -+ 0x0000, 0x0009, 0x0008, 0x4430, 0x000b, 0x808c, 0x0008, 0x0000, -+ 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, -+ 0x0000, 0x0411, 0x0000, 0x4438, 0x0003, 0x03fe, 0x0000, 0x43e0, -+ 0x0001, 0x0e2a, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x02e0, -+ 0x0001, 0x0e2a, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, 0x8060, -+ 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0019, -+ 0x0000, 0x4447, 0x000b, 0x0240, 0x0002, 0x0a27, 0x000b, 0x00fe, -+ 0x0000, 0x322a, 0x000b, 0x112a, 0x0000, 0x002e, 0x0008, 0x022c, -+ 0x0008, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0002, -+ 0x0000, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0008, 0x8066, -+ 0x0000, 0x0011, 0x0008, 0x4458, 0x0003, 0x01fe, 0x0008, 0x42e0, -+ 0x0009, 0x0e1d, 0x0003, 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0e1d, -+ 0x0003, 0x1734, 0x0000, 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a, -+ 0x0008, 0x9880, 0x0001, 0x0010, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x1e0a, 0x0008, 0x446a, -+ 0x000b, 0x808a, 0x0008, 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062, -+ 0x0008, 0x0002, 0x0000, 0x5870, 0x000b, 0x8066, 0x0000, 0x3679, -+ 0x0000, 0x4473, 0x0003, 0x5874, 0x0003, 0x3efe, 0x0008, 0x7f4f, -+ 0x0002, 0x087a, 0x000b, 0x0d00, 0x0000, 0x0082, 0x0004, 0x8054, -+ 0x0008, 0x0011, 0x0008, 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, -+ 0x0000, 0x300a, 0x000b, 0x00b8, 0x0004, 0x000a, 0x000b, 0x00fe, -+ 0x0000, 0x348a, 0x000b, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, -+ 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, 0x4489, 0x0003, 0x03fe, -+ 0x0000, 0x04d0, 0x0001, 0x0cb0, 0x0003, 0x82c0, 0x0001, 0x1f00, -+ 0x0000, 0xffa0, 0x0001, 0x0400, 0x0000, 0x089f, 0x0003, 0x14b0, -+ 0x0003, 0x01fe, 0x0008, 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe, -+ 0x0008, 0xffc0, 0x0001, 0x00ff, 0x0008, 0x0690, 0x0001, 0x109f, -+ 0x0003, 0x7f08, 0x0008, 0x84c0, 0x0001, 0xff00, 0x0008, 0x08b0, -+ 0x000b, 0x00fe, 0x0000, 0x34a6, 0x0003, 0x8072, 0x0000, 0x1010, -+ 0x0008, 0x3944, 0x0002, 0x08a1, 0x000b, 0x00aa, 0x000b, 0x8072, -+ 0x0000, 0x2020, 0x0008, 0x3945, 0x000a, 0x08a6, 0x0003, 0x3946, -+ 0x000a, 0x0cb7, 0x000b, 0x0000, 0x0007, 0x3943, 0x000a, 0x08b7, -+ 0x0003, 0x00aa, 0x000b, 0x00fe, 0x0000, 0x34b5, 0x000b, 0x8072, -+ 0x0000, 0x1000, 0x0000, 0x00b7, 0x000b, 0x8072, 0x0000, 0x2000, -+ 0x0000, 0x4000, 0x000f, 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, -+ 0x0000, 0x0231, 0x0008, 0x44bc, 0x0003, 0x58bd, 0x0003, 0x0140, -+ 0x0008, 0x0242, 0x0000, 0x1f43, 0x0002, 0x0ccb, 0x0003, 0x0d44, -+ 0x0000, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, 0x0008, 0x030a, -+ 0x0008, 0x040c, 0x0000, 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00cf, -+ 0x000b, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, -+ 0x0000, 0x58cf, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x08d6, -+ 0x000b, 0x8000, 0x0000, 0x0001, 0x0000, 0x0082, 0x0004, 0x8054, -+ 0x0008, 0x0001, 0x0000, 0x8074, 0x0000, 0x2020, 0x0008, 0x4000, -+ 0x000f, 0x3a40, 0x000a, 0x0c0d, 0x0003, 0x2b24, 0x0008, 0x2b24, -+ 0x0008, 0x58df, 0x000b, 0x8054, 0x0008, 0x0002, 0x0000, 0x1242, -+ 0x0002, 0x092d, 0x000b, 0x3a45, 0x000a, 0x091c, 0x0003, 0x8072, -+ 0x0000, 0x1000, 0x0000, 0x3945, 0x000a, 0x08ec, 0x000b, 0x8072, -+ 0x0000, 0x3010, 0x0000, 0x1e10, 0x000a, 0x7f3c, 0x0000, 0x0917, -+ 0x000b, 0x1d00, 0x0002, 0x7f3a, 0x0000, 0x0d60, 0x0000, 0x7f62, -+ 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x44f5, 0x000b, 0x00fe, -+ 0x0000, 0x3514, 0x000b, 0x1c60, 0x0000, 0x8062, 0x0008, 0x0001, -+ 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x44fd, 0x0003, 0x00fe, -+ 0x0000, 0x3204, 0x000b, 0x0038, 0x0000, 0x0060, 0x0008, 0x8062, -+ 0x0008, 0x0019, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x4506, -+ 0x0003, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f3e, 0x0008, 0x0d60, -+ 0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, 0x7f62, 0x0008, 0x8066, -+ 0x0000, 0x0009, 0x0008, 0x4510, 0x000b, 0x003a, 0x0008, 0x1dfe, -+ 0x0000, 0x00f1, 0x0003, 0x0036, 0x0008, 0x00b8, 0x0004, 0x012d, -+ 0x0003, 0x8074, 0x0000, 0x2000, 0x0000, 0x8072, 0x0000, 0x2000, -+ 0x0000, 0x012d, 0x0003, 0x3a44, 0x0002, 0x0a30, 0x000b, 0x8074, -+ 0x0000, 0x1000, 0x0000, 0x8072, 0x0000, 0x1000, 0x0000, 0x2d0e, -+ 0x0000, 0x2d0e, 0x0000, 0x3601, 0x0003, 0x26fe, 0x0008, 0x26fe, -+ 0x0008, 0x2700, 0x0008, 0x2700, 0x0008, 0x00d0, 0x0009, 0x0d3f, -+ 0x0003, 0x8074, 0x0000, 0x4040, 0x0008, 0x592d, 0x000b, 0x50db, -+ 0x000b, 0x3a46, 0x000a, 0x0d3f, 0x0003, 0x3a47, 0x0002, 0x093a, -+ 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, -+ 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0182, 0x0003, 0x92c0, -+ 0x0009, 0x0fc8, 0x0000, 0x080a, 0x0003, 0x1246, 0x000a, 0x0dfb, -+ 0x000b, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, 0x8066, -+ 0x0000, 0x362a, 0x0000, 0x4544, 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, 0x1a60, 0x0000, 0x8062, -+ 0x0008, 0x0007, 0x0000, 0x8066, 0x0000, 0x0052, 0x0000, 0x455e, -+ 0x000b, 0x92c0, 0x0009, 0x0780, 0x0008, 0x0e17, 0x0003, 0x124b, -+ 0x0002, 0x0967, 0x0003, 0x2e4d, 0x0002, 0x2e4d, 0x0002, 0x0a01, -+ 0x0003, 0x3a46, 0x000a, 0x0d74, 0x0003, 0x5969, 0x000b, 0x8054, -+ 0x0008, 0x0004, 0x0000, 0x1243, 0x000a, 0x097e, 0x000b, 0x8010, -+ 0x0008, 0x000d, 0x0000, 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, -+ 0x0004, 0x017e, 0x0003, 0x194d, 0x000a, 0x0978, 0x000b, 0x1243, -+ 0x000a, 0x0a0b, 0x0003, 0x5978, 0x000b, 0x8054, 0x0008, 0x0004, -+ 0x0000, 0x01e4, 0x000c, 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, -+ 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, -+ 0x0000, 0x3a42, 0x0002, 0x0d88, 0x0003, 0x15fe, 0x0008, 0x3451, -+ 0x000b, 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, 0x8010, -+ 0x0008, 0x000c, 0x0008, 0x01ef, 0x0004, 0x000a, 0x000b, 0xbbe0, -+ 0x0009, 0x0030, 0x0008, 0x0d9e, 0x000b, 0x18fe, 0x0000, 0x3ce0, -+ 0x0009, 0x099b, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x099b, -+ 0x0003, 0x01df, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x01dc, -+ 0x000b, 0x8076, 0x0008, 0x0041, 0x0008, 0x01dc, 0x000b, 0xbbe0, -+ 0x0009, 0x0032, 0x0000, 0x0da3, 0x0003, 0x3c1e, 0x0008, 0x01dc, -+ 0x000b, 0xbbe0, 0x0009, 0x0037, 0x0000, 0x0dc1, 0x000b, 0x18fe, -+ 0x0000, 0x3ce0, 0x0009, 0x0d9b, 0x000b, 0x8076, 0x0008, 0x0040, -+ 0x0000, 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, 0x45b8, 0x0003, 0x01e4, 0x000c, 0x8054, -+ 0x0008, 0x0004, 0x0000, 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, -+ 0x0000, 0xb000, 0x0000, 0x0182, 0x0003, 0xbbe0, 0x0009, 0x0038, -+ 0x0000, 0x0dd3, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09d0, -+ 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0d97, 0x000b, 0x01df, -+ 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, -+ 0x0000, 0x0227, 0x0003, 0x8076, 0x0008, 0x0042, 0x0008, 0x01dc, -+ 0x000b, 0xbbe0, 0x0009, 0x0016, 0x0000, 0x0ddc, 0x000b, 0x3a44, -+ 0x0002, 0x0c0c, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, -+ 0x000f, 0x000a, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x000a, -+ 0x000b, 0x3d30, 0x000a, 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, -+ 0x0000, 0x01e8, 0x0003, 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, -+ 0x0001, 0x0007, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, -+ 0x0008, 0x8066, 0x0000, 0x000a, 0x0008, 0x45ed, 0x0003, 0x4000, -+ 0x000f, 0x21ef, 0x0003, 0x0870, 0x0008, 0x4000, 0x000f, 0xbac0, -+ 0x0009, 0x0090, 0x0008, 0x09f8, 0x0003, 0x8074, 0x0000, 0x0706, -+ 0x0000, 0x01fa, 0x0003, 0x8074, 0x0000, 0x0703, 0x0000, 0x4000, -+ 0x000f, 0x8010, 0x0008, 0x0023, 0x0000, 0x0235, 0x0003, 0x8010, -+ 0x0008, 0x0008, 0x0000, 0x0235, 0x0003, 0x8010, 0x0008, 0x0022, -+ 0x0008, 0x0235, 0x0003, 0x01e4, 0x000c, 0x8010, 0x0008, 0x0007, -+ 0x0000, 0x01ef, 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, 0x0241, -+ 0x0003, 0x01e4, 0x000c, 0x8010, 0x0008, 0x001b, 0x0008, 0x01ef, -+ 0x0004, 0x1810, 0x0000, 0x01ef, 0x0004, 0x8074, 0x0000, 0xf080, -+ 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x000a, -+ 0x000b, 0x8010, 0x0008, 0x0009, 0x0008, 0x0235, 0x0003, 0x8010, -+ 0x0008, 0x0005, 0x0008, 0x0235, 0x0003, 0x808c, 0x0008, 0x0001, -+ 0x0000, 0x8010, 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x085f, -+ 0x0003, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x0235, -+ 0x0003, 0x8010, 0x0008, 0x0003, 0x0008, 0x0239, 0x0003, 0x8010, -+ 0x0008, 0x000b, 0x0000, 0x0239, 0x0003, 0x8010, 0x0008, 0x0002, -+ 0x0000, 0x0239, 0x0003, 0x3a47, 0x0002, 0x0d2d, 0x0003, 0x8010, -+ 0x0008, 0x0006, 0x0008, 0x0239, 0x0003, 0x8074, 0x0000, 0xf000, -+ 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, 0x01ef, 0x0004, 0x01f2, -+ 0x0004, 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, 0x0008, 0x000c, -+ 0x0008, 0x01ef, 0x0004, 0x000a, 0x000b, 0x8074, 0x0000, 0xf080, -+ 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d, -+ 0x0002, 0x2e4d, 0x0002, 0x0a4c, 0x0003, 0x8054, 0x0008, 0x0019, -+ 0x0000, 0x000a, 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, -+ 0x000b, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x022a, 0x000b, 0x15b6, -+ 0xf4ac, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, -+ 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, -+ 0x8000, 0x89e3 -+}; -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2300flx_length01 = 0xd59a; -+#else -+unsigned short risc_code_length01 = 0xd59a; -+#endif -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2300ipx_fw.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2300ipx_fw.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2300ipx_fw.h 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2300ipx_fw.h 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,7548 @@ -+/****************************************************************************** -+ * 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. -+ * -+ ******************************************************************************/ -+ -+/************************************************************************ -+ * * -+ * --- ISP2300 Initiator/Target Firmware --- * -+ * with support for Internet Protocol * -+ * and 2K port logins. * -+ * * -+ ************************************************************************ -+ */ -+/* -+ * Firmware Version 3.02.28 (13:56 Apr 03, 2004) -+ */ -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2300ipx_version = 3*1024+2; -+#else -+unsigned short risc_code_version = 3*1024+2; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned char fw2300ipx_version_str[] = {3, 2,28}; -+#else -+unsigned char firmware_version[] = {3, 2,28}; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+#define fw2300ipx_VERSION_STRING "3.02.28" -+#else -+#define FW_VERSION_STRING "3.02.28" -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2300ipx_addr01 = 0x0800 ; -+#else -+unsigned short risc_code_addr01 = 0x0800 ; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2300ipx_code01[] = { -+#else -+unsigned short risc_code01[] = { -+#endif -+ 0x0470, 0x0000, 0x0000, 0xe9c7, 0x0000, 0x0003, 0x0002, 0x001c, -+ 0x0137, 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, 0x2e32, 0x3820, 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, 0x20c9, 0x1bff, 0x2059, 0x0000, 0x2b78, -+ 0x7883, 0x0004, 0x2089, 0x2d29, 0x2051, 0x1800, 0x2a70, 0x20e1, -+ 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e51, 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, 0x756e, 0x7672, 0x776a, 0x7476, 0x747a, -+ 0x00e6, 0x2071, 0x1ac8, 0x2472, 0x00ee, 0x20a1, 0x1cd0, 0x7170, -+ 0x810d, 0x810d, 0x810d, 0x810d, 0x918c, 0x000f, 0x2001, 0x0001, -+ 0x9112, 0x900e, 0x21a8, 0x4104, 0x8211, 0x1de0, 0x7170, 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, 0x0f17, 0x080c, -+ 0x6028, 0x080c, 0xadf7, 0x080c, 0x10ce, 0x080c, 0x12ed, 0x080c, -+ 0x1ba4, 0x080c, 0x0d69, 0x080c, 0x1053, 0x080c, 0x3425, 0x080c, -+ 0x76b8, 0x080c, 0x6996, 0x080c, 0x86f6, 0x080c, 0x842a, 0x080c, -+ 0x2478, 0x080c, 0x8f98, 0x080c, 0x7d82, 0x080c, 0x22b1, 0x080c, -+ 0x23e5, 0x080c, 0x246d, 0x2091, 0x3009, 0x7883, 0x0000, 0x1004, -+ 0x091f, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, 0x4000, 0x7837, -+ 0x4000, 0x7833, 0x0010, 0x0e04, 0x0913, 0x2091, 0x5000, 0x2091, -+ 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2071, -+ 0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000, 0x908e, 0x0003, -+ 0x1178, 0x080c, 0x4bc9, 0x080c, 0x344c, 0x080c, 0x7729, 0x080c, -+ 0x6ed7, 0x080c, 0x87d4, 0x080c, 0x8453, 0x080c, 0x2c93, 0x0c58, -+ 0x000b, 0x0c78, 0x0944, 0x0945, 0x0ae7, 0x0942, 0x0bae, 0x0d68, -+ 0x0d68, 0x0d68, 0x080c, 0x0dd5, 0x0005, 0x0126, 0x00f6, 0x2091, -+ 0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0aba, 0x080c, 0x56de, -+ 0x1130, 0x0026, 0x2011, 0x0080, 0x080c, 0x0edf, 0x002e, 0x080c, -+ 0x73bc, 0x0150, 0x080c, 0x73df, 0x15a0, 0x2079, 0x0100, 0x7828, -+ 0x9085, 0x1800, 0x782a, 0x0468, 0x080c, 0x72ee, 0x7000, 0x9086, -+ 0x0001, 0x1904, 0x0aba, 0x7098, 0x9086, 0x0028, 0x1904, 0x0aba, -+ 0x080c, 0x8422, 0x080c, 0x8414, 0x2001, 0x0161, 0x2003, 0x0001, -+ 0x2079, 0x0100, 0x7827, 0xffff, 0x7a28, 0x9295, 0x5e2f, 0x7a2a, -+ 0x2011, 0x7252, 0x080c, 0x84f3, 0x2011, 0x7245, 0x080c, 0x85cd, -+ 0x2011, 0x5e83, 0x080c, 0x84f3, 0x2011, 0x8030, 0x901e, 0x7396, -+ 0x04d0, 0x080c, 0x5730, 0x2079, 0x0100, 0x7844, 0x9005, 0x1904, -+ 0x0aba, 0x2011, 0x5e83, 0x080c, 0x84f3, 0x2011, 0x7252, 0x080c, -+ 0x84f3, 0x2011, 0x7245, 0x080c, 0x85cd, 0x2001, 0x0265, 0x2001, -+ 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, 0x2001, -+ 0x19a6, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, 0x080c, -+ 0x5fd0, 0x00ce, 0x0804, 0x0aba, 0x780f, 0x006b, 0x7a28, 0x080c, -+ 0x73c4, 0x0118, 0x9295, 0x5e2f, 0x0010, 0x9295, 0x402f, 0x7a2a, -+ 0x2011, 0x8010, 0x73d8, 0x2001, 0x19a7, 0x2003, 0x0001, 0x080c, -+ 0x2b59, 0x080c, 0x4b04, 0x7248, 0xc284, 0x724a, 0x2001, 0x180c, -+ 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x080c, 0xa51d, 0x2011, 0x0004, -+ 0x080c, 0xcb45, 0x080c, 0x6822, 0x080c, 0x73bc, 0x1120, 0x080c, -+ 0x2b9d, 0x02e0, 0x0400, 0x080c, 0x5fd7, 0x0140, 0x7097, 0x0001, -+ 0x70d3, 0x0000, 0x080c, 0x58fd, 0x0804, 0x0aba, 0x080c, 0x56cf, -+ 0xd094, 0x0188, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, -+ 0x56d3, 0xd0d4, 0x1118, 0x080c, 0x2b9d, 0x1270, 0x2011, 0x180c, -+ 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x56d3, 0xd0d4, 0x1db8, 0x2011, -+ 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, 0xc0bd, -+ 0x2012, 0x080c, 0x696a, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd, -+ 0x2012, 0x080c, 0x6930, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8, -+ 0x707f, 0x0000, 0x080c, 0x73bc, 0x1130, 0x70b0, 0x9005, 0x1168, -+ 0x080c, 0xcf81, 0x0050, 0x080c, 0xcf81, 0x70dc, 0xd09c, 0x1128, -+ 0x70b0, 0x9005, 0x0110, 0x080c, 0x5fad, 0x70e7, 0x0000, 0x70e3, -+ 0x0000, 0x70a7, 0x0000, 0x080c, 0x2ba5, 0x0228, 0x2011, 0x0101, -+ 0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x73bc, 0x1178, 0x9016, -+ 0x0016, 0x080c, 0x2956, 0x2019, 0x196d, 0x211a, 0x001e, 0x705f, -+ 0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, 0x196d, -+ 0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, 0xc295, -+ 0x72de, 0x080c, 0x73bc, 0x0118, 0x9296, 0x0004, 0x0548, 0x2011, -+ 0x0001, 0x080c, 0xcb45, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, -+ 0x0002, 0x2079, 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, -+ 0x782a, 0x00fe, 0x080c, 0x2f96, 0x2011, 0x0005, 0x080c, 0xa653, -+ 0x080c, 0x968d, 0x080c, 0x73bc, 0x0148, 0x00c6, 0x2061, 0x0100, -+ 0x0016, 0x080c, 0x2956, 0x61e2, 0x001e, 0x00ce, 0x012e, 0x0420, -+ 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, 0x00f6, 0x2079, -+ 0x0100, 0x7827, 0x0003, 0x7828, 0x9085, 0x0003, 0x782a, 0x00fe, -+ 0x2011, 0x0005, 0x080c, 0xa653, 0x080c, 0x968d, 0x080c, 0x73bc, -+ 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, 0x2956, 0x61e2, -+ 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, 0x00b6, 0x080c, -+ 0x73bc, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, -+ 0x73bc, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x86ff, 0x0138, -+ 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, 0xd0bc, 0x090c, -+ 0x32bb, 0x8108, 0x1f04, 0x0ace, 0x707f, 0x0000, 0x7080, 0x9084, -+ 0x00ff, 0x7082, 0x70b3, 0x0000, 0x00be, 0x00ce, 0x0005, 0x00b6, -+ 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, 0x1904, 0x0bab, -+ 0x70ac, 0x9086, 0xffff, 0x0130, 0x080c, 0x2f96, 0x080c, 0x968d, -+ 0x0804, 0x0bab, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0558, 0xd084, -+ 0x0548, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c, -+ 0x0508, 0x080c, 0x331e, 0x11d0, 0x70e0, 0x9086, 0xffff, 0x01b0, -+ 0x080c, 0x312b, 0x080c, 0x968d, 0x70dc, 0xd094, 0x1904, 0x0bab, -+ 0x2011, 0x0001, 0x080c, 0xd230, 0x0110, 0x2011, 0x0003, 0x901e, -+ 0x080c, 0x3165, 0x080c, 0x968d, 0x0804, 0x0bab, 0x70e4, 0x9005, -+ 0x1904, 0x0bab, 0x70a8, 0x9005, 0x1904, 0x0bab, 0x70dc, 0xd0a4, -+ 0x0118, 0xd0b4, 0x0904, 0x0bab, 0x080c, 0x6930, 0x1904, 0x0bab, -+ 0x080c, 0x6983, 0x1904, 0x0bab, 0x080c, 0x696a, 0x01c0, 0x0156, -+ 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x65ff, 0x1118, -+ 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, 0x0b44, 0x00ce, -+ 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, 0x0bab, 0x0006, -+ 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0x2011, 0x19b3, 0x080c, -+ 0x0f87, 0x2011, 0x19cd, 0x080c, 0x0f87, 0x7030, 0xc08c, 0x7032, -+ 0x7003, 0x0003, 0x70af, 0xffff, 0x080c, 0x56de, 0x1130, 0x0026, -+ 0x2011, 0x0040, 0x080c, 0x0edf, 0x002e, 0x9006, 0x080c, 0x27ea, -+ 0x080c, 0x331e, 0x0118, 0x080c, 0x4ca1, 0x0050, 0x0036, 0x0046, -+ 0x2019, 0xffff, 0x2021, 0x0006, 0x080c, 0x4cbb, 0x004e, 0x003e, -+ 0x00f6, 0x2079, 0x0100, 0x080c, 0x73df, 0x0150, 0x080c, 0x73bc, -+ 0x7828, 0x0118, 0x9084, 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, -+ 0x00fe, 0x2001, 0x19e8, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, -+ 0x0000, 0x080c, 0xa653, 0x2011, 0x0000, 0x080c, 0xa65d, 0x080c, -+ 0x968d, 0x080c, 0x97b9, 0x012e, 0x00be, 0x0005, 0x0016, 0x0046, -+ 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, -+ 0xfffd, 0x7906, 0x2009, 0x00f7, 0x080c, 0x5f96, 0x7940, 0x918c, -+ 0x0010, 0x7942, 0x7924, 0xd1b4, 0x0110, 0x7827, 0x0040, 0xd19c, -+ 0x0110, 0x7827, 0x0008, 0x0006, 0x0036, 0x0156, 0x7954, 0xd1ac, -+ 0x1904, 0x0c3b, 0x2001, 0x19a7, 0x2004, 0x9005, 0x1518, 0x080c, -+ 0x2c20, 0x1148, 0x2001, 0x0001, 0x080c, 0x2b88, 0x2001, 0x0001, -+ 0x080c, 0x2b6b, 0x00b8, 0x080c, 0x2c28, 0x1138, 0x9006, 0x080c, -+ 0x2b88, 0x9006, 0x080c, 0x2b6b, 0x0068, 0x080c, 0x2c30, 0x1d50, -+ 0x2001, 0x1998, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2982, -+ 0x0804, 0x0d1a, 0x080c, 0x73cd, 0x0148, 0x080c, 0x73df, 0x1118, -+ 0x080c, 0x76b3, 0x0050, 0x080c, 0x73c4, 0x0dd0, 0x080c, 0x76ae, -+ 0x080c, 0x76a4, 0x080c, 0x72ee, 0x0058, 0x080c, 0x73bc, 0x0140, -+ 0x2009, 0x00f8, 0x080c, 0x5f96, 0x7843, 0x0090, 0x7843, 0x0010, -+ 0x20a9, 0x09c4, 0x7820, 0xd09c, 0x1138, 0x080c, 0x73bc, 0x0138, -+ 0x7824, 0xd0ac, 0x1904, 0x0d1f, 0x1f04, 0x0c1a, 0x0070, 0x7824, -+ 0x080c, 0x73d6, 0x0118, 0xd0ac, 0x1904, 0x0d1f, 0x9084, 0x1800, -+ 0x0d98, 0x7003, 0x0001, 0x0804, 0x0d1f, 0x2001, 0x0001, 0x080c, -+ 0x27ea, 0x0804, 0x0d32, 0x2001, 0x19a7, 0x2004, 0x9005, 0x1518, -+ 0x080c, 0x2c20, 0x1148, 0x2001, 0x0001, 0x080c, 0x2b88, 0x2001, -+ 0x0001, 0x080c, 0x2b6b, 0x00b8, 0x080c, 0x2c28, 0x1138, 0x9006, -+ 0x080c, 0x2b88, 0x9006, 0x080c, 0x2b6b, 0x0068, 0x080c, 0x2c30, -+ 0x1d50, 0x2001, 0x1998, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, -+ 0x2982, 0x0804, 0x0d1a, 0x7850, 0x9085, 0x0040, 0x7852, 0x7938, -+ 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2c38, 0x9085, 0x2000, -+ 0x7852, 0x793a, 0x20a9, 0x0046, 0x1d04, 0x0c74, 0x080c, 0x85ad, -+ 0x1f04, 0x0c74, 0x7850, 0x9085, 0x0400, 0x9084, 0xdfbf, 0x7852, -+ 0x793a, 0x080c, 0x73cd, 0x0148, 0x080c, 0x73df, 0x1118, 0x080c, -+ 0x76b3, 0x0050, 0x080c, 0x73c4, 0x0dd0, 0x080c, 0x76ae, 0x080c, -+ 0x76a4, 0x080c, 0x72ee, 0x0020, 0x2009, 0x00f8, 0x080c, 0x5f96, -+ 0x20a9, 0x0028, 0xa001, 0x1f04, 0x0c9a, 0x7850, 0x9085, 0x1400, -+ 0x7852, 0x080c, 0x73bc, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, -+ 0x2021, 0xe678, 0x2019, 0xea60, 0x0d0c, 0x85ad, 0x7820, 0xd09c, -+ 0x1580, 0x080c, 0x73bc, 0x0904, 0x0cff, 0x7824, 0xd0ac, 0x1904, -+ 0x0d1f, 0x080c, 0x73df, 0x1528, 0x0046, 0x2021, 0x0320, 0x8421, -+ 0x1df0, 0x004e, 0x7827, 0x1800, 0x080c, 0x2c38, 0x7824, 0x9084, -+ 0x1800, 0x1160, 0x9484, 0x0fff, 0x1138, 0x2001, 0x1810, 0x2004, -+ 0xd0fc, 0x0110, 0x080c, 0x0d45, 0x8421, 0x1158, 0x1d04, 0x0cda, -+ 0x080c, 0x85ad, 0x080c, 0x76ae, 0x080c, 0x76a4, 0x7003, 0x0001, -+ 0x04f0, 0x8319, 0x1948, 0x1d04, 0x0ce7, 0x080c, 0x85ad, 0x2009, -+ 0x199b, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, 0x1178, 0x200b, -+ 0x000a, 0x7827, 0x0048, 0x20a9, 0x0002, 0x080c, 0x2c19, 0x7924, -+ 0x080c, 0x2c38, 0xd19c, 0x0110, 0x080c, 0x2b59, 0x00d8, 0x080c, -+ 0x73cd, 0x1140, 0x94a2, 0x03e8, 0x1128, 0x080c, 0x7394, 0x7003, -+ 0x0001, 0x00a8, 0x7827, 0x1800, 0x080c, 0x2c38, 0x7824, 0x080c, -+ 0x73d6, 0x0110, 0xd0ac, 0x1158, 0x9084, 0x1800, 0x0950, 0x7003, -+ 0x0001, 0x0028, 0x2001, 0x0001, 0x080c, 0x27ea, 0x0078, 0x2009, -+ 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, 0x0002, 0x7906, -+ 0x7827, 0x0048, 0x7828, 0x9085, 0x0028, 0x782a, 0x7850, 0x9085, -+ 0x0400, 0x7852, 0x2001, 0x19a7, 0x2003, 0x0000, 0x9006, 0x78f2, -+ 0x015e, 0x003e, 0x000e, 0x080c, 0x56de, 0x1110, 0x080c, 0x0e62, -+ 0x012e, 0x00fe, 0x004e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0036, -+ 0x0046, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0069, -+ 0x0d0c, 0x85ad, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, -+ 0x004e, 0x003e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e, -+ 0x7004, 0x9086, 0x0001, 0x1110, 0x080c, 0x344c, 0x00ee, 0x0005, -+ 0x0005, 0x2a70, 0x2061, 0x19ab, 0x2063, 0x0003, 0x6007, 0x0002, -+ 0x600b, 0x001c, 0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102, -+ 0x7196, 0x2001, 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f, -+ 0xffff, 0x0008, 0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, -+ 0xcf81, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, -+ 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f, -+ 0x07d0, 0x2061, 0x1974, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, -+ 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, -+ 0x1989, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, -+ 0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x65ff, -+ 0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, -+ 0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, -+ 0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, -+ 0x2079, 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, -+ 0x0dd7, 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, 0x1aa2, 0x7a08, -+ 0x226a, 0x2069, 0x1aa3, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, -+ 0x782c, 0x2019, 0x1ab0, 0x201a, 0x2019, 0x1ab3, 0x9016, 0x7808, -+ 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1ac8, -+ 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, -+ 0x1ab1, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, -+ 0x1a82, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, -+ 0x8318, 0x1f04, 0x0e24, 0x002e, 0x003e, 0x00de, 0x015e, 0x2079, -+ 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, -+ 0xd084, 0x0180, 0x2001, 0x1a19, 0x2004, 0x9005, 0x0128, 0x2001, -+ 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, -+ 0x2003, 0x1001, 0x080c, 0x56de, 0x1110, 0x080c, 0x0e99, 0x0cd0, -+ 0x0005, 0x918c, 0x03ff, 0x2001, 0x0003, 0x2004, 0x9084, 0x0600, -+ 0x1118, 0x918d, 0x2800, 0x0010, 0x918d, 0x2000, 0x2001, 0x017f, -+ 0x2102, 0x0005, 0x00f6, 0x0006, 0x2079, 0x1827, 0x2f04, 0x8000, -+ 0x207a, 0x080c, 0x2c30, 0x1150, 0x0006, 0x2001, 0x1998, 0x2004, -+ 0xd0fc, 0x000e, 0x1118, 0x9082, 0x7530, 0x0010, 0x9082, 0x000f, -+ 0x0258, 0x9006, 0x207a, 0x2079, 0x182a, 0x2f04, 0x9084, 0x0001, -+ 0x9086, 0x0001, 0x207a, 0x0090, 0x2079, 0x182a, 0x2f7c, 0x8fff, -+ 0x1138, 0x0026, 0x2011, 0x0080, 0x080c, 0x0edf, 0x002e, 0x0030, -+ 0x0026, 0x2011, 0x0000, 0x080c, 0x0edf, 0x002e, 0x000e, 0x00fe, -+ 0x0005, 0x0026, 0x0126, 0x2011, 0x0080, 0x080c, 0x0edf, 0x20a9, -+ 0x0fff, 0x080c, 0x0f00, 0x2011, 0x0040, 0x04c9, 0x20a9, 0x0fff, -+ 0x080c, 0x0f00, 0x0c80, 0x7038, 0xd0b4, 0x1128, 0x0026, 0x2011, -+ 0x0040, 0x0469, 0x002e, 0x0005, 0x7038, 0xd0b4, 0x1128, 0x0026, -+ 0x2011, 0x0080, 0x0421, 0x002e, 0x0005, 0x0026, 0x70ef, 0x0000, -+ 0x0459, 0x1148, 0x080c, 0x2c30, 0x1118, 0x2011, 0x8484, 0x0058, -+ 0x2011, 0x8282, 0x0040, 0x080c, 0x2c30, 0x1118, 0x2011, 0xcdc5, -+ 0x0010, 0x2011, 0xcac2, 0x00e9, 0x002e, 0x0005, 0xd0b4, 0x0130, -+ 0x0006, 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x000e, 0x0005, 0x0016, -+ 0x3b08, 0x3a00, 0x9104, 0x918d, 0x00c0, 0x21d8, 0x9084, 0xff3f, -+ 0x9205, 0x20d0, 0x001e, 0x0005, 0x2001, 0x183a, 0x2004, 0xd0dc, -+ 0x0005, 0x9e86, 0x1800, 0x190c, 0x0dd5, 0x70e8, 0xd0e4, 0x0108, -+ 0xc2e5, 0x72ea, 0xd0e4, 0x1118, 0x9294, 0x00c0, 0x0c01, 0x0005, -+ 0x1d04, 0x0f00, 0x2091, 0x6000, 0x1f04, 0x0f00, 0x0005, 0x890e, -+ 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, 0xffc0, 0x0005, 0x0006, -+ 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, 0x000e, 0x0005, 0x01d6, -+ 0x0146, 0x0036, 0x0096, 0x2061, 0x188d, 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, 0x189d, 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, 0x0f07, 0x2100, 0x9300, 0x2098, -+ 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, 0x3518, 0x20a9, 0x0001, -+ 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, 0x003e, 0x0005, 0x20e9, -+ 0x0001, 0x71b8, 0x81ff, 0x11c0, 0x9006, 0x2009, 0x0200, 0x20a9, -+ 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, 0x2009, 0x0700, 0x20a9, -+ 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, 0x707c, 0x8007, 0x7180, -+ 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, 0x000c, 0x23a0, 0x900e, -+ 0x080c, 0x0db5, 0x2001, 0x0000, 0x810f, 0x20a9, 0x0002, 0x4001, -+ 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, 0x0000, 0x0006, 0x080c, -+ 0x1031, 0x009e, 0x0cb0, 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, -+ 0x10aa, 0x090c, 0x0dd5, 0x00ee, 0x0005, 0x0086, 0x00e6, 0x0006, -+ 0x0026, 0x0036, 0x0126, 0x2091, 0x8000, 0x00c9, 0x2071, 0x1800, -+ 0x73c0, 0x702c, 0x9016, 0x9045, 0x0158, 0x8210, 0x9906, 0x090c, -+ 0x0dd5, 0x2300, 0x9202, 0x0120, 0x1a0c, 0x0dd5, 0xa000, 0x0c98, -+ 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x0086, -+ 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x1910, 0x7010, -+ 0x9005, 0x0140, 0x7018, 0x9045, 0x0128, 0x9906, 0x090c, 0x0dd5, -+ 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee, 0x008e, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0x0126, 0x2091, 0x8000, 0x70c0, 0x8001, 0x0270, -+ 0x70c2, 0x702c, 0x2048, 0x9085, 0x0001, 0xa800, 0x702e, 0xa803, -+ 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, 0x0005, 0x904e, 0x0cd8, -+ 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x70c0, 0x90ca, -+ 0x0020, 0x0268, 0x8001, 0x70c2, 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, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8414, -+ 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, 0x188d, 0x7000, 0x9005, 0x11a0, 0x2001, -+ 0x0534, 0xa802, 0x2048, 0x2009, 0x4d00, 0x8940, 0x2800, 0xa802, -+ 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, 0x0800, 0x0120, 0x2848, -+ 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, 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, 0x74be, -+ 0x74c2, 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, 0x188d, 0x7010, 0x9902, 0x1228, 0x9085, -+ 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, 0x0cd8, 0x00e6, 0x2071, -+ 0x1a18, 0x7007, 0x0000, 0x9006, 0x701e, 0x7022, 0x7002, 0x2071, -+ 0x0000, 0x7010, 0x9085, 0x8044, 0x7012, 0x2071, 0x0080, 0x9006, -+ 0x20a9, 0x0040, 0x7022, 0x1f04, 0x10e2, 0x702b, 0x0020, 0x00ee, -+ 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0xa06f, 0x0000, 0x2071, -+ 0x1a18, 0x701c, 0x9088, 0x1a22, 0x280a, 0x8000, 0x9084, 0x003f, -+ 0x701e, 0x7120, 0x9106, 0x090c, 0x0dd5, 0x7004, 0x9005, 0x1128, -+ 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, 0x00ee, 0x012e, 0x0005, -+ 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, 0x1a18, 0x7004, 0x9005, -+ 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, 0x00fe, 0x00ee, 0x012e, -+ 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, 0x7007, 0x0006, 0x7000, -+ 0x0002, 0x112b, 0x12ae, 0x1129, 0x1129, 0x12a2, 0x12a2, 0x12a2, -+ 0x12a2, 0x080c, 0x0dd5, 0x701c, 0x7120, 0x9106, 0x1148, 0x792c, -+ 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, 0x7007, 0x0000, 0x0005, -+ 0x0096, 0x9180, 0x1a22, 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, 0x1a18, 0x2104, 0xc095, 0x200a, -+ 0x080c, 0x1108, 0x0005, 0x0016, 0x00e6, 0x2071, 0x1a18, 0x00f6, -+ 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, 0x0dce, 0x782b, 0x0002, -+ 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, 0x0023, 0x00fe, 0x00ee, -+ 0x001e, 0x0005, 0x1119, 0x11c1, 0x11f5, 0x12cd, 0x0dd5, 0x12e8, -+ 0x0dd5, 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, 0x115e, 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0100, -+ 0x009e, 0x7007, 0x0000, 0x080c, 0x1119, 0x0005, 0x7008, 0x0096, -+ 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, 0x918c, 0x0700, 0x1150, -+ 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, 0x7804, 0x7806, 0x080c, -+ 0x1173, 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, -+ 0x18b9, 0x2004, 0x9906, 0x1128, 0xa89c, 0x080f, 0x00de, 0x009e, -+ 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, 0x7008, 0x2048, 0x0081, -+ 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, 0x008e, 0x00de, 0x009e, -+ 0x080c, 0x1108, 0x0005, 0x00de, 0x009e, 0x080c, 0x1108, 0x0005, -+ 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, 0x904d, 0x090c, 0x0dd5, -+ 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, 0x0030, 0xa883, 0x0000, -+ 0xa897, 0x4002, 0x080c, 0x6c75, 0xa09f, 0x0000, 0xa0a3, 0x0000, -+ 0x2848, 0x080c, 0x1031, 0x009e, 0x0005, 0x00a6, 0xa0a0, 0x904d, -+ 0x090c, 0x0dd5, 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, 0x10e9, 0x00e8, 0xa97c, 0xa894, 0x0016, 0x0006, 0x080c, -+ 0x6c75, 0x000e, 0x001e, 0xd1fc, 0x1138, 0xd1f4, 0x0128, 0x00c6, -+ 0x2060, 0x080c, 0xae61, 0x00ce, 0x7008, 0x2048, 0xa89f, 0x0000, -+ 0xa8a3, 0x0000, 0x080c, 0x1031, 0x7007, 0x0000, 0x080c, 0x1108, -+ 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, 0x782b, 0x1001, 0x7007, -+ 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, 0x0005, 0x0096, 0x2001, -+ 0x192e, 0x204c, 0xa87c, 0x7812, 0xa88c, 0x7802, 0xa890, 0x7806, -+ 0xa894, 0x780a, 0xa898, 0x780e, 0x782b, 0x0020, 0x0126, 0x2091, -+ 0x8000, 0x782b, 0x0041, 0x7007, 0x0003, 0x7000, 0xc084, 0x7002, -+ 0x2900, 0x700a, 0x012e, 0x009e, 0x0005, 0x20e1, 0x0000, 0x2099, -+ 0x0088, 0x782b, 0x0040, 0x0096, 0x2001, 0x192e, 0x204c, 0xaa7c, -+ 0x009e, 0x080c, 0x8a0c, 0x2009, 0x188c, 0x2104, 0x9084, 0xfffc, -+ 0x200a, 0x080c, 0x887f, 0x7007, 0x0000, 0x080c, 0x1119, 0x0005, -+ 0x7007, 0x0000, 0x080c, 0x1119, 0x0005, 0x0126, 0x2091, 0x2200, -+ 0x2079, 0x0300, 0x2071, 0x1a62, 0x7003, 0x0000, 0x78bf, 0x00f6, -+ 0x781b, 0x4800, 0x00c1, 0x7803, 0x0003, 0x780f, 0x0000, 0x20a9, -+ 0x03d0, 0x2061, 0xea18, 0x2c0d, 0x7912, 0xe104, 0x9ce0, 0x0002, -+ 0x7916, 0x1f04, 0x1303, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, -+ 0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x7808, 0xd09c, -+ 0x0120, 0x7820, 0x080c, 0x1362, 0x0cc8, 0x2001, 0x1a63, 0x2003, -+ 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, 0x0002, -+ 0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, 0x0031, -+ 0x782b, 0x1a82, 0x781f, 0xff00, 0x781b, 0xb700, 0x2001, 0x0200, -+ 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a82, 0x602f, -+ 0x1cd0, 0x2001, 0x181a, 0x2004, 0x9082, 0x1cd0, 0x6032, 0x603b, -+ 0x2090, 0x2001, 0x3325, 0xd0fc, 0x190c, 0x0dd5, 0x2001, 0x0003, -+ 0x2004, 0xd0d4, 0x1118, 0x783f, 0x3325, 0x0020, 0x9084, 0xc000, -+ 0x783f, 0xb325, 0x604f, 0x193c, 0x2001, 0x1927, 0x2004, 0x6042, -+ 0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0, 0x7808, 0xd09c, 0x01b8, -+ 0x7820, 0x0026, 0x2010, 0x080c, 0xcb23, 0x0180, 0x2260, 0x6000, -+ 0x9086, 0x0004, 0x1158, 0x0016, 0x6120, 0x9186, 0x0009, 0x0108, -+ 0x0020, 0x2009, 0x004c, 0x080c, 0xaedc, 0x001e, 0x002e, 0x0005, -+ 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, 0x190c, 0x0dce, -+ 0xd19c, 0x0158, 0x7820, 0x908c, 0xf000, 0x15e8, 0x908a, 0x0024, -+ 0x1a0c, 0x0dd5, 0x0023, 0x012e, 0x0005, 0x012e, 0x0005, 0x13bb, -+ 0x13bb, 0x13d2, 0x13d7, 0x13db, 0x13e0, 0x1408, 0x140c, 0x141a, -+ 0x141e, 0x13bb, 0x14e9, 0x14ed, 0x1552, 0x1559, 0x13bb, 0x155a, -+ 0x155b, 0x1566, 0x156d, 0x13bb, 0x13bb, 0x13bb, 0x13bb, 0x13bb, -+ 0x13bb, 0x13bb, 0x13e2, 0x13bb, 0x13bb, 0x13bb, 0x13bb, 0x13bb, -+ 0x13bb, 0x13bf, 0x13bd, 0x080c, 0x0dd5, 0x080c, 0x0dce, 0x080c, -+ 0x1578, 0x2009, 0x1a7b, 0x2104, 0x8000, 0x200a, 0x080c, 0x7e56, -+ 0x080c, 0x1aa9, 0x0005, 0x2009, 0x0048, 0x2060, 0x080c, 0xaedc, -+ 0x012e, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, 0x0005, 0x7004, -+ 0xc085, 0x7006, 0x0005, 0x080c, 0x1578, 0x080c, 0x16bb, 0x0005, -+ 0x080c, 0x0dd5, 0x080c, 0x1578, 0x2060, 0x6014, 0x0096, 0x2048, -+ 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, 0xaedc, 0x2001, -+ 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, 0x0160, 0x2001, -+ 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, -+ 0x1110, 0x080c, 0x157d, 0x2001, 0x0307, 0x2003, 0x8000, 0x0005, -+ 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x1578, 0x2060, 0x6014, -+ 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, -+ 0xaedc, 0x0005, 0x080c, 0x1578, 0x080c, 0x0dd5, 0x080c, 0x1578, -+ 0x080c, 0x14d4, 0x7827, 0x0018, 0x79ac, 0xd1dc, 0x0904, 0x1487, -+ 0x7827, 0x0015, 0x7828, 0x782b, 0x0000, 0x9065, 0x0140, 0x2001, -+ 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x148d, 0x7004, -+ 0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004, 0x7827, 0x0018, 0x782b, -+ 0x0000, 0xd1bc, 0x090c, 0x0dd5, 0x2001, 0x020d, 0x2003, 0x0050, -+ 0x2003, 0x0020, 0x0804, 0x14b9, 0x78ab, 0x0004, 0x7803, 0x0001, -+ 0x080c, 0x14ed, 0x0005, 0x7827, 0x0018, 0xa001, 0x7828, 0x7827, -+ 0x0011, 0xa001, 0x7928, 0x9106, 0x0110, 0x79ac, 0x08e0, 0x00e6, -+ 0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140, 0x00ee, 0x080c, 0x1aa9, -+ 0x080c, 0x1313, 0x7803, 0x0001, 0x0005, 0x7037, 0x0001, 0xa001, -+ 0x7150, 0x00ee, 0x918c, 0xff00, 0x9186, 0x0500, 0x0110, 0x79ac, -+ 0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab, 0x0004, 0x7803, 0x0001, -+ 0x080c, 0x14ed, 0x2001, 0x020d, 0x2003, 0x0020, 0x0005, 0x7828, -+ 0x782b, 0x0000, 0x9065, 0x090c, 0x0dd5, 0x6014, 0x2048, 0x78ab, -+ 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x7e56, 0x080c, 0x1aa9, -+ 0x080c, 0xcb35, 0x0158, 0xa9ac, 0xa936, 0xa9b0, 0xa93a, 0xa83f, -+ 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, 0x0005, 0x6020, -+ 0x9086, 0x0009, 0x1128, 0x2009, 0x004c, 0x080c, 0xaedc, 0x0048, -+ 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, 0x190c, -+ 0xcf1a, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, 0x2004, -+ 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xe9c1, 0xd5a4, 0x1118, 0x080c, -+ 0x157d, 0x0005, 0x080c, 0x7e56, 0x080c, 0x1aa9, 0x0005, 0x781f, -+ 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, 0x00f6, -+ 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, 0x0120, -+ 0x2001, 0x0016, 0x080c, 0x15ee, 0x00fe, 0x007e, 0x006e, 0x001e, -+ 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, 0x0004, -+ 0x190c, 0x0dd5, 0xd184, 0x1189, 0xd19c, 0x0158, 0xc19c, 0x7106, -+ 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, 0x157d, -+ 0x0005, 0x81ff, 0x190c, 0x0dd5, 0x0005, 0xc184, 0xd1b4, 0xc1b4, -+ 0x7106, 0x0016, 0x00e6, 0x15f0, 0x2071, 0x0200, 0x080c, 0x16a8, -+ 0x05c8, 0x6014, 0x9005, 0x05b0, 0x0096, 0x2048, 0xa864, 0x009e, -+ 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1550, -+ 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78, 0x080c, 0x1725, 0x00fe, -+ 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x18ac, 0x00fe, 0x2009, 0x01f4, -+ 0x8109, 0x0168, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, -+ 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c, 0x157d, 0x0040, 0x2001, -+ 0x020d, 0x2003, 0x0020, 0x080c, 0x1313, 0x7803, 0x0001, 0x00ee, -+ 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, -+ 0x0461, 0x0ca8, 0x0429, 0x2060, 0x2009, 0x0053, 0x080c, 0xaedc, -+ 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, 0x00d1, 0x0006, 0x7004, -+ 0xc09d, 0x7006, 0x000e, 0x080c, 0x8d69, 0x0005, 0x0089, 0x9005, -+ 0x0118, 0x080c, 0x896c, 0x0cd0, 0x0005, 0x2001, 0x0036, 0x2009, -+ 0x1820, 0x210c, 0x2011, 0x181f, 0x2214, 0x080c, 0x15ee, 0x0005, -+ 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x14d4, 0x00d6, -+ 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510, 0x6804, 0x9005, -+ 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1528, -+ 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841, 0x1268, 0x9188, -+ 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, 0x080c, 0x15e0, -+ 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1, -+ 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005, -+ 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, 0x7e56, 0x080c, -+ 0x1aa9, 0x0090, 0x7827, 0x0015, 0x782b, 0x0000, 0x7827, 0x0018, -+ 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307, -+ 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084, -+ 0x5400, 0x9086, 0x5400, 0x0d30, 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, 0x1380, 0x00ce, 0x002e, 0x001e, 0x000e, 0x0006, 0x7832, -+ 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe, -+ 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0dd5, -+ 0x2009, 0x180c, 0x2104, 0xc0f4, 0x200a, 0x2009, 0xff00, 0x8109, -+ 0x0904, 0x166c, 0x7a18, 0x9284, 0x0030, 0x0904, 0x1667, 0x9284, -+ 0x0048, 0x9086, 0x0008, 0x1904, 0x1667, 0x2001, 0x0109, 0x2004, -+ 0xd08c, 0x01f0, 0x0006, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x0126, 0x2091, 0x2800, 0x00f6, 0x0026, 0x0016, 0x2009, 0x1a7d, -+ 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x90a2, 0x001e, 0x002e, -+ 0x00fe, 0x012e, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x000e, -+ 0x2001, 0x009b, 0x2004, 0xd0fc, 0x01d0, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x00f6, 0x0016, 0x2009, 0x1a7e, -+ 0x2104, 0x8000, 0x0208, 0x200a, 0x080c, 0x1eb4, 0x001e, 0x00fe, -+ 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, 0x7818, -+ 0xd0bc, 0x1904, 0x1617, 0x0005, 0x2001, 0x180c, 0x2004, 0xd0f4, -+ 0x1528, 0x7a18, 0x9284, 0x0030, 0x0508, 0x9284, 0x0048, 0x9086, -+ 0x0008, 0x11e0, 0x2001, 0x19f6, 0x2004, 0x9005, 0x01b8, 0x2001, -+ 0x1a66, 0x2004, 0x9086, 0x0000, 0x0188, 0x2009, 0x1a7c, 0x2104, -+ 0x8000, 0x0208, 0x200a, 0x080c, 0xa2f7, 0x2009, 0x180c, 0x2104, -+ 0xc0f5, 0x200a, 0x2009, 0xff00, 0x0804, 0x1617, 0x9085, 0x0001, -+ 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x080c, 0x1610, -+ 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0dd5, -+ 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, 0xd1bc, -+ 0x1110, 0x7054, 0x2060, 0x918c, 0xff00, 0x9186, 0x0500, 0x0110, -+ 0x9085, 0x0001, 0x0005, 0x00e6, 0x0016, 0x2071, 0x0200, 0x0c41, -+ 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904, 0x171a, 0x7017, -+ 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904, 0x171a, 0x2001, -+ 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce, 0x918e, 0x0039, -+ 0x1904, 0x171a, 0x9c06, 0x15f0, 0x0126, 0x2091, 0x2600, 0x080c, -+ 0x7d9d, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d, 0x0598, 0x2b48, -+ 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x190c, 0xcef5, -+ 0xab42, 0xac3e, 0x2001, 0x1869, 0x2004, 0xd0b4, 0x1170, 0x601c, -+ 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, -+ 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, 0x20b0, 0x1190, -+ 0x080c, 0x1907, 0x2a00, 0xa816, 0x0130, 0x2800, 0xa80e, 0x2c05, -+ 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, 0x0300, 0x001e, -+ 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, 0x001e, 0x00ee, -+ 0x080c, 0x157d, 0x0005, 0x080c, 0x0dd5, 0x2ff0, 0x0126, 0x2091, -+ 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0x903e, 0x2730, -+ 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, 0x9088, 0x2090, 0x2165, -+ 0x0002, 0x1750, 0x17be, 0x1750, 0x1750, 0x1754, 0x179f, 0x1750, -+ 0x1774, 0x1749, 0x17b5, 0x1750, 0x1750, 0x1759, 0x18aa, 0x1788, -+ 0x177e, 0xa964, 0x918c, 0x00ff, 0x918e, 0x0048, 0x0904, 0x17b5, -+ 0x9085, 0x0001, 0x0804, 0x18a1, 0xa87c, 0xd0ac, 0x0dc8, 0x0804, -+ 0x17c5, 0xa87c, 0xd0ac, 0x0da0, 0x0804, 0x1830, 0xa898, 0x901d, -+ 0x1108, 0xab9c, 0x9016, 0xaab2, 0xaa3e, 0xaa42, 0x3e00, 0x9080, -+ 0x0008, 0x2004, 0x9080, 0x8f30, 0x2005, 0x9005, 0x090c, 0x0dd5, -+ 0x2004, 0xa8ae, 0x0804, 0x1889, 0xa87c, 0xd0bc, 0x09c8, 0xa890, -+ 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x17c5, 0xa87c, 0xd0bc, -+ 0x0978, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, 0x1830, -+ 0xa87c, 0xd0bc, 0x0928, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa804, -+ 0x9045, 0x090c, 0x0dd5, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, -+ 0x2090, 0x2065, 0xa888, 0xd19c, 0x1904, 0x1830, 0x0430, 0xa87c, -+ 0xd0ac, 0x0904, 0x1750, 0xa804, 0x9045, 0x090c, 0x0dd5, 0xa164, -+ 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x2090, 0x2065, 0x9006, 0xa842, -+ 0xa83e, 0xd19c, 0x1904, 0x1830, 0x0080, 0xa87c, 0xd0ac, 0x0904, -+ 0x1750, 0x9006, 0xa842, 0xa83e, 0x0804, 0x1830, 0xa87c, 0xd0ac, -+ 0x0904, 0x1750, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0036, -+ 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x17e8, 0x17e8, 0x17ea, -+ 0x17e8, 0x17e8, 0x17e8, 0x17f4, 0x17e8, 0x17e8, 0x17e8, 0x17fe, -+ 0x17e8, 0x17e8, 0x17e8, 0x1808, 0x17e8, 0x17e8, 0x17e8, 0x1812, -+ 0x17e8, 0x17e8, 0x17e8, 0x181c, 0x17e8, 0x17e8, 0x17e8, 0x1826, -+ 0x080c, 0x0dd5, 0xa574, 0xa478, 0x9d86, 0x0024, 0x0904, 0x175e, -+ 0xa37c, 0xa280, 0x0804, 0x1889, 0xa584, 0xa488, 0x9d86, 0x0024, -+ 0x0904, 0x175e, 0xa38c, 0xa290, 0x0804, 0x1889, 0xa594, 0xa498, -+ 0x9d86, 0x0024, 0x0904, 0x175e, 0xa39c, 0xa2a0, 0x0804, 0x1889, -+ 0xa5a4, 0xa4a8, 0x9d86, 0x0024, 0x0904, 0x175e, 0xa3ac, 0xa2b0, -+ 0x0804, 0x1889, 0xa5b4, 0xa4b8, 0x9d86, 0x0024, 0x0904, 0x175e, -+ 0xa3bc, 0xa2c0, 0x0804, 0x1889, 0xa5c4, 0xa4c8, 0x9d86, 0x0024, -+ 0x0904, 0x175e, 0xa3cc, 0xa2d0, 0x0804, 0x1889, 0xa5d4, 0xa4d8, -+ 0x9d86, 0x0024, 0x0904, 0x175e, 0xa3dc, 0xa2e0, 0x0804, 0x1889, -+ 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, -+ 0x1853, 0x1851, 0x1851, 0x1851, 0x1851, 0x1851, 0x185e, 0x1851, -+ 0x1851, 0x1851, 0x1851, 0x1851, 0x1869, 0x1851, 0x1851, 0x1851, -+ 0x1851, 0x1851, 0x1874, 0x1851, 0x1851, 0x1851, 0x1851, 0x1851, -+ 0x187f, 0x080c, 0x0dd5, 0xa56c, 0xa470, 0xa774, 0xa678, 0x9d86, -+ 0x002c, 0x0904, 0x175e, 0xa37c, 0xa280, 0x0458, 0xa584, 0xa488, -+ 0xa78c, 0xa690, 0x9d86, 0x002c, 0x0904, 0x175e, 0xa394, 0xa298, -+ 0x0400, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x002c, 0x0904, -+ 0x175e, 0xa3ac, 0xa2b0, 0x00a8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, -+ 0x9d86, 0x002c, 0x0904, 0x175e, 0xa3c4, 0xa2c8, 0x0050, 0xa5cc, -+ 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x002c, 0x0904, 0x175e, 0xa3dc, -+ 0xa2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, -+ 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x8109, 0xa916, -+ 0x1158, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, -+ 0x9006, 0x00ce, 0x012e, 0x0005, 0x2800, 0xa80e, 0xab0a, 0x2c00, -+ 0xa812, 0x0c78, 0x0804, 0x1750, 0x2ff0, 0x0126, 0x2091, 0x2200, -+ 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, 0xa80e, 0x2061, 0x208b, -+ 0xa813, 0x208b, 0x2c05, 0xa80a, 0xa964, 0xa91a, 0xa87c, 0xd0ac, -+ 0x090c, 0x0dd5, 0x9006, 0xa842, 0xa83e, 0x2c05, 0x908a, 0x0034, -+ 0x1a0c, 0x0dd5, 0xadcc, 0xacd0, 0xafd4, 0xaed8, 0xabdc, 0xaae0, -+ 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa8ac, 0xaab0, -+ 0xa836, 0xaa3a, 0xa988, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0008, -+ 0x1120, 0x8109, 0xa916, 0x0128, 0x0078, 0x918a, 0x0002, 0xa916, -+ 0x1158, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, 0xc0dd, 0xa87e, -+ 0x9006, 0x00ce, 0x012e, 0x0005, 0xa804, 0x9045, 0x090c, 0x0dd5, -+ 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, 0x9080, 0x2090, 0x2015, -+ 0x82ff, 0x090c, 0x0dd5, 0xaa12, 0x2205, 0xa80a, 0x0c10, 0x903e, -+ 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, 0x1a31, 0x195e, -+ 0x195e, 0x1a31, 0x195e, 0x1a2b, 0x1a31, 0x195e, 0x19ce, 0x19ce, -+ 0x19ce, 0x1a31, 0x19ce, 0x1a31, 0x1a28, 0x19ce, 0xc0fc, 0xa882, -+ 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, 0x1a33, 0x2c05, -+ 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x194a, -+ 0x1948, 0x1948, 0x1948, 0x1948, 0x1948, 0x194e, 0x1948, 0x1948, -+ 0x1948, 0x1948, 0x1948, 0x1952, 0x1948, 0x1948, 0x1948, 0x1948, -+ 0x1948, 0x1956, 0x1948, 0x1948, 0x1948, 0x1948, 0x1948, 0x195a, -+ 0x080c, 0x0dd5, 0xa774, 0xa678, 0x0804, 0x1a33, 0xa78c, 0xa690, -+ 0x0804, 0x1a33, 0xa7a4, 0xa6a8, 0x0804, 0x1a33, 0xa7bc, 0xa6c0, -+ 0x0804, 0x1a33, 0xa7d4, 0xa6d8, 0x0804, 0x1a33, 0xa898, 0x901d, -+ 0x1108, 0xab9c, 0x9016, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5, -+ 0x9082, 0x001b, 0x0002, 0x1986, 0x1986, 0x1988, 0x1986, 0x1986, -+ 0x1986, 0x1992, 0x1986, 0x1986, 0x1986, 0x199c, 0x1986, 0x1986, -+ 0x1986, 0x19a6, 0x1986, 0x1986, 0x1986, 0x19b0, 0x1986, 0x1986, -+ 0x1986, 0x19ba, 0x1986, 0x1986, 0x1986, 0x19c4, 0x080c, 0x0dd5, -+ 0xa574, 0xa478, 0x9d86, 0x0004, 0x0904, 0x1a33, 0xa37c, 0xa280, -+ 0x0804, 0x1a33, 0xa584, 0xa488, 0x9d86, 0x0004, 0x0904, 0x1a33, -+ 0xa38c, 0xa290, 0x0804, 0x1a33, 0xa594, 0xa498, 0x9d86, 0x0004, -+ 0x0904, 0x1a33, 0xa39c, 0xa2a0, 0x0804, 0x1a33, 0xa5a4, 0xa4a8, -+ 0x9d86, 0x0004, 0x0904, 0x1a33, 0xa3ac, 0xa2b0, 0x0804, 0x1a33, -+ 0xa5b4, 0xa4b8, 0x9d86, 0x0004, 0x0904, 0x1a33, 0xa3bc, 0xa2c0, -+ 0x0804, 0x1a33, 0xa5c4, 0xa4c8, 0x9d86, 0x0004, 0x0904, 0x1a33, -+ 0xa3cc, 0xa2d0, 0x0804, 0x1a33, 0xa5d4, 0xa4d8, 0x9d86, 0x0004, -+ 0x0904, 0x1a33, 0xa3dc, 0xa2e0, 0x0804, 0x1a33, 0xa898, 0x901d, -+ 0x1108, 0xab9c, 0x9016, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, -+ 0x9082, 0x001b, 0x0002, 0x19f6, 0x19f4, 0x19f4, 0x19f4, 0x19f4, -+ 0x19f4, 0x1a00, 0x19f4, 0x19f4, 0x19f4, 0x19f4, 0x19f4, 0x1a0a, -+ 0x19f4, 0x19f4, 0x19f4, 0x19f4, 0x19f4, 0x1a14, 0x19f4, 0x19f4, -+ 0x19f4, 0x19f4, 0x19f4, 0x1a1e, 0x080c, 0x0dd5, 0xa56c, 0xa470, -+ 0xa774, 0xa678, 0x9d86, 0x000c, 0x05b0, 0xa37c, 0xa280, 0x0498, -+ 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x000c, 0x0560, 0xa394, -+ 0xa298, 0x0448, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0x9d86, 0x000c, -+ 0x0510, 0xa3ac, 0xa2b0, 0x00f8, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, -+ 0x9d86, 0x000c, 0x01c0, 0xa3c4, 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, -+ 0xa7d4, 0xa6d8, 0x9d86, 0x000c, 0x0170, 0xa3dc, 0xa2e0, 0x0058, -+ 0x9d86, 0x000e, 0x1130, 0x080c, 0x2048, 0x1904, 0x1907, 0x900e, -+ 0x0050, 0x080c, 0x0dd5, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, -+ 0xae2a, 0x080c, 0x2048, 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, 0xaedc, 0x0005, 0x0126, 0x00c6, -+ 0x2091, 0x2200, 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, -+ 0x05b0, 0x9186, 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, -+ 0x2031, 0x0008, 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, -+ 0x080c, 0x1380, 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, -+ 0x0168, 0x00c6, 0x7808, 0xd09c, 0x190c, 0x1380, 0x00ce, 0x2001, -+ 0x0038, 0x080c, 0x1b36, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, -+ 0x0042, 0x190c, 0x0dd5, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, -+ 0x1d40, 0x080c, 0x1b45, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, -+ 0x1b32, 0x7827, 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, -+ 0x0ca0, 0x00f6, 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, -+ 0x00fe, 0x080c, 0x73bc, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, -+ 0x2001, 0x0160, 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, -+ 0x8211, 0x1de0, 0x0081, 0x0066, 0x2031, 0x0000, 0x080c, 0x746c, -+ 0x006e, 0x0005, 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, -+ 0x0138, 0x2202, 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2c44, -+ 0x2009, 0x003c, 0x080c, 0x23d2, 0x2001, 0x015d, 0x2003, 0x0000, -+ 0x7000, 0x9084, 0x003c, 0x1de0, 0x080c, 0x8414, 0x70a0, 0x70a2, -+ 0x7098, 0x709a, 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, -+ 0x00f6, 0x2079, 0x0300, 0x080c, 0x1313, 0x7803, 0x0001, 0x00fe, -+ 0x00ee, 0x0005, 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, -+ 0x0160, 0x202c, 0x2003, 0x0000, 0x080c, 0x73bc, 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, 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, -+ 0x080c, 0x15ee, 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1699, -+ 0x7930, 0x0005, 0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, -+ 0x9084, 0x0007, 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, -+ 0x0904, 0x1ba3, 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, -+ 0x0dd5, 0x781f, 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, -+ 0x0b10, 0x0c01, 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, -+ 0x0030, 0x0891, 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, -+ 0x781f, 0x0101, 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, -+ 0x9186, 0x0040, 0x0140, 0x2001, 0x0030, 0x080c, 0x1b3c, 0x9186, -+ 0x0040, 0x190c, 0x0dd5, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, -+ 0x1170, 0xd1c4, 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, -+ 0x6802, 0x00de, 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, -+ 0x781f, 0x0100, 0x791c, 0x9184, 0x0007, 0x090c, 0x0dd5, 0xa001, -+ 0xa001, 0x781f, 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2071, -+ 0x1a66, 0x2079, 0x0090, 0x012e, 0x0005, 0x9280, 0x0005, 0x2004, -+ 0x2048, 0xa97c, 0xd1dc, 0x1904, 0x1c45, 0xa964, 0x9184, 0x0007, -+ 0x0002, 0x1bc1, 0x1c30, 0x1bd8, 0x1bda, 0x1bd8, 0x1c18, 0x1bf8, -+ 0x1be7, 0x918c, 0x00ff, 0x9186, 0x0008, 0x1170, 0xa87c, 0xd0b4, -+ 0x0904, 0x1e6f, 0x9006, 0xa842, 0xa83e, 0xa988, 0x2900, 0xa85a, -+ 0xa813, 0x208b, 0x0804, 0x1c41, 0x9186, 0x0048, 0x0904, 0x1c30, -+ 0x080c, 0x0dd5, 0x9184, 0x00ff, 0x9086, 0x0013, 0x0904, 0x1c30, -+ 0x9184, 0x00ff, 0x9086, 0x001b, 0x0904, 0x1c30, 0x0c88, 0xa87c, -+ 0xd0b4, 0x0904, 0x1e6f, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, -+ 0xa836, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa988, 0x0804, 0x1c38, -+ 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x19d0, 0xa87c, 0xd0b4, -+ 0x0904, 0x1e6f, 0xa890, 0xa842, 0xa83a, 0xa88c, 0xa83e, 0xa836, -+ 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0xa804, 0xa85a, 0x2040, 0xa064, -+ 0x9084, 0x000f, 0x9080, 0x2090, 0x2005, 0xa812, 0xa988, 0x0448, -+ 0x918c, 0x00ff, 0x9186, 0x0015, 0x1540, 0xa87c, 0xd0b4, 0x0904, -+ 0x1e6f, 0xa804, 0xa85a, 0x2040, 0xa064, 0x9084, 0x000f, 0x9080, -+ 0x2090, 0x2005, 0xa812, 0xa988, 0x9006, 0xa842, 0xa83e, 0x0088, -+ 0xa87c, 0xd0b4, 0x0904, 0x1e6f, 0xa988, 0x9006, 0xa842, 0xa83e, -+ 0x2900, 0xa85a, 0xa864, 0x9084, 0x000f, 0x9080, 0x2090, 0x2005, -+ 0xa812, 0xa916, 0xa87c, 0xc0dd, 0xa87e, 0x0005, 0x00f6, 0x2079, -+ 0x0090, 0x782c, 0xd0fc, 0x190c, 0x1eb4, 0x00e6, 0x2071, 0x1a66, -+ 0x7000, 0x9005, 0x1904, 0x1cae, 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, -+ 0x1500, 0xa93c, 0xa834, 0x9106, 0x11e0, 0x0006, 0x0016, 0xa938, -+ 0xa834, 0x9105, 0x0118, 0x001e, 0x000e, 0x0098, 0x001e, 0x000e, -+ 0x8aff, 0x01c8, 0x0126, 0x2091, 0x8000, 0x2009, 0x0306, 0x200b, -+ 0x0808, 0x00d9, 0x0108, 0x00c9, 0x012e, 0x9006, 0x00ee, 0x00fe, -+ 0x0005, 0x0036, 0x0046, 0xab38, 0xac34, 0x080c, 0x20b0, 0x004e, -+ 0x003e, 0x0d30, 0x0c98, 0x9085, 0x0001, 0x0c80, 0x2009, 0x0306, -+ 0x200b, 0x4800, 0x7027, 0x0000, 0x0005, 0x0076, 0x0066, 0x0056, -+ 0x0046, 0x0036, 0x0026, 0x8aff, 0x0904, 0x1e68, 0x700c, 0x7214, -+ 0x923a, 0x7010, 0x7218, 0x9203, 0x0a04, 0x1e67, 0x9705, 0x0904, -+ 0x1e67, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, 0x0002, -+ 0x1df1, 0x1d30, 0x1d30, 0x1df1, 0x1df1, 0x1dce, 0x1df1, 0x1d30, -+ 0x1dd5, 0x1d7f, 0x1d7f, 0x1df1, 0x1df1, 0x1df1, 0x1dc8, 0x1d7f, -+ 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, 0x0904, -+ 0x1dfe, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, -+ 0x0002, 0x1d1c, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d20, -+ 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d24, 0x1d1a, 0x1d1a, -+ 0x1d1a, 0x1d1a, 0x1d1a, 0x1d28, 0x1d1a, 0x1d1a, 0x1d1a, 0x1d1a, -+ 0x1d1a, 0x1d2c, 0x080c, 0x0dd5, 0xa774, 0xa678, 0x0804, 0x1dfe, -+ 0xa78c, 0xa690, 0x0804, 0x1dfe, 0xa7a4, 0xa6a8, 0x0804, 0x1dfe, -+ 0xa7bc, 0xa6c0, 0x0804, 0x1dfe, 0xa7d4, 0xa6d8, 0x0804, 0x1dfe, -+ 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, -+ 0x1d53, 0x1d53, 0x1d55, 0x1d53, 0x1d53, 0x1d53, 0x1d5b, 0x1d53, -+ 0x1d53, 0x1d53, 0x1d61, 0x1d53, 0x1d53, 0x1d53, 0x1d67, 0x1d53, -+ 0x1d53, 0x1d53, 0x1d6d, 0x1d53, 0x1d53, 0x1d53, 0x1d73, 0x1d53, -+ 0x1d53, 0x1d53, 0x1d79, 0x080c, 0x0dd5, 0xa574, 0xa478, 0xa37c, -+ 0xa280, 0x0804, 0x1dfe, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, -+ 0x1dfe, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x1dfe, 0xa5a4, -+ 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x1dfe, 0xa5b4, 0xa4b8, 0xa3bc, -+ 0xa2c0, 0x0804, 0x1dfe, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, -+ 0x1dfe, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x1dfe, 0x2c05, -+ 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1da2, -+ 0x1da0, 0x1da0, 0x1da0, 0x1da0, 0x1da0, 0x1daa, 0x1da0, 0x1da0, -+ 0x1da0, 0x1da0, 0x1da0, 0x1db2, 0x1da0, 0x1da0, 0x1da0, 0x1da0, -+ 0x1da0, 0x1dba, 0x1da0, 0x1da0, 0x1da0, 0x1da0, 0x1da0, 0x1dc1, -+ 0x080c, 0x0dd5, 0xa56c, 0xa470, 0xa774, 0xa678, 0xa37c, 0xa280, -+ 0x0804, 0x1dfe, 0xa584, 0xa488, 0xa78c, 0xa690, 0xa394, 0xa298, -+ 0x0804, 0x1dfe, 0xa59c, 0xa4a0, 0xa7a4, 0xa6a8, 0xa3ac, 0xa2b0, -+ 0x0804, 0x1dfe, 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0xa3c4, 0xa2c8, -+ 0x04e8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0xa3dc, 0xa2e0, 0x04b0, -+ 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x1518, 0x080c, 0x2048, -+ 0x1904, 0x1ccb, 0x900e, 0x0804, 0x1e68, 0xab64, 0x939c, 0x00ff, -+ 0x9386, 0x0048, 0x1180, 0x00c6, 0x7004, 0x2060, 0x6004, 0x9086, -+ 0x0043, 0x00ce, 0x0904, 0x1d7f, 0xab9c, 0x9016, 0xad8c, 0xac90, -+ 0xaf94, 0xae98, 0x0098, 0x9386, 0x0008, 0x0904, 0x1d7f, 0x080c, -+ 0x0dd5, 0xa964, 0x918c, 0x00ff, 0x9186, 0x0013, 0x0904, 0x1d30, -+ 0x9186, 0x001b, 0x0904, 0x1d7f, 0x080c, 0x0dd5, 0x2009, 0x030f, -+ 0x2104, 0xd0fc, 0x0530, 0x0066, 0x2009, 0x0306, 0x2104, 0x9084, -+ 0x0030, 0x15c8, 0x2031, 0x1000, 0x200b, 0x4000, 0x2600, 0x9302, -+ 0x928b, 0x0000, 0xa82e, 0xa932, 0x0278, 0x9105, 0x0168, 0x2011, -+ 0x0000, 0x2618, 0x2600, 0x9500, 0xa81e, 0x9481, 0x0000, 0xa822, -+ 0xa880, 0xc0fd, 0xa882, 0x0020, 0xa82f, 0x0000, 0xa833, 0x0000, -+ 0x006e, 0x7b12, 0x7a16, 0x7d02, 0x7c06, 0x7f0a, 0x7e0e, 0x782b, -+ 0x0001, 0x7000, 0x8000, 0x7002, 0xa83c, 0x9300, 0xa83e, 0xa840, -+ 0x9201, 0xa842, 0x700c, 0x9300, 0x700e, 0x7010, 0x9201, 0x7012, -+ 0x080c, 0x2048, 0x0428, 0x2031, 0x0080, 0x9584, 0x007f, 0x0108, -+ 0x9632, 0x7124, 0x7000, 0x9086, 0x0000, 0x1198, 0xc185, 0x7126, -+ 0x2009, 0x0306, 0x2104, 0xd0b4, 0x1904, 0x1e0e, 0x200b, 0x4040, -+ 0x2009, 0x1a7f, 0x2104, 0x8000, 0x0a04, 0x1e0e, 0x200a, 0x0804, -+ 0x1e0e, 0xc18d, 0x7126, 0xd184, 0x1d58, 0x0804, 0x1e0e, 0x9006, -+ 0x002e, 0x003e, 0x004e, 0x005e, 0x006e, 0x007e, 0x0005, 0x080c, -+ 0x0dd5, 0x0026, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, 0x0004, -+ 0x7003, 0x0000, 0x7004, 0x0016, 0x080c, 0x1cbe, 0x001e, 0x2060, -+ 0x6014, 0x2048, 0x080c, 0xcb35, 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, 0xc768, 0x00ce, -+ 0x2001, 0x19f6, 0x2004, 0x9c06, 0x1160, 0x2009, 0x0040, 0x080c, -+ 0x23d2, 0x080c, 0xa7cc, 0x2011, 0x0000, 0x080c, 0xa65d, 0x080c, -+ 0x97b9, 0x002e, 0x0804, 0x1ff8, 0x0126, 0x2091, 0x2400, 0xa858, -+ 0x2040, 0x792c, 0x782b, 0x0002, 0x9184, 0x0700, 0x1904, 0x1e71, -+ 0x7000, 0x0002, 0x1ff8, 0x1ec6, 0x1f46, 0x1ff6, 0x8001, 0x7002, -+ 0x7027, 0x0000, 0xd19c, 0x1158, 0x8aff, 0x0904, 0x1f13, 0x080c, -+ 0x1cc5, 0x0904, 0x1ff8, 0x080c, 0x1cc5, 0x0804, 0x1ff8, 0x782b, -+ 0x0004, 0xd194, 0x0148, 0xa880, 0xc0fc, 0xa882, 0x8aff, 0x1518, -+ 0xa87c, 0xc0f5, 0xa87e, 0x00f8, 0x0026, 0x0036, 0xab3c, 0xaa40, -+ 0x0016, 0x7910, 0xa82c, 0x9100, 0xa82e, 0x7914, 0xa830, 0x9101, -+ 0xa832, 0x001e, 0x7810, 0x931a, 0x7814, 0x9213, 0x7800, 0xa81e, -+ 0x7804, 0xa822, 0xab3e, 0xaa42, 0x003e, 0x002e, 0x080c, 0x2063, -+ 0xa880, 0xc0fd, 0xa882, 0x2a00, 0xa816, 0x2800, 0xa85a, 0x2c00, -+ 0xa812, 0x7003, 0x0000, 0x2009, 0x0306, 0x200b, 0x4800, 0x7027, -+ 0x0000, 0x0804, 0x1ff8, 0x00f6, 0x0026, 0x781c, 0x0006, 0x7818, -+ 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, -+ 0x7816, 0x0036, 0x2019, 0x1000, 0x8319, 0x090c, 0x0dd5, 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, 0x080c, 0x1cbe, 0x0804, 0x1ff8, 0x8001, 0x7002, -+ 0x7024, 0x8004, 0x7026, 0xd194, 0x0170, 0x782c, 0xd0fc, 0x1904, -+ 0x1eb9, 0xd19c, 0x1904, 0x1ff4, 0x8aff, 0x0904, 0x1ff8, 0x080c, -+ 0x1cc5, 0x0804, 0x1ff8, 0x0026, 0x0036, 0xab3c, 0xaa40, 0x080c, -+ 0x2063, 0xdd9c, 0x1904, 0x1fb3, 0x2c05, 0x908a, 0x0036, 0x1a0c, -+ 0x0dd5, 0x9082, 0x001b, 0x0002, 0x1f87, 0x1f87, 0x1f89, 0x1f87, -+ 0x1f87, 0x1f87, 0x1f8f, 0x1f87, 0x1f87, 0x1f87, 0x1f95, 0x1f87, -+ 0x1f87, 0x1f87, 0x1f9b, 0x1f87, 0x1f87, 0x1f87, 0x1fa1, 0x1f87, -+ 0x1f87, 0x1f87, 0x1fa7, 0x1f87, 0x1f87, 0x1f87, 0x1fad, 0x080c, -+ 0x0dd5, 0xa07c, 0x931a, 0xa080, 0x9213, 0x0804, 0x1ee8, 0xa08c, -+ 0x931a, 0xa090, 0x9213, 0x0804, 0x1ee8, 0xa09c, 0x931a, 0xa0a0, -+ 0x9213, 0x0804, 0x1ee8, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, -+ 0x1ee8, 0xa0bc, 0x931a, 0xa0c0, 0x9213, 0x0804, 0x1ee8, 0xa0cc, -+ 0x931a, 0xa0d0, 0x9213, 0x0804, 0x1ee8, 0xa0dc, 0x931a, 0xa0e0, -+ 0x9213, 0x0804, 0x1ee8, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0dd5, -+ 0x9082, 0x001b, 0x0002, 0x1fd6, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, -+ 0x1fd4, 0x1fdc, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fe2, -+ 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fd4, 0x1fe8, 0x1fd4, 0x1fd4, -+ 0x1fd4, 0x1fd4, 0x1fd4, 0x1fee, 0x080c, 0x0dd5, 0xa07c, 0x931a, -+ 0xa080, 0x9213, 0x0804, 0x1ee8, 0xa094, 0x931a, 0xa098, 0x9213, -+ 0x0804, 0x1ee8, 0xa0ac, 0x931a, 0xa0b0, 0x9213, 0x0804, 0x1ee8, -+ 0xa0c4, 0x931a, 0xa0c8, 0x9213, 0x0804, 0x1ee8, 0xa0dc, 0x931a, -+ 0xa0e0, 0x9213, 0x0804, 0x1ee8, 0x0804, 0x1ee4, 0x080c, 0x0dd5, -+ 0x012e, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a66, 0x7000, 0x9086, -+ 0x0000, 0x0904, 0x2043, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, -+ 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, -+ 0x080c, 0xea0a, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0dd5, -+ 0x0016, 0x2009, 0x0040, 0x080c, 0x23d2, 0x001e, 0x2001, 0x020c, -+ 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, -+ 0x1120, 0x2009, 0x0040, 0x080c, 0x23d2, 0x782c, 0xd0fc, 0x09a8, -+ 0x080c, 0x1eb4, 0x7000, 0x9086, 0x0000, 0x1978, 0x782b, 0x0004, -+ 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x23d2, 0x782b, -+ 0x0002, 0x7003, 0x0000, 0x080c, 0x1cbe, 0x00ee, 0x00fe, 0x0005, -+ 0xa880, 0xd0fc, 0x11a8, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, -+ 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, -+ 0x000f, 0x9080, 0x2090, 0x2065, 0x8cff, 0x090c, 0x0dd5, 0x8a51, -+ 0x0005, 0x2050, 0x0005, 0xa880, 0xd0fc, 0x11b8, 0x8a50, 0x8c61, -+ 0x2c05, 0x9005, 0x1190, 0x2800, 0x9906, 0x0120, 0xa000, 0x9005, -+ 0x1108, 0x2900, 0x2040, 0xa85a, 0xa064, 0x9084, 0x000f, 0x9080, -+ 0x20a0, 0x2065, 0x8cff, 0x090c, 0x0dd5, 0x0005, 0x0000, 0x001d, -+ 0x0021, 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, -+ 0x0021, 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, -+ 0x0000, 0x2083, 0x207f, 0x2083, 0x2083, 0x208d, 0x0000, 0x2083, -+ 0x208a, 0x208a, 0x2087, 0x208a, 0x208a, 0x0000, 0x208d, 0x208a, -+ 0x0000, 0x2085, 0x2085, 0x0000, 0x2085, 0x208d, 0x0000, 0x2085, -+ 0x208b, 0x208b, 0x208b, 0x0000, 0x208b, 0x0000, 0x208d, 0x208b, -+ 0x00c6, 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, -+ 0x228f, 0x2940, 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, -+ 0x0008, 0x1118, 0x2061, 0x208b, 0x00d0, 0x9de0, 0x2090, 0x9d86, -+ 0x0007, 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, -+ 0xa08c, 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, -+ 0x0804, 0x228f, 0xa004, 0x9045, 0x0904, 0x228f, 0x08d8, 0x2c05, -+ 0x9005, 0x0904, 0x2177, 0xdd9c, 0x1904, 0x2133, 0x908a, 0x0036, -+ 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x2108, 0x2108, 0x210a, -+ 0x2108, 0x2108, 0x2108, 0x2110, 0x2108, 0x2108, 0x2108, 0x2116, -+ 0x2108, 0x2108, 0x2108, 0x211c, 0x2108, 0x2108, 0x2108, 0x2122, -+ 0x2108, 0x2108, 0x2108, 0x2128, 0x2108, 0x2108, 0x2108, 0x212e, -+ 0x080c, 0x0dd5, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x216d, -+ 0xa08c, 0x9422, 0xa090, 0x931b, 0x0804, 0x216d, 0xa09c, 0x9422, -+ 0xa0a0, 0x931b, 0x0804, 0x216d, 0xa0ac, 0x9422, 0xa0b0, 0x931b, -+ 0x0804, 0x216d, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x216d, -+ 0xa0cc, 0x9422, 0xa0d0, 0x931b, 0x0804, 0x216d, 0xa0dc, 0x9422, -+ 0xa0e0, 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0dd5, 0x9082, -+ 0x001b, 0x0002, 0x2155, 0x2153, 0x2153, 0x2153, 0x2153, 0x2153, -+ 0x215a, 0x2153, 0x2153, 0x2153, 0x2153, 0x2153, 0x215f, 0x2153, -+ 0x2153, 0x2153, 0x2153, 0x2153, 0x2164, 0x2153, 0x2153, 0x2153, -+ 0x2153, 0x2153, 0x2169, 0x080c, 0x0dd5, 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, 0x228f, 0x8c60, 0x0804, 0x20df, 0xa004, -+ 0x9045, 0x0904, 0x228f, 0x0804, 0x20ba, 0x8a51, 0x0904, 0x228f, -+ 0x8c60, 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x228f, -+ 0xa064, 0x90ec, 0x000f, 0x9de0, 0x2090, 0x2c05, 0x2060, 0xa880, -+ 0xc0fc, 0xa882, 0x0804, 0x2284, 0x2c05, 0x8422, 0x8420, 0x831a, -+ 0x9399, 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x2221, 0x9082, -+ 0x001b, 0x0002, 0x21bd, 0x21bd, 0x21bf, 0x21bd, 0x21bd, 0x21bd, -+ 0x21cd, 0x21bd, 0x21bd, 0x21bd, 0x21db, 0x21bd, 0x21bd, 0x21bd, -+ 0x21e9, 0x21bd, 0x21bd, 0x21bd, 0x21f7, 0x21bd, 0x21bd, 0x21bd, -+ 0x2205, 0x21bd, 0x21bd, 0x21bd, 0x2213, 0x080c, 0x0dd5, 0xa17c, -+ 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa074, -+ 0x9420, 0xa078, 0x9319, 0x0804, 0x227f, 0xa18c, 0x2400, 0x9122, -+ 0xa190, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa084, 0x9420, 0xa088, -+ 0x9319, 0x0804, 0x227f, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, -+ 0x911b, 0x0a0c, 0x0dd5, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, -+ 0x227f, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, -+ 0x0dd5, 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x227f, 0xa1bc, -+ 0x2400, 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0b4, -+ 0x9420, 0xa0b8, 0x9319, 0x0804, 0x227f, 0xa1cc, 0x2400, 0x9122, -+ 0xa1d0, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0c4, 0x9420, 0xa0c8, -+ 0x9319, 0x0804, 0x227f, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, -+ 0x911b, 0x0a0c, 0x0dd5, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, -+ 0x227f, 0x9082, 0x001b, 0x0002, 0x223f, 0x223d, 0x223d, 0x223d, -+ 0x223d, 0x223d, 0x224c, 0x223d, 0x223d, 0x223d, 0x223d, 0x223d, -+ 0x2259, 0x223d, 0x223d, 0x223d, 0x223d, 0x223d, 0x2266, 0x223d, -+ 0x223d, 0x223d, 0x223d, 0x223d, 0x2273, 0x080c, 0x0dd5, 0xa17c, -+ 0x2400, 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa06c, -+ 0x9420, 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, -+ 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa084, 0x9420, 0xa088, 0x9319, -+ 0x0430, 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, -+ 0x0dd5, 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, -+ 0x9122, 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0dd5, 0xa0b4, 0x9420, -+ 0xa0b8, 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, -+ 0x911b, 0x0a0c, 0x0dd5, 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, -+ 0xd0bc, 0x190c, 0x0dce, 0x9084, 0x0007, 0x0002, 0x22b0, 0x1eb4, -+ 0x22b0, 0x22a6, 0x22a9, 0x22ac, 0x22a9, 0x22ac, 0x080c, 0x1eb4, -+ 0x0005, 0x080c, 0x11a3, 0x0005, 0x080c, 0x1eb4, 0x080c, 0x11a3, -+ 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, 0x23cf, 0x7900, 0xd1dc, -+ 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x22f7, -+ 0x22ef, 0x7d9d, 0x22ef, 0x22f1, 0x22f1, 0x22f1, 0x22f1, 0x7d83, -+ 0x22ef, 0x22f3, 0x22ef, 0x22f1, 0x22ef, 0x22f1, 0x22ef, 0x080c, -+ 0x0dd5, 0x0031, 0x0020, 0x080c, 0x7d83, 0x080c, 0x7d9d, 0x0005, -+ 0x0006, 0x0016, 0x0026, 0x080c, 0xea0a, 0x7930, 0x9184, 0x0003, -+ 0x01c0, 0x2001, 0x19f6, 0x2004, 0x9005, 0x0170, 0x2001, 0x0133, -+ 0x2004, 0x9005, 0x090c, 0x0dd5, 0x00c6, 0x2001, 0x19f6, 0x2064, -+ 0x080c, 0xc768, 0x00ce, 0x00f8, 0x2009, 0x0040, 0x080c, 0x23d2, -+ 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, -+ 0x080c, 0x73bc, 0x1138, 0x080c, 0x76a4, 0x080c, 0x601a, 0x080c, -+ 0x72ee, 0x0010, 0x080c, 0x5ed9, 0x080c, 0x7e4c, 0x0041, 0x0018, -+ 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, -+ 0x0036, 0x0046, 0x0056, 0x2071, 0x1a62, 0x080c, 0x1aa9, 0x005e, -+ 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, -+ 0x1800, 0x7128, 0x2001, 0x196f, 0x2102, 0x2001, 0x1977, 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, 0x0dce, 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, 0x2c3e, -+ 0x080c, 0x2b59, 0x6054, 0x8004, 0x8004, 0x8004, 0x8004, 0x9084, -+ 0x000c, 0x6150, 0x918c, 0xfff3, 0x9105, 0x6052, 0x6050, 0x9084, -+ 0xb17f, 0x9085, 0x2000, 0x6052, 0x2009, 0x199d, 0x2011, 0x199e, -+ 0x6358, 0x939c, 0x38f0, 0x2320, 0x080c, 0x2b9d, 0x1238, 0x939d, -+ 0x4003, 0x94a5, 0x8603, 0x230a, 0x2412, 0x0030, 0x939d, 0x0203, -+ 0x94a5, 0x8603, 0x230a, 0x2412, 0x9006, 0x080c, 0x2b88, 0x9006, -+ 0x080c, 0x2b6b, 0x20a9, 0x0012, 0x1d04, 0x2424, 0x2091, 0x6000, -+ 0x1f04, 0x2424, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, -+ 0x0400, 0x9084, 0xdfff, 0x6052, 0x6024, 0x6026, 0x080c, 0x2877, -+ 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x2887, 0x60e7, 0x0000, -+ 0x61ea, 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, -+ 0x0080, 0x602f, 0x0000, 0x6007, 0x349f, 0x60bb, 0x0000, 0x20a9, -+ 0x0018, 0x60bf, 0x0000, 0x1f04, 0x2451, 0x60bb, 0x0000, 0x60bf, -+ 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0405, 0x60bf, 0x0014, 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, 0x1835, 0x2003, 0x0000, 0x2001, 0x1834, 0x2003, 0x0001, -+ 0x0005, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, -+ 0x0066, 0x2031, 0x1837, 0x2634, 0x96b4, 0x0028, 0x006e, 0x1138, -+ 0x6020, 0xd1bc, 0x0120, 0xd0bc, 0x1168, 0xd0b4, 0x1198, 0x9184, -+ 0x5e2c, 0x1118, 0x9184, 0x0007, 0x00aa, 0x9195, 0x0004, 0x9284, -+ 0x0007, 0x0082, 0x0016, 0x2001, 0x188b, 0x200c, 0xd184, 0x001e, -+ 0x0d70, 0x0c98, 0x0016, 0x2001, 0x188b, 0x200c, 0xd194, 0x001e, -+ 0x0d30, 0x0c58, 0x24d4, 0x24ba, 0x24bd, 0x24c0, 0x24c5, 0x24c7, -+ 0x24cb, 0x24cf, 0x080c, 0x8fd5, 0x00b8, 0x080c, 0x90a2, 0x00a0, -+ 0x080c, 0x90a2, 0x080c, 0x8fd5, 0x0078, 0x0099, 0x0068, 0x080c, -+ 0x8fd5, 0x0079, 0x0048, 0x080c, 0x90a2, 0x0059, 0x0028, 0x080c, -+ 0x90a2, 0x080c, 0x8fd5, 0x0029, 0x002e, 0x001e, 0x000e, 0x012e, -+ 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, 0x1904, -+ 0x273c, 0xd1f4, 0x190c, 0x0dce, 0x080c, 0x73bc, 0x0904, 0x252f, -+ 0x080c, 0xd230, 0x1120, 0x7000, 0x9086, 0x0003, 0x0570, 0x6024, -+ 0x9084, 0x1800, 0x0550, 0x080c, 0x73df, 0x0118, 0x080c, 0x73cd, -+ 0x1520, 0x6027, 0x0020, 0x6043, 0x0000, 0x080c, 0xd230, 0x0168, -+ 0x080c, 0x73df, 0x1150, 0x2001, 0x19a7, 0x2003, 0x0001, 0x6027, -+ 0x1800, 0x080c, 0x7252, 0x0804, 0x273f, 0x70a4, 0x9005, 0x1150, -+ 0x70a7, 0x0001, 0x00d6, 0x2069, 0x0140, 0x080c, 0x7413, 0x00de, -+ 0x1904, 0x273f, 0x080c, 0x76ae, 0x0428, 0x080c, 0x73df, 0x1590, -+ 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, 0x080c, 0x76ae, 0x080c, -+ 0x76a4, 0x080c, 0x601a, 0x080c, 0x72ee, 0x0804, 0x273c, 0xd1ac, -+ 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, 0x1178, 0xd0d4, 0x1190, -+ 0xd0cc, 0x0130, 0x7098, 0x9086, 0x0028, 0x1110, 0x080c, 0x7591, -+ 0x0804, 0x273c, 0x080c, 0x76a9, 0x0048, 0x2001, 0x197d, 0x2003, -+ 0x0002, 0x0020, 0x080c, 0x74f6, 0x0804, 0x273c, 0x080c, 0x762c, -+ 0x0804, 0x273c, 0x6220, 0xd1bc, 0x0138, 0xd2bc, 0x1904, 0x27af, -+ 0xd2b4, 0x1904, 0x27c2, 0x0000, 0xd1ac, 0x0904, 0x2651, 0x0036, -+ 0x6328, 0xc3bc, 0x632a, 0x003e, 0x080c, 0x73bc, 0x11c0, 0x6027, -+ 0x0020, 0x0006, 0x0026, 0x0036, 0x080c, 0x73d6, 0x1158, 0x080c, -+ 0x76a4, 0x080c, 0x601a, 0x080c, 0x72ee, 0x003e, 0x002e, 0x000e, -+ 0x00ae, 0x0005, 0x003e, 0x002e, 0x000e, 0x080c, 0x7394, 0x0016, -+ 0x0046, 0x00c6, 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, -+ 0x644a, 0x6043, 0x0090, 0x6043, 0x0010, 0x74da, 0x948c, 0xff00, -+ 0x7038, 0xd084, 0x0178, 0x9186, 0xf800, 0x1160, 0x7048, 0xd084, -+ 0x1148, 0xc085, 0x704a, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, -+ 0x4b04, 0x003e, 0x080c, 0xd229, 0x1904, 0x262e, 0x9196, 0xff00, -+ 0x05a8, 0x7060, 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, -+ 0x0568, 0x7130, 0xd184, 0x1550, 0x080c, 0x3319, 0x0128, 0xc18d, -+ 0x7132, 0x080c, 0x696a, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, -+ 0x6248, 0x9294, 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, -+ 0x0904, 0x262e, 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, -+ 0xd1ac, 0x1904, 0x262e, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, -+ 0x8013, 0x080c, 0x4b04, 0x003e, 0x0804, 0x262e, 0x7038, 0xd08c, -+ 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, 0x262e, 0xc1ad, -+ 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, 0x4b04, 0x003e, -+ 0x7130, 0xc185, 0x7132, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x01f0, -+ 0x0016, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x86dd, 0x2019, -+ 0x000e, 0x00c6, 0x2061, 0x0000, 0x080c, 0xe522, 0x00ce, 0x9484, -+ 0x00ff, 0x9080, 0x3325, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, -+ 0x9006, 0x2009, 0x000e, 0x080c, 0xe5ae, 0x001e, 0x0016, 0x2009, -+ 0x0002, 0x2019, 0x0004, 0x080c, 0x318a, 0x001e, 0x0078, 0x0156, -+ 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x65ff, 0x1110, 0x080c, -+ 0x6034, 0x8108, 0x1f04, 0x2624, 0x00be, 0x015e, 0x00ce, 0x004e, -+ 0x080c, 0xadd2, 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, 0x1826, 0x2003, 0x0000, 0x6027, -+ 0x0020, 0xd194, 0x0904, 0x273c, 0x0016, 0x6220, 0xd2b4, 0x0904, -+ 0x26d9, 0x080c, 0x8579, 0x080c, 0xa273, 0x6027, 0x0004, 0x00f6, -+ 0x2019, 0x19f0, 0x2304, 0x907d, 0x0904, 0x26a8, 0x7804, 0x9086, -+ 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, -+ 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, -+ 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, -+ 0x080c, 0x2cff, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, -+ 0x080c, 0x2c19, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, -+ 0x080c, 0x2cef, 0x9006, 0x080c, 0x2cef, 0x080c, 0x9588, 0x080c, -+ 0x968d, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0xae61, -+ 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, -+ 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, -+ 0x080c, 0x2cff, 0x00de, 0x00c6, 0x2061, 0x19e7, 0x6028, 0x080c, -+ 0xd230, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, -+ 0x1238, 0x8000, 0x602a, 0x00ce, 0x080c, 0xa24f, 0x0804, 0x273b, -+ 0x2061, 0x0100, 0x62c0, 0x080c, 0xac5d, 0x2019, 0x19f0, 0x2304, -+ 0x9065, 0x0120, 0x2009, 0x0027, 0x080c, 0xaedc, 0x00ce, 0x0804, -+ 0x273b, 0xd2bc, 0x0904, 0x2722, 0x080c, 0x8586, 0x6014, 0x9084, -+ 0x1984, 0x9085, 0x0010, 0x6016, 0x6027, 0x0004, 0x00d6, 0x2069, -+ 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, 0x080c, 0x2cff, 0x00de, -+ 0x00c6, 0x2061, 0x19e7, 0x6044, 0x080c, 0xd230, 0x0120, 0x909a, -+ 0x0003, 0x1658, 0x0018, 0x909a, 0x00c8, 0x1638, 0x8000, 0x6046, -+ 0x603c, 0x00ce, 0x9005, 0x05b8, 0x2009, 0x07d0, 0x080c, 0x857e, -+ 0x9080, 0x0008, 0x2004, 0x9086, 0x0006, 0x1138, 0x6114, 0x918c, -+ 0x1984, 0x918d, 0x0012, 0x6116, 0x0430, 0x9080, 0x0008, 0x2004, -+ 0x9086, 0x0009, 0x0d98, 0x6114, 0x918c, 0x1984, 0x918d, 0x0016, -+ 0x6116, 0x00c8, 0x6027, 0x0004, 0x00b0, 0x0036, 0x2019, 0x0001, -+ 0x080c, 0xa5b6, 0x003e, 0x2019, 0x19f6, 0x2304, 0x9065, 0x0150, -+ 0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110, 0x2009, 0x004f, -+ 0x080c, 0xaedc, 0x00ce, 0x001e, 0xd19c, 0x0904, 0x27aa, 0x7038, -+ 0xd0ac, 0x1904, 0x2783, 0x0016, 0x0156, 0x6027, 0x0008, 0x6050, -+ 0x9085, 0x0040, 0x6052, 0x6050, 0x9084, 0xfbcf, 0x6052, 0x080c, -+ 0x2c38, 0x9085, 0x2000, 0x6052, 0x20a9, 0x0012, 0x1d04, 0x2756, -+ 0x080c, 0x85ad, 0x1f04, 0x2756, 0x6050, 0x9085, 0x0400, 0x9084, -+ 0xdfbf, 0x6052, 0x20a9, 0x0028, 0xa001, 0x1f04, 0x2764, 0x6150, -+ 0x9185, 0x1400, 0x6052, 0x20a9, 0x0366, 0x1d04, 0x276d, 0x080c, -+ 0x85ad, 0x6020, 0xd09c, 0x1130, 0x015e, 0x6152, 0x001e, 0x6027, -+ 0x0008, 0x0480, 0x080c, 0x2c00, 0x1f04, 0x276d, 0x015e, 0x6152, -+ 0x001e, 0x6027, 0x0008, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c, -+ 0xadd2, 0x60e3, 0x0000, 0x080c, 0xe9e9, 0x080c, 0xea04, 0x080c, -+ 0x56d3, 0xd0fc, 0x1138, 0x080c, 0xd229, 0x1120, 0x9085, 0x0001, -+ 0x080c, 0x7403, 0x9006, 0x080c, 0x2cef, 0x2009, 0x0002, 0x080c, -+ 0x2c3e, 0x2001, 0x1800, 0x2003, 0x0004, 0x6027, 0x0008, 0x080c, -+ 0x0bae, 0x001e, 0x918c, 0xffd0, 0x6126, 0x00ae, 0x0005, 0x0016, -+ 0x2001, 0x188b, 0x200c, 0xd184, 0x001e, 0x0904, 0x255c, 0x0016, -+ 0x2009, 0x27bb, 0x00d0, 0x2001, 0x188b, 0x200c, 0xc184, 0x2102, -+ 0x001e, 0x0c40, 0x0016, 0x2001, 0x188b, 0x200c, 0xd194, 0x001e, -+ 0x0904, 0x255c, 0x0016, 0x2009, 0x27ce, 0x0038, 0x2001, 0x188b, -+ 0x200c, 0xc194, 0x2102, 0x001e, 0x08a8, 0x6028, 0xc0bc, 0x602a, -+ 0x2001, 0x0156, 0x2003, 0xbc91, 0x8000, 0x2003, 0xffff, 0x6043, -+ 0x0001, 0x080c, 0x2c38, 0x6027, 0x0080, 0x6017, 0x0000, 0x6043, -+ 0x0000, 0x0817, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, -+ 0x0126, 0x2091, 0x8000, 0x2071, 0x1800, 0x71d0, 0x70d2, 0x9116, -+ 0x05e8, 0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x2c3e, 0x2011, -+ 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, -+ 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, 0x4b04, 0x0438, 0x2001, -+ 0x19a8, 0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, -+ 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, -+ 0x4b04, 0x080c, 0x56d3, 0xd0fc, 0x1188, 0x080c, 0xd229, 0x1170, -+ 0x00c6, 0x080c, 0x28d2, 0x080c, 0xa51d, 0x2061, 0x0100, 0x2019, -+ 0x0028, 0x2009, 0x0002, 0x080c, 0x318a, 0x00ce, 0x012e, 0x00fe, -+ 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, -+ 0x00ff, 0x2130, 0x9094, 0xff00, 0x11f0, 0x2011, 0x1837, 0x2214, -+ 0xd2ac, 0x11c8, 0x81ff, 0x01e8, 0x2011, 0x181f, 0x2204, 0x9106, -+ 0x1190, 0x2011, 0x1820, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, -+ 0x9206, 0x1148, 0x2011, 0x1820, 0x2214, 0x9294, 0x00ff, 0x9584, -+ 0x00ff, 0x9206, 0x1120, 0x2500, 0x080c, 0x80be, 0x0048, 0x9584, -+ 0x00ff, 0x9080, 0x3325, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, -+ 0x0005, 0x9080, 0x3325, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, -+ 0x2069, 0x0140, 0x2001, 0x1818, 0x2003, 0x00ef, 0x20a9, 0x0010, -+ 0x9006, 0x6852, 0x6856, 0x1f04, 0x2882, 0x00de, 0x0005, 0x0006, -+ 0x00d6, 0x0026, 0x2069, 0x0140, 0x2001, 0x1818, 0x2102, 0x8114, -+ 0x8214, 0x8214, 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, -+ 0x82ff, 0x1128, 0x9184, 0x000f, 0x9080, 0xf1b6, 0x2005, 0x6856, -+ 0x8211, 0x1f04, 0x2897, 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, 0x28c7, 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, -+ 0x015e, 0x0005, 0x080c, 0x56cf, 0xd0c4, 0x0150, 0xd0a4, 0x0140, -+ 0x9006, 0x0046, 0x2020, 0x2009, 0x002e, 0x080c, 0xe5ae, 0x004e, -+ 0x0005, 0x00f6, 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, -+ 0x0904, 0x293e, 0x080c, 0x2b9d, 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, 0x8f68, 0x928c, -+ 0xff00, 0x0110, 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, -+ 0x78c2, 0x2009, 0x0138, 0x220a, 0x080c, 0x73bc, 0x1118, 0x2009, -+ 0x196d, 0x220a, 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, -+ 0x0cc8, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, -+ 0x0170, 0x200c, 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, -+ 0x0dce, 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, -+ 0x1990, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dd5, 0x0033, 0x00ee, -+ 0x002e, 0x001e, 0x000e, 0x015e, 0x0005, 0x299c, 0x29ba, 0x29de, -+ 0x29e0, 0x2a09, 0x2a0b, 0x2a0d, 0x2001, 0x0001, 0x080c, 0x27ea, -+ 0x080c, 0x2bfb, 0x2001, 0x1992, 0x2003, 0x0000, 0x7828, 0x9084, -+ 0xe1d7, 0x782a, 0x9006, 0x20a9, 0x0009, 0x080c, 0x2bb9, 0x2001, -+ 0x1990, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2a0e, 0x080c, -+ 0x858b, 0x0005, 0x2009, 0x1995, 0x200b, 0x0000, 0x2001, 0x199a, -+ 0x2003, 0x0036, 0x2001, 0x1999, 0x2003, 0x002a, 0x2001, 0x1992, -+ 0x2003, 0x0001, 0x9006, 0x080c, 0x2b6b, 0x2001, 0xffff, 0x20a9, -+ 0x0009, 0x080c, 0x2bb9, 0x2001, 0x1990, 0x2003, 0x0006, 0x2009, -+ 0x001e, 0x2011, 0x2a0e, 0x080c, 0x858b, 0x0005, 0x080c, 0x0dd5, -+ 0x2001, 0x199a, 0x2003, 0x0036, 0x2001, 0x1992, 0x2003, 0x0003, -+ 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, -+ 0x2001, 0x0001, 0x080c, 0x2b6b, 0x2001, 0x1996, 0x2003, 0x0000, -+ 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x2bb9, 0x2001, 0x1990, -+ 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x2a0e, 0x080c, 0x858b, -+ 0x0005, 0x080c, 0x0dd5, 0x080c, 0x0dd5, 0x0005, 0x0006, 0x0016, -+ 0x0026, 0x00e6, 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, -+ 0x0100, 0x2001, 0x1992, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0dd5, -+ 0x0043, 0x012e, 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, -+ 0x0005, 0x2a30, 0x2a50, 0x2a90, 0x2ac0, 0x2ae4, 0x2af4, 0x2af6, -+ 0x080c, 0x2bad, 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, -+ 0x1998, 0x2104, 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, -+ 0xc08d, 0x0008, 0xc085, 0x200a, 0x2001, 0x1990, 0x2003, 0x0001, -+ 0x0030, 0x080c, 0x2b1a, 0x2001, 0xffff, 0x080c, 0x29ab, 0x0005, -+ 0x080c, 0x2af8, 0x05e0, 0x2009, 0x1999, 0x2104, 0x8001, 0x200a, -+ 0x080c, 0x2bad, 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, -+ 0x9294, 0x0005, 0x9296, 0x0005, 0x0518, 0x2009, 0x1998, 0x2104, -+ 0xc085, 0x200a, 0x2009, 0x1995, 0x2104, 0x8000, 0x200a, 0x9086, -+ 0x0005, 0x0118, 0x080c, 0x2b00, 0x00c0, 0x200b, 0x0000, 0x7a38, -+ 0x9294, 0x0006, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, -+ 0x0001, 0x080c, 0x2b88, 0x2001, 0x1992, 0x2003, 0x0002, 0x0028, -+ 0x2001, 0x1990, 0x2003, 0x0003, 0x0010, 0x080c, 0x29cd, 0x0005, -+ 0x080c, 0x2af8, 0x0560, 0x2009, 0x1999, 0x2104, 0x8001, 0x200a, -+ 0x080c, 0x2bad, 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, -+ 0x1990, 0x2003, 0x0003, 0x2001, 0x1991, 0x2003, 0x0000, 0x00b8, -+ 0x2009, 0x1999, 0x2104, 0x9005, 0x1118, 0x080c, 0x2b3d, 0x0010, -+ 0x080c, 0x2b0d, 0x080c, 0x2b00, 0x2009, 0x1995, 0x200b, 0x0000, -+ 0x2001, 0x1992, 0x2003, 0x0001, 0x080c, 0x29cd, 0x0000, 0x0005, -+ 0x04b9, 0x0508, 0x080c, 0x2bad, 0x11b8, 0x7850, 0x9084, 0xefff, -+ 0x7852, 0x2009, 0x1996, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, -+ 0x0108, 0x0078, 0x2001, 0x199b, 0x2003, 0x000a, 0x2009, 0x1998, -+ 0x2104, 0xc0fd, 0x200a, 0x0038, 0x0419, 0x2001, 0x1992, 0x2003, -+ 0x0004, 0x080c, 0x29f8, 0x0005, 0x0099, 0x0168, 0x080c, 0x2bad, -+ 0x1138, 0x7850, 0x9084, 0xefff, 0x7852, 0x080c, 0x29e4, 0x0018, -+ 0x0079, 0x080c, 0x29f8, 0x0005, 0x080c, 0x0dd5, 0x080c, 0x0dd5, -+ 0x2009, 0x199a, 0x2104, 0x8001, 0x200a, 0x090c, 0x2b59, 0x0005, -+ 0x7a38, 0x9294, 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, -+ 0x2001, 0x0001, 0x080c, 0x2b88, 0x0005, 0x7a38, 0x9294, 0x0006, -+ 0x9296, 0x0006, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, -+ 0x2b6b, 0x0005, 0x2009, 0x1995, 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, 0x2b88, 0x0005, 0x0086, 0x2001, 0x1998, -+ 0x2004, 0x9084, 0x7fff, 0x090c, 0x0dd5, 0x2009, 0x1997, 0x2144, -+ 0x8846, 0x280a, 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, -+ 0x080c, 0x0dd5, 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, -+ 0x0005, 0x0006, 0x0156, 0x2001, 0x1990, 0x20a9, 0x0009, 0x2003, -+ 0x0000, 0x8000, 0x1f04, 0x2b5f, 0x2001, 0x1997, 0x2003, 0x8000, -+ 0x015e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, -+ 0x0158, 0x7838, 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, -+ 0x199d, 0x210c, 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, -+ 0x0006, 0x783a, 0x2009, 0x199e, 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, 0x0006, 0x2001, 0x0100, -+ 0x2004, 0x9082, 0x0009, 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, -+ 0x7820, 0x080c, 0x2c38, 0xd09c, 0x1110, 0x1f04, 0x2bb0, 0x015e, -+ 0x0005, 0x0126, 0x0016, 0x0006, 0x2091, 0x8000, 0x7850, 0x9085, -+ 0x0040, 0x7852, 0x7850, 0x9084, 0xfbcf, 0x7852, 0x080c, 0x2c38, -+ 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, 0x2be6, -+ 0x080c, 0x85ad, 0x1f04, 0x2be6, 0x7850, 0x9085, 0x0400, 0x9084, -+ 0xdfbf, 0x7852, 0x080c, 0x2c38, 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, 0x2c0a, 0x0028, -+ 0x7854, 0xd08c, 0x1110, 0x1f04, 0x2c10, 0x00fe, 0x015e, 0x000e, -+ 0x0005, 0x1d04, 0x2c19, 0x080c, 0x85ad, 0x1f04, 0x2c19, 0x0005, -+ 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, -+ 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, -+ 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, -+ 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, -+ 0x19a8, 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, 0x1588, 0x2009, -+ 0x00a2, 0x080c, 0x0e51, 0x2019, 0x0160, 0x2324, 0x2011, 0x0003, -+ 0x2009, 0x0169, 0x2104, 0x9084, 0x0007, 0x210c, 0x918c, 0x0007, -+ 0x910e, 0x1db0, 0x9086, 0x0003, 0x11b8, 0x2304, 0x9402, 0x02a0, -+ 0x1d60, 0x8211, 0x1d68, 0x84ff, 0x0170, 0x2001, 0x0141, 0x200c, -+ 0x918c, 0xff00, 0x9186, 0x0100, 0x0130, 0x2009, 0x180c, 0x2104, -+ 0xc0dd, 0x200a, 0x0008, 0x0419, 0x2009, 0x0000, 0x080c, 0x0e51, -+ 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, 0x04b9, -+ 0x001e, 0x9184, 0x0003, 0x01e0, 0x0036, 0x0016, 0x2019, 0x0141, -+ 0x6124, 0x918c, 0x0028, 0x1120, 0x2304, 0x9084, 0x2800, 0x0dc0, -+ 0x001e, 0x919c, 0xffe4, 0x9184, 0x0001, 0x0118, 0x9385, 0x0009, -+ 0x6016, 0x9184, 0x0002, 0x0118, 0x9385, 0x0012, 0x6016, 0x003e, -+ 0x2001, 0x180c, 0x200c, 0xc1dc, 0x2102, 0x00ce, 0x0005, 0x0016, -+ 0x0026, 0x080c, 0x73d6, 0x0108, 0xc0bc, 0x2009, 0x0140, 0x2114, -+ 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, -+ 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9285, 0x1000, -+ 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, -+ 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, 0x001e, -+ 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, 0x2104, 0x1128, 0x080c, -+ 0x73d6, 0x0110, 0xc0bc, 0x0008, 0xc0bd, 0x200a, 0x001e, 0x000e, -+ 0x0005, 0x2f95, 0x2f95, 0x2db9, 0x2db9, 0x2dc5, 0x2dc5, 0x2dd1, -+ 0x2dd1, 0x2ddf, 0x2ddf, 0x2deb, 0x2deb, 0x2df9, 0x2df9, 0x2e07, -+ 0x2e07, 0x2e19, 0x2e19, 0x2e25, 0x2e25, 0x2e33, 0x2e33, 0x2e51, -+ 0x2e51, 0x2e71, 0x2e71, 0x2e41, 0x2e41, 0x2e61, 0x2e61, 0x2e7f, -+ 0x2e7f, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e91, 0x2e91, 0x2e9d, 0x2e9d, 0x2eab, 0x2eab, 0x2eb9, -+ 0x2eb9, 0x2ec9, 0x2ec9, 0x2ed7, 0x2ed7, 0x2ee7, 0x2ee7, 0x2ef7, -+ 0x2ef7, 0x2f09, 0x2f09, 0x2f17, 0x2f17, 0x2f27, 0x2f27, 0x2f49, -+ 0x2f49, 0x2f6b, 0x2f6b, 0x2f37, 0x2f37, 0x2f5a, 0x2f5a, 0x2f7a, -+ 0x2f7a, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, 0x2e17, -+ 0x2e17, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2481, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2295, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2295, 0x080c, 0x2481, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x22d0, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x2481, 0x080c, 0x22d0, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2295, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2295, 0x080c, 0x2481, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0xa001, -+ 0x0cf0, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x1380, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2481, 0x080c, -+ 0x1380, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x2295, 0x080c, 0x1380, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2481, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2295, 0x080c, 0x2481, 0x080c, 0x1380, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2295, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2295, 0x080c, 0x2481, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2941, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2941, 0x080c, -+ 0x2481, 0x0804, 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x080c, 0x2481, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2941, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2941, 0x080c, 0x2481, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2941, 0x080c, 0x2295, 0x080c, 0x22d0, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2941, 0x080c, 0x2295, 0x080c, 0x2481, 0x080c, 0x22d0, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2941, 0x080c, 0x1380, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2941, 0x080c, 0x2481, 0x080c, 0x1380, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2941, 0x080c, 0x2295, 0x080c, 0x1380, 0x0804, 0x2f8d, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2941, 0x080c, 0x2481, 0x080c, 0x1380, 0x080c, 0x22d0, 0x0804, -+ 0x2f8d, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x080c, 0x2481, 0x080c, -+ 0x1380, 0x0498, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x080c, 0x1380, -+ 0x080c, 0x22d0, 0x0410, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x2941, 0x080c, 0x1380, 0x080c, -+ 0x22d0, 0x0098, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2941, 0x080c, 0x2295, 0x080c, 0x2481, -+ 0x080c, 0x1380, 0x080c, 0x22d0, 0x0000, 0x015e, 0x014e, 0x013e, -+ 0x01de, 0x01ce, 0x012e, 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, -+ 0x0026, 0x0046, 0x9026, 0x080c, 0x6930, 0x1904, 0x30a6, 0x72dc, -+ 0x2001, 0x197c, 0x2004, 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, -+ 0x1138, 0xd2bc, 0x1904, 0x30a6, 0x080c, 0x30ab, 0x0804, 0x30a6, -+ 0xd2cc, 0x1904, 0x30a6, 0x080c, 0x73bc, 0x1120, 0x70af, 0xffff, -+ 0x0804, 0x30a6, 0xd294, 0x0120, 0x70af, 0xffff, 0x0804, 0x30a6, -+ 0x080c, 0x3314, 0x0160, 0x080c, 0xd230, 0x0128, 0x2001, 0x1818, -+ 0x203c, 0x0804, 0x3033, 0x70af, 0xffff, 0x0804, 0x30a6, 0x2001, -+ 0x1818, 0x203c, 0x7294, 0xd284, 0x0904, 0x3033, 0xd28c, 0x1904, -+ 0x3033, 0x0036, 0x73ac, 0x938e, 0xffff, 0x1110, 0x2019, 0x0001, -+ 0x8314, 0x92e0, 0x1c80, 0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, -+ 0xff00, 0x8007, 0x0010, 0x9084, 0x00ff, 0x970e, 0x05d0, 0x908e, -+ 0x0000, 0x05b8, 0x908e, 0x00ff, 0x1150, 0x7230, 0xd284, 0x15b0, -+ 0x7294, 0xc28d, 0x7296, 0x70af, 0xffff, 0x003e, 0x04a0, 0x900e, -+ 0x080c, 0x283e, 0x080c, 0x659e, 0x1538, 0x9006, 0xb8bb, 0x0520, -+ 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, 0x8981, 0x00ce, -+ 0x090c, 0x8d25, 0xb8af, 0x0000, 0x080c, 0x6972, 0x1168, 0x7030, -+ 0xd08c, 0x0130, 0xb800, 0xd0bc, 0x0138, 0x080c, 0x681f, 0x0120, -+ 0x080c, 0x30c4, 0x0148, 0x0028, 0x080c, 0x3204, 0x080c, 0x30f0, -+ 0x0118, 0x8318, 0x0804, 0x2fe0, 0x73ae, 0x0010, 0x70af, 0xffff, -+ 0x003e, 0x0804, 0x30a6, 0x9780, 0x3325, 0x203d, 0x97bc, 0xff00, -+ 0x873f, 0x2041, 0x007e, 0x70ac, 0x9096, 0xffff, 0x1118, 0x900e, -+ 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, -+ 0x70af, 0xffff, 0x0804, 0x30a6, 0x2700, 0x0156, 0x0016, 0x9106, -+ 0x0904, 0x309b, 0xc484, 0x080c, 0x65ff, 0x0148, 0x080c, 0xd230, -+ 0x1904, 0x309b, 0x080c, 0x659e, 0x1904, 0x30a3, 0x0008, 0xc485, -+ 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, 0x2060, 0x080c, -+ 0x8981, 0x00ce, 0x090c, 0x8d25, 0xb8af, 0x0000, 0x080c, 0x6972, -+ 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, 0xd0bc, 0x11e0, 0x7294, -+ 0xd28c, 0x0180, 0x080c, 0x6972, 0x9082, 0x0006, 0x02e0, 0xd484, -+ 0x1118, 0x080c, 0x65c3, 0x0028, 0x080c, 0x3290, 0x01a0, 0x080c, -+ 0x32bb, 0x0088, 0x080c, 0x3204, 0x080c, 0xd230, 0x1160, 0x080c, -+ 0x30f0, 0x0188, 0x0040, 0x080c, 0xd230, 0x1118, 0x080c, 0x3290, -+ 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, 0x015e, 0x1f04, 0x304c, -+ 0x70af, 0xffff, 0x0018, 0x001e, 0x015e, 0x71ae, 0x004e, 0x002e, -+ 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, 0x70af, 0x0001, 0x2009, -+ 0x007e, 0x080c, 0x659e, 0x1168, 0xb813, 0x00ff, 0xb817, 0xfffe, -+ 0x080c, 0x3204, 0x04a9, 0x0128, 0x70dc, 0xc0bd, 0x70de, 0x080c, -+ 0xcf81, 0x001e, 0x00ce, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, -+ 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xaeaf, -+ 0x01d0, 0x2b00, 0x6012, 0x080c, 0xcfaa, 0x6023, 0x0001, 0x9006, -+ 0x080c, 0x653b, 0x2001, 0x0000, 0x080c, 0x654f, 0x0126, 0x2091, -+ 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0004, 0x080c, -+ 0xaedc, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, -+ 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, -+ 0x00ff, 0xb842, 0x080c, 0xaeaf, 0x0548, 0x2b00, 0x6012, 0xb800, -+ 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, 0x0140, 0xb804, 0x9084, -+ 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, 0x31bf, 0x080c, 0xcfaa, -+ 0x6023, 0x0001, 0x9006, 0x080c, 0x653b, 0x2001, 0x0002, 0x080c, -+ 0x654f, 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, 0x012e, -+ 0x2009, 0x0002, 0x080c, 0xaedc, 0x9085, 0x0001, 0x00ce, 0x00de, -+ 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, 0x0026, 0x2009, 0x0080, -+ 0x080c, 0x659e, 0x1140, 0xb813, 0x00ff, 0xb817, 0xfffc, 0x0039, -+ 0x0110, 0x70e3, 0xffff, 0x002e, 0x00ce, 0x00be, 0x0005, 0x0016, -+ 0x0076, 0x00d6, 0x00c6, 0x080c, 0xae0b, 0x01d0, 0x2b00, 0x6012, -+ 0x080c, 0xcfaa, 0x6023, 0x0001, 0x9006, 0x080c, 0x653b, 0x2001, -+ 0x0002, 0x080c, 0x654f, 0x0126, 0x2091, 0x8000, 0x70e4, 0x8000, -+ 0x70e6, 0x012e, 0x2009, 0x0002, 0x080c, 0xaedc, 0x9085, 0x0001, -+ 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0126, -+ 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, 0x659e, 0x11b8, 0xb813, -+ 0x00ff, 0xb817, 0xfffd, 0xb8cf, 0x0004, 0x080c, 0xae0b, 0x0170, -+ 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, 0x620a, 0x080c, 0xcfaa, -+ 0x2009, 0x0022, 0x080c, 0xaedc, 0x9085, 0x0001, 0x012e, 0x00de, -+ 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, 0x0036, 0x0026, 0x00b6, -+ 0x21f0, 0x080c, 0x9296, 0x080c, 0x921b, 0x080c, 0xaca4, 0x080c, -+ 0xbd77, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, -+ 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x65ff, 0x1140, -+ 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x6034, -+ 0x001e, 0x8108, 0x1f04, 0x31a4, 0x9686, 0x0001, 0x190c, 0x32e8, -+ 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, -+ 0x00c6, 0x0046, 0x0036, 0x0026, 0x0016, 0x00b6, 0x6210, 0x2258, -+ 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x928b, 0x0076, 0x2039, -+ 0x0000, 0x080c, 0x9168, 0x2c08, 0x080c, 0xe2eb, 0x007e, 0x001e, -+ 0xba10, 0xbb14, 0xbcc0, 0x080c, 0x6034, 0xba12, 0xbb16, 0xbcc2, -+ 0x00be, 0x001e, 0x002e, 0x003e, 0x004e, 0x00ce, 0x00ee, 0x0005, -+ 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058, 0xb8a0, 0x00be, 0x9086, -+ 0x0080, 0x0150, 0x2071, 0x1800, 0x70a8, 0x9005, 0x0110, 0x8001, -+ 0x70aa, 0x000e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x70e4, 0x9005, -+ 0x0dc0, 0x8001, 0x70e6, 0x0ca8, 0xb800, 0xc08c, 0xb802, 0x0005, -+ 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0046, 0x0036, 0x0026, 0x0016, -+ 0x0156, 0x2178, 0x81ff, 0x1118, 0x20a9, 0x0001, 0x0078, 0x080c, -+ 0x56cf, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2020, 0x2009, -+ 0x002d, 0x080c, 0xe5ae, 0x20a9, 0x0800, 0x9016, 0x0026, 0x928e, -+ 0x007e, 0x0904, 0x326f, 0x928e, 0x007f, 0x0904, 0x326f, 0x928e, -+ 0x0080, 0x05e8, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c0, 0x8fff, -+ 0x1148, 0x2001, 0x198e, 0x0006, 0x2003, 0x0001, 0x04f1, 0x000e, -+ 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, 0x0001, 0x080c, -+ 0x693c, 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, 0x928b, 0x0076, -+ 0x2039, 0x0000, 0x080c, 0x9168, 0x00b6, 0x00c6, 0x0026, 0x2158, -+ 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, 0xb807, 0x0404, -+ 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, 0x002e, 0x00ce, -+ 0x00be, 0x0016, 0x2c08, 0x080c, 0xe2eb, 0x001e, 0x007e, 0x002e, -+ 0x8210, 0x1f04, 0x3226, 0x015e, 0x001e, 0x002e, 0x003e, 0x004e, -+ 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, -+ 0x080c, 0x56cf, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, -+ 0x2009, 0x0029, 0x080c, 0xe5ae, 0x001e, 0x002e, 0x004e, 0x0005, -+ 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff, 0x01e8, 0x080c, -+ 0x696a, 0x11d0, 0x2100, 0x080c, 0x2871, 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, 0x1ab0, 0x001e, 0x6112, -+ 0x080c, 0x31bf, 0x001e, 0x080c, 0x65c3, 0x012e, 0x00ce, 0x001e, -+ 0x0005, 0x0016, 0x0026, 0x2110, 0x080c, 0xa808, 0x080c, 0xe917, -+ 0x002e, 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x0005, -+ 0x00c6, 0x00b6, 0x080c, 0x73bc, 0x1118, 0x20a9, 0x0800, 0x0010, -+ 0x20a9, 0x0782, 0x080c, 0x73bc, 0x1110, 0x900e, 0x0010, 0x2009, -+ 0x007e, 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, -+ 0xb800, 0xd0bc, 0x090c, 0x65c3, 0x8108, 0x1f04, 0x32f9, 0x2061, -+ 0x1800, 0x607f, 0x0000, 0x6080, 0x9084, 0x00ff, 0x6082, 0x60b3, -+ 0x0000, 0x00be, 0x00ce, 0x0005, 0x2001, 0x1869, 0x2004, 0xd0bc, -+ 0x0005, 0x2011, 0x1848, 0x2214, 0xd2ec, 0x0005, 0x0026, 0x2011, -+ 0x1867, 0x2214, 0xd2dc, 0x002e, 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, 0x189e, 0x7003, -+ 0x0002, 0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, -+ 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, 0x7007, 0x0001, 0x080c, -+ 0x1018, 0x090c, 0x0dd5, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, -+ 0xdcb0, 0x080c, 0x1018, 0x090c, 0x0dd5, 0x2900, 0x706e, 0xa867, -+ 0x0002, 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004, 0x0002, -+ 0x3454, 0x3455, 0x3468, 0x347c, 0x0005, 0x1004, 0x3465, 0x0e04, -+ 0x3465, 0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, -+ 0x1128, 0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, -+ 0x2079, 0x0000, 0x2061, 0x18b8, 0x2c4c, 0xa86c, 0x908e, 0x0100, -+ 0x0128, 0x9086, 0x0200, 0x0904, 0x3550, 0x0005, 0x7018, 0x2048, -+ 0x2061, 0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, 0x9094, -+ 0x00ff, 0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, -+ 0x9086, 0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, 0x1800, -+ 0x701c, 0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, 0x1210, -+ 0x61d0, 0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x354d, 0x61d0, -+ 0x0804, 0x34e2, 0x3524, 0x355c, 0x3566, 0x356a, 0x3574, 0x357a, -+ 0x357e, 0x358e, 0x3591, 0x359b, 0x35a0, 0x35a5, 0x35b0, 0x35bb, -+ 0x35ca, 0x35d9, 0x35e7, 0x35fe, 0x3619, 0x354d, 0x36c2, 0x3700, -+ 0x37a6, 0x37b7, 0x37da, 0x354d, 0x354d, 0x354d, 0x3812, 0x382e, -+ 0x3837, 0x3866, 0x386c, 0x354d, 0x38b2, 0x354d, 0x354d, 0x354d, -+ 0x354d, 0x354d, 0x38bd, 0x38c6, 0x38ce, 0x38d0, 0x354d, 0x354d, -+ 0x354d, 0x354d, 0x354d, 0x354d, 0x38fc, 0x354d, 0x354d, 0x354d, -+ 0x354d, 0x354d, 0x3919, 0x397a, 0x354d, 0x354d, 0x354d, 0x354d, -+ 0x354d, 0x354d, 0x0002, 0x39a4, 0x39a7, 0x3a06, 0x3a1f, 0x3a4f, -+ 0x3ced, 0x354d, 0x52a8, 0x354d, 0x354d, 0x354d, 0x354d, 0x354d, -+ 0x354d, 0x354d, 0x354d, 0x359b, 0x35a0, 0x420e, 0x56f3, 0x422c, -+ 0x5337, 0x5388, 0x548b, 0x354d, 0x54ed, 0x5529, 0x555a, 0x565e, -+ 0x5587, 0x55de, 0x354d, 0x4230, 0x43f1, 0x4407, 0x442c, 0x4491, -+ 0x4505, 0x4525, 0x459c, 0x45f8, 0x4654, 0x4657, 0x467c, 0x4719, -+ 0x477f, 0x4787, 0x48b9, 0x4a2e, 0x4a62, 0x4cc6, 0x354d, 0x4ce4, -+ 0x4d90, 0x4e72, 0x4ecc, 0x354d, 0x4f81, 0x354d, 0x4fe7, 0x5002, -+ 0x4787, 0x5248, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x4ae0, -+ 0x0126, 0x2091, 0x8000, 0x0e04, 0x352e, 0x0010, 0x012e, 0x0cc0, -+ 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, -+ 0x0010, 0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, -+ 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x7007, 0x0001, 0x2091, -+ 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, -+ 0x2021, 0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, 0x4005, -+ 0x0868, 0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, -+ 0x7b88, 0x7a8c, 0x7884, 0x7990, 0x0804, 0x4aed, 0x7883, 0x0004, -+ 0x7884, 0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, -+ 0x7884, 0x7990, 0x0804, 0x4af0, 0x7984, 0x7888, 0x2114, 0x200a, -+ 0x0804, 0x3524, 0x7984, 0x2114, 0x0804, 0x3524, 0x20e1, 0x0000, -+ 0x2099, 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, -+ 0x4003, 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x3524, 0x7884, 0x2060, -+ 0x04d8, 0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x001c, 0x789b, -+ 0x0137, 0x0804, 0x3524, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, -+ 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, -+ 0x0210, 0x0804, 0x3559, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x3560, -+ 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3559, 0x2138, 0x7d98, -+ 0x7c9c, 0x0804, 0x356e, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, -+ 0x3559, 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, -+ 0x0804, 0x3524, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, -+ 0x8c60, 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x3524, 0x0804, -+ 0x3553, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x3559, 0x21e0, -+ 0x20a9, 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x3524, 0x2069, -+ 0x1847, 0x7884, 0x7990, 0x911a, 0x1a04, 0x3559, 0x8019, 0x0904, -+ 0x3559, 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, -+ 0x685a, 0x685e, 0x080c, 0x76d5, 0x0804, 0x3524, 0x2069, 0x1847, -+ 0x7884, 0x7994, 0x911a, 0x1a04, 0x3559, 0x8019, 0x0904, 0x3559, -+ 0x684e, 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, -+ 0x686e, 0x0126, 0x2091, 0x8000, 0x080c, 0x69dc, 0x012e, 0x0804, -+ 0x3524, 0x902e, 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, -+ 0x3556, 0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, -+ 0x20a1, 0x18a6, 0x4101, 0x080c, 0x4aa4, 0x1120, 0x2009, 0x0002, -+ 0x0804, 0x3556, 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, -+ 0x080c, 0x4aed, 0x701f, 0x363d, 0x0005, 0xa864, 0x2008, 0x9084, -+ 0x00ff, 0x9096, 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, -+ 0x0015, 0x0138, 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, -+ 0x3556, 0x810f, 0x918c, 0x00ff, 0x0904, 0x3556, 0x7112, 0x7010, -+ 0x8001, 0x0560, 0x7012, 0x080c, 0x4aa4, 0x1120, 0x2009, 0x0002, -+ 0x0804, 0x3556, 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, -+ 0xa494, 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, -+ 0x95a9, 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4aed, -+ 0x701f, 0x367b, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, -+ 0x0120, 0x9096, 0x000a, 0x1904, 0x3556, 0x0888, 0x7014, 0x2048, -+ 0xa868, 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, -+ 0x1160, 0xc2fd, 0xaa7a, 0x080c, 0x618b, 0x0150, 0x0126, 0x2091, -+ 0x8000, 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x64b4, 0x1128, -+ 0x7007, 0x0003, 0x701f, 0x36a7, 0x0005, 0x080c, 0x6ec0, 0x0126, -+ 0x2091, 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x18a6, -+ 0x400a, 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, -+ 0x0000, 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, -+ 0x0804, 0x4af0, 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, 0x1a19, 0x2004, 0x9005, -+ 0x0128, 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, -+ 0x2003, 0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, -+ 0x81ff, 0x1904, 0x3556, 0x7984, 0x080c, 0x65ff, 0x1904, 0x3559, -+ 0x7e98, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x3559, 0x7c88, -+ 0x7d8c, 0x080c, 0x6762, 0x080c, 0x6731, 0x0000, 0x1518, 0x2061, -+ 0x1cd0, 0x0126, 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, -+ 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, -+ 0x0150, 0x012e, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, -+ 0x1a04, 0x3556, 0x0c30, 0x080c, 0xc768, 0x012e, 0x0904, 0x3556, -+ 0x0804, 0x3524, 0x900e, 0x2001, 0x0005, 0x080c, 0x6ec0, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0xce2a, 0x080c, 0x6c81, 0x012e, 0x0804, -+ 0x3524, 0x00a6, 0x2950, 0xb198, 0x080c, 0x65ff, 0x1904, 0x3793, -+ 0xb6a4, 0x9684, 0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, -+ 0x080c, 0x6762, 0x080c, 0x6731, 0x1520, 0x2061, 0x1cd0, 0x0126, -+ 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, -+ 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, -+ 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x2009, 0x000d, -+ 0x12b0, 0x0c28, 0x080c, 0xc768, 0x012e, 0x2009, 0x0003, 0x0178, -+ 0x00e0, 0x900e, 0x2001, 0x0005, 0x080c, 0x6ec0, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0xce2a, 0x080c, 0x6c75, 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, -+ 0x3556, 0x080c, 0x4abb, 0x0904, 0x3559, 0x080c, 0x66c6, 0x0904, -+ 0x3556, 0x080c, 0x6768, 0x0904, 0x3556, 0x0804, 0x451c, 0x81ff, -+ 0x1904, 0x3556, 0x080c, 0x4ad7, 0x0904, 0x3559, 0x080c, 0x67f6, -+ 0x0904, 0x3556, 0x2019, 0x0005, 0x79a8, 0x080c, 0x6783, 0x0904, -+ 0x3556, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3559, 0x8003, 0x800b, -+ 0x810b, 0x9108, 0x080c, 0x8501, 0x7984, 0xd184, 0x1904, 0x3524, -+ 0x0804, 0x451c, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, -+ 0x0001, 0x0450, 0x2029, 0x07ff, 0x645c, 0x2400, 0x9506, 0x01f8, -+ 0x2508, 0x080c, 0x65ff, 0x11d8, 0x080c, 0x67f6, 0x1128, 0x2009, -+ 0x0002, 0x62c0, 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, -+ 0x6783, 0x1118, 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, -+ 0x1270, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8501, 0x8529, -+ 0x1ae0, 0x012e, 0x0804, 0x3524, 0x012e, 0x0804, 0x3556, 0x012e, -+ 0x0804, 0x3559, 0x080c, 0x4abb, 0x0904, 0x3559, 0x080c, 0x66c6, -+ 0x0904, 0x3556, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, -+ 0x928b, 0x0076, 0x903e, 0x080c, 0x9168, 0x900e, 0x080c, 0xe2eb, -+ 0x007e, 0x00ce, 0x080c, 0x6762, 0x0804, 0x3524, 0x080c, 0x4abb, -+ 0x0904, 0x3559, 0x080c, 0x6762, 0x2208, 0x0804, 0x3524, 0x0156, -+ 0x00d6, 0x00e6, 0x2069, 0x1910, 0x6810, 0x6914, 0x910a, 0x1208, -+ 0x900e, 0x6816, 0x9016, 0x901e, 0x20a9, 0x007e, 0x2069, 0x1000, -+ 0x2d04, 0x905d, 0x0118, 0xb84c, 0x0059, 0x9210, 0x8d68, 0x1f04, -+ 0x3848, 0x2300, 0x9218, 0x00ee, 0x00de, 0x015e, 0x0804, 0x3524, -+ 0x00f6, 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, -+ 0x0110, 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1910, -+ 0x6910, 0x62bc, 0x0804, 0x3524, 0x81ff, 0x0120, 0x2009, 0x0001, -+ 0x0804, 0x3556, 0x0126, 0x2091, 0x8000, 0x080c, 0x56e3, 0x0128, -+ 0x2009, 0x0007, 0x012e, 0x0804, 0x3556, 0x012e, 0x615c, 0x9190, -+ 0x3325, 0x2215, 0x9294, 0x00ff, 0x637c, 0x83ff, 0x0108, 0x6280, -+ 0x67dc, 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, -+ 0x00e8, 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, -+ 0x00a8, 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, -+ 0x0068, 0x080c, 0x73bc, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, -+ 0x0120, 0x2009, 0x0005, 0x0804, 0x3556, 0x9036, 0x7e9a, 0x7f9e, -+ 0x0804, 0x3524, 0x614c, 0x6250, 0x2019, 0x1986, 0x231c, 0x2001, -+ 0x1987, 0x2004, 0x789a, 0x0804, 0x3524, 0x0126, 0x2091, 0x8000, -+ 0x6138, 0x623c, 0x6340, 0x012e, 0x0804, 0x3524, 0x080c, 0x4ad7, -+ 0x0904, 0x3559, 0xba44, 0xbb38, 0x0804, 0x3524, 0x080c, 0x0dd5, -+ 0x080c, 0x4ad7, 0x2110, 0x0904, 0x3559, 0xb804, 0x908c, 0x00ff, -+ 0x918e, 0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, -+ 0x0009, 0x1904, 0x3556, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, -+ 0x00c6, 0x9066, 0x080c, 0xa808, 0x080c, 0x928b, 0x0076, 0x903e, -+ 0x080c, 0x9168, 0x900e, 0x080c, 0xe2eb, 0x007e, 0x00ce, 0xb807, -+ 0x0407, 0x012e, 0x0804, 0x3524, 0x614c, 0x6250, 0x7884, 0x604e, -+ 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f, 0x9305, 0x6816, 0x788c, -+ 0x2069, 0x1986, 0x2d1c, 0x206a, 0x7e98, 0x9682, 0x0014, 0x1210, -+ 0x2031, 0x07d0, 0x2069, 0x1987, 0x2d04, 0x266a, 0x789a, 0x0804, -+ 0x3524, 0x0126, 0x2091, 0x8000, 0x7884, 0x603a, 0xd0c4, 0x01a8, -+ 0x00d6, 0x78a8, 0x2009, 0x199d, 0x200a, 0x78ac, 0x2011, 0x199e, -+ 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, -+ 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7884, 0xd0b4, 0x0120, -+ 0x3b00, 0x9084, 0xff3f, 0x20d8, 0x7888, 0x603e, 0x2011, 0x0114, -+ 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0080, 0x0010, 0x918c, -+ 0xff7f, 0x2112, 0x788c, 0x6042, 0x9084, 0x0020, 0x0130, 0x78b4, -+ 0x6046, 0x9084, 0x0001, 0x090c, 0x420e, 0x6040, 0xd0cc, 0x0120, -+ 0x78b0, 0x2011, 0x0114, 0x2012, 0x012e, 0x0804, 0x3524, 0x00f6, -+ 0x2079, 0x1800, 0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, -+ 0x9084, 0xfebf, 0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, -+ 0x7a3a, 0xa897, 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, -+ 0x00fe, 0x0005, 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, -+ 0x3559, 0x788c, 0x902d, 0x0904, 0x3559, 0x900e, 0x080c, 0x65ff, -+ 0x1120, 0xba44, 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, -+ 0x8108, 0x0ca0, 0x080c, 0x4ad7, 0x0904, 0x3559, 0x7888, 0x900d, -+ 0x0904, 0x3559, 0x788c, 0x9005, 0x0904, 0x3559, 0xba44, 0xb946, -+ 0xbb38, 0xb83a, 0x0804, 0x3524, 0x2011, 0xbc09, 0x0010, 0x2011, -+ 0xbc05, 0x080c, 0x56e3, 0x1904, 0x3556, 0x00c6, 0x2061, 0x0100, -+ 0x7984, 0x9186, 0x00ff, 0x1130, 0x2001, 0x1818, 0x2004, 0x9085, -+ 0xff00, 0x0088, 0x9182, 0x007f, 0x16e0, 0x9188, 0x3325, 0x210d, -+ 0x918c, 0x00ff, 0x2001, 0x1818, 0x2004, 0x0026, 0x9116, 0x002e, -+ 0x0580, 0x810f, 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, -+ 0xae0b, 0x000e, 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, -+ 0x65a4, 0x2b08, 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, -+ 0x4aa4, 0x01d0, 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, -+ 0xc0fd, 0xa86a, 0x701f, 0x39ff, 0x2900, 0x6016, 0x2009, 0x0032, -+ 0x080c, 0xaedc, 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, -+ 0x3556, 0x00ce, 0x0804, 0x3559, 0x080c, 0xae61, 0x0cb0, 0xa830, -+ 0x9086, 0x0100, 0x0904, 0x3556, 0x0804, 0x3524, 0x2061, 0x1a71, -+ 0x0126, 0x2091, 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, -+ 0x2061, 0x1800, 0x6354, 0x6074, 0x789a, 0x60c0, 0x789e, 0x60bc, -+ 0x78aa, 0x012e, 0x0804, 0x3524, 0x900e, 0x2110, 0x0c88, 0x81ff, -+ 0x1904, 0x3556, 0x080c, 0x73bc, 0x0904, 0x3556, 0x0126, 0x2091, -+ 0x8000, 0x6254, 0x6074, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, -+ 0x28a7, 0x080c, 0x58fd, 0x012e, 0x0804, 0x3524, 0x012e, 0x0804, -+ 0x3559, 0x0006, 0x0016, 0x00c6, 0x00e6, 0x2001, 0x19a9, 0x2070, -+ 0x2061, 0x1847, 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, -+ 0x8f68, 0x7206, 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, -+ 0x2091, 0x8000, 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, -+ 0x3526, 0x7884, 0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, -+ 0x00e1, 0x0288, 0x012e, 0x0804, 0x3559, 0x2001, 0x002a, 0x2004, -+ 0x2069, 0x1847, 0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x3559, -+ 0x012e, 0x0804, 0x3556, 0x080c, 0xadcb, 0x0dd0, 0x7884, 0xd0fc, -+ 0x0904, 0x3aca, 0x00c6, 0x080c, 0x4aa4, 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, 0x3c50, 0x0928, 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, -+ 0xaa18, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, -+ 0x0000, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, -+ 0x9080, 0x001b, 0x080c, 0x4aed, 0x701f, 0x3b8d, 0x7023, 0x0001, -+ 0x012e, 0x0005, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a39, 0x2001, 0x199f, 0x2003, -+ 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, -+ 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3cbf, 0x080c, -+ 0x3c7e, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x1a66, 0x2079, -+ 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, -+ 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, -+ 0x2011, 0x0001, 0x080c, 0x4052, 0x008e, 0x00ee, 0x00fe, 0x080c, -+ 0x3f7f, 0x080c, 0x3e84, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, -+ 0x0140, 0x1db8, 0x080c, 0x40c6, 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, 0x1820, -+ 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, -+ 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3e8e, 0x080c, 0x3c79, 0x0058, -+ 0x080c, 0x3c79, 0x080c, 0x3fea, 0x080c, 0x3f75, 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, 0x12ed, 0x2009, -+ 0x0028, 0x080c, 0x23d2, 0x2001, 0x0227, 0x200c, 0x2102, 0x00fe, -+ 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, -+ 0x2001, 0x199f, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x3524, -+ 0x012e, 0x2021, 0x400c, 0x0804, 0x3526, 0x0016, 0x0026, 0x0036, -+ 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, -+ 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, -+ 0x3be9, 0x2048, 0x1f04, 0x3b9d, 0x7068, 0x2040, 0xa28c, 0xa390, -+ 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, -+ 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, -+ 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, -+ 0xffc0, 0x9080, 0x001b, 0x080c, 0x4aed, 0x701f, 0x3b8d, 0x00b0, -+ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, -+ 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, -+ 0x0f7c, 0x000e, 0x080c, 0x4af0, 0x701f, 0x3b8d, 0x015e, 0x00de, -+ 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, -+ 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, -+ 0x3c4e, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, -+ 0x007f, 0x080c, 0x659e, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, -+ 0xb817, 0xfffd, 0x080c, 0xcff9, 0x015e, 0x00de, 0x009e, 0x008e, -+ 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x3556, -+ 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, -+ 0x00d6, 0x0156, 0x701f, 0x3c20, 0x7007, 0x0003, 0x0804, 0x3bde, -+ 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x3526, 0x0076, -+ 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, 0x0f7c, 0x000e, 0x080c, 0x4af0, -+ 0x007e, 0x701f, 0x3b8d, 0x7023, 0x0001, 0x0005, 0x0804, 0x3524, -+ 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, -+ 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x4aa4, -+ 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, 0x199f, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, -+ 0x00c6, 0x2061, 0x0200, 0x2001, 0x19aa, 0x2004, 0x601a, 0x2061, -+ 0x0100, 0x2001, 0x19a9, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, -+ 0x080c, 0x4aa4, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, -+ 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, -+ 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a9, 0x2004, 0x6036, -+ 0x2009, 0x0040, 0x080c, 0x23d2, 0x2001, 0x002a, 0x2004, 0x9084, -+ 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, -+ 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, -+ 0x080c, 0x4aa4, 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, 0x2c30, 0x1130, 0x9006, 0x080c, 0x2b88, -+ 0x9006, 0x080c, 0x2b6b, 0x7884, 0x9084, 0x0007, 0x0002, 0x3d0a, -+ 0x3d13, 0x3d1c, 0x3d07, 0x3d07, 0x3d07, 0x3d07, 0x3d07, 0x012e, -+ 0x0804, 0x3559, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, -+ 0x080c, 0x3ed8, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, -+ 0x200a, 0x080c, 0x3ed8, 0x0078, 0x080c, 0x73bc, 0x1128, 0x012e, -+ 0x2009, 0x0016, 0x0804, 0x3556, 0x81ff, 0x0128, 0x012e, 0x2021, -+ 0x400b, 0x0804, 0x3526, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a39, 0x2009, 0x0101, 0x210c, -+ 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, 0x2058, 0x080c, -+ 0x41a1, 0x080c, 0x40f1, 0x903e, 0x2720, 0x00f6, 0x00e6, 0x0086, -+ 0x2940, 0x2071, 0x1a66, 0x2079, 0x0090, 0x00d6, 0x2069, 0x0000, -+ 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, 0x780a, 0x00de, -+ 0x2011, 0x0001, 0x080c, 0x4052, 0x080c, 0x2c38, 0x080c, 0x2c38, -+ 0x080c, 0x2c38, 0x080c, 0x2c38, 0x080c, 0x4052, 0x008e, 0x00ee, -+ 0x00fe, 0x080c, 0x3f7f, 0x2009, 0x9c40, 0x8109, 0x11b0, 0x080c, -+ 0x3e8e, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, 0x001e, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, -+ 0x2009, 0x0017, 0x080c, 0x3556, 0x0cf8, 0x2001, 0x020b, 0x2004, -+ 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079, 0x0000, 0x7884, 0x00fe, -+ 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0150, 0x080c, -+ 0x3f5d, 0x2d00, 0x9c05, 0x9b05, 0x0120, 0x080c, 0x3e8e, 0x0804, -+ 0x3e3b, 0x080c, 0x40c6, 0x080c, 0x3fea, 0x080c, 0x3f40, 0x080c, -+ 0x3f75, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd0ac, 0x0130, 0x8b58, -+ 0x080c, 0x3e8e, 0x00fe, 0x0804, 0x3e3b, 0x00fe, 0x080c, 0x3e84, -+ 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602, 0x2001, 0x0033, 0x2502, -+ 0x080c, 0x3e8e, 0x0080, 0x87ff, 0x0138, 0x2001, 0x0201, 0x2004, -+ 0x9005, 0x1908, 0x8739, 0x0038, 0x2001, 0x1a62, 0x2004, 0x9086, -+ 0x0000, 0x1904, 0x3d8b, 0x2001, 0x032f, 0x2003, 0x00f6, 0x8631, -+ 0x1208, 0x8529, 0x2500, 0x9605, 0x0904, 0x3e3b, 0x7884, 0xd0bc, -+ 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904, 0x3e3b, 0xa013, 0x0019, -+ 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, 0x1148, 0x2001, -+ 0x1a62, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, 0x0009, 0x0030, -+ 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108, 0xa016, 0x2800, 0xa05a, -+ 0x2009, 0x0040, 0x080c, 0x23d2, 0x2900, 0xa85a, 0xa813, 0x0019, -+ 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000, 0x00c6, 0x20a9, 0x0004, -+ 0x2061, 0x0090, 0x602b, 0x0008, 0x2001, 0x0203, 0x2004, 0x1f04, -+ 0x3e12, 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, 0x3d45, 0x001e, 0x00c6, 0x2001, 0x032a, 0x2003, -+ 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x6106, 0x2011, 0x020d, -+ 0x2013, 0x0020, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, 0x2102, -+ 0x080c, 0x12ed, 0x7884, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, -+ 0x2009, 0x0028, 0x080c, 0x23d2, 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, 0x3524, 0x012e, -+ 0x2021, 0x400c, 0x0804, 0x3526, 0x9085, 0x0001, 0x1d04, 0x3e8d, -+ 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, -+ 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a62, -+ 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, 0x080c, 0x23d2, 0x2001, -+ 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, -+ 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a66, 0x7000, 0x9086, 0x0000, -+ 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, -+ 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x23d2, 0x782c, -+ 0xd0fc, 0x0d88, 0x080c, 0x40c6, 0x7000, 0x9086, 0x0000, 0x1d58, -+ 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, -+ 0x23d2, 0x782b, 0x0002, 0x7003, 0x0000, 0x00ee, 0x00fe, 0x0005, -+ 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, 0x200c, 0x7932, 0x7936, -+ 0x080c, 0x2887, 0x7850, 0x9084, 0xfbff, 0x9085, 0x0030, 0x7852, -+ 0x2019, 0x01f4, 0x8319, 0x1df0, 0x9084, 0xffcf, 0x9085, 0x2000, -+ 0x7852, 0x20a9, 0x0046, 0x1d04, 0x3ef3, 0x2091, 0x6000, 0x1f04, -+ 0x3ef3, 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, 0x3f13, 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, 0x2cef, 0x7827, 0x0020, 0x7843, -+ 0x0000, 0x9006, 0x080c, 0x2cef, 0x7827, 0x0048, 0x00fe, 0x0005, -+ 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a62, 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, 0x19aa, 0x2004, 0x70e2, 0x080c, 0x3c6f, -+ 0x1188, 0x2001, 0x1820, 0x2004, 0x2009, 0x181f, 0x210c, 0x918c, -+ 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, -+ 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1818, -+ 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, 0x0092, 0x7016, 0x080c, 0x40c6, 0x00f6, 0x2071, -+ 0x1a62, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, -+ 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, -+ 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, -+ 0x0011, 0x080c, 0x4052, 0x2011, 0x0001, 0x080c, 0x4052, 0x00fe, -+ 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a62, 0x2079, 0x0320, -+ 0x792c, 0xd1fc, 0x0904, 0x404f, 0x782b, 0x0002, 0x9026, 0xd19c, -+ 0x1904, 0x404b, 0x7000, 0x0002, 0x404f, 0x4000, 0x4030, 0x404b, -+ 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, -+ 0x080c, 0x4052, 0x0904, 0x404f, 0x080c, 0x4052, 0x0804, 0x404f, -+ 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, -+ 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, -+ 0x0de8, 0x080c, 0x3f5d, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, -+ 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, -+ 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, -+ 0x3ff4, 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, 0x0550, 0x8001, 0x0036, 0x0096, -+ 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, -+ 0x831c, 0x938a, 0x0007, 0x1a0c, 0x0dd5, 0x9398, 0x4080, 0x231d, -+ 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, -+ 0x003e, 0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, -+ 0xa05a, 0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, -+ 0x40bd, 0x40b4, 0x40ab, 0x40a2, 0x4099, 0x4090, 0x4087, 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, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, -+ 0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, -+ 0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, -+ 0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, -+ 0x0086, 0x2071, 0x1a66, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, -+ 0x782b, 0x0002, 0x2940, 0x9026, 0x7000, 0x0002, 0x40ed, 0x40d9, -+ 0x40e4, 0x8001, 0x7002, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, -+ 0x4052, 0x190c, 0x4052, 0x0048, 0x8001, 0x7002, 0x782c, 0xd0fc, -+ 0x1d38, 0x2011, 0x0001, 0x080c, 0x4052, 0x008e, 0x00ee, 0x00fe, -+ 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, -+ 0x19aa, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a9, 0x2004, -+ 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, -+ 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, -+ 0x080c, 0x4aa4, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, -+ 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, -+ 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, -+ 0x4169, 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4aa4, 0xa813, -+ 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, -+ 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, -+ 0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, -+ 0x0090, 0x2079, 0x0100, 0x2001, 0x19a9, 0x2004, 0x6036, 0x2009, -+ 0x0040, 0x080c, 0x23d2, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, -+ 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 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, 0x4aa4, 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, 0x4aa4, -+ 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, -+ 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, -+ 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x4169, -+ 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x4aa4, 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, 0x1a62, -+ 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, 0x0007, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, -+ 0x4004, 0x20a9, 0x000c, 0x20a1, 0xfff4, 0x20e9, 0x0000, 0x9006, -+ 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, -+ 0x0108, 0x0005, 0x0804, 0x3524, 0x7d98, 0x7c9c, 0x0804, 0x361b, -+ 0x080c, 0x73bc, 0x190c, 0x5fdf, 0x6040, 0x9084, 0x0020, 0x09b1, -+ 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, -+ 0x7d98, 0x2039, 0x0001, 0x080c, 0x4aed, 0x701f, 0x4248, 0x0005, -+ 0x080c, 0x56de, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, -+ 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, 0x0904, 0x3559, 0x6804, -+ 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x3559, 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, 0x3559, 0x9288, 0x3325, 0x210d, 0x918c, 0x00ff, 0x6166, -+ 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x3559, 0x605e, -+ 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, -+ 0x2009, 0x19b1, 0x9080, 0x297a, 0x2005, 0x200a, 0x000e, 0x2009, -+ 0x19b2, 0x9080, 0x297e, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, -+ 0x0a04, 0x3559, 0x908a, 0x0841, 0x1a04, 0x3559, 0x9084, 0x0007, -+ 0x1904, 0x3559, 0x680c, 0x9005, 0x0904, 0x3559, 0x6810, 0x9005, -+ 0x0904, 0x3559, 0x6848, 0x6940, 0x910a, 0x1a04, 0x3559, 0x8001, -+ 0x0904, 0x3559, 0x684c, 0x6944, 0x910a, 0x1a04, 0x3559, 0x8001, -+ 0x0904, 0x3559, 0x2009, 0x1981, 0x200b, 0x0000, 0x2001, 0x1869, -+ 0x2004, 0xd0c4, 0x0140, 0x7884, 0x200a, 0x2009, 0x017f, 0x200a, -+ 0x3b00, 0xc085, 0x20d8, 0x6814, 0x908c, 0x00ff, 0x614e, 0x8007, -+ 0x9084, 0x00ff, 0x6052, 0x080c, 0x76d5, 0x080c, 0x69a8, 0x080c, -+ 0x69dc, 0x6808, 0x602a, 0x080c, 0x2344, 0x2009, 0x0170, 0x200b, -+ 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, -+ 0x28e1, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x43df, 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, 0x19b3, 0x20e9, 0x0001, 0x4001, -+ 0x20a9, 0x0004, 0x20a1, 0x19cd, 0x20e9, 0x0001, 0x4001, 0x080c, -+ 0x85ef, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x0510, -+ 0x0068, 0x2009, 0x0100, 0x210c, 0x918e, 0x0008, 0x1110, 0x839d, -+ 0x0010, 0x83f5, 0x3e18, 0x12b0, 0x3508, 0x8109, 0x080c, 0x7c8b, -+ 0x6878, 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, -+ 0x9184, 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, -+ 0x6003, 0x0001, 0x1f04, 0x4339, 0x00ce, 0x00c6, 0x2061, 0x199c, -+ 0x6a88, 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158, 0x2063, -+ 0x0000, 0x2001, 0x0001, 0x080c, 0x2b88, 0x2001, 0x0001, 0x080c, -+ 0x2b6b, 0x0088, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001, 0x9006, -+ 0x080c, 0x2b88, 0x9006, 0x080c, 0x2b6b, 0x0028, 0x9286, 0x8000, -+ 0x1d30, 0x2063, 0x0002, 0x00ce, 0x6888, 0xd0ec, 0x0130, 0x2011, -+ 0x0114, 0x2204, 0x9085, 0x0100, 0x2012, 0x6a80, 0x9284, 0x0030, -+ 0x9086, 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, -+ 0x2001, 0x197c, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, -+ 0x928e, 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, -+ 0x080c, 0x2956, 0x2001, 0x196d, 0x2102, 0x0008, 0x2102, 0x00c6, -+ 0x2061, 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, -+ 0x73bc, 0x0128, 0x080c, 0x4fdb, 0x0110, 0x080c, 0x28a7, 0x60d4, -+ 0x9005, 0x01c0, 0x6003, 0x0001, 0x2009, 0x43c7, 0x00e0, 0x080c, -+ 0x73bc, 0x1168, 0x2011, 0x7252, 0x080c, 0x84f3, 0x2011, 0x7245, -+ 0x080c, 0x85cd, 0x080c, 0x76a9, 0x080c, 0x72ee, 0x0040, 0x080c, -+ 0x5ed9, 0x0028, 0x6003, 0x0004, 0x2009, 0x43df, 0x0020, 0x080c, -+ 0x68d4, 0x0804, 0x3524, 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, -+ 0x9086, 0x004c, 0x1118, 0x2091, 0x30bd, 0x0817, 0x2091, 0x303d, -+ 0x0817, 0x6000, 0x9086, 0x0000, 0x0904, 0x3556, 0x2069, 0x1847, -+ 0x7890, 0x6842, 0x7894, 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, -+ 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x0804, 0x4af0, 0x9006, -+ 0x080c, 0x28a7, 0x81ff, 0x1904, 0x3556, 0x080c, 0x73bc, 0x11b0, -+ 0x080c, 0x76a4, 0x080c, 0x601a, 0x080c, 0x3319, 0x0118, 0x6130, -+ 0xc18d, 0x6132, 0x080c, 0xd230, 0x0130, 0x080c, 0x73df, 0x1118, -+ 0x080c, 0x7394, 0x0038, 0x080c, 0x72ee, 0x0020, 0x080c, 0x5fdf, -+ 0x080c, 0x5ed9, 0x0804, 0x3524, 0x81ff, 0x1904, 0x3556, 0x080c, -+ 0x73bc, 0x1110, 0x0804, 0x3556, 0x6194, 0x81ff, 0x01a8, 0x704f, -+ 0x0000, 0x2001, 0x1c80, 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, -+ 0x7d98, 0x0126, 0x2091, 0x8000, 0x2039, 0x0001, 0x080c, 0x4af0, -+ 0x701f, 0x3522, 0x012e, 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, -+ 0x1c80, 0x20a9, 0x0040, 0x20e9, 0x0001, 0x20a1, 0x1c80, 0x2019, -+ 0xffff, 0x4304, 0x655c, 0x9588, 0x3325, 0x210d, 0x918c, 0x00ff, -+ 0x216a, 0x900e, 0x2011, 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, -+ 0x65ff, 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, 0x5f6a, 0x0804, -+ 0x4439, 0x080c, 0x4ad7, 0x0904, 0x3559, 0x080c, 0x4aa4, 0x1120, -+ 0x2009, 0x0002, 0x0804, 0x3556, 0x080c, 0x56cf, 0xd0b4, 0x0558, -+ 0x7884, 0x908e, 0x007e, 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, -+ 0x0080, 0x0508, 0x080c, 0x3314, 0x1148, 0xb800, 0xd08c, 0x11d8, -+ 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, -+ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xccfe, 0x1120, 0x2009, 0x0003, -+ 0x0804, 0x3556, 0x7007, 0x0003, 0x701f, 0x44c7, 0x0005, 0x080c, -+ 0x4ad7, 0x0904, 0x3559, 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, -+ 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, -+ 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, -+ 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7c, 0x0070, 0x20a9, 0x0004, -+ 0xa85c, 0x9080, 0x000a, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, -+ 0x000a, 0x2098, 0x080c, 0x0f7c, 0x8906, 0x8006, 0x8007, 0x90bc, -+ 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, -+ 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x4af0, 0x81ff, 0x1904, 0x3556, -+ 0x080c, 0x4abb, 0x0904, 0x3559, 0x080c, 0x6771, 0x0904, 0x3556, -+ 0x0058, 0xa878, 0x9005, 0x0120, 0x2009, 0x0004, 0x0804, 0x3556, -+ 0xa974, 0xaa94, 0x0804, 0x3524, 0x080c, 0x56d7, 0x0904, 0x3524, -+ 0x701f, 0x4511, 0x7007, 0x0003, 0x0005, 0x81ff, 0x1904, 0x3556, -+ 0x7888, 0x908a, 0x1000, 0x1a04, 0x3559, 0x080c, 0x4ad7, 0x0904, -+ 0x3559, 0x080c, 0x6972, 0x0120, 0x080c, 0x697a, 0x1904, 0x3559, -+ 0x080c, 0x67f6, 0x0904, 0x3556, 0x2019, 0x0004, 0x900e, 0x080c, -+ 0x6783, 0x0904, 0x3556, 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, -+ 0x908a, 0x1000, 0x12f8, 0x080c, 0x4ad5, 0x01e0, 0x080c, 0x6972, -+ 0x0118, 0x080c, 0x697a, 0x11b0, 0x080c, 0x67f6, 0x2009, 0x0002, -+ 0x0168, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x6783, 0x2009, -+ 0x0003, 0x0120, 0xa998, 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, -+ 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, -+ 0x0030, 0x0005, 0xa897, 0x4000, 0x080c, 0x56d7, 0x0110, 0x9006, -+ 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, -+ 0x00ff, 0x0110, 0x0071, 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, -+ 0x645c, 0x2400, 0x9506, 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, -+ 0x0005, 0x080c, 0x65ff, 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, -+ 0x9108, 0x080c, 0x8501, 0x0005, 0x81ff, 0x1904, 0x3556, 0x798c, -+ 0x2001, 0x1980, 0x918c, 0x8000, 0x2102, 0x080c, 0x4abb, 0x0904, -+ 0x3559, 0x080c, 0x6972, 0x0120, 0x080c, 0x697a, 0x1904, 0x3559, -+ 0x080c, 0x66c6, 0x0904, 0x3556, 0x080c, 0x677a, 0x0904, 0x3556, -+ 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1904, 0x3524, 0x0804, 0x451c, -+ 0xa9a0, 0x2001, 0x1980, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, -+ 0x4ac8, 0x01a0, 0x080c, 0x6972, 0x0118, 0x080c, 0x697a, 0x1170, -+ 0x080c, 0x66c6, 0x2009, 0x0002, 0x0128, 0x080c, 0x677a, 0x1170, -+ 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, -+ 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, -+ 0x2001, 0x1980, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x56d7, 0x0110, -+ 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, -+ 0x81ff, 0x1904, 0x3556, 0x798c, 0x2001, 0x197f, 0x918c, 0x8000, -+ 0x2102, 0x080c, 0x4abb, 0x0904, 0x3559, 0x080c, 0x6972, 0x0120, -+ 0x080c, 0x697a, 0x1904, 0x3559, 0x080c, 0x66c6, 0x0904, 0x3556, -+ 0x080c, 0x6768, 0x0904, 0x3556, 0x2001, 0x197f, 0x2004, 0xd0fc, -+ 0x1904, 0x3524, 0x0804, 0x451c, 0xa9a0, 0x2001, 0x197f, 0x918c, -+ 0x8000, 0xc18d, 0x2102, 0x080c, 0x4ac8, 0x01a0, 0x080c, 0x6972, -+ 0x0118, 0x080c, 0x697a, 0x1170, 0x080c, 0x66c6, 0x2009, 0x0002, -+ 0x0128, 0x080c, 0x6768, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, -+ 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, -+ 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x197f, 0x2004, 0xd0fc, -+ 0x1128, 0x080c, 0x56d7, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, -+ 0x0001, 0x2001, 0x0000, 0x0005, 0x6100, 0x0804, 0x3524, 0x080c, -+ 0x4ad7, 0x0904, 0x3559, 0x080c, 0x56e3, 0x1904, 0x3556, 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, 0x3524, 0x78a8, 0x909c, 0x0003, 0xd0b4, -+ 0x1148, 0x939a, 0x0003, 0x1a04, 0x3556, 0x625c, 0x7884, 0x9206, -+ 0x1904, 0x46c9, 0x080c, 0x85d9, 0x2001, 0xfff4, 0x2009, 0x000c, -+ 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0000, 0x0006, 0x78a8, -+ 0x9084, 0x0080, 0x11c8, 0x0006, 0x0036, 0x2001, 0x1a7f, 0x201c, -+ 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a80, 0x201c, 0x7b9e, 0x2003, -+ 0x0000, 0x2001, 0x1a81, 0x201c, 0x7ba2, 0x2003, 0x0000, 0x003e, -+ 0x000e, 0x000e, 0x0804, 0x4af0, 0x000e, 0x2031, 0x0000, 0x2061, -+ 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, -+ 0xa496, 0xa59a, 0x080c, 0x10e9, 0x7007, 0x0002, 0x701f, 0x46e9, -+ 0x0005, 0x81ff, 0x1904, 0x3556, 0x080c, 0x4ad7, 0x0904, 0x3559, -+ 0x080c, 0x6972, 0x1904, 0x3556, 0x00c6, 0x080c, 0x4aa4, 0x00ce, -+ 0x0904, 0x3556, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, -+ 0x080c, 0xcca4, 0x0904, 0x3556, 0x7007, 0x0003, 0x701f, 0x4703, -+ 0x0005, 0x080c, 0x420e, 0x0006, 0x0036, 0x2001, 0x1a7f, 0x201c, -+ 0x7b9a, 0x2003, 0x0000, 0x2001, 0x1a80, 0x201c, 0x7b9e, 0x2003, -+ 0x0000, 0x2001, 0x1a81, 0x201c, 0x7ba2, 0x2003, 0x0000, 0x003e, -+ 0x000e, 0x0804, 0x3524, 0xa830, 0x9086, 0x0100, 0x0904, 0x3556, -+ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, -+ 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, -+ 0x4af0, 0x9006, 0x080c, 0x28a7, 0x78a8, 0x9084, 0x00ff, 0x9086, -+ 0x00ff, 0x0118, 0x81ff, 0x1904, 0x3556, 0x080c, 0x73bc, 0x0110, -+ 0x080c, 0x5fdf, 0x7888, 0x908a, 0x1000, 0x1a04, 0x3559, 0x7984, -+ 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x3559, 0x2100, -+ 0x080c, 0x2871, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, -+ 0x19fa, 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, -+ 0x0000, 0x080c, 0x73bc, 0x1158, 0x080c, 0x76a4, 0x080c, 0x601a, -+ 0x9085, 0x0001, 0x080c, 0x7403, 0x080c, 0x72ee, 0x00d0, 0x080c, -+ 0xadd2, 0x2061, 0x0100, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, -+ 0x810f, 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, -+ 0x1999, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5f05, 0x080c, -+ 0x858b, 0x7984, 0x080c, 0x73bc, 0x1110, 0x2009, 0x00ff, 0x7a88, -+ 0x080c, 0x457f, 0x012e, 0x00ce, 0x002e, 0x0804, 0x3524, 0x7984, -+ 0x080c, 0x659e, 0x2b08, 0x1904, 0x3559, 0x0804, 0x3524, 0x81ff, -+ 0x0120, 0x2009, 0x0001, 0x0804, 0x3556, 0x60dc, 0xd0ac, 0x1130, -+ 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3556, 0x080c, 0x4aa4, -+ 0x1120, 0x2009, 0x0002, 0x0804, 0x3556, 0x7984, 0x9192, 0x0021, -+ 0x1a04, 0x3559, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, -+ 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, 0x4aed, 0x701f, 0x47b7, -+ 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, 0x518d, 0x0005, 0x2009, -+ 0x0080, 0x080c, 0x65ff, 0x1118, 0x080c, 0x6972, 0x0120, 0x2021, -+ 0x400a, 0x0804, 0x3526, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, -+ 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x4850, -+ 0x90be, 0x0112, 0x0904, 0x4850, 0x90be, 0x0113, 0x0904, 0x4850, -+ 0x90be, 0x0114, 0x0904, 0x4850, 0x90be, 0x0117, 0x0904, 0x4850, -+ 0x90be, 0x011a, 0x0904, 0x4850, 0x90be, 0x011c, 0x0904, 0x4850, -+ 0x90be, 0x0121, 0x0904, 0x4837, 0x90be, 0x0131, 0x0904, 0x4837, -+ 0x90be, 0x0171, 0x0904, 0x4850, 0x90be, 0x0173, 0x0904, 0x4850, -+ 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x485b, -+ 0x90be, 0x0212, 0x0904, 0x4844, 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, 0x3559, 0x7028, 0x9080, -+ 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, -+ 0x080c, 0x4899, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, -+ 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4899, 0x00c8, 0x7028, -+ 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, -+ 0x0001, 0x080c, 0x48a6, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, -+ 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x48a6, -+ 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, -+ 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4aa4, 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, 0xccbf, 0x1120, -+ 0x2009, 0x0003, 0x0804, 0x3556, 0x7007, 0x0003, 0x701f, 0x4890, -+ 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x3556, -+ 0xa820, 0x9086, 0x8001, 0x1904, 0x3524, 0x2009, 0x0004, 0x0804, -+ 0x3556, 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, 0x3556, 0x60dc, -+ 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, 0x3556, -+ 0x7984, 0x78a8, 0x2040, 0x080c, 0xadcb, 0x1120, 0x9182, 0x007f, -+ 0x0a04, 0x3559, 0x9186, 0x00ff, 0x0904, 0x3559, 0x9182, 0x0800, -+ 0x1a04, 0x3559, 0x7a8c, 0x7b88, 0x607c, 0x9306, 0x1140, 0x6080, -+ 0x924e, 0x0904, 0x3559, 0x99cc, 0xff00, 0x0904, 0x3559, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x49b7, 0x0904, 0x4937, 0x0086, 0x90c6, -+ 0x4000, 0x008e, 0x1538, 0x00c6, 0x0006, 0x0036, 0xb818, 0xbb1c, -+ 0x9305, 0xbb20, 0x9305, 0xbb24, 0x9305, 0xbb28, 0x9305, 0xbb2c, -+ 0x9305, 0xbb30, 0x9305, 0xbb34, 0x9305, 0x003e, 0x0570, 0xd88c, -+ 0x1128, 0x080c, 0x6972, 0x0110, 0xc89d, 0x0438, 0x900e, 0x080c, -+ 0x681f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x000e, -+ 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090, 0x90c6, -+ 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009, 0x1108, -+ 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005, 0x2009, -+ 0x000a, 0x2020, 0x012e, 0x0804, 0x3526, 0x000e, 0x00ce, 0x2b00, -+ 0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0xaeaf, -+ 0x0904, 0x498c, 0x2b00, 0x6012, 0x080c, 0xcfaa, 0x2e58, 0x00ee, -+ 0x00e6, 0x00c6, 0x080c, 0x4aa4, 0x00ce, 0x2b70, 0x1158, 0x080c, -+ 0xae61, 0x00ee, 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, -+ 0x0804, 0x3556, 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, -+ 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0xd89c, 0x1110, -+ 0x080c, 0x31bf, 0x6023, 0x0001, 0x9006, 0x080c, 0x653b, 0xd89c, -+ 0x0138, 0x2001, 0x0004, 0x080c, 0x654f, 0x2009, 0x0003, 0x0030, -+ 0x2001, 0x0002, 0x080c, 0x654f, 0x2009, 0x0002, 0x080c, 0xaedc, -+ 0x78a8, 0xd094, 0x0138, 0x00ee, 0x7024, 0x00e6, 0x2058, 0xb8cc, -+ 0xc08d, 0xb8ce, 0x9085, 0x0001, 0x00ee, 0x00ce, 0x00be, 0x001e, -+ 0x012e, 0x1120, 0x2009, 0x0003, 0x0804, 0x3556, 0x7007, 0x0003, -+ 0x701f, 0x499b, 0x0005, 0xa830, 0x9086, 0x0100, 0x7024, 0x2058, -+ 0x1138, 0x2009, 0x0004, 0xba04, 0x9294, 0x00ff, 0x0804, 0x562c, -+ 0x900e, 0xa868, 0xd0f4, 0x1904, 0x3524, 0x080c, 0x681f, 0x1108, -+ 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3524, 0x00e6, -+ 0x00d6, 0x0096, 0x83ff, 0x0904, 0x4a06, 0x902e, 0x080c, 0xadcb, -+ 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, 0x1000, 0x0030, 0x2021, -+ 0x007f, 0x20a9, 0x0781, 0x2071, 0x107f, 0x2e04, 0x9005, 0x11b8, -+ 0x2100, 0x9406, 0x1904, 0x4a17, 0x2428, 0x94ce, 0x007f, 0x1120, -+ 0x92ce, 0xfffd, 0x1558, 0x0030, 0x94ce, 0x0080, 0x1130, 0x92ce, -+ 0xfffc, 0x1520, 0x93ce, 0x00ff, 0x1508, 0xc5fd, 0x0480, 0x2058, -+ 0xbf10, 0x2700, 0x9306, 0x11e8, 0xbe14, 0x2600, 0x9206, 0x11c8, -+ 0x2400, 0x9106, 0x1180, 0xd884, 0x0598, 0xd894, 0x1588, 0x080c, -+ 0x6912, 0x1570, 0x2001, 0x4000, 0x0460, 0x080c, 0x6972, 0x1540, -+ 0x2001, 0x4000, 0x0430, 0x2001, 0x4007, 0x0418, 0x2001, 0x4006, -+ 0x0400, 0x2400, 0x9106, 0x1158, 0xbe14, 0x87ff, 0x1128, 0x86ff, -+ 0x0918, 0x080c, 0xadcb, 0x1900, 0x2001, 0x4008, 0x0090, 0x8420, -+ 0x8e70, 0x1f04, 0x49cd, 0x85ff, 0x1130, 0x2001, 0x4009, 0x0048, -+ 0x2001, 0x0001, 0x0030, 0x080c, 0x659e, 0x1dd0, 0xbb12, 0xba16, -+ 0x9006, 0x9005, 0x009e, 0x00de, 0x00ee, 0x0005, 0x81ff, 0x0120, -+ 0x2009, 0x0001, 0x0804, 0x3556, 0x080c, 0x4aa4, 0x1120, 0x2009, -+ 0x0002, 0x0804, 0x3556, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, -+ 0x7884, 0x9005, 0x0904, 0x3559, 0x9096, 0x00ff, 0x0120, 0x9092, -+ 0x0004, 0x1a04, 0x3559, 0x2010, 0x2918, 0x080c, 0x3165, 0x1120, -+ 0x2009, 0x0003, 0x0804, 0x3556, 0x7007, 0x0003, 0x701f, 0x4a59, -+ 0x0005, 0xa830, 0x9086, 0x0100, 0x1904, 0x3524, 0x2009, 0x0004, -+ 0x0804, 0x3556, 0x7984, 0x080c, 0xadcb, 0x1120, 0x9182, 0x007f, -+ 0x0a04, 0x3559, 0x9186, 0x00ff, 0x0904, 0x3559, 0x9182, 0x0800, -+ 0x1a04, 0x3559, 0x2001, 0x9000, 0x080c, 0x5687, 0x1904, 0x3556, -+ 0x0804, 0x3524, 0xa998, 0x080c, 0xadcb, 0x1118, 0x9182, 0x007f, -+ 0x0280, 0x9186, 0x00ff, 0x0168, 0x9182, 0x0800, 0x1250, 0x2001, -+ 0x9000, 0x080c, 0x5687, 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, 0x0fff, 0x0198, 0x9006, -+ 0xa802, 0x7014, 0x9005, 0x1120, 0x2900, 0x7016, 0x701a, 0x0040, -+ 0x7018, 0xa802, 0x0086, 0x2040, 0x2900, 0xa006, 0x701a, 0x008e, -+ 0x9085, 0x0001, 0x0005, 0x7984, 0x080c, 0x65ff, 0x1130, 0x7e88, -+ 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, -+ 0xa998, 0x080c, 0x65ff, 0x1130, 0xae9c, 0x9684, 0x3fff, 0x9082, -+ 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, 0xae98, 0x0008, 0x7e84, -+ 0x2608, 0x080c, 0x65ff, 0x1108, 0x0008, 0x905e, 0x8bff, 0x0005, -+ 0x0016, 0x7114, 0x81ff, 0x0128, 0x2148, 0xa904, 0x080c, 0x1031, -+ 0x0cc8, 0x7116, 0x711a, 0x001e, 0x0005, 0x2031, 0x0001, 0x0010, -+ 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a, 0xa17a, 0xa772, -+ 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10e9, 0x7007, -+ 0x0002, 0x701f, 0x3524, 0x0005, 0x00f6, 0x0126, 0x2091, 0x8000, -+ 0x2079, 0x0000, 0x2001, 0x18b0, 0x2004, 0x9005, 0x1190, 0x0e04, -+ 0x4b21, 0x7a36, 0x7833, 0x0012, 0x7a82, 0x7b86, 0x7c8a, 0x2091, -+ 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x0804, -+ 0x4b87, 0x0016, 0x0086, 0x0096, 0x00c6, 0x00e6, 0x2071, 0x189e, -+ 0x7044, 0x9005, 0x1540, 0x7148, 0x9182, 0x0010, 0x0288, 0x7038, -+ 0x2060, 0x080c, 0x0fff, 0x0904, 0x4b7f, 0xa84b, 0x0000, 0x2900, -+ 0x7046, 0x2001, 0x0002, 0x9080, 0x2090, 0x2005, 0xa846, 0x0098, -+ 0x7038, 0x90e0, 0x0004, 0x2001, 0x18ba, 0x9c82, 0x18fa, 0x0210, -+ 0x2061, 0x18ba, 0x2c00, 0x703a, 0x7148, 0x81ff, 0x1108, 0x703e, -+ 0x8108, 0x714a, 0x0460, 0x7148, 0x8108, 0x714a, 0x7044, 0x2040, -+ 0xa144, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0dd5, 0x2060, -+ 0x001e, 0x8108, 0x2105, 0x9005, 0xa146, 0x1520, 0x080c, 0x0fff, -+ 0x1130, 0x8109, 0xa946, 0x7148, 0x8109, 0x714a, 0x00d8, 0x9006, -+ 0xa806, 0xa84a, 0xa046, 0x2800, 0xa802, 0x2900, 0xa006, 0x7046, -+ 0x2001, 0x0002, 0x9080, 0x2090, 0x2005, 0xa846, 0x0058, 0x2262, -+ 0x6306, 0x640a, 0x00ee, 0x00ce, 0x009e, 0x008e, 0x001e, 0x012e, -+ 0x00fe, 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4ba9, 0x4ba9, -+ 0x4bab, 0x4ba9, 0x4ba9, 0x4ba9, 0x4baf, 0x4ba9, 0x4ba9, 0x4ba9, -+ 0x4bb3, 0x4ba9, 0x4ba9, 0x4ba9, 0x4bb7, 0x4ba9, 0x4ba9, 0x4ba9, -+ 0x4bbb, 0x4ba9, 0x4ba9, 0x4ba9, 0x4bbf, 0x4ba9, 0x4ba9, 0x4ba9, -+ 0x4bc4, 0x080c, 0x0dd5, 0xa276, 0xa37a, 0xa47e, 0x0898, 0xa286, -+ 0xa38a, 0xa48e, 0x0878, 0xa296, 0xa39a, 0xa49e, 0x0858, 0xa2a6, -+ 0xa3aa, 0xa4ae, 0x0838, 0xa2b6, 0xa3ba, 0xa4be, 0x0818, 0xa2c6, -+ 0xa3ca, 0xa4ce, 0x0804, 0x4b82, 0xa2d6, 0xa3da, 0xa4de, 0x0804, -+ 0x4b82, 0x00e6, 0x2071, 0x189e, 0x7048, 0x9005, 0x0904, 0x4c5b, -+ 0x0126, 0x2091, 0x8000, 0x0e04, 0x4c5a, 0x00f6, 0x2079, 0x0000, -+ 0x00c6, 0x0096, 0x0086, 0x0076, 0x9006, 0x2038, 0x7040, 0x2048, -+ 0x9005, 0x0500, 0xa948, 0x2105, 0x0016, 0x908a, 0x0036, 0x1a0c, -+ 0x0dd5, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa94a, 0x1904, -+ 0x4c5d, 0xa804, 0x9005, 0x090c, 0x0dd5, 0x7042, 0x2938, 0x2040, -+ 0xa003, 0x0000, 0x2001, 0x0002, 0x9080, 0x2090, 0x2005, 0xa04a, -+ 0x0804, 0x4c5d, 0x703c, 0x2060, 0x2c14, 0x6304, 0x6408, 0x650c, -+ 0x2200, 0x7836, 0x7833, 0x0012, 0x7882, 0x2300, 0x7886, 0x2400, -+ 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, -+ 0x119b, 0x87ff, 0x0118, 0x2748, 0x080c, 0x1031, 0x7048, 0x8001, -+ 0x704a, 0x9005, 0x1170, 0x7040, 0x2048, 0x9005, 0x0128, 0x080c, -+ 0x1031, 0x9006, 0x7042, 0x7046, 0x703b, 0x18ba, 0x703f, 0x18ba, -+ 0x0420, 0x7040, 0x9005, 0x1508, 0x7238, 0x2c00, 0x9206, 0x0148, -+ 0x9c80, 0x0004, 0x90fa, 0x18fa, 0x0210, 0x2001, 0x18ba, 0x703e, -+ 0x00a0, 0x9006, 0x703e, 0x703a, 0x7044, 0x9005, 0x090c, 0x0dd5, -+ 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x7042, 0x2001, 0x0002, -+ 0x9080, 0x2090, 0x2005, 0xa84a, 0x0000, 0x007e, 0x008e, 0x009e, -+ 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, 0x2c00, 0x9082, 0x001b, -+ 0x0002, 0x4c7c, 0x4c7c, 0x4c7e, 0x4c7c, 0x4c7c, 0x4c7c, 0x4c83, -+ 0x4c7c, 0x4c7c, 0x4c7c, 0x4c88, 0x4c7c, 0x4c7c, 0x4c7c, 0x4c8d, -+ 0x4c7c, 0x4c7c, 0x4c7c, 0x4c92, 0x4c7c, 0x4c7c, 0x4c7c, 0x4c97, -+ 0x4c7c, 0x4c7c, 0x4c7c, 0x4c9c, 0x080c, 0x0dd5, 0xaa74, 0xab78, -+ 0xac7c, 0x0804, 0x4c08, 0xaa84, 0xab88, 0xac8c, 0x0804, 0x4c08, -+ 0xaa94, 0xab98, 0xac9c, 0x0804, 0x4c08, 0xaaa4, 0xaba8, 0xacac, -+ 0x0804, 0x4c08, 0xaab4, 0xabb8, 0xacbc, 0x0804, 0x4c08, 0xaac4, -+ 0xabc8, 0xaccc, 0x0804, 0x4c08, 0xaad4, 0xabd8, 0xacdc, 0x0804, -+ 0x4c08, 0x0016, 0x0026, 0x0036, 0x00b6, 0x00c6, 0x2009, 0x007e, -+ 0x080c, 0x65ff, 0x2019, 0x0001, 0xb85c, 0xd0ac, 0x0110, 0x2019, -+ 0x0000, 0x2011, 0x801b, 0x080c, 0x4b04, 0x00ce, 0x00be, 0x003e, -+ 0x002e, 0x001e, 0x0005, 0x0026, 0x080c, 0x56cf, 0xd0c4, 0x0120, -+ 0x2011, 0x8014, 0x080c, 0x4b04, 0x002e, 0x0005, 0x81ff, 0x1904, -+ 0x3556, 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, 0xc085, 0xc0ac, -+ 0x6032, 0x080c, 0x73bc, 0x1158, 0x080c, 0x76a4, 0x080c, 0x601a, -+ 0x9085, 0x0001, 0x080c, 0x7403, 0x080c, 0x72ee, 0x0010, 0x080c, -+ 0x5ed9, 0x012e, 0x0804, 0x3524, 0x81ff, 0x0120, 0x2009, 0x0001, -+ 0x0804, 0x3556, 0x080c, 0x56e3, 0x0120, 0x2009, 0x0007, 0x0804, -+ 0x3556, 0x080c, 0x696a, 0x0120, 0x2009, 0x0008, 0x0804, 0x3556, -+ 0x080c, 0x3314, 0x0128, 0x7984, 0x080c, 0x659e, 0x1904, 0x3559, -+ 0x080c, 0x4ad7, 0x0904, 0x3559, 0x2b00, 0x7026, 0x080c, 0x6972, -+ 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, 0x681f, -+ 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3524, -+ 0x080c, 0x4aa4, 0x0904, 0x3556, 0x9006, 0xa866, 0xa832, 0xa868, -+ 0xc0fd, 0xa86a, 0x080c, 0xcd58, 0x0904, 0x3556, 0x7888, 0xd094, -+ 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 0x7007, 0x0003, 0x701f, 0x4d7d, -+ 0x0005, 0x2061, 0x1800, 0x080c, 0x56e3, 0x2009, 0x0007, 0x1578, -+ 0x080c, 0x696a, 0x0118, 0x2009, 0x0008, 0x0448, 0x080c, 0x3314, -+ 0x0120, 0xa998, 0x080c, 0x659e, 0x1530, 0x080c, 0x4ad5, 0x0518, -+ 0x080c, 0x6972, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, 0x900e, -+ 0x080c, 0x681f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xcd58, 0x11e0, 0xa89c, -+ 0xd094, 0x0118, 0xb8cc, 0xc08d, 0xb8ce, 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, -+ 0x7024, 0x2058, 0x1110, 0x0804, 0x562c, 0x900e, 0x080c, 0x681f, -+ 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, 0x3524, -+ 0x080c, 0x56e3, 0x0120, 0x2009, 0x0007, 0x0804, 0x3556, 0x7f84, -+ 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4aa4, 0x1120, 0x2009, -+ 0x0002, 0x0804, 0x3556, 0x900e, 0x2130, 0x7126, 0x7132, 0xa860, -+ 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, 0x080c, -+ 0x65ff, 0x1904, 0x4e1f, 0x080c, 0x6972, 0x0138, 0x080c, 0x697a, -+ 0x0120, 0x080c, 0x6912, 0x1904, 0x4e1f, 0xd794, 0x1110, 0xd784, -+ 0x01a8, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x3400, -+ 0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, -+ 0x20e0, 0x20a9, 0x0002, 0x080c, 0x48a6, 0x0048, 0x20a9, 0x0004, -+ 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x48a6, 0x9186, -+ 0x007e, 0x0170, 0x9186, 0x0080, 0x0158, 0x080c, 0x6972, 0x90c2, -+ 0x0006, 0x1210, 0xc1fd, 0x0020, 0x080c, 0x681f, 0x1108, 0xc1fd, -+ 0x4104, 0xc1fc, 0xd794, 0x0528, 0xb8c4, 0x20e0, 0xb8c8, 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, -+ 0x4899, 0x9c80, 0x0026, 0x2098, 0xb8c4, 0x20e0, 0x20a9, 0x0002, -+ 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, -+ 0x080c, 0xadcb, 0x0118, 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, -+ 0x9186, 0x0800, 0x0170, 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, -+ 0x0118, 0x9686, 0x0020, 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, -+ 0x4daf, 0x86ff, 0x1120, 0x7124, 0x810b, 0x0804, 0x3524, 0x7033, -+ 0x0001, 0x7122, 0x7024, 0x9600, 0x7026, 0x772e, 0x2061, 0x18b8, -+ 0x2c44, 0xa06b, 0x0000, 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, -+ 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x10e9, 0x7007, 0x0002, -+ 0x701f, 0x4e5b, 0x0005, 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, -+ 0x20a0, 0x772c, 0x9036, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, -+ 0xa28c, 0xa390, 0xa494, 0xa598, 0x0804, 0x4daf, 0x7124, 0x810b, -+ 0x0804, 0x3524, 0x2029, 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, -+ 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3559, 0x9502, -+ 0x0a04, 0x3559, 0x9184, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3559, -+ 0x9502, 0x0a04, 0x3559, 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, -+ 0x0a04, 0x3559, 0x9502, 0x0a04, 0x3559, 0x9284, 0x00ff, 0x90e2, -+ 0x0020, 0x0a04, 0x3559, 0x9502, 0x0a04, 0x3559, 0x9384, 0xff00, -+ 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3559, 0x9502, 0x0a04, 0x3559, -+ 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x3559, 0x9502, 0x0a04, -+ 0x3559, 0x9484, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x3559, -+ 0x9502, 0x0a04, 0x3559, 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, -+ 0x3559, 0x9502, 0x0a04, 0x3559, 0x2061, 0x1989, 0x6102, 0x6206, -+ 0x630a, 0x640e, 0x0804, 0x3524, 0x080c, 0x4aa4, 0x0904, 0x3556, -+ 0x2009, 0x0016, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, -+ 0x0019, 0xaf60, 0x080c, 0x4aed, 0x701f, 0x4edf, 0x0005, 0x2001, -+ 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, 0x0300, 0x701c, 0xd0a4, -+ 0x1de8, 0x00ee, 0x20a9, 0x0016, 0x896e, 0x8d6e, 0x8d6f, 0x9d84, -+ 0xffc0, 0x9080, 0x0019, 0x2098, 0x9d84, 0x003f, 0x20e0, 0x2069, -+ 0x1877, 0x20e9, 0x0001, 0x2da0, 0x4003, 0x6800, 0x9005, 0x0904, -+ 0x4f60, 0x6804, 0x2008, 0x918c, 0xfff8, 0x1904, 0x4f60, 0x680c, -+ 0x9005, 0x0904, 0x4f60, 0x9082, 0xff01, 0x1a04, 0x4f60, 0x6810, -+ 0x9082, 0x005c, 0x0a04, 0x4f60, 0x6824, 0x2008, 0x9082, 0x0008, -+ 0x0a04, 0x4f60, 0x9182, 0x0400, 0x1a04, 0x4f60, 0x0056, 0x2029, -+ 0x0000, 0x080c, 0x8afb, 0x005e, 0x6944, 0x6820, 0x9102, 0x06c0, -+ 0x6820, 0x9082, 0x0019, 0x16a0, 0x6828, 0x6944, 0x810c, 0x9102, -+ 0x0678, 0x6840, 0x9082, 0x000f, 0x1658, 0x080c, 0x1018, 0x2900, -+ 0x0904, 0x4f7a, 0x684e, 0x00e6, 0x2071, 0x1930, 0x00b6, 0x2059, -+ 0x0000, 0x080c, 0x89b7, 0x00be, 0x00ee, 0x0558, 0x080c, 0x8711, -+ 0x080c, 0x8757, 0x11e0, 0x6857, 0x0000, 0x00c6, 0x2061, 0x0100, -+ 0x6104, 0x918d, 0x2000, 0x6106, 0x6b10, 0x2061, 0x1a62, 0x630a, -+ 0x00ce, 0x080c, 0x2956, 0x2001, 0x0138, 0x2102, 0x0804, 0x3524, -+ 0x080c, 0x2956, 0x2001, 0x0138, 0x2102, 0x0804, 0x3559, 0x00e6, -+ 0x2071, 0x1930, 0x080c, 0x8b8c, 0x080c, 0x8b9b, 0x080c, 0x89a6, -+ 0x00ee, 0x2001, 0x188a, 0x204c, 0x080c, 0x1031, 0x2001, 0x188a, -+ 0x2003, 0x0000, 0x080c, 0x2956, 0x2001, 0x0138, 0x2102, 0x0804, -+ 0x3556, 0x2001, 0x1924, 0x200c, 0x918e, 0x0000, 0x0904, 0x4fd9, -+ 0x080c, 0x89a1, 0x0904, 0x4fd9, 0x2001, 0x0101, 0x200c, 0x918c, -+ 0xdfff, 0x2102, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, -+ 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x080c, 0x89a6, 0x2001, -+ 0x0035, 0x080c, 0x15ee, 0x00c6, 0x2061, 0x193c, 0x6004, 0x6100, -+ 0x9106, 0x1de0, 0x00ce, 0x080c, 0x2956, 0x2001, 0x0138, 0x2102, -+ 0x00e6, 0x00f6, 0x2071, 0x1923, 0x080c, 0x88e2, 0x0120, 0x2f00, -+ 0x080c, 0x896c, 0x0cc8, 0x00fe, 0x00ee, 0x0126, 0x2091, 0x8000, -+ 0x2001, 0x188a, 0x200c, 0x81ff, 0x0138, 0x2148, 0x080c, 0x1031, -+ 0x2001, 0x188a, 0x2003, 0x0000, 0x2001, 0x183c, 0x2003, 0x0020, -+ 0x00e6, 0x2071, 0x1930, 0x080c, 0x8b8c, 0x080c, 0x8b9b, 0x00ee, -+ 0x012e, 0x0804, 0x3524, 0x0006, 0x080c, 0x56cf, 0xd0cc, 0x000e, -+ 0x0005, 0x0006, 0x080c, 0x56d3, 0xd0bc, 0x000e, 0x0005, 0x6174, -+ 0x7a84, 0x6300, 0x82ff, 0x1118, 0x7986, 0x0804, 0x3524, 0x83ff, -+ 0x1904, 0x3559, 0x2001, 0xfff0, 0x9200, 0x1a04, 0x3559, 0x2019, -+ 0xffff, 0x6078, 0x9302, 0x9200, 0x0a04, 0x3559, 0x7986, 0x6276, -+ 0x0804, 0x3524, 0x080c, 0x56e3, 0x1904, 0x3556, 0x7c88, 0x7d84, -+ 0x7e98, 0x7f8c, 0x080c, 0x4aa4, 0x0904, 0x3556, 0x900e, 0x901e, -+ 0x7326, 0x7332, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, -+ 0x702a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, -+ 0x6972, 0x0118, 0x080c, 0x697a, 0x1148, 0x20a9, 0x0001, 0xb814, -+ 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, -+ 0x0800, 0x0120, 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, -+ 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x8f68, 0x2208, 0x0804, -+ 0x3524, 0x7033, 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, -+ 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, -+ 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x10e9, 0x7007, -+ 0x0002, 0x701f, 0x505c, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, -+ 0x7028, 0x20a0, 0x901e, 0x7034, 0x20e8, 0x2061, 0x18b8, 0x2c44, -+ 0xa48c, 0xa590, 0xa694, 0xa798, 0x0804, 0x501a, 0x7224, 0x900e, -+ 0x2001, 0x0003, 0x080c, 0x8f68, 0x2208, 0x0804, 0x3524, 0x00f6, -+ 0x00e6, 0x080c, 0x56e3, 0x2009, 0x0007, 0x1904, 0x50ef, 0x2071, -+ 0x189e, 0x745c, 0x84ff, 0x2009, 0x000e, 0x1904, 0x50ef, 0xac9c, -+ 0xad98, 0xaea4, 0xafa0, 0x0096, 0x080c, 0x1018, 0x2009, 0x0002, -+ 0x0904, 0x50ef, 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, -+ 0xa860, 0x7066, 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, -+ 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6972, 0x0118, 0x080c, -+ 0x697a, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, -+ 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, -+ 0x003c, 0x01e8, 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, -+ 0x0003, 0x080c, 0x8f68, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, -+ 0x715c, 0x81ff, 0x090c, 0x0dd5, 0x2148, 0x080c, 0x1031, 0x9006, -+ 0x705e, 0x918d, 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, -+ 0x7054, 0x9300, 0x7056, 0x2061, 0x18b9, 0x2c44, 0xa37a, 0x7058, -+ 0xa076, 0x7064, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, -+ 0x50fb, 0x000e, 0xa0a2, 0x080c, 0x10e9, 0x9006, 0x0048, 0x009e, -+ 0xa897, 0x4005, 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, -+ 0x00ee, 0x00fe, 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0dd5, -+ 0x00e6, 0x2071, 0x189e, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, -+ 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, -+ 0x1158, 0x7150, 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, -+ 0xa590, 0xa694, 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, -+ 0xa897, 0x4000, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x8f68, -+ 0xaa9a, 0x715c, 0x81ff, 0x090c, 0x0dd5, 0x2148, 0x080c, 0x1031, -+ 0x705f, 0x0000, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x6c81, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, -+ 0x0005, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6972, -+ 0x0118, 0x080c, 0x697a, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, -+ 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, -+ 0x0120, 0x9386, 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, -+ 0x810c, 0xa99a, 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0dd5, -+ 0x2148, 0x080c, 0x1031, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, -+ 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c81, 0x012e, -+ 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, -+ 0x7054, 0x9300, 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, -+ 0x080c, 0x10e9, 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, -+ 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, -+ 0x009e, 0x0804, 0x3559, 0xa884, 0xa988, 0x080c, 0x283e, 0x1518, -+ 0x080c, 0x659e, 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, -+ 0x4aa4, 0x01c8, 0x080c, 0x4aa4, 0x01b0, 0x009e, 0xa867, 0x0000, -+ 0xa868, 0xc0fd, 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, -+ 0xccdf, 0x1120, 0x2009, 0x0003, 0x0804, 0x3556, 0x7007, 0x0003, -+ 0x701f, 0x51c8, 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x3556, -+ 0x7124, 0x080c, 0x32bb, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, -+ 0x0004, 0x0804, 0x3556, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, -+ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, -+ 0x9080, 0x0002, 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, -+ 0x20a9, 0x002a, 0x080c, 0x0f7c, 0xaa6c, 0xab70, 0xac74, 0xad78, -+ 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, -+ 0x7000, 0x0118, 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, -+ 0x2009, 0x0004, 0x000e, 0x007e, 0x0804, 0x4af0, 0x97c6, 0x7200, -+ 0x11b8, 0x96c2, 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18b8, -+ 0x2c44, 0xa076, 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, -+ 0xa59a, 0x080c, 0x10e9, 0x7007, 0x0002, 0x701f, 0x5224, 0x0005, -+ 0x000e, 0x007e, 0x0804, 0x3559, 0x7020, 0x2048, 0xa804, 0x2048, -+ 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, -+ 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, -+ 0x002a, 0x080c, 0x0f7c, 0x2100, 0x2238, 0x2061, 0x18b8, 0x2c44, -+ 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x4af0, -+ 0x81ff, 0x1904, 0x3556, 0x798c, 0x2001, 0x197e, 0x918c, 0x8000, -+ 0x2102, 0x080c, 0x4abb, 0x0904, 0x3559, 0x080c, 0x6972, 0x0120, -+ 0x080c, 0x697a, 0x1904, 0x3559, 0x080c, 0x66c6, 0x0904, 0x3556, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x678c, 0x012e, 0x0904, 0x3556, -+ 0x2001, 0x197e, 0x2004, 0xd0fc, 0x1904, 0x3524, 0x0804, 0x451c, -+ 0xa9a0, 0x2001, 0x197e, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, -+ 0x4ac8, 0x01a0, 0x080c, 0x6972, 0x0118, 0x080c, 0x697a, 0x1170, -+ 0x080c, 0x66c6, 0x2009, 0x0002, 0x0128, 0x080c, 0x678c, 0x1170, -+ 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, -+ 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, -+ 0x2001, 0x197e, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x56d7, 0x0110, -+ 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, -+ 0x78a8, 0xd08c, 0x1118, 0xd084, 0x0904, 0x4491, 0x080c, 0x4ad7, -+ 0x0904, 0x3559, 0x080c, 0x4aa4, 0x1120, 0x2009, 0x0002, 0x0804, -+ 0x3556, 0x080c, 0x6972, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, -+ 0x0005, 0x15a0, 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, -+ 0x0028, 0x080c, 0x56cf, 0xd0b4, 0x0904, 0x44cb, 0x7884, 0x908e, -+ 0x007e, 0x0904, 0x44cb, 0x908e, 0x007f, 0x0904, 0x44cb, 0x908e, -+ 0x0080, 0x0904, 0x44cb, 0xb800, 0xd08c, 0x1904, 0x44cb, 0xa867, -+ 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xccfe, 0x1120, 0x2009, -+ 0x0003, 0x0804, 0x3556, 0x7007, 0x0003, 0x701f, 0x52f0, 0x0005, -+ 0x080c, 0x4ad7, 0x0904, 0x3559, 0x0804, 0x44cb, 0x080c, 0x3314, -+ 0x0108, 0x0005, 0x2009, 0x1834, 0x210c, 0x81ff, 0x0120, 0x2009, -+ 0x0001, 0x0804, 0x3556, 0x080c, 0x56e3, 0x0120, 0x2009, 0x0007, -+ 0x0804, 0x3556, 0x080c, 0x696a, 0x0120, 0x2009, 0x0008, 0x0804, -+ 0x3556, 0xb89c, 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x44cb, 0x9006, -+ 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xcd58, 0x1120, -+ 0x2009, 0x0003, 0x0804, 0x3556, 0x7007, 0x0003, 0x701f, 0x5329, -+ 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, -+ 0x562c, 0x080c, 0x4ad7, 0x0904, 0x3559, 0x0804, 0x52c2, 0x81ff, -+ 0x2009, 0x0001, 0x1904, 0x3556, 0x080c, 0x56e3, 0x2009, 0x0007, -+ 0x1904, 0x3556, 0x080c, 0x696a, 0x0120, 0x2009, 0x0008, 0x0804, -+ 0x3556, 0x080c, 0x4ad7, 0x0904, 0x3559, 0x080c, 0x6972, 0x2009, -+ 0x0009, 0x1904, 0x3556, 0x080c, 0x4aa4, 0x2009, 0x0002, 0x0904, -+ 0x3556, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, -+ 0x9194, 0xff00, 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, -+ 0xa952, 0x798c, 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x3559, -+ 0xc0e5, 0xa952, 0xa956, 0xa83e, 0x080c, 0xcfab, 0x2009, 0x0003, -+ 0x0904, 0x3556, 0x7007, 0x0003, 0x701f, 0x537f, 0x0005, 0xa830, -+ 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x3556, 0x0804, 0x3524, -+ 0x7aa8, 0x9284, 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x56e3, -+ 0x1188, 0x2009, 0x0014, 0x0804, 0x3556, 0xd2dc, 0x1568, 0x81ff, -+ 0x2009, 0x0001, 0x1904, 0x3556, 0x080c, 0x56e3, 0x2009, 0x0007, -+ 0x1904, 0x3556, 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x56aa, -+ 0x0804, 0x3524, 0xd2fc, 0x0158, 0x080c, 0x4ad7, 0x0904, 0x3559, -+ 0x7984, 0x9284, 0x9000, 0x080c, 0x5687, 0x0804, 0x3524, 0x080c, -+ 0x4ad7, 0x0904, 0x3559, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, -+ 0x2009, 0x0009, 0x1904, 0x5468, 0x080c, 0x4aa4, 0x2009, 0x0002, -+ 0x0904, 0x5468, 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, -+ 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4aed, 0x701f, 0x53d9, -+ 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, -+ 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, 0x3559, 0xa866, 0xa832, -+ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x4ad7, 0x1110, 0x0804, 0x3559, -+ 0x2009, 0x0043, 0x080c, 0xd013, 0x2009, 0x0003, 0x0904, 0x5468, -+ 0x7007, 0x0003, 0x701f, 0x53fd, 0x0005, 0xa830, 0x9086, 0x0100, -+ 0x2009, 0x0004, 0x0904, 0x5468, 0x7984, 0x7aa8, 0x9284, 0x1000, -+ 0x080c, 0x5687, 0x0804, 0x3524, 0x00c6, 0xaab0, 0x9284, 0xc000, -+ 0x0140, 0xd2ec, 0x0168, 0x080c, 0x56e3, 0x1150, 0x2009, 0x0014, -+ 0x04f0, 0x2061, 0x1800, 0x080c, 0x56e3, 0x2009, 0x0007, 0x15b8, -+ 0xd2f4, 0x0128, 0x9284, 0x5000, 0x080c, 0x56aa, 0x0050, 0xd2fc, -+ 0x0178, 0x080c, 0x4ad5, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, -+ 0x5687, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, -+ 0x080c, 0x4ad5, 0x0510, 0x080c, 0x6972, 0x2009, 0x0009, 0x11b8, -+ 0xa8c4, 0x9086, 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, -+ 0x9084, 0xff00, 0x1190, 0x080c, 0x4ad5, 0x1108, 0x0070, 0x2009, -+ 0x004b, 0x080c, 0xd013, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, -+ 0x19c0, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, -+ 0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, -+ 0x7aa8, 0xd2dc, 0x0904, 0x3556, 0x0016, 0x7984, 0x9284, 0x1000, -+ 0xc0fd, 0x080c, 0x5687, 0x001e, 0x1904, 0x3556, 0x0804, 0x3524, -+ 0x00f6, 0x2d78, 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, -+ 0x0016, 0xa998, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5687, 0x001e, -+ 0x9085, 0x0001, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, -+ 0x3556, 0x080c, 0x56e3, 0x0120, 0x2009, 0x0007, 0x0804, 0x3556, -+ 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x65ff, 0x1904, 0x3559, -+ 0x9186, 0x007f, 0x0138, 0x080c, 0x6972, 0x0120, 0x2009, 0x0009, -+ 0x0804, 0x3556, 0x080c, 0x4aa4, 0x1120, 0x2009, 0x0002, 0x0804, -+ 0x3556, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, -+ 0x8007, 0xa80a, 0x080c, 0xcd18, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x3556, 0x7007, 0x0003, 0x701f, 0x54c6, 0x0005, 0xa808, 0x8007, -+ 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x3556, 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, 0x4af0, 0x080c, 0x4aa4, 0x1120, -+ 0x2009, 0x0002, 0x0804, 0x3556, 0x7984, 0x9194, 0xff00, 0x918c, -+ 0x00ff, 0x8217, 0x82ff, 0x1118, 0x7023, 0x19b3, 0x0040, 0x92c6, -+ 0x0001, 0x1118, 0x7023, 0x19cd, 0x0010, 0x0804, 0x3559, 0x2009, -+ 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, -+ 0xaf60, 0x080c, 0x4aed, 0x701f, 0x5516, 0x0005, 0x2001, 0x182e, -+ 0x2003, 0x0001, 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, -+ 0x20a9, 0x001a, 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, -+ 0x3524, 0x080c, 0x4aa4, 0x1120, 0x2009, 0x0002, 0x0804, 0x3556, -+ 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, -+ 0x2099, 0x19b3, 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x19cd, -+ 0x0010, 0x0804, 0x3559, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, -+ 0x20e8, 0x20a9, 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, -+ 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, -+ 0x0804, 0x4af0, 0x7884, 0x908a, 0x1000, 0x1a04, 0x3559, 0x0126, -+ 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, -+ 0x19fa, 0x6142, 0x00ce, 0x012e, 0x0804, 0x3524, 0x00c6, 0x080c, -+ 0x73bc, 0x1160, 0x080c, 0x76a4, 0x080c, 0x601a, 0x9085, 0x0001, -+ 0x080c, 0x7403, 0x080c, 0x72ee, 0x080c, 0x0dd5, 0x2061, 0x1800, -+ 0x6030, 0xc09d, 0x6032, 0x080c, 0x5ed9, 0x00ce, 0x0005, 0x00c6, -+ 0x2001, 0x1800, 0x2004, 0x908e, 0x0000, 0x0904, 0x3556, 0x7884, -+ 0x9005, 0x0188, 0x7888, 0x2061, 0x199c, 0x2c0c, 0x2062, 0x080c, -+ 0x2c20, 0x01a0, 0x080c, 0x2c28, 0x0188, 0x080c, 0x2c30, 0x0170, -+ 0x2162, 0x0804, 0x3559, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, -+ 0x1118, 0x2009, 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, -+ 0x0002, 0x1548, 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x0026, -+ 0x2011, 0x0003, 0x080c, 0xa653, 0x2011, 0x0002, 0x080c, 0xa65d, -+ 0x002e, 0x080c, 0xa540, 0x0036, 0x901e, 0x080c, 0xa5b6, 0x003e, -+ 0x60e3, 0x0000, 0x080c, 0xe9e9, 0x080c, 0xea04, 0x9085, 0x0001, -+ 0x080c, 0x7403, 0x9006, 0x080c, 0x2cef, 0x2001, 0x1800, 0x2003, -+ 0x0004, 0x6027, 0x0008, 0x00ce, 0x0804, 0x3524, 0x81ff, 0x0120, -+ 0x2009, 0x0001, 0x0804, 0x3556, 0x080c, 0x56e3, 0x0120, 0x2009, -+ 0x0007, 0x0804, 0x3556, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, -+ 0x65ff, 0x1904, 0x3559, 0x9186, 0x007f, 0x0138, 0x080c, 0x6972, -+ 0x0120, 0x2009, 0x0009, 0x0804, 0x3556, 0x080c, 0x4aa4, 0x1120, -+ 0x2009, 0x0002, 0x0804, 0x3556, 0xa867, 0x0000, 0xa868, 0xc0fd, -+ 0xa86a, 0x080c, 0xcd1b, 0x1120, 0x2009, 0x0003, 0x0804, 0x3556, -+ 0x7007, 0x0003, 0x701f, 0x5615, 0x0005, 0xa830, 0x9086, 0x0100, -+ 0x1120, 0x2009, 0x0004, 0x0804, 0x3556, 0xa8e0, 0xa866, 0xa834, -+ 0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, -+ 0x7d98, 0xaf60, 0x0804, 0x4af0, 0xa898, 0x9086, 0x000d, 0x1904, -+ 0x3556, 0x2021, 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x5639, -+ 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, -+ 0x0011, 0x0010, 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, -+ 0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, 0x4ae0, 0x2091, 0x4080, -+ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x7007, 0x0001, -+ 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0x00c6, 0x2061, 0x19fa, 0x7984, 0x6152, 0x614e, 0x6057, -+ 0x0000, 0x604b, 0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888, -+ 0x6062, 0x788c, 0x605e, 0x2001, 0x1a08, 0x2044, 0x2001, 0x1a0f, -+ 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, -+ 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, 0x0804, 0x3524, 0x0126, -+ 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, -+ 0x080c, 0xcb82, 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, -+ 0x2004, 0x905d, 0x0160, 0x080c, 0x6034, 0x080c, 0xadcb, 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, 0x56b2, 0x015e, 0x012e, 0x0005, 0x2001, -+ 0x1848, 0x2004, 0x0005, 0x2001, 0x1867, 0x2004, 0x0005, 0x0006, -+ 0x2001, 0x1810, 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, -+ 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, -+ 0x0005, 0x0016, 0x00e6, 0x2071, 0x189e, 0x7108, 0x910d, 0x710a, -+ 0x00ee, 0x001e, 0x0005, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x3559, -+ 0x810c, 0x0016, 0x080c, 0x4aa4, 0x080c, 0x0f07, 0x2100, 0x2238, -+ 0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x001e, 0x080c, 0x4aed, 0x701f, -+ 0x570a, 0x0005, 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, -+ 0x79a4, 0x810c, 0x2061, 0x18b8, 0x2c44, 0xa770, 0xa074, 0x2071, -+ 0x189e, 0x080c, 0x4af0, 0x701f, 0x571e, 0x0005, 0x2061, 0x18b8, -+ 0x2c44, 0x0016, 0x0026, 0xa270, 0xa174, 0x080c, 0x0f0f, 0x002e, -+ 0x001e, 0x080c, 0x0fbc, 0x9006, 0xa802, 0xa806, 0x0804, 0x3524, -+ 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, -+ 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, -+ 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, 0x080c, 0x58d9, 0x0068, -+ 0xd08c, 0x0118, 0x080c, 0x57e2, 0x0040, 0xd094, 0x0118, 0x080c, -+ 0x57b2, 0x0018, 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, -+ 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, -+ 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, -+ 0x0006, 0x7098, 0x9005, 0x000e, 0x0120, 0x709b, 0x0000, 0x7093, -+ 0x0000, 0x624c, 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0, -+ 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294, -+ 0xff00, 0x9296, 0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160, 0x6240, -+ 0x9295, 0x0100, 0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7, -+ 0x080c, 0x5f96, 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, -+ 0x6042, 0x6043, 0x0000, 0x7087, 0x0000, 0x70a3, 0x0001, 0x70c7, -+ 0x0000, 0x70df, 0x0000, 0x2009, 0x1c80, 0x200b, 0x0000, 0x7097, -+ 0x0000, 0x708b, 0x000f, 0x2009, 0x000f, 0x2011, 0x5e7c, 0x080c, -+ 0x858b, 0x0005, 0x2001, 0x1869, 0x2004, 0xd08c, 0x0110, 0x705f, -+ 0xffff, 0x7088, 0x9005, 0x1528, 0x2011, 0x5e7c, 0x080c, 0x84f3, -+ 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, -+ 0x6044, 0xd08c, 0x1168, 0x1f04, 0x57c8, 0x6242, 0x709b, 0x0000, -+ 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, -+ 0x6242, 0x709b, 0x0000, 0x708f, 0x0000, 0x9006, 0x080c, 0x601f, -+ 0x0000, 0x0005, 0x708c, 0x908a, 0x0003, 0x1a0c, 0x0dd5, 0x000b, -+ 0x0005, 0x57ec, 0x583d, 0x58d8, 0x00f6, 0x0016, 0x6900, 0x918c, -+ 0x0800, 0x708f, 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, -+ 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, -+ 0x57fb, 0x080c, 0x0dd5, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, -+ 0x689a, 0xa001, 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, -+ 0x080c, 0x5ffb, 0x2079, 0x1c00, 0x7833, 0x1101, 0x7837, 0x0000, -+ 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1c0e, -+ 0x20a9, 0x0004, 0x4003, 0x080c, 0xab21, 0x20e1, 0x0001, 0x2099, -+ 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, -+ 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, 0x5ead, 0x00fe, 0x9006, -+ 0x7092, 0x6043, 0x0008, 0x6042, 0x0005, 0x00f6, 0x7090, 0x7093, -+ 0x0000, 0x9025, 0x0904, 0x58b5, 0x6020, 0xd0b4, 0x1904, 0x58b3, -+ 0x71a0, 0x81ff, 0x0904, 0x58a1, 0x9486, 0x000c, 0x1904, 0x58ae, -+ 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, 0x5ff4, 0x2011, 0x0260, -+ 0x2019, 0x1c00, 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, -+ 0x1f04, 0x585a, 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, -+ 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0006, 0x708f, 0x0002, -+ 0x709b, 0x0002, 0x2009, 0x07d0, 0x2011, 0x5e83, 0x080c, 0x858b, -+ 0x080c, 0x5ffb, 0x04c0, 0x080c, 0x5ff4, 0x2079, 0x0260, 0x7930, -+ 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, -+ 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, 0x080c, 0x5ff4, 0x2011, -+ 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, -+ 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, 0x5895, 0x0078, 0x70a3, -+ 0x0000, 0x080c, 0x5ff4, 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, 0xab21, 0x20e1, 0x0001, -+ 0x2099, 0x1c00, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, -+ 0x4003, 0x60c3, 0x000c, 0x2011, 0x19f1, 0x2013, 0x0000, 0x7093, -+ 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0xa26a, 0x08d8, -+ 0x0005, 0x7098, 0x908a, 0x001d, 0x1a0c, 0x0dd5, 0x000b, 0x0005, -+ 0x590a, 0x591d, 0x5946, 0x5966, 0x598c, 0x59bb, 0x59e1, 0x5a19, -+ 0x5a3f, 0x5a6d, 0x5aa8, 0x5ae0, 0x5afe, 0x5b29, 0x5b4b, 0x5b66, -+ 0x5b70, 0x5ba4, 0x5bca, 0x5bf9, 0x5c1f, 0x5c57, 0x5c9b, 0x5cd8, -+ 0x5cf9, 0x5d52, 0x5d74, 0x5da2, 0x5da2, 0x00c6, 0x2061, 0x1800, -+ 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, -+ 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, -+ 0x2061, 0x0100, 0x6043, 0x0002, 0x709b, 0x0001, 0x2009, 0x07d0, -+ 0x2011, 0x5e83, 0x080c, 0x858b, 0x0005, 0x00f6, 0x7090, 0x9086, -+ 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x5ff4, -+ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, -+ 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, -+ 0x0001, 0x2011, 0x5e83, 0x080c, 0x84f3, 0x709b, 0x0010, 0x080c, -+ 0x5b70, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, -+ 0x0003, 0x6043, 0x0004, 0x2011, 0x5e83, 0x080c, 0x84f3, 0x080c, -+ 0x5f78, 0x2079, 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, -+ 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x595b, -+ 0x60c3, 0x0014, 0x080c, 0x5ead, 0x00fe, 0x0005, 0x00f6, 0x7090, -+ 0x9005, 0x0500, 0x2011, 0x5e83, 0x080c, 0x84f3, 0x9086, 0x0014, -+ 0x11b8, 0x080c, 0x5ff4, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, -+ 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, -+ 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0004, 0x0029, 0x0010, -+ 0x080c, 0x5fd0, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0005, 0x080c, -+ 0x5f78, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, -+ 0x5ff4, 0x080c, 0x5fd7, 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, -+ 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5e30, 0x0168, -+ 0x080c, 0x5fad, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, -+ 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, -+ 0x5ead, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, -+ 0x5e83, 0x080c, 0x84f3, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ff4, -+ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, -+ 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, -+ 0x0001, 0x709b, 0x0006, 0x0029, 0x0010, 0x080c, 0x5fd0, 0x00fe, -+ 0x0005, 0x00f6, 0x709b, 0x0007, 0x080c, 0x5f78, 0x2079, 0x0240, -+ 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x5ff4, 0x080c, 0x5fd7, -+ 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, -+ 0x9180, 0x3325, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, -+ 0x080c, 0x5e30, 0x0180, 0x080c, 0x4fe1, 0x0110, 0x080c, 0x28a7, -+ 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, -+ 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5ead, 0x00fe, -+ 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5e83, 0x080c, -+ 0x84f3, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ff4, 0x2079, 0x0260, -+ 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, -+ 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, -+ 0x0008, 0x0029, 0x0010, 0x080c, 0x5fd0, 0x00fe, 0x0005, 0x00f6, -+ 0x709b, 0x0009, 0x080c, 0x5f78, 0x2079, 0x0240, 0x7833, 0x1105, -+ 0x7837, 0x0100, 0x080c, 0x5fd7, 0x1150, 0x7084, 0x9005, 0x1138, -+ 0x080c, 0x5da3, 0x1188, 0x9085, 0x0001, 0x080c, 0x28a7, 0x20a9, -+ 0x0008, 0x080c, 0x5ff4, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, -+ 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5ead, -+ 0x0010, 0x080c, 0x58fd, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, -+ 0x05a8, 0x2011, 0x5e83, 0x080c, 0x84f3, 0x9086, 0x0014, 0x1560, -+ 0x080c, 0x5ff4, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, -+ 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, -+ 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, -+ 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, -+ 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x7097, 0x0000, 0x709b, -+ 0x000e, 0x080c, 0x5b4b, 0x0010, 0x080c, 0x5fd0, 0x00fe, 0x0005, -+ 0x00f6, 0x709b, 0x000b, 0x2011, 0x1c0e, 0x20e9, 0x0001, 0x22a0, -+ 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, 0x080c, 0x5f78, 0x2079, -+ 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5fd7, 0x0118, -+ 0x2013, 0x0000, 0x0020, 0x7060, 0x9085, 0x0100, 0x2012, 0x20a9, -+ 0x0040, 0x2009, 0x024e, 0x2011, 0x1c0e, 0x220e, 0x8210, 0x8108, -+ 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, -+ 0x1f04, 0x5acd, 0x60c3, 0x0084, 0x080c, 0x5ead, 0x00fe, 0x0005, -+ 0x00f6, 0x7090, 0x9005, 0x01c0, 0x2011, 0x5e83, 0x080c, 0x84f3, -+ 0x9086, 0x0084, 0x1178, 0x080c, 0x5ff4, 0x2079, 0x0260, 0x7a30, -+ 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, 0x1120, 0x709b, 0x000c, -+ 0x0029, 0x0010, 0x080c, 0x5fd0, 0x00fe, 0x0005, 0x00f6, 0x709b, -+ 0x000d, 0x080c, 0x5f78, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, -+ 0x0000, 0x080c, 0x5ff4, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, -+ 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, -+ 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, -+ 0x0260, 0x1f04, 0x5b11, 0x60c3, 0x0084, 0x080c, 0x5ead, 0x00fe, -+ 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011, 0x5e83, 0x080c, -+ 0x84f3, 0x9086, 0x0084, 0x1198, 0x080c, 0x5ff4, 0x2079, 0x0260, -+ 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7097, -+ 0x0001, 0x080c, 0x5f4a, 0x709b, 0x000e, 0x0029, 0x0010, 0x080c, -+ 0x5fd0, 0x00fe, 0x0005, 0x918d, 0x0001, 0x080c, 0x601f, 0x709b, -+ 0x000f, 0x7093, 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, -+ 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, -+ 0x07d0, 0x2011, 0x5e83, 0x080c, 0x84e7, 0x0005, 0x7090, 0x9005, -+ 0x0130, 0x2011, 0x5e83, 0x080c, 0x84f3, 0x709b, 0x0000, 0x0005, -+ 0x709b, 0x0011, 0x080c, 0xab21, 0x080c, 0x5ff4, 0x20e1, 0x0000, -+ 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x7490, 0x9480, -+ 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, -+ 0x080c, 0x5fd7, 0x11a0, 0x717c, 0x81ff, 0x0188, 0x900e, 0x7080, -+ 0x9084, 0x00ff, 0x0160, 0x080c, 0x283e, 0x9186, 0x007e, 0x0138, -+ 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, 0x080c, 0x5e30, 0x60c3, -+ 0x0014, 0x080c, 0x5ead, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, -+ 0x2011, 0x5e83, 0x080c, 0x84f3, 0x9086, 0x0014, 0x11b8, 0x080c, -+ 0x5ff4, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, -+ 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, -+ 0x70c7, 0x0001, 0x709b, 0x0012, 0x0029, 0x0010, 0x7093, 0x0000, -+ 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0013, 0x080c, 0x5f86, 0x2079, -+ 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5ff4, 0x080c, -+ 0x5fd7, 0x1170, 0x7084, 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, -+ 0x0138, 0x2011, 0x0008, 0x080c, 0x5e30, 0x0168, 0x080c, 0x5fad, -+ 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, -+ 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5ead, 0x00fe, -+ 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5e83, 0x080c, -+ 0x84f3, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5ff4, 0x2079, 0x0260, -+ 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, -+ 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, -+ 0x0014, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, -+ 0x709b, 0x0015, 0x080c, 0x5f86, 0x2079, 0x0240, 0x7833, 0x1104, -+ 0x7837, 0x0000, 0x080c, 0x5ff4, 0x080c, 0x5fd7, 0x11b8, 0x7084, -+ 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, 0x0180, 0x9180, 0x3325, -+ 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5e30, -+ 0x0180, 0x080c, 0x4fe1, 0x0110, 0x080c, 0x28a7, 0x20a9, 0x0008, -+ 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, -+ 0x4003, 0x60c3, 0x0014, 0x080c, 0x5ead, 0x00fe, 0x0005, 0x00f6, -+ 0x7090, 0x9005, 0x05f0, 0x2011, 0x5e83, 0x080c, 0x84f3, 0x9086, -+ 0x0014, 0x15a8, 0x080c, 0x5ff4, 0x2079, 0x0260, 0x7a30, 0x9296, -+ 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, -+ 0x1168, 0x9085, 0x0001, 0x080c, 0x601f, 0x7a38, 0xd2fc, 0x0128, -+ 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x0080, 0x9005, 0x11b8, -+ 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, -+ 0x9085, 0x0001, 0x080c, 0x601f, 0x7097, 0x0000, 0x7a38, 0xd2f4, -+ 0x0110, 0x70df, 0x0008, 0x709b, 0x0016, 0x0029, 0x0010, 0x7093, -+ 0x0000, 0x00fe, 0x0005, 0x080c, 0xab21, 0x080c, 0x5ff4, 0x20e1, -+ 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, -+ 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, -+ 0x024d, 0x2012, 0x2011, 0x026e, 0x709b, 0x0017, 0x080c, 0x5fd7, -+ 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, 0x5da3, 0x1188, 0x9085, -+ 0x0001, 0x080c, 0x28a7, 0x20a9, 0x0008, 0x080c, 0x5ff4, 0x20e1, -+ 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, -+ 0x60c3, 0x0014, 0x080c, 0x5ead, 0x0010, 0x080c, 0x58fd, 0x0005, -+ 0x00f6, 0x7090, 0x9005, 0x01d8, 0x2011, 0x5e83, 0x080c, 0x84f3, -+ 0x9086, 0x0084, 0x1190, 0x080c, 0x5ff4, 0x2079, 0x0260, 0x7a30, -+ 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, -+ 0x601f, 0x709b, 0x0018, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, -+ 0x0005, 0x00f6, 0x709b, 0x0019, 0x080c, 0x5f86, 0x2079, 0x0240, -+ 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, 0x5ff4, 0x2009, 0x026e, -+ 0x2039, 0x1c0e, 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, -+ 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, -+ 0x5d0c, 0x2039, 0x1c0e, 0x080c, 0x5fd7, 0x11e8, 0x2728, 0x2514, -+ 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, -+ 0x9205, 0x202a, 0x7060, 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, 0x5d3f, 0x60c3, 0x0084, 0x080c, 0x5ead, -+ 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, 0x2011, 0x5e83, -+ 0x080c, 0x84f3, 0x9086, 0x0084, 0x1198, 0x080c, 0x5ff4, 0x2079, -+ 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, -+ 0x7097, 0x0001, 0x080c, 0x5f4a, 0x709b, 0x001a, 0x0029, 0x0010, -+ 0x7093, 0x0000, 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x601f, -+ 0x709b, 0x001b, 0x080c, 0xab21, 0x080c, 0x5ff4, 0x2011, 0x0260, -+ 0x2009, 0x0240, 0x7490, 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, 0x5d8b, 0x60c3, 0x0084, 0x080c, -+ 0x5ead, 0x0005, 0x0005, 0x0086, 0x0096, 0x2029, 0x1848, 0x252c, -+ 0x20a9, 0x0008, 0x2041, 0x1c0e, 0x20e9, 0x0001, 0x28a0, 0x080c, -+ 0x5ff4, 0x20e1, 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, -+ 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, -+ 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, -+ 0x1f04, 0x5dbd, 0x0804, 0x5e2c, 0x82ff, 0x1160, 0xd5d4, 0x0120, -+ 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5e2c, -+ 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, -+ 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, -+ 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x5de3, -+ 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x5df5, -+ 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, -+ 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5e04, -+ 0x755e, 0x95c8, 0x3325, 0x292d, 0x95ac, 0x00ff, 0x7582, 0x6532, -+ 0x6536, 0x0016, 0x2508, 0x080c, 0x2887, 0x001e, 0x60e7, 0x0000, -+ 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, 0x7087, 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, 0x715e, 0x91a0, -+ 0x3325, 0x242d, 0x95ac, 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, -+ 0x2508, 0x080c, 0x2887, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7087, -+ 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708b, -+ 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, -+ 0x0140, 0x080c, 0x5f39, 0x080c, 0xa273, 0x7004, 0x9084, 0x4000, -+ 0x0110, 0x080c, 0x2cff, 0x0126, 0x2091, 0x8000, 0x2071, 0x1826, -+ 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, -+ 0x5f96, 0x001e, 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, -+ 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x2ba5, 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, -+ 0x2011, 0x19f1, 0x2013, 0x0000, 0x7093, 0x0000, 0x012e, 0x60a3, -+ 0x0056, 0x60a7, 0x9575, 0x080c, 0xa26a, 0x6144, 0xd184, 0x0120, -+ 0x7198, 0x918d, 0x2000, 0x0018, 0x718c, 0x918d, 0x1000, 0x2011, -+ 0x1999, 0x2112, 0x2009, 0x07d0, 0x2011, 0x5e83, 0x080c, 0x858b, -+ 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0xadd2, 0x2009, 0x00f7, 0x080c, 0x5f96, 0x2061, 0x19fa, 0x900e, -+ 0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, -+ 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1999, -+ 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5f05, 0x080c, 0x84e7, -+ 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, -+ 0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0xa273, 0x2071, -+ 0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2cff, 0x080c, -+ 0x73c4, 0x0188, 0x080c, 0x73df, 0x1170, 0x080c, 0x76ae, 0x0016, -+ 0x080c, 0x2956, 0x2001, 0x196d, 0x2102, 0x001e, 0x080c, 0x76a9, -+ 0x080c, 0x72ee, 0x0050, 0x2009, 0x0001, 0x080c, 0x2c3e, 0x2001, -+ 0x0001, 0x080c, 0x27ea, 0x080c, 0x5ed9, 0x012e, 0x000e, 0x00ee, -+ 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, -+ 0x2011, 0x8017, 0x2001, 0x1999, 0x201c, 0x080c, 0x4b04, 0x003e, -+ 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1c80, -+ 0x080c, 0x5ff4, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, -+ 0x0020, 0x080c, 0x5fee, 0x2099, 0x0260, 0x20a1, 0x1c92, 0x0051, -+ 0x20a9, 0x000e, 0x080c, 0x5ff1, 0x2099, 0x0260, 0x20a1, 0x1cb2, -+ 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, -+ 0x2012, 0x8108, 0x8210, 0x1f04, 0x5f6e, 0x002e, 0x001e, 0x0005, -+ 0x080c, 0xab21, 0x20e1, 0x0001, 0x2099, 0x1c00, 0x20e9, 0x0000, -+ 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0xab21, -+ 0x080c, 0x5ff4, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, -+ 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, -+ 0x2061, 0x0100, 0x810f, 0x2001, 0x1834, 0x2004, 0x9005, 0x1138, -+ 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, -+ 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, -+ 0x696e, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe5ae, -+ 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, -+ 0x080c, 0x318a, 0x080c, 0xd230, 0x0140, 0x0036, 0x2019, 0xffff, -+ 0x2021, 0x0007, 0x080c, 0x4cbb, 0x003e, 0x004e, 0x001e, 0x0005, -+ 0x080c, 0x5ed9, 0x709b, 0x0000, 0x7093, 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, -+ 0x19a6, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, -+ 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, -+ 0x1f04, 0x602e, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, -+ 0x0146, 0x2069, 0x1847, 0x9006, 0xb802, 0xb8ce, 0xb807, 0x0707, -+ 0xb80a, 0xb80e, 0xb812, 0x9198, 0x3325, 0x231d, 0x939c, 0x00ff, -+ 0xbb16, 0x0016, 0x0026, 0xb8c2, 0x080c, 0xadcb, 0x1120, 0x9192, -+ 0x007e, 0x1208, 0xbbc2, 0x20a9, 0x0004, 0xb8c4, 0x20e8, 0xb9c8, -+ 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, 0xb8be, 0xb9a2, 0x0096, 0xb8a4, 0x904d, -+ 0x0110, 0x080c, 0x1031, 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, -+ 0x6810, 0xb83a, 0x680c, 0xb846, 0xb8bb, 0x0520, 0xb8ac, 0x9005, -+ 0x0198, 0x00c6, 0x2060, 0x9c82, 0x1cd0, 0x0a0c, 0x0dd5, 0x2001, -+ 0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0dd5, 0x080c, 0x8981, 0x00ce, -+ 0x090c, 0x8d25, 0xb8af, 0x0000, 0x6814, 0x9084, 0x00ff, 0xb842, -+ 0x014e, 0x013e, 0x015e, 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, -+ 0x611c, 0x9182, 0x0800, 0x1a04, 0x6120, 0x2001, 0x180c, 0x2004, -+ 0x9084, 0x0003, 0x1904, 0x6126, 0x9188, 0x1000, 0x2104, 0x905d, -+ 0x0518, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1508, 0xb8a4, -+ 0x900d, 0x1904, 0x6138, 0xb850, 0x900d, 0x1148, 0xa802, 0x2900, -+ 0xb852, 0xb84e, 0x080c, 0x910d, 0x9006, 0x012e, 0x0005, 0x00a6, -+ 0x2150, 0x2900, 0xb002, 0xa803, 0x0000, 0x00ae, 0xb852, 0x0c90, -+ 0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, -+ 0x9082, 0x0006, 0x1290, 0x080c, 0xadcb, 0x1160, 0xb8a0, 0x9084, -+ 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0990, 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, 0x6972, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x60cf, -+ 0x080c, 0x679b, 0x0904, 0x60e8, 0x0804, 0x60d3, 0x00b6, 0x00e6, -+ 0x0126, 0x2091, 0x8000, 0xa874, 0x908e, 0x00ff, 0x1120, 0x2001, -+ 0x196b, 0x205c, 0x0060, 0xa974, 0x9182, 0x0800, 0x1690, 0x9188, -+ 0x1000, 0x2104, 0x905d, 0x01d0, 0x080c, 0x6912, 0x11d0, 0x080c, -+ 0xae0b, 0x0570, 0x2b00, 0x6012, 0x2900, 0x6016, 0x6023, 0x0009, -+ 0x600b, 0x0000, 0xa874, 0x908e, 0x00ff, 0x1110, 0x600b, 0x8000, -+ 0x2009, 0x0043, 0x080c, 0xaedc, 0x9006, 0x00b0, 0x2001, 0x0028, -+ 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, -+ 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, -+ 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, 0x00ee, 0x00be, 0x0005, -+ 0x2001, 0x002c, 0x0cc0, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, -+ 0xa974, 0x9182, 0x0800, 0x1a04, 0x6206, 0x9188, 0x1000, 0x2104, -+ 0x905d, 0x0904, 0x61de, 0xb8a0, 0x9086, 0x007f, 0x0178, 0x080c, -+ 0x697a, 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, 0x0130, -+ 0x908e, 0x0005, 0x0118, 0x080c, 0x6972, 0x1598, 0xa87c, 0xd0fc, -+ 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, 0x080c, -+ 0xcb23, 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, 0x6208, 0x6020, -+ 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, 0x6208, 0x601a, -+ 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, 0xae0b, 0x05e8, -+ 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, -+ 0x2009, 0x0003, 0x080c, 0xaedc, 0x9006, 0x0458, 0x2001, 0x0028, -+ 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, 0xadcb, 0x1160, 0xb8a0, -+ 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, 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, -+ 0x629d, 0x6258, 0x626f, 0x629d, 0x629d, 0x629d, 0x629d, 0x629d, -+ 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, 0x659e, 0x0148, 0x9046, -+ 0xb810, 0x9306, 0x1904, 0x62a5, 0xb814, 0x9206, 0x15f0, 0x0028, -+ 0xbb12, 0xba16, 0x0010, 0x080c, 0x49b7, 0x0150, 0x04b0, 0x080c, -+ 0x65ff, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, 0x1568, -+ 0x080c, 0xae0b, 0x0530, 0x2b00, 0x6012, 0x080c, 0xcfaa, 0x2900, -+ 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, 0x0001, -+ 0x1170, 0x080c, 0x31bf, 0x9006, 0x080c, 0x653b, 0x2001, 0x0002, -+ 0x080c, 0x654f, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, 0x2009, -+ 0x0003, 0x080c, 0xaedc, 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, -+ 0x648c, 0x90c6, 0x0056, 0x0904, 0x6490, 0x90c6, 0x0066, 0x0904, -+ 0x6494, 0x90c6, 0x0067, 0x0904, 0x6498, 0x90c6, 0x0068, 0x0904, -+ 0x649c, 0x90c6, 0x0071, 0x0904, 0x64a0, 0x90c6, 0x0074, 0x0904, -+ 0x64a4, 0x90c6, 0x007c, 0x0904, 0x64a8, 0x90c6, 0x007e, 0x0904, -+ 0x64ac, 0x90c6, 0x0037, 0x0904, 0x64b0, 0x9016, 0x2079, 0x1800, -+ 0xa974, 0x9186, 0x00ff, 0x0904, 0x6487, 0x9182, 0x0800, 0x1a04, -+ 0x6487, 0x080c, 0x65ff, 0x1198, 0xb804, 0x9084, 0x00ff, 0x9082, -+ 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, 0xadcb, -+ 0x1904, 0x6470, 0xb8a0, 0x9084, 0xff80, 0x1904, 0x6470, 0xa894, -+ 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x63d0, 0x90c6, -+ 0x0064, 0x0904, 0x63f9, 0x2008, 0x0804, 0x6392, 0xa998, 0xa8b0, -+ 0x2040, 0x080c, 0xadcb, 0x1120, 0x9182, 0x007f, 0x0a04, 0x6392, -+ 0x9186, 0x00ff, 0x0904, 0x6392, 0x9182, 0x0800, 0x1a04, 0x6392, -+ 0xaaa0, 0xab9c, 0x787c, 0x9306, 0x1188, 0x7880, 0x0096, 0x924e, -+ 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, 0x6392, 0x99cc, 0xff00, -+ 0x009e, 0x1120, 0x2208, 0x2310, 0x0804, 0x6392, 0x080c, 0x49b7, -+ 0x0904, 0x639c, 0x900e, 0x9016, 0x90c6, 0x4000, 0x15e0, 0x0006, -+ 0x080c, 0x681f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, -+ 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7c, -+ 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, 0x20a0, -+ 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0f7c, -+ 0xa8c4, 0xabc8, 0x9305, 0xabcc, 0x9305, 0xabd0, 0x9305, 0xabd4, -+ 0x9305, 0xabd8, 0x9305, 0xabdc, 0x9305, 0xabe0, 0x9305, 0x9005, -+ 0x0510, 0x000e, 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x00a0, -+ 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, 0x4009, -+ 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, 0x2009, -+ 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, 0x2001, -+ 0x0030, 0x900e, 0x0478, 0x000e, 0x080c, 0xae0b, 0x1130, 0x2001, -+ 0x4005, 0x2009, 0x0003, 0x9016, 0x0c78, 0x2b00, 0x6012, 0x080c, -+ 0xcfaa, 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, -+ 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x31bf, 0x012e, -+ 0x9006, 0x080c, 0x653b, 0x2001, 0x0002, 0x080c, 0x654f, 0x2009, -+ 0x0002, 0x080c, 0xaedc, 0xa8b0, 0xd094, 0x0118, 0xb8cc, 0xc08d, -+ 0xb8ce, 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, -+ 0x080c, 0x56e3, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, -+ 0x080c, 0x65ff, 0x1904, 0x638d, 0x9186, 0x007f, 0x0130, 0x080c, -+ 0x6972, 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, 0x0fff, -+ 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, -+ 0x080c, 0xcd1b, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, -+ 0x6394, 0xa998, 0xaeb0, 0x080c, 0x65ff, 0x1904, 0x638d, 0x0096, -+ 0x080c, 0x0fff, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, 0x644d, -+ 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, 0x20a9, 0x002b, 0xb8c4, -+ 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, -+ 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, 0x20a0, 0xbbc8, -+ 0x9398, 0x0006, 0x2398, 0x080c, 0x0f7c, 0x009e, 0xa87b, 0x0000, -+ 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, 0x56cf, -+ 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, -+ 0xa89b, 0x000c, 0x00b0, 0x080c, 0x6972, 0x0118, 0xa89b, 0x0009, -+ 0x0080, 0x080c, 0x56e3, 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, -+ 0xccfe, 0x1904, 0x63c9, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, -+ 0x6394, 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, -+ 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, -+ 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, -+ 0x1243, 0x080c, 0xb37a, 0x1904, 0x63c9, 0x2009, 0x0002, 0x08e8, -+ 0x2001, 0x0028, 0x900e, 0x0804, 0x63ca, 0x2009, 0x180c, 0x210c, -+ 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, -+ 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x63ca, 0x2001, -+ 0x0029, 0x900e, 0x0804, 0x63ca, 0x080c, 0x3749, 0x0804, 0x63cb, -+ 0x080c, 0x540c, 0x0804, 0x63cb, 0x080c, 0x4547, 0x0804, 0x63cb, -+ 0x080c, 0x45c0, 0x0804, 0x63cb, 0x080c, 0x461c, 0x0804, 0x63cb, -+ 0x080c, 0x4a7a, 0x0804, 0x63cb, 0x080c, 0x4d31, 0x0804, 0x63cb, -+ 0x080c, 0x5077, 0x0804, 0x63cb, 0x080c, 0x5270, 0x0804, 0x63cb, -+ 0x080c, 0x395f, 0x0804, 0x63cb, 0x00b6, 0xa974, 0xae78, 0x9684, -+ 0x3fff, 0x9082, 0x4000, 0x1618, 0x9182, 0x0800, 0x1268, 0x9188, -+ 0x1000, 0x2104, 0x905d, 0x0140, 0x080c, 0x6972, 0x1148, 0x00e9, -+ 0x080c, 0x672a, 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, 0x19e7, 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, 0x696e, -+ 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, -+ 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, -+ 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0dd5, 0x000e, 0x00ce, -+ 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, -+ 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, -+ 0xd0a4, 0x0150, 0x080c, 0x696a, 0x1138, 0x9284, 0x00ff, 0x9086, -+ 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, -+ 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, -+ 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, -+ 0x2204, 0x905d, 0x1188, 0x0096, 0x080c, 0x0fff, 0x2958, 0x009e, -+ 0x0168, 0x2b00, 0x2012, 0xb85c, 0xb8ca, 0xb860, 0xb8c6, 0x9006, -+ 0xb8a6, 0xb8ae, 0x080c, 0x6034, 0x9006, 0x0010, 0x9085, 0x0001, -+ 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, 0x1031, 0x00d6, 0x00c6, 0xb8bc, 0x2060, -+ 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xcb35, -+ 0x0110, 0x080c, 0x0fb1, 0x080c, 0xae61, 0x00ce, 0x0c88, 0x00ce, -+ 0x00de, 0x2b48, 0xb8c8, 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x1041, -+ 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, 0x73bc, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, -+ 0xadcb, 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, -+ 0x1982, 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, -+ 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, -+ 0x0001, 0x6886, 0x2069, 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, -+ 0xb862, 0x704c, 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, -+ 0x20e8, 0xb8c8, 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, 0xbbcc, 0xc384, -+ 0xba00, 0x2009, 0x1867, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, -+ 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, -+ 0xd0cc, 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, -+ 0xbbce, 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, 0x0dd5, 0x3c00, -+ 0x20e8, 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, -+ 0x01ce, 0x014e, 0x013e, 0x0060, 0x080c, 0x0fff, 0x0170, 0x2900, -+ 0xb8a6, 0xa803, 0x0000, 0x080c, 0x67bb, 0xa807, 0x0001, 0xae12, -+ 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, -+ 0x2091, 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, -+ 0x1150, 0x080c, 0x67ca, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, -+ 0x8001, 0xa806, 0x0020, 0x080c, 0x1031, 0xb8a7, 0x0000, 0x009e, -+ 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x910d, 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, 0xa692, 0xaa00, 0xb84c, 0x9906, 0x1110, 0xba4e, 0x0020, -+ 0x00a6, 0x2150, 0xb202, 0x00ae, 0x82ff, 0x1110, 0xb952, 0x89ff, -+ 0x012e, 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, -+ 0x080c, 0x681f, 0x0128, 0x080c, 0xcbf2, 0x0010, 0x9085, 0x0001, -+ 0x0005, 0x080c, 0x681f, 0x0128, 0x080c, 0xcb97, 0x0010, 0x9085, -+ 0x0001, 0x0005, 0x080c, 0x681f, 0x0128, 0x080c, 0xcbef, 0x0010, -+ 0x9085, 0x0001, 0x0005, 0x080c, 0x681f, 0x0128, 0x080c, 0xcbb6, -+ 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x681f, 0x0128, 0x080c, -+ 0xcc33, 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, 0x0fff, 0x0168, -+ 0x2900, 0xb8a6, 0x080c, 0x67bb, 0xa803, 0x0001, 0xa807, 0x0000, -+ 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, -+ 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, -+ 0x080c, 0x1031, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, -+ 0xd0a4, 0x0005, 0x00b6, 0x00f6, 0x080c, 0x73bc, 0x01b0, 0x71c4, -+ 0x81ff, 0x1198, 0x71dc, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, -+ 0x1000, 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, -+ 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, -+ 0xd0a4, 0x01d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, -+ 0x65ff, 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, -+ 0x0118, 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, -+ 0x8108, 0x1f04, 0x6846, 0x015e, 0x080c, 0x6930, 0x0120, 0x2001, -+ 0x1985, 0x200c, 0x0038, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, -+ 0x2009, 0x07d0, 0x2011, 0x6871, 0x080c, 0x858b, 0x00fe, 0x00be, -+ 0x0005, 0x00b6, 0x2011, 0x6871, 0x080c, 0x84f3, 0x080c, 0x6930, -+ 0x01d8, 0x2001, 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, -+ 0x080c, 0x696e, 0x0130, 0x2009, 0x07d0, 0x2011, 0x6871, 0x080c, -+ 0x858b, 0x00e6, 0x2071, 0x1800, 0x9006, 0x707e, 0x7060, 0x7082, -+ 0x080c, 0x2f96, 0x00ee, 0x04b0, 0x0156, 0x00c6, 0x20a9, 0x007f, -+ 0x900e, 0x0016, 0x080c, 0x65ff, 0x1538, 0xb800, 0xd0ec, 0x0520, -+ 0x0046, 0xbaa0, 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xe5ae, -+ 0xb800, 0xc0e5, 0xc0ec, 0xb802, 0x080c, 0x696a, 0x2001, 0x0707, -+ 0x1128, 0xb804, 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x2019, -+ 0x0029, 0x080c, 0x928b, 0x0076, 0x903e, 0x080c, 0x9168, 0x900e, -+ 0x080c, 0xe2eb, 0x007e, 0x004e, 0x001e, 0x8108, 0x1f04, 0x6899, -+ 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, 0xb800, -+ 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096, 0x080c, -+ 0x1018, 0x090c, 0x0dd5, 0x2958, 0x009e, 0x2001, 0x196b, 0x2b02, -+ 0x8b07, 0x8006, 0x8006, 0x908c, 0x003f, 0xb9c6, 0x908c, 0xffc0, -+ 0xb9ca, 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x6034, 0xb807, -+ 0x0006, 0xb813, 0x00ff, 0xb817, 0xffff, 0xb86f, 0x0200, 0xb86c, -+ 0xb893, 0x0002, 0xb8bb, 0x0520, 0xb8a3, 0x00ff, 0xb8af, 0x0000, -+ 0x00ce, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, 0x00be, -+ 0xd0bc, 0x0005, 0x0006, 0x0016, 0x0026, 0xb804, 0x908c, 0x00ff, -+ 0x9196, 0x0006, 0x0188, 0x9196, 0x0004, 0x0170, 0x9196, 0x0005, -+ 0x0158, 0x908c, 0xff00, 0x810f, 0x9196, 0x0006, 0x0128, 0x9196, -+ 0x0004, 0x0110, 0x9196, 0x0005, 0x002e, 0x001e, 0x000e, 0x0005, -+ 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, 0xb800, -+ 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, 0x8000, -+ 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, 0x0dd5, -+ 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, -+ 0x002e, 0x012e, 0x0005, 0x2011, 0x1837, 0x2204, 0xd0cc, 0x0138, -+ 0x2001, 0x1983, 0x200c, 0x2011, 0x6960, 0x080c, 0x858b, 0x0005, -+ 0x2011, 0x6960, 0x080c, 0x84f3, 0x2011, 0x1837, 0x2204, 0xc0cc, -+ 0x2012, 0x0005, 0x080c, 0x56cf, 0xd0ac, 0x0005, 0x080c, 0x56cf, -+ 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, -+ 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, -+ 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xd230, 0x0158, -+ 0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, -+ 0x0110, 0xb8cc, 0xd094, 0x00fe, 0x00be, 0x0005, 0x2071, 0x1910, -+ 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, 0x701a, -+ 0x701e, 0x700a, 0x7046, 0x2001, 0x1947, 0x2003, 0x0000, 0x0005, -+ 0x0016, 0x00e6, 0x2071, 0x1948, 0x900e, 0x710a, 0x080c, 0x56cf, -+ 0xd0fc, 0x1140, 0x080c, 0x56cf, 0x900e, 0xd09c, 0x0108, 0x8108, -+ 0x7102, 0x00f8, 0x2001, 0x1867, 0x200c, 0x9184, 0x0007, 0x0002, -+ 0x69b2, 0x69b2, 0x69b2, 0x69b2, 0x69b2, 0x69c8, 0x69d6, 0x69b2, -+ 0x7003, 0x0003, 0x2009, 0x1868, 0x210c, 0x9184, 0xff00, 0x8007, -+ 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, -+ 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, -+ 0x9005, 0x1150, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc085, 0x702a, -+ 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, -+ 0x7716, 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, 0x1910, 0x7028, 0xc084, 0x702a, 0x7007, -+ 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, 0x00e6, -+ 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6c86, 0x9286, -+ 0x0003, 0x0904, 0x6b1c, 0x9286, 0x0005, 0x0904, 0x6b1c, 0x2071, -+ 0x1877, 0xa87c, 0x9005, 0x0904, 0x6a7d, 0x7140, 0xa868, 0x9102, -+ 0x0a04, 0x6c86, 0xa878, 0xd084, 0x15d8, 0xa853, 0x0019, 0x2001, -+ 0x8023, 0xa84e, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, 0x6e28, -+ 0x0e04, 0x6e96, 0x2071, 0x0000, 0xa850, 0x7032, 0xa84c, 0x7082, -+ 0xa870, 0x7086, 0xa86c, 0x708a, 0xa880, 0x708e, 0x7036, 0x0146, -+ 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, -+ 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, -+ 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x2091, 0x4080, -+ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x0804, 0x6aff, -+ 0xa853, 0x001b, 0x2001, 0x8027, 0x0820, 0x7004, 0xd08c, 0x1904, -+ 0x6c86, 0xa853, 0x001a, 0x2001, 0x8024, 0x0804, 0x6a41, 0x00e6, -+ 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6c86, 0x9286, -+ 0x0003, 0x0904, 0x6b1c, 0x9286, 0x0005, 0x0904, 0x6b1c, 0xa84f, -+ 0x8022, 0xa853, 0x0018, 0x0804, 0x6ae4, 0xa868, 0xd0fc, 0x11d8, -+ 0x00e6, 0x0026, 0x2001, 0x1948, 0x2004, 0x9005, 0x0904, 0x6c86, -+ 0xa87c, 0xd0bc, 0x1904, 0x6c86, 0xa978, 0xa874, 0x9105, 0x1904, -+ 0x6c86, 0x2001, 0x1948, 0x2004, 0x0002, 0x6c86, 0x6ae0, 0x6b1c, -+ 0x6b1c, 0x6c86, 0x6b1c, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, -+ 0x0026, 0x2009, 0x1948, 0x210c, 0x81ff, 0x0904, 0x6c86, 0xa87c, -+ 0xd0cc, 0x0904, 0x6c86, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, -+ 0x1904, 0x6c86, 0x9186, 0x0003, 0x0904, 0x6b1c, 0x9186, 0x0005, -+ 0x0904, 0x6b1c, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, -+ 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, 0x701c, 0x9005, -+ 0x1904, 0x6e28, 0x0e04, 0x6e96, 0x2071, 0x0000, 0xa84c, 0x7082, -+ 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, -+ 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2071, -+ 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, -+ 0x2900, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 0x002e, -+ 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, -+ 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, -+ 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, -+ 0x6c0b, 0x782c, 0x908c, 0x0780, 0x190c, 0x6fe2, 0x8004, 0x8004, -+ 0x8004, 0x9084, 0x0003, 0x0002, 0x6b3a, 0x6c0b, 0x6b5f, 0x6ba6, -+ 0x080c, 0x0dd5, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, -+ 0x1170, 0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, -+ 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, -+ 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, -+ 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 0x0c10, 0x2071, -+ 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1580, 0x7824, 0x00e6, -+ 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, 0x2009, 0x1830, 0x210c, -+ 0x918a, 0x0020, 0x0218, 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, -+ 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, -+ 0x8414, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe2, 0xd0a4, 0x19f0, -+ 0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, -+ 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, -+ 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, -+ 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 0x0800, 0x0096, 0x00e6, -+ 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, -+ 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8414, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6fe2, 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6fe2, 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, -+ 0x900d, 0x1560, 0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001, -+ 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x009e, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, -+ 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, -+ 0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, -+ 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, -+ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 0x00fe, -+ 0x002e, 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, -+ 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, -+ 0x900d, 0x1904, 0x6c60, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe2, -+ 0xd09c, 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, -+ 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, -+ 0x0780, 0x190c, 0x6fe2, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6fe2, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, -+ 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, -+ 0x080c, 0x8414, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe2, 0xd0a4, -+ 0x1d60, 0x00ee, 0x2071, 0x19fa, 0x703c, 0x9005, 0x1328, 0x2001, -+ 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x00e6, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, -+ 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, -+ 0x080c, 0x8414, 0x00ee, 0x0804, 0x6c1b, 0xa868, 0xd0fc, 0x1560, -+ 0x0096, 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0fb1, 0x009e, -+ 0x0018, 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, -+ 0x00f6, 0x2079, 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, -+ 0x9005, 0x1904, 0x6da2, 0x782c, 0x908c, 0x0780, 0x190c, 0x6fe2, -+ 0x8004, 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6ca5, 0x6da2, -+ 0x6cc0, 0x6d31, 0x080c, 0x0dd5, 0x0005, 0x2071, 0x1800, 0x2900, -+ 0x7822, 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 0x0c60, -+ 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6d20, -+ 0x7830, 0x8007, 0x9084, 0x001f, 0x9082, 0x0005, 0x1220, 0x00fe, -+ 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, -+ 0xd19c, 0x1148, 0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0218, -+ 0x7022, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, -+ 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8414, 0x782c, 0x9094, -+ 0x0780, 0x190c, 0x6fe2, 0xd0a4, 0x19f0, 0x0e04, 0x6d17, 0x7838, -+ 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, -+ 0x0013, 0x00de, 0x2001, 0x1921, 0x200c, 0xc184, 0x2102, 0x2091, -+ 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2009, -+ 0x1947, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, -+ 0x1921, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 0x0804, -+ 0x6cd3, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, -+ 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8414, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe2, 0xd0a4, 0x1d60, 0x00ee, -+ 0x0e04, 0x6d75, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, -+ 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, -+ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, -+ 0x2009, 0x1947, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x6fe2, 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, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 0x00fe, 0x002e, -+ 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, -+ 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, -+ 0x1904, 0x6e13, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe2, 0xd09c, -+ 0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, -+ 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe2, 0xd09c, 0x0d50, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x6fe2, 0xd0a4, 0x05c8, 0x00e6, 0x7824, -+ 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, -+ 0x8000, 0x70c2, 0x080c, 0x8414, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x6fe2, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6e0c, 0x7838, 0x7938, -+ 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, -+ 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, -+ 0x2004, 0xd084, 0x190c, 0x119b, 0x2009, 0x1947, 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, -+ 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 0x00ee, 0x0804, 0x6db2, -+ 0x2071, 0x1910, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, -+ 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, -+ 0xa804, 0x900d, 0x1128, 0x1e04, 0x6e53, 0x002e, 0x00ee, 0x0005, -+ 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, -+ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, -+ 0x8414, 0x0e04, 0x6e3d, 0x2071, 0x1910, 0x701c, 0x2048, 0xa84c, -+ 0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, -+ 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, -+ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, -+ 0x2071, 0x1910, 0x080c, 0x6fce, 0x002e, 0x00ee, 0x0005, 0xa850, -+ 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, -+ 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, -+ 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, -+ 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2071, 0x1910, -+ 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, -+ 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8414, 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, -+ 0x1910, 0x7004, 0x0002, 0x6ee1, 0x6ee2, 0x6fcd, 0x6ee2, 0x0dd5, -+ 0x6fcd, 0x0005, 0x2001, 0x1948, 0x2004, 0x0002, 0x6eec, 0x6eec, -+ 0x6f66, 0x6f67, 0x6eec, 0x6f67, 0x0126, 0x2091, 0x8000, 0x1e0c, -+ 0x6fed, 0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x6f37, -+ 0x0e04, 0x6f15, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, -+ 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, -+ 0x1278, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, -+ 0x119b, 0x2071, 0x1910, 0x080c, 0x6fce, 0x012e, 0x0804, 0x6f65, -+ 0xa850, 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, -+ 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, -+ 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, -+ 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2001, -+ 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x6fe2, 0xd09c, 0x2071, -+ 0x1910, 0x1510, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, -+ 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, -+ 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, -+ 0x2071, 0x1910, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, -+ 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, -+ 0x2008, 0x2069, 0x19fa, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, -+ 0x0003, 0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1ac8, 0x210c, -+ 0x9102, 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, -+ 0x6838, 0x9106, 0x0190, 0x0e04, 0x6f99, 0x2069, 0x0000, 0x6837, -+ 0x8040, 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, -+ 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2069, 0x19fa, 0x683f, -+ 0xffff, 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x705e, -+ 0x701c, 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, -+ 0x15c9, 0xd09c, 0x1500, 0x2071, 0x1910, 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, 0x1031, 0x0005, -+ 0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, 0x6fe4, 0x0006, 0x0016, -+ 0x2001, 0x8004, 0x0006, 0x0804, 0x0dde, 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, -+ 0x119b, 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, -+ 0x782c, 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1947, -+ 0x2104, 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, -+ 0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1148, -+ 0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0218, 0x7022, 0x00ee, -+ 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, -+ 0x8000, 0x70c2, 0x080c, 0x8414, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x6fe2, 0xd0a4, 0x19f0, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, -+ 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, -+ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x119b, 0x2009, 0x1947, -+ 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, -+ 0x119b, 0x00fe, 0x0005, 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe2, -+ 0xd0a4, 0x0db8, 0x00e6, 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, -+ 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8414, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x6fe2, 0xd0a4, 0x1d70, 0x00d6, -+ 0x2069, 0x0050, 0x693c, 0x2069, 0x1948, 0x6808, 0x690a, 0x2069, -+ 0x19fa, 0x9102, 0x1118, 0x683c, 0x9005, 0x1328, 0x2001, 0x1949, -+ 0x200c, 0x810d, 0x693e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, -+ 0x908a, 0x0029, 0x1a0c, 0x0dd5, 0x9082, 0x001d, 0x001b, 0x6027, -+ 0x1e00, 0x0005, 0x7186, 0x710c, 0x7128, 0x7152, 0x7175, 0x71b5, -+ 0x71c7, 0x7128, 0x719d, 0x70c7, 0x70f5, 0x70c6, 0x0005, 0x00d6, -+ 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518, -+ 0x709b, 0x0028, 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, 0x74f6, -+ 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, 0x0028, 0x2069, -+ 0x198f, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, -+ 0x0036, 0x0046, 0x0056, 0x2071, 0x1a62, 0x080c, 0x1aa9, 0x005e, -+ 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, -+ 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x709b, 0x0028, -+ 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, 0x7591, 0x6028, 0x9085, -+ 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, -+ 0x2cef, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x7234, 0xd1d4, -+ 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, 0x0020, 0x080c, -+ 0x7234, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, -+ 0x2001, 0x0088, 0x080c, 0x2cef, 0x6124, 0xd1cc, 0x11e8, 0xd1dc, -+ 0x11c0, 0xd1e4, 0x1198, 0x9184, 0x1e00, 0x11d8, 0x080c, 0x1ad3, -+ 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x73e8, 0x2001, -+ 0x0080, 0x080c, 0x2cef, 0x709b, 0x0028, 0x0058, 0x709b, 0x001e, -+ 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, 0x709b, -+ 0x001f, 0x0005, 0x080c, 0x1ad3, 0x60e3, 0x0001, 0x600c, 0xc0b4, -+ 0x600e, 0x080c, 0x73e8, 0x2001, 0x0080, 0x080c, 0x2cef, 0x6124, -+ 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, 0x1e00, -+ 0x1158, 0x709b, 0x0028, 0x0040, 0x709b, 0x001e, 0x0028, 0x709b, -+ 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x2001, 0x00a0, 0x080c, -+ 0x2cef, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1ad3, -+ 0x709b, 0x001e, 0x0010, 0x709b, 0x001d, 0x0005, 0x080c, 0x72b7, -+ 0x6124, 0xd1dc, 0x1188, 0x080c, 0x7234, 0x0016, 0x080c, 0x1ad3, -+ 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x709b, 0x001e, 0x0020, -+ 0x709b, 0x001f, 0x080c, 0x7234, 0x0005, 0x0006, 0x2001, 0x00a0, -+ 0x080c, 0x2cef, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, -+ 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, 0x709b, -+ 0x001d, 0x0010, 0x709b, 0x0021, 0x0005, 0x080c, 0x72b7, 0x6124, -+ 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, -+ 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x0006, -+ 0x2001, 0x0090, 0x080c, 0x2cef, 0x000e, 0x6124, 0xd1d4, 0x1178, -+ 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x709b, 0x001e, -+ 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, 0x709b, -+ 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, -+ 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x080c, -+ 0x73bc, 0x11d8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01b0, 0xc1b4, -+ 0x2102, 0x6027, 0x0200, 0x080c, 0x2c38, 0x6024, 0xd0cc, 0x0148, -+ 0x2001, 0x00a0, 0x080c, 0x2cef, 0x080c, 0x76a4, 0x080c, 0x601a, -+ 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, 0x080c, 0x73d6, 0x0150, -+ 0x080c, 0x73cd, 0x1138, 0x2001, 0x0001, 0x080c, 0x27ea, 0x080c, -+ 0x7394, 0x00a0, 0x080c, 0x72b4, 0x0178, 0x2001, 0x0001, 0x080c, -+ 0x27ea, 0x7098, 0x9086, 0x001e, 0x0120, 0x7098, 0x9086, 0x0022, -+ 0x1118, 0x709b, 0x0025, 0x0010, 0x709b, 0x0021, 0x012e, 0x00ee, -+ 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, 0x2011, 0x7245, 0x080c, -+ 0x85cd, 0x002e, 0x0016, 0x0026, 0x2009, 0x0064, 0x2011, 0x7245, -+ 0x080c, 0x85c4, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, -+ 0x080c, 0xa273, 0x2071, 0x1800, 0x080c, 0x71e2, 0x001e, 0x00fe, -+ 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, -+ 0x00f6, 0x0126, 0x080c, 0xa273, 0x2061, 0x0100, 0x2069, 0x0140, -+ 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, 0xc09c, 0x602a, 0x2011, -+ 0x0003, 0x080c, 0xa653, 0x2011, 0x0002, 0x080c, 0xa65d, 0x080c, -+ 0xa540, 0x080c, 0x8579, 0x0036, 0x901e, 0x080c, 0xa5b6, 0x003e, -+ 0x60e3, 0x0000, 0x080c, 0xe9e9, 0x080c, 0xea04, 0x2009, 0x0004, -+ 0x080c, 0x2c3e, 0x080c, 0x2b59, 0x2001, 0x1800, 0x2003, 0x0004, -+ 0x6027, 0x0008, 0x2011, 0x7245, 0x080c, 0x85cd, 0x080c, 0x73d6, -+ 0x0118, 0x9006, 0x080c, 0x2cef, 0x080c, 0x0bae, 0x2001, 0x0001, -+ 0x080c, 0x27ea, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x003e, -+ 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, 0x7252, 0x2071, -+ 0x19fa, 0x701c, 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, 0x9085, -+ 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, 0x6800, -+ 0x9084, 0xfffe, 0x9086, 0x00c0, 0x0170, 0x2001, 0x00c0, 0x080c, -+ 0x2cef, 0x0156, 0x20a9, 0x002d, 0x1d04, 0x72c4, 0x2091, 0x6000, -+ 0x1f04, 0x72c4, 0x015e, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, -+ 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x76b3, 0x2001, -+ 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, -+ 0x28b2, 0x9006, 0x080c, 0x2cef, 0x080c, 0x5ed9, 0x6027, 0xffff, -+ 0x602b, 0x182f, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, -+ 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2001, -+ 0x197d, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, 0x0001, 0x0158, -+ 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, 0x0804, 0x7384, -+ 0x709b, 0x0022, 0x0040, 0x709b, 0x0021, 0x0028, 0x709b, 0x0023, -+ 0x0010, 0x709b, 0x0024, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, -+ 0x0001, 0x080c, 0x28b2, 0x0026, 0x080c, 0xadd2, 0x002e, 0x7000, -+ 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, -+ 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, -+ 0x0150, 0x012e, 0x015e, 0x080c, 0xd230, 0x0118, 0x9006, 0x080c, -+ 0x2d19, 0x0804, 0x7390, 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, -+ 0x080c, 0x2c38, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, -+ 0x2cef, 0x1f04, 0x732e, 0x080c, 0x7413, 0x012e, 0x015e, 0x080c, -+ 0x73cd, 0x01a8, 0x6044, 0x9005, 0x0168, 0x6050, 0x0006, 0x9085, -+ 0x0020, 0x6052, 0x080c, 0x7413, 0x9006, 0x8001, 0x1df0, 0x000e, -+ 0x6052, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x7413, 0x080c, -+ 0xd230, 0x0118, 0x9006, 0x080c, 0x2d19, 0x0016, 0x0026, 0x7000, -+ 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, 0x2011, 0x7252, 0x080c, -+ 0x858b, 0x002e, 0x001e, 0x080c, 0x840b, 0x7034, 0xc085, 0x7036, -+ 0x2001, 0x197d, 0x2003, 0x0004, 0x080c, 0x70af, 0x080c, 0x73cd, -+ 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x76a9, -+ 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, -+ 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x8422, 0x080c, -+ 0x8414, 0x080c, 0x76b3, 0x2001, 0x196d, 0x2003, 0x0000, 0x9006, -+ 0x709a, 0x60e2, 0x6886, 0x080c, 0x28b2, 0x9006, 0x080c, 0x2cef, -+ 0x6043, 0x0090, 0x6043, 0x0010, 0x6027, 0xffff, 0x602b, 0x182f, -+ 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, 0x2001, 0x197c, 0x2004, -+ 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, 0x080c, 0x56d3, 0x9084, -+ 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, 0x0006, 0x080c, 0x56d3, -+ 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, 0x0005, 0x0006, 0x080c, -+ 0x56d3, 0x9084, 0x0030, 0x9086, 0x0010, 0x000e, 0x0005, 0x0006, -+ 0x080c, 0x56d3, 0x9084, 0x0030, 0x9086, 0x0020, 0x000e, 0x0005, -+ 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, 0x908c, 0x0013, 0x0180, -+ 0x0020, 0x080c, 0x28d2, 0x900e, 0x0028, 0x080c, 0x696a, 0x1dc8, -+ 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, 0x318a, 0x9006, 0x0019, -+ 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, -+ 0x080c, 0xd229, 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, 0x7428, 0x2091, 0x6000, 0x1f04, 0x7428, 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, 0x28b2, 0x2001, 0x00a0, -+ 0x0006, 0x080c, 0xd230, 0x000e, 0x0130, 0x080c, 0x2d0d, 0x9006, -+ 0x080c, 0x2d19, 0x0010, 0x080c, 0x2cef, 0x000e, 0x6052, 0x6050, -+ 0x0006, 0xc0e5, 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2bad, -+ 0x00fe, 0x000e, 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, -+ 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, -+ 0x1800, 0x6020, 0x9084, 0x0080, 0x0138, 0x2001, 0x180c, 0x200c, -+ 0xc1c5, 0x2102, 0x0804, 0x74e8, 0x2001, 0x180c, 0x200c, 0xc1c4, -+ 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x6027, 0x0200, 0x2001, -+ 0x0090, 0x080c, 0x2cef, 0x20a9, 0x0366, 0x6024, 0xd0cc, 0x1518, -+ 0x1d04, 0x7495, 0x2091, 0x6000, 0x1f04, 0x7495, 0x2011, 0x0003, -+ 0x080c, 0xa653, 0x2011, 0x0002, 0x080c, 0xa65d, 0x080c, 0xa540, -+ 0x901e, 0x080c, 0xa5b6, 0x2001, 0x00a0, 0x080c, 0x2cef, 0x080c, -+ 0x76a4, 0x080c, 0x601a, 0x080c, 0xd230, 0x0110, 0x080c, 0x0d45, -+ 0x9085, 0x0001, 0x0498, 0x86ff, 0x1110, 0x080c, 0x1ad3, 0x60e3, -+ 0x0000, 0x2001, 0x196d, 0x2004, 0x080c, 0x28b2, 0x60e2, 0x2001, -+ 0x0080, 0x080c, 0x2cef, 0x20a9, 0x0366, 0x6027, 0x1e00, 0x2009, -+ 0x1e00, 0x080c, 0x2c38, 0x6024, 0x910c, 0x0138, 0x1d04, 0x74cd, -+ 0x2091, 0x6000, 0x1f04, 0x74cd, 0x0808, 0x6028, 0x9085, 0x1e00, -+ 0x602a, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, -+ 0x080c, 0xd230, 0x0110, 0x080c, 0x0d45, 0x9006, 0x00ee, 0x00de, -+ 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, -+ 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, -+ 0x1800, 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, -+ 0x9084, 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, 0x1a79, 0x2d04, -+ 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, -+ 0x6884, 0x9005, 0x1904, 0x755b, 0x2001, 0x0088, 0x080c, 0x2cef, -+ 0x9006, 0x60e2, 0x6886, 0x080c, 0x28b2, 0x2069, 0x0200, 0x6804, -+ 0x9005, 0x1118, 0x6808, 0x9005, 0x01c0, 0x6028, 0x9084, 0xfbff, -+ 0x602a, 0x6027, 0x0400, 0x2069, 0x198f, 0x7000, 0x206a, 0x709b, -+ 0x0026, 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x753d, 0x2091, -+ 0x6000, 0x1f04, 0x753d, 0x0804, 0x7589, 0x2069, 0x0140, 0x20a9, -+ 0x0384, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2c38, 0x6024, -+ 0x910c, 0x0508, 0x9084, 0x1a00, 0x11f0, 0x1d04, 0x7549, 0x2091, -+ 0x6000, 0x1f04, 0x7549, 0x2011, 0x0003, 0x080c, 0xa653, 0x2011, -+ 0x0002, 0x080c, 0xa65d, 0x080c, 0xa540, 0x901e, 0x080c, 0xa5b6, -+ 0x2001, 0x00a0, 0x080c, 0x2cef, 0x080c, 0x76a4, 0x080c, 0x601a, -+ 0x9085, 0x0001, 0x00b0, 0x2001, 0x0080, 0x080c, 0x2cef, 0x2069, -+ 0x0140, 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, -+ 0x0008, 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x28b2, 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, 0xa653, 0x2011, 0x0002, 0x080c, 0xa65d, -+ 0x080c, 0xa540, 0x901e, 0x080c, 0xa5b6, 0x2069, 0x0140, 0x2001, -+ 0x00a0, 0x080c, 0x2cef, 0x080c, 0x76a4, 0x080c, 0x601a, 0x0804, -+ 0x7624, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, -+ 0x080c, 0x723a, 0x2069, 0x0140, 0x2001, 0x0080, 0x080c, 0x2cef, -+ 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, -+ 0x9005, 0x0180, 0x6028, 0x9084, 0xfdff, 0x602a, 0x6027, 0x0200, -+ 0x2069, 0x198f, 0x7000, 0x206a, 0x709b, 0x0027, 0x7003, 0x0001, -+ 0x0804, 0x7624, 0x6027, 0x1e00, 0x2009, 0x1e00, 0x080c, 0x2c38, -+ 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x75e2, -+ 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x8453, 0x00ee, -+ 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x19fa, 0x7018, -+ 0x00ee, 0x9005, 0x19f8, 0x0500, 0x0026, 0x2011, 0x7252, 0x080c, -+ 0x84f3, 0x2011, 0x7245, 0x080c, 0x85cd, 0x002e, 0x2069, 0x0140, -+ 0x60e3, 0x0000, 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, -+ 0x6886, 0x2001, 0x196d, 0x2004, 0x080c, 0x28b2, 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, -+ 0xd229, 0x1904, 0x7692, 0x7130, 0xd184, 0x1170, 0x080c, 0x3319, -+ 0x0138, 0xc18d, 0x7132, 0x2011, 0x1848, 0x2214, 0xd2ac, 0x1120, -+ 0x7030, 0xd08c, 0x0904, 0x7692, 0x2011, 0x1848, 0x220c, 0xd1a4, -+ 0x0538, 0x0016, 0x2019, 0x000e, 0x080c, 0xe522, 0x0156, 0x00b6, -+ 0x20a9, 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, -+ 0x0188, 0x080c, 0x65ff, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, -+ 0x000e, 0x080c, 0xe5ae, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, -+ 0x86dd, 0x001e, 0x8108, 0x1f04, 0x765b, 0x00be, 0x015e, 0x001e, -+ 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, -+ 0x318a, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, -+ 0x080c, 0x65ff, 0x1110, 0x080c, 0x6034, 0x8108, 0x1f04, 0x7688, -+ 0x00be, 0x015e, 0x080c, 0x1ad3, 0x080c, 0xadd2, 0x60e3, 0x0000, -+ 0x080c, 0x601a, 0x080c, 0x72ee, 0x00ee, 0x00ce, 0x004e, 0x003e, -+ 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x197d, 0x2003, 0x0001, -+ 0x0005, 0x2001, 0x197d, 0x2003, 0x0000, 0x0005, 0x2001, 0x197c, -+ 0x2003, 0xaaaa, 0x0005, 0x2001, 0x197c, 0x2003, 0x0000, 0x0005, -+ 0x2071, 0x18fa, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, 0x1018, -+ 0x090c, 0x0dd5, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, 0x1018, -+ 0x090c, 0x0dd5, 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, 0x18fa, 0x6807, 0x0001, -+ 0x00de, 0x080c, 0x7c90, 0x9006, 0x00ee, 0x0005, 0x900e, 0x0156, -+ 0x20a9, 0x0006, 0x8003, 0x2011, 0x0100, 0x2214, 0x9296, 0x0008, -+ 0x1110, 0x818d, 0x0010, 0x81f5, 0x3e08, 0x1f04, 0x771a, 0x015e, -+ 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa, 0x7004, 0x0002, 0x7739, -+ 0x773a, 0x7771, 0x77cc, 0x78dc, 0x7737, 0x7737, 0x7906, 0x080c, -+ 0x0dd5, 0x0005, 0x2079, 0x0040, 0x782c, 0x908c, 0x0780, 0x190c, -+ 0x7d72, 0xd0a4, 0x01f0, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, -+ 0xa864, 0x9084, 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8, 0x2001, -+ 0x1800, 0x200c, 0x9186, 0x0003, 0x1160, 0x7104, 0x9186, 0x0004, -+ 0x0140, 0x9186, 0x0007, 0x0128, 0x9186, 0x0003, 0x19e8, 0x080c, -+ 0x77cc, 0x782c, 0xd09c, 0x090c, 0x7c90, 0x0005, 0x9082, 0x005a, -+ 0x1218, 0x2100, 0x003b, 0x0c18, 0x080c, 0x7802, 0x0c90, 0x00e3, -+ 0x08f0, 0x0005, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, -+ 0x7802, 0x7802, 0x7824, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, -+ 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, -+ 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x780e, 0x7802, -+ 0x79f7, 0x7802, 0x7802, 0x7802, 0x7824, 0x7802, 0x780e, 0x7a38, -+ 0x7a79, 0x7ac0, 0x7ad4, 0x7802, 0x7802, 0x7824, 0x780e, 0x7838, -+ 0x7802, 0x78b0, 0x7b7f, 0x7b9a, 0x7802, 0x7824, 0x7802, 0x7838, -+ 0x7802, 0x7802, 0x78a6, 0x7b9a, 0x7802, 0x7802, 0x7802, 0x7802, -+ 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x784c, 0x7802, 0x7802, -+ 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x7802, 0x7d16, -+ 0x7802, 0x7cc0, 0x7802, 0x7cc0, 0x7802, 0x7861, 0x7802, 0x7802, -+ 0x7802, 0x7802, 0x7802, 0x7802, 0x2079, 0x0040, 0x7004, 0x9086, -+ 0x0003, 0x1198, 0x782c, 0x080c, 0x7cb9, 0xd0a4, 0x0170, 0x7824, -+ 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, -+ 0x001a, 0x1210, 0x002b, 0x0c50, 0x00e9, 0x080c, 0x7c90, 0x0005, -+ 0x7802, 0x780e, 0x79e3, 0x7802, 0x780e, 0x7802, 0x780e, 0x780e, -+ 0x7802, 0x780e, 0x79e3, 0x780e, 0x780e, 0x780e, 0x780e, 0x780e, -+ 0x7802, 0x780e, 0x79e3, 0x7802, 0x7802, 0x780e, 0x7802, 0x7802, -+ 0x7802, 0x780e, 0x00e6, 0x2071, 0x18fa, 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, 0x6c81, 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, -+ 0x0d08, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7985, 0x7007, -+ 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7985, 0x0005, -+ 0xa864, 0x8007, 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, -+ 0x0001, 0x0804, 0x79a0, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, -+ 0x701a, 0x704b, 0x79a0, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, -+ 0x0904, 0x780a, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x79bc, -+ 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x79bc, -+ 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, -+ 0x780a, 0x7007, 0x0001, 0x2009, 0x1834, 0x210c, 0x81ff, 0x11a8, -+ 0xa868, 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x62ae, -+ 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, -+ 0xa982, 0x080c, 0x6c81, 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, 0x7bb1, -+ 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, 0x7812, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7812, 0x82ff, -+ 0x1138, 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7943, 0x0018, -+ 0x9280, 0x7939, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7924, -+ 0x080c, 0x1018, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, -+ 0x7054, 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, -+ 0x9100, 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, -+ 0x2200, 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, -+ 0x9108, 0xa17a, 0x810b, 0xa17e, 0x080c, 0x10e9, 0xa06c, 0x908e, -+ 0x0100, 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, -+ 0x7020, 0x2048, 0x080c, 0x1031, 0x7014, 0x2048, 0x0804, 0x7812, -+ 0x7020, 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, -+ 0xa906, 0x711a, 0x0804, 0x78dc, 0x7014, 0x2048, 0x7007, 0x0001, -+ 0xa8b4, 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, -+ 0xa864, 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x7bb1, 0x0804, -+ 0x7985, 0x793b, 0x793f, 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, 0x1834, 0x210c, -+ 0x81ff, 0x1178, 0x080c, 0x60ae, 0x1108, 0x0005, 0x080c, 0x6ec0, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0xce24, 0x080c, 0x6c81, 0x012e, -+ 0x0ca0, 0x080c, 0xd229, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, -+ 0x2009, 0x1834, 0x210c, 0x81ff, 0x1188, 0xa888, 0x9005, 0x0188, -+ 0xa883, 0x0000, 0x080c, 0x613e, 0x1108, 0x0005, 0xa87a, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x6c81, 0x012e, 0x0cb8, 0x2001, 0x0028, -+ 0x0ca8, 0x2001, 0x0000, 0x0c90, 0x2009, 0x1834, 0x210c, 0x81ff, -+ 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, 0x0000, 0xa87c, 0xd0f4, -+ 0x0120, 0x080c, 0x6210, 0x1138, 0x0005, 0x9006, 0xa87a, 0x080c, -+ 0x618b, 0x1108, 0x0005, 0x0126, 0x2091, 0x8000, 0xa87a, 0xa982, -+ 0x080c, 0x6c81, 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, -+ 0x65ff, 0x11b8, 0x0066, 0xae80, 0x080c, 0x670f, 0x006e, 0x0088, -+ 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, 0x2412, 0x004e, 0x00c6, -+ 0x080c, 0x65ff, 0x1110, 0x080c, 0x680f, 0x8108, 0x1f04, 0x7a20, -+ 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, 0x1031, 0x00be, 0x0005, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x6c81, 0x012e, 0x00be, 0x0005, -+ 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x696e, 0x0580, -+ 0x2061, 0x1a71, 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, 0x7c7a, -+ 0x012e, 0x0804, 0x7c74, 0x012e, 0x0804, 0x7c6e, 0x012e, 0x0804, -+ 0x7c71, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x080c, 0x696e, -+ 0x05e0, 0x2061, 0x1a71, 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, 0x7c7a, 0x012e, 0x0804, 0x7c77, 0x012e, 0x0804, 0x7c74, -+ 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, 0x2061, 0x1a71, 0x6300, -+ 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, 0x630a, 0x012e, 0x0804, -+ 0x7c88, 0x012e, 0x0804, 0x7c77, 0x00b6, 0x0126, 0x00c6, 0x2091, -+ 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, 0x0148, 0x00c6, 0x2061, -+ 0x1a71, 0x6000, 0x9084, 0xfcff, 0x6002, 0x00ce, 0x0440, 0xa888, -+ 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, 0x2001, 0x1834, 0x2004, -+ 0x9005, 0x0118, 0x080c, 0xae92, 0x0068, 0x6017, 0xf400, 0x605b, -+ 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, 0x615a, 0x2009, 0x0041, -+ 0x080c, 0xaedc, 0xa988, 0x918c, 0xff00, 0x9186, 0x2000, 0x1138, -+ 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, 0x86dd, 0x002e, 0xa87c, -+ 0xd0c4, 0x0148, 0x2061, 0x1a71, 0x6000, 0xd08c, 0x1120, 0x6008, -+ 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, 0x00be, 0x0804, 0x7c7a, -+ 0x00ce, 0x012e, 0x00be, 0x0804, 0x7c74, 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, -+ 0x65ff, 0x1968, 0xb800, 0xc0e4, 0xb802, 0x0848, 0xa88c, 0x9065, -+ 0x09b8, 0x6007, 0x0024, 0x2001, 0x1986, 0x2004, 0x601a, 0x0804, -+ 0x7b0f, 0xa88c, 0x9065, 0x0960, 0x00e6, 0xa890, 0x9075, 0x2001, -+ 0x1834, 0x2004, 0x9005, 0x0150, 0x080c, 0xae92, 0x8eff, 0x0118, -+ 0x2e60, 0x080c, 0xae92, 0x00ee, 0x0804, 0x7b0f, 0x6024, 0xc0dc, -+ 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, 0xa8a0, 0x9005, 0x0130, -+ 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, 0x6016, 0x6003, 0x0001, -+ 0x080c, 0x90f0, 0x080c, 0x968d, 0x00ee, 0x0804, 0x7b0f, 0x2061, -+ 0x1a71, 0x6000, 0xd084, 0x0190, 0xd08c, 0x1904, 0x7c88, 0x0126, -+ 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, 0x6206, 0x012e, 0x0804, -+ 0x7c88, 0x012e, 0xa883, 0x0016, 0x0804, 0x7c81, 0xa883, 0x0007, -+ 0x0804, 0x7c81, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0130, 0x8001, -+ 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, 0x080c, 0x780a, 0x0040, -+ 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7bb1, -+ 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x903e, 0x2061, -+ 0x1800, 0x61d0, 0x81ff, 0x1904, 0x7c33, 0x6130, 0xd194, 0x1904, -+ 0x7c5d, 0xa878, 0x2070, 0x9e82, 0x1cd0, 0x0a04, 0x7c27, 0x6068, -+ 0x9e02, 0x1a04, 0x7c27, 0x7120, 0x9186, 0x0006, 0x1904, 0x7c19, -+ 0x7010, 0x905d, 0x0904, 0x7c33, 0xb800, 0xd0e4, 0x1904, 0x7c57, -+ 0x2061, 0x1a71, 0x6100, 0x9184, 0x0301, 0x9086, 0x0001, 0x15a0, -+ 0x7024, 0xd0dc, 0x1904, 0x7c60, 0xa883, 0x0000, 0xa803, 0x0000, -+ 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, 0xa87c, 0xd0f4, 0x1904, -+ 0x7c63, 0x080c, 0x56cf, 0xd09c, 0x1118, 0xa87c, 0xc0cc, 0xa87e, -+ 0x2e60, 0x080c, 0x85fd, 0x012e, 0x00ee, 0x00be, 0x0005, 0x2048, -+ 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, 0xa87c, 0xd0f4, 0x1904, -+ 0x7c63, 0x012e, 0x00ee, 0x00be, 0x0005, 0x012e, 0x00ee, 0xa883, -+ 0x0006, 0x00be, 0x0804, 0x7c81, 0xd184, 0x0db8, 0xd1c4, 0x1190, -+ 0x00a0, 0xa974, 0x080c, 0x65ff, 0x15d0, 0xb800, 0xd0e4, 0x15b8, -+ 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, 0x0002, 0x0490, 0xa883, -+ 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, 0xa883, 0x0017, 0x0448, -+ 0xa883, 0x0035, 0x0430, 0x080c, 0x56d3, 0xd0fc, 0x01e8, 0xa878, -+ 0x2070, 0x9e82, 0x1cd0, 0x02c0, 0x6068, 0x9e02, 0x12a8, 0x7120, -+ 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, 0x0170, 0xb800, 0xd0bc, -+ 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, 0x0007, 0x1904, 0x7bbd, -+ 0x7003, 0x0002, 0x0804, 0x7bbd, 0xa883, 0x0028, 0x0010, 0xa883, -+ 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, 0xa883, 0x002a, 0x0cc8, -+ 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, 0x0002, 0x601b, 0x0014, -+ 0x080c, 0xe134, 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, 0x6c81, 0x012e, 0x0005, -+ 0x080c, 0x1031, 0x0005, 0x00d6, 0x080c, 0x85f4, 0x00de, 0x0005, -+ 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x0040, 0x702c, -+ 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, 0x7d72, 0xd09c, 0x11a8, -+ 0x2071, 0x1800, 0x70c0, 0x90ea, 0x0020, 0x0278, 0x8001, 0x70c2, -+ 0x702c, 0x2048, 0xa800, 0x702e, 0x9006, 0xa802, 0xa806, 0x2071, -+ 0x0040, 0x2900, 0x7022, 0x702c, 0x0c28, 0x012e, 0x00ee, 0x00de, -+ 0x0005, 0x0006, 0x9084, 0x0780, 0x190c, 0x7d72, 0x000e, 0x0005, -+ 0xa898, 0x9084, 0x0003, 0x05a8, 0x080c, 0xae0b, 0x05d8, 0x2900, -+ 0x6016, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x1138, 0x6008, -+ 0xc0fd, 0x600a, 0x2001, 0x196b, 0x2004, 0x0098, 0xa8a0, 0x9084, -+ 0x00ff, 0xa99c, 0x918c, 0xff00, 0x9105, 0xa99c, 0x918c, 0x00ff, -+ 0x080c, 0x283e, 0x1540, 0x00b6, 0x080c, 0x65ff, 0x2b00, 0x00be, -+ 0x1510, 0x6012, 0x6023, 0x0001, 0x2009, 0x0040, 0xa864, 0x9084, -+ 0x00ff, 0x9086, 0x0035, 0x0110, 0x2009, 0x0041, 0x080c, 0xaedc, -+ 0x0005, 0xa87b, 0x0101, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c81, -+ 0x012e, 0x0005, 0xa87b, 0x002c, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x6c81, 0x012e, 0x0005, 0xa87b, 0x0028, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x6c81, 0x012e, 0x080c, 0xae61, 0x0005, 0x00d6, 0x00c6, -+ 0x0036, 0x0026, 0x0016, 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, -+ 0x0004, 0x1a04, 0x7d63, 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, -+ 0xb804, 0xd284, 0x0140, 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, -+ 0x0006, 0x1108, 0x04b0, 0x2b10, 0x080c, 0xae0b, 0x1118, 0x080c, -+ 0xaeaf, 0x05a8, 0x6212, 0xa874, 0x0002, 0x7d41, 0x7d46, 0x7d49, -+ 0x7d4f, 0x2019, 0x0002, 0x080c, 0xe522, 0x0060, 0x080c, 0xe4be, -+ 0x0048, 0x2019, 0x0002, 0xa980, 0x080c, 0xe4d9, 0x0018, 0xa980, -+ 0x080c, 0xe4be, 0x080c, 0xae61, 0xa887, 0x0000, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x6c81, 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, 0x7d74, 0x0006, 0x0016, -+ 0x2001, 0x8003, 0x0006, 0x0804, 0x0dde, 0x2001, 0x1834, 0x2004, -+ 0x9005, 0x0005, 0x0005, 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, -+ 0x200c, 0xc1e5, 0xc1dc, 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, -+ 0x1120, 0x080c, 0x157d, 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, -+ 0x0020, 0x781f, 0x0300, 0x00fe, 0x0005, 0x781c, 0xd08c, 0x0904, -+ 0x7df4, 0x68c0, 0x90aa, 0x0005, 0x0a04, 0x840b, 0x7d44, 0x7c40, -+ 0x9584, 0x00f6, 0x1510, 0x9484, 0x7000, 0x0140, 0x908a, 0x2000, -+ 0x1260, 0x9584, 0x0700, 0x8007, 0x0804, 0x7dfb, 0x7000, 0x9084, -+ 0xff00, 0x9086, 0x8100, 0x0da8, 0x00b0, 0x9484, 0x0fff, 0x1130, -+ 0x7000, 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xe9c1, -+ 0x080c, 0x8300, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, -+ 0x080c, 0x835e, 0x19c0, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, -+ 0x7e56, 0x080c, 0x2337, 0x005e, 0x004e, 0x0020, 0x080c, 0xe9c1, -+ 0x7817, 0x0140, 0x080c, 0x73bc, 0x0168, 0x2001, 0x0111, 0x2004, -+ 0xd08c, 0x0140, 0x6893, 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, -+ 0x2003, 0x0000, 0x080c, 0x7e37, 0x2001, 0x19f0, 0x2004, 0x9005, -+ 0x090c, 0x968d, 0x0005, 0x0002, 0x7e0d, 0x8122, 0x7e04, 0x7e04, -+ 0x7e04, 0x7e04, 0x7e04, 0x7e04, 0x7817, 0x0140, 0x2001, 0x19f0, -+ 0x2004, 0x9005, 0x090c, 0x968d, 0x0005, 0x7000, 0x908c, 0xff00, -+ 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x6892, 0x9286, 0x2000, -+ 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x5730, 0x0070, -+ 0x080c, 0x7e76, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, 0x805d, -+ 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x8230, 0x7817, 0x0140, -+ 0x2001, 0x19f0, 0x2004, 0x9005, 0x090c, 0x968d, 0x0005, 0x2001, -+ 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, 0x1800, 0x2004, 0x9086, -+ 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, 0x8048, 0x2518, 0x080c, -+ 0x4b04, 0x003e, 0x002e, 0x0005, 0x0036, 0x0046, 0x0056, 0x00f6, -+ 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, 0x0050, 0x0036, 0x0046, -+ 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, 0x7c40, 0x2019, 0xffff, -+ 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, 0x2001, 0x1800, 0x2004, -+ 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, 0x8048, 0x080c, 0x4b04, -+ 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, 0x0005, 0x00b6, 0x00c6, -+ 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, 0x0001, 0x0120, 0x9096, -+ 0x0023, 0x1904, 0x802e, 0x9186, 0x0023, 0x15c0, 0x080c, 0x82c5, -+ 0x0904, 0x802e, 0x6120, 0x9186, 0x0001, 0x0150, 0x9186, 0x0004, -+ 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, 0x000a, 0x1904, 0x802e, -+ 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1130, 0x2009, 0x0015, -+ 0x080c, 0xaedc, 0x0804, 0x802e, 0x908e, 0x0214, 0x0118, 0x908e, -+ 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, 0xaedc, 0x0804, 0x802e, -+ 0x908e, 0x0100, 0x1904, 0x802e, 0x7034, 0x9005, 0x1904, 0x802e, -+ 0x2009, 0x0016, 0x080c, 0xaedc, 0x0804, 0x802e, 0x9186, 0x0022, -+ 0x1904, 0x802e, 0x7030, 0x908e, 0x0300, 0x1580, 0x68dc, 0xd0a4, -+ 0x0528, 0xc0b5, 0x68de, 0x7100, 0x918c, 0x00ff, 0x697e, 0x7004, -+ 0x6882, 0x00f6, 0x2079, 0x0100, 0x79e6, 0x78ea, 0x0006, 0x9084, -+ 0x00ff, 0x0016, 0x2008, 0x080c, 0x2887, 0x7932, 0x7936, 0x001e, -+ 0x000e, 0x00fe, 0x080c, 0x283e, 0x695e, 0x703c, 0x00e6, 0x2071, -+ 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6, 0x00ee, 0x7034, 0x9005, -+ 0x1904, 0x802e, 0x2009, 0x0017, 0x0804, 0x7fde, 0x908e, 0x0400, -+ 0x1190, 0x7034, 0x9005, 0x1904, 0x802e, 0x080c, 0x73bc, 0x0120, -+ 0x2009, 0x001d, 0x0804, 0x7fde, 0x68dc, 0xc0a5, 0x68de, 0x2009, -+ 0x0030, 0x0804, 0x7fde, 0x908e, 0x0500, 0x1140, 0x7034, 0x9005, -+ 0x1904, 0x802e, 0x2009, 0x0018, 0x0804, 0x7fde, 0x908e, 0x2010, -+ 0x1120, 0x2009, 0x0019, 0x0804, 0x7fde, 0x908e, 0x2110, 0x1120, -+ 0x2009, 0x001a, 0x0804, 0x7fde, 0x908e, 0x5200, 0x1140, 0x7034, -+ 0x9005, 0x1904, 0x802e, 0x2009, 0x001b, 0x0804, 0x7fde, 0x908e, -+ 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, 0x802e, 0x2009, 0x001c, -+ 0x0804, 0x7fde, 0x908e, 0x1300, 0x1120, 0x2009, 0x0034, 0x0804, -+ 0x7fde, 0x908e, 0x1200, 0x1140, 0x7034, 0x9005, 0x1904, 0x802e, -+ 0x2009, 0x0024, 0x0804, 0x7fde, 0x908c, 0xff00, 0x918e, 0x2400, -+ 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, 0x2004, 0xd09c, 0x0904, -+ 0x7fde, 0x080c, 0xd905, 0x1904, 0x802e, 0x0804, 0x7fdc, 0x908c, -+ 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, 0x002a, 0x0804, 0x7fde, -+ 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, 0x0804, 0x7fde, 0x908e, -+ 0x6104, 0x1530, 0x2029, 0x0205, 0x2011, 0x026d, 0x8208, 0x2204, -+ 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, 0x2011, 0x8015, 0x211c, -+ 0x8108, 0x0046, 0x2124, 0x080c, 0x4b04, 0x004e, 0x8108, 0x0f04, -+ 0x7f92, 0x9186, 0x0280, 0x1d88, 0x2504, 0x8000, 0x202a, 0x2009, -+ 0x0260, 0x0c58, 0x202b, 0x0000, 0x2009, 0x0023, 0x0804, 0x7fde, -+ 0x908e, 0x6000, 0x1120, 0x2009, 0x003f, 0x0804, 0x7fde, 0x908e, -+ 0x5400, 0x1138, 0x080c, 0x83bb, 0x1904, 0x802e, 0x2009, 0x0046, -+ 0x04a8, 0x908e, 0x5500, 0x1148, 0x080c, 0x83e3, 0x1118, 0x2009, -+ 0x0041, 0x0460, 0x2009, 0x0042, 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, 0x6838, 0xd0d4, 0x0110, 0x2009, 0x004c, 0x0016, 0x2011, -+ 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x283e, 0x1904, 0x8031, -+ 0x080c, 0x659e, 0x1904, 0x8031, 0xbe12, 0xbd16, 0x001e, 0x0016, -+ 0x080c, 0x73bc, 0x01c0, 0x68dc, 0xd08c, 0x1148, 0x7000, 0x9084, -+ 0x00ff, 0x1188, 0x7004, 0x9084, 0xff00, 0x1168, 0x0040, 0x687c, -+ 0x9606, 0x1148, 0x6880, 0x9506, 0x9084, 0xff00, 0x1120, 0x9584, -+ 0x00ff, 0xb8c2, 0x0080, 0xb8c0, 0x9005, 0x1168, 0x9186, 0x0046, -+ 0x1150, 0x687c, 0x9606, 0x1138, 0x6880, 0x9506, 0x9084, 0xff00, -+ 0x1110, 0x001e, 0x0098, 0x080c, 0xae0b, 0x01a8, 0x2b08, 0x6112, -+ 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x9186, 0x004c, 0x1110, -+ 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, 0xaedc, 0x00ce, 0x00be, -+ 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, 0x2004, 0xd0ec, 0x0120, -+ 0x2011, 0x8049, 0x080c, 0x4b04, 0x080c, 0xaeaf, 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, 0x9138, 0x08a0, 0x080c, 0x32e3, 0x1140, -+ 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, 0x0008, 0x1108, 0x0009, -+ 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, 0x908c, 0xff00, 0x810f, -+ 0x9186, 0x0033, 0x11e8, 0x080c, 0x82c5, 0x0904, 0x80ba, 0x7124, -+ 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, 0x7034, 0x9005, 0x15d0, -+ 0x2009, 0x0015, 0x080c, 0xaedc, 0x04a8, 0x908e, 0x0100, 0x1590, -+ 0x7034, 0x9005, 0x1578, 0x2009, 0x0016, 0x080c, 0xaedc, 0x0450, -+ 0x9186, 0x0032, 0x1538, 0x7030, 0x908e, 0x1400, 0x1518, 0x2009, -+ 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, -+ 0x283e, 0x11b8, 0x080c, 0x659e, 0x11a0, 0xbe12, 0xbd16, 0x080c, -+ 0xae0b, 0x0178, 0x2b08, 0x6112, 0x080c, 0xcfaa, 0x6023, 0x0004, -+ 0x7120, 0x610a, 0x001e, 0x080c, 0xaedc, 0x080c, 0x968d, 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, -+ 0x811c, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, 0x811c, -+ 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, 0x0000, -+ 0x2019, 0x1837, 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, 0x80f1, 0x82ff, 0x1118, 0x9085, -+ 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, 0x004e, -+ 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, 0x000f, -+ 0x0002, 0x8139, 0x8139, 0x8139, 0x82d7, 0x8139, 0x8142, 0x816d, -+ 0x81fb, 0x8139, 0x8139, 0x8139, 0x8139, 0x8139, 0x8139, 0x8139, -+ 0x8139, 0x7817, 0x0140, 0x2001, 0x19f0, 0x2004, 0x9005, 0x090c, -+ 0x968d, 0x0005, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7120, 0x2160, -+ 0x9c8c, 0x0007, 0x11c0, 0x9c8a, 0x1cd0, 0x02a8, 0x6868, 0x9c02, -+ 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, -+ 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, 0x2009, -+ 0x0046, 0x080c, 0xaedc, 0x7817, 0x0140, 0x2001, 0x19f0, 0x2004, -+ 0x9005, 0x090c, 0x968d, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, -+ 0x0fff, 0x0904, 0x81d1, 0x7110, 0xd1bc, 0x1904, 0x81d1, 0x7108, -+ 0x700c, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15b0, -+ 0x81ff, 0x15a0, 0x9080, 0x3325, 0x200d, 0x918c, 0xff00, 0x810f, -+ 0x2001, 0x0080, 0x9106, 0x0904, 0x81d1, 0x080c, 0x659e, 0x1904, -+ 0x81d1, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15d8, 0xba04, 0x9294, -+ 0xff00, 0x9286, 0x0600, 0x11a0, 0x080c, 0xae0b, 0x05e8, 0x2b08, -+ 0x7028, 0x604a, 0x702c, 0x6046, 0x6112, 0x6023, 0x0006, 0x7120, -+ 0x610a, 0x7130, 0x6156, 0x2009, 0x0044, 0x080c, 0xdb63, 0x0408, -+ 0x080c, 0x6972, 0x1138, 0xb807, 0x0606, 0x0c30, 0x190c, 0x80be, -+ 0x11c0, 0x0898, 0x080c, 0xae0b, 0x2b08, 0x0198, 0x6112, 0x6023, -+ 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, -+ 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9138, 0x080c, -+ 0x968d, 0x7817, 0x0140, 0x2001, 0x19f0, 0x2004, 0x9005, 0x090c, -+ 0x968d, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, -+ 0x0120, 0x2011, 0x8049, 0x080c, 0x4b04, 0x080c, 0xaeaf, 0x0d48, -+ 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x6156, -+ 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x08b0, 0x00b6, 0x7110, 0xd1bc, 0x01e8, 0x7020, -+ 0x2060, 0x9c84, 0x0007, 0x11c0, 0x9c82, 0x1cd0, 0x02a8, 0x6868, -+ 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, -+ 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, 0x7124, 0x610a, -+ 0x2009, 0x0045, 0x080c, 0xaedc, 0x7817, 0x0140, 0x2001, 0x19f0, -+ 0x2004, 0x9005, 0x090c, 0x968d, 0x00be, 0x0005, 0x6120, 0x9186, -+ 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, -+ 0x080c, 0x32e3, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, -+ 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, -+ 0x0005, 0x8247, 0x8248, 0x8247, 0x8247, 0x82a7, 0x82b6, 0x0005, -+ 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x82a5, -+ 0x700c, 0x7108, 0x080c, 0x283e, 0x1904, 0x82a5, 0x080c, 0x659e, -+ 0x1904, 0x82a5, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, -+ 0x6972, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x82c5, -+ 0x00ce, 0x05d8, 0x080c, 0xae0b, 0x2b08, 0x05b8, 0x6112, 0x080c, -+ 0xcfaa, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, -+ 0xaedc, 0x0458, 0x080c, 0x6972, 0x0148, 0x9086, 0x0004, 0x0130, -+ 0x080c, 0x697a, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0xae0b, -+ 0x2b08, 0x01d8, 0x6112, 0x080c, 0xcfaa, 0x6023, 0x0005, 0x7120, -+ 0x610a, 0x2009, 0x0088, 0x080c, 0xaedc, 0x0078, 0x080c, 0xae0b, -+ 0x2b08, 0x0158, 0x6112, 0x080c, 0xcfaa, 0x6023, 0x0004, 0x7120, -+ 0x610a, 0x2009, 0x0001, 0x080c, 0xaedc, 0x00be, 0x0005, 0x7110, -+ 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x8226, 0x1130, 0x7124, -+ 0x610a, 0x2009, 0x0089, 0x080c, 0xaedc, 0x0005, 0x7110, 0xd1bc, -+ 0x0158, 0x0059, 0x0148, 0x080c, 0x8226, 0x1130, 0x7124, 0x610a, -+ 0x2009, 0x008a, 0x080c, 0xaedc, 0x0005, 0x7020, 0x2060, 0x9c84, -+ 0x0007, 0x1158, 0x9c82, 0x1cd0, 0x0240, 0x2001, 0x181a, 0x2004, -+ 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, -+ 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0007, 0x11b0, -+ 0x9c82, 0x1cd0, 0x0298, 0x6868, 0x9c02, 0x1280, 0x7008, 0x9084, -+ 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, -+ 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0xaedc, 0x7817, 0x0140, -+ 0x2001, 0x19f0, 0x2004, 0x9005, 0x090c, 0x968d, 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, 0xae0b, 0x05b8, 0x0066, 0x00c6, 0x0046, 0x2011, -+ 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x283e, 0x15a0, 0x080c, -+ 0x659e, 0x1588, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, 0x6012, -+ 0x080c, 0xcfaa, 0x080c, 0x0fff, 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, -+ 0x9138, 0x080c, 0x968d, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, -+ 0xae61, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, -+ 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, -+ 0x83b5, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, -+ 0x1904, 0x83b7, 0x7030, 0x908e, 0x0400, 0x0904, 0x83b7, 0x908e, -+ 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, -+ 0x2009, 0x1837, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, -+ 0x6930, 0x0558, 0x68b0, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, -+ 0x9106, 0x1518, 0x6880, 0x69b0, 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, 0x82c5, 0x0128, -+ 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, -+ 0x0001, 0x00ce, 0x0005, 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, -+ 0x2020, 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, -+ 0x2019, 0x1805, 0x2011, 0x027a, 0x080c, 0xbe09, 0x1178, 0xd48c, -+ 0x0148, 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, 0x027e, 0x080c, -+ 0xbe09, 0x1120, 0xd494, 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, -+ 0x004e, 0x015e, 0x0005, 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, -+ 0x2020, 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, -+ 0x2019, 0x1805, 0x2011, 0x0272, 0x080c, 0xbe09, 0x1178, 0xd48c, -+ 0x0148, 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, 0x0276, 0x080c, -+ 0xbe09, 0x1120, 0xd494, 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, -+ 0x004e, 0x015e, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, -+ 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834, -+ 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, 0x7802, -+ 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, 0x7036, -+ 0x00ee, 0x0005, 0x2071, 0x19fa, 0x7003, 0x0003, 0x700f, 0x0361, -+ 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1cd0, 0x7007, 0x0000, -+ 0x7026, 0x702b, 0xa289, 0x7032, 0x7037, 0xa2f7, 0x703f, 0xffff, -+ 0x7042, 0x7047, 0x556e, 0x704a, 0x705b, 0x8594, 0x080c, 0x1018, -+ 0x090c, 0x0dd5, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, -+ 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19fa, 0x1d04, 0x84e2, 0x2091, -+ 0x6000, 0x700c, 0x8001, 0x700e, 0x1530, 0x2001, 0x013c, 0x2004, -+ 0x9005, 0x190c, 0x85d9, 0x2001, 0x1869, 0x2004, 0xd0c4, 0x0158, -+ 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, -+ 0x0000, 0x080c, 0x0dd5, 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, 0xa418, 0x0010, 0x7034, 0x080f, 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, 0x850a, 0x850b, 0x8527, 0x00e6, -+ 0x2071, 0x19fa, 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, -+ 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x19fa, 0x701c, -+ 0x9206, 0x1120, 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, -+ 0x0005, 0x00e6, 0x2071, 0x19fa, 0xb888, 0x9102, 0x0208, 0xb98a, -+ 0x00ee, 0x0005, 0x0005, 0x00b6, 0x7110, 0x080c, 0x65ff, 0x1168, -+ 0xb888, 0x8001, 0x0250, 0xb88a, 0x1140, 0x0126, 0x2091, 0x8000, -+ 0x0016, 0x080c, 0x968d, 0x001e, 0x012e, 0x8108, 0x9182, 0x0800, -+ 0x0218, 0x900e, 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, 0x7014, -+ 0x2060, 0x0126, 0x2091, 0x8000, 0x6040, 0x9005, 0x0128, 0x8001, -+ 0x6042, 0x1110, 0x080c, 0xce3b, 0x6018, 0x9005, 0x0558, 0x8001, -+ 0x601a, 0x1540, 0x6120, 0x9186, 0x0003, 0x0148, 0x9186, 0x0006, -+ 0x0130, 0x9186, 0x0009, 0x11e0, 0x611c, 0xd1c4, 0x1100, 0x080c, -+ 0xcb35, 0x01b0, 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, -+ 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, -+ 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0xd0e4, 0x0110, -+ 0x080c, 0xc833, 0x012e, 0x9c88, 0x0018, 0x7116, 0x2001, 0x181a, -+ 0x2004, 0x9102, 0x0220, 0x7017, 0x1cd0, 0x7007, 0x0000, 0x0005, -+ 0x00e6, 0x2071, 0x19fa, 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, -+ 0x0005, 0x2001, 0x1a03, 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, -+ 0x19fa, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, 0x2011, 0x1a06, -+ 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19fa, 0x711a, 0x721e, -+ 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, -+ 0x7056, 0x2001, 0x1a08, 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, -+ 0x7068, 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, -+ 0x080c, 0x10e9, 0x002e, 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, -+ 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, -+ 0x8453, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, -+ 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x19fa, 0x7172, -+ 0x7276, 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, -+ 0x19fa, 0x7074, 0x9206, 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, -+ 0x0005, 0x0016, 0x00c6, 0x2009, 0xfffc, 0x210d, 0x2061, 0x0100, -+ 0x60f0, 0x9100, 0x60f3, 0x0000, 0x2009, 0xfffc, 0x200f, 0x1220, -+ 0x8108, 0x2105, 0x8000, 0x200f, 0x00ce, 0x001e, 0x0005, 0x00c6, -+ 0x2061, 0x1a71, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, 0x8003, -+ 0x8003, 0x9080, 0x1a71, 0x2060, 0x0005, 0xa884, 0x908a, 0x199a, -+ 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a71, 0x6014, 0x00ce, -+ 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff, 0x01b0, -+ 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, 0x00c0, -+ 0x918e, 0x00c0, 0x0904, 0x8687, 0xd0b4, 0x1168, 0xd0bc, 0x1904, -+ 0x8660, 0x2009, 0x0006, 0x080c, 0x86b4, 0x0005, 0x900e, 0x0c60, -+ 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x0160, 0x908c, 0x0003, 0x0120, -+ 0x918e, 0x0003, 0x1904, 0x86ae, 0x908c, 0x2020, 0x918e, 0x2020, -+ 0x01a8, 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, 0xd084, -+ 0x1138, 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xaedc, 0x0005, -+ 0x87ff, 0x1de8, 0x2009, 0x0042, 0x0804, 0xaedc, 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, -+ 0x86ae, 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, -+ 0x2c78, 0x080c, 0x1725, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, -+ 0x0042, 0x080c, 0xaedc, 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, -+ 0xaedc, 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, -+ 0x080c, 0xaedc, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, -+ 0xd1ac, 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, -+ 0x0019, 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xcb35, 0x0518, -+ 0x6014, 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, -+ 0xa97c, 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, -+ 0x1a71, 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, -+ 0x00ce, 0x080c, 0x6abc, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, -+ 0x190c, 0x85fd, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, -+ 0x1a71, 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, -+ 0x00ce, 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, -+ 0x0120, 0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x2071, 0x1923, -+ 0x7003, 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, 0x0001, -+ 0x080c, 0x1018, 0x090c, 0x0dd5, 0xa867, 0x0006, 0xa86b, 0x0001, -+ 0xa8ab, 0xdcb0, 0xa89f, 0x0000, 0x2900, 0x702e, 0x7033, 0x0000, -+ 0x0005, 0x0096, 0x00e6, 0x2071, 0x1923, 0x702c, 0x2048, 0x6a2c, -+ 0x721e, 0x6b30, 0x7322, 0x6834, 0x7026, 0xa896, 0x6838, 0x702a, -+ 0xa89a, 0x6824, 0x7016, 0x683c, 0x701a, 0x2009, 0x0028, 0x200a, -+ 0x9005, 0x0148, 0x900e, 0x9188, 0x000c, 0x8001, 0x1de0, 0x2100, -+ 0x9210, 0x1208, 0x8318, 0xaa8e, 0xab92, 0x7010, 0xd084, 0x0178, -+ 0xc084, 0x7007, 0x0001, 0x700f, 0x0000, 0x0006, 0x2009, 0x181d, -+ 0x2104, 0x9082, 0x0007, 0x2009, 0x1ac8, 0x200a, 0x000e, 0xc095, -+ 0x7012, 0x2008, 0x2001, 0x003b, 0x080c, 0x15ee, 0x9006, 0x2071, -+ 0x193c, 0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x0005, 0x00e6, -+ 0x0126, 0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154, 0x2001, -+ 0x0008, 0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, 0x9080, -+ 0x0008, 0x1f04, 0x8767, 0x71c0, 0x9102, 0x02e0, 0x2071, 0x1877, -+ 0x20a9, 0x0007, 0x00c6, 0x080c, 0xae0b, 0x6023, 0x0009, 0x6003, -+ 0x0004, 0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x88ed, 0x012e, 0x1f04, 0x8773, 0x9006, 0x00ce, 0x015e, 0x012e, -+ 0x00ee, 0x0005, 0x9085, 0x0001, 0x0cc8, 0x00e6, 0x00b6, 0x0096, -+ 0x0086, 0x0056, 0x0046, 0x0026, 0x7118, 0x720c, 0x7620, 0x7004, -+ 0xd084, 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020, 0x2021, -+ 0x002c, 0x2029, 0x000a, 0x080c, 0x0fff, 0x090c, 0x0dd5, 0x2900, -+ 0x6016, 0x2058, 0xac66, 0x9006, 0xa802, 0xa806, 0xa86a, 0xa87a, -+ 0xa8aa, 0xa887, 0x0005, 0xa87f, 0x0020, 0x7008, 0xa89a, 0x7010, -+ 0xa89e, 0xae8a, 0xa8af, 0xffff, 0xa8b3, 0x0000, 0x8109, 0x0160, -+ 0x080c, 0x0fff, 0x090c, 0x0dd5, 0xad66, 0x2b00, 0xa802, 0x2900, -+ 0xb806, 0x2058, 0x8109, 0x1da0, 0x002e, 0x004e, 0x005e, 0x008e, -+ 0x009e, 0x00be, 0x00ee, 0x0005, 0x2079, 0x0000, 0x2071, 0x1923, -+ 0x7004, 0x004b, 0x700c, 0x0002, 0x87df, 0x87d8, 0x87d8, 0x0005, -+ 0x87e9, 0x884a, 0x884a, 0x884a, 0x884b, 0x885c, 0x885c, 0x700c, -+ 0x0cba, 0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, 0x0128, -+ 0x78a0, 0x79a0, 0x9106, 0x1904, 0x883d, 0x2001, 0x0005, 0x2004, -+ 0xd0bc, 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, -+ 0x012e, 0x7018, 0x910a, 0x1130, 0x7030, 0x9005, 0x05a8, 0x080c, -+ 0x888b, 0x0490, 0x1210, 0x7114, 0x910a, 0x9192, 0x000a, 0x0210, -+ 0x2009, 0x000a, 0x2001, 0x1888, 0x2014, 0x2001, 0x1935, 0x2004, -+ 0x9100, 0x9202, 0x0e48, 0x080c, 0x89d7, 0x2200, 0x9102, 0x0208, -+ 0x2208, 0x0096, 0x702c, 0x2048, 0xa873, 0x0001, 0xa976, 0x080c, -+ 0x8ae0, 0x2100, 0xa87e, 0xa86f, 0x0000, 0x009e, 0x0126, 0x2091, -+ 0x8000, 0x2009, 0x1a18, 0x2104, 0xc085, 0x200a, 0x700f, 0x0002, -+ 0x012e, 0x080c, 0x1108, 0x1de8, 0x0005, 0x2001, 0x0005, 0x2004, -+ 0xd0bc, 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, -+ 0x012e, 0x0005, 0x0005, 0x700c, 0x0002, 0x8850, 0x8853, 0x8852, -+ 0x080c, 0x87e7, 0x0005, 0x8001, 0x700e, 0x0096, 0x702c, 0x2048, -+ 0xa974, 0x009e, 0x0011, 0x0ca0, 0x0005, 0x0096, 0x702c, 0x2048, -+ 0x7018, 0x9100, 0x7214, 0x921a, 0x1130, 0x701c, 0xa88e, 0x7020, -+ 0xa892, 0x9006, 0x0068, 0x0006, 0x080c, 0x8ae0, 0x2100, 0xaa8c, -+ 0x9210, 0xaa8e, 0x1220, 0xa890, 0x9081, 0x0000, 0xa892, 0x000e, -+ 0x009e, 0x2f08, 0x9188, 0x0028, 0x200a, 0x701a, 0x0005, 0x00e6, -+ 0x2071, 0x1923, 0x700c, 0x0002, 0x8889, 0x8889, 0x8887, 0x700f, -+ 0x0001, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030, 0x9005, -+ 0x0508, 0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, 0x0000, -+ 0x080c, 0x88f6, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193c, 0x080c, -+ 0x893d, 0x00ee, 0x0178, 0x0096, 0x080c, 0x1018, 0x2900, 0x009e, -+ 0x0148, 0xa8aa, 0x04b9, 0x0041, 0x2001, 0x1946, 0x2003, 0x0000, -+ 0x012e, 0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, 0x00a6, -+ 0x2940, 0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084, 0x000f, -+ 0x2068, 0x9d88, 0x2090, 0x2165, 0x0056, 0x2029, 0x0000, 0x080c, -+ 0x8a65, 0x080c, 0x2048, 0x1dd8, 0x005e, 0x00ae, 0x2001, 0x187f, -+ 0x2004, 0xa88a, 0x080c, 0x1725, 0x781f, 0x0101, 0x7813, 0x0000, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x894c, 0x012e, 0x008e, 0x00ce, -+ 0x00de, 0x0005, 0x7030, 0x9005, 0x0138, 0x2078, 0x780c, 0x7032, -+ 0x2001, 0x1946, 0x2003, 0x0001, 0x0005, 0x00e6, 0x2071, 0x1923, -+ 0x7030, 0x600e, 0x2c00, 0x7032, 0x00ee, 0x0005, 0x00d6, 0x00c6, -+ 0x0026, 0x9b80, 0x8bbf, 0x2005, 0x906d, 0x090c, 0x0dd5, 0x9b80, -+ 0x8bb7, 0x2005, 0x9065, 0x090c, 0x0dd5, 0x6114, 0x2600, 0x9102, -+ 0x0248, 0x6828, 0x9102, 0x02f0, 0x9085, 0x0001, 0x002e, 0x00ce, -+ 0x00de, 0x0005, 0x6804, 0xd094, 0x0148, 0x6854, 0xd084, 0x1178, -+ 0xc085, 0x6856, 0x2011, 0x8026, 0x080c, 0x4b04, 0x684c, 0x0096, -+ 0x904d, 0x090c, 0x0dd5, 0xa804, 0x8000, 0xa806, 0x009e, 0x9006, -+ 0x2030, 0x0c20, 0x6854, 0xd08c, 0x1d08, 0xc08d, 0x6856, 0x2011, -+ 0x8025, 0x080c, 0x4b04, 0x684c, 0x0096, 0x904d, 0x090c, 0x0dd5, -+ 0xa800, 0x8000, 0xa802, 0x009e, 0x0888, 0x7000, 0x2019, 0x0008, -+ 0x8319, 0x7104, 0x9102, 0x1118, 0x2300, 0x9005, 0x0020, 0x0210, -+ 0x9302, 0x0008, 0x8002, 0x0005, 0x00d6, 0x7814, 0x9005, 0x090c, -+ 0x0dd5, 0x781c, 0x9084, 0x0101, 0x9086, 0x0101, 0x190c, 0x0dd5, -+ 0x2069, 0x193c, 0x6804, 0x9080, 0x193e, 0x2f08, 0x2102, 0x6904, -+ 0x8108, 0x9182, 0x0008, 0x0208, 0x900e, 0x6906, 0x9180, 0x193e, -+ 0x2003, 0x0000, 0x00de, 0x0005, 0x0096, 0x00c6, 0x2060, 0x6014, -+ 0x2048, 0xa8a8, 0x0096, 0x2048, 0x9005, 0x190c, 0x1031, 0x009e, -+ 0xa8ab, 0x0000, 0x080c, 0x0fb1, 0x080c, 0xae61, 0x00ce, 0x009e, -+ 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x601c, 0xd0c4, 0x0110, -+ 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x6000, 0x9086, 0x0000, -+ 0x0178, 0x6010, 0x9005, 0x0150, 0x00b6, 0x2058, 0x080c, 0x8cf2, -+ 0x00be, 0x6013, 0x0000, 0x601b, 0x0000, 0x0010, 0x2c00, 0x0861, -+ 0x0005, 0x2009, 0x1927, 0x210c, 0xd194, 0x0005, 0x00e6, 0x2071, -+ 0x1923, 0x7110, 0xc194, 0xd19c, 0x1118, 0xc185, 0x7007, 0x0000, -+ 0x7112, 0x2001, 0x003b, 0x080c, 0x15ee, 0x00ee, 0x0005, 0x0096, -+ 0x00d6, 0x9006, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, -+ 0x702a, 0x7026, 0x702f, 0x0000, 0x080c, 0x8b3f, 0x0170, 0x080c, -+ 0x8b74, 0x0158, 0x2900, 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, -+ 0x701f, 0x000a, 0x00de, 0x009e, 0x0005, 0x900e, 0x0cd8, 0x00e6, -+ 0x0096, 0x0086, 0x00d6, 0x00c6, 0x2071, 0x1930, 0x721c, 0x2100, -+ 0x9202, 0x1618, 0x080c, 0x8b74, 0x090c, 0x0dd5, 0x7018, 0x9005, -+ 0x1160, 0x2900, 0x7002, 0x700a, 0x701a, 0x9006, 0x7006, 0x700e, -+ 0xa806, 0xa802, 0x7012, 0x701e, 0x0038, 0x2040, 0xa806, 0x2900, -+ 0xa002, 0x701a, 0xa803, 0x0000, 0x7010, 0x8000, 0x7012, 0x701c, -+ 0x9080, 0x000a, 0x701e, 0x721c, 0x08d0, 0x721c, 0x00ce, 0x00de, -+ 0x008e, 0x009e, 0x00ee, 0x0005, 0x0096, 0x0156, 0x0136, 0x0146, -+ 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, 0x1930, 0x7300, 0x831f, -+ 0x831e, 0x831e, 0x9384, 0x003f, 0x20e8, 0x939c, 0xffc0, 0x9398, -+ 0x0003, 0x7104, 0x080c, 0x8ae0, 0x810c, 0x2100, 0x9318, 0x8003, -+ 0x2228, 0x2021, 0x0078, 0x9402, 0x9532, 0x0208, 0x2028, 0x2500, -+ 0x8004, 0x20a8, 0x23a0, 0xa001, 0xa001, 0x4005, 0x2508, 0x080c, -+ 0x8ae9, 0x2130, 0x7014, 0x9600, 0x7016, 0x2600, 0x711c, 0x9102, -+ 0x701e, 0x7004, 0x9600, 0x2008, 0x9082, 0x000a, 0x1190, 0x7000, -+ 0x2048, 0xa800, 0x9005, 0x1148, 0x2009, 0x0001, 0x0026, 0x080c, -+ 0x89d7, 0x002e, 0x7000, 0x2048, 0xa800, 0x7002, 0x7007, 0x0000, -+ 0x0008, 0x7106, 0x2500, 0x9212, 0x1904, 0x8a16, 0x012e, 0x00ee, -+ 0x014e, 0x013e, 0x015e, 0x009e, 0x0005, 0x0016, 0x0026, 0x00e6, -+ 0x0126, 0x2091, 0x8000, 0x9580, 0x8bb7, 0x2005, 0x9075, 0x090c, -+ 0x0dd5, 0x080c, 0x8abb, 0x012e, 0x9580, 0x8bb3, 0x2005, 0x9075, -+ 0x090c, 0x0dd5, 0x0156, 0x0136, 0x01c6, 0x0146, 0x01d6, 0x831f, -+ 0x831e, 0x831e, 0x9384, 0x003f, 0x20e0, 0x9384, 0xffc0, 0x9100, -+ 0x2098, 0xa860, 0x20e8, 0xa95c, 0x2c05, 0x9100, 0x20a0, 0x20a9, -+ 0x0002, 0x4003, 0x2e0c, 0x2d00, 0x0002, 0x8aa5, 0x8aa5, 0x8aa7, -+ 0x8aa5, 0x8aa7, 0x8aa5, 0x8aa5, 0x8aa5, 0x8aa5, 0x8aa5, 0x8aad, -+ 0x8aa5, 0x8aad, 0x8aa5, 0x8aa5, 0x8aa5, 0x080c, 0x0dd5, 0x4104, -+ 0x20a9, 0x0002, 0x4002, 0x4003, 0x0028, 0x20a9, 0x0002, 0x4003, -+ 0x4104, 0x4003, 0x01de, 0x014e, 0x01ce, 0x013e, 0x015e, 0x00ee, -+ 0x002e, 0x001e, 0x0005, 0x0096, 0x7014, 0x8001, 0x7016, 0x710c, -+ 0x2110, 0x00f1, 0x810c, 0x9188, 0x0003, 0x7308, 0x8210, 0x9282, -+ 0x000a, 0x1198, 0x7008, 0x2048, 0xa800, 0x9005, 0x0158, 0x0006, -+ 0x080c, 0x8b83, 0x009e, 0xa807, 0x0000, 0x2900, 0x700a, 0x7010, -+ 0x8001, 0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x009e, 0x0005, -+ 0x0006, 0x810b, 0x810b, 0x2100, 0x810b, 0x9100, 0x2008, 0x000e, -+ 0x0005, 0x0006, 0x0026, 0x2100, 0x9005, 0x0158, 0x9092, 0x000c, -+ 0x0240, 0x900e, 0x8108, 0x9082, 0x000c, 0x1de0, 0x002e, 0x000e, -+ 0x0005, 0x900e, 0x0cd8, 0x2d00, 0x90b8, 0x0008, 0x690c, 0x6810, -+ 0x2019, 0x0001, 0x2031, 0x8b29, 0x9112, 0x0220, 0x0118, 0x8318, -+ 0x2208, 0x0cd0, 0x6808, 0x9005, 0x0108, 0x8318, 0x233a, 0x6804, -+ 0xd084, 0x2300, 0x2021, 0x0001, 0x1150, 0x9082, 0x0003, 0x0967, -+ 0x0a67, 0x8420, 0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0, 0x9082, -+ 0x0002, 0x0967, 0x0a67, 0x8420, 0x9082, 0x0005, 0x0967, 0x0a67, -+ 0x0cd0, 0x6c1a, 0x2d00, 0x90b8, 0x0007, 0x00e6, 0x2071, 0x1800, -+ 0x7128, 0x6810, 0x2019, 0x0001, 0x910a, 0x0118, 0x0210, 0x8318, -+ 0x0cd8, 0x2031, 0x8b3c, 0x0870, 0x6c16, 0x00ee, 0x0005, 0x0096, -+ 0x0046, 0x0126, 0x2091, 0x8000, 0x2b00, 0x9080, 0x8bbb, 0x2005, -+ 0x9005, 0x090c, 0x0dd5, 0x2004, 0x90a0, 0x000a, 0x080c, 0x1018, -+ 0x01d0, 0x2900, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, 0x080c, -+ 0x1018, 0x0188, 0x7024, 0xa802, 0xa807, 0x0000, 0x2900, 0x7026, -+ 0x94a2, 0x000a, 0x0110, 0x0208, 0x0c90, 0x9085, 0x0001, 0x012e, -+ 0x004e, 0x009e, 0x0005, 0x7024, 0x9005, 0x0dc8, 0x2048, 0xac00, -+ 0x080c, 0x1031, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x7024, -+ 0x2048, 0x9005, 0x0130, 0xa800, 0x7026, 0xa803, 0x0000, 0xa807, -+ 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024, 0xa802, -+ 0x2900, 0x7026, 0x012e, 0x0005, 0x0096, 0x9e80, 0x0009, 0x2004, -+ 0x9005, 0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x1031, 0x000e, -+ 0x0cb8, 0x009e, 0x0005, 0x0096, 0x7008, 0x9005, 0x0138, 0x2048, -+ 0xa800, 0x0006, 0x080c, 0x1031, 0x000e, 0x0cb8, 0x9006, 0x7002, -+ 0x700a, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x702a, 0x7026, -+ 0x702e, 0x009e, 0x0005, 0x1a64, 0x0000, 0x0000, 0x0000, 0x1930, -+ 0x0000, 0x0000, 0x0000, 0x1888, 0x0000, 0x0000, 0x0000, 0x1877, -+ 0x0000, 0x0000, 0x0000, 0x00e6, 0x00c6, 0x00b6, 0x00a6, 0xa8a8, -+ 0x2040, 0x2071, 0x1877, 0x080c, 0x8cdd, 0xa067, 0x0023, 0x6010, -+ 0x905d, 0x0904, 0x8cb2, 0xb814, 0xa06e, 0xb910, 0xa172, 0xb9a0, -+ 0xa176, 0x2001, 0x0003, 0xa07e, 0xa834, 0xa082, 0xa07b, 0x0000, -+ 0xa898, 0x9005, 0x0118, 0xa078, 0xc085, 0xa07a, 0x2858, 0x2031, -+ 0x0018, 0xa068, 0x908a, 0x0019, 0x1a0c, 0x0dd5, 0x2020, 0x2050, -+ 0x2940, 0xa864, 0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0, 0x2090, -+ 0x2c65, 0x9786, 0x0024, 0x2c05, 0x1590, 0x908a, 0x0036, 0x1a0c, -+ 0x0dd5, 0x9082, 0x001b, 0x0002, 0x8c1f, 0x8c1f, 0x8c21, 0x8c1f, -+ 0x8c1f, 0x8c1f, 0x8c23, 0x8c1f, 0x8c1f, 0x8c1f, 0x8c25, 0x8c1f, -+ 0x8c1f, 0x8c1f, 0x8c27, 0x8c1f, 0x8c1f, 0x8c1f, 0x8c29, 0x8c1f, -+ 0x8c1f, 0x8c1f, 0x8c2b, 0x8c1f, 0x8c1f, 0x8c1f, 0x8c2d, 0x080c, -+ 0x0dd5, 0xa180, 0x04b8, 0xa190, 0x04a8, 0xa1a0, 0x0498, 0xa1b0, -+ 0x0488, 0xa1c0, 0x0478, 0xa1d0, 0x0468, 0xa1e0, 0x0458, 0x908a, -+ 0x0034, 0x1a0c, 0x0dd5, 0x9082, 0x001b, 0x0002, 0x8c51, 0x8c4f, -+ 0x8c4f, 0x8c4f, 0x8c4f, 0x8c4f, 0x8c53, 0x8c4f, 0x8c4f, 0x8c4f, -+ 0x8c4f, 0x8c4f, 0x8c55, 0x8c4f, 0x8c4f, 0x8c4f, 0x8c4f, 0x8c4f, -+ 0x8c57, 0x8c4f, 0x8c4f, 0x8c4f, 0x8c4f, 0x8c4f, 0x8c59, 0x080c, -+ 0x0dd5, 0xa180, 0x0038, 0xa198, 0x0028, 0xa1b0, 0x0018, 0xa1c8, -+ 0x0008, 0xa1e0, 0x2600, 0x0002, 0x8c75, 0x8c77, 0x8c79, 0x8c7b, -+ 0x8c7d, 0x8c7f, 0x8c81, 0x8c83, 0x8c85, 0x8c87, 0x8c89, 0x8c8b, -+ 0x8c8d, 0x8c8f, 0x8c91, 0x8c93, 0x8c95, 0x8c97, 0x8c99, 0x8c9b, -+ 0x8c9d, 0x8c9f, 0x8ca1, 0x8ca3, 0x8ca5, 0x080c, 0x0dd5, 0xb9e2, -+ 0x0468, 0xb9de, 0x0458, 0xb9da, 0x0448, 0xb9d6, 0x0438, 0xb9d2, -+ 0x0428, 0xb9ce, 0x0418, 0xb9ca, 0x0408, 0xb9c6, 0x00f8, 0xb9c2, -+ 0x00e8, 0xb9be, 0x00d8, 0xb9ba, 0x00c8, 0xb9b6, 0x00b8, 0xb9b2, -+ 0x00a8, 0xb9ae, 0x0098, 0xb9aa, 0x0088, 0xb9a6, 0x0078, 0xb9a2, -+ 0x0068, 0xb99e, 0x0058, 0xb99a, 0x0048, 0xb996, 0x0038, 0xb992, -+ 0x0028, 0xb98e, 0x0018, 0xb98a, 0x0008, 0xb986, 0x8631, 0x8421, -+ 0x0120, 0x080c, 0x2048, 0x0804, 0x8bf9, 0x00ae, 0x00be, 0x00ce, -+ 0x00ee, 0x0005, 0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077, 0x00ff, -+ 0x9006, 0x0804, 0x8bdb, 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, -+ 0xb810, 0x9005, 0x01b0, 0x2001, 0x1924, 0x2004, 0x9005, 0x0188, -+ 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, -+ 0xbba0, 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4b04, 0x004e, -+ 0x003e, 0x00be, 0x001e, 0x000e, 0x0005, 0x9016, 0x710c, 0xa834, -+ 0x910a, 0xa936, 0x7008, 0x9005, 0x0120, 0x8210, 0x910a, 0x0238, -+ 0x0130, 0x7010, 0x8210, 0x910a, 0x0210, 0x0108, 0x0cd8, 0xaa8a, -+ 0xa26a, 0x0005, 0x00f6, 0x00d6, 0x0036, 0x2079, 0x0300, 0x781b, -+ 0x0200, 0x7818, 0xd094, 0x1dd8, 0x781b, 0x0202, 0xa001, 0xa001, -+ 0x7818, 0xd094, 0x1da0, 0xb8ac, 0x9005, 0x01b8, 0x2068, 0x2079, -+ 0x0000, 0x2c08, 0x911e, 0x1118, 0x680c, 0xb8ae, 0x0060, 0x9106, -+ 0x0140, 0x2d00, 0x2078, 0x680c, 0x9005, 0x090c, 0x0dd5, 0x2068, -+ 0x0cb0, 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300, 0x781b, -+ 0x0200, 0x003e, 0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6, 0x0096, -+ 0x00c6, 0x0036, 0x0126, 0x2091, 0x8000, 0x0156, 0x20a9, 0x01ff, -+ 0x2071, 0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110, 0x1f04, -+ 0x8d32, 0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094, 0x1d90, -+ 0xb8ac, 0x9005, 0x01d0, 0x2060, 0x600c, 0xb8ae, 0x6003, 0x0004, -+ 0x601b, 0x0000, 0x6013, 0x0000, 0x601f, 0x0101, 0x6014, 0x2048, -+ 0xa88b, 0x0000, 0xa8a8, 0xa8ab, 0x0000, 0x904d, 0x090c, 0x0dd5, -+ 0x080c, 0x1031, 0x080c, 0x88ed, 0x0c18, 0x2071, 0x0300, 0x701b, -+ 0x0200, 0x015e, 0x012e, 0x003e, 0x00ce, 0x009e, 0x00de, 0x00ee, -+ 0x0005, 0x00c6, 0x00b6, 0x0016, 0x0006, 0x0156, 0x080c, 0x283e, -+ 0x015e, 0x11b0, 0x080c, 0x659e, 0x190c, 0x0dd5, 0x000e, 0x001e, -+ 0xb912, 0xb816, 0x080c, 0xae0b, 0x0140, 0x2b00, 0x6012, 0x6023, -+ 0x0001, 0x2009, 0x0001, 0x080c, 0xaedc, 0x00be, 0x00ce, 0x0005, -+ 0x000e, 0x001e, 0x0cd0, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, -+ 0x0dd5, 0x0013, 0x006e, 0x0005, 0x8da4, 0x8da4, 0x8da4, 0x8da6, -+ 0x8df7, 0x8da4, 0x8da4, 0x8da4, 0x8e5a, 0x8da4, 0x8e97, 0x8da4, -+ 0x8da4, 0x8da4, 0x8da4, 0x8da4, 0x080c, 0x0dd5, 0x9182, 0x0040, -+ 0x0002, 0x8db9, 0x8db9, 0x8db9, 0x8db9, 0x8db9, 0x8db9, 0x8db9, -+ 0x8db9, 0x8db9, 0x8dbb, 0x8dd0, 0x8db9, 0x8db9, 0x8db9, 0x8db9, -+ 0x8de3, 0x080c, 0x0dd5, 0x0096, 0x080c, 0x963d, 0x080c, 0x97b9, -+ 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, 0x00b6, 0x2058, 0xb8bb, -+ 0x0500, 0x00be, 0x080c, 0x6a87, 0x080c, 0xae61, 0x009e, 0x0005, -+ 0x080c, 0x963d, 0x00d6, 0x6114, 0x080c, 0xcb35, 0x0130, 0x0096, -+ 0x6114, 0x2148, 0x080c, 0x6c81, 0x009e, 0x00de, 0x080c, 0xae61, -+ 0x080c, 0x97b9, 0x0005, 0x080c, 0x963d, 0x080c, 0x31bf, 0x6114, -+ 0x0096, 0x2148, 0x080c, 0xcb35, 0x0120, 0xa87b, 0x0029, 0x080c, -+ 0x6c81, 0x009e, 0x080c, 0xae61, 0x080c, 0x97b9, 0x0005, 0x601b, -+ 0x0000, 0x9182, 0x0040, 0x0096, 0x0002, 0x8e12, 0x8e12, 0x8e12, -+ 0x8e12, 0x8e12, 0x8e12, 0x8e12, 0x8e12, 0x8e14, 0x8e12, 0x8e12, -+ 0x8e12, 0x8e56, 0x8e12, 0x8e12, 0x8e12, 0x8e12, 0x8e12, 0x8e12, -+ 0x8e1a, 0x8e12, 0x080c, 0x0dd5, 0x6114, 0x2148, 0xa938, 0x918e, -+ 0xffff, 0x05e0, 0x00e6, 0x6114, 0x2148, 0x080c, 0x8bc3, 0x0096, -+ 0xa8a8, 0x2048, 0x080c, 0x6a1f, 0x009e, 0xa8ab, 0x0000, 0x6010, -+ 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, 0x8cf2, 0x00be, 0xae88, -+ 0x00b6, 0x2059, 0x0000, 0x080c, 0x88f6, 0x00be, 0x01e0, 0x2071, -+ 0x193c, 0x080c, 0x893d, 0x01b8, 0x9086, 0x0001, 0x1128, 0x2001, -+ 0x1946, 0x2004, 0x9005, 0x1178, 0x0096, 0x080c, 0x0fff, 0x2900, -+ 0x009e, 0x0148, 0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x88b4, 0x00fe, -+ 0x00ee, 0x009e, 0x0005, 0x080c, 0x88ed, 0x0cd0, 0x080c, 0x8f04, -+ 0x009e, 0x0005, 0x9182, 0x0040, 0x0096, 0x0002, 0x8e6e, 0x8e6e, -+ 0x8e6e, 0x8e70, 0x8e6e, 0x8e6e, 0x8e6e, 0x8e95, 0x8e6e, 0x8e6e, -+ 0x8e6e, 0x8e6e, 0x8e6e, 0x8e6e, 0x8e6e, 0x8e6e, 0x080c, 0x0dd5, -+ 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa8ac, 0xa846, 0xa8b0, -+ 0xa84a, 0xa837, 0x0000, 0xa83b, 0x0000, 0xa884, 0x9092, 0x199a, -+ 0x0210, 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, -+ 0x2c10, 0x080c, 0x1bad, 0x080c, 0x9155, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x97b9, 0x012e, 0x009e, 0x0005, 0x080c, 0x0dd5, 0x080c, -+ 0x963d, 0x080c, 0x97b9, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, -+ 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6c81, 0x080c, -+ 0xae61, 0x009e, 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, -+ 0x0096, 0x0013, 0x009e, 0x0005, 0x8ec4, 0x8ec4, 0x8ec4, 0x8ec6, -+ 0x8ed7, 0x8ec4, 0x8ec4, 0x8ec4, 0x8ec4, 0x8ec4, 0x8ec4, 0x8ec4, -+ 0x8ec4, 0x8ec4, 0x8ec4, 0x8ec4, 0x080c, 0x0dd5, 0x080c, 0xa7cc, -+ 0x6114, 0x2148, 0xa87b, 0x0006, 0x6010, 0x00b6, 0x2058, 0xb8bb, -+ 0x0500, 0x00be, 0x080c, 0x6c81, 0x080c, 0xae61, 0x0005, 0x0461, -+ 0x0005, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0096, 0x0013, -+ 0x009e, 0x0005, 0x8ef2, 0x8ef2, 0x8ef2, 0x8ef4, 0x8f04, 0x8ef2, -+ 0x8ef2, 0x8ef2, 0x8ef2, 0x8ef2, 0x8ef2, 0x8ef2, 0x8ef2, 0x8ef2, -+ 0x8ef2, 0x8ef2, 0x080c, 0x0dd5, 0x0036, 0x00e6, 0x2071, 0x19e7, -+ 0x703c, 0x9c06, 0x1120, 0x2019, 0x0000, 0x080c, 0xa5b6, 0x080c, -+ 0xa7cc, 0x00ee, 0x003e, 0x0005, 0x00f6, 0x00e6, 0x601b, 0x0000, -+ 0x6014, 0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, 0x080c, -+ 0x8cf2, 0x00be, 0x2071, 0x193c, 0x080c, 0x893d, 0x0160, 0x2001, -+ 0x187f, 0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, 0x88b4, -+ 0x00ee, 0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, 0x2048, -+ 0x080c, 0x1031, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x88ed, 0x0c80, -+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -+ 0x0000, 0x187a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -+ 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, 0x8f49, 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, 0x8f73, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, -+ 0x8f73, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, -+ 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, -+ 0x0126, 0x2091, 0x2800, 0x2079, 0x19e7, 0x012e, 0x00d6, 0x2069, -+ 0x19e7, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, -+ 0x2069, 0x0200, 0x080c, 0xab21, 0x0401, 0x080c, 0xab0c, 0x00e9, -+ 0x080c, 0xab0f, 0x00d1, 0x080c, 0xab12, 0x00b9, 0x080c, 0xab15, -+ 0x00a1, 0x080c, 0xab18, 0x0089, 0x080c, 0xab1b, 0x0071, 0x080c, -+ 0xab1e, 0x0059, 0x01de, 0x014e, 0x015e, 0x2069, 0x0004, 0x2d04, -+ 0x9085, 0x8001, 0x206a, 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1, -+ 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, 0x00c6, 0x6027, 0x0001, -+ 0x7804, 0x9084, 0x0007, 0x0002, 0x8fe6, 0x900a, 0x9049, 0x8fec, -+ 0x900a, 0x8fe6, 0x8fe4, 0x8fe4, 0x080c, 0x0dd5, 0x080c, 0x8579, -+ 0x080c, 0x968d, 0x00ce, 0x0005, 0x62c0, 0x82ff, 0x1110, 0x00ce, -+ 0x0005, 0x2011, 0x5e83, 0x080c, 0x84f3, 0x7828, 0x9092, 0x00c8, -+ 0x1228, 0x8000, 0x782a, 0x080c, 0x5ec3, 0x0c88, 0x62c0, 0x080c, -+ 0xac5d, 0x080c, 0x5e83, 0x7807, 0x0003, 0x7827, 0x0000, 0x782b, -+ 0x0000, 0x0c28, 0x080c, 0x8579, 0x6220, 0xd2a4, 0x0160, 0x782b, -+ 0x0000, 0x7824, 0x9065, 0x090c, 0x0dd5, 0x2009, 0x0013, 0x080c, -+ 0xaedc, 0x00ce, 0x0005, 0x00c6, 0x7824, 0x9065, 0x090c, 0x0dd5, -+ 0x7828, 0x9092, 0xc350, 0x12c0, 0x8000, 0x782a, 0x00ce, 0x080c, -+ 0x2ba5, 0x0278, 0x00c6, 0x7924, 0x2160, 0x6010, 0x906d, 0x090c, -+ 0x0dd5, 0x7807, 0x0000, 0x7827, 0x0000, 0x00ce, 0x080c, 0x968d, -+ 0x0c00, 0x080c, 0xa24f, 0x08e8, 0x2011, 0x0130, 0x2214, 0x080c, -+ 0xac5d, 0x080c, 0xe9fe, 0x2009, 0x0014, 0x080c, 0xaedc, 0x00ce, -+ 0x0880, 0x2001, 0x1a03, 0x2003, 0x0000, 0x62c0, 0x82ff, 0x1160, -+ 0x782b, 0x0000, 0x7824, 0x9065, 0x090c, 0x0dd5, 0x2009, 0x0013, -+ 0x080c, 0xaf2e, 0x00ce, 0x0005, 0x00b6, 0x00c6, 0x00d6, 0x7824, -+ 0x9005, 0x090c, 0x0dd5, 0x7828, 0x9092, 0xc350, 0x1648, 0x8000, -+ 0x782a, 0x00de, 0x00ce, 0x00be, 0x080c, 0x2ba5, 0x02f0, 0x00b6, -+ 0x00c6, 0x00d6, 0x781c, 0x905d, 0x090c, 0x0dd5, 0xb800, 0xc0dc, -+ 0xb802, 0x7924, 0x2160, 0x080c, 0xae61, 0xb93c, 0x81ff, 0x090c, -+ 0x0dd5, 0x8109, 0xb93e, 0x7807, 0x0000, 0x7827, 0x0000, 0x00de, -+ 0x00ce, 0x00be, 0x080c, 0x968d, 0x0868, 0x080c, 0xa24f, 0x0850, -+ 0x2011, 0x0130, 0x2214, 0x080c, 0xac5d, 0x080c, 0xe9fe, 0x7824, -+ 0x9065, 0x2009, 0x0014, 0x080c, 0xaedc, 0x00de, 0x00ce, 0x00be, -+ 0x0804, 0x905a, 0x00c6, 0x2001, 0x009b, 0x2004, 0xd0fc, 0x190c, -+ 0x1eb4, 0x6024, 0x6027, 0x0002, 0xd0f4, 0x15b8, 0x62c8, 0x60c4, -+ 0x9205, 0x1170, 0x783c, 0x9065, 0x0130, 0x2009, 0x0049, 0x080c, -+ 0xaedc, 0x00ce, 0x0005, 0x2011, 0x1a06, 0x2013, 0x0000, 0x0cc8, -+ 0x793c, 0x81ff, 0x0dc0, 0x7944, 0x9192, 0x7530, 0x1628, 0x8108, -+ 0x7946, 0x793c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0006, 0x1138, -+ 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, 0x0c10, 0x793c, -+ 0x9188, 0x0008, 0x210c, 0x918e, 0x0009, 0x0d90, 0x6014, 0x9084, -+ 0x1984, 0x9085, 0x0016, 0x6016, 0x08a0, 0x793c, 0x2160, 0x2009, -+ 0x004a, 0x080c, 0xaedc, 0x0868, 0x7848, 0xc085, 0x784a, 0x0848, -+ 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, -+ 0x2c08, 0x2061, 0x19e7, 0x6020, 0x8000, 0x6022, 0x6010, 0x9005, -+ 0x0148, 0x9080, 0x0003, 0x2102, 0x6112, 0x012e, 0x00ce, 0x001e, -+ 0x000e, 0x0005, 0x6116, 0x6112, 0x0cc0, 0x00d6, 0x2069, 0x19e7, -+ 0xb800, 0xd0d4, 0x0168, 0x6820, 0x8000, 0x6822, 0x9086, 0x0001, -+ 0x1110, 0x2b00, 0x681e, 0x00de, 0x0804, 0x968d, 0x00de, 0x0005, -+ 0xc0d5, 0xb802, 0x6818, 0x9005, 0x0168, 0xb856, 0xb85b, 0x0000, -+ 0x0086, 0x0006, 0x2b00, 0x681a, 0x008e, 0xa05a, 0x008e, 0x2069, -+ 0x19e7, 0x0c08, 0xb856, 0xb85a, 0x2b00, 0x681a, 0x681e, 0x08d8, -+ 0x0006, 0x0016, 0x00c6, 0x0126, 0x2091, 0x8000, 0x600f, 0x0000, -+ 0x2c08, 0x2061, 0x19e7, 0x6020, 0x8000, 0x6022, 0x6008, 0x9005, -+ 0x0148, 0x9080, 0x0003, 0x2102, 0x610a, 0x012e, 0x00ce, 0x001e, -+ 0x000e, 0x0005, 0x610e, 0x610a, 0x0cc0, 0x00c6, 0x600f, 0x0000, -+ 0x2c08, 0x2061, 0x19e7, 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, -+ 0x19e7, 0x7638, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, -+ 0x91df, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x91da, 0x87ff, -+ 0x0120, 0x6054, 0x9106, 0x1904, 0x91da, 0x703c, 0x9c06, 0x1178, -+ 0x0036, 0x2019, 0x0001, 0x080c, 0xa5b6, 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, 0xcb35, 0x01c8, 0x6014, 0x2048, 0x6020, 0x9086, -+ 0x0003, 0x1590, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, -+ 0x0036, 0x0076, 0x080c, 0xce24, 0x080c, 0xe908, 0x080c, 0x6c81, -+ 0x007e, 0x003e, 0x001e, 0x080c, 0xcd1e, 0x080c, 0xae92, 0x00ce, -+ 0x0804, 0x917e, 0x2c78, 0x600c, 0x2060, 0x0804, 0x917e, 0x85ff, -+ 0x0120, 0x0036, 0x080c, 0x97b9, 0x003e, 0x012e, 0x000e, 0x001e, -+ 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, -+ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, -+ 0x0016, 0x0036, 0x0076, 0x080c, 0xe908, 0x080c, 0xe551, 0x007e, -+ 0x003e, 0x001e, 0x0890, 0x6020, 0x9086, 0x0009, 0x1168, 0xa87b, -+ 0x0006, 0x0016, 0x0036, 0x0076, 0x080c, 0x6c81, 0x080c, 0xae61, -+ 0x007e, 0x003e, 0x001e, 0x0818, 0x6020, 0x9086, 0x000a, 0x0904, -+ 0x91c4, 0x0804, 0x91c2, 0x0006, 0x0066, 0x0096, 0x00c6, 0x00d6, -+ 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, 0x2079, 0x19e7, 0x7838, -+ 0x9065, 0x0904, 0x926b, 0x600c, 0x0006, 0x600f, 0x0000, 0x783c, -+ 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa5b6, 0x7833, -+ 0x0000, 0x901e, 0x7b3e, 0x7b42, 0x7b46, 0x7b4a, 0x003e, 0x080c, -+ 0xcb35, 0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1568, -+ 0x3e08, 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6040, 0x9005, 0x1180, -+ 0x2001, 0x1988, 0x2004, 0x6042, 0x0058, 0xa867, 0x0103, 0xab7a, -+ 0xa877, 0x0000, 0x080c, 0x6c75, 0x080c, 0xcd1e, 0x080c, 0xae92, -+ 0x000e, 0x0804, 0x9228, 0x7e3a, 0x7e36, 0x012e, 0x00fe, 0x00de, -+ 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, 0x9086, 0x0006, -+ 0x1118, 0x080c, 0xe551, 0x0c50, 0x6020, 0x9086, 0x0009, 0x1130, -+ 0xab7a, 0x080c, 0x6c81, 0x080c, 0xae61, 0x0c10, 0x6020, 0x9086, -+ 0x000a, 0x09a8, 0x0890, 0x0016, 0x0026, 0x0086, 0x9046, 0x0099, -+ 0x080c, 0x9374, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, -+ 0x2079, 0x19e7, 0x2091, 0x8000, 0x080c, 0x940b, 0x080c, 0x9499, -+ 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, 0x00e6, 0x00d6, -+ 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, -+ 0x19e7, 0x7614, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9339, 0x6010, -+ 0x2058, 0xb8a0, 0x9206, 0x1904, 0x9334, 0x88ff, 0x0120, 0x6054, -+ 0x9106, 0x1904, 0x9334, 0x7024, 0x9c06, 0x1558, 0x2069, 0x0100, -+ 0x6820, 0xd0a4, 0x1508, 0x080c, 0x8579, 0x080c, 0xa273, 0x68c3, -+ 0x0000, 0x080c, 0xa7bc, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, -+ 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, -+ 0x9006, 0x080c, 0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, -+ 0x6827, 0x0001, 0x003e, 0x0028, 0x6003, 0x0009, 0x630a, 0x0804, -+ 0x9334, 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, 0xcb35, 0x01e8, -+ 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xcd3b, 0x1118, 0x080c, -+ 0xb813, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, -+ 0x0036, 0x0086, 0x080c, 0xce24, 0x080c, 0xe908, 0x080c, 0x6c81, -+ 0x008e, 0x003e, 0x001e, 0x080c, 0xcd1e, 0x080c, 0xae92, 0x080c, -+ 0xa692, 0x00ce, 0x0804, 0x92b4, 0x2c78, 0x600c, 0x2060, 0x0804, -+ 0x92b4, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, -+ 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, -+ 0x0016, 0x0036, 0x0086, 0x080c, 0xe908, 0x080c, 0xe551, 0x008e, -+ 0x003e, 0x001e, 0x08d0, 0x080c, 0xb813, 0x6020, 0x9086, 0x0002, -+ 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x931a, -+ 0x9086, 0x008b, 0x0904, 0x931a, 0x0840, 0x6020, 0x9086, 0x0005, -+ 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, -+ 0x008b, 0x09b0, 0x0804, 0x932d, 0x00b6, 0x00a6, 0x0096, 0x00c6, -+ 0x0006, 0x0126, 0x2091, 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, -+ 0x0904, 0x9404, 0x00f6, 0x00e6, 0x00d6, 0x0066, 0x2071, 0x19e7, -+ 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, -+ 0x6531, 0x0904, 0x9400, 0x7624, 0x86ff, 0x0904, 0x93ef, 0x9680, -+ 0x0005, 0x2004, 0x9906, 0x15d8, 0x00d6, 0x2069, 0x0100, 0x68c0, -+ 0x9005, 0x0560, 0x080c, 0x8579, 0x080c, 0xa273, 0x68c3, 0x0000, -+ 0x080c, 0xa7bc, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, -+ 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, -+ 0x080c, 0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, -+ 0x0001, 0x003e, 0x00de, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, -+ 0xb83e, 0x2660, 0x080c, 0xae92, 0x00ce, 0x0048, 0x00de, 0x00c6, -+ 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, 0x93a7, 0x89ff, -+ 0x0158, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xce24, -+ 0x080c, 0xe908, 0x080c, 0x6c81, 0x080c, 0xa692, 0x0804, 0x93a7, -+ 0x006e, 0x00de, 0x00ee, 0x00fe, 0x012e, 0x000e, 0x00ce, 0x009e, -+ 0x00ae, 0x00be, 0x0005, 0x0096, 0x0006, 0x0066, 0x00c6, 0x00d6, -+ 0x9036, 0x7814, 0x9065, 0x0904, 0x946c, 0x600c, 0x0006, 0x600f, -+ 0x0000, 0x7824, 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, -+ 0x1508, 0x080c, 0x8579, 0x080c, 0xa273, 0x68c3, 0x0000, 0x080c, -+ 0xa7bc, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, -+ 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, 0x080c, -+ 0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, -+ 0x003e, 0x0040, 0x080c, 0x690a, 0x1520, 0x6003, 0x0009, 0x630a, -+ 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xcb33, 0x01b0, 0x6020, -+ 0x9086, 0x0003, 0x1508, 0x080c, 0xcd3b, 0x1118, 0x080c, 0xb813, -+ 0x0060, 0x080c, 0x690a, 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, -+ 0x0000, 0x080c, 0x6c81, 0x080c, 0xcd1e, 0x080c, 0xae92, 0x080c, -+ 0xa692, 0x000e, 0x0804, 0x9412, 0x7e16, 0x7e12, 0x00de, 0x00ce, -+ 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, -+ 0x080c, 0xe551, 0x0c50, 0x080c, 0xb813, 0x6020, 0x9086, 0x0002, -+ 0x1150, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, -+ 0x008b, 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, -+ 0x0006, 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, -+ 0x0860, 0x0006, 0x0066, 0x0096, 0x00b6, 0x00c6, 0x00d6, 0x7818, -+ 0x905d, 0x0904, 0x9519, 0xb854, 0x0006, 0x9006, 0xb856, 0xb85a, -+ 0xb800, 0xc0d4, 0xc0dc, 0xb802, 0x080c, 0x6531, 0x0904, 0x9516, -+ 0x7e24, 0x86ff, 0x0904, 0x9509, 0x9680, 0x0005, 0x2004, 0x9906, -+ 0x1904, 0x9509, 0x00d6, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, -+ 0x9500, 0x080c, 0x8579, 0x080c, 0xa273, 0x68c3, 0x0000, 0x080c, -+ 0xa7bc, 0x7827, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, -+ 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, 0x080c, -+ 0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, -+ 0x003e, 0x00de, 0x00c6, 0x3e08, 0x918e, 0x0002, 0x1168, 0xb800, -+ 0xd0bc, 0x0150, 0x9680, 0x0010, 0x200c, 0x81ff, 0x1518, 0x2009, -+ 0x1988, 0x210c, 0x2102, 0x00f0, 0xb83c, 0x9005, 0x0110, 0x8001, -+ 0xb83e, 0x2660, 0x600f, 0x0000, 0x080c, 0xae92, 0x00ce, 0x0048, -+ 0x00de, 0x00c6, 0x2660, 0x6003, 0x0009, 0x630a, 0x00ce, 0x0804, -+ 0x94ac, 0x89ff, 0x0138, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, -+ 0x080c, 0x6c81, 0x080c, 0xa692, 0x0804, 0x94ac, 0x000e, 0x0804, -+ 0x94a0, 0x781e, 0x781a, 0x00de, 0x00ce, 0x00be, 0x009e, 0x006e, -+ 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0xb800, 0xd0dc, -+ 0x01a0, 0xb84c, 0x904d, 0x0188, 0xa878, 0x9606, 0x1170, 0x2071, -+ 0x19e7, 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, -+ 0xa273, 0x78c3, 0x0000, 0x080c, 0xa7bc, 0x7027, 0x0000, 0x0036, -+ 0x2079, 0x0140, 0x7b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, -+ 0x080c, 0x2cef, 0x9006, 0x080c, 0x2cef, 0x2079, 0x0100, 0x7824, -+ 0xd084, 0x0110, 0x7827, 0x0001, 0x080c, 0xa7bc, 0x003e, 0x080c, -+ 0x6531, 0x00c6, 0xb83c, 0x9005, 0x0110, 0x8001, 0xb83e, 0x2660, -+ 0x080c, 0xae61, 0x00ce, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, -+ 0x080c, 0xce24, 0x080c, 0x6c81, 0x080c, 0xa692, 0x00fe, 0x0005, -+ 0x00b6, 0x00e6, 0x00c6, 0x2011, 0x0101, 0x2204, 0xc0c4, 0x2012, -+ 0x2001, 0x180c, 0x2014, 0xc2e4, 0x2202, 0x2071, 0x19e7, 0x7004, -+ 0x9084, 0x0007, 0x0002, 0x95a5, 0x95a9, 0x95c0, 0x95e9, 0x9627, -+ 0x95a5, 0x95c0, 0x95a3, 0x080c, 0x0dd5, 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, 0x6531, 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, 0x968d, 0x0ca8, 0x7218, -+ 0x721e, 0x080c, 0x968d, 0x0c80, 0xc2ec, 0x2202, 0x080c, 0x97b9, -+ 0x0c58, 0x7024, 0x9065, 0x05b8, 0x700c, 0x9c06, 0x1160, 0x080c, -+ 0xa692, 0x600c, 0x9015, 0x0120, 0x720e, 0x600f, 0x0000, 0x0448, -+ 0x720e, 0x720a, 0x0430, 0x7014, 0x9c06, 0x1160, 0x080c, 0xa692, -+ 0x600c, 0x9015, 0x0120, 0x7216, 0x600f, 0x0000, 0x00d0, 0x7216, -+ 0x7212, 0x00b8, 0x6020, 0x9086, 0x0003, 0x1198, 0x6010, 0x2058, -+ 0x080c, 0x6531, 0xb800, 0xc0dc, 0xb802, 0x080c, 0xa692, 0x701c, -+ 0x9065, 0x0138, 0xb854, 0x9015, 0x0110, 0x721e, 0x0010, 0x7218, -+ 0x721e, 0x7027, 0x0000, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x7024, -+ 0x9065, 0x0140, 0x080c, 0xa692, 0x600c, 0x9015, 0x0158, 0x720e, -+ 0x600f, 0x0000, 0x080c, 0xa7bc, 0x7027, 0x0000, 0x00ce, 0x00ee, -+ 0x00be, 0x0005, 0x720e, 0x720a, 0x0ca8, 0x00d6, 0x2069, 0x19e7, -+ 0x6830, 0x9084, 0x0003, 0x0002, 0x964a, 0x964c, 0x9670, 0x9648, -+ 0x080c, 0x0dd5, 0x00de, 0x0005, 0x00c6, 0x6840, 0x9086, 0x0001, -+ 0x01b8, 0x683c, 0x9065, 0x0130, 0x600c, 0x9015, 0x0170, 0x6a3a, -+ 0x600f, 0x0000, 0x6833, 0x0000, 0x683f, 0x0000, 0x2011, 0x1a06, -+ 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, 0x2001, -+ 0x180c, 0x200c, 0xc1e5, 0x2102, 0x0005, 0x2001, 0x180c, 0x200c, -+ 0xd1ec, 0x0120, 0xc1ec, 0x2102, 0x080c, 0x97b9, 0x2001, 0x19f3, -+ 0x2004, 0x9086, 0x0001, 0x0d58, 0x00d6, 0x2069, 0x19e7, 0x6804, -+ 0x9084, 0x0007, 0x0006, 0x9005, 0x11c8, 0x2001, 0x1837, 0x2004, -+ 0x9084, 0x0028, 0x1198, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, -+ 0x0168, 0x2001, 0x188b, 0x2004, 0xd08c, 0x1118, 0xd084, 0x1118, -+ 0x0028, 0x080c, 0x97b9, 0x000e, 0x00de, 0x0005, 0x000e, 0x0002, -+ 0x96ca, 0x9787, 0x9787, 0x9787, 0x9787, 0x9789, 0x9787, 0x96c8, -+ 0x080c, 0x0dd5, 0x6820, 0x9005, 0x1110, 0x00de, 0x0005, 0x00c6, -+ 0x680c, 0x9065, 0x0520, 0x6114, 0x0096, 0x2148, 0xa964, 0x009e, -+ 0x918c, 0x00ff, 0x918e, 0x0035, 0x1180, 0x2009, 0x1837, 0x210c, -+ 0x918c, 0x0028, 0x1150, 0x080c, 0x73bc, 0x0138, 0x0006, 0x2009, -+ 0x188b, 0x2104, 0xc095, 0x200a, 0x000e, 0x6807, 0x0004, 0x6826, -+ 0x682b, 0x0000, 0x080c, 0x9861, 0x00ce, 0x00de, 0x0005, 0x6814, -+ 0x9065, 0x0150, 0x6807, 0x0001, 0x6826, 0x682b, 0x0000, 0x080c, -+ 0x9861, 0x00ce, 0x00de, 0x0005, 0x00b6, 0x00e6, 0x6a1c, 0x92dd, -+ 0x0000, 0x0904, 0x9773, 0xb84c, 0x900d, 0x0118, 0xb888, 0x9005, -+ 0x01a0, 0xb854, 0x905d, 0x0120, 0x920e, 0x0904, 0x9773, 0x0028, -+ 0x6818, 0x920e, 0x0904, 0x9773, 0x2058, 0xb84c, 0x900d, 0x0d88, -+ 0xb888, 0x9005, 0x1d70, 0x2b00, 0x681e, 0xbb3c, 0xb838, 0x9302, -+ 0x1e40, 0x080c, 0xae38, 0x0904, 0x9773, 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, 0xbac0, 0x629a, 0x2069, 0x0200, -+ 0x2071, 0x0240, 0x080c, 0x9dae, 0x2069, 0x19e7, 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, 0xac7d, 0x00ee, 0x00be, 0x00ce, 0x00de, 0x0005, 0x00de, -+ 0x0005, 0x00c6, 0x680c, 0x9065, 0x0508, 0x6114, 0x0096, 0x2148, -+ 0xa964, 0x009e, 0x918c, 0x00ff, 0x918e, 0x0035, 0x1180, 0x2009, -+ 0x1837, 0x210c, 0x918c, 0x0028, 0x1150, 0x080c, 0x73bc, 0x0138, -+ 0x0006, 0x2009, 0x188b, 0x2104, 0xc095, 0x200a, 0x000e, 0x6807, -+ 0x0004, 0x6826, 0x682b, 0x0000, 0x080c, 0x9861, 0x00ce, 0x00de, -+ 0x0005, 0x2001, 0x180c, 0x2014, 0xc2ed, 0x2202, 0x00de, 0x00fe, -+ 0x0005, 0x00f6, 0x00d6, 0x2069, 0x19e7, 0x6830, 0x9086, 0x0000, -+ 0x1570, 0x2001, 0x180c, 0x2014, 0xd2e4, 0x0130, 0xc2e4, 0x2202, -+ 0x080c, 0x969c, 0x2069, 0x19e7, 0x2001, 0x180c, 0x200c, 0xd1c4, -+ 0x1508, 0x6838, 0x907d, 0x01d8, 0x6a04, 0x9296, 0x0000, 0x1904, -+ 0x985a, 0x7920, 0x918e, 0x0009, 0x0588, 0x6833, 0x0001, 0x683e, -+ 0x6847, 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, -+ 0x002e, 0x080c, 0x1c46, 0x1178, 0x012e, 0x080c, 0xa0d0, 0x00de, -+ 0x00fe, 0x0005, 0xc1c4, 0x2102, 0x0066, 0x2031, 0x0001, 0x080c, -+ 0x746c, 0x006e, 0x08b0, 0x012e, 0x6843, 0x0000, 0x7803, 0x0002, -+ 0x780c, 0x9015, 0x0140, 0x6a3a, 0x780f, 0x0000, 0x6833, 0x0000, -+ 0x683f, 0x0000, 0x0c20, 0x683a, 0x6836, 0x0cc0, 0x7908, 0xd1fc, -+ 0x1198, 0x6833, 0x0001, 0x683e, 0x6847, 0x0000, 0x684b, 0x0000, -+ 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, 0x080c, 0x1c46, 0x19d8, -+ 0x012e, 0x080c, 0xa051, 0x0858, 0x2001, 0x1837, 0x2004, 0x9084, -+ 0x0028, 0x1188, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x0158, -+ 0x2001, 0x19e8, 0x2004, 0x9005, 0x11f0, 0x2001, 0x188b, 0x200c, -+ 0xc185, 0xc18c, 0x2102, 0x2f00, 0x6833, 0x0001, 0x683e, 0x6847, -+ 0x0000, 0x684b, 0x0000, 0x0126, 0x00f6, 0x2091, 0x2400, 0x002e, -+ 0x080c, 0x1c46, 0x1904, 0x97fb, 0x012e, 0x6a3c, 0x2278, 0x080c, -+ 0x9fdb, 0x0804, 0x97ef, 0x2011, 0x188b, 0x2204, 0xc08d, 0x2012, -+ 0x0804, 0x97ef, 0x6a04, 0x9296, 0x0006, 0x0904, 0x97d9, 0x0804, -+ 0x97b1, 0x6020, 0x9084, 0x000f, 0x000b, 0x0005, 0x9875, 0x987a, -+ 0x9ce8, 0x9d77, 0x987a, 0x9ce8, 0x9d77, 0x9875, 0x987a, 0x9875, -+ 0x9875, 0x9875, 0x9875, 0x9875, 0x9875, 0x080c, 0x9588, 0x080c, -+ 0x968d, 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, -+ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, -+ 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0dd5, 0x6110, 0x2158, 0xb9c0, -+ 0x2c78, 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, 0x98e6, -+ 0x005b, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, -+ 0x013e, 0x015e, 0x00be, 0x0005, 0x9a6b, 0x9aa6, 0x9acf, 0x9b77, -+ 0x9b99, 0x9b9f, 0x9bac, 0x9bb4, 0x9bc0, 0x9bc6, 0x9bd7, 0x9bc6, -+ 0x9c2f, 0x9bb4, 0x9c3b, 0x9c41, 0x9bc0, 0x9c41, 0x9c4d, 0x98e4, -+ 0x98e4, 0x98e4, 0x98e4, 0x98e4, 0x98e4, 0x98e4, 0x98e4, 0x98e4, -+ 0x98e4, 0x98e4, 0xa46d, 0xa490, 0xa4a1, 0xa4c1, 0xa4f3, 0x9bac, -+ 0x98e4, 0x9bac, 0x9bc6, 0x98e4, 0x9acf, 0x9b77, 0x98e4, 0xa8a9, -+ 0x9bc6, 0x98e4, 0xa8c5, 0x9bc6, 0x98e4, 0x9bc0, 0x9a65, 0x9907, -+ 0x98e4, 0xa8e1, 0xa94e, 0xaa25, 0x98e4, 0xaa32, 0x9ba9, 0xaa5d, -+ 0x98e4, 0xa4fd, 0xaa8a, 0x98e4, 0x080c, 0x0dd5, 0x2100, 0x005b, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, -+ 0x015e, 0x00be, 0x0005, 0xab25, 0xabd7, 0x9905, 0x992e, 0x99da, -+ 0x99e5, 0x9905, 0x9bac, 0x9905, 0x9a2c, 0x9a38, 0x9949, 0x9905, -+ 0x9964, 0x9998, 0xad3f, 0xad84, 0x9bc6, 0x080c, 0x0dd5, 0x00d6, -+ 0x0096, 0x080c, 0x9c60, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, -+ 0x0800, 0x7814, 0x2048, 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, -+ 0x7026, 0x60c3, 0x0018, 0x080c, 0xa247, 0x009e, 0x00de, 0x0005, -+ 0x7810, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, 0xadcb, 0x1118, -+ 0x9084, 0xff80, 0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, -+ 0x080c, 0x9c60, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, -+ 0xa878, 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, -+ 0xa888, 0x701e, 0x60c3, 0x0010, 0x080c, 0xa247, 0x009e, 0x00de, -+ 0x0005, 0x00d6, 0x0096, 0x080c, 0x9c60, 0x7003, 0x0500, 0x7814, -+ 0x2048, 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, -+ 0x7016, 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, -+ 0xa247, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x9c60, 0x20e9, 0x0000, 0x2001, 0x19a3, 0x2003, -+ 0x0000, 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, -+ 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a3, -+ 0x0016, 0x200c, 0x2001, 0x0001, 0x080c, 0x23b7, 0x080c, 0xd867, -+ 0x9006, 0x080c, 0x23b7, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, -+ 0x0c28, 0x04d9, 0x080c, 0xa247, 0x012e, 0x009e, 0x00de, 0x0005, -+ 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x9cab, 0x20e9, -+ 0x0000, 0x2001, 0x19a3, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, -+ 0x0200, 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, -+ 0xa860, 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a3, -+ 0x0016, 0x200c, 0x080c, 0xd867, 0x001e, 0xa804, 0x9005, 0x0110, -+ 0x2048, 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, 0x0fb1, 0x080c, -+ 0xa247, 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, -+ 0x0003, 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, -+ 0x1de0, 0x0005, 0x080c, 0x9c60, 0x7003, 0x7800, 0x7808, 0x8007, -+ 0x700a, 0x60c3, 0x0008, 0x0804, 0xa247, 0x00d6, 0x00e6, 0x080c, -+ 0x9cab, 0x7814, 0x9084, 0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, -+ 0x9095, 0x0010, 0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, -+ 0x1805, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x99fb, -+ 0x2069, 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, -+ 0x9a04, 0x2069, 0x19b3, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19cd, -+ 0x20a9, 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, -+ 0x6010, 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, -+ 0x2072, 0x8d68, 0x8e70, 0x1f04, 0x9a12, 0x60c3, 0x004c, 0x080c, -+ 0xa247, 0x00ee, 0x00de, 0x0005, 0x080c, 0x9c60, 0x7003, 0x6300, -+ 0x7007, 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa247, -+ 0x00d6, 0x0026, 0x0016, 0x080c, 0x9cab, 0x7003, 0x0200, 0x7814, -+ 0x700e, 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, -+ 0x2069, 0x1923, 0x6810, 0xd084, 0x1148, 0x2073, 0x0500, 0x8e70, -+ 0x2073, 0x0000, 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, 0x0800, -+ 0x8e70, 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, -+ 0xa247, 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1818, 0x2004, -+ 0x609a, 0x0804, 0xa247, 0x080c, 0x9c60, 0x7003, 0x5200, 0x2069, -+ 0x1847, 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2871, -+ 0x710e, 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, -+ 0x20e9, 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, -+ 0x1801, 0x20a1, 0x0254, 0x4003, 0x080c, 0xadcb, 0x1120, 0xb8a0, -+ 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7032, 0x2001, -+ 0x1820, 0x2004, 0x7036, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, -+ 0x00ff, 0x7036, 0x60c3, 0x001c, 0x0804, 0xa247, 0x080c, 0x9c60, -+ 0x7003, 0x0500, 0x080c, 0xadcb, 0x1120, 0xb8a0, 0x9082, 0x007f, -+ 0x0248, 0x2001, 0x181f, 0x2004, 0x700a, 0x2001, 0x1820, 0x2004, -+ 0x700e, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x700e, -+ 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, -+ 0x20a1, 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0xa247, 0x080c, -+ 0x9c60, 0x9006, 0x080c, 0x693c, 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, 0x9b3e, 0x00d6, 0x2069, -+ 0x196c, 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, 0x700a, -+ 0x6808, 0x9084, 0x2000, 0x7012, 0x080c, 0xade2, 0x680c, 0x7016, -+ 0x701f, 0x2710, 0x6818, 0x7022, 0x681c, 0x7026, 0x0090, 0x6800, -+ 0x700a, 0x6804, 0x700e, 0x6808, 0x080c, 0x73bc, 0x1118, 0x9084, -+ 0x37ff, 0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xade2, 0x680c, -+ 0x7016, 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, -+ 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, -+ 0x1801, 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xab0c, 0x2069, -+ 0x1974, 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x56d3, -+ 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, 0x2001, 0x1837, -+ 0x2004, 0xd0a4, 0x0170, 0x0016, 0x2001, 0x196d, 0x200c, 0x60e0, -+ 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x28b2, 0x61e2, -+ 0x001e, 0x20e1, 0x0001, 0x2099, 0x196c, 0x20e9, 0x0000, 0x20a1, -+ 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, -+ 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, -+ 0x025a, 0x4003, 0x080c, 0xab0c, 0x20a1, 0x024e, 0x20a9, 0x0008, -+ 0x2099, 0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0xa247, 0x080c, -+ 0x9c60, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, -+ 0x2000, 0x9006, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, 0xd1ac, -+ 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x9085, -+ 0x0002, 0x00d6, 0x0804, 0x9c10, 0x7026, 0x60c3, 0x0014, 0x0804, -+ 0xa247, 0x080c, 0x9c60, 0x7003, 0x5000, 0x0804, 0x9ae9, 0x080c, -+ 0x9c60, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, -+ 0xa247, 0x080c, 0x9ca2, 0x0010, 0x080c, 0x9cab, 0x7003, 0x0200, -+ 0x60c3, 0x0004, 0x0804, 0xa247, 0x080c, 0x9cab, 0x7003, 0x0100, -+ 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0xa247, -+ 0x080c, 0x9cab, 0x7003, 0x0200, 0x0804, 0x9ae9, 0x080c, 0x9cab, -+ 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, -+ 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0xa247, 0x00d6, -+ 0x080c, 0x9cab, 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, 0x1847, 0x7904, -+ 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, -+ 0x0010, 0x2009, 0x1869, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, -+ 0x0026, 0x2009, 0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbacc, -+ 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, -+ 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, -+ 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0xa247, 0x080c, -+ 0x9cab, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, -+ 0x0014, 0x0804, 0xa247, 0x080c, 0x9cab, 0x7003, 0x0200, 0x0804, -+ 0x9a6f, 0x080c, 0x9cab, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, -+ 0x2a00, 0x60c3, 0x0008, 0x0804, 0xa247, 0x080c, 0x9cab, 0x7003, -+ 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0xa247, 0x0026, -+ 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, -+ 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, -+ 0x080c, 0xab21, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, -+ 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029, 0x7012, -+ 0x004e, 0x003e, 0x00de, 0x080c, 0xa235, 0x721a, 0x9f95, 0x0000, -+ 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, -+ 0x080c, 0xab21, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, -+ 0x1800, 0x687c, 0x700a, 0x6880, 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, 0xab21, 0xb810, 0x9305, 0x7002, -+ 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, -+ 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x687c, -+ 0x700a, 0x6880, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, -+ 0x003e, 0x00de, 0x080c, 0xa235, 0x721a, 0x7a08, 0x7222, 0x2f10, -+ 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0xa235, 0x721a, -+ 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, -+ 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, -+ 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dd5, 0x908a, 0x0092, -+ 0x1a0c, 0x0dd5, 0x6110, 0x2158, 0xb9c0, 0x2c78, 0x2061, 0x0100, -+ 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x00be, 0x0005, 0x9d19, 0x9d28, 0x9d33, 0x9d17, 0x9d17, 0x9d17, -+ 0x9d19, 0x9d17, 0x9d17, 0x9d17, 0x9d17, 0x9d17, 0x9d17, 0x080c, -+ 0x0dd5, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2ba5, 0x0228, -+ 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0xa247, -+ 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, -+ 0x000c, 0x0804, 0xa247, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, -+ 0x60c3, 0x0004, 0x0804, 0xa247, 0x0026, 0x080c, 0xab21, 0xb810, -+ 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, -+ 0x700a, 0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9c7b, 0x0026, -+ 0x080c, 0xab21, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, -+ 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, -+ 0x7012, 0x0804, 0x9cdd, 0x0026, 0x080c, 0xab21, 0xb810, 0x9085, -+ 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, -+ 0x6880, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x9cdd, 0x00b6, -+ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, -+ 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0dd5, 0x908a, 0x0054, -+ 0x1a0c, 0x0dd5, 0x7910, 0x2158, 0xb9c0, 0x2061, 0x0100, 0x619a, -+ 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, -+ 0x0005, 0x9dae, 0x9e6a, 0x9e3d, 0x9f8c, 0x9dac, 0x9dac, 0x9dac, -+ 0x9dac, 0x9dac, 0x9dac, 0x9dac, 0xa66f, 0xa677, 0xa67f, 0xa687, -+ 0x9dac, 0xaa69, 0x9dac, 0xa667, 0x080c, 0x0dd5, 0x0096, 0x780b, -+ 0xffff, 0x080c, 0x9e19, 0x7914, 0x2148, 0xa978, 0x7956, 0xae64, -+ 0x96b4, 0x00ff, 0x9686, 0x0008, 0x1148, 0xa8b4, 0x7032, 0xa8b8, -+ 0x7036, 0xa8bc, 0x703a, 0xa8c0, 0x703e, 0x0008, 0x7132, 0xa97c, -+ 0x9184, 0x000f, 0x1118, 0x2001, 0x0005, 0x0040, 0xd184, 0x0118, -+ 0x2001, 0x0004, 0x0018, 0x9084, 0x0006, 0x8004, 0x2010, 0x785c, -+ 0x9084, 0x00ff, 0x8007, 0x9205, 0x7042, 0xd1ac, 0x0158, 0x7047, -+ 0x0002, 0x9686, 0x0008, 0x1118, 0x080c, 0x18ac, 0x0010, 0x080c, -+ 0x1725, 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, -+ 0x1a03, 0x2003, 0x07d0, 0x2001, 0x1a02, 0x2003, 0x0009, 0x009e, -+ 0x0005, 0x6813, 0x0008, 0xba8c, 0x8210, 0xb8cc, 0xd084, 0x0128, -+ 0x7a46, 0x7b14, 0x7b4a, 0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, -+ 0x8217, 0x721a, 0xba10, 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, -+ 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, 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, 0xa247, -+ 0x6813, 0x0008, 0xb810, 0x9085, 0x0500, 0x7002, 0xb814, 0x7006, -+ 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x7013, 0x0889, -+ 0x080c, 0xa235, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, -+ 0x024c, 0x0005, 0x00d6, 0x0096, 0x080c, 0x9f6a, 0x7814, 0x2048, -+ 0x080c, 0xcb33, 0x1130, 0x7814, 0x9084, 0x0700, 0x8007, 0x0033, -+ 0x0010, 0x9006, 0x001b, 0x009e, 0x00de, 0x0005, 0x9e88, 0x9ef1, -+ 0x9f01, 0x9f27, 0x9f33, 0x9f44, 0x9f4c, 0x9e86, 0x080c, 0x0dd5, -+ 0x0016, 0x0036, 0xa97c, 0x918c, 0x0003, 0x0118, 0x9186, 0x0003, -+ 0x1198, 0xaba8, 0x7824, 0xd0cc, 0x1168, 0x7316, 0xa898, 0x701a, -+ 0xa894, 0x701e, 0x003e, 0x001e, 0x2001, 0x19b1, 0x2004, 0x60c2, -+ 0x0804, 0xa247, 0xc3e5, 0x0c88, 0x9186, 0x0001, 0x190c, 0x0dd5, -+ 0xaba8, 0x7824, 0xd0cc, 0x1904, 0x9eee, 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, 0xa247, 0xc3e5, 0x0804, -+ 0x9ead, 0x2011, 0x0008, 0x2001, 0x180f, 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, 0xa247, 0x2011, -+ 0x0028, 0x7824, 0xd0cc, 0x1128, 0x7216, 0x60c3, 0x0018, 0x0804, -+ 0xa247, 0x0cd0, 0xc2e5, 0x2011, 0x0100, 0x7824, 0xd0cc, 0x0108, -+ 0xc2e5, 0x7216, 0x702f, 0x0008, 0x7858, 0x9084, 0x00ff, 0x7036, -+ 0x60c3, 0x0020, 0x0804, 0xa247, 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, 0x687c, 0x700a, 0x6880, -+ 0x700e, 0x7824, 0xd0cc, 0x1168, 0x7013, 0x0898, 0x080c, 0xa235, -+ 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x2071, 0x024c, 0x00de, -+ 0x0005, 0x7013, 0x0889, 0x0c90, 0x0016, 0x7814, 0x9084, 0x0700, -+ 0x8007, 0x0013, 0x001e, 0x0005, 0x9f9c, 0x9f9c, 0x9f9e, 0x9f9c, -+ 0x9f9c, 0x9f9c, 0x9fb8, 0x9f9c, 0x080c, 0x0dd5, 0x7914, 0x918c, -+ 0x08ff, 0x918d, 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, -+ 0x1847, 0x6804, 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, -+ 0x7032, 0x0010, 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, 0xa247, -+ 0x2009, 0x0003, 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, -+ 0xab21, 0x001e, 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, -+ 0x2069, 0x1800, 0x6a7c, 0x720a, 0x6a80, 0x720e, 0x7013, 0x0888, -+ 0x918d, 0x0008, 0x7116, 0x080c, 0xa235, 0x721a, 0x7a08, 0x7222, -+ 0x2f10, 0x7226, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, -+ 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, -+ 0x7810, 0x2058, 0x76dc, 0x96b4, 0x0028, 0x0110, 0x737c, 0x7480, -+ 0x2500, 0x76dc, 0x96b4, 0x0028, 0x0140, 0x2001, 0x04ff, 0x6062, -+ 0x6067, 0xffff, 0x636a, 0x646e, 0x0050, 0x2001, 0x00ff, 0x9085, -+ 0x0400, 0x6062, 0x6067, 0xffff, 0x606b, 0x0000, 0x616e, 0xb8b8, -+ 0x6073, 0x0530, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, -+ 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, 0x607f, 0x0000, 0x2b00, -+ 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, 0x2048, 0xa838, 0x608a, -+ 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0x009e, 0xb86c, -+ 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x2001, -+ 0x1837, 0x2004, 0x9084, 0x0028, 0x0128, 0x609f, 0x0000, 0x2001, -+ 0x0092, 0x0048, 0x6028, 0xc0bd, 0x602a, 0x609f, 0x00ff, 0x6027, -+ 0xffff, 0x2001, 0x00b2, 0x6016, 0x2009, 0x07d0, 0x080c, 0x857e, -+ 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, -+ 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, -+ 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, -+ 0xb8a0, 0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582, 0x007e, 0x1250, -+ 0x2500, 0x9094, 0xff80, 0x1130, 0x9080, 0x3325, 0x2015, 0x9294, -+ 0x00ff, 0x0020, 0xb910, 0xba14, 0x737c, 0x7480, 0x70dc, 0xd0ac, -+ 0x1130, 0x9582, 0x007e, 0x1218, 0x9584, 0xff80, 0x0138, 0x9185, -+ 0x0400, 0x6062, 0x6266, 0x636a, 0x646e, 0x0030, 0x6063, 0x0400, -+ 0x6266, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072, 0x6077, 0x0000, -+ 0xb864, 0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c, 0x8000, 0x9084, -+ 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, 0x607f, 0x0000, -+ 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, 0x2048, 0xa838, -+ 0x608a, 0xa834, 0x608e, 0xa848, 0x60c6, 0xa844, 0x60ca, 0x009e, -+ 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, 0x60d7, 0x0000, -+ 0xbac0, 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, 0x0000, 0x00fe, -+ 0x2009, 0x0092, 0x6116, 0x2009, 0x07d0, 0x080c, 0x857e, 0x003e, -+ 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, -+ 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, 0x0036, -+ 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, 0x2028, -+ 0xb910, 0xba14, 0x737c, 0x7480, 0x7820, 0x90be, 0x0006, 0x0904, -+ 0xa1a4, 0x90be, 0x000a, 0x1904, 0xa160, 0xb8c0, 0x609e, 0x7814, -+ 0x2048, 0xa87c, 0xd0fc, 0x0558, 0xaf90, 0x9784, 0xff00, 0x9105, -+ 0x6062, 0x873f, 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, -+ 0xc0fc, 0x9005, 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0198, 0x2039, -+ 0x0098, 0x9705, 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, -+ 0x9185, 0x2200, 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0xb8c0, -+ 0x609e, 0x0050, 0x2039, 0x0029, 0x9705, 0x6072, 0x0cc0, 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, 0xab06, 0x2009, 0x07d0, 0x60c4, 0x9084, -+ 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, 0x080c, 0x857e, 0x003e, -+ 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, -+ 0x7804, 0x9086, 0x0040, 0x0904, 0xa1e0, 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, 0xbac0, 0x629e, 0x080c, 0xab06, -+ 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, -+ 0x1b58, 0x080c, 0x857e, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, -+ 0x00ee, 0x009e, 0x00be, 0x0005, 0x7814, 0x2048, 0xa87c, 0x9084, -+ 0x0003, 0x9086, 0x0002, 0x0904, 0xa1fc, 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, 0xbac0, 0x629e, 0x080c, 0xaae3, 0x0804, 0xa190, -+ 0xb8cc, 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, 0xa173, 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, -+ 0xbac0, 0x629e, 0x7824, 0xd0cc, 0x0120, 0x080c, 0xab06, 0x0804, -+ 0xa190, 0x080c, 0xaae3, 0x0804, 0xa190, 0x7a10, 0x00b6, 0x2258, -+ 0xba8c, 0x8210, 0x9294, 0x00ff, 0xba8e, 0x00be, 0x8217, 0x0005, -+ 0x00d6, 0x2069, 0x19e7, 0x6843, 0x0001, 0x00de, 0x0005, 0x60a3, -+ 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x8570, 0x0005, 0x0016, -+ 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, -+ 0x0089, 0x080c, 0x8570, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, -+ 0x2102, 0x2001, 0x19e8, 0x2003, 0x0000, 0x2001, 0x19f0, 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, 0x73bc, 0x11e8, 0x2001, 0x1a03, 0x2004, 0x9005, -+ 0x1904, 0xa2d9, 0x0066, 0x2031, 0x0001, 0x080c, 0x746c, 0x006e, -+ 0x1160, 0x2061, 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, -+ 0x090c, 0x0dd5, 0x080c, 0x8570, 0x0460, 0x00c6, 0x2061, 0x19e7, -+ 0x00d0, 0x6904, 0x9194, 0x4000, 0x0548, 0x080c, 0xa273, 0x080c, -+ 0x2cff, 0x00c6, 0x2061, 0x19e7, 0x6128, 0x9192, 0x0008, 0x1258, -+ 0x8108, 0x612a, 0x6124, 0x00ce, 0x81ff, 0x0198, 0x080c, 0x8570, -+ 0x080c, 0xa26a, 0x0070, 0x6124, 0x91e5, 0x0000, 0x0140, 0x080c, -+ 0xe9fe, 0x080c, 0x8579, 0x2009, 0x0014, 0x080c, 0xaedc, 0x00ce, -+ 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x1a03, -+ 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19e7, 0x6128, 0x9192, -+ 0x0003, 0x1e08, 0x8108, 0x612a, 0x00ce, 0x080c, 0x8570, 0x080c, -+ 0x5ed9, 0x2009, 0x1846, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, -+ 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x8586, 0x2071, -+ 0x19e7, 0x713c, 0x81ff, 0x0904, 0xa37d, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x080c, 0x73bc, 0x1500, 0x0036, 0x2019, 0x0002, 0x080c, -+ 0xa5b6, 0x003e, 0x713c, 0x2160, 0x080c, 0xe9fe, 0x2009, 0x004a, -+ 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, -+ 0x2009, 0x004a, 0x080c, 0xaedc, 0x0066, 0x2031, 0x0001, 0x080c, -+ 0x746c, 0x006e, 0x0804, 0xa37d, 0x080c, 0xa389, 0x0904, 0xa37d, -+ 0x6904, 0xd1f4, 0x0904, 0xa384, 0x080c, 0x2cff, 0x00c6, 0x703c, -+ 0x9065, 0x090c, 0x0dd5, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1528, -+ 0x61c8, 0x60c4, 0x9105, 0x1508, 0x2009, 0x180c, 0x2104, 0xd0d4, -+ 0x01e0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, -+ 0x1560, 0x0030, 0xc0d4, 0x200a, 0xd0cc, 0x0110, 0x080c, 0x2c52, -+ 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, 0x703c, 0x2060, -+ 0x2009, 0x0049, 0x080c, 0xaedc, 0x00c0, 0x0036, 0x2019, 0x0001, -+ 0x080c, 0xa5b6, 0x003e, 0x713c, 0x2160, 0x080c, 0xe9fe, 0x2009, -+ 0x004a, 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, -+ 0x0006, 0x2009, 0x004a, 0x080c, 0xaedc, 0x002e, 0x001e, 0x00ee, -+ 0x00de, 0x00ce, 0x009e, 0x0005, 0xd1ec, 0x1904, 0xa334, 0x0804, -+ 0xa336, 0x00d6, 0x00c6, 0x0096, 0x703c, 0x9065, 0x090c, 0x0dd5, -+ 0x2001, 0x1837, 0x2004, 0xd09c, 0x1904, 0xa415, 0x2001, 0x0306, -+ 0x200c, 0x9184, 0x0030, 0x0904, 0xa415, 0x9184, 0x0048, 0x9086, -+ 0x0008, 0x1904, 0xa415, 0x2001, 0x020b, 0x2004, 0xd0fc, 0x0904, -+ 0xa415, 0xd08c, 0x0904, 0xa415, 0x2009, 0x1a80, 0x2104, 0x8000, -+ 0x0208, 0x200a, 0x2069, 0x0100, 0x6914, 0x918c, 0x0184, 0x918d, -+ 0x0010, 0x6916, 0x69c8, 0x2011, 0x0020, 0x68c8, 0x9106, 0x1570, -+ 0x8211, 0x1dd8, 0x2001, 0x0306, 0x2003, 0x4800, 0x2001, 0x009a, -+ 0x2003, 0x0004, 0x2001, 0x1a66, 0x2003, 0x0000, 0x2001, 0x1a6f, -+ 0x2003, 0x0000, 0x6a88, 0x698c, 0x2200, 0x9105, 0x1120, 0x2c10, -+ 0x080c, 0x1bad, 0x0040, 0x6014, 0x2048, 0xaa3a, 0xa936, 0x6ac4, -+ 0x69c8, 0xa946, 0xaa4a, 0x0126, 0x00c6, 0x2091, 0x2400, 0x002e, -+ 0x080c, 0x1c46, 0x190c, 0x0dd5, 0x012e, 0x0090, 0x2009, 0x1a81, -+ 0x2104, 0x8000, 0x0208, 0x200a, 0x69c8, 0x2011, 0x0020, 0x8211, -+ 0x1df0, 0x68c8, 0x9106, 0x1dc0, 0x69c4, 0x68c8, 0x9105, 0x0160, -+ 0x6824, 0xd08c, 0x0110, 0x6827, 0x0002, 0x7048, 0xc085, 0x704a, -+ 0x0079, 0x7048, 0xc084, 0x704a, 0x2009, 0x07d0, 0x080c, 0x857e, -+ 0x9006, 0x009e, 0x00ce, 0x00de, 0x0005, 0x9085, 0x0001, 0x0cc8, -+ 0x0026, 0x00e6, 0x2071, 0x19e7, 0x7048, 0xd084, 0x01d8, 0x713c, -+ 0x81ff, 0x01c0, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, -+ 0x0006, 0x1138, 0x7014, 0x9084, 0x1984, 0x9085, 0x0012, 0x7016, -+ 0x0048, 0x928e, 0x0009, 0x0db0, 0x7014, 0x9084, 0x1984, 0x9085, -+ 0x0016, 0x7016, 0x00ee, 0x002e, 0x0005, 0x00b6, 0x00e6, 0x00d6, -+ 0x00c6, 0x0066, 0x0056, 0x0046, 0x0006, 0x0126, 0x2091, 0x8000, -+ 0x6010, 0x2058, 0xbca0, 0x2071, 0x19e7, 0x7018, 0x2058, 0x8bff, -+ 0x0190, 0xb8a0, 0x9406, 0x0118, 0xb854, 0x2058, 0x0cc0, 0x6014, -+ 0x0096, 0x2048, 0xac6c, 0xad70, 0xae78, 0x009e, 0x080c, 0x6731, -+ 0x0110, 0x9085, 0x0001, 0x012e, 0x000e, 0x004e, 0x005e, 0x006e, -+ 0x00ce, 0x00de, 0x00ee, 0x00be, 0x0005, 0x080c, 0x9c60, 0x7003, -+ 0x1200, 0x7838, 0x7012, 0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, -+ 0x0004, 0x1148, 0x7810, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, -+ 0xb914, 0x00be, 0x0020, 0x2061, 0x1800, 0x607c, 0x6180, 0x9084, -+ 0x00ff, 0x700a, 0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0xa247, -+ 0x080c, 0x9c60, 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, -+ 0x9084, 0x00ff, 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, -+ 0xa247, 0x0156, 0x080c, 0x9cab, 0x7003, 0x0200, 0x080c, 0x85d9, -+ 0x20a9, 0x0006, 0x2011, 0xfff4, 0x2019, 0xfff5, 0x9ef0, 0x0002, -+ 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, -+ 0x9290, 0x0002, 0x1f04, 0xa4b0, 0x60c3, 0x001c, 0x015e, 0x0804, -+ 0xa247, 0x0016, 0x0026, 0x080c, 0x9c87, 0x080c, 0x9c99, 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, 0xa247, 0x002e, 0x001e, -+ 0x0005, 0x20a9, 0x0010, 0x4003, 0x080c, 0xab0c, 0x20a1, 0x0240, -+ 0x22a8, 0x4003, 0x0c68, 0x080c, 0x9c60, 0x7003, 0x6200, 0x7808, -+ 0x700e, 0x60c3, 0x0008, 0x0804, 0xa247, 0x0016, 0x0026, 0x080c, -+ 0x9c60, 0x20e9, 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, -+ 0xa800, 0x2048, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, -+ 0x009e, 0x7808, 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, -+ 0x080c, 0xa247, 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, -+ 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, 0x700c, 0x2060, 0x8cff, -+ 0x0178, 0x080c, 0xcd3b, 0x1110, 0x080c, 0xb813, 0x600c, 0x0006, -+ 0x080c, 0xcfa2, 0x080c, 0xae61, 0x080c, 0xa692, 0x00ce, 0x0c78, -+ 0x2c00, 0x700e, 0x700a, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, -+ 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, -+ 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, -+ 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e7, -+ 0x7024, 0x2060, 0x8cff, 0x01f8, 0x080c, 0xa273, 0x6ac0, 0x68c3, -+ 0x0000, 0x080c, 0x8579, 0x00c6, 0x2061, 0x0100, 0x080c, 0xac5d, -+ 0x00ce, 0x20a9, 0x01f4, 0x0461, 0x2009, 0x0013, 0x080c, 0xaedc, -+ 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, -+ 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096, 0x0001, -+ 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x8579, 0x6814, 0x9084, -+ 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, -+ 0x2011, 0x5e83, 0x080c, 0x84f3, 0x20a9, 0x01f4, 0x0009, 0x08c0, -+ 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, -+ 0x190c, 0x2cff, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, -+ 0x1f04, 0xa598, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, -+ 0x080c, 0x2cef, 0x9006, 0x080c, 0x2cef, 0x0005, 0x0126, 0x0156, -+ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, -+ 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, -+ 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e7, 0x703c, 0x2060, -+ 0x8cff, 0x0904, 0xa648, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, -+ 0x0002, 0x0904, 0xa648, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, -+ 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x8586, -+ 0x080c, 0x1ffa, 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e51, 0x2021, -+ 0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, -+ 0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, -+ 0x2071, 0x1a66, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, -+ 0x782b, 0x0008, 0x7003, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, -+ 0x1128, 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x2001, 0x1981, -+ 0x200c, 0x080c, 0x0e51, 0x004e, 0x20a9, 0x03e8, 0x6824, 0xd094, -+ 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, 0x190c, 0x2cff, -+ 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, 0x0010, 0x1f04, 0xa61e, -+ 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, -+ 0x9006, 0x080c, 0x2cef, 0x6827, 0x4000, 0x6824, 0x83ff, 0x1140, -+ 0x2009, 0x0049, 0x6020, 0x9086, 0x0009, 0x0110, 0x080c, 0xaedc, -+ 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, -+ 0x015e, 0x012e, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, -+ 0x19e7, 0x6a06, 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, -+ 0x8000, 0x2069, 0x19e7, 0x6a32, 0x012e, 0x00de, 0x0005, 0x080c, -+ 0x9e19, 0x7854, 0x7032, 0x7042, 0x7047, 0x1000, 0x00f8, 0x080c, -+ 0x9e19, 0x7854, 0x7032, 0x7042, 0x7047, 0x4000, 0x00b8, 0x080c, -+ 0x9e19, 0x7854, 0x7032, 0x7042, 0x7047, 0x2000, 0x0078, 0x080c, -+ 0x9e19, 0x7854, 0x7032, 0x7042, 0x7047, 0x0400, 0x0038, 0x080c, -+ 0x9e19, 0x7854, 0x7032, 0x7042, 0x7047, 0x0200, 0x60c3, 0x0020, -+ 0x0804, 0xa247, 0x00e6, 0x2071, 0x19e7, 0x7020, 0x9005, 0x0110, -+ 0x8001, 0x7022, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, -+ 0x0076, 0x0066, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, -+ 0x7614, 0x2660, 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0xa737, -+ 0x8cff, 0x0904, 0xa737, 0x6020, 0x9086, 0x0006, 0x1904, 0xa732, -+ 0x88ff, 0x0138, 0x2800, 0x9c06, 0x1904, 0xa732, 0x2039, 0x0000, -+ 0x0050, 0x6010, 0x9b06, 0x1904, 0xa732, 0x85ff, 0x0120, 0x6054, -+ 0x9106, 0x1904, 0xa732, 0x7024, 0x9c06, 0x15b0, 0x2069, 0x0100, -+ 0x68c0, 0x9005, 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, -+ 0x080c, 0x8579, 0x080c, 0xa7bc, 0x7027, 0x0000, 0x0428, 0x080c, -+ 0x8579, 0x6820, 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, -+ 0x68c3, 0x0000, 0x080c, 0xa7bc, 0x7027, 0x0000, 0x0036, 0x2069, -+ 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, -+ 0x2cef, 0x9006, 0x080c, 0x2cef, 0x2069, 0x0100, 0x6824, 0xd084, -+ 0x0110, 0x6827, 0x0001, 0x003e, 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, 0xcb33, 0x0110, 0x080c, 0xe551, -+ 0x009e, 0x080c, 0xae92, 0x080c, 0xa692, 0x88ff, 0x1190, 0x00ce, -+ 0x0804, 0xa6ad, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa6ad, 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, 0x19e7, 0x7638, 0x2660, 0x2678, 0x8cff, -+ 0x0904, 0xa7ab, 0x6020, 0x9086, 0x0006, 0x1904, 0xa7a6, 0x87ff, -+ 0x0128, 0x2700, 0x9c06, 0x1904, 0xa7a6, 0x0040, 0x6010, 0x9b06, -+ 0x15e8, 0x85ff, 0x0118, 0x6054, 0x9106, 0x15c0, 0x703c, 0x9c06, -+ 0x1168, 0x0036, 0x2019, 0x0001, 0x080c, 0xa5b6, 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, 0xcb33, 0x0110, 0x080c, 0xe551, 0x080c, -+ 0xae92, 0x87ff, 0x1198, 0x00ce, 0x0804, 0xa757, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0xa757, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, -+ 0x00ce, 0x009e, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, -+ 0x00ce, 0x97bd, 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19e7, 0x2001, -+ 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007, 0x0005, 0x0010, -+ 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0066, -+ 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, 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, 0x19e7, 0x760c, 0x2660, 0x2678, -+ 0x8cff, 0x0904, 0xa898, 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, -+ 0x9206, 0x1904, 0xa893, 0x7024, 0x9c06, 0x1520, 0x2069, 0x0100, -+ 0x68c0, 0x9005, 0x0904, 0xa86f, 0x080c, 0xa273, 0x68c3, 0x0000, -+ 0x080c, 0xa7bc, 0x7027, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, -+ 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2cef, 0x9006, -+ 0x080c, 0x2cef, 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, 0xcd2a, 0x1158, 0x080c, -+ 0x31e8, 0x080c, 0xcd3b, 0x11f0, 0x080c, 0xb813, 0x00d8, 0x080c, -+ 0xa7bc, 0x08c0, 0x080c, 0xcd3b, 0x1118, 0x080c, 0xb813, 0x0090, -+ 0x6014, 0x2048, 0x080c, 0xcb33, 0x0168, 0x6020, 0x9086, 0x0003, -+ 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c75, -+ 0x080c, 0xcd1e, 0x080c, 0xcfa2, 0x080c, 0xae92, 0x080c, 0xa692, -+ 0x00ce, 0x0804, 0xa818, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa818, -+ 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, -+ 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, 0x080c, 0xe551, -+ 0x0c08, 0x00d6, 0x080c, 0x9cab, 0x7003, 0x0200, 0x7007, 0x0014, -+ 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x1989, 0x20e9, 0x0000, -+ 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, 0x0004, 0x7027, -+ 0x7878, 0x080c, 0xa247, 0x00de, 0x0005, 0x080c, 0x9cab, 0x700b, -+ 0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, 0x9084, 0x00ff, -+ 0x7022, 0x782c, 0x7026, 0x7858, 0x9084, 0x00ff, 0x9085, 0x0200, -+ 0x7002, 0x7858, 0x9084, 0xff00, 0x8007, 0x7006, 0x60c2, 0x0804, -+ 0xa247, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, 0x2009, 0x0035, -+ 0x080c, 0xd1a8, 0x00de, 0x1904, 0xa946, 0x080c, 0x9c60, 0x7003, -+ 0x1300, 0x782c, 0x080c, 0xaa48, 0x2068, 0x6820, 0x9086, 0x0003, -+ 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0xadcb, 0x11d8, 0x9286, -+ 0x007e, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0498, 0x9286, -+ 0x007f, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, 0x0458, 0x9284, -+ 0xff80, 0x0180, 0x9286, 0x0080, 0x1128, 0x700b, 0x00ff, 0x700f, -+ 0xfffc, 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810, 0x700a, 0xb814, -+ 0x700e, 0x00c0, 0x6098, 0x700e, 0x00a8, 0x080c, 0xadcb, 0x1130, -+ 0x7810, 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250, 0x00d6, 0x2069, -+ 0x181f, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, 0x00de, 0x0010, -+ 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, 0x60c3, 0x000c, -+ 0x001e, 0x00de, 0x080c, 0xa247, 0x00be, 0x0005, 0x781b, 0x0001, -+ 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, 0x792c, 0x9180, -+ 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, 0x0003, 0x0904, -+ 0xa9c0, 0x9186, 0x0005, 0x0904, 0xa9a9, 0x9186, 0x0004, 0x05d8, -+ 0x9186, 0x0008, 0x0904, 0xa9b1, 0x7807, 0x0037, 0x782f, 0x0003, -+ 0x7817, 0x1700, 0x080c, 0xaa25, 0x0005, 0x080c, 0xa9e6, 0x00d6, -+ 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, 0x0002, 0xa98a, -+ 0xa995, 0xa98c, 0xa995, 0xa991, 0xa98a, 0xa98a, 0xa995, 0xa995, -+ 0xa995, 0xa995, 0xa98a, 0xa98a, 0xa98a, 0xa98a, 0xa98a, 0xa995, -+ 0xa98a, 0xa995, 0x080c, 0x0dd5, 0x6824, 0xd0e4, 0x0110, 0xd0cc, -+ 0x0110, 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, -+ 0x7026, 0x0804, 0xa9df, 0x080c, 0xa9e6, 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, 0xa247, 0x00b6, 0x0036, -+ 0x0046, 0x0056, 0x0066, 0x080c, 0x9cab, 0x9006, 0x7003, 0x0200, -+ 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, -+ 0xadcb, 0x1118, 0x9092, 0x007e, 0x0268, 0x00d6, 0x2069, 0x181f, -+ 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, 0x9cab, 0x7003, -+ 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, -+ 0x0804, 0xa247, 0x080c, 0x9c57, 0x7003, 0x1400, 0x7838, 0x700a, -+ 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, -+ 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, 0x0010, 0x0804, 0xa247, -+ 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, -+ 0x2058, 0xb8cc, 0xd084, 0x0120, 0x7848, 0x702a, 0x7844, 0x702e, -+ 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, 0x080c, 0x9ca2, 0x7003, -+ 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, -+ 0xa247, 0x0021, 0x60c3, 0x0000, 0x0804, 0xa247, 0x00d6, 0x080c, -+ 0xab21, 0xb810, 0x9085, 0x0300, 0x7002, 0xb814, 0x7006, 0x2069, -+ 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x7013, 0x0819, 0x080c, -+ 0xa235, 0x721a, 0x2f10, 0x7222, 0x7a08, 0x7226, 0x2071, 0x024c, -+ 0x00de, 0x0005, 0x00a9, 0x7914, 0x712a, 0x60c3, 0x0000, 0x60a7, -+ 0x9575, 0x0026, 0x080c, 0x2ba5, 0x0228, 0x2011, 0x0101, 0x2204, -+ 0xc0c5, 0x2012, 0x002e, 0x080c, 0xa26a, 0x080c, 0x8570, 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, 0xab21, 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, -+ 0x19b2, 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, 0x080c, 0x9c60, 0x0016, -+ 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, 0x0138, 0x2001, -+ 0x1837, 0x2004, 0x9084, 0x0028, 0x1138, 0x2001, 0x197c, 0x2004, -+ 0x9086, 0xaaaa, 0x1904, 0xabc6, 0x7003, 0x5400, 0x00c6, 0x2061, -+ 0x1800, 0x607c, 0x9084, 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, -+ 0x9105, 0x700a, 0x6080, 0x700e, 0xa998, 0x918c, 0xff00, 0x7112, -+ 0x20a9, 0x0004, 0x2009, 0x1805, 0x2e10, 0x9290, 0x0006, 0x2104, -+ 0x2012, 0x8108, 0x8210, 0x1f04, 0xab57, 0x20a9, 0x0004, 0x2009, -+ 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xab61, 0xa860, -+ 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, 0x2009, 0x0006, 0x20a9, -+ 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00d6, -+ 0x2069, 0x0200, 0x080c, 0xab0c, 0x00de, 0x2071, 0x0240, 0x2011, -+ 0x0240, 0x2009, 0x0002, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, -+ 0x8210, 0x8109, 0x1dc0, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, -+ 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0xa85c, 0x9080, 0x0031, -+ 0x2098, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, -+ 0x8210, 0x8109, 0x1dc0, 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, -+ 0x60a7, 0x9575, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1168, -+ 0x080c, 0x73bc, 0x0150, 0x6028, 0xc0bd, 0x602a, 0x6014, 0x9084, -+ 0x1804, 0x9085, 0x0029, 0x6016, 0x0010, 0x080c, 0xa247, 0x080c, -+ 0x8570, 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, 0x00e6, 0x2071, -+ 0x0240, 0x2001, 0x2200, 0x9085, 0x00ff, 0x7002, 0x7007, 0xffff, -+ 0x2071, 0x0100, 0x709b, 0x00ff, 0x00ee, 0x0804, 0xab3c, 0x080c, -+ 0x9c60, 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, -+ 0x0138, 0x7003, 0x5500, 0x00c6, 0xa89c, 0x9084, 0x00ff, 0xa998, -+ 0x810f, 0x918c, 0xff00, 0x9105, 0x700a, 0xa99c, 0x918c, 0xff00, -+ 0xa8a0, 0x9084, 0x00ff, 0x9105, 0x700e, 0xa998, 0x918c, 0xff00, -+ 0x2061, 0x1800, 0x607c, 0x9084, 0x00ff, 0x910d, 0x7112, 0x6180, -+ 0x7116, 0x2009, 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, -+ 0x2098, 0x2e10, 0x9290, 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, -+ 0x2012, 0x8210, 0x8109, 0x1dc0, 0x20a9, 0x0004, 0x2009, 0x1805, -+ 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xac18, 0x20a9, 0x0002, -+ 0x2009, 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xac22, -+ 0x00d6, 0x0016, 0x2069, 0x0200, 0x080c, 0xab0c, 0x001e, 0x00de, -+ 0x2071, 0x0240, 0x20a9, 0x0002, 0x2009, 0x1803, 0x2011, 0x0240, -+ 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xac38, 0x2009, 0x0008, -+ 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dd0, 0x9006, 0x20a9, -+ 0x0008, 0x2012, 0x8210, 0x1f04, 0xac49, 0x00ce, 0x60c3, 0x004c, -+ 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0xa247, 0x080c, 0x8570, -+ 0x00de, 0x009e, 0x002e, 0x001e, 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, 0xa878, 0x6056, 0x9006, 0xa836, 0xa83a, 0xa99c, 0xa946, -+ 0xa84a, 0x6023, 0x0003, 0x6007, 0x0040, 0x6003, 0x0003, 0x600b, -+ 0xffff, 0xa817, 0x0001, 0xa842, 0xa83e, 0x2900, 0xa85a, 0xa813, -+ 0x208e, 0x080c, 0x9155, 0x0126, 0x2091, 0x8000, 0x080c, 0x97b9, -+ 0x012e, 0x009e, 0x00de, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, -+ 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, -+ 0x760c, 0x2660, 0x2678, 0x8cff, 0x0904, 0xad2b, 0x7024, 0x9c06, -+ 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xad02, 0x080c, -+ 0xa273, 0x68c3, 0x0000, 0x080c, 0xa7bc, 0x7027, 0x0000, 0x0036, -+ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, -+ 0x080c, 0x2cef, 0x9006, 0x080c, 0x2cef, 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, -+ 0xcd2a, 0x1158, 0x080c, 0x31e8, 0x080c, 0xcd3b, 0x11f0, 0x080c, -+ 0xb813, 0x00d8, 0x080c, 0xa7bc, 0x08c0, 0x080c, 0xcd3b, 0x1118, -+ 0x080c, 0xb813, 0x0090, 0x6014, 0x2048, 0x080c, 0xcb33, 0x0168, -+ 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, -+ 0x0000, 0x080c, 0x6c81, 0x080c, 0xcd1e, 0x080c, 0xcfa2, 0x080c, -+ 0xae92, 0x080c, 0xa692, 0x00ce, 0x0804, 0xacb3, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0xacb3, 0x700f, 0x0000, 0x700b, 0x0000, 0x012e, -+ 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, -+ 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xe551, 0x08f0, 0x00d6, -+ 0x0156, 0x080c, 0x9cab, 0x7a14, 0x82ff, 0x0138, 0x7003, 0x0100, -+ 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, 0x7003, 0x0200, 0x7007, -+ 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, 0x9086, 0x0004, 0x1110, -+ 0xc38d, 0x0060, 0x080c, 0x73bc, 0x1110, 0xc3ad, 0x0008, 0xc3a5, -+ 0x6adc, 0xd29c, 0x1110, 0xd2ac, 0x0108, 0xc39d, 0x730e, 0x080c, -+ 0x85d9, 0x20a9, 0x0006, 0x2011, 0xfff4, 0x2019, 0xfff5, 0x2071, -+ 0x0250, 0x2305, 0x2072, 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, -+ 0x0002, 0x9290, 0x0002, 0x1f04, 0xad71, 0x60c3, 0x0020, 0x080c, -+ 0xa247, 0x015e, 0x00de, 0x0005, 0x0156, 0x080c, 0x9cab, 0x7a14, -+ 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, 0x9282, 0x000e, 0x1238, -+ 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0488, 0x7003, -+ 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, 0x2011, 0x19bd, 0x2204, -+ 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, 0x701e, 0x0421, 0x1120, -+ 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7022, -+ 0x2001, 0x1820, 0x2004, 0x7026, 0x0030, 0x2001, 0x1818, 0x2004, -+ 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, -+ 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, 0x4003, 0x60c3, 0x001c, -+ 0x015e, 0x0804, 0xa247, 0x0006, 0x2001, 0x1837, 0x2004, 0xd0ac, -+ 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, 0xa653, 0x2011, 0x0002, -+ 0x080c, 0xa65d, 0x080c, 0xa540, 0x0036, 0x901e, 0x080c, 0xa5b6, -+ 0x003e, 0x0005, 0x080c, 0x331e, 0x0188, 0x0016, 0x00b6, 0x00c6, -+ 0x7010, 0x9085, 0x0020, 0x7012, 0x2009, 0x007e, 0x080c, 0x65ff, -+ 0xb85c, 0xc0ac, 0xb85e, 0x00ce, 0x00be, 0x001e, 0x0005, 0x2071, -+ 0x188d, 0x7000, 0x9005, 0x0140, 0x2001, 0x0976, 0x2071, 0x1800, -+ 0x7076, 0x707a, 0x706b, 0xffe0, 0x2071, 0x1800, 0x7074, 0x7056, -+ 0x705b, 0x1cd0, 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, -+ 0x8000, 0x7554, 0x9582, 0x0010, 0x0608, 0x7058, 0x2060, 0x6000, -+ 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7068, 0x9c02, 0x1208, -+ 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, -+ 0x9ca8, 0x0018, 0x7068, 0x9502, 0x1230, 0x755a, 0x9085, 0x0001, -+ 0x012e, 0x00ee, 0x0005, 0x705b, 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, -+ 0x00e6, 0x2071, 0x1800, 0x7554, 0x9582, 0x0010, 0x0600, 0x7058, -+ 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, 0x0018, 0x7068, -+ 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, 0x6003, 0x0008, -+ 0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, 0x1228, 0x755a, -+ 0x9085, 0x0001, 0x00ee, 0x0005, 0x705b, 0x1cd0, 0x0cc8, 0x9006, -+ 0x0cc8, 0x9c82, 0x1cd0, 0x0a0c, 0x0dd5, 0x2001, 0x181a, 0x2004, -+ 0x9c02, 0x1a0c, 0x0dd5, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016, -+ 0x601a, 0x6012, 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x6056, -+ 0x605a, 0x6026, 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, -+ 0x6042, 0x602a, 0x2061, 0x1800, 0x6054, 0x8000, 0x6056, 0x9086, -+ 0x0001, 0x0108, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x968d, -+ 0x012e, 0x0cc0, 0x0006, 0x6000, 0x9086, 0x0000, 0x01b0, 0x601c, -+ 0xd084, 0x190c, 0x1a5e, 0x6017, 0x0000, 0x6023, 0x0007, 0x2001, -+ 0x1986, 0x2004, 0x0006, 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, -+ 0x601a, 0x080c, 0xe80b, 0x6043, 0x0000, 0x000e, 0x0005, 0x00e6, -+ 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0001, -+ 0x0608, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, -+ 0x0018, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1cd0, 0x0c98, -+ 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x0018, 0x7068, 0x9502, -+ 0x1230, 0x755a, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, -+ 0x1cd0, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, -+ 0xaeef, 0xaef8, 0xaf13, 0xaf2e, 0xd256, 0xd273, 0xd28e, 0xaeef, -+ 0xaef8, 0x8d8b, 0xaf4a, 0xaeef, 0xaeef, 0xaeef, 0xaeef, 0x9186, -+ 0x0013, 0x1128, 0x080c, 0x9588, 0x080c, 0x968d, 0x0005, 0x0005, -+ 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, 0x0013, 0x006e, -+ 0x0005, 0xaf11, 0xb67f, 0xb85a, 0xaf11, 0xb8f0, 0xb22d, 0xaf11, -+ 0xaf11, 0xb601, 0xbe55, 0xaf11, 0xaf11, 0xaf11, 0xaf11, 0xaf11, -+ 0xaf11, 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, -+ 0x0dd5, 0x0013, 0x006e, 0x0005, 0xaf2c, 0xc529, 0xaf2c, 0xaf2c, -+ 0xaf2c, 0xaf2c, 0xaf2c, 0xaf2c, 0xc4ce, 0xc6ab, 0xaf2c, 0xc56a, -+ 0xc5e9, 0xc56a, 0xc5e9, 0xaf2c, 0x080c, 0x0dd5, 0x6000, 0x9082, -+ 0x0016, 0x1a0c, 0x0dd5, 0x6000, 0x0002, 0xaf48, 0xbe9c, 0xbf81, -+ 0xc0b1, 0xc25c, 0xaf48, 0xaf48, 0xaf48, 0xbe70, 0xc45a, 0xc45d, -+ 0xaf48, 0xaf48, 0xaf48, 0xaf48, 0xc48c, 0xaf48, 0xaf48, 0xaf48, -+ 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, -+ 0x0013, 0x006e, 0x0005, 0xaf63, 0xaf63, 0xafa6, 0xb045, 0xb0da, -+ 0xaf63, 0xaf63, 0xaf63, 0xaf65, 0xaf63, 0xaf63, 0xaf63, 0xaf63, -+ 0xaf63, 0xaf63, 0xaf63, 0x080c, 0x0dd5, 0x9186, 0x004c, 0x0588, -+ 0x9186, 0x0003, 0x190c, 0x0dd5, 0x0096, 0x601c, 0xc0ed, 0x601e, -+ 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, 0x9084, 0xa000, -+ 0xc0b5, 0xa87e, 0xa8ac, 0xa846, 0xa8b0, 0xa84a, 0x9006, 0xa836, -+ 0xa83a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, -+ 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x2c10, 0x080c, 0x1bad, -+ 0x080c, 0x9155, 0x0126, 0x2091, 0x8000, 0x080c, 0x97b9, 0x012e, -+ 0x0005, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, -+ 0xb0fc, 0x080c, 0xd248, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, -+ 0x00f6, 0x2079, 0x1800, 0x7a90, 0x6014, 0x2048, 0xa87c, 0xd0ec, -+ 0x1110, 0x9290, 0x0018, 0xac78, 0xc4fc, 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, -+ 0xb00d, 0xb00d, 0xb008, 0xb00b, 0xb00d, 0xb005, 0xaff8, 0xaff8, -+ 0xaff8, 0xaff8, 0xaff8, 0xaff8, 0xaff8, 0xaff8, 0xaff8, 0xaff8, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, -+ 0x00fe, 0x009e, 0x00de, 0x080c, 0x0dd5, 0x080c, 0xbaad, 0x0028, -+ 0x080c, 0xbb92, 0x0010, 0x080c, 0xbc88, 0x00fe, 0x00ee, 0x00de, -+ 0x00ce, 0x002e, 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0xb1ba, -+ 0x0530, 0xa804, 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, -+ 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, -+ 0xaacc, 0xabd0, 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x125d, -+ 0x080c, 0xb37a, 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, -+ 0x00de, 0x0005, 0x00fe, 0x009e, 0x00de, 0x0804, 0xae61, 0x2001, -+ 0x002c, 0x900e, 0x080c, 0xb220, 0x0c70, 0x91b6, 0x0015, 0x0170, -+ 0x91b6, 0x0016, 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0dd5, 0x91b2, -+ 0x0050, 0x1a0c, 0x0dd5, 0x9182, 0x0047, 0x00ca, 0x2001, 0x0109, -+ 0x2004, 0xd08c, 0x0198, 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, -+ 0x0026, 0x080c, 0x90a2, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, -+ 0x6000, 0x9086, 0x0002, 0x1110, 0x0804, 0xafa6, 0x0005, 0xb078, -+ 0xb078, 0xb07a, 0xb0b0, 0xb078, 0xb078, 0xb078, 0xb078, 0xb0c3, -+ 0x080c, 0x0dd5, 0x00d6, 0x0016, 0x0096, 0x080c, 0x963d, 0x080c, -+ 0x97b9, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, -+ 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, -+ 0x0000, 0x900e, 0x080c, 0xb220, 0x080c, 0xae61, 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, 0x963d, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xcb35, -+ 0x0120, 0xa87b, 0x0006, 0x080c, 0x6c81, 0x009e, 0x00de, 0x080c, -+ 0xae61, 0x0804, 0x97b9, 0x080c, 0x963d, 0x080c, 0x31bf, 0x080c, -+ 0xd245, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xcb35, 0x0120, -+ 0xa87b, 0x0029, 0x080c, 0x6c81, 0x009e, 0x00de, 0x080c, 0xae61, -+ 0x0804, 0x97b9, 0x9182, 0x0047, 0x0002, 0xb0ea, 0xb0ec, 0xb0ea, -+ 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, 0xb0ea, -+ 0xb0ea, 0xb0ec, 0x080c, 0x0dd5, 0x00d6, 0x0096, 0x601f, 0x0000, -+ 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x6c81, -+ 0x009e, 0x00de, 0x0804, 0xae61, 0x0026, 0x0036, 0x0056, 0x0066, -+ 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x0fff, 0x000e, 0x090c, -+ 0x0dd5, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, -+ 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, 0x7990, 0x9188, -+ 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, -+ 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, -+ 0x1228, 0x2011, 0x001f, 0x080c, 0xc730, 0x04c0, 0x2130, 0x2009, -+ 0x0034, 0x2011, 0x001f, 0x080c, 0xc730, 0x96b2, 0x0034, 0xb004, -+ 0x904d, 0x0110, 0x080c, 0x0fb1, 0x080c, 0x0fff, 0x01d0, 0x8528, -+ 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, -+ 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xc730, 0x00b8, 0x96b2, -+ 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xc730, -+ 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, 0x6c81, 0x000e, 0x2048, -+ 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, -+ 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x0fff, -+ 0x000e, 0x090c, 0x0dd5, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, -+ 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, -+ 0x1800, 0x7990, 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, 0x6c81, 0x009e, 0x00fe, -+ 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, -+ 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, -+ 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, -+ 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, -+ 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, 0x0fff, 0x2900, 0x009e, -+ 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, -+ 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, -+ 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, -+ 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, -+ 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, -+ 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, -+ 0x2e98, 0x2310, 0x84ff, 0x0904, 0xb1cf, 0x0804, 0xb1d1, 0x9085, -+ 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, -+ 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, -+ 0x6c75, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, -+ 0x080c, 0xae61, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0dd5, 0x080c, -+ 0xae61, 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, 0xcb35, -+ 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, -+ 0x0804, 0xae61, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, -+ 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8cf, 0x0000, 0x00be, 0x6014, -+ 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, -+ 0x080c, 0xae61, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, -+ 0x0cc8, 0x0006, 0x0016, 0x080c, 0xd230, 0x0188, 0x6014, 0x9005, -+ 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, 0x6043, 0x0000, 0x2009, -+ 0x0022, 0x080c, 0xb657, 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, 0xae61, 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, -+ 0xc730, 0x080c, 0xcb35, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, -+ 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xae61, 0x001e, 0x009e, -+ 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, 0x9086, 0x0200, 0x0110, -+ 0x2009, 0x0001, 0x0096, 0x6014, 0x904d, 0x090c, 0x0dd5, 0xa97a, -+ 0x080c, 0x6c81, 0x009e, 0x080c, 0xae61, 0x001e, 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, 0xc730, -+ 0x009e, 0x080c, 0xcb35, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, -+ 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xae61, 0x009e, -+ 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, -+ 0x1118, 0x080c, 0xb813, 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, 0x1243, 0x0019, 0x0d08, -+ 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x0fff, 0x000e, 0x01b0, -+ 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, -+ 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, -+ 0x2940, 0x080c, 0x10e9, 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, 0xd1a8, 0x001e, 0x1158, 0x622c, -+ 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, -+ 0x0006, 0x0128, 0x080c, 0xae61, 0x0020, 0x0039, 0x0010, 0x080c, -+ 0xb48c, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, -+ 0x9186, 0x0015, 0x0904, 0xb474, 0x918e, 0x0016, 0x1904, 0xb48a, -+ 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, -+ 0x1904, 0xb44e, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, -+ 0xb431, 0x0804, 0xb488, 0x6808, 0x9086, 0xffff, 0x1904, 0xb476, -+ 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, -+ 0x9105, 0x1904, 0xb476, 0x6824, 0xd0b4, 0x1904, 0xb476, 0x080c, -+ 0xcd1e, 0x685c, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, -+ 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x8f68, 0xa884, -+ 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6, -+ 0x2d60, 0x080c, 0xc85a, 0x00ce, 0x0804, 0xb488, 0x00c6, 0xa868, -+ 0xd0fc, 0x1118, 0x080c, 0x60ae, 0x0010, 0x080c, 0x64b4, 0x00ce, -+ 0x1904, 0xb476, 0x00c6, 0x2d60, 0x080c, 0xae61, 0x00ce, 0x0804, -+ 0xb488, 0x00c6, 0x080c, 0xaeaf, 0x0198, 0x6017, 0x0000, 0x6810, -+ 0x6012, 0x080c, 0xcfaa, 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, -+ 0x080c, 0xae61, 0x00ce, 0x080c, 0xaedc, 0x00ce, 0x0804, 0xb488, -+ 0x2001, 0x1988, 0x2004, 0x6842, 0x00ce, 0x04d0, 0x7008, 0x9086, -+ 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, 0xc1bc, 0xb902, -+ 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, 0xd1ea, 0x6007, -+ 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x90f0, 0x080c, -+ 0x968d, 0x00ce, 0x00e8, 0x700c, 0x9086, 0x2a00, 0x1138, 0x2001, -+ 0x1988, 0x2004, 0x6842, 0x00a0, 0x0479, 0x00a0, 0x89ff, 0x090c, -+ 0x0dd5, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, 0xa87b, 0x0003, -+ 0x080c, 0x6a9d, 0x080c, 0xcd1e, 0x080c, 0xae92, 0x00de, 0x00ce, -+ 0x080c, 0xae61, 0x009e, 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, -+ 0x1988, 0x2004, 0x6842, 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, -+ 0x2d00, 0x2060, 0x080c, 0xe80b, 0x080c, 0x86b2, 0x080c, 0xae61, -+ 0x00ce, 0x080c, 0xae61, 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, -+ 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1988, 0x2004, 0x6842, -+ 0x0804, 0xb506, 0x00c6, 0x2d60, 0x080c, 0xc75b, 0x00ce, 0x6804, -+ 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, -+ 0x6007, 0x0050, 0x080c, 0x90f0, 0x080c, 0x968d, 0x00ce, 0x04f0, -+ 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c, 0x0dd5, 0x6800, -+ 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178, 0xa843, 0x0fff, -+ 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, -+ 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150, -+ 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838, 0xa934, 0x9105, -+ 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306, 0x1118, 0x7020, -+ 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a, 0x2001, 0x0005, -+ 0x6832, 0x080c, 0xcea1, 0x080c, 0x968d, 0x0010, 0x080c, 0xae61, -+ 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, -+ 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, -+ 0x1904, 0xb571, 0x700c, 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, -+ 0x9206, 0x1904, 0xb571, 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, -+ 0x6a20, 0x9286, 0x0007, 0x0904, 0xb571, 0x9286, 0x0002, 0x0904, -+ 0xb571, 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, 0xcb35, -+ 0x090c, 0x0dd5, 0xa87b, 0x0003, 0x009e, 0x080c, 0xd1ea, 0x6007, -+ 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x90f0, 0x080c, -+ 0x968d, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, 0x1988, 0x2004, -+ 0x7042, 0x080c, 0xae61, 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, 0xbe1d, 0x002e, 0x003e, 0x015e, 0x009e, -+ 0x1904, 0xb5e0, 0x0096, 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, -+ 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, 0xbe1d, 0x002e, -+ 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, -+ 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, -+ 0x00be, 0x0804, 0xb265, 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, -+ 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, -+ 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, -+ 0x2031, 0x0000, 0x2041, 0x1243, 0x080c, 0xb37a, 0x0130, 0x00fe, -+ 0x009e, 0x080c, 0xae61, 0x00be, 0x0005, 0x080c, 0xb813, 0x0cb8, -+ 0x2b78, 0x00f6, 0x080c, 0x31bf, 0x080c, 0xd245, 0x00fe, 0x00c6, -+ 0x080c, 0xae0b, 0x2f00, 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, -+ 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, 0x080c, 0x654f, -+ 0x080c, 0x657b, 0x080c, 0x9138, 0x080c, 0x968d, 0x00ce, 0x0804, -+ 0xb5b3, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0dd5, 0x91b2, 0x0040, -+ 0x1a04, 0xb669, 0x0002, 0xb657, 0xb657, 0xb64d, 0xb657, 0xb657, -+ 0xb657, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, -+ 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, -+ 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, -+ 0xb64b, 0xb64b, 0xb657, 0xb64b, 0xb657, 0xb657, 0xb64b, 0xb64b, -+ 0xb64b, 0xb64b, 0xb64b, 0xb64d, 0xb64b, 0xb64b, 0xb64b, 0xb64b, -+ 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb657, 0xb657, 0xb64b, -+ 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, 0xb64b, -+ 0xb657, 0xb64b, 0xb64b, 0x080c, 0x0dd5, 0x0066, 0x00b6, 0x6610, -+ 0x2658, 0xb8cc, 0xc08c, 0xb8ce, 0x00be, 0x006e, 0x0000, 0x6003, -+ 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, 0x9138, 0x0010, -+ 0x080c, 0x90f0, 0x0126, 0x2091, 0x8000, 0x080c, 0x968d, 0x012e, -+ 0x0005, 0x2600, 0x0002, 0xb657, 0xb657, 0xb67d, 0xb657, 0xb657, -+ 0xb67d, 0xb67d, 0xb67d, 0xb67d, 0xb657, 0xb67d, 0xb657, 0xb67d, -+ 0xb657, 0xb67d, 0xb67d, 0xb67d, 0xb67d, 0x080c, 0x0dd5, 0x6004, -+ 0x90b2, 0x0053, 0x1a0c, 0x0dd5, 0x91b6, 0x0013, 0x0904, 0xb741, -+ 0x91b6, 0x0027, 0x1904, 0xb6fc, 0x080c, 0x9588, 0x6004, 0x080c, -+ 0xcd2a, 0x01b0, 0x080c, 0xcd3b, 0x01a8, 0x908e, 0x0021, 0x0904, -+ 0xb6f9, 0x908e, 0x0022, 0x1130, 0x080c, 0xb291, 0x0904, 0xb6f5, -+ 0x0804, 0xb6f6, 0x908e, 0x003d, 0x0904, 0xb6f9, 0x0804, 0xb6ef, -+ 0x080c, 0x31e8, 0x2001, 0x0007, 0x080c, 0x654f, 0x6010, 0x00b6, -+ 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb813, 0x9186, 0x007e, 0x1148, -+ 0x2001, 0x1837, 0x2014, 0xc285, 0x080c, 0x73bc, 0x1108, 0xc2ad, -+ 0x2202, 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xe917, -+ 0x002e, 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, -+ 0x080c, 0x928b, 0x0076, 0x903e, 0x080c, 0x9168, 0x6010, 0x00b6, -+ 0x905d, 0x0100, 0x00be, 0x2c08, 0x080c, 0xe2eb, 0x007e, 0x003e, -+ 0x002e, 0x001e, 0x080c, 0xd245, 0x0016, 0x080c, 0xcfa2, 0x080c, -+ 0xae61, 0x001e, 0x080c, 0x32bb, 0x080c, 0x968d, 0x0030, 0x080c, -+ 0xcfa2, 0x080c, 0xae61, 0x080c, 0x968d, 0x0005, 0x080c, 0xb813, -+ 0x0cb0, 0x080c, 0xb84f, 0x0c98, 0x9186, 0x0014, 0x1db0, 0x080c, -+ 0x9588, 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xb291, 0x0d68, -+ 0x080c, 0x31bf, 0x080c, 0xd245, 0x080c, 0xcd2a, 0x1190, 0x080c, -+ 0x31e8, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb813, -+ 0x9186, 0x007e, 0x1128, 0x2001, 0x1837, 0x200c, 0xc185, 0x2102, -+ 0x0870, 0x080c, 0xcd3b, 0x1118, 0x080c, 0xb813, 0x0840, 0x6004, -+ 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, -+ 0x0000, 0x080c, 0x3556, 0x00fe, 0x00ee, 0x0804, 0xb6ef, 0x6004, -+ 0x908e, 0x0021, 0x0d48, 0x908e, 0x0022, 0x090c, 0xb813, 0x0804, -+ 0xb6ef, 0x90b2, 0x0040, 0x1a04, 0xb7ef, 0x2008, 0x0002, 0xb789, -+ 0xb78a, 0xb78d, 0xb790, 0xb793, 0xb796, 0xb787, 0xb787, 0xb787, -+ 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, -+ 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, -+ 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb799, 0xb7a4, 0xb787, -+ 0xb7a6, 0xb7a4, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb7a4, -+ 0xb7a4, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, 0xb787, -+ 0xb787, 0xb7d6, 0xb7a4, 0xb787, 0xb7a0, 0xb787, 0xb787, 0xb787, -+ 0xb7a1, 0xb787, 0xb787, 0xb787, 0xb7a4, 0xb7cd, 0xb787, 0x080c, -+ 0x0dd5, 0x00d0, 0x2001, 0x000b, 0x0410, 0x2001, 0x0003, 0x00f8, -+ 0x2001, 0x0005, 0x00e0, 0x2001, 0x0001, 0x00c8, 0x2001, 0x0009, -+ 0x00b0, 0x080c, 0x9588, 0x6003, 0x0005, 0x080c, 0x968d, 0x0070, -+ 0x0018, 0x0010, 0x080c, 0x654f, 0x0804, 0xb7e7, 0x080c, 0x9588, -+ 0x080c, 0xd248, 0x6003, 0x0004, 0x080c, 0x968d, 0x0005, 0x080c, -+ 0x654f, 0x080c, 0x9588, 0x6003, 0x0002, 0x0036, 0x2019, 0x1852, -+ 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1986, 0x201c, 0x0040, -+ 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, -+ 0x631a, 0x003e, 0x080c, 0x968d, 0x0c08, 0x080c, 0x9588, 0x080c, -+ 0xcfa2, 0x080c, 0xae61, 0x080c, 0x968d, 0x08c0, 0x00e6, 0x00f6, -+ 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, 0x3556, 0x00fe, 0x00ee, -+ 0x080c, 0x9588, 0x080c, 0xae61, 0x080c, 0x968d, 0x0838, 0x080c, -+ 0x9588, 0x6003, 0x0002, 0x080c, 0xd248, 0x0804, 0x968d, 0x2600, -+ 0x2008, 0x0002, 0xb806, 0xb7e7, 0xb804, 0xb7e7, 0xb7e7, 0xb804, -+ 0xb804, 0xb804, 0xb804, 0xb7e7, 0xb804, 0xb7e7, 0xb804, 0xb7e7, -+ 0xb804, 0xb804, 0xb804, 0xb804, 0x080c, 0x0dd5, 0x080c, 0x9588, -+ 0x0096, 0x6014, 0x2048, 0x080c, 0x6c81, 0x009e, 0x080c, 0xae61, -+ 0x080c, 0x968d, 0x0005, 0x00e6, 0x0096, 0x0026, 0x0016, 0x080c, -+ 0xcb35, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, 0x0139, 0x11a8, -+ 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x5478, 0x0130, 0x2001, -+ 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, 0x0030, 0x900e, -+ 0x2011, 0x4005, 0x080c, 0xd10f, 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, 0x0dd5, 0x6604, 0x96b6, 0x004d, 0x1120, -+ 0x080c, 0xd02e, 0x0804, 0xb8df, 0x6604, 0x96b6, 0x0043, 0x1120, -+ 0x080c, 0xd077, 0x0804, 0xb8df, 0x6604, 0x96b6, 0x004b, 0x1120, -+ 0x080c, 0xd0a3, 0x0804, 0xb8df, 0x6604, 0x96b6, 0x0033, 0x1120, -+ 0x080c, 0xcfc4, 0x0804, 0xb8df, 0x6604, 0x96b6, 0x0028, 0x1120, -+ 0x080c, 0xcd74, 0x0804, 0xb8df, 0x6604, 0x96b6, 0x0029, 0x1120, -+ 0x080c, 0xcdb5, 0x0804, 0xb8df, 0x6604, 0x96b6, 0x001f, 0x1120, -+ 0x080c, 0xb23a, 0x0804, 0xb8df, 0x6604, 0x96b6, 0x0000, 0x1118, -+ 0x080c, 0xb577, 0x04e0, 0x6604, 0x96b6, 0x0022, 0x1118, 0x080c, -+ 0xb272, 0x04a8, 0x6604, 0x96b6, 0x0035, 0x1118, 0x080c, 0xb398, -+ 0x0470, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, 0xb50c, 0x0438, -+ 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0xb2aa, 0x0400, 0x6604, -+ 0x96b6, 0x0044, 0x1118, 0x080c, 0xb2e6, 0x00c8, 0x6604, 0x96b6, -+ 0x0049, 0x1118, 0x080c, 0xb327, 0x0090, 0x6604, 0x96b6, 0x0041, -+ 0x1118, 0x080c, 0xb311, 0x0058, 0x91b6, 0x0015, 0x1110, 0x0063, -+ 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, 0xbb39, 0x00be, -+ 0x0005, 0x080c, 0xaef7, 0x0cd8, 0xb8fc, 0xb8ff, 0xb8fc, 0xb946, -+ 0xb8fc, 0xbaad, 0xbb46, 0xb8fc, 0xb8fc, 0xbb0f, 0xb8fc, 0xbb25, -+ 0x0096, 0x601f, 0x0000, 0x6014, 0x2048, 0xa800, 0x2048, 0xa867, -+ 0x0103, 0x009e, 0x0804, 0xae61, 0xa001, 0xa001, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0x7090, 0x9086, 0x0074, 0x1540, 0x080c, 0xe2bc, -+ 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c, 0x0128, 0xb800, -+ 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00f9, 0x00be, 0x2001, 0x0006, -+ 0x080c, 0x654f, 0x080c, 0x31e8, 0x080c, 0xae61, 0x0098, 0x2001, -+ 0x000a, 0x080c, 0x654f, 0x080c, 0x31e8, 0x6003, 0x0001, 0x6007, -+ 0x0001, 0x080c, 0x9138, 0x080c, 0x968d, 0x0020, 0x2001, 0x0001, -+ 0x080c, 0xba7d, 0x00ee, 0x0005, 0x00d6, 0xb800, 0xd084, 0x0160, -+ 0x9006, 0x080c, 0x653b, 0x2069, 0x1847, 0x6804, 0xd0a4, 0x0120, -+ 0x2001, 0x0006, 0x080c, 0x657b, 0x00de, 0x0005, 0x00b6, 0x0096, -+ 0x00d6, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, 0x1904, 0xba54, -+ 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, 0xbc93, -+ 0x0804, 0xb9b8, 0x080c, 0xbc88, 0x6010, 0x2058, 0xbaa0, 0x9286, -+ 0x0080, 0x1510, 0x6014, 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, -+ 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, -+ 0x4000, 0x080c, 0xd10f, 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, -+ 0xa833, 0x0200, 0x2001, 0x0006, 0x080c, 0x654f, 0x080c, 0x31e8, -+ 0x080c, 0xae61, 0x0804, 0xba57, 0x080c, 0xba65, 0x6014, 0x9005, -+ 0x0190, 0x2048, 0xa868, 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, -+ 0x9086, 0x0039, 0x1d08, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, -+ 0x080c, 0xd10f, 0x08f8, 0x080c, 0xba5b, 0x0160, 0x9006, 0x080c, -+ 0x653b, 0x2001, 0x0004, 0x080c, 0x657b, 0x2001, 0x0007, 0x080c, -+ 0x654f, 0x08a0, 0x2001, 0x0004, 0x080c, 0x654f, 0x6003, 0x0001, -+ 0x6007, 0x0003, 0x080c, 0x9138, 0x080c, 0x968d, 0x0804, 0xba57, -+ 0xb85c, 0xd0e4, 0x01d8, 0x080c, 0xcf44, 0x080c, 0x73bc, 0x0118, -+ 0xd0dc, 0x1904, 0xb97a, 0x2011, 0x1837, 0x2204, 0xc0ad, 0x2012, -+ 0x2001, 0x196d, 0x2004, 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, -+ 0x080c, 0x28b2, 0x78e2, 0x00fe, 0x0804, 0xb97a, 0x080c, 0xcf81, -+ 0x2011, 0x1837, 0x2204, 0xc0a5, 0x2012, 0x0006, 0x080c, 0xe441, -+ 0x000e, 0x1904, 0xb97a, 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, -+ 0x654f, 0x9006, 0x080c, 0x653b, 0x00c6, 0x2001, 0x180f, 0x2004, -+ 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, -+ 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707e, 0x7010, 0x78ea, 0x7082, -+ 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, -+ 0x2887, 0x00f6, 0x2100, 0x900e, 0x080c, 0x283e, 0x795e, 0x00fe, -+ 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, -+ 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, -+ 0x780e, 0x00fe, 0x080c, 0x2887, 0x00f6, 0x2079, 0x1800, 0x7982, -+ 0x2100, 0x900e, 0x080c, 0x283e, 0x795e, 0x00fe, 0x8108, 0x080c, -+ 0x659e, 0x2b00, 0x00ce, 0x1904, 0xb97a, 0x6012, 0x2009, 0x180f, -+ 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, -+ 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, 0x2001, 0x0002, 0x080c, -+ 0x654f, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, -+ 0x9138, 0x080c, 0x968d, 0x0018, 0x2001, 0x0001, 0x0431, 0x00de, -+ 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0a4, 0x0120, -+ 0x2001, 0x1848, 0x2004, 0xd0ac, 0x0005, 0x00e6, 0x080c, 0xe970, -+ 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, 0x00ff, 0x1118, -+ 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0, 0x9084, 0xff80, -+ 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, 0x9005, 0x0158, -+ 0x2001, 0x0007, 0x080c, 0x654f, 0x080c, 0x56e3, 0x1120, 0x2001, -+ 0x0007, 0x080c, 0x657b, 0x2600, 0x9005, 0x11b0, 0x6014, 0x0096, -+ 0x2048, 0xa868, 0x009e, 0xd0fc, 0x1178, 0x0036, 0x0046, 0x6010, -+ 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, 0x2011, 0x8014, -+ 0x080c, 0x4b04, 0x004e, 0x003e, 0x080c, 0x31e8, 0x6020, 0x9086, -+ 0x000a, 0x1108, 0x0005, 0x0804, 0xae61, 0x00b6, 0x00e6, 0x0026, -+ 0x0016, 0x2071, 0x1800, 0x7090, 0x9086, 0x0014, 0x1904, 0xbb05, -+ 0x080c, 0x56e3, 0x1170, 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, -+ 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4cbb, 0x004e, -+ 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, 0x669a, 0x080c, 0xb934, -+ 0x00de, 0x080c, 0xbd59, 0x1588, 0x6010, 0x2058, 0xb890, 0x9005, -+ 0x0560, 0x2001, 0x0006, 0x080c, 0x654f, 0x0096, 0x6014, 0x904d, -+ 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, -+ 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xd10f, 0x0060, 0xa864, -+ 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0xa807, 0x0000, 0xa867, -+ 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, 0x31e8, 0x6020, 0x9086, -+ 0x000a, 0x0140, 0x080c, 0xae61, 0x0028, 0x080c, 0xb813, 0x9006, -+ 0x080c, 0xba7d, 0x001e, 0x002e, 0x00ee, 0x00be, 0x0005, 0x2011, -+ 0x1824, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001, 0x0002, 0x080c, -+ 0x654f, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x9138, 0x0804, -+ 0x968d, 0x2001, 0x0001, 0x0804, 0xba7d, 0x2030, 0x2011, 0x1824, -+ 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, 0x1120, 0x2001, -+ 0x0007, 0x080c, 0x654f, 0x0804, 0xae61, 0x2001, 0x0001, 0x0804, -+ 0xba7d, 0x0002, 0xb8fc, 0xbb51, 0xb8fc, 0xbb92, 0xb8fc, 0xbc3f, -+ 0xbb46, 0xb8fc, 0xb8fc, 0xbc53, 0xb8fc, 0xbc65, 0x6604, 0x9686, -+ 0x0003, 0x0904, 0xbaad, 0x96b6, 0x001e, 0x1110, 0x080c, 0xae61, -+ 0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xbc77, 0x11a0, 0x9006, -+ 0x080c, 0x653b, 0x080c, 0x31bf, 0x080c, 0xd245, 0x2001, 0x0002, -+ 0x080c, 0x654f, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x9138, -+ 0x080c, 0x968d, 0x0418, 0x2009, 0x026e, 0x2104, 0x9086, 0x0009, -+ 0x1160, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0170, -+ 0x8001, 0xb842, 0x601b, 0x000a, 0x0088, 0x2009, 0x026f, 0x2104, -+ 0x9084, 0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, 0x080c, 0x31bf, -+ 0x080c, 0xd245, 0x2001, 0x0001, 0x080c, 0xba7d, 0x00ce, 0x00de, -+ 0x00be, 0x0005, 0x0096, 0x00b6, 0x0026, 0x9016, 0x080c, 0xbc85, -+ 0x00d6, 0x2069, 0x197c, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, -+ 0xb8a0, 0x9086, 0x007e, 0x1138, 0x2069, 0x1820, 0x2d04, 0x8000, -+ 0x206a, 0x00de, 0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x653b, -+ 0x2001, 0x0002, 0x080c, 0x654f, 0x6003, 0x0001, 0x6007, 0x0002, -+ 0x080c, 0x9138, 0x080c, 0x968d, 0x0804, 0xbc0f, 0x080c, 0xcb35, -+ 0x01b0, 0x6014, 0x2048, 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, -+ 0x6007, 0x0016, 0x2001, 0x0002, 0x080c, 0xd169, 0x00b0, 0x6014, -+ 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, -+ 0x180e, 0x2004, 0xd0dc, 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, -+ 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38, 0x080c, 0xb813, 0x2009, -+ 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, 0x0005, 0x0520, 0x9686, -+ 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, 0x9084, 0xff00, 0x1118, -+ 0x9686, 0x0009, 0x01c0, 0x9086, 0x1900, 0x1168, 0x9686, 0x0009, -+ 0x0190, 0x2001, 0x0004, 0x080c, 0x654f, 0x2001, 0x0028, 0x601a, -+ 0x6007, 0x0052, 0x0020, 0x2001, 0x0001, 0x080c, 0xba7d, 0x002e, -+ 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, 0x6014, 0x2048, -+ 0x080c, 0xcb35, 0x0140, 0xa864, 0x9086, 0x0139, 0x0118, 0xa868, -+ 0xd0fc, 0x0108, 0x0c40, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, -+ 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, 0x6007, 0x0016, -+ 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, 0x2071, 0x1800, -+ 0x080c, 0x5fad, 0x00ee, 0x0010, 0x080c, 0x31bf, 0x0860, 0x080c, -+ 0xbc85, 0x1160, 0x2001, 0x0004, 0x080c, 0x654f, 0x6003, 0x0001, -+ 0x6007, 0x0003, 0x080c, 0x9138, 0x0804, 0x968d, 0x080c, 0xb813, -+ 0x9006, 0x0804, 0xba7d, 0x0489, 0x1160, 0x2001, 0x0008, 0x080c, -+ 0x654f, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, 0x9138, 0x0804, -+ 0x968d, 0x2001, 0x0001, 0x0804, 0xba7d, 0x00f9, 0x1160, 0x2001, -+ 0x000a, 0x080c, 0x654f, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, -+ 0x9138, 0x0804, 0x968d, 0x2001, 0x0001, 0x0804, 0xba7d, 0x2009, -+ 0x026e, 0x2104, 0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, -+ 0x9084, 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, -+ 0x00b6, 0x00c6, 0x0016, 0x6110, 0x2158, 0x080c, 0x660e, 0x001e, -+ 0x00ce, 0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, -+ 0x0016, 0x6010, 0x2058, 0x2009, 0x1837, 0x2104, 0x9085, 0x0003, -+ 0x200a, 0x080c, 0xbd2b, 0x0560, 0x2009, 0x1837, 0x2104, 0xc0cd, -+ 0x200a, 0x080c, 0x696e, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, -+ 0x080c, 0xe5ae, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, -+ 0x002a, 0x2009, 0x0001, 0x080c, 0x318a, 0x00e6, 0x2071, 0x1800, -+ 0x080c, 0x2f96, 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, -+ 0x007f, 0x080c, 0x32bb, 0x8108, 0x1f04, 0xbcc9, 0x015e, 0x00ce, -+ 0x080c, 0xbc88, 0x2071, 0x0260, 0x2079, 0x0200, 0x7817, 0x0001, -+ 0x2001, 0x1837, 0x200c, 0xc1c5, 0x7018, 0xd0fc, 0x0110, 0xd0dc, -+ 0x0118, 0x7038, 0xd0dc, 0x1108, 0xc1c4, 0x7817, 0x0000, 0x2001, -+ 0x1837, 0x2102, 0x2079, 0x0100, 0x2e04, 0x9084, 0x00ff, 0x2069, -+ 0x181f, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0x1820, -+ 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, -+ 0x9105, 0x2009, 0x182c, 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, -+ 0x080c, 0x2887, 0x080c, 0x73bc, 0x0170, 0x2071, 0x0260, 0x2069, -+ 0x1982, 0x7048, 0x206a, 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, -+ 0x680e, 0x080c, 0xcf44, 0x0040, 0x2001, 0x0006, 0x080c, 0x654f, -+ 0x080c, 0x31e8, 0x080c, 0xae61, 0x001e, 0x003e, 0x00de, 0x00ee, -+ 0x00fe, 0x00be, 0x0005, 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, -+ 0x2019, 0x182c, 0x231c, 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, -+ 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, -+ 0x2011, 0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, -+ 0xbe1d, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, -+ 0x080c, 0xbe1d, 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, 0x19f0, 0x252c, 0x2021, 0x19f6, 0x2424, -+ 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7254, 0x7074, 0x9202, 0x1a04, -+ 0xbde9, 0x080c, 0x8981, 0x0904, 0xbde2, 0x080c, 0xe5df, 0x0904, -+ 0xbde2, 0x6720, 0x9786, 0x0007, 0x0904, 0xbde2, 0x2500, 0x9c06, -+ 0x0904, 0xbde2, 0x2400, 0x9c06, 0x05e8, 0x3e08, 0x9186, 0x0002, -+ 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0bc, 0x1580, 0x00c6, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, -+ 0x1a5e, 0x9786, 0x000a, 0x0148, 0x080c, 0xcd3b, 0x1130, 0x00ce, -+ 0x080c, 0xb813, 0x080c, 0xae92, 0x00e8, 0x6014, 0x2048, 0x080c, -+ 0xcb35, 0x01a8, 0x9786, 0x0003, 0x1530, 0xa867, 0x0103, 0xa87c, -+ 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fb1, 0x009e, -+ 0xab7a, 0xa877, 0x0000, 0x080c, 0x6c75, 0x080c, 0xcd1e, 0x080c, -+ 0xae92, 0x00ce, 0x9ce0, 0x0018, 0x7068, 0x9c02, 0x1210, 0x0804, -+ 0xbd8c, 0x012e, 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, -+ 0x009e, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xe551, -+ 0x0c30, 0x9786, 0x0009, 0x1148, 0x6000, 0x9086, 0x0004, 0x0d08, -+ 0x2009, 0x004c, 0x080c, 0xaedc, 0x08e0, 0x9786, 0x000a, 0x0938, -+ 0x0820, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, -+ 0xbe09, 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, 0x220c, -+ 0x810f, 0x2304, 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xbe47, -+ 0x9006, 0x0005, 0x918d, 0x0001, 0x0005, 0x6004, 0x908a, 0x0053, -+ 0x1a0c, 0x0dd5, 0x080c, 0xcd2a, 0x0120, 0x080c, 0xcd3b, 0x0168, -+ 0x0028, 0x080c, 0x31e8, 0x080c, 0xcd3b, 0x0138, 0x080c, 0x9588, -+ 0x080c, 0xae61, 0x080c, 0x968d, 0x0005, 0x080c, 0xb813, 0x0cb0, -+ 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, -+ 0xbe8c, 0xbe8c, 0xbe8c, 0xbe8c, 0xbe8c, 0xbe8c, 0xbe8c, 0xbe8c, -+ 0xbe8c, 0xbe8c, 0xbe8c, 0xbe8e, 0xbe8e, 0xbe8e, 0xbe8e, 0xbe8c, -+ 0xbe8c, 0xbe8c, 0xbe8e, 0xbe8c, 0x080c, 0x0dd5, 0x600b, 0xffff, -+ 0x6003, 0x0001, 0x6106, 0x080c, 0x90f0, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x968d, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, -+ 0x9082, 0x0040, 0x0804, 0xbf43, 0x9186, 0x0027, 0x1520, 0x080c, -+ 0x9588, 0x080c, 0x31bf, 0x080c, 0xd245, 0x0096, 0x6114, 0x2148, -+ 0x080c, 0xcb35, 0x0198, 0x080c, 0xcd3b, 0x1118, 0x080c, 0xb813, -+ 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, -+ 0xc1c5, 0xa97e, 0x080c, 0x6c81, 0x080c, 0xcd1e, 0x009e, 0x080c, -+ 0xae61, 0x0804, 0x968d, 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, -+ 0x0040, 0x04a0, 0x9186, 0x0046, 0x0150, 0x9186, 0x0045, 0x0138, -+ 0x9186, 0x0053, 0x0120, 0x9186, 0x0048, 0x190c, 0x0dd5, 0x2001, -+ 0x0109, 0x2004, 0xd084, 0x0508, 0x0126, 0x2091, 0x2800, 0x0006, -+ 0x0016, 0x0026, 0x0036, 0x00f6, 0x00e6, 0x00c6, 0x2079, 0x19e7, -+ 0x2071, 0x1800, 0x2061, 0x0100, 0x080c, 0x8fd5, 0x00ce, 0x00ee, -+ 0x00fe, 0x003e, 0x002e, 0x001e, 0x000e, 0x012e, 0xa001, 0x6000, -+ 0x9086, 0x0002, 0x1110, 0x0804, 0xbf81, 0x0005, 0x0002, 0xbf1d, -+ 0xbf1b, 0xbf1b, 0xbf1b, 0xbf1b, 0xbf1b, 0xbf1b, 0xbf1b, 0xbf1b, -+ 0xbf1b, 0xbf1b, 0xbf38, 0xbf38, 0xbf38, 0xbf38, 0xbf1b, 0xbf38, -+ 0xbf1b, 0xbf38, 0xbf1b, 0x080c, 0x0dd5, 0x080c, 0x9588, 0x0096, -+ 0x6114, 0x2148, 0x080c, 0xcb35, 0x0168, 0xa867, 0x0103, 0xa87b, -+ 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, 0x6c81, -+ 0x080c, 0xcd1e, 0x009e, 0x080c, 0xae61, 0x080c, 0x968d, 0x0005, -+ 0x080c, 0x9588, 0x080c, 0xcd3b, 0x090c, 0xb813, 0x080c, 0xae61, -+ 0x080c, 0x968d, 0x0005, 0x0002, 0xbf5a, 0xbf58, 0xbf58, 0xbf58, -+ 0xbf58, 0xbf58, 0xbf58, 0xbf58, 0xbf58, 0xbf58, 0xbf58, 0xbf71, -+ 0xbf71, 0xbf71, 0xbf71, 0xbf58, 0xbf7b, 0xbf58, 0xbf71, 0xbf58, -+ 0x080c, 0x0dd5, 0x0096, 0x080c, 0x9588, 0x6014, 0x2048, 0x2001, -+ 0x1988, 0x2004, 0x6042, 0xa97c, 0xd1ac, 0x0140, 0x6003, 0x0004, -+ 0xa87c, 0x9085, 0x0400, 0xa87e, 0x009e, 0x0005, 0x6003, 0x0002, -+ 0x0cb8, 0x080c, 0x9588, 0x080c, 0xd248, 0x080c, 0xd24d, 0x6003, -+ 0x000f, 0x0804, 0x968d, 0x080c, 0x9588, 0x080c, 0xae61, 0x0804, -+ 0x968d, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, -+ 0x0005, 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9f, 0xc07c, -+ 0xbf9d, 0xc0b0, 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9d, -+ 0xbf9d, 0xbf9d, 0xbf9d, 0xbf9d, 0xc0b0, 0x080c, 0x0dd5, 0x00b6, -+ 0x0096, 0x6114, 0x2148, 0x7644, 0x96b4, 0x0fff, 0x86ff, 0x1528, -+ 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xc06b, 0xa87b, 0x0000, -+ 0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, -+ 0x9115, 0x190c, 0xc245, 0x080c, 0x6a9d, 0x6210, 0x2258, 0xba3c, -+ 0x82ff, 0x0110, 0x8211, 0xba3e, 0x7044, 0xd0e4, 0x1904, 0xc04f, -+ 0x080c, 0xae61, 0x009e, 0x00be, 0x0005, 0x968c, 0x0c00, 0x0150, -+ 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xc053, 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, -+ 0xbfa6, 0x735c, 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, -+ 0x2019, 0x0008, 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, -+ 0x080c, 0xc730, 0x003e, 0xd6cc, 0x0904, 0xbfbb, 0x7154, 0xa98a, -+ 0x81ff, 0x0904, 0xbfbb, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, -+ 0x0018, 0x2011, 0x0029, 0x080c, 0xc730, 0x2011, 0x0205, 0x2013, -+ 0x0000, 0x080c, 0xd1d5, 0x0804, 0xbfbb, 0xa868, 0xd0fc, 0x0120, -+ 0x2009, 0x0020, 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xc6cf, -+ 0x00ae, 0x080c, 0xd1d5, 0x080c, 0xc720, 0x0804, 0xbfbd, 0x080c, -+ 0xce2e, 0x0804, 0xbfca, 0xa87c, 0xd0ac, 0x0904, 0xbfd6, 0xa880, -+ 0xd0bc, 0x1904, 0xbfd6, 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, -+ 0xa834, 0x931e, 0x0904, 0xbfd6, 0xd6d4, 0x0190, 0xab38, 0x9305, -+ 0x0904, 0xbfd6, 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xbfae, 0xa838, -+ 0xa934, 0x9105, 0x0904, 0xbfae, 0xa880, 0xd0bc, 0x1904, 0xbfae, -+ 0x080c, 0xce68, 0x0804, 0xbfca, 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, 0x1bad, 0x080c, 0x9155, 0x080c, 0x97b9, 0x009e, 0x0005, -+ 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, -+ 0x0005, 0xc0cd, 0xc0cd, 0xc0cd, 0xc0cd, 0xc0cd, 0xc0cf, 0xc165, -+ 0xc0cd, 0xc0cd, 0xc17c, 0xc208, 0xc0cd, 0xc0cd, 0xc0cd, 0xc0cd, -+ 0xc21d, 0xc0cd, 0xc0cd, 0xc0cd, 0xc0cd, 0x080c, 0x0dd5, 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, 0xc160, 0x9694, 0xff00, 0x9284, 0x0c00, 0x0120, 0x7048, -+ 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, 0xc160, 0x080c, -+ 0x0fff, 0x090c, 0x0dd5, 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, 0xc730, -+ 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, -+ 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, -+ 0xc730, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, -+ 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xc6cf, -+ 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, 0x1bad, 0x0804, 0xa240, 0x6003, 0x0002, 0x6004, 0x9086, -+ 0x0040, 0x11c8, 0x0096, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0160, -+ 0x601c, 0xd084, 0x1130, 0x00f6, 0x2c00, 0x2078, 0x080c, 0x1725, -+ 0x00fe, 0x6003, 0x0004, 0x0010, 0x6003, 0x0002, 0x009e, 0x080c, -+ 0x9588, 0x080c, 0x968d, 0x0096, 0x2001, 0x1988, 0x2004, 0x6042, -+ 0x080c, 0x963d, 0x080c, 0x97b9, 0x6114, 0x2148, 0xa97c, 0xd1e4, -+ 0x0904, 0xc203, 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, 0x0fb1, 0x001e, 0x0440, 0x0016, -+ 0x080c, 0x0fb1, 0x009e, 0xa974, 0x0016, 0x080c, 0xc720, 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, 0x6a9d, 0x001e, 0xd1e4, -+ 0x1120, 0x080c, 0xae61, 0x009e, 0x0005, 0x080c, 0xce2e, 0x0cd8, -+ 0x6004, 0x9086, 0x0040, 0x1120, 0x080c, 0x9588, 0x080c, 0x968d, -+ 0x2019, 0x0001, 0x080c, 0xa5b6, 0x6003, 0x0002, 0x080c, 0xd24d, -+ 0x080c, 0x963d, 0x080c, 0x97b9, 0x0005, 0x6004, 0x9086, 0x0040, -+ 0x1120, 0x080c, 0x9588, 0x080c, 0x968d, 0x2019, 0x0001, 0x080c, -+ 0xa5b6, 0x080c, 0x963d, 0x080c, 0x31bf, 0x080c, 0xd245, 0x0096, -+ 0x6114, 0x2148, 0x080c, 0xcb35, 0x0150, 0xa867, 0x0103, 0xa87b, -+ 0x0029, 0xa877, 0x0000, 0x080c, 0x6c81, 0x080c, 0xcd1e, 0x009e, -+ 0x080c, 0xae61, 0x080c, 0x97b9, 0x0005, 0xa87b, 0x0015, 0xd1fc, -+ 0x0180, 0xa87b, 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, -+ 0x0006, 0x0016, 0x2009, 0x1a7a, 0x2104, 0x8000, 0x200a, 0x001e, -+ 0x000e, 0xa992, 0xa88e, 0x0005, 0x9182, 0x0054, 0x1220, 0x9182, -+ 0x0040, 0x0208, 0x000a, 0x0005, 0xc278, 0xc278, 0xc278, 0xc278, -+ 0xc278, 0xc27a, 0xc278, 0xc278, 0xc320, 0xc278, 0xc278, 0xc278, -+ 0xc278, 0xc278, 0xc278, 0xc278, 0xc278, 0xc278, 0xc278, 0xc451, -+ 0x080c, 0x0dd5, 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, 0xc319, 0x9694, 0xff00, 0x9284, -+ 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, -+ 0x0904, 0xc319, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, -+ 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x0fff, 0x090c, 0x0dd5, 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, -+ 0xc730, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, -+ 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, -+ 0x080c, 0xc730, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, -+ 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, -+ 0xc6cf, 0x080c, 0x1a3c, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, -+ 0x2001, 0x1988, 0x2004, 0x6042, 0x0096, 0x6114, 0x2148, 0xa83c, -+ 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, -+ 0xa97c, 0xd1e4, 0x0904, 0xc44c, 0x6043, 0x0000, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xc41b, -+ 0xa978, 0xa868, 0xd0fc, 0x0904, 0xc3dc, 0x0016, 0xa87c, 0x0006, -+ 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, -+ 0x0002, 0x0904, 0xc3aa, 0x9086, 0x0028, 0x1904, 0xc396, 0xa87b, -+ 0x001c, 0xb07b, 0x001c, 0x0804, 0xc3b2, 0x6024, 0xd0f4, 0x11d0, -+ 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, -+ 0xa88c, 0xaa34, 0x9206, 0x0988, 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, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, 0x2048, 0x080c, -+ 0x0fb1, 0x009e, 0x080c, 0xce68, 0x0804, 0xc44c, 0xd1dc, 0x0158, -+ 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xd0f8, 0x0118, 0xb174, -+ 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, -+ 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, -+ 0x190c, 0xc245, 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, 0xd1d5, 0x001e, 0xa874, 0x0006, 0x2148, 0x080c, -+ 0x0fb1, 0x001e, 0x0804, 0xc448, 0x0016, 0x00a6, 0x2150, 0xb174, -+ 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, 0x0028, 0x1128, -+ 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, 0x0158, 0xa87b, -+ 0x0015, 0xb07b, 0x0015, 0x080c, 0xd0f8, 0x0118, 0xb174, 0xc1dc, -+ 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, 0xb07b, 0x0007, -+ 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, -+ 0xc245, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, 0xb07e, 0x00ae, -+ 0x080c, 0x0fb1, 0x009e, 0x080c, 0xd1d5, 0xa974, 0x0016, 0x080c, -+ 0xc720, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, 0x9184, 0x00ff, -+ 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, 0xa87b, 0x001c, -+ 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, 0xd0f8, 0x0118, -+ 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, 0xa87b, 0x0007, -+ 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, -+ 0x9115, 0x190c, 0xc245, 0xa974, 0x0016, 0x080c, 0x6a9d, 0x001e, -+ 0xd1e4, 0x1120, 0x080c, 0xae61, 0x009e, 0x0005, 0x080c, 0xce2e, -+ 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0xd1e4, 0x190c, 0x1a4a, -+ 0x009e, 0x0005, 0x080c, 0x9588, 0x0010, 0x080c, 0x963d, 0x080c, -+ 0xcb35, 0x01f0, 0x0096, 0x6114, 0x2148, 0x080c, 0xcd3b, 0x1118, -+ 0x080c, 0xb813, 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, -+ 0xd18c, 0x11b8, 0xd184, 0x1190, 0x6108, 0xa97a, 0x918e, 0x0029, -+ 0x1110, 0x080c, 0xe908, 0xa877, 0x0000, 0x080c, 0x6c81, 0x009e, -+ 0x080c, 0xae61, 0x080c, 0x968d, 0x0804, 0x97b9, 0xa87b, 0x0004, -+ 0x0c90, 0xa87b, 0x0004, 0x0c78, 0x9182, 0x0054, 0x1220, 0x9182, -+ 0x0040, 0x0208, 0x000a, 0x0005, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, -+ 0xc4a8, 0xc4aa, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, -+ 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, 0xc4a8, -+ 0x080c, 0x0dd5, 0x080c, 0x56d7, 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, 0x6c81, 0x009e, 0x0804, 0xae61, 0x9182, 0x0085, -+ 0x0002, 0xc4e0, 0xc4de, 0xc4de, 0xc4ec, 0xc4de, 0xc4de, 0xc4de, -+ 0xc4de, 0xc4de, 0xc4de, 0xc4de, 0xc4de, 0xc4de, 0x080c, 0x0dd5, -+ 0x6003, 0x0001, 0x6106, 0x080c, 0x90f0, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x968d, 0x012e, 0x0005, 0x0026, 0x0056, 0x00d6, 0x00e6, -+ 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, 0x080c, 0xcb23, 0x01a0, -+ 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, 0x6010, 0x6d10, 0x952e, -+ 0x1158, 0x00c6, 0x2d60, 0x080c, 0xc75b, 0x00ce, 0x0128, 0x6803, -+ 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, 0x0087, 0x6003, 0x0001, -+ 0x080c, 0x90f0, 0x080c, 0x968d, 0x9280, 0x0004, 0x00b6, 0x2058, -+ 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, 0xd0ec, 0x0128, 0x00c6, -+ 0x2260, 0x080c, 0xce68, 0x00ce, 0x00ee, 0x00de, 0x005e, 0x002e, -+ 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, -+ 0x0dd5, 0x908a, 0x0092, 0x1a0c, 0x0dd5, 0x9082, 0x0085, 0x00e2, -+ 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, 0x190c, 0x0dd5, 0x080c, -+ 0x9588, 0x0096, 0x6014, 0x2048, 0x080c, 0xcb35, 0x0140, 0xa867, -+ 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, 0x6c81, 0x009e, -+ 0x080c, 0xae92, 0x0804, 0x968d, 0xc561, 0xc563, 0xc563, 0xc561, -+ 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, 0xc561, -+ 0xc561, 0x080c, 0x0dd5, 0x080c, 0x9588, 0x080c, 0xae92, 0x080c, -+ 0x968d, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, -+ 0x2008, 0x04b8, 0x9186, 0x0027, 0x11f8, 0x080c, 0x9588, 0x080c, -+ 0x31bf, 0x080c, 0xd245, 0x0096, 0x6014, 0x2048, 0x080c, 0xcb35, -+ 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, -+ 0x6c81, 0x080c, 0xcd1e, 0x009e, 0x080c, 0xae61, 0x080c, 0x968d, -+ 0x0005, 0x080c, 0xaef7, 0x0ce0, 0x9186, 0x0014, 0x1dd0, 0x080c, -+ 0x9588, 0x0096, 0x6014, 0x2048, 0x080c, 0xcb35, 0x0d60, 0xa867, -+ 0x0103, 0xa877, 0x0000, 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, -+ 0x08f0, 0x0002, 0xc5b9, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, -+ 0xc5d1, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0xc5b7, 0x080c, -+ 0x0dd5, 0x080c, 0x9588, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, -+ 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, -+ 0x2001, 0x1987, 0x2004, 0x601a, 0x6003, 0x000c, 0x080c, 0x968d, -+ 0x0005, 0x080c, 0x9588, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, -+ 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, -+ 0x2001, 0x1987, 0x2004, 0x601a, 0x6003, 0x000e, 0x080c, 0x968d, -+ 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, -+ 0x0804, 0xaef7, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc601, 0xc64e, -+ 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0xc5ff, 0x080c, -+ 0x0dd5, 0x0096, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, -+ 0x0168, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, -+ 0x9186, 0x0035, 0x1118, 0x009e, 0x0804, 0xc662, 0x080c, 0xcb35, -+ 0x1118, 0x080c, 0xcd1e, 0x0068, 0x6014, 0x2048, 0xa87c, 0xd0e4, -+ 0x1110, 0x080c, 0xcd1e, 0xa867, 0x0103, 0x080c, 0xd210, 0x080c, -+ 0x6c81, 0x00d6, 0x2c68, 0x080c, 0xae0b, 0x01d0, 0x6003, 0x0001, -+ 0x6007, 0x001e, 0x600b, 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, -+ 0x2009, 0x026f, 0x210c, 0x613e, 0x6910, 0x6112, 0x080c, 0xcfaa, -+ 0x6954, 0x6156, 0x6023, 0x0001, 0x080c, 0x90f0, 0x080c, 0x968d, -+ 0x2d60, 0x00de, 0x080c, 0xae61, 0x009e, 0x0005, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00, -+ 0x810f, 0x9186, 0x0035, 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, -+ 0x0039, 0x1538, 0x00d6, 0x2c68, 0x080c, 0xd1a8, 0x11f0, 0x080c, -+ 0xae0b, 0x01d8, 0x6106, 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, -+ 0x6112, 0x692c, 0x612e, 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, -+ 0x6136, 0x6938, 0x613a, 0x693c, 0x613e, 0x6954, 0x6156, 0x080c, -+ 0xcfaa, 0x080c, 0x90f0, 0x080c, 0x968d, 0x2d60, 0x00de, 0x0804, -+ 0xae61, 0x0096, 0x6014, 0x2048, 0x080c, 0xcb35, 0x01c8, 0xa867, -+ 0x0103, 0xa880, 0xd0b4, 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, -+ 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, -+ 0x080c, 0xce2a, 0xa877, 0x0000, 0x080c, 0x6c81, 0x080c, 0xcd1e, -+ 0x009e, 0x0804, 0xae61, 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, -+ 0xcb35, 0x0140, 0xa867, 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, -+ 0x080c, 0x6c81, 0x009e, 0x001e, 0x9186, 0x0013, 0x0148, 0x9186, -+ 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xaef7, 0x0030, -+ 0x080c, 0x9588, 0x080c, 0xae92, 0x080c, 0x968d, 0x0005, 0x0056, -+ 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, 0x0101, 0x1208, -+ 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, 0x0018, 0x2009, -+ 0x0020, 0x2011, 0x0029, 0x080c, 0xc730, 0x96b2, 0x0020, 0xb004, -+ 0x904d, 0x0110, 0x080c, 0x0fb1, 0x080c, 0x0fff, 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, 0x6c81, 0x2a48, 0x0cb8, 0x080c, 0x6c81, 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, 0xc796, 0xc796, 0xc791, -+ 0xc7b8, 0xc784, 0xc791, 0xc7b8, 0xc791, 0xc784, 0x8ed9, 0xc791, -+ 0xc791, 0xc791, 0xc784, 0xc784, 0x080c, 0x0dd5, 0x0036, 0x2019, -+ 0x0010, 0x080c, 0xe134, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, -+ 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, 0x86ff, -+ 0x11d8, 0x6014, 0x2048, 0x080c, 0xcb35, 0x01c0, 0xa864, 0x9086, -+ 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, 0x0000, 0x0028, 0x900e, -+ 0x2001, 0x0005, 0x080c, 0x6ec0, 0x080c, 0xce2a, 0x080c, 0x6c75, -+ 0x080c, 0xae92, 0x9085, 0x0001, 0x009e, 0x0005, 0x9006, 0x0ce0, -+ 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0002, 0xc7ce, 0xc7fc, -+ 0xc7d0, 0xc81d, 0xc7f7, 0xc7ce, 0xc791, 0xc796, 0xc796, 0xc791, -+ 0xc791, 0xc791, 0xc791, 0xc791, 0xc791, 0xc791, 0x080c, 0x0dd5, -+ 0x86ff, 0x1510, 0x6020, 0x9086, 0x0006, 0x01f0, 0x0096, 0x6014, -+ 0x2048, 0x080c, 0xcb35, 0x0158, 0xa87c, 0xd0cc, 0x0130, 0x0096, -+ 0xa878, 0x2048, 0x080c, 0x0fb1, 0x009e, 0x080c, 0xce2a, 0x009e, -+ 0x080c, 0xd1ea, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, -+ 0x080c, 0x90f0, 0x080c, 0x968d, 0x9085, 0x0001, 0x0005, 0x0066, -+ 0x080c, 0x1a5e, 0x006e, 0x08a0, 0x00e6, 0x2071, 0x19e7, 0x7024, -+ 0x9c06, 0x1120, 0x080c, 0xa540, 0x00ee, 0x0850, 0x6020, 0x9084, -+ 0x000f, 0x9086, 0x0006, 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, -+ 0x2c40, 0x080c, 0xa69c, 0x009e, 0x008e, 0x0010, 0x080c, 0xa43d, -+ 0x00ee, 0x1904, 0xc7d0, 0x0804, 0xc791, 0x0036, 0x00e6, 0x2071, -+ 0x19e7, 0x703c, 0x9c06, 0x1138, 0x901e, 0x080c, 0xa5b6, 0x00ee, -+ 0x003e, 0x0804, 0xc7d0, 0x080c, 0xa7cc, 0x00ee, 0x003e, 0x1904, -+ 0xc7d0, 0x0804, 0xc791, 0x00c6, 0x6020, 0x9084, 0x000f, 0x0013, -+ 0x00ce, 0x0005, 0xc850, 0xc919, 0xca80, 0xc85a, 0xae92, 0xc850, -+ 0xe126, 0xd252, 0xc919, 0x8eab, 0xcaff, 0xc849, 0xc849, 0xc849, -+ 0xc849, 0x080c, 0x0dd5, 0x080c, 0xcd3b, 0x1110, 0x080c, 0xb813, -+ 0x0005, 0x080c, 0x9588, 0x080c, 0x968d, 0x0804, 0xae61, 0x601b, -+ 0x0001, 0x0005, 0x080c, 0xcb35, 0x0130, 0x6014, 0x0096, 0x2048, -+ 0x2c00, 0xa896, 0x009e, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, -+ 0x0002, 0xc879, 0xc87b, 0xc89f, 0xc8b3, 0xc8d7, 0xc879, 0xc850, -+ 0xc850, 0xc850, 0xc8b3, 0xc8b3, 0xc879, 0xc879, 0xc879, 0xc879, -+ 0xc8bd, 0x080c, 0x0dd5, 0x00e6, 0x6014, 0x0096, 0x2048, 0xa880, -+ 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19e7, 0x7024, 0x9c06, 0x01a0, -+ 0x080c, 0xa43d, 0x080c, 0xd1ea, 0x6007, 0x0085, 0x6003, 0x000b, -+ 0x6023, 0x0002, 0x2001, 0x1987, 0x2004, 0x601a, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, -+ 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, 0xd1ea, -+ 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x0005, 0x0096, 0x601b, 0x0001, 0x6014, 0x2048, -+ 0xa880, 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x56d7, 0x01a8, -+ 0x6014, 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, 0x0103, 0xa87b, -+ 0x0006, 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, 0xa897, 0x4005, -+ 0xa89b, 0x0004, 0x080c, 0x6c81, 0x009e, 0x0804, 0xae61, 0x6014, -+ 0x0096, 0x904d, 0x05c8, 0xa97c, 0xd1e4, 0x05b0, 0x2001, 0x180f, -+ 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, -+ 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0030, 0x2c08, 0x080c, -+ 0x15ee, 0x2001, 0x030c, 0x2004, 0x9086, 0x0041, 0x11a0, 0x6014, -+ 0x0096, 0x904d, 0x090c, 0x0dd5, 0xa880, 0xd0f4, 0x1130, 0xc0f5, -+ 0xa882, 0x009e, 0x601b, 0x0002, 0x0070, 0x009e, 0x2001, 0x0037, -+ 0x2c08, 0x080c, 0x15ee, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, -+ 0x0048, 0x080c, 0xaedc, 0x0005, 0x009e, 0x080c, 0x1a5e, 0x0804, -+ 0xc89f, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x000b, 0x0005, -+ 0xc930, 0xc857, 0xc932, 0xc930, 0xc932, 0xc932, 0xc851, 0xc930, -+ 0xc84b, 0xc84b, 0xc930, 0xc930, 0xc930, 0xc930, 0xc930, 0xc930, -+ 0x080c, 0x0dd5, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, -+ 0x00be, 0x908a, 0x000c, 0x1a0c, 0x0dd5, 0x00b6, 0x0013, 0x00be, -+ 0x0005, 0xc94d, 0xca1a, 0xc94f, 0xc98f, 0xc94f, 0xc98f, 0xc94f, -+ 0xc95d, 0xc94d, 0xc98f, 0xc94d, 0xc97e, 0x080c, 0x0dd5, 0x6004, -+ 0x908e, 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, -+ 0x0590, 0x908e, 0x0052, 0x0904, 0xca16, 0x6004, 0x080c, 0xcd3b, -+ 0x0904, 0xca33, 0x908e, 0x0004, 0x1110, 0x080c, 0x31e8, 0x908e, -+ 0x0021, 0x0904, 0xca37, 0x908e, 0x0022, 0x0904, 0xca7b, 0x908e, -+ 0x003d, 0x0904, 0xca37, 0x908e, 0x0039, 0x0904, 0xca3b, 0x908e, -+ 0x0035, 0x0904, 0xca3b, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, -+ 0x1140, 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, -+ 0x0110, 0x080c, 0x31bf, 0x080c, 0xb813, 0x0804, 0xae92, 0x00c6, -+ 0x00d6, 0x6104, 0x9186, 0x0016, 0x0904, 0xca07, 0x9186, 0x0002, -+ 0x1904, 0xc9dc, 0x2001, 0x1837, 0x2004, 0xd08c, 0x11c8, 0x080c, -+ 0x73bc, 0x11b0, 0x080c, 0xd230, 0x0138, 0x080c, 0x73df, 0x1120, -+ 0x080c, 0x72cc, 0x0804, 0xca64, 0x2001, 0x197d, 0x2003, 0x0001, -+ 0x2001, 0x1800, 0x2003, 0x0001, 0x080c, 0x72ee, 0x0804, 0xca64, -+ 0x6010, 0x2058, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x1904, 0xca64, -+ 0xb8a0, 0x9084, 0xff80, 0x1904, 0xca64, 0xb840, 0x9084, 0x00ff, -+ 0x9005, 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, -+ 0x601b, 0x0398, 0x6043, 0x0000, 0x080c, 0xae0b, 0x0128, 0x2b00, -+ 0x6012, 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, -+ 0x0002, 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, -+ 0x2009, 0x1837, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, -+ 0x080c, 0x5fad, 0x00ee, 0x080c, 0xb813, 0x0030, 0x080c, 0xb813, -+ 0x080c, 0x31bf, 0x080c, 0xd245, 0x00e6, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x31e8, 0x012e, 0x00ee, 0x080c, 0xae92, 0x0005, 0x2001, -+ 0x0002, 0x080c, 0x654f, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, -+ 0x9138, 0x080c, 0x968d, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x31e8, -+ 0x0804, 0xc98b, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, -+ 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xc9dc, -+ 0x8001, 0xb842, 0x6003, 0x0001, 0x080c, 0x9138, 0x080c, 0x968d, -+ 0x00de, 0x00ce, 0x0898, 0x080c, 0xb813, 0x0804, 0xc98d, 0x080c, -+ 0xb84f, 0x0804, 0xc98d, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xd1a8, -+ 0x00de, 0x0118, 0x080c, 0xae61, 0x00f0, 0x6004, 0x8007, 0x6134, -+ 0x918c, 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, -+ 0x6023, 0x0002, 0x603c, 0x600a, 0x2001, 0x1987, 0x2004, 0x601a, -+ 0x602c, 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x080c, -+ 0x90f0, 0x080c, 0x968d, 0x0005, 0x00de, 0x00ce, 0x080c, 0xb813, -+ 0x080c, 0x31bf, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x31e8, -+ 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x6043, 0x0000, -+ 0x012e, 0x00ee, 0x0005, 0x080c, 0xb291, 0x1904, 0xca33, 0x0005, -+ 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0096, 0x00d6, 0x001b, -+ 0x00de, 0x009e, 0x0005, 0xca9b, 0xca9b, 0xca9b, 0xca9b, 0xca9b, -+ 0xca9b, 0xca9b, 0xca9b, 0xca9b, 0xc850, 0xca9b, 0xc857, 0xca9d, -+ 0xc857, 0xcaaa, 0xca9b, 0x080c, 0x0dd5, 0x6004, 0x9086, 0x008b, -+ 0x0148, 0x6007, 0x008b, 0x6003, 0x000d, 0x080c, 0x90f0, 0x080c, -+ 0x968d, 0x0005, 0x080c, 0xd224, 0x0118, 0x080c, 0xd237, 0x0010, -+ 0x080c, 0xd245, 0x080c, 0xcd1e, 0x080c, 0xcb35, 0x0570, 0x080c, -+ 0x31bf, 0x080c, 0xcb35, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, -+ 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, -+ 0x6c81, 0x2c68, 0x080c, 0xae0b, 0x0150, 0x6810, 0x6012, 0x080c, -+ 0xcfaa, 0x00c6, 0x2d60, 0x080c, 0xae92, 0x00ce, 0x0008, 0x2d60, -+ 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, -+ 0x080c, 0x9138, 0x080c, 0x968d, 0x00c8, 0x080c, 0xd224, 0x0138, -+ 0x6034, 0x9086, 0x4000, 0x1118, 0x080c, 0x31bf, 0x08d0, 0x6034, -+ 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, -+ 0x1118, 0x080c, 0x31bf, 0x0868, 0x080c, 0xae92, 0x0005, 0x6000, -+ 0x908a, 0x0016, 0x1a0c, 0x0dd5, 0x0002, 0xcb15, 0xcb15, 0xcb17, -+ 0xcb17, 0xcb17, 0xcb15, 0xcb15, 0xae92, 0xcb15, 0xcb15, 0xcb15, -+ 0xcb15, 0xcb15, 0xcb15, 0xcb15, 0xcb15, 0x080c, 0x0dd5, 0x080c, -+ 0xa7cc, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, 0x080c, 0x6c81, -+ 0x009e, 0x0804, 0xae61, 0x9284, 0x0007, 0x1158, 0x9282, 0x1cd0, -+ 0x0240, 0x2001, 0x181a, 0x2004, 0x9202, 0x1218, 0x9085, 0x0001, -+ 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, 0x0006, 0x6014, -+ 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, 0xf000, 0x0110, -+ 0x080c, 0x10aa, 0x000e, 0x009e, 0x0005, 0x00e6, 0x00c6, 0x0036, -+ 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1cd0, 0x2071, 0x1800, -+ 0x7354, 0x7074, 0x9302, 0x1640, 0x6020, 0x9206, 0x11f8, 0x080c, -+ 0xd230, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, 0x9086, 0x0004, -+ 0x1148, 0x080c, 0x31bf, 0x080c, 0xd245, 0x00c6, 0x080c, 0xae92, -+ 0x00ce, 0x0060, 0x080c, 0xcf24, 0x0148, 0x080c, 0xcd3b, 0x1110, -+ 0x080c, 0xb813, 0x00c6, 0x080c, 0xae61, 0x00ce, 0x9ce0, 0x0018, -+ 0x7068, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, 0x003e, 0x00ce, -+ 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, 0x1000, 0x210c, -+ 0x81ff, 0x0128, 0x2061, 0x1ab0, 0x6112, 0x080c, 0x31bf, 0x9006, -+ 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, 0x0005, 0x00c6, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0xae0b, 0x01b0, 0x6656, 0x2b00, -+ 0x6012, 0x080c, 0x56d7, 0x0118, 0x080c, 0xcc62, 0x0168, 0x080c, -+ 0xcfaa, 0x6023, 0x0003, 0x2009, 0x004b, 0x080c, 0xaedc, 0x9085, -+ 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0xbaa0, 0x080c, 0xaeaf, 0x0560, 0x6057, 0x0000, -+ 0x2b00, 0x6012, 0x080c, 0xcfaa, 0x6023, 0x0003, 0x0016, 0x080c, -+ 0x928b, 0x0076, 0x903e, 0x080c, 0x9168, 0x2c08, 0x080c, 0xe2eb, -+ 0x007e, 0x001e, 0xd184, 0x0128, 0x080c, 0xae61, 0x9085, 0x0001, -+ 0x0070, 0x080c, 0x56d7, 0x0128, 0xd18c, 0x1170, 0x080c, 0xcc62, -+ 0x0148, 0x2009, 0x004c, 0x080c, 0xaedc, 0x9085, 0x0001, 0x012e, -+ 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, 0x2009, -+ 0x004d, 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, 0x0016, -+ 0x080c, 0xae0b, 0x2c78, 0x0590, 0x7e56, 0x2b00, 0x7812, 0x7823, -+ 0x0003, 0x2021, 0x0005, 0x080c, 0xcc74, 0x9186, 0x004d, 0x0118, -+ 0x9186, 0x004e, 0x0148, 0x2001, 0x1980, 0x200c, 0xd1fc, 0x0168, -+ 0x2f60, 0x080c, 0xae61, 0x00d0, 0x2001, 0x197f, 0x200c, 0xd1fc, -+ 0x0120, 0x2f60, 0x080c, 0xae61, 0x0088, 0x2f60, 0x080c, 0x56d7, -+ 0x0138, 0xd18c, 0x1118, 0x04f1, 0x0148, 0x0010, 0x2900, 0x7816, -+ 0x001e, 0x0016, 0x080c, 0xaedc, 0x9085, 0x0001, 0x001e, 0x004e, -+ 0x00ce, 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c, 0xae0b, -+ 0x2c78, 0x0508, 0x7e56, 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, -+ 0x2021, 0x0004, 0x0489, 0x009e, 0x2001, 0x197e, 0x200c, 0xd1fc, -+ 0x0120, 0x2f60, 0x080c, 0xae61, 0x0060, 0x2f60, 0x080c, 0x56d7, -+ 0x0120, 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, -+ 0xaedc, 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, -+ 0x7816, 0x0c98, 0x00c6, 0x080c, 0x4aa4, 0x00ce, 0x1120, 0x080c, -+ 0xae61, 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, -+ 0x6016, 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x6733, 0x0158, 0x2001, 0xcc79, 0x0006, 0x900e, -+ 0x2400, 0x080c, 0x6ec0, 0x080c, 0x6c81, 0x000e, 0x0807, 0x2418, -+ 0x080c, 0x9522, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, -+ 0x2608, 0x080c, 0x92a3, 0x008e, 0x080c, 0x9168, 0x2f08, 0x2648, -+ 0x080c, 0xe2eb, 0xb93c, 0x81ff, 0x090c, 0x9374, 0x080c, 0x968d, -+ 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0xae0b, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcfaa, -+ 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0xaedc, -+ 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0xaeaf, 0x01b8, 0x660a, 0x2b08, -+ 0x6112, 0x080c, 0xcfaa, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, -+ 0x2c78, 0x080c, 0x1725, 0x00fe, 0x2009, 0x0021, 0x080c, 0xaedc, -+ 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, -+ 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0xae0b, -+ 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcfaa, 0x6023, 0x0001, -+ 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0xaedc, 0x9085, 0x0001, -+ 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0xaeaf, 0x0188, 0x2b08, 0x6112, 0x080c, -+ 0xcfaa, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, -+ 0xaedc, 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, 0x6020, 0x9086, 0x0004, -+ 0x0190, 0x6014, 0x904d, 0x080c, 0xcb35, 0x0168, 0xa864, 0x9086, -+ 0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, 0xd0fc, -+ 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, 0x0005, -+ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xaeaf, 0x0198, 0x2b08, -+ 0x6112, 0x080c, 0xcfaa, 0x6023, 0x0001, 0x2900, 0x6016, 0x080c, -+ 0x31bf, 0x2009, 0x0028, 0x080c, 0xaedc, 0x9085, 0x0001, 0x012e, -+ 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, 0x2011, -+ 0x1824, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, 0xba65, -+ 0x00be, 0x080c, 0xbc88, 0x6003, 0x0001, 0x6007, 0x0029, 0x080c, -+ 0x9138, 0x080c, 0x968d, 0x0078, 0x6014, 0x0096, 0x2048, 0xa868, -+ 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xd169, 0x080c, -+ 0xb813, 0x080c, 0xae61, 0x0005, 0x0096, 0x6014, 0x904d, 0x090c, -+ 0x0dd5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, -+ 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c81, -+ 0x012e, 0x009e, 0x080c, 0xae61, 0x0c30, 0x0096, 0x9186, 0x0016, -+ 0x1128, 0x2001, 0x0004, 0x080c, 0x654f, 0x00e8, 0x9186, 0x0015, -+ 0x1510, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x11e0, 0x6010, -+ 0x00b6, 0x2058, 0x080c, 0x669a, 0x00be, 0x080c, 0xbd59, 0x1198, -+ 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, 0x2001, -+ 0x0006, 0x080c, 0x654f, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0170, -+ 0x080c, 0xb265, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, 0x0528, -+ 0x080c, 0xb813, 0x080c, 0xae61, 0x009e, 0x0005, 0x6014, 0x6310, -+ 0x2358, 0x904d, 0x090c, 0x0dd5, 0xa87b, 0x0000, 0xa883, 0x0000, -+ 0xa897, 0x4000, 0x900e, 0x080c, 0x681f, 0x1108, 0xc185, 0xb800, -+ 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x6c81, 0x012e, 0x080c, 0xae61, 0x08f8, 0x6014, 0x904d, 0x090c, -+ 0x0dd5, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, -+ 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, 0x6c81, -+ 0x012e, 0x080c, 0xae61, 0x0840, 0xa878, 0x9086, 0x0005, 0x1108, -+ 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x6043, 0x0000, -+ 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0bc, 0x0120, 0x6020, 0x9084, 0x000f, 0x0013, 0x00ce, -+ 0x0005, 0xc850, 0xce5a, 0xce5a, 0xce5d, 0xe5fd, 0xe618, 0xe61b, -+ 0xc850, 0xc850, 0xc850, 0xc850, 0xc850, 0xc850, 0xc850, 0xc850, -+ 0x080c, 0x0dd5, 0xa001, 0xa001, 0x0005, 0x0096, 0x6014, 0x904d, -+ 0x0118, 0xa87c, 0xd0e4, 0x1110, 0x009e, 0x0010, 0x009e, 0x0005, -+ 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0550, 0x2001, -+ 0x1834, 0x2004, 0x9005, 0x1540, 0x00f6, 0x2c78, 0x080c, 0xae0b, -+ 0x0508, 0x7810, 0x6012, 0x080c, 0xcfaa, 0x7820, 0x9086, 0x0003, -+ 0x0128, 0x7808, 0x603a, 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, -+ 0x2f00, 0x603a, 0x602e, 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, -+ 0x0001, 0x7954, 0x6156, 0x080c, 0x90f0, 0x080c, 0x968d, 0x2f60, -+ 0x00fe, 0x0005, 0x2f60, 0x00fe, 0x2001, 0x1988, 0x2004, 0x6042, -+ 0x0005, 0x0016, 0x0096, 0x6814, 0x2048, 0xa87c, 0xd0e4, 0x0180, -+ 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, 0x0000, -+ 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, 0x0fb1, -+ 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, 0x9086, -+ 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, 0xc085, -+ 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, 0x6826, -+ 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, 0x9103, -+ 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, 0x6032, -+ 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x6954, 0x6156, -+ 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 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, 0x1982, 0x200c, 0x8000, 0x2014, 0x2001, 0x0032, -+ 0x080c, 0x8f68, 0x2001, 0x1986, 0x82ff, 0x1110, 0x2011, 0x0014, -+ 0x2202, 0x2001, 0x1984, 0x200c, 0x8000, 0x2014, 0x2071, 0x196c, -+ 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x8f68, 0x2001, 0x1987, -+ 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1988, 0x9288, -+ 0x000a, 0x2102, 0x2001, 0x1a91, 0x2102, 0x2001, 0x0032, 0x080c, -+ 0x15ee, 0x080c, 0x6953, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, -+ 0x0005, 0x0006, 0x0016, 0x00e6, 0x2001, 0x1986, 0x2003, 0x0028, -+ 0x2001, 0x1987, 0x2003, 0x0014, 0x2071, 0x196c, 0x701b, 0x0000, -+ 0x701f, 0x07d0, 0x2001, 0x1988, 0x2009, 0x001e, 0x2102, 0x2001, -+ 0x1a91, 0x2102, 0x2001, 0x0032, 0x080c, 0x15ee, 0x00ee, 0x001e, -+ 0x000e, 0x0005, 0x0096, 0x6058, 0x904d, 0x0110, 0x080c, 0x1031, -+ 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0xae0b, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, 0x2900, -+ 0x6016, 0x2009, 0x0033, 0x080c, 0xaedc, 0x9085, 0x0001, 0x012e, -+ 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, 0x2071, -+ 0x1800, 0x9186, 0x0015, 0x1500, 0x7090, 0x9086, 0x0018, 0x11e0, -+ 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, 0x9920, -+ 0x01d8, 0x707c, 0xaa50, 0x9206, 0x1160, 0x7080, 0xaa54, 0x9206, -+ 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, 0x080c, -+ 0x3208, 0x080c, 0xb265, 0x0020, 0x080c, 0xb813, 0x080c, 0xae61, -+ 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa54, 0x9206, 0x0d48, -+ 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xae0b, 0x0188, -+ 0x2b08, 0x6112, 0x080c, 0xcfaa, 0x6023, 0x0001, 0x2900, 0x6016, -+ 0x2009, 0x004d, 0x080c, 0xaedc, 0x9085, 0x0001, 0x012e, 0x00ce, -+ 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0x0016, -+ 0x080c, 0xae0b, 0x0180, 0x2b08, 0x6112, 0x080c, 0xcfaa, 0x6023, -+ 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0xaedc, 0x9085, 0x0001, -+ 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, 0x0026, -+ 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, 0x2071, -+ 0x1800, 0x9186, 0x0015, 0x1568, 0x7190, 0x6014, 0x2048, 0xa814, -+ 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x19a0, 0x2003, -+ 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, 0x8007, -+ 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, 0x20a0, -+ 0x2001, 0x19a0, 0x0016, 0x200c, 0x080c, 0xd81b, 0x001e, 0xa804, -+ 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, 0x0103, -+ 0x0010, 0x080c, 0xb813, 0x080c, 0xae61, 0x00fe, 0x00ee, 0x009e, -+ 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, 0x0096, -+ 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, 0x7090, -+ 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, 0x9920, -+ 0x01a8, 0x707c, 0xaa74, 0x9206, 0x1130, 0x7080, 0xaa78, 0x9206, -+ 0x1110, 0x080c, 0x31bf, 0x080c, 0xb265, 0x0020, 0x080c, 0xb813, -+ 0x080c, 0xae61, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa78, -+ 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, -+ 0x9186, 0x0015, 0x1550, 0x7090, 0x9086, 0x0004, 0x1530, 0x6014, -+ 0x2048, 0x2c78, 0x080c, 0x9920, 0x05f0, 0x707c, 0xaacc, 0x9206, -+ 0x1180, 0x7080, 0xaad0, 0x9206, 0x1160, 0x080c, 0x31bf, 0x0016, -+ 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5687, 0x001e, -+ 0x0010, 0x080c, 0x5478, 0x080c, 0xcb35, 0x0508, 0xa87b, 0x0000, -+ 0xa883, 0x0000, 0xa897, 0x4000, 0x0080, 0x080c, 0xcb35, 0x01b8, -+ 0x6014, 0x2048, 0x080c, 0x5478, 0x1d70, 0xa87b, 0x0030, 0xa883, -+ 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, 0x8000, -+ 0xa867, 0x0139, 0x080c, 0x6c81, 0x012e, 0x080c, 0xae61, 0x00fe, -+ 0x00ee, 0x009e, 0x0005, 0x7060, 0xaad0, 0x9206, 0x0930, 0x0888, -+ 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, 0x080c, 0xcb35, 0x0904, 0xd165, 0x0096, 0x6314, -+ 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, 0x00c6, -+ 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, 0x681f, -+ 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, 0xa99a, -+ 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, -+ 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, 0x0f7c, -+ 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8c8, 0x9080, -+ 0x000a, 0x2098, 0x080c, 0x0f7c, 0x00ce, 0x0090, 0xaa96, 0x3918, -+ 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, 0xa89b, -+ 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, 0xa89e, -+ 0x080c, 0x6c75, 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, 0x283e, 0x2118, 0x831f, -+ 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, 0x2011, -+ 0x8018, 0x080c, 0x4b04, 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, 0xcb23, 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, -+ 0xc245, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, 0x901e, -+ 0x0499, 0x01e0, 0x080c, 0xcb35, 0x01c8, 0x080c, 0xcd1e, 0x6037, -+ 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, 0x080c, -+ 0xcd3b, 0x1118, 0x080c, 0xb813, 0x0040, 0xa867, 0x0103, 0xa877, -+ 0x0000, 0x83ff, 0x1129, 0x080c, 0x6c81, 0x009e, 0x003e, 0x0005, -+ 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, 0x0048, -+ 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, -+ 0xce2a, 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0ec, -+ 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, 0x0005, -+ 0x0006, 0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, 0x0036, -+ 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0007, -+ 0x080c, 0x4cbb, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, 0x0005, -+ 0x2001, 0x1986, 0x2004, 0x601a, 0x0005, 0x2001, 0x1988, 0x2004, -+ 0x6042, 0x0005, 0x080c, 0xae61, 0x0804, 0x968d, 0x00b6, 0x0066, -+ 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0dd5, 0x001b, 0x006e, 0x00be, -+ 0x0005, 0xd271, 0xd978, 0xdad5, 0xd271, 0xd271, 0xd271, 0xd271, -+ 0xd271, 0xd2a8, 0xdb57, 0xd271, 0xd271, 0xd271, 0xd271, 0xd271, -+ 0xd271, 0x080c, 0x0dd5, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, -+ 0x0dd5, 0x0013, 0x006e, 0x0005, 0xd28c, 0xe0bf, 0xd28c, 0xd28c, -+ 0xd28c, 0xd28c, 0xd28c, 0xd28c, 0xe06c, 0xe113, 0xd28c, 0xe738, -+ 0xe76e, 0xe738, 0xe76e, 0xd28c, 0x080c, 0x0dd5, 0x6000, 0x9082, -+ 0x0016, 0x1a0c, 0x0dd5, 0x6000, 0x000a, 0x0005, 0xd2a6, 0xdd34, -+ 0xde24, 0xde46, 0xdf05, 0xd2a6, 0xdfe3, 0xdf8d, 0xdb63, 0xe042, -+ 0xe057, 0xd2a6, 0xd2a6, 0xd2a6, 0xd2a6, 0xd2a6, 0x080c, 0x0dd5, -+ 0x91b2, 0x0053, 0x1a0c, 0x0dd5, 0x2100, 0x91b2, 0x0040, 0x1a04, -+ 0xd6ec, 0x0002, 0xd2f2, 0xd4dd, 0xd2f2, 0xd2f2, 0xd2f2, 0xd4e6, -+ 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, -+ 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, -+ 0xd2f2, 0xd2f4, 0xd357, 0xd366, 0xd3ca, 0xd3f5, 0xd46e, 0xd4c8, -+ 0xd2f2, 0xd2f2, 0xd4e9, 0xd2f2, 0xd2f2, 0xd4fe, 0xd50b, 0xd2f2, -+ 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd58e, 0xd2f2, 0xd2f2, 0xd5a2, -+ 0xd2f2, 0xd2f2, 0xd55d, 0xd2f2, 0xd2f2, 0xd2f2, 0xd5ba, 0xd2f2, -+ 0xd2f2, 0xd2f2, 0xd637, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, 0xd2f2, -+ 0xd2f2, 0xd6b4, 0x080c, 0x0dd5, 0x080c, 0x6930, 0x1150, 0x2001, -+ 0x1837, 0x2004, 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, -+ 0x1140, 0x6007, 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, -+ 0xd4d6, 0x080c, 0x68cc, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, -+ 0x6210, 0x2258, 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0x928b, -+ 0x0076, 0x903e, 0x080c, 0x9168, 0x2c08, 0x080c, 0xe2eb, 0x007e, -+ 0x001e, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, 0x2658, -+ 0x080c, 0x660e, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1268, -+ 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x2c08, -+ 0x080c, 0xe997, 0x002e, 0x001e, 0x1178, 0x080c, 0xe21d, 0x1904, -+ 0xd3c2, 0x080c, 0xe1b9, 0x1120, 0x6007, 0x0008, 0x0804, 0xd4d6, -+ 0x6007, 0x0009, 0x0804, 0xd4d6, 0x080c, 0xe441, 0x0128, 0x080c, -+ 0xe21d, 0x0d78, 0x0804, 0xd3c2, 0x6017, 0x1900, 0x0c88, 0x080c, -+ 0x32e3, 0x1904, 0xd6e9, 0x6106, 0x080c, 0xe16e, 0x6007, 0x0006, -+ 0x0804, 0xd4d6, 0x6007, 0x0007, 0x0804, 0xd4d6, 0x080c, 0xe7aa, -+ 0x1904, 0xd6e9, 0x080c, 0x32e3, 0x1904, 0xd6e9, 0x00d6, 0x6610, -+ 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, 0x2001, -+ 0x0001, 0x080c, 0x653b, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, -+ 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, 0x9686, -+ 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, 0x0110, -+ 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, 0x0003, -+ 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, 0x9084, 0x0003, -+ 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, 0x00ee, -+ 0x080c, 0xe281, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, 0x6210, -+ 0x2258, 0xbaa0, 0x900e, 0x080c, 0x3208, 0x002e, 0x080c, 0x669a, -+ 0x6007, 0x000a, 0x00de, 0x0804, 0xd4d6, 0x6007, 0x000b, 0x00de, -+ 0x0804, 0xd4d6, 0x080c, 0x31bf, 0x080c, 0xd245, 0x6007, 0x0001, -+ 0x0804, 0xd4d6, 0x080c, 0xe7aa, 0x1904, 0xd6e9, 0x080c, 0x32e3, -+ 0x1904, 0xd6e9, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, 0x1948, -+ 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, 0x6610, -+ 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, 0x2258, -+ 0xbaa0, 0x900e, 0x080c, 0x3208, 0x002e, 0x6007, 0x000c, 0x2001, -+ 0x0001, 0x080c, 0xe977, 0x0804, 0xd4d6, 0x080c, 0x6930, 0x1140, -+ 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, 0x1110, -+ 0x0804, 0xd301, 0x080c, 0x68cc, 0x6610, 0x2658, 0xbe04, 0x9684, -+ 0x00ff, 0x9082, 0x0006, 0x06c8, 0x1138, 0x0026, 0x2001, 0x0006, -+ 0x080c, 0x657b, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, 0x9686, -+ 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xd3c2, 0x080c, 0xe28e, -+ 0x1120, 0x6007, 0x000e, 0x0804, 0xd4d6, 0x0046, 0x6410, 0x2458, -+ 0xbca0, 0x0046, 0x080c, 0x31bf, 0x080c, 0xd245, 0x004e, 0x0016, -+ 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, -+ 0x080c, 0xe5ae, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, -+ 0x004e, 0x6007, 0x0001, 0x0804, 0xd4d6, 0x2001, 0x0001, 0x080c, -+ 0x653b, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, -+ 0x1805, 0x2011, 0x0270, 0x080c, 0xbe09, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, -+ 0x0a04, 0xd3c2, 0x9682, 0x0007, 0x0a04, 0xd41e, 0x0804, 0xd3c2, -+ 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xd4d6, 0x080c, 0x6930, -+ 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, -+ 0x1110, 0x0804, 0xd301, 0x080c, 0x68cc, 0x6610, 0x2658, 0xbe04, -+ 0x9684, 0x00ff, 0x9082, 0x0006, 0x0698, 0x0150, 0x96b4, 0xff00, -+ 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xd3c2, -+ 0x080c, 0xe2bc, 0x1130, 0x080c, 0xe1b9, 0x1118, 0x6007, 0x0010, -+ 0x04e8, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x31bf, -+ 0x080c, 0xd245, 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, 0x210c, -+ 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xe5ae, 0x6010, 0x2058, -+ 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, -+ 0x080c, 0xe441, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, -+ 0x0978, 0x0804, 0xd3c2, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, -+ 0x080c, 0x32e3, 0x1904, 0xd6e9, 0x080c, 0xe7aa, 0x1904, 0xd6e9, -+ 0x080c, 0xd8b6, 0x1904, 0xd3c2, 0x6007, 0x0012, 0x6003, 0x0001, -+ 0x080c, 0x9138, 0x080c, 0x968d, 0x0005, 0x6007, 0x0001, 0x6003, -+ 0x0001, 0x080c, 0x9138, 0x080c, 0x968d, 0x0cb0, 0x6007, 0x0005, -+ 0x0c68, 0x080c, 0xe7aa, 0x1904, 0xd6e9, 0x080c, 0x32e3, 0x1904, -+ 0xd6e9, 0x080c, 0xd8b6, 0x1904, 0xd3c2, 0x6007, 0x0020, 0x6003, -+ 0x0001, 0x080c, 0x9138, 0x080c, 0x968d, 0x0005, 0x080c, 0x32e3, -+ 0x1904, 0xd6e9, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x9138, -+ 0x080c, 0x968d, 0x0005, 0x080c, 0xe7aa, 0x1904, 0xd6e9, 0x080c, -+ 0x32e3, 0x1904, 0xd6e9, 0x080c, 0xd8b6, 0x1904, 0xd3c2, 0x0016, -+ 0x0026, 0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, -+ 0x2c08, 0x080c, 0xcb23, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, -+ 0x1188, 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, -+ 0x7240, 0x2c08, 0x9006, 0x080c, 0xe578, 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, 0xae61, -+ 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x9138, 0x080c, -+ 0x968d, 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, -+ 0x653b, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, -+ 0x1805, 0x2011, 0x0276, 0x080c, 0xbe09, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xd4d6, 0x080c, 0xba7d, -+ 0x080c, 0x73bc, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x73d6, -+ 0x1138, 0x080c, 0x76a4, 0x080c, 0x601a, 0x080c, 0x72ee, 0x0010, -+ 0x080c, 0x7394, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x32e3, -+ 0x1904, 0xd6e9, 0x080c, 0xd8b6, 0x1904, 0xd3c2, 0x6106, 0x080c, -+ 0xd8d2, 0x1120, 0x6007, 0x002b, 0x0804, 0xd4d6, 0x6007, 0x002c, -+ 0x0804, 0xd4d6, 0x080c, 0xe7aa, 0x1904, 0xd6e9, 0x080c, 0x32e3, -+ 0x1904, 0xd6e9, 0x080c, 0xd8b6, 0x1904, 0xd3c2, 0x6106, 0x080c, -+ 0xd8d7, 0x1120, 0x6007, 0x002e, 0x0804, 0xd4d6, 0x6007, 0x002f, -+ 0x0804, 0xd4d6, 0x080c, 0x32e3, 0x1904, 0xd6e9, 0x00e6, 0x00d6, -+ 0x00c6, 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, -+ 0x0158, 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, -+ 0x00de, 0x00ee, 0x0804, 0xd4dd, 0x080c, 0x56d3, 0xd0e4, 0x0904, -+ 0xd634, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, -+ 0x720c, 0x080c, 0x696e, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, -+ 0x1118, 0xb814, 0x9206, 0x0510, 0x080c, 0x696a, 0x15b8, 0x2069, -+ 0x1800, 0x6880, 0x9206, 0x1590, 0x687c, 0x9106, 0x1578, 0x7210, -+ 0x080c, 0xcb23, 0x0590, 0x080c, 0xd7a1, 0x0578, 0x080c, 0xe62a, -+ 0x0560, 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, -+ 0xffff, 0x0150, 0x080c, 0xcb23, 0x01c0, 0x9280, 0x0002, 0x2004, -+ 0x7110, 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, -+ 0x080c, 0xe578, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, -+ 0x602f, 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, -+ 0x0003, 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, -+ 0x32e3, 0x1904, 0xd6e9, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, -+ 0x8007, 0x9086, 0x0006, 0x1904, 0xd4dd, 0x00e6, 0x00d6, 0x00c6, -+ 0x080c, 0x56d3, 0xd0e4, 0x0904, 0xd6ac, 0x2069, 0x1800, 0x2071, -+ 0x026c, 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, -+ 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xe578, 0x2c10, -+ 0x00ce, 0x05e8, 0x080c, 0xcb23, 0x05d0, 0x7108, 0x9280, 0x0002, -+ 0x2004, 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xc75b, -+ 0x002e, 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, -+ 0x0178, 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, -+ 0x0005, 0x2004, 0x9005, 0x0170, 0x080c, 0xd7a1, 0x0904, 0xd62d, -+ 0x0056, 0x7510, 0x7614, 0x080c, 0xe643, 0x005e, 0x00ce, 0x00de, -+ 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, -+ 0x6003, 0x0001, 0x080c, 0x90f0, 0x080c, 0x968d, 0x0c78, 0x6007, -+ 0x003b, 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x080c, -+ 0x90f0, 0x080c, 0x968d, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, -+ 0x6017, 0x0000, 0x0804, 0xd604, 0x00e6, 0x0026, 0x080c, 0x6930, -+ 0x0550, 0x080c, 0x68cc, 0x080c, 0xe81c, 0x1518, 0x2071, 0x1800, -+ 0x70dc, 0x9085, 0x0003, 0x70de, 0x00f6, 0x2079, 0x0100, 0x72b0, -+ 0x9284, 0x00ff, 0x707e, 0x78e6, 0x9284, 0xff00, 0x7280, 0x9205, -+ 0x7082, 0x78ea, 0x00fe, 0x70e7, 0x0000, 0x080c, 0x696e, 0x0120, -+ 0x2011, 0x1a00, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2f96, -+ 0x0010, 0x080c, 0xe84e, 0x002e, 0x00ee, 0x080c, 0xae61, 0x0804, -+ 0xd4dc, 0x080c, 0xae61, 0x0005, 0x2600, 0x0002, 0xd700, 0xd731, -+ 0xd742, 0xd700, 0xd700, 0xd702, 0xd753, 0xd700, 0xd700, 0xd700, -+ 0xd71f, 0xd700, 0xd700, 0xd700, 0xd75e, 0xd76b, 0xd79c, 0xd700, -+ 0x080c, 0x0dd5, 0x080c, 0xe7aa, 0x1d20, 0x080c, 0x32e3, 0x1d08, -+ 0x080c, 0xd8b6, 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, -+ 0x0001, 0x080c, 0x9138, 0x0005, 0x080c, 0x31bf, 0x080c, 0xd245, -+ 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9138, 0x0005, 0x080c, -+ 0xe7aa, 0x1938, 0x080c, 0x32e3, 0x1920, 0x080c, 0xd8b6, 0x1d60, -+ 0x703c, 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x9138, -+ 0x0005, 0x080c, 0x32e3, 0x1904, 0xd6e9, 0x2009, 0x0041, 0x080c, -+ 0xe857, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x9138, 0x080c, -+ 0x968d, 0x0005, 0x080c, 0x32e3, 0x1904, 0xd6e9, 0x2009, 0x0042, -+ 0x080c, 0xe857, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, 0x9138, -+ 0x080c, 0x968d, 0x0005, 0x080c, 0x32e3, 0x1904, 0xd6e9, 0x2009, -+ 0x0046, 0x080c, 0xe857, 0x080c, 0xae61, 0x0005, 0x080c, 0xd7be, -+ 0x0904, 0xd6e9, 0x6007, 0x004e, 0x6003, 0x0001, 0x080c, 0x9138, -+ 0x080c, 0x968d, 0x0005, 0x6007, 0x004f, 0x6017, 0x0000, 0x7134, -+ 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, 0x1160, 0x7140, -+ 0x2001, 0x19bd, 0x2004, 0x9106, 0x11b0, 0x7144, 0x2001, 0x19be, -+ 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, 0x2011, 0x0276, -+ 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x000a, 0x080c, -+ 0xbe1d, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, 0x0001, 0x080c, -+ 0x9138, 0x080c, 0x968d, 0x0005, 0x6007, 0x0050, 0x703c, 0x6016, -+ 0x0ca0, 0x0016, 0x00e6, 0x2071, 0x0260, 0x00b6, 0x00c6, 0x2260, -+ 0x6010, 0x2058, 0xb8cc, 0xd084, 0x0150, 0x7128, 0x6048, 0x9106, -+ 0x1120, 0x712c, 0x6044, 0x9106, 0x0110, 0x9006, 0x0010, 0x9085, -+ 0x0001, 0x00ce, 0x00be, 0x00ee, 0x001e, 0x0005, 0x0016, 0x0096, -+ 0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, 0x8000, 0x2071, -+ 0x1800, 0x7090, 0x908a, 0x00f9, 0x16e8, 0x20e1, 0x0000, 0x2001, -+ 0x19a0, 0x2003, 0x0000, 0x080c, 0x1018, 0x05a0, 0x2900, 0x6016, -+ 0x7090, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, 0xa833, 0x001e, -+ 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, -+ 0x2001, 0x19a0, 0x0016, 0x200c, 0x0471, 0x001e, 0x2940, 0x080c, -+ 0x1018, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, 0x0180, 0x0c18, -+ 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, 0x20a0, -+ 0x2001, 0x19a0, 0x0016, 0x200c, 0x00b1, 0x001e, 0x0000, 0x9085, -+ 0x0001, 0x0048, 0x2071, 0x1800, 0x7093, 0x0000, 0x6014, 0x2048, -+ 0x080c, 0x0fb1, 0x9006, 0x012e, 0x01de, 0x01ce, 0x00ee, 0x008e, -+ 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00c6, -+ 0x918c, 0xffff, 0x11a8, 0x080c, 0x23ab, 0x2099, 0x026c, 0x2001, -+ 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x00f8, 0x20a8, -+ 0x4003, 0x22a8, 0x8108, 0x080c, 0x23ab, 0x2099, 0x0260, 0x0ca8, -+ 0x080c, 0x23ab, 0x2061, 0x19a0, 0x6004, 0x2098, 0x6008, 0x3518, -+ 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, 0x4003, 0x22a8, -+ 0x8108, 0x080c, 0x23ab, 0x2099, 0x0260, 0x0ca8, 0x2061, 0x19a0, -+ 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, 0x23c3, -+ 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, -+ 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, 0x22a8, 0x8108, -+ 0x080c, 0x23c3, 0x20a1, 0x0240, 0x0c98, 0x080c, 0x23c3, 0x2061, -+ 0x19a3, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, -+ 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, 0x22a8, 0x8108, -+ 0x080c, 0x23c3, 0x20a1, 0x0240, 0x0c98, 0x2061, 0x19a3, 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, 0x080c, 0xd94e, 0x00de, 0x0005, 0x00d6, -+ 0x080c, 0xd95b, 0x1520, 0x680c, 0x908c, 0xff00, 0x6820, 0x9084, -+ 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, 0x0130, 0x9006, -+ 0x080c, 0xe977, 0x2009, 0x0001, 0x0078, 0xd1ec, 0x0180, 0x6920, -+ 0x918c, 0x00ff, 0x6824, 0x080c, 0x283e, 0x1148, 0x2001, 0x0001, -+ 0x080c, 0xe977, 0x2110, 0x900e, 0x080c, 0x3208, 0x0018, 0x9085, -+ 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, 0x00c6, 0x080c, -+ 0xaeaf, 0x05a8, 0x0016, 0x0026, 0x00c6, 0x2011, 0x0263, 0x2204, -+ 0x8211, 0x220c, 0x080c, 0x283e, 0x1578, 0x080c, 0x659e, 0x1560, -+ 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, 0x6012, 0x080c, -+ 0xe7aa, 0x11d8, 0x080c, 0x32e3, 0x11c0, 0x080c, 0xd8b6, 0x0510, -+ 0x2001, 0x0007, 0x080c, 0x654f, 0x2001, 0x0007, 0x080c, 0x657b, -+ 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, -+ 0x080c, 0x9138, 0x080c, 0x968d, 0x0010, 0x080c, 0xae61, 0x9085, -+ 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, 0xae61, 0x00ce, 0x002e, -+ 0x001e, 0x0ca8, 0x080c, 0xae61, 0x9006, 0x0c98, 0x2069, 0x026d, -+ 0x6800, 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, -+ 0x0008, 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, -+ 0x9084, 0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, -+ 0x0118, 0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, -+ 0x910d, 0x615a, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, -+ 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0dd5, 0x91b6, 0x0013, 0x1130, -+ 0x2008, 0x91b2, 0x0040, 0x1a04, 0xdaa5, 0x0092, 0x91b6, 0x0027, -+ 0x0120, 0x91b6, 0x0014, 0x190c, 0x0dd5, 0x2001, 0x0007, 0x080c, -+ 0x657b, 0x080c, 0x9588, 0x080c, 0xae92, 0x080c, 0x968d, 0x0005, -+ 0xd9d8, 0xd9da, 0xd9d8, 0xd9d8, 0xd9d8, 0xd9da, 0xd9e9, 0xda9e, -+ 0xda3b, 0xda9e, 0xda4f, 0xda9e, 0xd9e9, 0xda9e, 0xda96, 0xda9e, -+ 0xda96, 0xda9e, 0xda9e, 0xd9d8, 0xd9d8, 0xd9d8, 0xd9d8, 0xd9d8, -+ 0xd9d8, 0xd9d8, 0xd9d8, 0xd9d8, 0xd9d8, 0xd9d8, 0xd9da, 0xd9d8, -+ 0xda9e, 0xd9d8, 0xd9d8, 0xda9e, 0xd9d8, 0xda9b, 0xda9e, 0xd9d8, -+ 0xd9d8, 0xd9d8, 0xd9d8, 0xda9e, 0xda9e, 0xd9d8, 0xda9e, 0xda9e, -+ 0xd9d8, 0xd9e4, 0xd9d8, 0xd9d8, 0xd9d8, 0xd9d8, 0xda9a, 0xda9e, -+ 0xd9d8, 0xd9d8, 0xda9e, 0xda9e, 0xd9d8, 0xd9d8, 0xd9d8, 0xd9d8, -+ 0x080c, 0x0dd5, 0x080c, 0x9588, 0x080c, 0xd248, 0x6003, 0x0002, -+ 0x080c, 0x968d, 0x0804, 0xdaa4, 0x9006, 0x080c, 0x653b, 0x0804, -+ 0xda9e, 0x080c, 0x696a, 0x1904, 0xda9e, 0x9006, 0x080c, 0x653b, -+ 0x6010, 0x2058, 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, -+ 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0428, 0x6010, 0x2058, -+ 0xb8c0, 0x9005, 0x1178, 0x080c, 0xd230, 0x1904, 0xda9e, 0x0036, -+ 0x0046, 0xbba0, 0x2021, 0x0007, 0x080c, 0x4cbb, 0x004e, 0x003e, -+ 0x0804, 0xda9e, 0x080c, 0x3314, 0x1904, 0xda9e, 0x2001, 0x1800, -+ 0x2004, 0x9086, 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a8, -+ 0x8000, 0x78aa, 0x00fe, 0x2001, 0x0002, 0x080c, 0x654f, 0x080c, -+ 0x9588, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, -+ 0x9138, 0x080c, 0x968d, 0x6110, 0x2158, 0x2009, 0x0001, 0x080c, -+ 0x8501, 0x0804, 0xdaa4, 0x6610, 0x2658, 0xbe04, 0x96b4, 0xff00, -+ 0x8637, 0x9686, 0x0006, 0x0904, 0xda9e, 0x9686, 0x0004, 0x0904, -+ 0xda9e, 0x080c, 0x8cbb, 0x2001, 0x0004, 0x0804, 0xda9c, 0x2001, -+ 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0x6010, -+ 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4cbb, 0x004e, 0x003e, -+ 0x2001, 0x0006, 0x080c, 0xdac2, 0x6610, 0x2658, 0xbe04, 0x0066, -+ 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, 0x0168, 0x2001, -+ 0x0006, 0x080c, 0x657b, 0x9284, 0x00ff, 0x908e, 0x0007, 0x1120, -+ 0x2001, 0x0006, 0x080c, 0x654f, 0x080c, 0x696a, 0x11f8, 0x2001, -+ 0x1837, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, 0x00ff, 0x9686, -+ 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, -+ 0x00fe, 0x0804, 0xda23, 0x2001, 0x0004, 0x0030, 0x2001, 0x0006, -+ 0x0449, 0x0020, 0x0018, 0x0010, 0x080c, 0x657b, 0x080c, 0x9588, -+ 0x080c, 0xae61, 0x080c, 0x968d, 0x0005, 0x2600, 0x0002, 0xdab9, -+ 0xdab9, 0xdab9, 0xdab9, 0xdab9, 0xdabb, 0xdab9, 0xdabb, 0xdab9, -+ 0xdab9, 0xdabb, 0xdab9, 0xdab9, 0xdab9, 0xdabb, 0xdabb, 0xdabb, -+ 0xdabb, 0x080c, 0x0dd5, 0x080c, 0x9588, 0x080c, 0xae61, 0x080c, -+ 0x968d, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, 0x2158, 0xb900, -+ 0xd184, 0x0138, 0x080c, 0x654f, 0x9006, 0x080c, 0x653b, 0x080c, -+ 0x31e8, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, 0x2658, 0xb804, -+ 0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, 0x0dd5, 0x91b6, -+ 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, 0x190c, 0x0dd5, -+ 0x006b, 0x0005, 0xb8fc, 0xb8fc, 0xb8fc, 0xb8fc, 0xb8fc, 0xb8fc, -+ 0xdb41, 0xdb02, 0xb8fc, 0xb8fc, 0xb8fc, 0xb8fc, 0xb8fc, 0xb8fc, -+ 0xb8fc, 0xb8fc, 0xb8fc, 0xb8fc, 0xdb41, 0xdb48, 0xb8fc, 0xb8fc, -+ 0xb8fc, 0xb8fc, 0x00f6, 0x080c, 0x696a, 0x11d8, 0x080c, 0xd230, -+ 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb8c0, 0x9005, 0x0190, 0x9006, -+ 0x080c, 0x653b, 0x2001, 0x0002, 0x080c, 0x654f, 0x6023, 0x0001, -+ 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x9138, 0x080c, 0x968d, -+ 0x00f0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x283e, -+ 0x11b0, 0x080c, 0x65ff, 0x0118, 0x080c, 0xae61, 0x0080, 0xb810, -+ 0x0006, 0xb814, 0x0006, 0xb8c0, 0x0006, 0x080c, 0x6034, 0x000e, -+ 0xb8c2, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, 0xae61, 0x00fe, -+ 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, 0xae61, 0x0005, -+ 0x080c, 0xbc85, 0x1148, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, -+ 0x9138, 0x080c, 0x968d, 0x0010, 0x080c, 0xae61, 0x0005, 0x6004, -+ 0x908a, 0x0053, 0x1a0c, 0x0dd5, 0x080c, 0x9588, 0x080c, 0xae92, -+ 0x080c, 0x968d, 0x0005, 0x9182, 0x0040, 0x0002, 0xdb79, 0xdb79, -+ 0xdb79, 0xdb79, 0xdb7b, 0xdb79, 0xdb79, 0xdb79, 0xdb79, 0xdb79, -+ 0xdb79, 0xdb79, 0xdb79, 0xdb79, 0xdb79, 0xdb79, 0xdb79, 0xdb79, -+ 0xdb79, 0x080c, 0x0dd5, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6, -+ 0x0046, 0x0026, 0x6210, 0x2258, 0xb8bc, 0x9005, 0x11a8, 0x6106, -+ 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xdbe1, 0x080c, -+ 0xe96b, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, 0x2011, -+ 0x0200, 0x080c, 0x86dd, 0x0020, 0x9026, 0x080c, 0xe7ef, 0x0c38, -+ 0x080c, 0x0fff, 0x090c, 0x0dd5, 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, 0x6c81, 0x001e, -+ 0x080c, 0xe96b, 0x1904, 0xdc41, 0x9486, 0x2000, 0x1130, 0x2019, -+ 0x0017, 0x080c, 0xe522, 0x0804, 0xdc41, 0x9486, 0x0200, 0x1120, -+ 0x080c, 0xe4be, 0x0804, 0xdc41, 0x9486, 0x0400, 0x0120, 0x9486, -+ 0x1000, 0x1904, 0xdc41, 0x2019, 0x0002, 0x080c, 0xe4d9, 0x0804, -+ 0xdc41, 0x2069, 0x1a71, 0x6a00, 0xd284, 0x0904, 0xdcab, 0x9284, -+ 0x0300, 0x1904, 0xdca4, 0x6804, 0x9005, 0x0904, 0xdc8c, 0x2d78, -+ 0x6003, 0x0007, 0x080c, 0x1018, 0x0904, 0xdc4d, 0x7800, 0xd08c, -+ 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, 0x180f, -+ 0x2004, 0xd084, 0x1904, 0xdcaf, 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, 0xdc49, 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, -+ 0x6c81, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, 0x009e, -+ 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810, 0x2004, -+ 0xd084, 0x0120, 0x080c, 0x0fff, 0x1904, 0xdbf6, 0x6017, 0xf100, -+ 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x90f0, 0x080c, 0x968d, -+ 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, 0x1200, -+ 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, 0xf700, -+ 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, 0x080c, -+ 0x90f0, 0x080c, 0x968d, 0x0828, 0x6868, 0x602e, 0x686c, 0x6032, -+ 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x0804, 0xdc41, 0x2001, 0x180e, 0x2004, 0xd0ec, -+ 0x0120, 0x2011, 0x8049, 0x080c, 0x4b04, 0x6017, 0xf300, 0x0010, -+ 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x0804, 0xdc41, 0x6017, 0xf500, 0x0c98, 0x6017, -+ 0xf600, 0x0804, 0xdc61, 0x6017, 0xf200, 0x0804, 0xdc61, 0xa867, -+ 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, 0x7044, -+ 0x9084, 0x0003, 0x9080, 0xdc49, 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, 0x0dd5, 0x8210, -+ 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x0029, 0x20a0, 0x2011, 0xdd2b, 0x2041, 0x0001, 0x223d, 0x9784, -+ 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, 0x0530, -+ 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, 0x2098, -+ 0x0c68, 0x2950, 0x080c, 0x1018, 0x0170, 0x2900, 0xb002, 0xa867, -+ 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x001b, -+ 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, 0x080c, -+ 0x1031, 0x0cc8, 0x080c, 0x1031, 0x0804, 0xdc4d, 0x2548, 0x8847, -+ 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, 0x080c, -+ 0xe551, 0x0804, 0xdc41, 0x8010, 0x0004, 0x801a, 0x0006, 0x8018, -+ 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, 0x6004, -+ 0x908a, 0x0054, 0x1a0c, 0x0dd5, 0x9082, 0x0040, 0x0a0c, 0x0dd5, -+ 0x2008, 0x0804, 0xdddc, 0x9186, 0x0051, 0x0108, 0x00c0, 0x2001, -+ 0x0109, 0x2004, 0xd084, 0x0904, 0xdd8d, 0x0126, 0x2091, 0x2800, -+ 0x0006, 0x0016, 0x0026, 0x080c, 0x8fd5, 0x002e, 0x001e, 0x000e, -+ 0x012e, 0x6000, 0x9086, 0x0002, 0x1580, 0x0804, 0xde24, 0x9186, -+ 0x0027, 0x0530, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, 0x0500, -+ 0x190c, 0x0dd5, 0x2001, 0x0109, 0x2004, 0xd084, 0x01f0, 0x00c6, -+ 0x0126, 0x2091, 0x2800, 0x00c6, 0x2061, 0x0100, 0x0006, 0x0016, -+ 0x0026, 0x080c, 0x8fd5, 0x002e, 0x001e, 0x000e, 0x00ce, 0x012e, -+ 0x00ce, 0x6000, 0x9086, 0x0004, 0x190c, 0x0dd5, 0x0804, 0xdf05, -+ 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, 0x080c, 0xaef7, 0x0005, -+ 0xdda3, 0xdda5, 0xdda5, 0xddcc, 0xdda3, 0xdda3, 0xdda3, 0xdda3, -+ 0xdda3, 0xdda3, 0xdda3, 0xdda3, 0xdda3, 0xdda3, 0xdda3, 0xdda3, -+ 0xdda3, 0xdda3, 0xdda3, 0x080c, 0x0dd5, 0x080c, 0x9588, 0x080c, -+ 0x968d, 0x0036, 0x0096, 0x6014, 0x904d, 0x01d8, 0x080c, 0xcb35, -+ 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, 0xe551, 0x6017, 0x0000, -+ 0x6018, 0x9005, 0x1120, 0x2001, 0x1987, 0x2004, 0x601a, 0x6003, -+ 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, 0x080c, 0x9588, 0x080c, -+ 0x968d, 0x080c, 0xcb35, 0x0120, 0x6014, 0x2048, 0x080c, 0x1031, -+ 0x080c, 0xae92, 0x009e, 0x0005, 0x0002, 0xddf0, 0xde07, 0xddf2, -+ 0xde1e, 0xddf0, 0xddf0, 0xddf0, 0xddf0, 0xddf0, 0xddf0, 0xddf0, -+ 0xddf0, 0xddf0, 0xddf0, 0xddf0, 0xddf0, 0xddf0, 0xddf0, 0xddf0, -+ 0x080c, 0x0dd5, 0x0096, 0x080c, 0x9588, 0x6014, 0x2048, 0xa87c, -+ 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, 0xaedc, -+ 0x0010, 0x6003, 0x0004, 0x080c, 0x968d, 0x009e, 0x0005, 0x080c, -+ 0x9588, 0x080c, 0xcb35, 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, -+ 0x009e, 0xd1ec, 0x1138, 0x080c, 0x86b2, 0x080c, 0xae61, 0x080c, -+ 0x968d, 0x0005, 0x080c, 0xe7b3, 0x0db0, 0x0cc8, 0x080c, 0x9588, -+ 0x2009, 0x0041, 0x0804, 0xdf8d, 0x9182, 0x0040, 0x0002, 0xde3a, -+ 0xde3c, 0xde3a, 0xde3a, 0xde3a, 0xde3a, 0xde3a, 0xde3a, 0xde3a, -+ 0xde3a, 0xde3a, 0xde3a, 0xde3a, 0xde3a, 0xde3a, 0xde3a, 0xde3a, -+ 0xde3d, 0xde3a, 0x080c, 0x0dd5, 0x0005, 0x00d6, 0x080c, 0x86b2, -+ 0x00de, 0x080c, 0xe80b, 0x080c, 0xae61, 0x0005, 0x9182, 0x0040, -+ 0x0002, 0xde5c, 0xde5c, 0xde5c, 0xde5c, 0xde5c, 0xde5c, 0xde5c, -+ 0xde5c, 0xde5c, 0xde5e, 0xdecd, 0xde5c, 0xde5c, 0xde5c, 0xde5c, -+ 0xdecd, 0xde5c, 0xde5c, 0xde5c, 0x080c, 0x0dd5, 0x2001, 0x0105, -+ 0x2004, 0x9084, 0x1800, 0x01c8, 0x2001, 0x0132, 0x200c, 0x2001, -+ 0x0131, 0x2004, 0x9105, 0x1904, 0xdecd, 0x2009, 0x180c, 0x2104, -+ 0xd0d4, 0x0904, 0xdecd, 0xc0d4, 0x200a, 0x2009, 0x0105, 0x2104, -+ 0x9084, 0xe7fd, 0x9085, 0x0010, 0x200a, 0x2001, 0x1867, 0x2004, -+ 0xd0e4, 0x1528, 0x603b, 0x0000, 0x080c, 0x963d, 0x6014, 0x0096, -+ 0x2048, 0xa87c, 0xd0fc, 0x0188, 0x908c, 0x0003, 0x918e, 0x0002, -+ 0x0508, 0x2001, 0x180c, 0x2004, 0xd0d4, 0x11e0, 0x080c, 0x97b9, -+ 0x2009, 0x0041, 0x009e, 0x0804, 0xdf8d, 0x080c, 0x97b9, 0x6003, -+ 0x0007, 0x601b, 0x0000, 0x080c, 0x86b2, 0x009e, 0x0005, 0x2001, -+ 0x0100, 0x2004, 0x9082, 0x0005, 0x0aa8, 0x2001, 0x011f, 0x2004, -+ 0x603a, 0x0890, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, 0xd1cc, -+ 0x0110, 0x080c, 0x2c52, 0x080c, 0x97b9, 0x6014, 0x2048, 0xa97c, -+ 0xd1ec, 0x1130, 0x080c, 0x86b2, 0x080c, 0xae61, 0x009e, 0x0005, -+ 0x080c, 0xe7b3, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, -+ 0xc1d4, 0x2102, 0x0036, 0x080c, 0x963d, 0x080c, 0x97b9, 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, 0xe551, 0x6018, 0x9005, -+ 0x1128, 0x2001, 0x1987, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, -+ 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, -+ 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, -+ 0xdf1e, 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, 0xdf1c, -+ 0xdf1c, 0xdf1c, 0xdf1c, 0xdf69, 0x080c, 0x0dd5, 0x6014, 0x0096, -+ 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, -+ 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, -+ 0x0041, 0x009e, 0x0804, 0xdf8d, 0x6003, 0x0007, 0x601b, 0x0000, -+ 0x080c, 0x86b2, 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, 0x180e, -+ 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, -+ 0x00e9, 0x080c, 0x86b4, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, -+ 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x15e5, 0x1904, 0xdf1e, -+ 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, -+ 0x1120, 0x080c, 0x15e5, 0x1904, 0xdf1e, 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, 0x0dd5, -+ 0x6024, 0xd0dc, 0x090c, 0x0dd5, 0x0005, 0xdfb0, 0xdfbc, 0xdfc8, -+ 0xdfd4, 0xdfb0, 0xdfb0, 0xdfb0, 0xdfb0, 0xdfb7, 0xdfb2, 0xdfb2, -+ 0xdfb0, 0xdfb0, 0xdfb0, 0xdfb0, 0xdfb2, 0xdfb0, 0xdfb2, 0xdfb0, -+ 0x080c, 0x0dd5, 0x6024, 0xd0dc, 0x090c, 0x0dd5, 0x0005, 0x6014, -+ 0x9005, 0x190c, 0x0dd5, 0x0005, 0x6003, 0x0001, 0x6106, 0x080c, -+ 0x90f0, 0x0126, 0x2091, 0x8000, 0x080c, 0x968d, 0x012e, 0x0005, -+ 0x6003, 0x0001, 0x6106, 0x080c, 0x90f0, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x968d, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x2c10, -+ 0x080c, 0x1bad, 0x0126, 0x2091, 0x8000, 0x080c, 0x9155, 0x080c, -+ 0x97b9, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x0036, 0x0096, -+ 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, 0x0005, 0xdfff, -+ 0xe001, 0xe013, 0xe02d, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, -+ 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0xdfff, 0x080c, -+ 0x0dd5, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x01f8, 0x909c, 0x0003, -+ 0x939e, 0x0003, 0x01d0, 0x6003, 0x0001, 0x6106, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0168, -+ 0x909c, 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, -+ 0x080c, 0x90f0, 0x080c, 0x968d, 0x00e0, 0x901e, 0x6316, 0x631a, -+ 0x2019, 0x0004, 0x080c, 0xe551, 0x00a0, 0x6014, 0x2048, 0xa87c, -+ 0xd0fc, 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, -+ 0x0003, 0x6106, 0x2c10, 0x080c, 0x1bad, 0x080c, 0x9155, 0x080c, -+ 0x97b9, 0x0005, 0x080c, 0x9588, 0x6114, 0x81ff, 0x0158, 0x0096, -+ 0x2148, 0x080c, 0xe908, 0x0036, 0x2019, 0x0029, 0x080c, 0xe551, -+ 0x003e, 0x009e, 0x080c, 0xae92, 0x080c, 0x968d, 0x0005, 0x080c, -+ 0x963d, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xe908, -+ 0x0036, 0x2019, 0x0029, 0x080c, 0xe551, 0x003e, 0x009e, 0x080c, -+ 0xae92, 0x080c, 0x97b9, 0x0005, 0x9182, 0x0085, 0x0002, 0xe07e, -+ 0xe07c, 0xe07c, 0xe08a, 0xe07c, 0xe07c, 0xe07c, 0xe07c, 0xe07c, -+ 0xe07c, 0xe07c, 0xe07c, 0xe07c, 0x080c, 0x0dd5, 0x6003, 0x000b, -+ 0x6106, 0x080c, 0x90f0, 0x0126, 0x2091, 0x8000, 0x080c, 0x968d, -+ 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, 0xe7aa, 0x0118, 0x080c, -+ 0xae61, 0x0450, 0x2071, 0x0260, 0x7224, 0x6216, 0x2001, 0x180e, -+ 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, -+ 0x2c00, 0x2011, 0x014e, 0x080c, 0xb182, 0x7220, 0x080c, 0xe3f7, -+ 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, 0x0087, 0x7224, 0x9296, -+ 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, 0x0001, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x080c, 0x97b9, 0x00ee, 0x002e, 0x0005, 0x9186, -+ 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0dd5, 0x908a, -+ 0x0092, 0x1a0c, 0x0dd5, 0x9082, 0x0085, 0x00a2, 0x9186, 0x0027, -+ 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0xaef7, 0x0050, 0x2001, -+ 0x0007, 0x080c, 0x657b, 0x080c, 0x9588, 0x080c, 0xae92, 0x080c, -+ 0x968d, 0x0005, 0xe0ef, 0xe0f1, 0xe0f1, 0xe0ef, 0xe0ef, 0xe0ef, -+ 0xe0ef, 0xe0ef, 0xe0ef, 0xe0ef, 0xe0ef, 0xe0ef, 0xe0ef, 0x080c, -+ 0x0dd5, 0x080c, 0x9588, 0x080c, 0xae92, 0x080c, 0x968d, 0x0005, -+ 0x9182, 0x0085, 0x0a0c, 0x0dd5, 0x9182, 0x0092, 0x1a0c, 0x0dd5, -+ 0x9182, 0x0085, 0x0002, 0xe110, 0xe110, 0xe110, 0xe112, 0xe110, -+ 0xe110, 0xe110, 0xe110, 0xe110, 0xe110, 0xe110, 0xe110, 0xe110, -+ 0x080c, 0x0dd5, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, -+ 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xaef7, 0x0030, 0x080c, -+ 0x9588, 0x080c, 0xae92, 0x080c, 0x968d, 0x0005, 0x0036, 0x080c, -+ 0xe80b, 0x6043, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023, 0x0006, -+ 0x6003, 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, -+ 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0xa69c, 0x009e, 0x008e, -+ 0x1550, 0x0076, 0x2c38, 0x080c, 0xa747, 0x007e, 0x1520, 0x6000, -+ 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0, 0x0096, -+ 0x601c, 0xd084, 0x0140, 0x080c, 0xe80b, 0x080c, 0xd248, 0x080c, -+ 0x1a5e, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xcb35, 0x0110, -+ 0x080c, 0xe551, 0x009e, 0x6017, 0x0000, 0x080c, 0xe80b, 0x6023, -+ 0x0007, 0x080c, 0xd248, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, -+ 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, 0x080c, -+ 0x283e, 0x15c8, 0x0016, 0x00c6, 0x080c, 0x65ff, 0x1590, 0x001e, -+ 0x00c6, 0x2160, 0x080c, 0xd245, 0x00ce, 0x002e, 0x0026, 0x0016, -+ 0x2019, 0x0029, 0x080c, 0xa808, 0x080c, 0x928b, 0x0076, 0x903e, -+ 0x080c, 0x9168, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c, 0xe2eb, -+ 0x007e, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, 0x9286, 0x0006, -+ 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, 0x327d, 0x002e, -+ 0xbcc0, 0x001e, 0x080c, 0x6034, 0xbe12, 0xbd16, 0xbcc2, 0x9006, -+ 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, 0x00ce, 0x00fe, -+ 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, 0x1824, 0x2104, -+ 0x9086, 0x0074, 0x1904, 0xe212, 0x2069, 0x0260, 0x6944, 0x9182, -+ 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, 0xe20f, 0x2001, -+ 0x197c, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, 0xb8c0, 0x9005, -+ 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, 0x0001, 0x0648, -+ 0x080c, 0xe970, 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, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, 0xff00, 0x8217, -+ 0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, 0x080c, 0x660e, -+ 0x0804, 0xe27a, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, -+ 0x2019, 0x000a, 0x080c, 0xbe1d, 0x009e, 0x15a8, 0x2011, 0x027a, -+ 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xbe1d, -+ 0x009e, 0x1548, 0x0046, 0x0016, 0xbaa0, 0x2220, 0x9006, 0x2009, -+ 0x1848, 0x210c, 0xd1a4, 0x0138, 0x2009, 0x0029, 0x080c, 0xe5ae, -+ 0xb800, 0xc0e5, 0xb802, 0x2019, 0x0029, 0x080c, 0x928b, 0x0076, -+ 0x2039, 0x0000, 0x080c, 0x9168, 0x2c08, 0x080c, 0xe2eb, 0x007e, -+ 0x2001, 0x0007, 0x080c, 0x657b, 0x2001, 0x0007, 0x080c, 0x654f, -+ 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, 0x283e, 0x11d0, 0x080c, 0x65ff, 0x11b8, 0x2011, 0x0270, -+ 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbe1d, -+ 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, -+ 0x2019, 0x0006, 0x080c, 0xbe1d, 0x009e, 0x015e, 0x003e, 0x002e, -+ 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, -+ 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, -+ 0x283e, 0x11d0, 0x080c, 0x65ff, 0x11b8, 0x2011, 0x0276, 0x20a9, -+ 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbe1d, 0x009e, -+ 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, -+ 0x0006, 0x080c, 0xbe1d, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, -+ 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, -+ 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x2740, 0x2029, -+ 0x19f0, 0x252c, 0x2021, 0x19f6, 0x2424, 0x2061, 0x1cd0, 0x2071, -+ 0x1800, 0x7654, 0x7074, 0x81ff, 0x0150, 0x0006, 0x9186, 0x1ab0, -+ 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xe388, 0x0018, 0x9606, -+ 0x0904, 0xe388, 0x080c, 0x8981, 0x0904, 0xe37f, 0x2100, 0x9c06, -+ 0x0904, 0xe37f, 0x080c, 0xe5ef, 0x1904, 0xe37f, 0x080c, 0xe98d, -+ 0x0904, 0xe37f, 0x080c, 0xe5df, 0x0904, 0xe37f, 0x6720, 0x9786, -+ 0x0001, 0x1148, 0x080c, 0x3314, 0x0904, 0xe3c7, 0x6004, 0x9086, -+ 0x0000, 0x1904, 0xe3c7, 0x9786, 0x0004, 0x0904, 0xe3c7, 0x9786, -+ 0x0007, 0x0904, 0xe37f, 0x2500, 0x9c06, 0x0904, 0xe37f, 0x2400, -+ 0x9c06, 0x05e8, 0x88ff, 0x0118, 0x6054, 0x9906, 0x15c0, 0x0096, -+ 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1a5e, 0x001e, -+ 0x9786, 0x000a, 0x0148, 0x080c, 0xcd3b, 0x1130, 0x080c, 0xb813, -+ 0x009e, 0x080c, 0xae92, 0x0418, 0x6014, 0x2048, 0x080c, 0xcb35, -+ 0x01d8, 0x9786, 0x0003, 0x1570, 0xa867, 0x0103, 0xa87c, 0xd0cc, -+ 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fb1, 0x009e, 0xab7a, -+ 0xa877, 0x0000, 0x080c, 0xe908, 0x0016, 0x080c, 0xce24, 0x080c, -+ 0x6c75, 0x001e, 0x080c, 0xcd1e, 0x009e, 0x080c, 0xae92, 0x9ce0, -+ 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xe2ff, -+ 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x008e, 0x00ce, -+ 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, 0x9386, 0x0005, 0x0128, -+ 0x080c, 0xe908, 0x080c, 0xe551, 0x08f8, 0x009e, 0x0c00, 0x9786, -+ 0x0009, 0x11f8, 0x6000, 0x9086, 0x0004, 0x01c0, 0x6000, 0x9086, -+ 0x0003, 0x11a0, 0x080c, 0x963d, 0x0096, 0x6114, 0x2148, 0x080c, -+ 0xcb35, 0x0118, 0x6010, 0x080c, 0x6c81, 0x009e, 0x00c6, 0x080c, -+ 0xae61, 0x00ce, 0x0036, 0x080c, 0x97b9, 0x003e, 0x009e, 0x0804, -+ 0xe37f, 0x9786, 0x000a, 0x0904, 0xe366, 0x0804, 0xe364, 0x81ff, -+ 0x0904, 0xe37f, 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0138, -+ 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1904, 0xe37f, 0x6000, -+ 0x9086, 0x0002, 0x1904, 0xe37f, 0x080c, 0xcd2a, 0x0138, 0x080c, -+ 0xcd3b, 0x1904, 0xe37f, 0x080c, 0xb813, 0x0038, 0x080c, 0x31e8, -+ 0x080c, 0xcd3b, 0x1110, 0x080c, 0xb813, 0x080c, 0xae92, 0x0804, -+ 0xe37f, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, -+ 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, 0x080c, 0xe578, 0x001e, -+ 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, -+ 0xe416, 0xe416, 0xe416, 0xe416, 0xe416, 0xe416, 0xe418, 0xe416, -+ 0xe416, 0xe416, 0xe416, 0xae92, 0xae92, 0xe416, 0x9006, 0x0005, -+ 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, -+ 0x2c00, 0x2009, 0x0020, 0x080c, 0xe5ae, 0x001e, 0x004e, 0x2019, -+ 0x0002, 0x080c, 0xe134, 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, -+ 0x080c, 0xcb35, 0x0140, 0x6014, 0x904d, 0x080c, 0xc768, 0x687b, -+ 0x0005, 0x080c, 0x6c81, 0x009e, 0x080c, 0xae92, 0x9085, 0x0001, -+ 0x0005, 0x2001, 0x0001, 0x080c, 0x653b, 0x0156, 0x0016, 0x0026, -+ 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, -+ 0xbe09, 0x003e, 0x002e, 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, -+ 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, -+ 0x8000, 0x2740, 0x2061, 0x1cd0, 0x2079, 0x0001, 0x8fff, 0x0904, -+ 0xe4b1, 0x2071, 0x1800, 0x7654, 0x7074, 0x8001, 0x9602, 0x1a04, -+ 0xe4b1, 0x88ff, 0x0120, 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, -+ 0xe5df, 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, 0xe80b, 0x080c, 0xd248, 0x080c, 0x1a5e, -+ 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xcb35, 0x0120, 0x0046, -+ 0x080c, 0xe551, 0x004e, 0x009e, 0x080c, 0xae92, 0x88ff, 0x1198, -+ 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, -+ 0xe466, 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, 0xa69c, 0x009e, 0x008e, -+ 0x903e, 0x080c, 0xa747, 0x080c, 0xe457, 0x005e, 0x007e, 0x00be, -+ 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, 0x2c20, -+ 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, 0x65ff, -+ 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, 0x0096, -+ 0x904e, 0x080c, 0xa69c, 0x009e, 0x008e, 0x903e, 0x080c, 0xa747, -+ 0x080c, 0xe457, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, 0xe4e4, -+ 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x0005, 0x00b6, -+ 0x0076, 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, -+ 0x2019, 0x0048, 0x0096, 0x904e, 0x080c, 0xa69c, 0x009e, 0x008e, -+ 0x903e, 0x080c, 0xa747, 0x2c20, 0x080c, 0xe457, 0x005e, 0x007e, -+ 0x00be, 0x0005, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, -+ 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, 0x65ff, -+ 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, 0x080c, -+ 0xe7ef, 0x004e, 0x0096, 0x904e, 0x080c, 0xa69c, 0x009e, 0x008e, -+ 0x903e, 0x080c, 0xa747, 0x080c, 0xe457, 0x003e, 0x001e, 0x8108, -+ 0x1f04, 0xe52c, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, -+ 0x0005, 0x0016, 0x00f6, 0x080c, 0xcb33, 0x0198, 0xa864, 0x9084, -+ 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, -+ 0x0000, 0xab82, 0x080c, 0x6c81, 0x2f48, 0x0cb0, 0xab82, 0x080c, -+ 0x6c81, 0x00fe, 0x001e, 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, -+ 0x0000, 0x080c, 0x6c81, 0x2f48, 0x0cb8, 0x080c, 0x6c81, 0x0c88, -+ 0x00e6, 0x0046, 0x0036, 0x2061, 0x1cd0, 0x9005, 0x1138, 0x2071, -+ 0x1800, 0x7454, 0x7074, 0x8001, 0x9402, 0x12f8, 0x2100, 0x9c06, -+ 0x0188, 0x6000, 0x9086, 0x0000, 0x0168, 0x6008, 0x9206, 0x1150, -+ 0x6320, 0x9386, 0x0009, 0x01b0, 0x6010, 0x91a0, 0x0004, 0x2424, -+ 0x9406, 0x0140, 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, -+ 0x1220, 0x0c20, 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, 0x004e, -+ 0x00ee, 0x0005, 0x631c, 0xd3c4, 0x1d68, 0x0c30, 0x0096, 0x0006, -+ 0x080c, 0x0fff, 0x000e, 0x090c, 0x0dd5, 0xaae2, 0xa867, 0x010d, -+ 0xa88e, 0x0026, 0x2010, 0x080c, 0xcb23, 0x2001, 0x0000, 0x0120, -+ 0x2200, 0x9080, 0x0015, 0x2004, 0x002e, 0xa87a, 0x9186, 0x0020, -+ 0x0110, 0xa8e3, 0xffff, 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, -+ 0x198e, 0x2004, 0xa882, 0x9006, 0xa802, 0xa86a, 0xa88a, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x6c81, 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, 0x1987, -+ 0x2004, 0x601a, 0x080c, 0x90f0, 0x080c, 0x968d, 0x001e, 0x0005, -+ 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, -+ 0x080c, 0xce68, 0x0030, 0x080c, 0xe80b, 0x080c, 0x86b2, 0x080c, -+ 0xae61, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, -+ 0xe63e, 0xe63e, 0xe63e, 0xe640, 0xe63e, 0xe640, 0xe640, 0xe63e, -+ 0xe640, 0xe63e, 0xe63e, 0xe63e, 0xe63e, 0xe63e, 0x9006, 0x0005, -+ 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, -+ 0x0002, 0xe657, 0xe657, 0xe657, 0xe657, 0xe657, 0xe657, 0xe664, -+ 0xe657, 0xe657, 0xe657, 0xe657, 0xe657, 0xe657, 0xe657, 0x6007, -+ 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, 0x0001, 0x080c, -+ 0x90f0, 0x080c, 0x968d, 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, -+ 0xe80b, 0x6043, 0x0000, 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, -+ 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, 0x0007, 0x1904, 0xe6bd, -+ 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, -+ 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, -+ 0xe734, 0x6014, 0x9005, 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, -+ 0x0dd5, 0x0804, 0xe734, 0x2048, 0x080c, 0xcb35, 0x1130, 0x0028, -+ 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, -+ 0x0003, 0x9086, 0x0002, 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, -+ 0xa880, 0xc0fc, 0xa882, 0x2009, 0x0043, 0x080c, 0xdf8d, 0x0804, -+ 0xe734, 0x2009, 0x0041, 0x0804, 0xe72e, 0x9186, 0x0005, 0x15a0, -+ 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, -+ 0xe657, 0xd0b4, 0x0128, 0xd0fc, 0x090c, 0x0dd5, 0x0804, 0xe678, -+ 0x6007, 0x003a, 0x6003, 0x0001, 0x080c, 0x90f0, 0x080c, 0x968d, -+ 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, -+ 0x1904, 0xe734, 0x6814, 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, -+ 0xa980, 0xc1fc, 0xc1bc, 0xa982, 0x00f6, 0x2c78, 0x080c, 0x1725, -+ 0x00fe, 0x2009, 0x0042, 0x04d0, 0x0036, 0x080c, 0x0fff, 0x090c, -+ 0x0dd5, 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, 0x6c81, 0x2019, 0x0045, 0x6008, -+ 0x2068, 0x080c, 0xe134, 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, -+ 0x0007, 0x901e, 0x631a, 0x6342, 0x003e, 0x0038, 0x6043, 0x0000, -+ 0x6003, 0x0007, 0x080c, 0xdf8d, 0x00ce, 0x00de, 0x009e, 0x0005, -+ 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, -+ 0x9186, 0x0027, 0x1178, 0x080c, 0x9588, 0x0036, 0x0096, 0x6014, -+ 0x2048, 0x2019, 0x0004, 0x080c, 0xe551, 0x009e, 0x003e, 0x080c, -+ 0x968d, 0x0005, 0x9186, 0x0014, 0x0d70, 0x080c, 0xaef7, 0x0005, -+ 0xe767, 0xe765, 0xe765, 0xe765, 0xe765, 0xe765, 0xe767, 0xe765, -+ 0xe765, 0xe765, 0xe765, 0xe765, 0xe765, 0x080c, 0x0dd5, 0x080c, -+ 0x9588, 0x6003, 0x000c, 0x080c, 0x968d, 0x0005, 0x9182, 0x0092, -+ 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0xaef7, 0x0005, -+ 0xe785, 0xe785, 0xe785, 0xe785, 0xe787, 0xe7a7, 0xe785, 0xe785, -+ 0xe785, 0xe785, 0xe785, 0xe785, 0xe785, 0x080c, 0x0dd5, 0x00d6, -+ 0x2c68, 0x080c, 0xae0b, 0x01b0, 0x6003, 0x0001, 0x6007, 0x001e, -+ 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, -+ 0x600b, 0xffff, 0x6910, 0x6112, 0x6023, 0x0004, 0x080c, 0x90f0, -+ 0x080c, 0x968d, 0x2d60, 0x080c, 0xae61, 0x00de, 0x0005, 0x080c, -+ 0xae61, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0ec, 0x00ee, 0x0005, 0x2009, 0x1867, 0x210c, 0xd1ec, 0x05b0, -+ 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, 0x2001, -+ 0x1988, 0x2004, 0x6042, 0x2009, 0x1867, 0x210c, 0xd1f4, 0x1520, -+ 0x00a0, 0x2009, 0x1867, 0x210c, 0xd1f4, 0x0128, 0x6024, 0xc0e4, -+ 0x6026, 0x9006, 0x00d8, 0x2001, 0x1988, 0x200c, 0x2001, 0x1986, -+ 0x2004, 0x9100, 0x9080, 0x000a, 0x6042, 0x6010, 0x00b6, 0x2058, -+ 0xb8bc, 0x00be, 0x0008, 0x2104, 0x9005, 0x0118, 0x9088, 0x0003, -+ 0x0cd0, 0x2c0a, 0x600f, 0x0000, 0x9085, 0x0001, 0x0005, 0x0016, -+ 0x00c6, 0x00e6, 0x6154, 0xb8bc, 0x2060, 0x8cff, 0x0180, 0x84ff, -+ 0x1118, 0x6054, 0x9106, 0x1138, 0x600c, 0x2072, 0x080c, 0x86b2, -+ 0x080c, 0xae61, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, 0x00ee, -+ 0x00ce, 0x001e, 0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058, 0xb8bc, -+ 0x2068, 0x9005, 0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0, 0x600c, -+ 0x680e, 0x00be, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, 0x2011, -+ 0x182c, 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, 0xbe1d, 0x009e, 0x1168, 0x2011, 0x0274, 0x20a9, -+ 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x0006, 0x080c, 0xbe1d, -+ 0x009e, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x2071, -+ 0x1800, 0x080c, 0x5fad, 0x080c, 0x2f96, 0x00ee, 0x0005, 0x0096, -+ 0x0026, 0x080c, 0x0fff, 0x090c, 0x0dd5, 0xa85c, 0x9080, 0x001a, -+ 0x20a0, 0x20a9, 0x000c, 0xa860, 0x20e8, 0x9006, 0x4004, 0x9186, -+ 0x0046, 0x1118, 0xa867, 0x0136, 0x0038, 0xa867, 0x0138, 0x9186, -+ 0x0041, 0x0110, 0xa87b, 0x0001, 0x7038, 0x9084, 0xff00, 0x7240, -+ 0x9294, 0xff00, 0x8007, 0x9215, 0xaa9a, 0x9186, 0x0046, 0x1168, -+ 0x7038, 0x9084, 0x00ff, 0x723c, 0x9294, 0xff00, 0x9215, 0xaa9e, -+ 0x723c, 0x9294, 0x00ff, 0xaaa2, 0x0060, 0x7040, 0x9084, 0x00ff, -+ 0x7244, 0x9294, 0xff00, 0x9215, 0xaa9e, 0x7244, 0x9294, 0x00ff, -+ 0xaaa2, 0x9186, 0x0046, 0x1118, 0x9e90, 0x0012, 0x0010, 0x9e90, -+ 0x001a, 0x2204, 0x8007, 0xa8a6, 0x8210, 0x2204, 0x8007, 0xa8aa, -+ 0x8210, 0x2204, 0x8007, 0xa8ae, 0x8210, 0x2204, 0x8007, 0xa8b2, -+ 0x8210, 0x9186, 0x0046, 0x11b8, 0x9e90, 0x0016, 0x2204, 0x8007, -+ 0xa8b6, 0x8210, 0x2204, 0x8007, 0xa8ba, 0x8210, 0x2204, 0x8007, -+ 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, 0x8210, 0x2011, 0x0205, -+ 0x2013, 0x0001, 0x00b0, 0x9e90, 0x001e, 0x2204, 0x8007, 0xa8b6, -+ 0x8210, 0x2204, 0x8007, 0xa8ba, 0x2011, 0x0205, 0x2013, 0x0001, -+ 0x2011, 0x0260, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, -+ 0xa8c2, 0x9186, 0x0046, 0x1118, 0x2011, 0x0262, 0x0010, 0x2011, -+ 0x026a, 0x0146, 0x01d6, 0x0036, 0x20a9, 0x0001, 0x2019, 0x0008, -+ 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0x2204, 0x8007, -+ 0x4004, 0x8210, 0x8319, 0x1dd0, 0x003e, 0x01ce, 0x013e, 0x2011, -+ 0x0205, 0x2013, 0x0000, 0x002e, 0x080c, 0x6c81, 0x009e, 0x0005, -+ 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0fc, 0x0108, -+ 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5, 0xa882, 0x0005, 0x00e6, -+ 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, 0x0016, -+ 0x0126, 0x2091, 0x8000, 0x2029, 0x19f0, 0x252c, 0x2021, 0x19f6, -+ 0x2424, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7654, 0x7074, 0x9606, -+ 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, 0x1500, -+ 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, 0xe5df, -+ 0x01b8, 0x080c, 0xe5ef, 0x11a0, 0x6000, 0x9086, 0x0004, 0x1120, -+ 0x0016, 0x080c, 0x1a5e, 0x001e, 0x080c, 0xcd2a, 0x1110, 0x080c, -+ 0x31e8, 0x080c, 0xcd3b, 0x1110, 0x080c, 0xb813, 0x080c, 0xae92, -+ 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1208, 0x0858, -+ 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, 0x00ce, -+ 0x00de, 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, 0x0005, -+ 0x0006, 0x2001, 0x1837, 0x2004, 0xd09c, 0x000e, 0x0005, 0x0006, -+ 0x0036, 0x0046, 0x080c, 0xd230, 0x0168, 0x2019, 0xffff, 0x9005, -+ 0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, -+ 0x080c, 0x4cbb, 0x004e, 0x003e, 0x000e, 0x6004, 0x9086, 0x0001, -+ 0x1128, 0x080c, 0xa808, 0x080c, 0xae92, 0x9006, 0x0005, 0x00e6, -+ 0x00c6, 0x00b6, 0x0046, 0x2061, 0x1cd0, 0x2071, 0x1800, 0x7454, -+ 0x7074, 0x8001, 0x9402, 0x12b8, 0x2100, 0x9c06, 0x0148, 0x6000, -+ 0x9086, 0x0000, 0x0128, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x0140, -+ 0x9ce0, 0x0018, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1220, 0x0c60, -+ 0x9085, 0x0001, 0x0008, 0x9006, 0x004e, 0x00be, 0x00ce, 0x00ee, -+ 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, 0x2071, -+ 0x1840, 0xd5a4, 0x0118, 0x7004, 0x8000, 0x7006, 0xd5b4, 0x0118, -+ 0x7000, 0x8000, 0x7002, 0xd5ac, 0x0178, 0x2500, 0x9084, 0x0007, -+ 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, -+ 0x0118, 0x2071, 0xfffe, 0x0089, 0x001e, 0x00ee, 0x000e, 0x012e, -+ 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, 0xfff6, -+ 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e05, 0x8000, 0x2077, -+ 0x1220, 0x8e70, 0x2e05, 0x8000, 0x2077, 0x0005, 0x00e6, 0x2071, -+ 0xfff4, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xfff8, 0x0c69, -+ 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, -+ 0x1840, 0x7014, 0x8000, 0x7016, 0x00ee, 0x000e, 0x012e, 0x0005, -+ 0x0003, 0x000b, 0x079e, 0x0000, 0xc000, 0x0001, 0x8064, 0x0008, -+ 0x0010, 0x0000, 0x8066, 0x0000, 0x0101, 0x0008, 0x4407, 0x0003, -+ 0x8060, 0x0000, 0x0400, 0x0000, 0x580d, 0x000b, 0x79a8, 0x000b, -+ 0x50ee, 0x000b, 0x4c0a, 0x0003, 0xbac0, 0x0009, 0x008a, 0x0000, -+ 0x0c0a, 0x000b, 0x15fe, 0x0008, 0x340a, 0x0003, 0xc4c0, 0x0009, -+ 0x7000, 0x0000, 0xffa0, 0x0001, 0x2000, 0x0000, 0x1668, 0x000b, -+ 0x808c, 0x0008, 0x0001, 0x0000, 0x0000, 0x0007, 0x4028, 0x0000, -+ 0x4047, 0x000a, 0x808c, 0x0008, 0x0002, 0x0000, 0x0822, 0x0003, -+ 0x4022, 0x0000, 0x0028, 0x000b, 0x4122, 0x0008, 0x94c0, 0x0009, -+ 0xff00, 0x0008, 0xffe0, 0x0009, 0x0500, 0x0008, 0x0a93, 0x000b, -+ 0x4447, 0x0002, 0x0e90, 0x0003, 0x0bfe, 0x0008, 0x11a0, 0x0001, -+ 0x126e, 0x0003, 0x0ca0, 0x0001, 0x126e, 0x0003, 0x9180, 0x0001, -+ 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, -+ 0x8066, 0x0000, 0x0009, 0x0008, 0x4436, 0x000b, 0x808c, 0x0008, -+ 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x0004, 0x0000, -+ 0x8066, 0x0000, 0x0411, 0x0000, 0x443e, 0x0003, 0x03fe, 0x0000, -+ 0x43e0, 0x0001, 0x0e6b, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, -+ 0x02e0, 0x0001, 0x0e6b, 0x000b, 0x9180, 0x0001, 0x0005, 0x0008, -+ 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, -+ 0x0019, 0x0000, 0x444d, 0x000b, 0x0240, 0x0002, 0x0a68, 0x0003, -+ 0x00fe, 0x0000, 0x326b, 0x000b, 0x0248, 0x000a, 0x085c, 0x0003, -+ 0x9180, 0x0001, 0x0006, 0x0008, 0x7f62, 0x0008, 0x8002, 0x0008, -+ 0x0003, 0x0008, 0x8066, 0x0000, 0x020a, 0x0000, 0x445b, 0x0003, -+ 0x112a, 0x0000, 0x002e, 0x0008, 0x022c, 0x0008, 0x3a44, 0x0002, -+ 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0002, 0x0000, 0x1760, 0x0008, -+ 0x8062, 0x0008, 0x000f, 0x0008, 0x8066, 0x0000, 0x0011, 0x0008, -+ 0x4468, 0x0003, 0x01fe, 0x0008, 0x42e0, 0x0009, 0x0e5c, 0x0003, -+ 0x00fe, 0x0000, 0x43e0, 0x0001, 0x0e5c, 0x0003, 0x1734, 0x0000, -+ 0x1530, 0x0000, 0x1632, 0x0008, 0x0d2a, 0x0008, 0x9880, 0x0001, -+ 0x0010, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, -+ 0x8066, 0x0000, 0x1e0a, 0x0008, 0x447a, 0x0003, 0x808a, 0x0008, -+ 0x0003, 0x0008, 0x1a60, 0x0000, 0x8062, 0x0008, 0x0002, 0x0000, -+ 0x5880, 0x000b, 0x8066, 0x0000, 0x3679, 0x0000, 0x4483, 0x0003, -+ 0x5884, 0x0003, 0x3efe, 0x0008, 0x7f4f, 0x0002, 0x088a, 0x000b, -+ 0x0d00, 0x0000, 0x0092, 0x000c, 0x8054, 0x0008, 0x0011, 0x0008, -+ 0x8074, 0x0000, 0x1010, 0x0008, 0x1efe, 0x0000, 0x300a, 0x000b, -+ 0x00c8, 0x000c, 0x000a, 0x000b, 0x00fe, 0x0000, 0x349a, 0x0003, -+ 0x1a60, 0x0000, 0x8062, 0x0008, 0x0007, 0x0000, 0x8066, 0x0000, -+ 0x0231, 0x0008, 0x4499, 0x000b, 0x03fe, 0x0000, 0x04d0, 0x0001, -+ 0x0cc0, 0x000b, 0x82c0, 0x0001, 0x1f00, 0x0000, 0xffa0, 0x0001, -+ 0x0400, 0x0000, 0x08af, 0x0003, 0x14c0, 0x000b, 0x01fe, 0x0008, -+ 0x0580, 0x0009, 0x7f06, 0x0000, 0x02fe, 0x0008, 0xffc0, 0x0001, -+ 0x00ff, 0x0008, 0x0690, 0x0001, 0x10af, 0x0003, 0x7f08, 0x0008, -+ 0x84c0, 0x0001, 0xff00, 0x0008, 0x08c0, 0x0003, 0x00fe, 0x0000, -+ 0x34b6, 0x000b, 0x8072, 0x0000, 0x1010, 0x0008, 0x3944, 0x0002, -+ 0x08b1, 0x0003, 0x00ba, 0x0003, 0x8072, 0x0000, 0x2020, 0x0008, -+ 0x3945, 0x000a, 0x08b6, 0x000b, 0x3946, 0x000a, 0x0cc7, 0x0003, -+ 0x0000, 0x0007, 0x3943, 0x000a, 0x08c7, 0x000b, 0x00ba, 0x0003, -+ 0x00fe, 0x0000, 0x34c5, 0x0003, 0x8072, 0x0000, 0x1000, 0x0000, -+ 0x00c7, 0x0003, 0x8072, 0x0000, 0x2000, 0x0000, 0x4000, 0x000f, -+ 0x1c60, 0x0000, 0x1b62, 0x0000, 0x8066, 0x0000, 0x0231, 0x0008, -+ 0x44cc, 0x000b, 0x58cd, 0x000b, 0x0140, 0x0008, 0x0242, 0x0000, -+ 0x1f43, 0x0002, 0x0cdb, 0x000b, 0x0d44, 0x0000, 0x0d46, 0x0008, -+ 0x0348, 0x0008, 0x044a, 0x0008, 0x030a, 0x0008, 0x040c, 0x0000, -+ 0x0d06, 0x0000, 0x0d08, 0x0008, 0x00df, 0x0003, 0x0344, 0x0008, -+ 0x0446, 0x0008, 0x0548, 0x0008, 0x064a, 0x0000, 0x1948, 0x000a, -+ 0x08e2, 0x0003, 0x0d4a, 0x0008, 0x58e2, 0x0003, 0x3efe, 0x0008, -+ 0x7f4f, 0x0002, 0x08e9, 0x000b, 0x8000, 0x0000, 0x0001, 0x0000, -+ 0x0092, 0x000c, 0x8054, 0x0008, 0x0001, 0x0000, 0x8074, 0x0000, -+ 0x2020, 0x0008, 0x4000, 0x000f, 0x3a40, 0x000a, 0x0c0d, 0x0003, -+ 0x2b24, 0x0008, 0x2b24, 0x0008, 0x58f2, 0x000b, 0x8054, 0x0008, -+ 0x0002, 0x0000, 0x1242, 0x0002, 0x0940, 0x0003, 0x3a45, 0x000a, -+ 0x092f, 0x0003, 0x8072, 0x0000, 0x1000, 0x0000, 0x3945, 0x000a, -+ 0x08ff, 0x0003, 0x8072, 0x0000, 0x3010, 0x0000, 0x1e10, 0x000a, -+ 0x7f3c, 0x0000, 0x092a, 0x0003, 0x1d00, 0x0002, 0x7f3a, 0x0000, -+ 0x0d60, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, -+ 0x4508, 0x000b, 0x00fe, 0x0000, 0x3527, 0x000b, 0x1c60, 0x0000, -+ 0x8062, 0x0008, 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, -+ 0x4510, 0x000b, 0x00fe, 0x0000, 0x3243, 0x000b, 0x0038, 0x0000, -+ 0x0060, 0x0008, 0x8062, 0x0008, 0x0019, 0x0000, 0x8066, 0x0000, -+ 0x0009, 0x0008, 0x4519, 0x000b, 0x80c0, 0x0009, 0x00ff, 0x0008, -+ 0x7f3e, 0x0008, 0x0d60, 0x0000, 0x0efe, 0x0008, 0x1f80, 0x0001, -+ 0x7f62, 0x0008, 0x8066, 0x0000, 0x0009, 0x0008, 0x4523, 0x000b, -+ 0x003a, 0x0008, 0x1dfe, 0x0000, 0x0104, 0x000b, 0x0036, 0x0008, -+ 0x00c8, 0x000c, 0x0140, 0x000b, 0x8074, 0x0000, 0x2000, 0x0000, -+ 0x8072, 0x0000, 0x2000, 0x0000, 0x0140, 0x000b, 0x3a44, 0x0002, -+ 0x0a71, 0x000b, 0x8074, 0x0000, 0x1000, 0x0000, 0x8072, 0x0000, -+ 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, 0x0000, 0x3640, 0x0003, -+ 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, 0x0008, 0x2700, 0x0008, -+ 0x00d0, 0x0009, 0x0d52, 0x000b, 0x8074, 0x0000, 0x4040, 0x0008, -+ 0x5940, 0x0003, 0x50ee, 0x000b, 0x3a46, 0x000a, 0x0d52, 0x000b, -+ 0x3a47, 0x0002, 0x094d, 0x000b, 0x8054, 0x0008, 0x0004, 0x0000, -+ 0x8074, 0x0000, 0x8000, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, -+ 0x019c, 0x0003, 0x92c0, 0x0009, 0x0fc8, 0x0000, 0x080a, 0x0003, -+ 0x1246, 0x000a, 0x0e3a, 0x0003, 0x1a60, 0x0000, 0x8062, 0x0008, -+ 0x0002, 0x0000, 0x8066, 0x0000, 0x362a, 0x0000, 0x4557, 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, 0x4571, 0x0003, 0x92c0, 0x0009, 0x0780, 0x0008, -+ 0x0e56, 0x0003, 0x124b, 0x0002, 0x097a, 0x0003, 0x2e4d, 0x0002, -+ 0x2e4d, 0x0002, 0x0a40, 0x0003, 0x3a46, 0x000a, 0x0d8a, 0x000b, -+ 0x597c, 0x0003, 0x8054, 0x0008, 0x0004, 0x0000, 0x1243, 0x000a, -+ 0x0998, 0x0003, 0x8010, 0x0008, 0x000d, 0x0000, 0x021b, 0x000c, -+ 0x1948, 0x000a, 0x0987, 0x000b, 0x0210, 0x0004, 0x1810, 0x0000, -+ 0x021b, 0x000c, 0x0198, 0x000b, 0x1948, 0x000a, 0x098e, 0x000b, -+ 0x1243, 0x000a, 0x0a43, 0x0003, 0x194d, 0x000a, 0x0992, 0x0003, -+ 0x1243, 0x000a, 0x0a4a, 0x0003, 0x5992, 0x0003, 0x8054, 0x0008, -+ 0x0004, 0x0000, 0x0210, 0x0004, 0x1810, 0x0000, 0x021b, 0x000c, -+ 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0x3000, 0x0008, -+ 0x0d30, 0x0000, 0x3a42, 0x0002, 0x0da2, 0x000b, 0x15fe, 0x0008, -+ 0x3461, 0x000b, 0x000a, 0x000b, 0x8074, 0x0000, 0x0501, 0x0000, -+ 0x8010, 0x0008, 0x000c, 0x0008, 0x021b, 0x000c, 0x000a, 0x000b, -+ 0xbbe0, 0x0009, 0x0030, 0x0008, 0x0db8, 0x0003, 0x18fe, 0x0000, -+ 0x3ce0, 0x0009, 0x09b5, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, -+ 0x09b5, 0x0003, 0x020b, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, -+ 0x0208, 0x000b, 0x8076, 0x0008, 0x0041, 0x0008, 0x0208, 0x000b, -+ 0xbbe0, 0x0009, 0x0032, 0x0000, 0x0dbd, 0x0003, 0x3c1e, 0x0008, -+ 0x0208, 0x000b, 0xbbe0, 0x0009, 0x003b, 0x0000, 0x0dc2, 0x000b, -+ 0x3c20, 0x0000, 0x0208, 0x000b, 0xbbe0, 0x0009, 0x0035, 0x0008, -+ 0x0dc8, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, 0x0384, 0x000b, -+ 0xbbe0, 0x0009, 0x0036, 0x0008, 0x0aa5, 0x000b, 0xbbe0, 0x0009, -+ 0x0037, 0x0000, 0x0de9, 0x000b, 0x18fe, 0x0000, 0x3ce0, 0x0009, -+ 0x0db5, 0x000b, 0x8076, 0x0008, 0x0040, 0x0000, 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, -+ 0x45e0, 0x000b, 0x0210, 0x0004, 0x8054, 0x0008, 0x0004, 0x0000, -+ 0x8074, 0x0000, 0xf000, 0x0008, 0x8072, 0x0000, 0xb000, 0x0000, -+ 0x019c, 0x0003, 0xbbe0, 0x0009, 0x0038, 0x0000, 0x0dfb, 0x000b, -+ 0x18fe, 0x0000, 0x3ce0, 0x0009, 0x09f8, 0x0003, 0x15fe, 0x0008, -+ 0x3ce0, 0x0009, 0x0db1, 0x0003, 0x020b, 0x0004, 0x8076, 0x0008, -+ 0x0040, 0x0000, 0x8072, 0x0000, 0x8000, 0x0000, 0x0268, 0x000b, -+ 0x8076, 0x0008, 0x0042, 0x0008, 0x0208, 0x000b, 0xbbe0, 0x0009, -+ 0x0016, 0x0000, 0x0e08, 0x000b, 0x8074, 0x0000, 0x0808, 0x0008, -+ 0x3a44, 0x0002, 0x0c0c, 0x000b, 0x8074, 0x0000, 0x0800, 0x0000, -+ 0x8072, 0x0000, 0x8000, 0x0000, 0x8000, 0x000f, 0x000a, 0x000b, -+ 0x8072, 0x0000, 0x8000, 0x0000, 0x000a, 0x000b, 0x3d30, 0x000a, -+ 0x7f00, 0x0000, 0xbc80, 0x0001, 0x0007, 0x0000, 0x0214, 0x0003, -+ 0x1930, 0x000a, 0x7f00, 0x0000, 0x9880, 0x0001, 0x0007, 0x0000, -+ 0x8060, 0x0000, 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, -+ 0x000a, 0x0008, 0x4619, 0x000b, 0x4000, 0x000f, 0x221e, 0x000b, -+ 0x0870, 0x0008, 0x4000, 0x000f, 0x7e1b, 0x000b, 0xbbe0, 0x0009, -+ 0x0030, 0x0008, 0x0e1b, 0x0003, 0x18fe, 0x0000, 0x3ce0, 0x0009, -+ 0x0a2c, 0x0003, 0x15fe, 0x0008, 0x3ce0, 0x0009, 0x0a2c, 0x0003, -+ 0x020b, 0x0004, 0x8076, 0x0008, 0x0040, 0x0000, 0x022e, 0x0003, -+ 0x8076, 0x0008, 0x0041, 0x0008, 0x8072, 0x0000, 0x8000, 0x0000, -+ 0x021b, 0x0003, 0xbac0, 0x0009, 0x0090, 0x0008, 0x0a37, 0x0003, -+ 0x8074, 0x0000, 0x0706, 0x0000, 0x0239, 0x0003, 0x8074, 0x0000, -+ 0x0703, 0x0000, 0x4000, 0x000f, 0x8010, 0x0008, 0x0023, 0x0000, -+ 0x0276, 0x000b, 0x8010, 0x0008, 0x0008, 0x0000, 0x0276, 0x000b, -+ 0x8010, 0x0008, 0x0022, 0x0008, 0x0276, 0x000b, 0x0210, 0x0004, -+ 0x8010, 0x0008, 0x0007, 0x0000, 0x021b, 0x000c, 0x1810, 0x0000, -+ 0x021b, 0x000c, 0x0282, 0x0003, 0x0210, 0x0004, 0x8010, 0x0008, -+ 0x001b, 0x0008, 0x021b, 0x000c, 0x1810, 0x0000, 0x021b, 0x000c, -+ 0x8074, 0x0000, 0xf080, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, -+ 0x0d30, 0x0000, 0x000a, 0x000b, 0x8010, 0x0008, 0x0009, 0x0008, -+ 0x0276, 0x000b, 0x8010, 0x0008, 0x0005, 0x0008, 0x0276, 0x000b, -+ 0x1648, 0x000a, 0x0c6f, 0x000b, 0x808c, 0x0008, 0x0001, 0x0000, -+ 0x8010, 0x0008, 0x0004, 0x0000, 0x4143, 0x000a, 0x086f, 0x0003, -+ 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x0d2a, 0x0008, 0x0276, 0x000b, -+ 0x8010, 0x0008, 0x0003, 0x0008, 0x027a, 0x000b, 0x8010, 0x0008, -+ 0x000b, 0x0000, 0x027a, 0x000b, 0x8010, 0x0008, 0x0002, 0x0000, -+ 0x027a, 0x000b, 0x3a47, 0x0002, 0x0d40, 0x000b, 0x8010, 0x0008, -+ 0x0006, 0x0008, 0x027a, 0x000b, 0x8074, 0x0000, 0xf000, 0x0008, -+ 0x8072, 0x0000, 0x3000, 0x0008, 0x021b, 0x000c, 0x0231, 0x0004, -+ 0x3a40, 0x000a, 0x080a, 0x0003, 0x8010, 0x0008, 0x000c, 0x0008, -+ 0x021b, 0x000c, 0x000a, 0x000b, 0x8074, 0x0000, 0xf080, 0x0000, -+ 0x8072, 0x0000, 0x3000, 0x0008, 0x0d30, 0x0000, 0x2e4d, 0x0002, -+ 0x2e4d, 0x0002, 0x0a8d, 0x000b, 0x8054, 0x0008, 0x0019, 0x0000, -+ 0x000a, 0x000b, 0x8054, 0x0008, 0x0009, 0x0008, 0x000a, 0x000b, -+ 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x026b, 0x000b, 0x808c, 0x0008, -+ 0x0000, 0x0008, 0x4447, 0x0002, 0x0ab9, 0x0003, 0xc0c0, 0x0001, -+ 0x00ff, 0x0008, 0xffe0, 0x0009, 0x00ff, 0x0008, 0x0e90, 0x0003, -+ 0xc1e0, 0x0001, 0xffff, 0x0008, 0x0e90, 0x0003, 0x8010, 0x0008, -+ 0x0013, 0x0000, 0x021b, 0x000c, 0x8074, 0x0000, 0x0202, 0x0008, -+ 0x000a, 0x000b, 0x3a40, 0x000a, 0x0eb6, 0x000b, 0x8074, 0x0000, -+ 0x0200, 0x0000, 0x3d00, 0x0000, 0x3cfe, 0x0000, 0x8072, 0x0000, -+ 0x8000, 0x0000, 0x43e0, 0x0001, 0x0eb4, 0x0003, 0x42fe, 0x0000, -+ 0xffc0, 0x0001, 0x00ff, 0x0008, 0x00e0, 0x0009, 0x0a90, 0x000b, -+ 0x0d08, 0x0008, 0x0309, 0x000b, 0x8072, 0x0000, 0x8000, 0x0000, -+ 0x000a, 0x000b, 0x038d, 0x0004, 0x808c, 0x0008, 0x0001, 0x0000, -+ 0x04fe, 0x0008, 0x3370, 0x0003, 0x0460, 0x0000, 0x8062, 0x0008, -+ 0x0001, 0x0000, 0x8066, 0x0000, 0x0009, 0x0008, 0x46c3, 0x0003, -+ 0x0004, 0x0000, 0x80c0, 0x0009, 0x00ff, 0x0008, 0x7f00, 0x0000, -+ 0x80e0, 0x0001, 0x0004, 0x0000, 0x0add, 0x000b, 0x80e0, 0x0001, -+ 0x0005, 0x0008, 0x0add, 0x000b, 0x80e0, 0x0001, 0x0006, 0x0008, -+ 0x0add, 0x000b, 0x82c0, 0x0001, 0xff00, 0x0008, 0x7f04, 0x0008, -+ 0x82e0, 0x0009, 0x0600, 0x0008, 0x0add, 0x000b, 0x82e0, 0x0009, -+ 0x0500, 0x0008, 0x0add, 0x000b, 0x82e0, 0x0009, 0x0400, 0x0000, -+ 0x0f70, 0x0003, 0xc4c0, 0x0009, 0x7000, 0x0000, 0xffe0, 0x0009, -+ 0x1000, 0x0000, 0x0b09, 0x0003, 0x037e, 0x0004, 0x3941, 0x0002, -+ 0x0ae8, 0x000b, 0x8072, 0x0000, 0x0400, 0x0000, 0x000a, 0x000b, -+ 0x0460, 0x0000, 0x80fe, 0x0008, 0x002b, 0x0008, 0x7f62, 0x0008, -+ 0x8066, 0x0000, 0x2209, 0x0008, 0x46ee, 0x0003, 0x11fe, 0x0000, -+ 0x3304, 0x0003, 0x9180, 0x0001, 0x0002, 0x0000, 0x8060, 0x0000, -+ 0x0400, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0609, 0x0008, -+ 0x46f8, 0x000b, 0x42fe, 0x0000, 0xffc0, 0x0001, 0xff00, 0x0008, -+ 0x03e0, 0x0009, 0x0f01, 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, -+ 0x0046, 0x0003, 0x9180, 0x0001, 0x0003, 0x0008, 0x02eb, 0x0003, -+ 0x8072, 0x0000, 0x0400, 0x0000, 0x8010, 0x0008, 0x0010, 0x0000, -+ 0x0361, 0x0003, 0x037e, 0x0004, 0x3941, 0x0002, 0x0b0f, 0x0003, -+ 0x8072, 0x0000, 0x0400, 0x0000, 0x000a, 0x000b, 0x0346, 0x000c, -+ 0x11fe, 0x0000, 0x3717, 0x0003, 0x8072, 0x0000, 0x0400, 0x0000, -+ 0x8010, 0x0008, 0x000e, 0x0000, 0x0361, 0x0003, 0x8060, 0x0000, -+ 0x0400, 0x0000, 0x04fe, 0x0008, 0x372c, 0x000b, 0x808c, 0x0008, -+ 0x0000, 0x0008, 0x9180, 0x0001, 0x0005, 0x0008, 0x7f62, 0x0008, -+ 0x8066, 0x0000, 0x0009, 0x0008, 0x4722, 0x000b, 0x0060, 0x0008, -+ 0x8062, 0x0008, 0x001b, 0x0008, 0x4304, 0x0008, 0x4206, 0x0008, -+ 0x8066, 0x0000, 0x0412, 0x0000, 0x472a, 0x0003, 0x0343, 0x0003, -+ 0x808c, 0x0008, 0x0001, 0x0000, 0x0460, 0x0000, 0x8062, 0x0008, -+ 0x002b, 0x0008, 0x8066, 0x0000, 0x0609, 0x0008, 0x4733, 0x000b, -+ 0x8066, 0x0000, 0x220a, 0x0008, 0x4736, 0x000b, 0x42fe, 0x0000, -+ 0xffc0, 0x0001, 0xff00, 0x0008, 0x7f04, 0x0008, 0x8060, 0x0000, -+ 0x0400, 0x0000, 0x9180, 0x0001, 0x0002, 0x0000, 0x7f62, 0x0008, -+ 0x8066, 0x0000, 0x041a, 0x0008, 0x4742, 0x000b, 0x8072, 0x0000, -+ 0x0400, 0x0000, 0x0046, 0x0003, 0x8060, 0x0000, 0x0400, 0x0000, -+ 0x1362, 0x0008, 0x8066, 0x0000, 0x0411, 0x0000, 0x474b, 0x000b, -+ 0x02fe, 0x0008, 0x03e0, 0x0009, 0x0f51, 0x0003, 0x0d22, 0x0000, -+ 0x4000, 0x000f, 0x8280, 0x0009, 0x0002, 0x0000, 0x1380, 0x0001, -+ 0x7f62, 0x0008, 0x8066, 0x0000, 0x2209, 0x0008, 0x4757, 0x0003, -+ 0x0200, 0x000a, 0xffc0, 0x0001, 0x0007, 0x0000, 0x7f06, 0x0000, -+ 0x1362, 0x0008, 0x8066, 0x0000, 0x060a, 0x0008, 0x475f, 0x000b, -+ 0x4000, 0x000f, 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x2f44, 0x000a, -+ 0x2f44, 0x000a, 0x0e6b, 0x000b, 0x808a, 0x0008, 0x0003, 0x0008, -+ 0x8074, 0x0000, 0xf080, 0x0000, 0x8072, 0x0000, 0x3000, 0x0008, -+ 0x5b6c, 0x0003, 0x8054, 0x0008, 0x0019, 0x0000, 0x000a, 0x000b, -+ 0x3a44, 0x0002, 0x0c0a, 0x000b, 0x808c, 0x0008, 0x0000, 0x0008, -+ 0x8010, 0x0008, 0x0011, 0x0008, 0x021b, 0x000c, 0x42fe, 0x0000, -+ 0xffc0, 0x0001, 0x00ff, 0x0008, 0x7f10, 0x0008, 0x021b, 0x000c, -+ 0x4310, 0x0008, 0x027a, 0x000b, 0x3941, 0x0002, 0x0b81, 0x0003, -+ 0x4000, 0x000f, 0x8072, 0x0000, 0x0404, 0x0008, 0x4000, 0x000f, -+ 0x8010, 0x0008, 0x0012, 0x0008, 0x021b, 0x000c, 0x0346, 0x000c, -+ 0x1110, 0x0000, 0x021b, 0x000c, 0x11fe, 0x0000, 0x3787, 0x0003, -+ 0x000a, 0x000b, 0xc2c0, 0x0009, 0x00ff, 0x0008, 0x7f00, 0x0000, -+ 0xc3c0, 0x0001, 0xff00, 0x0008, 0x00d0, 0x0009, 0x0bb2, 0x0003, -+ 0x0d0a, 0x0000, 0x8580, 0x0001, 0x1000, 0x0000, 0x7f62, 0x0008, -+ 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, 0x0000, 0x0809, 0x0000, -+ 0x479c, 0x000b, 0x04fe, 0x0008, 0x33ab, 0x0003, 0x0460, 0x0000, -+ 0x8062, 0x0008, 0x0004, 0x0000, 0x8066, 0x0000, 0x0211, 0x0000, -+ 0x47a4, 0x0003, 0x01fe, 0x0008, 0x00e0, 0x0009, 0x0fab, 0x0003, -+ 0x02fe, 0x0008, 0x43e0, 0x0001, 0x0bb1, 0x0003, 0x0500, 0x0002, -+ 0x7f0a, 0x0000, 0xffe0, 0x0009, 0x0800, 0x0000, 0x0f95, 0x000b, -+ 0x0d08, 0x0008, 0x4000, 0x000f, 0x43fe, 0x0008, 0x3e80, 0x0001, -+ 0xffc0, 0x0001, 0x7fff, 0x0000, 0x0d60, 0x0000, 0x7f62, 0x0008, -+ 0x8066, 0x0000, 0x0809, 0x0000, 0x47ba, 0x0003, 0x8060, 0x0000, -+ 0x0400, 0x0000, 0x84c0, 0x0001, 0xff00, 0x0008, 0x7f60, 0x000a, -+ 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, -+ 0x7f60, 0x000a, 0x7f60, 0x000a, 0x7f60, 0x000a, 0xff80, 0x0009, -+ 0x1000, 0x0000, 0x7f62, 0x0008, 0x8066, 0x0000, 0x0809, 0x0000, -+ 0x47cc, 0x000b, 0x4000, 0x000f, 0x5ff4, 0xebed, 0x0001, 0x0002, -+ 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, -+ 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000, 0x2c40 -+}; -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2300ipx_length01 = 0xe9c7; -+#else -+unsigned short risc_code_length01 = 0xe9c7; -+#endif -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2322flx_fw.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2322flx_fw.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2322flx_fw.h 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2322flx_fw.h 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,7401 @@ -+/************************************************************************ -+ * * -+ * --- ISP2322 Initiator/Target Firmware --- * -+ * with Fabric (Public Loop), Point-point, * -+ * expanded LUN addressing for FCTAPE, and 2K port logins * -+ * FibreLite enabled * -+ * * -+ ********************************************************************** */ -+/* -+ * Firmware Version 3.02.28 (14:05 Apr 03, 2004) -+ */ -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2322flx_version = 3*1024+2; -+#else -+unsigned short risc_code_version = 3*1024+2; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned char fw2322flx_version_str[] = {3, 2,28}; -+#else -+unsigned char firmware_version[] = {3, 2,28}; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+#define fw2322flx_VERSION_STRING "3.02.28" -+#else -+#define FW_VERSION_STRING "3.02.28" -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2322flx_addr01 = 0x0800 ; -+#else -+unsigned short risc_code_addr01 = 0x0800 ; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2322flx_code01[] = { -+#else -+unsigned short risc_code01[] = { -+#endif -+ 0x0470, 0x0000, 0x0000, 0xce3b, 0x0000, 0x0003, 0x0002, 0x001c, -+ 0x0317, 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, 0x2e32, 0x3820, 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, 0x20c9, 0x1cff, 0x2059, 0x0000, 0x2b78, -+ 0x7883, 0x0004, 0x2089, 0x28de, 0x2051, 0x1800, 0x2a70, 0x20e1, -+ 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e3d, 0x00f6, -+ 0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x1efc, 0x1170, -+ 0x2079, 0x0300, 0x080c, 0x1f12, 0x2061, 0xe000, 0x080c, 0x1efc, -+ 0x1128, 0x2079, 0x0380, 0x080c, 0x1f12, 0x0060, 0x00fe, 0x7883, -+ 0x4010, 0x7837, 0x4010, 0x7833, 0x0010, 0x2091, 0x5000, 0x2091, -+ 0x4080, 0x0cf8, 0x00fe, 0x2029, 0x26c0, 0x2031, 0xffff, 0x2039, -+ 0x269c, 0x2021, 0x0050, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9, -+ 0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e, -+ 0x2001, 0x0dc1, 0x9084, 0x0fff, 0x20a8, 0x4104, 0x2001, 0x0000, -+ 0x9086, 0x0000, 0x0120, 0x21a8, 0x4104, 0x8001, 0x1de0, 0x756a, -+ 0x766e, 0x7766, 0x7472, 0x7476, 0x00e6, 0x2071, 0x1b1e, 0x2472, -+ 0x00ee, 0x20a1, 0x1ddc, 0x716c, 0x810d, 0x810d, 0x810d, 0x810d, -+ 0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104, -+ 0x8211, 0x1de0, 0x716c, 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, 0x0f3a, 0x080c, 0x5cea, 0x080c, 0x9b7d, 0x080c, -+ 0x10f1, 0x080c, 0x12d6, 0x080c, 0x1a5a, 0x080c, 0x8440, 0x080c, -+ 0x0cf7, 0x080c, 0x1076, 0x080c, 0x328b, 0x080c, 0x73cb, 0x080c, -+ 0x6722, 0x080c, 0x808a, 0x080c, 0x20dd, 0x080c, 0x7a5f, 0x080c, -+ 0x1f2b, 0x080c, 0x2065, 0x080c, 0x20d2, 0x2091, 0x3009, 0x7883, -+ 0x0000, 0x1004, 0x0941, 0x7880, 0x9086, 0x0002, 0x1190, 0x7883, -+ 0x4000, 0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, 0x0935, 0x2091, -+ 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, -+ 0x11be, 0x2071, 0x1800, 0x7003, 0x0000, 0x2071, 0x1800, 0x7000, -+ 0x908e, 0x0003, 0x1158, 0x080c, 0x499d, 0x080c, 0x32b2, 0x080c, -+ 0x7433, 0x080c, 0x6bca, 0x080c, 0x80b3, 0x0c78, 0x000b, 0x0c98, -+ 0x0962, 0x0963, 0x0afa, 0x0960, 0x0bab, 0x0cf6, 0x0cf6, 0x0cf6, -+ 0x080c, 0x0d65, 0x0005, 0x0126, 0x00f6, 0x2091, 0x8000, 0x7000, -+ 0x9086, 0x0001, 0x1904, 0x0acd, 0x080c, 0x0e8d, 0x080c, 0x70b7, -+ 0x0150, 0x080c, 0x70da, 0x15b0, 0x2079, 0x0100, 0x7828, 0x9085, -+ 0x1800, 0x782a, 0x0478, 0x080c, 0x6fe8, 0x7000, 0x9086, 0x0001, -+ 0x1904, 0x0acd, 0x7094, 0x9086, 0x0028, 0x1904, 0x0acd, 0x080c, -+ 0x8082, 0x080c, 0x8074, 0x2001, 0x0161, 0x2003, 0x0001, 0x2079, -+ 0x0100, 0x2011, 0xffff, 0x080c, 0x286d, 0x7a28, 0x9295, 0x5e2c, -+ 0x7a2a, 0x2011, 0x6f2d, 0x080c, 0x8159, 0x2011, 0x6f20, 0x080c, -+ 0x825f, 0x2011, 0x5b41, 0x080c, 0x8159, 0x2011, 0x8030, 0x901e, -+ 0x7392, 0x04d0, 0x080c, 0x53ee, 0x2079, 0x0100, 0x7844, 0x9005, -+ 0x1904, 0x0acd, 0x2011, 0x5b41, 0x080c, 0x8159, 0x2011, 0x6f2d, -+ 0x080c, 0x8159, 0x2011, 0x6f20, 0x080c, 0x825f, 0x2001, 0x0265, -+ 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, 0x9084, 0xfffb, 0x7842, -+ 0x2001, 0x1977, 0x2004, 0x9005, 0x1140, 0x00c6, 0x2061, 0x0100, -+ 0x080c, 0x5c92, 0x00ce, 0x0804, 0x0acd, 0x780f, 0x006b, 0x7a28, -+ 0x080c, 0x70bf, 0x0118, 0x9295, 0x5e2c, 0x0010, 0x9295, 0x402c, -+ 0x7a2a, 0x2011, 0x8010, 0x73d4, 0x2001, 0x1978, 0x2003, 0x0001, -+ 0x080c, 0x273f, 0x080c, 0x48d8, 0x7244, 0xc284, 0x7246, 0x2001, -+ 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, 0x2001, 0x0390, 0x2003, -+ 0x0400, 0x080c, 0x98c8, 0x080c, 0x91e1, 0x2011, 0x0004, 0x080c, -+ 0xb857, 0x080c, 0x98e4, 0x080c, 0x6562, 0x080c, 0x70b7, 0x1120, -+ 0x080c, 0x279a, 0x0600, 0x0420, 0x080c, 0x5c99, 0x0140, 0x7093, -+ 0x0001, 0x70cf, 0x0000, 0x080c, 0x55bb, 0x0804, 0x0acd, 0x080c, -+ 0x538d, 0xd094, 0x01a8, 0x2001, 0x0390, 0x2003, 0x0404, 0x2011, -+ 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, 0x5391, 0xd0d4, 0x1118, -+ 0x080c, 0x279a, 0x1270, 0x2011, 0x180c, 0x2204, 0xc0bc, 0x0088, -+ 0x080c, 0x5391, 0xd0d4, 0x1db8, 0x2011, 0x180c, 0x2204, 0xc0bd, -+ 0x0040, 0x2011, 0x180c, 0x2204, 0xc0bd, 0x2012, 0x080c, 0x665f, -+ 0x0008, 0x2012, 0x080c, 0x6625, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, -+ 0x00a8, 0x707b, 0x0000, 0x080c, 0x70b7, 0x1130, 0x70ac, 0x9005, -+ 0x1168, 0x080c, 0xbcae, 0x0050, 0x080c, 0xbcae, 0x70d8, 0xd09c, -+ 0x1128, 0x70ac, 0x9005, 0x0110, 0x080c, 0x5c6f, 0x70e3, 0x0000, -+ 0x70df, 0x0000, 0x70a3, 0x0000, 0x080c, 0x27a2, 0x0228, 0x2011, -+ 0x0101, 0x2204, 0xc0c4, 0x2012, 0x72d8, 0x080c, 0x70b7, 0x1178, -+ 0x9016, 0x0016, 0x2009, 0x0002, 0x2019, 0x193e, 0x211a, 0x001e, -+ 0x705b, 0xffff, 0x705f, 0x00ef, 0x707f, 0x0000, 0x0020, 0x2019, -+ 0x193e, 0x201b, 0x0000, 0x2079, 0x1853, 0x7804, 0xd0ac, 0x0108, -+ 0xc295, 0x72da, 0x080c, 0x70b7, 0x0118, 0x9296, 0x0004, 0x0518, -+ 0x2011, 0x0001, 0x080c, 0xb857, 0x70a7, 0x0000, 0x70ab, 0xffff, -+ 0x7003, 0x0002, 0x00fe, 0x080c, 0x2ddb, 0x080c, 0x98c8, 0x2011, -+ 0x0005, 0x080c, 0x9339, 0x080c, 0x98e4, 0x080c, 0x70b7, 0x0148, -+ 0x00c6, 0x2061, 0x0100, 0x0016, 0x2009, 0x0002, 0x61e2, 0x001e, -+ 0x00ce, 0x012e, 0x00e0, 0x70a7, 0x0000, 0x70ab, 0xffff, 0x7003, -+ 0x0002, 0x080c, 0x98c8, 0x2011, 0x0005, 0x080c, 0x9339, 0x080c, -+ 0x98e4, 0x080c, 0x70b7, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, -+ 0x2009, 0x0002, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, -+ 0x00c6, 0x00b6, 0x080c, 0x70b7, 0x1118, 0x20a9, 0x0800, 0x0010, -+ 0x20a9, 0x0782, 0x080c, 0x70b7, 0x1110, 0x900e, 0x0010, 0x2009, -+ 0x007e, 0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, -+ 0xb800, 0xd0bc, 0x090c, 0x311a, 0x8108, 0x1f04, 0x0ae1, 0x707b, -+ 0x0000, 0x707c, 0x9084, 0x00ff, 0x707e, 0x70af, 0x0000, 0x00be, -+ 0x00ce, 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, -+ 0x0002, 0x1904, 0x0ba8, 0x70a8, 0x9086, 0xffff, 0x0120, 0x080c, -+ 0x2ddb, 0x0804, 0x0ba8, 0x70d8, 0xd0ac, 0x1110, 0xd09c, 0x0520, -+ 0xd084, 0x0510, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, -+ 0xd08c, 0x01d0, 0x70dc, 0x9086, 0xffff, 0x0190, 0x080c, 0x2f66, -+ 0x70d8, 0xd094, 0x1904, 0x0ba8, 0x2011, 0x0001, 0x080c, 0xbf61, -+ 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x2fa0, 0x0804, 0x0ba8, -+ 0x70e0, 0x9005, 0x1904, 0x0ba8, 0x70a4, 0x9005, 0x1904, 0x0ba8, -+ 0x70d8, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0ba8, 0x080c, 0x6625, -+ 0x1904, 0x0ba8, 0x080c, 0x6678, 0x1904, 0x0ba8, 0x080c, 0x665f, -+ 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, -+ 0x6270, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, 0x8108, 0x1f04, -+ 0x0b4e, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, 0x015e, 0x0804, -+ 0x0ba8, 0x0006, 0x2001, 0x0103, 0x2003, 0x006b, 0x000e, 0x2011, -+ 0x1984, 0x080c, 0x0faa, 0x2011, 0x199e, 0x080c, 0x0faa, 0x7030, -+ 0xc08c, 0x7032, 0x7003, 0x0003, 0x70ab, 0xffff, 0x080c, 0x0e61, -+ 0x9006, 0x080c, 0x23c9, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, -+ 0x0006, 0x080c, 0x4a75, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, -+ 0x080c, 0x70da, 0x0150, 0x080c, 0x70b7, 0x7828, 0x0118, 0x9084, -+ 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0x98c8, -+ 0x2001, 0x19b9, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000, -+ 0x080c, 0x9339, 0x2011, 0x0000, 0x080c, 0x9343, 0x080c, 0x98e4, -+ 0x012e, 0x00be, 0x0005, 0x0016, 0x0026, 0x0046, 0x00f6, 0x0126, -+ 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, -+ 0x2009, 0x00f7, 0x080c, 0x5c58, 0x7940, 0x918c, 0x0010, 0x7942, -+ 0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x286d, 0xd19c, -+ 0x0120, 0x2011, 0x0008, 0x080c, 0x286d, 0x0006, 0x0036, 0x0156, -+ 0x0000, 0x2001, 0x1978, 0x2004, 0x9005, 0x1518, 0x080c, 0x2801, -+ 0x1148, 0x2001, 0x0001, 0x080c, 0x276e, 0x2001, 0x0001, 0x080c, -+ 0x2751, 0x00b8, 0x080c, 0x2809, 0x1138, 0x9006, 0x080c, 0x276e, -+ 0x9006, 0x080c, 0x2751, 0x0068, 0x080c, 0x2811, 0x1d50, 0x2001, -+ 0x1969, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x2568, 0x0804, -+ 0x0ca9, 0x080c, 0x2890, 0x080c, 0x28d4, 0x20a9, 0x003a, 0x1d04, -+ 0x0bff, 0x080c, 0x823f, 0x1f04, 0x0bff, 0x080c, 0x70c8, 0x0148, -+ 0x080c, 0x70da, 0x1118, 0x080c, 0x73c6, 0x0050, 0x080c, 0x70bf, -+ 0x0dd0, 0x080c, 0x73c1, 0x080c, 0x73b7, 0x080c, 0x6fe8, 0x0020, -+ 0x2009, 0x00f8, 0x080c, 0x5c58, 0x7850, 0xc0e5, 0x7852, 0x080c, -+ 0x70b7, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, -+ 0x2019, 0xea60, 0x0d0c, 0x823f, 0x7820, 0xd09c, 0x15a0, 0x080c, -+ 0x70b7, 0x0904, 0x0c8b, 0x7824, 0xd0ac, 0x1904, 0x0cae, 0x080c, -+ 0x70da, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, -+ 0x2011, 0x1800, 0x080c, 0x286d, 0x080c, 0x2819, 0x7824, 0x9084, -+ 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, 0x2004, -+ 0x9084, 0x9000, 0x0110, 0x080c, 0x0cd1, 0x8421, 0x1160, 0x1d04, -+ 0x0c5b, 0x080c, 0x823f, 0x080c, 0x73c1, 0x080c, 0x73b7, 0x7003, -+ 0x0001, 0x0804, 0x0cae, 0x8319, 0x1928, 0x2001, 0x1810, 0x2004, -+ 0x9084, 0x9000, 0x0110, 0x080c, 0x0cd1, 0x1d04, 0x0c71, 0x080c, -+ 0x823f, 0x2009, 0x196c, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, -+ 0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x286d, 0x20a9, -+ 0x0002, 0x080c, 0x27fa, 0x7924, 0x080c, 0x2819, 0xd19c, 0x0110, -+ 0x080c, 0x273f, 0x00f0, 0x080c, 0x70c8, 0x1140, 0x94a2, 0x03e8, -+ 0x1128, 0x080c, 0x708b, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800, -+ 0x080c, 0x286d, 0x080c, 0x2819, 0x7824, 0x080c, 0x70d1, 0x0110, -+ 0xd0ac, 0x1160, 0x9084, 0x1800, 0x0904, 0x0c63, 0x7003, 0x0001, -+ 0x0028, 0x2001, 0x0001, 0x080c, 0x23c9, 0x00a0, 0x7850, 0xc0e4, -+ 0x7852, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, -+ 0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x286d, 0x7828, 0x9085, -+ 0x0028, 0x782a, 0x2001, 0x1978, 0x2003, 0x0000, 0x9006, 0x78f2, -+ 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x002e, 0x001e, -+ 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x0046, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x823f, 0x015e, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x002e, -+ 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x1894, 0x7004, 0x9086, -+ 0x0001, 0x1110, 0x080c, 0x32b2, 0x00ee, 0x0005, 0x0005, 0x2a70, -+ 0x2061, 0x197c, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x001c, -+ 0x600f, 0x0317, 0x2001, 0x194d, 0x900e, 0x2102, 0x7192, 0x2001, -+ 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705b, 0xffff, 0x0008, -+ 0x715a, 0x7063, 0xffff, 0x717a, 0x717e, 0x080c, 0xbcae, 0x70eb, -+ 0x00c0, 0x2061, 0x193d, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, -+ 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x000f, 0x611a, 0x601f, -+ 0x07d0, 0x2061, 0x1945, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, -+ 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, -+ 0x195a, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, -+ 0x2020, 0x2001, 0x182b, 0x2102, 0x0005, 0x9016, 0x080c, 0x6270, -+ 0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, -+ 0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, -+ 0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, -+ 0x2079, 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, -+ 0x0d67, 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, 0x1af4, 0x7a08, -+ 0x226a, 0x2069, 0x1af5, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, -+ 0x782c, 0x2019, 0x1b02, 0x201a, 0x2019, 0x1b05, 0x9016, 0x7808, -+ 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b1e, -+ 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, -+ 0x1b03, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, -+ 0x1a4a, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, -+ 0x8318, 0x1f04, 0x0db4, 0x0491, 0x002e, 0x003e, 0x00de, 0x015e, -+ 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, -+ 0x2004, 0xd084, 0x0180, 0x2001, 0x19f3, 0x2004, 0x9005, 0x0128, -+ 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, -+ 0x0002, 0x2003, 0x1001, 0x080c, 0x539c, 0x1170, 0x080c, 0x0efb, -+ 0x0110, 0x080c, 0x0e4e, 0x080c, 0x539c, 0x1130, 0x2071, 0x1800, -+ 0x2011, 0x8000, 0x080c, 0x0f0f, 0x0c70, 0x0005, 0x2001, 0x0382, -+ 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1120, 0x2001, 0x0015, -+ 0x080c, 0x98b9, 0x2079, 0x0380, 0x2069, 0x1ad4, 0x7818, 0x6802, -+ 0x781c, 0x6806, 0x7840, 0x680a, 0x7844, 0x680e, 0x782c, 0x6812, -+ 0x2019, 0x1adf, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a, -+ 0x8210, 0x8318, 0x8210, 0x9282, 0x0011, 0x0ea8, 0x2011, 0xdead, -+ 0x6a2a, 0x7830, 0x681a, 0x7834, 0x681e, 0x7838, 0x6822, 0x783c, -+ 0x6826, 0x7803, 0x0000, 0x2069, 0x1a94, 0x901e, 0x20a9, 0x0020, -+ 0x7b26, 0x7828, 0x206a, 0x8d68, 0x8318, 0x1f04, 0x0e28, 0x2069, -+ 0x1ab4, 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a, -+ 0x8d68, 0x8318, 0x1f04, 0x0e35, 0x0005, 0x918c, 0x03ff, 0x2001, -+ 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010, -+ 0x918d, 0x6400, 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126, -+ 0x2011, 0x0080, 0x080c, 0x0eed, 0x20a9, 0x0900, 0x080c, 0x0f23, -+ 0x2011, 0x0040, 0x080c, 0x0eed, 0x20a9, 0x0900, 0x080c, 0x0f23, -+ 0x0c78, 0x0026, 0x080c, 0x0efb, 0x1188, 0x2011, 0x010e, 0x2214, -+ 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0x0947, 0x0010, -+ 0x2011, 0x1b47, 0x080c, 0x0f0f, 0x002e, 0x0005, 0x2011, 0x010e, -+ 0x2214, 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, -+ 0x0010, 0x2011, 0x6840, 0xd0e4, 0x70ef, 0x0000, 0x1128, 0x70ef, -+ 0x0fa0, 0x080c, 0x0f00, 0x002e, 0x0005, 0x0026, 0x080c, 0x0efb, -+ 0x0148, 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, -+ 0x080c, 0x0f00, 0x002e, 0x0005, 0x0026, 0x70ef, 0x0000, 0x080c, -+ 0x0efb, 0x1130, 0x2011, 0x8040, 0x080c, 0x0f0f, 0x002e, 0x0005, -+ 0x080c, 0x2811, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, -+ 0x080c, 0x0f00, 0x002e, 0x0005, 0x00e6, 0x0016, 0x0006, 0x2071, -+ 0x1800, 0xd0b4, 0x70e8, 0x71e4, 0x1118, 0xc0e4, 0xc1f4, 0x0050, -+ 0x0006, 0x3b00, 0x9084, 0xff3e, 0x20d8, 0x000e, 0x70ef, 0x0000, -+ 0xc0e5, 0xc1f5, 0x0099, 0x000e, 0x001e, 0x00ee, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0xd0e4, 0x70e8, 0x1110, 0xc0dc, 0x0008, 0xc0dd, -+ 0x0016, 0x71e4, 0x0019, 0x001e, 0x00ee, 0x0005, 0x70ea, 0x71e6, -+ 0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0eb3, 0x0e8d, 0x0e8d, -+ 0x0e61, 0x0e9c, 0x0e8d, 0x0e8d, 0x0e9c, 0xc284, 0x0016, 0x3b08, -+ 0x3a00, 0x9104, 0x918d, 0x00c1, 0x21d8, 0x9084, 0xff3e, 0x9205, -+ 0x20d0, 0x001e, 0x0005, 0x2001, 0x183a, 0x2004, 0xd0dc, 0x0005, -+ 0x9e86, 0x1800, 0x190c, 0x0d65, 0x70e8, 0xd0e4, 0x0108, 0xc2e5, -+ 0x72ea, 0xd0e4, 0x1118, 0x9294, 0x00c1, 0x08f9, 0x0005, 0x9e86, -+ 0x1800, 0x190c, 0x0d65, 0x70e4, 0xd0f4, 0x0108, 0xc2f5, 0x72e6, -+ 0xd0f4, 0x1140, 0x9284, 0x8000, 0x8005, 0xc284, 0x9215, 0x9294, -+ 0x00c1, 0x0861, 0x0005, 0x1d04, 0x0f23, 0x2091, 0x6000, 0x1f04, -+ 0x0f23, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, -+ 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, -+ 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, 0x1883, -+ 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, 0x1893, 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, 0x0f2a, -+ 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, -+ 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, -+ 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b4, 0x81ff, 0x11c0, 0x9006, -+ 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, -+ 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, -+ 0x7078, 0x8007, 0x717c, 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, -+ 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d45, 0x2001, 0x0000, 0x810f, -+ 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, -+ 0x0000, 0x0006, 0x080c, 0x1054, 0x009e, 0x0cb0, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0x080c, 0x10cd, 0x090c, 0x0d65, 0x00ee, 0x0005, -+ 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, 0x8000, -+ 0x00c9, 0x2071, 0x1800, 0x73bc, 0x702c, 0x9016, 0x9045, 0x0158, -+ 0x8210, 0x9906, 0x090c, 0x0d65, 0x2300, 0x9202, 0x0120, 0x1a0c, -+ 0x0d65, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, -+ 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, -+ 0x2071, 0x1906, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, 0x0128, -+ 0x9906, 0x090c, 0x0d65, 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, 0x080c, 0x8074, 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, 0x1883, 0x7000, -+ 0x9005, 0x11a0, 0x2001, 0x049b, 0xa802, 0x2048, 0x2009, 0x26c0, -+ 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, -+ 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x1883, -+ 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, 0x049b, 0x0288, 0x9982, 0x0800, -+ 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x1883, 0x7010, -+ 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, -+ 0x0cd8, 0x00e6, 0x2071, 0x19f2, 0x7007, 0x0000, 0x9006, 0x701e, -+ 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, 0x7012, -+ 0x2071, 0x0080, 0x9006, 0x20a9, 0x0040, 0x7022, 0x1f04, 0x1105, -+ 0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, -+ 0xa06f, 0x0000, 0x2071, 0x19f2, 0x701c, 0x9088, 0x19fc, 0x280a, -+ 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d65, -+ 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, -+ 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, -+ 0x19f2, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, -+ 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, -+ 0x7007, 0x0006, 0x7000, 0x0002, 0x114e, 0x114c, 0x114c, 0x114c, -+ 0x12c5, 0x12c5, 0x12c5, 0x12c5, 0x080c, 0x0d65, 0x701c, 0x7120, -+ 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, -+ 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x19fc, 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, 0x19f2, -+ 0x2104, 0xc095, 0x200a, 0x080c, 0x112b, 0x0005, 0x0016, 0x00e6, -+ 0x2071, 0x19f2, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, -+ 0x0d5e, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, -+ 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x113c, 0x11e4, 0x1218, -+ 0x0d65, 0x0d65, 0x12d1, 0x0d65, 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, 0x1181, 0x0005, 0x7008, 0x0096, -+ 0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x113c, -+ 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, -+ 0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, -+ 0x7804, 0x7806, 0x080c, 0x1196, 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, 0x18af, 0x2004, 0x9906, 0x1128, 0xa89c, -+ 0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, -+ 0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, -+ 0x008e, 0x00de, 0x009e, 0x080c, 0x112b, 0x0005, 0x00de, 0x009e, -+ 0x080c, 0x112b, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, -+ 0x904d, 0x090c, 0x0d65, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, -+ 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x698a, 0xa09f, -+ 0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x1054, 0x009e, 0x0005, -+ 0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0d65, 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, 0x110c, 0x00e8, 0xa97c, 0xa894, -+ 0x0016, 0x0006, 0x080c, 0x698a, 0x000e, 0x001e, 0xd1fc, 0x1138, -+ 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0x9be7, 0x00ce, 0x7008, -+ 0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x1054, 0x7007, -+ 0x0000, 0x080c, 0x112b, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, -+ 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, -+ 0x0005, 0x7007, 0x0000, 0x080c, 0x113c, 0x0005, 0x0126, 0x2091, -+ 0x2200, 0x2079, 0x0300, 0x2071, 0x1a3c, 0x7003, 0x0000, 0x78bf, -+ 0x00f6, 0x0041, 0x7807, 0x0007, 0x7803, 0x0000, 0x7803, 0x0001, -+ 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x2001, 0x0165, 0x2003, -+ 0x4198, 0x7808, 0xd09c, 0x0110, 0x7820, 0x0cd8, 0x2001, 0x1a3d, -+ 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, 0xd0ac, 0x1de8, 0x78ab, -+ 0x0002, 0x7807, 0x0007, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, -+ 0x0031, 0x782b, 0x1a4a, 0x781f, 0xff00, 0x781b, 0xff00, 0x2001, -+ 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, 0x0303, 0x2061, 0x1a4a, -+ 0x602f, 0x1ddc, 0x2001, 0x1819, 0x2004, 0x9082, 0x1ddc, 0x6032, -+ 0x603b, 0x1cf7, 0x602b, 0x1a8a, 0x6007, 0x1a6a, 0x2061, 0x1a6a, -+ 0x00ce, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, 0x0070, -+ 0x190c, 0x0d5e, 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000, 0x0540, -+ 0x2060, 0x6020, 0x9086, 0x0003, 0x1550, 0x6000, 0x9086, 0x0004, -+ 0x1530, 0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103, 0x080c, -+ 0x67ac, 0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208, 0xba3e, -+ 0xb8c0, 0x9005, 0x190c, 0x639b, 0x00be, 0x6044, 0xd0fc, 0x190c, -+ 0x98f1, 0x080c, 0x9c0f, 0x7808, 0xd09c, 0x19b0, 0x012e, 0x0005, -+ 0x908a, 0x0024, 0x1a0c, 0x0d65, 0x002b, 0x012e, 0x0005, 0x04b0, -+ 0x012e, 0x0005, 0x138e, 0x13b4, 0x13e4, 0x13e9, 0x13ed, 0x13f2, -+ 0x141a, 0x141e, 0x142c, 0x1430, 0x138e, 0x14ba, 0x14be, 0x1521, -+ 0x138e, 0x138e, 0x138e, 0x138e, 0x138e, 0x138e, 0x138e, 0x138e, -+ 0x138e, 0x138e, 0x138e, 0x138e, 0x138e, 0x13f4, 0x138e, 0x13bc, -+ 0x13e1, 0x13a8, 0x138e, 0x13c8, 0x1392, 0x1390, 0x080c, 0x0d65, -+ 0x080c, 0x0d5e, 0x080c, 0x1528, 0x2009, 0x1a49, 0x2104, 0x8000, -+ 0x200a, 0x080c, 0x7b22, 0x080c, 0x195f, 0x0005, 0x6044, 0xd0fc, -+ 0x190c, 0x98f1, 0x2009, 0x0055, 0x080c, 0x9c85, 0x012e, 0x0005, -+ 0x080c, 0x1528, 0x2060, 0x6044, 0xd0fc, 0x190c, 0x98f1, 0x2009, -+ 0x0055, 0x080c, 0x9c85, 0x0005, 0x2009, 0x0048, 0x080c, 0x1528, -+ 0x2060, 0x080c, 0x9c85, 0x0005, 0x2009, 0x0054, 0x080c, 0x1528, -+ 0x2060, 0x6044, 0xd0fc, 0x190c, 0x98f1, 0x080c, 0x9c85, 0x0005, -+ 0x080c, 0x1528, 0x2060, 0x0056, 0x0066, 0x080c, 0x1528, 0x2028, -+ 0x080c, 0x1528, 0x2030, 0x0036, 0x0046, 0x2021, 0x0000, 0x2418, -+ 0x2009, 0x0056, 0x080c, 0x9c85, 0x004e, 0x003e, 0x006e, 0x005e, -+ 0x0005, 0x080c, 0x1528, 0x0005, 0x7004, 0xc085, 0xc0b5, 0x7006, -+ 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x1528, 0x080c, -+ 0x15e5, 0x0005, 0x080c, 0x0d65, 0x080c, 0x1528, 0x2060, 0x6014, -+ 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, 0x080c, -+ 0x9c85, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, 0x8109, -+ 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, 0x0218, -+ 0x2004, 0xd0ec, 0x1110, 0x080c, 0x152d, 0x2001, 0x0307, 0x2003, -+ 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, 0x1528, -+ 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, -+ 0x0048, 0x080c, 0x9c85, 0x0005, 0x080c, 0x1528, 0x080c, 0x0d65, -+ 0x080c, 0x1528, 0x080c, 0x14a5, 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, 0x0d65, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, -+ 0x0020, 0x0480, 0x78ab, 0x0004, 0x7803, 0x0001, 0x080c, 0x14be, -+ 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d65, 0x6014, -+ 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, 0x7b22, -+ 0x080c, 0x195f, 0x080c, 0xb847, 0x0158, 0xa9ac, 0xa936, 0xa9b0, -+ 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, 0xa882, -+ 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x6024, -+ 0x190c, 0xbc43, 0x2029, 0x00c8, 0x8529, 0x0128, 0x2001, 0x0201, -+ 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xd5d3, 0xd5a4, 0x1118, -+ 0x080c, 0x152d, 0x0005, 0x080c, 0x7b22, 0x080c, 0x195f, 0x0005, -+ 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, 0x0066, 0x0076, -+ 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, 0x9186, 0x0003, -+ 0x0120, 0x2001, 0x0016, 0x080c, 0x159e, 0x00fe, 0x007e, 0x006e, -+ 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, 0x7104, 0x9184, -+ 0x0004, 0x190c, 0x0d65, 0xd184, 0x1189, 0xd19c, 0x0158, 0xc19c, -+ 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x080c, -+ 0x152d, 0x0005, 0x81ff, 0x190c, 0x0d65, 0x0005, 0xc184, 0xd1b4, -+ 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15e0, 0x2071, 0x0200, 0x080c, -+ 0x15d9, 0x6014, 0x9005, 0x05a8, 0x0096, 0x2048, 0xa864, 0x009e, -+ 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, 0x908e, 0x0048, 0x1548, -+ 0x601c, 0xd084, 0x11d8, 0x00f6, 0x2c78, 0x080c, 0x164f, 0x00fe, -+ 0x00a8, 0x00f6, 0x2c78, 0x080c, 0x1797, 0x00fe, 0x2009, 0x01f4, -+ 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, -+ 0x0218, 0x2004, 0xd0ec, 0x1110, 0x0401, 0x0040, 0x2001, 0x020d, -+ 0x2003, 0x0020, 0x080c, 0x12ea, 0x7803, 0x0001, 0x00ee, 0x001e, -+ 0x0005, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0069, -+ 0x0ca8, 0x0031, 0x2060, 0x2009, 0x0053, 0x080c, 0x9c85, 0x0005, -+ 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, 0x080c, 0x14a5, 0x00d6, -+ 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, 0x0510, 0x6804, 0x9005, -+ 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, 0x79bc, 0xd1a4, 0x1528, -+ 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, 0x0841, 0x1268, 0x9188, -+ 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, 0x810c, 0x080c, 0x1590, -+ 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, 0x6827, 0x0002, 0x04c1, -+ 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, 0x1500, 0x6804, 0x9005, -+ 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, 0x080c, 0x7b22, 0x080c, -+ 0x195f, 0x0090, 0x7827, 0x0015, 0x782b, 0x0000, 0x7827, 0x0018, -+ 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, 0x0020, 0x2001, 0x0307, -+ 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, 0x0005, 0x682c, 0x9084, -+ 0x5400, 0x9086, 0x5400, 0x0d30, 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, 0x132a, 0x00ce, 0x002e, 0x001e, 0x000e, 0x0006, 0x7832, -+ 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, 0x1118, 0x000e, 0x00fe, -+ 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, 0x0d65, -+ 0x2009, 0xff00, 0x8109, 0x0120, 0x7818, 0xd0bc, 0x1dd8, 0x0005, -+ 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, -+ 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900, 0x8000, 0x2004, 0x080c, -+ 0x0d65, 0x7037, 0x0001, 0x7150, 0x7037, 0x0002, 0x7050, 0x2060, -+ 0xd1bc, 0x1110, 0x7054, 0x2060, 0x0005, 0x00e6, 0x0016, 0x2071, -+ 0x0200, 0x0c79, 0x6124, 0xd1dc, 0x01f8, 0x701c, 0xd08c, 0x0904, -+ 0x1644, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, 0xd0bc, 0x0904, -+ 0x1644, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, 0x6038, 0x00ce, -+ 0x918e, 0x0039, 0x1904, 0x1644, 0x9c06, 0x15f0, 0x0126, 0x2091, -+ 0x2600, 0x080c, 0x7a7a, 0x012e, 0x7358, 0x745c, 0x6014, 0x905d, -+ 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, -+ 0x190c, 0xbc1e, 0xab42, 0xac3e, 0x2001, 0x1875, 0x2004, 0xd0b4, -+ 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, 0xffff, 0x080c, -+ 0x1d17, 0x1190, 0x080c, 0x17f2, 0x2a00, 0xa816, 0x0130, 0x2800, -+ 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, 0x0020, 0x781f, -+ 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, 0x7037, 0x0020, -+ 0x001e, 0x00ee, 0x080c, 0x152d, 0x0005, 0x080c, 0x0d65, 0x0016, -+ 0x2009, 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, -+ 0x2cf0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048, -+ 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, 0x000f, -+ 0x9088, 0x1cf7, 0x2165, 0x0002, 0x1683, 0x16d0, 0x1683, 0x1683, -+ 0x1683, 0x16b2, 0x1683, 0x1687, 0x167c, 0x16c7, 0x1683, 0x1683, -+ 0x1683, 0x178c, 0x169b, 0x1691, 0xa964, 0x918c, 0x00ff, 0x918e, -+ 0x0048, 0x0904, 0x16c7, 0x9085, 0x0001, 0x0804, 0x1783, 0xa87c, -+ 0xd0bc, 0x0dc8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, 0x0804, -+ 0x16d7, 0xa87c, 0xd0bc, 0x0d78, 0xa890, 0xa842, 0xa88c, 0xa83e, -+ 0xa888, 0x0804, 0x1726, 0xa87c, 0xd0bc, 0x0d28, 0xa890, 0xa842, -+ 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0d65, 0xa164, 0xa91a, -+ 0x91ec, 0x000f, 0x9d80, 0x1cf7, 0x2065, 0xa888, 0xd19c, 0x1904, -+ 0x1726, 0x0428, 0xa87c, 0xd0ac, 0x0970, 0xa804, 0x9045, 0x090c, -+ 0x0d65, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1cf7, 0x2065, -+ 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x1726, 0x0080, 0xa87c, -+ 0xd0ac, 0x0904, 0x1683, 0x9006, 0xa842, 0xa83e, 0x0804, 0x1726, -+ 0xa87c, 0xd0ac, 0x0904, 0x1683, 0x9006, 0xa842, 0xa83e, 0x2c05, -+ 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x16fa, -+ 0x16fa, 0x16fc, 0x16fa, 0x16fa, 0x16fa, 0x1702, 0x16fa, 0x16fa, -+ 0x16fa, 0x1708, 0x16fa, 0x16fa, 0x16fa, 0x170e, 0x16fa, 0x16fa, -+ 0x16fa, 0x1714, 0x16fa, 0x16fa, 0x16fa, 0x171a, 0x16fa, 0x16fa, -+ 0x16fa, 0x1720, 0x080c, 0x0d65, 0xa574, 0xa478, 0xa37c, 0xa280, -+ 0x0804, 0x176b, 0xa584, 0xa488, 0xa38c, 0xa290, 0x0804, 0x176b, -+ 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x176b, 0xa5a4, 0xa4a8, -+ 0xa3ac, 0xa2b0, 0x0804, 0x176b, 0xa5b4, 0xa4b8, 0xa3bc, 0xa2c0, -+ 0x0804, 0x176b, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, 0x0804, 0x176b, -+ 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x176b, 0x2c05, 0x908a, -+ 0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x1749, 0x1747, -+ 0x1747, 0x1747, 0x1747, 0x1747, 0x1750, 0x1747, 0x1747, 0x1747, -+ 0x1747, 0x1747, 0x1757, 0x1747, 0x1747, 0x1747, 0x1747, 0x1747, -+ 0x175e, 0x1747, 0x1747, 0x1747, 0x1747, 0x1747, 0x1765, 0x080c, -+ 0x0d65, 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, 0x1158, 0x3e60, 0x601c, 0xc085, 0x601e, 0xa87c, -+ 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, 0x2800, 0xa80e, -+ 0xab0a, 0x2c00, 0xa812, 0x0c78, 0x0804, 0x1683, 0x0016, 0x2009, -+ 0x00a0, 0x8109, 0xa001, 0xa001, 0xa001, 0x1dd8, 0x001e, 0x2ff0, -+ 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048, 0x2940, -+ 0xa80e, 0x2061, 0x1cf2, 0xa813, 0x1cf2, 0x2c05, 0xa80a, 0xa964, -+ 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0d65, 0x9006, 0xa842, 0xa83e, -+ 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0xadcc, 0xacd0, 0xafd4, -+ 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, -+ 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0xa864, 0x9084, -+ 0x00ff, 0x9086, 0x0008, 0x1120, 0x8109, 0xa916, 0x0128, 0x0078, -+ 0x918a, 0x0002, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085, 0x601e, -+ 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, 0xa804, -+ 0x9045, 0x090c, 0x0d65, 0xa80e, 0xa064, 0xa81a, 0x9084, 0x000f, -+ 0x9080, 0x1cf7, 0x2015, 0x82ff, 0x090c, 0x0d65, 0xaa12, 0x2205, -+ 0xa80a, 0x0c10, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, 0x2d00, -+ 0x0002, 0x18e7, 0x1849, 0x1849, 0x18e7, 0x18e7, 0x18e1, 0x18e7, -+ 0x1849, 0x1898, 0x1898, 0x1898, 0x18e7, 0x18e7, 0x18e7, 0x18de, -+ 0x1898, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, 0xdd9c, -+ 0x0904, 0x18e9, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, -+ 0x001b, 0x0002, 0x1835, 0x1833, 0x1833, 0x1833, 0x1833, 0x1833, -+ 0x1839, 0x1833, 0x1833, 0x1833, 0x1833, 0x1833, 0x183d, 0x1833, -+ 0x1833, 0x1833, 0x1833, 0x1833, 0x1841, 0x1833, 0x1833, 0x1833, -+ 0x1833, 0x1833, 0x1845, 0x080c, 0x0d65, 0xa774, 0xa678, 0x0804, -+ 0x18e9, 0xa78c, 0xa690, 0x0804, 0x18e9, 0xa7a4, 0xa6a8, 0x0804, -+ 0x18e9, 0xa7bc, 0xa6c0, 0x0804, 0x18e9, 0xa7d4, 0xa6d8, 0x0804, -+ 0x18e9, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, -+ 0x0002, 0x186c, 0x186c, 0x186e, 0x186c, 0x186c, 0x186c, 0x1874, -+ 0x186c, 0x186c, 0x186c, 0x187a, 0x186c, 0x186c, 0x186c, 0x1880, -+ 0x186c, 0x186c, 0x186c, 0x1886, 0x186c, 0x186c, 0x186c, 0x188c, -+ 0x186c, 0x186c, 0x186c, 0x1892, 0x080c, 0x0d65, 0xa574, 0xa478, -+ 0xa37c, 0xa280, 0x0804, 0x18e9, 0xa584, 0xa488, 0xa38c, 0xa290, -+ 0x0804, 0x18e9, 0xa594, 0xa498, 0xa39c, 0xa2a0, 0x0804, 0x18e9, -+ 0xa5a4, 0xa4a8, 0xa3ac, 0xa2b0, 0x0804, 0x18e9, 0xa5b4, 0xa4b8, -+ 0xa3bc, 0xa2c0, 0x0804, 0x18e9, 0xa5c4, 0xa4c8, 0xa3cc, 0xa2d0, -+ 0x0804, 0x18e9, 0xa5d4, 0xa4d8, 0xa3dc, 0xa2e0, 0x0804, 0x18e9, -+ 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, -+ 0x18bb, 0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18c2, 0x18b9, -+ 0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18c9, 0x18b9, 0x18b9, 0x18b9, -+ 0x18b9, 0x18b9, 0x18d0, 0x18b9, 0x18b9, 0x18b9, 0x18b9, 0x18b9, -+ 0x18d7, 0x080c, 0x0d65, 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, 0x1ccd, 0x1904, 0x17f2, 0x900e, 0x0050, 0x080c, -+ 0x0d65, 0xab2e, 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, -+ 0x1ccd, 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, 0x9c85, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, -+ 0x00ce, 0x7908, 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, -+ 0x0003, 0x0598, 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, -+ 0x00c6, 0x781f, 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x132a, -+ 0x8631, 0x1db8, 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, -+ 0x7808, 0xd09c, 0x190c, 0x132a, 0x00ce, 0x2001, 0x0038, 0x080c, -+ 0x19ec, 0x7930, 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, -+ 0x0d65, 0x2001, 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, -+ 0x19fb, 0x000e, 0x6022, 0x012e, 0x0005, 0x080c, 0x19e8, 0x7827, -+ 0x0015, 0x7828, 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, -+ 0x2079, 0x0300, 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, -+ 0x70b7, 0x11b0, 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, -+ 0x2003, 0x0000, 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, -+ 0x0081, 0x2001, 0x0386, 0x2003, 0x2020, 0x080c, 0x7158, 0x0005, -+ 0x0479, 0x0039, 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, -+ 0x0005, 0x00e6, 0x2071, 0x0200, 0x080c, 0x2825, 0x2009, 0x003c, -+ 0x080c, 0x2052, 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, -+ 0x003c, 0x1de0, 0x080c, 0x8074, 0x70a0, 0x70a2, 0x7098, 0x709a, -+ 0x709c, 0x709e, 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, -+ 0x0300, 0x080c, 0x12ea, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, -+ 0x2001, 0x0138, 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, -+ 0x2003, 0x0000, 0x080c, 0x70b7, 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, -+ 0x601c, 0xc084, 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x159e, -+ 0x7930, 0x0005, 0x2c08, 0x621c, 0x080c, 0x15cb, 0x7930, 0x0005, -+ 0x8001, 0x1df0, 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, -+ 0x0170, 0x2001, 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1a59, -+ 0x2001, 0x001e, 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0d65, 0x781f, -+ 0x0202, 0x2001, 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, -+ 0x781c, 0xd084, 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, -+ 0x9186, 0x0040, 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, -+ 0x2001, 0x0014, 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, -+ 0x0140, 0x2001, 0x0030, 0x080c, 0x19f2, 0x9186, 0x0040, 0x190c, -+ 0x0d65, 0x00d6, 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, -+ 0x0160, 0xd19c, 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, -+ 0x0080, 0x6908, 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, -+ 0x791c, 0x9184, 0x0007, 0x090c, 0x0d65, 0xa001, 0xa001, 0x781f, -+ 0x0200, 0x0005, 0x0126, 0x2091, 0x2400, 0x2079, 0x0380, 0x2001, -+ 0x19b8, 0x2070, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, -+ 0x3e60, 0x6014, 0x2048, 0xa964, 0xa91a, 0x918c, 0x00ff, 0x9184, -+ 0x000f, 0x0002, 0x1a8e, 0x1a8e, 0x1a8e, 0x1a8e, 0x1a8e, 0x1a8e, -+ 0x1a8e, 0x1a8e, 0x1a82, 0x1a90, 0x1a8e, 0x1a8e, 0x1a8e, 0x1a8e, -+ 0x1a8e, 0x1a8e, 0x9086, 0x0008, 0x1148, 0xa87c, 0xd0b4, 0x0904, -+ 0x1c00, 0x2011, 0x1cf2, 0x2205, 0xab88, 0x0068, 0x080c, 0x0d65, -+ 0xa87c, 0xd0b4, 0x0904, 0x1c00, 0x9184, 0x000f, 0x9080, 0x1cf7, -+ 0x2015, 0x2205, 0xab88, 0x2908, 0xa80a, 0xa90e, 0xaa12, 0xab16, -+ 0x9006, 0xa842, 0xa83e, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, -+ 0x2400, 0x3e60, 0x6014, 0x2048, 0xa88c, 0xa990, 0xaaac, 0xabb0, -+ 0xaa36, 0xab3a, 0xa83e, 0xa942, 0xa846, 0xa94a, 0xa964, 0x918c, -+ 0x00ff, 0x9186, 0x001e, 0x0198, 0x2940, 0xa064, 0xa81a, 0x90ec, -+ 0x000f, 0x9d80, 0x1cf7, 0x2065, 0x2c05, 0x2808, 0x2c10, 0xab88, -+ 0xa80a, 0xa90e, 0xaa12, 0xab16, 0x012e, 0x3e60, 0x0005, 0xa804, -+ 0x2040, 0x0c58, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, -+ 0x2048, 0xa97c, 0x2950, 0xd1dc, 0x1904, 0x1bca, 0xc1dd, 0xa97e, -+ 0x9006, 0xa842, 0xa83e, 0xa988, 0x8109, 0xa916, 0xa964, 0xa91a, -+ 0x9184, 0x000f, 0x9088, 0x1cf7, 0x2145, 0x0002, 0x1afe, 0x1b0c, -+ 0x1afe, 0x1afe, 0x1afe, 0x1b00, 0x1afe, 0x1afe, 0x1b61, 0x1b61, -+ 0x1afe, 0x1afe, 0x1afe, 0x1b5f, 0x1afe, 0x1afe, 0x080c, 0x0d65, -+ 0xa804, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, 0x9080, 0x1cf7, -+ 0x2045, 0xd19c, 0x1904, 0x1b61, 0x9036, 0x2638, 0x2805, 0x908a, -+ 0x0036, 0x1a0c, 0x0d65, 0x9082, 0x001b, 0x0002, 0x1b31, 0x1b31, -+ 0x1b33, 0x1b31, 0x1b31, 0x1b31, 0x1b39, 0x1b31, 0x1b31, 0x1b31, -+ 0x1b3f, 0x1b31, 0x1b31, 0x1b31, 0x1b45, 0x1b31, 0x1b31, 0x1b31, -+ 0x1b4b, 0x1b31, 0x1b31, 0x1b31, 0x1b51, 0x1b31, 0x1b31, 0x1b31, -+ 0x1b57, 0x080c, 0x0d65, 0xb574, 0xb478, 0xb37c, 0xb280, 0x0804, -+ 0x1ba6, 0xb584, 0xb488, 0xb38c, 0xb290, 0x0804, 0x1ba6, 0xb594, -+ 0xb498, 0xb39c, 0xb2a0, 0x0804, 0x1ba6, 0xb5a4, 0xb4a8, 0xb3ac, -+ 0xb2b0, 0x0804, 0x1ba6, 0xb5b4, 0xb4b8, 0xb3bc, 0xb2c0, 0x0804, -+ 0x1ba6, 0xb5c4, 0xb4c8, 0xb3cc, 0xb2d0, 0x0804, 0x1ba6, 0xb5d4, -+ 0xb4d8, 0xb3dc, 0xb2e0, 0x0804, 0x1ba6, 0x0804, 0x1ba6, 0x080c, -+ 0x0d65, 0x2805, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b, -+ 0x0002, 0x1b84, 0x1b82, 0x1b82, 0x1b82, 0x1b82, 0x1b82, 0x1b8b, -+ 0x1b82, 0x1b82, 0x1b82, 0x1b82, 0x1b82, 0x1b92, 0x1b82, 0x1b82, -+ 0x1b82, 0x1b82, 0x1b82, 0x1b99, 0x1b82, 0x1b82, 0x1b82, 0x1b82, -+ 0x1b82, 0x1ba0, 0x080c, 0x0d65, 0xb56c, 0xb470, 0xb774, 0xb678, -+ 0xb37c, 0xb280, 0x00d8, 0xb584, 0xb488, 0xb78c, 0xb690, 0xb394, -+ 0xb298, 0x00a0, 0xb59c, 0xb4a0, 0xb7a4, 0xb6a8, 0xb3ac, 0xb2b0, -+ 0x0068, 0xb5b4, 0xb4b8, 0xb7bc, 0xb6c0, 0xb3c4, 0xb2c8, 0x0030, -+ 0xb5cc, 0xb4d0, 0xb7d4, 0xb6d8, 0xb3dc, 0xb2e0, 0xab2e, 0xaa32, -+ 0xad1e, 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8109, 0xa916, 0x1118, -+ 0x9006, 0x012e, 0x0005, 0x8840, 0x2805, 0x9005, 0x1168, 0xb004, -+ 0x9005, 0x090c, 0x0d65, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, -+ 0x9080, 0x1cf7, 0x2045, 0x2805, 0x2810, 0x2a08, 0xa80a, 0xa90e, -+ 0xaa12, 0x0c30, 0x3e60, 0x6344, 0xd3fc, 0x190c, 0x0d65, 0xa93c, -+ 0xaa40, 0xa844, 0x9106, 0x1118, 0xa848, 0x9206, 0x0508, 0x2958, -+ 0xab48, 0xac44, 0x2940, 0x080c, 0x1d17, 0x1998, 0x2850, 0x2c40, -+ 0xab14, 0xa880, 0xd0fc, 0x1140, 0xa810, 0x2005, 0xa80a, 0x2a00, -+ 0xa80e, 0x2009, 0x8015, 0x0070, 0x00c6, 0x3e60, 0x6044, 0xc0a4, -+ 0x9085, 0x8005, 0x6046, 0x00ce, 0x8319, 0xab16, 0x1904, 0x1bb3, -+ 0x2009, 0x8005, 0x3e60, 0x6044, 0x9105, 0x6046, 0x0804, 0x1bb0, -+ 0x080c, 0x0d65, 0x00f6, 0x00e6, 0x0096, 0x00c6, 0x0026, 0x704c, -+ 0x9c06, 0x190c, 0x0d65, 0x2079, 0x0090, 0x2001, 0x0105, 0x2003, -+ 0x0010, 0x782b, 0x0004, 0x7057, 0x0000, 0x6014, 0x2048, 0x080c, -+ 0xb847, 0x0118, 0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086, 0x0006, -+ 0x1170, 0x2061, 0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, -+ 0x60c8, 0x9206, 0x1dc0, 0x60c4, 0xa89a, 0x60c8, 0xa896, 0x704c, -+ 0x2060, 0x00c6, 0x080c, 0xb452, 0x080c, 0x98c8, 0x00ce, 0x704c, -+ 0x9c06, 0x1150, 0x2009, 0x0040, 0x080c, 0x2052, 0x080c, 0x94b8, -+ 0x2011, 0x0000, 0x080c, 0x9343, 0x002e, 0x00ce, 0x009e, 0x00ee, -+ 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0090, 0x781c, 0x0006, 0x7818, -+ 0x0006, 0x2079, 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, -+ 0x7816, 0x2019, 0x1000, 0x8319, 0x090c, 0x0d65, 0x7820, 0xd0bc, -+ 0x1dd0, 0x79c8, 0x000e, 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4, -+ 0x000e, 0x9103, 0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085, -+ 0x0012, 0x7816, 0x2079, 0x0090, 0x782b, 0x0008, 0x7057, 0x0000, -+ 0x00fe, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19b8, 0x7054, 0x9086, -+ 0x0000, 0x0904, 0x1cc8, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, -+ 0xd194, 0x01b8, 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, -+ 0x080c, 0xd61c, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d65, -+ 0x0016, 0x2009, 0x0040, 0x080c, 0x2052, 0x001e, 0x2001, 0x020c, -+ 0x2102, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, -+ 0x1120, 0x2009, 0x0040, 0x080c, 0x2052, 0x782c, 0xd0fc, 0x09a8, -+ 0x080c, 0x98e4, 0x782c, 0xd0fc, 0x1de8, 0x080c, 0x98c8, 0x7054, -+ 0x9086, 0x0000, 0x1950, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, -+ 0x2009, 0x0040, 0x080c, 0x2052, 0x782b, 0x0002, 0x7057, 0x0000, -+ 0x00ee, 0x00fe, 0x0005, 0x080c, 0x0d65, 0x8c60, 0x2c05, 0x9005, -+ 0x0110, 0x8a51, 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, -+ 0xa064, 0x9084, 0x000f, 0x9080, 0x1cf7, 0x2065, 0x8cff, 0x090c, -+ 0x0d65, 0x8a51, 0x0005, 0x2050, 0x0005, 0x0000, 0x001d, 0x0021, -+ 0x0025, 0x0029, 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, -+ 0x0027, 0x002d, 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, -+ 0x1cea, 0x1ce6, 0x0000, 0x0000, 0x1cf4, 0x0000, 0x1cea, 0x1cf1, -+ 0x1cf1, 0x1cee, 0x0000, 0x0000, 0x0000, 0x1cf4, 0x1cf1, 0x0000, -+ 0x1cec, 0x1cec, 0x0000, 0x0000, 0x1cf4, 0x0000, 0x1cec, 0x1cf2, -+ 0x1cf2, 0x1cf2, 0x0000, 0x0000, 0x0000, 0x1cf4, 0x1cf2, 0x00c6, -+ 0x00d6, 0x0086, 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x1ef6, -+ 0x2940, 0xa064, 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008, -+ 0x1118, 0x2061, 0x1cf2, 0x00d0, 0x9de0, 0x1cf7, 0x9d86, 0x0007, -+ 0x0130, 0x9d86, 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, -+ 0x9422, 0xa090, 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, -+ 0x1ef6, 0xa004, 0x9045, 0x0904, 0x1ef6, 0x08d8, 0x2c05, 0x9005, -+ 0x0904, 0x1dde, 0xdd9c, 0x1904, 0x1d9a, 0x908a, 0x0036, 0x1a0c, -+ 0x0d65, 0x9082, 0x001b, 0x0002, 0x1d6f, 0x1d6f, 0x1d71, 0x1d6f, -+ 0x1d6f, 0x1d6f, 0x1d77, 0x1d6f, 0x1d6f, 0x1d6f, 0x1d7d, 0x1d6f, -+ 0x1d6f, 0x1d6f, 0x1d83, 0x1d6f, 0x1d6f, 0x1d6f, 0x1d89, 0x1d6f, -+ 0x1d6f, 0x1d6f, 0x1d8f, 0x1d6f, 0x1d6f, 0x1d6f, 0x1d95, 0x080c, -+ 0x0d65, 0xa07c, 0x9422, 0xa080, 0x931b, 0x0804, 0x1dd4, 0xa08c, -+ 0x9422, 0xa090, 0x931b, 0x0804, 0x1dd4, 0xa09c, 0x9422, 0xa0a0, -+ 0x931b, 0x0804, 0x1dd4, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, -+ 0x1dd4, 0xa0bc, 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1dd4, 0xa0cc, -+ 0x9422, 0xa0d0, 0x931b, 0x0804, 0x1dd4, 0xa0dc, 0x9422, 0xa0e0, -+ 0x931b, 0x04d0, 0x908a, 0x0034, 0x1a0c, 0x0d65, 0x9082, 0x001b, -+ 0x0002, 0x1dbc, 0x1dba, 0x1dba, 0x1dba, 0x1dba, 0x1dba, 0x1dc1, -+ 0x1dba, 0x1dba, 0x1dba, 0x1dba, 0x1dba, 0x1dc6, 0x1dba, 0x1dba, -+ 0x1dba, 0x1dba, 0x1dba, 0x1dcb, 0x1dba, 0x1dba, 0x1dba, 0x1dba, -+ 0x1dba, 0x1dd0, 0x080c, 0x0d65, 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, 0x1ef6, 0x8c60, 0x0804, 0x1d46, 0xa004, 0x9045, -+ 0x0904, 0x1ef6, 0x0804, 0x1d21, 0x8a51, 0x0904, 0x1ef6, 0x8c60, -+ 0x2c05, 0x9005, 0x1158, 0xa004, 0x9045, 0x0904, 0x1ef6, 0xa064, -+ 0x90ec, 0x000f, 0x9de0, 0x1cf7, 0x2c05, 0x2060, 0xa880, 0xc0fc, -+ 0xa882, 0x0804, 0x1eeb, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, -+ 0x0000, 0xac2e, 0xab32, 0xdd9c, 0x1904, 0x1e88, 0x9082, 0x001b, -+ 0x0002, 0x1e24, 0x1e24, 0x1e26, 0x1e24, 0x1e24, 0x1e24, 0x1e34, -+ 0x1e24, 0x1e24, 0x1e24, 0x1e42, 0x1e24, 0x1e24, 0x1e24, 0x1e50, -+ 0x1e24, 0x1e24, 0x1e24, 0x1e5e, 0x1e24, 0x1e24, 0x1e24, 0x1e6c, -+ 0x1e24, 0x1e24, 0x1e24, 0x1e7a, 0x080c, 0x0d65, 0xa17c, 0x2400, -+ 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa074, 0x9420, -+ 0xa078, 0x9319, 0x0804, 0x1ee6, 0xa18c, 0x2400, 0x9122, 0xa190, -+ 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa084, 0x9420, 0xa088, 0x9319, -+ 0x0804, 0x1ee6, 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, -+ 0x0a0c, 0x0d65, 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x1ee6, -+ 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d65, -+ 0xa0a4, 0x9420, 0xa0a8, 0x9319, 0x0804, 0x1ee6, 0xa1bc, 0x2400, -+ 0x9122, 0xa1c0, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0b4, 0x9420, -+ 0xa0b8, 0x9319, 0x0804, 0x1ee6, 0xa1cc, 0x2400, 0x9122, 0xa1d0, -+ 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0c4, 0x9420, 0xa0c8, 0x9319, -+ 0x0804, 0x1ee6, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, -+ 0x0a0c, 0x0d65, 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x1ee6, -+ 0x9082, 0x001b, 0x0002, 0x1ea6, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, -+ 0x1ea4, 0x1eb3, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ec0, -+ 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ea4, 0x1ecd, 0x1ea4, 0x1ea4, -+ 0x1ea4, 0x1ea4, 0x1ea4, 0x1eda, 0x080c, 0x0d65, 0xa17c, 0x2400, -+ 0x9122, 0xa180, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa06c, 0x9420, -+ 0xa070, 0x9319, 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, -+ 0x911b, 0x0a0c, 0x0d65, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, -+ 0xa1ac, 0x2400, 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d65, -+ 0xa09c, 0x9420, 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, -+ 0xa1c8, 0x2300, 0x911b, 0x0a0c, 0x0d65, 0xa0b4, 0x9420, 0xa0b8, -+ 0x9319, 0x0060, 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, -+ 0x0a0c, 0x0d65, 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, 0x00c6, 0x610c, 0x0016, 0x9026, -+ 0x2410, 0x6004, 0x9420, 0x9291, 0x0000, 0x2c04, 0x9210, 0x9ce0, -+ 0x0002, 0x918a, 0x0002, 0x1da8, 0x9284, 0x000f, 0x9405, 0x001e, -+ 0x00ce, 0x0005, 0x7803, 0x0003, 0x780f, 0x0000, 0x6004, 0x7812, -+ 0x2c04, 0x7816, 0x9ce0, 0x0002, 0x918a, 0x0002, 0x1db8, 0x0005, -+ 0x2001, 0x0005, 0x2004, 0xd0bc, 0x190c, 0x0d5e, 0xd094, 0x0110, -+ 0x080c, 0x11c6, 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, 0x204f, -+ 0x7900, 0xd1dc, 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, -+ 0x0002, 0x1f71, 0x1f69, 0x7a7a, 0x1f69, 0x1f6b, 0x1f6b, 0x1f6b, -+ 0x1f6b, 0x7a60, 0x1f69, 0x1f6d, 0x1f69, 0x1f6b, 0x1f69, 0x1f6b, -+ 0x1f69, 0x080c, 0x0d65, 0x0031, 0x0020, 0x080c, 0x7a60, 0x080c, -+ 0x7a7a, 0x0005, 0x0006, 0x0016, 0x0026, 0x080c, 0xd61c, 0x7930, -+ 0x9184, 0x0003, 0x01f0, 0x080c, 0x98c8, 0x2001, 0x19cb, 0x2004, -+ 0x9005, 0x0180, 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d65, -+ 0x00c6, 0x2001, 0x19cb, 0x2064, 0x080c, 0x98e4, 0x080c, 0xb452, -+ 0x00ce, 0x0408, 0x2009, 0x0040, 0x080c, 0x2052, 0x080c, 0x98e4, -+ 0x00d0, 0x9184, 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, -+ 0x080c, 0x70b7, 0x1138, 0x080c, 0x73b7, 0x080c, 0x5cdc, 0x080c, -+ 0x6fe8, 0x0010, 0x080c, 0x5b97, 0x080c, 0x7b18, 0x0041, 0x0018, -+ 0x9184, 0x9540, 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, -+ 0x0036, 0x0046, 0x0056, 0x2071, 0x1a3c, 0x080c, 0x195f, 0x005e, -+ 0x004e, 0x003e, 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, -+ 0x1800, 0x7128, 0x2001, 0x1940, 0x2102, 0x2001, 0x1948, 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, 0x0d5e, 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, 0x281f, -+ 0x080c, 0x273f, 0x080c, 0x2890, 0x9006, 0x080c, 0x276e, 0x9006, -+ 0x080c, 0x2751, 0x20a9, 0x0012, 0x1d04, 0x207c, 0x2091, 0x6000, -+ 0x1f04, 0x207c, 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, -+ 0x0400, 0x9084, 0xdfff, 0x6052, 0x6224, 0x080c, 0x286d, 0x080c, -+ 0x245d, 0x2009, 0x00ef, 0x6132, 0x6136, 0x080c, 0x246d, 0x60e7, -+ 0x0000, 0x61ea, 0x60e3, 0x0002, 0x604b, 0xf7f7, 0x6043, 0x0000, -+ 0x602f, 0x0080, 0x602f, 0x0000, 0x6007, 0x149f, 0x00c6, 0x2061, -+ 0x0140, 0x608b, 0x000b, 0x608f, 0x10b8, 0x6093, 0x0000, 0x6097, -+ 0x0198, 0x00ce, 0x6004, 0x9085, 0x8000, 0x6006, 0x60bb, 0x0000, -+ 0x20a9, 0x0018, 0x60bf, 0x0000, 0x1f04, 0x20ba, 0x60bb, 0x0000, -+ 0x60bf, 0x0108, 0x60bf, 0x0012, 0x60bf, 0x0320, 0x60bf, 0x0018, -+ 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, 0x006b, 0x602b, 0x402c, -+ 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, 0x6028, 0x910c, 0x9184, -+ 0x5e2c, 0x1118, 0x9184, 0x0007, 0x002a, 0x9195, 0x0004, 0x9284, -+ 0x0007, 0x0002, 0x2105, 0x2102, 0x2102, 0x2102, 0x2104, 0x2102, -+ 0x2102, 0x2102, 0x080c, 0x0d65, 0x0029, 0x002e, 0x001e, 0x000e, -+ 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, 0xd19c, -+ 0x1904, 0x2364, 0xd1f4, 0x190c, 0x0d5e, 0x080c, 0x70b7, 0x0904, -+ 0x2162, 0x080c, 0xbf61, 0x1120, 0x7000, 0x9086, 0x0003, 0x0580, -+ 0x6024, 0x9084, 0x1800, 0x0560, 0x080c, 0x70da, 0x0118, 0x080c, -+ 0x70c8, 0x1530, 0x2011, 0x0020, 0x080c, 0x286d, 0x6043, 0x0000, -+ 0x080c, 0xbf61, 0x0168, 0x080c, 0x70da, 0x1150, 0x2001, 0x1978, -+ 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x6f2d, 0x0804, 0x2367, -+ 0x70a0, 0x9005, 0x1150, 0x70a3, 0x0001, 0x00d6, 0x2069, 0x0140, -+ 0x080c, 0x710e, 0x00de, 0x1904, 0x2367, 0x080c, 0x73c1, 0x0428, -+ 0x080c, 0x70da, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, 0x0468, -+ 0x080c, 0x73c1, 0x080c, 0x73b7, 0x080c, 0x5cdc, 0x080c, 0x6fe8, -+ 0x0804, 0x2364, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, 0xd0e4, -+ 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7094, 0x9086, 0x0028, -+ 0x1110, 0x080c, 0x729a, 0x0804, 0x2364, 0x080c, 0x73bc, 0x0048, -+ 0x2001, 0x194e, 0x2003, 0x0002, 0x0020, 0x080c, 0x71f8, 0x0804, -+ 0x2364, 0x080c, 0x733c, 0x0804, 0x2364, 0xd1ac, 0x0904, 0x227e, -+ 0x080c, 0x70b7, 0x11d0, 0x2011, 0x0020, 0x080c, 0x286d, 0x0006, -+ 0x0026, 0x0036, 0x080c, 0x70d1, 0x1158, 0x080c, 0x73b7, 0x080c, -+ 0x5cdc, 0x080c, 0x6fe8, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, -+ 0x003e, 0x002e, 0x000e, 0x080c, 0x708b, 0x0016, 0x0046, 0x00c6, -+ 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, -+ 0x0090, 0x6043, 0x0010, 0x74d6, 0x948c, 0xff00, 0x7038, 0xd084, -+ 0x0178, 0x9186, 0xf800, 0x1160, 0x7044, 0xd084, 0x1148, 0xc085, -+ 0x7046, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x48d8, 0x003e, -+ 0x080c, 0xbf5a, 0x1904, 0x2255, 0x9196, 0xff00, 0x05a8, 0x705c, -+ 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, -+ 0xd184, 0x1550, 0x080c, 0x3186, 0x0128, 0xc18d, 0x7132, 0x080c, -+ 0x665f, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, -+ 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x2255, -+ 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, -+ 0x2255, 0xc1ad, 0x2102, 0x0036, 0x73d4, 0x2011, 0x8013, 0x080c, -+ 0x48d8, 0x003e, 0x0804, 0x2255, 0x7038, 0xd08c, 0x1140, 0x2001, -+ 0x180c, 0x200c, 0xd1ac, 0x1904, 0x2255, 0xc1ad, 0x2102, 0x0036, -+ 0x73d4, 0x2011, 0x8013, 0x080c, 0x48d8, 0x003e, 0x7130, 0xc185, -+ 0x7132, 0x2011, 0x1854, 0x220c, 0x00f0, 0x0016, 0x2009, 0x0001, -+ 0x2011, 0x0100, 0x080c, 0x83eb, 0x2019, 0x000e, 0x00c6, 0x2061, -+ 0x0000, 0x080c, 0xd1eb, 0x00ce, 0x9484, 0x00ff, 0x9080, 0x318b, -+ 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, 0x000e, -+ 0x080c, 0xd273, 0x001e, 0xd1ac, 0x1148, 0x0016, 0x2009, 0x0002, -+ 0x2019, 0x0004, 0x080c, 0x2fc5, 0x001e, 0x0078, 0x0156, 0x00b6, -+ 0x20a9, 0x007f, 0x900e, 0x080c, 0x6270, 0x1110, 0x080c, 0x5cf6, -+ 0x8108, 0x1f04, 0x224b, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, -+ 0x98c8, 0x080c, 0x9b6d, 0x080c, 0x98e4, 0x60e3, 0x0000, 0x001e, -+ 0x2001, 0x1800, 0x2014, 0x9296, 0x0004, 0x1170, 0xd19c, 0x11b0, -+ 0x2011, 0x180c, 0x2214, 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, -+ 0x6206, 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x1825, -+ 0x2003, 0x0000, 0x2011, 0x0020, 0x080c, 0x286d, 0xd194, 0x0904, -+ 0x2364, 0x0016, 0x080c, 0x98c8, 0x6220, 0xd2b4, 0x0904, 0x230c, -+ 0x080c, 0x820b, 0x080c, 0x8fb7, 0x2011, 0x0004, 0x080c, 0x286d, -+ 0x00f6, 0x2019, 0x19c4, 0x2304, 0x907d, 0x0904, 0x22d9, 0x7804, -+ 0x9086, 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, -+ 0x0140, 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, -+ 0x0003, 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, -+ 0x1df0, 0x080c, 0x2843, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, -+ 0x0009, 0x080c, 0x27fa, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, -+ 0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x080c, 0x8874, -+ 0x080c, 0x98e4, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, -+ 0x9be7, 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, -+ 0x0005, 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, -+ 0x0110, 0x080c, 0x2843, 0x00de, 0x00c6, 0x2061, 0x19b8, 0x6034, -+ 0x080c, 0xbf61, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, -+ 0x00c8, 0x1238, 0x8000, 0x6036, 0x00ce, 0x080c, 0x8f8f, 0x0804, -+ 0x2361, 0x2061, 0x0100, 0x62c0, 0x080c, 0x97fe, 0x2019, 0x19c4, -+ 0x2304, 0x9065, 0x0130, 0x6003, 0x0001, 0x2009, 0x0027, 0x080c, -+ 0x9c85, 0x00ce, 0x0804, 0x2361, 0xd2bc, 0x05e0, 0x080c, 0x8218, -+ 0x2011, 0x0004, 0x080c, 0x286d, 0x00d6, 0x2069, 0x0140, 0x6804, -+ 0x9084, 0x4000, 0x0110, 0x080c, 0x2843, 0x00de, 0x00c6, 0x2061, -+ 0x19b8, 0x6050, 0x080c, 0xbf61, 0x0120, 0x909a, 0x0003, 0x1638, -+ 0x0018, 0x909a, 0x00c8, 0x1618, 0x8000, 0x6052, 0x604c, 0x00ce, -+ 0x9005, 0x0578, 0x2009, 0x07d0, 0x080c, 0x8210, 0x9080, 0x0008, -+ 0x2004, 0x9086, 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012, -+ 0x080c, 0x287c, 0x00f0, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, -+ 0x287c, 0x00b8, 0x2011, 0x0004, 0x080c, 0x286d, 0x0090, 0x0036, -+ 0x2019, 0x0001, 0x080c, 0x9286, 0x003e, 0x2019, 0x19cb, 0x2304, -+ 0x9065, 0x0130, 0x2009, 0x004f, 0x6003, 0x0003, 0x080c, 0x9c85, -+ 0x00ce, 0x080c, 0x98e4, 0x001e, 0xd19c, 0x0904, 0x23c2, 0x7038, -+ 0xd0ac, 0x1538, 0x0016, 0x0156, 0x2011, 0x0008, 0x080c, 0x286d, -+ 0x6050, 0xc0e5, 0x6052, 0x20a9, 0x0367, 0x1f04, 0x238f, 0x1d04, -+ 0x2377, 0x080c, 0x823f, 0x6020, 0xd09c, 0x1db8, 0x00f6, 0x2079, -+ 0x0100, 0x080c, 0x27aa, 0x00fe, 0x1d80, 0x6050, 0xc0e4, 0x6052, -+ 0x2011, 0x0008, 0x080c, 0x286d, 0x015e, 0x001e, 0x0498, 0x015e, -+ 0x001e, 0x0016, 0x6028, 0xc09c, 0x602a, 0x080c, 0x98c8, 0x080c, -+ 0x9b6d, 0x080c, 0x98e4, 0x60e3, 0x0000, 0x080c, 0xd5fb, 0x080c, -+ 0xd616, 0x080c, 0x5391, 0xd0fc, 0x1138, 0x080c, 0xbf5a, 0x1120, -+ 0x9085, 0x0001, 0x080c, 0x70fe, 0x9006, 0x080c, 0x2833, 0x2009, -+ 0x0002, 0x080c, 0x281f, 0x00e6, 0x2071, 0x1800, 0x7003, 0x0004, -+ 0x080c, 0x0e9c, 0x00ee, 0x2011, 0x0008, 0x080c, 0x286d, 0x080c, -+ 0x0bab, 0x001e, 0x918c, 0xffd0, 0x2110, 0x080c, 0x286d, 0x00ae, -+ 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, -+ 0x2091, 0x8000, 0x2071, 0x1800, 0x71cc, 0x70ce, 0x9116, 0x0904, -+ 0x241c, 0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x281f, 0x2011, -+ 0x8011, 0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, -+ 0x0001, 0x0010, 0x2019, 0x0000, 0x080c, 0x48d8, 0x0468, 0x2001, -+ 0x1979, 0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, -+ 0x0118, 0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, -+ 0x48d8, 0x080c, 0x0e9c, 0x080c, 0x5391, 0xd0fc, 0x11a8, 0x080c, -+ 0xbf5a, 0x1190, 0x00c6, 0x080c, 0x24b8, 0x080c, 0x98c8, 0x080c, -+ 0x91e1, 0x080c, 0x98e4, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, -+ 0x0002, 0x080c, 0x2fc5, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, -+ 0x002e, 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, -+ 0x9094, 0xff00, 0x11f0, 0x2011, 0x1836, 0x2214, 0xd2ac, 0x11c8, -+ 0x81ff, 0x01e8, 0x2011, 0x181e, 0x2204, 0x9106, 0x1190, 0x2011, -+ 0x181f, 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148, -+ 0x2011, 0x181f, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206, -+ 0x1120, 0x2500, 0x080c, 0x7d70, 0x0048, 0x9584, 0x00ff, 0x9080, -+ 0x318b, 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, -+ 0x318b, 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, -+ 0x2001, 0x1817, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, -+ 0x6856, 0x1f04, 0x2468, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, -+ 0x2069, 0x0140, 0x2001, 0x1817, 0x2102, 0x8114, 0x8214, 0x8214, -+ 0x8214, 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, -+ 0x9184, 0x000f, 0x9080, 0xd62a, 0x2005, 0x6856, 0x8211, 0x1f04, -+ 0x247d, 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, 0x24ad, -+ 0x680f, 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, -+ 0x080c, 0x538d, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, -+ 0x2020, 0x2009, 0x002e, 0x080c, 0xd273, 0x004e, 0x0005, 0x00f6, -+ 0x0016, 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x2524, -+ 0x080c, 0x279a, 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, 0x8419, 0x928c, 0xff00, 0x0110, -+ 0x2011, 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, -+ 0x0138, 0x220a, 0x080c, 0x70b7, 0x1118, 0x2009, 0x193e, 0x220a, -+ 0x002e, 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, -+ 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, -+ 0x8000, 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d5e, 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, 0x1961, 0x2004, -+ 0x908a, 0x0007, 0x1a0c, 0x0d65, 0x0033, 0x00ee, 0x002e, 0x001e, -+ 0x000e, 0x015e, 0x0005, 0x2582, 0x25a0, 0x25c4, 0x25c6, 0x25ef, -+ 0x25f1, 0x25f3, 0x2001, 0x0001, 0x080c, 0x23c9, 0x080c, 0x27e4, -+ 0x2001, 0x1963, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, -+ 0x9006, 0x20a9, 0x0009, 0x080c, 0x27b6, 0x2001, 0x1961, 0x2003, -+ 0x0006, 0x2009, 0x001e, 0x2011, 0x25f4, 0x080c, 0x821d, 0x0005, -+ 0x2009, 0x1966, 0x200b, 0x0000, 0x2001, 0x196b, 0x2003, 0x0036, -+ 0x2001, 0x196a, 0x2003, 0x002a, 0x2001, 0x1963, 0x2003, 0x0001, -+ 0x9006, 0x080c, 0x2751, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, -+ 0x27b6, 0x2001, 0x1961, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, -+ 0x25f4, 0x080c, 0x821d, 0x0005, 0x080c, 0x0d65, 0x2001, 0x196b, -+ 0x2003, 0x0036, 0x2001, 0x1963, 0x2003, 0x0003, 0x7a38, 0x9294, -+ 0x0005, 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, -+ 0x080c, 0x2751, 0x2001, 0x1967, 0x2003, 0x0000, 0x2001, 0xffff, -+ 0x20a9, 0x0009, 0x080c, 0x27b6, 0x2001, 0x1961, 0x2003, 0x0006, -+ 0x2009, 0x001e, 0x2011, 0x25f4, 0x080c, 0x821d, 0x0005, 0x080c, -+ 0x0d65, 0x080c, 0x0d65, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, -+ 0x00f6, 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, -+ 0x1963, 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d65, 0x0043, 0x012e, -+ 0x015e, 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x2616, -+ 0x2636, 0x2676, 0x26a6, 0x26ca, 0x26da, 0x26dc, 0x080c, 0x27aa, -+ 0x11b0, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1969, 0x2104, -+ 0x7a38, 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, 0x0008, -+ 0xc085, 0x200a, 0x2001, 0x1961, 0x2003, 0x0001, 0x0030, 0x080c, -+ 0x2700, 0x2001, 0xffff, 0x080c, 0x2591, 0x0005, 0x080c, 0x26de, -+ 0x05e0, 0x2009, 0x196a, 0x2104, 0x8001, 0x200a, 0x080c, 0x27aa, -+ 0x1178, 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, 0x0005, -+ 0x9296, 0x0005, 0x0518, 0x2009, 0x1969, 0x2104, 0xc085, 0x200a, -+ 0x2009, 0x1966, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, -+ 0x080c, 0x26e6, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, -+ 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, -+ 0x276e, 0x2001, 0x1963, 0x2003, 0x0002, 0x0028, 0x2001, 0x1961, -+ 0x2003, 0x0003, 0x0010, 0x080c, 0x25b3, 0x0005, 0x080c, 0x26de, -+ 0x0560, 0x2009, 0x196a, 0x2104, 0x8001, 0x200a, 0x080c, 0x27aa, -+ 0x1168, 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x1961, 0x2003, -+ 0x0003, 0x2001, 0x1962, 0x2003, 0x0000, 0x00b8, 0x2009, 0x196a, -+ 0x2104, 0x9005, 0x1118, 0x080c, 0x2723, 0x0010, 0x080c, 0x26f3, -+ 0x080c, 0x26e6, 0x2009, 0x1966, 0x200b, 0x0000, 0x2001, 0x1963, -+ 0x2003, 0x0001, 0x080c, 0x25b3, 0x0000, 0x0005, 0x04b9, 0x0508, -+ 0x080c, 0x27aa, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, -+ 0x1967, 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, -+ 0x2001, 0x196c, 0x2003, 0x000a, 0x2009, 0x1969, 0x2104, 0xc0fd, -+ 0x200a, 0x0038, 0x0419, 0x2001, 0x1963, 0x2003, 0x0004, 0x080c, -+ 0x25de, 0x0005, 0x0099, 0x0168, 0x080c, 0x27aa, 0x1138, 0x7850, -+ 0x9084, 0xefff, 0x7852, 0x080c, 0x25ca, 0x0018, 0x0079, 0x080c, -+ 0x25de, 0x0005, 0x080c, 0x0d65, 0x080c, 0x0d65, 0x2009, 0x196b, -+ 0x2104, 0x8001, 0x200a, 0x090c, 0x273f, 0x0005, 0x7a38, 0x9294, -+ 0x0005, 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, -+ 0x080c, 0x276e, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, -+ 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2751, 0x0005, -+ 0x2009, 0x1966, 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, 0x276e, 0x0005, 0x0086, 0x2001, 0x1969, 0x2004, 0x9084, -+ 0x7fff, 0x090c, 0x0d65, 0x2009, 0x1968, 0x2144, 0x8846, 0x280a, -+ 0x9844, 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, 0x0d65, -+ 0x9006, 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, 0x0006, -+ 0x0156, 0x2001, 0x1961, 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000, -+ 0x1f04, 0x2745, 0x2001, 0x1968, 0x2003, 0x8000, 0x015e, 0x000e, -+ 0x0005, 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, -+ 0x9084, 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x196e, 0x210c, -+ 0x795a, 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, 0x783a, -+ 0x2009, 0x196f, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6, 0x2079, -+ 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfffa, 0x9085, -+ 0x0004, 0x783a, 0x7850, 0x9084, 0xfff0, 0x7852, 0x00c8, 0x7838, -+ 0x9084, 0xfffb, 0x9085, 0x0005, 0x783a, 0x7850, 0x9084, 0xfff0, -+ 0x0016, 0x2009, 0x0003, 0x210c, 0x918c, 0x0600, 0x918e, 0x0400, -+ 0x0118, 0x9085, 0x000a, 0x0010, 0x9085, 0x0000, 0x001e, 0x7852, -+ 0x00fe, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, -+ 0x000e, 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, -+ 0x000e, 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x2819, -+ 0xd09c, 0x1110, 0x1f04, 0x27ad, 0x015e, 0x0005, 0x0126, 0x0016, -+ 0x0006, 0x2091, 0x8000, 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, 0x27d6, -+ 0x080c, 0x823f, 0x1f04, 0x27d6, 0x7850, 0x9085, 0x1000, 0x7852, -+ 0x000e, 0x001e, 0x012e, 0x0005, 0x080c, 0x28d4, 0x0005, 0x0006, -+ 0x0156, 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, -+ 0x1100, 0x7854, 0xd08c, 0x1110, 0x1f04, 0x27f1, 0x00fe, 0x015e, -+ 0x000e, 0x0005, 0x1d04, 0x27fa, 0x080c, 0x823f, 0x1f04, 0x27fa, -+ 0x0005, 0x0006, 0x2001, 0x196d, 0x2004, 0x9086, 0x0000, 0x000e, -+ 0x0005, 0x0006, 0x2001, 0x196d, 0x2004, 0x9086, 0x0001, 0x000e, -+ 0x0005, 0x0006, 0x2001, 0x196d, 0x2004, 0x9086, 0x0002, 0x000e, -+ 0x0005, 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, -+ 0x2001, 0x1979, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, -+ 0xd0dc, 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, -+ 0xa001, 0x200a, 0x0005, 0x0016, 0x0026, 0x080c, 0x70d1, 0x0108, -+ 0xc0bc, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, -+ 0x002e, 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, -+ 0x9294, 0x0001, 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, -+ 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, -+ 0x9215, 0x220a, 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, -+ 0x0140, 0x2104, 0x1128, 0x080c, 0x70d1, 0x0110, 0xc0bc, 0x0008, -+ 0xc0bd, 0x200a, 0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380, -+ 0x7843, 0x0101, 0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202, -+ 0x7843, 0x0100, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, -+ 0x0202, 0x7844, 0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104, -+ 0x9205, 0x7a16, 0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005, -+ 0x0016, 0x0026, 0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084, -+ 0xfbff, 0x9085, 0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x27fa, -+ 0x6050, 0x9085, 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, -+ 0x080c, 0x27fa, 0x6054, 0xd0bc, 0x090c, 0x0d65, 0x20a9, 0x0005, -+ 0x080c, 0x27fa, 0x6054, 0xd0ac, 0x090c, 0x0d65, 0x2009, 0x1980, -+ 0x9084, 0x7e00, 0x8007, 0x8004, 0x8004, 0x200a, 0x9085, 0x0000, -+ 0x605a, 0x2009, 0x196e, 0x2011, 0x196f, 0x6358, 0x939c, 0x38df, -+ 0x2320, 0x939d, 0x0000, 0x94a5, 0x0000, 0x230a, 0x2412, 0x00ce, -+ 0x003e, 0x002e, 0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, -+ 0x6050, 0xc0cd, 0x6052, 0x00ce, 0x000e, 0x0005, 0x2dda, 0x2dda, -+ 0x29de, 0x29de, 0x29ea, 0x29ea, 0x29f6, 0x29f6, 0x2a04, 0x2a04, -+ 0x2a10, 0x2a10, 0x2a1e, 0x2a1e, 0x2a2c, 0x2a2c, 0x2a3e, 0x2a3e, -+ 0x2a4a, 0x2a4a, 0x2a58, 0x2a58, 0x2a76, 0x2a76, 0x2a96, 0x2a96, -+ 0x2a66, 0x2a66, 0x2a86, 0x2a86, 0x2aa4, 0x2aa4, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2ab6, 0x2ab6, -+ 0x2ac2, 0x2ac2, 0x2ad0, 0x2ad0, 0x2ade, 0x2ade, 0x2aee, 0x2aee, -+ 0x2afc, 0x2afc, 0x2b0c, 0x2b0c, 0x2b1c, 0x2b1c, 0x2b2e, 0x2b2e, -+ 0x2b3c, 0x2b3c, 0x2b4c, 0x2b4c, 0x2b6e, 0x2b6e, 0x2b92, 0x2b92, -+ 0x2b5c, 0x2b5c, 0x2b80, 0x2b80, 0x2ba2, 0x2ba2, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2bb6, 0x2bb6, -+ 0x2bc2, 0x2bc2, 0x2bd0, 0x2bd0, 0x2bde, 0x2bde, 0x2bee, 0x2bee, -+ 0x2bfc, 0x2bfc, 0x2c0c, 0x2c0c, 0x2c1c, 0x2c1c, 0x2c2e, 0x2c2e, -+ 0x2c3c, 0x2c3c, 0x2c4c, 0x2c4c, 0x2c5c, 0x2c5c, 0x2c6e, 0x2c6e, -+ 0x2c7e, 0x2c7e, 0x2c90, 0x2c90, 0x2ca2, 0x2ca2, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2cb6, 0x2cb6, -+ 0x2cc4, 0x2cc4, 0x2cd4, 0x2cd4, 0x2ce4, 0x2ce4, 0x2cf6, 0x2cf6, -+ 0x2d06, 0x2d06, 0x2d18, 0x2d18, 0x2d2a, 0x2d2a, 0x2d3e, 0x2d3e, -+ 0x2d4e, 0x2d4e, 0x2d60, 0x2d60, 0x2d72, 0x2d72, 0x2d86, 0x2d86, -+ 0x2d97, 0x2d97, 0x2daa, 0x2daa, 0x2dbd, 0x2dbd, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, -+ 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x2a3c, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20e6, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x1f20, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, -+ 0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f4a, 0x0804, 0x2dd2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x20e6, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0xa001, 0x0cf0, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x132a, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x1f20, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x20e6, -+ 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, -+ 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, -+ 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x132a, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x20e6, -+ 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x20e6, 0x0804, 0x2dd2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x2527, 0x080c, 0x1f20, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x1f20, 0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x20e6, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, -+ 0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x20e6, -+ 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, -+ 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x20e6, -+ 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x1f20, 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x132a, 0x080c, 0x1f4a, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x132a, 0x080c, 0x1f4a, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x20e6, -+ 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x992e, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x992e, 0x080c, 0x20e6, 0x0804, 0x2dd2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x1f20, 0x080c, 0x992e, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, -+ 0x080c, 0x992e, 0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x992e, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x992e, 0x080c, 0x20e6, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x992e, -+ 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x992e, -+ 0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x992e, -+ 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x992e, 0x080c, 0x20e6, -+ 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x992e, -+ 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x992e, -+ 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x992e, -+ 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x992e, -+ 0x080c, 0x20e6, 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x1f20, 0x080c, 0x992e, 0x080c, 0x132a, 0x080c, 0x1f4a, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x1f20, 0x080c, 0x992e, 0x080c, 0x20e6, -+ 0x080c, 0x132a, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x992e, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x992e, -+ 0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, -+ 0x080c, 0x992e, 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, -+ 0x080c, 0x992e, 0x080c, 0x20e6, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x992e, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x992e, 0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x992e, 0x080c, 0x1f4a, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x992e, -+ 0x080c, 0x20e6, 0x080c, 0x1f4a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x992e, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x992e, 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, -+ 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, -+ 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x992e, 0x080c, 0x132a, -+ 0x0804, 0x2dd2, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x992e, -+ 0x080c, 0x20e6, 0x080c, 0x132a, 0x0804, 0x2dd2, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, -+ 0x080c, 0x992e, 0x080c, 0x132a, 0x080c, 0x1f4a, 0x04d8, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2527, 0x080c, 0x992e, 0x080c, 0x20e6, 0x080c, 0x132a, 0x080c, -+ 0x1f4a, 0x0440, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, -+ 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, 0x1f20, 0x080c, 0x132a, -+ 0x080c, 0x992e, 0x080c, 0x1f4a, 0x00a8, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2527, 0x080c, -+ 0x1f20, 0x080c, 0x992e, 0x080c, 0x20e6, 0x080c, 0x132a, 0x080c, -+ 0x1f4a, 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, -+ 0x000e, 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, -+ 0x080c, 0x6625, 0x1904, 0x2ee1, 0x72d8, 0x2001, 0x194d, 0x2004, -+ 0x9005, 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, -+ 0x2ee1, 0x080c, 0x2ee6, 0x0804, 0x2ee1, 0xd2cc, 0x1904, 0x2ee1, -+ 0x080c, 0x70b7, 0x1120, 0x70ab, 0xffff, 0x0804, 0x2ee1, 0xd294, -+ 0x0120, 0x70ab, 0xffff, 0x0804, 0x2ee1, 0x080c, 0x3181, 0x0160, -+ 0x080c, 0xbf61, 0x0128, 0x2001, 0x1817, 0x203c, 0x0804, 0x2e73, -+ 0x70ab, 0xffff, 0x0804, 0x2ee1, 0x2001, 0x1817, 0x203c, 0x7290, -+ 0xd284, 0x0904, 0x2e73, 0xd28c, 0x1904, 0x2e73, 0x0036, 0x73a8, -+ 0x938e, 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, -+ 0x2c04, 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, -+ 0x9084, 0x00ff, 0x970e, 0x05a8, 0x908e, 0x0000, 0x0590, 0x908e, -+ 0x00ff, 0x1150, 0x7230, 0xd284, 0x1588, 0x7290, 0xc28d, 0x7292, -+ 0x70ab, 0xffff, 0x003e, 0x0478, 0x0026, 0x2011, 0x0010, 0x080c, -+ 0x668b, 0x002e, 0x0118, 0x70ab, 0xffff, 0x0410, 0x900e, 0x080c, -+ 0x2424, 0x080c, 0x6210, 0x11c0, 0x080c, 0x6667, 0x1168, 0x7030, -+ 0xd08c, 0x0130, 0xb800, 0xd0bc, 0x0138, 0x080c, 0x655f, 0x0120, -+ 0x080c, 0x2eff, 0x0148, 0x0028, 0x080c, 0x3057, 0x080c, 0x2f2b, -+ 0x0118, 0x8318, 0x0804, 0x2e25, 0x73aa, 0x0010, 0x70ab, 0xffff, -+ 0x003e, 0x0804, 0x2ee1, 0x9780, 0x318b, 0x203d, 0x97bc, 0xff00, -+ 0x873f, 0x2041, 0x007e, 0x70a8, 0x9096, 0xffff, 0x1118, 0x900e, -+ 0x28a8, 0x0050, 0x9812, 0x0220, 0x2008, 0x9802, 0x20a8, 0x0020, -+ 0x70ab, 0xffff, 0x0804, 0x2ee1, 0x2700, 0x0156, 0x0016, 0x9106, -+ 0x0904, 0x2ed6, 0x0026, 0x2011, 0x0010, 0x080c, 0x668b, 0x002e, -+ 0x0120, 0x2009, 0xffff, 0x0804, 0x2ede, 0xc484, 0x080c, 0x6270, -+ 0x0138, 0x080c, 0xbf61, 0x1590, 0x080c, 0x6210, 0x15b8, 0x0008, -+ 0xc485, 0x080c, 0x6667, 0x1130, 0x7030, 0xd08c, 0x01f8, 0xb800, -+ 0xd0bc, 0x11e0, 0x7290, 0xd28c, 0x0180, 0x080c, 0x6667, 0x9082, -+ 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c, 0x6234, 0x0028, 0x080c, -+ 0x30ef, 0x01a0, 0x080c, 0x311a, 0x0088, 0x080c, 0x3057, 0x080c, -+ 0xbf61, 0x1160, 0x080c, 0x2f2b, 0x0188, 0x0040, 0x080c, 0xbf61, -+ 0x1118, 0x080c, 0x30ef, 0x0110, 0x0451, 0x0140, 0x001e, 0x8108, -+ 0x015e, 0x1f04, 0x2e8c, 0x70ab, 0xffff, 0x0018, 0x001e, 0x015e, -+ 0x71aa, 0x004e, 0x002e, 0x00ce, 0x00be, 0x0005, 0x00c6, 0x0016, -+ 0x70ab, 0x0001, 0x2009, 0x007e, 0x080c, 0x6210, 0x1168, 0xb813, -+ 0x00ff, 0xb817, 0xfffe, 0x080c, 0x3057, 0x04a9, 0x0128, 0x70d8, -+ 0xc0bd, 0x70da, 0x080c, 0xbcae, 0x001e, 0x00ce, 0x0005, 0x0016, -+ 0x0076, 0x00d6, 0x00c6, 0x2001, 0x1858, 0x2004, 0x9084, 0x00ff, -+ 0xb842, 0x080c, 0x9c58, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xbcdb, -+ 0x6023, 0x0001, 0x9006, 0x080c, 0x61ad, 0x2001, 0x0000, 0x080c, -+ 0x61c1, 0x0126, 0x2091, 0x8000, 0x70a4, 0x8000, 0x70a6, 0x012e, -+ 0x2009, 0x0004, 0x080c, 0x9c85, 0x9085, 0x0001, 0x00ce, 0x00de, -+ 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, -+ 0x1858, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0x9c58, 0x0548, -+ 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, 0x007e, -+ 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, 0x080c, -+ 0x3006, 0x080c, 0xbcdb, 0x6023, 0x0001, 0x9006, 0x080c, 0x61ad, -+ 0x2001, 0x0002, 0x080c, 0x61c1, 0x0126, 0x2091, 0x8000, 0x70a4, -+ 0x8000, 0x70a6, 0x012e, 0x2009, 0x0002, 0x080c, 0x9c85, 0x9085, -+ 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, 0x00c6, -+ 0x0026, 0x2009, 0x0080, 0x080c, 0x6210, 0x1140, 0xb813, 0x00ff, -+ 0xb817, 0xfffc, 0x0039, 0x0110, 0x70df, 0xffff, 0x002e, 0x00ce, -+ 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, 0x9b91, -+ 0x01d0, 0x2b00, 0x6012, 0x080c, 0xbcdb, 0x6023, 0x0001, 0x9006, -+ 0x080c, 0x61ad, 0x2001, 0x0002, 0x080c, 0x61c1, 0x0126, 0x2091, -+ 0x8000, 0x70e0, 0x8000, 0x70e2, 0x012e, 0x2009, 0x0002, 0x080c, -+ 0x9c85, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, -+ 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, 0x080c, -+ 0x6210, 0x11b8, 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8c7, 0x0004, -+ 0x080c, 0x9b91, 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, 0x0001, -+ 0x620a, 0x080c, 0xbcdb, 0x2009, 0x0022, 0x080c, 0x9c85, 0x9085, -+ 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, 0x0066, -+ 0x0036, 0x0026, 0x00b6, 0x21f0, 0x9036, 0x080c, 0x98c8, 0x1110, -+ 0x2031, 0x0001, 0x0066, 0x080c, 0x8646, 0x080c, 0x85c6, 0x080c, -+ 0x981e, 0x080c, 0xab46, 0x006e, 0x86ff, 0x0110, 0x080c, 0x98e4, -+ 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, 0x0018, -+ 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6270, 0x1140, 0x9686, -+ 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x5cf6, 0x001e, -+ 0x8108, 0x1f04, 0x2feb, 0x9686, 0x0001, 0x190c, 0x3155, 0x00be, -+ 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, -+ 0x0046, 0x0036, 0x0026, 0x0016, 0x00b6, 0x9016, 0x080c, 0x98c8, -+ 0x1110, 0x2011, 0x0001, 0x0026, 0x6210, 0x2258, 0xbaa0, 0x0026, -+ 0x2019, 0x0029, 0x080c, 0x863b, 0x0076, 0x2039, 0x0000, 0x080c, -+ 0x852a, 0x2c08, 0x080c, 0xcfc8, 0x007e, 0x001e, 0x002e, 0x82ff, -+ 0x0110, 0x080c, 0x98e4, 0xba10, 0xbb14, 0xbc84, 0x080c, 0x5cf6, -+ 0xba12, 0xbb16, 0xbc86, 0x00be, 0x001e, 0x002e, 0x003e, 0x004e, -+ 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, 0x2058, -+ 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, 0x70a4, -+ 0x9005, 0x0110, 0x8001, 0x70a6, 0x000e, 0x00ee, 0x0005, 0x2071, -+ 0x1800, 0x70e0, 0x9005, 0x0dc0, 0x8001, 0x70e2, 0x0ca8, 0xb800, -+ 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, 0x0046, -+ 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x9016, 0x080c, 0x98c8, -+ 0x1110, 0x2011, 0x0001, 0x0026, 0x81ff, 0x1118, 0x20a9, 0x0001, -+ 0x0070, 0x080c, 0x538d, 0xd0c4, 0x0138, 0x0030, 0x9006, 0x2020, -+ 0x2009, 0x002d, 0x080c, 0xd273, 0x20a9, 0x0800, 0x9016, 0x0026, -+ 0x928e, 0x007e, 0x0904, 0x30c9, 0x928e, 0x007f, 0x0904, 0x30c9, -+ 0x928e, 0x0080, 0x05f0, 0x9288, 0x1000, 0x210c, 0x81ff, 0x05c8, -+ 0x8fff, 0x1150, 0x2001, 0x195f, 0x0006, 0x2003, 0x0001, 0x080c, -+ 0x30dc, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, 0x2158, 0x2001, -+ 0x0001, 0x080c, 0x6631, 0x00ce, 0x00be, 0x2019, 0x0029, 0x080c, -+ 0x863b, 0x0076, 0x2039, 0x0000, 0x080c, 0x852a, 0x00b6, 0x00c6, -+ 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, 0x0006, 0x1118, -+ 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, 0x9215, 0xba06, -+ 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, 0xcfc8, 0x001e, -+ 0x007e, 0x002e, 0x8210, 0x1f04, 0x307f, 0x002e, 0x82ff, 0x0110, -+ 0x080c, 0x98e4, 0x015e, 0x001e, 0x002e, 0x003e, 0x004e, 0x00be, -+ 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, 0x0016, 0x080c, -+ 0x538d, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, 0x2220, 0x2009, -+ 0x0029, 0x080c, 0xd273, 0x001e, 0x002e, 0x004e, 0x0005, 0x0016, -+ 0x0026, 0x0036, 0x00c6, 0x7290, 0x82ff, 0x01e8, 0x080c, 0x665f, -+ 0x11d0, 0x2100, 0x080c, 0x2457, 0x81ff, 0x01b8, 0x2019, 0x0001, -+ 0x8314, 0x92e0, 0x1d80, 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, 0x0066, -+ 0x9036, 0x080c, 0x98c8, 0x1110, 0x2031, 0x0001, 0x0066, 0x0036, -+ 0x2019, 0x0029, 0x00d9, 0x003e, 0x006e, 0x86ff, 0x0110, 0x080c, -+ 0x98e4, 0x006e, 0x9180, 0x1000, 0x2004, 0x9065, 0x0158, 0x0016, -+ 0x00c6, 0x2061, 0x1b02, 0x001e, 0x6112, 0x080c, 0x3006, 0x001e, -+ 0x080c, 0x6234, 0x012e, 0x00ce, 0x001e, 0x0005, 0x0016, 0x0026, -+ 0x2110, 0x080c, 0x94f4, 0x080c, 0xd529, 0x002e, 0x001e, 0x0005, -+ 0x2001, 0x1836, 0x2004, 0xd0cc, 0x0005, 0x00c6, 0x00b6, 0x080c, -+ 0x70b7, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, 0x0782, 0x080c, -+ 0x70b7, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, 0x9180, 0x1000, -+ 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, 0xd0bc, 0x090c, -+ 0x6234, 0x8108, 0x1f04, 0x3166, 0x2061, 0x1800, 0x607b, 0x0000, -+ 0x607c, 0x9084, 0x00ff, 0x607e, 0x60af, 0x0000, 0x00be, 0x00ce, -+ 0x0005, 0x2001, 0x1875, 0x2004, 0xd0bc, 0x0005, 0x2011, 0x1854, -+ 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, 0x1894, 0x7003, 0x0002, 0x9006, -+ 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, 0x703b, -+ 0x18b0, 0x703f, 0x18b0, 0x7007, 0x0001, 0x080c, 0x103b, 0x090c, -+ 0x0d65, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, 0x080c, -+ 0x103b, 0x090c, 0x0d65, 0x2900, 0x706e, 0xa867, 0x0002, 0xa8ab, -+ 0xdcb0, 0x0005, 0x2071, 0x1894, 0x7004, 0x0002, 0x32ba, 0x32bb, -+ 0x32ce, 0x32e2, 0x0005, 0x1004, 0x32cb, 0x0e04, 0x32cb, 0x2079, -+ 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, 0x700f, -+ 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, 0x0000, -+ 0x2061, 0x18ae, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, 0x9086, -+ 0x0200, 0x0904, 0x33b6, 0x0005, 0x7018, 0x2048, 0x2061, 0x1800, -+ 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff, 0x9296, -+ 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086, 0x0103, -+ 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, 0x1800, 0x701c, 0x0807, -+ 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, 0x1210, 0x61cc, 0x0042, -+ 0x2100, 0x908a, 0x003f, 0x1a04, 0x33b3, 0x61cc, 0x0804, 0x3348, -+ 0x338a, 0x33c2, 0x33cc, 0x33d0, 0x33da, 0x33e0, 0x33e4, 0x33f4, -+ 0x33f7, 0x3401, 0x3406, 0x340b, 0x3416, 0x3421, 0x3430, 0x343f, -+ 0x344d, 0x3464, 0x347f, 0x33b3, 0x3528, 0x3566, 0x360b, 0x361c, -+ 0x363f, 0x33b3, 0x33b3, 0x33b3, 0x3677, 0x3697, 0x36a0, 0x36cc, -+ 0x36d2, 0x33b3, 0x3718, 0x33b3, 0x33b3, 0x33b3, 0x33b3, 0x33b3, -+ 0x3723, 0x372c, 0x3734, 0x3736, 0x33b3, 0x33b3, 0x33b3, 0x33b3, -+ 0x33b3, 0x33b3, 0x3766, 0x33b3, 0x33b3, 0x33b3, 0x33b3, 0x33b3, -+ 0x3783, 0x37de, 0x33b3, 0x33b3, 0x33b3, 0x33b3, 0x33b3, 0x33b3, -+ 0x0002, 0x3808, 0x380b, 0x386a, 0x3883, 0x38b3, 0x3b55, 0x33b3, -+ 0x4f5e, 0x33b3, 0x33b3, 0x33b3, 0x33b3, 0x33b3, 0x33b3, 0x33b3, -+ 0x33b3, 0x3401, 0x3406, 0x4054, 0x53b1, 0x406a, 0x4fed, 0x503e, -+ 0x5141, 0x33b3, 0x51a3, 0x51df, 0x5210, 0x531c, 0x523d, 0x529c, -+ 0x33b3, 0x406e, 0x41fe, 0x4214, 0x4239, 0x429e, 0x4312, 0x4332, -+ 0x43a9, 0x4405, 0x4461, 0x4464, 0x4489, 0x44fc, 0x4566, 0x456e, -+ 0x46a0, 0x4802, 0x4836, 0x4a80, 0x33b3, 0x4a9e, 0x4b61, 0x4c37, -+ 0x33b3, 0x33b3, 0x33b3, 0x33b3, 0x4c9d, 0x4cb8, 0x456e, 0x4efe, -+ 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x48b4, 0x0126, 0x2091, -+ 0x8000, 0x0e04, 0x3394, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, -+ 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7c82, -+ 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, -+ 0xd084, 0x190c, 0x11be, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, -+ 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021, 0x4002, -+ 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, 0x4005, 0x0868, 0x2021, -+ 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, -+ 0x7884, 0x7990, 0x0804, 0x48c1, 0x7883, 0x0004, 0x7884, 0x0807, -+ 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, 0x7990, -+ 0x0804, 0x48c4, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, 0x338a, -+ 0x7984, 0x2114, 0x0804, 0x338a, 0x20e1, 0x0000, 0x2099, 0x0021, -+ 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, 0x7984, -+ 0x7a88, 0x7b8c, 0x0804, 0x338a, 0x7884, 0x2060, 0x04d8, 0x2009, -+ 0x0003, 0x2011, 0x0002, 0x2019, 0x001c, 0x789b, 0x0317, 0x0804, -+ 0x338a, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039, 0x0001, -+ 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, -+ 0x33bf, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x33c6, 0x79a0, 0x9182, -+ 0x0040, 0x0210, 0x0804, 0x33bf, 0x2138, 0x7d98, 0x7c9c, 0x0804, -+ 0x33d4, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x33bf, 0x21e8, -+ 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, 0x338a, -+ 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, 0x8109, -+ 0x1dd8, 0x2010, 0x9005, 0x0904, 0x338a, 0x0804, 0x33b9, 0x79a0, -+ 0x9182, 0x0040, 0x0210, 0x0804, 0x33bf, 0x21e0, 0x20a9, 0x0001, -+ 0x7984, 0x2198, 0x4012, 0x0804, 0x338a, 0x2069, 0x1853, 0x7884, -+ 0x7990, 0x911a, 0x1a04, 0x33bf, 0x8019, 0x0904, 0x33bf, 0x684a, -+ 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, 0x685e, -+ 0x080c, 0x73e8, 0x0804, 0x338a, 0x2069, 0x1853, 0x7884, 0x7994, -+ 0x911a, 0x1a04, 0x33bf, 0x8019, 0x0904, 0x33bf, 0x684e, 0x6946, -+ 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x6769, 0x012e, 0x0804, 0x338a, 0x902e, -+ 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x33bc, 0x7984, -+ 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, 0x189c, -+ 0x4101, 0x080c, 0x4878, 0x1120, 0x2009, 0x0002, 0x0804, 0x33bc, -+ 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x48c1, -+ 0x701f, 0x34a3, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, 0x9096, -+ 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, 0x0138, -+ 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x33bc, 0x810f, -+ 0x918c, 0x00ff, 0x0904, 0x33bc, 0x7112, 0x7010, 0x8001, 0x0560, -+ 0x7012, 0x080c, 0x4878, 0x1120, 0x2009, 0x0002, 0x0804, 0x33bc, -+ 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, 0xa598, -+ 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, -+ 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x48c1, 0x701f, 0x34e1, -+ 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, 0x9096, -+ 0x000a, 0x1904, 0x33bc, 0x0888, 0x7014, 0x2048, 0xa868, 0xc0fd, -+ 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, 0xc2fd, -+ 0xaa7a, 0x080c, 0x5de4, 0x0150, 0x0126, 0x2091, 0x8000, 0xa87a, -+ 0xa982, 0x012e, 0x0050, 0x080c, 0x60fb, 0x1128, 0x7007, 0x0003, -+ 0x701f, 0x350d, 0x0005, 0x080c, 0x6bb3, 0x0126, 0x2091, 0x8000, -+ 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x189c, 0x400a, 0x2100, -+ 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, 0xa85c, -+ 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, 0x48c4, -+ 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, 0x19f3, 0x2004, 0x9005, 0x0128, 0x2001, -+ 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, 0x0002, -+ 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, 0x1904, -+ 0x33bc, 0x7984, 0x080c, 0x6270, 0x1904, 0x33bf, 0x7e98, 0x9684, -+ 0x3fff, 0x9082, 0x4000, 0x1a04, 0x33bf, 0x7c88, 0x7d8c, 0x080c, -+ 0x64a2, 0x080c, 0x6433, 0x1518, 0x2061, 0x1ddc, 0x0126, 0x2091, -+ 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, -+ 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, 0x9ce0, -+ 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1a04, 0x33bc, 0x0c30, -+ 0x080c, 0xb452, 0x012e, 0x0904, 0x33bc, 0x0804, 0x338a, 0x900e, -+ 0x2001, 0x0005, 0x080c, 0x6bb3, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0xbb4b, 0x080c, 0x6996, 0x012e, 0x0804, 0x338a, 0x00a6, 0x2950, -+ 0xb198, 0x080c, 0x6270, 0x1904, 0x35f8, 0xb6a4, 0x9684, 0x3fff, -+ 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x64a2, 0x080c, -+ 0x644d, 0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000, 0x6000, -+ 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, 0x9406, -+ 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x001c, 0x2001, -+ 0x1819, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, 0x080c, -+ 0xb452, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, 0x2001, -+ 0x0005, 0x080c, 0x6bb3, 0x0126, 0x2091, 0x8000, 0x080c, 0xbb4b, -+ 0x080c, 0x698a, 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, 0x33bc, 0x080c, 0x488f, -+ 0x0904, 0x33bf, 0x080c, 0x6337, 0x0904, 0x33bc, 0x080c, 0x64a8, -+ 0x0904, 0x33bc, 0x0804, 0x4329, 0x81ff, 0x1904, 0x33bc, 0x080c, -+ 0x48ab, 0x0904, 0x33bf, 0x080c, 0x6536, 0x0904, 0x33bc, 0x2019, -+ 0x0005, 0x79a8, 0x080c, 0x64c3, 0x0904, 0x33bc, 0x7888, 0x908a, -+ 0x1000, 0x1a04, 0x33bf, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, -+ 0x8167, 0x7984, 0xd184, 0x1904, 0x338a, 0x0804, 0x4329, 0x0126, -+ 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, 0x2029, -+ 0x07ff, 0x6458, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, 0x6270, -+ 0x11d8, 0x080c, 0x6536, 0x1128, 0x2009, 0x0002, 0x62bc, 0x2518, -+ 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x64c3, 0x1118, 0x2009, -+ 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, 0x800b, -+ 0x810b, 0x9108, 0x080c, 0x8167, 0x8529, 0x1ae0, 0x012e, 0x0804, -+ 0x338a, 0x012e, 0x0804, 0x33bc, 0x012e, 0x0804, 0x33bf, 0x080c, -+ 0x488f, 0x0904, 0x33bf, 0x080c, 0x6337, 0x0904, 0x33bc, 0x080c, -+ 0x98c8, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, 0x863b, -+ 0x0076, 0x903e, 0x080c, 0x852a, 0x900e, 0x080c, 0xcfc8, 0x007e, -+ 0x00ce, 0x080c, 0x98e4, 0x080c, 0x64a2, 0x0804, 0x338a, 0x080c, -+ 0x488f, 0x0904, 0x33bf, 0x080c, 0x64a2, 0x2208, 0x0804, 0x338a, -+ 0x0156, 0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1906, 0x6810, 0x6914, -+ 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x2071, 0x19b8, -+ 0x7028, 0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8, 0x2300, 0x9218, -+ 0x00ce, 0x00ee, 0x00de, 0x015e, 0x0804, 0x338a, 0x00f6, 0x0016, -+ 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, 0x2178, -+ 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1906, 0x6910, 0x62b8, -+ 0x0804, 0x338a, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x33bc, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x53a1, 0x0128, 0x2009, 0x0007, -+ 0x012e, 0x0804, 0x33bc, 0x012e, 0x6158, 0x9190, 0x318b, 0x2215, -+ 0x9294, 0x00ff, 0x6378, 0x83ff, 0x0108, 0x627c, 0x67d8, 0x97c4, -+ 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8, 0x97c4, -+ 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8, 0x97c4, -+ 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, 0x0068, 0x080c, -+ 0x70b7, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, 0x2009, -+ 0x0005, 0x0804, 0x33bc, 0x9036, 0x7e9a, 0x7f9e, 0x0804, 0x338a, -+ 0x6148, 0x624c, 0x2019, 0x1957, 0x231c, 0x2001, 0x1958, 0x2004, -+ 0x789a, 0x0804, 0x338a, 0x0126, 0x2091, 0x8000, 0x6138, 0x623c, -+ 0x6340, 0x012e, 0x0804, 0x338a, 0x080c, 0x48ab, 0x0904, 0x33bf, -+ 0xba44, 0xbb38, 0x0804, 0x338a, 0x080c, 0x0d65, 0x080c, 0x48ab, -+ 0x2110, 0x0904, 0x33bf, 0xb804, 0x908c, 0x00ff, 0x918e, 0x0006, -+ 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, 0x1904, -+ 0x33bc, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, 0x9066, -+ 0x080c, 0x98c8, 0x080c, 0x94f4, 0x080c, 0x863b, 0x0076, 0x903e, -+ 0x080c, 0x852a, 0x900e, 0x080c, 0xcfc8, 0x007e, 0x00ce, 0x080c, -+ 0x98e4, 0xb807, 0x0407, 0x012e, 0x0804, 0x338a, 0x6148, 0x624c, -+ 0x7884, 0x604a, 0x7b88, 0x634e, 0x2069, 0x1853, 0x831f, 0x9305, -+ 0x6816, 0x788c, 0x2069, 0x1957, 0x2d1c, 0x206a, 0x7e98, 0x9682, -+ 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1958, 0x2d04, 0x266a, -+ 0x789a, 0x0804, 0x338a, 0x0126, 0x2091, 0x8000, 0x6138, 0x7884, -+ 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0eb4, 0xd0c4, 0x01a8, 0x00d6, -+ 0x78a8, 0x2009, 0x196e, 0x200a, 0x78ac, 0x2011, 0x196f, 0x2012, -+ 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, 0x6a5a, -+ 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e, 0x2011, 0x0116, -+ 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, 0x0010, 0x918c, -+ 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4, 0x190c, -+ 0x0ecf, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, 0x0114, 0x2012, -+ 0x012e, 0x0804, 0x338a, 0x00f6, 0x2079, 0x1800, 0x7a38, 0xa898, -+ 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, 0x8002, 0x9214, -+ 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, 0x4000, 0x900e, -+ 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, 0x7898, 0x9005, -+ 0x01a8, 0x7888, 0x9025, 0x0904, 0x33bf, 0x788c, 0x902d, 0x0904, -+ 0x33bf, 0x900e, 0x080c, 0x6270, 0x1120, 0xba44, 0xbb38, 0xbc46, -+ 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, 0x080c, 0x48ab, -+ 0x0904, 0x33bf, 0x7888, 0x900d, 0x0904, 0x33bf, 0x788c, 0x9005, -+ 0x0904, 0x33bf, 0xba44, 0xb946, 0xbb38, 0xb83a, 0x0804, 0x338a, -+ 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, 0x53a1, 0x1904, -+ 0x33bc, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, 0x00ff, 0x1130, -+ 0x2001, 0x1817, 0x2004, 0x9085, 0xff00, 0x0088, 0x9182, 0x007f, -+ 0x16e0, 0x9188, 0x318b, 0x210d, 0x918c, 0x00ff, 0x2001, 0x1817, -+ 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, 0x9105, 0x0126, -+ 0x2091, 0x8000, 0x0006, 0x080c, 0x9b91, 0x000e, 0x0510, 0x602e, -+ 0x620a, 0x7984, 0x00b6, 0x080c, 0x6216, 0x2b08, 0x00be, 0x1500, -+ 0x6112, 0x6023, 0x0001, 0x080c, 0x4878, 0x01d0, 0x9006, 0xa866, -+ 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x701f, 0x3863, -+ 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0x9c85, 0x012e, 0x00ce, -+ 0x0005, 0x012e, 0x00ce, 0x0804, 0x33bc, 0x00ce, 0x0804, 0x33bf, -+ 0x080c, 0x9be7, 0x0cb0, 0xa830, 0x9086, 0x0100, 0x0904, 0x33bc, -+ 0x0804, 0x338a, 0x2061, 0x1a3f, 0x0126, 0x2091, 0x8000, 0x6000, -+ 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, 0x6350, 0x6070, -+ 0x789a, 0x60bc, 0x789e, 0x60b8, 0x78aa, 0x012e, 0x0804, 0x338a, -+ 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x33bc, 0x080c, 0x70b7, -+ 0x0904, 0x33bc, 0x0126, 0x2091, 0x8000, 0x6250, 0x6070, 0x9202, -+ 0x0248, 0x9085, 0x0001, 0x080c, 0x248d, 0x080c, 0x55bb, 0x012e, -+ 0x0804, 0x338a, 0x012e, 0x0804, 0x33bf, 0x0006, 0x0016, 0x00c6, -+ 0x00e6, 0x2001, 0x197a, 0x2070, 0x2061, 0x1853, 0x6008, 0x2072, -+ 0x900e, 0x2011, 0x1400, 0x080c, 0x8419, 0x7206, 0x00ee, 0x00ce, -+ 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, 0x81ff, 0x0128, -+ 0x012e, 0x2021, 0x400b, 0x0804, 0x338c, 0x7884, 0xd0fc, 0x0148, -+ 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, 0x012e, 0x0804, -+ 0x33bf, 0x2001, 0x002a, 0x2004, 0x2069, 0x1853, 0x6908, 0x9102, -+ 0x1230, 0x012e, 0x0804, 0x33bf, 0x012e, 0x0804, 0x33bc, 0x080c, -+ 0x9b66, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x392e, 0x00c6, 0x080c, -+ 0x4878, 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, 0x3ab8, 0x0928, 0x7014, -+ 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, 0xa808, 0xd0b4, -+ 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, 0x8006, 0x8007, -+ 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x48c1, -+ 0x701f, 0x39f5, 0x7023, 0x0001, 0x012e, 0x0005, 0x080c, 0x98c8, -+ 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, -+ 0x00f6, 0x080c, 0x389d, 0x2001, 0x1970, 0x2003, 0x0000, 0x2021, -+ 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, 0x0000, 0x60bf, -+ 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3b27, 0x080c, 0x3ae6, 0x00f6, -+ 0x00e6, 0x0086, 0x2940, 0x2071, 0x19b8, 0x2079, 0x0090, 0x00d6, -+ 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, 0x0035, 0x2004, -+ 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, 0x2011, 0x0001, -+ 0x080c, 0x3e98, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3dc5, 0x080c, -+ 0x3cf2, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1db8, -+ 0x080c, 0x3f0c, 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, 0x181f, 0x2004, 0x9106, -+ 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, 0x1e00, 0x00ce, -+ 0x0138, 0x080c, 0x3cfc, 0x080c, 0x3ae1, 0x0058, 0x080c, 0x3ae1, -+ 0x080c, 0x3e30, 0x080c, 0x3dbb, 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, 0x12d6, 0x2009, 0x0028, 0x080c, -+ 0x2052, 0x2001, 0x0227, 0x200c, 0x2102, 0x080c, 0x98e4, 0x00fe, -+ 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x008e, 0x004e, -+ 0x2001, 0x1970, 0x2004, 0x9005, 0x1118, 0x012e, 0x0804, 0x338a, -+ 0x012e, 0x2021, 0x400c, 0x0804, 0x338c, 0x0016, 0x0026, 0x0036, -+ 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, 0x0156, 0x7014, -+ 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, 0x9005, 0x0904, -+ 0x3a51, 0x2048, 0x1f04, 0x3a05, 0x7068, 0x2040, 0xa28c, 0xa390, -+ 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, -+ 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, 0x009e, 0x9086, -+ 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, -+ 0xffc0, 0x9080, 0x001b, 0x080c, 0x48c1, 0x701f, 0x39f5, 0x00b0, -+ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, -+ 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, 0x0006, 0x080c, -+ 0x0f9f, 0x000e, 0x080c, 0x48c4, 0x701f, 0x39f5, 0x015e, 0x00de, -+ 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, -+ 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, 0x1118, 0x701f, -+ 0x3ab6, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, 0xa86a, 0x2009, -+ 0x007f, 0x080c, 0x6210, 0x0110, 0x9006, 0x0030, 0xb813, 0x00ff, -+ 0xb817, 0xfffd, 0x080c, 0xbd2a, 0x015e, 0x00de, 0x009e, 0x008e, -+ 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0904, 0x33bc, -+ 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, -+ 0x00d6, 0x0156, 0x701f, 0x3a88, 0x7007, 0x0003, 0x0804, 0x3a46, -+ 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, 0x338c, 0x0076, -+ 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, 0x0f9f, 0x000e, 0x080c, 0x48c4, -+ 0x007e, 0x701f, 0x39f5, 0x7023, 0x0001, 0x0005, 0x0804, 0x338a, -+ 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, 0xa833, 0x001e, -+ 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, 0x080c, 0x4878, -+ 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, 0x1970, 0x2003, 0x0001, 0x0005, 0x00f6, 0x00e6, -+ 0x00c6, 0x2061, 0x0200, 0x2001, 0x197b, 0x2004, 0x601a, 0x2061, -+ 0x0100, 0x2001, 0x197a, 0x2004, 0x60ce, 0x6104, 0xc1ac, 0x6106, -+ 0x080c, 0x4878, 0xa813, 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, -+ 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, -+ 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x197a, 0x2004, 0x6036, -+ 0x2009, 0x0040, 0x080c, 0x2052, 0x2001, 0x002a, 0x2004, 0x9084, -+ 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, 0x0000, 0x78ca, -+ 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x00e6, -+ 0x080c, 0x4878, 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, 0x2811, 0x1130, 0x9006, 0x080c, 0x276e, -+ 0x9006, 0x080c, 0x2751, 0x7884, 0x9084, 0x0007, 0x0002, 0x3b72, -+ 0x3b7b, 0x3b84, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x3b6f, 0x012e, -+ 0x0804, 0x33bf, 0x2009, 0x0114, 0x2104, 0x9085, 0x0800, 0x200a, -+ 0x080c, 0x3d46, 0x00c0, 0x2009, 0x0114, 0x2104, 0x9085, 0x4000, -+ 0x200a, 0x080c, 0x3d46, 0x0078, 0x080c, 0x70b7, 0x1128, 0x012e, -+ 0x2009, 0x0016, 0x0804, 0x33bc, 0x81ff, 0x0128, 0x012e, 0x2021, -+ 0x400b, 0x0804, 0x338c, 0x080c, 0x98c8, 0x0086, 0x0096, 0x00a6, -+ 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x389d, 0x2009, -+ 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, 0x2068, 0x2060, -+ 0x2058, 0x080c, 0x3fe7, 0x080c, 0x3f37, 0x903e, 0x2720, 0x00f6, -+ 0x00e6, 0x0086, 0x2940, 0x2071, 0x19b8, 0x2079, 0x0090, 0x00d6, -+ 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, 0x780e, 0x68d0, -+ 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x3e98, 0x080c, 0x2819, -+ 0x080c, 0x2819, 0x080c, 0x2819, 0x080c, 0x2819, 0x080c, 0x3e98, -+ 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3dc5, 0x2009, 0x9c40, 0x8109, -+ 0x11b0, 0x080c, 0x3cfc, 0x2001, 0x0004, 0x200c, 0x918c, 0xfffd, -+ 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, -+ 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x33bc, 0x0cf8, 0x2001, -+ 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, 0x2079, 0x0000, -+ 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, 0x200c, 0x81ff, -+ 0x0150, 0x080c, 0x3da3, 0x2d00, 0x9c05, 0x9b05, 0x0120, 0x080c, -+ 0x3cfc, 0x0804, 0x3ca5, 0x080c, 0x3f0c, 0x080c, 0x3e30, 0x080c, -+ 0x3d86, 0x080c, 0x3dbb, 0x00f6, 0x2079, 0x0100, 0x7824, 0xd0ac, -+ 0x0130, 0x8b58, 0x080c, 0x3cfc, 0x00fe, 0x0804, 0x3ca5, 0x00fe, -+ 0x080c, 0x3cf2, 0x1150, 0x8d68, 0x2001, 0x0032, 0x2602, 0x2001, -+ 0x0033, 0x2502, 0x080c, 0x3cfc, 0x0080, 0x87ff, 0x0138, 0x2001, -+ 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, 0x2001, 0x1a3c, -+ 0x2004, 0x9086, 0x0000, 0x1904, 0x3bf5, 0x2001, 0x032f, 0x2003, -+ 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, 0x0904, 0x3ca5, -+ 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, 0x1904, 0x3ca5, -+ 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, 0x7884, 0xd0ac, -+ 0x1148, 0x2001, 0x1a3c, 0x2003, 0x0003, 0x2001, 0x032a, 0x2003, -+ 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, 0x0108, 0xa016, -+ 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x2052, 0x2900, 0xa85a, -+ 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, 0x0000, 0x00c6, -+ 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, 0x2001, 0x0203, -+ 0x2004, 0x1f04, 0x3c7c, 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, 0x3baf, 0x001e, 0x00c6, 0x2001, -+ 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, 0x0002, 0x6106, -+ 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, 0x200c, 0x918c, -+ 0xfffd, 0x2102, 0x080c, 0x12d6, 0x7884, 0x9084, 0x0003, 0x9086, -+ 0x0002, 0x01b0, 0x2009, 0x0028, 0x080c, 0x2052, 0x2001, 0x0227, -+ 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ff, 0x080c, 0x28d4, 0x6052, -+ 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, 0x6043, 0x0010, -+ 0x080c, 0x98e4, 0x00ce, 0x2d08, 0x2c10, 0x2b18, 0x2b00, 0x9c05, -+ 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, -+ 0x008e, 0x1118, 0x012e, 0x0804, 0x338a, 0x012e, 0x2021, 0x400c, -+ 0x0804, 0x338c, 0x9085, 0x0001, 0x1d04, 0x3cfb, 0x2091, 0x6000, -+ 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, 0x2003, 0x0010, -+ 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a3c, 0x2003, 0x0000, -+ 0x0071, 0x2009, 0x0048, 0x080c, 0x2052, 0x2001, 0x0227, 0x2024, -+ 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, 0x0005, 0x00f6, -+ 0x00e6, 0x2071, 0x19b8, 0x7054, 0x9086, 0x0000, 0x0520, 0x2079, -+ 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, -+ 0x1120, 0x2009, 0x0040, 0x080c, 0x2052, 0x782c, 0xd0fc, 0x0d88, -+ 0x080c, 0x3f0c, 0x7054, 0x9086, 0x0000, 0x1d58, 0x782b, 0x0004, -+ 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, 0x2052, 0x782b, -+ 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0x2079, -+ 0x0100, 0x2001, 0x1817, 0x200c, 0x7932, 0x7936, 0x080c, 0x246d, -+ 0x080c, 0x2890, 0x080c, 0x28d4, 0x784b, 0xf7f7, 0x7843, 0x0090, -+ 0x7843, 0x0010, 0x7850, 0xc0e5, 0x7852, 0x2019, 0x61a8, 0x7820, -+ 0xd09c, 0x0110, 0x8319, 0x1dd8, 0x7850, 0xc0e4, 0x7852, 0x2011, -+ 0x0048, 0x080c, 0x286d, 0x7843, 0x0040, 0x2019, 0x01f4, 0xa001, -+ 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, 0x2833, 0x2011, -+ 0x0020, 0x080c, 0x286d, 0x7843, 0x0000, 0x9006, 0x080c, 0x2833, -+ 0x2011, 0x0048, 0x080c, 0x286d, 0x00fe, 0x0005, 0x7884, 0xd0ac, -+ 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a3c, 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, 0x197b, 0x2004, 0x70e2, 0x080c, 0x3ad7, 0x1188, 0x2001, -+ 0x181f, 0x2004, 0x2009, 0x181e, 0x210c, 0x918c, 0x00ff, 0x706e, -+ 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, 0xe109, 0x0080, -+ 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1817, 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, -+ 0x0092, 0x7016, 0x080c, 0x3f0c, 0x00f6, 0x2071, 0x1a3c, 0x2079, -+ 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x689c, -+ 0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, 0x8109, 0x1df0, -+ 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, 0x0011, 0x080c, -+ 0x3e98, 0x2011, 0x0001, 0x080c, 0x3e98, 0x00fe, 0x00ee, 0x0005, -+ 0x00f6, 0x00e6, 0x2071, 0x1a3c, 0x2079, 0x0320, 0x792c, 0xd1fc, -+ 0x0904, 0x3e95, 0x782b, 0x0002, 0x9026, 0xd19c, 0x1904, 0x3e91, -+ 0x7000, 0x0002, 0x3e95, 0x3e46, 0x3e76, 0x3e91, 0xd1bc, 0x1170, -+ 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, 0x080c, 0x3e98, -+ 0x0904, 0x3e95, 0x080c, 0x3e98, 0x0804, 0x3e95, 0x00f6, 0x2079, -+ 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, 0x782b, 0x0004, -+ 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, 0x0de8, 0x080c, -+ 0x3da3, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, 0x78b8, 0x00fe, -+ 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, 0x8001, 0x7002, -+ 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, 0x3e3a, 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, 0x0550, 0x8001, 0x0036, 0x0096, 0xa016, 0xa058, -+ 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, 0x831c, 0x938a, -+ 0x0007, 0x1a0c, 0x0d65, 0x9398, 0x3ec6, 0x231d, 0x083f, 0x9080, -+ 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, 0x003e, 0x908a, -+ 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, 0xa05a, 0x2001, -+ 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, 0x3f03, 0x3efa, -+ 0x3ef1, 0x3ee8, 0x3edf, 0x3ed6, 0x3ecd, 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, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, 0x7912, 0xa9b0, -+ 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, 0xa9bc, 0x7912, -+ 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, 0x7906, 0xa9cc, -+ 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, 0x0086, 0x2071, -+ 0x19b8, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, 0x782b, 0x0002, -+ 0x2940, 0x9026, 0x7054, 0x0002, 0x3f33, 0x3f1f, 0x3f2a, 0x8001, -+ 0x7056, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, 0x3e98, 0x190c, -+ 0x3e98, 0x0048, 0x8001, 0x7056, 0x782c, 0xd0fc, 0x1d38, 0x2011, -+ 0x0001, 0x080c, 0x3e98, 0x008e, 0x00ee, 0x00fe, 0x0005, 0x00f6, -+ 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, 0x197b, 0x2004, -+ 0x601a, 0x2061, 0x0100, 0x2001, 0x197a, 0x2004, 0x60ce, 0x6104, -+ 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, 0x0520, 0x2038, -+ 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, 0x080c, 0x4878, -+ 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, -+ 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, -+ 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3faf, 0x1d68, -+ 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4878, 0xa813, 0x0019, 0xa817, -+ 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, -+ 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, -+ 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, 0x0090, 0x2079, -+ 0x0100, 0x2001, 0x197a, 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, -+ 0x2052, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, 0x601a, 0x0006, -+ 0x2001, 0x002b, 0x2004, 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, -+ 0x4878, 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, 0x4878, 0x2940, 0xa813, -+ 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, 0x0220, 0x2138, -+ 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, 0xa858, 0x2048, -+ 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x3faf, 0x1d68, 0x2900, -+ 0xa85a, 0x00d8, 0x080c, 0x4878, 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, 0x1a3c, 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, -+ 0x0013, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, 0x4004, 0x2009, -+ 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, 0x0108, 0x0005, -+ 0x0804, 0x338a, 0x7d98, 0x7c9c, 0x0804, 0x3481, 0x080c, 0x70b7, -+ 0x190c, 0x5ca1, 0x2069, 0x1853, 0x2d00, 0x2009, 0x0030, 0x7a8c, -+ 0x7b88, 0x7c9c, 0x7d98, 0x2039, 0x0001, 0x080c, 0x48c1, 0x701f, -+ 0x4082, 0x0005, 0x080c, 0x539c, 0x1130, 0x3b00, 0x3a08, 0xc194, -+ 0xc095, 0x20d8, 0x21d0, 0x2069, 0x1853, 0x6800, 0x9005, 0x0904, -+ 0x33bf, 0x6804, 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, 0x33bf, 0x9288, -+ 0x318b, 0x210d, 0x918c, 0x00ff, 0x6162, 0xd0dc, 0x0130, 0x6828, -+ 0x908a, 0x007f, 0x1a04, 0x33bf, 0x605a, 0x6888, 0x9084, 0x0030, -+ 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, 0x2009, 0x1982, 0x9080, -+ 0x2560, 0x2005, 0x200a, 0x2008, 0x2001, 0x0018, 0x080c, 0x98b9, -+ 0x2009, 0x0390, 0x200b, 0x0400, 0x000e, 0x2009, 0x1983, 0x9080, -+ 0x2564, 0x2005, 0x200a, 0x6808, 0x908a, 0x0100, 0x0a04, 0x33bf, -+ 0x908a, 0x0841, 0x1a04, 0x33bf, 0x9084, 0x0007, 0x1904, 0x33bf, -+ 0x680c, 0x9005, 0x0904, 0x33bf, 0x6810, 0x9005, 0x0904, 0x33bf, -+ 0x6848, 0x6940, 0x910a, 0x1a04, 0x33bf, 0x8001, 0x0904, 0x33bf, -+ 0x684c, 0x6944, 0x910a, 0x1a04, 0x33bf, 0x8001, 0x0904, 0x33bf, -+ 0x6814, 0x908c, 0x00ff, 0x614a, 0x8007, 0x9084, 0x00ff, 0x604e, -+ 0x080c, 0x73e8, 0x080c, 0x6734, 0x080c, 0x6769, 0x6808, 0x602a, -+ 0x080c, 0x1fc4, 0x2009, 0x0170, 0x200b, 0x0080, 0xa001, 0xa001, -+ 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, 0x24c7, 0x003e, 0x6000, -+ 0x9086, 0x0000, 0x1904, 0x41ee, 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, 0x1984, 0x20e9, 0x0001, 0x4001, 0x20a9, 0x0004, 0x20a1, -+ 0x199e, 0x20e9, 0x0001, 0x4001, 0x080c, 0x82d0, 0x00c6, 0x900e, -+ 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, 0x0020, 0x839d, 0x12b0, -+ 0x3508, 0x8109, 0x080c, 0x79be, 0x6878, 0x6016, 0x6874, 0x2008, -+ 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, 0x00ff, 0x6006, 0x8108, -+ 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, 0x0001, 0x1f04, 0x4166, -+ 0x00ce, 0x00c6, 0x2061, 0x196d, 0x2063, 0x0001, 0x9006, 0x080c, -+ 0x276e, 0x9006, 0x080c, 0x2751, 0x0000, 0x00ce, 0x00e6, 0x2c70, -+ 0x080c, 0x0e9c, 0x00ee, 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, -+ 0x2204, 0x9085, 0x0180, 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, -+ 0x0030, 0x1128, 0x9294, 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, -+ 0x194d, 0x6a80, 0x9294, 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, -+ 0x0010, 0x0118, 0x928e, 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, -+ 0x253c, 0x2001, 0x193e, 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, -+ 0x0100, 0x602f, 0x0040, 0x602f, 0x0000, 0x00ce, 0x080c, 0x70b7, -+ 0x0128, 0x080c, 0x4c91, 0x0110, 0x080c, 0x248d, 0x60d0, 0x9005, -+ 0x01c0, 0x6003, 0x0001, 0x2009, 0x41d6, 0x00d0, 0x080c, 0x70b7, -+ 0x1168, 0x2011, 0x6f2d, 0x080c, 0x8159, 0x2011, 0x6f20, 0x080c, -+ 0x825f, 0x080c, 0x73bc, 0x080c, 0x6fe8, 0x0040, 0x080c, 0x5b97, -+ 0x0028, 0x6003, 0x0004, 0x2009, 0x41ee, 0x0010, 0x0804, 0x338a, -+ 0x2001, 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, -+ 0x2091, 0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, 0x9086, -+ 0x0000, 0x0904, 0x33bc, 0x2069, 0x1853, 0x7890, 0x6842, 0x7894, -+ 0x6846, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, -+ 0x2039, 0x0001, 0x0804, 0x48c4, 0x9006, 0x080c, 0x248d, 0x81ff, -+ 0x1904, 0x33bc, 0x080c, 0x70b7, 0x11b0, 0x080c, 0x73b7, 0x080c, -+ 0x5cdc, 0x080c, 0x3186, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, -+ 0xbf61, 0x0130, 0x080c, 0x70da, 0x1118, 0x080c, 0x708b, 0x0038, -+ 0x080c, 0x6fe8, 0x0020, 0x080c, 0x5ca1, 0x080c, 0x5b97, 0x0804, -+ 0x338a, 0x81ff, 0x1904, 0x33bc, 0x080c, 0x70b7, 0x1110, 0x0804, -+ 0x33bc, 0x6190, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1d80, -+ 0x2009, 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, -+ 0x8000, 0x2039, 0x0001, 0x080c, 0x48c4, 0x701f, 0x3388, 0x012e, -+ 0x0005, 0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, 0x0040, -+ 0x20e9, 0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, 0x6558, -+ 0x9588, 0x318b, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, -+ 0x0002, 0x2100, 0x9506, 0x01a8, 0x080c, 0x6270, 0x1190, 0xb814, -+ 0x821c, 0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007, 0x201a, -+ 0x0038, 0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, -+ 0x8210, 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, -+ 0x2d0c, 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1d80, -+ 0x2099, 0x1d80, 0x080c, 0x5c2c, 0x0804, 0x4246, 0x080c, 0x48ab, -+ 0x0904, 0x33bf, 0x080c, 0x4878, 0x1120, 0x2009, 0x0002, 0x0804, -+ 0x33bc, 0x080c, 0x538d, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, -+ 0x0538, 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, -+ 0x3181, 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, -+ 0x9086, 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, -+ 0x080c, 0xba16, 0x1120, 0x2009, 0x0003, 0x0804, 0x33bc, 0x7007, -+ 0x0003, 0x701f, 0x42d4, 0x0005, 0x080c, 0x48ab, 0x0904, 0x33bf, -+ 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, 0x0f9f, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, -+ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, -+ 0x0f9f, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, -+ 0x9080, 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, -+ 0x0804, 0x48c4, 0x81ff, 0x1904, 0x33bc, 0x080c, 0x488f, 0x0904, -+ 0x33bf, 0x080c, 0x64b1, 0x0904, 0x33bc, 0x0058, 0xa878, 0x9005, -+ 0x0120, 0x2009, 0x0004, 0x0804, 0x33bc, 0xa974, 0xaa94, 0x0804, -+ 0x338a, 0x080c, 0x5395, 0x0904, 0x338a, 0x701f, 0x431e, 0x7007, -+ 0x0003, 0x0005, 0x81ff, 0x1904, 0x33bc, 0x7888, 0x908a, 0x1000, -+ 0x1a04, 0x33bf, 0x080c, 0x48ab, 0x0904, 0x33bf, 0x080c, 0x6667, -+ 0x0120, 0x080c, 0x666f, 0x1904, 0x33bf, 0x080c, 0x6536, 0x0904, -+ 0x33bc, 0x2019, 0x0004, 0x900e, 0x080c, 0x64c3, 0x0904, 0x33bc, -+ 0x7984, 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, -+ 0x080c, 0x48a9, 0x01e0, 0x080c, 0x6667, 0x0118, 0x080c, 0x666f, -+ 0x11b0, 0x080c, 0x6536, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, -+ 0x2019, 0x0004, 0x080c, 0x64c3, 0x2009, 0x0003, 0x0120, 0xa998, -+ 0xaa9c, 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, -+ 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, -+ 0x4000, 0x080c, 0x5395, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, -+ 0x0001, 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, -+ 0x0060, 0x2029, 0x007e, 0x2061, 0x1800, 0x6458, 0x2400, 0x9506, -+ 0x0110, 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x6270, -+ 0x1138, 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x8167, -+ 0x0005, 0x81ff, 0x1904, 0x33bc, 0x798c, 0x2001, 0x1951, 0x918c, -+ 0x8000, 0x2102, 0x080c, 0x488f, 0x0904, 0x33bf, 0x080c, 0x6667, -+ 0x0120, 0x080c, 0x666f, 0x1904, 0x33bf, 0x080c, 0x6337, 0x0904, -+ 0x33bc, 0x080c, 0x64ba, 0x0904, 0x33bc, 0x2001, 0x1951, 0x2004, -+ 0xd0fc, 0x1904, 0x338a, 0x0804, 0x4329, 0xa9a0, 0x2001, 0x1951, -+ 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x489c, 0x01a0, 0x080c, -+ 0x6667, 0x0118, 0x080c, 0x666f, 0x1170, 0x080c, 0x6337, 0x2009, -+ 0x0002, 0x0128, 0x080c, 0x64ba, 0x1170, 0x2009, 0x0003, 0xa897, -+ 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, -+ 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1951, 0x2004, -+ 0xd0fc, 0x1128, 0x080c, 0x5395, 0x0110, 0x9006, 0x0018, 0x900e, -+ 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904, 0x33bc, -+ 0x798c, 0x2001, 0x1950, 0x918c, 0x8000, 0x2102, 0x080c, 0x488f, -+ 0x0904, 0x33bf, 0x080c, 0x6667, 0x0120, 0x080c, 0x666f, 0x1904, -+ 0x33bf, 0x080c, 0x6337, 0x0904, 0x33bc, 0x080c, 0x64a8, 0x0904, -+ 0x33bc, 0x2001, 0x1950, 0x2004, 0xd0fc, 0x1904, 0x338a, 0x0804, -+ 0x4329, 0xa9a0, 0x2001, 0x1950, 0x918c, 0x8000, 0xc18d, 0x2102, -+ 0x080c, 0x489c, 0x01a0, 0x080c, 0x6667, 0x0118, 0x080c, 0x666f, -+ 0x1170, 0x080c, 0x6337, 0x2009, 0x0002, 0x0128, 0x080c, 0x64a8, -+ 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, -+ 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, -+ 0x4000, 0x2001, 0x1950, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x5395, -+ 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, -+ 0x0005, 0x6100, 0x0804, 0x338a, 0x080c, 0x48ab, 0x0904, 0x33bf, -+ 0x080c, 0x53a1, 0x1904, 0x33bc, 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, -+ 0x338a, 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003, -+ 0x1a04, 0x33bc, 0x6258, 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, 0x48c4, 0x000e, 0x2031, 0x0000, -+ 0x2061, 0x18ae, 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, -+ 0xa392, 0xa496, 0xa59a, 0x080c, 0x110c, 0x7007, 0x0002, 0x701f, -+ 0x44e2, 0x0005, 0x81ff, 0x1904, 0x33bc, 0x080c, 0x48ab, 0x0904, -+ 0x33bf, 0x080c, 0x6667, 0x1904, 0x33bc, 0x00c6, 0x080c, 0x4878, -+ 0x00ce, 0x0904, 0x33bc, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, -+ 0x7ea8, 0x080c, 0xb9bc, 0x0904, 0x33bc, 0x7007, 0x0003, 0x701f, -+ 0x44e6, 0x0005, 0x080c, 0x4054, 0x0804, 0x338a, 0xa830, 0x9086, -+ 0x0100, 0x0904, 0x33bc, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, -+ 0x9084, 0xffc0, 0x9080, 0x001b, 0x2009, 0x000c, 0x7a8c, 0x7b88, -+ 0x7c9c, 0x7d98, 0x0804, 0x48c4, 0x9006, 0x080c, 0x248d, 0x78a8, -+ 0x9084, 0x00ff, 0x9086, 0x00ff, 0x0118, 0x81ff, 0x1904, 0x33bc, -+ 0x080c, 0x70b7, 0x0110, 0x080c, 0x5ca1, 0x7888, 0x908a, 0x1000, -+ 0x1a04, 0x33bf, 0x7984, 0x9186, 0x00ff, 0x0138, 0x9182, 0x007f, -+ 0x1a04, 0x33bf, 0x2100, 0x080c, 0x2457, 0x0026, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x2061, 0x19d4, 0x601b, 0x0000, 0x601f, 0x0000, -+ 0x6073, 0x0000, 0x6077, 0x0000, 0x080c, 0x70b7, 0x1158, 0x080c, -+ 0x73b7, 0x080c, 0x5cdc, 0x9085, 0x0001, 0x080c, 0x70fe, 0x080c, -+ 0x6fe8, 0x00f0, 0x080c, 0x98c8, 0x080c, 0x9b6d, 0x080c, 0x98e4, -+ 0x2061, 0x0100, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x810f, -+ 0x9105, 0x604a, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x196a, -+ 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5bc7, 0x080c, 0x821d, -+ 0x7984, 0x080c, 0x70b7, 0x1110, 0x2009, 0x00ff, 0x7a88, 0x080c, -+ 0x438c, 0x012e, 0x00ce, 0x002e, 0x0804, 0x338a, 0x7984, 0x080c, -+ 0x6210, 0x2b08, 0x1904, 0x33bf, 0x0804, 0x338a, 0x81ff, 0x0120, -+ 0x2009, 0x0001, 0x0804, 0x33bc, 0x60d8, 0xd0ac, 0x1130, 0xd09c, -+ 0x1120, 0x2009, 0x0005, 0x0804, 0x33bc, 0x080c, 0x4878, 0x1120, -+ 0x2009, 0x0002, 0x0804, 0x33bc, 0x7984, 0x9192, 0x0021, 0x1a04, -+ 0x33bf, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, -+ 0x702a, 0xaf60, 0x7736, 0x080c, 0x48c1, 0x701f, 0x459e, 0x7880, -+ 0x9086, 0x006e, 0x0110, 0x701f, 0x4e43, 0x0005, 0x2009, 0x0080, -+ 0x080c, 0x6270, 0x1118, 0x080c, 0x6667, 0x0120, 0x2021, 0x400a, -+ 0x0804, 0x338c, 0x00d6, 0x0096, 0xa964, 0xaa6c, 0xab70, 0xac74, -+ 0xad78, 0xae7c, 0xa884, 0x90be, 0x0100, 0x0904, 0x4637, 0x90be, -+ 0x0112, 0x0904, 0x4637, 0x90be, 0x0113, 0x0904, 0x4637, 0x90be, -+ 0x0114, 0x0904, 0x4637, 0x90be, 0x0117, 0x0904, 0x4637, 0x90be, -+ 0x011a, 0x0904, 0x4637, 0x90be, 0x011c, 0x0904, 0x4637, 0x90be, -+ 0x0121, 0x0904, 0x461e, 0x90be, 0x0131, 0x0904, 0x461e, 0x90be, -+ 0x0171, 0x0904, 0x4637, 0x90be, 0x0173, 0x0904, 0x4637, 0x90be, -+ 0x01a1, 0x1128, 0xa894, 0x8007, 0xa896, 0x0804, 0x4642, 0x90be, -+ 0x0212, 0x0904, 0x462b, 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, 0x33bf, 0x7028, 0x9080, 0x0010, -+ 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0007, 0x080c, -+ 0x4680, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, -+ 0x20e8, 0x20a9, 0x0001, 0x080c, 0x4680, 0x00c8, 0x7028, 0x9080, -+ 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, -+ 0x080c, 0x468d, 0x00b8, 0x7028, 0x9080, 0x000e, 0x2098, 0x20a0, -+ 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x468d, 0x7028, -+ 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, -+ 0x0001, 0x04f1, 0x00c6, 0x080c, 0x4878, 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, 0xb9d7, 0x1120, 0x2009, -+ 0x0003, 0x0804, 0x33bc, 0x7007, 0x0003, 0x701f, 0x4677, 0x0005, -+ 0x00ce, 0x009e, 0x00de, 0x2009, 0x0002, 0x0804, 0x33bc, 0xa820, -+ 0x9086, 0x8001, 0x1904, 0x338a, 0x2009, 0x0004, 0x0804, 0x33bc, -+ 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, 0x33bc, 0x60d8, 0xd0ac, -+ 0x1160, 0xd09c, 0x0120, 0x2009, 0x0016, 0x0804, 0x33bc, 0xd09c, -+ 0x1120, 0x2009, 0x0005, 0x0804, 0x33bc, 0x7984, 0x78a8, 0x2040, -+ 0x080c, 0x9b66, 0x1120, 0x9182, 0x007f, 0x0a04, 0x33bf, 0x9186, -+ 0x00ff, 0x0904, 0x33bf, 0x9182, 0x0800, 0x1a04, 0x33bf, 0x7a8c, -+ 0x7b88, 0x6078, 0x9306, 0x1140, 0x607c, 0x924e, 0x0904, 0x33bf, -+ 0x99cc, 0xff00, 0x0904, 0x33bf, 0x0126, 0x2091, 0x8000, 0x0026, -+ 0x2011, 0x8008, 0x080c, 0x668b, 0x002e, 0x0140, 0x918d, 0x8000, -+ 0x080c, 0x66d5, 0x1118, 0x2001, 0x4009, 0x0458, 0x080c, 0x4792, -+ 0x0560, 0x90c6, 0x4000, 0x1170, 0x00c6, 0x0006, 0x900e, 0x080c, -+ 0x655f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x000e, -+ 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x0090, 0x90c6, -+ 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, 0x90c6, 0x4009, 0x1108, -+ 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, 0x2001, 0x4005, 0x2009, -+ 0x000a, 0x2020, 0x012e, 0x0804, 0x338c, 0x2b00, 0x7026, 0x0016, -+ 0x00b6, 0x00c6, 0x00e6, 0x2c70, 0x080c, 0x9c58, 0x0904, 0x475f, -+ 0x2b00, 0x6012, 0x080c, 0xbcdb, 0x2e58, 0x00ee, 0x00e6, 0x00c6, -+ 0x080c, 0x4878, 0x00ce, 0x2b70, 0x1158, 0x080c, 0x9be7, 0x00ee, -+ 0x00ce, 0x00be, 0x001e, 0x012e, 0x2009, 0x0002, 0x0804, 0x33bc, -+ 0x900e, 0xa966, 0xa96a, 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, -+ 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x080c, 0x3006, 0x6023, 0x0001, -+ 0x9006, 0x080c, 0x61ad, 0x2001, 0x0002, 0x080c, 0x61c1, 0x2009, -+ 0x0002, 0x080c, 0x9c85, 0x78a8, 0xd094, 0x0138, 0x00ee, 0x7024, -+ 0x00e6, 0x2058, 0xb8c4, 0xc08d, 0xb8c6, 0x9085, 0x0001, 0x00ee, -+ 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x33bc, 0x7007, 0x0003, 0x701f, 0x476e, 0x0005, 0xa830, 0x2008, -+ 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x338c, 0x9086, -+ 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, 0x9294, -+ 0x00ff, 0x0804, 0x52ea, 0x900e, 0xa868, 0xd0f4, 0x1904, 0x338a, -+ 0x080c, 0x655f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0x0804, 0x338a, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, 0x47da, -+ 0x902e, 0x080c, 0x9b66, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, -+ 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071, 0x107f, -+ 0x2e04, 0x9005, 0x11b0, 0x2100, 0x9406, 0x15e8, 0x2428, 0x94ce, -+ 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1528, 0x0030, 0x94ce, 0x0080, -+ 0x1130, 0x92ce, 0xfffc, 0x11f0, 0x93ce, 0x00ff, 0x11d8, 0xc5fd, -+ 0x0450, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11b8, 0xbe14, 0x2600, -+ 0x9206, 0x1198, 0x2400, 0x9106, 0x1150, 0xd884, 0x0568, 0xd894, -+ 0x1558, 0x080c, 0x6667, 0x1540, 0x2001, 0x4000, 0x0430, 0x2001, -+ 0x4007, 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, 0x1158, -+ 0xbe14, 0x87ff, 0x1128, 0x86ff, 0x0948, 0x080c, 0x9b66, 0x1930, -+ 0x2001, 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x47a8, 0x85ff, -+ 0x1130, 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c, -+ 0x6210, 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, 0x00de, -+ 0x00ee, 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x33bc, -+ 0x080c, 0x4878, 0x1120, 0x2009, 0x0002, 0x0804, 0x33bc, 0xa867, -+ 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, 0x33bf, -+ 0x9096, 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x33bf, 0x2010, -+ 0x2918, 0x080c, 0x2fa0, 0x1120, 0x2009, 0x0003, 0x0804, 0x33bc, -+ 0x7007, 0x0003, 0x701f, 0x482d, 0x0005, 0xa830, 0x9086, 0x0100, -+ 0x1904, 0x338a, 0x2009, 0x0004, 0x0804, 0x33bc, 0x7984, 0x080c, -+ 0x9b66, 0x1120, 0x9182, 0x007f, 0x0a04, 0x33bf, 0x9186, 0x00ff, -+ 0x0904, 0x33bf, 0x9182, 0x0800, 0x1a04, 0x33bf, 0x2001, 0x9000, -+ 0x080c, 0x5345, 0x1904, 0x33bc, 0x0804, 0x338a, 0xa998, 0x080c, -+ 0x9b66, 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, 0x0168, -+ 0x9182, 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x5345, 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, 0x1022, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, 0x1120, -+ 0x2900, 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, 0x2040, -+ 0x2900, 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984, -+ 0x080c, 0x6270, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, -+ 0x0208, 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x6270, 0x1130, -+ 0xae9c, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, -+ 0x0005, 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x6270, 0x1108, -+ 0x0008, 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, 0x0128, -+ 0x2148, 0xa904, 0x080c, 0x1054, 0x0cc8, 0x7116, 0x711a, 0x001e, -+ 0x0005, 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18ae, -+ 0x2c44, 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, -+ 0xa59a, 0x080c, 0x110c, 0x7007, 0x0002, 0x701f, 0x338a, 0x0005, -+ 0x00f6, 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18a6, -+ 0x2004, 0x9005, 0x1190, 0x0e04, 0x48f5, 0x7a36, 0x7833, 0x0012, -+ 0x7a82, 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, -+ 0xd084, 0x190c, 0x11be, 0x0804, 0x495b, 0x0016, 0x0086, 0x0096, -+ 0x00c6, 0x00e6, 0x2071, 0x1894, 0x7044, 0x9005, 0x1540, 0x7148, -+ 0x9182, 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x1022, 0x0904, -+ 0x4953, 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, 0x9080, -+ 0x1cf7, 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, 0x2001, -+ 0x18b0, 0x9c82, 0x18f0, 0x0210, 0x2061, 0x18b0, 0x2c00, 0x703a, -+ 0x7148, 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460, 0x7148, -+ 0x8108, 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016, 0x908a, -+ 0x0036, 0x1a0c, 0x0d65, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, -+ 0xa146, 0x1520, 0x080c, 0x1022, 0x1130, 0x8109, 0xa946, 0x7148, -+ 0x8109, 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, 0x2800, -+ 0xa802, 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, 0x1cf7, -+ 0x2005, 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, -+ 0x009e, 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, 0x9082, -+ 0x001b, 0x0002, 0x497d, 0x497d, 0x497f, 0x497d, 0x497d, 0x497d, -+ 0x4983, 0x497d, 0x497d, 0x497d, 0x4987, 0x497d, 0x497d, 0x497d, -+ 0x498b, 0x497d, 0x497d, 0x497d, 0x498f, 0x497d, 0x497d, 0x497d, -+ 0x4993, 0x497d, 0x497d, 0x497d, 0x4998, 0x080c, 0x0d65, 0xa276, -+ 0xa37a, 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, 0xa296, -+ 0xa39a, 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, 0xa2b6, -+ 0xa3ba, 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4956, -+ 0xa2d6, 0xa3da, 0xa4de, 0x0804, 0x4956, 0x00e6, 0x2071, 0x1894, -+ 0x7048, 0x9005, 0x0904, 0x4a2f, 0x0126, 0x2091, 0x8000, 0x0e04, -+ 0x4a2e, 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, 0x0076, -+ 0x9006, 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, 0x2105, -+ 0x0016, 0x908a, 0x0036, 0x1a0c, 0x0d65, 0x2060, 0x001e, 0x8108, -+ 0x2105, 0x9005, 0xa94a, 0x1904, 0x4a31, 0xa804, 0x9005, 0x090c, -+ 0x0d65, 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, 0x0002, -+ 0x9080, 0x1cf7, 0x2005, 0xa04a, 0x0804, 0x4a31, 0x703c, 0x2060, -+ 0x2c14, 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, 0x0012, -+ 0x7882, 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, 0x2001, -+ 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x87ff, 0x0118, 0x2748, -+ 0x080c, 0x1054, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, 0x7040, -+ 0x2048, 0x9005, 0x0128, 0x080c, 0x1054, 0x9006, 0x7042, 0x7046, -+ 0x703b, 0x18b0, 0x703f, 0x18b0, 0x0420, 0x7040, 0x9005, 0x1508, -+ 0x7238, 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, 0x18f0, -+ 0x0210, 0x2001, 0x18b0, 0x703e, 0x00a0, 0x9006, 0x703e, 0x703a, -+ 0x7044, 0x9005, 0x090c, 0x0d65, 0x2048, 0xa800, 0x9005, 0x1de0, -+ 0x2900, 0x7042, 0x2001, 0x0002, 0x9080, 0x1cf7, 0x2005, 0xa84a, -+ 0x0000, 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, 0x00ee, -+ 0x0005, 0x2c00, 0x9082, 0x001b, 0x0002, 0x4a50, 0x4a50, 0x4a52, -+ 0x4a50, 0x4a50, 0x4a50, 0x4a57, 0x4a50, 0x4a50, 0x4a50, 0x4a5c, -+ 0x4a50, 0x4a50, 0x4a50, 0x4a61, 0x4a50, 0x4a50, 0x4a50, 0x4a66, -+ 0x4a50, 0x4a50, 0x4a50, 0x4a6b, 0x4a50, 0x4a50, 0x4a50, 0x4a70, -+ 0x080c, 0x0d65, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x49dc, 0xaa84, -+ 0xab88, 0xac8c, 0x0804, 0x49dc, 0xaa94, 0xab98, 0xac9c, 0x0804, -+ 0x49dc, 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x49dc, 0xaab4, 0xabb8, -+ 0xacbc, 0x0804, 0x49dc, 0xaac4, 0xabc8, 0xaccc, 0x0804, 0x49dc, -+ 0xaad4, 0xabd8, 0xacdc, 0x0804, 0x49dc, 0x0026, 0x080c, 0x538d, -+ 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x48d8, 0x002e, 0x0005, -+ 0x81ff, 0x1904, 0x33bc, 0x0126, 0x2091, 0x8000, 0x6030, 0xc08d, -+ 0xc085, 0xc0ac, 0x6032, 0x080c, 0x70b7, 0x1158, 0x080c, 0x73b7, -+ 0x080c, 0x5cdc, 0x9085, 0x0001, 0x080c, 0x70fe, 0x080c, 0x6fe8, -+ 0x0010, 0x080c, 0x5b97, 0x012e, 0x0804, 0x338a, 0x81ff, 0x0120, -+ 0x2009, 0x0001, 0x0804, 0x33bc, 0x080c, 0x53a1, 0x0120, 0x2009, -+ 0x0007, 0x0804, 0x33bc, 0x080c, 0x665f, 0x0120, 0x2009, 0x0008, -+ 0x0804, 0x33bc, 0x0026, 0x2011, 0x0010, 0x080c, 0x668b, 0x002e, -+ 0x0140, 0x7984, 0x080c, 0x66d5, 0x1120, 0x2009, 0x4009, 0x0804, -+ 0x33bc, 0x080c, 0x3181, 0x0128, 0x7984, 0x080c, 0x6210, 0x1904, -+ 0x33bf, 0x080c, 0x48ab, 0x0904, 0x33bf, 0x2b00, 0x7026, 0x080c, -+ 0x6667, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, 0x900e, 0x080c, -+ 0x655f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, -+ 0x338a, 0x080c, 0x4878, 0x0904, 0x33bc, 0x9006, 0xa866, 0xa832, -+ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xba79, 0x0904, 0x33bc, 0x7888, -+ 0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 0x7007, 0x0003, 0x701f, -+ 0x4b46, 0x0005, 0x2061, 0x1800, 0x080c, 0x53a1, 0x2009, 0x0007, -+ 0x1578, 0x080c, 0x665f, 0x0118, 0x2009, 0x0008, 0x0448, 0x080c, -+ 0x3181, 0x0120, 0xa998, 0x080c, 0x6210, 0x1530, 0x080c, 0x48a9, -+ 0x0518, 0x080c, 0x6667, 0xa89c, 0x1168, 0x9084, 0x0005, 0x1150, -+ 0x900e, 0x080c, 0x655f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, -+ 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, 0xba79, 0x11e0, -+ 0xa89c, 0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, 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, 0x2008, -+ 0x918e, 0xdead, 0x1120, 0x2021, 0x4009, 0x0804, 0x338c, 0x9086, -+ 0x0100, 0x7024, 0x2058, 0x1110, 0x0804, 0x52ea, 0x900e, 0x080c, -+ 0x655f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0x0804, -+ 0x338a, 0x080c, 0x53a1, 0x0120, 0x2009, 0x0007, 0x0804, 0x33bc, -+ 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, 0x4878, 0x1120, -+ 0x2009, 0x0002, 0x0804, 0x33bc, 0x900e, 0x2130, 0x7126, 0x7132, -+ 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, 0x702a, 0x20a0, -+ 0x080c, 0x6270, 0x1904, 0x4be4, 0x080c, 0x6667, 0x0120, 0x080c, -+ 0x666f, 0x1904, 0x4be4, 0x080c, 0x665f, 0x1130, 0x080c, 0x655f, -+ 0x1118, 0xd79c, 0x0904, 0x4be4, 0xd794, 0x1110, 0xd784, 0x01a8, -+ 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x3400, 0xd794, -+ 0x0160, 0x20a9, 0x0008, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, -+ 0x20a9, 0x0002, 0x080c, 0x468d, 0x0048, 0x20a9, 0x0004, 0x4003, -+ 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x080c, 0x468d, 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, 0x4680, 0x9c80, 0x0026, -+ 0x2098, 0xb8b4, 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, -+ 0x96b0, 0x000b, 0x96b0, 0x0005, 0x8108, 0x080c, 0x9b66, 0x0118, -+ 0x9186, 0x0800, 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, -+ 0x0018, 0x9186, 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, -+ 0x0010, 0x9686, 0x0028, 0x0150, 0x0804, 0x4b80, 0x86ff, 0x1120, -+ 0x7124, 0x810b, 0x0804, 0x338a, 0x7033, 0x0001, 0x7122, 0x7024, -+ 0x9600, 0x7026, 0x772e, 0x2061, 0x18ae, 0x2c44, 0xa06b, 0x0000, -+ 0xa67a, 0x7034, 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, -+ 0xa59a, 0x080c, 0x110c, 0x7007, 0x0002, 0x701f, 0x4c20, 0x0005, -+ 0x7030, 0x9005, 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, -+ 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, 0xa494, -+ 0xa598, 0x0804, 0x4b80, 0x7124, 0x810b, 0x0804, 0x338a, 0x2029, -+ 0x007e, 0x7984, 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, -+ 0x90e2, 0x0020, 0x0a04, 0x33bf, 0x9502, 0x0a04, 0x33bf, 0x9184, -+ 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x33bf, 0x9502, 0x0a04, 0x33bf, -+ 0x9284, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x33bf, 0x9502, -+ 0x0a04, 0x33bf, 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x33bf, -+ 0x9502, 0x0a04, 0x33bf, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, -+ 0x0a04, 0x33bf, 0x9502, 0x0a04, 0x33bf, 0x9384, 0x00ff, 0x90e2, -+ 0x0020, 0x0a04, 0x33bf, 0x9502, 0x0a04, 0x33bf, 0x9484, 0xff00, -+ 0x8007, 0x90e2, 0x0020, 0x0a04, 0x33bf, 0x9502, 0x0a04, 0x33bf, -+ 0x9484, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x33bf, 0x9502, 0x0a04, -+ 0x33bf, 0x2061, 0x195a, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, -+ 0x338a, 0x0006, 0x080c, 0x538d, 0xd0cc, 0x000e, 0x0005, 0x0006, -+ 0x080c, 0x5391, 0xd0bc, 0x000e, 0x0005, 0x6170, 0x7a84, 0x6300, -+ 0x82ff, 0x1118, 0x7986, 0x0804, 0x338a, 0x83ff, 0x1904, 0x33bf, -+ 0x2001, 0xfff0, 0x9200, 0x1a04, 0x33bf, 0x2019, 0xffff, 0x6074, -+ 0x9302, 0x9200, 0x0a04, 0x33bf, 0x7986, 0x6272, 0x0804, 0x338a, -+ 0x080c, 0x53a1, 0x1904, 0x33bc, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, -+ 0x080c, 0x4878, 0x0904, 0x33bc, 0x900e, 0x901e, 0x7326, 0x7332, -+ 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, -+ 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6667, 0x0118, -+ 0x080c, 0x666f, 0x1148, 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, -+ 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, -+ 0x9386, 0x003c, 0x0170, 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, -+ 0x2001, 0x0003, 0x080c, 0x8419, 0x2208, 0x0804, 0x338a, 0x7033, -+ 0x0001, 0x7122, 0x7024, 0x9300, 0x7026, 0x2061, 0x18ae, 0x2c44, -+ 0xa06b, 0x0000, 0xa37a, 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, -+ 0xa592, 0xa696, 0xa79a, 0x080c, 0x110c, 0x7007, 0x0002, 0x701f, -+ 0x4d12, 0x0005, 0x7030, 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, -+ 0x901e, 0x7034, 0x20e8, 0x2061, 0x18ae, 0x2c44, 0xa48c, 0xa590, -+ 0xa694, 0xa798, 0x0804, 0x4cd0, 0x7224, 0x900e, 0x2001, 0x0003, -+ 0x080c, 0x8419, 0x2208, 0x0804, 0x338a, 0x00f6, 0x00e6, 0x080c, -+ 0x53a1, 0x2009, 0x0007, 0x1904, 0x4da5, 0x2071, 0x1894, 0x745c, -+ 0x84ff, 0x2009, 0x000e, 0x1904, 0x4da5, 0xac9c, 0xad98, 0xaea4, -+ 0xafa0, 0x0096, 0x080c, 0x103b, 0x2009, 0x0002, 0x0904, 0x4da5, -+ 0x2900, 0x705e, 0x900e, 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, -+ 0xa85c, 0x9080, 0x0003, 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, -+ 0x8bff, 0x0178, 0x080c, 0x6667, 0x0118, 0x080c, 0x666f, 0x1148, -+ 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, -+ 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, -+ 0x0c20, 0x83ff, 0x11c0, 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, -+ 0x8419, 0x2208, 0x009e, 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, -+ 0x090c, 0x0d65, 0x2148, 0x080c, 0x1054, 0x9006, 0x705e, 0x918d, -+ 0x0001, 0x2008, 0x0418, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, -+ 0x7056, 0x2061, 0x18af, 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, -+ 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, 0xa09f, 0x4db1, 0x000e, -+ 0xa0a2, 0x080c, 0x110c, 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, -+ 0xa99a, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, -+ 0x0005, 0x00f6, 0xa0a0, 0x904d, 0x090c, 0x0d65, 0x00e6, 0x2071, -+ 0x1894, 0xa06c, 0x908e, 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, -+ 0x0000, 0xa897, 0x4002, 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, -+ 0x7058, 0x20a0, 0x901e, 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, -+ 0xa798, 0x0428, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, -+ 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x8419, 0xaa9a, 0x715c, -+ 0x81ff, 0x090c, 0x0d65, 0x2148, 0x080c, 0x1054, 0x705f, 0x0000, -+ 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, 0x080c, 0x6996, 0x012e, -+ 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, -+ 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, 0x6667, 0x0118, 0x080c, -+ 0x666f, 0x1148, 0xb814, 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, -+ 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, -+ 0x003c, 0x0518, 0x0c20, 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, -+ 0xa897, 0x4000, 0x715c, 0x81ff, 0x090c, 0x0d65, 0x2148, 0x080c, -+ 0x1054, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x6996, 0x012e, 0xa09f, 0x0000, -+ 0xa0a3, 0x0000, 0x0070, 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, -+ 0x7056, 0xa37a, 0xa48e, 0xa592, 0xa696, 0xa79a, 0x080c, 0x110c, -+ 0x9006, 0x00ee, 0x0005, 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, -+ 0x90be, 0x7100, 0x0130, 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, -+ 0x33bf, 0xa884, 0xa988, 0x080c, 0x2424, 0x1518, 0x080c, 0x6210, -+ 0x1500, 0x7126, 0xbe12, 0xbd16, 0xae7c, 0x080c, 0x4878, 0x01c8, -+ 0x080c, 0x4878, 0x01b0, 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, -+ 0xa86a, 0xa823, 0x0000, 0xa804, 0x2048, 0x080c, 0xb9f7, 0x1120, -+ 0x2009, 0x0003, 0x0804, 0x33bc, 0x7007, 0x0003, 0x701f, 0x4e7e, -+ 0x0005, 0x009e, 0x2009, 0x0002, 0x0804, 0x33bc, 0x7124, 0x080c, -+ 0x311a, 0xa820, 0x9086, 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, -+ 0x33bc, 0x2900, 0x7022, 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, -+ 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, -+ 0x0076, 0x0006, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, -+ 0x080c, 0x0f9f, 0xaa6c, 0xab70, 0xac74, 0xad78, 0x2061, 0x18ae, -+ 0x2c44, 0xa06b, 0x0000, 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, -+ 0x97c6, 0x7100, 0x1148, 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, -+ 0x000e, 0x007e, 0x0804, 0x48c4, 0x97c6, 0x7200, 0x11b8, 0x96c2, -+ 0x0054, 0x02a0, 0x000e, 0x007e, 0x2061, 0x18ae, 0x2c44, 0xa076, -+ 0xa772, 0xa07b, 0x002a, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, -+ 0x110c, 0x7007, 0x0002, 0x701f, 0x4eda, 0x0005, 0x000e, 0x007e, -+ 0x0804, 0x33bf, 0x7020, 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, -+ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, -+ 0x0002, 0x2098, 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, -+ 0x0f9f, 0x2100, 0x2238, 0x2061, 0x18ae, 0x2c44, 0xa28c, 0xa390, -+ 0xa494, 0xa598, 0x2009, 0x002a, 0x0804, 0x48c4, 0x81ff, 0x1904, -+ 0x33bc, 0x798c, 0x2001, 0x194f, 0x918c, 0x8000, 0x2102, 0x080c, -+ 0x488f, 0x0904, 0x33bf, 0x080c, 0x6667, 0x0120, 0x080c, 0x666f, -+ 0x1904, 0x33bf, 0x080c, 0x6337, 0x0904, 0x33bc, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x64cc, 0x012e, 0x0904, 0x33bc, 0x2001, 0x194f, -+ 0x2004, 0xd0fc, 0x1904, 0x338a, 0x0804, 0x4329, 0xa9a0, 0x2001, -+ 0x194f, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, 0x489c, 0x01a0, -+ 0x080c, 0x6667, 0x0118, 0x080c, 0x666f, 0x1170, 0x080c, 0x6337, -+ 0x2009, 0x0002, 0x0128, 0x080c, 0x64cc, 0x1170, 0x2009, 0x0003, -+ 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, -+ 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x194f, -+ 0x2004, 0xd0fc, 0x1128, 0x080c, 0x5395, 0x0110, 0x9006, 0x0018, -+ 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, -+ 0x1118, 0xd084, 0x0904, 0x429e, 0x080c, 0x48ab, 0x0904, 0x33bf, -+ 0x080c, 0x4878, 0x1120, 0x2009, 0x0002, 0x0804, 0x33bc, 0x080c, -+ 0x6667, 0x0130, 0x908e, 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, -+ 0x78a8, 0xd08c, 0x0120, 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, -+ 0x538d, 0xd0b4, 0x0904, 0x42d8, 0x7884, 0x908e, 0x007e, 0x0904, -+ 0x42d8, 0x908e, 0x007f, 0x0904, 0x42d8, 0x908e, 0x0080, 0x0904, -+ 0x42d8, 0xb800, 0xd08c, 0x1904, 0x42d8, 0xa867, 0x0000, 0xa868, -+ 0xc0fd, 0xa86a, 0x080c, 0xba16, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x33bc, 0x7007, 0x0003, 0x701f, 0x4fa6, 0x0005, 0x080c, 0x48ab, -+ 0x0904, 0x33bf, 0x0804, 0x42d8, 0x080c, 0x3181, 0x0108, 0x0005, -+ 0x2009, 0x1833, 0x210c, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, -+ 0x33bc, 0x080c, 0x53a1, 0x0120, 0x2009, 0x0007, 0x0804, 0x33bc, -+ 0x080c, 0x665f, 0x0120, 0x2009, 0x0008, 0x0804, 0x33bc, 0xb89c, -+ 0xd0a4, 0x1118, 0xd0ac, 0x1904, 0x42d8, 0x9006, 0xa866, 0xa832, -+ 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xba79, 0x1120, 0x2009, 0x0003, -+ 0x0804, 0x33bc, 0x7007, 0x0003, 0x701f, 0x4fdf, 0x0005, 0xa830, -+ 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x52ea, 0x080c, -+ 0x48ab, 0x0904, 0x33bf, 0x0804, 0x4f78, 0x81ff, 0x2009, 0x0001, -+ 0x1904, 0x33bc, 0x080c, 0x53a1, 0x2009, 0x0007, 0x1904, 0x33bc, -+ 0x080c, 0x665f, 0x0120, 0x2009, 0x0008, 0x0804, 0x33bc, 0x080c, -+ 0x48ab, 0x0904, 0x33bf, 0x080c, 0x6667, 0x2009, 0x0009, 0x1904, -+ 0x33bc, 0x080c, 0x4878, 0x2009, 0x0002, 0x0904, 0x33bc, 0x9006, -+ 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, -+ 0x918c, 0x00ff, 0x9006, 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, -+ 0xa956, 0x0038, 0x928e, 0x0100, 0x1904, 0x33bf, 0xc0e5, 0xa952, -+ 0xa956, 0xa83e, 0x080c, 0xbcdc, 0x2009, 0x0003, 0x0904, 0x33bc, -+ 0x7007, 0x0003, 0x701f, 0x5035, 0x0005, 0xa830, 0x9086, 0x0100, -+ 0x2009, 0x0004, 0x0904, 0x33bc, 0x0804, 0x338a, 0x7aa8, 0x9284, -+ 0xc000, 0x0148, 0xd2ec, 0x01a0, 0x080c, 0x53a1, 0x1188, 0x2009, -+ 0x0014, 0x0804, 0x33bc, 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, -+ 0x1904, 0x33bc, 0x080c, 0x53a1, 0x2009, 0x0007, 0x1904, 0x33bc, -+ 0xd2f4, 0x0130, 0x9284, 0x5000, 0x080c, 0x5368, 0x0804, 0x338a, -+ 0xd2fc, 0x0158, 0x080c, 0x48ab, 0x0904, 0x33bf, 0x7984, 0x9284, -+ 0x9000, 0x080c, 0x5345, 0x0804, 0x338a, 0x080c, 0x48ab, 0x0904, -+ 0x33bf, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, -+ 0x1904, 0x511e, 0x080c, 0x4878, 0x2009, 0x0002, 0x0904, 0x511e, -+ 0xa85c, 0x9080, 0x001b, 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, -+ 0x7c9c, 0x7d98, 0x080c, 0x48c1, 0x701f, 0x508f, 0x0005, 0xa86c, -+ 0x9086, 0x0500, 0x1138, 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, -+ 0xff00, 0x0110, 0x1904, 0x33bf, 0xa866, 0xa832, 0xa868, 0xc0fd, -+ 0xa86a, 0x080c, 0x48ab, 0x1110, 0x0804, 0x33bf, 0x2009, 0x0043, -+ 0x080c, 0xbd44, 0x2009, 0x0003, 0x0904, 0x511e, 0x7007, 0x0003, -+ 0x701f, 0x50b3, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, -+ 0x0904, 0x511e, 0x7984, 0x7aa8, 0x9284, 0x1000, 0x080c, 0x5345, -+ 0x0804, 0x338a, 0x00c6, 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, -+ 0x0168, 0x080c, 0x53a1, 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, -+ 0x1800, 0x080c, 0x53a1, 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, -+ 0x9284, 0x5000, 0x080c, 0x5368, 0x0050, 0xd2fc, 0x0178, 0x080c, -+ 0x48a9, 0x0588, 0xa998, 0x9284, 0x9000, 0x080c, 0x5345, 0xa87b, -+ 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0438, 0x080c, 0x48a9, -+ 0x0510, 0x080c, 0x6667, 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, -+ 0x0500, 0x11c8, 0xa8c8, 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, -+ 0x1190, 0x080c, 0x48a9, 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, -+ 0xbd44, 0x2009, 0x0003, 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, -+ 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, -+ 0x2001, 0x0030, 0x00ce, 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, -+ 0x0904, 0x33bc, 0x0016, 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, -+ 0x5345, 0x001e, 0x1904, 0x33bc, 0x0804, 0x338a, 0x00f6, 0x2d78, -+ 0x0011, 0x00fe, 0x0005, 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, -+ 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5345, 0x001e, 0x9085, 0x0001, -+ 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x33bc, 0x080c, -+ 0x53a1, 0x0120, 0x2009, 0x0007, 0x0804, 0x33bc, 0x7984, 0x7ea8, -+ 0x96b4, 0x00ff, 0x080c, 0x6270, 0x1904, 0x33bf, 0x9186, 0x007f, -+ 0x0138, 0x080c, 0x6667, 0x0120, 0x2009, 0x0009, 0x0804, 0x33bc, -+ 0x080c, 0x4878, 0x1120, 0x2009, 0x0002, 0x0804, 0x33bc, 0xa867, -+ 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, -+ 0x080c, 0xba30, 0x1120, 0x2009, 0x0003, 0x0804, 0x33bc, 0x7007, -+ 0x0003, 0x701f, 0x517c, 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, -+ 0x1120, 0x2009, 0x0004, 0x0804, 0x33bc, 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, 0x48c4, 0x080c, 0x4878, 0x1120, 0x2009, 0x0002, -+ 0x0804, 0x33bc, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, -+ 0x82ff, 0x1118, 0x7023, 0x1984, 0x0040, 0x92c6, 0x0001, 0x1118, -+ 0x7023, 0x199e, 0x0010, 0x0804, 0x33bf, 0x2009, 0x001a, 0x7a8c, -+ 0x7b88, 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, -+ 0x48c1, 0x701f, 0x51cc, 0x0005, 0x2001, 0x182d, 0x2003, 0x0001, -+ 0xa85c, 0x9080, 0x0019, 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, -+ 0x7020, 0x20a0, 0x20e9, 0x0001, 0x4003, 0x0804, 0x338a, 0x080c, -+ 0x4878, 0x1120, 0x2009, 0x0002, 0x0804, 0x33bc, 0x7984, 0x9194, -+ 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x2099, 0x1984, -+ 0x0040, 0x92c6, 0x0001, 0x1118, 0x2099, 0x199e, 0x0010, 0x0804, -+ 0x33bf, 0xa85c, 0x9080, 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, -+ 0x001a, 0x20e1, 0x0001, 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, -+ 0x7c9c, 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x0804, 0x48c4, -+ 0x7884, 0x908a, 0x1000, 0x1a04, 0x33bf, 0x0126, 0x2091, 0x8000, -+ 0x8003, 0x800b, 0x810b, 0x9108, 0x00c6, 0x2061, 0x19d4, 0x6142, -+ 0x00ce, 0x012e, 0x0804, 0x338a, 0x00c6, 0x080c, 0x70b7, 0x1160, -+ 0x080c, 0x73b7, 0x080c, 0x5cdc, 0x9085, 0x0001, 0x080c, 0x70fe, -+ 0x080c, 0x6fe8, 0x080c, 0x0d65, 0x2061, 0x1800, 0x6030, 0xc09d, -+ 0x6032, 0x080c, 0x5b97, 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, -+ 0x2004, 0x908e, 0x0000, 0x0904, 0x33bc, 0x7884, 0x9005, 0x0188, -+ 0x7888, 0x2061, 0x196d, 0x2c0c, 0x2062, 0x080c, 0x2801, 0x01a0, -+ 0x080c, 0x2809, 0x0188, 0x080c, 0x2811, 0x0170, 0x2162, 0x0804, -+ 0x33bf, 0x2061, 0x0100, 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, -+ 0x0001, 0x0010, 0x2009, 0x0000, 0x7884, 0x9086, 0x0002, 0x1588, -+ 0x2061, 0x0100, 0x6028, 0xc09c, 0x602a, 0x080c, 0x98c8, 0x0026, -+ 0x2011, 0x0003, 0x080c, 0x9339, 0x2011, 0x0002, 0x080c, 0x9343, -+ 0x002e, 0x080c, 0x9206, 0x0036, 0x901e, 0x080c, 0x9286, 0x003e, -+ 0x080c, 0x98e4, 0x60e3, 0x0000, 0x080c, 0xd5fb, 0x080c, 0xd616, -+ 0x9085, 0x0001, 0x080c, 0x70fe, 0x9006, 0x080c, 0x2833, 0x2001, -+ 0x1800, 0x2003, 0x0004, 0x0026, 0x2011, 0x0008, 0x080c, 0x286d, -+ 0x002e, 0x00ce, 0x0804, 0x338a, 0x81ff, 0x0120, 0x2009, 0x0001, -+ 0x0804, 0x33bc, 0x080c, 0x53a1, 0x0120, 0x2009, 0x0007, 0x0804, -+ 0x33bc, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, 0x6270, 0x1904, -+ 0x33bf, 0x9186, 0x007f, 0x0138, 0x080c, 0x6667, 0x0120, 0x2009, -+ 0x0009, 0x0804, 0x33bc, 0x080c, 0x4878, 0x1120, 0x2009, 0x0002, -+ 0x0804, 0x33bc, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, -+ 0xba33, 0x1120, 0x2009, 0x0003, 0x0804, 0x33bc, 0x7007, 0x0003, -+ 0x701f, 0x52d3, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, -+ 0x0004, 0x0804, 0x33bc, 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, -+ 0xa85c, 0x9080, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, -+ 0x0804, 0x48c4, 0xa898, 0x9086, 0x000d, 0x1904, 0x33bc, 0x2021, -+ 0x4005, 0x0126, 0x2091, 0x8000, 0x0e04, 0x52f7, 0x0010, 0x012e, -+ 0x0cc0, 0x7c36, 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, -+ 0x7833, 0x0010, 0x7883, 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, -+ 0xa9a8, 0x799e, 0x080c, 0x48b4, 0x2091, 0x4080, 0x2001, 0x0089, -+ 0x2004, 0xd084, 0x190c, 0x11be, 0x7007, 0x0001, 0x2091, 0x5000, -+ 0x700f, 0x0000, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, -+ 0x2061, 0x19d4, 0x7984, 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, -+ 0x0009, 0x7898, 0x606a, 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, -+ 0x605e, 0x2001, 0x19e2, 0x2044, 0x2001, 0x19e9, 0xa076, 0xa060, -+ 0xa072, 0xa07b, 0x0001, 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, -+ 0x0000, 0x00ce, 0x012e, 0x0804, 0x338a, 0x0126, 0x2091, 0x8000, -+ 0x00b6, 0x00c6, 0x90e4, 0xc000, 0x0128, 0x0006, 0x080c, 0xb894, -+ 0x000e, 0x1198, 0xd0e4, 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, -+ 0x0160, 0x080c, 0x5cf6, 0x080c, 0x9b66, 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, 0x5370, 0x015e, 0x012e, 0x0005, 0x2001, 0x1854, 0x2004, -+ 0x0005, 0x2001, 0x1873, 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, -+ 0x2004, 0xd0d4, 0x000e, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, -+ 0x0005, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, -+ 0x00e6, 0x2071, 0x1894, 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, -+ 0x0005, 0x79a4, 0x9182, 0x0081, 0x1a04, 0x33bf, 0x810c, 0x0016, -+ 0x080c, 0x4878, 0x080c, 0x0f2a, 0x2100, 0x2238, 0x7d84, 0x7c88, -+ 0x7b8c, 0x7a90, 0x001e, 0x080c, 0x48c1, 0x701f, 0x53c8, 0x0005, -+ 0x2079, 0x0000, 0x7d94, 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, -+ 0x2061, 0x18ae, 0x2c44, 0xa770, 0xa074, 0x2071, 0x1894, 0x080c, -+ 0x48c4, 0x701f, 0x53dc, 0x0005, 0x2061, 0x18ae, 0x2c44, 0x0016, -+ 0x0026, 0xa270, 0xa174, 0x080c, 0x0f32, 0x002e, 0x001e, 0x080c, -+ 0x0fdf, 0x9006, 0xa802, 0xa806, 0x0804, 0x338a, 0x0126, 0x0156, -+ 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, -+ 0x2061, 0x0100, 0x2069, 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, -+ 0x11e8, 0xd084, 0x0118, 0x080c, 0x5597, 0x0068, 0xd08c, 0x0118, -+ 0x080c, 0x54a0, 0x0040, 0xd094, 0x0118, 0x080c, 0x5470, 0x0018, -+ 0xd09c, 0x0108, 0x0099, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, -+ 0x01ce, 0x014e, 0x013e, 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, -+ 0xd19c, 0x1110, 0xc19d, 0x612a, 0x001e, 0x0c68, 0x0006, 0x7094, -+ 0x9005, 0x000e, 0x0120, 0x7097, 0x0000, 0x708f, 0x0000, 0x624c, -+ 0x9286, 0xf0f0, 0x1150, 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, -+ 0x6043, 0x0090, 0x6043, 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, -+ 0xf700, 0x0178, 0x7138, 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, -+ 0x6242, 0x9294, 0x0010, 0x0128, 0x2009, 0x00f7, 0x080c, 0x5c58, -+ 0x00f0, 0x6040, 0x9084, 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, -+ 0x0000, 0x7083, 0x0000, 0x709f, 0x0001, 0x70c3, 0x0000, 0x70db, -+ 0x0000, 0x2009, 0x1d80, 0x200b, 0x0000, 0x7093, 0x0000, 0x7087, -+ 0x000f, 0x2009, 0x000f, 0x2011, 0x5b3a, 0x080c, 0x821d, 0x0005, -+ 0x2001, 0x1875, 0x2004, 0xd08c, 0x0110, 0x705b, 0xffff, 0x7084, -+ 0x9005, 0x1528, 0x2011, 0x5b3a, 0x080c, 0x8159, 0x6040, 0x9094, -+ 0x0010, 0x9285, 0x0020, 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, -+ 0x1168, 0x1f04, 0x5486, 0x6242, 0x7097, 0x0000, 0x6040, 0x9094, -+ 0x0010, 0x9285, 0x0080, 0x6042, 0x6242, 0x0048, 0x6242, 0x7097, -+ 0x0000, 0x708b, 0x0000, 0x9006, 0x080c, 0x5ce1, 0x0000, 0x0005, -+ 0x7088, 0x908a, 0x0003, 0x1a0c, 0x0d65, 0x000b, 0x0005, 0x54aa, -+ 0x54fb, 0x5596, 0x00f6, 0x0016, 0x6900, 0x918c, 0x0800, 0x708b, -+ 0x0001, 0x2001, 0x015d, 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, -+ 0x0004, 0x6800, 0x9084, 0x00fc, 0x0120, 0x1f04, 0x54b9, 0x080c, -+ 0x0d65, 0x68a0, 0x68a2, 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, -+ 0x918d, 0x1600, 0x6902, 0x001e, 0x6837, 0x0020, 0x080c, 0x5cbd, -+ 0x2079, 0x1d00, 0x7833, 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, -+ 0x2099, 0x1805, 0x20e9, 0x0001, 0x20a1, 0x1d0e, 0x20a9, 0x0004, -+ 0x4003, 0x080c, 0x97fa, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, -+ 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, -+ 0x600f, 0x0000, 0x080c, 0x5b6b, 0x00fe, 0x9006, 0x708e, 0x6043, -+ 0x0008, 0x6042, 0x0005, 0x00f6, 0x708c, 0x708f, 0x0000, 0x9025, -+ 0x0904, 0x5573, 0x6020, 0xd0b4, 0x1904, 0x5571, 0x719c, 0x81ff, -+ 0x0904, 0x555f, 0x9486, 0x000c, 0x1904, 0x556c, 0x9480, 0x0018, -+ 0x8004, 0x20a8, 0x080c, 0x5cb6, 0x2011, 0x0260, 0x2019, 0x1d00, -+ 0x220c, 0x2304, 0x9106, 0x11e8, 0x8210, 0x8318, 0x1f04, 0x5518, -+ 0x6043, 0x0004, 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, -+ 0x2061, 0x0100, 0x6043, 0x0006, 0x708b, 0x0002, 0x7097, 0x0002, -+ 0x2009, 0x07d0, 0x2011, 0x5b41, 0x080c, 0x821d, 0x080c, 0x5cbd, -+ 0x04c0, 0x080c, 0x5cb6, 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, -+ 0x1558, 0x7834, 0x9005, 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, -+ 0x7804, 0x9005, 0x0190, 0x080c, 0x5cb6, 0x2011, 0x026e, 0x2019, -+ 0x1805, 0x20a9, 0x0004, 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, -+ 0x8210, 0x8318, 0x1f04, 0x5553, 0x0078, 0x709f, 0x0000, 0x080c, -+ 0x5cb6, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, -+ 0x1d00, 0x20a9, 0x0014, 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, -+ 0x0010, 0x00fe, 0x0005, 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, -+ 0xd0b4, 0x1db8, 0x080c, 0x97fa, 0x20e1, 0x0001, 0x2099, 0x1d00, -+ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, -+ 0x000c, 0x2011, 0x19c5, 0x2013, 0x0000, 0x708f, 0x0000, 0x60a3, -+ 0x0056, 0x60a7, 0x9575, 0x080c, 0x8faa, 0x08d8, 0x0005, 0x7094, -+ 0x908a, 0x001d, 0x1a0c, 0x0d65, 0x000b, 0x0005, 0x55c8, 0x55db, -+ 0x5604, 0x5624, 0x564a, 0x5679, 0x569f, 0x56d7, 0x56fd, 0x572b, -+ 0x5766, 0x579e, 0x57bc, 0x57e7, 0x5809, 0x5824, 0x582e, 0x5862, -+ 0x5888, 0x58b7, 0x58dd, 0x5915, 0x5959, 0x5996, 0x59b7, 0x5a10, -+ 0x5a32, 0x5a60, 0x5a60, 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, -+ 0x2061, 0x0100, 0x6004, 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, -+ 0x2061, 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, -+ 0x6043, 0x0002, 0x7097, 0x0001, 0x2009, 0x07d0, 0x2011, 0x5b41, -+ 0x080c, 0x821d, 0x0005, 0x00f6, 0x708c, 0x9086, 0x0014, 0x1510, -+ 0x6042, 0x6020, 0xd0b4, 0x11f0, 0x080c, 0x5cb6, 0x2079, 0x0260, -+ 0x7a30, 0x9296, 0x1102, 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, -+ 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x2011, -+ 0x5b41, 0x080c, 0x8159, 0x7097, 0x0010, 0x080c, 0x582e, 0x0010, -+ 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0003, 0x6043, -+ 0x0004, 0x2011, 0x5b41, 0x080c, 0x8159, 0x080c, 0x5c3a, 0x2079, -+ 0x0240, 0x7833, 0x1102, 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, -+ 0x000e, 0x200b, 0x0000, 0x8108, 0x1f04, 0x5619, 0x60c3, 0x0014, -+ 0x080c, 0x5b6b, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, -+ 0x2011, 0x5b41, 0x080c, 0x8159, 0x9086, 0x0014, 0x11b8, 0x080c, -+ 0x5cb6, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, -+ 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, -+ 0x70c3, 0x0001, 0x7097, 0x0004, 0x0029, 0x0010, 0x080c, 0x5c92, -+ 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0005, 0x080c, 0x5c3a, 0x2079, -+ 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, 0x080c, 0x5cb6, 0x080c, -+ 0x5c99, 0x1170, 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, 0xffff, -+ 0x0138, 0x2011, 0x0008, 0x080c, 0x5aee, 0x0168, 0x080c, 0x5c6f, -+ 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, -+ 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b6b, 0x00fe, -+ 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b41, 0x080c, -+ 0x8159, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5cb6, 0x2079, 0x0260, -+ 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, -+ 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, -+ 0x0006, 0x0029, 0x0010, 0x080c, 0x5c92, 0x00fe, 0x0005, 0x00f6, -+ 0x7097, 0x0007, 0x080c, 0x5c3a, 0x2079, 0x0240, 0x7833, 0x1104, -+ 0x7837, 0x0000, 0x080c, 0x5cb6, 0x080c, 0x5c99, 0x11b8, 0x7080, -+ 0x9005, 0x11a0, 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, 0x318b, -+ 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5aee, -+ 0x0180, 0x080c, 0x4c97, 0x0110, 0x080c, 0x248d, 0x20a9, 0x0008, -+ 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, -+ 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b6b, 0x00fe, 0x0005, 0x00f6, -+ 0x708c, 0x9005, 0x0500, 0x2011, 0x5b41, 0x080c, 0x8159, 0x9086, -+ 0x0014, 0x11b8, 0x080c, 0x5cb6, 0x2079, 0x0260, 0x7a30, 0x9296, -+ 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, -+ 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0008, 0x0029, -+ 0x0010, 0x080c, 0x5c92, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0009, -+ 0x080c, 0x5c3a, 0x2079, 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, -+ 0x080c, 0x5c99, 0x1150, 0x7080, 0x9005, 0x1138, 0x080c, 0x5a61, -+ 0x1188, 0x9085, 0x0001, 0x080c, 0x248d, 0x20a9, 0x0008, 0x080c, -+ 0x5cb6, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, -+ 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b6b, 0x0010, 0x080c, -+ 0x55bb, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, 0x05a8, 0x2011, -+ 0x5b41, 0x080c, 0x8159, 0x9086, 0x0014, 0x1560, 0x080c, 0x5cb6, -+ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, -+ 0x0100, 0x2011, 0x0100, 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, -+ 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x000a, 0x00b1, -+ 0x0098, 0x9005, 0x1178, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, -+ 0x1110, 0x70c3, 0x0001, 0x7093, 0x0000, 0x7097, 0x000e, 0x080c, -+ 0x5809, 0x0010, 0x080c, 0x5c92, 0x00fe, 0x0005, 0x00f6, 0x7097, -+ 0x000b, 0x2011, 0x1d0e, 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, -+ 0x2019, 0xffff, 0x4304, 0x080c, 0x5c3a, 0x2079, 0x0240, 0x7833, -+ 0x1106, 0x7837, 0x0000, 0x080c, 0x5c99, 0x0118, 0x2013, 0x0000, -+ 0x0020, 0x705c, 0x9085, 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, -+ 0x024e, 0x2011, 0x1d0e, 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, -+ 0x1128, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x1f04, 0x578b, -+ 0x60c3, 0x0084, 0x080c, 0x5b6b, 0x00fe, 0x0005, 0x00f6, 0x708c, -+ 0x9005, 0x01c0, 0x2011, 0x5b41, 0x080c, 0x8159, 0x9086, 0x0084, -+ 0x1178, 0x080c, 0x5cb6, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, -+ 0x1138, 0x7834, 0x9005, 0x1120, 0x7097, 0x000c, 0x0029, 0x0010, -+ 0x080c, 0x5c92, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x000d, 0x080c, -+ 0x5c3a, 0x2079, 0x0240, 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, -+ 0x5cb6, 0x20a9, 0x0040, 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, -+ 0x8210, 0x8108, 0x9186, 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, -+ 0x2009, 0x0240, 0x6814, 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, -+ 0x57cf, 0x60c3, 0x0084, 0x080c, 0x5b6b, 0x00fe, 0x0005, 0x00f6, -+ 0x708c, 0x9005, 0x01e0, 0x2011, 0x5b41, 0x080c, 0x8159, 0x9086, -+ 0x0084, 0x1198, 0x080c, 0x5cb6, 0x2079, 0x0260, 0x7a30, 0x9296, -+ 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7093, 0x0001, 0x080c, -+ 0x5c0c, 0x7097, 0x000e, 0x0029, 0x0010, 0x080c, 0x5c92, 0x00fe, -+ 0x0005, 0x918d, 0x0001, 0x080c, 0x5ce1, 0x7097, 0x000f, 0x708f, -+ 0x0000, 0x2061, 0x0140, 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, -+ 0x0100, 0x6043, 0x0005, 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, -+ 0x5b41, 0x080c, 0x814d, 0x0005, 0x708c, 0x9005, 0x0130, 0x2011, -+ 0x5b41, 0x080c, 0x8159, 0x7097, 0x0000, 0x0005, 0x7097, 0x0011, -+ 0x080c, 0x97fa, 0x080c, 0x5cb6, 0x20e1, 0x0000, 0x2099, 0x0260, -+ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x748c, 0x9480, 0x0018, 0x9080, -+ 0x0007, 0x9084, 0x03f8, 0x8004, 0x20a8, 0x4003, 0x080c, 0x5c99, -+ 0x11a0, 0x7178, 0x81ff, 0x0188, 0x900e, 0x707c, 0x9084, 0x00ff, -+ 0x0160, 0x080c, 0x2424, 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, -+ 0x0120, 0x2011, 0x0008, 0x080c, 0x5aee, 0x60c3, 0x0014, 0x080c, -+ 0x5b6b, 0x0005, 0x00f6, 0x708c, 0x9005, 0x0500, 0x2011, 0x5b41, -+ 0x080c, 0x8159, 0x9086, 0x0014, 0x11b8, 0x080c, 0x5cb6, 0x2079, -+ 0x0260, 0x7a30, 0x9296, 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, -+ 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, -+ 0x7097, 0x0012, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, -+ 0x00f6, 0x7097, 0x0013, 0x080c, 0x5c48, 0x2079, 0x0240, 0x7833, -+ 0x1103, 0x7837, 0x0000, 0x080c, 0x5cb6, 0x080c, 0x5c99, 0x1170, -+ 0x7080, 0x9005, 0x1158, 0x7158, 0x9186, 0xffff, 0x0138, 0x2011, -+ 0x0008, 0x080c, 0x5aee, 0x0168, 0x080c, 0x5c6f, 0x20a9, 0x0008, -+ 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, -+ 0x4003, 0x60c3, 0x0014, 0x080c, 0x5b6b, 0x00fe, 0x0005, 0x00f6, -+ 0x708c, 0x9005, 0x0500, 0x2011, 0x5b41, 0x080c, 0x8159, 0x9086, -+ 0x0014, 0x11b8, 0x080c, 0x5cb6, 0x2079, 0x0260, 0x7a30, 0x9296, -+ 0x1104, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, -+ 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x7097, 0x0014, 0x0029, -+ 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x7097, 0x0015, -+ 0x080c, 0x5c48, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, -+ 0x080c, 0x5cb6, 0x080c, 0x5c99, 0x11b8, 0x7080, 0x9005, 0x11a0, -+ 0x7160, 0x9186, 0xffff, 0x0180, 0x9180, 0x318b, 0x200d, 0x918c, -+ 0xff00, 0x810f, 0x2011, 0x0008, 0x080c, 0x5aee, 0x0180, 0x080c, -+ 0x4c97, 0x0110, 0x080c, 0x248d, 0x20a9, 0x0008, 0x20e1, 0x0000, -+ 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, -+ 0x0014, 0x080c, 0x5b6b, 0x00fe, 0x0005, 0x00f6, 0x708c, 0x9005, -+ 0x05f0, 0x2011, 0x5b41, 0x080c, 0x8159, 0x9086, 0x0014, 0x15a8, -+ 0x080c, 0x5cb6, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, -+ 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, -+ 0x0001, 0x080c, 0x5ce1, 0x7a38, 0xd2fc, 0x0128, 0x70c0, 0x9005, -+ 0x1110, 0x70c3, 0x0001, 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, -+ 0x0128, 0x70c0, 0x9005, 0x1110, 0x70c3, 0x0001, 0x9085, 0x0001, -+ 0x080c, 0x5ce1, 0x7093, 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70db, -+ 0x0008, 0x7097, 0x0016, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, -+ 0x0005, 0x080c, 0x97fa, 0x080c, 0x5cb6, 0x20e1, 0x0000, 0x2099, -+ 0x0260, 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, -+ 0x2011, 0x026d, 0x2204, 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, -+ 0x2011, 0x026e, 0x7097, 0x0017, 0x080c, 0x5c99, 0x1150, 0x7080, -+ 0x9005, 0x1138, 0x080c, 0x5a61, 0x1188, 0x9085, 0x0001, 0x080c, -+ 0x248d, 0x20a9, 0x0008, 0x080c, 0x5cb6, 0x20e1, 0x0000, 0x2099, -+ 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, -+ 0x080c, 0x5b6b, 0x0010, 0x080c, 0x55bb, 0x0005, 0x00f6, 0x708c, -+ 0x9005, 0x01d8, 0x2011, 0x5b41, 0x080c, 0x8159, 0x9086, 0x0084, -+ 0x1190, 0x080c, 0x5cb6, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, -+ 0x1150, 0x7834, 0x9005, 0x1138, 0x9006, 0x080c, 0x5ce1, 0x7097, -+ 0x0018, 0x0029, 0x0010, 0x708f, 0x0000, 0x00fe, 0x0005, 0x00f6, -+ 0x7097, 0x0019, 0x080c, 0x5c48, 0x2079, 0x0240, 0x7833, 0x1106, -+ 0x7837, 0x0000, 0x080c, 0x5cb6, 0x2009, 0x026e, 0x2039, 0x1d0e, -+ 0x20a9, 0x0040, 0x213e, 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, -+ 0x6814, 0x8000, 0x6816, 0x2009, 0x0260, 0x1f04, 0x59ca, 0x2039, -+ 0x1d0e, 0x080c, 0x5c99, 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, -+ 0x00ff, 0x8000, 0x2018, 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, -+ 0x705c, 0x2310, 0x8214, 0x92a0, 0x1d0e, 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, 0x59fd, 0x60c3, 0x0084, 0x080c, 0x5b6b, 0x00fe, 0x0005, -+ 0x00f6, 0x708c, 0x9005, 0x01e0, 0x2011, 0x5b41, 0x080c, 0x8159, -+ 0x9086, 0x0084, 0x1198, 0x080c, 0x5cb6, 0x2079, 0x0260, 0x7a30, -+ 0x9296, 0x1107, 0x1158, 0x7834, 0x9005, 0x1140, 0x7093, 0x0001, -+ 0x080c, 0x5c0c, 0x7097, 0x001a, 0x0029, 0x0010, 0x708f, 0x0000, -+ 0x00fe, 0x0005, 0x9085, 0x0001, 0x080c, 0x5ce1, 0x7097, 0x001b, -+ 0x080c, 0x97fa, 0x080c, 0x5cb6, 0x2011, 0x0260, 0x2009, 0x0240, -+ 0x748c, 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, 0x5a49, 0x60c3, 0x0084, 0x080c, 0x5b6b, 0x0005, -+ 0x0005, 0x0086, 0x0096, 0x2029, 0x1854, 0x252c, 0x20a9, 0x0008, -+ 0x2041, 0x1d0e, 0x20e9, 0x0001, 0x28a0, 0x080c, 0x5cb6, 0x20e1, -+ 0x0000, 0x2099, 0x026e, 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, -+ 0xd5d4, 0x0108, 0x9016, 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, -+ 0x1148, 0xd5d4, 0x0110, 0x8210, 0x0008, 0x8211, 0x1f04, 0x5a7b, -+ 0x0804, 0x5aea, 0x82ff, 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, -+ 0x0d90, 0x0020, 0x91a6, 0x3fff, 0x0904, 0x5aea, 0x918d, 0xc000, -+ 0x20a9, 0x0010, 0x2019, 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, -+ 0x2120, 0xd5d4, 0x0110, 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, -+ 0x0110, 0x8319, 0x0008, 0x8318, 0x1f04, 0x5aa1, 0x04d8, 0x23a8, -+ 0x2021, 0x0001, 0x8426, 0x8425, 0x1f04, 0x5ab3, 0x2328, 0x8529, -+ 0x92be, 0x0007, 0x0158, 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, -+ 0x000e, 0x27a8, 0x95a8, 0x0010, 0x1f04, 0x5ac2, 0x755a, 0x95c8, -+ 0x318b, 0x292d, 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016, -+ 0x2508, 0x080c, 0x246d, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, -+ 0x2304, 0x9405, 0x201a, 0x7083, 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, 0x715a, 0x91a0, 0x318b, 0x242d, -+ 0x95ac, 0x00ff, 0x757e, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, -+ 0x246d, 0x001e, 0x60e7, 0x0000, 0x65ea, 0x7083, 0x0001, 0x9084, -+ 0x0000, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7087, 0x0000, 0x00ee, -+ 0x0005, 0x00e6, 0x00f6, 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, -+ 0x5bfb, 0x080c, 0x8fb7, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, -+ 0x2843, 0x0126, 0x2091, 0x8000, 0x2071, 0x1825, 0x2073, 0x0000, -+ 0x7840, 0x0026, 0x0016, 0x2009, 0x00f7, 0x080c, 0x5c58, 0x001e, -+ 0x9094, 0x0010, 0x9285, 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, -+ 0x00fe, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x27a2, -+ 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19c5, -+ 0x2013, 0x0000, 0x708f, 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, -+ 0x9575, 0x080c, 0x8faa, 0x6144, 0xd184, 0x0120, 0x7194, 0x918d, -+ 0x2000, 0x0018, 0x7188, 0x918d, 0x1000, 0x2011, 0x196a, 0x2112, -+ 0x2009, 0x07d0, 0x2011, 0x5b41, 0x080c, 0x821d, 0x0005, 0x0016, -+ 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x98c8, 0x080c, -+ 0x9b6d, 0x080c, 0x98e4, 0x2009, 0x00f7, 0x080c, 0x5c58, 0x2061, -+ 0x19d4, 0x900e, 0x611a, 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, -+ 0x6003, 0x0001, 0x2061, 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, -+ 0x2009, 0x196a, 0x200b, 0x0000, 0x2009, 0x002d, 0x2011, 0x5bc7, -+ 0x080c, 0x814d, 0x012e, 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, -+ 0x0006, 0x0126, 0x2091, 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, -+ 0x8fb7, 0x2071, 0x0140, 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, -+ 0x2843, 0x080c, 0x70bf, 0x0188, 0x080c, 0x70da, 0x1170, 0x080c, -+ 0x73c1, 0x0016, 0x080c, 0x253c, 0x2001, 0x193e, 0x2102, 0x001e, -+ 0x080c, 0x73bc, 0x080c, 0x6fe8, 0x0050, 0x2009, 0x0001, 0x080c, -+ 0x281f, 0x2001, 0x0001, 0x080c, 0x23c9, 0x080c, 0x5b97, 0x012e, -+ 0x000e, 0x00ee, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, -+ 0x0026, 0x0036, 0x2011, 0x8017, 0x2001, 0x196a, 0x201c, 0x080c, -+ 0x48d8, 0x003e, 0x002e, 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, -+ 0x20a1, 0x1d80, 0x080c, 0x5cb6, 0x20e9, 0x0000, 0x2099, 0x026e, -+ 0x0099, 0x20a9, 0x0020, 0x080c, 0x5cb0, 0x2099, 0x0260, 0x20a1, -+ 0x1d92, 0x0051, 0x20a9, 0x000e, 0x080c, 0x5cb3, 0x2099, 0x0260, -+ 0x20a1, 0x1db2, 0x0009, 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, -+ 0x2104, 0x8007, 0x2012, 0x8108, 0x8210, 0x1f04, 0x5c30, 0x002e, -+ 0x001e, 0x0005, 0x080c, 0x97fa, 0x20e1, 0x0001, 0x2099, 0x1d00, -+ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, -+ 0x080c, 0x97fa, 0x080c, 0x5cb6, 0x20e1, 0x0000, 0x2099, 0x0260, -+ 0x20e9, 0x0000, 0x20a1, 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, -+ 0x00c6, 0x0006, 0x2061, 0x0100, 0x810f, 0x2001, 0x1833, 0x2004, -+ 0x9005, 0x1138, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x9105, -+ 0x0010, 0x9185, 0x00f7, 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, -+ 0x0046, 0x080c, 0x6663, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, -+ 0x080c, 0xd273, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, -+ 0x002a, 0x900e, 0x080c, 0x2fc5, 0x080c, 0xbf61, 0x0140, 0x0036, -+ 0x2019, 0xffff, 0x2021, 0x0007, 0x080c, 0x4a75, 0x003e, 0x004e, -+ 0x001e, 0x0005, 0x080c, 0x5b97, 0x7097, 0x0000, 0x708f, 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, 0x1d00, -+ 0x4004, 0x2079, 0x1d00, 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, -+ 0x00ef, 0x7813, 0x0138, 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, -+ 0x014e, 0x015e, 0x00fe, 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, -+ 0x0005, 0x2001, 0x1977, 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, -+ 0x0000, 0x0005, 0x0156, 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, -+ 0x200a, 0x8108, 0x1f04, 0x5cf0, 0x015e, 0x0005, 0x00d6, 0x0036, -+ 0x0156, 0x0136, 0x0146, 0x2069, 0x1853, 0x9006, 0xb802, 0xb8c6, -+ 0xb807, 0x0707, 0xb80a, 0xb80e, 0xb812, 0x9198, 0x318b, 0x231d, -+ 0x939c, 0x00ff, 0xbb16, 0x0016, 0x0026, 0xb886, 0x080c, 0x9b66, -+ 0x1120, 0x9192, 0x007e, 0x1208, 0xbb86, 0x20a9, 0x0004, 0xb8b4, -+ 0x20e8, 0xb9b8, 0x9198, 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, -+ 0x0004, 0x9198, 0x000a, 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, -+ 0xb842, 0xb8be, 0xb8c2, 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, -+ 0x0100, 0xb872, 0xb876, 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, -+ 0xb896, 0xb89a, 0xb89e, 0xb8ae, 0xb9a2, 0x0096, 0xb8a4, 0x904d, -+ 0x0110, 0x080c, 0x1054, 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, -+ 0x5db4, 0x9182, 0x0800, 0x1a04, 0x5db8, 0x2001, 0x180c, 0x2004, -+ 0x9084, 0x0003, 0x1904, 0x5dbe, 0x9188, 0x1000, 0x2104, 0x905d, -+ 0x0198, 0xb804, 0x9084, 0x00ff, 0x908e, 0x0006, 0x1188, 0xb8a4, -+ 0x900d, 0x1904, 0x5dd0, 0x080c, 0x612a, 0x9006, 0x012e, 0x0005, -+ 0x2001, 0x0005, 0x900e, 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, -+ 0x9082, 0x0006, 0x1290, 0x080c, 0x9b66, 0x1160, 0xb8a0, 0x9084, -+ 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0d10, 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, 0x9065, 0x09a8, -+ 0x080c, 0x6667, 0x1990, 0xb800, 0xd0bc, 0x0978, 0x0804, 0x5d77, -+ 0x080c, 0x64db, 0x0904, 0x5d80, 0x0804, 0x5d7b, 0x00e6, 0x2071, -+ 0x19b8, 0x7004, 0x9086, 0x0002, 0x1128, 0x7030, 0x9080, 0x0004, -+ 0x2004, 0x9b06, 0x00ee, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, -+ 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x5e5f, 0x9188, 0x1000, -+ 0x2104, 0x905d, 0x0904, 0x5e37, 0xb8a0, 0x9086, 0x007f, 0x0178, -+ 0x080c, 0x666f, 0x0160, 0xa994, 0x81ff, 0x0130, 0x908e, 0x0004, -+ 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x6667, 0x1598, 0xa87c, -+ 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, 0x0026, 0x2010, -+ 0x080c, 0xb835, 0x002e, 0x1120, 0x2001, 0x0008, 0x0804, 0x5e61, -+ 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, 0x0804, 0x5e61, -+ 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, 0x080c, 0x9b91, -+ 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, -+ 0x000a, 0x2009, 0x0003, 0x080c, 0x9c85, 0x9006, 0x0458, 0x2001, -+ 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, 0x9b66, 0x1160, -+ 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, 0x0900, 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, 0x5ef6, 0x5eb1, 0x5ec8, 0x5ef6, 0x5ef6, 0x5ef6, 0x5ef6, -+ 0x5ef6, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, 0x6210, 0x0148, -+ 0x9046, 0xb810, 0x9306, 0x1904, 0x5efe, 0xb814, 0x9206, 0x15f0, -+ 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x4792, 0x0150, 0x04b0, -+ 0x080c, 0x6270, 0x1598, 0xb810, 0x9306, 0x1580, 0xb814, 0x9206, -+ 0x1568, 0x080c, 0x9b91, 0x0530, 0x2b00, 0x6012, 0x080c, 0xbcdb, -+ 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, 0xa878, 0x9086, -+ 0x0001, 0x1170, 0x080c, 0x3006, 0x9006, 0x080c, 0x61ad, 0x2001, -+ 0x0002, 0x080c, 0x61c1, 0x2001, 0x0200, 0xb86e, 0xb893, 0x0002, -+ 0x2009, 0x0003, 0x080c, 0x9c85, 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, 0x60d3, 0x90c6, 0x0056, 0x0904, 0x60d7, 0x90c6, 0x0066, -+ 0x0904, 0x60db, 0x90c6, 0x0067, 0x0904, 0x60df, 0x90c6, 0x0068, -+ 0x0904, 0x60e3, 0x90c6, 0x0071, 0x0904, 0x60e7, 0x90c6, 0x0074, -+ 0x0904, 0x60eb, 0x90c6, 0x007c, 0x0904, 0x60ef, 0x90c6, 0x007e, -+ 0x0904, 0x60f3, 0x90c6, 0x0037, 0x0904, 0x60f7, 0x9016, 0x2079, -+ 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x60ce, 0x9182, 0x0800, -+ 0x1a04, 0x60ce, 0x080c, 0x6270, 0x1198, 0xb804, 0x9084, 0x00ff, -+ 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, 0x0148, 0x080c, -+ 0x9b66, 0x1904, 0x60b7, 0xb8a0, 0x9084, 0xff80, 0x1904, 0x60b7, -+ 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, 0x0904, 0x6017, -+ 0x90c6, 0x0064, 0x0904, 0x6040, 0x2008, 0x0804, 0x5fda, 0xa998, -+ 0xa8b0, 0x2040, 0x080c, 0x9b66, 0x1120, 0x9182, 0x007f, 0x0a04, -+ 0x5fda, 0x9186, 0x00ff, 0x0904, 0x5fda, 0x9182, 0x0800, 0x1a04, -+ 0x5fda, 0xaaa0, 0xab9c, 0x7878, 0x9306, 0x1188, 0x787c, 0x0096, -+ 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, 0x5fda, 0x99cc, -+ 0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804, 0x5fda, 0x080c, -+ 0x4792, 0x0904, 0x5fe3, 0x900e, 0x9016, 0x90c6, 0x4000, 0x1558, -+ 0x0006, 0x080c, 0x655f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, -+ 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, -+ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, -+ 0x0f9f, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0035, -+ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x000a, 0x2098, 0x080c, -+ 0x0f9f, 0x000e, 0x00c8, 0x90c6, 0x4007, 0x1110, 0x2408, 0x00a0, -+ 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0070, 0x90c6, 0x4009, -+ 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, 0x2001, 0x4005, 0x2009, -+ 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, 0xa99a, 0xaa9e, 0x2001, -+ 0x0030, 0x900e, 0x0470, 0x080c, 0x9b91, 0x1130, 0x2001, 0x4005, -+ 0x2009, 0x0003, 0x9016, 0x0c80, 0x2b00, 0x6012, 0x080c, 0xbcdb, -+ 0x2900, 0x6016, 0x6023, 0x0001, 0xa868, 0xd88c, 0x0108, 0xc0f5, -+ 0xa86a, 0x0126, 0x2091, 0x8000, 0x080c, 0x3006, 0x012e, 0x9006, -+ 0x080c, 0x61ad, 0x2001, 0x0002, 0x080c, 0x61c1, 0x2009, 0x0002, -+ 0x080c, 0x9c85, 0xa8b0, 0xd094, 0x0118, 0xb8c4, 0xc08d, 0xb8c6, -+ 0x9006, 0x9005, 0x012e, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x080c, -+ 0x53a1, 0x0118, 0x2009, 0x0007, 0x00f8, 0xa998, 0xaeb0, 0x080c, -+ 0x6270, 0x1904, 0x5fd5, 0x9186, 0x007f, 0x0130, 0x080c, 0x6667, -+ 0x0118, 0x2009, 0x0009, 0x0080, 0x0096, 0x080c, 0x1022, 0x1120, -+ 0x009e, 0x2009, 0x0002, 0x0040, 0x2900, 0x009e, 0xa806, 0x080c, -+ 0xba33, 0x19b0, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x5fdc, -+ 0xa998, 0xaeb0, 0x080c, 0x6270, 0x1904, 0x5fd5, 0x0096, 0x080c, -+ 0x1022, 0x1128, 0x009e, 0x2009, 0x0002, 0x0804, 0x6094, 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, 0x0f9f, 0x009e, 0xa87b, 0x0000, 0xa883, -+ 0x0000, 0xa897, 0x4000, 0xd684, 0x1168, 0x080c, 0x538d, 0xd0b4, -+ 0x1118, 0xa89b, 0x000b, 0x00e0, 0xb800, 0xd08c, 0x0118, 0xa89b, -+ 0x000c, 0x00b0, 0x080c, 0x6667, 0x0118, 0xa89b, 0x0009, 0x0080, -+ 0x080c, 0x53a1, 0x0118, 0xa89b, 0x0007, 0x0050, 0x080c, 0xba16, -+ 0x1904, 0x6010, 0x2009, 0x0003, 0x2001, 0x4005, 0x0804, 0x5fdc, -+ 0xa87b, 0x0030, 0xa897, 0x4005, 0xa804, 0x8006, 0x8006, 0x8007, -+ 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, -+ 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x1266, -+ 0x080c, 0xa0f5, 0x1904, 0x6010, 0x2009, 0x0002, 0x08e8, 0x2001, -+ 0x0028, 0x900e, 0x0804, 0x6011, 0x2009, 0x180c, 0x210c, 0xd18c, -+ 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, -+ 0x0010, 0x2001, 0x0029, 0x900e, 0x0804, 0x6011, 0x2001, 0x0029, -+ 0x900e, 0x0804, 0x6011, 0x080c, 0x35ae, 0x0804, 0x6012, 0x080c, -+ 0x50c2, 0x0804, 0x6012, 0x080c, 0x4354, 0x0804, 0x6012, 0x080c, -+ 0x43cd, 0x0804, 0x6012, 0x080c, 0x4429, 0x0804, 0x6012, 0x080c, -+ 0x484e, 0x0804, 0x6012, 0x080c, 0x4afa, 0x0804, 0x6012, 0x080c, -+ 0x4d2d, 0x0804, 0x6012, 0x080c, 0x4f26, 0x0804, 0x6012, 0x080c, -+ 0x37c3, 0x0804, 0x6012, 0x00b6, 0xa974, 0xae78, 0x9684, 0x3fff, -+ 0x9082, 0x4000, 0x1608, 0x9182, 0x0800, 0x1258, 0x9188, 0x1000, -+ 0x2104, 0x905d, 0x0130, 0x080c, 0x6667, 0x1138, 0x00d9, 0x9006, -+ 0x00b0, 0x2001, 0x0028, 0x900e, 0x0090, 0x9082, 0x0006, 0x1240, -+ 0xb900, 0xd1fc, 0x0d98, 0x2001, 0x0029, 0x2009, 0x1000, 0x0038, -+ 0x2001, 0x0029, 0x900e, 0x0018, 0x2001, 0x0029, 0x900e, 0x9005, -+ 0x00be, 0x0005, 0xa877, 0x0000, 0xb8c0, 0x9005, 0x1904, 0x61a1, -+ 0xb888, 0x9005, 0x1904, 0x61a1, 0xb838, 0xb93c, 0x9102, 0x1a04, -+ 0x61a1, 0x2b10, 0x080c, 0x9bbe, 0x0904, 0x619d, 0x8108, 0xb93e, -+ 0x6212, 0x2900, 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, -+ 0x0040, 0xa878, 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, -+ 0x0000, 0xa87c, 0xd0ac, 0x05c0, 0xc0dd, 0xa87e, 0xa888, 0x8001, -+ 0x1568, 0x2001, 0x00f8, 0x8001, 0xa001, 0xa001, 0xa001, 0x1dd8, -+ 0xa816, 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x11f8, 0x9084, -+ 0x00ff, 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, -+ 0x000f, 0x8001, 0x1df0, 0x2001, 0x8004, 0x6003, 0x0004, 0x6046, -+ 0x00f6, 0x2079, 0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0010, -+ 0x2c00, 0x7836, 0x781b, 0x8080, 0x00fe, 0x0005, 0x080c, 0x164f, -+ 0x601c, 0xc0bd, 0x601e, 0x0c38, 0x0006, 0x2001, 0x00e8, 0x8001, -+ 0xa001, 0xa001, 0xa001, 0x1dd8, 0x000e, 0xd0b4, 0x190c, 0x1ad2, -+ 0x2001, 0x8004, 0x6003, 0x0002, 0x08d0, 0x81ff, 0x1110, 0xb88b, -+ 0x0001, 0x2908, 0xb8bc, 0xb9be, 0x9005, 0x1110, 0xb9c2, 0x0020, -+ 0x0096, 0x2048, 0xa902, 0x009e, 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, 0x6663, 0x0140, 0x9284, 0xff00, 0x8007, 0x9086, 0x0007, -+ 0x1110, 0x2011, 0x0600, 0x000e, 0x9294, 0xff00, 0x9215, 0xba06, -+ 0x0006, 0x9086, 0x0006, 0x1120, 0xba90, 0x82ff, 0x090c, 0x0d65, -+ 0x000e, 0x00ce, 0x012e, 0x00be, 0x0005, 0x00b6, 0x0126, 0x00c6, -+ 0x2091, 0x8000, 0x6210, 0x2258, 0xba04, 0x0006, 0x9086, 0x0006, -+ 0x1168, 0xb89c, 0xd0a4, 0x0150, 0x080c, 0x665f, 0x1138, 0x9284, -+ 0x00ff, 0x9086, 0x0007, 0x1110, 0x2011, 0x0006, 0x000e, 0x9294, -+ 0x00ff, 0x8007, 0x9215, 0xba06, 0x00ce, 0x012e, 0x00be, 0x0005, -+ 0x9182, 0x0800, 0x0218, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0026, -+ 0x9190, 0x1000, 0x2204, 0x905d, 0x1180, 0x0096, 0x080c, 0x1022, -+ 0x2958, 0x009e, 0x0160, 0x2b00, 0x2012, 0xb85c, 0xb8ba, 0xb860, -+ 0xb8b6, 0x9006, 0xb8a6, 0x080c, 0x5cf6, 0x9006, 0x0010, 0x9085, -+ 0x0001, 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, 0x1054, 0x00d6, 0x00c6, 0xb8ac, -+ 0x2060, 0x8cff, 0x0168, 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, -+ 0xb847, 0x0110, 0x080c, 0x0fd4, 0x080c, 0x9be7, 0x00ce, 0x0c88, -+ 0x00ce, 0x00de, 0x2b48, 0xb8b8, 0xb85e, 0xb8b4, 0xb862, 0x080c, -+ 0x1064, 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, 0x70b7, 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, -+ 0x080c, 0x9b66, 0x11d8, 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, -+ 0x2061, 0x1953, 0x7048, 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, -+ 0x7054, 0x600e, 0x00ce, 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, -+ 0x2001, 0x0001, 0x6886, 0x2069, 0x1800, 0x68b2, 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, 0xbbc4, -+ 0xc384, 0xba00, 0x2009, 0x1873, 0x210c, 0xd0bc, 0x0120, 0xd1ec, -+ 0x0110, 0xc2ad, 0x0008, 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, -+ 0xc2bd, 0xd0cc, 0x0128, 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, -+ 0xba02, 0xbbc6, 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, 0x0d65, -+ 0x3c00, 0x20e8, 0x3300, 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, -+ 0x01de, 0x01ce, 0x014e, 0x013e, 0x0060, 0x080c, 0x1022, 0x0170, -+ 0x2900, 0xb8a6, 0xa803, 0x0000, 0x080c, 0x64fb, 0xa807, 0x0001, -+ 0xae12, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, -+ 0x0126, 0x2091, 0x8000, 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, -+ 0x9005, 0x1150, 0x080c, 0x650a, 0x1158, 0xa804, 0x908a, 0x0002, -+ 0x0218, 0x8001, 0xa806, 0x0020, 0x080c, 0x1054, 0xb8a7, 0x0000, -+ 0x009e, 0x012e, 0x0005, 0x0096, 0x00c6, 0xb888, 0x9005, 0x1904, -+ 0x63f4, 0xb8c0, 0x904d, 0x0904, 0x63f4, 0x080c, 0x9bbe, 0x0904, -+ 0x63f0, 0x8210, 0xba3e, 0xa800, 0xb8c2, 0x9005, 0x1108, 0xb8be, -+ 0x2b00, 0x6012, 0x2900, 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, -+ 0x6007, 0x0040, 0xa878, 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, -+ 0xa883, 0x0000, 0xa87c, 0xd0ac, 0x01c8, 0xc0dd, 0xa87e, 0xa888, -+ 0x8001, 0x1568, 0xa816, 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, -+ 0x1530, 0x9084, 0x00ff, 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, -+ 0xaa3a, 0x2001, 0x8004, 0x6003, 0x0004, 0x0030, 0x080c, 0x1ad2, -+ 0x2001, 0x8004, 0x6003, 0x0002, 0x6046, 0x2001, 0x0010, 0x2c08, -+ 0x080c, 0x98b9, 0xb838, 0xba3c, 0x9202, 0x0a04, 0x63a1, 0x0020, -+ 0x82ff, 0x1110, 0xb88b, 0x0001, 0x00ce, 0x009e, 0x0005, 0x080c, -+ 0x164f, 0x601c, 0xc0bd, 0x601e, 0x08e0, 0x00b6, 0x0096, 0x0016, -+ 0x20a9, 0x0800, 0x900e, 0x0016, 0x080c, 0x6270, 0x1158, 0xb8c0, -+ 0x904d, 0x0140, 0x3e00, 0x9086, 0x0002, 0x1118, 0xb800, 0xd0bc, -+ 0x1108, 0x0041, 0x001e, 0x8108, 0x1f04, 0x6403, 0x001e, 0x00be, -+ 0x009e, 0x0005, 0x0096, 0x0016, 0xb8c0, 0x904d, 0x0188, 0xa800, -+ 0xb8c2, 0x9005, 0x1108, 0xb8be, 0x9006, 0xa802, 0xa867, 0x0103, -+ 0xab7a, 0xa877, 0x0000, 0x080c, 0xbb45, 0x080c, 0x6996, 0x0c60, -+ 0x001e, 0x009e, 0x0005, 0x0086, 0x9046, 0xb8c0, 0x904d, 0x0198, -+ 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0128, 0x2940, 0xa800, -+ 0x904d, 0x0148, 0x0ca8, 0xa800, 0x88ff, 0x1110, 0xb8c2, 0x0008, -+ 0xa002, 0xa803, 0x0000, 0x008e, 0x0005, 0x901e, 0x0010, 0x2019, -+ 0x0001, 0x00e6, 0x0096, 0x00c6, 0x0086, 0x0026, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x19b8, 0x9046, 0x7028, 0x9065, 0x01e8, 0x6014, -+ 0x2068, 0x83ff, 0x0120, 0x605c, 0x9606, 0x0158, 0x0030, 0xa86c, -+ 0x9406, 0x1118, 0xa870, 0x9506, 0x0120, 0x2c40, 0x600c, 0x2060, -+ 0x0c60, 0x600c, 0x0006, 0x0066, 0x2830, 0x080c, 0x9110, 0x006e, -+ 0x000e, 0x83ff, 0x0508, 0x0c08, 0x9046, 0xb8c0, 0x904d, 0x01e0, -+ 0x83ff, 0x0120, 0xa878, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, -+ 0x1118, 0xa870, 0x9506, 0x0120, 0x2940, 0xa800, 0x2048, 0x0c70, -+ 0xb8c0, 0xaa00, 0x0026, 0x9906, 0x1110, 0xbac2, 0x0008, 0xa202, -+ 0x000e, 0x83ff, 0x0108, 0x0c10, 0x002e, 0x008e, 0x00ce, 0x009e, -+ 0x00ee, 0x0005, 0x9016, 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, -+ 0x080c, 0x655f, 0x0128, 0x080c, 0xb908, 0x0010, 0x9085, 0x0001, -+ 0x0005, 0x080c, 0x655f, 0x0128, 0x080c, 0xb8a9, 0x0010, 0x9085, -+ 0x0001, 0x0005, 0x080c, 0x655f, 0x0128, 0x080c, 0xb905, 0x0010, -+ 0x9085, 0x0001, 0x0005, 0x080c, 0x655f, 0x0128, 0x080c, 0xb8c8, -+ 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x655f, 0x0128, 0x080c, -+ 0xb949, 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, 0x1022, 0x0168, -+ 0x2900, 0xb8a6, 0x080c, 0x64fb, 0xa803, 0x0001, 0xa807, 0x0000, -+ 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, -+ 0x0126, 0x2091, 0x8000, 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, -+ 0x080c, 0x1054, 0x9085, 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, -+ 0xd0a4, 0x0005, 0x00b6, 0x00f6, 0x080c, 0x70b7, 0x01b0, 0x71c0, -+ 0x81ff, 0x1198, 0x71d8, 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, -+ 0x1000, 0x2004, 0x905d, 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, -+ 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x2079, 0x1853, 0x7804, -+ 0x00d0, 0x0156, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6270, -+ 0x1168, 0xb804, 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, -+ 0x9086, 0x0006, 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, -+ 0x1f04, 0x6585, 0x015e, 0x080c, 0x6625, 0x0120, 0x2001, 0x1956, -+ 0x200c, 0x0030, 0x2079, 0x1853, 0x7804, 0x0030, 0x2009, 0x07d0, -+ 0x2011, 0x65af, 0x080c, 0x821d, 0x00fe, 0x00be, 0x0005, 0x00b6, -+ 0x2011, 0x65af, 0x080c, 0x8159, 0x080c, 0x6625, 0x01d8, 0x2001, -+ 0x107e, 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6663, -+ 0x0130, 0x2009, 0x07d0, 0x2011, 0x65af, 0x080c, 0x821d, 0x00e6, -+ 0x2071, 0x1800, 0x9006, 0x707a, 0x705c, 0x707e, 0x080c, 0x2ddb, -+ 0x00ee, 0x04d0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, -+ 0x080c, 0x6270, 0x1558, 0xb800, 0xd0ec, 0x0540, 0x0046, 0xbaa0, -+ 0x2220, 0x9006, 0x2009, 0x0029, 0x080c, 0xd273, 0xb800, 0xc0e5, -+ 0xc0ec, 0xb802, 0x080c, 0x665f, 0x2001, 0x0707, 0x1128, 0xb804, -+ 0x9084, 0x00ff, 0x9085, 0x0700, 0xb806, 0x080c, 0x98c8, 0x2019, -+ 0x0029, 0x080c, 0x863b, 0x0076, 0x903e, 0x080c, 0x852a, 0x900e, -+ 0x080c, 0xcfc8, 0x007e, 0x004e, 0x080c, 0x98e4, 0x001e, 0x8108, -+ 0x1f04, 0x65d7, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, -+ 0x2058, 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x7810, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, -+ 0x0108, 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, 0x0d65, 0x000e, 0xba00, 0x9005, -+ 0x0110, 0xc2fd, 0x0008, 0xc2fc, 0xba02, 0x002e, 0x012e, 0x0005, -+ 0x2011, 0x1836, 0x2204, 0xd0cc, 0x0138, 0x2001, 0x1954, 0x200c, -+ 0x2011, 0x6655, 0x080c, 0x821d, 0x0005, 0x2011, 0x6655, 0x080c, -+ 0x8159, 0x2011, 0x1836, 0x2204, 0xc0cc, 0x2012, 0x0005, 0x080c, -+ 0x538d, 0xd0ac, 0x0005, 0x080c, 0x538d, 0xd0a4, 0x0005, 0x0016, -+ 0xb904, 0x9184, 0x00ff, 0x908e, 0x0006, 0x001e, 0x0005, 0x0016, -+ 0xb904, 0x9184, 0xff00, 0x8007, 0x908e, 0x0006, 0x001e, 0x0005, -+ 0x00b6, 0x00f6, 0x080c, 0xbf61, 0x0158, 0x70d8, 0x9084, 0x0028, -+ 0x0138, 0x2001, 0x107f, 0x2004, 0x905d, 0x0110, 0xb8c4, 0xd094, -+ 0x00fe, 0x00be, 0x0005, 0x0006, 0x0016, 0x0036, 0x0046, 0x0076, -+ 0x00b6, 0x2001, 0x1817, 0x203c, 0x9780, 0x318b, 0x203d, 0x97bc, -+ 0xff00, 0x873f, 0x9006, 0x2018, 0x2008, 0x9284, 0x8000, 0x0110, -+ 0x2019, 0x0001, 0x9294, 0x7fff, 0x2100, 0x9706, 0x0190, 0x91a0, -+ 0x1000, 0x2404, 0x905d, 0x0168, 0xb804, 0x9084, 0x00ff, 0x9086, -+ 0x0006, 0x1138, 0x83ff, 0x0118, 0xb89c, 0xd0a4, 0x0110, 0x8211, -+ 0x0158, 0x8108, 0x83ff, 0x0120, 0x9182, 0x0800, 0x0e28, 0x0068, -+ 0x9182, 0x007e, 0x0e08, 0x0048, 0x00be, 0x007e, 0x004e, 0x003e, -+ 0x001e, 0x9085, 0x0001, 0x000e, 0x0005, 0x00be, 0x007e, 0x004e, -+ 0x003e, 0x001e, 0x9006, 0x000e, 0x0005, 0x0046, 0x0056, 0x0076, -+ 0x00b6, 0x2100, 0x9084, 0x7fff, 0x9080, 0x1000, 0x2004, 0x905d, -+ 0x0130, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0550, 0x9184, -+ 0x8000, 0x0580, 0x2001, 0x1817, 0x203c, 0x9780, 0x318b, 0x203d, -+ 0x97bc, 0xff00, 0x873f, 0x9006, 0x2020, 0x2400, 0x9706, 0x01a0, -+ 0x94a8, 0x1000, 0x2504, 0x905d, 0x0178, 0xb804, 0x9084, 0x00ff, -+ 0x9086, 0x0006, 0x1148, 0xb89c, 0xd0a4, 0x0130, 0xb814, 0x9206, -+ 0x1118, 0xb810, 0x9306, 0x0128, 0x8420, 0x9482, 0x0800, 0x0e28, -+ 0x0048, 0x918c, 0x7fff, 0x00be, 0x007e, 0x005e, 0x004e, 0x9085, -+ 0x0001, 0x0005, 0x918c, 0x7fff, 0x00be, 0x007e, 0x005e, 0x004e, -+ 0x9006, 0x0005, 0x2071, 0x1906, 0x7003, 0x0001, 0x7007, 0x0000, -+ 0x9006, 0x7012, 0x7016, 0x701a, 0x701e, 0x700a, 0x7046, 0x2001, -+ 0x1919, 0x2003, 0x0000, 0x0005, 0x0016, 0x00e6, 0x2071, 0x191a, -+ 0x900e, 0x710a, 0x080c, 0x538d, 0xd0fc, 0x1140, 0x080c, 0x538d, -+ 0x900e, 0xd09c, 0x0108, 0x8108, 0x7102, 0x0400, 0x2001, 0x1873, -+ 0x200c, 0x9184, 0x0007, 0x9006, 0x0002, 0x673e, 0x673e, 0x673e, -+ 0x673e, 0x673e, 0x6755, 0x6763, 0x673e, 0x7003, 0x0003, 0x2009, -+ 0x1874, 0x210c, 0x9184, 0xff00, 0x8007, 0x9005, 0x1110, 0x2001, -+ 0x0002, 0x7006, 0x0018, 0x7003, 0x0005, 0x0c88, 0x00ee, 0x001e, -+ 0x0005, 0x00e6, 0x2071, 0x0050, 0x684c, 0x9005, 0x1150, 0x00e6, -+ 0x2071, 0x1906, 0x7028, 0xc085, 0x702a, 0x00ee, 0x9085, 0x0001, -+ 0x0488, 0x6844, 0x9005, 0x0158, 0x080c, 0x7429, 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, -+ 0x1906, 0x7028, 0xc084, 0x702a, 0x7007, 0x0001, 0x700b, 0x0000, -+ 0x00ee, 0x9006, 0x00ee, 0x0005, 0xa868, 0xd0fc, 0x11d8, 0x00e6, -+ 0x0026, 0x2001, 0x191a, 0x2004, 0x9005, 0x0904, 0x699b, 0xa87c, -+ 0xd0bc, 0x1904, 0x699b, 0xa978, 0xa874, 0x9105, 0x1904, 0x699b, -+ 0x2001, 0x191a, 0x2004, 0x0002, 0x699b, 0x67ef, 0x682b, 0x682b, -+ 0x699b, 0x682b, 0x0005, 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, -+ 0x2009, 0x191a, 0x210c, 0x81ff, 0x0904, 0x699b, 0xa87c, 0xd0cc, -+ 0x0904, 0x699b, 0xa880, 0x9084, 0x00ff, 0x9086, 0x0001, 0x1904, -+ 0x699b, 0x9186, 0x0003, 0x0904, 0x682b, 0x9186, 0x0005, 0x0904, -+ 0x682b, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, 0x0005, 0xa84f, -+ 0x8020, 0xa853, 0x0016, 0x2071, 0x1906, 0x701c, 0x9005, 0x1904, -+ 0x6b3e, 0x0e04, 0x6b89, 0x2071, 0x0000, 0xa84c, 0x7082, 0xa850, -+ 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, 0x4080, -+ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x2071, 0x1800, -+ 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, 0xa802, 0x2900, -+ 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x8074, 0x002e, 0x00ee, -+ 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, -+ 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6920, -+ 0x782c, 0x908c, 0x0780, 0x190c, 0x6cb0, 0x8004, 0x8004, 0x8004, -+ 0x9084, 0x0003, 0x0002, 0x6849, 0x6920, 0x686e, 0x68bb, 0x080c, -+ 0x0d65, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1170, -+ 0x2071, 0x19d4, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, -+ 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, -+ 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, -+ 0x70bc, 0x9200, 0x70be, 0x080c, 0x8074, 0x0c10, 0x2071, 0x1800, -+ 0x2900, 0x7822, 0xa804, 0x900d, 0x15a8, 0x7824, 0x00e6, 0x2071, -+ 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x182f, 0x210c, 0x918a, -+ 0x0040, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, 0x2102, -+ 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, -+ 0x70bc, 0x8000, 0x70be, 0x080c, 0x8074, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6cb0, 0xd0a4, 0x19c8, 0x2071, 0x19d4, 0x703c, 0x9005, -+ 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, -+ 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, -+ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, -+ 0x8074, 0x0804, 0x6875, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, -+ 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, -+ 0x080c, 0x8074, 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd0a4, -+ 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd09c, -+ 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, 0x1560, 0x2071, -+ 0x19d4, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, -+ 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, 0x2908, 0x7010, -+ 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, -+ 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, 0x19d4, 0x703c, -+ 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, 0x703e, 0x00fe, -+ 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, -+ 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70bc, -+ 0x9200, 0x70be, 0x080c, 0x8074, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, -+ 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6975, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd09c, 0x1198, 0x701c, -+ 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, -+ 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, -+ 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd0a4, -+ 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, -+ 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x8074, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd0a4, 0x1d60, 0x00ee, 0x2071, -+ 0x19d4, 0x703c, 0x9005, 0x1328, 0x2001, 0x191b, 0x2004, 0x8005, -+ 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1800, -+ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x8074, 0x00ee, -+ 0x0804, 0x6930, 0xa868, 0xd0fc, 0x1560, 0x0096, 0xa804, 0xa807, -+ 0x0000, 0x904d, 0x190c, 0x0fd4, 0x009e, 0x0018, 0xa868, 0xd0fc, -+ 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, 0x2079, 0x0050, -+ 0x2071, 0x1906, 0xa803, 0x0000, 0x7010, 0x9005, 0x1904, 0x6ab8, -+ 0x782c, 0x908c, 0x0780, 0x190c, 0x6cb0, 0x8004, 0x8004, 0x8004, -+ 0x9084, 0x0003, 0x0002, 0x69ba, 0x6ab8, 0x69d5, 0x6a47, 0x080c, -+ 0x0d65, 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, 0x080c, 0x8074, 0x0c60, 0x2071, 0x1800, 0x2900, -+ 0x7822, 0xa804, 0x900d, 0x1904, 0x6a36, 0x7830, 0xd0dc, 0x1120, -+ 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, 0x2071, 0x0040, -+ 0x712c, 0xd19c, 0x1170, 0x2009, 0x182f, 0x210c, 0x918a, 0x0040, -+ 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, 0x2102, 0x00ee, -+ 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, -+ 0x8000, 0x70be, 0x080c, 0x8074, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x6cb0, 0xd0a4, 0x19c8, 0x0e04, 0x6a2d, 0x7838, 0x7938, 0x910e, -+ 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, -+ 0x2001, 0x1917, 0x200c, 0xc184, 0x2102, 0x2091, 0x4080, 0x2001, -+ 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x2009, 0x1919, 0x200b, -+ 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, 0x1917, 0x200c, -+ 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, -+ 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, -+ 0x70bc, 0x9200, 0x70be, 0x080c, 0x8074, 0x0804, 0x69e4, 0x0096, -+ 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, -+ 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x8074, 0x782c, 0x9094, -+ 0x0780, 0x190c, 0x6cb0, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6a8b, -+ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, -+ 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, -+ 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x2009, 0x1919, -+ 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, 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, 0x080c, 0x8074, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, -+ 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1904, 0x6b29, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd09c, 0x11b0, 0x701c, -+ 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, 0x8001, 0x7012, -+ 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, -+ 0x0780, 0x190c, 0x6cb0, 0xd09c, 0x0d50, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x6cb0, 0xd0a4, 0x05c8, 0x00e6, 0x7824, 0x2048, 0x2071, -+ 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, -+ 0x080c, 0x8074, 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd0a4, -+ 0x1d60, 0x00ee, 0x0e04, 0x6b22, 0x7838, 0x7938, 0x910e, 0x1de0, -+ 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, -+ 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, -+ 0x190c, 0x11be, 0x2009, 0x1919, 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, 0x080c, 0x8074, 0x00ee, 0x0804, 0x6ac8, 0x2071, 0x1906, -+ 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, -+ 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, -+ 0x1128, 0x1e04, 0x6b69, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, -+ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x702e, 0x70bc, 0x9200, 0x70be, 0x080c, 0x8074, 0x0e04, -+ 0x6b53, 0x2071, 0x1906, 0x701c, 0x2048, 0xa84c, 0x900d, 0x0d18, -+ 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, -+ 0xa870, 0x708a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, -+ 0x190c, 0x11be, 0x2071, 0x1906, 0x080c, 0x6c9c, 0x002e, 0x00ee, -+ 0x0005, 0x2071, 0x1906, 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, 0x080c, 0x8074, -+ 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, 0x1906, 0x7004, 0x0002, 0x6bd4, 0x6bd5, -+ 0x6c9b, 0x6bd5, 0x0d65, 0x6c9b, 0x0005, 0x2001, 0x191a, 0x2004, -+ 0x0002, 0x6bdf, 0x6bdf, 0x6c34, 0x6c35, 0x6bdf, 0x6c35, 0x0126, -+ 0x2091, 0x8000, 0x1e0c, 0x6cbb, 0x701c, 0x904d, 0x01e0, 0xa84c, -+ 0x9005, 0x01d8, 0x0e04, 0x6c03, 0xa94c, 0x2071, 0x0000, 0x7182, -+ 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0x2091, -+ 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11be, 0x2071, -+ 0x1906, 0x080c, 0x6c9c, 0x012e, 0x0470, 0x2001, 0x005b, 0x2004, -+ 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd09c, 0x2071, 0x1906, 0x1510, -+ 0x2071, 0x1906, 0x700f, 0x0001, 0xa964, 0x9184, 0x00ff, 0x9086, -+ 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, 0x0108, 0x710e, -+ 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, 0x2071, 0x1906, -+ 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, 0x701e, 0x9005, -+ 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, 0x2008, 0x2069, -+ 0x19d4, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, 0x0003, 0x0540, -+ 0x2001, 0x1814, 0x2004, 0x2009, 0x1b1e, 0x210c, 0x9102, 0x1500, -+ 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, 0x6838, 0x9106, -+ 0x0190, 0x0e04, 0x6c67, 0x2069, 0x0000, 0x6837, 0x8040, 0x6833, -+ 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, -+ 0xd084, 0x190c, 0x11be, 0x2069, 0x19d4, 0x683f, 0xffff, 0x012e, -+ 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x6d31, 0x701c, 0x904d, -+ 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, 0x15c9, 0xd09c, -+ 0x1500, 0x2071, 0x1906, 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, 0x1054, 0x0005, 0x012e, 0x0005, -+ 0x2091, 0x8000, 0x0e04, 0x6cb2, 0x0006, 0x0016, 0x2001, 0x8004, -+ 0x0006, 0x0804, 0x0d6e, 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, 0x11be, 0x2009, -+ 0x1919, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, 0x782c, 0x9094, -+ 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1919, 0x2104, 0x8000, -+ 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, 0x1800, 0x7824, -+ 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x182f, -+ 0x210c, 0x918a, 0x0040, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, -+ 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, -+ 0x2900, 0x702e, 0x70bc, 0x8000, 0x70be, 0x080c, 0x8074, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x6cb0, 0xd0a4, 0x19c8, 0x7838, 0x7938, -+ 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, -+ 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, -+ 0x11be, 0x2009, 0x1919, 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, 0x11be, 0x00fe, 0x0005, 0x782c, 0x9094, -+ 0x0780, 0x190c, 0x6cb0, 0xd0a4, 0x0db8, 0x00e6, 0x2071, 0x1800, -+ 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, 0x70bc, 0x8000, -+ 0x70be, 0x080c, 0x8074, 0x782c, 0x9094, 0x0780, 0x190c, 0x6cb0, -+ 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, 0x2069, 0x191a, -+ 0x6808, 0x690a, 0x2069, 0x19d4, 0x9102, 0x1118, 0x683c, 0x9005, -+ 0x1328, 0x2001, 0x191b, 0x200c, 0x810d, 0x693e, 0x00de, 0x00ee, -+ 0x00fe, 0x0005, 0x7094, 0x908a, 0x0029, 0x1a0c, 0x0d65, 0x9082, -+ 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c, 0x286d, 0x002e, -+ 0x0005, 0x6e5d, 0x6de3, 0x6dff, 0x6e29, 0x6e4c, 0x6e8c, 0x6e9e, -+ 0x6dff, 0x6e74, 0x6d9e, 0x6dcc, 0x6d9d, 0x0005, 0x00d6, 0x2069, -+ 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, 0x1518, 0x7097, -+ 0x0028, 0x2069, 0x1960, 0x2d04, 0x7002, 0x080c, 0x71f8, 0x6028, -+ 0x9085, 0x0600, 0x602a, 0x00b0, 0x7097, 0x0028, 0x2069, 0x1960, -+ 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, 0x00e6, 0x0036, -+ 0x0046, 0x0056, 0x2071, 0x1a3c, 0x080c, 0x195f, 0x005e, 0x004e, -+ 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, 0x0200, 0x6804, -+ 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x7097, 0x0028, 0x2069, -+ 0x1960, 0x2d04, 0x7002, 0x080c, 0x729a, 0x6028, 0x9085, 0x0600, -+ 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, 0x080c, 0x2833, -+ 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x6f0f, 0xd1d4, 0x1160, -+ 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x7097, 0x0020, 0x080c, 0x6f0f, -+ 0x0028, 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, 0x2001, -+ 0x0088, 0x080c, 0x2833, 0x6124, 0xd1cc, 0x11e8, 0xd1dc, 0x11c0, -+ 0xd1e4, 0x1198, 0x9184, 0x1e00, 0x11d8, 0x080c, 0x1989, 0x60e3, -+ 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x70e3, 0x2001, 0x0080, -+ 0x080c, 0x2833, 0x7097, 0x0028, 0x0058, 0x7097, 0x001e, 0x0040, -+ 0x7097, 0x001d, 0x0028, 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, -+ 0x0005, 0x080c, 0x1989, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, -+ 0x080c, 0x70e3, 0x2001, 0x0080, 0x080c, 0x2833, 0x6124, 0xd1d4, -+ 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, 0x1e00, 0x1158, -+ 0x7097, 0x0028, 0x0040, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, -+ 0x0010, 0x7097, 0x001f, 0x0005, 0x2001, 0x00a0, 0x080c, 0x2833, -+ 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, 0x1989, 0x7097, -+ 0x001e, 0x0010, 0x7097, 0x001d, 0x0005, 0x080c, 0x6f98, 0x6124, -+ 0xd1dc, 0x1188, 0x080c, 0x6f0f, 0x0016, 0x080c, 0x1989, 0x001e, -+ 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x7097, 0x001e, 0x0020, 0x7097, -+ 0x001f, 0x080c, 0x6f0f, 0x0005, 0x0006, 0x2001, 0x00a0, 0x080c, -+ 0x2833, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, 0x1150, 0xd1dc, -+ 0x1128, 0xd1e4, 0x0140, 0x7097, 0x001e, 0x0028, 0x7097, 0x001d, -+ 0x0010, 0x7097, 0x0021, 0x0005, 0x080c, 0x6f98, 0x6124, 0xd1d4, -+ 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x7097, 0x001e, 0x0028, -+ 0x7097, 0x001d, 0x0010, 0x7097, 0x001f, 0x0005, 0x0006, 0x2001, -+ 0x0090, 0x080c, 0x2833, 0x000e, 0x6124, 0xd1d4, 0x1178, 0xd1cc, -+ 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x7097, 0x001e, 0x0040, -+ 0x7097, 0x001d, 0x0028, 0x7097, 0x0020, 0x0010, 0x7097, 0x001f, -+ 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, 0x2061, 0x0100, -+ 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x080c, 0x70b7, -+ 0x11f8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01d0, 0xc1b4, 0x2102, -+ 0x0026, 0x2011, 0x0200, 0x080c, 0x286d, 0x002e, 0x080c, 0x2819, -+ 0x6024, 0xd0cc, 0x0148, 0x2001, 0x00a0, 0x080c, 0x2833, 0x080c, -+ 0x73b7, 0x080c, 0x5cdc, 0x0428, 0x6028, 0xc0cd, 0x602a, 0x0408, -+ 0x080c, 0x70d1, 0x0150, 0x080c, 0x70c8, 0x1138, 0x2001, 0x0001, -+ 0x080c, 0x23c9, 0x080c, 0x708b, 0x00a0, 0x080c, 0x6f95, 0x0178, -+ 0x2001, 0x0001, 0x080c, 0x23c9, 0x7094, 0x9086, 0x001e, 0x0120, -+ 0x7094, 0x9086, 0x0022, 0x1118, 0x7097, 0x0025, 0x0010, 0x7097, -+ 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, 0x0005, 0x0026, -+ 0x2011, 0x6f20, 0x080c, 0x825f, 0x002e, 0x0016, 0x0026, 0x2009, -+ 0x0064, 0x2011, 0x6f20, 0x080c, 0x8256, 0x002e, 0x001e, 0x0005, -+ 0x00e6, 0x00f6, 0x0016, 0x080c, 0x8fb7, 0x2071, 0x1800, 0x080c, -+ 0x6eb9, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, 0x0026, 0x0036, -+ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, 0x8fb7, 0x2061, -+ 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, 0x6028, -+ 0xc09c, 0x602a, 0x080c, 0x98c8, 0x2011, 0x0003, 0x080c, 0x9339, -+ 0x2011, 0x0002, 0x080c, 0x9343, 0x080c, 0x9206, 0x080c, 0x820b, -+ 0x0036, 0x901e, 0x080c, 0x9286, 0x003e, 0x080c, 0x98e4, 0x60e3, -+ 0x0000, 0x080c, 0xd5fb, 0x080c, 0xd616, 0x2009, 0x0004, 0x080c, -+ 0x281f, 0x080c, 0x273f, 0x2001, 0x1800, 0x2003, 0x0004, 0x2011, -+ 0x0008, 0x080c, 0x286d, 0x2011, 0x6f20, 0x080c, 0x825f, 0x080c, -+ 0x70d1, 0x0118, 0x9006, 0x080c, 0x2833, 0x080c, 0x0bab, 0x2001, -+ 0x0001, 0x080c, 0x23c9, 0x012e, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, 0x2011, 0x6f2d, -+ 0x2071, 0x19d4, 0x701c, 0x9206, 0x1118, 0x7018, 0x9005, 0x0110, -+ 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, 0xd09c, 0x0005, -+ 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x01b8, 0x2001, 0x00c0, -+ 0x080c, 0x2833, 0x0156, 0x20a9, 0x002d, 0x1d04, 0x6fa5, 0x2091, -+ 0x6000, 0x1f04, 0x6fa5, 0x015e, 0x00d6, 0x2069, 0x1800, 0x6898, -+ 0x8001, 0x0220, 0x0118, 0x689a, 0x00de, 0x0005, 0x689b, 0x0014, -+ 0x68e8, 0xd0dc, 0x0dc8, 0x6800, 0x9086, 0x0001, 0x1da8, 0x080c, -+ 0x826b, 0x0c90, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x2071, 0x1800, 0x080c, 0x73c6, 0x2001, 0x193e, 0x2003, -+ 0x0000, 0x9006, 0x7096, 0x60e2, 0x6886, 0x080c, 0x2498, 0x9006, -+ 0x080c, 0x2833, 0x080c, 0x5b97, 0x0026, 0x2011, 0xffff, 0x080c, -+ 0x286d, 0x002e, 0x602b, 0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, -+ 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, -+ 0x1800, 0x2001, 0x194e, 0x200c, 0x9186, 0x0000, 0x0158, 0x9186, -+ 0x0001, 0x0158, 0x9186, 0x0002, 0x0158, 0x9186, 0x0003, 0x0158, -+ 0x0804, 0x707b, 0x7097, 0x0022, 0x0040, 0x7097, 0x0021, 0x0028, -+ 0x7097, 0x0023, 0x0010, 0x7097, 0x0024, 0x60e3, 0x0000, 0x6887, -+ 0x0001, 0x2001, 0x0001, 0x080c, 0x2498, 0x080c, 0x98c8, 0x0026, -+ 0x080c, 0x9b6d, 0x002e, 0x080c, 0x98e4, 0x7000, 0x908e, 0x0004, -+ 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, 0x0156, 0x0126, -+ 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, 0x0150, 0x012e, -+ 0x015e, 0x080c, 0xbf61, 0x0118, 0x9006, 0x080c, 0x285d, 0x0804, -+ 0x7087, 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, 0x080c, 0x2819, -+ 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, 0x2833, 0x1f04, -+ 0x702c, 0x080c, 0x710e, 0x012e, 0x015e, 0x080c, 0x70c8, 0x0170, -+ 0x6044, 0x9005, 0x0130, 0x080c, 0x710e, 0x9006, 0x8001, 0x1df0, -+ 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x710e, 0x080c, 0xbf61, -+ 0x0118, 0x9006, 0x080c, 0x285d, 0x0016, 0x0026, 0x7000, 0x908e, -+ 0x0004, 0x0130, 0x2009, 0x00c8, 0x2011, 0x6f2d, 0x080c, 0x821d, -+ 0x002e, 0x001e, 0x080c, 0x806b, 0x7034, 0xc085, 0x7036, 0x2001, -+ 0x194e, 0x2003, 0x0004, 0x080c, 0x6d82, 0x080c, 0x70c8, 0x0138, -+ 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, 0x73bc, 0x00ee, -+ 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, -+ 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x8082, 0x080c, 0x8074, -+ 0x080c, 0x73c6, 0x2001, 0x193e, 0x2003, 0x0000, 0x9006, 0x7096, -+ 0x60e2, 0x6886, 0x080c, 0x2498, 0x9006, 0x080c, 0x2833, 0x6043, -+ 0x0090, 0x6043, 0x0010, 0x0026, 0x2011, 0xffff, 0x080c, 0x286d, -+ 0x002e, 0x602b, 0x182c, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x0006, -+ 0x2001, 0x194d, 0x2004, 0x9086, 0xaaaa, 0x000e, 0x0005, 0x0006, -+ 0x080c, 0x5391, 0x9084, 0x0030, 0x9086, 0x0000, 0x000e, 0x0005, -+ 0x0006, 0x080c, 0x5391, 0x9084, 0x0030, 0x9086, 0x0030, 0x000e, -+ 0x0005, 0x0006, 0x080c, 0x5391, 0x9084, 0x0030, 0x9086, 0x0010, -+ 0x000e, 0x0005, 0x0006, 0x080c, 0x5391, 0x9084, 0x0030, 0x9086, -+ 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, 0x180c, 0x2004, -+ 0x908c, 0x0013, 0x0180, 0x0020, 0x080c, 0x24b8, 0x900e, 0x0028, -+ 0x080c, 0x665f, 0x1dc8, 0x2009, 0x0002, 0x2019, 0x0028, 0x080c, -+ 0x2fc5, 0x9006, 0x0019, 0x001e, 0x003e, 0x0005, 0x00e6, 0x2071, -+ 0x180c, 0x2e04, 0x0130, 0x080c, 0xbf5a, 0x1128, 0x9085, 0x0010, -+ 0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005, 0x6050, 0x0006, -+ 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, 0x6028, 0x0006, -+ 0x602f, 0x0100, 0x602f, 0x0000, 0x602f, 0x0040, 0x602f, 0x0000, -+ 0x20a9, 0x0002, 0x080c, 0x27fa, 0x0026, 0x2011, 0x0040, 0x080c, -+ 0x286d, 0x002e, 0x000e, 0x602a, 0x000e, 0x6006, 0x000e, 0x600e, -+ 0x000e, 0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, -+ 0x080c, 0x2498, 0x2001, 0x00a0, 0x0006, 0x080c, 0xbf61, 0x000e, -+ 0x0130, 0x080c, 0x2851, 0x9006, 0x080c, 0x285d, 0x0010, 0x080c, -+ 0x2833, 0x000e, 0x6052, 0x6050, 0x0006, 0xc0e5, 0x6052, 0x00f6, -+ 0x2079, 0x0100, 0x080c, 0x27aa, 0x00fe, 0x000e, 0x6052, 0x0005, -+ 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, -+ 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x9926, 0x0158, -+ 0x2001, 0x0386, 0x2004, 0xd0b4, 0x1130, 0x2001, 0x0016, 0x080c, -+ 0x98b9, 0x0804, 0x71ea, 0x2001, 0x180c, 0x200c, 0xc1c4, 0x2102, -+ 0x6028, 0x9084, 0xe1ff, 0x602a, 0x2011, 0x0200, 0x080c, 0x286d, -+ 0x2001, 0x0090, 0x080c, 0x2833, 0x20a9, 0x0366, 0x6024, 0xd0cc, -+ 0x1558, 0x1d04, 0x7186, 0x2091, 0x6000, 0x1f04, 0x7186, 0x080c, -+ 0x98c8, 0x2011, 0x0003, 0x080c, 0x9339, 0x2011, 0x0002, 0x080c, -+ 0x9343, 0x080c, 0x9206, 0x901e, 0x080c, 0x9286, 0x2001, 0x0386, -+ 0x2003, 0x7000, 0x080c, 0x98e4, 0x2001, 0x00a0, 0x080c, 0x2833, -+ 0x080c, 0x73b7, 0x080c, 0x5cdc, 0x080c, 0xbf61, 0x0110, 0x080c, -+ 0x0cd1, 0x9085, 0x0001, 0x04e0, 0x2001, 0x0386, 0x2004, 0xd0ac, -+ 0x0110, 0x080c, 0x1989, 0x60e3, 0x0000, 0x2001, 0x0002, 0x080c, -+ 0x2498, 0x60e2, 0x2001, 0x0080, 0x080c, 0x2833, 0x20a9, 0x0366, -+ 0x2011, 0x1e00, 0x080c, 0x286d, 0x2009, 0x1e00, 0x080c, 0x2819, -+ 0x6024, 0x910c, 0x0140, 0x1d04, 0x71c8, 0x2091, 0x6000, 0x1f04, -+ 0x71c8, 0x0804, 0x718f, 0x2001, 0x0386, 0x2003, 0x7000, 0x6028, -+ 0x9085, 0x1e00, 0x602a, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, -+ 0x0008, 0x6886, 0x080c, 0xbf61, 0x0110, 0x080c, 0x0cd1, 0x9006, -+ 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, -+ 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, -+ 0x0100, 0x2071, 0x1800, 0x7000, 0x9086, 0x0003, 0x1168, 0x2001, -+ 0x020b, 0x2004, 0x9084, 0x5540, 0x9086, 0x5540, 0x1128, 0x2069, -+ 0x1a47, 0x2d04, 0x8000, 0x206a, 0x2069, 0x0140, 0x6020, 0x9084, -+ 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, 0x7261, 0x2001, 0x0088, -+ 0x080c, 0x2833, 0x9006, 0x60e2, 0x6886, 0x080c, 0x2498, 0x2069, -+ 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x01d0, 0x6028, -+ 0x9084, 0xfbff, 0x602a, 0x2011, 0x0400, 0x080c, 0x286d, 0x2069, -+ 0x1960, 0x7000, 0x206a, 0x7097, 0x0026, 0x7003, 0x0001, 0x20a9, -+ 0x0002, 0x1d04, 0x7241, 0x2091, 0x6000, 0x1f04, 0x7241, 0x0804, -+ 0x7292, 0x2069, 0x0140, 0x20a9, 0x0384, 0x2011, 0x1e00, 0x080c, -+ 0x286d, 0x2009, 0x1e00, 0x080c, 0x2819, 0x6024, 0x910c, 0x0528, -+ 0x9084, 0x1a00, 0x1510, 0x1d04, 0x724d, 0x2091, 0x6000, 0x1f04, -+ 0x724d, 0x080c, 0x98c8, 0x2011, 0x0003, 0x080c, 0x9339, 0x2011, -+ 0x0002, 0x080c, 0x9343, 0x080c, 0x9206, 0x901e, 0x080c, 0x9286, -+ 0x080c, 0x98e4, 0x2001, 0x00a0, 0x080c, 0x2833, 0x080c, 0x73b7, -+ 0x080c, 0x5cdc, 0x9085, 0x0001, 0x00a8, 0x2001, 0x0080, 0x080c, -+ 0x2833, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, -+ 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x0002, 0x080c, 0x2498, -+ 0x60e2, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, -+ 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x6020, 0x9084, 0x00c0, -+ 0x01e8, 0x080c, 0x98c8, 0x2011, 0x0003, 0x080c, 0x9339, 0x2011, -+ 0x0002, 0x080c, 0x9343, 0x080c, 0x9206, 0x901e, 0x080c, 0x9286, -+ 0x080c, 0x98e4, 0x2069, 0x0140, 0x2001, 0x00a0, 0x080c, 0x2833, -+ 0x080c, 0x73b7, 0x080c, 0x5cdc, 0x0804, 0x7334, 0x2001, 0x180c, -+ 0x200c, 0xd1b4, 0x1160, 0xc1b5, 0x2102, 0x080c, 0x6f15, 0x2069, -+ 0x0140, 0x2001, 0x0080, 0x080c, 0x2833, 0x60e3, 0x0000, 0x2069, -+ 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, 0x9005, 0x0190, 0x6028, -+ 0x9084, 0xfdff, 0x602a, 0x2011, 0x0200, 0x080c, 0x286d, 0x2069, -+ 0x1960, 0x7000, 0x206a, 0x7097, 0x0027, 0x7003, 0x0001, 0x0804, -+ 0x7334, 0x2011, 0x1e00, 0x080c, 0x286d, 0x2009, 0x1e00, 0x080c, -+ 0x2819, 0x6024, 0x910c, 0x01c8, 0x9084, 0x1c00, 0x11b0, 0x1d04, -+ 0x72f1, 0x0006, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x080c, 0x80b3, -+ 0x00ee, 0x00de, 0x00ce, 0x001e, 0x000e, 0x00e6, 0x2071, 0x19d4, -+ 0x7018, 0x00ee, 0x9005, 0x19e8, 0x01f8, 0x0026, 0x2011, 0x6f2d, -+ 0x080c, 0x8159, 0x2011, 0x6f20, 0x080c, 0x825f, 0x002e, 0x2069, -+ 0x0140, 0x60e3, 0x0000, 0x70b0, 0x9005, 0x1118, 0x6887, 0x0001, -+ 0x0008, 0x6886, 0x2001, 0x0002, 0x080c, 0x2498, 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, -+ 0xbf5a, 0x1904, 0x73a1, 0x7130, 0xd184, 0x1170, 0x080c, 0x3186, -+ 0x0138, 0xc18d, 0x7132, 0x2011, 0x1854, 0x2214, 0xd2ac, 0x1120, -+ 0x7030, 0xd08c, 0x0904, 0x73a1, 0x2011, 0x1854, 0x220c, 0x0438, -+ 0x0016, 0x2019, 0x000e, 0x080c, 0xd1eb, 0x0156, 0x00b6, 0x20a9, -+ 0x007f, 0x900e, 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, -+ 0x080c, 0x6270, 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, -+ 0x080c, 0xd273, 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x83eb, -+ 0x001e, 0x8108, 0x1f04, 0x736a, 0x00be, 0x015e, 0x001e, 0xd1ac, -+ 0x1148, 0x0016, 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x2fc5, -+ 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, -+ 0x6270, 0x1110, 0x080c, 0x5cf6, 0x8108, 0x1f04, 0x7397, 0x00be, -+ 0x015e, 0x080c, 0x1989, 0x080c, 0x98c8, 0x080c, 0x9b6d, 0x080c, -+ 0x98e4, 0x60e3, 0x0000, 0x080c, 0x5cdc, 0x080c, 0x6fe8, 0x00ee, -+ 0x00ce, 0x004e, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, -+ 0x194e, 0x2003, 0x0001, 0x0005, 0x2001, 0x194e, 0x2003, 0x0000, -+ 0x0005, 0x2001, 0x194d, 0x2003, 0xaaaa, 0x0005, 0x2001, 0x194d, -+ 0x2003, 0x0000, 0x0005, 0x2071, 0x18f0, 0x7003, 0x0000, 0x7007, -+ 0x0000, 0x080c, 0x103b, 0x090c, 0x0d65, 0xa8ab, 0xdcb0, 0x2900, -+ 0x704e, 0x080c, 0x103b, 0x090c, 0x0d65, 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, -+ 0x18f0, 0x6807, 0x0001, 0x00de, 0x080c, 0x79c3, 0x9006, 0x00ee, -+ 0x0005, 0x900e, 0x0156, 0x20a9, 0x0006, 0x8003, 0x818d, 0x1f04, -+ 0x742d, 0x015e, 0x0005, 0x2079, 0x0040, 0x2071, 0x18f0, 0x7004, -+ 0x0002, 0x7443, 0x7444, 0x748f, 0x74ea, 0x762b, 0x7441, 0x7441, -+ 0x7655, 0x080c, 0x0d65, 0x0005, 0x2079, 0x0040, 0x2001, 0x1dc0, -+ 0x2003, 0x0000, 0x782c, 0x908c, 0x0780, 0x190c, 0x7a4f, 0xd0a4, -+ 0x0570, 0x2001, 0x1dc0, 0x2004, 0x9082, 0x0080, 0x1640, 0x1d04, -+ 0x7461, 0x2001, 0x19d7, 0x200c, 0x8109, 0x0508, 0x2091, 0x6000, -+ 0x2102, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, -+ 0x00ff, 0x908a, 0x0040, 0x0608, 0x00b8, 0x2001, 0x1800, 0x200c, -+ 0x9186, 0x0003, 0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, -+ 0x0007, 0x0128, 0x9186, 0x0003, 0x1968, 0x080c, 0x74ea, 0x782c, -+ 0xd09c, 0x090c, 0x79c3, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, -+ 0x003b, 0x0c18, 0x080c, 0x7520, 0x0c90, 0x00e3, 0x08f0, 0x0005, -+ 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, -+ 0x7542, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, -+ 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, -+ 0x7520, 0x7520, 0x7520, 0x7520, 0x752c, 0x7520, 0x772a, 0x7520, -+ 0x7520, 0x7520, 0x7542, 0x7520, 0x752c, 0x776b, 0x77ac, 0x77f3, -+ 0x7807, 0x7520, 0x7520, 0x7542, 0x752c, 0x7520, 0x7520, 0x75ff, -+ 0x78b2, 0x78cd, 0x7520, 0x7542, 0x7520, 0x7520, 0x7520, 0x7520, -+ 0x75f5, 0x78cd, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, -+ 0x7520, 0x7520, 0x7520, 0x7556, 0x7520, 0x7520, 0x7520, 0x7520, -+ 0x7520, 0x7520, 0x7520, 0x7520, 0x7520, 0x79f3, 0x7520, 0x7520, -+ 0x7520, 0x7520, 0x7520, 0x756a, 0x7520, 0x7520, 0x7520, 0x7520, -+ 0x7520, 0x7520, 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, -+ 0x782c, 0x080c, 0x79ec, 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, -+ 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, -+ 0x002b, 0x0c50, 0x00e9, 0x080c, 0x79c3, 0x0005, 0x7520, 0x752c, -+ 0x7716, 0x7520, 0x752c, 0x7520, 0x752c, 0x752c, 0x7520, 0x752c, -+ 0x7716, 0x752c, 0x752c, 0x752c, 0x752c, 0x752c, 0x7520, 0x752c, -+ 0x7716, 0x7520, 0x7520, 0x752c, 0x7520, 0x7520, 0x7520, 0x752c, -+ 0x00e6, 0x2071, 0x18f0, 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, 0x6996, -+ 0x012e, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, -+ 0x1120, 0x7007, 0x0001, 0x0804, 0x76d4, 0x7007, 0x0003, 0x7012, -+ 0x2900, 0x7016, 0x701a, 0x704b, 0x76d4, 0x0005, 0xa864, 0x8007, -+ 0x9084, 0x00ff, 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, -+ 0x76ef, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, -+ 0x76ef, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, 0x9086, 0x0001, -+ 0x1904, 0x7528, 0x7007, 0x0001, 0x2009, 0x1833, 0x210c, 0x81ff, -+ 0x1904, 0x75cc, 0xa994, 0x9186, 0x006f, 0x0188, 0x9186, 0x0074, -+ 0x15b0, 0x0026, 0x2011, 0x0010, 0x080c, 0x668b, 0x002e, 0x0578, -+ 0x0016, 0xa998, 0x080c, 0x66d5, 0x001e, 0x1548, 0x0400, 0x080c, -+ 0x70b7, 0x0140, 0xa897, 0x4005, 0xa89b, 0x0016, 0x2001, 0x0030, -+ 0x900e, 0x0438, 0x0026, 0x2011, 0x8008, 0x080c, 0x668b, 0x002e, -+ 0x01b0, 0x0016, 0x0026, 0x0036, 0xa998, 0xaaa0, 0xab9c, 0x918d, -+ 0x8000, 0x080c, 0x66d5, 0x003e, 0x002e, 0x001e, 0x1140, 0xa897, -+ 0x4005, 0xa89b, 0x4009, 0x2001, 0x0030, 0x900e, 0x0050, 0xa868, -+ 0x9084, 0x00ff, 0xa86a, 0xa883, 0x0000, 0x080c, 0x5f07, 0x1108, -+ 0x0005, 0x0126, 0x2091, 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, -+ 0x080c, 0x6996, 0x012e, 0x0ca0, 0xa994, 0x9186, 0x0071, 0x0904, -+ 0x757a, 0x9186, 0x0064, 0x0904, 0x757a, 0x9186, 0x007c, 0x0904, -+ 0x757a, 0x9186, 0x0028, 0x0904, 0x757a, 0x9186, 0x0038, 0x0904, -+ 0x757a, 0x9186, 0x0078, 0x0904, 0x757a, 0x9186, 0x005f, 0x0904, -+ 0x757a, 0x9186, 0x0056, 0x0904, 0x757a, 0xa897, 0x4005, 0xa89b, -+ 0x0001, 0x2001, 0x0030, 0x900e, 0x0860, 0xa87c, 0x9084, 0x00c0, -+ 0x9086, 0x00c0, 0x1120, 0x7007, 0x0001, 0x0804, 0x78e4, 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, -+ 0x7530, 0xaab4, 0x928a, 0x0002, 0x1a04, 0x7530, 0x82ff, 0x1138, -+ 0xa8b8, 0xa9bc, 0x9105, 0x0118, 0x2001, 0x7692, 0x0018, 0x9280, -+ 0x7688, 0x2005, 0x7056, 0x7010, 0x9015, 0x0904, 0x7673, 0x080c, -+ 0x103b, 0x1118, 0x7007, 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, -+ 0x2060, 0xe000, 0xa866, 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, -+ 0xa076, 0xa860, 0xa072, 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, -+ 0x7112, 0xe20c, 0x8003, 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, -+ 0xa17a, 0x810b, 0xa17e, 0x080c, 0x110c, 0xa06c, 0x908e, 0x0100, -+ 0x0170, 0x9086, 0x0200, 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, -+ 0x2048, 0x080c, 0x1054, 0x7014, 0x2048, 0x0804, 0x7530, 0x7020, -+ 0x2048, 0x7018, 0xa802, 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, -+ 0x711a, 0x0804, 0x762b, 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, -+ 0x9005, 0x1128, 0xa8b8, 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, -+ 0x9084, 0x00ff, 0x9086, 0x001e, 0x0904, 0x78e4, 0x0804, 0x76d4, -+ 0x768a, 0x768e, 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, 0x5d56, 0x1108, 0x0005, 0x080c, 0x6bb3, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0xbb45, 0x080c, 0x6996, 0x012e, 0x0ca0, -+ 0x080c, 0xbf5a, 0x1d70, 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, -+ 0x1833, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, 0xa883, -+ 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x5e69, 0x1138, 0x0005, -+ 0x9006, 0xa87a, 0x080c, 0x5de4, 0x1108, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0xa87a, 0xa982, 0x080c, 0x6996, 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, 0x6270, 0x11b8, 0x0066, 0xae80, 0x080c, -+ 0x6380, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, 0xc484, -+ 0x2412, 0x004e, 0x00c6, 0x080c, 0x6270, 0x1110, 0x080c, 0x654f, -+ 0x8108, 0x1f04, 0x7753, 0x00ce, 0xa87c, 0xd084, 0x1120, 0x080c, -+ 0x1054, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, 0x6996, -+ 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, -+ 0x080c, 0x6663, 0x0580, 0x2061, 0x1a3f, 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, 0x79ad, 0x012e, 0x0804, 0x79a7, 0x012e, 0x0804, -+ 0x79a1, 0x012e, 0x0804, 0x79a4, 0x0126, 0x2091, 0x8000, 0x7007, -+ 0x0001, 0x080c, 0x6663, 0x05e0, 0x2061, 0x1a3f, 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, 0x79ad, 0x012e, 0x0804, 0x79aa, -+ 0x012e, 0x0804, 0x79a7, 0x0126, 0x2091, 0x8000, 0x7007, 0x0001, -+ 0x2061, 0x1a3f, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, 0x0220, -+ 0x630a, 0x012e, 0x0804, 0x79bb, 0x012e, 0x0804, 0x79aa, 0x00b6, -+ 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, 0xd0ac, -+ 0x0148, 0x00c6, 0x2061, 0x1a3f, 0x6000, 0x9084, 0xfcff, 0x6002, -+ 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, 0x0598, -+ 0x2001, 0x1833, 0x2004, 0x9005, 0x0118, 0x080c, 0x9c21, 0x0068, -+ 0x6017, 0xf400, 0x6063, 0x0000, 0xa97c, 0xd1a4, 0x0110, 0xa980, -+ 0x6162, 0x2009, 0x0041, 0x080c, 0x9c85, 0xa988, 0x918c, 0xff00, -+ 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, 0x080c, -+ 0x83eb, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a3f, 0x6000, -+ 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, 0x012e, -+ 0x00be, 0x0804, 0x79ad, 0x00ce, 0x012e, 0x00be, 0x0804, 0x79a7, -+ 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, 0x6270, 0x1968, 0xb800, 0xc0e4, 0xb802, -+ 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, 0x1957, -+ 0x2004, 0x601a, 0x0804, 0x7842, 0xa88c, 0x9065, 0x0960, 0x00e6, -+ 0xa890, 0x9075, 0x2001, 0x1833, 0x2004, 0x9005, 0x0150, 0x080c, -+ 0x9c21, 0x8eff, 0x0118, 0x2e60, 0x080c, 0x9c21, 0x00ee, 0x0804, -+ 0x7842, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, 0x003a, -+ 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, 0xa8a8, -+ 0x6016, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x84d1, 0x00ee, -+ 0x0804, 0x7842, 0x2061, 0x1a3f, 0x6000, 0xd084, 0x0190, 0xd08c, -+ 0x1904, 0x79bb, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, 0x0220, -+ 0x6206, 0x012e, 0x0804, 0x79bb, 0x012e, 0xa883, 0x0016, 0x0804, -+ 0x79b4, 0xa883, 0x0007, 0x0804, 0x79b4, 0xa864, 0x8007, 0x9084, -+ 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, 0x0005, -+ 0x080c, 0x7528, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, -+ 0x701a, 0x704b, 0x78e4, 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, -+ 0x8000, 0x903e, 0x2061, 0x1800, 0x61cc, 0x81ff, 0x1904, 0x7966, -+ 0x6130, 0xd194, 0x1904, 0x7990, 0xa878, 0x2070, 0x9e82, 0x1ddc, -+ 0x0a04, 0x795a, 0x6064, 0x9e02, 0x1a04, 0x795a, 0x7120, 0x9186, -+ 0x0006, 0x1904, 0x794c, 0x7010, 0x905d, 0x0904, 0x7966, 0xb800, -+ 0xd0e4, 0x1904, 0x798a, 0x2061, 0x1a3f, 0x6100, 0x9184, 0x0301, -+ 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7993, 0xa883, -+ 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, 0x7116, -+ 0xa87c, 0xd0f4, 0x1904, 0x7996, 0x080c, 0x538d, 0xd09c, 0x1118, -+ 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x82de, 0x012e, 0x00ee, -+ 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, 0x2148, -+ 0xa87c, 0xd0f4, 0x1904, 0x7996, 0x012e, 0x00ee, 0x00be, 0x0005, -+ 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x79b4, 0xd184, -+ 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x6270, 0x15d0, -+ 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, 0xa883, -+ 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, 0x0460, -+ 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, 0x5391, -+ 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1ddc, 0x02c0, 0x6064, -+ 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, 0x905d, -+ 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, 0x9086, -+ 0x0007, 0x1904, 0x78f0, 0x7003, 0x0002, 0x0804, 0x78f0, 0xa883, -+ 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, 0x0420, -+ 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, 0x2019, -+ 0x0002, 0x601b, 0x0014, 0x080c, 0xcdf9, 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, -+ 0x6996, 0x012e, 0x0005, 0x080c, 0x1054, 0x0005, 0x00d6, 0x080c, -+ 0x82d5, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, 0x8000, -+ 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, 0x190c, -+ 0x7a4f, 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, -+ 0x7a4f, 0x000e, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, -+ 0x00b6, 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x7a40, -+ 0xa97c, 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, -+ 0x05e8, 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, -+ 0x2b10, 0x080c, 0x9b91, 0x1118, 0x080c, 0x9c58, 0x05a8, 0x6212, -+ 0xa874, 0x0002, 0x7a1e, 0x7a23, 0x7a26, 0x7a2c, 0x2019, 0x0002, -+ 0x080c, 0xd1eb, 0x0060, 0x080c, 0xd17b, 0x0048, 0x2019, 0x0002, -+ 0xa980, 0x080c, 0xd19a, 0x0018, 0xa980, 0x080c, 0xd17b, 0x080c, -+ 0x9be7, 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x6996, -+ 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, 0x7a51, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, -+ 0x0804, 0x0d6e, 0x2001, 0x1833, 0x2004, 0x9005, 0x0005, 0x0005, -+ 0x00f6, 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, -+ 0x2102, 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, 0x152d, -+ 0x00fe, 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, -+ 0x00fe, 0x0005, 0x781c, 0xd08c, 0x0904, 0x7ad2, 0x68bc, 0x90aa, -+ 0x0005, 0x0a04, 0x806b, 0x7d44, 0x7c40, 0xd59c, 0x190c, 0x0d65, -+ 0x9584, 0x00f6, 0x1508, 0x9484, 0x7000, 0x0138, 0x908a, 0x2000, -+ 0x1258, 0x9584, 0x0700, 0x8007, 0x04f0, 0x7000, 0x9084, 0xff00, -+ 0x9086, 0x8100, 0x0db0, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, -+ 0x9084, 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xd5d3, 0x080c, -+ 0x7fb2, 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, -+ 0x800e, 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x7b22, -+ 0x080c, 0x1fb7, 0x005e, 0x004e, 0x0020, 0x080c, 0xd5d3, 0x7817, -+ 0x0140, 0x080c, 0x70b7, 0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, -+ 0x0140, 0x688f, 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, 0x2003, -+ 0x0000, 0x0489, 0x0005, 0x0002, 0x7adf, 0x7dd4, 0x7adc, 0x7adc, -+ 0x7adc, 0x7adc, 0x7adc, 0x7adc, 0x7817, 0x0140, 0x0005, 0x7000, -+ 0x908c, 0xff00, 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x688e, -+ 0x9286, 0x2000, 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, -+ 0x53ee, 0x0070, 0x080c, 0x7b42, 0x0058, 0x9286, 0x3000, 0x1118, -+ 0x080c, 0x7d11, 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x7ee8, -+ 0x7817, 0x0140, 0x0005, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, -+ 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, -+ 0x2011, 0x8048, 0x2518, 0x080c, 0x48d8, 0x003e, 0x002e, 0x0005, -+ 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, -+ 0x7c30, 0x0050, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, -+ 0x7d44, 0x7c40, 0x2019, 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, -+ 0x0160, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, -+ 0x2011, 0x8048, 0x080c, 0x48d8, 0x002e, 0x00fe, 0x005e, 0x004e, -+ 0x003e, 0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, -+ 0x9096, 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x7ce2, 0x9186, -+ 0x0023, 0x15c0, 0x080c, 0x7f7d, 0x0904, 0x7ce2, 0x6120, 0x9186, -+ 0x0001, 0x0150, 0x9186, 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, -+ 0x9186, 0x000a, 0x1904, 0x7ce2, 0x7124, 0x610a, 0x7030, 0x908e, -+ 0x0200, 0x1130, 0x2009, 0x0015, 0x080c, 0x9c85, 0x0804, 0x7ce2, -+ 0x908e, 0x0214, 0x0118, 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, -+ 0x080c, 0x9c85, 0x0804, 0x7ce2, 0x908e, 0x0100, 0x1904, 0x7ce2, -+ 0x7034, 0x9005, 0x1904, 0x7ce2, 0x2009, 0x0016, 0x080c, 0x9c85, -+ 0x0804, 0x7ce2, 0x9186, 0x0022, 0x1904, 0x7ce2, 0x7030, 0x908e, -+ 0x0300, 0x1580, 0x68d8, 0xd0a4, 0x0528, 0xc0b5, 0x68da, 0x7100, -+ 0x918c, 0x00ff, 0x697a, 0x7004, 0x687e, 0x00f6, 0x2079, 0x0100, -+ 0x79e6, 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, -+ 0x246d, 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x2424, -+ 0x695a, 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, -+ 0x70b2, 0x00ee, 0x7034, 0x9005, 0x1904, 0x7ce2, 0x2009, 0x0017, -+ 0x0804, 0x7c92, 0x908e, 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, -+ 0x7ce2, 0x080c, 0x70b7, 0x0120, 0x2009, 0x001d, 0x0804, 0x7c92, -+ 0x68d8, 0xc0a5, 0x68da, 0x2009, 0x0030, 0x0804, 0x7c92, 0x908e, -+ 0x0500, 0x1140, 0x7034, 0x9005, 0x1904, 0x7ce2, 0x2009, 0x0018, -+ 0x0804, 0x7c92, 0x908e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, -+ 0x7c92, 0x908e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x7c92, -+ 0x908e, 0x5200, 0x1140, 0x7034, 0x9005, 0x1904, 0x7ce2, 0x2009, -+ 0x001b, 0x0804, 0x7c92, 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, -+ 0x1904, 0x7ce2, 0x2009, 0x001c, 0x0804, 0x7c92, 0x908e, 0x1300, -+ 0x1120, 0x2009, 0x0034, 0x0804, 0x7c92, 0x908e, 0x1200, 0x1140, -+ 0x7034, 0x9005, 0x1904, 0x7ce2, 0x2009, 0x0024, 0x0804, 0x7c92, -+ 0x908c, 0xff00, 0x918e, 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, -+ 0x1810, 0x2004, 0xd09c, 0x0904, 0x7c92, 0x080c, 0xc62f, 0x1904, -+ 0x7ce2, 0x0804, 0x7c90, 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, -+ 0x2009, 0x002a, 0x0804, 0x7c92, 0x908e, 0x0f00, 0x1120, 0x2009, -+ 0x0020, 0x0804, 0x7c92, 0x908e, 0x6104, 0x1528, 0x2029, 0x0205, -+ 0x2011, 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, -+ 0x20a8, 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, -+ 0x48d8, 0x004e, 0x8108, 0x0f04, 0x7c5e, 0x9186, 0x0280, 0x1d88, -+ 0x2504, 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, -+ 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, 0x6838, 0xd0d4, 0x0110, -+ 0x2009, 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x2424, 0x1904, 0x7ce5, 0x080c, 0x6210, 0x1904, 0x7ce5, -+ 0xbe12, 0xbd16, 0x001e, 0x0016, 0x080c, 0x70b7, 0x01c0, 0x68d8, -+ 0xd08c, 0x1148, 0x7000, 0x9084, 0x00ff, 0x1188, 0x7004, 0x9084, -+ 0xff00, 0x1168, 0x0040, 0x6878, 0x9606, 0x1148, 0x687c, 0x9506, -+ 0x9084, 0xff00, 0x1120, 0x9584, 0x00ff, 0xb886, 0x0080, 0xb884, -+ 0x9005, 0x1168, 0x9186, 0x0046, 0x1150, 0x6878, 0x9606, 0x1138, -+ 0x687c, 0x9506, 0x9084, 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, -+ 0x9b91, 0x01a8, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, -+ 0x001e, 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, -+ 0x080c, 0x9c85, 0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, -+ 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d8, -+ 0x080c, 0x9c58, 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, 0x84d8, -+ 0x08a0, 0x080c, 0x3150, 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, -+ 0x908e, 0x0008, 0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, -+ 0x7000, 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, -+ 0x7f7d, 0x0904, 0x7d6c, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, -+ 0x1140, 0x7034, 0x9005, 0x15c0, 0x2009, 0x0015, 0x080c, 0x9c85, -+ 0x0498, 0x908e, 0x0100, 0x1580, 0x7034, 0x9005, 0x1568, 0x2009, -+ 0x0016, 0x080c, 0x9c85, 0x0440, 0x9186, 0x0032, 0x1528, 0x7030, -+ 0x908e, 0x1400, 0x1508, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, -+ 0x2204, 0x8211, 0x220c, 0x080c, 0x2424, 0x11a8, 0x080c, 0x6210, -+ 0x1190, 0xbe12, 0xbd16, 0x080c, 0x9b91, 0x0168, 0x2b08, 0x6112, -+ 0x080c, 0xbcdb, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, -+ 0x9c85, 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, 0x7dce, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, -+ 0x0804, 0x7dce, 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, 0x7da3, 0x82ff, -+ 0x1118, 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, -+ 0x00ee, 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, -+ 0x9184, 0x000f, 0x0002, 0x7deb, 0x7deb, 0x7deb, 0x7f8f, 0x7deb, -+ 0x7dee, 0x7e13, 0x7e9c, 0x7deb, 0x7deb, 0x7deb, 0x7deb, 0x7deb, -+ 0x7deb, 0x7deb, 0x7deb, 0x7817, 0x0140, 0x0005, 0x00b6, 0x7110, -+ 0xd1bc, 0x01e8, 0x7120, 0x2160, 0x9c8c, 0x0003, 0x11c0, 0x9c8a, -+ 0x1ddc, 0x02a8, 0x6864, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, -+ 0x6110, 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, -+ 0x1130, 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, 0x9c85, 0x7817, -+ 0x0140, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, 0x0fff, 0x0904, -+ 0x7e78, 0x7110, 0xd1bc, 0x1904, 0x7e78, 0x7108, 0x700c, 0x2028, -+ 0x918c, 0x00ff, 0x2130, 0x9094, 0xff00, 0x15c8, 0x81ff, 0x15b8, -+ 0x9080, 0x318b, 0x200d, 0x918c, 0xff00, 0x810f, 0x2001, 0x0080, -+ 0x9106, 0x0904, 0x7e78, 0x9182, 0x0801, 0x1a04, 0x7e78, 0x9190, -+ 0x1000, 0x2204, 0x905d, 0x05e0, 0xbe12, 0xbd16, 0xb800, 0xd0ec, -+ 0x15b8, 0xba04, 0x9294, 0xff00, 0x9286, 0x0600, 0x1190, 0x080c, -+ 0x9b91, 0x0598, 0x2b08, 0x7028, 0x6052, 0x702c, 0x604e, 0x6112, -+ 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, 0x080c, 0xc893, -+ 0x00f8, 0x080c, 0x6667, 0x1138, 0xb807, 0x0606, 0x0c40, 0x190c, -+ 0x7d70, 0x11b0, 0x0880, 0x080c, 0x9b91, 0x2b08, 0x0188, 0x6112, -+ 0x6023, 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, -+ 0x0005, 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x84d8, -+ 0x7817, 0x0140, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, -+ 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d8, 0x080c, 0x9c58, -+ 0x0d78, 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, -+ 0x615e, 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, -+ 0xa022, 0x080c, 0x84d1, 0x08e0, 0x00b6, 0x7110, 0xd1bc, 0x05d0, -+ 0x7020, 0x2060, 0x9c84, 0x0003, 0x15a8, 0x9c82, 0x1ddc, 0x0690, -+ 0x6864, 0x9c02, 0x1678, 0x9484, 0x0fff, 0x9082, 0x000c, 0x0650, -+ 0x7008, 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1510, -+ 0x700c, 0xb914, 0x9106, 0x11f0, 0x7124, 0x610a, 0x601c, 0xd0fc, -+ 0x11c8, 0x2001, 0x0271, 0x2004, 0x9005, 0x1180, 0x9484, 0x0fff, -+ 0x9082, 0x000c, 0x0158, 0x0066, 0x2031, 0x0100, 0xa001, 0xa001, -+ 0x8631, 0x1de0, 0x006e, 0x601c, 0xd0fc, 0x1120, 0x2009, 0x0045, -+ 0x080c, 0x9c85, 0x7817, 0x0140, 0x00be, 0x0005, 0x6120, 0x9186, -+ 0x0002, 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, -+ 0x080c, 0x3150, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, -+ 0x0000, 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, -+ 0x0005, 0x7eff, 0x7f00, 0x7eff, 0x7eff, 0x7f5f, 0x7f6e, 0x0005, -+ 0x00b6, 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x7f5d, -+ 0x700c, 0x7108, 0x080c, 0x2424, 0x1904, 0x7f5d, 0x080c, 0x6210, -+ 0x1904, 0x7f5d, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, -+ 0x6667, 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x7f7d, -+ 0x00ce, 0x05d8, 0x080c, 0x9b91, 0x2b08, 0x05b8, 0x6112, 0x080c, -+ 0xbcdb, 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, -+ 0x9c85, 0x0458, 0x080c, 0x6667, 0x0148, 0x9086, 0x0004, 0x0130, -+ 0x080c, 0x666f, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0x9b91, -+ 0x2b08, 0x01d8, 0x6112, 0x080c, 0xbcdb, 0x6023, 0x0005, 0x7120, -+ 0x610a, 0x2009, 0x0088, 0x080c, 0x9c85, 0x0078, 0x080c, 0x9b91, -+ 0x2b08, 0x0158, 0x6112, 0x080c, 0xbcdb, 0x6023, 0x0004, 0x7120, -+ 0x610a, 0x2009, 0x0001, 0x080c, 0x9c85, 0x00be, 0x0005, 0x7110, -+ 0xd1bc, 0x0158, 0x00d1, 0x0148, 0x080c, 0x7ede, 0x1130, 0x7124, -+ 0x610a, 0x2009, 0x0089, 0x080c, 0x9c85, 0x0005, 0x7110, 0xd1bc, -+ 0x0158, 0x0059, 0x0148, 0x080c, 0x7ede, 0x1130, 0x7124, 0x610a, -+ 0x2009, 0x008a, 0x080c, 0x9c85, 0x0005, 0x7020, 0x2060, 0x9c84, -+ 0x0003, 0x1158, 0x9c82, 0x1ddc, 0x0240, 0x2001, 0x1819, 0x2004, -+ 0x9c02, 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, -+ 0x7110, 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0003, 0x11b0, -+ 0x9c82, 0x1ddc, 0x0298, 0x6864, 0x9c02, 0x1280, 0x7008, 0x9084, -+ 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, -+ 0x9106, 0x1120, 0x2009, 0x0051, 0x080c, 0x9c85, 0x7817, 0x0140, -+ 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, 0x05c0, 0x080c, 0x9b91, 0x05a8, 0x0066, 0x00c6, -+ 0x0046, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2424, -+ 0x1590, 0x080c, 0x6210, 0x1578, 0xbe12, 0xbd16, 0x2b00, 0x004e, -+ 0x00ce, 0x6012, 0x080c, 0xbcdb, 0x080c, 0x1022, 0x0500, 0x2900, -+ 0x6062, 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, 0x84d8, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, -+ 0x9be7, 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, -+ 0x908c, 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, -+ 0x8065, 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, -+ 0x1904, 0x8067, 0x7030, 0x908e, 0x0400, 0x0904, 0x8067, 0x908e, -+ 0x6000, 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, -+ 0x2009, 0x1836, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, -+ 0x6625, 0x0558, 0x68ac, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, -+ 0x9106, 0x1518, 0x687c, 0x69ac, 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, 0x7f7d, 0x0128, -+ 0x6004, 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, -+ 0x0001, 0x00ce, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, -+ 0xc0cc, 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834, -+ 0xd084, 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, 0x7802, -+ 0x00fe, 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, 0x7036, -+ 0x00ee, 0x0005, 0x2071, 0x19d4, 0x7003, 0x0003, 0x700f, 0x0361, -+ 0x9006, 0x701a, 0x7072, 0x7012, 0x7017, 0x1ddc, 0x7007, 0x0000, -+ 0x7026, 0x702b, 0x8fd9, 0x7032, 0x7037, 0x9056, 0x703f, 0xffff, -+ 0x7042, 0x7047, 0x5224, 0x704a, 0x705b, 0x8226, 0x080c, 0x103b, -+ 0x090c, 0x0d65, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, -+ 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x19d4, 0x1d04, 0x8148, 0x2091, -+ 0x6000, 0x700c, 0x8001, 0x700e, 0x1560, 0x2001, 0x1875, 0x2004, -+ 0xd0c4, 0x0158, 0x3a00, 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, -+ 0x0001, 0x20d1, 0x0000, 0x080c, 0x0d65, 0x700f, 0x0361, 0x7007, -+ 0x0001, 0x0126, 0x2091, 0x8000, 0x2069, 0x1800, 0x69e8, 0xd1e4, -+ 0x1138, 0xd1dc, 0x1118, 0x080c, 0x8294, 0x0010, 0x080c, 0x826b, -+ 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, 0x90de, -+ 0x0010, 0x7034, 0x080f, 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, 0x8170, 0x8171, 0x819b, 0x00e6, 0x2071, 0x19d4, -+ 0x7018, 0x9005, 0x1120, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, -+ 0x0005, 0x00e6, 0x0006, 0x2071, 0x19d4, 0x701c, 0x9206, 0x1120, -+ 0x701a, 0x701e, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, 0x00e6, -+ 0x2071, 0x19d4, 0xb888, 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, -+ 0x0005, 0x00b6, 0x2031, 0x0010, 0x7110, 0x080c, 0x6270, 0x11a8, -+ 0xb888, 0x8001, 0x0290, 0xb88a, 0x1180, 0x0126, 0x2091, 0x8000, -+ 0x0066, 0xb8c0, 0x9005, 0x0138, 0x0026, 0xba3c, 0x0016, 0x080c, -+ 0x639b, 0x001e, 0x002e, 0x006e, 0x012e, 0x8108, 0x9182, 0x0800, -+ 0x1220, 0x8631, 0x0128, 0x7112, 0x0c00, 0x900e, 0x7007, 0x0002, -+ 0x7112, 0x00be, 0x0005, 0x2031, 0x0010, 0x7014, 0x2060, 0x0126, -+ 0x2091, 0x8000, 0x6048, 0x9005, 0x0128, 0x8001, 0x604a, 0x1110, -+ 0x080c, 0xbb5c, 0x6018, 0x9005, 0x0904, 0x81ed, 0x00f6, 0x2079, -+ 0x0300, 0x7918, 0xd1b4, 0x1904, 0x8200, 0x781b, 0x2020, 0xa001, -+ 0x7918, 0xd1b4, 0x0120, 0x781b, 0x2000, 0x0804, 0x8200, 0x8001, -+ 0x601a, 0x0106, 0x781b, 0x2000, 0xa001, 0x7918, 0xd1ac, 0x1dd0, -+ 0x010e, 0x00fe, 0x1510, 0x6120, 0x9186, 0x0003, 0x0118, 0x9186, -+ 0x0006, 0x11c8, 0x080c, 0xb847, 0x01b0, 0x6014, 0x2048, 0xa884, -+ 0x908a, 0x199a, 0x0280, 0x9082, 0x1999, 0xa886, 0x908a, 0x199a, -+ 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, -+ 0x080c, 0xbf8d, 0x0110, 0x080c, 0xb545, 0x012e, 0x9c88, 0x001c, -+ 0x7116, 0x2001, 0x1819, 0x2004, 0x9102, 0x1228, 0x8631, 0x0138, -+ 0x2160, 0x0804, 0x819f, 0x7017, 0x1ddc, 0x7007, 0x0000, 0x0005, -+ 0x00fe, 0x0c58, 0x00e6, 0x2071, 0x19d4, 0x7027, 0x07d0, 0x7023, -+ 0x0009, 0x00ee, 0x0005, 0x2001, 0x19dd, 0x2003, 0x0000, 0x0005, -+ 0x00e6, 0x2071, 0x19d4, 0x7132, 0x702f, 0x0009, 0x00ee, 0x0005, -+ 0x2011, 0x19e0, 0x2013, 0x0000, 0x0005, 0x00e6, 0x2071, 0x19d4, -+ 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x0086, 0x0026, -+ 0x7054, 0x8000, 0x7056, 0x2001, 0x19e2, 0x2044, 0xa06c, 0x9086, -+ 0x0000, 0x0150, 0x7068, 0xa09a, 0x7064, 0xa096, 0x7060, 0xa092, -+ 0x705c, 0xa08e, 0x080c, 0x110c, 0x002e, 0x008e, 0x0005, 0x0006, -+ 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, -+ 0x0156, 0x080c, 0x80b3, 0x015e, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, -+ 0x19d4, 0x7172, 0x7276, 0x706f, 0x0009, 0x00ee, 0x0005, 0x00e6, -+ 0x0006, 0x2071, 0x19d4, 0x7074, 0x9206, 0x1110, 0x7072, 0x7076, -+ 0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, 0x69e8, 0xd1e4, 0x1518, -+ 0x0026, 0xd1ec, 0x0140, 0x6a50, 0x6870, 0x9202, 0x0288, 0x8117, -+ 0x9294, 0x00c1, 0x0088, 0x9184, 0x0007, 0x01a0, 0x8109, 0x9184, -+ 0x0007, 0x0110, 0x69ea, 0x0070, 0x8107, 0x9084, 0x0007, 0x910d, -+ 0x8107, 0x9106, 0x9094, 0x00c1, 0x9184, 0xff3e, 0x9205, 0x68ea, -+ 0x080c, 0x0eed, 0x002e, 0x0005, 0x69e4, 0x9184, 0x003f, 0x05b8, -+ 0x8109, 0x9184, 0x003f, 0x01a8, 0x6a50, 0x6870, 0x9202, 0x0220, -+ 0xd1bc, 0x0168, 0xc1bc, 0x0018, 0xd1bc, 0x1148, 0xc1bd, 0x2110, -+ 0x00e6, 0x2071, 0x1800, 0x080c, 0x0f0f, 0x00ee, 0x0400, 0x69e6, -+ 0x00f0, 0x0026, 0x8107, 0x9094, 0x0007, 0x0128, 0x8001, 0x8007, -+ 0x9085, 0x0007, 0x0050, 0x2010, 0x8004, 0x8004, 0x8004, 0x9084, -+ 0x0007, 0x9205, 0x8007, 0x9085, 0x0028, 0x9086, 0x0040, 0x2010, -+ 0x00e6, 0x2071, 0x1800, 0x080c, 0x0f0f, 0x00ee, 0x002e, 0x0005, -+ 0x00c6, 0x2061, 0x1a3f, 0x00ce, 0x0005, 0x9184, 0x000f, 0x8003, -+ 0x8003, 0x8003, 0x9080, 0x1a3f, 0x2060, 0x0005, 0xa884, 0x908a, -+ 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a3f, 0x6014, -+ 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, 0xffff, -+ 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, 0x908c, -+ 0x00c0, 0x918e, 0x00c0, 0x0904, 0x8395, 0xd0b4, 0x1168, 0xd0bc, -+ 0x1904, 0x836e, 0x2009, 0x0006, 0x080c, 0x83c2, 0x0005, 0x900e, -+ 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x05c8, 0x908c, 0x2023, -+ 0x1550, 0x87ff, 0x1540, 0x6124, 0x918c, 0x0500, 0x1520, 0x6100, -+ 0x918e, 0x0007, 0x1500, 0x2009, 0x1875, 0x210c, 0xd184, 0x11d8, -+ 0x6003, 0x0003, 0x6007, 0x0043, 0x6047, 0xb035, 0x080c, 0x1aa5, -+ 0xa87c, 0xc0dd, 0xa87e, 0x600f, 0x0000, 0x00f6, 0x2079, 0x0380, -+ 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0013, 0x2c00, 0x7836, 0x781b, -+ 0x8080, 0x00fe, 0x0005, 0x908c, 0x0003, 0x0120, 0x918e, 0x0003, -+ 0x1904, 0x83bc, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, 0x6024, -+ 0xd0d4, 0x11e8, 0x2009, 0x1875, 0x2104, 0xd084, 0x1138, 0x87ff, -+ 0x1120, 0x2009, 0x0043, 0x0804, 0x9c85, 0x0005, 0x87ff, 0x1de8, -+ 0x2009, 0x0042, 0x0804, 0x9c85, 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, 0x83bc, 0x908c, -+ 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, 0x080c, -+ 0x164f, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, 0x080c, -+ 0x9c85, 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, 0x9c85, 0x0005, -+ 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, 0x9c85, -+ 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, 0x0d20, -+ 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, 0x0005, -+ 0x2009, 0x0001, 0x0096, 0x080c, 0xb847, 0x0518, 0x6014, 0x2048, -+ 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, 0x918c, -+ 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a3f, 0x6200, -+ 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, 0x080c, -+ 0x67cb, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, 0x82de, -+ 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a3f, 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, 0x8086, 0x818e, 0x1208, -+ 0x9200, 0x1f04, 0x840d, 0x8086, 0x818e, 0x004e, 0x003e, 0x012e, -+ 0x0005, 0x0126, 0x2091, 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, -+ 0x9005, 0x01c8, 0x911a, 0x12b8, 0x8213, 0x818d, 0x0228, 0x911a, -+ 0x1220, 0x1f04, 0x8424, 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, -+ 0x8424, 0x0006, 0x3200, 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, -+ 0x007e, 0x012e, 0x0005, 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, -+ 0x0126, 0x2091, 0x2800, 0x2079, 0x19b8, 0x012e, 0x00d6, 0x2069, -+ 0x19b8, 0x6803, 0x0005, 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, -+ 0x2069, 0x0200, 0x080c, 0x97fa, 0x04a9, 0x080c, 0x97e5, 0x0491, -+ 0x080c, 0x97e8, 0x0479, 0x080c, 0x97eb, 0x0461, 0x080c, 0x97ee, -+ 0x0449, 0x080c, 0x97f1, 0x0431, 0x080c, 0x97f4, 0x0419, 0x080c, -+ 0x97f7, 0x0401, 0x01de, 0x014e, 0x015e, 0x6857, 0x0000, 0x00f6, -+ 0x2079, 0x0380, 0x00f9, 0x7807, 0x0003, 0x7803, 0x0000, 0x7803, -+ 0x0001, 0x2069, 0x0004, 0x2d04, 0x9084, 0xfffe, 0x9085, 0x8000, -+ 0x206a, 0x2069, 0x0100, 0x6828, 0x9084, 0xfffc, 0x682a, 0x00fe, -+ 0x00de, 0x0005, 0x20a9, 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, -+ 0x4004, 0x0005, 0x00c6, 0x7803, 0x0000, 0x9006, 0x7827, 0x0030, -+ 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1abf, 0x781f, 0xff00, -+ 0x781b, 0xff00, 0x2061, 0x1ab4, 0x602f, 0x19b8, 0x6033, 0x1800, -+ 0x6037, 0x19d4, 0x603b, 0x1cf7, 0x603f, 0x1d07, 0x6042, 0x6047, -+ 0x1a8a, 0x00ce, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, -+ 0x9086, 0x0001, 0x01b0, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, -+ 0x2061, 0x19b8, 0x602c, 0x8000, 0x602e, 0x601c, 0x9005, 0x0130, -+ 0x9080, 0x0003, 0x2102, 0x611e, 0x00ce, 0x0005, 0x6122, 0x611e, -+ 0x0cd8, 0x6146, 0x2c08, 0x2001, 0x0012, 0x080c, 0x98b9, 0x0005, -+ 0x0016, 0x2009, 0x8020, 0x6146, 0x2c08, 0x2001, 0x0382, 0x2004, -+ 0x9084, 0x0007, 0x9086, 0x0001, 0x1128, 0x2001, 0x0019, 0x080c, -+ 0x98b9, 0x0088, 0x00c6, 0x2061, 0x19b8, 0x602c, 0x8000, 0x602e, -+ 0x600c, 0x9005, 0x0128, 0x9080, 0x0003, 0x2102, 0x610e, 0x0010, -+ 0x6112, 0x610e, 0x00ce, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, -+ 0x9084, 0x0007, 0x9086, 0x0001, 0x0198, 0x00c6, 0x6146, 0x600f, -+ 0x0000, 0x2c08, 0x2061, 0x19b8, 0x6044, 0x9005, 0x0130, 0x9080, -+ 0x0003, 0x2102, 0x6146, 0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8, -+ 0x6146, 0x600f, 0x0000, 0x2c08, 0x2001, 0x0013, 0x080c, 0x98b9, -+ 0x0005, 0x6044, 0xd0dc, 0x0128, 0x9006, 0x7007, 0x0000, 0x700a, -+ 0x7032, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, -+ 0x0076, 0x0066, 0x0056, 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, -+ 0x902e, 0x2071, 0x19b8, 0x7648, 0x2660, 0x2678, 0x2091, 0x8000, -+ 0x8cff, 0x0904, 0x85a3, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, -+ 0x859e, 0x87ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x859e, 0x704c, -+ 0x9c06, 0x1178, 0x0036, 0x2019, 0x0001, 0x080c, 0x9286, 0x703f, -+ 0x0000, 0x9006, 0x704e, 0x706a, 0x7052, 0x706e, 0x003e, 0x2029, -+ 0x0001, 0x080c, 0x8521, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, -+ 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, -+ 0x0010, 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, -+ 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xb847, 0x01c8, -+ 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1560, 0xa867, 0x0103, -+ 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0076, 0x080c, 0xbb45, -+ 0x080c, 0xd51a, 0x080c, 0x6996, 0x007e, 0x003e, 0x001e, 0x080c, -+ 0xba36, 0x080c, 0x9c21, 0x00ce, 0x0804, 0x8540, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0x8540, 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, -+ 0x005e, 0x006e, 0x007e, 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, -+ 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, -+ 0x0076, 0x080c, 0xd51a, 0x080c, 0xd21e, 0x007e, 0x003e, 0x001e, -+ 0x08c0, 0x6020, 0x9086, 0x000a, 0x0918, 0x0800, 0x0006, 0x0066, -+ 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, -+ 0x2079, 0x19b8, 0x7848, 0x9065, 0x0904, 0x8625, 0x600c, 0x0006, -+ 0x600f, 0x0000, 0x784c, 0x9c06, 0x11a0, 0x0036, 0x2019, 0x0001, -+ 0x080c, 0x9286, 0x783f, 0x0000, 0x901e, 0x7b4e, 0x7b6a, 0x7b52, -+ 0x7b6e, 0x003e, 0x000e, 0x9005, 0x1118, 0x600c, 0x600f, 0x0000, -+ 0x0006, 0x00e6, 0x2f70, 0x080c, 0x8521, 0x00ee, 0x080c, 0xb847, -+ 0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1580, 0x3e08, -+ 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, -+ 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6048, 0x9005, 0x1198, 0x2001, -+ 0x1959, 0x2004, 0x604a, 0x0070, 0xa867, 0x0103, 0xab7a, 0xa877, -+ 0x0000, 0x080c, 0x698a, 0x080c, 0xba36, 0x6044, 0xc0fc, 0x6046, -+ 0x080c, 0x9c21, 0x000e, 0x0804, 0x85d3, 0x7e4a, 0x7e46, 0x012e, -+ 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, -+ 0x9086, 0x0006, 0x1118, 0x080c, 0xd21e, 0x0c38, 0x6020, 0x9086, -+ 0x000a, 0x09e0, 0x08c8, 0x0016, 0x0026, 0x0086, 0x9046, 0x00a9, -+ 0x080c, 0x872c, 0x008e, 0x002e, 0x001e, 0x0005, 0x00f6, 0x0126, -+ 0x2079, 0x19b8, 0x2091, 0x8000, 0x080c, 0x8775, 0x080c, 0x8809, -+ 0x080c, 0x63fd, 0x012e, 0x00fe, 0x0005, 0x00b6, 0x0096, 0x00f6, -+ 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x19b8, 0x7620, 0x2660, 0x2678, 0x8cff, 0x0904, -+ 0x86f1, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x86ec, 0x88ff, -+ 0x0120, 0x605c, 0x9106, 0x1904, 0x86ec, 0x7030, 0x9c06, 0x1570, -+ 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, 0x820b, 0x080c, -+ 0x8fb7, 0x68c3, 0x0000, 0x080c, 0x94a2, 0x7033, 0x0000, 0x0036, -+ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, -+ 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x2069, 0x0100, 0x6824, -+ 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, 0x7008, 0xc0ad, -+ 0x700a, 0x6003, 0x0009, 0x630a, 0x0804, 0x86ec, 0x7020, 0x9c36, -+ 0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, 0x2c00, 0x9f36, -+ 0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, 0x660c, 0x0066, -+ 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, -+ 0x6044, 0xc0fc, 0x6046, 0x6014, 0x2048, 0x080c, 0xb847, 0x01e8, -+ 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xba5c, 0x1118, 0x080c, -+ 0xa58f, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, -+ 0x0036, 0x0086, 0x080c, 0xbb45, 0x080c, 0xd51a, 0x080c, 0x6996, -+ 0x008e, 0x003e, 0x001e, 0x080c, 0xba36, 0x080c, 0x9c21, 0x080c, -+ 0x9378, 0x00ce, 0x0804, 0x8666, 0x2c78, 0x600c, 0x2060, 0x0804, -+ 0x8666, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, 0x00de, 0x00ee, -+ 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, 0x0006, 0x1158, -+ 0x0016, 0x0036, 0x0086, 0x080c, 0xd51a, 0x080c, 0xd21e, 0x008e, -+ 0x003e, 0x001e, 0x08d0, 0x080c, 0xa58f, 0x6020, 0x9086, 0x0002, -+ 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0904, 0x86d2, -+ 0x9086, 0x008b, 0x0904, 0x86d2, 0x0840, 0x6020, 0x9086, 0x0005, -+ 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x09c8, 0x9086, -+ 0x008b, 0x09b0, 0x0804, 0x86e5, 0x0006, 0x00f6, 0x00e6, 0x0096, -+ 0x00b6, 0x00c6, 0x0066, 0x0016, 0x0126, 0x2091, 0x8000, 0x9280, -+ 0x1000, 0x2004, 0x905d, 0x2079, 0x19b8, 0x9036, 0x7828, 0x2060, -+ 0x8cff, 0x0538, 0x6010, 0x9b06, 0x1500, 0x6043, 0xffff, 0x080c, -+ 0x9a84, 0x01d8, 0x610c, 0x0016, 0x080c, 0x9110, 0x6014, 0x2048, -+ 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, 0x0036, 0x0086, -+ 0x080c, 0xbb45, 0x080c, 0xd51a, 0x080c, 0x6996, 0x008e, 0x003e, -+ 0x001e, 0x080c, 0x9c21, 0x00ce, 0x08d8, 0x2c30, 0x600c, 0x2060, -+ 0x08b8, 0x080c, 0x641a, 0x012e, 0x001e, 0x006e, 0x00ce, 0x00be, -+ 0x009e, 0x00ee, 0x00fe, 0x000e, 0x0005, 0x0096, 0x0006, 0x0066, -+ 0x00c6, 0x00d6, 0x9036, 0x7820, 0x9065, 0x0904, 0x87dc, 0x600c, -+ 0x0006, 0x6044, 0xc0fc, 0x6046, 0x600f, 0x0000, 0x7830, 0x9c06, -+ 0x1588, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, 0x820b, -+ 0x080c, 0x8fb7, 0x68c3, 0x0000, 0x080c, 0x94a2, 0x7833, 0x0000, -+ 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, -+ 0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x2069, 0x0100, -+ 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0058, 0x080c, -+ 0x661d, 0x1538, 0x6003, 0x0009, 0x630a, 0x7808, 0xc0ad, 0x780a, -+ 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xb845, 0x01b0, 0x6020, -+ 0x9086, 0x0003, 0x1508, 0x080c, 0xba5c, 0x1118, 0x080c, 0xa58f, -+ 0x0060, 0x080c, 0x661d, 0x1168, 0xa867, 0x0103, 0xab7a, 0xa877, -+ 0x0000, 0x080c, 0x6996, 0x080c, 0xba36, 0x080c, 0x9c21, 0x080c, -+ 0x9378, 0x000e, 0x0804, 0x877c, 0x7e22, 0x7e1e, 0x00de, 0x00ce, -+ 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1118, -+ 0x080c, 0xd21e, 0x0c50, 0x080c, 0xa58f, 0x6020, 0x9086, 0x0002, -+ 0x1150, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0990, 0x9086, -+ 0x008b, 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, 0x19b0, 0x6004, -+ 0x0006, 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, 0x008b, 0x0d00, -+ 0x0860, 0x0006, 0x0096, 0x00b6, 0x00c6, 0x0066, 0x9036, 0x7828, -+ 0x9065, 0x0510, 0x6010, 0x2058, 0x600c, 0x0006, 0x3e08, 0x918e, -+ 0x0002, 0x1118, 0xb800, 0xd0bc, 0x11a8, 0x6043, 0xffff, 0x080c, -+ 0x9a84, 0x0180, 0x610c, 0x080c, 0x9110, 0x6014, 0x2048, 0xa867, -+ 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6996, 0x080c, 0x9c21, -+ 0x000e, 0x08f0, 0x2c30, 0x0ce0, 0x006e, 0x00ce, 0x00be, 0x009e, -+ 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, 0x080c, 0x5dd6, -+ 0x11b0, 0x2071, 0x19b8, 0x7030, 0x9080, 0x0005, 0x2004, 0x904d, -+ 0x0170, 0xa878, 0x9606, 0x1158, 0x2071, 0x19b8, 0x7030, 0x9035, -+ 0x0130, 0x9080, 0x0005, 0x2004, 0x9906, 0x1108, 0x0029, 0x006e, -+ 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, 0x2660, 0x6043, 0xffff, -+ 0x080c, 0x9a84, 0x0178, 0x080c, 0x9110, 0x6014, 0x2048, 0xa867, -+ 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xbb45, 0x080c, 0x6996, -+ 0x080c, 0x9c21, 0x00ce, 0x0005, 0x00b6, 0x00e6, 0x00c6, 0x080c, -+ 0x9926, 0x0106, 0x190c, 0x98c8, 0x2071, 0x0101, 0x2e04, 0xc0c4, -+ 0x2072, 0x6044, 0xd0fc, 0x1138, 0x010e, 0x190c, 0x98e4, 0x00ce, -+ 0x00ee, 0x00be, 0x0005, 0x2071, 0x19b8, 0x7030, 0x9005, 0x0da0, -+ 0x9c06, 0x190c, 0x0d65, 0x7036, 0x080c, 0x820b, 0x7004, 0x9084, -+ 0x0007, 0x0002, 0x88a4, 0x88a6, 0x88ad, 0x88b7, 0x88c5, 0x88a4, -+ 0x88ad, 0x88a2, 0x080c, 0x0d65, 0x0428, 0x0005, 0x080c, 0x9a6f, -+ 0x7007, 0x0000, 0x7033, 0x0000, 0x00e8, 0x0066, 0x9036, 0x080c, -+ 0x9110, 0x006e, 0x7007, 0x0000, 0x7033, 0x0000, 0x0098, 0x080c, -+ 0x9a5a, 0x0140, 0x080c, 0x9a6f, 0x0128, 0x0066, 0x9036, 0x080c, -+ 0x9110, 0x006e, 0x7033, 0x0000, 0x0028, 0x080c, 0x9a5a, 0x080c, -+ 0x94a2, 0x0000, 0x010e, 0x190c, 0x98e4, 0x00ce, 0x00ee, 0x00be, -+ 0x0005, 0x00d6, 0x00c6, 0x080c, 0x9926, 0x0106, 0x190c, 0x98c8, -+ 0x6044, 0xd0fc, 0x1130, 0x010e, 0x190c, 0x98e4, 0x00ce, 0x00de, -+ 0x0005, 0x2069, 0x19b8, 0x684c, 0x9005, 0x0da8, 0x9c06, 0x190c, -+ 0x0d65, 0x6852, 0x00e6, 0x2d70, 0x080c, 0x8521, 0x00ee, 0x080c, -+ 0x8218, 0x0016, 0x2009, 0x0040, 0x080c, 0x2052, 0x001e, 0x683c, -+ 0x9084, 0x0003, 0x0002, 0x8901, 0x8902, 0x8920, 0x88ff, 0x080c, -+ 0x0d65, 0x0460, 0x6868, 0x9086, 0x0001, 0x0190, 0x600c, 0x9015, -+ 0x0160, 0x6a4a, 0x600f, 0x0000, 0x6044, 0xc0fc, 0x6046, 0x9006, -+ 0x7042, 0x684e, 0x683f, 0x0000, 0x00c8, 0x684a, 0x6846, 0x0ca0, -+ 0x686b, 0x0000, 0x6848, 0x9065, 0x0d78, 0x6003, 0x0002, 0x0c60, -+ 0x9006, 0x686a, 0x6852, 0x686e, 0x600c, 0x9015, 0x0120, 0x6a4a, -+ 0x600f, 0x0000, 0x0018, 0x684e, 0x684a, 0x6846, 0x684f, 0x0000, -+ 0x010e, 0x190c, 0x98e4, 0x00ce, 0x00de, 0x0005, 0x0005, 0x6020, -+ 0x9084, 0x000f, 0x000b, 0x0005, 0x894c, 0x894f, 0x8da8, 0x8e37, -+ 0x894f, 0x8da8, 0x8e37, 0x894c, 0x894f, 0x894c, 0x894c, 0x894c, -+ 0x894c, 0x894c, 0x894c, 0x894c, 0x080c, 0x8874, 0x0005, 0x00b6, -+ 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, 0x00d6, 0x00e6, -+ 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, 0x908a, 0x0053, -+ 0x1a0c, 0x0d65, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, -+ 0x619a, 0x908a, 0x0040, 0x1a04, 0x89bb, 0x005b, 0x00fe, 0x00ee, -+ 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, -+ 0x0005, 0x8b32, 0x8b6d, 0x8b96, 0x8c39, 0x8c5a, 0x8c60, 0x8c6d, -+ 0x8c75, 0x8c81, 0x8c87, 0x8c98, 0x8c87, 0x8cef, 0x8c75, 0x8cfb, -+ 0x8d01, 0x8c81, 0x8d01, 0x8d0d, 0x89b9, 0x89b9, 0x89b9, 0x89b9, -+ 0x89b9, 0x89b9, 0x89b9, 0x89b9, 0x89b9, 0x89b9, 0x89b9, 0x9131, -+ 0x9154, 0x9165, 0x9185, 0x91b7, 0x8c6d, 0x89b9, 0x8c6d, 0x8c87, -+ 0x89b9, 0x8b96, 0x8c39, 0x89b9, 0x9595, 0x8c87, 0x89b9, 0x95b1, -+ 0x8c87, 0x89b9, 0x8c81, 0x8b2c, 0x89dc, 0x89b9, 0x95cd, 0x963a, -+ 0x971a, 0x89b9, 0x9727, 0x8c6a, 0x9752, 0x89b9, 0x91c1, 0x975e, -+ 0x89b9, 0x080c, 0x0d65, 0x2100, 0x005b, 0x00fe, 0x00ee, 0x00de, -+ 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, 0x00be, 0x0005, -+ 0x89da, 0x89da, 0x89da, 0x8a03, 0x8aaf, 0x8aba, 0x89da, 0x89da, -+ 0x89da, 0x8b01, 0x8b0d, 0x8a1e, 0x89da, 0x8a39, 0x8a6d, 0x9ada, -+ 0x9b1f, 0x8c87, 0x080c, 0x0d65, 0x00d6, 0x0096, 0x080c, 0x8d20, -+ 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, 0x7814, 0x2048, -+ 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, 0x60c3, 0x0018, -+ 0x080c, 0x8f87, 0x009e, 0x00de, 0x0005, 0x7810, 0x00b6, 0x2058, -+ 0xb8a0, 0x00be, 0x080c, 0x9b66, 0x1118, 0x9084, 0xff80, 0x0110, -+ 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, 0x8d20, 0x7003, -+ 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, 0x700e, 0xa87c, -+ 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, 0x701e, 0x60c3, -+ 0x0010, 0x080c, 0x8f87, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, -+ 0x080c, 0x8d20, 0x7003, 0x0500, 0x7814, 0x2048, 0xa8cc, 0x700a, -+ 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, 0xa8dc, 0x701a, -+ 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0x8f87, 0x009e, 0x00de, -+ 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x8d20, -+ 0x20e9, 0x0000, 0x2001, 0x1974, 0x2003, 0x0000, 0x7814, 0x2048, -+ 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, -+ 0x9080, 0x001b, 0x2098, 0x2001, 0x1974, 0x0016, 0x200c, 0x2001, -+ 0x0001, 0x080c, 0x2037, 0x080c, 0xc591, 0x9006, 0x080c, 0x2037, -+ 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, 0x04d9, 0x080c, -+ 0x8f87, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x8d6b, 0x20e9, 0x0000, 0x2001, 0x1974, -+ 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, 0xa873, 0x0000, -+ 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, 0x20e0, 0xa85c, -+ 0x9080, 0x001b, 0x2098, 0x2001, 0x1974, 0x0016, 0x200c, 0x080c, -+ 0xc591, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c60, 0x0051, -+ 0x7814, 0x2048, 0x080c, 0x0fd4, 0x080c, 0x8f87, 0x012e, 0x009e, -+ 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, 0x9005, 0x0130, -+ 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, 0x0005, 0x080c, -+ 0x8d20, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, 0x60c3, 0x0008, -+ 0x0804, 0x8f87, 0x00d6, 0x00e6, 0x080c, 0x8d6b, 0x7814, 0x9084, -+ 0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, 0x0010, 0x2272, -+ 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, 0x20a9, 0x0004, -+ 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8ad0, 0x2069, 0x1801, 0x20a9, -+ 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x8ad9, 0x2069, 0x1984, -+ 0x9086, 0xdf00, 0x0110, 0x2069, 0x199e, 0x20a9, 0x001a, 0x9e86, -+ 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, 0x8000, 0x6012, -+ 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, 0x8d68, 0x8e70, -+ 0x1f04, 0x8ae7, 0x60c3, 0x004c, 0x080c, 0x8f87, 0x00ee, 0x00de, -+ 0x0005, 0x080c, 0x8d20, 0x7003, 0x6300, 0x7007, 0x0028, 0x7808, -+ 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f87, 0x00d6, 0x0026, 0x0016, -+ 0x080c, 0x8d6b, 0x7003, 0x0200, 0x7814, 0x700e, 0x00e6, 0x9ef0, -+ 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2073, 0x0800, 0x8e70, -+ 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x8f87, -+ 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1817, 0x2004, 0x609a, -+ 0x0804, 0x8f87, 0x080c, 0x8d20, 0x7003, 0x5200, 0x2069, 0x1853, -+ 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x2457, 0x710e, -+ 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, -+ 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, -+ 0x20a1, 0x0254, 0x4003, 0x080c, 0x9b66, 0x1120, 0xb8a0, 0x9082, -+ 0x007f, 0x0248, 0x2001, 0x181e, 0x2004, 0x7032, 0x2001, 0x181f, -+ 0x2004, 0x7036, 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, -+ 0x7036, 0x60c3, 0x001c, 0x0804, 0x8f87, 0x080c, 0x8d20, 0x7003, -+ 0x0500, 0x080c, 0x9b66, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, -+ 0x2001, 0x181e, 0x2004, 0x700a, 0x2001, 0x181f, 0x2004, 0x700e, -+ 0x0030, 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, -+ 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, -+ 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x8f87, 0x080c, 0x8d20, -+ 0x9006, 0x080c, 0x6631, 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, 0x8c01, 0x00d6, 0x2069, 0x193d, -+ 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, 0x70b7, 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, 0x97e5, 0x2069, 0x1945, 0x2071, 0x024e, 0x6800, 0xc0dd, -+ 0x7002, 0x080c, 0x5391, 0xd0e4, 0x0110, 0x680c, 0x700e, 0x00de, -+ 0x04a0, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x0168, 0x0016, 0x2009, -+ 0x0002, 0x60e0, 0x9106, 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, -+ 0x2498, 0x61e2, 0x001e, 0x20e1, 0x0001, 0x2099, 0x193d, 0x20e9, -+ 0x0000, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, -+ 0x2099, 0x1805, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, -+ 0x1801, 0x20a1, 0x025a, 0x4003, 0x080c, 0x97e5, 0x20a1, 0x024e, -+ 0x20a9, 0x0008, 0x2099, 0x1945, 0x4003, 0x60c3, 0x0074, 0x0804, -+ 0x8f87, 0x080c, 0x8d20, 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, -+ 0x0800, 0x700f, 0x2000, 0x9006, 0x00f6, 0x2079, 0x1853, 0x7904, -+ 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, 0x0010, -+ 0x9085, 0x0002, 0x00d6, 0x0804, 0x8cd0, 0x7026, 0x60c3, 0x0014, -+ 0x0804, 0x8f87, 0x080c, 0x8d20, 0x7003, 0x5000, 0x0804, 0x8bb0, -+ 0x080c, 0x8d20, 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, -+ 0x0804, 0x8f87, 0x080c, 0x8d62, 0x0010, 0x080c, 0x8d6b, 0x7003, -+ 0x0200, 0x60c3, 0x0004, 0x0804, 0x8f87, 0x080c, 0x8d6b, 0x7003, -+ 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, -+ 0x8f87, 0x080c, 0x8d6b, 0x7003, 0x0200, 0x0804, 0x8bb0, 0x080c, -+ 0x8d6b, 0x7003, 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, -+ 0x700b, 0x0003, 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f87, -+ 0x00d6, 0x080c, 0x8d6b, 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, 0x1853, -+ 0x7904, 0x00fe, 0xd1ac, 0x1110, 0x9085, 0x0020, 0x0010, 0x9085, -+ 0x0010, 0x2009, 0x1875, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, -+ 0x0026, 0x2009, 0x1873, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbac4, -+ 0xd28c, 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, -+ 0xd1ec, 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, -+ 0x002e, 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x8f87, 0x080c, -+ 0x8d6b, 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, -+ 0x0014, 0x0804, 0x8f87, 0x080c, 0x8d6b, 0x7003, 0x0200, 0x0804, -+ 0x8b36, 0x080c, 0x8d6b, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, -+ 0x2a00, 0x60c3, 0x0008, 0x0804, 0x8f87, 0x080c, 0x8d6b, 0x7003, -+ 0x0100, 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x8f87, 0x0026, -+ 0x00d6, 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, -+ 0x0026, 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, -+ 0x080c, 0x97fa, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, -+ 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x9485, 0x0029, 0x7012, -+ 0x004e, 0x003e, 0x00de, 0x080c, 0x8f7b, 0x721a, 0x9f95, 0x0000, -+ 0x7222, 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, -+ 0x080c, 0x97fa, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, -+ 0x1800, 0x6878, 0x700a, 0x687c, 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, 0x97fa, 0xb810, 0x9305, 0x7002, -+ 0xb814, 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, -+ 0x9005, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x6878, -+ 0x700a, 0x687c, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, -+ 0x003e, 0x00de, 0x080c, 0x8f7b, 0x721a, 0x7a08, 0x7222, 0x2f10, -+ 0x7226, 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x8f7b, 0x721a, -+ 0x7a08, 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, -+ 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, -+ 0x0240, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d65, 0x908a, 0x0092, -+ 0x1a0c, 0x0d65, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, -+ 0x619a, 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x00be, 0x0005, 0x8dd9, 0x8de8, 0x8df3, 0x8dd7, 0x8dd7, 0x8dd7, -+ 0x8dd9, 0x8dd7, 0x8dd7, 0x8dd7, 0x8dd7, 0x8dd7, 0x8dd7, 0x080c, -+ 0x0d65, 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x27a2, 0x0228, -+ 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x8f87, -+ 0x0431, 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, -+ 0x000c, 0x0804, 0x8f87, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, -+ 0x60c3, 0x0004, 0x0804, 0x8f87, 0x0026, 0x080c, 0x97fa, 0xb810, -+ 0x9085, 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, -+ 0x700a, 0x687c, 0x700e, 0x7013, 0x0009, 0x0804, 0x8d3b, 0x0026, -+ 0x080c, 0x97fa, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, -+ 0x2069, 0x1800, 0x6878, 0x700a, 0x687c, 0x700e, 0x2001, 0x0099, -+ 0x7012, 0x0804, 0x8d9d, 0x0026, 0x080c, 0x97fa, 0xb810, 0x9085, -+ 0x8500, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6878, 0x700a, -+ 0x687c, 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x8d9d, 0x00b6, -+ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, -+ 0x0240, 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d65, 0x908a, 0x0057, -+ 0x1a0c, 0x0d65, 0x7910, 0x2158, 0xb984, 0x2061, 0x0100, 0x619a, -+ 0x9082, 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, -+ 0x0005, 0x8e6c, 0x8e6c, 0x8e6c, 0x8e92, 0x8e6c, 0x8e6c, 0x8e6c, -+ 0x8e6c, 0x8e6c, 0x8e6c, 0x8e6c, 0x9355, 0x935d, 0x9365, 0x936d, -+ 0x8e6c, 0x8e6c, 0x8e6c, 0x934d, 0x080c, 0x0d65, 0x6813, 0x0008, -+ 0xba8c, 0x8210, 0xb8c4, 0xd084, 0x0128, 0x7a4e, 0x7b14, 0x7b52, -+ 0x722e, 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, -+ 0x9295, 0x0600, 0x7202, 0xba14, 0x7206, 0x2069, 0x1800, 0x6a78, -+ 0x720a, 0x6a7c, 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, -+ 0xffff, 0x0005, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, -+ 0x001e, 0x0005, 0x8ea2, 0x8ea2, 0x8ea4, 0x8ea2, 0x8ea2, 0x8ea2, -+ 0x8ebe, 0x8ea2, 0x080c, 0x0d65, 0x7914, 0x918c, 0x08ff, 0x918d, -+ 0xf600, 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1853, 0x6804, -+ 0xd0bc, 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, -+ 0x7033, 0x3f00, 0x60c3, 0x0001, 0x0804, 0x8f87, 0x2009, 0x0003, -+ 0x0019, 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0x97fa, 0x001e, -+ 0xb810, 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, -+ 0x6a78, 0x720a, 0x6a7c, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, -+ 0x7116, 0x080c, 0x8f7b, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, -+ 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, 0x00c6, 0x0056, 0x0046, -+ 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7810, 0x2058, 0xb8a0, -+ 0x2028, 0xb910, 0xba14, 0x7378, 0x747c, 0x7820, 0x0002, 0x8f06, -+ 0x8f06, 0x8f06, 0x8f06, 0x8f06, 0x8f06, 0x8f06, 0x8f06, 0x8f06, -+ 0x8f06, 0x8f08, 0x8f06, 0x8f06, 0x8f06, 0x8f06, 0x080c, 0x0d65, -+ 0xb884, 0x609e, 0x7814, 0x2048, 0xa87c, 0xd0fc, 0x0558, 0xaf90, -+ 0x9784, 0xff00, 0x9105, 0x6062, 0x873f, 0x9784, 0xff00, 0x0006, -+ 0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005, 0x000e, 0x1160, 0xaf94, -+ 0x87ff, 0x0198, 0x2039, 0x0098, 0x9705, 0x6072, 0x7808, 0x6082, -+ 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, 0x6062, 0x6073, 0x0129, -+ 0x6077, 0x0000, 0xb884, 0x609e, 0x0050, 0x2039, 0x0029, 0x9705, -+ 0x6072, 0x0cc0, 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, 0xa848, -+ 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, 0x60ca, 0xb86c, -+ 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, 0x080c, 0x97da, 0x2009, -+ 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, 0x0110, 0x2009, 0x1b58, -+ 0x080c, 0x8210, 0x003e, 0x004e, 0x005e, 0x00ce, 0x00de, 0x00ee, -+ 0x009e, 0x00be, 0x0005, 0x7a40, 0x9294, 0x00ff, 0x8217, 0x0005, -+ 0x00d6, 0x2069, 0x19b8, 0x686b, 0x0001, 0x00de, 0x0005, 0x60a3, -+ 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, 0x8202, 0x0005, 0x0016, -+ 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, 0x9086, 0x0600, 0x0128, -+ 0x0089, 0x080c, 0x8202, 0x001e, 0x0005, 0xc1e5, 0x2001, 0x180c, -+ 0x2102, 0x2001, 0x19b9, 0x2003, 0x0000, 0x2001, 0x19c4, 0x2003, -+ 0x0000, 0x0c88, 0x0006, 0x0016, 0x0026, 0x2009, 0x1804, 0x2011, -+ 0x0009, 0x080c, 0x287c, 0x002e, 0x001e, 0x000e, 0x0005, 0x0016, -+ 0x00c6, 0x0006, 0x080c, 0x9926, 0x0106, 0x190c, 0x98c8, 0x2061, -+ 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x0016, 0x0026, 0x2009, 0x1804, -+ 0x2011, 0x0008, 0x080c, 0x287c, 0x002e, 0x001e, 0x010e, 0x190c, -+ 0x98e4, 0x000e, 0xa001, 0xa001, 0xa001, 0x61a6, 0x00ce, 0x001e, -+ 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x080c, 0x70b7, 0x1510, 0x2001, 0x19dd, 0x2004, 0x9005, -+ 0x1904, 0x9038, 0x080c, 0x7158, 0x11a8, 0x2069, 0x0380, 0x6843, -+ 0x0101, 0x6844, 0xd084, 0x1de8, 0x2061, 0x0100, 0x6020, 0xd0b4, -+ 0x1120, 0x6024, 0xd084, 0x090c, 0x0d65, 0x6843, 0x0100, 0x080c, -+ 0x8202, 0x04b0, 0x00c6, 0x2061, 0x19b8, 0x00f0, 0x6904, 0x9194, -+ 0x4000, 0x0598, 0x080c, 0x8fb7, 0x080c, 0x2843, 0x00c6, 0x2061, -+ 0x19b8, 0x6134, 0x9192, 0x0008, 0x1278, 0x8108, 0x6136, 0x080c, -+ 0x98c8, 0x6130, 0x080c, 0x98e4, 0x00ce, 0x81ff, 0x01c8, 0x080c, -+ 0x8202, 0x080c, 0x8faa, 0x00a0, 0x080c, 0x98c8, 0x6130, 0x91e5, -+ 0x0000, 0x0150, 0x080c, 0xd610, 0x080c, 0x820b, 0x6003, 0x0001, -+ 0x2009, 0x0014, 0x080c, 0x9c85, 0x080c, 0x98e4, 0x00ce, 0x0000, -+ 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, 0x2001, 0x19dd, 0x2004, -+ 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19b8, 0x6134, 0x9192, 0x0003, -+ 0x1ad8, 0x8108, 0x6136, 0x00ce, 0x080c, 0x8202, 0x080c, 0x5b97, -+ 0x2009, 0x1852, 0x2114, 0x8210, 0x220a, 0x0c10, 0x0096, 0x00c6, -+ 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, 0x8218, 0x080c, 0x98c8, -+ 0x2001, 0x0387, 0x2003, 0x0202, 0x2071, 0x19b8, 0x714c, 0x81ff, -+ 0x0904, 0x90cc, 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x70b7, -+ 0x11c0, 0x0036, 0x2019, 0x0002, 0x080c, 0x9286, 0x003e, 0x714c, -+ 0x2160, 0x080c, 0xd610, 0x2009, 0x004a, 0x6003, 0x0003, 0x080c, -+ 0x9c85, 0x2001, 0x0386, 0x2003, 0x5040, 0x080c, 0x7158, 0x0804, -+ 0x90cc, 0x6904, 0xd1f4, 0x0904, 0x90d9, 0x080c, 0x2843, 0x00c6, -+ 0x704c, 0x9065, 0x090c, 0x0d65, 0x6020, 0x00ce, 0x9086, 0x0006, -+ 0x1518, 0x61c8, 0x60c4, 0x9105, 0x11f8, 0x2009, 0x180c, 0x2104, -+ 0xd0d4, 0x01d0, 0x6214, 0x9294, 0x1800, 0x1128, 0x6224, 0x9294, -+ 0x0002, 0x1510, 0x0010, 0xc0d4, 0x200a, 0x6014, 0x9084, 0xe7fd, -+ 0x9085, 0x0010, 0x6016, 0x704c, 0x2060, 0x080c, 0x88d1, 0x2009, -+ 0x0049, 0x080c, 0x9c85, 0x0080, 0x0036, 0x2019, 0x0001, 0x080c, -+ 0x9286, 0x003e, 0x714c, 0x2160, 0x080c, 0xd610, 0x2009, 0x004a, -+ 0x6003, 0x0003, 0x080c, 0x9c85, 0x2001, 0x0387, 0x2003, 0x0200, -+ 0x080c, 0x98e4, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, -+ 0x0005, 0xd1ec, 0x1904, 0x908d, 0x0804, 0x908f, 0x0026, 0x00e6, -+ 0x2071, 0x19b8, 0x706c, 0xd084, 0x01d0, 0xc084, 0x706e, 0x714c, -+ 0x81ff, 0x01a8, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, -+ 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012, 0x080c, 0x287c, -+ 0x0030, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, 0x287c, 0x00ee, -+ 0x002e, 0x0005, 0x9036, 0x2001, 0x19c2, 0x2004, 0x9005, 0x0128, -+ 0x9c06, 0x0128, 0x2c30, 0x600c, 0x0cc8, 0x9085, 0x0001, 0x0005, -+ 0x00f6, 0x2079, 0x19b8, 0x610c, 0x9006, 0x600e, 0x6044, 0xc0fc, -+ 0x6046, 0x86ff, 0x1140, 0x7824, 0x9c06, 0x1118, 0x7826, 0x782a, -+ 0x0050, 0x792a, 0x0040, 0x00c6, 0x2660, 0x610e, 0x00ce, 0x7824, -+ 0x9c06, 0x1108, 0x7e26, 0x080c, 0x9378, 0x080c, 0xba36, 0x00fe, -+ 0x0005, 0x080c, 0x8d20, 0x7003, 0x1200, 0x7838, 0x7012, 0x783c, -+ 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, 0x7810, 0x9005, -+ 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, 0x0020, 0x2061, -+ 0x1800, 0x6078, 0x617c, 0x9084, 0x00ff, 0x700a, 0x710e, 0x00ce, -+ 0x60c3, 0x002c, 0x0804, 0x8f87, 0x080c, 0x8d20, 0x7003, 0x0f00, -+ 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, 0x700a, 0xb814, -+ 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f87, 0x0156, 0x080c, 0x8d6b, -+ 0x7003, 0x0200, 0x2011, 0x1848, 0x63f0, 0x2312, 0x20a9, 0x0006, -+ 0x2011, 0x1840, 0x2019, 0x1841, 0x9ef0, 0x0002, 0x2376, 0x8e70, -+ 0x2276, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, 0x9176, -+ 0x60c3, 0x001c, 0x015e, 0x0804, 0x8f87, 0x0016, 0x0026, 0x080c, -+ 0x8d47, 0x080c, 0x8d59, 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, 0x8f87, 0x002e, 0x001e, 0x0005, 0x20a9, 0x0010, 0x4003, -+ 0x080c, 0x97e5, 0x20a1, 0x0240, 0x22a8, 0x4003, 0x0c68, 0x080c, -+ 0x8d20, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, -+ 0x8f87, 0x0016, 0x0026, 0x080c, 0x8d20, 0x20e9, 0x0000, 0x20a1, -+ 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, 0xa860, 0x20e0, -+ 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, 0x9088, 0x0002, -+ 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x8f87, 0x002e, 0x001e, -+ 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, -+ 0x19b8, 0x7010, 0x2060, 0x8cff, 0x0188, 0x080c, 0xba5c, 0x1110, -+ 0x080c, 0xa58f, 0x600c, 0x0006, 0x080c, 0xbcd3, 0x600f, 0x0000, -+ 0x080c, 0x9be7, 0x080c, 0x9378, 0x00ce, 0x0c68, 0x2c00, 0x7012, -+ 0x700e, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, 0x0126, 0x0156, -+ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, -+ 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xe7ff, 0x2102, -+ 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19b8, 0x7030, 0x2060, -+ 0x8cff, 0x0548, 0x080c, 0x8fb7, 0x6ac0, 0x68c3, 0x0000, 0x080c, -+ 0x820b, 0x00c6, 0x2061, 0x0100, 0x080c, 0x97fe, 0x00ce, 0x20a9, -+ 0x01f4, 0x04b1, 0x080c, 0x8874, 0x6044, 0xd0ac, 0x1128, 0x2001, -+ 0x1959, 0x2004, 0x604a, 0x0020, 0x2009, 0x0013, 0x080c, 0x9c85, -+ 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, -+ 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, 0x9096, 0x0001, -+ 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x820b, 0x6814, 0x9084, -+ 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, -+ 0x2011, 0x5b41, 0x080c, 0x8159, 0x20a9, 0x01f4, 0x0009, 0x08c0, -+ 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, 0x4000, -+ 0x190c, 0x2843, 0x0090, 0xd084, 0x0118, 0x6827, 0x0001, 0x0010, -+ 0x1f04, 0x9268, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, 0x0100, -+ 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x0005, 0x0126, 0x0156, -+ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, 0x0016, 0x0006, -+ 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, 0xdbff, 0x2102, -+ 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x0380, 0x701c, 0x0006, -+ 0x701f, 0x0202, 0x2071, 0x19b8, 0x704c, 0x2060, 0x8cff, 0x0904, -+ 0x9327, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, 0x0002, 0x0904, -+ 0x9327, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, 0x00fa, 0x8109, -+ 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x8218, 0x080c, 0x1c7a, -+ 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e3d, 0x2021, 0x0169, 0x2404, -+ 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, 0x95f5, 0x68c6, -+ 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, 0x2071, 0x19b8, -+ 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, 0x782b, 0x0008, -+ 0x7057, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, 0x1128, 0x7884, -+ 0x9005, 0x1110, 0x7887, 0x0001, 0x0016, 0x2009, 0x0040, 0x080c, -+ 0x2052, 0x001e, 0x2009, 0x0000, 0x080c, 0x0e3d, 0x004e, 0x20a9, -+ 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, 0x9084, -+ 0x4000, 0x190c, 0x2843, 0x0090, 0xd08c, 0x0118, 0x6827, 0x0002, -+ 0x0010, 0x1f04, 0x92f9, 0x7804, 0x9084, 0x1000, 0x0138, 0x2001, -+ 0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x6827, 0x4000, -+ 0x6824, 0x83ff, 0x1160, 0x2009, 0x0049, 0x080c, 0x88d1, 0x6044, -+ 0xd0ac, 0x1118, 0x6003, 0x0002, 0x0010, 0x080c, 0x9c85, 0x000e, -+ 0x2071, 0x0380, 0xd08c, 0x1110, 0x701f, 0x0200, 0x000e, 0x001e, -+ 0x002e, 0x006e, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, -+ 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19b8, 0x6a06, -+ 0x012e, 0x00de, 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, -+ 0x19b8, 0x6a3e, 0x012e, 0x00de, 0x0005, 0x080c, 0x8e6e, 0x785c, -+ 0x7032, 0x7042, 0x7047, 0x1000, 0x00f8, 0x080c, 0x8e6e, 0x785c, -+ 0x7032, 0x7042, 0x7047, 0x4000, 0x00b8, 0x080c, 0x8e6e, 0x785c, -+ 0x7032, 0x7042, 0x7047, 0x2000, 0x0078, 0x080c, 0x8e6e, 0x785c, -+ 0x7032, 0x7042, 0x7047, 0x0400, 0x0038, 0x080c, 0x8e6e, 0x785c, -+ 0x7032, 0x7042, 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x8f87, -+ 0x00e6, 0x2071, 0x19b8, 0x702c, 0x9005, 0x0110, 0x8001, 0x702e, -+ 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, -+ 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, 0x19b8, 0x7620, 0x2660, -+ 0x2678, 0x2039, 0x0001, 0x87ff, 0x0904, 0x941d, 0x8cff, 0x0904, -+ 0x941d, 0x6020, 0x9086, 0x0006, 0x1904, 0x9418, 0x88ff, 0x0138, -+ 0x2800, 0x9c06, 0x1904, 0x9418, 0x2039, 0x0000, 0x0050, 0x6010, -+ 0x9b06, 0x1904, 0x9418, 0x85ff, 0x0120, 0x605c, 0x9106, 0x1904, -+ 0x9418, 0x7030, 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, -+ 0x1160, 0x6824, 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x820b, -+ 0x080c, 0x94a2, 0x7033, 0x0000, 0x0428, 0x080c, 0x820b, 0x6820, -+ 0xd0b4, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, -+ 0x080c, 0x94a2, 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, -+ 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2833, 0x9006, -+ 0x080c, 0x2833, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, -+ 0x0001, 0x003e, 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, -+ 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, -+ 0x701f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, -+ 0x0008, 0x2678, 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, -+ 0x2048, 0x080c, 0xb845, 0x0110, 0x080c, 0xd21e, 0x009e, 0x080c, -+ 0x9c21, 0x080c, 0x9378, 0x88ff, 0x1190, 0x00ce, 0x0804, 0x9393, -+ 0x2c78, 0x600c, 0x2060, 0x0804, 0x9393, 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, 0x19b8, 0x7648, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9491, -+ 0x6020, 0x9086, 0x0006, 0x1904, 0x948c, 0x87ff, 0x0128, 0x2700, -+ 0x9c06, 0x1904, 0x948c, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, -+ 0x0118, 0x605c, 0x9106, 0x15c0, 0x704c, 0x9c06, 0x1168, 0x0036, -+ 0x2019, 0x0001, 0x080c, 0x9286, 0x703f, 0x0000, 0x9006, 0x704e, -+ 0x706a, 0x7052, 0x706e, 0x003e, 0x7048, 0x9c36, 0x1110, 0x660c, -+ 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, -+ 0x7046, 0x0010, 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, -+ 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, -+ 0x080c, 0xb845, 0x0110, 0x080c, 0xd21e, 0x080c, 0x9c21, 0x87ff, -+ 0x1198, 0x00ce, 0x0804, 0x943d, 0x2c78, 0x600c, 0x2060, 0x0804, -+ 0x943d, 0x9006, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, -+ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, -+ 0x0001, 0x0c80, 0x00e6, 0x2071, 0x19b8, 0x7033, 0x0000, 0x7004, -+ 0x9086, 0x0003, 0x0158, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, -+ 0x1118, 0x7007, 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, -+ 0x00f6, 0x00e6, 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x19b8, 0x2c10, 0x7648, 0x2660, 0x2678, 0x8cff, -+ 0x0518, 0x2200, 0x9c06, 0x11e0, 0x7048, 0x9c36, 0x1110, 0x660c, -+ 0x764a, 0x7044, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, -+ 0x7046, 0x0010, 0x7047, 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, -+ 0x19b8, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0x9584, 0x6010, -+ 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x9206, 0x1904, 0x957f, 0x7030, -+ 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0x955b, -+ 0x080c, 0x8fb7, 0x68c3, 0x0000, 0x080c, 0x94a2, 0x7033, 0x0000, -+ 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, -+ 0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x2069, 0x0100, -+ 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, -+ 0x1110, 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, -+ 0x0118, 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, -+ 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, -+ 0x080c, 0xba4b, 0x1158, 0x080c, 0x303b, 0x080c, 0xba5c, 0x11f0, -+ 0x080c, 0xa58f, 0x00d8, 0x080c, 0x94a2, 0x08c0, 0x080c, 0xba5c, -+ 0x1118, 0x080c, 0xa58f, 0x0090, 0x6014, 0x2048, 0x080c, 0xb845, -+ 0x0168, 0x6020, 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, -+ 0xa877, 0x0000, 0x080c, 0x698a, 0x080c, 0xba36, 0x080c, 0xbcd3, -+ 0x080c, 0x9c21, 0x080c, 0x9378, 0x00ce, 0x0804, 0x9504, 0x2c78, -+ 0x600c, 0x2060, 0x0804, 0x9504, 0x012e, 0x000e, 0x002e, 0x006e, -+ 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, -+ 0x0006, 0x1d20, 0x080c, 0xd21e, 0x0c08, 0x00d6, 0x080c, 0x8d6b, -+ 0x7003, 0x0200, 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, -+ 0x2099, 0x195a, 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, -+ 0x4003, 0x7023, 0x0004, 0x7027, 0x7878, 0x080c, 0x8f87, 0x00de, -+ 0x0005, 0x080c, 0x8d6b, 0x700b, 0x0800, 0x7814, 0x9084, 0xff00, -+ 0x700e, 0x7814, 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, 0x7860, -+ 0x9084, 0x00ff, 0x9085, 0x0200, 0x7002, 0x7860, 0x9084, 0xff00, -+ 0x8007, 0x7006, 0x60c2, 0x0804, 0x8f87, 0x00b6, 0x00d6, 0x0016, -+ 0x00d6, 0x2f68, 0x2009, 0x0035, 0x080c, 0xbed9, 0x00de, 0x1904, -+ 0x9632, 0x080c, 0x8d20, 0x7003, 0x1300, 0x782c, 0x080c, 0x973d, -+ 0x2068, 0x6820, 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, -+ 0x080c, 0x9b66, 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, -+ 0x700f, 0xfffe, 0x0498, 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, -+ 0x700f, 0xfffd, 0x0458, 0x9284, 0xff80, 0x0180, 0x9286, 0x0080, -+ 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, -+ 0x2b5c, 0xb810, 0x700a, 0xb814, 0x700e, 0x00c0, 0xb884, 0x700e, -+ 0x00a8, 0x080c, 0x9b66, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, -+ 0x007e, 0x0250, 0x00d6, 0x2069, 0x181e, 0x2d04, 0x700a, 0x8d68, -+ 0x2d04, 0x700e, 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, -+ 0x783c, 0x7016, 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x8f87, -+ 0x00be, 0x0005, 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, -+ 0x00be, 0x0005, 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, -+ 0x01c0, 0x9186, 0x0003, 0x0904, 0x96b0, 0x9186, 0x0005, 0x0904, -+ 0x9698, 0x9186, 0x0004, 0x05f0, 0x9186, 0x0008, 0x0904, 0x96a1, -+ 0x7807, 0x0037, 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0x971a, -+ 0x0005, 0x080c, 0x96db, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, -+ 0x4000, 0x6800, 0x6a44, 0xd2fc, 0x11f8, 0x0002, 0x9679, 0x9684, -+ 0x967b, 0x9684, 0x9680, 0x9679, 0x9679, 0x9684, 0x9684, 0x9684, -+ 0x9684, 0x9679, 0x9679, 0x9679, 0x9679, 0x9679, 0x9684, 0x9679, -+ 0x9684, 0x080c, 0x0d65, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, -+ 0x900e, 0x0010, 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, -+ 0x0804, 0x96d4, 0x080c, 0x96db, 0x00d6, 0x0026, 0x792c, 0x2168, -+ 0x2009, 0x4000, 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04e0, -+ 0x080c, 0x96db, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, -+ 0x0498, 0x04c9, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, -+ 0x9286, 0x0005, 0x0118, 0x9286, 0x0002, 0x1108, 0x900e, 0x0420, -+ 0x0451, 0x00d6, 0x0026, 0x792c, 0x2168, 0x6814, 0x0096, 0x2048, -+ 0xa9ac, 0xa834, 0x9112, 0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, -+ 0x7226, 0x792c, 0x9180, 0x0011, 0x2004, 0xd0fc, 0x1148, 0x9180, -+ 0x0000, 0x2004, 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, -+ 0x2009, 0x4000, 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, -+ 0x00de, 0x0804, 0x8f87, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, -+ 0x080c, 0x8d6b, 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, -+ 0x710e, 0x7810, 0x2058, 0xb8a0, 0x080c, 0x9b66, 0x1118, 0x9092, -+ 0x007e, 0x0268, 0x00d6, 0x2069, 0x181e, 0x2d2c, 0x8d68, 0x2d34, -+ 0x90d8, 0x1000, 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, -+ 0xbc84, 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, 0x8d6b, 0x7003, 0x0100, 0x782c, 0x700a, -+ 0x7814, 0x700e, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f87, 0x080c, -+ 0x8d17, 0x7003, 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, -+ 0x782c, 0x7012, 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, -+ 0x701a, 0x60c3, 0x0010, 0x0804, 0x8f87, 0x00e6, 0x2071, 0x0240, -+ 0x0006, 0x00f6, 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8c4, 0xd084, -+ 0x0120, 0x7850, 0x702a, 0x784c, 0x702e, 0x00be, 0x00fe, 0x000e, -+ 0x00ee, 0x0005, 0x080c, 0x8d62, 0x7003, 0x0100, 0x782c, 0x700a, -+ 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x8f87, 0x00a9, 0x7914, -+ 0x712a, 0x60c3, 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x27a2, -+ 0x0228, 0x2011, 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, -+ 0x8faa, 0x080c, 0x8202, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, -+ 0x7860, 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, 0x97fa, 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, 0x1983, 0x210c, 0x009e, 0x918d, -+ 0x0092, 0x0010, 0x2009, 0x0096, 0x60ab, 0x0036, 0x0026, 0x2110, -+ 0x900e, 0x080c, 0x287c, 0x002e, 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, 0x00f6, 0x00e6, -+ 0x00d6, 0x00c6, 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, -+ 0x2071, 0x19b8, 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0x98a5, -+ 0x7030, 0x9c06, 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, -+ 0x987c, 0x080c, 0x8fb7, 0x68c3, 0x0000, 0x080c, 0x94a2, 0x7033, -+ 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, -+ 0x2001, 0x0100, 0x080c, 0x2833, 0x9006, 0x080c, 0x2833, 0x2069, -+ 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, -+ 0x9c36, 0x1110, 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, -+ 0x9f36, 0x0118, 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, -+ 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, -+ 0x0000, 0x080c, 0xba4b, 0x1158, 0x080c, 0x303b, 0x080c, 0xba5c, -+ 0x11f0, 0x080c, 0xa58f, 0x00d8, 0x080c, 0x94a2, 0x08c0, 0x080c, -+ 0xba5c, 0x1118, 0x080c, 0xa58f, 0x0090, 0x6014, 0x2048, 0x080c, -+ 0xb845, 0x0168, 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, -+ 0xab7a, 0xa877, 0x0000, 0x080c, 0x6996, 0x080c, 0xba36, 0x080c, -+ 0xbcd3, 0x080c, 0x9c21, 0x080c, 0x9378, 0x00ce, 0x0804, 0x982d, -+ 0x2c78, 0x600c, 0x2060, 0x0804, 0x982d, 0x7013, 0x0000, 0x700f, -+ 0x0000, 0x012e, 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, -+ 0x00fe, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xd21e, -+ 0x08f0, 0x00f6, 0x0036, 0x2079, 0x0380, 0x7b18, 0xd3bc, 0x1de8, -+ 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x003e, 0x00fe, 0x0005, -+ 0x0016, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, -+ 0x1188, 0x2001, 0x0015, 0x0c29, 0x2009, 0x1000, 0x2001, 0x0382, -+ 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x0120, 0x8109, 0x1db0, -+ 0x080c, 0x0d65, 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, -+ 0x0007, 0x9086, 0x0003, 0x1120, 0x2001, 0x0380, 0x2003, 0x0001, -+ 0x0005, 0x0156, 0x0016, 0x0026, 0x00e6, 0x900e, 0x2071, 0x19b8, -+ 0x0469, 0x0106, 0x0190, 0x7004, 0x9086, 0x0003, 0x0148, 0x20a9, -+ 0x1000, 0x6044, 0xd0fc, 0x01d8, 0x1f04, 0x9901, 0x080c, 0x0d65, -+ 0x080c, 0x98c8, 0x6044, 0xd0fc, 0x0190, 0x7030, 0x9c06, 0x1148, -+ 0x080c, 0x8874, 0x6044, 0xd0dc, 0x0150, 0xc0dc, 0x6046, 0x700a, -+ 0x7042, 0x704c, 0x9c06, 0x190c, 0x0d65, 0x080c, 0x88d1, 0x010e, -+ 0x1919, 0x00ee, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x0382, -+ 0x2004, 0x9084, 0x0007, 0x9086, 0x0003, 0x0005, 0x0126, 0x2091, -+ 0x2400, 0x7808, 0xd0a4, 0x190c, 0x0d5e, 0xd09c, 0x0128, 0x7820, -+ 0x908c, 0xf000, 0x11b8, 0x0012, 0x012e, 0x0005, 0x994e, 0x998c, -+ 0x99b3, 0x99e3, 0x99f3, 0x9a04, 0x9a13, 0x9a21, 0x9a32, 0x9a36, -+ 0x994e, 0x994e, 0x994e, 0x994e, 0x994e, 0x994e, 0x080c, 0x0d65, -+ 0x012e, 0x0005, 0x2060, 0x6044, 0xd0bc, 0x0140, 0xc0bc, 0x6046, -+ 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d65, 0x0012, 0x012e, 0x0005, -+ 0x9973, 0x9975, 0x9973, 0x997b, 0x9973, 0x9973, 0x9973, 0x9973, -+ 0x9973, 0x9975, 0x9973, 0x9975, 0x9973, 0x9975, 0x9973, 0x9973, -+ 0x9973, 0x9975, 0x9973, 0x080c, 0x0d65, 0x2009, 0x0013, 0x080c, -+ 0x9c85, 0x012e, 0x0005, 0x6014, 0x2048, 0xa87c, 0xd0dc, 0x0130, -+ 0x080c, 0x83c0, 0x080c, 0x9be7, 0x012e, 0x0005, 0x2009, 0x0049, -+ 0x080c, 0x9c85, 0x012e, 0x0005, 0x080c, 0x98c8, 0x2001, 0x19dd, -+ 0x2003, 0x0000, 0x7030, 0x9065, 0x090c, 0x0d65, 0x7034, 0x9092, -+ 0x00c8, 0x1258, 0x8000, 0x7036, 0x7004, 0x9086, 0x0003, 0x0110, -+ 0x7007, 0x0000, 0x781f, 0x0808, 0x0040, 0x080c, 0xd610, 0x6003, -+ 0x0001, 0x2009, 0x0014, 0x080c, 0x9c85, 0x781f, 0x0100, 0x080c, -+ 0x98e4, 0x012e, 0x0005, 0x080c, 0x98c8, 0x714c, 0x81ff, 0x1128, -+ 0x2011, 0x19e0, 0x2013, 0x0000, 0x0400, 0x2061, 0x0100, 0x7150, -+ 0x9192, 0x7530, 0x12b8, 0x8108, 0x7152, 0x714c, 0x9188, 0x0008, -+ 0x210c, 0x918e, 0x0006, 0x1138, 0x6014, 0x9084, 0x1984, 0x9085, -+ 0x0012, 0x6016, 0x0050, 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, -+ 0x6016, 0x0018, 0x706c, 0xc085, 0x706e, 0x781f, 0x0200, 0x080c, -+ 0x98e4, 0x012e, 0x0005, 0x080c, 0x98c8, 0x714c, 0x2160, 0x6003, -+ 0x0003, 0x2009, 0x004a, 0x080c, 0x9c85, 0x781f, 0x0200, 0x080c, -+ 0x98e4, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, -+ 0x6003, 0x0003, 0x080c, 0x98c8, 0x080c, 0x1c02, 0x781f, 0x0400, -+ 0x080c, 0x98e4, 0x012e, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, -+ 0x2060, 0x080c, 0x98c8, 0x080c, 0x1c4a, 0x781f, 0x0400, 0x080c, -+ 0x98e4, 0x012e, 0x0005, 0x7030, 0x9065, 0x0148, 0x6044, 0xc0bc, -+ 0x6046, 0x7104, 0x9186, 0x0003, 0x0110, 0x080c, 0x8937, 0x012e, -+ 0x0005, 0x00f6, 0x703c, 0x9086, 0x0002, 0x0148, 0x704c, 0x907d, -+ 0x0130, 0x7844, 0xc0bc, 0x7846, 0x080c, 0x8ee1, 0x0000, 0x00fe, -+ 0x012e, 0x0005, 0x080c, 0x7158, 0x012e, 0x0005, 0x080c, 0x0d65, -+ 0x0005, 0x00e6, 0x2071, 0x19b8, 0x6044, 0xc0bc, 0x6046, 0xd0fc, -+ 0x01b8, 0x704c, 0x9c06, 0x1190, 0x2019, 0x0001, 0x080c, 0x9286, -+ 0x704f, 0x0000, 0x2001, 0x0109, 0x2004, 0xd08c, 0x1138, 0x2001, -+ 0x0108, 0x2004, 0xd0bc, 0x1110, 0x703f, 0x0000, 0x080c, 0x94b8, -+ 0x00ee, 0x0005, 0x0026, 0x7010, 0x9c06, 0x1178, 0x080c, 0x9378, -+ 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015, 0x0120, 0x7212, 0x600f, -+ 0x0000, 0x0010, 0x7212, 0x720e, 0x9006, 0x002e, 0x0005, 0x0026, -+ 0x7020, 0x9c06, 0x1178, 0x080c, 0x9378, 0x6044, 0xc0fc, 0x6046, -+ 0x600c, 0x9015, 0x0120, 0x7222, 0x600f, 0x0000, 0x0010, 0x7222, -+ 0x721e, 0x9006, 0x002e, 0x0005, 0x00d6, 0x0036, 0x7830, 0x9c06, -+ 0x1558, 0x2069, 0x0100, 0x68c0, 0x9005, 0x01f8, 0x080c, 0x820b, -+ 0x080c, 0x8fb7, 0x68c3, 0x0000, 0x080c, 0x94a2, 0x2069, 0x0140, -+ 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, 0x2833, -+ 0x9006, 0x080c, 0x2833, 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, -+ 0x6827, 0x0001, 0x9085, 0x0001, 0x0038, 0x7808, 0xc0ad, 0x780a, -+ 0x6003, 0x0009, 0x630a, 0x9006, 0x003e, 0x00de, 0x0005, 0x0016, -+ 0x0026, 0x0036, 0x6100, 0x2019, 0x0100, 0x2001, 0x0382, 0x2004, -+ 0xd09c, 0x0190, 0x00c6, 0x0126, 0x2091, 0x2800, 0x0016, 0x0036, -+ 0x080c, 0x992e, 0x003e, 0x001e, 0x012e, 0x00ce, 0x6200, 0x2200, -+ 0x9106, 0x0d58, 0x2200, 0x0010, 0x8319, 0x1d38, 0x003e, 0x002e, -+ 0x001e, 0x0005, 0x00d6, 0x0156, 0x080c, 0x8d6b, 0x7a14, 0x82ff, -+ 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, 0x0490, -+ 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, 0x1800, 0x901e, 0x6800, -+ 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, 0x70b7, 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, 0x9b0e, -+ 0x60c3, 0x0020, 0x080c, 0x8f87, 0x015e, 0x00de, 0x0005, 0x0156, -+ 0x080c, 0x8d6b, 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, 0x0118, -+ 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, -+ 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, 0x001c, 0x700f, 0x0001, -+ 0x2011, 0x198e, 0x2204, 0x8007, 0x701a, 0x8210, 0x2204, 0x8007, -+ 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, 0x2001, -+ 0x181e, 0x2004, 0x7022, 0x2001, 0x181f, 0x2004, 0x7026, 0x0030, -+ 0x2001, 0x1817, 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, 0x0004, -+ 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, 0x0256, -+ 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804, 0x8f87, 0x0006, 0x2001, -+ 0x1836, 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, 0x080c, -+ 0x9339, 0x2011, 0x0002, 0x080c, 0x9343, 0x080c, 0x9206, 0x0036, -+ 0x901e, 0x080c, 0x9286, 0x003e, 0x0005, 0x2071, 0x1883, 0x7000, -+ 0x9005, 0x0140, 0x2001, 0x0812, 0x2071, 0x1800, 0x7072, 0x7076, -+ 0x7067, 0xffd4, 0x2071, 0x1800, 0x7070, 0x7052, 0x7057, 0x1ddc, -+ 0x0005, 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7550, -+ 0x9582, 0x0010, 0x0608, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, -+ 0x0148, 0x9ce0, 0x001c, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, -+ 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c, -+ 0x7064, 0x9502, 0x1230, 0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, -+ 0x0005, 0x7057, 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, -+ 0x1800, 0x7550, 0x9582, 0x0010, 0x0600, 0x7054, 0x2060, 0x6000, -+ 0x9086, 0x0000, 0x0148, 0x9ce0, 0x001c, 0x7064, 0x9c02, 0x1208, -+ 0x0cb0, 0x2061, 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, -+ 0x9ca8, 0x001c, 0x7064, 0x9502, 0x1228, 0x7556, 0x9085, 0x0001, -+ 0x00ee, 0x0005, 0x7057, 0x1ddc, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, -+ 0x1ddc, 0x0a0c, 0x0d65, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1a0c, -+ 0x0d65, 0x9006, 0x6006, 0x600a, 0x600e, 0x6016, 0x601a, 0x6012, -+ 0x6023, 0x0000, 0x6003, 0x0000, 0x601e, 0x605e, 0x6062, 0x6026, -+ 0x602a, 0x602e, 0x6032, 0x6036, 0x603a, 0x603e, 0x604a, 0x6046, -+ 0x6042, 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, 0x0005, 0x9006, -+ 0x600e, 0x6016, 0x601a, 0x6012, 0x6022, 0x6002, 0x601e, 0x605e, -+ 0x6062, 0x604a, 0x6046, 0x2061, 0x1800, 0x6050, 0x8000, 0x6052, -+ 0x0005, 0x0006, 0x6000, 0x9086, 0x0000, 0x01d0, 0x601c, 0xd084, -+ 0x190c, 0x1914, 0x6023, 0x0007, 0x2001, 0x1957, 0x2004, 0x0006, -+ 0x9082, 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, 0x080c, 0xd4ce, -+ 0x604b, 0x0000, 0x6044, 0xd0fc, 0x1129, 0x9006, 0x6046, 0x6016, -+ 0x000e, 0x0005, 0x080c, 0x9926, 0x0106, 0x190c, 0x98c8, 0x2001, -+ 0x19cb, 0x2004, 0x9c06, 0x1130, 0x0036, 0x2019, 0x0001, 0x080c, -+ 0x9286, 0x003e, 0x080c, 0x94b8, 0x010e, 0x190c, 0x98e4, 0x0005, -+ 0x00e6, 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7550, 0x9582, -+ 0x0001, 0x0608, 0x7054, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, -+ 0x9ce0, 0x001c, 0x7064, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, -+ 0x0c98, 0x6003, 0x0008, 0x8529, 0x7552, 0x9ca8, 0x001c, 0x7064, -+ 0x9502, 0x1230, 0x7556, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, -+ 0x7057, 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, -+ 0x0002, 0x9c99, 0x9ca3, 0x9cbe, 0x9cd9, 0xbfab, 0xbfc8, 0xbfe3, -+ 0x9c99, 0x9ca3, 0x9c99, 0x9cf5, 0x9c99, 0x9c99, 0x9c99, 0x9c99, -+ 0x9c99, 0x9186, 0x0013, 0x1130, 0x6044, 0xd0fc, 0x0110, 0x080c, -+ 0x8874, 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, -+ 0x0d65, 0x0013, 0x006e, 0x0005, 0x9cbc, 0xa404, 0xa5d6, 0x9cbc, -+ 0xa664, 0x9fbe, 0x9cbc, 0x9cbc, 0xa386, 0xac09, 0x9cbc, 0x9cbc, -+ 0x9cbc, 0x9cbc, 0x9cbc, 0x9cbc, 0x080c, 0x0d65, 0x0066, 0x6000, -+ 0x90b2, 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x006e, 0x0005, 0x9cd7, -+ 0xb214, 0x9cd7, 0x9cd7, 0x9cd7, 0x9cd7, 0x9cd7, 0x9cd7, 0xb1b9, -+ 0xb397, 0x9cd7, 0xb251, 0xb2d5, 0xb251, 0xb2d5, 0x9cd7, 0x080c, -+ 0x0d65, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d65, 0x6000, 0x0002, -+ 0x9cf3, 0xac53, 0xacea, 0xae6a, 0xaed9, 0x9cf3, 0x9cf3, 0x9cf3, -+ 0xac22, 0xb13a, 0xb13d, 0x9cf3, 0x9cf3, 0x9cf3, 0x9cf3, 0xb16d, -+ 0x9cf3, 0x9cf3, 0x9cf3, 0x080c, 0x0d65, 0x0066, 0x6000, 0x90b2, -+ 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x006e, 0x0005, 0x9d0e, 0x9d0e, -+ 0x9d4c, 0x9deb, 0x9e6b, 0x9d0e, 0x9d0e, 0x9d0e, 0x9d10, 0x9d0e, -+ 0x9d0e, 0x9d0e, 0x9d0e, 0x9d0e, 0x9d0e, 0x9d0e, 0x080c, 0x0d65, -+ 0x9186, 0x004c, 0x0560, 0x9186, 0x0003, 0x190c, 0x0d65, 0x0096, -+ 0x601c, 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, -+ 0xa87c, 0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac, 0xa836, 0xa8b0, -+ 0xa83a, 0x9006, 0xa846, 0xa84a, 0xa884, 0x9092, 0x199a, 0x0210, -+ 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, -+ 0x080c, 0x1a64, 0x2009, 0x8030, 0x080c, 0x8518, 0x0005, 0x6010, -+ 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, 0x9e8d, 0x080c, -+ 0xbf79, 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, -+ 0x1800, 0x7a8c, 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, -+ 0x0018, 0xac78, 0xc4fc, 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, 0x9db3, 0x9db3, -+ 0x9dae, 0x9db1, 0x9db3, 0x9dab, 0x9d9e, 0x9d9e, 0x9d9e, 0x9d9e, -+ 0x9d9e, 0x9d9e, 0x9d9e, 0x9d9e, 0x9d9e, 0x9d9e, 0x00fe, 0x00ee, -+ 0x00de, 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e, -+ 0x00de, 0x080c, 0x0d65, 0x080c, 0xa845, 0x0028, 0x080c, 0xa968, -+ 0x0010, 0x080c, 0xaa57, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, -+ 0x001e, 0x2c00, 0xa896, 0x000e, 0x080c, 0x9f4b, 0x0530, 0xa804, -+ 0xa80e, 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, -+ 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, -+ 0xacd4, 0xadd8, 0x2031, 0x0000, 0x2041, 0x1280, 0x080c, 0xa0f5, -+ 0x0160, 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005, -+ 0x00fe, 0x009e, 0x00de, 0x0804, 0x9be7, 0x2001, 0x002c, 0x900e, -+ 0x080c, 0x9fb1, 0x0c70, 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016, -+ 0x0158, 0x91b2, 0x0047, 0x0a0c, 0x0d65, 0x91b2, 0x0050, 0x1a0c, -+ 0x0d65, 0x9182, 0x0047, 0x0042, 0x080c, 0x9ab7, 0x0120, 0x9086, -+ 0x0002, 0x0904, 0x9d4c, 0x0005, 0x9e0d, 0x9e0d, 0x9e0f, 0x9e41, -+ 0x9e0d, 0x9e0d, 0x9e0d, 0x9e0d, 0x9e54, 0x080c, 0x0d65, 0x00d6, -+ 0x0016, 0x0096, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, -+ 0x01c0, 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, -+ 0x2001, 0x0000, 0x900e, 0x080c, 0x9fb1, 0x080c, 0x9be7, 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, 0x88d1, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, -+ 0xb847, 0x0120, 0xa87b, 0x0006, 0x080c, 0x6996, 0x009e, 0x00de, -+ 0x080c, 0x9be7, 0x0804, 0x8936, 0x080c, 0x88d1, 0x080c, 0x3006, -+ 0x080c, 0xbf76, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xb847, -+ 0x0120, 0xa87b, 0x0029, 0x080c, 0x6996, 0x009e, 0x00de, 0x080c, -+ 0x9be7, 0x0804, 0x8936, 0x9182, 0x0047, 0x0002, 0x9e7b, 0x9e7d, -+ 0x9e7b, 0x9e7b, 0x9e7b, 0x9e7b, 0x9e7b, 0x9e7b, 0x9e7b, 0x9e7b, -+ 0x9e7b, 0x9e7b, 0x9e7d, 0x080c, 0x0d65, 0x00d6, 0x0096, 0x080c, -+ 0x1595, 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, -+ 0x6996, 0x009e, 0x00de, 0x0804, 0x9be7, 0x0026, 0x0036, 0x0056, -+ 0x0066, 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x1022, 0x000e, -+ 0x090c, 0x0d65, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, -+ 0x900e, 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, 0x798c, -+ 0x9188, 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, -+ 0x2001, 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, -+ 0x0034, 0x1228, 0x2011, 0x001f, 0x080c, 0xb41a, 0x04c0, 0x2130, -+ 0x2009, 0x0034, 0x2011, 0x001f, 0x080c, 0xb41a, 0x96b2, 0x0034, -+ 0xb004, 0x904d, 0x0110, 0x080c, 0x0fd4, 0x080c, 0x1022, 0x01d0, -+ 0x8528, 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, -+ 0x003d, 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xb41a, 0x00b8, -+ 0x96b2, 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, -+ 0xb41a, 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, 0x6996, 0x000e, -+ 0x2048, 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, -+ 0x003e, 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, -+ 0x1022, 0x000e, 0x090c, 0x0d65, 0xa960, 0x21e8, 0xa95c, 0x9188, -+ 0x0019, 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, -+ 0x2079, 0x1800, 0x798c, 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, 0x6996, 0x009e, -+ 0x00fe, 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, -+ 0x2001, 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, -+ 0x0200, 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, -+ 0x2021, 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, 0x2011, 0x0020, -+ 0x2018, 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, 0x1022, 0x2900, -+ 0x009e, 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x0002, 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, -+ 0x9102, 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, -+ 0x1228, 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, -+ 0xa800, 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, -+ 0x3300, 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, 0x9085, 0x0080, -+ 0x7816, 0x2e98, 0x2310, 0x84ff, 0x0904, 0x9f60, 0x0804, 0x9f62, -+ 0x9085, 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, -+ 0x0005, 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, -+ 0x080c, 0x698a, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, -+ 0x1118, 0x080c, 0x9be7, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0d65, -+ 0x080c, 0x9be7, 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, -+ 0xb847, 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, -+ 0x009e, 0x0804, 0x9be7, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, -+ 0x0200, 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8c7, 0x0000, 0x00be, -+ 0x6014, 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, -+ 0xab32, 0x080c, 0x9be7, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, -+ 0x1d48, 0x0cc8, 0x0006, 0x0016, 0x080c, 0xbf61, 0x0188, 0x6014, -+ 0x9005, 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, 0x604b, 0x0000, -+ 0x2009, 0x0022, 0x080c, 0xa3dc, 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, 0x9be7, 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, 0xb41a, 0x080c, 0xb847, 0x0140, 0x6014, 0x2048, 0xa807, -+ 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0x9be7, 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, 0xb41a, 0x009e, 0x080c, 0xb847, 0x0148, 0xa804, -+ 0x9005, 0x1158, 0xa807, 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, -+ 0x080c, 0x9be7, 0x009e, 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, -+ 0x8007, 0x9086, 0x0100, 0x1118, 0x080c, 0xa58f, 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, -+ 0x1266, 0x0019, 0x0d08, 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, -+ 0x1022, 0x000e, 0x01b0, 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, -+ 0x0006, 0xae6a, 0x2800, 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, -+ 0xac96, 0xad9a, 0x0086, 0x2940, 0x080c, 0x110c, 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, -+ 0x604b, 0x0000, 0x2c68, 0x0016, 0x2009, 0x0035, 0x080c, 0xbed9, -+ 0x001e, 0x1158, 0x622c, 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, -+ 0x0003, 0x0130, 0x9386, 0x0006, 0x0128, 0x080c, 0x9be7, 0x0020, -+ 0x0039, 0x0010, 0x080c, 0xa211, 0x002e, 0x00de, 0x00ee, 0x0005, -+ 0x0096, 0x6814, 0x2048, 0x9186, 0x0015, 0x0904, 0xa1f0, 0x918e, -+ 0x0016, 0x1904, 0xa20f, 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, -+ 0x0120, 0x9186, 0x0300, 0x1904, 0xa1ca, 0x89ff, 0x1138, 0x6800, -+ 0x9086, 0x000f, 0x0904, 0xa1ac, 0x0804, 0xa20d, 0x6808, 0x9086, -+ 0xffff, 0x1904, 0xa1f2, 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, -+ 0x1128, 0xa83c, 0xa940, 0x9105, 0x1904, 0xa1f2, 0x6824, 0xd0b4, -+ 0x1904, 0xa1f2, 0x080c, 0xba36, 0x6864, 0xa882, 0xa87c, 0xc0dc, -+ 0xc0f4, 0xc0d4, 0xa87e, 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, -+ 0x080c, 0x8419, 0xa884, 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, -+ 0x002e, 0x1138, 0x00c6, 0x2d60, 0x080c, 0xb56d, 0x00ce, 0x0804, -+ 0xa20d, 0x00c6, 0xa868, 0xd0fc, 0x1118, 0x080c, 0x5d56, 0x0010, -+ 0x080c, 0x60fb, 0x00ce, 0x1904, 0xa1f2, 0x00c6, 0x2d60, 0x080c, -+ 0x9be7, 0x00ce, 0x0804, 0xa20d, 0x00c6, 0x080c, 0x9c58, 0x0198, -+ 0x6017, 0x0000, 0x6810, 0x6012, 0x080c, 0xbcdb, 0x6023, 0x0003, -+ 0x6904, 0x00c6, 0x2d60, 0x080c, 0x9be7, 0x00ce, 0x080c, 0x9c85, -+ 0x00ce, 0x0804, 0xa20d, 0x2001, 0x1959, 0x2004, 0x684a, 0x00ce, -+ 0x0804, 0xa20d, 0x7008, 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, -+ 0x2058, 0xb900, 0xc1bc, 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, -+ 0x0003, 0x080c, 0xbf1b, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, -+ 0x0002, 0x2009, 0x8020, 0x080c, 0x84d1, 0x00ce, 0x0430, 0x700c, -+ 0x9086, 0x2a00, 0x1138, 0x2001, 0x1959, 0x2004, 0x684a, 0x00e8, -+ 0x04c1, 0x00e8, 0x89ff, 0x090c, 0x0d65, 0x00c6, 0x00d6, 0x2d60, -+ 0xa867, 0x0103, 0xa87b, 0x0003, 0x080c, 0x67ac, 0x080c, 0xba36, -+ 0x080c, 0x9c21, 0x0026, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c, -+ 0x639b, 0x00be, 0x002e, 0x00de, 0x00ce, 0x080c, 0x9be7, 0x009e, -+ 0x0005, 0x9186, 0x0015, 0x1128, 0x2001, 0x1959, 0x2004, 0x684a, -+ 0x0068, 0x918e, 0x0016, 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, -+ 0xd4ce, 0x080c, 0x83c0, 0x080c, 0x9be7, 0x00ce, 0x080c, 0x9be7, -+ 0x0005, 0x0026, 0x0036, 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, -+ 0x0130, 0x2001, 0x1959, 0x2004, 0x684a, 0x0804, 0xa28b, 0x00c6, -+ 0x2d60, 0x080c, 0xb445, 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, -+ 0x00c6, 0x2d00, 0x2060, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, -+ 0x8023, 0x080c, 0x84d1, 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, -+ 0x01a8, 0x89ff, 0x090c, 0x0d65, 0x6800, 0x9086, 0x0004, 0x1190, -+ 0xa87c, 0xd0ac, 0x0178, 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, -+ 0xc0fc, 0xa882, 0x2001, 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, -+ 0x6832, 0x00e0, 0xa87c, 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, -+ 0xd0f4, 0x1d48, 0xa838, 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, -+ 0x1d68, 0x7024, 0x9306, 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, -+ 0x683e, 0x7024, 0x683a, 0x2001, 0x0005, 0x6832, 0x080c, 0xbbc5, -+ 0x080c, 0x8936, 0x0010, 0x080c, 0x9be7, 0x004e, 0x003e, 0x002e, -+ 0x0005, 0x00e6, 0x00d6, 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, -+ 0x00b6, 0x2258, 0xba10, 0x00be, 0x9206, 0x1904, 0xa2f6, 0x700c, -+ 0x6210, 0x00b6, 0x2258, 0xba14, 0x00be, 0x9206, 0x1904, 0xa2f6, -+ 0x6038, 0x2068, 0x6824, 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, -+ 0x0904, 0xa2f6, 0x9286, 0x0002, 0x0904, 0xa2f6, 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, 0xb847, 0x090c, 0x0d65, 0xa87b, -+ 0x0003, 0x009e, 0x080c, 0xbf1b, 0x6007, 0x0085, 0x6003, 0x000b, -+ 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x84d1, 0x00ce, 0x0030, -+ 0x6038, 0x2070, 0x2001, 0x1959, 0x2004, 0x704a, 0x080c, 0x9be7, -+ 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, -+ 0xabdf, 0x002e, 0x003e, 0x015e, 0x009e, 0x1904, 0xa365, 0x0096, -+ 0x0156, 0x0036, 0x0026, 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, -+ 0x20a9, 0x0004, 0x080c, 0xabdf, 0x002e, 0x003e, 0x015e, 0x009e, -+ 0x15a0, 0x7238, 0xba0a, 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, -+ 0xa804, 0x9005, 0x1128, 0x00fe, 0x009e, 0x00be, 0x0804, 0x9ff6, -+ 0x0096, 0x2048, 0xaa12, 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, -+ 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, -+ 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, -+ 0x1266, 0x080c, 0xa0f5, 0x0130, 0x00fe, 0x009e, 0x080c, 0x9be7, -+ 0x00be, 0x0005, 0x080c, 0xa58f, 0x0cb8, 0x2b78, 0x00f6, 0x080c, -+ 0x3006, 0x080c, 0xbf76, 0x00fe, 0x00c6, 0x080c, 0x9b91, 0x2f00, -+ 0x6012, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, -+ 0x0001, 0x2001, 0x0007, 0x080c, 0x61c1, 0x080c, 0x61ed, 0x080c, -+ 0x84d8, 0x080c, 0x8936, 0x00ce, 0x0804, 0xa338, 0x2100, 0x91b2, -+ 0x0053, 0x1a0c, 0x0d65, 0x91b2, 0x0040, 0x1a04, 0xa3ee, 0x0002, -+ 0xa3dc, 0xa3dc, 0xa3d2, 0xa3dc, 0xa3dc, 0xa3dc, 0xa3d0, 0xa3d0, -+ 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, -+ 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, -+ 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3dc, -+ 0xa3d0, 0xa3dc, 0xa3dc, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, -+ 0xa3d2, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, -+ 0xa3d0, 0xa3d0, 0xa3dc, 0xa3dc, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, -+ 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3d0, 0xa3dc, 0xa3d0, 0xa3d0, -+ 0x080c, 0x0d65, 0x0066, 0x00b6, 0x6610, 0x2658, 0xb8c4, 0xc08c, -+ 0xb8c6, 0x00be, 0x006e, 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, -+ 0x0032, 0x0118, 0x080c, 0x84d8, 0x0010, 0x080c, 0x84d1, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x8936, 0x012e, 0x0005, 0x2600, 0x0002, -+ 0xa402, 0xa402, 0xa402, 0xa3dc, 0xa3dc, 0xa402, 0xa402, 0xa402, -+ 0xa402, 0xa3dc, 0xa402, 0xa3dc, 0xa402, 0xa3dc, 0xa402, 0xa402, -+ 0xa402, 0xa402, 0x080c, 0x0d65, 0x6004, 0x90b2, 0x0053, 0x1a0c, -+ 0x0d65, 0x91b6, 0x0013, 0x0904, 0xa4d9, 0x91b6, 0x0027, 0x1904, -+ 0xa485, 0x080c, 0x8874, 0x6004, 0x080c, 0xba4b, 0x01b0, 0x080c, -+ 0xba5c, 0x01a8, 0x908e, 0x0021, 0x0904, 0xa482, 0x908e, 0x0022, -+ 0x1130, 0x080c, 0xa022, 0x0904, 0xa47e, 0x0804, 0xa47f, 0x908e, -+ 0x003d, 0x0904, 0xa482, 0x0804, 0xa478, 0x080c, 0x303b, 0x2001, -+ 0x0007, 0x080c, 0x61c1, 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, -+ 0x080c, 0xa58f, 0x9186, 0x007e, 0x1148, 0x2001, 0x1836, 0x2014, -+ 0xc285, 0x080c, 0x70b7, 0x1108, 0xc2ad, 0x2202, 0x080c, 0x98c8, -+ 0x0036, 0x0026, 0x2019, 0x0028, 0x2110, 0x080c, 0xd529, 0x002e, -+ 0x003e, 0x0016, 0x0026, 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, -+ 0x863b, 0x0076, 0x903e, 0x080c, 0x852a, 0x6010, 0x00b6, 0x905d, -+ 0x0100, 0x00be, 0x2c08, 0x080c, 0xcfc8, 0x007e, 0x003e, 0x002e, -+ 0x001e, 0x080c, 0x98e4, 0x080c, 0xbf76, 0x0016, 0x080c, 0xbcd3, -+ 0x080c, 0x9be7, 0x001e, 0x080c, 0x311a, 0x080c, 0x8936, 0x0030, -+ 0x080c, 0xbcd3, 0x080c, 0x9be7, 0x080c, 0x8936, 0x0005, 0x080c, -+ 0xa58f, 0x0cb0, 0x080c, 0xa5cb, 0x0c98, 0x9186, 0x0015, 0x0118, -+ 0x9186, 0x0016, 0x1140, 0x080c, 0x9ab7, 0x0d80, 0x9086, 0x0002, -+ 0x0904, 0xa5d6, 0x0c58, 0x9186, 0x0014, 0x1d40, 0x080c, 0x8874, -+ 0x6004, 0x908e, 0x0022, 0x1118, 0x080c, 0xa022, 0x09f8, 0x080c, -+ 0x3006, 0x080c, 0xbf76, 0x080c, 0xba4b, 0x1190, 0x080c, 0x303b, -+ 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xa58f, 0x9186, -+ 0x007e, 0x1128, 0x2001, 0x1836, 0x200c, 0xc185, 0x2102, 0x0800, -+ 0x080c, 0xba5c, 0x1120, 0x080c, 0xa58f, 0x0804, 0xa478, 0x6004, -+ 0x908e, 0x0032, 0x1160, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, -+ 0x0000, 0x080c, 0x33bc, 0x00fe, 0x00ee, 0x0804, 0xa478, 0x6004, -+ 0x908e, 0x0021, 0x0d40, 0x908e, 0x0022, 0x090c, 0xa58f, 0x0804, -+ 0xa478, 0x90b2, 0x0040, 0x1a04, 0xa578, 0x2008, 0x0002, 0xa521, -+ 0xa522, 0xa525, 0xa528, 0xa52b, 0xa52e, 0xa51f, 0xa51f, 0xa51f, -+ 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, -+ 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, -+ 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa531, 0xa53a, 0xa51f, -+ 0xa53b, 0xa53a, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa53a, -+ 0xa53a, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, 0xa51f, -+ 0xa51f, 0xa563, 0xa53a, 0xa51f, 0xa536, 0xa51f, 0xa51f, 0xa51f, -+ 0xa537, 0xa51f, 0xa51f, 0xa51f, 0xa53a, 0xa55e, 0xa51f, 0x080c, -+ 0x0d65, 0x00c0, 0x2001, 0x000b, 0x00e8, 0x2001, 0x0003, 0x00d0, -+ 0x2001, 0x0005, 0x00b8, 0x2001, 0x0001, 0x00a0, 0x2001, 0x0009, -+ 0x0088, 0x6003, 0x0005, 0x080c, 0x8936, 0x0058, 0x0018, 0x0010, -+ 0x080c, 0x61c1, 0x04b8, 0x080c, 0xbf79, 0x6003, 0x0004, 0x080c, -+ 0x8936, 0x0005, 0x080c, 0x61c1, 0x6003, 0x0002, 0x0036, 0x2019, -+ 0x185e, 0x2304, 0x9084, 0xff00, 0x1120, 0x2001, 0x1957, 0x201c, -+ 0x0040, 0x8007, 0x909a, 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, -+ 0x9318, 0x631a, 0x003e, 0x080c, 0x8936, 0x0c18, 0x080c, 0xbcd3, -+ 0x080c, 0x9be7, 0x08f0, 0x00e6, 0x00f6, 0x2071, 0x1894, 0x2079, -+ 0x0000, 0x080c, 0x33bc, 0x00fe, 0x00ee, 0x080c, 0x8874, 0x080c, -+ 0x9be7, 0x0878, 0x6003, 0x0002, 0x080c, 0xbf79, 0x0804, 0x8936, -+ 0x2600, 0x2008, 0x0002, 0xa58d, 0xa58d, 0xa58d, 0xa572, 0xa572, -+ 0xa58d, 0xa58d, 0xa58d, 0xa58d, 0xa572, 0xa58d, 0xa572, 0xa58d, -+ 0xa572, 0xa58d, 0xa58d, 0xa58d, 0xa58d, 0x080c, 0x0d65, 0x00e6, -+ 0x0096, 0x0026, 0x0016, 0x080c, 0xb847, 0x0568, 0x6014, 0x2048, -+ 0xa864, 0x9086, 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, -+ 0x080c, 0x512e, 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, -+ 0x0028, 0x2001, 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xbe40, -+ 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, 0x0d65, -+ 0x6604, 0x96b6, 0x004d, 0x1120, 0x080c, 0xbd5f, 0x0804, 0xa653, -+ 0x6604, 0x96b6, 0x0043, 0x1120, 0x080c, 0xbda8, 0x0804, 0xa653, -+ 0x6604, 0x96b6, 0x004b, 0x1120, 0x080c, 0xbdd4, 0x0804, 0xa653, -+ 0x6604, 0x96b6, 0x0033, 0x1120, 0x080c, 0xbcf5, 0x0804, 0xa653, -+ 0x6604, 0x96b6, 0x0028, 0x1120, 0x080c, 0xba95, 0x0804, 0xa653, -+ 0x6604, 0x96b6, 0x0029, 0x1120, 0x080c, 0xbad6, 0x0804, 0xa653, -+ 0x6604, 0x96b6, 0x001f, 0x1118, 0x080c, 0x9fcb, 0x04e0, 0x6604, -+ 0x96b6, 0x0000, 0x1118, 0x080c, 0xa2fc, 0x04a8, 0x6604, 0x96b6, -+ 0x0022, 0x1118, 0x080c, 0xa003, 0x0470, 0x6604, 0x96b6, 0x0035, -+ 0x1118, 0x080c, 0xa113, 0x0438, 0x6604, 0x96b6, 0x0039, 0x1118, -+ 0x080c, 0xa291, 0x0400, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, -+ 0xa03b, 0x00c8, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xa077, -+ 0x0090, 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0xa0a2, 0x0058, -+ 0x91b6, 0x0015, 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, -+ 0x00be, 0x0804, 0xa911, 0x00be, 0x0005, 0x080c, 0x9ca2, 0x0cd8, -+ 0xa670, 0xa673, 0xa670, 0xa6b7, 0xa670, 0xa845, 0xa91e, 0xa670, -+ 0xa670, 0xa8eb, 0xa670, 0xa8ff, 0x0096, 0x080c, 0x1595, 0x6014, -+ 0x2048, 0xa800, 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0x9be7, -+ 0xa001, 0xa001, 0x0005, 0x00e6, 0x2071, 0x1800, 0x708c, 0x9086, -+ 0x0074, 0x1540, 0x080c, 0xcf99, 0x11b0, 0x6010, 0x00b6, 0x2058, -+ 0x7030, 0xd08c, 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, -+ 0x00e9, 0x00be, 0x2001, 0x0006, 0x080c, 0x61c1, 0x080c, 0x303b, -+ 0x080c, 0x9be7, 0x0088, 0x2001, 0x000a, 0x080c, 0x61c1, 0x080c, -+ 0x303b, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, 0x84d8, 0x080c, -+ 0x8936, 0x0010, 0x080c, 0xa830, 0x00ee, 0x0005, 0x00d6, 0xb800, -+ 0xd084, 0x0158, 0x9006, 0x080c, 0x61ad, 0x2069, 0x1853, 0x6804, -+ 0x0020, 0x2001, 0x0006, 0x080c, 0x61ed, 0x00de, 0x0005, 0x00b6, -+ 0x0096, 0x00d6, 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1904, -+ 0xa809, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, 0x080c, -+ 0xaa62, 0x0804, 0xa76e, 0x00d6, 0x080c, 0x70b7, 0x0198, 0x0026, -+ 0x2011, 0x0010, 0x080c, 0x668b, 0x002e, 0x05c8, 0x080c, 0x53a1, -+ 0x1540, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, -+ 0xdead, 0x00f8, 0x0026, 0x2011, 0x8008, 0x080c, 0x668b, 0x002e, -+ 0x0530, 0x6014, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, -+ 0x1140, 0x2001, 0x0030, 0x900e, 0x2011, 0x4009, 0x080c, 0xbe40, -+ 0x0040, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, -+ 0xdead, 0x6010, 0x2058, 0xb9a0, 0x0016, 0x080c, 0x303b, 0x080c, -+ 0x9be7, 0x001e, 0x080c, 0x311a, 0x00de, 0x0804, 0xa80a, 0x00de, -+ 0x080c, 0xaa57, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x0080, 0x1510, -+ 0x6014, 0x9005, 0x01a8, 0x2048, 0xa864, 0x9084, 0x00ff, 0x9086, -+ 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, -+ 0xbe40, 0x0030, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, -+ 0x2001, 0x0006, 0x080c, 0x61c1, 0x080c, 0x303b, 0x080c, 0x9be7, -+ 0x0804, 0xa80a, 0x080c, 0xa818, 0x6014, 0x9005, 0x0190, 0x2048, -+ 0xa868, 0xd0f4, 0x01e8, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, -+ 0x1d08, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xbe40, -+ 0x08f8, 0x080c, 0xa80e, 0x0160, 0x9006, 0x080c, 0x61ad, 0x2001, -+ 0x0004, 0x080c, 0x61ed, 0x2001, 0x0007, 0x080c, 0x61c1, 0x08a0, -+ 0x2001, 0x0004, 0x080c, 0x61c1, 0x6003, 0x0001, 0x6007, 0x0003, -+ 0x080c, 0x84d8, 0x080c, 0x8936, 0x0804, 0xa80a, 0xb85c, 0xd0e4, -+ 0x01d0, 0x080c, 0xbc6d, 0x080c, 0x70b7, 0x0118, 0xd0dc, 0x1904, -+ 0xa730, 0x2011, 0x1836, 0x2204, 0xc0ad, 0x2012, 0x2001, 0x0002, -+ 0x00f6, 0x2079, 0x0100, 0x78e3, 0x0000, 0x080c, 0x2498, 0x78e2, -+ 0x00fe, 0x0804, 0xa730, 0x080c, 0xbcae, 0x2011, 0x1836, 0x2204, -+ 0xc0a5, 0x2012, 0x0006, 0x080c, 0xd0fe, 0x000e, 0x1904, 0xa730, -+ 0xc0b5, 0x2012, 0x2001, 0x0006, 0x080c, 0x61c1, 0x9006, 0x080c, -+ 0x61ad, 0x00c6, 0x2001, 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, -+ 0x2079, 0x0100, 0x00e6, 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, -+ 0x78e6, 0x707a, 0x7010, 0x78ea, 0x707e, 0x908c, 0x00ff, 0x00ee, -+ 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x246d, 0x00f6, 0x2100, -+ 0x900e, 0x080c, 0x2424, 0x795a, 0x00fe, 0x9186, 0x0081, 0x01d8, -+ 0x2009, 0x0081, 0x00c8, 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, -+ 0x79ea, 0x7932, 0x7936, 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, -+ 0x246d, 0x00f6, 0x2079, 0x1800, 0x797e, 0x2100, 0x900e, 0x080c, -+ 0x2424, 0x795a, 0x00fe, 0x8108, 0x080c, 0x6210, 0x2b00, 0x00ce, -+ 0x1904, 0xa730, 0x6012, 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, -+ 0x2009, 0x027c, 0x210c, 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, -+ 0x210c, 0xb916, 0x2001, 0x0002, 0x080c, 0x61c1, 0x6023, 0x0001, -+ 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x84d8, 0x080c, 0x8936, -+ 0x0008, 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, -+ 0x2004, 0xd0a4, 0x0120, 0x2001, 0x1854, 0x2004, 0xd0ac, 0x0005, -+ 0x00e6, 0x080c, 0xd582, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, -+ 0x918c, 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, -+ 0xb8a0, 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, -+ 0x2030, 0x2001, 0x0007, 0x080c, 0x61c1, 0x080c, 0x53a1, 0x1120, -+ 0x2001, 0x0007, 0x080c, 0x61ed, 0x080c, 0x303b, 0x6020, 0x9086, -+ 0x000a, 0x1108, 0x0005, 0x0804, 0x9be7, 0x00b6, 0x00e6, 0x0026, -+ 0x0016, 0x2071, 0x1800, 0x708c, 0x9086, 0x0014, 0x1904, 0xa8e2, -+ 0x00d6, 0x080c, 0x70b7, 0x0198, 0x0026, 0x2011, 0x0010, 0x080c, -+ 0x668b, 0x002e, 0x05c8, 0x080c, 0x53a1, 0x1540, 0x6014, 0x2048, -+ 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x00f8, 0x0026, -+ 0x2011, 0x8008, 0x080c, 0x668b, 0x002e, 0x0530, 0x6014, 0x2048, -+ 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0030, -+ 0x900e, 0x2011, 0x4009, 0x080c, 0xbe40, 0x0040, 0x6014, 0x2048, -+ 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0xdead, 0x6010, 0x2058, -+ 0xb9a0, 0x0016, 0x080c, 0x303b, 0x080c, 0x9be7, 0x001e, 0x080c, -+ 0x311a, 0x00de, 0x0804, 0xa8e6, 0x00de, 0x080c, 0x53a1, 0x1170, -+ 0x6014, 0x9005, 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, -+ 0x2021, 0x0006, 0x080c, 0x4a75, 0x004e, 0x003e, 0x00d6, 0x6010, -+ 0x2058, 0x080c, 0x630b, 0x080c, 0xa6a6, 0x00de, 0x080c, 0xab28, -+ 0x1588, 0x6010, 0x2058, 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, -+ 0x080c, 0x61c1, 0x0096, 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, -+ 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, -+ 0x4000, 0x080c, 0xbe40, 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, -+ 0x0029, 0x0130, 0xa807, 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, -+ 0x009e, 0x080c, 0x303b, 0x6020, 0x9086, 0x000a, 0x0138, 0x080c, -+ 0x9be7, 0x0020, 0x080c, 0xa58f, 0x080c, 0xa830, 0x001e, 0x002e, -+ 0x00ee, 0x00be, 0x0005, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, -+ 0x1160, 0x2001, 0x0002, 0x080c, 0x61c1, 0x6003, 0x0001, 0x6007, -+ 0x0001, 0x080c, 0x84d8, 0x0804, 0x8936, 0x0804, 0xa830, 0x2030, -+ 0x2011, 0x1823, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, -+ 0x1120, 0x2001, 0x0007, 0x080c, 0x61c1, 0x0804, 0x9be7, 0x0804, -+ 0xa830, 0x0002, 0xa670, 0xa929, 0xa670, 0xa968, 0xa670, 0xaa13, -+ 0xa91e, 0xa670, 0xa670, 0xaa26, 0xa670, 0xaa36, 0x6604, 0x9686, -+ 0x0003, 0x0904, 0xa845, 0x96b6, 0x001e, 0x1110, 0x080c, 0x9be7, -+ 0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xaa46, 0x11a0, 0x9006, -+ 0x080c, 0x61ad, 0x080c, 0x3006, 0x080c, 0xbf76, 0x2001, 0x0002, -+ 0x080c, 0x61c1, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x84d8, -+ 0x080c, 0x8936, 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, 0x3006, -+ 0x080c, 0xbf76, 0x080c, 0xa830, 0x00ce, 0x00de, 0x00be, 0x0005, -+ 0x0096, 0x00b6, 0x0026, 0x9016, 0x080c, 0xaa54, 0x00d6, 0x2069, -+ 0x194d, 0x2d04, 0x9005, 0x0168, 0x6010, 0x2058, 0xb8a0, 0x9086, -+ 0x007e, 0x1138, 0x2069, 0x181f, 0x2d04, 0x8000, 0x206a, 0x00de, -+ 0x0010, 0x00de, 0x0088, 0x9006, 0x080c, 0x61ad, 0x2001, 0x0002, -+ 0x080c, 0x61c1, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x84d8, -+ 0x080c, 0x8936, 0x0804, 0xa9e3, 0x080c, 0xb847, 0x01b0, 0x6014, -+ 0x2048, 0xa864, 0x2010, 0x9086, 0x0139, 0x1138, 0x6007, 0x0016, -+ 0x2001, 0x0002, 0x080c, 0xbe9a, 0x00b0, 0x6014, 0x2048, 0xa864, -+ 0xd0fc, 0x0118, 0x2001, 0x0001, 0x0ca8, 0x2001, 0x180e, 0x2004, -+ 0xd0dc, 0x0148, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, -+ 0x1110, 0x9006, 0x0c38, 0x080c, 0xa58f, 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, 0x61c1, 0x2001, 0x0028, 0x601a, 0x6007, 0x0052, -+ 0x0010, 0x080c, 0xa830, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, -+ 0x0139, 0x0160, 0x6014, 0x2048, 0x080c, 0xb847, 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, 0x5c6f, 0x00ee, 0x0010, -+ 0x080c, 0x3006, 0x0870, 0x080c, 0xaa54, 0x1160, 0x2001, 0x0004, -+ 0x080c, 0x61c1, 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x84d8, -+ 0x0804, 0x8936, 0x080c, 0xa58f, 0x0804, 0xa830, 0x0469, 0x1160, -+ 0x2001, 0x0008, 0x080c, 0x61c1, 0x6003, 0x0001, 0x6007, 0x0005, -+ 0x080c, 0x84d8, 0x0804, 0x8936, 0x0804, 0xa830, 0x00e9, 0x1160, -+ 0x2001, 0x000a, 0x080c, 0x61c1, 0x6003, 0x0001, 0x6007, 0x0001, -+ 0x080c, 0x84d8, 0x0804, 0x8936, 0x0804, 0xa830, 0x2009, 0x026e, -+ 0x2104, 0x9086, 0x0003, 0x1138, 0x2009, 0x026f, 0x2104, 0x9084, -+ 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085, 0x0001, 0x0005, 0x00b6, -+ 0x00c6, 0x0016, 0x6110, 0x2158, 0x080c, 0x627f, 0x001e, 0x00ce, -+ 0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6, 0x00d6, 0x0036, 0x0016, -+ 0x6010, 0x2058, 0x2009, 0x1836, 0x2104, 0x9085, 0x0003, 0x200a, -+ 0x080c, 0xaafa, 0x0560, 0x2009, 0x1836, 0x2104, 0xc0cd, 0x200a, -+ 0x080c, 0x6663, 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, -+ 0xd273, 0x2001, 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, -+ 0x2009, 0x0001, 0x080c, 0x2fc5, 0x00e6, 0x2071, 0x1800, 0x080c, -+ 0x2ddb, 0x00ee, 0x00c6, 0x0156, 0x20a9, 0x0781, 0x2009, 0x007f, -+ 0x080c, 0x311a, 0x8108, 0x1f04, 0xaa98, 0x015e, 0x00ce, 0x080c, -+ 0xaa57, 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, 0x181e, -+ 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, 0x2069, 0x181f, 0x206a, -+ 0x78ea, 0x7832, 0x7836, 0x2010, 0x9084, 0xff00, 0x001e, 0x9105, -+ 0x2009, 0x182b, 0x200a, 0x2200, 0x9084, 0x00ff, 0x2008, 0x080c, -+ 0x246d, 0x080c, 0x70b7, 0x0170, 0x2071, 0x0260, 0x2069, 0x1953, -+ 0x7048, 0x206a, 0x704c, 0x6806, 0x7050, 0x680a, 0x7054, 0x680e, -+ 0x080c, 0xbc6d, 0x0040, 0x2001, 0x0006, 0x080c, 0x61c1, 0x080c, -+ 0x303b, 0x080c, 0x9be7, 0x001e, 0x003e, 0x00de, 0x00ee, 0x00fe, -+ 0x00be, 0x0005, 0x0096, 0x0026, 0x0036, 0x00e6, 0x0156, 0x2019, -+ 0x182b, 0x231c, 0x83ff, 0x01f0, 0x2071, 0x0260, 0x7200, 0x9294, -+ 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205, 0x9306, 0x1198, 0x2011, -+ 0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019, 0x000a, 0x080c, 0xabdf, -+ 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, 0x2019, 0x0006, 0x080c, -+ 0xabdf, 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, 0x19c4, 0x252c, 0x2021, 0x19cb, 0x2424, 0x2061, -+ 0x1ddc, 0x2071, 0x1800, 0x7250, 0x7070, 0x9202, 0x1a04, 0xabb7, -+ 0x080c, 0xd2a4, 0x0904, 0xabb0, 0x6720, 0x9786, 0x0007, 0x0904, -+ 0xabb0, 0x2500, 0x9c06, 0x0904, 0xabb0, 0x2400, 0x9c06, 0x0904, -+ 0xabb0, 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, -+ 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1590, 0x00c6, 0x6043, -+ 0xffff, 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x1914, 0x9786, -+ 0x000a, 0x0148, 0x080c, 0xba5c, 0x1130, 0x00ce, 0x080c, 0xa58f, -+ 0x080c, 0x9c21, 0x00e8, 0x6014, 0x2048, 0x080c, 0xb847, 0x01a8, -+ 0x9786, 0x0003, 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, -+ 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd4, 0x009e, 0xab7a, 0xa877, -+ 0x0000, 0x080c, 0x698a, 0x080c, 0xba36, 0x080c, 0x9c21, 0x00ce, -+ 0x9ce0, 0x001c, 0x7064, 0x9c02, 0x1210, 0x0804, 0xab5b, 0x012e, -+ 0x000e, 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, -+ 0x0005, 0x9786, 0x0006, 0x1118, 0x080c, 0xd21e, 0x0c30, 0x9786, -+ 0x000a, 0x0998, 0x0880, 0x220c, 0x2304, 0x9106, 0x1130, 0x8210, -+ 0x8318, 0x1f04, 0xabcb, 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, 0x0d65, 0x080c, 0xba4b, -+ 0x0120, 0x080c, 0xba5c, 0x0158, 0x0028, 0x080c, 0x303b, 0x080c, -+ 0xba5c, 0x0128, 0x080c, 0x8874, 0x080c, 0x9be7, 0x0005, 0x080c, -+ 0xa58f, 0x0cc0, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, -+ 0x000a, 0x0005, 0xac41, 0xac41, 0xac41, 0xac41, 0xac41, 0xac41, -+ 0xac41, 0xac41, 0xac41, 0xac41, 0xac41, 0xac43, 0xac43, 0xac43, -+ 0xac43, 0xac41, 0xac41, 0xac41, 0xac43, 0xac41, 0xac41, 0xac41, -+ 0xac41, 0x080c, 0x0d65, 0x600b, 0xffff, 0x6003, 0x000f, 0x6106, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0xbf79, 0x2009, 0x8000, 0x080c, -+ 0x84d1, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, -+ 0x0040, 0x0804, 0xacc8, 0x9186, 0x0027, 0x1520, 0x080c, 0x8874, -+ 0x080c, 0x3006, 0x080c, 0xbf76, 0x0096, 0x6114, 0x2148, 0x080c, -+ 0xb847, 0x0198, 0x080c, 0xba5c, 0x1118, 0x080c, 0xa58f, 0x0068, -+ 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, 0xc1c5, -+ 0xa97e, 0x080c, 0x6996, 0x080c, 0xba36, 0x009e, 0x080c, 0x9be7, -+ 0x0804, 0x8936, 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, 0x0040, -+ 0x0018, 0x080c, 0x0d65, 0x0005, 0x0002, 0xaca6, 0xaca4, 0xaca4, -+ 0xaca4, 0xaca4, 0xaca4, 0xaca4, 0xaca4, 0xaca4, 0xaca4, 0xaca4, -+ 0xacbf, 0xacbf, 0xacbf, 0xacbf, 0xaca4, 0xacbf, 0xaca4, 0xacbf, -+ 0xaca4, 0xaca4, 0xaca4, 0xaca4, 0x080c, 0x0d65, 0x080c, 0x8874, -+ 0x0096, 0x6114, 0x2148, 0x080c, 0xb847, 0x0168, 0xa867, 0x0103, -+ 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, 0x080c, -+ 0x6996, 0x080c, 0xba36, 0x009e, 0x080c, 0x9be7, 0x0005, 0x080c, -+ 0x8874, 0x080c, 0xba5c, 0x090c, 0xa58f, 0x080c, 0x9be7, 0x0005, -+ 0x0002, 0xace2, 0xace0, 0xace0, 0xace0, 0xace0, 0xace0, 0xace0, -+ 0xace0, 0xace0, 0xace0, 0xace0, 0xace4, 0xace4, 0xace4, 0xace4, -+ 0xace0, 0xace6, 0xace0, 0xace4, 0xace0, 0xace0, 0xace0, 0xace0, -+ 0x080c, 0x0d65, 0x080c, 0x0d65, 0x080c, 0x0d65, 0x080c, 0x9be7, -+ 0x0804, 0x8936, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, -+ 0x000a, 0x0005, 0xad09, 0xad09, 0xad09, 0xad09, 0xad09, 0xad42, -+ 0xae31, 0xad09, 0xae3d, 0xad09, 0xad09, 0xad09, 0xad09, 0xad09, -+ 0xad09, 0xad09, 0xad09, 0xad09, 0xad09, 0xae3d, 0xad0b, 0xad09, -+ 0xae3b, 0x080c, 0x0d65, 0x00b6, 0x0096, 0x6114, 0x2148, 0x6010, -+ 0x2058, 0xb800, 0xd0bc, 0x1508, 0xa87b, 0x0000, 0xa867, 0x0103, -+ 0xa877, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, 0x9115, -+ 0x190c, 0xaec2, 0x080c, 0x67ac, 0x6210, 0x2258, 0xba3c, 0x82ff, -+ 0x0110, 0x8211, 0xba3e, 0xb8c0, 0x9005, 0x0110, 0x080c, 0x639b, -+ 0x080c, 0x9be7, 0x009e, 0x00be, 0x0005, 0xa87c, 0xd0ac, 0x09e0, -+ 0xa838, 0xa934, 0x9105, 0x09c0, 0xa880, 0xd0bc, 0x19a8, 0x080c, -+ 0xbb8c, 0x0c80, 0x00b6, 0x0096, 0x6114, 0x2148, 0x601c, 0xd0fc, -+ 0x1110, 0x7644, 0x0008, 0x9036, 0x96b4, 0x0fff, 0x86ff, 0x1590, -+ 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xae20, 0xa87b, 0x0000, -+ 0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, -+ 0x9115, 0x190c, 0xaec2, 0x080c, 0x67ac, 0x6210, 0x2258, 0xba3c, -+ 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8c0, 0x9005, 0x0110, 0x080c, -+ 0x639b, 0x601c, 0xd0fc, 0x1148, 0x7044, 0xd0e4, 0x1904, 0xae04, -+ 0x080c, 0x9be7, 0x009e, 0x00be, 0x0005, 0x2009, 0x0211, 0x210c, -+ 0x080c, 0x0d65, 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, 0xb800, -+ 0xd0bc, 0x1904, 0xae08, 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, 0xad4e, 0x735c, 0xab86, -+ 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, 0x0036, -+ 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xb41a, 0x003e, -+ 0xd6cc, 0x0904, 0xad63, 0x7154, 0xa98a, 0x81ff, 0x0904, 0xad63, -+ 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, -+ 0x080c, 0xb41a, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, 0xbf06, -+ 0x0804, 0xad63, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, -+ 0x0c50, 0x00a6, 0x2950, 0x080c, 0xb3b9, 0x00ae, 0x080c, 0xbf06, -+ 0x080c, 0xb40a, 0x0804, 0xad65, 0x080c, 0xbb4f, 0x0804, 0xad7a, -+ 0xa87c, 0xd0ac, 0x0904, 0xad8b, 0xa880, 0xd0bc, 0x1904, 0xad8b, -+ 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, 0xa834, 0x931e, 0x0904, -+ 0xad8b, 0xd6d4, 0x0190, 0xab38, 0x9305, 0x0904, 0xad8b, 0x0068, -+ 0xa87c, 0xd0ac, 0x0904, 0xad56, 0xa838, 0xa934, 0x9105, 0x0904, -+ 0xad56, 0xa880, 0xd0bc, 0x1904, 0xad56, 0x080c, 0xbb8c, 0x0804, -+ 0xad7a, 0x00f6, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, 0x7d08, -+ 0x00fe, 0x0021, 0x0005, 0x0011, 0x0005, 0x0005, 0x0096, 0x6003, -+ 0x0002, 0x6007, 0x0043, 0x6014, 0x2048, 0xa87c, 0xd0ac, 0x0128, -+ 0x009e, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, 0x910a, -+ 0x2300, 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, 0x0e90, -+ 0xac46, 0xab4a, 0xae36, 0xad3a, 0x6044, 0xd0fc, 0x190c, 0x98f1, -+ 0x604b, 0x0000, 0x080c, 0x1ad2, 0x1118, 0x6144, 0x080c, 0x84fd, -+ 0x009e, 0x0005, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, -+ 0x000a, 0x0005, 0xae89, 0xae89, 0xae89, 0xae89, 0xae89, 0xae89, -+ 0xae89, 0xae89, 0xae89, 0xae89, 0xae8b, 0xae89, 0xae89, 0xae89, -+ 0xae89, 0xae9c, 0xae89, 0xae89, 0xae89, 0xae89, 0xaec0, 0xae89, -+ 0xae89, 0x080c, 0x0d65, 0x6004, 0x9086, 0x0040, 0x1110, 0x080c, -+ 0x8874, 0x2019, 0x0001, 0x080c, 0x9286, 0x6003, 0x0002, 0x080c, -+ 0xbf7e, 0x080c, 0x88d1, 0x0005, 0x6004, 0x9086, 0x0040, 0x1110, -+ 0x080c, 0x8874, 0x2019, 0x0001, 0x080c, 0x9286, 0x080c, 0x88d1, -+ 0x080c, 0x3006, 0x080c, 0xbf76, 0x0096, 0x6114, 0x2148, 0x080c, -+ 0xb847, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, -+ 0x080c, 0x6996, 0x080c, 0xba36, 0x009e, 0x080c, 0x9be7, 0x0005, -+ 0x080c, 0x0d65, 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, 0x0007, -+ 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0x0006, 0x0016, 0x2009, -+ 0x1a48, 0x2104, 0x8000, 0x200a, 0x001e, 0x000e, 0xa992, 0xa88e, -+ 0x0005, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, -+ 0x0005, 0xaef8, 0xaef8, 0xaef8, 0xaef8, 0xaef8, 0xaefa, 0xaef8, -+ 0xaef8, 0xafb7, 0xaef8, 0xaef8, 0xaef8, 0xaef8, 0xaef8, 0xaef8, -+ 0xaef8, 0xaef8, 0xaef8, 0xaef8, 0xb0fb, 0xaef8, 0xb105, 0xaef8, -+ 0x080c, 0x0d65, 0x601c, 0xd0bc, 0x0178, 0xd084, 0x0168, 0xd0f4, -+ 0x0120, 0xc084, 0x601e, 0x0804, 0xacea, 0x6114, 0x0096, 0x2148, -+ 0xa87c, 0xc0e5, 0xa87e, 0x009e, 0x0076, 0x00a6, 0x00e6, 0x0096, -+ 0x2071, 0x0260, 0x6114, 0x2150, 0x601c, 0xd0fc, 0x1110, 0x7644, -+ 0x0008, 0x9036, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, 0xb77e, -+ 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, -+ 0x00be, 0x86ff, 0x0904, 0xafb0, 0x9694, 0xff00, 0x9284, 0x0c00, -+ 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, 0x0904, -+ 0xafb0, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, 0xc6c4, -+ 0xb676, 0x0c38, 0x080c, 0x1022, 0x090c, 0x0d65, 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, 0xb41a, -+ 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, 0x9192, -+ 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, 0x080c, -+ 0xb41a, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, 0xd0fc, -+ 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, 0xb3b9, -+ 0x080c, 0x18f2, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, 0x2001, -+ 0x1959, 0x2004, 0x604a, 0x0096, 0x6114, 0x2148, 0xa83c, 0xa940, -+ 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, 0x080c, -+ 0xbf87, 0x0904, 0xb0f6, 0x604b, 0x0000, 0x6010, 0x00b6, 0x2058, -+ 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xb0b5, 0xa978, -+ 0xa868, 0xd0fc, 0x0904, 0xb076, 0x0016, 0xa87c, 0x0006, 0xa880, -+ 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, -+ 0x0904, 0xb044, 0x9086, 0x0028, 0x1904, 0xb030, 0xa87b, 0x001c, -+ 0xb07b, 0x001c, 0x0804, 0xb04c, 0x6024, 0xd0f4, 0x11d0, 0xa838, -+ 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, 0xa88c, -+ 0xaa34, 0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac, 0xa834, -+ 0x9102, 0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024, 0xc0f5, -+ 0x6026, 0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e, 0x00be, -+ 0x601c, 0xc0fc, 0x601e, 0x9006, 0xa876, 0xa892, 0xa88e, 0xa87c, -+ 0xc0e4, 0xa87e, 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, 0xa878, -+ 0x2048, 0x080c, 0x0fd4, 0x009e, 0x080c, 0xbb8c, 0x0804, 0xb0f6, -+ 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xbe29, -+ 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, -+ 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, -+ 0xa938, 0x9115, 0x190c, 0xaec2, 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, 0xbf06, 0x001e, 0xa874, 0x0006, -+ 0x2148, 0x080c, 0x0fd4, 0x001e, 0x0804, 0xb0e2, 0x0016, 0x00a6, -+ 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, 0x9086, -+ 0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, 0xd1dc, -+ 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xbe29, 0x0118, -+ 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, 0x0007, -+ 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, -+ 0x9115, 0x190c, 0xaec2, 0xa890, 0xb092, 0xa88c, 0xb08e, 0xa87c, -+ 0xb07e, 0x00ae, 0x080c, 0x0fd4, 0x009e, 0x080c, 0xbf06, 0xa974, -+ 0x0016, 0x080c, 0xb40a, 0x001e, 0x0468, 0xa867, 0x0103, 0xa974, -+ 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, 0x1118, -+ 0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, 0x080c, -+ 0xbe29, 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, 0x0118, -+ 0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, 0x0128, -+ 0xa834, 0xa938, 0x9115, 0x190c, 0xaec2, 0xa974, 0x0016, 0x080c, -+ 0x67ac, 0x001e, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x82ff, 0x0110, -+ 0x8211, 0xba3e, 0xb8c0, 0x9005, 0x0120, 0x0016, 0x080c, 0x639b, -+ 0x001e, 0x00be, 0xd1e4, 0x1120, 0x080c, 0x9be7, 0x009e, 0x0005, -+ 0x080c, 0xbb4f, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, 0x080c, -+ 0xbf87, 0x190c, 0x1900, 0x009e, 0x0005, 0x0096, 0x6114, 0x2148, -+ 0xa83c, 0xa940, 0x9105, 0x01e8, 0xa877, 0x0000, 0xa87b, 0x0000, -+ 0xa867, 0x0103, 0x00b6, 0x6010, 0x2058, 0xa834, 0xa938, 0x9115, -+ 0x11a0, 0x080c, 0x67ac, 0xba3c, 0x8211, 0x0208, 0xba3e, 0xb8c0, -+ 0x9005, 0x0110, 0x080c, 0x639b, 0x080c, 0x9be7, 0x00be, 0x009e, -+ 0x0005, 0xa87c, 0xc0dc, 0xa87e, 0x08f8, 0xb800, 0xd0bc, 0x1120, -+ 0xa834, 0x080c, 0xaec2, 0x0c28, 0xa880, 0xd0bc, 0x1dc8, 0x080c, -+ 0xbb8c, 0x0c60, 0x080c, 0x8874, 0x0010, 0x080c, 0x88d1, 0x601c, -+ 0xd084, 0x0110, 0x080c, 0x1914, 0x080c, 0xb847, 0x01f0, 0x0096, -+ 0x6114, 0x2148, 0x080c, 0xba5c, 0x1118, 0x080c, 0xa58f, 0x00a0, -+ 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, 0xd18c, 0x1198, 0xd184, -+ 0x1170, 0x6108, 0xa97a, 0x918e, 0x0029, 0x1110, 0x080c, 0xd51a, -+ 0xa877, 0x0000, 0x080c, 0x6996, 0x009e, 0x0804, 0x9c21, 0xa87b, -+ 0x0004, 0x0cb0, 0xa87b, 0x0004, 0x0c98, 0x9182, 0x0057, 0x1220, -+ 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xb18c, 0xb18c, 0xb18c, -+ 0xb18c, 0xb18c, 0xb18e, 0xb18c, 0xb18c, 0xb18c, 0xb18c, 0xb18c, -+ 0xb18c, 0xb18c, 0xb18c, 0xb18c, 0xb18c, 0xb18c, 0xb18c, 0xb18c, -+ 0xb18c, 0xb1b2, 0xb18c, 0xb18c, 0x080c, 0x0d65, 0x080c, 0x5395, -+ 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, 0x6996, 0x009e, -+ 0x0804, 0x9be7, 0x080c, 0x5395, 0x0dd8, 0x6014, 0x900e, 0x9016, -+ 0x0c10, 0x9182, 0x0085, 0x0002, 0xb1cb, 0xb1c9, 0xb1c9, 0xb1d7, -+ 0xb1c9, 0xb1c9, 0xb1c9, 0xb1c9, 0xb1c9, 0xb1c9, 0xb1c9, 0xb1c9, -+ 0xb1c9, 0x080c, 0x0d65, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, -+ 0x8000, 0x2009, 0x8020, 0x080c, 0x84d1, 0x012e, 0x0005, 0x0026, -+ 0x0056, 0x00d6, 0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, 0x7220, -+ 0x080c, 0xb835, 0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, 0x0178, -+ 0x6010, 0x6d10, 0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, 0xb445, -+ 0x00ce, 0x0128, 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, 0x6007, -+ 0x0087, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x84d1, 0x9280, -+ 0x0004, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6824, -+ 0xd0ec, 0x0128, 0x00c6, 0x2260, 0x080c, 0xbb8c, 0x00ce, 0x00ee, -+ 0x00de, 0x005e, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, -+ 0x908a, 0x0085, 0x0a0c, 0x0d65, 0x908a, 0x0092, 0x1a0c, 0x0d65, -+ 0x9082, 0x0085, 0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, 0x0014, -+ 0x190c, 0x0d65, 0x080c, 0x8874, 0x0096, 0x6014, 0x2048, 0x080c, -+ 0xb847, 0x0140, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, -+ 0x080c, 0x6996, 0x009e, 0x080c, 0x9c21, 0x0804, 0x8936, 0xb24c, -+ 0xb24e, 0xb24e, 0xb24c, 0xb24c, 0xb24c, 0xb24c, 0xb24c, 0xb24c, -+ 0xb24c, 0xb24c, 0xb24c, 0xb24c, 0x080c, 0x0d65, 0x080c, 0x9c21, -+ 0x0005, 0x9186, 0x0013, 0x1130, 0x6004, 0x9082, 0x0085, 0x2008, -+ 0x0804, 0xb29d, 0x9186, 0x0027, 0x1558, 0x080c, 0x8874, 0x080c, -+ 0x3006, 0x080c, 0xbf76, 0x0096, 0x6014, 0x2048, 0x080c, 0xb847, -+ 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, 0x080c, -+ 0x6996, 0x080c, 0xba36, 0x009e, 0x080c, 0x9be7, 0x0005, 0x9186, -+ 0x0089, 0x0118, 0x9186, 0x008a, 0x1140, 0x080c, 0x9ab7, 0x0128, -+ 0x9086, 0x000c, 0x0904, 0xb2d5, 0x0000, 0x080c, 0x9ca2, 0x0c70, -+ 0x9186, 0x0014, 0x1d60, 0x080c, 0x8874, 0x0096, 0x6014, 0x2048, -+ 0x080c, 0xb847, 0x0d00, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, -+ 0x0006, 0xa880, 0xc0ec, 0xa882, 0x0890, 0x0002, 0xb2ad, 0xb2ab, -+ 0xb2ab, 0xb2ab, 0xb2ab, 0xb2ab, 0xb2c1, 0xb2ab, 0xb2ab, 0xb2ab, -+ 0xb2ab, 0xb2ab, 0xb2ab, 0x080c, 0x0d65, 0x6034, 0x908c, 0xff00, -+ 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, -+ 0x1957, 0x0010, 0x2001, 0x1958, 0x2004, 0x601a, 0x6003, 0x000c, -+ 0x0005, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, -+ 0x9186, 0x0035, 0x1118, 0x2001, 0x1957, 0x0010, 0x2001, 0x1958, -+ 0x2004, 0x601a, 0x6003, 0x000e, 0x0005, 0x9182, 0x0092, 0x1220, -+ 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, 0x9ca2, 0xb2eb, 0xb2eb, -+ 0xb2eb, 0xb2eb, 0xb2ed, 0xb33a, 0xb2eb, 0xb2eb, 0xb2eb, 0xb2eb, -+ 0xb2eb, 0xb2eb, 0xb2eb, 0x080c, 0x0d65, 0x0096, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, 0xff00, -+ 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x009e, -+ 0x0804, 0xb34e, 0x080c, 0xb847, 0x1118, 0x080c, 0xba36, 0x0068, -+ 0x6014, 0x2048, 0x080c, 0xbf8d, 0x1110, 0x080c, 0xba36, 0xa867, -+ 0x0103, 0x080c, 0xbf41, 0x080c, 0x6996, 0x00d6, 0x2c68, 0x080c, -+ 0x9b91, 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, 0xffff, -+ 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, 0x613e, -+ 0x6910, 0x6112, 0x080c, 0xbcdb, 0x695c, 0x615e, 0x6023, 0x0001, -+ 0x2009, 0x8020, 0x080c, 0x84d1, 0x2d60, 0x00de, 0x080c, 0x9be7, -+ 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, -+ 0x05a0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, 0x0130, -+ 0x9186, 0x001e, 0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, 0x2c68, -+ 0x080c, 0xbed9, 0x11f0, 0x080c, 0x9b91, 0x01d8, 0x6106, 0x6003, -+ 0x0001, 0x6023, 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, 0x6930, -+ 0x6132, 0x6934, 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, 0x693c, -+ 0x613e, 0x695c, 0x615e, 0x080c, 0xbcdb, 0x2009, 0x8020, 0x080c, -+ 0x84d1, 0x2d60, 0x00de, 0x0804, 0x9be7, 0x0096, 0x6014, 0x2048, -+ 0x080c, 0xb847, 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, 0x0128, -+ 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, 0xa87b, -+ 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xbb4b, 0xa877, 0x0000, -+ 0x080c, 0x6996, 0x080c, 0xba36, 0x009e, 0x0804, 0x9be7, 0x0016, -+ 0x0096, 0x6014, 0x2048, 0x080c, 0xb847, 0x0140, 0xa867, 0x0103, -+ 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x6996, 0x009e, 0x001e, -+ 0x9186, 0x0013, 0x0158, 0x9186, 0x0014, 0x0130, 0x9186, 0x0027, -+ 0x0118, 0x080c, 0x9ca2, 0x0020, 0x080c, 0x8874, 0x080c, 0x9c21, -+ 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, 0x9182, -+ 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, 0x9098, -+ 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xb41a, 0x96b2, -+ 0x0020, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fd4, 0x080c, 0x1022, -+ 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, 0x6996, 0x2a48, 0x0cb8, 0x080c, 0x6996, -+ 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, 0xb497, -+ 0xb497, 0xb492, 0xb4bb, 0xb46f, 0xb492, 0xb471, 0xb492, 0xb46f, -+ 0xb46f, 0xb492, 0xb492, 0xb492, 0xb46f, 0xb46f, 0xb46f, 0x080c, -+ 0x0d65, 0x6010, 0x9080, 0x0000, 0x2004, 0xd0bc, 0x190c, 0xb4bb, -+ 0x0036, 0x6014, 0x0096, 0x2048, 0xa880, 0x009e, 0xd0cc, 0x0118, -+ 0x2019, 0x000c, 0x0038, 0xd094, 0x0118, 0x2019, 0x000d, 0x0010, -+ 0x2019, 0x0010, 0x080c, 0xcdf9, 0x6023, 0x0006, 0x6003, 0x0007, -+ 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x0096, -+ 0x86ff, 0x11e8, 0x6014, 0x2048, 0x080c, 0xb847, 0x01d0, 0x6043, -+ 0xffff, 0xa864, 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, 0xa883, -+ 0x0000, 0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x6bb3, 0x080c, -+ 0xbb4b, 0x080c, 0x698a, 0x080c, 0x9c21, 0x9085, 0x0001, 0x009e, -+ 0x0005, 0x9006, 0x0ce0, 0x080c, 0x98c8, 0x080c, 0xbf9b, 0x6000, -+ 0x908a, 0x0016, 0x1a0c, 0x0d65, 0x002b, 0x0106, 0x080c, 0x98e4, -+ 0x010e, 0x0005, 0xb4da, 0xb508, 0xb4dc, 0xb52f, 0xb503, 0xb4da, -+ 0xb492, 0xb497, 0xb497, 0xb492, 0xb492, 0xb492, 0xb492, 0xb492, -+ 0xb492, 0xb492, 0x080c, 0x0d65, 0x86ff, 0x1510, 0x6020, 0x9086, -+ 0x0006, 0x01f0, 0x0096, 0x6014, 0x2048, 0x080c, 0xb847, 0x0158, -+ 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd4, -+ 0x009e, 0x080c, 0xbb4b, 0x009e, 0x080c, 0xbf1b, 0x6007, 0x0085, -+ 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, 0x84b3, -+ 0x9085, 0x0001, 0x0005, 0x0066, 0x080c, 0x1914, 0x006e, 0x08a0, -+ 0x00e6, 0x2071, 0x19b8, 0x7030, 0x9c06, 0x1120, 0x080c, 0x9206, -+ 0x00ee, 0x0850, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, 0x1150, -+ 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0x9382, 0x009e, -+ 0x008e, 0x0040, 0x0066, 0x080c, 0x9102, 0x190c, 0x0d65, 0x080c, -+ 0x9110, 0x006e, 0x00ee, 0x1904, 0xb4dc, 0x0804, 0xb492, 0x0036, -+ 0x00e6, 0x2071, 0x19b8, 0x704c, 0x9c06, 0x1138, 0x901e, 0x080c, -+ 0x9286, 0x00ee, 0x003e, 0x0804, 0xb4dc, 0x080c, 0x94b8, 0x00ee, -+ 0x003e, 0x1904, 0xb4dc, 0x0804, 0xb492, 0x00c6, 0x0066, 0x6020, -+ 0x9084, 0x000f, 0x001b, 0x006e, 0x00ce, 0x0005, 0xb565, 0xb627, -+ 0xb78e, 0xb56d, 0x9c21, 0xb565, 0xcdeb, 0xbf83, 0xb627, 0xb55e, -+ 0xb80d, 0xb55e, 0xb55e, 0xb55e, 0xb55e, 0xb55e, 0x080c, 0x0d65, -+ 0x080c, 0xba5c, 0x1110, 0x080c, 0xa58f, 0x0005, 0x080c, 0x8874, -+ 0x0804, 0x9be7, 0x601b, 0x0001, 0x0005, 0x080c, 0xb847, 0x0130, -+ 0x6014, 0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x080c, 0x98c8, -+ 0x080c, 0xbf9b, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d65, 0x0013, -+ 0x0804, 0x98e4, 0xb592, 0xb594, 0xb5be, 0xb5d2, 0xb5fd, 0xb592, -+ 0xb565, 0xb565, 0xb565, 0xb5d9, 0xb5d9, 0xb592, 0xb592, 0xb592, -+ 0xb592, 0xb5e3, 0x080c, 0x0d65, 0x00e6, 0x6014, 0x0096, 0x2048, -+ 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19b8, 0x7030, 0x9c06, -+ 0x01d0, 0x0066, 0x080c, 0x9102, 0x190c, 0x0d65, 0x080c, 0x9110, -+ 0x006e, 0x080c, 0xbf1b, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, -+ 0x0002, 0x2001, 0x1958, 0x2004, 0x601a, 0x2009, 0x8020, 0x080c, -+ 0x84b3, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, 0x6014, -+ 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, 0xbf1b, 0x6007, -+ 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, -+ 0x84b3, 0x0005, 0x080c, 0x98c8, 0x080c, 0x9a39, 0x080c, 0x98e4, -+ 0x0c28, 0x0096, 0x601b, 0x0001, 0x6014, 0x2048, 0xa880, 0xc0b5, -+ 0xa882, 0x009e, 0x0005, 0x080c, 0x5395, 0x01a8, 0x6014, 0x0096, -+ 0x904d, 0x0180, 0xa864, 0xa867, 0x0103, 0xa87b, 0x0006, 0x9086, -+ 0x0139, 0x1140, 0xa867, 0x0139, 0xa897, 0x4005, 0xa89b, 0x0004, -+ 0x080c, 0x6996, 0x009e, 0x0804, 0x9be7, 0x6014, 0x0096, 0x904d, -+ 0x0508, 0x080c, 0xbf87, 0x01f0, 0x080c, 0x98e4, 0x2001, 0x180f, -+ 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, 0x8003, -+ 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0037, 0x2c08, 0x080c, -+ 0x159e, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, 0x080c, -+ 0x9c85, 0x0005, 0x009e, 0x080c, 0x1914, 0x0804, 0xb5be, 0x6000, -+ 0x908a, 0x0016, 0x1a0c, 0x0d65, 0x000b, 0x0005, 0xb63e, 0xb56a, -+ 0xb640, 0xb63e, 0xb640, 0xb640, 0xb566, 0xb63e, 0xb560, 0xb560, -+ 0xb63e, 0xb63e, 0xb63e, 0xb63e, 0xb63e, 0xb63e, 0x080c, 0x0d65, -+ 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, 0x908a, -+ 0x000c, 0x1a0c, 0x0d65, 0x00b6, 0x0013, 0x00be, 0x0005, 0xb65b, -+ 0xb728, 0xb65d, 0xb69d, 0xb65d, 0xb69d, 0xb65d, 0xb66b, 0xb65b, -+ 0xb69d, 0xb65b, 0xb68c, 0x080c, 0x0d65, 0x6004, 0x908e, 0x0016, -+ 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, 0x908e, -+ 0x0052, 0x0904, 0xb724, 0x6004, 0x080c, 0xba5c, 0x0904, 0xb741, -+ 0x908e, 0x0004, 0x1110, 0x080c, 0x303b, 0x908e, 0x0021, 0x0904, -+ 0xb745, 0x908e, 0x0022, 0x0904, 0xb789, 0x908e, 0x003d, 0x0904, -+ 0xb745, 0x908e, 0x0039, 0x0904, 0xb749, 0x908e, 0x0035, 0x0904, -+ 0xb749, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, 0x6010, -+ 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, 0x080c, -+ 0x3006, 0x080c, 0xa58f, 0x0804, 0x9c21, 0x00c6, 0x00d6, 0x6104, -+ 0x9186, 0x0016, 0x0904, 0xb715, 0x9186, 0x0002, 0x1904, 0xb6ea, -+ 0x2001, 0x1836, 0x2004, 0xd08c, 0x11c8, 0x080c, 0x70b7, 0x11b0, -+ 0x080c, 0xbf61, 0x0138, 0x080c, 0x70da, 0x1120, 0x080c, 0x6fc2, -+ 0x0804, 0xb772, 0x2001, 0x194e, 0x2003, 0x0001, 0x2001, 0x1800, -+ 0x2003, 0x0001, 0x080c, 0x6fe8, 0x0804, 0xb772, 0x6010, 0x2058, -+ 0x2001, 0x1836, 0x2004, 0xd0ac, 0x1904, 0xb772, 0xb8a0, 0x9084, -+ 0xff80, 0x1904, 0xb772, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0190, -+ 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, -+ 0x604b, 0x0000, 0x080c, 0x9b91, 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, 0x5c6f, -+ 0x00ee, 0x080c, 0xa58f, 0x0030, 0x080c, 0xa58f, 0x080c, 0x3006, -+ 0x080c, 0xbf76, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x303b, -+ 0x012e, 0x00ee, 0x080c, 0x9c21, 0x0005, 0x2001, 0x0002, 0x080c, -+ 0x61c1, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x84d8, 0x080c, -+ 0x8936, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x303b, 0x0804, 0xb699, -+ 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, 0x2058, -+ 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xb6ea, 0x8001, 0xb842, -+ 0x6003, 0x0001, 0x080c, 0x84d8, 0x080c, 0x8936, 0x00de, 0x00ce, -+ 0x0898, 0x080c, 0xa58f, 0x0804, 0xb69b, 0x080c, 0xa5cb, 0x0804, -+ 0xb69b, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xbed9, 0x00de, 0x0118, -+ 0x080c, 0x9be7, 0x00f0, 0x6004, 0x8007, 0x6134, 0x918c, 0x00ff, -+ 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, -+ 0x603c, 0x600a, 0x2001, 0x1958, 0x2004, 0x601a, 0x602c, 0x2c08, -+ 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x2009, 0x8020, 0x080c, -+ 0x84d1, 0x0005, 0x00de, 0x00ce, 0x080c, 0xa58f, 0x080c, 0x3006, -+ 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x303b, 0x6017, 0x0000, -+ 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, 0x012e, 0x00ee, -+ 0x0005, 0x080c, 0xa022, 0x1904, 0xb741, 0x0005, 0x6000, 0x908a, -+ 0x0016, 0x1a0c, 0x0d65, 0x0096, 0x00d6, 0x001b, 0x00de, 0x009e, -+ 0x0005, 0xb7a9, 0xb7a9, 0xb7a9, 0xb7a9, 0xb7a9, 0xb7a9, 0xb7a9, -+ 0xb7a9, 0xb7a9, 0xb565, 0xb7a9, 0xb56a, 0xb7ab, 0xb56a, 0xb7b8, -+ 0xb7a9, 0x080c, 0x0d65, 0x6004, 0x9086, 0x008b, 0x0148, 0x6007, -+ 0x008b, 0x6003, 0x000d, 0x2009, 0x8020, 0x080c, 0x84d1, 0x0005, -+ 0x080c, 0xbf55, 0x0118, 0x080c, 0xbf68, 0x0010, 0x080c, 0xbf76, -+ 0x080c, 0xba36, 0x080c, 0xb847, 0x0570, 0x080c, 0x3006, 0x080c, -+ 0xb847, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, 0x0006, -+ 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x6996, 0x2c68, -+ 0x080c, 0x9b91, 0x0150, 0x6810, 0x6012, 0x080c, 0xbcdb, 0x00c6, -+ 0x2d60, 0x080c, 0x9c21, 0x00ce, 0x0008, 0x2d60, 0x6017, 0x0000, -+ 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x84d8, -+ 0x080c, 0x8936, 0x00c8, 0x080c, 0xbf55, 0x0138, 0x6034, 0x9086, -+ 0x4000, 0x1118, 0x080c, 0x3006, 0x08d0, 0x6034, 0x908c, 0xff00, -+ 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, 0x080c, -+ 0x3006, 0x0868, 0x080c, 0x9c21, 0x0005, 0x6000, 0x908a, 0x0016, -+ 0x1a0c, 0x0d65, 0x0002, 0xb823, 0xb823, 0xb825, 0xb825, 0xb825, -+ 0xb823, 0xb823, 0x9c21, 0xb823, 0xb823, 0xb823, 0xb823, 0xb823, -+ 0xb823, 0xb823, 0xb823, 0x080c, 0x0d65, 0x080c, 0x98c8, 0x080c, -+ 0x9a39, 0x080c, 0x98e4, 0x6114, 0x0096, 0x2148, 0xa87b, 0x0006, -+ 0x080c, 0x6996, 0x009e, 0x0804, 0x9be7, 0x9284, 0x0003, 0x1158, -+ 0x9282, 0x1ddc, 0x0240, 0x2001, 0x1819, 0x2004, 0x9202, 0x1218, -+ 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, 0x0096, -+ 0x0006, 0x6014, 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, 0x9086, -+ 0xf000, 0x0110, 0x080c, 0x10cd, 0x000e, 0x009e, 0x0005, 0x00e6, -+ 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, 0x1ddc, -+ 0x2071, 0x1800, 0x7350, 0x7070, 0x9302, 0x1640, 0x6020, 0x9206, -+ 0x11f8, 0x080c, 0xbf61, 0x0180, 0x9286, 0x0001, 0x1168, 0x6004, -+ 0x9086, 0x0004, 0x1148, 0x080c, 0x3006, 0x080c, 0xbf76, 0x00c6, -+ 0x080c, 0x9c21, 0x00ce, 0x0060, 0x080c, 0xbc4d, 0x0148, 0x080c, -+ 0xba5c, 0x1110, 0x080c, 0xa58f, 0x00c6, 0x080c, 0x9be7, 0x00ce, -+ 0x9ce0, 0x001c, 0x7064, 0x9c02, 0x1208, 0x08a0, 0x012e, 0x000e, -+ 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, 0x9188, -+ 0x1000, 0x210c, 0x81ff, 0x0128, 0x2061, 0x1b02, 0x6112, 0x080c, -+ 0x3006, 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, 0x00ee, -+ 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9b91, 0x01b0, -+ 0x665e, 0x2b00, 0x6012, 0x080c, 0x5395, 0x0118, 0x080c, 0xb978, -+ 0x0168, 0x080c, 0xbcdb, 0x6023, 0x0003, 0x2009, 0x004b, 0x080c, -+ 0x9c85, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, -+ 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0x9c58, 0x0580, -+ 0x605f, 0x0000, 0x2b00, 0x6012, 0x080c, 0xbcdb, 0x6023, 0x0003, -+ 0x0016, 0x080c, 0x98c8, 0x080c, 0x863b, 0x0076, 0x903e, 0x080c, -+ 0x852a, 0x2c08, 0x080c, 0xcfc8, 0x007e, 0x080c, 0x98e4, 0x001e, -+ 0xd184, 0x0128, 0x080c, 0x9be7, 0x9085, 0x0001, 0x0070, 0x080c, -+ 0x5395, 0x0128, 0xd18c, 0x1170, 0x080c, 0xb978, 0x0148, 0x2009, -+ 0x004c, 0x080c, 0x9c85, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, -+ 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, 0x0010, -+ 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, 0x9b91, -+ 0x2c78, 0x0590, 0x7e5e, 0x2b00, 0x7812, 0x7823, 0x0003, 0x2021, -+ 0x0005, 0x080c, 0xb98a, 0x9186, 0x004d, 0x0118, 0x9186, 0x004e, -+ 0x0148, 0x2001, 0x1951, 0x200c, 0xd1fc, 0x0168, 0x2f60, 0x080c, -+ 0x9be7, 0x00d0, 0x2001, 0x1950, 0x200c, 0xd1fc, 0x0120, 0x2f60, -+ 0x080c, 0x9be7, 0x0088, 0x2f60, 0x080c, 0x5395, 0x0138, 0xd18c, -+ 0x1118, 0x04f1, 0x0148, 0x0010, 0x2900, 0x7816, 0x001e, 0x0016, -+ 0x080c, 0x9c85, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, 0x00fe, -+ 0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c, 0x9b91, 0x2c78, 0x0508, -+ 0x7e5e, 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, 0x0004, -+ 0x0489, 0x009e, 0x2001, 0x194f, 0x200c, 0xd1fc, 0x0120, 0x2f60, -+ 0x080c, 0x9be7, 0x0060, 0x2f60, 0x080c, 0x5395, 0x0120, 0xd18c, -+ 0x1160, 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0x9c85, 0x9085, -+ 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, 0x0c98, -+ 0x00c6, 0x080c, 0x4878, 0x00ce, 0x1120, 0x080c, 0x9be7, 0x9006, -+ 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, 0x9085, -+ 0x0001, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x98c8, 0x080c, 0x644f, 0x0158, 0x2001, 0xb991, 0x0006, 0x900e, -+ 0x2400, 0x080c, 0x6bb3, 0x080c, 0x6996, 0x000e, 0x0807, 0x2418, -+ 0x080c, 0x883a, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, 0x0001, -+ 0x2608, 0x080c, 0x8655, 0x008e, 0x080c, 0x852a, 0x2f08, 0x2648, -+ 0x080c, 0xcfc8, 0xb93c, 0x81ff, 0x090c, 0x872c, 0x080c, 0x98e4, -+ 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x9b91, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbcdb, -+ 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, 0x9c85, -+ 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x9c58, 0x01b8, 0x660a, 0x2b08, -+ 0x6112, 0x080c, 0xbcdb, 0x6023, 0x0008, 0x2900, 0x6016, 0x00f6, -+ 0x2c78, 0x080c, 0x164f, 0x00fe, 0x2009, 0x0021, 0x080c, 0x9c85, -+ 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x2009, -+ 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, 0x9b91, -+ 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xbcdb, 0x6023, 0x0001, -+ 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0x9c85, 0x9085, 0x0001, -+ 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x9c58, 0x0188, 0x2b08, 0x6112, 0x080c, -+ 0xbcdb, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, 0x080c, -+ 0x9c85, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, -+ 0x2009, 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, 0x00b6, -+ 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0118, 0x8211, 0xba3e, 0x1140, -+ 0xb8c0, 0x9005, 0x0128, 0xb888, 0x9005, 0x1110, 0xb88b, 0x0001, -+ 0x00be, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, 0x0002, -+ 0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, 0x9085, -+ 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, 0x9086, -+ 0x0004, 0x0190, 0x6014, 0x904d, 0x080c, 0xb847, 0x0168, 0xa864, -+ 0x9086, 0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, 0xa868, -+ 0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, 0x000e, -+ 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9c58, 0x0198, -+ 0x2b08, 0x6112, 0x080c, 0xbcdb, 0x6023, 0x0001, 0x2900, 0x6016, -+ 0x080c, 0x3006, 0x2009, 0x0028, 0x080c, 0x9c85, 0x9085, 0x0001, -+ 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, 0x11a8, -+ 0x2011, 0x1823, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, 0x080c, -+ 0xa818, 0x00be, 0x080c, 0xaa57, 0x6003, 0x0001, 0x6007, 0x0029, -+ 0x080c, 0x84d8, 0x080c, 0x8936, 0x0078, 0x6014, 0x0096, 0x2048, -+ 0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, 0xbe9a, -+ 0x080c, 0xa58f, 0x080c, 0x9be7, 0x0005, 0x0096, 0x6014, 0x904d, -+ 0x090c, 0x0d65, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, -+ 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x6996, 0x012e, 0x009e, 0x080c, 0x9be7, 0x0c30, 0x0096, 0x9186, -+ 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x61c1, 0x00e8, 0x9186, -+ 0x0015, 0x1510, 0x2011, 0x1823, 0x2204, 0x9086, 0x0014, 0x11e0, -+ 0x6010, 0x00b6, 0x2058, 0x080c, 0x630b, 0x00be, 0x080c, 0xab28, -+ 0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, 0x0160, -+ 0x2001, 0x0006, 0x080c, 0x61c1, 0x6014, 0x2048, 0xa868, 0xd0fc, -+ 0x0170, 0x080c, 0x9ff6, 0x0048, 0x6014, 0x2048, 0xa868, 0xd0fc, -+ 0x0528, 0x080c, 0xa58f, 0x080c, 0x9be7, 0x009e, 0x0005, 0x6014, -+ 0x6310, 0x2358, 0x904d, 0x090c, 0x0d65, 0xa87b, 0x0000, 0xa883, -+ 0x0000, 0xa897, 0x4000, 0x900e, 0x080c, 0x655f, 0x1108, 0xc185, -+ 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x6996, 0x012e, 0x080c, 0x9be7, 0x08f8, 0x6014, 0x904d, -+ 0x090c, 0x0d65, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, -+ 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x6996, 0x012e, 0x080c, 0x9be7, 0x0840, 0xa878, 0x9086, 0x0005, -+ 0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, 0x604b, -+ 0x0000, 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, -+ 0x8023, 0x080c, 0x84d1, 0x0005, 0x00c6, 0x6010, 0x00b6, 0x2058, -+ 0xb800, 0x00be, 0xd0bc, 0x0130, 0x0066, 0x6020, 0x9084, 0x000f, -+ 0x001b, 0x006e, 0x00ce, 0x0005, 0xb565, 0xbb7e, 0xbb7e, 0xbb81, -+ 0xd2c2, 0xd2dd, 0xd2e0, 0xb565, 0xb565, 0xb565, 0xb565, 0xb565, -+ 0xb565, 0xb565, 0xb565, 0xb565, 0x080c, 0x0d65, 0xa001, 0xa001, -+ 0x0005, 0x0096, 0x6014, 0x904d, 0x0118, 0xa87c, 0xd0e4, 0x1110, -+ 0x009e, 0x0010, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0bc, 0x0550, 0x2001, 0x1833, 0x2004, 0x9005, 0x1540, -+ 0x00f6, 0x2c78, 0x080c, 0x9b91, 0x0508, 0x7810, 0x6012, 0x080c, -+ 0xbcdb, 0x7820, 0x9086, 0x0003, 0x0128, 0x7808, 0x603a, 0x2f00, -+ 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a, 0x602e, 0x6023, -+ 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x795c, 0x615e, 0x2009, -+ 0x8020, 0x080c, 0x84d1, 0x2f60, 0x00fe, 0x0005, 0x2f60, 0x00fe, -+ 0x2001, 0x1959, 0x2004, 0x604a, 0x0005, 0x0016, 0x0096, 0x6814, -+ 0x2048, 0x681c, 0xd0fc, 0xc0fc, 0x681e, 0xa87c, 0x1108, 0xd0e4, -+ 0x0180, 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, 0xa88f, -+ 0x0000, 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, 0x080c, -+ 0x0fd4, 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, 0x0002, -+ 0x9086, 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, 0x681c, -+ 0xc085, 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, 0x0c00, -+ 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, 0x693c, -+ 0x9103, 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, 0x683a, -+ 0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, 0x695c, -+ 0x615e, 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, 0x2009, -+ 0x8020, 0x080c, 0x84d1, 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, 0x1953, 0x200c, 0x8000, 0x2014, 0x2001, -+ 0x0032, 0x080c, 0x8419, 0x2001, 0x1957, 0x82ff, 0x1110, 0x2011, -+ 0x0014, 0x2202, 0x2001, 0x1955, 0x200c, 0x8000, 0x2014, 0x2071, -+ 0x193d, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x8419, 0x2001, -+ 0x1958, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, 0x1959, -+ 0x9288, 0x000a, 0x2102, 0x2001, 0x0017, 0x080c, 0x98b9, 0x2001, -+ 0x1a59, 0x2102, 0x2001, 0x0032, 0x080c, 0x159e, 0x080c, 0x6648, -+ 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, 0x0016, -+ 0x00e6, 0x2001, 0x1957, 0x2003, 0x0028, 0x2001, 0x1958, 0x2003, -+ 0x0014, 0x2071, 0x193d, 0x701b, 0x0000, 0x701f, 0x07d0, 0x2001, -+ 0x1959, 0x2009, 0x001e, 0x2102, 0x2001, 0x0017, 0x080c, 0x98b9, -+ 0x2001, 0x1a59, 0x2102, 0x2001, 0x0032, 0x080c, 0x159e, 0x00ee, -+ 0x001e, 0x000e, 0x0005, 0x0096, 0x6060, 0x904d, 0x0110, 0x080c, -+ 0x1054, 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x9b91, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, 0x0001, -+ 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, 0x9c85, 0x9085, 0x0001, -+ 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, 0x00f6, -+ 0x2071, 0x1800, 0x9186, 0x0015, 0x1500, 0x708c, 0x9086, 0x0018, -+ 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, 0x080c, -+ 0x89f5, 0x01d8, 0x7078, 0xaa50, 0x9206, 0x1160, 0x707c, 0xaa54, -+ 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, 0x900e, -+ 0x080c, 0x305b, 0x080c, 0x9ff6, 0x0020, 0x080c, 0xa58f, 0x080c, -+ 0x9be7, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaa54, 0x9206, -+ 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0x9b91, -+ 0x0188, 0x2b08, 0x6112, 0x080c, 0xbcdb, 0x6023, 0x0001, 0x2900, -+ 0x6016, 0x2009, 0x004d, 0x080c, 0x9c85, 0x9085, 0x0001, 0x012e, -+ 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, -+ 0x0016, 0x080c, 0x9b91, 0x0180, 0x2b08, 0x6112, 0x080c, 0xbcdb, -+ 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0x9c85, 0x9085, -+ 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, 0x0016, -+ 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, 0x00f6, -+ 0x2071, 0x1800, 0x9186, 0x0015, 0x1568, 0x718c, 0x6014, 0x2048, -+ 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, 0x1971, -+ 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, 0x8006, -+ 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, 0x001b, -+ 0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x080c, 0xc545, 0x001e, -+ 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, 0xa867, -+ 0x0103, 0x0010, 0x080c, 0xa58f, 0x080c, 0x9be7, 0x00fe, 0x00ee, -+ 0x009e, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, 0x0005, -+ 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x11b8, -+ 0x708c, 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, 0x080c, -+ 0x89f5, 0x01a8, 0x7078, 0xaa74, 0x9206, 0x1130, 0x707c, 0xaa78, -+ 0x9206, 0x1110, 0x080c, 0x3006, 0x080c, 0x9ff6, 0x0020, 0x080c, -+ 0xa58f, 0x080c, 0x9be7, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, -+ 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, 0x2071, -+ 0x1800, 0x9186, 0x0015, 0x1550, 0x708c, 0x9086, 0x0004, 0x1530, -+ 0x6014, 0x2048, 0x2c78, 0x080c, 0x89f5, 0x05f0, 0x7078, 0xaacc, -+ 0x9206, 0x1180, 0x707c, 0xaad0, 0x9206, 0x1160, 0x080c, 0x3006, -+ 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5345, -+ 0x001e, 0x0010, 0x080c, 0x512e, 0x080c, 0xb847, 0x0508, 0xa87b, -+ 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0080, 0x080c, 0xb847, -+ 0x01b8, 0x6014, 0x2048, 0x080c, 0x512e, 0x1d70, 0xa87b, 0x0030, -+ 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, 0x2091, -+ 0x8000, 0xa867, 0x0139, 0x080c, 0x6996, 0x012e, 0x080c, 0x9be7, -+ 0x00fe, 0x00ee, 0x009e, 0x0005, 0x705c, 0xaad0, 0x9206, 0x0930, -+ 0x0888, 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, 0x080c, 0xb847, 0x0904, 0xbe96, 0x0096, -+ 0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, 0x6310, -+ 0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, 0x080c, -+ 0x655f, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xaa96, -+ 0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, -+ 0x20a0, 0xb8b4, 0x20e0, 0xb8b8, 0x9080, 0x0006, 0x2098, 0x080c, -+ 0x0f9f, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, 0xb8b8, -+ 0x9080, 0x000a, 0x2098, 0x080c, 0x0f9f, 0x00ce, 0x0090, 0xaa96, -+ 0x3918, 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, 0x0110, -+ 0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, 0x00ff, -+ 0xa89e, 0x080c, 0x698a, 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, 0x2424, 0x2118, -+ 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, 0x7c3c, -+ 0x2011, 0x8018, 0x080c, 0x48d8, 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, 0xb835, 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, 0xaec2, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, 0x0036, -+ 0x901e, 0x0499, 0x01e0, 0x080c, 0xb847, 0x01c8, 0x080c, 0xba36, -+ 0x6037, 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, 0xa87c, -+ 0x080c, 0xba5c, 0x1118, 0x080c, 0xa58f, 0x0040, 0xa867, 0x0103, -+ 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x6996, 0x009e, 0x003e, -+ 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, 0xa882, -+ 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, -+ 0x080c, 0xbb4b, 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, 0x2004, -+ 0xd0ec, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, 0x000e, -+ 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, 0x0005, -+ 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, -+ 0x0007, 0x080c, 0x4a75, 0x004e, 0x003e, 0x0005, 0x0c51, 0x1d81, -+ 0x0005, 0x2001, 0x1957, 0x2004, 0x601a, 0x0005, 0x2001, 0x1959, -+ 0x2004, 0x604a, 0x0005, 0x080c, 0x9be7, 0x0804, 0x8936, 0x611c, -+ 0xd1fc, 0xa97c, 0x1108, 0xd1e4, 0x0005, 0x601c, 0xd0fc, 0xa87c, -+ 0x1108, 0xd0e4, 0x0005, 0x601c, 0xd0fc, 0xc0fc, 0x601e, 0xa87c, -+ 0x1108, 0xd0e4, 0x0005, 0x6044, 0xd0fc, 0x0160, 0xd0dc, 0x1128, -+ 0x908c, 0x000f, 0x9186, 0x0005, 0x1118, 0x6003, 0x0003, 0x0010, -+ 0x6003, 0x0001, 0x0005, 0x00b6, 0x0066, 0x6000, 0x90b2, 0x0016, -+ 0x1a0c, 0x0d65, 0x001b, 0x006e, 0x00be, 0x0005, 0xbfc6, 0xc6a0, -+ 0xc7ef, 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0xbffd, 0xc871, -+ 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0xbfc6, 0x080c, 0x0d65, -+ 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d65, 0x0013, 0x006e, -+ 0x0005, 0xbfe1, 0xcd88, 0xbfe1, 0xbfe1, 0xbfe1, 0xbfe1, 0xbfe1, -+ 0xbfe1, 0xcd37, 0xcdda, 0xbfe1, 0xd3fd, 0xd431, 0xd3fd, 0xd431, -+ 0xbfe1, 0x080c, 0x0d65, 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d65, -+ 0x6000, 0x000a, 0x0005, 0xbffb, 0xca4d, 0xcb16, 0xcb38, 0xcbb3, -+ 0xbffb, 0xccad, 0xcc3b, 0xc87b, 0xcd0f, 0xcd24, 0xbffb, 0xbffb, -+ 0xbffb, 0xbffb, 0xbffb, 0x080c, 0x0d65, 0x91b2, 0x0053, 0x1a0c, -+ 0x0d65, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xc443, 0x0002, 0xc047, -+ 0xc234, 0xc047, 0xc047, 0xc047, 0xc23d, 0xc047, 0xc047, 0xc047, -+ 0xc047, 0xc047, 0xc047, 0xc047, 0xc047, 0xc047, 0xc047, 0xc047, -+ 0xc047, 0xc047, 0xc047, 0xc047, 0xc047, 0xc047, 0xc049, 0xc0b0, -+ 0xc0bf, 0xc123, 0xc14e, 0xc1c6, 0xc21f, 0xc047, 0xc047, 0xc240, -+ 0xc047, 0xc047, 0xc255, 0xc262, 0xc047, 0xc047, 0xc047, 0xc047, -+ 0xc047, 0xc2e5, 0xc047, 0xc047, 0xc2f9, 0xc047, 0xc047, 0xc2b4, -+ 0xc047, 0xc047, 0xc047, 0xc311, 0xc047, 0xc047, 0xc047, 0xc38e, -+ 0xc047, 0xc047, 0xc047, 0xc047, 0xc047, 0xc047, 0xc40b, 0x080c, -+ 0x0d65, 0x080c, 0x6625, 0x1150, 0x2001, 0x1836, 0x2004, 0xd0cc, -+ 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, 0x0009, -+ 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xc22d, 0x080c, 0x660e, -+ 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, 0xbaa0, -+ 0x0026, 0x2019, 0x0029, 0x080c, 0x98c8, 0x080c, 0x863b, 0x0076, -+ 0x903e, 0x080c, 0x852a, 0x2c08, 0x080c, 0xcfc8, 0x007e, 0x001e, -+ 0x080c, 0x98e4, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, 0x6610, -+ 0x2658, 0x080c, 0x627f, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, -+ 0x1268, 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, -+ 0x2c08, 0x080c, 0xd5a9, 0x002e, 0x001e, 0x1178, 0x080c, 0xcef7, -+ 0x1904, 0xc11b, 0x080c, 0xce93, 0x1120, 0x6007, 0x0008, 0x0804, -+ 0xc22d, 0x6007, 0x0009, 0x0804, 0xc22d, 0x080c, 0xd0fe, 0x0128, -+ 0x080c, 0xcef7, 0x0d78, 0x0804, 0xc11b, 0x6017, 0x1900, 0x0c88, -+ 0x080c, 0x3150, 0x1904, 0xc440, 0x6106, 0x080c, 0xce44, 0x6007, -+ 0x0006, 0x0804, 0xc22d, 0x6007, 0x0007, 0x0804, 0xc22d, 0x080c, -+ 0xd46d, 0x1904, 0xc440, 0x080c, 0x3150, 0x1904, 0xc440, 0x00d6, -+ 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x1220, -+ 0x2001, 0x0001, 0x080c, 0x61ad, 0x96b4, 0xff00, 0x8637, 0x9686, -+ 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, 0x00ff, -+ 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, 0x0005, -+ 0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, 0x9084, -+ 0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, 0x9084, -+ 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, 0x00b0, -+ 0x00ee, 0x080c, 0xcf5e, 0x1190, 0x9686, 0x0006, 0x1140, 0x0026, -+ 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x305b, 0x002e, 0x080c, -+ 0x630b, 0x6007, 0x000a, 0x00de, 0x0804, 0xc22d, 0x6007, 0x000b, -+ 0x00de, 0x0804, 0xc22d, 0x080c, 0x3006, 0x080c, 0xbf76, 0x6007, -+ 0x0001, 0x0804, 0xc22d, 0x080c, 0xd46d, 0x1904, 0xc440, 0x080c, -+ 0x3150, 0x1904, 0xc440, 0x2071, 0x0260, 0x7034, 0x90b4, 0x0003, -+ 0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, 0x1910, -+ 0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, 0x6210, -+ 0x2258, 0xbaa0, 0x900e, 0x080c, 0x305b, 0x002e, 0x6007, 0x000c, -+ 0x2001, 0x0001, 0x080c, 0xd589, 0x0804, 0xc22d, 0x080c, 0x6625, -+ 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, -+ 0x1110, 0x0804, 0xc056, 0x080c, 0x660e, 0x6610, 0x2658, 0xbe04, -+ 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c0, 0x1138, 0x0026, 0x2001, -+ 0x0006, 0x080c, 0x61ed, 0x002e, 0x0050, 0x96b4, 0xff00, 0x8637, -+ 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc11b, 0x080c, -+ 0xcf6b, 0x1120, 0x6007, 0x000e, 0x0804, 0xc22d, 0x0046, 0x6410, -+ 0x2458, 0xbca0, 0x0046, 0x080c, 0x3006, 0x080c, 0xbf76, 0x004e, -+ 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, 0x0048, 0x2009, 0x0029, -+ 0x080c, 0xd273, 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, -+ 0x004e, 0x6007, 0x0001, 0x0804, 0xc22d, 0x2001, 0x0001, 0x080c, -+ 0x61ad, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, -+ 0x1805, 0x2011, 0x0270, 0x080c, 0xabcb, 0x003e, 0x002e, 0x001e, -+ 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, 0x9682, 0x0004, -+ 0x0a04, 0xc11b, 0x9682, 0x0007, 0x0a04, 0xc177, 0x0804, 0xc11b, -+ 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xc22d, 0x080c, 0x6625, -+ 0x1140, 0x2001, 0x1836, 0x2004, 0x9084, 0x0009, 0x9086, 0x0008, -+ 0x1110, 0x0804, 0xc056, 0x080c, 0x660e, 0x6610, 0x2658, 0xbe04, -+ 0x9684, 0x00ff, 0x9082, 0x0006, 0x0690, 0x0150, 0x96b4, 0xff00, -+ 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xc11b, -+ 0x080c, 0xcf99, 0x1130, 0x080c, 0xce93, 0x1118, 0x6007, 0x0010, -+ 0x04e0, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x3006, -+ 0x080c, 0xbf76, 0x004e, 0x0016, 0x9006, 0x2009, 0x1854, 0x210c, -+ 0x0048, 0x2009, 0x0029, 0x080c, 0xd273, 0x6010, 0x2058, 0xb800, -+ 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x00f0, 0x080c, -+ 0xd0fe, 0x0140, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0980, -+ 0x0804, 0xc11b, 0x6017, 0x1900, 0x6007, 0x0009, 0x0070, 0x080c, -+ 0x3150, 0x1904, 0xc440, 0x080c, 0xd46d, 0x1904, 0xc440, 0x080c, -+ 0xc5e0, 0x1904, 0xc11b, 0x6007, 0x0012, 0x6003, 0x0001, 0x080c, -+ 0x84d8, 0x080c, 0x8936, 0x0005, 0x6007, 0x0001, 0x6003, 0x0001, -+ 0x080c, 0x84d8, 0x080c, 0x8936, 0x0cb0, 0x6007, 0x0005, 0x0c68, -+ 0x080c, 0xd46d, 0x1904, 0xc440, 0x080c, 0x3150, 0x1904, 0xc440, -+ 0x080c, 0xc5e0, 0x1904, 0xc11b, 0x6007, 0x0020, 0x6003, 0x0001, -+ 0x080c, 0x84d8, 0x080c, 0x8936, 0x0005, 0x080c, 0x3150, 0x1904, -+ 0xc440, 0x6007, 0x0023, 0x6003, 0x0001, 0x080c, 0x84d8, 0x080c, -+ 0x8936, 0x0005, 0x080c, 0xd46d, 0x1904, 0xc440, 0x080c, 0x3150, -+ 0x1904, 0xc440, 0x080c, 0xc5e0, 0x1904, 0xc11b, 0x0016, 0x0026, -+ 0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, 0xffff, 0x0180, 0x2c08, -+ 0x080c, 0xb835, 0x01b0, 0x2260, 0x7240, 0x6008, 0x9206, 0x1188, -+ 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, 0x01b8, 0x0050, 0x7240, -+ 0x2c08, 0x9006, 0x080c, 0xd245, 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, 0x9be7, 0x2160, -+ 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, 0x84d8, 0x080c, 0x8936, -+ 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, 0x0001, 0x080c, 0x61ad, -+ 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, -+ 0x2011, 0x0276, 0x080c, 0xabcb, 0x003e, 0x002e, 0x001e, 0x015e, -+ 0x0120, 0x6007, 0x0031, 0x0804, 0xc22d, 0x080c, 0xa830, 0x080c, -+ 0x70b7, 0x1190, 0x0006, 0x0026, 0x0036, 0x080c, 0x70d1, 0x1138, -+ 0x080c, 0x73b7, 0x080c, 0x5cdc, 0x080c, 0x6fe8, 0x0010, 0x080c, -+ 0x708b, 0x003e, 0x002e, 0x000e, 0x0005, 0x080c, 0x3150, 0x1904, -+ 0xc440, 0x080c, 0xc5e0, 0x1904, 0xc11b, 0x6106, 0x080c, 0xc5fc, -+ 0x1120, 0x6007, 0x002b, 0x0804, 0xc22d, 0x6007, 0x002c, 0x0804, -+ 0xc22d, 0x080c, 0xd46d, 0x1904, 0xc440, 0x080c, 0x3150, 0x1904, -+ 0xc440, 0x080c, 0xc5e0, 0x1904, 0xc11b, 0x6106, 0x080c, 0xc601, -+ 0x1120, 0x6007, 0x002e, 0x0804, 0xc22d, 0x6007, 0x002f, 0x0804, -+ 0xc22d, 0x080c, 0x3150, 0x1904, 0xc440, 0x00e6, 0x00d6, 0x00c6, -+ 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, 0x9086, 0x0006, 0x0158, -+ 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, 0x0128, 0x00ce, 0x00de, -+ 0x00ee, 0x0804, 0xc234, 0x080c, 0x5391, 0xd0e4, 0x0904, 0xc38b, -+ 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, 0x603e, 0x7108, 0x720c, -+ 0x080c, 0x6663, 0x0140, 0x6010, 0x2058, 0xb810, 0x9106, 0x1118, -+ 0xb814, 0x9206, 0x0510, 0x080c, 0x665f, 0x15b8, 0x2069, 0x1800, -+ 0x687c, 0x9206, 0x1590, 0x6878, 0x9106, 0x1578, 0x7210, 0x080c, -+ 0xb835, 0x0590, 0x080c, 0xc4cb, 0x0578, 0x080c, 0xd2ef, 0x0560, -+ 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, -+ 0x84d1, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x7214, 0x9286, 0xffff, -+ 0x0150, 0x080c, 0xb835, 0x01c0, 0x9280, 0x0002, 0x2004, 0x7110, -+ 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, 0x9085, 0x0001, 0x080c, -+ 0xd245, 0x2c10, 0x2160, 0x0140, 0x0890, 0x6007, 0x0037, 0x602f, -+ 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, 0x0037, 0x602f, 0x0003, -+ 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, 0x0868, 0x080c, 0x3150, -+ 0x1904, 0xc440, 0x6010, 0x2058, 0xb804, 0x9084, 0xff00, 0x8007, -+ 0x9086, 0x0006, 0x1904, 0xc234, 0x00e6, 0x00d6, 0x00c6, 0x080c, -+ 0x5391, 0xd0e4, 0x0904, 0xc403, 0x2069, 0x1800, 0x2071, 0x026c, -+ 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, 0xffff, 0x1150, 0x7208, -+ 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, 0xd245, 0x2c10, 0x00ce, -+ 0x05e8, 0x080c, 0xb835, 0x05d0, 0x7108, 0x9280, 0x0002, 0x2004, -+ 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, 0x080c, 0xb445, 0x002e, -+ 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, 0x9186, 0x0001, 0x0178, -+ 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, 0x1198, 0x9280, 0x0005, -+ 0x2004, 0x9005, 0x0170, 0x080c, 0xc4cb, 0x0904, 0xc384, 0x0056, -+ 0x7510, 0x7614, 0x080c, 0xd308, 0x005e, 0x00ce, 0x00de, 0x00ee, -+ 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, 0x6003, -+ 0x0001, 0x2009, 0x8020, 0x080c, 0x84d1, 0x0c78, 0x6007, 0x003b, -+ 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, 0x0001, 0x2009, 0x8020, -+ 0x080c, 0x84d1, 0x0c10, 0x6007, 0x003b, 0x602f, 0x000b, 0x6017, -+ 0x0000, 0x0804, 0xc35b, 0x00e6, 0x0026, 0x080c, 0x6625, 0x0550, -+ 0x080c, 0x660e, 0x080c, 0xd4df, 0x1518, 0x2071, 0x1800, 0x70d8, -+ 0x9085, 0x0003, 0x70da, 0x00f6, 0x2079, 0x0100, 0x72ac, 0x9284, -+ 0x00ff, 0x707a, 0x78e6, 0x9284, 0xff00, 0x727c, 0x9205, 0x707e, -+ 0x78ea, 0x00fe, 0x70e3, 0x0000, 0x080c, 0x6663, 0x0120, 0x2011, -+ 0x19da, 0x2013, 0x07d0, 0xd0ac, 0x1128, 0x080c, 0x2ddb, 0x0010, -+ 0x080c, 0xd511, 0x002e, 0x00ee, 0x080c, 0x9be7, 0x0804, 0xc233, -+ 0x080c, 0x9be7, 0x0005, 0x2600, 0x0002, 0xc457, 0xc457, 0xc457, -+ 0xc457, 0xc457, 0xc459, 0xc457, 0xc457, 0xc457, 0xc457, 0xc476, -+ 0xc457, 0xc457, 0xc457, 0xc488, 0xc495, 0xc4c6, 0xc457, 0x080c, -+ 0x0d65, 0x080c, 0xd46d, 0x1d20, 0x080c, 0x3150, 0x1d08, 0x080c, -+ 0xc5e0, 0x1148, 0x7038, 0x6016, 0x6007, 0x0045, 0x6003, 0x0001, -+ 0x080c, 0x84d8, 0x0005, 0x080c, 0x3006, 0x080c, 0xbf76, 0x6007, -+ 0x0001, 0x6003, 0x0001, 0x080c, 0x84d8, 0x0005, 0x080c, 0xd46d, -+ 0x1938, 0x080c, 0x3150, 0x1920, 0x080c, 0xc5e0, 0x1d60, 0x703c, -+ 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, 0x080c, 0x84d8, 0x0005, -+ 0x080c, 0xc4e8, 0x0904, 0xc440, 0x6007, 0x004e, 0x6003, 0x0001, -+ 0x080c, 0x84d8, 0x080c, 0x8936, 0x0005, 0x6007, 0x004f, 0x6017, -+ 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, -+ 0x1160, 0x7140, 0x2001, 0x198e, 0x2004, 0x9106, 0x11b0, 0x7144, -+ 0x2001, 0x198f, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, -+ 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, -+ 0x000a, 0x080c, 0xabdf, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, -+ 0x0001, 0x080c, 0x84d8, 0x080c, 0x8936, 0x0005, 0x6007, 0x0050, -+ 0x703c, 0x6016, 0x0ca0, 0x0016, 0x00e6, 0x2071, 0x0260, 0x00b6, -+ 0x00c6, 0x2260, 0x6010, 0x2058, 0xb8c4, 0xd084, 0x0150, 0x7128, -+ 0x6050, 0x9106, 0x1120, 0x712c, 0x604c, 0x9106, 0x0110, 0x9006, -+ 0x0010, 0x9085, 0x0001, 0x00ce, 0x00be, 0x00ee, 0x001e, 0x0005, -+ 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x1800, 0x708c, 0x908a, 0x00f9, 0x16e8, 0x20e1, -+ 0x0000, 0x2001, 0x1971, 0x2003, 0x0000, 0x080c, 0x103b, 0x05a0, -+ 0x2900, 0x6016, 0x708c, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, -+ 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x001b, 0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x0471, 0x001e, -+ 0x2940, 0x080c, 0x103b, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, -+ 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x001b, 0x20a0, 0x2001, 0x1971, 0x0016, 0x200c, 0x00b1, 0x001e, -+ 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, 0x1800, 0x708f, 0x0000, -+ 0x6014, 0x2048, 0x080c, 0x0fd4, 0x9006, 0x012e, 0x01de, 0x01ce, -+ 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, -+ 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, 0x080c, 0x202b, 0x2099, -+ 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, -+ 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x202b, 0x2099, -+ 0x0260, 0x0ca8, 0x080c, 0x202b, 0x2061, 0x1971, 0x6004, 0x2098, -+ 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, -+ 0x4003, 0x22a8, 0x8108, 0x080c, 0x202b, 0x2099, 0x0260, 0x0ca8, -+ 0x2061, 0x1971, 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, 0x2043, 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, -+ 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, -+ 0x22a8, 0x8108, 0x080c, 0x2043, 0x20a1, 0x0240, 0x0c98, 0x080c, -+ 0x2043, 0x2061, 0x1974, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, -+ 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, -+ 0x22a8, 0x8108, 0x080c, 0x2043, 0x20a1, 0x0240, 0x0c98, 0x2061, -+ 0x1974, 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, 0x080c, 0xc676, 0x00de, -+ 0x0005, 0x00d6, 0x080c, 0xc683, 0x1520, 0x680c, 0x908c, 0xff00, -+ 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, -+ 0x0130, 0x9006, 0x080c, 0xd589, 0x2009, 0x0001, 0x0078, 0xd1ec, -+ 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824, 0x080c, 0x2424, 0x1148, -+ 0x2001, 0x0001, 0x080c, 0xd589, 0x2110, 0x900e, 0x080c, 0x305b, -+ 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, -+ 0x00c6, 0x080c, 0x9c58, 0x0598, 0x0016, 0x0026, 0x00c6, 0x2011, -+ 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2424, 0x1568, 0x080c, -+ 0x6210, 0x1550, 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, -+ 0x6012, 0x080c, 0xd46d, 0x11c8, 0x080c, 0x3150, 0x11b0, 0x080c, -+ 0xc5e0, 0x0500, 0x2001, 0x0007, 0x080c, 0x61c1, 0x2001, 0x0007, -+ 0x080c, 0x61ed, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, -+ 0x6003, 0x0001, 0x080c, 0x84d8, 0x0010, 0x080c, 0x9be7, 0x9085, -+ 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, 0x9be7, 0x00ce, 0x002e, -+ 0x001e, 0x0ca8, 0x080c, 0x9be7, 0x9006, 0x0c98, 0x2069, 0x026d, -+ 0x6800, 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, -+ 0x0008, 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, -+ 0x9084, 0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, -+ 0x0118, 0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, -+ 0x910d, 0x6162, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, -+ 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d65, 0x91b6, 0x0013, 0x1130, -+ 0x2008, 0x91b2, 0x0040, 0x1a04, 0xc7c3, 0x0092, 0x91b6, 0x0027, -+ 0x0120, 0x91b6, 0x0014, 0x190c, 0x0d65, 0x2001, 0x0007, 0x080c, -+ 0x61ed, 0x080c, 0x8874, 0x080c, 0x9c21, 0x080c, 0x8936, 0x0005, -+ 0xc700, 0xc702, 0xc700, 0xc700, 0xc700, 0xc702, 0xc70f, 0xc7c0, -+ 0xc75f, 0xc7c0, 0xc771, 0xc7c0, 0xc70f, 0xc7c0, 0xc7b8, 0xc7c0, -+ 0xc7b8, 0xc7c0, 0xc7c0, 0xc700, 0xc700, 0xc700, 0xc700, 0xc700, -+ 0xc700, 0xc700, 0xc700, 0xc700, 0xc700, 0xc700, 0xc702, 0xc700, -+ 0xc7c0, 0xc700, 0xc700, 0xc7c0, 0xc700, 0xc7bd, 0xc7c0, 0xc700, -+ 0xc700, 0xc700, 0xc700, 0xc7c0, 0xc7c0, 0xc700, 0xc7c0, 0xc7c0, -+ 0xc700, 0xc70a, 0xc700, 0xc700, 0xc700, 0xc700, 0xc7bc, 0xc7c0, -+ 0xc700, 0xc700, 0xc7c0, 0xc7c0, 0xc700, 0xc700, 0xc700, 0xc700, -+ 0x080c, 0x0d65, 0x080c, 0xbf79, 0x6003, 0x0002, 0x080c, 0x8936, -+ 0x0804, 0xc7c2, 0x9006, 0x080c, 0x61ad, 0x0804, 0xc7c0, 0x080c, -+ 0x665f, 0x1904, 0xc7c0, 0x9006, 0x080c, 0x61ad, 0x6010, 0x2058, -+ 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800, 0x78a4, -+ 0x8000, 0x78a6, 0x00fe, 0x0428, 0x6010, 0x2058, 0xb884, 0x9005, -+ 0x1178, 0x080c, 0xbf61, 0x1904, 0xc7c0, 0x0036, 0x0046, 0xbba0, -+ 0x2021, 0x0007, 0x080c, 0x4a75, 0x004e, 0x003e, 0x0804, 0xc7c0, -+ 0x080c, 0x3181, 0x1904, 0xc7c0, 0x2001, 0x1800, 0x2004, 0x9086, -+ 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a4, 0x8000, 0x78a6, -+ 0x00fe, 0x2001, 0x0002, 0x080c, 0x61c1, 0x6023, 0x0001, 0x6003, -+ 0x0001, 0x6007, 0x0002, 0x080c, 0x84d8, 0x080c, 0x8936, 0x6110, -+ 0x2158, 0x2009, 0x0001, 0x080c, 0x8167, 0x0804, 0xc7c2, 0x6610, -+ 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0904, -+ 0xc7c0, 0x9686, 0x0004, 0x0904, 0xc7c0, 0x2001, 0x0004, 0x0804, -+ 0xc7be, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, -+ 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, 0x4a75, -+ 0x004e, 0x003e, 0x2001, 0x0006, 0x080c, 0xc7dc, 0x6610, 0x2658, -+ 0xbe04, 0x0066, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x006e, -+ 0x0168, 0x2001, 0x0006, 0x080c, 0x61ed, 0x9284, 0x00ff, 0x908e, -+ 0x0007, 0x1120, 0x2001, 0x0006, 0x080c, 0x61c1, 0x080c, 0x665f, -+ 0x11f8, 0x2001, 0x1836, 0x2004, 0xd0a4, 0x01d0, 0xbe04, 0x96b4, -+ 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, 0x2079, 0x1800, 0x78a4, -+ 0x8000, 0x78a6, 0x00fe, 0x0804, 0xc749, 0x2001, 0x0004, 0x0030, -+ 0x2001, 0x0006, 0x0409, 0x0020, 0x0018, 0x0010, 0x080c, 0x61ed, -+ 0x080c, 0x9be7, 0x0005, 0x2600, 0x0002, 0xc7d7, 0xc7d7, 0xc7d7, -+ 0xc7d7, 0xc7d7, 0xc7d9, 0xc7d7, 0xc7d7, 0xc7d7, 0xc7d7, 0xc7d9, -+ 0xc7d7, 0xc7d7, 0xc7d7, 0xc7d9, 0xc7d9, 0xc7d9, 0xc7d9, 0x080c, -+ 0x0d65, 0x080c, 0x9be7, 0x0005, 0x0016, 0x00b6, 0x00d6, 0x6110, -+ 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, 0x61c1, 0x9006, 0x080c, -+ 0x61ad, 0x080c, 0x303b, 0x00de, 0x00be, 0x001e, 0x0005, 0x6610, -+ 0x2658, 0xb804, 0x9084, 0xff00, 0x8007, 0x90b2, 0x000c, 0x1a0c, -+ 0x0d65, 0x91b6, 0x0015, 0x1110, 0x003b, 0x0028, 0x91b6, 0x0016, -+ 0x190c, 0x0d65, 0x006b, 0x0005, 0xa670, 0xa670, 0xa670, 0xa670, -+ 0xa670, 0xa670, 0xc85b, 0xc81c, 0xa670, 0xa670, 0xa670, 0xa670, -+ 0xa670, 0xa670, 0xa670, 0xa670, 0xa670, 0xa670, 0xc85b, 0xc862, -+ 0xa670, 0xa670, 0xa670, 0xa670, 0x00f6, 0x080c, 0x665f, 0x11d8, -+ 0x080c, 0xbf61, 0x11c0, 0x6010, 0x905d, 0x01a8, 0xb884, 0x9005, -+ 0x0190, 0x9006, 0x080c, 0x61ad, 0x2001, 0x0002, 0x080c, 0x61c1, -+ 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x84d8, -+ 0x080c, 0x8936, 0x00f0, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, -+ 0x080c, 0x2424, 0x11b0, 0x080c, 0x6270, 0x0118, 0x080c, 0x9be7, -+ 0x0080, 0xb810, 0x0006, 0xb814, 0x0006, 0xb884, 0x0006, 0x080c, -+ 0x5cf6, 0x000e, 0xb886, 0x000e, 0xb816, 0x000e, 0xb812, 0x080c, -+ 0x9be7, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, 0x1110, 0x080c, -+ 0x9be7, 0x0005, 0x080c, 0xaa54, 0x1148, 0x6003, 0x0001, 0x6007, -+ 0x0001, 0x080c, 0x84d8, 0x080c, 0x8936, 0x0010, 0x080c, 0x9be7, -+ 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d65, 0x080c, 0x8874, -+ 0x080c, 0x9c21, 0x0005, 0x9182, 0x0040, 0x0002, 0xc891, 0xc891, -+ 0xc891, 0xc891, 0xc893, 0xc891, 0xc891, 0xc891, 0xc891, 0xc891, -+ 0xc891, 0xc891, 0xc891, 0xc891, 0xc891, 0xc891, 0xc891, 0xc891, -+ 0xc891, 0x080c, 0x0d65, 0x0096, 0x00b6, 0x00d6, 0x00e6, 0x00f6, -+ 0x0046, 0x0026, 0x6210, 0x2258, 0xb8ac, 0x9005, 0x11b0, 0x6007, -+ 0x0044, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, 0x0904, 0xc8fa, -+ 0x080c, 0xd57d, 0x1170, 0x9486, 0x2000, 0x1158, 0x2009, 0x0001, -+ 0x2011, 0x0200, 0x080c, 0x83eb, 0x0020, 0x9026, 0x080c, 0xd4b2, -+ 0x0c30, 0x080c, 0x1022, 0x090c, 0x0d65, 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, 0x6996, -+ 0x001e, 0x080c, 0xd57d, 0x1904, 0xc95a, 0x9486, 0x2000, 0x1130, -+ 0x2019, 0x0017, 0x080c, 0xd1eb, 0x0804, 0xc95a, 0x9486, 0x0200, -+ 0x1120, 0x080c, 0xd17b, 0x0804, 0xc95a, 0x9486, 0x0400, 0x0120, -+ 0x9486, 0x1000, 0x1904, 0xc95a, 0x2019, 0x0002, 0x080c, 0xd19a, -+ 0x0804, 0xc95a, 0x2069, 0x1a3f, 0x6a00, 0xd284, 0x0904, 0xc9c4, -+ 0x9284, 0x0300, 0x1904, 0xc9bd, 0x6804, 0x9005, 0x0904, 0xc9a5, -+ 0x2d78, 0x6003, 0x0007, 0x080c, 0x103b, 0x0904, 0xc966, 0x7800, -+ 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, 0x0000, 0x2001, -+ 0x180f, 0x2004, 0xd084, 0x1904, 0xc9c8, 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, 0xc962, 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, 0x6999, 0x002e, 0x004e, 0x00fe, 0x00ee, 0x00de, 0x00be, -+ 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, 0x2001, 0x1810, -+ 0x2004, 0xd084, 0x0120, 0x080c, 0x1022, 0x1904, 0xc90f, 0x6017, -+ 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, -+ 0x84d1, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, 0xff00, 0x9086, -+ 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, 0x6114, 0x918c, -+ 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, 0x6007, 0x0043, -+ 0x2009, 0xa025, 0x080c, 0x84d1, 0x0828, 0x6868, 0x602e, 0x686c, -+ 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, -+ 0xa022, 0x080c, 0x84d1, 0x0804, 0xc95a, 0x2001, 0x180e, 0x2004, -+ 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x48d8, 0x6017, 0xf300, -+ 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, -+ 0xa022, 0x080c, 0x84d1, 0x0804, 0xc95a, 0x6017, 0xf500, 0x0c98, -+ 0x6017, 0xf600, 0x0804, 0xc97a, 0x6017, 0xf200, 0x0804, 0xc97a, -+ 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, 0x2c00, 0xa87a, -+ 0x7044, 0x9084, 0x0003, 0x9080, 0xc962, 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, 0x0d65, -+ 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, 0x20e8, 0xa85c, -+ 0x9080, 0x0029, 0x20a0, 0x2011, 0xca44, 0x2041, 0x0001, 0x223d, -+ 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, 0x4003, 0x931a, -+ 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, 0x2001, 0x0260, -+ 0x2098, 0x0c68, 0x2950, 0x080c, 0x103b, 0x0170, 0x2900, 0xb002, -+ 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, 0x902d, 0x0118, -+ 0x080c, 0x1054, 0x0cc8, 0x080c, 0x1054, 0x0804, 0xc966, 0x2548, -+ 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, 0x200b, 0x0000, -+ 0x080c, 0xd21e, 0x0804, 0xc95a, 0x8010, 0x0004, 0x801a, 0x0006, -+ 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, 0x0013, 0x1160, -+ 0x6004, 0x908a, 0x0057, 0x1a0c, 0x0d65, 0x9082, 0x0040, 0x0a0c, -+ 0x0d65, 0x2008, 0x0804, 0xcacf, 0x9186, 0x0051, 0x0108, 0x0040, -+ 0x080c, 0x9ab7, 0x01e8, 0x9086, 0x0002, 0x0904, 0xcb16, 0x00c0, -+ 0x9186, 0x0027, 0x0180, 0x9186, 0x0048, 0x0128, 0x9186, 0x0014, -+ 0x0150, 0x190c, 0x0d65, 0x080c, 0x9ab7, 0x0150, 0x9086, 0x0004, -+ 0x0904, 0xcbb3, 0x0028, 0x6004, 0x9082, 0x0040, 0x2008, 0x001a, -+ 0x080c, 0x9ca2, 0x0005, 0xca96, 0xca98, 0xca98, 0xcabf, 0xca96, -+ 0xca96, 0xca96, 0xca96, 0xca96, 0xca96, 0xca96, 0xca96, 0xca96, -+ 0xca96, 0xca96, 0xca96, 0xca96, 0xca96, 0xca96, 0x080c, 0x0d65, -+ 0x080c, 0x8874, 0x080c, 0x8936, 0x0036, 0x0096, 0x6014, 0x904d, -+ 0x01d8, 0x080c, 0xb847, 0x01c0, 0x6003, 0x0002, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, 0x0004, 0x080c, -+ 0xd21e, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, 0x2001, 0x1958, -+ 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x0096, -+ 0x080c, 0x8874, 0x080c, 0x8936, 0x080c, 0xb847, 0x0120, 0x6014, -+ 0x2048, 0x080c, 0x1054, 0x080c, 0x9c21, 0x009e, 0x0005, 0x0002, -+ 0xcae3, 0xcaf8, 0xcae5, 0xcb0d, 0xcae3, 0xcae3, 0xcae3, 0xcae3, -+ 0xcae3, 0xcae3, 0xcae3, 0xcae3, 0xcae3, 0xcae3, 0xcae3, 0xcae3, -+ 0xcae3, 0xcae3, 0xcae3, 0x080c, 0x0d65, 0x0096, 0x6014, 0x2048, -+ 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, 0x0043, 0x080c, -+ 0x9c85, 0x0010, 0x6003, 0x0004, 0x080c, 0x8936, 0x009e, 0x0005, -+ 0x080c, 0xb847, 0x0138, 0x6114, 0x0096, 0x2148, 0xa97c, 0x009e, -+ 0xd1ec, 0x1138, 0x080c, 0x83c0, 0x080c, 0x9be7, 0x080c, 0x8936, -+ 0x0005, 0x080c, 0xd476, 0x0db0, 0x0cc8, 0x6003, 0x0001, 0x6007, -+ 0x0041, 0x2009, 0xa022, 0x080c, 0x84d1, 0x0005, 0x9182, 0x0040, -+ 0x0002, 0xcb2c, 0xcb2e, 0xcb2c, 0xcb2c, 0xcb2c, 0xcb2c, 0xcb2c, -+ 0xcb2c, 0xcb2c, 0xcb2c, 0xcb2c, 0xcb2c, 0xcb2c, 0xcb2c, 0xcb2c, -+ 0xcb2c, 0xcb2c, 0xcb2f, 0xcb2c, 0x080c, 0x0d65, 0x0005, 0x00d6, -+ 0x080c, 0x83c0, 0x00de, 0x080c, 0xd4ce, 0x080c, 0x9be7, 0x0005, -+ 0x9182, 0x0040, 0x0002, 0xcb4e, 0xcb4e, 0xcb4e, 0xcb4e, 0xcb4e, -+ 0xcb4e, 0xcb4e, 0xcb4e, 0xcb4e, 0xcb50, 0xcb7b, 0xcb4e, 0xcb4e, -+ 0xcb4e, 0xcb4e, 0xcb7b, 0xcb4e, 0xcb4e, 0xcb4e, 0x080c, 0x0d65, -+ 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x908c, 0x0003, -+ 0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168, 0x2009, 0x0041, -+ 0x009e, 0x0804, 0xcc3b, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, -+ 0x83c0, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, 0xd1ec, 0x1130, -+ 0x080c, 0x83c0, 0x080c, 0x9be7, 0x009e, 0x0005, 0x080c, 0xd476, -+ 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, 0xc1d4, 0x2102, -+ 0x0036, 0x080c, 0x88d1, 0x080c, 0x8936, 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, 0xd21e, 0x6018, 0x9005, 0x1128, 0x2001, -+ 0x1958, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, 0x6003, 0x0007, -+ 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, 0xcbca, 0xcbca, -+ 0xcbca, 0xcbca, 0xcbca, 0xcbca, 0xcbca, 0xcbca, 0xcbcc, 0xcbca, -+ 0xcbca, 0xcbca, 0xcbca, 0xcbca, 0xcbca, 0xcbca, 0xcbca, 0xcbca, -+ 0xcbca, 0xcc17, 0x080c, 0x0d65, 0x6014, 0x0096, 0x2048, 0xa834, -+ 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1bc, 0x1190, -+ 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, 0x0041, 0x009e, -+ 0x0804, 0xcc3b, 0x6003, 0x0007, 0x601b, 0x0000, 0x080c, 0x83c0, -+ 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, 0x180e, 0x210c, 0xd19c, -+ 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, 0x00e9, 0x080c, -+ 0x83c2, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, 0x0005, 0x6024, -+ 0xd0f4, 0x0128, 0x080c, 0x1595, 0x1904, 0xcbcc, 0x0005, 0x6014, -+ 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, 0x1120, 0x080c, -+ 0x1595, 0x1904, 0xcbcc, 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, 0x0d65, 0x6024, 0xd0dc, -+ 0x090c, 0x0d65, 0x0005, 0xcc5e, 0xcc6a, 0xcc76, 0xcc82, 0xcc5e, -+ 0xcc5e, 0xcc5e, 0xcc5e, 0xcc65, 0xcc60, 0xcc60, 0xcc5e, 0xcc5e, -+ 0xcc5e, 0xcc5e, 0xcc60, 0xcc5e, 0xcc60, 0xcc5e, 0x080c, 0x0d65, -+ 0x6024, 0xd0dc, 0x090c, 0x0d65, 0x0005, 0x6014, 0x9005, 0x190c, -+ 0x0d65, 0x0005, 0x6003, 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, -+ 0x2009, 0xa022, 0x080c, 0x84b3, 0x012e, 0x0005, 0x6003, 0x0004, -+ 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa001, 0x080c, 0x84d1, -+ 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c, 0x1aa5, 0x0126, -+ 0x2091, 0x8000, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0188, -+ 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x6024, 0xd0cc, 0x1148, -+ 0xd0c4, 0x1138, 0xa8a8, 0x9005, 0x1120, 0x6144, 0x918d, 0xb035, -+ 0x0018, 0x6144, 0x918d, 0xa035, 0x009e, 0x080c, 0x8518, 0x012e, -+ 0x0005, 0x6144, 0x918d, 0xa032, 0x0cb8, 0x0126, 0x2091, 0x8000, -+ 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, 0x003e, 0x012e, -+ 0x0005, 0xccc9, 0xcccb, 0xcce0, 0xccfa, 0xccc9, 0xccc9, 0xccc9, -+ 0xccc9, 0xccc9, 0xccc9, 0xccc9, 0xccc9, 0xccc9, 0xccc9, 0xccc9, -+ 0xccc9, 0x080c, 0x0d65, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0510, -+ 0x909c, 0x0003, 0x939e, 0x0003, 0x01e8, 0x6003, 0x0001, 0x6106, -+ 0x0126, 0x2091, 0x8000, 0x2009, 0xa022, 0x080c, 0x84d1, 0x0470, -+ 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, 0x0003, 0x939e, -+ 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x2009, 0xa001, 0x080c, -+ 0x84d1, 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, 0x0004, 0x080c, -+ 0xd21e, 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0d98, 0x909c, -+ 0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, 0x6106, 0x080c, -+ 0x1aa5, 0x6144, 0x918d, 0xa035, 0x080c, 0x8518, 0x0005, 0x080c, -+ 0x8874, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xd51a, -+ 0x0036, 0x2019, 0x0029, 0x080c, 0xd21e, 0x003e, 0x009e, 0x080c, -+ 0x9c21, 0x080c, 0x8936, 0x0005, 0x080c, 0x88d1, 0x6114, 0x81ff, -+ 0x0158, 0x0096, 0x2148, 0x080c, 0xd51a, 0x0036, 0x2019, 0x0029, -+ 0x080c, 0xd21e, 0x003e, 0x009e, 0x080c, 0x9c21, 0x0005, 0x9182, -+ 0x0085, 0x0002, 0xcd49, 0xcd47, 0xcd47, 0xcd55, 0xcd47, 0xcd47, -+ 0xcd47, 0xcd47, 0xcd47, 0xcd47, 0xcd47, 0xcd47, 0xcd47, 0x080c, -+ 0x0d65, 0x6003, 0x000b, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, -+ 0x8020, 0x080c, 0x84d1, 0x012e, 0x0005, 0x0026, 0x00e6, 0x080c, -+ 0xd46d, 0x0118, 0x080c, 0x9be7, 0x0440, 0x2071, 0x0260, 0x7224, -+ 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, 0x6010, 0x00b6, -+ 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, 0x080c, 0x9f13, -+ 0x7220, 0x080c, 0xd0b4, 0x0118, 0x6007, 0x0086, 0x0040, 0x6007, -+ 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, 0x0086, 0x6003, -+ 0x0001, 0x2009, 0x8020, 0x080c, 0x84d1, 0x00ee, 0x002e, 0x0005, -+ 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d65, -+ 0x908a, 0x0092, 0x1a0c, 0x0d65, 0x9082, 0x0085, 0x00a2, 0x9186, -+ 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, 0x9ca2, 0x0050, -+ 0x2001, 0x0007, 0x080c, 0x61ed, 0x080c, 0x8874, 0x080c, 0x9c21, -+ 0x080c, 0x8936, 0x0005, 0xcdb8, 0xcdba, 0xcdba, 0xcdb8, 0xcdb8, -+ 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb8, 0xcdb8, -+ 0x080c, 0x0d65, 0x080c, 0x9c21, 0x080c, 0x8936, 0x0005, 0x9182, -+ 0x0085, 0x0a0c, 0x0d65, 0x9182, 0x0092, 0x1a0c, 0x0d65, 0x9182, -+ 0x0085, 0x0002, 0xcdd7, 0xcdd7, 0xcdd7, 0xcdd9, 0xcdd7, 0xcdd7, -+ 0xcdd7, 0xcdd7, 0xcdd7, 0xcdd7, 0xcdd7, 0xcdd7, 0xcdd7, 0x080c, -+ 0x0d65, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, 0x0014, 0x0130, -+ 0x9186, 0x0027, 0x0118, 0x080c, 0x9ca2, 0x0020, 0x080c, 0x8874, -+ 0x080c, 0x9c21, 0x0005, 0x0036, 0x080c, 0xd4ce, 0x604b, 0x0000, -+ 0x2019, 0x000b, 0x0031, 0x6023, 0x0006, 0x6003, 0x0007, 0x003e, -+ 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, 0x2001, 0x0382, 0x2004, -+ 0x9084, 0x0007, 0x0006, 0x9086, 0x0003, 0x0110, 0x080c, 0x98c8, -+ 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0x9382, 0x009e, 0x008e, -+ 0x1550, 0x0076, 0x2c38, 0x080c, 0x942d, 0x007e, 0x1520, 0x6000, -+ 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, 0x01e0, 0x0096, -+ 0x601c, 0xd084, 0x0140, 0x080c, 0xd4ce, 0x080c, 0xbf79, 0x080c, -+ 0x1914, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, 0xb847, 0x0110, -+ 0x080c, 0xd21e, 0x009e, 0x6017, 0x0000, 0x080c, 0xd4ce, 0x6023, -+ 0x0007, 0x080c, 0xbf79, 0x000e, 0x9086, 0x0003, 0x0110, 0x080c, -+ 0x98e4, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, 0x00b6, 0x0036, -+ 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, 0x080c, 0x2424, 0x15e8, -+ 0x0016, 0x00c6, 0x080c, 0x6270, 0x15b0, 0x001e, 0x00c6, 0x2160, -+ 0x080c, 0xbf76, 0x00ce, 0x002e, 0x0026, 0x0016, 0x080c, 0x98c8, -+ 0x2019, 0x0029, 0x080c, 0x94f4, 0x080c, 0x863b, 0x0076, 0x903e, -+ 0x080c, 0x852a, 0x007e, 0x001e, 0x0076, 0x903e, 0x080c, 0xcfc8, -+ 0x007e, 0x080c, 0x98e4, 0x0026, 0xba04, 0x9294, 0xff00, 0x8217, -+ 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, 0xbaa0, 0x080c, -+ 0x30dc, 0x002e, 0xbc84, 0x001e, 0x080c, 0x5cf6, 0xbe12, 0xbd16, -+ 0xbc86, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, 0x003e, 0x00be, -+ 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, 0x0016, 0x2009, -+ 0x1823, 0x2104, 0x9086, 0x0074, 0x1904, 0xceec, 0x2069, 0x0260, -+ 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, 0x8000, 0x0904, -+ 0xcee9, 0x2001, 0x194d, 0x2004, 0x9005, 0x1140, 0x6010, 0x2058, -+ 0xb884, 0x9005, 0x0118, 0x9184, 0x0800, 0x0598, 0x6948, 0x918a, -+ 0x0001, 0x0648, 0x080c, 0xd582, 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, 0x0180, 0x9286, 0x0004, 0x0168, 0x9394, -+ 0xff00, 0x8217, 0x9286, 0x0006, 0x0138, 0x9286, 0x0004, 0x0120, -+ 0x080c, 0x627f, 0x0804, 0xcf57, 0x2011, 0x0276, 0x20a9, 0x0004, -+ 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xabdf, 0x009e, 0x15c0, -+ 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, -+ 0x080c, 0xabdf, 0x009e, 0x1560, 0x0046, 0x0016, 0xbaa0, 0x2220, -+ 0x9006, 0x2009, 0x1854, 0x210c, 0x0038, 0x2009, 0x0029, 0x080c, -+ 0xd273, 0xb800, 0xc0e5, 0xb802, 0x080c, 0x98c8, 0x2019, 0x0029, -+ 0x080c, 0x863b, 0x0076, 0x2039, 0x0000, 0x080c, 0x852a, 0x2c08, -+ 0x080c, 0xcfc8, 0x007e, 0x080c, 0x98e4, 0x2001, 0x0007, 0x080c, -+ 0x61ed, 0x2001, 0x0007, 0x080c, 0x61c1, 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, 0x2424, 0x11d0, -+ 0x080c, 0x6270, 0x11b8, 0x2011, 0x0270, 0x20a9, 0x0004, 0x0096, -+ 0x2b48, 0x2019, 0x000a, 0x080c, 0xabdf, 0x009e, 0x1158, 0x2011, -+ 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, -+ 0xabdf, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x00fe, 0x00be, -+ 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, 0x0036, 0x0156, 0x2011, -+ 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x2424, 0x11d0, 0x080c, -+ 0x6270, 0x11b8, 0x2011, 0x0276, 0x20a9, 0x0004, 0x0096, 0x2b48, -+ 0x2019, 0x000a, 0x080c, 0xabdf, 0x009e, 0x1158, 0x2011, 0x027a, -+ 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x0006, 0x080c, 0xabdf, -+ 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, 0x000e, 0x00be, 0x0005, -+ 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x9926, 0x0106, 0x190c, 0x98c8, -+ 0x2740, 0x2029, 0x19c4, 0x252c, 0x2021, 0x19cb, 0x2424, 0x2061, -+ 0x1ddc, 0x2071, 0x1800, 0x7650, 0x7070, 0x81ff, 0x0150, 0x0006, -+ 0x9186, 0x1b02, 0x000e, 0x0128, 0x8001, 0x9602, 0x1a04, 0xd069, -+ 0x0018, 0x9606, 0x0904, 0xd069, 0x2100, 0x9c06, 0x0904, 0xd060, -+ 0x080c, 0xd2b4, 0x1904, 0xd060, 0x080c, 0xd59f, 0x0904, 0xd060, -+ 0x080c, 0xd2a4, 0x0904, 0xd060, 0x6720, 0x9786, 0x0001, 0x1148, -+ 0x080c, 0x3181, 0x0904, 0xd088, 0x6004, 0x9086, 0x0000, 0x1904, -+ 0xd088, 0x9786, 0x0004, 0x0904, 0xd088, 0x9786, 0x0007, 0x0904, -+ 0xd060, 0x2500, 0x9c06, 0x0904, 0xd060, 0x2400, 0x9c06, 0x0904, -+ 0xd060, 0x88ff, 0x0118, 0x605c, 0x9906, 0x15d0, 0x0096, 0x6043, -+ 0xffff, 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1914, -+ 0x001e, 0x9786, 0x000a, 0x0148, 0x080c, 0xba5c, 0x1130, 0x080c, -+ 0xa58f, 0x009e, 0x080c, 0x9c21, 0x0418, 0x6014, 0x2048, 0x080c, -+ 0xb847, 0x01d8, 0x9786, 0x0003, 0x1588, 0xa867, 0x0103, 0xa87c, -+ 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fd4, 0x009e, -+ 0xab7a, 0xa877, 0x0000, 0x080c, 0xd51a, 0x0016, 0x080c, 0xbb45, -+ 0x080c, 0x698a, 0x001e, 0x080c, 0xba36, 0x009e, 0x080c, 0x9c21, -+ 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804, -+ 0xcfe1, 0x010e, 0x190c, 0x98e4, 0x012e, 0x002e, 0x004e, 0x005e, -+ 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, -+ 0x1150, 0x9386, 0x0005, 0x0128, 0x080c, 0xd51a, 0x080c, 0xd21e, -+ 0x08e0, 0x009e, 0x08e8, 0x9786, 0x000a, 0x0908, 0x0804, 0xd045, -+ 0x81ff, 0x09b0, 0x9180, 0x0001, 0x2004, 0x9086, 0x0018, 0x0130, -+ 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, 0x1950, 0x6000, 0x9086, -+ 0x0002, 0x1930, 0x080c, 0xba4b, 0x0130, 0x080c, 0xba5c, 0x1900, -+ 0x080c, 0xa58f, 0x0038, 0x080c, 0x303b, 0x080c, 0xba5c, 0x1110, -+ 0x080c, 0xa58f, 0x080c, 0x9c21, 0x0804, 0xd060, 0xa864, 0x9084, -+ 0x00ff, 0x9086, 0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, -+ 0x2170, 0x9006, 0x080c, 0xd245, 0x001e, 0x0120, 0x6020, 0x9084, -+ 0x000f, 0x001b, 0x00ee, 0x00ce, 0x0005, 0xd0d3, 0xd0d3, 0xd0d3, -+ 0xd0d3, 0xd0d3, 0xd0d3, 0xd0d5, 0xd0d3, 0xd0d3, 0xd0d3, 0xd0d3, -+ 0x9c21, 0x9c21, 0xd0d3, 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, -+ 0x7010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, -+ 0x080c, 0xd273, 0x001e, 0x004e, 0x2019, 0x0002, 0x080c, 0xcdf9, -+ 0x003e, 0x9085, 0x0001, 0x0005, 0x0096, 0x080c, 0xb847, 0x0140, -+ 0x6014, 0x904d, 0x080c, 0xb452, 0x687b, 0x0005, 0x080c, 0x6996, -+ 0x009e, 0x080c, 0x9c21, 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, -+ 0x080c, 0x61ad, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, -+ 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xabcb, 0x003e, 0x002e, -+ 0x001e, 0x015e, 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, -+ 0x0076, 0x0066, 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, -+ 0x1ddc, 0x2079, 0x0001, 0x8fff, 0x0904, 0xd16e, 0x2071, 0x1800, -+ 0x7650, 0x7070, 0x8001, 0x9602, 0x1a04, 0xd16e, 0x88ff, 0x0120, -+ 0x2800, 0x9c06, 0x1590, 0x2078, 0x080c, 0xd2a4, 0x0570, 0x2400, -+ 0x9c06, 0x0558, 0x6720, 0x9786, 0x0006, 0x1538, 0x9786, 0x0007, -+ 0x0520, 0x88ff, 0x1140, 0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, -+ 0x605c, 0x9106, 0x11d0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, -+ 0xd4ce, 0x080c, 0xbf79, 0x080c, 0x1914, 0x6023, 0x0007, 0x6014, -+ 0x2048, 0x080c, 0xb847, 0x0120, 0x0046, 0x080c, 0xd21e, 0x004e, -+ 0x009e, 0x080c, 0x9c21, 0x88ff, 0x1198, 0x9ce0, 0x001c, 0x2001, -+ 0x1819, 0x2004, 0x9c02, 0x1210, 0x0804, 0xd123, 0x9006, 0x012e, -+ 0x00be, 0x006e, 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, -+ 0x98c5, 0x0001, 0x0ca0, 0x080c, 0x98c8, 0x00b6, 0x0076, 0x0056, -+ 0x0086, 0x9046, 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210, -+ 0x2258, 0x0096, 0x904e, 0x080c, 0x9382, 0x009e, 0x008e, 0x903e, -+ 0x080c, 0x942d, 0x080c, 0xd114, 0x005e, 0x007e, 0x00be, 0x080c, -+ 0x98e4, 0x0005, 0x080c, 0x98c8, 0x00b6, 0x0046, 0x0056, 0x0076, -+ 0x00c6, 0x0156, 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, -+ 0x0036, 0x080c, 0x6270, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, -+ 0x2029, 0x0001, 0x0096, 0x904e, 0x080c, 0x9382, 0x009e, 0x008e, -+ 0x903e, 0x080c, 0x942d, 0x080c, 0xd114, 0x005e, 0x003e, 0x001e, -+ 0x8108, 0x1f04, 0xd1a7, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, -+ 0x00be, 0x080c, 0x98e4, 0x0005, 0x080c, 0x98c8, 0x00b6, 0x0076, -+ 0x0056, 0x6210, 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, -+ 0x0048, 0x0096, 0x904e, 0x080c, 0x9382, 0x009e, 0x008e, 0x903e, -+ 0x080c, 0x942d, 0x2c20, 0x080c, 0xd114, 0x005e, 0x007e, 0x00be, -+ 0x080c, 0x98e4, 0x0005, 0x080c, 0x98c8, 0x00b6, 0x0046, 0x0056, -+ 0x0076, 0x00c6, 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, -+ 0x0036, 0x080c, 0x6270, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, -+ 0x2021, 0x0001, 0x080c, 0xd4b2, 0x004e, 0x0096, 0x904e, 0x080c, -+ 0x9382, 0x009e, 0x008e, 0x903e, 0x080c, 0x942d, 0x080c, 0xd114, -+ 0x003e, 0x001e, 0x8108, 0x1f04, 0xd1f7, 0x015e, 0x00ce, 0x007e, -+ 0x005e, 0x004e, 0x00be, 0x080c, 0x98e4, 0x0005, 0x0016, 0x00f6, -+ 0x080c, 0xb845, 0x0198, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, -+ 0x0180, 0xa800, 0x907d, 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, -+ 0x6996, 0x2f48, 0x0cb0, 0xab82, 0x080c, 0x6996, 0x00fe, 0x001e, -+ 0x0005, 0xa800, 0x907d, 0x0130, 0xa803, 0x0000, 0x080c, 0x6996, -+ 0x2f48, 0x0cb8, 0x080c, 0x6996, 0x0c88, 0x00e6, 0x0046, 0x0036, -+ 0x2061, 0x1ddc, 0x9005, 0x1138, 0x2071, 0x1800, 0x7450, 0x7070, -+ 0x8001, 0x9402, 0x12d8, 0x2100, 0x9c06, 0x0168, 0x6000, 0x9086, -+ 0x0000, 0x0148, 0x6008, 0x9206, 0x1130, 0x6010, 0x91a0, 0x0004, -+ 0x2424, 0x9406, 0x0140, 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, -+ 0x9c02, 0x1220, 0x0c40, 0x9085, 0x0001, 0x0008, 0x9006, 0x003e, -+ 0x004e, 0x00ee, 0x0005, 0x0096, 0x0006, 0x080c, 0x1022, 0x000e, -+ 0x090c, 0x0d65, 0xaae2, 0xa867, 0x010d, 0xa88e, 0x0026, 0x2010, -+ 0x080c, 0xb835, 0x2001, 0x0000, 0x0120, 0x2200, 0x9080, 0x0017, -+ 0x2004, 0x002e, 0xa87a, 0x9186, 0x0020, 0x0110, 0xa8e3, 0xffff, -+ 0xa986, 0xac76, 0xa87f, 0x0000, 0x2001, 0x195f, 0x2004, 0xa882, -+ 0x9006, 0xa802, 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x6996, 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, 0x1958, 0x2004, 0x601a, 0x2009, -+ 0x8020, 0x080c, 0x84d1, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, -+ 0x6024, 0xd0e4, 0x0158, 0xd0cc, 0x0118, 0x080c, 0xbb8c, 0x0030, -+ 0x080c, 0xd4ce, 0x080c, 0x83c0, 0x080c, 0x9be7, 0x0005, 0x9280, -+ 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd303, 0xd303, 0xd303, -+ 0xd305, 0xd303, 0xd305, 0xd305, 0xd303, 0xd305, 0xd303, 0xd303, -+ 0xd303, 0xd303, 0xd303, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, -+ 0x9280, 0x0008, 0x2004, 0x9084, 0x000f, 0x0002, 0xd31c, 0xd31c, -+ 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0xd329, 0xd31c, 0xd31c, 0xd31c, -+ 0xd31c, 0xd31c, 0xd31c, 0xd31c, 0x6007, 0x003b, 0x602f, 0x0009, -+ 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x84d1, -+ 0x0005, 0x0096, 0x00c6, 0x2260, 0x080c, 0xd4ce, 0x604b, 0x0000, -+ 0x6024, 0xc0f4, 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, -+ 0x2268, 0x9186, 0x0007, 0x1904, 0xd382, 0x6814, 0x9005, 0x0138, -+ 0x2048, 0xa87c, 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, -+ 0x003a, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x84d1, 0x00c6, -+ 0x2d60, 0x6100, 0x9186, 0x0002, 0x1904, 0xd3f9, 0x6014, 0x9005, -+ 0x1138, 0x6000, 0x9086, 0x0007, 0x190c, 0x0d65, 0x0804, 0xd3f9, -+ 0x2048, 0x080c, 0xb847, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, -+ 0x1de0, 0x2900, 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, -+ 0x1168, 0xa87c, 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, -+ 0x2009, 0x0043, 0x080c, 0xcc3b, 0x0804, 0xd3f9, 0x2009, 0x0041, -+ 0x0804, 0xd3f3, 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, -+ 0xd0bc, 0x1120, 0x00de, 0x009e, 0x0804, 0xd31c, 0xd0b4, 0x0128, -+ 0xd0fc, 0x090c, 0x0d65, 0x0804, 0xd33d, 0x6007, 0x003a, 0x6003, -+ 0x0001, 0x2009, 0x8020, 0x080c, 0x84d1, 0x00c6, 0x2d60, 0x6100, -+ 0x9186, 0x0002, 0x0120, 0x9186, 0x0004, 0x1904, 0xd3f9, 0x6814, -+ 0x2048, 0xa97c, 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, -+ 0xa982, 0x00f6, 0x2c78, 0x080c, 0x164f, 0x00fe, 0x2009, 0x0042, -+ 0x04d0, 0x0036, 0x080c, 0x1022, 0x090c, 0x0d65, 0xa867, 0x010d, -+ 0x9006, 0xa802, 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, -+ 0x2c00, 0xa892, 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, -+ 0x6010, 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x2004, 0x635c, 0xab7a, -+ 0xa876, 0x9006, 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, -+ 0x080c, 0x6996, 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xcdf9, -+ 0x2d00, 0x600a, 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, -+ 0x634a, 0x003e, 0x0038, 0x604b, 0x0000, 0x6003, 0x0007, 0x080c, -+ 0xcc3b, 0x00ce, 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, -+ 0x6004, 0x9082, 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, -+ 0x080c, 0x8874, 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, -+ 0x080c, 0xd21e, 0x009e, 0x003e, 0x080c, 0x8936, 0x0005, 0x9186, -+ 0x0014, 0x0d70, 0x080c, 0x9ca2, 0x0005, 0xd42c, 0xd42a, 0xd42a, -+ 0xd42a, 0xd42a, 0xd42a, 0xd42c, 0xd42a, 0xd42a, 0xd42a, 0xd42a, -+ 0xd42a, 0xd42a, 0x080c, 0x0d65, 0x6003, 0x000c, 0x080c, 0x8936, -+ 0x0005, 0x9182, 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, -+ 0x080c, 0x9ca2, 0x0005, 0xd448, 0xd448, 0xd448, 0xd448, 0xd44a, -+ 0xd46a, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, 0xd448, -+ 0x080c, 0x0d65, 0x00d6, 0x2c68, 0x080c, 0x9b91, 0x01b0, 0x6003, -+ 0x0001, 0x6007, 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, -+ 0x026f, 0x210c, 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, 0x6023, -+ 0x0004, 0x2009, 0x8020, 0x080c, 0x84d1, 0x2d60, 0x080c, 0x9be7, -+ 0x00de, 0x0005, 0x080c, 0x9be7, 0x0005, 0x00e6, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, 0x1873, -+ 0x210c, 0xd1ec, 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026, -+ 0xd0cc, 0x0150, 0x2001, 0x1959, 0x2004, 0x604a, 0x2009, 0x1873, -+ 0x210c, 0xd1f4, 0x1520, 0x00a0, 0x2009, 0x1873, 0x210c, 0xd1f4, -+ 0x0128, 0x6024, 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, 0x1959, -+ 0x200c, 0x2001, 0x1957, 0x2004, 0x9100, 0x9080, 0x000a, 0x604a, -+ 0x6010, 0x00b6, 0x2058, 0xb8ac, 0x00be, 0x0008, 0x2104, 0x9005, -+ 0x0118, 0x9088, 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, 0x9085, -+ 0x0001, 0x0005, 0x0016, 0x00c6, 0x00e6, 0x615c, 0xb8ac, 0x2060, -+ 0x8cff, 0x0180, 0x84ff, 0x1118, 0x605c, 0x9106, 0x1138, 0x600c, -+ 0x2072, 0x080c, 0x83c0, 0x080c, 0x9be7, 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, 0x182b, 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, 0xabdf, 0x009e, 0x1168, -+ 0x2011, 0x0274, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, -+ 0x0006, 0x080c, 0xabdf, 0x009e, 0x1100, 0x015e, 0x003e, 0x002e, -+ 0x0005, 0x00e6, 0x2071, 0x1800, 0x080c, 0x5c6f, 0x080c, 0x2ddb, -+ 0x00ee, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0fc, 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5, 0xa882, -+ 0x0005, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, -+ 0x0026, 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, 0x19c4, 0x252c, -+ 0x2021, 0x19cb, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7650, -+ 0x7070, 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, -+ 0x0008, 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, -+ 0x080c, 0xd2a4, 0x01b8, 0x080c, 0xd2b4, 0x11a0, 0x6000, 0x9086, -+ 0x0004, 0x1120, 0x0016, 0x080c, 0x1914, 0x001e, 0x080c, 0xba4b, -+ 0x1110, 0x080c, 0x303b, 0x080c, 0xba5c, 0x1110, 0x080c, 0xa58f, -+ 0x080c, 0x9c21, 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, -+ 0x1208, 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, -+ 0x007e, 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, -+ 0xd0dc, 0x0005, 0x0006, 0x2001, 0x1836, 0x2004, 0xd09c, 0x000e, -+ 0x0005, 0x0006, 0x0036, 0x0046, 0x080c, 0xbf61, 0x0168, 0x2019, -+ 0xffff, 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, -+ 0x2021, 0x0004, 0x080c, 0x4a75, 0x004e, 0x003e, 0x000e, 0x6004, -+ 0x9086, 0x0001, 0x1128, 0x080c, 0x94f4, 0x080c, 0x9c21, 0x9006, -+ 0x0005, 0x00e6, 0x00c6, 0x00b6, 0x0046, 0x2061, 0x1ddc, 0x2071, -+ 0x1800, 0x7450, 0x7070, 0x8001, 0x9402, 0x12b8, 0x2100, 0x9c06, -+ 0x0148, 0x6000, 0x9086, 0x0000, 0x0128, 0x6010, 0x2058, 0xb8a0, -+ 0x9206, 0x0140, 0x9ce0, 0x001c, 0x2001, 0x1819, 0x2004, 0x9c02, -+ 0x1220, 0x0c60, 0x9085, 0x0001, 0x0008, 0x9006, 0x004e, 0x00be, -+ 0x00ce, 0x00ee, 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, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, -+ 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, -+ 0x4000, 0x8000, 0xfddb -+}; -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2322flx_length01 = 0xce3b; -+#else -+unsigned short risc_code_length01 = 0xce3b; -+#endif -+ -+/* -+ * -+ */ -+ -+unsigned long rseqflx_code_addr01 = 0x0001c000 ; -+unsigned short rseqflx_code01[] = { -+0x000b, 0x0003, 0x0000, 0x071c, 0x0001, 0xc000, 0x0008, 0x8064, -+ 0x0000, 0x0010, 0x0000, 0x8066, 0x0008, 0x0101, 0x0003, 0xc007, -+ 0x0008, 0x80e0, 0x0008, 0xff00, 0x0000, 0x80e2, 0x0008, 0xff00, -+ 0x0008, 0x0162, 0x0000, 0x8066, 0x0008, 0xa101, 0x000b, 0xc00f, -+ 0x0008, 0x0d02, 0x0000, 0x8060, 0x0000, 0x0400, 0x000b, 0x60af, -+ 0x0003, 0x5817, 0x0003, 0x7ac6, 0x0003, 0x5209, 0x000b, 0xc813, -+ 0x0009, 0xbac0, 0x0000, 0x008a, 0x0003, 0x8813, 0x0000, 0x15fc, -+ 0x000b, 0xb013, 0x0009, 0xc4c0, 0x0000, 0x7000, 0x0001, 0xffa0, -+ 0x0000, 0x2000, 0x000b, 0x9366, 0x0008, 0x808c, 0x0000, 0x0001, -+ 0x0007, 0x0000, 0x0007, 0x0000, 0x000a, 0x4047, 0x0008, 0x808c, -+ 0x0000, 0x0002, 0x0007, 0x0000, 0x0003, 0x082d, 0x0000, 0x4022, -+ 0x000b, 0x002e, 0x0008, 0x4122, 0x0002, 0x4447, 0x0003, 0x8b8a, -+ 0x0008, 0x0bfe, 0x0001, 0x11a0, 0x0003, 0x136c, 0x0001, 0x0ca0, -+ 0x0003, 0x136c, 0x0001, 0x9180, 0x0000, 0x0004, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, -+ 0x000b, 0xc03c, 0x0008, 0x808c, 0x0008, 0x0000, 0x0008, 0x0060, -+ 0x0008, 0x8062, 0x0000, 0x0004, 0x0000, 0x8066, 0x0000, 0x0411, -+ 0x000b, 0xc044, 0x0000, 0x03fe, 0x0001, 0x43e0, 0x000b, 0x8b69, -+ 0x0009, 0xc2c0, 0x0008, 0x00ff, 0x0001, 0x02e0, 0x000b, 0x8b69, -+ 0x0001, 0x9180, 0x0008, 0x0005, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0019, 0x000b, 0xc053, -+ 0x0002, 0x0240, 0x0003, 0x0b66, 0x0008, 0x00fc, 0x000b, 0x3369, -+ 0x000a, 0x0244, 0x0003, 0x0865, 0x000c, 0x01e2, 0x0001, 0x9180, -+ 0x0000, 0x0007, 0x0008, 0x7f62, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0002, 0x0234, 0x0008, 0x7f04, 0x0000, 0x8066, 0x0000, 0x040a, -+ 0x0003, 0xc064, 0x0000, 0x112a, 0x0008, 0x002e, 0x0008, 0x022c, -+ 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x808c, 0x0000, 0x0002, -+ 0x0008, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0000, 0x8066, -+ 0x0008, 0x0011, 0x000b, 0xc071, 0x0008, 0x01fe, 0x0009, 0x42e0, -+ 0x0003, 0x8b5b, 0x0000, 0x00fe, 0x0001, 0x43e0, 0x0003, 0x8b5b, -+ 0x0000, 0x1734, 0x0000, 0x1530, 0x0008, 0x1632, 0x0008, 0x0d2a, -+ 0x0001, 0x9880, 0x0008, 0x0012, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x1e0a, 0x0003, 0xc083, -+ 0x0008, 0x808a, 0x0008, 0x0003, 0x0000, 0x1a60, 0x0008, 0x8062, -+ 0x0000, 0x0002, 0x000b, 0x5889, 0x0000, 0x8066, 0x0000, 0x3679, -+ 0x0003, 0xc08c, 0x0003, 0x588d, 0x0008, 0x8054, 0x0008, 0x0011, -+ 0x0000, 0x8074, 0x0008, 0x1010, 0x0008, 0x1efc, 0x0003, 0x3013, -+ 0x0004, 0x0096, 0x0003, 0x0013, 0x0000, 0x1c60, 0x0000, 0x1b62, -+ 0x0000, 0x8066, 0x0008, 0x0231, 0x000b, 0xc09a, 0x000b, 0x589b, -+ 0x0008, 0x0140, 0x0000, 0x0242, 0x0002, 0x1f43, 0x000b, 0x88a5, -+ 0x0000, 0x0d44, 0x0008, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, -+ 0x000b, 0x00a9, 0x0008, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, -+ 0x0000, 0x064a, 0x0003, 0x58a9, 0x0008, 0x8054, 0x0000, 0x0001, -+ 0x0000, 0x8074, 0x0008, 0x2020, 0x000f, 0x4000, 0x0000, 0x4820, -+ 0x0008, 0x0bfe, 0x0009, 0x10a0, 0x0003, 0x1110, 0x0001, 0x0ca0, -+ 0x0003, 0x1110, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, -+ 0x0000, 0x0008, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, -+ 0x0003, 0xc0bc, 0x0001, 0x80e0, 0x0008, 0x0003, 0x000b, 0x8910, -+ 0x0000, 0x49b4, 0x0002, 0x4b4e, 0x000b, 0x8919, 0x0008, 0x808a, -+ 0x0000, 0x0004, 0x0000, 0x18fe, 0x0001, 0x10e0, 0x000b, 0x88ca, -+ 0x0002, 0x192f, 0x0008, 0x7f32, 0x0008, 0x15fe, 0x0001, 0x10e0, -+ 0x000b, 0x88cf, 0x0002, 0x162f, 0x0008, 0x7f2c, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0007, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc0d6, 0x000a, 0x004f, -+ 0x000b, 0x8907, 0x000a, 0x0040, 0x000b, 0x08f1, 0x0002, 0x004e, -+ 0x000b, 0x08f1, 0x0002, 0x0030, 0x0002, 0x7f2f, 0x0000, 0x7f00, -+ 0x0000, 0x8066, 0x0008, 0x000a, 0x000b, 0xc0e2, 0x0008, 0x1010, -+ 0x000c, 0x01c9, 0x000b, 0xb0ea, 0x000c, 0x032f, 0x0004, 0x01b3, -+ 0x000b, 0x7814, 0x0003, 0x0013, 0x0000, 0x0806, 0x0008, 0x8010, -+ 0x0000, 0x001f, 0x000c, 0x032f, 0x0000, 0x0310, 0x000c, 0x032f, -+ 0x000b, 0x00e8, 0x000a, 0x002f, 0x0000, 0x7f00, 0x0000, 0x8066, -+ 0x0008, 0x000a, 0x000b, 0xc0f5, 0x0004, 0x018c, 0x000a, 0x0040, -+ 0x000b, 0x090a, 0x000c, 0x01f9, 0x0000, 0x8000, 0x0000, 0x0002, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0006, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x000a, 0x0003, 0xc103, -+ 0x0000, 0x8072, 0x0000, 0x4000, 0x000b, 0x00e8, 0x0008, 0x8010, -+ 0x0008, 0x001e, 0x0003, 0x010c, 0x0008, 0x8010, 0x0008, 0x001d, -+ 0x000c, 0x032f, 0x0008, 0x1010, 0x000c, 0x032f, 0x000b, 0x0014, -+ 0x0002, 0x4b4e, 0x0003, 0x0916, 0x0008, 0x808a, 0x0000, 0x0004, -+ 0x000b, 0x6116, 0x000f, 0x8000, 0x0008, 0x808a, 0x0000, 0x0004, -+ 0x000b, 0x0014, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, -+ 0x0008, 0x0011, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, -+ 0x000b, 0xc120, 0x000a, 0x004f, 0x0003, 0x897d, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0005, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc12a, 0x0008, 0x0060, -+ 0x0008, 0x8062, 0x0000, 0x001f, 0x0000, 0x8066, 0x0000, 0x0209, -+ 0x0003, 0xc130, 0x000a, 0x014b, 0x000b, 0x097d, 0x0008, 0x8062, -+ 0x0008, 0x000f, 0x0000, 0x8066, 0x0000, 0x0211, 0x000b, 0xc137, -+ 0x0008, 0x01fe, 0x0001, 0x02d0, 0x0003, 0x897d, 0x000c, 0x0195, -+ 0x000b, 0x097d, 0x0008, 0x03a0, 0x0008, 0x8004, 0x0000, 0x0002, -+ 0x0000, 0x8006, 0x0000, 0x0043, 0x0008, 0x4908, 0x0008, 0x808a, -+ 0x0000, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, -+ 0x0008, 0x0000, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x041a, -+ 0x000b, 0xc14c, 0x000b, 0xe14d, 0x0008, 0x4908, 0x0008, 0x480a, -+ 0x0008, 0x808a, 0x0000, 0x0004, 0x0008, 0x0060, 0x0008, 0x8062, -+ 0x0008, 0x002b, 0x0000, 0x8066, 0x0000, 0x0411, 0x000b, 0xc157, -+ 0x0008, 0x04fe, 0x0009, 0x02a0, 0x000b, 0x915e, 0x0002, 0x0500, -+ 0x0003, 0x097a, 0x0003, 0x015f, 0x0000, 0x05fe, 0x0001, 0x03a0, -+ 0x0003, 0x117a, 0x0000, 0x0d0c, 0x0008, 0x0d0e, 0x0008, 0x0d10, -+ 0x0000, 0x0d12, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, -+ 0x0000, 0x8066, 0x0008, 0x0832, 0x0003, 0xc16a, 0x0000, 0x800a, -+ 0x0000, 0x8005, 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, -+ 0x0008, 0x0011, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0a12, -+ 0x0003, 0xc174, 0x0008, 0x5006, 0x0008, 0x100e, 0x000c, 0x01a0, -+ 0x000b, 0x7814, 0x0003, 0x0013, 0x0008, 0x0208, 0x0008, 0x030a, -+ 0x000b, 0x0161, 0x0004, 0x018c, 0x0008, 0x808a, 0x0000, 0x0004, -+ 0x0008, 0x8010, 0x0008, 0x0021, 0x000c, 0x032f, 0x0008, 0x1010, -+ 0x000c, 0x032f, 0x0000, 0x4810, 0x000c, 0x032f, 0x0008, 0x4910, -+ 0x000c, 0x032f, 0x0008, 0x808a, 0x0000, 0x0004, 0x000b, 0x0014, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0002, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0xb40a, 0x0003, 0xc193, -+ 0x000f, 0x4000, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x0a62, -+ 0x0000, 0x8066, 0x0000, 0x0411, 0x0003, 0xc19a, 0x0002, 0x0210, -+ 0x0001, 0xffc0, 0x0000, 0x0007, 0x0009, 0x03e0, 0x000f, 0x4000, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x8380, 0x0000, 0x0002, -+ 0x0009, 0x0a80, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0e0a, -+ 0x000b, 0xc1a8, 0x0002, 0x0300, 0x0001, 0xffc0, 0x0000, 0x0007, -+ 0x0000, 0x7f06, 0x0002, 0x0a00, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0008, 0x060a, 0x0003, 0xc1b1, 0x000f, 0x4000, 0x0000, 0x0da0, -+ 0x0008, 0x0da2, 0x0008, 0x0da4, 0x0009, 0x8880, 0x0000, 0x0001, -+ 0x0008, 0x7f62, 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, -+ 0x0008, 0xa012, 0x0000, 0x0da6, 0x0008, 0x0da8, 0x0000, 0x0daa, -+ 0x0000, 0x0dac, 0x000b, 0xc1c1, 0x0009, 0x8880, 0x0008, 0x0009, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0xa03a, 0x000b, 0xc1c7, -+ 0x000f, 0x4000, 0x0009, 0x8880, 0x0008, 0x0005, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, -+ 0x000b, 0xc1d0, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, -+ 0x0000, 0x8066, 0x0008, 0x0021, 0x000b, 0xc1d6, 0x0000, 0x00fe, -+ 0x0001, 0x01d0, 0x000b, 0x89df, 0x0008, 0x02fe, 0x0009, 0x03d0, -+ 0x0003, 0x09df, 0x0000, 0x0d06, 0x000f, 0x4000, 0x0000, 0x8006, -+ 0x0000, 0x0001, 0x000f, 0x4000, 0x0008, 0x0060, 0x0008, 0x8062, -+ 0x0008, 0x002b, 0x0000, 0x8066, 0x0008, 0xa041, 0x0003, 0xc1e7, -+ 0x0002, 0x0243, 0x0003, 0x89ee, 0x0000, 0x54ac, 0x0000, 0x55ae, -+ 0x0008, 0x0da8, 0x0000, 0x0daa, 0x0000, 0x50b0, 0x0000, 0x51b2, -+ 0x0000, 0x0db4, 0x0008, 0x0db6, 0x0008, 0x0060, 0x0008, 0x8062, -+ 0x0000, 0x0007, 0x0000, 0x8066, 0x0008, 0xa452, 0x000b, 0xc1f7, -+ 0x000f, 0x4000, 0x000a, 0x3945, 0x0003, 0x8a03, 0x0000, 0x8072, -+ 0x0008, 0x4040, 0x0007, 0x0000, 0x000a, 0x3945, 0x000b, 0x8a01, -+ 0x000f, 0x4000, 0x0000, 0x8072, 0x0000, 0x4000, 0x0007, 0x0000, -+ 0x0007, 0x0000, 0x0007, 0x0000, 0x000a, 0x3945, 0x0003, 0x09fb, -+ 0x0003, 0x0203, 0x000a, 0x3a40, 0x000b, 0x8817, 0x0008, 0x2b24, -+ 0x0008, 0x2b24, 0x0003, 0x5a0d, 0x0008, 0x8054, 0x0000, 0x0002, -+ 0x0002, 0x1242, 0x0003, 0x0a51, 0x000a, 0x3a45, 0x000b, 0x0a42, -+ 0x000a, 0x1e10, 0x0000, 0x7f3c, 0x000b, 0x0a3f, 0x0002, 0x1d00, -+ 0x0000, 0x7f3a, 0x0000, 0x0d60, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0008, 0x0009, 0x0003, 0xc21d, 0x0008, 0x00fc, 0x000b, 0xb23c, -+ 0x0000, 0x1c60, 0x0008, 0x8062, 0x0000, 0x0001, 0x0000, 0x8066, -+ 0x0008, 0x0009, 0x000b, 0xc225, 0x0008, 0x00fc, 0x000b, 0x3344, -+ 0x0000, 0x0038, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0019, -+ 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc22e, 0x0009, 0x80c0, -+ 0x0008, 0x00ff, 0x0008, 0x7f3e, 0x0000, 0x0d60, 0x0008, 0x0efe, -+ 0x0001, 0x1f80, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, -+ 0x000b, 0xc238, 0x0008, 0x003a, 0x0000, 0x1dfe, 0x000b, 0x0219, -+ 0x0008, 0x0036, 0x0004, 0x0096, 0x000b, 0x0251, 0x0000, 0x8074, -+ 0x0000, 0x2000, 0x000b, 0x0251, 0x0002, 0x3a44, 0x0003, 0x0b6f, -+ 0x0000, 0x8074, 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, -+ 0x0003, 0xb341, 0x0008, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, -+ 0x0008, 0x2700, 0x0009, 0x00d0, 0x000b, 0x8a61, 0x0000, 0x8074, -+ 0x0008, 0x4040, 0x0003, 0x5a51, 0x0003, 0x5209, 0x000a, 0x3a46, -+ 0x000b, 0x8a61, 0x0002, 0x3a47, 0x000b, 0x0a5c, 0x0008, 0x8054, -+ 0x0000, 0x0004, 0x0000, 0x8074, 0x0000, 0x8000, 0x000b, 0x02ba, -+ 0x0009, 0x92c0, 0x0000, 0x0fc8, 0x000b, 0x0813, 0x000a, 0x1246, -+ 0x0003, 0x8b3b, 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x0002, -+ 0x0000, 0x8066, 0x0000, 0x367a, 0x0003, 0xc266, 0x0009, 0x92c0, -+ 0x0008, 0x0780, 0x000b, 0x8b55, 0x0002, 0x124b, 0x000b, 0x0a6f, -+ 0x0002, 0x2e4d, 0x0002, 0x2e4d, 0x0003, 0x0b41, 0x000a, 0x3a46, -+ 0x000b, 0x8a7c, 0x000b, 0x5a71, 0x0008, 0x8054, 0x0000, 0x0004, -+ 0x000a, 0x1243, 0x000b, 0x0ab8, 0x0008, 0x8010, 0x0000, 0x000d, -+ 0x000c, 0x032f, 0x0000, 0x1810, 0x000c, 0x032f, 0x0003, 0x02b8, -+ 0x000a, 0x194d, 0x0003, 0x0a80, 0x000a, 0x1243, 0x0003, 0x0b4b, -+ 0x0003, 0x5a80, 0x0008, 0x8054, 0x0000, 0x0004, 0x000a, 0x192e, -+ 0x0008, 0x7f32, 0x000a, 0x1947, 0x000b, 0x0ab2, 0x0002, 0x194f, -+ 0x000b, 0x0a90, 0x0004, 0x0324, 0x0000, 0x1810, 0x000c, 0x01c9, -+ 0x0003, 0xb2ab, 0x000c, 0x032f, 0x0004, 0x01b3, 0x0003, 0x02b8, -+ 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x001f, 0x0000, 0x8066, -+ 0x0008, 0x0009, 0x0003, 0xc295, 0x000a, 0x004c, 0x0003, 0x8ab2, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x9880, 0x0000, 0x0007, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x320a, 0x0003, 0xc29f, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0001, 0x9880, 0x0008, 0x0012, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x1e0a, 0x000b, 0xc2a7, -+ 0x0000, 0x1826, 0x0000, 0x1928, 0x0003, 0x02b8, 0x0000, 0x0806, -+ 0x0008, 0x8010, 0x0000, 0x001f, 0x000c, 0x032f, 0x0000, 0x0310, -+ 0x000c, 0x032f, 0x0003, 0x02b8, 0x0004, 0x0324, 0x0008, 0x8010, -+ 0x0000, 0x0001, 0x000c, 0x032f, 0x0000, 0x1810, 0x000c, 0x032f, -+ 0x0000, 0x8074, 0x0008, 0xf000, 0x0000, 0x0d30, 0x0002, 0x3a42, -+ 0x0003, 0x8ac0, 0x0000, 0x15fc, 0x0003, 0xb06a, 0x0003, 0x0013, -+ 0x0000, 0x8074, 0x0000, 0x0501, 0x0008, 0x8010, 0x0008, 0x000c, -+ 0x000c, 0x032f, 0x0003, 0x0013, 0x0009, 0xbbe0, 0x0008, 0x0030, -+ 0x000b, 0x8adc, 0x0000, 0x18fe, 0x0009, 0x3ce0, 0x0003, 0x0ad9, -+ 0x0008, 0x15fe, 0x0009, 0x3ce0, 0x0003, 0x0ad9, 0x0008, 0x13fe, -+ 0x0009, 0x3ce0, 0x000b, 0x8ad5, 0x0004, 0x031d, 0x0008, 0x0d26, -+ 0x000b, 0x02d6, 0x000c, 0x031f, 0x0008, 0x8076, 0x0000, 0x0040, -+ 0x0003, 0x031a, 0x0008, 0x8076, 0x0008, 0x0041, 0x0003, 0x031a, -+ 0x0009, 0xbbe0, 0x0000, 0x0032, 0x0003, 0x8ae1, 0x0008, 0x3c1e, -+ 0x0003, 0x031a, 0x0009, 0xbbe0, 0x0000, 0x0037, 0x0003, 0x8aff, -+ 0x0000, 0x18fe, 0x0009, 0x3ce0, 0x000b, 0x8ad9, 0x0008, 0x8076, -+ 0x0000, 0x0040, 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x000d, -+ 0x0008, 0x2604, 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, -+ 0x0000, 0x2808, 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, -+ 0x0000, 0x8066, 0x0000, 0x0422, 0x0003, 0xc2f6, 0x0004, 0x0324, -+ 0x0008, 0x8054, 0x0000, 0x0004, 0x0000, 0x8074, 0x0008, 0xf000, -+ 0x0000, 0x8072, 0x0000, 0x8000, 0x000b, 0x02ba, 0x0009, 0xbbe0, -+ 0x0000, 0x0038, 0x000b, 0x8b11, 0x0000, 0x18fe, 0x0009, 0x3ce0, -+ 0x000b, 0x0b0e, 0x0008, 0x15fe, 0x0009, 0x3ce0, 0x0003, 0x8acf, -+ 0x000c, 0x031f, 0x0008, 0x8076, 0x0000, 0x0040, 0x0000, 0x8072, -+ 0x0000, 0x8000, 0x000b, 0x0366, 0x0008, 0x8076, 0x0008, 0x0042, -+ 0x0003, 0x031a, 0x0009, 0xbbe0, 0x0000, 0x0016, 0x0003, 0x8b1a, -+ 0x0002, 0x3a44, 0x0003, 0x8816, 0x0000, 0x8072, 0x0000, 0x8000, -+ 0x000f, 0x8000, 0x0003, 0x0013, 0x0000, 0x8072, 0x0000, 0x8000, -+ 0x0003, 0x0013, 0x0002, 0x1430, 0x0003, 0x0320, 0x000a, 0x3d30, -+ 0x0000, 0x7f00, 0x0001, 0xbc80, 0x0000, 0x0007, 0x000b, 0x0328, -+ 0x000a, 0x1930, 0x0000, 0x7f00, 0x0001, 0x9880, 0x0000, 0x0007, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0008, 0x000a, 0x000b, 0xc32d, 0x000f, 0x4000, 0x000b, 0x232f, -+ 0x0008, 0x0870, 0x000f, 0x4000, 0x0009, 0xbac0, 0x0008, 0x0090, -+ 0x000b, 0x0b38, 0x0000, 0x8074, 0x0000, 0x0706, 0x000b, 0x033a, -+ 0x0000, 0x8074, 0x0000, 0x0703, 0x000f, 0x4000, 0x0008, 0x8010, -+ 0x0000, 0x0023, 0x000b, 0x0374, 0x0008, 0x8010, 0x0000, 0x0008, -+ 0x000b, 0x0374, 0x0008, 0x8010, 0x0008, 0x0022, 0x000b, 0x0374, -+ 0x0004, 0x0324, 0x0008, 0x8010, 0x0000, 0x0007, 0x000c, 0x032f, -+ 0x0000, 0x1810, 0x000c, 0x032f, 0x000b, 0x037e, 0x0004, 0x0324, -+ 0x0008, 0x8010, 0x0008, 0x001b, 0x000c, 0x032f, 0x0000, 0x1810, -+ 0x000c, 0x032f, 0x0000, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, -+ 0x0003, 0x0013, 0x0008, 0x8010, 0x0008, 0x0009, 0x000b, 0x0374, -+ 0x0008, 0x8010, 0x0008, 0x0005, 0x000b, 0x0374, 0x0008, 0x808c, -+ 0x0000, 0x0001, 0x0007, 0x0000, 0x0008, 0x8010, 0x0000, 0x0004, -+ 0x000a, 0x4143, 0x0003, 0x0878, 0x0002, 0x3a44, 0x0003, 0x8813, -+ 0x0008, 0x0d2a, 0x000b, 0x0374, 0x0008, 0x8010, 0x0008, 0x0003, -+ 0x0003, 0x0376, 0x0008, 0x8010, 0x0000, 0x000b, 0x0003, 0x0376, -+ 0x0008, 0x8010, 0x0000, 0x0002, 0x0003, 0x0376, 0x0002, 0x3a47, -+ 0x000b, 0x8a51, 0x0008, 0x8010, 0x0008, 0x0006, 0x0003, 0x0376, -+ 0x0000, 0x8074, 0x0008, 0xf000, 0x000c, 0x032f, 0x000c, 0x0332, -+ 0x000a, 0x3a40, 0x000b, 0x0813, 0x0008, 0x8010, 0x0008, 0x000c, -+ 0x000c, 0x032f, 0x0003, 0x0013, 0x0000, 0x8074, 0x0000, 0xf080, -+ 0x0000, 0x0d30, 0x0002, 0x2e4d, 0x0002, 0x2e4d, 0x0003, 0x0b87, -+ 0x0008, 0x8054, 0x0000, 0x0019, 0x0003, 0x0013, 0x0008, 0x8054, -+ 0x0008, 0x0009, 0x0003, 0x0013, 0x0002, 0x3a44, 0x0003, 0x8813, -+ 0x000b, 0x0369, 0xec89, 0x9da0 -+}; -+unsigned short rseqflx_code_length01 = 0x071c; -+/* -+ * -+ */ -+ -+unsigned long xseqflx_code_addr01 = 0x0001e000 ; -+unsigned short xseqflx_code01[] = { -+0x0013, 0x0003, 0x0000, 0x0fe2, 0x0001, 0xe000, 0x0005, 0x0032, -+ 0x0000, 0x0010, 0x0015, 0x0033, 0x0010, 0xbb39, 0x000b, 0x8007, -+ 0x0004, 0x0107, 0x0004, 0x0119, 0x0010, 0xc000, 0x0000, 0xc001, -+ 0x0000, 0xc0b0, 0x0010, 0xc0b1, 0x0010, 0xc0b2, 0x0000, 0xc0b3, -+ 0x0010, 0xc0b4, 0x0000, 0xc0b5, 0x0000, 0xc0b6, 0x0010, 0xc0b7, -+ 0x0010, 0xc0b8, 0x0000, 0xc0b9, 0x0000, 0xc0ba, 0x0000, 0xc0c2, -+ 0x0010, 0xc0c3, 0x0000, 0xc0c4, 0x0010, 0xc0c5, 0x0010, 0xc0c6, -+ 0x0000, 0xc0c7, 0x0000, 0xc0c8, 0x0010, 0xc0c9, 0x0010, 0xc0ca, -+ 0x0000, 0xc0cb, 0x0010, 0xc0cc, 0x0000, 0xc0cd, 0x0000, 0xc0ce, -+ 0x0010, 0xc0cf, 0x0015, 0x0039, 0x0010, 0xff00, 0x0015, 0x003a, -+ 0x0010, 0xff00, 0x0005, 0x00d0, 0x0010, 0xff00, 0x0015, 0x00d1, -+ 0x0010, 0xff00, 0x0012, 0x3a40, 0x000b, 0x1031, 0x0002, 0x7940, -+ 0x000b, 0x112b, 0x0002, 0x3a42, 0x001b, 0x1035, 0x0003, 0xb035, -+ 0x0013, 0xa1cd, 0x0002, 0x3a41, 0x001b, 0x1039, 0x0012, 0x7941, -+ 0x000b, 0x12eb, 0x0013, 0xe051, 0x0012, 0xd042, 0x0003, 0x103f, -+ 0x0000, 0x75ff, 0x0002, 0xff41, 0x000b, 0x1051, 0x0000, 0x0cfe, -+ 0x0013, 0x6047, 0x0011, 0x02e8, 0x0010, 0x0000, 0x0003, 0x1371, -+ 0x0011, 0x02e8, 0x0010, 0x0005, 0x0013, 0x13fe, 0x0012, 0xd042, -+ 0x0013, 0x104c, 0x0000, 0x75ff, 0x0012, 0xff40, 0x000b, 0x1051, -+ 0x0000, 0x12fe, 0x0003, 0x6051, 0x0001, 0x0fe8, 0x0010, 0x0000, -+ 0x0003, 0x15e8, 0x0015, 0x0030, 0x0000, 0x0400, 0x0010, 0xc131, -+ 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x8056, 0x0010, 0xb2ff, -+ 0x0001, 0xb3e0, 0x000c, 0x10c9, 0x000b, 0xf02d, 0x0011, 0x3be8, -+ 0x0000, 0x0010, 0x000b, 0x106e, 0x0000, 0x0afe, 0x001b, 0x6062, -+ 0x0000, 0x3c0b, 0x0013, 0x006a, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0001, 0x0a88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x3c0a, 0x001b, 0x8069, 0x0010, 0x3c0a, 0x0002, 0x0c00, -+ 0x0010, 0xff0c, 0x0013, 0x00c6, 0x0011, 0x3be8, 0x0010, 0x0012, -+ 0x001b, 0x1081, 0x0010, 0x08fe, 0x001b, 0x6075, 0x0010, 0x3c09, -+ 0x0013, 0x007d, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0888, -+ 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x3c0a, -+ 0x000b, 0x807c, 0x0000, 0x3c08, 0x0002, 0x0c00, 0x0010, 0xff0c, -+ 0x0013, 0x00c6, 0x0011, 0x3be8, 0x0000, 0x0013, 0x001b, 0x1087, -+ 0x0000, 0x3cb0, 0x0014, 0x00d9, 0x0013, 0x00c6, 0x0011, 0x3be8, -+ 0x0000, 0x0019, 0x001b, 0x109a, 0x0010, 0x04fe, 0x000b, 0x608e, -+ 0x0010, 0x3c05, 0x0013, 0x0096, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0488, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x3c0a, 0x001b, 0x8095, 0x0000, 0x3c04, 0x0002, 0x0c00, -+ 0x0010, 0xff0c, 0x0013, 0x00c6, 0x0011, 0x3be8, 0x0000, 0x0015, -+ 0x001b, 0x10a6, 0x0004, 0x0110, 0x0014, 0x0122, 0x0015, 0x0039, -+ 0x0000, 0x8000, 0x0017, 0x8000, 0x0004, 0x0107, 0x0004, 0x0119, -+ 0x0014, 0x00f2, 0x0013, 0x002d, 0x0011, 0x3be8, 0x0000, 0x0016, -+ 0x001b, 0x10b8, 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0003, 0x10b2, -+ 0x0001, 0x0fe8, 0x0000, 0x0002, 0x0003, 0x10b2, 0x0015, 0x0039, -+ 0x0010, 0x1010, 0x0013, 0x00c6, 0x0015, 0x0039, 0x0000, 0x5040, -+ 0x0015, 0x00b8, 0x0000, 0x0008, 0x0014, 0x07ed, 0x0013, 0x00c6, -+ 0x0011, 0x3be8, 0x0010, 0x0017, 0x001b, 0x10bd, 0x0010, 0x3cc3, -+ 0x0013, 0x00c6, 0x0011, 0x3be8, 0x0010, 0x0018, 0x000b, 0x10c2, -+ 0x0000, 0x3cc2, 0x0013, 0x00c6, 0x0005, 0x00ce, 0x0000, 0x0001, -+ 0x0000, 0x3bcf, 0x0014, 0x07b1, 0x0015, 0x0039, 0x0000, 0x8000, -+ 0x0013, 0x002d, 0x0001, 0xb288, 0x0000, 0x0002, 0x0001, 0xc180, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x80cf, -+ 0x0002, 0xb200, 0x0011, 0xffc8, 0x0000, 0x0007, 0x0010, 0xffb2, -+ 0x0010, 0xc131, 0x0015, 0x0033, 0x0010, 0xb20a, 0x0001, 0xb0d0, -+ 0x001b, 0x80d8, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0xb088, -+ 0x0000, 0x0010, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, -+ 0x000b, 0x80e0, 0x0001, 0xb1e8, 0x0010, 0xffff, 0x0013, 0x10f1, -+ 0x0000, 0x11fe, 0x000b, 0x60e8, 0x0000, 0xb012, 0x0013, 0x00f0, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x80ef, -+ 0x0000, 0xb011, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0xbc88, 0x0010, 0x001e, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xc411, 0x001b, 0x80f9, 0x0011, 0xbc88, 0x0010, 0x0017, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc609, 0x001b, 0x80ff, -+ 0x0011, 0xbc88, 0x0010, 0x0036, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xc709, 0x000b, 0x8105, 0x0017, 0x4000, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0x0269, 0x001b, 0x810e, 0x0017, 0x4000, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x026a, 0x000b, 0x8117, -+ 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, -+ 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x0f59, -+ 0x001b, 0x8120, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0001, 0xbb88, 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x0f5a, 0x001b, 0x8129, 0x0017, 0x4000, 0x0000, 0xd0ff, -+ 0x0012, 0xff40, 0x000b, 0x1031, 0x0015, 0x00d1, 0x0010, 0x0101, -+ 0x0003, 0x9130, 0x0005, 0x0079, 0x0000, 0x0001, 0x0003, 0x9133, -+ 0x0015, 0x00d1, 0x0000, 0x0100, 0x0011, 0x02e8, 0x0000, 0x0002, -+ 0x0003, 0x1152, 0x0011, 0x02e8, 0x0000, 0x0001, 0x0013, 0x116a, -+ 0x0011, 0x02e8, 0x0000, 0x0004, 0x0013, 0x1188, 0x0011, 0x02e8, -+ 0x0010, 0x0003, 0x0003, 0x11b9, 0x0005, 0x0002, 0x0010, 0x0000, -+ 0x0000, 0xc00e, 0x0000, 0xc00d, 0x0010, 0xc003, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0001, 0xbd88, 0x0010, 0x0009, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x814e, 0x0012, 0xd042, -+ 0x0013, 0x1031, 0x0003, 0x004c, 0x0012, 0x7849, 0x0003, 0x11c7, -+ 0x0010, 0x0dfe, 0x0003, 0x6144, 0x0012, 0x0c10, 0x0010, 0xff0c, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x815f, -+ 0x0010, 0xb3fe, 0x0013, 0x6167, 0x0010, 0xb30b, 0x0015, 0x0033, -+ 0x0010, 0xc00a, 0x000b, 0x8165, 0x0013, 0x01bc, 0x0000, 0xc00b, -+ 0x0010, 0xc00a, 0x0013, 0x01bc, 0x0000, 0x78b0, 0x0012, 0xb044, -+ 0x0003, 0x11c7, 0x0002, 0xb049, 0x0003, 0x11c7, 0x0010, 0x71ff, -+ 0x0012, 0xff38, 0x0010, 0xff71, 0x0010, 0x0dfe, 0x0003, 0x6142, -+ 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb309, 0x000b, 0x817d, 0x0010, 0xb3fe, 0x0013, 0x6185, -+ 0x0000, 0xb309, 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x8183, -+ 0x0013, 0x01bc, 0x0010, 0xc009, 0x0000, 0xc008, 0x0013, 0x01bc, -+ 0x0000, 0x78b0, 0x0012, 0xb044, 0x0003, 0x11c7, 0x0002, 0xb049, -+ 0x0003, 0x11c7, 0x0010, 0x71ff, 0x0012, 0xff38, 0x0010, 0xff71, -+ 0x0010, 0x0dfe, 0x0003, 0x6142, 0x0012, 0x0c10, 0x0010, 0xff0c, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, 0x001b, 0x819b, -+ 0x0010, 0xb3fe, 0x0003, 0x61a3, 0x0000, 0xb305, 0x0015, 0x0033, -+ 0x0010, 0xc00a, 0x001b, 0x81a1, 0x0003, 0x01a5, 0x0010, 0xc005, -+ 0x0000, 0xc004, 0x0002, 0x033f, 0x0002, 0xff27, 0x0000, 0x0db8, -+ 0x0004, 0x0366, 0x0000, 0x0db8, 0x0014, 0x07ed, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0xbc88, 0x0010, 0x0000, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x81b2, 0x0011, 0xb3e8, -+ 0x0000, 0x0002, 0x000b, 0x1142, 0x0005, 0x0002, 0x0010, 0x0005, -+ 0x0003, 0x0144, 0x0012, 0x7849, 0x0003, 0x11c7, 0x0003, 0x0144, -+ 0x0000, 0x0db8, 0x0012, 0x0345, 0x001b, 0x11c2, 0x0002, 0x033f, -+ 0x0004, 0x0366, 0x0003, 0x0142, 0x0002, 0x033f, 0x0002, 0xff27, -+ 0x0004, 0x0366, 0x0014, 0x07ed, 0x0003, 0x0142, 0x0015, 0x00b8, -+ 0x0000, 0x0001, 0x0015, 0x003a, 0x0010, 0x0101, 0x0014, 0x07ed, -+ 0x0013, 0x014f, 0x0000, 0x2bba, 0x0003, 0xb1ce, 0x0005, 0x002a, -+ 0x0000, 0x0002, 0x0001, 0xbac8, 0x0000, 0x0700, 0x000b, 0x12a6, -+ 0x0011, 0x15e8, 0x0000, 0x0002, 0x0013, 0x1221, 0x0011, 0x15e8, -+ 0x0000, 0x0001, 0x0013, 0x11dd, 0x0005, 0x0015, 0x0010, 0x0000, -+ 0x0013, 0x0204, 0x0005, 0x0015, 0x0010, 0x0000, 0x0002, 0xba43, -+ 0x0013, 0x1205, 0x0013, 0xb1e1, 0x0005, 0x002a, 0x0000, 0x0004, -+ 0x0012, 0xba42, 0x0003, 0x120b, 0x0012, 0x104b, 0x001b, 0x1204, -+ 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0002, 0x0015, 0x0033, -+ 0x0000, 0x1b2a, 0x000b, 0x81ed, 0x0010, 0x20b0, 0x0010, 0x21b1, -+ 0x0010, 0x22b2, 0x0010, 0x23b3, 0x0010, 0x24b4, 0x0010, 0x25b5, -+ 0x0010, 0x28b8, 0x0010, 0x29b9, 0x0000, 0x1a30, 0x0005, 0x0031, -+ 0x0000, 0x0007, 0x0015, 0x0033, 0x0010, 0xb032, 0x001b, 0x81fb, -+ 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, -+ 0x0010, 0xb812, 0x001b, 0x8201, 0x0005, 0x0015, 0x0010, 0x0000, -+ 0x0013, 0x0035, 0x0000, 0x1efe, 0x0013, 0x6219, 0x0014, 0x024b, -+ 0x0000, 0x1efe, 0x000c, 0x624b, 0x0013, 0x0204, 0x0000, 0x1a30, -+ 0x0005, 0x0031, 0x0000, 0x0020, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x001b, 0x8210, 0x0002, 0xb02f, 0x0000, 0xffb0, 0x0005, 0x0031, -+ 0x0000, 0x0020, 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x8217, -+ 0x0003, 0x01e8, 0x0015, 0x00b8, 0x0010, 0x0005, 0x0014, 0x07ed, -+ 0x0000, 0x13b8, 0x0015, 0x003a, 0x0010, 0x0404, 0x0014, 0x07ed, -+ 0x0013, 0x0204, 0x0005, 0x0015, 0x0000, 0x0001, 0x0012, 0xba42, -+ 0x0013, 0x122e, 0x0003, 0xb225, 0x0010, 0x2bff, 0x0012, 0xff4f, -+ 0x001b, 0x11cd, 0x0002, 0xba43, 0x001b, 0x120b, 0x0000, 0x1efe, -+ 0x000c, 0x624b, 0x0013, 0x0204, 0x0010, 0x28b8, 0x0010, 0x29b9, -+ 0x0004, 0x02bc, 0x0002, 0x3a42, 0x001b, 0x1204, 0x0000, 0x1c30, -+ 0x0015, 0x00ff, 0x0000, 0x0002, 0x0002, 0x1f43, 0x001b, 0x123b, -+ 0x0001, 0xff88, 0x0000, 0x0002, 0x0013, 0x023d, 0x0001, 0xff88, -+ 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb011, -+ 0x001b, 0x8240, 0x0000, 0xb0ff, 0x0011, 0x16a0, 0x0000, 0xff16, -+ 0x000b, 0x24e2, 0x0002, 0xb100, 0x0003, 0x0248, 0x0010, 0xb1ff, -+ 0x0001, 0x17a0, 0x0010, 0xff17, 0x0013, 0x020b, 0x0000, 0x16ff, -+ 0x0001, 0x18a0, 0x0010, 0xff00, 0x001b, 0x2252, 0x0002, 0x1700, -+ 0x0013, 0x12a5, 0x0003, 0x0253, 0x0010, 0x17ff, 0x0011, 0x19a0, -+ 0x0013, 0x22a5, 0x0011, 0x00d0, 0x0013, 0x12a5, 0x0000, 0x1c30, -+ 0x0000, 0x1b31, 0x0015, 0x0033, 0x0000, 0xb131, 0x001b, 0x825b, -+ 0x0013, 0xb25c, 0x0000, 0xb120, 0x0010, 0xb221, 0x0002, 0x1f43, -+ 0x001b, 0x1268, 0x0010, 0xc022, 0x0000, 0xc023, 0x0000, 0xb324, -+ 0x0000, 0xb425, 0x0010, 0xb3b5, 0x0000, 0xb4b6, 0x0003, 0x026c, -+ 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, 0x0010, 0xb625, -+ 0x0013, 0xb26c, 0x0005, 0x002a, 0x0000, 0x0001, 0x0012, 0x1500, -+ 0x0000, 0xff15, 0x0000, 0x16ff, 0x0001, 0xb580, 0x0000, 0xff16, -+ 0x000b, 0x2277, 0x0002, 0x1700, 0x0003, 0x0278, 0x0010, 0x17ff, -+ 0x0001, 0xb680, 0x0010, 0xff17, 0x0012, 0x1e10, 0x0010, 0xff1e, -+ 0x0003, 0x62a5, 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0010, 0xc030, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8283, -+ 0x0010, 0xb0fe, 0x000b, 0x62a4, 0x0000, 0x1c30, 0x0005, 0x0031, -+ 0x0000, 0x0001, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x828b, -+ 0x0010, 0xb0fe, 0x000b, 0x6291, 0x0005, 0x00ce, 0x0010, 0x0005, -+ 0x0003, 0x07b1, 0x0010, 0xb01c, 0x0000, 0x1c30, 0x0005, 0x0031, -+ 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8297, -+ 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0000, 0xff1f, 0x0010, 0xc030, -+ 0x0011, 0xbe80, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x82a0, 0x0000, 0xb01d, 0x0010, 0x1dff, 0x0013, 0x027f, -+ 0x0000, 0xb01b, 0x0017, 0x4000, 0x0002, 0x3a41, 0x0003, 0x12ae, -+ 0x0003, 0xb2a8, 0x0005, 0x002a, 0x0000, 0x0004, 0x0005, 0x0015, -+ 0x0010, 0x0000, 0x0013, 0x0204, 0x0000, 0x1a30, 0x0005, 0x0031, -+ 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b2a, 0x001b, 0x82b3, -+ 0x0015, 0x00b8, 0x0000, 0x0004, 0x0014, 0x07ed, 0x0000, 0x13b8, -+ 0x0015, 0x003a, 0x0010, 0x0404, 0x0014, 0x07ed, 0x0013, 0x0039, -+ 0x0002, 0x1e00, 0x0010, 0xff1e, 0x0012, 0x1d10, 0x0010, 0xff1d, -+ 0x0010, 0xc030, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x001b, 0x82c4, 0x0010, 0xb0fe, 0x000b, 0x62e9, 0x0000, 0x1cff, -+ 0x0001, 0x1ae0, 0x0003, 0x12d3, 0x0000, 0x1c30, 0x0005, 0x0031, -+ 0x0010, 0x0000, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82cf, -+ 0x0010, 0xb0fe, 0x000b, 0x62d3, 0x0000, 0x1aff, 0x0000, 0xff1c, -+ 0x0000, 0x1c30, 0x0005, 0x0031, 0x0000, 0x0019, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x001b, 0x82d9, 0x0001, 0xb0c8, 0x0010, 0x000f, -+ 0x0000, 0xff1f, 0x0001, 0xbf80, 0x0010, 0xff1d, 0x0010, 0xc030, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82e3, -+ 0x0010, 0xb0fe, 0x000b, 0x62e9, 0x0005, 0x00ce, 0x0010, 0x0006, -+ 0x0003, 0x07b1, 0x0000, 0xb01b, 0x0017, 0x4000, 0x0010, 0x79b0, -+ 0x0000, 0xd0ff, 0x0012, 0xff40, 0x001b, 0x1039, 0x0015, 0x00d1, -+ 0x0010, 0x0101, 0x0013, 0x92f1, 0x0005, 0x0079, 0x0000, 0x0002, -+ 0x0013, 0x92f4, 0x0015, 0x00d1, 0x0000, 0x0100, 0x0010, 0x13fe, -+ 0x0003, 0x6329, 0x0012, 0xb04e, 0x000b, 0x133e, 0x0012, 0x784a, -+ 0x0003, 0x1344, 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0010, 0x1800, -+ 0x001b, 0x1344, 0x0001, 0x0fe8, 0x0000, 0x0001, 0x000b, 0x130d, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000e, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x8f0a, 0x000b, 0x830b, -+ 0x0003, 0x034a, 0x0001, 0x0fe8, 0x0000, 0x0002, 0x001b, 0x1318, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0005, 0x0031, 0x0000, 0x001a, -+ 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x8316, 0x0003, 0x034a, -+ 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0013, 0x131f, 0x0005, 0x00ce, -+ 0x0000, 0x0007, 0x0010, 0x0fcf, 0x0013, 0x07ab, 0x0000, 0x13b8, -+ 0x0002, 0x1045, 0x0003, 0x1327, 0x0012, 0x103f, 0x0002, 0xff27, -+ 0x0004, 0x0366, 0x0014, 0x07ed, 0x0003, 0x0329, 0x0012, 0x103f, -+ 0x0004, 0x0366, 0x0015, 0x000f, 0x0010, 0x0000, 0x0002, 0x3944, -+ 0x0013, 0x1332, 0x0015, 0x0039, 0x0000, 0x5040, 0x0015, 0x00b8, -+ 0x0000, 0x0008, 0x0014, 0x07ed, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0001, 0xbd88, 0x0010, 0x000c, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0xc00a, 0x001b, 0x8339, 0x0010, 0xc014, 0x0000, 0xc013, -+ 0x0000, 0xc010, 0x0013, 0x0039, 0x0015, 0x00b8, 0x0010, 0x0003, -+ 0x0015, 0x003a, 0x0010, 0x0202, 0x0014, 0x07ed, 0x0003, 0x033d, -+ 0x0015, 0x00b8, 0x0000, 0x0002, 0x0015, 0x003a, 0x0010, 0x0202, -+ 0x0014, 0x07ed, 0x0003, 0x033d, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x1388, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x000b, 0x8351, 0x0011, 0x1388, 0x0010, 0x0003, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x8357, -+ 0x0010, 0xb0fe, 0x0013, 0x635c, 0x0000, 0xb012, 0x0003, 0x035e, -+ 0x0010, 0xc012, 0x0010, 0xc011, 0x0012, 0x104b, 0x0013, 0x131f, -+ 0x0002, 0x103b, 0x0010, 0xff03, 0x0005, 0x0002, 0x0010, 0x0000, -+ 0x0000, 0xc00d, 0x0003, 0x031f, 0x0000, 0xffb0, 0x0010, 0xc3b1, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xb888, 0x0010, 0x0011, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, 0x001b, 0x836f, -+ 0x0017, 0x4000, 0x0012, 0x3a43, 0x0013, 0x1380, 0x0015, 0x003a, -+ 0x0000, 0x0800, 0x0010, 0x0db0, 0x0003, 0x6380, 0x0000, 0x0bff, -+ 0x0001, 0xb0e0, 0x0003, 0x13a6, 0x0010, 0x09ff, 0x0001, 0xb0e0, -+ 0x0013, 0x138a, 0x0010, 0x05ff, 0x0001, 0xb0e0, 0x0003, 0x1384, -+ 0x0000, 0xc00e, 0x0000, 0x05fe, 0x0013, 0x6387, 0x0000, 0x050d, -+ 0x0005, 0x0002, 0x0000, 0x0004, 0x0003, 0x03a1, 0x0000, 0x09fe, -+ 0x0013, 0x63a3, 0x0000, 0x090d, 0x0005, 0x0002, 0x0000, 0x0001, -+ 0x0014, 0x0405, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, -+ 0x000b, 0x8394, 0x0011, 0x03c8, 0x0010, 0x000f, 0x0000, 0xffb6, -+ 0x0011, 0xb6e8, 0x0000, 0x0001, 0x0013, 0x1499, 0x0011, 0xb6e8, -+ 0x0000, 0x0002, 0x0013, 0x14bb, 0x0011, 0xb6e8, 0x0010, 0x0003, -+ 0x0003, 0x15a6, 0x0004, 0x07b6, 0x0013, 0x0404, 0x0010, 0x0bfe, -+ 0x0013, 0x6404, 0x0010, 0x0b0d, 0x0005, 0x0002, 0x0000, 0x0002, -+ 0x0014, 0x0405, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, -+ 0x000b, 0x83b0, 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x0021, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x83b6, 0x0001, 0xb0a8, -+ 0x0000, 0x199a, 0x0013, 0x23bc, 0x0005, 0x00b0, 0x0000, 0x1999, -+ 0x0012, 0xb050, 0x0000, 0xffb0, 0x0002, 0xff50, 0x0002, 0xff50, -+ 0x0001, 0xb080, 0x0000, 0xffb0, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0010, 0x0006, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb00a, 0x001b, 0x83c9, 0x0000, 0xb930, 0x0005, 0x0031, -+ 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x83cf, -+ 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0001, 0xffe8, 0x0010, 0x0048, -+ 0x000b, 0x1414, 0x0005, 0x0002, 0x0010, 0x0006, 0x0012, 0x0c10, -+ 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, -+ 0x000b, 0x83e0, 0x0000, 0xb10b, 0x000b, 0x63e4, 0x0010, 0xb10a, -+ 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x83e6, 0x0002, 0x032b, -+ 0x0010, 0xff03, 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0x030a, 0x001b, 0x83ee, 0x0000, 0x11fe, -+ 0x000b, 0x63f3, 0x0000, 0x0d12, 0x0013, 0x03fc, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, 0x0000, 0xff31, -+ 0x0010, 0x0db0, 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x83fb, -+ 0x0000, 0x0d11, 0x0013, 0x0404, 0x0000, 0x05fe, 0x0013, 0x6404, -+ 0x0005, 0x0002, 0x0000, 0x0004, 0x0000, 0x050d, 0x0004, 0x07b6, -+ 0x0013, 0x0047, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x0309, -+ 0x000b, 0x840c, 0x0011, 0x0d88, 0x0010, 0x0005, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb909, 0x000b, 0x8412, 0x0017, 0x4000, -+ 0x0005, 0x00b6, 0x0010, 0x0600, 0x0014, 0x05d6, 0x0004, 0x0483, -+ 0x0000, 0xb05a, 0x0000, 0xb15b, 0x0005, 0x0054, 0x0010, 0x0829, -+ 0x0010, 0x0d58, 0x0015, 0x0059, 0x0010, 0xffff, 0x0000, 0xb930, -+ 0x0005, 0x0031, 0x0010, 0x001e, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x8424, 0x0000, 0xb05c, 0x0005, 0x0031, 0x0000, 0x001f, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x842a, 0x0001, 0xb0c8, -+ 0x0010, 0x000f, 0x001b, 0x1431, 0x0015, 0x00ff, 0x0010, 0x0005, -+ 0x0003, 0x0439, 0x0002, 0xb040, 0x0013, 0x1436, 0x0015, 0x00ff, -+ 0x0000, 0x0004, 0x0003, 0x0439, 0x0001, 0xb0c8, 0x0010, 0x0006, -+ 0x0002, 0xff60, 0x0010, 0xffb2, 0x0011, 0x0d88, 0x0000, 0x0019, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, 0x000b, 0x843f, -+ 0x0012, 0xb170, 0x0011, 0xffc8, 0x0010, 0xff00, 0x0011, 0xb2d0, -+ 0x0010, 0xff60, 0x0002, 0xb045, 0x0003, 0x144a, 0x0015, 0x00b2, -+ 0x0000, 0x0002, 0x0013, 0x0454, 0x0002, 0xb046, 0x0003, 0x144f, -+ 0x0015, 0x00b2, 0x0000, 0x0001, 0x0013, 0x0454, 0x0015, 0x00b2, -+ 0x0010, 0x0000, 0x0000, 0xc0b0, 0x0010, 0xc0b1, 0x0003, 0x045a, -+ 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x002b, 0x0015, 0x0033, -+ 0x0000, 0xb011, 0x000b, 0x8459, 0x0010, 0xb16a, 0x0010, 0xb06b, -+ 0x0000, 0xb261, 0x0015, 0x0044, 0x0010, 0x0018, 0x0005, 0x0031, -+ 0x0000, 0x0023, 0x0015, 0x0033, 0x0000, 0x6241, 0x000b, 0x8463, -+ 0x0013, 0x9464, 0x0015, 0x00a0, 0x0000, 0x0020, 0x0012, 0xd041, -+ 0x001b, 0x1467, 0x0015, 0x00d1, 0x0010, 0x0202, 0x0013, 0x946b, -+ 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0000, 0x1804, 0x0001, 0xffd8, -+ 0x0010, 0x0009, 0x0003, 0x9471, 0x0000, 0xff75, 0x0013, 0x9473, -+ 0x0015, 0x00d1, 0x0000, 0x0200, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0001, 0xbd88, 0x0000, 0x0008, 0x0000, 0xff31, 0x0015, 0x00b1, -+ 0x0010, 0x07d0, 0x0005, 0x00b0, 0x0010, 0x0009, 0x0015, 0x0033, -+ 0x0000, 0xb012, 0x000b, 0x8481, 0x0013, 0x0404, 0x0000, 0xba30, -+ 0x0005, 0x0031, 0x0000, 0x0031, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x8488, 0x0002, 0xb040, 0x0013, 0x1496, 0x0000, 0xb7b0, -+ 0x0000, 0xb9b1, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0000, 0x0013, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, -+ 0x001b, 0x8494, 0x0013, 0x0498, 0x0010, 0xc0b1, 0x0000, 0xc0b0, -+ 0x0017, 0x4000, 0x0005, 0x00b6, 0x0010, 0x0500, 0x0014, 0x05d6, -+ 0x0005, 0x0054, 0x0010, 0x0889, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x000b, 0x84a5, 0x0010, 0xb058, 0x0000, 0x0d59, -+ 0x0000, 0xb930, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, -+ 0x0000, 0xb011, 0x001b, 0x84ad, 0x0010, 0xb15c, 0x0010, 0xb05d, -+ 0x0005, 0x0031, 0x0010, 0x002b, 0x0015, 0x0033, 0x0000, 0xb011, -+ 0x000b, 0x84b4, 0x0000, 0xb15e, 0x0000, 0xb05f, 0x0003, 0x94b7, -+ 0x0015, 0x00a0, 0x0010, 0x000c, 0x0013, 0x05bb, 0x0005, 0x00b6, -+ 0x0000, 0x0700, 0x0014, 0x05d6, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0xb709, 0x000b, 0x84c5, 0x0012, 0xb749, 0x0003, 0x14cb, -+ 0x0005, 0x0054, 0x0010, 0x0889, 0x0013, 0x04cd, 0x0005, 0x0054, -+ 0x0010, 0x0898, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x84d4, 0x0010, 0xb058, 0x0000, 0x0d59, 0x0001, 0xb9a8, -+ 0x0010, 0x00f0, 0x000b, 0x24f9, 0x0011, 0x0d88, 0x0010, 0x0005, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x84df, -+ 0x0001, 0xb0c8, 0x0000, 0xf700, 0x0000, 0xffb0, 0x0011, 0xb0e8, -+ 0x0000, 0xf100, 0x0013, 0x1540, 0x0011, 0xb0e8, 0x0000, 0xf200, -+ 0x0013, 0x1545, 0x0011, 0xb0e8, 0x0010, 0xf300, 0x0013, 0x1568, -+ 0x0011, 0xb0e8, 0x0000, 0xf400, 0x0013, 0x156d, 0x0011, 0xb0e8, -+ 0x0010, 0xf500, 0x0013, 0x1540, 0x0011, 0xb0e8, 0x0010, 0xf600, -+ 0x0003, 0x157e, 0x0005, 0x00ce, 0x0010, 0x0009, 0x0000, 0xb0cf, -+ 0x0013, 0x07ab, 0x0000, 0xb930, 0x0005, 0x0031, 0x0000, 0x0025, -+ 0x0015, 0x0033, 0x0000, 0xb039, 0x001b, 0x84fe, 0x0012, 0xb749, -+ 0x0003, 0x1503, 0x0002, 0xb52c, 0x0000, 0xffb5, 0x0000, 0xb162, -+ 0x0000, 0xb063, 0x0005, 0x0031, 0x0000, 0x001f, 0x0015, 0x0033, -+ 0x0000, 0xb309, 0x001b, 0x8509, 0x0001, 0xb3c8, 0x0010, 0x0003, -+ 0x0003, 0x1511, 0x0010, 0xffb2, 0x0001, 0xffe8, 0x0010, 0x0003, -+ 0x000b, 0x1513, 0x0000, 0xc2b7, 0x0013, 0x059a, 0x0001, 0xb2e8, -+ 0x0000, 0x0001, 0x0013, 0x151a, 0x0005, 0x00ce, 0x0010, 0x000a, -+ 0x0010, 0xb2cf, 0x0013, 0x07ab, 0x0010, 0xb465, 0x0010, 0xb667, -+ 0x0015, 0x00b7, 0x0010, 0x0018, 0x0001, 0xb5c8, 0x0010, 0x0300, -+ 0x0003, 0x153f, 0x0012, 0xb548, 0x0013, 0x1526, 0x0000, 0xb6ff, -+ 0x0011, 0xb780, 0x0010, 0xffb7, 0x0002, 0xb549, 0x0003, 0x152b, -+ 0x0010, 0xb4ff, 0x0011, 0xb780, 0x0010, 0xffb7, 0x0015, 0x0044, -+ 0x0010, 0x0018, 0x0005, 0x0031, 0x0000, 0x002c, 0x0015, 0x0033, -+ 0x0000, 0x6841, 0x000b, 0x8531, 0x0015, 0x0044, 0x0000, 0x0019, -+ 0x0005, 0x0031, 0x0000, 0x0034, 0x0015, 0x0033, 0x0000, 0x5029, -+ 0x000b, 0x8538, 0x0015, 0x0044, 0x0000, 0x0008, 0x0011, 0xb7c8, -+ 0x0010, 0x0003, 0x0003, 0x153f, 0x0010, 0xff55, 0x0013, 0x059a, -+ 0x0005, 0x00b5, 0x0000, 0x0008, 0x0015, 0x00b7, 0x0010, 0x0018, -+ 0x0013, 0x059a, 0x0011, 0x0d88, 0x0000, 0x000b, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x854a, 0x0010, 0xb1ff, -+ 0x0001, 0xb0d0, 0x0003, 0x1553, 0x0005, 0x00b5, 0x0010, 0x0b02, -+ 0x0010, 0xb062, 0x0010, 0xb163, 0x0013, 0x0555, 0x0005, 0x00b5, -+ 0x0000, 0x0302, 0x0015, 0x0065, 0x0010, 0x0012, 0x0005, 0x0067, -+ 0x0000, 0x0008, 0x0015, 0x006c, 0x0000, 0x7000, 0x0005, 0x006d, -+ 0x0010, 0x0500, 0x0015, 0x006f, 0x0010, 0x000a, 0x0015, 0x0044, -+ 0x0000, 0x0001, 0x0005, 0x0052, 0x0000, 0x2500, 0x0015, 0x0044, -+ 0x0000, 0x0008, 0x0015, 0x00b7, 0x0000, 0x0032, 0x0013, 0x059a, -+ 0x0005, 0x00b5, 0x0010, 0x0028, 0x0015, 0x00b7, 0x0010, 0x0018, -+ 0x0013, 0x059a, 0x0005, 0x00b5, 0x0000, 0x0100, 0x0005, 0x0067, -+ 0x0000, 0x0008, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0010, 0x0018, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x001b, 0x8578, 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0015, 0x00b7, -+ 0x0000, 0x0020, 0x0013, 0x059a, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0010, 0x0005, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb609, 0x000b, 0x8585, 0x0001, 0xb6c8, 0x0010, 0xff00, -+ 0x0000, 0xffb0, 0x0015, 0x0033, 0x0000, 0xb00a, 0x001b, 0x858b, -+ 0x0001, 0xb6c8, 0x0010, 0x00ff, 0x0012, 0xff10, 0x000b, 0x1594, -+ 0x0000, 0xffb5, 0x0015, 0x00b7, 0x0010, 0x0018, 0x0013, 0x059a, -+ 0x0010, 0xff63, 0x0005, 0x00b5, 0x0000, 0x0800, 0x0015, 0x00b7, -+ 0x0010, 0x0018, 0x0013, 0x059a, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x000b, 0x85a1, 0x0010, 0xb561, 0x0013, 0x95a3, -+ 0x0010, 0xb7a0, 0x0013, 0x05bb, 0x0005, 0x00b6, 0x0010, 0x0300, -+ 0x0014, 0x05d6, 0x0005, 0x0054, 0x0010, 0x0819, 0x0010, 0x0d58, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0002, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x85b3, -+ 0x0000, 0xb059, 0x0003, 0x95b5, 0x0010, 0xc0a0, 0x0010, 0x71ff, -+ 0x0002, 0xff28, 0x0010, 0xff71, 0x0013, 0x05bb, 0x0012, 0xd041, -+ 0x001b, 0x15bb, 0x0015, 0x00d1, 0x0010, 0x0202, 0x0000, 0x75ff, -+ 0x0011, 0xffc8, 0x0000, 0x1804, 0x0001, 0xffd8, 0x0010, 0x0009, -+ 0x0003, 0x95c4, 0x0000, 0xff75, 0x0013, 0x95c6, 0x0015, 0x00d1, -+ 0x0000, 0x0200, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, -+ 0x0000, 0x0008, 0x0000, 0xff31, 0x0005, 0x00b0, 0x0010, 0x0009, -+ 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0015, 0x0033, 0x0000, 0xb012, -+ 0x001b, 0x85d4, 0x0013, 0x0404, 0x0015, 0x0044, 0x0000, 0x0008, -+ 0x0005, 0x0098, 0x0010, 0x0056, 0x0015, 0x0099, 0x0000, 0x9575, -+ 0x0014, 0x0772, 0x0000, 0xb096, 0x0012, 0xb270, 0x0010, 0xff56, -+ 0x0004, 0x0794, 0x0010, 0xb052, 0x0010, 0xb153, 0x0000, 0xb6ff, -+ 0x0011, 0xb2d0, 0x0010, 0xff50, 0x0010, 0xb351, 0x0017, 0x4000, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1288, 0x0010, 0x0011, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x1009, 0x000b, 0x85ef, -+ 0x0015, 0x000f, 0x0000, 0x0001, 0x0010, 0xc014, 0x0000, 0x1213, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0004, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, 0x000b, 0x85fb, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0010, 0x0005, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x1a09, 0x001b, 0x8603, -+ 0x0012, 0x104b, 0x001b, 0x160c, 0x0000, 0x1a30, 0x0005, 0x0031, -+ 0x0000, 0x000b, 0x0015, 0x0033, 0x0000, 0x1621, 0x000b, 0x860b, -+ 0x0010, 0x15fe, 0x001b, 0x6615, 0x0004, 0x0633, 0x0002, 0x3a42, -+ 0x000b, 0x1632, 0x0001, 0x10c8, 0x0010, 0x000f, 0x001b, 0x1695, -+ 0x0003, 0x0631, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, -+ 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x861c, 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x861f, -+ 0x0010, 0xb0fe, 0x0013, 0x6624, 0x0000, 0xb012, 0x0003, 0x0626, -+ 0x0010, 0xc012, 0x0010, 0xc011, 0x0015, 0x000f, 0x0010, 0x0000, -+ 0x0002, 0x3944, 0x0013, 0x162f, 0x0015, 0x0039, 0x0000, 0x5040, -+ 0x0015, 0x00b8, 0x0000, 0x0008, 0x0014, 0x07ed, 0x0000, 0xc013, -+ 0x0003, 0x0632, 0x0004, 0x07d9, 0x0003, 0x0051, 0x0003, 0xb633, -+ 0x0005, 0x002a, 0x0000, 0x0004, 0x0000, 0xba30, 0x0005, 0x0031, -+ 0x0010, 0x001b, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x863b, -+ 0x0000, 0xc02c, 0x0000, 0xb02d, 0x0012, 0x104b, 0x0003, 0x1656, -+ 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, -+ 0x0000, 0xb129, 0x000b, 0x8645, 0x0000, 0xb120, 0x0010, 0xb221, -+ 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, 0x0000, 0xc025, -+ 0x0010, 0xb526, 0x0010, 0xc027, 0x0010, 0xb516, 0x0010, 0xc017, -+ 0x0000, 0xb518, 0x0000, 0xc019, 0x0010, 0xc028, 0x0000, 0xc029, -+ 0x0010, 0xc01e, 0x0003, 0x068c, 0x0012, 0x1044, 0x0013, 0x1686, -+ 0x0002, 0x1034, 0x0000, 0xff10, 0x0000, 0x1a30, 0x0005, 0x0031, -+ 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b29, 0x001b, 0x865f, -+ 0x0000, 0x1c30, 0x0000, 0x1b31, 0x0015, 0x0033, 0x0000, 0xb131, -+ 0x000b, 0x8664, 0x0002, 0x1f43, 0x000b, 0x166b, 0x0010, 0xb3b5, -+ 0x0000, 0xb4b6, 0x0000, 0xc0b3, 0x0010, 0xc0b4, 0x0000, 0xb120, -+ 0x0010, 0xb221, 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, -+ 0x0010, 0xb625, 0x0010, 0xb516, 0x0000, 0xb617, 0x0000, 0x1826, -+ 0x0000, 0x1927, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, -+ 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x867a, 0x0000, 0xb028, -+ 0x0000, 0xb129, 0x0012, 0x1e10, 0x0010, 0xff1e, 0x0003, 0x668c, -+ 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0004, 0x027f, 0x0002, 0x3a42, -+ 0x0013, 0x168c, 0x0003, 0x0694, 0x0000, 0x1a30, 0x0005, 0x0031, -+ 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b79, 0x001b, 0x868b, -+ 0x0013, 0xb68c, 0x0005, 0x002a, 0x0000, 0x0001, 0x0005, 0x0015, -+ 0x0000, 0x0001, 0x0000, 0x1efe, 0x0003, 0x6694, 0x0003, 0x024b, -+ 0x0017, 0x4000, 0x0000, 0xba30, 0x0005, 0x0031, 0x0010, 0x001b, -+ 0x0015, 0x0033, 0x0010, 0xb051, 0x001b, 0x869a, 0x0000, 0xb0a3, -+ 0x0010, 0xb697, 0x0010, 0xb946, 0x0015, 0x00a5, 0x0000, 0x0010, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0002, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb509, 0x000b, 0x86a7, -+ 0x0004, 0x0794, 0x0004, 0x0783, 0x0012, 0xb470, 0x0010, 0xffb4, -+ 0x0010, 0xb48e, 0x0010, 0xb08a, 0x0010, 0xb18b, 0x0012, 0x104d, -+ 0x0003, 0x16b2, 0x0003, 0x06df, 0x0012, 0x104b, 0x0003, 0x16c5, -+ 0x0005, 0x008c, 0x0010, 0x0829, 0x0010, 0xc08d, 0x0001, 0xb2d8, -+ 0x0010, 0x0600, 0x0010, 0xff88, 0x0010, 0xb389, 0x0000, 0x1390, -+ 0x0010, 0xb591, 0x0000, 0xc08f, 0x0010, 0x1ab9, 0x0004, 0x0483, -+ 0x0013, 0x96c0, 0x0010, 0xb092, 0x0010, 0xb193, 0x0013, 0x96c3, -+ 0x0003, 0x06da, 0x0005, 0x008c, 0x0000, 0x0809, 0x0015, 0x008d, -+ 0x0000, 0x0008, 0x0001, 0xb2d8, 0x0000, 0x0100, 0x0010, 0xff88, -+ 0x0010, 0xb389, 0x0000, 0x1390, 0x0010, 0xb591, 0x0000, 0xc08f, -+ 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, -+ 0x0000, 0xb011, 0x000b, 0x86d5, 0x0003, 0x96d6, 0x0000, 0xb192, -+ 0x0000, 0xb093, 0x0003, 0x96d9, 0x0010, 0x19a1, 0x0000, 0x18a2, -+ 0x0015, 0x00b1, 0x0010, 0x0096, 0x0003, 0x074e, 0x0000, 0xb590, -+ 0x0010, 0x1391, 0x0001, 0x10c8, 0x0010, 0x000f, 0x0001, 0xffe8, -+ 0x0010, 0x0005, 0x0013, 0x1706, 0x0001, 0xb2d8, 0x0000, 0x0700, -+ 0x0010, 0xff88, 0x0010, 0xb389, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x1388, 0x0010, 0x0009, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x000b, 0x86f1, 0x0002, 0xb049, 0x0003, 0x16f9, -+ 0x0005, 0x008c, 0x0010, 0x0889, 0x0015, 0x00b1, 0x0010, 0x0096, -+ 0x0003, 0x06fd, 0x0005, 0x008c, 0x0010, 0x0898, 0x0015, 0x00b1, -+ 0x0000, 0x0092, 0x0010, 0xc08d, 0x0000, 0xc08f, 0x0013, 0x96ff, -+ 0x0000, 0xc092, 0x0010, 0xc093, 0x0013, 0x9702, 0x0010, 0x19a1, -+ 0x0000, 0x18a2, 0x0003, 0x074e, 0x0001, 0xb2d8, 0x0000, 0x0100, -+ 0x0010, 0xff88, 0x0010, 0xb389, 0x0005, 0x008c, 0x0010, 0x0880, -+ 0x0015, 0x008d, 0x0000, 0x0008, 0x0011, 0x1388, 0x0000, 0x000e, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8713, -+ 0x0010, 0xb08f, 0x0000, 0xb590, 0x0010, 0x1391, 0x0000, 0x1a30, -+ 0x0005, 0x0031, 0x0000, 0x000d, 0x0015, 0x0033, 0x0000, 0xb021, -+ 0x001b, 0x871c, 0x0003, 0x971d, 0x0010, 0xb392, 0x0010, 0xb293, -+ 0x0013, 0x9720, 0x0000, 0xb1a1, 0x0010, 0xb0a2, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x872a, 0x0000, 0xb3ff, -+ 0x0001, 0xb080, 0x0000, 0xffb3, 0x001b, 0x2731, 0x0002, 0xb200, -+ 0x0013, 0x0732, 0x0010, 0xb2ff, 0x0011, 0xb180, 0x0010, 0xffb2, -+ 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0xb212, 0x000b, 0x8739, 0x0015, 0x00b1, 0x0000, 0x0092, -+ 0x0002, 0x104c, 0x0003, 0x174c, 0x0011, 0xc2e8, 0x0010, 0x000c, -+ 0x000b, 0x1744, 0x0015, 0x00ff, 0x0000, 0x0800, 0x0013, 0x074c, -+ 0x0011, 0xc2e8, 0x0000, 0x0020, 0x001b, 0x174a, 0x0015, 0x00ff, -+ 0x0010, 0x1800, 0x0013, 0x074c, 0x0015, 0x00ff, 0x0000, 0x1000, -+ 0x0011, 0xb1d0, 0x0010, 0xffb1, 0x0015, 0x009a, 0x0010, 0x0036, -+ 0x0005, 0x009b, 0x0000, 0x95d5, 0x0012, 0xd041, 0x001b, 0x1752, -+ 0x0015, 0x00d1, 0x0010, 0x0202, 0x0003, 0x9756, 0x0012, 0x104e, -+ 0x0003, 0x175b, 0x0012, 0xb12f, 0x0010, 0xffb1, 0x0000, 0xb175, -+ 0x0003, 0x975c, 0x0015, 0x00d1, 0x0000, 0x0200, 0x0001, 0x19c8, -+ 0x0010, 0xfff0, 0x000b, 0x1765, 0x0015, 0x00b1, 0x0010, 0x07d0, -+ 0x0013, 0x0767, 0x0015, 0x00b1, 0x0000, 0x1b58, 0x0005, 0x00b0, -+ 0x0010, 0x0009, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, -+ 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, -+ 0x001b, 0x8770, 0x0003, 0x0632, 0x0000, 0xba30, 0x0005, 0x0031, -+ 0x0010, 0x0021, 0x0015, 0x0033, 0x0010, 0xb019, 0x000b, 0x8777, -+ 0x0002, 0xb200, 0x0011, 0xffc8, 0x0010, 0x00ff, 0x0010, 0xffb2, -+ 0x0010, 0xb2b7, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, -+ 0x0010, 0xb20a, 0x000b, 0x8781, 0x0017, 0x4000, 0x0000, 0xba30, -+ 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, 0x0010, 0xb409, -+ 0x000b, 0x8788, 0x0002, 0xb400, 0x0011, 0xffc8, 0x0010, 0x00ff, -+ 0x0010, 0xffb4, 0x0010, 0xb4b7, 0x0005, 0x0031, 0x0000, 0x0023, -+ 0x0015, 0x0033, 0x0010, 0xb40a, 0x001b, 0x8792, 0x0017, 0x4000, -+ 0x0000, 0xba30, 0x0001, 0xc7c8, 0x0000, 0x0020, 0x000b, 0x17a0, -+ 0x0005, 0x0031, 0x0010, 0x0028, 0x0015, 0x0033, 0x0010, 0xb209, -+ 0x000b, 0x879c, 0x0011, 0xb2c8, 0x0000, 0xff80, 0x0013, 0x17a3, -+ 0x0010, 0xc4b0, 0x0010, 0xc5b1, 0x0003, 0x07a5, 0x0010, 0xc6b1, -+ 0x0000, 0xc0b0, 0x0005, 0x0031, 0x0000, 0x0004, 0x0015, 0x0033, -+ 0x0010, 0xb211, 0x000b, 0x87a9, 0x0017, 0x4000, 0x0015, 0x00b8, -+ 0x0010, 0x0009, 0x0015, 0x003a, 0x0010, 0x0707, 0x0014, 0x07ed, -+ 0x0013, 0x002d, 0x0015, 0x00b8, 0x0010, 0x0009, 0x0015, 0x003a, -+ 0x0010, 0x0707, 0x0003, 0x07ed, 0x0004, 0x0110, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xba09, 0x000b, 0x87be, 0x0014, 0x0772, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0010, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb20a, 0x001b, 0x87c7, -+ 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x0309, 0x001b, 0x87cd, 0x0002, 0x0327, 0x0010, 0xffb2, -+ 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0xb20a, 0x001b, 0x87d5, 0x0015, 0x00b8, 0x0010, 0x0006, -+ 0x0003, 0x07ed, 0x0014, 0x0122, 0x0014, 0x0772, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0010, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xb20a, 0x000b, 0x87e2, 0x0012, 0x1027, -+ 0x0010, 0xffb2, 0x0011, 0x1388, 0x0010, 0x0011, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xb20a, 0x001b, 0x87ea, 0x0015, 0x00b8, -+ 0x0000, 0x0007, 0x0013, 0x47ed, 0x0000, 0xb838, 0x0017, 0x4000, -+ 0xa85a, 0x97da -+}; -+unsigned short xseqflx_code_length01 = 0x0fe2; -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2322ipx_fw.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2322ipx_fw.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/ql2322ipx_fw.h 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/ql2322ipx_fw.h 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,8072 @@ -+/****************************************************************************** -+ * 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. -+ * -+ ******************************************************************************/ -+ -+/************************************************************************ -+ * * * -+ * --- ISP2322 Initiator/Target Firmware --- * -+ * with support for Internet Protocol * -+ * and 2K port logins. * -+ * * * -+ ************************************************************************ -+ */ -+/* -+ * Firmware Version 3.02.28 (14:05 Apr 03, 2004) -+ */ -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2322ipx_version = 3*1024+2; -+#else -+unsigned short risc_code_version = 3*1024+2; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned char fw2322ipx_version_str[] = {3, 2,28}; -+#else -+unsigned char firmware_version[] = {3, 2,28}; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+#define fw2322ipx_VERSION_STRING "3.02.28" -+#else -+#define FW_VERSION_STRING "3.02.28" -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2322ipx_addr01 = 0x0800 ; -+#else -+unsigned short risc_code_addr01 = 0x0800 ; -+#endif -+ -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2322ipx_code01[] = { -+#else -+unsigned short risc_code01[] = { -+#endif -+ 0x0470, 0x0000, 0x0000, 0xdf42, 0x0000, 0x0003, 0x0002, 0x001c, -+ 0x0137, 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, 0x2e32, 0x3820, 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, 0x20c9, 0x1cff, 0x2059, 0x0000, 0x2b78, -+ 0x7883, 0x0004, 0x2089, 0x2ab5, 0x2051, 0x1800, 0x2a70, 0x20e1, -+ 0x0001, 0x20e9, 0x0001, 0x2009, 0x0000, 0x080c, 0x0e55, 0x00f6, -+ 0x7888, 0x9005, 0x11f8, 0x2061, 0xc000, 0x080c, 0x205a, 0x1170, -+ 0x2079, 0x0300, 0x080c, 0x2070, 0x2061, 0xe000, 0x080c, 0x205a, -+ 0x1128, 0x2079, 0x0380, 0x080c, 0x2070, 0x0060, 0x00fe, 0x7883, -+ 0x4010, 0x7837, 0x4010, 0x7833, 0x0010, 0x2091, 0x5000, 0x2091, -+ 0x4080, 0x0cf8, 0x00fe, 0x2029, 0x5600, 0x2031, 0xffff, 0x2039, -+ 0x55dc, 0x2021, 0x0200, 0x20e9, 0x0001, 0x20a1, 0x0000, 0x20a9, -+ 0x0800, 0x900e, 0x4104, 0x20e9, 0x0001, 0x20a1, 0x1000, 0x900e, -+ 0x2001, 0x0dc1, 0x9084, 0x0fff, 0x20a8, 0x4104, 0x2001, 0x0000, -+ 0x9086, 0x0000, 0x0120, 0x21a8, 0x4104, 0x8001, 0x1de0, 0x756e, -+ 0x7672, 0x776a, 0x7476, 0x747a, 0x00e6, 0x2071, 0x1b4e, 0x2472, -+ 0x00ee, 0x20a1, 0x1ddc, 0x7170, 0x810d, 0x810d, 0x810d, 0x810d, -+ 0x918c, 0x000f, 0x2001, 0x0001, 0x9112, 0x900e, 0x21a8, 0x4104, -+ 0x8211, 0x1de0, 0x7170, 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, 0x0f52, 0x080c, 0x6037, 0x080c, 0xab83, 0x080c, -+ 0x1109, 0x080c, 0x1328, 0x080c, 0x1bb0, 0x080c, 0x918d, 0x080c, -+ 0x0d0f, 0x080c, 0x108e, 0x080c, 0x3474, 0x080c, 0x7801, 0x080c, -+ 0x6a8f, 0x080c, 0x8905, 0x080c, 0x8569, 0x080c, 0x223f, 0x080c, -+ 0x7ed6, 0x080c, 0x2089, 0x080c, 0x21c3, 0x080c, 0x2234, 0x2091, -+ 0x3009, 0x7883, 0x0000, 0x1004, 0x0943, 0x7880, 0x9086, 0x0002, -+ 0x1190, 0x7883, 0x4000, 0x7837, 0x4000, 0x7833, 0x0010, 0x0e04, -+ 0x0937, 0x2091, 0x5000, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, -+ 0xd084, 0x190c, 0x11d6, 0x2071, 0x1800, 0x7003, 0x0000, 0x780c, -+ 0x9084, 0x0030, 0x9086, 0x0000, 0x190c, 0x0d7d, 0x2071, 0x1800, -+ 0x7000, 0x908e, 0x0003, 0x1168, 0x080c, 0x4bcc, 0x080c, 0x349b, -+ 0x080c, 0x7869, 0x080c, 0x6fd7, 0x080c, 0x89e3, 0x080c, 0x8592, -+ 0x0c68, 0x000b, 0x0c88, 0x096d, 0x096e, 0x0b09, 0x096b, 0x0bc3, -+ 0x0d0e, 0x0d0e, 0x0d0e, 0x080c, 0x0d7d, 0x0005, 0x0126, 0x00f6, -+ 0x2091, 0x8000, 0x7000, 0x9086, 0x0001, 0x1904, 0x0adc, 0x080c, -+ 0x0ea5, 0x080c, 0x74e9, 0x0150, 0x080c, 0x750c, 0x15b0, 0x2079, -+ 0x0100, 0x7828, 0x9085, 0x1800, 0x782a, 0x0478, 0x080c, 0x741a, -+ 0x7000, 0x9086, 0x0001, 0x1904, 0x0adc, 0x7098, 0x9086, 0x0028, -+ 0x1904, 0x0adc, 0x080c, 0x8561, 0x080c, 0x8553, 0x2001, 0x0161, -+ 0x2003, 0x0001, 0x2079, 0x0100, 0x2011, 0xffff, 0x080c, 0x2a44, -+ 0x7a28, 0x9295, 0x5e2c, 0x7a2a, 0x2011, 0x735f, 0x080c, 0x863e, -+ 0x2011, 0x7352, 0x080c, 0x874a, 0x2011, 0x5e8e, 0x080c, 0x863e, -+ 0x2011, 0x8030, 0x901e, 0x7396, 0x04d0, 0x080c, 0x573b, 0x2079, -+ 0x0100, 0x7844, 0x9005, 0x1904, 0x0adc, 0x2011, 0x5e8e, 0x080c, -+ 0x863e, 0x2011, 0x735f, 0x080c, 0x863e, 0x2011, 0x7352, 0x080c, -+ 0x874a, 0x2001, 0x0265, 0x2001, 0x0205, 0x2003, 0x0000, 0x7840, -+ 0x9084, 0xfffb, 0x7842, 0x2001, 0x19a6, 0x2004, 0x9005, 0x1140, -+ 0x00c6, 0x2061, 0x0100, 0x080c, 0x5fdf, 0x00ce, 0x0804, 0x0adc, -+ 0x780f, 0x006b, 0x7a28, 0x080c, 0x74f1, 0x0118, 0x9295, 0x5e2c, -+ 0x0010, 0x9295, 0x402c, 0x7a2a, 0x2011, 0x8010, 0x73d8, 0x2001, -+ 0x19a7, 0x2003, 0x0001, 0x080c, 0x2916, 0x080c, 0x4b07, 0x7248, -+ 0xc284, 0x724a, 0x2001, 0x180c, 0x200c, 0xc1ac, 0xc1cc, 0x2102, -+ 0x2001, 0x0390, 0x2003, 0x0400, 0x080c, 0xa896, 0x080c, 0xa073, -+ 0x2011, 0x0004, 0x080c, 0xc848, 0x080c, 0xa8b2, 0x080c, 0x6917, -+ 0x080c, 0x74e9, 0x1120, 0x080c, 0x2971, 0x0600, 0x0420, 0x080c, -+ 0x5fe6, 0x0140, 0x7097, 0x0001, 0x70d3, 0x0000, 0x080c, 0x5908, -+ 0x0804, 0x0adc, 0x080c, 0x56da, 0xd094, 0x01a8, 0x2001, 0x0390, -+ 0x2003, 0x0404, 0x2011, 0x180c, 0x2204, 0xc0cd, 0x2012, 0x080c, -+ 0x56de, 0xd0d4, 0x1118, 0x080c, 0x2971, 0x1270, 0x2011, 0x180c, -+ 0x2204, 0xc0bc, 0x00a8, 0x080c, 0x56de, 0xd0d4, 0x1db8, 0x2011, -+ 0x180c, 0x2204, 0xc0bd, 0x0060, 0x2011, 0x180c, 0x2204, 0xc0bd, -+ 0x2012, 0x080c, 0x6a63, 0x1128, 0xd0a4, 0x0118, 0x2204, 0xc0fd, -+ 0x2012, 0x080c, 0x6a29, 0x0120, 0x7a0c, 0xc2b4, 0x7a0e, 0x00a8, -+ 0x707f, 0x0000, 0x080c, 0x74e9, 0x1130, 0x70b0, 0x9005, 0x1168, -+ 0x080c, 0xcc9f, 0x0050, 0x080c, 0xcc9f, 0x70dc, 0xd09c, 0x1128, -+ 0x70b0, 0x9005, 0x0110, 0x080c, 0x5fbc, 0x70e7, 0x0000, 0x70e3, -+ 0x0000, 0x70a7, 0x0000, 0x080c, 0x2979, 0x0228, 0x2011, 0x0101, -+ 0x2204, 0xc0c4, 0x2012, 0x72dc, 0x080c, 0x74e9, 0x1178, 0x9016, -+ 0x0016, 0x080c, 0x2713, 0x2019, 0x196d, 0x211a, 0x001e, 0x705f, -+ 0xffff, 0x7063, 0x00ef, 0x7083, 0x0000, 0x0020, 0x2019, 0x196d, -+ 0x201b, 0x0000, 0x2079, 0x1847, 0x7804, 0xd0ac, 0x0108, 0xc295, -+ 0x72de, 0x080c, 0x74e9, 0x0118, 0x9296, 0x0004, 0x0518, 0x2011, -+ 0x0001, 0x080c, 0xc848, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, -+ 0x0002, 0x00fe, 0x080c, 0x2fb2, 0x080c, 0xa896, 0x2011, 0x0005, -+ 0x080c, 0xa1cf, 0x080c, 0xa8b2, 0x080c, 0x74e9, 0x0148, 0x00c6, -+ 0x2061, 0x0100, 0x0016, 0x080c, 0x2713, 0x61e2, 0x001e, 0x00ce, -+ 0x012e, 0x00e0, 0x70ab, 0x0000, 0x70af, 0xffff, 0x7003, 0x0002, -+ 0x080c, 0xa896, 0x2011, 0x0005, 0x080c, 0xa1cf, 0x080c, 0xa8b2, -+ 0x080c, 0x74e9, 0x0148, 0x00c6, 0x2061, 0x0100, 0x0016, 0x080c, -+ 0x2713, 0x61e2, 0x001e, 0x00ce, 0x00fe, 0x012e, 0x0005, 0x00c6, -+ 0x00b6, 0x080c, 0x74e9, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, -+ 0x0782, 0x080c, 0x74e9, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, -+ 0x86ff, 0x0138, 0x9180, 0x1000, 0x2004, 0x905d, 0x0110, 0xb800, -+ 0xd0bc, 0x090c, 0x32fc, 0x8108, 0x1f04, 0x0af0, 0x707f, 0x0000, -+ 0x7080, 0x9084, 0x00ff, 0x7082, 0x70b3, 0x0000, 0x00be, 0x00ce, -+ 0x0005, 0x00b6, 0x0126, 0x2091, 0x8000, 0x7000, 0x9086, 0x0002, -+ 0x1904, 0x0bc0, 0x70ac, 0x9086, 0xffff, 0x0120, 0x080c, 0x2fb2, -+ 0x0804, 0x0bc0, 0x70dc, 0xd0ac, 0x1110, 0xd09c, 0x0538, 0xd084, -+ 0x0528, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, 0x000e, 0xd08c, -+ 0x01e8, 0x080c, 0x336d, 0x11b0, 0x70e0, 0x9086, 0xffff, 0x0190, -+ 0x080c, 0x3147, 0x70dc, 0xd094, 0x1904, 0x0bc0, 0x2011, 0x0001, -+ 0x080c, 0xcf52, 0x0110, 0x2011, 0x0003, 0x901e, 0x080c, 0x3181, -+ 0x0804, 0x0bc0, 0x70e4, 0x9005, 0x1904, 0x0bc0, 0x70a8, 0x9005, -+ 0x1904, 0x0bc0, 0x70dc, 0xd0a4, 0x0118, 0xd0b4, 0x0904, 0x0bc0, -+ 0x080c, 0x6a29, 0x1904, 0x0bc0, 0x080c, 0x6a7c, 0x1904, 0x0bc0, -+ 0x080c, 0x6a63, 0x01c0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, -+ 0x0016, 0x080c, 0x6625, 0x1118, 0xb800, 0xd0ec, 0x1138, 0x001e, -+ 0x8108, 0x1f04, 0x0b60, 0x00ce, 0x015e, 0x0028, 0x001e, 0x00ce, -+ 0x015e, 0x0804, 0x0bc0, 0x0006, 0x2001, 0x0103, 0x2003, 0x002b, -+ 0x000e, 0x2011, 0x19b3, 0x080c, 0x0fc2, 0x2011, 0x19cd, 0x080c, -+ 0x0fc2, 0x7030, 0xc08c, 0x7032, 0x7003, 0x0003, 0x70af, 0xffff, -+ 0x080c, 0x0e79, 0x9006, 0x080c, 0x25a0, 0x080c, 0x336d, 0x0118, -+ 0x080c, 0x4ca4, 0x0050, 0x0036, 0x0046, 0x2019, 0xffff, 0x2021, -+ 0x0006, 0x080c, 0x4cbe, 0x004e, 0x003e, 0x00f6, 0x2079, 0x0100, -+ 0x080c, 0x750c, 0x0150, 0x080c, 0x74e9, 0x7828, 0x0118, 0x9084, -+ 0xe1ff, 0x0010, 0x9084, 0xffdf, 0x782a, 0x00fe, 0x080c, 0xa896, -+ 0x2001, 0x19e8, 0x2004, 0x9086, 0x0005, 0x1120, 0x2011, 0x0000, -+ 0x080c, 0xa1cf, 0x2011, 0x0000, 0x080c, 0xa1d9, 0x080c, 0xa8b2, -+ 0x012e, 0x00be, 0x0005, 0x0016, 0x0026, 0x0046, 0x00f6, 0x0126, -+ 0x2091, 0x8000, 0x2079, 0x0100, 0x7904, 0x918c, 0xfffd, 0x7906, -+ 0x2009, 0x00f7, 0x080c, 0x5fa5, 0x7940, 0x918c, 0x0010, 0x7942, -+ 0x7924, 0xd1b4, 0x0120, 0x2011, 0x0040, 0x080c, 0x2a44, 0xd19c, -+ 0x0120, 0x2011, 0x0008, 0x080c, 0x2a44, 0x0006, 0x0036, 0x0156, -+ 0x0000, 0x2001, 0x19a7, 0x2004, 0x9005, 0x1518, 0x080c, 0x29d8, -+ 0x1148, 0x2001, 0x0001, 0x080c, 0x2945, 0x2001, 0x0001, 0x080c, -+ 0x2928, 0x00b8, 0x080c, 0x29e0, 0x1138, 0x9006, 0x080c, 0x2945, -+ 0x9006, 0x080c, 0x2928, 0x0068, 0x080c, 0x29e8, 0x1d50, 0x2001, -+ 0x1998, 0x2004, 0xd0fc, 0x0108, 0x0020, 0x080c, 0x273f, 0x0804, -+ 0x0cc1, 0x080c, 0x2a67, 0x080c, 0x2aab, 0x20a9, 0x003a, 0x1d04, -+ 0x0c17, 0x080c, 0x872a, 0x1f04, 0x0c17, 0x080c, 0x74fa, 0x0148, -+ 0x080c, 0x750c, 0x1118, 0x080c, 0x77fc, 0x0050, 0x080c, 0x74f1, -+ 0x0dd0, 0x080c, 0x77f7, 0x080c, 0x77ed, 0x080c, 0x741a, 0x0020, -+ 0x2009, 0x00f8, 0x080c, 0x5fa5, 0x7850, 0xc0e5, 0x7852, 0x080c, -+ 0x74e9, 0x0120, 0x7843, 0x0090, 0x7843, 0x0010, 0x2021, 0xe678, -+ 0x2019, 0xea60, 0x0d0c, 0x872a, 0x7820, 0xd09c, 0x15a0, 0x080c, -+ 0x74e9, 0x0904, 0x0ca3, 0x7824, 0xd0ac, 0x1904, 0x0cc6, 0x080c, -+ 0x750c, 0x1548, 0x0046, 0x2021, 0x0320, 0x8421, 0x1df0, 0x004e, -+ 0x2011, 0x1800, 0x080c, 0x2a44, 0x080c, 0x29f0, 0x7824, 0x9084, -+ 0x1800, 0x1168, 0x9484, 0x0fff, 0x1140, 0x2001, 0x1810, 0x2004, -+ 0x9084, 0x9000, 0x0110, 0x080c, 0x0ce9, 0x8421, 0x1160, 0x1d04, -+ 0x0c73, 0x080c, 0x872a, 0x080c, 0x77f7, 0x080c, 0x77ed, 0x7003, -+ 0x0001, 0x0804, 0x0cc6, 0x8319, 0x1928, 0x2001, 0x1810, 0x2004, -+ 0x9084, 0x9000, 0x0110, 0x080c, 0x0ce9, 0x1d04, 0x0c89, 0x080c, -+ 0x872a, 0x2009, 0x199b, 0x2104, 0x9005, 0x0118, 0x8001, 0x200a, -+ 0x1188, 0x200b, 0x000a, 0x2011, 0x0048, 0x080c, 0x2a44, 0x20a9, -+ 0x0002, 0x080c, 0x29d1, 0x7924, 0x080c, 0x29f0, 0xd19c, 0x0110, -+ 0x080c, 0x2916, 0x00f0, 0x080c, 0x74fa, 0x1140, 0x94a2, 0x03e8, -+ 0x1128, 0x080c, 0x74bd, 0x7003, 0x0001, 0x00c0, 0x2011, 0x1800, -+ 0x080c, 0x2a44, 0x080c, 0x29f0, 0x7824, 0x080c, 0x7503, 0x0110, -+ 0xd0ac, 0x1160, 0x9084, 0x1800, 0x0904, 0x0c7b, 0x7003, 0x0001, -+ 0x0028, 0x2001, 0x0001, 0x080c, 0x25a0, 0x00a0, 0x7850, 0xc0e4, -+ 0x7852, 0x2009, 0x180c, 0x210c, 0xd19c, 0x1120, 0x7904, 0x918d, -+ 0x0002, 0x7906, 0x2011, 0x0048, 0x080c, 0x2a44, 0x7828, 0x9085, -+ 0x0028, 0x782a, 0x2001, 0x19a7, 0x2003, 0x0000, 0x9006, 0x78f2, -+ 0x015e, 0x003e, 0x000e, 0x012e, 0x00fe, 0x004e, 0x002e, 0x001e, -+ 0x0005, 0x0006, 0x0016, 0x0026, 0x0036, 0x0046, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x0071, 0x0d0c, 0x872a, 0x015e, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x004e, 0x003e, 0x002e, -+ 0x001e, 0x000e, 0x0005, 0x00e6, 0x2071, 0x189e, 0x7004, 0x9086, -+ 0x0001, 0x1110, 0x080c, 0x349b, 0x00ee, 0x0005, 0x0005, 0x2a70, -+ 0x2061, 0x19ab, 0x2063, 0x0003, 0x6007, 0x0002, 0x600b, 0x001c, -+ 0x600f, 0x0137, 0x2001, 0x197c, 0x900e, 0x2102, 0x7196, 0x2001, -+ 0x0100, 0x2004, 0x9082, 0x0002, 0x0218, 0x705f, 0xffff, 0x0008, -+ 0x715e, 0x7067, 0xffff, 0x717e, 0x7182, 0x080c, 0xcc9f, 0x70ef, -+ 0x00c0, 0x2061, 0x196c, 0x6003, 0x0909, 0x6106, 0x600b, 0x8800, -+ 0x600f, 0x0200, 0x6013, 0x00ff, 0x6017, 0x001f, 0x611a, 0x601f, -+ 0x07d0, 0x2061, 0x1974, 0x6003, 0x8000, 0x6106, 0x610a, 0x600f, -+ 0x0200, 0x6013, 0x00ff, 0x6116, 0x601b, 0x0001, 0x611e, 0x2061, -+ 0x1989, 0x6003, 0x514c, 0x6007, 0x4f47, 0x600b, 0x4943, 0x600f, -+ 0x2020, 0x2001, 0x182c, 0x2102, 0x0005, 0x9016, 0x080c, 0x6625, -+ 0x1178, 0xb804, 0x90c4, 0x00ff, 0x98c6, 0x0006, 0x0128, 0x90c4, -+ 0xff00, 0x98c6, 0x0600, 0x1120, 0x9186, 0x0080, 0x0108, 0x8210, -+ 0x8108, 0x9186, 0x0800, 0x1d50, 0x2208, 0x0005, 0x2091, 0x8000, -+ 0x2079, 0x0000, 0x000e, 0x00f6, 0x0010, 0x2091, 0x8000, 0x0e04, -+ 0x0d7f, 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, 0x1b24, 0x7a08, -+ 0x226a, 0x2069, 0x1b25, 0x7a18, 0x226a, 0x8d68, 0x7a1c, 0x226a, -+ 0x782c, 0x2019, 0x1b32, 0x201a, 0x2019, 0x1b35, 0x9016, 0x7808, -+ 0xd09c, 0x0168, 0x7820, 0x201a, 0x8210, 0x8318, 0x9386, 0x1b4e, -+ 0x0108, 0x0ca8, 0x7808, 0xd09c, 0x0110, 0x2011, 0xdead, 0x2019, -+ 0x1b33, 0x782c, 0x201a, 0x8318, 0x221a, 0x7803, 0x0000, 0x2069, -+ 0x1a7a, 0x901e, 0x20a9, 0x0020, 0x7b26, 0x7a28, 0x226a, 0x8d68, -+ 0x8318, 0x1f04, 0x0dcc, 0x0491, 0x002e, 0x003e, 0x00de, 0x015e, -+ 0x2079, 0x1800, 0x7803, 0x0005, 0x2091, 0x4080, 0x2001, 0x0089, -+ 0x2004, 0xd084, 0x0180, 0x2001, 0x1a22, 0x2004, 0x9005, 0x0128, -+ 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, -+ 0x0002, 0x2003, 0x1001, 0x080c, 0x56e9, 0x1170, 0x080c, 0x0f13, -+ 0x0110, 0x080c, 0x0e66, 0x080c, 0x56e9, 0x1130, 0x2071, 0x1800, -+ 0x2011, 0x8000, 0x080c, 0x0f27, 0x0c70, 0x0005, 0x2001, 0x0382, -+ 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1120, 0x2001, 0x0015, -+ 0x080c, 0xa887, 0x2079, 0x0380, 0x2069, 0x1b04, 0x7818, 0x6802, -+ 0x781c, 0x6806, 0x7840, 0x680a, 0x7844, 0x680e, 0x782c, 0x6812, -+ 0x2019, 0x1b0f, 0x9016, 0x7808, 0xd09c, 0x0150, 0x7820, 0x201a, -+ 0x8210, 0x8318, 0x8210, 0x9282, 0x0011, 0x0ea8, 0x2011, 0xdead, -+ 0x6a2a, 0x7830, 0x681a, 0x7834, 0x681e, 0x7838, 0x6822, 0x783c, -+ 0x6826, 0x7803, 0x0000, 0x2069, 0x1ac4, 0x901e, 0x20a9, 0x0020, -+ 0x7b26, 0x7828, 0x206a, 0x8d68, 0x8318, 0x1f04, 0x0e40, 0x2069, -+ 0x1ae4, 0x2019, 0x00b0, 0x20a9, 0x0020, 0x7b26, 0x7828, 0x206a, -+ 0x8d68, 0x8318, 0x1f04, 0x0e4d, 0x0005, 0x918c, 0x03ff, 0x2001, -+ 0x0003, 0x2004, 0x9084, 0x0600, 0x1118, 0x918d, 0x6c00, 0x0010, -+ 0x918d, 0x6400, 0x2001, 0x017f, 0x2102, 0x0005, 0x0026, 0x0126, -+ 0x2011, 0x0080, 0x080c, 0x0f05, 0x20a9, 0x0900, 0x080c, 0x0f3b, -+ 0x2011, 0x0040, 0x080c, 0x0f05, 0x20a9, 0x0900, 0x080c, 0x0f3b, -+ 0x0c78, 0x0026, 0x080c, 0x0f13, 0x1188, 0x2011, 0x010e, 0x2214, -+ 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0x0947, 0x0010, -+ 0x2011, 0x1b47, 0x080c, 0x0f27, 0x002e, 0x0005, 0x2011, 0x010e, -+ 0x2214, 0x9294, 0x0007, 0x9296, 0x0007, 0x0118, 0x2011, 0xa880, -+ 0x0010, 0x2011, 0x6840, 0xd0e4, 0x70f3, 0x0000, 0x1128, 0x70f3, -+ 0x0fa0, 0x080c, 0x0f18, 0x002e, 0x0005, 0x0026, 0x080c, 0x0f13, -+ 0x0148, 0xd0a4, 0x1138, 0x2011, 0xcdd5, 0x0010, 0x2011, 0x0080, -+ 0x080c, 0x0f18, 0x002e, 0x0005, 0x0026, 0x70f3, 0x0000, 0x080c, -+ 0x0f13, 0x1130, 0x2011, 0x8040, 0x080c, 0x0f27, 0x002e, 0x0005, -+ 0x080c, 0x29e8, 0x1118, 0x2011, 0xcdc5, 0x0010, 0x2011, 0xcac2, -+ 0x080c, 0x0f18, 0x002e, 0x0005, 0x00e6, 0x0016, 0x0006, 0x2071, -+ 0x1800, 0xd0b4, 0x70ec, 0x71e8, 0x1118, 0xc0e4, 0xc1f4, 0x0050, -+ 0x0006, 0x3b00, 0x9084, 0xff3e, 0x20d8, 0x000e, 0x70f3, 0x0000, -+ 0xc0e5, 0xc1f5, 0x0099, 0x000e, 0x001e, 0x00ee, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0xd0e4, 0x70ec, 0x1110, 0xc0dc, 0x0008, 0xc0dd, -+ 0x0016, 0x71e8, 0x0019, 0x001e, 0x00ee, 0x0005, 0x70ee, 0x71ea, -+ 0x7000, 0x9084, 0x0007, 0x000b, 0x0005, 0x0ecb, 0x0ea5, 0x0ea5, -+ 0x0e79, 0x0eb4, 0x0ea5, 0x0ea5, 0x0eb4, 0xc284, 0x0016, 0x3b08, -+ 0x3a00, 0x9104, 0x918d, 0x00c1, 0x21d8, 0x9084, 0xff3e, 0x9205, -+ 0x20d0, 0x001e, 0x0005, 0x2001, 0x183b, 0x2004, 0xd0dc, 0x0005, -+ 0x9e86, 0x1800, 0x190c, 0x0d7d, 0x70ec, 0xd0e4, 0x0108, 0xc2e5, -+ 0x72ee, 0xd0e4, 0x1118, 0x9294, 0x00c1, 0x08f9, 0x0005, 0x9e86, -+ 0x1800, 0x190c, 0x0d7d, 0x70e8, 0xd0f4, 0x0108, 0xc2f5, 0x72ea, -+ 0xd0f4, 0x1140, 0x9284, 0x8000, 0x8005, 0xc284, 0x9215, 0x9294, -+ 0x00c1, 0x0861, 0x0005, 0x1d04, 0x0f3b, 0x2091, 0x6000, 0x1f04, -+ 0x0f3b, 0x0005, 0x890e, 0x810e, 0x810f, 0x9194, 0x003f, 0x918c, -+ 0xffc0, 0x0005, 0x0006, 0x2200, 0x914d, 0x894f, 0x894d, 0x894d, -+ 0x000e, 0x0005, 0x01d6, 0x0146, 0x0036, 0x0096, 0x2061, 0x188d, -+ 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, 0x189d, 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, 0x0f42, -+ 0x2100, 0x9300, 0x2098, 0x22e0, 0x009e, 0x002e, 0x001e, 0x0036, -+ 0x3518, 0x20a9, 0x0001, 0x4002, 0x8007, 0x4004, 0x8319, 0x1dd8, -+ 0x003e, 0x0005, 0x20e9, 0x0001, 0x71b8, 0x81ff, 0x11c0, 0x9006, -+ 0x2009, 0x0200, 0x20a9, 0x0002, 0x9298, 0x0018, 0x23a0, 0x4001, -+ 0x2009, 0x0700, 0x20a9, 0x0002, 0x9298, 0x0008, 0x23a0, 0x4001, -+ 0x707c, 0x8007, 0x7180, 0x810f, 0x20a9, 0x0002, 0x4001, 0x9298, -+ 0x000c, 0x23a0, 0x900e, 0x080c, 0x0d5d, 0x2001, 0x0000, 0x810f, -+ 0x20a9, 0x0002, 0x4001, 0x0005, 0x89ff, 0x0140, 0xa804, 0xa807, -+ 0x0000, 0x0006, 0x080c, 0x106c, 0x009e, 0x0cb0, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0x080c, 0x10e5, 0x090c, 0x0d7d, 0x00ee, 0x0005, -+ 0x0086, 0x00e6, 0x0006, 0x0026, 0x0036, 0x0126, 0x2091, 0x8000, -+ 0x00c9, 0x2071, 0x1800, 0x73c0, 0x702c, 0x9016, 0x9045, 0x0158, -+ 0x8210, 0x9906, 0x090c, 0x0d7d, 0x2300, 0x9202, 0x0120, 0x1a0c, -+ 0x0d7d, 0xa000, 0x0c98, 0x012e, 0x003e, 0x002e, 0x000e, 0x00ee, -+ 0x008e, 0x0005, 0x0086, 0x00e6, 0x0006, 0x0126, 0x2091, 0x8000, -+ 0x2071, 0x1910, 0x7010, 0x9005, 0x0140, 0x7018, 0x9045, 0x0128, -+ 0x9906, 0x090c, 0x0d7d, 0xa000, 0x0cc8, 0x012e, 0x000e, 0x00ee, -+ 0x008e, 0x0005, 0x00e6, 0x2071, 0x1800, 0x0126, 0x2091, 0x8000, -+ 0x70c0, 0x8001, 0x0270, 0x70c2, 0x702c, 0x2048, 0x9085, 0x0001, -+ 0xa800, 0x702e, 0xa803, 0x0000, 0xa807, 0x0000, 0x012e, 0x00ee, -+ 0x0005, 0x904e, 0x0cd8, 0x00e6, 0x0126, 0x2091, 0x8000, 0x2071, -+ 0x1800, 0x70c0, 0x90ca, 0x0020, 0x0268, 0x8001, 0x70c2, 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, 0x70c0, 0x8000, -+ 0x70c2, 0x080c, 0x8553, 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, 0x188d, 0x7000, -+ 0x9005, 0x11a0, 0x2001, 0x0558, 0xa802, 0x2048, 0x2009, 0x5600, -+ 0x8940, 0x2800, 0xa802, 0xa95e, 0xa863, 0x0001, 0x8420, 0x9886, -+ 0x0800, 0x0120, 0x2848, 0x9188, 0x0040, 0x0c90, 0x2071, 0x188d, -+ 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, 0x74be, 0x74c2, 0x0005, 0x00e6, 0x0016, 0x9984, -+ 0xfc00, 0x01e8, 0x908c, 0xf800, 0x1168, 0x9982, 0x0400, 0x02b8, -+ 0x9982, 0x0440, 0x0278, 0x9982, 0x0558, 0x0288, 0x9982, 0x0800, -+ 0x1270, 0x0040, 0x9982, 0x0800, 0x0250, 0x2071, 0x188d, 0x7010, -+ 0x9902, 0x1228, 0x9085, 0x0001, 0x001e, 0x00ee, 0x0005, 0x9006, -+ 0x0cd8, 0x00e6, 0x2071, 0x1a21, 0x7007, 0x0000, 0x9006, 0x701e, -+ 0x7022, 0x7002, 0x2071, 0x0000, 0x7010, 0x9085, 0x8044, 0x7012, -+ 0x2071, 0x0080, 0x9006, 0x20a9, 0x0040, 0x7022, 0x1f04, 0x111d, -+ 0x702b, 0x0020, 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, -+ 0xa06f, 0x0000, 0x2071, 0x1a21, 0x701c, 0x9088, 0x1a2b, 0x280a, -+ 0x8000, 0x9084, 0x003f, 0x701e, 0x7120, 0x9106, 0x090c, 0x0d7d, -+ 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x00a9, 0x00fe, -+ 0x00ee, 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x00e6, 0x2071, -+ 0x1a21, 0x7004, 0x9005, 0x1128, 0x00f6, 0x2079, 0x0080, 0x0021, -+ 0x00fe, 0x00ee, 0x012e, 0x0005, 0x7004, 0x9086, 0x0000, 0x1110, -+ 0x7007, 0x0006, 0x7000, 0x0002, 0x1166, 0x12e9, 0x1164, 0x1164, -+ 0x12dd, 0x12dd, 0x12dd, 0x12dd, 0x080c, 0x0d7d, 0x701c, 0x7120, -+ 0x9106, 0x1148, 0x792c, 0x9184, 0x0001, 0x1120, 0xd1fc, 0x1110, -+ 0x7007, 0x0000, 0x0005, 0x0096, 0x9180, 0x1a2b, 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, 0x1a21, -+ 0x2104, 0xc095, 0x200a, 0x080c, 0x1143, 0x0005, 0x0016, 0x00e6, -+ 0x2071, 0x1a21, 0x00f6, 0x2079, 0x0080, 0x792c, 0xd1bc, 0x190c, -+ 0x0d76, 0x782b, 0x0002, 0xd1fc, 0x0120, 0x918c, 0x0700, 0x7004, -+ 0x0023, 0x00fe, 0x00ee, 0x001e, 0x0005, 0x1154, 0x11fc, 0x1230, -+ 0x1308, 0x0d7d, 0x1323, 0x0d7d, 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, 0x1199, 0x0005, 0x7008, 0x0096, -+ 0x2048, 0xa86f, 0x0100, 0x009e, 0x7007, 0x0000, 0x080c, 0x1154, -+ 0x0005, 0x7008, 0x0096, 0x2048, 0xa86f, 0x0200, 0x009e, 0x0ca0, -+ 0x918c, 0x0700, 0x1150, 0x700c, 0x9005, 0x0180, 0x7800, 0x7802, -+ 0x7804, 0x7806, 0x080c, 0x11ae, 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, 0x18b9, 0x2004, 0x9906, 0x1128, 0xa89c, -+ 0x080f, 0x00de, 0x009e, 0x00a0, 0x00de, 0x009e, 0x0096, 0x00d6, -+ 0x7008, 0x2048, 0x0081, 0x0150, 0xa89c, 0x0086, 0x2940, 0x080f, -+ 0x008e, 0x00de, 0x009e, 0x080c, 0x1143, 0x0005, 0x00de, 0x009e, -+ 0x080c, 0x1143, 0x0005, 0xa8a8, 0xd08c, 0x0005, 0x0096, 0xa0a0, -+ 0x904d, 0x090c, 0x0d7d, 0xa06c, 0x908e, 0x0100, 0x0130, 0xa87b, -+ 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, 0x080c, 0x6d74, 0xa09f, -+ 0x0000, 0xa0a3, 0x0000, 0x2848, 0x080c, 0x106c, 0x009e, 0x0005, -+ 0x00a6, 0xa0a0, 0x904d, 0x090c, 0x0d7d, 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, 0x1124, 0x00e8, 0xa97c, 0xa894, -+ 0x0016, 0x0006, 0x080c, 0x6d74, 0x000e, 0x001e, 0xd1fc, 0x1138, -+ 0xd1f4, 0x0128, 0x00c6, 0x2060, 0x080c, 0xabed, 0x00ce, 0x7008, -+ 0x2048, 0xa89f, 0x0000, 0xa8a3, 0x0000, 0x080c, 0x106c, 0x7007, -+ 0x0000, 0x080c, 0x1143, 0x00ae, 0x0005, 0x0126, 0x2091, 0x8000, -+ 0x782b, 0x1001, 0x7007, 0x0005, 0x7000, 0xc094, 0x7002, 0x012e, -+ 0x0005, 0x0096, 0x2001, 0x192e, 0x204c, 0xa87c, 0x7812, 0xa88c, -+ 0x7802, 0xa890, 0x7806, 0xa894, 0x780a, 0xa898, 0x780e, 0x782b, -+ 0x0020, 0x0126, 0x2091, 0x8000, 0x782b, 0x0041, 0x7007, 0x0003, -+ 0x7000, 0xc084, 0x7002, 0x2900, 0x700a, 0x012e, 0x009e, 0x0005, -+ 0x20e1, 0x0000, 0x2099, 0x0088, 0x782b, 0x0040, 0x0096, 0x2001, -+ 0x192e, 0x204c, 0xaa7c, 0x009e, 0x080c, 0x8c1b, 0x2009, 0x188c, -+ 0x2104, 0x9084, 0xfffc, 0x200a, 0x080c, 0x8a8e, 0x7007, 0x0000, -+ 0x080c, 0x1154, 0x0005, 0x7007, 0x0000, 0x080c, 0x1154, 0x0005, -+ 0x0126, 0x2091, 0x2200, 0x2079, 0x0300, 0x2071, 0x1a6b, 0x7003, -+ 0x0000, 0x78bf, 0x00f6, 0x0041, 0x7807, 0x0007, 0x7803, 0x0000, -+ 0x7803, 0x0001, 0x012e, 0x0005, 0x00c6, 0x7803, 0x0000, 0x2001, -+ 0x0165, 0x2003, 0x4198, 0x7808, 0xd09c, 0x0118, 0x7820, 0x04e9, -+ 0x0cd0, 0x2001, 0x1a6c, 0x2003, 0x0000, 0x78ab, 0x0004, 0x78ac, -+ 0xd0ac, 0x1de8, 0x78ab, 0x0002, 0x7807, 0x0007, 0x7827, 0x0030, -+ 0x782b, 0x0400, 0x7827, 0x0031, 0x782b, 0x1a7a, 0x781f, 0xff00, -+ 0x781b, 0xff00, 0x2001, 0x0200, 0x2004, 0xd0dc, 0x0110, 0x781f, -+ 0x0303, 0x2061, 0x1a7a, 0x602f, 0x1ddc, 0x2001, 0x181a, 0x2004, -+ 0x9082, 0x1ddc, 0x6032, 0x603b, 0x1e55, 0x602b, 0x1aba, 0x6007, -+ 0x1a9a, 0x2061, 0x1a9a, 0x60af, 0x193c, 0x2001, 0x1927, 0x2004, -+ 0x60ba, 0x783f, 0x3374, 0x00ce, 0x0005, 0x9086, 0x000d, 0x11d0, -+ 0x7808, 0xd09c, 0x01b8, 0x7820, 0x0026, 0x2010, 0x080c, 0xc826, -+ 0x0180, 0x2260, 0x6000, 0x9086, 0x0004, 0x1158, 0x0016, 0x6120, -+ 0x9186, 0x0009, 0x0108, 0x0020, 0x2009, 0x004c, 0x080c, 0xac8c, -+ 0x001e, 0x002e, 0x0005, 0x0126, 0x2091, 0x2200, 0x7908, 0x9184, -+ 0x0070, 0x190c, 0x0d76, 0xd19c, 0x05a0, 0x7820, 0x908c, 0xf000, -+ 0x0540, 0x2060, 0x6020, 0x9086, 0x0003, 0x1550, 0x6000, 0x9086, -+ 0x0004, 0x1530, 0x6114, 0x2148, 0xa876, 0xa87a, 0xa867, 0x0103, -+ 0x080c, 0x6b96, 0x00b6, 0x6010, 0x2058, 0xba3c, 0x8211, 0x0208, -+ 0xba3e, 0xb8d0, 0x9005, 0x190c, 0x6750, 0x00be, 0x6044, 0xd0fc, -+ 0x190c, 0xa8bf, 0x080c, 0xac16, 0x7808, 0xd09c, 0x19b0, 0x012e, -+ 0x0005, 0x908a, 0x0024, 0x1a0c, 0x0d7d, 0x002b, 0x012e, 0x0005, -+ 0x04b0, 0x012e, 0x0005, 0x1407, 0x142d, 0x145d, 0x1462, 0x1466, -+ 0x146b, 0x1493, 0x1497, 0x14a5, 0x14a9, 0x1407, 0x1574, 0x1578, -+ 0x15dd, 0x15e4, 0x1407, 0x15e5, 0x15e6, 0x15f1, 0x15f8, 0x1407, -+ 0x1407, 0x1407, 0x1407, 0x1407, 0x1407, 0x1407, 0x146d, 0x1407, -+ 0x1435, 0x145a, 0x1421, 0x1407, 0x1441, 0x140b, 0x1409, 0x080c, -+ 0x0d7d, 0x080c, 0x0d76, 0x080c, 0x1603, 0x2009, 0x1a79, 0x2104, -+ 0x8000, 0x200a, 0x080c, 0x7f99, 0x080c, 0x1ab5, 0x0005, 0x6044, -+ 0xd0fc, 0x190c, 0xa8bf, 0x2009, 0x0055, 0x080c, 0xac8c, 0x012e, -+ 0x0005, 0x080c, 0x1603, 0x2060, 0x6044, 0xd0fc, 0x190c, 0xa8bf, -+ 0x2009, 0x0055, 0x080c, 0xac8c, 0x0005, 0x2009, 0x0048, 0x080c, -+ 0x1603, 0x2060, 0x080c, 0xac8c, 0x0005, 0x2009, 0x0054, 0x080c, -+ 0x1603, 0x2060, 0x6044, 0xd0fc, 0x190c, 0xa8bf, 0x080c, 0xac8c, -+ 0x0005, 0x080c, 0x1603, 0x2060, 0x0056, 0x0066, 0x080c, 0x1603, -+ 0x2028, 0x080c, 0x1603, 0x2030, 0x0036, 0x0046, 0x2021, 0x0000, -+ 0x2418, 0x2009, 0x0056, 0x080c, 0xac8c, 0x004e, 0x003e, 0x006e, -+ 0x005e, 0x0005, 0x080c, 0x1603, 0x0005, 0x7004, 0xc085, 0xc0b5, -+ 0x7006, 0x0005, 0x7004, 0xc085, 0x7006, 0x0005, 0x080c, 0x1603, -+ 0x080c, 0x16c7, 0x0005, 0x080c, 0x0d7d, 0x080c, 0x1603, 0x2060, -+ 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, 0x2009, 0x0048, -+ 0x080c, 0xac8c, 0x2001, 0x015d, 0x2003, 0x0000, 0x2009, 0x03e8, -+ 0x8109, 0x0160, 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x2001, -+ 0x0218, 0x2004, 0xd0ec, 0x1110, 0x080c, 0x1608, 0x2001, 0x0307, -+ 0x2003, 0x8000, 0x0005, 0x7004, 0xc095, 0x7006, 0x0005, 0x080c, -+ 0x1603, 0x2060, 0x6014, 0x0096, 0x2048, 0xa83b, 0xffff, 0x009e, -+ 0x2009, 0x0048, 0x080c, 0xac8c, 0x0005, 0x080c, 0x1603, 0x080c, -+ 0x0d7d, 0x080c, 0x1603, 0x080c, 0x155f, 0x7827, 0x0018, 0x79ac, -+ 0xd1dc, 0x0904, 0x1512, 0x7827, 0x0015, 0x7828, 0x782b, 0x0000, -+ 0x9065, 0x0140, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, -+ 0x0804, 0x1518, 0x7004, 0x9005, 0x01c8, 0x1188, 0x78ab, 0x0004, -+ 0x7827, 0x0018, 0x782b, 0x0000, 0xd1bc, 0x090c, 0x0d7d, 0x2001, -+ 0x020d, 0x2003, 0x0050, 0x2003, 0x0020, 0x0804, 0x1544, 0x78ab, -+ 0x0004, 0x7803, 0x0001, 0x080c, 0x1578, 0x0005, 0x7827, 0x0018, -+ 0xa001, 0x7828, 0x7827, 0x0011, 0xa001, 0x7928, 0x9106, 0x0110, -+ 0x79ac, 0x08e0, 0x00e6, 0x2071, 0x0200, 0x702c, 0xd0c4, 0x0140, -+ 0x00ee, 0x080c, 0x1ab5, 0x080c, 0x133c, 0x7803, 0x0001, 0x0005, -+ 0x7037, 0x0001, 0xa001, 0x7150, 0x00ee, 0x918c, 0xff00, 0x9186, -+ 0x0500, 0x0110, 0x79ac, 0x0810, 0x7004, 0xc09d, 0x7006, 0x78ab, -+ 0x0004, 0x7803, 0x0001, 0x080c, 0x1578, 0x2001, 0x020d, 0x2003, -+ 0x0020, 0x0005, 0x7828, 0x782b, 0x0000, 0x9065, 0x090c, 0x0d7d, -+ 0x6014, 0x2048, 0x78ab, 0x0004, 0x918c, 0x0700, 0x0198, 0x080c, -+ 0x7f99, 0x080c, 0x1ab5, 0x080c, 0xc838, 0x0158, 0xa9ac, 0xa936, -+ 0xa9b0, 0xa93a, 0xa83f, 0xffff, 0xa843, 0xffff, 0xa880, 0xc0bd, -+ 0xa882, 0x0005, 0x6020, 0x9086, 0x0009, 0x1128, 0x2009, 0x004c, -+ 0x080c, 0xac8c, 0x0048, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0bc, 0x6024, 0x190c, 0xcc34, 0x2029, 0x00c8, 0x8529, 0x0128, -+ 0x2001, 0x0201, 0x2004, 0x9005, 0x0dc8, 0x7dbc, 0x080c, 0xe6da, -+ 0xd5a4, 0x1118, 0x080c, 0x1608, 0x0005, 0x080c, 0x7f99, 0x080c, -+ 0x1ab5, 0x0005, 0x781f, 0x0300, 0x7803, 0x0001, 0x0005, 0x0016, -+ 0x0066, 0x0076, 0x00f6, 0x2079, 0x0300, 0x7908, 0x918c, 0x0007, -+ 0x9186, 0x0003, 0x0120, 0x2001, 0x0016, 0x080c, 0x1679, 0x00fe, -+ 0x007e, 0x006e, 0x001e, 0x0005, 0x7004, 0xc09d, 0x7006, 0x0005, -+ 0x7104, 0x9184, 0x0004, 0x190c, 0x0d7d, 0xd184, 0x1189, 0xd19c, -+ 0x0158, 0xc19c, 0x7106, 0x2001, 0x020d, 0x2003, 0x0050, 0x2003, -+ 0x0020, 0x080c, 0x1608, 0x0005, 0x81ff, 0x190c, 0x0d7d, 0x0005, -+ 0xc184, 0xd1b4, 0xc1b4, 0x7106, 0x0016, 0x00e6, 0x15f0, 0x2071, -+ 0x0200, 0x080c, 0x16b4, 0x05c8, 0x6014, 0x9005, 0x05b0, 0x0096, -+ 0x2048, 0xa864, 0x009e, 0x9084, 0x00ff, 0x908e, 0x0029, 0x0160, -+ 0x908e, 0x0048, 0x1550, 0x601c, 0xd084, 0x11e0, 0x00f6, 0x2c78, -+ 0x080c, 0x1731, 0x00fe, 0x00b0, 0x00f6, 0x2c78, 0x080c, 0x18b8, -+ 0x00fe, 0x2009, 0x01f4, 0x8109, 0x0168, 0x2001, 0x0201, 0x2004, -+ 0x9005, 0x0dc8, 0x2001, 0x0218, 0x2004, 0xd0ec, 0x1118, 0x080c, -+ 0x1608, 0x0040, 0x2001, 0x020d, 0x2003, 0x0020, 0x080c, 0x133c, -+ 0x7803, 0x0001, 0x00ee, 0x001e, 0x0005, 0x2001, 0x020d, 0x2003, -+ 0x0050, 0x2003, 0x0020, 0x0461, 0x0ca8, 0x0429, 0x2060, 0x2009, -+ 0x0053, 0x080c, 0xac8c, 0x0005, 0x0005, 0x0005, 0x00e1, 0x2008, -+ 0x00d1, 0x0006, 0x7004, 0xc09d, 0x7006, 0x000e, 0x080c, 0x8f78, -+ 0x0005, 0x0089, 0x9005, 0x0118, 0x080c, 0x8b7b, 0x0cd0, 0x0005, -+ 0x2001, 0x0036, 0x2009, 0x1820, 0x210c, 0x2011, 0x181f, 0x2214, -+ 0x080c, 0x1679, 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x0005, -+ 0x080c, 0x155f, 0x00d6, 0x2069, 0x0200, 0x2009, 0x01f4, 0x8109, -+ 0x0510, 0x6804, 0x9005, 0x0dd8, 0x2001, 0x015d, 0x2003, 0x0000, -+ 0x79bc, 0xd1a4, 0x1528, 0x79b8, 0x918c, 0x0fff, 0x0180, 0x9182, -+ 0x0841, 0x1268, 0x9188, 0x0007, 0x918c, 0x0ff8, 0x810c, 0x810c, -+ 0x810c, 0x080c, 0x166b, 0x6827, 0x0001, 0x8109, 0x1dd0, 0x04d9, -+ 0x6827, 0x0002, 0x04c1, 0x6804, 0x9005, 0x1130, 0x682c, 0xd0e4, -+ 0x1500, 0x6804, 0x9005, 0x0de8, 0x79b8, 0xd1ec, 0x1130, 0x08c0, -+ 0x080c, 0x7f99, 0x080c, 0x1ab5, 0x0090, 0x7827, 0x0015, 0x782b, -+ 0x0000, 0x7827, 0x0018, 0x782b, 0x0000, 0x2001, 0x020d, 0x2003, -+ 0x0020, 0x2001, 0x0307, 0x2003, 0x0300, 0x7803, 0x0001, 0x00de, -+ 0x0005, 0x682c, 0x9084, 0x5400, 0x9086, 0x5400, 0x0d30, 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, 0x13a3, 0x00ce, 0x002e, 0x001e, -+ 0x000e, 0x0006, 0x7832, 0x7936, 0x7a3a, 0x781b, 0x8080, 0x0059, -+ 0x1118, 0x000e, 0x00fe, 0x0005, 0x000e, 0x792c, 0x3900, 0x8000, -+ 0x2004, 0x080c, 0x0d7d, 0x2009, 0xff00, 0x8109, 0x0120, 0x7818, -+ 0xd0bc, 0x1dd8, 0x0005, 0x9085, 0x0001, 0x0005, 0x7832, 0x7936, -+ 0x7a3a, 0x781b, 0x8080, 0x0c79, 0x1108, 0x0005, 0x792c, 0x3900, -+ 0x8000, 0x2004, 0x080c, 0x0d7d, 0x7037, 0x0001, 0x7150, 0x7037, -+ 0x0002, 0x7050, 0x2060, 0xd1bc, 0x1110, 0x7054, 0x2060, 0x918c, -+ 0xff00, 0x9186, 0x0500, 0x0110, 0x9085, 0x0001, 0x0005, 0x00e6, -+ 0x0016, 0x2071, 0x0200, 0x0c41, 0x6124, 0xd1dc, 0x01f8, 0x701c, -+ 0xd08c, 0x0904, 0x1726, 0x7017, 0x0000, 0x2001, 0x0264, 0x2004, -+ 0xd0bc, 0x0904, 0x1726, 0x2001, 0x0268, 0x00c6, 0x2064, 0x6104, -+ 0x6038, 0x00ce, 0x918e, 0x0039, 0x1904, 0x1726, 0x9c06, 0x15f0, -+ 0x0126, 0x2091, 0x2600, 0x080c, 0x7ef1, 0x012e, 0x7358, 0x745c, -+ 0x6014, 0x905d, 0x0598, 0x2b48, 0x6010, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0bc, 0x190c, 0xcc0f, 0xab42, 0xac3e, 0x2001, 0x1869, -+ 0x2004, 0xd0b4, 0x1170, 0x601c, 0xd0e4, 0x1158, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1120, 0xa83b, 0x7fff, 0xa837, -+ 0xffff, 0x080c, 0x1e75, 0x1190, 0x080c, 0x1913, 0x2a00, 0xa816, -+ 0x0130, 0x2800, 0xa80e, 0x2c05, 0xa80a, 0x2c00, 0xa812, 0x7037, -+ 0x0020, 0x781f, 0x0300, 0x001e, 0x00ee, 0x0005, 0x7037, 0x0050, -+ 0x7037, 0x0020, 0x001e, 0x00ee, 0x080c, 0x1608, 0x0005, 0x080c, -+ 0x0d7d, 0x2cf0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, -+ 0x2048, 0x2940, 0x903e, 0x2730, 0xa864, 0x2068, 0xa81a, 0x9d84, -+ 0x000f, 0x9088, 0x1e55, 0x2165, 0x0002, 0x175c, 0x17ca, 0x175c, -+ 0x175c, 0x1760, 0x17ab, 0x175c, 0x1780, 0x1755, 0x17c1, 0x175c, -+ 0x175c, 0x1765, 0x18b6, 0x1794, 0x178a, 0xa964, 0x918c, 0x00ff, -+ 0x918e, 0x0048, 0x0904, 0x17c1, 0x9085, 0x0001, 0x0804, 0x18ad, -+ 0xa87c, 0xd0ac, 0x0dc8, 0x0804, 0x17d1, 0xa87c, 0xd0ac, 0x0da0, -+ 0x0804, 0x183c, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0xaab2, -+ 0xaa3e, 0xaa42, 0x3e00, 0x9080, 0x0008, 0x2004, 0x9080, 0x9141, -+ 0x2005, 0x9005, 0x090c, 0x0d7d, 0x2004, 0xa8ae, 0x0804, 0x1895, -+ 0xa87c, 0xd0bc, 0x09c8, 0xa890, 0xa842, 0xa88c, 0xa83e, 0xa888, -+ 0x0804, 0x17d1, 0xa87c, 0xd0bc, 0x0978, 0xa890, 0xa842, 0xa88c, -+ 0xa83e, 0xa888, 0x0804, 0x183c, 0xa87c, 0xd0bc, 0x0928, 0xa890, -+ 0xa842, 0xa88c, 0xa83e, 0xa804, 0x9045, 0x090c, 0x0d7d, 0xa164, -+ 0xa91a, 0x91ec, 0x000f, 0x9d80, 0x1e55, 0x2065, 0xa888, 0xd19c, -+ 0x1904, 0x183c, 0x0430, 0xa87c, 0xd0ac, 0x0904, 0x175c, 0xa804, -+ 0x9045, 0x090c, 0x0d7d, 0xa164, 0xa91a, 0x91ec, 0x000f, 0x9d80, -+ 0x1e55, 0x2065, 0x9006, 0xa842, 0xa83e, 0xd19c, 0x1904, 0x183c, -+ 0x0080, 0xa87c, 0xd0ac, 0x0904, 0x175c, 0x9006, 0xa842, 0xa83e, -+ 0x0804, 0x183c, 0xa87c, 0xd0ac, 0x0904, 0x175c, 0x9006, 0xa842, -+ 0xa83e, 0x2c05, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, -+ 0x0002, 0x17f4, 0x17f4, 0x17f6, 0x17f4, 0x17f4, 0x17f4, 0x1800, -+ 0x17f4, 0x17f4, 0x17f4, 0x180a, 0x17f4, 0x17f4, 0x17f4, 0x1814, -+ 0x17f4, 0x17f4, 0x17f4, 0x181e, 0x17f4, 0x17f4, 0x17f4, 0x1828, -+ 0x17f4, 0x17f4, 0x17f4, 0x1832, 0x080c, 0x0d7d, 0xa574, 0xa478, -+ 0x9d86, 0x0024, 0x0904, 0x176a, 0xa37c, 0xa280, 0x0804, 0x1895, -+ 0xa584, 0xa488, 0x9d86, 0x0024, 0x0904, 0x176a, 0xa38c, 0xa290, -+ 0x0804, 0x1895, 0xa594, 0xa498, 0x9d86, 0x0024, 0x0904, 0x176a, -+ 0xa39c, 0xa2a0, 0x0804, 0x1895, 0xa5a4, 0xa4a8, 0x9d86, 0x0024, -+ 0x0904, 0x176a, 0xa3ac, 0xa2b0, 0x0804, 0x1895, 0xa5b4, 0xa4b8, -+ 0x9d86, 0x0024, 0x0904, 0x176a, 0xa3bc, 0xa2c0, 0x0804, 0x1895, -+ 0xa5c4, 0xa4c8, 0x9d86, 0x0024, 0x0904, 0x176a, 0xa3cc, 0xa2d0, -+ 0x0804, 0x1895, 0xa5d4, 0xa4d8, 0x9d86, 0x0024, 0x0904, 0x176a, -+ 0xa3dc, 0xa2e0, 0x0804, 0x1895, 0x2c05, 0x908a, 0x0034, 0x1a0c, -+ 0x0d7d, 0x9082, 0x001b, 0x0002, 0x185f, 0x185d, 0x185d, 0x185d, -+ 0x185d, 0x185d, 0x186a, 0x185d, 0x185d, 0x185d, 0x185d, 0x185d, -+ 0x1875, 0x185d, 0x185d, 0x185d, 0x185d, 0x185d, 0x1880, 0x185d, -+ 0x185d, 0x185d, 0x185d, 0x185d, 0x188b, 0x080c, 0x0d7d, 0xa56c, -+ 0xa470, 0xa774, 0xa678, 0x9d86, 0x002c, 0x0904, 0x176a, 0xa37c, -+ 0xa280, 0x0458, 0xa584, 0xa488, 0xa78c, 0xa690, 0x9d86, 0x002c, -+ 0x0904, 0x176a, 0xa394, 0xa298, 0x0400, 0xa59c, 0xa4a0, 0xa7a4, -+ 0xa6a8, 0x9d86, 0x002c, 0x0904, 0x176a, 0xa3ac, 0xa2b0, 0x00a8, -+ 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x002c, 0x0904, 0x176a, -+ 0xa3c4, 0xa2c8, 0x0050, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, -+ 0x002c, 0x0904, 0x176a, 0xa3dc, 0xa2e0, 0xab2e, 0xaa32, 0xad1e, -+ 0xac22, 0xaf26, 0xae2a, 0xa988, 0x8c60, 0x2c1d, 0xa8ac, 0xaab0, -+ 0xa836, 0xaa3a, 0x8109, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085, -+ 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, -+ 0x2800, 0xa80e, 0xab0a, 0x2c00, 0xa812, 0x0c78, 0x0804, 0x175c, -+ 0x2ff0, 0x0126, 0x2091, 0x2200, 0x00c6, 0x3e60, 0x6014, 0x2048, -+ 0x2940, 0xa80e, 0x2061, 0x1e50, 0xa813, 0x1e50, 0x2c05, 0xa80a, -+ 0xa964, 0xa91a, 0xa87c, 0xd0ac, 0x090c, 0x0d7d, 0x9006, 0xa842, -+ 0xa83e, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0xadcc, 0xacd0, -+ 0xafd4, 0xaed8, 0xabdc, 0xaae0, 0xab2e, 0xaa32, 0xad1e, 0xac22, -+ 0xaf26, 0xae2a, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0xa988, 0xa864, -+ 0x9084, 0x00ff, 0x9086, 0x0008, 0x1120, 0x8109, 0xa916, 0x0128, -+ 0x0078, 0x918a, 0x0002, 0xa916, 0x1158, 0x3e60, 0x601c, 0xc085, -+ 0x601e, 0xa87c, 0xc0dd, 0xa87e, 0x9006, 0x00ce, 0x012e, 0x0005, -+ 0xa804, 0x9045, 0x090c, 0x0d7d, 0xa80e, 0xa064, 0xa81a, 0x9084, -+ 0x000f, 0x9080, 0x1e55, 0x2015, 0x82ff, 0x090c, 0x0d7d, 0xaa12, -+ 0x2205, 0xa80a, 0x0c10, 0x903e, 0x2730, 0xa880, 0xd0fc, 0x1190, -+ 0x2d00, 0x0002, 0x1a3d, 0x196a, 0x196a, 0x1a3d, 0x196a, 0x1a37, -+ 0x1a3d, 0x196a, 0x19da, 0x19da, 0x19da, 0x1a3d, 0x19da, 0x1a3d, -+ 0x1a34, 0x19da, 0xc0fc, 0xa882, 0xab2c, 0xaa30, 0xad1c, 0xac20, -+ 0xdd9c, 0x0904, 0x1a3f, 0x2c05, 0x908a, 0x0034, 0x1a0c, 0x0d7d, -+ 0x9082, 0x001b, 0x0002, 0x1956, 0x1954, 0x1954, 0x1954, 0x1954, -+ 0x1954, 0x195a, 0x1954, 0x1954, 0x1954, 0x1954, 0x1954, 0x195e, -+ 0x1954, 0x1954, 0x1954, 0x1954, 0x1954, 0x1962, 0x1954, 0x1954, -+ 0x1954, 0x1954, 0x1954, 0x1966, 0x080c, 0x0d7d, 0xa774, 0xa678, -+ 0x0804, 0x1a3f, 0xa78c, 0xa690, 0x0804, 0x1a3f, 0xa7a4, 0xa6a8, -+ 0x0804, 0x1a3f, 0xa7bc, 0xa6c0, 0x0804, 0x1a3f, 0xa7d4, 0xa6d8, -+ 0x0804, 0x1a3f, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0x2c05, -+ 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1992, -+ 0x1992, 0x1994, 0x1992, 0x1992, 0x1992, 0x199e, 0x1992, 0x1992, -+ 0x1992, 0x19a8, 0x1992, 0x1992, 0x1992, 0x19b2, 0x1992, 0x1992, -+ 0x1992, 0x19bc, 0x1992, 0x1992, 0x1992, 0x19c6, 0x1992, 0x1992, -+ 0x1992, 0x19d0, 0x080c, 0x0d7d, 0xa574, 0xa478, 0x9d86, 0x0004, -+ 0x0904, 0x1a3f, 0xa37c, 0xa280, 0x0804, 0x1a3f, 0xa584, 0xa488, -+ 0x9d86, 0x0004, 0x0904, 0x1a3f, 0xa38c, 0xa290, 0x0804, 0x1a3f, -+ 0xa594, 0xa498, 0x9d86, 0x0004, 0x0904, 0x1a3f, 0xa39c, 0xa2a0, -+ 0x0804, 0x1a3f, 0xa5a4, 0xa4a8, 0x9d86, 0x0004, 0x0904, 0x1a3f, -+ 0xa3ac, 0xa2b0, 0x0804, 0x1a3f, 0xa5b4, 0xa4b8, 0x9d86, 0x0004, -+ 0x0904, 0x1a3f, 0xa3bc, 0xa2c0, 0x0804, 0x1a3f, 0xa5c4, 0xa4c8, -+ 0x9d86, 0x0004, 0x0904, 0x1a3f, 0xa3cc, 0xa2d0, 0x0804, 0x1a3f, -+ 0xa5d4, 0xa4d8, 0x9d86, 0x0004, 0x0904, 0x1a3f, 0xa3dc, 0xa2e0, -+ 0x0804, 0x1a3f, 0xa898, 0x901d, 0x1108, 0xab9c, 0x9016, 0x2c05, -+ 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1a02, -+ 0x1a00, 0x1a00, 0x1a00, 0x1a00, 0x1a00, 0x1a0c, 0x1a00, 0x1a00, -+ 0x1a00, 0x1a00, 0x1a00, 0x1a16, 0x1a00, 0x1a00, 0x1a00, 0x1a00, -+ 0x1a00, 0x1a20, 0x1a00, 0x1a00, 0x1a00, 0x1a00, 0x1a00, 0x1a2a, -+ 0x080c, 0x0d7d, 0xa56c, 0xa470, 0xa774, 0xa678, 0x9d86, 0x000c, -+ 0x05b0, 0xa37c, 0xa280, 0x0498, 0xa584, 0xa488, 0xa78c, 0xa690, -+ 0x9d86, 0x000c, 0x0560, 0xa394, 0xa298, 0x0448, 0xa59c, 0xa4a0, -+ 0xa7a4, 0xa6a8, 0x9d86, 0x000c, 0x0510, 0xa3ac, 0xa2b0, 0x00f8, -+ 0xa5b4, 0xa4b8, 0xa7bc, 0xa6c0, 0x9d86, 0x000c, 0x01c0, 0xa3c4, -+ 0xa2c8, 0x00a8, 0xa5cc, 0xa4d0, 0xa7d4, 0xa6d8, 0x9d86, 0x000c, -+ 0x0170, 0xa3dc, 0xa2e0, 0x0058, 0x9d86, 0x000e, 0x1130, 0x080c, -+ 0x1e2b, 0x1904, 0x1913, 0x900e, 0x0050, 0x080c, 0x0d7d, 0xab2e, -+ 0xaa32, 0xad1e, 0xac22, 0xaf26, 0xae2a, 0x080c, 0x1e2b, 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, -+ 0xac8c, 0x0005, 0x0126, 0x00c6, 0x2091, 0x2200, 0x00ce, 0x7908, -+ 0x918c, 0x0007, 0x9186, 0x0000, 0x05b0, 0x9186, 0x0003, 0x0598, -+ 0x6020, 0x6023, 0x0000, 0x0006, 0x2031, 0x0008, 0x00c6, 0x781f, -+ 0x0808, 0x7808, 0xd09c, 0x0120, 0x080c, 0x13a3, 0x8631, 0x1db8, -+ 0x00ce, 0x781f, 0x0800, 0x2031, 0x0168, 0x00c6, 0x7808, 0xd09c, -+ 0x190c, 0x13a3, 0x00ce, 0x2001, 0x0038, 0x080c, 0x1b42, 0x7930, -+ 0x9186, 0x0040, 0x0160, 0x9186, 0x0042, 0x190c, 0x0d7d, 0x2001, -+ 0x001e, 0x8001, 0x1df0, 0x8631, 0x1d40, 0x080c, 0x1b51, 0x000e, -+ 0x6022, 0x012e, 0x0005, 0x080c, 0x1b3e, 0x7827, 0x0015, 0x7828, -+ 0x9c06, 0x1db8, 0x782b, 0x0000, 0x0ca0, 0x00f6, 0x2079, 0x0300, -+ 0x7803, 0x0000, 0x78ab, 0x0004, 0x00fe, 0x080c, 0x74e9, 0x11b0, -+ 0x2001, 0x0138, 0x2003, 0x0000, 0x2001, 0x0160, 0x2003, 0x0000, -+ 0x2011, 0x012c, 0xa001, 0xa001, 0x8211, 0x1de0, 0x0081, 0x2001, -+ 0x0386, 0x2003, 0x2020, 0x080c, 0x758a, 0x0005, 0x0479, 0x0039, -+ 0x2001, 0x0160, 0x2502, 0x2001, 0x0138, 0x2202, 0x0005, 0x00e6, -+ 0x2071, 0x0200, 0x080c, 0x29fc, 0x2009, 0x003c, 0x080c, 0x21b0, -+ 0x2001, 0x015d, 0x2003, 0x0000, 0x7000, 0x9084, 0x003c, 0x1de0, -+ 0x080c, 0x8553, 0x70a0, 0x70a2, 0x7098, 0x709a, 0x709c, 0x709e, -+ 0x2001, 0x020d, 0x2003, 0x0020, 0x00f6, 0x2079, 0x0300, 0x080c, -+ 0x133c, 0x7803, 0x0001, 0x00fe, 0x00ee, 0x0005, 0x2001, 0x0138, -+ 0x2014, 0x2003, 0x0000, 0x2001, 0x0160, 0x202c, 0x2003, 0x0000, -+ 0x080c, 0x74e9, 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, 0x601c, 0xc084, -+ 0x601e, 0x0005, 0x2c08, 0x621c, 0x080c, 0x1679, 0x7930, 0x0005, -+ 0x2c08, 0x621c, 0x080c, 0x16a6, 0x7930, 0x0005, 0x8001, 0x1df0, -+ 0x0005, 0x2031, 0x0005, 0x781c, 0x9084, 0x0007, 0x0170, 0x2001, -+ 0x0038, 0x0c41, 0x9186, 0x0040, 0x0904, 0x1baf, 0x2001, 0x001e, -+ 0x0c69, 0x8631, 0x1d80, 0x080c, 0x0d7d, 0x781f, 0x0202, 0x2001, -+ 0x015d, 0x2003, 0x0000, 0x2001, 0x0b10, 0x0c01, 0x781c, 0xd084, -+ 0x0110, 0x0861, 0x04e0, 0x2001, 0x0030, 0x0891, 0x9186, 0x0040, -+ 0x0568, 0x781c, 0xd084, 0x1da8, 0x781f, 0x0101, 0x2001, 0x0014, -+ 0x0869, 0x2001, 0x0037, 0x0821, 0x9186, 0x0040, 0x0140, 0x2001, -+ 0x0030, 0x080c, 0x1b48, 0x9186, 0x0040, 0x190c, 0x0d7d, 0x00d6, -+ 0x2069, 0x0200, 0x692c, 0xd1f4, 0x1170, 0xd1c4, 0x0160, 0xd19c, -+ 0x0130, 0x6800, 0x9085, 0x1800, 0x6802, 0x00de, 0x0080, 0x6908, -+ 0x9184, 0x0007, 0x1db0, 0x00de, 0x781f, 0x0100, 0x791c, 0x9184, -+ 0x0007, 0x090c, 0x0d7d, 0xa001, 0xa001, 0x781f, 0x0200, 0x0005, -+ 0x0126, 0x2091, 0x2400, 0x2079, 0x0380, 0x2001, 0x19e7, 0x2070, -+ 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, -+ 0x2048, 0xa964, 0xa91a, 0x918c, 0x00ff, 0x9184, 0x000f, 0x0002, -+ 0x1be4, 0x1be4, 0x1be4, 0x1be6, 0x1be4, 0x1be4, 0x1be4, 0x1be4, -+ 0x1bd8, 0x1bee, 0x1be4, 0x1bea, 0x1be4, 0x1be4, 0x1be4, 0x1be4, -+ 0x9086, 0x0008, 0x1148, 0xa87c, 0xd0b4, 0x0904, 0x1d5e, 0x2011, -+ 0x1e50, 0x2205, 0xab88, 0x00a8, 0x080c, 0x0d7d, 0x9186, 0x0013, -+ 0x0128, 0x0cd0, 0x9186, 0x001b, 0x0108, 0x0cb0, 0xa87c, 0xd0b4, -+ 0x0904, 0x1d5e, 0x9184, 0x000f, 0x9080, 0x1e55, 0x2015, 0x2205, -+ 0xab88, 0x2908, 0xa80a, 0xa90e, 0xaa12, 0xab16, 0x9006, 0xa842, -+ 0xa83e, 0x012e, 0x0005, 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, -+ 0x6014, 0x2048, 0xa88c, 0xa990, 0xaaac, 0xabb0, 0xaa36, 0xab3a, -+ 0xa83e, 0xa942, 0xa846, 0xa94a, 0xa964, 0x918c, 0x00ff, 0x9186, -+ 0x001e, 0x0198, 0x2940, 0xa064, 0xa81a, 0x90ec, 0x000f, 0x9d80, -+ 0x1e55, 0x2065, 0x2c05, 0x2808, 0x2c10, 0xab88, 0xa80a, 0xa90e, -+ 0xaa12, 0xab16, 0x012e, 0x3e60, 0x0005, 0xa804, 0x2040, 0x0c58, -+ 0x2cf0, 0x0126, 0x2091, 0x2400, 0x3e60, 0x6014, 0x2048, 0xa97c, -+ 0x2950, 0xd1dc, 0x1904, 0x1d28, 0xc1dd, 0xa97e, 0x9006, 0xa842, -+ 0xa83e, 0xa988, 0x8109, 0xa916, 0xa964, 0xa91a, 0x9184, 0x000f, -+ 0x9088, 0x1e55, 0x2145, 0x0002, 0x1c5c, 0x1c6a, 0x1c5c, 0x1c5c, -+ 0x1c5c, 0x1c5e, 0x1c5c, 0x1c5c, 0x1cbf, 0x1cbf, 0x1c5c, 0x1c5c, -+ 0x1c5c, 0x1cbd, 0x1c5c, 0x1c5c, 0x080c, 0x0d7d, 0xa804, 0x2050, -+ 0xb164, 0xa91a, 0x9184, 0x000f, 0x9080, 0x1e55, 0x2045, 0xd19c, -+ 0x1904, 0x1cbf, 0x9036, 0x2638, 0x2805, 0x908a, 0x0036, 0x1a0c, -+ 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1c8f, 0x1c8f, 0x1c91, 0x1c8f, -+ 0x1c8f, 0x1c8f, 0x1c97, 0x1c8f, 0x1c8f, 0x1c8f, 0x1c9d, 0x1c8f, -+ 0x1c8f, 0x1c8f, 0x1ca3, 0x1c8f, 0x1c8f, 0x1c8f, 0x1ca9, 0x1c8f, -+ 0x1c8f, 0x1c8f, 0x1caf, 0x1c8f, 0x1c8f, 0x1c8f, 0x1cb5, 0x080c, -+ 0x0d7d, 0xb574, 0xb478, 0xb37c, 0xb280, 0x0804, 0x1d04, 0xb584, -+ 0xb488, 0xb38c, 0xb290, 0x0804, 0x1d04, 0xb594, 0xb498, 0xb39c, -+ 0xb2a0, 0x0804, 0x1d04, 0xb5a4, 0xb4a8, 0xb3ac, 0xb2b0, 0x0804, -+ 0x1d04, 0xb5b4, 0xb4b8, 0xb3bc, 0xb2c0, 0x0804, 0x1d04, 0xb5c4, -+ 0xb4c8, 0xb3cc, 0xb2d0, 0x0804, 0x1d04, 0xb5d4, 0xb4d8, 0xb3dc, -+ 0xb2e0, 0x0804, 0x1d04, 0x0804, 0x1d04, 0x080c, 0x0d7d, 0x2805, -+ 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1ce2, -+ 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce9, 0x1ce0, 0x1ce0, -+ 0x1ce0, 0x1ce0, 0x1ce0, 0x1cf0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, -+ 0x1ce0, 0x1cf7, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1ce0, 0x1cfe, -+ 0x080c, 0x0d7d, 0xb56c, 0xb470, 0xb774, 0xb678, 0xb37c, 0xb280, -+ 0x00d8, 0xb584, 0xb488, 0xb78c, 0xb690, 0xb394, 0xb298, 0x00a0, -+ 0xb59c, 0xb4a0, 0xb7a4, 0xb6a8, 0xb3ac, 0xb2b0, 0x0068, 0xb5b4, -+ 0xb4b8, 0xb7bc, 0xb6c0, 0xb3c4, 0xb2c8, 0x0030, 0xb5cc, 0xb4d0, -+ 0xb7d4, 0xb6d8, 0xb3dc, 0xb2e0, 0xab2e, 0xaa32, 0xad1e, 0xac22, -+ 0xaf26, 0xae2a, 0xa988, 0x8109, 0xa916, 0x1118, 0x9006, 0x012e, -+ 0x0005, 0x8840, 0x2805, 0x9005, 0x1168, 0xb004, 0x9005, 0x090c, -+ 0x0d7d, 0x2050, 0xb164, 0xa91a, 0x9184, 0x000f, 0x9080, 0x1e55, -+ 0x2045, 0x2805, 0x2810, 0x2a08, 0xa80a, 0xa90e, 0xaa12, 0x0c30, -+ 0x3e60, 0x6344, 0xd3fc, 0x190c, 0x0d7d, 0xa93c, 0xaa40, 0xa844, -+ 0x9106, 0x1118, 0xa848, 0x9206, 0x0508, 0x2958, 0xab48, 0xac44, -+ 0x2940, 0x080c, 0x1e75, 0x1998, 0x2850, 0x2c40, 0xab14, 0xa880, -+ 0xd0fc, 0x1140, 0xa810, 0x2005, 0xa80a, 0x2a00, 0xa80e, 0x2009, -+ 0x8015, 0x0070, 0x00c6, 0x3e60, 0x6044, 0xc0a4, 0x9085, 0x8005, -+ 0x6046, 0x00ce, 0x8319, 0xab16, 0x1904, 0x1d11, 0x2009, 0x8005, -+ 0x3e60, 0x6044, 0x9105, 0x6046, 0x0804, 0x1d0e, 0x080c, 0x0d7d, -+ 0x00f6, 0x00e6, 0x0096, 0x00c6, 0x0026, 0x704c, 0x9c06, 0x190c, -+ 0x0d7d, 0x2079, 0x0090, 0x2001, 0x0105, 0x2003, 0x0010, 0x782b, -+ 0x0004, 0x7057, 0x0000, 0x6014, 0x2048, 0x080c, 0xc838, 0x0118, -+ 0xa880, 0xc0bd, 0xa882, 0x6020, 0x9086, 0x0006, 0x1170, 0x2061, -+ 0x0100, 0x62c8, 0x2001, 0x00fa, 0x8001, 0x1df0, 0x60c8, 0x9206, -+ 0x1dc0, 0x60c4, 0xa89a, 0x60c8, 0xa896, 0x704c, 0x2060, 0x00c6, -+ 0x080c, 0xc443, 0x080c, 0xa896, 0x00ce, 0x704c, 0x9c06, 0x1150, -+ 0x2009, 0x0040, 0x080c, 0x21b0, 0x080c, 0xa34e, 0x2011, 0x0000, -+ 0x080c, 0xa1d9, 0x002e, 0x00ce, 0x009e, 0x00ee, 0x00fe, 0x0005, -+ 0x00f6, 0x2079, 0x0090, 0x781c, 0x0006, 0x7818, 0x0006, 0x2079, -+ 0x0100, 0x7a14, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, 0x2019, -+ 0x1000, 0x8319, 0x090c, 0x0d7d, 0x7820, 0xd0bc, 0x1dd0, 0x79c8, -+ 0x000e, 0x9102, 0x001e, 0x0006, 0x0016, 0x79c4, 0x000e, 0x9103, -+ 0x78c6, 0x000e, 0x78ca, 0x9284, 0x1984, 0x9085, 0x0012, 0x7816, -+ 0x2079, 0x0090, 0x782b, 0x0008, 0x7057, 0x0000, 0x00fe, 0x0005, -+ 0x00f6, 0x00e6, 0x2071, 0x19e7, 0x7054, 0x9086, 0x0000, 0x0904, -+ 0x1e26, 0x2079, 0x0090, 0x2009, 0x0207, 0x210c, 0xd194, 0x01b8, -+ 0x2009, 0x020c, 0x210c, 0x9184, 0x0003, 0x0188, 0x080c, 0xe723, -+ 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d7d, 0x0016, 0x2009, -+ 0x0040, 0x080c, 0x21b0, 0x001e, 0x2001, 0x020c, 0x2102, 0x2009, -+ 0x0206, 0x2104, 0x2009, 0x0203, 0x210c, 0x9106, 0x1120, 0x2009, -+ 0x0040, 0x080c, 0x21b0, 0x782c, 0xd0fc, 0x09a8, 0x080c, 0xa8b2, -+ 0x782c, 0xd0fc, 0x1de8, 0x080c, 0xa896, 0x7054, 0x9086, 0x0000, -+ 0x1950, 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, -+ 0x080c, 0x21b0, 0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, -+ 0x0005, 0x080c, 0x0d7d, 0x8c60, 0x2c05, 0x9005, 0x0110, 0x8a51, -+ 0x0005, 0xa004, 0x9005, 0x0168, 0xa85a, 0x2040, 0xa064, 0x9084, -+ 0x000f, 0x9080, 0x1e55, 0x2065, 0x8cff, 0x090c, 0x0d7d, 0x8a51, -+ 0x0005, 0x2050, 0x0005, 0x0000, 0x001d, 0x0021, 0x0025, 0x0029, -+ 0x002d, 0x0031, 0x0035, 0x0000, 0x001b, 0x0021, 0x0027, 0x002d, -+ 0x0033, 0x0000, 0x0000, 0x0023, 0x0000, 0x0000, 0x1e48, 0x1e44, -+ 0x1e48, 0x1e48, 0x1e52, 0x0000, 0x1e48, 0x1e4f, 0x1e4f, 0x1e4c, -+ 0x1e4f, 0x1e4f, 0x0000, 0x1e52, 0x1e4f, 0x0000, 0x1e4a, 0x1e4a, -+ 0x0000, 0x1e4a, 0x1e52, 0x0000, 0x1e4a, 0x1e50, 0x1e50, 0x1e50, -+ 0x0000, 0x1e50, 0x0000, 0x1e52, 0x1e50, 0x00c6, 0x00d6, 0x0086, -+ 0xab42, 0xac3e, 0xa888, 0x9055, 0x0904, 0x2054, 0x2940, 0xa064, -+ 0x90ec, 0x000f, 0x9084, 0x00ff, 0x9086, 0x0008, 0x1118, 0x2061, -+ 0x1e50, 0x00d0, 0x9de0, 0x1e55, 0x9d86, 0x0007, 0x0130, 0x9d86, -+ 0x000e, 0x0118, 0x9d86, 0x000f, 0x1120, 0xa08c, 0x9422, 0xa090, -+ 0x931b, 0x2c05, 0x9065, 0x1140, 0x0310, 0x0804, 0x2054, 0xa004, -+ 0x9045, 0x0904, 0x2054, 0x08d8, 0x2c05, 0x9005, 0x0904, 0x1f3c, -+ 0xdd9c, 0x1904, 0x1ef8, 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x9082, -+ 0x001b, 0x0002, 0x1ecd, 0x1ecd, 0x1ecf, 0x1ecd, 0x1ecd, 0x1ecd, -+ 0x1ed5, 0x1ecd, 0x1ecd, 0x1ecd, 0x1edb, 0x1ecd, 0x1ecd, 0x1ecd, -+ 0x1ee1, 0x1ecd, 0x1ecd, 0x1ecd, 0x1ee7, 0x1ecd, 0x1ecd, 0x1ecd, -+ 0x1eed, 0x1ecd, 0x1ecd, 0x1ecd, 0x1ef3, 0x080c, 0x0d7d, 0xa07c, -+ 0x9422, 0xa080, 0x931b, 0x0804, 0x1f32, 0xa08c, 0x9422, 0xa090, -+ 0x931b, 0x0804, 0x1f32, 0xa09c, 0x9422, 0xa0a0, 0x931b, 0x0804, -+ 0x1f32, 0xa0ac, 0x9422, 0xa0b0, 0x931b, 0x0804, 0x1f32, 0xa0bc, -+ 0x9422, 0xa0c0, 0x931b, 0x0804, 0x1f32, 0xa0cc, 0x9422, 0xa0d0, -+ 0x931b, 0x0804, 0x1f32, 0xa0dc, 0x9422, 0xa0e0, 0x931b, 0x04d0, -+ 0x908a, 0x0034, 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x1f1a, -+ 0x1f18, 0x1f18, 0x1f18, 0x1f18, 0x1f18, 0x1f1f, 0x1f18, 0x1f18, -+ 0x1f18, 0x1f18, 0x1f18, 0x1f24, 0x1f18, 0x1f18, 0x1f18, 0x1f18, -+ 0x1f18, 0x1f29, 0x1f18, 0x1f18, 0x1f18, 0x1f18, 0x1f18, 0x1f2e, -+ 0x080c, 0x0d7d, 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, -+ 0x2054, 0x8c60, 0x0804, 0x1ea4, 0xa004, 0x9045, 0x0904, 0x2054, -+ 0x0804, 0x1e7f, 0x8a51, 0x0904, 0x2054, 0x8c60, 0x2c05, 0x9005, -+ 0x1158, 0xa004, 0x9045, 0x0904, 0x2054, 0xa064, 0x90ec, 0x000f, -+ 0x9de0, 0x1e55, 0x2c05, 0x2060, 0xa880, 0xc0fc, 0xa882, 0x0804, -+ 0x2049, 0x2c05, 0x8422, 0x8420, 0x831a, 0x9399, 0x0000, 0xac2e, -+ 0xab32, 0xdd9c, 0x1904, 0x1fe6, 0x9082, 0x001b, 0x0002, 0x1f82, -+ 0x1f82, 0x1f84, 0x1f82, 0x1f82, 0x1f82, 0x1f92, 0x1f82, 0x1f82, -+ 0x1f82, 0x1fa0, 0x1f82, 0x1f82, 0x1f82, 0x1fae, 0x1f82, 0x1f82, -+ 0x1f82, 0x1fbc, 0x1f82, 0x1f82, 0x1f82, 0x1fca, 0x1f82, 0x1f82, -+ 0x1f82, 0x1fd8, 0x080c, 0x0d7d, 0xa17c, 0x2400, 0x9122, 0xa180, -+ 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa074, 0x9420, 0xa078, 0x9319, -+ 0x0804, 0x2044, 0xa18c, 0x2400, 0x9122, 0xa190, 0x2300, 0x911b, -+ 0x0a0c, 0x0d7d, 0xa084, 0x9420, 0xa088, 0x9319, 0x0804, 0x2044, -+ 0xa19c, 0x2400, 0x9122, 0xa1a0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, -+ 0xa094, 0x9420, 0xa098, 0x9319, 0x0804, 0x2044, 0xa1ac, 0x2400, -+ 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0a4, 0x9420, -+ 0xa0a8, 0x9319, 0x0804, 0x2044, 0xa1bc, 0x2400, 0x9122, 0xa1c0, -+ 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa0b4, 0x9420, 0xa0b8, 0x9319, -+ 0x0804, 0x2044, 0xa1cc, 0x2400, 0x9122, 0xa1d0, 0x2300, 0x911b, -+ 0x0a0c, 0x0d7d, 0xa0c4, 0x9420, 0xa0c8, 0x9319, 0x0804, 0x2044, -+ 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, -+ 0xa0d4, 0x9420, 0xa0d8, 0x9319, 0x0804, 0x2044, 0x9082, 0x001b, -+ 0x0002, 0x2004, 0x2002, 0x2002, 0x2002, 0x2002, 0x2002, 0x2011, -+ 0x2002, 0x2002, 0x2002, 0x2002, 0x2002, 0x201e, 0x2002, 0x2002, -+ 0x2002, 0x2002, 0x2002, 0x202b, 0x2002, 0x2002, 0x2002, 0x2002, -+ 0x2002, 0x2038, 0x080c, 0x0d7d, 0xa17c, 0x2400, 0x9122, 0xa180, -+ 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa06c, 0x9420, 0xa070, 0x9319, -+ 0x0498, 0xa194, 0x2400, 0x9122, 0xa198, 0x2300, 0x911b, 0x0a0c, -+ 0x0d7d, 0xa084, 0x9420, 0xa088, 0x9319, 0x0430, 0xa1ac, 0x2400, -+ 0x9122, 0xa1b0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, 0xa09c, 0x9420, -+ 0xa0a0, 0x9319, 0x00c8, 0xa1c4, 0x2400, 0x9122, 0xa1c8, 0x2300, -+ 0x911b, 0x0a0c, 0x0d7d, 0xa0b4, 0x9420, 0xa0b8, 0x9319, 0x0060, -+ 0xa1dc, 0x2400, 0x9122, 0xa1e0, 0x2300, 0x911b, 0x0a0c, 0x0d7d, -+ 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, 0x00c6, 0x610c, 0x0016, 0x9026, 0x2410, 0x6004, -+ 0x9420, 0x9291, 0x0000, 0x2c04, 0x9210, 0x9ce0, 0x0002, 0x918a, -+ 0x0002, 0x1da8, 0x9284, 0x000f, 0x9405, 0x001e, 0x00ce, 0x0005, -+ 0x7803, 0x0003, 0x780f, 0x0000, 0x6004, 0x7812, 0x2c04, 0x7816, -+ 0x9ce0, 0x0002, 0x918a, 0x0002, 0x1db8, 0x0005, 0x2001, 0x0005, -+ 0x2004, 0xd0bc, 0x190c, 0x0d76, 0xd094, 0x0110, 0x080c, 0x11de, -+ 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, 0x21ad, 0x7900, 0xd1dc, -+ 0x1118, 0x9084, 0x0006, 0x001a, 0x9084, 0x000e, 0x0002, 0x20cf, -+ 0x20c7, 0x7ef1, 0x20c7, 0x20c9, 0x20c9, 0x20c9, 0x20c9, 0x7ed7, -+ 0x20c7, 0x20cb, 0x20c7, 0x20c9, 0x20c7, 0x20c9, 0x20c7, 0x080c, -+ 0x0d7d, 0x0031, 0x0020, 0x080c, 0x7ed7, 0x080c, 0x7ef1, 0x0005, -+ 0x0006, 0x0016, 0x0026, 0x080c, 0xe723, 0x7930, 0x9184, 0x0003, -+ 0x01f0, 0x080c, 0xa896, 0x2001, 0x19fa, 0x2004, 0x9005, 0x0180, -+ 0x2001, 0x0133, 0x2004, 0x9005, 0x090c, 0x0d7d, 0x00c6, 0x2001, -+ 0x19fa, 0x2064, 0x080c, 0xa8b2, 0x080c, 0xc443, 0x00ce, 0x0408, -+ 0x2009, 0x0040, 0x080c, 0x21b0, 0x080c, 0xa8b2, 0x00d0, 0x9184, -+ 0x0014, 0x01a0, 0x6a00, 0x9286, 0x0003, 0x0160, 0x080c, 0x74e9, -+ 0x1138, 0x080c, 0x77ed, 0x080c, 0x6029, 0x080c, 0x741a, 0x0010, -+ 0x080c, 0x5ee4, 0x080c, 0x7f8f, 0x0041, 0x0018, 0x9184, 0x9540, -+ 0x1dc8, 0x002e, 0x001e, 0x000e, 0x0005, 0x00e6, 0x0036, 0x0046, -+ 0x0056, 0x2071, 0x1a6b, 0x080c, 0x1ab5, 0x005e, 0x004e, 0x003e, -+ 0x00ee, 0x0005, 0x0126, 0x2091, 0x2e00, 0x2071, 0x1800, 0x7128, -+ 0x2001, 0x196f, 0x2102, 0x2001, 0x1977, 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, 0x0d76, -+ 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, 0x29f6, 0x080c, 0x2916, -+ 0x080c, 0x2a67, 0x9006, 0x080c, 0x2945, 0x9006, 0x080c, 0x2928, -+ 0x20a9, 0x0012, 0x1d04, 0x21da, 0x2091, 0x6000, 0x1f04, 0x21da, -+ 0x602f, 0x0100, 0x602f, 0x0000, 0x6050, 0x9085, 0x0400, 0x9084, -+ 0xdfff, 0x6052, 0x6224, 0x080c, 0x2a44, 0x080c, 0x2634, 0x2009, -+ 0x00ef, 0x6132, 0x6136, 0x080c, 0x2644, 0x60e7, 0x0000, 0x61ea, -+ 0x60e3, 0x0008, 0x604b, 0xf7f7, 0x6043, 0x0000, 0x602f, 0x0080, -+ 0x602f, 0x0000, 0x6007, 0x349f, 0x00c6, 0x2061, 0x0140, 0x608b, -+ 0x000b, 0x608f, 0x10b8, 0x6093, 0x0000, 0x6097, 0x0198, 0x00ce, -+ 0x6004, 0x9085, 0x8000, 0x6006, 0x60bb, 0x0000, 0x20a9, 0x0018, -+ 0x60bf, 0x0000, 0x1f04, 0x2218, 0x60bb, 0x0000, 0x60bf, 0x0108, -+ 0x60bf, 0x0012, 0x60bf, 0x0405, 0x60bf, 0x0014, 0x60bf, 0x0320, -+ 0x60bf, 0x0018, 0x601b, 0x00f0, 0x601f, 0x001e, 0x600f, 0x006b, -+ 0x602b, 0x402c, 0x012e, 0x0005, 0x00f6, 0x2079, 0x0140, 0x78c3, -+ 0x0080, 0x78c3, 0x0083, 0x78c3, 0x0000, 0x00fe, 0x0005, 0x2001, -+ 0x1835, 0x2003, 0x0000, 0x2001, 0x1834, 0x2003, 0x0001, 0x0005, -+ 0x0126, 0x2091, 0x2800, 0x0006, 0x0016, 0x0026, 0x6124, 0x6028, -+ 0x910c, 0x0066, 0x2031, 0x1837, 0x2634, 0x96b4, 0x0028, 0x006e, -+ 0x1138, 0x6020, 0xd1bc, 0x0120, 0xd0bc, 0x1168, 0xd0b4, 0x1198, -+ 0x9184, 0x5e2c, 0x1118, 0x9184, 0x0007, 0x00aa, 0x9195, 0x0004, -+ 0x9284, 0x0007, 0x0082, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1a4, -+ 0x001e, 0x0d70, 0x0c98, 0x0016, 0x2001, 0x0387, 0x200c, 0xd1b4, -+ 0x001e, 0x0d30, 0x0c58, 0x2286, 0x2283, 0x2283, 0x2283, 0x2285, -+ 0x2283, 0x2283, 0x2283, 0x080c, 0x0d7d, 0x0029, 0x002e, 0x001e, -+ 0x000e, 0x012e, 0x0005, 0x00a6, 0x6124, 0x6028, 0xd09c, 0x0118, -+ 0xd19c, 0x1904, 0x2500, 0xd1f4, 0x190c, 0x0d76, 0x080c, 0x74e9, -+ 0x0904, 0x22e3, 0x080c, 0xcf52, 0x1120, 0x7000, 0x9086, 0x0003, -+ 0x0580, 0x6024, 0x9084, 0x1800, 0x0560, 0x080c, 0x750c, 0x0118, -+ 0x080c, 0x74fa, 0x1530, 0x2011, 0x0020, 0x080c, 0x2a44, 0x6043, -+ 0x0000, 0x080c, 0xcf52, 0x0168, 0x080c, 0x750c, 0x1150, 0x2001, -+ 0x19a7, 0x2003, 0x0001, 0x6027, 0x1800, 0x080c, 0x735f, 0x0804, -+ 0x2503, 0x70a4, 0x9005, 0x1150, 0x70a7, 0x0001, 0x00d6, 0x2069, -+ 0x0140, 0x080c, 0x7540, 0x00de, 0x1904, 0x2503, 0x080c, 0x77f7, -+ 0x0428, 0x080c, 0x750c, 0x1590, 0x6024, 0x9084, 0x1800, 0x1108, -+ 0x0468, 0x080c, 0x77f7, 0x080c, 0x77ed, 0x080c, 0x6029, 0x080c, -+ 0x741a, 0x0804, 0x2500, 0xd1ac, 0x1508, 0x6024, 0xd0dc, 0x1170, -+ 0xd0e4, 0x1178, 0xd0d4, 0x1190, 0xd0cc, 0x0130, 0x7098, 0x9086, -+ 0x0028, 0x1110, 0x080c, 0x76ce, 0x0804, 0x2500, 0x080c, 0x77f2, -+ 0x0048, 0x2001, 0x197d, 0x2003, 0x0002, 0x0020, 0x080c, 0x762b, -+ 0x0804, 0x2500, 0x080c, 0x7771, 0x0804, 0x2500, 0x6220, 0xd1bc, -+ 0x0138, 0xd2bc, 0x1904, 0x2565, 0xd2b4, 0x1904, 0x2577, 0x0000, -+ 0xd1ac, 0x0904, 0x240d, 0x0036, 0x6328, 0xc3bc, 0x632a, 0x003e, -+ 0x080c, 0x74e9, 0x11d0, 0x2011, 0x0020, 0x080c, 0x2a44, 0x0006, -+ 0x0026, 0x0036, 0x080c, 0x7503, 0x1158, 0x080c, 0x77ed, 0x080c, -+ 0x6029, 0x080c, 0x741a, 0x003e, 0x002e, 0x000e, 0x00ae, 0x0005, -+ 0x003e, 0x002e, 0x000e, 0x080c, 0x74bd, 0x0016, 0x0046, 0x00c6, -+ 0x644c, 0x9486, 0xf0f0, 0x1138, 0x2061, 0x0100, 0x644a, 0x6043, -+ 0x0090, 0x6043, 0x0010, 0x74da, 0x948c, 0xff00, 0x7038, 0xd084, -+ 0x0178, 0x9186, 0xf800, 0x1160, 0x7048, 0xd084, 0x1148, 0xc085, -+ 0x704a, 0x0036, 0x2418, 0x2011, 0x8016, 0x080c, 0x4b07, 0x003e, -+ 0x080c, 0xcf4b, 0x1904, 0x23e4, 0x9196, 0xff00, 0x05a8, 0x7060, -+ 0x9084, 0x00ff, 0x810f, 0x81ff, 0x0110, 0x9116, 0x0568, 0x7130, -+ 0xd184, 0x1550, 0x080c, 0x3368, 0x0128, 0xc18d, 0x7132, 0x080c, -+ 0x6a63, 0x1510, 0x6240, 0x9294, 0x0010, 0x0130, 0x6248, 0x9294, -+ 0xff00, 0x9296, 0xff00, 0x01c0, 0x7030, 0xd08c, 0x0904, 0x23e4, -+ 0x7038, 0xd08c, 0x1140, 0x2001, 0x180c, 0x200c, 0xd1ac, 0x1904, -+ 0x23e4, 0xc1ad, 0x2102, 0x0036, 0x73d8, 0x2011, 0x8013, 0x080c, -+ 0x4b07, 0x003e, 0x0804, 0x23e4, 0x7038, 0xd08c, 0x1140, 0x2001, -+ 0x180c, 0x200c, 0xd1ac, 0x1904, 0x23e4, 0xc1ad, 0x2102, 0x0036, -+ 0x73d8, 0x2011, 0x8013, 0x080c, 0x4b07, 0x003e, 0x7130, 0xc185, -+ 0x7132, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x01f0, 0x0016, 0x2009, -+ 0x0001, 0x2011, 0x0100, 0x080c, 0x88ec, 0x2019, 0x000e, 0x00c6, -+ 0x2061, 0x0000, 0x080c, 0xe239, 0x00ce, 0x9484, 0x00ff, 0x9080, -+ 0x3374, 0x200d, 0x918c, 0xff00, 0x810f, 0x2120, 0x9006, 0x2009, -+ 0x000e, 0x080c, 0xe2c9, 0x001e, 0x0016, 0x2009, 0x0002, 0x2019, -+ 0x0004, 0x080c, 0x31a6, 0x001e, 0x0078, 0x0156, 0x00b6, 0x20a9, -+ 0x007f, 0x900e, 0x080c, 0x6625, 0x1110, 0x080c, 0x6043, 0x8108, -+ 0x1f04, 0x23da, 0x00be, 0x015e, 0x00ce, 0x004e, 0x080c, 0xa896, -+ 0x080c, 0xab5e, 0x080c, 0xa8b2, 0x60e3, 0x0000, 0x001e, 0x2001, -+ 0x1800, 0x2014, 0x9296, 0x0004, 0x1170, 0xd19c, 0x11b0, 0x2011, -+ 0x180c, 0x2214, 0xd29c, 0x1120, 0x6204, 0x9295, 0x0002, 0x6206, -+ 0x6228, 0xc29d, 0x622a, 0x2003, 0x0001, 0x2001, 0x1826, 0x2003, -+ 0x0000, 0x2011, 0x0020, 0x080c, 0x2a44, 0xd194, 0x0904, 0x2500, -+ 0x0016, 0x080c, 0xa896, 0x6220, 0xd2b4, 0x0904, 0x249b, 0x080c, -+ 0x86f6, 0x080c, 0x9e32, 0x2011, 0x0004, 0x080c, 0x2a44, 0x00f6, -+ 0x2019, 0x19f3, 0x2304, 0x907d, 0x0904, 0x2468, 0x7804, 0x9086, -+ 0x0032, 0x15f0, 0x00d6, 0x00c6, 0x00e6, 0x0096, 0x2069, 0x0140, -+ 0x782c, 0x685e, 0x7808, 0x685a, 0x6043, 0x0002, 0x2001, 0x0003, -+ 0x8001, 0x1df0, 0x6043, 0x0000, 0x2001, 0x003c, 0x8001, 0x1df0, -+ 0x080c, 0x2a1a, 0x2001, 0x001e, 0x8001, 0x0240, 0x20a9, 0x0009, -+ 0x080c, 0x29d1, 0x6904, 0xd1dc, 0x1140, 0x0cb0, 0x2001, 0x0100, -+ 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x080c, 0x95de, 0x080c, -+ 0xa8b2, 0x7814, 0x2048, 0xa867, 0x0103, 0x2f60, 0x080c, 0xabed, -+ 0x009e, 0x00ee, 0x00ce, 0x00de, 0x00fe, 0x001e, 0x00ae, 0x0005, -+ 0x00fe, 0x00d6, 0x2069, 0x0140, 0x6804, 0x9084, 0x4000, 0x0110, -+ 0x080c, 0x2a1a, 0x00de, 0x00c6, 0x2061, 0x19e7, 0x6034, 0x080c, -+ 0xcf52, 0x0120, 0x909a, 0x0003, 0x1258, 0x0018, 0x909a, 0x00c8, -+ 0x1238, 0x8000, 0x6036, 0x00ce, 0x080c, 0x9e0a, 0x0804, 0x24fd, -+ 0x2061, 0x0100, 0x62c0, 0x080c, 0xa7cc, 0x2019, 0x19f3, 0x2304, -+ 0x9065, 0x0130, 0x6003, 0x0001, 0x2009, 0x0027, 0x080c, 0xac8c, -+ 0x00ce, 0x0804, 0x24fd, 0xd2bc, 0x0904, 0x24e0, 0x080c, 0x8703, -+ 0x2011, 0x0004, 0x080c, 0x2a44, 0x00d6, 0x2069, 0x0140, 0x6804, -+ 0x9084, 0x4000, 0x0110, 0x080c, 0x2a1a, 0x00de, 0x00c6, 0x2061, -+ 0x19e7, 0x6050, 0x080c, 0xcf52, 0x0120, 0x909a, 0x0003, 0x1668, -+ 0x0018, 0x909a, 0x00c8, 0x1648, 0x8000, 0x6052, 0x604c, 0x00ce, -+ 0x9005, 0x05d8, 0x2009, 0x07d0, 0x080c, 0x86fb, 0x9080, 0x0008, -+ 0x2004, 0x9086, 0x0006, 0x1138, 0x2009, 0x1984, 0x2011, 0x0012, -+ 0x080c, 0x2a53, 0x0450, 0x9080, 0x0008, 0x2004, 0x9086, 0x0009, -+ 0x0d98, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, 0x2a53, 0x00e8, -+ 0x2011, 0x0004, 0x080c, 0x2a44, 0x00c0, 0x0036, 0x2019, 0x0001, -+ 0x080c, 0xa118, 0x003e, 0x2019, 0x19fa, 0x2304, 0x9065, 0x0160, -+ 0x2009, 0x004f, 0x6020, 0x9086, 0x0009, 0x1110, 0x2009, 0x004f, -+ 0x6003, 0x0003, 0x080c, 0xac8c, 0x00ce, 0x080c, 0xa8b2, 0x001e, -+ 0xd19c, 0x0904, 0x255e, 0x7038, 0xd0ac, 0x1538, 0x0016, 0x0156, -+ 0x2011, 0x0008, 0x080c, 0x2a44, 0x6050, 0xc0e5, 0x6052, 0x20a9, -+ 0x0367, 0x1f04, 0x252b, 0x1d04, 0x2513, 0x080c, 0x872a, 0x6020, -+ 0xd09c, 0x1db8, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2981, 0x00fe, -+ 0x1d80, 0x6050, 0xc0e4, 0x6052, 0x2011, 0x0008, 0x080c, 0x2a44, -+ 0x015e, 0x001e, 0x0498, 0x015e, 0x001e, 0x0016, 0x6028, 0xc09c, -+ 0x602a, 0x080c, 0xa896, 0x080c, 0xab5e, 0x080c, 0xa8b2, 0x60e3, -+ 0x0000, 0x080c, 0xe702, 0x080c, 0xe71d, 0x080c, 0x56de, 0xd0fc, -+ 0x1138, 0x080c, 0xcf4b, 0x1120, 0x9085, 0x0001, 0x080c, 0x7530, -+ 0x9006, 0x080c, 0x2a0a, 0x2009, 0x0002, 0x080c, 0x29f6, 0x00e6, -+ 0x2071, 0x1800, 0x7003, 0x0004, 0x080c, 0x0eb4, 0x00ee, 0x2011, -+ 0x0008, 0x080c, 0x2a44, 0x080c, 0x0bc3, 0x001e, 0x918c, 0xffd0, -+ 0x2110, 0x080c, 0x2a44, 0x00ae, 0x0005, 0x0016, 0x2001, 0x0387, -+ 0x200c, 0xd1a4, 0x001e, 0x0904, 0x2310, 0x0016, 0x2009, 0x2571, -+ 0x00c0, 0x2001, 0x0387, 0x2003, 0x1000, 0x001e, 0x0c38, 0x0016, -+ 0x2001, 0x0387, 0x200c, 0xd1b4, 0x001e, 0x0904, 0x2310, 0x0016, -+ 0x2009, 0x2583, 0x0030, 0x2001, 0x0387, 0x2003, 0x4000, 0x001e, -+ 0x08a8, 0x6028, 0xc0bc, 0x602a, 0x2001, 0x0156, 0x2003, 0xbc91, -+ 0x8000, 0x2003, 0xffff, 0x6043, 0x0001, 0x080c, 0x29f0, 0x2011, -+ 0x0080, 0x080c, 0x2a44, 0x6017, 0x0000, 0x6043, 0x0000, 0x0817, -+ 0x0006, 0x0016, 0x0026, 0x0036, 0x00e6, 0x00f6, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x1800, 0x71d0, 0x70d2, 0x9116, 0x0904, 0x25f3, -+ 0x81ff, 0x01a0, 0x2009, 0x0000, 0x080c, 0x29f6, 0x2011, 0x8011, -+ 0x2019, 0x010e, 0x231c, 0x939e, 0x0007, 0x1118, 0x2019, 0x0001, -+ 0x0010, 0x2019, 0x0000, 0x080c, 0x4b07, 0x0468, 0x2001, 0x19a8, -+ 0x200c, 0x81ff, 0x1140, 0x2001, 0x0109, 0x2004, 0xd0b4, 0x0118, -+ 0x2019, 0x0003, 0x0008, 0x2118, 0x2011, 0x8012, 0x080c, 0x4b07, -+ 0x080c, 0x0eb4, 0x080c, 0x56de, 0xd0fc, 0x11a8, 0x080c, 0xcf4b, -+ 0x1190, 0x00c6, 0x080c, 0x268f, 0x080c, 0xa896, 0x080c, 0xa073, -+ 0x080c, 0xa8b2, 0x2061, 0x0100, 0x2019, 0x0028, 0x2009, 0x0002, -+ 0x080c, 0x31a6, 0x00ce, 0x012e, 0x00fe, 0x00ee, 0x003e, 0x002e, -+ 0x001e, 0x000e, 0x0005, 0x2028, 0x918c, 0x00ff, 0x2130, 0x9094, -+ 0xff00, 0x11f0, 0x2011, 0x1837, 0x2214, 0xd2ac, 0x11c8, 0x81ff, -+ 0x01e8, 0x2011, 0x181f, 0x2204, 0x9106, 0x1190, 0x2011, 0x1820, -+ 0x2214, 0x9294, 0xff00, 0x9584, 0xff00, 0x9206, 0x1148, 0x2011, -+ 0x1820, 0x2214, 0x9294, 0x00ff, 0x9584, 0x00ff, 0x9206, 0x1120, -+ 0x2500, 0x080c, 0x81ff, 0x0048, 0x9584, 0x00ff, 0x9080, 0x3374, -+ 0x200d, 0x918c, 0xff00, 0x810f, 0x9006, 0x0005, 0x9080, 0x3374, -+ 0x200d, 0x918c, 0x00ff, 0x0005, 0x00d6, 0x2069, 0x0140, 0x2001, -+ 0x1818, 0x2003, 0x00ef, 0x20a9, 0x0010, 0x9006, 0x6852, 0x6856, -+ 0x1f04, 0x263f, 0x00de, 0x0005, 0x0006, 0x00d6, 0x0026, 0x2069, -+ 0x0140, 0x2001, 0x1818, 0x2102, 0x8114, 0x8214, 0x8214, 0x8214, -+ 0x20a9, 0x0010, 0x6853, 0x0000, 0x9006, 0x82ff, 0x1128, 0x9184, -+ 0x000f, 0x9080, 0xe731, 0x2005, 0x6856, 0x8211, 0x1f04, 0x2654, -+ 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, 0x2684, 0x680f, -+ 0x0000, 0x000e, 0x001e, 0x002e, 0x00de, 0x015e, 0x0005, 0x080c, -+ 0x56da, 0xd0c4, 0x0150, 0xd0a4, 0x0140, 0x9006, 0x0046, 0x2020, -+ 0x2009, 0x002e, 0x080c, 0xe2c9, 0x004e, 0x0005, 0x00f6, 0x0016, -+ 0x0026, 0x2079, 0x0140, 0x78c4, 0xd0dc, 0x0904, 0x26fb, 0x080c, -+ 0x2971, 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, 0x9166, 0x928c, 0xff00, 0x0110, 0x2011, -+ 0x00ff, 0x2200, 0x8007, 0x9085, 0x004c, 0x78c2, 0x2009, 0x0138, -+ 0x220a, 0x080c, 0x74e9, 0x1118, 0x2009, 0x196d, 0x220a, 0x002e, -+ 0x001e, 0x00fe, 0x0005, 0x78c3, 0x0000, 0x0cc8, 0x0126, 0x2091, -+ 0x2800, 0x0006, 0x0016, 0x0026, 0x2001, 0x0170, 0x200c, 0x8000, -+ 0x2014, 0x9184, 0x0003, 0x0110, 0x080c, 0x0d76, 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, 0x1990, 0x2004, 0x908a, -+ 0x0007, 0x1a0c, 0x0d7d, 0x0033, 0x00ee, 0x002e, 0x001e, 0x000e, -+ 0x015e, 0x0005, 0x2759, 0x2777, 0x279b, 0x279d, 0x27c6, 0x27c8, -+ 0x27ca, 0x2001, 0x0001, 0x080c, 0x25a0, 0x080c, 0x29bb, 0x2001, -+ 0x1992, 0x2003, 0x0000, 0x7828, 0x9084, 0xe1d7, 0x782a, 0x9006, -+ 0x20a9, 0x0009, 0x080c, 0x298d, 0x2001, 0x1990, 0x2003, 0x0006, -+ 0x2009, 0x001e, 0x2011, 0x27cb, 0x080c, 0x8708, 0x0005, 0x2009, -+ 0x1995, 0x200b, 0x0000, 0x2001, 0x199a, 0x2003, 0x0036, 0x2001, -+ 0x1999, 0x2003, 0x002a, 0x2001, 0x1992, 0x2003, 0x0001, 0x9006, -+ 0x080c, 0x2928, 0x2001, 0xffff, 0x20a9, 0x0009, 0x080c, 0x298d, -+ 0x2001, 0x1990, 0x2003, 0x0006, 0x2009, 0x001e, 0x2011, 0x27cb, -+ 0x080c, 0x8708, 0x0005, 0x080c, 0x0d7d, 0x2001, 0x199a, 0x2003, -+ 0x0036, 0x2001, 0x1992, 0x2003, 0x0003, 0x7a38, 0x9294, 0x0005, -+ 0x9296, 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, -+ 0x2928, 0x2001, 0x1996, 0x2003, 0x0000, 0x2001, 0xffff, 0x20a9, -+ 0x0009, 0x080c, 0x298d, 0x2001, 0x1990, 0x2003, 0x0006, 0x2009, -+ 0x001e, 0x2011, 0x27cb, 0x080c, 0x8708, 0x0005, 0x080c, 0x0d7d, -+ 0x080c, 0x0d7d, 0x0005, 0x0006, 0x0016, 0x0026, 0x00e6, 0x00f6, -+ 0x0156, 0x0126, 0x2091, 0x8000, 0x2079, 0x0100, 0x2001, 0x1992, -+ 0x2004, 0x908a, 0x0007, 0x1a0c, 0x0d7d, 0x0043, 0x012e, 0x015e, -+ 0x00fe, 0x00ee, 0x002e, 0x001e, 0x000e, 0x0005, 0x27ed, 0x280d, -+ 0x284d, 0x287d, 0x28a1, 0x28b1, 0x28b3, 0x080c, 0x2981, 0x11b0, -+ 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1998, 0x2104, 0x7a38, -+ 0x9294, 0x0005, 0x9296, 0x0004, 0x0110, 0xc08d, 0x0008, 0xc085, -+ 0x200a, 0x2001, 0x1990, 0x2003, 0x0001, 0x0030, 0x080c, 0x28d7, -+ 0x2001, 0xffff, 0x080c, 0x2768, 0x0005, 0x080c, 0x28b5, 0x05e0, -+ 0x2009, 0x1999, 0x2104, 0x8001, 0x200a, 0x080c, 0x2981, 0x1178, -+ 0x7850, 0x9084, 0xefff, 0x7852, 0x7a38, 0x9294, 0x0005, 0x9296, -+ 0x0005, 0x0518, 0x2009, 0x1998, 0x2104, 0xc085, 0x200a, 0x2009, -+ 0x1995, 0x2104, 0x8000, 0x200a, 0x9086, 0x0005, 0x0118, 0x080c, -+ 0x28bd, 0x00c0, 0x200b, 0x0000, 0x7a38, 0x9294, 0x0006, 0x9296, -+ 0x0004, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2945, -+ 0x2001, 0x1992, 0x2003, 0x0002, 0x0028, 0x2001, 0x1990, 0x2003, -+ 0x0003, 0x0010, 0x080c, 0x278a, 0x0005, 0x080c, 0x28b5, 0x0560, -+ 0x2009, 0x1999, 0x2104, 0x8001, 0x200a, 0x080c, 0x2981, 0x1168, -+ 0x7850, 0x9084, 0xefff, 0x7852, 0x2001, 0x1990, 0x2003, 0x0003, -+ 0x2001, 0x1991, 0x2003, 0x0000, 0x00b8, 0x2009, 0x1999, 0x2104, -+ 0x9005, 0x1118, 0x080c, 0x28fa, 0x0010, 0x080c, 0x28ca, 0x080c, -+ 0x28bd, 0x2009, 0x1995, 0x200b, 0x0000, 0x2001, 0x1992, 0x2003, -+ 0x0001, 0x080c, 0x278a, 0x0000, 0x0005, 0x04b9, 0x0508, 0x080c, -+ 0x2981, 0x11b8, 0x7850, 0x9084, 0xefff, 0x7852, 0x2009, 0x1996, -+ 0x2104, 0x8000, 0x200a, 0x9086, 0x0007, 0x0108, 0x0078, 0x2001, -+ 0x199b, 0x2003, 0x000a, 0x2009, 0x1998, 0x2104, 0xc0fd, 0x200a, -+ 0x0038, 0x0419, 0x2001, 0x1992, 0x2003, 0x0004, 0x080c, 0x27b5, -+ 0x0005, 0x0099, 0x0168, 0x080c, 0x2981, 0x1138, 0x7850, 0x9084, -+ 0xefff, 0x7852, 0x080c, 0x27a1, 0x0018, 0x0079, 0x080c, 0x27b5, -+ 0x0005, 0x080c, 0x0d7d, 0x080c, 0x0d7d, 0x2009, 0x199a, 0x2104, -+ 0x8001, 0x200a, 0x090c, 0x2916, 0x0005, 0x7a38, 0x9294, 0x0005, -+ 0x9296, 0x0005, 0x0110, 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, -+ 0x2945, 0x0005, 0x7a38, 0x9294, 0x0006, 0x9296, 0x0006, 0x0110, -+ 0x9006, 0x0010, 0x2001, 0x0001, 0x080c, 0x2928, 0x0005, 0x2009, -+ 0x1995, 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, -+ 0x2945, 0x0005, 0x0086, 0x2001, 0x1998, 0x2004, 0x9084, 0x7fff, -+ 0x090c, 0x0d7d, 0x2009, 0x1997, 0x2144, 0x8846, 0x280a, 0x9844, -+ 0x0dd8, 0xd08c, 0x1120, 0xd084, 0x1120, 0x080c, 0x0d7d, 0x9006, -+ 0x0010, 0x2001, 0x0001, 0x00a1, 0x008e, 0x0005, 0x0006, 0x0156, -+ 0x2001, 0x1990, 0x20a9, 0x0009, 0x2003, 0x0000, 0x8000, 0x1f04, -+ 0x291c, 0x2001, 0x1997, 0x2003, 0x8000, 0x015e, 0x000e, 0x0005, -+ 0x00f6, 0x2079, 0x0100, 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, -+ 0xfff9, 0x9085, 0x0004, 0x783a, 0x2009, 0x199d, 0x210c, 0x795a, -+ 0x0050, 0x7838, 0x9084, 0xfffb, 0x9085, 0x0006, 0x783a, 0x2009, -+ 0x199e, 0x210c, 0x795a, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0100, -+ 0x9085, 0x0000, 0x0158, 0x7838, 0x9084, 0xfffa, 0x9085, 0x0004, -+ 0x783a, 0x7850, 0x9084, 0xfff0, 0x7852, 0x00c8, 0x7838, 0x9084, -+ 0xfffb, 0x9085, 0x0005, 0x783a, 0x7850, 0x9084, 0xfff0, 0x0016, -+ 0x2009, 0x0003, 0x210c, 0x918c, 0x0600, 0x918e, 0x0400, 0x0118, -+ 0x9085, 0x000a, 0x0010, 0x9085, 0x0000, 0x001e, 0x7852, 0x00fe, -+ 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0007, 0x000e, -+ 0x0005, 0x0006, 0x2001, 0x0100, 0x2004, 0x9082, 0x0009, 0x000e, -+ 0x0005, 0x0156, 0x20a9, 0x0064, 0x7820, 0x080c, 0x29f0, 0xd09c, -+ 0x1110, 0x1f04, 0x2984, 0x015e, 0x0005, 0x0126, 0x0016, 0x0006, -+ 0x2091, 0x8000, 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, 0x29ad, 0x080c, -+ 0x872a, 0x1f04, 0x29ad, 0x7850, 0x9085, 0x1000, 0x7852, 0x000e, -+ 0x001e, 0x012e, 0x0005, 0x080c, 0x2aab, 0x0005, 0x0006, 0x0156, -+ 0x00f6, 0x2079, 0x0100, 0x20a9, 0x000a, 0x7854, 0xd0ac, 0x1100, -+ 0x7854, 0xd08c, 0x1110, 0x1f04, 0x29c8, 0x00fe, 0x015e, 0x000e, -+ 0x0005, 0x1d04, 0x29d1, 0x080c, 0x872a, 0x1f04, 0x29d1, 0x0005, -+ 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0000, 0x000e, 0x0005, -+ 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0001, 0x000e, 0x0005, -+ 0x0006, 0x2001, 0x199c, 0x2004, 0x9086, 0x0002, 0x000e, 0x0005, -+ 0xa001, 0xa001, 0xa001, 0xa001, 0xa001, 0x0005, 0x0006, 0x2001, -+ 0x19a8, 0x2102, 0x000e, 0x0005, 0x2009, 0x0171, 0x2104, 0xd0dc, -+ 0x0140, 0x2009, 0x0170, 0x2104, 0x200b, 0x0080, 0xa001, 0xa001, -+ 0x200a, 0x0005, 0x0016, 0x0026, 0x080c, 0x7503, 0x0108, 0xc0bc, -+ 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, 0x220a, 0x002e, -+ 0x001e, 0x0005, 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, -+ 0x0001, 0x9285, 0x1000, 0x200a, 0x220a, 0x002e, 0x001e, 0x0005, -+ 0x0016, 0x0026, 0x2009, 0x0140, 0x2114, 0x9294, 0x0001, 0x9215, -+ 0x220a, 0x002e, 0x001e, 0x0005, 0x0006, 0x0016, 0x2009, 0x0140, -+ 0x2104, 0x1128, 0x080c, 0x7503, 0x0110, 0xc0bc, 0x0008, 0xc0bd, -+ 0x200a, 0x001e, 0x000e, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, -+ 0x0101, 0x7844, 0xd084, 0x1de8, 0x2001, 0x0109, 0x2202, 0x7843, -+ 0x0100, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x0380, 0x7843, 0x0202, -+ 0x7844, 0xd08c, 0x1de8, 0x2079, 0x0100, 0x7814, 0x9104, 0x9205, -+ 0x7a16, 0x2079, 0x0380, 0x7843, 0x0200, 0x00fe, 0x0005, 0x0016, -+ 0x0026, 0x0036, 0x00c6, 0x2061, 0x0100, 0x6050, 0x9084, 0xfbff, -+ 0x9085, 0x0040, 0x6052, 0x20a9, 0x0002, 0x080c, 0x29d1, 0x6050, -+ 0x9085, 0x0400, 0x9084, 0xff9f, 0x6052, 0x20a9, 0x0005, 0x080c, -+ 0x29d1, 0x6054, 0xd0bc, 0x090c, 0x0d7d, 0x20a9, 0x0005, 0x080c, -+ 0x29d1, 0x6054, 0xd0ac, 0x090c, 0x0d7d, 0x2009, 0x19af, 0x9084, -+ 0x7e00, 0x8007, 0x8004, 0x8004, 0x200a, 0x9085, 0x0000, 0x605a, -+ 0x2009, 0x199d, 0x2011, 0x199e, 0x6358, 0x939c, 0x38df, 0x2320, -+ 0x939d, 0x0000, 0x94a5, 0x0000, 0x230a, 0x2412, 0x00ce, 0x003e, -+ 0x002e, 0x001e, 0x0005, 0x0006, 0x00c6, 0x2061, 0x0100, 0x6050, -+ 0xc0cd, 0x6052, 0x00ce, 0x000e, 0x0005, 0x2fb1, 0x2fb1, 0x2bb5, -+ 0x2bb5, 0x2bc1, 0x2bc1, 0x2bcd, 0x2bcd, 0x2bdb, 0x2bdb, 0x2be7, -+ 0x2be7, 0x2bf5, 0x2bf5, 0x2c03, 0x2c03, 0x2c15, 0x2c15, 0x2c21, -+ 0x2c21, 0x2c2f, 0x2c2f, 0x2c4d, 0x2c4d, 0x2c6d, 0x2c6d, 0x2c3d, -+ 0x2c3d, 0x2c5d, 0x2c5d, 0x2c7b, 0x2c7b, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c8d, 0x2c8d, 0x2c99, -+ 0x2c99, 0x2ca7, 0x2ca7, 0x2cb5, 0x2cb5, 0x2cc5, 0x2cc5, 0x2cd3, -+ 0x2cd3, 0x2ce3, 0x2ce3, 0x2cf3, 0x2cf3, 0x2d05, 0x2d05, 0x2d13, -+ 0x2d13, 0x2d23, 0x2d23, 0x2d45, 0x2d45, 0x2d69, 0x2d69, 0x2d33, -+ 0x2d33, 0x2d57, 0x2d57, 0x2d79, 0x2d79, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2d8d, 0x2d8d, 0x2d99, -+ 0x2d99, 0x2da7, 0x2da7, 0x2db5, 0x2db5, 0x2dc5, 0x2dc5, 0x2dd3, -+ 0x2dd3, 0x2de3, 0x2de3, 0x2df3, 0x2df3, 0x2e05, 0x2e05, 0x2e13, -+ 0x2e13, 0x2e23, 0x2e23, 0x2e33, 0x2e33, 0x2e45, 0x2e45, 0x2e55, -+ 0x2e55, 0x2e67, 0x2e67, 0x2e79, 0x2e79, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2e8d, 0x2e8d, 0x2e9b, -+ 0x2e9b, 0x2eab, 0x2eab, 0x2ebb, 0x2ebb, 0x2ecd, 0x2ecd, 0x2edd, -+ 0x2edd, 0x2eef, 0x2eef, 0x2f01, 0x2f01, 0x2f15, 0x2f15, 0x2f25, -+ 0x2f25, 0x2f37, 0x2f37, 0x2f49, 0x2f49, 0x2f5d, 0x2f5d, 0x2f6e, -+ 0x2f6e, 0x2f81, 0x2f81, 0x2f94, 0x2f94, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, -+ 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x2c13, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2248, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x207e, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, -+ 0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0x2248, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0xa001, 0x0cf0, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x13a3, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x207e, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x2248, 0x080c, -+ 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, -+ 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, -+ 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x13a3, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0x2248, 0x080c, -+ 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x26fe, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x26fe, 0x080c, 0x207e, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0x207e, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x2248, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, -+ 0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x2248, 0x080c, -+ 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, -+ 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x2248, 0x080c, -+ 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0x207e, 0x080c, 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x26fe, 0x080c, 0x207e, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x26fe, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, 0x2248, 0x080c, -+ 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8fc, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0xa8fc, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x207e, 0x080c, 0xa8fc, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, -+ 0xa8fc, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8fc, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0xa8fc, 0x080c, 0x2248, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, -+ 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, -+ 0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8fc, 0x080c, -+ 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0xa8fc, 0x080c, 0x2248, 0x080c, -+ 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, -+ 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, -+ 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8fc, 0x080c, -+ 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0xa8fc, 0x080c, -+ 0x2248, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x207e, 0x080c, 0xa8fc, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, 0x2248, 0x080c, -+ 0x13a3, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0xa8fc, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0xa8fc, 0x080c, -+ 0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, -+ 0xa8fc, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, -+ 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, -+ 0xa8fc, 0x080c, 0x2248, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0xa8fc, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0xa8fc, 0x080c, 0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x26fe, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, 0x20a8, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, -+ 0x2248, 0x080c, 0x20a8, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0xa8fc, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0xa8fc, 0x080c, 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, -+ 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, -+ 0x26fe, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, 0x13a3, 0x0804, -+ 0x2fa9, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, 0xa8fc, 0x080c, -+ 0x2248, 0x080c, 0x13a3, 0x0804, 0x2fa9, 0x0106, 0x0006, 0x0126, -+ 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, -+ 0xa8fc, 0x080c, 0x13a3, 0x080c, 0x20a8, 0x04d8, 0x0106, 0x0006, -+ 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, -+ 0x080c, 0xa8fc, 0x080c, 0x2248, 0x080c, 0x13a3, 0x080c, 0x20a8, -+ 0x0440, 0x0106, 0x0006, 0x0126, 0x01c6, 0x01d6, 0x0136, 0x0146, -+ 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, 0x080c, 0x13a3, 0x080c, -+ 0xa8fc, 0x080c, 0x20a8, 0x00a8, 0x0106, 0x0006, 0x0126, 0x01c6, -+ 0x01d6, 0x0136, 0x0146, 0x0156, 0x080c, 0x26fe, 0x080c, 0x207e, -+ 0x080c, 0xa8fc, 0x080c, 0x2248, 0x080c, 0x13a3, 0x080c, 0x20a8, -+ 0x0000, 0x015e, 0x014e, 0x013e, 0x01de, 0x01ce, 0x012e, 0x000e, -+ 0x010e, 0x000d, 0x00b6, 0x00c6, 0x0026, 0x0046, 0x9026, 0x080c, -+ 0x6a29, 0x1904, 0x30c2, 0x72dc, 0x2001, 0x197c, 0x2004, 0x9005, -+ 0x1110, 0xd29c, 0x0148, 0xd284, 0x1138, 0xd2bc, 0x1904, 0x30c2, -+ 0x080c, 0x30c7, 0x0804, 0x30c2, 0xd2cc, 0x1904, 0x30c2, 0x080c, -+ 0x74e9, 0x1120, 0x70af, 0xffff, 0x0804, 0x30c2, 0xd294, 0x0120, -+ 0x70af, 0xffff, 0x0804, 0x30c2, 0x080c, 0x3363, 0x0160, 0x080c, -+ 0xcf52, 0x0128, 0x2001, 0x1818, 0x203c, 0x0804, 0x304f, 0x70af, -+ 0xffff, 0x0804, 0x30c2, 0x2001, 0x1818, 0x203c, 0x7294, 0xd284, -+ 0x0904, 0x304f, 0xd28c, 0x1904, 0x304f, 0x0036, 0x73ac, 0x938e, -+ 0xffff, 0x1110, 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 0x2c04, -+ 0x938c, 0x0001, 0x0120, 0x9084, 0xff00, 0x8007, 0x0010, 0x9084, -+ 0x00ff, 0x970e, 0x05d0, 0x908e, 0x0000, 0x05b8, 0x908e, 0x00ff, -+ 0x1150, 0x7230, 0xd284, 0x15b0, 0x7294, 0xc28d, 0x7296, 0x70af, -+ 0xffff, 0x003e, 0x04a0, 0x900e, 0x080c, 0x25fb, 0x080c, 0x65c4, -+ 0x1538, 0x9006, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0148, 0x00c6, -+ 0x2060, 0x080c, 0x8b90, 0x00ce, 0x090c, 0x8f34, 0xb8af, 0x0000, -+ 0x080c, 0x6a6b, 0x1168, 0x7030, 0xd08c, 0x0130, 0xb800, 0xd0bc, -+ 0x0138, 0x080c, 0x6914, 0x0120, 0x080c, 0x30e0, 0x0148, 0x0028, -+ 0x080c, 0x3238, 0x080c, 0x310c, 0x0118, 0x8318, 0x0804, 0x2ffc, -+ 0x73ae, 0x0010, 0x70af, 0xffff, 0x003e, 0x0804, 0x30c2, 0x9780, -+ 0x3374, 0x203d, 0x97bc, 0xff00, 0x873f, 0x2041, 0x007e, 0x70ac, -+ 0x9096, 0xffff, 0x1118, 0x900e, 0x28a8, 0x0050, 0x9812, 0x0220, -+ 0x2008, 0x9802, 0x20a8, 0x0020, 0x70af, 0xffff, 0x0804, 0x30c2, -+ 0x2700, 0x0156, 0x0016, 0x9106, 0x0904, 0x30b7, 0xc484, 0x080c, -+ 0x6625, 0x0148, 0x080c, 0xcf52, 0x1904, 0x30b7, 0x080c, 0x65c4, -+ 0x1904, 0x30bf, 0x0008, 0xc485, 0xb8bb, 0x0520, 0xb8ac, 0x9005, -+ 0x0148, 0x00c6, 0x2060, 0x080c, 0x8b90, 0x00ce, 0x090c, 0x8f34, -+ 0xb8af, 0x0000, 0x080c, 0x6a6b, 0x1130, 0x7030, 0xd08c, 0x01f8, -+ 0xb800, 0xd0bc, 0x11e0, 0x7294, 0xd28c, 0x0180, 0x080c, 0x6a6b, -+ 0x9082, 0x0006, 0x02e0, 0xd484, 0x1118, 0x080c, 0x65e9, 0x0028, -+ 0x080c, 0x32d1, 0x01a0, 0x080c, 0x32fc, 0x0088, 0x080c, 0x3238, -+ 0x080c, 0xcf52, 0x1160, 0x080c, 0x310c, 0x0188, 0x0040, 0x080c, -+ 0xcf52, 0x1118, 0x080c, 0x32d1, 0x0110, 0x0451, 0x0140, 0x001e, -+ 0x8108, 0x015e, 0x1f04, 0x3068, 0x70af, 0xffff, 0x0018, 0x001e, -+ 0x015e, 0x71ae, 0x004e, 0x002e, 0x00ce, 0x00be, 0x0005, 0x00c6, -+ 0x0016, 0x70af, 0x0001, 0x2009, 0x007e, 0x080c, 0x65c4, 0x1168, -+ 0xb813, 0x00ff, 0xb817, 0xfffe, 0x080c, 0x3238, 0x04a9, 0x0128, -+ 0x70dc, 0xc0bd, 0x70de, 0x080c, 0xcc9f, 0x001e, 0x00ce, 0x0005, -+ 0x0016, 0x0076, 0x00d6, 0x00c6, 0x2001, 0x184c, 0x2004, 0x9084, -+ 0x00ff, 0xb842, 0x080c, 0xac5f, 0x01d0, 0x2b00, 0x6012, 0x080c, -+ 0xcccc, 0x6023, 0x0001, 0x9006, 0x080c, 0x6561, 0x2001, 0x0000, -+ 0x080c, 0x6575, 0x0126, 0x2091, 0x8000, 0x70a8, 0x8000, 0x70aa, -+ 0x012e, 0x2009, 0x0004, 0x080c, 0xac8c, 0x9085, 0x0001, 0x00ce, -+ 0x00de, 0x007e, 0x001e, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, -+ 0x2001, 0x184c, 0x2004, 0x9084, 0x00ff, 0xb842, 0x080c, 0xac5f, -+ 0x0548, 0x2b00, 0x6012, 0xb800, 0xc0c4, 0xb802, 0xb8a0, 0x9086, -+ 0x007e, 0x0140, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1110, -+ 0x080c, 0x31e7, 0x080c, 0xcccc, 0x6023, 0x0001, 0x9006, 0x080c, -+ 0x6561, 0x2001, 0x0002, 0x080c, 0x6575, 0x0126, 0x2091, 0x8000, -+ 0x70a8, 0x8000, 0x70aa, 0x012e, 0x2009, 0x0002, 0x080c, 0xac8c, -+ 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, 0x0005, 0x00b6, -+ 0x00c6, 0x0026, 0x2009, 0x0080, 0x080c, 0x65c4, 0x1140, 0xb813, -+ 0x00ff, 0xb817, 0xfffc, 0x0039, 0x0110, 0x70e3, 0xffff, 0x002e, -+ 0x00ce, 0x00be, 0x0005, 0x0016, 0x0076, 0x00d6, 0x00c6, 0x080c, -+ 0xab97, 0x01d0, 0x2b00, 0x6012, 0x080c, 0xcccc, 0x6023, 0x0001, -+ 0x9006, 0x080c, 0x6561, 0x2001, 0x0002, 0x080c, 0x6575, 0x0126, -+ 0x2091, 0x8000, 0x70e4, 0x8000, 0x70e6, 0x012e, 0x2009, 0x0002, -+ 0x080c, 0xac8c, 0x9085, 0x0001, 0x00ce, 0x00de, 0x007e, 0x001e, -+ 0x0005, 0x00c6, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2009, 0x007f, -+ 0x080c, 0x65c4, 0x11b8, 0xb813, 0x00ff, 0xb817, 0xfffd, 0xb8d7, -+ 0x0004, 0x080c, 0xab97, 0x0170, 0x2b00, 0x6012, 0x6316, 0x6023, -+ 0x0001, 0x620a, 0x080c, 0xcccc, 0x2009, 0x0022, 0x080c, 0xac8c, -+ 0x9085, 0x0001, 0x012e, 0x00de, 0x00ce, 0x0005, 0x00e6, 0x00c6, -+ 0x0066, 0x0036, 0x0026, 0x00b6, 0x21f0, 0x9036, 0x080c, 0xa896, -+ 0x1110, 0x2031, 0x0001, 0x0066, 0x080c, 0x93b0, 0x080c, 0x9326, -+ 0x080c, 0xa7ec, 0x080c, 0xbb19, 0x006e, 0x86ff, 0x0110, 0x080c, -+ 0xa8b2, 0x3e08, 0x2130, 0x81ff, 0x0120, 0x20a9, 0x007e, 0x900e, -+ 0x0018, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6625, 0x1140, -+ 0x9686, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1110, 0x080c, 0x6043, -+ 0x001e, 0x8108, 0x1f04, 0x31cc, 0x9686, 0x0001, 0x190c, 0x3337, -+ 0x00be, 0x002e, 0x003e, 0x006e, 0x00ce, 0x00ee, 0x0005, 0x00e6, -+ 0x00c6, 0x0046, 0x0036, 0x0026, 0x0016, 0x00b6, 0x9016, 0x080c, -+ 0xa896, 0x1110, 0x2011, 0x0001, 0x0026, 0x6210, 0x2258, 0xbaa0, -+ 0x0026, 0x2019, 0x0029, 0x080c, 0x93a5, 0x0076, 0x2039, 0x0000, -+ 0x080c, 0x9277, 0x2c08, 0x080c, 0xdfeb, 0x007e, 0x001e, 0x002e, -+ 0x82ff, 0x0110, 0x080c, 0xa8b2, 0xba10, 0xbb14, 0xbc84, 0x080c, -+ 0x6043, 0xba12, 0xbb16, 0xbc86, 0x00be, 0x001e, 0x002e, 0x003e, -+ 0x004e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x0006, 0x00b6, 0x6010, -+ 0x2058, 0xb8a0, 0x00be, 0x9086, 0x0080, 0x0150, 0x2071, 0x1800, -+ 0x70a8, 0x9005, 0x0110, 0x8001, 0x70aa, 0x000e, 0x00ee, 0x0005, -+ 0x2071, 0x1800, 0x70e4, 0x9005, 0x0dc0, 0x8001, 0x70e6, 0x0ca8, -+ 0xb800, 0xc08c, 0xb802, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x00b6, -+ 0x0046, 0x0036, 0x0026, 0x0016, 0x0156, 0x2178, 0x9016, 0x080c, -+ 0xa896, 0x1110, 0x2011, 0x0001, 0x0026, 0x81ff, 0x1118, 0x20a9, -+ 0x0001, 0x0078, 0x080c, 0x56da, 0xd0c4, 0x0140, 0xd0a4, 0x0130, -+ 0x9006, 0x2020, 0x2009, 0x002d, 0x080c, 0xe2c9, 0x20a9, 0x0800, -+ 0x9016, 0x0026, 0x928e, 0x007e, 0x0904, 0x32ab, 0x928e, 0x007f, -+ 0x0904, 0x32ab, 0x928e, 0x0080, 0x05f0, 0x9288, 0x1000, 0x210c, -+ 0x81ff, 0x05c8, 0x8fff, 0x1150, 0x2001, 0x198e, 0x0006, 0x2003, -+ 0x0001, 0x080c, 0x32be, 0x000e, 0x2003, 0x0000, 0x00b6, 0x00c6, -+ 0x2158, 0x2001, 0x0001, 0x080c, 0x6a35, 0x00ce, 0x00be, 0x2019, -+ 0x0029, 0x080c, 0x93a5, 0x0076, 0x2039, 0x0000, 0x080c, 0x9277, -+ 0x00b6, 0x00c6, 0x0026, 0x2158, 0xba04, 0x9294, 0x00ff, 0x9286, -+ 0x0006, 0x1118, 0xb807, 0x0404, 0x0028, 0x2001, 0x0004, 0x8007, -+ 0x9215, 0xba06, 0x002e, 0x00ce, 0x00be, 0x0016, 0x2c08, 0x080c, -+ 0xdfeb, 0x001e, 0x007e, 0x002e, 0x8210, 0x1f04, 0x3261, 0x002e, -+ 0x82ff, 0x0110, 0x080c, 0xa8b2, 0x015e, 0x001e, 0x002e, 0x003e, -+ 0x004e, 0x00be, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x0046, 0x0026, -+ 0x0016, 0x080c, 0x56da, 0xd0c4, 0x0140, 0xd0a4, 0x0130, 0x9006, -+ 0x2220, 0x2009, 0x0029, 0x080c, 0xe2c9, 0x001e, 0x002e, 0x004e, -+ 0x0005, 0x0016, 0x0026, 0x0036, 0x00c6, 0x7294, 0x82ff, 0x01e8, -+ 0x080c, 0x6a63, 0x11d0, 0x2100, 0x080c, 0x262e, 0x81ff, 0x01b8, -+ 0x2019, 0x0001, 0x8314, 0x92e0, 0x1d80, 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, 0x0066, 0x9036, 0x080c, 0xa896, 0x1110, 0x2031, 0x0001, -+ 0x0066, 0x0036, 0x2019, 0x0029, 0x00d9, 0x003e, 0x006e, 0x86ff, -+ 0x0110, 0x080c, 0xa8b2, 0x006e, 0x9180, 0x1000, 0x2004, 0x9065, -+ 0x0158, 0x0016, 0x00c6, 0x2061, 0x1b32, 0x001e, 0x6112, 0x080c, -+ 0x31e7, 0x001e, 0x080c, 0x65e9, 0x012e, 0x00ce, 0x001e, 0x0005, -+ 0x0016, 0x0026, 0x2110, 0x080c, 0xa38a, 0x080c, 0xe630, 0x002e, -+ 0x001e, 0x0005, 0x2001, 0x1837, 0x2004, 0xd0cc, 0x0005, 0x00c6, -+ 0x00b6, 0x080c, 0x74e9, 0x1118, 0x20a9, 0x0800, 0x0010, 0x20a9, -+ 0x0782, 0x080c, 0x74e9, 0x1110, 0x900e, 0x0010, 0x2009, 0x007e, -+ 0x9180, 0x1000, 0x2004, 0x905d, 0x0130, 0x86ff, 0x0110, 0xb800, -+ 0xd0bc, 0x090c, 0x65e9, 0x8108, 0x1f04, 0x3348, 0x2061, 0x1800, -+ 0x607f, 0x0000, 0x6080, 0x9084, 0x00ff, 0x6082, 0x60b3, 0x0000, -+ 0x00be, 0x00ce, 0x0005, 0x2001, 0x1869, 0x2004, 0xd0bc, 0x0005, -+ 0x2011, 0x1848, 0x2214, 0xd2ec, 0x0005, 0x0026, 0x2011, 0x1867, -+ 0x2214, 0xd2dc, 0x002e, 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, 0x189e, 0x7003, 0x0002, -+ 0x9006, 0x7016, 0x701a, 0x704a, 0x704e, 0x700e, 0x7042, 0x7046, -+ 0x703b, 0x18ba, 0x703f, 0x18ba, 0x7007, 0x0001, 0x080c, 0x1053, -+ 0x090c, 0x0d7d, 0x2900, 0x706a, 0xa867, 0x0002, 0xa8ab, 0xdcb0, -+ 0x080c, 0x1053, 0x090c, 0x0d7d, 0x2900, 0x706e, 0xa867, 0x0002, -+ 0xa8ab, 0xdcb0, 0x0005, 0x2071, 0x189e, 0x7004, 0x0002, 0x34a3, -+ 0x34a4, 0x34b7, 0x34cb, 0x0005, 0x1004, 0x34b4, 0x0e04, 0x34b4, -+ 0x2079, 0x0000, 0x0126, 0x2091, 0x8000, 0x700c, 0x9005, 0x1128, -+ 0x700f, 0x0001, 0x012e, 0x0468, 0x0005, 0x012e, 0x0ce8, 0x2079, -+ 0x0000, 0x2061, 0x18b8, 0x2c4c, 0xa86c, 0x908e, 0x0100, 0x0128, -+ 0x9086, 0x0200, 0x0904, 0x359f, 0x0005, 0x7018, 0x2048, 0x2061, -+ 0x1800, 0x701c, 0x0807, 0x7014, 0x2048, 0xa864, 0x9094, 0x00ff, -+ 0x9296, 0x0029, 0x1120, 0xaa78, 0xd2fc, 0x0128, 0x0005, 0x9086, -+ 0x0103, 0x0108, 0x0005, 0x2079, 0x0000, 0x2061, 0x1800, 0x701c, -+ 0x0807, 0x2061, 0x1800, 0x7880, 0x908a, 0x0040, 0x1210, 0x61d0, -+ 0x0042, 0x2100, 0x908a, 0x003f, 0x1a04, 0x359c, 0x61d0, 0x0804, -+ 0x3531, 0x3573, 0x35ab, 0x35b5, 0x35b9, 0x35c3, 0x35c9, 0x35cd, -+ 0x35dd, 0x35e0, 0x35ea, 0x35ef, 0x35f4, 0x35ff, 0x360a, 0x3619, -+ 0x3628, 0x3636, 0x364d, 0x3668, 0x359c, 0x3711, 0x374f, 0x37f4, -+ 0x3805, 0x3828, 0x359c, 0x359c, 0x359c, 0x3860, 0x3880, 0x3889, -+ 0x38b5, 0x38bb, 0x359c, 0x3901, 0x359c, 0x359c, 0x359c, 0x359c, -+ 0x359c, 0x390c, 0x3915, 0x391d, 0x391f, 0x359c, 0x359c, 0x359c, -+ 0x359c, 0x359c, 0x359c, 0x394f, 0x359c, 0x359c, 0x359c, 0x359c, -+ 0x359c, 0x396c, 0x39d0, 0x359c, 0x359c, 0x359c, 0x359c, 0x359c, -+ 0x359c, 0x0002, 0x39fa, 0x39fd, 0x3a5c, 0x3a75, 0x3aa5, 0x3d47, -+ 0x359c, 0x52ab, 0x359c, 0x359c, 0x359c, 0x359c, 0x359c, 0x359c, -+ 0x359c, 0x359c, 0x35ea, 0x35ef, 0x4246, 0x56fe, 0x4264, 0x533a, -+ 0x538b, 0x548e, 0x359c, 0x54f0, 0x552c, 0x555d, 0x5669, 0x558a, -+ 0x55e9, 0x359c, 0x4268, 0x441d, 0x4433, 0x4458, 0x44bd, 0x4531, -+ 0x4551, 0x45c8, 0x4624, 0x4680, 0x4683, 0x46a8, 0x4718, 0x4782, -+ 0x478a, 0x48bc, 0x4a31, 0x4a65, 0x4cc9, 0x359c, 0x4ce7, 0x4d93, -+ 0x4e75, 0x4ecf, 0x359c, 0x4f84, 0x359c, 0x4fea, 0x5005, 0x478a, -+ 0x524b, 0x714c, 0x0000, 0x2021, 0x4000, 0x080c, 0x4ae3, 0x0126, -+ 0x2091, 0x8000, 0x0e04, 0x357d, 0x0010, 0x012e, 0x0cc0, 0x7c36, -+ 0x9486, 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, -+ 0x7c82, 0x7986, 0x7a8a, 0x7b8e, 0x2091, 0x4080, 0x2001, 0x0089, -+ 0x2004, 0xd084, 0x190c, 0x11d6, 0x7007, 0x0001, 0x2091, 0x5000, -+ 0x700f, 0x0000, 0x012e, 0x0005, 0x2021, 0x4001, 0x08b0, 0x2021, -+ 0x4002, 0x0898, 0x2021, 0x4003, 0x0880, 0x2021, 0x4005, 0x0868, -+ 0x2021, 0x4006, 0x0850, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, -+ 0x7a8c, 0x7884, 0x7990, 0x0804, 0x4af0, 0x7883, 0x0004, 0x7884, -+ 0x0807, 0x2039, 0x0001, 0x902e, 0x2520, 0x7b88, 0x7a8c, 0x7884, -+ 0x7990, 0x0804, 0x4af3, 0x7984, 0x7888, 0x2114, 0x200a, 0x0804, -+ 0x3573, 0x7984, 0x2114, 0x0804, 0x3573, 0x20e1, 0x0000, 0x2099, -+ 0x0021, 0x20e9, 0x0000, 0x20a1, 0x0021, 0x20a9, 0x001f, 0x4003, -+ 0x7984, 0x7a88, 0x7b8c, 0x0804, 0x3573, 0x7884, 0x2060, 0x04d8, -+ 0x2009, 0x0003, 0x2011, 0x0002, 0x2019, 0x001c, 0x789b, 0x0137, -+ 0x0804, 0x3573, 0x2039, 0x0001, 0x7d98, 0x7c9c, 0x0800, 0x2039, -+ 0x0001, 0x7d98, 0x7c9c, 0x0848, 0x79a0, 0x9182, 0x0040, 0x0210, -+ 0x0804, 0x35a8, 0x2138, 0x7d98, 0x7c9c, 0x0804, 0x35af, 0x79a0, -+ 0x9182, 0x0040, 0x0210, 0x0804, 0x35a8, 0x2138, 0x7d98, 0x7c9c, -+ 0x0804, 0x35bd, 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x35a8, -+ 0x21e8, 0x7984, 0x7888, 0x20a9, 0x0001, 0x21a0, 0x4004, 0x0804, -+ 0x3573, 0x2061, 0x0800, 0xe10c, 0x9006, 0x2c15, 0x9200, 0x8c60, -+ 0x8109, 0x1dd8, 0x2010, 0x9005, 0x0904, 0x3573, 0x0804, 0x35a2, -+ 0x79a0, 0x9182, 0x0040, 0x0210, 0x0804, 0x35a8, 0x21e0, 0x20a9, -+ 0x0001, 0x7984, 0x2198, 0x4012, 0x0804, 0x3573, 0x2069, 0x1847, -+ 0x7884, 0x7990, 0x911a, 0x1a04, 0x35a8, 0x8019, 0x0904, 0x35a8, -+ 0x684a, 0x6942, 0x788c, 0x6852, 0x7888, 0x6856, 0x9006, 0x685a, -+ 0x685e, 0x080c, 0x781e, 0x0804, 0x3573, 0x2069, 0x1847, 0x7884, -+ 0x7994, 0x911a, 0x1a04, 0x35a8, 0x8019, 0x0904, 0x35a8, 0x684e, -+ 0x6946, 0x788c, 0x6862, 0x7888, 0x6866, 0x9006, 0x686a, 0x686e, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x6ad5, 0x012e, 0x0804, 0x3573, -+ 0x902e, 0x2520, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35a5, -+ 0x7984, 0x7b88, 0x7a8c, 0x20a9, 0x0005, 0x20e9, 0x0001, 0x20a1, -+ 0x18a6, 0x4101, 0x080c, 0x4aa7, 0x1120, 0x2009, 0x0002, 0x0804, -+ 0x35a5, 0x2009, 0x0020, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, -+ 0x4af0, 0x701f, 0x368c, 0x0005, 0xa864, 0x2008, 0x9084, 0x00ff, -+ 0x9096, 0x0011, 0x0168, 0x9096, 0x0019, 0x0150, 0x9096, 0x0015, -+ 0x0138, 0x9096, 0x0048, 0x0120, 0x9096, 0x0029, 0x1904, 0x35a5, -+ 0x810f, 0x918c, 0x00ff, 0x0904, 0x35a5, 0x7112, 0x7010, 0x8001, -+ 0x0560, 0x7012, 0x080c, 0x4aa7, 0x1120, 0x2009, 0x0002, 0x0804, -+ 0x35a5, 0x2009, 0x0020, 0x7068, 0x2040, 0xa28c, 0xa390, 0xa494, -+ 0xa598, 0x9290, 0x0040, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, -+ 0x0000, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4af0, 0x701f, -+ 0x36ca, 0x0005, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0002, 0x0120, -+ 0x9096, 0x000a, 0x1904, 0x35a5, 0x0888, 0x7014, 0x2048, 0xa868, -+ 0xc0fd, 0xa86a, 0xa864, 0x9084, 0x00ff, 0x9096, 0x0029, 0x1160, -+ 0xc2fd, 0xaa7a, 0x080c, 0x6196, 0x0150, 0x0126, 0x2091, 0x8000, -+ 0xa87a, 0xa982, 0x012e, 0x0050, 0x080c, 0x64bf, 0x1128, 0x7007, -+ 0x0003, 0x701f, 0x36f6, 0x0005, 0x080c, 0x6fc0, 0x0126, 0x2091, -+ 0x8000, 0x20a9, 0x0005, 0x20e1, 0x0001, 0x2099, 0x18a6, 0x400a, -+ 0x2100, 0x9210, 0x9399, 0x0000, 0x94a1, 0x0000, 0x95a9, 0x0000, -+ 0xa85c, 0x9080, 0x0019, 0x2009, 0x0020, 0x012e, 0xaf60, 0x0804, -+ 0x4af3, 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, 0x1a22, 0x2004, 0x9005, 0x0128, -+ 0x2001, 0x008b, 0x2004, 0xd0fc, 0x0dd8, 0x2001, 0x008a, 0x2003, -+ 0x0002, 0x2003, 0x1001, 0x2071, 0x0080, 0x0804, 0x0427, 0x81ff, -+ 0x1904, 0x35a5, 0x7984, 0x080c, 0x6625, 0x1904, 0x35a8, 0x7e98, -+ 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x35a8, 0x7c88, 0x7d8c, -+ 0x080c, 0x6857, 0x080c, 0x67e8, 0x1518, 0x2061, 0x1ddc, 0x0126, -+ 0x2091, 0x8000, 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, -+ 0x0130, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, 0x0150, 0x012e, -+ 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a04, 0x35a5, -+ 0x0c30, 0x080c, 0xc443, 0x012e, 0x0904, 0x35a5, 0x0804, 0x3573, -+ 0x900e, 0x2001, 0x0005, 0x080c, 0x6fc0, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0xcb3c, 0x080c, 0x6d80, 0x012e, 0x0804, 0x3573, 0x00a6, -+ 0x2950, 0xb198, 0x080c, 0x6625, 0x1904, 0x37e1, 0xb6a4, 0x9684, -+ 0x3fff, 0x9082, 0x4000, 0x16e8, 0xb49c, 0xb5a0, 0x080c, 0x6857, -+ 0x080c, 0x6802, 0x1520, 0x2061, 0x1ddc, 0x0126, 0x2091, 0x8000, -+ 0x6000, 0x9086, 0x0000, 0x0148, 0x6014, 0x904d, 0x0130, 0xa86c, -+ 0x9406, 0x1118, 0xa870, 0x9506, 0x0158, 0x012e, 0x9ce0, 0x001c, -+ 0x2001, 0x181a, 0x2004, 0x9c02, 0x2009, 0x000d, 0x12b0, 0x0c28, -+ 0x080c, 0xc443, 0x012e, 0x2009, 0x0003, 0x0178, 0x00e0, 0x900e, -+ 0x2001, 0x0005, 0x080c, 0x6fc0, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0xcb3c, 0x080c, 0x6d74, 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, 0x35a5, 0x080c, -+ 0x4abe, 0x0904, 0x35a8, 0x080c, 0x66ec, 0x0904, 0x35a5, 0x080c, -+ 0x685d, 0x0904, 0x35a5, 0x0804, 0x4548, 0x81ff, 0x1904, 0x35a5, -+ 0x080c, 0x4ada, 0x0904, 0x35a8, 0x080c, 0x68eb, 0x0904, 0x35a5, -+ 0x2019, 0x0005, 0x79a8, 0x080c, 0x6878, 0x0904, 0x35a5, 0x7888, -+ 0x908a, 0x1000, 0x1a04, 0x35a8, 0x8003, 0x800b, 0x810b, 0x9108, -+ 0x080c, 0x864c, 0x7984, 0xd184, 0x1904, 0x3573, 0x0804, 0x4548, -+ 0x0126, 0x2091, 0x8000, 0x81ff, 0x0118, 0x2009, 0x0001, 0x0450, -+ 0x2029, 0x07ff, 0x645c, 0x2400, 0x9506, 0x01f8, 0x2508, 0x080c, -+ 0x6625, 0x11d8, 0x080c, 0x68eb, 0x1128, 0x2009, 0x0002, 0x62c0, -+ 0x2518, 0x00c0, 0x2019, 0x0004, 0x900e, 0x080c, 0x6878, 0x1118, -+ 0x2009, 0x0006, 0x0078, 0x7884, 0x908a, 0x1000, 0x1270, 0x8003, -+ 0x800b, 0x810b, 0x9108, 0x080c, 0x864c, 0x8529, 0x1ae0, 0x012e, -+ 0x0804, 0x3573, 0x012e, 0x0804, 0x35a5, 0x012e, 0x0804, 0x35a8, -+ 0x080c, 0x4abe, 0x0904, 0x35a8, 0x080c, 0x66ec, 0x0904, 0x35a5, -+ 0x080c, 0xa896, 0xbaa0, 0x2019, 0x0005, 0x00c6, 0x9066, 0x080c, -+ 0x93a5, 0x0076, 0x903e, 0x080c, 0x9277, 0x900e, 0x080c, 0xdfeb, -+ 0x007e, 0x00ce, 0x080c, 0xa8b2, 0x080c, 0x6857, 0x0804, 0x3573, -+ 0x080c, 0x4abe, 0x0904, 0x35a8, 0x080c, 0x6857, 0x2208, 0x0804, -+ 0x3573, 0x0156, 0x00d6, 0x00e6, 0x00c6, 0x2069, 0x1910, 0x6810, -+ 0x6914, 0x910a, 0x1208, 0x900e, 0x6816, 0x9016, 0x901e, 0x2071, -+ 0x19e7, 0x7028, 0x9065, 0x0118, 0x8210, 0x600c, 0x0cd8, 0x2300, -+ 0x9218, 0x00ce, 0x00ee, 0x00de, 0x015e, 0x0804, 0x3573, 0x00f6, -+ 0x0016, 0x907d, 0x0138, 0x9006, 0x8000, 0x2f0c, 0x81ff, 0x0110, -+ 0x2178, 0x0cd0, 0x001e, 0x00fe, 0x0005, 0x2069, 0x1910, 0x6910, -+ 0x62bc, 0x0804, 0x3573, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, -+ 0x35a5, 0x0126, 0x2091, 0x8000, 0x080c, 0x56ee, 0x0128, 0x2009, -+ 0x0007, 0x012e, 0x0804, 0x35a5, 0x012e, 0x615c, 0x9190, 0x3374, -+ 0x2215, 0x9294, 0x00ff, 0x637c, 0x83ff, 0x0108, 0x6280, 0x67dc, -+ 0x97c4, 0x000a, 0x98c6, 0x000a, 0x1118, 0x2031, 0x0001, 0x00e8, -+ 0x97c4, 0x0022, 0x98c6, 0x0022, 0x1118, 0x2031, 0x0003, 0x00a8, -+ 0x97c4, 0x0012, 0x98c6, 0x0012, 0x1118, 0x2031, 0x0002, 0x0068, -+ 0x080c, 0x74e9, 0x1118, 0x2031, 0x0004, 0x0038, 0xd79c, 0x0120, -+ 0x2009, 0x0005, 0x0804, 0x35a5, 0x9036, 0x7e9a, 0x7f9e, 0x0804, -+ 0x3573, 0x614c, 0x6250, 0x2019, 0x1986, 0x231c, 0x2001, 0x1987, -+ 0x2004, 0x789a, 0x0804, 0x3573, 0x0126, 0x2091, 0x8000, 0x6138, -+ 0x623c, 0x6340, 0x012e, 0x0804, 0x3573, 0x080c, 0x4ada, 0x0904, -+ 0x35a8, 0xba44, 0xbb38, 0x0804, 0x3573, 0x080c, 0x0d7d, 0x080c, -+ 0x4ada, 0x2110, 0x0904, 0x35a8, 0xb804, 0x908c, 0x00ff, 0x918e, -+ 0x0006, 0x0140, 0x9084, 0xff00, 0x9086, 0x0600, 0x2009, 0x0009, -+ 0x1904, 0x35a5, 0x0126, 0x2091, 0x8000, 0x2019, 0x0005, 0x00c6, -+ 0x9066, 0x080c, 0xa896, 0x080c, 0xa38a, 0x080c, 0x93a5, 0x0076, -+ 0x903e, 0x080c, 0x9277, 0x900e, 0x080c, 0xdfeb, 0x007e, 0x00ce, -+ 0x080c, 0xa8b2, 0xb807, 0x0407, 0x012e, 0x0804, 0x3573, 0x614c, -+ 0x6250, 0x7884, 0x604e, 0x7b88, 0x6352, 0x2069, 0x1847, 0x831f, -+ 0x9305, 0x6816, 0x788c, 0x2069, 0x1986, 0x2d1c, 0x206a, 0x7e98, -+ 0x9682, 0x0014, 0x1210, 0x2031, 0x07d0, 0x2069, 0x1987, 0x2d04, -+ 0x266a, 0x789a, 0x0804, 0x3573, 0x0126, 0x2091, 0x8000, 0x6138, -+ 0x7884, 0x603a, 0x910e, 0xd1b4, 0x190c, 0x0ecc, 0xd0c4, 0x01a8, -+ 0x00d6, 0x78a8, 0x2009, 0x199d, 0x200a, 0x78ac, 0x2011, 0x199e, -+ 0x2012, 0x2069, 0x0100, 0x6838, 0x9086, 0x0007, 0x1118, 0x2214, -+ 0x6a5a, 0x0010, 0x210c, 0x695a, 0x00de, 0x7888, 0x603e, 0x2011, -+ 0x0116, 0x220c, 0x7888, 0xd08c, 0x0118, 0x918d, 0x0040, 0x0010, -+ 0x918c, 0xff7f, 0x2112, 0x6140, 0x788c, 0x6042, 0x910e, 0xd1e4, -+ 0x190c, 0x0ee7, 0x9084, 0x0020, 0x0130, 0x78b4, 0x6046, 0x9084, -+ 0x0001, 0x090c, 0x4246, 0x6040, 0xd0cc, 0x0120, 0x78b0, 0x2011, -+ 0x0114, 0x2012, 0x012e, 0x0804, 0x3573, 0x00f6, 0x2079, 0x1800, -+ 0x7a38, 0xa898, 0x9084, 0xfebf, 0x9215, 0xa89c, 0x9084, 0xfebf, -+ 0x8002, 0x9214, 0x7838, 0x9084, 0x0140, 0x9215, 0x7a3a, 0xa897, -+ 0x4000, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x00fe, 0x0005, -+ 0x7898, 0x9005, 0x01a8, 0x7888, 0x9025, 0x0904, 0x35a8, 0x788c, -+ 0x902d, 0x0904, 0x35a8, 0x900e, 0x080c, 0x6625, 0x1120, 0xba44, -+ 0xbb38, 0xbc46, 0xbd3a, 0x9186, 0x07ff, 0x0190, 0x8108, 0x0ca0, -+ 0x080c, 0x4ada, 0x0904, 0x35a8, 0x7888, 0x900d, 0x0904, 0x35a8, -+ 0x788c, 0x9005, 0x0904, 0x35a8, 0xba44, 0xb946, 0xbb38, 0xb83a, -+ 0x0804, 0x3573, 0x2011, 0xbc09, 0x0010, 0x2011, 0xbc05, 0x080c, -+ 0x56ee, 0x1904, 0x35a5, 0x00c6, 0x2061, 0x0100, 0x7984, 0x9186, -+ 0x00ff, 0x1130, 0x2001, 0x1818, 0x2004, 0x9085, 0xff00, 0x0088, -+ 0x9182, 0x007f, 0x16e0, 0x9188, 0x3374, 0x210d, 0x918c, 0x00ff, -+ 0x2001, 0x1818, 0x2004, 0x0026, 0x9116, 0x002e, 0x0580, 0x810f, -+ 0x9105, 0x0126, 0x2091, 0x8000, 0x0006, 0x080c, 0xab97, 0x000e, -+ 0x0510, 0x602e, 0x620a, 0x7984, 0x00b6, 0x080c, 0x65ca, 0x2b08, -+ 0x00be, 0x1500, 0x6112, 0x6023, 0x0001, 0x080c, 0x4aa7, 0x01d0, -+ 0x9006, 0xa866, 0x7007, 0x0003, 0xa832, 0xa868, 0xc0fd, 0xa86a, -+ 0x701f, 0x3a55, 0x2900, 0x6016, 0x2009, 0x0032, 0x080c, 0xac8c, -+ 0x012e, 0x00ce, 0x0005, 0x012e, 0x00ce, 0x0804, 0x35a5, 0x00ce, -+ 0x0804, 0x35a8, 0x080c, 0xabed, 0x0cb0, 0xa830, 0x9086, 0x0100, -+ 0x0904, 0x35a5, 0x0804, 0x3573, 0x2061, 0x1a6f, 0x0126, 0x2091, -+ 0x8000, 0x6000, 0xd084, 0x0170, 0x6104, 0x6208, 0x2061, 0x1800, -+ 0x6354, 0x6074, 0x789a, 0x60c0, 0x789e, 0x60bc, 0x78aa, 0x012e, -+ 0x0804, 0x3573, 0x900e, 0x2110, 0x0c88, 0x81ff, 0x1904, 0x35a5, -+ 0x080c, 0x74e9, 0x0904, 0x35a5, 0x0126, 0x2091, 0x8000, 0x6254, -+ 0x6074, 0x9202, 0x0248, 0x9085, 0x0001, 0x080c, 0x2664, 0x080c, -+ 0x5908, 0x012e, 0x0804, 0x3573, 0x012e, 0x0804, 0x35a8, 0x0006, -+ 0x0016, 0x00c6, 0x00e6, 0x2001, 0x19a9, 0x2070, 0x2061, 0x1847, -+ 0x6008, 0x2072, 0x900e, 0x2011, 0x1400, 0x080c, 0x9166, 0x7206, -+ 0x00ee, 0x00ce, 0x001e, 0x000e, 0x0005, 0x0126, 0x2091, 0x8000, -+ 0x81ff, 0x0128, 0x012e, 0x2021, 0x400b, 0x0804, 0x3575, 0x7884, -+ 0xd0fc, 0x0148, 0x2001, 0x002a, 0x2004, 0x9082, 0x00e1, 0x0288, -+ 0x012e, 0x0804, 0x35a8, 0x2001, 0x002a, 0x2004, 0x2069, 0x1847, -+ 0x6908, 0x9102, 0x1230, 0x012e, 0x0804, 0x35a8, 0x012e, 0x0804, -+ 0x35a5, 0x080c, 0xab57, 0x0dd0, 0x7884, 0xd0fc, 0x0904, 0x3b20, -+ 0x00c6, 0x080c, 0x4aa7, 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, 0x3caa, -+ 0x0928, 0x7014, 0x2048, 0xad2c, 0xac28, 0xab1c, 0xaa18, 0xa930, -+ 0xa808, 0xd0b4, 0x1120, 0x2029, 0x0000, 0x2021, 0x0000, 0x8906, -+ 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, -+ 0x080c, 0x4af0, 0x701f, 0x3be7, 0x7023, 0x0001, 0x012e, 0x0005, -+ 0x080c, 0xa896, 0x0046, 0x0086, 0x0096, 0x00a6, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x080c, 0x3a8f, 0x2001, 0x199f, 0x2003, -+ 0x0000, 0x2021, 0x000a, 0x2061, 0x0100, 0x6104, 0x0016, 0x60bb, -+ 0x0000, 0x60bf, 0x32e1, 0x60bf, 0x0012, 0x080c, 0x3d19, 0x080c, -+ 0x3cd8, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e7, 0x2079, -+ 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0140, 0x2001, -+ 0x0035, 0x2004, 0x780e, 0x2001, 0x0034, 0x2004, 0x780a, 0x00de, -+ 0x2011, 0x0001, 0x080c, 0x408a, 0x008e, 0x00ee, 0x00fe, 0x080c, -+ 0x3fb7, 0x080c, 0x3ee4, 0x05b8, 0x2001, 0x020b, 0x2004, 0x9084, -+ 0x0140, 0x1db8, 0x080c, 0x40fe, 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, 0x1820, -+ 0x2004, 0x9106, 0x1168, 0x00c6, 0x2061, 0x0100, 0x6024, 0x9084, -+ 0x1e00, 0x00ce, 0x0138, 0x080c, 0x3eee, 0x080c, 0x3cd3, 0x0058, -+ 0x080c, 0x3cd3, 0x080c, 0x4022, 0x080c, 0x3fad, 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, 0x1328, 0x2009, -+ 0x0028, 0x080c, 0x21b0, 0x2001, 0x0227, 0x200c, 0x2102, 0x080c, -+ 0xa8b2, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, -+ 0x008e, 0x004e, 0x2001, 0x199f, 0x2004, 0x9005, 0x1118, 0x012e, -+ 0x0804, 0x3573, 0x012e, 0x2021, 0x400c, 0x0804, 0x3575, 0x0016, -+ 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, 0x0086, 0x0096, 0x00d6, -+ 0x0156, 0x7014, 0x2048, 0x7020, 0x20a8, 0x8000, 0x7022, 0xa804, -+ 0x9005, 0x0904, 0x3c43, 0x2048, 0x1f04, 0x3bf7, 0x7068, 0x2040, -+ 0xa28c, 0xa390, 0xa494, 0xa598, 0xa930, 0xa808, 0xd0b4, 0x1120, -+ 0x2029, 0x0000, 0x2021, 0x0000, 0x0096, 0x7014, 0x2048, 0xa864, -+ 0x009e, 0x9086, 0x0103, 0x0170, 0x8906, 0x8006, 0x8007, 0x90bc, -+ 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, 0x080c, 0x4af0, 0x701f, -+ 0x3be7, 0x00b0, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, -+ 0xffc0, 0x9080, 0x001b, 0x21a8, 0x27e0, 0x2098, 0x27e8, 0x20a0, -+ 0x0006, 0x080c, 0x0fb7, 0x000e, 0x080c, 0x4af3, 0x701f, 0x3be7, -+ 0x015e, 0x00de, 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, -+ 0x002e, 0x001e, 0x0005, 0x7014, 0x2048, 0xa864, 0x9086, 0x0103, -+ 0x1118, 0x701f, 0x3ca8, 0x0450, 0x7014, 0x2048, 0xa868, 0xc0fd, -+ 0xa86a, 0x2009, 0x007f, 0x080c, 0x65c4, 0x0110, 0x9006, 0x0030, -+ 0xb813, 0x00ff, 0xb817, 0xfffd, 0x080c, 0xcd1b, 0x015e, 0x00de, -+ 0x009e, 0x008e, 0x007e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, -+ 0x0904, 0x35a5, 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0076, -+ 0x0086, 0x0096, 0x00d6, 0x0156, 0x701f, 0x3c7a, 0x7007, 0x0003, -+ 0x0804, 0x3c38, 0xa830, 0x9086, 0x0100, 0x2021, 0x400c, 0x0904, -+ 0x3575, 0x0076, 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, 0x0fb7, 0x000e, -+ 0x080c, 0x4af3, 0x007e, 0x701f, 0x3be7, 0x7023, 0x0001, 0x0005, -+ 0x0804, 0x3573, 0x0156, 0x00c6, 0xa814, 0x908a, 0x001e, 0x0218, -+ 0xa833, 0x001e, 0x0010, 0xa832, 0x0078, 0x81ff, 0x0168, 0x0016, -+ 0x080c, 0x4aa7, 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, 0x199f, 0x2003, 0x0001, 0x0005, -+ 0x00f6, 0x00e6, 0x00c6, 0x2061, 0x0200, 0x2001, 0x19aa, 0x2004, -+ 0x601a, 0x2061, 0x0100, 0x2001, 0x19a9, 0x2004, 0x60ce, 0x6104, -+ 0xc1ac, 0x6106, 0x080c, 0x4aa7, 0xa813, 0x0019, 0xa817, 0x0001, -+ 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, 0xa866, 0x2001, 0x002f, -+ 0x2004, 0xa86a, 0x2061, 0x0090, 0x2079, 0x0100, 0x2001, 0x19a9, -+ 0x2004, 0x6036, 0x2009, 0x0040, 0x080c, 0x21b0, 0x2001, 0x002a, -+ 0x2004, 0x9084, 0xfff8, 0xa86e, 0x601a, 0xa873, 0x0000, 0x601f, -+ 0x0000, 0x78ca, 0x9006, 0x600a, 0x600e, 0x00ce, 0x00ee, 0x00fe, -+ 0x0005, 0x00e6, 0x080c, 0x4aa7, 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, 0x29e8, 0x1130, 0x9006, -+ 0x080c, 0x2945, 0x9006, 0x080c, 0x2928, 0x7884, 0x9084, 0x0007, -+ 0x0002, 0x3d64, 0x3d6d, 0x3d76, 0x3d61, 0x3d61, 0x3d61, 0x3d61, -+ 0x3d61, 0x012e, 0x0804, 0x35a8, 0x2009, 0x0114, 0x2104, 0x9085, -+ 0x0800, 0x200a, 0x080c, 0x3f38, 0x00c0, 0x2009, 0x0114, 0x2104, -+ 0x9085, 0x4000, 0x200a, 0x080c, 0x3f38, 0x0078, 0x080c, 0x74e9, -+ 0x1128, 0x012e, 0x2009, 0x0016, 0x0804, 0x35a5, 0x81ff, 0x0128, -+ 0x012e, 0x2021, 0x400b, 0x0804, 0x3575, 0x080c, 0xa896, 0x0086, -+ 0x0096, 0x00a6, 0x00b6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x080c, -+ 0x3a8f, 0x2009, 0x0101, 0x210c, 0x0016, 0x7ec8, 0x7dcc, 0x9006, -+ 0x2068, 0x2060, 0x2058, 0x080c, 0x41d9, 0x080c, 0x4129, 0x903e, -+ 0x2720, 0x00f6, 0x00e6, 0x0086, 0x2940, 0x2071, 0x19e7, 0x2079, -+ 0x0090, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, 0x0120, 0x68d4, -+ 0x780e, 0x68d0, 0x780a, 0x00de, 0x2011, 0x0001, 0x080c, 0x408a, -+ 0x080c, 0x29f0, 0x080c, 0x29f0, 0x080c, 0x29f0, 0x080c, 0x29f0, -+ 0x080c, 0x408a, 0x008e, 0x00ee, 0x00fe, 0x080c, 0x3fb7, 0x2009, -+ 0x9c40, 0x8109, 0x11b0, 0x080c, 0x3eee, 0x2001, 0x0004, 0x200c, -+ 0x918c, 0xfffd, 0x2102, 0x001e, 0x00fe, 0x00ee, 0x00de, 0x00ce, -+ 0x00be, 0x00ae, 0x009e, 0x008e, 0x2009, 0x0017, 0x080c, 0x35a5, -+ 0x0cf8, 0x2001, 0x020b, 0x2004, 0x9084, 0x0140, 0x1d10, 0x00f6, -+ 0x2079, 0x0000, 0x7884, 0x00fe, 0xd0bc, 0x0178, 0x2001, 0x0201, -+ 0x200c, 0x81ff, 0x0150, 0x080c, 0x3f95, 0x2d00, 0x9c05, 0x9b05, -+ 0x0120, 0x080c, 0x3eee, 0x0804, 0x3e97, 0x080c, 0x40fe, 0x080c, -+ 0x4022, 0x080c, 0x3f78, 0x080c, 0x3fad, 0x00f6, 0x2079, 0x0100, -+ 0x7824, 0xd0ac, 0x0130, 0x8b58, 0x080c, 0x3eee, 0x00fe, 0x0804, -+ 0x3e97, 0x00fe, 0x080c, 0x3ee4, 0x1150, 0x8d68, 0x2001, 0x0032, -+ 0x2602, 0x2001, 0x0033, 0x2502, 0x080c, 0x3eee, 0x0080, 0x87ff, -+ 0x0138, 0x2001, 0x0201, 0x2004, 0x9005, 0x1908, 0x8739, 0x0038, -+ 0x2001, 0x1a6b, 0x2004, 0x9086, 0x0000, 0x1904, 0x3de7, 0x2001, -+ 0x032f, 0x2003, 0x00f6, 0x8631, 0x1208, 0x8529, 0x2500, 0x9605, -+ 0x0904, 0x3e97, 0x7884, 0xd0bc, 0x0128, 0x2d00, 0x9c05, 0x9b05, -+ 0x1904, 0x3e97, 0xa013, 0x0019, 0x2001, 0x032a, 0x2003, 0x0004, -+ 0x7884, 0xd0ac, 0x1148, 0x2001, 0x1a6b, 0x2003, 0x0003, 0x2001, -+ 0x032a, 0x2003, 0x0009, 0x0030, 0xa017, 0x0001, 0x78b4, 0x9005, -+ 0x0108, 0xa016, 0x2800, 0xa05a, 0x2009, 0x0040, 0x080c, 0x21b0, -+ 0x2900, 0xa85a, 0xa813, 0x0019, 0x7884, 0xd0a4, 0x1180, 0xa817, -+ 0x0000, 0x00c6, 0x20a9, 0x0004, 0x2061, 0x0090, 0x602b, 0x0008, -+ 0x2001, 0x0203, 0x2004, 0x1f04, 0x3e6e, 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, 0x3da1, 0x001e, -+ 0x00c6, 0x2001, 0x032a, 0x2003, 0x0004, 0x2061, 0x0100, 0x6027, -+ 0x0002, 0x6106, 0x2011, 0x020d, 0x2013, 0x0020, 0x2001, 0x0004, -+ 0x200c, 0x918c, 0xfffd, 0x2102, 0x080c, 0x1328, 0x7884, 0x9084, -+ 0x0003, 0x9086, 0x0002, 0x01b0, 0x2009, 0x0028, 0x080c, 0x21b0, -+ 0x2001, 0x0227, 0x200c, 0x2102, 0x6050, 0x9084, 0xb7ff, 0x080c, -+ 0x2aab, 0x6052, 0x602f, 0x0000, 0x604b, 0xf7f7, 0x6043, 0x0090, -+ 0x6043, 0x0010, 0x080c, 0xa8b2, 0x00ce, 0x2d08, 0x2c10, 0x2b18, -+ 0x2b00, 0x9c05, 0x9d05, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, -+ 0x00ae, 0x009e, 0x008e, 0x1118, 0x012e, 0x0804, 0x3573, 0x012e, -+ 0x2021, 0x400c, 0x0804, 0x3575, 0x9085, 0x0001, 0x1d04, 0x3eed, -+ 0x2091, 0x6000, 0x8420, 0x9486, 0x0064, 0x0005, 0x2001, 0x0105, -+ 0x2003, 0x0010, 0x2001, 0x032a, 0x2003, 0x0004, 0x2001, 0x1a6b, -+ 0x2003, 0x0000, 0x0071, 0x2009, 0x0048, 0x080c, 0x21b0, 0x2001, -+ 0x0227, 0x2024, 0x2402, 0x2001, 0x0109, 0x2003, 0x4000, 0x9026, -+ 0x0005, 0x00f6, 0x00e6, 0x2071, 0x19e7, 0x7054, 0x9086, 0x0000, -+ 0x0520, 0x2079, 0x0090, 0x2009, 0x0206, 0x2104, 0x2009, 0x0203, -+ 0x210c, 0x9106, 0x1120, 0x2009, 0x0040, 0x080c, 0x21b0, 0x782c, -+ 0xd0fc, 0x0d88, 0x080c, 0x40fe, 0x7054, 0x9086, 0x0000, 0x1d58, -+ 0x782b, 0x0004, 0x782c, 0xd0ac, 0x1de8, 0x2009, 0x0040, 0x080c, -+ 0x21b0, 0x782b, 0x0002, 0x7057, 0x0000, 0x00ee, 0x00fe, 0x0005, -+ 0x00f6, 0x2079, 0x0100, 0x2001, 0x1818, 0x200c, 0x7932, 0x7936, -+ 0x080c, 0x2644, 0x080c, 0x2a67, 0x080c, 0x2aab, 0x784b, 0xf7f7, -+ 0x7843, 0x0090, 0x7843, 0x0010, 0x7850, 0xc0e5, 0x7852, 0x2019, -+ 0x61a8, 0x7820, 0xd09c, 0x0110, 0x8319, 0x1dd8, 0x7850, 0xc0e4, -+ 0x7852, 0x2011, 0x0048, 0x080c, 0x2a44, 0x7843, 0x0040, 0x2019, -+ 0x01f4, 0xa001, 0xa001, 0x8319, 0x1de0, 0x2001, 0x0100, 0x080c, -+ 0x2a0a, 0x2011, 0x0020, 0x080c, 0x2a44, 0x7843, 0x0000, 0x9006, -+ 0x080c, 0x2a0a, 0x2011, 0x0048, 0x080c, 0x2a44, 0x00fe, 0x0005, -+ 0x7884, 0xd0ac, 0x11c8, 0x00f6, 0x00e6, 0x2071, 0x1a6b, 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, 0x19aa, 0x2004, 0x70e2, 0x080c, 0x3cc9, -+ 0x1188, 0x2001, 0x1820, 0x2004, 0x2009, 0x181f, 0x210c, 0x918c, -+ 0x00ff, 0x706e, 0x716a, 0x7066, 0x918d, 0x3200, 0x7162, 0x7073, -+ 0xe109, 0x0080, 0x702c, 0x9085, 0x0002, 0x702e, 0x2009, 0x1818, -+ 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, 0x0092, 0x7016, 0x080c, 0x40fe, 0x00f6, 0x2071, -+ 0x1a6b, 0x2079, 0x0320, 0x00d6, 0x2069, 0x0000, 0x6884, 0xd0b4, -+ 0x0120, 0x689c, 0x780e, 0x6898, 0x780a, 0x00de, 0x2009, 0x03e8, -+ 0x8109, 0x1df0, 0x792c, 0xd1fc, 0x0110, 0x782b, 0x0004, 0x2011, -+ 0x0011, 0x080c, 0x408a, 0x2011, 0x0001, 0x080c, 0x408a, 0x00fe, -+ 0x00ee, 0x0005, 0x00f6, 0x00e6, 0x2071, 0x1a6b, 0x2079, 0x0320, -+ 0x792c, 0xd1fc, 0x0904, 0x4087, 0x782b, 0x0002, 0x9026, 0xd19c, -+ 0x1904, 0x4083, 0x7000, 0x0002, 0x4087, 0x4038, 0x4068, 0x4083, -+ 0xd1bc, 0x1170, 0xd1dc, 0x1190, 0x8001, 0x7002, 0x2011, 0x0001, -+ 0x080c, 0x408a, 0x0904, 0x4087, 0x080c, 0x408a, 0x0804, 0x4087, -+ 0x00f6, 0x2079, 0x0300, 0x78bf, 0x0000, 0x00fe, 0x7810, 0x7914, -+ 0x782b, 0x0004, 0x7812, 0x7916, 0x2001, 0x0201, 0x200c, 0x81ff, -+ 0x0de8, 0x080c, 0x3f95, 0x2009, 0x0001, 0x00f6, 0x2079, 0x0300, -+ 0x78b8, 0x00fe, 0xd0ec, 0x0110, 0x2009, 0x0011, 0x792a, 0x00f8, -+ 0x8001, 0x7002, 0x9184, 0x0880, 0x1140, 0x782c, 0xd0fc, 0x1904, -+ 0x402c, 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, 0x0550, 0x8001, 0x0036, 0x0096, -+ 0xa016, 0xa058, 0x2048, 0xa010, 0x2009, 0x0031, 0x911a, 0x831c, -+ 0x831c, 0x938a, 0x0007, 0x1a0c, 0x0d7d, 0x9398, 0x40b8, 0x231d, -+ 0x083f, 0x9080, 0x0004, 0x7a2a, 0x7100, 0x8108, 0x7102, 0x009e, -+ 0x003e, 0x908a, 0x0035, 0x1140, 0x0096, 0xa058, 0x2048, 0xa804, -+ 0xa05a, 0x2001, 0x0019, 0x009e, 0xa012, 0x9085, 0x0001, 0x0005, -+ 0x40f5, 0x40ec, 0x40e3, 0x40da, 0x40d1, 0x40c8, 0x40bf, 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, 0xa9a4, 0x7902, 0xa9a8, 0x7906, 0xa9ac, -+ 0x7912, 0xa9b0, 0x7916, 0x0005, 0xa9b4, 0x7902, 0xa9b8, 0x7906, -+ 0xa9bc, 0x7912, 0xa9c0, 0x7916, 0x0005, 0xa9c4, 0x7902, 0xa9c8, -+ 0x7906, 0xa9cc, 0x7912, 0xa9d0, 0x7916, 0x0005, 0x00f6, 0x00e6, -+ 0x0086, 0x2071, 0x19e7, 0x2079, 0x0090, 0x792c, 0xd1fc, 0x01e8, -+ 0x782b, 0x0002, 0x2940, 0x9026, 0x7054, 0x0002, 0x4125, 0x4111, -+ 0x411c, 0x8001, 0x7056, 0xd19c, 0x1180, 0x2011, 0x0001, 0x080c, -+ 0x408a, 0x190c, 0x408a, 0x0048, 0x8001, 0x7056, 0x782c, 0xd0fc, -+ 0x1d38, 0x2011, 0x0001, 0x080c, 0x408a, 0x008e, 0x00ee, 0x00fe, -+ 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x2061, 0x0200, 0x2001, -+ 0x19aa, 0x2004, 0x601a, 0x2061, 0x0100, 0x2001, 0x19a9, 0x2004, -+ 0x60ce, 0x6104, 0xc1ac, 0x6106, 0x2001, 0x002c, 0x2004, 0x9005, -+ 0x0520, 0x2038, 0x2001, 0x002e, 0x2024, 0x2001, 0x002f, 0x201c, -+ 0x080c, 0x4aa7, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, -+ 0x0007, 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, -+ 0x0096, 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, -+ 0x41a1, 0x1d68, 0x2900, 0xa85a, 0x00d0, 0x080c, 0x4aa7, 0xa813, -+ 0x0019, 0xa817, 0x0001, 0x2900, 0xa85a, 0x2001, 0x002e, 0x2004, -+ 0xa866, 0x2001, 0x002f, 0x2004, 0xa86a, 0x2001, 0x002a, 0x2004, -+ 0x9084, 0xfff8, 0xa86e, 0x2001, 0x002b, 0x2004, 0xa872, 0x2061, -+ 0x0090, 0x2079, 0x0100, 0x2001, 0x19a9, 0x2004, 0x6036, 0x2009, -+ 0x0040, 0x080c, 0x21b0, 0x2001, 0x002a, 0x2004, 0x9084, 0xfff8, -+ 0x601a, 0x0006, 0x2001, 0x002b, 0x2004, 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, 0x4aa7, 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, 0x4aa7, -+ 0x2940, 0xa813, 0x0019, 0xaf16, 0x2900, 0xa85a, 0x978a, 0x0007, -+ 0x0220, 0x2138, 0x2009, 0x0007, 0x0010, 0x2708, 0x903e, 0x0096, -+ 0xa858, 0x2048, 0xa85c, 0x9080, 0x0019, 0x009e, 0x080c, 0x41a1, -+ 0x1d68, 0x2900, 0xa85a, 0x00d8, 0x080c, 0x4aa7, 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, 0x1a6b, -+ 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, 0x0007, 0x20a1, 0x1840, 0x20e9, 0x0001, 0x9006, -+ 0x4004, 0x20a9, 0x000c, 0x20a1, 0xfff4, 0x20e9, 0x0000, 0x9006, -+ 0x4004, 0x2009, 0x013c, 0x200a, 0x012e, 0x7880, 0x9086, 0x0052, -+ 0x0108, 0x0005, 0x0804, 0x3573, 0x7d98, 0x7c9c, 0x0804, 0x366a, -+ 0x080c, 0x74e9, 0x190c, 0x5fee, 0x6040, 0x9084, 0x0020, 0x09b1, -+ 0x2069, 0x1847, 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, -+ 0x7d98, 0x2039, 0x0001, 0x080c, 0x4af0, 0x701f, 0x4280, 0x0005, -+ 0x080c, 0x56e9, 0x1130, 0x3b00, 0x3a08, 0xc194, 0xc095, 0x20d8, -+ 0x21d0, 0x2069, 0x1847, 0x6800, 0x9005, 0x0904, 0x35a8, 0x6804, -+ 0xd0ac, 0x0118, 0xd0a4, 0x0904, 0x35a8, 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, 0x35a8, 0x9288, 0x3374, 0x210d, 0x918c, 0x00ff, 0x6166, -+ 0xd0dc, 0x0130, 0x6828, 0x908a, 0x007f, 0x1a04, 0x35a8, 0x605e, -+ 0x6888, 0x9084, 0x0030, 0x8004, 0x8004, 0x8004, 0x8004, 0x0006, -+ 0x2009, 0x19b1, 0x9080, 0x2737, 0x2005, 0x200a, 0x2008, 0x2001, -+ 0x0018, 0x080c, 0xa887, 0x2009, 0x0390, 0x200b, 0x0400, 0x000e, -+ 0x2009, 0x19b2, 0x9080, 0x273b, 0x2005, 0x200a, 0x6808, 0x908a, -+ 0x0100, 0x0a04, 0x35a8, 0x908a, 0x0841, 0x1a04, 0x35a8, 0x9084, -+ 0x0007, 0x1904, 0x35a8, 0x680c, 0x9005, 0x0904, 0x35a8, 0x6810, -+ 0x9005, 0x0904, 0x35a8, 0x6848, 0x6940, 0x910a, 0x1a04, 0x35a8, -+ 0x8001, 0x0904, 0x35a8, 0x684c, 0x6944, 0x910a, 0x1a04, 0x35a8, -+ 0x8001, 0x0904, 0x35a8, 0x6814, 0x908c, 0x00ff, 0x614e, 0x8007, -+ 0x9084, 0x00ff, 0x6052, 0x080c, 0x781e, 0x080c, 0x6aa1, 0x080c, -+ 0x6ad5, 0x6808, 0x602a, 0x080c, 0x2122, 0x2009, 0x0170, 0x200b, -+ 0x0080, 0xa001, 0xa001, 0x200b, 0x0000, 0x0036, 0x6b08, 0x080c, -+ 0x269e, 0x003e, 0x6000, 0x9086, 0x0000, 0x1904, 0x440b, 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, 0x19b3, 0x20e9, 0x0001, 0x4001, -+ 0x20a9, 0x0004, 0x20a1, 0x19cd, 0x20e9, 0x0001, 0x4001, 0x080c, -+ 0x87d1, 0x00c6, 0x900e, 0x20a9, 0x0001, 0x6b70, 0xd384, 0x01c8, -+ 0x0020, 0x839d, 0x12b0, 0x3508, 0x8109, 0x080c, 0x7ddf, 0x6878, -+ 0x6016, 0x6874, 0x2008, 0x9084, 0xff00, 0x8007, 0x600a, 0x9184, -+ 0x00ff, 0x6006, 0x8108, 0x1118, 0x6003, 0x0003, 0x0010, 0x6003, -+ 0x0001, 0x1f04, 0x4369, 0x00ce, 0x00c6, 0x2061, 0x199c, 0x6a88, -+ 0x9284, 0xc000, 0x2010, 0x9286, 0x0000, 0x1158, 0x2063, 0x0000, -+ 0x2001, 0x0001, 0x080c, 0x2945, 0x2001, 0x0001, 0x080c, 0x2928, -+ 0x0088, 0x9286, 0x4000, 0x1148, 0x2063, 0x0001, 0x9006, 0x080c, -+ 0x2945, 0x9006, 0x080c, 0x2928, 0x0028, 0x9286, 0x8000, 0x1d30, -+ 0x2063, 0x0002, 0x00ce, 0x00e6, 0x2c70, 0x080c, 0x0eb4, 0x00ee, -+ 0x6888, 0xd0ec, 0x0130, 0x2011, 0x0114, 0x2204, 0x9085, 0x0180, -+ 0x2012, 0x6a80, 0x9284, 0x0030, 0x9086, 0x0030, 0x1128, 0x9294, -+ 0xffcf, 0x9295, 0x0020, 0x6a82, 0x2001, 0x197c, 0x6a80, 0x9294, -+ 0x0030, 0x928e, 0x0000, 0x0170, 0x928e, 0x0010, 0x0118, 0x928e, -+ 0x0020, 0x0140, 0x2003, 0xaaaa, 0x080c, 0x2713, 0x2001, 0x196d, -+ 0x2102, 0x0008, 0x2102, 0x00c6, 0x2061, 0x0100, 0x602f, 0x0040, -+ 0x602f, 0x0000, 0x00ce, 0x080c, 0x74e9, 0x0128, 0x080c, 0x4fde, -+ 0x0110, 0x080c, 0x2664, 0x60d4, 0x9005, 0x01c0, 0x6003, 0x0001, -+ 0x2009, 0x43f3, 0x00e0, 0x080c, 0x74e9, 0x1168, 0x2011, 0x735f, -+ 0x080c, 0x863e, 0x2011, 0x7352, 0x080c, 0x874a, 0x080c, 0x77f2, -+ 0x080c, 0x741a, 0x0040, 0x080c, 0x5ee4, 0x0028, 0x6003, 0x0004, -+ 0x2009, 0x440b, 0x0020, 0x080c, 0x69cd, 0x0804, 0x3573, 0x2001, -+ 0x0170, 0x2004, 0x9084, 0x00ff, 0x9086, 0x004c, 0x1118, 0x2091, -+ 0x31bd, 0x0817, 0x2091, 0x313d, 0x0817, 0x6000, 0x9086, 0x0000, -+ 0x0904, 0x35a5, 0x2069, 0x1847, 0x7890, 0x6842, 0x7894, 0x6846, -+ 0x2d00, 0x2009, 0x0030, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, -+ 0x0001, 0x0804, 0x4af3, 0x9006, 0x080c, 0x2664, 0x81ff, 0x1904, -+ 0x35a5, 0x080c, 0x74e9, 0x11b0, 0x080c, 0x77ed, 0x080c, 0x6029, -+ 0x080c, 0x3368, 0x0118, 0x6130, 0xc18d, 0x6132, 0x080c, 0xcf52, -+ 0x0130, 0x080c, 0x750c, 0x1118, 0x080c, 0x74bd, 0x0038, 0x080c, -+ 0x741a, 0x0020, 0x080c, 0x5fee, 0x080c, 0x5ee4, 0x0804, 0x3573, -+ 0x81ff, 0x1904, 0x35a5, 0x080c, 0x74e9, 0x1110, 0x0804, 0x35a5, -+ 0x6194, 0x81ff, 0x01a8, 0x704f, 0x0000, 0x2001, 0x1d80, 0x2009, -+ 0x0040, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0126, 0x2091, 0x8000, -+ 0x2039, 0x0001, 0x080c, 0x4af3, 0x701f, 0x3571, 0x012e, 0x0005, -+ 0x704f, 0x0001, 0x00d6, 0x2069, 0x1d80, 0x20a9, 0x0040, 0x20e9, -+ 0x0001, 0x20a1, 0x1d80, 0x2019, 0xffff, 0x4304, 0x655c, 0x9588, -+ 0x3374, 0x210d, 0x918c, 0x00ff, 0x216a, 0x900e, 0x2011, 0x0002, -+ 0x2100, 0x9506, 0x01a8, 0x080c, 0x6625, 0x1190, 0xb814, 0x821c, -+ 0x0238, 0x9398, 0x1d80, 0x9085, 0xff00, 0x8007, 0x201a, 0x0038, -+ 0x9398, 0x1d80, 0x2324, 0x94a4, 0xff00, 0x9405, 0x201a, 0x8210, -+ 0x8108, 0x9182, 0x0080, 0x1208, 0x0c18, 0x8201, 0x8007, 0x2d0c, -+ 0x9105, 0x206a, 0x00de, 0x20a9, 0x0040, 0x20a1, 0x1d80, 0x2099, -+ 0x1d80, 0x080c, 0x5f79, 0x0804, 0x4465, 0x080c, 0x4ada, 0x0904, -+ 0x35a8, 0x080c, 0x4aa7, 0x1120, 0x2009, 0x0002, 0x0804, 0x35a5, -+ 0x080c, 0x56da, 0xd0b4, 0x0558, 0x7884, 0x908e, 0x007e, 0x0538, -+ 0x908e, 0x007f, 0x0520, 0x908e, 0x0080, 0x0508, 0x080c, 0x3363, -+ 0x1148, 0xb800, 0xd08c, 0x11d8, 0xb804, 0x9084, 0x00ff, 0x9086, -+ 0x0006, 0x11a8, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, -+ 0xca07, 0x1120, 0x2009, 0x0003, 0x0804, 0x35a5, 0x7007, 0x0003, -+ 0x701f, 0x44f3, 0x0005, 0x080c, 0x4ada, 0x0904, 0x35a8, 0x20a9, -+ 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, 0xa85c, -+ 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, 0x0006, -+ 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, 0x080c, -+ 0x0fb7, 0x0070, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x000a, 0x20a0, -+ 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fb7, -+ 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, -+ 0x0002, 0x2009, 0x002b, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, -+ 0x4af3, 0x81ff, 0x1904, 0x35a5, 0x080c, 0x4abe, 0x0904, 0x35a8, -+ 0x080c, 0x6866, 0x0904, 0x35a5, 0x0058, 0xa878, 0x9005, 0x0120, -+ 0x2009, 0x0004, 0x0804, 0x35a5, 0xa974, 0xaa94, 0x0804, 0x3573, -+ 0x080c, 0x56e2, 0x0904, 0x3573, 0x701f, 0x453d, 0x7007, 0x0003, -+ 0x0005, 0x81ff, 0x1904, 0x35a5, 0x7888, 0x908a, 0x1000, 0x1a04, -+ 0x35a8, 0x080c, 0x4ada, 0x0904, 0x35a8, 0x080c, 0x6a6b, 0x0120, -+ 0x080c, 0x6a73, 0x1904, 0x35a8, 0x080c, 0x68eb, 0x0904, 0x35a5, -+ 0x2019, 0x0004, 0x900e, 0x080c, 0x6878, 0x0904, 0x35a5, 0x7984, -+ 0x7a88, 0x04c9, 0x08a8, 0xa89c, 0x908a, 0x1000, 0x12f8, 0x080c, -+ 0x4ad8, 0x01e0, 0x080c, 0x6a6b, 0x0118, 0x080c, 0x6a73, 0x11b0, -+ 0x080c, 0x68eb, 0x2009, 0x0002, 0x0168, 0x2009, 0x0002, 0x2019, -+ 0x0004, 0x080c, 0x6878, 0x2009, 0x0003, 0x0120, 0xa998, 0xaa9c, -+ 0x00d1, 0x0060, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, -+ 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, -+ 0x080c, 0x56e2, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, -+ 0x2001, 0x0000, 0x0005, 0x9186, 0x00ff, 0x0110, 0x0071, 0x0060, -+ 0x2029, 0x007e, 0x2061, 0x1800, 0x645c, 0x2400, 0x9506, 0x0110, -+ 0x2508, 0x0019, 0x8529, 0x1ec8, 0x0005, 0x080c, 0x6625, 0x1138, -+ 0x2200, 0x8003, 0x800b, 0x810b, 0x9108, 0x080c, 0x864c, 0x0005, -+ 0x81ff, 0x1904, 0x35a5, 0x798c, 0x2001, 0x1980, 0x918c, 0x8000, -+ 0x2102, 0x080c, 0x4abe, 0x0904, 0x35a8, 0x080c, 0x6a6b, 0x0120, -+ 0x080c, 0x6a73, 0x1904, 0x35a8, 0x080c, 0x66ec, 0x0904, 0x35a5, -+ 0x080c, 0x686f, 0x0904, 0x35a5, 0x2001, 0x1980, 0x2004, 0xd0fc, -+ 0x1904, 0x3573, 0x0804, 0x4548, 0xa9a0, 0x2001, 0x1980, 0x918c, -+ 0x8000, 0xc18d, 0x2102, 0x080c, 0x4acb, 0x01a0, 0x080c, 0x6a6b, -+ 0x0118, 0x080c, 0x6a73, 0x1170, 0x080c, 0x66ec, 0x2009, 0x0002, -+ 0x0128, 0x080c, 0x686f, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, -+ 0xa99a, 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, -+ 0x0030, 0x0005, 0xa897, 0x4000, 0x2001, 0x1980, 0x2004, 0xd0fc, -+ 0x1128, 0x080c, 0x56e2, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, -+ 0x0001, 0x2001, 0x0000, 0x0005, 0x81ff, 0x1904, 0x35a5, 0x798c, -+ 0x2001, 0x197f, 0x918c, 0x8000, 0x2102, 0x080c, 0x4abe, 0x0904, -+ 0x35a8, 0x080c, 0x6a6b, 0x0120, 0x080c, 0x6a73, 0x1904, 0x35a8, -+ 0x080c, 0x66ec, 0x0904, 0x35a5, 0x080c, 0x685d, 0x0904, 0x35a5, -+ 0x2001, 0x197f, 0x2004, 0xd0fc, 0x1904, 0x3573, 0x0804, 0x4548, -+ 0xa9a0, 0x2001, 0x197f, 0x918c, 0x8000, 0xc18d, 0x2102, 0x080c, -+ 0x4acb, 0x01a0, 0x080c, 0x6a6b, 0x0118, 0x080c, 0x6a73, 0x1170, -+ 0x080c, 0x66ec, 0x2009, 0x0002, 0x0128, 0x080c, 0x685d, 0x1170, -+ 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, 0x0010, 0xa897, 0x4006, -+ 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x0005, 0xa897, 0x4000, -+ 0x2001, 0x197f, 0x2004, 0xd0fc, 0x1128, 0x080c, 0x56e2, 0x0110, -+ 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, 0x2001, 0x0000, 0x0005, -+ 0x6100, 0x0804, 0x3573, 0x080c, 0x4ada, 0x0904, 0x35a8, 0x080c, -+ 0x56ee, 0x1904, 0x35a5, 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, 0x3573, -+ 0x78a8, 0x909c, 0x0003, 0xd0b4, 0x1140, 0x939a, 0x0003, 0x1a04, -+ 0x35a5, 0x625c, 0x7884, 0x9206, 0x1548, 0x080c, 0x87bb, 0x2001, -+ 0xfff4, 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x2039, -+ 0x0000, 0x0006, 0x78a8, 0x9084, 0x0080, 0x1118, 0x000e, 0x0804, -+ 0x4af3, 0x000e, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, 0xa66a, -+ 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, -+ 0x1124, 0x7007, 0x0002, 0x701f, 0x46fe, 0x0005, 0x81ff, 0x1904, -+ 0x35a5, 0x080c, 0x4ada, 0x0904, 0x35a8, 0x080c, 0x6a6b, 0x1904, -+ 0x35a5, 0x00c6, 0x080c, 0x4aa7, 0x00ce, 0x0904, 0x35a5, 0xa867, -+ 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x7ea8, 0x080c, 0xc9ad, 0x0904, -+ 0x35a5, 0x7007, 0x0003, 0x701f, 0x4702, 0x0005, 0x080c, 0x4246, -+ 0x0804, 0x3573, 0xa830, 0x9086, 0x0100, 0x0904, 0x35a5, 0x8906, -+ 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x001b, -+ 0x2009, 0x000c, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x0804, 0x4af3, -+ 0x9006, 0x080c, 0x2664, 0x78a8, 0x9084, 0x00ff, 0x9086, 0x00ff, -+ 0x0118, 0x81ff, 0x1904, 0x35a5, 0x080c, 0x74e9, 0x0110, 0x080c, -+ 0x5fee, 0x7888, 0x908a, 0x1000, 0x1a04, 0x35a8, 0x7984, 0x9186, -+ 0x00ff, 0x0138, 0x9182, 0x007f, 0x1a04, 0x35a8, 0x2100, 0x080c, -+ 0x262e, 0x0026, 0x00c6, 0x0126, 0x2091, 0x8000, 0x2061, 0x1a03, -+ 0x601b, 0x0000, 0x601f, 0x0000, 0x6073, 0x0000, 0x6077, 0x0000, -+ 0x080c, 0x74e9, 0x1158, 0x080c, 0x77ed, 0x080c, 0x6029, 0x9085, -+ 0x0001, 0x080c, 0x7530, 0x080c, 0x741a, 0x00f0, 0x080c, 0xa896, -+ 0x080c, 0xab5e, 0x080c, 0xa8b2, 0x2061, 0x0100, 0x2001, 0x1818, -+ 0x2004, 0x9084, 0x00ff, 0x810f, 0x9105, 0x604a, 0x6043, 0x0090, -+ 0x6043, 0x0010, 0x2009, 0x1999, 0x200b, 0x0000, 0x2009, 0x002d, -+ 0x2011, 0x5f14, 0x080c, 0x8708, 0x7984, 0x080c, 0x74e9, 0x1110, -+ 0x2009, 0x00ff, 0x7a88, 0x080c, 0x45ab, 0x012e, 0x00ce, 0x002e, -+ 0x0804, 0x3573, 0x7984, 0x080c, 0x65c4, 0x2b08, 0x1904, 0x35a8, -+ 0x0804, 0x3573, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35a5, -+ 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, 0x0005, 0x0804, -+ 0x35a5, 0x080c, 0x4aa7, 0x1120, 0x2009, 0x0002, 0x0804, 0x35a5, -+ 0x7984, 0x9192, 0x0021, 0x1a04, 0x35a8, 0x7a8c, 0x7b88, 0x7c9c, -+ 0x7d98, 0xa85c, 0x9080, 0x0019, 0x702a, 0xaf60, 0x7736, 0x080c, -+ 0x4af0, 0x701f, 0x47ba, 0x7880, 0x9086, 0x006e, 0x0110, 0x701f, -+ 0x5190, 0x0005, 0x2009, 0x0080, 0x080c, 0x6625, 0x1118, 0x080c, -+ 0x6a6b, 0x0120, 0x2021, 0x400a, 0x0804, 0x3575, 0x00d6, 0x0096, -+ 0xa964, 0xaa6c, 0xab70, 0xac74, 0xad78, 0xae7c, 0xa884, 0x90be, -+ 0x0100, 0x0904, 0x4853, 0x90be, 0x0112, 0x0904, 0x4853, 0x90be, -+ 0x0113, 0x0904, 0x4853, 0x90be, 0x0114, 0x0904, 0x4853, 0x90be, -+ 0x0117, 0x0904, 0x4853, 0x90be, 0x011a, 0x0904, 0x4853, 0x90be, -+ 0x011c, 0x0904, 0x4853, 0x90be, 0x0121, 0x0904, 0x483a, 0x90be, -+ 0x0131, 0x0904, 0x483a, 0x90be, 0x0171, 0x0904, 0x4853, 0x90be, -+ 0x0173, 0x0904, 0x4853, 0x90be, 0x01a1, 0x1128, 0xa894, 0x8007, -+ 0xa896, 0x0804, 0x485e, 0x90be, 0x0212, 0x0904, 0x4847, 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, -+ 0x35a8, 0x7028, 0x9080, 0x0010, 0x2098, 0x20a0, 0x7034, 0x20e0, -+ 0x20e8, 0x20a9, 0x0007, 0x080c, 0x489c, 0x7028, 0x9080, 0x000e, -+ 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, -+ 0x489c, 0x00c8, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, 0x7034, -+ 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x080c, 0x48a9, 0x00b8, 0x7028, -+ 0x9080, 0x000e, 0x2098, 0x20a0, 0x7034, 0x20e0, 0x20e8, 0x20a9, -+ 0x0001, 0x080c, 0x48a9, 0x7028, 0x9080, 0x000c, 0x2098, 0x20a0, -+ 0x7034, 0x20e0, 0x20e8, 0x20a9, 0x0001, 0x04f1, 0x00c6, 0x080c, -+ 0x4aa7, 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, 0xc9c8, 0x1120, 0x2009, 0x0003, 0x0804, 0x35a5, 0x7007, -+ 0x0003, 0x701f, 0x4893, 0x0005, 0x00ce, 0x009e, 0x00de, 0x2009, -+ 0x0002, 0x0804, 0x35a5, 0xa820, 0x9086, 0x8001, 0x1904, 0x3573, -+ 0x2009, 0x0004, 0x0804, 0x35a5, 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, 0x35a5, 0x60dc, 0xd0ac, 0x1130, 0xd09c, 0x1120, 0x2009, -+ 0x0005, 0x0804, 0x35a5, 0x7984, 0x78a8, 0x2040, 0x080c, 0xab57, -+ 0x1120, 0x9182, 0x007f, 0x0a04, 0x35a8, 0x9186, 0x00ff, 0x0904, -+ 0x35a8, 0x9182, 0x0800, 0x1a04, 0x35a8, 0x7a8c, 0x7b88, 0x607c, -+ 0x9306, 0x1140, 0x6080, 0x924e, 0x0904, 0x35a8, 0x99cc, 0xff00, -+ 0x0904, 0x35a8, 0x0126, 0x2091, 0x8000, 0x080c, 0x49ba, 0x0904, -+ 0x493a, 0x0086, 0x90c6, 0x4000, 0x008e, 0x1538, 0x00c6, 0x0006, -+ 0x0036, 0xb818, 0xbb1c, 0x9305, 0xbb20, 0x9305, 0xbb24, 0x9305, -+ 0xbb28, 0x9305, 0xbb2c, 0x9305, 0xbb30, 0x9305, 0xbb34, 0x9305, -+ 0x003e, 0x0570, 0xd88c, 0x1128, 0x080c, 0x6a6b, 0x0110, 0xc89d, -+ 0x0438, 0x900e, 0x080c, 0x6914, 0x1108, 0xc185, 0xb800, 0xd0bc, -+ 0x0108, 0xc18d, 0x000e, 0x00ce, 0x00b8, 0x90c6, 0x4007, 0x1110, -+ 0x2408, 0x0090, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, 0x0060, -+ 0x90c6, 0x4009, 0x1108, 0x0040, 0x90c6, 0x4006, 0x1108, 0x0020, -+ 0x2001, 0x4005, 0x2009, 0x000a, 0x2020, 0x012e, 0x0804, 0x3575, -+ 0x000e, 0x00ce, 0x2b00, 0x7026, 0x0016, 0x00b6, 0x00c6, 0x00e6, -+ 0x2c70, 0x080c, 0xac5f, 0x0904, 0x498f, 0x2b00, 0x6012, 0x080c, -+ 0xcccc, 0x2e58, 0x00ee, 0x00e6, 0x00c6, 0x080c, 0x4aa7, 0x00ce, -+ 0x2b70, 0x1158, 0x080c, 0xabed, 0x00ee, 0x00ce, 0x00be, 0x001e, -+ 0x012e, 0x2009, 0x0002, 0x0804, 0x35a5, 0x900e, 0xa966, 0xa96a, -+ 0x2900, 0x6016, 0xa932, 0xa868, 0xc0fd, 0xd88c, 0x0108, 0xc0f5, -+ 0xa86a, 0xd89c, 0x1110, 0x080c, 0x31e7, 0x6023, 0x0001, 0x9006, -+ 0x080c, 0x6561, 0xd89c, 0x0138, 0x2001, 0x0004, 0x080c, 0x6575, -+ 0x2009, 0x0003, 0x0030, 0x2001, 0x0002, 0x080c, 0x6575, 0x2009, -+ 0x0002, 0x080c, 0xac8c, 0x78a8, 0xd094, 0x0138, 0x00ee, 0x7024, -+ 0x00e6, 0x2058, 0xb8d4, 0xc08d, 0xb8d6, 0x9085, 0x0001, 0x00ee, -+ 0x00ce, 0x00be, 0x001e, 0x012e, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x35a5, 0x7007, 0x0003, 0x701f, 0x499e, 0x0005, 0xa830, 0x9086, -+ 0x0100, 0x7024, 0x2058, 0x1138, 0x2009, 0x0004, 0xba04, 0x9294, -+ 0x00ff, 0x0804, 0x5637, 0x900e, 0xa868, 0xd0f4, 0x1904, 0x3573, -+ 0x080c, 0x6914, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0x0804, 0x3573, 0x00e6, 0x00d6, 0x0096, 0x83ff, 0x0904, 0x4a09, -+ 0x902e, 0x080c, 0xab57, 0x0130, 0x9026, 0x20a9, 0x0800, 0x2071, -+ 0x1000, 0x0030, 0x2021, 0x007f, 0x20a9, 0x0781, 0x2071, 0x107f, -+ 0x2e04, 0x9005, 0x11b8, 0x2100, 0x9406, 0x1904, 0x4a1a, 0x2428, -+ 0x94ce, 0x007f, 0x1120, 0x92ce, 0xfffd, 0x1558, 0x0030, 0x94ce, -+ 0x0080, 0x1130, 0x92ce, 0xfffc, 0x1520, 0x93ce, 0x00ff, 0x1508, -+ 0xc5fd, 0x0480, 0x2058, 0xbf10, 0x2700, 0x9306, 0x11e8, 0xbe14, -+ 0x2600, 0x9206, 0x11c8, 0x2400, 0x9106, 0x1180, 0xd884, 0x0598, -+ 0xd894, 0x1588, 0x080c, 0x6a0b, 0x1570, 0x2001, 0x4000, 0x0460, -+ 0x080c, 0x6a6b, 0x1540, 0x2001, 0x4000, 0x0430, 0x2001, 0x4007, -+ 0x0418, 0x2001, 0x4006, 0x0400, 0x2400, 0x9106, 0x1158, 0xbe14, -+ 0x87ff, 0x1128, 0x86ff, 0x0918, 0x080c, 0xab57, 0x1900, 0x2001, -+ 0x4008, 0x0090, 0x8420, 0x8e70, 0x1f04, 0x49d0, 0x85ff, 0x1130, -+ 0x2001, 0x4009, 0x0048, 0x2001, 0x0001, 0x0030, 0x080c, 0x65c4, -+ 0x1dd0, 0xbb12, 0xba16, 0x9006, 0x9005, 0x009e, 0x00de, 0x00ee, -+ 0x0005, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35a5, 0x080c, -+ 0x4aa7, 0x1120, 0x2009, 0x0002, 0x0804, 0x35a5, 0xa867, 0x0000, -+ 0xa868, 0xc0fd, 0xa86a, 0x7884, 0x9005, 0x0904, 0x35a8, 0x9096, -+ 0x00ff, 0x0120, 0x9092, 0x0004, 0x1a04, 0x35a8, 0x2010, 0x2918, -+ 0x080c, 0x3181, 0x1120, 0x2009, 0x0003, 0x0804, 0x35a5, 0x7007, -+ 0x0003, 0x701f, 0x4a5c, 0x0005, 0xa830, 0x9086, 0x0100, 0x1904, -+ 0x3573, 0x2009, 0x0004, 0x0804, 0x35a5, 0x7984, 0x080c, 0xab57, -+ 0x1120, 0x9182, 0x007f, 0x0a04, 0x35a8, 0x9186, 0x00ff, 0x0904, -+ 0x35a8, 0x9182, 0x0800, 0x1a04, 0x35a8, 0x2001, 0x9000, 0x080c, -+ 0x5692, 0x1904, 0x35a5, 0x0804, 0x3573, 0xa998, 0x080c, 0xab57, -+ 0x1118, 0x9182, 0x007f, 0x0280, 0x9186, 0x00ff, 0x0168, 0x9182, -+ 0x0800, 0x1250, 0x2001, 0x9000, 0x080c, 0x5692, 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, -+ 0x103a, 0x0198, 0x9006, 0xa802, 0x7014, 0x9005, 0x1120, 0x2900, -+ 0x7016, 0x701a, 0x0040, 0x7018, 0xa802, 0x0086, 0x2040, 0x2900, -+ 0xa006, 0x701a, 0x008e, 0x9085, 0x0001, 0x0005, 0x7984, 0x080c, -+ 0x6625, 0x1130, 0x7e88, 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, -+ 0x905e, 0x8bff, 0x0005, 0xa998, 0x080c, 0x6625, 0x1130, 0xae9c, -+ 0x9684, 0x3fff, 0x9082, 0x4000, 0x0208, 0x905e, 0x8bff, 0x0005, -+ 0xae98, 0x0008, 0x7e84, 0x2608, 0x080c, 0x6625, 0x1108, 0x0008, -+ 0x905e, 0x8bff, 0x0005, 0x0016, 0x7114, 0x81ff, 0x0128, 0x2148, -+ 0xa904, 0x080c, 0x106c, 0x0cc8, 0x7116, 0x711a, 0x001e, 0x0005, -+ 0x2031, 0x0001, 0x0010, 0x2031, 0x0000, 0x2061, 0x18b8, 0x2c44, -+ 0xa66a, 0xa17a, 0xa772, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, -+ 0x080c, 0x1124, 0x7007, 0x0002, 0x701f, 0x3573, 0x0005, 0x00f6, -+ 0x0126, 0x2091, 0x8000, 0x2079, 0x0000, 0x2001, 0x18b0, 0x2004, -+ 0x9005, 0x1190, 0x0e04, 0x4b24, 0x7a36, 0x7833, 0x0012, 0x7a82, -+ 0x7b86, 0x7c8a, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, -+ 0x190c, 0x11d6, 0x0804, 0x4b8a, 0x0016, 0x0086, 0x0096, 0x00c6, -+ 0x00e6, 0x2071, 0x189e, 0x7044, 0x9005, 0x1540, 0x7148, 0x9182, -+ 0x0010, 0x0288, 0x7038, 0x2060, 0x080c, 0x103a, 0x0904, 0x4b82, -+ 0xa84b, 0x0000, 0x2900, 0x7046, 0x2001, 0x0002, 0x9080, 0x1e55, -+ 0x2005, 0xa846, 0x0098, 0x7038, 0x90e0, 0x0004, 0x2001, 0x18ba, -+ 0x9c82, 0x18fa, 0x0210, 0x2061, 0x18ba, 0x2c00, 0x703a, 0x7148, -+ 0x81ff, 0x1108, 0x703e, 0x8108, 0x714a, 0x0460, 0x7148, 0x8108, -+ 0x714a, 0x7044, 0x2040, 0xa144, 0x2105, 0x0016, 0x908a, 0x0036, -+ 0x1a0c, 0x0d7d, 0x2060, 0x001e, 0x8108, 0x2105, 0x9005, 0xa146, -+ 0x1520, 0x080c, 0x103a, 0x1130, 0x8109, 0xa946, 0x7148, 0x8109, -+ 0x714a, 0x00d8, 0x9006, 0xa806, 0xa84a, 0xa046, 0x2800, 0xa802, -+ 0x2900, 0xa006, 0x7046, 0x2001, 0x0002, 0x9080, 0x1e55, 0x2005, -+ 0xa846, 0x0058, 0x2262, 0x6306, 0x640a, 0x00ee, 0x00ce, 0x009e, -+ 0x008e, 0x001e, 0x012e, 0x00fe, 0x0005, 0x2c00, 0x9082, 0x001b, -+ 0x0002, 0x4bac, 0x4bac, 0x4bae, 0x4bac, 0x4bac, 0x4bac, 0x4bb2, -+ 0x4bac, 0x4bac, 0x4bac, 0x4bb6, 0x4bac, 0x4bac, 0x4bac, 0x4bba, -+ 0x4bac, 0x4bac, 0x4bac, 0x4bbe, 0x4bac, 0x4bac, 0x4bac, 0x4bc2, -+ 0x4bac, 0x4bac, 0x4bac, 0x4bc7, 0x080c, 0x0d7d, 0xa276, 0xa37a, -+ 0xa47e, 0x0898, 0xa286, 0xa38a, 0xa48e, 0x0878, 0xa296, 0xa39a, -+ 0xa49e, 0x0858, 0xa2a6, 0xa3aa, 0xa4ae, 0x0838, 0xa2b6, 0xa3ba, -+ 0xa4be, 0x0818, 0xa2c6, 0xa3ca, 0xa4ce, 0x0804, 0x4b85, 0xa2d6, -+ 0xa3da, 0xa4de, 0x0804, 0x4b85, 0x00e6, 0x2071, 0x189e, 0x7048, -+ 0x9005, 0x0904, 0x4c5e, 0x0126, 0x2091, 0x8000, 0x0e04, 0x4c5d, -+ 0x00f6, 0x2079, 0x0000, 0x00c6, 0x0096, 0x0086, 0x0076, 0x9006, -+ 0x2038, 0x7040, 0x2048, 0x9005, 0x0500, 0xa948, 0x2105, 0x0016, -+ 0x908a, 0x0036, 0x1a0c, 0x0d7d, 0x2060, 0x001e, 0x8108, 0x2105, -+ 0x9005, 0xa94a, 0x1904, 0x4c60, 0xa804, 0x9005, 0x090c, 0x0d7d, -+ 0x7042, 0x2938, 0x2040, 0xa003, 0x0000, 0x2001, 0x0002, 0x9080, -+ 0x1e55, 0x2005, 0xa04a, 0x0804, 0x4c60, 0x703c, 0x2060, 0x2c14, -+ 0x6304, 0x6408, 0x650c, 0x2200, 0x7836, 0x7833, 0x0012, 0x7882, -+ 0x2300, 0x7886, 0x2400, 0x788a, 0x2091, 0x4080, 0x2001, 0x0089, -+ 0x2004, 0xd084, 0x190c, 0x11d6, 0x87ff, 0x0118, 0x2748, 0x080c, -+ 0x106c, 0x7048, 0x8001, 0x704a, 0x9005, 0x1170, 0x7040, 0x2048, -+ 0x9005, 0x0128, 0x080c, 0x106c, 0x9006, 0x7042, 0x7046, 0x703b, -+ 0x18ba, 0x703f, 0x18ba, 0x0420, 0x7040, 0x9005, 0x1508, 0x7238, -+ 0x2c00, 0x9206, 0x0148, 0x9c80, 0x0004, 0x90fa, 0x18fa, 0x0210, -+ 0x2001, 0x18ba, 0x703e, 0x00a0, 0x9006, 0x703e, 0x703a, 0x7044, -+ 0x9005, 0x090c, 0x0d7d, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, -+ 0x7042, 0x2001, 0x0002, 0x9080, 0x1e55, 0x2005, 0xa84a, 0x0000, -+ 0x007e, 0x008e, 0x009e, 0x00ce, 0x00fe, 0x012e, 0x00ee, 0x0005, -+ 0x2c00, 0x9082, 0x001b, 0x0002, 0x4c7f, 0x4c7f, 0x4c81, 0x4c7f, -+ 0x4c7f, 0x4c7f, 0x4c86, 0x4c7f, 0x4c7f, 0x4c7f, 0x4c8b, 0x4c7f, -+ 0x4c7f, 0x4c7f, 0x4c90, 0x4c7f, 0x4c7f, 0x4c7f, 0x4c95, 0x4c7f, -+ 0x4c7f, 0x4c7f, 0x4c9a, 0x4c7f, 0x4c7f, 0x4c7f, 0x4c9f, 0x080c, -+ 0x0d7d, 0xaa74, 0xab78, 0xac7c, 0x0804, 0x4c0b, 0xaa84, 0xab88, -+ 0xac8c, 0x0804, 0x4c0b, 0xaa94, 0xab98, 0xac9c, 0x0804, 0x4c0b, -+ 0xaaa4, 0xaba8, 0xacac, 0x0804, 0x4c0b, 0xaab4, 0xabb8, 0xacbc, -+ 0x0804, 0x4c0b, 0xaac4, 0xabc8, 0xaccc, 0x0804, 0x4c0b, 0xaad4, -+ 0xabd8, 0xacdc, 0x0804, 0x4c0b, 0x0016, 0x0026, 0x0036, 0x00b6, -+ 0x00c6, 0x2009, 0x007e, 0x080c, 0x6625, 0x2019, 0x0001, 0xb85c, -+ 0xd0ac, 0x0110, 0x2019, 0x0000, 0x2011, 0x801b, 0x080c, 0x4b07, -+ 0x00ce, 0x00be, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x080c, -+ 0x56da, 0xd0c4, 0x0120, 0x2011, 0x8014, 0x080c, 0x4b07, 0x002e, -+ 0x0005, 0x81ff, 0x1904, 0x35a5, 0x0126, 0x2091, 0x8000, 0x6030, -+ 0xc08d, 0xc085, 0xc0ac, 0x6032, 0x080c, 0x74e9, 0x1158, 0x080c, -+ 0x77ed, 0x080c, 0x6029, 0x9085, 0x0001, 0x080c, 0x7530, 0x080c, -+ 0x741a, 0x0010, 0x080c, 0x5ee4, 0x012e, 0x0804, 0x3573, 0x81ff, -+ 0x0120, 0x2009, 0x0001, 0x0804, 0x35a5, 0x080c, 0x56ee, 0x0120, -+ 0x2009, 0x0007, 0x0804, 0x35a5, 0x080c, 0x6a63, 0x0120, 0x2009, -+ 0x0008, 0x0804, 0x35a5, 0x080c, 0x3363, 0x0128, 0x7984, 0x080c, -+ 0x65c4, 0x1904, 0x35a8, 0x080c, 0x4ada, 0x0904, 0x35a8, 0x2b00, -+ 0x7026, 0x080c, 0x6a6b, 0x7888, 0x1170, 0x9084, 0x0005, 0x1158, -+ 0x900e, 0x080c, 0x6914, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, -+ 0xc18d, 0x0804, 0x3573, 0x080c, 0x4aa7, 0x0904, 0x35a5, 0x9006, -+ 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xca6a, 0x0904, -+ 0x35a5, 0x7888, 0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6, 0x7007, -+ 0x0003, 0x701f, 0x4d80, 0x0005, 0x2061, 0x1800, 0x080c, 0x56ee, -+ 0x2009, 0x0007, 0x1578, 0x080c, 0x6a63, 0x0118, 0x2009, 0x0008, -+ 0x0448, 0x080c, 0x3363, 0x0120, 0xa998, 0x080c, 0x65c4, 0x1530, -+ 0x080c, 0x4ad8, 0x0518, 0x080c, 0x6a6b, 0xa89c, 0x1168, 0x9084, -+ 0x0005, 0x1150, 0x900e, 0x080c, 0x6914, 0x1108, 0xc185, 0xb800, -+ 0xd0bc, 0x0108, 0xc18d, 0x00d0, 0xa868, 0xc0fc, 0xa86a, 0x080c, -+ 0xca6a, 0x11e0, 0xa89c, 0xd094, 0x0118, 0xb8d4, 0xc08d, 0xb8d6, -+ 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, 0x7024, 0x2058, 0x1110, 0x0804, 0x5637, -+ 0x900e, 0x080c, 0x6914, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, -+ 0xc18d, 0x0804, 0x3573, 0x080c, 0x56ee, 0x0120, 0x2009, 0x0007, -+ 0x0804, 0x35a5, 0x7f84, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, -+ 0x4aa7, 0x1120, 0x2009, 0x0002, 0x0804, 0x35a5, 0x900e, 0x2130, -+ 0x7126, 0x7132, 0xa860, 0x20e8, 0x7036, 0xa85c, 0x9080, 0x0005, -+ 0x702a, 0x20a0, 0x080c, 0x6625, 0x1904, 0x4e22, 0x080c, 0x6a6b, -+ 0x0138, 0x080c, 0x6a73, 0x0120, 0x080c, 0x6a0b, 0x1904, 0x4e22, -+ 0xd794, 0x1110, 0xd784, 0x01a8, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, -+ 0x0006, 0x2098, 0x3400, 0xd794, 0x0160, 0x20a9, 0x0008, 0x4003, -+ 0x2098, 0x20a0, 0x3d00, 0x20e0, 0x20a9, 0x0002, 0x080c, 0x48a9, -+ 0x0048, 0x20a9, 0x0004, 0x4003, 0x2098, 0x20a0, 0x3d00, 0x20e0, -+ 0x080c, 0x48a9, 0x9186, 0x007e, 0x0170, 0x9186, 0x0080, 0x0158, -+ 0x080c, 0x6a6b, 0x90c2, 0x0006, 0x1210, 0xc1fd, 0x0020, 0x080c, -+ 0x6914, 0x1108, 0xc1fd, 0x4104, 0xc1fc, 0xd794, 0x0528, 0xb8c4, -+ 0x20e0, 0xb8c8, 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, 0x489c, 0x9c80, 0x0026, 0x2098, 0xb8c4, -+ 0x20e0, 0x20a9, 0x0002, 0x4003, 0xd794, 0x0110, 0x96b0, 0x000b, -+ 0x96b0, 0x0005, 0x8108, 0x080c, 0xab57, 0x0118, 0x9186, 0x0800, -+ 0x0040, 0xd78c, 0x0120, 0x9186, 0x0800, 0x0170, 0x0018, 0x9186, -+ 0x007e, 0x0150, 0xd794, 0x0118, 0x9686, 0x0020, 0x0010, 0x9686, -+ 0x0028, 0x0150, 0x0804, 0x4db2, 0x86ff, 0x1120, 0x7124, 0x810b, -+ 0x0804, 0x3573, 0x7033, 0x0001, 0x7122, 0x7024, 0x9600, 0x7026, -+ 0x772e, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa67a, 0x7034, -+ 0xa072, 0x7028, 0xa076, 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, -+ 0x1124, 0x7007, 0x0002, 0x701f, 0x4e5e, 0x0005, 0x7030, 0x9005, -+ 0x1180, 0x7120, 0x7028, 0x20a0, 0x772c, 0x9036, 0x7034, 0x20e8, -+ 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x0804, -+ 0x4db2, 0x7124, 0x810b, 0x0804, 0x3573, 0x2029, 0x007e, 0x7984, -+ 0x7a88, 0x7b8c, 0x7c98, 0x9184, 0xff00, 0x8007, 0x90e2, 0x0020, -+ 0x0a04, 0x35a8, 0x9502, 0x0a04, 0x35a8, 0x9184, 0x00ff, 0x90e2, -+ 0x0020, 0x0a04, 0x35a8, 0x9502, 0x0a04, 0x35a8, 0x9284, 0xff00, -+ 0x8007, 0x90e2, 0x0020, 0x0a04, 0x35a8, 0x9502, 0x0a04, 0x35a8, -+ 0x9284, 0x00ff, 0x90e2, 0x0020, 0x0a04, 0x35a8, 0x9502, 0x0a04, -+ 0x35a8, 0x9384, 0xff00, 0x8007, 0x90e2, 0x0020, 0x0a04, 0x35a8, -+ 0x9502, 0x0a04, 0x35a8, 0x9384, 0x00ff, 0x90e2, 0x0020, 0x0a04, -+ 0x35a8, 0x9502, 0x0a04, 0x35a8, 0x9484, 0xff00, 0x8007, 0x90e2, -+ 0x0020, 0x0a04, 0x35a8, 0x9502, 0x0a04, 0x35a8, 0x9484, 0x00ff, -+ 0x90e2, 0x0020, 0x0a04, 0x35a8, 0x9502, 0x0a04, 0x35a8, 0x2061, -+ 0x1989, 0x6102, 0x6206, 0x630a, 0x640e, 0x0804, 0x3573, 0x080c, -+ 0x4aa7, 0x0904, 0x35a5, 0x2009, 0x0016, 0x7a8c, 0x7b88, 0x7c9c, -+ 0x7d98, 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4af0, 0x701f, -+ 0x4ee2, 0x0005, 0x2001, 0x0138, 0x2003, 0x0000, 0x00e6, 0x2071, -+ 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, 0x20a9, 0x0016, 0x896e, -+ 0x8d6e, 0x8d6f, 0x9d84, 0xffc0, 0x9080, 0x0019, 0x2098, 0x9d84, -+ 0x003f, 0x20e0, 0x2069, 0x1877, 0x20e9, 0x0001, 0x2da0, 0x4003, -+ 0x6800, 0x9005, 0x0904, 0x4f63, 0x6804, 0x2008, 0x918c, 0xfff8, -+ 0x1904, 0x4f63, 0x680c, 0x9005, 0x0904, 0x4f63, 0x9082, 0xff01, -+ 0x1a04, 0x4f63, 0x6810, 0x9082, 0x005c, 0x0a04, 0x4f63, 0x6824, -+ 0x2008, 0x9082, 0x0008, 0x0a04, 0x4f63, 0x9182, 0x0400, 0x1a04, -+ 0x4f63, 0x0056, 0x2029, 0x0000, 0x080c, 0x8d0a, 0x005e, 0x6944, -+ 0x6820, 0x9102, 0x06c0, 0x6820, 0x9082, 0x0019, 0x16a0, 0x6828, -+ 0x6944, 0x810c, 0x9102, 0x0678, 0x6840, 0x9082, 0x000f, 0x1658, -+ 0x080c, 0x1053, 0x2900, 0x0904, 0x4f7d, 0x684e, 0x00e6, 0x2071, -+ 0x1930, 0x00b6, 0x2059, 0x0000, 0x080c, 0x8bc6, 0x00be, 0x00ee, -+ 0x0558, 0x080c, 0x8920, 0x080c, 0x8966, 0x11e0, 0x6857, 0x0000, -+ 0x00c6, 0x2061, 0x0100, 0x6104, 0x918d, 0x2000, 0x6106, 0x6b10, -+ 0x2061, 0x1a6b, 0x630a, 0x00ce, 0x080c, 0x2713, 0x2001, 0x0138, -+ 0x2102, 0x0804, 0x3573, 0x080c, 0x2713, 0x2001, 0x0138, 0x2102, -+ 0x0804, 0x35a8, 0x00e6, 0x2071, 0x1930, 0x080c, 0x8d9b, 0x080c, -+ 0x8daa, 0x080c, 0x8bb5, 0x00ee, 0x2001, 0x188a, 0x204c, 0x080c, -+ 0x106c, 0x2001, 0x188a, 0x2003, 0x0000, 0x080c, 0x2713, 0x2001, -+ 0x0138, 0x2102, 0x0804, 0x35a5, 0x2001, 0x1924, 0x200c, 0x918e, -+ 0x0000, 0x0904, 0x4fdc, 0x080c, 0x8bb0, 0x0904, 0x4fdc, 0x2001, -+ 0x0101, 0x200c, 0x918c, 0xdfff, 0x2102, 0x2001, 0x0138, 0x2003, -+ 0x0000, 0x00e6, 0x2071, 0x0300, 0x701c, 0xd0a4, 0x1de8, 0x00ee, -+ 0x080c, 0x8bb5, 0x2001, 0x0035, 0x080c, 0x1679, 0x00c6, 0x2061, -+ 0x193c, 0x6004, 0x6100, 0x9106, 0x1de0, 0x00ce, 0x080c, 0x2713, -+ 0x2001, 0x0138, 0x2102, 0x00e6, 0x00f6, 0x2071, 0x1923, 0x080c, -+ 0x8af1, 0x0120, 0x2f00, 0x080c, 0x8b7b, 0x0cc8, 0x00fe, 0x00ee, -+ 0x0126, 0x2091, 0x8000, 0x2001, 0x188a, 0x200c, 0x81ff, 0x0138, -+ 0x2148, 0x080c, 0x106c, 0x2001, 0x188a, 0x2003, 0x0000, 0x2001, -+ 0x183d, 0x2003, 0x0020, 0x00e6, 0x2071, 0x1930, 0x080c, 0x8d9b, -+ 0x080c, 0x8daa, 0x00ee, 0x012e, 0x0804, 0x3573, 0x0006, 0x080c, -+ 0x56da, 0xd0cc, 0x000e, 0x0005, 0x0006, 0x080c, 0x56de, 0xd0bc, -+ 0x000e, 0x0005, 0x6174, 0x7a84, 0x6300, 0x82ff, 0x1118, 0x7986, -+ 0x0804, 0x3573, 0x83ff, 0x1904, 0x35a8, 0x2001, 0xfff0, 0x9200, -+ 0x1a04, 0x35a8, 0x2019, 0xffff, 0x6078, 0x9302, 0x9200, 0x0a04, -+ 0x35a8, 0x7986, 0x6276, 0x0804, 0x3573, 0x080c, 0x56ee, 0x1904, -+ 0x35a5, 0x7c88, 0x7d84, 0x7e98, 0x7f8c, 0x080c, 0x4aa7, 0x0904, -+ 0x35a5, 0x900e, 0x901e, 0x7326, 0x7332, 0xa860, 0x20e8, 0x7036, -+ 0xa85c, 0x9080, 0x0003, 0x702a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, -+ 0x8bff, 0x0178, 0x080c, 0x6a6b, 0x0118, 0x080c, 0x6a73, 0x1148, -+ 0x20a9, 0x0001, 0xb814, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, -+ 0x0003, 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0170, -+ 0x0c20, 0x83ff, 0x1148, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, -+ 0x9166, 0x2208, 0x0804, 0x3573, 0x7033, 0x0001, 0x7122, 0x7024, -+ 0x9300, 0x7026, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, 0xa37a, -+ 0x7028, 0xa076, 0x7034, 0xa072, 0xa48e, 0xa592, 0xa696, 0xa79a, -+ 0x080c, 0x1124, 0x7007, 0x0002, 0x701f, 0x505f, 0x0005, 0x7030, -+ 0x9005, 0x1178, 0x7120, 0x7028, 0x20a0, 0x901e, 0x7034, 0x20e8, -+ 0x2061, 0x18b8, 0x2c44, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0804, -+ 0x501d, 0x7224, 0x900e, 0x2001, 0x0003, 0x080c, 0x9166, 0x2208, -+ 0x0804, 0x3573, 0x00f6, 0x00e6, 0x080c, 0x56ee, 0x2009, 0x0007, -+ 0x1904, 0x50f2, 0x2071, 0x189e, 0x745c, 0x84ff, 0x2009, 0x000e, -+ 0x1904, 0x50f2, 0xac9c, 0xad98, 0xaea4, 0xafa0, 0x0096, 0x080c, -+ 0x1053, 0x2009, 0x0002, 0x0904, 0x50f2, 0x2900, 0x705e, 0x900e, -+ 0x901e, 0x7356, 0x7362, 0xa860, 0x7066, 0xa85c, 0x9080, 0x0003, -+ 0x705a, 0x20a0, 0x91d8, 0x1000, 0x2b5c, 0x8bff, 0x0178, 0x080c, -+ 0x6a6b, 0x0118, 0x080c, 0x6a73, 0x1148, 0xb814, 0x20a9, 0x0001, -+ 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, 0x8108, 0x9182, -+ 0x0800, 0x0120, 0x9386, 0x003c, 0x01e8, 0x0c20, 0x83ff, 0x11c0, -+ 0x7254, 0x900e, 0x2001, 0x0003, 0x080c, 0x9166, 0x2208, 0x009e, -+ 0xa897, 0x4000, 0xa99a, 0x715c, 0x81ff, 0x090c, 0x0d7d, 0x2148, -+ 0x080c, 0x106c, 0x9006, 0x705e, 0x918d, 0x0001, 0x2008, 0x0418, -+ 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0x2061, 0x18b9, -+ 0x2c44, 0xa37a, 0x7058, 0xa076, 0x7064, 0xa072, 0xa48e, 0xa592, -+ 0xa696, 0xa79a, 0xa09f, 0x50fe, 0x000e, 0xa0a2, 0x080c, 0x1124, -+ 0x9006, 0x0048, 0x009e, 0xa897, 0x4005, 0xa99a, 0x900e, 0x9085, -+ 0x0001, 0x2001, 0x0030, 0x00ee, 0x00fe, 0x0005, 0x00f6, 0xa0a0, -+ 0x904d, 0x090c, 0x0d7d, 0x00e6, 0x2071, 0x189e, 0xa06c, 0x908e, -+ 0x0100, 0x0138, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, 0x4002, -+ 0x00d8, 0x7060, 0x9005, 0x1158, 0x7150, 0x7058, 0x20a0, 0x901e, -+ 0x7064, 0x20e8, 0xa48c, 0xa590, 0xa694, 0xa798, 0x0428, 0xa87b, -+ 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x7254, 0x900e, 0x2001, -+ 0x0003, 0x080c, 0x9166, 0xaa9a, 0x715c, 0x81ff, 0x090c, 0x0d7d, -+ 0x2148, 0x080c, 0x106c, 0x705f, 0x0000, 0xa0a0, 0x2048, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x6d80, 0x012e, 0xa09f, 0x0000, 0xa0a3, -+ 0x0000, 0x00ee, 0x00fe, 0x0005, 0x91d8, 0x1000, 0x2b5c, 0x8bff, -+ 0x0178, 0x080c, 0x6a6b, 0x0118, 0x080c, 0x6a73, 0x1148, 0xb814, -+ 0x20a9, 0x0001, 0x4004, 0xb810, 0x4004, 0x4104, 0x9398, 0x0003, -+ 0x8108, 0x9182, 0x0800, 0x0120, 0x9386, 0x003c, 0x0518, 0x0c20, -+ 0x83ff, 0x11f0, 0x7154, 0x810c, 0xa99a, 0xa897, 0x4000, 0x715c, -+ 0x81ff, 0x090c, 0x0d7d, 0x2148, 0x080c, 0x106c, 0x9006, 0x705e, -+ 0x918d, 0x0001, 0x2008, 0xa0a0, 0x2048, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x6d80, 0x012e, 0xa09f, 0x0000, 0xa0a3, 0x0000, 0x0070, -+ 0x7063, 0x0001, 0x7152, 0x7054, 0x9300, 0x7056, 0xa37a, 0xa48e, -+ 0xa592, 0xa696, 0xa79a, 0x080c, 0x1124, 0x9006, 0x00ee, 0x0005, -+ 0x0096, 0xa88c, 0x90be, 0x7000, 0x0148, 0x90be, 0x7100, 0x0130, -+ 0x90be, 0x7200, 0x0118, 0x009e, 0x0804, 0x35a8, 0xa884, 0xa988, -+ 0x080c, 0x25fb, 0x1518, 0x080c, 0x65c4, 0x1500, 0x7126, 0xbe12, -+ 0xbd16, 0xae7c, 0x080c, 0x4aa7, 0x01c8, 0x080c, 0x4aa7, 0x01b0, -+ 0x009e, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0xa823, 0x0000, -+ 0xa804, 0x2048, 0x080c, 0xc9e8, 0x1120, 0x2009, 0x0003, 0x0804, -+ 0x35a5, 0x7007, 0x0003, 0x701f, 0x51cb, 0x0005, 0x009e, 0x2009, -+ 0x0002, 0x0804, 0x35a5, 0x7124, 0x080c, 0x32fc, 0xa820, 0x9086, -+ 0x8001, 0x1120, 0x2009, 0x0004, 0x0804, 0x35a5, 0x2900, 0x7022, -+ 0xa804, 0x0096, 0x2048, 0x8906, 0x8006, 0x8007, 0x90bc, 0x003f, -+ 0x9084, 0xffc0, 0x009e, 0x9080, 0x0002, 0x0076, 0x0006, 0x2098, -+ 0x20a0, 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fb7, 0xaa6c, -+ 0xab70, 0xac74, 0xad78, 0x2061, 0x18b8, 0x2c44, 0xa06b, 0x0000, -+ 0xae64, 0xaf8c, 0x97c6, 0x7000, 0x0118, 0x97c6, 0x7100, 0x1148, -+ 0x96c2, 0x0004, 0x0600, 0x2009, 0x0004, 0x000e, 0x007e, 0x0804, -+ 0x4af3, 0x97c6, 0x7200, 0x11b8, 0x96c2, 0x0054, 0x02a0, 0x000e, -+ 0x007e, 0x2061, 0x18b8, 0x2c44, 0xa076, 0xa772, 0xa07b, 0x002a, -+ 0xa28e, 0xa392, 0xa496, 0xa59a, 0x080c, 0x1124, 0x7007, 0x0002, -+ 0x701f, 0x5227, 0x0005, 0x000e, 0x007e, 0x0804, 0x35a8, 0x7020, -+ 0x2048, 0xa804, 0x2048, 0xa804, 0x2048, 0x8906, 0x8006, 0x8007, -+ 0x90bc, 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0x2098, 0x20a0, -+ 0x27e0, 0x27e8, 0x20a9, 0x002a, 0x080c, 0x0fb7, 0x2100, 0x2238, -+ 0x2061, 0x18b8, 0x2c44, 0xa28c, 0xa390, 0xa494, 0xa598, 0x2009, -+ 0x002a, 0x0804, 0x4af3, 0x81ff, 0x1904, 0x35a5, 0x798c, 0x2001, -+ 0x197e, 0x918c, 0x8000, 0x2102, 0x080c, 0x4abe, 0x0904, 0x35a8, -+ 0x080c, 0x6a6b, 0x0120, 0x080c, 0x6a73, 0x1904, 0x35a8, 0x080c, -+ 0x66ec, 0x0904, 0x35a5, 0x0126, 0x2091, 0x8000, 0x080c, 0x6881, -+ 0x012e, 0x0904, 0x35a5, 0x2001, 0x197e, 0x2004, 0xd0fc, 0x1904, -+ 0x3573, 0x0804, 0x4548, 0xa9a0, 0x2001, 0x197e, 0x918c, 0x8000, -+ 0xc18d, 0x2102, 0x080c, 0x4acb, 0x01a0, 0x080c, 0x6a6b, 0x0118, -+ 0x080c, 0x6a73, 0x1170, 0x080c, 0x66ec, 0x2009, 0x0002, 0x0128, -+ 0x080c, 0x6881, 0x1170, 0x2009, 0x0003, 0xa897, 0x4005, 0xa99a, -+ 0x0010, 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, -+ 0x0005, 0xa897, 0x4000, 0x2001, 0x197e, 0x2004, 0xd0fc, 0x1128, -+ 0x080c, 0x56e2, 0x0110, 0x9006, 0x0018, 0x900e, 0x9085, 0x0001, -+ 0x2001, 0x0000, 0x0005, 0x78a8, 0xd08c, 0x1118, 0xd084, 0x0904, -+ 0x44bd, 0x080c, 0x4ada, 0x0904, 0x35a8, 0x080c, 0x4aa7, 0x1120, -+ 0x2009, 0x0002, 0x0804, 0x35a5, 0x080c, 0x6a6b, 0x0130, 0x908e, -+ 0x0004, 0x0118, 0x908e, 0x0005, 0x15a0, 0x78a8, 0xd08c, 0x0120, -+ 0xb800, 0xc08c, 0xb802, 0x0028, 0x080c, 0x56da, 0xd0b4, 0x0904, -+ 0x44f7, 0x7884, 0x908e, 0x007e, 0x0904, 0x44f7, 0x908e, 0x007f, -+ 0x0904, 0x44f7, 0x908e, 0x0080, 0x0904, 0x44f7, 0xb800, 0xd08c, -+ 0x1904, 0x44f7, 0xa867, 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, -+ 0xca07, 0x1120, 0x2009, 0x0003, 0x0804, 0x35a5, 0x7007, 0x0003, -+ 0x701f, 0x52f3, 0x0005, 0x080c, 0x4ada, 0x0904, 0x35a8, 0x0804, -+ 0x44f7, 0x080c, 0x3363, 0x0108, 0x0005, 0x2009, 0x1834, 0x210c, -+ 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35a5, 0x080c, 0x56ee, -+ 0x0120, 0x2009, 0x0007, 0x0804, 0x35a5, 0x080c, 0x6a63, 0x0120, -+ 0x2009, 0x0008, 0x0804, 0x35a5, 0xb89c, 0xd0a4, 0x1118, 0xd0ac, -+ 0x1904, 0x44f7, 0x9006, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, -+ 0x080c, 0xca6a, 0x1120, 0x2009, 0x0003, 0x0804, 0x35a5, 0x7007, -+ 0x0003, 0x701f, 0x532c, 0x0005, 0xa830, 0x9086, 0x0100, 0x1120, -+ 0x2009, 0x0004, 0x0804, 0x5637, 0x080c, 0x4ada, 0x0904, 0x35a8, -+ 0x0804, 0x52c5, 0x81ff, 0x2009, 0x0001, 0x1904, 0x35a5, 0x080c, -+ 0x56ee, 0x2009, 0x0007, 0x1904, 0x35a5, 0x080c, 0x6a63, 0x0120, -+ 0x2009, 0x0008, 0x0804, 0x35a5, 0x080c, 0x4ada, 0x0904, 0x35a8, -+ 0x080c, 0x6a6b, 0x2009, 0x0009, 0x1904, 0x35a5, 0x080c, 0x4aa7, -+ 0x2009, 0x0002, 0x0904, 0x35a5, 0x9006, 0xa866, 0xa832, 0xa868, -+ 0xc0fd, 0xa86a, 0x7988, 0x9194, 0xff00, 0x918c, 0x00ff, 0x9006, -+ 0x82ff, 0x1128, 0xc0ed, 0xa952, 0x798c, 0xa956, 0x0038, 0x928e, -+ 0x0100, 0x1904, 0x35a8, 0xc0e5, 0xa952, 0xa956, 0xa83e, 0x080c, -+ 0xcccd, 0x2009, 0x0003, 0x0904, 0x35a5, 0x7007, 0x0003, 0x701f, -+ 0x5382, 0x0005, 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, -+ 0x35a5, 0x0804, 0x3573, 0x7aa8, 0x9284, 0xc000, 0x0148, 0xd2ec, -+ 0x01a0, 0x080c, 0x56ee, 0x1188, 0x2009, 0x0014, 0x0804, 0x35a5, -+ 0xd2dc, 0x1568, 0x81ff, 0x2009, 0x0001, 0x1904, 0x35a5, 0x080c, -+ 0x56ee, 0x2009, 0x0007, 0x1904, 0x35a5, 0xd2f4, 0x0130, 0x9284, -+ 0x5000, 0x080c, 0x56b5, 0x0804, 0x3573, 0xd2fc, 0x0158, 0x080c, -+ 0x4ada, 0x0904, 0x35a8, 0x7984, 0x9284, 0x9000, 0x080c, 0x5692, -+ 0x0804, 0x3573, 0x080c, 0x4ada, 0x0904, 0x35a8, 0xb804, 0x9084, -+ 0x00ff, 0x9086, 0x0006, 0x2009, 0x0009, 0x1904, 0x546b, 0x080c, -+ 0x4aa7, 0x2009, 0x0002, 0x0904, 0x546b, 0xa85c, 0x9080, 0x001b, -+ 0xaf60, 0x2009, 0x0008, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0x080c, -+ 0x4af0, 0x701f, 0x53dc, 0x0005, 0xa86c, 0x9086, 0x0500, 0x1138, -+ 0xa870, 0x9005, 0x1120, 0xa874, 0x9084, 0xff00, 0x0110, 0x1904, -+ 0x35a8, 0xa866, 0xa832, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0x4ada, -+ 0x1110, 0x0804, 0x35a8, 0x2009, 0x0043, 0x080c, 0xcd35, 0x2009, -+ 0x0003, 0x0904, 0x546b, 0x7007, 0x0003, 0x701f, 0x5400, 0x0005, -+ 0xa830, 0x9086, 0x0100, 0x2009, 0x0004, 0x0904, 0x546b, 0x7984, -+ 0x7aa8, 0x9284, 0x1000, 0x080c, 0x5692, 0x0804, 0x3573, 0x00c6, -+ 0xaab0, 0x9284, 0xc000, 0x0140, 0xd2ec, 0x0168, 0x080c, 0x56ee, -+ 0x1150, 0x2009, 0x0014, 0x04f0, 0x2061, 0x1800, 0x080c, 0x56ee, -+ 0x2009, 0x0007, 0x15b8, 0xd2f4, 0x0128, 0x9284, 0x5000, 0x080c, -+ 0x56b5, 0x0050, 0xd2fc, 0x0178, 0x080c, 0x4ad8, 0x0588, 0xa998, -+ 0x9284, 0x9000, 0x080c, 0x5692, 0xa87b, 0x0000, 0xa883, 0x0000, -+ 0xa897, 0x4000, 0x0438, 0x080c, 0x4ad8, 0x0510, 0x080c, 0x6a6b, -+ 0x2009, 0x0009, 0x11b8, 0xa8c4, 0x9086, 0x0500, 0x11c8, 0xa8c8, -+ 0x9005, 0x11b0, 0xa8cc, 0x9084, 0xff00, 0x1190, 0x080c, 0x4ad8, -+ 0x1108, 0x0070, 0x2009, 0x004b, 0x080c, 0xcd35, 0x2009, 0x0003, -+ 0x0108, 0x0078, 0x0429, 0x19c0, 0xa897, 0x4005, 0xa99a, 0x0010, -+ 0xa897, 0x4006, 0x900e, 0x9085, 0x0001, 0x2001, 0x0030, 0x00ce, -+ 0x0005, 0x9006, 0x0ce0, 0x7aa8, 0xd2dc, 0x0904, 0x35a5, 0x0016, -+ 0x7984, 0x9284, 0x1000, 0xc0fd, 0x080c, 0x5692, 0x001e, 0x1904, -+ 0x35a5, 0x0804, 0x3573, 0x00f6, 0x2d78, 0x0011, 0x00fe, 0x0005, -+ 0xaab0, 0xd2dc, 0x0150, 0x0016, 0xa998, 0x9284, 0x1000, 0xc0fd, -+ 0x080c, 0x5692, 0x001e, 0x9085, 0x0001, 0x0005, 0x81ff, 0x0120, -+ 0x2009, 0x0001, 0x0804, 0x35a5, 0x080c, 0x56ee, 0x0120, 0x2009, -+ 0x0007, 0x0804, 0x35a5, 0x7984, 0x7ea8, 0x96b4, 0x00ff, 0x080c, -+ 0x6625, 0x1904, 0x35a8, 0x9186, 0x007f, 0x0138, 0x080c, 0x6a6b, -+ 0x0120, 0x2009, 0x0009, 0x0804, 0x35a5, 0x080c, 0x4aa7, 0x1120, -+ 0x2009, 0x0002, 0x0804, 0x35a5, 0xa867, 0x0000, 0xa868, 0xc0fd, -+ 0xa86a, 0x2001, 0x0100, 0x8007, 0xa80a, 0x080c, 0xca21, 0x1120, -+ 0x2009, 0x0003, 0x0804, 0x35a5, 0x7007, 0x0003, 0x701f, 0x54c9, -+ 0x0005, 0xa808, 0x8007, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, -+ 0x0804, 0x35a5, 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, 0x4af3, -+ 0x080c, 0x4aa7, 0x1120, 0x2009, 0x0002, 0x0804, 0x35a5, 0x7984, -+ 0x9194, 0xff00, 0x918c, 0x00ff, 0x8217, 0x82ff, 0x1118, 0x7023, -+ 0x19b3, 0x0040, 0x92c6, 0x0001, 0x1118, 0x7023, 0x19cd, 0x0010, -+ 0x0804, 0x35a8, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, -+ 0xa85c, 0x9080, 0x0019, 0xaf60, 0x080c, 0x4af0, 0x701f, 0x5519, -+ 0x0005, 0x2001, 0x182e, 0x2003, 0x0001, 0xa85c, 0x9080, 0x0019, -+ 0x2098, 0xa860, 0x20e0, 0x20a9, 0x001a, 0x7020, 0x20a0, 0x20e9, -+ 0x0001, 0x4003, 0x0804, 0x3573, 0x080c, 0x4aa7, 0x1120, 0x2009, -+ 0x0002, 0x0804, 0x35a5, 0x7984, 0x9194, 0xff00, 0x918c, 0x00ff, -+ 0x8217, 0x82ff, 0x1118, 0x2099, 0x19b3, 0x0040, 0x92c6, 0x0001, -+ 0x1118, 0x2099, 0x19cd, 0x0010, 0x0804, 0x35a8, 0xa85c, 0x9080, -+ 0x0019, 0x20a0, 0xa860, 0x20e8, 0x20a9, 0x001a, 0x20e1, 0x0001, -+ 0x4003, 0x2009, 0x001a, 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xa85c, -+ 0x9080, 0x0019, 0xaf60, 0x0804, 0x4af3, 0x7884, 0x908a, 0x1000, -+ 0x1a04, 0x35a8, 0x0126, 0x2091, 0x8000, 0x8003, 0x800b, 0x810b, -+ 0x9108, 0x00c6, 0x2061, 0x1a03, 0x6142, 0x00ce, 0x012e, 0x0804, -+ 0x3573, 0x00c6, 0x080c, 0x74e9, 0x1160, 0x080c, 0x77ed, 0x080c, -+ 0x6029, 0x9085, 0x0001, 0x080c, 0x7530, 0x080c, 0x741a, 0x080c, -+ 0x0d7d, 0x2061, 0x1800, 0x6030, 0xc09d, 0x6032, 0x080c, 0x5ee4, -+ 0x00ce, 0x0005, 0x00c6, 0x2001, 0x1800, 0x2004, 0x908e, 0x0000, -+ 0x0904, 0x35a5, 0x7884, 0x9005, 0x0188, 0x7888, 0x2061, 0x199c, -+ 0x2c0c, 0x2062, 0x080c, 0x29d8, 0x01a0, 0x080c, 0x29e0, 0x0188, -+ 0x080c, 0x29e8, 0x0170, 0x2162, 0x0804, 0x35a8, 0x2061, 0x0100, -+ 0x6038, 0x9086, 0x0007, 0x1118, 0x2009, 0x0001, 0x0010, 0x2009, -+ 0x0000, 0x7884, 0x9086, 0x0002, 0x1588, 0x2061, 0x0100, 0x6028, -+ 0xc09c, 0x602a, 0x080c, 0xa896, 0x0026, 0x2011, 0x0003, 0x080c, -+ 0xa1cf, 0x2011, 0x0002, 0x080c, 0xa1d9, 0x002e, 0x080c, 0xa098, -+ 0x0036, 0x901e, 0x080c, 0xa118, 0x003e, 0x080c, 0xa8b2, 0x60e3, -+ 0x0000, 0x080c, 0xe702, 0x080c, 0xe71d, 0x9085, 0x0001, 0x080c, -+ 0x7530, 0x9006, 0x080c, 0x2a0a, 0x2001, 0x1800, 0x2003, 0x0004, -+ 0x0026, 0x2011, 0x0008, 0x080c, 0x2a44, 0x002e, 0x00ce, 0x0804, -+ 0x3573, 0x81ff, 0x0120, 0x2009, 0x0001, 0x0804, 0x35a5, 0x080c, -+ 0x56ee, 0x0120, 0x2009, 0x0007, 0x0804, 0x35a5, 0x7984, 0x7ea8, -+ 0x96b4, 0x00ff, 0x080c, 0x6625, 0x1904, 0x35a8, 0x9186, 0x007f, -+ 0x0138, 0x080c, 0x6a6b, 0x0120, 0x2009, 0x0009, 0x0804, 0x35a5, -+ 0x080c, 0x4aa7, 0x1120, 0x2009, 0x0002, 0x0804, 0x35a5, 0xa867, -+ 0x0000, 0xa868, 0xc0fd, 0xa86a, 0x080c, 0xca24, 0x1120, 0x2009, -+ 0x0003, 0x0804, 0x35a5, 0x7007, 0x0003, 0x701f, 0x5620, 0x0005, -+ 0xa830, 0x9086, 0x0100, 0x1120, 0x2009, 0x0004, 0x0804, 0x35a5, -+ 0xa8e0, 0xa866, 0xa834, 0x8007, 0x800c, 0xa85c, 0x9080, 0x000c, -+ 0x7a8c, 0x7b88, 0x7c9c, 0x7d98, 0xaf60, 0x0804, 0x4af3, 0xa898, -+ 0x9086, 0x000d, 0x1904, 0x35a5, 0x2021, 0x4005, 0x0126, 0x2091, -+ 0x8000, 0x0e04, 0x5644, 0x0010, 0x012e, 0x0cc0, 0x7c36, 0x9486, -+ 0x4000, 0x0118, 0x7833, 0x0011, 0x0010, 0x7833, 0x0010, 0x7883, -+ 0x4005, 0xa998, 0x7986, 0xa9a4, 0x799a, 0xa9a8, 0x799e, 0x080c, -+ 0x4ae3, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, -+ 0x11d6, 0x7007, 0x0001, 0x2091, 0x5000, 0x700f, 0x0000, 0x012e, -+ 0x0005, 0x0126, 0x2091, 0x8000, 0x00c6, 0x2061, 0x1a03, 0x7984, -+ 0x6152, 0x614e, 0x6057, 0x0000, 0x604b, 0x0009, 0x7898, 0x606a, -+ 0x789c, 0x6066, 0x7888, 0x6062, 0x788c, 0x605e, 0x2001, 0x1a11, -+ 0x2044, 0x2001, 0x1a18, 0xa076, 0xa060, 0xa072, 0xa07b, 0x0001, -+ 0xa07f, 0x0002, 0xa06b, 0x0000, 0xa09f, 0x0000, 0x00ce, 0x012e, -+ 0x0804, 0x3573, 0x0126, 0x2091, 0x8000, 0x00b6, 0x00c6, 0x90e4, -+ 0xc000, 0x0128, 0x0006, 0x080c, 0xc885, 0x000e, 0x1198, 0xd0e4, -+ 0x0160, 0x9180, 0x1000, 0x2004, 0x905d, 0x0160, 0x080c, 0x6043, -+ 0x080c, 0xab57, 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, 0x56bd, 0x015e, -+ 0x012e, 0x0005, 0x2001, 0x1848, 0x2004, 0x0005, 0x2001, 0x1867, -+ 0x2004, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0d4, 0x000e, -+ 0x0005, 0x2001, 0x180e, 0x2004, 0xd0b4, 0x0005, 0x2001, 0x1800, -+ 0x2004, 0x9086, 0x0003, 0x0005, 0x0016, 0x00e6, 0x2071, 0x189e, -+ 0x7108, 0x910d, 0x710a, 0x00ee, 0x001e, 0x0005, 0x79a4, 0x9182, -+ 0x0081, 0x1a04, 0x35a8, 0x810c, 0x0016, 0x080c, 0x4aa7, 0x080c, -+ 0x0f42, 0x2100, 0x2238, 0x7d84, 0x7c88, 0x7b8c, 0x7a90, 0x001e, -+ 0x080c, 0x4af0, 0x701f, 0x5715, 0x0005, 0x2079, 0x0000, 0x7d94, -+ 0x7c98, 0x7ba8, 0x7aac, 0x79a4, 0x810c, 0x2061, 0x18b8, 0x2c44, -+ 0xa770, 0xa074, 0x2071, 0x189e, 0x080c, 0x4af3, 0x701f, 0x5729, -+ 0x0005, 0x2061, 0x18b8, 0x2c44, 0x0016, 0x0026, 0xa270, 0xa174, -+ 0x080c, 0x0f4a, 0x002e, 0x001e, 0x080c, 0x0ff7, 0x9006, 0xa802, -+ 0xa806, 0x0804, 0x3573, 0x0126, 0x0156, 0x0136, 0x0146, 0x01c6, -+ 0x01d6, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2061, 0x0100, 0x2069, -+ 0x0200, 0x2071, 0x1800, 0x6044, 0xd0a4, 0x11e8, 0xd084, 0x0118, -+ 0x080c, 0x58e4, 0x0068, 0xd08c, 0x0118, 0x080c, 0x57ed, 0x0040, -+ 0xd094, 0x0118, 0x080c, 0x57bd, 0x0018, 0xd09c, 0x0108, 0x0099, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, -+ 0x015e, 0x012e, 0x0005, 0x0016, 0x6128, 0xd19c, 0x1110, 0xc19d, -+ 0x612a, 0x001e, 0x0c68, 0x0006, 0x7098, 0x9005, 0x000e, 0x0120, -+ 0x709b, 0x0000, 0x7093, 0x0000, 0x624c, 0x9286, 0xf0f0, 0x1150, -+ 0x6048, 0x9086, 0xf0f0, 0x0130, 0x624a, 0x6043, 0x0090, 0x6043, -+ 0x0010, 0x0490, 0x9294, 0xff00, 0x9296, 0xf700, 0x0178, 0x7138, -+ 0xd1a4, 0x1160, 0x6240, 0x9295, 0x0100, 0x6242, 0x9294, 0x0010, -+ 0x0128, 0x2009, 0x00f7, 0x080c, 0x5fa5, 0x00f0, 0x6040, 0x9084, -+ 0x0010, 0x9085, 0x0140, 0x6042, 0x6043, 0x0000, 0x7087, 0x0000, -+ 0x70a3, 0x0001, 0x70c7, 0x0000, 0x70df, 0x0000, 0x2009, 0x1d80, -+ 0x200b, 0x0000, 0x7097, 0x0000, 0x708b, 0x000f, 0x2009, 0x000f, -+ 0x2011, 0x5e87, 0x080c, 0x8708, 0x0005, 0x2001, 0x1869, 0x2004, -+ 0xd08c, 0x0110, 0x705f, 0xffff, 0x7088, 0x9005, 0x1528, 0x2011, -+ 0x5e87, 0x080c, 0x863e, 0x6040, 0x9094, 0x0010, 0x9285, 0x0020, -+ 0x6042, 0x20a9, 0x00c8, 0x6044, 0xd08c, 0x1168, 0x1f04, 0x57d3, -+ 0x6242, 0x709b, 0x0000, 0x6040, 0x9094, 0x0010, 0x9285, 0x0080, -+ 0x6042, 0x6242, 0x0048, 0x6242, 0x709b, 0x0000, 0x708f, 0x0000, -+ 0x9006, 0x080c, 0x602e, 0x0000, 0x0005, 0x708c, 0x908a, 0x0003, -+ 0x1a0c, 0x0d7d, 0x000b, 0x0005, 0x57f7, 0x5848, 0x58e3, 0x00f6, -+ 0x0016, 0x6900, 0x918c, 0x0800, 0x708f, 0x0001, 0x2001, 0x015d, -+ 0x2003, 0x0000, 0x6803, 0x00fc, 0x20a9, 0x0004, 0x6800, 0x9084, -+ 0x00fc, 0x0120, 0x1f04, 0x5806, 0x080c, 0x0d7d, 0x68a0, 0x68a2, -+ 0x689c, 0x689e, 0x6898, 0x689a, 0xa001, 0x918d, 0x1600, 0x6902, -+ 0x001e, 0x6837, 0x0020, 0x080c, 0x600a, 0x2079, 0x1d00, 0x7833, -+ 0x1101, 0x7837, 0x0000, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, -+ 0x0001, 0x20a1, 0x1d0e, 0x20a9, 0x0004, 0x4003, 0x080c, 0xa690, -+ 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, 0x0240, -+ 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x600f, 0x0000, 0x080c, -+ 0x5eb8, 0x00fe, 0x9006, 0x7092, 0x6043, 0x0008, 0x6042, 0x0005, -+ 0x00f6, 0x7090, 0x7093, 0x0000, 0x9025, 0x0904, 0x58c0, 0x6020, -+ 0xd0b4, 0x1904, 0x58be, 0x71a0, 0x81ff, 0x0904, 0x58ac, 0x9486, -+ 0x000c, 0x1904, 0x58b9, 0x9480, 0x0018, 0x8004, 0x20a8, 0x080c, -+ 0x6003, 0x2011, 0x0260, 0x2019, 0x1d00, 0x220c, 0x2304, 0x9106, -+ 0x11e8, 0x8210, 0x8318, 0x1f04, 0x5865, 0x6043, 0x0004, 0x2061, -+ 0x0140, 0x605b, 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, -+ 0x0006, 0x708f, 0x0002, 0x709b, 0x0002, 0x2009, 0x07d0, 0x2011, -+ 0x5e8e, 0x080c, 0x8708, 0x080c, 0x600a, 0x04c0, 0x080c, 0x6003, -+ 0x2079, 0x0260, 0x7930, 0x918e, 0x1101, 0x1558, 0x7834, 0x9005, -+ 0x1540, 0x7900, 0x918c, 0x00ff, 0x1118, 0x7804, 0x9005, 0x0190, -+ 0x080c, 0x6003, 0x2011, 0x026e, 0x2019, 0x1805, 0x20a9, 0x0004, -+ 0x220c, 0x2304, 0x9102, 0x0230, 0x11a0, 0x8210, 0x8318, 0x1f04, -+ 0x58a0, 0x0078, 0x70a3, 0x0000, 0x080c, 0x6003, 0x20e1, 0x0000, -+ 0x2099, 0x0260, 0x20e9, 0x0001, 0x20a1, 0x1d00, 0x20a9, 0x0014, -+ 0x4003, 0x6043, 0x0008, 0x6043, 0x0000, 0x0010, 0x00fe, 0x0005, -+ 0x6040, 0x9085, 0x0100, 0x6042, 0x6020, 0xd0b4, 0x1db8, 0x080c, -+ 0xa690, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, -+ 0x0240, 0x20a9, 0x0014, 0x4003, 0x60c3, 0x000c, 0x2011, 0x19f4, -+ 0x2013, 0x0000, 0x7093, 0x0000, 0x60a3, 0x0056, 0x60a7, 0x9575, -+ 0x080c, 0x9e25, 0x08d8, 0x0005, 0x7098, 0x908a, 0x001d, 0x1a0c, -+ 0x0d7d, 0x000b, 0x0005, 0x5915, 0x5928, 0x5951, 0x5971, 0x5997, -+ 0x59c6, 0x59ec, 0x5a24, 0x5a4a, 0x5a78, 0x5ab3, 0x5aeb, 0x5b09, -+ 0x5b34, 0x5b56, 0x5b71, 0x5b7b, 0x5baf, 0x5bd5, 0x5c04, 0x5c2a, -+ 0x5c62, 0x5ca6, 0x5ce3, 0x5d04, 0x5d5d, 0x5d7f, 0x5dad, 0x5dad, -+ 0x00c6, 0x2061, 0x1800, 0x6003, 0x0007, 0x2061, 0x0100, 0x6004, -+ 0x9084, 0xfff9, 0x6006, 0x00ce, 0x0005, 0x2061, 0x0140, 0x605b, -+ 0xbc94, 0x605f, 0xf0f0, 0x2061, 0x0100, 0x6043, 0x0002, 0x709b, -+ 0x0001, 0x2009, 0x07d0, 0x2011, 0x5e8e, 0x080c, 0x8708, 0x0005, -+ 0x00f6, 0x7090, 0x9086, 0x0014, 0x1510, 0x6042, 0x6020, 0xd0b4, -+ 0x11f0, 0x080c, 0x6003, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1102, -+ 0x11a0, 0x7834, 0x9005, 0x1188, 0x7a38, 0xd2fc, 0x0128, 0x70c4, -+ 0x9005, 0x1110, 0x70c7, 0x0001, 0x2011, 0x5e8e, 0x080c, 0x863e, -+ 0x709b, 0x0010, 0x080c, 0x5b7b, 0x0010, 0x7093, 0x0000, 0x00fe, -+ 0x0005, 0x00f6, 0x709b, 0x0003, 0x6043, 0x0004, 0x2011, 0x5e8e, -+ 0x080c, 0x863e, 0x080c, 0x5f87, 0x2079, 0x0240, 0x7833, 0x1102, -+ 0x7837, 0x0000, 0x20a9, 0x0008, 0x9f88, 0x000e, 0x200b, 0x0000, -+ 0x8108, 0x1f04, 0x5966, 0x60c3, 0x0014, 0x080c, 0x5eb8, 0x00fe, -+ 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, 0x2011, 0x5e8e, 0x080c, -+ 0x863e, 0x9086, 0x0014, 0x11b8, 0x080c, 0x6003, 0x2079, 0x0260, -+ 0x7a30, 0x9296, 0x1102, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, -+ 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, -+ 0x0004, 0x0029, 0x0010, 0x080c, 0x5fdf, 0x00fe, 0x0005, 0x00f6, -+ 0x709b, 0x0005, 0x080c, 0x5f87, 0x2079, 0x0240, 0x7833, 0x1103, -+ 0x7837, 0x0000, 0x080c, 0x6003, 0x080c, 0x5fe6, 0x1170, 0x7084, -+ 0x9005, 0x1158, 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, -+ 0x080c, 0x5e3b, 0x0168, 0x080c, 0x5fbc, 0x20a9, 0x0008, 0x20e1, -+ 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, -+ 0x60c3, 0x0014, 0x080c, 0x5eb8, 0x00fe, 0x0005, 0x00f6, 0x7090, -+ 0x9005, 0x0500, 0x2011, 0x5e8e, 0x080c, 0x863e, 0x9086, 0x0014, -+ 0x11b8, 0x080c, 0x6003, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1103, -+ 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, -+ 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0006, 0x0029, 0x0010, -+ 0x080c, 0x5fdf, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0007, 0x080c, -+ 0x5f87, 0x2079, 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, -+ 0x6003, 0x080c, 0x5fe6, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, -+ 0x9186, 0xffff, 0x0180, 0x9180, 0x3374, 0x200d, 0x918c, 0xff00, -+ 0x810f, 0x2011, 0x0008, 0x080c, 0x5e3b, 0x0180, 0x080c, 0x4fe4, -+ 0x0110, 0x080c, 0x2664, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, -+ 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, -+ 0x080c, 0x5eb8, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, -+ 0x2011, 0x5e8e, 0x080c, 0x863e, 0x9086, 0x0014, 0x11b8, 0x080c, -+ 0x6003, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, -+ 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, -+ 0x70c7, 0x0001, 0x709b, 0x0008, 0x0029, 0x0010, 0x080c, 0x5fdf, -+ 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0009, 0x080c, 0x5f87, 0x2079, -+ 0x0240, 0x7833, 0x1105, 0x7837, 0x0100, 0x080c, 0x5fe6, 0x1150, -+ 0x7084, 0x9005, 0x1138, 0x080c, 0x5dae, 0x1188, 0x9085, 0x0001, -+ 0x080c, 0x2664, 0x20a9, 0x0008, 0x080c, 0x6003, 0x20e1, 0x0000, -+ 0x2099, 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, -+ 0x0014, 0x080c, 0x5eb8, 0x0010, 0x080c, 0x5908, 0x00fe, 0x0005, -+ 0x00f6, 0x7090, 0x9005, 0x05a8, 0x2011, 0x5e8e, 0x080c, 0x863e, -+ 0x9086, 0x0014, 0x1560, 0x080c, 0x6003, 0x2079, 0x0260, 0x7a30, -+ 0x9296, 0x1105, 0x1520, 0x7834, 0x9084, 0x0100, 0x2011, 0x0100, -+ 0x921e, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, -+ 0x70c7, 0x0001, 0x709b, 0x000a, 0x00b1, 0x0098, 0x9005, 0x1178, -+ 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, -+ 0x7097, 0x0000, 0x709b, 0x000e, 0x080c, 0x5b56, 0x0010, 0x080c, -+ 0x5fdf, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x000b, 0x2011, 0x1d0e, -+ 0x20e9, 0x0001, 0x22a0, 0x20a9, 0x0040, 0x2019, 0xffff, 0x4304, -+ 0x080c, 0x5f87, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, -+ 0x080c, 0x5fe6, 0x0118, 0x2013, 0x0000, 0x0020, 0x7060, 0x9085, -+ 0x0100, 0x2012, 0x20a9, 0x0040, 0x2009, 0x024e, 0x2011, 0x1d0e, -+ 0x220e, 0x8210, 0x8108, 0x9186, 0x0260, 0x1128, 0x6810, 0x8000, -+ 0x6812, 0x2009, 0x0240, 0x1f04, 0x5ad8, 0x60c3, 0x0084, 0x080c, -+ 0x5eb8, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01c0, 0x2011, -+ 0x5e8e, 0x080c, 0x863e, 0x9086, 0x0084, 0x1178, 0x080c, 0x6003, -+ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1138, 0x7834, 0x9005, -+ 0x1120, 0x709b, 0x000c, 0x0029, 0x0010, 0x080c, 0x5fdf, 0x00fe, -+ 0x0005, 0x00f6, 0x709b, 0x000d, 0x080c, 0x5f87, 0x2079, 0x0240, -+ 0x7833, 0x1107, 0x7837, 0x0000, 0x080c, 0x6003, 0x20a9, 0x0040, -+ 0x2011, 0x026e, 0x2009, 0x024e, 0x220e, 0x8210, 0x8108, 0x9186, -+ 0x0260, 0x1150, 0x6810, 0x8000, 0x6812, 0x2009, 0x0240, 0x6814, -+ 0x8000, 0x6816, 0x2011, 0x0260, 0x1f04, 0x5b1c, 0x60c3, 0x0084, -+ 0x080c, 0x5eb8, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01e0, -+ 0x2011, 0x5e8e, 0x080c, 0x863e, 0x9086, 0x0084, 0x1198, 0x080c, -+ 0x6003, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, 0x7834, -+ 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x5f59, 0x709b, 0x000e, -+ 0x0029, 0x0010, 0x080c, 0x5fdf, 0x00fe, 0x0005, 0x918d, 0x0001, -+ 0x080c, 0x602e, 0x709b, 0x000f, 0x7093, 0x0000, 0x2061, 0x0140, -+ 0x605b, 0xbc85, 0x605f, 0xb5b5, 0x2061, 0x0100, 0x6043, 0x0005, -+ 0x6043, 0x0004, 0x2009, 0x07d0, 0x2011, 0x5e8e, 0x080c, 0x8632, -+ 0x0005, 0x7090, 0x9005, 0x0130, 0x2011, 0x5e8e, 0x080c, 0x863e, -+ 0x709b, 0x0000, 0x0005, 0x709b, 0x0011, 0x080c, 0xa690, 0x080c, -+ 0x6003, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, -+ 0x0240, 0x7490, 0x9480, 0x0018, 0x9080, 0x0007, 0x9084, 0x03f8, -+ 0x8004, 0x20a8, 0x4003, 0x080c, 0x5fe6, 0x11a0, 0x717c, 0x81ff, -+ 0x0188, 0x900e, 0x7080, 0x9084, 0x00ff, 0x0160, 0x080c, 0x25fb, -+ 0x9186, 0x007e, 0x0138, 0x9186, 0x0080, 0x0120, 0x2011, 0x0008, -+ 0x080c, 0x5e3b, 0x60c3, 0x0014, 0x080c, 0x5eb8, 0x0005, 0x00f6, -+ 0x7090, 0x9005, 0x0500, 0x2011, 0x5e8e, 0x080c, 0x863e, 0x9086, -+ 0x0014, 0x11b8, 0x080c, 0x6003, 0x2079, 0x0260, 0x7a30, 0x9296, -+ 0x1103, 0x1178, 0x7834, 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, -+ 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, 0x709b, 0x0012, 0x0029, -+ 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0013, -+ 0x080c, 0x5f95, 0x2079, 0x0240, 0x7833, 0x1103, 0x7837, 0x0000, -+ 0x080c, 0x6003, 0x080c, 0x5fe6, 0x1170, 0x7084, 0x9005, 0x1158, -+ 0x715c, 0x9186, 0xffff, 0x0138, 0x2011, 0x0008, 0x080c, 0x5e3b, -+ 0x0168, 0x080c, 0x5fbc, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, -+ 0x026e, 0x20e9, 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, -+ 0x080c, 0x5eb8, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x0500, -+ 0x2011, 0x5e8e, 0x080c, 0x863e, 0x9086, 0x0014, 0x11b8, 0x080c, -+ 0x6003, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1104, 0x1178, 0x7834, -+ 0x9005, 0x1160, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, -+ 0x70c7, 0x0001, 0x709b, 0x0014, 0x0029, 0x0010, 0x7093, 0x0000, -+ 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0015, 0x080c, 0x5f95, 0x2079, -+ 0x0240, 0x7833, 0x1104, 0x7837, 0x0000, 0x080c, 0x6003, 0x080c, -+ 0x5fe6, 0x11b8, 0x7084, 0x9005, 0x11a0, 0x7164, 0x9186, 0xffff, -+ 0x0180, 0x9180, 0x3374, 0x200d, 0x918c, 0xff00, 0x810f, 0x2011, -+ 0x0008, 0x080c, 0x5e3b, 0x0180, 0x080c, 0x4fe4, 0x0110, 0x080c, -+ 0x2664, 0x20a9, 0x0008, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, -+ 0x0000, 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5eb8, -+ 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, 0x05f0, 0x2011, 0x5e8e, -+ 0x080c, 0x863e, 0x9086, 0x0014, 0x15a8, 0x080c, 0x6003, 0x2079, -+ 0x0260, 0x7a30, 0x9296, 0x1105, 0x1568, 0x7834, 0x9084, 0x0100, -+ 0x2011, 0x0100, 0x921e, 0x1168, 0x9085, 0x0001, 0x080c, 0x602e, -+ 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, 0x1110, 0x70c7, 0x0001, -+ 0x0080, 0x9005, 0x11b8, 0x7a38, 0xd2fc, 0x0128, 0x70c4, 0x9005, -+ 0x1110, 0x70c7, 0x0001, 0x9085, 0x0001, 0x080c, 0x602e, 0x7097, -+ 0x0000, 0x7a38, 0xd2f4, 0x0110, 0x70df, 0x0008, 0x709b, 0x0016, -+ 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x080c, 0xa690, -+ 0x080c, 0x6003, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, -+ 0x20a1, 0x0240, 0x20a9, 0x000e, 0x4003, 0x2011, 0x026d, 0x2204, -+ 0x9084, 0x0100, 0x2011, 0x024d, 0x2012, 0x2011, 0x026e, 0x709b, -+ 0x0017, 0x080c, 0x5fe6, 0x1150, 0x7084, 0x9005, 0x1138, 0x080c, -+ 0x5dae, 0x1188, 0x9085, 0x0001, 0x080c, 0x2664, 0x20a9, 0x0008, -+ 0x080c, 0x6003, 0x20e1, 0x0000, 0x2099, 0x026e, 0x20e9, 0x0000, -+ 0x20a1, 0x024e, 0x4003, 0x60c3, 0x0014, 0x080c, 0x5eb8, 0x0010, -+ 0x080c, 0x5908, 0x0005, 0x00f6, 0x7090, 0x9005, 0x01d8, 0x2011, -+ 0x5e8e, 0x080c, 0x863e, 0x9086, 0x0084, 0x1190, 0x080c, 0x6003, -+ 0x2079, 0x0260, 0x7a30, 0x9296, 0x1106, 0x1150, 0x7834, 0x9005, -+ 0x1138, 0x9006, 0x080c, 0x602e, 0x709b, 0x0018, 0x0029, 0x0010, -+ 0x7093, 0x0000, 0x00fe, 0x0005, 0x00f6, 0x709b, 0x0019, 0x080c, -+ 0x5f95, 0x2079, 0x0240, 0x7833, 0x1106, 0x7837, 0x0000, 0x080c, -+ 0x6003, 0x2009, 0x026e, 0x2039, 0x1d0e, 0x20a9, 0x0040, 0x213e, -+ 0x8738, 0x8108, 0x9186, 0x0280, 0x1128, 0x6814, 0x8000, 0x6816, -+ 0x2009, 0x0260, 0x1f04, 0x5d17, 0x2039, 0x1d0e, 0x080c, 0x5fe6, -+ 0x11e8, 0x2728, 0x2514, 0x8207, 0x9084, 0x00ff, 0x8000, 0x2018, -+ 0x9294, 0x00ff, 0x8007, 0x9205, 0x202a, 0x7060, 0x2310, 0x8214, -+ 0x92a0, 0x1d0e, 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, 0x5d4a, 0x60c3, -+ 0x0084, 0x080c, 0x5eb8, 0x00fe, 0x0005, 0x00f6, 0x7090, 0x9005, -+ 0x01e0, 0x2011, 0x5e8e, 0x080c, 0x863e, 0x9086, 0x0084, 0x1198, -+ 0x080c, 0x6003, 0x2079, 0x0260, 0x7a30, 0x9296, 0x1107, 0x1158, -+ 0x7834, 0x9005, 0x1140, 0x7097, 0x0001, 0x080c, 0x5f59, 0x709b, -+ 0x001a, 0x0029, 0x0010, 0x7093, 0x0000, 0x00fe, 0x0005, 0x9085, -+ 0x0001, 0x080c, 0x602e, 0x709b, 0x001b, 0x080c, 0xa690, 0x080c, -+ 0x6003, 0x2011, 0x0260, 0x2009, 0x0240, 0x7490, 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, 0x5d96, -+ 0x60c3, 0x0084, 0x080c, 0x5eb8, 0x0005, 0x0005, 0x0086, 0x0096, -+ 0x2029, 0x1848, 0x252c, 0x20a9, 0x0008, 0x2041, 0x1d0e, 0x20e9, -+ 0x0001, 0x28a0, 0x080c, 0x6003, 0x20e1, 0x0000, 0x2099, 0x026e, -+ 0x4003, 0x20a9, 0x0008, 0x2011, 0x0007, 0xd5d4, 0x0108, 0x9016, -+ 0x2800, 0x9200, 0x200c, 0x91a6, 0xffff, 0x1148, 0xd5d4, 0x0110, -+ 0x8210, 0x0008, 0x8211, 0x1f04, 0x5dc8, 0x0804, 0x5e37, 0x82ff, -+ 0x1160, 0xd5d4, 0x0120, 0x91a6, 0x3fff, 0x0d90, 0x0020, 0x91a6, -+ 0x3fff, 0x0904, 0x5e37, 0x918d, 0xc000, 0x20a9, 0x0010, 0x2019, -+ 0x0001, 0xd5d4, 0x0110, 0x2019, 0x0010, 0x2120, 0xd5d4, 0x0110, -+ 0x8423, 0x0008, 0x8424, 0x1240, 0xd5d4, 0x0110, 0x8319, 0x0008, -+ 0x8318, 0x1f04, 0x5dee, 0x04d8, 0x23a8, 0x2021, 0x0001, 0x8426, -+ 0x8425, 0x1f04, 0x5e00, 0x2328, 0x8529, 0x92be, 0x0007, 0x0158, -+ 0x0006, 0x2039, 0x0007, 0x2200, 0x973a, 0x000e, 0x27a8, 0x95a8, -+ 0x0010, 0x1f04, 0x5e0f, 0x755e, 0x95c8, 0x3374, 0x292d, 0x95ac, -+ 0x00ff, 0x7582, 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2644, -+ 0x001e, 0x60e7, 0x0000, 0x65ea, 0x2018, 0x2304, 0x9405, 0x201a, -+ 0x7087, 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, 0x715e, 0x91a0, 0x3374, 0x242d, 0x95ac, 0x00ff, 0x7582, -+ 0x6532, 0x6536, 0x0016, 0x2508, 0x080c, 0x2644, 0x001e, 0x60e7, -+ 0x0000, 0x65ea, 0x7087, 0x0001, 0x9084, 0x0000, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0x708b, 0x0000, 0x00ee, 0x0005, 0x00e6, 0x00f6, -+ 0x2079, 0x0100, 0x2071, 0x0140, 0x080c, 0x5f48, 0x080c, 0x9e32, -+ 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2a1a, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x1826, 0x2073, 0x0000, 0x7840, 0x0026, 0x0016, -+ 0x2009, 0x00f7, 0x080c, 0x5fa5, 0x001e, 0x9094, 0x0010, 0x9285, -+ 0x0080, 0x7842, 0x7a42, 0x002e, 0x012e, 0x00fe, 0x00ee, 0x0005, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x2979, 0x0228, 0x2011, 0x0101, -+ 0x2204, 0xc0c5, 0x2012, 0x2011, 0x19f4, 0x2013, 0x0000, 0x7093, -+ 0x0000, 0x012e, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x080c, 0x9e25, -+ 0x6144, 0xd184, 0x0120, 0x7198, 0x918d, 0x2000, 0x0018, 0x718c, -+ 0x918d, 0x1000, 0x2011, 0x1999, 0x2112, 0x2009, 0x07d0, 0x2011, -+ 0x5e8e, 0x080c, 0x8708, 0x0005, 0x0016, 0x0026, 0x00c6, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0xa896, 0x080c, 0xab5e, 0x080c, 0xa8b2, -+ 0x2009, 0x00f7, 0x080c, 0x5fa5, 0x2061, 0x1a03, 0x900e, 0x611a, -+ 0x611e, 0x6172, 0x6176, 0x2061, 0x1800, 0x6003, 0x0001, 0x2061, -+ 0x0100, 0x6043, 0x0090, 0x6043, 0x0010, 0x2009, 0x1999, 0x200b, -+ 0x0000, 0x2009, 0x002d, 0x2011, 0x5f14, 0x080c, 0x8632, 0x012e, -+ 0x00ce, 0x002e, 0x001e, 0x0005, 0x00e6, 0x0006, 0x0126, 0x2091, -+ 0x8000, 0x0471, 0x2071, 0x0100, 0x080c, 0x9e32, 0x2071, 0x0140, -+ 0x7004, 0x9084, 0x4000, 0x0110, 0x080c, 0x2a1a, 0x080c, 0x74f1, -+ 0x0188, 0x080c, 0x750c, 0x1170, 0x080c, 0x77f7, 0x0016, 0x080c, -+ 0x2713, 0x2001, 0x196d, 0x2102, 0x001e, 0x080c, 0x77f2, 0x080c, -+ 0x741a, 0x0050, 0x2009, 0x0001, 0x080c, 0x29f6, 0x2001, 0x0001, -+ 0x080c, 0x25a0, 0x080c, 0x5ee4, 0x012e, 0x000e, 0x00ee, 0x0005, -+ 0x2001, 0x180e, 0x2004, 0xd0bc, 0x0158, 0x0026, 0x0036, 0x2011, -+ 0x8017, 0x2001, 0x1999, 0x201c, 0x080c, 0x4b07, 0x003e, 0x002e, -+ 0x0005, 0x20a9, 0x0012, 0x20e9, 0x0001, 0x20a1, 0x1d80, 0x080c, -+ 0x6003, 0x20e9, 0x0000, 0x2099, 0x026e, 0x0099, 0x20a9, 0x0020, -+ 0x080c, 0x5ffd, 0x2099, 0x0260, 0x20a1, 0x1d92, 0x0051, 0x20a9, -+ 0x000e, 0x080c, 0x6000, 0x2099, 0x0260, 0x20a1, 0x1db2, 0x0009, -+ 0x0005, 0x0016, 0x0026, 0x3410, 0x3308, 0x2104, 0x8007, 0x2012, -+ 0x8108, 0x8210, 0x1f04, 0x5f7d, 0x002e, 0x001e, 0x0005, 0x080c, -+ 0xa690, 0x20e1, 0x0001, 0x2099, 0x1d00, 0x20e9, 0x0000, 0x20a1, -+ 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x080c, 0xa690, 0x080c, -+ 0x6003, 0x20e1, 0x0000, 0x2099, 0x0260, 0x20e9, 0x0000, 0x20a1, -+ 0x0240, 0x20a9, 0x000c, 0x4003, 0x0005, 0x00c6, 0x0006, 0x2061, -+ 0x0100, 0x810f, 0x2001, 0x1834, 0x2004, 0x9005, 0x1138, 0x2001, -+ 0x1818, 0x2004, 0x9084, 0x00ff, 0x9105, 0x0010, 0x9185, 0x00f7, -+ 0x604a, 0x000e, 0x00ce, 0x0005, 0x0016, 0x0046, 0x080c, 0x6a67, -+ 0x0158, 0x9006, 0x2020, 0x2009, 0x002a, 0x080c, 0xe2c9, 0x2001, -+ 0x180c, 0x200c, 0xc195, 0x2102, 0x2019, 0x002a, 0x900e, 0x080c, -+ 0x31a6, 0x080c, 0xcf52, 0x0140, 0x0036, 0x2019, 0xffff, 0x2021, -+ 0x0007, 0x080c, 0x4cbe, 0x003e, 0x004e, 0x001e, 0x0005, 0x080c, -+ 0x5ee4, 0x709b, 0x0000, 0x7093, 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, 0x1d00, 0x4004, 0x2079, 0x1d00, -+ 0x7803, 0x2200, 0x7807, 0x00ef, 0x780f, 0x00ef, 0x7813, 0x0138, -+ 0x7823, 0xffff, 0x7827, 0xffff, 0x01de, 0x014e, 0x015e, 0x00fe, -+ 0x0005, 0x2001, 0x1800, 0x2003, 0x0001, 0x0005, 0x2001, 0x19a6, -+ 0x0118, 0x2003, 0x0001, 0x0010, 0x2003, 0x0000, 0x0005, 0x0156, -+ 0x20a9, 0x0800, 0x2009, 0x1000, 0x9006, 0x200a, 0x8108, 0x1f04, -+ 0x603d, 0x015e, 0x0005, 0x00d6, 0x0036, 0x0156, 0x0136, 0x0146, -+ 0x2069, 0x1847, 0x9006, 0xb802, 0xb8d6, 0xb807, 0x0707, 0xb80a, -+ 0xb80e, 0xb812, 0x9198, 0x3374, 0x231d, 0x939c, 0x00ff, 0xbb16, -+ 0x0016, 0x0026, 0xb886, 0x080c, 0xab57, 0x1120, 0x9192, 0x007e, -+ 0x1208, 0xbb86, 0x20a9, 0x0004, 0xb8c4, 0x20e8, 0xb9c8, 0x9198, -+ 0x0006, 0x9006, 0x23a0, 0x4004, 0x20a9, 0x0004, 0x9198, 0x000a, -+ 0x23a0, 0x4004, 0x002e, 0x001e, 0xb83e, 0xb842, 0xb8ce, 0xb8d2, -+ 0xb85e, 0xb862, 0xb866, 0xb86a, 0xb86f, 0x0100, 0xb872, 0xb876, -+ 0xb87a, 0xb88a, 0xb88e, 0xb893, 0x0008, 0xb896, 0xb89a, 0xb89e, -+ 0xb8be, 0xb9a2, 0x0096, 0xb8a4, 0x904d, 0x0110, 0x080c, 0x106c, -+ 0xb8a7, 0x0000, 0x009e, 0x9006, 0xb84a, 0x6810, 0xb83a, 0x680c, -+ 0xb846, 0xb8bb, 0x0520, 0xb8ac, 0x9005, 0x0198, 0x00c6, 0x2060, -+ 0x9c82, 0x1ddc, 0x0a0c, 0x0d7d, 0x2001, 0x181a, 0x2004, 0x9c02, -+ 0x1a0c, 0x0d7d, 0x080c, 0x8b90, 0x00ce, 0x090c, 0x8f34, 0xb8af, -+ 0x0000, 0x6814, 0x9084, 0x00ff, 0xb842, 0x014e, 0x013e, 0x015e, -+ 0x003e, 0x00de, 0x0005, 0x0126, 0x2091, 0x8000, 0xa974, 0xae78, -+ 0x9684, 0x3fff, 0x9082, 0x4000, 0x1a04, 0x6119, 0x9182, 0x0800, -+ 0x1a04, 0x611d, 0x2001, 0x180c, 0x2004, 0x9084, 0x0003, 0x1904, -+ 0x6123, 0x9188, 0x1000, 0x2104, 0x905d, 0x0198, 0xb804, 0x9084, -+ 0x00ff, 0x908e, 0x0006, 0x1188, 0xb8a4, 0x900d, 0x1904, 0x6135, -+ 0x080c, 0x64ee, 0x9006, 0x012e, 0x0005, 0x2001, 0x0005, 0x900e, -+ 0x04b8, 0x2001, 0x0028, 0x900e, 0x0498, 0x9082, 0x0006, 0x1290, -+ 0x080c, 0xab57, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, -+ 0xd1fc, 0x0d10, 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, 0x9065, 0x09a8, 0x080c, 0x6a6b, 0x1990, -+ 0xb800, 0xd0bc, 0x0978, 0x0804, 0x60dc, 0x080c, 0x6890, 0x0904, -+ 0x60e5, 0x0804, 0x60e0, 0x00e6, 0x2071, 0x19e7, 0x7004, 0x9086, -+ 0x0002, 0x1128, 0x7030, 0x9080, 0x0004, 0x2004, 0x9b06, 0x00ee, -+ 0x0005, 0x00b6, 0x00e6, 0x0126, 0x2091, 0x8000, 0xa874, 0x908e, -+ 0x00ff, 0x1120, 0x2001, 0x196b, 0x205c, 0x0060, 0xa974, 0x9182, -+ 0x0800, 0x1690, 0x9188, 0x1000, 0x2104, 0x905d, 0x01d0, 0x080c, -+ 0x6a0b, 0x11d0, 0x080c, 0xab97, 0x0570, 0x2b00, 0x6012, 0x2900, -+ 0x6016, 0x6023, 0x0009, 0x602b, 0x0000, 0xa874, 0x908e, 0x00ff, -+ 0x1110, 0x602b, 0x8000, 0x2009, 0x0043, 0x080c, 0xac8c, 0x9006, -+ 0x00b0, 0x2001, 0x0028, 0x0090, 0x2009, 0x180c, 0x210c, 0xd18c, -+ 0x0118, 0x2001, 0x0004, 0x0038, 0xd184, 0x0118, 0x2001, 0x0004, -+ 0x0010, 0x2001, 0x0029, 0x0010, 0x2001, 0x0029, 0x9005, 0x012e, -+ 0x00ee, 0x00be, 0x0005, 0x2001, 0x002c, 0x0cc0, 0x00b6, 0x00e6, -+ 0x0126, 0x2091, 0x8000, 0xa974, 0x9182, 0x0800, 0x1a04, 0x6211, -+ 0x9188, 0x1000, 0x2104, 0x905d, 0x0904, 0x61e9, 0xb8a0, 0x9086, -+ 0x007f, 0x0178, 0x080c, 0x6a73, 0x0160, 0xa994, 0x81ff, 0x0130, -+ 0x908e, 0x0004, 0x0130, 0x908e, 0x0005, 0x0118, 0x080c, 0x6a6b, -+ 0x1598, 0xa87c, 0xd0fc, 0x01e0, 0xa894, 0x9005, 0x01c8, 0x2060, -+ 0x0026, 0x2010, 0x080c, 0xc826, 0x002e, 0x1120, 0x2001, 0x0008, -+ 0x0804, 0x6213, 0x6020, 0x9086, 0x000a, 0x0120, 0x2001, 0x0008, -+ 0x0804, 0x6213, 0x601a, 0x6003, 0x0008, 0x2900, 0x6016, 0x0058, -+ 0x080c, 0xab97, 0x05e8, 0x2b00, 0x6012, 0x2900, 0x6016, 0x600b, -+ 0xffff, 0x6023, 0x000a, 0x2009, 0x0003, 0x080c, 0xac8c, 0x9006, -+ 0x0458, 0x2001, 0x0028, 0x0438, 0x9082, 0x0006, 0x1290, 0x080c, -+ 0xab57, 0x1160, 0xb8a0, 0x9084, 0xff80, 0x1140, 0xb900, 0xd1fc, -+ 0x0900, 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, 0x62a8, 0x6263, 0x627a, 0x62a8, 0x62a8, -+ 0x62a8, 0x62a8, 0x62a8, 0x2100, 0x9082, 0x007e, 0x1278, 0x080c, -+ 0x65c4, 0x0148, 0x9046, 0xb810, 0x9306, 0x1904, 0x62b0, 0xb814, -+ 0x9206, 0x15f0, 0x0028, 0xbb12, 0xba16, 0x0010, 0x080c, 0x49ba, -+ 0x0150, 0x04b0, 0x080c, 0x6625, 0x1598, 0xb810, 0x9306, 0x1580, -+ 0xb814, 0x9206, 0x1568, 0x080c, 0xab97, 0x0530, 0x2b00, 0x6012, -+ 0x080c, 0xcccc, 0x2900, 0x6016, 0x600b, 0xffff, 0x6023, 0x000a, -+ 0xa878, 0x9086, 0x0001, 0x1170, 0x080c, 0x31e7, 0x9006, 0x080c, -+ 0x6561, 0x2001, 0x0002, 0x080c, 0x6575, 0x2001, 0x0200, 0xb86e, -+ 0xb893, 0x0002, 0x2009, 0x0003, 0x080c, 0xac8c, 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, 0x6497, 0x90c6, 0x0056, 0x0904, 0x649b, -+ 0x90c6, 0x0066, 0x0904, 0x649f, 0x90c6, 0x0067, 0x0904, 0x64a3, -+ 0x90c6, 0x0068, 0x0904, 0x64a7, 0x90c6, 0x0071, 0x0904, 0x64ab, -+ 0x90c6, 0x0074, 0x0904, 0x64af, 0x90c6, 0x007c, 0x0904, 0x64b3, -+ 0x90c6, 0x007e, 0x0904, 0x64b7, 0x90c6, 0x0037, 0x0904, 0x64bb, -+ 0x9016, 0x2079, 0x1800, 0xa974, 0x9186, 0x00ff, 0x0904, 0x6492, -+ 0x9182, 0x0800, 0x1a04, 0x6492, 0x080c, 0x6625, 0x1198, 0xb804, -+ 0x9084, 0x00ff, 0x9082, 0x0006, 0x1268, 0xa894, 0x90c6, 0x006f, -+ 0x0148, 0x080c, 0xab57, 0x1904, 0x647b, 0xb8a0, 0x9084, 0xff80, -+ 0x1904, 0x647b, 0xa894, 0x90c6, 0x006f, 0x0158, 0x90c6, 0x005e, -+ 0x0904, 0x63db, 0x90c6, 0x0064, 0x0904, 0x6404, 0x2008, 0x0804, -+ 0x639d, 0xa998, 0xa8b0, 0x2040, 0x080c, 0xab57, 0x1120, 0x9182, -+ 0x007f, 0x0a04, 0x639d, 0x9186, 0x00ff, 0x0904, 0x639d, 0x9182, -+ 0x0800, 0x1a04, 0x639d, 0xaaa0, 0xab9c, 0x787c, 0x9306, 0x1188, -+ 0x7880, 0x0096, 0x924e, 0x1128, 0x2208, 0x2310, 0x009e, 0x0804, -+ 0x639d, 0x99cc, 0xff00, 0x009e, 0x1120, 0x2208, 0x2310, 0x0804, -+ 0x639d, 0x080c, 0x49ba, 0x0904, 0x63a7, 0x900e, 0x9016, 0x90c6, -+ 0x4000, 0x15e0, 0x0006, 0x080c, 0x6914, 0x1108, 0xc185, 0xb800, -+ 0xd0bc, 0x0108, 0xc18d, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, -+ 0x9080, 0x0031, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, -+ 0x2098, 0x080c, 0x0fb7, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, -+ 0x9080, 0x0035, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x000a, -+ 0x2098, 0x080c, 0x0fb7, 0xa8c4, 0xabc8, 0x9305, 0xabcc, 0x9305, -+ 0xabd0, 0x9305, 0xabd4, 0x9305, 0xabd8, 0x9305, 0xabdc, 0x9305, -+ 0xabe0, 0x9305, 0x9005, 0x0510, 0x000e, 0x00c8, 0x90c6, 0x4007, -+ 0x1110, 0x2408, 0x00a0, 0x90c6, 0x4008, 0x1118, 0x2708, 0x2610, -+ 0x0070, 0x90c6, 0x4009, 0x1108, 0x0050, 0x90c6, 0x4006, 0x0138, -+ 0x2001, 0x4005, 0x2009, 0x000a, 0x0010, 0x2001, 0x4006, 0xa896, -+ 0xa99a, 0xaa9e, 0x2001, 0x0030, 0x900e, 0x0478, 0x000e, 0x080c, -+ 0xab97, 0x1130, 0x2001, 0x4005, 0x2009, 0x0003, 0x9016, 0x0c78, -+ 0x2b00, 0x6012, 0x080c, 0xcccc, 0x2900, 0x6016, 0x6023, 0x0001, -+ 0xa868, 0xd88c, 0x0108, 0xc0f5, 0xa86a, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x31e7, 0x012e, 0x9006, 0x080c, 0x6561, 0x2001, 0x0002, -+ 0x080c, 0x6575, 0x2009, 0x0002, 0x080c, 0xac8c, 0xa8b0, 0xd094, -+ 0x0118, 0xb8d4, 0xc08d, 0xb8d6, 0x9006, 0x9005, 0x012e, 0x00ee, -+ 0x00fe, 0x00be, 0x0005, 0x080c, 0x56ee, 0x0118, 0x2009, 0x0007, -+ 0x00f8, 0xa998, 0xaeb0, 0x080c, 0x6625, 0x1904, 0x6398, 0x9186, -+ 0x007f, 0x0130, 0x080c, 0x6a6b, 0x0118, 0x2009, 0x0009, 0x0080, -+ 0x0096, 0x080c, 0x103a, 0x1120, 0x009e, 0x2009, 0x0002, 0x0040, -+ 0x2900, 0x009e, 0xa806, 0x080c, 0xca24, 0x19b0, 0x2009, 0x0003, -+ 0x2001, 0x4005, 0x0804, 0x639f, 0xa998, 0xaeb0, 0x080c, 0x6625, -+ 0x1904, 0x6398, 0x0096, 0x080c, 0x103a, 0x1128, 0x009e, 0x2009, -+ 0x0002, 0x0804, 0x6458, 0x2900, 0x009e, 0xa806, 0x0096, 0x2048, -+ 0x20a9, 0x002b, 0xb8c4, 0x20e0, 0xb8c8, 0x2098, 0xa860, 0x20e8, -+ 0xa85c, 0x9080, 0x0002, 0x20a0, 0x4003, 0x20a9, 0x0008, 0x9080, -+ 0x0006, 0x20a0, 0xbbc8, 0x9398, 0x0006, 0x2398, 0x080c, 0x0fb7, -+ 0x009e, 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0xd684, -+ 0x1168, 0x080c, 0x56da, 0xd0b4, 0x1118, 0xa89b, 0x000b, 0x00e0, -+ 0xb800, 0xd08c, 0x0118, 0xa89b, 0x000c, 0x00b0, 0x080c, 0x6a6b, -+ 0x0118, 0xa89b, 0x0009, 0x0080, 0x080c, 0x56ee, 0x0118, 0xa89b, -+ 0x0007, 0x0050, 0x080c, 0xca07, 0x1904, 0x63d4, 0x2009, 0x0003, -+ 0x2001, 0x4005, 0x0804, 0x639f, 0xa87b, 0x0030, 0xa897, 0x4005, -+ 0xa804, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, 0x9084, 0xffc0, -+ 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, 0xaca8, 0xada4, -+ 0x2031, 0x0000, 0x2041, 0x127e, 0x080c, 0xb112, 0x1904, 0x63d4, -+ 0x2009, 0x0002, 0x08e8, 0x2001, 0x0028, 0x900e, 0x0804, 0x63d5, -+ 0x2009, 0x180c, 0x210c, 0xd18c, 0x0118, 0x2001, 0x0004, 0x0038, -+ 0xd184, 0x0118, 0x2001, 0x0004, 0x0010, 0x2001, 0x0029, 0x900e, -+ 0x0804, 0x63d5, 0x2001, 0x0029, 0x900e, 0x0804, 0x63d5, 0x080c, -+ 0x3797, 0x0804, 0x63d6, 0x080c, 0x540f, 0x0804, 0x63d6, 0x080c, -+ 0x4573, 0x0804, 0x63d6, 0x080c, 0x45ec, 0x0804, 0x63d6, 0x080c, -+ 0x4648, 0x0804, 0x63d6, 0x080c, 0x4a7d, 0x0804, 0x63d6, 0x080c, -+ 0x4d34, 0x0804, 0x63d6, 0x080c, 0x507a, 0x0804, 0x63d6, 0x080c, -+ 0x5273, 0x0804, 0x63d6, 0x080c, 0x39b5, 0x0804, 0x63d6, 0x00b6, -+ 0xa974, 0xae78, 0x9684, 0x3fff, 0x9082, 0x4000, 0x1608, 0x9182, -+ 0x0800, 0x1258, 0x9188, 0x1000, 0x2104, 0x905d, 0x0130, 0x080c, -+ 0x6a6b, 0x1138, 0x00d9, 0x9006, 0x00b0, 0x2001, 0x0028, 0x900e, -+ 0x0090, 0x9082, 0x0006, 0x1240, 0xb900, 0xd1fc, 0x0d98, 0x2001, -+ 0x0029, 0x2009, 0x1000, 0x0038, 0x2001, 0x0029, 0x900e, 0x0018, -+ 0x2001, 0x0029, 0x900e, 0x9005, 0x00be, 0x0005, 0xa877, 0x0000, -+ 0xb8d0, 0x9005, 0x1904, 0x6555, 0xb888, 0x9005, 0x1904, 0x6555, -+ 0xb838, 0xb93c, 0x9102, 0x1a04, 0x6555, 0x2b10, 0x080c, 0xabc4, -+ 0x0904, 0x6551, 0x8108, 0xb93e, 0x6212, 0x2900, 0x6016, 0x6023, -+ 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878, 0x605e, 0xa880, -+ 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c, 0xd0ac, 0x0588, -+ 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1530, 0xa816, 0xa864, 0x9094, -+ 0x00f7, 0x9296, 0x0011, 0x11f8, 0x9084, 0x00ff, 0xc0bd, 0x601e, -+ 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x000f, 0x8001, 0x1df0, -+ 0x2001, 0x8004, 0x6003, 0x0004, 0x6046, 0x00f6, 0x2079, 0x0380, -+ 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0010, 0x2c00, 0x7836, 0x781b, -+ 0x8080, 0x00fe, 0x0005, 0x080c, 0x1731, 0x601c, 0xc0bd, 0x601e, -+ 0x0c38, 0xd0b4, 0x190c, 0x1c30, 0x2001, 0x8004, 0x6003, 0x0002, -+ 0x0c18, 0x81ff, 0x1110, 0xb88b, 0x0001, 0x2908, 0xb8cc, 0xb9ce, -+ 0x9005, 0x1110, 0xb9d2, 0x0020, 0x0096, 0x2048, 0xa902, 0x009e, -+ 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, 0x6a67, 0x0140, 0x9284, -+ 0xff00, 0x8007, 0x9086, 0x0007, 0x1110, 0x2011, 0x0600, 0x000e, -+ 0x9294, 0xff00, 0x9215, 0xba06, 0x0006, 0x9086, 0x0006, 0x1120, -+ 0xba90, 0x82ff, 0x090c, 0x0d7d, 0x000e, 0x00ce, 0x012e, 0x00be, -+ 0x0005, 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x6210, 0x2258, -+ 0xba04, 0x0006, 0x9086, 0x0006, 0x1168, 0xb89c, 0xd0a4, 0x0150, -+ 0x080c, 0x6a63, 0x1138, 0x9284, 0x00ff, 0x9086, 0x0007, 0x1110, -+ 0x2011, 0x0006, 0x000e, 0x9294, 0x00ff, 0x8007, 0x9215, 0xba06, -+ 0x00ce, 0x012e, 0x00be, 0x0005, 0x9182, 0x0800, 0x0218, 0x9085, -+ 0x0001, 0x0005, 0x00d6, 0x0026, 0x9190, 0x1000, 0x2204, 0x905d, -+ 0x1188, 0x0096, 0x080c, 0x103a, 0x2958, 0x009e, 0x0168, 0x2b00, -+ 0x2012, 0xb85c, 0xb8ca, 0xb860, 0xb8c6, 0x9006, 0xb8a6, 0xb8ae, -+ 0x080c, 0x6043, 0x9006, 0x0010, 0x9085, 0x0001, 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, 0x106c, 0x00d6, 0x00c6, 0xb8bc, 0x2060, 0x8cff, 0x0168, -+ 0x600c, 0x0006, 0x6014, 0x2048, 0x080c, 0xc838, 0x0110, 0x080c, -+ 0x0fec, 0x080c, 0xabed, 0x00ce, 0x0c88, 0x00ce, 0x00de, 0x2b48, -+ 0xb8c8, 0xb85e, 0xb8c4, 0xb862, 0x080c, 0x107c, 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, 0x74e9, -+ 0x1510, 0xb8a0, 0x9086, 0x007e, 0x0120, 0x080c, 0xab57, 0x11d8, -+ 0x0078, 0x7040, 0xd0e4, 0x01b8, 0x00c6, 0x2061, 0x1982, 0x7048, -+ 0x2062, 0x704c, 0x6006, 0x7050, 0x600a, 0x7054, 0x600e, 0x00ce, -+ 0x703c, 0x2069, 0x0140, 0x9005, 0x1110, 0x2001, 0x0001, 0x6886, -+ 0x2069, 0x1800, 0x68b6, 0x7040, 0xb85e, 0x7048, 0xb862, 0x704c, -+ 0xb866, 0x20e1, 0x0000, 0x2099, 0x0276, 0xb8c4, 0x20e8, 0xb8c8, -+ 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, 0xbbd4, 0xc384, 0xba00, 0x2009, -+ 0x1867, 0x210c, 0xd0bc, 0x0120, 0xd1ec, 0x0110, 0xc2ad, 0x0008, -+ 0xc2ac, 0xd0c4, 0x0148, 0xd1e4, 0x0138, 0xc2bd, 0xd0cc, 0x0128, -+ 0xd38c, 0x1108, 0xc385, 0x0008, 0xc2bc, 0xba02, 0xbbd6, 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, 0x0d7d, 0x3c00, 0x20e8, 0x3300, -+ 0x8001, 0x20a0, 0x4604, 0x8210, 0xaa06, 0x01de, 0x01ce, 0x014e, -+ 0x013e, 0x0060, 0x080c, 0x103a, 0x0170, 0x2900, 0xb8a6, 0xa803, -+ 0x0000, 0x080c, 0x68b0, 0xa807, 0x0001, 0xae12, 0x9085, 0x0001, -+ 0x012e, 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0126, 0x2091, 0x8000, -+ 0x0096, 0xb8a4, 0x904d, 0x0188, 0xa800, 0x9005, 0x1150, 0x080c, -+ 0x68bf, 0x1158, 0xa804, 0x908a, 0x0002, 0x0218, 0x8001, 0xa806, -+ 0x0020, 0x080c, 0x106c, 0xb8a7, 0x0000, 0x009e, 0x012e, 0x0005, -+ 0x0096, 0x00c6, 0xb888, 0x9005, 0x1904, 0x67a9, 0xb8d0, 0x904d, -+ 0x0904, 0x67a9, 0x080c, 0xabc4, 0x0904, 0x67a5, 0x8210, 0xba3e, -+ 0xa800, 0xb8d2, 0x9005, 0x1108, 0xb8ce, 0x2b00, 0x6012, 0x2900, -+ 0x6016, 0x6023, 0x0003, 0x600b, 0xffff, 0x6007, 0x0040, 0xa878, -+ 0x605e, 0xa880, 0x9084, 0x00ff, 0x6066, 0xa883, 0x0000, 0xa87c, -+ 0xd0ac, 0x01c8, 0xc0dd, 0xa87e, 0xa888, 0x8001, 0x1568, 0xa816, -+ 0xa864, 0x9094, 0x00f7, 0x9296, 0x0011, 0x1530, 0x9084, 0x00ff, -+ 0xc0bd, 0x601e, 0xa8ac, 0xaab0, 0xa836, 0xaa3a, 0x2001, 0x8004, -+ 0x6003, 0x0004, 0x0030, 0x080c, 0x1c30, 0x2001, 0x8004, 0x6003, -+ 0x0002, 0x6046, 0x2001, 0x0010, 0x2c08, 0x080c, 0xa887, 0xb838, -+ 0xba3c, 0x9202, 0x0a04, 0x6756, 0x0020, 0x82ff, 0x1110, 0xb88b, -+ 0x0001, 0x00ce, 0x009e, 0x0005, 0x080c, 0x1731, 0x601c, 0xc0bd, -+ 0x601e, 0x08e0, 0x00b6, 0x0096, 0x0016, 0x20a9, 0x0800, 0x900e, -+ 0x0016, 0x080c, 0x6625, 0x1158, 0xb8d0, 0x904d, 0x0140, 0x3e00, -+ 0x9086, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x1108, 0x0041, 0x001e, -+ 0x8108, 0x1f04, 0x67b8, 0x001e, 0x00be, 0x009e, 0x0005, 0x0096, -+ 0x0016, 0xb8d0, 0x904d, 0x0188, 0xa800, 0xb8d2, 0x9005, 0x1108, -+ 0xb8ce, 0x9006, 0xa802, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, -+ 0x080c, 0xcb36, 0x080c, 0x6d80, 0x0c60, 0x001e, 0x009e, 0x0005, -+ 0x0086, 0x9046, 0xb8d0, 0x904d, 0x0198, 0xa86c, 0x9406, 0x1118, -+ 0xa870, 0x9506, 0x0128, 0x2940, 0xa800, 0x904d, 0x0148, 0x0ca8, -+ 0xa800, 0x88ff, 0x1110, 0xb8d2, 0x0008, 0xa002, 0xa803, 0x0000, -+ 0x008e, 0x0005, 0x901e, 0x0010, 0x2019, 0x0001, 0x00e6, 0x0096, -+ 0x00c6, 0x0086, 0x0026, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, -+ 0x9046, 0x7028, 0x9065, 0x01e8, 0x6014, 0x2068, 0x83ff, 0x0120, -+ 0x605c, 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, -+ 0x9506, 0x0120, 0x2c40, 0x600c, 0x2060, 0x0c60, 0x600c, 0x0006, -+ 0x0066, 0x2830, 0x080c, 0x9fa2, 0x006e, 0x000e, 0x83ff, 0x0508, -+ 0x0c08, 0x9046, 0xb8d0, 0x904d, 0x01e0, 0x83ff, 0x0120, 0xa878, -+ 0x9606, 0x0158, 0x0030, 0xa86c, 0x9406, 0x1118, 0xa870, 0x9506, -+ 0x0120, 0x2940, 0xa800, 0x2048, 0x0c70, 0xb8d0, 0xaa00, 0x0026, -+ 0x9906, 0x1110, 0xbad2, 0x0008, 0xa202, 0x000e, 0x83ff, 0x0108, -+ 0x0c10, 0x002e, 0x008e, 0x00ce, 0x009e, 0x00ee, 0x0005, 0x9016, -+ 0x0489, 0x1110, 0x2011, 0x0001, 0x0005, 0x080c, 0x6914, 0x0128, -+ 0x080c, 0xc8f9, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, 0x6914, -+ 0x0128, 0x080c, 0xc89a, 0x0010, 0x9085, 0x0001, 0x0005, 0x080c, -+ 0x6914, 0x0128, 0x080c, 0xc8f6, 0x0010, 0x9085, 0x0001, 0x0005, -+ 0x080c, 0x6914, 0x0128, 0x080c, 0xc8b9, 0x0010, 0x9085, 0x0001, -+ 0x0005, 0x080c, 0x6914, 0x0128, 0x080c, 0xc93a, 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, 0x103a, 0x0168, 0x2900, 0xb8a6, 0x080c, -+ 0x68b0, 0xa803, 0x0001, 0xa807, 0x0000, 0x9085, 0x0001, 0x012e, -+ 0x009e, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x0126, 0x2091, 0x8000, -+ 0xb8a4, 0x904d, 0x0130, 0xb8a7, 0x0000, 0x080c, 0x106c, 0x9085, -+ 0x0001, 0x012e, 0x009e, 0x0005, 0xb89c, 0xd0a4, 0x0005, 0x00b6, -+ 0x00f6, 0x080c, 0x74e9, 0x01b0, 0x71c4, 0x81ff, 0x1198, 0x71dc, -+ 0xd19c, 0x0180, 0x2001, 0x007e, 0x9080, 0x1000, 0x2004, 0x905d, -+ 0x0148, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x1118, 0xb800, -+ 0xc0ed, 0xb802, 0x2079, 0x1847, 0x7804, 0xd0a4, 0x01d0, 0x0156, -+ 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, 0x6625, 0x1168, 0xb804, -+ 0x9084, 0xff00, 0x8007, 0x9096, 0x0004, 0x0118, 0x9086, 0x0006, -+ 0x1118, 0xb800, 0xc0ed, 0xb802, 0x001e, 0x8108, 0x1f04, 0x693b, -+ 0x015e, 0x080c, 0x6a29, 0x0120, 0x2001, 0x1985, 0x200c, 0x0038, -+ 0x2079, 0x1847, 0x7804, 0xd0a4, 0x0130, 0x2009, 0x07d0, 0x2011, -+ 0x6966, 0x080c, 0x8708, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x2011, -+ 0x6966, 0x080c, 0x863e, 0x080c, 0x6a29, 0x01d8, 0x2001, 0x107e, -+ 0x2004, 0x2058, 0xb900, 0xc1ec, 0xb902, 0x080c, 0x6a67, 0x0130, -+ 0x2009, 0x07d0, 0x2011, 0x6966, 0x080c, 0x8708, 0x00e6, 0x2071, -+ 0x1800, 0x9006, 0x707e, 0x7060, 0x7082, 0x080c, 0x2fb2, 0x00ee, -+ 0x04d0, 0x0156, 0x00c6, 0x20a9, 0x007f, 0x900e, 0x0016, 0x080c, -+ 0x6625, 0x1558, 0xb800, 0xd0ec, 0x0540, 0x0046, 0xbaa0, 0x2220, -+ 0x9006, 0x2009, 0x0029, 0x080c, 0xe2c9, 0xb800, 0xc0e5, 0xc0ec, -+ 0xb802, 0x080c, 0x6a63, 0x2001, 0x0707, 0x1128, 0xb804, 0x9084, -+ 0x00ff, 0x9085, 0x0700, 0xb806, 0x080c, 0xa896, 0x2019, 0x0029, -+ 0x080c, 0x93a5, 0x0076, 0x903e, 0x080c, 0x9277, 0x900e, 0x080c, -+ 0xdfeb, 0x007e, 0x004e, 0x080c, 0xa8b2, 0x001e, 0x8108, 0x1f04, -+ 0x698e, 0x00ce, 0x015e, 0x00be, 0x0005, 0x00b6, 0x6010, 0x2058, -+ 0xb800, 0xc0ec, 0xb802, 0x00be, 0x0005, 0x00b6, 0x00c6, 0x0096, -+ 0x080c, 0x1053, 0x090c, 0x0d7d, 0x2958, 0x009e, 0x2001, 0x196b, -+ 0x2b02, 0x8b07, 0x8006, 0x8006, 0x908c, 0x003f, 0xb9c6, 0x908c, -+ 0xffc0, 0xb9ca, 0xb8af, 0x0000, 0x2009, 0x00ff, 0x080c, 0x6043, -+ 0xb807, 0x0006, 0xb813, 0x00ff, 0xb817, 0xffff, 0xb86f, 0x0200, -+ 0xb86c, 0xb893, 0x0002, 0xb8bb, 0x0520, 0xb8a3, 0x00ff, 0xb8af, -+ 0x0000, 0x00ce, 0x00be, 0x0005, 0x7810, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0ac, 0x0005, 0x6010, 0x00b6, 0x905d, 0x0108, 0xb800, -+ 0x00be, 0xd0bc, 0x0005, 0x0006, 0x0016, 0x0026, 0xb804, 0x908c, -+ 0x00ff, 0x9196, 0x0006, 0x0188, 0x9196, 0x0004, 0x0170, 0x9196, -+ 0x0005, 0x0158, 0x908c, 0xff00, 0x810f, 0x9196, 0x0006, 0x0128, -+ 0x9196, 0x0004, 0x0110, 0x9196, 0x0005, 0x002e, 0x001e, 0x000e, -+ 0x0005, 0x00b6, 0x00f6, 0x2001, 0x107e, 0x2004, 0x905d, 0x0110, -+ 0xb800, 0xd0ec, 0x00fe, 0x00be, 0x0005, 0x0126, 0x0026, 0x2091, -+ 0x8000, 0x0006, 0xbaa0, 0x9290, 0x1000, 0x2204, 0x9b06, 0x190c, -+ 0x0d7d, 0x000e, 0xba00, 0x9005, 0x0110, 0xc2fd, 0x0008, 0xc2fc, -+ 0xba02, 0x002e, 0x012e, 0x0005, 0x2011, 0x1837, 0x2204, 0xd0cc, -+ 0x0138, 0x2001, 0x1983, 0x200c, 0x2011, 0x6a59, 0x080c, 0x8708, -+ 0x0005, 0x2011, 0x6a59, 0x080c, 0x863e, 0x2011, 0x1837, 0x2204, -+ 0xc0cc, 0x2012, 0x0005, 0x080c, 0x56da, 0xd0ac, 0x0005, 0x080c, -+ 0x56da, 0xd0a4, 0x0005, 0x0016, 0xb904, 0x9184, 0x00ff, 0x908e, -+ 0x0006, 0x001e, 0x0005, 0x0016, 0xb904, 0x9184, 0xff00, 0x8007, -+ 0x908e, 0x0006, 0x001e, 0x0005, 0x00b6, 0x00f6, 0x080c, 0xcf52, -+ 0x0158, 0x70dc, 0x9084, 0x0028, 0x0138, 0x2001, 0x107f, 0x2004, -+ 0x905d, 0x0110, 0xb8d4, 0xd094, 0x00fe, 0x00be, 0x0005, 0x2071, -+ 0x1910, 0x7003, 0x0001, 0x7007, 0x0000, 0x9006, 0x7012, 0x7016, -+ 0x701a, 0x701e, 0x700a, 0x7046, 0x2001, 0x1947, 0x2003, 0x0000, -+ 0x0005, 0x0016, 0x00e6, 0x2071, 0x1948, 0x900e, 0x710a, 0x080c, -+ 0x56da, 0xd0fc, 0x1140, 0x080c, 0x56da, 0x900e, 0xd09c, 0x0108, -+ 0x8108, 0x7102, 0x00f8, 0x2001, 0x1867, 0x200c, 0x9184, 0x0007, -+ 0x0002, 0x6aab, 0x6aab, 0x6aab, 0x6aab, 0x6aab, 0x6ac1, 0x6acf, -+ 0x6aab, 0x7003, 0x0003, 0x2009, 0x1868, 0x210c, 0x9184, 0xff00, -+ 0x8007, 0x9005, 0x1110, 0x2001, 0x0002, 0x7006, 0x0018, 0x7003, -+ 0x0005, 0x0c88, 0x00ee, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0050, -+ 0x684c, 0x9005, 0x1150, 0x00e6, 0x2071, 0x1910, 0x7028, 0xc085, -+ 0x702a, 0x00ee, 0x9085, 0x0001, 0x0488, 0x6844, 0x9005, 0x0158, -+ 0x080c, 0x785f, 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, 0x1910, 0x7028, 0xc084, 0x702a, -+ 0x7007, 0x0001, 0x700b, 0x0000, 0x00ee, 0x9006, 0x00ee, 0x0005, -+ 0x00e6, 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6d85, -+ 0x9286, 0x0003, 0x0904, 0x6c15, 0x9286, 0x0005, 0x0904, 0x6c15, -+ 0x2071, 0x1877, 0xa87c, 0x9005, 0x0904, 0x6b76, 0x7140, 0xa868, -+ 0x9102, 0x0a04, 0x6d85, 0xa878, 0xd084, 0x15d8, 0xa853, 0x0019, -+ 0x2001, 0x8023, 0xa84e, 0x2071, 0x1910, 0x701c, 0x9005, 0x1904, -+ 0x6f28, 0x0e04, 0x6f96, 0x2071, 0x0000, 0xa850, 0x7032, 0xa84c, -+ 0x7082, 0xa870, 0x7086, 0xa86c, 0x708a, 0xa880, 0x708e, 0x7036, -+ 0x0146, 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, -+ 0x002a, 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, -+ 0x2098, 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x2091, -+ 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x0804, -+ 0x6bf8, 0xa853, 0x001b, 0x2001, 0x8027, 0x0820, 0x7004, 0xd08c, -+ 0x1904, 0x6d85, 0xa853, 0x001a, 0x2001, 0x8024, 0x0804, 0x6b3a, -+ 0x00e6, 0x0026, 0x2071, 0x1948, 0x7000, 0x9015, 0x0904, 0x6d85, -+ 0x9286, 0x0003, 0x0904, 0x6c15, 0x9286, 0x0005, 0x0904, 0x6c15, -+ 0xa84f, 0x8022, 0xa853, 0x0018, 0x0804, 0x6bdd, 0xa868, 0xd0fc, -+ 0x11d8, 0x00e6, 0x0026, 0x2001, 0x1948, 0x2004, 0x9005, 0x0904, -+ 0x6d85, 0xa87c, 0xd0bc, 0x1904, 0x6d85, 0xa978, 0xa874, 0x9105, -+ 0x1904, 0x6d85, 0x2001, 0x1948, 0x2004, 0x0002, 0x6d85, 0x6bd9, -+ 0x6c15, 0x6c15, 0x6d85, 0x6c15, 0x0005, 0xa868, 0xd0fc, 0x1500, -+ 0x00e6, 0x0026, 0x2009, 0x1948, 0x210c, 0x81ff, 0x0904, 0x6d85, -+ 0xa87c, 0xd0cc, 0x0904, 0x6d85, 0xa880, 0x9084, 0x00ff, 0x9086, -+ 0x0001, 0x1904, 0x6d85, 0x9186, 0x0003, 0x0904, 0x6c15, 0x9186, -+ 0x0005, 0x0904, 0x6c15, 0xa84f, 0x8021, 0xa853, 0x0017, 0x0028, -+ 0x0005, 0xa84f, 0x8020, 0xa853, 0x0016, 0x2071, 0x1910, 0x701c, -+ 0x9005, 0x1904, 0x6f28, 0x0e04, 0x6f96, 0x2071, 0x0000, 0xa84c, -+ 0x7082, 0xa850, 0x7032, 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, -+ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, -+ 0x2071, 0x1800, 0x2011, 0x0001, 0xa804, 0x900d, 0x702c, 0x1158, -+ 0xa802, 0x2900, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8553, -+ 0x002e, 0x00ee, 0x0005, 0x0096, 0x2148, 0xa904, 0xa802, 0x8210, -+ 0x2900, 0x81ff, 0x1dc8, 0x009e, 0x0c58, 0xa84f, 0x0000, 0x00f6, -+ 0x2079, 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, -+ 0x1904, 0x6d0a, 0x782c, 0x908c, 0x0780, 0x190c, 0x70e2, 0x8004, -+ 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6c33, 0x6d0a, 0x6c58, -+ 0x6ca5, 0x080c, 0x0d7d, 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, -+ 0x900d, 0x1170, 0x2071, 0x1a03, 0x703c, 0x9005, 0x1328, 0x2001, -+ 0x1949, 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8553, 0x0c10, -+ 0x2071, 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x15a8, 0x7824, -+ 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830, -+ 0x210c, 0x918a, 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, -+ 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, -+ 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8553, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x70e2, 0xd0a4, 0x19c8, 0x2071, 0x1a03, -+ 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, 0x703e, -+ 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, 0x702c, 0x2148, 0xa904, -+ 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, -+ 0x70c2, 0x080c, 0x8553, 0x0804, 0x6c5f, 0x0096, 0x00e6, 0x7824, -+ 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, -+ 0x8000, 0x70c2, 0x080c, 0x8553, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x70e2, 0xd0a4, 0x1d60, 0x00ee, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x70e2, 0xd09c, 0x11a0, 0x009e, 0x2900, 0x7822, 0xa804, 0x900d, -+ 0x1560, 0x2071, 0x1a03, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, -+ 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x009e, -+ 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, 0x711a, 0x0110, -+ 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, 0x1170, 0x2071, -+ 0x1a03, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, 0x2004, 0x8005, -+ 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2071, 0x1800, 0x9016, -+ 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, -+ 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8553, 0x00fe, 0x002e, -+ 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, -+ 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, -+ 0x1904, 0x6d5f, 0x782c, 0x9094, 0x0780, 0x190c, 0x70e2, 0xd09c, -+ 0x1198, 0x701c, 0x904d, 0x0180, 0x7010, 0x8001, 0x7012, 0x1108, -+ 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x70e2, 0xd09c, 0x0d68, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x70e2, 0xd0a4, 0x01b0, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, -+ 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, -+ 0x8553, 0x782c, 0x9094, 0x0780, 0x190c, 0x70e2, 0xd0a4, 0x1d60, -+ 0x00ee, 0x2071, 0x1a03, 0x703c, 0x9005, 0x1328, 0x2001, 0x1949, -+ 0x2004, 0x8005, 0x703e, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, -+ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, -+ 0x8553, 0x00ee, 0x0804, 0x6d1a, 0xa868, 0xd0fc, 0x1560, 0x0096, -+ 0xa804, 0xa807, 0x0000, 0x904d, 0x190c, 0x0fec, 0x009e, 0x0018, -+ 0xa868, 0xd0fc, 0x1500, 0x00e6, 0x0026, 0xa84f, 0x0000, 0x00f6, -+ 0x2079, 0x0050, 0x2071, 0x1910, 0xa803, 0x0000, 0x7010, 0x9005, -+ 0x1904, 0x6ea2, 0x782c, 0x908c, 0x0780, 0x190c, 0x70e2, 0x8004, -+ 0x8004, 0x8004, 0x9084, 0x0003, 0x0002, 0x6da4, 0x6ea2, 0x6dbf, -+ 0x6e31, 0x080c, 0x0d7d, 0x0005, 0x2071, 0x1800, 0x2900, 0x7822, -+ 0xa804, 0x900d, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x9016, -+ 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, 0x1dc8, -+ 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8553, 0x0c60, 0x2071, -+ 0x1800, 0x2900, 0x7822, 0xa804, 0x900d, 0x1904, 0x6e20, 0x7830, -+ 0xd0dc, 0x1120, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x7824, 0x00e6, -+ 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, 0x2009, 0x1830, 0x210c, -+ 0x918a, 0x0020, 0x0240, 0x7022, 0x2001, 0x1dc0, 0x200c, 0x8108, -+ 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, 0x702c, 0xa802, 0x2900, -+ 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8553, 0x782c, 0x9094, -+ 0x0780, 0x190c, 0x70e2, 0xd0a4, 0x19c8, 0x0e04, 0x6e17, 0x7838, -+ 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, -+ 0x0013, 0x00de, 0x2001, 0x1921, 0x200c, 0xc184, 0x2102, 0x2091, -+ 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x2009, -+ 0x1947, 0x200b, 0x0000, 0x00fe, 0x002e, 0x00ee, 0x0005, 0x2001, -+ 0x1921, 0x200c, 0xc185, 0x2102, 0x00fe, 0x002e, 0x00ee, 0x0005, -+ 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, 0x2900, 0x81ff, -+ 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8553, 0x0804, -+ 0x6dce, 0x0096, 0x00e6, 0x7824, 0x2048, 0x2071, 0x1800, 0x702c, -+ 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8553, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x70e2, 0xd0a4, 0x1d60, 0x00ee, -+ 0x0e04, 0x6e75, 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, -+ 0x0000, 0x6836, 0x6833, 0x0013, 0x00de, 0x7044, 0xc084, 0x7046, -+ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, -+ 0x2009, 0x1947, 0x200b, 0x0000, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x70e2, 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, 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8553, 0x00fe, 0x002e, -+ 0x00ee, 0x0005, 0x2908, 0x7010, 0x8000, 0x7012, 0x7018, 0x904d, -+ 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, 0xa804, 0x900d, -+ 0x1904, 0x6f13, 0x782c, 0x9094, 0x0780, 0x190c, 0x70e2, 0xd09c, -+ 0x11b0, 0x701c, 0x904d, 0x0198, 0xa84c, 0x9005, 0x1180, 0x7010, -+ 0x8001, 0x7012, 0x1108, 0x701a, 0xa800, 0x701e, 0x2900, 0x7822, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x70e2, 0xd09c, 0x0d50, 0x782c, -+ 0x9094, 0x0780, 0x190c, 0x70e2, 0xd0a4, 0x05c8, 0x00e6, 0x7824, -+ 0x2048, 0x2071, 0x1800, 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, -+ 0x8000, 0x70c2, 0x080c, 0x8553, 0x782c, 0x9094, 0x0780, 0x190c, -+ 0x70e2, 0xd0a4, 0x1d60, 0x00ee, 0x0e04, 0x6f0c, 0x7838, 0x7938, -+ 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, 0x6833, 0x0013, -+ 0x00de, 0x7044, 0xc084, 0x7046, 0x2091, 0x4080, 0x2001, 0x0089, -+ 0x2004, 0xd084, 0x190c, 0x11d6, 0x2009, 0x1947, 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, -+ 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8553, 0x00ee, 0x0804, 0x6eb2, -+ 0x2071, 0x1910, 0xa803, 0x0000, 0x2908, 0x7010, 0x8000, 0x7012, -+ 0x7018, 0x904d, 0x711a, 0x0110, 0xa902, 0x0008, 0x711e, 0x2148, -+ 0xa804, 0x900d, 0x1128, 0x1e04, 0x6f53, 0x002e, 0x00ee, 0x0005, -+ 0x2071, 0x1800, 0x9016, 0x702c, 0x2148, 0xa904, 0xa802, 0x8210, -+ 0x2900, 0x81ff, 0x1dc8, 0x702e, 0x70c0, 0x9200, 0x70c2, 0x080c, -+ 0x8553, 0x0e04, 0x6f3d, 0x2071, 0x1910, 0x701c, 0x2048, 0xa84c, -+ 0x900d, 0x0d18, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, 0xa86c, -+ 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, 0x1278, -+ 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, -+ 0x2071, 0x1910, 0x080c, 0x70ce, 0x002e, 0x00ee, 0x0005, 0xa850, -+ 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, 0x01d6, -+ 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, 0xa868, -+ 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, 0x4003, -+ 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2071, 0x1910, -+ 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, -+ 0x70c0, 0x9200, 0x70c2, 0x080c, 0x8553, 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, -+ 0x1910, 0x7004, 0x0002, 0x6fe1, 0x6fe2, 0x70cd, 0x6fe2, 0x0d7d, -+ 0x70cd, 0x0005, 0x2001, 0x1948, 0x2004, 0x0002, 0x6fec, 0x6fec, -+ 0x7066, 0x7067, 0x6fec, 0x7067, 0x0126, 0x2091, 0x8000, 0x1e0c, -+ 0x70ed, 0x701c, 0x904d, 0x0508, 0xa84c, 0x9005, 0x0904, 0x7037, -+ 0x0e04, 0x7015, 0xa94c, 0x2071, 0x0000, 0x7182, 0xa850, 0x7032, -+ 0xa86c, 0x7086, 0x7036, 0xa870, 0x708a, 0xa850, 0x9082, 0x0019, -+ 0x1278, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, 0xd084, 0x190c, -+ 0x11d6, 0x2071, 0x1910, 0x080c, 0x70ce, 0x012e, 0x0804, 0x7065, -+ 0xa850, 0x9082, 0x001c, 0x1e68, 0xa880, 0x708e, 0x7036, 0x0146, -+ 0x01d6, 0x0136, 0x01c6, 0x0156, 0x20e9, 0x0000, 0x20a1, 0x002a, -+ 0xa868, 0x20a8, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0021, 0x2098, -+ 0x4003, 0x015e, 0x01ce, 0x013e, 0x01de, 0x014e, 0x0890, 0x2001, -+ 0x005b, 0x2004, 0x9094, 0x0780, 0x190c, 0x70e2, 0xd09c, 0x2071, -+ 0x1910, 0x1510, 0x2071, 0x1910, 0x700f, 0x0001, 0xa964, 0x9184, -+ 0x00ff, 0x9086, 0x0003, 0x1130, 0x810f, 0x918c, 0x00ff, 0x8101, -+ 0x0108, 0x710e, 0x2900, 0x00d6, 0x2069, 0x0050, 0x6822, 0x00de, -+ 0x2071, 0x1910, 0x701c, 0x2048, 0x7010, 0x8001, 0x7012, 0xa800, -+ 0x701e, 0x9005, 0x1108, 0x701a, 0x012e, 0x0005, 0x0005, 0x00d6, -+ 0x2008, 0x2069, 0x1a03, 0x683c, 0x9005, 0x0760, 0x0158, 0x9186, -+ 0x0003, 0x0540, 0x2001, 0x1815, 0x2004, 0x2009, 0x1b4e, 0x210c, -+ 0x9102, 0x1500, 0x0126, 0x2091, 0x8000, 0x2069, 0x0050, 0x693c, -+ 0x6838, 0x9106, 0x0190, 0x0e04, 0x7099, 0x2069, 0x0000, 0x6837, -+ 0x8040, 0x6833, 0x0012, 0x6883, 0x8040, 0x2091, 0x4080, 0x2001, -+ 0x0089, 0x2004, 0xd084, 0x190c, 0x11d6, 0x2069, 0x1a03, 0x683f, -+ 0xffff, 0x012e, 0x00de, 0x0126, 0x2091, 0x8000, 0x1e0c, 0x7163, -+ 0x701c, 0x904d, 0x0540, 0x2001, 0x005b, 0x2004, 0x9094, 0x0780, -+ 0x15c9, 0xd09c, 0x1500, 0x2071, 0x1910, 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, 0x106c, 0x0005, -+ 0x012e, 0x0005, 0x2091, 0x8000, 0x0e04, 0x70e4, 0x0006, 0x0016, -+ 0x2001, 0x8004, 0x0006, 0x0804, 0x0d86, 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, -+ 0x11d6, 0x2009, 0x1947, 0x200b, 0x0000, 0x00fe, 0x009e, 0x0005, -+ 0x782c, 0x9094, 0x0780, 0x1971, 0xd0a4, 0x0db8, 0x2009, 0x1947, -+ 0x2104, 0x8000, 0x200a, 0x9082, 0x000f, 0x0e78, 0x00e6, 0x2071, -+ 0x1800, 0x7824, 0x00e6, 0x2071, 0x0040, 0x712c, 0xd19c, 0x1170, -+ 0x2009, 0x1830, 0x210c, 0x918a, 0x0020, 0x0240, 0x7022, 0x2001, -+ 0x1dc0, 0x200c, 0x8108, 0x2102, 0x00ee, 0x0058, 0x00ee, 0x2048, -+ 0x702c, 0xa802, 0x2900, 0x702e, 0x70c0, 0x8000, 0x70c2, 0x080c, -+ 0x8553, 0x782c, 0x9094, 0x0780, 0x190c, 0x70e2, 0xd0a4, 0x19c8, -+ 0x7838, 0x7938, 0x910e, 0x1de0, 0x00d6, 0x2069, 0x0000, 0x6836, -+ 0x6833, 0x0013, 0x00de, 0x2091, 0x4080, 0x2001, 0x0089, 0x2004, -+ 0xd084, 0x190c, 0x11d6, 0x2009, 0x1947, 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, 0x11d6, 0x00fe, 0x0005, -+ 0x782c, 0x9094, 0x0780, 0x190c, 0x70e2, 0xd0a4, 0x0db8, 0x00e6, -+ 0x2071, 0x1800, 0x7824, 0x2048, 0x702c, 0xa802, 0x2900, 0x702e, -+ 0x70c0, 0x8000, 0x70c2, 0x080c, 0x8553, 0x782c, 0x9094, 0x0780, -+ 0x190c, 0x70e2, 0xd0a4, 0x1d70, 0x00d6, 0x2069, 0x0050, 0x693c, -+ 0x2069, 0x1948, 0x6808, 0x690a, 0x2069, 0x1a03, 0x9102, 0x1118, -+ 0x683c, 0x9005, 0x1328, 0x2001, 0x1949, 0x200c, 0x810d, 0x693e, -+ 0x00de, 0x00ee, 0x00fe, 0x0005, 0x7098, 0x908a, 0x0029, 0x1a0c, -+ 0x0d7d, 0x9082, 0x001d, 0x003b, 0x0026, 0x2011, 0x1e00, 0x080c, -+ 0x2a44, 0x002e, 0x0005, 0x728f, 0x7215, 0x7231, 0x725b, 0x727e, -+ 0x72be, 0x72d0, 0x7231, 0x72a6, 0x71d0, 0x71fe, 0x71cf, 0x0005, -+ 0x00d6, 0x2069, 0x0200, 0x6804, 0x9005, 0x1180, 0x6808, 0x9005, -+ 0x1518, 0x709b, 0x0028, 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, -+ 0x762b, 0x6028, 0x9085, 0x0600, 0x602a, 0x00b0, 0x709b, 0x0028, -+ 0x2069, 0x198f, 0x2d04, 0x7002, 0x6028, 0x9085, 0x0600, 0x602a, -+ 0x00e6, 0x0036, 0x0046, 0x0056, 0x2071, 0x1a6b, 0x080c, 0x1ab5, -+ 0x005e, 0x004e, 0x003e, 0x00ee, 0x00de, 0x0005, 0x00d6, 0x2069, -+ 0x0200, 0x6804, 0x9005, 0x1178, 0x6808, 0x9005, 0x1160, 0x709b, -+ 0x0028, 0x2069, 0x198f, 0x2d04, 0x7002, 0x080c, 0x76ce, 0x6028, -+ 0x9085, 0x0600, 0x602a, 0x00de, 0x0005, 0x0006, 0x2001, 0x0090, -+ 0x080c, 0x2a0a, 0x000e, 0x6124, 0xd1e4, 0x1190, 0x080c, 0x7341, -+ 0xd1d4, 0x1160, 0xd1dc, 0x1138, 0xd1cc, 0x0150, 0x709b, 0x0020, -+ 0x080c, 0x7341, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, -+ 0x0005, 0x2001, 0x0088, 0x080c, 0x2a0a, 0x6124, 0xd1cc, 0x11e8, -+ 0xd1dc, 0x11c0, 0xd1e4, 0x1198, 0x9184, 0x1e00, 0x11d8, 0x080c, -+ 0x1adf, 0x60e3, 0x0001, 0x600c, 0xc0b4, 0x600e, 0x080c, 0x7515, -+ 0x2001, 0x0080, 0x080c, 0x2a0a, 0x709b, 0x0028, 0x0058, 0x709b, -+ 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, -+ 0x709b, 0x001f, 0x0005, 0x080c, 0x1adf, 0x60e3, 0x0001, 0x600c, -+ 0xc0b4, 0x600e, 0x080c, 0x7515, 0x2001, 0x0080, 0x080c, 0x2a0a, -+ 0x6124, 0xd1d4, 0x1180, 0xd1dc, 0x1158, 0xd1e4, 0x1130, 0x9184, -+ 0x1e00, 0x1158, 0x709b, 0x0028, 0x0040, 0x709b, 0x001e, 0x0028, -+ 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, 0x2001, 0x00a0, -+ 0x080c, 0x2a0a, 0x6124, 0xd1dc, 0x1138, 0xd1e4, 0x0138, 0x080c, -+ 0x1adf, 0x709b, 0x001e, 0x0010, 0x709b, 0x001d, 0x0005, 0x080c, -+ 0x73ca, 0x6124, 0xd1dc, 0x1188, 0x080c, 0x7341, 0x0016, 0x080c, -+ 0x1adf, 0x001e, 0xd1d4, 0x1128, 0xd1e4, 0x0138, 0x709b, 0x001e, -+ 0x0020, 0x709b, 0x001f, 0x080c, 0x7341, 0x0005, 0x0006, 0x2001, -+ 0x00a0, 0x080c, 0x2a0a, 0x000e, 0x6124, 0xd1d4, 0x1160, 0xd1cc, -+ 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, 0x001e, 0x0028, -+ 0x709b, 0x001d, 0x0010, 0x709b, 0x0021, 0x0005, 0x080c, 0x73ca, -+ 0x6124, 0xd1d4, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0140, 0x709b, -+ 0x001e, 0x0028, 0x709b, 0x001d, 0x0010, 0x709b, 0x001f, 0x0005, -+ 0x0006, 0x2001, 0x0090, 0x080c, 0x2a0a, 0x000e, 0x6124, 0xd1d4, -+ 0x1178, 0xd1cc, 0x1150, 0xd1dc, 0x1128, 0xd1e4, 0x0158, 0x709b, -+ 0x001e, 0x0040, 0x709b, 0x001d, 0x0028, 0x709b, 0x0020, 0x0010, -+ 0x709b, 0x001f, 0x0005, 0x0016, 0x00c6, 0x00d6, 0x00e6, 0x0126, -+ 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, 0x8000, -+ 0x080c, 0x74e9, 0x11f8, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x01d0, -+ 0xc1b4, 0x2102, 0x0026, 0x2011, 0x0200, 0x080c, 0x2a44, 0x002e, -+ 0x080c, 0x29f0, 0x6024, 0xd0cc, 0x0148, 0x2001, 0x00a0, 0x080c, -+ 0x2a0a, 0x080c, 0x77ed, 0x080c, 0x6029, 0x0428, 0x6028, 0xc0cd, -+ 0x602a, 0x0408, 0x080c, 0x7503, 0x0150, 0x080c, 0x74fa, 0x1138, -+ 0x2001, 0x0001, 0x080c, 0x25a0, 0x080c, 0x74bd, 0x00a0, 0x080c, -+ 0x73c7, 0x0178, 0x2001, 0x0001, 0x080c, 0x25a0, 0x7098, 0x9086, -+ 0x001e, 0x0120, 0x7098, 0x9086, 0x0022, 0x1118, 0x709b, 0x0025, -+ 0x0010, 0x709b, 0x0021, 0x012e, 0x00ee, 0x00de, 0x00ce, 0x001e, -+ 0x0005, 0x0026, 0x2011, 0x7352, 0x080c, 0x874a, 0x002e, 0x0016, -+ 0x0026, 0x2009, 0x0064, 0x2011, 0x7352, 0x080c, 0x8741, 0x002e, -+ 0x001e, 0x0005, 0x00e6, 0x00f6, 0x0016, 0x080c, 0x9e32, 0x2071, -+ 0x1800, 0x080c, 0x72eb, 0x001e, 0x00fe, 0x00ee, 0x0005, 0x0016, -+ 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x0126, 0x080c, -+ 0x9e32, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x2091, -+ 0x8000, 0x6028, 0xc09c, 0x602a, 0x080c, 0xa896, 0x2011, 0x0003, -+ 0x080c, 0xa1cf, 0x2011, 0x0002, 0x080c, 0xa1d9, 0x080c, 0xa098, -+ 0x080c, 0x86f6, 0x0036, 0x901e, 0x080c, 0xa118, 0x003e, 0x080c, -+ 0xa8b2, 0x60e3, 0x0000, 0x080c, 0xe702, 0x080c, 0xe71d, 0x2009, -+ 0x0004, 0x080c, 0x29f6, 0x080c, 0x2916, 0x2001, 0x1800, 0x2003, -+ 0x0004, 0x2011, 0x0008, 0x080c, 0x2a44, 0x2011, 0x7352, 0x080c, -+ 0x874a, 0x080c, 0x7503, 0x0118, 0x9006, 0x080c, 0x2a0a, 0x080c, -+ 0x0bc3, 0x2001, 0x0001, 0x080c, 0x25a0, 0x012e, 0x00fe, 0x00ee, -+ 0x00de, 0x00ce, 0x003e, 0x002e, 0x001e, 0x0005, 0x0026, 0x00e6, -+ 0x2011, 0x735f, 0x2071, 0x1a03, 0x701c, 0x9206, 0x1118, 0x7018, -+ 0x9005, 0x0110, 0x9085, 0x0001, 0x00ee, 0x002e, 0x0005, 0x6020, -+ 0xd09c, 0x0005, 0x6800, 0x9084, 0xfffe, 0x9086, 0x00c0, 0x01b8, -+ 0x2001, 0x00c0, 0x080c, 0x2a0a, 0x0156, 0x20a9, 0x002d, 0x1d04, -+ 0x73d7, 0x2091, 0x6000, 0x1f04, 0x73d7, 0x015e, 0x00d6, 0x2069, -+ 0x1800, 0x689c, 0x8001, 0x0220, 0x0118, 0x689e, 0x00de, 0x0005, -+ 0x689f, 0x0014, 0x68ec, 0xd0dc, 0x0dc8, 0x6800, 0x9086, 0x0001, -+ 0x1da8, 0x080c, 0x8756, 0x0c90, 0x00c6, 0x00d6, 0x00e6, 0x2061, -+ 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x77fc, 0x2001, -+ 0x196d, 0x2003, 0x0000, 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, -+ 0x266f, 0x9006, 0x080c, 0x2a0a, 0x080c, 0x5ee4, 0x0026, 0x2011, -+ 0xffff, 0x080c, 0x2a44, 0x002e, 0x602b, 0x182c, 0x00ee, 0x00de, -+ 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x2071, 0x1800, 0x2001, 0x197d, 0x200c, 0x9186, 0x0000, -+ 0x0158, 0x9186, 0x0001, 0x0158, 0x9186, 0x0002, 0x0158, 0x9186, -+ 0x0003, 0x0158, 0x0804, 0x74ad, 0x709b, 0x0022, 0x0040, 0x709b, -+ 0x0021, 0x0028, 0x709b, 0x0023, 0x0010, 0x709b, 0x0024, 0x60e3, -+ 0x0000, 0x6887, 0x0001, 0x2001, 0x0001, 0x080c, 0x266f, 0x080c, -+ 0xa896, 0x0026, 0x080c, 0xab5e, 0x002e, 0x080c, 0xa8b2, 0x7000, -+ 0x908e, 0x0004, 0x0118, 0x602b, 0x0028, 0x0010, 0x602b, 0x0020, -+ 0x0156, 0x0126, 0x2091, 0x8000, 0x20a9, 0x0005, 0x6024, 0xd0ac, -+ 0x0150, 0x012e, 0x015e, 0x080c, 0xcf52, 0x0118, 0x9006, 0x080c, -+ 0x2a34, 0x0804, 0x74b9, 0x6800, 0x9084, 0x00a1, 0xc0bd, 0x6802, -+ 0x080c, 0x29f0, 0x6904, 0xd1d4, 0x1140, 0x2001, 0x0100, 0x080c, -+ 0x2a0a, 0x1f04, 0x745e, 0x080c, 0x7540, 0x012e, 0x015e, 0x080c, -+ 0x74fa, 0x0170, 0x6044, 0x9005, 0x0130, 0x080c, 0x7540, 0x9006, -+ 0x8001, 0x1df0, 0x0028, 0x6804, 0xd0d4, 0x1110, 0x080c, 0x7540, -+ 0x080c, 0xcf52, 0x0118, 0x9006, 0x080c, 0x2a34, 0x0016, 0x0026, -+ 0x7000, 0x908e, 0x0004, 0x0130, 0x2009, 0x00c8, 0x2011, 0x735f, -+ 0x080c, 0x8708, 0x002e, 0x001e, 0x080c, 0x854a, 0x7034, 0xc085, -+ 0x7036, 0x2001, 0x197d, 0x2003, 0x0004, 0x080c, 0x71b4, 0x080c, -+ 0x74fa, 0x0138, 0x6804, 0xd0d4, 0x1120, 0xd0dc, 0x1100, 0x080c, -+ 0x77f2, 0x00ee, 0x00de, 0x00ce, 0x0005, 0x00c6, 0x00d6, 0x00e6, -+ 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, 0x8561, -+ 0x080c, 0x8553, 0x080c, 0x77fc, 0x2001, 0x196d, 0x2003, 0x0000, -+ 0x9006, 0x709a, 0x60e2, 0x6886, 0x080c, 0x266f, 0x9006, 0x080c, -+ 0x2a0a, 0x6043, 0x0090, 0x6043, 0x0010, 0x0026, 0x2011, 0xffff, -+ 0x080c, 0x2a44, 0x002e, 0x602b, 0x182c, 0x00ee, 0x00de, 0x00ce, -+ 0x0005, 0x0006, 0x2001, 0x197c, 0x2004, 0x9086, 0xaaaa, 0x000e, -+ 0x0005, 0x0006, 0x080c, 0x56de, 0x9084, 0x0030, 0x9086, 0x0000, -+ 0x000e, 0x0005, 0x0006, 0x080c, 0x56de, 0x9084, 0x0030, 0x9086, -+ 0x0030, 0x000e, 0x0005, 0x0006, 0x080c, 0x56de, 0x9084, 0x0030, -+ 0x9086, 0x0010, 0x000e, 0x0005, 0x0006, 0x080c, 0x56de, 0x9084, -+ 0x0030, 0x9086, 0x0020, 0x000e, 0x0005, 0x0036, 0x0016, 0x2001, -+ 0x180c, 0x2004, 0x908c, 0x0013, 0x0180, 0x0020, 0x080c, 0x268f, -+ 0x900e, 0x0028, 0x080c, 0x6a63, 0x1dc8, 0x2009, 0x0002, 0x2019, -+ 0x0028, 0x080c, 0x31a6, 0x9006, 0x0019, 0x001e, 0x003e, 0x0005, -+ 0x00e6, 0x2071, 0x180c, 0x2e04, 0x0130, 0x080c, 0xcf4b, 0x1128, -+ 0x9085, 0x0010, 0x0010, 0x9084, 0xffef, 0x2072, 0x00ee, 0x0005, -+ 0x6050, 0x0006, 0x60ec, 0x0006, 0x600c, 0x0006, 0x6004, 0x0006, -+ 0x6028, 0x0006, 0x602f, 0x0100, 0x602f, 0x0000, 0x602f, 0x0040, -+ 0x602f, 0x0000, 0x20a9, 0x0002, 0x080c, 0x29d1, 0x0026, 0x2011, -+ 0x0040, 0x080c, 0x2a44, 0x002e, 0x000e, 0x602a, 0x000e, 0x6006, -+ 0x000e, 0x600e, 0x000e, 0x60ee, 0x60e3, 0x0000, 0x6887, 0x0001, -+ 0x2001, 0x0001, 0x080c, 0x266f, 0x2001, 0x00a0, 0x0006, 0x080c, -+ 0xcf52, 0x000e, 0x0130, 0x080c, 0x2a28, 0x9006, 0x080c, 0x2a34, -+ 0x0010, 0x080c, 0x2a0a, 0x000e, 0x6052, 0x6050, 0x0006, 0xc0e5, -+ 0x6052, 0x00f6, 0x2079, 0x0100, 0x080c, 0x2981, 0x00fe, 0x000e, -+ 0x6052, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, 0x00d6, -+ 0x00e6, 0x2061, 0x0100, 0x2069, 0x0140, 0x2071, 0x1800, 0x080c, -+ 0xa8f4, 0x0158, 0x2001, 0x0386, 0x2004, 0xd0b4, 0x1130, 0x2001, -+ 0x0016, 0x080c, 0xa887, 0x0804, 0x761d, 0x2001, 0x180c, 0x200c, -+ 0xc1c4, 0x2102, 0x6028, 0x9084, 0xe1ff, 0x602a, 0x2011, 0x0200, -+ 0x080c, 0x2a44, 0x2001, 0x0090, 0x080c, 0x2a0a, 0x20a9, 0x0366, -+ 0x6024, 0xd0cc, 0x1558, 0x1d04, 0x75b8, 0x2091, 0x6000, 0x1f04, -+ 0x75b8, 0x080c, 0xa896, 0x2011, 0x0003, 0x080c, 0xa1cf, 0x2011, -+ 0x0002, 0x080c, 0xa1d9, 0x080c, 0xa098, 0x901e, 0x080c, 0xa118, -+ 0x2001, 0x0386, 0x2003, 0x7000, 0x080c, 0xa8b2, 0x2001, 0x00a0, -+ 0x080c, 0x2a0a, 0x080c, 0x77ed, 0x080c, 0x6029, 0x080c, 0xcf52, -+ 0x0110, 0x080c, 0x0ce9, 0x9085, 0x0001, 0x04e8, 0x2001, 0x0386, -+ 0x2004, 0xd0ac, 0x0110, 0x080c, 0x1adf, 0x60e3, 0x0000, 0x2001, -+ 0x196d, 0x2004, 0x080c, 0x266f, 0x60e2, 0x2001, 0x0080, 0x080c, -+ 0x2a0a, 0x20a9, 0x0366, 0x2011, 0x1e00, 0x080c, 0x2a44, 0x2009, -+ 0x1e00, 0x080c, 0x29f0, 0x6024, 0x910c, 0x0140, 0x1d04, 0x75fb, -+ 0x2091, 0x6000, 0x1f04, 0x75fb, 0x0804, 0x75c1, 0x2001, 0x0386, -+ 0x2003, 0x7000, 0x6028, 0x9085, 0x1e00, 0x602a, 0x70b4, 0x9005, -+ 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x080c, 0xcf52, 0x0110, -+ 0x080c, 0x0ce9, 0x9006, 0x00ee, 0x00de, 0x00ce, 0x003e, 0x002e, -+ 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, 0x0026, 0x0036, 0x00c6, -+ 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, 0x1800, 0x7000, 0x9086, -+ 0x0003, 0x1168, 0x2001, 0x020b, 0x2004, 0x9084, 0x5540, 0x9086, -+ 0x5540, 0x1128, 0x2069, 0x1a77, 0x2d04, 0x8000, 0x206a, 0x2069, -+ 0x0140, 0x6020, 0x9084, 0x00c0, 0x0120, 0x6884, 0x9005, 0x1904, -+ 0x7694, 0x2001, 0x0088, 0x080c, 0x2a0a, 0x9006, 0x60e2, 0x6886, -+ 0x080c, 0x266f, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, 0x6808, -+ 0x9005, 0x01d0, 0x6028, 0x9084, 0xfbff, 0x602a, 0x2011, 0x0400, -+ 0x080c, 0x2a44, 0x2069, 0x198f, 0x7000, 0x206a, 0x709b, 0x0026, -+ 0x7003, 0x0001, 0x20a9, 0x0002, 0x1d04, 0x7674, 0x2091, 0x6000, -+ 0x1f04, 0x7674, 0x0804, 0x76c6, 0x2069, 0x0140, 0x20a9, 0x0384, -+ 0x2011, 0x1e00, 0x080c, 0x2a44, 0x2009, 0x1e00, 0x080c, 0x29f0, -+ 0x6024, 0x910c, 0x0528, 0x9084, 0x1a00, 0x1510, 0x1d04, 0x7680, -+ 0x2091, 0x6000, 0x1f04, 0x7680, 0x080c, 0xa896, 0x2011, 0x0003, -+ 0x080c, 0xa1cf, 0x2011, 0x0002, 0x080c, 0xa1d9, 0x080c, 0xa098, -+ 0x901e, 0x080c, 0xa118, 0x080c, 0xa8b2, 0x2001, 0x00a0, 0x080c, -+ 0x2a0a, 0x080c, 0x77ed, 0x080c, 0x6029, 0x9085, 0x0001, 0x00b0, -+ 0x2001, 0x0080, 0x080c, 0x2a0a, 0x2069, 0x0140, 0x60e3, 0x0000, -+ 0x70b4, 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, -+ 0x196d, 0x2004, 0x080c, 0x266f, 0x60e2, 0x9006, 0x00ee, 0x00de, -+ 0x00ce, 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x0156, 0x0016, -+ 0x0026, 0x0036, 0x00c6, 0x00d6, 0x00e6, 0x2061, 0x0100, 0x2071, -+ 0x1800, 0x6020, 0x9084, 0x00c0, 0x01e8, 0x080c, 0xa896, 0x2011, -+ 0x0003, 0x080c, 0xa1cf, 0x2011, 0x0002, 0x080c, 0xa1d9, 0x080c, -+ 0xa098, 0x901e, 0x080c, 0xa118, 0x080c, 0xa8b2, 0x2069, 0x0140, -+ 0x2001, 0x00a0, 0x080c, 0x2a0a, 0x080c, 0x77ed, 0x080c, 0x6029, -+ 0x0804, 0x7769, 0x2001, 0x180c, 0x200c, 0xd1b4, 0x1160, 0xc1b5, -+ 0x2102, 0x080c, 0x7347, 0x2069, 0x0140, 0x2001, 0x0080, 0x080c, -+ 0x2a0a, 0x60e3, 0x0000, 0x2069, 0x0200, 0x6804, 0x9005, 0x1118, -+ 0x6808, 0x9005, 0x0190, 0x6028, 0x9084, 0xfdff, 0x602a, 0x2011, -+ 0x0200, 0x080c, 0x2a44, 0x2069, 0x198f, 0x7000, 0x206a, 0x709b, -+ 0x0027, 0x7003, 0x0001, 0x0804, 0x7769, 0x2011, 0x1e00, 0x080c, -+ 0x2a44, 0x2009, 0x1e00, 0x080c, 0x29f0, 0x6024, 0x910c, 0x01c8, -+ 0x9084, 0x1c00, 0x11b0, 0x1d04, 0x7725, 0x0006, 0x0016, 0x00c6, -+ 0x00d6, 0x00e6, 0x080c, 0x8592, 0x00ee, 0x00de, 0x00ce, 0x001e, -+ 0x000e, 0x00e6, 0x2071, 0x1a03, 0x7018, 0x00ee, 0x9005, 0x19e8, -+ 0x0500, 0x0026, 0x2011, 0x735f, 0x080c, 0x863e, 0x2011, 0x7352, -+ 0x080c, 0x874a, 0x002e, 0x2069, 0x0140, 0x60e3, 0x0000, 0x70b4, -+ 0x9005, 0x1118, 0x6887, 0x0001, 0x0008, 0x6886, 0x2001, 0x196d, -+ 0x2004, 0x080c, 0x266f, 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, 0xcf4b, 0x1904, 0x77d7, -+ 0x7130, 0xd184, 0x1170, 0x080c, 0x3368, 0x0138, 0xc18d, 0x7132, -+ 0x2011, 0x1848, 0x2214, 0xd2ac, 0x1120, 0x7030, 0xd08c, 0x0904, -+ 0x77d7, 0x2011, 0x1848, 0x220c, 0xd1a4, 0x0538, 0x0016, 0x2019, -+ 0x000e, 0x080c, 0xe239, 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, -+ 0x9186, 0x007e, 0x01a0, 0x9186, 0x0080, 0x0188, 0x080c, 0x6625, -+ 0x1170, 0x2120, 0x9006, 0x0016, 0x2009, 0x000e, 0x080c, 0xe2c9, -+ 0x2009, 0x0001, 0x2011, 0x0100, 0x080c, 0x88ec, 0x001e, 0x8108, -+ 0x1f04, 0x77a0, 0x00be, 0x015e, 0x001e, 0xd1ac, 0x1148, 0x0016, -+ 0x2009, 0x0002, 0x2019, 0x0004, 0x080c, 0x31a6, 0x001e, 0x0078, -+ 0x0156, 0x00b6, 0x20a9, 0x007f, 0x900e, 0x080c, 0x6625, 0x1110, -+ 0x080c, 0x6043, 0x8108, 0x1f04, 0x77cd, 0x00be, 0x015e, 0x080c, -+ 0x1adf, 0x080c, 0xa896, 0x080c, 0xab5e, 0x080c, 0xa8b2, 0x60e3, -+ 0x0000, 0x080c, 0x6029, 0x080c, 0x741a, 0x00ee, 0x00ce, 0x004e, -+ 0x003e, 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x197d, 0x2003, -+ 0x0001, 0x0005, 0x2001, 0x197d, 0x2003, 0x0000, 0x0005, 0x2001, -+ 0x197c, 0x2003, 0xaaaa, 0x0005, 0x2001, 0x197c, 0x2003, 0x0000, -+ 0x0005, 0x2071, 0x18fa, 0x7003, 0x0000, 0x7007, 0x0000, 0x080c, -+ 0x1053, 0x090c, 0x0d7d, 0xa8ab, 0xdcb0, 0x2900, 0x704e, 0x080c, -+ 0x1053, 0x090c, 0x0d7d, 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, 0x18fa, 0x6807, -+ 0x0001, 0x00de, 0x080c, 0x7de4, 0x9006, 0x00ee, 0x0005, 0x900e, -+ 0x0156, 0x20a9, 0x0006, 0x8003, 0x818d, 0x1f04, 0x7863, 0x015e, -+ 0x0005, 0x2079, 0x0040, 0x2071, 0x18fa, 0x7004, 0x0002, 0x7879, -+ 0x787a, 0x78c5, 0x7920, 0x7a30, 0x7877, 0x7877, 0x7a5a, 0x080c, -+ 0x0d7d, 0x0005, 0x2079, 0x0040, 0x2001, 0x1dc0, 0x2003, 0x0000, -+ 0x782c, 0x908c, 0x0780, 0x190c, 0x7ec6, 0xd0a4, 0x0570, 0x2001, -+ 0x1dc0, 0x2004, 0x9082, 0x0080, 0x1640, 0x1d04, 0x7897, 0x2001, -+ 0x1a06, 0x200c, 0x8109, 0x0508, 0x2091, 0x6000, 0x2102, 0x7824, -+ 0x2048, 0x9006, 0xa802, 0xa806, 0xa864, 0x9084, 0x00ff, 0x908a, -+ 0x0040, 0x0608, 0x00b8, 0x2001, 0x1800, 0x200c, 0x9186, 0x0003, -+ 0x1160, 0x7104, 0x9186, 0x0004, 0x0140, 0x9186, 0x0007, 0x0128, -+ 0x9186, 0x0003, 0x1968, 0x080c, 0x7920, 0x782c, 0xd09c, 0x090c, -+ 0x7de4, 0x0005, 0x9082, 0x005a, 0x1218, 0x2100, 0x003b, 0x0c18, -+ 0x080c, 0x7956, 0x0c90, 0x00e3, 0x08f0, 0x0005, 0x7956, 0x7956, -+ 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7978, 0x7956, -+ 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, -+ 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, -+ 0x7956, 0x7956, 0x7962, 0x7956, 0x7b4b, 0x7956, 0x7956, 0x7956, -+ 0x7978, 0x7956, 0x7962, 0x7b8c, 0x7bcd, 0x7c14, 0x7c28, 0x7956, -+ 0x7956, 0x7978, 0x7962, 0x798c, 0x7956, 0x7a04, 0x7cd3, 0x7cee, -+ 0x7956, 0x7978, 0x7956, 0x798c, 0x7956, 0x7956, 0x79fa, 0x7cee, -+ 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, -+ 0x7956, 0x79a0, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, -+ 0x7956, 0x7956, 0x7956, 0x7e6a, 0x7956, 0x7e14, 0x7956, 0x7e14, -+ 0x7956, 0x79b5, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, 0x7956, -+ 0x2079, 0x0040, 0x7004, 0x9086, 0x0003, 0x1198, 0x782c, 0x080c, -+ 0x7e0d, 0xd0a4, 0x0170, 0x7824, 0x2048, 0x9006, 0xa802, 0xa806, -+ 0xa864, 0x9084, 0x00ff, 0x908a, 0x001a, 0x1210, 0x002b, 0x0c50, -+ 0x00e9, 0x080c, 0x7de4, 0x0005, 0x7956, 0x7962, 0x7b37, 0x7956, -+ 0x7962, 0x7956, 0x7962, 0x7962, 0x7956, 0x7962, 0x7b37, 0x7962, -+ 0x7962, 0x7962, 0x7962, 0x7962, 0x7956, 0x7962, 0x7b37, 0x7956, -+ 0x7956, 0x7962, 0x7956, 0x7956, 0x7956, 0x7962, 0x00e6, 0x2071, -+ 0x18fa, 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, 0x6d80, 0x012e, 0x0005, -+ 0xa864, 0x8007, 0x9084, 0x00ff, 0x0d08, 0x8001, 0x1120, 0x7007, -+ 0x0001, 0x0804, 0x7ad9, 0x7007, 0x0003, 0x7012, 0x2900, 0x7016, -+ 0x701a, 0x704b, 0x7ad9, 0x0005, 0xa864, 0x8007, 0x9084, 0x00ff, -+ 0x0968, 0x8001, 0x1120, 0x7007, 0x0001, 0x0804, 0x7af4, 0x7007, -+ 0x0003, 0x7012, 0x2900, 0x7016, 0x701a, 0x704b, 0x7af4, 0x0005, -+ 0xa864, 0x8007, 0x9084, 0x00ff, 0x0904, 0x795e, 0x8001, 0x1120, -+ 0x7007, 0x0001, 0x0804, 0x7b10, 0x7007, 0x0003, 0x7012, 0x2900, -+ 0x7016, 0x701a, 0x704b, 0x7b10, 0x0005, 0xa864, 0x8007, 0x9084, -+ 0x00ff, 0x9086, 0x0001, 0x1904, 0x795e, 0x7007, 0x0001, 0x2009, -+ 0x1834, 0x210c, 0x81ff, 0x11a8, 0xa868, 0x9084, 0x00ff, 0xa86a, -+ 0xa883, 0x0000, 0x080c, 0x62b9, 0x1108, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0xa867, 0x0139, 0xa87a, 0xa982, 0x080c, 0x6d80, 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, 0x7d05, 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, 0x7966, 0xaab4, 0x928a, -+ 0x0002, 0x1a04, 0x7966, 0x82ff, 0x1138, 0xa8b8, 0xa9bc, 0x9105, -+ 0x0118, 0x2001, 0x7a97, 0x0018, 0x9280, 0x7a8d, 0x2005, 0x7056, -+ 0x7010, 0x9015, 0x0904, 0x7a78, 0x080c, 0x1053, 0x1118, 0x7007, -+ 0x0004, 0x0005, 0x2900, 0x7022, 0x7054, 0x2060, 0xe000, 0xa866, -+ 0x7050, 0x2040, 0xa95c, 0xe004, 0x9100, 0xa076, 0xa860, 0xa072, -+ 0xe008, 0x920a, 0x1210, 0x900e, 0x2200, 0x7112, 0xe20c, 0x8003, -+ 0x800b, 0x9296, 0x0004, 0x0108, 0x9108, 0xa17a, 0x810b, 0xa17e, -+ 0x080c, 0x1124, 0xa06c, 0x908e, 0x0100, 0x0170, 0x9086, 0x0200, -+ 0x0118, 0x7007, 0x0007, 0x0005, 0x7020, 0x2048, 0x080c, 0x106c, -+ 0x7014, 0x2048, 0x0804, 0x7966, 0x7020, 0x2048, 0x7018, 0xa802, -+ 0xa807, 0x0000, 0x2908, 0x2048, 0xa906, 0x711a, 0x0804, 0x7a30, -+ 0x7014, 0x2048, 0x7007, 0x0001, 0xa8b4, 0x9005, 0x1128, 0xa8b8, -+ 0xa9bc, 0x9105, 0x0108, 0x00b9, 0xa864, 0x9084, 0x00ff, 0x9086, -+ 0x001e, 0x0904, 0x7d05, 0x0804, 0x7ad9, 0x7a8f, 0x7a93, 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, 0x1834, 0x210c, 0x81ff, 0x1178, 0x080c, 0x60bb, -+ 0x1108, 0x0005, 0x080c, 0x6fc0, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0xcb36, 0x080c, 0x6d80, 0x012e, 0x0ca0, 0x080c, 0xcf4b, 0x1d70, -+ 0x2001, 0x0028, 0x900e, 0x0c70, 0x2009, 0x1834, 0x210c, 0x81ff, -+ 0x1188, 0xa888, 0x9005, 0x0188, 0xa883, 0x0000, 0x080c, 0x6149, -+ 0x1108, 0x0005, 0xa87a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d80, -+ 0x012e, 0x0cb8, 0x2001, 0x0028, 0x0ca8, 0x2001, 0x0000, 0x0c90, -+ 0x2009, 0x1834, 0x210c, 0x81ff, 0x11d8, 0xa888, 0x9005, 0x01e0, -+ 0xa883, 0x0000, 0xa87c, 0xd0f4, 0x0120, 0x080c, 0x621b, 0x1138, -+ 0x0005, 0x9006, 0xa87a, 0x080c, 0x6196, 0x1108, 0x0005, 0x0126, -+ 0x2091, 0x8000, 0xa87a, 0xa982, 0x080c, 0x6d80, 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, 0x6625, 0x11b8, 0x0066, 0xae80, -+ 0x080c, 0x6735, 0x006e, 0x0088, 0x0046, 0x2011, 0x180c, 0x2224, -+ 0xc484, 0x2412, 0x004e, 0x00c6, 0x080c, 0x6625, 0x1110, 0x080c, -+ 0x6904, 0x8108, 0x1f04, 0x7b74, 0x00ce, 0xa87c, 0xd084, 0x1120, -+ 0x080c, 0x106c, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x6d80, 0x012e, 0x00be, 0x0005, 0x0126, 0x2091, 0x8000, 0x7007, -+ 0x0001, 0x080c, 0x6a67, 0x0580, 0x2061, 0x1a6f, 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, 0x7dce, 0x012e, 0x0804, 0x7dc8, 0x012e, -+ 0x0804, 0x7dc2, 0x012e, 0x0804, 0x7dc5, 0x0126, 0x2091, 0x8000, -+ 0x7007, 0x0001, 0x080c, 0x6a67, 0x05e0, 0x2061, 0x1a6f, 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, 0x7dce, 0x012e, 0x0804, -+ 0x7dcb, 0x012e, 0x0804, 0x7dc8, 0x0126, 0x2091, 0x8000, 0x7007, -+ 0x0001, 0x2061, 0x1a6f, 0x6300, 0xd38c, 0x1120, 0x6308, 0x8318, -+ 0x0220, 0x630a, 0x012e, 0x0804, 0x7ddc, 0x012e, 0x0804, 0x7dcb, -+ 0x00b6, 0x0126, 0x00c6, 0x2091, 0x8000, 0x7007, 0x0001, 0xa87c, -+ 0xd0ac, 0x0148, 0x00c6, 0x2061, 0x1a6f, 0x6000, 0x9084, 0xfcff, -+ 0x6002, 0x00ce, 0x0440, 0xa888, 0x9005, 0x05d8, 0xa88c, 0x9065, -+ 0x0598, 0x2001, 0x1834, 0x2004, 0x9005, 0x0118, 0x080c, 0xac28, -+ 0x0068, 0x6017, 0xf400, 0x6063, 0x0000, 0xa97c, 0xd1a4, 0x0110, -+ 0xa980, 0x6162, 0x2009, 0x0041, 0x080c, 0xac8c, 0xa988, 0x918c, -+ 0xff00, 0x9186, 0x2000, 0x1138, 0x0026, 0x900e, 0x2011, 0xfdff, -+ 0x080c, 0x88ec, 0x002e, 0xa87c, 0xd0c4, 0x0148, 0x2061, 0x1a6f, -+ 0x6000, 0xd08c, 0x1120, 0x6008, 0x8000, 0x0208, 0x600a, 0x00ce, -+ 0x012e, 0x00be, 0x0804, 0x7dce, 0x00ce, 0x012e, 0x00be, 0x0804, -+ 0x7dc8, 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, 0x6625, 0x1968, 0xb800, 0xc0e4, -+ 0xb802, 0x0848, 0xa88c, 0x9065, 0x09b8, 0x6007, 0x0024, 0x2001, -+ 0x1986, 0x2004, 0x601a, 0x0804, 0x7c63, 0xa88c, 0x9065, 0x0960, -+ 0x00e6, 0xa890, 0x9075, 0x2001, 0x1834, 0x2004, 0x9005, 0x0150, -+ 0x080c, 0xac28, 0x8eff, 0x0118, 0x2e60, 0x080c, 0xac28, 0x00ee, -+ 0x0804, 0x7c63, 0x6024, 0xc0dc, 0xc0d5, 0x6026, 0x2e60, 0x6007, -+ 0x003a, 0xa8a0, 0x9005, 0x0130, 0x6007, 0x003b, 0xa8a4, 0x602e, -+ 0xa8a8, 0x6016, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x921e, -+ 0x00ee, 0x0804, 0x7c63, 0x2061, 0x1a6f, 0x6000, 0xd084, 0x0190, -+ 0xd08c, 0x1904, 0x7ddc, 0x0126, 0x2091, 0x8000, 0x6204, 0x8210, -+ 0x0220, 0x6206, 0x012e, 0x0804, 0x7ddc, 0x012e, 0xa883, 0x0016, -+ 0x0804, 0x7dd5, 0xa883, 0x0007, 0x0804, 0x7dd5, 0xa864, 0x8007, -+ 0x9084, 0x00ff, 0x0130, 0x8001, 0x1138, 0x7007, 0x0001, 0x0069, -+ 0x0005, 0x080c, 0x795e, 0x0040, 0x7007, 0x0003, 0x7012, 0x2900, -+ 0x7016, 0x701a, 0x704b, 0x7d05, 0x0005, 0x00b6, 0x00e6, 0x0126, -+ 0x2091, 0x8000, 0x903e, 0x2061, 0x1800, 0x61d0, 0x81ff, 0x1904, -+ 0x7d87, 0x6130, 0xd194, 0x1904, 0x7db1, 0xa878, 0x2070, 0x9e82, -+ 0x1ddc, 0x0a04, 0x7d7b, 0x6068, 0x9e02, 0x1a04, 0x7d7b, 0x7120, -+ 0x9186, 0x0006, 0x1904, 0x7d6d, 0x7010, 0x905d, 0x0904, 0x7d87, -+ 0xb800, 0xd0e4, 0x1904, 0x7dab, 0x2061, 0x1a6f, 0x6100, 0x9184, -+ 0x0301, 0x9086, 0x0001, 0x15a0, 0x7024, 0xd0dc, 0x1904, 0x7db4, -+ 0xa883, 0x0000, 0xa803, 0x0000, 0x2908, 0x7014, 0x9005, 0x1198, -+ 0x7116, 0xa87c, 0xd0f4, 0x1904, 0x7db7, 0x080c, 0x56da, 0xd09c, -+ 0x1118, 0xa87c, 0xc0cc, 0xa87e, 0x2e60, 0x080c, 0x87df, 0x012e, -+ 0x00ee, 0x00be, 0x0005, 0x2048, 0xa800, 0x9005, 0x1de0, 0xa902, -+ 0x2148, 0xa87c, 0xd0f4, 0x1904, 0x7db7, 0x012e, 0x00ee, 0x00be, -+ 0x0005, 0x012e, 0x00ee, 0xa883, 0x0006, 0x00be, 0x0804, 0x7dd5, -+ 0xd184, 0x0db8, 0xd1c4, 0x1190, 0x00a0, 0xa974, 0x080c, 0x6625, -+ 0x15d0, 0xb800, 0xd0e4, 0x15b8, 0x7120, 0x9186, 0x0007, 0x1118, -+ 0xa883, 0x0002, 0x0490, 0xa883, 0x0008, 0x0478, 0xa883, 0x000e, -+ 0x0460, 0xa883, 0x0017, 0x0448, 0xa883, 0x0035, 0x0430, 0x080c, -+ 0x56de, 0xd0fc, 0x01e8, 0xa878, 0x2070, 0x9e82, 0x1ddc, 0x02c0, -+ 0x6068, 0x9e02, 0x12a8, 0x7120, 0x9186, 0x0006, 0x1188, 0x7010, -+ 0x905d, 0x0170, 0xb800, 0xd0bc, 0x0158, 0x2039, 0x0001, 0x7000, -+ 0x9086, 0x0007, 0x1904, 0x7d11, 0x7003, 0x0002, 0x0804, 0x7d11, -+ 0xa883, 0x0028, 0x0010, 0xa883, 0x0029, 0x012e, 0x00ee, 0x00be, -+ 0x0420, 0xa883, 0x002a, 0x0cc8, 0xa883, 0x0045, 0x0cb0, 0x2e60, -+ 0x2019, 0x0002, 0x601b, 0x0014, 0x080c, 0xde1b, 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, 0x6d80, 0x012e, 0x0005, 0x080c, 0x106c, 0x0005, 0x00d6, -+ 0x080c, 0x87d6, 0x00de, 0x0005, 0x00d6, 0x00e6, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x0040, 0x702c, 0xd084, 0x01d8, 0x908c, 0x0780, -+ 0x190c, 0x7ec6, 0xd09c, 0x11a8, 0x2071, 0x1800, 0x70c0, 0x90ea, -+ 0x0020, 0x0278, 0x8001, 0x70c2, 0x702c, 0x2048, 0xa800, 0x702e, -+ 0x9006, 0xa802, 0xa806, 0x2071, 0x0040, 0x2900, 0x7022, 0x702c, -+ 0x0c28, 0x012e, 0x00ee, 0x00de, 0x0005, 0x0006, 0x9084, 0x0780, -+ 0x190c, 0x7ec6, 0x000e, 0x0005, 0xa898, 0x9084, 0x0003, 0x05a8, -+ 0x080c, 0xab97, 0x05d8, 0x2900, 0x6016, 0xa864, 0x9084, 0x00ff, -+ 0x9086, 0x0035, 0x1138, 0x6028, 0xc0fd, 0x602a, 0x2001, 0x196b, -+ 0x2004, 0x0098, 0xa8a0, 0x9084, 0x00ff, 0xa99c, 0x918c, 0xff00, -+ 0x9105, 0xa99c, 0x918c, 0x00ff, 0x080c, 0x25fb, 0x1540, 0x00b6, -+ 0x080c, 0x6625, 0x2b00, 0x00be, 0x1510, 0x6012, 0x6023, 0x0001, -+ 0x2009, 0x0040, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0035, 0x0110, -+ 0x2009, 0x0041, 0x080c, 0xac8c, 0x0005, 0xa87b, 0x0101, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x6d80, 0x012e, 0x0005, 0xa87b, 0x002c, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0x6d80, 0x012e, 0x0005, 0xa87b, -+ 0x0028, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d80, 0x012e, 0x080c, -+ 0xabed, 0x0005, 0x00d6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x00b6, -+ 0x7007, 0x0001, 0xaa74, 0x9282, 0x0004, 0x1a04, 0x7eb7, 0xa97c, -+ 0x9188, 0x1000, 0x2104, 0x905d, 0xb804, 0xd284, 0x0140, 0x05e8, -+ 0x8007, 0x9084, 0x00ff, 0x9084, 0x0006, 0x1108, 0x04b0, 0x2b10, -+ 0x080c, 0xab97, 0x1118, 0x080c, 0xac5f, 0x05a8, 0x6212, 0xa874, -+ 0x0002, 0x7e95, 0x7e9a, 0x7e9d, 0x7ea3, 0x2019, 0x0002, 0x080c, -+ 0xe239, 0x0060, 0x080c, 0xe1c9, 0x0048, 0x2019, 0x0002, 0xa980, -+ 0x080c, 0xe1e8, 0x0018, 0xa980, 0x080c, 0xe1c9, 0x080c, 0xabed, -+ 0xa887, 0x0000, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d80, 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, 0x7ec8, 0x0006, 0x0016, 0x2001, 0x8003, 0x0006, 0x0804, -+ 0x0d86, 0x2001, 0x1834, 0x2004, 0x9005, 0x0005, 0x0005, 0x00f6, -+ 0x2079, 0x0300, 0x2001, 0x0200, 0x200c, 0xc1e5, 0xc1dc, 0x2102, -+ 0x2009, 0x0218, 0x210c, 0xd1ec, 0x1120, 0x080c, 0x1608, 0x00fe, -+ 0x0005, 0x2001, 0x020d, 0x2003, 0x0020, 0x781f, 0x0300, 0x00fe, -+ 0x0005, 0x781c, 0xd08c, 0x0904, 0x7f49, 0x68c0, 0x90aa, 0x0005, -+ 0x0a04, 0x854a, 0x7d44, 0x7c40, 0xd59c, 0x190c, 0x0d7d, 0x9584, -+ 0x00f6, 0x1508, 0x9484, 0x7000, 0x0138, 0x908a, 0x2000, 0x1258, -+ 0x9584, 0x0700, 0x8007, 0x04f0, 0x7000, 0x9084, 0xff00, 0x9086, -+ 0x8100, 0x0db0, 0x00b0, 0x9484, 0x0fff, 0x1130, 0x7000, 0x9084, -+ 0xff00, 0x9086, 0x8100, 0x11c0, 0x080c, 0xe6da, 0x080c, 0x8441, -+ 0x7817, 0x0140, 0x00a8, 0x9584, 0x0076, 0x1118, 0x080c, 0x849d, -+ 0x19c8, 0xd5a4, 0x0148, 0x0046, 0x0056, 0x080c, 0x7f99, 0x080c, -+ 0x2115, 0x005e, 0x004e, 0x0020, 0x080c, 0xe6da, 0x7817, 0x0140, -+ 0x080c, 0x74e9, 0x0168, 0x2001, 0x0111, 0x2004, 0xd08c, 0x0140, -+ 0x6893, 0x0000, 0x2001, 0x0110, 0x2003, 0x0008, 0x2003, 0x0000, -+ 0x0489, 0x0005, 0x0002, 0x7f56, 0x8263, 0x7f53, 0x7f53, 0x7f53, -+ 0x7f53, 0x7f53, 0x7f53, 0x7817, 0x0140, 0x0005, 0x7000, 0x908c, -+ 0xff00, 0x9194, 0xf000, 0x810f, 0x9484, 0x0fff, 0x6892, 0x9286, -+ 0x2000, 0x1150, 0x6800, 0x9086, 0x0001, 0x1118, 0x080c, 0x573b, -+ 0x0070, 0x080c, 0x7fb9, 0x0058, 0x9286, 0x3000, 0x1118, 0x080c, -+ 0x81a0, 0x0028, 0x9286, 0x8000, 0x1110, 0x080c, 0x8377, 0x7817, -+ 0x0140, 0x0005, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0178, 0x2001, -+ 0x1800, 0x2004, 0x9086, 0x0003, 0x1148, 0x0026, 0x0036, 0x2011, -+ 0x8048, 0x2518, 0x080c, 0x4b07, 0x003e, 0x002e, 0x0005, 0x0036, -+ 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x2019, 0xfffe, 0x7c30, -+ 0x0050, 0x0036, 0x0046, 0x0056, 0x00f6, 0x2079, 0x0200, 0x7d44, -+ 0x7c40, 0x2019, 0xffff, 0x2001, 0x1810, 0x2004, 0xd08c, 0x0160, -+ 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, 0x1130, 0x0026, 0x2011, -+ 0x8048, 0x080c, 0x4b07, 0x002e, 0x00fe, 0x005e, 0x004e, 0x003e, -+ 0x0005, 0x00b6, 0x00c6, 0x7010, 0x9084, 0xff00, 0x8007, 0x9096, -+ 0x0001, 0x0120, 0x9096, 0x0023, 0x1904, 0x8171, 0x9186, 0x0023, -+ 0x15c0, 0x080c, 0x840c, 0x0904, 0x8171, 0x6120, 0x9186, 0x0001, -+ 0x0150, 0x9186, 0x0004, 0x0138, 0x9186, 0x0008, 0x0120, 0x9186, -+ 0x000a, 0x1904, 0x8171, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, -+ 0x1130, 0x2009, 0x0015, 0x080c, 0xac8c, 0x0804, 0x8171, 0x908e, -+ 0x0214, 0x0118, 0x908e, 0x0210, 0x1130, 0x2009, 0x0015, 0x080c, -+ 0xac8c, 0x0804, 0x8171, 0x908e, 0x0100, 0x1904, 0x8171, 0x7034, -+ 0x9005, 0x1904, 0x8171, 0x2009, 0x0016, 0x080c, 0xac8c, 0x0804, -+ 0x8171, 0x9186, 0x0022, 0x1904, 0x8171, 0x7030, 0x908e, 0x0300, -+ 0x1580, 0x68dc, 0xd0a4, 0x0528, 0xc0b5, 0x68de, 0x7100, 0x918c, -+ 0x00ff, 0x697e, 0x7004, 0x6882, 0x00f6, 0x2079, 0x0100, 0x79e6, -+ 0x78ea, 0x0006, 0x9084, 0x00ff, 0x0016, 0x2008, 0x080c, 0x2644, -+ 0x7932, 0x7936, 0x001e, 0x000e, 0x00fe, 0x080c, 0x25fb, 0x695e, -+ 0x703c, 0x00e6, 0x2071, 0x0140, 0x7086, 0x2071, 0x1800, 0x70b6, -+ 0x00ee, 0x7034, 0x9005, 0x1904, 0x8171, 0x2009, 0x0017, 0x0804, -+ 0x8121, 0x908e, 0x0400, 0x1190, 0x7034, 0x9005, 0x1904, 0x8171, -+ 0x080c, 0x74e9, 0x0120, 0x2009, 0x001d, 0x0804, 0x8121, 0x68dc, -+ 0xc0a5, 0x68de, 0x2009, 0x0030, 0x0804, 0x8121, 0x908e, 0x0500, -+ 0x1140, 0x7034, 0x9005, 0x1904, 0x8171, 0x2009, 0x0018, 0x0804, -+ 0x8121, 0x908e, 0x2010, 0x1120, 0x2009, 0x0019, 0x0804, 0x8121, -+ 0x908e, 0x2110, 0x1120, 0x2009, 0x001a, 0x0804, 0x8121, 0x908e, -+ 0x5200, 0x1140, 0x7034, 0x9005, 0x1904, 0x8171, 0x2009, 0x001b, -+ 0x0804, 0x8121, 0x908e, 0x5000, 0x1140, 0x7034, 0x9005, 0x1904, -+ 0x8171, 0x2009, 0x001c, 0x0804, 0x8121, 0x908e, 0x1300, 0x1120, -+ 0x2009, 0x0034, 0x0804, 0x8121, 0x908e, 0x1200, 0x1140, 0x7034, -+ 0x9005, 0x1904, 0x8171, 0x2009, 0x0024, 0x0804, 0x8121, 0x908c, -+ 0xff00, 0x918e, 0x2400, 0x1170, 0x2009, 0x002d, 0x2001, 0x1810, -+ 0x2004, 0xd09c, 0x0904, 0x8121, 0x080c, 0xd64f, 0x1904, 0x8171, -+ 0x0804, 0x811f, 0x908c, 0xff00, 0x918e, 0x5300, 0x1120, 0x2009, -+ 0x002a, 0x0804, 0x8121, 0x908e, 0x0f00, 0x1120, 0x2009, 0x0020, -+ 0x0804, 0x8121, 0x908e, 0x6104, 0x1530, 0x2029, 0x0205, 0x2011, -+ 0x026d, 0x8208, 0x2204, 0x9082, 0x0004, 0x8004, 0x8004, 0x20a8, -+ 0x2011, 0x8015, 0x211c, 0x8108, 0x0046, 0x2124, 0x080c, 0x4b07, -+ 0x004e, 0x8108, 0x0f04, 0x80d5, 0x9186, 0x0280, 0x1d88, 0x2504, -+ 0x8000, 0x202a, 0x2009, 0x0260, 0x0c58, 0x202b, 0x0000, 0x2009, -+ 0x0023, 0x0804, 0x8121, 0x908e, 0x6000, 0x1120, 0x2009, 0x003f, -+ 0x0804, 0x8121, 0x908e, 0x5400, 0x1138, 0x080c, 0x84fa, 0x1904, -+ 0x8171, 0x2009, 0x0046, 0x04a8, 0x908e, 0x5500, 0x1148, 0x080c, -+ 0x8522, 0x1118, 0x2009, 0x0041, 0x0460, 0x2009, 0x0042, 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, 0x6838, 0xd0d4, 0x0110, 0x2009, -+ 0x004c, 0x0016, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, -+ 0x25fb, 0x1904, 0x8174, 0x080c, 0x65c4, 0x1904, 0x8174, 0xbe12, -+ 0xbd16, 0x001e, 0x0016, 0x080c, 0x74e9, 0x01c0, 0x68dc, 0xd08c, -+ 0x1148, 0x7000, 0x9084, 0x00ff, 0x1188, 0x7004, 0x9084, 0xff00, -+ 0x1168, 0x0040, 0x687c, 0x9606, 0x1148, 0x6880, 0x9506, 0x9084, -+ 0xff00, 0x1120, 0x9584, 0x00ff, 0xb886, 0x0080, 0xb884, 0x9005, -+ 0x1168, 0x9186, 0x0046, 0x1150, 0x687c, 0x9606, 0x1138, 0x6880, -+ 0x9506, 0x9084, 0xff00, 0x1110, 0x001e, 0x0098, 0x080c, 0xab97, -+ 0x01a8, 0x2b08, 0x6112, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, -+ 0x9186, 0x004c, 0x1110, 0x6023, 0x000a, 0x0016, 0x001e, 0x080c, -+ 0xac8c, 0x00ce, 0x00be, 0x0005, 0x001e, 0x0cd8, 0x2001, 0x180e, -+ 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4b07, 0x080c, -+ 0xac5f, 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, 0x9225, 0x08a0, -+ 0x080c, 0x3332, 0x1140, 0x7010, 0x9084, 0xff00, 0x8007, 0x908e, -+ 0x0008, 0x1108, 0x0009, 0x0005, 0x00b6, 0x00c6, 0x0046, 0x7000, -+ 0x908c, 0xff00, 0x810f, 0x9186, 0x0033, 0x11e8, 0x080c, 0x840c, -+ 0x0904, 0x81fb, 0x7124, 0x610a, 0x7030, 0x908e, 0x0200, 0x1140, -+ 0x7034, 0x9005, 0x15c0, 0x2009, 0x0015, 0x080c, 0xac8c, 0x0498, -+ 0x908e, 0x0100, 0x1580, 0x7034, 0x9005, 0x1568, 0x2009, 0x0016, -+ 0x080c, 0xac8c, 0x0440, 0x9186, 0x0032, 0x1528, 0x7030, 0x908e, -+ 0x1400, 0x1508, 0x2009, 0x0038, 0x0016, 0x2011, 0x0263, 0x2204, -+ 0x8211, 0x220c, 0x080c, 0x25fb, 0x11a8, 0x080c, 0x65c4, 0x1190, -+ 0xbe12, 0xbd16, 0x080c, 0xab97, 0x0168, 0x2b08, 0x6112, 0x080c, -+ 0xcccc, 0x6023, 0x0004, 0x7120, 0x610a, 0x001e, 0x080c, 0xac8c, -+ 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, 0x825d, 0x9596, 0xfffe, 0x1120, 0x2009, 0x007e, 0x0804, -+ 0x825d, 0x9596, 0xfffc, 0x1118, 0x2009, 0x0080, 0x04f0, 0x2011, -+ 0x0000, 0x2019, 0x1837, 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, 0x8232, 0x82ff, 0x1118, -+ 0x9085, 0x0001, 0x0018, 0xc2fc, 0x2208, 0x9006, 0x00de, 0x00ee, -+ 0x004e, 0x00be, 0x0005, 0x7000, 0x908c, 0xff00, 0x810f, 0x9184, -+ 0x000f, 0x0002, 0x827a, 0x827a, 0x827a, 0x841e, 0x827a, 0x827d, -+ 0x82a2, 0x832b, 0x827a, 0x827a, 0x827a, 0x827a, 0x827a, 0x827a, -+ 0x827a, 0x827a, 0x7817, 0x0140, 0x0005, 0x00b6, 0x7110, 0xd1bc, -+ 0x01e8, 0x7120, 0x2160, 0x9c8c, 0x0003, 0x11c0, 0x9c8a, 0x1ddc, -+ 0x02a8, 0x6868, 0x9c02, 0x1290, 0x7008, 0x9084, 0x00ff, 0x6110, -+ 0x2158, 0xb910, 0x9106, 0x1150, 0x700c, 0xb914, 0x9106, 0x1130, -+ 0x7124, 0x610a, 0x2009, 0x0046, 0x080c, 0xac8c, 0x7817, 0x0140, -+ 0x00be, 0x0005, 0x00b6, 0x00c6, 0x9484, 0x0fff, 0x0904, 0x8307, -+ 0x7110, 0xd1bc, 0x1904, 0x8307, 0x7108, 0x700c, 0x2028, 0x918c, -+ 0x00ff, 0x2130, 0x9094, 0xff00, 0x15c8, 0x81ff, 0x15b8, 0x9080, -+ 0x3374, 0x200d, 0x918c, 0xff00, 0x810f, 0x2001, 0x0080, 0x9106, -+ 0x0904, 0x8307, 0x9182, 0x0801, 0x1a04, 0x8307, 0x9190, 0x1000, -+ 0x2204, 0x905d, 0x05e0, 0xbe12, 0xbd16, 0xb800, 0xd0ec, 0x15b8, -+ 0xba04, 0x9294, 0xff00, 0x9286, 0x0600, 0x1190, 0x080c, 0xab97, -+ 0x0598, 0x2b08, 0x7028, 0x6052, 0x702c, 0x604e, 0x6112, 0x6023, -+ 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, 0x080c, 0xd8b5, 0x00f8, -+ 0x080c, 0x6a6b, 0x1138, 0xb807, 0x0606, 0x0c40, 0x190c, 0x81ff, -+ 0x11b0, 0x0880, 0x080c, 0xab97, 0x2b08, 0x0188, 0x6112, 0x6023, -+ 0x0004, 0x7120, 0x610a, 0x9286, 0x0400, 0x1118, 0x6007, 0x0005, -+ 0x0010, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9225, 0x7817, -+ 0x0140, 0x00ce, 0x00be, 0x0005, 0x2001, 0x180e, 0x2004, 0xd0ec, -+ 0x0120, 0x2011, 0x8049, 0x080c, 0x4b07, 0x080c, 0xac5f, 0x0d78, -+ 0x2b08, 0x6112, 0x6023, 0x0006, 0x7120, 0x610a, 0x7130, 0x615e, -+ 0x6017, 0xf300, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, -+ 0x080c, 0x921e, 0x08e0, 0x00b6, 0x7110, 0xd1bc, 0x05d0, 0x7020, -+ 0x2060, 0x9c84, 0x0003, 0x15a8, 0x9c82, 0x1ddc, 0x0690, 0x6868, -+ 0x9c02, 0x1678, 0x9484, 0x0fff, 0x9082, 0x000c, 0x0650, 0x7008, -+ 0x9084, 0x00ff, 0x6110, 0x2158, 0xb910, 0x9106, 0x1510, 0x700c, -+ 0xb914, 0x9106, 0x11f0, 0x7124, 0x610a, 0x601c, 0xd0fc, 0x11c8, -+ 0x2001, 0x0271, 0x2004, 0x9005, 0x1180, 0x9484, 0x0fff, 0x9082, -+ 0x000c, 0x0158, 0x0066, 0x2031, 0x0100, 0xa001, 0xa001, 0x8631, -+ 0x1de0, 0x006e, 0x601c, 0xd0fc, 0x1120, 0x2009, 0x0045, 0x080c, -+ 0xac8c, 0x7817, 0x0140, 0x00be, 0x0005, 0x6120, 0x9186, 0x0002, -+ 0x0128, 0x9186, 0x0005, 0x0110, 0x9085, 0x0001, 0x0005, 0x080c, -+ 0x3332, 0x1168, 0x7010, 0x9084, 0xff00, 0x8007, 0x9086, 0x0000, -+ 0x1130, 0x9184, 0x000f, 0x908a, 0x0006, 0x1208, 0x000b, 0x0005, -+ 0x838e, 0x838f, 0x838e, 0x838e, 0x83ee, 0x83fd, 0x0005, 0x00b6, -+ 0x7110, 0xd1bc, 0x0120, 0x702c, 0xd084, 0x0904, 0x83ec, 0x700c, -+ 0x7108, 0x080c, 0x25fb, 0x1904, 0x83ec, 0x080c, 0x65c4, 0x1904, -+ 0x83ec, 0xbe12, 0xbd16, 0x7110, 0xd1bc, 0x01d8, 0x080c, 0x6a6b, -+ 0x0118, 0x9086, 0x0004, 0x1588, 0x00c6, 0x080c, 0x840c, 0x00ce, -+ 0x05d8, 0x080c, 0xab97, 0x2b08, 0x05b8, 0x6112, 0x080c, 0xcccc, -+ 0x6023, 0x0002, 0x7120, 0x610a, 0x2009, 0x0088, 0x080c, 0xac8c, -+ 0x0458, 0x080c, 0x6a6b, 0x0148, 0x9086, 0x0004, 0x0130, 0x080c, -+ 0x6a73, 0x0118, 0x9086, 0x0004, 0x1180, 0x080c, 0xab97, 0x2b08, -+ 0x01d8, 0x6112, 0x080c, 0xcccc, 0x6023, 0x0005, 0x7120, 0x610a, -+ 0x2009, 0x0088, 0x080c, 0xac8c, 0x0078, 0x080c, 0xab97, 0x2b08, -+ 0x0158, 0x6112, 0x080c, 0xcccc, 0x6023, 0x0004, 0x7120, 0x610a, -+ 0x2009, 0x0001, 0x080c, 0xac8c, 0x00be, 0x0005, 0x7110, 0xd1bc, -+ 0x0158, 0x00d1, 0x0148, 0x080c, 0x836d, 0x1130, 0x7124, 0x610a, -+ 0x2009, 0x0089, 0x080c, 0xac8c, 0x0005, 0x7110, 0xd1bc, 0x0158, -+ 0x0059, 0x0148, 0x080c, 0x836d, 0x1130, 0x7124, 0x610a, 0x2009, -+ 0x008a, 0x080c, 0xac8c, 0x0005, 0x7020, 0x2060, 0x9c84, 0x0003, -+ 0x1158, 0x9c82, 0x1ddc, 0x0240, 0x2001, 0x181a, 0x2004, 0x9c02, -+ 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x00b6, 0x7110, -+ 0xd1bc, 0x11d8, 0x7024, 0x2060, 0x9c84, 0x0003, 0x11b0, 0x9c82, -+ 0x1ddc, 0x0298, 0x6868, 0x9c02, 0x1280, 0x7008, 0x9084, 0x00ff, -+ 0x6110, 0x2158, 0xb910, 0x9106, 0x1140, 0x700c, 0xb914, 0x9106, -+ 0x1120, 0x2009, 0x0051, 0x080c, 0xac8c, 0x7817, 0x0140, 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, 0x05c0, 0x080c, 0xab97, 0x05a8, 0x0066, 0x00c6, 0x0046, -+ 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x25fb, 0x1590, -+ 0x080c, 0x65c4, 0x1578, 0xbe12, 0xbd16, 0x2b00, 0x004e, 0x00ce, -+ 0x6012, 0x080c, 0xcccc, 0x080c, 0x103a, 0x0500, 0x2900, 0x6062, -+ 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, 0x9225, 0x00fe, 0x009e, 0x00ce, 0x0005, 0x080c, 0xabed, -+ 0x006e, 0x0cc0, 0x004e, 0x00ce, 0x0cc8, 0x00c6, 0x7000, 0x908c, -+ 0xff00, 0x9184, 0xf000, 0x810f, 0x9086, 0x2000, 0x1904, 0x84f4, -+ 0x9186, 0x0022, 0x15f0, 0x2001, 0x0111, 0x2004, 0x9005, 0x1904, -+ 0x84f6, 0x7030, 0x908e, 0x0400, 0x0904, 0x84f6, 0x908e, 0x6000, -+ 0x05e8, 0x908e, 0x5400, 0x05d0, 0x908e, 0x0300, 0x11d8, 0x2009, -+ 0x1837, 0x210c, 0xd18c, 0x1590, 0xd1a4, 0x1580, 0x080c, 0x6a29, -+ 0x0558, 0x68b0, 0x9084, 0x00ff, 0x7100, 0x918c, 0x00ff, 0x9106, -+ 0x1518, 0x6880, 0x69b0, 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, 0x840c, 0x0128, 0x6004, -+ 0x9086, 0x0002, 0x0118, 0x0000, 0x9006, 0x0010, 0x9085, 0x0001, -+ 0x00ce, 0x0005, 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, 0x2020, -+ 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, -+ 0x1805, 0x2011, 0x027a, 0x080c, 0xbbae, 0x1178, 0xd48c, 0x0148, -+ 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, 0x027e, 0x080c, 0xbbae, -+ 0x1120, 0xd494, 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, 0x004e, -+ 0x015e, 0x0005, 0x0156, 0x0046, 0x0016, 0x0036, 0x7038, 0x2020, -+ 0x8427, 0x94a4, 0x0007, 0xd484, 0x0148, 0x20a9, 0x0004, 0x2019, -+ 0x1805, 0x2011, 0x0272, 0x080c, 0xbbae, 0x1178, 0xd48c, 0x0148, -+ 0x20a9, 0x0004, 0x2019, 0x1801, 0x2011, 0x0276, 0x080c, 0xbbae, -+ 0x1120, 0xd494, 0x0110, 0x9085, 0x0001, 0x003e, 0x001e, 0x004e, -+ 0x015e, 0x0005, 0x00f6, 0x2079, 0x0200, 0x7800, 0xc0e5, 0xc0cc, -+ 0x7802, 0x00fe, 0x0005, 0x00f6, 0x2079, 0x1800, 0x7834, 0xd084, -+ 0x1130, 0x2079, 0x0200, 0x7800, 0x9085, 0x1200, 0x7802, 0x00fe, -+ 0x0005, 0x00e6, 0x2071, 0x1800, 0x7034, 0xc084, 0x7036, 0x00ee, -+ 0x0005, 0x2071, 0x1a03, 0x7003, 0x0003, 0x700f, 0x0361, 0x9006, -+ 0x701a, 0x7072, 0x7012, 0x7017, 0x1ddc, 0x7007, 0x0000, 0x7026, -+ 0x702b, 0x9e54, 0x7032, 0x7037, 0x9ed1, 0x703f, 0xffff, 0x7042, -+ 0x7047, 0x5571, 0x704a, 0x705b, 0x8711, 0x080c, 0x1053, 0x090c, -+ 0x0d7d, 0x2900, 0x703a, 0xa867, 0x0003, 0xa86f, 0x0100, 0xa8ab, -+ 0xdcb0, 0x0005, 0x2071, 0x1a03, 0x1d04, 0x862d, 0x2091, 0x6000, -+ 0x700c, 0x8001, 0x700e, 0x1590, 0x2001, 0x013c, 0x2004, 0x9005, -+ 0x190c, 0x87bb, 0x2001, 0x1869, 0x2004, 0xd0c4, 0x0158, 0x3a00, -+ 0xd08c, 0x1140, 0x20d1, 0x0000, 0x20d1, 0x0001, 0x20d1, 0x0000, -+ 0x080c, 0x0d7d, 0x700f, 0x0361, 0x7007, 0x0001, 0x0126, 0x2091, -+ 0x8000, 0x2069, 0x1800, 0x69ec, 0xd1e4, 0x1138, 0xd1dc, 0x1118, -+ 0x080c, 0x877f, 0x0010, 0x080c, 0x8756, 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, 0x9f6d, 0x0010, 0x7034, 0x080f, -+ 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, 0x8655, -+ 0x8656, 0x8680, 0x00e6, 0x2071, 0x1a03, 0x7018, 0x9005, 0x1120, -+ 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, 0x0005, 0x00e6, 0x0006, -+ 0x2071, 0x1a03, 0x701c, 0x9206, 0x1120, 0x701a, 0x701e, 0x7072, -+ 0x7076, 0x000e, 0x00ee, 0x0005, 0x00e6, 0x2071, 0x1a03, 0xb888, -+ 0x9102, 0x0208, 0xb98a, 0x00ee, 0x0005, 0x0005, 0x00b6, 0x2031, -+ 0x0010, 0x7110, 0x080c, 0x6625, 0x11a8, 0xb888, 0x8001, 0x0290, -+ 0xb88a, 0x1180, 0x0126, 0x2091, 0x8000, 0x0066, 0xb8d0, 0x9005, -+ 0x0138, 0x0026, 0xba3c, 0x0016, 0x080c, 0x6750, 0x001e, 0x002e, -+ 0x006e, 0x012e, 0x8108, 0x9182, 0x0800, 0x1220, 0x8631, 0x0128, -+ 0x7112, 0x0c00, 0x900e, 0x7007, 0x0002, 0x7112, 0x00be, 0x0005, -+ 0x2031, 0x0010, 0x7014, 0x2060, 0x0126, 0x2091, 0x8000, 0x6048, -+ 0x9005, 0x0128, 0x8001, 0x604a, 0x1110, 0x080c, 0xcb4d, 0x6018, -+ 0x9005, 0x0904, 0x86d8, 0x00f6, 0x2079, 0x0300, 0x7918, 0xd1b4, -+ 0x1904, 0x86eb, 0x781b, 0x2020, 0xa001, 0x7918, 0xd1b4, 0x0120, -+ 0x781b, 0x2000, 0x0804, 0x86eb, 0x8001, 0x601a, 0x0106, 0x781b, -+ 0x2000, 0xa001, 0x7918, 0xd1ac, 0x1dd0, 0x010e, 0x00fe, 0x1540, -+ 0x6120, 0x9186, 0x0003, 0x0148, 0x9186, 0x0006, 0x0130, 0x9186, -+ 0x0009, 0x11e0, 0x611c, 0xd1c4, 0x1100, 0x080c, 0xc838, 0x01b0, -+ 0x6014, 0x2048, 0xa884, 0x908a, 0x199a, 0x0280, 0x9082, 0x1999, -+ 0xa886, 0x908a, 0x199a, 0x0210, 0x2001, 0x1999, 0x8003, 0x800b, -+ 0x810b, 0x9108, 0x611a, 0x080c, 0xcf7e, 0x0110, 0x080c, 0xc536, -+ 0x012e, 0x9c88, 0x001c, 0x7116, 0x2001, 0x181a, 0x2004, 0x9102, -+ 0x1228, 0x8631, 0x0138, 0x2160, 0x0804, 0x8684, 0x7017, 0x1ddc, -+ 0x7007, 0x0000, 0x0005, 0x00fe, 0x0c58, 0x00e6, 0x2071, 0x1a03, -+ 0x7027, 0x07d0, 0x7023, 0x0009, 0x00ee, 0x0005, 0x2001, 0x1a0c, -+ 0x2003, 0x0000, 0x0005, 0x00e6, 0x2071, 0x1a03, 0x7132, 0x702f, -+ 0x0009, 0x00ee, 0x0005, 0x2011, 0x1a0f, 0x2013, 0x0000, 0x0005, -+ 0x00e6, 0x2071, 0x1a03, 0x711a, 0x721e, 0x700b, 0x0009, 0x00ee, -+ 0x0005, 0x0086, 0x0026, 0x7054, 0x8000, 0x7056, 0x2001, 0x1a11, -+ 0x2044, 0xa06c, 0x9086, 0x0000, 0x0150, 0x7068, 0xa09a, 0x7064, -+ 0xa096, 0x7060, 0xa092, 0x705c, 0xa08e, 0x080c, 0x1124, 0x002e, -+ 0x008e, 0x0005, 0x0006, 0x0016, 0x0096, 0x00a6, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x0156, 0x080c, 0x8592, 0x015e, 0x00fe, -+ 0x00ee, 0x00de, 0x00ce, 0x00be, 0x00ae, 0x009e, 0x001e, 0x000e, -+ 0x0005, 0x00e6, 0x2071, 0x1a03, 0x7172, 0x7276, 0x706f, 0x0009, -+ 0x00ee, 0x0005, 0x00e6, 0x0006, 0x2071, 0x1a03, 0x7074, 0x9206, -+ 0x1110, 0x7072, 0x7076, 0x000e, 0x00ee, 0x0005, 0x2069, 0x1800, -+ 0x69ec, 0xd1e4, 0x1518, 0x0026, 0xd1ec, 0x0140, 0x6a54, 0x6874, -+ 0x9202, 0x0288, 0x8117, 0x9294, 0x00c1, 0x0088, 0x9184, 0x0007, -+ 0x01a0, 0x8109, 0x9184, 0x0007, 0x0110, 0x69ee, 0x0070, 0x8107, -+ 0x9084, 0x0007, 0x910d, 0x8107, 0x9106, 0x9094, 0x00c1, 0x9184, -+ 0xff3e, 0x9205, 0x68ee, 0x080c, 0x0f05, 0x002e, 0x0005, 0x69e8, -+ 0x9184, 0x003f, 0x05b8, 0x8109, 0x9184, 0x003f, 0x01a8, 0x6a54, -+ 0x6874, 0x9202, 0x0220, 0xd1bc, 0x0168, 0xc1bc, 0x0018, 0xd1bc, -+ 0x1148, 0xc1bd, 0x2110, 0x00e6, 0x2071, 0x1800, 0x080c, 0x0f27, -+ 0x00ee, 0x0400, 0x69ea, 0x00f0, 0x0026, 0x8107, 0x9094, 0x0007, -+ 0x0128, 0x8001, 0x8007, 0x9085, 0x0007, 0x0050, 0x2010, 0x8004, -+ 0x8004, 0x8004, 0x9084, 0x0007, 0x9205, 0x8007, 0x9085, 0x0028, -+ 0x9086, 0x0040, 0x2010, 0x00e6, 0x2071, 0x1800, 0x080c, 0x0f27, -+ 0x00ee, 0x002e, 0x0005, 0x0016, 0x00c6, 0x2009, 0xfffc, 0x210d, -+ 0x2061, 0x0100, 0x60f0, 0x9100, 0x60f3, 0x0000, 0x2009, 0xfffc, -+ 0x200f, 0x1220, 0x8108, 0x2105, 0x8000, 0x200f, 0x00ce, 0x001e, -+ 0x0005, 0x00c6, 0x2061, 0x1a6f, 0x00ce, 0x0005, 0x9184, 0x000f, -+ 0x8003, 0x8003, 0x8003, 0x9080, 0x1a6f, 0x2060, 0x0005, 0xa884, -+ 0x908a, 0x199a, 0x1638, 0x9005, 0x1150, 0x00c6, 0x2061, 0x1a6f, -+ 0x6014, 0x00ce, 0x9005, 0x1130, 0x2001, 0x001e, 0x0018, 0x908e, -+ 0xffff, 0x01b0, 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0xa87c, -+ 0x908c, 0x00c0, 0x918e, 0x00c0, 0x0904, 0x8896, 0xd0b4, 0x1168, -+ 0xd0bc, 0x1904, 0x886f, 0x2009, 0x0006, 0x080c, 0x88c3, 0x0005, -+ 0x900e, 0x0c60, 0x2001, 0x1999, 0x08b0, 0xd0fc, 0x05c8, 0x908c, -+ 0x2023, 0x1550, 0x87ff, 0x1540, 0x6124, 0x918c, 0x0500, 0x1520, -+ 0x6100, 0x918e, 0x0007, 0x1500, 0x2009, 0x1869, 0x210c, 0xd184, -+ 0x11d8, 0x6003, 0x0003, 0x6007, 0x0043, 0x6047, 0xb035, 0x080c, -+ 0x1c03, 0xa87c, 0xc0dd, 0xa87e, 0x600f, 0x0000, 0x00f6, 0x2079, -+ 0x0380, 0x7818, 0xd0bc, 0x1de8, 0x7833, 0x0013, 0x2c00, 0x7836, -+ 0x781b, 0x8080, 0x00fe, 0x0005, 0x908c, 0x0003, 0x0120, 0x918e, -+ 0x0003, 0x1904, 0x88bd, 0x908c, 0x2020, 0x918e, 0x2020, 0x01a8, -+ 0x6024, 0xd0d4, 0x11e8, 0x2009, 0x1869, 0x2104, 0xd084, 0x1138, -+ 0x87ff, 0x1120, 0x2009, 0x0043, 0x0804, 0xac8c, 0x0005, 0x87ff, -+ 0x1de8, 0x2009, 0x0042, 0x0804, 0xac8c, 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, 0x88bd, -+ 0x908c, 0x2020, 0x918e, 0x2020, 0x0170, 0x0076, 0x00f6, 0x2c78, -+ 0x080c, 0x1731, 0x00fe, 0x007e, 0x87ff, 0x1120, 0x2009, 0x0042, -+ 0x080c, 0xac8c, 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, 0xac8c, -+ 0x0005, 0x00b9, 0x0ce8, 0x87ff, 0x1dd8, 0x2009, 0x0043, 0x080c, -+ 0xac8c, 0x0cb0, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, 0xd1ac, -+ 0x0d20, 0x6124, 0xc1cd, 0x6126, 0x0c00, 0x2009, 0x0004, 0x0019, -+ 0x0005, 0x2009, 0x0001, 0x0096, 0x080c, 0xc838, 0x0518, 0x6014, -+ 0x2048, 0xa982, 0xa800, 0x6016, 0x9186, 0x0001, 0x1188, 0xa97c, -+ 0x918c, 0x8100, 0x918e, 0x8100, 0x1158, 0x00c6, 0x2061, 0x1a6f, -+ 0x6200, 0xd28c, 0x1120, 0x6204, 0x8210, 0x0208, 0x6206, 0x00ce, -+ 0x080c, 0x6bb5, 0x6014, 0x904d, 0x0076, 0x2039, 0x0000, 0x190c, -+ 0x87df, 0x007e, 0x009e, 0x0005, 0x0156, 0x00c6, 0x2061, 0x1a6f, -+ 0x6000, 0x81ff, 0x0110, 0x9205, 0x0008, 0x9204, 0x6002, 0x00ce, -+ 0x015e, 0x0005, 0x6800, 0xd08c, 0x1138, 0x6808, 0x9005, 0x0120, -+ 0x8001, 0x680a, 0x9085, 0x0001, 0x0005, 0x2071, 0x1923, 0x7003, -+ 0x0006, 0x7007, 0x0000, 0x700f, 0x0000, 0x7013, 0x0001, 0x080c, -+ 0x1053, 0x090c, 0x0d7d, 0xa867, 0x0006, 0xa86b, 0x0001, 0xa8ab, -+ 0xdcb0, 0xa89f, 0x0000, 0x2900, 0x702e, 0x7033, 0x0000, 0x0005, -+ 0x0096, 0x00e6, 0x2071, 0x1923, 0x702c, 0x2048, 0x6a2c, 0x721e, -+ 0x6b30, 0x7322, 0x6834, 0x7026, 0xa896, 0x6838, 0x702a, 0xa89a, -+ 0x6824, 0x7016, 0x683c, 0x701a, 0x2009, 0x0028, 0x200a, 0x9005, -+ 0x0148, 0x900e, 0x9188, 0x000c, 0x8001, 0x1de0, 0x2100, 0x9210, -+ 0x1208, 0x8318, 0xaa8e, 0xab92, 0x7010, 0xd084, 0x0178, 0xc084, -+ 0x7007, 0x0001, 0x700f, 0x0000, 0x0006, 0x2009, 0x181d, 0x2104, -+ 0x9082, 0x0007, 0x2009, 0x1b4e, 0x200a, 0x000e, 0xc095, 0x7012, -+ 0x2008, 0x2001, 0x003b, 0x080c, 0x1679, 0x9006, 0x2071, 0x193c, -+ 0x7002, 0x7006, 0x702a, 0x00ee, 0x009e, 0x0005, 0x00e6, 0x0126, -+ 0x0156, 0x2091, 0x8000, 0x2071, 0x1800, 0x7154, 0x2001, 0x0008, -+ 0x910a, 0x0638, 0x2001, 0x187d, 0x20ac, 0x9006, 0x9080, 0x0008, -+ 0x1f04, 0x8976, 0x71c0, 0x9102, 0x02e0, 0x2071, 0x1877, 0x20a9, -+ 0x0007, 0x00c6, 0x080c, 0xab97, 0x6023, 0x0009, 0x6003, 0x0004, -+ 0x601f, 0x0101, 0x0089, 0x0126, 0x2091, 0x8000, 0x080c, 0x8afc, -+ 0x012e, 0x1f04, 0x8982, 0x9006, 0x00ce, 0x015e, 0x012e, 0x00ee, -+ 0x0005, 0x9085, 0x0001, 0x0cc8, 0x00e6, 0x00b6, 0x0096, 0x0086, -+ 0x0056, 0x0046, 0x0026, 0x7118, 0x720c, 0x7620, 0x7004, 0xd084, -+ 0x1128, 0x2021, 0x0024, 0x2029, 0x0002, 0x0020, 0x2021, 0x002c, -+ 0x2029, 0x000a, 0x080c, 0x103a, 0x090c, 0x0d7d, 0x2900, 0x6016, -+ 0x2058, 0xac66, 0x9006, 0xa802, 0xa806, 0xa86a, 0xa87a, 0xa8aa, -+ 0xa887, 0x0005, 0xa87f, 0x0020, 0x7008, 0xa89a, 0x7010, 0xa89e, -+ 0xae8a, 0xa8af, 0xffff, 0xa8b3, 0x0000, 0x8109, 0x0160, 0x080c, -+ 0x103a, 0x090c, 0x0d7d, 0xad66, 0x2b00, 0xa802, 0x2900, 0xb806, -+ 0x2058, 0x8109, 0x1da0, 0x002e, 0x004e, 0x005e, 0x008e, 0x009e, -+ 0x00be, 0x00ee, 0x0005, 0x2079, 0x0000, 0x2071, 0x1923, 0x7004, -+ 0x004b, 0x700c, 0x0002, 0x89ee, 0x89e7, 0x89e7, 0x0005, 0x89f8, -+ 0x8a59, 0x8a59, 0x8a59, 0x8a5a, 0x8a6b, 0x8a6b, 0x700c, 0x0cba, -+ 0x0126, 0x2091, 0x8000, 0x78a0, 0x79a0, 0x9106, 0x0128, 0x78a0, -+ 0x79a0, 0x9106, 0x1904, 0x8a4c, 0x2001, 0x0005, 0x2004, 0xd0bc, -+ 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, 0x012e, -+ 0x7018, 0x910a, 0x1130, 0x7030, 0x9005, 0x05a8, 0x080c, 0x8a9a, -+ 0x0490, 0x1210, 0x7114, 0x910a, 0x9192, 0x000a, 0x0210, 0x2009, -+ 0x000a, 0x2001, 0x1888, 0x2014, 0x2001, 0x1935, 0x2004, 0x9100, -+ 0x9202, 0x0e48, 0x080c, 0x8be6, 0x2200, 0x9102, 0x0208, 0x2208, -+ 0x0096, 0x702c, 0x2048, 0xa873, 0x0001, 0xa976, 0x080c, 0x8cef, -+ 0x2100, 0xa87e, 0xa86f, 0x0000, 0x009e, 0x0126, 0x2091, 0x8000, -+ 0x2009, 0x1a21, 0x2104, 0xc085, 0x200a, 0x700f, 0x0002, 0x012e, -+ 0x080c, 0x1143, 0x1de8, 0x0005, 0x2001, 0x0005, 0x2004, 0xd0bc, -+ 0x0130, 0x2011, 0x0004, 0x2204, 0xc0c5, 0x2012, 0x0ca8, 0x012e, -+ 0x0005, 0x0005, 0x700c, 0x0002, 0x8a5f, 0x8a62, 0x8a61, 0x080c, -+ 0x89f6, 0x0005, 0x8001, 0x700e, 0x0096, 0x702c, 0x2048, 0xa974, -+ 0x009e, 0x0011, 0x0ca0, 0x0005, 0x0096, 0x702c, 0x2048, 0x7018, -+ 0x9100, 0x7214, 0x921a, 0x1130, 0x701c, 0xa88e, 0x7020, 0xa892, -+ 0x9006, 0x0068, 0x0006, 0x080c, 0x8cef, 0x2100, 0xaa8c, 0x9210, -+ 0xaa8e, 0x1220, 0xa890, 0x9081, 0x0000, 0xa892, 0x000e, 0x009e, -+ 0x2f08, 0x9188, 0x0028, 0x200a, 0x701a, 0x0005, 0x00e6, 0x2071, -+ 0x1923, 0x700c, 0x0002, 0x8a98, 0x8a98, 0x8a96, 0x700f, 0x0001, -+ 0x00ee, 0x0005, 0x0126, 0x2091, 0x8000, 0x7030, 0x9005, 0x0508, -+ 0x2078, 0x7814, 0x2048, 0xae88, 0x00b6, 0x2059, 0x0000, 0x080c, -+ 0x8b05, 0x00be, 0x01b0, 0x00e6, 0x2071, 0x193c, 0x080c, 0x8b4c, -+ 0x00ee, 0x0178, 0x0096, 0x080c, 0x1053, 0x2900, 0x009e, 0x0148, -+ 0xa8aa, 0x04b9, 0x0041, 0x2001, 0x1946, 0x2003, 0x0000, 0x012e, -+ 0x08c8, 0x012e, 0x0005, 0x00d6, 0x00c6, 0x0086, 0x00a6, 0x2940, -+ 0x2650, 0x2600, 0x9005, 0x0180, 0xa864, 0x9084, 0x000f, 0x2068, -+ 0x9d88, 0x1e55, 0x2165, 0x0056, 0x2029, 0x0000, 0x080c, 0x8c74, -+ 0x080c, 0x1e2b, 0x1dd8, 0x005e, 0x00ae, 0x2001, 0x187f, 0x2004, -+ 0xa88a, 0x080c, 0x1731, 0x781f, 0x0101, 0x7813, 0x0000, 0x0126, -+ 0x2091, 0x8000, 0x080c, 0x8b5b, 0x012e, 0x008e, 0x00ce, 0x00de, -+ 0x0005, 0x7030, 0x9005, 0x0138, 0x2078, 0x780c, 0x7032, 0x2001, -+ 0x1946, 0x2003, 0x0001, 0x0005, 0x00e6, 0x2071, 0x1923, 0x7030, -+ 0x600e, 0x2c00, 0x7032, 0x00ee, 0x0005, 0x00d6, 0x00c6, 0x0026, -+ 0x9b80, 0x8dce, 0x2005, 0x906d, 0x090c, 0x0d7d, 0x9b80, 0x8dc6, -+ 0x2005, 0x9065, 0x090c, 0x0d7d, 0x6114, 0x2600, 0x9102, 0x0248, -+ 0x6828, 0x9102, 0x02f0, 0x9085, 0x0001, 0x002e, 0x00ce, 0x00de, -+ 0x0005, 0x6804, 0xd094, 0x0148, 0x6854, 0xd084, 0x1178, 0xc085, -+ 0x6856, 0x2011, 0x8026, 0x080c, 0x4b07, 0x684c, 0x0096, 0x904d, -+ 0x090c, 0x0d7d, 0xa804, 0x8000, 0xa806, 0x009e, 0x9006, 0x2030, -+ 0x0c20, 0x6854, 0xd08c, 0x1d08, 0xc08d, 0x6856, 0x2011, 0x8025, -+ 0x080c, 0x4b07, 0x684c, 0x0096, 0x904d, 0x090c, 0x0d7d, 0xa800, -+ 0x8000, 0xa802, 0x009e, 0x0888, 0x7000, 0x2019, 0x0008, 0x8319, -+ 0x7104, 0x9102, 0x1118, 0x2300, 0x9005, 0x0020, 0x0210, 0x9302, -+ 0x0008, 0x8002, 0x0005, 0x00d6, 0x7814, 0x9005, 0x090c, 0x0d7d, -+ 0x781c, 0x9084, 0x0101, 0x9086, 0x0101, 0x190c, 0x0d7d, 0x2069, -+ 0x193c, 0x6804, 0x9080, 0x193e, 0x2f08, 0x2102, 0x6904, 0x8108, -+ 0x9182, 0x0008, 0x0208, 0x900e, 0x6906, 0x9180, 0x193e, 0x2003, -+ 0x0000, 0x00de, 0x0005, 0x0096, 0x00c6, 0x2060, 0x6014, 0x2048, -+ 0xa8a8, 0x0096, 0x2048, 0x9005, 0x190c, 0x106c, 0x009e, 0xa8ab, -+ 0x0000, 0x080c, 0x0fec, 0x080c, 0xabed, 0x00ce, 0x009e, 0x0005, -+ 0x6020, 0x9086, 0x0009, 0x1128, 0x601c, 0xd0c4, 0x0110, 0x9006, -+ 0x0005, 0x9085, 0x0001, 0x0005, 0x6000, 0x9086, 0x0000, 0x0178, -+ 0x6010, 0x9005, 0x0150, 0x00b6, 0x2058, 0x080c, 0x8f01, 0x00be, -+ 0x6013, 0x0000, 0x601b, 0x0000, 0x0010, 0x2c00, 0x0861, 0x0005, -+ 0x2009, 0x1927, 0x210c, 0xd194, 0x0005, 0x00e6, 0x2071, 0x1923, -+ 0x7110, 0xc194, 0xd19c, 0x1118, 0xc185, 0x7007, 0x0000, 0x7112, -+ 0x2001, 0x003b, 0x080c, 0x1679, 0x00ee, 0x0005, 0x0096, 0x00d6, -+ 0x9006, 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x7016, 0x702a, -+ 0x7026, 0x702f, 0x0000, 0x080c, 0x8d4e, 0x0170, 0x080c, 0x8d83, -+ 0x0158, 0x2900, 0x7002, 0x700a, 0x701a, 0x7013, 0x0001, 0x701f, -+ 0x000a, 0x00de, 0x009e, 0x0005, 0x900e, 0x0cd8, 0x00e6, 0x0096, -+ 0x0086, 0x00d6, 0x00c6, 0x2071, 0x1930, 0x721c, 0x2100, 0x9202, -+ 0x1618, 0x080c, 0x8d83, 0x090c, 0x0d7d, 0x7018, 0x9005, 0x1160, -+ 0x2900, 0x7002, 0x700a, 0x701a, 0x9006, 0x7006, 0x700e, 0xa806, -+ 0xa802, 0x7012, 0x701e, 0x0038, 0x2040, 0xa806, 0x2900, 0xa002, -+ 0x701a, 0xa803, 0x0000, 0x7010, 0x8000, 0x7012, 0x701c, 0x9080, -+ 0x000a, 0x701e, 0x721c, 0x08d0, 0x721c, 0x00ce, 0x00de, 0x008e, -+ 0x009e, 0x00ee, 0x0005, 0x0096, 0x0156, 0x0136, 0x0146, 0x00e6, -+ 0x0126, 0x2091, 0x8000, 0x2071, 0x1930, 0x7300, 0x831f, 0x831e, -+ 0x831e, 0x9384, 0x003f, 0x20e8, 0x939c, 0xffc0, 0x9398, 0x0003, -+ 0x7104, 0x080c, 0x8cef, 0x810c, 0x2100, 0x9318, 0x8003, 0x2228, -+ 0x2021, 0x0078, 0x9402, 0x9532, 0x0208, 0x2028, 0x2500, 0x8004, -+ 0x20a8, 0x23a0, 0xa001, 0xa001, 0x4005, 0x2508, 0x080c, 0x8cf8, -+ 0x2130, 0x7014, 0x9600, 0x7016, 0x2600, 0x711c, 0x9102, 0x701e, -+ 0x7004, 0x9600, 0x2008, 0x9082, 0x000a, 0x1190, 0x7000, 0x2048, -+ 0xa800, 0x9005, 0x1148, 0x2009, 0x0001, 0x0026, 0x080c, 0x8be6, -+ 0x002e, 0x7000, 0x2048, 0xa800, 0x7002, 0x7007, 0x0000, 0x0008, -+ 0x7106, 0x2500, 0x9212, 0x1904, 0x8c25, 0x012e, 0x00ee, 0x014e, -+ 0x013e, 0x015e, 0x009e, 0x0005, 0x0016, 0x0026, 0x00e6, 0x0126, -+ 0x2091, 0x8000, 0x9580, 0x8dc6, 0x2005, 0x9075, 0x090c, 0x0d7d, -+ 0x080c, 0x8cca, 0x012e, 0x9580, 0x8dc2, 0x2005, 0x9075, 0x090c, -+ 0x0d7d, 0x0156, 0x0136, 0x01c6, 0x0146, 0x01d6, 0x831f, 0x831e, -+ 0x831e, 0x9384, 0x003f, 0x20e0, 0x9384, 0xffc0, 0x9100, 0x2098, -+ 0xa860, 0x20e8, 0xa95c, 0x2c05, 0x9100, 0x20a0, 0x20a9, 0x0002, -+ 0x4003, 0x2e0c, 0x2d00, 0x0002, 0x8cb4, 0x8cb4, 0x8cb6, 0x8cb4, -+ 0x8cb6, 0x8cb4, 0x8cb4, 0x8cb4, 0x8cb4, 0x8cb4, 0x8cbc, 0x8cb4, -+ 0x8cbc, 0x8cb4, 0x8cb4, 0x8cb4, 0x080c, 0x0d7d, 0x4104, 0x20a9, -+ 0x0002, 0x4002, 0x4003, 0x0028, 0x20a9, 0x0002, 0x4003, 0x4104, -+ 0x4003, 0x01de, 0x014e, 0x01ce, 0x013e, 0x015e, 0x00ee, 0x002e, -+ 0x001e, 0x0005, 0x0096, 0x7014, 0x8001, 0x7016, 0x710c, 0x2110, -+ 0x00f1, 0x810c, 0x9188, 0x0003, 0x7308, 0x8210, 0x9282, 0x000a, -+ 0x1198, 0x7008, 0x2048, 0xa800, 0x9005, 0x0158, 0x0006, 0x080c, -+ 0x8d92, 0x009e, 0xa807, 0x0000, 0x2900, 0x700a, 0x7010, 0x8001, -+ 0x7012, 0x700f, 0x0000, 0x0008, 0x720e, 0x009e, 0x0005, 0x0006, -+ 0x810b, 0x810b, 0x2100, 0x810b, 0x9100, 0x2008, 0x000e, 0x0005, -+ 0x0006, 0x0026, 0x2100, 0x9005, 0x0158, 0x9092, 0x000c, 0x0240, -+ 0x900e, 0x8108, 0x9082, 0x000c, 0x1de0, 0x002e, 0x000e, 0x0005, -+ 0x900e, 0x0cd8, 0x2d00, 0x90b8, 0x0008, 0x690c, 0x6810, 0x2019, -+ 0x0001, 0x2031, 0x8d38, 0x9112, 0x0220, 0x0118, 0x8318, 0x2208, -+ 0x0cd0, 0x6808, 0x9005, 0x0108, 0x8318, 0x233a, 0x6804, 0xd084, -+ 0x2300, 0x2021, 0x0001, 0x1150, 0x9082, 0x0003, 0x0967, 0x0a67, -+ 0x8420, 0x9082, 0x0007, 0x0967, 0x0a67, 0x0cd0, 0x9082, 0x0002, -+ 0x0967, 0x0a67, 0x8420, 0x9082, 0x0005, 0x0967, 0x0a67, 0x0cd0, -+ 0x6c1a, 0x2d00, 0x90b8, 0x0007, 0x00e6, 0x2071, 0x1800, 0x7128, -+ 0x6810, 0x2019, 0x0001, 0x910a, 0x0118, 0x0210, 0x8318, 0x0cd8, -+ 0x2031, 0x8d4b, 0x0870, 0x6c16, 0x00ee, 0x0005, 0x0096, 0x0046, -+ 0x0126, 0x2091, 0x8000, 0x2b00, 0x9080, 0x8dca, 0x2005, 0x9005, -+ 0x090c, 0x0d7d, 0x2004, 0x90a0, 0x000a, 0x080c, 0x1053, 0x01d0, -+ 0x2900, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, 0x080c, 0x1053, -+ 0x0188, 0x7024, 0xa802, 0xa807, 0x0000, 0x2900, 0x7026, 0x94a2, -+ 0x000a, 0x0110, 0x0208, 0x0c90, 0x9085, 0x0001, 0x012e, 0x004e, -+ 0x009e, 0x0005, 0x7024, 0x9005, 0x0dc8, 0x2048, 0xac00, 0x080c, -+ 0x106c, 0x2400, 0x0cc0, 0x0126, 0x2091, 0x8000, 0x7024, 0x2048, -+ 0x9005, 0x0130, 0xa800, 0x7026, 0xa803, 0x0000, 0xa807, 0x0000, -+ 0x012e, 0x0005, 0x0126, 0x2091, 0x8000, 0x7024, 0xa802, 0x2900, -+ 0x7026, 0x012e, 0x0005, 0x0096, 0x9e80, 0x0009, 0x2004, 0x9005, -+ 0x0138, 0x2048, 0xa800, 0x0006, 0x080c, 0x106c, 0x000e, 0x0cb8, -+ 0x009e, 0x0005, 0x0096, 0x7008, 0x9005, 0x0138, 0x2048, 0xa800, -+ 0x0006, 0x080c, 0x106c, 0x000e, 0x0cb8, 0x9006, 0x7002, 0x700a, -+ 0x7006, 0x700e, 0x701a, 0x701e, 0x7022, 0x702a, 0x7026, 0x702e, -+ 0x009e, 0x0005, 0x1a6d, 0x0000, 0x0000, 0x0000, 0x1930, 0x0000, -+ 0x0000, 0x0000, 0x1888, 0x0000, 0x0000, 0x0000, 0x1877, 0x0000, -+ 0x0000, 0x0000, 0x00e6, 0x00c6, 0x00b6, 0x00a6, 0xa8a8, 0x2040, -+ 0x2071, 0x1877, 0x080c, 0x8eec, 0xa067, 0x0023, 0x6010, 0x905d, -+ 0x0904, 0x8ec1, 0xb814, 0xa06e, 0xb910, 0xa172, 0xb9a0, 0xa176, -+ 0x2001, 0x0003, 0xa07e, 0xa834, 0xa082, 0xa07b, 0x0000, 0xa898, -+ 0x9005, 0x0118, 0xa078, 0xc085, 0xa07a, 0x2858, 0x2031, 0x0018, -+ 0xa068, 0x908a, 0x0019, 0x1a0c, 0x0d7d, 0x2020, 0x2050, 0x2940, -+ 0xa864, 0x90bc, 0x00ff, 0x908c, 0x000f, 0x91e0, 0x1e55, 0x2c65, -+ 0x9786, 0x0024, 0x2c05, 0x1590, 0x908a, 0x0036, 0x1a0c, 0x0d7d, -+ 0x9082, 0x001b, 0x0002, 0x8e2e, 0x8e2e, 0x8e30, 0x8e2e, 0x8e2e, -+ 0x8e2e, 0x8e32, 0x8e2e, 0x8e2e, 0x8e2e, 0x8e34, 0x8e2e, 0x8e2e, -+ 0x8e2e, 0x8e36, 0x8e2e, 0x8e2e, 0x8e2e, 0x8e38, 0x8e2e, 0x8e2e, -+ 0x8e2e, 0x8e3a, 0x8e2e, 0x8e2e, 0x8e2e, 0x8e3c, 0x080c, 0x0d7d, -+ 0xa180, 0x04b8, 0xa190, 0x04a8, 0xa1a0, 0x0498, 0xa1b0, 0x0488, -+ 0xa1c0, 0x0478, 0xa1d0, 0x0468, 0xa1e0, 0x0458, 0x908a, 0x0034, -+ 0x1a0c, 0x0d7d, 0x9082, 0x001b, 0x0002, 0x8e60, 0x8e5e, 0x8e5e, -+ 0x8e5e, 0x8e5e, 0x8e5e, 0x8e62, 0x8e5e, 0x8e5e, 0x8e5e, 0x8e5e, -+ 0x8e5e, 0x8e64, 0x8e5e, 0x8e5e, 0x8e5e, 0x8e5e, 0x8e5e, 0x8e66, -+ 0x8e5e, 0x8e5e, 0x8e5e, 0x8e5e, 0x8e5e, 0x8e68, 0x080c, 0x0d7d, -+ 0xa180, 0x0038, 0xa198, 0x0028, 0xa1b0, 0x0018, 0xa1c8, 0x0008, -+ 0xa1e0, 0x2600, 0x0002, 0x8e84, 0x8e86, 0x8e88, 0x8e8a, 0x8e8c, -+ 0x8e8e, 0x8e90, 0x8e92, 0x8e94, 0x8e96, 0x8e98, 0x8e9a, 0x8e9c, -+ 0x8e9e, 0x8ea0, 0x8ea2, 0x8ea4, 0x8ea6, 0x8ea8, 0x8eaa, 0x8eac, -+ 0x8eae, 0x8eb0, 0x8eb2, 0x8eb4, 0x080c, 0x0d7d, 0xb9e2, 0x0468, -+ 0xb9de, 0x0458, 0xb9da, 0x0448, 0xb9d6, 0x0438, 0xb9d2, 0x0428, -+ 0xb9ce, 0x0418, 0xb9ca, 0x0408, 0xb9c6, 0x00f8, 0xb9c2, 0x00e8, -+ 0xb9be, 0x00d8, 0xb9ba, 0x00c8, 0xb9b6, 0x00b8, 0xb9b2, 0x00a8, -+ 0xb9ae, 0x0098, 0xb9aa, 0x0088, 0xb9a6, 0x0078, 0xb9a2, 0x0068, -+ 0xb99e, 0x0058, 0xb99a, 0x0048, 0xb996, 0x0038, 0xb992, 0x0028, -+ 0xb98e, 0x0018, 0xb98a, 0x0008, 0xb986, 0x8631, 0x8421, 0x0120, -+ 0x080c, 0x1e2b, 0x0804, 0x8e08, 0x00ae, 0x00be, 0x00ce, 0x00ee, -+ 0x0005, 0xa86c, 0xa06e, 0xa870, 0xa072, 0xa077, 0x00ff, 0x9006, -+ 0x0804, 0x8dea, 0x0006, 0x0016, 0x00b6, 0x6010, 0x2058, 0xb810, -+ 0x9005, 0x01b0, 0x2001, 0x1924, 0x2004, 0x9005, 0x0188, 0x2001, -+ 0x1800, 0x2004, 0x9086, 0x0003, 0x1158, 0x0036, 0x0046, 0xbba0, -+ 0x2021, 0x0004, 0x2011, 0x8014, 0x080c, 0x4b07, 0x004e, 0x003e, -+ 0x00be, 0x001e, 0x000e, 0x0005, 0x9016, 0x710c, 0xa834, 0x910a, -+ 0xa936, 0x7008, 0x9005, 0x0120, 0x8210, 0x910a, 0x0238, 0x0130, -+ 0x7010, 0x8210, 0x910a, 0x0210, 0x0108, 0x0cd8, 0xaa8a, 0xa26a, -+ 0x0005, 0x00f6, 0x00d6, 0x0036, 0x2079, 0x0300, 0x781b, 0x0200, -+ 0x7818, 0xd094, 0x1dd8, 0x781b, 0x0202, 0xa001, 0xa001, 0x7818, -+ 0xd094, 0x1da0, 0xb8ac, 0x9005, 0x01b8, 0x2068, 0x2079, 0x0000, -+ 0x2c08, 0x911e, 0x1118, 0x680c, 0xb8ae, 0x0060, 0x9106, 0x0140, -+ 0x2d00, 0x2078, 0x680c, 0x9005, 0x090c, 0x0d7d, 0x2068, 0x0cb0, -+ 0x6b0c, 0x7b0e, 0x600f, 0x0000, 0x2079, 0x0300, 0x781b, 0x0200, -+ 0x003e, 0x00de, 0x00fe, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x00c6, -+ 0x0036, 0x0126, 0x2091, 0x8000, 0x0156, 0x20a9, 0x01ff, 0x2071, -+ 0x0300, 0x701b, 0x0200, 0x7018, 0xd094, 0x0110, 0x1f04, 0x8f41, -+ 0x701b, 0x0202, 0xa001, 0xa001, 0x7018, 0xd094, 0x1d90, 0xb8ac, -+ 0x9005, 0x01d0, 0x2060, 0x600c, 0xb8ae, 0x6003, 0x0004, 0x601b, -+ 0x0000, 0x6013, 0x0000, 0x601f, 0x0101, 0x6014, 0x2048, 0xa88b, -+ 0x0000, 0xa8a8, 0xa8ab, 0x0000, 0x904d, 0x090c, 0x0d7d, 0x080c, -+ 0x106c, 0x080c, 0x8afc, 0x0c18, 0x2071, 0x0300, 0x701b, 0x0200, -+ 0x015e, 0x012e, 0x003e, 0x00ce, 0x009e, 0x00de, 0x00ee, 0x0005, -+ 0x00c6, 0x00b6, 0x0016, 0x0006, 0x0156, 0x080c, 0x25fb, 0x015e, -+ 0x11b0, 0x080c, 0x65c4, 0x190c, 0x0d7d, 0x000e, 0x001e, 0xb912, -+ 0xb816, 0x080c, 0xab97, 0x0140, 0x2b00, 0x6012, 0x6023, 0x0001, -+ 0x2009, 0x0001, 0x080c, 0xac8c, 0x00be, 0x00ce, 0x0005, 0x000e, -+ 0x001e, 0x0cd0, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, -+ 0x0013, 0x006e, 0x0005, 0x8fb3, 0x8fb3, 0x8fb3, 0x8fb5, 0x8ffe, -+ 0x8fb3, 0x8fb3, 0x8fb3, 0x9061, 0x8fb3, 0x9099, 0x8fb3, 0x8fb3, -+ 0x8fb3, 0x8fb3, 0x8fb3, 0x080c, 0x0d7d, 0x9182, 0x0040, 0x0002, -+ 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, -+ 0x8fc8, 0x8fca, 0x8fdb, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fc8, 0x8fec, -+ 0x080c, 0x0d7d, 0x0096, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, -+ 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6b80, 0x080c, -+ 0xabed, 0x009e, 0x0005, 0x080c, 0x963b, 0x00d6, 0x6114, 0x080c, -+ 0xc838, 0x0130, 0x0096, 0x6114, 0x2148, 0x080c, 0x6d80, 0x009e, -+ 0x00de, 0x080c, 0xabed, 0x0005, 0x080c, 0x963b, 0x080c, 0x31e7, -+ 0x6114, 0x0096, 0x2148, 0x080c, 0xc838, 0x0120, 0xa87b, 0x0029, -+ 0x080c, 0x6d80, 0x009e, 0x080c, 0xabed, 0x0005, 0x601b, 0x0000, -+ 0x9182, 0x0040, 0x0096, 0x0002, 0x9019, 0x9019, 0x9019, 0x9019, -+ 0x9019, 0x9019, 0x9019, 0x9019, 0x901b, 0x9019, 0x9019, 0x9019, -+ 0x905d, 0x9019, 0x9019, 0x9019, 0x9019, 0x9019, 0x9019, 0x9021, -+ 0x9019, 0x080c, 0x0d7d, 0x6114, 0x2148, 0xa938, 0x918e, 0xffff, -+ 0x05e0, 0x00e6, 0x6114, 0x2148, 0x080c, 0x8dd2, 0x0096, 0xa8a8, -+ 0x2048, 0x080c, 0x6b18, 0x009e, 0xa8ab, 0x0000, 0x6010, 0x9005, -+ 0x0128, 0x00b6, 0x2058, 0x080c, 0x8f01, 0x00be, 0xae88, 0x00b6, -+ 0x2059, 0x0000, 0x080c, 0x8b05, 0x00be, 0x01e0, 0x2071, 0x193c, -+ 0x080c, 0x8b4c, 0x01b8, 0x9086, 0x0001, 0x1128, 0x2001, 0x1946, -+ 0x2004, 0x9005, 0x1178, 0x0096, 0x080c, 0x103a, 0x2900, 0x009e, -+ 0x0148, 0xa8aa, 0x00f6, 0x2c78, 0x080c, 0x8ac3, 0x00fe, 0x00ee, -+ 0x009e, 0x0005, 0x080c, 0x8afc, 0x0cd0, 0x080c, 0x9115, 0x009e, -+ 0x0005, 0x9182, 0x0040, 0x0096, 0x0002, 0x9075, 0x9075, 0x9075, -+ 0x9077, 0x9075, 0x9075, 0x9075, 0x9097, 0x9075, 0x9075, 0x9075, -+ 0x9075, 0x9075, 0x9075, 0x9075, 0x9075, 0x080c, 0x0d7d, 0x6003, -+ 0x0003, 0x6106, 0x6014, 0x2048, 0xa8ac, 0xa836, 0xa8b0, 0xa83a, -+ 0xa847, 0x0000, 0xa84b, 0x0000, 0xa884, 0x9092, 0x199a, 0x0210, -+ 0x2001, 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x080c, -+ 0x1bba, 0x2009, 0x8030, 0x080c, 0x9265, 0x009e, 0x0005, 0x080c, -+ 0x0d7d, 0x080c, 0x963b, 0x6114, 0x2148, 0xa87b, 0x0000, 0x6010, -+ 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6d80, 0x080c, -+ 0xabed, 0x009e, 0x0005, 0x080c, 0xa896, 0x6144, 0xd1fc, 0x0120, -+ 0xd1ac, 0x1110, 0x6003, 0x0003, 0x6000, 0x908a, 0x0016, 0x1a0c, -+ 0x0d7d, 0x0096, 0x0023, 0x009e, 0x080c, 0xa8b2, 0x0005, 0x90cf, -+ 0x90cf, 0x90cf, 0x90d1, 0x90e2, 0x90cf, 0x90cf, 0x90cf, 0x90cf, -+ 0x90cf, 0x90cf, 0x90cf, 0x90cf, 0x90cf, 0x90cf, 0x90cf, 0x080c, -+ 0x0d7d, 0x080c, 0xaa2a, 0x6114, 0x2148, 0xa87b, 0x0006, 0x6010, -+ 0x00b6, 0x2058, 0xb8bb, 0x0500, 0x00be, 0x080c, 0x6d80, 0x080c, -+ 0xabed, 0x0005, 0x0491, 0x0005, 0x080c, 0xa896, 0x6000, 0x6144, -+ 0xd1fc, 0x0130, 0xd1ac, 0x1120, 0x6003, 0x0003, 0x2009, 0x0003, -+ 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0096, 0x0033, 0x009e, 0x0106, -+ 0x080c, 0xa8b2, 0x010e, 0x0005, 0x910c, 0x910c, 0x910c, 0x910e, -+ 0x9115, 0x910c, 0x910c, 0x910c, 0x910c, 0x910c, 0x910c, 0x910c, -+ 0x910c, 0x910c, 0x910c, 0x910c, 0x080c, 0x0d7d, 0x0036, 0x00e6, -+ 0x080c, 0xaa2a, 0x00ee, 0x003e, 0x0005, 0x00f6, 0x00e6, 0x601b, -+ 0x0000, 0x6014, 0x2048, 0x6010, 0x9005, 0x0128, 0x00b6, 0x2058, -+ 0x080c, 0x8f01, 0x00be, 0x2071, 0x193c, 0x080c, 0x8b4c, 0x0160, -+ 0x2001, 0x187f, 0x2004, 0xa88a, 0x2031, 0x0000, 0x2c78, 0x080c, -+ 0x8ac3, 0x00ee, 0x00fe, 0x0005, 0x0096, 0xa88b, 0x0000, 0xa8a8, -+ 0x2048, 0x080c, 0x106c, 0x009e, 0xa8ab, 0x0000, 0x080c, 0x8afc, -+ 0x0c80, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -+ 0x0000, 0x0000, 0x187a, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, -+ 0x0000, 0x0126, 0x2091, 0x8000, 0x0036, 0x0046, 0x20a9, 0x0010, -+ 0x9006, 0x8004, 0x8086, 0x818e, 0x1208, 0x9200, 0x1f04, 0x915a, -+ 0x8086, 0x818e, 0x004e, 0x003e, 0x012e, 0x0005, 0x0126, 0x2091, -+ 0x8000, 0x0076, 0x0156, 0x20a9, 0x0010, 0x9005, 0x01c8, 0x911a, -+ 0x12b8, 0x8213, 0x818d, 0x0228, 0x911a, 0x1220, 0x1f04, 0x9171, -+ 0x0028, 0x911a, 0x2308, 0x8210, 0x1f04, 0x9171, 0x0006, 0x3200, -+ 0x9084, 0xefff, 0x2080, 0x000e, 0x015e, 0x007e, 0x012e, 0x0005, -+ 0x0006, 0x3200, 0x9085, 0x1000, 0x0ca8, 0x0126, 0x2091, 0x2800, -+ 0x2079, 0x19e7, 0x012e, 0x00d6, 0x2069, 0x19e7, 0x6803, 0x0005, -+ 0x0156, 0x0146, 0x01d6, 0x20e9, 0x0000, 0x2069, 0x0200, 0x080c, -+ 0xa690, 0x04a9, 0x080c, 0xa67b, 0x0491, 0x080c, 0xa67e, 0x0479, -+ 0x080c, 0xa681, 0x0461, 0x080c, 0xa684, 0x0449, 0x080c, 0xa687, -+ 0x0431, 0x080c, 0xa68a, 0x0419, 0x080c, 0xa68d, 0x0401, 0x01de, -+ 0x014e, 0x015e, 0x6857, 0x0000, 0x00f6, 0x2079, 0x0380, 0x00f9, -+ 0x7807, 0x0003, 0x7803, 0x0000, 0x7803, 0x0001, 0x2069, 0x0004, -+ 0x2d04, 0x9084, 0xfffe, 0x9085, 0x8000, 0x206a, 0x2069, 0x0100, -+ 0x6828, 0x9084, 0xfffc, 0x682a, 0x00fe, 0x00de, 0x0005, 0x20a9, -+ 0x0020, 0x20a1, 0x0240, 0x2001, 0x0000, 0x4004, 0x0005, 0x00c6, -+ 0x7803, 0x0000, 0x9006, 0x7827, 0x0030, 0x782b, 0x0400, 0x7827, -+ 0x0031, 0x782b, 0x1aef, 0x781f, 0xff00, 0x781b, 0xff00, 0x2061, -+ 0x1ae4, 0x602f, 0x19e7, 0x6033, 0x1800, 0x6037, 0x1a03, 0x603b, -+ 0x1e55, 0x603f, 0x1e65, 0x6042, 0x6047, 0x1aba, 0x00ce, 0x0005, -+ 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x01b0, -+ 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, 0x19e7, 0x602c, -+ 0x8000, 0x602e, 0x601c, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, -+ 0x611e, 0x00ce, 0x0005, 0x6122, 0x611e, 0x0cd8, 0x6146, 0x2c08, -+ 0x2001, 0x0012, 0x080c, 0xa887, 0x0005, 0x0016, 0x2009, 0x8020, -+ 0x6146, 0x2c08, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, -+ 0x0001, 0x1128, 0x2001, 0x0019, 0x080c, 0xa887, 0x0088, 0x00c6, -+ 0x2061, 0x19e7, 0x602c, 0x8000, 0x602e, 0x600c, 0x9005, 0x0128, -+ 0x9080, 0x0003, 0x2102, 0x610e, 0x0010, 0x6112, 0x610e, 0x00ce, -+ 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, -+ 0x0001, 0x0198, 0x00c6, 0x6146, 0x600f, 0x0000, 0x2c08, 0x2061, -+ 0x19e7, 0x6044, 0x9005, 0x0130, 0x9080, 0x0003, 0x2102, 0x6146, -+ 0x00ce, 0x0005, 0x614a, 0x6146, 0x0cd8, 0x6146, 0x600f, 0x0000, -+ 0x2c08, 0x2001, 0x0013, 0x080c, 0xa887, 0x0005, 0x6044, 0xd0dc, -+ 0x0128, 0x9006, 0x7007, 0x0000, 0x700a, 0x7032, 0x0005, 0x00f6, -+ 0x00e6, 0x00d6, 0x00c6, 0x00b6, 0x0096, 0x0076, 0x0066, 0x0056, -+ 0x0036, 0x0026, 0x0016, 0x0006, 0x0126, 0x902e, 0x2071, 0x19e7, -+ 0x7648, 0x2660, 0x2678, 0x2091, 0x8000, 0x8cff, 0x0904, 0x92f0, -+ 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, 0x92eb, 0x87ff, 0x0120, -+ 0x605c, 0x9106, 0x1904, 0x92eb, 0x704c, 0x9c06, 0x1178, 0x0036, -+ 0x2019, 0x0001, 0x080c, 0xa118, 0x703f, 0x0000, 0x9006, 0x704e, -+ 0x706a, 0x7052, 0x706e, 0x003e, 0x2029, 0x0001, 0x080c, 0x926e, -+ 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, 0x9c36, 0x1140, -+ 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, 0x7047, 0x0000, -+ 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, -+ 0x600f, 0x0000, 0x080c, 0xc838, 0x01c8, 0x6014, 0x2048, 0x6020, -+ 0x9086, 0x0003, 0x1560, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, -+ 0x0016, 0x0036, 0x0076, 0x080c, 0xcb36, 0x080c, 0xe621, 0x080c, -+ 0x6d80, 0x007e, 0x003e, 0x001e, 0x080c, 0xca27, 0x080c, 0xac28, -+ 0x00ce, 0x0804, 0x928d, 0x2c78, 0x600c, 0x2060, 0x0804, 0x928d, -+ 0x012e, 0x000e, 0x001e, 0x002e, 0x003e, 0x005e, 0x006e, 0x007e, -+ 0x009e, 0x00be, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, 0x6020, -+ 0x9086, 0x0006, 0x1158, 0x0016, 0x0036, 0x0076, 0x080c, 0xe621, -+ 0x080c, 0xe26c, 0x007e, 0x003e, 0x001e, 0x08c0, 0x6020, 0x9086, -+ 0x0009, 0x1168, 0xa87b, 0x0006, 0x0016, 0x0036, 0x0076, 0x080c, -+ 0x6d80, 0x080c, 0xabed, 0x007e, 0x003e, 0x001e, 0x0848, 0x6020, -+ 0x9086, 0x000a, 0x0904, 0x92d5, 0x0804, 0x92d3, 0x0006, 0x0066, -+ 0x0096, 0x00c6, 0x00d6, 0x00f6, 0x9036, 0x0126, 0x2091, 0x8000, -+ 0x2079, 0x19e7, 0x7848, 0x9065, 0x0904, 0x9385, 0x600c, 0x0006, -+ 0x600f, 0x0000, 0x784c, 0x9c06, 0x11a0, 0x0036, 0x2019, 0x0001, -+ 0x080c, 0xa118, 0x783f, 0x0000, 0x901e, 0x7b4e, 0x7b6a, 0x7b52, -+ 0x7b6e, 0x003e, 0x000e, 0x9005, 0x1118, 0x600c, 0x600f, 0x0000, -+ 0x0006, 0x00e6, 0x2f70, 0x080c, 0x926e, 0x00ee, 0x080c, 0xc838, -+ 0x0520, 0x6014, 0x2048, 0x6020, 0x9086, 0x0003, 0x1580, 0x3e08, -+ 0x918e, 0x0002, 0x1188, 0x6010, 0x9005, 0x0170, 0x00b6, 0x2058, -+ 0xb800, 0x00be, 0xd0bc, 0x0140, 0x6048, 0x9005, 0x1198, 0x2001, -+ 0x1988, 0x2004, 0x604a, 0x0070, 0xa867, 0x0103, 0xab7a, 0xa877, -+ 0x0000, 0x080c, 0x6d74, 0x080c, 0xca27, 0x6044, 0xc0fc, 0x6046, -+ 0x080c, 0xac28, 0x000e, 0x0804, 0x9333, 0x7e4a, 0x7e46, 0x012e, -+ 0x00fe, 0x00de, 0x00ce, 0x009e, 0x006e, 0x000e, 0x0005, 0x6020, -+ 0x9086, 0x0006, 0x1118, 0x080c, 0xe26c, 0x0c38, 0x6020, 0x9086, -+ 0x0009, 0x1130, 0xab7a, 0x080c, 0x6d80, 0x080c, 0xabed, 0x0c10, -+ 0x6020, 0x9086, 0x000a, 0x0990, 0x0878, 0x0016, 0x0026, 0x0086, -+ 0x9046, 0x00a9, 0x080c, 0x9496, 0x008e, 0x002e, 0x001e, 0x0005, -+ 0x00f6, 0x0126, 0x2079, 0x19e7, 0x2091, 0x8000, 0x080c, 0x94df, -+ 0x080c, 0x9573, 0x080c, 0x67b2, 0x012e, 0x00fe, 0x0005, 0x00b6, -+ 0x0096, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0016, 0x0006, -+ 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, 0x7620, 0x2660, 0x2678, -+ 0x8cff, 0x0904, 0x945b, 0x6010, 0x2058, 0xb8a0, 0x9206, 0x1904, -+ 0x9456, 0x88ff, 0x0120, 0x605c, 0x9106, 0x1904, 0x9456, 0x7030, -+ 0x9c06, 0x1570, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, 0x080c, -+ 0x86f6, 0x080c, 0x9e32, 0x68c3, 0x0000, 0x080c, 0xa338, 0x7033, -+ 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, -+ 0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x2069, -+ 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x0040, -+ 0x7008, 0xc0ad, 0x700a, 0x6003, 0x0009, 0x630a, 0x0804, 0x9456, -+ 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, -+ 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, -+ 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, -+ 0x600f, 0x0000, 0x6044, 0xc0fc, 0x6046, 0x6014, 0x2048, 0x080c, -+ 0xc838, 0x01e8, 0x6020, 0x9086, 0x0003, 0x1580, 0x080c, 0xca4d, -+ 0x1118, 0x080c, 0xb5b5, 0x0098, 0xa867, 0x0103, 0xab7a, 0xa877, -+ 0x0000, 0x0016, 0x0036, 0x0086, 0x080c, 0xcb36, 0x080c, 0xe621, -+ 0x080c, 0x6d80, 0x008e, 0x003e, 0x001e, 0x080c, 0xca27, 0x080c, -+ 0xac28, 0x080c, 0xa20e, 0x00ce, 0x0804, 0x93d0, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0x93d0, 0x012e, 0x000e, 0x001e, 0x006e, 0x00ce, -+ 0x00de, 0x00ee, 0x00fe, 0x009e, 0x00be, 0x0005, 0x6020, 0x9086, -+ 0x0006, 0x1158, 0x0016, 0x0036, 0x0086, 0x080c, 0xe621, 0x080c, -+ 0xe26c, 0x008e, 0x003e, 0x001e, 0x08d0, 0x080c, 0xb5b5, 0x6020, -+ 0x9086, 0x0002, 0x1160, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, -+ 0x0904, 0x943c, 0x9086, 0x008b, 0x0904, 0x943c, 0x0840, 0x6020, -+ 0x9086, 0x0005, 0x1920, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, -+ 0x09c8, 0x9086, 0x008b, 0x09b0, 0x0804, 0x944f, 0x0006, 0x00f6, -+ 0x00e6, 0x0096, 0x00b6, 0x00c6, 0x0066, 0x0016, 0x0126, 0x2091, -+ 0x8000, 0x9280, 0x1000, 0x2004, 0x905d, 0x2079, 0x19e7, 0x9036, -+ 0x7828, 0x2060, 0x8cff, 0x0538, 0x6010, 0x9b06, 0x1500, 0x6043, -+ 0xffff, 0x080c, 0xaa75, 0x01d8, 0x610c, 0x0016, 0x080c, 0x9fa2, -+ 0x6014, 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x0016, -+ 0x0036, 0x0086, 0x080c, 0xcb36, 0x080c, 0xe621, 0x080c, 0x6d80, -+ 0x008e, 0x003e, 0x001e, 0x080c, 0xac28, 0x00ce, 0x08d8, 0x2c30, -+ 0x600c, 0x2060, 0x08b8, 0x080c, 0x67cf, 0x012e, 0x001e, 0x006e, -+ 0x00ce, 0x00be, 0x009e, 0x00ee, 0x00fe, 0x000e, 0x0005, 0x0096, -+ 0x0006, 0x0066, 0x00c6, 0x00d6, 0x9036, 0x7820, 0x9065, 0x0904, -+ 0x9546, 0x600c, 0x0006, 0x6044, 0xc0fc, 0x6046, 0x600f, 0x0000, -+ 0x7830, 0x9c06, 0x1588, 0x2069, 0x0100, 0x6820, 0xd0a4, 0x1508, -+ 0x080c, 0x86f6, 0x080c, 0x9e32, 0x68c3, 0x0000, 0x080c, 0xa338, -+ 0x7833, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, -+ 0x0138, 0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, -+ 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, -+ 0x0058, 0x080c, 0x6a03, 0x1538, 0x6003, 0x0009, 0x630a, 0x7808, -+ 0xc0ad, 0x780a, 0x2c30, 0x00f8, 0x6014, 0x2048, 0x080c, 0xc836, -+ 0x01b0, 0x6020, 0x9086, 0x0003, 0x1508, 0x080c, 0xca4d, 0x1118, -+ 0x080c, 0xb5b5, 0x0060, 0x080c, 0x6a03, 0x1168, 0xa867, 0x0103, -+ 0xab7a, 0xa877, 0x0000, 0x080c, 0x6d80, 0x080c, 0xca27, 0x080c, -+ 0xac28, 0x080c, 0xa20e, 0x000e, 0x0804, 0x94e6, 0x7e22, 0x7e1e, -+ 0x00de, 0x00ce, 0x006e, 0x000e, 0x009e, 0x0005, 0x6020, 0x9086, -+ 0x0006, 0x1118, 0x080c, 0xe26c, 0x0c50, 0x080c, 0xb5b5, 0x6020, -+ 0x9086, 0x0002, 0x1150, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, -+ 0x0990, 0x9086, 0x008b, 0x0978, 0x08d0, 0x6020, 0x9086, 0x0005, -+ 0x19b0, 0x6004, 0x0006, 0x9086, 0x0085, 0x000e, 0x0d18, 0x9086, -+ 0x008b, 0x0d00, 0x0860, 0x0006, 0x0096, 0x00b6, 0x00c6, 0x0066, -+ 0x9036, 0x7828, 0x9065, 0x0510, 0x6010, 0x2058, 0x600c, 0x0006, -+ 0x3e08, 0x918e, 0x0002, 0x1118, 0xb800, 0xd0bc, 0x11a8, 0x6043, -+ 0xffff, 0x080c, 0xaa75, 0x0180, 0x610c, 0x080c, 0x9fa2, 0x6014, -+ 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0x6d80, -+ 0x080c, 0xac28, 0x000e, 0x08f0, 0x2c30, 0x0ce0, 0x006e, 0x00ce, -+ 0x00be, 0x009e, 0x000e, 0x0005, 0x00e6, 0x00d6, 0x0096, 0x0066, -+ 0x080c, 0x613b, 0x11b0, 0x2071, 0x19e7, 0x7030, 0x9080, 0x0005, -+ 0x2004, 0x904d, 0x0170, 0xa878, 0x9606, 0x1158, 0x2071, 0x19e7, -+ 0x7030, 0x9035, 0x0130, 0x9080, 0x0005, 0x2004, 0x9906, 0x1108, -+ 0x0029, 0x006e, 0x009e, 0x00de, 0x00ee, 0x0005, 0x00c6, 0x2660, -+ 0x6043, 0xffff, 0x080c, 0xaa75, 0x0178, 0x080c, 0x9fa2, 0x6014, -+ 0x2048, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, 0x080c, 0xcb36, -+ 0x080c, 0x6d80, 0x080c, 0xac28, 0x00ce, 0x0005, 0x00b6, 0x00e6, -+ 0x00c6, 0x080c, 0xa8f4, 0x0106, 0x190c, 0xa896, 0x2071, 0x0101, -+ 0x2e04, 0xc0c4, 0x2072, 0x6044, 0xd0fc, 0x1138, 0x010e, 0x190c, -+ 0xa8b2, 0x00ce, 0x00ee, 0x00be, 0x0005, 0x2071, 0x19e7, 0x7030, -+ 0x9005, 0x0da0, 0x9c06, 0x190c, 0x0d7d, 0x7036, 0x080c, 0x86f6, -+ 0x7004, 0x9084, 0x0007, 0x0002, 0x960e, 0x9610, 0x9617, 0x9621, -+ 0x962f, 0x960e, 0x9617, 0x960c, 0x080c, 0x0d7d, 0x0428, 0x0005, -+ 0x080c, 0xaa60, 0x7007, 0x0000, 0x7033, 0x0000, 0x00e8, 0x0066, -+ 0x9036, 0x080c, 0x9fa2, 0x006e, 0x7007, 0x0000, 0x7033, 0x0000, -+ 0x0098, 0x080c, 0xaa4b, 0x0140, 0x080c, 0xaa60, 0x0128, 0x0066, -+ 0x9036, 0x080c, 0x9fa2, 0x006e, 0x7033, 0x0000, 0x0028, 0x080c, -+ 0xaa4b, 0x080c, 0xa338, 0x0000, 0x010e, 0x190c, 0xa8b2, 0x00ce, -+ 0x00ee, 0x00be, 0x0005, 0x00d6, 0x00c6, 0x080c, 0xa8f4, 0x0106, -+ 0x190c, 0xa896, 0x6044, 0xd0fc, 0x1130, 0x010e, 0x190c, 0xa8b2, -+ 0x00ce, 0x00de, 0x0005, 0x2069, 0x19e7, 0x684c, 0x9005, 0x0da8, -+ 0x9c06, 0x190c, 0x0d7d, 0x6852, 0x00e6, 0x2d70, 0x080c, 0x926e, -+ 0x00ee, 0x080c, 0x8703, 0x0016, 0x2009, 0x0040, 0x080c, 0x21b0, -+ 0x001e, 0x683c, 0x9084, 0x0003, 0x0002, 0x966b, 0x966c, 0x968a, -+ 0x9669, 0x080c, 0x0d7d, 0x0460, 0x6868, 0x9086, 0x0001, 0x0190, -+ 0x600c, 0x9015, 0x0160, 0x6a4a, 0x600f, 0x0000, 0x6044, 0xc0fc, -+ 0x6046, 0x9006, 0x7042, 0x684e, 0x683f, 0x0000, 0x00c8, 0x684a, -+ 0x6846, 0x0ca0, 0x686b, 0x0000, 0x6848, 0x9065, 0x0d78, 0x6003, -+ 0x0002, 0x0c60, 0x9006, 0x686a, 0x6852, 0x686e, 0x600c, 0x9015, -+ 0x0120, 0x6a4a, 0x600f, 0x0000, 0x0018, 0x684e, 0x684a, 0x6846, -+ 0x684f, 0x0000, 0x010e, 0x190c, 0xa8b2, 0x00ce, 0x00de, 0x0005, -+ 0x0005, 0x6020, 0x9084, 0x000f, 0x000b, 0x0005, 0x96b6, 0x96b9, -+ 0x9b27, 0x9bb6, 0x96b9, 0x9b27, 0x9bb6, 0x96b6, 0x96b9, 0x96b6, -+ 0x96b6, 0x96b6, 0x96b6, 0x96b6, 0x96b6, 0x96b6, 0x080c, 0x95de, -+ 0x0005, 0x00b6, 0x0156, 0x0136, 0x0146, 0x01c6, 0x01d6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, 0x6004, -+ 0x908a, 0x0053, 0x1a0c, 0x0d7d, 0x6110, 0x2158, 0xb984, 0x2c78, -+ 0x2061, 0x0100, 0x619a, 0x908a, 0x0040, 0x1a04, 0x9725, 0x005b, -+ 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, -+ 0x015e, 0x00be, 0x0005, 0x98aa, 0x98e5, 0x990e, 0x99b6, 0x99d8, -+ 0x99de, 0x99eb, 0x99f3, 0x99ff, 0x9a05, 0x9a16, 0x9a05, 0x9a6e, -+ 0x99f3, 0x9a7a, 0x9a80, 0x99ff, 0x9a80, 0x9a8c, 0x9723, 0x9723, -+ 0x9723, 0x9723, 0x9723, 0x9723, 0x9723, 0x9723, 0x9723, 0x9723, -+ 0x9723, 0x9fc3, 0x9fe6, 0x9ff7, 0xa017, 0xa049, 0x99eb, 0x9723, -+ 0x99eb, 0x9a05, 0x9723, 0x990e, 0x99b6, 0x9723, 0xa42b, 0x9a05, -+ 0x9723, 0xa447, 0x9a05, 0x9723, 0x99ff, 0x98a4, 0x9746, 0x9723, -+ 0xa463, 0xa4d0, 0xa5b0, 0x9723, 0xa5bd, 0x99e8, 0xa5e8, 0x9723, -+ 0xa053, 0xa5f4, 0x9723, 0x080c, 0x0d7d, 0x2100, 0x005b, 0x00fe, -+ 0x00ee, 0x00de, 0x00ce, 0x01de, 0x01ce, 0x014e, 0x013e, 0x015e, -+ 0x00be, 0x0005, 0xa694, 0xa746, 0x9744, 0x976d, 0x9819, 0x9824, -+ 0x9744, 0x99eb, 0x9744, 0x986b, 0x9877, 0x9788, 0x9744, 0x97a3, -+ 0x97d7, 0xaacb, 0xab10, 0x9a05, 0x080c, 0x0d7d, 0x00d6, 0x0096, -+ 0x080c, 0x9a9f, 0x7003, 0x2414, 0x7007, 0x0018, 0x700b, 0x0800, -+ 0x7814, 0x2048, 0xa83c, 0x700e, 0xa850, 0x7022, 0xa854, 0x7026, -+ 0x60c3, 0x0018, 0x080c, 0x9e02, 0x009e, 0x00de, 0x0005, 0x7810, -+ 0x00b6, 0x2058, 0xb8a0, 0x00be, 0x080c, 0xab57, 0x1118, 0x9084, -+ 0xff80, 0x0110, 0x9085, 0x0001, 0x0005, 0x00d6, 0x0096, 0x080c, -+ 0x9a9f, 0x7003, 0x0500, 0x7814, 0x2048, 0xa874, 0x700a, 0xa878, -+ 0x700e, 0xa87c, 0x7012, 0xa880, 0x7016, 0xa884, 0x701a, 0xa888, -+ 0x701e, 0x60c3, 0x0010, 0x080c, 0x9e02, 0x009e, 0x00de, 0x0005, -+ 0x00d6, 0x0096, 0x080c, 0x9a9f, 0x7003, 0x0500, 0x7814, 0x2048, -+ 0xa8cc, 0x700a, 0xa8d0, 0x700e, 0xa8d4, 0x7012, 0xa8d8, 0x7016, -+ 0xa8dc, 0x701a, 0xa8e0, 0x701e, 0x60c3, 0x0010, 0x080c, 0x9e02, -+ 0x009e, 0x00de, 0x0005, 0x00d6, 0x0096, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x9a9f, 0x20e9, 0x0000, 0x2001, 0x19a3, 0x2003, 0x0000, -+ 0x7814, 0x2048, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, -+ 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a3, 0x0016, -+ 0x200c, 0x2001, 0x0001, 0x080c, 0x2195, 0x080c, 0xd5b1, 0x9006, -+ 0x080c, 0x2195, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c28, -+ 0x04d9, 0x080c, 0x9e02, 0x012e, 0x009e, 0x00de, 0x0005, 0x00d6, -+ 0x0096, 0x0126, 0x2091, 0x8000, 0x080c, 0x9aea, 0x20e9, 0x0000, -+ 0x2001, 0x19a3, 0x2003, 0x0000, 0x7814, 0x2048, 0xa86f, 0x0200, -+ 0xa873, 0x0000, 0xa814, 0x8003, 0x60c2, 0xa830, 0x20a8, 0xa860, -+ 0x20e0, 0xa85c, 0x9080, 0x001b, 0x2098, 0x2001, 0x19a3, 0x0016, -+ 0x200c, 0x080c, 0xd5b1, 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, -+ 0x0c60, 0x0051, 0x7814, 0x2048, 0x080c, 0x0fec, 0x080c, 0x9e02, -+ 0x012e, 0x009e, 0x00de, 0x0005, 0x60c0, 0x8004, 0x9084, 0x0003, -+ 0x9005, 0x0130, 0x9082, 0x0004, 0x20a3, 0x0000, 0x8000, 0x1de0, -+ 0x0005, 0x080c, 0x9a9f, 0x7003, 0x7800, 0x7808, 0x8007, 0x700a, -+ 0x60c3, 0x0008, 0x0804, 0x9e02, 0x00d6, 0x00e6, 0x080c, 0x9aea, -+ 0x7814, 0x9084, 0xff00, 0x2073, 0x0200, 0x8e70, 0x8e70, 0x9095, -+ 0x0010, 0x2272, 0x8e70, 0x2073, 0x0034, 0x8e70, 0x2069, 0x1805, -+ 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x983a, 0x2069, -+ 0x1801, 0x20a9, 0x0004, 0x2d76, 0x8d68, 0x8e70, 0x1f04, 0x9843, -+ 0x2069, 0x19b3, 0x9086, 0xdf00, 0x0110, 0x2069, 0x19cd, 0x20a9, -+ 0x001a, 0x9e86, 0x0260, 0x1148, 0x00c6, 0x2061, 0x0200, 0x6010, -+ 0x8000, 0x6012, 0x00ce, 0x2071, 0x0240, 0x2d04, 0x8007, 0x2072, -+ 0x8d68, 0x8e70, 0x1f04, 0x9851, 0x60c3, 0x004c, 0x080c, 0x9e02, -+ 0x00ee, 0x00de, 0x0005, 0x080c, 0x9a9f, 0x7003, 0x6300, 0x7007, -+ 0x0028, 0x7808, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9e02, 0x00d6, -+ 0x0026, 0x0016, 0x080c, 0x9aea, 0x7003, 0x0200, 0x7814, 0x700e, -+ 0x00e6, 0x9ef0, 0x0004, 0x2009, 0x0001, 0x2011, 0x000c, 0x2069, -+ 0x1923, 0x6810, 0xd084, 0x1148, 0x2073, 0x0500, 0x8e70, 0x2073, -+ 0x0000, 0x8e70, 0x8108, 0x9290, 0x0004, 0x2073, 0x0800, 0x8e70, -+ 0x2073, 0x0000, 0x00ee, 0x7206, 0x710a, 0x62c2, 0x080c, 0x9e02, -+ 0x001e, 0x002e, 0x00de, 0x0005, 0x2001, 0x1818, 0x2004, 0x609a, -+ 0x0804, 0x9e02, 0x080c, 0x9a9f, 0x7003, 0x5200, 0x2069, 0x1847, -+ 0x6804, 0xd084, 0x0130, 0x6828, 0x0016, 0x080c, 0x262e, 0x710e, -+ 0x001e, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, -+ 0x0000, 0x20a1, 0x0250, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, -+ 0x20a1, 0x0254, 0x4003, 0x080c, 0xab57, 0x1120, 0xb8a0, 0x9082, -+ 0x007f, 0x0248, 0x2001, 0x181f, 0x2004, 0x7032, 0x2001, 0x1820, -+ 0x2004, 0x7036, 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, -+ 0x7036, 0x60c3, 0x001c, 0x0804, 0x9e02, 0x080c, 0x9a9f, 0x7003, -+ 0x0500, 0x080c, 0xab57, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, -+ 0x2001, 0x181f, 0x2004, 0x700a, 0x2001, 0x1820, 0x2004, 0x700e, -+ 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x700e, 0x20a9, -+ 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, -+ 0x0250, 0x4003, 0x60c3, 0x0010, 0x0804, 0x9e02, 0x080c, 0x9a9f, -+ 0x9006, 0x080c, 0x6a35, 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, 0x997d, 0x00d6, 0x2069, 0x196c, -+ 0x2001, 0x1837, 0x2004, 0xd0a4, 0x0188, 0x6800, 0x700a, 0x6808, -+ 0x9084, 0x2000, 0x7012, 0x080c, 0xab6e, 0x680c, 0x7016, 0x701f, -+ 0x2710, 0x6818, 0x7022, 0x681c, 0x7026, 0x0090, 0x6800, 0x700a, -+ 0x6804, 0x700e, 0x6808, 0x080c, 0x74e9, 0x1118, 0x9084, 0x37ff, -+ 0x0010, 0x9084, 0x3fff, 0x7012, 0x080c, 0xab6e, 0x680c, 0x7016, -+ 0x00de, 0x20a9, 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, -+ 0x0000, 0x20a1, 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, -+ 0x20a1, 0x025a, 0x4003, 0x00d6, 0x080c, 0xa67b, 0x2069, 0x1974, -+ 0x2071, 0x024e, 0x6800, 0xc0dd, 0x7002, 0x080c, 0x56de, 0xd0e4, -+ 0x0110, 0x680c, 0x700e, 0x00de, 0x04a8, 0x2001, 0x1837, 0x2004, -+ 0xd0a4, 0x0170, 0x0016, 0x2001, 0x196d, 0x200c, 0x60e0, 0x9106, -+ 0x0130, 0x2100, 0x60e3, 0x0000, 0x080c, 0x266f, 0x61e2, 0x001e, -+ 0x20e1, 0x0001, 0x2099, 0x196c, 0x20e9, 0x0000, 0x20a1, 0x024e, -+ 0x20a9, 0x0008, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1805, 0x20a1, -+ 0x0256, 0x4003, 0x20a9, 0x0004, 0x2099, 0x1801, 0x20a1, 0x025a, -+ 0x4003, 0x080c, 0xa67b, 0x20a1, 0x024e, 0x20a9, 0x0008, 0x2099, -+ 0x1974, 0x4003, 0x60c3, 0x0074, 0x0804, 0x9e02, 0x080c, 0x9a9f, -+ 0x7003, 0x2010, 0x7007, 0x0014, 0x700b, 0x0800, 0x700f, 0x2000, -+ 0x9006, 0x00f6, 0x2079, 0x1847, 0x7904, 0x00fe, 0xd1ac, 0x1110, -+ 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, 0x9085, 0x0002, -+ 0x00d6, 0x0804, 0x9a4f, 0x7026, 0x60c3, 0x0014, 0x0804, 0x9e02, -+ 0x080c, 0x9a9f, 0x7003, 0x5000, 0x0804, 0x9928, 0x080c, 0x9a9f, -+ 0x7003, 0x2110, 0x7007, 0x0014, 0x60c3, 0x0014, 0x0804, 0x9e02, -+ 0x080c, 0x9ae1, 0x0010, 0x080c, 0x9aea, 0x7003, 0x0200, 0x60c3, -+ 0x0004, 0x0804, 0x9e02, 0x080c, 0x9aea, 0x7003, 0x0100, 0x700b, -+ 0x0003, 0x700f, 0x2a00, 0x60c3, 0x0008, 0x0804, 0x9e02, 0x080c, -+ 0x9aea, 0x7003, 0x0200, 0x0804, 0x9928, 0x080c, 0x9aea, 0x7003, -+ 0x0100, 0x782c, 0x9005, 0x0110, 0x700a, 0x0010, 0x700b, 0x0003, -+ 0x7814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9e02, 0x00d6, 0x080c, -+ 0x9aea, 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, 0x1847, 0x7904, 0x00fe, -+ 0xd1ac, 0x1110, 0x9085, 0x0020, 0xd1a4, 0x0110, 0x9085, 0x0010, -+ 0x2009, 0x1869, 0x210c, 0xd184, 0x1110, 0x9085, 0x0002, 0x0026, -+ 0x2009, 0x1867, 0x210c, 0xd1e4, 0x0150, 0xc0c5, 0xbad4, 0xd28c, -+ 0x1108, 0xc0cd, 0x9094, 0x0030, 0x9296, 0x0010, 0x0140, 0xd1ec, -+ 0x0130, 0x9094, 0x0030, 0x9296, 0x0010, 0x0108, 0xc0bd, 0x002e, -+ 0x7026, 0x60c3, 0x0014, 0x00de, 0x0804, 0x9e02, 0x080c, 0x9aea, -+ 0x7003, 0x0210, 0x7007, 0x0014, 0x700f, 0x0100, 0x60c3, 0x0014, -+ 0x0804, 0x9e02, 0x080c, 0x9aea, 0x7003, 0x0200, 0x0804, 0x98ae, -+ 0x080c, 0x9aea, 0x7003, 0x0100, 0x700b, 0x0003, 0x700f, 0x2a00, -+ 0x60c3, 0x0008, 0x0804, 0x9e02, 0x080c, 0x9aea, 0x7003, 0x0100, -+ 0x700b, 0x000b, 0x60c3, 0x0008, 0x0804, 0x9e02, 0x0026, 0x00d6, -+ 0x0036, 0x0046, 0x2019, 0x3200, 0x2021, 0x0800, 0x0040, 0x0026, -+ 0x00d6, 0x0036, 0x0046, 0x2019, 0x2200, 0x2021, 0x0100, 0x080c, -+ 0xa690, 0xb810, 0x9305, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, -+ 0x687c, 0x700a, 0x6880, 0x700e, 0x9485, 0x0029, 0x7012, 0x004e, -+ 0x003e, 0x00de, 0x080c, 0x9df6, 0x721a, 0x9f95, 0x0000, 0x7222, -+ 0x7027, 0xffff, 0x2071, 0x024c, 0x002e, 0x0005, 0x0026, 0x080c, -+ 0xa690, 0x7003, 0x02ff, 0x7007, 0xfffc, 0x00d6, 0x2069, 0x1800, -+ 0x687c, 0x700a, 0x6880, 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, 0xa690, 0xb810, 0x9305, 0x7002, 0xb814, -+ 0x7006, 0x2069, 0x1800, 0xb810, 0x9005, 0x1140, 0xb814, 0x9005, -+ 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, 0x0020, 0x687c, 0x700a, -+ 0x6880, 0x700e, 0x0000, 0x9485, 0x0098, 0x7012, 0x004e, 0x003e, -+ 0x00de, 0x080c, 0x9df6, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, -+ 0x2071, 0x024c, 0x002e, 0x0005, 0x080c, 0x9df6, 0x721a, 0x7a08, -+ 0x7222, 0x7814, 0x7026, 0x2071, 0x024c, 0x002e, 0x0005, 0x00b6, -+ 0x00c6, 0x00d6, 0x00e6, 0x00f6, 0x2069, 0x0200, 0x2071, 0x0240, -+ 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7d, 0x908a, 0x0092, 0x1a0c, -+ 0x0d7d, 0x6110, 0x2158, 0xb984, 0x2c78, 0x2061, 0x0100, 0x619a, -+ 0x9082, 0x0085, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, -+ 0x0005, 0x9b58, 0x9b67, 0x9b72, 0x9b56, 0x9b56, 0x9b56, 0x9b58, -+ 0x9b56, 0x9b56, 0x9b56, 0x9b56, 0x9b56, 0x9b56, 0x080c, 0x0d7d, -+ 0x0411, 0x60c3, 0x0000, 0x0026, 0x080c, 0x2979, 0x0228, 0x2011, -+ 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x0804, 0x9e02, 0x0431, -+ 0x7808, 0x700a, 0x7814, 0x700e, 0x7017, 0xffff, 0x60c3, 0x000c, -+ 0x0804, 0x9e02, 0x0479, 0x7003, 0x0003, 0x7007, 0x0300, 0x60c3, -+ 0x0004, 0x0804, 0x9e02, 0x0026, 0x080c, 0xa690, 0xb810, 0x9085, -+ 0x8100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, -+ 0x6880, 0x700e, 0x7013, 0x0009, 0x0804, 0x9aba, 0x0026, 0x080c, -+ 0xa690, 0xb810, 0x9085, 0x8400, 0x7002, 0xb814, 0x7006, 0x2069, -+ 0x1800, 0x687c, 0x700a, 0x6880, 0x700e, 0x2001, 0x0099, 0x7012, -+ 0x0804, 0x9b1c, 0x0026, 0x080c, 0xa690, 0xb810, 0x9085, 0x8500, -+ 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x687c, 0x700a, 0x6880, -+ 0x700e, 0x2001, 0x0099, 0x7012, 0x0804, 0x9b1c, 0x00b6, 0x00c6, -+ 0x00d6, 0x00e6, 0x00f6, 0x2c78, 0x2069, 0x0200, 0x2071, 0x0240, -+ 0x7804, 0x908a, 0x0040, 0x0a0c, 0x0d7d, 0x908a, 0x0057, 0x1a0c, -+ 0x0d7d, 0x7910, 0x2158, 0xb984, 0x2061, 0x0100, 0x619a, 0x9082, -+ 0x0040, 0x0033, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x00be, 0x0005, -+ 0x9beb, 0x9beb, 0x9beb, 0x9c11, 0x9beb, 0x9beb, 0x9beb, 0x9beb, -+ 0x9beb, 0x9beb, 0x9beb, 0xa1eb, 0xa1f3, 0xa1fb, 0xa203, 0x9beb, -+ 0x9beb, 0x9beb, 0xa1e3, 0x080c, 0x0d7d, 0x6813, 0x0008, 0xba8c, -+ 0x8210, 0xb8d4, 0xd084, 0x0128, 0x7a4e, 0x7b14, 0x7b52, 0x722e, -+ 0x732a, 0x9294, 0x00ff, 0xba8e, 0x8217, 0x721a, 0xba10, 0x9295, -+ 0x0600, 0x7202, 0xba14, 0x7206, 0x2069, 0x1800, 0x6a7c, 0x720a, -+ 0x6a80, 0x720e, 0x7013, 0x0829, 0x2f10, 0x7222, 0x7027, 0xffff, -+ 0x0005, 0x0016, 0x7814, 0x9084, 0x0700, 0x8007, 0x0013, 0x001e, -+ 0x0005, 0x9c21, 0x9c21, 0x9c23, 0x9c21, 0x9c21, 0x9c21, 0x9c3d, -+ 0x9c21, 0x080c, 0x0d7d, 0x7914, 0x918c, 0x08ff, 0x918d, 0xf600, -+ 0x7916, 0x2009, 0x0003, 0x00b9, 0x2069, 0x1847, 0x6804, 0xd0bc, -+ 0x0130, 0x682c, 0x9084, 0x00ff, 0x8007, 0x7032, 0x0010, 0x7033, -+ 0x3f00, 0x60c3, 0x0001, 0x0804, 0x9e02, 0x2009, 0x0003, 0x0019, -+ 0x7033, 0x7f00, 0x0cb0, 0x0016, 0x080c, 0xa690, 0x001e, 0xb810, -+ 0x9085, 0x0100, 0x7002, 0xb814, 0x7006, 0x2069, 0x1800, 0x6a7c, -+ 0x720a, 0x6a80, 0x720e, 0x7013, 0x0888, 0x918d, 0x0008, 0x7116, -+ 0x080c, 0x9df6, 0x721a, 0x7a08, 0x7222, 0x2f10, 0x7226, 0x0005, -+ 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0056, 0x0046, 0x0036, -+ 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, 0x7810, 0x2058, 0x76dc, -+ 0x96b4, 0x0028, 0x0110, 0x737c, 0x7480, 0x2500, 0x76dc, 0x96b4, -+ 0x0028, 0x0140, 0x2001, 0x04ff, 0x6062, 0x6067, 0xffff, 0x636a, -+ 0x646e, 0x0050, 0x2001, 0x00ff, 0x9085, 0x0400, 0x6062, 0x6067, -+ 0xffff, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6073, 0x0530, 0x6077, -+ 0x0008, 0xb88c, 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, -+ 0x0020, 0x607a, 0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, -+ 0x7814, 0x0096, 0x2048, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, -+ 0x60c6, 0xa834, 0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, -+ 0x60af, 0x95d5, 0x60d7, 0x0000, 0x2001, 0x1837, 0x2004, 0x9084, -+ 0x0028, 0x0128, 0x609f, 0x0000, 0x2001, 0x0092, 0x0058, 0x6028, -+ 0xc0bd, 0x602a, 0x609f, 0x00ff, 0x2011, 0xffff, 0x080c, 0x2a44, -+ 0x2001, 0x00b2, 0x2010, 0x900e, 0x080c, 0x2a53, 0x2009, 0x07d0, -+ 0x080c, 0x86fb, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, 0x00de, -+ 0x00ee, 0x00be, 0x0005, 0x00b6, 0x00e6, 0x00d6, 0x00c6, 0x0066, -+ 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, 0x7160, -+ 0x7810, 0x2058, 0xb8a0, 0x2028, 0x76dc, 0xd6ac, 0x1168, 0x9582, -+ 0x007e, 0x1250, 0x2500, 0x9094, 0xff80, 0x1130, 0x9080, 0x3374, -+ 0x2015, 0x9294, 0x00ff, 0x0020, 0xb910, 0xba14, 0x737c, 0x7480, -+ 0x70dc, 0xd0ac, 0x1130, 0x9582, 0x007e, 0x1218, 0x9584, 0xff80, -+ 0x0138, 0x9185, 0x0400, 0x6062, 0x6266, 0x636a, 0x646e, 0x0030, -+ 0x6063, 0x0400, 0x6266, 0x606b, 0x0000, 0x616e, 0xb8b8, 0x6072, -+ 0x6077, 0x0000, 0xb864, 0xd0a4, 0x0110, 0x6077, 0x0008, 0xb88c, -+ 0x8000, 0x9084, 0x00ff, 0xb88e, 0x8007, 0x9085, 0x0020, 0x607a, -+ 0x607f, 0x0000, 0x2b00, 0x6082, 0x6087, 0xffff, 0x7814, 0x0096, -+ 0x2048, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, 0xa834, -+ 0x60ca, 0x009e, 0xb86c, 0x60ce, 0x60ab, 0x0036, 0x60af, 0x95d5, -+ 0x60d7, 0x0000, 0xba84, 0x629e, 0x00f6, 0x2079, 0x0140, 0x7803, -+ 0x0000, 0x00fe, 0x900e, 0x2011, 0x0092, 0x080c, 0x2a53, 0x2009, -+ 0x07d0, 0x080c, 0x86fb, 0x003e, 0x004e, 0x005e, 0x006e, 0x00ce, -+ 0x00de, 0x00ee, 0x00be, 0x0005, 0x00b6, 0x0096, 0x00e6, 0x00d6, -+ 0x00c6, 0x0056, 0x0046, 0x0036, 0x2061, 0x0100, 0x2071, 0x1800, -+ 0x7810, 0x2058, 0xb8a0, 0x2028, 0xb910, 0xba14, 0x737c, 0x7480, -+ 0x7820, 0x0002, 0x9d81, 0x9d81, 0x9d81, 0x9d81, 0x9d81, 0x9d81, -+ 0x9d81, 0x9d81, 0x9d81, 0x9d81, 0x9d83, 0x9d81, 0x9d81, 0x9d81, -+ 0x9d81, 0x080c, 0x0d7d, 0xb884, 0x609e, 0x7814, 0x2048, 0xa87c, -+ 0xd0fc, 0x0558, 0xaf90, 0x9784, 0xff00, 0x9105, 0x6062, 0x873f, -+ 0x9784, 0xff00, 0x0006, 0x7814, 0x2048, 0xa878, 0xc0fc, 0x9005, -+ 0x000e, 0x1160, 0xaf94, 0x87ff, 0x0198, 0x2039, 0x0098, 0x9705, -+ 0x6072, 0x7808, 0x6082, 0x2f00, 0x6086, 0x0038, 0x9185, 0x2200, -+ 0x6062, 0x6073, 0x0129, 0x6077, 0x0000, 0xb884, 0x609e, 0x0050, -+ 0x2039, 0x0029, 0x9705, 0x6072, 0x0cc0, 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, 0xa848, 0x608a, 0xa844, 0x608e, 0xa838, 0x60c6, -+ 0xa834, 0x60ca, 0xb86c, 0x60ce, 0x60af, 0x95d5, 0x60d7, 0x0000, -+ 0x080c, 0xa670, 0x2009, 0x07d0, 0x60c4, 0x9084, 0xfff0, 0x9005, -+ 0x0110, 0x2009, 0x1b58, 0x080c, 0x86fb, 0x003e, 0x004e, 0x005e, -+ 0x00ce, 0x00de, 0x00ee, 0x009e, 0x00be, 0x0005, 0x7a40, 0x9294, -+ 0x00ff, 0x8217, 0x0005, 0x00d6, 0x2069, 0x19e7, 0x686b, 0x0001, -+ 0x00de, 0x0005, 0x60a3, 0x0056, 0x60a7, 0x9575, 0x00f1, 0x080c, -+ 0x86ed, 0x0005, 0x0016, 0x2001, 0x180c, 0x200c, 0x9184, 0x0600, -+ 0x9086, 0x0600, 0x0128, 0x0089, 0x080c, 0x86ed, 0x001e, 0x0005, -+ 0xc1e5, 0x2001, 0x180c, 0x2102, 0x2001, 0x19e8, 0x2003, 0x0000, -+ 0x2001, 0x19f3, 0x2003, 0x0000, 0x0c88, 0x0006, 0x0016, 0x0026, -+ 0x2009, 0x1804, 0x2011, 0x0009, 0x080c, 0x2a53, 0x002e, 0x001e, -+ 0x000e, 0x0005, 0x0016, 0x00c6, 0x0006, 0x080c, 0xa8f4, 0x0106, -+ 0x190c, 0xa896, 0x2061, 0x0100, 0x61a4, 0x60a7, 0x95f5, 0x0016, -+ 0x0026, 0x2009, 0x1804, 0x2011, 0x0008, 0x080c, 0x2a53, 0x002e, -+ 0x001e, 0x010e, 0x190c, 0xa8b2, 0x000e, 0xa001, 0xa001, 0xa001, -+ 0x61a6, 0x00ce, 0x001e, 0x0005, 0x00c6, 0x00d6, 0x0016, 0x0026, -+ 0x2061, 0x0100, 0x2069, 0x0140, 0x080c, 0x74e9, 0x1510, 0x2001, -+ 0x1a0c, 0x2004, 0x9005, 0x1904, 0x9eb3, 0x080c, 0x758a, 0x11a8, -+ 0x2069, 0x0380, 0x6843, 0x0101, 0x6844, 0xd084, 0x1de8, 0x2061, -+ 0x0100, 0x6020, 0xd0b4, 0x1120, 0x6024, 0xd084, 0x090c, 0x0d7d, -+ 0x6843, 0x0100, 0x080c, 0x86ed, 0x04b0, 0x00c6, 0x2061, 0x19e7, -+ 0x00f0, 0x6904, 0x9194, 0x4000, 0x0598, 0x080c, 0x9e32, 0x080c, -+ 0x2a1a, 0x00c6, 0x2061, 0x19e7, 0x6134, 0x9192, 0x0008, 0x1278, -+ 0x8108, 0x6136, 0x080c, 0xa896, 0x6130, 0x080c, 0xa8b2, 0x00ce, -+ 0x81ff, 0x01c8, 0x080c, 0x86ed, 0x080c, 0x9e25, 0x00a0, 0x080c, -+ 0xa896, 0x6130, 0x91e5, 0x0000, 0x0150, 0x080c, 0xe717, 0x080c, -+ 0x86f6, 0x6003, 0x0001, 0x2009, 0x0014, 0x080c, 0xac8c, 0x080c, -+ 0xa8b2, 0x00ce, 0x0000, 0x002e, 0x001e, 0x00de, 0x00ce, 0x0005, -+ 0x2001, 0x1a0c, 0x2004, 0x9005, 0x1db0, 0x00c6, 0x2061, 0x19e7, -+ 0x6134, 0x9192, 0x0003, 0x1ad8, 0x8108, 0x6136, 0x00ce, 0x080c, -+ 0x86ed, 0x080c, 0x5ee4, 0x2009, 0x1846, 0x2114, 0x8210, 0x220a, -+ 0x0c10, 0x0096, 0x00c6, 0x00d6, 0x00e6, 0x0016, 0x0026, 0x080c, -+ 0x8703, 0x080c, 0xa896, 0x2001, 0x0387, 0x2003, 0x0202, 0x2071, -+ 0x19e7, 0x714c, 0x81ff, 0x0904, 0x9f5b, 0x2061, 0x0100, 0x2069, -+ 0x0140, 0x080c, 0x74e9, 0x1510, 0x0036, 0x2019, 0x0002, 0x080c, -+ 0xa118, 0x003e, 0x714c, 0x2160, 0x080c, 0xe717, 0x2009, 0x004a, -+ 0x6220, 0x9296, 0x0009, 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, -+ 0x2009, 0x004a, 0x6003, 0x0003, 0x080c, 0xac8c, 0x2001, 0x0386, -+ 0x2003, 0x5040, 0x080c, 0x758a, 0x0804, 0x9f5b, 0x6904, 0xd1f4, -+ 0x0904, 0x9f68, 0x080c, 0x2a1a, 0x00c6, 0x704c, 0x9065, 0x090c, -+ 0x0d7d, 0x6020, 0x00ce, 0x9086, 0x0006, 0x1518, 0x61c8, 0x60c4, -+ 0x9105, 0x11f8, 0x2009, 0x180c, 0x2104, 0xd0d4, 0x01d0, 0x6214, -+ 0x9294, 0x1800, 0x1128, 0x6224, 0x9294, 0x0002, 0x1560, 0x0010, -+ 0xc0d4, 0x200a, 0x6014, 0x9084, 0xe7fd, 0x9085, 0x0010, 0x6016, -+ 0x704c, 0x2060, 0x080c, 0x963b, 0x2009, 0x0049, 0x080c, 0xac8c, -+ 0x00d0, 0x0036, 0x2019, 0x0001, 0x080c, 0xa118, 0x003e, 0x714c, -+ 0x2160, 0x080c, 0xe717, 0x2009, 0x004a, 0x6220, 0x9296, 0x0009, -+ 0x1130, 0x6114, 0x2148, 0xa87b, 0x0006, 0x2009, 0x004a, 0x6003, -+ 0x0003, 0x080c, 0xac8c, 0x2001, 0x0387, 0x2003, 0x0200, 0x080c, -+ 0xa8b2, 0x002e, 0x001e, 0x00ee, 0x00de, 0x00ce, 0x009e, 0x0005, -+ 0xd1ec, 0x1904, 0x9f12, 0x0804, 0x9f14, 0x0026, 0x00e6, 0x2071, -+ 0x19e7, 0x706c, 0xd084, 0x01e8, 0xc084, 0x706e, 0x714c, 0x81ff, -+ 0x01c0, 0x2071, 0x0100, 0x9188, 0x0008, 0x2114, 0x928e, 0x0006, -+ 0x1138, 0x2009, 0x1984, 0x2011, 0x0012, 0x080c, 0x2a53, 0x0048, -+ 0x928e, 0x0009, 0x0db0, 0x2009, 0x1984, 0x2011, 0x0016, 0x080c, -+ 0x2a53, 0x00ee, 0x002e, 0x0005, 0x9036, 0x2001, 0x19f1, 0x2004, -+ 0x9005, 0x0128, 0x9c06, 0x0128, 0x2c30, 0x600c, 0x0cc8, 0x9085, -+ 0x0001, 0x0005, 0x00f6, 0x2079, 0x19e7, 0x610c, 0x9006, 0x600e, -+ 0x6044, 0xc0fc, 0x6046, 0x86ff, 0x1140, 0x7824, 0x9c06, 0x1118, -+ 0x7826, 0x782a, 0x0050, 0x792a, 0x0040, 0x00c6, 0x2660, 0x610e, -+ 0x00ce, 0x7824, 0x9c06, 0x1108, 0x7e26, 0x080c, 0xa20e, 0x080c, -+ 0xca27, 0x00fe, 0x0005, 0x080c, 0x9a9f, 0x7003, 0x1200, 0x7838, -+ 0x7012, 0x783c, 0x7016, 0x00c6, 0x7820, 0x9086, 0x0004, 0x1148, -+ 0x7810, 0x9005, 0x0130, 0x00b6, 0x2058, 0xb810, 0xb914, 0x00be, -+ 0x0020, 0x2061, 0x1800, 0x607c, 0x6180, 0x9084, 0x00ff, 0x700a, -+ 0x710e, 0x00ce, 0x60c3, 0x002c, 0x0804, 0x9e02, 0x080c, 0x9a9f, -+ 0x7003, 0x0f00, 0x7808, 0xd09c, 0x0128, 0xb810, 0x9084, 0x00ff, -+ 0x700a, 0xb814, 0x700e, 0x60c3, 0x0008, 0x0804, 0x9e02, 0x0156, -+ 0x080c, 0x9aea, 0x7003, 0x0200, 0x080c, 0x87bb, 0x20a9, 0x0006, -+ 0x2011, 0xfff4, 0x2019, 0xfff5, 0x9ef0, 0x0002, 0x2305, 0x2072, -+ 0x8e70, 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, -+ 0x1f04, 0xa006, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9e02, 0x0016, -+ 0x0026, 0x080c, 0x9ac6, 0x080c, 0x9ad8, 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, 0x9e02, 0x002e, 0x001e, 0x0005, 0x20a9, -+ 0x0010, 0x4003, 0x080c, 0xa67b, 0x20a1, 0x0240, 0x22a8, 0x4003, -+ 0x0c68, 0x080c, 0x9a9f, 0x7003, 0x6200, 0x7808, 0x700e, 0x60c3, -+ 0x0008, 0x0804, 0x9e02, 0x0016, 0x0026, 0x080c, 0x9a9f, 0x20e9, -+ 0x0000, 0x20a1, 0x024c, 0x7814, 0x0096, 0x2048, 0xa800, 0x2048, -+ 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0023, 0x2098, 0x009e, 0x7808, -+ 0x9088, 0x0002, 0x21a8, 0x4003, 0x8003, 0x60c2, 0x080c, 0x9e02, -+ 0x002e, 0x001e, 0x0005, 0x00e6, 0x00c6, 0x0006, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x19e7, 0x7010, 0x2060, 0x8cff, 0x0188, 0x080c, -+ 0xca4d, 0x1110, 0x080c, 0xb5b5, 0x600c, 0x0006, 0x080c, 0xccc4, -+ 0x600f, 0x0000, 0x080c, 0xabed, 0x080c, 0xa20e, 0x00ce, 0x0c68, -+ 0x2c00, 0x7012, 0x700e, 0x012e, 0x000e, 0x00ce, 0x00ee, 0x0005, -+ 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, -+ 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, -+ 0xe7ff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x19e7, -+ 0x7030, 0x2060, 0x8cff, 0x0548, 0x080c, 0x9e32, 0x6ac0, 0x68c3, -+ 0x0000, 0x080c, 0x86f6, 0x00c6, 0x2061, 0x0100, 0x080c, 0xa7cc, -+ 0x00ce, 0x20a9, 0x01f4, 0x04b1, 0x080c, 0x95de, 0x6044, 0xd0ac, -+ 0x1128, 0x2001, 0x1988, 0x2004, 0x604a, 0x0020, 0x2009, 0x0013, -+ 0x080c, 0xac8c, 0x000e, 0x001e, 0x002e, 0x006e, 0x00ce, 0x00de, -+ 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x2001, 0x1800, 0x2004, -+ 0x9096, 0x0001, 0x0d78, 0x9096, 0x0004, 0x0d60, 0x080c, 0x86f6, -+ 0x6814, 0x9084, 0x0001, 0x0110, 0x68a7, 0x95f5, 0x6817, 0x0008, -+ 0x68c3, 0x0000, 0x2011, 0x5e8e, 0x080c, 0x863e, 0x20a9, 0x01f4, -+ 0x0009, 0x08c0, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, 0x7804, -+ 0x9084, 0x4000, 0x190c, 0x2a1a, 0x0090, 0xd084, 0x0118, 0x6827, -+ 0x0001, 0x0010, 0x1f04, 0xa0fa, 0x7804, 0x9084, 0x1000, 0x0138, -+ 0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x0005, -+ 0x0126, 0x0156, 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0066, 0x0026, -+ 0x0016, 0x0006, 0x2091, 0x8000, 0x2001, 0x180c, 0x200c, 0x918c, -+ 0xdbff, 0x2102, 0x2069, 0x0100, 0x2079, 0x0140, 0x2071, 0x0380, -+ 0x701c, 0x0006, 0x701f, 0x0202, 0x2071, 0x19e7, 0x704c, 0x2060, -+ 0x8cff, 0x0904, 0xa1bd, 0x9386, 0x0002, 0x1128, 0x6814, 0x9084, -+ 0x0002, 0x0904, 0xa1bd, 0x68af, 0x95f5, 0x6817, 0x0010, 0x2009, -+ 0x00fa, 0x8109, 0x1df0, 0x69c6, 0x68cb, 0x0008, 0x080c, 0x8703, -+ 0x080c, 0x1dd8, 0x0046, 0x2009, 0x00a5, 0x080c, 0x0e55, 0x2021, -+ 0x0169, 0x2404, 0x9084, 0x000f, 0x9086, 0x0004, 0x11f8, 0x68af, -+ 0x95f5, 0x68c6, 0x68cb, 0x0008, 0x00e6, 0x00f6, 0x2079, 0x0090, -+ 0x2071, 0x19e7, 0x6814, 0x9084, 0x1984, 0x9085, 0x0012, 0x6816, -+ 0x782b, 0x0008, 0x7057, 0x0000, 0x00fe, 0x00ee, 0x9386, 0x0002, -+ 0x1128, 0x7884, 0x9005, 0x1110, 0x7887, 0x0001, 0x0016, 0x2009, -+ 0x0040, 0x080c, 0x21b0, 0x001e, 0x2009, 0x0000, 0x080c, 0x0e55, -+ 0x004e, 0x20a9, 0x03e8, 0x6824, 0xd094, 0x0140, 0x6827, 0x0004, -+ 0x7804, 0x9084, 0x4000, 0x190c, 0x2a1a, 0x0090, 0xd08c, 0x0118, -+ 0x6827, 0x0002, 0x0010, 0x1f04, 0xa18b, 0x7804, 0x9084, 0x1000, -+ 0x0138, 0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, -+ 0x6827, 0x4000, 0x6824, 0x83ff, 0x1180, 0x2009, 0x0049, 0x6020, -+ 0x9086, 0x0009, 0x0150, 0x080c, 0x963b, 0x6044, 0xd0ac, 0x1118, -+ 0x6003, 0x0002, 0x0010, 0x080c, 0xac8c, 0x000e, 0x2071, 0x0380, -+ 0xd08c, 0x1110, 0x701f, 0x0200, 0x000e, 0x001e, 0x002e, 0x006e, -+ 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x015e, 0x012e, 0x0005, 0x00d6, -+ 0x0126, 0x2091, 0x8000, 0x2069, 0x19e7, 0x6a06, 0x012e, 0x00de, -+ 0x0005, 0x00d6, 0x0126, 0x2091, 0x8000, 0x2069, 0x19e7, 0x6a3e, -+ 0x012e, 0x00de, 0x0005, 0x080c, 0x9bed, 0x785c, 0x7032, 0x7042, -+ 0x7047, 0x1000, 0x00f8, 0x080c, 0x9bed, 0x785c, 0x7032, 0x7042, -+ 0x7047, 0x4000, 0x00b8, 0x080c, 0x9bed, 0x785c, 0x7032, 0x7042, -+ 0x7047, 0x2000, 0x0078, 0x080c, 0x9bed, 0x785c, 0x7032, 0x7042, -+ 0x7047, 0x0400, 0x0038, 0x080c, 0x9bed, 0x785c, 0x7032, 0x7042, -+ 0x7047, 0x0200, 0x60c3, 0x0020, 0x0804, 0x9e02, 0x00e6, 0x2071, -+ 0x19e7, 0x702c, 0x9005, 0x0110, 0x8001, 0x702e, 0x00ee, 0x0005, -+ 0x00f6, 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0006, 0x0126, -+ 0x2091, 0x8000, 0x2071, 0x19e7, 0x7620, 0x2660, 0x2678, 0x2039, -+ 0x0001, 0x87ff, 0x0904, 0xa2b3, 0x8cff, 0x0904, 0xa2b3, 0x6020, -+ 0x9086, 0x0006, 0x1904, 0xa2ae, 0x88ff, 0x0138, 0x2800, 0x9c06, -+ 0x1904, 0xa2ae, 0x2039, 0x0000, 0x0050, 0x6010, 0x9b06, 0x1904, -+ 0xa2ae, 0x85ff, 0x0120, 0x605c, 0x9106, 0x1904, 0xa2ae, 0x7030, -+ 0x9c06, 0x15b0, 0x2069, 0x0100, 0x68c0, 0x9005, 0x1160, 0x6824, -+ 0xd084, 0x0148, 0x6827, 0x0001, 0x080c, 0x86f6, 0x080c, 0xa338, -+ 0x7033, 0x0000, 0x0428, 0x080c, 0x86f6, 0x6820, 0xd0b4, 0x0110, -+ 0x68a7, 0x95f5, 0x6817, 0x0008, 0x68c3, 0x0000, 0x080c, 0xa338, -+ 0x7033, 0x0000, 0x0036, 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, -+ 0x0138, 0x2001, 0x0100, 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, -+ 0x2069, 0x0100, 0x6824, 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, -+ 0x7020, 0x9c36, 0x1110, 0x660c, 0x7622, 0x701c, 0x9c36, 0x1140, -+ 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x701e, 0x0010, 0x701f, 0x0000, -+ 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, -+ 0x89ff, 0x1168, 0x600f, 0x0000, 0x6014, 0x0096, 0x2048, 0x080c, -+ 0xc836, 0x0110, 0x080c, 0xe26c, 0x009e, 0x080c, 0xac28, 0x080c, -+ 0xa20e, 0x88ff, 0x1190, 0x00ce, 0x0804, 0xa229, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0xa229, 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, 0x19e7, -+ 0x7648, 0x2660, 0x2678, 0x8cff, 0x0904, 0xa327, 0x6020, 0x9086, -+ 0x0006, 0x1904, 0xa322, 0x87ff, 0x0128, 0x2700, 0x9c06, 0x1904, -+ 0xa322, 0x0040, 0x6010, 0x9b06, 0x15e8, 0x85ff, 0x0118, 0x605c, -+ 0x9106, 0x15c0, 0x704c, 0x9c06, 0x1168, 0x0036, 0x2019, 0x0001, -+ 0x080c, 0xa118, 0x703f, 0x0000, 0x9006, 0x704e, 0x706a, 0x7052, -+ 0x706e, 0x003e, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, -+ 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, -+ 0x7047, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, 0x0110, 0x7e0e, -+ 0x0008, 0x2678, 0x600f, 0x0000, 0x6014, 0x2048, 0x080c, 0xc836, -+ 0x0110, 0x080c, 0xe26c, 0x080c, 0xac28, 0x87ff, 0x1198, 0x00ce, -+ 0x0804, 0xa2d3, 0x2c78, 0x600c, 0x2060, 0x0804, 0xa2d3, 0x9006, -+ 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x009e, 0x00de, 0x00ee, -+ 0x00fe, 0x0005, 0x601b, 0x0000, 0x00ce, 0x97bd, 0x0001, 0x0c80, -+ 0x00e6, 0x2071, 0x19e7, 0x7033, 0x0000, 0x7004, 0x9086, 0x0003, -+ 0x0158, 0x2001, 0x1800, 0x2004, 0x9086, 0x0002, 0x1118, 0x7007, -+ 0x0005, 0x0010, 0x7007, 0x0000, 0x00ee, 0x0005, 0x00f6, 0x00e6, -+ 0x00c6, 0x0066, 0x0026, 0x0006, 0x0126, 0x2091, 0x8000, 0x2071, -+ 0x19e7, 0x2c10, 0x7648, 0x2660, 0x2678, 0x8cff, 0x0518, 0x2200, -+ 0x9c06, 0x11e0, 0x7048, 0x9c36, 0x1110, 0x660c, 0x764a, 0x7044, -+ 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, 0x7046, 0x0010, -+ 0x7047, 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, 0x19e7, 0x7610, -+ 0x2660, 0x2678, 0x8cff, 0x0904, 0xa41a, 0x6010, 0x00b6, 0x2058, -+ 0xb8a0, 0x00be, 0x9206, 0x1904, 0xa415, 0x7030, 0x9c06, 0x1520, -+ 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xa3f1, 0x080c, 0x9e32, -+ 0x68c3, 0x0000, 0x080c, 0xa338, 0x7033, 0x0000, 0x0036, 0x2069, -+ 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, -+ 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x2069, 0x0100, 0x6824, 0xd084, -+ 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, 0x1110, 0x660c, -+ 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, 0x2f00, -+ 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, 0x2c00, 0x9f06, -+ 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, 0xca3c, -+ 0x1158, 0x080c, 0x321c, 0x080c, 0xca4d, 0x11f0, 0x080c, 0xb5b5, -+ 0x00d8, 0x080c, 0xa338, 0x08c0, 0x080c, 0xca4d, 0x1118, 0x080c, -+ 0xb5b5, 0x0090, 0x6014, 0x2048, 0x080c, 0xc836, 0x0168, 0x6020, -+ 0x9086, 0x0003, 0x1508, 0xa867, 0x0103, 0xab7a, 0xa877, 0x0000, -+ 0x080c, 0x6d74, 0x080c, 0xca27, 0x080c, 0xccc4, 0x080c, 0xac28, -+ 0x080c, 0xa20e, 0x00ce, 0x0804, 0xa39a, 0x2c78, 0x600c, 0x2060, -+ 0x0804, 0xa39a, 0x012e, 0x000e, 0x002e, 0x006e, 0x00ce, 0x00de, -+ 0x00ee, 0x00fe, 0x009e, 0x0005, 0x6020, 0x9086, 0x0006, 0x1d20, -+ 0x080c, 0xe26c, 0x0c08, 0x00d6, 0x080c, 0x9aea, 0x7003, 0x0200, -+ 0x7007, 0x0014, 0x60c3, 0x0014, 0x20e1, 0x0001, 0x2099, 0x1989, -+ 0x20e9, 0x0000, 0x20a1, 0x0250, 0x20a9, 0x0004, 0x4003, 0x7023, -+ 0x0004, 0x7027, 0x7878, 0x080c, 0x9e02, 0x00de, 0x0005, 0x080c, -+ 0x9aea, 0x700b, 0x0800, 0x7814, 0x9084, 0xff00, 0x700e, 0x7814, -+ 0x9084, 0x00ff, 0x7022, 0x782c, 0x7026, 0x7860, 0x9084, 0x00ff, -+ 0x9085, 0x0200, 0x7002, 0x7860, 0x9084, 0xff00, 0x8007, 0x7006, -+ 0x60c2, 0x0804, 0x9e02, 0x00b6, 0x00d6, 0x0016, 0x00d6, 0x2f68, -+ 0x2009, 0x0035, 0x080c, 0xceca, 0x00de, 0x1904, 0xa4c8, 0x080c, -+ 0x9a9f, 0x7003, 0x1300, 0x782c, 0x080c, 0xa5d3, 0x2068, 0x6820, -+ 0x9086, 0x0003, 0x0560, 0x7810, 0x2058, 0xbaa0, 0x080c, 0xab57, -+ 0x11d8, 0x9286, 0x007e, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffe, -+ 0x0498, 0x9286, 0x007f, 0x1128, 0x700b, 0x00ff, 0x700f, 0xfffd, -+ 0x0458, 0x9284, 0xff80, 0x0180, 0x9286, 0x0080, 0x1128, 0x700b, -+ 0x00ff, 0x700f, 0xfffc, 0x0400, 0x92d8, 0x1000, 0x2b5c, 0xb810, -+ 0x700a, 0xb814, 0x700e, 0x00c0, 0xb884, 0x700e, 0x00a8, 0x080c, -+ 0xab57, 0x1130, 0x7810, 0x2058, 0xb8a0, 0x9082, 0x007e, 0x0250, -+ 0x00d6, 0x2069, 0x181f, 0x2d04, 0x700a, 0x8d68, 0x2d04, 0x700e, -+ 0x00de, 0x0010, 0x6034, 0x700e, 0x7838, 0x7012, 0x783c, 0x7016, -+ 0x60c3, 0x000c, 0x001e, 0x00de, 0x080c, 0x9e02, 0x00be, 0x0005, -+ 0x781b, 0x0001, 0x7803, 0x0006, 0x001e, 0x00de, 0x00be, 0x0005, -+ 0x792c, 0x9180, 0x0008, 0x200c, 0x9186, 0x0006, 0x01c0, 0x9186, -+ 0x0003, 0x0904, 0xa546, 0x9186, 0x0005, 0x0904, 0xa52e, 0x9186, -+ 0x0004, 0x05f0, 0x9186, 0x0008, 0x0904, 0xa537, 0x7807, 0x0037, -+ 0x782f, 0x0003, 0x7817, 0x1700, 0x080c, 0xa5b0, 0x0005, 0x080c, -+ 0xa571, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x6800, -+ 0x6a44, 0xd2fc, 0x11f8, 0x0002, 0xa50f, 0xa51a, 0xa511, 0xa51a, -+ 0xa516, 0xa50f, 0xa50f, 0xa51a, 0xa51a, 0xa51a, 0xa51a, 0xa50f, -+ 0xa50f, 0xa50f, 0xa50f, 0xa50f, 0xa51a, 0xa50f, 0xa51a, 0x080c, -+ 0x0d7d, 0x6824, 0xd0e4, 0x0110, 0xd0cc, 0x0110, 0x900e, 0x0010, -+ 0x2009, 0x2000, 0x682c, 0x7022, 0x6830, 0x7026, 0x0804, 0xa56a, -+ 0x080c, 0xa571, 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, -+ 0x6a00, 0x9286, 0x0002, 0x1108, 0x900e, 0x04e0, 0x080c, 0xa571, -+ 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x0498, 0x04c9, -+ 0x00d6, 0x0026, 0x792c, 0x2168, 0x2009, 0x4000, 0x9286, 0x0005, -+ 0x0118, 0x9286, 0x0002, 0x1108, 0x900e, 0x0420, 0x0451, 0x00d6, -+ 0x0026, 0x792c, 0x2168, 0x6814, 0x0096, 0x2048, 0xa9ac, 0xa834, -+ 0x9112, 0xa9b0, 0xa838, 0x009e, 0x9103, 0x7022, 0x7226, 0x792c, -+ 0x9180, 0x0011, 0x2004, 0xd0fc, 0x1148, 0x9180, 0x0000, 0x2004, -+ 0x908e, 0x0002, 0x0130, 0x908e, 0x0004, 0x0118, 0x2009, 0x4000, -+ 0x0008, 0x900e, 0x712a, 0x60c3, 0x0018, 0x002e, 0x00de, 0x0804, -+ 0x9e02, 0x00b6, 0x0036, 0x0046, 0x0056, 0x0066, 0x080c, 0x9aea, -+ 0x9006, 0x7003, 0x0200, 0x7938, 0x710a, 0x793c, 0x710e, 0x7810, -+ 0x2058, 0xb8a0, 0x080c, 0xab57, 0x1118, 0x9092, 0x007e, 0x0268, -+ 0x00d6, 0x2069, 0x181f, 0x2d2c, 0x8d68, 0x2d34, 0x90d8, 0x1000, -+ 0x2b5c, 0xbb10, 0xbc14, 0x00de, 0x0028, 0x901e, 0xbc84, 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, 0x9aea, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, -+ 0x700e, 0x60c3, 0x0008, 0x0804, 0x9e02, 0x080c, 0x9a96, 0x7003, -+ 0x1400, 0x7838, 0x700a, 0x0079, 0x783c, 0x700e, 0x782c, 0x7012, -+ 0x7830, 0x7016, 0x7834, 0x9084, 0x00ff, 0x8007, 0x701a, 0x60c3, -+ 0x0010, 0x0804, 0x9e02, 0x00e6, 0x2071, 0x0240, 0x0006, 0x00f6, -+ 0x2078, 0x7810, 0x00b6, 0x2058, 0xb8d4, 0xd084, 0x0120, 0x7850, -+ 0x702a, 0x784c, 0x702e, 0x00be, 0x00fe, 0x000e, 0x00ee, 0x0005, -+ 0x080c, 0x9ae1, 0x7003, 0x0100, 0x782c, 0x700a, 0x7814, 0x700e, -+ 0x60c3, 0x0008, 0x0804, 0x9e02, 0x00a9, 0x7914, 0x712a, 0x60c3, -+ 0x0000, 0x60a7, 0x9575, 0x0026, 0x080c, 0x2979, 0x0228, 0x2011, -+ 0x0101, 0x2204, 0xc0c5, 0x2012, 0x002e, 0x080c, 0x9e25, 0x080c, -+ 0x86ed, 0x0005, 0x0036, 0x0096, 0x00d6, 0x00e6, 0x7860, 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, 0xa690, -+ 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, 0x19b2, 0x210c, 0x009e, 0x918d, 0x0092, 0x0010, -+ 0x2009, 0x0096, 0x60ab, 0x0036, 0x0026, 0x2110, 0x900e, 0x080c, -+ 0x2a53, 0x002e, 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, 0x080c, 0x9a9f, 0x0016, 0x0026, -+ 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, 0x0138, 0x2001, 0x1837, -+ 0x2004, 0x9084, 0x0028, 0x1138, 0x2001, 0x197c, 0x2004, 0x9086, -+ 0xaaaa, 0x1904, 0xa735, 0x7003, 0x5400, 0x00c6, 0x2061, 0x1800, -+ 0x607c, 0x9084, 0x00ff, 0xa998, 0x810f, 0x918c, 0xff00, 0x9105, -+ 0x700a, 0x6080, 0x700e, 0xa998, 0x918c, 0xff00, 0x7112, 0x20a9, -+ 0x0004, 0x2009, 0x1805, 0x2e10, 0x9290, 0x0006, 0x2104, 0x2012, -+ 0x8108, 0x8210, 0x1f04, 0xa6c6, 0x20a9, 0x0004, 0x2009, 0x1801, -+ 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa6d0, 0xa860, 0x20e0, -+ 0xa85c, 0x9080, 0x0029, 0x2098, 0x2009, 0x0006, 0x20a9, 0x0001, -+ 0x4002, 0x8007, 0x2012, 0x8210, 0x8109, 0x1dc0, 0x00d6, 0x2069, -+ 0x0200, 0x080c, 0xa67b, 0x00de, 0x2071, 0x0240, 0x2011, 0x0240, -+ 0x2009, 0x0002, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, -+ 0x8109, 0x1dc0, 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, 0x8007, -+ 0x2012, 0x8210, 0x8109, 0x1dc0, 0xa85c, 0x9080, 0x0031, 0x2098, -+ 0x2009, 0x0008, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, 0x8210, -+ 0x8109, 0x1dc0, 0x00ce, 0x60c3, 0x004c, 0x60a3, 0x0056, 0x60a7, -+ 0x9575, 0x2001, 0x1837, 0x2004, 0x9084, 0x0028, 0x1168, 0x080c, -+ 0x74e9, 0x0150, 0x6028, 0xc0bd, 0x602a, 0x2009, 0x1804, 0x2011, -+ 0x0029, 0x080c, 0x2a53, 0x0010, 0x080c, 0x9e02, 0x080c, 0x86ed, -+ 0x00de, 0x009e, 0x002e, 0x001e, 0x0005, 0x00e6, 0x2071, 0x0240, -+ 0x2001, 0x2200, 0x9085, 0x00ff, 0x7002, 0x7007, 0xffff, 0x2071, -+ 0x0100, 0x709b, 0x00ff, 0x00ee, 0x0804, 0xa6ab, 0x080c, 0x9a9f, -+ 0x0016, 0x0026, 0x0096, 0x00d6, 0x7814, 0x2048, 0x7013, 0x0138, -+ 0x7003, 0x5500, 0x00c6, 0xa89c, 0x9084, 0x00ff, 0xa998, 0x810f, -+ 0x918c, 0xff00, 0x9105, 0x700a, 0xa99c, 0x918c, 0xff00, 0xa8a0, -+ 0x9084, 0x00ff, 0x9105, 0x700e, 0xa998, 0x918c, 0xff00, 0x2061, -+ 0x1800, 0x607c, 0x9084, 0x00ff, 0x910d, 0x7112, 0x6180, 0x7116, -+ 0x2009, 0x0008, 0xa860, 0x20e0, 0xa85c, 0x9080, 0x0029, 0x2098, -+ 0x2e10, 0x9290, 0x0006, 0x20a9, 0x0001, 0x4002, 0x8007, 0x2012, -+ 0x8210, 0x8109, 0x1dc0, 0x20a9, 0x0004, 0x2009, 0x1805, 0x2104, -+ 0x2012, 0x8108, 0x8210, 0x1f04, 0xa787, 0x20a9, 0x0002, 0x2009, -+ 0x1801, 0x2104, 0x2012, 0x8108, 0x8210, 0x1f04, 0xa791, 0x00d6, -+ 0x0016, 0x2069, 0x0200, 0x080c, 0xa67b, 0x001e, 0x00de, 0x2071, -+ 0x0240, 0x20a9, 0x0002, 0x2009, 0x1803, 0x2011, 0x0240, 0x2104, -+ 0x2012, 0x8108, 0x8210, 0x1f04, 0xa7a7, 0x2009, 0x0008, 0x4002, -+ 0x8007, 0x2012, 0x8210, 0x8109, 0x1dd0, 0x9006, 0x20a9, 0x0008, -+ 0x2012, 0x8210, 0x1f04, 0xa7b8, 0x00ce, 0x60c3, 0x004c, 0x60a3, -+ 0x0056, 0x60a7, 0x9575, 0x080c, 0x9e02, 0x080c, 0x86ed, 0x00de, -+ 0x009e, 0x002e, 0x001e, 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, 0x00f6, 0x00e6, 0x00d6, 0x00c6, -+ 0x00a6, 0x0096, 0x0066, 0x0126, 0x2091, 0x8000, 0x2071, 0x19e7, -+ 0x7610, 0x2660, 0x2678, 0x8cff, 0x0904, 0xa873, 0x7030, 0x9c06, -+ 0x1520, 0x2069, 0x0100, 0x68c0, 0x9005, 0x0904, 0xa84a, 0x080c, -+ 0x9e32, 0x68c3, 0x0000, 0x080c, 0xa338, 0x7033, 0x0000, 0x0036, -+ 0x2069, 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, -+ 0x080c, 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x2069, 0x0100, 0x6824, -+ 0xd084, 0x0110, 0x6827, 0x0001, 0x003e, 0x7010, 0x9c36, 0x1110, -+ 0x660c, 0x7612, 0x700c, 0x9c36, 0x1140, 0x2c00, 0x9f36, 0x0118, -+ 0x2f00, 0x700e, 0x0010, 0x700f, 0x0000, 0x660c, 0x0066, 0x2c00, -+ 0x9f06, 0x0110, 0x7e0e, 0x0008, 0x2678, 0x600f, 0x0000, 0x080c, -+ 0xca3c, 0x1158, 0x080c, 0x321c, 0x080c, 0xca4d, 0x11f0, 0x080c, -+ 0xb5b5, 0x00d8, 0x080c, 0xa338, 0x08c0, 0x080c, 0xca4d, 0x1118, -+ 0x080c, 0xb5b5, 0x0090, 0x6014, 0x2048, 0x080c, 0xc836, 0x0168, -+ 0x6020, 0x9086, 0x0003, 0x1520, 0xa867, 0x0103, 0xab7a, 0xa877, -+ 0x0000, 0x080c, 0x6d80, 0x080c, 0xca27, 0x080c, 0xccc4, 0x080c, -+ 0xac28, 0x080c, 0xa20e, 0x00ce, 0x0804, 0xa7fb, 0x2c78, 0x600c, -+ 0x2060, 0x0804, 0xa7fb, 0x7013, 0x0000, 0x700f, 0x0000, 0x012e, -+ 0x006e, 0x009e, 0x00ae, 0x00ce, 0x00de, 0x00ee, 0x00fe, 0x0005, -+ 0x6020, 0x9086, 0x0006, 0x1d08, 0x080c, 0xe26c, 0x08f0, 0x00f6, -+ 0x0036, 0x2079, 0x0380, 0x7b18, 0xd3bc, 0x1de8, 0x7832, 0x7936, -+ 0x7a3a, 0x781b, 0x8080, 0x003e, 0x00fe, 0x0005, 0x0016, 0x2001, -+ 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, 0x0001, 0x1188, 0x2001, -+ 0x0015, 0x0c29, 0x2009, 0x1000, 0x2001, 0x0382, 0x2004, 0x9084, -+ 0x0007, 0x9086, 0x0003, 0x0120, 0x8109, 0x1db0, 0x080c, 0x0d7d, -+ 0x001e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, 0x0007, 0x9086, -+ 0x0003, 0x1120, 0x2001, 0x0380, 0x2003, 0x0001, 0x0005, 0x0156, -+ 0x0016, 0x0026, 0x00e6, 0x900e, 0x2071, 0x19e7, 0x0469, 0x0106, -+ 0x0190, 0x7004, 0x9086, 0x0003, 0x0148, 0x20a9, 0x1000, 0x6044, -+ 0xd0fc, 0x01d8, 0x1f04, 0xa8cf, 0x080c, 0x0d7d, 0x080c, 0xa896, -+ 0x6044, 0xd0fc, 0x0190, 0x7030, 0x9c06, 0x1148, 0x080c, 0x95de, -+ 0x6044, 0xd0dc, 0x0150, 0xc0dc, 0x6046, 0x700a, 0x7042, 0x704c, -+ 0x9c06, 0x190c, 0x0d7d, 0x080c, 0x963b, 0x010e, 0x1919, 0x00ee, -+ 0x002e, 0x001e, 0x015e, 0x0005, 0x2001, 0x0382, 0x2004, 0x9084, -+ 0x0007, 0x9086, 0x0003, 0x0005, 0x0126, 0x2091, 0x2400, 0x7808, -+ 0xd0a4, 0x190c, 0x0d76, 0xd09c, 0x0128, 0x7820, 0x908c, 0xf000, -+ 0x11b8, 0x0012, 0x012e, 0x0005, 0xa91c, 0xa95a, 0xa981, 0xa9b8, -+ 0xa9c8, 0xa9d9, 0xa9e8, 0xa9f6, 0xaa23, 0xaa27, 0xa91c, 0xa91c, -+ 0xa91c, 0xa91c, 0xa91c, 0xa91c, 0x080c, 0x0d7d, 0x012e, 0x0005, -+ 0x2060, 0x6044, 0xd0bc, 0x0140, 0xc0bc, 0x6046, 0x6000, 0x908a, -+ 0x0016, 0x1a0c, 0x0d7d, 0x0012, 0x012e, 0x0005, 0xa941, 0xa943, -+ 0xa941, 0xa949, 0xa941, 0xa941, 0xa941, 0xa941, 0xa941, 0xa943, -+ 0xa941, 0xa943, 0xa941, 0xa943, 0xa941, 0xa941, 0xa941, 0xa943, -+ 0xa941, 0x080c, 0x0d7d, 0x2009, 0x0013, 0x080c, 0xac8c, 0x012e, -+ 0x0005, 0x6014, 0x2048, 0xa87c, 0xd0dc, 0x0130, 0x080c, 0x88c1, -+ 0x080c, 0xabed, 0x012e, 0x0005, 0x2009, 0x0049, 0x080c, 0xac8c, -+ 0x012e, 0x0005, 0x080c, 0xa896, 0x2001, 0x1a0c, 0x2003, 0x0000, -+ 0x7030, 0x9065, 0x090c, 0x0d7d, 0x7034, 0x9092, 0x00c8, 0x1258, -+ 0x8000, 0x7036, 0x7004, 0x9086, 0x0003, 0x0110, 0x7007, 0x0000, -+ 0x781f, 0x0808, 0x0040, 0x080c, 0xe717, 0x6003, 0x0001, 0x2009, -+ 0x0014, 0x080c, 0xac8c, 0x781f, 0x0100, 0x080c, 0xa8b2, 0x012e, -+ 0x0005, 0x080c, 0xa896, 0x714c, 0x81ff, 0x1128, 0x2011, 0x1a0f, -+ 0x2013, 0x0000, 0x0438, 0x2061, 0x0100, 0x7150, 0x9192, 0x7530, -+ 0x12f0, 0x8108, 0x7152, 0x714c, 0x9188, 0x0008, 0x210c, 0x918e, -+ 0x0006, 0x1138, 0x6014, 0x9084, 0x1984, 0x9085, 0x0012, 0x6016, -+ 0x0088, 0x714c, 0x9188, 0x0008, 0x210c, 0x918e, 0x0009, 0x0d90, -+ 0x6014, 0x9084, 0x1984, 0x9085, 0x0016, 0x6016, 0x0018, 0x706c, -+ 0xc085, 0x706e, 0x781f, 0x0200, 0x080c, 0xa8b2, 0x012e, 0x0005, -+ 0x080c, 0xa896, 0x714c, 0x2160, 0x6003, 0x0003, 0x2009, 0x004a, -+ 0x080c, 0xac8c, 0x781f, 0x0200, 0x080c, 0xa8b2, 0x012e, 0x0005, -+ 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x6003, 0x0003, 0x080c, -+ 0xa896, 0x080c, 0x1d60, 0x781f, 0x0400, 0x080c, 0xa8b2, 0x012e, -+ 0x0005, 0x7808, 0xd09c, 0x0de8, 0x7820, 0x2060, 0x080c, 0xa896, -+ 0x080c, 0x1da8, 0x781f, 0x0400, 0x080c, 0xa8b2, 0x012e, 0x0005, -+ 0x7030, 0x9065, 0x0148, 0x6044, 0xc0bc, 0x6046, 0x7104, 0x9186, -+ 0x0003, 0x0110, 0x080c, 0x96a1, 0x012e, 0x0005, 0x00f6, 0x703c, -+ 0x9086, 0x0002, 0x0528, 0x704c, 0x907d, 0x0510, 0x7844, 0xc0bc, -+ 0x7846, 0x7820, 0x9086, 0x0009, 0x0118, 0x080c, 0x9d5c, 0x00c0, -+ 0x7828, 0xd0fc, 0x1118, 0x080c, 0x9cdb, 0x0090, 0x2001, 0x1837, -+ 0x2004, 0x9084, 0x0028, 0x1130, 0x2001, 0x197c, 0x2004, 0x9086, -+ 0xaaaa, 0x1120, 0x2001, 0x0387, 0x2003, 0x1000, 0x080c, 0x9c60, -+ 0x00fe, 0x012e, 0x0005, 0x080c, 0x758a, 0x012e, 0x0005, 0x080c, -+ 0x0d7d, 0x0005, 0x00e6, 0x2071, 0x19e7, 0x6044, 0xc0bc, 0x6046, -+ 0xd0fc, 0x01b8, 0x704c, 0x9c06, 0x1190, 0x2019, 0x0001, 0x080c, -+ 0xa118, 0x704f, 0x0000, 0x2001, 0x0109, 0x2004, 0xd08c, 0x1138, -+ 0x2001, 0x0108, 0x2004, 0xd0bc, 0x1110, 0x703f, 0x0000, 0x080c, -+ 0xa34e, 0x00ee, 0x0005, 0x0026, 0x7010, 0x9c06, 0x1178, 0x080c, -+ 0xa20e, 0x6044, 0xc0fc, 0x6046, 0x600c, 0x9015, 0x0120, 0x7212, -+ 0x600f, 0x0000, 0x0010, 0x7212, 0x720e, 0x9006, 0x002e, 0x0005, -+ 0x0026, 0x7020, 0x9c06, 0x1178, 0x080c, 0xa20e, 0x6044, 0xc0fc, -+ 0x6046, 0x600c, 0x9015, 0x0120, 0x7222, 0x600f, 0x0000, 0x0010, -+ 0x7222, 0x721e, 0x9006, 0x002e, 0x0005, 0x00d6, 0x0036, 0x7830, -+ 0x9c06, 0x1558, 0x2069, 0x0100, 0x68c0, 0x9005, 0x01f8, 0x080c, -+ 0x86f6, 0x080c, 0x9e32, 0x68c3, 0x0000, 0x080c, 0xa338, 0x2069, -+ 0x0140, 0x6b04, 0x9384, 0x1000, 0x0138, 0x2001, 0x0100, 0x080c, -+ 0x2a0a, 0x9006, 0x080c, 0x2a0a, 0x2069, 0x0100, 0x6824, 0xd084, -+ 0x0110, 0x6827, 0x0001, 0x9085, 0x0001, 0x0038, 0x7808, 0xc0ad, -+ 0x780a, 0x6003, 0x0009, 0x630a, 0x9006, 0x003e, 0x00de, 0x0005, -+ 0x0016, 0x0026, 0x0036, 0x6100, 0x2019, 0x0100, 0x2001, 0x0382, -+ 0x2004, 0xd09c, 0x0190, 0x00c6, 0x0126, 0x2091, 0x2800, 0x0016, -+ 0x0036, 0x080c, 0xa8fc, 0x003e, 0x001e, 0x012e, 0x00ce, 0x6200, -+ 0x2200, 0x9106, 0x0d58, 0x2200, 0x0010, 0x8319, 0x1d38, 0x003e, -+ 0x002e, 0x001e, 0x0005, 0x00d6, 0x0156, 0x080c, 0x9aea, 0x7a14, -+ 0x82ff, 0x0138, 0x7003, 0x0100, 0x700b, 0x0003, 0x60c3, 0x0008, -+ 0x0490, 0x7003, 0x0200, 0x7007, 0x0000, 0x2069, 0x1800, 0x901e, -+ 0x6800, 0x9086, 0x0004, 0x1110, 0xc38d, 0x0060, 0x080c, 0x74e9, -+ 0x1110, 0xc3ad, 0x0008, 0xc3a5, 0x6adc, 0xd29c, 0x1110, 0xd2ac, -+ 0x0108, 0xc39d, 0x730e, 0x080c, 0x87bb, 0x20a9, 0x0006, 0x2011, -+ 0xfff4, 0x2019, 0xfff5, 0x2071, 0x0250, 0x2305, 0x2072, 0x8e70, -+ 0x2205, 0x2072, 0x8e70, 0x9398, 0x0002, 0x9290, 0x0002, 0x1f04, -+ 0xaafd, 0x60c3, 0x0020, 0x080c, 0x9e02, 0x015e, 0x00de, 0x0005, -+ 0x0156, 0x080c, 0x9aea, 0x7a14, 0x82ff, 0x0168, 0x9286, 0xffff, -+ 0x0118, 0x9282, 0x000e, 0x1238, 0x7003, 0x0100, 0x700b, 0x0003, -+ 0x60c3, 0x0008, 0x0488, 0x7003, 0x0200, 0x7007, 0x001c, 0x700f, -+ 0x0001, 0x2011, 0x19bd, 0x2204, 0x8007, 0x701a, 0x8210, 0x2204, -+ 0x8007, 0x701e, 0x0421, 0x1120, 0xb8a0, 0x9082, 0x007f, 0x0248, -+ 0x2001, 0x181f, 0x2004, 0x7022, 0x2001, 0x1820, 0x2004, 0x7026, -+ 0x0030, 0x2001, 0x1818, 0x2004, 0x9084, 0x00ff, 0x7026, 0x20a9, -+ 0x0004, 0x20e1, 0x0001, 0x2099, 0x1805, 0x20e9, 0x0000, 0x20a1, -+ 0x0256, 0x4003, 0x60c3, 0x001c, 0x015e, 0x0804, 0x9e02, 0x0006, -+ 0x2001, 0x1837, 0x2004, 0xd0ac, 0x000e, 0x0005, 0x2011, 0x0003, -+ 0x080c, 0xa1cf, 0x2011, 0x0002, 0x080c, 0xa1d9, 0x080c, 0xa098, -+ 0x0036, 0x901e, 0x080c, 0xa118, 0x003e, 0x0005, 0x080c, 0x336d, -+ 0x0188, 0x0016, 0x00b6, 0x00c6, 0x7010, 0x9085, 0x0020, 0x7012, -+ 0x2009, 0x007e, 0x080c, 0x6625, 0xb85c, 0xc0ac, 0xb85e, 0x00ce, -+ 0x00be, 0x001e, 0x0005, 0x2071, 0x188d, 0x7000, 0x9005, 0x0140, -+ 0x2001, 0x0812, 0x2071, 0x1800, 0x7076, 0x707a, 0x706b, 0xffd4, -+ 0x2071, 0x1800, 0x7074, 0x7056, 0x705b, 0x1ddc, 0x0005, 0x00e6, -+ 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0010, -+ 0x0608, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, -+ 0x001c, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, -+ 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x001c, 0x7068, 0x9502, -+ 0x1230, 0x755a, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, -+ 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x00e6, 0x2071, 0x1800, 0x7554, -+ 0x9582, 0x0010, 0x0600, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, -+ 0x0148, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, -+ 0x1ddc, 0x0c98, 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x001c, -+ 0x7068, 0x9502, 0x1228, 0x755a, 0x9085, 0x0001, 0x00ee, 0x0005, -+ 0x705b, 0x1ddc, 0x0cc8, 0x9006, 0x0cc8, 0x9c82, 0x1ddc, 0x0a0c, -+ 0x0d7d, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1a0c, 0x0d7d, 0x9006, -+ 0x6006, 0x600a, 0x600e, 0x6016, 0x601a, 0x6012, 0x6023, 0x0000, -+ 0x6003, 0x0000, 0x601e, 0x605e, 0x6062, 0x6026, 0x602a, 0x602e, -+ 0x6032, 0x6036, 0x603a, 0x603e, 0x604a, 0x602a, 0x6046, 0x6042, -+ 0x2061, 0x1800, 0x6054, 0x8000, 0x6056, 0x0005, 0x9006, 0x600e, -+ 0x6016, 0x601a, 0x6012, 0x6022, 0x6002, 0x601e, 0x605e, 0x6062, -+ 0x604a, 0x6046, 0x2061, 0x1800, 0x6054, 0x8000, 0x6056, 0x0005, -+ 0x0006, 0x6000, 0x9086, 0x0000, 0x01d0, 0x601c, 0xd084, 0x190c, -+ 0x1a6a, 0x6023, 0x0007, 0x2001, 0x1986, 0x2004, 0x0006, 0x9082, -+ 0x0051, 0x000e, 0x0208, 0x8004, 0x601a, 0x080c, 0xe524, 0x604b, -+ 0x0000, 0x6044, 0xd0fc, 0x1129, 0x9006, 0x6046, 0x6016, 0x000e, -+ 0x0005, 0x080c, 0xa8f4, 0x0106, 0x190c, 0xa896, 0x2001, 0x19fa, -+ 0x2004, 0x9c06, 0x1130, 0x0036, 0x2019, 0x0001, 0x080c, 0xa118, -+ 0x003e, 0x080c, 0xa34e, 0x010e, 0x190c, 0xa8b2, 0x0005, 0x00e6, -+ 0x0126, 0x2071, 0x1800, 0x2091, 0x8000, 0x7554, 0x9582, 0x0001, -+ 0x0608, 0x7058, 0x2060, 0x6000, 0x9086, 0x0000, 0x0148, 0x9ce0, -+ 0x001c, 0x7068, 0x9c02, 0x1208, 0x0cb0, 0x2061, 0x1ddc, 0x0c98, -+ 0x6003, 0x0008, 0x8529, 0x7556, 0x9ca8, 0x001c, 0x7068, 0x9502, -+ 0x1230, 0x755a, 0x9085, 0x0001, 0x012e, 0x00ee, 0x0005, 0x705b, -+ 0x1ddc, 0x0cc0, 0x9006, 0x0cc0, 0x6020, 0x9084, 0x000f, 0x0002, -+ 0xaca0, 0xacaa, 0xacc5, 0xace0, 0xcf9c, 0xcfb9, 0xcfd4, 0xaca0, -+ 0xacaa, 0x8f9a, 0xacfc, 0xaca0, 0xaca0, 0xaca0, 0xaca0, 0xaca0, -+ 0x9186, 0x0013, 0x1130, 0x6044, 0xd0fc, 0x0110, 0x080c, 0x95de, -+ 0x0005, 0x0005, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, -+ 0x0013, 0x006e, 0x0005, 0xacc3, 0xb421, 0xb5fc, 0xacc3, 0xb692, -+ 0xafc5, 0xacc3, 0xacc3, 0xb3a3, 0xbbfa, 0xacc3, 0xacc3, 0xacc3, -+ 0xacc3, 0xacc3, 0xacc3, 0x080c, 0x0d7d, 0x0066, 0x6000, 0x90b2, -+ 0x0016, 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0xacde, 0xc205, -+ 0xacde, 0xacde, 0xacde, 0xacde, 0xacde, 0xacde, 0xc1aa, 0xc388, -+ 0xacde, 0xc242, 0xc2c6, 0xc242, 0xc2c6, 0xacde, 0x080c, 0x0d7d, -+ 0x6000, 0x9082, 0x0016, 0x1a0c, 0x0d7d, 0x6000, 0x0002, 0xacfa, -+ 0xbc44, 0xbcdb, 0xbe5b, 0xbeca, 0xacfa, 0xacfa, 0xacfa, 0xbc13, -+ 0xc12b, 0xc12e, 0xacfa, 0xacfa, 0xacfa, 0xacfa, 0xc15e, 0xacfa, -+ 0xacfa, 0xacfa, 0x080c, 0x0d7d, 0x0066, 0x6000, 0x90b2, 0x0016, -+ 0x1a0c, 0x0d7d, 0x0013, 0x006e, 0x0005, 0xad15, 0xad15, 0xad53, -+ 0xadf2, 0xae72, 0xad15, 0xad15, 0xad15, 0xad17, 0xad15, 0xad15, -+ 0xad15, 0xad15, 0xad15, 0xad15, 0xad15, 0x080c, 0x0d7d, 0x9186, -+ 0x004c, 0x0560, 0x9186, 0x0003, 0x190c, 0x0d7d, 0x0096, 0x601c, -+ 0xc0ed, 0x601e, 0x6003, 0x0003, 0x6106, 0x6014, 0x2048, 0xa87c, -+ 0x9084, 0xa000, 0xc0b5, 0xa87e, 0xa8ac, 0xa836, 0xa8b0, 0xa83a, -+ 0x9006, 0xa846, 0xa84a, 0xa884, 0x9092, 0x199a, 0x0210, 0x2001, -+ 0x1999, 0x8003, 0x8013, 0x8213, 0x9210, 0x621a, 0x009e, 0x080c, -+ 0x1bba, 0x2009, 0x8030, 0x080c, 0x9265, 0x0005, 0x6010, 0x00b6, -+ 0x2058, 0xbca0, 0x00be, 0x2c00, 0x080c, 0xae94, 0x080c, 0xcf6a, -+ 0x6003, 0x0007, 0x0005, 0x00d6, 0x0096, 0x00f6, 0x2079, 0x1800, -+ 0x7a90, 0x6014, 0x2048, 0xa87c, 0xd0ec, 0x1110, 0x9290, 0x0018, -+ 0xac78, 0xc4fc, 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, 0xadba, 0xadba, 0xadb5, -+ 0xadb8, 0xadba, 0xadb2, 0xada5, 0xada5, 0xada5, 0xada5, 0xada5, -+ 0xada5, 0xada5, 0xada5, 0xada5, 0xada5, 0x00fe, 0x00ee, 0x00de, -+ 0x00ce, 0x002e, 0x001e, 0x000e, 0x004e, 0x00fe, 0x009e, 0x00de, -+ 0x080c, 0x0d7d, 0x080c, 0xb84f, 0x0028, 0x080c, 0xb934, 0x0010, -+ 0x080c, 0xba2a, 0x00fe, 0x00ee, 0x00de, 0x00ce, 0x002e, 0x001e, -+ 0x2c00, 0xa896, 0x000e, 0x080c, 0xaf52, 0x0530, 0xa804, 0xa80e, -+ 0x00a6, 0x2050, 0xb100, 0x00ae, 0x8006, 0x8006, 0x8007, 0x90bc, -+ 0x003f, 0x9084, 0xffc0, 0x9080, 0x0002, 0xaacc, 0xabd0, 0xacd4, -+ 0xadd8, 0x2031, 0x0000, 0x2041, 0x1298, 0x080c, 0xb112, 0x0160, -+ 0x000e, 0x9005, 0x0120, 0x00fe, 0x009e, 0x00de, 0x0005, 0x00fe, -+ 0x009e, 0x00de, 0x0804, 0xabed, 0x2001, 0x002c, 0x900e, 0x080c, -+ 0xafb8, 0x0c70, 0x91b6, 0x0015, 0x0170, 0x91b6, 0x0016, 0x0158, -+ 0x91b2, 0x0047, 0x0a0c, 0x0d7d, 0x91b2, 0x0050, 0x1a0c, 0x0d7d, -+ 0x9182, 0x0047, 0x0042, 0x080c, 0xaaa8, 0x0120, 0x9086, 0x0002, -+ 0x0904, 0xad53, 0x0005, 0xae14, 0xae14, 0xae16, 0xae48, 0xae14, -+ 0xae14, 0xae14, 0xae14, 0xae5b, 0x080c, 0x0d7d, 0x00d6, 0x0016, -+ 0x0096, 0x6003, 0x0004, 0x6114, 0x2148, 0xa87c, 0xd0fc, 0x01c0, -+ 0xa878, 0xc0fc, 0x9005, 0x1158, 0xa894, 0x9005, 0x0140, 0x2001, -+ 0x0000, 0x900e, 0x080c, 0xafb8, 0x080c, 0xabed, 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, 0x963b, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xc838, -+ 0x0120, 0xa87b, 0x0006, 0x080c, 0x6d80, 0x009e, 0x00de, 0x080c, -+ 0xabed, 0x0804, 0x96a0, 0x080c, 0x963b, 0x080c, 0x31e7, 0x080c, -+ 0xcf67, 0x00d6, 0x0096, 0x6114, 0x2148, 0x080c, 0xc838, 0x0120, -+ 0xa87b, 0x0029, 0x080c, 0x6d80, 0x009e, 0x00de, 0x080c, 0xabed, -+ 0x0804, 0x96a0, 0x9182, 0x0047, 0x0002, 0xae82, 0xae84, 0xae82, -+ 0xae82, 0xae82, 0xae82, 0xae82, 0xae82, 0xae82, 0xae82, 0xae82, -+ 0xae82, 0xae84, 0x080c, 0x0d7d, 0x00d6, 0x0096, 0x601f, 0x0000, -+ 0x6114, 0x2148, 0xa87b, 0x0000, 0xa883, 0x0000, 0x080c, 0x6d80, -+ 0x009e, 0x00de, 0x0804, 0xabed, 0x0026, 0x0036, 0x0056, 0x0066, -+ 0x0096, 0x00a6, 0x00f6, 0x0006, 0x080c, 0x103a, 0x000e, 0x090c, -+ 0x0d7d, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, 0x21a0, 0x900e, -+ 0x20a9, 0x0020, 0x4104, 0xa87a, 0x2079, 0x1800, 0x7990, 0x9188, -+ 0x0018, 0x918c, 0x0fff, 0xa972, 0xac76, 0x2950, 0x00a6, 0x2001, -+ 0x0205, 0x2003, 0x0000, 0x901e, 0x2029, 0x0001, 0x9182, 0x0034, -+ 0x1228, 0x2011, 0x001f, 0x080c, 0xc40b, 0x04c0, 0x2130, 0x2009, -+ 0x0034, 0x2011, 0x001f, 0x080c, 0xc40b, 0x96b2, 0x0034, 0xb004, -+ 0x904d, 0x0110, 0x080c, 0x0fec, 0x080c, 0x103a, 0x01d0, 0x8528, -+ 0xa867, 0x0110, 0xa86b, 0x0000, 0x2920, 0xb406, 0x968a, 0x003d, -+ 0x1230, 0x2608, 0x2011, 0x001b, 0x080c, 0xc40b, 0x00b8, 0x96b2, -+ 0x003c, 0x2009, 0x003c, 0x2950, 0x2011, 0x001b, 0x080c, 0xc40b, -+ 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, 0x6d80, 0x000e, 0x2048, -+ 0x9005, 0x1db0, 0x00fe, 0x00ae, 0x009e, 0x006e, 0x005e, 0x003e, -+ 0x002e, 0x0005, 0x00d6, 0x00f6, 0x0096, 0x0006, 0x080c, 0x103a, -+ 0x000e, 0x090c, 0x0d7d, 0xa960, 0x21e8, 0xa95c, 0x9188, 0x0019, -+ 0x21a0, 0x900e, 0x20a9, 0x0020, 0x4104, 0xaa66, 0xa87a, 0x2079, -+ 0x1800, 0x7990, 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, 0x6d80, 0x009e, 0x00fe, -+ 0x00de, 0x0005, 0x0016, 0x00d6, 0x00f6, 0x0096, 0x0016, 0x2001, -+ 0x0205, 0x200c, 0x918d, 0x0080, 0x2102, 0x001e, 0x2079, 0x0200, -+ 0x2e98, 0xa87c, 0xd0ec, 0x0118, 0x9e80, 0x000c, 0x2098, 0x2021, -+ 0x003e, 0x901e, 0x9282, 0x0020, 0x0218, 0x2011, 0x0020, 0x2018, -+ 0x9486, 0x003e, 0x1170, 0x0096, 0x080c, 0x103a, 0x2900, 0x009e, -+ 0x05c0, 0xa806, 0x2048, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0002, -+ 0x20a0, 0x3300, 0x908e, 0x0260, 0x0140, 0x2009, 0x0280, 0x9102, -+ 0x920a, 0x0218, 0x2010, 0x2100, 0x9318, 0x2200, 0x9402, 0x1228, -+ 0x2400, 0x9202, 0x2410, 0x9318, 0x9006, 0x2020, 0x22a8, 0xa800, -+ 0x9200, 0xa802, 0x20e1, 0x0000, 0x4003, 0x83ff, 0x0180, 0x3300, -+ 0x9086, 0x0280, 0x1130, 0x7814, 0x8000, 0x9085, 0x0080, 0x7816, -+ 0x2e98, 0x2310, 0x84ff, 0x0904, 0xaf67, 0x0804, 0xaf69, 0x9085, -+ 0x0001, 0x7817, 0x0000, 0x009e, 0x00fe, 0x00de, 0x001e, 0x0005, -+ 0x00d6, 0x0036, 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x080c, -+ 0x6d74, 0x009e, 0x003e, 0x00de, 0x0005, 0x91b6, 0x0015, 0x1118, -+ 0x080c, 0xabed, 0x0030, 0x91b6, 0x0016, 0x190c, 0x0d7d, 0x080c, -+ 0xabed, 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, 0xc838, -+ 0x0130, 0x6014, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0x009e, -+ 0x0804, 0xabed, 0x0096, 0x00d6, 0x0036, 0x7330, 0x9386, 0x0200, -+ 0x11a8, 0x6010, 0x00b6, 0x2058, 0xb8d7, 0x0000, 0x00be, 0x6014, -+ 0x9005, 0x0130, 0x2048, 0xa807, 0x0000, 0xa867, 0x0103, 0xab32, -+ 0x080c, 0xabed, 0x003e, 0x00de, 0x009e, 0x0005, 0x0011, 0x1d48, -+ 0x0cc8, 0x0006, 0x0016, 0x080c, 0xcf52, 0x0188, 0x6014, 0x9005, -+ 0x1170, 0x600b, 0x0003, 0x601b, 0x0000, 0x604b, 0x0000, 0x2009, -+ 0x0022, 0x080c, 0xb3f9, 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, 0xabed, 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, -+ 0xc40b, 0x080c, 0xc838, 0x0140, 0x6014, 0x2048, 0xa807, 0x0000, -+ 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xabed, 0x001e, 0x009e, -+ 0x0005, 0x0016, 0x2009, 0x0000, 0x7030, 0x9086, 0x0200, 0x0110, -+ 0x2009, 0x0001, 0x0096, 0x6014, 0x904d, 0x090c, 0x0d7d, 0xa97a, -+ 0x080c, 0x6d80, 0x009e, 0x080c, 0xabed, 0x001e, 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, 0xc40b, -+ 0x009e, 0x080c, 0xc838, 0x0148, 0xa804, 0x9005, 0x1158, 0xa807, -+ 0x0000, 0xa864, 0xa8e2, 0xa867, 0x0103, 0x080c, 0xabed, 0x009e, -+ 0x001e, 0x0005, 0x0086, 0x2040, 0xa030, 0x8007, 0x9086, 0x0100, -+ 0x1118, 0x080c, 0xb5b5, 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, 0x127e, 0x0019, 0x0d08, -+ 0x008e, 0x0898, 0x0096, 0x0006, 0x080c, 0x103a, 0x000e, 0x01b0, -+ 0xa8ab, 0x0dcb, 0xa876, 0x000e, 0xa8a2, 0x0006, 0xae6a, 0x2800, -+ 0xa89e, 0xa97a, 0xaf72, 0xaa8e, 0xab92, 0xac96, 0xad9a, 0x0086, -+ 0x2940, 0x080c, 0x1124, 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, 0x604b, 0x0000, 0x2c68, -+ 0x0016, 0x2009, 0x0035, 0x080c, 0xceca, 0x001e, 0x1158, 0x622c, -+ 0x2268, 0x2071, 0x026c, 0x6b20, 0x9386, 0x0003, 0x0130, 0x9386, -+ 0x0006, 0x0128, 0x080c, 0xabed, 0x0020, 0x0039, 0x0010, 0x080c, -+ 0xb22e, 0x002e, 0x00de, 0x00ee, 0x0005, 0x0096, 0x6814, 0x2048, -+ 0x9186, 0x0015, 0x0904, 0xb20d, 0x918e, 0x0016, 0x1904, 0xb22c, -+ 0x700c, 0x908c, 0xff00, 0x9186, 0x1700, 0x0120, 0x9186, 0x0300, -+ 0x1904, 0xb1e7, 0x89ff, 0x1138, 0x6800, 0x9086, 0x000f, 0x0904, -+ 0xb1c9, 0x0804, 0xb22a, 0x6808, 0x9086, 0xffff, 0x1904, 0xb20f, -+ 0xa87c, 0x9084, 0x0060, 0x9086, 0x0020, 0x1128, 0xa83c, 0xa940, -+ 0x9105, 0x1904, 0xb20f, 0x6824, 0xd0b4, 0x1904, 0xb20f, 0x080c, -+ 0xca27, 0x6864, 0xa882, 0xa87c, 0xc0dc, 0xc0f4, 0xc0d4, 0xa87e, -+ 0x0026, 0x900e, 0x6a18, 0x2001, 0x000a, 0x080c, 0x9166, 0xa884, -+ 0x920a, 0x0208, 0x8011, 0xaa86, 0x82ff, 0x002e, 0x1138, 0x00c6, -+ 0x2d60, 0x080c, 0xc55e, 0x00ce, 0x0804, 0xb22a, 0x00c6, 0xa868, -+ 0xd0fc, 0x1118, 0x080c, 0x60bb, 0x0010, 0x080c, 0x64bf, 0x00ce, -+ 0x1904, 0xb20f, 0x00c6, 0x2d60, 0x080c, 0xabed, 0x00ce, 0x0804, -+ 0xb22a, 0x00c6, 0x080c, 0xac5f, 0x0198, 0x6017, 0x0000, 0x6810, -+ 0x6012, 0x080c, 0xcccc, 0x6023, 0x0003, 0x6904, 0x00c6, 0x2d60, -+ 0x080c, 0xabed, 0x00ce, 0x080c, 0xac8c, 0x00ce, 0x0804, 0xb22a, -+ 0x2001, 0x1988, 0x2004, 0x684a, 0x00ce, 0x0804, 0xb22a, 0x7008, -+ 0x9086, 0x000b, 0x11c8, 0x6010, 0x00b6, 0x2058, 0xb900, 0xc1bc, -+ 0xb902, 0x00be, 0x00c6, 0x2d60, 0xa87b, 0x0003, 0x080c, 0xcf0c, -+ 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, 0x8020, -+ 0x080c, 0x921e, 0x00ce, 0x0430, 0x700c, 0x9086, 0x2a00, 0x1138, -+ 0x2001, 0x1988, 0x2004, 0x684a, 0x00e8, 0x04c1, 0x00e8, 0x89ff, -+ 0x090c, 0x0d7d, 0x00c6, 0x00d6, 0x2d60, 0xa867, 0x0103, 0xa87b, -+ 0x0003, 0x080c, 0x6b96, 0x080c, 0xca27, 0x080c, 0xac28, 0x0026, -+ 0x6010, 0x00b6, 0x2058, 0xba3c, 0x080c, 0x6750, 0x00be, 0x002e, -+ 0x00de, 0x00ce, 0x080c, 0xabed, 0x009e, 0x0005, 0x9186, 0x0015, -+ 0x1128, 0x2001, 0x1988, 0x2004, 0x684a, 0x0068, 0x918e, 0x0016, -+ 0x1160, 0x00c6, 0x2d00, 0x2060, 0x080c, 0xe524, 0x080c, 0x88c1, -+ 0x080c, 0xabed, 0x00ce, 0x080c, 0xabed, 0x0005, 0x0026, 0x0036, -+ 0x0046, 0x7228, 0xacb0, 0xabac, 0xd2f4, 0x0130, 0x2001, 0x1988, -+ 0x2004, 0x684a, 0x0804, 0xb2a8, 0x00c6, 0x2d60, 0x080c, 0xc436, -+ 0x00ce, 0x6804, 0x9086, 0x0050, 0x1168, 0x00c6, 0x2d00, 0x2060, -+ 0x6003, 0x0001, 0x6007, 0x0050, 0x2009, 0x8023, 0x080c, 0x921e, -+ 0x00ce, 0x04f0, 0x6800, 0x9086, 0x000f, 0x01a8, 0x89ff, 0x090c, -+ 0x0d7d, 0x6800, 0x9086, 0x0004, 0x1190, 0xa87c, 0xd0ac, 0x0178, -+ 0xa843, 0x0fff, 0xa83f, 0x0fff, 0xa880, 0xc0fc, 0xa882, 0x2001, -+ 0x0001, 0x6832, 0x0400, 0x2001, 0x0007, 0x6832, 0x00e0, 0xa87c, -+ 0xd0b4, 0x1150, 0xd0ac, 0x0db8, 0x6824, 0xd0f4, 0x1d48, 0xa838, -+ 0xa934, 0x9105, 0x0d80, 0x0c20, 0xd2ec, 0x1d68, 0x7024, 0x9306, -+ 0x1118, 0x7020, 0x9406, 0x0d38, 0x7020, 0x683e, 0x7024, 0x683a, -+ 0x2001, 0x0005, 0x6832, 0x080c, 0xcbb6, 0x080c, 0x96a0, 0x0010, -+ 0x080c, 0xabed, 0x004e, 0x003e, 0x002e, 0x0005, 0x00e6, 0x00d6, -+ 0x0026, 0x7008, 0x9084, 0x00ff, 0x6210, 0x00b6, 0x2258, 0xba10, -+ 0x00be, 0x9206, 0x1904, 0xb313, 0x700c, 0x6210, 0x00b6, 0x2258, -+ 0xba14, 0x00be, 0x9206, 0x1904, 0xb313, 0x6038, 0x2068, 0x6824, -+ 0xc0dc, 0x6826, 0x6a20, 0x9286, 0x0007, 0x0904, 0xb313, 0x9286, -+ 0x0002, 0x0904, 0xb313, 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, 0xc838, 0x090c, 0x0d7d, 0xa87b, 0x0003, 0x009e, 0x080c, -+ 0xcf0c, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, -+ 0x8020, 0x080c, 0x921e, 0x00ce, 0x0030, 0x6038, 0x2070, 0x2001, -+ 0x1988, 0x2004, 0x704a, 0x080c, 0xabed, 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, 0xbbc2, 0x002e, 0x003e, -+ 0x015e, 0x009e, 0x1904, 0xb382, 0x0096, 0x0156, 0x0036, 0x0026, -+ 0x2b48, 0x9e90, 0x0014, 0x2019, 0x0006, 0x20a9, 0x0004, 0x080c, -+ 0xbbc2, 0x002e, 0x003e, 0x015e, 0x009e, 0x15a0, 0x7238, 0xba0a, -+ 0x733c, 0xbb0e, 0xbc00, 0xc48d, 0xbc02, 0xa804, 0x9005, 0x1128, -+ 0x00fe, 0x009e, 0x00be, 0x0804, 0xaffd, 0x0096, 0x2048, 0xaa12, -+ 0xab16, 0xac0a, 0x009e, 0x8006, 0x8006, 0x8007, 0x90bc, 0x003f, -+ 0x9084, 0xffc0, 0x9080, 0x0002, 0x2009, 0x002b, 0xaaa0, 0xab9c, -+ 0xaca8, 0xada4, 0x2031, 0x0000, 0x2041, 0x127e, 0x080c, 0xb112, -+ 0x0130, 0x00fe, 0x009e, 0x080c, 0xabed, 0x00be, 0x0005, 0x080c, -+ 0xb5b5, 0x0cb8, 0x2b78, 0x00f6, 0x080c, 0x31e7, 0x080c, 0xcf67, -+ 0x00fe, 0x00c6, 0x080c, 0xab97, 0x2f00, 0x6012, 0x6017, 0x0000, -+ 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x2001, 0x0007, -+ 0x080c, 0x6575, 0x080c, 0x65a1, 0x080c, 0x9225, 0x080c, 0x96a0, -+ 0x00ce, 0x0804, 0xb355, 0x2100, 0x91b2, 0x0053, 0x1a0c, 0x0d7d, -+ 0x91b2, 0x0040, 0x1a04, 0xb40b, 0x0002, 0xb3f9, 0xb3f9, 0xb3ef, -+ 0xb3f9, 0xb3f9, 0xb3f9, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, -+ 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, -+ 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, -+ 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3f9, 0xb3ed, 0xb3f9, 0xb3f9, -+ 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ef, 0xb3ed, 0xb3ed, -+ 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3f9, -+ 0xb3f9, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, 0xb3ed, -+ 0xb3ed, 0xb3ed, 0xb3f9, 0xb3ed, 0xb3ed, 0x080c, 0x0d7d, 0x0066, -+ 0x00b6, 0x6610, 0x2658, 0xb8d4, 0xc08c, 0xb8d6, 0x00be, 0x006e, -+ 0x0000, 0x6003, 0x0001, 0x6106, 0x9186, 0x0032, 0x0118, 0x080c, -+ 0x9225, 0x0010, 0x080c, 0x921e, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x96a0, 0x012e, 0x0005, 0x2600, 0x0002, 0xb3f9, 0xb3f9, 0xb41f, -+ 0xb3f9, 0xb3f9, 0xb41f, 0xb41f, 0xb41f, 0xb41f, 0xb3f9, 0xb41f, -+ 0xb3f9, 0xb41f, 0xb3f9, 0xb41f, 0xb41f, 0xb41f, 0xb41f, 0x080c, -+ 0x0d7d, 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d7d, 0x91b6, 0x0013, -+ 0x0904, 0xb4f6, 0x91b6, 0x0027, 0x1904, 0xb4a2, 0x080c, 0x95de, -+ 0x6004, 0x080c, 0xca3c, 0x01b0, 0x080c, 0xca4d, 0x01a8, 0x908e, -+ 0x0021, 0x0904, 0xb49f, 0x908e, 0x0022, 0x1130, 0x080c, 0xb029, -+ 0x0904, 0xb49b, 0x0804, 0xb49c, 0x908e, 0x003d, 0x0904, 0xb49f, -+ 0x0804, 0xb495, 0x080c, 0x321c, 0x2001, 0x0007, 0x080c, 0x6575, -+ 0x6010, 0x00b6, 0x2058, 0xb9a0, 0x00be, 0x080c, 0xb5b5, 0x9186, -+ 0x007e, 0x1148, 0x2001, 0x1837, 0x2014, 0xc285, 0x080c, 0x74e9, -+ 0x1108, 0xc2ad, 0x2202, 0x080c, 0xa896, 0x0036, 0x0026, 0x2019, -+ 0x0028, 0x2110, 0x080c, 0xe630, 0x002e, 0x003e, 0x0016, 0x0026, -+ 0x0036, 0x2110, 0x2019, 0x0028, 0x080c, 0x93a5, 0x0076, 0x903e, -+ 0x080c, 0x9277, 0x6010, 0x00b6, 0x905d, 0x0100, 0x00be, 0x2c08, -+ 0x080c, 0xdfeb, 0x007e, 0x003e, 0x002e, 0x001e, 0x080c, 0xa8b2, -+ 0x080c, 0xcf67, 0x0016, 0x080c, 0xccc4, 0x080c, 0xabed, 0x001e, -+ 0x080c, 0x32fc, 0x080c, 0x96a0, 0x0030, 0x080c, 0xccc4, 0x080c, -+ 0xabed, 0x080c, 0x96a0, 0x0005, 0x080c, 0xb5b5, 0x0cb0, 0x080c, -+ 0xb5f1, 0x0c98, 0x9186, 0x0015, 0x0118, 0x9186, 0x0016, 0x1140, -+ 0x080c, 0xaaa8, 0x0d80, 0x9086, 0x0002, 0x0904, 0xb5fc, 0x0c58, -+ 0x9186, 0x0014, 0x1d40, 0x080c, 0x95de, 0x6004, 0x908e, 0x0022, -+ 0x1118, 0x080c, 0xb029, 0x09f8, 0x080c, 0x31e7, 0x080c, 0xcf67, -+ 0x080c, 0xca3c, 0x1190, 0x080c, 0x321c, 0x6010, 0x00b6, 0x2058, -+ 0xb9a0, 0x00be, 0x080c, 0xb5b5, 0x9186, 0x007e, 0x1128, 0x2001, -+ 0x1837, 0x200c, 0xc185, 0x2102, 0x0800, 0x080c, 0xca4d, 0x1120, -+ 0x080c, 0xb5b5, 0x0804, 0xb495, 0x6004, 0x908e, 0x0032, 0x1160, -+ 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, 0x35a5, -+ 0x00fe, 0x00ee, 0x0804, 0xb495, 0x6004, 0x908e, 0x0021, 0x0d40, -+ 0x908e, 0x0022, 0x090c, 0xb5b5, 0x0804, 0xb495, 0x90b2, 0x0040, -+ 0x1a04, 0xb595, 0x2008, 0x0002, 0xb53e, 0xb53f, 0xb542, 0xb545, -+ 0xb548, 0xb54b, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, -+ 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, -+ 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, -+ 0xb53c, 0xb53c, 0xb54e, 0xb557, 0xb53c, 0xb558, 0xb557, 0xb53c, -+ 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb557, 0xb557, 0xb53c, 0xb53c, -+ 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb53c, 0xb580, 0xb557, -+ 0xb53c, 0xb553, 0xb53c, 0xb53c, 0xb53c, 0xb554, 0xb53c, 0xb53c, -+ 0xb53c, 0xb557, 0xb57b, 0xb53c, 0x080c, 0x0d7d, 0x00c0, 0x2001, -+ 0x000b, 0x00e8, 0x2001, 0x0003, 0x00d0, 0x2001, 0x0005, 0x00b8, -+ 0x2001, 0x0001, 0x00a0, 0x2001, 0x0009, 0x0088, 0x6003, 0x0005, -+ 0x080c, 0x96a0, 0x0058, 0x0018, 0x0010, 0x080c, 0x6575, 0x04b8, -+ 0x080c, 0xcf6a, 0x6003, 0x0004, 0x080c, 0x96a0, 0x0005, 0x080c, -+ 0x6575, 0x6003, 0x0002, 0x0036, 0x2019, 0x1852, 0x2304, 0x9084, -+ 0xff00, 0x1120, 0x2001, 0x1986, 0x201c, 0x0040, 0x8007, 0x909a, -+ 0x0004, 0x0ec0, 0x8003, 0x801b, 0x831b, 0x9318, 0x631a, 0x003e, -+ 0x080c, 0x96a0, 0x0c18, 0x080c, 0xccc4, 0x080c, 0xabed, 0x08f0, -+ 0x00e6, 0x00f6, 0x2071, 0x189e, 0x2079, 0x0000, 0x080c, 0x35a5, -+ 0x00fe, 0x00ee, 0x080c, 0x95de, 0x080c, 0xabed, 0x0878, 0x6003, -+ 0x0002, 0x080c, 0xcf6a, 0x0804, 0x96a0, 0x2600, 0x2008, 0x0002, -+ 0xb5ac, 0xb58f, 0xb5aa, 0xb58f, 0xb58f, 0xb5aa, 0xb5aa, 0xb5aa, -+ 0xb5aa, 0xb58f, 0xb5aa, 0xb58f, 0xb5aa, 0xb58f, 0xb5aa, 0xb5aa, -+ 0xb5aa, 0xb5aa, 0x080c, 0x0d7d, 0x0096, 0x6014, 0x2048, 0x080c, -+ 0x6d80, 0x009e, 0x080c, 0xabed, 0x0005, 0x00e6, 0x0096, 0x0026, -+ 0x0016, 0x080c, 0xc838, 0x0568, 0x6014, 0x2048, 0xa864, 0x9086, -+ 0x0139, 0x11a8, 0xa894, 0x9086, 0x0056, 0x1148, 0x080c, 0x547b, -+ 0x0130, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x0028, 0x2001, -+ 0x0030, 0x900e, 0x2011, 0x4005, 0x080c, 0xce31, 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, 0x0d7d, 0x6604, 0x96b6, -+ 0x004d, 0x1120, 0x080c, 0xcd50, 0x0804, 0xb681, 0x6604, 0x96b6, -+ 0x0043, 0x1120, 0x080c, 0xcd99, 0x0804, 0xb681, 0x6604, 0x96b6, -+ 0x004b, 0x1120, 0x080c, 0xcdc5, 0x0804, 0xb681, 0x6604, 0x96b6, -+ 0x0033, 0x1120, 0x080c, 0xcce6, 0x0804, 0xb681, 0x6604, 0x96b6, -+ 0x0028, 0x1120, 0x080c, 0xca86, 0x0804, 0xb681, 0x6604, 0x96b6, -+ 0x0029, 0x1120, 0x080c, 0xcac7, 0x0804, 0xb681, 0x6604, 0x96b6, -+ 0x001f, 0x1120, 0x080c, 0xafd2, 0x0804, 0xb681, 0x6604, 0x96b6, -+ 0x0000, 0x1118, 0x080c, 0xb319, 0x04e0, 0x6604, 0x96b6, 0x0022, -+ 0x1118, 0x080c, 0xb00a, 0x04a8, 0x6604, 0x96b6, 0x0035, 0x1118, -+ 0x080c, 0xb130, 0x0470, 0x6604, 0x96b6, 0x0039, 0x1118, 0x080c, -+ 0xb2ae, 0x0438, 0x6604, 0x96b6, 0x003d, 0x1118, 0x080c, 0xb042, -+ 0x0400, 0x6604, 0x96b6, 0x0044, 0x1118, 0x080c, 0xb07e, 0x00c8, -+ 0x6604, 0x96b6, 0x0049, 0x1118, 0x080c, 0xb0bf, 0x0090, 0x6604, -+ 0x96b6, 0x0041, 0x1118, 0x080c, 0xb0a9, 0x0058, 0x91b6, 0x0015, -+ 0x1110, 0x0063, 0x0030, 0x91b6, 0x0016, 0x1128, 0x00be, 0x0804, -+ 0xb8db, 0x00be, 0x0005, 0x080c, 0xaca9, 0x0cd8, 0xb69e, 0xb6a1, -+ 0xb69e, 0xb6e8, 0xb69e, 0xb84f, 0xb8e8, 0xb69e, 0xb69e, 0xb8b1, -+ 0xb69e, 0xb8c7, 0x0096, 0x601f, 0x0000, 0x6014, 0x2048, 0xa800, -+ 0x2048, 0xa867, 0x0103, 0x009e, 0x0804, 0xabed, 0xa001, 0xa001, -+ 0x0005, 0x00e6, 0x2071, 0x1800, 0x7090, 0x9086, 0x0074, 0x1540, -+ 0x080c, 0xdfbc, 0x11b0, 0x6010, 0x00b6, 0x2058, 0x7030, 0xd08c, -+ 0x0128, 0xb800, 0xd0bc, 0x0110, 0xc0c5, 0xb802, 0x00f9, 0x00be, -+ 0x2001, 0x0006, 0x080c, 0x6575, 0x080c, 0x321c, 0x080c, 0xabed, -+ 0x0098, 0x2001, 0x000a, 0x080c, 0x6575, 0x080c, 0x321c, 0x6003, -+ 0x0001, 0x6007, 0x0001, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0020, -+ 0x2001, 0x0001, 0x080c, 0xb81f, 0x00ee, 0x0005, 0x00d6, 0xb800, -+ 0xd084, 0x0160, 0x9006, 0x080c, 0x6561, 0x2069, 0x1847, 0x6804, -+ 0xd0a4, 0x0120, 0x2001, 0x0006, 0x080c, 0x65a1, 0x00de, 0x0005, -+ 0x00b6, 0x0096, 0x00d6, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, -+ 0x1904, 0xb7f6, 0x6010, 0x2058, 0xbaa0, 0x9286, 0x007e, 0x1120, -+ 0x080c, 0xba35, 0x0804, 0xb75a, 0x080c, 0xba2a, 0x6010, 0x2058, -+ 0xbaa0, 0x9286, 0x0080, 0x1510, 0x6014, 0x9005, 0x01a8, 0x2048, -+ 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, 0x1140, 0x2001, 0x0000, -+ 0x900e, 0x2011, 0x4000, 0x080c, 0xce31, 0x0030, 0xa807, 0x0000, -+ 0xa867, 0x0103, 0xa833, 0x0200, 0x2001, 0x0006, 0x080c, 0x6575, -+ 0x080c, 0x321c, 0x080c, 0xabed, 0x0804, 0xb7f9, 0x080c, 0xb807, -+ 0x6014, 0x9005, 0x0190, 0x2048, 0xa868, 0xd0f4, 0x01e8, 0xa864, -+ 0x9084, 0x00ff, 0x9086, 0x0039, 0x1d08, 0x2001, 0x0000, 0x900e, -+ 0x2011, 0x4000, 0x080c, 0xce31, 0x08f8, 0x080c, 0xb7fd, 0x0160, -+ 0x9006, 0x080c, 0x6561, 0x2001, 0x0004, 0x080c, 0x65a1, 0x2001, -+ 0x0007, 0x080c, 0x6575, 0x08a0, 0x2001, 0x0004, 0x080c, 0x6575, -+ 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x9225, 0x080c, 0x96a0, -+ 0x0804, 0xb7f9, 0xb85c, 0xd0e4, 0x01d8, 0x080c, 0xcc5e, 0x080c, -+ 0x74e9, 0x0118, 0xd0dc, 0x1904, 0xb71c, 0x2011, 0x1837, 0x2204, -+ 0xc0ad, 0x2012, 0x2001, 0x196d, 0x2004, 0x00f6, 0x2079, 0x0100, -+ 0x78e3, 0x0000, 0x080c, 0x266f, 0x78e2, 0x00fe, 0x0804, 0xb71c, -+ 0x080c, 0xcc9f, 0x2011, 0x1837, 0x2204, 0xc0a5, 0x2012, 0x0006, -+ 0x080c, 0xe14c, 0x000e, 0x1904, 0xb71c, 0xc0b5, 0x2012, 0x2001, -+ 0x0006, 0x080c, 0x6575, 0x9006, 0x080c, 0x6561, 0x00c6, 0x2001, -+ 0x180f, 0x2004, 0xd09c, 0x0520, 0x00f6, 0x2079, 0x0100, 0x00e6, -+ 0x2071, 0x1800, 0x700c, 0x9084, 0x00ff, 0x78e6, 0x707e, 0x7010, -+ 0x78ea, 0x7082, 0x908c, 0x00ff, 0x00ee, 0x780c, 0xc0b5, 0x780e, -+ 0x00fe, 0x080c, 0x2644, 0x00f6, 0x2100, 0x900e, 0x080c, 0x25fb, -+ 0x795e, 0x00fe, 0x9186, 0x0081, 0x01d8, 0x2009, 0x0081, 0x00c8, -+ 0x2009, 0x00ef, 0x00f6, 0x2079, 0x0100, 0x79ea, 0x7932, 0x7936, -+ 0x780c, 0xc0b5, 0x780e, 0x00fe, 0x080c, 0x2644, 0x00f6, 0x2079, -+ 0x1800, 0x7982, 0x2100, 0x900e, 0x080c, 0x25fb, 0x795e, 0x00fe, -+ 0x8108, 0x080c, 0x65c4, 0x2b00, 0x00ce, 0x1904, 0xb71c, 0x6012, -+ 0x2009, 0x180f, 0x210c, 0xd19c, 0x0150, 0x2009, 0x027c, 0x210c, -+ 0x918c, 0x00ff, 0xb912, 0x2009, 0x027d, 0x210c, 0xb916, 0x2001, -+ 0x0002, 0x080c, 0x6575, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, -+ 0x0002, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0018, 0x2001, 0x0001, -+ 0x0431, 0x00de, 0x009e, 0x00be, 0x0005, 0x2001, 0x1810, 0x2004, -+ 0xd0a4, 0x0120, 0x2001, 0x1848, 0x2004, 0xd0ac, 0x0005, 0x00e6, -+ 0x080c, 0xe689, 0x0190, 0x2071, 0x0260, 0x7108, 0x720c, 0x918c, -+ 0x00ff, 0x1118, 0x9284, 0xff00, 0x0140, 0x6010, 0x2058, 0xb8a0, -+ 0x9084, 0xff80, 0x1110, 0xb912, 0xba16, 0x00ee, 0x0005, 0x2030, -+ 0x9005, 0x0158, 0x2001, 0x0007, 0x080c, 0x6575, 0x080c, 0x56ee, -+ 0x1120, 0x2001, 0x0007, 0x080c, 0x65a1, 0x2600, 0x9005, 0x11b0, -+ 0x6014, 0x0096, 0x2048, 0xa868, 0x009e, 0xd0fc, 0x1178, 0x0036, -+ 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, 0x0004, -+ 0x2011, 0x8014, 0x080c, 0x4b07, 0x004e, 0x003e, 0x080c, 0x321c, -+ 0x6020, 0x9086, 0x000a, 0x1108, 0x0005, 0x0804, 0xabed, 0x00b6, -+ 0x00e6, 0x0026, 0x0016, 0x2071, 0x1800, 0x7090, 0x9086, 0x0014, -+ 0x1904, 0xb8a7, 0x080c, 0x56ee, 0x1170, 0x6014, 0x9005, 0x1158, -+ 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, 0x080c, -+ 0x4cbe, 0x004e, 0x003e, 0x00d6, 0x6010, 0x2058, 0x080c, 0x66c0, -+ 0x080c, 0xb6d6, 0x00de, 0x080c, 0xbafb, 0x1588, 0x6010, 0x2058, -+ 0xb890, 0x9005, 0x0560, 0x2001, 0x0006, 0x080c, 0x6575, 0x0096, -+ 0x6014, 0x904d, 0x01d0, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0039, -+ 0x1140, 0x2001, 0x0000, 0x900e, 0x2011, 0x4000, 0x080c, 0xce31, -+ 0x0060, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0029, 0x0130, 0xa807, -+ 0x0000, 0xa867, 0x0103, 0xa833, 0x0200, 0x009e, 0x080c, 0x321c, -+ 0x6020, 0x9086, 0x000a, 0x0140, 0x080c, 0xabed, 0x0028, 0x080c, -+ 0xb5b5, 0x9006, 0x080c, 0xb81f, 0x001e, 0x002e, 0x00ee, 0x00be, -+ 0x0005, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, 0x1160, 0x2001, -+ 0x0002, 0x080c, 0x6575, 0x6003, 0x0001, 0x6007, 0x0001, 0x080c, -+ 0x9225, 0x0804, 0x96a0, 0x2001, 0x0001, 0x0804, 0xb81f, 0x2030, -+ 0x2011, 0x1824, 0x2204, 0x9086, 0x0004, 0x1148, 0x96b6, 0x000b, -+ 0x1120, 0x2001, 0x0007, 0x080c, 0x6575, 0x0804, 0xabed, 0x2001, -+ 0x0001, 0x0804, 0xb81f, 0x0002, 0xb69e, 0xb8f3, 0xb69e, 0xb934, -+ 0xb69e, 0xb9e1, 0xb8e8, 0xb69e, 0xb69e, 0xb9f5, 0xb69e, 0xba07, -+ 0x6604, 0x9686, 0x0003, 0x0904, 0xb84f, 0x96b6, 0x001e, 0x1110, -+ 0x080c, 0xabed, 0x0005, 0x00b6, 0x00d6, 0x00c6, 0x080c, 0xba19, -+ 0x11a0, 0x9006, 0x080c, 0x6561, 0x080c, 0x31e7, 0x080c, 0xcf67, -+ 0x2001, 0x0002, 0x080c, 0x6575, 0x6003, 0x0001, 0x6007, 0x0002, -+ 0x080c, 0x9225, 0x080c, 0x96a0, 0x0418, 0x2009, 0x026e, 0x2104, -+ 0x9086, 0x0009, 0x1160, 0x6010, 0x2058, 0xb840, 0x9084, 0x00ff, -+ 0x9005, 0x0170, 0x8001, 0xb842, 0x601b, 0x000a, 0x0088, 0x2009, -+ 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x1900, 0x1108, 0x08a0, -+ 0x080c, 0x31e7, 0x080c, 0xcf67, 0x2001, 0x0001, 0x080c, 0xb81f, -+ 0x00ce, 0x00de, 0x00be, 0x0005, 0x0096, 0x00b6, 0x0026, 0x9016, -+ 0x080c, 0xba27, 0x00d6, 0x2069, 0x197c, 0x2d04, 0x9005, 0x0168, -+ 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x2069, 0x1820, -+ 0x2d04, 0x8000, 0x206a, 0x00de, 0x0010, 0x00de, 0x0088, 0x9006, -+ 0x080c, 0x6561, 0x2001, 0x0002, 0x080c, 0x6575, 0x6003, 0x0001, -+ 0x6007, 0x0002, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0804, 0xb9b1, -+ 0x080c, 0xc838, 0x01b0, 0x6014, 0x2048, 0xa864, 0x2010, 0x9086, -+ 0x0139, 0x1138, 0x6007, 0x0016, 0x2001, 0x0002, 0x080c, 0xce8b, -+ 0x00b0, 0x6014, 0x2048, 0xa864, 0xd0fc, 0x0118, 0x2001, 0x0001, -+ 0x0ca8, 0x2001, 0x180e, 0x2004, 0xd0dc, 0x0148, 0x6010, 0x2058, -+ 0xb840, 0x9084, 0x00ff, 0x9005, 0x1110, 0x9006, 0x0c38, 0x080c, -+ 0xb5b5, 0x2009, 0x026e, 0x2134, 0x96b4, 0x00ff, 0x9686, 0x0005, -+ 0x0520, 0x9686, 0x000b, 0x01c8, 0x2009, 0x026f, 0x2104, 0x9084, -+ 0xff00, 0x1118, 0x9686, 0x0009, 0x01c0, 0x9086, 0x1900, 0x1168, -+ 0x9686, 0x0009, 0x0190, 0x2001, 0x0004, 0x080c, 0x6575, 0x2001, -+ 0x0028, 0x601a, 0x6007, 0x0052, 0x0020, 0x2001, 0x0001, 0x080c, -+ 0xb81f, 0x002e, 0x00be, 0x009e, 0x0005, 0x9286, 0x0139, 0x0160, -+ 0x6014, 0x2048, 0x080c, 0xc838, 0x0140, 0xa864, 0x9086, 0x0139, -+ 0x0118, 0xa868, 0xd0fc, 0x0108, 0x0c40, 0x6010, 0x2058, 0xb840, -+ 0x9084, 0x00ff, 0x9005, 0x0138, 0x8001, 0xb842, 0x601b, 0x000a, -+ 0x6007, 0x0016, 0x08f0, 0xb8a0, 0x9086, 0x007e, 0x1138, 0x00e6, -+ 0x2071, 0x1800, 0x080c, 0x5fbc, 0x00ee, 0x0010, 0x080c, 0x31e7, -+ 0x0860, 0x080c, 0xba27, 0x1160, 0x2001, 0x0004, 0x080c, 0x6575, -+ 0x6003, 0x0001, 0x6007, 0x0003, 0x080c, 0x9225, 0x0804, 0x96a0, -+ 0x080c, 0xb5b5, 0x9006, 0x0804, 0xb81f, 0x0489, 0x1160, 0x2001, -+ 0x0008, 0x080c, 0x6575, 0x6003, 0x0001, 0x6007, 0x0005, 0x080c, -+ 0x9225, 0x0804, 0x96a0, 0x2001, 0x0001, 0x0804, 0xb81f, 0x00f9, -+ 0x1160, 0x2001, 0x000a, 0x080c, 0x6575, 0x6003, 0x0001, 0x6007, -+ 0x0001, 0x080c, 0x9225, 0x0804, 0x96a0, 0x2001, 0x0001, 0x0804, -+ 0xb81f, 0x2009, 0x026e, 0x2104, 0x9086, 0x0003, 0x1138, 0x2009, -+ 0x026f, 0x2104, 0x9084, 0xff00, 0x9086, 0x2a00, 0x0005, 0x9085, -+ 0x0001, 0x0005, 0x00b6, 0x00c6, 0x0016, 0x6110, 0x2158, 0x080c, -+ 0x6634, 0x001e, 0x00ce, 0x00be, 0x0005, 0x00b6, 0x00f6, 0x00e6, -+ 0x00d6, 0x0036, 0x0016, 0x6010, 0x2058, 0x2009, 0x1837, 0x2104, -+ 0x9085, 0x0003, 0x200a, 0x080c, 0xbacd, 0x0560, 0x2009, 0x1837, -+ 0x2104, 0xc0cd, 0x200a, 0x080c, 0x6a67, 0x0158, 0x9006, 0x2020, -+ 0x2009, 0x002a, 0x080c, 0xe2c9, 0x2001, 0x180c, 0x200c, 0xc195, -+ 0x2102, 0x2019, 0x002a, 0x2009, 0x0001, 0x080c, 0x31a6, 0x00e6, -+ 0x2071, 0x1800, 0x080c, 0x2fb2, 0x00ee, 0x00c6, 0x0156, 0x20a9, -+ 0x0781, 0x2009, 0x007f, 0x080c, 0x32fc, 0x8108, 0x1f04, 0xba6b, -+ 0x015e, 0x00ce, 0x080c, 0xba2a, 0x2071, 0x0260, 0x2079, 0x0200, -+ 0x7817, 0x0001, 0x2001, 0x1837, 0x200c, 0xc1c5, 0x7018, 0xd0fc, -+ 0x0110, 0xd0dc, 0x0118, 0x7038, 0xd0dc, 0x1108, 0xc1c4, 0x7817, -+ 0x0000, 0x2001, 0x1837, 0x2102, 0x2079, 0x0100, 0x2e04, 0x9084, -+ 0x00ff, 0x2069, 0x181f, 0x206a, 0x78e6, 0x0006, 0x8e70, 0x2e04, -+ 0x2069, 0x1820, 0x206a, 0x78ea, 0x7832, 0x7836, 0x2010, 0x9084, -+ 0xff00, 0x001e, 0x9105, 0x2009, 0x182c, 0x200a, 0x2200, 0x9084, -+ 0x00ff, 0x2008, 0x080c, 0x2644, 0x080c, 0x74e9, 0x0170, 0x2071, -+ 0x0260, 0x2069, 0x1982, 0x7048, 0x206a, 0x704c, 0x6806, 0x7050, -+ 0x680a, 0x7054, 0x680e, 0x080c, 0xcc5e, 0x0040, 0x2001, 0x0006, -+ 0x080c, 0x6575, 0x080c, 0x321c, 0x080c, 0xabed, 0x001e, 0x003e, -+ 0x00de, 0x00ee, 0x00fe, 0x00be, 0x0005, 0x0096, 0x0026, 0x0036, -+ 0x00e6, 0x0156, 0x2019, 0x182c, 0x231c, 0x83ff, 0x01f0, 0x2071, -+ 0x0260, 0x7200, 0x9294, 0x00ff, 0x7004, 0x9084, 0xff00, 0x9205, -+ 0x9306, 0x1198, 0x2011, 0x0276, 0x20a9, 0x0004, 0x2b48, 0x2019, -+ 0x000a, 0x080c, 0xbbc2, 0x1148, 0x2011, 0x027a, 0x20a9, 0x0004, -+ 0x2019, 0x0006, 0x080c, 0xbbc2, 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, 0x19f3, 0x252c, 0x2021, -+ 0x19fa, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7254, 0x7074, -+ 0x9202, 0x1a04, 0xbb8e, 0x080c, 0x8b90, 0x0904, 0xbb87, 0x080c, -+ 0xe2fa, 0x0904, 0xbb87, 0x6720, 0x9786, 0x0007, 0x0904, 0xbb87, -+ 0x2500, 0x9c06, 0x0904, 0xbb87, 0x2400, 0x9c06, 0x0904, 0xbb87, -+ 0x3e08, 0x9186, 0x0002, 0x1148, 0x6010, 0x9005, 0x0130, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1590, 0x00c6, 0x6043, 0xffff, -+ 0x6000, 0x9086, 0x0004, 0x1110, 0x080c, 0x1a6a, 0x9786, 0x000a, -+ 0x0148, 0x080c, 0xca4d, 0x1130, 0x00ce, 0x080c, 0xb5b5, 0x080c, -+ 0xac28, 0x00e8, 0x6014, 0x2048, 0x080c, 0xc838, 0x01a8, 0x9786, -+ 0x0003, 0x1530, 0xa867, 0x0103, 0xa87c, 0xd0cc, 0x0130, 0x0096, -+ 0xa878, 0x2048, 0x080c, 0x0fec, 0x009e, 0xab7a, 0xa877, 0x0000, -+ 0x080c, 0x6d74, 0x080c, 0xca27, 0x080c, 0xac28, 0x00ce, 0x9ce0, -+ 0x001c, 0x7068, 0x9c02, 0x1210, 0x0804, 0xbb2e, 0x012e, 0x000e, -+ 0x002e, 0x004e, 0x005e, 0x007e, 0x00ce, 0x009e, 0x00ee, 0x0005, -+ 0x9786, 0x0006, 0x1118, 0x080c, 0xe26c, 0x0c30, 0x9786, 0x0009, -+ 0x1148, 0x6000, 0x9086, 0x0004, 0x0d08, 0x2009, 0x004c, 0x080c, -+ 0xac8c, 0x08e0, 0x9786, 0x000a, 0x0938, 0x0820, 0x220c, 0x2304, -+ 0x9106, 0x1130, 0x8210, 0x8318, 0x1f04, 0xbbae, 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, 0x220c, 0x810f, 0x2304, 0x9106, -+ 0x1130, 0x8210, 0x8318, 0x1f04, 0xbbec, 0x9006, 0x0005, 0x918d, -+ 0x0001, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7d, 0x080c, -+ 0xca3c, 0x0120, 0x080c, 0xca4d, 0x0158, 0x0028, 0x080c, 0x321c, -+ 0x080c, 0xca4d, 0x0128, 0x080c, 0x95de, 0x080c, 0xabed, 0x0005, -+ 0x080c, 0xb5b5, 0x0cc0, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, -+ 0x0208, 0x000a, 0x0005, 0xbc32, 0xbc32, 0xbc32, 0xbc32, 0xbc32, -+ 0xbc32, 0xbc32, 0xbc32, 0xbc32, 0xbc32, 0xbc32, 0xbc34, 0xbc34, -+ 0xbc34, 0xbc34, 0xbc32, 0xbc32, 0xbc32, 0xbc34, 0xbc32, 0xbc32, -+ 0xbc32, 0xbc32, 0x080c, 0x0d7d, 0x600b, 0xffff, 0x6003, 0x000f, -+ 0x6106, 0x0126, 0x2091, 0x8000, 0x080c, 0xcf6a, 0x2009, 0x8000, -+ 0x080c, 0x921e, 0x012e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, -+ 0x9082, 0x0040, 0x0804, 0xbcb9, 0x9186, 0x0027, 0x1520, 0x080c, -+ 0x95de, 0x080c, 0x31e7, 0x080c, 0xcf67, 0x0096, 0x6114, 0x2148, -+ 0x080c, 0xc838, 0x0198, 0x080c, 0xca4d, 0x1118, 0x080c, 0xb5b5, -+ 0x0068, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, 0x0000, 0xa97c, -+ 0xc1c5, 0xa97e, 0x080c, 0x6d80, 0x080c, 0xca27, 0x009e, 0x080c, -+ 0xabed, 0x0804, 0x96a0, 0x9186, 0x0014, 0x1120, 0x6004, 0x9082, -+ 0x0040, 0x0018, 0x080c, 0x0d7d, 0x0005, 0x0002, 0xbc97, 0xbc95, -+ 0xbc95, 0xbc95, 0xbc95, 0xbc95, 0xbc95, 0xbc95, 0xbc95, 0xbc95, -+ 0xbc95, 0xbcb0, 0xbcb0, 0xbcb0, 0xbcb0, 0xbc95, 0xbcb0, 0xbc95, -+ 0xbcb0, 0xbc95, 0xbc95, 0xbc95, 0xbc95, 0x080c, 0x0d7d, 0x080c, -+ 0x95de, 0x0096, 0x6114, 0x2148, 0x080c, 0xc838, 0x0168, 0xa867, -+ 0x0103, 0xa87b, 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ec, 0xa882, -+ 0x080c, 0x6d80, 0x080c, 0xca27, 0x009e, 0x080c, 0xabed, 0x0005, -+ 0x080c, 0x95de, 0x080c, 0xca4d, 0x090c, 0xb5b5, 0x080c, 0xabed, -+ 0x0005, 0x0002, 0xbcd3, 0xbcd1, 0xbcd1, 0xbcd1, 0xbcd1, 0xbcd1, -+ 0xbcd1, 0xbcd1, 0xbcd1, 0xbcd1, 0xbcd1, 0xbcd5, 0xbcd5, 0xbcd5, -+ 0xbcd5, 0xbcd1, 0xbcd7, 0xbcd1, 0xbcd5, 0xbcd1, 0xbcd1, 0xbcd1, -+ 0xbcd1, 0x080c, 0x0d7d, 0x080c, 0x0d7d, 0x080c, 0x0d7d, 0x080c, -+ 0xabed, 0x0804, 0x96a0, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, -+ 0x0208, 0x000a, 0x0005, 0xbcfa, 0xbcfa, 0xbcfa, 0xbcfa, 0xbcfa, -+ 0xbd33, 0xbe22, 0xbcfa, 0xbe2e, 0xbcfa, 0xbcfa, 0xbcfa, 0xbcfa, -+ 0xbcfa, 0xbcfa, 0xbcfa, 0xbcfa, 0xbcfa, 0xbcfa, 0xbe2e, 0xbcfc, -+ 0xbcfa, 0xbe2c, 0x080c, 0x0d7d, 0x00b6, 0x0096, 0x6114, 0x2148, -+ 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1508, 0xa87b, 0x0000, 0xa867, -+ 0x0103, 0xa877, 0x0000, 0xa87c, 0xd0ac, 0x0128, 0xa834, 0xa938, -+ 0x9115, 0x190c, 0xbeb3, 0x080c, 0x6b96, 0x6210, 0x2258, 0xba3c, -+ 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8d0, 0x9005, 0x0110, 0x080c, -+ 0x6750, 0x080c, 0xabed, 0x009e, 0x00be, 0x0005, 0xa87c, 0xd0ac, -+ 0x09e0, 0xa838, 0xa934, 0x9105, 0x09c0, 0xa880, 0xd0bc, 0x19a8, -+ 0x080c, 0xcb7d, 0x0c80, 0x00b6, 0x0096, 0x6114, 0x2148, 0x601c, -+ 0xd0fc, 0x1110, 0x7644, 0x0008, 0x9036, 0x96b4, 0x0fff, 0x86ff, -+ 0x1590, 0x6010, 0x2058, 0xb800, 0xd0bc, 0x1904, 0xbe11, 0xa87b, -+ 0x0000, 0xa867, 0x0103, 0xae76, 0xa87c, 0xd0ac, 0x0128, 0xa834, -+ 0xa938, 0x9115, 0x190c, 0xbeb3, 0x080c, 0x6b96, 0x6210, 0x2258, -+ 0xba3c, 0x82ff, 0x0110, 0x8211, 0xba3e, 0xb8d0, 0x9005, 0x0110, -+ 0x080c, 0x6750, 0x601c, 0xd0fc, 0x1148, 0x7044, 0xd0e4, 0x1904, -+ 0xbdf5, 0x080c, 0xabed, 0x009e, 0x00be, 0x0005, 0x2009, 0x0211, -+ 0x210c, 0x080c, 0x0d7d, 0x968c, 0x0c00, 0x0150, 0x6010, 0x2058, -+ 0xb800, 0xd0bc, 0x1904, 0xbdf9, 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, 0xbd3f, 0x735c, -+ 0xab86, 0x83ff, 0x0170, 0x938a, 0x0009, 0x0210, 0x2019, 0x0008, -+ 0x0036, 0x2308, 0x2019, 0x0018, 0x2011, 0x0025, 0x080c, 0xc40b, -+ 0x003e, 0xd6cc, 0x0904, 0xbd54, 0x7154, 0xa98a, 0x81ff, 0x0904, -+ 0xbd54, 0x9192, 0x0021, 0x1278, 0x8304, 0x9098, 0x0018, 0x2011, -+ 0x0029, 0x080c, 0xc40b, 0x2011, 0x0205, 0x2013, 0x0000, 0x080c, -+ 0xcef7, 0x0804, 0xbd54, 0xa868, 0xd0fc, 0x0120, 0x2009, 0x0020, -+ 0xa98a, 0x0c50, 0x00a6, 0x2950, 0x080c, 0xc3aa, 0x00ae, 0x080c, -+ 0xcef7, 0x080c, 0xc3fb, 0x0804, 0xbd56, 0x080c, 0xcb40, 0x0804, -+ 0xbd6b, 0xa87c, 0xd0ac, 0x0904, 0xbd7c, 0xa880, 0xd0bc, 0x1904, -+ 0xbd7c, 0x7348, 0xa838, 0x9306, 0x11c8, 0x734c, 0xa834, 0x931e, -+ 0x0904, 0xbd7c, 0xd6d4, 0x0190, 0xab38, 0x9305, 0x0904, 0xbd7c, -+ 0x0068, 0xa87c, 0xd0ac, 0x0904, 0xbd47, 0xa838, 0xa934, 0x9105, -+ 0x0904, 0xbd47, 0xa880, 0xd0bc, 0x1904, 0xbd47, 0x080c, 0xcb7d, -+ 0x0804, 0xbd6b, 0x00f6, 0x2079, 0x026c, 0x7c04, 0x7b00, 0x7e0c, -+ 0x7d08, 0x00fe, 0x0021, 0x0005, 0x0011, 0x0005, 0x0005, 0x0096, -+ 0x6003, 0x0002, 0x6007, 0x0043, 0x6014, 0x2048, 0xa87c, 0xd0ac, -+ 0x0128, 0x009e, 0x0005, 0x2130, 0x2228, 0x0058, 0x2400, 0xa9ac, -+ 0x910a, 0x2300, 0xaab0, 0x9213, 0x2600, 0x9102, 0x2500, 0x9203, -+ 0x0e90, 0xac46, 0xab4a, 0xae36, 0xad3a, 0x6044, 0xd0fc, 0x190c, -+ 0xa8bf, 0x604b, 0x0000, 0x080c, 0x1c30, 0x1118, 0x6144, 0x080c, -+ 0x924a, 0x009e, 0x0005, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, -+ 0x0208, 0x000a, 0x0005, 0xbe7a, 0xbe7a, 0xbe7a, 0xbe7a, 0xbe7a, -+ 0xbe7a, 0xbe7a, 0xbe7a, 0xbe7a, 0xbe7a, 0xbe7c, 0xbe7a, 0xbe7a, -+ 0xbe7a, 0xbe7a, 0xbe8d, 0xbe7a, 0xbe7a, 0xbe7a, 0xbe7a, 0xbeb1, -+ 0xbe7a, 0xbe7a, 0x080c, 0x0d7d, 0x6004, 0x9086, 0x0040, 0x1110, -+ 0x080c, 0x95de, 0x2019, 0x0001, 0x080c, 0xa118, 0x6003, 0x0002, -+ 0x080c, 0xcf6f, 0x080c, 0x963b, 0x0005, 0x6004, 0x9086, 0x0040, -+ 0x1110, 0x080c, 0x95de, 0x2019, 0x0001, 0x080c, 0xa118, 0x080c, -+ 0x963b, 0x080c, 0x31e7, 0x080c, 0xcf67, 0x0096, 0x6114, 0x2148, -+ 0x080c, 0xc838, 0x0150, 0xa867, 0x0103, 0xa87b, 0x0029, 0xa877, -+ 0x0000, 0x080c, 0x6d80, 0x080c, 0xca27, 0x009e, 0x080c, 0xabed, -+ 0x0005, 0x080c, 0x0d7d, 0xa87b, 0x0015, 0xd1fc, 0x0180, 0xa87b, -+ 0x0007, 0x8002, 0x8000, 0x810a, 0x9189, 0x0000, 0x0006, 0x0016, -+ 0x2009, 0x1a78, 0x2104, 0x8000, 0x200a, 0x001e, 0x000e, 0xa992, -+ 0xa88e, 0x0005, 0x9182, 0x0057, 0x1220, 0x9182, 0x0040, 0x0208, -+ 0x000a, 0x0005, 0xbee9, 0xbee9, 0xbee9, 0xbee9, 0xbee9, 0xbeeb, -+ 0xbee9, 0xbee9, 0xbfa8, 0xbee9, 0xbee9, 0xbee9, 0xbee9, 0xbee9, -+ 0xbee9, 0xbee9, 0xbee9, 0xbee9, 0xbee9, 0xc0ec, 0xbee9, 0xc0f6, -+ 0xbee9, 0x080c, 0x0d7d, 0x601c, 0xd0bc, 0x0178, 0xd084, 0x0168, -+ 0xd0f4, 0x0120, 0xc084, 0x601e, 0x0804, 0xbcdb, 0x6114, 0x0096, -+ 0x2148, 0xa87c, 0xc0e5, 0xa87e, 0x009e, 0x0076, 0x00a6, 0x00e6, -+ 0x0096, 0x2071, 0x0260, 0x6114, 0x2150, 0x601c, 0xd0fc, 0x1110, -+ 0x7644, 0x0008, 0x9036, 0xb676, 0x96b4, 0x0fff, 0xb77c, 0xc7e5, -+ 0xb77e, 0x6210, 0x00b6, 0x2258, 0xba3c, 0x82ff, 0x0110, 0x8211, -+ 0xba3e, 0x00be, 0x86ff, 0x0904, 0xbfa1, 0x9694, 0xff00, 0x9284, -+ 0x0c00, 0x0120, 0x7048, 0xb092, 0x704c, 0xb08e, 0x9284, 0x0300, -+ 0x0904, 0xbfa1, 0x9686, 0x0100, 0x1130, 0x7064, 0x9005, 0x1118, -+ 0xc6c4, 0xb676, 0x0c38, 0x080c, 0x103a, 0x090c, 0x0d7d, 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, -+ 0xc40b, 0x003e, 0xd6cc, 0x01e8, 0x7154, 0xa98a, 0x81ff, 0x01c8, -+ 0x9192, 0x0021, 0x1260, 0x8304, 0x9098, 0x0018, 0x2011, 0x0029, -+ 0x080c, 0xc40b, 0x2011, 0x0205, 0x2013, 0x0000, 0x0050, 0xb068, -+ 0xd0fc, 0x0120, 0x2009, 0x0020, 0xa98a, 0x0c68, 0x2950, 0x080c, -+ 0xc3aa, 0x080c, 0x1a48, 0x009e, 0x00ee, 0x00ae, 0x007e, 0x0005, -+ 0x2001, 0x1988, 0x2004, 0x604a, 0x0096, 0x6114, 0x2148, 0xa83c, -+ 0xa940, 0x9105, 0x1118, 0xa87c, 0xc0dc, 0xa87e, 0x6003, 0x0002, -+ 0x080c, 0xcf78, 0x0904, 0xc0e7, 0x604b, 0x0000, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1500, 0xd1cc, 0x0904, 0xc0a6, -+ 0xa978, 0xa868, 0xd0fc, 0x0904, 0xc067, 0x0016, 0xa87c, 0x0006, -+ 0xa880, 0x0006, 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, -+ 0x0002, 0x0904, 0xc035, 0x9086, 0x0028, 0x1904, 0xc021, 0xa87b, -+ 0x001c, 0xb07b, 0x001c, 0x0804, 0xc03d, 0x6024, 0xd0f4, 0x11d0, -+ 0xa838, 0xaa34, 0x9205, 0x09c8, 0xa838, 0xaa90, 0x9206, 0x1120, -+ 0xa88c, 0xaa34, 0x9206, 0x0988, 0x6024, 0xd0d4, 0x1148, 0xa9ac, -+ 0xa834, 0x9102, 0x603a, 0xa9b0, 0xa838, 0x9103, 0x603e, 0x6024, -+ 0xc0f5, 0x6026, 0x6010, 0x00b6, 0x2058, 0xb83c, 0x8000, 0xb83e, -+ 0x00be, 0x601c, 0xc0fc, 0x601e, 0x9006, 0xa876, 0xa892, 0xa88e, -+ 0xa87c, 0xc0e4, 0xa87e, 0xd0cc, 0x0140, 0xc0cc, 0xa87e, 0x0096, -+ 0xa878, 0x2048, 0x080c, 0x0fec, 0x009e, 0x080c, 0xcb7d, 0x0804, -+ 0xc0e7, 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, -+ 0xce1a, 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, -+ 0xa87b, 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, -+ 0xa834, 0xa938, 0x9115, 0x190c, 0xbeb3, 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, 0xcef7, 0x001e, 0xa874, -+ 0x0006, 0x2148, 0x080c, 0x0fec, 0x001e, 0x0804, 0xc0d3, 0x0016, -+ 0x00a6, 0x2150, 0xb174, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01e0, -+ 0x9086, 0x0028, 0x1128, 0xa87b, 0x001c, 0xb07b, 0x001c, 0x00e0, -+ 0xd1dc, 0x0158, 0xa87b, 0x0015, 0xb07b, 0x0015, 0x080c, 0xce1a, -+ 0x0118, 0xb174, 0xc1dc, 0xb176, 0x0078, 0xd1d4, 0x0128, 0xa87b, -+ 0x0007, 0xb07b, 0x0007, 0x0040, 0xa87c, 0xd0ac, 0x0128, 0xa834, -+ 0xa938, 0x9115, 0x190c, 0xbeb3, 0xa890, 0xb092, 0xa88c, 0xb08e, -+ 0xa87c, 0xb07e, 0x00ae, 0x080c, 0x0fec, 0x009e, 0x080c, 0xcef7, -+ 0xa974, 0x0016, 0x080c, 0xc3fb, 0x001e, 0x0468, 0xa867, 0x0103, -+ 0xa974, 0x9184, 0x00ff, 0x90b6, 0x0002, 0x01b0, 0x9086, 0x0028, -+ 0x1118, 0xa87b, 0x001c, 0x00d0, 0xd1dc, 0x0148, 0xa87b, 0x0015, -+ 0x080c, 0xce1a, 0x0118, 0xa974, 0xc1dc, 0xa976, 0x0078, 0xd1d4, -+ 0x0118, 0xa87b, 0x0007, 0x0050, 0xa87b, 0x0000, 0xa87c, 0xd0ac, -+ 0x0128, 0xa834, 0xa938, 0x9115, 0x190c, 0xbeb3, 0xa974, 0x0016, -+ 0x080c, 0x6b96, 0x001e, 0x6010, 0x00b6, 0x2058, 0xba3c, 0x82ff, -+ 0x0110, 0x8211, 0xba3e, 0xb8d0, 0x9005, 0x0120, 0x0016, 0x080c, -+ 0x6750, 0x001e, 0x00be, 0xd1e4, 0x1120, 0x080c, 0xabed, 0x009e, -+ 0x0005, 0x080c, 0xcb40, 0x0cd8, 0x6114, 0x0096, 0x2148, 0xa97c, -+ 0x080c, 0xcf78, 0x190c, 0x1a56, 0x009e, 0x0005, 0x0096, 0x6114, -+ 0x2148, 0xa83c, 0xa940, 0x9105, 0x01e8, 0xa877, 0x0000, 0xa87b, -+ 0x0000, 0xa867, 0x0103, 0x00b6, 0x6010, 0x2058, 0xa834, 0xa938, -+ 0x9115, 0x11a0, 0x080c, 0x6b96, 0xba3c, 0x8211, 0x0208, 0xba3e, -+ 0xb8d0, 0x9005, 0x0110, 0x080c, 0x6750, 0x080c, 0xabed, 0x00be, -+ 0x009e, 0x0005, 0xa87c, 0xc0dc, 0xa87e, 0x08f8, 0xb800, 0xd0bc, -+ 0x1120, 0xa834, 0x080c, 0xbeb3, 0x0c28, 0xa880, 0xd0bc, 0x1dc8, -+ 0x080c, 0xcb7d, 0x0c60, 0x080c, 0x95de, 0x0010, 0x080c, 0x963b, -+ 0x601c, 0xd084, 0x0110, 0x080c, 0x1a6a, 0x080c, 0xc838, 0x01f0, -+ 0x0096, 0x6114, 0x2148, 0x080c, 0xca4d, 0x1118, 0x080c, 0xb5b5, -+ 0x00a0, 0xa867, 0x0103, 0x2009, 0x180c, 0x210c, 0xd18c, 0x1198, -+ 0xd184, 0x1170, 0x6108, 0xa97a, 0x918e, 0x0029, 0x1110, 0x080c, -+ 0xe621, 0xa877, 0x0000, 0x080c, 0x6d80, 0x009e, 0x0804, 0xac28, -+ 0xa87b, 0x0004, 0x0cb0, 0xa87b, 0x0004, 0x0c98, 0x9182, 0x0057, -+ 0x1220, 0x9182, 0x0040, 0x0208, 0x000a, 0x0005, 0xc17d, 0xc17d, -+ 0xc17d, 0xc17d, 0xc17d, 0xc17f, 0xc17d, 0xc17d, 0xc17d, 0xc17d, -+ 0xc17d, 0xc17d, 0xc17d, 0xc17d, 0xc17d, 0xc17d, 0xc17d, 0xc17d, -+ 0xc17d, 0xc17d, 0xc1a3, 0xc17d, 0xc17d, 0x080c, 0x0d7d, 0x080c, -+ 0x56e2, 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, 0x6d80, -+ 0x009e, 0x0804, 0xabed, 0x080c, 0x56e2, 0x0dd8, 0x6014, 0x900e, -+ 0x9016, 0x0c10, 0x9182, 0x0085, 0x0002, 0xc1bc, 0xc1ba, 0xc1ba, -+ 0xc1c8, 0xc1ba, 0xc1ba, 0xc1ba, 0xc1ba, 0xc1ba, 0xc1ba, 0xc1ba, -+ 0xc1ba, 0xc1ba, 0x080c, 0x0d7d, 0x6003, 0x0001, 0x6106, 0x0126, -+ 0x2091, 0x8000, 0x2009, 0x8020, 0x080c, 0x921e, 0x012e, 0x0005, -+ 0x0026, 0x0056, 0x00d6, 0x00e6, 0x2071, 0x0260, 0x7224, 0x6216, -+ 0x7220, 0x080c, 0xc826, 0x01a0, 0x2268, 0x6800, 0x9086, 0x0000, -+ 0x0178, 0x6010, 0x6d10, 0x952e, 0x1158, 0x00c6, 0x2d60, 0x080c, -+ 0xc436, 0x00ce, 0x0128, 0x6803, 0x0002, 0x6007, 0x0086, 0x0010, -+ 0x6007, 0x0087, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x921e, -+ 0x9280, 0x0004, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0140, -+ 0x6824, 0xd0ec, 0x0128, 0x00c6, 0x2260, 0x080c, 0xcb7d, 0x00ce, -+ 0x00ee, 0x00de, 0x005e, 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, -+ 0x6004, 0x908a, 0x0085, 0x0a0c, 0x0d7d, 0x908a, 0x0092, 0x1a0c, -+ 0x0d7d, 0x9082, 0x0085, 0x00e2, 0x9186, 0x0027, 0x0120, 0x9186, -+ 0x0014, 0x190c, 0x0d7d, 0x080c, 0x95de, 0x0096, 0x6014, 0x2048, -+ 0x080c, 0xc838, 0x0140, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, -+ 0x0029, 0x080c, 0x6d80, 0x009e, 0x080c, 0xac28, 0x0804, 0x96a0, -+ 0xc23d, 0xc23f, 0xc23f, 0xc23d, 0xc23d, 0xc23d, 0xc23d, 0xc23d, -+ 0xc23d, 0xc23d, 0xc23d, 0xc23d, 0xc23d, 0x080c, 0x0d7d, 0x080c, -+ 0xac28, 0x0005, 0x9186, 0x0013, 0x1130, 0x6004, 0x9082, 0x0085, -+ 0x2008, 0x0804, 0xc28e, 0x9186, 0x0027, 0x1558, 0x080c, 0x95de, -+ 0x080c, 0x31e7, 0x080c, 0xcf67, 0x0096, 0x6014, 0x2048, 0x080c, -+ 0xc838, 0x0150, 0xa867, 0x0103, 0xa877, 0x0000, 0xa87b, 0x0029, -+ 0x080c, 0x6d80, 0x080c, 0xca27, 0x009e, 0x080c, 0xabed, 0x0005, -+ 0x9186, 0x0089, 0x0118, 0x9186, 0x008a, 0x1140, 0x080c, 0xaaa8, -+ 0x0128, 0x9086, 0x000c, 0x0904, 0xc2c6, 0x0000, 0x080c, 0xaca9, -+ 0x0c70, 0x9186, 0x0014, 0x1d60, 0x080c, 0x95de, 0x0096, 0x6014, -+ 0x2048, 0x080c, 0xc838, 0x0d00, 0xa867, 0x0103, 0xa877, 0x0000, -+ 0xa87b, 0x0006, 0xa880, 0xc0ec, 0xa882, 0x0890, 0x0002, 0xc29e, -+ 0xc29c, 0xc29c, 0xc29c, 0xc29c, 0xc29c, 0xc2b2, 0xc29c, 0xc29c, -+ 0xc29c, 0xc29c, 0xc29c, 0xc29c, 0x080c, 0x0d7d, 0x6034, 0x908c, -+ 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, -+ 0x2001, 0x1986, 0x0010, 0x2001, 0x1987, 0x2004, 0x601a, 0x6003, -+ 0x000c, 0x0005, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0039, -+ 0x0118, 0x9186, 0x0035, 0x1118, 0x2001, 0x1986, 0x0010, 0x2001, -+ 0x1987, 0x2004, 0x601a, 0x6003, 0x000e, 0x0005, 0x9182, 0x0092, -+ 0x1220, 0x9182, 0x0085, 0x0208, 0x0012, 0x0804, 0xaca9, 0xc2dc, -+ 0xc2dc, 0xc2dc, 0xc2dc, 0xc2de, 0xc32b, 0xc2dc, 0xc2dc, 0xc2dc, -+ 0xc2dc, 0xc2dc, 0xc2dc, 0xc2dc, 0x080c, 0x0d7d, 0x0096, 0x6010, -+ 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0168, 0x6034, 0x908c, -+ 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, -+ 0x009e, 0x0804, 0xc33f, 0x080c, 0xc838, 0x1118, 0x080c, 0xca27, -+ 0x0068, 0x6014, 0x2048, 0x080c, 0xcf7e, 0x1110, 0x080c, 0xca27, -+ 0xa867, 0x0103, 0x080c, 0xcf32, 0x080c, 0x6d80, 0x00d6, 0x2c68, -+ 0x080c, 0xab97, 0x01d0, 0x6003, 0x0001, 0x6007, 0x001e, 0x600b, -+ 0xffff, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, -+ 0x613e, 0x6910, 0x6112, 0x080c, 0xcccc, 0x695c, 0x615e, 0x6023, -+ 0x0001, 0x2009, 0x8020, 0x080c, 0x921e, 0x2d60, 0x00de, 0x080c, -+ 0xabed, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, -+ 0xd0bc, 0x05a0, 0x6034, 0x908c, 0xff00, 0x810f, 0x9186, 0x0035, -+ 0x0130, 0x9186, 0x001e, 0x0118, 0x9186, 0x0039, 0x1538, 0x00d6, -+ 0x2c68, 0x080c, 0xceca, 0x11f0, 0x080c, 0xab97, 0x01d8, 0x6106, -+ 0x6003, 0x0001, 0x6023, 0x0001, 0x6910, 0x6112, 0x692c, 0x612e, -+ 0x6930, 0x6132, 0x6934, 0x918c, 0x00ff, 0x6136, 0x6938, 0x613a, -+ 0x693c, 0x613e, 0x695c, 0x615e, 0x080c, 0xcccc, 0x2009, 0x8020, -+ 0x080c, 0x921e, 0x2d60, 0x00de, 0x0804, 0xabed, 0x0096, 0x6014, -+ 0x2048, 0x080c, 0xc838, 0x01c8, 0xa867, 0x0103, 0xa880, 0xd0b4, -+ 0x0128, 0xc0ec, 0xa882, 0xa87b, 0x0006, 0x0048, 0xd0bc, 0x0118, -+ 0xa87b, 0x0002, 0x0020, 0xa87b, 0x0005, 0x080c, 0xcb3c, 0xa877, -+ 0x0000, 0x080c, 0x6d80, 0x080c, 0xca27, 0x009e, 0x0804, 0xabed, -+ 0x0016, 0x0096, 0x6014, 0x2048, 0x080c, 0xc838, 0x0140, 0xa867, -+ 0x0103, 0xa87b, 0x0028, 0xa877, 0x0000, 0x080c, 0x6d80, 0x009e, -+ 0x001e, 0x9186, 0x0013, 0x0158, 0x9186, 0x0014, 0x0130, 0x9186, -+ 0x0027, 0x0118, 0x080c, 0xaca9, 0x0020, 0x080c, 0x95de, 0x080c, -+ 0xac28, 0x0005, 0x0056, 0x0066, 0x0096, 0x00a6, 0x2029, 0x0001, -+ 0x9182, 0x0101, 0x1208, 0x0010, 0x2009, 0x0100, 0x2130, 0x8304, -+ 0x9098, 0x0018, 0x2009, 0x0020, 0x2011, 0x0029, 0x080c, 0xc40b, -+ 0x96b2, 0x0020, 0xb004, 0x904d, 0x0110, 0x080c, 0x0fec, 0x080c, -+ 0x103a, 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, 0x6d80, 0x2a48, 0x0cb8, 0x080c, -+ 0x6d80, 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, -+ 0xc488, 0xc488, 0xc483, 0xc4ac, 0xc460, 0xc483, 0xc462, 0xc483, -+ 0xc460, 0x90e4, 0xc483, 0xc483, 0xc483, 0xc460, 0xc460, 0xc460, -+ 0x080c, 0x0d7d, 0x6010, 0x9080, 0x0000, 0x2004, 0xd0bc, 0x190c, -+ 0xc4ac, 0x0036, 0x6014, 0x0096, 0x2048, 0xa880, 0x009e, 0xd0cc, -+ 0x0118, 0x2019, 0x000c, 0x0038, 0xd094, 0x0118, 0x2019, 0x000d, -+ 0x0010, 0x2019, 0x0010, 0x080c, 0xde1b, 0x6023, 0x0006, 0x6003, -+ 0x0007, 0x003e, 0x0005, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, -+ 0x0096, 0x86ff, 0x11e8, 0x6014, 0x2048, 0x080c, 0xc838, 0x01d0, -+ 0x6043, 0xffff, 0xa864, 0x9086, 0x0139, 0x1128, 0xa87b, 0x0005, -+ 0xa883, 0x0000, 0x0028, 0x900e, 0x2001, 0x0005, 0x080c, 0x6fc0, -+ 0x080c, 0xcb3c, 0x080c, 0x6d74, 0x080c, 0xac28, 0x9085, 0x0001, -+ 0x009e, 0x0005, 0x9006, 0x0ce0, 0x080c, 0xa896, 0x080c, 0xcf8c, -+ 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x002b, 0x0106, 0x080c, -+ 0xa8b2, 0x010e, 0x0005, 0xc4cb, 0xc4f9, 0xc4cd, 0xc520, 0xc4f4, -+ 0xc4cb, 0xc483, 0xc488, 0xc488, 0xc483, 0xc483, 0xc483, 0xc483, -+ 0xc483, 0xc483, 0xc483, 0x080c, 0x0d7d, 0x86ff, 0x1510, 0x6020, -+ 0x9086, 0x0006, 0x01f0, 0x0096, 0x6014, 0x2048, 0x080c, 0xc838, -+ 0x0158, 0xa87c, 0xd0cc, 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, -+ 0x0fec, 0x009e, 0x080c, 0xcb3c, 0x009e, 0x080c, 0xcf0c, 0x6007, -+ 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, 0x8020, 0x080c, -+ 0x9200, 0x9085, 0x0001, 0x0005, 0x0066, 0x080c, 0x1a6a, 0x006e, -+ 0x08a0, 0x00e6, 0x2071, 0x19e7, 0x7030, 0x9c06, 0x1120, 0x080c, -+ 0xa098, 0x00ee, 0x0850, 0x6020, 0x9084, 0x000f, 0x9086, 0x0006, -+ 0x1150, 0x0086, 0x0096, 0x2049, 0x0001, 0x2c40, 0x080c, 0xa218, -+ 0x009e, 0x008e, 0x0040, 0x0066, 0x080c, 0x9f94, 0x190c, 0x0d7d, -+ 0x080c, 0x9fa2, 0x006e, 0x00ee, 0x1904, 0xc4cd, 0x0804, 0xc483, -+ 0x0036, 0x00e6, 0x2071, 0x19e7, 0x704c, 0x9c06, 0x1138, 0x901e, -+ 0x080c, 0xa118, 0x00ee, 0x003e, 0x0804, 0xc4cd, 0x080c, 0xa34e, -+ 0x00ee, 0x003e, 0x1904, 0xc4cd, 0x0804, 0xc483, 0x00c6, 0x0066, -+ 0x6020, 0x9084, 0x000f, 0x001b, 0x006e, 0x00ce, 0x0005, 0xc556, -+ 0xc618, 0xc77f, 0xc55e, 0xac28, 0xc556, 0xde0d, 0xcf74, 0xc618, -+ 0x90ab, 0xc7fe, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0xc54f, 0x080c, -+ 0x0d7d, 0x080c, 0xca4d, 0x1110, 0x080c, 0xb5b5, 0x0005, 0x080c, -+ 0x95de, 0x0804, 0xabed, 0x601b, 0x0001, 0x0005, 0x080c, 0xc838, -+ 0x0130, 0x6014, 0x0096, 0x2048, 0x2c00, 0xa896, 0x009e, 0x080c, -+ 0xa896, 0x080c, 0xcf8c, 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, -+ 0x0013, 0x0804, 0xa8b2, 0xc583, 0xc585, 0xc5af, 0xc5c3, 0xc5ee, -+ 0xc583, 0xc556, 0xc556, 0xc556, 0xc5ca, 0xc5ca, 0xc583, 0xc583, -+ 0xc583, 0xc583, 0xc5d4, 0x080c, 0x0d7d, 0x00e6, 0x6014, 0x0096, -+ 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x2071, 0x19e7, 0x7030, -+ 0x9c06, 0x01d0, 0x0066, 0x080c, 0x9f94, 0x190c, 0x0d7d, 0x080c, -+ 0x9fa2, 0x006e, 0x080c, 0xcf0c, 0x6007, 0x0085, 0x6003, 0x000b, -+ 0x6023, 0x0002, 0x2001, 0x1987, 0x2004, 0x601a, 0x2009, 0x8020, -+ 0x080c, 0x9200, 0x00ee, 0x0005, 0x601b, 0x0001, 0x0cd8, 0x0096, -+ 0x6014, 0x2048, 0xa880, 0xc0b5, 0xa882, 0x009e, 0x080c, 0xcf0c, -+ 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, 0x0002, 0x2009, 0x8020, -+ 0x080c, 0x9200, 0x0005, 0x080c, 0xa896, 0x080c, 0xaa2a, 0x080c, -+ 0xa8b2, 0x0c28, 0x0096, 0x601b, 0x0001, 0x6014, 0x2048, 0xa880, -+ 0xc0b5, 0xa882, 0x009e, 0x0005, 0x080c, 0x56e2, 0x01a8, 0x6014, -+ 0x0096, 0x904d, 0x0180, 0xa864, 0xa867, 0x0103, 0xa87b, 0x0006, -+ 0x9086, 0x0139, 0x1140, 0xa867, 0x0139, 0xa897, 0x4005, 0xa89b, -+ 0x0004, 0x080c, 0x6d80, 0x009e, 0x0804, 0xabed, 0x6014, 0x0096, -+ 0x904d, 0x0508, 0x080c, 0xcf78, 0x01f0, 0x080c, 0xa8b2, 0x2001, -+ 0x180f, 0x2004, 0xd0c4, 0x0110, 0x009e, 0x0005, 0xa884, 0x009e, -+ 0x8003, 0x800b, 0x810b, 0x9108, 0x611a, 0x2001, 0x0037, 0x2c08, -+ 0x080c, 0x1679, 0x6000, 0x9086, 0x0004, 0x1120, 0x2009, 0x0048, -+ 0x080c, 0xac8c, 0x0005, 0x009e, 0x080c, 0x1a6a, 0x0804, 0xc5af, -+ 0x6000, 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x000b, 0x0005, 0xc62f, -+ 0xc55b, 0xc631, 0xc62f, 0xc631, 0xc631, 0xc557, 0xc62f, 0xc551, -+ 0xc551, 0xc62f, 0xc62f, 0xc62f, 0xc62f, 0xc62f, 0xc62f, 0x080c, -+ 0x0d7d, 0x6010, 0x00b6, 0x2058, 0xb804, 0x9084, 0x00ff, 0x00be, -+ 0x908a, 0x000c, 0x1a0c, 0x0d7d, 0x00b6, 0x0013, 0x00be, 0x0005, -+ 0xc64c, 0xc719, 0xc64e, 0xc68e, 0xc64e, 0xc68e, 0xc64e, 0xc65c, -+ 0xc64c, 0xc68e, 0xc64c, 0xc67d, 0x080c, 0x0d7d, 0x6004, 0x908e, -+ 0x0016, 0x05c0, 0x908e, 0x0004, 0x05a8, 0x908e, 0x0002, 0x0590, -+ 0x908e, 0x0052, 0x0904, 0xc715, 0x6004, 0x080c, 0xca4d, 0x0904, -+ 0xc732, 0x908e, 0x0004, 0x1110, 0x080c, 0x321c, 0x908e, 0x0021, -+ 0x0904, 0xc736, 0x908e, 0x0022, 0x0904, 0xc77a, 0x908e, 0x003d, -+ 0x0904, 0xc736, 0x908e, 0x0039, 0x0904, 0xc73a, 0x908e, 0x0035, -+ 0x0904, 0xc73a, 0x908e, 0x001e, 0x0178, 0x908e, 0x0001, 0x1140, -+ 0x6010, 0x2058, 0xb804, 0x9084, 0x00ff, 0x9086, 0x0006, 0x0110, -+ 0x080c, 0x31e7, 0x080c, 0xb5b5, 0x0804, 0xac28, 0x00c6, 0x00d6, -+ 0x6104, 0x9186, 0x0016, 0x0904, 0xc706, 0x9186, 0x0002, 0x1904, -+ 0xc6db, 0x2001, 0x1837, 0x2004, 0xd08c, 0x11c8, 0x080c, 0x74e9, -+ 0x11b0, 0x080c, 0xcf52, 0x0138, 0x080c, 0x750c, 0x1120, 0x080c, -+ 0x73f4, 0x0804, 0xc763, 0x2001, 0x197d, 0x2003, 0x0001, 0x2001, -+ 0x1800, 0x2003, 0x0001, 0x080c, 0x741a, 0x0804, 0xc763, 0x6010, -+ 0x2058, 0x2001, 0x1837, 0x2004, 0xd0ac, 0x1904, 0xc763, 0xb8a0, -+ 0x9084, 0xff80, 0x1904, 0xc763, 0xb840, 0x9084, 0x00ff, 0x9005, -+ 0x0190, 0x8001, 0xb842, 0x6017, 0x0000, 0x6023, 0x0007, 0x601b, -+ 0x0398, 0x604b, 0x0000, 0x080c, 0xab97, 0x0128, 0x2b00, 0x6012, -+ 0x6023, 0x0001, 0x0458, 0x00de, 0x00ce, 0x6004, 0x908e, 0x0002, -+ 0x11a0, 0x6010, 0x2058, 0xb8a0, 0x9086, 0x007e, 0x1170, 0x2009, -+ 0x1837, 0x2104, 0xc085, 0x200a, 0x00e6, 0x2071, 0x1800, 0x080c, -+ 0x5fbc, 0x00ee, 0x080c, 0xb5b5, 0x0030, 0x080c, 0xb5b5, 0x080c, -+ 0x31e7, 0x080c, 0xcf67, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0x321c, 0x012e, 0x00ee, 0x080c, 0xac28, 0x0005, 0x2001, 0x0002, -+ 0x080c, 0x6575, 0x6003, 0x0001, 0x6007, 0x0002, 0x080c, 0x9225, -+ 0x080c, 0x96a0, 0x00de, 0x00ce, 0x0c80, 0x080c, 0x321c, 0x0804, -+ 0xc68a, 0x00c6, 0x00d6, 0x6104, 0x9186, 0x0016, 0x0d38, 0x6010, -+ 0x2058, 0xb840, 0x9084, 0x00ff, 0x9005, 0x0904, 0xc6db, 0x8001, -+ 0xb842, 0x6003, 0x0001, 0x080c, 0x9225, 0x080c, 0x96a0, 0x00de, -+ 0x00ce, 0x0898, 0x080c, 0xb5b5, 0x0804, 0xc68c, 0x080c, 0xb5f1, -+ 0x0804, 0xc68c, 0x00d6, 0x2c68, 0x6104, 0x080c, 0xceca, 0x00de, -+ 0x0118, 0x080c, 0xabed, 0x00f0, 0x6004, 0x8007, 0x6134, 0x918c, -+ 0x00ff, 0x9105, 0x6036, 0x6007, 0x0085, 0x6003, 0x000b, 0x6023, -+ 0x0002, 0x603c, 0x600a, 0x2001, 0x1987, 0x2004, 0x601a, 0x602c, -+ 0x2c08, 0x2060, 0x6024, 0xc0b5, 0x6026, 0x2160, 0x2009, 0x8020, -+ 0x080c, 0x921e, 0x0005, 0x00de, 0x00ce, 0x080c, 0xb5b5, 0x080c, -+ 0x31e7, 0x00e6, 0x0126, 0x2091, 0x8000, 0x080c, 0x321c, 0x6017, -+ 0x0000, 0x6023, 0x0007, 0x601b, 0x0398, 0x604b, 0x0000, 0x012e, -+ 0x00ee, 0x0005, 0x080c, 0xb029, 0x1904, 0xc732, 0x0005, 0x6000, -+ 0x908a, 0x0016, 0x1a0c, 0x0d7d, 0x0096, 0x00d6, 0x001b, 0x00de, -+ 0x009e, 0x0005, 0xc79a, 0xc79a, 0xc79a, 0xc79a, 0xc79a, 0xc79a, -+ 0xc79a, 0xc79a, 0xc79a, 0xc556, 0xc79a, 0xc55b, 0xc79c, 0xc55b, -+ 0xc7a9, 0xc79a, 0x080c, 0x0d7d, 0x6004, 0x9086, 0x008b, 0x0148, -+ 0x6007, 0x008b, 0x6003, 0x000d, 0x2009, 0x8020, 0x080c, 0x921e, -+ 0x0005, 0x080c, 0xcf46, 0x0118, 0x080c, 0xcf59, 0x0010, 0x080c, -+ 0xcf67, 0x080c, 0xca27, 0x080c, 0xc838, 0x0570, 0x080c, 0x31e7, -+ 0x080c, 0xc838, 0x0168, 0x6014, 0x2048, 0xa867, 0x0103, 0xa87b, -+ 0x0006, 0xa877, 0x0000, 0xa880, 0xc0ed, 0xa882, 0x080c, 0x6d80, -+ 0x2c68, 0x080c, 0xab97, 0x0150, 0x6810, 0x6012, 0x080c, 0xcccc, -+ 0x00c6, 0x2d60, 0x080c, 0xac28, 0x00ce, 0x0008, 0x2d60, 0x6017, -+ 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, -+ 0x9225, 0x080c, 0x96a0, 0x00c8, 0x080c, 0xcf46, 0x0138, 0x6034, -+ 0x9086, 0x4000, 0x1118, 0x080c, 0x31e7, 0x08d0, 0x6034, 0x908c, -+ 0xff00, 0x810f, 0x9186, 0x0039, 0x0118, 0x9186, 0x0035, 0x1118, -+ 0x080c, 0x31e7, 0x0868, 0x080c, 0xac28, 0x0005, 0x6000, 0x908a, -+ 0x0016, 0x1a0c, 0x0d7d, 0x0002, 0xc814, 0xc814, 0xc816, 0xc816, -+ 0xc816, 0xc814, 0xc814, 0xac28, 0xc814, 0xc814, 0xc814, 0xc814, -+ 0xc814, 0xc814, 0xc814, 0xc814, 0x080c, 0x0d7d, 0x080c, 0xa896, -+ 0x080c, 0xaa2a, 0x080c, 0xa8b2, 0x6114, 0x0096, 0x2148, 0xa87b, -+ 0x0006, 0x080c, 0x6d80, 0x009e, 0x0804, 0xabed, 0x9284, 0x0003, -+ 0x1158, 0x9282, 0x1ddc, 0x0240, 0x2001, 0x181a, 0x2004, 0x9202, -+ 0x1218, 0x9085, 0x0001, 0x0005, 0x9006, 0x0ce8, 0x0096, 0x0028, -+ 0x0096, 0x0006, 0x6014, 0x2048, 0x000e, 0x0006, 0x9984, 0xf000, -+ 0x9086, 0xf000, 0x0110, 0x080c, 0x10e5, 0x000e, 0x009e, 0x0005, -+ 0x00e6, 0x00c6, 0x0036, 0x0006, 0x0126, 0x2091, 0x8000, 0x2061, -+ 0x1ddc, 0x2071, 0x1800, 0x7354, 0x7074, 0x9302, 0x1640, 0x6020, -+ 0x9206, 0x11f8, 0x080c, 0xcf52, 0x0180, 0x9286, 0x0001, 0x1168, -+ 0x6004, 0x9086, 0x0004, 0x1148, 0x080c, 0x31e7, 0x080c, 0xcf67, -+ 0x00c6, 0x080c, 0xac28, 0x00ce, 0x0060, 0x080c, 0xcc3e, 0x0148, -+ 0x080c, 0xca4d, 0x1110, 0x080c, 0xb5b5, 0x00c6, 0x080c, 0xabed, -+ 0x00ce, 0x9ce0, 0x001c, 0x7068, 0x9c02, 0x1208, 0x08a0, 0x012e, -+ 0x000e, 0x003e, 0x00ce, 0x00ee, 0x0005, 0x00e6, 0x00c6, 0x0016, -+ 0x9188, 0x1000, 0x210c, 0x81ff, 0x0128, 0x2061, 0x1b32, 0x6112, -+ 0x080c, 0x31e7, 0x9006, 0x0010, 0x9085, 0x0001, 0x001e, 0x00ce, -+ 0x00ee, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xab97, -+ 0x01b0, 0x665e, 0x2b00, 0x6012, 0x080c, 0x56e2, 0x0118, 0x080c, -+ 0xc969, 0x0168, 0x080c, 0xcccc, 0x6023, 0x0003, 0x2009, 0x004b, -+ 0x080c, 0xac8c, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, -+ 0x0cd8, 0x00c6, 0x0126, 0x2091, 0x8000, 0xbaa0, 0x080c, 0xac5f, -+ 0x0580, 0x605f, 0x0000, 0x2b00, 0x6012, 0x080c, 0xcccc, 0x6023, -+ 0x0003, 0x0016, 0x080c, 0xa896, 0x080c, 0x93a5, 0x0076, 0x903e, -+ 0x080c, 0x9277, 0x2c08, 0x080c, 0xdfeb, 0x007e, 0x080c, 0xa8b2, -+ 0x001e, 0xd184, 0x0128, 0x080c, 0xabed, 0x9085, 0x0001, 0x0070, -+ 0x080c, 0x56e2, 0x0128, 0xd18c, 0x1170, 0x080c, 0xc969, 0x0148, -+ 0x2009, 0x004c, 0x080c, 0xac8c, 0x9085, 0x0001, 0x012e, 0x00ce, -+ 0x0005, 0x9006, 0x0cd8, 0x2900, 0x6016, 0x0c90, 0x2009, 0x004d, -+ 0x0010, 0x2009, 0x004e, 0x00f6, 0x00c6, 0x0046, 0x0016, 0x080c, -+ 0xab97, 0x2c78, 0x0590, 0x7e5e, 0x2b00, 0x7812, 0x7823, 0x0003, -+ 0x2021, 0x0005, 0x080c, 0xc97b, 0x9186, 0x004d, 0x0118, 0x9186, -+ 0x004e, 0x0148, 0x2001, 0x1980, 0x200c, 0xd1fc, 0x0168, 0x2f60, -+ 0x080c, 0xabed, 0x00d0, 0x2001, 0x197f, 0x200c, 0xd1fc, 0x0120, -+ 0x2f60, 0x080c, 0xabed, 0x0088, 0x2f60, 0x080c, 0x56e2, 0x0138, -+ 0xd18c, 0x1118, 0x04f1, 0x0148, 0x0010, 0x2900, 0x7816, 0x001e, -+ 0x0016, 0x080c, 0xac8c, 0x9085, 0x0001, 0x001e, 0x004e, 0x00ce, -+ 0x00fe, 0x0005, 0x00f6, 0x00c6, 0x0046, 0x080c, 0xab97, 0x2c78, -+ 0x0508, 0x7e5e, 0x2b00, 0x7812, 0x7823, 0x0003, 0x0096, 0x2021, -+ 0x0004, 0x0489, 0x009e, 0x2001, 0x197e, 0x200c, 0xd1fc, 0x0120, -+ 0x2f60, 0x080c, 0xabed, 0x0060, 0x2f60, 0x080c, 0x56e2, 0x0120, -+ 0xd18c, 0x1160, 0x0071, 0x0130, 0x2009, 0x0052, 0x080c, 0xac8c, -+ 0x9085, 0x0001, 0x004e, 0x00ce, 0x00fe, 0x0005, 0x2900, 0x7816, -+ 0x0c98, 0x00c6, 0x080c, 0x4aa7, 0x00ce, 0x1120, 0x080c, 0xabed, -+ 0x9006, 0x0005, 0xa867, 0x0000, 0xa86b, 0x8000, 0x2900, 0x6016, -+ 0x9085, 0x0001, 0x0005, 0x0096, 0x0076, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0xa896, 0x080c, 0x6804, 0x0158, 0x2001, 0xc982, 0x0006, -+ 0x900e, 0x2400, 0x080c, 0x6fc0, 0x080c, 0x6d80, 0x000e, 0x0807, -+ 0x2418, 0x080c, 0x95a4, 0xbaa0, 0x0086, 0x2041, 0x0001, 0x2039, -+ 0x0001, 0x2608, 0x080c, 0x93bf, 0x008e, 0x080c, 0x9277, 0x2f08, -+ 0x2648, 0x080c, 0xdfeb, 0xb93c, 0x81ff, 0x090c, 0x9496, 0x080c, -+ 0xa8b2, 0x012e, 0x007e, 0x009e, 0x0005, 0x00c6, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0xab97, 0x0190, 0x660a, 0x2b08, 0x6112, 0x080c, -+ 0xcccc, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x001f, 0x080c, -+ 0xac8c, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, -+ 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xac5f, 0x01b8, 0x660a, -+ 0x2b08, 0x6112, 0x080c, 0xcccc, 0x6023, 0x0008, 0x2900, 0x6016, -+ 0x00f6, 0x2c78, 0x080c, 0x1731, 0x00fe, 0x2009, 0x0021, 0x080c, -+ 0xac8c, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, -+ 0x2009, 0x003d, 0x00c6, 0x0126, 0x0016, 0x2091, 0x8000, 0x080c, -+ 0xab97, 0x0198, 0x660a, 0x2b08, 0x6112, 0x080c, 0xcccc, 0x6023, -+ 0x0001, 0x2900, 0x6016, 0x001e, 0x0016, 0x080c, 0xac8c, 0x9085, -+ 0x0001, 0x001e, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd0, 0x00c6, -+ 0x0126, 0x2091, 0x8000, 0x080c, 0xac5f, 0x0188, 0x2b08, 0x6112, -+ 0x080c, 0xcccc, 0x6023, 0x0001, 0x2900, 0x6016, 0x2009, 0x0000, -+ 0x080c, 0xac8c, 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, -+ 0x0cd8, 0x2009, 0x0044, 0x0830, 0x2009, 0x0049, 0x0818, 0x0026, -+ 0x00b6, 0x6210, 0x2258, 0xba3c, 0x82ff, 0x0118, 0x8211, 0xba3e, -+ 0x1140, 0xb8d0, 0x9005, 0x0128, 0xb888, 0x9005, 0x1110, 0xb88b, -+ 0x0001, 0x00be, 0x002e, 0x0005, 0x0006, 0x0016, 0x6004, 0x908e, -+ 0x0002, 0x0140, 0x908e, 0x0003, 0x0128, 0x908e, 0x0004, 0x0110, -+ 0x9085, 0x0001, 0x001e, 0x000e, 0x0005, 0x0006, 0x0096, 0x6020, -+ 0x9086, 0x0004, 0x0190, 0x6014, 0x904d, 0x080c, 0xc838, 0x0168, -+ 0xa864, 0x9086, 0x0139, 0x0158, 0x6020, 0x9086, 0x0003, 0x0128, -+ 0xa868, 0xd0fc, 0x0110, 0x9006, 0x0010, 0x9085, 0x0001, 0x009e, -+ 0x000e, 0x0005, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, 0xac5f, -+ 0x0198, 0x2b08, 0x6112, 0x080c, 0xcccc, 0x6023, 0x0001, 0x2900, -+ 0x6016, 0x080c, 0x31e7, 0x2009, 0x0028, 0x080c, 0xac8c, 0x9085, -+ 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x9186, 0x0015, -+ 0x11a8, 0x2011, 0x1824, 0x2204, 0x9086, 0x0074, 0x1178, 0x00b6, -+ 0x080c, 0xb807, 0x00be, 0x080c, 0xba2a, 0x6003, 0x0001, 0x6007, -+ 0x0029, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0078, 0x6014, 0x0096, -+ 0x2048, 0xa868, 0x009e, 0xd0fc, 0x0148, 0x2001, 0x0001, 0x080c, -+ 0xce8b, 0x080c, 0xb5b5, 0x080c, 0xabed, 0x0005, 0x0096, 0x6014, -+ 0x904d, 0x090c, 0x0d7d, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, -+ 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x6d80, 0x012e, 0x009e, 0x080c, 0xabed, 0x0c30, 0x0096, -+ 0x9186, 0x0016, 0x1128, 0x2001, 0x0004, 0x080c, 0x6575, 0x00e8, -+ 0x9186, 0x0015, 0x1510, 0x2011, 0x1824, 0x2204, 0x9086, 0x0014, -+ 0x11e0, 0x6010, 0x00b6, 0x2058, 0x080c, 0x66c0, 0x00be, 0x080c, -+ 0xbafb, 0x1198, 0x6010, 0x00b6, 0x2058, 0xb890, 0x00be, 0x9005, -+ 0x0160, 0x2001, 0x0006, 0x080c, 0x6575, 0x6014, 0x2048, 0xa868, -+ 0xd0fc, 0x0170, 0x080c, 0xaffd, 0x0048, 0x6014, 0x2048, 0xa868, -+ 0xd0fc, 0x0528, 0x080c, 0xb5b5, 0x080c, 0xabed, 0x009e, 0x0005, -+ 0x6014, 0x6310, 0x2358, 0x904d, 0x090c, 0x0d7d, 0xa87b, 0x0000, -+ 0xa883, 0x0000, 0xa897, 0x4000, 0x900e, 0x080c, 0x6914, 0x1108, -+ 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, 0xa99a, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0x6d80, 0x012e, 0x080c, 0xabed, 0x08f8, 0x6014, -+ 0x904d, 0x090c, 0x0d7d, 0xa87b, 0x0030, 0xa883, 0x0000, 0xa897, -+ 0x4005, 0xa89b, 0x0004, 0xa867, 0x0139, 0x0126, 0x2091, 0x8000, -+ 0x080c, 0x6d80, 0x012e, 0x080c, 0xabed, 0x0840, 0xa878, 0x9086, -+ 0x0005, 0x1108, 0x0009, 0x0005, 0xa880, 0xc0ad, 0xa882, 0x0005, -+ 0x604b, 0x0000, 0x6017, 0x0000, 0x6003, 0x0001, 0x6007, 0x0050, -+ 0x2009, 0x8023, 0x080c, 0x921e, 0x0005, 0x00c6, 0x6010, 0x00b6, -+ 0x2058, 0xb800, 0x00be, 0xd0bc, 0x0130, 0x0066, 0x6020, 0x9084, -+ 0x000f, 0x001b, 0x006e, 0x00ce, 0x0005, 0xc556, 0xcb6f, 0xcb6f, -+ 0xcb72, 0xe318, 0xe333, 0xe336, 0xc556, 0xc556, 0xc556, 0xc556, -+ 0xc556, 0xc556, 0xc556, 0xc556, 0xc556, 0x080c, 0x0d7d, 0xa001, -+ 0xa001, 0x0005, 0x0096, 0x6014, 0x904d, 0x0118, 0xa87c, 0xd0e4, -+ 0x1110, 0x009e, 0x0010, 0x009e, 0x0005, 0x6010, 0x00b6, 0x2058, -+ 0xb800, 0x00be, 0xd0bc, 0x0550, 0x2001, 0x1834, 0x2004, 0x9005, -+ 0x1540, 0x00f6, 0x2c78, 0x080c, 0xab97, 0x0508, 0x7810, 0x6012, -+ 0x080c, 0xcccc, 0x7820, 0x9086, 0x0003, 0x0128, 0x7808, 0x603a, -+ 0x2f00, 0x603e, 0x0020, 0x7808, 0x603e, 0x2f00, 0x603a, 0x602e, -+ 0x6023, 0x0001, 0x6007, 0x0035, 0x6003, 0x0001, 0x795c, 0x615e, -+ 0x2009, 0x8020, 0x080c, 0x921e, 0x2f60, 0x00fe, 0x0005, 0x2f60, -+ 0x00fe, 0x2001, 0x1988, 0x2004, 0x604a, 0x0005, 0x0016, 0x0096, -+ 0x6814, 0x2048, 0x681c, 0xd0fc, 0xc0fc, 0x681e, 0xa87c, 0x1108, -+ 0xd0e4, 0x0180, 0xc0e4, 0xa87e, 0xa877, 0x0000, 0xa893, 0x0000, -+ 0xa88f, 0x0000, 0xd0cc, 0x0130, 0xc0cc, 0xa87e, 0xa878, 0x2048, -+ 0x080c, 0x0fec, 0x6830, 0x6036, 0x908e, 0x0001, 0x0148, 0x6803, -+ 0x0002, 0x9086, 0x0005, 0x0170, 0x9006, 0x602e, 0x6032, 0x00d0, -+ 0x681c, 0xc085, 0x681e, 0x6803, 0x0004, 0x6824, 0xc0f4, 0x9085, -+ 0x0c00, 0x6826, 0x6814, 0x2048, 0xa8ac, 0x6938, 0x9102, 0xa8b0, -+ 0x693c, 0x9103, 0x1e48, 0x683c, 0x602e, 0x6838, 0x9084, 0xfffc, -+ 0x683a, 0x6032, 0x2d00, 0x603a, 0x6808, 0x603e, 0x6910, 0x6112, -+ 0x695c, 0x615e, 0x6023, 0x0001, 0x6007, 0x0039, 0x6003, 0x0001, -+ 0x2009, 0x8020, 0x080c, 0x921e, 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, 0x1982, 0x200c, 0x8000, 0x2014, -+ 0x2001, 0x0032, 0x080c, 0x9166, 0x2001, 0x1986, 0x82ff, 0x1110, -+ 0x2011, 0x0014, 0x2202, 0x2001, 0x1984, 0x200c, 0x8000, 0x2014, -+ 0x2071, 0x196c, 0x711a, 0x721e, 0x2001, 0x0064, 0x080c, 0x9166, -+ 0x2001, 0x1987, 0x82ff, 0x1110, 0x2011, 0x0014, 0x2202, 0x2001, -+ 0x1988, 0x9288, 0x000a, 0x2102, 0x2001, 0x0017, 0x080c, 0xa887, -+ 0x2001, 0x1a89, 0x2102, 0x2001, 0x0032, 0x080c, 0x1679, 0x080c, -+ 0x6a4c, 0x00ee, 0x003e, 0x002e, 0x001e, 0x000e, 0x0005, 0x0006, -+ 0x0016, 0x00e6, 0x2001, 0x1986, 0x2003, 0x0028, 0x2001, 0x1987, -+ 0x2003, 0x0014, 0x2071, 0x196c, 0x701b, 0x0000, 0x701f, 0x07d0, -+ 0x2001, 0x1988, 0x2009, 0x001e, 0x2102, 0x2001, 0x0017, 0x080c, -+ 0xa887, 0x2001, 0x1a89, 0x2102, 0x2001, 0x0032, 0x080c, 0x1679, -+ 0x00ee, 0x001e, 0x000e, 0x0005, 0x0096, 0x6060, 0x904d, 0x0110, -+ 0x080c, 0x106c, 0x009e, 0x0005, 0x0005, 0x00c6, 0x0126, 0x2091, -+ 0x8000, 0x080c, 0xab97, 0x0180, 0x2b08, 0x6112, 0x0ca9, 0x6023, -+ 0x0001, 0x2900, 0x6016, 0x2009, 0x0033, 0x080c, 0xac8c, 0x9085, -+ 0x0001, 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x0096, 0x00e6, -+ 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1500, 0x7090, 0x9086, -+ 0x0018, 0x11e0, 0x6014, 0x2048, 0xaa3c, 0xd2e4, 0x1160, 0x2c78, -+ 0x080c, 0x975f, 0x01d8, 0x707c, 0xaa50, 0x9206, 0x1160, 0x7080, -+ 0xaa54, 0x9206, 0x1140, 0x6210, 0x00b6, 0x2258, 0xbaa0, 0x00be, -+ 0x900e, 0x080c, 0x323c, 0x080c, 0xaffd, 0x0020, 0x080c, 0xb5b5, -+ 0x080c, 0xabed, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaa54, -+ 0x9206, 0x0d48, 0x0c80, 0x00c6, 0x0126, 0x2091, 0x8000, 0x080c, -+ 0xab97, 0x0188, 0x2b08, 0x6112, 0x080c, 0xcccc, 0x6023, 0x0001, -+ 0x2900, 0x6016, 0x2009, 0x004d, 0x080c, 0xac8c, 0x9085, 0x0001, -+ 0x012e, 0x00ce, 0x0005, 0x9006, 0x0cd8, 0x00c6, 0x0126, 0x2091, -+ 0x8000, 0x0016, 0x080c, 0xab97, 0x0180, 0x2b08, 0x6112, 0x080c, -+ 0xcccc, 0x6023, 0x0001, 0x2900, 0x6016, 0x001e, 0x080c, 0xac8c, -+ 0x9085, 0x0001, 0x012e, 0x00ce, 0x0005, 0x001e, 0x9006, 0x0cd0, -+ 0x0016, 0x0026, 0x0036, 0x0046, 0x0056, 0x0066, 0x0096, 0x00e6, -+ 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, 0x1568, 0x7190, 0x6014, -+ 0x2048, 0xa814, 0x8003, 0x9106, 0x1530, 0x20e1, 0x0000, 0x2001, -+ 0x19a0, 0x2003, 0x0000, 0x6014, 0x2048, 0xa830, 0x20a8, 0x8906, -+ 0x8006, 0x8007, 0x9094, 0x003f, 0x22e8, 0x9084, 0xffc0, 0x9080, -+ 0x001b, 0x20a0, 0x2001, 0x19a0, 0x0016, 0x200c, 0x080c, 0xd565, -+ 0x001e, 0xa804, 0x9005, 0x0110, 0x2048, 0x0c38, 0x6014, 0x2048, -+ 0xa867, 0x0103, 0x0010, 0x080c, 0xb5b5, 0x080c, 0xabed, 0x00fe, -+ 0x00ee, 0x009e, 0x006e, 0x005e, 0x004e, 0x003e, 0x002e, 0x001e, -+ 0x0005, 0x0096, 0x00e6, 0x00f6, 0x2071, 0x1800, 0x9186, 0x0015, -+ 0x11b8, 0x7090, 0x9086, 0x0004, 0x1198, 0x6014, 0x2048, 0x2c78, -+ 0x080c, 0x975f, 0x01a8, 0x707c, 0xaa74, 0x9206, 0x1130, 0x7080, -+ 0xaa78, 0x9206, 0x1110, 0x080c, 0x31e7, 0x080c, 0xaffd, 0x0020, -+ 0x080c, 0xb5b5, 0x080c, 0xabed, 0x00fe, 0x00ee, 0x009e, 0x0005, -+ 0x7060, 0xaa78, 0x9206, 0x0d78, 0x0c80, 0x0096, 0x00e6, 0x00f6, -+ 0x2071, 0x1800, 0x9186, 0x0015, 0x1550, 0x7090, 0x9086, 0x0004, -+ 0x1530, 0x6014, 0x2048, 0x2c78, 0x080c, 0x975f, 0x05f0, 0x707c, -+ 0xaacc, 0x9206, 0x1180, 0x7080, 0xaad0, 0x9206, 0x1160, 0x080c, -+ 0x31e7, 0x0016, 0xa998, 0xaab0, 0x9284, 0x1000, 0xc0fd, 0x080c, -+ 0x5692, 0x001e, 0x0010, 0x080c, 0x547b, 0x080c, 0xc838, 0x0508, -+ 0xa87b, 0x0000, 0xa883, 0x0000, 0xa897, 0x4000, 0x0080, 0x080c, -+ 0xc838, 0x01b8, 0x6014, 0x2048, 0x080c, 0x547b, 0x1d70, 0xa87b, -+ 0x0030, 0xa883, 0x0000, 0xa897, 0x4005, 0xa89b, 0x0004, 0x0126, -+ 0x2091, 0x8000, 0xa867, 0x0139, 0x080c, 0x6d80, 0x012e, 0x080c, -+ 0xabed, 0x00fe, 0x00ee, 0x009e, 0x0005, 0x7060, 0xaad0, 0x9206, -+ 0x0930, 0x0888, 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, 0x080c, 0xc838, 0x0904, 0xce87, -+ 0x0096, 0x6314, 0x2348, 0xa87a, 0xa982, 0x929e, 0x4000, 0x1580, -+ 0x6310, 0x00c6, 0x2358, 0x2009, 0x0000, 0xa868, 0xd0f4, 0x1140, -+ 0x080c, 0x6914, 0x1108, 0xc185, 0xb800, 0xd0bc, 0x0108, 0xc18d, -+ 0xaa96, 0xa99a, 0x20a9, 0x0004, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x0031, 0x20a0, 0xb8c4, 0x20e0, 0xb8c8, 0x9080, 0x0006, 0x2098, -+ 0x080c, 0x0fb7, 0x20a9, 0x0004, 0xa85c, 0x9080, 0x0035, 0x20a0, -+ 0xb8c8, 0x9080, 0x000a, 0x2098, 0x080c, 0x0fb7, 0x00ce, 0x0090, -+ 0xaa96, 0x3918, 0x9398, 0x0007, 0x231c, 0x6004, 0x9086, 0x0016, -+ 0x0110, 0xa89b, 0x0004, 0xaba2, 0x6310, 0x2358, 0xb804, 0x9084, -+ 0x00ff, 0xa89e, 0x080c, 0x6d74, 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, 0x25fb, -+ 0x2118, 0x831f, 0x939c, 0xff00, 0x7838, 0x9084, 0x00ff, 0x931d, -+ 0x7c3c, 0x2011, 0x8018, 0x080c, 0x4b07, 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, 0xc826, 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, 0xbeb3, 0x0005, 0x0036, 0x2019, 0x0001, 0x0010, -+ 0x0036, 0x901e, 0x0499, 0x01e0, 0x080c, 0xc838, 0x01c8, 0x080c, -+ 0xca27, 0x6037, 0x4000, 0x6014, 0x6017, 0x0000, 0x0096, 0x2048, -+ 0xa87c, 0x080c, 0xca4d, 0x1118, 0x080c, 0xb5b5, 0x0040, 0xa867, -+ 0x0103, 0xa877, 0x0000, 0x83ff, 0x1129, 0x080c, 0x6d80, 0x009e, -+ 0x003e, 0x0005, 0xa880, 0xd0b4, 0x0128, 0xa87b, 0x0006, 0xc0ec, -+ 0xa882, 0x0048, 0xd0bc, 0x0118, 0xa87b, 0x0002, 0x0020, 0xa87b, -+ 0x0005, 0x080c, 0xcb3c, 0xa877, 0x0000, 0x0005, 0x2001, 0x1810, -+ 0x2004, 0xd0ec, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0f4, -+ 0x000e, 0x0005, 0x0006, 0x2001, 0x1810, 0x2004, 0xd0e4, 0x000e, -+ 0x0005, 0x0036, 0x0046, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, -+ 0x2021, 0x0007, 0x080c, 0x4cbe, 0x004e, 0x003e, 0x0005, 0x0c51, -+ 0x1d81, 0x0005, 0x2001, 0x1986, 0x2004, 0x601a, 0x0005, 0x2001, -+ 0x1988, 0x2004, 0x604a, 0x0005, 0x080c, 0xabed, 0x0804, 0x96a0, -+ 0x611c, 0xd1fc, 0xa97c, 0x1108, 0xd1e4, 0x0005, 0x601c, 0xd0fc, -+ 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x601c, 0xd0fc, 0xc0fc, 0x601e, -+ 0xa87c, 0x1108, 0xd0e4, 0x0005, 0x6044, 0xd0fc, 0x0160, 0xd0dc, -+ 0x1128, 0x908c, 0x000f, 0x9186, 0x0005, 0x1118, 0x6003, 0x0003, -+ 0x0010, 0x6003, 0x0001, 0x0005, 0x00b6, 0x0066, 0x6000, 0x90b2, -+ 0x0016, 0x1a0c, 0x0d7d, 0x001b, 0x006e, 0x00be, 0x0005, 0xcfb7, -+ 0xd6c0, 0xd811, 0xcfb7, 0xcfb7, 0xcfb7, 0xcfb7, 0xcfb7, 0xcfee, -+ 0xd893, 0xcfb7, 0xcfb7, 0xcfb7, 0xcfb7, 0xcfb7, 0xcfb7, 0x080c, -+ 0x0d7d, 0x0066, 0x6000, 0x90b2, 0x0016, 0x1a0c, 0x0d7d, 0x0013, -+ 0x006e, 0x0005, 0xcfd2, 0xddaa, 0xcfd2, 0xcfd2, 0xcfd2, 0xcfd2, -+ 0xcfd2, 0xcfd2, 0xdd59, 0xddfc, 0xcfd2, 0xe453, 0xe487, 0xe453, -+ 0xe487, 0xcfd2, 0x080c, 0x0d7d, 0x6000, 0x9082, 0x0016, 0x1a0c, -+ 0x0d7d, 0x6000, 0x000a, 0x0005, 0xcfec, 0xda6f, 0xdb38, 0xdb5a, -+ 0xdbd5, 0xcfec, 0xdccf, 0xdc5d, 0xd89d, 0xdd31, 0xdd46, 0xcfec, -+ 0xcfec, 0xcfec, 0xcfec, 0xcfec, 0x080c, 0x0d7d, 0x91b2, 0x0053, -+ 0x1a0c, 0x0d7d, 0x2100, 0x91b2, 0x0040, 0x1a04, 0xd436, 0x0002, -+ 0xd038, 0xd227, 0xd038, 0xd038, 0xd038, 0xd230, 0xd038, 0xd038, -+ 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, -+ 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd03a, -+ 0xd0a1, 0xd0b0, 0xd114, 0xd13f, 0xd1b8, 0xd212, 0xd038, 0xd038, -+ 0xd233, 0xd038, 0xd038, 0xd248, 0xd255, 0xd038, 0xd038, 0xd038, -+ 0xd038, 0xd038, 0xd2d8, 0xd038, 0xd038, 0xd2ec, 0xd038, 0xd038, -+ 0xd2a7, 0xd038, 0xd038, 0xd038, 0xd304, 0xd038, 0xd038, 0xd038, -+ 0xd381, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd038, 0xd3fe, -+ 0x080c, 0x0d7d, 0x080c, 0x6a29, 0x1150, 0x2001, 0x1837, 0x2004, -+ 0xd0cc, 0x1128, 0x9084, 0x0009, 0x9086, 0x0008, 0x1140, 0x6007, -+ 0x0009, 0x602f, 0x0009, 0x6017, 0x0000, 0x0804, 0xd220, 0x080c, -+ 0x69c5, 0x00e6, 0x00c6, 0x0036, 0x0026, 0x0016, 0x6210, 0x2258, -+ 0xbaa0, 0x0026, 0x2019, 0x0029, 0x080c, 0xa896, 0x080c, 0x93a5, -+ 0x0076, 0x903e, 0x080c, 0x9277, 0x2c08, 0x080c, 0xdfeb, 0x007e, -+ 0x001e, 0x080c, 0xa8b2, 0x001e, 0x002e, 0x003e, 0x00ce, 0x00ee, -+ 0x6610, 0x2658, 0x080c, 0x6634, 0xbe04, 0x9684, 0x00ff, 0x9082, -+ 0x0006, 0x1268, 0x0016, 0x0026, 0x6210, 0x00b6, 0x2258, 0xbaa0, -+ 0x00be, 0x2c08, 0x080c, 0xe6b0, 0x002e, 0x001e, 0x1178, 0x080c, -+ 0xdf19, 0x1904, 0xd10c, 0x080c, 0xdeb5, 0x1120, 0x6007, 0x0008, -+ 0x0804, 0xd220, 0x6007, 0x0009, 0x0804, 0xd220, 0x080c, 0xe14c, -+ 0x0128, 0x080c, 0xdf19, 0x0d78, 0x0804, 0xd10c, 0x6017, 0x1900, -+ 0x0c88, 0x080c, 0x3332, 0x1904, 0xd433, 0x6106, 0x080c, 0xde66, -+ 0x6007, 0x0006, 0x0804, 0xd220, 0x6007, 0x0007, 0x0804, 0xd220, -+ 0x080c, 0xe4c3, 0x1904, 0xd433, 0x080c, 0x3332, 0x1904, 0xd433, -+ 0x00d6, 0x6610, 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, -+ 0x1220, 0x2001, 0x0001, 0x080c, 0x6561, 0x96b4, 0xff00, 0x8637, -+ 0x9686, 0x0006, 0x0188, 0x9686, 0x0004, 0x0170, 0xbe04, 0x96b4, -+ 0x00ff, 0x9686, 0x0006, 0x0140, 0x9686, 0x0004, 0x0128, 0x9686, -+ 0x0005, 0x0110, 0x00de, 0x0480, 0x00e6, 0x2071, 0x0260, 0x7034, -+ 0x9084, 0x0003, 0x1140, 0x7034, 0x9082, 0x0014, 0x0220, 0x7030, -+ 0x9084, 0x0003, 0x0130, 0x00ee, 0x6017, 0x0000, 0x602f, 0x0007, -+ 0x00b0, 0x00ee, 0x080c, 0xdf81, 0x1190, 0x9686, 0x0006, 0x1140, -+ 0x0026, 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x323c, 0x002e, -+ 0x080c, 0x66c0, 0x6007, 0x000a, 0x00de, 0x0804, 0xd220, 0x6007, -+ 0x000b, 0x00de, 0x0804, 0xd220, 0x080c, 0x31e7, 0x080c, 0xcf67, -+ 0x6007, 0x0001, 0x0804, 0xd220, 0x080c, 0xe4c3, 0x1904, 0xd433, -+ 0x080c, 0x3332, 0x1904, 0xd433, 0x2071, 0x0260, 0x7034, 0x90b4, -+ 0x0003, 0x1948, 0x90b2, 0x0014, 0x0a30, 0x7030, 0x9084, 0x0003, -+ 0x1910, 0x6610, 0x2658, 0xbe04, 0x9686, 0x0707, 0x09e8, 0x0026, -+ 0x6210, 0x2258, 0xbaa0, 0x900e, 0x080c, 0x323c, 0x002e, 0x6007, -+ 0x000c, 0x2001, 0x0001, 0x080c, 0xe690, 0x0804, 0xd220, 0x080c, -+ 0x6a29, 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, 0x9086, -+ 0x0008, 0x1110, 0x0804, 0xd047, 0x080c, 0x69c5, 0x6610, 0x2658, -+ 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x06c8, 0x1138, 0x0026, -+ 0x2001, 0x0006, 0x080c, 0x65a1, 0x002e, 0x0050, 0x96b4, 0xff00, -+ 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, 0x1904, 0xd10c, -+ 0x080c, 0xdf8e, 0x1120, 0x6007, 0x000e, 0x0804, 0xd220, 0x0046, -+ 0x6410, 0x2458, 0xbca0, 0x0046, 0x080c, 0x31e7, 0x080c, 0xcf67, -+ 0x004e, 0x0016, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0148, -+ 0x2009, 0x0029, 0x080c, 0xe2c9, 0x6010, 0x2058, 0xb800, 0xc0e5, -+ 0xb802, 0x001e, 0x004e, 0x6007, 0x0001, 0x0804, 0xd220, 0x2001, -+ 0x0001, 0x080c, 0x6561, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, -+ 0x0004, 0x2019, 0x1805, 0x2011, 0x0270, 0x080c, 0xbbae, 0x003e, -+ 0x002e, 0x001e, 0x015e, 0x9005, 0x0168, 0x96b4, 0xff00, 0x8637, -+ 0x9682, 0x0004, 0x0a04, 0xd10c, 0x9682, 0x0007, 0x0a04, 0xd168, -+ 0x0804, 0xd10c, 0x6017, 0x1900, 0x6007, 0x0009, 0x0804, 0xd220, -+ 0x080c, 0x6a29, 0x1140, 0x2001, 0x1837, 0x2004, 0x9084, 0x0009, -+ 0x9086, 0x0008, 0x1110, 0x0804, 0xd047, 0x080c, 0x69c5, 0x6610, -+ 0x2658, 0xbe04, 0x9684, 0x00ff, 0x9082, 0x0006, 0x0698, 0x0150, -+ 0x96b4, 0xff00, 0x8637, 0x9686, 0x0004, 0x0120, 0x9686, 0x0006, -+ 0x1904, 0xd10c, 0x080c, 0xdfbc, 0x1130, 0x080c, 0xdeb5, 0x1118, -+ 0x6007, 0x0010, 0x04e8, 0x0046, 0x6410, 0x2458, 0xbca0, 0x0046, -+ 0x080c, 0x31e7, 0x080c, 0xcf67, 0x004e, 0x0016, 0x9006, 0x2009, -+ 0x1848, 0x210c, 0xd1a4, 0x0148, 0x2009, 0x0029, 0x080c, 0xe2c9, -+ 0x6010, 0x2058, 0xb800, 0xc0e5, 0xb802, 0x001e, 0x004e, 0x6007, -+ 0x0001, 0x00f0, 0x080c, 0xe14c, 0x0140, 0x96b4, 0xff00, 0x8637, -+ 0x9686, 0x0006, 0x0978, 0x0804, 0xd10c, 0x6017, 0x1900, 0x6007, -+ 0x0009, 0x0070, 0x080c, 0x3332, 0x1904, 0xd433, 0x080c, 0xe4c3, -+ 0x1904, 0xd433, 0x080c, 0xd600, 0x1904, 0xd10c, 0x6007, 0x0012, -+ 0x6003, 0x0001, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0005, 0x6007, -+ 0x0001, 0x6003, 0x0001, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0cb0, -+ 0x6007, 0x0005, 0x0c68, 0x080c, 0xe4c3, 0x1904, 0xd433, 0x080c, -+ 0x3332, 0x1904, 0xd433, 0x080c, 0xd600, 0x1904, 0xd10c, 0x6007, -+ 0x0020, 0x6003, 0x0001, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0005, -+ 0x080c, 0x3332, 0x1904, 0xd433, 0x6007, 0x0023, 0x6003, 0x0001, -+ 0x080c, 0x9225, 0x080c, 0x96a0, 0x0005, 0x080c, 0xe4c3, 0x1904, -+ 0xd433, 0x080c, 0x3332, 0x1904, 0xd433, 0x080c, 0xd600, 0x1904, -+ 0xd10c, 0x0016, 0x0026, 0x00e6, 0x2071, 0x0260, 0x7244, 0x9286, -+ 0xffff, 0x0180, 0x2c08, 0x080c, 0xc826, 0x01b0, 0x2260, 0x7240, -+ 0x6008, 0x9206, 0x1188, 0x6010, 0x9190, 0x0004, 0x2214, 0x9206, -+ 0x01b8, 0x0050, 0x7240, 0x2c08, 0x9006, 0x080c, 0xe293, 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, 0xabed, 0x2160, 0x6007, 0x0025, 0x6003, 0x0001, 0x080c, -+ 0x9225, 0x080c, 0x96a0, 0x00ee, 0x002e, 0x001e, 0x0005, 0x2001, -+ 0x0001, 0x080c, 0x6561, 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, -+ 0x0004, 0x2019, 0x1805, 0x2011, 0x0276, 0x080c, 0xbbae, 0x003e, -+ 0x002e, 0x001e, 0x015e, 0x0120, 0x6007, 0x0031, 0x0804, 0xd220, -+ 0x080c, 0xb81f, 0x080c, 0x74e9, 0x1190, 0x0006, 0x0026, 0x0036, -+ 0x080c, 0x7503, 0x1138, 0x080c, 0x77ed, 0x080c, 0x6029, 0x080c, -+ 0x741a, 0x0010, 0x080c, 0x74bd, 0x003e, 0x002e, 0x000e, 0x0005, -+ 0x080c, 0x3332, 0x1904, 0xd433, 0x080c, 0xd600, 0x1904, 0xd10c, -+ 0x6106, 0x080c, 0xd61c, 0x1120, 0x6007, 0x002b, 0x0804, 0xd220, -+ 0x6007, 0x002c, 0x0804, 0xd220, 0x080c, 0xe4c3, 0x1904, 0xd433, -+ 0x080c, 0x3332, 0x1904, 0xd433, 0x080c, 0xd600, 0x1904, 0xd10c, -+ 0x6106, 0x080c, 0xd621, 0x1120, 0x6007, 0x002e, 0x0804, 0xd220, -+ 0x6007, 0x002f, 0x0804, 0xd220, 0x080c, 0x3332, 0x1904, 0xd433, -+ 0x00e6, 0x00d6, 0x00c6, 0x6010, 0x2058, 0xb904, 0x9184, 0x00ff, -+ 0x9086, 0x0006, 0x0158, 0x9184, 0xff00, 0x8007, 0x9086, 0x0006, -+ 0x0128, 0x00ce, 0x00de, 0x00ee, 0x0804, 0xd227, 0x080c, 0x56de, -+ 0xd0e4, 0x0904, 0xd37e, 0x2071, 0x026c, 0x7010, 0x603a, 0x7014, -+ 0x603e, 0x7108, 0x720c, 0x080c, 0x6a67, 0x0140, 0x6010, 0x2058, -+ 0xb810, 0x9106, 0x1118, 0xb814, 0x9206, 0x0510, 0x080c, 0x6a63, -+ 0x15b8, 0x2069, 0x1800, 0x6880, 0x9206, 0x1590, 0x687c, 0x9106, -+ 0x1578, 0x7210, 0x080c, 0xc826, 0x0590, 0x080c, 0xd4eb, 0x0578, -+ 0x080c, 0xe345, 0x0560, 0x622e, 0x6007, 0x0036, 0x6003, 0x0001, -+ 0x2009, 0x8020, 0x080c, 0x921e, 0x00ce, 0x00de, 0x00ee, 0x0005, -+ 0x7214, 0x9286, 0xffff, 0x0150, 0x080c, 0xc826, 0x01c0, 0x9280, -+ 0x0002, 0x2004, 0x7110, 0x9106, 0x1190, 0x08e0, 0x7210, 0x2c08, -+ 0x9085, 0x0001, 0x080c, 0xe293, 0x2c10, 0x2160, 0x0140, 0x0890, -+ 0x6007, 0x0037, 0x602f, 0x0009, 0x6017, 0x1500, 0x08b8, 0x6007, -+ 0x0037, 0x602f, 0x0003, 0x6017, 0x1700, 0x0880, 0x6007, 0x0012, -+ 0x0868, 0x080c, 0x3332, 0x1904, 0xd433, 0x6010, 0x2058, 0xb804, -+ 0x9084, 0xff00, 0x8007, 0x9086, 0x0006, 0x1904, 0xd227, 0x00e6, -+ 0x00d6, 0x00c6, 0x080c, 0x56de, 0xd0e4, 0x0904, 0xd3f6, 0x2069, -+ 0x1800, 0x2071, 0x026c, 0x7008, 0x603a, 0x720c, 0x623e, 0x9286, -+ 0xffff, 0x1150, 0x7208, 0x00c6, 0x2c08, 0x9085, 0x0001, 0x080c, -+ 0xe293, 0x2c10, 0x00ce, 0x05e8, 0x080c, 0xc826, 0x05d0, 0x7108, -+ 0x9280, 0x0002, 0x2004, 0x9106, 0x15a0, 0x00c6, 0x0026, 0x2260, -+ 0x080c, 0xc436, 0x002e, 0x00ce, 0x7118, 0x918c, 0xff00, 0x810f, -+ 0x9186, 0x0001, 0x0178, 0x9186, 0x0005, 0x0118, 0x9186, 0x0007, -+ 0x1198, 0x9280, 0x0005, 0x2004, 0x9005, 0x0170, 0x080c, 0xd4eb, -+ 0x0904, 0xd377, 0x0056, 0x7510, 0x7614, 0x080c, 0xe35e, 0x005e, -+ 0x00ce, 0x00de, 0x00ee, 0x0005, 0x6007, 0x003b, 0x602f, 0x0009, -+ 0x6017, 0x2a00, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x921e, -+ 0x0c78, 0x6007, 0x003b, 0x602f, 0x0003, 0x6017, 0x0300, 0x6003, -+ 0x0001, 0x2009, 0x8020, 0x080c, 0x921e, 0x0c10, 0x6007, 0x003b, -+ 0x602f, 0x000b, 0x6017, 0x0000, 0x0804, 0xd34e, 0x00e6, 0x0026, -+ 0x080c, 0x6a29, 0x0550, 0x080c, 0x69c5, 0x080c, 0xe535, 0x1518, -+ 0x2071, 0x1800, 0x70dc, 0x9085, 0x0003, 0x70de, 0x00f6, 0x2079, -+ 0x0100, 0x72b0, 0x9284, 0x00ff, 0x707e, 0x78e6, 0x9284, 0xff00, -+ 0x7280, 0x9205, 0x7082, 0x78ea, 0x00fe, 0x70e7, 0x0000, 0x080c, -+ 0x6a67, 0x0120, 0x2011, 0x1a09, 0x2013, 0x07d0, 0xd0ac, 0x1128, -+ 0x080c, 0x2fb2, 0x0010, 0x080c, 0xe567, 0x002e, 0x00ee, 0x080c, -+ 0xabed, 0x0804, 0xd226, 0x080c, 0xabed, 0x0005, 0x2600, 0x0002, -+ 0xd44a, 0xd47b, 0xd48c, 0xd44a, 0xd44a, 0xd44c, 0xd49d, 0xd44a, -+ 0xd44a, 0xd44a, 0xd469, 0xd44a, 0xd44a, 0xd44a, 0xd4a8, 0xd4b5, -+ 0xd4e6, 0xd44a, 0x080c, 0x0d7d, 0x080c, 0xe4c3, 0x1d20, 0x080c, -+ 0x3332, 0x1d08, 0x080c, 0xd600, 0x1148, 0x7038, 0x6016, 0x6007, -+ 0x0045, 0x6003, 0x0001, 0x080c, 0x9225, 0x0005, 0x080c, 0x31e7, -+ 0x080c, 0xcf67, 0x6007, 0x0001, 0x6003, 0x0001, 0x080c, 0x9225, -+ 0x0005, 0x080c, 0xe4c3, 0x1938, 0x080c, 0x3332, 0x1920, 0x080c, -+ 0xd600, 0x1d60, 0x703c, 0x6016, 0x6007, 0x004a, 0x6003, 0x0001, -+ 0x080c, 0x9225, 0x0005, 0x080c, 0x3332, 0x1904, 0xd433, 0x2009, -+ 0x0041, 0x080c, 0xe570, 0x6007, 0x0047, 0x6003, 0x0001, 0x080c, -+ 0x9225, 0x080c, 0x96a0, 0x0005, 0x080c, 0x3332, 0x1904, 0xd433, -+ 0x2009, 0x0042, 0x080c, 0xe570, 0x6007, 0x0047, 0x6003, 0x0001, -+ 0x080c, 0x9225, 0x080c, 0x96a0, 0x0005, 0x080c, 0x3332, 0x1904, -+ 0xd433, 0x2009, 0x0046, 0x080c, 0xe570, 0x080c, 0xabed, 0x0005, -+ 0x080c, 0xd508, 0x0904, 0xd433, 0x6007, 0x004e, 0x6003, 0x0001, -+ 0x080c, 0x9225, 0x080c, 0x96a0, 0x0005, 0x6007, 0x004f, 0x6017, -+ 0x0000, 0x7134, 0x918c, 0x00ff, 0x81ff, 0x0508, 0x9186, 0x0001, -+ 0x1160, 0x7140, 0x2001, 0x19bd, 0x2004, 0x9106, 0x11b0, 0x7144, -+ 0x2001, 0x19be, 0x2004, 0x9106, 0x0190, 0x9186, 0x0002, 0x1168, -+ 0x2011, 0x0276, 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, -+ 0x000a, 0x080c, 0xbbc2, 0x009e, 0x0110, 0x6017, 0x0001, 0x6003, -+ 0x0001, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0005, 0x6007, 0x0050, -+ 0x703c, 0x6016, 0x0ca0, 0x0016, 0x00e6, 0x2071, 0x0260, 0x00b6, -+ 0x00c6, 0x2260, 0x6010, 0x2058, 0xb8d4, 0xd084, 0x0150, 0x7128, -+ 0x6050, 0x9106, 0x1120, 0x712c, 0x604c, 0x9106, 0x0110, 0x9006, -+ 0x0010, 0x9085, 0x0001, 0x00ce, 0x00be, 0x00ee, 0x001e, 0x0005, -+ 0x0016, 0x0096, 0x0086, 0x00e6, 0x01c6, 0x01d6, 0x0126, 0x2091, -+ 0x8000, 0x2071, 0x1800, 0x7090, 0x908a, 0x00f9, 0x16e8, 0x20e1, -+ 0x0000, 0x2001, 0x19a0, 0x2003, 0x0000, 0x080c, 0x1053, 0x05a0, -+ 0x2900, 0x6016, 0x7090, 0x8004, 0xa816, 0x908a, 0x001e, 0x02d0, -+ 0xa833, 0x001e, 0x20a9, 0x001e, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x001b, 0x20a0, 0x2001, 0x19a0, 0x0016, 0x200c, 0x0471, 0x001e, -+ 0x2940, 0x080c, 0x1053, 0x01c0, 0x2900, 0xa006, 0x2100, 0x81ff, -+ 0x0180, 0x0c18, 0xa832, 0x20a8, 0xa860, 0x20e8, 0xa85c, 0x9080, -+ 0x001b, 0x20a0, 0x2001, 0x19a0, 0x0016, 0x200c, 0x00b1, 0x001e, -+ 0x0000, 0x9085, 0x0001, 0x0048, 0x2071, 0x1800, 0x7093, 0x0000, -+ 0x6014, 0x2048, 0x080c, 0x0fec, 0x9006, 0x012e, 0x01de, 0x01ce, -+ 0x00ee, 0x008e, 0x009e, 0x001e, 0x0005, 0x0006, 0x0016, 0x0026, -+ 0x0036, 0x00c6, 0x918c, 0xffff, 0x11a8, 0x080c, 0x2189, 0x2099, -+ 0x026c, 0x2001, 0x0014, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, -+ 0x00f8, 0x20a8, 0x4003, 0x22a8, 0x8108, 0x080c, 0x2189, 0x2099, -+ 0x0260, 0x0ca8, 0x080c, 0x2189, 0x2061, 0x19a0, 0x6004, 0x2098, -+ 0x6008, 0x3518, 0x9312, 0x1218, 0x23a8, 0x4003, 0x0048, 0x20a8, -+ 0x4003, 0x22a8, 0x8108, 0x080c, 0x2189, 0x2099, 0x0260, 0x0ca8, -+ 0x2061, 0x19a0, 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, 0x21a1, 0x20a1, 0x024c, 0x2001, 0x0014, 0x3518, 0x9312, -+ 0x1218, 0x23a8, 0x4003, 0x0418, 0x20a8, 0x4003, 0x82ff, 0x01f8, -+ 0x22a8, 0x8108, 0x080c, 0x21a1, 0x20a1, 0x0240, 0x0c98, 0x080c, -+ 0x21a1, 0x2061, 0x19a3, 0x6004, 0x20a0, 0x6008, 0x3518, 0x9312, -+ 0x1218, 0x23a8, 0x4003, 0x0058, 0x20a8, 0x4003, 0x82ff, 0x0138, -+ 0x22a8, 0x8108, 0x080c, 0x21a1, 0x20a1, 0x0240, 0x0c98, 0x2061, -+ 0x19a3, 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, 0x080c, 0xd696, 0x00de, -+ 0x0005, 0x00d6, 0x080c, 0xd6a3, 0x1520, 0x680c, 0x908c, 0xff00, -+ 0x6820, 0x9084, 0x00ff, 0x9115, 0x6216, 0x6824, 0x602e, 0xd1e4, -+ 0x0130, 0x9006, 0x080c, 0xe690, 0x2009, 0x0001, 0x0078, 0xd1ec, -+ 0x0180, 0x6920, 0x918c, 0x00ff, 0x6824, 0x080c, 0x25fb, 0x1148, -+ 0x2001, 0x0001, 0x080c, 0xe690, 0x2110, 0x900e, 0x080c, 0x323c, -+ 0x0018, 0x9085, 0x0001, 0x0008, 0x9006, 0x00de, 0x0005, 0x00b6, -+ 0x00c6, 0x080c, 0xac5f, 0x0598, 0x0016, 0x0026, 0x00c6, 0x2011, -+ 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, 0x25fb, 0x1568, 0x080c, -+ 0x65c4, 0x1550, 0xbe12, 0xbd16, 0x00ce, 0x002e, 0x001e, 0x2b00, -+ 0x6012, 0x080c, 0xe4c3, 0x11c8, 0x080c, 0x3332, 0x11b0, 0x080c, -+ 0xd600, 0x0500, 0x2001, 0x0007, 0x080c, 0x6575, 0x2001, 0x0007, -+ 0x080c, 0x65a1, 0x6017, 0x0000, 0x6023, 0x0001, 0x6007, 0x0001, -+ 0x6003, 0x0001, 0x080c, 0x9225, 0x0010, 0x080c, 0xabed, 0x9085, -+ 0x0001, 0x00ce, 0x00be, 0x0005, 0x080c, 0xabed, 0x00ce, 0x002e, -+ 0x001e, 0x0ca8, 0x080c, 0xabed, 0x9006, 0x0c98, 0x2069, 0x026d, -+ 0x6800, 0x9082, 0x0010, 0x1228, 0x6017, 0x0000, 0x9085, 0x0001, -+ 0x0008, 0x9006, 0x0005, 0x6017, 0x0000, 0x2069, 0x026c, 0x6808, -+ 0x9084, 0xff00, 0x9086, 0x0800, 0x1190, 0x6904, 0x9186, 0x0018, -+ 0x0118, 0x9186, 0x0014, 0x1158, 0x810f, 0x6800, 0x9084, 0x00ff, -+ 0x910d, 0x6162, 0x908e, 0x0014, 0x0110, 0x908e, 0x0010, 0x0005, -+ 0x6004, 0x90b2, 0x0053, 0x1a0c, 0x0d7d, 0x91b6, 0x0013, 0x1130, -+ 0x2008, 0x91b2, 0x0040, 0x1a04, 0xd7e5, 0x0092, 0x91b6, 0x0027, -+ 0x0120, 0x91b6, 0x0014, 0x190c, 0x0d7d, 0x2001, 0x0007, 0x080c, -+ 0x65a1, 0x080c, 0x95de, 0x080c, 0xac28, 0x080c, 0x96a0, 0x0005, -+ 0xd720, 0xd722, 0xd720, 0xd720, 0xd720, 0xd722, 0xd72f, 0xd7e2, -+ 0xd77f, 0xd7e2, 0xd793, 0xd7e2, 0xd72f, 0xd7e2, 0xd7da, 0xd7e2, -+ 0xd7da, 0xd7e2, 0xd7e2, 0xd720, 0xd720, 0xd720, 0xd720, 0xd720, -+ 0xd720, 0xd720, 0xd720, 0xd720, 0xd720, 0xd720, 0xd722, 0xd720, -+ 0xd7e2, 0xd720, 0xd720, 0xd7e2, 0xd720, 0xd7df, 0xd7e2, 0xd720, -+ 0xd720, 0xd720, 0xd720, 0xd7e2, 0xd7e2, 0xd720, 0xd7e2, 0xd7e2, -+ 0xd720, 0xd72a, 0xd720, 0xd720, 0xd720, 0xd720, 0xd7de, 0xd7e2, -+ 0xd720, 0xd720, 0xd7e2, 0xd7e2, 0xd720, 0xd720, 0xd720, 0xd720, -+ 0x080c, 0x0d7d, 0x080c, 0xcf6a, 0x6003, 0x0002, 0x080c, 0x96a0, -+ 0x0804, 0xd7e4, 0x9006, 0x080c, 0x6561, 0x0804, 0xd7e2, 0x080c, -+ 0x6a63, 0x1904, 0xd7e2, 0x9006, 0x080c, 0x6561, 0x6010, 0x2058, -+ 0xb810, 0x9086, 0x00ff, 0x1140, 0x00f6, 0x2079, 0x1800, 0x78a8, -+ 0x8000, 0x78aa, 0x00fe, 0x0428, 0x6010, 0x2058, 0xb884, 0x9005, -+ 0x1178, 0x080c, 0xcf52, 0x1904, 0xd7e2, 0x0036, 0x0046, 0xbba0, -+ 0x2021, 0x0007, 0x080c, 0x4cbe, 0x004e, 0x003e, 0x0804, 0xd7e2, -+ 0x080c, 0x3363, 0x1904, 0xd7e2, 0x2001, 0x1800, 0x2004, 0x9086, -+ 0x0002, 0x1138, 0x00f6, 0x2079, 0x1800, 0x78a8, 0x8000, 0x78aa, -+ 0x00fe, 0x2001, 0x0002, 0x080c, 0x6575, 0x6023, 0x0001, 0x6003, -+ 0x0001, 0x6007, 0x0002, 0x080c, 0x9225, 0x080c, 0x96a0, 0x6110, -+ 0x2158, 0x2009, 0x0001, 0x080c, 0x864c, 0x0804, 0xd7e4, 0x6610, -+ 0x2658, 0xbe04, 0x96b4, 0xff00, 0x8637, 0x9686, 0x0006, 0x0904, -+ 0xd7e2, 0x9686, 0x0004, 0x0904, 0xd7e2, 0x080c, 0x8eca, 0x2001, -+ 0x0004, 0x0804, 0xd7e0, 0x2001, 0x1800, 0x2004, 0x9086, 0x0003, -+ 0x1158, 0x0036, 0x0046, 0x6010, 0x2058, 0xbba0, 0x2021, 0x0006, -+ 0x080c, 0x4cbe, 0x004e, 0x003e, 0x2001, 0x0006, 0x080c, 0xd7fe, -+ 0x6610, 0x2658, 0xbe04, 0x0066, 0x96b4, 0xff00, 0x8637, 0x9686, -+ 0x0006, 0x006e, 0x0168, 0x2001, 0x0006, 0x080c, 0x65a1, 0x9284, -+ 0x00ff, 0x908e, 0x0007, 0x1120, 0x2001, 0x0006, 0x080c, 0x6575, -+ 0x080c, 0x6a63, 0x11f8, 0x2001, 0x1837, 0x2004, 0xd0a4, 0x01d0, -+ 0xbe04, 0x96b4, 0x00ff, 0x9686, 0x0006, 0x01a0, 0x00f6, 0x2079, -+ 0x1800, 0x78a8, 0x8000, 0x78aa, 0x00fe, 0x0804, 0xd769, 0x2001, -+ 0x0004, 0x0030, 0x2001, 0x0006, 0x0409, 0x0020, 0x0018, 0x0010, -+ 0x080c, 0x65a1, 0x080c, 0xabed, 0x0005, 0x2600, 0x0002, 0xd7f9, -+ 0xd7f9, 0xd7f9, 0xd7f9, 0xd7f9, 0xd7fb, 0xd7f9, 0xd7fb, 0xd7f9, -+ 0xd7f9, 0xd7fb, 0xd7f9, 0xd7f9, 0xd7f9, 0xd7fb, 0xd7fb, 0xd7fb, -+ 0xd7fb, 0x080c, 0x0d7d, 0x080c, 0xabed, 0x0005, 0x0016, 0x00b6, -+ 0x00d6, 0x6110, 0x2158, 0xb900, 0xd184, 0x0138, 0x080c, 0x6575, -+ 0x9006, 0x080c, 0x6561, 0x080c, 0x321c, 0x00de, 0x00be, 0x001e, -+ 0x0005, 0x6610, 0x2658, 0xb804, 0x9084, 0xff00, 0x8007, 0x90b2, -+ 0x000c, 0x1a0c, 0x0d7d, 0x91b6, 0x0015, 0x1110, 0x003b, 0x0028, -+ 0x91b6, 0x0016, 0x190c, 0x0d7d, 0x006b, 0x0005, 0xb69e, 0xb69e, -+ 0xb69e, 0xb69e, 0xb69e, 0xb69e, 0xd87d, 0xd83e, 0xb69e, 0xb69e, -+ 0xb69e, 0xb69e, 0xb69e, 0xb69e, 0xb69e, 0xb69e, 0xb69e, 0xb69e, -+ 0xd87d, 0xd884, 0xb69e, 0xb69e, 0xb69e, 0xb69e, 0x00f6, 0x080c, -+ 0x6a63, 0x11d8, 0x080c, 0xcf52, 0x11c0, 0x6010, 0x905d, 0x01a8, -+ 0xb884, 0x9005, 0x0190, 0x9006, 0x080c, 0x6561, 0x2001, 0x0002, -+ 0x080c, 0x6575, 0x6023, 0x0001, 0x6003, 0x0001, 0x6007, 0x0002, -+ 0x080c, 0x9225, 0x080c, 0x96a0, 0x00f0, 0x2011, 0x0263, 0x2204, -+ 0x8211, 0x220c, 0x080c, 0x25fb, 0x11b0, 0x080c, 0x6625, 0x0118, -+ 0x080c, 0xabed, 0x0080, 0xb810, 0x0006, 0xb814, 0x0006, 0xb884, -+ 0x0006, 0x080c, 0x6043, 0x000e, 0xb886, 0x000e, 0xb816, 0x000e, -+ 0xb812, 0x080c, 0xabed, 0x00fe, 0x0005, 0x6604, 0x96b6, 0x001e, -+ 0x1110, 0x080c, 0xabed, 0x0005, 0x080c, 0xba27, 0x1148, 0x6003, -+ 0x0001, 0x6007, 0x0001, 0x080c, 0x9225, 0x080c, 0x96a0, 0x0010, -+ 0x080c, 0xabed, 0x0005, 0x6004, 0x908a, 0x0053, 0x1a0c, 0x0d7d, -+ 0x080c, 0x95de, 0x080c, 0xac28, 0x0005, 0x9182, 0x0040, 0x0002, -+ 0xd8b3, 0xd8b3, 0xd8b3, 0xd8b3, 0xd8b5, 0xd8b3, 0xd8b3, 0xd8b3, -+ 0xd8b3, 0xd8b3, 0xd8b3, 0xd8b3, 0xd8b3, 0xd8b3, 0xd8b3, 0xd8b3, -+ 0xd8b3, 0xd8b3, 0xd8b3, 0x080c, 0x0d7d, 0x0096, 0x00b6, 0x00d6, -+ 0x00e6, 0x00f6, 0x0046, 0x0026, 0x6210, 0x2258, 0xb8bc, 0x9005, -+ 0x11b0, 0x6007, 0x0044, 0x2071, 0x0260, 0x7444, 0x94a4, 0xff00, -+ 0x0904, 0xd91c, 0x080c, 0xe684, 0x1170, 0x9486, 0x2000, 0x1158, -+ 0x2009, 0x0001, 0x2011, 0x0200, 0x080c, 0x88ec, 0x0020, 0x9026, -+ 0x080c, 0xe508, 0x0c30, 0x080c, 0x103a, 0x090c, 0x0d7d, 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, 0x6d80, 0x001e, 0x080c, 0xe684, 0x1904, 0xd97c, 0x9486, -+ 0x2000, 0x1130, 0x2019, 0x0017, 0x080c, 0xe239, 0x0804, 0xd97c, -+ 0x9486, 0x0200, 0x1120, 0x080c, 0xe1c9, 0x0804, 0xd97c, 0x9486, -+ 0x0400, 0x0120, 0x9486, 0x1000, 0x1904, 0xd97c, 0x2019, 0x0002, -+ 0x080c, 0xe1e8, 0x0804, 0xd97c, 0x2069, 0x1a6f, 0x6a00, 0xd284, -+ 0x0904, 0xd9e6, 0x9284, 0x0300, 0x1904, 0xd9df, 0x6804, 0x9005, -+ 0x0904, 0xd9c7, 0x2d78, 0x6003, 0x0007, 0x080c, 0x1053, 0x0904, -+ 0xd988, 0x7800, 0xd08c, 0x1118, 0x7804, 0x8001, 0x7806, 0x6017, -+ 0x0000, 0x2001, 0x180f, 0x2004, 0xd084, 0x1904, 0xd9ea, 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, 0xd984, 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, 0x6d83, 0x002e, 0x004e, 0x00fe, 0x00ee, -+ 0x00de, 0x00be, 0x009e, 0x0005, 0x0000, 0x0080, 0x0040, 0x0000, -+ 0x2001, 0x1810, 0x2004, 0xd084, 0x0120, 0x080c, 0x103a, 0x1904, -+ 0xd931, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, 0x0041, 0x2009, -+ 0xa022, 0x080c, 0x921e, 0x0c00, 0x2069, 0x0260, 0x6848, 0x9084, -+ 0xff00, 0x9086, 0x1200, 0x1198, 0x686c, 0x9084, 0x00ff, 0x0016, -+ 0x6114, 0x918c, 0xf700, 0x910d, 0x6116, 0x001e, 0x6003, 0x0001, -+ 0x6007, 0x0043, 0x2009, 0xa025, 0x080c, 0x921e, 0x0828, 0x6868, -+ 0x602e, 0x686c, 0x6032, 0x6017, 0xf200, 0x6003, 0x0001, 0x6007, -+ 0x0041, 0x2009, 0xa022, 0x080c, 0x921e, 0x0804, 0xd97c, 0x2001, -+ 0x180e, 0x2004, 0xd0ec, 0x0120, 0x2011, 0x8049, 0x080c, 0x4b07, -+ 0x6017, 0xf300, 0x0010, 0x6017, 0xf100, 0x6003, 0x0001, 0x6007, -+ 0x0041, 0x2009, 0xa022, 0x080c, 0x921e, 0x0804, 0xd97c, 0x6017, -+ 0xf500, 0x0c98, 0x6017, 0xf600, 0x0804, 0xd99c, 0x6017, 0xf200, -+ 0x0804, 0xd99c, 0xa867, 0x0146, 0xa86b, 0x0000, 0x6008, 0xa886, -+ 0x2c00, 0xa87a, 0x7044, 0x9084, 0x0003, 0x9080, 0xd984, 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, 0x0d7d, 0x8210, 0x821c, 0x2001, 0x026c, 0x2098, 0xa860, -+ 0x20e8, 0xa85c, 0x9080, 0x0029, 0x20a0, 0x2011, 0xda66, 0x2041, -+ 0x0001, 0x223d, 0x9784, 0x00ff, 0x9322, 0x1208, 0x2300, 0x20a8, -+ 0x4003, 0x931a, 0x0530, 0x8210, 0xd7fc, 0x1130, 0x8d68, 0x2d0a, -+ 0x2001, 0x0260, 0x2098, 0x0c68, 0x2950, 0x080c, 0x1053, 0x0170, -+ 0x2900, 0xb002, 0xa867, 0x0147, 0xa86b, 0x0000, 0xa860, 0x20e8, -+ 0xa85c, 0x9080, 0x001b, 0x20a0, 0x8840, 0x08d8, 0x2548, 0xa800, -+ 0x902d, 0x0118, 0x080c, 0x106c, 0x0cc8, 0x080c, 0x106c, 0x0804, -+ 0xd988, 0x2548, 0x8847, 0x9885, 0x0046, 0xa866, 0x2009, 0x0205, -+ 0x200b, 0x0000, 0x080c, 0xe26c, 0x0804, 0xd97c, 0x8010, 0x0004, -+ 0x801a, 0x0006, 0x8018, 0x0008, 0x8016, 0x000a, 0x8014, 0x9186, -+ 0x0013, 0x1160, 0x6004, 0x908a, 0x0057, 0x1a0c, 0x0d7d, 0x9082, -+ 0x0040, 0x0a0c, 0x0d7d, 0x2008, 0x0804, 0xdaf1, 0x9186, 0x0051, -+ 0x0108, 0x0040, 0x080c, 0xaaa8, 0x01e8, 0x9086, 0x0002, 0x0904, -+ 0xdb38, 0x00c0, 0x9186, 0x0027, 0x0180, 0x9186, 0x0048, 0x0128, -+ 0x9186, 0x0014, 0x0150, 0x190c, 0x0d7d, 0x080c, 0xaaa8, 0x0150, -+ 0x9086, 0x0004, 0x0904, 0xdbd5, 0x0028, 0x6004, 0x9082, 0x0040, -+ 0x2008, 0x001a, 0x080c, 0xaca9, 0x0005, 0xdab8, 0xdaba, 0xdaba, -+ 0xdae1, 0xdab8, 0xdab8, 0xdab8, 0xdab8, 0xdab8, 0xdab8, 0xdab8, -+ 0xdab8, 0xdab8, 0xdab8, 0xdab8, 0xdab8, 0xdab8, 0xdab8, 0xdab8, -+ 0x080c, 0x0d7d, 0x080c, 0x95de, 0x080c, 0x96a0, 0x0036, 0x0096, -+ 0x6014, 0x904d, 0x01d8, 0x080c, 0xc838, 0x01c0, 0x6003, 0x0002, -+ 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0bc, 0x1178, 0x2019, -+ 0x0004, 0x080c, 0xe26c, 0x6017, 0x0000, 0x6018, 0x9005, 0x1120, -+ 0x2001, 0x1987, 0x2004, 0x601a, 0x6003, 0x0007, 0x009e, 0x003e, -+ 0x0005, 0x0096, 0x080c, 0x95de, 0x080c, 0x96a0, 0x080c, 0xc838, -+ 0x0120, 0x6014, 0x2048, 0x080c, 0x106c, 0x080c, 0xac28, 0x009e, -+ 0x0005, 0x0002, 0xdb05, 0xdb1a, 0xdb07, 0xdb2f, 0xdb05, 0xdb05, -+ 0xdb05, 0xdb05, 0xdb05, 0xdb05, 0xdb05, 0xdb05, 0xdb05, 0xdb05, -+ 0xdb05, 0xdb05, 0xdb05, 0xdb05, 0xdb05, 0x080c, 0x0d7d, 0x0096, -+ 0x6014, 0x2048, 0xa87c, 0xd0b4, 0x0138, 0x6003, 0x0007, 0x2009, -+ 0x0043, 0x080c, 0xac8c, 0x0010, 0x6003, 0x0004, 0x080c, 0x96a0, -+ 0x009e, 0x0005, 0x080c, 0xc838, 0x0138, 0x6114, 0x0096, 0x2148, -+ 0xa97c, 0x009e, 0xd1ec, 0x1138, 0x080c, 0x88c1, 0x080c, 0xabed, -+ 0x080c, 0x96a0, 0x0005, 0x080c, 0xe4cc, 0x0db0, 0x0cc8, 0x6003, -+ 0x0001, 0x6007, 0x0041, 0x2009, 0xa022, 0x080c, 0x921e, 0x0005, -+ 0x9182, 0x0040, 0x0002, 0xdb4e, 0xdb50, 0xdb4e, 0xdb4e, 0xdb4e, -+ 0xdb4e, 0xdb4e, 0xdb4e, 0xdb4e, 0xdb4e, 0xdb4e, 0xdb4e, 0xdb4e, -+ 0xdb4e, 0xdb4e, 0xdb4e, 0xdb4e, 0xdb51, 0xdb4e, 0x080c, 0x0d7d, -+ 0x0005, 0x00d6, 0x080c, 0x88c1, 0x00de, 0x080c, 0xe524, 0x080c, -+ 0xabed, 0x0005, 0x9182, 0x0040, 0x0002, 0xdb70, 0xdb70, 0xdb70, -+ 0xdb70, 0xdb70, 0xdb70, 0xdb70, 0xdb70, 0xdb70, 0xdb72, 0xdb9d, -+ 0xdb70, 0xdb70, 0xdb70, 0xdb70, 0xdb9d, 0xdb70, 0xdb70, 0xdb70, -+ 0x080c, 0x0d7d, 0x6014, 0x0096, 0x2048, 0xa87c, 0xd0fc, 0x0168, -+ 0x908c, 0x0003, 0x918e, 0x0002, 0x0180, 0x6144, 0xd1e4, 0x1168, -+ 0x2009, 0x0041, 0x009e, 0x0804, 0xdc5d, 0x6003, 0x0007, 0x601b, -+ 0x0000, 0x080c, 0x88c1, 0x009e, 0x0005, 0x6014, 0x2048, 0xa97c, -+ 0xd1ec, 0x1130, 0x080c, 0x88c1, 0x080c, 0xabed, 0x009e, 0x0005, -+ 0x080c, 0xe4cc, 0x0db8, 0x009e, 0x0005, 0x2001, 0x180c, 0x200c, -+ 0xc1d4, 0x2102, 0x0036, 0x080c, 0x963b, 0x080c, 0x96a0, 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, 0xe26c, 0x6018, 0x9005, -+ 0x1128, 0x2001, 0x1987, 0x2004, 0x8003, 0x601a, 0x6017, 0x0000, -+ 0x6003, 0x0007, 0x009e, 0x003e, 0x0005, 0x9182, 0x0040, 0x0002, -+ 0xdbec, 0xdbec, 0xdbec, 0xdbec, 0xdbec, 0xdbec, 0xdbec, 0xdbec, -+ 0xdbee, 0xdbec, 0xdbec, 0xdbec, 0xdbec, 0xdbec, 0xdbec, 0xdbec, -+ 0xdbec, 0xdbec, 0xdbec, 0xdc39, 0x080c, 0x0d7d, 0x6014, 0x0096, -+ 0x2048, 0xa834, 0xaa38, 0x6110, 0x00b6, 0x2158, 0xb900, 0x00be, -+ 0xd1bc, 0x1190, 0x920d, 0x1518, 0xa87c, 0xd0fc, 0x0128, 0x2009, -+ 0x0041, 0x009e, 0x0804, 0xdc5d, 0x6003, 0x0007, 0x601b, 0x0000, -+ 0x080c, 0x88c1, 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, 0x180e, -+ 0x210c, 0xd19c, 0x0118, 0x6003, 0x0007, 0x0010, 0x6003, 0x0006, -+ 0x00e9, 0x080c, 0x88c3, 0x009e, 0x0005, 0x6003, 0x0002, 0x009e, -+ 0x0005, 0x6024, 0xd0f4, 0x0128, 0x080c, 0x1670, 0x1904, 0xdbee, -+ 0x0005, 0x6014, 0x0096, 0x2048, 0xa834, 0xa938, 0x009e, 0x9105, -+ 0x1120, 0x080c, 0x1670, 0x1904, 0xdbee, 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, 0x0d7d, -+ 0x6024, 0xd0dc, 0x090c, 0x0d7d, 0x0005, 0xdc80, 0xdc8c, 0xdc98, -+ 0xdca4, 0xdc80, 0xdc80, 0xdc80, 0xdc80, 0xdc87, 0xdc82, 0xdc82, -+ 0xdc80, 0xdc80, 0xdc80, 0xdc80, 0xdc82, 0xdc80, 0xdc82, 0xdc80, -+ 0x080c, 0x0d7d, 0x6024, 0xd0dc, 0x090c, 0x0d7d, 0x0005, 0x6014, -+ 0x9005, 0x190c, 0x0d7d, 0x0005, 0x6003, 0x0001, 0x6106, 0x0126, -+ 0x2091, 0x8000, 0x2009, 0xa022, 0x080c, 0x9200, 0x012e, 0x0005, -+ 0x6003, 0x0004, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa001, -+ 0x080c, 0x921e, 0x012e, 0x0005, 0x6003, 0x0003, 0x6106, 0x080c, -+ 0x1c03, 0x0126, 0x2091, 0x8000, 0x6014, 0x0096, 0x2048, 0xa87c, -+ 0xd0fc, 0x0188, 0x9084, 0x0003, 0x9086, 0x0002, 0x01a0, 0x6024, -+ 0xd0cc, 0x1148, 0xd0c4, 0x1138, 0xa8a8, 0x9005, 0x1120, 0x6144, -+ 0x918d, 0xb035, 0x0018, 0x6144, 0x918d, 0xa035, 0x009e, 0x080c, -+ 0x9265, 0x012e, 0x0005, 0x6144, 0x918d, 0xa032, 0x0cb8, 0x0126, -+ 0x2091, 0x8000, 0x0036, 0x0096, 0x9182, 0x0040, 0x0023, 0x009e, -+ 0x003e, 0x012e, 0x0005, 0xdceb, 0xdced, 0xdd02, 0xdd1c, 0xdceb, -+ 0xdceb, 0xdceb, 0xdceb, 0xdceb, 0xdceb, 0xdceb, 0xdceb, 0xdceb, -+ 0xdceb, 0xdceb, 0xdceb, 0x080c, 0x0d7d, 0x6014, 0x2048, 0xa87c, -+ 0xd0fc, 0x0510, 0x909c, 0x0003, 0x939e, 0x0003, 0x01e8, 0x6003, -+ 0x0001, 0x6106, 0x0126, 0x2091, 0x8000, 0x2009, 0xa022, 0x080c, -+ 0x921e, 0x0470, 0x6014, 0x2048, 0xa87c, 0xd0fc, 0x0168, 0x909c, -+ 0x0003, 0x939e, 0x0003, 0x0140, 0x6003, 0x0001, 0x6106, 0x2009, -+ 0xa001, 0x080c, 0x921e, 0x00e0, 0x901e, 0x6316, 0x631a, 0x2019, -+ 0x0004, 0x080c, 0xe26c, 0x00a0, 0x6014, 0x2048, 0xa87c, 0xd0fc, -+ 0x0d98, 0x909c, 0x0003, 0x939e, 0x0003, 0x0d70, 0x6003, 0x0003, -+ 0x6106, 0x080c, 0x1c03, 0x6144, 0x918d, 0xa035, 0x080c, 0x9265, -+ 0x0005, 0x080c, 0x95de, 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, -+ 0x080c, 0xe621, 0x0036, 0x2019, 0x0029, 0x080c, 0xe26c, 0x003e, -+ 0x009e, 0x080c, 0xac28, 0x080c, 0x96a0, 0x0005, 0x080c, 0x963b, -+ 0x6114, 0x81ff, 0x0158, 0x0096, 0x2148, 0x080c, 0xe621, 0x0036, -+ 0x2019, 0x0029, 0x080c, 0xe26c, 0x003e, 0x009e, 0x080c, 0xac28, -+ 0x0005, 0x9182, 0x0085, 0x0002, 0xdd6b, 0xdd69, 0xdd69, 0xdd77, -+ 0xdd69, 0xdd69, 0xdd69, 0xdd69, 0xdd69, 0xdd69, 0xdd69, 0xdd69, -+ 0xdd69, 0x080c, 0x0d7d, 0x6003, 0x000b, 0x6106, 0x0126, 0x2091, -+ 0x8000, 0x2009, 0x8020, 0x080c, 0x921e, 0x012e, 0x0005, 0x0026, -+ 0x00e6, 0x080c, 0xe4c3, 0x0118, 0x080c, 0xabed, 0x0440, 0x2071, -+ 0x0260, 0x7224, 0x6216, 0x2001, 0x180e, 0x2004, 0xd0e4, 0x0150, -+ 0x6010, 0x00b6, 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2011, 0x014e, -+ 0x080c, 0xaf1a, 0x7220, 0x080c, 0xe102, 0x0118, 0x6007, 0x0086, -+ 0x0040, 0x6007, 0x0087, 0x7224, 0x9296, 0xffff, 0x1110, 0x6007, -+ 0x0086, 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x921e, 0x00ee, -+ 0x002e, 0x0005, 0x9186, 0x0013, 0x1160, 0x6004, 0x908a, 0x0085, -+ 0x0a0c, 0x0d7d, 0x908a, 0x0092, 0x1a0c, 0x0d7d, 0x9082, 0x0085, -+ 0x00a2, 0x9186, 0x0027, 0x0130, 0x9186, 0x0014, 0x0118, 0x080c, -+ 0xaca9, 0x0050, 0x2001, 0x0007, 0x080c, 0x65a1, 0x080c, 0x95de, -+ 0x080c, 0xac28, 0x080c, 0x96a0, 0x0005, 0xddda, 0xdddc, 0xdddc, -+ 0xddda, 0xddda, 0xddda, 0xddda, 0xddda, 0xddda, 0xddda, 0xddda, -+ 0xddda, 0xddda, 0x080c, 0x0d7d, 0x080c, 0xac28, 0x080c, 0x96a0, -+ 0x0005, 0x9182, 0x0085, 0x0a0c, 0x0d7d, 0x9182, 0x0092, 0x1a0c, -+ 0x0d7d, 0x9182, 0x0085, 0x0002, 0xddf9, 0xddf9, 0xddf9, 0xddfb, -+ 0xddf9, 0xddf9, 0xddf9, 0xddf9, 0xddf9, 0xddf9, 0xddf9, 0xddf9, -+ 0xddf9, 0x080c, 0x0d7d, 0x0005, 0x9186, 0x0013, 0x0148, 0x9186, -+ 0x0014, 0x0130, 0x9186, 0x0027, 0x0118, 0x080c, 0xaca9, 0x0020, -+ 0x080c, 0x95de, 0x080c, 0xac28, 0x0005, 0x0036, 0x080c, 0xe524, -+ 0x604b, 0x0000, 0x2019, 0x000b, 0x0031, 0x6023, 0x0006, 0x6003, -+ 0x0007, 0x003e, 0x0005, 0x0126, 0x0036, 0x2091, 0x8000, 0x2001, -+ 0x0382, 0x2004, 0x9084, 0x0007, 0x0006, 0x9086, 0x0003, 0x0110, -+ 0x080c, 0xa896, 0x0086, 0x2c40, 0x0096, 0x904e, 0x080c, 0xa218, -+ 0x009e, 0x008e, 0x1550, 0x0076, 0x2c38, 0x080c, 0xa2c3, 0x007e, -+ 0x1520, 0x6000, 0x9086, 0x0000, 0x0500, 0x6020, 0x9086, 0x0007, -+ 0x01e0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xe524, 0x080c, -+ 0xcf6a, 0x080c, 0x1a6a, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, -+ 0xc838, 0x0110, 0x080c, 0xe26c, 0x009e, 0x6017, 0x0000, 0x080c, -+ 0xe524, 0x6023, 0x0007, 0x080c, 0xcf6a, 0x000e, 0x9086, 0x0003, -+ 0x0110, 0x080c, 0xa8b2, 0x003e, 0x012e, 0x0005, 0x00f6, 0x00c6, -+ 0x00b6, 0x0036, 0x0156, 0x2079, 0x0260, 0x7938, 0x783c, 0x080c, -+ 0x25fb, 0x15e8, 0x0016, 0x00c6, 0x080c, 0x6625, 0x15b0, 0x001e, -+ 0x00c6, 0x2160, 0x080c, 0xcf67, 0x00ce, 0x002e, 0x0026, 0x0016, -+ 0x080c, 0xa896, 0x2019, 0x0029, 0x080c, 0xa38a, 0x080c, 0x93a5, -+ 0x0076, 0x903e, 0x080c, 0x9277, 0x007e, 0x001e, 0x0076, 0x903e, -+ 0x080c, 0xdfeb, 0x007e, 0x080c, 0xa8b2, 0x0026, 0xba04, 0x9294, -+ 0xff00, 0x8217, 0x9286, 0x0006, 0x0118, 0x9286, 0x0004, 0x1118, -+ 0xbaa0, 0x080c, 0x32be, 0x002e, 0xbc84, 0x001e, 0x080c, 0x6043, -+ 0xbe12, 0xbd16, 0xbc86, 0x9006, 0x0010, 0x00ce, 0x001e, 0x015e, -+ 0x003e, 0x00be, 0x00ce, 0x00fe, 0x0005, 0x00c6, 0x00d6, 0x00b6, -+ 0x0016, 0x2009, 0x1824, 0x2104, 0x9086, 0x0074, 0x1904, 0xdf0e, -+ 0x2069, 0x0260, 0x6944, 0x9182, 0x0100, 0x06e0, 0x6940, 0x9184, -+ 0x8000, 0x0904, 0xdf0b, 0x2001, 0x197c, 0x2004, 0x9005, 0x1140, -+ 0x6010, 0x2058, 0xb884, 0x9005, 0x0118, 0x9184, 0x0800, 0x0598, -+ 0x6948, 0x918a, 0x0001, 0x0648, 0x080c, 0xe689, 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, 0x0180, 0x9286, 0x0004, -+ 0x0168, 0x9394, 0xff00, 0x8217, 0x9286, 0x0006, 0x0138, 0x9286, -+ 0x0004, 0x0120, 0x080c, 0x6634, 0x0804, 0xdf7a, 0x2011, 0x0276, -+ 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbbc2, -+ 0x009e, 0x15c8, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, -+ 0x2019, 0x0006, 0x080c, 0xbbc2, 0x009e, 0x1568, 0x0046, 0x0016, -+ 0xbaa0, 0x2220, 0x9006, 0x2009, 0x1848, 0x210c, 0xd1a4, 0x0138, -+ 0x2009, 0x0029, 0x080c, 0xe2c9, 0xb800, 0xc0e5, 0xb802, 0x080c, -+ 0xa896, 0x2019, 0x0029, 0x080c, 0x93a5, 0x0076, 0x2039, 0x0000, -+ 0x080c, 0x9277, 0x2c08, 0x080c, 0xdfeb, 0x007e, 0x080c, 0xa8b2, -+ 0x2001, 0x0007, 0x080c, 0x65a1, 0x2001, 0x0007, 0x080c, 0x6575, -+ 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, 0x25fb, 0x11d0, 0x080c, 0x6625, 0x11b8, 0x2011, 0x0270, -+ 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbbc2, -+ 0x009e, 0x1158, 0x2011, 0x0274, 0x20a9, 0x0004, 0x0096, 0x2b48, -+ 0x2019, 0x0006, 0x080c, 0xbbc2, 0x009e, 0x015e, 0x003e, 0x002e, -+ 0x001e, 0x00fe, 0x00be, 0x0005, 0x00b6, 0x0006, 0x0016, 0x0026, -+ 0x0036, 0x0156, 0x2011, 0x0263, 0x2204, 0x8211, 0x220c, 0x080c, -+ 0x25fb, 0x11d0, 0x080c, 0x6625, 0x11b8, 0x2011, 0x0276, 0x20a9, -+ 0x0004, 0x0096, 0x2b48, 0x2019, 0x000a, 0x080c, 0xbbc2, 0x009e, -+ 0x1158, 0x2011, 0x027a, 0x20a9, 0x0004, 0x0096, 0x2b48, 0x2019, -+ 0x0006, 0x080c, 0xbbc2, 0x009e, 0x015e, 0x003e, 0x002e, 0x001e, -+ 0x000e, 0x00be, 0x0005, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, -+ 0x0056, 0x0046, 0x0026, 0x0126, 0x2091, 0x8000, 0x080c, 0xa8f4, -+ 0x0106, 0x190c, 0xa896, 0x2740, 0x2029, 0x19f3, 0x252c, 0x2021, -+ 0x19fa, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7654, 0x7074, -+ 0x81ff, 0x0150, 0x0006, 0x9186, 0x1b32, 0x000e, 0x0128, 0x8001, -+ 0x9602, 0x1a04, 0xe090, 0x0018, 0x9606, 0x0904, 0xe090, 0x080c, -+ 0x8b90, 0x0904, 0xe087, 0x2100, 0x9c06, 0x0904, 0xe087, 0x080c, -+ 0xe30a, 0x1904, 0xe087, 0x080c, 0xe6a6, 0x0904, 0xe087, 0x080c, -+ 0xe2fa, 0x0904, 0xe087, 0x6720, 0x9786, 0x0001, 0x1148, 0x080c, -+ 0x3363, 0x0904, 0xe0d2, 0x6004, 0x9086, 0x0000, 0x1904, 0xe0d2, -+ 0x9786, 0x0004, 0x0904, 0xe0d2, 0x9786, 0x0007, 0x0904, 0xe087, -+ 0x2500, 0x9c06, 0x0904, 0xe087, 0x2400, 0x9c06, 0x0904, 0xe087, -+ 0x88ff, 0x0118, 0x605c, 0x9906, 0x15d0, 0x0096, 0x6043, 0xffff, -+ 0x6000, 0x9086, 0x0004, 0x1120, 0x0016, 0x080c, 0x1a6a, 0x001e, -+ 0x9786, 0x000a, 0x0148, 0x080c, 0xca4d, 0x1130, 0x080c, 0xb5b5, -+ 0x009e, 0x080c, 0xac28, 0x0418, 0x6014, 0x2048, 0x080c, 0xc838, -+ 0x01d8, 0x9786, 0x0003, 0x1588, 0xa867, 0x0103, 0xa87c, 0xd0cc, -+ 0x0130, 0x0096, 0xa878, 0x2048, 0x080c, 0x0fec, 0x009e, 0xab7a, -+ 0xa877, 0x0000, 0x080c, 0xe621, 0x0016, 0x080c, 0xcb36, 0x080c, -+ 0x6d74, 0x001e, 0x080c, 0xca27, 0x009e, 0x080c, 0xac28, 0x9ce0, -+ 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1210, 0x0804, 0xe004, -+ 0x010e, 0x190c, 0xa8b2, 0x012e, 0x002e, 0x004e, 0x005e, 0x006e, -+ 0x007e, 0x008e, 0x00ce, 0x00ee, 0x0005, 0x9786, 0x0006, 0x1150, -+ 0x9386, 0x0005, 0x0128, 0x080c, 0xe621, 0x080c, 0xe26c, 0x08e0, -+ 0x009e, 0x08e8, 0x9786, 0x0009, 0x11f8, 0x6000, 0x9086, 0x0004, -+ 0x01c0, 0x6000, 0x9086, 0x0003, 0x11a0, 0x080c, 0x963b, 0x0096, -+ 0x6114, 0x2148, 0x080c, 0xc838, 0x0118, 0x6010, 0x080c, 0x6d80, -+ 0x009e, 0x00c6, 0x080c, 0xabed, 0x00ce, 0x0036, 0x080c, 0x96a0, -+ 0x003e, 0x009e, 0x0804, 0xe087, 0x9786, 0x000a, 0x0904, 0xe06e, -+ 0x0804, 0xe06c, 0x81ff, 0x0904, 0xe087, 0x9180, 0x0001, 0x2004, -+ 0x9086, 0x0018, 0x0138, 0x9180, 0x0001, 0x2004, 0x9086, 0x002d, -+ 0x1904, 0xe087, 0x6000, 0x9086, 0x0002, 0x1904, 0xe087, 0x080c, -+ 0xca3c, 0x0138, 0x080c, 0xca4d, 0x1904, 0xe087, 0x080c, 0xb5b5, -+ 0x0038, 0x080c, 0x321c, 0x080c, 0xca4d, 0x1110, 0x080c, 0xb5b5, -+ 0x080c, 0xac28, 0x0804, 0xe087, 0xa864, 0x9084, 0x00ff, 0x9086, -+ 0x0039, 0x0005, 0x00c6, 0x00e6, 0x0016, 0x2c08, 0x2170, 0x9006, -+ 0x080c, 0xe293, 0x001e, 0x0120, 0x6020, 0x9084, 0x000f, 0x001b, -+ 0x00ee, 0x00ce, 0x0005, 0xe121, 0xe121, 0xe121, 0xe121, 0xe121, -+ 0xe121, 0xe123, 0xe121, 0xe121, 0xe121, 0xe121, 0xac28, 0xac28, -+ 0xe121, 0x9006, 0x0005, 0x0036, 0x0046, 0x0016, 0x7010, 0x00b6, -+ 0x2058, 0xbca0, 0x00be, 0x2c00, 0x2009, 0x0020, 0x080c, 0xe2c9, -+ 0x001e, 0x004e, 0x2019, 0x0002, 0x080c, 0xde1b, 0x003e, 0x9085, -+ 0x0001, 0x0005, 0x0096, 0x080c, 0xc838, 0x0140, 0x6014, 0x904d, -+ 0x080c, 0xc443, 0x687b, 0x0005, 0x080c, 0x6d80, 0x009e, 0x080c, -+ 0xac28, 0x9085, 0x0001, 0x0005, 0x2001, 0x0001, 0x080c, 0x6561, -+ 0x0156, 0x0016, 0x0026, 0x0036, 0x20a9, 0x0004, 0x2019, 0x1805, -+ 0x2011, 0x0276, 0x080c, 0xbbae, 0x003e, 0x002e, 0x001e, 0x015e, -+ 0x9005, 0x0005, 0x00f6, 0x00e6, 0x00c6, 0x0086, 0x0076, 0x0066, -+ 0x00b6, 0x0126, 0x2091, 0x8000, 0x2740, 0x2061, 0x1ddc, 0x2079, -+ 0x0001, 0x8fff, 0x0904, 0xe1bc, 0x2071, 0x1800, 0x7654, 0x7074, -+ 0x8001, 0x9602, 0x1a04, 0xe1bc, 0x88ff, 0x0120, 0x2800, 0x9c06, -+ 0x1590, 0x2078, 0x080c, 0xe2fa, 0x0570, 0x2400, 0x9c06, 0x0558, -+ 0x6720, 0x9786, 0x0006, 0x1538, 0x9786, 0x0007, 0x0520, 0x88ff, -+ 0x1140, 0x6010, 0x9b06, 0x11f8, 0x85ff, 0x0118, 0x605c, 0x9106, -+ 0x11d0, 0x0096, 0x601c, 0xd084, 0x0140, 0x080c, 0xe524, 0x080c, -+ 0xcf6a, 0x080c, 0x1a6a, 0x6023, 0x0007, 0x6014, 0x2048, 0x080c, -+ 0xc838, 0x0120, 0x0046, 0x080c, 0xe26c, 0x004e, 0x009e, 0x080c, -+ 0xac28, 0x88ff, 0x1198, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, -+ 0x9c02, 0x1210, 0x0804, 0xe171, 0x9006, 0x012e, 0x00be, 0x006e, -+ 0x007e, 0x008e, 0x00ce, 0x00ee, 0x00fe, 0x0005, 0x98c5, 0x0001, -+ 0x0ca0, 0x080c, 0xa896, 0x00b6, 0x0076, 0x0056, 0x0086, 0x9046, -+ 0x2029, 0x0001, 0x2c20, 0x2019, 0x0002, 0x6210, 0x2258, 0x0096, -+ 0x904e, 0x080c, 0xa218, 0x009e, 0x008e, 0x903e, 0x080c, 0xa2c3, -+ 0x080c, 0xe162, 0x005e, 0x007e, 0x00be, 0x080c, 0xa8b2, 0x0005, -+ 0x080c, 0xa896, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, 0x0156, -+ 0x2c20, 0x2128, 0x20a9, 0x007f, 0x900e, 0x0016, 0x0036, 0x080c, -+ 0x6625, 0x1190, 0x0056, 0x0086, 0x9046, 0x2508, 0x2029, 0x0001, -+ 0x0096, 0x904e, 0x080c, 0xa218, 0x009e, 0x008e, 0x903e, 0x080c, -+ 0xa2c3, 0x080c, 0xe162, 0x005e, 0x003e, 0x001e, 0x8108, 0x1f04, -+ 0xe1f5, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, 0x00be, 0x080c, -+ 0xa8b2, 0x0005, 0x080c, 0xa896, 0x00b6, 0x0076, 0x0056, 0x6210, -+ 0x2258, 0x0086, 0x9046, 0x2029, 0x0001, 0x2019, 0x0048, 0x0096, -+ 0x904e, 0x080c, 0xa218, 0x009e, 0x008e, 0x903e, 0x080c, 0xa2c3, -+ 0x2c20, 0x080c, 0xe162, 0x005e, 0x007e, 0x00be, 0x080c, 0xa8b2, -+ 0x0005, 0x080c, 0xa896, 0x00b6, 0x0046, 0x0056, 0x0076, 0x00c6, -+ 0x0156, 0x2c20, 0x20a9, 0x0800, 0x900e, 0x0016, 0x0036, 0x080c, -+ 0x6625, 0x11a0, 0x0086, 0x9046, 0x2828, 0x0046, 0x2021, 0x0001, -+ 0x080c, 0xe508, 0x004e, 0x0096, 0x904e, 0x080c, 0xa218, 0x009e, -+ 0x008e, 0x903e, 0x080c, 0xa2c3, 0x080c, 0xe162, 0x003e, 0x001e, -+ 0x8108, 0x1f04, 0xe245, 0x015e, 0x00ce, 0x007e, 0x005e, 0x004e, -+ 0x00be, 0x080c, 0xa8b2, 0x0005, 0x0016, 0x00f6, 0x080c, 0xc836, -+ 0x0198, 0xa864, 0x9084, 0x00ff, 0x9086, 0x0046, 0x0180, 0xa800, -+ 0x907d, 0x0138, 0xa803, 0x0000, 0xab82, 0x080c, 0x6d80, 0x2f48, -+ 0x0cb0, 0xab82, 0x080c, 0x6d80, 0x00fe, 0x001e, 0x0005, 0xa800, -+ 0x907d, 0x0130, 0xa803, 0x0000, 0x080c, 0x6d80, 0x2f48, 0x0cb8, -+ 0x080c, 0x6d80, 0x0c88, 0x00e6, 0x0046, 0x0036, 0x2061, 0x1ddc, -+ 0x9005, 0x1138, 0x2071, 0x1800, 0x7454, 0x7074, 0x8001, 0x9402, -+ 0x12f8, 0x2100, 0x9c06, 0x0188, 0x6000, 0x9086, 0x0000, 0x0168, -+ 0x6008, 0x9206, 0x1150, 0x6320, 0x9386, 0x0009, 0x01b0, 0x6010, -+ 0x91a0, 0x0004, 0x2424, 0x9406, 0x0140, 0x9ce0, 0x001c, 0x2001, -+ 0x181a, 0x2004, 0x9c02, 0x1220, 0x0c20, 0x9085, 0x0001, 0x0008, -+ 0x9006, 0x003e, 0x004e, 0x00ee, 0x0005, 0x631c, 0xd3c4, 0x1d68, -+ 0x0c30, 0x0096, 0x0006, 0x080c, 0x103a, 0x000e, 0x090c, 0x0d7d, -+ 0xaae2, 0xa867, 0x010d, 0xa88e, 0x0026, 0x2010, 0x080c, 0xc826, -+ 0x2001, 0x0000, 0x0120, 0x2200, 0x9080, 0x0017, 0x2004, 0x002e, -+ 0xa87a, 0x9186, 0x0020, 0x0110, 0xa8e3, 0xffff, 0xa986, 0xac76, -+ 0xa87f, 0x0000, 0x2001, 0x198e, 0x2004, 0xa882, 0x9006, 0xa802, -+ 0xa86a, 0xa88a, 0x0126, 0x2091, 0x8000, 0x080c, 0x6d80, 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, 0x1987, 0x2004, 0x601a, 0x2009, 0x8020, 0x080c, -+ 0x921e, 0x001e, 0x0005, 0xa001, 0xa001, 0x0005, 0x6024, 0xd0e4, -+ 0x0158, 0xd0cc, 0x0118, 0x080c, 0xcb7d, 0x0030, 0x080c, 0xe524, -+ 0x080c, 0x88c1, 0x080c, 0xabed, 0x0005, 0x9280, 0x0008, 0x2004, -+ 0x9084, 0x000f, 0x0002, 0xe359, 0xe359, 0xe359, 0xe35b, 0xe359, -+ 0xe35b, 0xe35b, 0xe359, 0xe35b, 0xe359, 0xe359, 0xe359, 0xe359, -+ 0xe359, 0x9006, 0x0005, 0x9085, 0x0001, 0x0005, 0x9280, 0x0008, -+ 0x2004, 0x9084, 0x000f, 0x0002, 0xe372, 0xe372, 0xe372, 0xe372, -+ 0xe372, 0xe372, 0xe37f, 0xe372, 0xe372, 0xe372, 0xe372, 0xe372, -+ 0xe372, 0xe372, 0x6007, 0x003b, 0x602f, 0x0009, 0x6017, 0x2a00, -+ 0x6003, 0x0001, 0x2009, 0x8020, 0x080c, 0x921e, 0x0005, 0x0096, -+ 0x00c6, 0x2260, 0x080c, 0xe524, 0x604b, 0x0000, 0x6024, 0xc0f4, -+ 0xc0e4, 0x6026, 0x603b, 0x0000, 0x00ce, 0x00d6, 0x2268, 0x9186, -+ 0x0007, 0x1904, 0xe3d8, 0x6814, 0x9005, 0x0138, 0x2048, 0xa87c, -+ 0xd0fc, 0x1118, 0x00de, 0x009e, 0x08a8, 0x6007, 0x003a, 0x6003, -+ 0x0001, 0x2009, 0x8020, 0x080c, 0x921e, 0x00c6, 0x2d60, 0x6100, -+ 0x9186, 0x0002, 0x1904, 0xe44f, 0x6014, 0x9005, 0x1138, 0x6000, -+ 0x9086, 0x0007, 0x190c, 0x0d7d, 0x0804, 0xe44f, 0x2048, 0x080c, -+ 0xc838, 0x1130, 0x0028, 0x2048, 0xa800, 0x9005, 0x1de0, 0x2900, -+ 0x2048, 0xa87c, 0x9084, 0x0003, 0x9086, 0x0002, 0x1168, 0xa87c, -+ 0xc0dc, 0xc0f4, 0xa87e, 0xa880, 0xc0fc, 0xa882, 0x2009, 0x0043, -+ 0x080c, 0xdc5d, 0x0804, 0xe44f, 0x2009, 0x0041, 0x0804, 0xe449, -+ 0x9186, 0x0005, 0x15a0, 0x6814, 0x2048, 0xa87c, 0xd0bc, 0x1120, -+ 0x00de, 0x009e, 0x0804, 0xe372, 0xd0b4, 0x0128, 0xd0fc, 0x090c, -+ 0x0d7d, 0x0804, 0xe393, 0x6007, 0x003a, 0x6003, 0x0001, 0x2009, -+ 0x8020, 0x080c, 0x921e, 0x00c6, 0x2d60, 0x6100, 0x9186, 0x0002, -+ 0x0120, 0x9186, 0x0004, 0x1904, 0xe44f, 0x6814, 0x2048, 0xa97c, -+ 0xc1f4, 0xc1dc, 0xa97e, 0xa980, 0xc1fc, 0xc1bc, 0xa982, 0x00f6, -+ 0x2c78, 0x080c, 0x1731, 0x00fe, 0x2009, 0x0042, 0x04d0, 0x0036, -+ 0x080c, 0x103a, 0x090c, 0x0d7d, 0xa867, 0x010d, 0x9006, 0xa802, -+ 0xa86a, 0xa88a, 0x2d18, 0xab8e, 0xa887, 0x0045, 0x2c00, 0xa892, -+ 0x6038, 0xa8a2, 0x2360, 0x6024, 0xc0dd, 0x6026, 0x6010, 0x00b6, -+ 0x2058, 0xb8a0, 0x00be, 0x2004, 0x635c, 0xab7a, 0xa876, 0x9006, -+ 0xa87e, 0xa882, 0xad9a, 0xae96, 0xa89f, 0x0001, 0x080c, 0x6d80, -+ 0x2019, 0x0045, 0x6008, 0x2068, 0x080c, 0xde1b, 0x2d00, 0x600a, -+ 0x6023, 0x0006, 0x6003, 0x0007, 0x901e, 0x631a, 0x634a, 0x003e, -+ 0x0038, 0x604b, 0x0000, 0x6003, 0x0007, 0x080c, 0xdc5d, 0x00ce, -+ 0x00de, 0x009e, 0x0005, 0x9186, 0x0013, 0x1128, 0x6004, 0x9082, -+ 0x0085, 0x2008, 0x00c2, 0x9186, 0x0027, 0x1178, 0x080c, 0x95de, -+ 0x0036, 0x0096, 0x6014, 0x2048, 0x2019, 0x0004, 0x080c, 0xe26c, -+ 0x009e, 0x003e, 0x080c, 0x96a0, 0x0005, 0x9186, 0x0014, 0x0d70, -+ 0x080c, 0xaca9, 0x0005, 0xe482, 0xe480, 0xe480, 0xe480, 0xe480, -+ 0xe480, 0xe482, 0xe480, 0xe480, 0xe480, 0xe480, 0xe480, 0xe480, -+ 0x080c, 0x0d7d, 0x6003, 0x000c, 0x080c, 0x96a0, 0x0005, 0x9182, -+ 0x0092, 0x1220, 0x9182, 0x0085, 0x0208, 0x001a, 0x080c, 0xaca9, -+ 0x0005, 0xe49e, 0xe49e, 0xe49e, 0xe49e, 0xe4a0, 0xe4c0, 0xe49e, -+ 0xe49e, 0xe49e, 0xe49e, 0xe49e, 0xe49e, 0xe49e, 0x080c, 0x0d7d, -+ 0x00d6, 0x2c68, 0x080c, 0xab97, 0x01b0, 0x6003, 0x0001, 0x6007, -+ 0x001e, 0x2009, 0x026e, 0x210c, 0x613a, 0x2009, 0x026f, 0x210c, -+ 0x613e, 0x600b, 0xffff, 0x6910, 0x6112, 0x6023, 0x0004, 0x2009, -+ 0x8020, 0x080c, 0x921e, 0x2d60, 0x080c, 0xabed, 0x00de, 0x0005, -+ 0x080c, 0xabed, 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, -+ 0x00be, 0xd0ec, 0x00ee, 0x0005, 0x2009, 0x1867, 0x210c, 0xd1ec, -+ 0x05b0, 0x6003, 0x0002, 0x6024, 0xc0e5, 0x6026, 0xd0cc, 0x0150, -+ 0x2001, 0x1988, 0x2004, 0x604a, 0x2009, 0x1867, 0x210c, 0xd1f4, -+ 0x1520, 0x00a0, 0x2009, 0x1867, 0x210c, 0xd1f4, 0x0128, 0x6024, -+ 0xc0e4, 0x6026, 0x9006, 0x00d8, 0x2001, 0x1988, 0x200c, 0x2001, -+ 0x1986, 0x2004, 0x9100, 0x9080, 0x000a, 0x604a, 0x6010, 0x00b6, -+ 0x2058, 0xb8bc, 0x00be, 0x0008, 0x2104, 0x9005, 0x0118, 0x9088, -+ 0x0003, 0x0cd0, 0x2c0a, 0x600f, 0x0000, 0x9085, 0x0001, 0x0005, -+ 0x0016, 0x00c6, 0x00e6, 0x615c, 0xb8bc, 0x2060, 0x8cff, 0x0180, -+ 0x84ff, 0x1118, 0x605c, 0x9106, 0x1138, 0x600c, 0x2072, 0x080c, -+ 0x88c1, 0x080c, 0xabed, 0x0010, 0x9cf0, 0x0003, 0x2e64, 0x0c70, -+ 0x00ee, 0x00ce, 0x001e, 0x0005, 0x00d6, 0x00b6, 0x6010, 0x2058, -+ 0xb8bc, 0x2068, 0x9005, 0x0130, 0x9c06, 0x0110, 0x680c, 0x0cd0, -+ 0x600c, 0x680e, 0x00be, 0x00de, 0x0005, 0x0026, 0x0036, 0x0156, -+ 0x2011, 0x182c, 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, 0xbbc2, 0x009e, 0x1168, 0x2011, 0x0274, -+ 0x20a9, 0x0004, 0x6010, 0x0096, 0x2048, 0x2019, 0x0006, 0x080c, -+ 0xbbc2, 0x009e, 0x1100, 0x015e, 0x003e, 0x002e, 0x0005, 0x00e6, -+ 0x2071, 0x1800, 0x080c, 0x5fbc, 0x080c, 0x2fb2, 0x00ee, 0x0005, -+ 0x0096, 0x0026, 0x080c, 0x103a, 0x090c, 0x0d7d, 0xa85c, 0x9080, -+ 0x001a, 0x20a0, 0x20a9, 0x000c, 0xa860, 0x20e8, 0x9006, 0x4004, -+ 0x9186, 0x0046, 0x1118, 0xa867, 0x0136, 0x0038, 0xa867, 0x0138, -+ 0x9186, 0x0041, 0x0110, 0xa87b, 0x0001, 0x7038, 0x9084, 0xff00, -+ 0x7240, 0x9294, 0xff00, 0x8007, 0x9215, 0xaa9a, 0x9186, 0x0046, -+ 0x1168, 0x7038, 0x9084, 0x00ff, 0x723c, 0x9294, 0xff00, 0x9215, -+ 0xaa9e, 0x723c, 0x9294, 0x00ff, 0xaaa2, 0x0060, 0x7040, 0x9084, -+ 0x00ff, 0x7244, 0x9294, 0xff00, 0x9215, 0xaa9e, 0x7244, 0x9294, -+ 0x00ff, 0xaaa2, 0x9186, 0x0046, 0x1118, 0x9e90, 0x0012, 0x0010, -+ 0x9e90, 0x001a, 0x2204, 0x8007, 0xa8a6, 0x8210, 0x2204, 0x8007, -+ 0xa8aa, 0x8210, 0x2204, 0x8007, 0xa8ae, 0x8210, 0x2204, 0x8007, -+ 0xa8b2, 0x8210, 0x9186, 0x0046, 0x11b8, 0x9e90, 0x0016, 0x2204, -+ 0x8007, 0xa8b6, 0x8210, 0x2204, 0x8007, 0xa8ba, 0x8210, 0x2204, -+ 0x8007, 0xa8be, 0x8210, 0x2204, 0x8007, 0xa8c2, 0x8210, 0x2011, -+ 0x0205, 0x2013, 0x0001, 0x00b0, 0x9e90, 0x001e, 0x2204, 0x8007, -+ 0xa8b6, 0x8210, 0x2204, 0x8007, 0xa8ba, 0x2011, 0x0205, 0x2013, -+ 0x0001, 0x2011, 0x0260, 0x2204, 0x8007, 0xa8be, 0x8210, 0x2204, -+ 0x8007, 0xa8c2, 0x9186, 0x0046, 0x1118, 0x2011, 0x0262, 0x0010, -+ 0x2011, 0x026a, 0x0146, 0x01d6, 0x0036, 0x20a9, 0x0001, 0x2019, -+ 0x0008, 0xa860, 0x20e8, 0xa85c, 0x9080, 0x0031, 0x20a0, 0x2204, -+ 0x8007, 0x4004, 0x8210, 0x8319, 0x1dd0, 0x003e, 0x01ce, 0x013e, -+ 0x2011, 0x0205, 0x2013, 0x0000, 0x002e, 0x080c, 0x6d80, 0x009e, -+ 0x0005, 0x00e6, 0x6010, 0x00b6, 0x2058, 0xb800, 0x00be, 0xd0fc, -+ 0x0108, 0x0011, 0x00ee, 0x0005, 0xa880, 0xc0e5, 0xa882, 0x0005, -+ 0x00e6, 0x00d6, 0x00c6, 0x0076, 0x0066, 0x0056, 0x0046, 0x0026, -+ 0x0016, 0x0126, 0x2091, 0x8000, 0x2029, 0x19f3, 0x252c, 0x2021, -+ 0x19fa, 0x2424, 0x2061, 0x1ddc, 0x2071, 0x1800, 0x7654, 0x7074, -+ 0x9606, 0x0578, 0x6720, 0x9786, 0x0001, 0x0118, 0x9786, 0x0008, -+ 0x1500, 0x2500, 0x9c06, 0x01e8, 0x2400, 0x9c06, 0x01d0, 0x080c, -+ 0xe2fa, 0x01b8, 0x080c, 0xe30a, 0x11a0, 0x6000, 0x9086, 0x0004, -+ 0x1120, 0x0016, 0x080c, 0x1a6a, 0x001e, 0x080c, 0xca3c, 0x1110, -+ 0x080c, 0x321c, 0x080c, 0xca4d, 0x1110, 0x080c, 0xb5b5, 0x080c, -+ 0xac28, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1208, -+ 0x0858, 0x012e, 0x001e, 0x002e, 0x004e, 0x005e, 0x006e, 0x007e, -+ 0x00ce, 0x00de, 0x00ee, 0x0005, 0x2001, 0x1810, 0x2004, 0xd0dc, -+ 0x0005, 0x0006, 0x2001, 0x1837, 0x2004, 0xd09c, 0x000e, 0x0005, -+ 0x0006, 0x0036, 0x0046, 0x080c, 0xcf52, 0x0168, 0x2019, 0xffff, -+ 0x9005, 0x0128, 0x6010, 0x00b6, 0x2058, 0xbba0, 0x00be, 0x2021, -+ 0x0004, 0x080c, 0x4cbe, 0x004e, 0x003e, 0x000e, 0x6004, 0x9086, -+ 0x0001, 0x1128, 0x080c, 0xa38a, 0x080c, 0xac28, 0x9006, 0x0005, -+ 0x00e6, 0x00c6, 0x00b6, 0x0046, 0x2061, 0x1ddc, 0x2071, 0x1800, -+ 0x7454, 0x7074, 0x8001, 0x9402, 0x12b8, 0x2100, 0x9c06, 0x0148, -+ 0x6000, 0x9086, 0x0000, 0x0128, 0x6010, 0x2058, 0xb8a0, 0x9206, -+ 0x0140, 0x9ce0, 0x001c, 0x2001, 0x181a, 0x2004, 0x9c02, 0x1220, -+ 0x0c60, 0x9085, 0x0001, 0x0008, 0x9006, 0x004e, 0x00be, 0x00ce, -+ 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x0016, 0x2091, 0x8000, -+ 0x2071, 0x1840, 0xd5a4, 0x0118, 0x7004, 0x8000, 0x7006, 0xd5b4, -+ 0x0118, 0x7000, 0x8000, 0x7002, 0xd5ac, 0x0178, 0x2500, 0x9084, -+ 0x0007, 0x908e, 0x0003, 0x0148, 0x908e, 0x0004, 0x0130, 0x908e, -+ 0x0005, 0x0118, 0x2071, 0xfffe, 0x0089, 0x001e, 0x00ee, 0x000e, -+ 0x012e, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, 0x2071, -+ 0xfff6, 0x0021, 0x00ee, 0x000e, 0x012e, 0x0005, 0x2e05, 0x8000, -+ 0x2077, 0x1220, 0x8e70, 0x2e05, 0x8000, 0x2077, 0x0005, 0x00e6, -+ 0x2071, 0xfff4, 0x0c99, 0x00ee, 0x0005, 0x00e6, 0x2071, 0xfff8, -+ 0x0c69, 0x00ee, 0x0005, 0x0126, 0x0006, 0x00e6, 0x2091, 0x8000, -+ 0x2071, 0x1840, 0x7014, 0x8000, 0x7016, 0x00ee, 0x000e, 0x012e, -+ 0x0005, 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, -+ 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, -+ 0x8000, 0x7155 -+}; -+#ifdef UNIQUE_FW_NAME -+unsigned short fw2322ipx_length01 = 0xdf42; -+#else -+unsigned short risc_code_length01 = 0xdf42; -+#endif -+ -+/* -+ * -+ */ -+ -+unsigned long rseqipx_code_addr01 = 0x0001c000 ; -+unsigned short rseqipx_code01[] = { -+0x000b, 0x0003, 0x0000, 0x09d8, 0x0001, 0xc000, 0x0008, 0x8064, -+ 0x0000, 0x0010, 0x0000, 0x8066, 0x0008, 0x0101, 0x0003, 0xc007, -+ 0x0008, 0x80e0, 0x0008, 0xff00, 0x0000, 0x80e2, 0x0008, 0xff00, -+ 0x0008, 0x0162, 0x0000, 0x8066, 0x0008, 0xa101, 0x000b, 0xc00f, -+ 0x0008, 0x0d02, 0x0000, 0x8060, 0x0000, 0x0400, 0x0003, 0x60c2, -+ 0x0003, 0x5817, 0x000b, 0x7ae0, 0x000b, 0x521c, 0x000b, 0xc813, -+ 0x0009, 0xbac0, 0x0000, 0x008a, 0x0003, 0x8813, 0x0000, 0x15fc, -+ 0x000b, 0xb013, 0x0009, 0xc4c0, 0x0000, 0x7000, 0x0001, 0xffa0, -+ 0x0000, 0x2000, 0x0003, 0x9394, 0x0008, 0x808c, 0x0000, 0x0001, -+ 0x0007, 0x0000, 0x0007, 0x0000, 0x0000, 0x40d4, 0x000a, 0x4047, -+ 0x0008, 0x808c, 0x0000, 0x0002, 0x0007, 0x0000, 0x0003, 0x082e, -+ 0x0000, 0x4022, 0x0003, 0x0034, 0x0008, 0x4122, 0x0009, 0xeac0, -+ 0x0008, 0xff00, 0x0009, 0xffe0, 0x0008, 0x0500, 0x0003, 0x0bbb, -+ 0x0002, 0x4447, 0x000b, 0x8bb8, 0x0008, 0x0bfe, 0x0001, 0x11a0, -+ 0x0003, 0x139a, 0x0001, 0x0ca0, 0x0003, 0x139a, 0x0001, 0x9180, -+ 0x0000, 0x0004, 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc042, 0x0008, 0x808c, -+ 0x0008, 0x0000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0004, -+ 0x0000, 0x8066, 0x0000, 0x0411, 0x0003, 0xc04a, 0x0000, 0x03fe, -+ 0x0001, 0x43e0, 0x0003, 0x8b97, 0x0009, 0xc2c0, 0x0008, 0x00ff, -+ 0x0001, 0x02e0, 0x0003, 0x8b97, 0x0001, 0x9180, 0x0008, 0x0005, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0000, 0x0019, 0x000b, 0xc059, 0x0002, 0x0240, 0x000b, 0x0b94, -+ 0x0008, 0x00fc, 0x0003, 0x3397, 0x000a, 0x0244, 0x000b, 0x086b, -+ 0x000c, 0x01f5, 0x0001, 0x9180, 0x0000, 0x0007, 0x0008, 0x7f62, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0002, 0x0234, 0x0008, 0x7f04, -+ 0x0000, 0x8066, 0x0000, 0x040a, 0x000b, 0xc06a, 0x000a, 0x0248, -+ 0x000b, 0x0875, 0x0001, 0x9180, 0x0008, 0x0006, 0x0008, 0x7f62, -+ 0x0008, 0x8002, 0x0008, 0x0003, 0x0000, 0x8066, 0x0000, 0x020a, -+ 0x000b, 0xc074, 0x0000, 0x112a, 0x0008, 0x002e, 0x0008, 0x022c, -+ 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x808c, 0x0000, 0x0002, -+ 0x0008, 0x1760, 0x0008, 0x8062, 0x0008, 0x000f, 0x0000, 0x8066, -+ 0x0008, 0x0011, 0x000b, 0xc081, 0x0008, 0x01fe, 0x0009, 0x42e0, -+ 0x000b, 0x8b87, 0x0000, 0x00fe, 0x0001, 0x43e0, 0x000b, 0x8b87, -+ 0x0000, 0x1734, 0x0000, 0x1530, 0x0008, 0x1632, 0x0008, 0x0d2a, -+ 0x0001, 0x9880, 0x0008, 0x0012, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x1e0a, 0x000b, 0xc093, -+ 0x0008, 0x808a, 0x0008, 0x0003, 0x0000, 0x1a60, 0x0008, 0x8062, -+ 0x0000, 0x0002, 0x0003, 0x5899, 0x0000, 0x8066, 0x0000, 0x3679, -+ 0x000b, 0xc09c, 0x000b, 0x589d, 0x0008, 0x8054, 0x0008, 0x0011, -+ 0x0000, 0x8074, 0x0008, 0x1010, 0x0008, 0x1efc, 0x0003, 0x3013, -+ 0x0004, 0x00a6, 0x0003, 0x0013, 0x0000, 0x1c60, 0x0000, 0x1b62, -+ 0x0000, 0x8066, 0x0008, 0x0231, 0x000b, 0xc0aa, 0x000b, 0x58ab, -+ 0x0008, 0x0140, 0x0000, 0x0242, 0x0002, 0x1f43, 0x0003, 0x88b5, -+ 0x0000, 0x0d44, 0x0008, 0x0d46, 0x0008, 0x0348, 0x0008, 0x044a, -+ 0x0003, 0x00b9, 0x0008, 0x0344, 0x0008, 0x0446, 0x0008, 0x0548, -+ 0x0000, 0x064a, 0x000a, 0x1948, 0x000b, 0x08bc, 0x0008, 0x0d4a, -+ 0x000b, 0x58bc, 0x0008, 0x8054, 0x0000, 0x0001, 0x0000, 0x8074, -+ 0x0008, 0x2020, 0x000f, 0x4000, 0x0000, 0x4820, 0x0008, 0x0bfe, -+ 0x0009, 0x10a0, 0x0003, 0x1123, 0x0001, 0x0ca0, 0x0003, 0x1123, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0008, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc0cf, -+ 0x0001, 0x80e0, 0x0008, 0x0003, 0x000b, 0x8923, 0x0000, 0x49b4, -+ 0x0002, 0x4b4e, 0x000b, 0x892c, 0x0008, 0x808a, 0x0000, 0x0004, -+ 0x0000, 0x18fe, 0x0001, 0x10e0, 0x000b, 0x88dd, 0x0002, 0x192f, -+ 0x0008, 0x7f32, 0x0008, 0x15fe, 0x0001, 0x10e0, 0x000b, 0x88e2, -+ 0x0002, 0x162f, 0x0008, 0x7f2c, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0009, 0x9080, 0x0000, 0x0007, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0008, 0x0009, 0x0003, 0xc0e9, 0x000a, 0x004f, 0x000b, 0x891a, -+ 0x000a, 0x0040, 0x0003, 0x0904, 0x0002, 0x004e, 0x0003, 0x0904, -+ 0x0002, 0x0030, 0x0002, 0x7f2f, 0x0000, 0x7f00, 0x0000, 0x8066, -+ 0x0008, 0x000a, 0x000b, 0xc0f5, 0x0008, 0x1010, 0x0004, 0x01dc, -+ 0x000b, 0xb0fd, 0x000c, 0x035b, 0x000c, 0x01c6, 0x000b, 0x7814, -+ 0x0003, 0x0013, 0x0000, 0x0806, 0x0008, 0x8010, 0x0000, 0x001f, -+ 0x000c, 0x035b, 0x0000, 0x0310, 0x000c, 0x035b, 0x0003, 0x00fb, -+ 0x000a, 0x002f, 0x0000, 0x7f00, 0x0000, 0x8066, 0x0008, 0x000a, -+ 0x000b, 0xc108, 0x000c, 0x019f, 0x000a, 0x0040, 0x000b, 0x091d, -+ 0x000c, 0x020c, 0x0000, 0x8000, 0x0000, 0x0002, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0006, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0x000a, 0x000b, 0xc116, 0x0000, 0x8072, -+ 0x0000, 0x4000, 0x0003, 0x00fb, 0x0008, 0x8010, 0x0008, 0x001e, -+ 0x000b, 0x011f, 0x0008, 0x8010, 0x0008, 0x001d, 0x000c, 0x035b, -+ 0x0008, 0x1010, 0x000c, 0x035b, 0x000b, 0x0014, 0x0002, 0x4b4e, -+ 0x0003, 0x0929, 0x0008, 0x808a, 0x0000, 0x0004, 0x000b, 0x6129, -+ 0x000f, 0x8000, 0x0008, 0x808a, 0x0000, 0x0004, 0x000b, 0x0014, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0011, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc133, -+ 0x000a, 0x004f, 0x0003, 0x8990, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0009, 0x9080, 0x0008, 0x0005, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0008, 0x0009, 0x000b, 0xc13d, 0x0008, 0x0060, 0x0008, 0x8062, -+ 0x0000, 0x001f, 0x0000, 0x8066, 0x0000, 0x0209, 0x000b, 0xc143, -+ 0x000a, 0x014b, 0x000b, 0x0990, 0x0008, 0x8062, 0x0008, 0x000f, -+ 0x0000, 0x8066, 0x0000, 0x0211, 0x000b, 0xc14a, 0x0008, 0x01fe, -+ 0x0001, 0x02d0, 0x0003, 0x8990, 0x0004, 0x01a8, 0x000b, 0x0990, -+ 0x0008, 0x03a0, 0x0008, 0x8004, 0x0000, 0x0002, 0x0000, 0x8006, -+ 0x0000, 0x0043, 0x0008, 0x4908, 0x0008, 0x808a, 0x0000, 0x0004, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0000, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x041a, 0x0003, 0xc15f, -+ 0x000b, 0xe160, 0x0008, 0x4908, 0x0008, 0x480a, 0x0008, 0x808a, -+ 0x0000, 0x0004, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x002b, -+ 0x0000, 0x8066, 0x0000, 0x0411, 0x0003, 0xc16a, 0x0008, 0x04fe, -+ 0x0009, 0x02a0, 0x0003, 0x9171, 0x0002, 0x0500, 0x000b, 0x098d, -+ 0x0003, 0x0172, 0x0000, 0x05fe, 0x0001, 0x03a0, 0x000b, 0x118d, -+ 0x0000, 0x0d0c, 0x0008, 0x0d0e, 0x0008, 0x0d10, 0x0000, 0x0d12, -+ 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, 0x0000, 0x8066, -+ 0x0008, 0x0832, 0x0003, 0xc17d, 0x0000, 0x800a, 0x0000, 0x8005, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0009, 0x9080, 0x0008, 0x0011, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0a12, 0x0003, 0xc187, -+ 0x0008, 0x5006, 0x0008, 0x100e, 0x0004, 0x01b3, 0x000b, 0x7814, -+ 0x0003, 0x0013, 0x0008, 0x0208, 0x0008, 0x030a, 0x0003, 0x0174, -+ 0x000c, 0x019f, 0x0008, 0x808a, 0x0000, 0x0004, 0x0008, 0x8010, -+ 0x0008, 0x0021, 0x000c, 0x035b, 0x0008, 0x1010, 0x000c, 0x035b, -+ 0x0000, 0x4810, 0x000c, 0x035b, 0x0008, 0x4910, 0x000c, 0x035b, -+ 0x0008, 0x808a, 0x0000, 0x0004, 0x000b, 0x0014, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0009, 0x9080, 0x0000, 0x0002, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0xb40a, 0x0003, 0xc1a6, 0x000f, 0x4000, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x0a62, 0x0000, 0x8066, -+ 0x0000, 0x0411, 0x000b, 0xc1ad, 0x0002, 0x0210, 0x0001, 0xffc0, -+ 0x0000, 0x0007, 0x0009, 0x03e0, 0x000f, 0x4000, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0001, 0x8380, 0x0000, 0x0002, 0x0009, 0x0a80, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0000, 0x0e0a, 0x0003, 0xc1bb, -+ 0x0002, 0x0300, 0x0001, 0xffc0, 0x0000, 0x0007, 0x0000, 0x7f06, -+ 0x0002, 0x0a00, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x060a, -+ 0x000b, 0xc1c4, 0x000f, 0x4000, 0x0000, 0x0da0, 0x0008, 0x0da2, -+ 0x0008, 0x0da4, 0x0009, 0x8880, 0x0000, 0x0001, 0x0008, 0x7f62, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0000, 0x8066, 0x0008, 0xa012, -+ 0x0000, 0x0da6, 0x0008, 0x0da8, 0x0000, 0x0daa, 0x0000, 0x0dac, -+ 0x0003, 0xc1d4, 0x0009, 0x8880, 0x0008, 0x0009, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0xa03a, 0x000b, 0xc1da, 0x000f, 0x4000, -+ 0x0009, 0x8880, 0x0008, 0x0005, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc1e3, -+ 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x000d, 0x0000, 0x8066, -+ 0x0008, 0x0021, 0x000b, 0xc1e9, 0x0000, 0x00fe, 0x0001, 0x01d0, -+ 0x000b, 0x89f2, 0x0008, 0x02fe, 0x0009, 0x03d0, 0x0003, 0x09f2, -+ 0x0000, 0x0d06, 0x000f, 0x4000, 0x0000, 0x8006, 0x0000, 0x0001, -+ 0x000f, 0x4000, 0x0008, 0x0060, 0x0008, 0x8062, 0x0008, 0x002b, -+ 0x0000, 0x8066, 0x0008, 0xa041, 0x0003, 0xc1fa, 0x0002, 0x0243, -+ 0x000b, 0x8a01, 0x0000, 0x54ac, 0x0000, 0x55ae, 0x0008, 0x0da8, -+ 0x0000, 0x0daa, 0x0000, 0x50b0, 0x0000, 0x51b2, 0x0000, 0x0db4, -+ 0x0008, 0x0db6, 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0007, -+ 0x0000, 0x8066, 0x0008, 0xa452, 0x0003, 0xc20a, 0x000f, 0x4000, -+ 0x000a, 0x3945, 0x000b, 0x8a16, 0x0000, 0x8072, 0x0008, 0x4040, -+ 0x0007, 0x0000, 0x000a, 0x3945, 0x0003, 0x8a14, 0x000f, 0x4000, -+ 0x0000, 0x8072, 0x0000, 0x4000, 0x0007, 0x0000, 0x0007, 0x0000, -+ 0x0007, 0x0000, 0x000a, 0x3945, 0x0003, 0x0a0e, 0x000b, 0x0216, -+ 0x000a, 0x3a40, 0x000b, 0x8817, 0x0008, 0x2b24, 0x0008, 0x2b24, -+ 0x0003, 0x5a20, 0x0008, 0x8054, 0x0000, 0x0002, 0x0002, 0x1242, -+ 0x0003, 0x0a64, 0x000a, 0x3a45, 0x000b, 0x0a55, 0x000a, 0x1e10, -+ 0x0000, 0x7f3c, 0x0003, 0x0a52, 0x0002, 0x1d00, 0x0000, 0x7f3a, -+ 0x0000, 0x0d60, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, -+ 0x0003, 0xc230, 0x0008, 0x00fc, 0x0003, 0xb24f, 0x0000, 0x1c60, -+ 0x0008, 0x8062, 0x0000, 0x0001, 0x0000, 0x8066, 0x0008, 0x0009, -+ 0x000b, 0xc238, 0x0008, 0x00fc, 0x0003, 0x3370, 0x0000, 0x0038, -+ 0x0008, 0x0060, 0x0008, 0x8062, 0x0000, 0x0019, 0x0000, 0x8066, -+ 0x0008, 0x0009, 0x0003, 0xc241, 0x0009, 0x80c0, 0x0008, 0x00ff, -+ 0x0008, 0x7f3e, 0x0000, 0x0d60, 0x0008, 0x0efe, 0x0001, 0x1f80, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc24b, -+ 0x0008, 0x003a, 0x0000, 0x1dfe, 0x000b, 0x022c, 0x0008, 0x0036, -+ 0x0004, 0x00a6, 0x000b, 0x0264, 0x0000, 0x8074, 0x0000, 0x2000, -+ 0x000b, 0x0264, 0x0002, 0x3a44, 0x000b, 0x0b9d, 0x0000, 0x8074, -+ 0x0000, 0x1000, 0x0000, 0x2d0e, 0x0000, 0x2d0e, 0x000b, 0xb36d, -+ 0x0008, 0x26fe, 0x0008, 0x26fe, 0x0008, 0x2700, 0x0008, 0x2700, -+ 0x0009, 0x00d0, 0x0003, 0x8a74, 0x0000, 0x8074, 0x0008, 0x4040, -+ 0x0003, 0x5a64, 0x000b, 0x521c, 0x000a, 0x3a46, 0x0003, 0x8a74, -+ 0x0002, 0x3a47, 0x000b, 0x0a6f, 0x0008, 0x8054, 0x0000, 0x0004, -+ 0x0000, 0x8074, 0x0000, 0x8000, 0x0003, 0x02d4, 0x0009, 0x92c0, -+ 0x0000, 0x0fc8, 0x000b, 0x0813, 0x000a, 0x1246, 0x0003, 0x8b67, -+ 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x0002, 0x0000, 0x8066, -+ 0x0000, 0x367a, 0x000b, 0xc279, 0x0009, 0x92c0, 0x0008, 0x0780, -+ 0x000b, 0x8b81, 0x0002, 0x124b, 0x000b, 0x0a82, 0x0002, 0x2e4d, -+ 0x0002, 0x2e4d, 0x000b, 0x0b6d, 0x000a, 0x3a46, 0x000b, 0x8a92, -+ 0x000b, 0x5a84, 0x0008, 0x8054, 0x0000, 0x0004, 0x000a, 0x1243, -+ 0x000b, 0x0ad2, 0x0008, 0x8010, 0x0000, 0x000d, 0x000c, 0x035b, -+ 0x000a, 0x1948, 0x0003, 0x0a8f, 0x0004, 0x0350, 0x0000, 0x1810, -+ 0x000c, 0x035b, 0x0003, 0x02d2, 0x000a, 0x1948, 0x000b, 0x0a96, -+ 0x000a, 0x1243, 0x000b, 0x0b70, 0x000a, 0x194d, 0x000b, 0x0a9a, -+ 0x000a, 0x1243, 0x0003, 0x0b77, 0x000b, 0x5a9a, 0x0008, 0x8054, -+ 0x0000, 0x0004, 0x000a, 0x192e, 0x0008, 0x7f32, 0x000a, 0x1947, -+ 0x000b, 0x0acc, 0x0002, 0x194f, 0x000b, 0x0aaa, 0x0004, 0x0350, -+ 0x0000, 0x1810, 0x0004, 0x01dc, 0x000b, 0xb2c5, 0x000c, 0x035b, -+ 0x000c, 0x01c6, 0x0003, 0x02d2, 0x0000, 0x1a60, 0x0008, 0x8062, -+ 0x0000, 0x001f, 0x0000, 0x8066, 0x0008, 0x0009, 0x0003, 0xc2af, -+ 0x000a, 0x004c, 0x0003, 0x8acc, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0001, 0x9880, 0x0000, 0x0007, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0000, 0x320a, 0x000b, 0xc2b9, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0001, 0x9880, 0x0008, 0x0012, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0008, 0x1e0a, 0x000b, 0xc2c1, 0x0000, 0x1826, 0x0000, 0x1928, -+ 0x0003, 0x02d2, 0x0000, 0x0806, 0x0008, 0x8010, 0x0000, 0x001f, -+ 0x000c, 0x035b, 0x0000, 0x0310, 0x000c, 0x035b, 0x0003, 0x02d2, -+ 0x0004, 0x0350, 0x0008, 0x8010, 0x0000, 0x0001, 0x000c, 0x035b, -+ 0x0000, 0x1810, 0x000c, 0x035b, 0x0000, 0x8074, 0x0008, 0xf000, -+ 0x0000, 0x0d30, 0x0002, 0x3a42, 0x000b, 0x8ada, 0x0000, 0x15fc, -+ 0x000b, 0xb07a, 0x0003, 0x0013, 0x0000, 0x8074, 0x0000, 0x0501, -+ 0x0008, 0x8010, 0x0008, 0x000c, 0x000c, 0x035b, 0x0003, 0x0013, -+ 0x0009, 0xbbe0, 0x0008, 0x0030, 0x0003, 0x8af6, 0x0000, 0x18fe, -+ 0x0009, 0x3ce0, 0x000b, 0x0af3, 0x0008, 0x15fe, 0x0009, 0x3ce0, -+ 0x000b, 0x0af3, 0x0008, 0x13fe, 0x0009, 0x3ce0, 0x000b, 0x8aef, -+ 0x000c, 0x0349, 0x0008, 0x0d26, 0x0003, 0x02f0, 0x0004, 0x034b, -+ 0x0008, 0x8076, 0x0000, 0x0040, 0x0003, 0x0346, 0x0008, 0x8076, -+ 0x0008, 0x0041, 0x0003, 0x0346, 0x0009, 0xbbe0, 0x0000, 0x0032, -+ 0x000b, 0x8afb, 0x0008, 0x3c1e, 0x0003, 0x0346, 0x0009, 0xbbe0, -+ 0x0000, 0x003b, 0x000b, 0x8b00, 0x0000, 0x3cdc, 0x0003, 0x0346, -+ 0x0009, 0xbbe0, 0x0008, 0x0035, 0x000b, 0x8b06, 0x0000, 0x8072, -+ 0x0000, 0x8000, 0x0003, 0x04aa, 0x0009, 0xbbe0, 0x0008, 0x0036, -+ 0x000b, 0x0bcd, 0x0009, 0xbbe0, 0x0000, 0x0037, 0x000b, 0x8b27, -+ 0x0000, 0x18fe, 0x0009, 0x3ce0, 0x0003, 0x8af3, 0x0008, 0x8076, -+ 0x0000, 0x0040, 0x0000, 0x1a60, 0x0008, 0x8062, 0x0000, 0x000d, -+ 0x0008, 0x2604, 0x0008, 0x2604, 0x0008, 0x2706, 0x0008, 0x2706, -+ 0x0000, 0x2808, 0x0000, 0x2808, 0x0000, 0x290a, 0x0000, 0x290a, -+ 0x0000, 0x8066, 0x0000, 0x0422, 0x000b, 0xc31e, 0x0004, 0x0350, -+ 0x0008, 0x8054, 0x0000, 0x0004, 0x0000, 0x8074, 0x0008, 0xf000, -+ 0x0000, 0x8072, 0x0000, 0x8000, 0x0003, 0x02d4, 0x0009, 0xbbe0, -+ 0x0000, 0x0038, 0x000b, 0x8b39, 0x0000, 0x18fe, 0x0009, 0x3ce0, -+ 0x0003, 0x0b36, 0x0008, 0x15fe, 0x0009, 0x3ce0, 0x000b, 0x8ae9, -+ 0x0004, 0x034b, 0x0008, 0x8076, 0x0000, 0x0040, 0x0000, 0x8072, -+ 0x0000, 0x8000, 0x0003, 0x0394, 0x0008, 0x8076, 0x0008, 0x0042, -+ 0x0003, 0x0346, 0x0009, 0xbbe0, 0x0000, 0x0016, 0x0003, 0x8b46, -+ 0x0000, 0x8074, 0x0008, 0x0808, 0x0002, 0x3a44, 0x0003, 0x8816, -+ 0x0000, 0x8074, 0x0000, 0x0800, 0x0000, 0x8072, 0x0000, 0x8000, -+ 0x000f, 0x8000, 0x0003, 0x0013, 0x0000, 0x8072, 0x0000, 0x8000, -+ 0x0003, 0x0013, 0x0002, 0x1430, 0x0003, 0x034c, 0x000a, 0x3d30, -+ 0x0000, 0x7f00, 0x0001, 0xbc80, 0x0000, 0x0007, 0x0003, 0x0354, -+ 0x000a, 0x1930, 0x0000, 0x7f00, 0x0001, 0x9880, 0x0000, 0x0007, -+ 0x0000, 0x8060, 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0008, 0x000a, 0x000b, 0xc359, 0x000f, 0x4000, 0x000b, 0x235b, -+ 0x0008, 0x0870, 0x000f, 0x4000, 0x0009, 0xbac0, 0x0008, 0x0090, -+ 0x000b, 0x0b64, 0x0000, 0x8074, 0x0000, 0x0706, 0x000b, 0x0366, -+ 0x0000, 0x8074, 0x0000, 0x0703, 0x000f, 0x4000, 0x0008, 0x8010, -+ 0x0000, 0x0023, 0x0003, 0x03a2, 0x0008, 0x8010, 0x0000, 0x0008, -+ 0x0003, 0x03a2, 0x0008, 0x8010, 0x0008, 0x0022, 0x0003, 0x03a2, -+ 0x0004, 0x0350, 0x0008, 0x8010, 0x0000, 0x0007, 0x000c, 0x035b, -+ 0x0000, 0x1810, 0x000c, 0x035b, 0x000b, 0x03ac, 0x0004, 0x0350, -+ 0x0008, 0x8010, 0x0008, 0x001b, 0x000c, 0x035b, 0x0000, 0x1810, -+ 0x000c, 0x035b, 0x0000, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, -+ 0x0003, 0x0013, 0x0008, 0x8010, 0x0008, 0x0009, 0x0003, 0x03a2, -+ 0x0008, 0x8010, 0x0008, 0x0005, 0x0003, 0x03a2, 0x000a, 0x1648, -+ 0x000b, 0x8888, 0x0008, 0x808c, 0x0000, 0x0001, 0x0007, 0x0000, -+ 0x0008, 0x8010, 0x0000, 0x0004, 0x000a, 0x4143, 0x0003, 0x0888, -+ 0x0002, 0x3a44, 0x0003, 0x8813, 0x0008, 0x0d2a, 0x0003, 0x03a2, -+ 0x0008, 0x8010, 0x0008, 0x0003, 0x0003, 0x03a4, 0x0008, 0x8010, -+ 0x0000, 0x000b, 0x0003, 0x03a4, 0x0008, 0x8010, 0x0000, 0x0002, -+ 0x0003, 0x03a4, 0x0002, 0x3a47, 0x000b, 0x8a64, 0x0008, 0x8010, -+ 0x0008, 0x0006, 0x0003, 0x03a4, 0x0000, 0x8074, 0x0008, 0xf000, -+ 0x000c, 0x035b, 0x000c, 0x035e, 0x000a, 0x3a40, 0x000b, 0x0813, -+ 0x0008, 0x8010, 0x0008, 0x000c, 0x000c, 0x035b, 0x0003, 0x0013, -+ 0x0000, 0x8074, 0x0000, 0xf080, 0x0000, 0x0d30, 0x0002, 0x2e4d, -+ 0x0002, 0x2e4d, 0x000b, 0x0bb5, 0x0008, 0x8054, 0x0000, 0x0019, -+ 0x0003, 0x0013, 0x0008, 0x8054, 0x0008, 0x0009, 0x0003, 0x0013, -+ 0x0002, 0x3a44, 0x0003, 0x8813, 0x0003, 0x0397, 0x0008, 0x808c, -+ 0x0008, 0x0000, 0x0002, 0x4447, 0x0003, 0x0be1, 0x0001, 0xc0c0, -+ 0x0008, 0x00ff, 0x0009, 0xffe0, 0x0008, 0x00ff, 0x000b, 0x8bb8, -+ 0x0001, 0xc1e0, 0x0008, 0xffff, 0x000b, 0x8bb8, 0x0008, 0x8010, -+ 0x0000, 0x0013, 0x000c, 0x035b, 0x0000, 0x8074, 0x0008, 0x0202, -+ 0x0003, 0x0013, 0x000a, 0x3a40, 0x000b, 0x8bde, 0x0000, 0x8074, -+ 0x0000, 0x0200, 0x0000, 0x3d00, 0x0000, 0x3cfe, 0x0000, 0x8072, -+ 0x0000, 0x8000, 0x0001, 0x43e0, 0x0003, 0x8bdc, 0x0000, 0x42fe, -+ 0x0001, 0xffc0, 0x0008, 0x00ff, 0x0009, 0x00e0, 0x0003, 0x0bb8, -+ 0x0008, 0x0d08, 0x000b, 0x0431, 0x0000, 0x8072, 0x0000, 0x8000, -+ 0x0003, 0x0013, 0x0004, 0x04b3, 0x0008, 0x808c, 0x0000, 0x0001, -+ 0x0000, 0x04fc, 0x0003, 0x3496, 0x0000, 0x0460, 0x0008, 0x8062, -+ 0x0000, 0x0001, 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc3eb, -+ 0x0000, 0x0004, 0x0009, 0x80c0, 0x0008, 0x00ff, 0x0000, 0x7f00, -+ 0x0001, 0x80e0, 0x0000, 0x0004, 0x000b, 0x0c05, 0x0001, 0x80e0, -+ 0x0008, 0x0005, 0x000b, 0x0c05, 0x0001, 0x80e0, 0x0008, 0x0006, -+ 0x000b, 0x0c05, 0x0001, 0x82c0, 0x0008, 0xff00, 0x0008, 0x7f04, -+ 0x0009, 0x82e0, 0x0008, 0x0600, 0x000b, 0x0c05, 0x0009, 0x82e0, -+ 0x0008, 0x0500, 0x000b, 0x0c05, 0x0009, 0x82e0, 0x0000, 0x0400, -+ 0x0003, 0x8c96, 0x0009, 0xc4c0, 0x0000, 0x7000, 0x0009, 0xffe0, -+ 0x0000, 0x1000, 0x0003, 0x0c31, 0x0004, 0x04a4, 0x0002, 0x3941, -+ 0x0003, 0x0c10, 0x0000, 0x8072, 0x0000, 0x0400, 0x0003, 0x0013, -+ 0x0000, 0x0460, 0x0008, 0x80fe, 0x0008, 0x002b, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0x2209, 0x000b, 0xc416, 0x0008, 0x11fc, -+ 0x000b, 0x342c, 0x0001, 0x9180, 0x0000, 0x0002, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x0609, -+ 0x000b, 0xc420, 0x0000, 0x42fe, 0x0001, 0xffc0, 0x0008, 0xff00, -+ 0x0009, 0x03e0, 0x000b, 0x8c29, 0x0000, 0x8072, 0x0000, 0x0400, -+ 0x0003, 0x0052, 0x0001, 0x9180, 0x0008, 0x0003, 0x000b, 0x0413, -+ 0x0000, 0x8072, 0x0000, 0x0400, 0x0008, 0x8010, 0x0000, 0x0010, -+ 0x000b, 0x0489, 0x0004, 0x04a4, 0x0002, 0x3941, 0x0003, 0x0c37, -+ 0x0000, 0x8072, 0x0000, 0x0400, 0x0003, 0x0013, 0x0004, 0x046e, -+ 0x0008, 0x11fc, 0x000b, 0xb43f, 0x0000, 0x8072, 0x0000, 0x0400, -+ 0x0008, 0x8010, 0x0000, 0x000e, 0x000b, 0x0489, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0000, 0x04fc, 0x0003, 0xb454, 0x0008, 0x808c, -+ 0x0008, 0x0000, 0x0001, 0x9180, 0x0008, 0x0005, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0x0009, 0x000b, 0xc44a, 0x0008, 0x0060, -+ 0x0008, 0x8062, 0x0008, 0x001b, 0x0008, 0x4304, 0x0008, 0x4206, -+ 0x0000, 0x8066, 0x0000, 0x0412, 0x000b, 0xc452, 0x000b, 0x046b, -+ 0x0008, 0x808c, 0x0000, 0x0001, 0x0000, 0x0460, 0x0008, 0x8062, -+ 0x0008, 0x002b, 0x0000, 0x8066, 0x0008, 0x0609, 0x000b, 0xc45b, -+ 0x0000, 0x8066, 0x0008, 0x220a, 0x000b, 0xc45e, 0x0000, 0x42fe, -+ 0x0001, 0xffc0, 0x0008, 0xff00, 0x0008, 0x7f04, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0001, 0x9180, 0x0000, 0x0002, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0008, 0x041a, 0x0003, 0xc46a, 0x0000, 0x8072, -+ 0x0000, 0x0400, 0x0003, 0x0052, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0008, 0x6b62, 0x0000, 0x8066, 0x0000, 0x0411, 0x000b, 0xc473, -+ 0x0008, 0x02fe, 0x0009, 0x03e0, 0x000b, 0x8c79, 0x0000, 0x0d22, -+ 0x000f, 0x4000, 0x0009, 0x8280, 0x0000, 0x0002, 0x0001, 0x6b80, -+ 0x0008, 0x7f62, 0x0000, 0x8066, 0x0008, 0x2209, 0x000b, 0xc47f, -+ 0x000a, 0x0200, 0x0001, 0xffc0, 0x0000, 0x0007, 0x0000, 0x7f06, -+ 0x0008, 0x6b62, 0x0000, 0x8066, 0x0008, 0x060a, 0x0003, 0xc487, -+ 0x000f, 0x4000, 0x0002, 0x3a44, 0x0003, 0x8813, 0x000a, 0x2f44, -+ 0x000a, 0x2f44, 0x0003, 0x8b97, 0x0008, 0x808a, 0x0008, 0x0003, -+ 0x0000, 0x8074, 0x0000, 0xf080, 0x0003, 0x5c92, 0x0008, 0x8054, -+ 0x0000, 0x0019, 0x0003, 0x0013, 0x0002, 0x3a44, 0x0003, 0x8813, -+ 0x0008, 0x808c, 0x0008, 0x0000, 0x0008, 0x8010, 0x0008, 0x0011, -+ 0x000c, 0x035b, 0x0000, 0x42fe, 0x0001, 0xffc0, 0x0008, 0x00ff, -+ 0x0008, 0x7f10, 0x000c, 0x035b, 0x0008, 0x4310, 0x0003, 0x03a4, -+ 0x0002, 0x3941, 0x0003, 0x0ca7, 0x000f, 0x4000, 0x0000, 0x8072, -+ 0x0008, 0x0404, 0x000f, 0x4000, 0x0008, 0x8010, 0x0008, 0x0012, -+ 0x000c, 0x035b, 0x0004, 0x046e, 0x0000, 0x1110, 0x000c, 0x035b, -+ 0x0008, 0x11fc, 0x0003, 0xb4ad, 0x0003, 0x0013, 0x0009, 0xc2c0, -+ 0x0008, 0x00ff, 0x0000, 0x7f00, 0x0001, 0xc3c0, 0x0008, 0xff00, -+ 0x0009, 0x00d0, 0x000b, 0x0cd8, 0x0000, 0x0d0a, 0x0001, 0x8580, -+ 0x0000, 0x1000, 0x0008, 0x7f62, 0x0000, 0x8060, 0x0000, 0x0400, -+ 0x0000, 0x8066, 0x0000, 0x0809, 0x000b, 0xc4c2, 0x0000, 0x04fc, -+ 0x0003, 0x34d1, 0x0000, 0x0460, 0x0008, 0x8062, 0x0000, 0x0004, -+ 0x0000, 0x8066, 0x0000, 0x0211, 0x0003, 0xc4ca, 0x0008, 0x01fe, -+ 0x0009, 0x00e0, 0x0003, 0x8cd1, 0x0008, 0x02fe, 0x0001, 0x43e0, -+ 0x000b, 0x0cd7, 0x0002, 0x0500, 0x0000, 0x7f0a, 0x0009, 0xffe0, -+ 0x0000, 0x0800, 0x0003, 0x8cbb, 0x0008, 0x0d08, 0x000f, 0x4000, -+ 0x0008, 0x43fe, 0x0001, 0x3e80, 0x0000, 0x0d60, 0x0008, 0x7f62, -+ 0x0000, 0x8066, 0x0000, 0x0809, 0x0003, 0xc4de, 0x0000, 0x8060, -+ 0x0000, 0x0400, 0x0001, 0x84c0, 0x0008, 0xff00, 0x0002, 0x7f70, -+ 0x0009, 0xff80, 0x0000, 0x1000, 0x0008, 0x7f62, 0x0000, 0x8066, -+ 0x0000, 0x0809, 0x000b, 0xc4e9, 0x000f, 0x4000, 0xe55a, 0x71f6 -+}; -+unsigned short rseqipx_code_length01 = 0x09d8; -+/* -+ * -+ */ -+ -+unsigned long xseqipx_code_addr01 = 0x0001e000 ; -+unsigned short xseqipx_code01[] = { -+0x0013, 0x0003, 0x0000, 0x1082, 0x0001, 0xe000, 0x0005, 0x0032, -+ 0x0000, 0x0010, 0x0015, 0x0033, 0x0010, 0xbb39, 0x000b, 0x8007, -+ 0x0004, 0x010b, 0x0014, 0x011d, 0x0010, 0xc000, 0x0000, 0xc001, -+ 0x0000, 0xc0b0, 0x0010, 0xc0b1, 0x0010, 0xc0b2, 0x0000, 0xc0b3, -+ 0x0010, 0xc0b4, 0x0000, 0xc0b5, 0x0000, 0xc0b6, 0x0010, 0xc0b7, -+ 0x0010, 0xc0b8, 0x0000, 0xc0b9, 0x0000, 0xc0ba, 0x0000, 0xc0c2, -+ 0x0010, 0xc0c3, 0x0000, 0xc0c4, 0x0010, 0xc0c5, 0x0010, 0xc0c6, -+ 0x0000, 0xc0c7, 0x0000, 0xc0c8, 0x0010, 0xc0c9, 0x0010, 0xc0ca, -+ 0x0000, 0xc0cb, 0x0010, 0xc0cc, 0x0000, 0xc0cd, 0x0000, 0xc0ce, -+ 0x0010, 0xc0cf, 0x0015, 0x0039, 0x0010, 0xff00, 0x0015, 0x003a, -+ 0x0010, 0xff00, 0x0005, 0x00d0, 0x0010, 0xff00, 0x0015, 0x00d1, -+ 0x0010, 0xff00, 0x0012, 0x3a40, 0x000b, 0x1031, 0x0002, 0x7940, -+ 0x001b, 0x112f, 0x0002, 0x3a42, 0x001b, 0x1035, 0x0003, 0xb035, -+ 0x0003, 0xa1d8, 0x0002, 0x3a41, 0x001b, 0x1039, 0x0012, 0x7941, -+ 0x000b, 0x12f6, 0x0003, 0xe055, 0x0012, 0xd042, 0x0003, 0x103f, -+ 0x0000, 0x75ff, 0x0002, 0xff41, 0x001b, 0x1055, 0x0000, 0x0cfe, -+ 0x0003, 0x6049, 0x0002, 0x3a44, 0x000b, 0x1049, 0x0011, 0x02e8, -+ 0x0010, 0x0000, 0x0013, 0x1383, 0x0011, 0x02e8, 0x0010, 0x0005, -+ 0x0003, 0x1413, 0x0012, 0x3a46, 0x001b, 0x1055, 0x0012, 0xd042, -+ 0x0003, 0x1050, 0x0000, 0x75ff, 0x0012, 0xff40, 0x001b, 0x1055, -+ 0x0000, 0x12fe, 0x0013, 0x6055, 0x0001, 0x0fe8, 0x0010, 0x0000, -+ 0x0013, 0x1619, 0x0015, 0x0030, 0x0000, 0x0400, 0x0010, 0xc131, -+ 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x805a, 0x0010, 0xb2ff, -+ 0x0001, 0xb3e0, 0x001c, 0x10cd, 0x000b, 0xf02d, 0x0011, 0x3be8, -+ 0x0000, 0x0010, 0x001b, 0x1072, 0x0000, 0x0afe, 0x000b, 0x6066, -+ 0x0000, 0x3c0b, 0x0003, 0x006e, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0001, 0x0a88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x3c0a, 0x000b, 0x806d, 0x0010, 0x3c0a, 0x0002, 0x0c00, -+ 0x0010, 0xff0c, 0x0013, 0x00ca, 0x0011, 0x3be8, 0x0010, 0x0012, -+ 0x000b, 0x1085, 0x0010, 0x08fe, 0x001b, 0x6079, 0x0010, 0x3c09, -+ 0x0013, 0x0081, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0888, -+ 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x3c0a, -+ 0x000b, 0x8080, 0x0000, 0x3c08, 0x0002, 0x0c00, 0x0010, 0xff0c, -+ 0x0013, 0x00ca, 0x0011, 0x3be8, 0x0000, 0x0013, 0x001b, 0x108b, -+ 0x0000, 0x3cb0, 0x0004, 0x00dd, 0x0013, 0x00ca, 0x0011, 0x3be8, -+ 0x0000, 0x0019, 0x000b, 0x109e, 0x0010, 0x04fe, 0x001b, 0x6092, -+ 0x0010, 0x3c05, 0x0013, 0x009a, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0488, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x3c0a, 0x001b, 0x8099, 0x0000, 0x3c04, 0x0002, 0x0c00, -+ 0x0010, 0xff0c, 0x0013, 0x00ca, 0x0011, 0x3be8, 0x0000, 0x0015, -+ 0x001b, 0x10aa, 0x0014, 0x0114, 0x0004, 0x0126, 0x0015, 0x0039, -+ 0x0000, 0x8000, 0x0017, 0x8000, 0x0004, 0x010b, 0x0014, 0x011d, -+ 0x0004, 0x00f6, 0x0013, 0x002d, 0x0011, 0x3be8, 0x0000, 0x0016, -+ 0x000b, 0x10bc, 0x0001, 0x0fe8, 0x0010, 0x0000, 0x0013, 0x10b6, -+ 0x0001, 0x0fe8, 0x0000, 0x0002, 0x0013, 0x10b6, 0x0015, 0x0039, -+ 0x0010, 0x1010, 0x0013, 0x00ca, 0x0015, 0x0039, 0x0000, 0x5040, -+ 0x0015, 0x00b8, 0x0000, 0x0008, 0x0004, 0x083d, 0x0013, 0x00ca, -+ 0x0011, 0x3be8, 0x0010, 0x0017, 0x000b, 0x10c1, 0x0010, 0x3cc3, -+ 0x0013, 0x00ca, 0x0011, 0x3be8, 0x0010, 0x0018, 0x001b, 0x10c6, -+ 0x0000, 0x3cc2, 0x0013, 0x00ca, 0x0005, 0x00ce, 0x0000, 0x0001, -+ 0x0000, 0x3bcf, 0x0004, 0x0801, 0x0015, 0x0039, 0x0000, 0x8000, -+ 0x0013, 0x002d, 0x0001, 0xb288, 0x0000, 0x0002, 0x0001, 0xc180, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x80d3, -+ 0x0002, 0xb200, 0x0011, 0xffc8, 0x0000, 0x0007, 0x0010, 0xffb2, -+ 0x0010, 0xc131, 0x0015, 0x0033, 0x0010, 0xb20a, 0x0001, 0xb0d0, -+ 0x000b, 0x80dc, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0xb088, -+ 0x0000, 0x0010, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, -+ 0x001b, 0x80e4, 0x0001, 0xb1e8, 0x0010, 0xffff, 0x0003, 0x10f5, -+ 0x0000, 0x11fe, 0x001b, 0x60ec, 0x0000, 0xb012, 0x0003, 0x00f4, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb00a, 0x001b, 0x80f3, -+ 0x0000, 0xb011, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0xbc88, 0x0000, 0x001f, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xc411, 0x000b, 0x80fd, 0x0011, 0xbc88, 0x0010, 0x0018, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc609, 0x000b, 0x8103, -+ 0x0011, 0xbc88, 0x0000, 0x0037, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xc709, 0x000b, 0x8109, 0x0017, 0x4000, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0x0269, 0x000b, 0x8112, 0x0017, 0x4000, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, 0x0000, 0x0001, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x026a, 0x000b, 0x811b, -+ 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbb88, -+ 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x0f59, -+ 0x000b, 0x8124, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0001, 0xbb88, 0x0010, 0x000f, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x0f5a, 0x000b, 0x812d, 0x0017, 0x4000, 0x0000, 0xd0ff, -+ 0x0012, 0xff40, 0x000b, 0x1031, 0x0015, 0x00d1, 0x0010, 0x0101, -+ 0x0013, 0x9134, 0x0005, 0x0079, 0x0000, 0x0001, 0x0013, 0x9137, -+ 0x0015, 0x00d1, 0x0000, 0x0100, 0x0011, 0x02e8, 0x0000, 0x0002, -+ 0x0003, 0x115d, 0x0011, 0x02e8, 0x0000, 0x0001, 0x0003, 0x1175, -+ 0x0011, 0x02e8, 0x0000, 0x0004, 0x0013, 0x1193, 0x0011, 0x02e8, -+ 0x0010, 0x0003, 0x0003, 0x11c4, 0x0005, 0x0002, 0x0010, 0x0000, -+ 0x0000, 0xc00e, 0x0000, 0xc00d, 0x0010, 0xc003, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0001, 0xbd88, 0x0010, 0x0009, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x8152, 0x0012, 0x3a45, -+ 0x0013, 0x115a, 0x0015, 0x003a, 0x0000, 0x2000, 0x0015, 0x003a, -+ 0x0010, 0x1010, 0x0004, 0x0829, 0x0012, 0xd042, 0x0013, 0x1031, -+ 0x0013, 0x0050, 0x0012, 0x7849, 0x0013, 0x11d2, 0x0010, 0x0dfe, -+ 0x0003, 0x6148, 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x816a, 0x0010, 0xb3fe, -+ 0x0003, 0x6172, 0x0010, 0xb30b, 0x0015, 0x0033, 0x0010, 0xc00a, -+ 0x001b, 0x8170, 0x0013, 0x01c7, 0x0000, 0xc00b, 0x0010, 0xc00a, -+ 0x0013, 0x01c7, 0x0000, 0x78b0, 0x0012, 0xb044, 0x0013, 0x11d2, -+ 0x0002, 0xb049, 0x0013, 0x11d2, 0x0010, 0x71ff, 0x0012, 0xff38, -+ 0x0010, 0xff71, 0x0010, 0x0dfe, 0x0013, 0x6146, 0x0012, 0x0c10, -+ 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb309, -+ 0x000b, 0x8188, 0x0010, 0xb3fe, 0x0003, 0x6190, 0x0000, 0xb309, -+ 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x818e, 0x0013, 0x01c7, -+ 0x0010, 0xc009, 0x0000, 0xc008, 0x0013, 0x01c7, 0x0000, 0x78b0, -+ 0x0012, 0xb044, 0x0013, 0x11d2, 0x0002, 0xb049, 0x0013, 0x11d2, -+ 0x0010, 0x71ff, 0x0012, 0xff38, 0x0010, 0xff71, 0x0010, 0x0dfe, -+ 0x0013, 0x6146, 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb309, 0x000b, 0x81a6, 0x0010, 0xb3fe, -+ 0x0013, 0x61ae, 0x0000, 0xb305, 0x0015, 0x0033, 0x0010, 0xc00a, -+ 0x000b, 0x81ac, 0x0013, 0x01b0, 0x0010, 0xc005, 0x0000, 0xc004, -+ 0x0002, 0x033f, 0x0002, 0xff27, 0x0000, 0x0db8, 0x0004, 0x0378, -+ 0x0000, 0x0db8, 0x0004, 0x083d, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0xbc88, 0x0010, 0x0000, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb309, 0x000b, 0x81bd, 0x0011, 0xb3e8, 0x0000, 0x0002, -+ 0x001b, 0x1146, 0x0005, 0x0002, 0x0010, 0x0005, 0x0003, 0x0148, -+ 0x0012, 0x7849, 0x0013, 0x11d2, 0x0003, 0x0148, 0x0000, 0x0db8, -+ 0x0012, 0x0345, 0x001b, 0x11cd, 0x0002, 0x033f, 0x0004, 0x0378, -+ 0x0013, 0x0146, 0x0002, 0x033f, 0x0002, 0xff27, 0x0004, 0x0378, -+ 0x0004, 0x083d, 0x0013, 0x0146, 0x0015, 0x00b8, 0x0000, 0x0001, -+ 0x0015, 0x003a, 0x0010, 0x0101, 0x0004, 0x083d, 0x0003, 0x0153, -+ 0x0000, 0x2bba, 0x0003, 0xb1d9, 0x0005, 0x002a, 0x0000, 0x0002, -+ 0x0001, 0xbac8, 0x0000, 0x0700, 0x000b, 0x12b1, 0x0011, 0x15e8, -+ 0x0000, 0x0002, 0x0003, 0x122c, 0x0011, 0x15e8, 0x0000, 0x0001, -+ 0x0013, 0x11e8, 0x0005, 0x0015, 0x0010, 0x0000, 0x0003, 0x020f, -+ 0x0005, 0x0015, 0x0010, 0x0000, 0x0002, 0xba43, 0x0003, 0x1210, -+ 0x0003, 0xb1ec, 0x0005, 0x002a, 0x0000, 0x0004, 0x0012, 0xba42, -+ 0x0003, 0x1216, 0x0012, 0x104b, 0x000b, 0x120f, 0x0000, 0x1a30, -+ 0x0005, 0x0031, 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b2a, -+ 0x001b, 0x81f8, 0x0010, 0x20b0, 0x0010, 0x21b1, 0x0010, 0x22b2, -+ 0x0010, 0x23b3, 0x0010, 0x24b4, 0x0010, 0x25b5, 0x0010, 0x28b8, -+ 0x0010, 0x29b9, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0007, -+ 0x0015, 0x0033, 0x0010, 0xb032, 0x000b, 0x8206, 0x0000, 0x1a30, -+ 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, 0x0010, 0xb812, -+ 0x000b, 0x820c, 0x0005, 0x0015, 0x0010, 0x0000, 0x0013, 0x0035, -+ 0x0000, 0x1efe, 0x0003, 0x6224, 0x0014, 0x0256, 0x0000, 0x1efe, -+ 0x000c, 0x6256, 0x0003, 0x020f, 0x0000, 0x1a30, 0x0005, 0x0031, -+ 0x0000, 0x0020, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x821b, -+ 0x0002, 0xb02f, 0x0000, 0xffb0, 0x0005, 0x0031, 0x0000, 0x0020, -+ 0x0015, 0x0033, 0x0000, 0xb00a, 0x000b, 0x8222, 0x0003, 0x01f3, -+ 0x0015, 0x00b8, 0x0010, 0x0005, 0x0004, 0x083d, 0x0000, 0x13b8, -+ 0x0015, 0x003a, 0x0010, 0x0404, 0x0004, 0x083d, 0x0003, 0x020f, -+ 0x0005, 0x0015, 0x0000, 0x0001, 0x0012, 0xba42, 0x0013, 0x1239, -+ 0x0013, 0xb230, 0x0010, 0x2bff, 0x0012, 0xff4f, 0x000b, 0x11d8, -+ 0x0002, 0xba43, 0x001b, 0x1216, 0x0000, 0x1efe, 0x000c, 0x6256, -+ 0x0003, 0x020f, 0x0010, 0x28b8, 0x0010, 0x29b9, 0x0004, 0x02c7, -+ 0x0002, 0x3a42, 0x000b, 0x120f, 0x0000, 0x1c30, 0x0015, 0x00ff, -+ 0x0000, 0x0002, 0x0002, 0x1f43, 0x001b, 0x1246, 0x0001, 0xff88, -+ 0x0000, 0x0002, 0x0003, 0x0248, 0x0001, 0xff88, 0x0000, 0x0004, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x824b, -+ 0x0000, 0xb0ff, 0x0011, 0x16a0, 0x0000, 0xff16, 0x000b, 0x24e2, -+ 0x0002, 0xb100, 0x0003, 0x0253, 0x0010, 0xb1ff, 0x0001, 0x17a0, -+ 0x0010, 0xff17, 0x0013, 0x0216, 0x0000, 0x16ff, 0x0001, 0x18a0, -+ 0x0010, 0xff00, 0x001b, 0x225d, 0x0002, 0x1700, 0x0003, 0x12b0, -+ 0x0013, 0x025e, 0x0010, 0x17ff, 0x0011, 0x19a0, 0x0003, 0x22b0, -+ 0x0011, 0x00d0, 0x0003, 0x12b0, 0x0000, 0x1c30, 0x0000, 0x1b31, -+ 0x0015, 0x0033, 0x0000, 0xb131, 0x000b, 0x8266, 0x0003, 0xb267, -+ 0x0000, 0xb120, 0x0010, 0xb221, 0x0002, 0x1f43, 0x001b, 0x1273, -+ 0x0010, 0xc022, 0x0000, 0xc023, 0x0000, 0xb324, 0x0000, 0xb425, -+ 0x0010, 0xb3b5, 0x0000, 0xb4b6, 0x0003, 0x0277, 0x0000, 0xb322, -+ 0x0000, 0xb423, 0x0000, 0xb524, 0x0010, 0xb625, 0x0013, 0xb277, -+ 0x0005, 0x002a, 0x0000, 0x0001, 0x0012, 0x1500, 0x0000, 0xff15, -+ 0x0000, 0x16ff, 0x0001, 0xb580, 0x0000, 0xff16, 0x000b, 0x2282, -+ 0x0002, 0x1700, 0x0013, 0x0283, 0x0010, 0x17ff, 0x0001, 0xb680, -+ 0x0010, 0xff17, 0x0012, 0x1e10, 0x0010, 0xff1e, 0x0013, 0x62b0, -+ 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0010, 0xc030, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x828e, 0x0010, 0xb0fe, -+ 0x001b, 0x62af, 0x0000, 0x1c30, 0x0005, 0x0031, 0x0000, 0x0001, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x8296, 0x0010, 0xb0fe, -+ 0x001b, 0x629c, 0x0005, 0x00ce, 0x0010, 0x0005, 0x0013, 0x0801, -+ 0x0010, 0xb01c, 0x0000, 0x1c30, 0x0005, 0x0031, 0x0000, 0x0019, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82a2, 0x0001, 0xb0c8, -+ 0x0010, 0x00ff, 0x0000, 0xff1f, 0x0010, 0xc030, 0x0011, 0xbe80, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82ab, -+ 0x0000, 0xb01d, 0x0010, 0x1dff, 0x0013, 0x028a, 0x0000, 0xb01b, -+ 0x0017, 0x4000, 0x0002, 0x3a41, 0x0003, 0x12b9, 0x0003, 0xb2b3, -+ 0x0005, 0x002a, 0x0000, 0x0004, 0x0005, 0x0015, 0x0010, 0x0000, -+ 0x0003, 0x020f, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0002, -+ 0x0015, 0x0033, 0x0000, 0x1b2a, 0x000b, 0x82be, 0x0015, 0x00b8, -+ 0x0000, 0x0004, 0x0004, 0x083d, 0x0000, 0x13b8, 0x0015, 0x003a, -+ 0x0010, 0x0404, 0x0004, 0x083d, 0x0013, 0x0039, 0x0002, 0x1e00, -+ 0x0010, 0xff1e, 0x0012, 0x1d10, 0x0010, 0xff1d, 0x0010, 0xc030, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82cf, -+ 0x0010, 0xb0fe, 0x000b, 0x62f4, 0x0000, 0x1cff, 0x0001, 0x1ae0, -+ 0x0013, 0x12de, 0x0000, 0x1c30, 0x0005, 0x0031, 0x0010, 0x0000, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x82da, 0x0010, 0xb0fe, -+ 0x001b, 0x62de, 0x0000, 0x1aff, 0x0000, 0xff1c, 0x0000, 0x1c30, -+ 0x0005, 0x0031, 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x82e4, 0x0001, 0xb0c8, 0x0010, 0x000f, 0x0000, 0xff1f, -+ 0x0001, 0xbf80, 0x0010, 0xff1d, 0x0010, 0xc030, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x82ee, 0x0010, 0xb0fe, -+ 0x000b, 0x62f4, 0x0005, 0x00ce, 0x0010, 0x0006, 0x0013, 0x0801, -+ 0x0000, 0xb01b, 0x0017, 0x4000, 0x0010, 0x79b0, 0x0000, 0xd0ff, -+ 0x0012, 0xff40, 0x001b, 0x1039, 0x0015, 0x00d1, 0x0010, 0x0101, -+ 0x0003, 0x92fc, 0x0005, 0x0079, 0x0000, 0x0002, 0x0003, 0x92ff, -+ 0x0015, 0x00d1, 0x0000, 0x0100, 0x0010, 0x13fe, 0x0003, 0x6334, -+ 0x0012, 0xb04e, 0x001b, 0x1350, 0x0012, 0x784a, 0x0003, 0x1356, -+ 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0010, 0x1800, 0x001b, 0x1356, -+ 0x0001, 0x0fe8, 0x0000, 0x0001, 0x001b, 0x1318, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000e, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0x8f0a, 0x000b, 0x8316, 0x0013, 0x035c, -+ 0x0001, 0x0fe8, 0x0000, 0x0002, 0x000b, 0x1323, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0005, 0x0031, 0x0000, 0x001a, 0x0015, 0x0033, -+ 0x0010, 0xc00a, 0x001b, 0x8321, 0x0013, 0x035c, 0x0001, 0x0fe8, -+ 0x0010, 0x0000, 0x0013, 0x132a, 0x0005, 0x00ce, 0x0000, 0x0007, -+ 0x0010, 0x0fcf, 0x0013, 0x07fb, 0x0000, 0x13b8, 0x0002, 0x1045, -+ 0x0013, 0x1332, 0x0012, 0x103f, 0x0002, 0xff27, 0x0004, 0x0378, -+ 0x0004, 0x083d, 0x0003, 0x0334, 0x0012, 0x103f, 0x0004, 0x0378, -+ 0x0015, 0x000f, 0x0010, 0x0000, 0x0002, 0x3944, 0x0013, 0x133d, -+ 0x0015, 0x0039, 0x0000, 0x5040, 0x0015, 0x00b8, 0x0000, 0x0008, -+ 0x0004, 0x083d, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, -+ 0x0010, 0x000c, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xc00a, -+ 0x001b, 0x8344, 0x0010, 0xc014, 0x0000, 0xc013, 0x0000, 0xc010, -+ 0x0002, 0x3a47, 0x0013, 0x134f, 0x0015, 0x003a, 0x0000, 0x8000, -+ 0x0015, 0x003a, 0x0010, 0x4040, 0x0014, 0x0806, 0x0013, 0x0039, -+ 0x0015, 0x00b8, 0x0010, 0x0003, 0x0015, 0x003a, 0x0010, 0x0202, -+ 0x0004, 0x083d, 0x0013, 0x0348, 0x0015, 0x00b8, 0x0000, 0x0002, -+ 0x0015, 0x003a, 0x0010, 0x0202, 0x0004, 0x083d, 0x0013, 0x0348, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0010, 0x0003, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8363, -+ 0x0011, 0x1388, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0xc00a, 0x001b, 0x8369, 0x0010, 0xb0fe, 0x0003, 0x636e, -+ 0x0000, 0xb012, 0x0003, 0x0370, 0x0010, 0xc012, 0x0010, 0xc011, -+ 0x0012, 0x104b, 0x0013, 0x132a, 0x0002, 0x103b, 0x0010, 0xff03, -+ 0x0005, 0x0002, 0x0010, 0x0000, 0x0000, 0xc00d, 0x0003, 0x032a, -+ 0x0000, 0xffb0, 0x0010, 0xc3b1, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0001, 0xb888, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb012, 0x001b, 0x8381, 0x0017, 0x4000, 0x0012, 0x3a43, -+ 0x0013, 0x1392, 0x0015, 0x003a, 0x0000, 0x0800, 0x0010, 0x0db0, -+ 0x0003, 0x6392, 0x0000, 0x0bff, 0x0001, 0xb0e0, 0x0003, 0x13bb, -+ 0x0010, 0x09ff, 0x0001, 0xb0e0, 0x0003, 0x139f, 0x0010, 0x05ff, -+ 0x0001, 0xb0e0, 0x0003, 0x1396, 0x0000, 0xc00e, 0x0000, 0x05fe, -+ 0x0013, 0x639c, 0x0000, 0x050d, 0x0005, 0x0002, 0x0000, 0x0004, -+ 0x0014, 0x041d, 0x0002, 0x3a47, 0x001b, 0x141c, 0x0003, 0x03b6, -+ 0x0000, 0x09fe, 0x0013, 0x63b8, 0x0000, 0x090d, 0x0005, 0x0002, -+ 0x0000, 0x0001, 0x0014, 0x0436, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xba09, 0x001b, 0x83a9, 0x0011, 0x03c8, 0x0010, 0x000f, -+ 0x0000, 0xffb6, 0x0011, 0xb6e8, 0x0000, 0x0001, 0x0013, 0x14ca, -+ 0x0011, 0xb6e8, 0x0000, 0x0002, 0x0003, 0x14ec, 0x0011, 0xb6e8, -+ 0x0010, 0x0003, 0x0003, 0x15d7, 0x0014, 0x0806, 0x0013, 0x041c, -+ 0x0010, 0x0bfe, 0x0013, 0x641c, 0x0010, 0x0b0d, 0x0005, 0x0002, -+ 0x0000, 0x0002, 0x0014, 0x0436, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xba09, 0x001b, 0x83c5, 0x0000, 0xb930, 0x0005, 0x0031, -+ 0x0010, 0x0021, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x83cb, -+ 0x0001, 0xb0a8, 0x0000, 0x199a, 0x0003, 0x23d1, 0x0005, 0x00b0, -+ 0x0000, 0x1999, 0x0012, 0xb050, 0x0000, 0xffb0, 0x0002, 0xff50, -+ 0x0002, 0xff50, 0x0001, 0xb080, 0x0000, 0xffb0, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0006, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb00a, 0x001b, 0x83de, 0x0000, 0xb930, -+ 0x0005, 0x0031, 0x0000, 0x0019, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x001b, 0x83e4, 0x0001, 0xb0c8, 0x0010, 0x00ff, 0x0001, 0xffe8, -+ 0x0010, 0x0048, 0x001b, 0x1445, 0x0005, 0x0002, 0x0010, 0x0006, -+ 0x0012, 0x0c10, 0x0010, 0xff0c, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0010, 0x0003, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0xb109, 0x001b, 0x83f5, 0x0000, 0xb10b, 0x000b, 0x63f9, -+ 0x0010, 0xb10a, 0x0015, 0x0033, 0x0010, 0xc00a, 0x000b, 0x83fb, -+ 0x0002, 0x032b, 0x0010, 0xff03, 0x0011, 0x0d88, 0x0010, 0x0011, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0x030a, 0x000b, 0x8403, -+ 0x0000, 0x11fe, 0x000b, 0x6408, 0x0000, 0x0d12, 0x0003, 0x0411, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1188, 0x0010, 0x0003, -+ 0x0000, 0xff31, 0x0010, 0x0db0, 0x0015, 0x0033, 0x0000, 0xb00a, -+ 0x001b, 0x8410, 0x0000, 0x0d11, 0x0013, 0x041c, 0x0000, 0x05fe, -+ 0x0013, 0x641c, 0x0005, 0x0002, 0x0000, 0x0004, 0x0000, 0x050d, -+ 0x0014, 0x041d, 0x0002, 0x3a47, 0x001b, 0x141c, 0x0014, 0x0806, -+ 0x0003, 0x0049, 0x0001, 0xc7c8, 0x0010, 0x0028, 0x000b, 0x1435, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x000a, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x8427, -+ 0x0002, 0xb04f, 0x0013, 0x1435, 0x0001, 0x0fe8, 0x0010, 0x0000, -+ 0x0013, 0x1433, 0x0001, 0x0fe8, 0x0000, 0x0002, 0x0013, 0x1433, -+ 0x0015, 0x003a, 0x0010, 0x8080, 0x0003, 0x0435, 0x0015, 0x003a, -+ 0x0010, 0x4040, 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x0309, 0x001b, 0x843d, 0x0011, 0x0d88, 0x0010, 0x0005, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb909, 0x001b, 0x8443, -+ 0x0017, 0x4000, 0x0005, 0x00b6, 0x0010, 0x0600, 0x0014, 0x0607, -+ 0x0014, 0x04b4, 0x0000, 0xb05a, 0x0000, 0xb15b, 0x0005, 0x0054, -+ 0x0010, 0x0829, 0x0010, 0x0d58, 0x0015, 0x0059, 0x0010, 0xffff, -+ 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x001e, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x000b, 0x8455, 0x0000, 0xb05c, 0x0005, 0x0031, -+ 0x0000, 0x001f, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x845b, -+ 0x0001, 0xb0c8, 0x0010, 0x000f, 0x001b, 0x1462, 0x0015, 0x00ff, -+ 0x0010, 0x0005, 0x0003, 0x046a, 0x0002, 0xb040, 0x0003, 0x1467, -+ 0x0015, 0x00ff, 0x0000, 0x0004, 0x0003, 0x046a, 0x0001, 0xb0c8, -+ 0x0010, 0x0006, 0x0002, 0xff60, 0x0010, 0xffb2, 0x0011, 0x0d88, -+ 0x0000, 0x0019, 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb109, -+ 0x001b, 0x8470, 0x0012, 0xb170, 0x0011, 0xffc8, 0x0010, 0xff00, -+ 0x0011, 0xb2d0, 0x0010, 0xff60, 0x0002, 0xb045, 0x0013, 0x147b, -+ 0x0015, 0x00b2, 0x0000, 0x0002, 0x0013, 0x0485, 0x0002, 0xb046, -+ 0x0003, 0x1480, 0x0015, 0x00b2, 0x0000, 0x0001, 0x0013, 0x0485, -+ 0x0015, 0x00b2, 0x0010, 0x0000, 0x0000, 0xc0b0, 0x0010, 0xc0b1, -+ 0x0003, 0x048b, 0x0000, 0xb930, 0x0005, 0x0031, 0x0010, 0x002b, -+ 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x848a, 0x0010, 0xb16a, -+ 0x0010, 0xb06b, 0x0000, 0xb261, 0x0015, 0x0044, 0x0010, 0x0018, -+ 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, 0x0000, 0x6241, -+ 0x001b, 0x8494, 0x0003, 0x9495, 0x0015, 0x00a0, 0x0000, 0x0020, -+ 0x0012, 0xd041, 0x001b, 0x1498, 0x0015, 0x00d1, 0x0010, 0x0202, -+ 0x0003, 0x949c, 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0000, 0x1804, -+ 0x0001, 0xffd8, 0x0010, 0x0009, 0x0013, 0x94a2, 0x0000, 0xff75, -+ 0x0013, 0x94a4, 0x0015, 0x00d1, 0x0000, 0x0200, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0001, 0xbd88, 0x0000, 0x0008, 0x0000, 0xff31, -+ 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0005, 0x00b0, 0x0010, 0x0009, -+ 0x0015, 0x0033, 0x0000, 0xb012, 0x000b, 0x84b2, 0x0013, 0x041c, -+ 0x0000, 0xba30, 0x0005, 0x0031, 0x0010, 0x0035, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x001b, 0x84b9, 0x0002, 0xb040, 0x0003, 0x14c7, -+ 0x0000, 0xb7b0, 0x0000, 0xb9b1, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0000, 0x0013, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb012, 0x000b, 0x84c5, 0x0003, 0x04c9, 0x0010, 0xc0b1, -+ 0x0000, 0xc0b0, 0x0017, 0x4000, 0x0005, 0x00b6, 0x0010, 0x0500, -+ 0x0014, 0x0607, 0x0005, 0x0054, 0x0010, 0x0889, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0002, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x84d6, 0x0010, 0xb058, -+ 0x0000, 0x0d59, 0x0000, 0xb930, 0x0005, 0x0031, 0x0000, 0x0023, -+ 0x0015, 0x0033, 0x0000, 0xb011, 0x000b, 0x84de, 0x0010, 0xb15c, -+ 0x0010, 0xb05d, 0x0005, 0x0031, 0x0010, 0x002b, 0x0015, 0x0033, -+ 0x0000, 0xb011, 0x001b, 0x84e5, 0x0000, 0xb15e, 0x0000, 0xb05f, -+ 0x0003, 0x94e8, 0x0015, 0x00a0, 0x0010, 0x000c, 0x0003, 0x05ec, -+ 0x0005, 0x00b6, 0x0000, 0x0700, 0x0014, 0x0607, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xb709, 0x000b, 0x84f6, 0x0012, 0xb749, -+ 0x0013, 0x14fc, 0x0005, 0x0054, 0x0010, 0x0889, 0x0013, 0x04fe, -+ 0x0005, 0x0054, 0x0010, 0x0898, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x001b, 0x8505, 0x0010, 0xb058, 0x0000, 0x0d59, -+ 0x0001, 0xb9a8, 0x0010, 0x00f0, 0x000b, 0x252a, 0x0011, 0x0d88, -+ 0x0010, 0x0005, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x8510, 0x0001, 0xb0c8, 0x0000, 0xf700, 0x0000, 0xffb0, -+ 0x0011, 0xb0e8, 0x0000, 0xf100, 0x0003, 0x1571, 0x0011, 0xb0e8, -+ 0x0000, 0xf200, 0x0013, 0x1576, 0x0011, 0xb0e8, 0x0010, 0xf300, -+ 0x0003, 0x1599, 0x0011, 0xb0e8, 0x0000, 0xf400, 0x0013, 0x159e, -+ 0x0011, 0xb0e8, 0x0010, 0xf500, 0x0003, 0x1571, 0x0011, 0xb0e8, -+ 0x0010, 0xf600, 0x0003, 0x15af, 0x0005, 0x00ce, 0x0010, 0x0009, -+ 0x0000, 0xb0cf, 0x0013, 0x07fb, 0x0000, 0xb930, 0x0005, 0x0031, -+ 0x0000, 0x0025, 0x0015, 0x0033, 0x0000, 0xb039, 0x000b, 0x852f, -+ 0x0012, 0xb749, 0x0013, 0x1534, 0x0002, 0xb52c, 0x0000, 0xffb5, -+ 0x0000, 0xb162, 0x0000, 0xb063, 0x0005, 0x0031, 0x0000, 0x001f, -+ 0x0015, 0x0033, 0x0000, 0xb309, 0x001b, 0x853a, 0x0001, 0xb3c8, -+ 0x0010, 0x0003, 0x0003, 0x1542, 0x0010, 0xffb2, 0x0001, 0xffe8, -+ 0x0010, 0x0003, 0x001b, 0x1544, 0x0000, 0xc2b7, 0x0003, 0x05cb, -+ 0x0001, 0xb2e8, 0x0000, 0x0001, 0x0003, 0x154b, 0x0005, 0x00ce, -+ 0x0010, 0x000a, 0x0010, 0xb2cf, 0x0013, 0x07fb, 0x0010, 0xb465, -+ 0x0010, 0xb667, 0x0015, 0x00b7, 0x0010, 0x0018, 0x0001, 0xb5c8, -+ 0x0010, 0x0300, 0x0013, 0x1570, 0x0012, 0xb548, 0x0013, 0x1557, -+ 0x0000, 0xb6ff, 0x0011, 0xb780, 0x0010, 0xffb7, 0x0002, 0xb549, -+ 0x0003, 0x155c, 0x0010, 0xb4ff, 0x0011, 0xb780, 0x0010, 0xffb7, -+ 0x0015, 0x0044, 0x0010, 0x0018, 0x0005, 0x0031, 0x0000, 0x002c, -+ 0x0015, 0x0033, 0x0000, 0x6841, 0x000b, 0x8562, 0x0015, 0x0044, -+ 0x0000, 0x0019, 0x0005, 0x0031, 0x0000, 0x0034, 0x0015, 0x0033, -+ 0x0000, 0x5029, 0x001b, 0x8569, 0x0015, 0x0044, 0x0000, 0x0008, -+ 0x0011, 0xb7c8, 0x0010, 0x0003, 0x0013, 0x1570, 0x0010, 0xff55, -+ 0x0003, 0x05cb, 0x0005, 0x00b5, 0x0000, 0x0008, 0x0015, 0x00b7, -+ 0x0010, 0x0018, 0x0003, 0x05cb, 0x0011, 0x0d88, 0x0000, 0x000b, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x857b, -+ 0x0010, 0xb1ff, 0x0001, 0xb0d0, 0x0003, 0x1584, 0x0005, 0x00b5, -+ 0x0010, 0x0b02, 0x0010, 0xb062, 0x0010, 0xb163, 0x0003, 0x0586, -+ 0x0005, 0x00b5, 0x0000, 0x0302, 0x0015, 0x0065, 0x0010, 0x0012, -+ 0x0005, 0x0067, 0x0000, 0x0008, 0x0015, 0x006c, 0x0000, 0x7000, -+ 0x0005, 0x006d, 0x0010, 0x0500, 0x0015, 0x006f, 0x0010, 0x000a, -+ 0x0015, 0x0044, 0x0000, 0x0001, 0x0005, 0x0052, 0x0000, 0x2500, -+ 0x0015, 0x0044, 0x0000, 0x0008, 0x0015, 0x00b7, 0x0000, 0x0032, -+ 0x0003, 0x05cb, 0x0005, 0x00b5, 0x0010, 0x0028, 0x0015, 0x00b7, -+ 0x0010, 0x0018, 0x0003, 0x05cb, 0x0005, 0x00b5, 0x0000, 0x0100, -+ 0x0005, 0x0067, 0x0000, 0x0008, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x0d88, 0x0010, 0x0018, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x001b, 0x85a9, 0x0001, 0xb0c8, 0x0010, 0x00ff, -+ 0x0015, 0x00b7, 0x0000, 0x0020, 0x0003, 0x05cb, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0005, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb609, 0x000b, 0x85b6, 0x0001, 0xb6c8, -+ 0x0010, 0xff00, 0x0000, 0xffb0, 0x0015, 0x0033, 0x0000, 0xb00a, -+ 0x000b, 0x85bc, 0x0001, 0xb6c8, 0x0010, 0x00ff, 0x0012, 0xff10, -+ 0x001b, 0x15c5, 0x0000, 0xffb5, 0x0015, 0x00b7, 0x0010, 0x0018, -+ 0x0003, 0x05cb, 0x0010, 0xff63, 0x0005, 0x00b5, 0x0000, 0x0800, -+ 0x0015, 0x00b7, 0x0010, 0x0018, 0x0003, 0x05cb, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0010, 0x0009, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x85d2, 0x0010, 0xb561, -+ 0x0013, 0x95d4, 0x0010, 0xb7a0, 0x0003, 0x05ec, 0x0005, 0x00b6, -+ 0x0010, 0x0300, 0x0014, 0x0607, 0x0005, 0x0054, 0x0010, 0x0819, -+ 0x0010, 0x0d58, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, -+ 0x0000, 0x0002, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x001b, 0x85e4, 0x0000, 0xb059, 0x0003, 0x95e6, 0x0010, 0xc0a0, -+ 0x0010, 0x71ff, 0x0002, 0xff28, 0x0010, 0xff71, 0x0003, 0x05ec, -+ 0x0012, 0xd041, 0x000b, 0x15ec, 0x0015, 0x00d1, 0x0010, 0x0202, -+ 0x0000, 0x75ff, 0x0011, 0xffc8, 0x0000, 0x1804, 0x0001, 0xffd8, -+ 0x0010, 0x0009, 0x0013, 0x95f5, 0x0000, 0xff75, 0x0003, 0x95f7, -+ 0x0015, 0x00d1, 0x0000, 0x0200, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0001, 0xbd88, 0x0000, 0x0008, 0x0000, 0xff31, 0x0005, 0x00b0, -+ 0x0010, 0x0009, 0x0015, 0x00b1, 0x0010, 0x07d0, 0x0015, 0x0033, -+ 0x0000, 0xb012, 0x001b, 0x8605, 0x0013, 0x041c, 0x0015, 0x0044, -+ 0x0000, 0x0008, 0x0005, 0x0098, 0x0010, 0x0056, 0x0015, 0x0099, -+ 0x0000, 0x9575, 0x0004, 0x07c2, 0x0000, 0xb096, 0x0012, 0xb270, -+ 0x0010, 0xff56, 0x0014, 0x07e4, 0x0010, 0xb052, 0x0010, 0xb153, -+ 0x0000, 0xb6ff, 0x0011, 0xb2d0, 0x0010, 0xff50, 0x0010, 0xb351, -+ 0x0017, 0x4000, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0x1288, -+ 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x1009, -+ 0x000b, 0x8620, 0x0015, 0x000f, 0x0000, 0x0001, 0x0010, 0xc014, -+ 0x0000, 0x1213, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, -+ 0x0000, 0x0004, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xba09, -+ 0x000b, 0x862c, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, -+ 0x0010, 0x0005, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0x1a09, -+ 0x000b, 0x8634, 0x0012, 0x104b, 0x000b, 0x163d, 0x0000, 0x1a30, -+ 0x0005, 0x0031, 0x0000, 0x000b, 0x0015, 0x0033, 0x0000, 0x1621, -+ 0x001b, 0x863c, 0x0010, 0x15fe, 0x000b, 0x665c, 0x0014, 0x0683, -+ 0x0002, 0x3a42, 0x001b, 0x1682, 0x0001, 0x10c8, 0x0010, 0x000f, -+ 0x000b, 0x16e5, 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, -+ 0x0000, 0x0008, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x864c, 0x0011, 0xb0e8, 0x0010, 0x0009, 0x0003, 0x1653, -+ 0x0011, 0xb0e8, 0x0000, 0x0001, 0x001b, 0x1681, 0x0011, 0x1388, -+ 0x0010, 0x000a, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, -+ 0x000b, 0x8658, 0x0002, 0xb04f, 0x001b, 0x1678, 0x0013, 0x0681, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0010, 0x0003, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x8663, -+ 0x0015, 0x0033, 0x0010, 0xc00a, 0x001b, 0x8666, 0x0010, 0xb0fe, -+ 0x0003, 0x666b, 0x0000, 0xb012, 0x0003, 0x066d, 0x0010, 0xc012, -+ 0x0010, 0xc011, 0x0015, 0x000f, 0x0010, 0x0000, 0x0002, 0x3944, -+ 0x0013, 0x1676, 0x0015, 0x0039, 0x0000, 0x5040, 0x0015, 0x00b8, -+ 0x0000, 0x0008, 0x0004, 0x083d, 0x0000, 0xc013, 0x0013, 0x0682, -+ 0x0010, 0x02fe, 0x0013, 0x667d, 0x0015, 0x003a, 0x0010, 0x2020, -+ 0x0013, 0x0682, 0x0015, 0x003a, 0x0000, 0x2000, 0x0015, 0x003a, -+ 0x0010, 0x1010, 0x0004, 0x0829, 0x0013, 0x0055, 0x0013, 0xb683, -+ 0x0005, 0x002a, 0x0000, 0x0004, 0x0000, 0xba30, 0x0005, 0x0031, -+ 0x0010, 0x001b, 0x0015, 0x0033, 0x0000, 0xb009, 0x001b, 0x868b, -+ 0x0000, 0xc02c, 0x0000, 0xb02d, 0x0012, 0x104b, 0x0003, 0x16a6, -+ 0x0000, 0x1a30, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, -+ 0x0000, 0xb129, 0x001b, 0x8695, 0x0000, 0xb120, 0x0010, 0xb221, -+ 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, 0x0000, 0xc025, -+ 0x0010, 0xb526, 0x0010, 0xc027, 0x0010, 0xb516, 0x0010, 0xc017, -+ 0x0000, 0xb518, 0x0000, 0xc019, 0x0010, 0xc028, 0x0000, 0xc029, -+ 0x0010, 0xc01e, 0x0003, 0x06dc, 0x0012, 0x1044, 0x0013, 0x16d6, -+ 0x0002, 0x1034, 0x0000, 0xff10, 0x0000, 0x1a30, 0x0005, 0x0031, -+ 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b29, 0x001b, 0x86af, -+ 0x0000, 0x1c30, 0x0000, 0x1b31, 0x0015, 0x0033, 0x0000, 0xb131, -+ 0x001b, 0x86b4, 0x0002, 0x1f43, 0x001b, 0x16bb, 0x0010, 0xb3b5, -+ 0x0000, 0xb4b6, 0x0000, 0xc0b3, 0x0010, 0xc0b4, 0x0000, 0xb120, -+ 0x0010, 0xb221, 0x0000, 0xb322, 0x0000, 0xb423, 0x0000, 0xb524, -+ 0x0010, 0xb625, 0x0010, 0xb516, 0x0000, 0xb617, 0x0000, 0x1826, -+ 0x0000, 0x1927, 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, -+ 0x0015, 0x0033, 0x0000, 0xb011, 0x001b, 0x86ca, 0x0000, 0xb028, -+ 0x0000, 0xb129, 0x0012, 0x1e10, 0x0010, 0xff1e, 0x0003, 0x66dc, -+ 0x0002, 0x1d00, 0x0010, 0xff1d, 0x0004, 0x028a, 0x0002, 0x3a42, -+ 0x0013, 0x16dc, 0x0013, 0x06e4, 0x0000, 0x1a30, 0x0005, 0x0031, -+ 0x0000, 0x0002, 0x0015, 0x0033, 0x0000, 0x1b79, 0x001b, 0x86db, -+ 0x0013, 0xb6dc, 0x0005, 0x002a, 0x0000, 0x0001, 0x0005, 0x0015, -+ 0x0000, 0x0001, 0x0000, 0x1efe, 0x0013, 0x66e4, 0x0003, 0x0256, -+ 0x0017, 0x4000, 0x0000, 0xba30, 0x0005, 0x0031, 0x0010, 0x001b, -+ 0x0015, 0x0033, 0x0010, 0xb051, 0x000b, 0x86ea, 0x0000, 0xb0a3, -+ 0x0010, 0xb697, 0x0010, 0xb946, 0x0015, 0x00a5, 0x0000, 0x0010, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0002, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb509, 0x000b, 0x86f7, -+ 0x0014, 0x07e4, 0x0004, 0x07d3, 0x0012, 0xb470, 0x0010, 0xffb4, -+ 0x0010, 0xb48e, 0x0010, 0xb08a, 0x0010, 0xb18b, 0x0012, 0x104d, -+ 0x0003, 0x1702, 0x0013, 0x072f, 0x0012, 0x104b, 0x0003, 0x1715, -+ 0x0005, 0x008c, 0x0010, 0x0829, 0x0010, 0xc08d, 0x0001, 0xb2d8, -+ 0x0010, 0x0600, 0x0010, 0xff88, 0x0010, 0xb389, 0x0000, 0x1390, -+ 0x0010, 0xb591, 0x0000, 0xc08f, 0x0010, 0x1ab9, 0x0014, 0x04b4, -+ 0x0013, 0x9710, 0x0010, 0xb092, 0x0010, 0xb193, 0x0013, 0x9713, -+ 0x0013, 0x072a, 0x0005, 0x008c, 0x0000, 0x0809, 0x0015, 0x008d, -+ 0x0000, 0x0008, 0x0001, 0xb2d8, 0x0000, 0x0100, 0x0010, 0xff88, -+ 0x0010, 0xb389, 0x0000, 0x1390, 0x0010, 0xb591, 0x0000, 0xc08f, -+ 0x0000, 0x1a30, 0x0005, 0x0031, 0x0010, 0x000f, 0x0015, 0x0033, -+ 0x0000, 0xb011, 0x001b, 0x8725, 0x0013, 0x9726, 0x0000, 0xb192, -+ 0x0000, 0xb093, 0x0013, 0x9729, 0x0010, 0x19a1, 0x0000, 0x18a2, -+ 0x0015, 0x00b1, 0x0010, 0x0096, 0x0013, 0x079e, 0x0000, 0xb590, -+ 0x0010, 0x1391, 0x0001, 0x10c8, 0x0010, 0x000f, 0x0001, 0xffe8, -+ 0x0010, 0x0005, 0x0013, 0x1756, 0x0001, 0xb2d8, 0x0000, 0x0700, -+ 0x0010, 0xff88, 0x0010, 0xb389, 0x0015, 0x0030, 0x0000, 0x0400, -+ 0x0011, 0x1388, 0x0010, 0x0009, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0000, 0xb009, 0x000b, 0x8741, 0x0002, 0xb049, 0x0003, 0x1749, -+ 0x0005, 0x008c, 0x0010, 0x0889, 0x0015, 0x00b1, 0x0010, 0x0096, -+ 0x0003, 0x074d, 0x0005, 0x008c, 0x0010, 0x0898, 0x0015, 0x00b1, -+ 0x0000, 0x0092, 0x0010, 0xc08d, 0x0000, 0xc08f, 0x0013, 0x974f, -+ 0x0000, 0xc092, 0x0010, 0xc093, 0x0013, 0x9752, 0x0010, 0x19a1, -+ 0x0000, 0x18a2, 0x0013, 0x079e, 0x0001, 0xb2d8, 0x0000, 0x0100, -+ 0x0010, 0xff88, 0x0010, 0xb389, 0x0005, 0x008c, 0x0010, 0x0880, -+ 0x0015, 0x008d, 0x0000, 0x0008, 0x0011, 0x1388, 0x0000, 0x000e, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb009, 0x000b, 0x8763, -+ 0x0010, 0xb08f, 0x0000, 0xb590, 0x0010, 0x1391, 0x0000, 0x1a30, -+ 0x0005, 0x0031, 0x0000, 0x000d, 0x0015, 0x0033, 0x0000, 0xb021, -+ 0x000b, 0x876c, 0x0013, 0x976d, 0x0010, 0xb392, 0x0010, 0xb293, -+ 0x0013, 0x9770, 0x0000, 0xb1a1, 0x0010, 0xb0a2, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xb211, 0x001b, 0x877a, 0x0000, 0xb3ff, -+ 0x0001, 0xb080, 0x0000, 0xffb3, 0x000b, 0x2781, 0x0002, 0xb200, -+ 0x0003, 0x0782, 0x0010, 0xb2ff, 0x0011, 0xb180, 0x0010, 0xffb2, -+ 0x0011, 0x1388, 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0xb212, 0x001b, 0x8789, 0x0015, 0x00b1, 0x0000, 0x0092, -+ 0x0002, 0x104c, 0x0013, 0x179c, 0x0011, 0xc2e8, 0x0010, 0x000c, -+ 0x001b, 0x1794, 0x0015, 0x00ff, 0x0000, 0x0800, 0x0003, 0x079c, -+ 0x0011, 0xc2e8, 0x0000, 0x0020, 0x000b, 0x179a, 0x0015, 0x00ff, -+ 0x0010, 0x1800, 0x0003, 0x079c, 0x0015, 0x00ff, 0x0000, 0x1000, -+ 0x0011, 0xb1d0, 0x0010, 0xffb1, 0x0015, 0x009a, 0x0010, 0x0036, -+ 0x0005, 0x009b, 0x0000, 0x95d5, 0x0012, 0xd041, 0x001b, 0x17a2, -+ 0x0015, 0x00d1, 0x0010, 0x0202, 0x0003, 0x97a6, 0x0012, 0x104e, -+ 0x0003, 0x17ab, 0x0012, 0xb12f, 0x0010, 0xffb1, 0x0000, 0xb175, -+ 0x0003, 0x97ac, 0x0015, 0x00d1, 0x0000, 0x0200, 0x0001, 0x19c8, -+ 0x0010, 0xfff0, 0x001b, 0x17b5, 0x0015, 0x00b1, 0x0010, 0x07d0, -+ 0x0003, 0x07b7, 0x0015, 0x00b1, 0x0000, 0x1b58, 0x0005, 0x00b0, -+ 0x0010, 0x0009, 0x0015, 0x0030, 0x0000, 0x0400, 0x0001, 0xbd88, -+ 0x0000, 0x000b, 0x0000, 0xff31, 0x0015, 0x0033, 0x0000, 0xb012, -+ 0x000b, 0x87c0, 0x0013, 0x0682, 0x0000, 0xba30, 0x0005, 0x0031, -+ 0x0010, 0x0021, 0x0015, 0x0033, 0x0010, 0xb019, 0x001b, 0x87c7, -+ 0x0002, 0xb200, 0x0011, 0xffc8, 0x0010, 0x00ff, 0x0010, 0xffb2, -+ 0x0010, 0xb2b7, 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, -+ 0x0010, 0xb20a, 0x000b, 0x87d1, 0x0017, 0x4000, 0x0000, 0xba30, -+ 0x0005, 0x0031, 0x0000, 0x0023, 0x0015, 0x0033, 0x0010, 0xb409, -+ 0x000b, 0x87d8, 0x0002, 0xb400, 0x0011, 0xffc8, 0x0010, 0x00ff, -+ 0x0010, 0xffb4, 0x0010, 0xb4b7, 0x0005, 0x0031, 0x0000, 0x0023, -+ 0x0015, 0x0033, 0x0010, 0xb40a, 0x000b, 0x87e2, 0x0017, 0x4000, -+ 0x0000, 0xba30, 0x0001, 0xc7c8, 0x0000, 0x0020, 0x000b, 0x17f0, -+ 0x0005, 0x0031, 0x0010, 0x0028, 0x0015, 0x0033, 0x0010, 0xb209, -+ 0x001b, 0x87ec, 0x0011, 0xb2c8, 0x0000, 0xff80, 0x0013, 0x17f3, -+ 0x0010, 0xc4b0, 0x0010, 0xc5b1, 0x0003, 0x07f5, 0x0010, 0xc6b1, -+ 0x0000, 0xc0b0, 0x0005, 0x0031, 0x0000, 0x0004, 0x0015, 0x0033, -+ 0x0010, 0xb211, 0x000b, 0x87f9, 0x0017, 0x4000, 0x0015, 0x00b8, -+ 0x0010, 0x0009, 0x0015, 0x003a, 0x0010, 0x0707, 0x0004, 0x083d, -+ 0x0013, 0x002d, 0x0015, 0x00b8, 0x0010, 0x0009, 0x0015, 0x003a, -+ 0x0010, 0x0707, 0x0013, 0x083d, 0x0014, 0x0114, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0004, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0000, 0xba09, 0x001b, 0x880e, 0x0004, 0x07c2, -+ 0x0015, 0x0030, 0x0000, 0x0400, 0x0011, 0x0d88, 0x0000, 0x0010, -+ 0x0000, 0xff31, 0x0015, 0x0033, 0x0010, 0xb20a, 0x000b, 0x8817, -+ 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0x0309, 0x000b, 0x881d, 0x0002, 0x0327, 0x0010, 0xffb2, -+ 0x0011, 0x0d88, 0x0010, 0x0011, 0x0000, 0xff31, 0x0015, 0x0033, -+ 0x0010, 0xb20a, 0x001b, 0x8825, 0x0015, 0x00b8, 0x0010, 0x0006, -+ 0x0013, 0x083d, 0x0004, 0x0126, 0x0004, 0x07c2, 0x0015, 0x0030, -+ 0x0000, 0x0400, 0x0011, 0x1388, 0x0000, 0x0010, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xb20a, 0x001b, 0x8832, 0x0012, 0x1027, -+ 0x0010, 0xffb2, 0x0011, 0x1388, 0x0010, 0x0011, 0x0000, 0xff31, -+ 0x0015, 0x0033, 0x0010, 0xb20a, 0x000b, 0x883a, 0x0015, 0x00b8, -+ 0x0000, 0x0007, 0x0003, 0x483d, 0x0000, 0xb838, 0x0017, 0x4000, -+ 0xa4bc, 0xa221 -+}; -+unsigned short xseqipx_code_length01 = 0x1082; -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2200.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2200.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2200.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2200.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2300.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2300.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2300.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2300.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -22,6 +22,9 @@ - * command source for 2300 module - */ - #define ISP2300 -+#define ISP2322 -+#define EXTENDED_IDS -+#define IPX - - #if !defined(LINUX) - #define LINUX -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2x00.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2x00.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2x00.c 2003-10-28 10:34:18.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2x00.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * Portions (C) Arjan van de Ven <arjanv@redhat.com> for Red Hat, Inc. -@@ -44,6 +44,10 @@ - #error "This driver does not support kernel versions earlier than 2.4.0" - #endif - -+#if defined(FC_IP_SUPPORT) -+#error "IP support is unsupported and unavailable in this driver release!!!" -+#endif -+ - /* IP support not available on ISP2100 */ - #if defined(ISP2100) && defined(FC_IP_SUPPORT) - #error "The ISP2100 does not support IP" -@@ -51,11 +55,6 @@ - - #include "qla_settings.h" - --#if defined(ISP2300) --#include "qla_devtbl.h" --#endif -- -- - static int num_hosts = 0; /* ioctl related */ - static int apiHBAInstance = 0; /* ioctl related keeps track of API HBA Instance */ - -@@ -80,13 +79,12 @@ static unsigned long mem_id[1000]; - #include <linux/pci.h> - #include <linux/proc_fs.h> - #include <linux/blk.h> --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - #include <linux/tqueue.h> --#endif - #include <linux/interrupt.h> - #include <linux/stat.h> - #include <linux/slab.h> - #include <linux/ctype.h> -+#include <linux/utsname.h> - - #define APIDEV 1 - -@@ -109,12 +107,9 @@ static unsigned long mem_id[1000]; - * options would be SIGPWR, I suppose. - */ - #define SHUTDOWN_SIGS (sigmask(SIGHUP)) --#include "../sd.h" --#include "../scsi.h" --#include "../hosts.h" --#ifdef __VMWARE__ --#include "vmklinux_dist.h" --#endif -+#include "sd.h" -+#include "scsi.h" -+#include "hosts.h" - - #if defined(FC_IP_SUPPORT) - #include <linux/ip.h> -@@ -130,7 +125,7 @@ static unsigned long mem_id[1000]; - #include "qla2x00.h" - - --#define UNIQUE_FW_NAME /* unique F/W array names */ -+#define UNIQUE_FW_NAME /* unique F/W array names */ - #if defined(ISP2100) - #include "ql2100_fw.h" /* ISP RISC 2100 TP code */ - #endif -@@ -141,16 +136,21 @@ static unsigned long mem_id[1000]; - #include "ql2200_fw.h" /* ISP RISC 2200 TP code */ - #endif - #endif -+ - #if defined(ISP2300) --#if defined(FC_IP_SUPPORT) --#include "ql2300ip_fw.h" /* ISP RISC 2300 IP code */ --#else --#include "ql2300_fw.h" /* ISP RISC 2300 TP code */ --#endif -+#include "ql2300flx_fw.h" /* ISP RISC 2300 FLX code */ -+#include "ql2322flx_fw.h" /* ISP RISC 2300 FLX code */ -+#include "ql2300ipx_fw.h" /* ISP RISC 2300 IPX code */ -+#include "ql2322ipx_fw.h" /* ISP RISC 2322 IPX code */ - #endif - -+ - #include "qla_cfg.h" -+#include "qlfolimits.h" -+ - #include "qla_gbl.h" -+#include "qla_devtbl.h" -+ - - #if NO_LONG_DELAYS - #define SYS_DELAY(x) qla2x00_sleep(x) -@@ -164,13 +164,6 @@ static unsigned long mem_id[1000]; - #define UDELAY(x) udelay(x) - #endif - --/* -- * We only use these macros in 64bit_start and not 32bit_start, so -- * we can assume a 8-byte address (a). -- */ --#define pci_dma_hi32(a) ((u32) (0xffffffff & (((u64)(a))>>32))) --#define pci_dma_lo32(a) ((u32) (0xffffffff & (((u64)(a))))) -- - #define CACHE_FLUSH(a) (RD_REG_WORD(a)) - #define INVALID_HANDLE (MAX_OUTSTANDING_COMMANDS+1) - -@@ -226,7 +219,8 @@ del_timer_sync(&(h)->timer); \ - #define DRIVER_NAME "qla2300" - #endif - --static char qla2x00_version_str[40]; -+#define QLA_DRVR_VERSION_LEN 40 -+static char qla2x00_version_str[QLA_DRVR_VERSION_LEN]; - typedef unsigned long paddr32_t; - - /* proc info string processing */ -@@ -239,7 +233,7 @@ struct info_str { - - - /* --* Qlogic Driver support Function Prototypes. -+* QLogic Driver support Function Prototypes. - */ - STATIC void copy_mem_info(struct info_str *, char *, int); - STATIC int copy_info(struct info_str *, char *, ...); -@@ -247,14 +241,7 @@ STATIC int copy_info(struct info_str *, - STATIC uint8_t qla2x00_register_with_Linux(scsi_qla_host_t *ha, - uint8_t maxchannels); - STATIC int qla2x00_done(scsi_qla_host_t *); --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) --STATIC void qla2x00_select_queue_depth(struct Scsi_Host *, Scsi_Device *); --#endif -- --#if defined (CONFIG_SCSIFCHOTSWAP) || defined(CONFIG_GAMAP) --static int qla2x00_get_scsi_info_from_wwn (int mode, unsigned long long wwn, int *host, int *channel, int *lun, int *id); --static int qla2x00_get_wwn_from_scsi_info (int host, int id, unsigned long long *wwn); --#endif /* CONFIG_SCSIFCHOTSWAP || CONFIG_GAMAP */ -+static void qla2x00_select_queue_depth(struct Scsi_Host *, Scsi_Device *); - - STATIC void qla2x00_timer(scsi_qla_host_t *); - -@@ -264,7 +251,6 @@ static void qla2x00_dump_regs(struct Scs - #if STOP_ON_ERROR - static void qla2x00_panic(char *, struct Scsi_Host *host); - #endif --static - void qla2x00_print_scsi_cmd(Scsi_Cmnd *cmd); - - #if 0 -@@ -272,7 +258,7 @@ STATIC void qla2x00_abort_pending_queue( - #endif - - STATIC void qla2x00_mem_free(scsi_qla_host_t *ha); --STATIC void qla2x00_do_dpc(void *p); -+void qla2x00_do_dpc(void *p); - - static inline void qla2x00_callback(scsi_qla_host_t *ha, Scsi_Cmnd *cmd); - -@@ -302,9 +288,6 @@ STATIC uint8_t qla2100_nvram_config(scsi - #else - STATIC uint8_t qla2x00_nvram_config(scsi_qla_host_t *); - #endif --STATIC uint8_t qla2x00_get_link_status(scsi_qla_host_t *, -- uint8_t, void *, uint16_t *); -- - STATIC uint8_t qla2x00_loop_reset(scsi_qla_host_t *ha); - STATIC uint8_t qla2x00_abort_isp(scsi_qla_host_t *); - STATIC uint8_t qla2x00_loop_resync(scsi_qla_host_t *); -@@ -312,8 +295,8 @@ STATIC uint8_t qla2x00_loop_resync(scsi_ - STATIC void qla2x00_nv_write(scsi_qla_host_t *, uint16_t); - STATIC void qla2x00_nv_deselect(scsi_qla_host_t *ha); - STATIC void qla2x00_poll(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 fc_port_t *qla2x00_alloc_fcport(scsi_qla_host_t *, int); - STATIC void qla2x00_reset_adapter(scsi_qla_host_t *); - STATIC void qla2x00_enable_lun(scsi_qla_host_t *); - STATIC void qla2x00_isp_cmd(scsi_qla_host_t *); -@@ -342,14 +325,14 @@ STATIC uint8_t qla2x00_configure_hba(scs - STATIC void qla2x00_reset_chip(scsi_qla_host_t *ha); - - STATIC void qla2x00_display_fc_names(scsi_qla_host_t *ha); --static void qla2x00_dump_requests(scsi_qla_host_t *ha); -+void qla2x00_dump_requests(scsi_qla_host_t *ha); - static void qla2x00_get_properties(scsi_qla_host_t *ha, char *string); - STATIC uint8_t qla2x00_find_propname(scsi_qla_host_t *ha, - char *propname, char *propstr, char *db, int siz); - static int qla2x00_get_prop_16chars(scsi_qla_host_t *ha, - char *propname, char *propval, char *cmdline); - static char *qla2x00_get_line(char *str, char *line); --static void qla2x00_check_fabric_devices(scsi_qla_host_t *ha); -+void qla2x00_check_fabric_devices(scsi_qla_host_t *ha); - #if defined(ISP2300) - STATIC void qla2x00_blink_led(scsi_qla_host_t *ha); - #endif -@@ -403,13 +386,10 @@ static int qla2x00_tx_timeout(scsi_qla_ - #endif /* if defined(FC_IP_SUPPORT) */ - - static void qla2x00_device_resync(scsi_qla_host_t *); --STATIC uint8_t qla2x00_update_fc_database(scsi_qla_host_t *, fcdev_t *, -- uint8_t); - --STATIC uint8_t qla2x00_configure_fabric(scsi_qla_host_t *, uint8_t ); -+STATIC uint8_t qla2x00_configure_fabric(scsi_qla_host_t *); - static uint8_t qla2x00_find_all_fabric_devs(scsi_qla_host_t *, -- sns_cmd_rsp_t *, dma_addr_t, struct new_dev *, -- uint16_t *, uint8_t *); -+ sns_cmd_rsp_t *, dma_addr_t, struct list_head *); - #if REG_FC4_ENABLED - static uint8_t qla2x00_register_fc4(scsi_qla_host_t *, sns_cmd_rsp_t *, dma_addr_t); - static uint8_t qla2x00_register_fc4_feature(scsi_qla_host_t *, sns_cmd_rsp_t *, dma_addr_t); -@@ -418,63 +398,55 @@ static uint8_t qla2x00_register_nn(scsi_ - static uint8_t qla2x00_register_snn(scsi_qla_host_t *); - #endif - static uint8_t qla2x00_gnn_ft(scsi_qla_host_t *, sns_cmd_rsp_t *, dma_addr_t, -- struct new_dev *, uint32_t); -+ sw_info_t *, uint32_t); - static uint8_t qla2x00_gpn_id(scsi_qla_host_t *, sns_cmd_rsp_t *, dma_addr_t, -- struct new_dev *); -+ sw_info_t *); - static uint8_t qla2x00_gan(scsi_qla_host_t *, sns_cmd_rsp_t *, dma_addr_t, -- fcdev_t *); --static uint8_t qla2x00_fabric_login(scsi_qla_host_t *, fcdev_t *); -+ fc_port_t *); -+static uint8_t qla2x00_fabric_login(scsi_qla_host_t *, fc_port_t *, uint16_t *); - static uint8_t qla2x00_local_device_login(scsi_qla_host_t *, uint16_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_fcports( scsi_qla_host_t *ha ); -+static uint8_t qla2x00_configure_local_loop(scsi_qla_host_t *); - - STATIC uint8_t qla2x00_32bit_start_scsi(srb_t *sp); -- - STATIC uint8_t qla2x00_64bit_start_scsi(srb_t *sp); - - /* Routines for Failover */ --static os_tgt_t *qla2x00_tgt_alloc(scsi_qla_host_t *ha, uint16_t t); -+os_tgt_t *qla2x00_tgt_alloc(scsi_qla_host_t *ha, uint16_t t); - #if APIDEV - static int apidev_init(struct Scsi_Host*); - static int apidev_cleanup(void); - #endif --static void qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t); --static os_lun_t *qla2x00_lun_alloc(scsi_qla_host_t *ha, uint16_t t, uint16_t l); -+void qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t); -+os_lun_t *qla2x00_lun_alloc(scsi_qla_host_t *ha, uint16_t t, uint16_t l); - - static void qla2x00_lun_free(scsi_qla_host_t *ha, uint16_t t, uint16_t l); - #if defined(ISP2300) - static inline void - qla2x00_process_response_queue_in_zio_mode(scsi_qla_host_t *); - #endif --static void qla2x00_next(scsi_qla_host_t *vis_ha); --static int qla2x00_build_fcport_list(scsi_qla_host_t *ha); -+void qla2x00_next(scsi_qla_host_t *vis_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 uint16_t qla2x00_fcport_bind(scsi_qla_host_t *, fc_port_t *); -+static os_lun_t *qla2x00_fclun_bind(scsi_qla_host_t *, fc_port_t *, fc_lun_t *); -+static int qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport); -+static int qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport); - 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_process_failover(scsi_qla_host_t *ha) ; - - STATIC int qla2x00_device_reset(scsi_qla_host_t *, fc_port_t *); - - static inline int qla2x00_is_wwn_zero(uint8_t *wwn); --static void qla2x00_get_lun_mask_from_config(scsi_qla_host_t *ha, fc_port_t *port, -+void qla2x00_get_lun_mask_from_config(scsi_qla_host_t *ha, fc_port_t *port, - uint16_t tgt, uint16_t dev_no); --static void --qla2x00_print_q_info(os_lun_t *q); -- --#if QLA2X_PERFORMANCE --static void qla2x00_done_tasklet(long p); --#endif -+void qla2x00_print_q_info(os_lun_t *q); - - STATIC void qla2x00_failover_cleanup(srb_t *); - void qla2x00_flush_failover_q(scsi_qla_host_t *, os_lun_t *); - --static void qla2x00_chg_endian(uint8_t buf[], size_t size); -+void qla2x00_chg_endian(uint8_t buf[], size_t size); - STATIC uint8_t qla2x00_check_sense(Scsi_Cmnd *cp, os_lun_t *); - - STATIC uint8_t -@@ -488,7 +460,11 @@ qla2x00_suspend_target(scsi_qla_host_t * - - STATIC uint8_t - qla2x00_check_for_devices_online(scsi_qla_host_t *ha); -+int qla2x00_test_active_port( fc_port_t *fcport ); - -+STATIC void qla2x00_probe_for_all_luns(scsi_qla_host_t *ha); -+void qla2x00_find_all_active_ports(srb_t *sp); -+int qla2x00_test_active_lun( fc_port_t *fcport, fc_lun_t *fclun ); - - #if DEBUG_QLA2100 - #if !defined(QL_DEBUG_ROUTINES) -@@ -510,7 +486,7 @@ STATIC int mbxtimeout = 0; - #endif - - #if DEBUG_GET_FW_DUMP --#if defined(ISP2300) -+#if defined(ISP2300) - STATIC void qla2300_dump_isp(scsi_qla_host_t *ha), - #endif - qla2x00_dump_word(uint8_t *, uint32_t, uint32_t); -@@ -520,13 +496,14 @@ STATIC void qla2x00_sleep_done (struct s - #endif - STATIC void qla2x00_retry_command(scsi_qla_host_t *, srb_t *); - --STATIC uint8_t qla2x00_allocate_sp_pool( scsi_qla_host_t *ha); --STATIC void qla2x00_free_sp_pool(scsi_qla_host_t *ha ); -+static inline void qla2x00_add_timer_to_cmd(srb_t *, int); -+uint8_t qla2x00_allocate_sp_pool( scsi_qla_host_t *ha); -+void qla2x00_free_sp_pool(scsi_qla_host_t *ha ); - STATIC srb_t * qla2x00_get_new_sp (scsi_qla_host_t *ha); - STATIC uint8_t qla2x00_check_tgt_status(scsi_qla_host_t *ha, Scsi_Cmnd *cmd); - STATIC uint8_t qla2x00_check_port_status(scsi_qla_host_t *ha, - fc_port_t *fcport); --STATIC void qla2x00_mark_device_lost(scsi_qla_host_t *ha, fc_port_t *fcport); -+STATIC void qla2x00_mark_device_lost(scsi_qla_host_t *, fc_port_t *, int); - STATIC void qla2x00_mark_all_devices_lost( scsi_qla_host_t *ha ); - STATIC inline void qla2x00_delete_from_done_queue(scsi_qla_host_t *, srb_t *); - -@@ -564,18 +541,12 @@ STATIC uint8_t qla2x00_erase_flash_secto - uint32_t addr, uint32_t sec_mask, uint8_t mid); - STATIC uint8_t qla2x00_get_flash_manufacturer(scsi_qla_host_t *ha); - STATIC uint16_t qla2x00_get_flash_version(scsi_qla_host_t *); -+STATIC uint16_t qla2x00_get_fcode_version(scsi_qla_host_t *, uint32_t); - #if defined(NOT_USED_FUNCTION) - STATIC uint16_t qla2x00_get_flash_image(scsi_qla_host_t *ha, uint8_t *image); - #endif - STATIC uint16_t qla2x00_set_flash_image(scsi_qla_host_t *ha, uint8_t *image); - --#if USE_FLASH_DATABASE --STATIC void qla2x00_flash_enable_database(scsi_qla_host_t *); --STATIC void qla2x00_flash_disable_database(scsi_qla_host_t *); --STATIC uint8_t qla2x00_get_database(scsi_qla_host_t *); --STATIC uint8_t qla2x00_save_database(scsi_qla_host_t *); --#endif -- - /* Some helper functions */ - static inline uint32_t qla2x00_normalize_dma_addr( - dma_addr_t *e_addr, uint32_t *e_len, -@@ -592,8 +563,11 @@ static inline cont_entry_t *qla2x00_prep - 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 void -+qla2x00_free_request_resources(scsi_qla_host_t *dest_ha, srb_t *sp); -+ - --static inline void qla2x00_config_dma_addressing(scsi_qla_host_t *ha); -+#include "qla_inline.h" - - /** - * qla2x00_normalize_dma_addr() - Normalize an DMA address. -@@ -659,12 +633,10 @@ qla2x00_normalize_dma_addr( - return (normalized); - } - --static int --qla2x00_add_initiator_device(scsi_qla_host_t *ha, fcdev_t *device); -- -+void qla2x00_ioctl_error_recovery(scsi_qla_host_t *); - - /* Debug print buffer */ --static char debug_buff[LINESIZE*3]; -+char debug_buff[LINESIZE*3]; - - /* - * insmod needs to find the variable and make it point to something -@@ -673,7 +645,7 @@ static char *ql2xdevconf = NULL; - static int ql2xdevflag = 0; - - #if MPIO_SUPPORT --static int ql2xretrycount = 30; -+static int ql2xretrycount = 60; - #else - static int ql2xretrycount = 20; - #endif -@@ -684,13 +656,14 @@ static int ql2xlogintimeout = 20; - static int qlport_down_retry = 0; - #endif - static int ql2xmaxqdepth = 0; --static int displayConfig = 0; -+static int displayConfig = 1; /* 1- default, 2 - for lunids */ - static int retry_gnnft = 10; - static int qfull_retry_count = 16; - static int qfull_retry_delay = 2; - static int extended_error_logging = 0; /* 0 = off, 1 = log errors */ -+static int ql2xplogiabsentdevice = 0; - #if defined(ISP2300) --static int ql2xintrdelaytimer = 10; -+static int ql2xintrdelaytimer = 3; - #endif - - /* Enable for failover */ -@@ -700,6 +673,10 @@ static int ql2xfailover = 1; - static int ql2xfailover = 0; - #endif - -+#if defined(ISP2200) || defined(ISP2300) -+static int qlogin_retry_count = 0; -+#endif -+ - static int ConfigRequired = 0; - static int recoveryTime = MAX_RECOVERYTIME; - static int failbackTime = MAX_FAILBACKTIME; -@@ -708,8 +685,8 @@ static int failbackTime = MAX_FAILBACKTI - static int Bind = BIND_BY_PORT_NAME; - - static int ql2xsuspendcount = SUSPEND_COUNT; -+static int ql2xioctltimeout = QLA_PT_CMD_TOV; - --#if defined(MODULE) - static char *ql2xopts = NULL; - - /* insmod qla2100 ql2xopts=verbose" */ -@@ -785,7 +762,7 @@ MODULE_PARM_DESC(failbackTime, - MODULE_PARM(Bind, "i"); - MODULE_PARM_DESC(Bind, - "Target persistent binding method: " -- "0 by Portname (default); 1 by PortID; 2 by Nodename. "); -+ "0 by Portname (default); 1 by PortID. "); - - MODULE_PARM(ql2xsuspendcount,"i"); - MODULE_PARM_DESC(ql2xsuspendcount, -@@ -810,8 +787,25 @@ MODULE_PARM_DESC(extended_error_logging, - "Option to enable extended error logging, " - "Default is 0 - no logging. 1 - log errors."); - -+MODULE_PARM(ql2xplogiabsentdevice, "i"); -+MODULE_PARM_DESC(ql2xplogiabsentdevice, -+ "Option to enable PLOGI to devices that are not present after " -+ "a Fabric scan. This is needed for several broken switches." -+ "Default is 0 - no PLOGI. 1 - perfom PLOGI."); -+ -+#if defined(ISP2200) || defined(ISP2300) -+MODULE_PARM(qlogin_retry_count,"i"); -+MODULE_PARM_DESC(qlogin_retry_count, -+ "Option to modify the login retry count."); -+#endif -+ -+MODULE_PARM(ql2xioctltimeout,"i"); -+MODULE_PARM_DESC(ql2xioctltimeout, -+ "IOCTL timeout value in seconds for pass-thur commands, " -+ "Default=66"); -+ - MODULE_DESCRIPTION("QLogic Fibre Channel Host Adapter Driver"); --MODULE_AUTHOR("QLogic Corporation"); -+MODULE_AUTHOR(QLOGIC_COMPANY_NAME); - #if defined(MODULE_LICENSE) - MODULE_LICENSE("GPL"); - #endif -@@ -834,8 +828,6 @@ MODULE_PARM_DESC(ql2xuseextopts, - - static char *ql2x_extopts = NULL; - --#endif -- - #include "listops.h" - #include "qla_fo.cfg" - -@@ -850,6 +842,9 @@ static int qla2x00_lip = 0; - /* multi-OS QLOGIC IOCTL definition file */ - #include "exioct.h" - -+#if REG_FDMI_ENABLED -+#include "qla_gs.h" -+#endif - - #if QLA_SCSI_VENDOR_DIR - /* Include routine to set direction for vendor specific commands */ -@@ -887,117 +882,12 @@ static int qla2x00_lip = 0; - - #include "qla_debug.h" - -+uint8_t copyright[48] = "Copyright 1999-2003, QLogic Corporation"; -+ - /****************************************************************************/ - /* LINUX - Loadable Module Functions. */ - /****************************************************************************/ - --/*****************************************/ --/* ISP Boards supported by this driver */ --/*****************************************/ --#define QLA2X00_VENDOR_ID 0x1077 --#define QLA2100_DEVICE_ID 0x2100 --#define QLA2200_DEVICE_ID 0x2200 --#define QLA2200A_DEVICE_ID 0x2200A --#define QLA2300_DEVICE_ID 0x2300 --#define QLA2312_DEVICE_ID 0x2312 --#define QLA2200A_RISC_ROM_VER 4 --#define FPM_2300 6 --#define FPM_2310 7 -- --#if defined(ISP2100) --#define NUM_OF_ISP_DEVICES 2 --static struct pci_device_id qla2100_pci_tbl[] = --{ -- {QLA2X00_VENDOR_ID, QLA2100_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -- {0,} --}; --MODULE_DEVICE_TABLE(pci, qla2100_pci_tbl); --#endif --#if defined(ISP2200) --#define NUM_OF_ISP_DEVICES 2 --static struct pci_device_id qla2200_pci_tbl[] = --{ -- {QLA2X00_VENDOR_ID, QLA2200_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -- {0,} --}; --MODULE_DEVICE_TABLE(pci, qla2200_pci_tbl); --#endif --#if defined(ISP2300) --#define NUM_OF_ISP_DEVICES 3 --static struct pci_device_id qla2300_pci_tbl[] = --{ -- {QLA2X00_VENDOR_ID, QLA2300_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -- {QLA2X00_VENDOR_ID, QLA2312_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -- {0,} --}; --MODULE_DEVICE_TABLE(pci, qla2300_pci_tbl); --#endif -- --typedef struct _qlaboards --{ -- unsigned char bdName[9]; /* Board ID String */ -- unsigned long device_id; /* Device ID */ -- int numPorts; /* number of loops on adapter */ -- unsigned short *fwcode; /* pointer to FW array */ -- unsigned short *fwlen; /* number of words in array */ -- unsigned short *fwstart; /* start address for F/W */ -- unsigned char *fwver; /* Ptr to F/W version array */ --} --qla_boards_t; -- --/* -- * NOTE: Check the Product ID of the Chip during chip diagnostics -- * whenever support for new ISP is added. -- */ --static struct _qlaboards QLBoardTbl_fc[NUM_OF_ISP_DEVICES] = --{ -- /* Name , Board PCI Device ID, Number of ports */ --#if defined(ISP2300) -- {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, --#if defined(FC_IP_SUPPORT) -- &fw2300ip_code01[0], &fw2300ip_length01, -- &fw2300ip_addr01, &fw2300ip_version_str[0] -- }, --#else -- &fw2300tp_code01[0], &fw2300tp_length01, -- &fw2300tp_addr01, &fw2300tp_version_str[0] -- }, --#endif -- {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, --#if defined(FC_IP_SUPPORT) -- &fw2300ip_code01[0], &fw2300ip_length01, -- &fw2300ip_addr01, &fw2300ip_version_str[0] -- }, --#else -- &fw2300tp_code01[0], &fw2300tp_length01, -- &fw2300tp_addr01, &fw2300tp_version_str[0] -- }, --#endif --#endif -- --#if defined(ISP2200) -- {"QLA2200 ", QLA2200_DEVICE_ID, MAX_BUSES, --#if defined(FC_IP_SUPPORT) -- &fw2200ip_code01[0], &fw2200ip_length01, -- &fw2200ip_addr01, &fw2200ip_version_str[0] -- }, --#else -- &fw2200tp_code01[0], &fw2200tp_length01, -- &fw2200tp_addr01, &fw2200tp_version_str[0] -- }, --#endif --#endif -- --#if defined(ISP2100) -- {"QLA2100 ", QLA2100_DEVICE_ID, MAX_BUSES, -- &fw2100tp_code01[0], &fw2100tp_length01, -- &fw2100tp_addr01, &fw2100tp_version_str[0] -- }, --#endif -- -- {" ", 0, 0} --}; -- - /* - * Stat info for all adpaters - */ -@@ -1009,10 +899,6 @@ static struct _qla2100stats { - unsigned long loop_resync; - unsigned long outarray_full; - unsigned long retry_q_cnt; --#ifdef PERF_MONITORING -- unsigned long highmem_io; --#endif -- scsi_qla_host_t *irqhba; - } - qla2x00_stats; - -@@ -1056,26 +942,40 @@ STATIC int qla2x00_retryq_dmp = 0; - #include <scsi/scsi_ioctl.h> - #include <asm/uaccess.h> - -+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) -+{ -+ /* Assume 32bit DMA address */ -+ ha->flags.enable_64bit_addressing = 0; -+ -+ if (sizeof(dma_addr_t) > 4) { -+ /* Update our PCI device dma_mask for full 64 bits */ -+ if (pci_set_dma_mask(ha->pdev, 0xffffffffffffffffULL) == 0) { -+ ha->flags.enable_64bit_addressing = 1; -+ } else { -+ printk("qla2x00: Failed to set 64 bit PCI mask; using " -+ "32 bit mask.\n"); -+ pci_set_dma_mask(ha->pdev, 0xffffffff); -+ } -+ } else { -+ pci_set_dma_mask(ha->pdev, 0xffffffff); -+ } - --#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 --}; -+ printk(KERN_INFO -+ "scsi(%ld): %d Bit PCI Addressing Enabled.\n", ha->host_no, -+ (ha->flags.enable_64bit_addressing ? 64 : 32)); -+ DEBUG2(printk(KERN_INFO -+ "scsi(%ld): Scatter/Gather entries= %d\n", ha->host_no, -+ ha->host->sg_tablesize)); -+} - - /************************************************************************* - * qla2x00_set_info -@@ -1085,13 +985,12 @@ static uint8_t alpa_table[MAX_LOCAL_LOOP - * - * Returns: - *************************************************************************/ --static int -+int - qla2x00_set_info(char *buffer, int length, scsi_qla_host_t *ha) - { -- -- -- if (length < 13 || strncmp("scsi-qla", buffer, 7)) -+ if (length < 13 || strncmp("scsi-qla", buffer, 8)) - goto out; -+ - /* - * Usage: echo "scsi-qlascan " > /proc/scsi/<driver-name>/<adapter-id> - * -@@ -1105,10 +1004,19 @@ qla2x00_set_info(char *buffer, int lengt - * Scan for all luns on all ports. - */ - if (!strncmp("scan", buffer + 8, 4)) { -- printk("scsi-qla%ld: Scheduling SCAN for new luns.... \n",ha->host_no); -- printk(KERN_INFO "scsi-qla%ld: Scheduling SCAN for new luns.... \n",ha->host_no); -- set_bit(PORT_SCAN_NEEDED, &ha->dpc_flags); -+ printk("scsi-qla%ld: Scheduling SCAN for new luns.... \n", -+ ha->host_no); -+ printk(KERN_INFO -+ "scsi-qla%ld: Scheduling SCAN for new luns.... \n", -+ ha->host_no); -+ set_bit(PORT_SCAN_NEEDED, &ha->dpc_flags); -+ } else if (!strncmp("lip", buffer + 8, 3)) { -+ printk("scsi-qla%ld: Scheduling LIP.... \n", ha->host_no); -+ printk(KERN_INFO -+ "scsi-qla%ld: Scheduling LIP.... \n", ha->host_no); -+ set_bit(LOOP_RESET_NEEDED, &ha->dpc_flags); - } -+ - out: - /* return (-ENOSYS); */ /* Currently this is a no-op */ - return (length); /* Currently this is a no-op */ -@@ -1187,7 +1095,7 @@ copy_info(struct info_str *info, char *f - * < 0: error. errno value. - * >= 0: sizeof data returned. - *************************************************************************/ --static int -+int - qla2x00_proc_info(char *buffer, char **start, off_t offset, - int length, int hostno, int inout) - { -@@ -1204,6 +1112,11 @@ qla2x00_proc_info(char *buffer, char **s - struct list_head *list, *temp; - unsigned long cpu_flags; - uint8_t *loop_state; -+ fc_port_t *fcport; -+ os_tgt_t *tq; -+#if defined(ISP2300) -+ struct qla2x00_special_options special_options; -+#endif - - #if REQ_TRACE - -@@ -1340,12 +1253,6 @@ qla2x00_proc_info(char *buffer, char **s - ha->qthreads, ha->retry_q_cnt, - ha->done_q_cnt, ha->scsi_retry_q_cnt); - --#ifdef PERF_MONITORING -- copy_info(&info, -- "Number of highmem_io = %ld\n", -- qla2x00_stats.highmem_io); --#endif -- - if (ha->flags.failover_enabled) { - copy_info(&info, - "Number of reqs in failover_q= %d\n", -@@ -1354,17 +1261,17 @@ qla2x00_proc_info(char *buffer, char **s - - flags = (unsigned long *) &ha->flags; - -- if (ha->loop_state == LOOP_DOWN) { -+ if (atomic_read(&ha->loop_state) == LOOP_DOWN) { - loop_state = "DOWN"; -- } else if (ha->loop_state == LOOP_UP) { -+ } else if (atomic_read(&ha->loop_state) == LOOP_UP) { - loop_state = "UP"; -- } else if (ha->loop_state == LOOP_READY) { -+ } else if (atomic_read(&ha->loop_state) == LOOP_READY) { - loop_state = "READY"; -- } else if (ha->loop_state == LOOP_TIMEOUT) { -+ } else if (atomic_read(&ha->loop_state) == LOOP_TIMEOUT) { - loop_state = "TIMEOUT"; -- } else if (ha->loop_state == LOOP_UPDATE) { -+ } else if (atomic_read(&ha->loop_state) == LOOP_UPDATE) { - loop_state = "UPDATE"; -- } else if (ha->loop_state == LOOP_DEAD) { -+ } else if (atomic_read(&ha->loop_state) == LOOP_DEAD) { - loop_state = "DEAD"; - } else { - loop_state = "UNKNOWN"; -@@ -1393,6 +1300,34 @@ qla2x00_proc_info(char *buffer, char **s - "Commands retried with dropped frame(s) = %d\n", - ha->dropped_frame_error_cnt); - -+#if defined(ISP2300) -+ *((uint16_t *) &special_options) = -+ le16_to_cpu(*((uint16_t *) &ha->init_cb->special_options)); -+ -+ copy_info(&info, -+ "Configured characteristic impedence: %d ohms\n", -+ special_options.enable_50_ohm_termination ? 50 : 75); -+ -+ switch (special_options.data_rate) { -+ case 0: -+ loop_state = "1 Gb/sec"; -+ break; -+ -+ case 1: -+ loop_state = "2 Gb/sec"; -+ break; -+ -+ case 2: -+ loop_state = "1-2 Gb/sec auto-negotiate"; -+ break; -+ -+ default: -+ loop_state = "unknown"; -+ break; -+ } -+ copy_info(&info, "Configured data rate: %s\n", loop_state); -+#endif -+ - copy_info(&info, "\n"); - - #if REQ_TRACE -@@ -1491,52 +1426,43 @@ qla2x00_proc_info(char *buffer, char **s - 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) { -+ i = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if(fcport->port_type != FCT_TARGET) -+ 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-port-%d=" -+ "%02x%02x%02x%02x%02x%02x%02x%02x:" -+ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", -+ (int)ha->instance, i, -+ fcport->node_name[0], fcport->node_name[1], -+ fcport->node_name[2], fcport->node_name[3], -+ fcport->node_name[4], fcport->node_name[5], -+ fcport->node_name[6], fcport->node_name[7], -+ 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]); -+ i++; -+ } -+ } else { -+ for (t = 0; t < MAX_FIBRE_DEVICES; t++) { -+ if ((tq = TGT_Q(ha, t)) == NULL) -+ continue; - 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]); -+ "scsi-qla%d-target-%d=" -+ "%02x%02x%02x%02x%02x%02x%02x%02x;\n", -+ (int)ha->instance, t, -+ 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]); - } -- -- } /* 2.25 node/port display to proc */ -+ } - - copy_info(&info, "\nSCSI LUN Information:\n"); -- - copy_info(&info, "(Id:Lun) * - indicates lun is not registered with the OS.\n"); - - /* scan for all equipment stats */ -@@ -1573,13 +1499,6 @@ qla2x00_proc_info(char *buffer, char **s - (int)up->q_flag); - } - --#ifdef PERF_MONITORING -- copy_info(&info, -- " %lx:%lx (act,resp),", -- up->act_time/up->io_cnt, -- up->resp_time/up->io_cnt); --#endif -- - copy_info(&info, - " %ld:%d:%02x,", - up->fclun->fcport->ha->instance, -@@ -1650,8 +1569,6 @@ pci_set_dma_mask(struct pci_dev *dev, u6 - 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", -@@ -1665,19 +1582,7 @@ sp_put(struct scsi_qla_host * ha, srb_t - return; - } - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_lock_irqsave(&io_request_lock, flags); --#else -- spin_lock_irqsave(ha->host->host_lock, flags); --#endif -- - qla2x00_callback(ha, sp->cmd); -- --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_unlock_irqrestore(&io_request_lock, flags); --#else -- spin_unlock_irqrestore(ha->host->host_lock, flags); --#endif - } - - /************************************************************************** -@@ -1753,7 +1658,7 @@ __sp_put(struct scsi_qla_host * ha, srb_ - * None. - * Note:Need to add the support for if( sp->state == SRB_FAILOVER_STATE). - **************************************************************************/ --static void -+void - qla2x00_cmd_timeout(srb_t *sp) - { - int t, l; -@@ -1761,9 +1666,7 @@ qla2x00_cmd_timeout(srb_t *sp) - 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; -@@ -1799,8 +1702,12 @@ qla2x00_cmd_timeout(srb_t *sp) - * DID_BUS_BUSY to let the OS retry this cmd. - */ - if (atomic_read(&fcport->state) == FC_DEVICE_DEAD || -- ( vis_ha->loop_state == LOOP_DEAD )){ -+ atomic_read(&fcport->ha->loop_state) == LOOP_DEAD) { - cmd->result = DID_NO_CONNECT << 16; -+ if (atomic_read(&fcport->ha->loop_state) == LOOP_DOWN) -+ sp->err_id = SRB_ERR_LOOP; -+ else -+ sp->err_id = SRB_ERR_PORT; - } else { - cmd->result = DID_BUS_BUSY << 16; - } -@@ -1809,12 +1716,8 @@ qla2x00_cmd_timeout(srb_t *sp) - } - spin_unlock_irqrestore(&vis_ha->list_lock, flags); - if (processed) { --#if QLA2X_PERFORMANCE -- tasklet_schedule(&vis_ha->run_qla_task); --#else - if (vis_ha->dpc_wait && !vis_ha->dpc_active) - up(vis_ha->dpc_wait); --#endif - return; - } - -@@ -1847,10 +1750,15 @@ qla2x00_cmd_timeout(srb_t *sp) - if (dest_ha->flags.failover_enabled) { - cmd->result = DID_BUS_BUSY << 16; - } else { -- if ((atomic_read(&fcport->state) == FC_DEVICE_DEAD) || -- ( dest_ha->loop_state == LOOP_DEAD )){ -+ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD || -+ atomic_read(&dest_ha->loop_state) == LOOP_DEAD) { - qla2x00_extend_timeout(cmd, EXTEND_CMD_TIMEOUT); - cmd->result = DID_NO_CONNECT << 16; -+ if (atomic_read(&dest_ha->loop_state) == -+ LOOP_DOWN) -+ sp->err_id = SRB_ERR_LOOP; -+ else -+ sp->err_id = SRB_ERR_PORT; - } else { - cmd->result = DID_BUS_BUSY << 16; - } -@@ -1861,16 +1769,11 @@ qla2x00_cmd_timeout(srb_t *sp) - } - spin_unlock_irqrestore(&dest_ha->list_lock, flags); - if (processed) { --#if QLA2X_PERFORMANCE -- tasklet_schedule(&dest_ha->run_qla_task); --#else - if (dest_ha->dpc_wait && !dest_ha->dpc_active) - up(dest_ha->dpc_wait); --#endif - return; - } - --#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 */ -@@ -1893,6 +1796,24 @@ qla2x00_cmd_timeout(srb_t *sp) - - DEBUG(printk("cmd_timeout: Found in ISP \n");) - -+ if (sp->flags & SRB_TAPE) { -+ /* -+ * We cannot allow the midlayer error handler -+ * to wakeup and begin the abort process. -+ * Extend the timer so that the firmware can -+ * properly return the IOCB. -+ */ -+ DEBUG(printk("cmd_timeout: Extending timeout " -+ "of FCP2 tape command!\n")); -+ qla2x00_extend_timeout(sp->cmd, -+ EXTEND_CMD_TIMEOUT); -+ } else if (sp->flags & SRB_IOCTL) { -+ dest_ha->ioctl_err_cmd = sp->cmd; -+ set_bit(IOCTL_ERROR_RECOVERY, &dest_ha->dpc_flags); -+ if (dest_ha->dpc_wait && !dest_ha->dpc_active) -+ up(dest_ha->dpc_wait); -+ } -+ - sp->state = SRB_ACTIVE_TIMEOUT_STATE; - spin_unlock_irqrestore(&dest_ha->hardware_lock, flags); - } else { -@@ -1917,8 +1838,7 @@ qla2x00_cmd_timeout(srb_t *sp) - "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");) - } - -@@ -1943,16 +1863,7 @@ qla2x00_add_timer_to_cmd(srb_t *sp, int - sp->timer.expires = jiffies + timeout * HZ; - sp->timer.data = (unsigned long) sp; - sp->timer.function = (void (*) (unsigned long))qla2x00_cmd_timeout; --#ifndef __VMWARE__ - add_timer(&sp->timer); --#else -- if (timeout) { -- add_timer(&sp->timer); -- } -- else { -- sp->timer.function = NULL; -- } --#endif - } - - /************************************************************************** -@@ -1981,7 +1892,7 @@ qla2x00_delete_timer_from_cmd(srb_t *sp - * qla2x00_detect - * - * Description: --* This routine will probe for Qlogic FC SCSI host adapters. -+* 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 -@@ -1993,7 +1904,7 @@ qla2x00_delete_timer_from_cmd(srb_t *sp - * Returns: - * num - number of host adapters found. - **************************************************************************/ --static int -+int - qla2x00_detect(Scsi_Host_Template *template) - { - int ret; -@@ -2010,17 +1921,7 @@ qla2x00_detect(Scsi_Host_Template *templ - - ENTER("qla2x00_detect"); - --#ifdef __VMWARE__ -- if (vmk_check_version(VMKDRIVER_VERSION) != VMK_VERSION_OK) { -- return 0; -- } -- /* In the vmkernel, we do not hold the io_request lock during init, -- * so leave it unlocked and do not lock it before returning. */ --#else --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - spin_unlock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ - - #if defined(MODULE) - DEBUG3(printk("DEBUG: qla2x00_set_info starts at address = %p\n", -@@ -2043,12 +1944,12 @@ qla2x00_detect(Scsi_Host_Template *templ - - /* Increments the usage count of module: qla2[23]00_conf */ - #if defined(ISP2200) -- ql2x_extopts = (char *) inter_module_get_request("qla22XX_conf", -- "qla2200_conf"); -+ ql2x_extopts = -+ (char *) inter_module_get_request("qla22XX_conf", "qla2200_conf"); - #endif - #if defined(ISP2300) -- ql2x_extopts = (char *) inter_module_get_request("qla23XX_conf", -- "qla2300_conf"); -+ ql2x_extopts = -+ (char *) inter_module_get_request("qla23XX_conf", "qla2300_conf"); - #endif - - DEBUG4(printk("qla2x00_detect: ql2xopts=%p ql2x_extopts=%p " -@@ -2061,8 +1962,8 @@ qla2x00_detect(Scsi_Host_Template *templ - /* Force to use old option. */ - qla2x00_setup(ql2xopts); - printk(KERN_INFO "qla2x00:Loading driver with config data " -- " from /etc/modules.conf. Config Data length=0x%x\n", -- strlen(ql2xopts)); -+ " from /etc/modules.conf. Config Data length=0x%lx\n", -+ (ulong)strlen(ql2xopts)); - - } else if (ql2x_extopts != NULL && *ql2x_extopts != '\0') { - DEBUG4(printk( "qla2x00_detect: using new opt:" -@@ -2073,8 +1974,8 @@ qla2x00_detect(Scsi_Host_Template *templ - ql2xdevflag++; - } - printk(KERN_INFO "qla2x00: Loading driver with config data " -- "from config module. Config Data length=0x%x\n", -- strlen(ql2x_extopts)); -+ "from config module. Config Data length=0x%lx\n", -+ (ulong)strlen(ql2x_extopts)); - } - - if (dummy_buffer[0] != 'P') -@@ -2091,11 +1992,8 @@ qla2x00_detect(Scsi_Host_Template *templ - - if (!pci_present()) { - printk("scsi: PCI not present\n"); --#ifndef __VMWARE__ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - spin_lock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -+ - return 0; - } /* end of !pci_present() */ - -@@ -2121,6 +2019,7 @@ qla2x00_detect(Scsi_Host_Template *templ - for (i = 0; bdp->device_id != 0 && i < NUM_OF_ISP_DEVICES; - i++, bdp++) { - -+ pdev = NULL; - /* PCI_SUBSYSTEM_IDS supported */ - while ((pdev = pci_find_subsys(QLA2X00_VENDOR_ID, - bdp->device_id, -@@ -2142,25 +2041,6 @@ qla2x00_detect(Scsi_Host_Template *templ - subsystem_vendor = pdev->subsystem_vendor; - subsystem_device = pdev->subsystem_device; - -- /* If it's an XXX SubSys Vendor ID adapter, skip it. */ -- /* -- if (pdev->subsystem_vendor == PCI_VENDOR_ID_XXX) { -- printk(KERN_WARNING -- "qla2x00: Skip XXX SubSys Vendor ID " -- "Controller\n"); -- continue; -- } -- */ -- --#ifdef __VMWARE__ -- /* We do not need to hold any lock when calling the -- * functions below in the vmkernel. */ --#else --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_lock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -- - #if defined(ISP2100) - template->name = "QLogic Fibre Channel 2100"; - #endif -@@ -2170,35 +2050,20 @@ qla2x00_detect(Scsi_Host_Template *templ - #if defined(ISP2300) - template->name = "QLogic Fibre Channel 2300"; - #endif -- if ((host = -- scsi_register( -- template, -- sizeof(scsi_qla_host_t))) == NULL) { -- -+ spin_lock_irq(&io_request_lock); -+ host = scsi_register(template, sizeof(scsi_qla_host_t)); -+ spin_unlock_irq(&io_request_lock); -+ if (host == NULL) { - printk(KERN_WARNING -- "qla2x00: couldn't register " -- "with scsi layer\n"); -- return 0; -+ "qla2x00: couldn't register with scsi " -+ "layer\n"); -+ goto bailout; - } - - ha = (scsi_qla_host_t *)host->hostdata; - --#if defined(CONFIG_VMNIX) && !defined(__VMWARE__) -- host->bus = pdev->bus->number; -- host->function = pdev->devfn; -- host->devid = ha; --#endif - /* Clear our data area */ - memset(ha, 0, sizeof(scsi_qla_host_t)); --#ifdef __VMWARE__ -- scsi_register_uinfo(host, pdev->bus->number, pdev->devfn, ha); -- -- /* Now get and save the adapter pointer... */ -- ha->vmk_adapter = host->adapter; -- if (ha->vmk_adapter == NULL) { -- panic("qla : vmkernel adapter structure is NULL\n"); -- } --#endif - - ha->host_no = host->host_no; - ha->host = host; -@@ -2208,10 +2073,10 @@ qla2x00_detect(Scsi_Host_Template *templ - ret = qla2x00_iospace_config(ha); - if (ret != 0) { - printk(KERN_WARNING -- "qla2x00: couldn't configure PCI I/O space!\n"); -- -+ "qla2x00: couldn't configure PCI I/O " -+ "space!\n"); -+ spin_lock_irq(&io_request_lock); - scsi_unregister(host); -- - spin_unlock_irq(&io_request_lock); - - continue; -@@ -2230,18 +2095,21 @@ qla2x00_detect(Scsi_Host_Template *templ - ha->devnum = i; - if (qla2x00_verbose) { - printk(KERN_INFO -- "scsi(%d): Found a %s @ bus %d, " -- "device 0x%x, irq %d, iobase 0x%p\n", -- host->host_no, -- bdp->bdName, -- ha->pdev->bus->number, -- PCI_SLOT(ha->pdev->devfn), -- host->irq, -- ha->iobase); -+ "scsi(%d): Found a %s @ bus %d, device " -+ "0x%x, irq %d, iobase 0x%p\n", -+ host->host_no, bdp->bdName, -+ ha->pdev->bus->number, -+ PCI_SLOT(ha->pdev->devfn), host->irq, -+ ha->iobase); - } - - spin_lock_init(&ha->hardware_lock); - -+#if defined(SH_HAS_HOST_LOCK) -+ spin_lock_init(&ha->host_lock); -+ host->host_lock = &ha->host_lock; -+#endif -+ - /* 4.23 Initialize /proc/scsi/qla2x00 counters */ - ha->actthreads = 0; - ha->qthreads = 0; -@@ -2254,9 +2122,10 @@ qla2x00_detect(Scsi_Host_Template *templ - ha->total_bytes = 0; - - /* Initialized memory allocation pointers */ -- INIT_LIST_HEAD(&ha->fcinitiators); - INIT_LIST_HEAD(&ha->free_queue); - -+ INIT_LIST_HEAD(&ha->fcports); -+ - INIT_LIST_HEAD(&ha->done_queue); - INIT_LIST_HEAD(&ha->retry_queue); - INIT_LIST_HEAD(&ha->scsi_retry_queue); -@@ -2264,42 +2133,22 @@ qla2x00_detect(Scsi_Host_Template *templ - - INIT_LIST_HEAD(&ha->pending_queue); - -- /* -- * Need to call this before the PCI allocations are -- * done in qla2x00_mem_alloc(). -- */ - qla2x00_config_dma_addressing(ha); --#ifndef __VMWARE__ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_unlock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -+ - if (qla2x00_mem_alloc(ha)) { - printk(KERN_WARNING -- "scsi(%d): [ERROR] Failed to allocate " -- "memory for adapter\n", -- host->host_no); -+ "scsi(%d): [ERROR] Failed to allocate " -+ "memory for adapter\n", host->host_no); - qla2x00_mem_free(ha); --#ifndef __VMWARE__ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+ pci_release_regions(ha->pdev); -+ - spin_lock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ - scsi_unregister(host); --#ifndef __VMWARE__ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - spin_unlock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -+ - continue; - } - --#ifndef __VMWARE__ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_lock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -- - ha->prev_topology = 0; - ha->ports = bdp->numPorts; - -@@ -2319,11 +2168,6 @@ qla2x00_detect(Scsi_Host_Template *templ - else - ha->flags.failover_enabled = 0; - --#if QLA2X_PERFORMANCE -- tasklet_init(&ha->run_qla_task, -- (void *)qla2x00_done_tasklet, -- (unsigned long) ha); --#endif - - /* - * These locks are used to prevent more than one CPU -@@ -2337,61 +2181,30 @@ qla2x00_detect(Scsi_Host_Template *templ - spin_lock_init(&ha->mbx_q_lock); - spin_lock_init(&ha->list_lock); - --#ifndef __VMWARE__ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_unlock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -- - if (qla2x00_initialize_adapter(ha) && - !(ha->device_flags & DFLG_NO_CABLE)) { - - printk(KERN_WARNING -- "qla2x00: Failed to " -- "initialize adapter\n"); -+ "qla2x00: Failed to initialize adapter\n"); - -- DEBUG2(printk(KERN_INFO "scsi%ld: Failed to initialize " -- "adapter - Adapter flags %x.\n", -- ha->host_no, ha->device_flags);) -+ DEBUG2(printk(KERN_INFO -+ "scsi%ld: Failed to initialize adapter - " -+ "Adapter flags %x.\n", ha->host_no, -+ ha->device_flags);) - - qla2x00_mem_free(ha); --#if QLA2X_PERFORMANCE -- tasklet_kill(&ha->run_qla_task); --#endif - --#ifdef __VMWARE__ -- /* No need to grab the lock just to call -- * scsi_unregister in the vmkernel. -- */ --#else --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+ pci_release_regions(ha->pdev); - spin_lock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -- - scsi_unregister(host); -- --#ifndef __VMWARE__ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - spin_unlock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -+ - continue; - } - - /* - * Startup the kernel thread for this host adapter - */ --#ifdef __VMWARE__ -- /* -- * Initialize the extensions defined in ha to -- * communicate with the DPC kernel thread. -- */ -- ha->should_die = FALSE; -- -- ha->notify_sema = (struct semaphore)__SEMAPHORE_INITIALIZER(ha->notify_sema, 0); -- ha->dpc_notify = &ha->notify_sema; --#else - #if defined(ISP2100) - ha->dpc_notify = &qla2100_detect_sem; - #endif -@@ -2401,20 +2214,13 @@ qla2x00_detect(Scsi_Host_Template *templ - #if defined(ISP2300) - ha->dpc_notify = &qla2300_detect_sem; - #endif --#endif //__VMWARE__ -- - kernel_thread((int (*)(void *))qla2x00_do_dpc, -- (void *) ha, 0); -+ (void *) ha, 0); - - /* - * Now wait for the kernel dpc thread to initialize - * and go to sleep. - */ --#ifdef __VMWARE__ -- printk("qla: waiting for kernel_thread\n"); -- down(ha->dpc_notify); -- printk("qla: kernel_thread back\n"); --#else - #if defined(ISP2100) - down(&qla2100_detect_sem); - #endif -@@ -2424,56 +2230,29 @@ qla2x00_detect(Scsi_Host_Template *templ - #if defined(ISP2300) - down(&qla2300_detect_sem); - #endif --#endif //__VMWARE__ - - ha->dpc_notify = NULL; - ha->next = NULL; -- /* 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; -- --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_lock_irq(&io_request_lock); --#endif - - /* Register our resources with Linux */ - if (qla2x00_register_with_Linux(ha, bdp->numPorts-1)) { - printk(KERN_WARNING -- "scsi%ld: Failed to " -- "register resources.\n", -- ha->host_no); --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_unlock_irq(&io_request_lock); --#endif -+ "scsi%ld: Failed to register resources.\n", -+ ha->host_no); - - qla2x00_mem_free(ha); --#if QLA2X_PERFORMANCE -- tasklet_kill(&ha->run_qla_task); --#endif --#ifdef __VMWARE__ -- /* No need to grab the lock just to call -- * scsi_unregister in the vmkernel. -- */ --#else --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_lock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ - -+ pci_release_regions(ha->pdev); -+ spin_lock_irq(&io_request_lock); - scsi_unregister(host); -- --#ifndef __VMWARE__ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - spin_unlock_irq(&io_request_lock); --#endif --#endif //__VMWARE__ -+ - continue; - } - - DEBUG2(printk(KERN_INFO "DEBUG: detect hba %ld at " -- "address = %p\n", -- ha->host_no, ha);) -+ "address = %p - adding to hba list\n", ha->host_no, -+ ha);) - - reg = ha->iobase; - -@@ -2482,14 +2261,15 @@ qla2x00_detect(Scsi_Host_Template *templ - - /* Ensure mailbox registers are free. */ - spin_lock_irqsave(&ha->hardware_lock, flags); -+ - WRT_REG_WORD(®->semaphore, 0); - WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); - WRT_REG_WORD(®->host_cmd, HC_CLR_HOST_INT); - - /* Enable proper parity */ --#if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) -- /* SRAM, Instruction RAM and GP RAM parity */ -+#if defined(ISP2300) -+ if (check_all_device_ids(ha)) -+ /* SRAM, Instruction RAM and GP RAM parity */ - WRT_REG_WORD(®->host_cmd, - (HC_ENABLE_PARITY + 0x7)); - else -@@ -2500,10 +2280,6 @@ qla2x00_detect(Scsi_Host_Template *templ - - spin_unlock_irqrestore(&ha->hardware_lock, flags); - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_unlock_irq(&io_request_lock); --#endif -- - /* - * if failover is enabled read the user configuration - */ -@@ -2513,9 +2289,9 @@ qla2x00_detect(Scsi_Host_Template *templ - else - mp_config_required = 0; - -- DEBUG(printk("qla2x00_detect: qla2x00_cfg_init " -- "for hba %ld\n", -- ha->instance);) -+ DEBUG2(printk("qla2x00_detect: " -+ "qla2x00_cfg_init for hba %ld\n", -+ ha->instance);) - - qla2x00_cfg_init(ha); - } -@@ -2526,12 +2302,12 @@ qla2x00_detect(Scsi_Host_Template *templ - /* Insert new entry into the list of adapters */ - ha->next = NULL; - -- if( qla2x00_hostlist == NULL ) { -+ if (qla2x00_hostlist == NULL) { - qla2x00_hostlist = ha; - } else { - cur_ha = qla2x00_hostlist; - -- while( cur_ha->next != NULL ) -+ while (cur_ha->next != NULL) - cur_ha = cur_ha->next; - - cur_ha->next = ha; -@@ -2543,17 +2319,15 @@ qla2x00_detect(Scsi_Host_Template *templ - * devices to come on-line. We don't want Linux - * scanning before we are ready. - */ -- for (wait_switch = jiffies + -- (ha->loop_reset_delay * HZ); -- /* jiffies < wait_switch */ -- time_before(jiffies,wait_switch) && -- !(ha->device_flags & -- (DFLG_NO_CABLE | DFLG_FABRIC_DEVICES)) -- && (ha->device_flags & SWITCH_FOUND) ;) { -+ wait_switch = jiffies + (ha->loop_reset_delay * HZ); -+ for ( ; 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); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(5); - } - -@@ -2561,6 +2335,7 @@ qla2x00_detect(Scsi_Host_Template *templ - if (displayConfig && (!ha->flags.failover_enabled)) - qla2x00_display_fc_names(ha); - -+ printk(KERN_INFO"%s num_hosts=%d\n",__func__,num_hosts); - ha->init_done = 1; - num_hosts++; - } -@@ -2568,26 +2343,24 @@ qla2x00_detect(Scsi_Host_Template *templ - - /* Decrement the usage count of module: qla2[23]00_conf */ - #if defined(ISP2200) -- if(ql2x_extopts) -+ if (ql2x_extopts) - inter_module_put("qla22XX_conf"); - #endif - #if defined(ISP2300) -- if(ql2x_extopts) -+ if (ql2x_extopts) - inter_module_put("qla23XX_conf"); - #endif - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+ if (ql2xfailover) { -+ /* remap any paths on other hbas */ -+ qla2x00_cfg_remap(qla2x00_hostlist); -+ if (displayConfig) -+ qla2x00_cfg_display_devices(displayConfig == 2); -+ } -+ -+bailout: - spin_lock_irq(&io_request_lock); --#endif - -- if (displayConfig && ha->flags.failover_enabled) -- qla2x00_cfg_display_devices(); --#ifdef __VMWARE__ -- /* We do not hold the io_request lock when calling init and we -- * should not hold it when returning. -- */ -- spin_unlock_irq(&io_request_lock); --#endif - LEAVE("qla2x00_detect"); - - return num_hosts; -@@ -2615,16 +2388,8 @@ qla2x00_register_with_Linux(scsi_qla_hos - - host->can_queue = max_srbs; /* default value:-MAX_SRBS(4096) */ - host->cmd_per_lun = 1; --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - host->select_queue_depths = qla2x00_select_queue_depth; --#endif --#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; -- - host->base = 0; - #if MEMORY_MAPPED_IO - host->base = (unsigned long)ha->mmio_address; -@@ -2642,31 +2407,12 @@ qla2x00_register_with_Linux(scsi_qla_hos - /* 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 IRQ with Linux (sharable) */ - if (request_irq(host->irq, qla2x00_intr_handler, -- SA_INTERRUPT|SA_SHIRQ, DRIVER_NAME, ha)) { -+ SA_INTERRUPT|SA_SHIRQ, DRIVER_NAME, ha)) { - printk(KERN_WARNING -- "qla2x00 : Failed to reserve interrupt %d " -- "already in use\n", -- host->irq); -+ "qla2x00 : Failed to reserve interrupt %d already in use\n", -+ host->irq); - return 1; - } - -@@ -2690,7 +2436,7 @@ qla2x00_register_with_Linux(scsi_qla_hos - * Returns: - * 0 - Always returns good status - **************************************************************************/ --static int -+int - qla2x00_release(struct Scsi_Host *host) - { - scsi_qla_host_t *ha = (scsi_qla_host_t *) host->hostdata; -@@ -2715,20 +2461,6 @@ qla2x00_release(struct Scsi_Host *host) - - /* Kill the kernel thread for this host */ - if (ha->dpc_handler != NULL ) { --#ifdef __VMWARE__ -- extern int vmk_shutting_down(void); -- if (vmk_shutting_down()) { -- printk("qla: vmkernel shutting down\n"); -- } else { -- printk("qla: killing thread and waiting\n"); -- ha->should_die = 1; -- ha->notify_sema = (struct semaphore)__SEMAPHORE_INITIALIZER(ha->notify_sema, 0); -- ha->dpc_notify = &ha->notify_sema; -- up(&ha->wait_sema); -- down(ha->dpc_notify); -- printk("qla: back from killing thread\n"); -- } --#else - - #if defined(ISP2100) - ha->dpc_notify = &qla2100_detect_sem; -@@ -2752,35 +2484,13 @@ qla2x00_release(struct Scsi_Host *host) - down(&qla2300_detect_sem); - #endif - --#endif //__VMWARE__ - ha->dpc_notify = NULL; - } - --#if QLA2X_PERFORMANCE -- tasklet_kill(&ha->run_qla_task); --#endif -- --#if USE_FLASH_DATABASE -- /* Move driver database to flash, if enabled. */ -- if (ha->flags.enable_flash_db_update && -- ha->flags.updated_fc_db) { -- -- ha->flags.updated_fc_db = FALSE; -- qla2x00_save_database(ha); -- } --#endif -- - #if APIDEV - apidev_cleanup(); - #endif - --#ifdef __VMWARE__ -- spin_lock_destroy(&ha->hardware_lock); -- spin_lock_destroy(&ha->mbx_bits_lock); -- spin_lock_destroy(&ha->mbx_reg_lock); -- spin_lock_destroy(&ha->mbx_q_lock); -- spin_lock_destroy(&ha->list_lock); --#endif - qla2x00_mem_free(ha); - - if (ha->flags.failover_enabled) -@@ -2821,7 +2531,7 @@ qla2x00_release(struct Scsi_Host *host) - * Returns: - * Return a text string describing the driver. - **************************************************************************/ --static const char * -+const char * - qla2x00_info(struct Scsi_Host *host) - { - static char qla2x00_buffer[255]; -@@ -2884,7 +2594,8 @@ qla2x00_get_new_sp(scsi_qla_host_t *ha) - "ref_count not zero.\n"); - }) - -- sp_get(ha, sp); -+ atomic_set(&sp->ref_count, 1); -+ - } - - return (sp); -@@ -2925,12 +2636,12 @@ qla2x00_check_tgt_status(scsi_qla_host_t - if (TGT_Q(ha, t) == NULL || - l >= ha->max_luns || - (atomic_read(&fcport->state) == FC_DEVICE_DEAD) || -- ha->loop_state == LOOP_DEAD || -+ atomic_read(&fcport->ha->loop_state) == LOOP_DEAD || - (!atomic_read(&ha->loop_down_timer) && -- ha->loop_state == LOOP_DOWN)|| -+ atomic_read(&ha->loop_state) == LOOP_DOWN)|| - (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || - ABORTS_ACTIVE || -- ha->loop_state != LOOP_READY) { -+ atomic_read(&ha->loop_state) != LOOP_READY) { - - DEBUG(printk(KERN_INFO - "scsi(%ld:%2d:%2d:%2d): %s connection is " -@@ -2968,17 +2679,17 @@ qla2x00_check_port_status(scsi_qla_host_ - } - - if (atomic_read(&fcport->state) == FC_DEVICE_DEAD || -- ha->loop_state == LOOP_DEAD) { -+ atomic_read(&fcport->ha->loop_state) == LOOP_DEAD) { - return (QL_STATUS_ERROR); - } - -- if ((atomic_read(&fcport->state) != FC_ONLINE) || -- (!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) { -+ if ((atomic_read(&fcport->state) != FC_ONLINE) || -+ (!atomic_read(&ha->loop_down_timer) && -+ atomic_read(&ha->loop_state) == LOOP_DOWN) || -+ (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || -+ test_bit(CFG_ACTIVE, &ha->cfg_flags) || -+ ABORTS_ACTIVE || -+ atomic_read(&ha->loop_state) != LOOP_READY) { - - DEBUG(printk(KERN_INFO - "%s(%ld): connection is down. fcport=%p.\n", -@@ -2992,6 +2703,20 @@ qla2x00_check_port_status(scsi_qla_host_ - } - - -+#if defined(SH_HAS_CAN_QUEUE_MASK) -+static void update_host_queue_mask(scsi_qla_host_t *ha) -+{ -+ unsigned long newmask; -+ if ((max_srbs - ha->srb_cnt) > (REQUEST_ENTRY_CNT/5)) -+ newmask = (1 << ha->last_irq_cpu); -+ else -+ newmask = ~0; -+ -+ if (ha->host->can_queue_mask != newmask) -+ ha->host->can_queue_mask = newmask; -+} -+#endif -+ - /************************************************************************** - * qla2x00_queuecommand - * -@@ -3011,7 +2736,7 @@ qla2x00_check_port_status(scsi_qla_host_ - * interrupt handler may call this routine as part of request-completion - * handling). - **************************************************************************/ --static int -+int - qla2x00_queuecommand(Scsi_Cmnd *cmd, void (*fn)(Scsi_Cmnd *)) - { - fc_port_t *fcport; -@@ -3027,14 +2752,15 @@ qla2x00_queuecommand(Scsi_Cmnd *cmd, voi - #else - u_long handle; - #endif -+ int pendingempty = 1; - - ENTER(__func__); - - host = cmd->host; - ha = (scsi_qla_host_t *) host->hostdata; -- -+ - cmd->scsi_done = fn; --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_unlock(&io_request_lock); - #else - spin_unlock(ha->host->host_lock); -@@ -3049,7 +2775,7 @@ qla2x00_queuecommand(Scsi_Cmnd *cmd, voi - "%s(): Couldn't allocate memory for sp - retried.\n", - __func__); - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -3066,6 +2792,7 @@ qla2x00_queuecommand(Scsi_Cmnd *cmd, voi - sp->fo_retry_cnt = 0; - sp->iocb_cnt = 0; - sp->qfull_retry_count = 0; -+ sp->err_id = 0; - - /* Generate LU queue on bus, target, LUN */ - b = SCSI_BUS_32(cmd); -@@ -3084,8 +2811,9 @@ qla2x00_queuecommand(Scsi_Cmnd *cmd, voi - qla2x00_add_timer_to_cmd(sp, (CMD_TIMEOUT(cmd)/HZ)); - - if (l >= ha->max_luns) { -+ sp->err_id = SRB_ERR_PORT; - CMD_RESULT(cmd) = DID_NO_CONNECT << 16; --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -3138,8 +2866,9 @@ qla2x00_queuecommand(Scsi_Cmnd *cmd, voi - DEBUG3(printk("scsi(%ld:%2d:%2d): port unavailable\n", - ha->host_no,t,l);) - -+ sp->err_id = SRB_ERR_PORT; - CMD_RESULT(cmd) = DID_NO_CONNECT << 16; --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -3150,10 +2879,12 @@ qla2x00_queuecommand(Scsi_Cmnd *cmd, voi - - /* Only modify the allowed count if the target is a *non* tape device */ - if ((fcport->flags & FC_TAPE_DEVICE) == 0) { -+ sp->flags &= ~SRB_TAPE; - if (cmd->allowed < ql2xretrycount) { - cmd->allowed = ql2xretrycount; - } -- } -+ } else -+ sp->flags |= SRB_TAPE; - - DEBUG5(printk("%s(): pid=%ld, opcode=%d, timeout= %d\n", - __func__, -@@ -3186,20 +2917,35 @@ qla2x00_queuecommand(Scsi_Cmnd *cmd, voi - * Either PORT_DOWN_TIMER OR LINK_DOWN_TIMER Expired. - */ - if (atomic_read(&fcport->state) == FC_DEVICE_DEAD || -- ha->loop_state == LOOP_DEAD ) { -+ atomic_read(&fcport->ha->loop_state) == LOOP_DEAD) { - /* - * Add the command to the done-queue for later failover -- * processing -+ * processing. - */ -+ if (atomic_read(&ha->loop_state) == LOOP_DOWN) -+ sp->err_id = SRB_ERR_LOOP; -+ else -+ sp->err_id = SRB_ERR_PORT; - CMD_RESULT(cmd) = DID_NO_CONNECT << 16; - add_to_done_queue(ha, sp); --#if QLA2X_PERFORMANCE -- tasklet_schedule(&ha->run_qla_task); --#else - qla2x00_done(ha); -+#if !defined(SH_HAS_HOST_LOCK) -+ spin_lock_irq(&io_request_lock); -+#else -+ spin_lock_irq(ha->host->host_lock); - #endif -+ return (0); -+ } - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+ /* ignore SPINUP commands for MSA1000 */ -+ if ((fcport->flags & (FC_MSA_DEVICE|FC_EVA_DEVICE)) && -+ cmd->cmnd[0] == START_STOP) { -+ CMD_RESULT(cmd) = DID_OK << 16; -+ DEBUG2(printk(KERN_INFO -+ "%s(): Ignoring SPIN_STOP scsi command...\n ", __func__)); -+ add_to_done_queue(ha, sp); -+ qla2x00_done(ha); -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -3208,21 +2954,46 @@ qla2x00_queuecommand(Scsi_Cmnd *cmd, voi - } - - /* if target suspended put incoming in retry_q */ -- if( tq && test_bit(TGT_SUSPENDED, &tq->q_flags) ) { -+ if (tq && test_bit(TGT_SUSPENDED, &tq->q_flags) && -+ (sp->flags & SRB_TAPE) == 0) { - qla2x00_extend_timeout(sp->cmd, ha->qfull_retry_delay << 2); - add_to_scsi_retry_queue(ha,sp); - } else -- add_to_pending_queue(ha, sp); -- -- /* First start cmds for this lun if possible */ -- qla2x00_next(ha); -- --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+ pendingempty = add_to_pending_queue(ha, sp); -+ -+#if defined(ISP2100) || defined(ISP2200) -+ if (ha->flags.online) { -+ unsigned long flags; -+ -+ if (ha->response_ring_ptr->signature != RESPONSE_PROCESSED) { -+ spin_lock_irqsave(&ha->hardware_lock, flags); -+ qla2x00_process_response_queue(ha); -+ spin_unlock_irqrestore(&ha->hardware_lock, flags); -+ } -+ } -+#endif -+ -+ /* we submit to the hardware if -+ * 1) we're on the cpu the irq's arrive on or -+ * 2) there are very few io's outstanding. -+ * in all other cases we'll let an irq pick up our IO and submit it -+ * to the controller to improve affinity -+ */ -+ if (smp_processor_id() == ha->last_irq_cpu || /* condition 1 */ -+ (((max_srbs - ha->srb_cnt) < REQUEST_ENTRY_CNT/10) && /* less than 10% outstanding io's */ -+ (pendingempty))) -+ qla2x00_next(ha); -+ -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); - #endif - -+#if defined(SH_HAS_CAN_QUEUE_MASK) -+ update_host_queue_mask(ha); -+#endif -+ - LEAVE(__func__); - return (0); - } -@@ -3284,16 +3055,16 @@ qla2x00_eh_wait_on_command(scsi_qla_host - break; - } - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_unlock_irq(&io_request_lock); - #else - spin_unlock_irq(ha->host->host_lock); - #endif - -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(2*HZ); - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -3336,22 +3107,25 @@ static inline int - qla2x00_wait_for_hba_online(scsi_qla_host_t *ha) - { - int return_status ; -+ unsigned long wait_online = 0; - - ENTER(__func__); - -- while((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) || -+ for (wait_online = jiffies + (MAX_LOOP_TIMEOUT *HZ); -+ ((test_bit(ISP_ABORT_NEEDED, &ha->dpc_flags)) || - test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || -- test_bit(ISP_ABORT_RETRY, &ha->dpc_flags)){ -+ test_bit(ISP_ABORT_RETRY, &ha->dpc_flags))&& -+ time_before(jiffies,wait_online) ; ){ - -- set_current_state(TASK_INTERRUPTIBLE); -- schedule_timeout(3 * HZ); -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ schedule_timeout(HZ); - } - if(ha->flags.online == TRUE ) - return_status = QL_STATUS_SUCCESS; - else - return_status = QL_STATUS_ERROR;/*Adapter is disabled/offline */ - -- DEBUG2(printk(KERN_INFO "%s return_status=%d\n",__func__,return_status);) -+ DEBUG(printk(KERN_INFO "%s return_status=%d\n",__func__,return_status);) - LEAVE(__func__); - - return(return_status); -@@ -3383,19 +3157,19 @@ qla2x00_wait_for_loop_ready(scsi_qla_hos - loop_timeout = jiffies + (MAX_LOOP_TIMEOUT * HZ ); - - while (((test_bit(LOOP_RESET_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)) { -+ (!atomic_read(&ha->loop_down_timer) && -+ atomic_read(&ha->loop_state) == LOOP_DOWN) || -+ test_bit(CFG_ACTIVE, &ha->cfg_flags) || -+ atomic_read(&ha->loop_state) != LOOP_READY)) { - -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(3 * HZ); - if (time_after_eq(jiffies, loop_timeout)) { - return_status = QL_STATUS_ERROR; - break; - } - } -- DEBUG2(printk(KERN_INFO "%s :return_status=%d\n",__func__,return_status);) -+ DEBUG(printk(KERN_INFO "%s :return_status=%d\n",__func__,return_status);) - LEAVE(__func__); - return return_status; - } -@@ -3414,7 +3188,7 @@ qla2x00_wait_for_loop_ready(scsi_qla_hos - * - * Note: - **************************************************************************/ --static int -+int - qla2xxx_eh_abort(Scsi_Cmnd *cmd) - { - int i; -@@ -3503,15 +3277,15 @@ qla2xxx_eh_abort(Scsi_Cmnd *cmd) - DEBUG2(qla2x00_print_scsi_cmd(cmd)); - DEBUG2(qla2x00_print_q_info(q);) - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_unlock_irq(&io_request_lock); -+#if !defined(SH_HAS_HOST_LOCK) -+ spin_unlock_irq(&io_request_lock); - #else -- spin_unlock_irq(ha->host->host_lock); -+ spin_unlock_irq(ha->host->host_lock); - #endif - /* Blocking call-Does context switching if abort isp is active etc */ - if( qla2x00_wait_for_hba_online(ha) != QL_STATUS_SUCCESS){ - DEBUG2(printk(KERN_INFO "%s failed:board disabled\n",__func__);) --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -3519,10 +3293,10 @@ qla2xxx_eh_abort(Scsi_Cmnd *cmd) - return(FAILED); - } - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_lock_irq(&io_request_lock); -+#if !defined(SH_HAS_HOST_LOCK) -+ spin_lock_irq(&io_request_lock); - #else -- spin_lock_irq(ha->host->host_lock); -+ spin_lock_irq(ha->host->host_lock); - #endif - - /* Search done queue */ -@@ -3694,7 +3468,7 @@ qla2xxx_eh_abort(Scsi_Cmnd *cmd) - sp_get(ha,sp); - - spin_unlock_irqrestore(&ha->hardware_lock, flags); --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_unlock(&io_request_lock); - #else - spin_unlock(ha->host->host_lock); -@@ -3712,7 +3486,7 @@ qla2xxx_eh_abort(Scsi_Cmnd *cmd) - } - - sp_put(ha,sp); --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -3820,77 +3594,63 @@ qla2x00_eh_wait_for_pending_target_comma - * SUCCESS/FAILURE (defined as macro in scsi.h). - * - **************************************************************************/ --static int -+int - qla2xxx_eh_device_reset(Scsi_Cmnd *cmd) - { -- int return_status = SUCCESS; -+ int return_status; - uint32_t b, t, l; -- srb_t *sp; - scsi_qla_host_t *ha; -+ os_tgt_t *tq; - os_lun_t *lq; -+ fc_port_t *fcport_to_reset; -+ srb_t *rp; -+ unsigned long flags; -+ struct list_head *list, *temp; - --#if defined(LOGOUT_AFTER_DEVICE_RESET) -- fc_port_t *fcport; --#endif -- -- ENTER(__func__); - -+ return_status = FAILED; - if (cmd == NULL) { - printk(KERN_INFO - "%s(): **** SCSI mid-layer passing in NULL cmd\n", - __func__); - -- return (FAILED); -- } -- 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 */ -- printk(KERN_INFO "%s: cmd already done sp=%p\n", __func__, sp); -- DEBUG(printk("%s: cmd already done sp=%p\n", __func__, sp);) -- -- return (SUCCESS); -- } -- if (sp) { -- DEBUG(printk("%s: refcount %i\n", __func__, -- atomic_read(&sp->ref_count));) -+ return (return_status); - } - -- /* Verify the device exists. */ -- ha = (scsi_qla_host_t *)cmd->host->hostdata; -- if (ha->flags.failover_enabled) -- ha = (scsi_qla_host_t *)sp->ha; -- else -- ha = (scsi_qla_host_t *)cmd->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) { -+ ha = (scsi_qla_host_t *)cmd->host->hostdata; -+ -+ tq = TGT_Q(ha, t); -+ if (tq == NULL) { - printk(KERN_INFO - "%s(): **** CMD derives a NULL TGT_Q\n", - __func__); - -- return (FAILED); -+ return (return_status); - } - lq = (os_lun_t *)LUN_Q(ha, t, l); - if (lq == NULL) { - printk(KERN_INFO - "%s(): **** CMD derives a NULL LUN_Q\n", __func__); - -- return (FAILED); -+ return (return_status); - } -+ fcport_to_reset = lq->fclun->fcport; -+ -+ /* -+ * If we are coming in from the back-door, stall I/O until -+ * completion -+ */ -+ if (!cmd->host->eh_active) { -+ set_bit(TGT_SUSPENDED, &tq->q_flags); -+ } -+ -+ ha->eh_start = 0; - - #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 - -@@ -3899,21 +3659,33 @@ qla2xxx_eh_device_reset(Scsi_Cmnd *cmd) - "scsi(%ld:%d:%d:%d): DEVICE RESET ISSUED.\n", - ha->host_no, (int)b, (int)t, (int)l); - -- DEBUG2(printk(KERN_INFO "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); -+ DEBUG2(printk(KERN_INFO -+ "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);) -+ -+ /* -+ * Clear commands from the retry queue -+ */ -+ spin_lock_irqsave(&ha->list_lock, flags); -+ list_for_each_safe(list, temp, &ha->retry_queue) { -+ rp = list_entry(list, srb_t, list); -+ -+ if( t != SCSI_TCN_32(rp->cmd) ) -+ continue; -+ -+ DEBUG2(printk(KERN_INFO "qla2xxx_eh_reset: found " -+ "in retry queue. SP=%p\n", rp);) -+ -+ __del_from_retry_queue(ha, rp); -+ CMD_RESULT(rp->cmd) = DID_RESET << 16; -+ __add_to_done_queue(ha, rp); -+ -+ } /* list_for_each_safe() */ -+ spin_unlock_irqrestore(&ha->list_lock, flags); - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_unlock_irq(&io_request_lock); - #else - spin_unlock_irq(ha->host->host_lock); -@@ -3921,66 +3693,79 @@ qla2xxx_eh_device_reset(Scsi_Cmnd *cmd) - /* Blocking call-Does context switching if abort isp is active etc */ - if (qla2x00_wait_for_hba_online(ha) != QL_STATUS_SUCCESS) { - DEBUG2(printk(KERN_INFO "%s failed:board disabled\n",__func__);) --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); - #endif -- return (FAILED); -+ goto eh_dev_reset_done; - } - - /* Blocking call-Does context switching if loop is Not Ready */ - if (qla2x00_wait_for_loop_ready(ha) == QL_STATUS_SUCCESS) { - clear_bit(DEVICE_RESET_NEEDED, &ha->dpc_flags); - -- if (qla2x00_device_reset(ha, lq->fclun->fcport) != 0) { -- return_status = FAILED; -+ if (qla2x00_device_reset(ha, fcport_to_reset) == 0) { -+ return_status = SUCCESS; - } - - #if defined(LOGOUT_AFTER_DEVICE_RESET) - if (return_status == SUCCESS) { -- fcport = lq->fclun->fcport; -- -- if (fcport->flags & FC_FABRIC_DEVICE) { -+ if (fcport_to_reset->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); -+ fcport_to_reset->loop_id); -+ qla2x00_mark_device_lost(ha, fcport_to_reset, -+ 1); - } - } - #endif - } else { -- return_status = FAILED; -+ DEBUG2(printk(KERN_INFO -+ "%s failed: loop not ready\n",__func__);) - } - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); - #endif - - if (return_status == FAILED) { -- DEBUG3(printk("%s(%ld): reset failed\n", -- __func__,ha->host_no);) -- printk(KERN_INFO "%s(%ld): reset failed\n", -- __func__,ha->host_no); -- return (FAILED); -+ DEBUG3(printk("%s(%ld): device reset failed\n", -+ __func__,ha->host_no);) -+ printk(KERN_INFO "%s(%ld): device reset failed\n", -+ __func__,ha->host_no); -+ -+ goto eh_dev_reset_done; - } - -- /* Waiting for all commands to complete for the device */ -- if (qla2x00_eh_wait_for_pending_target_commands(ha, t)) -- return_status = FAILED; -+ /* -+ * If we are coming down the EH path, wait for all commands to -+ * complete for the device. -+ */ -+ if (cmd->host->eh_active) { -+ if (qla2x00_eh_wait_for_pending_target_commands(ha, t)) -+ return_status = FAILED; - -- if (return_status == FAILED) { -- DEBUG3(printk("%s(%ld): reset failed\n", -- __func__,ha->host_no);) -- printk(KERN_INFO "%s(%ld): reset failed\n", -- __func__,ha->host_no); -- return (FAILED); -+ if (return_status == FAILED) { -+ DEBUG3(printk("%s(%ld): failed while waiting for " -+ "commands\n", __func__, ha->host_no);) -+ printk(KERN_INFO "%s(%ld): failed while waiting for " -+ "commands\n", __func__, ha->host_no); -+ -+ goto eh_dev_reset_done; -+ } - } -- printk(KERN_INFO "%s(%ld):reset success\n", __func__,ha->host_no); - -- LEAVE(__func__); -+ printk(KERN_INFO -+ "scsi(%ld:%d:%d:%d): DEVICE RESET SUCCEEDED.\n", -+ ha->host_no, (int)b, (int)t, (int)l); -+ -+eh_dev_reset_done: -+ -+ if (!cmd->host->eh_active) { -+ clear_bit(TGT_SUSPENDED, &tq->q_flags); -+ } - - return (return_status); - } -@@ -4047,7 +3832,7 @@ qla2x00_eh_wait_for_pending_commands(scs - * SUCCESS/FAILURE (defined as macro in scsi.h). - * - **************************************************************************/ --static int -+int - qla2xxx_eh_bus_reset(Scsi_Cmnd *cmd) - { - int return_status = SUCCESS; -@@ -4105,15 +3890,15 @@ qla2xxx_eh_bus_reset(Scsi_Cmnd *cmd) - "scsi(%ld:%d:%d:%d): LOOP RESET ISSUED.\n", - ha->host_no, (int)b, (int)t, (int)l); - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_unlock_irq(&io_request_lock); -+#if !defined(SH_HAS_HOST_LOCK) -+ spin_unlock_irq(&io_request_lock); - #else -- spin_unlock_irq(ha->host->host_lock); -+ spin_unlock_irq(ha->host->host_lock); - #endif - /* Blocking call-Does context switching if abort isp is active etc*/ - if( qla2x00_wait_for_hba_online(ha) != QL_STATUS_SUCCESS){ - DEBUG2(printk(KERN_INFO "%s failed:board disabled\n",__func__);) --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -4130,7 +3915,7 @@ qla2xxx_eh_bus_reset(Scsi_Cmnd *cmd) - } else { - return_status = FAILED; - } --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -4184,7 +3969,7 @@ qla2xxx_eh_bus_reset(Scsi_Cmnd *cmd) - * - * Note: - **************************************************************************/ --static int -+int - qla2xxx_eh_host_reset(Scsi_Cmnd *cmd) - { - int return_status = SUCCESS; -@@ -4264,14 +4049,14 @@ qla2xxx_eh_host_reset(Scsi_Cmnd *cmd) - ((scsi_qla_host_t *)cmd->host->hostdata)->host_no, - (int)b, (int)t, (int)l, ha->host_no);) - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -- spin_unlock_irq(&io_request_lock); -+#if !defined(SH_HAS_HOST_LOCK) -+ spin_unlock_irq(&io_request_lock); - #else -- spin_unlock_irq(ha->host->host_lock); -+ spin_unlock_irq(ha->host->host_lock); - #endif - /* Blocking call-Does context switching if abort isp is active etc*/ - if( qla2x00_wait_for_hba_online(ha) != QL_STATUS_SUCCESS){ --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -4306,7 +4091,7 @@ qla2xxx_eh_host_reset(Scsi_Cmnd *cmd) - - clear_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags); - } --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) -+#if !defined(SH_HAS_HOST_LOCK) - spin_lock_irq(&io_request_lock); - #else - spin_lock_irq(ha->host->host_lock); -@@ -4349,11 +4134,26 @@ qla2xxx_eh_host_reset(Scsi_Cmnd *cmd) - * Description: - * Return the disk geometry for the given SCSI device. - **************************************************************************/ --static int -+int - qla2x00_biosparam(Disk *disk, kdev_t dev, int geom[]) - { - int heads, sectors, cylinders; -+ int ret; -+ struct buffer_head *bh; - -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,17) -+ bh = bread(MKDEV(MAJOR(dev), MINOR(dev) & ~0xf), 0, block_size(dev)); -+#else -+ bh = bread(MKDEV(MAJOR(dev), MINOR(dev) & ~0xf), 0, 1024); -+#endif -+ -+ if (bh) { -+ ret = scsi_partsize(bh, disk->capacity, -+ &geom[2], &geom[0], &geom[1]); -+ brelse(bh); -+ if (ret != -1) -+ return (ret); -+ } - heads = 64; - sectors = 32; - cylinders = disk->capacity / (heads * sectors); -@@ -4378,7 +4178,7 @@ qla2x00_biosparam(Disk *disk, kdev_t dev - * - * Context: Interrupt - **************************************************************************/ --static void -+void - qla2x00_intr_handler(int irq, void *dev_id, struct pt_regs *regs) - { - unsigned long flags = 0; -@@ -4398,8 +4198,6 @@ qla2x00_intr_handler(int irq, void *dev_ - - return; - } -- qla2x00_stats.irqhba = ha; -- - reg = ha->iobase; - - spin_lock_irqsave(&ha->hardware_lock, flags); -@@ -4416,6 +4214,8 @@ qla2x00_intr_handler(int irq, void *dev_ - qla2x00_isr(ha, data, &got_mbx); - } - spin_unlock_irqrestore(&ha->hardware_lock, flags); -+ qla2x00_next(ha); -+ ha->last_irq_cpu = smp_processor_id(); - - if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags) && - got_mbx && ha->flags.mbox_int) { -@@ -4449,11 +4249,7 @@ qla2x00_intr_handler(int irq, void *dev_ - } - - if (!list_empty(&ha->done_queue)) --#if QLA2X_PERFORMANCE -- tasklet_schedule(&ha->run_qla_task); --#else - qla2x00_done(ha); --#endif - - /* Wakeup the DPC routine */ - if ((!ha->flags.mbox_busy && -@@ -4465,39 +4261,12 @@ qla2x00_intr_handler(int irq, void *dev_ - up(ha->dpc_wait); - } - -- LEAVE_INTR("qla2x00_intr_handler"); --} -- -- --#if QLA2X_PERFORMANCE --/* -- * qla2x00_done_tasklet -- * -- * This is a task to process completion only similar to a -- * bottom half handler. -- * -- * Input: -- * p -- pointer to hba struct -- * -- */ --static void --qla2x00_done_tasklet(long 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__); --} -+#if defined(SH_HAS_CAN_QUEUE_MASK) -+ update_host_queue_mask(ha); - #endif - -+ LEAVE_INTR("qla2x00_intr_handler"); -+} - - /* - * qla2x00_retry_command -@@ -4519,6 +4288,7 @@ qla2x00_retry_command(scsi_qla_host_t *h - /* restore original timeout */ - qla2x00_extend_timeout(sp->cmd, - (CMD_TIMEOUT(sp->cmd)/HZ) - QLA_CMD_TIMER_DELTA); -+ qla2x00_free_request_resources(ha,sp); - __add_to_pending_queue( ha, sp); - } - -@@ -4535,14 +4305,11 @@ qla2x00_retry_command(scsi_qla_host_t *h - * the timer routine detects a event it will one of the task - * bits then wake us up. - **************************************************************************/ --static void -+void - qla2x00_do_dpc(void *p) - { --#ifndef __VMWARE__ - DECLARE_MUTEX_LOCKED(sem); --#endif -- fcdev_t dev; -- fc_port_t *fcport; -+ fc_port_t *fcport = NULL; - os_lun_t *q; - os_tgt_t *tq; - scsi_qla_host_t *ha = (scsi_qla_host_t *) p; -@@ -4553,19 +4320,10 @@ qla2x00_do_dpc(void *p) - struct list_head *list, *templist; - int dead_cnt, online_cnt; - int retry_cmds; -+ uint16_t next_loopid; - - ENTER(__func__); - --#ifdef __VMWARE__ -- /* -- * We are not a real Linux thread so no need to handle all the -- * task setup. -- */ -- printk("qla: DPC init\n"); -- ha->wait_sema = (struct semaphore)__SEMAPHORE_INITIALIZER(ha->wait_sema, 0); -- ha->dpc_wait = &ha->wait_sema; -- ha->dpc_handler = (struct task_struct *)1; --#else - #if defined(MODULE) - siginitsetinv(¤t->blocked, SHUTDOWN_SIGS); - #else -@@ -4581,8 +4339,6 @@ qla2x00_do_dpc(void *p) - * FIXME(dg) this is still a child process of the one that did - * the insmod. This needs to be attached to task[0] instead. - */ -- --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,9) - /* As mentioned in kernel/sched.c(RA)..... - * Reparent the calling kernel thread to the init task. -@@ -4600,7 +4356,6 @@ qla2x00_do_dpc(void *p) - */ - reparent_to_init(); - #endif --#endif - - /* - * Set the name of this process. -@@ -4611,7 +4366,6 @@ qla2x00_do_dpc(void *p) - ha->dpc_handler = current; - - unlock_kernel(); --#endif //__VMWARE__ - - /* - * Wake up the thread that created us. -@@ -4630,24 +4384,13 @@ qla2x00_do_dpc(void *p) - */ - DEBUG3(printk("qla2x00: DPC handler sleeping\n");) - --#ifdef __VMWARE__ -- down_interruptible(ha->dpc_wait); -- -- if (ha->should_die) -- break; /* get out */ --#else - down_interruptible(&sem); - - if (signal_pending(current)) - break; /* get out */ --#endif //__VMWARE__ - - if (!list_empty(&ha->done_queue)) --#if QLA2X_PERFORMANCE -- tasklet_schedule(&ha->run_qla_task); --#else - qla2x00_done(ha); --#endif - - DEBUG3(printk("qla2x00: DPC handler waking up\n");) - -@@ -4664,7 +4407,7 @@ qla2x00_do_dpc(void *p) - - /* Process commands in retry queue */ - if (test_and_clear_bit(PORT_RESTART_NEEDED, &ha->dpc_flags)) { -- DEBUG2(printk(KERN_INFO "%s(%ld): (1) DPC checking retry_q. " -+ DEBUG3(printk(KERN_INFO "%s(%ld): (1) DPC checking retry_q. " - "total=%d\n", - __func__, - ha->host_no, -@@ -4687,13 +4430,19 @@ qla2x00_do_dpc(void *p) - continue; - fcport = q->fclun->fcport; - -- if (atomic_read(&fcport->state) == -- FC_DEVICE_DEAD || -- ( ha->loop_state == LOOP_DEAD )){ -+ if (atomic_read(&fcport->state) == -+ FC_DEVICE_DEAD || -+ atomic_read(&fcport->ha->loop_state) -+ == LOOP_DEAD) { - - __del_from_retry_queue(ha, sp); - CMD_RESULT(sp->cmd) = - DID_NO_CONNECT << 16; -+ if (atomic_read(&ha->loop_state) == -+ LOOP_DOWN) -+ sp->err_id = SRB_ERR_LOOP; -+ else -+ sp->err_id = SRB_ERR_PORT; - CMD_HANDLE(sp->cmd) = - (unsigned char *) NULL; - __add_to_done_queue(ha, sp); -@@ -4767,7 +4516,7 @@ qla2x00_do_dpc(void *p) - q->q_state, tq->q_flags);) - online_cnt++; - __del_from_scsi_retry_queue(ha, sp); -- if( test_bit(TGT_UNSUSPENDED, -+ if( test_bit(TGT_RETRY_CMDS, - &tq->q_flags) ) { - qla2x00_retry_command(ha,sp); - retry_cmds++; -@@ -4782,8 +4531,8 @@ qla2x00_do_dpc(void *p) - if ((tq = ha->otgt[t]) == NULL) - continue; - -- if( test_bit(TGT_UNSUSPENDED, &tq->q_flags) ) -- clear_bit(TGT_UNSUSPENDED, &tq->q_flags); -+ if( test_bit(TGT_RETRY_CMDS, &tq->q_flags) ) -+ clear_bit(TGT_RETRY_CMDS, &tq->q_flags); - } - - if( retry_cmds ) -@@ -4859,17 +4608,18 @@ qla2x00_do_dpc(void *p) - - /* v2.19.8 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) { /* v2.19.5 */ -+ &ha->dpc_flags)) && -+ !test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags) && -+ atomic_read(&ha->loop_state) != LOOP_DOWN) { - - DEBUG(printk("dpc%ld: qla2x00_port_login\n", - ha->host_no);) - -- for (fcport = ha->fcport; -- fcport != NULL; -- fcport = fcport->next) { -- -+ next_loopid = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if(fcport->port_type != FCT_TARGET) -+ continue; -+ - /* - * If the port is not ONLINE then try - * to login to it if we haven't run -@@ -4877,37 +4627,28 @@ qla2x00_do_dpc(void *p) - */ - 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); -+ if (fcport->flags & FC_FABRIC_DEVICE) -+ status = qla2x00_fabric_login(ha, fcport, &next_loopid); - else -- status = qla2x00_local_device_login(ha, (dev.loop_id & 0xff)); -+ status = qla2x00_local_device_login(ha, fcport->loop_id); - - 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; -+ fcport->old_loop_id = fcport->loop_id; - - DEBUG(printk("dpc%ld port login OK: logged in ID 0x%x\n", - ha->host_no, fcport->loop_id);) -+ printk(KERN_INFO "dpc%ld port login OK: logged in ID 0x%x\n", -+ ha->host_no, fcport->loop_id); - -+ fcport->login_retry = 0; - 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("dpc: Retrying %d login again loop_id 0x%x\n", -@@ -4925,7 +4666,7 @@ qla2x00_do_dpc(void *p) - - /* v2.19.5 */ - if ((test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags)) && -- ha->loop_state != LOOP_DOWN ) { /* v2.19.5 */ -+ atomic_read(&ha->loop_state) != LOOP_DOWN) { /* v2.19.5 */ - - clear_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags); - DEBUG(printk("dpc(%ld): qla2x00_login_retry\n", -@@ -4957,15 +4698,30 @@ qla2x00_do_dpc(void *p) - ha->host_no);) - } - -- if (test_and_clear_bit(PORT_SCAN_NEEDED, &ha->dpc_flags)) { -+ if (test_and_clear_bit(PORT_SCAN_NEEDED, -+ &ha->dpc_flags)) { - - DEBUG(printk("dpc(%ld): qla2x00: RESCAN ...\n", -- ha->host_no);) -- printk(KERN_INFO"dpc(%ld): qla2x00: RESCAN .\n", -- ha->host_no); -- ha->loop_state = LOOP_UPDATE; -- qla2x00_mark_all_devices_lost(ha); -- qla2x00_configure_fcports( ha ); -+ ha->host_no);) -+ printk(KERN_INFO -+ "dpc(%ld): qla2x00: RESCAN .\n", -+ ha->host_no); -+ -+ if ( !(test_bit(LOGIN_RETRY_NEEDED, &ha->dpc_flags)) && -+ atomic_read(&ha->loop_state) != LOOP_DOWN) { -+ /* suspend new I/O for await */ -+ atomic_set(&ha->loop_state, LOOP_UPDATE); -+ qla2x00_probe_for_all_luns(ha); -+ -+ /* If we found all devices then go ready */ -+ atomic_set(&ha->loop_state, LOOP_READY); -+ -+ if (!ha->flags.failover_enabled) -+ qla2x00_config_os(ha); -+ else -+ qla2x00_cfg_remap(qla2x00_hostlist); -+ } -+ - DEBUG(printk("dpc(%ld): qla2x00: RESCAN ...done\n", - ha->host_no);) - printk(KERN_INFO"dpc(%ld): qla2x00: RESCAN" -@@ -4983,7 +4739,7 @@ qla2x00_do_dpc(void *p) - if (test_and_clear_bit(FAILOVER_EVENT, - &ha->dpc_flags)) { - -- DEBUG(printk("dpc(%ld): " -+ DEBUG2(printk("dpc(%ld): " - "qla2x00_cfg_event_notify\n", - ha->host_no);) - -@@ -4991,7 +4747,7 @@ qla2x00_do_dpc(void *p) - qla2x00_cfg_event_notify(ha, ha->failover_type); - } - -- DEBUG(printk("dpc(%ld): " -+ DEBUG2(printk("dpc(%ld): " - "qla2x00_cfg_event_notify - done\n", - ha->host_no);) - } -@@ -5003,12 +4759,12 @@ qla2x00_do_dpc(void *p) - /* - * Get any requests from failover queue - */ -- DEBUG(printk("dpc: qla2x00_process " -+ DEBUG2(printk("dpc: qla2x00_process " - "failover\n");) - - qla2x00_process_failover(ha); - -- DEBUG(printk("dpc: qla2x00_process " -+ DEBUG2(printk("dpc: qla2x00_process " - "failover - done\n");) - } - } -@@ -5029,16 +4785,19 @@ qla2x00_do_dpc(void *p) - - qla2x00_abort_queues(ha, FALSE); - } -- if (!ha->interrupts_on) -- qla2x00_enable_intrs(ha); -+ -+ if (test_and_clear_bit(IOCTL_ERROR_RECOVERY, -+ &ha->dpc_flags)) { -+ qla2x00_ioctl_error_recovery(ha); -+ } -+ -+ if (!ha->interrupts_on) -+ qla2x00_enable_intrs(ha); -+ - } - - if (!list_empty(&ha->done_queue)) --#if QLA2X_PERFORMANCE -- tasklet_schedule(&ha->run_qla_task); --#else - qla2x00_done(ha); --#endif - - /* spin_unlock_irqrestore(&io_request_lock, ha->cpu_flags);*/ - -@@ -5070,7 +4829,6 @@ qla2x00_do_dpc(void *p) - LEAVE(__func__); - } - --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - /************************************************************************** - * qla2x00_device_queue_depth - * Determines the queue depth for a given device. There are two ways -@@ -5080,7 +4838,7 @@ qla2x00_do_dpc(void *p) - * as the default queue depth. Otherwise, we use either 4 or 8 as the - * default queue depth (dependent on the number of hardware SCBs). - **************************************************************************/ --static void -+void - qla2x00_device_queue_depth(scsi_qla_host_t *p, Scsi_Device *device) - { - int default_depth = 32; -@@ -5089,10 +4847,9 @@ qla2x00_device_queue_depth(scsi_qla_host - if (device->tagged_supported) { - device->tagged_queue = 1; - device->current_tag = 0; --#if defined(MODULE) -- if (!(ql2xmaxqdepth == 0 || ql2xmaxqdepth > 256)) -+ -+ if (!(ql2xmaxqdepth == 0 || ql2xmaxqdepth > 255)) - device->queue_depth = ql2xmaxqdepth; --#endif - - printk(KERN_INFO - "scsi(%ld:%d:%d:%d): Enabled tagged queuing, " -@@ -5114,7 +4871,7 @@ qla2x00_device_queue_depth(scsi_qla_host - * host adapter. We use a queue depth of 2 for devices that do not - * support tagged queueing. - **************************************************************************/ --STATIC void -+static void - qla2x00_select_queue_depth(struct Scsi_Host *host, Scsi_Device *scsi_devs) - { - Scsi_Device *device; -@@ -5129,109 +4886,6 @@ qla2x00_select_queue_depth(struct Scsi_H - - LEAVE(__func__); - } --#endif -- --#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 */ - - /************************************************************************** - * ** Driver Support Routines ** -@@ -5269,6 +4923,38 @@ qla2x00_disable_intrs(scsi_qla_host_t *h - spin_unlock_irqrestore(&ha->hardware_lock, flags); - } - -+STATIC inline void -+qla2x00_free_request_resources(scsi_qla_host_t *dest_ha, srb_t *sp) -+{ -+ if (sp->flags & SRB_DMA_VALID) { -+ sp->flags &= ~SRB_DMA_VALID; -+ -+#ifndef __VMWARE__ -+ /* 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) { -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13) -+ pci_unmap_page(dest_ha->pdev, -+ sp->saved_dma_handle, -+ sp->cmd->request_bufflen, -+ scsi_to_pci_dma_dir( -+ sp->cmd->sc_data_direction)); -+#else -+ pci_unmap_single(dest_ha->pdev, -+ sp->saved_dma_handle, -+ sp->cmd->request_bufflen, -+ scsi_to_pci_dma_dir( -+ sp->cmd->sc_data_direction)); -+#endif -+ } -+#endif -+ } -+} - - STATIC inline void - qla2x00_delete_from_done_queue(scsi_qla_host_t *dest_ha, srb_t *sp) -@@ -5281,7 +4967,6 @@ qla2x00_delete_from_done_queue(scsi_qla_ - if (sp->flags & SRB_DMA_VALID) { - sp->flags &= ~SRB_DMA_VALID; - --#ifndef __VMWARE__ - /* Release memory used for this I/O */ - if (sp->cmd->use_sg) { - pci_unmap_sg(dest_ha->pdev, -@@ -5304,7 +4989,6 @@ qla2x00_delete_from_done_queue(scsi_qla_ - sp->cmd->sc_data_direction)); - #endif - } --#endif - } - } - -@@ -5321,7 +5005,6 @@ qla2x00_delete_from_done_queue(scsi_qla_ - STATIC int - qla2x00_done(scsi_qla_host_t *old_ha) - { -- srb_t *sp; - os_lun_t *lq; - Scsi_Cmnd *cmd; - unsigned long flags = 0; -@@ -5329,49 +5012,29 @@ qla2x00_done(scsi_qla_host_t *old_ha) - scsi_qla_host_t *vis_ha; - int cnt; - int send_marker_once = 0; -- srb_t *done_queue_first = NULL; -- srb_t *done_queue_last = NULL; -+ 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); -- while (!list_empty(&old_ha->done_queue)) { -- sp = list_entry(old_ha->done_queue.next, srb_t, list); -- /* remove command from done list */ -- list_del_init(&sp->list); -+ qla_list_splice_init(&old_ha->done_queue, &local_sp_list); -+ spin_unlock_irqrestore(&old_ha->list_lock, flags); - -+ list_for_each_safe(spl, sptemp, &local_sp_list) { -+ sp = list_entry(local_sp_list.next, srb_t, list); - old_ha->done_q_cnt--; -- sp->s_next = NULL; - sp->state = SRB_NO_QUEUE_STATE; -- /* insert in local queue */ -- if (done_queue_first == NULL) { -- done_queue_first = sp; -- done_queue_last = sp; -- } else { -- done_queue_last->s_next = sp; -- done_queue_last = sp; -- } -- } /* end of while list_empty(&ha->done_queue) */ -- spin_unlock_irqrestore(&old_ha->list_lock, flags); -- -- /* -- * All done commands are in local queue. Now do the call back -- */ -- while ((sp = done_queue_first) != NULL) { -- done_queue_first = sp->s_next; -- if (sp->s_next == NULL) -- done_queue_last = NULL; -- sp->s_next = NULL; -+ list_del_init(&sp->list); - - cnt++; - -@@ -5387,14 +5050,17 @@ qla2x00_done(scsi_qla_host_t *old_ha) - - vis_ha = (scsi_qla_host_t *)cmd->host->hostdata; - lq = sp->lun_queue; -+#if 0 - ha = lq->fclun->fcport->ha; -+#else -+ ha = sp->ha; -+#endif - - if (sp->flags & SRB_DMA_VALID) { - sp->flags &= ~SRB_DMA_VALID; - - /* 4.10 64 and 32 bit */ - /* Release memory used for this I/O */ --#ifndef __VMWARE__ - if (cmd->use_sg) { - pci_unmap_sg(ha->pdev, - cmd->request_buffer, -@@ -5416,17 +5082,17 @@ qla2x00_done(scsi_qla_host_t *old_ha) - cmd->sc_data_direction)); - #endif - } --#endif - } -- -- if (!(sp->flags & SRB_IOCTL) && -+ if (!(sp->flags & (SRB_IOCTL | SRB_TAPE | SRB_FDMI_CMD)) && - 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. -+ * failover on selection timeout(DID_NO_CONNECT) status. - */ -- if (qla2x00_fo_check(ha,sp)) { -+ if ( !(lq->fclun->fcport->flags & FC_FAILOVER_DISABLE) && -+ !(lq->fclun->flags & FC_VISIBLE_LUN) && -+ qla2x00_fo_check(ha,sp)) { - if ((sp->state != SRB_FAILOVER_STATE)) { - /* - * Retry the command on this path -@@ -5450,7 +5116,7 @@ qla2x00_done(scsi_qla_host_t *old_ha) - - case DID_OK: - case DID_ERROR: -- break; -+ break; - - case DID_RESET: - /* -@@ -5490,15 +5156,18 @@ qla2x00_done(scsi_qla_host_t *old_ha) - - default: - DEBUG(printk("scsi(%ld:%d:%d) %s: did_error " -- "= %d, pid=%ld, 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->serial_number, -- CMD_COMPL_STATUS(cmd), -- CMD_SCSI_STATUS(cmd));) -+ "= %d, pid=%ld, comp-scsi= 0x%x-0x%x " -+ "fcport_state=0x%x sp_flags=0%x.\n", -+ vis_ha->host_no, -+ SCSI_TCN_32(cmd), -+ SCSI_LUN_32(cmd), -+ __func__, -+ (CMD_RESULT(cmd)>>16), -+ cmd->serial_number, -+ CMD_COMPL_STATUS(cmd), -+ CMD_SCSI_STATUS(cmd), -+ atomic_read(&sp->fclun->fcport->state), -+ sp->flags);) - break; - } - -@@ -5507,10 +5176,11 @@ qla2x00_done(scsi_qla_host_t *old_ha) - */ - sp_put(ha, sp); - -- qla2x00_next(vis_ha); -+ if (vis_ha != old_ha) -+ qla2x00_next(vis_ha); - - } /* end of while */ -- clear_bit(DONE_RUNNING, &old_ha->dpc_flags); -+ qla2x00_next(old_ha); - - LEAVE(__func__); - -@@ -5935,24 +5605,32 @@ qla2x00_timer(scsi_qla_host_t *ha) - * down timer every second until it reaches zero. Once it reaches zero - * the port it marked DEAD. - */ -- for (t=0, fcport = ha->fcport; -- fcport != NULL; -- fcport = fcport->next, t++) { -+ t = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if(fcport->port_type != FCT_TARGET) -+ continue; - - 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) -+ if (atomic_dec_and_test(&fcport->port_down_timer) -+ != 0) { - atomic_set(&fcport->state, FC_DEVICE_DEAD); -+ DEBUG2(printk(" scsi(%ld): Port num %d marked DEAD" -+ " at portid=%02x%02x%02x.\n", -+ ha->host_no, t, fcport->d_id.b.domain, -+ fcport->d_id.b.area, fcport->d_id.b.al_pa); ) -+ } - -- DEBUG(printk("scsi(%ld): fcport-%d - port retry count " -+ DEBUG2(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 */ - - /* -@@ -5982,7 +5660,8 @@ qla2x00_timer(scsi_qla_host_t *ha) - "scsi%ld: Ending - target %d suspension.\n", - ha->host_no, t);) - clear_bit(TGT_SUSPENDED, &tq->q_flags); -- set_bit(TGT_UNSUSPENDED, &tq->q_flags); -+ /* retry the commands */ -+ set_bit(TGT_RETRY_CMDS, &tq->q_flags); - start_dpc++; - } - } -@@ -6039,8 +5718,15 @@ qla2x00_timer(scsi_qla_host_t *ha) - "before time expire\n", - ha->instance);) - #if !defined(ISP2100) -- if(ha->link_down_timeout) -- ha->loop_state = LOOP_DEAD; -+ if(ha->link_down_timeout) { -+ atomic_set(&ha->loop_state, LOOP_DEAD); -+ printk(KERN_INFO -+ "scsi(%ld): LOOP DEAD detected.\n", -+ ha->host_no); -+ DEBUG2(printk( -+ "scsi(%ld): LOOP DEAD detected.\n", -+ ha->host_no);) -+ } - #endif - set_bit(ABORT_QUEUES_NEEDED, &ha->dpc_flags); - start_dpc++; -@@ -6061,7 +5747,9 @@ qla2x00_timer(scsi_qla_host_t *ha) - ha->instance);) - } - } -- DEBUG3(printk("qla%ld: Loop Down - seconds remainning %d\n", -+ if (!(ha->device_flags & DFLG_NO_CABLE)) -+ DEBUG2(printk(KERN_INFO -+ "qla%ld: Loop Down - seconds remainning %d\n", - ha->instance, - atomic_read(&ha->loop_down_timer));) - } -@@ -6070,14 +5758,8 @@ qla2x00_timer(scsi_qla_host_t *ha) - * 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)) { --#if QLA2X_PERFORMANCE -- tasklet_schedule(&ha->run_qla_task); --#else -- start_dpc++; -- /* qla2x00_done(ha); */ --#endif -- } -+ if (!list_empty(&ha->done_queue)) -+ qla2x00_done(ha); - - #if QLA2100_LIPTEST - /* -@@ -6149,6 +5831,8 @@ qla2x00_timer(scsi_qla_host_t *ha) - test_bit(FAILOVER_EVENT, &ha->dpc_flags) || - test_bit(FAILOVER_NEEDED, &ha->dpc_flags) || - test_bit(PORT_SCAN_NEEDED, &ha->dpc_flags) || -+ test_bit(LOOP_RESET_NEEDED, &ha->dpc_flags) || -+ test_bit(IOCTL_ERROR_RECOVERY, &ha->dpc_flags) || - test_bit(MAILBOX_CMD_NEEDED, &ha->dpc_flags)) && - ha->dpc_wait && !ha->dpc_active ){ /* v2.19.4 */ - -@@ -6194,7 +5878,8 @@ qla2x00_callback(scsi_qla_host_t *ha, Sc - srb_t *sp = (srb_t *) CMD_SP(cmd); - scsi_qla_host_t *vis_ha; - os_lun_t *lq; -- int got_sense; -+ uint8_t is_fdmi_cmnd; -+ uint8_t got_sense; - unsigned long cpu_flags = 0; - - ENTER(__func__); -@@ -6223,12 +5908,33 @@ qla2x00_callback(scsi_qla_host_t *ha, Sc - sp->cmd = NULL; - CMD_SP(cmd) = NULL; - lq = sp->lun_queue; -+ is_fdmi_cmnd = (sp->flags & SRB_FDMI_CMD) ? 1 : 0; - got_sense = (sp->flags & SRB_GOT_SENSE)? 1: 0; -+#if REG_FDMI_ENABLED -+ if (is_fdmi_cmnd) { -+ DEBUG13(printk("%s(%ld): going to free fdmi srb tmpmem. " -+ "result=%d.\n", -+ __func__, vis_ha->host_no, CMD_RESULT(cmd)>>16);) -+ /* free some tmp buffers saved in sp */ -+ qla2x00_fdmi_srb_tmpmem_free(sp); -+ } -+#endif - add_to_free_queue(vis_ha, sp); - - if ((CMD_RESULT(cmd)>>16) == DID_OK) { - /* device ok */ -- ha->total_bytes += cmd->bufflen; -+ if (!is_fdmi_cmnd) { -+ /* keep IO stats for SCSI commands only. */ -+ ha->total_bytes += cmd->bufflen; -+ -+ if (cmd->bufflen) { -+ if (sp->dir & __constant_cpu_to_le16(CF_READ)) -+ ha->total_input_bytes += cmd->bufflen; -+ else -+ ha->total_output_bytes += cmd->bufflen; -+ } -+ } -+ - if (!got_sense) { - /* COMPAQ*/ - #if defined(COMPAQ) -@@ -6294,7 +6000,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) - */ - - if( retry != 10 ) -- printk(KERN_INFO -+ printk( KERN_INFO - "scsi(%ld): Memory Allocation retry %d \n", - ha->host_no, retry); - -@@ -6309,7 +6015,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) - "scsi(%ld): Memory Allocation failed - " - "risc_rec_q\n", - ha->host_no); -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ/10); - continue; - } -@@ -6325,7 +6031,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) - "scsi(%ld): Memory Allocation failed - " - "request_ring\n", - ha->host_no); -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ/10); - continue; - } -@@ -6341,7 +6047,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) - "response_ring\n", - ha->host_no); - qla2x00_mem_free(ha); -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ/10); - continue; - } -@@ -6357,7 +6063,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) - "init_cb\n", - ha->host_no); - qla2x00_mem_free(ha); -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ/10); - continue; - } -@@ -6371,7 +6077,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) - "ioctl_mem\n", - ha->host_no); - qla2x00_mem_free(ha); -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ/10); - continue; - } -@@ -6383,7 +6089,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) - "qla2x00_allocate_sp_pool\n", - ha->host_no); - qla2x00_mem_free(ha); -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ/10); - continue; - } -@@ -6400,7 +6106,7 @@ qla2x00_mem_alloc(scsi_qla_host_t *ha) - "mbx_cmd_q", - ha->host_no); - qla2x00_mem_free(ha); -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(HZ/10); - continue; - } -@@ -6447,13 +6153,11 @@ STATIC void - qla2x00_mem_free(scsi_qla_host_t *ha) - { - uint32_t t; -- fc_lun_t *fclun, *fclun_next; -- fc_port_t *fcport, *fcport_next; -+ fc_port_t *fcport, *fcptemp; -+ fc_lun_t *fclun, *fcltemp; - 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__); - -@@ -6490,15 +6194,6 @@ qla2x00_mem_free(scsi_qla_host_t *ha) - /* 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); - -@@ -6545,24 +6240,16 @@ qla2x00_mem_free(scsi_qla_host_t *ha) - ha->response_ring = NULL; - ha->response_dma = 0; - -- /* fc ports */ -- for (fcport = ha->fcport; -- fcport != NULL; -- fcport = fcport_next) { -- -- fcport_next = fcport->next; -- -- /* fc luns */ -- for (fclun = fcport->fclun; -- fclun != NULL; -- fclun = fclun_next) { -- -- fclun_next = fclun->next; -+ list_for_each_entry_safe(fcport, fcptemp, &ha->fcports, list) { -+ list_for_each_entry_safe(fclun, fcltemp, &fcport->fcluns, -+ list) { -+ list_del_init(&fclun->list); - kfree(fclun); - } -+ list_del_init(&fcport->list); - kfree(fcport); - } -- ha->fcport = NULL ; -+ INIT_LIST_HEAD(&ha->fcports); - - LEAVE(__func__); - } -@@ -6635,9 +6322,8 @@ qla2x00_initialize_adapter(scsi_qla_host - 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; -+ atomic_set(&ha->loop_state, LOOP_DOWN); - ha->device_flags = 0; - ha->sns_retry_cnt = 0; - ha->device_flags = 0; -@@ -6663,9 +6349,6 @@ qla2x00_initialize_adapter(scsi_qla_host - - qla2x00_reset_chip(ha); - -- /* Initialize Fibre Channel database. */ -- qla2x00_init_fc_db(ha); -- - /* Initialize target map database. */ - qla2x00_init_tgt_map(ha); - -@@ -6682,7 +6365,6 @@ qla2x00_initialize_adapter(scsi_qla_host - qla2x00_nvram_config(ha); - #endif - -- ha->retry_count = ql2xretrycount; - #if USE_PORTNAME - ha->flags.port_name_used =1; - #else -@@ -6706,7 +6388,7 @@ qla2x00_initialize_adapter(scsi_qla_host - qla2x00_get_properties(ha, ql2xdevconf); - } - -- retry = 10; -+ retry = QLA2XXX_LOOP_RETRY_COUNT; - /* - * Try configure the loop. - */ -@@ -6727,7 +6409,7 @@ qla2x00_initialize_adapter(scsi_qla_host - status = qla2x00_setup_chip(ha); - - if (!status) { -- DEBUG(printk("scsi(%ld): Chip verified " -+ DEBUG2(printk("scsi(%ld): Chip verified " - "and RISC loaded...\n", - ha->host_no)); - } -@@ -6742,7 +6424,7 @@ qla2x00_initialize_adapter(scsi_qla_host - * value OR a minimum of 4 seconds OR If no - * cable, only 5 seconds. - */ -- DEBUG(printk("qla2x00_init_rings OK, call " -+ DEBUG2(printk("qla2x00_init_rings OK, call " - "qla2x00_fw_ready...\n");) - - check_fw_ready_again: -@@ -6766,11 +6448,9 @@ check_fw_ready_again: - break; - } - -- /* if loop state changed while -- * we were discoverying devices -- * then wait for LIP to complete -- */ -- if( ha->loop_state == LOOP_DOWN && retry-- ) { -+ /* if loop state change while we were discoverying devices -+ then wait for LIP to complete */ -+ if (atomic_read(&ha->loop_state) == LOOP_DOWN && retry--) { - goto check_fw_ready_again; - } - -@@ -6783,7 +6463,7 @@ check_fw_ready_again: - !time_after_eq(jiffies,wait_device);) { - qla2x00_check_fabric_devices(ha); - -- set_current_state(TASK_INTERRUPTIBLE); -+ set_current_state(TASK_UNINTERRUPTIBLE); - schedule_timeout(5); - } - #endif -@@ -6940,6 +6620,7 @@ qla2x00_iospace_config(scsi_qla_host_t * - "scsi(%ld): cannot remap MMIO (%s), aborting\n", - ha->host_no, ha->pdev->slot_name); - -+ pci_release_regions(ha->pdev); - goto iospace_error_exit; - } - ha->iobase = (device_reg_t *) ha->mmio_address; -@@ -6978,38 +6659,28 @@ qla2x00_pci_config(scsi_qla_host_t *ha) - * 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, &buf_wd); - ha->revision = buf_wd; - -+#ifndef MEMORY_MAPPED_IO - if (ha->iobase) - return 0; -- -+#endif - do { /* Quick exit */ - /* Get command register. */ - pci_ret = pci_read_config_word(ha->pdev, PCI_COMMAND, &buf_wd); - if (pci_ret != PCIBIOS_SUCCESSFUL) - break; - -- /* -- * Set Bus Master Enable (bit-2), Memory Address Space Enable -- * and reset any error bits. -- */ -- buf_wd &= ~0x7; -- --#if MEMORY_MAPPED_IO -- DEBUG(printk("%s(): I/O SPACE and MEMORY MAPPED I/O is " -- "enabled.\n", -- __func__)); -- buf_wd |= (PCI_COMMAND_MASTER | -- PCI_COMMAND_MEMORY | -- PCI_COMMAND_IO); --#else -- DEBUG(printk("%s(): I/O SPACE Enabled and MEMORY MAPPED " -- "I/O is disabled.\n", -- __func__)); -- buf_wd |= (PCI_COMMAND_MASTER | PCI_COMMAND_IO); --#endif -+ /* PCI Specification Revision 2.3 changes */ -+ if (check_device_id(ha)) { -+ /* Command Register -+ * -- Reset Interrupt Disable -- BIT_10 -+ */ -+ buf_wd &= ~BIT_10; -+ } - - pci_ret = pci_write_config_word(ha->pdev, PCI_COMMAND, buf_wd); - if (pci_ret != PCIBIOS_SUCCESSFUL) -@@ -7103,7 +6774,7 @@ qla2x00_chip_diag(scsi_qla_host_t *ha) - uint8_t status = 0; - device_reg_t *reg = ha->iobase; - unsigned long flags = 0; --#if defined(ISP2300) -+#if defined(ISP2300) - uint16_t buf_wd; - #endif - uint16_t data; -@@ -7112,13 +6783,16 @@ qla2x00_chip_diag(scsi_qla_host_t *ha) - ENTER(__func__); - - DEBUG3(printk("%s(): testing device at %lx.\n", -- __func__, -- (u_long)®->flash_address);) -+ __func__, -+ (u_long)®->flash_address);) - - spin_lock_irqsave(&ha->hardware_lock, flags); - - /* Reset ISP chip. */ - WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); -+ CACHE_FLUSH(®->ctrl_status); -+ /* Delay after reset, for chip to recover. */ -+ udelay(20); - data = qla2x00_debounce_register(®->ctrl_status); - for (cnt = 6000000 ; cnt && (data & CSR_ISP_SOFT_RESET); cnt--) { - udelay(5); -@@ -7128,30 +6802,31 @@ qla2x00_chip_diag(scsi_qla_host_t *ha) - - if (cnt) { - DEBUG3(printk("%s(): reset register cleared by chip reset\n", -- __func__);) -+ __func__);) - --#if defined(ISP2300) -+#if defined(ISP2300) - pci_read_config_word(ha->pdev, PCI_COMMAND, &buf_wd); - buf_wd |= (PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); - data = RD_REG_WORD(®->mailbox6); -- -- if ((ha->device_id == QLA2312_DEVICE_ID) || -- ((data & 0xff) == FPM_2310)) -+ if (check_all_device_ids(ha)) - /* Enable Memory Write and Invalidate. */ - buf_wd |= PCI_COMMAND_INVALIDATE; - else - buf_wd &= ~PCI_COMMAND_INVALIDATE; -+ - pci_write_config_word(ha->pdev, PCI_COMMAND, buf_wd); - #endif - /* Reset RISC processor. */ - WRT_REG_WORD(®->host_cmd, HC_RESET_RISC); -+ CACHE_FLUSH(®->host_cmd); - WRT_REG_WORD(®->host_cmd, HC_RELEASE_RISC); -+ CACHE_FLUSH(®->host_cmd); - --#if defined(ISP2300) -+#if defined(ISP2300) - /* Workaround for QLA2312 PCI parity error */ -- if (ha->device_id == QLA2312_DEVICE_ID) -+ if (check_all_device_ids(ha)) { - udelay(10); -- else { -+ } else { - data = qla2x00_debounce_register(®->mailbox0); - - for (cnt = 6000000; cnt && (data == MBS_BUSY); cnt--) { -@@ -7173,7 +6848,7 @@ qla2x00_chip_diag(scsi_qla_host_t *ha) - if (cnt) { - /* Check product ID of chip */ - DEBUG3(printk("%s(): Checking product ID of chip\n", -- __func__);) -+ __func__);) - - if (RD_REG_WORD(®->mailbox1) != PROD_ID_1 || - (RD_REG_WORD(®->mailbox2) != PROD_ID_2 && -@@ -7197,26 +6872,26 @@ qla2x00_chip_diag(scsi_qla_host_t *ha) - ha->device_id = QLA2200A_DEVICE_ID; - - DEBUG3(printk("%s(): Found QLA2200A " -- "chip.\n", -- __func__);) -+ "chip.\n", -+ __func__);) - } - #endif - spin_unlock_irqrestore(&ha->hardware_lock, -- flags); -+ flags); - - DEBUG3(printk("%s(): Checking mailboxes.\n", -- __func__);) -+ __func__);) - - /* Wrap Incoming Mailboxes Test. */ - status = qla2x00_mbx_reg_test(ha); - if (status) { - printk(KERN_WARNING -- "%s(): failed mailbox send " -- "register test\n", -- __func__); -+ "%s(): failed mailbox send " -+ "register test\n", -+ __func__); - DEBUG(printk("%s(): Failed mailbox " -- "send register test\n", -- __func__);) -+ "send register test\n", -+ __func__);) - } - spin_lock_irqsave(&ha->hardware_lock, flags); - } -@@ -7225,8 +6900,10 @@ qla2x00_chip_diag(scsi_qla_host_t *ha) - } else - status = 1; - -- if (status) -+ if (status){ - DEBUG2_3(printk(KERN_INFO "%s(): **** FAILED ****\n", __func__);) -+ printk("%s(): **** FAILED ****\n", __func__); -+ } - - spin_unlock_irqrestore(&ha->hardware_lock, flags); - -@@ -7251,30 +6928,17 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) - { - uint8_t status = 0; - uint16_t cnt; -- uint16_t risc_address; - uint16_t *risc_code_address; -+ unsigned long risc_address; - unsigned long risc_code_size; - int num; --#if defined(WORD_FW_LOAD) -- uint16_t data; -- uint16_t *ql21_risc_code_addr01; -- uint16_t ql21_risc_code_length01; -- uint8_t dump_status; --#endif -+ struct qla_fw_info *fw_iter; -+ int i; -+ uint16_t *req_ring; - - ENTER(__func__); - -- /* Load RISC code. */ -- risc_address = *QLBoardTbl_fc[ha->devnum].fwstart; -- risc_code_address = QLBoardTbl_fc[ha->devnum].fwcode; -- risc_code_size = *QLBoardTbl_fc[ha->devnum].fwlen; -- -- DEBUG(printk("%s(): Loading RISC code size =(0x%lx) req virt=%p " -- "phys=%llx\n", -- __func__, -- risc_code_size, -- ha->request_ring, -- (u64)ha->request_dma);) -+ fw_iter = QLBoardTbl_fc[ha->devnum].fwinfo; - - /* - * Save active FC4 type depending on firmware support. This info is -@@ -7282,124 +6946,94 @@ qla2x00_setup_chip(scsi_qla_host_t *ha) - */ - ha->active_fc4_types = EXT_DEF_FC4_TYPE_SCSI; - #if defined(FC_IP_SUPPORT) -- ha->active_fc4_types |= EXT_DEF_FC4_TYPE_IP; -+ if (ha->flags.enable_ip) -+ ha->active_fc4_types |= EXT_DEF_FC4_TYPE_IP; - #endif - #if defined(FC_SCTP_SUPPORT) -+ risc_address = *fw_iter->fwstart; - if (risc_address == fw2300sctp_code01) - ha->active_fc4_types |= EXT_DEF_FC4_TYPE_SCTP; - #endif - -- num = 0; -- while (risc_code_size > 0 && !status) { -- cnt = REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT >> 1; --#if defined(ISP2200) -- /* for 2200A set transfer size to 128 bytes */ -- if (ha->device_id == QLA2200A_DEVICE_ID) -- cnt = 128 >> 1; --#endif -- -- if (cnt > risc_code_size) -- cnt = risc_code_size; -- -- DEBUG7(printk("%s(): loading risc segment@ addr %p, number of " -- "bytes 0x%x, offset 0x%x.\n", -- __func__, -- risc_code_address, -- cnt, -- risc_address);) -- --#if defined(__LITTLE_ENDIAN) -- memcpy(ha->request_ring, risc_code_address, (cnt << 1)); --#else -- { -- int i; -- uint16_t *req_ring; -+ /* Load firmware sequences */ -+ while (fw_iter->addressing != FW_INFO_ADDR_NOMORE) { -+ risc_code_address = fw_iter->fwcode; -+ risc_code_size = *fw_iter->fwlen; -+ -+ if (fw_iter->addressing == FW_INFO_ADDR_NORMAL) { -+ risc_address = *fw_iter->fwstart; -+ DEBUG7(printk(KERN_INFO "%s risc_address=%lx" -+ "address=%d\n",__func__,risc_address, -+ fw_iter->addressing);) -+ } else { -+ /* Extended address */ -+ risc_address = *fw_iter->lfwstart; -+ DEBUG7(printk(KERN_INFO "%s risc_address=%lx" -+ "address=%d\n",__func__,risc_address, -+ fw_iter->addressing);) -+ } - -- req_ring = (uint16_t *)ha->request_ring; -- for (i = 0; i < cnt; i++) -- req_ring[i] = cpu_to_le16(risc_code_address[i]); -- }; -+ num = 0; -+ while (risc_code_size > 0 && !status) { -+ cnt = REQUEST_ENTRY_SIZE * REQUEST_ENTRY_CNT >> 1; -+#if defined(ISP2200) -+ /* for 2200A set transfer size to 128 bytes */ -+ if (ha->device_id == QLA2200A_DEVICE_ID) -+ cnt = 128 >> 1; - #endif - -- /* -- * Flush written firmware to the ha->request_ring buffer before -- * DMA -- */ -- flush_cache_all(); -- -- status = qla2x00_load_ram(ha, -- ha->request_dma, risc_address, cnt); -+ if (cnt > risc_code_size) -+ cnt = risc_code_size; - -- if (status) { -- qla2x00_dump_regs(ha->host); -- printk(KERN_WARNING -- "qla2x00: [ERROR] Failed to load segment " -- "%d of FW\n", -- num); -- DEBUG(printk("%s(): Failed to load segment %d of FW\n", -- __func__, -- num);) -- break; -- } -- -- risc_address += cnt; -- risc_code_size -= cnt; -- risc_code_address += cnt; -- num++; -- } -- --#if defined(WORD_FW_LOAD) -- { -- int i; -+ DEBUG7(printk("%s(): loading risc segment@ addr %p," -+ " number of bytes 0x%x, offset 0x%lx.\n", -+ __func__, risc_code_address, cnt, risc_address);) - -- risc_address = *QLBoardTbl_fc[ha->devnum].fwstart; -- ql21_risc_code_addr01 = QLBoardTbl_fc[ha->devnum].fwcode; -- ql21_risc_code_length01 = *QLBoardTbl_fc[ha->devnum].fwlen; -- -- for (i = 0; i < ql21_risc_code_length01 ; i++) { -- dump_status = qla2x00_write_ram_word(ha, -- risc_address + i, -- *(ql21_risc_code_addr01 + i)); -+ req_ring = (uint16_t *)ha->request_ring; -+ for (i = 0; i < cnt; i++) -+ req_ring[i] = cpu_to_le16(risc_code_address[i]); - -- if (dump_status) { -- printk(KERN_WARNING -- "qla2x00: [ERROR] firmware load " -- "failure\n"); -- break; -+ /* -+ * 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); - } - -- dump_status = qla2x00_read_ram_word(ha, -- risc_address + i, &data); -- -- if (dump_status) { -+ if (status) { -+ qla2x00_dump_regs(ha->host); - printk(KERN_WARNING -- "qla2x00: [ERROR] RISC FW Read " -- "Failure\n"); -- break; -+ "qla2x00: [ERROR] Failed to load segment " -+ "%d of FW\n", num); -+ DEBUG2(printk("%s(): Failed to load segment %d" -+ " of FW\n", __func__, num);) -+ break; - } - -- if (data != *(ql21_risc_code_addr01 + i)) { -- printk(KERN_WARNING -- "qla2x00: [ERROR] RISC FW Compare " -- "ERROR @ (0x%p)\n", -- (void *)(ql21_risc_code_addr01+i)); -- } -+ risc_address += cnt; -+ risc_code_size -= cnt; -+ risc_code_address += cnt; -+ num++; - } -- printk(KERN_INFO -- "qla2x00: RISC FW download confirmed... \n"); -+ /* Next firmware sequence */ -+ fw_iter++; - } --#endif /* WORD_FW_LOAD */ - - /* Verify checksum of loaded RISC code. */ - if (!status) { -- DEBUG(printk("%s(): Verifying Check Sum of loaded RISC code.\n", -+ DEBUG2(printk("%s(): Verifying Check Sum of loaded RISC code.\n", - __func__);) - - status = (uint8_t)qla2x00_verify_checksum(ha); - - if (status == QL_STATUS_SUCCESS) { - /* Start firmware execution. */ -- DEBUG(printk("%s(): CS Ok, Start firmware running\n", -+ DEBUG2(printk("%s(): CS Ok, Start firmware running\n", - __func__);) - status = qla2x00_execute_fw(ha); - } -@@ -7493,16 +7127,18 @@ qla2x00_init_rings(scsi_qla_host_t *ha) - /* Initialize response queue entries */ - qla2x00_init_response_q_entries(ha); - --#if defined(ISP2300) -+#if defined(ISP2300) - WRT_REG_WORD(®->req_q_in, 0); - WRT_REG_WORD(®->req_q_out, 0); - WRT_REG_WORD(®->rsp_q_in, 0); - WRT_REG_WORD(®->rsp_q_out, 0); -+ CACHE_FLUSH(®->rsp_q_out); - #else - WRT_REG_WORD(®->mailbox4, 0); - WRT_REG_WORD(®->mailbox4, 0); - WRT_REG_WORD(®->mailbox5, 0); - WRT_REG_WORD(®->mailbox5, 0); -+ CACHE_FLUSH(®->mailbox5); - #endif - - spin_unlock_irqrestore(&ha->hardware_lock, flags); -@@ -7516,18 +7152,20 @@ qla2x00_init_rings(scsi_qla_host_t *ha) - __func__, - ha->host_no);) - } else { -+#if defined(ISP2300) - /* Setup seriallink options */ - uint16_t opt10, opt11; -+#endif -+ qla2x00_get_firmware_options(ha, -+ &ha->fw_options1, &ha->fw_options2, &ha->fw_options3); - -+#if defined(ISP2300) - DEBUG3(printk("%s(%ld): Serial link options:\n", - __func__, ha->host_no);) - DEBUG3(qla2x00_dump_buffer( - (uint8_t *)&ha->fw_seriallink_options, - sizeof(ha->fw_seriallink_options));) - -- qla2x00_get_firmware_options(ha, -- &ha->fw_options1, &ha->fw_options2, &ha->fw_options3); -- - ha->fw_options1 &= ~BIT_8; - if (ha->fw_seriallink_options.output_enable) - ha->fw_options1 |= BIT_8; -@@ -7537,12 +7175,15 @@ qla2x00_init_rings(scsi_qla_host_t *ha) - opt11 = (ha->fw_seriallink_options.output_emphasis_2g << 14) | - (ha->fw_seriallink_options.output_swing_2g << 8) | 0x3; - -+ /* TAPE FIX */ -+ /* Return the IOCB without waiting for the ABTS. */ -+ ha->fw_options3 |= BIT_13; -+ - qla2x00_set_firmware_options(ha, ha->fw_options1, - ha->fw_options2, ha->fw_options3, opt10, opt11); -- -- DEBUG3(printk("%s(%ld): exiting normally.\n", -- __func__, -- ha->host_no);) -+#endif -+ DEBUG3(printk("%s(%ld): exiting normally.\n", __func__, -+ ha->host_no)); - } - - return (status); -@@ -7571,7 +7212,11 @@ qla2x00_fw_ready(scsi_qla_host_t *ha) - - ENTER(__func__); - -- min_wait = 60; /* 60 seconds for loop down. */ -+ if (!ha->init_done) -+ min_wait = 60; /* 60 seconds for loop down. */ -+ else -+ min_wait = 20; /* 20 seconds for loop down. */ -+ ha->device_flags &= ~DFLG_NO_CABLE; - - /* - * Firmware should take at most one RATOV to login, plus 5 seconds for -@@ -7644,8 +7289,8 @@ qla2x00_fw_ready(scsi_qla_host_t *ha) - break; - - /* Delay for a while */ -- set_current_state(TASK_INTERRUPTIBLE); -- schedule_timeout(HZ / 2); -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ schedule_timeout(HZ / HZ); - - DEBUG3(printk("%s(): fw_state=%x curr time=%lx.\n", - __func__, -@@ -7791,45 +7436,6 @@ qla2x00_configure_hba(scsi_qla_host_t *h - return(rval); - } - --/** -- * 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 of 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 bit mask */ -- if (pci_set_dma_mask(ha->pdev, 0xffffffffffffffffULL)) { -- printk("qla2x00: failed to set 64 bit PCI DMA mask, " -- "using 32 bits\n"); -- ha->flags.enable_64bit_addressing = 0; -- pci_set_dma_mask(ha->pdev, 0xffffffff); -- } -- (void) pci_set_consistent_dma_mask(ha->pdev, 0xffffffffffffffffULL); -- } -- else { -- ha->flags.enable_64bit_addressing = 0; -- pci_set_dma_mask(ha->pdev, 0xffffffff); -- } -- printk(KERN_INFO -- "scsi(%ld): %d Bit PCI Addressing Enabled.\n", -- ha->host_no, -- (ha->flags.enable_64bit_addressing ? 64 : 32)); -- printk(KERN_INFO -- "scsi(%ld): Scatter/Gather entries= %d\n", -- ha->host_no, -- ha->host->sg_tablesize); --} -- - #if defined(ISP2100) - /* - * NVRAM configuration for 2100. -@@ -7962,13 +7568,10 @@ qla2100_nvram_config(scsi_qla_host_t *ha - ha->flags.disable_luns = nv->host_p.disable_luns; - ha->flags.disable_risc_code_load = nv->host_p.disable_risc_code_load; - ha->flags.set_cache_line_size_1 = nv->host_p.set_cache_line_size_1; -- ha->flags.enable_64bit_addressing = nv->host_p.enable_64bit_addressing; - - if (nv->host_p.enable_extended_logging) - extended_error_logging = 1 ; - -- qla2x00_config_dma_addressing(ha); -- - ha->flags.link_down_error_enable = 1; - - ha->flags.enable_lip_reset = nv->host_p.enable_lip_reset; -@@ -8032,8 +7635,7 @@ qla2100_nvram_config(scsi_qla_host_t *ha - - 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)) { -+ (ha->binding_type != BIND_BY_PORT_ID)) { - - printk(KERN_WARNING - "scsi(%ld): Invalid binding type specified " -@@ -8050,10 +7652,10 @@ qla2100_nvram_config(scsi_qla_host_t *ha - icb->response_q_inpointer = 0; - icb->request_q_length = REQUEST_ENTRY_CNT; - icb->response_q_length = RESPONSE_ENTRY_CNT; -- icb->request_q_address[0] = LS_64BITS(ha->request_dma); -- icb->request_q_address[1] = MS_64BITS(ha->request_dma); -- icb->response_q_address[0] = LS_64BITS(ha->response_dma); -- icb->response_q_address[1] = MS_64BITS(ha->response_dma); -+ icb->request_q_address[0] = LSD(ha->request_dma); -+ icb->request_q_address[1] = MSD(ha->request_dma); -+ icb->response_q_address[0] = LSD(ha->response_dma); -+ icb->response_q_address[1] = MSD(ha->response_dma); - - - ha->qfull_retry_count = qfull_retry_count; -@@ -8072,20 +7674,6 @@ qla2100_nvram_config(scsi_qla_host_t *ha - return(status); - } - #else --#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2) --/* -- * SGI systems can't adjust NVRAM settings, and some cards for SGI -- * systems have incorrect defaults. -- */ --void --sgi_sn_nvram_fixup(nvram22_t *nv) --{ -- nv->frame_payload_size = __constant_cpu_to_le16(2048); --#if defined(ISP2300) -- nv->special_options.data_rate = SO_DATA_RATE_AUTO; --#endif --} --#endif - /* - * NVRAM configuration for the 2200/2300/2312 - * -@@ -8106,7 +7694,7 @@ sgi_sn_nvram_fixup(nvram22_t *nv) - STATIC uint8_t - qla2x00_nvram_config(scsi_qla_host_t *ha) - { --#if defined(ISP2300) -+#if defined(ISP2300) - device_reg_t *reg = ha->iobase; - uint16_t data; - #endif -@@ -8126,8 +7714,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - ENTER(__func__); - - if (!ha->flags.nvram_config_done) { --#if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+#if defined(ISP2300) -+ if (check_all_device_ids(ha)) { - data = RD_REG_WORD(®->ctrl_status); - if ((data >> 14) == 1) - base = 0x80; -@@ -8163,8 +7751,8 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - chksum += (uint8_t)(*wptr >> 8); - wptr++; - } --#if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+#if defined(ISP2300) -+ if (check_all_device_ids(ha)) { - /* Unlock resource */ - WRT_REG_WORD(®->host_semaphore, 0); - } -@@ -8252,22 +7840,25 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - nv->link_down_timeout = 60; - status = 1; - } --#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_SGI_SN2) -- if (ia64_platform_is("sn2")) -- sgi_sn_nvram_fixup(nv); --#endif - - #if defined(ISP2200) - /* Model Number */ - sprintf(ha->model_number,"QLA22xx"); - #endif - --#if defined(ISP2300) -+#if defined(ISP2300) - /* Sub System Id (QLA2300/QLA2310): 0x9 */ -- if(ha->pdev->subsystem_device == 0x9 ) { -+ if (ha->device_id == QLA2300_DEVICE_ID && -+ ha->pdev->subsystem_device == 0x9 ) { - /* Model Number */ - sprintf(ha->model_number,"QLA2300/2310"); -- } else { -+ } else -+ { -+ /* This should be later versions of 23xx, with NVRAM -+ * support of hardware ID. -+ */ -+ strncpy(ha->hw_id_version, nv->hw_id, NVRAM_HW_ID_SIZE); -+ - /* Get the Model Number from the NVRAM. If - * the string is empty then lookup the table. - */ -@@ -8286,13 +7877,15 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - sprintf(ha->model_number, - qla2x00_model_name[index]); - } else { -- sprintf(ha->model_number, -- "QLA23xx"); -+ set_model_number(ha); - } - } - } - - #endif -+ -+ sprintf(ha->model_desc,"QLogic %s PCI Fibre Channel Adapter", -+ ha->model_number); - - /* Reset NVRAM data. */ - memset(icb, 0, sizeof(init_cb_t)); -@@ -8348,6 +7941,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - firmware_options.enable_full_login_on_lip = 1; - #if defined(ISP2300) - firmware_options.enable_fast_posting = 0; -+ icb->special_options.data_rate = 2; - #endif - #if !defined(FC_IP_SUPPORT) - /* Enable FC-Tape support */ -@@ -8355,25 +7949,30 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - additional_firmware_options.enable_fc_tape = 1; - additional_firmware_options.enable_fc_confirm = 1; - #endif -+#if defined(ISP2200) -+ additional_firmware_options.operation_mode = 4; -+ icb->response_accum_timer = 3; -+ icb->interrupt_delay_timer = 5; -+#endif - /* - * Set host adapter parameters - */ - ha->flags.enable_target_mode = firmware_options.enable_target_mode; - ha->flags.disable_luns = host_p.disable_luns; -+ if (check_device_id(ha)) -+ host_p.disable_risc_code_load = 0; - ha->flags.disable_risc_code_load = host_p.disable_risc_code_load; - ha->flags.set_cache_line_size_1 = host_p.set_cache_line_size_1; -- ha->flags.enable_64bit_addressing = host_p.enable_64bit_addressing; - if(host_p.enable_extended_logging) - extended_error_logging = 1 ; - -- qla2x00_config_dma_addressing(ha); -- - ha->flags.enable_lip_reset = host_p.enable_lip_reset; - ha->flags.enable_lip_full_login = host_p.enable_lip_full_login; - ha->flags.enable_target_reset = host_p.enable_target_reset; - ha->flags.enable_flash_db_update = host_p.enable_database_storage; - ha->operating_mode = additional_firmware_options.connection_options; -- -+ DEBUG2(printk("%s(%ld):operating mode=%d\n",__func__, -+ ha->host_no, ha->operating_mode);) - /* - * Set serial firmware options - */ -@@ -8403,8 +8002,10 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - - ha->hiwat = le16_to_cpu(icb->iocb_allocation); - ha->execution_throttle = le16_to_cpu(nv->execution_throttle); -+#if defined(ISP2200) || defined(ISP2300) - if (nv->login_timeout < ql2xlogintimeout) - nv->login_timeout = ql2xlogintimeout; -+#endif - - icb->execution_throttle = __constant_cpu_to_le16(0xFFFF); - ha->retry_count = nv->retry_count; -@@ -8475,8 +8076,7 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - - 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)) { -+ (ha->binding_type != BIND_BY_PORT_ID)) { - - printk(KERN_WARNING - "scsi(%ld): Invalid binding type specified " -@@ -8489,8 +8089,11 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - /* - * Need enough time to try and get the port back. - */ -+ ha->port_down_retry_count = 30; -+#if defined(ISP2200) || defined(ISP2300) - if (qlport_down_retry) - ha->port_down_retry_count = qlport_down_retry; -+#endif - #if defined(COMPAQ) - else if (ha->port_down_retry_count < HSG80_PORT_RETRY_COUNT) - ha->port_down_retry_count = HSG80_PORT_RETRY_COUNT; -@@ -8503,6 +8106,11 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - else if ( ha->port_down_retry_count > ha->login_retry_count ) - ha->login_retry_count = ha->port_down_retry_count; - -+#if defined(ISP2200) || defined(ISP2300) -+ if(qlogin_retry_count) -+ ha->login_retry_count = qlogin_retry_count; -+#endif -+ - /* - * Setup ring parameters in initialization control block - */ -@@ -8512,14 +8120,10 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - __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(LS_64BITS(ha->request_dma)); -- icb->request_q_address[1] = -- cpu_to_le32(MS_64BITS(ha->request_dma)); -- icb->response_q_address[0] = -- cpu_to_le32(LS_64BITS(ha->response_dma)); -- icb->response_q_address[1] = -- cpu_to_le32(MS_64BITS(ha->response_dma)); -+ 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; -@@ -8531,14 +8135,14 @@ qla2x00_nvram_config(scsi_qla_host_t *ha - if (icb->additional_firmware_options.operation_mode - == ZIO_MODE){ - icb->interrupt_delay_timer = ql2xintrdelaytimer; -- DEBUG2(printk(KERN_INFO "%s ZIO enabled:intr_timer_delay=%d\n", -- __func__,ql2xintrdelaytimer);) -+ DEBUG2(printk(KERN_INFO "%s ZIO enabled:" -+ " intr_timer_delay=%d\n", __func__, -+ ql2xintrdelaytimer);) - printk(KERN_INFO "%s ZIO enabled:intr_timer_delay=%d\n", - __func__,ql2xintrdelaytimer); - ha->flags.process_response_queue = 1; - } - #endif -- - ha->qfull_retry_count = qfull_retry_count; - ha->qfull_retry_delay = qfull_retry_delay; - -@@ -8648,6 +8252,7 @@ qla2x00_nvram_request(scsi_qla_host_t *h - - /* Deselect chip. */ - WRT_REG_WORD(®->nvram, NV_DESELECT); -+ CACHE_FLUSH(®->nvram); - /* qla2x00_nv_delay(ha); */ - NVRAM_DELAY(); - -@@ -8660,13 +8265,15 @@ qla2x00_nv_write(scsi_qla_host_t *ha, ui - device_reg_t *reg = ha->iobase; - - WRT_REG_WORD(®->nvram, data | NV_SELECT); -+ CACHE_FLUSH(®->nvram); - NVRAM_DELAY(); -- /* qla2x00_nv_delay(ha); */ -+ - WRT_REG_WORD(®->nvram, data | NV_SELECT | NV_CLOCK); -- /* qla2x00_nv_delay(ha); */ -+ CACHE_FLUSH(®->nvram); - NVRAM_DELAY(); -+ - WRT_REG_WORD(®->nvram, data | NV_SELECT); -- /* qla2x00_nv_delay(ha); */ -+ CACHE_FLUSH(®->nvram); - NVRAM_DELAY(); - } - -@@ -8676,6 +8283,7 @@ qla2x00_nv_deselect(scsi_qla_host_t *ha) - device_reg_t *reg = ha->iobase; - - WRT_REG_WORD(®->nvram, NV_DESELECT); -+ CACHE_FLUSH(®->nvram); - NVRAM_DELAY(); - } - -@@ -8696,16 +8304,8 @@ qla2x00_poll(scsi_qla_host_t *ha) - - ENTER(__func__); - --#ifdef __VMWARE__ -- /* This function is only called from qla2x00_ms_req_pkt and -- * qla2x00_req_pkt. Since these functions drop the hardware -- * lock and we immediately regrab it here, we drop releasing -- * it there and drop grabbing it here. -- Thor -- */ --#else - /* Acquire interrupt specific lock */ - spin_lock_irqsave(&ha->hardware_lock, flags); --#endif - - /* Check for pending interrupts. */ - #if defined(ISP2100) || defined(ISP2200) -@@ -8713,7 +8313,7 @@ qla2x00_poll(scsi_qla_host_t *ha) - if (data & RISC_INT) - qla2x00_isr(ha, data, &discard); - #else -- if (ha->device_id == QLA2312_DEVICE_ID) { -+ if (check_all_device_ids(ha)) { - data = RD_REG_WORD(®->istatus); - if (data & RISC_INT) { - data = RD_REG_WORD(®->host_status_lo); -@@ -8726,22 +8326,11 @@ qla2x00_poll(scsi_qla_host_t *ha) - qla2x00_isr(ha, data, &discard); - } - #endif --#ifdef __VMWARE__ -- /* Again, we do not grab and release this lock since the caller -- * already has this lock. The effect is that tasklet_schedule below -- * is called with interrupts disabled, which is fine. -- Thor -- */ --#else - /* Release interrupt specific lock */ - spin_unlock_irqrestore(&ha->hardware_lock, flags); --#endif - - if (!list_empty(&ha->done_queue)) --#if QLA2X_PERFORMANCE -- tasklet_schedule(&ha->run_qla_task); --#else - qla2x00_done(ha); --#endif - - LEAVE(__func__); - } -@@ -8756,7 +8345,7 @@ qla2x00_poll(scsi_qla_host_t *ha) - * Returns: - * 0 = success - */ --static int -+int - qla2x00_restart_isp(scsi_qla_host_t *ha) - { - uint8_t status = 0; -@@ -8783,7 +8372,7 @@ qla2x00_restart_isp(scsi_qla_host_t *ha) - spin_lock_irqsave(&ha->hardware_lock, flags); - - /* Enable proper parity */ -- if (ha->device_id == QLA2312_DEVICE_ID) -+ if (check_all_device_ids(ha)) - /* SRAM, Instruction RAM and GP RAM parity */ - WRT_REG_WORD(®->host_cmd, - (HC_ENABLE_PARITY + 0x7)); -@@ -8841,9 +8430,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) - uint16_t cnt; - srb_t *sp; - uint8_t status = 0; --#ifdef PERF_MONITORING -- os_lun_t *lq; --#endif - - ENTER("qla2x00_abort_isp"); - -@@ -8861,8 +8447,8 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) - ha->host_no,ha); - qla2x00_reset_chip(ha); - -- if (ha->loop_state != LOOP_DOWN) { -- ha->loop_state = LOOP_DOWN; -+ if (atomic_read(&ha->loop_state) != LOOP_DOWN) { -+ atomic_set(&ha->loop_state, LOOP_DOWN); - atomic_set(&ha->loop_down_timer, LOOP_DOWN_TIME); - qla2x00_mark_all_devices_lost(ha); - } -@@ -8890,13 +8476,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) - ha->actthreads--; - sp->lun_queue->out_cnt--; - ha->iocb_cnt -= sp->iocb_cnt; --#ifdef PERF_MONITORING -- /* update stats */ -- lq = sp->lun_queue; -- lq->resp_time += jiffies - sp->u_start; -- lq->act_time += jiffies - sp->r_start; --#endif -- - sp->flags = 0; - - /* -@@ -9005,47 +8584,6 @@ qla2x00_abort_isp(scsi_qla_host_t *ha) - } - - /* --* 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 */ -- } -- --#if USE_FLASH_DATABASE -- /* Move flash database to driver database. */ -- qla2x00_get_database(ha); --#endif -- } -- -- LEAVE(__func__); --} -- -- --/* - * qla2x00_init_tgt_map - * Initializes target map. - * -@@ -9069,6 +8607,35 @@ qla2x00_init_tgt_map(scsi_qla_host_t *ha - } - - -+/** -+ * qla2x00_alloc_fcport() - Allocate a generic fcport. -+ * @ha: HA context -+ * @flags: allocation flags -+ * -+ * Returns a pointer to the allocated fcport, or NULL, if none available. -+ */ -+STATIC fc_port_t * -+qla2x00_alloc_fcport(scsi_qla_host_t *ha, int flags) -+{ -+ fc_port_t *fcport; -+ -+ fcport = kmalloc(sizeof(fc_port_t), flags); -+ if (fcport == NULL) -+ return (fcport); -+ -+ /* Setup fcport template structure. */ -+ memset(fcport, 0, sizeof (fc_port_t)); -+ fcport->ha = ha; -+ fcport->port_type = FCT_UNKNOWN; -+ fcport->loop_id = FC_NO_LOOP_ID; -+ atomic_set(&fcport->state, FC_DEVICE_DEAD); -+ fcport->flags = FC_SUPPORT_RPT_LUNS; -+ INIT_LIST_HEAD(&fcport->fcluns); -+ -+ return (fcport); -+} -+ -+ - /* - * qla2x00_reset_adapter - * Reset adapter. -@@ -9128,35 +8695,12 @@ qla2x00_loop_reset(scsi_qla_host_t *ha) - continue; - - status = qla2x00_target_reset(ha, 0, t); --#ifndef __VMWARE__NO_BUG_FIX -- /* Ignore error from qla2x00_target_reset(), -- * because it is always returning an error in the -- * multipath driver. */ --#else -- if (status != QL_STATUS_SUCCESS) { -- break; -- } --#endif - } - } - -- if ( -- --#ifdef __VMWARE__NO_BUG_FIX -- status == QL_STATUS_SUCCESS && --#else -- /* Do not look at status, since it may very well be the result of -- * the last target reset and will not tell whether the lip_reset -- * was completed successfully!!! -- */ --#endif -- ((!ha->flags.enable_target_reset && -- !ha->flags.enable_lip_reset) || -- ha->flags.enable_lip_full_login)) { -+ if ((!ha->flags.enable_target_reset && !ha->flags.enable_lip_reset) || -+ ha->flags.enable_lip_full_login) { - --#ifdef __VMWARE__ -- printk("Doing full login LIP\n"); --#endif - status = qla2x00_full_login_lip(ha); - } - -@@ -9240,7 +8784,11 @@ __qla2x00_marker(scsi_qla_host_t *ha, ui - - if (type != MK_SYNC_ALL) { - pkt->lun = cpu_to_le16(lun); -- pkt->target = (uint8_t)loop_id; -+#if defined(EXTENDED_IDS) -+ pkt->target = cpu_to_le16(loop_id); -+#else -+ pkt->target = (uint8_t)loop_id; -+#endif - } - - /* Issue command to ISP */ -@@ -9416,7 +8964,6 @@ qla2x00_64bit_start_scsi(srb_t *sp) - uint32_t timeout; - - device_reg_t *reg; -- uint16_t reg_flushed; - - ENTER(__func__); - -@@ -9440,6 +8987,7 @@ qla2x00_64bit_start_scsi(srb_t *sp) - ha->marker_needed = 0; - } - -+ - /* Acquire ring specific lock */ - spin_lock_irqsave(&ha->hardware_lock, flags); - -@@ -9502,7 +9050,11 @@ qla2x00_64bit_start_scsi(srb_t *sp) - cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; - - /* Set target ID */ -- cmd_pkt->target = (uint8_t)fclun->fcport->loop_id; -+#if defined(EXTENDED_IDS) -+ cmd_pkt->target = cpu_to_le16(fclun->fcport->loop_id); -+#else -+ cmd_pkt->target = (uint8_t)fclun->fcport->loop_id; -+#endif - - /* Set LUN number*/ - #if VSA -@@ -9561,8 +9113,8 @@ qla2x00_64bit_start_scsi(srb_t *sp) - - cmd_pkt->byte_count = cpu_to_le32((uint32_t)cmd->request_bufflen); - -- if (cmd->request_bufflen == 0 || -- cmd->sc_data_direction == SCSI_DATA_NONE) { -+ if (cmd->request_bufflen == 0 || -+ cmd->sc_data_direction == SCSI_DATA_NONE) { - /* No data transfer */ - cmd_pkt->byte_count = __constant_cpu_to_le32(0); - DEBUG5(printk("%s(): No data, command packet data - " -@@ -9573,50 +9125,7 @@ qla2x00_64bit_start_scsi(srb_t *sp) - (uint32_t)SCSI_LUN_32(cmd));) - DEBUG5(qla2x00_dump_buffer((uint8_t *)cmd_pkt, - REQUEST_ENTRY_SIZE);) -- } -- else { --#if defined(SANE_USAGE_OF_CMD_DIRECTION) -- /* Set transfer direction */ --#ifndef __VMWARE__ -- if (cmd->sc_data_direction == SCSI_DATA_WRITE) { -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_WRITE); -- } else if (cmd->sc_data_direction == SCSI_DATA_READ) { -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_READ); -- } else --#else -- /* Always set the data direction here, since the vmkernel -- * does not do it for us (otherwise it will hold a default -- * value of zero, which means SCSI_DATA_WRITE) -- */ -- if (1) --#endif //__VMWARE__ -- { -- switch (cmd->data_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: -- case WRITE_VERIFY_12: -- case SEND_VOLUME_TAG: -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_WRITE); -- break; -- default: -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_READ); -- break; -- } -- } --#else -+ } else { - switch (cmd->data_cmnd[0]) { - case FORMAT_UNIT: - case WRITE_6: -@@ -9635,20 +9144,15 @@ qla2x00_64bit_start_scsi(srb_t *sp) - __constant_cpu_to_le16(CF_WRITE); - break; - default: --#ifdef __VMWARE__ -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_READ); --#else - if (cmd->sc_data_direction == SCSI_DATA_WRITE) - cmd_pkt->control_flags |= - __constant_cpu_to_le16(CF_WRITE); - else - cmd_pkt->control_flags |= - __constant_cpu_to_le16(CF_READ); --#endif //__VMWARE__ - break; - } --#endif -+ - sp->dir = cmd_pkt->control_flags & - __constant_cpu_to_le16(CF_READ | CF_WRITE); - -@@ -9659,15 +9163,8 @@ qla2x00_64bit_start_scsi(srb_t *sp) - int nseg; - - cur_seg = (struct scatterlist *)cmd->request_buffer; --#ifdef __VMWARE__ -- /* -- * The dma addresses in sg have already been set up. -- */ -- nseg = cmd->use_sg; --#else - nseg = pci_map_sg(ha->pdev, cur_seg, cmd->use_sg, - scsi_to_pci_dma_dir(cmd->sc_data_direction)); --#endif - end_seg = cur_seg + nseg; - - while (cur_seg < end_seg) { -@@ -9706,15 +9203,8 @@ qla2x00_64bit_start_scsi(srb_t *sp) - &nml_dma, &nml_len); - - /* One entry always consumed */ -- *cur_dsd++ = cpu_to_le32( -- pci_dma_lo32(sle_dma)); -- *cur_dsd++ = cpu_to_le32( -- pci_dma_hi32(sle_dma)); --#ifdef PERF_MONITORING -- if ( pci_dma_hi32(sle_dma) != 0L) { -- qla2x00_stats.highmem_io++; -- } --#endif -+ *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++; - avail_dsds--; -@@ -9746,10 +9236,8 @@ qla2x00_64bit_start_scsi(srb_t *sp) - avail_dsds = 5; - } - -- *cur_dsd++ = cpu_to_le32( -- pci_dma_lo32(nml_dma)); -- *cur_dsd++ = cpu_to_le32( -- pci_dma_hi32(nml_dma)); -+ *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++; - avail_dsds--; -@@ -9771,12 +9259,6 @@ qla2x00_64bit_start_scsi(srb_t *sp) - uint32_t nml_len; - uint32_t normalized; - --#ifdef __VMWARE__ -- /* -- * We already have the machine address. -- */ -- req_dma = (unsigned long)cmd->request_buffer; --#else - #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13) - struct page *page = virt_to_page(cmd->request_buffer); - unsigned long offset = ((unsigned long) -@@ -9796,7 +9278,6 @@ qla2x00_64bit_start_scsi(srb_t *sp) - scsi_to_pci_dma_dir( - cmd->sc_data_direction)); - #endif --#endif - req_len = cmd->request_bufflen; - - sp->saved_dma_handle = req_dma; -@@ -9806,23 +9287,14 @@ qla2x00_64bit_start_scsi(srb_t *sp) - &nml_dma, &nml_len); - - /* One entry always consumed */ -- *cur_dsd++ = cpu_to_le32( -- pci_dma_lo32(req_dma)); -- *cur_dsd++ = cpu_to_le32( -- pci_dma_hi32(req_dma)); -+ *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++; - --#ifdef PERF_MONITORING -- if ( pci_dma_hi32(req_dma) != 0L) { -- qla2x00_stats.highmem_io++; -- } --#endif - if (normalized) { -- *cur_dsd++ = cpu_to_le32( -- pci_dma_lo32(nml_dma)); -- *cur_dsd++ = cpu_to_le32( -- pci_dma_hi32(nml_dma)); -+ *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++; - } -@@ -9857,6 +9329,16 @@ qla2x00_64bit_start_scsi(srb_t *sp) - - ha->actthreads++; - ha->total_ios++; -+ -+ if (cmd_pkt->control_flags & __constant_cpu_to_le16(CF_WRITE) && -+ cmd->request_bufflen != 0) { -+ ha->total_output_cnt++; -+ } else if (cmd_pkt->control_flags & __constant_cpu_to_le16(CF_READ)) { -+ ha->total_input_cnt++; -+ } else { -+ ha->total_ctrl_cnt++; -+ } -+ - sp->ha = ha; - sp->lun_queue->out_cnt++; - sp->flags |= SRB_DMA_VALID; -@@ -9871,21 +9353,19 @@ qla2x00_64bit_start_scsi(srb_t *sp) - #endif - - #if defined(ISP2100) || defined(ISP2200) -- reg_flushed = CACHE_FLUSH(®->mailbox4); - WRT_REG_WORD(®->mailbox4, ha->req_ring_index); -+ CACHE_FLUSH(®->mailbox4); - #else -- reg_flushed = CACHE_FLUSH(®->req_q_in); - WRT_REG_WORD(®->req_q_in, ha->req_ring_index); -+ CACHE_FLUSH(®->req_q_in); - #endif - - spin_unlock_irqrestore(&ha->hardware_lock, flags); - return (0); - - mapped_queuing_error_64: --#ifndef __VMWARE__ - pci_unmap_sg(ha->pdev, (struct scatterlist *)cmd->request_buffer, - cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction)); --#endif - - queuing_error_64: - spin_unlock_irqrestore(&ha->hardware_lock, flags); -@@ -9897,7 +9377,7 @@ queuing_error_64: - * The start SCSI is responsible for building request packets on - * request ring and modifying ISP input pointer. - * --* The Qlogic firmware interface allows every queue slot to have a SCSI -+* The QLogic firmware interface allows every queue slot to have a SCSI - * command and up to 4 scatter/gather (SG) entries. If we need more - * than 4 SG entries, then continuation entries are used that can - * hold another 7 entries each. The start routine determines if there -@@ -9937,7 +9417,6 @@ qla2x00_32bit_start_scsi(srb_t *sp) - uint32_t timeout; - - device_reg_t *reg; -- uint16_t reg_flushed; - - ENTER(__func__); - -@@ -10023,7 +9502,11 @@ qla2x00_32bit_start_scsi(srb_t *sp) - cur_dsd = (uint32_t *)&cmd_pkt->dseg_0_address; - - /* Set target ID */ -+#if defined(EXTENDED_IDS) -+ cmd_pkt->target = cpu_to_le16(fclun->fcport->loop_id); -+#else - cmd_pkt->target = (uint8_t)fclun->fcport->loop_id; -+#endif - - /* Set LUN number*/ - #if VSA -@@ -10094,50 +9577,7 @@ qla2x00_32bit_start_scsi(srb_t *sp) - (uint32_t)SCSI_LUN_32(cmd));) - DEBUG5(qla2x00_dump_buffer((uint8_t *)cmd_pkt, - REQUEST_ENTRY_SIZE);) -- } -- else { --#if defined(SANE_USAGE_OF_CMD_DIRECTION) --#ifndef __VMWARE__ -- /* Set transfer direction */ -- if (cmd->sc_data_direction == SCSI_DATA_WRITE) { -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_WRITE); -- } else if (cmd->sc_data_direction == SCSI_DATA_READ) { -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_READ); -- } else --#else -- /* Always set the data direction here, since the vmkernel -- * does not do it for us (otherwise it will hold a default -- * value of zero, which means SCSI_DATA_WRITE) -- */ -- if (1) --#endif //__VMWARE__ -- { -- switch (cmd->data_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: -- case WRITE_VERIFY_12: -- case SEND_VOLUME_TAG: -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_WRITE); -- break; -- default: -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_READ); -- break; -- } -- } --#else -+ } else { - switch (cmd->data_cmnd[0]) { - case FORMAT_UNIT: - case WRITE_6: -@@ -10156,20 +9596,14 @@ qla2x00_32bit_start_scsi(srb_t *sp) - __constant_cpu_to_le16(CF_WRITE); - break; - default: --#ifdef __VMWARE__ -- cmd_pkt->control_flags |= -- __constant_cpu_to_le16(CF_READ); --#else - if (cmd->sc_data_direction == SCSI_DATA_WRITE) - cmd_pkt->control_flags |= - __constant_cpu_to_le16(CF_WRITE); - else - cmd_pkt->control_flags |= - __constant_cpu_to_le16(CF_READ); --#endif //__VMWARE__ - break; - } --#endif - sp->dir = cmd_pkt->control_flags & - __constant_cpu_to_le16(CF_READ | CF_WRITE); - -@@ -10180,21 +9614,11 @@ qla2x00_32bit_start_scsi(srb_t *sp) - int nseg; - - cur_seg = (struct scatterlist *)cmd->request_buffer; --#ifdef __VMWARE__ -- /* -- * The dma addresses in sg have already been set up. -- */ -- nseg = cmd->use_sg; --#else - nseg = pci_map_sg(ha->pdev, cur_seg, cmd->use_sg, - scsi_to_pci_dma_dir(cmd->sc_data_direction)); --#endif - end_seg = cur_seg + nseg; - - while (cur_seg < end_seg) { -- dma_addr_t sle_dma; -- uint32_t sle_len; -- - /* Allocate additional continuation packets? */ - if (avail_dsds == 0) { - tot_iocbs++; -@@ -10216,13 +9640,10 @@ qla2x00_32bit_start_scsi(srb_t *sp) - 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( -- pci_dma_lo32(sle_dma)); -- *cur_dsd++ = cpu_to_le32(sle_len); -+ *cur_dsd++ = -+ cpu_to_le32(sg_dma_address(cur_seg)); -+ *cur_dsd++ = cpu_to_le32(sg_dma_len(cur_seg)); - tot_dsds++; - avail_dsds--; - -@@ -10235,14 +9656,7 @@ qla2x00_32bit_start_scsi(srb_t *sp) - * of request. - */ - dma_addr_t req_dma; -- uint32_t req_len; - --#ifdef __VMWARE__ -- /* -- * We already have the machine address. -- */ -- req_dma = (unsigned long)cmd->request_buffer; --#else - #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,13) - struct page *page = virt_to_page(cmd->request_buffer); - unsigned long offset = ((unsigned long) -@@ -10262,15 +9676,11 @@ qla2x00_32bit_start_scsi(srb_t *sp) - scsi_to_pci_dma_dir( - cmd->sc_data_direction)); - #endif --#endif -- req_len = cmd->request_bufflen; -- - sp->saved_dma_handle = req_dma; - - /* One entry always consumed */ -- *cur_dsd++ = cpu_to_le32( -- pci_dma_lo32(req_dma)); -- *cur_dsd++ = cpu_to_le32(req_len); -+ *cur_dsd++ = cpu_to_le32(req_dma); -+ *cur_dsd++ = cpu_to_le32(cmd->request_bufflen); - tot_dsds++; - } - } -@@ -10302,6 +9712,16 @@ qla2x00_32bit_start_scsi(srb_t *sp) - - ha->actthreads++; - ha->total_ios++; -+ -+ if (cmd_pkt->control_flags & __constant_cpu_to_le16(CF_WRITE) && -+ cmd->request_bufflen != 0) { -+ ha->total_output_cnt++; -+ } else if (cmd_pkt->control_flags & __constant_cpu_to_le16(CF_READ)) { -+ ha->total_input_cnt++; -+ } else { -+ ha->total_ctrl_cnt++; -+ } -+ - sp->ha = ha; - sp->lun_queue->out_cnt++; - sp->flags |= SRB_DMA_VALID; -@@ -10316,21 +9736,19 @@ qla2x00_32bit_start_scsi(srb_t *sp) - #endif - - #if defined(ISP2100) || defined(ISP2200) -- reg_flushed = CACHE_FLUSH(®->mailbox4); - WRT_REG_WORD(®->mailbox4, ha->req_ring_index); -+ CACHE_FLUSH(®->mailbox4); - #else -- reg_flushed = CACHE_FLUSH(®->req_q_in); - WRT_REG_WORD(®->req_q_in, ha->req_ring_index); -+ CACHE_FLUSH(®->req_q_in); - #endif - - spin_unlock_irqrestore(&ha->hardware_lock, flags); - return (0); - - mapped_queuing_error_32: --#ifndef __VMWARE__ - pci_unmap_sg(ha->pdev, (struct scatterlist *)cmd->request_buffer, - cmd->use_sg, scsi_to_pci_dma_dir(cmd->sc_data_direction)); --#endif - - queuing_error_32: - spin_unlock_irqrestore(&ha->hardware_lock, flags); -@@ -10428,16 +9846,6 @@ qla2x00_ms_req_pkt(scsi_qla_host_t *ha, - break; - } - --#ifdef __VMWARE__ -- /* The qla2x00_poll function is only called from here and -- * from qla2x00_req_pkt (in a similar way). Since -- * qla2x00_poll will immediately regrab the hardware lock, -- * we drop releasing it here and drop grabbing it in the -- * poll function. -- Thor -- */ -- udelay(20); -- qla2x00_poll(ha); --#else - /* Release ring specific lock */ - spin_unlock(&ha->hardware_lock); - udelay(20); -@@ -10445,7 +9853,6 @@ qla2x00_ms_req_pkt(scsi_qla_host_t *ha, - /* Check for pending interrupts. */ - qla2x00_poll(ha); - spin_lock_irq(&ha->hardware_lock); --#endif - } - - #if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) -@@ -10517,17 +9924,6 @@ qla2x00_req_pkt(scsi_qla_host_t *ha) - break; - } - --#ifdef __VMWARE__ -- /* The qla2x00_poll function is only called from here and -- * from qla2x00_ms_req_pkt (in a similar way). Since -- * qla2x00_poll will immediately regrab the hardware lock, -- * we drop releasing it here and drop grabbing it in the -- * poll function. -- Thor -- */ -- udelay(2); -- if (!ha->marker_needed) -- qla2x00_poll(ha); --#else - /* Release ring specific lock */ - spin_unlock(&ha->hardware_lock); - -@@ -10539,7 +9935,6 @@ qla2x00_req_pkt(scsi_qla_host_t *ha) - qla2x00_poll(ha); - - spin_lock_irq(&ha->hardware_lock); --#endif - } - - #if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) -@@ -10582,8 +9977,10 @@ qla2x00_isp_cmd(scsi_qla_host_t *ha) - /* Set chip new ring index. */ - #if defined(ISP2100) || defined(ISP2200) - WRT_REG_WORD(®->mailbox4, ha->req_ring_index); -+ CACHE_FLUSH(®->mailbox4); - #else - WRT_REG_WORD(®->req_q_in, ha->req_ring_index); -+ CACHE_FLUSH(®->req_q_in); - #endif - - LEAVE(__func__); -@@ -10644,9 +10041,6 @@ qla2x00_process_good_request(struct scsi - { - srb_t *sp; - struct scsi_qla_host *vis_ha; --#ifdef PERF_MONITORING -- os_lun_t *lq; --#endif - - ENTER(__func__); - -@@ -10673,13 +10067,6 @@ qla2x00_process_good_request(struct scsi - CMD_COMPL_STATUS(sp->cmd) = 0L; - CMD_SCSI_STATUS(sp->cmd) = 0L; - --#ifdef PERF_MONITORING -- /* update stats */ -- lq = sp->lun_queue; -- lq->resp_time += jiffies - sp->u_start; -- lq->act_time += jiffies - sp->r_start; --#endif -- - /* Save ISP completion status */ - CMD_RESULT(sp->cmd) = DID_OK << 16; - sp->fo_retry_cnt = 0; -@@ -10791,7 +10178,7 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - #if defined(ISP2100) || defined(ISP2200) - uint16_t response_index = RESPONSE_ENTRY_CNT; - #endif --#if defined(ISP2300) -+#if defined(ISP2300) - uint16_t temp2; - uint8_t mailbox_int; - uint16_t hccr; -@@ -10823,6 +10210,7 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - * get out of the RISC PAUSED state. - */ - WRT_REG_WORD(®->host_cmd, HC_RESET_RISC); -+ CACHE_FLUSH(®->host_cmd); - set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); - } - #endif -@@ -10852,6 +10240,7 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - break; - case RESPONSE_QUEUE_INT: - WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); -+ CACHE_FLUSH(®->host_cmd); - goto response_queue_int; - break; - -@@ -10922,7 +10311,8 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags))) - QLA_MBX_REG_LOCK(ha); - */ -- if (temp1 == MBA_SCSI_COMPLETION) { -+ if (( temp1 == MBA_SCSI_COMPLETION) || -+ ((temp1 >= RIO_MBS_CMD_CMP_1_16) && (temp1 <= RIO_MBS_CMD_CMP_5_16))) { - #if defined(ISP2100) || defined(ISP2200) - mailbox[1] = RD_REG_WORD(®->mailbox1); - #else -@@ -10930,6 +10320,10 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - #endif - - mailbox[2] = RD_REG_WORD(®->mailbox2); -+ mailbox[3] = RD_REG_WORD(®->mailbox3); -+ mailbox[5] = RD_REG_WORD(®->mailbox5); -+ mailbox[6] = RD_REG_WORD(®->mailbox6); -+ mailbox[7] = RD_REG_WORD(®->mailbox7); - } else { - MBOX_TRACE(ha,BIT_4); - mailbox[0] = temp1; -@@ -10960,6 +10354,7 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - /* Release mailbox registers. */ - WRT_REG_WORD(®->semaphore, 0); - WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); -+ CACHE_FLUSH(®->host_cmd); - - DEBUG5(printk("%s(): mailbox interrupt mailbox[0] = %x.\n", - __func__, -@@ -10968,12 +10363,10 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - /* Handle asynchronous event */ - switch (temp1) { - --#if defined(ISP2300) - case MBA_ZIO_UPDATE: - DEBUG5(printk("%s ZIO update completion\n", - __func__);) - break; --#endif - case MBA_SCSI_COMPLETION: /* Completion */ - - DEBUG5(printk("%s(): mailbox response " -@@ -10984,12 +10377,73 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - break; - - /* Get outstanding command index */ -- index = (uint32_t) -- (mailbox[2] << 16 | mailbox[1]); -+ index = le32_to_cpu(((uint32_t)(mailbox[2] << 16)) | mailbox[1]); -+ - qla2x00_process_good_request(ha, - index, MBA_SCSI_COMPLETION); - break; - -+ case RIO_MBS_CMD_CMP_1_16: /* Mitigated Response completion */ -+ DEBUG5(printk("qla2100_isr: mailbox response completion\n")); -+ if (ha->flags.online) { -+ /* Get outstanding command index. */ -+ index = (uint32_t) (mailbox[1]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_1_16); -+ } -+ break; -+ case RIO_MBS_CMD_CMP_2_16: /* Mitigated Response completion */ -+ DEBUG5(printk("qla2100_isr: mailbox response completion\n")); -+ if (ha->flags.online) { -+ /* Get outstanding command index. */ -+ index = (uint32_t) (mailbox[1]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_2_16); -+ index = (uint32_t) (mailbox[2]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_2_16); -+ } -+ break; -+ case RIO_MBS_CMD_CMP_3_16: /* Mitigated Response completion */ -+ DEBUG5(printk("qla2100_isr: mailbox response completion\n")); -+ if (ha->flags.online) { -+ /* Get outstanding command index. */ -+ index = (uint32_t) (mailbox[1]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_3_16); -+ index = (uint32_t) (mailbox[2]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_3_16); -+ index = (uint32_t) (mailbox[3]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_3_16); -+ } -+ break; -+ case RIO_MBS_CMD_CMP_4_16: /* Mitigated Response completion */ -+ DEBUG5(printk("qla2100_isr: mailbox response completion\n")); -+ if (ha->flags.online) { -+ /* Get outstanding command index. */ -+ index = (uint32_t) (mailbox[1]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_4_16); -+ index = (uint32_t) (mailbox[2]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_4_16); -+ index = (uint32_t) (mailbox[3]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_4_16); -+ index = (uint32_t) (mailbox[6]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_4_16); -+ } -+ break; -+ case RIO_MBS_CMD_CMP_5_16: /* Mitigated Response completion */ -+ DEBUG5(printk("qla2100_isr: mailbox response completion\n")); -+ if (ha->flags.online) { -+ /* Get outstanding command index. */ -+ index = (uint32_t) (mailbox[1]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_5_16); -+ index = (uint32_t) (mailbox[2]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_5_16); -+ index = (uint32_t) (mailbox[3]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_5_16); -+ index = (uint32_t) (mailbox[6]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_5_16); -+ index = (uint32_t) (mailbox[7]); -+ qla2x00_process_good_request(ha, index, RIO_MBS_CMD_CMP_5_16); -+ } -+ break; -+ - case MBA_RESET: /* Reset */ - - DEBUG2(printk(KERN_INFO "scsi(%ld): %s: asynchronous " -@@ -11061,8 +10515,8 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - - /* Save LIP sequence. */ - ha->lip_seq = mailbox[1]; -- if (ha->loop_state != LOOP_DOWN) { -- ha->loop_state = LOOP_DOWN; -+ if (atomic_read(&ha->loop_state) != LOOP_DOWN) { -+ atomic_set(&ha->loop_state, LOOP_DOWN); - atomic_set(&ha->loop_down_timer, - LOOP_DOWN_TIME); - qla2x00_mark_all_devices_lost(ha); -@@ -11125,13 +10579,16 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - "MBA_LOOP_DOWN.\n", - ha->host_no, __func__);) - -- if (ha->loop_state != LOOP_DOWN) { -- ha->loop_state = LOOP_DOWN; -+ if (atomic_read(&ha->loop_state) != LOOP_DOWN) { -+ ha->device_flags |= DFLG_NO_CABLE; -+ atomic_set(&ha->loop_state, LOOP_DOWN); - atomic_set(&ha->loop_down_timer, -- LOOP_DOWN_TIME); -+ LOOP_DOWN_TIME); - qla2x00_mark_all_devices_lost(ha); - } - -+ clear_bit(FDMI_REGISTER_NEEDED, &ha->fdmi_flags); -+ - ha->flags.management_server_logged_in = 0; - ha->current_speed = 0; /* reset value */ - -@@ -11157,10 +10614,10 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - set_bit(COMMAND_WAIT_NEEDED, &ha->dpc_flags); - set_bit(RESET_MARKER_NEEDED, &ha->dpc_flags); - -- if( ha->loop_state != LOOP_DOWN ) { -- atomic_set(&ha->loop_down_timer, -- LOOP_DOWN_TIME); -- ha->loop_state = LOOP_DOWN; -+ if (atomic_read(&ha->loop_state) != LOOP_DOWN) { -+ atomic_set(&ha->loop_state, LOOP_DOWN); -+ atomic_set(&ha->loop_down_timer, -+ LOOP_DOWN_TIME); - qla2x00_mark_all_devices_lost(ha); - } - ha->operating_mode = LOOP; -@@ -11202,12 +10659,12 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - set_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags); - #endif - -- if (ha->loop_state != LOOP_DOWN) { -+ if (atomic_read(&ha->loop_state) != LOOP_DOWN) { - if (!atomic_read(&ha->loop_down_timer)) - atomic_set(&ha->loop_down_timer, -- LOOP_DOWN_TIME); -+ LOOP_DOWN_TIME); - -- ha->loop_state = LOOP_DOWN; -+ atomic_set(&ha->loop_state, LOOP_DOWN); - qla2x00_mark_all_devices_lost(ha); - } - break; -@@ -11224,9 +10681,9 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - "MBA_UPDATE_CONFIG.\n", - ha->host_no, __func__);) - -- if (ha->loop_state != LOOP_DOWN) { -+ if (atomic_read(&ha->loop_state) != LOOP_DOWN) { - /* dg - 03/30 */ -- ha->loop_state = LOOP_DOWN; -+ atomic_set(&ha->loop_state, LOOP_DOWN); - if (!atomic_read(&ha->loop_down_timer)) - atomic_set(&ha->loop_down_timer, - LOOP_DOWN_TIME); -@@ -11247,7 +10704,7 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - * to come in. - */ - -- if (ha->loop_state == LOOP_DOWN) { -+ if (atomic_read(&ha->loop_state) == LOOP_DOWN) { - printk(KERN_INFO "scsi(%ld): Port database " - "changed.\n", - ha->host_no); -@@ -11256,6 +10713,8 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - "MBA_PORT_UPDATE.\n", - ha->host_no, __func__);) - -+ set_bit(FDMI_REGISTER_NEEDED, &ha->fdmi_flags); -+ - /* dg - 06/19/01 - * - * Mark all devices as missing so we will -@@ -11264,7 +10723,7 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - ha->flags.rscn_queue_overflow = 1; - - atomic_set(&ha->loop_down_timer, 0); -- ha->loop_state = LOOP_UP; -+ atomic_set(&ha->loop_state, LOOP_UP); - qla2x00_mark_all_devices_lost(ha); - set_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags); - set_bit(LOCAL_LOOP_UPDATE, &ha->dpc_flags); -@@ -11273,7 +10732,7 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - * - * ha->flags.loop_resync_needed = TRUE; - */ -- ha->loop_state = LOOP_UPDATE; -+ atomic_set(&ha->loop_state, LOOP_UPDATE); - if (ha->ioctl->flags & - IOCTL_AEN_TRACKING_ENABLE) { - /* Update AEN queue. */ -@@ -11295,10 +10754,11 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - ha->host_no, - mailbox[1], - mailbox[2]);) -- -- DEBUG3(printk("scsi%ld %s: asynchronous " -- "MBA_RSCR_UPDATE.\n", -- ha->host_no, __func__);) -+ printk(KERN_INFO "scsi(%ld): RSCN database changed " -+ "-0x%x,0x%x.\n", -+ ha->host_no, -+ mailbox[1], -+ mailbox[2]); - - rscn_queue_index = ha->rscn_in_ptr + 1; - if (rscn_queue_index == MAX_RSCN_COUNT) -@@ -11327,13 +10787,12 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - atomic_set(&ha->loop_down_timer, 0); - ha->flags.management_server_logged_in = 0; - -- ha->loop_state = LOOP_UPDATE; -+ atomic_set(&ha->loop_state, LOOP_UPDATE); - if (ha->ioctl->flags & -- IOCTL_AEN_TRACKING_ENABLE) { -+ IOCTL_AEN_TRACKING_ENABLE) { - /* Update AEN queue. */ - qla2x00_enqueue_aen(ha, -- MBA_RSCN_UPDATE, -- &mailbox[0]); -+ MBA_RSCN_UPDATE, &mailbox[0]); - } - break; - -@@ -11345,6 +10804,7 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - - break; - -+ - default: - - if (temp1 >= MBA_ASYNC_EVENT) -@@ -11366,14 +10826,13 @@ qla2x00_isr(scsi_qla_host_t *ha, uint16_ - "ERROR.\n", - __func__);) - } -- DEBUG5(printk("%s(): Returning mailbox data\n", -+ DEBUG3(printk("%s(): Returning mailbox data\n", - __func__);) - break; - } - } else { - WRT_REG_WORD(®->host_cmd, HC_CLR_RISC_INT); - } -- - #if defined(ISP2300) - response_queue_int: - #endif -@@ -11425,6 +10884,42 @@ qla2x00_rst_aen(scsi_qla_host_t *ha) - - LEAVE(__func__); - } -+ -+static void qla2x00_handle_RIO_type2_iocb(struct scsi_qla_host * ha, response_t *pkt) -+{ -+ struct rio_iocb_type2_entry *rio; -+ int i; -+ ENTER("qla2x00_handle_RIO_type2_iocb"); -+ -+ rio = (struct rio_iocb_type2_entry *) pkt; -+ -+ if (rio->handle_count > 29) { -+ printk("Invalid packet 22 count: %i \n", rio->handle_count); -+ } -+ -+ for (i=0; i < rio->handle_count; i++) -+ qla2x00_process_good_request(ha, rio->handle[i], 0x22); -+ LEAVE("qla2x00_handle_RIO_type2_iocb"); -+} -+ -+static void qla2x00_handle_RIO_type1_iocb(struct scsi_qla_host * ha, response_t *pkt) -+{ -+ struct rio_iocb_type1_entry *rio; -+ int i; -+ ENTER("qla2x00_handle_RIO_type1_iocb"); -+ -+ rio = (struct rio_iocb_type1_entry *) pkt; -+ -+ if (rio->handle_count > 14) { -+ printk("Invalid packet 21 count! %i\n", rio->handle_count); -+ } -+ -+ for (i=0; i < rio->handle_count; i++) -+ qla2x00_process_good_request(ha, rio->handle[i], 0x22); -+ LEAVE("qla2x00_handle_RIO_type1_iocb"); -+ -+} -+ - /* - * qla2x00_process_response_queue - * Processes Response Queue. -@@ -11443,10 +10938,9 @@ qla2x00_process_response_queue(scsi_qla_ - while (ha->response_ring_ptr->signature != RESPONSE_PROCESSED ) { - pkt = ( sts_entry_t *) ha->response_ring_ptr; - -- DEBUG5(printk("%s(): ha->rsp_ring_index=%ld index=%ld.\n", -+ DEBUG5(printk("%s(): ha->rsp_ring_index=%ld.\n", - __func__, -- (u_long)ha->rsp_ring_index, -- (u_long)index);) -+ (u_long)ha->rsp_ring_index)); - DEBUG5(printk("%s(): response packet data:", __func__);) - DEBUG5(qla2x00_dump_buffer((uint8_t *)pkt, - RESPONSE_ENTRY_SIZE);) -@@ -11473,6 +10967,7 @@ qla2x00_process_response_queue(scsi_qla_ - __func__);) - qla2x00_error_entry(ha, pkt); - ((response_t *)pkt)->signature = RESPONSE_PROCESSED; -+ wmb(); - continue; - } - -@@ -11504,7 +10999,7 @@ qla2x00_process_response_queue(scsi_qla_ - - case ET_IP_RECEIVE: - /* Handle IP receive packet */ -- qla2x00_ip_receive(ha, pkt); -+ qla2x00_ip_receive(ha, (request_t *)pkt); - break; - - case ET_MAILBOX_COMMAND: -@@ -11514,6 +11009,12 @@ qla2x00_process_response_queue(scsi_qla_ - break; - } - #endif /* FC_IP_SUPPORT */ -+ case RIO_IOCB_TYPE1: -+ qla2x00_handle_RIO_type1_iocb(ha, (response_t*)pkt); -+ break; -+ case RIO_IOCB_TYPE2: -+ qla2x00_handle_RIO_type2_iocb(ha, (response_t*)pkt); -+ break; - - default: - /* Type Not Supported. */ -@@ -11527,13 +11028,16 @@ qla2x00_process_response_queue(scsi_qla_ - break; - } - ((response_t *)pkt)->signature = RESPONSE_PROCESSED; -+ wmb(); - } - - /* Adjust ring index -- once, instead of for all entries. */ - #if defined(ISP2100) || defined(ISP2200) - WRT_REG_WORD(®->mailbox5, ha->rsp_ring_index); -+ CACHE_FLUSH(®->mailbox5); - #else - WRT_REG_WORD(®->rsp_q_out, ha->rsp_ring_index); -+ CACHE_FLUSH(®->rsp_q_out); - #endif - - LEAVE(__func__); -@@ -11587,6 +11091,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha - uint8_t lscsi_status; - fc_port_t *fcport; - scsi_qla_host_t *vis_ha; -+ uint16_t rsp_info_len; - - - ENTER(__func__); -@@ -11664,20 +11169,13 @@ qla2x00_status_entry(scsi_qla_host_t *ha - tq = sp->tgt_queue; - lq = sp->lun_queue; - --#ifdef PERF_MONITORING -- /* update stats */ -- lq->resp_time += jiffies - sp->u_start; -- lq->act_time += jiffies - sp->r_start; --#endif -- - /* - * 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)) { -+ if (!(sp->flags & (SRB_IOCTL | SRB_TAPE | SRB_FDMI_CMD)) && -+ (atomic_read(&ha->loop_down_timer) || -+ atomic_read(&ha->loop_state) != LOOP_READY) && -+ (comp_status != CS_COMPLETE || scsi_status != 0)) { - - DEBUG2(printk(KERN_INFO "scsi(%ld:%d:%d:%d): Loop Not Ready - pid=%lx.\n", - ha->host_no, -@@ -11693,6 +11191,24 @@ qla2x00_status_entry(scsi_qla_host_t *ha - return; - } - -+ /* Check for any FCP transport errors. */ -+ if (scsi_status & SS_RESPONSE_INFO_LEN_VALID) { -+ rsp_info_len = le16_to_cpu(pkt->rsp_info_len); -+ if (rsp_info_len > 3 && pkt->rsp_info[3]) { -+ DEBUG2(printk("scsi(%ld:%d:%d:%d) FCP I/O protocol " -+ "failure (%x/%02x%02x%02x%02x%02x%02x%02x%02x)..." -+ "retrying command\n", ha->host_no, b, t, l, -+ rsp_info_len, pkt->rsp_info[0], pkt->rsp_info[1], -+ pkt->rsp_info[2], pkt->rsp_info[3], -+ pkt->rsp_info[4], pkt->rsp_info[5], -+ pkt->rsp_info[6], pkt->rsp_info[7])); -+ -+ cp->result = DID_BUS_BUSY << 16; -+ add_to_done_queue(ha, sp); -+ return; -+ } -+ } -+ - /* - * Based on Host and scsi status generate status code for Linux - */ -@@ -11705,7 +11221,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha - if (scsi_status == 0) { - CMD_RESULT(cp) = DID_OK << 16; - --#ifndef __VMWARE__ - /* - * Special case consideration On an Inquiry - * command (0x12) for Lun 0, device responds -@@ -11716,7 +11231,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha - */ - /* Perform any post command processing */ - qla2x00_filter_command(ha, sp); --#endif - } else { /* Check for non zero scsi status */ - if (lscsi_status == SS_BUSY_CONDITION) { - CMD_RESULT(cp) = DID_BUS_BUSY << 16 | -@@ -11761,9 +11275,10 @@ qla2x00_status_entry(scsi_qla_host_t *ha - if (sp->request_sense_length != 0) - ha->status_srb = sp; - -- if (!(sp->flags & SRB_IOCTL) && -- qla2x00_check_sense(cp, lq) == -- QL_STATUS_SUCCESS) { -+ if (!(sp->flags & (SRB_IOCTL | -+ SRB_TAPE | SRB_FDMI_CMD)) && -+ qla2x00_check_sense(cp, lq) == -+ QL_STATUS_SUCCESS) { - /* - * Throw away status_cont - * if any -@@ -11772,7 +11287,8 @@ qla2x00_status_entry(scsi_qla_host_t *ha - add_to_scsi_retry_queue(ha, sp); - return; - } --#if defined(QL_DEBUG_LEVEL_5) -+#if defined(QL_DEBUG_LEVEL_2) -+ if (sense_sz) { - printk("%s(): Check condition Sense " - "data, scsi(%ld:%d:%d:%d) " - "cmd=%p pid=%ld\n", -@@ -11780,10 +11296,10 @@ qla2x00_status_entry(scsi_qla_host_t *ha - ha->host_no, - b, t, l, - cp, cp->serial_number); -- if (sense_sz) - qla2x00_dump_buffer( - cp->sense_buffer, - CMD_ACTUAL_SNSLEN(cp)); -+ } - #endif - } - } -@@ -11848,21 +11364,23 @@ qla2x00_status_entry(scsi_qla_host_t *ha - if (sp->request_sense_length != 0) - ha->status_srb = sp; - -- if (!(sp->flags & SRB_IOCTL) && -- (qla2x00_check_sense(cp, lq) == -- QL_STATUS_SUCCESS)) { -+ if (!(sp->flags & (SRB_IOCTL | -+ SRB_TAPE | SRB_FDMI_CMD)) && -+ (qla2x00_check_sense(cp, lq) == -+ QL_STATUS_SUCCESS)) { - ha->status_srb = NULL; - add_to_scsi_retry_queue(ha,sp); - return; - } --#if defined(QL_DEBUG_LEVEL_5) -+#if defined(QL_DEBUG_LEVEL_2) -+ if (sense_sz) { - printk("scsi: Check condition Sense " - "data, scsi(%ld:%d:%d:%d)\n", - ha->host_no, b, t, l); -- if (sense_sz) - qla2x00_dump_buffer( - cp->sense_buffer, - CMD_ACTUAL_SNSLEN(cp)); -+ } - #endif - } - } else { -@@ -11916,7 +11434,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha - /* Everybody online, looking good... */ - CMD_RESULT(cp) = DID_OK << 16; - --#ifndef __VMWARE__ - /* - * Special case consideration On an Inquiry - * command (0x12) for Lun 0, device responds -@@ -11927,7 +11444,6 @@ qla2x00_status_entry(scsi_qla_host_t *ha - */ - /* Perform any post command processing */ - qla2x00_filter_command(ha, sp); --#endif - } - break; - -@@ -11950,18 +11466,32 @@ qla2x00_status_entry(scsi_qla_host_t *ha - 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 { -+ DEBUG2(printk( "scsi(%ld:%2d:%2d): 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 | SRB_TAPE | -+ SRB_FDMI_CMD)) || (atomic_read(&fcport->state) == -+ FC_DEVICE_DEAD)) { -+ CMD_RESULT(cp) = DID_NO_CONNECT << 16; -+ add_to_done_queue(ha, sp); -+ if (atomic_read(&ha->loop_state) == LOOP_DOWN) -+ sp->err_id = SRB_ERR_LOOP; -+ else -+ sp->err_id = SRB_ERR_PORT; -+ } 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); -+ qla2x00_mark_device_lost(ha, fcport, 1); - } - - return; -@@ -11975,7 +11505,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha - comp_status, - scsi_status);) - -- if (sp->flags & SRB_IOCTL) { -+ if (sp->flags & (SRB_IOCTL | SRB_TAPE | SRB_FDMI_CMD)) { - CMD_RESULT(cp) = DID_RESET << 16; - } - else { -@@ -12025,17 +11555,15 @@ qla2x00_status_entry(scsi_qla_host_t *ha - "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); -+ fcport->loop_id);) -+ qla2x00_mark_device_lost(ha, fcport, 1); - } - break; - - case CS_QUEUE_FULL: - - -- printk(KERN_INFO -+ DEBUG2(printk(KERN_INFO - "scsi(%ld:%d:%d): QUEUE FULL status detected " - "0x%x-0x%x, pid=%ld.\n", - ha->host_no, -@@ -12043,7 +11571,7 @@ qla2x00_status_entry(scsi_qla_host_t *ha - l, - comp_status, - scsi_status, -- sp->cmd->serial_number); -+ sp->cmd->serial_number)); - /* - * SCSI Mid-Layer handles device queue full - */ -@@ -12083,10 +11611,11 @@ qla2x00_status_entry(scsi_qla_host_t *ha - - break; - } /* end of switch comp_status */ -- - /* Place command on done queue. */ -- if (ha->status_srb == NULL) -+ if (ha->status_srb == NULL){ -+ - add_to_done_queue(ha, sp); -+ } - - LEAVE(__func__); - } -@@ -12164,9 +11693,6 @@ STATIC void - qla2x00_error_entry(scsi_qla_host_t *ha, sts_entry_t *pkt) - { - srb_t *sp; --#ifdef PERF_MONITORING -- os_lun_t *lq; --#endif - - ENTER(__func__); - -@@ -12198,12 +11724,6 @@ qla2x00_error_entry(scsi_qla_host_t *ha, - ha->actthreads--; - sp->lun_queue->out_cnt--; - ha->iocb_cnt -= sp->iocb_cnt; --#ifdef PERF_MONITORING -- /* update stats */ -- lq = sp->lun_queue; -- lq->resp_time += jiffies - sp->u_start; -- lq->act_time += jiffies - sp->r_start; --#endif - - sp->flags |= SRB_ISP_COMPLETED; - -@@ -12234,6 +11754,7 @@ qla2x00_error_entry(scsi_qla_host_t *ha, - LEAVE(__func__); - } - -+ - STATIC void - qla2x00_ms_entry(scsi_qla_host_t *ha, ms_iocb_entry_t *pkt) - { -@@ -12302,6 +11823,9 @@ qla2x00_restart_queues(scsi_qla_host_t * - 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_TAPE)) -+ continue; - /* - * When time expire return request back to OS as BUSY - */ -@@ -12372,11 +11896,7 @@ qla2x00_restart_queues(scsi_qla_host_t * - } - - if (!list_empty(&ha->done_queue)) --#if QLA2X_PERFORMANCE -- tasklet_schedule(&ha->run_qla_task); --#else - qla2x00_done(ha); --#endif - - LEAVE(__func__); - } -@@ -12424,6 +11944,32 @@ qla2x00_abort_queues(scsi_qla_host_t *ha - LEAVE(__func__); - } - -+void -+qla2x00_ioctl_error_recovery(scsi_qla_host_t *ha) -+{ -+ int return_status; -+ unsigned long flags; -+ -+ printk(KERN_INFO -+ "%s(%ld) issuing device reset\n", __func__,ha->host_no); -+ if (!ha->ioctl_err_cmd) { -+ printk("%s(%ld) should not occur\n", __func__, ha->host_no); -+ return; -+ } -+ -+ spin_lock_irqsave(&io_request_lock, flags); -+ return_status = qla2xxx_eh_device_reset(ha->ioctl_err_cmd); -+ if (return_status != SUCCESS){ -+ printk("%s(%ld) elevation to host_reset\n", -+ __func__, ha->host_no); -+ return_status = qla2xxx_eh_host_reset(ha->ioctl_err_cmd); -+ printk("%s(%ld) return_status=%x\n", __func__, ha->host_no, -+ return_status); -+ } -+ ha->ioctl_err_cmd = NULL ; -+ spin_unlock_irqrestore(&io_request_lock, flags); -+} -+ - - /* - * qla2x00_reset_lun_fo_counts -@@ -12491,12 +12037,84 @@ qla2x00_failover_cleanup(srb_t *sp) - - CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; - CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; -+ if( (sp->flags & SRB_GOT_SENSE ) ) { -+ sp->flags &= ~SRB_GOT_SENSE; -+ sp->cmd->sense_buffer[0] = 0; -+ } - - /* turn-off all failover flags */ - sp->flags = sp->flags & ~(SRB_RETRY|SRB_FAILOVER|SRB_FO_CANCEL); - } - - -+void qla2x00_find_all_active_ports(srb_t *sp) -+{ -+ scsi_qla_host_t *ha = qla2x00_hostlist; -+ fc_port_t *fcport; -+ fc_lun_t *fclun; -+ fc_lun_t *orig_fclun; -+ -+ DEBUG2(printk(KERN_INFO "%s: Scanning for active ports... %d\n", -+ __func__, sp->lun_queue->fclun->lun);) -+ orig_fclun = sp->lun_queue->fclun; -+ for ( ; (ha != NULL); ha=ha->next) { -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (fcport->port_type != FCT_TARGET ) -+ continue; -+ if ( (fcport->flags & (FC_EVA_DEVICE|FC_MSA_DEVICE)) ) { -+ list_for_each_entry(fclun, &fcport->fcluns, list) { -+ if (fclun->flags & FC_VISIBLE_LUN) -+ continue; -+ if (orig_fclun->lun != fclun->lun) -+ continue; -+ qla2x00_test_active_lun(fcport,fclun); -+ } -+ } -+ if ( (fcport->flags & FC_MSA_DEVICE) ) -+ qla2x00_test_active_port(fcport); -+ } -+ } -+ DEBUG2(printk(KERN_INFO "%s: Scanning ports...Done\n", -+ __func__);) -+} -+ -+ -+int qla2x00_suspend_failover_targets(scsi_qla_host_t *ha) -+{ -+ unsigned long flags; -+ struct list_head *list, *temp; -+ srb_t *sp; -+ int count; -+ os_tgt_t *tq; -+ -+ spin_lock_irqsave(&ha->list_lock, flags); -+ count = ha->failover_cnt; -+ list_for_each_safe(list, temp, &ha->failover_queue) { -+ sp = list_entry(ha->failover_queue.next, srb_t, list); -+ tq = sp->tgt_queue; -+ if( !(test_bit(TGT_SUSPENDED, &tq->q_flags)) ) -+ set_bit(TGT_SUSPENDED, &tq->q_flags); -+ } -+ spin_unlock_irqrestore(&ha->list_lock,flags); -+ -+ return count; -+} -+ -+srb_t * -+qla2x00_failover_next_request(scsi_qla_host_t *ha) -+{ -+ unsigned long flags; -+ srb_t *sp = NULL; -+ -+ spin_lock_irqsave(&ha->list_lock, flags); -+ if (!list_empty(&ha->failover_queue)) { -+ sp = list_entry(ha->failover_queue.next, srb_t, list); -+ __del_from_failover_queue(ha, sp); -+ } -+ spin_unlock_irqrestore(&ha->list_lock, flags); -+ return( sp ); -+} -+ - /* - * qla2x00_process_failover - * Process any command on the failover queue. -@@ -12515,75 +12133,106 @@ qla2x00_process_failover(scsi_qla_host_t - 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; -+ scsi_qla_host_t *vis_ha = ha; -+ int count, i; - -- DEBUG(printk("%s(): Processing failover for hba %ld\n", -+ DEBUG2(printk(KERN_INFO "%s: hba %ld active=%ld, retry=%d, " -+ "done=%ld, failover=%d, scsi retry=%d commands.\n", - __func__, -- ha->host_no);) -+ ha->host_no, -+ ha->actthreads, -+ ha->retry_q_cnt, -+ ha->done_q_cnt, -+ ha->failover_cnt, -+ ha->scsi_retry_q_cnt);) - -- /* -- * 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); -+ /* Prevent acceptance of new I/O requests for failover target. */ -+ count = qla2x00_suspend_failover_targets(ha); - - /* -- * Get first entry to find our visible adapter. We could never get -- * here if the list is empty -+ * Process all the commands in the failover queue. Attempt to failover -+ * then either complete the command as is or requeue for retry. - */ -- list = ha->failover_queue.next; -- sp = list_entry(list, srb_t, list); -- vis_ha = (scsi_qla_host_t *) sp->cmd->host->hostdata; -- list_for_each_safe(list, temp, &ha->failover_queue) { -- sp = list_entry(list, srb_t, list); -- -+ for( i = 0; i < count ; i++ ) { -+ sp = qla2x00_failover_next_request(ha); -+ if( sp == NULL ) -+ break; -+ qla2x00_extend_timeout(sp->cmd, 360); -+ if( i == 0 ) { -+ vis_ha = (scsi_qla_host_t *) sp->cmd->host->hostdata; -+ } - tq = sp->tgt_queue; - lq = sp->lun_queue; - fcport = lq->fclun->fcport; -- -- /* Remove srb from failover queue. */ -- __del_from_failover_queue(ha, sp); -- -- DEBUG3(printk("%s(): pid %ld retrycnt=%d\n", -+ DEBUG(printk("%s(): pid %ld retrycnt=%d," -+ "fcport =%p, state=0x%x, \nloop state=0x%x" -+ " fclun=%p, lq fclun=%p, lq=%p, lun=%d\n", - __func__, - sp->cmd->serial_number, -- sp->cmd->retries);) -- -+ sp->cmd->retries, -+ fcport, -+ atomic_read(&fcport->state), -+ atomic_read(&ha->loop_state), -+ sp->fclun, lq->fclun, lq, lq->fclun->lun);) -+ if ( sp->err_id == SRB_ERR_DEVICE && -+ sp->fclun == lq->fclun && -+ atomic_read(&fcport->state) == FC_ONLINE) { -+ if( !(qla2x00_test_active_lun(fcport, sp->fclun)) ) { -+ DEBUG2(printk("scsi(%ld) %s Detected INACTIVE Port 0x%02x \n", -+ ha->host_no,__func__,fcport->loop_id);) -+ sp->err_id = SRB_ERR_OTHER; -+ sp->cmd->sense_buffer[2] = 0; -+ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; -+ } -+ } -+ if( (sp->flags & SRB_GOT_SENSE ) ) { -+ sp->flags &= ~SRB_GOT_SENSE; -+ sp->cmd->sense_buffer[0] = 0; -+ CMD_RESULT(sp->cmd) = DID_BUS_BUSY << 16; -+ CMD_HANDLE(sp->cmd) = (unsigned char *) NULL; -+ } - /*** 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) { -+ ( sp->err_id != SRB_ERR_OTHER && -+ atomic_read(&fcport->ha->loop_state) -+ != LOOP_DEAD && -+ 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. -+ * We ran out of paths, so just retry the status which -+ * is already set in the cmd. We want to serialize the -+ * failovers, so we make them go thur visible HBA. - */ - printk(KERN_INFO -- "%s(): Ran out of paths - pid %ld\n", -+ "%s(): Ran out of paths - pid %ld - retrying\n", - __func__, - 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); -+ add_to_done_queue(ha, sp); -+ } - - for (t = 0; t < vis_ha->max_targets; t++) { - if ((tq = vis_ha->otgt[t]) == NULL) - continue; -+ if( test_and_clear_bit(TGT_SUSPENDED, &tq->q_flags) ) { -+ /* EMPTY */ -+ DEBUG2(printk("%s(): remove suspend for " -+ "target %d\n", -+ __func__, -+ t);) -+ } - for (l = 0; l < vis_ha->max_luns; l++) { - if ((lq = (os_lun_t *) tq->olun[l]) == NULL) - continue; -@@ -12596,12 +12245,11 @@ qla2x00_process_failover(scsi_qla_host_t - lq->fclun->lun);) - } - } -- } -+ } - -- //qla2x00_restart_queues(ha,TRUE); - qla2x00_restart_queues(ha, FALSE); - -- DEBUG(printk("%s() - done", __func__);) -+ DEBUG2(printk("%s() - done\n", __func__);) - } - - /* -@@ -12623,7 +12271,7 @@ qla2x00_loop_resync(scsi_qla_host_t *ha) - - DEBUG(printk("%s(): entered\n", __func__);) - -- ha->loop_state = LOOP_UPDATE; -+ atomic_set(&ha->loop_state, LOOP_UPDATE); - qla2x00_stats.loop_resync++; - ha->total_loop_resync++; - clear_bit(ISP_ABORT_RETRY, &ha->dpc_flags); -@@ -12631,7 +12279,7 @@ qla2x00_loop_resync(scsi_qla_host_t *ha) - if (!(status = qla2x00_fw_ready(ha))) { - do { - /* v2.19.05b6 */ -- ha->loop_state = LOOP_UPDATE; -+ atomic_set(&ha->loop_state, LOOP_UPDATE); - - /* - * Issue marker command only when we are going -@@ -12679,12 +12327,13 @@ qla2x00_loop_resync(scsi_qla_host_t *ha) - STATIC uint16_t - qla2x00_debounce_register(volatile uint16_t *addr) - { -- volatile uint16_t ret; -- volatile uint16_t ret2; -+ uint16_t ret; -+ uint16_t ret2; - - do { - ret = RD_REG_WORD(addr); - barrier(); -+ cpu_relax(); - ret2 = RD_REG_WORD(addr); - } while (ret != ret2); - -@@ -12719,7 +12368,7 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) - /* Pause RISC. */ - WRT_REG_WORD(®->host_cmd, HC_PAUSE_RISC); - #if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+ if (check_all_device_ids(ha)) { - UDELAY(10); - } else { - for (cnt = 0; cnt < 30000; cnt++) { -@@ -12750,7 +12399,20 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) - 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 - - /* Select RISC module registers. */ - WRT_REG_WORD(®->ctrl_status, 0); -@@ -12764,7 +12426,7 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) - WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); - - #if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+ if (check_all_device_ids(ha)) { - UDELAY(10); - } else { - /* Wait for RISC to recover from reset. */ -@@ -12789,7 +12451,7 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) - WRT_REG_WORD(®->host_cmd, HC_RELEASE_RISC); - - #if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+ if (check_all_device_ids(ha)) { - UDELAY(10); - } else { - for (cnt = 0; cnt < 30000; cnt++) { -@@ -12846,12 +12508,8 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) - - /* Reset ISP chip. */ - WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); -- -- /* -- * Delay after reset, for chip to recover. Otherwise causes system -- * PANIC -- */ -- mdelay(2); -+ /* Delay after reset, for chip to recover. */ -+ udelay(20); - - for (cnt = 30000; cnt; cnt--) { - if (!(RD_REG_WORD(®->ctrl_status) & CSR_ISP_SOFT_RESET)) -@@ -12885,7 +12543,7 @@ qla2x00_reset_chip(scsi_qla_host_t *ha) - * This routine will wait for fabric devices for - * the reset delay. - */ --static void qla2x00_check_fabric_devices(scsi_qla_host_t *ha) -+void qla2x00_check_fabric_devices(scsi_qla_host_t *ha) - { - uint16_t fw_state; - -@@ -13001,22 +12659,6 @@ qla2x00_display_fc_names(scsi_qla_host_t - tgt, - tq->d_id.b24); - 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 -@@ -13250,179 +12892,6 @@ qla2x00_get_properties(scsi_qla_host_t * - } - - /* -- * 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("qla2x00: Found device - " -- "nodename=%02x%02x%02x%02x%02x%02x%02x%02x, " -- "portname=%02x%02x%02x%02x%02x%02x%02x%02x, " -- "port Id=%06x, loop id=%04x\n", -- 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.b24, 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("qla2x00: Reusing slot %d " -- "for device " -- "%02x%02x%02x%02x%02x%02x%02x%02x\n", -- 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("qla2x00: New slot %d for device " -- "%02x%02x%02x%02x%02x%02x%02x%02x\n", -- 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("qla2x00: Assigned slot %d " -- "reuse for device " -- "%02x%02x%02x%02x%02x%02x%02x%02x\n", -- 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_device_resync - * Marks devices in the database that needs resynchronization. - * -@@ -13435,11 +12904,9 @@ qla2x00_update_fc_database(scsi_qla_host - 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; -+ fc_port_t *fcport; - - ENTER(__func__); - -@@ -13484,44 +12951,19 @@ qla2x00_device_resync(scsi_qla_host_t *h - } - - /* 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("qla%d: RSCN port @ " -- "slot %d " -- "port_id=%06x\n", -- (int)ha->instance, -- index, -- ha->fc_db[index].d_id.b24);) -- } -- } -- } -- -- 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) -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if ((fcport->flags & FC_FABRIC_DEVICE) == 0 || -+ (fcport->d_id.b24 & mask) != dev.d_id.b24 || -+ fcport->port_type == FCT_BROADCAST) - continue; - -- fcinitiator->loop_id |= PORT_LOST_ID; -- fcinitiator->d_id.b24 = 0; -+ if (atomic_read(&fcport->state) == FC_ONLINE) { -+ if (dev.format != 3 || -+ fcport->port_type != FCT_INITIATOR) { -+ atomic_set(&fcport->state, -+ FC_DEVICE_LOST); -+ } -+ } - } - } - -@@ -13529,63 +12971,314 @@ qla2x00_device_resync(scsi_qla_host_t *h - } - - /* -- * qla2x00_configure_fabric -- * Setup SNS devices with loop ID's. -+ * qla2x00_find_new_loop_id -+ * Scan through our port list and find a new usable loop ID. - * - * Input: -- * ha = adapter block pointer. -+ * ha: adapter state pointer. -+ * dev: port structure pointer. - * - * Returns: -- * 0 = success. -- * BIT_0 = error -- * BIT_1 = database was full and device was not configured. -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. - */ --#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) -+int -+qla2x00_find_new_loop_id(scsi_qla_host_t *ha, fc_port_t *dev) - { -- uint8_t rval = 0; -- uint8_t rval1; -- uint8_t local_flags = 0; -- sns_cmd_rsp_t *sns; -- uint8_t tmp_name[8]; -- fcdev_t dev; -- uint16_t i, index, found_cnt; -- dma_addr_t phys_address = 0; -- 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; -+ int rval; -+ int found; -+ fc_port_t *fcport; -+ uint16_t first_loop_id; - -- ENTER(__func__); -+ rval = QL_STATUS_SUCCESS; - -- DEBUG2(printk(KERN_INFO "scsi%ld: Enter qla2x00_configure_fabric: hba=%p\n", -- ha->host_no, ha);) -+ /* Save starting loop ID. */ -+ first_loop_id = dev->loop_id; - -- /* 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(KERN_INFO "%s(): MBC_GET_PORT_NAME Failed, No FL Port\n", -- __func__);) -+ for (;;) { -+ /* Skip loop ID if already used by adapter. */ -+ if (dev->loop_id == ha->loop_id) { -+ dev->loop_id++; -+ } - -- ha->device_flags &= ~SWITCH_FOUND; -- return (0); -- } -+ /* Skip reserved loop IDs. */ -+ while (RESERVED_LOOP_ID(dev->loop_id)) { -+ dev->loop_id++; -+ } - -- ha->device_flags |= SWITCH_FOUND; -+ /* Reset loop ID if passed the end. */ -+ if (dev->loop_id > SNS_LAST_LOOP_ID) { -+ /* first loop ID. */ -+ dev->loop_id = ha->min_external_loopid; -+ } - -- /* 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); -+ /* Check for loop ID being already in use. */ -+ found = 0; -+ fcport = NULL; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (fcport->loop_id == dev->loop_id && fcport != dev) { -+ /* ID possibly in use */ -+ found++; -+ break; -+ } -+ } - -- sns = pci_alloc_consistent(ha->pdev, -- sizeof(sns_cmd_rsp_t), -- &phys_address); -- if (sns == NULL) { -- printk(KERN_WARNING -+ /* If not in use then it is free to use. */ -+ if (!found) { -+ break; -+ } -+ -+ /* ID in use. Try next value. */ -+ dev->loop_id++; -+ -+ /* If wrap around. No free ID to use. */ -+ if (dev->loop_id == first_loop_id) { -+ dev->loop_id = FC_NO_LOOP_ID; -+ rval = QL_STATUS_ERROR; -+ break; -+ } -+ } -+ -+ return (rval); -+} -+ -+/* -+ * qla2x00_fabric_dev_login -+ * Login fabric target device and update FC port database. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * fcport: port structure list pointer. -+ * next_loopid: contains value of a new loop ID that can be used -+ * by the next login attempt. -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+static int -+qla2x00_fabric_dev_login(scsi_qla_host_t *ha, fc_port_t *fcport, -+ uint16_t *next_loopid) -+{ -+ int rval; -+ int retry; -+ -+ rval = QL_STATUS_SUCCESS; -+ retry = 0; -+ -+ rval = qla2x00_fabric_login(ha, fcport, next_loopid); -+ if (rval == QL_STATUS_SUCCESS) { -+ rval = qla2x00_get_port_database(ha, fcport, BIT_1 | BIT_0); -+ if (rval != QL_STATUS_SUCCESS) { -+ qla2x00_fabric_logout(ha, fcport->loop_id); -+ } else { -+ qla2x00_update_fcport(ha, fcport); -+ } -+ } -+ -+ return (rval); -+} -+ -+/* -+ * 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 -+ */ -+static uint8_t -+qla2x00_fabric_login(scsi_qla_host_t *ha, fc_port_t *fcport, -+ uint16_t *next_loopid) -+{ -+ int rval; -+ int retry; -+ uint16_t tmp_loopid; -+ uint16_t mb[MAILBOX_REGISTER_COUNT]; -+ -+ retry = 0; -+ tmp_loopid = 0; -+ -+ for (;;) { -+ DEBUG(printk("scsi(%ld): Trying Fabric Login w/loop id 0x%04x " -+ "for port %02x%02x%02x.\n", -+ ha->host_no, fcport->loop_id, fcport->d_id.b.domain, -+ fcport->d_id.b.area, fcport->d_id.b.al_pa)); -+ -+ /* Login fcport on switch. */ -+ qla2x00_login_fabric(ha, fcport->loop_id, -+ fcport->d_id.b.domain, fcport->d_id.b.area, -+ fcport->d_id.b.al_pa, mb, BIT_0); -+ if (mb[0] == MBS_PORT_ID_USED) { -+ /* -+ * Device has another loop ID. The firmware team -+ * recommends us to perform an implicit login with the -+ * specified ID again. The ID we just used is save here -+ * so we return with an ID that can be tried by the -+ * next login. -+ */ -+ retry++; -+ tmp_loopid = fcport->loop_id; -+ fcport->loop_id = mb[1]; -+ -+ DEBUG(printk("Fabric Login: port in use - next " -+ "loop id=0x%04x, port Id=%02x%02x%02x.\n", -+ fcport->loop_id, fcport->d_id.b.domain, -+ fcport->d_id.b.area, fcport->d_id.b.al_pa)); -+ -+ } else if (mb[0] == MBS_COMMAND_COMPLETE) { -+ /* -+ * Login succeeded. -+ */ -+ if (retry) { -+ /* A retry occurred before. */ -+ *next_loopid = tmp_loopid; -+ } else { -+ /* -+ * No retry occurred before. Just increment the -+ * ID value for next login. -+ */ -+ *next_loopid = (fcport->loop_id + 1); -+ } -+ -+ if (mb[1] & BIT_0) { -+ fcport->port_type = FCT_INITIATOR; -+ } else { -+ fcport->port_type = FCT_TARGET; -+ if (mb[1] & BIT_1) { -+ fcport->flags |= FC_TAPE_DEVICE; -+ } -+ } -+ -+ rval = QL_STATUS_SUCCESS; -+ break; -+ } else if (mb[0] == MBS_LOOP_ID_USED) { -+ /* -+ * Loop ID already used, try next loop ID. -+ */ -+ fcport->loop_id++; -+ rval = qla2x00_find_new_loop_id(ha, fcport); -+ if (rval != QL_STATUS_SUCCESS) { -+ /* Ran out of loop IDs to use */ -+ break; -+ } -+ } else if (mb[0] == MBS_CMD_ERR) { -+ /* -+ * Firmware possibly timed out during login. If NO -+ * retries are left to do then the device is declared -+ * dead. -+ */ -+ *next_loopid = fcport->loop_id; -+ qla2x00_fabric_logout(ha, fcport->loop_id); -+ fcport->loop_id = FC_NO_LOOP_ID; -+ if (mb[1] == MBS_SC_TOPOLOGY_ERR){ -+ printk(KERN_INFO "%s:HBA trying to log " -+ "through FL_Port\n", __func__); -+ DEBUG2(printk(KERN_INFO "%s:HBA trying to log " -+ "through FL_Port\n", __func__);) -+ -+ atomic_set(&fcport->state, FC_DEVICE_DEAD); -+ } -+ -+ rval = 3; -+ break; -+ } else { -+ /* -+ * unrecoverable / not handled error -+ */ -+ DEBUG2(printk("%s(%ld): failed=%x port_id=%02x%02x%02x " -+ "loop_id=%x jiffies=%lx.\n", -+ __func__, ha->host_no, mb[0], -+ fcport->d_id.b.domain, fcport->d_id.b.area, -+ fcport->d_id.b.al_pa, fcport->loop_id, jiffies)); -+ -+ /* Trying to log into more than 8 Target */ -+ if(mb[0] == MBS_ALL_LOOP_IDS_IN_USE){ -+ printk(KERN_INFO "%s:No more loop ids\n" -+ ,__func__); -+ DEBUG2(printk("%s:No more loop ids\n" -+ ,__func__);) -+ } -+ *next_loopid = fcport->loop_id; -+ qla2x00_fabric_logout(ha, fcport->loop_id); -+ fcport->loop_id = FC_NO_LOOP_ID; -+ atomic_set(&fcport->state, FC_DEVICE_DEAD); -+ -+ rval = 1; -+ break; -+ } -+ } -+ -+ return (rval); -+} -+ -+/* -+ * 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 SNS_LAST_LOOP_ID + 1 -+ -+STATIC uint8_t -+qla2x00_configure_fabric(scsi_qla_host_t *ha) -+{ -+ uint8_t rval = 0; -+ uint8_t rval1; -+ sns_cmd_rsp_t *sns; -+ uint8_t tmp_name[8]; -+ dma_addr_t phys_address = 0; -+ uint16_t tmp_loop_id; -+ uint16_t tmp_topo; -+ fc_port_t *fcport, *fcptemp; -+ uint16_t next_loopid; -+ LIST_HEAD(new_fcports); -+#if REG_FC4_ENABLED -+ uint16_t mb[MAILBOX_REGISTER_COUNT]; -+#endif -+ -+ ENTER(__func__); -+ -+ DEBUG2(printk(KERN_INFO "scsi(%ld): Enter qla2x00_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(KERN_INFO "%s(): MBC_GET_PORT_NAME Failed, No FL Port\n", -+ __func__);) -+ -+ ha->device_flags &= ~SWITCH_FOUND; -+ return (0); -+ } -+ -+ ha->device_flags |= SWITCH_FOUND; -+ -+ /* 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); -+ -+ sns = pci_alloc_consistent(ha->pdev, -+ sizeof(sns_cmd_rsp_t), -+ &phys_address); -+ if (sns == NULL) { -+ printk(KERN_WARNING - "qla(%ld): Memory Allocation failed - sns.\n", - ha->host_no); - ha->mem_err++; -@@ -13596,9 +13289,38 @@ qla2x00_configure_fabric(scsi_qla_host_t - - /* Mark devices that need re-synchronization. */ - qla2x00_device_resync(ha); -- found_cnt = 0; - do { -+#if REG_FDMI_ENABLED -+ /* FDMI support */ -+ /* login to management server */ -+ if (!ha->init_done) { -+ if (test_and_clear_bit(FDMI_REGISTER_NEEDED, -+ &ha->fdmi_flags)) { -+ if (qla2x00_mgmt_svr_login(ha) != -+ QL_STATUS_SUCCESS) { -+ DEBUG2(printk("%s(%ld): failed MS " -+ "server login.\n", __func__, -+ ha->host_no);) -+ } else { -+ /* use mbx commands to send commands */ -+ qla2x00_fdmi_register(ha); -+ } -+ } -+ } -+#endif -+ - #if REG_FC4_ENABLED -+ /* Ensure we are logged into the SNS. */ -+ qla2x00_login_fabric(ha, SIMPLE_NAME_SERVER, 0xff, 0xff, 0xfc, -+ mb, BIT_0); -+ if (mb[0] != MBS_COMMAND_COMPLETE) { -+ printk(KERN_INFO "scsi(%ld): Failed SNS login: " -+ "loop_id=%x mb[0]=%x mb[1]=%x mb[2]=%x mb[6]=%x " -+ "mb[7]=%x\n", ha->host_no, SIMPLE_NAME_SERVER, -+ mb[0], mb[1], mb[2], mb[6], mb[7]); -+ return (QL_STATUS_ERROR); -+ } -+ - if (test_and_clear_bit(REGISTER_FC4_NEEDED, &ha->dpc_flags)) { - if (qla2x00_register_fc4(ha, sns, phys_address)) { - /* EMPTY */ -@@ -13632,21 +13354,8 @@ qla2x00_configure_fabric(scsi_qla_host_t - } - } - #endif -- new_dev_list = kmalloc( MAX_FIBRE_DEVICES * -- sizeof(struct new_dev), GFP_ATOMIC); -- if( new_dev_list == NULL ){ -- printk("%s Failed to allocate memory for" -- "New Device List\n",__func__); -- rval = BIT_0 ; -- break; -- }else { -- memset(new_dev_list , 0 , -- MAX_FIBRE_DEVICES * sizeof(struct new_dev)); -- rval = qla2x00_find_all_fabric_devs(ha, -- sns, phys_address, -- new_dev_list, &new_dev_cnt, -- &local_flags); -- } -+ rval = qla2x00_find_all_fabric_devs(ha, sns, phys_address, -+ &new_fcports); - if (rval != 0) - break; - -@@ -13654,150 +13363,95 @@ qla2x00_configure_fabric(scsi_qla_host_t - * 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); -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) -+ break; - -- if ((fcinitiator->loop_id & PORT_LOST_ID) == 0) -+ if ((fcport->flags & FC_FABRIC_DEVICE) == 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); -- } -- --#if 0 -- /* -- * Wait for all remaining IO's to finish if there was logout. -- */ -- if (local_flags & LOGOUT_PERFORMED) { -- local_flags &= ~LOGOUT_PERFORMED; -- -- if (ha->init_done) { -- if (!(ha->dpc_flags & COMMAND_WAIT_ACTIVE)) { -- ha->dpc_flags |= COMMAND_WAIT_ACTIVE; -- -- qla2x00_cmd_wait(ha); -- -- ha->dpc_flags &= ~COMMAND_WAIT_ACTIVE; -+ if (atomic_read(&fcport->state) == FC_DEVICE_LOST) { -+ qla2x00_mark_device_lost(ha, fcport, -+ ql2xplogiabsentdevice); -+ -+ if (fcport->loop_id != FC_NO_LOOP_ID && -+ (fcport->flags & FC_TAPE_DEVICE) == 0 && -+ fcport->port_type != FCT_INITIATOR && -+ fcport->port_type != FCT_BROADCAST) { -+ -+ qla2x00_fabric_logout(ha, -+ fcport->loop_id); -+ fcport->loop_id = FC_NO_LOOP_ID; - } - } - } --#endif -+ -+ /* Starting free loop ID. */ -+ next_loopid = ha->min_external_loopid; - - /* -- * Scan through our database and login entries already in our -- * database. -+ * Scan through our port list and login entries that need to be -+ * logged in. - */ -- for (index = 0; index < MAX_FIBRE_DEVICES && -- !atomic_read(&ha->loop_down_timer) && -- !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); index++) { -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (atomic_read(&ha->loop_down_timer) || -+ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) -+ break; - -- if (!(ha->fc_db[index].loop_id & PORT_LOGIN_NEEDED)) -+ if ((fcport->flags & FC_FABRIC_DEVICE) == 0 || -+ (fcport->flags & FC_LOGIN_NEEDED) == 0) - 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) -+ if (fcport->loop_id == FC_NO_LOOP_ID) { -+ fcport->loop_id = next_loopid; -+ rval = qla2x00_find_new_loop_id(ha, fcport); -+ if (rval != QL_STATUS_SUCCESS) { -+ /* Ran out of IDs to use */ - break; -+ } - } - -- dev.d_id.b24 = ha->fc_db[index].d_id.b24; -+ /* Login and update database */ -+ qla2x00_fabric_dev_login(ha, fcport, &next_loopid); -+ } - -- /* login and update database */ -- if (qla2x00_fabric_login(ha, &dev) == 0) { -- ha->fc_db[index].loop_id = dev.loop_id; -- found_cnt++; -- } -+ /* Exit if out of loop IDs. */ -+ if (rval != QL_STATUS_SUCCESS) { -+ break; - } - - /* -- * Scan through new device list and login and add to our -- * database. -+ * Login and add the new devices to our port list. - */ -- for (index = 0; index < new_dev_cnt && -- !atomic_read(&ha->loop_down_timer) && -- !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); -- index++) { -- -- if (new_dev_list[index].ignore) -- continue; -- -- 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) -+ list_for_each_entry_safe(fcport, fcptemp, &new_fcports, list) { -+ if (atomic_read(&ha->loop_down_timer) || -+ test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) - break; - -- DEBUG(printk("%s(): calling qla2100_fabric_login()\n", -- __func__);) -+ /* Find a new loop ID to use. */ -+ fcport->loop_id = next_loopid; -+ rval = qla2x00_find_new_loop_id(ha, fcport); -+ if (rval != QL_STATUS_SUCCESS) { -+ /* Ran out of IDs to use */ -+ break; -+ } - -- if (qla2x00_fabric_login(ha, &dev) == 0) { -- found_cnt++; -- if ((rval = -- qla2x00_update_fc_database(ha, -- &dev, -- enable_slot_reuse)) ) { -+ /* Login and update database */ -+ qla2x00_fabric_dev_login(ha, fcport, &next_loopid); - -- qla2x00_fabric_logout(ha, dev.loop_id); -- ha->fabricid[i].in_use = FALSE; -- break; -- } -- } -+ /* Remove device from the new list and add it to DB */ -+ list_del(&fcport->list); -+ list_add_tail(&fcport->list, &ha->fcports); - } -- } while(0); -+ } while (0); - - pci_free_consistent(ha->pdev, sizeof(sns_cmd_rsp_t), sns, phys_address); - -- if( new_dev_list != NULL ){ -- kfree(new_dev_list); -- } -+ /* Free all new device structures not processed. */ -+ list_for_each_entry_safe(fcport, fcptemp, &new_fcports, list) { -+ list_del(&fcport->list); -+ kfree(fcport); -+ } - - if (rval) { - DEBUG2(printk(KERN_INFO "%s(%ld): error exit: rval=%d\n", -@@ -13806,9 +13460,6 @@ qla2x00_configure_fabric(scsi_qla_host_t - rval);) - } else { - /* EMPTY */ -- DEBUG2(if (found_cnt)) -- DEBUG2(printk(KERN_INFO "scsi%ld Found (%d) ports\n", -- ha->host_no, found_cnt);) - DEBUG2(printk(KERN_INFO "scsi%ld: %s: exit\n", ha->host_no, __func__);) - } - -@@ -13838,38 +13489,54 @@ qla2x00_configure_fabric(scsi_qla_host_t - * Kernel context. - */ - static uint8_t --qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, -- sns_cmd_rsp_t *sns, dma_addr_t phys_addr, -- struct new_dev *new_dev_list, uint16_t *new_dev_cnt, uint8_t *flags) -+qla2x00_find_all_fabric_devs(scsi_qla_host_t *ha, sns_cmd_rsp_t *sns, -+ dma_addr_t phys_addr, struct list_head *new_fcports) - { -- fcdev_t first_dev, dev; - uint8_t rval = 0; -- uint8_t use_gan = 0; -- uint8_t wrap_around; /* device list */ - uint16_t i; -- uint16_t index, device_index = 0; -- uint16_t new_cnt; - uint16_t public_count; -- uint16_t initiator; -- struct list_head *fcil; -- fc_initiator_t *fcinitiator; -+ -+ fc_port_t *fcport, *new_fcport, *tmp_fcport = NULL; -+ int found; -+ sw_info_t *swl; -+ int swl_idx; -+ int first_dev, last_dev; -+ port_id_t wrap; - - - ENTER(__func__); -+ - /* Try GNN_FT to get the list of SCSI type devices */ -- if (qla2x00_gnn_ft(ha, sns, phys_addr, -- new_dev_list, SCSI_TYPE) != QL_STATUS_SUCCESS){ -- use_gan = 1; -- printk(KERN_INFO "%s GNN_FT Failed-Try" -- " issuing GAN \n",__func__); -- }else if(qla2x00_gpn_id(ha, sns, phys_addr, -- new_dev_list) != QL_STATUS_SUCCESS) { -- use_gan = 1; -- printk(KERN_INFO "%s GPN_ID Failed-Try" -- " issuing GAN \n",__func__); -+ swl = kmalloc(sizeof(sw_info_t) * MAX_FIBRE_DEVICES, GFP_ATOMIC); -+ if (swl == NULL) { -+ /*EMPTY*/ -+ DEBUG2(printk("scsi(%ld): GNN_FT allocations failed, fallback " -+ "on GAN\n", ha->host_no)); -+ } else { -+ memset(swl, 0 ,MAX_FIBRE_DEVICES * sizeof (sw_info_t)); -+ if (qla2x00_gnn_ft(ha, sns, phys_addr, swl, SCSI_TYPE) != -+ QL_STATUS_SUCCESS) { -+ kfree(swl); -+ swl = NULL; -+ } else if (qla2x00_gpn_id(ha, sns, phys_addr, swl) != -+ QL_STATUS_SUCCESS) { -+ kfree(swl); -+ swl = NULL; -+ } -+ } -+ -+ /* Allocate temporary fcport for any new fcports discovered. */ -+ new_fcport = qla2x00_alloc_fcport(ha, GFP_KERNEL); -+ if (new_fcport == NULL) { -+ if (swl) -+ kfree(swl); -+ return (QL_STATUS_ERROR); - } -+ new_fcport->flags |= FC_FABRIC_DEVICE; -+ new_fcport->flags |= FC_LOGIN_NEEDED; -+ - #if defined(ISP2100) -- ha->max_public_loop_ids = LAST_SNS_LOOP_ID - SNS_FIRST_LOOP_ID + 1; -+ ha->max_public_loop_ids = SNS_LAST_LOOP_ID - SNS_FIRST_LOOP_ID + 1; - #else - ha->max_public_loop_ids = MAX_PUBLIC_LOOP_IDS; - #endif -@@ -13887,84 +13554,74 @@ qla2x00_find_all_fabric_devs(scsi_qla_ho - #endif - - /* Set start port ID scan at adapter ID. */ -- dev.d_id.b24 = 0; -- first_dev.d_id.b24 = 0; -- wrap_around = FALSE ; /* device list */ -+ swl_idx = 0; -+ first_dev = 1; -+ last_dev = 0; - -- new_cnt = 0; /* new device count */ -- -- DEBUG2(printk(KERN_INFO "%s(%ld): use_gan=%d dpc_flags=0x%lx\n", -- __func__, ha->host_no, use_gan, ha->dpc_flags);) -+ DEBUG2(printk(KERN_INFO "%s(%ld): dpc_flags=0x%lx\n", -+ __func__, ha->host_no, ha->dpc_flags);) - - for (i = 0; - i < public_count && !atomic_read(&ha->loop_down_timer) && - !(test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)); i++) { - -- if( ! use_gan ){ -- if (wrap_around){ -- dev.d_id.b24 = first_dev.d_id.b24; -- }else{ -- new_dev_list[device_index].ignore++; -- dev.d_id.b24 = -- new_dev_list[device_index].d_id.b24; -- memcpy(dev.name , -- new_dev_list[device_index].name, WWN_SIZE); -- memcpy(dev.wwn , -- new_dev_list[device_index].wwn, WWN_SIZE); -- -- /* Last Device */ -- if ( new_dev_list[device_index].d_id.b.rsvd_1 -- != 0) { -- wrap_around = TRUE; -+ if (swl != NULL) { -+ if (last_dev) { -+ wrap.b24 = new_fcport->d_id.b24; -+ } else { -+ new_fcport->d_id.b24 = swl[swl_idx].d_id.b24; -+ memcpy(new_fcport->node_name, -+ swl[swl_idx].node_name, WWN_SIZE); -+ memcpy(new_fcport->port_name, -+ swl[swl_idx].port_name, WWN_SIZE); -+ -+ if (swl[swl_idx].d_id.b.rsvd_1 != 0) { -+ last_dev = 1; - } - -- device_index++; -+ swl_idx++; - } - } else { - /* Send GAN to the switch */ - rval = 0; -- if (qla2x00_gan(ha, sns, phys_addr, &dev)) { -+ if (qla2x00_gan(ha, sns, phys_addr, new_fcport)) { - rval = rval | BIT_0; - break; - } - } - - /* If wrap on switch device list, exit. */ -- if (dev.d_id.b24 == first_dev.d_id.b24) -+ if (first_dev) { -+ wrap.b24 = new_fcport->d_id.b24; -+ first_dev = 0; -+ } else if (new_fcport->d_id.b24 == wrap.b24){ -+ DEBUG(printk("%s switch device list wrapped\n" -+ ,__func__);) - break; -+ } - - DEBUG(printk("scsi(%ld): found fabric(%d) - " - "port Id=%06x\n", - ha->host_no, - i, -- dev.d_id.b24);) -- -- if (first_dev.d_id.b24 == 0) -- first_dev.d_id.b24 = dev.d_id.b24; -+ new_fcport->d_id.b24);) - -- if(use_gan){ -- /* If port type not equal to N or NL port, skip it. */ -- if (sns->p.gan_rsp[16] != 1 -- && sns->p.gan_rsp[16] != 2) { -- continue; /* needed for McData switch */ -- } -- } - - /* Bypass if host adapter. */ -- if (dev.d_id.b24 == ha->d_id.b24) -+ if (new_fcport->d_id.b24 == ha->d_id.b24) - continue; - - /* Bypass reserved domain fields. */ -- if ((dev.d_id.b.domain & 0xf0) == 0xf0) -+ if ((new_fcport->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)) -+ if ((new_fcport->d_id.b24 & 0xffff00) == -+ (ha->d_id.b24 & 0xffff00)) - continue; -- - #if defined(FC_IP_SUPPORT) - /* Check for IP device */ -- if(use_gan){ -+ if(swl == NULL){ - if (sns->p.gan_rsp[579] & 0x20) { - /* Found IP device */ - DEBUG12(printk("qla%ld: IP fabric WWN: " -@@ -13982,179 +13639,100 @@ qla2x00_find_all_fabric_devs(scsi_qla_ho - } - #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) -+ /* Locate matching device in database. */ -+ found = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (memcmp(new_fcport->port_name, fcport->port_name, -+ WWN_SIZE)) - continue; - -- initiator = TRUE; -- DEBUG(printk("qla%ld: found host " -- "%02x%02x%02x%02x%02x%02x%02x%02x, " -- "port Id=%06x\n", -- ha->instance, -- 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.b24);) -+ found++; - - /* -- * If the initiator was marked as lost, perform the -- * required logout and relogin the initiator by -- * assuming a new device. -+ * If device was not a fabric device before. - */ -- if ((fcinitiator->loop_id & PORT_LOST_ID) == 0) -+ if ((fcport->flags & FC_FABRIC_DEVICE) == 0) { -+ fcport->d_id.b24 = new_fcport->d_id.b24; -+ fcport->loop_id = FC_NO_LOOP_ID; -+ fcport->flags |= FC_LOGIN_NEEDED; -+ fcport->flags |= FC_FABRIC_DEVICE; - 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; -- -- rval = 1; -- switch (ha->binding_type) { -- case BIND_BY_PORT_NAME: -- rval = memcmp(dev.wwn, -- ha->fc_db[index].wwn, WWN_SIZE); -- break; -- -- case BIND_BY_PORT_ID: -- rval = (dev.d_id.b24 != -- ha->fc_db[index].d_id.b24); -- break; -- -- case BIND_BY_NODE_NAME: -- rval = memcmp(dev.name, -- ha->fc_db[index].name, WWN_SIZE); -- break; - } -- if (rval) -- continue; - - /* -- * Update volatile unbound fields for PortID binding -- * only -+ * If address the same and state FCS_ONLINE, nothing -+ * changed. - */ -- 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("qla%ld: found fabric dev %d in tgt %d " -- "db, flags= 0x%x, loop_id=" -- "0x%04x, port=%06x, name=" -- "%02x%02x%02x%02x%02x%02x%02x%02x\n", -- ha->instance, -- i, index, -- ha->fc_db[index].flag, -- ha->fc_db[index].loop_id, -- ha->fc_db[index].d_id.b24, -- 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; -+ if (fcport->d_id.b24 == new_fcport->d_id.b24 && -+ atomic_read(&fcport->state) == FC_ONLINE) { - break; - } - - /* - * Port ID changed or device was marked to be updated; -- * logout and mark it for relogin later. -+ * Log it out if still logged in 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; -+ fcport->d_id.b24 = new_fcport->d_id.b24; -+ fcport->flags |= FC_LOGIN_NEEDED; -+ if (fcport->loop_id != FC_NO_LOOP_ID && -+ (fcport->flags & FC_TAPE_DEVICE) == 0 && -+ fcport->port_type != FCT_INITIATOR && -+ fcport->port_type != FCT_BROADCAST) { -+ qla2x00_fabric_logout(ha, fcport->loop_id); -+ fcport->loop_id = FC_NO_LOOP_ID; -+ } - - break; - } - -- if (index == MAX_FIBRE_DEVICES) { -- /* -- * Did not find a match in our database. This is a new -- * device. -- */ -- DEBUG3(printk("%s(): new device " -- "%02x%02x%02x%02x%02x%02x%02x%02x.\n", -- __func__, -- 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( use_gan){ -- memcpy(&new_dev_list[new_cnt], &dev, -- sizeof(struct new_dev)); -- } else { -- new_dev_list[device_index-1].ignore = 0; -- } -- new_cnt++; -+ if (found) -+ continue; -+ -+ /* If device was not in our fcports list, then add it. */ -+ list_add_tail(&new_fcport->list, new_fcports); -+ tmp_fcport = new_fcport; -+ -+ /* Allocate a new replacement fcport. */ -+ new_fcport = qla2x00_alloc_fcport(ha, GFP_KERNEL); -+ if (new_fcport == NULL) { -+ if (swl) -+ kfree(swl); -+ return (QL_STATUS_ERROR); - } -+ new_fcport->flags |= FC_FABRIC_DEVICE; -+ new_fcport->flags |= FC_LOGIN_NEEDED; -+ new_fcport->d_id.b24 = tmp_fcport->d_id.b24; - } - -- if (use_gan) { -- *new_dev_cnt = new_cnt; -- } else { -- *new_dev_cnt = device_index; -- } -+ if (swl) -+ kfree(swl); -+ -+ if (new_fcport) -+ kfree(new_fcport); - -- if (new_cnt > 0) -+ if (!list_empty(new_fcports)) - ha->device_flags |= DFLG_FABRIC_DEVICES; - - DEBUG(printk("%s(%ld): exit. rval=%d dpc_flags=0x%lx" -- " total_no_of_new_devices=%d. loop_down_timer=%i\n", -- __func__,ha->host_no,rval,ha->dpc_flags,new_cnt, -+ " loop_down_timer=%i\n", -+ __func__,ha->host_no,rval,ha->dpc_flags, - atomic_read(&ha->loop_down_timer));) -+ DEBUG2(printk(KERN_INFO "%s(%ld): exit. rval=%d dpc_flags=0x%lx" -+ " loop_down_timer=%i\n", -+ __func__,ha->host_no,rval,ha->dpc_flags, -+ atomic_read(&ha->loop_down_timer))); - - LEAVE(__func__); - - return (rval); - } - -+ -+#if REG_FDMI_ENABLED -+#include "qla_gs.c" -+#endif -+ - static __inline__ ms_iocb_entry_t * - qla2x00_prep_ms_iocb(scsi_qla_host_t *, uint32_t, uint32_t); - /** -@@ -14188,12 +13766,12 @@ qla2x00_prep_ms_iocb(scsi_qla_host_t *ha - 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_address[0] = cpu_to_le32(LSD(ha->ct_iu_dma)); -+ ms_pkt->dseg_req_address[1] = cpu_to_le32(MSD(ha->ct_iu_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_address[0] = cpu_to_le32(LSD(ha->ct_iu_dma)); -+ ms_pkt->dseg_rsp_address[1] = cpu_to_le32(MSD(ha->ct_iu_dma)); - ms_pkt->dseg_rsp_length = ms_pkt->rsp_bytecount; - - return (ms_pkt); -@@ -14250,8 +13828,8 @@ qla2x00_register_fc4(scsi_qla_host_t *ha - memset(sns, 0, sizeof(sns_cmd_rsp_t)); - wc = RFT_DATA_SIZE / 2; - sns->p.cmd.buffer_length = cpu_to_le16(wc); -- sns->p.cmd.buffer_address[0] = cpu_to_le32(LS_64BITS(phys_addr)); -- sns->p.cmd.buffer_address[1] = cpu_to_le32(MS_64BITS(phys_addr)); -+ sns->p.cmd.buffer_address[0] = cpu_to_le32(LSD(phys_addr)); -+ sns->p.cmd.buffer_address[1] = cpu_to_le32(MSD(phys_addr)); - sns->p.cmd.subcommand_length = __constant_cpu_to_le16(22); - sns->p.cmd.subcommand = __constant_cpu_to_le16(0x217); - wc = (RFT_DATA_SIZE - 16) / 4; -@@ -14315,8 +13893,8 @@ qla2x00_register_fc4_feature(scsi_qla_ho - memset(sns, 0, sizeof(sns_cmd_rsp_t)); - wc = RFF_DATA_SIZE / 2; - sns->p.cmd.buffer_length = cpu_to_le16(wc); -- sns->p.cmd.buffer_address[0] = cpu_to_le32(LS_64BITS(phys_addr)); -- sns->p.cmd.buffer_address[1] = cpu_to_le32(MS_64BITS(phys_addr)); -+ sns->p.cmd.buffer_address[0] = cpu_to_le32(LSD(phys_addr)); -+ sns->p.cmd.buffer_address[1] = cpu_to_le32(MSD(phys_addr)); - sns->p.cmd.subcommand_length = __constant_cpu_to_le16(8); - sns->p.cmd.subcommand = __constant_cpu_to_le16(0x21f); - wc = (RFF_DATA_SIZE - 16) / 4; -@@ -14377,8 +13955,8 @@ qla2x00_register_nn(scsi_qla_host_t *ha, - memset(sns, 0, sizeof(sns_cmd_rsp_t)); - wc = RNN_DATA_SIZE / 2; - sns->p.cmd.buffer_length = cpu_to_le16(wc); -- sns->p.cmd.buffer_address[0] = cpu_to_le32(LS_64BITS(phys_addr)); -- sns->p.cmd.buffer_address[1] = cpu_to_le32(MS_64BITS(phys_addr)); -+ sns->p.cmd.buffer_address[0] = cpu_to_le32(LSD(phys_addr)); -+ sns->p.cmd.buffer_address[1] = cpu_to_le32(MSD(phys_addr)); - sns->p.cmd.subcommand_length = __constant_cpu_to_le16(10); - sns->p.cmd.subcommand = __constant_cpu_to_le16(0x213); - wc = (RNN_DATA_SIZE - 16) / 4; -@@ -14437,6 +14015,7 @@ qla2x00_register_snn(scsi_qla_host_t *ha - uint8_t version[20]; - - ms_iocb_entry_t *ms_pkt; -+ struct ct_sns_pkt *ct_iu; - struct ct_sns_req *ct_req; - struct ct_sns_rsp *ct_rsp; - qla_boards_t *bdp; -@@ -14444,10 +14023,12 @@ qla2x00_register_snn(scsi_qla_host_t *ha - ENTER(__func__); - - /* 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){ -+ ha->ms_iocb = pci_alloc_consistent(ha->pdev, -+ sizeof(ms_iocb_entry_t), &ha->ms_iocb_dma); -+ } - -- if( ha->ms_iocb == NULL){ -+ if (ha->ms_iocb == NULL){ - /* error */ - printk(KERN_WARNING - "scsi(%ld): Memory Allocation failed - ms_iocb\n", -@@ -14457,10 +14038,13 @@ qla2x00_register_snn(scsi_qla_host_t *ha - } - 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){ -+ /* Get consistent memory allocated for CT SNS command */ -+ if (ha->ct_iu == NULL) { -+ ha->ct_iu = pci_alloc_consistent(ha->pdev, -+ sizeof(struct ct_sns_pkt), &ha->ct_iu_dma); -+ } -+ -+ if( ha->ct_iu == NULL){ - /* error */ - printk(KERN_WARNING - "scsi(%ld): Memory Allocation failed - ct_sns\n", -@@ -14469,7 +14053,7 @@ qla2x00_register_snn(scsi_qla_host_t *ha - return (rval) ; - } - -- memset(ha->ct_sns, 0, sizeof(struct ct_sns_pkt)); -+ memset(ha->ct_iu, 0, sizeof(struct ct_sns_pkt)); - - /* Prepare common MS IOCB- Request size adjusted - * after CT preparation */ -@@ -14477,8 +14061,9 @@ qla2x00_register_snn(scsi_qla_host_t *ha - 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; -+ ct_iu = (struct ct_sns_pkt *)ha->ct_iu; -+ ct_req = &ct_iu->p.req; -+ ct_rsp = &ct_iu->p.rsp; - - /* Initialize Name Server CT-Command header */ - qla2x00_prep_nsrv_ct_cmd_hdr(ct_req,RSNN_NN_CMD,RSNN_NN_RSP_SIZE); -@@ -14528,11 +14113,11 @@ qla2x00_register_snn(scsi_qla_host_t *ha - __func__ ,ha->host_no)); - } - pci_free_consistent(ha->pdev, -- sizeof(struct ct_sns_pkt), ha->ct_sns, ha->ct_sns_dma); -+ sizeof(struct ct_sns_pkt), ha->ct_iu, ha->ct_iu_dma); - pci_free_consistent(ha->pdev, - sizeof(ms_iocb_entry_t), ha->ms_iocb, ha->ms_iocb_dma); - -- ha->ct_sns = NULL; -+ ha->ct_iu = NULL; - ha->ms_iocb = NULL; - - LEAVE(__func__); -@@ -14562,7 +14147,7 @@ qla2x00_register_snn(scsi_qla_host_t *ha - */ - static uint8_t - qla2x00_gnn_ft(scsi_qla_host_t *ha, sns_cmd_rsp_t *sns, dma_addr_t phys_addr, -- struct new_dev *new_dev_list , uint32_t protocol) -+ sw_info_t *swl , uint32_t protocol) - { - uint8_t rval = BIT_0 ; - uint16_t wc; -@@ -14570,63 +14155,65 @@ qla2x00_gnn_ft(scsi_qla_host_t *ha, sns - - ENTER(__func__); - -- /* Retry GNNFT till valid list or retries exhausted- -- * Default value of retry_gnnft: 10 -- */ -- while( retry_count++ < retry_gnnft ) { -+ /* Retry GNNFT till valid list or retries exhausted - Default value of -+ * retry_gnnft: 10 */ -+ while (retry_count++ < retry_gnnft) { - /* Get Node Name and Port Id for device on SNS. */ - memset(sns, 0, sizeof(sns_cmd_rsp_t)); - wc = GNNFT_DATA_SIZE / 2; /* Size in 16 bit words*/ - sns->p.cmd.buffer_length = cpu_to_le16(wc); -- sns->p.cmd.buffer_address[0] = -- cpu_to_le32(LS_64BITS(phys_addr)); -- sns->p.cmd.buffer_address[1] = -- cpu_to_le32(MS_64BITS(phys_addr)); -+ sns->p.cmd.buffer_address[0] = cpu_to_le32(LSD(phys_addr)); -+ sns->p.cmd.buffer_address[1] = cpu_to_le32(MSD(phys_addr)); - sns->p.cmd.subcommand_length = __constant_cpu_to_le16(6); - sns->p.cmd.subcommand = -- __constant_cpu_to_le16(0x173); /* GNN_FT */ -+ __constant_cpu_to_le16(0x173); /* GNN_FT */ - wc = (GNNFT_DATA_SIZE - 16) / 4; /* Size in 32 bit words */ - sns->p.cmd.size = cpu_to_le16(wc); - sns->p.cmd.param[0] = protocol; /* SCSI Type : 0x8 */ - - rval = BIT_0; - if (!qla2x00_send_sns(ha, phys_addr, GNNFT_CMD_SIZE / 2, -- sizeof(sns_cmd_rsp_t))) { -- if (sns->p.gnnft_rsp[8] == 0x80 -- && sns->p.gnnft_rsp[9] == 0x2) { -+ sizeof(sns_cmd_rsp_t))) { -+ if (sns->p.gnnft_rsp[8] == 0x80 && -+ sns->p.gnnft_rsp[9] == 0x2) { - - uint32_t i,j; - -- /* Set port IDs and Node Name in new device list. */ -- for (i = 16, j = 0; i < GNNFT_DATA_SIZE; -- i += 16, j++) { -- new_dev_list[j].d_id.b.domain = -- sns->p.gnnft_rsp[i + 1]; -- new_dev_list[j].d_id.b.area = -- sns->p.gnnft_rsp[i + 2]; -- new_dev_list[j].d_id.b.al_pa = -- sns->p.gnnft_rsp[i + 3]; -+ /* -+ * Set port IDs and Node Name in new device -+ * list. -+ */ -+ for (i = 16, j = 0; i < GNNFT_DATA_SIZE; -+ i += 16, j++) { -+ swl[j].d_id.b.domain = -+ sns->p.gnnft_rsp[i + 1]; -+ swl[j].d_id.b.area = -+ sns->p.gnnft_rsp[i + 2]; -+ swl[j].d_id.b.al_pa = -+ sns->p.gnnft_rsp[i + 3]; - /* Extract Nodename */ -- memcpy(new_dev_list[j].name, -- &sns->p.gnnft_rsp[i + 8], WWN_SIZE); -+ memcpy(swl[j].node_name, -+ &sns->p.gnnft_rsp[i + 8], WWN_SIZE); -+ -+ DEBUG2(printk(KERN_INFO -+ "qla2x00: gnn_ft entry - " -+ "nodename " -+ "%02x%02x%02x%02x%02x%02x%02x%02x " -+ "port Id=%06x\n", -+ sns->p.gnnft_rsp[i+8], -+ sns->p.gnnft_rsp[i+9], -+ sns->p.gnnft_rsp[i+10], -+ sns->p.gnnft_rsp[i+11], -+ sns->p.gnnft_rsp[i+12], -+ sns->p.gnnft_rsp[i+13], -+ sns->p.gnnft_rsp[i+14], -+ sns->p.gnnft_rsp[i+15], -+ swl[j].d_id.b24)); - -- DEBUG2(printk(KERN_INFO "qla2x00: gnn_ft entry - " -- "nodename " -- "%02x%02x%02x%02x%02x%02x%02x%02x " -- "port Id=%06x\n", -- sns->p.gnnft_rsp[i+8], -- sns->p.gnnft_rsp[i+9], -- sns->p.gnnft_rsp[i+10], -- sns->p.gnnft_rsp[i+11], -- sns->p.gnnft_rsp[i+12], -- sns->p.gnnft_rsp[i+13], -- sns->p.gnnft_rsp[i+14], -- sns->p.gnnft_rsp[i+15], new_dev_list[j].d_id.b24);) -- - /* Last one exit. */ - if (sns->p.gnnft_rsp[i] & BIT_7) { -- new_dev_list[j].d_id.b.rsvd_1 = -- sns->p.gnnft_rsp[i]; -+ swl[j].d_id.b.rsvd_1 = -+ sns->p.gnnft_rsp[i]; - rval = 0; - break; - } -@@ -14634,15 +14221,17 @@ qla2x00_gnn_ft(scsi_qla_host_t *ha, sns - /* Successfully completed,no need to - * retry any more */ - break; -- }else{ -- DEBUG2(printk(KERN_INFO "%s(%ld): GNN_FT retrying" -- "retry_count=%d\n", -- __func__,ha->host_no,retry_count);) -- // DEBUG2(qla2x00_dump_buffer( -- // (uint8_t *)sns->p.gnnft_rsp, -- // GNNFT_DATA_SIZE);) -+ } else{ -+ DEBUG2(printk(KERN_INFO -+ "%s(%ld): GNN_FT retrying retry_count=%d\n", -+ __func__,ha->host_no,retry_count)); -+ -+ DEBUG5(qla2x00_dump_buffer( -+ (uint8_t *)sns->p.gnnft_rsp, -+ GNNFT_DATA_SIZE);) - } - } -+ - /* Wait for 1ms before retrying */ - udelay(10000); - } /* end of while */ -@@ -14655,7 +14244,6 @@ qla2x00_gnn_ft(scsi_qla_host_t *ha, sns - LEAVE(__func__); - - return (rval); -- - } - - /* -@@ -14675,8 +14263,8 @@ qla2x00_gnn_ft(scsi_qla_host_t *ha, sns - * Kernel context. - */ - static uint8_t --qla2x00_gpn_id(scsi_qla_host_t *ha, sns_cmd_rsp_t *sns, dma_addr_t phys_addr, -- struct new_dev *new_dev_list) -+qla2x00_gpn_id(scsi_qla_host_t *ha, sns_cmd_rsp_t *sns, dma_addr_t phys_addr, -+ sw_info_t *swl) - { - uint8_t rval = BIT_0 ; - uint16_t wc; -@@ -14691,10 +14279,10 @@ qla2x00_gpn_id(scsi_qla_host_t *ha, sns - memset(sns, 0, sizeof(sns_cmd_rsp_t)); - wc = GPN_DATA_SIZE / 2; /* Size in 16 bit words*/ - sns->p.cmd.buffer_length = cpu_to_le16(wc); -- sns->p.cmd.buffer_address[0] -- = cpu_to_le32(LS_64BITS(phys_addr)); -- sns->p.cmd.buffer_address[1] -- = cpu_to_le32(MS_64BITS(phys_addr)); -+ sns->p.cmd.buffer_address[0] = -+ cpu_to_le32(LSD(phys_addr)); -+ sns->p.cmd.buffer_address[1] = -+ cpu_to_le32(MSD(phys_addr)); - sns->p.cmd.subcommand_length - = __constant_cpu_to_le16(6); - sns->p.cmd.subcommand -@@ -14703,45 +14291,46 @@ qla2x00_gpn_id(scsi_qla_host_t *ha, sns - wc = (GPN_DATA_SIZE - 16) / 4; - /* Size in 32 bit words */ - sns->p.cmd.size = cpu_to_le16(wc); -- sns->p.cmd.param[0] = new_dev_list[i].d_id.b.al_pa; -- sns->p.cmd.param[1] = new_dev_list[i].d_id.b.area; -- sns->p.cmd.param[2] = new_dev_list[i].d_id.b.domain; -+ sns->p.cmd.param[0] = swl[i].d_id.b.al_pa; -+ sns->p.cmd.param[1] = swl[i].d_id.b.area; -+ sns->p.cmd.param[2] = swl[i].d_id.b.domain; - - rval = BIT_0; - if (!qla2x00_send_sns(ha, phys_addr, GPN_CMD_SIZE / 2, - sizeof(sns_cmd_rsp_t))) { -- if (sns->p.gpn_rsp[8] == 0x80 && -- sns->p.gpn_rsp[9] == 0x2) { -+ if (sns->p.gpn_rsp[8] == 0x80 && -+ sns->p.gpn_rsp[9] == 0x2) { - /* Extract Portname */ -- memcpy(new_dev_list[i].wwn, -- &sns->p.gpn_rsp[16], WWN_SIZE); -+ memcpy(swl[i].port_name, -+ &sns->p.gpn_rsp[16], WWN_SIZE); - -- DEBUG2(printk(KERN_INFO "qla2x00: gpn entry -" -- " portname " -- "%02x%02x%02x%02x%02x%02x%02x%02x " -- "port Id=%06x\n", -- sns->p.gpn_rsp[16], sns->p.gpn_rsp[17], -- sns->p.gpn_rsp[18], sns->p.gpn_rsp[19], -- sns->p.gpn_rsp[20], sns->p.gpn_rsp[21], -- sns->p.gpn_rsp[22], sns->p.gpn_rsp[23], -- new_dev_list[i].d_id.b24);) -+ DEBUG2(printk(KERN_INFO -+ "qla2x00: gpn entry - portname " -+ "%02x%02x%02x%02x%02x%02x%02x%02x " -+ "port Id=%06x\n", -+ sns->p.gpn_rsp[16], -+ sns->p.gpn_rsp[17], -+ sns->p.gpn_rsp[18], -+ sns->p.gpn_rsp[19], -+ sns->p.gpn_rsp[20], -+ sns->p.gpn_rsp[21], -+ sns->p.gpn_rsp[22], -+ sns->p.gpn_rsp[23], -+ swl[i].d_id.b24);) - - rval = 0; - break; - - } -- }else{ -- DEBUG2(printk(KERN_INFO "%s(%ld): GPN_ID retrying" -- "retry_count=%d\n", -- __func__,ha->host_no,retry_gpnid);) -- // DEBUG2(qla2x00_dump_buffer( -- // (uint8_t *)sns->p.gpn_rsp, -- // GPN_DATA_SIZE);) -+ } else { -+ DEBUG2(printk(KERN_INFO -+ "%s(%ld): GPN_ID retrying retry_count=%d\n", -+ __func__,ha->host_no,retry_gpnid);) - } - } /* end of while */ - - /* Last one exit. */ -- if ( new_dev_list[i].d_id.b.rsvd_1 != 0) { -+ if (swl[i].d_id.b.rsvd_1 != 0) { - break; - } - } /* end of for */ -@@ -14772,9 +14361,8 @@ qla2x00_gpn_id(scsi_qla_host_t *ha, sns - * Kernel context. - */ - static uint8_t --qla2x00_gan(scsi_qla_host_t *ha, -- sns_cmd_rsp_t *sns, -- dma_addr_t phys_addr, fcdev_t *dev) -+qla2x00_gan(scsi_qla_host_t *ha, sns_cmd_rsp_t *sns, dma_addr_t phys_addr, -+ fc_port_t *fcport) - { - uint8_t rval; - uint16_t wc; -@@ -14785,38 +14373,41 @@ qla2x00_gan(scsi_qla_host_t *ha, - memset(sns, 0, sizeof(sns_cmd_rsp_t)); - wc = GAN_DATA_SIZE / 2; - sns->p.cmd.buffer_length = cpu_to_le16(wc); -- sns->p.cmd.buffer_address[0] = cpu_to_le32(LS_64BITS(phys_addr)); -- sns->p.cmd.buffer_address[1] = cpu_to_le32(MS_64BITS(phys_addr)); -+ sns->p.cmd.buffer_address[0] = cpu_to_le32(LSD(phys_addr)); -+ sns->p.cmd.buffer_address[1] = cpu_to_le32(MSD(phys_addr)); - sns->p.cmd.subcommand_length = __constant_cpu_to_le16(6); - sns->p.cmd.subcommand = __constant_cpu_to_le16(0x100); /* GA_NXT */ - wc = (GAN_DATA_SIZE - 16) / 4; - sns->p.cmd.size = cpu_to_le16(wc); -- sns->p.cmd.param[0] = dev->d_id.b.al_pa; -- sns->p.cmd.param[1] = dev->d_id.b.area; -- sns->p.cmd.param[2] = dev->d_id.b.domain; -+ sns->p.cmd.param[0] = fcport->d_id.b.al_pa; -+ sns->p.cmd.param[1] = fcport->d_id.b.area; -+ sns->p.cmd.param[2] = fcport->d_id.b.domain; - - rval = BIT_0; - if (!qla2x00_send_sns(ha, phys_addr, 14, sizeof(sns_cmd_rsp_t))) { - if (sns->p.gan_rsp[8] == 0x80 && sns->p.gan_rsp[9] == 0x2) { -- dev->d_id.b.al_pa = sns->p.gan_rsp[19]; -- dev->d_id.b.area = sns->p.gan_rsp[18]; -- dev->d_id.b.domain = sns->p.gan_rsp[17]; -- dev->flag = DEV_PUBLIC; -+ fcport->d_id.b.al_pa = sns->p.gan_rsp[19]; -+ fcport->d_id.b.area = sns->p.gan_rsp[18]; -+ fcport->d_id.b.domain = sns->p.gan_rsp[17]; -+ -+ memcpy(fcport->node_name, &sns->p.gan_rsp[284], -+ WWN_SIZE); -+ memcpy(fcport->port_name, &sns->p.gan_rsp[20], -+ WWN_SIZE); - -- /* Save FC name */ -- memcpy(dev->name, &sns->p.gan_rsp[284], WWN_SIZE); -- -- /* Extract portname */ -- memcpy(dev->wwn, &sns->p.gan_rsp[20], WWN_SIZE); -+ /* If port type not equal to N or NL port, skip it. */ -+ if (sns->p.gan_rsp[16] != 1 && -+ sns->p.gan_rsp[16] != 2) -+ fcport->d_id.b.domain = 0xf0; - -- DEBUG3(printk("qla2x00: gan entry - portname " -+ DEBUG2(printk(KERN_INFO "qla2x00: gan entry - portname " - "%02x%02x%02x%02x%02x%02x%02x%02x " - "port Id=%06x\n", - sns->p.gan_rsp[20], sns->p.gan_rsp[21], - sns->p.gan_rsp[22], sns->p.gan_rsp[23], - sns->p.gan_rsp[24], sns->p.gan_rsp[25], - sns->p.gan_rsp[26], sns->p.gan_rsp[27], -- dev->d_id.b24);) -+ fcport->d_id.b24)); - rval = 0; - } - } -@@ -14832,87 +14423,6 @@ qla2x00_gan(scsi_qla_host_t *ha, - } - - /* -- * 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 -- */ --static 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 %06x\n", -- ha->host_no, device->loop_id, device->d_id.b24);) -- -- /* 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] != 0x4000) -- DEBUG2(printk(KERN_INFO "%s mbx[0]=0x%x mbx[1]=0x%x\n" -- ,__func__,status[0],status[1]);) -- 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=%06x\n", -- device->loop_id, device->d_id.b24);) -- -- 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=%06x\n", -- ha->host_no, device->loop_id, device->d_id.b24);) -- 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 { -- DEBUG(printk("%s(%ld): failed=%x port_id=%06x " -- "loop_id=%x jiffies=%lx.\n", -- __func__, ha->host_no, status[0], -- device->d_id.b24, device->loop_id, jiffies);) -- return 1; -- } -- } --} -- --/* - * qla2x00_local_device_login - * Issue local device login command. - * -@@ -14944,64 +14454,6 @@ qla2x00_local_device_login(scsi_qla_host - return rval; - } - -- --/* -- * qla2x00_configure_fcports -- * Updates Fibre Channel port database -- * -- * Input: -- * ha = adapter block pointer. -- * -- * Returns: -- * 0 = success. -- * 1 = error. -- */ --static uint8_t --qla2x00_configure_fcports( scsi_qla_host_t *ha ) --{ -- uint8_t rval = 0; -- uint8_t rval1; -- -- 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("%s(%ld): schedule " -- "FAILBACK EVENT\n", -- __func__, -- 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; -- } -- -- DEBUG2(printk("%s(%ld): LOOP READY\n", -- __func__, -- ha->host_no);) -- } else { -- rval = 1; -- } -- -- return(rval); --} -- -- - /* - * qla2x00_configure_loop - * Updates Fibre Channel Device Database with what is actually on loop. -@@ -15010,7 +14462,6 @@ qla2x00_configure_fcports( scsi_qla_host - * ha = adapter block pointer. - * - * Output: -- * ha->fc_db = updated - * - * Returns: - * 0 = success. -@@ -15022,15 +14473,13 @@ qla2x00_configure_loop(scsi_qla_host_t * - { - uint8_t rval = 0; - uint8_t rval1 = 0; -- uint8_t enable_slot_reuse = FALSE; -- uint16_t cnt; -- static unsigned long flags, save_flags; -+ unsigned long flags, save_flags; - #if defined(FC_IP_SUPPORT) - struct ip_device *ipdev; - #endif -+ unsigned long sflags; - - DEBUG3(printk("%s(%ld): entered\n", __func__, ha->host_no);) -- DEBUG(printk("scsi%ld: Enter %s():\n", ha->host_no, __func__);) - - /* Get Initiator ID */ - if (qla2x00_configure_hba(ha)) { -@@ -15046,17 +14495,19 @@ qla2x00_configure_loop(scsi_qla_host_t * - ipdev->flags &= ~IP_DEV_FLAG_PRESENT; - #endif /* FC_IP_SUPPORT */ - -- save_flags = flags = ha->dpc_flags; -- DEBUG(printk("%s(): dpc flags =0x%lx\n", __func__, flags);) -- -- /* dg 02/26/02 ha->dpc_flags &= ~(LOCAL_LOOP_UPDATE | RSCN_UPDATE); */ -+ -+ DEBUG(printk("%s(): dpc flags =0x%lx\n", __func__, ha->dpc_flags);) - -+ spin_lock_irqsave(&ha->hardware_lock, sflags); -+ save_flags = flags = ha->dpc_flags; - /* - * 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); -+ spin_unlock_irqrestore(&ha->hardware_lock, sflags); -+ - ha->mem_err = 0 ; - - /* Determine what we need to do */ -@@ -15084,56 +14535,53 @@ qla2x00_configure_loop(scsi_qla_host_t * - do { - if (test_bit(LOCAL_LOOP_UPDATE, &flags)) { - rval = rval | -- qla2x00_configure_local_loop(ha, -- enable_slot_reuse); -+ qla2x00_configure_local_loop(ha); - } - - if (test_bit(RSCN_UPDATE, &flags)) { -- rval1 = qla2x00_configure_fabric(ha, enable_slot_reuse); -+ rval1 = qla2x00_configure_fabric(ha); - 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; -+ rval = QLA2X00_SUCCESS; - } - -- } while (enable_slot_reuse == TRUE && rval == 0); -+ } while (rval != QLA2X00_SUCCESS); - - 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; -+ 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))) { -+ atomic_set(&ha->loop_state, LOOP_READY); -+ if (ha->flags.failover_enabled) { -+ DEBUG(printk("%s(%ld): schedule " -+ "FAILBACK EVENT\n", -+ __func__, -+ 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; - } -- } - -- if ( qla2x00_configure_fcports( ha ) ) { -+ DEBUG2(printk("%s(%ld): LOOP READY\n", -+ __func__, -+ 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)) -@@ -15158,6 +14606,14 @@ qla2x00_configure_loop(scsi_qla_host_t * - DEBUG3(printk("%s: exiting normally\n", __func__);) - } - -+ /* Restore state if a resync event occured during processing */ -+ if (test_bit(LOOP_RESYNC_NEEDED, &ha->dpc_flags)) { -+ 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); -+ } -+ - return(rval); - } - -@@ -15177,92 +14633,25 @@ qla2x00_config_os(scsi_qla_host_t *ha) - { - fc_port_t *fcport; - fc_lun_t *fclun; -- os_lun_t *lq; -- uint16_t t, l; -- - - DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);) - -- for (fcport = ha->fcport; fcport != NULL; fcport = fcport->next) { -- /* Allocate target */ --#if 0 -- if (fcport->loop_id == FC_NO_LOOP_ID) -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (atomic_read(&fcport->state) != FC_ONLINE || -+ fcport->port_type == FCT_INITIATOR || -+ fcport->port_type == FCT_BROADCAST) { -+ fcport->dev_id = MAX_TARGETS; - 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) -+ /* Bind FC port to OS target number. */ -+ if (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 */ -- for (fclun = fcport->fclun; -- fclun != NULL; fclun = fclun->next) { -- -- 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; -+ /* Bind FC LUN to OS LUN number. */ -+ list_for_each_entry(fclun, &fcport->fcluns, list) { -+ qla2x00_fclun_bind(ha, fcport, fclun); - } - } - -@@ -15286,445 +14675,162 @@ qla2x00_config_os(scsi_qla_host_t *ha) - static uint16_t - qla2x00_fcport_bind(scsi_qla_host_t *ha, fc_port_t *fcport) - { -- int rval; -- uint16_t t; -+ uint16_t tgt; - os_tgt_t *tq; -+ uint8_t rval; - -- ENTER(__func__); -- -- /* Check for tgt already allocated for persistent binding. */ -- for (t = 0; t < MAX_TARGETS; t++) { -- if ((tq = TGT_Q(ha, t)) == NULL) -+ /* Check for persistent binding. */ -+ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { -+ if ((tq = TGT_Q(ha, tgt)) == NULL) - continue; -- -- rval = 0; -+ rval = 1; - 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; -+ if(fcport->d_id.b24 == tq->d_id.b24){ -+ memcpy(tq->node_name, fcport->node_name, -+ WWN_SIZE); -+ memcpy(tq->port_name, fcport->port_name, -+ WWN_SIZE); -+ rval = 0; -+ } -+ break; - -- case BIND_BY_NODE_NAME: -- rval = memcmp(fcport->node_name, -- tq->node_name, WWN_SIZE); -+ case BIND_BY_PORT_NAME: -+ if (memcmp(fcport->port_name, tq->port_name, -+ WWN_SIZE) == 0) { -+ /* In case of persistent binding, update -+ * the WWNN */ -+ memcpy(tq->node_name, fcport->node_name, -+ WWN_SIZE); -+ rval = 0; -+ } - break; - } -- /* Found a persistently bound match */ -- if (rval == 0) -- break; -+ 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 ( ConfigRequired == 0 && tgt == MAX_TARGETS) { -+ /* Check if targetID 0 available. */ -+ tgt = 0; -+ -+ if (TGT_Q(ha, tgt) != NULL) { -+ /* Locate first free target for device. */ -+ for (tgt = 0; tgt < MAX_TARGETS; tgt++) { -+ if (TGT_Q(ha, tgt) == NULL) { -+ break; -+ } -+ } -+ } -+ if (tgt != MAX_TARGETS) { -+ if ((tq = qla2x00_tgt_alloc(ha, tgt)) != NULL) { -+ memcpy(tq->node_name, fcport->node_name, -+ WWN_SIZE); -+ memcpy(tq->port_name, fcport->port_name, -+ WWN_SIZE); -+ tq->d_id.b24 = fcport->d_id.b24; -+ } -+ } - } - -- if (t != MAX_TARGETS) { -- tq = TGT_Q(ha, t); -+ /* Reset target numbers incase it changed. */ -+ fcport->dev_id = tgt; -+ if (tgt != MAX_TARGETS && tq != NULL) { -+ DEBUG2(printk("scsi(%ld): Assigning target ID=%02d @ %p to " -+ "loop id=0x%04x, port state=0x%x, port down retry=%d\n", -+ ha->host_no, tgt, tq, fcport->loop_id, -+ atomic_read(&fcport->state), -+ atomic_read(&fcport->port_down_timer))); -+ - tq->vis_port = fcport; -+ tq->port_down_retry_count = ha->port_down_retry_count; - -- 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); -+ if (!ha->flags.failover_enabled) -+ qla2x00_get_lun_mask_from_config(ha, fcport, tgt, 0); - } - -- /* 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; -+ if ( ConfigRequired == 0 && tgt == MAX_TARGETS) { -+ printk(KERN_WARNING -+ "scsi(%ld): Unable to bind fcport, loop_id=%x\n", -+ ha->host_no, fcport->loop_id); -+ } - -- case BIND_BY_PORT_ID: -- rval = (fcport->d_id.b24 != -- ha->fc_db[t].d_id.b24); -- break; -+ return (tgt); -+} - -- 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; -- } -+/* -+ * qla2x00_fclun_bind -+ * Binds all FC device LUNS to OS LUNS. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * fcport: FC port structure pointer. -+ * -+ * Returns: -+ * target number -+ * -+ * Context: -+ * Kernel context. -+ */ -+static os_lun_t * -+qla2x00_fclun_bind(scsi_qla_host_t *ha, fc_port_t *fcport, fc_lun_t *fclun) -+{ -+ os_lun_t *lq; -+ uint16_t tgt; -+ uint16_t lun; - -- 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; -- } -- } -+ tgt = fcport->dev_id; -+ lun = fclun->lun; -+ -+ /* Allocate LUNs */ -+ if (lun >= MAX_LUNS) { -+ DEBUG2(printk("scsi(%ld): Unable to bind lun, invalid " -+ "lun=(%x).\n", ha->host_no, lun)); -+ return (NULL); - } - -- 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; -+ /* Always alloc LUN 0 so kernel will scan past LUN 0. */ -+ if (lun != 0 && (EXT_IS_LUN_BIT_SET(&(fcport->lun_mask), lun))) { -+ return (NULL); - } - -- if (t == MAX_TARGETS) { -+ if ((lq = qla2x00_lun_alloc(ha, tgt, lun)) == NULL) { - 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));) -+ "scsi(%ld): Unable to bind fclun, loop_id=%x lun=%x\n", -+ ha->host_no, fcport->loop_id, lun); -+ return (NULL); - } - -- LEAVE(__func__); -+ lq->fclun = fclun; - -- return (t); -+ return (lq); - } - - /* -- * qla2x00_build_fcport_list -- * Updates device on list. -+ * qla2x00_mark_device_lost -+ * Updates fcport state when device goes offline. - * - * Input: - * ha = adapter block pointer. - * fcport = port structure pointer. - * - * Return: -- * 0 - Success -- * BIT_0 - error -+ * None. - * - * Context: -- * Kernel context. - */ --static int --qla2x00_build_fcport_list(scsi_qla_host_t *ha) -+STATIC void -+qla2x00_mark_device_lost(scsi_qla_host_t *ha, fc_port_t *fcport, int do_login) - { -- int rval; -- fcdev_t *dev; -- int found = 0; -- int cnt, i; -- fc_port_t *fcport; -- fc_port_t *prev_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("%s(%ld): found tgt %d in fc_db.\n", -- __func__, ha->host_no, cnt);) -- -- /* Check for matching device in port list. */ -- found = 0; -- prev_fcport = NULL; -- for (i=0, fcport = ha->fcport; -- fcport != NULL; -- fcport = fcport->next, i++) { -- -- 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) { -- prev_fcport = fcport; -- 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(%ld): Found matching port %06x, " -- "device flags= 0x%x\n", -- __func__,ha->host_no, -- dev->d_id.b24, -- dev->flag);) -- -- /* if device found is missing then mark it */ -- if (dev->flag & DEV_ABSENCE) { -- DEBUG(printk("%s(%ld): Port missing --- " -- "(port_name) -> " -- "%02x%02x%02x%02x%02x" -- "%02x%02x%02x, " -- "loop id = 0x%04x\n", -- __func__,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->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; -- -- 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);) -- found++; -- break; -- } -- if (found) -- continue; -- -- /* Add device to port list. */ -- if (fcport == NULL) { -- 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)); -- -- /* 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); -- -- if (prev_fcport == NULL) { -- /* nothing in fcport list yet */ -- ha->fcport = fcport; -- } else { -- /* -- * prev_fcport should be pointing to last -- * port in list -- */ -- prev_fcport->next = fcport; -- } -- -- } else { -- DEBUG3(printk("%s(%ld): updating device to list.\n", -- __func__, ha->host_no);) -- fcport->loop_id = dev->loop_id; -- fcport->loop_id = dev->loop_id; -- fcport->old_loop_id = dev->loop_id; -- } -- -- if (atomic_read(&fcport->state) != FC_ONLINE) { -- if (qla2x00_update_fcport(ha, fcport, cnt)) { -- DEBUG2(printk(KERN_INFO "%s(%ld): update_fcport " -- "failed.\n", -- __func__, ha->host_no);) -- -- return BIT_0; -- } -- } -- -- } -- -- LEAVE(__func__); -- -- return (0); --} -- --/* -- * qla2x00_mark_device_lost -- * Updates fcport state when device goes offline. -- * -- * Input: -- * ha = adapter block pointer. -- * fcport = port structure pointer. -- * -- * Return: -- * None. -- * -- * Context: -- */ --STATIC void --qla2x00_mark_device_lost( scsi_qla_host_t *ha, fc_port_t *fcport ) --{ --#if 0 -- /* -- * No point in marking the device as lost, if the device is already -- * DEAD. -- */ -- if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) -- return; -- -- /* Mark the device LOST */ -- atomic_set(&fcport->state, FC_DEVICE_LOST); --#else - /* - * 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); --#endif -+ -+ if (!do_login) -+ return; - - #if defined(PORT_LOGIN_4xWAY) - if (PORT_LOGIN_RETRY(fcport) > 0) { -@@ -15767,107 +14873,562 @@ qla2x00_mark_device_lost( scsi_qla_host_ - set_bit(RELOGIN_NEEDED, &ha->dpc_flags); - } - #endif --} -+} -+ -+/* -+ * qla2x00_mark_all_devices_lost -+ * Updates fcport state when device goes offline. -+ * -+ * Input: -+ * ha = adapter block pointer. -+ * fcport = port structure pointer. -+ * -+ * Return: -+ * None. -+ * -+ * Context: -+ */ -+STATIC 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); -+ if(fcport->port_type != FCT_TARGET) -+ continue; -+ -+ /* -+ * 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_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) -+{ -+ fc_port_t *fcport; -+ int found, cnt; -+ -+ found = 0; -+ cnt = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if(fcport->port_type != FCT_TARGET) -+ continue; -+ -+ if ((atomic_read(&fcport->state) == FC_ONLINE) || -+ (fcport->flags & FC_FAILBACK_DISABLE) || -+ (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; -+} -+ -+STATIC void -+qla2x00_probe_for_all_luns(scsi_qla_host_t *ha) -+{ -+ fc_port_t *fcport; -+ -+ qla2x00_mark_all_devices_lost(ha); -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if(fcport->port_type != FCT_TARGET) -+ continue; -+ -+ qla2x00_update_fcport(ha, fcport); -+ } -+} -+ -+/* -+ * 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 rval; -+ -+ 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; -+ fcport->flags &= ~FC_LOGIN_NEEDED; -+ 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); -+ -+ if (fcport->port_type != FCT_TARGET) -+ return (QLA2X00_SUCCESS); -+ -+ /* Do LUN discovery. */ -+ rval = qla2x00_lun_discovery(ha, fcport); -+ if ( (fcport->flags & (FC_MSA_DEVICE|FC_EVA_DEVICE)) ) -+ qla2x00_test_active_port(fcport); -+ -+ return (rval); -+} -+ -+ -+ -+int -+qla2x00_issue_scsi_inquiry(scsi_qla_host_t *ha, -+ fc_port_t *fcport, fc_lun_t *fclun ) -+{ -+ inq_cmd_rsp_t *pkt; -+ int rval; -+ dma_addr_t phys_address = 0; -+ int retry; -+ uint16_t comp_status; -+ uint16_t scsi_status; -+ int ret = 0; -+ -+ uint16_t lun = fclun->lun; -+ -+ -+ 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; -+ } -+ -+ 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); -+#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(3); -+ 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); -+ -+ DEBUG(printk("scsi(%ld:0x%x:%d) %s: Inquiry - fcport=%p," -+ " lun (%d)\n", -+ ha->host_no, fcport->loop_id, lun, -+ __func__,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); -+ -+ } while ((rval != QLA2X00_SUCCESS || -+ comp_status != CS_COMPLETE) && -+ retry--); -+ -+ if (rval != QLA2X00_SUCCESS || -+ comp_status != CS_COMPLETE || -+ (scsi_status & SS_CHECK_CONDITION)) { -+ -+ DEBUG2(printk("%s: Failed lun inquiry - " -+ "inq[0]= 0x%x, comp status 0x%x, " -+ "scsi status 0x%x. loop_id=%d\n", -+ __func__,pkt->inq[0], -+ comp_status, -+ scsi_status, -+ fcport->loop_id);) -+ ret = 1; -+ } else { -+ fclun->inq0 = pkt->inq[0]; -+ } -+ -+ pci_free_consistent(ha->pdev, sizeof(inq_cmd_rsp_t), pkt, phys_address); -+ -+ return( ret ); -+} -+ -+int -+qla2x00_test_active_lun( fc_port_t *fcport, fc_lun_t *fclun ) -+{ -+ tur_cmd_rsp_t *pkt; -+ int rval = 0 ; -+ dma_addr_t phys_address = 0; -+ int retry; -+ uint16_t comp_status; -+ uint16_t scsi_status; -+ scsi_qla_host_t *ha; -+ uint16_t lun = 0; -+ -+ ENTER(__func__); -+ -+ -+ ha = fcport->ha; -+ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD){ -+ DEBUG2(printk("scsi(%ld) %s leaving: Port loop_id 0x%02x is marked DEAD\n", -+ ha->host_no,__func__,fcport->loop_id);) -+ return rval; -+ } -+ -+ if ( fclun == NULL ){ -+ DEBUG2(printk("scsi(%ld) %s Bad fclun ptr on entry.\n", -+ ha->host_no,__func__);) -+ return rval; -+ } -+ -+ lun = fclun->lun; -+ -+ pkt = pci_alloc_consistent(ha->pdev, -+ sizeof(tur_cmd_rsp_t), &phys_address); -+ -+ if (pkt == NULL) { -+ printk(KERN_WARNING -+ "scsi(%ld): Memory Allocation failed - TUR\n", -+ ha->host_no); -+ ha->mem_err++; -+ return rval; -+ } -+ -+ retry = 4; -+ do { -+ memset(pkt, 0, sizeof(tur_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); -+#else -+ pkt->p.cmd.target = (uint8_t)fcport->loop_id; -+#endif -+ /* no direction for this command */ -+ pkt->p.cmd.control_flags = -+ __constant_cpu_to_le16(CF_SIMPLE_TAG); -+ pkt->p.cmd.scsi_cdb[0] = TEST_UNIT_READY; -+ pkt->p.cmd.dseg_count = __constant_cpu_to_le16(0); -+ pkt->p.cmd.timeout = __constant_cpu_to_le16(3); -+ pkt->p.cmd.byte_count = __constant_cpu_to_le32(0); - --/* -- * qla2x00_mark_all_devices_lost -- * Updates fcport state when device goes offline. -- * -- * Input: -- * ha = adapter block pointer. -- * fcport = port structure pointer. -- * -- * Return: -- * None. -- * -- * Context: -- */ --STATIC void --qla2x00_mark_all_devices_lost(scsi_qla_host_t *ha) --{ -- fc_port_t *fcport; -+ rval = qla2x00_issue_iocb(ha, pkt, -+ phys_address, sizeof(tur_cmd_rsp_t)); - -- for (fcport = ha->fcport; fcport != NULL; fcport = fcport->next) { -- /* -- * No point in marking the device as lost, if the device is -- * already DEAD. -- */ -- if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) -- continue; -+ comp_status = le16_to_cpu(pkt->p.rsp.comp_status); -+ scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status); - -- atomic_set(&fcport->state, FC_DEVICE_LOST); -+ /* Port Logged Out, so don't retry */ -+ if( comp_status == CS_PORT_LOGGED_OUT || -+ comp_status == CS_PORT_CONFIG_CHG || -+ comp_status == CS_PORT_BUSY || -+ comp_status == CS_INCOMPLETE || -+ comp_status == CS_PORT_UNAVAILABLE ) -+ break; -+ -+ DEBUG(printk("scsi(%ld:%04x:%d) " -+ "%s: TEST UNIT READY - " -+ " comp status 0x%x, " -+ "scsi status 0x%x, rval=%d\n",ha->host_no, -+ fcport->loop_id, -+ lun,__func__, -+ comp_status, scsi_status, rval);) -+ if( (scsi_status & SS_CHECK_CONDITION) ) { -+ DEBUG2(printk("%s: check status bytes = 0x%02x 0x%02x 0x%02x\n", -+ __func__, pkt->p.rsp.req_sense_data[2], -+ pkt->p.rsp.req_sense_data[12] , -+ pkt->p.rsp.req_sense_data[13]);) -+ -+ if (pkt->p.rsp.req_sense_data[2] == NOT_READY && -+ pkt->p.rsp.req_sense_data[12] == 0x4 && -+ pkt->p.rsp.req_sense_data[13] == 0x2 ) -+ break; -+ } -+ } while ( (rval != QLA2X00_SUCCESS || -+ comp_status != CS_COMPLETE || -+ (scsi_status & SS_CHECK_CONDITION)) && -+ retry--); -+ -+ if (rval == QLA2X00_SUCCESS && -+ ( !( (scsi_status & SS_CHECK_CONDITION) && -+ (pkt->p.rsp.req_sense_data[2] == NOT_READY && -+ pkt->p.rsp.req_sense_data[12] == 0x4 && -+ pkt->p.rsp.req_sense_data[13] == 0x2 ) ) && -+ comp_status == CS_COMPLETE) ) { -+ -+ DEBUG2(printk("scsi(%ld) %s - Lun (0x%02x:%d) set to ACTIVE.\n", -+ ha->host_no, __func__, -+ (uint8_t)fcport->loop_id,lun);) -+ /* We found an active path */ -+ fclun->flags |= FC_ACTIVE_LUN; -+ rval = 1; -+ } else { -+ DEBUG2(printk("scsi(%ld) %s - Lun (0x%02x:%d) set to INACTIVE.\n", -+ ha->host_no, __func__, -+ (uint8_t)fcport->loop_id,lun);) -+ /* fcport->flags &= ~(FC_MSA_PORT_ACTIVE); */ -+ fclun->flags &= ~(FC_ACTIVE_LUN); - } -+ -+ pci_free_consistent(ha->pdev, sizeof(tur_cmd_rsp_t), -+ pkt, phys_address); -+ -+ LEAVE(__func__); -+ -+ return rval; -+ - } - --/* -- * 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) -+ -+static fc_lun_t * -+qla2x00_find_data_lun( fc_port_t *fcport ) - { -- fc_port_t *fcport; -- int found, cnt; -+ scsi_qla_host_t *ha; -+ fc_lun_t *fclun, *ret_fclun; - -- found = 0; -- for (cnt = 0, fcport = ha->fcport; -- fcport != NULL; -- fcport = fcport->next, cnt++) { -+ ha = fcport->ha; -+ ret_fclun = NULL; - -- if ((atomic_read(&fcport->state) == FC_ONLINE) || -- (atomic_read(&fcport->state) == FC_DEVICE_DEAD)) -- found++; -+ /* Go thur all luns and find a good data lun */ -+ list_for_each_entry(fclun, &fcport->fcluns, list) { -+ fclun->flags &= ~FC_VISIBLE_LUN; -+ if (fclun->inq0 == 0xff) -+ qla2x00_issue_scsi_inquiry(ha, fcport, fclun); -+ if (fclun->inq0 == 0xc) -+ fclun->flags |= FC_VISIBLE_LUN; -+ else if (fclun->inq0 == 0 ) { -+ ret_fclun = fclun; -+ } - } -- if (cnt == found) { -- DEBUG5(printk("%s(%ld): all online\n", -- __func__, -- ha->host_no);) -- return 1; -- } else -- return 0; -+ return (ret_fclun); - } - - /* -- * qla2x00_update_fcport -- * Updates device on list. -+ * qla2x00_test_active_port -+ * Determines if the port is in active or standby mode. First, we -+ * need to locate a storage lun then do a TUR on it. - * - * Input: -- * ha = adapter block pointer. - * fcport = port structure pointer. -+ * - * - * Return: -- * 0 - Success -- * BIT_0 - error -+ * 0 - Standby or error -+ * 1 - Active - * - * Context: - * Kernel context. - */ --static int --qla2x00_update_fcport(scsi_qla_host_t *ha, fc_port_t *fcport, int index) -+int -+qla2x00_test_active_port( fc_port_t *fcport ) - { -- DEBUG4(printk("%s(): entered, loop_id = %d\n", -- __func__, -+ tur_cmd_rsp_t *pkt; -+ int rval = 0 ; -+ dma_addr_t phys_address = 0; -+ int retry; -+ uint16_t comp_status; -+ uint16_t scsi_status; -+ scsi_qla_host_t *ha; -+ uint16_t lun = 0; -+ fc_lun_t *fclun; -+ -+ ENTER(__func__); -+ -+ -+ ha = fcport->ha; -+ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD){ -+ DEBUG2(printk("scsi(%ld) %s leaving: Port 0x%02x is marked DEAD\n", -+ ha->host_no,__func__,fcport->loop_id);) -+ return rval; -+ } -+ -+ -+ if( (fclun = qla2x00_find_data_lun( fcport )) == NULL ) { -+ DEBUG2(printk(KERN_INFO "%s leaving: Couldn't find data lun\n",__func__);) -+ return rval; -+ } -+ lun = fclun->lun; -+ -+ pkt = pci_alloc_consistent(ha->pdev, -+ sizeof(tur_cmd_rsp_t), &phys_address); -+ -+ if (pkt == NULL) { -+ printk(KERN_WARNING -+ "scsi(%ld): Memory Allocation failed - TUR\n", -+ ha->host_no); -+ ha->mem_err++; -+ return rval; -+ } -+ -+ retry = 4; -+ do { -+ memset(pkt, 0, sizeof(tur_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); -+ /* pkt->p.cmd.lun = lun; */ -+#if defined(EXTENDED_IDS) -+ pkt->p.cmd.target = cpu_to_le16(fcport->loop_id); -+#else -+ pkt->p.cmd.target = (uint8_t)fcport->loop_id; -+#endif -+ /* no direction for this command */ -+ pkt->p.cmd.control_flags = -+ __constant_cpu_to_le16(CF_SIMPLE_TAG); -+ pkt->p.cmd.scsi_cdb[0] = TEST_UNIT_READY; -+ pkt->p.cmd.dseg_count = __constant_cpu_to_le16(0); -+ pkt->p.cmd.timeout = __constant_cpu_to_le16(3); -+ pkt->p.cmd.byte_count = __constant_cpu_to_le32(0); -+ -+ rval = qla2x00_issue_iocb(ha, pkt, -+ phys_address, sizeof(tur_cmd_rsp_t)); -+ -+ comp_status = le16_to_cpu(pkt->p.rsp.comp_status); -+ scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status); -+ -+ /* Port Logged Out, so don't retry */ -+ if( comp_status == CS_PORT_LOGGED_OUT || -+ comp_status == CS_PORT_CONFIG_CHG || -+ comp_status == CS_PORT_BUSY || -+ comp_status == CS_INCOMPLETE || -+ comp_status == CS_PORT_UNAVAILABLE ) -+ break; -+ -+ DEBUG(printk("scsi(%ld:%04x:%d) " -+ "%s: TEST UNIT READY - " -+ " comp status 0x%x, " -+ "scsi status 0x%x, rval=%d\n",ha->host_no, -+ fcport->loop_id, -+ lun,__func__, -+ comp_status, scsi_status, rval);) -+ if( (scsi_status & SS_CHECK_CONDITION) ) { -+ DEBUG2(printk("%s: check status bytes = 0x%02x 0x%02x 0x%02x\n", -+ __func__, pkt->p.rsp.req_sense_data[2], -+ pkt->p.rsp.req_sense_data[12] , -+ pkt->p.rsp.req_sense_data[13]);) -+ -+ if (pkt->p.rsp.req_sense_data[2] == NOT_READY && -+ pkt->p.rsp.req_sense_data[12] == 0x4 && -+ pkt->p.rsp.req_sense_data[13] == 0x2 ) -+ break; -+ } -+ } while ( (rval != QLA2X00_SUCCESS || -+ comp_status != CS_COMPLETE || -+ (scsi_status & SS_CHECK_CONDITION)) && -+ retry--); -+ -+ if (rval == QLA2X00_SUCCESS && -+ ( !( (scsi_status & SS_CHECK_CONDITION) && -+ (pkt->p.rsp.req_sense_data[2] == NOT_READY && -+ pkt->p.rsp.req_sense_data[12] == 0x4 && -+ pkt->p.rsp.req_sense_data[13] == 0x2 ) ) && -+ comp_status == CS_COMPLETE) ) { -+ DEBUG2(printk("scsi(%ld) %s - Port (0x%04x) set to ACTIVE.\n", -+ ha->host_no, __func__, -+ fcport->loop_id);) -+ /* We found an active path */ -+ fcport->flags |= FC_MSA_PORT_ACTIVE; -+ rval = 1; -+ } else { -+ DEBUG2(printk("scsi(%ld) %s - Port (0x%04x) set to INACTIVE.\n", -+ ha->host_no, __func__, - fcport->loop_id);) -+ fcport->flags &= ~(FC_MSA_PORT_ACTIVE); -+ } - -- 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); -+ pci_free_consistent(ha->pdev, sizeof(tur_cmd_rsp_t), -+ pkt, phys_address); - -- /* Do LUN discovery. */ -- return (qla2x00_lun_discovery(ha, fcport, index)); -+ LEAVE(__func__); -+ -+ return rval; -+ -+} -+ -+void -+qla2x00_set_device_flags(scsi_qla_host_t *ha, -+ fc_port_t *fcport ) -+{ -+ -+ if ( fcport->cfg_id != -1 ){ -+ fcport->flags &= ~(FC_XP_DEVICE|FC_MSA_DEVICE|FC_EVA_DEVICE); -+ if ( (cfg_device_list[fcport->cfg_id].flags & 1) ){ -+ printk(KERN_INFO -+ "scsi(%ld) :Loop id 0x%04x is an XP device\n", -+ ha->host_no, -+ fcport->loop_id); -+ fcport->flags |= FC_XP_DEVICE; -+ } else if ( (cfg_device_list[fcport->cfg_id].flags & 2) ){ -+ printk(KERN_INFO -+ "scsi(%ld) :Loop id 0x%04x is a MSA1000 device\n", -+ ha->host_no, -+ fcport->loop_id); -+ fcport->flags |= FC_MSA_DEVICE; -+ fcport->flags |= FC_FAILBACK_DISABLE; -+ } else if ( (cfg_device_list[fcport->cfg_id].flags & 4) ){ -+ printk(KERN_INFO -+ "scsi(%ld) :Loop id 0x%04x is a EVA device\n", -+ ha->host_no, -+ fcport->loop_id); -+ fcport->flags |= FC_EVA_DEVICE; -+ fcport->flags |= FC_FAILBACK_DISABLE; -+ } -+ if ( (cfg_device_list[fcport->cfg_id].flags & 8) ){ -+ fcport->flags |= FC_FAILOVER_DISABLE; -+ printk(KERN_INFO -+ "scsi(%ld) :Loop id 0x%04x has FAILOVERS disabled.\n", -+ ha->host_no, -+ fcport->loop_id); -+ } -+ } - } - - /* -@@ -15886,19 +15447,21 @@ qla2x00_update_fcport(scsi_qla_host_t *h - * Kernel context. - */ - static int --qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport, int index) -+qla2x00_lun_discovery(scsi_qla_host_t *ha, fc_port_t *fcport) - { - 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; -+ int rlc_succeeded, first; - uint16_t comp_status; - uint16_t scsi_status; -+ uint16_t next_loopid; - - ENTER(__func__); - -@@ -15933,14 +15496,20 @@ qla2x00_lun_discovery(scsi_qla_host_t *h - return BIT_0; - } - -+ first = 0; - for (lun = 0; lun < ha->max_probe_luns; lun++) { - retry = 2; - do { -+ // FIXME: dma_addr_t could be 64bits in length! - 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); -+#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; -@@ -15950,13 +15519,13 @@ qla2x00_lun_discovery(scsi_qla_host_t *h - pkt->p.cmd.byte_count = - __constant_cpu_to_le32(INQ_DATA_SIZE); - pkt->p.cmd.dseg_0_address[0] = cpu_to_le32( -- pci_dma_lo32(phys_address + sizeof(sts_entry_t))); -+ LSD(phys_address + sizeof(sts_entry_t))); - pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( -- pci_dma_hi32(phys_address + sizeof(sts_entry_t))); -+ MSD(phys_address + sizeof(sts_entry_t))); - pkt->p.cmd.dseg_0_length = - __constant_cpu_to_le32(INQ_DATA_SIZE); - -- DEBUG5(printk("lun_discovery: Lun Inquiry - fcport=%p," -+ DEBUG(printk("lun_discovery: Lun Inquiry - fcport=%p," - " lun (%d)\n", - fcport, - lun);) -@@ -15977,12 +15546,16 @@ qla2x00_lun_discovery(scsi_qla_host_t *h - - /* 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; -+ if (fcport->flags & FC_FABRIC_DEVICE) { -+ /* login and update database */ -+ next_loopid = 0; -+ qla2x00_fabric_login(ha, fcport, -+ &next_loopid); -+ } else { -+ /* Loop device gone but no LIP... */ -+ rval = QL_STATUS_ERROR; -+ break; -+ } - } - } while ((rval != QLA2X00_SUCCESS || - comp_status != CS_COMPLETE) && -@@ -15992,7 +15565,7 @@ qla2x00_lun_discovery(scsi_qla_host_t *h - comp_status != CS_COMPLETE || - (scsi_status & SS_CHECK_CONDITION)) { - -- DEBUG(printk("lun_discovery: Failed lun inquiry - " -+ DEBUG2(printk("lun_discovery: Failed lun inquiry - " - "inq[0]= 0x%x, comp status 0x%x, " - "scsi status 0x%x. loop_id=%d\n", - pkt->inq[0], -@@ -16012,12 +15585,15 @@ qla2x00_lun_discovery(scsi_qla_host_t *h - 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; - } -- -+ /* Does this port require special failover handling? */ -+ if (ha->flags.failover_enabled) { -+ fcport->cfg_id = qla2x00_cfg_lookup_device( -+ &pkt->inq[0]); -+ qla2x00_set_device_flags(ha, fcport); -+ } - /* Stop the scan */ - break; - } -@@ -16031,35 +15607,37 @@ qla2x00_lun_discovery(scsi_qla_host_t *h - */ - 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; - } - -+ /* Does this port require special failover handling? */ -+ if (ha->flags.failover_enabled && !first) { -+ fcport->cfg_id = qla2x00_cfg_lookup_device(&pkt->inq[0]); -+ qla2x00_set_device_flags(ha,fcport); -+ first++; -+ } - /* Allocate LUN if not already allocated. */ -- for (fclun = fcport->fclun; -- fclun != NULL; -- fclun = fclun->next) { -+ found = 0; -+ list_for_each(fcll, &fcport->fcluns) { -+ fclun = list_entry(fcll, fc_lun_t, list); - -- if (fclun->lun == lun) -+ if (fclun->lun == lun) { -+ found++; - break; -+ } - } -- -- if (fclun != NULL) { -- /* Found this lun already in our list */ -+ if (found) - continue; -- } - - /* Add this lun to our list */ -- fcport->lun_cnt++; -- - fclun = kmalloc(sizeof(fc_lun_t), GFP_ATOMIC); - if (fclun != NULL) { -+ fcport->lun_cnt++; - /* Setup LUN structure. */ - memset(fclun, 0, sizeof(fc_lun_t)); - -@@ -16070,12 +15648,13 @@ qla2x00_lun_discovery(scsi_qla_host_t *h - - fclun->fcport = fcport; - fclun->lun = lun; -+ fclun->inq0 = 0xff; - - if (disconnected) - fclun->flags |= FC_DISCON_LUN; - -- fclun->next = fcport->fclun; -- fcport->fclun = fclun; -+ list_add_tail(&fclun->list, &fcport->fcluns); -+ - - DEBUG5(printk("lun_discvery: Allocated fclun %p, " - "fclun.lun=%d\n", -@@ -16094,7 +15673,7 @@ qla2x00_lun_discovery(scsi_qla_host_t *h - - } - -- DEBUG(printk("lun_discovery(%ld): fcport lun count=%d, fcport= %p\n", -+ DEBUG2(printk("lun_discovery(%ld): fcport lun count=%d, fcport= %p\n", - ha->host_no, - fcport->lun_cnt, - fcport);) -@@ -16153,10 +15732,15 @@ qla2x00_rpt_lun_discovery(scsi_qla_host_ - } - - for (retries = 4; retries; retries--) { -+ // FIXME: dma_addr_t could be 64bits in length! - 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); -+#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; -@@ -16167,9 +15751,9 @@ qla2x00_rpt_lun_discovery(scsi_qla_host_ - pkt->p.cmd.byte_count = - __constant_cpu_to_le32(sizeof(rpt_lun_lst_t)); - pkt->p.cmd.dseg_0_address[0] = cpu_to_le32( -- pci_dma_lo32(phys_address + sizeof(sts_entry_t))); -+ LSD(phys_address + sizeof(sts_entry_t))); - pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( -- pci_dma_hi32(phys_address + sizeof(sts_entry_t))); -+ MSD(phys_address + sizeof(sts_entry_t))); - pkt->p.cmd.dseg_0_length = - __constant_cpu_to_le32(sizeof(rpt_lun_lst_t)); - -@@ -16280,26 +15864,29 @@ qla2x00_rpt_lun_discovery(scsi_qla_host_ - static void - qla2x00_cfg_lun(fc_port_t *fcport, uint16_t lun) - { -+ int found; - fc_lun_t *fclun; - - /* Allocate LUN if not already allocated. */ -- for (fclun = fcport->fclun; fclun != NULL; fclun = fclun->next) { -+ found = 0; -+ list_for_each_entry(fclun, &fcport->fcluns, list) { - if (fclun->lun == lun) { -+ found++; - break; - } - } -- if (fclun == NULL) { -+ 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)); -- fcport->lun_cnt++; - fclun->fcport = fcport; -- /* How dow we assign the following */ -- /* fclun->state = FCS_ONLINE; */ - fclun->lun = lun; -- fclun->next = fcport->fclun; -- fcport->fclun = fclun; -+ fclun->inq0 = 0xff; -+ -+ list_add_tail(&fclun->list, &fcport->fcluns); - } else { - printk(KERN_WARNING - "%s(): Memory Allocation failed - FCLUN\n", -@@ -16322,20 +15909,40 @@ qla2x00_cfg_lun(fc_port_t *fcport, uint1 - * 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) -+qla2x00_configure_local_loop(scsi_qla_host_t *ha) - { -- uint8_t status = 0; - uint8_t rval; -- uint8_t port_name[8]; -+ int rval2; -+#if defined(FC_IP_SUPPORT) - 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; -+#endif -+ uint16_t localdevices; -+ -+ uint16_t index; -+ uint16_t entries; -+ uint16_t loop_id; -+ struct dev_id { -+ uint8_t al_pa; -+ uint8_t area; -+ uint8_t domain; -+#if defined(EXTENDED_IDS) -+ uint8_t reserved; -+ uint16_t loop_id; -+#else -+ uint8_t loop_id; -+#endif -+ } *id_list; -+#define MAX_ID_LIST_SIZE (sizeof(struct dev_id) * MAX_FIBRE_DEVICES) -+ dma_addr_t id_list_dma; -+ -+ int found; -+ fc_port_t *fcport, *new_fcport; - - ENTER(__func__); - -+ localdevices = 0; -+ new_fcport = NULL; -+ - /* - * No point in continuing if the loop is in a volatile state -- - * reschedule LOCAL_LOOP_UPDATE for later processing -@@ -16345,187 +15952,146 @@ qla2x00_configure_local_loop(scsi_qla_ho - return (0); - } - -- gn_list = pci_alloc_consistent(ha->pdev, -- sizeof(GN_LIST_LENGTH), &phys_address); -- if (gn_list == NULL) { -- printk(KERN_WARNING -- "scsi(%ld): Memory Allocation failed - port_list", -- ha->host_no); -- ha->mem_err++; -+ entries = MAX_FIBRE_DEVICES; -+ id_list = pci_alloc_consistent(ha->pdev, MAX_ID_LIST_SIZE, -+ &id_list_dma); -+ if (id_list == NULL) { -+ DEBUG2(printk("scsi(%ld): Failed to allocate memory, No local " -+ "loop\n", ha->host_no)); - -- DEBUG2(printk(KERN_INFO "%s(%ld): Failed to allocate memory, No " -- "local loop\n", -- __func__, -- 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("%s(%ld): port lost @ slot %d %06x\n", -- __func__, -- ha->host_no, -- index, -- ha->fc_db[index].d_id.b24);) -- -- ha->fc_db[index].loop_id |= PORT_LOST_ID; -- } -- } -+ memset(id_list, 0, MAX_ID_LIST_SIZE); - -- DEBUG3(printk("%s(%ld): Getting FCAL position map\n", -- __func__, ha->host_no)); -+ DEBUG3(printk("scsi(%ld): Getting FCAL position map\n", ha->host_no)); - DEBUG3(qla2x00_get_fcal_position_map(ha, NULL)); - -- /* Get port name list.*/ --#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 -- /* -- * Bit 0 - return node names, -- * Bit 1 - loop IDs 0-255 -- */ -- 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 -+ /* Get list of logged in devices. */ -+ rval = qla2x00_get_id_list(ha, id_list, id_list_dma, &entries); - if (rval) { -- status = BIT_0; -+ rval = BIT_0; - goto cleanup_allocation; - } - -- DEBUG3(printk("%s(%ld): port list size (%d)\n", -- __func__, ha->host_no, size)); -- DEBUG3(qla2x00_dump_buffer((uint8_t *)gn_list, size)); -- -- /* Any valid entries returned? */ -- /* dg: 10/29/99 for an empty list */ -- if (size / sizeof(port_list_entry_t) == 0) -+ DEBUG3(printk("scsi(%ld): Entries in ID list (%d)\n", -+ ha->host_no, entries)); -+ DEBUG3(qla2x00_dump_buffer((uint8_t *)id_list, -+ entries * sizeof(struct dev_id))); -+ -+ /* Allocate temporary fcport for any new fcports discovered. */ -+ new_fcport = qla2x00_alloc_fcport(ha, GFP_KERNEL); -+ if (new_fcport == NULL) { -+ rval = BIT_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); -+ /* Mark all local ports LOST first */ -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (!(fcport->flags & FC_FABRIC_DEVICE)) { -+ /* -+ * No point in marking the device as lost, if the -+ * device is already DEAD. -+ */ -+ if (atomic_read(&fcport->state) == FC_DEVICE_DEAD) -+ continue; - --#if defined(FC_IP_SUPPORT) -- device.loop_id &= LOOP_ID_MASK; --#endif -+ atomic_set(&fcport->state, FC_DEVICE_LOST); -+ } -+ } - -- /* Skip any non-local loop-ids - this includes 'known ports' */ -- if (device.loop_id > LAST_LOCAL_LOOP_ID) -+ /* Add devices to port list. */ -+ for (index = 0; index < entries; index++) { -+ /* Bypass reserved domain fields. */ -+ if ((id_list[index].domain & 0xf0) == 0xf0) - 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)) -+ -+ /* Bypass if not same domain and area of adapter. */ -+ if (id_list[index].area != ha->d_id.b.area || -+ id_list[index].domain != ha->d_id.b.domain) - continue; -+ -+ /* Bypass invalid local loop ID. */ -+#if defined(EXTENDED_IDS) -+ loop_id = le16_to_cpu(id_list[index].loop_id); -+#else -+ loop_id = (uint16_t)id_list[index].loop_id; - #endif -+ if (loop_id > LAST_LOCAL_LOOP_ID) -+ continue; - -- /* Get port name */ -- rval = qla2x00_get_port_name(ha, device.loop_id, port_name, 0); -- if (rval || qla2x00_is_wwn_zero(port_name)) { -- DEBUG2(printk(KERN_INFO "%s(%ld): get_port_name error.\n", -- __func__, -- ha->host_no);) -- status = BIT_0; -+ /* Fill in member data. */ -+ new_fcport->d_id.b.domain = id_list[index].domain; -+ new_fcport->d_id.b.area = id_list[index].area; -+ new_fcport->d_id.b.al_pa = id_list[index].al_pa; -+ new_fcport->loop_id = loop_id; -+ rval2 = qla2x00_get_port_database(ha, new_fcport, 0); -+ if (rval2 != QL_STATUS_SUCCESS) { -+ DEBUG2(printk("scsi(%ld): Failed to retrieve fcport " -+ "information -- get_port_database=%x, " -+ "loop_id=0x%04x\n", -+ ha->host_no, rval2, new_fcport->loop_id)); -+ continue; -+ } -+ -+ /* Check for matching device in port list. */ -+ found = 0; -+ fcport = NULL; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (memcmp(new_fcport->port_name, fcport->port_name, -+ WWN_SIZE)) -+ continue; -+ -+ fcport->flags &= ~FC_FABRIC_DEVICE; -+ fcport->loop_id = new_fcport->loop_id; -+ fcport->port_type = new_fcport->port_type; -+ fcport->d_id.b24 = new_fcport->d_id.b24; -+ memcpy(fcport->node_name, new_fcport->node_name, -+ WWN_SIZE); -+ -+ found++; - break; - } -- memcpy(device.wwn, port_name, WWN_SIZE); -- DEBUG3(printk("%s(%ld): found portname -> " -- "%02x%02x%02x%02x%02x%02x%02x%02x\n", -- __func__, -- ha->host_no, -- port_name[0], port_name[1], -- port_name[2], port_name[3], -- port_name[4], port_name[5], -- port_name[6], port_name[7]);) -- -- /* Now get node name -- big-endian format */ -- *((u64 *)device.name) = be64_to_cpup((u64 *)port_entry->name); -- DEBUG3(printk("%s(%ld): found nodename -> " -- "%02x%02x%02x%02x%02x%02x%02x%02x\n", -- __func__, -- 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.flag = 0; -- -- /* Derive portid from alpa table */ -- device.d_id.b24 = 0; -- device.d_id.b.al_pa = alpa_table[device.loop_id]; - --#if defined(FC_IP_SUPPORT) -- if (!(list_entry_loop_id & PLE_NOT_SCSI_DEVICE)) { --#endif -- /* SCSI type device */ -- update_status = qla2x00_update_fc_database(ha, -- &device, enable_slot_reuse); -+ if (!found) { -+ /* New device, add to fcports list. */ -+ list_add_tail(&new_fcport->list, &ha->fcports); -+ -+ /* Allocate a new replacement fcport. */ -+ fcport = new_fcport; -+ new_fcport = qla2x00_alloc_fcport(ha, GFP_KERNEL); -+ if (new_fcport == NULL) { -+ rval = BIT_0; -+ goto cleanup_allocation; -+ } -+ } - -- if (update_status) -- status |= update_status; -- else -- localdevices++; -+ qla2x00_update_fcport(ha, fcport); - --#if defined(FC_IP_SUPPORT) -- } else if (ha->flags.enable_ip == TRUE) { -- /* SCSI login failed, assume it is IP device */ -- DEBUG12(printk("qla%ld: IP local WWN:" -- "%02x%02x%02x%02x%02x%02x%02x%02x " -- "DID:%06x\n", -- ha->instance, -- 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.b24);) -- -- 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 */ -+ localdevices++; -+ } - - cleanup_allocation: -+ pci_free_consistent(ha->pdev, MAX_ID_LIST_SIZE, id_list, id_list_dma); - -- pci_free_consistent(ha->pdev, -- sizeof(GN_LIST_LENGTH), gn_list, phys_address); -+ if (new_fcport) -+ kfree(new_fcport); - --#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) -- if (status & BIT_0) -- printk(KERN_WARNING -- "%s(%ld): *** FAILED ***\n", -- __func__, -- ha->host_no); --#endif -+ if (rval & 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); -+ return (rval); - } - - -@@ -16543,7 +16109,7 @@ cleanup_allocation: - * Context: - * Kernel context. - */ --static os_tgt_t * -+os_tgt_t * - qla2x00_tgt_alloc(scsi_qla_host_t *ha, uint16_t t) - { - os_tgt_t *tq; -@@ -16599,7 +16165,7 @@ qla2x00_tgt_alloc(scsi_qla_host_t *ha, u - * Context: - * Kernel context. - */ --static void -+void - qla2x00_tgt_free(scsi_qla_host_t *ha, uint16_t t) - { - os_tgt_t *tq; -@@ -16648,7 +16214,7 @@ qla2x00_tgt_free(scsi_qla_host_t *ha, ui - * Context: - * Kernel context. - */ --static os_lun_t * -+os_lun_t * - qla2x00_lun_alloc(scsi_qla_host_t *ha, uint16_t t, uint16_t l) - { - os_lun_t *lq; -@@ -16741,9 +16307,6 @@ qla2x00_lun_free(scsi_qla_host_t *ha, ui - (lq = LUN_Q(ha, t, l)) != NULL) { - - LUN_Q(ha, t, l) = NULL; --#ifdef __VMWARE__ -- spin_lock_destroy(&lq->q_lock); --#endif - kfree(lq); - - DEBUG3(printk("Dealloc lun @ %p -- deleted\n", lq);) -@@ -16783,11 +16346,7 @@ qla2x00_process_response_queue_in_zio_mo - , flags); - /* Complete any commands in done_queue */ - if (!list_empty(&ha->done_queue)){ --#if QLA2X_PERFORMANCE -- tasklet_schedule(&ha->run_qla_task); --#else - qla2x00_done(ha); --#endif - } - - } -@@ -16814,7 +16373,7 @@ qla2x00_process_response_queue_in_zio_mo - * - * Note: This routine will always try to start I/O from visible HBA. - */ --static void -+void - qla2x00_next(scsi_qla_host_t *vis_ha) - { - scsi_qla_host_t *dest_ha = NULL; -@@ -16833,7 +16392,7 @@ qla2x00_next(scsi_qla_host_t *vis_ha) - dest_ha = fcport->ha; - - /* Check if command can be started, exit if not. */ -- if (LOOP_TRANSITION(dest_ha)) { -+ if (!(sp->flags & SRB_TAPE) && LOOP_TRANSITION(dest_ha)) { - break; - } - -@@ -16845,19 +16404,19 @@ qla2x00_next(scsi_qla_host_t *vis_ha) - - 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; -- -+ if (atomic_read(&dest_ha->loop_state) == LOOP_DOWN) { -+ sp->err_id = SRB_ERR_LOOP; - } else { -- sp->err_id = 1; -+ sp->err_id = SRB_ERR_PORT; - } -+ - DEBUG3(printk("scsi(%ld): loop/port is down - " -- "pid=%ld, sp=%p loopid=0x%x queued " -+ "pid=%ld, sp=%p err_id %d, loopid=0x%x queued " - "to dest HBA scsi%ld.\n", - dest_ha->host_no, - sp->cmd->serial_number, - sp, -+ sp->err_id, - fcport->loop_id, - dest_ha->host_no);) - /* -@@ -16882,12 +16441,18 @@ qla2x00_next(scsi_qla_host_t *vis_ha) - * 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) -- )) { -+ if (sp->flags & SRB_TAPE && -+ (atomic_read(&dest_ha->loop_state) != LOOP_READY)) { -+ qla2x00_extend_timeout(sp->cmd, -+ vis_ha->loop_down_timeout); -+ __add_to_retry_queue(vis_ha, sp); -+ continue; -+ } else if (!(sp->flags & (SRB_IOCTL | SRB_FDMI_CMD)) && -+ (atomic_read(&fcport->state) != FC_ONLINE || -+ test_bit(CFG_FAILOVER, &dest_ha->cfg_flags) || -+ test_bit(ABORT_ISP_ACTIVE, &dest_ha->dpc_flags) || -+ (atomic_read(&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" -@@ -16895,7 +16460,7 @@ qla2x00_next(scsi_qla_host_t *vis_ha) - dest_ha->host_no, - fcport->loop_id, - atomic_read(&fcport->state), -- dest_ha->loop_state, -+ atomic_read(&dest_ha->loop_state), - atomic_read(&dest_ha->loop_down_timer), - dest_ha->dpc_flags);) - -@@ -16908,7 +16473,7 @@ qla2x00_next(scsi_qla_host_t *vis_ha) - * if this request's lun is suspended then put the request on - * the scsi_retry queue. - */ -- if (!(sp->flags & SRB_IOCTL) && -+ if (!(sp->flags & (SRB_IOCTL | SRB_TAPE | SRB_FDMI_CMD)) && - sp->lun_queue->q_state == LUN_STATE_WAIT) { - DEBUG3(printk("%s(): lun wait state - pid=%ld, " - "opcode=%d, allowed=%d, retries=%d\n", -@@ -17109,7 +16674,7 @@ qla2x00_bstr_to_hex(char *s, uint8_t *bp - * Context: - * Kernel context. - */ --static int -+int - qla2x00_get_prop_xstr(scsi_qla_host_t *ha, - char *propname, uint8_t *propval, int size) - { -@@ -17162,7 +16727,7 @@ qla2x00_get_prop_xstr(scsi_qla_host_t *h - * Context: - * Kernel context. - */ --static void -+void - qla2x00_chg_endian(uint8_t buf[], size_t size) - { - uint8_t byte; -@@ -17191,7 +16756,7 @@ qla2x00_chg_endian(uint8_t buf[], size_t - * - * Note: Sets the ref_count for non Null sp to one. - */ --static uint8_t -+uint8_t - qla2x00_allocate_sp_pool(scsi_qla_host_t *ha) - { - srb_t *sp; -@@ -17236,7 +16801,7 @@ qla2x00_allocate_sp_pool(scsi_qla_host_t - if (ha->srb_alloc_cnt == 0) - status = QL_STATUS_ERROR; - -- printk(KERN_INFO -+ printk(KERN_DEBUG - "scsi(%ld): Allocated %d SRB(s).\n", - ha->host_no, - ha->srb_alloc_cnt); -@@ -17250,7 +16815,7 @@ qla2x00_allocate_sp_pool(scsi_qla_host_t - * This routine frees all adapter allocated memory. - * - */ --static void -+void - qla2x00_free_sp_pool( scsi_qla_host_t *ha) - { - struct list_head *list, *temp; -@@ -17497,60 +17062,182 @@ qla2x00_get_flash_manufacturer(scsi_qla_ - * - * Returns QL_STATUS_SUCCESS on successful retrieval of flash version. - */ --STATIC uint16_t -+uint16_t - qla2x00_get_flash_version(scsi_qla_host_t *ha) - { -+ uint8_t code_type, last_image; - uint16_t ret = QL_STATUS_SUCCESS; -- uint32_t loop_cnt = 1; /* this is for error exit only */ -- uint32_t pcir_adr; -- -- ENTER(__func__); -+ uint32_t pcihdr, pcids; - - 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)) { -+ -+ /* Begin with first PCI expansion ROM header. */ -+ pcihdr = 0; -+ last_image = 1; -+ do { -+ /* Verify PCI expansion ROM header. */ -+ if (qla2x00_read_flash_byte(ha, pcihdr) != 0x55 || -+ qla2x00_read_flash_byte(ha, pcihdr + 0x01) != 0xaa) { - /* No signature */ -- DEBUG2(printk(KERN_INFO "%s(): No matching signature.\n", -- __func__);) -+ DEBUG2(printk("scsi(%ld): No matching ROM 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(KERN_INFO "%s(): PCI data struct not found. " -- "pcir_adr=%x.\n", -- __func__, pcir_adr);) -+ /* Locate PCI data structure. */ -+ pcids = pcihdr + -+ ((qla2x00_read_flash_byte(ha, pcihdr + 0x19) << 8) | -+ qla2x00_read_flash_byte(ha, pcihdr + 0x18)); -+ -+ /* Validate signature of PCI data structure. */ -+ if (qla2x00_read_flash_byte(ha, pcids) != 'P' || -+ qla2x00_read_flash_byte(ha, pcids + 0x1) != 'C' || -+ qla2x00_read_flash_byte(ha, pcids + 0x2) != 'I' || -+ qla2x00_read_flash_byte(ha, pcids + 0x3) != 'R') { -+ /* Incorrect header. */ -+ DEBUG2(printk("%s(): PCI data struct not found " -+ "pcir_adr=%x.\n", -+ __func__, pcids)); - ret = QL_STATUS_ERROR; - break; - } - -- } while (--loop_cnt); -- qla2x00_flash_disable(ha); -+ /* Read version */ -+ code_type = qla2x00_read_flash_byte(ha, pcids + 0x14); -+ switch (code_type) { -+ case ROM_CODE_TYPE_BIOS: -+ /* Intel x86, PC-AT compatible. */ -+ set_bit(ROM_CODE_TYPE_BIOS, &ha->code_types); -+ ha->bios_revision[0] = -+ qla2x00_read_flash_byte(ha, pcids + 0x12); -+ ha->bios_revision[1] = -+ qla2x00_read_flash_byte(ha, pcids + 0x13); -+ DEBUG3(printk("%s(): read BIOS %d.%d.\n", __func__, -+ ha->bios_revision[1], ha->bios_revision[0])); -+ break; -+ case ROM_CODE_TYPE_FCODE: -+ /* Open Firmware standard for PCI (FCode). */ -+ /* Eeeewww... */ -+ if (qla2x00_get_fcode_version(ha, pcids) == -+ QL_STATUS_SUCCESS) -+ set_bit(ROM_CODE_TYPE_FCODE, &ha->code_types); -+ break; -+ case ROM_CODE_TYPE_EFI: -+ /* Extensible Firmware Interface (EFI). */ -+ set_bit(ROM_CODE_TYPE_EFI, &ha->code_types); -+ ha->efi_revision[0] = -+ qla2x00_read_flash_byte(ha, pcids + 0x12); -+ ha->efi_revision[1] = -+ qla2x00_read_flash_byte(ha, pcids + 0x13); -+ DEBUG3(printk("%s(): read EFI %d.%d.\n", __func__, -+ ha->efi_revision[1], ha->efi_revision[0])); -+ break; -+ default: -+ DEBUG2(printk("%s(): Unrecognized code type %x at " -+ "pcids %x.\n", __func__, code_type, pcids)); -+ break; -+ } - -- LEAVE(__func__); -+ last_image = qla2x00_read_flash_byte(ha, pcids + 0x15) & BIT_7; -+ -+ /* Locate next PCI expansion ROM. */ -+ pcihdr += ((qla2x00_read_flash_byte(ha, pcids + 0x11) << 8) | -+ qla2x00_read_flash_byte(ha, pcids + 0x10)) * 512; -+ } while (!last_image); -+ -+ qla2x00_flash_disable(ha); - - return (ret); - } - -+/** -+ * qla2x00_get_fcode_version() - Determine an FCODE image's version. -+ * @ha: HA context -+ * @pcids: Pointer to the FCODE PCI data structure -+ * -+ * The process of retrieving the FCODE version information is at best -+ * described as interesting. -+ * -+ * Within the first 100h bytes of the image an ASCII string is present -+ * which contains several pieces of information including the FCODE -+ * version. Unfortunately it seems the only reliable way to retrieve -+ * the version is by scanning for another sentinel within the string, -+ * the FCODE build date: -+ * -+ * ... 2.00.02 10/17/02 ... -+ * -+ * Returns QL_STATUS_SUCCESS on successful retrieval of version. -+ */ -+static uint16_t -+qla2x00_get_fcode_version(scsi_qla_host_t *ha, uint32_t pcids) -+{ -+ uint16_t ret = QL_STATUS_ERROR; -+ uint32_t istart, iend, iter, vend; -+ uint8_t do_next, *vbyte; -+ -+ memset(ha->fcode_revision, 0, sizeof(ha->fcode_revision)); -+ -+ /* Skip the PCI data structure. */ -+ istart = pcids + -+ ((qla2x00_read_flash_byte(ha, pcids + 0x0B) << 8) | -+ qla2x00_read_flash_byte(ha, pcids + 0x0A)); -+ iend = istart + 0x100; -+ do { -+ /* Scan for the sentinel date string...eeewww. */ -+ do_next = 0; -+ iter = istart; -+ while ((iter < iend) && !do_next) { -+ iter++; -+ if (qla2x00_read_flash_byte(ha, iter) == '/') { -+ if (qla2x00_read_flash_byte(ha, iter + 2) == -+ '/') -+ do_next++; -+ else if (qla2x00_read_flash_byte(ha, -+ iter + 3) == '/') -+ do_next++; -+ } -+ } -+ if (!do_next) -+ break; -+ -+ /* Backtrack to previous ' ' (space). */ -+ do_next = 0; -+ while ((iter > istart) && !do_next) { -+ iter--; -+ if (qla2x00_read_flash_byte(ha, iter) == ' ') -+ do_next++; -+ } -+ if (!do_next) -+ break; -+ -+ /* Mark end of version tag, and find previous ' ' (space). */ -+ vend = iter - 1; -+ do_next = 0; -+ while ((iter > istart) && !do_next) { -+ iter--; -+ if (qla2x00_read_flash_byte(ha, iter) == ' ') -+ do_next++; -+ } -+ if (!do_next) -+ break; -+ -+ /* Mark beginning of version tag, and copy data. */ -+ iter++; -+ if ((vend - iter) && -+ ((vend - iter) < sizeof(ha->fcode_revision))) { -+ vbyte = ha->fcode_revision; -+ while (iter <= vend) { -+ *vbyte++ = qla2x00_read_flash_byte(ha, iter); -+ iter++; -+ } -+ ret = QL_STATUS_SUCCESS; -+ } -+ } while (0); -+ -+ return ret; -+} -+ - #if defined(NOT_USED_FUNCTION) - /** - * qla2x00_get_flash_image() - Read image from flash chip. -@@ -17608,6 +17295,8 @@ qla2x00_set_flash_image(scsi_qla_host_t - - /* Reset ISP chip. */ - WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET); -+ /* Delay after reset, for chip to recover. */ -+ udelay(20); - - qla2x00_flash_enable(ha); - do { /* Loop once to provide quick error exit */ -@@ -17687,312 +17376,11 @@ qla2x00_set_flash_image(scsi_qla_host_t - return (status); - } - --#if USE_FLASH_DATABASE --#error Do not use FLASH DATABASE!!!! -- --/* --* qla2x00_flash_enable_database --* Setup flash for reading/writing. --* --* Input: --* ha = adapter block pointer. --*/ --STATIC void --qla2x00_flash_enable_database(scsi_qla_host_t *ha) --{ -- device_reg_t *reg = ha->iobase; -- -- /* Setup bit 16 of flash address. */ -- WRT_REG_WORD(®->nvram, NV_SELECT); -- -- /* Enable Flash Read/Write. */ -- WRT_REG_WORD(®->ctrl_status, CSR_FLASH_ENABLE); -- -- /* Read/Reset Command Sequence */ -- qla2x00_write_flash_byte(ha, 0x5555, 0xaa); -- qla2x00_write_flash_byte(ha, 0x2aaa, 0x55); -- qla2x00_write_flash_byte(ha, 0x5555, 0xf0); -- qla2x00_read_flash_byte(ha, FLASH_DATABASE_0); --} -- --/* --* qla2x00_flash_disable_database --* Disable flash and allow RISC to run. --* --* Input: --* ha = adapter block pointer. --*/ --STATIC void --qla2x00_flash_disable_database(scsi_qla_host_t *ha) --{ -- device_reg_t *reg = ha->iobase; -- -- /* Restore chip registers. */ -- WRT_REG_WORD(®->ctrl_status, 0); -- WRT_REG_WORD(®->nvram, 0); --} -- -- --/* --* qla2x00_get_database --* Copies and converts flash database to driver database. --* (may sleep) --* --* Input: --* ha = adapter block pointer. --* --* Returns: --* 0 = success. --*/ --STATIC uint8_t --qla2x00_get_database(scsi_qla_host_t *ha) --{ -- flash_database_t *fptr; -- uint8_t status = 1; -- uint32_t addr; -- uint16_t cnt; -- uint8_t *bptr; -- uint8_t checksum; -- uint32_t b, t; -- -- ENTER("qla2x00_get_database"); -- -- /* Default setup. */ -- ha->flash_db = FLASH_DATABASE_0; -- ha->flash_seq = 0; -- -- fptr = kmalloc(sizeof(flash_database_t), GFP_ATOMIC); -- if (!fptr) { -- printk(KERN_WARNING -- "scsi(%d): Memory Allocation failed - flash mem", -- (int)ha->host_no); -- ha->mem_err++; -- return (status); -- } -- -- /* Enable Flash Read/Write. */ -- qla2x00_flash_enable_database(ha); -- -- /* -- * Start with flash database with the highest sequence number. -- */ -- b = qla2x00_read_flash_byte(ha, FLASH_DATABASE_0); -- b |= qla2x00_read_flash_byte(ha, FLASH_DATABASE_0 + 1) << 8; -- b |= qla2x00_read_flash_byte(ha, FLASH_DATABASE_0 + 1) << 16; -- b |= qla2x00_read_flash_byte(ha, FLASH_DATABASE_0 + 1) << 24; -- t = qla2x00_read_flash_byte(ha, FLASH_DATABASE_1); -- t |= qla2x00_read_flash_byte(ha, FLASH_DATABASE_1 + 1) << 8; -- t |= qla2x00_read_flash_byte(ha, FLASH_DATABASE_1 + 1) << 16; -- t |= qla2x00_read_flash_byte(ha, FLASH_DATABASE_1 + 1) << 24; -- if (t > b) { -- ha->flash_db = FLASH_DATABASE_1; -- } -- -- /* Select the flash database with the good checksum. */ -- for (t = 0; t < 2; t++) { -- checksum = 0; -- addr = ha->flash_db; -- bptr = (uint8_t *)fptr; -- fptr->hdr.size = sizeof(flash_database_t); -- -- /* Read flash database to driver. */ -- for (cnt = 0; cnt < fptr->hdr.size; cnt++) { -- *bptr = (uint8_t)qla2x00_read_flash_byte(ha, addr++); -- checksum += *bptr++; -- if (bptr == &fptr->hdr.spares[0] && -- (fptr->hdr.size > sizeof(flash_database_t) || -- fptr->hdr.size < sizeof(flash_hdr_t) || -- !fptr->hdr.version) ) { -- -- checksum = 1; -- break; -- } -- } -- -- if (!checksum) { -- status = 0; -- break; -- } -- /* trying other database */ -- if (ha->flash_db == FLASH_DATABASE_0) { -- ha->flash_db = FLASH_DATABASE_1; -- } else { -- ha->flash_db = FLASH_DATABASE_0; -- } -- } -- -- if (!status) { -- ha->flash_seq = fptr->hdr.seq; -- -- /* Convert flash database to driver database format. */ -- if (fptr->hdr.size -= sizeof(flash_hdr_t)) { -- for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { -- ha->fc_db[cnt].name[0] = -- fptr->node[cnt].name[0]; -- ha->fc_db[cnt].name[1] = -- fptr->node[cnt].name[1]; -- /* UNKNOWN CODE!!! -- cnt, -- ha->fc_db[cnt].name[1], -- ha->fc_db[cnt].name[0]); -- */ -- -- ha->fc_db[cnt].loop_id = PORT_AVAILABLE; -- ha->fc_db[cnt].flag = 0; /* v2.19.05b3 */ -- if(!(fptr->hdr.size -= sizeof(flash_node_t))) -- break; -- } -- } -- } -- -- qla2x00_flash_disable_database(ha); -- -- kfree(fptr); -- --#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) -- if (status) -- printk("qla2x00_get_database: **** FAILED ****\n"); --#endif -- -- LEAVE("qla2x00_get_database"); -- -- return(status); --} -- --/* --* qla2x00_save_database --* Copies and converts driver database to flash database. --* (may sleep) --* --* Input: --* ha = adapter block pointer. --* --* Returns: --* 0 = success. --*/ --STATIC uint8_t --qla2x00_save_database(scsi_qla_host_t *ha) --{ -- flash_database_t *fptr; -- uint8_t status = 1; -- uint32_t addr; -- uint16_t cnt; -- uint8_t *bptr; -- uint8_t checksum; -- -- ENTER("qla2x00_save_database"); -- -- fptr = kmalloc(sizeof(flash_database_t), GFP_ATOMIC); -- if (!fptr) { -- printk(KERN_WARNING -- "scsi(%d): Memory Allocation failed - flash mem", -- (int)ha->host_no); -- ha->mem_err++; -- return (status); -- } -- -- /* Enable Flash Read/Write. */ -- qla2x00_flash_enable_database(ha); -- -- fptr->hdr.seq = ++ha->flash_seq; -- fptr->hdr.version = FLASH_DATABASE_VERSION; -- fptr->hdr.size = sizeof(flash_hdr_t); -- -- /* Copy and convert driver database to flash database. */ -- for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { -- if (ha->fc_db[cnt].loop_id == PORT_UNUSED) -- break; -- else { -- fptr->node[cnt].name[0] = ha->fc_db[cnt].name[0]; -- fptr->node[cnt].name[1] = ha->fc_db[cnt].name[1]; -- fptr->hdr.size += sizeof(flash_node_t); -- } -- } -- -- /* Calculate checksum. */ -- checksum = 0; -- bptr = (uint8_t *)fptr; -- for (cnt = 0; cnt < fptr->hdr.size; cnt++) -- checksum += *bptr++; -- fptr->hdr.checksum = ~checksum + 1; -- -- /* Setup next sector address for flash */ -- if (ha->flash_db == FLASH_DATABASE_0) -- addr = FLASH_DATABASE_1; -- else -- addr = FLASH_DATABASE_0; -- ha->flash_db = addr; -- -- /* Erase flash sector prior to write. */ -- status = qla2x00_erase_flash_sector(ha, addr); -- -- /* Write database to flash. */ -- bptr = (uint8_t *)fptr; -- for (cnt = 0; cnt < fptr->hdr.size && !status; cnt++) -- status = qla2x00_program_flash_address(ha, addr++, *bptr++); -- -- qla2x00_flash_disable_database(ha); -- -- kfree(fptr); -- --#if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) -- if (status) -- printk("qla2x00_save_database: **** FAILED ****\n"); --#endif -- -- LEAVE("qla2x00_save_database"); -- -- return(status); --} -- --#endif -- -- --/* -- *qla2x00_add_initiator_device -- * This routine adds the initiator device to the list -- * -- * Input: -- * ha = adapter block pointer. -- * device = device data pointer. -- * -- * Returns: -- * 0 = success, initiator added to the list -- * 1 = Failed to allocate memory -- */ --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); --} -- -- - /* - * Declarations for load module - */ - static Scsi_Host_Template driver_template = QLA2100_LINUX_TEMPLATE; --#include "../scsi_module.c" -+#include "scsi_module.c" - - /****************************************************************************/ - /* Driver Debug Functions. */ -@@ -18004,11 +17392,10 @@ qla2x00_dump_buffer(uint8_t * b, uint32_ - 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"); -- -+ 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); -@@ -18018,8 +17405,7 @@ qla2x00_dump_buffer(uint8_t * b, uint32_ - else - printk(" "); - } -- if (cnt % 16) -- printk("\n"); -+ printk("\n"); - } - - /************************************************************************** -@@ -18028,7 +17414,7 @@ qla2x00_dump_buffer(uint8_t * b, uint32_ - * Input - * cmd : Scsi_Cmnd - **************************************************************************/ --static void -+void - qla2x00_print_scsi_cmd(Scsi_Cmnd * cmd) - { - struct scsi_qla_host *ha; -@@ -18083,7 +17469,7 @@ qla2x00_print_scsi_cmd(Scsi_Cmnd * cmd) - * Input - * q: lun queue - */ --static void -+void - qla2x00_print_q_info(struct os_lun *q) - { - printk("Queue info: flags=0x%lx\n", q->q_flag); -@@ -18100,7 +17486,7 @@ qla2x00_print_q_info(struct os_lun *q) - * wd_size = word size 8, 16, 32 or 64 bits - * count = number of words. - */ --static void -+void - qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer, - uint8_t wd_size, uint32_t count) - { -@@ -18231,7 +17617,7 @@ qla2x00_panic(char *cp, struct Scsi_Host - * qla2x00_dump_requests - * - **************************************************************************/ --static void -+void - qla2x00_dump_requests(scsi_qla_host_t *ha) - { - -@@ -18418,6 +17804,7 @@ qla2x00_get_tokens(char *line, char **ar - } - - #if VSA -+/* XXX: There is no fc_db member in HA. */ - /* - * qla2x00_get_vsa_opt_from_config - * Get VSA option from the configuration parameters. -@@ -18506,8 +17893,6 @@ qla2x00_cfg_persistent_binding(scsi_qla_ - 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) { -@@ -18517,13 +17902,8 @@ qla2x00_cfg_persistent_binding(scsi_qla_ - 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) { - /* -@@ -18534,11 +17914,9 @@ qla2x00_cfg_persistent_binding(scsi_qla_ - 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);) -@@ -18556,20 +17934,11 @@ qla2x00_cfg_persistent_binding(scsi_qla_ - tgt, - pd_id->b24);) - break; -- -- case BIND_BY_NODE_NAME: -- DEBUG(printk("**bind tgt by port-%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__); -@@ -18580,7 +17949,7 @@ qla2x00_cfg_persistent_binding(scsi_qla_ - * kmem_zalloc - * Allocate and zero out the block of memory - */ --static inline void * -+inline void * - kmem_zalloc( int siz, int code, int id) - { - uint8_t *bp; -@@ -18627,6 +17996,7 @@ kmem_free(void *ptr) - /* - * Declarations for failover - */ -+ - #include "qla_cfg.c" - #include "qla_fo.c" - -@@ -18646,18 +18016,10 @@ static struct Scsi_Host *apidev_host = 0 - static int - apidev_open(struct inode *inode, struct file *file) - { --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - DEBUG9(printk(KERN_INFO - "%s(): open MAJOR number = %d, MINOR number = %d\n", - __func__, - MAJOR(inode->i_rdev), MINOR(inode->i_rdev));) --#else -- DEBUG9(printk(KERN_INFO -- "%s(): open MAJOR number = %d, MINOR number = %d\n", -- __func__, -- major(inode->i_rdev), minor(inode->i_rdev));) --#endif -- - return 0; - } - -@@ -18684,14 +18046,20 @@ apidev_ioctl(struct inode *inode, struct - } - - static struct file_operations apidev_fops = { -- ioctl: -- apidev_ioctl, -- open: -- apidev_open, -- release: -- apidev_close -+ owner: -+ THIS_MODULE, -+ ioctl: -+ apidev_ioctl, -+ open: -+ apidev_open, -+ release: -+ apidev_close - }; - -+#if defined(QLA_CONFIG_COMPAT) -+#include "qla_ppc64.c" -+#endif -+ - static int - apidev_init(struct Scsi_Host *host) - { -@@ -18717,22 +18085,19 @@ apidev_init(struct Scsi_Host *host) - host->hostt->proc_dir->name, - APIDEV_NODE, apidev_major);) - --#ifndef __VMWARE__ -- // XXX: Fix this when proc_mknod works again on main!!! --#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0) - proc_mknod(APIDEV_NODE, 0777+S_IFCHR, host->hostt->proc_dir, - (kdev_t)MKDEV(apidev_major, 0)); --#else -- proc_mknod(APIDEV_NODE, 0777+S_IFCHR, host->hostt->proc_dir, -- (kdev_t)mk_kdev(apidev_major, 0)); -+ -+#if defined(QLA_CONFIG_COMPAT) -+ apidev_init_ppc64(); - #endif --#endif //__VMWARE__ - - return 0; - } - - static int apidev_cleanup() - { -+ - if (!apidev_host) - return 0; - -@@ -18740,6 +18105,10 @@ static int apidev_cleanup() - remove_proc_entry(APIDEV_NODE,apidev_host->hostt->proc_dir); - apidev_host = 0; - -+#if defined(QLA_CONFIG_COMPAT) -+ apidev_cleanup_ppc64(); -+#endif -+ - return 0; - } - #endif /* APIDEV */ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2x00.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2x00.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2x00.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2x00.h 2004-04-22 19:42:53.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x --* Copyright (C) 2003 Qlogic Corporation -+* Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -45,12 +45,15 @@ extern "C" { - /* #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 */ -+/* #define QL_DEBUG_LEVEL_13 */ /* Output fdmi function trace msgs */ - - #define QL_DEBUG_CONSOLE /* Output to console */ - - #include <asm/bitops.h> - #include <asm/semaphore.h> - -+#define QLOGIC_COMPANY_NAME "QLogic Corporation" -+ - /* - * Data bit definitions. - */ -@@ -87,18 +90,14 @@ extern "C" { - #define BIT_30 0x40000000 - #define BIT_31 0x80000000 - --#define LS_64BITS(x) ((uint32_t)(0xffffffff & ((u64)(x)))) --#define MS_64BITS(x) ((uint32_t)(0xffffffff & (((u64)(x))>>16>>16))) -+#define LSB(x) ((uint8_t)(x)) -+#define MSB(x) ((uint8_t)((uint16_t)(x) >> 8)) - --#define MSB(x) (uint8_t)(((uint16_t)(x) >> 8) & 0xff) --#define LSB(x) (uint8_t)(x & 0xff) --#define MSW(x) (uint16_t)(((uint32_t)(x) >> 16) & 0xffff) --#define LSW(x) (uint16_t)(x & 0xffff) --#define QL21_64BITS_3RDWD(x) ((uint16_t) (( (x) >> 16) >> 16) & 0xffff) --#define QL21_64BITS_4THWD(x) ((uint16_t) ((( (x) >>16)>>16)>>16) & 0xffff) -+#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)) -+#define LSD(x) ((uint32_t)((uint64_t)(x))) -+#define MSD(x) ((uint32_t)((((uint64_t)(x)) >> 16) >> 16)) - - - -@@ -143,7 +142,7 @@ typedef char BOOL; - * I/O register - */ - /* #define MEMORY_MAPPED_IO */ /* Enable memory mapped I/O */ --#undef MEMORY_MAPPED_IO /* Disable memory mapped I/O */ -+#define MEMORY_MAPPED_IO 1 - - #if defined(MEMORY_MAPPED_IO) - #define RD_REG_BYTE(addr) readb(addr) -@@ -164,6 +163,10 @@ typedef char BOOL; - * Fibre Channel device definitions. - */ - #define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */ -+#if defined(ISP200) -+#define MAX_FABRIC_DEVICES 8 /* Fabric Devices */ -+#define MAX_LLOOP_DEVICES 16 /* Local Loop Devices */ -+#endif - #define MAX_FIBRE_DEVICES 256 - #define MAX_FIBRE_LUNS 256 - #define MAX_RSCN_COUNT 10 -@@ -186,14 +189,25 @@ typedef char BOOL; - /* - * Fibre Channel device definitions. - */ -+#if defined(EXTENDED_IDS) -+#define SNS_LAST_LOOP_ID 0x7ff -+#else -+#define SNS_LAST_LOOP_ID 0xfe -+#endif -+ - #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 RESERVED_LOOP_ID(x) ((x > LAST_LOCAL_LOOP_ID && \ -+ x < SNS_FIRST_LOOP_ID) || \ -+ x == MANAGEMENT_SERVER || \ -+ x == BROADCAST) -+ - #define SNS_ACCEPT 0x0280 /* 8002 swapped */ - #define SNS_REJECT 0x0180 /* 8001 swapped */ - -@@ -214,10 +228,10 @@ typedef char BOOL; - #define LOOP_DOWN_RESET (LOOP_DOWN_TIME - 30) - - /* Maximum outstanding commands in ISP queues (1-65535) */ --#define MAX_OUTSTANDING_COMMANDS 1024 -+#define MAX_OUTSTANDING_COMMANDS 2048 - - /* ISP request and response entry counts (37-65535) */ --#define REQUEST_ENTRY_CNT 128 /* Number of request entries. */ -+#define REQUEST_ENTRY_CNT 512 /* Number of request entries. */ - #if defined(ISP2100) || defined(ISP2200) - #define RESPONSE_ENTRY_CNT 64 /* Number of response entries.*/ - #else -@@ -243,16 +257,12 @@ typedef char BOOL; - #define SGDATA_PER_REQUEST 2 - #define SGDATA_PER_CONT 7 - --#define SG_SEGMENTS (SGDATA_PER_REQUEST + (SGDATA_PER_CONT * REQUEST_ENTRY_CNT - 2)) -- - /* - * SCSI Request Block - */ - typedef struct srb - { - struct list_head list; -- struct srb *s_next; /* (4) Next block on LU queue */ -- struct srb *s_prev; /* (4) Previous block on LU queue */ - Scsi_Cmnd *cmd; /* Linux SCSI command pkt */ - struct scsi_qla_host *ha; /* ha this SP is queued on */ - uint8_t more_cdb[4]; /* For 16 bytes CDB pass thru cmd since -@@ -288,10 +298,15 @@ typedef struct srb - /* 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. */ -+ 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 */ -+#define SRB_ERR_PORT 1 /* Request failed because "port down" */ -+#define SRB_ERR_LOOP 2 /* Request failed because "loop down" */ -+#define SRB_ERR_DEVICE 3 /* Request failed because "device error" */ -+#define SRB_ERR_OTHER 4 -+ - uint8_t cmd_length; /* command length */ - uint8_t qfull_retry_count; - -@@ -301,7 +316,7 @@ typedef struct srb - 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 failov er queue*/ -+ 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; -@@ -329,6 +344,8 @@ typedef struct srb - #define SRB_ISP_STARTED BIT_11 /* Command sent to ISP. */ - - #define SRB_ISP_COMPLETED BIT_12 /* ISP finished with command */ -+#define SRB_FDMI_CMD BIT_13 /* MSIOCB/non-ioctl command. */ -+#define SRB_TAPE BIT_14 /* TAPE command. */ - - - /* -@@ -440,7 +457,7 @@ typedef volatile struct - - #else - /* -- * I/O Register Set structure definitions for ISP2300. -+ * I/O Register Set structure definitions for ISP2300/ISP200. - */ - typedef volatile struct - { -@@ -597,12 +614,23 @@ typedef struct { - #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_PORT_ID_USED 0x4007 -+#define MBS_LOOP_ID_USED 0x4008 -+#define MBS_ALL_IDS_IN_USE 0x4009 /* For ISP200 if host tries to log -+ into more than 8 targets */ -+#define MBS_NOT_LOGGED_IN 0x400A -+ - #define MBS_FATAL_ERROR 0xF000 /* Command Fatal Error. */ - - #define MBS_FIRMWARE_ALIVE 0x0000 - #define MBS_COMMAND_COMPLETE 0x4000 - #define MBS_INVALID_COMMAND 0x4001 - -+/* F/W will return mbx0:0x4005 and mbx1:0x16 if -+ * HBA tries to log into a target through FL Port -+ */ -+#define MBS_SC_TOPOLOGY_ERR 0x16 -+ - /* QLogic subroutine status definitions */ - #define QL_STATUS_SUCCESS 0 - #define QL_STATUS_ERROR 1 -@@ -632,11 +660,17 @@ typedef struct { - #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. */ - #define MBA_ZIO_UPDATE 0x8040 /* ZIO-Process response queue */ --#endif -+#define RIO_MBS_CMD_CMP_1_16 0x8031 /* Scsi command complete */ -+#define RIO_MBS_CMD_CMP_2_16 0x8032 /* Scsi command complete */ -+#define RIO_MBS_CMD_CMP_3_16 0x8033 /* Scsi command complete */ -+#define RIO_MBS_CMD_CMP_4_16 0x8034 /* Scsi command complete */ -+#define RIO_MBS_CMD_CMP_5_16 0x8035 /* Scsi command complete */ -+#define RIO_RESPONSE_UPDATE 0x8040 /* Scsi command complete but check iocb */ -+ -+ - - /* - * ISP mailbox commands -@@ -689,7 +723,7 @@ typedef struct { - #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_GET_ID_LIST 0x7C /* Get Port ID list. */ - #define MBC_SEND_LFA_COMMAND 0x7D /* Send Loop Fabric Address */ - #define MBC_LUN_RESET 0x7E /* Send LUN reset */ - -@@ -1203,10 +1237,12 @@ struct qla2x00_hba_features - /* For future QLA2XXX */ - #define NVRAM_MOD_OFFSET 200 /* Model Number offset: 200-215 */ - #define BINZERO "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" --#define NVRAM_MODEL_SIZE 16 /* 16 bytes reserved for model_num string*/ - - #endif - -+#define NVRAM_HW_ID_SIZE 16 /* 16 bytes reserved for hw_id string*/ -+#define NVRAM_MODEL_SIZE 16 /* 16 bytes reserved for model_num string*/ -+ - #if !defined(ISP2100) - - /* -@@ -1283,7 +1319,10 @@ typedef struct - uint8_t link_down_timeout; - - /* Offset 112 */ -- uint8_t reserved_7_2[38]; -+ uint8_t hw_id[16]; -+ -+ /* Offset 128 */ -+ uint8_t reserved_7_2[22]; - - /* Offset 150 */ - uint16_t reserved_8[25]; -@@ -1404,8 +1443,12 @@ typedef struct - 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 -@@ -1437,8 +1480,12 @@ typedef struct - 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; -@@ -1554,8 +1601,12 @@ typedef struct - 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 */ -@@ -1633,8 +1684,12 @@ typedef struct - uint32_t sys_define_2; /* System defined. */ - uint8_t reserved_8; - uint8_t initiator_id; -+#if defined(EXTENDED_IDS) -+ uint16_t target; -+#else - uint8_t reserved_1; - uint8_t target_id; -+#endif - uint32_t reserved_2; - uint16_t status; - uint16_t task_flags; -@@ -1657,8 +1712,12 @@ typedef struct - uint32_t sys_define_2; /* System defined. */ - uint8_t reserved_8; - uint8_t initiator_id; -+#if defined(EXTENDED_IDS) -+ uint16_t target; -+#else - uint8_t reserved_1; - uint8_t target_id; -+#endif - uint16_t flags; - uint16_t reserved_2; - uint16_t status; -@@ -1678,8 +1737,12 @@ typedef struct - 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 initiator_id; -+#else - uint8_t reserved_8; - uint8_t initiator_id; -+#endif - uint16_t exchange_id; - uint16_t flags; - uint16_t status; -@@ -1707,8 +1770,12 @@ typedef struct - 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 initiator_id; -+#else - uint8_t reserved_8; - uint8_t initiator_id; -+#endif - uint16_t exchange_id; - uint16_t flags; - uint16_t status; -@@ -1738,8 +1805,12 @@ typedef struct - 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 initiator_id; -+#else - uint8_t reserved_8; - uint8_t initiator_id; -+#endif - uint16_t exchange_id; - uint16_t flags; - uint16_t status; -@@ -1763,8 +1834,12 @@ typedef struct - 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 initiator_id; -+#else - uint8_t reserved_8; - uint8_t initiator_id; -+#endif - uint16_t exchange_id; - uint16_t flags; - uint16_t status; -@@ -1792,8 +1867,12 @@ typedef struct - 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 initiator_id; -+#else - uint8_t reserved_8; - uint8_t initiator_id; -+#endif - uint16_t exchange_id; - uint16_t flags; - uint16_t status; -@@ -1883,10 +1962,15 @@ typedef struct - 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. */ -+#define CF_ELS_PASSTHRU BIT_15 - uint16_t reserved2; - uint16_t timeout; - uint16_t cmd_dsd_count; -@@ -1904,6 +1988,31 @@ typedef struct - uint32_t dseg_rsp_length; /* Data segment 1 length. */ - } ms_iocb_entry_t; - -+/* 4.15 -+ * RIO Type 1 IOCB response -+ */ -+struct rio_iocb_type1_entry -+{ -+ uint8_t entry_type; /* Entry type. */ -+ #define RIO_IOCB_TYPE1 0x21 /* IO Completion IOCB */ -+ uint8_t entry_count; /* Entry count. */ -+ uint8_t handle_count; /* # of valid handles. */ -+ uint8_t entry_status; /* Entry Status. */ -+ uint32_t handle[14]; /* handles finished */ -+}; -+ -+/* 4.16 -+ * RIO Type 2 IOCB response -+ */ -+struct rio_iocb_type2_entry -+{ -+ uint8_t entry_type; /* Entry type. */ -+ #define RIO_IOCB_TYPE2 0x22 /* IO Completion IOCB */ -+ uint8_t entry_count; /* Entry count. */ -+ uint8_t handle_count; /* # of valid handles. */ -+ uint8_t entry_status; /* Entry Status. */ -+ uint16_t handle[29]; /* handles finished */ -+}; - - /* - * ISP request and response queue entry sizes -@@ -1941,11 +2050,8 @@ typedef struct - #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 -@@ -1994,36 +2100,18 @@ typedef union { - }b; - } port_id_t; - --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; -+/* -+ * 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; - --/* New device name list struct; used in configure_fabric. */ --struct new_dev { -- port_id_t d_id; -- uint8_t name[WWN_SIZE]; /* node name */ -- uint8_t wwn[WWN_SIZE]; /* port name */ -- uint16_t ignore; --}; --#define LOGOUT_PERFORMED 0x01 - /* - * Inquiry command structure. - */ -@@ -2038,6 +2126,26 @@ typedef struct { - uint8_t inq[INQ_DATA_SIZE]; - } inq_cmd_rsp_t; - -+#define VITAL_PRODUCT_DATA_SIZE 32 -+#define INQ_EVPD_SET 1 -+#define INQ_DEV_IDEN_PAGE 0x83 -+#define WWLUN_SIZE 32 -+ -+typedef struct { -+ union { -+ cmd_a64_entry_t cmd; -+ sts_entry_t rsp; -+ } p; -+ uint8_t inq[VITAL_PRODUCT_DATA_SIZE]; -+} evpd_inq_cmd_rsp_t; -+ -+typedef struct { -+ union { -+ cmd_a64_entry_t cmd; -+ sts_entry_t rsp; -+ } p; -+} tur_cmd_rsp_t; -+ - /* - * Report LUN command structure. - */ -@@ -2092,7 +2200,7 @@ typedef struct os_tgt { - atomic_t q_timer; /* suspend timer */ - unsigned long q_flags; /* suspend flags */ - #define TGT_SUSPENDED 1 --#define TGT_UNSUSPENDED 2 -+#define TGT_RETRY_CMDS 2 - } os_tgt_t; - - /* -@@ -2141,32 +2249,45 @@ typedef struct lun_bit_mask { - } lun_bit_mask_t; - - /* -+ * Fibre channel port type. -+ */ -+ typedef enum { -+ FCT_UNKNOWN, -+ FCT_RSCN, -+ FCT_SWITCH, -+ FCT_BROADCAST, -+ FCT_INITIATOR, -+ FCT_TARGET -+} fc_port_type_t; -+ -+/* - * Fibre channel port structure. - */ - typedef struct fc_port { -- struct fc_port *next; -- struct fc_lun *fclun; -+ 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 */ -+ uint16_t dev_id; - #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 */ - 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 -+ int login_retry; -+ atomic_t state; /* state for I/O routing */ -+#define FC_DEVICE_DEAD 1 /* Device has been missing for the expired time */ -+ /* "port timeout" */ -+#define FC_DEVICE_LOST 2 /* Device is missing */ -+#define FC_ONLINE 3 /* Device is ready and online */ - -- uint8_t flags; -+ uint16_t flags; - #define FC_FABRIC_DEVICE BIT_0 - #define FC_TAPE_DEVICE BIT_1 - #define FC_INITIATOR_DEVICE BIT_2 -@@ -2174,7 +2295,25 @@ typedef struct fc_port { - #define FC_VSA BIT_4 - #define FC_HD_DEVICE BIT_5 - #define FC_SUPPORT_RPT_LUNS BIT_6 -- atomic_t port_down_timer; -+#define FC_XP_DEVICE BIT_7 -+#define FC_CONFIG_DEVICE BIT_8 -+#define FC_MSA_DEVICE BIT_9 -+#define FC_MSA_PORT_ACTIVE BIT_10 -+#define FC_FAILBACK_DISABLE BIT_11 -+#define FC_LOGIN_NEEDED BIT_12 -+#define FC_EVA_DEVICE BIT_13 -+#define FC_FAILOVER_DISABLE BIT_14 -+ int16_t cfg_id; /* index into cfg device table */ -+ uint16_t notify_type; -+ atomic_t port_down_timer; -+ int (*fo_combine)(void *, uint16_t, -+ struct fc_port *, uint16_t ); -+ int (*fo_detect)(void); -+ int (*fo_notify)(void); -+ int (*fo_select)(void); -+ -+ fc_port_type_t port_type; -+ - lun_bit_mask_t lun_mask; - } fc_port_t; - -@@ -2182,28 +2321,22 @@ typedef struct fc_port { - * Fibre channel LUN structure. - */ - typedef struct fc_lun { -- struct fc_lun *next; -+ 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 -+#define FC_VISIBLE_LUN BIT_2 -+#define FC_ACTIVE_LUN BIT_3 -+ uint8_t inq0; - u_long kbytes; -+ void *mplun; -+ void *mpbuf; /* ptr to buffer use by multi-path driver */ -+ int mplen; - } 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. -@@ -2607,6 +2740,13 @@ typedef struct scsi_qla_host - uint32_t total_dev_errs; /* device error cnt */ - uint32_t total_ios; /* IO cnt */ - uint64_t total_bytes; /* xfr byte cnt */ -+ -+ uint64_t total_input_cnt; /* input request cnt */ -+ uint64_t total_output_cnt; /* output request cnt */ -+ uint64_t total_ctrl_cnt; /* control request cnt */ -+ uint64_t total_input_bytes; /* input xfr bytes cnt */ -+ uint64_t total_output_bytes; /* output xfr bytes cnt */ -+ - uint32_t total_mbx_timeout; /* mailbox timeout cnt */ - uint32_t total_loop_resync; /* loop resyn cnt */ - -@@ -2656,37 +2796,30 @@ typedef struct scsi_qla_host - uint16_t max_targets; - - /* Fibre Channel Device List. */ -- fc_port_t *fcport; -+ 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; -+ -+ unsigned long last_irq_cpu; /* cpu where we got our last irq */ - --#if QLA2X_PERFORMANCE -- /* Doneq bottom half handler */ -- struct tasklet_struct run_qla_task; --#endif - /* - * 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 -+ spinlock_t list_lock ____cacheline_aligned; -+ /* 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 */ -@@ -2695,17 +2828,9 @@ typedef struct scsi_qla_host - 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 */ - struct task_struct *dpc_handler; /* kernel thread */ -@@ -2717,6 +2842,15 @@ typedef struct scsi_qla_host - /* Received ISP mailbox data. */ - volatile uint16_t mailbox_out[MAILBOX_REGISTER_COUNT]; - -+ /* 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 ____cacheline_aligned; -+ - /* Outstandings ISP commands. */ - srb_t *outstanding_cmds[MAX_OUTSTANDING_COMMANDS]; - uint32_t current_outstanding_cmd; -@@ -2815,6 +2949,7 @@ typedef struct scsi_qla_host - uint8_t *cmdline; - - uint32_t login_retry_count; -+ - - volatile struct - { -@@ -2825,7 +2960,7 @@ typedef struct scsi_qla_host - - uint32_t port_name_used :1; /* 4 */ - uint32_t failover_enabled :1; /* 5 */ -- uint32_t watchdog_enabled :1; /* 6 */ -+ uint32_t failback_disabled :1; /* 6 */ - uint32_t cfg_suspended :1; /* 7 */ - - uint32_t disable_host_adapter :1; /* 8 */ -@@ -2853,11 +2988,7 @@ typedef struct scsi_qla_host - #if defined(FC_IP_SUPPORT) - uint32_t enable_ip :1; /* 27 */ - #endif --#if defined(ISP2300) - uint32_t process_response_queue :1; /* 28 */ --#endif -- -- - } flags; - - uint32_t device_flags; -@@ -2912,6 +3043,7 @@ typedef struct scsi_qla_host - #define ISP_ABORT_RETRY 27 /* ISP aborted. */ - - #define PORT_SCAN_NEEDED 28 /* */ -+#define IOCTL_ERROR_RECOVERY 29 - - - /* macro for timer to start dpc for handling mailbox commands */ -@@ -2926,13 +3058,13 @@ typedef struct scsi_qla_host - 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 --#define LOOP_DEAD 0x20 /* Link Down Timer expires */ -+ atomic_t loop_state; -+#define LOOP_TIMEOUT 1 -+#define LOOP_DOWN 2 -+#define LOOP_UP 3 -+#define LOOP_UPDATE 4 -+#define LOOP_READY 5 -+#define LOOP_DEAD 6 /* Link Down Timer expires */ - - mbx_cmd_t mc; - uint32_t mbx_flags; -@@ -2948,8 +3080,15 @@ typedef struct scsi_qla_host - hba_ioctl_context *ioctl; - uint8_t node_name[WWN_SIZE]; - -- uint8_t optrom_major; -- uint8_t optrom_minor; -+ /* PCI expansion ROM image information. */ -+ unsigned long code_types; -+#define ROM_CODE_TYPE_BIOS 0 -+#define ROM_CODE_TYPE_FCODE 1 -+#define ROM_CODE_TYPE_EFI 3 -+ -+ uint8_t bios_revision[2]; -+ uint8_t efi_revision[2]; -+ uint8_t fcode_revision[16]; - - uint8_t nvram_version; - -@@ -2963,7 +3102,7 @@ typedef struct scsi_qla_host - uint8_t serial1; - uint8_t serial2; - -- /* Offset 200-215 : Model Number */ -+ /* NVRAM Offset 200-215 : Model Number */ - uint8_t model_number[16]; - - /* oem related items */ -@@ -2978,6 +3117,7 @@ typedef struct scsi_qla_host - uint32_t failback_delay; - unsigned long cfg_flags; - #define CFG_ACTIVE 0 /* CFG during a failover, event update, or ioctl */ -+#define CFG_FAILOVER 1 /* CFG during path change */ - /* uint8_t cfg_active; */ - int eh_start; - -@@ -2993,7 +3133,6 @@ typedef struct scsi_qla_host - 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 */ - -@@ -3010,10 +3149,23 @@ typedef struct scsi_qla_host - #endif - ms_iocb_entry_t *ms_iocb; - dma_addr_t ms_iocb_dma; -- struct ct_sns_pkt *ct_sns; -- dma_addr_t ct_sns_dma; -+ void *ct_iu; -+ dma_addr_t ct_iu_dma; -+ -+ Scsi_Cmnd *ioctl_err_cmd; - -+ unsigned long fdmi_flags; -+#define FDMI_REGISTER_NEEDED 0 /* bit 0 */ - -+ /* Hardware ID/version string from NVRAM */ -+ uint8_t hw_id_version[16]; -+ /* Model description string from our table based on NVRAM spec */ -+ uint8_t model_desc[80]; -+ -+ /* Scsi midlayer lock */ -+#if defined(SH_HAS_HOST_LOCK) -+ spinlock_t host_lock ____cacheline_aligned; -+#endif - } scsi_qla_host_t; - - #if defined(__BIG_ENDIAN) -@@ -3059,8 +3211,6 @@ typedef struct scsi_qla_host - #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);} -@@ -3078,35 +3228,46 @@ typedef struct scsi_qla_host - } - #endif - --static void qla2x00_device_queue_depth(scsi_qla_host_t *, Scsi_Device *); -+void qla2x00_device_queue_depth(scsi_qla_host_t *, Scsi_Device *); - #endif - --#if defined(__386__) --# define QLA2100_BIOSPARAM qla2x00_biosparam --#else --# define QLA2100_BIOSPARAM NULL --#endif - - /* - * Linux - SCSI Driver Interface Function Prototypes. - */ --static int qla2x00_ioctl(Scsi_Device *, int , void *); --static int qla2x00_proc_info ( char *, char **, off_t, int, int, int); --static const char * qla2x00_info(struct Scsi_Host *host); --static int qla2x00_detect(Scsi_Host_Template *); --static int qla2x00_release(struct Scsi_Host *); --static const char * qla2x00_info(struct Scsi_Host *); --static int qla2x00_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); -+int qla2x00_ioctl(Scsi_Device *, int , void *); -+int qla2x00_proc_info ( char *, char **, off_t, int, int, int); -+const char * qla2x00_info(struct Scsi_Host *host); -+int qla2x00_detect(Scsi_Host_Template *); -+int qla2x00_release(struct Scsi_Host *); -+const char * qla2x00_info(struct Scsi_Host *); -+int qla2x00_queuecommand(Scsi_Cmnd *, void (* done)(Scsi_Cmnd *)); - int qla2x00_abort(Scsi_Cmnd *); - int qla2x00_reset(Scsi_Cmnd *, unsigned int); --static int qla2x00_biosparam(Disk *, kdev_t, int[]); --static void qla2x00_intr_handler(int, void *, struct pt_regs *); -+int qla2x00_biosparam(Disk *, kdev_t, int[]); -+void qla2x00_intr_handler(int, void *, struct pt_regs *); - #if !defined(MODULE) --static int __init qla2x00_setup (char *s); -+static int __init qla2100_setup (char *s); - #else - void qla2x00_setup(char *s); - #endif - -+#if defined(CONFIG_COMPAT) || \ -+ ( defined(CONFIG_SUSE_KERNEL) && \ -+ (defined(CONFIG_PPC64) || defined(CONFIG_X86_64))) -+#define QLA_CONFIG_COMPAT -+#endif -+ -+/* -+ * Scsi_Host_template (see hosts.h) -+ * Device driver Interfaces to mid-level SCSI driver. -+ */ -+ -+/* Kernel version specific template additions */ -+ -+/* Number of segments 1 - 65535 */ -+#define SG_SEGMENTS 32 /* Cmd entry + 6 continuations */ -+ - /* - * Scsi_Host_template (see hosts.h) - * Device driver Interfaces to mid-level SCSI driver. -@@ -3119,7 +3280,7 @@ void qla2x00_setup(char *s); - * - */ - #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,8) --#define TEMPLATE_MAX_SECTORS max_sectors: 8192, -+#define TEMPLATE_MAX_SECTORS max_sectors: 512, - #else - #define TEMPLATE_MAX_SECTORS - #endif -@@ -3127,60 +3288,99 @@ void qla2x00_setup(char *s); - * use_new_eh_code - * - */ --#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) --#define TEMPLATE_USE_NEW_EH_CODE --#else - #define TEMPLATE_USE_NEW_EH_CODE use_new_eh_code: 1, --#endif - /* - * emulated - * - */ --#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) --#define TEMPLATE_EMULATED --#else - #define TEMPLATE_EMULATED emulated: 0, --#endif - /* - * next - * - */ --#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) --#define TEMPLATE_NEXT --#else - #define TEMPLATE_NEXT next: NULL, --#endif - /* - * module - * - */ --#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) --#define TEMPLATE_MODULE --#else - #define TEMPLATE_MODULE module: NULL, --#endif - /* - * proc_dir - * - */ --#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) --#define TEMPLATE_PROC_DIR --#else - #define TEMPLATE_PROC_DIR proc_dir: NULL, -+ -+/* highmem_io */ -+#ifdef SHT_HAS_HIGHMEM_IO -+#define TEMPLATE_HIGHMEM_IO highmem_io: 1, -+#else -+#define TEMPLATE_HIGHMEM_IO -+#endif -+/* can_dma_32 */ -+#ifdef SHT_HAS_CAN_DMA_32 -+#define TEMPLATE_CAN_DMA_32 can_dma_32: 1, -+#else -+#define TEMPLATE_CAN_DMA_32 -+#endif -+/* single_sg_ok A.S. 2.1 */ -+#ifdef SHT_HAS_SINGLE_SG_OK -+#define TEMPLATE_SINGLE_SG_OK single_sg_ok: 1, -+#else -+#define TEMPLATE_SINGLE_SG_OK -+#endif -+/* can_do_varyio -- A.S. 2.1 */ -+#ifdef SHT_HAS_CAN_DO_VARYIO -+#define TEMPLATE_CAN_DO_VARYIO can_do_varyio: 1, -+#else -+#define TEMPLATE_CAN_DO_VARYIO -+#endif -+/* vary_io -- SLES 8 */ -+#ifdef SHT_HAS_VARY_IO -+#define TEMPLATE_VARY_IO vary_io: 1, -+#else -+#define TEMPLATE_VARY_IO - #endif - -+/* RHEL3 specifics */ -+ -+/* need_plug_timer -- RHEL3 */ -+#ifdef SHT_HAS_NEED_PLUG_TIMER -+/* As per RH, backout scsi-affine feature. */ -+#define TEMPLATE_NEED_PLUG_TIMER -+/*#define TEMPLATE_NEED_PLUG_TIMER need_plug_timer: 1, */ -+#else -+#define TEMPLATE_NEED_PLUG_TIMER -+#endif -+ -+/* -+ * There are several Scsi_Host members that are RHEL3 specific -+ * yet depend on the SCSI_HAS_HOST_LOCK define for visibility. -+ * Unfortuantely, it seems several RH kernels have the define -+ * set, but do not have a host_lock member. -+ * -+ * Use the SH_HAS_HOST_LOCK define determined during driver -+ * compilation rather than SCSI_HAS_HOST_LOCK. -+ * -+ * Also use SH_HAS_CAN_QUEUE_MASK to determine if can_queue_mask -+ * is an Scsi_Host member. -+ * -+ * SH_HAS_HOST_LOCK -- host_lock defined -+ * SH_HAS_CAN_QUEUE_MASK -- can_queue_mask defined -+ */ - -+/* As per RH, backout scsi-affine feature. */ -+#undef SH_HAS_CAN_QUEUE_MASK - - #define QLA2100_LINUX_TEMPLATE { \ - TEMPLATE_NEXT \ - TEMPLATE_MODULE \ - TEMPLATE_PROC_DIR \ - proc_info: qla2x00_proc_info, \ -- name: "Qlogic Fibre Channel 2x00", \ -+ name: "QLogic Fibre Channel 2x00", \ - detect: qla2x00_detect, \ - release: qla2x00_release, \ - info: qla2x00_info, \ -- ioctl: qla2x00_ioctl, \ -+ ioctl: qla2x00_ioctl, \ - command: NULL, \ - queuecommand: qla2x00_queuecommand, \ - eh_strategy_handler: NULL, \ -@@ -3191,19 +3391,23 @@ TEMPLATE_PROC_DIR \ - abort: NULL, \ - reset: NULL, \ - slave_attach: NULL, \ -- bios_param: QLA2100_BIOSPARAM, \ -- can_queue: 256, /* max simultaneous cmds */\ -+ bios_param: qla2x00_biosparam, \ -+ can_queue: REQUEST_ENTRY_CNT+128, /* max simultaneous cmds */\ - this_id: -1, /* scsi id of host adapter */\ - sg_tablesize: SG_SEGMENTS, /* max scatter-gather cmds */\ - cmd_per_lun: 3, /* cmds per lun (linked cmds) */\ - present: 0, /* number of 7xxx's present */\ - unchecked_isa_dma: 0, /* no memory DMA restrictions */\ -- use_clustering: ENABLE_CLUSTERING, \ - TEMPLATE_USE_NEW_EH_CODE \ - TEMPLATE_MAX_SECTORS \ - TEMPLATE_EMULATED \ -- highmem_io :1, \ -- vary_io: 1, \ -+TEMPLATE_HIGHMEM_IO \ -+TEMPLATE_CAN_DMA_32 \ -+TEMPLATE_SINGLE_SG_OK \ -+TEMPLATE_CAN_DO_VARYIO \ -+TEMPLATE_VARY_IO \ -+TEMPLATE_NEED_PLUG_TIMER \ -+ use_clustering: ENABLE_CLUSTERING \ - } - - #endif /* _IO_HBA_QLA2100_H */ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2x00_ioctl.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2x00_ioctl.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla2x00_ioctl.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla2x00_ioctl.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -18,9 +18,8 @@ - ******************************************************************************/ - - --#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_PT_CMD_DRV_TOV (ql2xioctltimeout + 1) /* drvr timeout */ -+#define QLA_IOCTL_ACCESS_WAIT_TIME (ql2xioctltimeout + 2) /* wait_q tov */ - #define QLA_INITIAL_IOCTLMEM_SIZE (2 * PAGE_SIZE) - #define QLA_IOCTL_SCRAP_SIZE 2048 /* scrap memory for local use. */ - -@@ -39,12 +38,12 @@ - #if defined(INTAPI) - #include "inioct.h" - /* from qla_inioct.c */ --static int qla2x00_read_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); --static int qla2x00_update_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); --static int qla2x00_write_nvram_word(scsi_qla_host_t *, uint8_t, uint16_t); --static int qla2x00_send_loopback(scsi_qla_host_t *, EXT_IOCTL *, int); --static int qla2x00_read_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); --static int qla2x00_update_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); -+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); - #endif - - -@@ -58,11 +57,6 @@ STATIC void qla2x00_free_ioctl_mem(scsi_ - STATIC int qla2x00_get_ioctl_scrap_mem(scsi_qla_host_t *, void **, uint32_t); - STATIC void qla2x00_free_ioctl_scrap_mem(scsi_qla_host_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 *); -@@ -83,15 +77,17 @@ STATIC int qla2x00_get_statistics(scsi_q - 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_get_fcport_summary(scsi_qla_host_t *, EXT_DEVICEDATAENTRY *, -- void *, uint32_t, uint32_t *, uint32_t *); -+ void *, uint32_t, uint32_t, uint32_t *, uint32_t *); -+#if 0 - STATIC int qla2x00_std_missing_port_summary(scsi_qla_host_t *, - EXT_DEVICEDATAENTRY *, void *, uint32_t, uint32_t *, uint32_t *); -+#endif - STATIC int qla2x00_query_driver(scsi_qla_host_t *, EXT_IOCTL *, int); - STATIC int qla2x00_query_fw(scsi_qla_host_t *, EXT_IOCTL *, int); - - STATIC int qla2x00_msiocb_passthru(scsi_qla_host_t *, EXT_IOCTL *, int, - int); --#if defined(ISP2300) -+#if defined(ISP2300) - STATIC int qla2x00_send_els_passthru(scsi_qla_host_t *, EXT_IOCTL *, - Scsi_Cmnd *, fc_port_t *, fc_lun_t *, int); - #endif -@@ -208,6 +204,7 @@ qla2x00_scsi_pt_done(Scsi_Cmnd *pscsi_cm - /* save detail status for IOCTL reporting */ - ha->ioctl->SCSIPT_InProgress = 0; - ha->ioctl->ioctl_tov = 0; -+ ha->ioctl_err_cmd = NULL; - - up(&ha->ioctl->cmpl_sem); - -@@ -260,7 +257,7 @@ qla2x00_msiocb_done(Scsi_Cmnd *pscsi_cmd - * ret != 0 Failed; detailed status copied to EXT_IOCTL structure - * if possible - *************************************************************************/ --STATIC int -+int - qla2x00_ioctl(Scsi_Device *dev, int cmd, void *arg) - { - int mode = 0; -@@ -285,13 +282,6 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - 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=%x arg=%p.\n", __func__, cmd, arg);) -- return (ret); -- } -- - /* Allocate ioctl structure buffer to support multiple concurrent - * entries. - */ -@@ -314,16 +304,6 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - 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=%x arg=%p.\n", __func__, cmd, arg);) -- -- KMEM_FREE(pext, sizeof(EXT_IOCTL)); -- return (ret); -- } -- - /* check signature of this ioctl */ - temp = (uint8_t *) &pext->Signature; - -@@ -340,10 +320,10 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - DEBUG9_10(printk("%s: signature did not match. " - "cmd=%x arg=%p.\n", __func__, cmd, arg);) - pext->Status = EXT_STATUS_INVALID_PARAM; -- copy_to_user((void *)arg, (void *)pext, sizeof(EXT_IOCTL)); -+ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); - - KMEM_FREE(pext, sizeof(EXT_IOCTL)); -- return (-EINVAL); -+ return (ret); - } - - /* check version of this ioctl */ -@@ -351,8 +331,6 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - 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); -@@ -365,8 +343,7 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - - pext->Instance = num_hosts; - pext->Status = EXT_STATUS_OK; -- ret = copy_to_user((void *)arg, (void *)pext, -- sizeof(EXT_IOCTL)); -+ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); - - KMEM_FREE(pext, sizeof(EXT_IOCTL)); - return (ret); -@@ -393,7 +370,8 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - */ - 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)); -+ 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, -@@ -425,7 +403,7 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - - case EXT_CC_DRIVER_SPECIFIC: - ret = qla2x00_get_driver_specifics(pext); -- tmp_rval = copy_to_user(arg, (void *)pext, sizeof(EXT_IOCTL)); -+ tmp_rval = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); - - if (ret == 0) - ret = tmp_rval; -@@ -454,10 +432,10 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - __func__, apiHBAInstance);) - - pext->Status = EXT_STATUS_DEV_NOT_FOUND; -- copy_to_user(arg, pext, sizeof(EXT_IOCTL)); -+ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); - - KMEM_FREE(pext, sizeof(EXT_IOCTL)); -- return (-EINVAL); -+ return (ret); - } - - DEBUG9(printk("%s: active apiHBAInstance=%d host_no=%ld " -@@ -475,10 +453,10 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - __func__, pext->HbaSelect);) - - pext->Status = EXT_STATUS_DEV_NOT_FOUND; -- copy_to_user(arg, pext, sizeof(EXT_IOCTL)); -+ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); - - KMEM_FREE(pext, sizeof(EXT_IOCTL)); -- return (-EINVAL); -+ return (ret); - } - - DEBUG9(printk("%s: active host_inst=%ld CC=%x SC=%x.\n", -@@ -495,15 +473,15 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - "access. host no=%d.\n", __func__, pext->HbaSelect);) - - pext->Status = EXT_STATUS_BUSY; -- copy_to_user(arg, pext, sizeof(EXT_IOCTL)); -+ ret = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); - - KMEM_FREE(pext, sizeof(EXT_IOCTL)); -- return (-EBUSY); -+ return (ret); - } - - - while (test_bit(CFG_ACTIVE, &ha->cfg_flags) || ha->dpc_active) { -- if( signal_pending(current) ) -+ if (signal_pending(current)) - break; /* get out */ - - set_current_state(TASK_INTERRUPTIBLE); -@@ -598,7 +576,7 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - case EXT_CC_PLATFORM_REG: - break; - */ -- -+#if !defined(ISP200) - /* Failover IOCTLs */ - case FO_CC_GET_PARAMS: - case FO_CC_SET_PARAMS: -@@ -615,6 +593,7 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - qla2x00_fo_ioctl(ha, cmd, pext, mode); - - break; -+#endif - - default: - pext->Status = EXT_STATUS_INVALID_REQUEST; -@@ -623,7 +602,7 @@ qla2x00_ioctl(Scsi_Device *dev, int cmd, - } /* 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)); -+ tmp_rval = copy_to_user(arg, pext, sizeof(EXT_IOCTL)); - - if (ret == 0) - ret = tmp_rval; -@@ -712,18 +691,10 @@ qla2x00_alloc_ioctl_mem(scsi_qla_host_t - __func__, ha->host_no, ha->ioctl->scrap_mem_size);) - - ha->ioctl->ioctl_lq->q_state = LUN_STATE_READY; --#ifdef __VMWARE__ -- spin_lock_init(&ha->ioctl->ioctl_lq->q_lock); --#else - ha->ioctl->ioctl_lq->q_lock = SPIN_LOCK_UNLOCKED; --#endif - - /* Init wait_q fields */ --#ifdef __VMWARE__ -- spin_lock_init(&ha->ioctl->wait_q_lock); --#else - ha->ioctl->wait_q_lock = SPIN_LOCK_UNLOCKED; --#endif - - DEBUG9(printk("%s(%ld): inst=%ld exiting.\n", - __func__, ha->host_no, ha->instance);) -@@ -812,10 +783,6 @@ qla2x00_free_ioctl_mem(scsi_qla_host_t * - } - - if (ha->ioctl->ioctl_lq != NULL) { --#ifdef __VMWARE__ -- spin_lock_destroy(&ha->ioctl->ioctl_lq->q_lock); -- spin_lock_destroy(&ha->ioctl->wait_q_lock); --#endif - KMEM_FREE(ha->ioctl->ioctl_lq, sizeof(os_lun_t)); - ha->ioctl->ioctl_lq = NULL; - } -@@ -908,193 +875,6 @@ qla2x00_free_ioctl_scrap_mem(scsi_qla_ho - __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 %06x\n", -- __func__, ha->host_no, pdevice->loop_id, -- pdevice->d_id.b24);) -- -- /* 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 %06x already using loop id=0x%02x in " -- "f/w database. Retrying.\n", -- __func__, ha->host_no, ha->instance, -- pdevice->d_id.b24, 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. -@@ -1172,21 +952,11 @@ qla2x00_get_driver_specifics(EXT_IOCTL * - data.DrvVer.Patch = QLA_DRIVER_PATCH_VER; - data.DrvVer.Beta = QLA_DRIVER_BETA_VER; - -- ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, -+ 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 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_10(printk("%s: ERROR copy resp buf\n", __func__);) - } - - DEBUG9(printk("%s: exiting. ret=%d.\n", -@@ -1220,17 +990,8 @@ qla2x00_aen_reg(scsi_qla_host_t *ha, EXT - DEBUG9(printk("%s(%ld): inst %ld entered.\n", - __func__, ha->host_no, ha->instance);) - -- rval = verify_area(VERIFY_READ, (void *)cmd->RequestAdr, -+ rval = copy_from_user(®_struct, 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) { -@@ -1294,9 +1055,10 @@ qla2x00_aen_get(scsi_qla_host_t *ha, EXT - 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. " -+ DEBUG9_10(printk("%s(%ld): inst=%ld Buffer size %ld too small. " - "Exiting normally.", -- __func__, ha->host_no, ha->instance);) -+ __func__, ha->host_no, ha->instance, -+ (ulong)cmd->ResponseLen);) - - return (rval); - } -@@ -1349,18 +1111,6 @@ qla2x00_aen_get(scsi_qla_host_t *ha, EXT - /* 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; -@@ -1560,6 +1310,7 @@ qla2x00_query_hba_node(scsi_qla_host_t * - uint32_t i, transfer_size; - EXT_HBA_NODE *ptmp_hba_node; - qla_boards_t *bdp; -+ uint8_t *next_str; - - - DEBUG9(printk("%s(%ld): inst=%ld entered.\n", -@@ -1581,7 +1332,7 @@ qla2x00_query_hba_node(scsi_qla_host_t * - 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->Manufacturer), QLOGIC_COMPANY_NAME); - sprintf((char *)(ptmp_hba_node->Model),ha->model_number); - - ptmp_hba_node->SerialNum[0] = ha->serial0; -@@ -1591,25 +1342,47 @@ qla2x00_query_hba_node(scsi_qla_host_t * - sprintf((char *)(ptmp_hba_node->FWVersion),"%2d.%02d.%02d", - bdp->fwver[0], bdp->fwver[1], bdp->fwver[2]); - -- sprintf((char *)(ptmp_hba_node->OptRomVersion),"%d.%d", -- ha->optrom_major, ha->optrom_minor); -+#ifdef MAKEUP_YOUR_MIND -+ /* -+ * Prep OptionROM string: -+ * -+ * <BIOS VERSION>\0<FCODE VERSION>\0<EFI_VERSION>\0 -+ */ -+ memset(ptmp_hba_node->OptRomVersion, 0, -+ sizeof(ptmp_hba_node->OptRomVersion)); -+ next_str = ptmp_hba_node->OptRomVersion; -+ if (test_bit(ROM_CODE_TYPE_BIOS, &ha->code_types)) { -+ sprintf(next_str, "%d.%02d", ha->bios_revision[1], -+ ha->bios_revision[0]); -+ } -+ next_str += strlen(next_str) + 1; -+ if (test_bit(ROM_CODE_TYPE_FCODE, &ha->code_types)) { -+ strcpy(next_str, ha->fcode_revision); -+ } -+ next_str += strlen(next_str) + 1; -+ if (test_bit(ROM_CODE_TYPE_EFI, &ha->code_types)) { -+ sprintf(next_str, "%d.%02d", ha->efi_revision[1], -+ ha->efi_revision[0]); -+ } -+#else -+ memset(ptmp_hba_node->OptRomVersion, 0, -+ sizeof(ptmp_hba_node->OptRomVersion)); -+ next_str = ptmp_hba_node->OptRomVersion; -+ sprintf(next_str, "0.00"); -+ if (test_bit(ROM_CODE_TYPE_BIOS, &ha->code_types)) { -+ sprintf(next_str, "%d.%02d", ha->bios_revision[1], -+ ha->bios_revision[0]); -+ } -+#endif - - 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); -- } -+ ptmp_hba_node->DriverAttr = 0; -+#if !defined(ISP200) -+ if (ha->flags.failover_enabled) -+ ptmp_hba_node->DriverAttr = DRVR_FO_ENABLED; -+#endif - - /* now copy up the HBA_NODE to user */ - if (pext->ResponseLen < sizeof(EXT_HBA_NODE)) -@@ -1617,8 +1390,7 @@ qla2x00_query_hba_node(scsi_qla_host_t * - else - transfer_size = sizeof(EXT_HBA_NODE); - -- ret = copy_to_user((uint8_t *)pext->ResponseAdr, -- (uint8_t *)ptmp_hba_node, transfer_size); -+ ret = copy_to_user(pext->ResponseAdr, 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", -@@ -1708,7 +1480,7 @@ qla2x00_query_hba_port(scsi_qla_host_t * - } - - port_cnt = 0; -- for (fcport = ha->fcport; (fcport); fcport = fcport->next) { -+ list_for_each_entry(fcport, &ha->fcports, list) { - /* if removed or missing */ - if (atomic_read(&fcport->state) != FC_ONLINE) { - DEBUG9_10(printk( -@@ -1748,11 +1520,10 @@ qla2x00_query_hba_port(scsi_qla_host_t * - ptmp_hba_port->DiscPortCount = port_cnt; - ptmp_hba_port->DiscTargetCount = tgt_cnt; - -- if (ha->loop_state == LOOP_DOWN) { -- -+ if (atomic_read(&ha->loop_state) == LOOP_DOWN || -+ atomic_read(&ha->loop_state) == LOOP_DEAD) { - ptmp_hba_port->State = EXT_DEF_HBA_LOOP_DOWN; -- -- } else if (ha->loop_state != LOOP_READY || -+ } else if (atomic_read(&ha->loop_state) != LOOP_READY || - test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags) || - test_bit(CFG_ACTIVE, &ha->cfg_flags) || ABORTS_ACTIVE) { - -@@ -1796,24 +1567,13 @@ qla2x00_query_hba_port(scsi_qla_host_t * - - 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); -+ ret = copy_to_user(pext->ResponseAdr, 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", -@@ -1856,12 +1616,17 @@ qla2x00_query_disc_port(scsi_qla_host_t - fc_port_t *fcport; - os_tgt_t *tq; - EXT_DISC_PORT *ptmp_disc_port; -+ int found; - - DEBUG9(printk("%s(%ld): inst=%ld entered. Port inst=%02d.\n", - __func__, ha->host_no, ha->instance, pext->Instance);) - - inst = 0; -- for (fcport = ha->fcport; fcport != NULL; fcport = fcport->next) { -+ found = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if(fcport->port_type != FCT_TARGET) -+ continue; -+ - if (atomic_read(&fcport->state) != FC_ONLINE) { - /* port does not exist anymore */ - DEBUG9_10(printk("%s(%ld): fcport marked lost. " -@@ -1896,10 +1661,11 @@ qla2x00_query_disc_port(scsi_qla_host_t - fcport->loop_id);) - - /* Found the matching port still connected. */ -+ found++; - break; - } - -- if (fcport == NULL) { -+ if (!found) { - DEBUG9_10(printk("%s(%ld): inst=%ld dev not found.\n", - __func__, ha->host_no, ha->instance);) - -@@ -1961,24 +1727,13 @@ qla2x00_query_disc_port(scsi_qla_host_t - } - } - -- 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); -+ ret = copy_to_user(pext->ResponseAdr, 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", -@@ -1997,6 +1752,26 @@ qla2x00_query_disc_port(scsi_qla_host_t - return (ret); - } - -+UINT8 -+qla2x00_is_fcport_in_config(scsi_qla_host_t *ha, fc_port_t *fcport) -+{ -+#if !defined(ISP200) -+ if (ha->flags.failover_enabled) { -+ return (qla2x00_is_fcport_in_foconfig(ha, fcport)); -+ } else -+#endif -+ { -+ fc_port_t *fciter; -+ -+ list_for_each_entry(fciter, &ha->fcports, list) { -+ if (memcmp(fcport->port_name, fciter->port_name, -+ EXT_DEF_WWN_NAME_SIZE) == 0) -+ return(TRUE); -+ } -+ } -+ return (FALSE); -+} -+ - /* - * qla2x00_query_disc_tgt - * Handles EXT_SC_QUERY_DISC_TGT subcommand. -@@ -2068,7 +1843,17 @@ qla2x00_query_disc_tgt(scsi_qla_host_t * - } - - tgt_fcport = tq->vis_port; -- memcpy(ptmp_disc_target->WWNN, tgt_fcport->node_name, WWN_SIZE); -+ -+ if (tgt_fcport->flags & FC_XP_DEVICE) { -+ memcpy(ptmp_disc_target->WWNN, tq->node_name, WWN_SIZE); -+ DEBUG9(printk("%s(%ld): inst=%ld using 1 target node name.\n", -+ __func__, ha->host_no, ha->instance);) -+ } else { -+ memcpy(ptmp_disc_target->WWNN, tgt_fcport->node_name, WWN_SIZE); -+ DEBUG9(printk("%s(%ld): inst=%ld using 1 fcport node name.\n", -+ __func__, ha->host_no, ha->instance);) -+ } -+ - memcpy(ptmp_disc_target->WWPN, tgt_fcport->port_name, WWN_SIZE); - - ptmp_disc_target->Id[0] = 0; -@@ -2128,24 +1913,13 @@ qla2x00_query_disc_tgt(scsi_qla_host_t * - tgt_fcport->port_name[7], - 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); -+ ret = copy_to_user(pext->ResponseAdr, 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", -@@ -2220,24 +1994,13 @@ qla2x00_query_chip(scsi_qla_host_t *ha, - 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); -+ ret = copy_to_user(pext->ResponseAdr, ptmp_isp, transfer_size); - if (ret) { - pext->Status = EXT_STATUS_COPY_ERR; - DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", -@@ -2349,18 +2112,8 @@ qla2x00_get_statistics(scsi_qla_host_t * - 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 || -+ if (atomic_read(&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) { -@@ -2415,6 +2168,13 @@ qla2x00_get_statistics(scsi_qla_host_t * - ptmp_stat->TotalInterrupts = ha->total_isr_cnt; - */ - -+ ptmp_stat->InputRequestCount = ha->total_input_cnt; -+ ptmp_stat->OutputRequestCount = ha->total_output_cnt; -+ ptmp_stat->ControlRequestCount = ha->total_ctrl_cnt; -+ /* convert to MB */ -+ ptmp_stat->InputMBytes = ha->total_input_bytes >> 20; -+ ptmp_stat->OutputMBytes = ha->total_output_bytes >> 20; -+ - ptmp_stat->TotalLinkFailures = stat_buf.link_fail_cnt; - ptmp_stat->TotalLossOfSync = stat_buf.loss_sync_cnt; - ptmp_stat->TotalLossOfSignals = stat_buf.loss_sig_cnt; -@@ -2422,6 +2182,25 @@ qla2x00_get_statistics(scsi_qla_host_t * - ptmp_stat->InvalidTransmissionWordCount = stat_buf.inval_xmit_word_cnt; - ptmp_stat->InvalidCRCCount = stat_buf.inval_crc_cnt; - -+ DEBUG9(printk("%s(%ld): inst=%ld Got following HBA statistics:\n" -+ "isp_aborts=%d device_err=%d total_io=%d total MB=%d LIP " -+ "resets=%d\n" -+ "input cnt=%lld MB=%lld output cnt=%lld MB=%lld ctrl cnt=%lld\n" -+ "link failure=%d loss sync=%d loss signal=%d prim seq err=%d " -+ "invalid word %d invalid CRC=%d.\n", -+ __func__, ha->host_no, ha->instance, -+ ptmp_stat->ControllerErrorCount, ptmp_stat->DeviceErrorCount, -+ ptmp_stat->TotalIoCount, ptmp_stat->TotalMBytes, -+ ptmp_stat->TotalLipResets, -+ ptmp_stat->InputRequestCount, ptmp_stat->InputMBytes, -+ ptmp_stat->OutputRequestCount, ptmp_stat->OutputMBytes, -+ ptmp_stat->ControlRequestCount, -+ ptmp_stat->TotalLinkFailures, ptmp_stat->TotalLossOfSync, -+ ptmp_stat->TotalLossOfSignals, -+ ptmp_stat->PrimitiveSeqProtocolErrorCount, -+ ptmp_stat->InvalidTransmissionWordCount, -+ ptmp_stat->InvalidCRCCount);) -+ - /* now copy up the STATISTICS to user */ - if (pext->ResponseLen < sizeof(EXT_HBA_PORT_STAT)) - transfer_size = pext->ResponseLen; -@@ -2480,20 +2259,12 @@ qla2x00_get_fc_statistics(scsi_qla_host_ - uint8_t *req_name; - uint16_t mb_stat[1]; - uint32_t transfer_size; -+ int found; - - - 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; -@@ -2503,12 +2274,14 @@ qla2x00_get_fc_statistics(scsi_qla_host_ - } - - /* find the device's loop_id */ -+ found = 0; - switch (addr_struct.DestType) { - case EXT_DEF_DESTTYPE_WWPN: - req_name = addr_struct.DestAddr.WWPN; -- for (fcport = ha->fcport; fcport; fcport = fcport->next) { -+ list_for_each_entry(fcport, &ha->fcports, list) { - if (memcmp(fcport->port_name, req_name, - EXT_DEF_WWN_NAME_SIZE) == 0) { -+ found++; - break; - } - } -@@ -2528,7 +2301,7 @@ qla2x00_get_fc_statistics(scsi_qla_host_ - break; - } - -- if (fcport == NULL) { -+ if (!found) { - /* not found */ - DEBUG9_10(printk("%s(%ld): inst=%ld ERROR device port %02x%02x" - "%02x%02x%02x%02x%02x%02x not found.\n", -@@ -2568,7 +2341,7 @@ qla2x00_get_fc_statistics(scsi_qla_host_ - */ - - /* check on loop down */ -- if (ha->loop_state != LOOP_READY || -+ if (atomic_read(&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) { -@@ -2677,6 +2450,7 @@ qla2x00_get_port_summary(scsi_qla_host_t - uint32_t port_cnt = 0; - uint32_t top_xfr_size; - uint32_t usr_no_of_entries = 0; -+ uint32_t device_types; - void *start_of_entry_list; - fc_port_t *fcport; - -@@ -2691,9 +2465,9 @@ qla2x00_get_port_summary(scsi_qla_host_t - /* not enough memory */ - pext->Status = EXT_STATUS_NO_MEMORY; - DEBUG9_10(printk("%s(%ld): inst=%ld scrap not big enough. " -- "pdevicedata requested=%d.\n", -+ "pdevicedata requested=%ld.\n", - __func__, ha->host_no, ha->instance, -- sizeof(EXT_DEVICEDATA));) -+ (ulong)sizeof(EXT_DEVICEDATA));) - return (ret); - } - -@@ -2702,9 +2476,22 @@ qla2x00_get_port_summary(scsi_qla_host_t - /* 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", -+ "pdd_entry requested=%ld.\n", - __func__, ha->host_no, ha->instance, -- sizeof(EXT_DEVICEDATAENTRY));) -+ (ulong)sizeof(EXT_DEVICEDATAENTRY));) -+ qla2x00_free_ioctl_scrap_mem(ha); -+ return (ret); -+ } -+ -+ /* Get device types to query. */ -+ device_types = 0; -+ ret = copy_from_user(&device_types, pext->RequestAdr, -+ sizeof(device_types)); -+ 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);) - qla2x00_free_ioctl_scrap_mem(ha); - return (ret); - } -@@ -2719,9 +2506,8 @@ qla2x00_get_port_summary(scsi_qla_host_t - start_of_entry_list = (void *)(pext->ResponseAdr) + top_xfr_size; - - /* Start copying from devices that exist. */ -- ret = qla2x00_get_fcport_summary(ha, pdd_entry, -- start_of_entry_list, usr_no_of_entries, -- &entry_cnt, &pext->Status); -+ ret = qla2x00_get_fcport_summary(ha, pdd_entry, start_of_entry_list, -+ device_types, usr_no_of_entries, &entry_cnt, &pext->Status); - - DEBUG9(printk("%s(%ld): after get_fcport_summary, entry_cnt=%d.\n", - __func__, ha->host_no, entry_cnt);) -@@ -2731,15 +2517,20 @@ qla2x00_get_port_summary(scsi_qla_host_t - */ - if (ret == 0) { - if (!ha->flags.failover_enabled) { -+#if 0 - ret = qla2x00_std_missing_port_summary(ha, pdd_entry, - start_of_entry_list, usr_no_of_entries, - &entry_cnt, &pext->Status); -- } else { -+#endif -+ } -+#if !defined(ISP200) -+ else { - ret = qla2x00_fo_missing_port_summary(ha, pdd_entry, - start_of_entry_list, usr_no_of_entries, - &entry_cnt, &pext->Status); - - } -+#endif - } - - DEBUG9(printk( -@@ -2754,8 +2545,11 @@ qla2x00_get_port_summary(scsi_qla_host_t - } - - pdevicedata->ReturnListEntryCount = entry_cnt; -- for (fcport = ha->fcport; fcport != NULL; fcport = fcport->next) { -+ list_for_each_entry(fcport, &ha->fcports, list) { - /* count all ports that exist */ -+ if (fcport->port_type != FCT_TARGET) -+ continue; -+ - port_cnt++; - } - if (port_cnt > entry_cnt) -@@ -2771,16 +2565,6 @@ qla2x00_get_port_summary(scsi_qla_host_t - /* copy top of devicedata, which is everything other than the - * actual entry list data. - */ -- ret = verify_area(VERIFY_WRITE, (void *)(pext->ResponseAdr), -- top_xfr_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, top_xfr_size); -@@ -2825,8 +2609,8 @@ qla2x00_get_port_summary(scsi_qla_host_t - */ - STATIC int - qla2x00_get_fcport_summary(scsi_qla_host_t *ha, EXT_DEVICEDATAENTRY *pdd_entry, -- void *pstart_of_entry_list, uint32_t max_entries, uint32_t *pentry_cnt, -- uint32_t *ret_status) -+ void *pstart_of_entry_list, uint32_t device_types, uint32_t max_entries, -+ uint32_t *pentry_cnt, uint32_t *ret_status) - { - int ret = QL_STATUS_SUCCESS; - uint8_t *usr_temp, *kernel_tmp; -@@ -2836,12 +2620,31 @@ qla2x00_get_fcport_summary(scsi_qla_host - uint32_t transfer_size; - fc_port_t *fcport; - os_tgt_t *tq; -+#if !defined(ISP200) -+ mp_host_t *host = NULL; -+ uint16_t idx; -+ mp_device_t *tmp_dp = NULL; -+#endif - - DEBUG9(printk("%s(%ld): inst=%ld entered.\n", - __func__, ha->host_no, ha->instance);) - -- for (fcport = ha->fcport; fcport && *pentry_cnt < max_entries; -- fcport = fcport->next) { -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (*pentry_cnt >= max_entries) -+ break; -+ -+ if (fcport->port_type != FCT_TARGET) { -+ /* Don't report initiators or broadcast devices. */ -+ DEBUG2_9_10(printk("%s(%ld): not reporting non-target " -+ "fcport %02x%02x%02x%02x%02x%02x%02x%02x. " -+ "port_type=%x.\n", -+ __func__, 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->port_type)); -+ continue; -+ } - - if ((atomic_read(&fcport->state) != FC_ONLINE) && - !qla2x00_is_fcport_in_config(ha, fcport)) { -@@ -2861,9 +2664,6 @@ qla2x00_get_fcport_summary(scsi_qla_host - - /* copy from fcport 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]; - -@@ -2885,10 +2685,56 @@ qla2x00_get_fcport_summary(scsi_qla_host - - if (memcmp(fcport->port_name, tq->vis_port->port_name, - EXT_DEF_WWN_NAME_SIZE) == 0) { -+ - pdd_entry->TargetAddress.Target = tgt; -+ -+ if ((fcport->flags & FC_XP_DEVICE) && -+ !(device_types & -+ EXT_DEF_GET_TRUE_NN_DEVICE)) { -+ memcpy(pdd_entry->NodeWWN, -+ tq->node_name, WWN_SIZE); -+ } else { -+ memcpy(pdd_entry->NodeWWN, -+ fcport->node_name, WWN_SIZE); -+ } -+ - break; - } - } -+ -+ if (tgt == MAX_TARGETS) { -+ /* did not bind to a target */ -+/* -+ memcpy(pdd_entry->NodeWWN, -+ tq->node_name, WWN_SIZE); -+*/ -+#if !defined(ISP200) -+ if (ha->flags.failover_enabled) { -+ if (((host = qla2x00_cfg_find_host(ha)) != NULL) -+ && (fcport->flags & FC_XP_DEVICE) && -+ !(device_types & -+ EXT_DEF_GET_TRUE_NN_DEVICE)) { -+ if((tmp_dp = -+ qla2x00_find_mp_dev_by_portname( -+ host, fcport->port_name, &idx)) -+ != NULL) -+ memcpy(pdd_entry->NodeWWN, -+ tmp_dp->nodename, WWN_SIZE); -+ } -+/* XXX */ -+ else -+ memcpy(pdd_entry->NodeWWN, -+ fcport->node_name, WWN_SIZE); -+ } else -+#endif -+ { -+ memcpy(pdd_entry->NodeWWN, -+ fcport->node_name, WWN_SIZE); -+ } -+ } -+ -+ memcpy(pdd_entry->PortWWN, fcport->port_name, WWN_SIZE); -+ - pdd_entry->TargetAddress.Lun = 0; - pdd_entry->DeviceFlags = 0; - pdd_entry->LoopID = fcport->loop_id; -@@ -2905,18 +2751,6 @@ qla2x00_get_fcport_summary(scsi_qla_host - current_offset = *pentry_cnt * sizeof(EXT_DEVICEDATAENTRY); - - transfer_size = sizeof(EXT_DEVICEDATAENTRY); -- ret = verify_area(VERIFY_WRITE, -- (uint8_t *)pstart_of_entry_list + current_offset, -- transfer_size); -- -- if (ret) { -- *ret_status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE " -- "rsp bufaddr=%p\n", -- __func__, ha->host_no, ha->instance, -- (uint8_t *)pstart_of_entry_list + current_offset);) -- return (ret); -- } - - /* now copy up this dd_entry to user */ - usr_temp = (uint8_t *)pstart_of_entry_list + current_offset; -@@ -2944,6 +2778,9 @@ qla2x00_get_fcport_summary(scsi_qla_host - * qla2x00_fo_missing_port_summary is in qla_fo.c - */ - -+//RUBY: Do we need this with the new consolidated fcports list? This will -+// be handled transparently in qla2x00_get_fcport_summary(). -+#if 0 - /* - * qla2x00_std_missing_port_summary - * Returns values of devices not connected but found in configuration -@@ -3027,36 +2864,22 @@ qla2x00_std_missing_port_summary(scsi_ql - sizeof(EXT_DEVICEDATAENTRY); - - transfer_size = sizeof(EXT_DEVICEDATAENTRY); -- ret = verify_area(VERIFY_WRITE, -- (uint8_t *)pstart_of_entry_list + current_offset, -- transfer_size); - -- if (ret == 0) { -- -- /* now copy up this dd_entry to user */ -- usr_temp = (uint8_t *)pstart_of_entry_list + -- current_offset; -- kernel_tmp = (uint8_t *)pdd_entry; -- ret = copy_to_user(usr_temp, kernel_tmp, -- transfer_size); -- if (ret) { -- *ret_status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("%s(%ld): inst=%ld " -- "ERROR copy rsp list buffer.\n", -- __func__, ha->host_no, -- ha->instance);) -- break; -- } else { -- *pentry_cnt+=1; -- } -- } else { -+ /* now copy up this dd_entry to user */ -+ usr_temp = (uint8_t *)pstart_of_entry_list + -+ current_offset; -+ kernel_tmp = (uint8_t *)pdd_entry; -+ ret = copy_to_user(usr_temp, kernel_tmp, -+ transfer_size); -+ if (ret) { - *ret_status = EXT_STATUS_COPY_ERR; - DEBUG9_10(printk("%s(%ld): inst=%ld " -- "ERROR verify wrt rsp bufaddr=%p\n", -- __func__, ha->host_no, ha->instance, -- (uint8_t *)pstart_of_entry_list + -- current_offset);) -+ "ERROR copy rsp list buffer.\n", -+ __func__, ha->host_no, -+ ha->instance);) - break; -+ } else { -+ *pentry_cnt+=1; - } - } - -@@ -3070,7 +2893,7 @@ qla2x00_std_missing_port_summary(scsi_ql - - return (ret); - } -- -+#endif - - /* - * qla2x00_query_driver -@@ -3127,16 +2950,6 @@ qla2x00_query_driver(scsi_qla_host_t *ha - 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; -@@ -3206,16 +3019,6 @@ qla2x00_query_fw(scsi_qla_host_t *ha, EX - - 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); -@@ -3288,17 +3091,6 @@ qla2x00_msiocb_passthru(scsi_qla_host_t - __func__, ha->host_no, ha->instance);) - } - -- 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);) - -@@ -3390,24 +3182,19 @@ qla2x00_send_els_passthru(scsi_qla_host_ - { - int ret = 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_port_t *pfcport; -+ int found; -+ uint16_t next_loop_id; -+ fc_port_t *fcport; - - 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);) -@@ -3464,7 +3251,7 @@ qla2x00_send_els_passthru(scsi_qla_host_ - __func__, ha->host_no, ha->instance);) - - /* check on loop down (1) */ -- if (ha->loop_state != LOOP_READY || -+ if (atomic_read(&ha->loop_state) != LOOP_READY || - test_bit(CFG_ACTIVE, &ha->cfg_flags) || - (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || ABORTS_ACTIVE) { - -@@ -3528,147 +3315,62 @@ qla2x00_send_els_passthru(scsi_qla_host_ - /* 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);) -+ found = 0; -+ fcport = NULL; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (fcport->port_type != FCT_INITIATOR || -+ fcport->port_type != FCT_TARGET) -+ continue; - -- break; -- } -+ if (!invalid_wwn) { -+ /* search with WWPN */ -+ if (memcmp(pels_pt_req->WWPN, fcport->port_name, -+ EXT_DEF_WWN_NAME_SIZE)) -+ continue; -+ } else { -+ /* search with PID */ -+ 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]) -+ continue; - } -- } 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; -- } -- } -+ found++; - } - -- /* 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", -+ if (!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);) - -- 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);) -- -- return (ret); -- } -+ return (ret); -+ } - -- /* login and update database */ -- tmpdev.d_id.b24 = fcinitiator->d_id.b24; -- tmpdev.loop_id = fcinitiator->loop_id; -+ /* If this is for a host device, check if we need to perform login */ -+ if (fcport->port_type == FCT_INITIATOR && -+ fcport->loop_id >= SNS_LAST_LOOP_ID) { - -- if (qla2x00_host_relogin(ha, &tmpdev) != 0) { -+ next_loop_id = 0; -+ ret = qla2x00_fabric_login(ha, fcport, &next_loop_id); -+ if (ret != QL_STATUS_SUCCESS) { - /* 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=%06x ret=%d.\n", -- __func__, ha->host_no, ha->instance, tmpdev.loop_id, -- tmpdev.d_id.b24, ret);) -- -- return (ret); -- } 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", -+ "host port failed. loop_id=%02x pid=%02x%02x%02x " -+ "ret=%d.\n", - __func__, ha->host_no, ha->instance, -- fcinitiator->loop_id);) -- } -- } -- -- /* 2nd: scan thru our fcport database */ -- if (!invalid_wwn) { -- /* search with WWPN */ -- for (pfcport = ha->fcport; -- (!port_found) && pfcport != NULL; pfcport = pfcport->next) { -+ fcport->loop_id, fcport->d_id.b.domain, -+ fcport->d_id.b.area, fcport->d_id.b.al_pa, ret);) - -- if (memcmp(pfcport->port_name, pels_pt_req->WWPN, -- EXT_DEF_WWN_NAME_SIZE) == 0) { -- -- port_found = TRUE; -- pels_pt_req->Lid = pfcport->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 { -- /* search with PID */ -- for (pfcport = ha->fcport; -- (!port_found) && pfcport != NULL; pfcport = pfcport->next) { -- -- if (pels_pt_req->Id[1] == pfcport->d_id.r.d_id[2] -- && pels_pt_req->Id[2] == pfcport->d_id.r.d_id[1] -- && pels_pt_req->Id[3] == pfcport->d_id.r.d_id[0]) { -- -- port_found = TRUE; -- pels_pt_req->Lid = pfcport->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; -- } -+ return (ret); - } - } -- -- 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);) -- -- return (ret); -- } - - /* queue command */ -+ pels_pt_req->Lid = fcport->loop_id; -+ - if ((ret = qla2x00_ioctl_ms_queuecommand(ha, pext, pscsi_cmd, - ptmp_fcport, ptmp_fclun, pels_pt_req))) { - return (ret); -@@ -3701,20 +3403,8 @@ qla2x00_send_els_passthru(scsi_qla_host_ - /* 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);) -- -- return (ret); -- } -- - /* copy back data returned to response buffer */ -- ret = copy_to_user(presp_payload, (uint8_t *)ha->ioctl_mem, -- payload_len); -+ ret = copy_to_user(presp_payload, 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", -@@ -3729,6 +3419,57 @@ qla2x00_send_els_passthru(scsi_qla_host_ - } - #endif - -+#if defined(ISP200) -+/* -+ * qla2x00_mgmt_svr_login -+ * Login management server. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+int -+qla2x00_mgmt_svr_login(scsi_qla_host_t *ha) -+{ -+ int tmp_rval = 0; -+ uint16_t mb[MAILBOX_REGISTER_COUNT]; -+ -+ DEBUG13(printk("%s(%ld): entered\n", -+ __func__, ha->host_no);) -+ -+ /* 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) { -+ -+ DEBUG2_13(printk( -+ "%s(%ld): inst=%ld ERROR login to MS.\n", -+ __func__, ha->host_no, ha->instance);) -+ -+ return (QL_STATUS_ERROR); -+ } -+ -+ ha->flags.management_server_logged_in = 1; -+ DEBUG13(printk("%s(%ld): success login to MS.\n", -+ __func__, ha->host_no);) -+ } -+ -+ DEBUG13(printk("%s(%ld): exiting.\n", -+ __func__, ha->host_no);) -+ -+ return (QL_STATUS_SUCCESS); -+} -+#endif -+ - /* - * qla2x00_send_fcct - * Passes the FC CT command down to firmware as MSIOCB and -@@ -3752,8 +3493,6 @@ qla2x00_send_fcct(scsi_qla_host_t *ha, E - int mode) - { - int ret = 0; -- int tmp_rval = 0; -- uint16_t mb[MAILBOX_REGISTER_COUNT]; - - - DEBUG9(printk("%s(%ld): inst=%ld entered.\n", -@@ -3782,24 +3521,15 @@ qla2x00_send_fcct(scsi_qla_host_t *ha, E - DEBUG9(printk("%s(%ld): inst=%ld after copy request.\n", - __func__, ha->host_no, ha->instance);) - -- /* 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; -- -- DEBUG9_10(printk( -- "%s(%ld): inst=%ld ERROR login to MS.\n", -- __func__, ha->host_no, ha->instance);) -+ /* login to management server device */ -+ if (qla2x00_mgmt_svr_login(ha) != QL_STATUS_SUCCESS) { -+ pext->Status = EXT_STATUS_DEV_NOT_FOUND; - -- return (ret); -- } -+ DEBUG9_10(printk( -+ "%s(%ld): inst=%ld mgmt_svr_login failed.\n", -+ __func__, ha->host_no, ha->instance);) - -- ha->flags.management_server_logged_in = 1; -+ return (ret); - } - - DEBUG9(printk("%s(%ld): success login to MS.\n", -@@ -3820,20 +3550,8 @@ qla2x00_send_fcct(scsi_qla_host_t *ha, E - return (ret); - } - -- /* 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);) -- return (ret); -- } -- - /* sending back data returned from Management Server */ -- ret = copy_to_user((uint8_t *)pext->ResponseAdr, -- (uint8_t *)ha->ioctl_mem, pext->ResponseLen); -+ ret = copy_to_user(pext->ResponseAdr, 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", -@@ -3882,7 +3600,6 @@ qla2x00_ioctl_ms_queuecommand(scsi_qla_h - pfclun->fcport = pfcport; - pfclun->lun = 0; - pfclun->flags = 0; -- pfclun->next = NULL; - plq->fclun = pfclun; - plq->fclun->fcport->ha = ha; - -@@ -3891,7 +3608,7 @@ qla2x00_ioctl_ms_queuecommand(scsi_qla_h - 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 || -+ if (atomic_read(&ha->loop_state) != LOOP_READY || - test_bit(CFG_ACTIVE, &ha->cfg_flags) || - (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) || - ABORTS_ACTIVE) { -@@ -3982,8 +3699,12 @@ qla2x00_start_ms_cmd(scsi_qla_host_t *ha - 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->control_flags = __constant_cpu_to_le16(CF_ELS_PASSTHRU); -+#if defined(EXTENDED_IDS) -+ pkt->loop_id = cpu_to_le16(pels_pt_req->Lid); -+#else - pkt->loop_id = pels_pt_req->Lid; -+#endif - pkt->type = 1; /* ELS frame */ - - if (pext->ResponseLen != 0) { -@@ -3996,7 +3717,11 @@ qla2x00_start_ms_cmd(scsi_qla_host_t *ha - } else { - usr_req_len = pext->RequestLen; - usr_resp_len = pext->ResponseLen; -- pkt->loop_id = MANAGEMENT_SERVER; -+#if defined(EXTENDED_IDS) -+ pkt->loop_id = __constant_cpu_to_le16(MANAGEMENT_SERVER); -+#else -+ pkt->loop_id = MANAGEMENT_SERVER; -+#endif - } - - DEBUG9_10(printk("%s(%ld): inst=%ld using loop_id=%02x req_len=%d, " -@@ -4004,22 +3729,22 @@ qla2x00_start_ms_cmd(scsi_qla_host_t *ha - __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; -+ pkt->timeout = cpu_to_le16(ql2xioctltimeout); -+ pkt->cmd_dsd_count = __constant_cpu_to_le16(1); -+ pkt->total_dsd_count = __constant_cpu_to_le16(2); /* no continuation */ -+ pkt->rsp_bytecount = cpu_to_le32(usr_resp_len); -+ pkt->req_bytecount = cpu_to_le32(usr_req_len); - - /* loading command payload address. user request is assumed - * to have been copied to ioctl_mem. - */ -- pkt->dseg_req_address[0] = LS_64BITS(ha->ioctl_mem_phys); -- pkt->dseg_req_address[1] = MS_64BITS(ha->ioctl_mem_phys); -+ pkt->dseg_req_address[0] = cpu_to_le32(LSD(ha->ioctl_mem_phys)); -+ pkt->dseg_req_address[1] = cpu_to_le32(MSD(ha->ioctl_mem_phys)); - pkt->dseg_req_length = usr_req_len; - - /* loading response payload address */ -- pkt->dseg_rsp_address[0] = LS_64BITS(ha->ioctl_mem_phys); -- pkt->dseg_rsp_address[1] = MS_64BITS(ha->ioctl_mem_phys); -+ pkt->dseg_rsp_address[0] = cpu_to_le32(LSD(ha->ioctl_mem_phys)); -+ pkt->dseg_rsp_address[1] = cpu_to_le32(MSD(ha->ioctl_mem_phys)); - pkt->dseg_rsp_length = usr_resp_len; - - /* set flag to indicate IOCTL MSIOCB cmd in progress */ -@@ -4099,16 +3824,6 @@ qla2x00_wwpn_to_scsiaddr(scsi_qla_host_t - 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 " -@@ -4166,17 +3881,7 @@ qla2x00_wwpn_to_scsiaddr(scsi_qla_host_t - 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); -+ ret = copy_to_user(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", -@@ -4284,8 +3989,8 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - Scsi_Cmnd *pscsi_cmd, Scsi_Device *pscsi_dev, fc_port_t *pfcport, - fc_lun_t *pfclun, uint8_t *pmore_cdb) - { -- int ret = 0; -- int ret2 = 0; -+ int ret = QL_STATUS_SUCCESS; -+ int ret2 = QL_STATUS_SUCCESS; - uint8_t *usr_temp, *kernel_tmp; - uint32_t lun = 0, tgt = 0; - #if defined(QL_DEBUG_LEVEL_9) -@@ -4305,7 +4010,7 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - __func__, ha->host_no, ha->instance);) - - pext->Status = EXT_STATUS_NO_MEMORY; -- return (ret); -+ return (QL_STATUS_ERROR); - } - - switch(pext->SubCode) { -@@ -4326,7 +4031,7 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - __func__, ha->host_no, ha->instance, pfcport, pfclun);) - atomic_set(&sp->ref_count, 0); - add_to_free_queue (ha, sp); -- return (ret); -+ return (QL_STATUS_ERROR); - } - - if (pscsi_cmd->cmd_len == 6 || pscsi_cmd->cmd_len == 0x0A || -@@ -4341,7 +4046,7 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - pext->Status = EXT_STATUS_INVALID_PARAM; - atomic_set(&sp->ref_count, 0); - add_to_free_queue (ha, sp); -- return (ret); -+ return (QL_STATUS_ERROR); - } - tq = ha->ioctl->ioctl_tq; - lq = ha->ioctl->ioctl_lq; -@@ -4355,7 +4060,7 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - __func__, ha->host_no, ha->instance, pfcport, pfclun);) - atomic_set(&sp->ref_count, 0); - add_to_free_queue (ha, sp); -- return (ret); -+ return (QL_STATUS_ERROR); - } - - sp->cmd_length = pscsi_cmd->cmd_len; -@@ -4386,19 +4091,6 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - - if (pscsi_cmd->sc_data_direction == SCSI_DATA_WRITE) { - /* 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 " -- "ResponseAdr.\n", -- __func__, ha->host_no, ha->instance);) -- atomic_set(&sp->ref_count, 0); -- add_to_free_queue (ha, sp); -- -- return (ret); -- } -- - usr_temp = (uint8_t *)pext->ResponseAdr; - kernel_tmp = (uint8_t *)ha->ioctl_mem; - ret = copy_from_user(kernel_tmp, usr_temp, pext->ResponseLen); -@@ -4425,7 +4117,8 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - 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; -+ if (pscsi_cmd->timeout_per_command == 0) -+ pscsi_cmd->timeout_per_command = ql2xioctltimeout * HZ; - - if (tq && lq) { - if (pext->SubCode == EXT_SC_SEND_SCSI_PASSTHRU) { -@@ -4440,7 +4133,7 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - pfcport, pfclun);) - atomic_set(&sp->ref_count, 0); - add_to_free_queue (ha, sp); -- return (ret); -+ return (QL_STATUS_ERROR); - } - - } else { -@@ -4488,7 +4181,7 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - pext->Status = EXT_STATUS_DEV_NOT_FOUND; - atomic_set(&sp->ref_count, 0); - add_to_free_queue (ha, sp); -- return (ret); -+ return (QL_STATUS_ERROR); - } - } else { - ret2 = qla2x00_check_port_status(ha, pfcport); -@@ -4503,7 +4196,7 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - - atomic_set(&sp->ref_count, 0); - add_to_free_queue (ha, sp); -- return (ret); -+ return (QL_STATUS_ERROR); - } - } - -@@ -4519,6 +4212,13 @@ qla2x00_ioctl_scsi_queuecommand(scsi_qla - DEBUG9(printk("%s(%ld): inst=%ld sending command.\n", - __func__, ha->host_no, ha->instance);) - -+ /* Time the command via our standard driver-timer */ -+ if ((CMD_TIMEOUT(pscsi_cmd)/HZ) > QLA_CMD_TIMER_DELTA) -+ qla2x00_add_timer_to_cmd(sp, -+ (CMD_TIMEOUT(pscsi_cmd)/HZ) - QLA_CMD_TIMER_DELTA); -+ else -+ qla2x00_add_timer_to_cmd(sp, (CMD_TIMEOUT(pscsi_cmd)/HZ)); -+ - add_to_pending_queue(ha, sp); - - qla2x00_next(ha); -@@ -4560,13 +4260,14 @@ qla2x00_sc_scsi_passthru(scsi_qla_host_t - 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", -+ if (test_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags) || -+ test_bit(FAILOVER_EVENT, &ha->dpc_flags) || -+ test_bit(FAILOVER_NEEDED, &ha->dpc_flags)) { -+ /* Stall intrusive passthru commands until failover complete */ -+ DEBUG9_10(printk("%s(%ld): inst=%ld failover in progress -- " -+ "returning busy.\n", - __func__, ha->host_no, ha->instance);) -+ pext->Status = EXT_STATUS_BUSY; - return (ret); - } - -@@ -4658,21 +4359,17 @@ qla2x00_sc_scsi_passthru(scsi_qla_host_t - DEBUG9(printk("%s(%ld): inst=%ld sending command.\n", - __func__, ha->host_no, ha->instance);) - -- if ((ret = qla2x00_ioctl_scsi_queuecommand(ha, pext, pscsi_cmd, -- pscsi_device, NULL, NULL, NULL))) { -+ if (qla2x00_ioctl_scsi_queuecommand(ha, pext, pscsi_cmd, -+ pscsi_device, NULL, NULL, NULL)) { - return (ret); - } - -- ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; -- add_timer(&ha->ioctl->cmpl_timer); -- - DEBUG9(printk("%s(%ld): inst=%ld waiting for completion.\n", - __func__, ha->host_no, ha->instance);) - -+ /* Wait for completion */ - 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);) - -@@ -4763,15 +4460,6 @@ qla2x00_sc_scsi_passthru(scsi_qla_host_t - (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);) -- return (ret); -- } -- - usr_temp = (uint8_t *)pext->RequestAdr; - kernel_tmp = (uint8_t *)pscsi_pass; - ret = copy_to_user(usr_temp, kernel_tmp, -@@ -4789,17 +4477,6 @@ qla2x00_sc_scsi_passthru(scsi_qla_host_t - 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);) -- return (ret); -- } -- - /* now copy up the READ data to user */ - if ((CMD_COMPL_STATUS(pscsi_cmd) == CS_DATA_UNDERRUN) && - (CMD_RESID_LEN(pscsi_cmd))) { -@@ -4864,6 +4541,7 @@ qla2x00_sc_fc_scsi_passthru(scsi_qla_hos - uint32_t i; - - uint32_t transfer_len; -+ int found_fcp, found_fcl; - - EXT_FC_SCSI_PASSTHRU *pfc_scsi_pass; - -@@ -4879,6 +4557,17 @@ qla2x00_sc_fc_scsi_passthru(scsi_qla_hos - } - ) - -+ if (test_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags) || -+ test_bit(FAILOVER_EVENT, &ha->dpc_flags) || -+ test_bit(FAILOVER_NEEDED, &ha->dpc_flags)) { -+ /* Stall intrusive passthru commands until failover complete */ -+ DEBUG9_10(printk("%s(%ld): inst=%ld failover in progress -- " -+ "returning busy.\n", -+ __func__, ha->host_no, ha->instance);) -+ pext->Status = EXT_STATUS_BUSY; -+ return (ret); -+ } -+ - if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pfc_scsi_pass, - sizeof(EXT_FC_SCSI_PASSTHRU))) { - /* not enough memory */ -@@ -4893,17 +4582,6 @@ qla2x00_sc_fc_scsi_passthru(scsi_qla_hos - /* clear ioctl_mem to be used */ - memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); - -- ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, -- sizeof(EXT_FC_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) { -@@ -4940,23 +4618,27 @@ qla2x00_sc_fc_scsi_passthru(scsi_qla_hos - } - - fclun = NULL; -- for (fcport = ha->fcport; (fcport); fcport = fcport->next) { -+ found_fcp = 0; -+ found_fcl = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { - if (memcmp(fcport->port_name, - pfc_scsi_pass->FCScsiAddr.DestAddr.WWPN, 8) != 0) { - continue; - - } - -- for (fclun = fcport->fclun; fclun; fclun = fclun->next) { -+ found_fcp++; -+ list_for_each_entry(fclun, &fcport->fcluns, list) { - if (fclun->lun == pfc_scsi_pass->FCScsiAddr.Lun) { - /* Found the right LUN */ -+ found_fcl++; - break; - } - } - break; - } - -- if (fcport == NULL) { -+ if (!found_fcp) { - pext->Status = EXT_STATUS_DEV_NOT_FOUND; - DEBUG9_10(printk("%s(%ld): inst=%ld FC AddrFormat - DID NOT " - "FIND Port matching WWPN.\n", -@@ -4964,13 +4646,12 @@ qla2x00_sc_fc_scsi_passthru(scsi_qla_hos - return (ret); - } - -- if (fclun == NULL) { -+ if (!found_fcl) { - /* Use a temporary fclun to send out the command. */ - fclun = &temp_fclun; - fclun->fcport = fcport; - fclun->lun = pfc_scsi_pass->FCScsiAddr.Lun; - fclun->flags = 0; -- fclun->next = NULL; - } - - /* set target coordinates */ -@@ -5038,19 +4719,17 @@ qla2x00_sc_fc_scsi_passthru(scsi_qla_hos - DEBUG9(printk("%s(%ld): inst=%ld queuing command.\n", - __func__, ha->host_no, ha->instance);) - -- if ((ret = qla2x00_ioctl_scsi_queuecommand(ha, pext, pfc_scsi_cmd, -- pfc_scsi_device, fcport, fclun, pmore_cdb))) { -+ if (qla2x00_ioctl_scsi_queuecommand(ha, pext, pfc_scsi_cmd, -+ pfc_scsi_device, fcport, fclun, pmore_cdb)) { - return (ret); - } - -- /* Wait for comletion */ -- ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; -- add_timer(&ha->ioctl->cmpl_timer); -+ DEBUG9(printk("%s(%ld): inst=%ld waiting for completion.\n", -+ __func__, ha->host_no, ha->instance);) - -+ /* Wait for completion */ - down(&ha->ioctl->cmpl_sem); - -- del_timer(&ha->ioctl->cmpl_timer); -- - if (ha->ioctl->SCSIPT_InProgress == 1) { - - printk(KERN_WARNING -@@ -5127,16 +4806,6 @@ qla2x00_sc_fc_scsi_passthru(scsi_qla_hos - pfc_scsi_cmd->sense_buffer[i]; - } - -- ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr, -- sizeof(EXT_FC_SCSI_PASSTHRU)); -- if (ret) { -- pext->Status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE " -- "RequestAdr.\n", -- __func__, ha->host_no, ha->instance);) -- return (ret); -- } -- - usr_temp = (uint8_t *)pext->RequestAdr; - kernel_tmp = (uint8_t *)pfc_scsi_pass; - ret = copy_to_user(usr_temp, kernel_tmp, -@@ -5155,19 +4824,6 @@ qla2x00_sc_fc_scsi_passthru(scsi_qla_hos - 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);) -- -- return (ret); -- } -- - /* now copy up the READ data to user */ - if ((CMD_COMPL_STATUS(pfc_scsi_cmd) == CS_DATA_UNDERRUN) && - (CMD_RESID_LEN(pfc_scsi_cmd))) { -@@ -5229,6 +4885,7 @@ qla2x00_sc_scsi3_passthru(scsi_qla_host_ - uint8_t *pmore_cdb = NULL; - uint32_t transfer_len; - uint32_t i; -+ int found; - - EXT_FC_SCSI_PASSTHRU *pscsi3_pass; - -@@ -5245,6 +4902,17 @@ qla2x00_sc_scsi3_passthru(scsi_qla_host_ - } - ) - -+ if (test_bit(FAILOVER_EVENT_NEEDED, &ha->dpc_flags) || -+ test_bit(FAILOVER_EVENT, &ha->dpc_flags) || -+ test_bit(FAILOVER_NEEDED, &ha->dpc_flags)) { -+ /* Stall intrusive passthru commands until failover complete */ -+ DEBUG9_10(printk("%s(%ld): inst=%ld failover in progress -- " -+ "returning busy.\n", -+ __func__, ha->host_no, ha->instance);) -+ pext->Status = EXT_STATUS_BUSY; -+ return (ret); -+ } -+ - if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&pscsi3_pass, - sizeof(EXT_FC_SCSI_PASSTHRU))) { - /* not enough memory */ -@@ -5260,15 +4928,6 @@ qla2x00_sc_scsi3_passthru(scsi_qla_host_ - /* clear ioctl_mem to be used */ - memset(ha->ioctl_mem, 0, ha->ioctl_mem_size); - -- ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, -- sizeof(EXT_FC_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) { -@@ -5317,13 +4976,15 @@ qla2x00_sc_scsi3_passthru(scsi_qla_host_ - return (ret); - } - -- for (fcport = ha->fcport; (fcport); fcport = fcport->next) { -+ found = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { - if (memcmp(fcport->port_name, - pscsi3_pass->FCScsiAddr.DestAddr.WWPN, 8) == 0) { -+ found++; - break; - } - } -- if (fcport == NULL) { -+ if (!found) { - pext->Status = EXT_STATUS_DEV_NOT_FOUND; - - DEBUG9_10(printk("%s(%ld): inst=%ld DID NOT FIND Port for WWPN " -@@ -5346,7 +5007,6 @@ qla2x00_sc_scsi3_passthru(scsi_qla_host_ - fclun->fcport = fcport; - fclun->lun = pscsi3_pass->FCScsiAddr.Lun; - fclun->flags = 0; -- fclun->next = NULL; - - /* set target coordinates */ - pscsi3_cmd->target = 0xff; /* not used. just put something there. */ -@@ -5390,24 +5050,21 @@ qla2x00_sc_scsi3_passthru(scsi_qla_host_ - } else { - pscsi3_cmd->sc_data_direction = SCSI_DATA_READ; - } -+ if (pscsi3_pass->Timeout) -+ pscsi3_cmd->timeout_per_command = pscsi3_pass->Timeout * HZ; - - /* send command to adapter */ - DEBUG9(printk("%s(%ld): inst=%ld queuing command.\n", - __func__, ha->host_no, ha->instance);) - -- if ((ret = qla2x00_ioctl_scsi_queuecommand(ha, pext, pscsi3_cmd, -- pscsi3_device, fcport, fclun, pmore_cdb))) { -+ if (qla2x00_ioctl_scsi_queuecommand(ha, pext, pscsi3_cmd, -+ pscsi3_device, fcport, fclun, pmore_cdb)) { - return (ret); - } - -- /* Wait for comletion */ -- ha->ioctl->cmpl_timer.expires = jiffies + ha->ioctl->ioctl_tov * HZ; -- add_timer(&ha->ioctl->cmpl_timer); -- -+ /* Wait for completion */ - down(&ha->ioctl->cmpl_sem); - -- del_timer(&ha->ioctl->cmpl_timer); -- - if (ha->ioctl->SCSIPT_InProgress == 1) { - - printk(KERN_WARNING -@@ -5488,16 +5145,6 @@ qla2x00_sc_scsi3_passthru(scsi_qla_host_ - pscsi3_cmd->sense_buffer[i]; - } - -- ret = verify_area(VERIFY_WRITE, (void *)pext->RequestAdr, -- sizeof(EXT_FC_SCSI_PASSTHRU)); -- if (ret) { -- pext->Status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("%s(%ld): inst=%ld ERROR verify WRITE " -- "RequestAdr.\n", -- __func__, ha->host_no, ha->instance);) -- return (ret); -- } -- - usr_temp = (uint8_t *)pext->RequestAdr; - kernel_tmp = (uint8_t *)pscsi3_pass; - ret = copy_to_user(usr_temp, kernel_tmp, -@@ -5516,19 +5163,6 @@ qla2x00_sc_scsi3_passthru(scsi_qla_host_ - 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);) -- -- return (ret); -- } -- - /* now copy up the READ data to user */ - if ((CMD_COMPL_STATUS(pscsi3_cmd) == CS_DATA_UNDERRUN) && - (CMD_RESID_LEN(pscsi3_cmd))) { -@@ -5587,14 +5221,11 @@ qla2x00_send_els_rnid(scsi_qla_host_t *h - - EXT_RNID_REQ *tmp_rnid; - int ret = 0; -- uint8_t dev_found = 0; -- uint16_t dev_loop_id = 0; - uint16_t mb[MAILBOX_REGISTER_COUNT]; - uint32_t copy_len; -- fc_port_t *fcport; - int found; -- struct list_head *fcil; -- fc_initiator_t *fcinitiator; -+ uint16_t next_loop_id; -+ fc_port_t *fcport; - - DEBUG9(printk("%s(%ld): inst=%ld entered.\n", - __func__, ha->host_no, ha->instance);) -@@ -5621,17 +5252,6 @@ qla2x00_send_els_rnid(scsi_qla_host_t *h - return (ret); - } - -- ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, -- pext->RequestLen); -- -- if (ret != 0) { -- pext->Status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk( -- "%s(%ld): inst=%ld req buf verify READ FAILED\n", -- __func__, ha->host_no, ha->instance);) -- return (ret); -- } -- - DEBUG9(printk("%s(%ld): inst=%ld req buf verified. Copying req data.\n", - __func__, ha->host_no, ha->instance);) - -@@ -5657,159 +5277,80 @@ qla2x00_send_els_rnid(scsi_qla_host_t *h - } - - /* Find loop ID of the device */ -- fcinitiator = NULL; -+ found = 0; -+ fcport = NULL; - switch (tmp_rnid->Addr.Type) { - case EXT_DEF_TYPE_WWNN: - - DEBUG9(printk("%s(%ld): inst=%ld got node name.\n", - __func__, ha->host_no, ha->instance);) - -- for (fcport = ha->fcport; (fcport); fcport = fcport->next) { -- /* if removed or missing */ -- if (atomic_read(&fcport->state) == FC_ONLINE && -- memcmp((void *)tmp_rnid->Addr.FcAddr.WWNN, -- (void *)fcport->node_name, -- EXT_DEF_WWN_NAME_SIZE) == 0) { -- break; -- } -- } -- if (fcport != NULL) { -- DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; " -- "loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, -- fcport->loop_id);) -- -- dev_found = TGT_DEV; -- dev_loop_id = fcport->loop_id; -- break; -- } -- -- found = 0; -- fcinitiator = NULL; -- list_for_each(fcil, &ha->fcinitiators) { -- fcinitiator = list_entry(fcil, fc_initiator_t, list); -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (fcport->port_type != FCT_INITIATOR || -+ fcport->port_type != FCT_TARGET) -+ continue; - - if (memcmp(tmp_rnid->Addr.FcAddr.WWNN, -- fcinitiator->node_name, -- EXT_DEF_WWN_NAME_SIZE) == 0 && -- fcinitiator->d_id.b24 != 0) { -+ fcport->node_name, EXT_DEF_WWN_NAME_SIZE)) -+ continue; - -- found++; -- break; -+ if (fcport->port_type == FCT_TARGET) { -+ if (atomic_read(&fcport->state) != FC_ONLINE) -+ continue; -+ } else { /* FCT_INITIATOR */ -+ if (!fcport->d_id.b24) -+ continue; - } -- } -- if (found) { -- DEBUG9(printk("%s(%ld): inst=%ld found host device; " -- "loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, -- fcinitiator->loop_id);) - -- dev_found = HOST_DEV; -- dev_loop_id = fcinitiator->loop_id; -- break; -+ found++; - } -- - break; - -- - case EXT_DEF_TYPE_WWPN: - DEBUG9(printk("%s(%ld): inst=%ld got port name.\n", - __func__, ha->host_no, ha->instance);) - -- for (fcport = ha->fcport; (fcport); fcport = fcport->next) { -- /* if removed or missing */ -- if (atomic_read(&fcport->state) == FC_ONLINE && -- memcmp((void *)tmp_rnid->Addr.FcAddr.WWPN, -- (void *)fcport->port_name, -- EXT_DEF_WWN_NAME_SIZE) == 0) { -- break; -- } -- } -- if (fcport != NULL) { -- DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; " -- "loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, -- fcport->loop_id);) -- -- dev_found = TGT_DEV; /* target device */ -- dev_loop_id = fcport->loop_id; -- break; -- } -- -- found = 0; -- fcinitiator = NULL; -- list_for_each(fcil, &ha->fcinitiators) { -- fcinitiator = list_entry(fcil, fc_initiator_t, list); -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (fcport->port_type != FCT_INITIATOR || -+ fcport->port_type != FCT_TARGET) -+ continue; - - if (memcmp(tmp_rnid->Addr.FcAddr.WWPN, -- fcinitiator->port_name, -- EXT_DEF_WWN_NAME_SIZE) == 0 && -- fcinitiator->d_id.b24 != 0) { -+ fcport->port_name, EXT_DEF_WWN_NAME_SIZE)) -+ continue; - -- found++; -- break; -+ if (fcport->port_type == FCT_TARGET) { -+ if (atomic_read(&fcport->state) != FC_ONLINE) -+ continue; -+ } else { /* FCT_INITIATOR */ -+ if (!fcport->d_id.b24) -+ continue; - } -- } -- if (found) { -- DEBUG9(printk("%s(%ld): inst=%ld found host device; " -- "loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, -- fcinitiator->loop_id);) - -- dev_found = HOST_DEV; -- dev_loop_id = fcinitiator->loop_id; -- break; -+ found++; - } -- - break; - - case EXT_DEF_TYPE_PORTID: - DEBUG9(printk("%s(%ld): inst=%ld got port ID.\n", - __func__, ha->host_no, ha->instance);) - -- /* PORTID bytes entered must already be big endian */ -- for (fcport = ha->fcport; (fcport); fcport = fcport->next) { -- /* if removed or missing */ -- if (atomic_read(&fcport->state) == FC_ONLINE && -- memcmp((void *)&tmp_rnid->Addr.FcAddr.Id[1], -- (void *)(fcport->d_id.r.d_id), -- EXT_DEF_PORTID_SIZE_ACTUAL) == 0) { -- break; -- } -- } -- if (fcport != NULL) { -- DEBUG9(printk("%s(%ld): inst=%ld found tgt dev; " -- "loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, -- fcport->loop_id);) -- -- dev_found = TGT_DEV; /* target device */ -- dev_loop_id = fcport->loop_id; -- break; -- } -- -- found = 0; -- fcinitiator = NULL; -- list_for_each(fcil, &ha->fcinitiators) { -- fcinitiator = list_entry(fcil, fc_initiator_t, list); -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (fcport->port_type != FCT_INITIATOR || -+ fcport->port_type != FCT_TARGET) -+ continue; - -+ /* PORTID bytes entered must already be big endian */ - if (memcmp(&tmp_rnid->Addr.FcAddr.Id[1], -- &fcinitiator->d_id, -- EXT_DEF_PORTID_SIZE_ACTUAL) == 0) { -+ &fcport->d_id, EXT_DEF_PORTID_SIZE_ACTUAL)) -+ continue; - -- found++; -- break; -+ if (fcport->port_type == FCT_TARGET) { -+ if (atomic_read(&fcport->state) != FC_ONLINE) -+ continue; - } -- } -- if (found) { -- DEBUG9(printk("%s(%ld): inst=%ld found host device; " -- "loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, -- fcinitiator->loop_id);) - -- dev_found = HOST_DEV; -- dev_loop_id = fcinitiator->loop_id; -- break; -+ found++; - } - - break; -@@ -5822,23 +5363,18 @@ qla2x00_send_els_rnid(scsi_qla_host_t *h - return (ret); - } - -- if (!dev_found || -- (dev_found == TGT_DEV && dev_loop_id > LAST_SNS_LOOP_ID)) { -+ if (!found || (fcport->port_type == FCT_TARGET && -+ fcport->loop_id > SNS_LAST_LOOP_ID)) { - /* No matching device or the target device is not - * configured; just return error. - */ - pext->Status = EXT_STATUS_DEV_NOT_FOUND; -- DEBUG9_10(printk( -- "%s(%ld): inst=%ld device not found. dev_found=%d " -- "dev_loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, dev_found, -- dev_loop_id);) - qla2x00_free_ioctl_scrap_mem(ha); - return (ret); - } - - /* check on loop down */ -- if (ha->loop_state != LOOP_READY || -+ if (atomic_read(&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) { -@@ -5851,109 +5387,21 @@ qla2x00_send_els_rnid(scsi_qla_host_t *h - return (ret); - } - -- /* Check whether we need to login first. */ -- if (dev_found == HOST_DEV && dev_loop_id > LAST_SNS_LOOP_ID) { -- /* -- * Search for a usable loop ID before try to login to it. -- */ -- if ((dev_loop_id &= ~PORT_LOST_ID) > LAST_SNS_LOOP_ID) { -- /* Just start searching from first possible ID. */ -- dev_loop_id = ha->min_external_loopid; -- } -- for (;;) { -- if (ha->fabricid[dev_loop_id].in_use == TRUE) { -- dev_loop_id++; -- } else { -- ha->fabricid[dev_loop_id].in_use = TRUE; -- break; -- } -- } -- -- DEBUG9(printk("%s(%ld): inst=%ld try relogin to host dev; " -- "dev_loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, dev_loop_id);) -- -- for (;;) { -- if (dev_loop_id > LAST_SNS_LOOP_ID) { -- /* error */ -- DEBUG10(printk("%s(%ld): inst=%ld " -- "no valid loop_id for login.\n", -- __func__, ha->host_no, ha->instance);) -- -- break; -- } -- -- qla2x00_login_fabric(ha, -- dev_loop_id, -- fcinitiator->d_id.b.domain, -- fcinitiator->d_id.b.area, -- fcinitiator->d_id.b.al_pa, -- &mb[0], 0); -- -- if (mb[0] != MBS_CMD_CMP && -- mb[0] != MBS_PORT_ID_IN_USE && -- mb[0] != MBS_LOOP_ID_IN_USE) { -- -- DEBUG10(printk("%s(%ld): inst=%ld " -- "ERROR login mb[0]=%x mb[1]=%x.\n", -- __func__, ha->host_no, ha->instance, -- mb[0], mb[1]);) -- break; -- } -- -- if (mb[0] == MBS_CMD_CMP) { -- DEBUG9(printk("%s(%ld): inst=%ld host login " -- "success; loop_id=%x.\n", -- __func__, ha->host_no, ha->instance, -- dev_loop_id);) -- -- fcinitiator->loop_id = dev_loop_id; -- break; -- } else if (mb[0] == MBS_PORT_ID_IN_USE) { -- ha->fabricid[dev_loop_id].in_use = FALSE; -- dev_loop_id = mb[1]; -- -- DEBUG9(printk("%s(%ld): inst=%ld port %06x " -- "using loop id=0x%04x.\n", -- __func__, ha->host_no, ha->instance, -- fcinitiator->d_id.b24, -- dev_loop_id);) -- -- if (dev_loop_id <= LAST_SNS_LOOP_ID) -- ha->fabricid[dev_loop_id].in_use = TRUE; -- else -- /* Error */ -- break; -- -- } else if (mb[0] == MBS_LOOP_ID_IN_USE) { -- /* Search for another usable loop_id */ -- dev_loop_id++; -- while (ha->fabricid[dev_loop_id].in_use) { -- if (dev_loop_id++ > LAST_SNS_LOOP_ID) { -- /* Error */ -- break; -- } -- } -- -- if (dev_loop_id <= LAST_SNS_LOOP_ID) { -- DEBUG9(printk( -- "%s(%ld): inst=%ld previous loop " -- "id in use. Retry with 0x%04x.\n", -- __func__, ha->host_no, ha->instance, -- dev_loop_id);) -- -- ha->fabricid[dev_loop_id].in_use = TRUE; -- } else { -- /* Error */ -- break; -- } -- } -- } -+ /* If this is for a host device, check if we need to perform login */ -+ if (fcport->port_type == FCT_INITIATOR && -+ fcport->loop_id >= SNS_LAST_LOOP_ID) { -+ next_loop_id = 0; -+ ret = qla2x00_fabric_login(ha, fcport, &next_loop_id); -+ if (ret != QL_STATUS_SUCCESS) { -+ /* login failed. */ -+ pext->Status = EXT_STATUS_DEV_NOT_FOUND; - -- if (mb[0] != MBS_CMD_CMP) { -- pext->Status = EXT_STATUS_ERR; -- DEBUG9_10(printk( "%s(%ld): inst=%ld login failed.\n", -- __func__, ha->host_no, ha->instance);) -+ 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, -+ fcport->loop_id, fcport->d_id.b.domain, -+ fcport->d_id.b.area, fcport->d_id.b.al_pa, ret);) - - qla2x00_free_ioctl_scrap_mem(ha); - return (ret); -@@ -5964,7 +5412,7 @@ qla2x00_send_els_rnid(scsi_qla_host_t *h - DEBUG9(printk("%s(%ld): inst=%ld sending rnid cmd.\n", - __func__, ha->host_no, ha->instance);) - -- ret = qla2x00_send_rnid_mbx(ha, dev_loop_id, -+ ret = qla2x00_send_rnid_mbx(ha, fcport->loop_id, - (uint8_t)tmp_rnid->DataFormat, ha->ioctl_mem_phys, - SEND_RNID_RSP_SIZE, &mb[0]); - -@@ -5985,38 +5433,27 @@ qla2x00_send_els_rnid(scsi_qla_host_t *h - copy_len = (pext->ResponseLen > SEND_RNID_RSP_SIZE) ? - SEND_RNID_RSP_SIZE : pext->ResponseLen; - -- ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, -- copy_len); -- -- if (ret != 0) { -+ ret = copy_to_user(pext->ResponseAdr, ha->ioctl_mem, copy_len); -+ if (ret) { - pext->Status = EXT_STATUS_COPY_ERR; - DEBUG9_10(printk( -- "%s(%ld): inst=%ld rsp buf verify WRITE error\n", -+ "%s(%ld): inst=%ld ERROR copy rsp buf\n", - __func__, ha->host_no, ha->instance);) -- } else { -- ret = copy_to_user((uint8_t *)pext->ResponseAdr, -- (uint8_t *)ha->ioctl_mem, copy_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->instance);) -- qla2x00_free_ioctl_scrap_mem(ha); -- return (ret); -- } -+ qla2x00_free_ioctl_scrap_mem(ha); -+ return (ret); -+ } - -- if (SEND_RNID_RSP_SIZE > pext->ResponseLen) { -- pext->Status = EXT_STATUS_DATA_OVERRUN; -- DEBUG9(printk("%s(%ld): inst=%ld data overrun. " -- "exiting normally.\n", -- __func__, ha->host_no, ha->instance);) -- } else { -- pext->Status = EXT_STATUS_OK; -- DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", -- __func__, ha->host_no, ha->instance);) -- } -- pext->ResponseLen = copy_len; -+ if (SEND_RNID_RSP_SIZE > pext->ResponseLen) { -+ pext->Status = EXT_STATUS_DATA_OVERRUN; -+ DEBUG9(printk("%s(%ld): inst=%ld data overrun. exiting " -+ "normally.\n", -+ __func__, ha->host_no, ha->instance);) -+ } else { -+ pext->Status = EXT_STATUS_OK; -+ DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", -+ __func__, ha->host_no, ha->instance);) - } -+ pext->ResponseLen = copy_len; - - qla2x00_free_ioctl_scrap_mem(ha); - return (ret); -@@ -6050,7 +5487,7 @@ qla2x00_get_rnid_params(scsi_qla_host_t - __func__, ha->host_no, ha->instance);) - - /* check on loop down */ -- if (ha->loop_state != LOOP_READY || -+ if (atomic_read(&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) { -@@ -6078,39 +5515,30 @@ qla2x00_get_rnid_params(scsi_qla_host_t - /* Copy the response */ - copy_len = (pext->ResponseLen > sizeof(EXT_RNID_DATA)) ? - (uint32_t)sizeof(EXT_RNID_DATA) : pext->ResponseLen; -- ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, -- copy_len); - -- if (ret != 0) { -+ ret = copy_to_user(pext->ResponseAdr, ha->ioctl_mem, copy_len); -+ if (ret) { - pext->Status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("%s(%ld): inst=%ld verify WRITE rsp buf error\n", -+ DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buf\n", - __func__, ha->host_no, ha->instance);) -- } else { -- ret = copy_to_user((void *)pext->ResponseAdr, -- (void *)ha->ioctl_mem, copy_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->instance);) -- return (ret); -- } -+ return (ret); -+ } - -- pext->ResponseLen = copy_len; -- if (copy_len < sizeof(EXT_RNID_DATA)) { -- pext->Status = EXT_STATUS_DATA_OVERRUN; -- DEBUG9_10(printk("%s(%ld): inst=%ld data overrun. " -- "exiting normally.\n", -- __func__, ha->host_no, ha->instance);) -- } else if (pext->ResponseLen > sizeof(EXT_RNID_DATA)) { -- pext->Status = EXT_STATUS_DATA_UNDERRUN; -- DEBUG9_10(printk("%s(%ld): inst=%ld data underrun. " -- "exiting normally.\n", -- __func__, ha->host_no, ha->instance);) -- } else { -- pext->Status = EXT_STATUS_OK; -- DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", -- __func__, ha->host_no, ha->instance);) -- } -+ pext->ResponseLen = copy_len; -+ if (copy_len < sizeof(EXT_RNID_DATA)) { -+ pext->Status = EXT_STATUS_DATA_OVERRUN; -+ DEBUG9_10(printk("%s(%ld): inst=%ld data overrun. " -+ "exiting normally.\n", -+ __func__, ha->host_no, ha->instance);) -+ } else if (pext->ResponseLen > sizeof(EXT_RNID_DATA)) { -+ pext->Status = EXT_STATUS_DATA_UNDERRUN; -+ DEBUG9_10(printk("%s(%ld): inst=%ld data underrun. " -+ "exiting normally.\n", -+ __func__, ha->host_no, ha->instance);) -+ } else { -+ pext->Status = EXT_STATUS_OK; -+ DEBUG9(printk("%s(%ld): inst=%ld exiting normally.\n", -+ __func__, ha->host_no, ha->instance);) - } - - return (ret); -@@ -6142,17 +5570,6 @@ qla2x00_get_led_state(scsi_qla_host_t *h - DEBUG9(printk("%s(%ld): inst=%ld entered.\n", - __func__, ha->host_no, ha->instance);) - -- ret = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, -- sizeof(EXT_BEACON_CONTROL)); -- -- 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); -- } -- - if (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) { - pext->Status = EXT_STATUS_BUSY; - DEBUG9_10(printk("%s(%ld): inst=%ld loop not ready.\n", -@@ -6262,7 +5679,7 @@ qla2x00_set_rnid_params(scsi_qla_host_t - __func__, ha->host_no, ha->instance);) - - /* check on loop down */ -- if (ha->loop_state != LOOP_READY || -+ if (atomic_read(&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) { -@@ -6283,16 +5700,6 @@ qla2x00_set_rnid_params(scsi_qla_host_t - return(ret); - } - -- ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, -- pext->RequestLen); -- -- if (ret != 0) { -- pext->Status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("%s(%ld): inst=%ld verify READ request buf.\n", -- __func__, ha->host_no, ha->instance);) -- return(ret); -- } -- - if (qla2x00_get_ioctl_scrap_mem(ha, (void **)&tmp_set, - sizeof(EXT_SET_RNID_REQ))) { - /* not enough memory */ -@@ -6379,17 +5786,6 @@ qla2x00_set_led_state(scsi_qla_host_t *h - DEBUG9(printk("%s(%ld): inst=%ld entered.\n", - __func__, ha->host_no, ha->instance);) - -- ret = verify_area(VERIFY_READ, (void *)pext->RequestAdr, -- sizeof(EXT_BEACON_CONTROL)); -- -- 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); -- } -- - if (test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)) { - pext->Status = EXT_STATUS_BUSY; - DEBUG9_10(printk("%s(%ld): inst=%ld abort isp active.\n", -@@ -6397,8 +5793,8 @@ qla2x00_set_led_state(scsi_qla_host_t *h - return (ret); - } - -- ret = copy_from_user(&ptmp_led_state, -- pext->RequestAdr, pext->RequestLen); -+ ret = copy_from_user(&ptmp_led_state, pext->RequestAdr, -+ pext->RequestLen); - if (ret) { - pext->Status = EXT_STATUS_COPY_ERR; - DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy req buf.\n", -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_cfg.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_cfg.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_cfg.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_cfg.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -21,7 +21,6 @@ - * QLogic ISP2x00 Multi-path LUN Support Driver - * - */ -- - #include "qlfo.h" - #include "qla_cfg.h" - #include "qla_gbl.h" -@@ -32,12 +31,12 @@ - #include "qla_cfgln.c" - #endif - -- -+extern int qla2x00_lun_reset(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun); - /* - * Local Function Prototypes. - */ - --static uint32_t qla2x00_add_portname_to_mp_dev(mp_device_t *, uint8_t *); -+static uint32_t qla2x00_add_portname_to_mp_dev(mp_device_t *, uint8_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 *, -@@ -57,16 +56,16 @@ static uint32_t qla2x00_cfg_register_fai - 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); -+ uint8_t, srb_t *); - - static BOOL 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 fc_lun_t *qla2x00_find_matching_lun(uint8_t , mp_device_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_nodename(mp_host_t *, uint8_t *); --static mp_device_t *qla2x00_find_mp_dev_by_portname(mp_host_t *, uint8_t *, -+mp_device_t *qla2x00_find_mp_dev_by_portname(mp_host_t *, uint8_t *, - uint16_t *); - static mp_device_t *qla2x00_find_dp_by_pn_from_all_hosts(uint8_t *, uint16_t *); - -@@ -80,7 +79,36 @@ static void qla2x00_add_path(mp_path_lis - static BOOL qla2x00_is_portname_in_device(mp_device_t *, uint8_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 *); -+static void qla2x00_setup_new_path(mp_device_t *, mp_path_t *, fc_port_t *); -+static int qla2x00_get_wwuln_from_device(mp_host_t *, fc_lun_t *, char *, int); -+#if 0 -+static mp_device_t * qla2x00_is_nn_and_pn_in_device(mp_device_t *, -+ uint8_t *, uint8_t *); -+static mp_device_t * qla2x00_find_mp_dev_by_nn_and_pn(mp_host_t *, uint8_t *, uint8_t *); -+#endif -+static mp_lun_t * qla2x00_find_matching_lunid(char *); -+static fc_lun_t * qla2x00_find_matching_lun_by_num(uint16_t , mp_device_t *, -+ mp_path_t *); -+static int qla2x00_configure_cfg_device(fc_port_t *); -+static mp_lun_t * -+qla2x00_find_or_allocate_lun(mp_host_t *, uint16_t , -+ fc_port_t *, fc_lun_t *); -+static void qla2x00_add_lun( mp_device_t *, mp_lun_t *); -+#if 0 -+static BOOL qla2x00_is_nodename_in_device(mp_device_t *, uint8_t *); -+#endif -+static mp_port_t * -+qla2x00_find_or_allocate_port(mp_host_t *, mp_lun_t *, -+ mp_path_t *); -+static mp_port_t * -+qla2x00_find_port_by_name(mp_lun_t *, mp_path_t *); -+static struct _mp_path * -+qla2x00_find_first_active_path(mp_device_t *, mp_lun_t *); -+#if 0 -+static BOOL -+qla2x00_is_pathid_in_port(mp_port_t *, uint8_t ); -+#endif -+int qla2x00_export_target( void *, uint16_t , fc_port_t *, uint16_t ); - - /* - * Global data items -@@ -90,11 +118,66 @@ BOOL mp_config_required = FALSE; - static int mp_num_hosts = 0; - static BOOL mp_initialized = FALSE; - -- - /* - * ENTRY ROUTINES - */ - -+ /* -+ * Borrowed from scsi_scan.c -+ */ -+int16_t qla2x00_cfg_lookup_device(unsigned char *response_data) -+{ -+ int i = 0; -+ unsigned char *pnt; -+ DEBUG3(printk(KERN_INFO "Entering %s\n", __func__);) -+ for (i = 0; 1; i++) { -+ if (cfg_device_list[i].vendor == NULL) -+ return -1; -+ pnt = &response_data[8]; -+ while (*pnt && *pnt == ' ') -+ pnt++; -+ if (memcmp(cfg_device_list[i].vendor, pnt, -+ strlen(cfg_device_list[i].vendor))) -+ continue; -+ pnt = &response_data[16]; -+ while (*pnt && *pnt == ' ') -+ pnt++; -+ if (memcmp(cfg_device_list[i].model, pnt, -+ strlen(cfg_device_list[i].model))) -+ continue; -+ return i; -+ } -+ return -1; -+} -+ -+ -+static int qla2x00_configure_cfg_device(fc_port_t *fcport) -+{ -+ int id = fcport->cfg_id; -+ -+ DEBUG3(printk("Entering %s - id= %d\n", __func__, fcport->cfg_id);) -+ -+ if( fcport->cfg_id == (int16_t) -1 ) -+ return 0; -+ -+ /* Set any notify options */ -+ if( cfg_device_list[id].notify_type != FO_NOTIFY_TYPE_NONE ){ -+ fcport->notify_type = cfg_device_list[id].notify_type; -+ } -+ -+ DEBUG3(printk("%s - Configuring device \n", __func__);) -+ /* Disable failover capability if needed and return */ -+ -+ fcport->fo_combine = cfg_device_list[id].fo_combine; -+#if 0 -+ fcport->fo_detect = cfg_device_list[id].fo_detect; -+ fcport->fo_notify = cfg_device_list[id].fo_notify; -+ fcport->fo_select = cfg_device_list[id].fo_select; -+#endif -+ DEBUG3(printk("Exiting %s - id= %d\n", __func__, fcport->cfg_id); ) -+ return 1; -+} -+ - /* - * qla2x00_cfg_init - * Initialize configuration structures to handle an instance of -@@ -116,17 +199,16 @@ qla2x00_cfg_init(scsi_qla_host_t *ha) - - 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); -- } -+ mp_initialized = TRUE; -+ /* 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"); -@@ -191,10 +273,10 @@ qla2x00_cfg_path_discovery(scsi_qla_host - } - - /* Fill in information about host */ -- if (host != NULL ) { -+ if (host != NULL) { - host->flags |= MP_HOST_FLAG_NEEDS_UPDATE; - host->flags |= MP_HOST_FLAG_LUN_FO_ENABLED; -- host->fcport = ha->fcport; -+ host->fcports = &ha->fcports; - - /* Check if multipath is enabled */ - DEBUG3(printk("%s: updating mp host for ha inst %ld.\n", -@@ -261,8 +343,10 @@ qla2x00_cfg_event_notify(scsi_qla_host_t - /* Adapter is back up with new configuration */ - if ((host = qla2x00_cfg_find_host(ha)) != NULL) { - host->flags |= MP_HOST_FLAG_NEEDS_UPDATE; -- host->fcport = ha->fcport; -+ host->fcports = &ha->fcports; -+ set_bit(CFG_FAILOVER, &ha->cfg_flags); - qla2x00_update_mp_tree(); -+ clear_bit(CFG_FAILOVER, &ha->cfg_flags); - } - break; - case MP_NOTIFY_LOOP_DOWN: -@@ -282,6 +366,248 @@ qla2x00_cfg_event_notify(scsi_qla_host_t - return QLA2X00_SUCCESS; - } - -+int qla2x00_cfg_remap(scsi_qla_host_t *halist) -+{ -+ scsi_qla_host_t *ha; -+ -+ DEBUG2(printk("Entering %s ...\n",__func__);) -+ /* Find the host that was specified */ -+ mp_initialized = TRUE; -+ for (ha=halist; (ha != NULL); ha=ha->next) { -+ set_bit(CFG_FAILOVER, &ha->cfg_flags); -+ qla2x00_cfg_path_discovery(ha); -+ clear_bit(CFG_FAILOVER, &ha->cfg_flags); -+ } -+ mp_initialized = FALSE; -+ DEBUG2(printk("Exiting %s ...\n",__func__);) -+ -+ return QLA2X00_SUCCESS; -+} -+ -+/* -+ * qla2x00_allocate_mp_port -+ * Allocate an fc_mp_port, clear the memory, and log a system -+ * error if the allocation fails. After fc_mp_port is allocated -+ * -+ */ -+static mp_port_t * -+qla2x00_allocate_mp_port(uint8_t *portname) -+{ -+ mp_port_t *port; -+ int i; -+ -+ DEBUG3(printk("%s: entered.\n", __func__);) -+ -+ port = (mp_port_t *)KMEM_ZALLOC(sizeof(mp_port_t), 3); -+ -+ if (port != NULL) { -+ DEBUG(printk("%s: mp_port_t allocated at %p\n", -+ __func__, port);) -+ -+ /* -+ * Since this is the first port, it goes at -+ * index zero. -+ */ -+ if (portname) -+ { -+ DEBUG3(printk("%s: copying port name %02x%02x%02x" -+ "%02x%02x%02x%02x%02x.\n", -+ __func__, portname[0], portname[1], -+ portname[2], portname[3], portname[4], -+ portname[5], portname[6], portname[7]);) -+ memcpy(&port->portname[0], portname, PORT_NAME_SIZE); -+ } -+ for ( i = 0 ;i < MAX_HOSTS; i++ ) { -+ port->path_list[i] = PATH_INDEX_INVALID; -+ } -+ port->fo_cnt = 0; -+ -+ } -+ -+ DEBUG3(printk("%s: exiting.\n", __func__);) -+ -+ return port; -+} -+ -+static mp_port_t * -+qla2x00_find_port_by_name(mp_lun_t *mplun, -+ mp_path_t *path) -+{ -+ mp_port_t *port = NULL; -+ mp_port_t *temp_port; -+ struct list_head *list, *temp; -+ -+ list_for_each_safe(list, temp, &mplun->ports_list) { -+ temp_port = list_entry(list, mp_port_t, list); -+ if ( memcmp(temp_port->portname, path->portname, WWN_SIZE) == 0 ) { -+ port = temp_port; -+ break; -+ } -+ } -+ return port; -+} -+ -+ -+static mp_port_t * -+qla2x00_find_or_allocate_port(mp_host_t *host, mp_lun_t *mplun, -+ mp_path_t *path) -+{ -+ mp_port_t *port = NULL; -+ struct list_head *list, *temp; -+ unsigned long instance = host->instance; -+ -+ if( instance == MAX_HOSTS - 1) { -+ printk(KERN_INFO "%s: Fail no room\n", __func__); -+ return NULL; -+ } -+ -+ if ( mplun == NULL ) { -+ return NULL; -+ } -+ -+ list_for_each_safe(list, temp, &mplun->ports_list) { -+ port = list_entry(list, mp_port_t, list); -+ if ( memcmp(port->portname, path->portname, WWN_SIZE) == 0 ) { -+ if ( port->path_list[instance] == PATH_INDEX_INVALID ) { -+ DEBUG(printk("scsi%ld %s: Found matching mp port %02x%02x%02x" -+ "%02x%02x%02x%02x%02x.\n", -+ instance, __func__, port->portname[0], port->portname[1], -+ port->portname[2], port->portname[3], -+ port->portname[4], port->portname[5], -+ port->portname[6], port->portname[7]);) -+ port->path_list[instance] = path->id; -+ port->hba_list[instance] = host->ha; -+ port->cnt++; -+ DEBUG(printk("%s: adding portname - port[%d] = " -+ "%p at index = %d with path id %d\n", -+ __func__, (int)instance ,port, -+ (int)instance, path->id);) -+ } -+ return port; -+ } -+ } -+ port = qla2x00_allocate_mp_port(path->portname); -+ if( port ) { -+ port->cnt++; -+ DEBUG(printk("%s: allocate and adding portname - port[%d] = " -+ "%p at index = %d with path id %d\n", -+ __func__, (int)instance, port, -+ (int)instance, path->id);) -+ port->path_list[instance] = path->id; -+ port->hba_list[instance] = host->ha; -+ /* add port to list */ -+ list_add_tail(&port->list,&mplun->ports_list ); -+ } -+ return port; -+} -+ -+ -+/* -+ * qla2x00_cfg_failover_port -+ * Failover all the luns on the specified target to -+ * the new path. -+ * -+ * Inputs: -+ * ha = pointer to host adapter -+ * fp - pointer to new fc_lun (failover lun) -+ * tgt - pointer to target -+ * -+ * Returns: -+ * -+ */ -+static fc_lun_t * -+qla2x00_cfg_failover_port( mp_host_t *host, mp_device_t *dp, -+ mp_path_t *new_path, fc_port_t *old_fcport, srb_t *sp) -+{ -+ uint8_t l; -+ fc_port_t *fcport; -+ fc_lun_t *fclun; -+ fc_lun_t *new_fclun = NULL; -+ os_lun_t *up; -+ mp_path_t *vis_path; -+ mp_host_t *vis_host; -+ -+ fcport = new_path->port; -+ if( !qla2x00_test_active_port(fcport) ) { -+ DEBUG2(printk("%s(%ld): %s - port not ACTIVE " -+ "to failover: port = %p, loop id= 0x%x\n", -+ __func__, -+ host->ha->host_no, __func__, fcport, fcport->loop_id);) -+ return new_fclun; -+ } -+ -+ /* Log the failover to console */ -+ printk(KERN_INFO -+ "qla2x00%d: FAILOVER all LUNS on device %d to WWPN " -+ "%02x%02x%02x%02x%02x%02x%02x%02x -> " -+ "%02x%02x%02x%02x%02x%02x%02x%02x, reason=0x%x\n", -+ (int) host->instance, -+ (int) dp->dev_id, -+ old_fcport->port_name[0], old_fcport->port_name[1], -+ old_fcport->port_name[2], old_fcport->port_name[3], -+ old_fcport->port_name[4], old_fcport->port_name[5], -+ old_fcport->port_name[6], old_fcport->port_name[7], -+ 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], sp->err_id ); -+ printk(KERN_INFO -+ "qla2x00: FROM HBA %d to HBA %d\n", -+ (int)old_fcport->ha->instance, -+ (int)fcport->ha->instance); -+ -+ /* we failover all the luns on this port */ -+ list_for_each_entry(fclun, &fcport->fcluns, list) { -+ l = fclun->lun; -+ if( (fclun->flags & FC_VISIBLE_LUN) ) { -+ continue; -+ } -+ dp->path_list->current_path[l] = new_path->id; -+ if ((vis_path = -+ qla2x00_get_visible_path(dp)) == NULL ) { -+ printk(KERN_INFO -+ "qla2x00(%d): No visible " -+ "path for target %d, " -+ "dp = %p\n", -+ (int)host->instance, -+ dp->dev_id, dp); -+ continue; -+ } -+ -+ vis_host = vis_path->host; -+ up = (os_lun_t *) GET_LU_Q(vis_host->ha, -+ dp->dev_id, l); -+ if (up == NULL ) { -+ DEBUG2(printk("%s: instance %d: No lun queue" -+ "for target %d, lun %d.. \n", -+ __func__,(int)vis_host->instance,dp->dev_id,l);) -+ continue; -+ } -+ -+ up->fclun = fclun; -+ fclun->fcport->cur_path = new_path->id; -+ -+ DEBUG2(printk("%s: instance %d: Mapping target %d:0x%x," -+ "lun %d to path id %d\n", -+ __func__,(int)vis_host->instance,dp->dev_id, -+ fclun->fcport->loop_id, l, -+ fclun->fcport->cur_path);) -+ -+ /* issue reset to data luns only */ -+ if( fclun->inq0 == 0 ) { -+ new_fclun = fclun; -+ /* send a reset lun command as well */ -+ printk(KERN_INFO -+ "scsi(%ld:0x%x:%d) sending reset lun \n", -+ fcport->ha->host_no, -+ fcport->loop_id, l); -+ qla2x00_lun_reset(fcport->ha, -+ fcport->loop_id, l); -+ } -+ } -+ return new_fclun; -+} -+ - /* - * qla2x00_cfg_failover - * A problem has been detected with the current path for this -@@ -304,8 +630,11 @@ qla2x00_cfg_failover(scsi_qla_host_t *ha - mp_device_t *dp; /* virtual device pointer */ - mp_path_t *new_path; /* new path pointer */ - fc_lun_t *new_fp = NULL; -+ fc_port_t *fcport, *new_fcport; - - ENTER("qla2x00_cfg_failover"); -+ DEBUG2(printk("%s entered\n",__func__);) -+ - set_bit(CFG_ACTIVE, &ha->cfg_flags); - if ((host = qla2x00_cfg_find_host(ha)) != NULL) { - if ((dp = qla2x00_find_mp_dev_by_nodename( -@@ -318,21 +647,71 @@ qla2x00_cfg_failover(scsi_qla_host_t *ha - * 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);) -+ new_path = qla2x00_select_next_path(host, dp, -+ fp->lun, sp); -+ if( new_path == NULL ) -+ goto cfg_failover_done; -+ new_fp = qla2x00_find_matching_lun(fp->lun, -+ dp, new_path); -+ if( new_fp == NULL ) -+ goto cfg_failover_done; -+ DEBUG2(printk("cfg_failover: new path=%p, new pathid=%d" -+ " new fp lun= %p\n", -+ new_path, new_path->id, new_fp);) -+ -+ fcport = fp->fcport; -+ if( (fcport->flags & FC_MSA_DEVICE) ) { -+ /* -+ * "select next path" has already -+ * send out the switch path notify -+ * command, so inactive old path -+ */ -+ fcport->flags &= ~(FC_MSA_PORT_ACTIVE); -+ if( qla2x00_cfg_failover_port( host, dp, -+ new_path, fcport, sp) == NULL ) { -+ printk(KERN_INFO -+ "scsi(%ld): Fail to failover device " -+ " - fcport = %p\n", -+ host->ha->host_no, fcport); -+ goto cfg_failover_done; -+ } -+ } else if( (fcport->flags & FC_EVA_DEVICE) ) { -+ new_fcport = new_path->port; -+ if ( qla2x00_test_active_lun( -+ new_fcport, new_fp ) ) { -+ qla2x00_cfg_register_failover_lun(dp, -+ sp, new_fp); -+ /* send a reset lun command as well */ -+ printk(KERN_INFO -+ "scsi(%ld:0x%x:%d) sending" -+ " reset lun \n", -+ new_fcport->ha->host_no, -+ new_fcport->loop_id, new_fp->lun); -+ qla2x00_lun_reset(new_fcport->ha, -+ new_fcport->loop_id, new_fp->lun); -+ } else { -+ DEBUG2(printk( -+ "scsi(%ld): %s Fail to failover lun " -+ "old fclun= %p, new fclun= %p\n", -+ host->ha->host_no, -+ __func__,fp, new_fp);) -+ goto cfg_failover_done; -+ } -+ } else { /*default */ -+ new_fp = qla2x00_find_matching_lun(fp->lun, -+ dp, new_path); -+ qla2x00_cfg_register_failover_lun(dp, sp, 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); -+ "to failover: dp = %p\n", -+ host->instance, dp); - } - } -+ -+cfg_failover_done: - clear_bit(CFG_ACTIVE, &ha->cfg_flags); - - LEAVE("qla2x00_cfg_failover"); -@@ -426,7 +805,8 @@ qla2x00_cfg_get_paths(EXT_IOCTL *cmd, FO - mp_path_list_t *ptmp_plist; - #define STD_MAX_PATH_CNT 1 - #define STD_VISIBLE_INDEX 0 -- fc_port_t *pfcport = NULL; -+ int found; -+ fc_port_t *fcport = NULL; - - DEBUG9(printk("%s: non-fo case.\n", __func__);) - -@@ -443,16 +823,16 @@ qla2x00_cfg_get_paths(EXT_IOCTL *cmd, FO - return -ENOMEM; - } - -- for (pfcport = ha->fcport; pfcport != NULL; -- pfcport = pfcport->next) { -- -- if (memcmp(pfcport->node_name, sap->DestAddr.WWNN, -+ found = 0; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (memcmp(fcport->node_name, sap->DestAddr.WWNN, - EXT_DEF_WWN_NAME_SIZE) == 0) { -+ found++; - break; - } - } - -- if (pfcport) { -+ if (found) { - DEBUG9(printk("%s: found fcport:" - "(%02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x)\n.", - __func__, -@@ -475,18 +855,9 @@ qla2x00_cfg_get_paths(EXT_IOCTL *cmd, FO - entry->Visible = TRUE; - entry->HbaInstance = bp->HbaInstance; - -- memcpy(entry->PortName, pfcport->port_name, -+ 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, -@@ -605,14 +976,6 @@ qla2x00_cfg_get_paths(EXT_IOCTL *cmd, FO - DEBUG9(printk("%s: path cnt=%d, visible path=%d.\n", - __func__, path_list->path_cnt, path_list->visible);) - -- 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);) -- } - DEBUG9(printk("%s: path cnt=%d, visible path=%d.\n", - __func__, path_list->path_cnt, path_list->visible);) - -@@ -956,6 +1319,7 @@ qla2x00_alloc_host(scsi_qla_host_t *ha) - * Input: - * dp = pointer ti virtual device - * portname = Port name to add to device -+ * nodename = Node name to add to device - * - * Returns: - * qla2x00 local function return status code. -@@ -964,7 +1328,7 @@ qla2x00_alloc_host(scsi_qla_host_t *ha) - * Kernel context. - */ - static uint32_t --qla2x00_add_portname_to_mp_dev(mp_device_t *dp, uint8_t *portname) -+qla2x00_add_portname_to_mp_dev(mp_device_t *dp, uint8_t *portname, uint8_t *nodename) - { - uint8_t index; - uint32_t rval = QLA2X00_SUCCESS; -@@ -1029,7 +1393,7 @@ qla2x00_allocate_mp_dev(uint8_t *nodena - */ - if (nodename) - { -- DEBUG3(printk("%s: copying node name %02x%02x%02x" -+ DEBUG(printk("%s: copying node name %02x%02x%02x" - "%02x%02x%02x%02x%02x.\n", - __func__, nodename[0], nodename[1], - nodename[2], nodename[3], nodename[4], -@@ -1305,137 +1669,1135 @@ qla2x00_found_hidden_path(mp_device_t *d - } - - /* -- * qla2x00_default_bind_mpdev -+ * qla2x00_get_wwuln_from_device -+ * Issue SCSI inquiry page code 0x83 command for LUN WWLUN_NAME. - * - * Input: -- * host = mp_host of current adapter -- * port = fc_port of current port -+ * ha = adapter block pointer. -+ * fcport = FC port structure pointer. - * -- * Returns: -- * mp_device pointer -- * NULL - not found. -+ * Return: -+ * 0 - Failed to get the lun_wwlun_name -+ * Otherwise : wwlun_size - * - * Context: - * Kernel context. - */ --static inline mp_device_t * --qla2x00_default_bind_mpdev(mp_host_t *host, fc_port_t *port) -+ -+static int -+qla2x00_get_wwuln_from_device(mp_host_t *host, fc_lun_t *fclun, -+ char *evpd_buf, int wwlun_size) - { -- /* Default search case */ -- int devid = 0; -- mp_device_t *temp_dp = NULL; /* temporary pointer */ -- mp_host_t *temp_host; /* temporary pointer */ - -- DEBUG3(printk("%s: entered.\n", __func__);) -+ evpd_inq_cmd_rsp_t *pkt; -+ int rval = 0 ; -+ dma_addr_t phys_address = 0; -+ int retry; -+ uint16_t comp_status; -+ uint16_t scsi_status; -+ scsi_qla_host_t *ha; -+ uint16_t next_loopid; - -- for (temp_host = mp_hosts_base; (temp_host); -- temp_host = temp_host->next) { -- for (devid = 0; devid < MAX_MP_DEVICES; devid++) { -- temp_dp = temp_host->mp_devs[devid]; -+ ENTER(__func__); -+ //printk("%s entered\n",__func__); - -- if (temp_dp == NULL) -- continue; - -- if (qla2x00_is_nodename_equal(temp_dp->nodename, -- port->node_name)) { -- DEBUG3(printk( -- "%s: Found matching dp @ host %p id %d:\n", -- __func__, temp_host, devid);) -+ if (atomic_read(&fclun->fcport->state) == FC_DEVICE_DEAD){ -+ DEBUG(printk("%s leaving: Port is marked DEAD\n",__func__);) -+ return rval; -+ } -+ -+ memset(evpd_buf, 0 ,wwlun_size); -+ ha = host->ha; -+ pkt = pci_alloc_consistent(ha->pdev, -+ sizeof(evpd_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 rval; -+ } -+ -+ retry = 2; -+ do { -+ memset(pkt, 0, sizeof(evpd_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(fclun->lun); -+#if defined(EXTENDED_IDS) -+ pkt->p.cmd.target = cpu_to_le16(fclun->fcport->loop_id); -+#else -+ pkt->p.cmd.target = (uint8_t)fclun->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[1] = INQ_EVPD_SET; -+ pkt->p.cmd.scsi_cdb[2] = INQ_DEV_IDEN_PAGE; -+ pkt->p.cmd.scsi_cdb[4] = VITAL_PRODUCT_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(VITAL_PRODUCT_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(VITAL_PRODUCT_DATA_SIZE); -+ -+ -+ rval = qla2x00_issue_iocb(ha, pkt, -+ phys_address, sizeof(evpd_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("%s: lun (%d) inquiry page 0x83- " -+ " comp status 0x%x, " -+ "scsi status 0x%x, rval=%d\n",__func__, -+ fclun->lun, comp_status, scsi_status, rval);) -+ -+ /* if port not logged in then try and login */ -+ if (fclun->lun == 0 && comp_status == CS_PORT_LOGGED_OUT && -+ atomic_read(&fclun->fcport->state) != FC_DEVICE_DEAD) { -+ if (fclun->fcport->flags & FC_FABRIC_DEVICE) { -+ /* login and update database */ -+ next_loopid = 0; -+ qla2x00_fabric_login(ha, fclun->fcport, -+ &next_loopid); -+ } else { -+ /* Loop device gone but no LIP... */ -+ rval = QL_STATUS_ERROR; - break; - } - } -- if (temp_dp != NULL) { -- /* found a match. */ -- break; -+ } while ((rval != QLA2X00_SUCCESS || -+ comp_status != CS_COMPLETE) && -+ retry--); -+ -+ if (rval == QLA2X00_SUCCESS && -+ pkt->inq[1] == INQ_DEV_IDEN_PAGE ) { -+ -+ if( pkt->inq[7] <= WWLUN_SIZE ){ -+ memcpy(evpd_buf,&pkt->inq[8], pkt->inq[7]); -+ DEBUG(printk("%s : Lun(%d) WWLUN size %d\n",__func__, -+ fclun->lun,pkt->inq[7]);) -+ } else { -+ memcpy(evpd_buf,&pkt->inq[8], WWLUN_SIZE); -+ printk(KERN_INFO "%s : Lun(%d) WWLUN may " -+ "not be complete, Buffer too small" -+ " need: %d provided: %d\n",__func__, -+ fclun->lun,pkt->inq[7],WWLUN_SIZE); - } -- } -+ rval = pkt->inq[7] ; /* lun wwlun_size */ -+ DEBUG3(qla2x00_dump_buffer(evpd_buf, rval);) - -- if (temp_dp) { -- DEBUG3(printk("%s(%ld): update mpdev " -- "on Matching node at dp %p. " -- "dev_id %d adding new port %p-%02x" -- "%02x%02x%02x%02x%02x%02x%02x\n", -- __func__, host->ha->host_no, -- temp_dp, devid, port, -- 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]);) -+ } else { -+ if (scsi_status & SS_CHECK_CONDITION) { -+ /* -+ * ILLEGAL REQUEST - 0x05 -+ * INVALID FIELD IN CDB - 24 : 00 -+ */ -+ if(pkt->p.rsp.req_sense_data[2] == 0x05 && -+ pkt->p.rsp.req_sense_data[12] == 0x24 && -+ pkt->p.rsp.req_sense_data[13] == 0x00 ) { -+ -+ DEBUG(printk(KERN_INFO "%s Lun(%d) does not" -+ " support Inquiry Page Code-0x83\n", -+ __func__,fclun->lun);) -+ } else { -+ DEBUG(printk(KERN_INFO "%s Lun(%d) does not" -+ " support Inquiry Page Code-0x83\n", -+ __func__,fclun->lun);) -+ DEBUG(printk( KERN_INFO "Unhandled check " -+ "condition sense_data[2]=0x%x" -+ " sense_data[12]=0x%x " -+ "sense_data[13]=0x%x\n", -+ pkt->p.rsp.req_sense_data[2], -+ pkt->p.rsp.req_sense_data[12], -+ pkt->p.rsp.req_sense_data[13]);) -+ } - -- qla2x00_add_portname_to_mp_dev(temp_dp, -- port->port_name); -+ } else { -+ /* Unable to issue Inquiry Page 0x83 */ -+ DEBUG2(printk(KERN_INFO -+ "%s Failed to issue Inquiry Page 0x83 -- lun (%d) " -+ "cs=0x%x ss=0x%x, rval=%d\n", -+ __func__, fclun->lun, comp_status, scsi_status, -+ rval);) -+ } -+ rval = 0 ; -+ } - -- /* -- * Set the flag that we have -- * found the device. -- */ -- host->mp_devs[devid] = temp_dp; -- temp_dp->use_cnt++; -+ pci_free_consistent(ha->pdev, sizeof(evpd_inq_cmd_rsp_t), -+ pkt, phys_address); - -- /* Fixme(dg) -- * Copy the LUN info into -- * the mp_device_t -- */ -- } -+ //printk("%s exit\n",__func__); -+ LEAVE(__func__); - -- return (temp_dp); -+ return rval; - } - - /* -- * 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. -+ * qla2x00_find_matching_lunid -+ * Find the lun in the lun list that matches the -+ * specified wwu lun number. - * -- * Returns: -- * Pointer to new mp_device_t, or NULL if the allocation fails. -+ * Input: -+ * buf = buffer that contains the wwuln -+ * host = host to search for lun - * -- * Side Effects: -- * If the MP HOST does not already point to the mp_device_t, -- * a pointer is added at the proper port offset. -+ * Returns: -+ * NULL or pointer to lun - * - * Context: - * Kernel context. -+ * (dg) - */ --static mp_device_t * --qla2x00_find_or_allocate_mp_dev(mp_host_t *host, uint16_t dev_id, -- fc_port_t *port) -+static mp_lun_t * -+qla2x00_find_matching_lunid(char *buf) - { -- mp_device_t *dp = NULL; /* pointer to multi-path device */ -- BOOL node_found; /* Found matching node name. */ -- BOOL port_found; /* Found matching port name. */ -- BOOL names_valid; /* Node name and port name are not zero */ -- mp_host_t *temp_host; /* pointer to temporary host */ -+ int devid = 0; -+ mp_host_t *temp_host; /* temporary pointer */ -+ mp_device_t *temp_dp; /* temporary pointer */ -+ mp_lun_t *lun; - -- uint16_t j; -- mp_device_t *temp_dp; -+ //printk("%s: entered.\n", __func__); - -- ENTER("qla2x00_find_or_allocate_mp_dev"); -+ for (temp_host = mp_hosts_base; (temp_host); -+ temp_host = temp_host->next) { -+ for (devid = 0; devid < MAX_MP_DEVICES; devid++) { -+ temp_dp = temp_host->mp_devs[devid]; - -- DEBUG3(printk("%s(%ld): entered. host=%p, port =%p, dev_id = %d\n", -- __func__, host->ha->host_no, host, port, dev_id);) -+ if (temp_dp == NULL) -+ continue; - -- temp_dp = qla2x00_find_mp_dev_by_id(host,dev_id); -+ for( lun = temp_dp->luns; lun != NULL ; -+ lun = lun->next ) { - -- 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 (lun->siz > WWULN_SIZE ) -+ lun->siz = WWULN_SIZE; - -- if (node_found && port_found) { -- DEBUG3(printk("%s: mp dev %02x%02x%02x%02x%02x%02x" -- "%02x%02x exists on %p. dev id %d. path cnt=%d.\n", -- __func__, -- port->port_name[0], port->port_name[1], -- port->port_name[2], port->port_name[3], -+ if (memcmp(lun->wwuln, buf, lun->siz) == 0) -+ return lun; -+ } -+ } -+ } -+ return NULL; -+ -+} -+ -+#if 0 -+/* -+ * qla2x00_find_mp_dev_by_nn_and_pn -+ * 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_nn_and_pn(mp_host_t *host, -+ uint8_t *portname, uint8_t *nodename) -+{ -+ int id; -+ int idx; -+ mp_device_t *dp; -+ -+ for (id= 0; id < MAX_MP_DEVICES; id++) { -+ if ((dp = host->mp_devs[id] ) == NULL) -+ continue; -+ -+ for (idx = 0; idx < MAX_PATHS_PER_DEVICE; idx++) { -+ if (memcmp(&dp->nodenames[idx][0], nodename, WWN_SIZE) == 0 && -+ memcmp(&dp->portnames[idx][0], portname, WWN_SIZE) == 0 ) { -+ DEBUG3(printk("%s: Found matching device @ index %d:\n", -+ __func__, id);) -+ return dp; -+ } -+ } -+ } -+ -+ return NULL; -+} -+ -+/* -+ * qla2x00_is_nn_and_pn_in_device -+ * 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_is_nn_and_pn_in_device(mp_device_t *dp, -+ uint8_t *portname, uint8_t *nodename) -+{ -+ int idx; -+ -+ for (idx = 0; idx < MAX_PATHS_PER_DEVICE; idx++) { -+ if (memcmp(&dp->nodenames[idx][0], nodename, WWN_SIZE) == 0 && -+ memcmp(&dp->portnames[idx][0], portname, WWN_SIZE) == 0 ) { -+ DEBUG3(printk("%s: Found matching device @ index %d:\n", -+ __func__, id);) -+ return dp; -+ } -+ } -+ -+ return NULL; -+} -+#endif -+ -+/* -+ * qla2x00_export_target -+ * Look through the existing multipath control tree, and find -+ * an mp_lun_t with the supplied world-wide lun number. 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. -+ */ -+int -+qla2x00_export_target( void *vhost, uint16_t dev_id, -+ fc_port_t *fcport, uint16_t pathid) -+{ -+ mp_host_t *host = (mp_host_t *) vhost; -+ mp_path_t *path; -+ mp_device_t *dp = NULL; -+ BOOL names_valid; /* Node name and port name are not zero */ -+ BOOL node_found; /* Found matching node name. */ -+ BOOL port_found; /* Found matching port name. */ -+ mp_device_t *temp_dp; -+ int i; -+ uint16_t new_id = dev_id; -+ uint16_t idx; -+ -+ DEBUG3(printk("%s(%ld): Entered. host=%p, fcport =%p, dev_id = %d\n", -+ __func__, host->ha->host_no, host, fcport, dev_id)); -+ -+ temp_dp = qla2x00_find_mp_dev_by_id(host,dev_id); -+ -+ /* if Device already known at this port. */ -+ if (temp_dp != NULL) { -+ node_found = qla2x00_is_nodename_equal(temp_dp->nodename, -+ fcport->node_name); -+ port_found = qla2x00_is_portname_in_device(temp_dp, -+ fcport->port_name); -+ /* found */ -+ if (node_found && port_found) -+ dp = temp_dp; -+ -+ } -+ -+ -+ /* Sanity check the port information */ -+ names_valid = (!qla2x00_is_ww_name_zero(fcport->node_name) && -+ !qla2x00_is_ww_name_zero(fcport->port_name)); -+ -+ /* -+ * If the optimized check failed, loop through each known -+ * device on this known adapter looking for the node name. -+ */ -+ if (dp == NULL && names_valid) { -+ if( (temp_dp = qla2x00_find_mp_dev_by_portname(host, -+ fcport->port_name, &idx)) == NULL ) { -+ /* find a good index */ -+ for( i = dev_id; i < MAX_MP_DEVICES; i++ ) -+ if(host->mp_devs[i] == NULL ) { -+ new_id = i; -+ break; -+ } -+ } else if( temp_dp != NULL ) { /* found dp */ -+ if( qla2x00_is_nodename_equal(temp_dp->nodename, -+ fcport->node_name) ) { -+ new_id = temp_dp->dev_id; -+ dp = temp_dp; -+ } -+ } -+ } -+ -+ /* If we couldn't find one, allocate one. */ -+ if (dp == NULL && -+ ((fcport->flags & FC_CONFIG) || !mp_config_required)) { -+ -+ DEBUG2(printk("%s(%d): No match for WWPN. Creating new mpdev \n" -+ "node %02x%02x%02x%02x%02x%02x%02x%02x " -+ "port %02x%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->instance, -+ fcport->node_name[0], fcport->node_name[1], -+ fcport->node_name[2], fcport->node_name[3], -+ fcport->node_name[4], fcport->node_name[5], -+ fcport->node_name[6], fcport->node_name[7], -+ 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]);) -+ dp = qla2x00_allocate_mp_dev(fcport->node_name, -+ fcport->port_name); -+ -+ DEBUG2(printk("%s(%ld): (2) mp_dev[%d] update" -+ " with dp %p\n ", -+ __func__, host->ha->host_no, new_id, dp);) -+ host->mp_devs[new_id] = dp; -+ dp->dev_id = new_id; -+ dp->use_cnt++; -+ } -+ -+ /* -+ * 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) { -+ /* We did not create a mp_dev for this port. */ -+ fcport->mp_byte |= MP_MASK_UNCONFIGURED; -+ DEBUG2(printk("%s: Device NOT found or created at " -+ " dev_id=%d.\n", -+ __func__, dev_id);) -+ return FALSE; -+ } -+ -+ path = qla2x00_find_or_allocate_path(host, dp, dev_id, -+ pathid, fcport); -+ if (path == NULL) { -+ DEBUG2(printk("%s:Path NOT found or created.\n", -+ __func__);) -+ return FALSE; -+ } -+ -+ return TRUE; -+} -+ -+ -+/* -+ * qla2x00_combine_by_lunid -+ * Look through the existing multipath control tree, and find -+ * an mp_lun_t with the supplied world-wide lun number. 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. -+ */ -+int -+qla2x00_combine_by_lunid( void *vhost, uint16_t dev_id, -+ fc_port_t *fcport, uint16_t pathid) -+{ -+ mp_host_t *host = (mp_host_t *) vhost; -+ int fail = 0; -+ mp_path_t *path; -+ mp_device_t *dp = NULL; -+ fc_lun_t *fclun; -+ mp_lun_t *lun; -+ BOOL names_valid; /* Node name and port name are not zero */ -+ mp_host_t *temp_host; /* pointer to temporary host */ -+ mp_device_t *temp_dp; -+ mp_port_t *port; -+ int l; -+ -+ ENTER("qla2x00_combine_by_lunid"); -+ //printk("Entering %s\n", __func__); -+ -+ /* -+ * Currently, not use because we create common nodename for -+ * the gui, so we can use the normal common namename processing. -+ */ -+ if (fcport->flags & FC_CONFIG) { -+ /* Search for device if not found create one */ -+ -+ temp_dp = qla2x00_find_mp_dev_by_id(host,dev_id); -+ -+ /* if Device already known at this port. */ -+ if (temp_dp != NULL) { -+ DEBUG(printk("%s: Found an existing " -+ "dp %p- host %p inst=%d, fcport =%p, path id = %d\n", -+ __func__, temp_dp, host, host->instance, fcport, -+ pathid);) -+ if( qla2x00_is_portname_in_device(temp_dp, -+ fcport->port_name) ) { -+ -+ DEBUG2(printk("%s: mp dev %02x%02x%02x%02x%02x%02x" -+ "%02x%02x exists on %p. dev id %d. path cnt=%d.\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], -+ temp_dp, dev_id, temp_dp->path_list->path_cnt);) -+ dp = temp_dp; -+ } -+ -+ } -+ -+ /* -+ * If the optimized check failed, loop through each known -+ * device on each known adapter looking for the node name -+ * and port name. -+ */ -+ if (dp == NULL) { -+ /* -+ * Loop through each potential adapter for the -+ * specified target (dev_id). If a device is -+ * found then add this port or use it. -+ */ -+ for (temp_host = mp_hosts_base; (temp_host); -+ temp_host = temp_host->next) { -+ /* user specifies the target via dev_id */ -+ temp_dp = temp_host->mp_devs[dev_id]; -+ if (temp_dp == NULL) { -+ continue; -+ } -+ if( qla2x00_is_portname_in_device(temp_dp, -+ fcport->port_name) ) { -+ dp = temp_dp; -+ } else { -+ qla2x00_add_portname_to_mp_dev( -+ temp_dp, fcport->port_name, -+ fcport->node_name); -+ dp = temp_dp; -+ host->mp_devs[dev_id] = dp; -+ dp->use_cnt++; -+ } -+ break; -+ } -+ } -+ -+ /* Sanity check the port information */ -+ names_valid = (!qla2x00_is_ww_name_zero(fcport->node_name) && -+ !qla2x00_is_ww_name_zero(fcport->port_name)); -+ -+ if (dp == NULL && names_valid && -+ ((fcport->flags & FC_CONFIG) || !mp_config_required) ) { -+ -+ DEBUG2(printk("%s(%ld): No match. adding new mpdev on " -+ "dev_id %d. node %02x%02x%02x%02x%02x%02x%02x%02x " -+ "port %02x%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->ha->host_no, dev_id, -+ fcport->node_name[0], fcport->node_name[1], -+ fcport->node_name[2], fcport->node_name[3], -+ fcport->node_name[4], fcport->node_name[5], -+ fcport->node_name[6], fcport->node_name[7], -+ 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]);) -+ dp = qla2x00_allocate_mp_dev(fcport->node_name, -+ fcport->port_name); -+ -+ host->mp_devs[dev_id] = dp; -+ dp->dev_id = dev_id; -+ dp->use_cnt++; -+ } -+ -+ /* -+ * 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) { -+ /* We did not create a mp_dev for this port. */ -+ fcport->mp_byte |= MP_MASK_UNCONFIGURED; -+ DEBUG2(printk("%s: Device NOT found or created at " -+ " dev_id=%d.\n", -+ __func__, dev_id);) -+ 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, -+ pathid, fcport); -+ if (path == NULL) { -+ DEBUG2(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. -+ */ -+ path->config = TRUE; -+ -+ -+ } else { -+ if (mp_initialized && -+ (fcport->flags & FC_MSA_DEVICE) ){ -+ qla2x00_test_active_port(fcport); -+ } -+ list_for_each_entry(fclun, &fcport->fcluns, list) { -+ lun = qla2x00_find_or_allocate_lun(host, dev_id, -+ fcport, fclun); -+ if( lun == NULL ) { -+ fail++; -+ continue; -+ } -+ /* -+ * Find the path in the current path list, or allocate -+ * a new one and put it in the list if it doesn't exist. -+ */ -+ dp = lun->dp; -+ if( fclun->mplun == NULL ) -+ fclun->mplun = lun; -+ path = qla2x00_find_or_allocate_path(host, dp, -+ dp->dev_id, pathid, fcport); -+ if (path == NULL || dp == NULL) { -+ fail++; -+ continue; -+ } -+ -+ /* set the lun active flag */ -+ if (mp_initialized && -+ (fcport->flags & FC_EVA_DEVICE) ) { -+ qla2x00_test_active_lun( -+ path->port, fclun ); -+ } -+ -+ /* Add fclun to path list */ -+ if (lun->paths[path->id] == NULL) { -+ lun->paths[path->id] = fclun; -+ DEBUG2(printk("Updated path[%d]= %p for lun %p\n", -+ path->id, fclun, lun);) -+ lun->path_cnt++; -+ } -+ -+ /* -+ * if we have a visible lun then make -+ * the target visible as well -+ */ -+ l = lun->number; -+ if( (fclun->flags & FC_VISIBLE_LUN) ) { -+ if (dp->path_list->visible == -+ PATH_INDEX_INVALID) { -+ dp->path_list->visible = path->id; -+ DEBUG2(printk("%s: dp %p setting " -+ "visible id to %d\n", -+ __func__,dp,path->id );) -+ } -+ dp->path_list->current_path[l] = path->id; -+ path->lun_data.data[l] |= LUN_DATA_PREFERRED_PATH; -+ DEBUG2(printk("%s: Found a controller path 0x%x " -+ "- lun %d\n", __func__, path->id,l);) -+ } else if (mp_initialized) { -+ /* -+ * Whenever a port or lun is "active" -+ * then force it to be a preferred path. -+ */ -+ if (qla2x00_find_first_active_path(dp, lun) -+ == path ){ -+ dp->path_list->current_path[l] = -+ path->id; -+ path->lun_data.data[l] |= -+ LUN_DATA_PREFERRED_PATH; -+ DEBUG2(printk( -+ "%s: Found preferred lun at loopid=0x%02x, lun=%d, pathid=%d\n", -+ __func__, fcport->loop_id, l, path->id);) -+ } -+ } -+ -+ /* if (port->flags & FC_CONFIG) -+ path->config = TRUE; */ -+ -+ port = qla2x00_find_or_allocate_port(host, lun, path); -+ if (port == NULL) { -+ fail++; -+ continue; -+ } -+ } -+ } -+ -+ if (fail) -+ return FALSE; -+ return TRUE; -+} -+ -+#if 0 -+/* -+ * 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 */ -+ BOOL node_found; /* Found matching node name. */ -+ BOOL port_found; /* Found matching port name. */ -+ BOOL 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(%ld): entered. host=%p, port =%p, dev_id = %d\n", -+ __func__, host->ha->host_no, 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: mp dev %02x%02x%02x%02x%02x%02x" -+ "%02x%02x exists on %p. dev id %d. path cnt=%d.\n", -+ __func__, -+ 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], -+ temp_dp, dev_id, temp_dp->path_list->path_cnt);) -+ 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__);) -+ -+ /* Check for special cases. */ -+ if (port->flags & FC_CONFIG) { -+ /* Here the search is done only for ports that -+ * are found in config file, so we can count on -+ * mp_byte value when binding the paths. -+ */ -+ DEBUG3(printk("%s(%ld): mpbyte=%02x process configured " -+ "portname=%02x%02x%02x%02x%02x%02x%02x%02x.\n", -+ __func__, host->ha->host_no, port->mp_byte, -+ 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(printk("%s(%ld): nodename %02x%02x%02x%02x%02x" -+ "%02x%02x%02x.\n", -+ __func__, host->ha->host_no, -+ port->node_name[0], port->node_name[1], -+ port->node_name[2], port->node_name[3], -+ port->node_name[4], port->node_name[5], -+ port->node_name[6], port->node_name[7]);) -+ -+ if (port->mp_byte == 0) { -+ DEBUG3(printk("%s(%ld): port visible.\n", -+ __func__, host->ha->host_no);) -+ -+ /* This device in conf file is set to visible */ -+ for (temp_host = mp_hosts_base; (temp_host); -+ temp_host = temp_host->next) { -+ /* Search all hosts with given tgt id -+ * for any previously created dp with -+ * matching node name. -+ */ -+ temp_dp = temp_host->mp_devs[dev_id]; -+ if (temp_dp == NULL) { -+ continue; -+ } -+ -+ node_found = -+ qla2x00_is_nodename_equal( -+ temp_dp->nodename, port->node_name); -+ -+ if (node_found && -+ qla2x00_found_hidden_path( -+ temp_dp)) { -+ DEBUG3(printk( -+ "%s(%ld): found " -+ "mpdev of matching " -+ "node %02x%02x%02x" -+ "%02x%02x%02x%02x" -+ "%02x w/ hidden " -+ "paths. dp=%p " -+ "dev_id=%d.\n", -+ __func__, -+ host->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], -+ temp_dp, dev_id);) -+ /* -+ * Found the mpdev. -+ * Treat this same as default -+ * case by adding this port -+ * to this mpdev which has same -+ * nodename. -+ */ -+ qla2x00_add_portname_to_mp_dev( -+ temp_dp, port->port_name, port->node_name); -+ dp = temp_dp; -+ host->mp_devs[dev_id] = dp; -+ dp->use_cnt++; -+ -+ break; -+ } -+ } -+ -+ } else if (port->mp_byte & MP_MASK_OVERRIDE) { -+ /* Bind on port name */ -+ DEBUG3(printk( -+ "%s(%ld): port has override bit.\n", -+ __func__, host->ha->host_no);) -+ -+ temp_dp = qla2x00_find_dp_by_pn_from_all_hosts( -+ port->port_name, &j); -+ -+ if (temp_dp) { -+ /* Found match */ -+ DEBUG3(printk("%s(%ld): update mpdev " -+ "on Matching port %02x%02x%02x" -+ "%02x%02x%02x%02x%02x " -+ "dp %p dev_id %d\n", -+ __func__, host->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], -+ temp_dp, j);) -+ /* -+ * Bind this port to this mpdev of the -+ * matching port name. -+ */ -+ dp = temp_dp; -+ host->mp_devs[j] = dp; -+ dp->use_cnt++; -+ } -+ } else { -+ DEBUG3(printk("%s(%ld): default case.\n", -+ __func__, host->ha->host_no);) -+ /* Default case. Search and bind/add this -+ * port to the mp_dev with matching node name -+ * if it is found. -+ */ -+ dp = qla2x00_default_bind_mpdev(host, port); -+ } -+ -+ } else { -+ DEBUG3(printk("%s(%ld): process discovered port " -+ "%02x%02x%02x%02x%02x%02x%02x%02x.\n", -+ __func__, host->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(printk("%s(%ld): nodename %02x%02x%02x%02x%02x" -+ "%02x%02x%02x.\n", -+ __func__, host->ha->host_no, -+ port->node_name[0], port->node_name[1], -+ port->node_name[2], port->node_name[3], -+ port->node_name[4], port->node_name[5], -+ port->node_name[6], port->node_name[7]);) -+ -+ /* Here we try to find the mp_dev pointer for the -+ * current port in the current host, which would -+ * have been created if the port was specified in -+ * the config file. To be sure the mp_dev we found -+ * really is for the current port, we check the -+ * node name to make sure it matches also. -+ * When we find a previously created mp_dev pointer -+ * for the current port, just return the pointer. -+ * We proceed to add this port to an mp_dev of -+ * the matching node name only if it is not found in -+ * the mp_dev list already created and ConfigRequired -+ * is not set. -+ */ -+ temp_dp = qla2x00_find_mp_dev_by_portname(host, -+ port->port_name, &j); -+ -+ if (temp_dp && qla2x00_is_nodename_equal( -+ temp_dp->nodename, port->node_name)) { -+ /* Found match. This mpdev port was created -+ * from config file entry. -+ */ -+ DEBUG3(printk("%s(%ld): update mpdev " -+ "on Matching port %02x%02x%02x" -+ "%02x%02x%02x%02x%02x " -+ "dp %p dev_id %d\n", -+ __func__, host->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], -+ temp_dp, j);) -+ -+ dp = temp_dp; -+ } else if (!mp_config_required) { -+ -+ DEBUG3(printk("%s(%ld): default case.\n", -+ __func__, host->ha->host_no);) -+ /* Default case. Search and bind/add this -+ * port to the mp_dev with matching node name -+ * if it is found. -+ */ -+ dp = qla2x00_default_bind_mpdev(host, port); -+ } -+ } -+ } -+ -+ /* If we couldn't find one, allocate one. */ -+ if (dp == NULL && -+ ((port->flags & FC_CONFIG) || !mp_config_required)) { -+ -+ DEBUG3(printk("%s(%ld): No match. adding new mpdev on " -+ "dev_id %d. node %02x%02x%02x%02x%02x%02x%02x%02x " -+ "port %02x%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->ha->host_no, dev_id, -+ port->node_name[0], port->node_name[1], -+ port->node_name[2], port->node_name[3], -+ port->node_name[4], port->node_name[5], -+ port->node_name[6], port->node_name[7], -+ 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]);) -+ dp = qla2x00_allocate_mp_dev(port->node_name, port->port_name); -+ -+#ifdef QL_DEBUG_LEVEL_2 -+ if (host->mp_devs[dev_id] != NULL) { -+ printk(KERN_WARNING -+ "qla2x00: invalid/unsupported configuration found. " -+ "overwriting target id %d.\n", -+ dev_id); -+ } -+#endif -+ host->mp_devs[dev_id] = dp; -+ dp->dev_id = dev_id; -+ dp->use_cnt++; -+ } -+ -+ DEBUG3(printk("%s(%ld): exiting. return dp=%p.\n", -+ __func__, host->ha->host_no, dp);) -+ LEAVE("qla2x00_find_or_allocate_mp_dev"); -+ -+ return dp; -+} -+#endif -+ -+/* -+ * qla2x00_default_bind_mpdev -+ * -+ * Input: -+ * host = mp_host of current adapter -+ * port = fc_port of current port -+ * -+ * Returns: -+ * mp_device pointer -+ * NULL - not found. -+ * -+ * Context: -+ * Kernel context. -+ */ -+static inline mp_device_t * -+qla2x00_default_bind_mpdev(mp_host_t *host, fc_port_t *port) -+{ -+ /* Default search case */ -+ int devid = 0; -+ mp_device_t *temp_dp = NULL; /* temporary pointer */ -+ mp_host_t *temp_host; /* temporary pointer */ -+ -+ DEBUG3(printk("%s: entered.\n", __func__);) -+ -+ for (temp_host = mp_hosts_base; (temp_host); -+ temp_host = temp_host->next) { -+ for (devid = 0; devid < MAX_MP_DEVICES; devid++) { -+ temp_dp = temp_host->mp_devs[devid]; -+ -+ if (temp_dp == NULL) -+ continue; -+ -+ if (qla2x00_is_nodename_equal(temp_dp->nodename, -+ port->node_name)) { -+ DEBUG3(printk( -+ "%s: Found matching dp @ host %p id %d:\n", -+ __func__, temp_host, devid);) -+ break; -+ } -+ } -+ if (temp_dp != NULL) { -+ /* found a match. */ -+ break; -+ } -+ } -+ -+ if (temp_dp) { -+ DEBUG3(printk("%s(%ld): update mpdev " -+ "on Matching node at dp %p. " -+ "dev_id %d adding new port %p-%02x" -+ "%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->ha->host_no, -+ temp_dp, devid, port, -+ 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]);) -+ -+ if (!qla2x00_is_portname_in_device(temp_dp, -+ port->port_name)) { -+ qla2x00_add_portname_to_mp_dev(temp_dp, -+ port->port_name, port->node_name); -+ } -+ -+ /* -+ * Set the flag that we have -+ * found the device. -+ */ -+ host->mp_devs[devid] = temp_dp; -+ temp_dp->use_cnt++; -+ -+ /* Fixme(dg) -+ * Copy the LUN info into -+ * the mp_device_t -+ */ -+ } -+ -+ return (temp_dp); -+} -+ -+/* -+ * 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 */ -+ BOOL node_found; /* Found matching node name. */ -+ BOOL port_found; /* Found matching port name. */ -+ BOOL 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(%ld): entered. host=%p, port =%p, dev_id = %d\n", -+ __func__, host->ha->host_no, 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: mp dev %02x%02x%02x%02x%02x%02x" -+ "%02x%02x exists on %p. dev id %d. path cnt=%d.\n", -+ __func__, -+ 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], - temp_dp, dev_id, temp_dp->path_list->path_cnt);) -@@ -1448,7 +2810,6 @@ qla2x00_find_or_allocate_mp_dev(mp_host_ - } - } - -- - /* Sanity check the port information */ - names_valid = (!qla2x00_is_ww_name_zero(port->node_name) && - !qla2x00_is_ww_name_zero(port->port_name)); -@@ -1526,11 +2887,17 @@ qla2x00_find_or_allocate_mp_dev(mp_host_ - temp_dp, dev_id);) - /* - * Found the mpdev. -- * Treat this same as -- * default case. -+ * Treat this same as default -+ * case by adding this port -+ * to this mpdev which has same -+ * nodename. - */ -+ if (!qla2x00_is_portname_in_device( -+ temp_dp, port->port_name)) { - qla2x00_add_portname_to_mp_dev( -- temp_dp, port->port_name); -+ temp_dp, port->port_name, port->node_name); -+ } -+ - dp = temp_dp; - host->mp_devs[dev_id] = dp; - dp->use_cnt++; -@@ -1565,8 +2932,8 @@ qla2x00_find_or_allocate_mp_dev(mp_host_ - port->port_name[7], - temp_dp, j);) - /* -- * Set the flag that we have -- * found the device. -+ * Bind this port to this mpdev of the -+ * matching port name. - */ - dp = temp_dp; - host->mp_devs[j] = dp; -@@ -1575,8 +2942,9 @@ qla2x00_find_or_allocate_mp_dev(mp_host_ - } else { - DEBUG3(printk("%s(%ld): default case.\n", - __func__, host->ha->host_no);) -- /* Default case. Search and bind mp_dev with -- * matching node name. -+ /* Default case. Search and bind/add this -+ * port to the mp_dev with matching node name -+ * if it is found. - */ - dp = qla2x00_default_bind_mpdev(host, port); - } -@@ -1597,22 +2965,29 @@ qla2x00_find_or_allocate_mp_dev(mp_host_ - port->node_name[4], port->node_name[5], - port->node_name[6], port->node_name[7]);) - -- /* Here we try to match ports found to any previously -- * built mp_dev list. mp_byte value is not valid yet. -- * First search for matching port name in current -- * host. This is necessary in case the port name was -- * specified in the config file with the override -- * bit and saved in our mpdev tree already. -+ /* Here we try to find the mp_dev pointer for the -+ * current port in the current host, which would -+ * have been created if the port was specified in -+ * the config file. To be sure the mp_dev we found -+ * really is for the current port, we check the -+ * node name to make sure it matches also. -+ * When we find a previously created mp_dev pointer -+ * for the current port, just return the pointer. -+ * We proceed to add this port to an mp_dev of -+ * the matching node name only if it is not found in -+ * the mp_dev list already created and ConfigRequired -+ * is not set. - */ - temp_dp = qla2x00_find_mp_dev_by_portname(host, - port->port_name, &j); - -- if (temp_dp) { -+ if (temp_dp && qla2x00_is_nodename_equal( -+ temp_dp->nodename, port->node_name)) { - /* Found match. This mpdev port was created -- * from config file. -+ * from config file entry. - */ -- DEBUG3(printk("%s(%ld): update mpdev " -- "on Matching port %02x%02x%02x" -+ DEBUG3(printk("%s(%ld): found mpdev " -+ "created for current port %02x%02x%02x" - "%02x%02x%02x%02x%02x " - "dp %p dev_id %d\n", - __func__, host->ha->host_no, -@@ -1631,8 +3006,9 @@ qla2x00_find_or_allocate_mp_dev(mp_host_ - - DEBUG3(printk("%s(%ld): default case.\n", - __func__, host->ha->host_no);) -- /* Default case. Search and bind mp_dev with -- * matching node name. -+ /* Default case. Search and bind/add this -+ * port to the mp_dev with matching node name -+ * if it is found. - */ - dp = qla2x00_default_bind_mpdev(host, port); - } -@@ -1678,6 +3054,7 @@ qla2x00_find_or_allocate_mp_dev(mp_host_ - } - - -+ - /* - * qla2x00_find_or_allocate_path - * Look through the path list for the supplied device, and either -@@ -1796,21 +3173,32 @@ qla2x00_find_or_allocate_path(mp_host_t - - /* Update port with bitmask info */ - path = qla2x00_allocate_path(host, id, port, dev_id); -- DEBUG3(printk("%s: allocated new path %p, adding " -- "path id %d, mp_byte=0x%x " -- "port=%p-%02x%02x%02x%02x%02x%02x%02x%02x\n", -- __func__, path, id, -- path->mp_byte, -- path->port, -- 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] -- );) -- qla2x00_add_path(path_list, path); -+ if (path) { -+#if defined(QL_DEBUG_LEVEL_3) -+ printk("%s: allocated new path %p, adding path " -+ "id %d, mp_byte=0x%x\n", __func__, path, id, -+ path->mp_byte); -+ if (path->port) -+ printk( "port=%p-" -+ "%02x%02x%02x%02x%02x%02x%02x%02x\n" -+ , path->port, -+ 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]); -+#endif -+ qla2x00_add_path(path_list, path); - -- /* Reconcile the new path against the existing ones. */ -- qla2x00_setup_new_path(dp, path); -+ /* -+ * Reconcile the new path against the -+ * existing ones. -+ */ -+ qla2x00_setup_new_path(dp, path, port); -+ } - } else { - /* EMPTY */ - DEBUG4(printk("%s: Err exit, no space to add path.\n", -@@ -1824,6 +3212,264 @@ qla2x00_find_or_allocate_path(mp_host_t - return path; - } - -+/* -+ * qla2x00_find_or_allocate_lun -+ * Look through the existing multipath control tree, and find -+ * an mp_lun_t with the supplied world-wide lun number. If -+ * one cannot be found, allocate one. -+ * -+ * Input: -+ * host Adapter (lun) for the device. -+ * fclun Lun data from port database. -+ * -+ * Returns: -+ * Pointer to new LUN, or NULL if the allocation fails. -+ * -+ * Side Effects: -+ * 1. If the LUN_LIST does not already point to the LUN, -+ * a new LUN is added to the LUN_LIST. -+ * 2. If the DEVICE_LIST does not already point to the DEVICE, -+ * a new DEVICE is added to the DEVICE_LIST. -+ * -+ * Context: -+ * Kernel context. -+ */ -+/* ARGSUSED */ -+static mp_lun_t * -+qla2x00_find_or_allocate_lun(mp_host_t *host, uint16_t dev_id, -+ fc_port_t *port, fc_lun_t *fclun) -+{ -+ mp_lun_t *lun = NULL; -+ mp_device_t *dp = NULL; -+#if 0 -+ mp_device_t *temp_dp = NULL; -+#endif -+ uint16_t len; -+ uint16_t idx; -+ uint16_t new_id = dev_id; -+ char wwulnbuf[WWULN_SIZE]; -+ int new_dev = 0; -+ int i; -+ -+ -+ ENTER("qla2x00_find_or_allocate_lun"); -+ DEBUG(printk("Entering %s\n", __func__);) -+ -+ if( fclun == NULL ) -+ return NULL; -+ -+ DEBUG2(printk("%s: " -+ " lun num=%d fclun %p mplun %p hba inst=%d, port =%p, dev id = %d\n", -+ __func__, fclun->lun, fclun, fclun->mplun, host->instance, port, -+ dev_id);) -+ /* -+ * Perform inquiry page 83 to get the wwuln or -+ * use what was specified by the user. -+ */ -+ if ( (port->flags & FC_CONFIG) ) { -+ if( (len = fclun->mplen) != 0 ) -+ memcpy(wwulnbuf, fclun->mpbuf, len); -+ } else { -+ len = qla2x00_get_wwuln_from_device(host, fclun, -+ &wwulnbuf[0], WWULN_SIZE); -+ /* if fail to do the inq then exit */ -+ if( len == 0 ) { -+ return lun; -+ } -+ } -+ -+ if( len != 0 ) -+ lun = qla2x00_find_matching_lunid(wwulnbuf); -+ -+ /* -+ * If this is a visible "controller" lun and -+ * it is already exists on somewhere world wide -+ * then allocate a new device, so it can be -+ * exported it to the OS. -+ */ -+ if( (fclun->flags & FC_VISIBLE_LUN) && -+ lun != NULL ) { -+ if( fclun->mplun == NULL ) { -+ lun = NULL; -+ new_dev++; -+ DEBUG2(printk("%s: Creating visible lun " -+ "lun %p num %d fclun %p mplun %p inst=%d, port =%p, dev id = %d\n", -+ __func__, lun, fclun->lun, fclun, fclun->mplun, host->instance, port, -+ dev_id);) -+ } else { -+ lun = fclun->mplun; -+ return lun; -+ } -+ } -+ -+ if (lun != NULL ) { -+ DEBUG(printk("%s: Found an existing " -+ "lun %p num %d fclun %p host %p inst=%d, port =%p, dev id = %d\n", -+ __func__, lun, fclun->lun, fclun, host, host->instance, port, -+ dev_id);) -+ if( (dp = lun->dp ) == NULL ) { -+ printk("NO dp pointer in alloacted lun\n"); -+ return NULL; -+ } -+ DEBUG(printk("%s(%ld): lookup portname for lun->dp = " -+ "dev_id %d. dp=%p node %02x%02x%02x%02x%02x%02x%02x%02x " -+ "port %02x%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->ha->host_no, dp->dev_id, dp, -+ port->node_name[0], port->node_name[1], -+ port->node_name[2], port->node_name[3], -+ port->node_name[4], port->node_name[5], -+ port->node_name[6], port->node_name[7], -+ 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]);) -+ -+#if 1 -+ if( qla2x00_is_portname_in_device(dp, -+ port->port_name) ) { -+ -+ DEBUG(printk("%s: Found portname %02x%02x%02x%02x%02x%02x" -+ "%02x%02x match in mp_dev[%d] = %p\n", -+ __func__, -+ 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], -+ dp->dev_id, dp);) -+ if(host->mp_devs[dp->dev_id] == NULL ) { -+ host->mp_devs[dp->dev_id] = dp; -+ dp->use_cnt++; -+ } -+ } else { -+ DEBUG(printk("%s(%ld): MP_DEV no-match on portname. adding new port - " -+ "dev_id %d. node %02x%02x%02x%02x%02x%02x%02x%02x " -+ "port %02x%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->ha->host_no, dev_id, -+ port->node_name[0], port->node_name[1], -+ port->node_name[2], port->node_name[3], -+ port->node_name[4], port->node_name[5], -+ port->node_name[6], port->node_name[7], -+ 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]);) -+ -+ qla2x00_add_portname_to_mp_dev(dp, -+ port->port_name, port->node_name); -+ -+ DEBUG2(printk("%s(%ld): (1) Added portname and mp_dev[%d] update" -+ " with dp %p\n ", -+ __func__, host->ha->host_no, dp->dev_id, dp);) -+ if(host->mp_devs[dp->dev_id] == NULL ) { -+ host->mp_devs[dp->dev_id] = dp; -+ dp->use_cnt++; -+ } -+ } -+#else -+ if( (temp_dp = qla2x00_find_mp_dev_by_portname(host, -+ port->port_name, &idx)) == NULL ) { -+ DEBUG(printk("%s(%ld): MP_DEV no-match on portname. adding new port on " -+ "dev_id %d. node %02x%02x%02x%02x%02x%02x%02x%02x " -+ "port %02x%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->ha->host_no, dev_id, -+ port->node_name[0], port->node_name[1], -+ port->node_name[2], port->node_name[3], -+ port->node_name[4], port->node_name[5], -+ port->node_name[6], port->node_name[7], -+ 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]);) -+ -+ qla2x00_add_portname_to_mp_dev(dp, -+ port->port_name, port->node_name); -+ -+ DEBUG(printk("%s(%ld): (1) Added portname and mp_dev[%d] update" -+ " with dp %p\n ", -+ __func__, host->ha->host_no, dp->dev_id, dp);) -+ if(host->mp_devs[dp->dev_id] == NULL ) { -+ host->mp_devs[dp->dev_id] = dp; -+ dp->use_cnt++; -+ } -+ } else if( dp == temp_dp ){ -+ DEBUG3(printk("%s(%ld): MP_DEV %p match with portname @ " -+ " mp_dev[%d]. " -+ "port %02x%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->ha->host_no, temp_dp, idx, -+ 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]);) -+ -+ host->mp_devs[idx] = temp_dp; -+ dp->use_cnt++; -+ } -+#endif -+ } else { -+ DEBUG(printk("%s: MP_lun %d not found " -+ "for fclun %p inst=%d, port =%p, dev id = %d\n", -+ __func__, fclun->lun, fclun, host->instance, port, -+ dev_id);) -+ -+ if( (dp = qla2x00_find_mp_dev_by_portname(host, -+ port->port_name, &idx)) == NULL || new_dev ) { -+ DEBUG2(printk("%s(%ld): No match for WWPN. Creating new mpdev \n" -+ "node %02x%02x%02x%02x%02x%02x%02x%02x " -+ "port %02x%02x%02x%02x%02x%02x%02x%02x\n", -+ __func__, host->ha->host_no, -+ port->node_name[0], port->node_name[1], -+ port->node_name[2], port->node_name[3], -+ port->node_name[4], port->node_name[5], -+ port->node_name[6], port->node_name[7], -+ 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]);) -+ dp = qla2x00_allocate_mp_dev(port->node_name, -+ port->port_name); -+ /* find a good index */ -+ for( i = dev_id; i < MAX_MP_DEVICES; i++ ) -+ if(host->mp_devs[i] == NULL ) { -+ new_id = i; -+ break; -+ } -+ } else if( dp != NULL ) { /* found dp */ -+ new_id = dp->dev_id; -+ } -+ -+ if( dp != NULL ) { -+ DEBUG2(printk("%s(%ld): (2) mp_dev[%d] update" -+ " with dp %p\n ", -+ __func__, host->ha->host_no, new_id, dp);) -+ host->mp_devs[new_id] = dp; -+ dp->dev_id = new_id; -+ dp->use_cnt++; -+ -+ lun = (mp_lun_t *) KMEM_ZALLOC(sizeof(mp_lun_t), 24); -+ if (lun != NULL) { -+ DEBUG(printk("Added lun %p to dp %p lun number %d\n", -+ lun, dp, fclun->lun);) -+ DEBUG(qla2x00_dump_buffer(wwulnbuf, len);) -+ memcpy(lun->wwuln, wwulnbuf, len); -+ lun->siz = len; -+ lun->number = fclun->lun; -+ lun->dp = dp; -+ qla2x00_add_lun(dp, lun); -+ INIT_LIST_HEAD(&lun->ports_list); -+ } -+ } -+ else -+ printk(KERN_WARNING -+ "qla2x00: Couldn't get memory for dp. \n"); -+ } -+ -+ DEBUG(printk("Exiting %s\n", __func__);) -+ LEAVE("qla2x00_find_or_allocate_lun"); -+ -+ return lun; -+} -+ -+ - static uint32_t - qla2x00_cfg_register_failover_lun(mp_device_t *dp, srb_t *sp, fc_lun_t *new_lp) - { -@@ -1832,7 +3478,7 @@ qla2x00_cfg_register_failover_lun(mp_dev - os_lun_t *lq; - fc_lun_t *old_lp; - -- DEBUG2(printk(KERN_INFO "%s: NEW fclun = %p, sp = %p\n", -+ DEBUG(printk(KERN_INFO "%s: NEW fclun = %p, sp = %p\n", - __func__, new_lp, sp);) - - /* -@@ -1919,8 +3565,16 @@ qla2x00_send_failover_notify(mp_device_t - - ENTER("qla2x00_send_failover_notify"); - -- old_lp = qla2x00_find_matching_lun(lun, oldpath); -- new_lp = qla2x00_find_matching_lun(lun, newpath); -+ if( (old_lp = qla2x00_find_matching_lun(lun, dp, oldpath)) == NULL ) { -+ DEBUG2(printk(KERN_INFO "%s: Failed to get old lun %p, %d\n", -+ __func__, old_lp,lun);) -+ return QLA2X00_FUNCTION_FAILED; -+ } -+ if( (new_lp = qla2x00_find_matching_lun(lun, dp, newpath)) == NULL ) { -+ DEBUG2(printk(KERN_INFO "%s: Failed to get new lun %p,%d\n", -+ __func__, new_lp,lun);) -+ return QLA2X00_FUNCTION_FAILED; -+ } - - /* - * If the target is the same target, but a new HBA has been selected, -@@ -1981,27 +3635,240 @@ qla2x00_send_failover_notify(mp_device_t - "lun=(%d).\n", __func__, lun);) - } - } -- } else if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_SPINUP ){ -+ } else if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_SPINUP || -+ old_lp->fcport->notify_type == FO_NOTIFY_TYPE_SPINUP ){ -+ -+ status = qla2x00_send_fo_notification(old_lp, new_lp); -+ if (status == QLA2X00_SUCCESS) { -+ /* EMPTY */ -+ DEBUG(printk("%s: Send CDB succeeded.\n", -+ __func__);) -+ } else { -+ /* EMPTY */ -+ DEBUG(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; -+} -+ -+static mp_path_t * -+qla2x00_find_host_from_port(mp_device_t *dp, -+ mp_host_t *host, -+ mp_port_t *port ) -+{ -+ unsigned long instance; -+ uint8_t id; -+ int i; -+ mp_path_t *path = NULL; -+ -+ /* get next host instance */ -+ instance = host->instance; -+ for(i = 0 ; i < port->cnt ; i++ ) { -+ instance = instance + 1; -+ DEBUG3(printk("%s: Finding new instance %d, max %d, cnt %d\n", -+ __func__, (int)instance, port->cnt, i);) -+ /* Handle wrap-around */ -+ if( instance == port->cnt ) -+ instance = 0; -+ if( port->hba_list[instance] == NULL ) -+ continue; -+ if( port->hba_list[instance] != host->ha ) -+ break; -+ } -+ /* Found a different hba then return the path to it */ -+ if ( i != port->cnt ) { -+ id = port->path_list[instance]; -+ DEBUG2(printk("%s: Changing to new host - pathid=%d\n", -+ __func__, id);) -+ path = qla2x00_find_path_by_id(dp, id); -+ } -+ return( path ); -+} -+ -+/* -+ * Find_best_port -+ * This routine tries to locate the best port to the target that -+ * doesn't require issuing a target notify command. -+ */ -+/* ARGSUSED */ -+static mp_path_t * -+qla2x00_find_best_port(mp_device_t *dp, -+ mp_path_t *orig_path, -+ mp_port_t *port, -+ fc_lun_t *fclun ) -+{ -+ mp_path_t *path = NULL; -+ mp_path_t *new_path; -+ mp_port_t *temp_port; -+ int i, found; -+ fc_lun_t *new_fp; -+ struct list_head *list, *temp; -+ mp_lun_t *mplun = (mp_lun_t *)fclun->mplun; -+ unsigned long instance; -+ uint16_t id; -+ -+ found = 0; -+ list_for_each_safe(list, temp, &mplun->ports_list) { -+ temp_port = list_entry(list, mp_port_t, list); -+ if ( port == temp_port ) { -+ continue; -+ } -+ /* Search for an active matching lun on any HBA, -+ but starting with the orig HBA */ -+ instance = orig_path->host->instance; -+ for(i = 0 ; i < temp_port->cnt ; instance++) { -+ if( instance == MAX_HOSTS ) -+ instance = 0; -+ id = temp_port->path_list[instance]; -+ DEBUG(printk( -+ "qla%d %s: i=%d, Checking temp port=%p, pathid=%d\n", -+ (int)instance,__func__, i, temp_port, id);) -+ if (id == PATH_INDEX_INVALID) -+ continue; -+ i++; /* found a valid hba entry */ -+ new_fp = mplun->paths[id]; -+ DEBUG(printk( -+ "qla%d %s: Checking fclun %p, for pathid=%d\n", -+ (int)instance,__func__, new_fp, id);) -+ if( new_fp == NULL ) -+ continue; -+ new_path = qla2x00_find_path_by_id(dp, id); -+ if( new_path != NULL ) { -+ DEBUG(printk( -+ "qla%d %s: Found new path new_fp=%p, " -+ "path=%p, flags=0x%x\n", -+ (int)new_path->host->instance,__func__, new_fp, -+ new_path, new_path->port->flags);) -+ -+ -+ if (atomic_read(&new_path->port->state) -+ == FC_DEVICE_DEAD){ -+ DEBUG2(printk("qla(%d) %s - Port (0x%04x) DEAD.\n", -+ (int)new_path->host->instance, __func__, -+ new_path->port->loop_id);) -+ continue; -+ } -+ -+ /* Is this path on an active controller? */ -+ if( (new_path->port->flags & FC_EVA_DEVICE) && -+ !(new_fp->flags & FC_ACTIVE_LUN) ){ -+ DEBUG2(printk("qla(%d) %s - EVA Port (0x%04x) INACTIVE.\n", -+ (int)new_path->host->instance, __func__, -+ new_path->port->loop_id);) -+ continue; -+ } -+ -+ if( (new_path->port->flags & FC_MSA_DEVICE) && -+ !(new_path->port->flags & FC_MSA_PORT_ACTIVE) ) { -+ DEBUG2(printk("qla(%d) %s - MSA Port (0x%04x) INACTIVE.\n", -+ (int)new_path->host->instance, __func__, -+ new_path->port->loop_id);) -+ continue; -+ } -+ -+ /* found a good path */ -+ DEBUG2(printk( -+ "qla%d %s: *** Changing from port %p to new port %p - pathid=%d\n", -+ (int)instance,__func__, port, temp_port, new_path->id); ) -+ return( new_path ); -+ } -+ } -+ } -+ -+ return( path ); -+} -+ -+/* -+ * qla2x00_smart_failover -+ * This routine tries to be smart about how it selects the -+ * next path. It selects the next path base on whether the -+ * loop went down or the port went down. If the loop went -+ * down it will select the next HBA. Otherwise, it will select -+ * the next port. -+ * -+ * Inputs: -+ * device Device being failed over. -+ * sp Request that initiated failover. -+ * orig_path path that was failed over from. -+ * -+ * Return: -+ * next path next path to use. -+ * flag 1 - Don't send notify command -+ * 0 - Send notify command -+ * -+ * Context: -+ * Kernel context. -+ */ -+/* ARGSUSED */ -+static mp_path_t * -+qla2x00_smart_path(mp_device_t *dp, -+ mp_path_t *orig_path, srb_t *sp, int *flag ) -+{ -+ mp_path_t *path = NULL; -+ fc_lun_t *fclun; -+ mp_port_t *port; -+ mp_host_t *host= orig_path->host; -+ -+ DEBUG2(printk("Entering %s - sp err = %d, instance =%d\n", -+ __func__, sp->err_id, (int)host->instance);) - -- if (newpath->lun_data.data[lun] & LUN_DATA_ENABLED) { -- status = qla2x00_send_fo_notification(old_lp, new_lp); -- if (status == QLA2X00_SUCCESS) { -- /* EMPTY */ -- DEBUG(printk("%s: Send CDB succeeded.\n", -- __func__);) -- } else { -- /* EMPTY */ -- DEBUG(printk("%s: Send CDB Error " -- "lun=(%d).\n", __func__, lun);) -+ -+ qla2x00_find_all_active_ports(sp); -+ if( sp != NULL ) { -+ fclun = sp->lun_queue->fclun; -+ if( fclun == NULL ) { -+ printk( KERN_INFO -+ "scsi%d %s: couldn't find fclun %p pathid=%d\n", -+ (int)host->instance,__func__, fclun, orig_path->id); -+ return( orig_path->next ); -+ } -+ port = qla2x00_find_port_by_name( -+ (mp_lun_t *)fclun->mplun, orig_path); -+ if( port == NULL ) { -+ printk( KERN_INFO -+ "scsi%d %s: couldn't find MP port %p pathid=%d\n", -+ (int)host->instance,__func__, port, orig_path->id); -+ return( orig_path->next ); -+ } -+ -+ /* Change to next HOST if loop went down */ -+ if( sp->err_id == SRB_ERR_LOOP ) { -+ path = qla2x00_find_host_from_port(dp, -+ host, port ); -+ if( path != NULL ) { -+ port->fo_cnt++; -+ *flag = 1; -+ /* if we used all the hbas then -+ try and get another port */ -+ if( port->fo_cnt > port->cnt ) { -+ port->fo_cnt = 0; -+ *flag = 0; -+ path = -+ qla2x00_find_best_port(dp, -+ orig_path, port, fclun ); -+ if( path ) -+ *flag = 1; -+ } - } -+ } else { -+ path = qla2x00_find_best_port(dp, -+ orig_path, port, fclun ); -+ if( path ) -+ *flag = 1; - } -- } else { -- /* EMPTY */ -- DEBUG4(printk("%s: failover disabled or no notify routine " -- "defined.\n", __func__);) - } -+ /* Default path is next path*/ -+ if (path == NULL) -+ path = orig_path->next; - -- return status; -+ DEBUG3(printk("Exiting %s\n", __func__);) -+ return path; - } - - /* -@@ -2022,7 +3889,8 @@ qla2x00_send_failover_notify(mp_device_t - * Kernel context. - */ - static mp_path_t * --qla2x00_select_next_path(mp_host_t *host, mp_device_t *dp, uint8_t lun) -+qla2x00_select_next_path(mp_host_t *host, mp_device_t *dp, uint8_t lun, -+ srb_t *sp) - { - mp_path_t *path = NULL; - mp_path_list_t *path_list; -@@ -2030,6 +3898,11 @@ qla2x00_select_next_path(mp_host_t *host - int id; - uint32_t status; - mp_host_t *new_host; -+ int skip_notify= 0; -+#if 0 -+ fc_lun_t *new_fp = NULL; -+#endif -+ - - ENTER("qla2x00_select_next_path:"); - -@@ -2044,20 +3917,25 @@ qla2x00_select_next_path(mp_host_t *host - if ((orig_path = qla2x00_find_path_by_id(dp, id)) != NULL) { - - /* select next path */ -- path = orig_path->next; -+ if ( orig_path->port && -+ (orig_path->port->flags & (FC_MSA_DEVICE|FC_EVA_DEVICE)) ) { -+ path = qla2x00_smart_path( dp, orig_path, -+ sp, &skip_notify ); -+ } else -+ 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 " -+ DEBUG2(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: " -+ DEBUG(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: " -+ DEBUG(printk(" Original - host nodename: " - "%02x%02x%02x%02x%02x%02x%02x%02x\n", - orig_path->host->nodename[0], - orig_path->host->nodename[1], -@@ -2067,7 +3945,7 @@ qla2x00_select_next_path(mp_host_t *host - orig_path->host->nodename[5], - orig_path->host->nodename[6], - orig_path->host->nodename[7]);) -- DEBUG3(printk(" portname: " -+ DEBUG(printk(" portname: " - "%02x%02x%02x%02x%02x%02x%02x%02x\n", - orig_path->port->port_name[0], - orig_path->port->port_name[1], -@@ -2077,13 +3955,13 @@ qla2x00_select_next_path(mp_host_t *host - orig_path->port->port_name[5], - orig_path->port->port_name[6], - orig_path->port->port_name[7]);) -- DEBUG3(printk(" New - host nodename: " -+ DEBUG(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: " -+ DEBUG(printk(" portname: " - "%02x%02x%02x%02x%02x%02x%02x%02x\n", - path->port->port_name[0], - path->port->port_name[1], -@@ -2095,9 +3973,8 @@ qla2x00_select_next_path(mp_host_t *host - 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) { -+ if ( (path != orig_path) && !skip_notify ) { - status = qla2x00_send_failover_notify( - dp, lun, path, orig_path); - -@@ -2133,7 +4010,7 @@ qla2x00_update_mp_host(mp_host_t *host) - { - BOOL success = TRUE; - uint16_t dev_id; -- fc_port_t *port; -+ fc_port_t *fcport; - scsi_qla_host_t *ha = host->ha; - - ENTER("qla2x00_update_mp_host"); -@@ -2142,20 +4019,26 @@ qla2x00_update_mp_host(mp_host_t *host) - /* - * We make sure each port is attached to some virtual device. - */ -- for (dev_id = 0, port = ha->fcport; (port); -- port = port->next, dev_id++) { -+ dev_id = 0; -+ fcport = NULL; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if(fcport->port_type != FCT_TARGET) -+ continue; - - DEBUG3(printk("%s(%ld): checking fcport list. update port " - "%p-%02x%02x%02x%02x%02x%02x%02x%02x dev_id %d " - "to ha inst %ld.\n", - __func__, ha->host_no, -- port, -- 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], -+ fcport, -+ 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], - dev_id, ha->instance);) -- success |= qla2x00_update_mp_device(host, port, dev_id, 0); -+ -+ qla2x00_configure_cfg_device(fcport); -+ success |= qla2x00_update_mp_device(host, fcport, dev_id, 0); -+ dev_id++; - } - if (success) { - DEBUG2(printk(KERN_INFO "%s: Exit OK\n", __func__);) -@@ -2165,7 +4048,7 @@ qla2x00_update_mp_host(mp_host_t *host) - DEBUG2(printk(KERN_INFO "%s: Exit FAILED\n", __func__);) - } - -- DEBUG3(printk("%s: inst %ld exiting.\n", __func__, ha->instance);) -+ DEBUG2(printk("%s: inst %ld exiting.\n", __func__, ha->instance);) - LEAVE("qla2x00_update_mp_host"); - - return success; -@@ -2209,48 +4092,51 @@ qla2x00_update_mp_device(mp_host_t *host - dev_id);) - - if (!qla2x00_is_ww_name_zero(port->port_name)) { -- -+ if( port->fo_combine ) { -+ return( port->fo_combine(host, dev_id, port, pathid) ); -+ } - /* -- * Search for a device with a matching node name, -- * or create one. -- */ -+ * Search for a device with a matching node name, -+ * portname 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. -- */ -+ * 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) { - /* We did not create a mp_dev for this port. */ - port->mp_byte |= MP_MASK_UNCONFIGURED; - DEBUG4(printk("%s: Device NOT found or created at " -- " dev_id=%d.\n", -- __func__, dev_id);) -+ " dev_id=%d.\n", -+ __func__, dev_id);) - 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. -- */ -- -+ * 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, - pathid, port); - if (path == NULL) { - DEBUG4(printk("%s:Path NOT found or created.\n", -- __func__);) -+ __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. -- */ -+ * of whether this device needs a relogin. If any -+ * device needs relogin, set the relogin countdown. -+ */ - if (port->flags & FC_CONFIG) - path->config = TRUE; - -@@ -2261,7 +4147,6 @@ qla2x00_update_mp_device(mp_host_t *host - } else { - path->relogin = FALSE; - } -- - } else { - /* EMPTY */ - DEBUG4(printk("%s: Failed portname empty.\n", -@@ -2306,7 +4191,7 @@ qla2x00_update_mp_tree(void) - - /* Override the NEEDS_UPDATE flag if disabled. */ - if (host->flags & MP_HOST_FLAG_DISABLE || -- host->fcport == NULL) -+ list_empty(host->fcports)) - host->flags &= ~MP_HOST_FLAG_NEEDS_UPDATE; - - if (host->flags & MP_HOST_FLAG_NEEDS_UPDATE) { -@@ -2344,7 +4229,7 @@ qla2x00_update_mp_tree(void) - - - /* -- * qla2x00_find_matching_lun -+ * qla2x00_find_matching_lun_by_num - * Find the lun in the path that matches the - * specified lun number. - * -@@ -2360,23 +4245,49 @@ qla2x00_update_mp_tree(void) - * (dg) - */ - static fc_lun_t * --qla2x00_find_matching_lun(uint8_t lun, mp_path_t *newpath) -+qla2x00_find_matching_lun_by_num(uint16_t lun_no, mp_device_t *dp, -+ mp_path_t *newpath) - { -- fc_lun_t *lp = NULL; /* lun ptr */ -- fc_lun_t *nlp; /* Next lun ptr */ -- fc_port_t *port; /* port ptr */ -- -- if ((port = newpath->port) != NULL) { -- for (nlp = port->fclun; (nlp); nlp = nlp->next) { -- if (lun == nlp->lun) { -- lp = nlp; -+ int found; -+ fc_lun_t *lp = NULL; /* lun ptr */ -+ fc_port_t *fcport; /* port ptr */ -+ mp_lun_t *lun; -+ -+ /* Use the lun list if we have one */ -+ if( dp->luns ) { -+ for (lun = dp->luns; lun != NULL ; lun = lun->next) { -+ if( lun_no == lun->number ) { -+ lp = lun->paths[newpath->id]; - break; - } - } -+ } else { -+ if ((fcport = newpath->port) != NULL) { -+ found = 0; -+ list_for_each_entry(lp, &fcport->fcluns, list) { -+ if (lun_no == lp->lun) { -+ found++; -+ break; -+ } -+ } -+ if (!found) -+ lp = NULL; -+ } - } - return lp; - } - -+static fc_lun_t * -+qla2x00_find_matching_lun(uint8_t lun, mp_device_t *dp, -+ mp_path_t *newpath) -+{ -+ fc_lun_t *lp; -+ -+ lp = qla2x00_find_matching_lun_by_num(lun, dp, newpath); -+ -+ return lp; -+} -+ - /* - * qla2x00_find_path_by_name - * Find the path specified portname from the pathlist -@@ -2401,7 +4312,7 @@ qla2x00_find_path_by_name(mp_host_t *hos - int cnt; - - if ((tmp_path = plp->last) != NULL) { -- for (cnt = 0; cnt < plp->path_cnt; cnt++) { -+ for (cnt = 0; (tmp_path) && cnt < plp->path_cnt; cnt++) { - if (tmp_path->host == host && - qla2x00_is_portname_equal( - tmp_path->portname, portname)) { -@@ -2496,12 +4407,22 @@ qla2x00_find_mp_dev_by_nodename(mp_host_ - if ((dp = host->mp_devs[id] ) == NULL) - continue; - -+#if 0 -+ if (qla2x00_is_nodename_in_device(dp, name)) { -+ DEBUG(printk("%s: Found matching device @ index %d:\n", -+ __func__, id);) -+ return dp; -+ } -+#else -+DEBUG(printk("%s mpdev_nodename=%0x nodename_from_gui=%0x",__func__,dp->nodename[7],name[7]);) - if (qla2x00_is_nodename_equal(dp->nodename, name)) { - DEBUG3(printk("%s: Found matching device @ index %d:\n", - __func__, id);) - return dp; - } -+#endif - } -+printk("%s could not find the node name\n",__func__); - - LEAVE("qla2x00_find_mp_dev_by_name"); - -@@ -2521,11 +4442,11 @@ qla2x00_find_mp_dev_by_nodename(mp_host_ - * Context: - * Kernel context. - */ --static mp_device_t * -+mp_device_t * - qla2x00_find_mp_dev_by_portname(mp_host_t *host, uint8_t *name, uint16_t *pidx) - { - int id; -- mp_device_t *dp; -+ mp_device_t *dp = NULL; - - DEBUG3(printk("%s: entered.\n", __func__);) - -@@ -2661,10 +4582,10 @@ qla2x00_map_os_targets(mp_host_t *host) - __func__, t, dp, host,ha);) - - if ((path = qla2x00_get_visible_path(dp)) == NULL) { -- printk(KERN_INFO -+ DEBUG( printk(KERN_INFO - "qla_cfg(%d): No visible path " - "for target %d, dp = %p\n", -- host->instance, t, dp); -+ host->instance, t, dp); ) - continue; - } - -@@ -2677,19 +4598,20 @@ qla2x00_map_os_targets(mp_host_t *host) - WWN_SIZE); - tgt->vis_port = path->port; - } -- DEBUG3(printk("%s(%ld): host=%d, " -- "device= %p has VISIBLE " -- "path=%p, path id=%d\n", -+ DEBUG3(printk("%s(%ld): host instance =%d, " -+ "device= %p, tgt=%d has VISIBLE path," -+ "path id=%d\n", - __func__, ha->host_no, - host->instance, -- dp, path, path->id);) -+ dp, t, path->id);) - } else { -- /* EMPTY */ -- DEBUG3(printk("%s(%ld): host=%d, " -- "device= %p has HIDDEN " -- "path=%p, path id=%d\n", -+ DEBUG3(printk("%s(%ld): host instance =%d, " -+ "device= %p, tgt=%d has HIDDEN " -+ "path, path id=%d\n", - __func__, ha->host_no, -- host->instance, dp, path,path->id);) -+ host->instance, dp, t, -+ path->id); ) -+ continue; - } - qla2x00_map_os_luns(host, dp, t); - } else { -@@ -2702,6 +4624,28 @@ qla2x00_map_os_targets(mp_host_t *host) - LEAVE("qla2x00_map_os_targets "); - } - -+static void -+qla2x00_map_or_failover_oslun(mp_host_t *host, mp_device_t *dp, -+ uint16_t t, uint16_t lun_no) -+{ -+ int i; -+ -+ /* -+ * if this is initization time and we couldn't map the -+ * lun then try and find a usable path. -+ */ -+ if ( qla2x00_map_a_oslun(host, dp, t, lun_no) && -+ (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_no, NULL); -+ if( !qla2x00_map_a_oslun(host, dp, t, lun_no)) -+ break; -+ } -+ } -+} -+ -+ - /* - * qla2x00_map_os_luns - * Allocate the luns for the OS target. -@@ -2719,20 +4663,37 @@ qla2x00_map_os_targets(mp_host_t *host) - 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; -+ uint16_t lun_no; -+ mp_lun_t *lun; -+ os_lun_t *up; -+ -+ DEBUG3(printk("Entering %s..\n",__func__);) -+ -+ /* if we are using lun binding then scan for the discovered luns */ -+ if( dp->luns ) { -+ for (lun = dp->luns; lun != NULL ; lun = lun->next) { -+ lun_no = lun->number; -+ DEBUG2(printk("%s: instance %d: Mapping target %d, lun %d..\n", -+ __func__,host->instance,t,lun->number);) -+ qla2x00_map_or_failover_oslun(host, dp, -+ t, lun_no); -+ up = (os_lun_t *) GET_LU_Q(host->ha, t, lun_no); -+ if (up == NULL || up->fclun == NULL) { -+ DEBUG2(printk("%s: instance %d: No FCLUN for target %d, lun %d.. \n", -+ __func__,host->instance,t,lun->number);) -+ continue; - } -+ DEBUG2(printk("%s: instance %d: Mapping target %d, lun %d.. to path id %d\n", -+ __func__,host->instance,t,lun->number, -+ up->fclun->fcport->cur_path);) -+ } -+ } else { -+ for (lun_no = 0; lun_no < MAX_LUNS; lun_no++ ) { -+ qla2x00_map_or_failover_oslun(host, dp, -+ t, lun_no); - } - } -+ DEBUG3(printk("Exiting %s..\n",__func__);) - } - - /* -@@ -2763,18 +4724,23 @@ qla2x00_map_a_oslun(mp_host_t *host, mp_ - BOOL status = FALSE; - - if ((id = dp->path_list->current_path[lun]) != PATH_INDEX_INVALID) { -+ DEBUG(printk( "qla2x00(%d): Current path for lun %d is path id %d\n", -+ host->instance, -+ lun, id);) - 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); -+ fclun = qla2x00_find_matching_lun(lun,dp,path); -+ DEBUG2(printk( "qla2x00(%d): found fclun %p, path id = %d\n", host->instance,fclun,id);) - - /* Always map all luns if they are enabled */ - if (fclun && - (path->lun_data.data[lun] & - LUN_DATA_ENABLED) ) { -+ DEBUG(printk( "qla2x00(%d): Lun is enable \n", host->instance);) - - /* - * Mapped lun on the visible path -@@ -2791,10 +4757,10 @@ qla2x00_map_a_oslun(mp_host_t *host, mp_ - t, dp); - - return FALSE; -- } -- -+ } - vis_host = vis_path->host; - -+ - /* ra 11/30/01 */ - /* - * Always alloc LUN 0 so kernel -@@ -2814,6 +4780,8 @@ qla2x00_map_a_oslun(mp_host_t *host, mp_ - - lq->fclun = fclun; - } -+ DEBUG(printk( "qla2x00(%d): lun allocated %p for lun %d\n", -+ host->instance,lq,lun);) - } - } - else -@@ -2892,6 +4860,28 @@ qla2x00_add_path( mp_path_list_t *pathli - LEAVE("qla2x00_add_path"); - } - -+static void -+qla2x00_add_lun( mp_device_t *dp, mp_lun_t *lun) -+{ -+ mp_lun_t *cur_lun; -+ -+ ENTER("qla2x00_add_lun"); -+ -+ /* Insert new entry into the list of luns */ -+ lun->next = NULL; -+ -+ cur_lun = dp->luns; -+ if( cur_lun == NULL ) { -+ dp->luns = lun; -+ } else { -+ /* add to tail of list */ -+ while( cur_lun->next != NULL ) -+ cur_lun = cur_lun->next; -+ -+ cur_lun->next = lun; -+ } -+ LEAVE("qla2x00_add_lun"); -+} - - /* - * qla2x00_is_portname_in_device -@@ -2919,6 +4909,49 @@ qla2x00_is_portname_in_device(mp_device_ - return FALSE; - } - -+#if 0 -+static BOOL -+qla2x00_is_pathid_in_port(mp_port_t *port, uint8_t pathid) -+{ -+ int i; -+ uint8_t id; -+ -+ for(i = 0 ; i < port->cnt ; i++ ) { -+ id = port->path_list[i]; -+ if( id == pathid ) -+ return TRUE; -+ } -+ return FALSE; -+} -+#endif -+ -+#if 0 -+/* -+ * qla2x00_is_nodename_in_device -+ * Search for the specified "nodename" in the device list. -+ * -+ * Input: -+ * dp = device pointer -+ * nodename = nodename to searched for in device -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+static BOOL -+qla2x00_is_nodename_in_device(mp_device_t *dp, uint8_t *nodename) -+{ -+ int idx; -+ -+ for (idx = 0; idx < MAX_PATHS_PER_DEVICE; idx++) { -+ if (memcmp(&dp->nodenames[idx][0], nodename, WWN_SIZE) == 0) -+ return TRUE; -+ } -+ return FALSE; -+} -+#endif - - /* - * qla2x00_set_lun_data_from_bitmask -@@ -2979,9 +5012,9 @@ qla2x00_failback_single_lun(mp_device_t - return; - - /* An fclun should exist for the failbacked lun */ -- if (qla2x00_find_matching_lun(lun, new_path) == NULL) -+ if (qla2x00_find_matching_lun(lun, dp, new_path) == NULL) - return; -- if (qla2x00_find_matching_lun(lun, old_path) == NULL) -+ if (qla2x00_find_matching_lun(lun, dp, old_path) == NULL) - return; - - /* Log to console and to event log. */ -@@ -3029,6 +5062,91 @@ qla2x00_failback_single_lun(mp_device_t - } - } - -+#if 0 -+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 *new_host; -+ os_lun_t *lq; -+ mp_path_t *vis_path; -+ mp_host_t *vis_host; -+ int status; -+ -+ /* 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, dp, new_path) == NULL) -+ return; -+ if (qla2x00_find_matching_lun(lun, dp, old_path) == NULL) -+ return; -+ -+ if ((vis_path = qla2x00_get_visible_path(dp)) == NULL) { -+ printk(KERN_INFO -+ "No visible path for " -+ "target %d, dp = %p\n", -+ dp->dev_id, dp); -+ return; -+ } -+ vis_host = vis_path->host; -+ /* Schedule the recovery before we move the luns */ -+ if( (lq = (os_lun_t *) -+ LUN_Q(vis_host->ha, dp->dev_id, lun)) == NULL ) { -+ printk(KERN_INFO -+ "qla2x00(%d): No visible lun for " -+ "target %d, dp = %p, lun=%d\n", -+ vis_host->instance, -+ dp->dev_id, dp, lun); -+ return; -+ } -+ -+ qla2x00_delay_lun(vis_host->ha, lq, recoveryTime); -+ -+ /* 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. */ -+ status = qla2x00_send_failover_notify(dp, lun, -+ new_path, old_path); -+ -+ new_host = new_path->host; -+ -+ /* remap the lun */ -+ if (status == QLA2X00_SUCCESS ) { -+ pathlist->current_path[lun] = new; -+ qla2x00_map_a_oslun(new_host, dp, dp->dev_id, lun); -+ qla2x00_flush_failover_q(vis_host->ha, lq); -+ qla2x00_reset_lun_fo_counts(vis_host->ha, lq); -+ } -+} -+#endif -+ - /* - * qla2x00_failback_luns - * This routine looks through the devices on an adapter, and -@@ -3077,6 +5195,9 @@ qla2x00_failback_luns( mp_host_t *host) - if (atomic_read(&path->port->state) == FC_DEVICE_DEAD) - continue; - -+ if ( (path->port->flags & FC_FAILBACK_DISABLE) ) -+ continue; -+ - /* - * Failback all the paths for this host, - * the luns could be preferred across all paths -@@ -3112,7 +5233,7 @@ qla2x00_failback_luns( mp_host_t *host) - /* No point in failing back a - disconnected lun */ - new_fp = qla2x00_find_matching_lun( -- l, path); -+ l, dp, path); - - if (new_fp == NULL) - continue; -@@ -3132,6 +5253,41 @@ qla2x00_failback_luns( mp_host_t *host) - return; - } - -+static struct _mp_path * -+qla2x00_find_first_active_path( mp_device_t *dp, mp_lun_t *lun) -+{ -+ mp_path_t *path= NULL; -+ mp_path_list_t *plp = dp->path_list; -+ mp_path_t *tmp_path; -+ fc_port_t *fcport; -+ fc_lun_t *fclun; -+ int cnt; -+ -+ if ((tmp_path = plp->last) != NULL) { -+ tmp_path = tmp_path->next; -+ for (cnt = 0; (tmp_path) && cnt < plp->path_cnt; -+ tmp_path = tmp_path->next, cnt++) { -+ fcport = tmp_path->port; -+ if ( fcport != NULL ) { -+ if( (fcport->flags & FC_EVA_DEVICE) ) { -+ fclun = lun->paths[tmp_path->id]; -+ if ( fclun == NULL ) -+ continue; -+ if (fclun->flags & FC_ACTIVE_LUN ){ -+ path = tmp_path; -+ break; -+ } -+ } else -+ if ( (fcport->flags & FC_MSA_PORT_ACTIVE) ){ -+ path = tmp_path; -+ break; -+ } -+ } -+ } -+ } -+ return path; -+} -+ - /* - * qla2x00_setup_new_path - * Checks the path against the existing paths to see if there -@@ -3146,7 +5302,7 @@ qla2x00_failback_luns( mp_host_t *host) - * None - */ - static void --qla2x00_setup_new_path( mp_device_t *dp, mp_path_t *path) -+qla2x00_setup_new_path( mp_device_t *dp, mp_path_t *path, fc_port_t *fcport) - { - mp_path_list_t *path_list = dp->path_list; - mp_path_t *tmp_path, *first_path; -@@ -3158,6 +5314,12 @@ qla2x00_setup_new_path( mp_device_t *dp, - int i; - - ENTER("qla2x00_setup_new_path"); -+ DEBUG(printk("qla2x00_setup_new_path: path %p path id %d\n", -+ path, path->id);) -+ if( path->port ){ -+ DEBUG(printk("qla2x00_setup_new_path: port %p loop id 0x%x\n", -+ path->port, path->port->loop_id);) -+ } - - /* If this is a visible path, and there is not already a - * visible path, save it as the visible path. If there -@@ -3215,30 +5377,35 @@ qla2x00_setup_new_path( mp_device_t *dp, - } - } - -- /* -- * 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. -+ if( !(fcport->flags & (FC_MSA_DEVICE|FC_EVA_DEVICE)) ) { -+ /* -+ * 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); - -- 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. -+ * If this is the first path added, it is the only -+ * available path, so make it the current path. - */ -- path_list->current_path[l] = path->id; -+ 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, so make it the -+ * current path. -+ */ -+ path_list->current_path[l] = path->id; -+ } - } - } - -@@ -3260,10 +5427,14 @@ qla2x00_setup_new_path( mp_device_t *dp, - void - qla2x00_cfg_mem_free(scsi_qla_host_t *ha) - { -+ mp_lun_t *cur_lun; -+ mp_lun_t *tmp_lun; - mp_device_t *dp; - mp_path_list_t *path_list; - mp_path_t *tmp_path, *path; - mp_host_t *host, *temp; -+ mp_port_t *temp_port; -+ struct list_head *list, *temp_list; - int id, cnt; - - if ((host = qla2x00_cfg_find_host(ha)) != NULL) { -@@ -3300,6 +5471,31 @@ qla2x00_cfg_mem_free(scsi_qla_host_t *ha - temp->mp_devs[id] = NULL; - } - } -+ /* Free all the lun struc's attached -+ * to this mp_device */ -+ for ( cur_lun = dp->luns; (cur_lun); -+ cur_lun = cur_lun->next) { -+ DEBUG(printk(KERN_INFO -+ "host%d - Removing lun:%p " -+ "attached to device:%p\n", -+ host->instance, -+ cur_lun,dp);) -+ list_for_each_safe(list, temp_list, -+ &cur_lun->ports_list) { -+ -+ temp_port = list_entry(list, mp_port_t, list); -+ list_del_init(&temp_port->list); -+ -+ DEBUG(printk(KERN_INFO -+ "host%d - Removing port:%p " -+ "attached to lun:%p\n", -+ host->instance, temp_port, -+ cur_lun);) -+ -+ } -+ tmp_lun = cur_lun; -+ KMEM_FREE(tmp_lun,sizeof(mp_lun_t)); -+ } - KMEM_FREE(dp, sizeof(mp_device_t)); - } - -@@ -3331,68 +5527,43 @@ qla2x00_cfg_mem_free(scsi_qla_host_t *ha - } - - UINT8 --qla2x00_is_fcport_in_config(scsi_qla_host_t *ha, fc_port_t *fcport) -+qla2x00_is_fcport_in_foconfig(scsi_qla_host_t *ha, fc_port_t *fcport) - { -- if (ha->flags.failover_enabled) { -- -- mp_device_t *dp; -- mp_host_t *host; -- mp_path_t *path; -- mp_path_list_t *pathlist; -- uint16_t dev_no; -- -- if ((host = qla2x00_cfg_find_host(ha)) == NULL) { -- /* no configured devices */ -- return (FALSE); -- } -- -- for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { -- dp = host->mp_devs[dev_no]; -- -- if (dp == NULL) -- continue; -- -- /* Sanity check */ -- if (qla2x00_is_wwn_zero(dp->nodename)) -- continue; -+ mp_device_t *dp; -+ mp_host_t *host; -+ mp_path_t *path; -+ mp_path_list_t *pathlist; -+ uint16_t dev_no; - -- if ((pathlist = dp->path_list) == NULL) -- continue; -+ if ((host = qla2x00_cfg_find_host(ha)) == NULL) { -+ /* no configured devices */ -+ return (FALSE); -+ } - -- path = qla2x00_find_path_by_name(host, dp->path_list, -- fcport->port_name); -- if (path != NULL) { -- /* found path for port */ -- if (path->config == TRUE) { -- return (TRUE); -- } else { -- break; -- } -- } -- } -+ for (dev_no = 0; dev_no < MAX_MP_DEVICES; dev_no++) { -+ dp = host->mp_devs[dev_no]; - -- } else { -- uint16_t idx; -- fcdev_t *pdev; -+ if (dp == NULL) -+ continue; - -- for (idx = 0; idx < MAX_FIBRE_DEVICES; idx++) { -- pdev = &ha->fc_db[idx]; -+ /* Sanity check */ -+ if (qla2x00_is_wwn_zero(dp->nodename)) -+ continue; - -- if (pdev->loop_id == PORT_UNUSED) -- continue; -+ if ((pathlist = dp->path_list) == NULL) -+ continue; - -- if (memcmp(fcport->port_name, pdev->wwn, -- EXT_DEF_WWN_NAME_SIZE) == 0) { -- if (pdev->flag & DEV_CONFIGURED) { -- /* found port in user config */ -- return(TRUE); -- } else { -- break; -- } -+ path = qla2x00_find_path_by_name(host, dp->path_list, -+ fcport->port_name); -+ if (path != NULL) { -+ /* found path for port */ -+ if (path->config == TRUE) { -+ return (TRUE); -+ } else { -+ break; - } - } - } - - return (FALSE); - } -- -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_cfg.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_cfg.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_cfg.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_cfg.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -78,7 +78,7 @@ extern "C" - */ - typedef struct _mp_lun_data { - uint8_t data[MAX_LUNS]; --#define LUN_DATA_ENABLED BIT_7 -+#define LUN_DATA_ENABLED BIT_7 /* Lun Masking */ - #define LUN_DATA_PREFERRED_PATH BIT_6 - } - mp_lun_data_t; -@@ -112,14 +112,42 @@ typedef struct _failover_notify_srb { - } - failover_notify_srb_t; - -+#define WWULN_SIZE 32 -+typedef struct _mp_lun { -+ struct _mp_lun *next; -+ struct _mp_device *dp; /* Multipath device */ -+ int number; /* actual lun number */ -+ fc_lun_t *paths[MAX_PATHS_PER_DEVICE]; /* list of fcluns */ -+ struct list_head ports_list; -+ int path_cnt; /* Must be > 1 for fo device */ -+ int siz; /* Size of wwuln */ -+ uint8_t wwuln[WWULN_SIZE];/* lun id from inquiry page 83. */ -+} -+mp_lun_t; -+ -+typedef struct _mp_port { -+ struct list_head list; -+ uint8_t portname[WWN_SIZE]; -+ uint8_t path_list[ MAX_HOSTS ]; /* path index for a given HBA */ -+ scsi_qla_host_t *hba_list[ MAX_HOSTS ]; -+ int cnt; -+ int fo_cnt; -+ ulong total_blks; /* blocks transferred on this port */ -+} -+mp_port_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. */ -+ int dev_id; -+ int use_cnt; /* number of users */ -+ struct _mp_lun *luns; /* list of luns */ -+ uint8_t nodename[WWN_SIZE]; /* World-wide node name for device. */ -+ -+ /* World-wide node names. */ -+ uint8_t nodenames[MAX_PATHS_PER_DEVICE][WWN_SIZE]; - /* World-wide port names. */ - uint8_t portnames[MAX_PATHS_PER_DEVICE][WWN_SIZE]; - } -@@ -132,7 +160,7 @@ 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 */ -- fc_port_t *fcport; /* Port chain for this adapter */ -+ struct list_head *fcports; /* Port chain for this adapter */ - mp_device_t *mp_devs[MAX_MP_DEVICES]; /* Multipath devices */ - - uint32_t flags; -@@ -157,6 +185,7 @@ typedef struct _mp_path { - struct _mp_host *host; /* Pointer to adapter */ - fc_port_t *port; /* FC port info */ - uint16_t id; /* Path id (index) */ -+ uint16_t flags; - uint8_t mp_byte; /* Multipath control byte */ - #define MP_MASK_HIDDEN 0x80 - #define MP_MASK_UNCONFIGURED 0x40 -@@ -179,4 +208,7 @@ typedef struct failover_notify_entry { - } - failover_notify_t; - -+extern mp_device_t *qla2x00_find_mp_dev_by_portname(mp_host_t *, uint8_t *, -+ uint16_t *); -+extern mp_host_t * qla2x00_cfg_find_host(scsi_qla_host_t *); - #endif /* _QLA_CFG_H */ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_cfgln.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_cfgln.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_cfgln.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_cfgln.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -19,7 +19,7 @@ - - /* - * QLogic ISP2x00 Multi-path LUN Support Driver -- * Solaris specific functions -+ * Linux specific functions - * - */ - -@@ -333,7 +333,6 @@ qla2x00_cfg_build_path_tree(scsi_qla_hos - * number - */ - PERSIST_STRING("scsi-qla%ld-tgt-%d-di-%d-node", "%ld-%d-%d-n"); -- DEBUG(printk("build_tree: %s\n",propbuf);) - - rval = qla2x00_get_prop_xstr(ha, propbuf, - node_name, WWN_SIZE); -@@ -343,6 +342,7 @@ qla2x00_cfg_build_path_tree(scsi_qla_hos - */ - continue; - -+ DEBUG(printk("build_tree: %s\n",propbuf);) - memcpy(port->node_name, node_name, WWN_SIZE); - - /* -@@ -350,13 +350,13 @@ qla2x00_cfg_build_path_tree(scsi_qla_hos - * number - */ - PERSIST_STRING("scsi-qla%ld-tgt-%d-di-%d-port", "%ld-%d-%d-p"); -- DEBUG(printk("build_tree: %s\n",propbuf);) - - rval = qla2x00_get_prop_xstr(ha, propbuf, - port_name, WWN_SIZE); - if (rval != WWN_SIZE) - continue; - -+ DEBUG(printk("build_tree: %s\n",propbuf);) - memcpy(port->node_name, node_name, WWN_SIZE); - memcpy(port->port_name, port_name, WWN_SIZE); - port->flags |= FC_CONFIG; -@@ -366,8 +366,6 @@ qla2x00_cfg_build_path_tree(scsi_qla_hos - * is present then all luns are visible. - */ - PERSIST_STRING("scsi-qla%ld-tgt-%d-di-%d-control", "%ld-%d-%d-c"); -- DEBUG3(printk("build_tree: %s\n",propbuf);) -- - rval = qla2x00_get_prop_xstr(ha, propbuf, - (uint8_t *)(&control_byte), - sizeof(control_byte)); -@@ -379,6 +377,8 @@ qla2x00_cfg_build_path_tree(scsi_qla_hos - continue; - } - -+ DEBUG3(printk("build_tree: %s\n",propbuf);) -+ - DEBUG(printk("build_tree: control byte 0x%x\n", - control_byte);) - -@@ -392,9 +392,36 @@ qla2x00_cfg_build_path_tree(scsi_qla_hos - port->port_name[4], port->port_name[5], - port->port_name[6], port->port_name[7], - tgt, port->mp_byte);) -+#if 0 /* not supported */ -+ /* To do the lun binding: Create a fclun for each -+ * lun the user has specified, so a mp_lun can be -+ * created for each. -+ */ -+ for (lun = 0; lun < MAX_LUNS_PER_DEVICE && ; lun++) { -+ if( !ql2xdevflag ) -+ sprintf(propbuf, "scsi-qla%ld-tgt-%d-lun-%d-lunid", -+ ha->instance, tgt, lun); -+ else -+ sprintf(propbuf, "%ld-%d-%d-l", ha->instance, -+ tgt, lun); -+ -+ DEBUG(printk("build_tree: %s\n",propbuf);) -+ -+ /* allocate space for mp_lun and fclun */ -+ -+ rval = qla2x00_get_prop_xstr(ha, propbuf, -+ mplun->wwuln, 32); -+ if (rval != 32) -+ continue; -+ -+ } -+#endif - - qla2x00_update_mp_device(host, port, tgt, - dev_no); -+ -+ /* free any mplun info */ -+ - qla2x00_set_lun_data_from_config(host, - port, tgt, dev_no); - } -@@ -418,7 +445,7 @@ qla2x00_cfg_build_path_tree(scsi_qla_hos - * Returns: - * None. - */ --void qla2x00_cfg_display_devices(void) -+void qla2x00_cfg_display_devices( int flag ) - { - mp_host_t *host; - int id; -@@ -430,8 +457,9 @@ void qla2x00_cfg_display_devices(void) - lun_bit_mask_t lun_mask; - int mask_set; - uint8_t l; -+ mp_lun_t *lun; -+ unsigned char tmp_buf[32]; - -- printk("qla2x00_cfg_display_devices\n"); - for (host = mp_hosts_base; (host); host = host->next) { - - instance = (int) host->instance; -@@ -552,6 +580,21 @@ void qla2x00_cfg_display_devices(void) - *((uint32_t *) &lun_mask.mask[4]), - *((uint32_t *) &lun_mask.mask[0]) ); - } -+ /* display lun wwuln */ -+ if( flag ) -+ for (lun = dp->luns; lun != NULL ; lun = lun->next) { -+ printk(KERN_INFO -+ "scsi-qla%d-tgt-%d-di-%d-lun-%d-lunid=", -+ instance, id, path->id, lun->number); -+ for (i = 0 ; i < lun->siz ; -+ i++) { -+ sprintf(tmp_buf+i, -+ "%02x", -+ lun->wwuln[i]); -+ } -+ printk(KERN_INFO "%s:%02d;\n", -+ tmp_buf,lun->siz); -+ } - dev_no++; - } - -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_debug.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_debug.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_debug.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_debug.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -57,11 +57,13 @@ - #define DEBUG2_3_11(x) if (extended_error_logging != 0) { do {x;} while (0); } - #define DEBUG2_9_10(x) if (extended_error_logging != 0) { do {x;} while (0); } - #define DEBUG2_11(x) if (extended_error_logging != 0) { do {x;} while (0); } -+#define DEBUG2_13(x) if (extended_error_logging != 0) { do {x;} while (0); } - #else - #define DEBUG2(x) do {} while (0); - #define DEBUG2_3(x) do {} while (0); - #define DEBUG2_3_11(x) do {} while (0); - #define DEBUG2_9_10(x) do {} while (0); -+#define DEBUG2_13(x) do {} while (0); - #endif - - #if defined(QL_DEBUG_LEVEL_3) -@@ -123,3 +125,16 @@ - #else - #define DEBUG12(x) do {} while (0); - #endif -+ -+#if defined(QL_DEBUG_LEVEL_13) -+#define DEBUG13(x) do {x;} while (0); -+ #if !defined(DEBUG2_13) -+ #define DEBUG2_13(x) do {x;} while (0); -+ #endif -+#else -+#define DEBUG13(x) do {} while (0); -+ #if !defined(DEBUG2_13) -+ #define DEBUG2_13(x) do {} while (0); -+ #endif -+#endif -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_devtbl.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_devtbl.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_devtbl.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_devtbl.h 2004-04-22 19:42:21.000000000 -0700 -@@ -1,4 +1,4 @@ --#define QLA_MODEL_NAMES 0x19 -+#define QLA_MODEL_NAMES 0x1B - - /* - * Adapter model names. -@@ -7,9 +7,9 @@ char *qla2x00_model_name[QLA_MODEL_NAMES - "QLA2340", /* 0x100 */ - "QLA2342", /* 0x101 */ - "QLA2344", /* 0x102 */ -- "QLA2342", /* 0x103 */ -- "QLA2340", /* 0x104 */ -- "QLA2342", /* 0x105 */ -+ "QCP2342", /* 0x103 */ -+ "QSB2340", /* 0x104 */ -+ "QSB2342", /* 0x105 */ - "QLA2310", /* 0x106 */ - "QLA2332", /* 0x107 */ - "QCP2332", /* 0x108 */ -@@ -23,11 +23,294 @@ char *qla2x00_model_name[QLA_MODEL_NAMES - "HPQSVS ", /* 0x110 */ - "QLA4010", /* 0x111 */ - "QLA4010", /* 0x112 */ -- "QLA4010", /* 0x113 */ -- "QLA4010", /* 0x114 */ -+ "QLA4010C", /* 0x113 */ -+ "QLA4010C", /* 0x114 */ - "QLA2360", /* 0x115 */ - "QLA2362", /* 0x116 */ -- "QLA2350", /* 0x117 */ -- "QLA2352" /* 0x118 */ -+ " ", /* 0x117 */ -+ " ", /* 0x118 */ -+ "QLA200", /* 0x119 */ -+ "QLA200C" /* 0x11A */ - }; - -+char *qla2x00_model_desc[QLA_MODEL_NAMES] = { -+ "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x100 */ -+ "133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x101 */ -+ "133MHz PCI-X to 2Gb FC, Quad Channel", /* 0x102 */ -+ " ", /* 0x103 */ -+ " ", /* 0x104 */ -+ " ", /* 0x105 */ -+ " ", /* 0x106 */ -+ " ", /* 0x107 */ -+ " ", /* 0x108 */ -+ " ", /* 0x109 */ -+ " ", /* 0x10a */ -+ " ", /* 0x10b */ -+ "133MHz PCI-X to 2Gb FC, Single Channel", /* 0x10c */ -+ "133MHz PCI-X to 2Gb FC, Dual Channel", /* 0x10d */ -+ " ", /* 0x10e */ -+ "HPQ SVS HBA- Initiator device", /* 0x10f */ -+ "HPQ SVS HBA- Target device", /* 0x110 */ -+ "Optical- 133MHz to 1Gb iSCSI- networking", /* 0x111 */ -+ "Optical- 133MHz to 1Gb iSCSI- storage", /* 0x112 */ -+ "Copper- 133MHz to 1Gb iSCSI- networking", /* 0x113 */ -+ "Copper- 133MHz to 1Gb iSCSI- storage", /* 0x114 */ -+ "133MHz PCI-X to 2Gb FC Single Channel", /* 0x115 */ -+ "133MHz PCI-X to 2Gb FC Dual Channel", /* 0x116 */ -+ " ", /* 0x117 */ -+ " ", /* 0x118 */ -+ "133MHz PCI-X to 2Gb FC Optical", /* 0x119 */ -+ "133MHz PCI-X to 2Gb FC Copper" /* 0x11A */ -+}; -+ -+ -+struct cfg_device_info { -+ const char *vendor; -+ const char *model; -+ const int flags; /* bit 0 (0x1) -- This bit will translate the real -+ WWNN to the common WWNN for the target AND -+ XP_DEVICE */ -+ /* bit 1 (0x2) -- MSA 1000 */ -+ /* bit 2 (0x4) -- EVA */ -+ /* bit 3 (0x8) -- DISABLE FAILOVER */ -+ const int notify_type; /* support the different types: 1 - 4 */ -+ int ( *fo_combine)(void *, -+ uint16_t, fc_port_t *, uint16_t ); -+ int ( *fo_detect)(void); -+ int ( *fo_notify)(void); -+ int ( *fo_select)(void); -+}; -+ -+ -+static struct cfg_device_info cfg_device_list[] = { -+ -+ {"COMPAQ", "MSA1000", 2, FO_NOTIFY_TYPE_SPINUP, -+ qla2x00_combine_by_lunid, NULL, NULL, NULL }, -+ -+/* For testing only -+ {"SEAGATE", "ST318453FC", 0, FO_NOTIFY_TYPE_NONE, -+ qla2x00_combine_by_lunid, NULL, NULL, NULL }, -+*/ -+ -+ {"HITACHI", "OPEN-", 1, FO_NOTIFY_TYPE_NONE, -+ qla2x00_combine_by_lunid, NULL, NULL, NULL }, -+ {"HP", "OPEN-", 1, FO_NOTIFY_TYPE_NONE, -+ qla2x00_combine_by_lunid, NULL, NULL, NULL }, -+ {"COMPAQ", "HSV110 (C)COMPAQ", 4, FO_NOTIFY_TYPE_SPINUP, -+ qla2x00_combine_by_lunid, NULL, NULL, NULL }, -+ {"HP", "HSV100", 4, FO_NOTIFY_TYPE_SPINUP, -+ qla2x00_combine_by_lunid, NULL, NULL, NULL }, -+ {"DEC", "HSG80", 8, FO_NOTIFY_TYPE_NONE, -+ qla2x00_export_target, NULL, NULL, NULL }, -+ -+ /* -+ * Must be at end of list... -+ */ -+ {NULL, NULL } -+}; -+ -+/*****************************************/ -+/* ISP Boards supported by this driver */ -+/*****************************************/ -+#define QLA2X00_VENDOR_ID 0x1077 -+#define QLA2100_DEVICE_ID 0x2100 -+#define QLA2200_DEVICE_ID 0x2200 -+#define QLA2200A_DEVICE_ID 0x2200A -+#define QLA2300_DEVICE_ID 0x2300 -+#define QLA2312_DEVICE_ID 0x2312 -+#define QLA2322_DEVICE_ID 0x2322 -+#define QLA6312_DEVICE_ID 0x6312 -+#define QLA6322_DEVICE_ID 0x6322 -+//#define QLAFBLITE_DEVICE_ID /* Not Known yet */ -+#define QLA2200A_RISC_ROM_VER 4 -+#define FPM_2300 6 -+#define FPM_2310 7 -+ -+#if defined(ISP2100) -+#define NUM_OF_ISP_DEVICES 2 -+static struct pci_device_id qla2100_pci_tbl[] = -+{ -+ {QLA2X00_VENDOR_ID, QLA2100_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -+ {0,} -+}; -+MODULE_DEVICE_TABLE(pci, qla2100_pci_tbl); -+#endif -+#if defined(ISP2200) -+#define NUM_OF_ISP_DEVICES 2 -+static struct pci_device_id qla2200_pci_tbl[] = -+{ -+ {QLA2X00_VENDOR_ID, QLA2200_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -+ {0,} -+}; -+MODULE_DEVICE_TABLE(pci, qla2200_pci_tbl); -+#endif -+ -+#if defined(ISP2300) -+#define NUM_OF_ISP_DEVICES 6 -+static struct pci_device_id qla2300_pci_tbl[] = -+{ -+ {QLA2X00_VENDOR_ID, QLA2300_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -+ {QLA2X00_VENDOR_ID, QLA2312_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -+ {QLA2X00_VENDOR_ID, QLA2322_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -+ {QLA2X00_VENDOR_ID, QLA6312_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -+ {QLA2X00_VENDOR_ID, QLA6322_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,}, -+ {0,} -+}; -+MODULE_DEVICE_TABLE(pci, qla2300_pci_tbl); -+#endif -+ -+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 -+ * extended F/W Load */ -+}; -+ -+/* -+ * PCI driver interface definitions -+ */ -+#define ISP21XX_FW_INDEX 0 -+#define ISP22XX_FW_INDEX 0 -+#define ISP23XX_FW_INDEX 0 -+#define ISP232X_FW_INDEX 2 -+#define ISP63XX_FW_INDEX 6 -+#define ISP632X_FW_INDEX 8 -+ -+typedef struct _qlaboards -+{ -+ unsigned char bdName[9]; /* Board ID String */ -+ unsigned long device_id; /* Device ID */ -+ int numPorts; /* number of loops on adapter */ -+ unsigned char *fwver; /* Ptr to F/W version array */ -+ struct qla_fw_info *fwinfo; -+} qla_boards_t; -+ -+ -+static struct qla_fw_info qla_fw_tbl[] = { -+#if defined(ISP2100) -+ /* Start of 21xx firmware list */ -+ { -+ FW_INFO_ADDR_NORMAL, &fw2100tp_code01[0], -+ &fw2100tp_length01, &fw2100tp_addr01, -+ }, -+ { FW_INFO_ADDR_NOMORE, }, -+#endif -+ -+#if defined(ISP2200) -+ /* Start of 22xx firmware list */ -+#if defined(FC_IP_SUPPORT) -+ { -+ FW_INFO_ADDR_NORMAL, &fw2200ip_code01[0], -+ &fw2200ip_length01, &fw2200ip_addr01, -+ }, -+#else -+ { -+ FW_INFO_ADDR_NORMAL, &fw2200tp_code01[0], -+ &fw2200tp_length01, &fw2200tp_addr01, -+ }, -+#endif -+ { FW_INFO_ADDR_NOMORE, }, -+#endif -+ -+#if defined(ISP2300) -+ /* 0 - Start of 23xx firmware list */ -+ { -+ FW_INFO_ADDR_NORMAL, &fw2300ipx_code01[0], -+ &fw2300ipx_length01, &fw2300ipx_addr01, -+ }, -+ -+ /* End of 23xx firmware list */ -+ { FW_INFO_ADDR_NOMORE, }, -+ -+ /* 2 - Start of 232x firmware list */ -+ { -+ FW_INFO_ADDR_NORMAL, &fw2322ipx_code01[0], -+ &fw2322ipx_length01, &fw2322ipx_addr01, -+ }, -+ { -+ FW_INFO_ADDR_EXTENDED, &rseqipx_code01[0], -+ &rseqipx_code_length01, 0, &rseqipx_code_addr01, -+ }, -+ { -+ FW_INFO_ADDR_EXTENDED, &xseqipx_code01[0], -+ &xseqipx_code_length01, 0, &xseqipx_code_addr01, -+ }, -+ { FW_INFO_ADDR_NOMORE, }, -+ /* 6 - Start of 63xx firmware list */ -+ { -+ FW_INFO_ADDR_NORMAL, &fw2300flx_code01[0], -+ &fw2300flx_length01, &fw2300flx_addr01, -+ }, -+ { FW_INFO_ADDR_NOMORE, }, -+ /* End of 63xx firmware list */ -+ -+ /* 8 - Start of 632x firmware list */ -+ { -+ FW_INFO_ADDR_NORMAL, &fw2322flx_code01[0], -+ &fw2322flx_length01, &fw2322flx_addr01, -+ }, -+ { -+ FW_INFO_ADDR_EXTENDED, &rseqflx_code01[0], -+ &rseqflx_code_length01, 0, &rseqflx_code_addr01, -+ }, -+ { -+ FW_INFO_ADDR_EXTENDED, &xseqflx_code01[0], -+ &xseqflx_code_length01, 0, &xseqflx_code_addr01, -+ }, -+ { FW_INFO_ADDR_NOMORE, }, -+ /* End of firmware list */ -+#endif -+}; -+ -+static struct _qlaboards QLBoardTbl_fc[NUM_OF_ISP_DEVICES] = -+{ -+ /* Name , Board PCI Device ID, Number of ports */ -+#if defined(ISP2300) -+ {"QLA2322 ", QLA2322_DEVICE_ID, MAX_BUSES, -+ &fw2322ipx_version_str[0] , &qla_fw_tbl[ISP232X_FW_INDEX] -+ }, -+ -+ {"QLA2312 ", QLA2312_DEVICE_ID, MAX_BUSES, -+ &fw2300ipx_version_str[0] , &qla_fw_tbl[ISP23XX_FW_INDEX] -+ }, -+ -+ {"QLA2300 ", QLA2300_DEVICE_ID, MAX_BUSES, -+ &fw2300ipx_version_str[0] , &qla_fw_tbl[ISP23XX_FW_INDEX] -+ }, -+ -+ {"QLA6312 ", QLA6312_DEVICE_ID, MAX_BUSES, -+ &fw2300flx_version_str[0] , &qla_fw_tbl[ISP63XX_FW_INDEX] -+ }, -+ -+ {"QLA6322 ", QLA6322_DEVICE_ID, MAX_BUSES, -+ &fw2322flx_version_str[0] , &qla_fw_tbl[ISP632X_FW_INDEX] -+ }, -+#endif -+ -+#if defined(ISP2200) -+ {"QLA2200 ", QLA2200_DEVICE_ID, MAX_BUSES, -+#if defined(FC_IP_SUPPORT) -+ &fw2200ip_version_str[0] , -+ }, -+#else -+ &fw2200tp_version_str[0] , &qla_fw_tbl[ISP22XX_FW_INDEX] -+ }, -+#endif -+#endif -+ -+#if defined(ISP2100) -+ {"QLA2100 ", QLA2100_DEVICE_ID, MAX_BUSES, -+ &fw2100tp_version_str[0] , &qla_fw_tbl[ISP21XX_FW_INDEX] -+ }, -+#endif -+ -+ {" ", 0, 0} -+}; -+ -+ -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_fo.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_fo.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_fo.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_fo.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x --* Copyright (C) 2003 Qlogic Corporation -+* Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -186,6 +186,7 @@ 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; - fc_port_t *fcport; - int ret = 0; - mp_host_t *host = NULL; -@@ -220,9 +221,9 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - - if (ha->flags.failover_enabled) { - if ((host = qla2x00_cfg_find_host(ha)) == NULL) { -- if (ha->fcport) { -- -- /* Since all ports are unconfigured, return -+ if (!list_empty(&ha->fcports)) { -+ /* -+ * Since all ports are unconfigured, return - * a dummy entry for each of them. - */ - if ((list = (FO_LUN_DATA_LIST *)kmem_zalloc( -@@ -241,9 +242,11 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - u_list = (FO_LUN_DATA_LIST *)pext->ResponseAdr; - u_entry = &u_list->DataEntry[0]; - -- for (fcport = ha->fcport; (fcport); -- fcport = fcport->next) { -- -+ list_for_each_entry(fcport, &ha->fcports, -+ list) { -+ if (fcport->port_type != FCT_TARGET) -+ continue; -+ - memcpy(entry->NodeName, - fcport->node_name, - EXT_DEF_WWN_NAME_SIZE); -@@ -275,21 +278,6 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - - list->EntryCount++; - -- 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) { -@@ -335,12 +323,15 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - - /* find the correct fcport list */ - if (!ha->flags.failover_enabled) -- fcport = ha->fcport; -+ fcports = &ha->fcports; - else -- fcport = host->fcport; -+ fcports = host->fcports; - - /* Check thru this adapter's fcport list */ -- for ( ; (fcport); fcport = fcport->next) { -+ fcport = NULL; -+ list_for_each_entry(fcport, fcports, list) { -+ if (fcport->port_type != FCT_TARGET) -+ continue; - - if ((atomic_read(&fcport->state) != FC_ONLINE) && - !qla2x00_is_fcport_in_config(ha, fcport)) { -@@ -357,8 +348,6 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - continue; - } - -- memcpy(entry->NodeName, -- fcport->node_name, EXT_DEF_WWN_NAME_SIZE); - memcpy(entry->PortName, - fcport->port_name, EXT_DEF_WWN_NAME_SIZE); - -@@ -383,17 +372,6 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - - list->EntryCount++; - -- 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) { -@@ -415,7 +393,10 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - * Failover disabled. Just return LUN mask info - * in lun data entry of this port. - */ -+ memcpy(entry->NodeName, -+ fcport->node_name, EXT_DEF_WWN_NAME_SIZE); - entry->TargetId = 0; -+ - for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { - if (!(ostgt = ha->otgt[cnt])) { - continue; -@@ -465,17 +446,6 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - 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)); - -@@ -522,6 +492,16 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - continue; - - /* Got an entry */ -+ if (fcport->flags & FC_XP_DEVICE) { -+ memcpy(entry->NodeName, -+ dp->nodename, -+ EXT_DEF_WWN_NAME_SIZE); -+ } else { -+ memcpy(entry->NodeName, -+ fcport->node_name, -+ EXT_DEF_WWN_NAME_SIZE); -+ } -+ - entry->TargetId = dp->dev_id; - entry->Dev_No = path->id; - list->EntryCount++; -@@ -538,24 +518,14 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - 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);) -+ __func__, u_entry, -+ list->EntryCount);) - pext->Status = EXT_STATUS_COPY_ERR; - break; - } -@@ -587,20 +557,10 @@ qla2x00_fo_get_lun_data(EXT_IOCTL *pext, - __func__, list->EntryCount);) - - if (ret == 0) { -- ret = verify_area(VERIFY_WRITE, (void *)&u_list->EntryCount, -+ /* copy number of entries */ -+ ret = copy_to_user(&u_list->EntryCount, &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; -- } -+ pext->ResponseLen = FO_LUN_DATA_LIST_MAX_SIZE; - } - - KMEM_FREE(list, sizeof(FO_LUN_DATA_LIST)); -@@ -690,17 +650,6 @@ qla2x00_fo_set_lun_data(EXT_IOCTL *pext, - 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 */ -@@ -719,16 +668,6 @@ qla2x00_fo_set_lun_data(EXT_IOCTL *pext, - - 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) { -@@ -860,7 +799,7 @@ qla2x00_fo_get_target_data(EXT_IOCTL *pe - - if (ha->flags.failover_enabled) - if ((host = qla2x00_cfg_find_host(ha)) == NULL && -- ha->fcport == NULL) { -+ list_empty(&ha->fcports)) { - DEBUG2_9_10(printk("%s: no HOST for ha inst %ld.\n", - __func__, ha->instance);) - pext->Status = EXT_STATUS_DEV_NOT_FOUND; -@@ -900,7 +839,6 @@ qla2x00_std_get_tgt(scsi_qla_host_t *ha, - uint16_t i, cnt; - uint32_t b; - -- fcdev_t *pdev; - fc_port_t *fcport; - os_tgt_t *ostgt; - -@@ -909,8 +847,6 @@ qla2x00_std_get_tgt(scsi_qla_host_t *ha, - DEBUG9(printk("%s(%ld): entered.\n", __func__, ha->host_no);) - - u_entry = (FO_DEVICE_DATA *) pext->ResponseAdr; -- /* Failover disabled. Check thru this adapter's fcport list */ -- fcport = ha->fcport; - - if (pext->ResponseLen < sizeof(FO_DEVICE_DATA)) { - pext->Status = EXT_STATUS_BUFFER_TOO_SMALL; -@@ -924,7 +860,15 @@ qla2x00_std_get_tgt(scsi_qla_host_t *ha, - __func__, ha->host_no, pext->ResponseLen);) - - /* Loop through and return ports found. */ -- for (i = 0; fcport && i < MAX_TARGETS; i++, fcport = fcport->next) { -+ /* Check thru this adapter's fcport list */ -+ i = 0; -+ fcport = NULL; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (fcport->port_type != FCT_TARGET) -+ continue; -+ -+ if (i >= MAX_TARGETS) -+ break; - - /* clear for a new entry */ - memset(entry, 0, sizeof(FO_DEVICE_DATA)); -@@ -992,19 +936,7 @@ qla2x00_std_get_tgt(scsi_qla_host_t *ha, - 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(%ld): u_entry %p verify " -- " wrt err. tgt id=%d.\n", -- __func__, ha->host_no, u_entry, cnt);) -- pext->Status = EXT_STATUS_COPY_ERR; -- break; -- } -- -- ret = copy_to_user(u_entry, entry, -- sizeof(FO_DEVICE_DATA)); -+ ret = copy_to_user(u_entry, entry, sizeof(FO_DEVICE_DATA)); - if (ret) { - /* error */ - DEBUG2_9_10(printk("%s(%ld): u_entry %p copy " -@@ -1015,75 +947,11 @@ qla2x00_std_get_tgt(scsi_qla_host_t *ha, - } - - u_entry++; -- -- continue; - } - - DEBUG9(printk("%s(%ld): done copying fcport list entries.\n", - __func__, ha->host_no);) - -- /* For ports not found but were in config file, return unconfigured -- * status so agent will try to issue commands to it and GUI will display -- * them as missing. -- */ -- for (cnt = 0; cnt < MAX_FIBRE_DEVICES; cnt++) { -- pdev = &ha->fc_db[cnt]; -- -- if (pdev->loop_id == PORT_UNUSED) -- continue; -- -- DEBUG9(printk("%s(%ld): found valid loop id %d for tgt %d.\n", -- __func__, ha->host_no, pdev->loop_id, cnt);) -- -- if (pdev->loop_id == PORT_AVAILABLE) { -- DEBUG9(printk( -- "%s(%ld): returning tgt %d as unconfigured.\n", -- __func__, ha->host_no, cnt);) -- -- /* clear for a new entry */ -- memset(entry, 0, sizeof(FO_DEVICE_DATA)); -- -- /* Return unconfigured */ -- memcpy(entry->WorldWideName, -- pdev->name, EXT_DEF_WWN_NAME_SIZE); -- memcpy(entry->PortName, -- pdev->wwn, EXT_DEF_WWN_NAME_SIZE); -- -- for (b = 0; b < 3 ; b++) -- entry->PortId[b] = pdev->d_id.r.d_id[2-b]; -- -- entry->TargetId = cnt; -- entry->MultipathControl = MP_MASK_UNCONFIGURED; -- -- ret = verify_area(VERIFY_WRITE, (void *)u_entry, -- sizeof(FO_DEVICE_DATA)); -- if (ret) { -- /* error */ -- DEBUG2_9_10(printk("%s(%ld): u_entry %p verify " -- " wrt err. tgt id=%d.\n", -- __func__, ha->host_no, 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(%ld): u_entry %p copy " -- "out err. tgt id=%d.\n", -- __func__, ha->host_no, u_entry, cnt);) -- pext->Status = EXT_STATUS_COPY_ERR; -- break; -- } -- -- u_entry++; -- } -- } -- -- DEBUG9(printk("%s(%ld): done copying unconfigured dev entries.\n", -- __func__, ha->host_no);) -- - DEBUG9(printk("%s(%ld): exiting. ret = %d.\n", - __func__, ha->host_no, ret);) - -@@ -1095,7 +963,6 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - EXT_IOCTL *pext, FO_DEVICE_DATA *entry) - { - int ret = 0; -- uint8_t i; - uint8_t path_id; - uint16_t dev_no; - uint32_t b; -@@ -1116,14 +983,14 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - * ha as unconfigured devices. ha should never be NULL. - */ - if (host == NULL) { -- fcport = ha->fcport; -- -- /* Check thru fcport list and return Unconfigured on all -- * ports found. -- */ -- for (i = 0; fcport && i < MAX_TARGETS; -- i++, fcport = fcport->next, cnt++) { -- -+ /* Loop through and return ports found. */ -+ /* Check thru this adapter's fcport list */ -+ cnt = 0; -+ fcport = NULL; -+ list_for_each_entry(fcport, &ha->fcports, list) { -+ if (fcport->port_type != FCT_TARGET) -+ continue; -+ - if (atomic_read(&fcport->state) != FC_ONLINE) { - /* no need to report */ - DEBUG2_9_10(printk("%s(%ld): not reporting " -@@ -1139,6 +1006,10 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - continue; - } - -+ cnt++; -+ if (cnt >= MAX_TARGETS) -+ break; -+ - /* clear for a new entry */ - memset(entry, 0, sizeof(FO_DEVICE_DATA)); - -@@ -1175,17 +1046,6 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - entry->TargetId, entry->Dev_No, - entry->MultipathControl);) - -- ret = verify_area(VERIFY_WRITE, (void *)u_entry, -- sizeof(FO_DEVICE_DATA)); -- if (ret) { -- /* error */ -- DEBUG2_9_10(printk("%s(%ld): u_entry %p " -- "verify wrt err. no tgt id.\n", -- __func__, host->ha->host_no, u_entry);) -- pext->Status = EXT_STATUS_COPY_ERR; -- break; -- } -- - ret = copy_to_user(u_entry, entry, - sizeof(FO_DEVICE_DATA)); - if (ret) { -@@ -1208,12 +1068,14 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - } - - /* Check thru fcport list on host */ -- fcport = host->fcport; -- -- /* Check thru fcport list and return data on online ports found. */ -- for (i = 0; fcport && i < MAX_TARGETS; i++, fcport = fcport->next, -- cnt++) { -- -+ /* Loop through and return online ports found. */ -+ /* Check thru this adapter's fcport list */ -+ cnt = 0; -+ fcport = NULL; -+ list_for_each_entry(fcport, host->fcports, list) { -+ if (fcport->port_type != FCT_TARGET) -+ continue; -+ - if ((atomic_read(&fcport->state) != FC_ONLINE) && - !qla2x00_is_fcport_in_config(ha, fcport)) { - /* no need to report */ -@@ -1230,11 +1092,13 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - continue; - } - -+ cnt++; -+ if (cnt >= MAX_TARGETS) -+ break; -+ - /* clear for a new entry */ - memset(entry, 0, sizeof(FO_DEVICE_DATA)); - -- memcpy(entry->WorldWideName, -- fcport->node_name, EXT_DEF_WWN_NAME_SIZE); - memcpy(entry->PortName, - fcport->port_name, EXT_DEF_WWN_NAME_SIZE); - -@@ -1258,6 +1122,12 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - DEBUG9_10(printk("%s(%ld): fcport mpbyte=%02x. " - "return unconfigured. ", - __func__, host->ha->host_no, fcport->mp_byte);) -+ printk(KERN_INFO "%s(%ld): fcport mpbyte=%02x. " -+ "return unconfigured. ", -+ __func__, host->ha->host_no, fcport->mp_byte); -+ -+ memcpy(entry->WorldWideName, -+ fcport->node_name, EXT_DEF_WWN_NAME_SIZE); - - entry->TargetId = fcport->dev_id; - entry->Dev_No = 0; -@@ -1267,18 +1137,6 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - entry->TargetId, entry->Dev_No, - entry->MultipathControl);) - -- ret = verify_area(VERIFY_WRITE, (void *)u_entry, -- sizeof(FO_DEVICE_DATA)); -- if (ret) { -- /* error */ -- DEBUG2_9_10(printk("%s(%ld): u_entry %p " -- "verify wrt err. tgt id=%d.\n", -- __func__, host->ha->host_no, u_entry, -- fcport->dev_id);) -- pext->Status = EXT_STATUS_COPY_ERR; -- break; -- } -- - ret = copy_to_user(u_entry, entry, - sizeof(FO_DEVICE_DATA)); - if (ret) { -@@ -1323,6 +1181,18 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - entry->PortName)) - continue; - -+ if (fcport->flags & FC_XP_DEVICE) { -+ memcpy(entry->WorldWideName, -+ dp->nodename, -+ EXT_DEF_WWN_NAME_SIZE); -+DEBUG4(printk(KERN_INFO "%s XP device:copy the node name from mp_dev:%0x\n",__func__,dp->nodename[7]);) -+ } else { -+ memcpy(entry->WorldWideName, -+ fcport->node_name, -+ EXT_DEF_WWN_NAME_SIZE); -+DEBUG4(printk(KERN_INFO "%s :copy the node name from fcport:%0x\n",__func__,dp->nodename[7]);) -+ } -+ - entry->TargetId = dp->dev_id; - entry->Dev_No = path->id; - -@@ -1339,18 +1209,6 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - __func__, host->ha->host_no, - path->id, entry->MultipathControl);) - -- ret = verify_area(VERIFY_WRITE, (void *)u_entry, -- sizeof(FO_DEVICE_DATA)); -- if (ret) { -- /* error */ -- DEBUG2_9_10(printk("%s(%ld): u_entry %p" -- " verify wrt err. tgt id=%d.\n", -- __func__, host->ha->host_no, -- 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) { -@@ -1441,17 +1299,6 @@ qla2x00_fo_get_tgt(mp_host_t *host, scsi - path->portname[4], path->portname[5], - path->portname[6], path->portname[7]);) - -- 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) { -@@ -1544,18 +1391,7 @@ qla2x00_fo_set_target_data(EXT_IOCTL *pe - 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", -@@ -1699,19 +1535,7 @@ qla2x00_fo_ioctl(scsi_qla_host_t *ha, in - __func__, pext->RequestLen);) - - } else { -- -- rval = verify_area(VERIFY_READ, -- (void *)pext->RequestAdr, in_size); -- if (rval) { -- /* error */ -- DEBUG2_9_10(printk("%s: req buf verify read " -- "error. size=%ld.\n", -- __func__, (ulong)in_size);) -- pext->Status = EXT_STATUS_COPY_ERR; -- } -- rval = copy_from_user(&buff, -- (void *)pext->RequestAdr, in_size); -- -+ rval = copy_from_user(&buff, pext->RequestAdr, in_size); - if (rval) { - DEBUG2_9_10(printk("%s: req buf copy error. " - "size=%ld.\n", -@@ -1738,25 +1562,31 @@ qla2x00_fo_ioctl(scsi_qla_host_t *ha, in - - switch (ioctl_code) { - case FO_CC_GET_PARAMS: -+ DEBUG4(printk(KERN_INFO "calling qla2x00_fo_get_param\n");) - rval = qla2x00_fo_get_params(&buff.params); - break; - case FO_CC_SET_PARAMS: -+ DEBUG4(printk(KERN_INFO "calling qla2x00_fo_set_param\n");) - rval = qla2x00_fo_set_params(&buff.params); - break; - case FO_CC_GET_PATHS: -+ DEBUG4(printk(KERN_INFO "calling qla2x00_fo_get_paths\n");) - rval = qla2x00_cfg_get_paths(pext, - &buff.path,mode); - if (rval != 0) - out_size = 0; - break; - case FO_CC_SET_CURRENT_PATH: -+ DEBUG4(printk(KERN_INFO "calling qla2x00_fo_set_paths\n");) - rval = qla2x00_cfg_set_current_path(pext, - &buff.set_path,mode); - break; - case FO_CC_RESET_HBA_STAT: -+ DEBUG4(printk(KERN_INFO "calling qla2x00_fo_reset_hba_stat\n");) - rval = qla2x00_fo_stats(&buff.stat, TRUE); - break; - case FO_CC_GET_HBA_STAT: -+ DEBUG4(printk(KERN_INFO "calling qla2x00_fo_get_hba_stat\n");) - rval = qla2x00_fo_stats(&buff.stat, FALSE); - break; - case FO_CC_GET_LUN_DATA: -@@ -1802,21 +1632,9 @@ qla2x00_fo_ioctl(scsi_qla_host_t *ha, in - - } - -- if (rval == 0 && (pext->ResponseLen = out_size) != 0) { -- rval = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, -- out_size); -- if (rval != 0) { -- DEBUG10(printk("%s: resp buf very write error.\n", -- __func__);) -- pext->Status = EXT_STATUS_COPY_ERR; -- } -- } -- - if (rval == 0) { -- rval = copy_to_user((void *)pext->ResponseAdr, -- &buff, out_size); -- -- if (rval != 0) { -+ rval = copy_to_user(pext->ResponseAdr, &buff, out_size); -+ if (rval) { - DEBUG10(printk("%s: resp buf copy error. size=%ld.\n", - __func__, (ulong)out_size);) - pext->Status = EXT_STATUS_COPY_ERR; -@@ -1858,6 +1676,7 @@ qla2x00_fo_count_retries(scsi_qla_host_t - BOOL retry = TRUE; - os_lun_t *lq; - os_tgt_t *tq; -+ scsi_qla_host_t *vis_ha; - - DEBUG9(printk("%s: entered.\n", __func__);) - -@@ -1897,7 +1716,9 @@ qla2x00_fo_count_retries(scsi_qla_host_t - sp->f_start=jiffies;/*ra 10/29/01*/ - /* Now queue it on to be failover */ - sp->ha = ha; -- add_to_failover_queue(ha,sp); -+ /* we can only failover using the visible HA */ -+ vis_ha = (scsi_qla_host_t *) sp->cmd->host->hostdata; -+ add_to_failover_queue(vis_ha,sp); - } - } - -@@ -1906,6 +1727,53 @@ qla2x00_fo_count_retries(scsi_qla_host_t - return retry ; - } - -+BOOL -+qla2x00_fo_check_device(scsi_qla_host_t *ha, srb_t *sp) -+{ -+ -+ BOOL retry = FALSE; -+ os_lun_t *lq; -+ Scsi_Cmnd *cp; -+ fc_port_t *fcport; -+ -+ if ( !(sp->flags & SRB_GOT_SENSE) ) -+ return retry; -+ -+ cp = sp->cmd; -+ lq = sp->lun_queue; -+ fcport = lq->fclun->fcport; -+ switch (cp->sense_buffer[2] & 0xf) { -+ -+ case NOT_READY: -+ if ( (fcport->flags & (FC_MSA_DEVICE|FC_EVA_DEVICE)) ) { -+ /* -+ * if we can't access port -+ */ -+ if ((cp->sense_buffer[12] == 0x4 && -+ cp->sense_buffer[13] == 0x0)) { -+ sp->err_id = SRB_ERR_DEVICE; -+ return (TRUE); -+ } -+ } -+ break; -+ -+ case UNIT_ATTENTION: -+ if ( (fcport->flags & FC_EVA_DEVICE) ) { -+ if ((cp->sense_buffer[12] == 0xa && -+ cp->sense_buffer[13] == 0x8)) { -+ sp->err_id = SRB_ERR_DEVICE; -+ return (TRUE); -+ } -+ if ((cp->sense_buffer[12] == 0xa && -+ cp->sense_buffer[13] == 0x9)) { -+ /* failback lun */ -+ } -+ } -+ break; -+ -+ } /* end of switch */ -+ return (retry); -+} - - /* - * qla2x00_fo_check -@@ -1953,7 +1821,9 @@ qla2x00_fo_check(scsi_qla_host_t *ha, sr - - /* we failover on selction timeouts only */ - host_status = CMD_RESULT(sp->cmd) >>16; -- if( host_status == DID_NO_CONNECT) { -+ if( host_status == DID_NO_CONNECT || -+ qla2x00_fo_check_device(ha, sp) ) { -+ - if( qla2x00_fo_count_retries(ha,sp) ) { - /* Force a retry on this request, it will - * cause the LINUX timer to get reset, while we -@@ -1968,6 +1838,12 @@ qla2x00_fo_check(scsi_qla_host_t *ha, sr - sp->cmd->serial_number, - sp, sp->fo_retry_cnt, - retry, reason[host_status]);) -+ DEBUG(printk("qla2x00_fo_check: pid= %ld sp %p " -+ "retry count=%d, retry flag = %d, " -+ "host status=%d\n\r", -+ sp->cmd->serial_number, -+ sp, sp->fo_retry_cnt, -+ retry, host_status);) - } - - DEBUG9(printk("%s: exiting. retry = %d.\n", __func__, retry);) -@@ -2135,10 +2011,11 @@ static int - qla2x00_spinup(scsi_qla_host_t *ha, fc_port_t *fcport, uint16_t lun) - { - inq_cmd_rsp_t *pkt; -- int rval, count, retry; -+ int rval = QLA2X00_SUCCESS; -+ int count, retry; - dma_addr_t phys_address = 0; -- uint16_t comp_status; -- uint16_t scsi_status; -+ uint16_t comp_status = CS_COMPLETE; -+ uint16_t scsi_status = 0; - - ENTER(__func__); - -@@ -2149,24 +2026,34 @@ qla2x00_spinup(scsi_qla_host_t *ha, fc_p - printk(KERN_WARNING - "scsi(%ld): Memory Allocation failed - INQ\n", - ha->host_no); -+ return( QLA2X00_FAILED); - } - -- count = 100; -- retry = 10; -- do { -+ count = 5; -+ retry = 5; -+ if (atomic_read(&fcport->state) != FC_ONLINE){ -+ DEBUG2(printk("scsi(%ld) %s leaving: Port 0x%02x is not ONLINE\n", -+ ha->host_no,__func__,fcport->loop_id);) -+ rval = QLA2X00_FAILED; -+ } -+ else do { - /* issue spinup */ - 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); -+#else - pkt->p.cmd.target = (uint8_t)fcport->loop_id; -+#endif - /* no direction for this command */ - pkt->p.cmd.control_flags = - __constant_cpu_to_le16(CF_SIMPLE_TAG); - pkt->p.cmd.scsi_cdb[0] = START_STOP; - pkt->p.cmd.scsi_cdb[4] = 1; /* start spin cycle */ - pkt->p.cmd.dseg_count = __constant_cpu_to_le16(0); -- pkt->p.cmd.timeout = __constant_cpu_to_le16(10); -+ pkt->p.cmd.timeout = __constant_cpu_to_le16(20); - pkt->p.cmd.byte_count = __constant_cpu_to_le32(0); - - rval = qla2x00_issue_iocb(ha, pkt, -@@ -2175,6 +2062,15 @@ qla2x00_spinup(scsi_qla_host_t *ha, fc_p - comp_status = le16_to_cpu(pkt->p.rsp.comp_status); - scsi_status = le16_to_cpu(pkt->p.rsp.scsi_status); - -+ /* Port Logged Out, so don't retry */ -+ if( comp_status == CS_PORT_LOGGED_OUT || -+ comp_status == CS_PORT_CONFIG_CHG || -+ comp_status == CS_PORT_BUSY || -+ comp_status == CS_INCOMPLETE || -+ comp_status == CS_PORT_UNAVAILABLE ) { -+ break; -+ } -+ - if ( (scsi_status & SS_CHECK_CONDITION) ) { - DEBUG2(printk("%s(%ld): SS_CHECK_CONDITION " - "Sense Data " -@@ -2203,9 +2099,11 @@ qla2x00_spinup(scsi_qla_host_t *ha, fc_p - retry--; - } - -- printk("qla_fo: Sending Start - count %d, retry=%d" -- "comp status 0x%x, " -+ printk(KERN_INFO -+ "qla_fo(%ld): Sending Start - count %d, retry=%d" -+ " comp status 0x%x, " - "scsi status 0x%x, rval=%d\n", -+ ha->host_no, - count, - retry, - comp_status, -@@ -2226,15 +2124,17 @@ qla2x00_spinup(scsi_qla_host_t *ha, fc_p - comp_status != CS_COMPLETE || - (scsi_status & SS_CHECK_CONDITION)) { - -- DEBUG(printk("qla_fo: Failed spinup - " -+ DEBUG(printk("qla_fo(%ld): Failed spinup - " - "comp status 0x%x, " - "scsi status 0x%x. loop_id=%d\n", -+ ha->host_no, - comp_status, - scsi_status, - fcport->loop_id);) -+ rval = QLA2X00_FAILED; - } - -- pci_free_consistent(ha->pdev, sizeof(rpt_lun_cmd_rsp_t), -+ pci_free_consistent(ha->pdev, sizeof(inq_cmd_rsp_t), - pkt, phys_address); - - -@@ -2272,6 +2172,11 @@ qla2x00_send_fo_notification(fc_lun_t *o - ENTER("qla2x00_send_fo_notification"); - DEBUG3(printk("%s: entered.\n", __func__);) - -+ if( new_lp->fcport == NULL ){ -+ DEBUG2(printk("qla2x00_send_fo_notification: No " -+ "new fcport for lun pointer\n");) -+ return QLA2X00_FAILED; -+ } - loop_id = new_lp->fcport->loop_id; - lun = new_lp->lun; - -@@ -2302,8 +2207,10 @@ qla2x00_send_fo_notification(fc_lun_t *o - - } - -- if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_SPINUP) { -- qla2x00_spinup(new_lp->fcport->ha, new_lp->fcport, new_lp->lun); -+ if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_SPINUP || -+ new_lp->fcport->notify_type == FO_NOTIFY_TYPE_SPINUP ) { -+ rval = qla2x00_spinup(new_lp->fcport->ha, new_lp->fcport, -+ new_lp->lun); - } - - if (qla_fo_params.FailoverNotifyType == FO_NOTIFY_TYPE_CDB) { -@@ -2320,7 +2227,11 @@ qla2x00_send_fo_notification(fc_lun_t *o - 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(loop_id); -+#else - pkt->p.cmd.target = (uint8_t)loop_id; -+#endif - /* FIXME: How do you know the direction ???? */ - /* This has same issues as passthur commands - you - * need more than just the CDB. -@@ -2332,9 +2243,9 @@ qla2x00_send_fo_notification(fc_lun_t *o - 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( -- pci_dma_lo32(phys_address + sizeof(sts_entry_t))); -+ LSD(phys_address + sizeof(sts_entry_t))); - pkt->p.cmd.dseg_0_address[1] = cpu_to_le32( -- pci_dma_hi32(phys_address + sizeof(sts_entry_t))); -+ 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, -@@ -2536,19 +2447,6 @@ qla2x00_fo_missing_port_summary(scsi_qla - sizeof(EXT_DEVICEDATAENTRY); - - transfer_size = sizeof(EXT_DEVICEDATAENTRY); -- ret = verify_area(VERIFY_WRITE, -- (void *)(pstart_of_entry_list + -- current_offset), transfer_size); -- -- if (ret) { -- *ret_status = EXT_STATUS_COPY_ERR; -- DEBUG10(printk("%s(%ld): inst=%ld " -- "ERROR verify wrt rsp bufaddr=%p\n", -- __func__, ha->host_no, ha->instance, -- (void *)(pstart_of_entry_list + -- current_offset));) -- break; -- } - - /* now copy up this dd_entry to user */ - usr_temp = (uint8_t *)pstart_of_entry_list + -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_fo.cfg linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_fo.cfg ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_fo.cfg 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_fo.cfg 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -20,10 +20,10 @@ - /* - * QLogic ISP2x00 Multi-path LUN Support Driver - */ --static int MaxPathsPerDevice = 0; --static int MaxRetriesPerPath = 0; --static int MaxRetriesPerIo = 0; --static int qlFailoverNotifyType = 0; -+int MaxPathsPerDevice = 0; -+int MaxRetriesPerPath = 0; -+int MaxRetriesPerIo = 0; -+int qlFailoverNotifyType = 0; - #if defined(MODULE) - /* insmod qla2100 <options> ql2xopts=<string> */ - MODULE_PARM(MaxPathsPerDevice, "i"); -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_fo.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_fo.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_fo.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_fo.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_gbl.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_gbl.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_gbl.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_gbl.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x --* Copyright (C) 2003 Qlogic Corporation -+* Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -29,20 +29,26 @@ extern "C" - #endif - - #include "exioct.h" -+ -+#if !defined(ISP200) -+ - #include "qla_fo.h" - - /* - * Global Data in qla_fo.c source file. - */ - extern SysFoParams_t qla_fo_params; -+#endif - /* - * Global Function Prototypes in qla2x00.c source file. - */ --static int qla2x00_get_prop_xstr(scsi_qla_host_t *, char *, uint8_t *, int); -+extern int qla2x00_get_prop_xstr(scsi_qla_host_t *, char *, uint8_t *, int); - - extern void qla2x00_formatted_print(char *, uint64_t , uint8_t, uint8_t); - extern void qla2x00_formatted_dump_buffer(char *, uint8_t *, uint8_t , - uint32_t ); -+extern inline void *kmem_zalloc( int siz, int code, int id); -+#if !defined(ISP200) - extern uint32_t qla2x00_fo_path_change(uint32_t , - fc_lun_t *, fc_lun_t *); - extern scsi_qla_host_t *qla2x00_get_hba(int); -@@ -65,6 +71,7 @@ extern BOOL mp_config_required; - 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 int qla2x00_cfg_remap(scsi_qla_host_t *); - 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); -@@ -77,15 +84,19 @@ extern mp_host_t * qla2x00_alloc_host(sc - extern BOOL 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); -+extern int16_t qla2x00_cfg_lookup_device(unsigned char *response_data); -+extern int qla2x00_combine_by_lunid( void *host, uint16_t dev_id, -+ fc_port_t *port, uint16_t pathid); -+extern int qla2x00_export_target( void *host, uint16_t dev_id, -+ fc_port_t *port, uint16_t pathid); - - /* - * Global Function Prototypes in qla_cfgln.c source file. - */ --extern inline void *kmem_zalloc( int siz, int code, int id); - extern void qla2x00_cfg_build_path_tree( scsi_qla_host_t *ha); - extern BOOL qla2x00_update_mp_device(mp_host_t *, fc_port_t *, uint16_t, - uint16_t); --extern void qla2x00_cfg_display_devices(void); -+extern void qla2x00_cfg_display_devices( int flag ); - - /* - * Global Function Prototypes in qla_ioctl.c source file. -@@ -95,6 +106,26 @@ extern int qla2x00_fo_missing_port_summa - EXT_DEVICEDATAENTRY *, void *, uint32_t, uint32_t *, uint32_t *); - extern UINT8 - qla2x00_is_fcport_in_config(scsi_qla_host_t *ha, fc_port_t *fcport); -+extern UINT8 -+qla2x00_is_fcport_in_foconfig(scsi_qla_host_t *ha, fc_port_t *fcport); -+#endif -+ -+/* -+ * Global Function Prototypes for qla_gs.c functions -+ */ -+extern int -+qla2x00_mgmt_svr_login(scsi_qla_host_t *); -+extern void -+qla2x00_fdmi_srb_tmpmem_free(srb_t *); -+extern void -+qla2x00_fdmi_register(scsi_qla_host_t *); -+extern void -+qla2x00_fdmi_register_intr(scsi_qla_host_t *); -+ -+#if defined(QLA_CONFIG_COMPAT) -+extern int qla2x00_ioctl32(unsigned int, unsigned int, unsigned long, -+ struct file *); -+#endif - - #if defined(__cplusplus) - } -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_gs.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_gs.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_gs.c 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_gs.c 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,1647 @@ -+/****************************************************************************** -+ * 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. -+ * -+ ******************************************************************************/ -+ -+#define QLA_INIT_FDMI_CTIU_HDR(ha, ct_hdr) \ -+ ct_hdr.revision = GS4_REVISION; \ -+ ct_hdr.gs_type = GS_TYPE_MGMT_SERVER; \ -+ ct_hdr.gs_subtype = GS_SUBTYPE_FDMI_HBA; -+ -+struct ct_info { -+ uint16_t ct_cmd; -+ void *pct_buf; -+ dma_addr_t ct_buf_dma_addr; -+}; -+ -+ -+/* Local functions */ -+static __inline__ void -+qla2x00_init_ms_mbx_iocb(scsi_qla_host_t *, uint32_t, uint32_t, uint16_t, -+ uint16_t, uint16_t); -+ -+static __inline__ ms_iocb_entry_t * -+qla2x00_alloc_ms_mbx_iocb(scsi_qla_host_t *); -+ -+static __inline__ void -+qla2x00_free_ms_mbx_iocb(scsi_qla_host_t *); -+ -+static __inline__ int -+qla2x00_fdmi_ctiu_mem_alloc(scsi_qla_host_t *, size_t); -+ -+static __inline__ void -+qla2x00_fdmi_ctiu_mem_free(scsi_qla_host_t *, size_t); -+ -+static __inline__ void -+qla2x00_fdmi_setup_hbaattr(scsi_qla_host_t *, hba_attr_t *); -+ -+static __inline__ void -+qla2x00_fdmi_setup_rhbainfo(scsi_qla_host_t *, ct_iu_rhba_t *); -+ -+static __inline__ void -+qla2x00_fdmi_setup_rhatinfo(scsi_qla_host_t *, ct_iu_rhat_t *); -+ -+static __inline__ void -+qla2x00_fdmi_setup_rpainfo(scsi_qla_host_t *, ct_iu_rpa_t *); -+ -+static __inline__ void -+qla2x00_fdmi_srb_init(scsi_qla_host_t *, srb_t *, uint16_t, uint16_t); -+ -+static __inline__ void -+qla2x00_init_req_q_ms_iocb(scsi_qla_host_t *, ms_iocb_entry_t *, -+ dma_addr_t, size_t, size_t, uint8_t, uint16_t, uint16_t); -+ -+static __inline__ int -+qla2x00_fdmi_srb_tmpmem_alloc(scsi_qla_host_t *ha, srb_t *sp); -+ -+static __inline__ int -+qla2x00_fdmi_sc_request_dev_bufs_alloc(scsi_qla_host_t *, Scsi_Cmnd *); -+ -+static __inline__ void -+qla2x00_fdmi_sc_request_dev_bufs_free(Scsi_Cmnd *); -+ -+STATIC int -+qla2x00_fdmi_cmnd_srb_alloc(scsi_qla_host_t *, srb_t **); -+ -+STATIC void -+qla2x00_fdmi_cmnd_srb_free(scsi_qla_host_t *, srb_t *); -+ -+STATIC int -+qla2x00_fdmi_rhba(scsi_qla_host_t *, uint8_t *); -+ -+STATIC int -+qla2x00_fdmi_ghat(scsi_qla_host_t *, ct_iu_ghat_rsp_t *, uint8_t *); -+ -+STATIC int -+qla2x00_fdmi_rpa(scsi_qla_host_t *, uint8_t *); -+ -+STATIC int -+qla2x00_fdmi_dhba(scsi_qla_host_t *, uint8_t *); -+ -+STATIC int -+qla2x00_fdmi_rhba_intr(scsi_qla_host_t *); -+ -+STATIC int -+qla2x00_fdmi_rhat_intr(scsi_qla_host_t *, Scsi_Cmnd *, void *, dma_addr_t); -+ -+STATIC int -+qla2x00_fdmi_rpa_intr(scsi_qla_host_t *, Scsi_Cmnd *, void *, dma_addr_t); -+ -+STATIC void -+qla2x00_fdmi_done(Scsi_Cmnd *); -+ -+/* functions to export */ -+int -+qla2x00_mgmt_svr_login(scsi_qla_host_t *ha); -+ -+void -+qla2x00_fdmi_srb_tmpmem_free(srb_t *sp); -+ -+void -+qla2x00_fdmi_register(scsi_qla_host_t *); -+ -+void -+qla2x00_fdmi_register_intr(scsi_qla_host_t *); -+ -+ -+/* -+ * qla2x00_mgmt_svr_login -+ * Login management server. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+int -+qla2x00_mgmt_svr_login(scsi_qla_host_t *ha) -+{ -+ int tmp_rval = 0; -+ uint16_t mb[MAILBOX_REGISTER_COUNT]; -+ -+ DEBUG13(printk("%s(%ld): entered\n", -+ __func__, ha->host_no);) -+ -+ /* 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) { -+ -+ DEBUG2_13(printk( -+ "%s(%ld): inst=%ld ERROR login to MS.\n", -+ __func__, ha->host_no, ha->instance);) -+ -+ return (QL_STATUS_ERROR); -+ } -+ -+ ha->flags.management_server_logged_in = 1; -+ DEBUG13(printk("%s(%ld): success login to MS.\n", -+ __func__, ha->host_no);) -+ } -+ -+ DEBUG13(printk("%s(%ld): exiting.\n", -+ __func__, ha->host_no);) -+ -+ return (QL_STATUS_SUCCESS); -+} -+ -+/* -+ * qla2x00_fdmi_register -+ * Uses execute iocb mbx command to perform fdmi registration -+ * functions. If functions cannot be performed or returned -+ * error, just return without error, since this is not a critical -+ * function that must succeed. -+ * It is assumed the driver has already login to management svr. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * -+ * Returns: -+ * void -+ * -+ * Context: -+ * Kernel context. -+ */ -+void -+qla2x00_fdmi_register(scsi_qla_host_t *ha) -+{ -+ int rval; -+ uint8_t fdmi_stat = FDMI_STAT_OK; -+ ms_iocb_entry_t *ms_pkt; -+ ct_iu_ghat_rsp_t tmp_hat_buf; -+ ct_iu_rhba_t hba_buf; -+ -+ DEBUG13(printk("%s(%ld): entered.\n", __func__, ha->host_no);) -+ -+ /* allocate MSIOCB */ -+ ms_pkt = qla2x00_alloc_ms_mbx_iocb(ha); -+ -+ if (ms_pkt == NULL) { -+ /* error cannot perform register functions */ -+ DEBUG2_13(printk("%s(%ld): MSIOCB alloc failed.\n", -+ __func__, ha->host_no);) -+ return; -+ } -+ -+ /* register HBA */ -+ rval = qla2x00_fdmi_rhba(ha, &fdmi_stat); -+ -+ /* if already registered, get and compare HBA attributes */ -+ if (rval != QL_STATUS_SUCCESS) { -+ if (fdmi_stat == FDMI_STAT_ALREADY_REGISTERED) { -+ DEBUG2_13(printk("%s(%ld): HBA already registered. " -+ "Get/compare attributes.\n", -+ __func__, ha->host_no);) -+ -+ if (qla2x00_fdmi_ghat(ha, &tmp_hat_buf, &fdmi_stat)) { -+ /* error */ -+ DEBUG2_13(printk("%s(%ld): GHAT failed. " -+ "De-registering.\n", -+ __func__, ha->host_no);) -+ /* deregister and return */ -+ qla2x00_fdmi_dhba(ha, &fdmi_stat); -+ return; -+ } -+ } else { -+ /* error */ -+ DEBUG2_13(printk("%s(%ld): RHBA failed. exiting.\n", -+ __func__, ha->host_no);) -+ return; -+ } -+ -+ DEBUG13(printk("%s(%ld): ghat rsp buf dump:\n", -+ __func__, ha->host_no);) -+ DEBUG13(qla2x00_dump_buffer((uint8_t*)&tmp_hat_buf.plist, -+ sizeof(reg_port_list_t) + sizeof(hba_attr_t));) -+ -+ /* rebuild hba values locally and compare; if different -+ * attribute values, de-register and register the hba. -+ */ -+ memset(&hba_buf, 0, sizeof(ct_iu_rhba_t)); -+ qla2x00_fdmi_setup_rhbainfo(ha, &hba_buf); -+ -+ DEBUG13(printk("%s(%ld): compare hba buf dump:\n", -+ __func__, ha->host_no);) -+ DEBUG13(qla2x00_dump_buffer((uint8_t*)&hba_buf.plist, -+ sizeof(reg_port_list_t) + sizeof(hba_attr_t));) -+ -+ if (memcmp(&hba_buf.plist, &tmp_hat_buf.plist, -+ sizeof(reg_port_list_t) + sizeof(hba_attr_t)) != 0) { -+ /* deregister and re-register */ -+ DEBUG13(printk("%s(%ld): different attributes already " -+ "registered. deregistering...\n", -+ __func__, ha->host_no);) -+ -+ rval = qla2x00_fdmi_dhba(ha, &fdmi_stat); -+ if (rval != QL_STATUS_SUCCESS) { -+ /* error */ -+ DEBUG2_13(printk("%s(%ld): DHBA failed.\n", -+ __func__, ha->host_no);) -+ return; -+ } -+ -+ DEBUG13(printk("%s(%ld): deregister HBA success. " -+ "re-registering...\n", -+ __func__, ha->host_no);) -+ -+ /* try again */ -+ rval = qla2x00_fdmi_rhba(ha, &fdmi_stat); -+ if (rval != QL_STATUS_SUCCESS || -+ fdmi_stat != FDMI_STAT_OK) { -+ /* error */ -+ DEBUG2_13(printk( -+ "%s(%ld): RHBA failed again-exiting.\n", -+ __func__, ha->host_no);) -+ return; -+ } -+ } -+ } -+ -+ /* register port attributes. This call should always succeed -+ * if the command is supported. -+ */ -+ qla2x00_fdmi_rpa(ha, &fdmi_stat); -+ -+ /* free MSIOCB */ -+ qla2x00_free_ms_mbx_iocb(ha); -+ -+ DEBUG13(printk("%s(%ld): exiting\n", __func__, ha->host_no);) -+} -+ -+static __inline__ int -+qla2x00_fdmi_srb_tmpmem_alloc(scsi_qla_host_t *ha, srb_t *sp) -+{ -+ if (sp == NULL) { -+ return (QL_STATUS_ERROR); -+ } -+ -+ /* initialize for proper handling of error case */ -+ sp->tgt_queue = NULL; -+ sp->lun_queue = NULL; -+ sp->fclun = NULL; -+ -+ sp->tgt_queue = KMEM_ZALLOC(sizeof(os_tgt_t), 60); -+ if (sp->tgt_queue == NULL) { -+ DEBUG2_13(printk(KERN_WARNING -+ "%s(%ld): ERROR in tmp tgt queue allocation.\n", -+ __func__, ha->host_no);) -+ qla2x00_fdmi_srb_tmpmem_free(sp); -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ sp->lun_queue = KMEM_ZALLOC(sizeof(os_lun_t), 61); -+ if (sp->lun_queue == NULL) { -+ DEBUG2_13(printk(KERN_WARNING -+ "%s(%ld): ERROR in tmp lun queue allocation.\n", -+ __func__, ha->host_no);) -+ qla2x00_fdmi_srb_tmpmem_free(sp); -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ sp->fclun = KMEM_ZALLOC(sizeof(fc_lun_t), 62); -+ if (sp->fclun == NULL) { -+ DEBUG2_13(printk(KERN_WARNING -+ "%s(%ld): ERROR in tmp fclun queue allocation.\n", -+ __func__, ha->host_no);) -+ qla2x00_fdmi_srb_tmpmem_free(sp); -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ sp->fclun->fcport = KMEM_ZALLOC(sizeof(fc_port_t), 63); -+ if (sp->fclun->fcport == NULL) { -+ DEBUG2_13(printk(KERN_WARNING -+ "%s(%ld): ERROR in tmp fcport queue allocation.\n", -+ __func__, ha->host_no);) -+ qla2x00_fdmi_srb_tmpmem_free(sp); -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ return (QL_STATUS_SUCCESS); -+} -+ -+void -+qla2x00_fdmi_srb_tmpmem_free(srb_t *sp) -+{ -+ if (sp->fclun != NULL) { -+ if (sp->fclun->fcport != NULL) { -+ KMEM_FREE(sp->fclun->fcport, sizeof(fc_port_t)); -+ } -+ -+ KMEM_FREE(sp->fclun, sizeof(fc_lun_t)); -+ } -+ -+ if (sp->lun_queue != NULL) { -+ KMEM_FREE(sp->lun_queue, sizeof(os_lun_t)); -+ } -+ -+ if (sp->tgt_queue != NULL) { -+ KMEM_FREE(sp->tgt_queue, sizeof(os_tgt_t)); -+ } -+ -+} -+ -+static __inline__ int -+qla2x00_fdmi_sc_request_dev_bufs_alloc(scsi_qla_host_t *ha, Scsi_Cmnd *pcmd) -+{ -+ -+ pcmd->device = KMEM_ZALLOC(sizeof(Scsi_Device), 66); -+ if (pcmd->device == NULL) { -+ /* error */ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ pcmd->sc_request = KMEM_ZALLOC(sizeof(Scsi_Request), 67); -+ if (pcmd->sc_request == NULL) { -+ /* error */ -+ qla2x00_fdmi_sc_request_dev_bufs_free(pcmd); -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ pcmd->sc_request->sr_buffer = KMEM_ZALLOC(sizeof(struct ct_info), 68); -+ if (pcmd->sc_request->sr_buffer == NULL) { -+ /* error */ -+ qla2x00_fdmi_sc_request_dev_bufs_free(pcmd); -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ return (QL_STATUS_SUCCESS); -+} -+ -+static __inline__ void -+qla2x00_fdmi_sc_request_dev_bufs_free(Scsi_Cmnd *pcmd) -+{ -+ if (pcmd->sc_request != NULL) { -+ if (pcmd->sc_request->sr_buffer != NULL) { -+ KMEM_FREE(pcmd->sc_request->sr_buffer, -+ sizeof(struct ct_info)); -+ pcmd->sc_request->sr_buffer = NULL; -+ } -+ -+ KMEM_FREE(pcmd->sc_request, sizeof(Scsi_Request)); -+ pcmd->sc_request = NULL; -+ } -+ -+ if (pcmd->device != NULL) { -+ KMEM_FREE(pcmd->device, sizeof(Scsi_Device)); -+ pcmd->device = NULL; -+ } -+} -+ -+STATIC int -+qla2x00_fdmi_cmnd_srb_alloc(scsi_qla_host_t *ha, srb_t **sp) -+{ -+ struct ct_info *pdata; -+ void *pctbuf; -+ dma_addr_t ctbuf_dma_addr; -+ -+ /* Allocate SRB block. */ -+ if ((*sp = qla2x00_get_new_sp(ha)) == NULL) { -+ -+ DEBUG2_13(printk("%s(%ld): ERROR cannot alloc sp.\n", -+ __func__, ha->host_no);) -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ if (qla2x00_fdmi_srb_tmpmem_alloc(ha, *sp)) { -+ /* error */ -+ atomic_set(&(*sp)->ref_count, 0); -+ add_to_free_queue(ha, *sp); -+ *sp = NULL; -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ (*sp)->cmd = KMEM_ZALLOC(sizeof(Scsi_Cmnd), 64); -+ if ((*sp)->cmd == NULL) { -+ DEBUG2_13(printk(KERN_WARNING -+ "%s(%ld): ERROR in scsi_cmnd mem allocation.\n", -+ __func__, ha->host_no);) -+ qla2x00_fdmi_srb_tmpmem_free(*sp); -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ /* These buffers are used and freed during callback time */ -+ if (qla2x00_fdmi_sc_request_dev_bufs_alloc(ha, (*sp)->cmd)) { -+ /* error */ -+ -+ qla2x00_fdmi_srb_tmpmem_free(*sp); -+ KMEM_FREE((*sp)->cmd, sizeof(Scsi_Cmnd)); -+ (*sp)->cmd = NULL; -+ atomic_set(&(*sp)->ref_count, 0); -+ add_to_free_queue(ha, *sp); -+ *sp = NULL; -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ pctbuf = pci_alloc_consistent(ha->pdev, sizeof(ct_fdmi_pkt_t), -+ &ctbuf_dma_addr); -+ if (pctbuf == NULL) { -+ /* error */ -+ DEBUG2_13(printk(KERN_WARNING -+ "%s(%ld): ERROR in ctiu mem allocation.\n", -+ __func__, ha->host_no);) -+ -+ qla2x00_fdmi_sc_request_dev_bufs_free((*sp)->cmd); -+ qla2x00_fdmi_srb_tmpmem_free(*sp); -+ KMEM_FREE((*sp)->cmd, sizeof(Scsi_Cmnd)); -+ (*sp)->cmd = NULL; -+ atomic_set(&(*sp)->ref_count, 0); -+ add_to_free_queue(ha, *sp); -+ *sp = NULL; -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ /* sr_buffer is used to save some data for callback time */ -+ pdata = (*sp)->cmd->sc_request->sr_buffer; -+ pdata->pct_buf = pctbuf; -+ pdata->ct_buf_dma_addr = ctbuf_dma_addr; -+ -+ return (QL_STATUS_SUCCESS); -+} -+ -+STATIC void -+qla2x00_fdmi_cmnd_srb_free(scsi_qla_host_t *ha, srb_t *sp) -+{ -+ struct ct_info *pdata; -+ -+ if (sp == NULL) -+ return; -+ -+ if (sp->cmd->sc_request != NULL && -+ (pdata = sp->cmd->sc_request->sr_buffer) != NULL) { -+ if (pdata->pct_buf != NULL) { -+ pci_free_consistent(ha->pdev, sizeof(ct_fdmi_pkt_t), -+ pdata->pct_buf, pdata->ct_buf_dma_addr); -+ } -+ } -+ -+ qla2x00_fdmi_sc_request_dev_bufs_free(sp->cmd); -+ -+ if (sp->cmd != NULL) { -+ KMEM_FREE(sp->cmd, sizeof(Scsi_Cmnd)); -+ sp->cmd = NULL; -+ } -+ -+ qla2x00_fdmi_srb_tmpmem_free(sp); -+ -+ atomic_set(&sp->ref_count, 0); -+ add_to_free_queue(ha, sp); -+} -+ -+STATIC void -+qla2x00_fdmi_done(Scsi_Cmnd *pscsi_cmd) -+{ -+ uint8_t free_mem = TRUE; -+ uint16_t cmd_code; -+ struct Scsi_Host *host; -+ scsi_qla_host_t *ha; -+ struct ct_info *pdata; -+ ct_iu_preamble_t *pct; -+ -+ host = pscsi_cmd->host; -+ if (host == NULL) { -+ /* error */ -+ DEBUG2_13(printk("%s: entered. no host found.\n", __func__);) -+ return; -+ } -+ -+ ha = (scsi_qla_host_t *) host->hostdata; -+ -+ DEBUG13(printk("%s(%ld): entered.\n", __func__ ,ha->host_no);) -+ -+ /* read data and free memory */ -+ if (pscsi_cmd->sc_request == NULL) { -+ /* error */ -+ return; -+ } -+ if ((pdata = (struct ct_info *)pscsi_cmd->sc_request->sr_buffer) == -+ NULL) { -+ /* error */ -+ return; -+ } -+ -+ pct = pdata->pct_buf; -+ -+ cmd_code = be16_to_cpu(pdata->ct_cmd); -+ DEBUG13(printk("%s(%ld): got cmd %x, result=%x. rsp dump:\n", -+ __func__ ,ha->host_no, cmd_code, CMD_RESULT(pscsi_cmd));) -+ DEBUG13(qla2x00_dump_buffer((uint8_t *)pct, sizeof(ct_iu_preamble_t));) -+ -+ switch (cmd_code) { -+ case RHBA: -+ if (pct->cmd_rsp_code != -+ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { -+ DEBUG2_13(printk("%s(%ld): RHBA failed, rejected " -+ "request, rhba_rsp:\n", __func__, ha->host_no);) -+ DEBUG2_13(qla2x00_dump_buffer((uint8_t *)pct, -+ sizeof(ct_iu_preamble_t));) -+ -+ if ((pct->reason == FDMI_REASON_CANNOT_PERFORM) && -+ (pct->explanation == -+ FDMI_EXPL_HBA_ALREADY_REGISTERED)) { -+ -+ DEBUG13(printk( -+ "%s(%ld): RHBA already registered. " -+ "calling RHAT.\n", -+ __func__, ha->host_no);) -+ -+ qla2x00_fdmi_rhat_intr(ha, pscsi_cmd, -+ pdata->pct_buf, pdata->ct_buf_dma_addr); -+ free_mem = FALSE; -+ } else { -+ /* error. just free mem and exit */ -+ DEBUG2_13(printk("%s(%ld): RHBA failed. " -+ "going to free memory.\n", -+ __func__, ha->host_no);) -+ } -+ } else { -+ /* command completed. */ -+ DEBUG13(printk( -+ "%s(%ld): RHBA finished ok. going to call RPA.\n", -+ __func__, ha->host_no);) -+ qla2x00_fdmi_rpa_intr(ha, pscsi_cmd, pdata->pct_buf, -+ pdata->ct_buf_dma_addr); -+ free_mem = FALSE; -+ } -+ -+ break; -+ -+ case RHAT: -+ /* Just go ahead and issue next command */ -+ DEBUG13(printk("%s(%ld): RHAT rspcode=%x. going to call RPA.\n", -+ __func__, ha->host_no, be16_to_cpu(pct->cmd_rsp_code));) -+ qla2x00_fdmi_rpa_intr(ha, pscsi_cmd, pdata->pct_buf, -+ pdata->ct_buf_dma_addr); -+ free_mem = FALSE; -+ break; -+ -+ case RPA: -+ DEBUG13(printk("%s(%ld): got RPA rspcode=%x.\n", -+ __func__ ,ha->host_no, be16_to_cpu(pct->cmd_rsp_code));) -+ -+ /* This is assumed to be last command issued in this -+ * chain. Proceed to free memory. -+ */ -+ break; -+ -+ default: -+ DEBUG13(printk("%s(%ld): cmd_code=%x not processed.\n", -+ __func__ ,ha->host_no, cmd_code);) -+ break; -+ } -+ -+ if (free_mem) { -+ DEBUG13(printk("%s(%ld): going to free mem.\n", -+ __func__ ,ha->host_no);) -+ if (pdata->pct_buf != NULL) { -+ pci_free_consistent(ha->pdev, sizeof(ct_fdmi_pkt_t), -+ pdata->pct_buf, pdata->ct_buf_dma_addr); -+ } -+ qla2x00_fdmi_sc_request_dev_bufs_free(pscsi_cmd); -+ KMEM_FREE(pscsi_cmd, sizeof(Scsi_Cmnd)); -+ } -+ -+ DEBUG13(printk("%s(%ld): exiting.\n", __func__ ,ha->host_no);) -+} -+ -+static __inline__ void -+qla2x00_fdmi_srb_init(scsi_qla_host_t *ha, srb_t *sp, uint16_t tov, -+ uint16_t ct_cmd_code) -+{ -+ struct ct_info *pdata; -+ -+ /* setup sp for this command */ -+ sp->ha = ha; -+ sp->flags = SRB_FDMI_CMD; -+ sp->fclun->lun = 0; -+ sp->fclun->flags = 0; -+ sp->lun_queue->fclun = sp->fclun; -+ sp->lun_queue->fclun->fcport->ha = ha; -+ sp->lun_queue->q_state = LUN_STATE_READY; -+ sp->lun_queue->q_lock = SPIN_LOCK_UNLOCKED; -+ sp->tgt_queue->ha = ha; -+ sp->tgt_queue->vis_port = sp->fclun->fcport; -+ -+ /* init scsi_cmd */ -+ CMD_SP(sp->cmd) = (void *)sp; -+ sp->cmd->host = ha->host; -+ sp->cmd->scsi_done = qla2x00_fdmi_done; -+ CMD_TIMEOUT(sp->cmd) = tov; -+ /* sr_buffer is used to save some data for callback time */ -+ pdata = (struct ct_info *)sp->cmd->sc_request->sr_buffer; -+ pdata->ct_cmd = ct_cmd_code; -+} -+ -+static __inline__ void -+qla2x00_init_req_q_ms_iocb(scsi_qla_host_t *ha, ms_iocb_entry_t *ms_pkt, -+ dma_addr_t ct_buf_dma, size_t req_buf_size, size_t rsp_buf_size, -+ uint8_t loop_id, uint16_t ctrl_flags, uint16_t tov) -+{ -+ ms_pkt->entry_type = MS_IOCB_TYPE; -+ ms_pkt->entry_count = 1; -+ -+ ms_pkt->dseg_req_address[0] = cpu_to_le32(LSD(ct_buf_dma)); -+ ms_pkt->dseg_req_address[1] = cpu_to_le32(MSD(ct_buf_dma)); -+ -+ ms_pkt->dseg_rsp_address[0] = cpu_to_le32(LSD(ct_buf_dma)); -+ ms_pkt->dseg_rsp_address[1] = cpu_to_le32(MSD(ct_buf_dma)); -+ -+#if defined(EXTENDED_IDS) -+ ms_pkt->loop_id = __constant_cpu_to_le16(loop_id); -+#else -+ ms_pkt->loop_id = loop_id; -+#endif -+ ms_pkt->control_flags = __constant_cpu_to_le16(ctrl_flags); -+ ms_pkt->timeout = __constant_cpu_to_le16(tov); -+ 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_buf_size); -+ ms_pkt->req_bytecount = cpu_to_le32(req_buf_size); -+ ms_pkt->dseg_req_length = ms_pkt->req_bytecount; -+ ms_pkt->dseg_rsp_length = ms_pkt->rsp_bytecount; -+} -+ -+/* -+ * qla2x00_fdmi_register_intr -+ * Uses request queue iocb to perform fdmi registration -+ * functions. If functions cannot be performed or returned -+ * error, just return without error, since this is not a critical -+ * function that must succeed. -+ * It is assumed the driver has already login to management svr. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * -+ * Returns: -+ * void -+ * -+ * Context: -+ * Kernel context. -+ */ -+void -+qla2x00_fdmi_register_intr(scsi_qla_host_t *ha) -+{ -+ DEBUG13(printk("%s(%ld): entered.\n", __func__, ha->host_no);) -+ -+ /* start the chain of fdmi calls with RHBA */ -+ qla2x00_fdmi_rhba_intr(ha); -+ -+ DEBUG13(printk("%s(%ld): exiting\n", __func__, ha->host_no);) -+} -+ -+static __inline__ int -+qla2x00_fdmi_ctiu_mem_alloc(scsi_qla_host_t *ha, size_t buf_size) -+{ -+ int rval = QL_STATUS_SUCCESS; -+ -+ /* Get consistent memory allocated for CT commands */ -+ if (ha->ct_iu == NULL) { -+ ha->ct_iu = pci_alloc_consistent(ha->pdev, -+ buf_size, &ha->ct_iu_dma); -+ } -+ -+ if (ha->ct_iu == NULL) { -+ /* error */ -+ DEBUG2_13(printk(KERN_WARNING -+ "%s(%ld): ct_iu Memory Allocation failed.\n", -+ __func__, ha->host_no);) -+ return (QL_STATUS_ERROR); -+ } -+ -+ memset(ha->ct_iu, 0, buf_size); -+ -+ return (rval); -+} -+ -+static __inline__ void -+qla2x00_fdmi_ctiu_mem_free(scsi_qla_host_t *ha, size_t buf_size) -+{ -+ if (ha->ct_iu != NULL) { -+ pci_free_consistent(ha->pdev, -+ buf_size, ha->ct_iu, ha->ct_iu_dma); -+ ha->ct_iu = NULL; -+ } -+} -+ -+static __inline__ ms_iocb_entry_t * -+qla2x00_alloc_ms_mbx_iocb(scsi_qla_host_t *ha) -+{ -+ ms_iocb_entry_t *ms_pkt; -+ -+ if (ha->ms_iocb == NULL){ -+ 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 -+ "%s(%ld): msiocb Memory Allocation failed.\n", -+ __func__, ha->host_no); -+ return (NULL); -+ } -+ memset(ha->ms_iocb, 0, sizeof(ms_iocb_entry_t)); -+ -+ /* Get consistent memory allocated for CT commands */ -+ if (qla2x00_fdmi_ctiu_mem_alloc(ha, sizeof(ct_fdmi_pkt_t)) != -+ QL_STATUS_SUCCESS) { -+ printk(KERN_WARNING -+ "%s(%ld): ct_iu Memory Allocation failed.\n", -+ __func__, ha->host_no); -+ qla2x00_free_ms_mbx_iocb(ha); -+ return (NULL); -+ } -+ -+ /* Initialize some common fields */ -+ ms_pkt = ha->ms_iocb; -+ -+ ms_pkt->entry_type = MS_IOCB_TYPE; -+ ms_pkt->entry_count = 1; -+ -+ ms_pkt->dseg_req_address[0] = cpu_to_le32(LSD(ha->ct_iu_dma)); -+ ms_pkt->dseg_req_address[1] = cpu_to_le32(MSD(ha->ct_iu_dma)); -+ -+ ms_pkt->dseg_rsp_address[0] = cpu_to_le32(LSD(ha->ct_iu_dma)); -+ ms_pkt->dseg_rsp_address[1] = cpu_to_le32(MSD(ha->ct_iu_dma)); -+ -+ return (ms_pkt); -+} -+ -+static __inline__ void -+qla2x00_free_ms_mbx_iocb(scsi_qla_host_t *ha) -+{ -+ if (ha->ms_iocb != NULL){ -+ pci_free_consistent(ha->pdev, -+ sizeof(ms_iocb_entry_t), ha->ms_iocb, ha->ms_iocb_dma); -+ ha->ms_iocb = NULL; -+ } -+ -+ qla2x00_fdmi_ctiu_mem_free(ha, sizeof(ct_fdmi_pkt_t)); -+ -+} -+ -+static __inline__ void -+qla2x00_init_ms_mbx_iocb(scsi_qla_host_t *ha, uint32_t req_size, -+ uint32_t rsp_size, uint16_t loop_id, uint16_t ctrl_flags, uint16_t tov) -+{ -+ ms_iocb_entry_t *ms_pkt; -+ -+ ms_pkt = ha->ms_iocb; -+ -+#if defined(EXTENDED_IDS) -+ ms_pkt->loop_id = __constant_cpu_to_le16(loop_id); -+#else -+ ms_pkt->loop_id = loop_id; -+#endif -+ ms_pkt->control_flags = __constant_cpu_to_le16(ctrl_flags); -+ ms_pkt->timeout = __constant_cpu_to_le16(tov); -+ 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_length = ms_pkt->req_bytecount; -+ ms_pkt->dseg_rsp_length = ms_pkt->rsp_bytecount; -+ -+} -+ -+static __inline__ void -+qla2x00_fdmi_setup_hbaattr(scsi_qla_host_t *ha, hba_attr_t *attr) -+{ -+ char tmp_str[80]; -+ uint32_t tmp_sn; -+ qla_boards_t *bdp; -+ -+ attr->count = __constant_cpu_to_be32(HBA_ATTR_COUNT); -+ -+ /* node name */ -+ attr->nn.type = __constant_cpu_to_be16(T_NODE_NAME); -+ attr->nn.len = cpu_to_be16(sizeof(hba_nn_attr_t)); -+ memcpy(attr->nn.value, ha->init_cb->node_name, WWN_SIZE); -+ -+ DEBUG13(printk("%s(%ld): NODENAME=%02x%02x%02x%02x%02x" -+ "%02x%02x%02x.\n", -+ __func__, ha->host_no, attr->nn.value[0], -+ attr->nn.value[1], attr->nn.value[2], attr->nn.value[3], -+ attr->nn.value[4], attr->nn.value[5], attr->nn.value[6], -+ attr->nn.value[7]);) -+ -+ /* company name */ -+ attr->man.type = __constant_cpu_to_be16(T_MANUFACTURER); -+ attr->man.len = cpu_to_be16(sizeof(hba_man_attr_t)); -+ sprintf((char *)attr->man.value, QLOGIC_COMPANY_NAME); -+ -+ DEBUG13(printk("%s(%ld): MANUFACTURER=%s.\n", -+ __func__, ha->host_no, attr->man.value);) -+ -+ /* serial number */ -+ attr->sn.type = __constant_cpu_to_be16(T_SERIAL_NUMBER); -+ attr->sn.len = cpu_to_be16(sizeof(hba_sn_attr_t)); -+ tmp_sn = ((ha->serial0 & 0x1f) << 16) | (ha->serial2 << 8) | -+ ha->serial1; -+ sprintf((char *)attr->sn.value, "%c%05d", -+ ('A' + tmp_sn/100000), (tmp_sn%100000)); -+ -+ DEBUG13(printk("%s(%ld): SERIALNO=%s.\n", -+ __func__, ha->host_no, attr->sn.value);) -+ -+ /* model name */ -+ attr->mod.type = __constant_cpu_to_be16(T_MODEL); -+ attr->mod.len = cpu_to_be16(sizeof(hba_mod_attr_t)); -+ strncpy((char *)attr->mod.value, ha->model_number, NVRAM_MODEL_SIZE); -+ -+ DEBUG13(printk("%s(%ld): MODEL_NAME=%s.\n", -+ __func__, ha->host_no, attr->mod.value);) -+ -+ /* model description */ -+ attr->mod_desc.type = __constant_cpu_to_be16(T_MODEL_DESCRIPTION); -+ attr->mod_desc.len = cpu_to_be16(sizeof(hba_mod_desc_attr_t)); -+ strncpy((char *)attr->mod_desc.value, ha->model_desc, 80); -+ -+ DEBUG13(printk("%s(%ld): MODEL_DESC=%s.\n", -+ __func__, ha->host_no, attr->mod_desc.value);) -+ -+ /* hardware version */ -+ attr->hv.type = __constant_cpu_to_be16(T_HARDWARE_VERSION); -+ attr->hv.len = cpu_to_be16(sizeof(hba_hv_attr_t)); -+ /* hw_id_version contains either valid hw_id for 2312 and later NVRAM -+ * or NULLs. -+ */ -+ strncpy((char *)attr->hv.value, ha->hw_id_version, NVRAM_HW_ID_SIZE); -+ -+ DEBUG13(printk("%s(%ld): HARDWAREVER=%s.\n", -+ __func__, ha->host_no, attr->hv.value);) -+ -+ /* driver version */ -+ attr->dv.type = __constant_cpu_to_be16(T_DRIVER_VERSION); -+ attr->dv.len = cpu_to_be16(sizeof(hba_dv_attr_t)); -+ strncpy((char *)attr->dv.value, qla2x00_version_str, -+ QLA_DRVR_VERSION_LEN); -+ -+ DEBUG13(printk("%s(%ld): DRIVERVER=%s.\n", -+ __func__, ha->host_no, qla2x00_version_str);) -+ -+ /* opt rom version */ -+ attr->or.type = __constant_cpu_to_be16(T_OPTION_ROM_VERSION); -+ attr->or.len = cpu_to_be16(sizeof(hba_or_attr_t)); -+ sprintf((char *)attr->or.value, "%d.%d", ha->bios_revision[1], -+ ha->bios_revision[0]); -+ -+ DEBUG13(printk("%s(%ld): OPTROMVER=%s.\n", -+ __func__, ha->host_no, attr->or.value);) -+ -+ /* firmware version */ -+ attr->fw.type = __constant_cpu_to_be16(T_FIRMWARE_VERSION); -+ attr->fw.len = cpu_to_be16(sizeof(hba_fw_attr_t)); -+ bdp = &QLBoardTbl_fc[ha->devnum]; -+ sprintf((char *)attr->fw.value, "%2d.%02d.%02d", bdp->fwver[0], -+ bdp->fwver[1], bdp->fwver[2]); -+ -+ DEBUG13(printk("%s(%ld): FIRMWAREVER=%s.\n", -+ __func__, ha->host_no, attr->fw.value);) -+ -+ /* OS name/version */ -+ attr->os.type = __constant_cpu_to_be16(T_OS_NAME_AND_VERSION); -+ attr->os.len = cpu_to_be16(sizeof(hba_os_attr_t)); -+ sprintf(tmp_str, "%s %s", system_utsname.sysname, -+ system_utsname.release); -+ strncpy((char *)attr->os.value, tmp_str, 16); -+ -+ DEBUG13(printk("%s(%ld): OSNAME=%s.\n", -+ __func__, ha->host_no, tmp_str);) -+} -+ -+static __inline__ void -+qla2x00_fdmi_setup_rhbainfo(scsi_qla_host_t *ha, ct_iu_rhba_t *ct) -+{ -+ memcpy(ct->hba_identifier, ha->init_cb->port_name, WWN_SIZE); -+ ct->plist.num_ports = __constant_cpu_to_be32(1); -+ memcpy(ct->plist.port_entry, ha->init_cb->port_name, WWN_SIZE); -+ -+ DEBUG13(printk("%s(%ld): RHBA identifier=%02x%02x%02x%02x%02x" -+ "%02x%02x%02x.\n", -+ __func__, ha->host_no, ct->hba_identifier[0], -+ ct->hba_identifier[1], ct->hba_identifier[2], ct->hba_identifier[3], -+ ct->hba_identifier[4], ct->hba_identifier[5], ct->hba_identifier[6], -+ ct->hba_identifier[7]);) -+ -+ qla2x00_fdmi_setup_hbaattr(ha, &ct->attr); -+} -+ -+static __inline__ void -+qla2x00_fdmi_setup_rhatinfo(scsi_qla_host_t *ha, ct_iu_rhat_t *ct) -+{ -+ memcpy(ct->hba_identifier, ha->init_cb->port_name, WWN_SIZE); -+ -+ DEBUG13(printk("%s(%ld): RHAT identifier=%02x%02x%02x%02x%02x" -+ "%02x%02x%02x.\n", -+ __func__, ha->host_no, ct->hba_identifier[0], -+ ct->hba_identifier[1], ct->hba_identifier[2], ct->hba_identifier[3], -+ ct->hba_identifier[4], ct->hba_identifier[5], ct->hba_identifier[6], -+ ct->hba_identifier[7]);) -+ -+ qla2x00_fdmi_setup_hbaattr(ha, &ct->attr); -+} -+ -+/* -+ * qla2x00_fdmi_rhba -+ * FDMI register HBA via execute IOCB mbx cmd. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * pret_stat: local fdmi return status pointer. -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+STATIC int -+qla2x00_fdmi_rhba(scsi_qla_host_t *ha, uint8_t *pret_stat) -+{ -+ int rval; -+ ct_iu_rhba_t *ct; -+ -+ -+ DEBUG13(printk("%s(%ld): entered\n", __func__, ha->host_no);) -+ -+ /* init */ -+ *pret_stat = FDMI_STAT_OK; -+ -+ /* Prepare common MS IOCB- Request/Response size adjusted. tov same -+ * as mailbox tov. -+ */ -+ qla2x00_init_ms_mbx_iocb(ha, sizeof(ct_iu_rhba_t), -+ sizeof(ct_iu_preamble_t), MANAGEMENT_SERVER, -+ (CF_READ | CF_HEAD_TAG), 60 - 1); -+ -+ DEBUG13(printk("%s(%ld): done msiocb init.\n", __func__, ha->host_no);) -+ -+ /* Prepare CT request */ -+ memset(ha->ct_iu, 0, sizeof(ct_fdmi_pkt_t)); -+ ct = (ct_iu_rhba_t *)ha->ct_iu; -+ -+ /* Setup CT-IU Basic preamble. */ -+ QLA_INIT_FDMI_CTIU_HDR(ha, ct->hdr); -+ ct->hdr.cmd_rsp_code = __constant_cpu_to_be16(RHBA); -+ -+ /* Setup register hba payload. */ -+ qla2x00_fdmi_setup_rhbainfo(ha, ct); -+ -+ DEBUG13(printk("%s(%ld): done ct init. ct buf dump:\n", -+ __func__, ha->host_no);) -+ DEBUG13(qla2x00_dump_buffer((uint8_t *)ct, -+ sizeof(ct_iu_rhba_t));) -+ DEBUG13(printk("msiocb buf dump:.\n");) -+ DEBUG13(qla2x00_dump_buffer((uint8_t *)ha->ms_iocb, -+ sizeof(ms_iocb_entry_t));) -+ -+ /* Go issue command and wait for completion. */ -+ /* 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_13(printk("%s(%ld): RHBA issue IOCB failed (%d).\n", -+ __func__, ha->host_no, rval);) -+ *pret_stat = FDMI_STAT_ERR; -+ rval = QL_STATUS_ERROR; -+ } else if (ct->hdr.cmd_rsp_code != -+ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { -+ DEBUG2_13(printk("%s(%ld): RHBA failed, rejected " -+ "request, rhba_rsp:\n", __func__, ha->host_no);) -+ DEBUG2_13(qla2x00_dump_buffer((uint8_t *)&ct->hdr, -+ sizeof(ct_iu_preamble_t));) -+ -+ if ((ct->hdr.reason == FDMI_REASON_CANNOT_PERFORM) && -+ (ct->hdr.explanation == FDMI_EXPL_HBA_ALREADY_REGISTERED)) { -+ *pret_stat = FDMI_STAT_ALREADY_REGISTERED; -+ DEBUG2_13(printk("%s(%ld): HBA already registered.\n", -+ __func__, ha->host_no);) -+ } -+ -+ rval = QL_STATUS_ERROR; -+ } -+ -+ DEBUG13(printk("%s(%ld): exiting.\n", __func__ ,ha->host_no);) -+ -+ return (rval); -+} -+ -+/* -+ * qla2x00_fdmi_ghat -+ * FDMI get HBA attributes via execute IOCB mbx cmd. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * prsp_buf: local ghat response buffer pointer. -+ * pret_stat: local fdmi return status pointer. -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+STATIC int -+qla2x00_fdmi_ghat(scsi_qla_host_t *ha, ct_iu_ghat_rsp_t *prsp_buf, -+ uint8_t *pret_stat) -+{ -+ int rval; -+ ct_iu_ghat_req_t *ct_req; -+ ct_iu_ghat_rsp_t *ct_rsp; -+ ct_fdmi_pkt_t *ctbuf; -+ -+ DEBUG13(printk("%s(%ld): entered\n", __func__, ha->host_no);) -+ -+ /* init */ -+ *pret_stat = FDMI_STAT_OK; -+ -+ /* Prepare common MS IOCB- Request/Response size adjusted. tov -+ * same as mailbox tov. -+ */ -+ qla2x00_init_ms_mbx_iocb(ha, sizeof(ct_iu_ghat_req_t), -+ sizeof(ct_iu_ghat_rsp_t), MANAGEMENT_SERVER, -+ (CF_READ | CF_HEAD_TAG), 60 - 1); -+ -+ DEBUG13(printk("%s(%ld): done msiocb init.\n", __func__, ha->host_no);) -+ -+ /* Prepare CT request */ -+ memset(ha->ct_iu, 0, sizeof(ct_fdmi_pkt_t)); -+ ctbuf = (ct_fdmi_pkt_t *)ha->ct_iu; -+ ct_req = (ct_iu_ghat_req_t *)ha->ct_iu; -+ ct_rsp = (ct_iu_ghat_rsp_t *)ha->ct_iu; -+ -+ /* Setup CT-IU Basic preamble. */ -+ QLA_INIT_FDMI_CTIU_HDR(ha, ct_req->hdr); -+ ct_req->hdr.cmd_rsp_code = __constant_cpu_to_be16(GHAT); -+ -+ /* Setup get hba attrib payload. */ -+ memcpy(ct_req->hba_identifier, ha->init_cb->port_name, WWN_SIZE); -+ -+ DEBUG13(printk("%s(%ld): done ct init. ct buf dump:\n", -+ __func__, ha->host_no);) -+ DEBUG13(qla2x00_dump_buffer((uint8_t *)ct_req, -+ sizeof(ct_fdmi_pkt_t));) -+ DEBUG13(printk("msiocb buf dump:.\n");) -+ DEBUG13(qla2x00_dump_buffer((uint8_t *)ha->ms_iocb, -+ sizeof(ms_iocb_entry_t));) -+ -+ /* Go issue command and wait for completion. */ -+ /* 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 || ct_rsp->hdr.cmd_rsp_code != -+ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { -+ DEBUG2_13(printk("%s(%ld): GHAT IOCB failed=%d. rspcode=%x, " -+ "ct rspbuf:\n", -+ __func__, ha->host_no, rval, -+ be16_to_cpu(ct_rsp->hdr.cmd_rsp_code));) -+ DEBUG2_13(qla2x00_dump_buffer((uint8_t *)ct_rsp, -+ sizeof(ct_iu_ghat_rsp_t));) -+ -+ *pret_stat = FDMI_STAT_ERR; -+ rval = QL_STATUS_ERROR; -+ } else { -+ /* copy response */ -+ memcpy(prsp_buf, ct_rsp, sizeof(ct_iu_ghat_rsp_t)); -+ } -+ -+ DEBUG13(printk("%s(%ld): exiting.\n", __func__ ,ha->host_no);) -+ -+ return (rval); -+} -+ -+static __inline__ void -+qla2x00_fdmi_setup_rpainfo(scsi_qla_host_t *ha, ct_iu_rpa_t *ct) -+{ -+ /* Setup register port payload. */ -+ memcpy(ct->portname, ha->init_cb->port_name, WWN_SIZE); -+ -+ ct->attr.count = __constant_cpu_to_be32(PORT_ATTR_COUNT); -+ -+ /* FC4 types */ -+ ct->attr.fc4_types.type = __constant_cpu_to_be16(T_FC4_TYPES); -+ ct->attr.fc4_types.len = cpu_to_be16(sizeof(port_fc4_attr_t)); -+#if defined(FC_IP_SUPPORT) -+ if (ha->flags.enable_ip) -+ ct->attr.fc4_types.value[3] = 0x20; /* type 5 for IP */ -+#endif -+ ct->attr.fc4_types.value[2] = 0x01; /* SCSI - FCP */ -+ -+ DEBUG13(printk("%s(%ld): register fc4types=%02x %02x.\n", -+ __func__, ha->host_no, ct->attr.fc4_types.value[3], -+ ct->attr.fc4_types.value[2]);) -+ -+ /* Supported speed */ -+ ct->attr.sup_speed.type = __constant_cpu_to_be16(T_SUPPORT_SPEED); -+ ct->attr.sup_speed.len = cpu_to_be16(sizeof(port_speed_attr_t)); -+#if defined(ISP2100) || defined (ISP2200) -+ ct->attr.sup_speed.value = __constant_cpu_to_be32(1); /* 1 Gig */ -+#elif defined(ISP2300) -+ ct->attr.sup_speed.value = __constant_cpu_to_be32(2); /* 2 Gig */ -+#endif -+ -+ DEBUG13(printk("%s(%ld): register SUPPSPEED=%x.\n", -+ __func__, ha->host_no, ct->attr.sup_speed.value);) -+ -+ /* Current speed */ -+ ct->attr.cur_speed.type = __constant_cpu_to_be16(T_CURRENT_SPEED); -+ ct->attr.cur_speed.len = cpu_to_be16(sizeof(port_speed_attr_t)); -+ switch (ha->current_speed) { -+ case EXT_DEF_PORTSPEED_1GBIT: -+ ct->attr.cur_speed.value = __constant_cpu_to_be32(1); -+ break; -+ case EXT_DEF_PORTSPEED_2GBIT: -+ ct->attr.cur_speed.value = __constant_cpu_to_be32(2); -+ break; -+ } -+ -+ DEBUG13(printk("%s(%ld): register CURRSPEED=%x.\n", -+ __func__, ha->host_no, ct->attr.cur_speed.value);) -+ -+ /* Max frame size */ -+ ct->attr.max_fsize.type = __constant_cpu_to_be16(T_MAX_FRAME_SIZE); -+ ct->attr.max_fsize.len = cpu_to_be16(sizeof(port_frame_attr_t)); -+ ct->attr.max_fsize.value = -+ cpu_to_be32((uint32_t)ha->init_cb->frame_length); -+ -+ DEBUG13(printk("%s(%ld): register MAXFSIZE=%d.\n", -+ __func__, ha->host_no, ct->attr.max_fsize.value);) -+ -+ /* OS device name */ -+ ct->attr.os_dev_name.type = __constant_cpu_to_be16(T_OS_DEVICE_NAME); -+ ct->attr.os_dev_name.len = cpu_to_be16(sizeof(port_os_attr_t)); -+ /* register same string used/returned by SNIA HBA API */ -+#if defined(ISP2100) -+ sprintf((char *)ct->attr.os_dev_name.value, "/proc/scsi/qla2100/%ld", -+ ha->host_no); -+#elif defined(ISP2200) -+ sprintf((char *)ct->attr.os_dev_name.value, "/proc/scsi/qla2200/%ld", -+ ha->host_no); -+#elif defined(ISP2300) -+ sprintf((char *)ct->attr.os_dev_name.value, "/proc/scsi/qla2300/%ld", -+ ha->host_no); -+#endif -+ DEBUG13(printk("%s(%ld): register OSDEVNAME=%s.\n", -+ __func__, ha->host_no, ct->attr.os_dev_name.value);) -+ -+ /* Host name */ -+ ct->attr.host_name.type = __constant_cpu_to_be16(T_HOST_NAME); -+ ct->attr.host_name.len = cpu_to_be16(sizeof(port_host_name_attr_t)); -+ strcpy((char *)ct->attr.host_name.value, system_utsname.nodename); -+ -+ DEBUG13(printk("%s(%ld): register HOSTNAME=%s.\n", -+ __func__, ha->host_no, ct->attr.host_name.value);) -+} -+ -+/* -+ * qla2x00_fdmi_rpa -+ * FDMI register port attributes via execute IOCB mbx cmd. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * pret_stat: local fdmi return status pointer. -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+STATIC int -+qla2x00_fdmi_rpa(scsi_qla_host_t *ha, uint8_t *pret_stat) -+{ -+ int rval; -+ ct_iu_rpa_t *ct; -+ -+ DEBUG13(printk("%s(%ld): entered\n", __func__, ha->host_no);) -+ -+ /* init */ -+ *pret_stat = FDMI_STAT_OK; -+ -+ /* Prepare common MS IOCB- Request/Response size adjusted */ -+ /* tov same as mbx tov */ -+ qla2x00_init_ms_mbx_iocb(ha, sizeof(ct_iu_rpa_t), -+ sizeof(ct_iu_preamble_t), MANAGEMENT_SERVER, -+ (CF_READ | CF_HEAD_TAG), 60 - 1); -+ -+ DEBUG13(printk("%s(%ld): done msiocb init.\n", __func__, ha->host_no);) -+ -+ /* Prepare CT request */ -+ memset(ha->ct_iu, 0, sizeof(ct_fdmi_pkt_t)); -+ ct = (ct_iu_rpa_t *)ha->ct_iu; -+ -+ /* Setup CT-IU Basic preamble. */ -+ QLA_INIT_FDMI_CTIU_HDR(ha, ct->hdr); -+ ct->hdr.cmd_rsp_code = __constant_cpu_to_be16(RPA); -+ -+ /* Setup register port attribute payload. */ -+ qla2x00_fdmi_setup_rpainfo(ha, ct); -+ -+ DEBUG13(printk("%s(%ld): done ct init. ct buf dump:\n", -+ __func__, ha->host_no);) -+ DEBUG13(qla2x00_dump_buffer((uint8_t *)ct, -+ sizeof(ct_iu_rpa_t));) -+ DEBUG13(printk("msiocb buf dump:.\n");) -+ DEBUG13(qla2x00_dump_buffer((uint8_t *)ha->ms_iocb, -+ sizeof(ms_iocb_entry_t));) -+ -+ /* Go issue command and wait for completion. */ -+ /* 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) { -+ DEBUG2_13(printk("%s(%ld): RPA issue IOCB failed (%d).\n", -+ __func__, ha->host_no, rval);) -+ *pret_stat = FDMI_STAT_ERR; -+ rval = QL_STATUS_ERROR; -+ } else if (ct->hdr.cmd_rsp_code != -+ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { -+ -+ DEBUG2_13(printk("%s(%ld): RPA failed, rejected " -+ "request, rhba_rsp:\n", __func__, ha->host_no);) -+ DEBUG2_13(qla2x00_dump_buffer((uint8_t *)&ct->hdr, -+ sizeof(ct_iu_preamble_t));) -+ *pret_stat = FDMI_STAT_ERR; -+ rval = QL_STATUS_ERROR; -+ } -+ -+ DEBUG13(printk("%s(%ld): exiting.\n", __func__ ,ha->host_no);) -+ -+ return (rval); -+} -+ -+/* -+ * qla2x00_fdmi_dhba -+ * FDMI de-register HBA. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+STATIC int -+qla2x00_fdmi_dhba(scsi_qla_host_t *ha, uint8_t *pret_stat) -+{ -+ int rval; -+ ct_iu_dhba_t *ct; -+ -+ -+ DEBUG13(printk("%s(%ld): entered\n", __func__, ha->host_no);) -+ -+ /* init */ -+ *pret_stat = FDMI_STAT_OK; -+ -+ /* Prepare common MS IOCB- Request/Response size adjusted. tov -+ * same as mbx tov. -+ */ -+ qla2x00_init_ms_mbx_iocb(ha, sizeof(ct_iu_dhba_t), -+ sizeof(ct_iu_preamble_t), MANAGEMENT_SERVER, -+ (CF_HEAD_TAG), 60 - 1); -+ -+ DEBUG13(printk("%s(%ld): done msiocb init.\n", __func__, ha->host_no);) -+ -+ /* Prepare CT request */ -+ memset(ha->ct_iu, 0, sizeof(ct_fdmi_pkt_t)); -+ ct = (ct_iu_dhba_t *)ha->ct_iu; -+ -+ /* Setup CT-IU Basic preamble. */ -+ QLA_INIT_FDMI_CTIU_HDR(ha, ct->hdr); -+ ct->hdr.cmd_rsp_code = __constant_cpu_to_be16(DHBA); -+ -+ /* Setup deregister hba payload. */ -+ memcpy(ct->hba_portname, ha->init_cb->port_name, WWN_SIZE); -+ -+ DEBUG13(printk("%s(%ld): done ct init.\n", __func__, ha->host_no);) -+ -+ /* Go issue command and wait for completion. */ -+ /* 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) { -+ DEBUG2_13(printk("%s(%ld): DHBA issue IOCB failed (%d).\n", -+ __func__, ha->host_no, rval);) -+ *pret_stat = FDMI_STAT_ERR; -+ rval = QL_STATUS_ERROR; -+ } else if (ct->hdr.cmd_rsp_code != -+ __constant_cpu_to_be16(CT_ACCEPT_RESPONSE)) { -+ -+ DEBUG2_13(printk("%s(%ld): DHBA failed, rejected " -+ "request, dhba_rsp:\n", __func__, ha->host_no);) -+ DEBUG2_13(qla2x00_dump_buffer((uint8_t *)&ct->hdr, -+ sizeof(ct_iu_preamble_t));) -+ *pret_stat = FDMI_STAT_ERR; -+ rval = QL_STATUS_ERROR; -+ } -+ -+ DEBUG13(printk("%s(%ld): exiting.\n", __func__ ,ha->host_no);) -+ -+ return (rval); -+} -+ -+/* -+ * qla2x00_fdmi_rhba_intr -+ * FDMI register HBA sent via regular request queue. -+ * -+ * Input: -+ * ha: adapter state pointer. -+ * fcport: device context pointer. -+ * -+ * Returns: -+ * qla2x00 local function return status code. -+ * -+ * Context: -+ * Kernel context. -+ */ -+STATIC int -+qla2x00_fdmi_rhba_intr(scsi_qla_host_t *ha) -+{ -+ int rval = QL_STATUS_SUCCESS; -+ uint16_t tov; -+ unsigned long cpu_flags = 0; -+ struct ct_info *pdata; -+ ct_iu_rhba_t *ct; -+ ms_iocb_entry_t *pkt; -+ srb_t *sp; -+ -+ DEBUG13(printk("%s(%ld): entered\n", __func__, ha->host_no);) -+ -+ if ((rval = qla2x00_fdmi_cmnd_srb_alloc(ha, &sp))){ -+ DEBUG2_13(printk("%s(%ld): cmd_srb_alloc failed.\n", -+ __func__, ha->host_no);) -+ return (rval); -+ } -+ -+ tov = ha->login_timeout*2; -+ -+ DEBUG13(printk("%s(%ld): going to srb_init\n", __func__, ha->host_no);) -+ -+ qla2x00_fdmi_srb_init(ha, sp, tov, __constant_cpu_to_be16(RHBA)); -+ -+ DEBUG13(printk("%s(%ld): done srb_init\n", __func__, ha->host_no);) -+ -+ pdata = (struct ct_info *)sp->cmd->sc_request->sr_buffer; -+ ct = (ct_iu_rhba_t *)pdata->pct_buf; -+ -+ /* Setup CT-IU Basic preamble. */ -+ QLA_INIT_FDMI_CTIU_HDR(ha, ct->hdr); -+ ct->hdr.cmd_rsp_code = pdata->ct_cmd; -+ -+ /* Setup register hba payload. */ -+ qla2x00_fdmi_setup_rhbainfo(ha, ct); -+ -+ DEBUG13(printk("%s(%ld): done setup_rhbainfo\n", __func__, ha->host_no);) -+ -+ /* get spin lock for this operation */ -+ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); -+ -+ /* Get MS request IOCB from request queue. */ -+ pkt = (ms_iocb_entry_t *)qla2x00_ms_req_pkt(ha, sp); -+ if (pkt == NULL) { -+ /* release spin lock and return error. */ -+ DEBUG2_13(printk("%s(%ld): no pkt. going to unlock " -+ "and free mem.\n", __func__, ha->host_no);) -+ -+ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); -+ -+ qla2x00_fdmi_cmnd_srb_free(ha, sp); -+ -+ DEBUG2_13(printk("%s(%ld): MSIOCB - could not get " -+ "Request Packet.\n", __func__, ha->host_no);) -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ DEBUG13(printk(KERN_INFO "%s(%ld): going to init_req_q_msiocb\n", -+ __func__, ha->host_no);) -+ qla2x00_init_req_q_ms_iocb(ha, pkt, pdata->ct_buf_dma_addr, -+ sizeof(ct_iu_rhba_t), sizeof(ct_iu_preamble_t), MANAGEMENT_SERVER, -+ 0, tov); -+ -+ /* Issue command to ISP */ -+ DEBUG13(printk("%s(%ld): going to call isp_cmd.\n", -+ __func__, ha->host_no);) -+ -+ qla2x00_isp_cmd(ha); -+ -+ DEBUG13(printk("%s(%ld): going to add timer.\n", -+ __func__, ha->host_no);) -+ -+ qla2x00_add_timer_to_cmd(sp, tov + 2); -+ -+ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); -+ -+ DEBUG13(printk("%s(%ld): exiting\n", __func__, ha->host_no);) -+ -+ return (rval); -+} -+ -+STATIC int -+qla2x00_fdmi_rhat_intr(scsi_qla_host_t *ha, Scsi_Cmnd *pscsi_cmd, void *pct_buf, -+ dma_addr_t ct_buf_dma_addr) -+{ -+ int rval = QL_STATUS_SUCCESS; -+ uint16_t tov; -+ unsigned long cpu_flags = 0; -+ struct ct_info *pdata; -+ ct_iu_rhat_t *cth; -+ ms_iocb_entry_t *pkt; -+ srb_t *sp; -+ -+ DEBUG13(printk("%s(%ld): entered\n", __func__, ha->host_no);) -+ -+ /* Allocate SRB block. */ -+ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { -+ -+ DEBUG2_13(printk("%s(%ld): ERROR cannot alloc sp.\n", -+ __func__, ha->host_no);) -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ DEBUG13(printk("%s(%ld): got sp\n", __func__, ha->host_no);) -+ -+ if (qla2x00_fdmi_srb_tmpmem_alloc(ha, sp)) { -+ /* error */ -+ atomic_set(&(sp)->ref_count, 0); -+ add_to_free_queue(ha, sp); -+ sp = NULL; -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ sp->cmd = pscsi_cmd; -+ -+ tov = ha->login_timeout*2; -+ qla2x00_fdmi_srb_init(ha, sp, tov, __constant_cpu_to_be16(RHAT)); -+ -+ DEBUG13(printk("%s(%ld): done srb_init\n", __func__, ha->host_no);) -+ -+ pdata = (struct ct_info *)sp->cmd->sc_request->sr_buffer; -+ cth = (ct_iu_rhat_t *)pdata->pct_buf; -+ -+ /* Setup CT-IU Basic preamble. */ -+ QLA_INIT_FDMI_CTIU_HDR(ha, cth->hdr); -+ cth->hdr.cmd_rsp_code = pdata->ct_cmd; -+ -+ /* Setup register hba payload. */ -+ qla2x00_fdmi_setup_rhatinfo(ha, cth); -+ -+ DEBUG13(printk("%s(%ld): done setup_rhatinfo\n", __func__, ha->host_no);) -+ -+ /* get spin lock for this operation */ -+ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); -+ -+ /* Get MS request IOCB from request queue. */ -+ 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); -+ -+ qla2x00_fdmi_cmnd_srb_free(ha, sp); -+ -+ DEBUG2_13(printk("%s(%ld): inst=%ld MSIOCB - could not get " -+ "Request Packet.\n", __func__, ha->host_no, ha->instance);) -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ qla2x00_init_req_q_ms_iocb(ha, pkt, pdata->ct_buf_dma_addr, -+ sizeof(ct_iu_rhat_t), sizeof(ct_iu_preamble_t), MANAGEMENT_SERVER, -+ 0, tov); -+ -+ DEBUG13(printk("%s(%ld): call isp_cmd.\n", -+ __func__, ha->host_no);) -+ -+ qla2x00_isp_cmd(ha); -+ -+ DEBUG13(printk("%s(%ld): going to add timer.\n", -+ __func__, ha->host_no);) -+ -+ qla2x00_add_timer_to_cmd(sp, tov + 2); -+ -+ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); -+ -+ DEBUG13(printk("%s(%ld): exiting\n", __func__, ha->host_no);) -+ -+ return (rval); -+} -+ -+STATIC int -+qla2x00_fdmi_rpa_intr(scsi_qla_host_t *ha, Scsi_Cmnd *pscsi_cmd, void *pct_buf, -+ dma_addr_t ct_buf_dma_addr) -+{ -+ int rval = QL_STATUS_SUCCESS; -+ uint16_t tov; -+ unsigned long cpu_flags = 0; -+ struct ct_info *pdata; -+ ct_iu_rpa_t *ctp; -+ ms_iocb_entry_t *pkt; -+ srb_t *sp; -+ -+ DEBUG13(printk("%s(%ld): entered\n", __func__, ha->host_no);) -+ -+ /* Allocate SRB block. */ -+ if ((sp = qla2x00_get_new_sp(ha)) == NULL) { -+ -+ DEBUG2_13(printk("%s(%ld): ERROR cannot alloc sp.\n", -+ __func__, ha->host_no);) -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ DEBUG13(printk("%s(%ld): got sp\n", __func__, ha->host_no);) -+ -+ if (qla2x00_fdmi_srb_tmpmem_alloc(ha, sp)) { -+ /* error */ -+ atomic_set(&(sp)->ref_count, 0); -+ add_to_free_queue(ha, sp); -+ sp = NULL; -+ -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ sp->cmd = pscsi_cmd; -+ -+ tov = ha->login_timeout*2; -+ qla2x00_fdmi_srb_init(ha, sp, tov, __constant_cpu_to_be16(RPA)); -+ -+ DEBUG13(printk("%s(%ld): done srb_init\n", __func__, ha->host_no);) -+ -+ pdata = (struct ct_info *)sp->cmd->sc_request->sr_buffer; -+ ctp = (ct_iu_rpa_t *)pdata->pct_buf; -+ -+ /* Setup CT-IU Basic preamble. */ -+ QLA_INIT_FDMI_CTIU_HDR(ha, ctp->hdr); -+ ctp->hdr.cmd_rsp_code = pdata->ct_cmd; -+ -+ /* Setup register port attribute payload. */ -+ qla2x00_fdmi_setup_rpainfo(ha, ctp); -+ -+ DEBUG13(printk("%s(%ld): done setup_rpainfo\n", __func__, ha->host_no);) -+ -+ /* get spin lock for this operation */ -+ spin_lock_irqsave(&ha->hardware_lock, cpu_flags); -+ -+ /* Get MS request IOCB from request queue. */ -+ 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); -+ -+ qla2x00_fdmi_cmnd_srb_free(ha, sp); -+ -+ DEBUG2_13(printk("%s(%ld): inst=%ld MSIOCB - could not get " -+ "Request Packet.\n", __func__, ha->host_no, ha->instance);) -+ return (QL_STATUS_RESOURCE_ERROR); -+ } -+ -+ qla2x00_init_req_q_ms_iocb(ha, pkt, pdata->ct_buf_dma_addr, -+ sizeof(ct_iu_rpa_t), sizeof(ct_iu_preamble_t), MANAGEMENT_SERVER, -+ 0, tov); -+ DEBUG13(printk("%s(%ld): calling isp_cmd.\n", -+ __func__, ha->host_no);) -+ -+ qla2x00_isp_cmd(ha); -+ -+ DEBUG13(printk("%s(%ld): going to add timer.\n", -+ __func__, ha->host_no);) -+ -+ qla2x00_add_timer_to_cmd(sp, tov + 2); -+ -+ spin_unlock_irqrestore(&ha->hardware_lock, cpu_flags); -+ -+ DEBUG13(printk("%s(%ld): exiting\n", __func__, ha->host_no);) -+ -+ return (rval); -+} -+ -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_gs.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_gs.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_gs.h 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_gs.h 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,369 @@ -+/****************************************************************************** -+ * 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. -+ * -+ ******************************************************************************/ -+ -+#ifndef _QLA_GS_H -+#define _QLA_GS_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+ -+/* -+ * FC-GS-4 definitions. -+ */ -+#define GS4_REVISION 0x01 -+#define GS_TYPE_MGMT_SERVER 0xFA -+#define GS_TYPE_DIR_SERVER 0xFC -+#define GS_SUBTYPE_FDMI_HBA 0x10 -+ -+/* FDMI Command Codes. */ -+#define GRHL 0x100 -+#define GHAT 0x101 -+#define GRPL 0x102 -+#define GPAT 0x110 -+#define RHBA 0x200 -+#define RHAT 0x201 -+#define RPRT 0x210 -+#define RPA 0x211 -+#define DHBA 0x300 -+#define DHAT 0x301 -+#define DPRT 0x310 -+#define DPA 0x311 -+ -+/* -+ * CT information unit basic preamble. -+ */ -+typedef struct { -+ uint8_t revision; -+ uint8_t in_id[3]; -+ uint8_t gs_type; -+ uint8_t gs_subtype; -+ uint8_t options; -+ uint8_t reserved; -+ uint16_t cmd_rsp_code; -+ uint16_t max_resid_size; -+ uint8_t fragment_id; -+ uint8_t reason; -+ uint8_t explanation; -+ uint8_t vendor_unique; -+} ct_iu_preamble_t; -+ -+#define FDMI_STAT_OK 0 -+#define FDMI_STAT_ERR 1 -+#define FDMI_STAT_ALREADY_REGISTERED 2 -+ -+#define FDMI_REASON_INVALID_CMD 0x01 -+#define FDMI_REASON_INVALID_VERSION 0x02 -+#define FDMI_REASON_LOGICAL_ERR 0x03 -+#define FDMI_REASON_INVALID_CTIU_SIZE 0x04 -+#define FDMI_REASON_LOGICAL_BUSY 0x05 -+#define FDMI_REASON_PROTOCOL_ERR 0x07 -+#define FDMI_REASON_CANNOT_PERFORM 0x09 -+#define FDMI_REASON_NOT_SUPPORTED 0x0B -+#define FDMI_REASON_HARD_ENF_FAILED 0x0C -+ -+#define FDMI_EXPL_NO_ADDITIONAL_EXPLANATION 0x00 -+#define FDMI_EXPL_HBA_ALREADY_REGISTERED 0x10 -+#define FDMI_EXPL_HBA_ATTR_NOT_REGISTERED 0x11 -+#define FDMI_EXPL_HBA_ATTR_MULTI_SAME_TYPE 0x12 -+#define FDMI_EXPL_INVALID_HBA_ATTR_LEN 0x13 -+#define FDMI_EXPL_HBA_ATTR_NOT_PRESENT 0x14 -+#define FDMI_EXPL_PORT_NOT_IN_PORT_LIST 0x15 -+#define FDMI_EXPL_HBA_ID_NOT_IN_PORT_LIST 0x16 -+#define FDMI_EXPL_PORT_ATTR_NOT_REGISTERED 0x20 -+#define FDMI_EXPL_PORT_NOT_REGISTERED 0x21 -+#define FDMI_EXPL_PORT_ATTR_MULTI_SAME_TYPE 0x22 -+#define FDMI_EXPL_INVALID_PORT_ATTR_LEN 0x23 -+ -+/* -+ * HBA attribute types. -+ */ -+#define T_NODE_NAME 1 -+#define T_MANUFACTURER 2 -+#define T_SERIAL_NUMBER 3 -+#define T_MODEL 4 -+#define T_MODEL_DESCRIPTION 5 -+#define T_HARDWARE_VERSION 6 -+#define T_DRIVER_VERSION 7 -+#define T_OPTION_ROM_VERSION 8 -+#define T_FIRMWARE_VERSION 9 -+#define T_OS_NAME_AND_VERSION 0xa -+#define T_MAXIMUM_CT_PAYLOAD_LENGTH 0xb -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[WWN_SIZE]; -+} hba_nn_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[20]; -+} hba_man_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[8]; -+} hba_sn_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[16]; -+} hba_mod_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[80]; -+} hba_mod_desc_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[16]; -+} hba_hv_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[28]; -+} hba_dv_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[16]; -+} hba_or_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[16]; -+} hba_fw_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[16]; -+} hba_os_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[4]; -+} hba_maxctlen_attr_t; -+ -+/* -+ * HBA Attribute Block. -+ */ -+#define HBA_ATTR_COUNT 10 -+typedef struct { -+ uint32_t count; -+ hba_nn_attr_t nn; -+ hba_man_attr_t man; -+ hba_sn_attr_t sn; -+ hba_mod_attr_t mod; -+ hba_mod_desc_attr_t mod_desc; -+ hba_hv_attr_t hv; -+ hba_dv_attr_t dv; -+ hba_or_attr_t or; -+ hba_fw_attr_t fw; -+ hba_os_attr_t os; -+#if 0 -+ hba_maxctlen_attr_t max_ctlen; -+#endif -+} hba_attr_t; -+ -+/* -+ * Port attribute types. -+ */ -+#define T_FC4_TYPES 1 -+#define T_SUPPORT_SPEED 2 -+#define T_CURRENT_SPEED 3 -+#define T_MAX_FRAME_SIZE 4 -+#define T_OS_DEVICE_NAME 5 -+#define T_HOST_NAME 6 -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[32]; -+} port_fc4_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint32_t value; -+} port_speed_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint32_t value; -+} port_frame_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[24]; -+} port_os_attr_t; -+ -+typedef struct { -+ uint16_t type; -+ uint16_t len; -+ uint8_t value[80]; -+} port_host_name_attr_t; -+ -+/* -+ * Port Attribute Block. -+ */ -+#define PORT_ATTR_COUNT 6 -+typedef struct { -+ uint32_t count; -+ port_fc4_attr_t fc4_types; -+ port_speed_attr_t sup_speed; -+ port_speed_attr_t cur_speed; -+ port_frame_attr_t max_fsize; -+ port_os_attr_t os_dev_name; -+ port_host_name_attr_t host_name; -+} port_attr_t; -+ -+/* -+ * Registered Port List -+ */ -+typedef struct { -+ uint32_t num_ports; -+ uint8_t port_entry[WWN_SIZE]; -+} reg_port_list_t; -+ -+/* -+ * Get HBA Attributes. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t hba_identifier[WWN_SIZE]; -+} ct_iu_ghat_req_t; -+ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ reg_port_list_t plist; -+ hba_attr_t attr; -+} ct_iu_ghat_rsp_t; -+ -+/* -+ * Register HBA. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t hba_identifier[WWN_SIZE]; -+ reg_port_list_t plist; -+ hba_attr_t attr; -+} ct_iu_rhba_t; -+ -+/* -+ * Register HBA Attributes. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t hba_identifier[WWN_SIZE]; -+ hba_attr_t attr; -+} ct_iu_rhat_t; -+ -+/* -+ * Register Port. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t hba_portname[WWN_SIZE]; -+ uint8_t portname[WWN_SIZE]; -+ port_attr_t attr; -+} ct_iu_rprt_t; -+ -+/* -+ * Register Port Attributes. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t portname[WWN_SIZE]; -+ port_attr_t attr; -+} ct_iu_rpa_t; -+ -+/* -+ * Deregister HBA. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t hba_portname[WWN_SIZE]; -+} ct_iu_dhba_t; -+ -+/* -+ * Deregister HBA Attributes. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t hba_portname[WWN_SIZE]; -+} ct_iu_dhat_t; -+ -+/* -+ * Deregister Port. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t portname[WWN_SIZE]; -+} ct_iu_dprt_t; -+ -+/* -+ * Deregister Port Attributes. -+ */ -+typedef struct { -+ ct_iu_preamble_t hdr; -+ uint8_t portname[WWN_SIZE]; -+} ct_iu_dpa_t; -+ -+typedef struct { -+ uint16_t loop_id; -+ uint32_t response_byte_count; -+ uint32_t command_byte_count; -+} ct_iocb_t; -+ -+ -+typedef struct ct_fdmi_pkt { -+ union { -+ ct_iu_ghat_req_t ghat_req; -+ ct_iu_ghat_rsp_t ghat_rsp; -+ ct_iu_rhba_t rhba; -+ ct_iu_rhat_t rhat; -+ ct_iu_rprt_t rprt; -+ ct_iu_rpa_t rpa; -+ ct_iu_dhba_t dhba; -+ ct_iu_dhat_t dhat; -+ ct_iu_dprt_t dprt; -+ ct_iu_dpa_t dpa; -+ } t; -+} ct_fdmi_pkt_t; -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif /* _QLA_GS_H */ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_inioct.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_inioct.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_inioct.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_inioct.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -19,17 +19,17 @@ - - #include "inioct.h" - --static int qla2x00_loopback_test(scsi_qla_host_t *ha, INT_LOOPBACK_REQ *req, -+extern int qla2x00_loopback_test(scsi_qla_host_t *ha, INT_LOOPBACK_REQ *req, - uint16_t *ret_mb); - --static int qla2x00_read_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); --static int qla2x00_update_nvram(scsi_qla_host_t *, EXT_IOCTL *, int); --static int qla2x00_write_nvram_word(scsi_qla_host_t *, uint8_t, uint16_t); --static int qla2x00_send_loopback(scsi_qla_host_t *, EXT_IOCTL *, int); --static int qla2x00_read_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); --static int qla2x00_update_option_rom(scsi_qla_host_t *, EXT_IOCTL *, int); -+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); - --static int -+int - qla2x00_read_nvram(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) - { - char *ptmp_buf; -@@ -68,7 +68,15 @@ qla2x00_read_nvram(scsi_qla_host_t *ha, - - /* Dump NVRAM. */ - #if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+ if ( -+ #if defined(ISP200) -+ (ha->device_id == QLA6312_DEVICE_ID || -+ ha->device_id == QLA6322_DEVICE_ID) -+ #else -+ (ha->device_id == QLA2312_DEVICE_ID || -+ ha->device_id == QLA2322_DEVICE_ID) -+ #endif -+ ) { - data = RD_REG_WORD(®->ctrl_status); - if ((data >> 14) == 1) - base = 0x80; -@@ -106,15 +114,22 @@ qla2x00_read_nvram(scsi_qla_host_t *ha, - wptr++; - } - --#if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+#if defined(ISP2300) -+ if ( -+ #if defined(ISP200) -+ (ha->device_id == QLA6312_DEVICE_ID || -+ ha->device_id == QLA6322_DEVICE_ID) -+ #else -+ (ha->device_id == QLA2312_DEVICE_ID || -+ ha->device_id == QLA2322_DEVICE_ID) -+ #endif -+ ) { - /* Unlock resource */ - WRT_REG_WORD(®->host_semaphore, 0); - } - #endif - -- ret = copy_to_user((uint8_t *)pext->ResponseAdr, ptmp_buf, -- transfer_size * 2); -+ ret = copy_to_user(pext->ResponseAdr, ptmp_buf, transfer_size * 2); - if (ret) { - pext->Status = EXT_STATUS_COPY_ERR; - DEBUG9_10(printk("%s(%ld): inst=%ld ERROR copy rsp buffer.\n", -@@ -146,10 +161,10 @@ qla2x00_read_nvram(scsi_qla_host_t *ha, - * Context: - * Kernel context. - */ --static int -+int - qla2x00_update_nvram(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) - { --#if defined(ISP2300) -+#if defined(ISP2300) - device_reg_t *reg = ha->iobase; - #endif - #if defined(ISP2100) -@@ -190,17 +205,15 @@ qla2x00_update_nvram(scsi_qla_host_t *ha - kernel_tmp = (uint8_t *)pnew_nv; - usr_tmp = (uint8_t *)pext->RequestAdr; - -- ret = verify_area(VERIFY_READ, (void *)usr_tmp, transfer_size); -+ ret = copy_from_user(kernel_tmp, usr_tmp, transfer_size); - if (ret) { - DEBUG9_10(printk( -- "qla2x00_update_nvram: ERROR in buffer verify READ. " -+ "qla2x00_update_nvram: ERROR in buffer copy 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 */ -@@ -215,7 +228,15 @@ qla2x00_update_nvram(scsi_qla_host_t *ha - - /* Write to NVRAM */ - #if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+ if ( -+ #if defined(ISP200) -+ (ha->device_id == QLA6312_DEVICE_ID || -+ ha->device_id == QLA6322_DEVICE_ID) -+ #else -+ (ha->device_id == QLA2312_DEVICE_ID || -+ ha->device_id == QLA2322_DEVICE_ID) -+ #endif -+ ) { - data = RD_REG_WORD(®->ctrl_status); - if ((data >> 14) == 1) - base = 0x80; -@@ -254,7 +275,15 @@ qla2x00_update_nvram(scsi_qla_host_t *ha - } - - #if defined(ISP2300) -- if (ha->device_id == QLA2312_DEVICE_ID) { -+ if ( -+ #if defined(ISP200) -+ (ha->device_id == QLA6312_DEVICE_ID || -+ ha->device_id == QLA6322_DEVICE_ID) -+ #else -+ (ha->device_id == QLA2312_DEVICE_ID || -+ ha->device_id == QLA2322_DEVICE_ID) -+ #endif -+ ) { - /* Unlock resource */ - WRT_REG_WORD(®->host_semaphore, 0); - } -@@ -270,7 +299,7 @@ qla2x00_update_nvram(scsi_qla_host_t *ha - return 0; - } - --static int -+int - qla2x00_write_nvram_word(scsi_qla_host_t *ha, uint8_t addr, uint16_t data) - { - int count; -@@ -346,7 +375,7 @@ qla2x00_write_nvram_word(scsi_qla_host_t - return 0; - } - --static int -+int - qla2x00_send_loopback(scsi_qla_host_t *ha, EXT_IOCTL *pext, int mode) - { - int status; -@@ -373,20 +402,15 @@ qla2x00_send_loopback(scsi_qla_host_t *h - return pext->Status; - } - -- status = verify_area(VERIFY_READ, (void *)pext->RequestAdr, -- pext->RequestLen); -+ status = copy_from_user(&req, pext->RequestAdr, pext->RequestLen); - if (status) { - pext->Status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " -+ DEBUG9_10(printk("qla2x00_send_loopback: ERROR copy 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); -+ status = copy_from_user(&rsp, pext->ResponseAdr, pext->ResponseLen); - if (status) { - pext->Status = EXT_STATUS_COPY_ERR; - DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " -@@ -394,9 +418,6 @@ qla2x00_send_loopback(scsi_qla_host_t *h - return pext->Status; - } - -- copy_from_user((uint8_t *)&rsp, (uint8_t *)pext->ResponseAdr, -- pext->ResponseLen); -- - if (req.TransferCount > req.BufferLength || - req.TransferCount > rsp.BufferLength) { - -@@ -411,18 +432,15 @@ qla2x00_send_loopback(scsi_qla_host_t *h - return pext->Status; - } - -- status = verify_area(VERIFY_READ, (void *)req.BufferAddress, -+ status = copy_from_user(ha->ioctl_mem, req.BufferAddress, - req.TransferCount); - if (status) { - pext->Status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify read of " -+ DEBUG9_10(printk("qla2x00_send_loopback: ERROR copy 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, -@@ -473,22 +491,19 @@ qla2x00_send_loopback(scsi_qla_host_t *h - } - } - -- status = verify_area(VERIFY_WRITE, (void *)rsp.BufferAddress, -+ DEBUG9(printk("qla2x00_send_loopback: loopback mbx cmd ok. " -+ "copying data.\n");) -+ -+ /* put loopback return data in user buffer */ -+ status = copy_to_user(rsp.BufferAddress, ha->ioctl_mem, - 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 status ; -+ return (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 (ha->current_topology == ISP_CFG_F) { -@@ -504,18 +519,14 @@ qla2x00_send_loopback(scsi_qla_host_t *h - } - } - -- status = verify_area(VERIFY_WRITE, (void *)pext->ResponseAdr, -- pext->ResponseLen); -+ status = copy_to_user(pext->ResponseAdr, &rsp, pext->ResponseLen); - if (status) { - pext->Status = EXT_STATUS_COPY_ERR; -- DEBUG9_10(printk("qla2x00_send_loopback: ERROR verify " -+ DEBUG9_10(printk("qla2x00_send_loopback: ERROR copy " - "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; - -@@ -590,14 +601,6 @@ int qla2x00_update_option_rom(scsi_qla_h - - /* 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) { -@@ -606,7 +609,15 @@ int qla2x00_update_option_rom(scsi_qla_h - "%s: ERROR in flash allocation.\n", __func__); - return (1); - } -- copy_from_user(kern_tmp, usr_tmp, FLASH_IMAGE_SIZE); -+ ret = copy_from_user(kern_tmp, usr_tmp, FLASH_IMAGE_SIZE); -+ if (ret) { -+ KMEM_FREE(kern_tmp, FLASH_IMAGE_SIZE); -+ pext->Status = EXT_STATUS_COPY_ERR; -+ DEBUG9_10(printk("%s: ERROR in buffer copy READ. " -+ "RequestAdr=%p\n", -+ __func__, pext->RequestAdr);) -+ return (ret); -+ } - - /* Go with update */ - spin_lock_irqsave(&ha->hardware_lock, cpu_flags); -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_inline.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_inline.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_inline.h 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_inline.h 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,49 @@ -+/****************************************************************************** -+ * QLOGIC LINUX SOFTWARE -+ * -+ * QLogic ISPFBLITE 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. -+ * -+ ******************************************************************************/ -+ -+/* -+ * This file includes a set of defines that are required to compile the -+ * source code for qla2xxx module -+ */ -+ -+static inline int -+check_device_id(scsi_qla_host_t *ha) -+{ -+ return (ha->device_id == QLA6322_DEVICE_ID || -+ ha->device_id == QLA2322_DEVICE_ID); -+} -+ -+static inline int -+check_all_device_ids(scsi_qla_host_t *ha) -+{ -+ return (ha->device_id == QLA6312_DEVICE_ID || -+ ha->device_id == QLA6322_DEVICE_ID || -+ ha->device_id == QLA2312_DEVICE_ID || -+ ha->device_id == QLA2322_DEVICE_ID); -+} -+ -+static inline void -+set_model_number(scsi_qla_host_t *ha) -+{ -+ if (ha->device_id == QLA6312_DEVICE_ID || -+ ha->device_id == QLA6322_DEVICE_ID) -+ sprintf(ha->model_number, "QLA63xx"); -+ else -+ sprintf(ha->model_number, "QLA23xx"); -+} -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_ip.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_ip.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_ip.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_ip.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_ip.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_ip.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_ip.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_ip.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 IP network driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_mbx.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_mbx.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_mbx.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_mbx.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -54,14 +54,6 @@ qla2x00_load_ram(scsi_qla_host_t *, dma_ - STATIC int - qla2x00_execute_fw(scsi_qla_host_t *); - --#if defined(WORD_FW_LOAD) --STATIC int --qla2x00_write_ram_word(scsi_qla_host_t *, uint16_t, uint16_t); -- --STATIC int --qla2x00_read_ram_word(scsi_qla_host_t *, uint16_t, uint16_t *); --#endif -- - STATIC int - qla2x00_mbx_reg_test(scsi_qla_host_t *); - -@@ -93,7 +85,7 @@ STATIC int - qla2x00_get_retry_cnt(scsi_qla_host_t *, uint8_t *, uint8_t *); - - #if defined(INTAPI) --static int -+int - qla2x00_loopback_test(scsi_qla_host_t *, INT_LOOPBACK_REQ *, uint16_t *); - int - qla2x00_echo_test(scsi_qla_host_t *, INT_LOOPBACK_REQ *, uint16_t *); -@@ -103,7 +95,7 @@ STATIC int - qla2x00_init_firmware(scsi_qla_host_t *, uint16_t); - - STATIC int --qla2x00_get_port_database(scsi_qla_host_t *, fcdev_t *, uint8_t); -+qla2x00_get_port_database(scsi_qla_host_t *, fc_port_t *, uint8_t); - - STATIC int - qla2x00_get_firmware_state(scsi_qla_host_t *, uint16_t *); -@@ -121,7 +113,7 @@ STATIC int - qla2x00_get_port_name(scsi_qla_host_t *, uint16_t, uint8_t *, uint8_t); - - STATIC uint8_t --qla2x00_get_link_status(scsi_qla_host_t *, uint8_t, void *, uint16_t *); -+qla2x00_get_link_status(scsi_qla_host_t *, uint16_t, link_stat_t *, uint16_t *); - - STATIC int - qla2x00_lip_reset(scsi_qla_host_t *); -@@ -143,15 +135,14 @@ STATIC int - qla2x00_full_login_lip(scsi_qla_host_t *ha); - - STATIC int --qla2x00_get_port_list(scsi_qla_host_t *, port_list_entry_t *, dma_addr_t, -- uint16_t, uint16_t *); -+qla2x00_get_id_list(scsi_qla_host_t *, void *, dma_addr_t, uint16_t *); - - #if 0 /* not yet needed */ - STATIC int - qla2x00_dump_ram(scsi_qla_host_t *, uint32_t, dma_addr_t, uint32_t); - #endif - --STATIC int -+int - qla2x00_lun_reset(scsi_qla_host_t *, uint16_t, uint16_t); - - STATIC int -@@ -650,14 +641,22 @@ qla2x00_mailbox_command(scsi_qla_host_t - - spin_lock_irqsave(&ha->hardware_lock, flags); - /* Check for pending interrupts. */ --#if defined(ISP2300) -- -- if (ha->device_id == QLA2312_DEVICE_ID) { -- -+#if defined(ISP2300) -+ if ( -+ #if defined(ISP200) -+ (ha->device_id == QLA6312_DEVICE_ID || -+ ha->device_id == QLA6322_DEVICE_ID) -+ #else -+ (ha->device_id == QLA2312_DEVICE_ID || -+ ha->device_id == QLA2322_DEVICE_ID) -+ #endif -+ ) { - while ((data =RD_REG_WORD( - ®->istatus)) & RISC_INT) { - - data =RD_REG_WORD(®->host_status_lo); -+ if((data & HOST_STATUS_INT ) == 0) -+ break; - qla2x00_isr(ha, data, &discard); - } - -@@ -684,6 +683,33 @@ qla2x00_mailbox_command(scsi_qla_host_t - if (!abort_active) - QLA_MBX_REG_LOCK(ha); - -+ if (!abort_active) { -+ DEBUG11(printk("qla2x00_mailbox_cmd: checking for additional " -+ "resp interrupt.\n");) -+ -+ /* polling mode for non isp_abort commands. */ -+ /* Go check for any more response interrupts pending. */ -+ spin_lock_irqsave(&ha->hardware_lock, flags); -+#if defined(ISP2300) -+ -+ while (!(ha->flags.in_isr) && -+ ((data = qla2x00_debounce_register(®->host_status_lo)) & -+ HOST_STATUS_INT)) -+ qla2x00_isr(ha, data, &discard); -+#else -+ -+ while (!(ha->flags.in_isr) && -+ ((data = qla2x00_debounce_register(®->istatus)) & -+ RISC_INT)) -+ qla2x00_isr(ha, data,&discard); -+#endif -+ -+ spin_unlock_irqrestore(&ha->hardware_lock, flags); -+ } -+ /* Clean up */ -+ ha->mcp = NULL; -+ -+ - /* Check whether we timed out */ - if (ha->flags.mbox_int) { - -@@ -715,7 +741,13 @@ qla2x00_mailbox_command(scsi_qla_host_t - } else { - - #if defined(QL_DEBUG_LEVEL_2) || defined(QL_DEBUG_LEVEL_3) || \ -- defined(QL_DEBUG_LEVEL_11) -+ defined(QL_DEBUG_LEVEL_11) -+ printk(KERN_INFO "qla2x00_mailbox_command(%ld): **** MB" -+ " Command Timeout for cmd %x ****\n", ha->host_no, command); -+ printk(KERN_INFO "qla2x00_mailbox_command: icontrol=%x " -+ "jiffies=%lx\n", RD_REG_WORD(®->ictrl), jiffies); -+ printk(KERN_INFO "qla2x00_mailbox_command: *** mailbox[0] " -+ "= 0x%x ***\n", RD_REG_WORD(optr)); - 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", -@@ -735,32 +767,6 @@ qla2x00_mailbox_command(scsi_qla_host_t - - 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. */ -- /* Go check for any more response interrupts pending. */ -- spin_lock_irqsave(&ha->hardware_lock, flags); --#if defined(ISP2300) -- -- while (!(ha->flags.in_isr) && -- ((data = qla2x00_debounce_register(®->host_status_lo)) & -- HOST_STATUS_INT)) -- qla2x00_isr(ha, data, &discard); --#else -- -- while (!(ha->flags.in_isr) && -- ((data = qla2x00_debounce_register(®->istatus)) & -- RISC_INT)) -- qla2x00_isr(ha, data,&discard); --#endif -- -- spin_unlock_irqrestore(&ha->hardware_lock, flags); -- } - - if (status == QL_STATUS_TIMEOUT ) { - if (!io_lock_on || (mcp->flags & IOCTL_CMD)) { -@@ -865,12 +871,12 @@ qla2x00_load_ram(scsi_qla_host_t *ha, dm - mcp->mb[2] = MSW(req_dma); - mcp->mb[3] = LSW(req_dma); - mcp->mb[4] = (uint16_t)req_len; -- mcp->mb[6] = QL21_64BITS_4THWD(req_dma); -- mcp->mb[7] = QL21_64BITS_3RDWD(req_dma); -+ 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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -881,12 +887,12 @@ qla2x00_load_ram(scsi_qla_host_t *ha, dm - mcp->mb[2] = MSW(nml_dma); - mcp->mb[3] = LSW(nml_dma); - mcp->mb[4] = (uint16_t)nml_len; -- mcp->mb[6] = QL21_64BITS_4THWD(nml_dma); -- mcp->mb[7] = QL21_64BITS_3RDWD(nml_dma); -+ 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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - } -@@ -905,13 +911,11 @@ qla2x00_load_ram(scsi_qla_host_t *ha, dm - } - - /* -- * qla2x00_execute_fw -- * Start adapter firmware. -+ * qla2x00_load_ram_ext -+ * Load adapter extended RAM using DMA. - * - * Input: - * ha = adapter block pointer. -- * TARGET_QUEUE_LOCK must be released. -- * ADAPTER_STATE_LOCK must be released. - * - * Returns: - * qla2x00 local function return status code. -@@ -919,82 +923,81 @@ qla2x00_load_ram(scsi_qla_host_t *ha, dm - * Context: - * Kernel context. - */ --STATIC int --qla2x00_execute_fw(scsi_qla_host_t *ha) -+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("qla2x00_execute_fw(%ld): entered.\n", -- ha->host_no);) -- -- mcp->mb[0] = MBC_EXECUTE_FIRMWARE; -- mcp->mb[1] = *QLBoardTbl_fc[ha->devnum].fwstart; -- mcp->out_mb = MBX_1|MBX_0; -- 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; --} -- -+ DEBUG11(printk("%s(%ld): entered.\n", __func__, ha->host_no)); - --#if defined(WORD_FW_LOAD) --/* -- * qla2x00_write_ram_word -- * -- * Input: -- * ha = adapter block pointer. -- * -- * Returns: -- * qla2x00 local function return status code. -- * -- * Context: -- * Kernel context. -- */ --STATIC 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; -+ req_len = risc_code_size; -+ nml_dma = 0; -+ nml_len = 0; - -- DEBUG11(printk("qla2x00_write_ram_word(%ld): entered.\n", -- ha->host_no);) -+ normalized = qla2x00_normalize_dma_addr(&req_dma, &req_len, &nml_dma, -+ &nml_len); - -- mcp->mb[0] = MBC_WRITE_RAM_WORD; -- mcp->mb[1] = addr; -- mcp->mb[2] = data; -- mcp->out_mb = MBX_2|MBX_1|MBX_0; -+ /* 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 = qla2x00_mailbox_command(ha, mcp); - -- 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 = 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);) -+ DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", -+ __func__, ha->host_no, rval, mcp->mb[0])); - } else { - /*EMPTY*/ -- DEBUG11(printk("qla2x00_write_ram_word(%ld): done.\n", -- ha->host_no);) -+ DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); - } - - return rval; - } - -+ - /* -- * qla2x00_read_ram_word -+ * 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. -@@ -1003,38 +1006,42 @@ qla2x00_write_ram_word(scsi_qla_host_t * - * Kernel context. - */ - STATIC int --qla2x00_read_ram_word(scsi_qla_host_t *ha, uint16_t addr, uint16_t *data) -+qla2x00_execute_fw(scsi_qla_host_t *ha) - { - int rval; - mbx_cmd_t mc; - mbx_cmd_t *mcp = &mc; - -- DEBUG11(printk("qla2x00_read_ram_word(%ld): entered.\n", -+ DEBUG11(printk("qla2x00_execute_fw(%ld): entered.\n", - ha->host_no);) - -- mcp->mb[0] = MBC_READ_RAM_WORD; -- mcp->mb[1] = addr; -- -+ mcp->mb[0] = MBC_EXECUTE_FIRMWARE; -+ mcp->mb[1] = *QLBoardTbl_fc[ha->devnum].fwinfo->fwstart; - mcp->out_mb = MBX_1|MBX_0; -- mcp->in_mb = MBX_0|MBX_2; -- mcp->tov = 30; -- mcp->flags = 0; -+#if defined(ISP2300) -+ if ( -+ #if defined(ISP200) -+ ha->pdev->device == QLA6322_DEVICE_ID -+ #else -+ ha->pdev->device == QLA2322_DEVICE_ID -+ #endif -+ ) { -+ mcp->mb[2] = 0; /* FW image has been loaded into memory */ -+ mcp->out_mb |= MBX_2; -+ DEBUG11(printk("%s fwstart=%x \n",__func__,mcp->mb[1]);) -+ } -+#endif - -- rval = (int)qla2x00_mailbox_command(ha, mcp); -+ mcp->in_mb = MBX_0; -+ mcp->tov = 60; -+ mcp->flags = 0; -+ rval = 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);) -- } -+ DEBUG11(printk("qla2x00_execute_fw(%ld): done.\n", -+ ha->host_no);) - - return rval; - } --#endif - - /* - * qla2x00_mbx_reg_test -@@ -1071,7 +1078,7 @@ qla2x00_mbx_reg_test(scsi_qla_host_t *ha - 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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1123,10 +1130,10 @@ qla2x00_verify_checksum(scsi_qla_host_t - ha->host_no);) - - mcp->mb[0] = MBC_VERIFY_CHECKSUM; -- mcp->mb[1] = *QLBoardTbl_fc[ha->devnum].fwstart; -+ mcp->mb[1] = *QLBoardTbl_fc[ha->devnum].fwinfo->fwstart; - mcp->out_mb = MBX_1|MBX_0; - mcp->in_mb = MBX_2|MBX_0; -- mcp->tov = 30; -+ mcp->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1175,11 +1182,11 @@ qla2x00_issue_iocb(scsi_qla_host_t *ha, - mcp->mb[1] = 0; - mcp->mb[2] = MSW(phys_addr); - mcp->mb[3] = LSW(phys_addr); -- mcp->mb[6] = QL21_64BITS_4THWD(phys_addr); -- mcp->mb[7] = QL21_64BITS_3RDWD(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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1228,12 +1235,12 @@ qla2x00_abort_command(scsi_qla_host_t *h - fcport = sp->fclun->fcport; - - t = SCSI_TCN_32(sp->cmd); -- if (ha->loop_state == LOOP_DOWN || -+ -+ if (atomic_read(&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) -@@ -1247,13 +1254,17 @@ qla2x00_abort_command(scsi_qla_host_t *h - } - - mcp->mb[0] = MBC_ABORT_COMMAND; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = fcport->loop_id; -+#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)sp->fclun->lun; - mcp->out_mb = MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; - mcp->in_mb = MBX_0; -- mcp->tov = 30; -+ mcp->tov = 60; - mcp->flags = 0; - - rval = (int)qla2x00_mailbox_command(ha, mcp); -@@ -1295,11 +1306,15 @@ qla2x00_abort_device(scsi_qla_host_t *ha - ha->host_no);) - - mcp->mb[0] = MBC_ABORT_DEVICE; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = loop_id; -+#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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1358,11 +1373,19 @@ qla2x00_abort_target(fc_port_t *fcport) - loop_id = fcport->loop_id; - - mcp->mb[0] = MBC_ABORT_TARGET; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = fcport->loop_id; -+#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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(fcport->ha, mcp); - -@@ -1425,11 +1448,15 @@ qla2x00_target_reset(scsi_qla_host_t *ha - ha->host_no, tgt->vis_port->loop_id);) - - mcp->mb[0] = MBC_TARGET_RESET; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = tgt->vis_port->loop_id; -+#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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1480,7 +1507,7 @@ qla2x00_get_adapter_id(scsi_qla_host_t * - 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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1533,7 +1560,7 @@ qla2x00_get_retry_cnt(scsi_qla_host_t *h - 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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1592,13 +1619,13 @@ qla2x00_loopback_test(scsi_qla_host_t *h - - mcp->mb[14] = LSW(ha->ioctl_mem_phys); /* send data address */ - mcp->mb[15] = MSW(ha->ioctl_mem_phys); -- mcp->mb[20] = QL21_64BITS_3RDWD(ha->ioctl_mem_phys); -- mcp->mb[21] = QL21_64BITS_4THWD(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] = QL21_64BITS_3RDWD(ha->ioctl_mem_phys); -- mcp->mb[7] = QL21_64BITS_4THWD(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 */ -@@ -1608,7 +1635,7 @@ qla2x00_loopback_test(scsi_qla_host_t *h - 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; -+ mcp->tov = 60; - - DEBUG11(printk("qla2x00_send_loopback: req.Options=%x iterations=%x " - "MAILBOX_CNT=%d.\n", req->Options, req->IterationCount, -@@ -1668,20 +1695,20 @@ qla2x00_echo_test(scsi_qla_host_t *ha, I - - mcp->mb[14] = LSW(ha->ioctl_mem_phys); /* send data address */ - mcp->mb[15] = MSW(ha->ioctl_mem_phys); -- mcp->mb[20] = QL21_64BITS_3RDWD(ha->ioctl_mem_phys); -- mcp->mb[21] = QL21_64BITS_4THWD(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] = QL21_64BITS_3RDWD(ha->ioctl_mem_phys); -- mcp->mb[7] = QL21_64BITS_4THWD(ha->ioctl_mem_phys); -+ mcp->mb[6] = LSW(MSD(ha->ioctl_mem_phys)); -+ mcp->mb[7] = MSW(MSD(ha->ioctl_mem_phys)); - - mcp->out_mb = MBX_21|MBX_20|MBX_17|MBX_16|MBX_15| - MBX_14|MBX_10|MBX_7|MBX_6|MBX_1|MBX_0; - mcp->in_mb = MBX_0; - mcp->buf_size = tran_cnt; - mcp->flags = MBX_DMA_OUT|MBX_DMA_IN|IOCTL_CMD; -- mcp->tov = 30; -+ mcp->tov = 60; - - rval = qla2x00_mailbox_command(ha, mcp); - -@@ -1735,13 +1762,13 @@ qla2x00_init_firmware(scsi_qla_host_t *h - mcp->mb[3] = LSW(ha->init_cb_dma); - mcp->mb[4] = 0; - mcp->mb[5] = 0; -- mcp->mb[6] = QL21_64BITS_4THWD(ha->init_cb_dma); -- mcp->mb[7] = QL21_64BITS_3RDWD(ha->init_cb_dma); -+ 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; -+ mcp->tov = 60; - rval = (int)qla2x00_mailbox_command(ha, mcp); - - if (rval != QL_STATUS_SUCCESS) { -@@ -1775,7 +1802,7 @@ qla2x00_init_firmware(scsi_qla_host_t *h - * Kernel context. - */ - STATIC int --qla2x00_get_port_database(scsi_qla_host_t *ha, fcdev_t *dev, uint8_t opt) -+qla2x00_get_port_database(scsi_qla_host_t *ha, fc_port_t *fcport, uint8_t opt) - { - int rval; - mbx_cmd_t mc; -@@ -1800,43 +1827,50 @@ qla2x00_get_port_database(scsi_qla_host_ - mcp->mb[0] = MBC_ENHANCED_GET_PORT_DATABASE; - else - mcp->mb[0] = MBC_GET_PORT_DATABASE; -- -- mcp->mb[1] = dev->loop_id << 8 | opt; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = fcport->loop_id; -+#else -+ mcp->mb[1] = fcport->loop_id << 8 | opt; -+#endif - mcp->mb[2] = MSW(phys_address); - mcp->mb[3] = LSW(phys_address); -- mcp->mb[6] = QL21_64BITS_4THWD(phys_address); -- mcp->mb[7] = QL21_64BITS_3RDWD(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; -+ /* mcp->tov = ha->login_timeout * 2; */ -+ mcp->tov = (ha->login_timeout * 2) + (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); -+ memcpy(fcport->node_name, pd->node_name, WWN_SIZE); -+ memcpy(fcport->port_name, pd->port_name, WWN_SIZE); - - /* 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; -+ fcport->d_id.b.al_pa = pd->port_id[2]; -+ fcport->d_id.b.area = pd->port_id[3]; -+ fcport->d_id.b.domain = pd->port_id[0]; -+ fcport->d_id.b.rsvd_1 = 0; -+ -+ /* If not target must be initiator or unknown type. */ -+ if ((pd->prli_svc_param_word_3[0] & BIT_4) == 0) { -+ fcport->port_type = FCT_INITIATOR; -+ } else { -+ fcport->port_type = FCT_TARGET; -+ -+ /* Check for logged in. */ -+ if (pd->master_state != PD_STATE_PORT_LOGGED_IN && -+ pd->slave_state != PD_STATE_PORT_LOGGED_IN) -+ rval = QL_STATUS_ERROR; - } - } - -@@ -1883,7 +1917,7 @@ qla2x00_get_firmware_state(scsi_qla_host - mcp->mb[0] = MBC_GET_FIRMWARE_STATE; - mcp->out_mb = MBX_0; - mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; -- mcp->tov = 30; -+ mcp->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1930,7 +1964,7 @@ qla2x00_get_firmware_options(scsi_qla_ho - 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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -1984,7 +2018,7 @@ qla2x00_set_firmware_options(scsi_qla_ho - 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->tov = 60; - mcp->flags = 0; - - rval = (int)qla2x00_mailbox_command(ha, mcp); -@@ -2031,10 +2065,18 @@ qla2x00_get_port_name(scsi_qla_host_t *h - ha->host_no);) - - mcp->mb[0] = MBC_GET_PORT_NAME; -- mcp->mb[1] = loop_id << 8 | opt; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = loop_id; -+#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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -2076,8 +2118,8 @@ qla2x00_get_port_name(scsi_qla_host_t *h - * BIT_1 = mailbox error. - */ - STATIC uint8_t --qla2x00_get_link_status(scsi_qla_host_t *ha, uint8_t loop_id, void *ret_buf, -- uint16_t *status) -+qla2x00_get_link_status(scsi_qla_host_t *ha, uint16_t loop_id, -+ link_stat_t *ret_buf, uint16_t *status) - { - int rval; - mbx_cmd_t mc; -@@ -2100,14 +2142,22 @@ qla2x00_get_link_status(scsi_qla_host_t - memset(stat_buf, 0, sizeof(link_stat_t)); - - mcp->mb[0] = MBC_GET_LINK_STATUS; -- mcp->mb[1] = loop_id << 8; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = loop_id; -+#else -+ mcp->mb[1] = loop_id << 8; -+#endif - mcp->mb[2] = MSW(phys_address); - mcp->mb[3] = LSW(phys_address); -- mcp->mb[6] = QL21_64BITS_4THWD(phys_address); -- mcp->mb[7] = QL21_64BITS_3RDWD(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->tov = 60; - mcp->flags = IOCTL_CMD; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -2119,24 +2169,36 @@ qla2x00_get_link_status(scsi_qla_host_t - status[0] = mcp->mb[0]; - rval = BIT_1; - } else { -- /* copy over data */ -- memcpy(ret_buf, stat_buf,sizeof(link_stat_t)); -+ /* copy over data -- firmware data is LE. */ -+ ret_buf->link_fail_cnt = -+ le32_to_cpu(stat_buf->link_fail_cnt); -+ ret_buf->loss_sync_cnt = -+ le32_to_cpu(stat_buf->loss_sync_cnt); -+ ret_buf->loss_sig_cnt = -+ le32_to_cpu(stat_buf->loss_sig_cnt); -+ ret_buf->prim_seq_err_cnt = -+ le32_to_cpu(stat_buf->prim_seq_err_cnt); -+ ret_buf->inval_xmit_word_cnt = -+ le32_to_cpu(stat_buf->inval_xmit_word_cnt); -+ ret_buf->inval_crc_cnt = -+ le32_to_cpu(stat_buf->inval_crc_cnt); -+ - 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);) -+ ha->host_no, ret_buf->link_fail_cnt, -+ ret_buf->loss_sync_cnt, ret_buf->loss_sig_cnt, -+ ret_buf->prim_seq_err_cnt, -+ ret_buf->inval_xmit_word_cnt, -+ ret_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);) -+ ha->host_no, ret_buf->link_fail_cnt, -+ ret_buf->loss_sync_cnt, ret_buf->loss_sig_cnt, -+ ret_buf->prim_seq_err_cnt, -+ ret_buf->inval_xmit_word_cnt, -+ ret_buf->inval_crc_cnt);) - } - } else { - /* Failed. */ -@@ -2145,8 +2207,8 @@ qla2x00_get_link_status(scsi_qla_host_t - rval = BIT_1; - } - -- pci_free_consistent(ha->pdev, sizeof(link_stat_t), -- stat_buf, phys_address); -+ pci_free_consistent(ha->pdev, sizeof(link_stat_t), stat_buf, -+ phys_address); - - return rval; - } -@@ -2177,12 +2239,21 @@ qla2x00_lip_reset(scsi_qla_host_t *ha) - ha->host_no);) - - mcp->mb[0] = MBC_LIP_RESET; -- mcp->mb[1] = 0xff00; -+#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->mb[1] = 0xff00; - mcp->in_mb = MBX_0; -- mcp->tov = 30; -+ mcp->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -2230,14 +2301,15 @@ qla2x00_send_sns(scsi_qla_host_t *ha, dm - mcp->mb[1] = cmd_size; - mcp->mb[2] = MSW(sns_phys_address); - mcp->mb[3] = LSW(sns_phys_address); -- mcp->mb[6] = QL21_64BITS_4THWD(sns_phys_address); -- mcp->mb[7] = QL21_64BITS_3RDWD(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; -+ /* mcp->tov = ha->login_timeout * 2; */ -+ mcp->tov = (ha->login_timeout * 2) + (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);) -@@ -2294,13 +2366,22 @@ qla2x00_login_fabric(scsi_qla_host_t *ha - ha->host_no);) - - mcp->mb[0] = MBC_LOGIN_FABRIC_PORT; -- mcp->mb[1] = (loop_id << 8) | opt; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = loop_id; -+#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->tov = ha->login_timeout * 2; */ -+ mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout/2); - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -2363,11 +2444,16 @@ qla2x00_login_local_device(scsi_qla_host - DEBUG3(printk("%s(%ld): entered.\n", __func__, ha->host_no);) - - mcp->mb[0] = MBC_LOGIN_LOOP_PORT; -- mcp->mb[1] = (loop_id << 8) ; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = loop_id; -+#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->tov = ha->login_timeout * 2; */ -+ mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout/2); - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -2432,10 +2518,19 @@ qla2x00_fabric_logout(scsi_qla_host_t *h - ha->host_no);) - - mcp->mb[0] = MBC_LOGOUT_FABRIC_PORT; -- mcp->mb[1] = loop_id << 8; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = loop_id; -+#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->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -2484,7 +2579,7 @@ qla2x00_full_login_lip(scsi_qla_host_t * - mcp->mb[3] = 0; - mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; - mcp->in_mb = MBX_0; -- mcp->tov = 30; -+ mcp->tov = 60; - mcp->flags = 0; - rval = (int)qla2x00_mailbox_command(ha, mcp); - -@@ -2502,12 +2597,10 @@ qla2x00_full_login_lip(scsi_qla_host_t * - } - - /* -- * qla2x00_get_port_list -+ * qla2x00_get_id_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. -@@ -2516,40 +2609,37 @@ qla2x00_full_login_lip(scsi_qla_host_t * - * Kernel context. - */ - STATIC 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) -+qla2x00_get_id_list(scsi_qla_host_t *ha, void *id_list, dma_addr_t id_list_dma, -+ uint16_t *entries) - { - int rval; - mbx_cmd_t mc; - mbx_cmd_t *mcp = &mc; - -- DEBUG11(printk("qla2x00_get_port_list(%ld): entered.\n", -+ DEBUG11(printk("qla2x00_get_id_list(%ld): entered.\n", - ha->host_no);) - -- if( gp_list == NULL ) { -+ if (id_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] = QL21_64BITS_4THWD(gpl_phys_address); -- mcp->mb[7] = QL21_64BITS_3RDWD(gpl_phys_address); -- -- mcp->out_mb = MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; -+ mcp->mb[0] = MBC_GET_ID_LIST; -+ mcp->mb[1] = MSW(id_list_dma); -+ mcp->mb[2] = LSW(id_list_dma); -+ mcp->mb[3] = MSW(MSD(id_list_dma)); -+ mcp->mb[6] = LSW(MSD(id_list_dma)); -+ mcp->out_mb = 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); -+ rval = qla2x00_mailbox_command(ha, mcp); - - if (rval != QL_STATUS_SUCCESS) { - /*EMPTY*/ -- DEBUG2_3_11(printk("qla2x00_get_port_list(%ld): failed=%x.\n", -+ DEBUG2_3_11(printk("qla2x00_get_id_list(%ld): failed=%x.\n", - ha->host_no, rval);) - } else { -- *size = mcp->mb[1]; -- DEBUG11(printk("qla2x00_get_port_list(%ld): done.\n", -+ *entries = mcp->mb[1]; -+ DEBUG11(printk("qla2x00_get_id_list(%ld): done.\n", - ha->host_no);) - } - -@@ -2569,12 +2659,12 @@ qla2x00_dump_ram(scsi_qla_host_t *ha, ui - mcp->mb[1] = risc_address & 0xffff; - mcp->mb[3] = LSW(ispdump_dma); - mcp->mb[2] = MSW(ispdump_dma); -- mcp->mb[4] = QL21_64BITS_4THWD(ispdump_dma); -- mcp->mb[6] = QL21_64BITS_3RDWD(ispdump_dma); -+ mcp->mb[4] = MSW(MSD(ispdump_dma)); -+ mcp->mb[6] = LSW(MSD(ispdump_dma)); - mcp->mb[7] = 0; - 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->tov = 60; - mcp->flags = 0; - rval = qla2x00_mailbox_command(ha, mcp); - -@@ -2599,7 +2689,7 @@ qla2x00_dump_ram(scsi_qla_host_t *ha, ui - * Context: - * Kernel context. - */ --static int -+int - qla2x00_lun_reset(scsi_qla_host_t *ha, uint16_t loop_id, uint16_t lun) - { - int rval; -@@ -2609,11 +2699,15 @@ qla2x00_lun_reset(scsi_qla_host_t *ha, u - ENTER("qla2x00_lun_reset"); - - mcp->mb[0] = MBC_LUN_RESET; -- mcp->mb[1] = loop_id << 8; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = loop_id; -+#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->tov = 60; - mcp->flags = 0; - rval = qla2x00_mailbox_command(ha, mcp); - -@@ -2659,16 +2753,24 @@ qla2x00_send_rnid_mbx(scsi_qla_host_t *h - ha->host_no);) - - mcp->mb[0] = MBC_SEND_RNID_ELS; -- mcp->mb[1] = (loop_id << 8 ) | data_fmt; -+#if defined(EXTENDED_IDS) -+ mcp->mb[1] = loop_id; -+#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] = QL21_64BITS_4THWD(buf_phys_addr); -- mcp->mb[7] = QL21_64BITS_3RDWD(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; -+ mcp->tov = 60; - rval = (int)qla2x00_mailbox_command(ha, mcp); - - if (rval != QL_STATUS_SUCCESS) { -@@ -2717,13 +2819,13 @@ qla2x00_set_rnid_params_mbx(scsi_qla_hos - mcp->mb[1] = 0; - mcp->mb[2] = MSW(buf_phys_addr); - mcp->mb[3] = LSW(buf_phys_addr); -- mcp->mb[6] = QL21_64BITS_4THWD(buf_phys_addr); -- mcp->mb[7] = QL21_64BITS_3RDWD(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; -+ mcp->tov = 60; - rval = (int)qla2x00_mailbox_command(ha, mcp); - - if (rval != QLA2X00_SUCCESS) { -@@ -2772,13 +2874,13 @@ qla2x00_get_rnid_params_mbx(scsi_qla_hos - mcp->mb[1] = 0; - mcp->mb[2] = MSW(buf_phys_addr); - mcp->mb[3] = LSW(buf_phys_addr); -- mcp->mb[6] = QL21_64BITS_4THWD(buf_phys_addr); -- mcp->mb[7] = QL21_64BITS_3RDWD(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; -+ mcp->tov = 60; - rval = (int)qla2x00_mailbox_command(ha, mcp); - - if (rval != QLA2X00_SUCCESS) { -@@ -2832,13 +2934,14 @@ qla2x00_get_fcal_position_map(scsi_qla_h - mcp->mb[0] = MBC_GET_FCAL_MAP; - mcp->mb[2] = MSW(pmap_dma); - mcp->mb[3] = LSW(pmap_dma); -- mcp->mb[6] = QL21_64BITS_4THWD(pmap_dma); -- mcp->mb[7] = QL21_64BITS_3RDWD(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; -+ /* mcp->tov = ha->login_timeout * 2; */ -+ mcp->tov = (ha->login_timeout * 2) + (ha->login_timeout/2); - rval = (int)qla2x00_mailbox_command(ha, mcp); - - if (rval == QL_STATUS_SUCCESS) { -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_mbx.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_mbx.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_mbx.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_mbx.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_opts.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_opts.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_opts.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_opts.c 2004-04-22 19:42:21.000000000 -0700 -@@ -146,7 +146,8 @@ static const char * usageText[] = - " -w, --write", - " write option data to a module", - "", -- " MODULE must be 'qla2100_conf', 'qla2200_conf', or 'qla2300_conf'.", -+ " MODULE must be 'qla2100_conf', 'qla2200_conf', 'qla2300_conf'.", -+ " or 'qla200_conf'.", - "", - "Option Data:", - " Option data is read from one of the following files depending on the", -@@ -157,6 +158,7 @@ static const char * usageText[] = - " /etc/qla2100.conf qla2100_conf", - " /etc/qla2200.conf qla2200_conf", - " /etc/qla2300.conf qla2300_conf", -+ " /etc/qla200.conf qla20_conf", - "", - " By default, the following directory is used to specify the location of", - " the modules to update:", -@@ -193,6 +195,7 @@ static const char * usageText[] = - #define MODULE_QLA2100 1 - #define MODULE_QLA2200_CONF 2 - #define MODULE_QLA2300_CONF 3 -+#define MODULE_QLA200_CONF 4 - struct module_info { - - char *name; -@@ -205,6 +208,7 @@ static struct module_info modules[] = { - /* qla2100 not supported */ - { "qla2200_conf", MODULE_QLA2200_CONF, "/etc/qla2200.conf" }, - { "qla2300_conf", MODULE_QLA2300_CONF, "/etc/qla2300.conf" }, -+ { "qla200_conf", MODULE_QLA200_CONF, "/etc/qla200.conf" }, - { NULL, 0, NULL } - }; - struct module_info *module = NULL; -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_ppc64.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_ppc64.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_ppc64.c 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_ppc64.c 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,475 @@ -+/****************************************************************************** -+ * 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. -+ * -+ ******************************************************************************/ -+/* fs/ioctl.c */ -+extern asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, void *); -+ -+extern int register_ioctl32_conversion(unsigned int cmd, -+ int (*handler)(unsigned int, unsigned int, unsigned long, struct file *)); -+extern int unregister_ioctl32_conversion(unsigned int cmd); -+ -+#if 0 -+static char qla2200_drvr_loaded_str[] = "qla2200_driver_loaded"; -+static char qla2300_drvr_loaded_str[] = "qla2300_driver_loaded"; -+#if defined(ISP2200) -+static uint8_t qla2200_driver_loaded = 1; -+#elif defined(ISP2300) -+static uint8_t qla2300_driver_loaded = 1; -+#endif -+#endif -+ -+typedef struct _INT_LOOPBACK_REQ_32 -+{ -+ UINT16 Options; /* 2 */ -+ UINT32 TransferCount; /* 4 */ -+ UINT32 IterationCount; /* 4 */ -+ u32 BufferAddress; /* 4 */ -+ UINT32 BufferLength; /* 4 */ -+ UINT16 Reserved[9]; /* 18 */ -+} INT_LOOPBACK_REQ_32, *PINT_LOOPBACK_REQ_32; /* 36 */ -+ -+typedef struct _INT_LOOPBACK_RSP_32 -+{ -+ u32 BufferAddress; /* 4 */ -+ UINT32 BufferLength; /* 4 */ -+ UINT16 CompletionStatus; /* 2 */ -+ UINT16 CrcErrorCount; /* 2 */ -+ UINT16 DisparityErrorCount; /* 2 */ -+ UINT16 FrameLengthErrorCount; /* 2 */ -+ UINT32 IterationCountLastError; /* 4 */ -+ UINT8 CommandSent; /* 1 */ -+ UINT8 Reserved1; /* 1 */ -+ UINT16 Reserved2[7]; /* 14 */ -+} INT_LOOPBACK_RSP_32, *PINT_LOOPBACK_RSP_32; /* 36 */ -+ -+typedef struct { -+ u32 Signature; /* 4 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 */ -+ u32 RequestAdr; /* 4 */ -+ u32 ResponseAdr; /* 4 */ -+ UINT16 HbaSelect; /* 2 */ -+ UINT16 VendorSpecificStatus[11]; /* 22 */ -+ u32 VendorSpecificData; /* 4 */ -+} EXT_IOCTL_32, *PEXT_IOCTL_32; /* 68 / 0x44 */ -+ -+int -+qla2x00_xfr_to_64loopback(EXT_IOCTL *pext, void **preq_32, void **prsp_32); -+int -+qla2x00_xfr_from_64loopback(EXT_IOCTL *pext, void **preq_32, void **prsp_32); -+ -+ -+/************************************/ -+/* Start of function implementation */ -+/************************************/ -+int -+qla2x00_ioctl32(unsigned int fd, unsigned int cmd, unsigned long arg, -+ struct file *pfile) -+{ -+ EXT_IOCTL_32 ext32; -+ EXT_IOCTL_32 *pext32 = &ext32; -+ EXT_IOCTL ext; -+ EXT_IOCTL *pext = &ext; -+ void *preq_32 = NULL; /* request pointer */ -+ void *prsp_32 = NULL; /* response pointer */ -+ -+ mm_segment_t old_fs; -+ int ret; -+ int tmp_rval; -+ -+ /* Catch any non-exioct ioctls */ -+ if (_IOC_TYPE(cmd) != QLMULTIPATH_MAGIC) { -+ return (-EINVAL); -+ } -+ -+ if (copy_from_user(pext32, (char *)arg, sizeof(EXT_IOCTL_32))) { -+ KMEM_FREE(pext32, sizeof(EXT_IOCTL_32)); -+ return (-EFAULT); -+ } -+ -+ DEBUG9(printk("%s: got hba instance %d.\n", -+ __func__, pext32->HbaSelect);) -+ -+ /* transfer values to EXT_IOCTL */ -+ memcpy(&pext->Signature, &pext32->Signature, sizeof(pext32->Signature)); -+ pext->AddrMode = pext32->AddrMode; -+ pext->Version = pext32->Version; -+ pext->SubCode = pext32->SubCode; -+ pext->Instance = pext32->Instance; -+ pext->Status = pext32->Status; -+ pext->DetailStatus = pext32->DetailStatus; -+ pext->Reserved1 = pext32->Reserved1; -+ pext->RequestLen = pext32->RequestLen; -+ pext->ResponseLen = pext32->ResponseLen; -+ pext->RequestAdr = (UINT64)(u64)pext32->RequestAdr; -+ pext->ResponseAdr = (UINT64)(u64)pext32->ResponseAdr; -+ pext->HbaSelect = pext32->HbaSelect; -+ memcpy(pext->VendorSpecificStatus, pext32->VendorSpecificStatus, -+ sizeof(pext32->VendorSpecificStatus)); -+ pext->VendorSpecificData = (UINT64)(u64)pext32->VendorSpecificData; -+ -+ /* transfer values for each individual command as necessary */ -+ switch (cmd) { /* switch on EXT IOCTL COMMAND CODE */ -+ case INT_CC_LOOPBACK: -+ qla2x00_xfr_to_64loopback(pext, &preq_32, &prsp_32); -+ break; -+ } -+ -+ old_fs = get_fs(); -+ set_fs(KERNEL_DS); /* tell kernel to accept arg in kernel space */ -+ -+ ret = sys_ioctl(fd, cmd, pext); -+ -+ set_fs(old_fs); -+ -+ /* transfer values back for each individual command as necessary */ -+ switch (cmd) { /* switch on EXT IOCTL COMMAND CODE */ -+ case INT_CC_LOOPBACK: -+ qla2x00_xfr_from_64loopback(pext, &preq_32, &prsp_32); -+ break; -+ } -+ -+ /* transfer values back to EXT_IOCTL_32 */ -+ pext32->Instance = pext->Instance; -+ pext32->Status = pext->Status; -+ pext32->DetailStatus = pext->DetailStatus; -+ pext32->Reserved1 = pext->Reserved1; -+ pext32->RequestLen = pext->RequestLen; -+ pext32->ResponseLen = pext->ResponseLen; -+ pext32->HbaSelect = pext->HbaSelect; -+ memcpy(pext32->VendorSpecificStatus, pext->VendorSpecificStatus, -+ sizeof(pext32->VendorSpecificStatus)); -+ pext32->VendorSpecificData = (u32)(u64)pext->VendorSpecificData; -+ -+ /* Always try to copy values back regardless what happened before. */ -+ tmp_rval = copy_to_user((char *)arg, pext32, sizeof(EXT_IOCTL_32)); -+ if (ret == 0) -+ ret = tmp_rval; -+ -+ return (ret); -+} -+ -+static inline int -+apidev_reg_increasing_idx(uint16_t low_idx, uint16_t high_idx) -+{ -+ int err = 0; -+ int i; -+ unsigned int cmd; -+ -+ for (i = low_idx; i <= high_idx; i++) { -+ cmd = (unsigned int)QL_IOCTL_CMD(i); -+ err = register_ioctl32_conversion(cmd, qla2x00_ioctl32); -+ if (err) { -+ DEBUG9(printk( -+ "%s: error registering cmd %x. err=%d.\n", -+ __func__, cmd, err);) -+ break; -+ } -+ DEBUG9(printk("%s: registered cmd %x.\n", __func__, cmd);) -+ } -+ -+ return (err); -+} -+ -+static inline int -+apidev_unreg_increasing_idx(uint16_t low_idx, uint16_t high_idx) -+{ -+ int err = 0; -+ int i; -+ unsigned int cmd; -+ -+ for (i = low_idx; i <= high_idx; i++) { -+ cmd = (unsigned int)QL_IOCTL_CMD(i); -+ err = unregister_ioctl32_conversion(cmd); -+ if (err) { -+ DEBUG9(printk( -+ "%s: error unregistering cmd %x. err=%d.\n", -+ __func__, cmd, err);) -+ break; -+ } -+ DEBUG9(printk("%s: unregistered cmd %x.\n", __func__, cmd);) -+ } -+ -+ return (err); -+} -+ -+#if 0 -+static inline int -+apidev_other_qla_drvr_loaded(void) -+{ -+#if defined(ISP2200) -+ if (inter_module_get(qla2300_drvr_loaded_str)) { -+ /* 2300 is already loaded */ -+ /* decrement usage count */ -+ inter_module_put(qla2300_drvr_loaded_str); -+ DEBUG9(printk("%s: found 2300 already loaded.\n", __func__);) -+ return TRUE; -+ } -+#elif defined(ISP2300) -+ if (inter_module_get(qla2200_drvr_loaded_str)) { -+ /* 2200 is already loaded */ -+ /* decrement usage count */ -+ inter_module_put(qla2200_drvr_loaded_str); -+ DEBUG9(printk("%s: found 2200 already loaded.\n", __func__);) -+ return TRUE; -+ } -+#endif -+ return FALSE; -+} -+#endif -+ -+static inline void -+apidev_init_ppc64(void) -+{ -+ int err; -+ -+#if 0 -+#if defined(ISP2200) -+ inter_module_register(qla2200_drvr_loaded_str, THIS_MODULE, -+ &qla2200_driver_loaded); -+#elif defined(ISP2300) -+ inter_module_register(qla2300_drvr_loaded_str, THIS_MODULE, -+ &qla2300_driver_loaded); -+#endif -+ -+ if (apidev_other_qla_drvr_loaded()) { -+ /* ioctl registered before */ -+ return; -+ } -+#endif -+ -+ DEBUG9(printk("qla2x00: going to register ioctl32 cmds.\n");) -+ err = apidev_reg_increasing_idx(EXT_DEF_LN_REG_CC_START_IDX, -+ EXT_DEF_LN_REG_CC_END_IDX); -+ if (!err) { -+ err = apidev_reg_increasing_idx(EXT_DEF_LN_INT_CC_START_IDX, -+ EXT_DEF_LN_INT_CC_END_IDX); -+ } -+ if (!err) { -+ err = apidev_reg_increasing_idx(EXT_DEF_LN_ADD_CC_START_IDX, -+ EXT_DEF_LN_ADD_CC_END_IDX); -+ } -+ if (!err) { -+ err = apidev_reg_increasing_idx(FO_CC_START_IDX, FO_CC_END_IDX); -+ } -+ if (!err) { -+ /* Linux specific cmd codes are defined in decreasing order. */ -+ err = apidev_reg_increasing_idx(EXT_DEF_LN_SPC_CC_END_IDX, -+ EXT_DEF_LN_SPC_CC_START_IDX); -+ } -+} -+ -+static inline void -+apidev_cleanup_ppc64(void) -+{ -+ int err; -+ -+#if 0 -+#if defined(ISP2200) -+ inter_module_unregister(qla2200_drvr_loaded_str); -+#elif defined(ISP2300) -+ inter_module_unregister(qla2300_drvr_loaded_str); -+#endif -+ -+ if (apidev_other_qla_drvr_loaded()) { -+ /* don't unregister yet */ -+ return; -+ } -+#endif -+ -+ DEBUG9(printk("qla2x00: going to unregister ioctl32 cmds.\n");) -+ err = apidev_unreg_increasing_idx(EXT_DEF_LN_REG_CC_START_IDX, -+ EXT_DEF_LN_REG_CC_END_IDX); -+ if (!err) { -+ err = apidev_unreg_increasing_idx(EXT_DEF_LN_INT_CC_START_IDX, -+ EXT_DEF_LN_INT_CC_END_IDX); -+ } -+ if (!err) { -+ err = apidev_unreg_increasing_idx(EXT_DEF_LN_ADD_CC_START_IDX, -+ EXT_DEF_LN_ADD_CC_END_IDX); -+ } -+ if (!err) { -+ err = apidev_unreg_increasing_idx(FO_CC_START_IDX, -+ FO_CC_END_IDX); -+ } -+ if (!err) { -+ /* Linux specific cmd codes are defined in decreasing order. */ -+ err = apidev_unreg_increasing_idx(EXT_DEF_LN_SPC_CC_END_IDX, -+ EXT_DEF_LN_SPC_CC_START_IDX); -+ } -+} -+ -+int -+qla2x00_xfr_to_64loopback(EXT_IOCTL *pext, void **preq_32, void **prsp_32) -+{ -+ int status; -+ -+ INT_LOOPBACK_REQ_32 lb_req_32; -+ INT_LOOPBACK_REQ_32 *plb_req_32 = &lb_req_32; -+ INT_LOOPBACK_REQ *plb_req; -+ INT_LOOPBACK_RSP_32 lb_rsp_32; -+ INT_LOOPBACK_RSP_32 *plb_rsp_32 = &lb_rsp_32; -+ INT_LOOPBACK_RSP *plb_rsp; -+ -+ plb_req = (UINT64)KMEM_ZALLOC(sizeof(INT_LOOPBACK_REQ), 50); -+ if (plb_req == NULL) { -+ /* error */ -+ pext->Status = EXT_STATUS_NO_MEMORY; -+ printk(KERN_WARNING -+ "qla2x00: ERROR in ioctl loopback request conversion " -+ "allocation.\n"); -+ return QL_STATUS_ERROR; -+ } -+ plb_rsp = (UINT64)KMEM_ZALLOC(sizeof(INT_LOOPBACK_RSP), 51); -+ if (plb_rsp == NULL) { -+ /* error */ -+ pext->Status = EXT_STATUS_NO_MEMORY; -+ printk(KERN_WARNING -+ "qla2x00: ERROR in ioctl loopback response conversion " -+ "allocation.\n"); -+ return QL_STATUS_ERROR; -+ } -+ -+ if (pext->RequestLen != sizeof(INT_LOOPBACK_REQ_32)) { -+ pext->Status = EXT_STATUS_INVALID_PARAM; -+ DEBUG9_10(printk( -+ "%s: invalid RequestLen =%d.\n", -+ __func__, pext->RequestLen);) -+ return QL_STATUS_ERROR; -+ } -+ -+ if (pext->ResponseLen != sizeof(INT_LOOPBACK_RSP_32)) { -+ pext->Status = EXT_STATUS_INVALID_PARAM; -+ DEBUG9_10(printk( -+ "%s: invalid ResponseLen =%d.\n", -+ __func__, pext->ResponseLen);) -+ return QL_STATUS_ERROR; -+ } -+ -+ status = copy_from_user(plb_req_32, pext->RequestAdr, -+ pext->RequestLen); -+ if (status) { -+ pext->Status = EXT_STATUS_COPY_ERR; -+ DEBUG9_10(printk("%s: ERROR copy " -+ "request buffer.\n", __func__);) -+ return QL_STATUS_ERROR; -+ } -+ -+ status = copy_from_user(plb_rsp_32, pext->ResponseAdr, -+ pext->ResponseLen); -+ if (status) { -+ pext->Status = EXT_STATUS_COPY_ERR; -+ DEBUG9_10(printk("%s: ERROR copy " -+ "response buffer.\n", __func__);) -+ return QL_STATUS_ERROR; -+ } -+ -+ /* Save for later */ -+ *preq_32 = pext->RequestAdr; -+ *prsp_32 = pext->ResponseAdr; -+ -+ /* Transfer over values */ -+ plb_req->Options = plb_req_32->Options; -+ plb_req->TransferCount = plb_req_32->TransferCount; -+ plb_req->IterationCount = plb_req_32->IterationCount; -+ plb_req->BufferAddress = (UINT64)(u64)plb_req_32->BufferAddress; -+ plb_req->BufferLength = plb_req_32->BufferLength; -+ -+ plb_rsp->BufferAddress = (UINT64)(u64)plb_rsp_32->BufferAddress; -+ plb_rsp->BufferLength = plb_rsp_32->BufferLength; -+ plb_rsp->CompletionStatus = plb_rsp_32->CompletionStatus; -+ plb_rsp->CrcErrorCount = plb_rsp_32->CrcErrorCount; -+ plb_rsp->DisparityErrorCount = plb_rsp_32->DisparityErrorCount; -+ plb_rsp->FrameLengthErrorCount = plb_rsp_32->FrameLengthErrorCount; -+ plb_rsp->IterationCountLastError = plb_rsp_32->IterationCountLastError; -+ plb_rsp->CommandSent = plb_rsp_32->CommandSent; -+ -+ /* Assign new values */ -+ pext->RequestAdr = plb_req; -+ pext->ResponseAdr = plb_rsp; -+ pext->RequestLen = sizeof(INT_LOOPBACK_REQ); -+ pext->ResponseLen = sizeof(INT_LOOPBACK_RSP); -+ -+ return 0; -+} -+ -+int -+qla2x00_xfr_from_64loopback(EXT_IOCTL *pext, void **preq_32, void **prsp_32) -+{ -+ int status; -+ -+ INT_LOOPBACK_REQ_32 lb_req_32; -+ INT_LOOPBACK_REQ_32 *plb_req_32 = &lb_req_32; -+ INT_LOOPBACK_REQ *plb_req; -+ INT_LOOPBACK_RSP_32 lb_rsp_32; -+ INT_LOOPBACK_RSP_32 *plb_rsp_32 = &lb_rsp_32; -+ INT_LOOPBACK_RSP *plb_rsp; -+ -+ plb_req = (INT_LOOPBACK_REQ *)pext->RequestAdr; -+ plb_rsp = (INT_LOOPBACK_RSP *)pext->ResponseAdr; -+ -+ plb_req_32->Options = plb_req->Options; -+ plb_req_32->TransferCount = plb_req->TransferCount; -+ plb_req_32->IterationCount = plb_req->IterationCount; -+ plb_req_32->BufferAddress = (u32)(u64)plb_req->BufferAddress; -+ plb_req_32->BufferLength = plb_req->BufferLength; -+ -+ plb_rsp_32->BufferAddress = (u32)(u64)plb_rsp->BufferAddress; -+ plb_rsp_32->BufferLength = plb_rsp->BufferLength; -+ plb_rsp_32->CompletionStatus = plb_rsp->CompletionStatus; -+ plb_rsp_32->CrcErrorCount = plb_rsp->CrcErrorCount; -+ plb_rsp_32->DisparityErrorCount = plb_rsp->DisparityErrorCount; -+ plb_rsp_32->FrameLengthErrorCount = plb_rsp->FrameLengthErrorCount; -+ plb_rsp_32->IterationCountLastError = plb_rsp->IterationCountLastError; -+ plb_rsp_32->CommandSent = plb_rsp->CommandSent; -+ -+ KMEM_FREE(plb_req, sizeof(INT_LOOPBACK_REQ)); -+ KMEM_FREE(plb_rsp, sizeof(INT_LOOPBACK_RSP)); -+ -+ pext->RequestAdr = *preq_32; -+ pext->ResponseAdr = *prsp_32; -+ pext->RequestLen = sizeof(INT_LOOPBACK_REQ_32); -+ pext->ResponseLen = sizeof(INT_LOOPBACK_RSP_32); -+ -+ status = copy_to_user(pext->RequestAdr, plb_rsp_32, pext->RequestLen); -+ if (status) { -+ pext->Status = EXT_STATUS_COPY_ERR; -+ DEBUG9_10(printk("%s: ERROR " -+ "write of request data buffer.\n", __func__);) -+ return QL_STATUS_ERROR; -+ } -+ -+ /* put loopback return data in user buffer */ -+ status = copy_to_user(pext->ResponseAdr, plb_rsp_32, pext->ResponseLen); -+ if (status) { -+ pext->Status = EXT_STATUS_COPY_ERR; -+ DEBUG9_10(printk("%s: ERROR " -+ "write of response data buffer.\n", __func__);) -+ return QL_STATUS_ERROR; -+ } -+ -+ return 0; -+} -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_settings.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_settings.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_settings.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_settings.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -21,7 +21,7 @@ - * 0 - Disable and 1 - Enable - */ - #define LOOP_ID_FROM_ONE 0 /* loop ID start from 1 when P2P */ --#define MEMORY_MAPPED_IO 0 -+#define MEMORY_MAPPED_IO 1 - #define DEBUG_QLA2100_INTR 0 - #define USE_NVRAM_DEFAULTS 0 - #define DEBUG_PRINT_NVRAM 0 -@@ -35,16 +35,17 @@ - #define WATCH_THREADS_SIZ 0 /* watch size of pending queue */ - #define USE_PORTNAME 1 /* option to use port names for targets */ - #define LUN_MASKING 0 --#define USE_FLASH_DATABASE 0 /* Save persistent data to flash */ - #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 */ - --#if defined(FC_IP_SUPPORT) - #define REG_FC4_ENABLED 1 /* Enable register_fc4 call */ -+ -+#if defined(ISP200) -+#define REG_FDMI_ENABLED 0 /* Support FDMI registration */ - #else --#define REG_FC4_ENABLED 0 /* Enable register_fc4 call */ -+#define REG_FDMI_ENABLED 1 /* Support FDMI registration */ - #endif - - #undef TRACECODE /* include tracing code in watchdog routines */ -@@ -57,23 +58,11 @@ - #define NO_LONG_DELAYS 0 - #define QL_TRACE_MEMORY 0 - --/* -- * This enables some performance code which is not enabled -- * normally: -- * -- * - a tasklet to process the done queue and send requests back to -- * the OS. -- */ --#define QLA2X_PERFORMANCE 1 -- --/* The following WORD_FW_LOAD is defined in Makefile for ia-64 builds -- and can also be decommented here for Word by Word confirmation of -- RISC code download operation */ --/* #define WORD_FW_LOAD 0 */ -- - #define MPIO_SUPPORT 0 - #define VSA 0 /* Volume Set Addressing */ - -+#define QLA2XXX_LOOP_RETRY_COUNT 10 -+ - #define PERF_CODE 0 /* enable performance code */ - #define EH_DEBUG 0 /* enable new error handling debug */ - /* -@@ -133,6 +122,10 @@ - - /* Max time to wait for the loop to be in LOOP_READY state */ - #define MAX_LOOP_TIMEOUT ( 60 * 5) -+ -+/* Default: IOCTL pass-thru command timeout in seconds. */ -+#define QLA_PT_CMD_TOV (66) -+ - #define EH_ACTIVE 1 /* Error handler active */ - - #include "qla_version.h" -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_vendor.c linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_vendor.c ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_vendor.c 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_vendor.c 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_version.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_version.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qla_version.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qla_version.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -19,9 +19,9 @@ - /* - * Driver version - */ --#define QLA2100_VERSION "6.06.00" -+#define QLA2100_VERSION "7.00.00b22" - --#define QLA_DRIVER_MAJOR_VER 6 --#define QLA_DRIVER_MINOR_VER 6 -+#define QLA_DRIVER_MAJOR_VER 7 -+#define QLA_DRIVER_MINOR_VER 0 - #define QLA_DRIVER_PATCH_VER 0 --#define QLA_DRIVER_BETA_VER 0 -+#define QLA_DRIVER_BETA_VER 22 -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qlfo.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qlfo.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qlfo.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qlfo.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qlfolimits.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qlfolimits.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qlfolimits.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qlfolimits.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qlfoln.h linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qlfoln.h ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/qlfoln.h 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/qlfoln.h 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - * QLOGIC LINUX SOFTWARE - * - * QLogic ISP2x00 device driver for Linux 2.4.x -- * Copyright (C) 2003 Qlogic Corporation -+ * Copyright (C) 2003 QLogic Corporation - * (www.qlogic.com) - * - * This program is free software; you can redistribute it and/or modify it -@@ -19,33 +19,46 @@ - - - #define QLMULTIPATH_MAGIC 'y' --/********************************************************/ --/* Failover ioctl command codes range from 0xc0 to 0xdf */ --/********************************************************/ -+#define QL_IOCTL_BASE(idx) \ -+ _IOWR(QLMULTIPATH_MAGIC, idx, sizeof(EXT_IOCTL)) - -+#if defined(QLA_CONFIG_COMPAT) -+#define QL_IOCTL_CMD(idx) (QL_IOCTL_BASE(idx) - 0x40000) -+#else -+#define QL_IOCTL_CMD(idx) QL_IOCTL_BASE(idx) -+#endif -+ -+/************************************************************* -+ * Failover ioctl command codes range from 0xc0 to 0xdf. -+ * The foioctl command code end index must be updated whenever -+ * adding new commands. -+ *************************************************************/ -+#define FO_CC_START_IDX 0xc8 /* foioctl cmd start index */ - - #define FO_CC_GET_PARAMS_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 200, sizeof(EXT_IOCTL)) /* 0xc8 */ -+ QL_IOCTL_CMD(0xc8) - #define FO_CC_SET_PARAMS_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 201, sizeof(EXT_IOCTL)) /* 0xc9 */ -+ QL_IOCTL_CMD(0xc9) - #define FO_CC_GET_PATHS_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 202, sizeof(EXT_IOCTL)) /* 0xca */ -+ QL_IOCTL_CMD(0xca) - #define FO_CC_SET_CURRENT_PATH_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 203, sizeof(EXT_IOCTL)) /* 0xcb */ -+ QL_IOCTL_CMD(0xcb) - #define FO_CC_GET_HBA_STAT_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 204, sizeof(EXT_IOCTL)) /* 0xcc */ -+ QL_IOCTL_CMD(0xcc) - #define FO_CC_RESET_HBA_STAT_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 205, sizeof(EXT_IOCTL)) /* 0xcd */ -+ QL_IOCTL_CMD(0xcd) - #define FO_CC_GET_LUN_DATA_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 206, sizeof(EXT_IOCTL)) /* 0xce */ -+ QL_IOCTL_CMD(0xce) - #define FO_CC_SET_LUN_DATA_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 207, sizeof(EXT_IOCTL)) /* 0xcf */ -+ QL_IOCTL_CMD(0xcf) - #define FO_CC_GET_TARGET_DATA_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 208, sizeof(EXT_IOCTL)) /* 0xd0 */ -+ QL_IOCTL_CMD(0xd0) - #define FO_CC_SET_TARGET_DATA_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 209, sizeof(EXT_IOCTL)) /* 0xd1 */ -+ QL_IOCTL_CMD(0xd1) - #define FO_CC_GET_FO_DRIVER_VERSION_OS \ -- _IOWR(QLMULTIPATH_MAGIC, 210, sizeof(EXT_IOCTL)) /* 0xd2 */ -+ QL_IOCTL_CMD(0xd2) -+ -+#define FO_CC_END_IDX 0xd2 /* foioctl cmd end index */ - - - #define BOOLEAN uint8_t -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/README.qla2x00 linux-2.4.21-x86_64/drivers/scsi/qla2xxx/README.qla2x00 ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/README.qla2x00 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/README.qla2x00 2004-04-22 19:42:21.000000000 -0700 -@@ -2,7 +2,7 @@ - - Products supported: QLA22XX, QLA23XX - --08/07/2003 -+03/23/2004 - - Contents - -------- -@@ -16,12 +16,14 @@ Contents - 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 -+ 5.1 Building the driver using the Source RPM package -+ 5.1.1 Installing the QLogic Driver Source RPM -+ 5.1.2 Uinstalling the QLogic Driver Source RPM -+ 5.2 Building the driver from the Source -+ 5.2.1. Building a Uni-Processor (UP) version of the driver -+ 5.2.2. Building a Symmetric Multi-Processor(SMP) version of the - Driver -- 5.2 Load the Driver Manually using INSMOD or MODPROBE -+ 5.3 Load the Driver Manually using INSMOD or MODPROBE - 5.3 Making a RAMDISK Image to Load the Driver - - 6. Driver Parameters -@@ -99,7 +101,7 @@ Please refer to Release Notes (release.t - 4. Saving the Driver Distribution / Source file to Diskette - ----------------------------------------------------------- - --1. Download the failover or non-failover distribution file -+1. Download the driver distribution file - - qla2x00-vx.yy.zz-dist.tgz or the driver source file - - qla2x00-vx.yy.zz.tgz from QLogic's website. - -@@ -118,7 +120,39 @@ Please refer to Release Notes (release.t - 5. Installing the Driver - ------------------------ - --5.1 Building a Driver from the Source Code -+5.1 Building the Driver using the source RPM package -+------------------------------------------------------ -+The easiliest way to install and build the QLogic Linux driver is to -+use the source RPM package. The only requirement for the rpm is the -+kernel-sources which is normally installed when the kernel is installed -+on the system. The following distributions are supported: -+ -+1. Red Hat Advanced Server 2.1 -+2. Red Hat Enterprise Linux 3.0 -+3. SUSE Linux Enterprise Server 8 (SLES 8) -+ -+5.1.1 Installng the QLogic Driver Source RPM -+ -+ Install the Source RPM by executing the following command : -+ -+ # rpm -i qla2x00-vX.XX.XXbXX-Y.ZZZZ.rpm -+ -+5.1.2 Uinstalling the QLogic Driver Source RPM -+ -+ Uninstall the Source RPM by executing the following command : -+ -+ # rpm -e qla2x00-vX.XX.XXbXX-Y -+ -+5.1.3 Installing only the Driver Source from Source RPM -+ -+ Install only the Driver Source from Source RPM by executing the following command : -+ -+ # rpm -i --noscripts qla2x00-vX.XX.XXbXX-Y.ZZZZ.rpm -+ -+ -+Note : Driver source is installed in - /usr/src/qla2x00 path upon installation of the Source RPM. -+ -+5.2 Building a Driver from the Source Code - ------------------------------------------- - - From the source code, you can build a qla2200.o or qla2300.o for -@@ -126,7 +160,7 @@ your UP or SMP system, and load the driv - using a RAMDISK image during system boot time. - - --5.1.1 Building a Uni-Processor (UP) Version of the Driver -+5.2.1 Building a Uni-Processor (UP) Version of the Driver - --------------------------------------------------------- - - For RedHat Distribution: -@@ -166,8 +200,8 @@ For SuSE Distribution: - 1. Install the kernel-source from the SuSE distribution CD-ROM - by typing: - -- # yast or -- # yast2 -+ # yast -i kernel-source or -+ # yast2 -i kernel-source - - 2. Create a soft link ( /usr/src/linux) to the kernel source - (/usr/src/<linux-version>) by typing: -@@ -177,7 +211,7 @@ For SuSE Distribution: - 3. To ensure kernel version synchronization between the driver and - running kernel, type the following: - -- # cd /usr/src/linux -+ # cd /usr/src/linux - # make mrproper (completely clean the kernel tree) - # cp /boot/vmlinuz.config .config (copy the new config) - # make oldconfig (update configuration using .config) -@@ -208,11 +242,11 @@ For SuSE Distribution: - # make all OSVER=linux - - --NOTE: 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. -+NOTE: To load the driver manually, see section 5.3. To make a RAMDISK -+ image to load the driver during system boot time, see section 5.4. - - --5.1.2. Building a Symmetric Multi-Processor (SMP) Version of the Driver -+5.2.2. Building a Symmetric Multi-Processor (SMP) Version of the Driver - ----------------------------------------------------------------------- - - For RedHat Distribution: -@@ -252,8 +286,8 @@ For SuSE Distribution: - 1. Install the kernel-source from the SuSE distribution CD-ROM - by typing: - -- # yast or -- # yast2 -+ # yast -i kernel-source or -+ # yast2 -i kernel-source - - 2. Create a soft link ( /usr/src/linux) to the kernel source - (/usr/src/<linux-version>) by typing: -@@ -294,16 +328,16 @@ For SuSE Distribution: - # make all SMP=1 OSVER=linux - - --NOTE: 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. -+NOTE: To load the driver manually, see section 5.3. To make a RAMDISK -+ image to load the driver during system boot time, see section 5.4. - - - --5.2 Load the Driver Manually using INSMOD or MODPROBE -+5.3 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. -+Before loading the driver manually, build the driver binary by installing Source RPM as described -+in sections 5.1.1 or from the driver source files as described in sections 5.2.1 and 5.2.2. - - - To load the driver directly from the local build directory, type - the following: -@@ -321,7 +355,7 @@ the driver source files as described in - - For SuSE Distribution: - -- # make all OSVER=linux install (build the driver and copy to the right location) -+# make all OSVER=linux install (build the driver and copy to the right location) - - 2. Type the following to load the Driver: - -@@ -330,22 +364,20 @@ the driver source files as described in - # modprobe qla2300 - - --5.3 Making a RAMDISK Image to Load the Driver -+5.4 Making a RAMDISK Image to Load the Driver - ---------------------------------------------- - --1. Build the Driver binary files (see 5.1.1 and 5.1.2). -+1. Build the Driver binary files (see 5.2.1 and 5.2.2). - --2. Copy the files to: -+2. Install the driver : - -- /lib/modules/<kernel version>/kernel/drivers/scsi/ -+ For RedHat Distribuion: - -- 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 -+ # make all install -+ -+ For SuSE Distribution: -+ -+ # make all OSVER=linux install - - 3. Add the following line to /etc/modules.conf. - -@@ -366,7 +398,7 @@ the driver source files as described in - For SuSE Distribution: - - You will need to modify the /etc/sysconfig/kernel file to specify -- while modules will be added during initrd creation. -+ which modules will be added during ram disk creation. - - NOTE: Please ensure the conf module is listed before the actual - driver module. For example: -@@ -471,10 +503,6 @@ the driver source files as described in - 6. Driver Parameters - -------------------- - --The Driver parameters are divided into System Parameters and NVRAM --Parameters sections. -- -- - 6.1 System Parameters - ---------------------- - -@@ -571,29 +599,100 @@ None. - - 6.3 Driver Command Line Parameters - ----------------------------------- -+The driver gets its parameters from the command line itself or from -+modprobe 'option' directive found in the modules.conf file or qla2[2,3]00_conf -+module. The parameters are in simple keyword=value format, i.e. ql2xfailover=1. -+Where keyword is one of the following option parameters: - --The available command line options can be viewed using one --or all of the three Linux commands depending on board type: -+ Usage: insmod qla2300 <keyword>=<value> -+ -+* ql2xfailover - Enables/Disables Driver failover support. -+ 0 to disable; 1 to enable. -+ -+ Default behaviour based on compile-time option MPIO_SUPPORT -+ in qla_settings.h. - -- # modinfo -p qla2300 -- # modinfo -p qla2200 -- # modinfo -p qla2100 -+* ql2xmaxqdepth - Maximum queue depth reported to scsi mid-level for -+ each OS device. This specifies the number of outstanding requests -+ per lun. - --The option "ql2xopts=" has additional sub-options as follows: -+* ql2xlogintimeout - Defines the Login timeout value in seconds -+ once initial login. - -- verbose - Verbose detail debug information - on by default -+* qlport_down_retry - Defines the command retries to a port that returns" -+ "a PORT-DOWN status."); - -- quiet - Driver does not display normal messages to console: -- Waiting for LIP to complete.... -- scsi%d: Topology - %s, Host Loop address 0x%x -- scsi(%d): LIP occurred -- scsi(%d): LIP reset occurred -+* ql2xretrycount, -+ "Maximum number of mid-layer retries allowed for a command. " -+ "Default value in non-failover mode is 20, " -+ "in failover mode, 30."); -+ -+* max_srbs - This parameter specifies the Maximum number of simultaneous -+ commands that can be accepted from the mid-level per HBA. Default: 4096. -+ -+* displayConfig - this parameter will display the current configuration. -+ 1 - display the configuration; 0 - don't display the configuration. -+ Default - 1 -+ -+* ConfigRequired - "If 1, then only configured devices passed in through the" -+ "ql2xopts parameter will be presented to the OS"); -+ -+* recoveryTime - "Recovery time in seconds before a target device is sent I/O " -+ "after a failback is performed."); -+ -+* failbackTime - Defines the delay in seconds before a failback is performed. -+ Default - 3 -+ -+* Binding method - Defines what target persistent binding method to use: -+ 0 - bind by Portname and 1 - bind by PortID. -+ Default - 0 (portname binding) -+ -+* extended_error_logging - Defines whether to enable (1) or Disable (0) writing -+ the debug information to /var/log/messages. -+ Default - 0 (disable) -+ -+* MaxPathsPerDevice - maximum number of paths to a device -+ Default - 8 (compile time only) -+ -+* MaxRetriesPerPath - Defines how many retries to perform on the current -+ path before failing over to the next path in the path list. -+ Default - 3 -+ -+* MaxRetriesPerIo - Defines total retries to do before failing the command -+ and returning to the OS with selection timeout (DID_NO_CONNECT). -+ Default - (MaxRetriesPerPath * MaxPathsPerDevice ) + 1 -+ -+* QlFailoverNotifyType - Defines type of failover notification mechanism -+ to use when a failover or failback occurs. Certain storage systems require -+ special CDB's to be issued to do failover or failback. -+ Default - 0 (none) -+ -+* ConfigRequired - Defines how to bind the devices. -+ 0 - Present all the devices discovered to the OS. -+ 1 - Present only the configured devices (i.e. the device defined in -+ /etc/qla2300_conf ) to the OS. -+ Default - 0 -+ -+* FailbackTime - Defines the delay in seconds before a failback is performed -+ to ensure all paths are available. -+ Default - 5 seconds -+ -+* RecoveryTime - Defines the recovery time in seconds required before commands -+ can be sent down the restored path. -+ Default - 10 seconds -+ -+ -+ All the available parameters can be viewed using one -+ of the following commands: -+ -+ # modinfo -p qla2300 -+ # modinfo -p qla2200 -+ # modinfo -p qla2100 - - Usage examples: - -- # insmod qla2200.o ql2xfailover=1 -- # insmod qla2200.o qlport_down_retry=60 -- # insmod qla2300.o ql2xopts="quiet" -+ # insmod qla2300.o ql2xfailover=1 -+ # insmod qla2300.o qlport_down_retry=60 - - - ********************************************************************** -@@ -790,14 +889,14 @@ 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. -+The Persistent Binding information consists of some adapter configuration -+entries along with some target entries. The entries are specified in -+two formats: verbose and shorten. The shorten format allows a bigger -+configuration to fix in the limited space on the command line. An -+alternate to command line is the configuration file. See section -+8.5. - --Persistent Binding can be specified in two ways. Manually or using -+Persistent Binding can be specified in two ways. Manually or via - 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 -@@ -811,7 +910,7 @@ The best way to extract configuration me - 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 -+ #insmod qla2300 displayConfig=1 - #grep "scsi-qla" /var/log/messages > /tmp/info.cfg - - The format of the persistent binding commands is as follows: -@@ -885,79 +984,33 @@ This mask specification is heavily type - 8.5 Configuration Data - ---------------------- - --To pass the configuration data to the driver, load it using "modprobe" --instead of "insmod". -- --8.5.1 Limitations With /etc/modules.conf ------------------------------------------ -- --Due to size constraints inherent in the user-space applications which load --kernel modules, the total amount of configuration data that could be passed via --modules.conf by the modprobe application was around 4096 bytes of information --(with minor tuning of the modutil package). Of course, as densities of SANs --increase, larger configuration spaces are needed to accommodate the --information. -- --In general, the following formula can be used to compute an approximate size in --bytes of the configuration data needed to store information pertaining to 'M' --HBAs and 'N' targets/device paths: -- -- 75 + 42*M + 381*N -- --Plugging in values for common configurations returns some sample results: -- -- 2 same type HBAs - (75 + 2*42 == 159) -- ---------------- -- 1 target - 75+2*42+381*1 = 540 bytes -- 2 targets - 75+2*42+381*2 = 921 bytes -- 3 targets - 75+2*42+381*3 = 1302 bytes -- 4 targets - 75+2*42+381*4 = 1683 bytes -- 5 targets - 75+2*42+381*5 = 2064 bytes -- ... -- -- 3 same type HBAs (75 + 3*42 == 201) -- ---------------- -- 1 target - 75+3*42+381*1 = 582 bytes -- 2 targets - 75+3*42+381*2 = 963 bytes -- 3 targets - 75+3*42+381*3 = 1344 bytes -- 4 targets - 75+3*42+381*4 = 1725 bytes -- 5 targets - 75+3*42+381*5 = 2086 bytes -- ... -- --Please note, a target in this case does not always indicate a distinct piece of --storage -- it could represent 'n' paths to the same storage, as is the case --with failover in a true-cloud configuration. As an example, the configuration --data size needed for two storage devices with four paths (via two HBAs) to each --storage (4*2 paths) would need approximately 3200 bytes (75 + 42*2 + 381*8) of --configuration space. -- --8.5.2 QLA_OPTS As An Alternative ---------------------------------- -- --Modutil (namely modprobe) loads 'option' data present in the modules.conf file --by first loading the module, parsing the 'options' directive of the newly --loaded module for parameters (parameters are simple key=value directives, i.e. --ql2xfailover=1), for each key, scan the memory area where the module was loaded --for the location of the 'key' parameter, and finally, writing the key's 'value' --directly into the pre-defined memory space. This basic mechanism is similar in --nature to the mechanism employed by the QLA_OPTS application, but does not --suffer from the relatively small size constraints within the modutil package. -- --There are two important differences between the modutil and QLA_OPTS mechanism: -- -- 1) Configuration data is read from a configuration file in /etc/ with a -- name based on the ISP type: -+Configuration data and persistent data is loaded in the driver when the -+"modprobe" is use. It is normally passed to the driver via the commandline, -+but due to the constraints inherent in using the commandline we have -+provide an alternate method to loading configuration data. The configuration -+data is passed to the driver from another module /etc/qla2300_conf. The utility -+qla_opts builds this module from the configuration data. Whenever the -+configuration changes, a new module should be built. -+ -+ -+8.5.1 QLA_OPTS -+--------------- -+QLA_OPTS reads the configuration from /etc/qla2[2,3]00.conf and creates the -+module qla2[2,3]00_conf. The driver automatically tries to load the conf -+module at init time and once it is loaded then it is passes the information -+directly into the pre-defined memory space commuicated to each module by the -+kernel. Configuration data is read from a configuration file in /etc/ with a -+name based on the ISP type: - - Configuration File Module name - ------------------ ----------- - /etc/qla2200.conf qla2200_conf - /etc/qla2300.conf qla2300_conf - -- 2) Option values are written directly (branded) to the corresponding -- configuration module file. - --Approximately 300K of configuration space has been pre-allocated within the --qla2200_conf/qla2300_conf module. -+Note: Approximately 300K of configuration space has been pre-allocated within the -+qla2200_conf/qla2300_conf module for configuration/persistent data. -+ - - 8.5.3 Compatibility With SMS (SANsufer Management Suite) - -------------------------------------------------------- -@@ -967,7 +1020,8 @@ an SMS application would save a configur - written to the 'options' section of the modules.conf file in a form similar to - the following: - -- ql2xopts=scsi-qla0-adapter-port=210000e08b000000\;scsi-qla0-tgt-1-di-0-node=20000020371682e7\;scsi-qla0-tgt-1-di-0-port=21000020371682e7\;scsi-qla0-tgt-1-di-0-pid=0000e2\;scsi-qla0-tgt-1-di-0-control=00\; -+ ql2xopts=scsi-qla0-adapter-port=210000e08b000000\;scsi-qla0-tgt-1-di-0-node=20000020371682e7\; -+ scsi-qla0-tgt-1-di-0-port=21000020371682e7\;scsi-qla0-tgt-1-di-0-pid=0000e2\;scsi-qla0-tgt-1-di-0-control=00\; - - Now, the information is written to the appropriate qla2[2|3]00.conf file in - /etc and then branded to the binary file of the corresponding configuration -@@ -1166,6 +1220,7 @@ distribution package can be extracted in - qla_fo.c - qla_fo.cfg - qla_inioct.c -+ qla_inline.h - qla_ip.c - qla_mbx.c - qla_mbx.h -@@ -1205,3 +1260,4 @@ assistance if needed. - Copyright (c) 2003 QLogic Corporation. All rights reserved - worldwide. - -+ -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/release.txt linux-2.4.21-x86_64/drivers/scsi/qla2xxx/release.txt ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/release.txt 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/release.txt 2004-04-22 19:42:21.000000000 -0700 -@@ -1,36 +1,50 @@ -+ Release Notes - -- QLogic QLA2200 and QLA2300 Linux Driver -+Driver Name : QLogic QLA22xx/QLA23xx PCI Fibre Channel Linux Driver -+Version : 7.00.00b22 -+OS platform : Red Hat AS2.1 (IA32 & IA64), SuSE SLES8 (IA32 & IA64) -+HBA Support : QLA22xx, QLA23xx -+FW version : QLA22xx : 2.02.06(tp/ip), QLA23xx: 3.02.28(ipx/flx) - -- Release Notes -- ============= -+ -+Table of Contents -+I. Overview -+II. Enhancements -+III. Bug Fixes -+IV. Known Issues -+V. Additional Information - --Version 6.06.00 August 08, 2003 - --+**********************************************+ --* Features supported by this version of driver * --+**********************************************+ --o FCAL - direct attach --o Point-to-point --o Fabric support --o Initiator mode only --o Fault recovery on down loops --o Persistent binding - HBA node name valid --o Linux 2.4.x Kernel Support --o IPFC support --o Firmware versions: -- ql2100 - 1.19.24 -- ql2200 - 2.02.04 -- ql2300 - 3.02.13 (tp) -- 3.01.18 (ip) -- --+********************************+ --* Changes From Previous Releases * --+********************************+ --o Please view revision.notes file -- --+**************+ --* Known Issues * --+**************+ --o This driver must be used with API library v2.00Beta4 + in order -- to handle re-entrant API/ioctl commands correctly. -+I. Overview -+ -+This document describes the changes between versions 6.06.10 and 7.00.00b15 -+of the QLogic Fibre Channel driver for Linux. -+ -+ -+II. Enhancements -+ -+ - Eliminate checking initiators while processing fcport list. -+ - Added logic to honor "ConfigRequired=1" in mon-failover mode. -+ - Added support for ISP2322 chips. -+ - Added EVA support -+ - Added support for enhance -+ - -+III. Bug Fixes -+ -+ - PortID binding was broken. -+ - 2100/2200 panic during firmware load -+ - Fixed handling of tape commands during LIPs -+ - Fixed flushing logic for START_STOP commands -+ - Back-out PLUG-TIMER and scsi-affine 'performace patches' -+ - Fixed DMA double allocation bug on retries. -+ -+IV. Known Issues -+ -+There are no known issues at this time. -+ -+ -+V. Additional Information -+ -+- This driver must be used with API library v2.00Beta4 + -+ to handle re-entrant API/ioctl commands correctly. -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/revision.notes linux-2.4.21-x86_64/drivers/scsi/qla2xxx/revision.notes ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/revision.notes 2003-10-28 10:33:55.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/revision.notes 2004-04-22 19:42:21.000000000 -0700 -@@ -5,1136 +5,154 @@ - * - * Revision History - * -- * Rev 6.06.00 August 08, 2003 RA -- * - Formal release. -- * -- * Rev 6.06.00b15 August 07, 2003 AV/RA -- * - Backs-out some changes made in 6.06.00b12 with respect -- * to the operating semantics of qla2x00_eh_device_reset(). -- * The code fails to operate when the backdoor 'device -- * reset' occurs. -- * - Updated Readme.qla2x00 and SUPPORTED_KERNEL_VERSION.txt. -- * -- * Rev 6.06.00b14 August 01, 2003 RL -- * - Added return of dummy lun data entries for unconfigured -- * devices, so the number and order of entries returned would -- * match that are returned from port summary list and target -- * data list. -- * - Added checking of target online state and whether it is -- * specified in persistent binding before deciding whether -- * to return a target/lun data entry for it. -- * - Added return of target online and persistent binding -- * state in the Status field of the query_disc_tgt ioctl. -- * - Updated README file. -- * -- * Rev 6.06.00b13 July 18, 2003 RA/AV/RL -- * - Added support for new qla2xxx addon directory in RedHat AS. -- * - Added pause between successive flash reads. -- * - Don't modify a command's 'allowed' count (in queuecommand) -- * if the device is found to be a tape device. -- * - Fixed a compile problem when DEBUG option is enabled. -- * Also fixed a compile problem for 2100. -- * - Updated README file. -- * -- * Rev 6.06.00b12 July 11, 2003 RA/AV/DG -- * - Return a more correct status while determining a port's -- * state (qla2x00_check_port_status()). -- * - Ensure a completed command is returned to the mid-layer -- * before returning from qla2x00_eh_wait_on_command(). -- * - Use proper fcport during SRB referencing: -- * - Fix qla2x00_abort_command(). -- * - Fix qla2x00_eh_device_reset(). -- * - Modify qla2x00_device_reset() to take an explicit -- * fcport rather than indirect determination via a -- * possibly incorrect Target/Lun key. -- * - Properly schedule DPC routine if a port relogin is -- * required (qla2x00_timer()). -- * - Process the response queue regardless of state of mailbox -- * command execution (qla2x00_isr()). -- * - Process a response entry before declaring it processed. -- * - Return a proper BUSY status during an FC IOCTL passthru. -- * - Fixed direction in spinup CDB and uncomment target notify call -- * in FAILBACK. -- * - Added option to send a spinup to port as a notify type. -- * - Added the cmdline parameter- qlFailoverNotifyType. -- * - Added the check for PORT_SCAN_NEEDED in timer-To wakeup the dpc -- * thread to do probing for luns added after the OS scan. -- * - Added the code to issue big hammer after the flash memory is updated. -- * -- * Rev 6.06.00b11 June 24, 2003 RL/AV -- * - Removed chip version check for recognition of any -- * version of 2312 chip. -- * - Updated 2300 firmware to 3.02.13. -- * -- * Rev 6.06.00b10 June 17, 2003 RL/RA/DG/AV -- * - Fixed endian issue with update_nvram function. -- * - Fixed problem of not adding target ports when using -- * gnn_ft to scan due to incorrect reporting of new device -- * list count. -- * - Fixed panic in qla2x00_mem_free when kernel is unable -- * to allocate ioctl memory. The code tried to deallocate -- * memory from sp pool, but the list was never initialized -- * until later. -- * - Fixed scsi_lock deadlock when unable to allocate -- * ioctl memory -- * - Modified read_nvram code to always return buffer in -- * little endian format. -- * - Modified scsi passthru code to return data underrun -- * status only if the target device indicated it. Error -- * is returned if only the firmware sees the condition. -- * -- * Rev 6.06.00b9 June 12, 2003 RL/RA -- * - Added non-fo device support on fo driver (selective -- * failover configuration). -- * - Added code to return zero lun_data entry when mp_host -- * was not created for the specified HA. -- * - Modified persistent binding table structure definitions -- * and other related changes to work on ppc-64 bit platforms. -- * - Fixed problem of not getting out of loop when LIP happened -- * while we were discovering devices. -- * -- * Rev 6.06.00b8 June 05, 2003 RL/AV/RA -- * - Setup the flash before reading the option_rom in internal ioct. -- * - Dont turnoff the Config required flag if no configuration -- * is found. -- * - Fixed the path mp_byte getting over-written when no config -- * data specified. -- * - Initliaize all the list heads before calling mem_alloc during init. -- * - Append "post-remove" stuff during install in modules.conf for -- * automatic removal of conf modules whenever driver is loaded. -- * -- * Rev 6.06.00b7 June 04, 2003 DG -- * - Fixed panic in qla2x00_mem_free if unable to allocate -- * ioctl memory. ha->fcinitiators was not initialized. -- * -- * Rev 6.06.00b6 June 02, 2003 RL/AV/RA -- * - Modified configure_fabric code so after the GNN_FT call -- * the non-target devices are ignored. -- * - Added code to return all fcports of an ha as Unconfigured -- * if there is no mp_host struct associated with it. -- * -- * Rev 6.06.00b5 May 30, 2003 DG/RL/AV/RA -- * - Added the support for link_down_timeout NVRAM parameter. -- * - Added the support in the driver to allow the user to -- * enable a rescan of the luns attached to ports already configured. -- * The Command "scsi-qla-scan" issue to /proc/scsi/qla2300/x invokes -- * this function. -- * - Fixed a typo for Model Name in the driver -- * - Added the support to enable extended error logging for DEBUG_QLA2100 -- * if enabled . -- * - Added issuing of diag "ECHO" command only for QLA23xx. -- * - Return the Model Name for ioctl calls old way as of now. -- * - Fixed the panic in qla2x00_mem_alloc() caused as a result of fcport -- * memory pointer in "ha" being freed twice. -- * -- * Rev 6.06.00b4 May 29, 2003 DG/RL/AV/RA -- * - Update qla2300 firmware to v3.02.12. -- * - properly configures PCI I/O space (PIO and/or MMIO) on -- * both 32 and 64bit platforms. -- * - Fixed a problem where scsi_unregister() would not get -- * called if qla2x00_mem_alloc() failed. -- * - Added handling for QUEUE FULL from the target. We will -- * suspend I/O traffic for qfull_retry_delay (2 secs) up -- * to qfull_retry_count times (16); -- * - Added extended_error_logging. -- * - Fixed request reordering in qla2x00_retry_command(). -- * - Fixed incorrect conversion of endianess used in -- * IOCB command type 2/3 patch. -- * - Added issuing of diag. Echo command for F port topology. -- * - Added support for reporting Unconfigured Devices -- * in get_port_summary and get_target_data ioctl commands. -- * - Fixed NVRAM ioctl problem on 2312 chips. -- * - Added logic to get the model number of the HBA. -- * - Created "qla_devtbl.h" file which contains the Model -- * Number of 2312 devices and forthcoming one's. -- * -- * Rev 6.06.00b3 May 19, 2003 DG/RL/RA -- * - Added support for abbreviated persistent binding -- * configuration statements. -- * - Replaced use of IOCB command type 2 with type 3 to enable -- * handling for possible 64bit DMA addresses. -- * - Cast all size_t to ulong in print arguments to eliminate -- * compile warnings on PPC64 platform. -- * - Consolidated ioctl passthru commands to use a separate -- * queue_command function so it won't be confused with -- * normal IOs. -- * - Removed the static EXT_IOCTL struct used in qla2x00_fo_ioctl. -- * - Corrected request buffer address used in start_ms_cmd. -- * - Updated searching of device ports for all applicable -- * ioctl commands. -- * - Added support for MP_MASK_OVERRIDE bit in mp_byte of -- * target ports. This includes new case for get/set path -- * function to handle. -- * - Fixed problem with alloc_path saving temporary port ptr -- * to the path. -- * - More consolidation of driver version string define. -- * - Update qla2200 firmware to v2.02.04. -- * -- * Rev 6.06.00b2 May 16, 2003 DG -- * - Fixed the issue that cause the error message "Failed to -- * initialize adapter" which can occur in a Loop environment -- * when multiple nodes start powering up in 30 secs increments. -- * This issue was cause by Lip resets occurring in the middle -- * of port discovery. -- * -- * Rev 6.06.00b1 May 12, 2003 DG/RL/RA -- * - Update qla2300 firmware to v3.02.10. -- * - Updated README.qla2x00. -- * - Added MODULE_DESCRIPTION. -- * - Register with Linux for 16 byte CDBs. -- * - Wait for MAX_LOOP_TIMEOUT for loop to be ready before -- * issuing device/bus reset in the respective driver error handler -- * routines. -- * - Added logic to handle concurrent processing of big hammer -- * and scsi mid layer error recovery or resets issued through backdoor. -- * - Check for loop_state etc for individual qla2x00_set_host_data() -- * operation in ioctl path. -- * - Sync up the exioct.h file with the one checked in VSS for the led -- * change. -- * - Added the ZIO support -- * - Added the beacon change(blink green LED on/off every sec apart) -- * - Added the GNNFT and GPN_ID change and incorporated the retry logic. -- * - Fixed the potential problem of new_dev_list getting corrupted -- * for different HBA in qla2x00_configure_fabric() by allocating -- * the new_dev_list dynamically (instead of static). -- * - Wait for the max_time for firmware to be ready if the firm_state is -- * < FW_STATE_READY ie trying to login,waiting for al_pa etc -- * - Clear the device flag -DFLG_NO_CABLE during fw_ready if firm_state -- * is < FSTATE_LOSS_OF_SYNC indicating cable is there. -- * -- * -- * Rev 6.05.00 April 30, 2003 DG -- * - Fixed issue ER25748 with SG_ALL in sg_tablesize. We -- * now calculated sg_tablesize based on the number of -- * request queues. -- * - Fixed qla2x00_get_retry_cnt() logic to get the ELS -- * timeout value from mbox3 - qla_mbx.c. -- * - Change min time we wait for F/W to become ready -- * before declaring the Cable unplug from 20secs to -- * 60 secs. -- * -- * Rev 6.05.00b10 April 25, 2003 AV/RL -- * - Added support of new persistent binding configuration -- * mechanism for large configurations which would exceed -- * the max string limit of modutil. This includes the -- * qla_opts utility. -- * -- * Rev 6.05.00b9 March 31, 2003 RA/AV/DG/RL -- * - Process the port database update (async event-0x8014) -- * for login and logout only if its "Global"-any async -- * prevent recieved prior to 8014 indicating loop is down -- * like LIP_RESET,LIP_OCCURED etc. -- * - Honor previous firmware option settings before updating -- * swing and emphasis. -- * - Display *all* scanned luns via the /proc interface. -- * - If the device does not support the SCSI Report Luns -- * command, the driver will now only scan from 0 to the -- * max#-luns as defined in the NVRAM (BIOS), rather than -- * blindly scanning from 0 to 255 -- which could result in -- * an increase in initialization time when running against slow -- * (JBOD) devices. -- * - Fixed the FC-4 feature registration code. -- * - Fixed the driver version string by building a static string -- * during driver load, then change all references of driver version -- * to use that static string. -- * - Wait for half a second instead of a tick before trying again -- * to get fw_state. -- * -- * Rev 6.05.00b8 March 20, 2003 AV/DG -- * - Corrected issuing FC4 feature for hba. -- * - Added support for serial link controls: swing and emphasis. -- * -- * Rev 6.05.00b7 March 13, 2003 RA/DG/AV -- * - Corrected compile problem of can_do_varyio and can_dma_32 -- * on different kernel versions. -- * - Reduced ioctl context structure size. -- * -- * Rev 6.05.00b6 March 6, 2003 DG/AV -- * - Added support for can_do_varyio. -- * - Change sg_talesize to SG_ALL -- * - Fixed logic to properly set highmem_io or can_dma_32. -- * - increase queue_depth to 32. -- * - Increase max_sectors to 8192. -- * - Add module parameter ql2xsuspendcount. -- * - Always enable fc4 regsiter device and features. -- * -- * Rev 6.05.00b5 February 28, 2003 RL/AV -- * - Added check for a paused RISC in ISR -- dump HCCR for reason -- * - Fix improper nodename/portname construction in -- * qla2x00_nvram_config() by honoring the node_name_option -- * bit in NVRAM. -- * - Correct parity check enables for 23xx ISPs. -- * - Add helper function qla2x00_local_device_login() to mimic -- * fabric login logic. -- * - Reschedule a local-loop update if a loop-resync needed -- * in qla2x00_local_loop_update() -- this will fix a small -- * windows where a target-device state would become out-of- -- * sync. -- * - Add debug function qla2x00_get_fcal_position_map() to -- * return from the firmware the current negotiated LILP map. -- * - Fix endianess issues in direct connect environment -- * (Mark Bellon mbellon@mvista.com): -- * - Add endian-safe bitmap structures for nvram -- * and init_cb_t usage. -- * - Fix endianess problem in qla2x00_configure_local_loop(). -- * - Add special_options structure for data rate and -- * termination settings. -- * - Fixed data corruption problem when issuing ioctl commands -- * concurrently to multiple HBAs by using a per ha scrap buf. -- * - Added new ioctl command for returning driver specific data. -- * This is used to allow API implementation to be backward -- * compatible with driver. -- * - Reset adapter current_speed when loop is down. -- * -- * Rev 6.05.00b4 February 06, 2003 RL/AV -- * - Fixed the checking of DEV_PUBLIC flag before setting -- * the FC_FABRIC_DEVICE flag. The flag is now checked -- * using bitwise AND everywhere. This fixes problem -- * with devices that are both initiator and target. -- * - Added checking of tape device so we don't logout from -- * tape devices. -- * - Fixed the driver hang in get_target_data of non-fo driver -- * by correctly store fcport value to target queue in -- * fcport_bind. -- * - Fixed invalid configuration problem when displaying -- * target LUNs via non-fo driver by correctly assign -- * the only path as preferred path. -- * - Added ioctl support for non-fo driver to return path and -- * system parameters information. -- * - Corrected the return values of fo ioctl functions -- * and added checking of return value of copy_to/from_user -- * calls. -- * - Fixed debug prints, some of which access invalid pointer. -- * -- * Rev 6.05.00b3 January 27, 2003 RA/DG -- * - Added support for can_dma_32 and highmem_io. -- * -- * Rev 6.05.00b2 January 24, 2003 RL/RA/AV/DG -- * - Added the use of HbaSelect to determine the ha context -- * of each ioctl command. -- * - Corrected ioctl wait_q handling when timeout happened. -- * - Dynamically allocate EXT_IOCTL structure in order to -- * make the main ioctl function reentrant. -- * - Corrected the return values of all non-fo ioctl functions -- * and added checking of return value of copy_to/from_user -- * calls in places that matter. -- * - Made proc_info reentrant by directly writing to the -- * buffer supplied by the caller. -- * -- * Rev 6.05.00b1 December 20, 2002 RL -- * - Added send_els_passthru function and modified start_ms_cmd -- * to be used by both send_fcct and send_els_passthru. -- * - Modified ms_iocb definition to comply with latest 2300 spec. -- * -- * Rev 6.04.00b8 January 16, 2003 RA/DG/AV -- * - Use proper compiler flags when built with later GCC -- * versions (3.x). -- * - Rewrite initiator handling code: -- * - Use linked lists rather than a fixed-size array. -- * - Properly logout of intiator devices if found to be lost. -- * - Changes in qla2x00.c and qla2x00_ioctl.c. -- * - Fix lun suspension logic: -- * - Remove code in qla2x00_lun_alloc() which incorrectly -- * trashes a lun queue's q_count and q_max members. -- * - Properly move from a lun_queue NOT-ready state to a -- * ready state when a command successfully completes in -- * qla2x00_callback(). -- * - Add 'delay' logic to handle throttling scenario required -- * during a failback operation. -- * - Return a byte statistical quantity not mega-bytes in -- * qla2x00_get_(fc_)statistics() -- this change did not go -- * into 6.03.00b6 as indicated by the release notes. -- * - Handle a SCSI_DATA_NONE data direction for a SCSI command. -- * -- * Rev 6.04.00b7 Jan. 10 2003 DG/RA -- * - Added VMWARE support. -- * - fixed the bus reset and host reset when issued through -- * the backdoor by not waiting for commands which we dont own. -- * -- * Rev 6.04.00b6 Jan. 8 2003 DG/RA -- * - Fixed hardware_lock hierarchy in qla2x00_cmd_timeout -- * routine to fix deadlock with interrupt handler. -- * -- * Rev 6.04.00b5 Jan. 8 2003 DG/AV -- * - Fix incorrect sizing of mbx_cmd_flags in structure -- * scsi_qla_host since bit-operators function on unsigned -- * long variables - in qla2x00.c. -- * -- * Rev 6.04.00b4 December 19, 2002 RL/RA/DG/AV -- * - Increase IOCTL-passthru command timeout value (30->60). -- * - Update local definition of pci_set_dma_mask() to take an -- * u64 type rather than an dma_addr_t. -- * - Fix qla2100_nvram_config() to set the high-water IOCB limit -- * while configuring an QLA2100 HBA. -- * - Fixed potential panic in qla2x00_failback_luns() routine - -- * dereference a NULL fclun. -- * -- * Rev 6.04.00b3 December 06, 2002 AV -- * - Fix binding algorithm in qla2x00_cfg_build_path_tree() to -- * support sparse targetIDs. -- * - Extend maximum number of failover paths to eight. -- * -- * Rev 6.04.00b2 November 27, 2002 DG/RA/AV -- * - Pass portID information up to FO_CC_GET_TARGET_DATA ioctl -- * callers. -- * - Add support for PortID persistent binding: -- * - Module parameter name: Bind -- * o 0 by Portname (default) -- * o 1 by PortID -- * o 2 by Nodename -- * - Default behaviour is to bind by Portname. -- * - Update qla2x00_display_fc_names() to support new binding -- * methods -- varies by Bind type. -- * - Large #defing usage cleanup to more flexible module -- * parameter. -- * - Use various PCI/SCSI/endianess macros defined by the kernel -- * to reduce duplication. -- * - Streamline qla2x00_response_packet(): -- * - Reduce multiple Register I/O writes to just one after -- * ring processing. -- * - Cleanup qla2x00_status_entry(): -- * - Move common cases to the top of the switch statement -- * (CS_COMPLETE and CS_DATA_UNDERRUN). -- * - Refine data underrun handling, since it appears the -- * mid-layer underflow structure member for SCSI commands is -- * not consistently populated by the various upper-layers. -- * - Cleanup qla2x00_error_entry() to use pre-defined -- * descriptive values while interrogating a packet's -- * entry_status rather than raw BIT_* defines. -- * - Maintain 'RLC supported' state for an fcport, to limit -- * extraneous RLC commands. -- * - Initial qla2x00_isr() sanitization -- formating and -- * readability. -- * - In qla2x00_queuecommand(), return a command immediately, if -- * the port is found to be DEAD. -- * - Fix a dead-lock (logic) problem in -- * qla2x00_mailbox_command() where the code would attempt to -- * acquire a lock which had never been released. -- * - Add support for status continuation IOCB entries (extended -- * sense data). -- * - During loop transition, report back successfully completed -- * commands rather than blindly retry -- -- * qla2x00_status_entry(). -- * - Export ql2xretrycount as a module parameter. Default value -- * in non-failover mode is 20, in failover mode, 30. -- * - Update Makefile to use 'install' rather than 'cp' as to -- * preserve uid/gid (Austin Gonyou). -- * - Consolidate duplicate code to set DMA mask -- -- * qla2x00_config_dma_mask(). -- * - Fix copy-error in qla2x00_send_fo_notification() where the -- * SCSI CDB would not be populated with the proper -- * notification CDB. -- * - In qla2x00_proc_info(), do not clear our buffer in case -- * another application is using it. -- * - Export a MODULE parameter, ql2xfailover, to allow failover -- * to be configured in at load time. -- * -- * NOTE: Default behaviour is still based on the -- * compile-time option MPIO_SUPPORT. -- * -- * - Add additional checks to ensure that the DPC routine has -- * already been created before trying to 'wake' it up. -- * - Add new 2300 IP/TP firmware (3.01.18). -- * -- * Rev 6.04.00b1 November 4, 2002 DG -- * - Fixed ISP abort retry logic to retry the abort_ISP(). -- * - Fixed port login logic to retry the login on ports that are -- * marked DEAD. -- * - Fixed issue of not loging in after loop is down for more than -- * 4 mins. -- * -- * Rev 6.03.00b10 October 31, 2002 DG -- * - Fixed the logic in qla2x00_mark_device_lost to not change the -- * state of the port if it is mark DEAD, but still schedule port -- * login retries. -- * -- * Rev 6.03.00b9 October 30, 2002 DG -- * - Change LOOP DOWN timer to 4 mins and do a ISP abort if the f/w -- * never indicated that the cable is unplug and the timer expire. -- * -- * Rev 6.03.00 November 1, 2002 RA -- * - Changed the message for SYS_ERR(0x8002) to log to message file -- * instead on the console. -- * - Formal release. -- * -- * Rev 6.03.00b8 October 28, 2002 RA/DG/AV -- * - Correct qla2x00_loopback_test() to return the proper mailbox -- * register values, additionally, the statistical values returned -- * are only valid upon a good loopback execution. -- * - Perform the INT_CC_READ_OPTION_ROM ioctl, only if the response -- * length is specified correctly -- as to limit reading partial -- * data. -- * - Move backdoor RESET handling to qla2x00_done() for proper -- * processing. -- * - Given the two variants pci_set_dma_mask(), allow the -- * compiler to assist in setting the proper dma mask. -- * - Complete re-write of qla2x00_32bit_start_scsi(): -- * - Provide similiar benefits as in 6.03.00b3-pre3. -- * - Add additional kernel 2.5 support (resync with 2.5.44): -- * - Header file cleanup. -- * - SCSI host template updates. -- * - Queue depth interface updates. -- * - Fix computation of normalized segment length in -- * qla2x00_normalize_dma_addr(). -- * - Fix incorrect usage of head tag queueing while issuing an -- * RLC command during driver scan. -- * - Fix incorrect assignment of an fcport as LOST when it is -- * already in a DEAD state. -- * - Revert to OLD command data-direction determination (large, -- * and ineffiecient switch statement of recognized commands, -- * else check data-direction specified by command), since it -- * appears that a lldd cannot depend on the upper-layers to set -- * it correctly. -- * -- * NOTE: This will *NOT* be the default behavior in the formal -- * release of the 6.03.00 driver. From then on, the lldd -- * *will* depend on the upper-layers to specify the proper -- * data-direction in the SCSI command. -- * -- * Rev 6.03.00b7 October 14, 2002 AV -- * - Enable flash operations before attempting read flash memory. -- * - Correct qla2x00_update_option_rom() to properly verify flash -- * buffer length. -- * - Correct additional little-endian assumptions in FC/IP driver -- * paths. -- * -- * Rev 6.03.60 November 08, 2002 AV -- * - Special OEM release based on 6.03.00b6. -- * -- * Rev 6.03.00b6 October 11, 2002 AV/DG -- * - Fix incorrect sizing of mbx_cmd_flags in structure -- * scsi_qla_host since bit-operators function on unsigned -- * long variables. -- * - Correct little-endian assumptions (across the board): -- * - ISP detection and intialization. -- * - SCSI I/O posting, receiving, and processing. -- * - IP command processing. -- * - Add support for PowerPC64 platform. -- * - Add flash image retrieval support: -- * - Flash manipulation code. -- * - Internal IOCTL support routine for application callers. -- * - Return a byte statistical quantity not mega-bytes in -- * qla2x00_get_(fc_)statistics(). -- * - Fix failover during initialization limitation. In -- * qla2x00_map_os_luns(), try any alternate paths if the -- * preferred path is unavailable. -- * - Remove extraneous logic that attempted to failback luns that -- * were found to be disconnected. -- * -- * Rev 6.03.00b6-pre1 October 05, 2002 AV -- * - Fix qla2xxx_eh_device_reset() misuse of cmd->sp, since -- * there is no guarantee the command followed our standard -- * queuing path. -- * - Add flash update support: -- * - Retool flash read/write routines to work with -- * different flash manufacturers. -- * - Add additional kernel 2.5 support: -- * - no reparent_to_init() (Mike Anderson). -- * - Fix assignment bug in qla2x00_mbx_q_add() (Rick Cooper). -- * (ER20982) -- * -- * Rev 6.03.00b5 October 02 2002 RA -- * - Added the logic to try to login in non fabric enviornment -- * (Direct Connect) by issuing login loop port mbx cmd. For -- * targets which silently go away and firmware has no way to -- * log back. -- * -- * Rev 6.03.00b4 October 02 2002 AV -- * - Fix qla2x00_abort_command() to not issue an ISP abort if -- * the command abort fails. -- * -- * Rev 6.03.00b3 October 02 2002 AV -- * - Formal beta release. -- * - Remove debug codes from EH and callback routines. -- * - The LOGOUT_AFTER_DEVICE_RESET function is still a work -- * in progress. -- * -- * Rev 6.03.00b3-pre3 September 29 2002 AV -- * - Correct endian-ness issues while preparing an IOCB in -- * qla2x00_send_packet() -- should now work on -- * non little-endian machines. -- * - Cleanup definitions for ??_64BITS() macros. -- * - Complete re-write of qla2x00_64bit_start_scsi(): -- * - Correct endian-ness issues while preparing IOCBs. -- * - Add fix to correct data segment 32bit page boundary -- * (hardware) limitations. -- * - Correct inefficiencies in IOCB preparation. -- * - Update firmware command timeout calculation. -- * - Makefile update -- during an install, the makefile will -- * now rename any qla2200 'addon' binaries to "*_rh.o" -- * - Update qla2x00_load_ram() to always use MBC_LOAD_RAM_A64 -- * since previous code was needlessly ISP specific and -- * could potentially truncate a valid highmem address. -- * - Add additional kernel 2.5 support: -- * - MKDEV() -> mk_kdev() (Mike Anderson). -- * - MAJOR/MINOR() -> major/minor() (Mike Anderson). -- * - Remove emulated member from host template (Lincoln Dale). -- * - Fix qla2x00_status_entry() to not retry IOCTL generated -- * commands. -- * - Update qla2x00_issue_iocb() to use MBC_IOCB_EXECUTE_A64 -- * as to not truncate a valid highmem address. -- * - Fix pci_set_dma_mask() invocations as to not downcast -- * 64-bit literals to a potential 32-bit type (dma_addr_t). -- * - In qla2x00_rpt_lun_discovery() do not retry the command if -- * the target does not support the REPORT LUNS cdb. -- * - In qla2x00_lun_discovery() clear fc_lun_t structure upon -- * allocation (incorrect stale data in fields). -- * - Update display of luns in /proc to not show 'disconnected' -- * (non-existent) luns. -- * - The check for 'ready' state in -- * qla2x00_check_for_devices_online() is too strict. Loosen -- * restriction to allow a failback on all ONLINE ports. -- * - In qla2x00_failback_luns() do not try to failback to a DEAD -- * port. -- * - Add option (LOGOUT_AFTER_DEVICE_RESET) to explicitly logout -- * of a device after a device reset has been successfully -- * issued -- a login will occur shortly after. This is need -- * for some storage subsystems. -- * -- * Rev 6.03b2 Sept 24, 2002 RA -- * - Fixed the compilation warnings on RedHat Dist. -- * - Added check not to wait for the commands to be returned by -- * the firmware if device_reset etc is issued through the backdoor. -- * - Do relogin for non-public devices also when firmware reports -- * command timeout along with logo(compl status=0x6 and logout(0x2000)) -- * -- * Rev 6.01/6.02b2/6.03b1 Sept 16, 2002 AV -- * - Corrected wrong setting in qla_setting.h file to -- * fix compile error with RH-AV. -- * -- * Rev 6.01/6.02b1 Sept 11, 2002 AV -- * - Fixed issue 225984 - Fixed reset logic to flush done queue -- * before returning to OS and retry an ABORT ISP call if it fails. -- * Serialized the done processing when not using a tasklet. -- * - Fixed 2200 performance issue using fastposting. -- * - Fix target reset logic to use the correct mailbox command. -- * -- * Rev 6.01 August 29, 2002 AV -- * - Formal release. -- * - Update README to reflect support of later Redhat releases. -- * -- * Rev 6.1b5 August 20, 2002 AV/DG -- * - Fix mis-use of stale SP after re-addition to the free -- * queue -- qla2x00_callback(). -- * - Fix mis-use of invalid loop id during a LIP caused by -- * an initiator device -- qla2x00_device_resync(). -- * - Update IOCTL passthru code to fully support CBD lengths -- * of 16 bytes with later kernels. Earlier kernels supported -- * CDB sizes of 12 bytes only -- thus the workaround. -- * - Add initial kernel 2.5 support: -- * - Removal of io_request_lock in favor of host->host_lock -- * (Mike Anderson). -- * - Return -EINVAL for all non-EXIOCT ioctls (Mike Anderson). -- * - Remove extra 'continue' statement in qla2x00_proc_info() -- * which effectively disabled the display of luns. -- * - Remove dead-code from qla_ip.c. -- * -- * Rev 6.1b4 August 09, 2002 AV/DG -- * - Remove qla_dbg.h and qla_def.h files from driver -- * distribution. -- * - Remove all virt_to_* calls in both SCSI/IP driver sources. -- * - 64bit DMA addressing through dma_addr_t. -- * - Cleanup structure names/member variables from IP sources. -- * - Add QL_DEBUG_LEVEL_12 for IP debugging. -- * - Add transmission timeout callback for IP driver. -- * - Enable SRAM, Instruction RAM and GP RAM parity checks on -- * ISP2300s. -- * - Display all luns recognized by driver in /proc, not just -- * SCSI mid-layer scanned luns. Luns not scanned by the mid- -- * layer are marked with an asterisk (*). -- * - Add FC_SUPPORT_RPT_LUNS flag to the struct fc_port.flags. -- * Set, if the device supported the report luns command. -- * - Increase Inquiry request buffer to 36 rather than 4. Some -- * target devices have problems with the small transfer. -- * - Fix assignment of current_speed during an asyncronous event -- * MBA_LOOP_UP. Improper connection speed was being reported -- * to EXIOCTs and IP driver. -- * - Add ISP2100 support: -- * - QLogic provides no support for the ISP2100. -- * - compiled binary name qla2100.o. -- * - Forward-port chip support from 5.[2|3]x series driver. -- * - Update Makefile.kernel and Config.in. -- * - add new 2100 TP firmware (1.19.24). -- * - Fix copy-error in qla2x00_fo_get_params() where the -- * qla_fo_params notification CDB would be zero'd-out. -- * - Fix kernel-oops when DEBUG level 5 is enabled and a command -- * is sent to a non-existent lun. -- * - Fix in-kernel compilation problem (Veritas). -- * - Remove superfluous KMALLOC*/KMFREE/BZERO/BCOPY/ -- * BCMP/qla_bcopy defines and functions. -- * - Remove unused ql_list_link structures and functions. -- * - Consistent use of copy_to/from_user() functions (RH). -- * - Consistent use of struct scsi_qla_host instead of -- * several aliases (RH). -- * - Remove illegal usage of caddr_t (RH). -- * - Remove Target-Mode support from driver. -- * - Cleanup qla_fo.c file: -- * - Remove old debugging code. -- * - General sanitizing. -- * - Modify SCSI template name (QLogic) -- * - Cleanup compiler warnings during debug builds. -- * - Add new 2300 IP/TP firmware (3.01.13). -- * -- * Rev 6.1b3 June 12, 2002 RA -- * - Non-released driver - version number skipped due to Combo -- * package release to OEM. -- * -- * Rev 6.1b2 June 08, 2002 AV/DG -- * - Fix issue where the report-luns logic would interpret -- * data on an incorrect status from the device. -- * - Fix issue where a loopback request was not being issued -- * if the HBA loop status was not ready -- Callers of the -- * IOCTL expect the FW to handle this condition and return -- * the proper status. -- * - Clean-up IP support callback mechanism -- explicit -- * export of a single *_ip_inquiry() call that returns -- * specific interface function pointers. Each ISP driver -- * now has its own *_ip_inquiry() function -- * (qla2200_ip_inquiry() and qla2300_ip_inquiry()). -- * - Remove inter-dependencies between 2200/2300 compiled -- * drivers. -- * - Fix issue where del_timer()/add_timer() combination in -- * RESTART_TIMER macro would cause a race condition during -- * module unloading -- use mod_timer(). -- * - Cleanup spinlock initialisation -- spin_lock_init() -- * macro (FalconStor). -- * - Add CONFIG_MD_MULTIHOST support (FalconStor). -- * - Add SCSI add-single-device support (FalconStor). -- * - Added new 2300 IP/TP firmware (3.01.11). -- * - Added new 2200 IP/TP firmware (2.02.03). -- * -- * Rev 6.1b1 June 14, 2002 AV/DG -- * - Integrate IP backdoor updates. -- * - Add CACHE_LINE flush before updating request-ring -- * indexes to address spurious hardware hangs. -- * - Add hardware_lock'ed qla2x00_marker() function for -- * IP integration layer. -- * - Remove busy-wait during qla2x00_fw_ready(). -- * - Remove extraneous display of adapter node/port -- * information. -- * - Fix issue with the register_fc4 function not sending -- * the appropriate amount of data to the firmware. -- * - Ip_inquiry should query off the ha's instance number, -- * not host_no during IP capable scan of HBAs. -- * - Add 'hardware locked' logic to IP integration functions: -- * qla2x00_add_buffers(), qla2x00_ip_send_login_port_iocb(), -- * and qla2x00_ip_send_logout_port_iocb() functions. -- * - Add IP /proc file information text. -- * - Indentation and debug-level cleanup. -+ * Rev 7.00.00b22 Apr 2, 2004 RA,DG,AV -+ * - Remove TASK_INTERRUPTIBLE to TASK_UNINTERRUPTIBLE -+ * - Remove incorrect assignment of ha->retry_count to -+ * login retry count; -+ * - RHEL/SLES8 differences when compiling the driver -+ * on x86_64 and PPC64 -+ * - Fixed boundary check for queuedepth value. -+ * - ER36592:Fixed the query_hba_port() ioctl call to check -+ * for LOOP_DEAD state to report correct hba port state -+ * when link down timeout is non zero. -+ * -+ * Rev 7.00.00b21 Mar 30, 2004 RA -+ * - Updated the QLA23XX Firmware to v3.02.27 -+ * -+ * Rev 7.00.00b21test Mar 17, 2004 DG,RA,AV -+ * - Add feature to initiate a LIP via /proc interface. -+ * Similiar to rescan. -+ * - DEBUG3 fixes when qla2x00_allocate_path() fails. I -+ * hope RA is ok with this version :) -+ * - Revert to old method of returning BIOS version until -+ * some concensus has been formed on where the driver -+ * should return the information. -+ * - Fixed target information in proc info rouitne, so it displays -+ * the correct target. -+ * -+ * Rev 7.00.00b20 Mar 9, 2004 DG -+ * - PortID binding -+ * - 2100/2200 panic during firmware load -+ * - qla2x00_get_link_status() loop_id fix -+ * - INQ fix to not assume a fabric device when fw -+ * - returns CS_PORT_LOGGED_OUT -+ * - Return true nodename for XP device during -+ * get_port_summary. -+ * - Tape command handling forward-ported from 6.06.64 -+ * - Dereference a NULL pointer after allocate_path(). -+ * - Perform proper check of START_STOP command in -+ * - qla2x00_queuecommand(), dereference a command's cmnd[] -+ * array, not its sc_data_direction. -+ * - Response ring check refinement in qla2x00_queuecommand(). -+ * - As per RH comments, back-out PLUG-TIMER and scsi-affine -+ * 'performace patches' -+ * -+ * Rev 7.00.00b19 Mar 9, 2004 DG -+ * Rev 7.00.00b19-test1 Mar 9, 2004 DG -+ * - Added logic to detect "NOT READY" when a different host failover a -+ * shared port on the EVA. -+ * -+ * Rev 7.00.00b18 Mar 4, 2004 DG -+ * - Skip trying to failover a controller lun this causes the no matching -+ * lun error. -+ * - Eliminate the temporary failover queue. -+ * - Enhance the logic for finding active paths to speed up failover. -+ * -+ * Rev 7.00.00b17 Feb 24, 2004 RA -+ * - Fixed Oops with multiple FO targets when we can't find -+ * a matching lun. -+ * - Fixed issue cause by LOOP going DEAD before port. - * -- * Rev 6.0 June 13, 2002 DG -- * - Released -+ * Rev 7.00.00b16 Feb 20, 2004 RA -+ * - Updated the QLA23XX FW to v3.02.24 -+ * -+ * Rev 7.00.00b15 Feb 11, 2004 DG/RA/AV -+ * - Fix endianess issues while preparing command IOCBs. -+ * - Only perform lun discovery on target-type fcports. -+ * - Build qla_opts with proper host CC. -+ * -+ * Rev 7.00.00b14 Feb 10, 2004 DG -+ * - Added logic to detect and failover the port when a shared -+ * port on the MSA1000 is switched to the standby port by a -+ * different host. -+ * - Always export HSG80 ports in failover mode. -+ * - Added support to reset luns on EVA after failover. -+ * - qla2x00_configure_loop() fix when an RSCN occurs -+ * during the configure_loop routine. -+ * - FCP protocol error check during qla2x00_status_entry() -+ * - Added code review changes (RH) -+ * -+ * Rev 7.00.00b13 Feb 4, 2004 DG -+ * - RIO fix for big endian platforms. -+ * - Eliminate checking initiators while processing fcport list. -+ * - New 23xx ip/flx firmware version 3.02.22 -+ * - Increase driver timeout value to (2.5 * RATOV) for RATOV events. -+ * - Honoring "ConfigRequired=1" in mon-failover mode. -+ * - Added logic to block i/o during failoer mapping. -+ * -+ * Rev 7.00.00b12 January 30, 2004 DG -+ * Fixed issue in port scan logic with adding luns dynamically. -+ * -+ * Rev 7.00.00b11 January 26, 2004 DG -+ * Updated to Firmware Version 3.21.04 (16:56 Jan 23, 2004) (flx) -+ * -+ * Rev 7.00.00b10 January 20, 2004 DG -+ * - Updated f/w to v3.02.21 -+ * -+ * Rev 7.00.00b9 January 13, 2004 DG -+ * - Fixed panic in select_next_path() -+ * -+ * Rev 7.00.00b7,b8 January 5, 2004 DG -+ * - Added EVA support to failover code. -+ * - Improve smart failover to know when port -+ * has run-out-of HBAs paths. -+ * -+ * Rev 7.00.00b6 January 5, 2004 AV -+ * - Add backed-out changes from beta 3 to 5. -+ * - Remove unused 63xx functions (check_topology()). -+ * -+ * Rev 7.00.00b5 December 22, 2003 DG -+ * - merge 63xx -+ * -+ * Rev 7.00.00b3 December 10, 2003 DG/AG -+ * - Resync with 6.07.00b14. -+ * - PCI Posting fixes. -+ * - Configure DMA addressing before issuing any allocations. -+ * - Add support for RHEL3 specific Scsi_Host members. -+ * - Remove unused HOTSWAP/GAMAP/FLASH_DATABASE functions. -+ * - Fix for infinite loop in qla2x00_wait_for _hba_online() -+ * - Fix to purge all requests for a given target from retry_q -+ * on eh_resets. -+ * - Changes for common qla2x00.c for qla200 -+ * - Merge several patches from Mark Bellon -+ * [mbellon@mvista.com]: -+ * - Interrupt latency rework. -+ * - Add extended information to /proc (Ohm Terminations and -+ * Data Rate). -+ * - Convert little-endian firmware data from Get Link -+ * Statistics mailbox call to appropriate host endianess. -+ * - Add support for FDMI 'Host Name' port attribute. -+ * -+ * Rev 7.00.00b2 Nov14, 2003 RA -+ * - Fixed the issue where port id was overwritten when -+ * switched to gan -+ * - Zero out the swl buffer when doing fabric discovery -+ * - Removed the leftover fabricid array causing buffer -+ * overflow -+ * - Consolidated the code to compile acroos v7.x and v1.x -+ * driver. -+ * - Added the support for qla200 in qla_opts. -+ * - Wait for 60 sec during F/W ready during init time only. -+ * - Added the support for ISP200. -+ * -+ * Rev 7.00.00b1 Oct 28, 2003 AV/RA -+ * - Consolidated the fabric device list -+ * - Added the 16 bit loop id support -+ * - Added the support for 2300/2322 Extended F/w interface. -+ * - Added the support to compile without failover module as -+ * source pkg. -+ * - Fixed bug in configure_loop where it will loop forever. -+ * - Separated the Port state used for routing of I/O's from -+ * - port mgmt-login retry etc. -+ * - Based on 6.07.00b9plus - * -- * Rev 6.0b26-PLUS/b27 May 23, 2002 ??/??/?? -- * - Correct IOCTL return code when an invalid signature is -- * passed in the EXT_IOCTL request. -- * - Remove unused defines KERNEL_SEM_BUG and NEW_EH_CODE. -- * - Added new 2300 IP/TP firmware (3.01.09). -- * -- * Rev 6.0b26 May 23, 2002 RA/DG/AV -- * - Fixed issue with device_reset so it uses the -- * correct adapter in failover mode. -- * - Add logic to track usage of the iocb and prevent -- * the firmware from running short. -- * - Increase suspend time for LUN "Not Ready" conditions -- * from 18 secs to a max of 30 secs. -- * - Added option to display the configuraation info in -- * failover mode. -- * - Fix FC passthru IOCTL interface to only return the -- * low-order byte of the scsi status. -- * -- * Rev 6.0b25 May 20, 2002 RA/DG/AV/RL -- * - Issue RLC command immediately to determine lun list. -- * - Remove extraneous logic that removes commands from the -- * pending queue when the loop is down or a destination device -- * is found to be off-line. -- * - In failover mode, add an extra second to the command timeout -- * for additional internal processing. -- * - Add descriptions for module options. -- * - Simplify locking in qla2x00_cmd_timeout(). -- * - Fix memory-mapped I/O usage. -- * - Fix the potential panic during error recovery when a command -- * is not returned during an abort resulting in dual instances -- * of a command's SRB. -- * - Clean-up processing of interrupts during error-recovery -- * mode. -- * - Changed back get_disc_port IOCTL behaviour so now it returns -- * next available device instance info when a port/target -- * device is disconnected. The change was added and now -- * removed by customer request. This is now pre-b13 behaviour. -- * - Added new 2300 IP/TP firmware (3.01.08). -- * -- * Rev 6.0b24-test1 May 07, 2002 TWT -- * - Added IPFC support. -- * -- * Rev 6.0b24 May 06, 2002 DG -- * - Fix potential panic when configuration data exists for a device -- * that is off-line. -- * -- * Rev 6.0b23 May 06, 2002 RA/RL -- * - Added the new setup() routine for lk>=2.4 and above to handle the -- * kernel command line parameter. -- * - Set BIT_1 when issuing login_fabric() from the ioctl to take -- * care of McData issue. -- * -- * Rev 6.0b22-test2 April 30, 2002 DG -- * - Made tasklet a compile time option. -- * - Fixed mailbox timeouts on first mailbox command after polling. -- * - Fixed MPIO issue of requests setting in pending queue after -- * resync of second adapter. -- * -- * Rev 6.0b22-test1 April 29, 2002 RA/AV -- * - Updated makefile to add the support for all the arch-i386/i486/i586 -- * /i686 -especially to address the skipjack issue. -- * - Set the right host status when device returns queue full. -- * -- * Rev 6.0b22 April 26, 2002 RL/AV -- * - Corrected usage of pci info by directly getting it from ha->pdev. -- * This fixes problem with referencing the now uninitialized -- * fields of ha->pci_bus and ha->pci_device_fn from various -- * places including ioctl calls. -- * - Corrected HBA port state value returned in ioctl call. -- * - Corrected saving of failover path ID. -- * - Added passing of SRB_IOCTL flag via the CMD_RESID_LEN(cmd) field -- * from scsi passthru ioctl so the passthru IO won't get retried. -- * - Added checking of SRB_IOCTL in regular IO path so we do not -- * retry these IOs. -- * - Enabled ABORT_TARGET mailbox command to clear reservation. -- * - Replaced set_cache_line function with RedHat implementation. -- * - Cleaned up variable names in cmd_timeout. -- * -- * Rev 6.0b21-test2 April 24, 2002 DG -- * - Fixed Oops in qla2x00_next() when starting new command -- * after a resync. -- * - Fixed issues in failover code. -- * - Added back suspend lun support. -- * -- * Rev 6.0b21-test1 April 18, 2002 AV -- * - Remove per-lun pending queues in favor of a simplified -- * single adapter pending queue for all queued commands -- * issued to the adapter. -- * - Cleanup global detect semaphore name usage. -- * - Simplify the queue command process by postponing expensive -- * backend checks to the qla2x00_next() function. -- * - Remove all NOP *_LOCK/UNLOCK macros. These macros are no -- * longer needed with the 6.x series drivers. -- * - Removed all OLD error-handling code. -- * - Simplify the SCSI host template -- remove references to -- * OLD error-handling routines. -- * -- * Rev 6.0b21 April 17, 2002 RL -- * - Added more error handling code for send_fcct ioctl command, -- * and fixed a panic problem by using dummy tgt/lun q structures. -- * - Added get/set RNID related mailbox commands and ioctl support. -- * - Fixed compile warning by defining pci_set_dma_mask function -- * for kernel version < 2.4.3. -- * - Moved sp_get and sp_put back to qla2x00.c. -- * - Some indentation clean up and ioctl debug level clean up. -- * -- * Rev 6.0b20 April 15, 2002 RA -- * - Added HSG80 flag in makefile to define COMPAQ(-DCOMPAQ) compilation -- * flag. -- * - Added HSG80_PORT_RETRY_COUNT macro for COMPAQ-HSG80. -- * -- * Rev 6.0b19 April 10, 2002 RA -- * - Use pci_set_dma_mask() to set up 64bit/32bit instead of -- * CONFIG_HIGHMEM. -- * - Renamed RETRY_FOR_NOT_READY back to COMPAQ-By default disabled. -- * -- * Rev 6.0b18 April 10, 2002 AV/RA -- * - With Indent-8 tabs formatted all of the driver files. -- * - Removed the left over serial console support. -- * - Changed the debug routines to linux style. -- * - Change places where we use SYS_DELAY to udelay/barrier() -- * - Fix bugs wwrt to >> 32 of 32 bit variables. -- * - Cleaned up the support for lk < 2.4 kernel. -- * - Fixed missing wakeups of the dpc thread -- * - Added barrier() between subsequent reads in -- * qla2x00_debounce_register(); -- * -- * Rev 6.0b17 April 09, 2002 AV/RL/RA -- * - Deleted all direct references to qla2x00_callback outside -- * of sp_put and __sp_put functions, so the sp->ref_count -- * is decremented correctly before going back to free pool. -- * This fixed IO timeout/hang after some direct qla2x00_callback -- * calls are invoked. -- * - Fixed panic from ioctl passthru command which makes separate call -- * to allocate new sp by deleting the zeroing out of sp content after -- * calling get_new_sp. We should not overwrite sp content -- * because get_new_sp initializes some fields to non-zero. -- * - Moved the call to rpt_lun_discovery to later so that LUN 0 will -- * always be allocated regardless of the actual LUN list -- * returned. This allows kernel to continue scanning past -- * a non-existent LUN 0. -- * - Added output of the following to proc_info per customer -- * request: -- * 'Number of reqs in scsi_retry_q', 'Number of reqs in failover_q', -- * 'Device queue depth'. -- * - Added qlport_down_retry as a new driver parameter per customer -- * request. -- * - Changed ioctl busy polling interval to 1 second instead of -- * 1 tick. 1 tick is unrealistic. -- * - Added more ioctl function description headers. -- * -- * Rev 6.0b16 April 08, 2002 RA/AV/RL -- * - Added the support to recognise medium changer type -- * as Tape devive(inq[0] == 8). -- * - For Not Ready case suspend the lun only for Hard Disk Device -- * type. -- * - Nuked the support for FC_VI. -- * - Before examining the scsi status Mask of the reserved bits 12-15. -- * - Added the CONFIG_HIGHMEM support for 64bit dma addresing on 32bit -- * platform. -- * - Renamed file- settings.h as qla_settings.h -- * - Debug macros moved from qla2x00.c to qla_debug.h and made -- * statement like. -- * - Removed serial console code. -- * - Added the missing hardware lock in eh_abort when searching the "sp" -- * in the active array. -- * - Added loop state and number of free srb's in the /proc -- * - Changed to use kernel interface or routines(ex-readb()) -- * for Memory Mapped I/O. -- * - Cleaned up qla2x00_pci_config() routine. -- * - Renamed COMPAQ flag to G80. -- * - Set the port_down_retry_count to 30 if in the nvram its configured -- * less than 30.Need enough time to try and get the port back -- * - Get rid of the lun_list field in the inq_cmd_rsp structure. -- * - Check for abort_active/reconfiguration/recovery active state -- * before issuing get_link_status mbx cmd. -- * - Renamed qla2200_nvram_config() to qla2x00_nvram_config() -- * - Need to get rid of caddr_t as its illegal in the kernel-???? -- * - Add ref_count to the "sp" structure, needed to keep locking sane -- * over functions that sleep.Added sp_get() and sp_put() . -- * - Use Report Luns (RLC) for lun discovery process. -- * - Use a consistent set of command structures during SNS queries -- -- * add sns_cmd_rsp_t structure. -- * - Fix issue where SNS query would return too much data for -- * the firmware to handle -- explicitely define the maximum amount -- * of double-words in the SNS request. -- * - Changed VIRT_TO_BUS/KMALLOC to pci_alloc_consistent() in qla_fo.c -- * - Updated README.qla2x00 -- * -- * Rev 6.0b15 April 05, 2002 DG/RA/RL -- * - Corrected more local dpc flag checking in configure_loop. -- * This fixed problem not calling correct functions based -- * on correct flags. -- * - Deleted hardcoded port_down_retry_count. -- * - Corrected macros used to split up dma physical address -- * for use by registers. Now the macros work on both 32bit -- * and 64 bit platforms. -- * - More dma_addr_t function parameter type correction. -- * - Added update of port_id in build_fcport_list function -- * when updating a pre-existed port. This fixed problem -- * of not able to login after the port location has been -- * changed. -- * - Return a different status for 4006 error from login fabric -- * mbx cmd so we don't retry anymore. -- * -- * Rev 6.0b14 April 04, 2002 DG/RA/RL/AV -- * - Fixed query_disc_port ioctl not returning correct port -- * state. -- * - Changed port_down_retry_count to 32. -- * - Corrected local dpc flag variable checking in configure_loop -- * to use bit manipulation functions instead of C style bit -- * checking. This results in correctly log out lost -- * fabric ports. -- * - Corrected qla2x00_send_sns function parameter type for -- * physical address to use dma_addr_t. -- * - Added PCI module device table. -- * - Updated README file with Suse ramdisk info. -- * -- * Rev 6.0b13 April 03, 2002 DG/RA/RL/AV -- * - Fixed the makefile issue: corrected documentation, -- * and makefile syntax problem (making both drivers when -- * only one is asked for). -- * - Reduced stack size in functions using over 0x200 bytes -- * stack space: qla2x00_set_lun_data_from_config, -- * qla2x00_cfg_build_path_tree, qla2x00_aen_get, -- * qla2x00_query_hba_node, qla2x00_get_port_summary, -- * qla2x00_send_fcct. -- * - Changed get_disc_port ioctl behavior which returns next -- * available device instance info when a port/target is -- * disconnected. Now return error when query for lost port. -- * - Moved the allocation of host database to outside of the adapter -- * structure allocation to avoid the allocation size limitation in -- * the scsi_register function. -- * - Changed qla2100_ function names to qla2x00_ prefix. -- * - Changed previous qla2100_print calls to use printk. -- * - Cleaned up compile warnings. -- * - Added the support in README.qla2x00 to build the driver as part of the -- * kernel. -- -- * -- * Rev 6.0b12 April 01, 2002 DG/RA QLogic -- * - Fixed the port login stuff-not trying to login even the port was -- * marked as lost unless RSCN happens and we do a loop resync. -- * - Copy the done queue into local queue in qla2x00_done() such that we -- * do not wind up calling done queue takslet for the same IOs from DPC -- * or any other place. -- * -- * Rev 6.0b11 April 01, 2002 RL/RA QLogic -- * - Added initialization of the new lun q lock for ioctl_lq. -- * This fixes passthru ioctl hanging problem. -- * - Added the missing hardware lock in qla2x00_process_risc_intrs() -- * when we call qla2100_isr(). -- * -- * Rev 6.0b10 March 29, 2002 DG QLogic -- * - Added new support for suspending the lun on "not ready" -- * conditions. -- * - Deleted extra usage of io_request lock in fc_scsi and -- * scsi3 passthru ioctl functions. -- * - Updated README file. -- * -- * Rev 6.0b9 March 28, 2002 RA/DG/RL/JJ QLogic -- * - Added use of additional fields in Scsi_Cmnd to save IO -- * status related values for ioctl SCSI/FCCT passthru cmd -- * processing. -- * - Added scsi3_passthru function to process 16 byte CDBs -- * whose fclun value can be in either VSA or PDA format. -- * - Added device and bus reset new error handling functions. -- * - Added option and code to handle register_fc4. -- * -- * Rev 6.0b8 March 27,2002 RA/DG/RL QLogic -- * - Set the host_byte status correctly in process_completed_request(). -- * - Fixed the stack overflow in configure_fabric() qla2x00_ioctl() -- * and qla2x00_fo_ioctl() routine. -- * - Cover the case in eh_host_reset() where abort_isp is already active. -- * - Release the hardware lock before we return in reset_chip() routine. -- * - Added the support to grab the io_request_lock back in the queuecommand -- * after adding the request to scsi_retry_queue. -- * - Fixed the issue in the detect routine where we dont hang around for -- * the devices to come online. -- * -Implemented scsi_retry_queue stuff. -- * -Added the function headers for qla2x00_process_risc_intrs -- * and qla2x00_process_completed_requests -- * -Got rid of abort_q_put() ,abort_q_get() cmd_wait(), -- * qla2100_return_status() routines and ABORT lock. -- * -Added the support for 2.5.7>lk>=2.4.8 in Scsi Host TEMPLATE. -- -- * Rev 6.0b7 March 20, 2002 JJ QLogic -- * - Change not to use the first slot (0) of the outstanding_cmd -- * array, since we will put NULL handle for a completed cmd. -- * - Implement new hardware lock in place of io_request_lock -- * in order to improve performance. -- * - Save ha in srb_t when being inserted into the failover -- * queue so we know which ha to look for when that cmd is -- * timed out. -- * - Add aborting isp if abort command failed. -- * - Fix cmd_timeout routine to get the valid ha for the -- * fail-over driver. -- * -- * Rev 6.0b6 March 20, 2002 RL QLogic -- * - New PCI device registration and API support for 2.4.0 and -- * above only. -- * - Template change (previously done). -- * - Remove explicit virt_to_* calls in foavor of -- * *_alloc_consistent. -- * - Only allow compilation on 2.4.0 machines and above. -- * - Corrected ioctl hang due to SETINSTANCE command. -- * - Added io_request lock in FCCT passthru function when issuing -- * login_fabric mbx cmd. -- * - Corrected issue_iocb parameter as referenced in qla_fo.c. -- * -- * Rev 6.0b5 March 14, 2002 RL QLogic -- * - Added qla2200.c and qla2300.c files to enable separate -- * driver make in RedHat kernel source directory. -- * - Added/enabled two new error handling functions: eh_abort and -- * eh_host_reset. -- * - Changed issue_iocb prototype to pass in the buffer physical address -- * value. -- * - Changed request_region function (in register_with_Linux) to use -- * correct driver name string. -- * - Added release_region if request_irq function failed (in -- * register_with_Linux). -- * - Moved the enabling of host interrupt (in mbx cmd issuing) to just -- * before going to sleep waiting for completion. -- * -- * Rev 6.0b4 March 11, 2002 RA QLogic -- * - Fixed the panic in the loop reset routine where we trying to -- * derefernce tgt queue even if its NULL. -- * - Changed the MAX_SRBS count to 4096. -- * - Changed to dma_addr_t instead of depending on BITS_PER_LONG -- * macro in get_port_database. -- * - Changed README.qla2x00-Support for 2.4.x only. -- * -- * Rev 6.0b3 March 08,2002 RA QLogic -- * - Fixed the panic in abort routine- where we try to dereference -- * "sp" even its NULL causing to panic. -- * - Partially cleaned up compiler warning. -- * -- * Rev 6.0b2 March 07,2002 RA QLogic -- * - Update 2200(v2.02.01) and 2300(v3.1.02) firmware. -- * - Instead of depending on BITS_PER_LONG macro to -- * figure out whether address will be 64 bit or 32 bit -- * ,changed it to dma_addr_t data type .Even on 32bit system -- * if there is high memory support it will be 64bit instead of 32bit. -- * - Earlier we used to call qla2100_callback directly in qla2x00_ms_entry -- * routine.But now its dangerous to do so.As we zero out the -- * sp pointer in the cmd just before calling scsi_done().So we just -- * the "sp" in done_queue and let the tasklet process it later. -- * Rev 6.0b1 March 06,2002 RA,DG QLogic -- * - Started with Driver Version-5.38b16 as the base. -- * - Initial release of the 6 series driver, with all the -- * changes ported from the 4.x series driver(mentioned below). -- * - Now we keep track of the loop_id, so that we can log -- * into that port successfully when it comes back. -- * - All the options setting has been moved from qla2x00.c to settings.h -- * file. -- * -Added the support from NEW Error Handling Code perspective. -- * Right now the macro(NEW_EH_CODE) is turned off till we -- * completely fix all the issue related to NEW_EH_CODE in the driver. -- --/**************************************************************************** -- * Changes Ported from 4.x Driver: -- -- -Changed malloc.h to use slab.h to get rid of the compiler warning -- message. -- -Use del_timer_sync to delete qla2100_timer for lk > 2.4.0 -- -Send marker only at one place ie when we are about to send out -- the commands to the ISP except during initialize_adapter(). -- -Added the marker support for 64bit_start_scsi. -- -Initialized the different queues. -- PENDING QUEUE:-Initialized in lun_alloc() -- RETRY QUEUE:- "" in detect() -- DONE QUEUE :- "" in detect() -- ACTIVE QUEUE : -- FAILOVER QUEUE : "" in detect() -- FREE QUEUE:- Initialised in allocate_sp_pool() -- -Got rid of udelay in mem_alloc() routine. -- -Got rid of support for lk<2.4 in mem_alloc() and mem_free() routines. -- -Allocating sp during initialisation instead of on the fly. -- -Added the timer for each command. -- -- -Modified the different queues to use kernel list macro for -- queue management.Using one lock ie "list_lock" to protect -- different queues. -- -Added qla2x00_free_sp_pool() routine to release the sp_pool memory -- when we unload the driver. -- - Modified the qla2x00_next() prototype to pass vis_ha except in done. -- -Introduced Port state:DEAD,LOST and ONLINE . -- -Fixed the QLA2X00_FAILURE macro. -- -Fixed the abort routine-retry queue or failoever queue will be on the -- real HBA. -- -Added the ql2xlogintimeout stuff-Instead of 4sec,firmware will be using -- 20 secs initially(2*ratov value) to login into the switch for ED1032. -- -Added the retry logic to login into the switch. -- -Added the code to kick off port_down_retry timer when we get 28-29 -- compl status but the firmware is not quick enough to report -- that the device is missing. -- -Now using macros to fix the wraparound situation for jiffies. -- -Fixed the qla2x00_abort_queue().Instead of calling callback directly, -- all the requests after being deleted from the lun_queue will be put -- in the done_queue(). -- -Fixed port logic in dpc to restore loop id in the fcport structure. -- -Changed fcport->state to atomic. -- -Changed the status_entry rotuine to check for completion first and then -- scsi status. -- - Change state of "sp" to ACTIVE STATE when we issue it to RISC. -- --******************************************************************************/ -- -- -- -- -- -- -diff -uprN linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/SUPPORTED_KERNEL_VERSION.txt linux-2.4.21-x86_64/drivers/scsi/qla2xxx/SUPPORTED_KERNEL_VERSION.txt ---- linux-2.4.21-x86_64.orig/drivers/scsi/qla2xxx/SUPPORTED_KERNEL_VERSION.txt 1969-12-31 16:00:00.000000000 -0800 -+++ linux-2.4.21-x86_64/drivers/scsi/qla2xxx/SUPPORTED_KERNEL_VERSION.txt 2004-04-22 19:42:21.000000000 -0700 -@@ -0,0 +1,23 @@ -+ QLogic Fibre Channel Driver -+ for Red Hat Linux 8.0, 9.0, Advanced Server 2.1, and RHEL 3 -+ and SLES 8 -+ -+ -+The following distributions and versions of Linux kernels have been tested -+with this release driver: -+ -+IA-32: -+------ -+ - Red Hat Linux 8.0 (kernel 2.4.20-18.8) -+ - Red Hat Linux 9.0 (kernel 2.4.20-18.9) -+ - Red Hat Linux Advanced Server 2.1 (kernel 2.4.9.e-8) -+ - Red Hat Enterprise Linux 3 -+ - SuSE Linux Enterprise Server 8 (kernel 2.4.19-64GB) -+ -+IA-64 (For Itanium 2 processor) -+----- -+ - Red Hat Linux Advanced Server 2.1 (kernel 2.4.9.e-8) -+ - SuSE Linux Enterprise Server 8 (kernel 2.4.19-64GB) -+ -+ -+Earlier or later versions of Linux kernels may be supported. diff --git a/lustre/kernel_patches/patches/removepage-2.4.19-suse.patch b/lustre/kernel_patches/patches/removepage-2.4.19-suse.patch deleted file mode 100644 index 4602f96684..0000000000 --- a/lustre/kernel_patches/patches/removepage-2.4.19-suse.patch +++ /dev/null @@ -1,30 +0,0 @@ - include/linux/fs.h | 1 + - mm/filemap.c | 3 +++ - 2 files changed, 4 insertions(+) - -Index: linux-2.4.19.SuSE/include/linux/fs.h -=================================================================== ---- linux-2.4.19.SuSE.orig/include/linux/fs.h Sun Nov 16 00:40:59 2003 -+++ linux-2.4.19.SuSE/include/linux/fs.h Sun Nov 16 01:38:06 2003 -@@ -428,6 +428,7 @@ - int (*releasepage) (struct page *, int); - #define KERNEL_HAS_O_DIRECT /* this is for modules out of the kernel */ - int (*direct_IO)(int, struct file *, struct kiobuf *, unsigned long, int); -+ void (*removepage)(struct page *); /* called when page gets removed from the inode */ - }; - - struct address_space { -Index: linux-2.4.19.SuSE/mm/filemap.c -=================================================================== ---- linux-2.4.19.SuSE.orig/mm/filemap.c Sat Nov 15 18:02:15 2003 -+++ linux-2.4.19.SuSE/mm/filemap.c Sun Nov 16 01:37:11 2003 -@@ -97,6 +97,9 @@ - { - struct address_space * mapping = page->mapping; - -+ if (mapping->a_ops->removepage) -+ mapping->a_ops->removepage(page); -+ - mapping->nrpages--; - list_del(&page->list); - page->mapping = NULL; diff --git a/lustre/kernel_patches/patches/removepage-2.4.20.patch b/lustre/kernel_patches/patches/removepage-2.4.20.patch deleted file mode 100644 index cc721e116c..0000000000 --- a/lustre/kernel_patches/patches/removepage-2.4.20.patch +++ /dev/null @@ -1,28 +0,0 @@ - include/linux/fs.h | 1 + - mm/filemap.c | 3 +++ - 2 files changed, 4 insertions(+) - ---- linux-2.4.20-b_llpmd-l24/include/linux/fs.h~removepage-2.4.20 2003-09-05 11:45:42.000000000 -0700 -+++ linux-2.4.20-b_llpmd-l24-zab/include/linux/fs.h 2003-09-05 11:46:25.000000000 -0700 -@@ -402,6 +402,7 @@ struct address_space_operations { - int (*releasepage) (struct page *, int); - #define KERNEL_HAS_O_DIRECT /* this is for modules out of the kernel */ - int (*direct_IO)(int, struct inode *, struct kiobuf *, unsigned long, int); -+ void (*removepage)(struct page *); /* called when page gets removed from the inode */ - }; - - struct address_space { ---- linux-2.4.20-b_llpmd-l24/mm/filemap.c~removepage-2.4.20 2003-09-05 11:45:42.000000000 -0700 -+++ linux-2.4.20-b_llpmd-l24-zab/mm/filemap.c 2003-09-05 11:46:25.000000000 -0700 -@@ -95,6 +95,9 @@ static inline void remove_page_from_inod - { - struct address_space * mapping = page->mapping; - -+ if (mapping->a_ops->removepage) -+ mapping->a_ops->removepage(page); -+ - mapping->nrpages--; - list_del(&page->list); - page->mapping = NULL; - -_ diff --git a/lustre/kernel_patches/patches/removepage-2.6-suse.patch b/lustre/kernel_patches/patches/removepage-2.6-suse.patch deleted file mode 100644 index 147816f776..0000000000 --- a/lustre/kernel_patches/patches/removepage-2.6-suse.patch +++ /dev/null @@ -1,30 +0,0 @@ - include/linux/fs.h | 1 + - mm/filemap.c | 3 +++ - 2 files changed, 4 insertions(+) - -Index: linux-2.6.4-30.1/include/linux/fs.h -=================================================================== ---- linux-2.6.4-30.1.orig/include/linux/fs.h 2004-04-02 03:20:19.000000000 -0500 -+++ linux-2.6.4-30.1/include/linux/fs.h 2004-04-02 03:20:19.000000000 -0500 -@@ -320,6 +320,7 @@ - int (*releasepage) (struct page *, int); - int (*direct_IO)(int, struct kiocb *, const struct iovec *iov, - loff_t offset, unsigned long nr_segs); -+ void (*removepage)(struct page *); /* called when page gets removed from the inode */ - }; - - struct backing_dev_info; -Index: linux-2.6.4-30.1/mm/filemap.c -=================================================================== ---- linux-2.6.4-30.1.orig/mm/filemap.c 2004-04-02 03:19:42.000000000 -0500 -+++ linux-2.6.4-30.1/mm/filemap.c 2004-04-02 03:23:10.000000000 -0500 -@@ -102,6 +102,9 @@ - { - struct address_space *mapping = page_mapping(page); - -+ if (mapping->a_ops->removepage) -+ mapping->a_ops->removepage(page); -+ - if (likely(!PageSwapCache(page))) { - BUG_ON(PageAnon(page)); - radix_tree_delete(&mapping->page_tree, page->index); diff --git a/lustre/kernel_patches/patches/resched-2.4.19-pre1.patch b/lustre/kernel_patches/patches/resched-2.4.19-pre1.patch deleted file mode 100644 index 567e1e8c85..0000000000 --- a/lustre/kernel_patches/patches/resched-2.4.19-pre1.patch +++ /dev/null @@ -1,16 +0,0 @@ -Index: linux-2.4.19-pre1/include/linux/sched.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/sched.h 2003-11-21 04:05:05.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/sched.h 2003-11-21 04:10:29.000000000 +0300 -@@ -927,6 +927,11 @@ - return res; - } - -+static inline int need_resched(void) -+{ -+ return (unlikely(current->need_resched)); -+} -+ - #endif /* __KERNEL__ */ - - #endif diff --git a/lustre/kernel_patches/patches/seq-private-2.4.19-pre1.patch b/lustre/kernel_patches/patches/seq-private-2.4.19-pre1.patch deleted file mode 100644 index 241bf3639f..0000000000 --- a/lustre/kernel_patches/patches/seq-private-2.4.19-pre1.patch +++ /dev/null @@ -1,12 +0,0 @@ -Index: linux-2.4.19-pre1/include/linux/seq_file.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/seq_file.h 2001-11-11 22:23:14.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/seq_file.h 2003-11-21 03:09:39.000000000 +0300 -@@ -12,6 +12,7 @@ - loff_t index; - struct semaphore sem; - struct seq_operations *op; -+ void *private; - }; - - struct seq_operations { diff --git a/lustre/kernel_patches/patches/slab-use-after-free-debug-2.4.22.patch b/lustre/kernel_patches/patches/slab-use-after-free-debug-2.4.22.patch deleted file mode 100644 index ab5afe808b..0000000000 --- a/lustre/kernel_patches/patches/slab-use-after-free-debug-2.4.22.patch +++ /dev/null @@ -1,717 +0,0 @@ -%patch -Index: linux-2.4.22-vanilla/mm/slab.c -=================================================================== ---- linux-2.4.22-vanilla.orig/mm/slab.c 2003-11-17 15:42:13.000000000 +0300 -+++ linux-2.4.22-vanilla/mm/slab.c 2003-11-18 01:15:35.000000000 +0300 -@@ -97,6 +97,8 @@ - #define FORCED_DEBUG 0 - #endif - -+#include <linux/vmalloc.h> -+ - /* - * Parameters for kmem_cache_reap - */ -@@ -825,6 +827,12 @@ - return cachep; - } - -+#ifdef CONFIG_DEBUG_UAF -+void * uaf_alloc(kmem_cache_t *, int gfp_mask); -+int uaf_cache_free(kmem_cache_t *, void *addr); -+int uaf_free(void *addr); -+struct page *uaf_vaddr_to_page(void *obj); -+#endif - - #if DEBUG - /* -@@ -1340,6 +1348,20 @@ - unsigned long save_flags; - void* objp; - -+#ifdef CONFIG_DEBUG_UAF -+ /* try to use uaf-allocator first */ -+ objp = uaf_alloc(cachep, flags); -+ if (objp) { -+ if (cachep->ctor) { -+ unsigned long ctor_flags; -+ ctor_flags = SLAB_CTOR_CONSTRUCTOR; -+ if (!(flags & __GFP_WAIT)) -+ ctor_flags |= SLAB_CTOR_ATOMIC; -+ cachep->ctor(objp, cachep, ctor_flags); -+ } -+ return objp; -+ } -+#endif - kmem_cache_alloc_head(cachep, flags); - try_again: - local_irq_save(save_flags); -@@ -1576,6 +1598,10 @@ - void kmem_cache_free (kmem_cache_t *cachep, void *objp) - { - unsigned long flags; -+#ifdef CONFIG_DEBUG_UAF -+ if (uaf_cache_free(cachep, objp)) -+ return; -+#endif - #if DEBUG - CHECK_PAGE(virt_to_page(objp)); - if (cachep != GET_PAGE_CACHE(virt_to_page(objp))) -@@ -1601,6 +1627,10 @@ - - if (!objp) - return; -+#ifdef CONFIG_DEBUG_UAF -+ if (uaf_free((void *) objp)) -+ return; -+#endif - local_irq_save(flags); - CHECK_PAGE(virt_to_page(objp)); - c = GET_PAGE_CACHE(virt_to_page(objp)); -@@ -2075,3 +2105,460 @@ - #endif - } - #endif -+ -+ -+ -+#ifdef CONFIG_DEBUG_UAF -+ -+#define MAX_UAF_OBJ_SIZE 8 /* in pages */ -+#define UAF_ASSERT(xxx) if (!(xxx)) BUG(); -+#define UAF_DEBUG__ -+#ifdef UAF_DEBUG -+#define uaf_printk(fmt,a...) printk(fmt, ##a) -+#else -+#define uaf_printk(a,...) -+#endif -+ -+struct uaf_stats { -+ atomic_t uaf_allocated; -+ atomic_t uaf_allocations; -+ atomic_t uaf_failed; -+}; -+ -+static int uaf_max = 32768; -+static void *uaf_bitmap = NULL; -+static spinlock_t uaf_lock; -+static int uaf_last_found = 0; -+static int uaf_used = 0; -+static struct vm_struct *uaf_area = NULL; -+static struct uaf_stats uaf_stats[MAX_UAF_OBJ_SIZE + 1]; -+ -+static int __init uaf_setup(char *str) -+{ -+ uaf_max = simple_strtoul(str, NULL, 0); -+ return 1; -+} -+ -+__setup("uaf=", uaf_setup); -+ -+ -+void uaf_init(void) -+{ -+ int size; -+ -+ printk("UAF: total vmalloc-space - %lu\n", -+ VMALLOC_END - VMALLOC_START); -+ -+ uaf_area = get_vm_area(PAGE_SIZE * uaf_max, VM_ALLOC); -+ if (!uaf_area) { -+ printk(KERN_ALERT "UAF: can't reserve %lu bytes in KVA\n", -+ PAGE_SIZE * uaf_max); -+ return; -+ } -+ -+ printk("UAF: reserved %lu bytes in KVA at 0x%p\n", -+ PAGE_SIZE * uaf_max, uaf_area->addr); -+ -+ /* how many bytes we need to track space usage? */ -+ size = uaf_max / 8 + 8; -+ -+ uaf_bitmap = vmalloc(size); -+ if (!uaf_bitmap) { -+ printk(KERN_ALERT -+ "UAF: can't allocate %d bytes for bitmap\n", size); -+ return; -+ } -+ memset(uaf_bitmap, 0, size); -+ spin_lock_init(&uaf_lock); -+ memset(uaf_stats, 0, sizeof(uaf_stats)); -+ -+ printk("UAF: allocated %d for bitmap\n", size); -+} -+ -+static int uaf_find(int len) -+{ -+ int new_last_found = -1; -+ int loop = 0; -+ int i, j; -+ -+ j = uaf_last_found; -+ -+ do { -+ i = find_next_zero_bit(uaf_bitmap, uaf_max, j); -+ if (i >= uaf_max) { -+ /* repeat from 0 */ -+ if (++loop > 1) { -+ /* this is 2nd loop and it's useless */ -+ return -1; -+ } -+ -+ i = find_next_zero_bit(uaf_bitmap, uaf_max, 0); -+ if (i >= uaf_max) -+ return -1; -+ -+ /* save found num for subsequent searches */ -+ if (new_last_found == -1) -+ new_last_found = uaf_last_found = i; -+ UAF_ASSERT(new_last_found < uaf_max); -+ } -+ -+ /* -+ * OK. found first zero bit. -+ * now, try to find requested cont. zero-space -+ */ -+ -+ /* FIXME: implmement multipage allocation! */ -+ break; -+ -+ /* -+ j = find_next_bit(uaf_bitmap, uaf_max, i); -+ if (++loop2 > 10000) { -+ printk("ALERT: loop2=%d\n", loop2); -+ return -1; -+ } -+ */ -+ } while (j - i < len); -+ -+ /* found! */ -+ if (new_last_found == -1) -+ uaf_last_found = i + 1; -+ if (uaf_last_found >= uaf_max) -+ uaf_last_found = 0; -+ return i; -+} -+ -+extern int __vmalloc_area_pages (unsigned long address, unsigned long size, -+ int gfp_mask, pgprot_t prot, -+ struct page ***pages); -+void * uaf_alloc(kmem_cache_t *cachep, int gfp_mask) -+{ -+ struct page *ptrs[MAX_UAF_OBJ_SIZE]; -+ int size = cachep->objsize; -+ struct page **pages; -+ unsigned long flags; -+ unsigned long addr; -+ int i, j, err = -2000; -+ -+ if (uaf_bitmap == NULL) -+ return NULL; -+ -+ if (!(cachep->flags & SLAB_USE_UAF)) -+ return NULL; -+ -+ pages = (struct page **) ptrs; -+ size = (size + (PAGE_SIZE - 1)) / PAGE_SIZE; -+ /* FIXME: implement multipage allocation! */ -+ if (size > 1) -+ return NULL; -+ if (size > MAX_UAF_OBJ_SIZE) { -+ printk(KERN_ALERT "size is too big: %d\n", size); -+ return NULL; -+ } -+ -+ if (uaf_used == uaf_max) { -+ uaf_printk("UAF: space exhausted!\n"); -+ atomic_inc(&uaf_stats[size].uaf_failed); -+ return NULL; -+ } -+ -+ -+ spin_lock_irqsave(&uaf_lock, flags); -+ i = uaf_find(size); -+ if (i < 0) { -+ spin_unlock_irqrestore(&uaf_lock, flags); -+ atomic_inc(&uaf_stats[size].uaf_failed); -+ return NULL; -+ } -+ for (j = 0; j < size; j++) { -+ UAF_ASSERT(!test_bit(i + j, uaf_bitmap)); -+ set_bit(i + j, uaf_bitmap); -+ uaf_used++; -+ } -+ spin_unlock_irqrestore(&uaf_lock, flags); -+ -+ addr = ((unsigned long) uaf_area->addr) + (PAGE_SIZE * i); -+ uaf_printk("UAF: found %d/%d, base 0x%p, map at 0x%lx: ", i, -+ size, uaf_area->addr, addr); -+ -+ /* OK. we've found free space, let's allocate pages */ -+ memset(pages, 0, sizeof(struct page *) * MAX_UAF_OBJ_SIZE); -+ for (j = 0; j < size; j++) { -+ pages[j] = alloc_page(gfp_mask); -+ if (pages[j] == NULL) -+ goto nomem; -+ uaf_printk("0x%p ", pages[j]); -+ } -+ -+ /* time to map just allocated pages */ -+ err = __vmalloc_area_pages(addr, PAGE_SIZE * size, gfp_mask, -+ PAGE_KERNEL, &pages); -+ pages = (struct page **) ptrs; -+ if (err == 0) { -+ /* put slab cache pointer in first page */ -+ ptrs[0]->list.next = (void *) cachep; -+ uaf_printk(" -> 0x%lx\n", addr); -+ atomic_inc(&uaf_stats[size].uaf_allocated); -+ atomic_inc(&uaf_stats[size].uaf_allocations); -+ if (!in_interrupt() && !in_softirq()) -+ flush_tlb_all(); -+ else -+ local_flush_tlb(); -+ //printk("UAF: found %d/%d, base 0x%p, map at 0x%lx\n", -+ // i, cachep->objsize, uaf_area->addr, addr); -+ return (void *) addr; -+ } -+ -+nomem: -+ printk(KERN_ALERT "can't map pages: %d\n", err); -+ for (j = 0; j < size; j++) -+ if (pages[j]) -+ __free_page(pages[j]); -+ -+ /* can't find free pages */ -+ spin_lock_irqsave(&uaf_lock, flags); -+ for (j = 0; j < size; j++) { -+ clear_bit(i + j, uaf_bitmap); -+ uaf_used--; -+ } -+ spin_unlock_irqrestore(&uaf_lock, flags); -+ atomic_inc(&uaf_stats[size].uaf_failed); -+ -+ return NULL; -+} -+ -+extern void free_area_pmd(pgd_t *dir, unsigned long address, -+ unsigned long size); -+static void uaf_unmap(unsigned long address, unsigned long size) -+{ -+ unsigned long end = (address + size); -+ pgd_t *dir; -+ -+ dir = pgd_offset_k(address); -+ flush_cache_all(); -+ do { -+ free_area_pmd(dir, address, end - address); -+ address = (address + PGDIR_SIZE) & PGDIR_MASK; -+ dir++; -+ } while (address && (address < end)); -+ -+ /* -+ * we must not call smp_call_function() with interrtups disabled -+ * otherwise we can get into deadlock -+ */ -+ if (!in_interrupt() && !in_softirq()) -+ flush_tlb_all(); -+ else -+ local_flush_tlb(); -+} -+ -+/* -+ * returns 1 if free was successfull -+ */ -+int uaf_cache_free(kmem_cache_t *cachep, void *addr) -+{ -+ struct page *pages[MAX_UAF_OBJ_SIZE]; -+ int size = cachep->objsize; -+ unsigned long flags; -+ int i, j; -+ -+ uaf_printk("UAF: to free 0x%p/%d\n", addr, size); -+ -+ size = (size + (PAGE_SIZE - 1)) / PAGE_SIZE; -+ if (size > MAX_UAF_OBJ_SIZE) -+ return 0; -+ -+ if (uaf_bitmap == NULL) -+ return 0; -+ -+ /* first, check is address is in UAF space */ -+ if ((unsigned) addr < (unsigned) uaf_area->addr || -+ (unsigned) addr >= (unsigned) uaf_area->addr + uaf_area->size) -+ return 0; -+ -+ UAF_ASSERT(((unsigned long) addr & ~PAGE_MASK) == 0UL); -+ -+ /* calculate placement in bitmap */ -+ i = (unsigned) addr - (unsigned) uaf_area->addr; -+ UAF_ASSERT(i >= 0); -+ i = i / PAGE_SIZE; -+ -+ /* collect all the pages */ -+ uaf_printk("free/unmap %d pages: ", size); -+ /* NOTE: we need not page_table_lock here. bits in bitmap -+ * protect those pte's from to be reused */ -+ for (j = 0; j < size; j++) { -+ unsigned long address; -+ address = ((unsigned long) addr) + (PAGE_SIZE * j); -+ pages[j] = vmalloc_to_page((void *) address); -+ uaf_printk("0x%lx->0x%p ", address, pages[j]); -+ } -+ uaf_printk("\n"); -+ -+ uaf_unmap((unsigned long) addr, PAGE_SIZE * size); -+ /* free all the pages */ -+ for (j = 0; j < size; j++) -+ __free_page(pages[j]); -+ -+ spin_lock_irqsave(&uaf_lock, flags); -+ for (j = 0; j < size; j++) { -+ /* now check is correspondend bit set */ -+ UAF_ASSERT(i+j >= 0 && i+j < uaf_max); -+ UAF_ASSERT(test_bit(i+j, uaf_bitmap)); -+ -+ /* now free space in UAF */ -+ clear_bit(i+j, uaf_bitmap); -+ uaf_used--; -+ } -+ spin_unlock_irqrestore(&uaf_lock, flags); -+ -+ atomic_dec(&uaf_stats[size].uaf_allocated); -+ -+ uaf_printk("UAF: freed %d/%d at 0x%p\n", i, size, addr); -+ //printk("UAF: freed %d/%d at 0x%p\n", i, size, addr); -+ -+ return 1; -+} -+ -+struct page *uaf_vaddr_to_page(void *obj) -+{ -+ if (uaf_bitmap == NULL) -+ return NULL; -+ -+ /* first, check is address is in UAF space */ -+ if ((unsigned) obj < (unsigned) uaf_area->addr || -+ (unsigned) obj >= (unsigned) uaf_area->addr + uaf_area->size) -+ return NULL; -+ -+ return vmalloc_to_page(obj); -+} -+ -+int uaf_free(void *obj) -+{ -+ struct page *page = uaf_vaddr_to_page((void *) obj); -+ kmem_cache_t *c; -+ -+ if (!page) -+ return 0; -+ -+ c = GET_PAGE_CACHE(page); -+ return uaf_cache_free(c, (void *) obj); -+} -+ -+int uaf_is_allocated(void *obj) -+{ -+ unsigned long addr = (unsigned long) obj; -+ int i; -+ -+ if (uaf_bitmap == NULL) -+ return 0; -+ -+ addr &= PAGE_MASK; -+ /* first, check is address is in UAF space */ -+ if (addr < (unsigned long) uaf_area->addr || -+ addr >= (unsigned long) uaf_area->addr + uaf_area->size) -+ return 0; -+ -+ /* calculate placement in bitmap */ -+ i = (unsigned) addr - (unsigned) uaf_area->addr; -+ i = i / PAGE_SIZE; -+ return test_bit(i, uaf_bitmap); -+} -+ -+static void *uaf_s_start(struct seq_file *m, loff_t *pos) -+{ -+ loff_t n = *pos; -+ -+ if (!n) -+ seq_printf(m, "size(pgs) allocated failed allocations. " -+ "%d reserved, %d in use, %d last\n", -+ uaf_max, uaf_used, uaf_last_found); -+ else if (n > MAX_UAF_OBJ_SIZE) -+ return NULL; -+ -+ *pos = 1; -+ return (void *) 1; -+} -+ -+static void *uaf_s_next(struct seq_file *m, void *p, loff_t *pos) -+{ -+ unsigned long n = *pos; -+ ++*pos; -+ if (n + 1 > MAX_UAF_OBJ_SIZE) -+ return NULL; -+ return (void *) (n + 1); -+} -+ -+static void uaf_s_stop(struct seq_file *m, void *p) -+{ -+} -+ -+static int uaf_s_show(struct seq_file *m, void *p) -+{ -+ int n = (int) p; -+ -+ if (n > MAX_UAF_OBJ_SIZE) -+ return 0; -+ seq_printf(m, "%d %d %d %d\n", n, -+ atomic_read(&uaf_stats[n].uaf_allocated), -+ atomic_read(&uaf_stats[n].uaf_failed), -+ atomic_read(&uaf_stats[n].uaf_allocations)); -+ return 0; -+} -+ -+struct seq_operations uafinfo_op = { -+ .start = uaf_s_start, -+ .next = uaf_s_next, -+ .stop = uaf_s_stop, -+ .show = uaf_s_show, -+}; -+ -+ssize_t uafinfo_write(struct file *file, const char *buffer, -+ size_t count, loff_t *ppos) -+{ -+ char kbuf[MAX_SLABINFO_WRITE+1], *tmp; -+ char *key, *name; -+ int res; -+ struct list_head *p; -+ -+ if (count > MAX_SLABINFO_WRITE) -+ return -EINVAL; -+ if (copy_from_user(&kbuf, buffer, count)) -+ return -EFAULT; -+ kbuf[MAX_SLABINFO_WRITE] = '\0'; -+ -+ tmp = kbuf; -+ key = strsep(&tmp, " \t\n"); -+ if (!key) -+ return -EINVAL; -+ if (!strcmp(key, "on")) -+ res = 1; -+ else if (!strcmp(key, "off")) -+ res = 0; -+ else -+ return -EINVAL; -+ -+ name = strsep(&tmp, " \t\n"); -+ if (!name) -+ return -EINVAL; -+ -+ /* Find the cache in the chain of caches. */ -+ down(&cache_chain_sem); -+ list_for_each(p,&cache_chain) { -+ kmem_cache_t *cachep = list_entry(p, kmem_cache_t, next); -+ -+ if (!strcmp(cachep->name, name)) { -+ if (res) { -+ printk("UAF: use on %s\n", cachep->name); -+ cachep->flags |= SLAB_USE_UAF; -+ } else { -+ printk("UAF: dont use on %s\n", cachep->name); -+ cachep->flags &= ~SLAB_USE_UAF; -+ } -+ break; -+ } -+ } -+ up(&cache_chain_sem); -+ return count; -+} -+#endif -+ -Index: linux-2.4.22-vanilla/init/main.c -=================================================================== ---- linux-2.4.22-vanilla.orig/init/main.c 2003-11-03 23:22:13.000000000 +0300 -+++ linux-2.4.22-vanilla/init/main.c 2003-11-18 01:06:45.000000000 +0300 -@@ -436,6 +436,9 @@ - * make syscalls (and thus be locked). - */ - smp_init(); -+#ifdef CONFIG_DEBUG_UAF -+ uaf_init(); -+#endif - rest_init(); - } - -Index: linux-2.4.22-vanilla/fs/proc/proc_misc.c -=================================================================== ---- linux-2.4.22-vanilla.orig/fs/proc/proc_misc.c 2003-11-03 23:22:11.000000000 +0300 -+++ linux-2.4.22-vanilla/fs/proc/proc_misc.c 2003-11-18 01:06:45.000000000 +0300 -@@ -301,6 +301,22 @@ - release: seq_release, - }; - -+#ifdef CONFIG_DEBUG_UAF -+extern struct seq_operations uafinfo_op; -+extern ssize_t uafinfo_write(struct file *, const char *, size_t, loff_t *); -+static int uafinfo_open(struct inode *inode, struct file *file) -+{ -+ return seq_open(file, &uafinfo_op); -+} -+static struct file_operations proc_uafinfo_operations = { -+ .open = uafinfo_open, -+ .read = seq_read, -+ .write = uafinfo_write, -+ .llseek = seq_lseek, -+ .release = seq_release, -+}; -+#endif -+ - static int kstat_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) - { -@@ -616,6 +632,9 @@ - create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations); - create_seq_entry("partitions", 0, &proc_partitions_operations); - create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations); -+#ifdef CONFIG_DEBUG_UAF -+ create_seq_entry("uafinfo",S_IWUSR|S_IRUGO,&proc_uafinfo_operations); -+#endif - #ifdef CONFIG_MODULES - create_seq_entry("ksyms", 0, &proc_ksyms_operations); - #endif -Index: linux-2.4.22-vanilla/include/linux/slab.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/linux/slab.h 2003-11-17 15:42:13.000000000 +0300 -+++ linux-2.4.22-vanilla/include/linux/slab.h 2003-11-18 02:14:40.000000000 +0300 -@@ -40,6 +40,7 @@ - #define SLAB_HWCACHE_ALIGN 0x00002000UL /* align objs on a h/w cache lines */ - #define SLAB_CACHE_DMA 0x00004000UL /* use GFP_DMA memory */ - #define SLAB_MUST_HWCACHE_ALIGN 0x00008000UL /* force alignment */ -+#define SLAB_USE_UAF 0x00040000UL /* use UAF allocator */ - - /* flags passed to a constructor func */ - #define SLAB_CTOR_CONSTRUCTOR 0x001UL /* if not set, then deconstructor */ -Index: linux-2.4.22-vanilla/arch/i386/config.in -=================================================================== ---- linux-2.4.22-vanilla.orig/arch/i386/config.in 2003-11-03 23:22:06.000000000 +0300 -+++ linux-2.4.22-vanilla/arch/i386/config.in 2003-11-18 01:06:45.000000000 +0300 -@@ -470,6 +470,9 @@ - bool ' Check for stack overflows' CONFIG_DEBUG_STACKOVERFLOW - bool ' Debug high memory support' CONFIG_DEBUG_HIGHMEM - bool ' Debug memory allocations' CONFIG_DEBUG_SLAB -+ if [ "$CONFIG_DEBUG_SLAB" != "n" ]; then -+ bool ' Debug memory allocations (use-after-free via vmalloced space)' CONFIG_DEBUG_UAF -+ fi - bool ' Memory mapped I/O debugging' CONFIG_DEBUG_IOVIRT - bool ' Magic SysRq key' CONFIG_MAGIC_SYSRQ - bool ' Spinlock debugging' CONFIG_DEBUG_SPINLOCK -Index: linux-2.4.22-vanilla/mm/vmalloc.c -=================================================================== ---- linux-2.4.22-vanilla.orig/mm/vmalloc.c 2003-11-03 23:22:13.000000000 +0300 -+++ linux-2.4.22-vanilla/mm/vmalloc.c 2003-11-18 01:06:45.000000000 +0300 -@@ -53,7 +53,7 @@ - } while (address < end); - } - --static inline void free_area_pmd(pgd_t * dir, unsigned long address, unsigned long size) -+void free_area_pmd(pgd_t * dir, unsigned long address, unsigned long size) - { - pmd_t * pmd; - unsigned long end; -@@ -152,7 +152,7 @@ - return 0; - } - --static inline int __vmalloc_area_pages (unsigned long address, -+int __vmalloc_area_pages (unsigned long address, - unsigned long size, - int gfp_mask, - pgprot_t prot, -Index: linux-2.4.22-vanilla/include/asm-i386/io.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/asm-i386/io.h 2003-11-17 14:58:37.000000000 +0300 -+++ linux-2.4.22-vanilla/include/asm-i386/io.h 2003-11-18 02:26:42.000000000 +0300 -@@ -75,6 +75,16 @@ - - static inline unsigned long virt_to_phys(volatile void * address) - { -+#ifdef CONFIG_DEBUG_UAF -+ unsigned long addr = (unsigned long) address; -+ if (vmlist && addr >= VMALLOC_START && addr < VMALLOC_END) { -+ struct page *page = vmalloc_to_page((void *) address); -+ if (page) { -+ unsigned long offset = addr & ~PAGE_MASK; -+ address = page_address(page) + offset; -+ } -+ } -+#endif - return __pa(address); - } - -Index: linux-2.4.22-vanilla/include/asm-i386/page.h -=================================================================== ---- linux-2.4.22-vanilla.orig/include/asm-i386/page.h 2003-11-03 23:51:46.000000000 +0300 -+++ linux-2.4.22-vanilla/include/asm-i386/page.h 2003-11-18 02:14:38.000000000 +0300 -@@ -129,9 +129,49 @@ - #define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE) - #define __MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE) - #define MAXMEM ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)) -+ -+#ifndef CONFIG_DEBUG_UAF - #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) - #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) - #define virt_to_page(kaddr) (mem_map + (__pa(kaddr) >> PAGE_SHIFT)) -+#else -+#define __pa(x) ({ \ -+ unsigned long __pn, __fr; \ -+ __pn = (unsigned long)(x)-PAGE_OFFSET; \ -+ __fr = __pn >> PAGE_SHIFT; \ -+ if (jiffies > HZ*3 && __fr >= max_mapnr) { \ -+ printk("invalid arg __pa(0x%x)" \ -+ " at %s:%d\n", (unsigned) (x), \ -+ __FILE__, __LINE__); \ -+ dump_stack(); \ -+ } \ -+ __pn; \ -+ }) -+ -+#define __va(x) ({ \ -+ unsigned long __pn; \ -+ __pn = (unsigned long) (x) >> PAGE_SHIFT; \ -+ if (jiffies > HZ*3 && __pn >= max_mapnr) { \ -+ printk("invalid arg __va(0x%x)" \ -+ " at %s:%d\n", (unsigned) (x), \ -+ __FILE__, __LINE__); \ -+ dump_stack(); \ -+ } \ -+ ((void *)((unsigned long)(x) + PAGE_OFFSET)); \ -+ }) -+ -+#define virt_to_page(ka) ({ \ -+ struct page *_p; \ -+ if ((unsigned long)(ka) >= VMALLOC_START) { \ -+ _p = vmalloc_to_page((void *)(ka)); \ -+ BUG_ON(!_p); \ -+ } else \ -+ _p = mem_map+(__pa(ka) >> PAGE_SHIFT); \ -+ (_p); \ -+ }) -+#endif -+ -+ - #define VALID_PAGE(page) ((page - mem_map) < max_mapnr) - - #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ - -%diffstat - arch/i386/config.in | 3 - fs/proc/proc_misc.c | 19 + - include/asm-i386/io.h | 10 - include/asm-i386/page.h | 40 +++ - include/linux/slab.h | 1 - init/main.c | 3 - mm/slab.c | 487 ++++++++++++++++++++++++++++++++++++++++++++++++ - mm/vmalloc.c | 4 - 8 files changed, 565 insertions(+), 2 deletions(-) - diff --git a/lustre/kernel_patches/patches/slab-use-after-free-debug-2.4.24.patch b/lustre/kernel_patches/patches/slab-use-after-free-debug-2.4.24.patch deleted file mode 100644 index 9627033ca7..0000000000 --- a/lustre/kernel_patches/patches/slab-use-after-free-debug-2.4.24.patch +++ /dev/null @@ -1,798 +0,0 @@ -%patch -Index: linux-2.4.24/mm/slab.c -=================================================================== ---- linux-2.4.24.orig/mm/slab.c 2004-07-16 09:33:00.000000000 -0400 -+++ linux-2.4.24/mm/slab.c 2004-07-17 08:02:02.000000000 -0400 -@@ -97,6 +97,8 @@ - #define FORCED_DEBUG 0 - #endif - -+#include <linux/vmalloc.h> -+ - /* - * Parameters for kmem_cache_reap - */ -@@ -825,6 +827,12 @@ - return cachep; - } - -+#ifdef CONFIG_DEBUG_UAF -+void * uaf_alloc(kmem_cache_t *, int gfp_mask); -+int uaf_cache_free(kmem_cache_t *, void *addr); -+int uaf_free(void *addr); -+struct page *uaf_vaddr_to_page(void *obj); -+#endif - - #if DEBUG - /* -@@ -1340,6 +1348,20 @@ - unsigned long save_flags; - void* objp; - -+#ifdef CONFIG_DEBUG_UAF -+ /* try to use uaf-allocator first */ -+ objp = uaf_alloc(cachep, flags); -+ if (objp) { -+ if (cachep->ctor) { -+ unsigned long ctor_flags; -+ ctor_flags = SLAB_CTOR_CONSTRUCTOR; -+ if (!(flags & __GFP_WAIT)) -+ ctor_flags |= SLAB_CTOR_ATOMIC; -+ cachep->ctor(objp, cachep, ctor_flags); -+ } -+ return objp; -+ } -+#endif - kmem_cache_alloc_head(cachep, flags); - try_again: - local_irq_save(save_flags); -@@ -1434,13 +1456,17 @@ - - if (cachep->flags & SLAB_RED_ZONE) { - objp -= BYTES_PER_WORD; -- if (xchg((unsigned long *)objp, RED_MAGIC1) != RED_MAGIC2) -+ if (xchg((unsigned long *)objp, RED_MAGIC1) != RED_MAGIC2) { - /* Either write before start, or a double free. */ -+ printk("inconsistency in %s\n", cachep->name); - BUG(); -+ } - if (xchg((unsigned long *)(objp+cachep->objsize - -- BYTES_PER_WORD), RED_MAGIC1) != RED_MAGIC2) -+ BYTES_PER_WORD), RED_MAGIC1) != RED_MAGIC2) { - /* Either write past end, or a double free. */ -+ printk("inconsistency in %s\n", cachep->name); - BUG(); -+ } - } - if (cachep->flags & SLAB_POISON) - kmem_poison_obj(cachep, objp); -@@ -1576,6 +1602,10 @@ - void kmem_cache_free (kmem_cache_t *cachep, void *objp) - { - unsigned long flags; -+#ifdef CONFIG_DEBUG_UAF -+ if (uaf_cache_free(cachep, objp)) -+ return; -+#endif - #if DEBUG - CHECK_PAGE(virt_to_page(objp)); - if (cachep != GET_PAGE_CACHE(virt_to_page(objp))) -@@ -1601,6 +1631,10 @@ - - if (!objp) - return; -+#ifdef CONFIG_DEBUG_UAF -+ if (uaf_free((void *) objp)) -+ return; -+#endif - local_irq_save(flags); - CHECK_PAGE(virt_to_page(objp)); - c = GET_PAGE_CACHE(virt_to_page(objp)); -@@ -2076,3 +2110,478 @@ - #endif - } - #endif -+ -+ -+ -+#ifdef CONFIG_DEBUG_UAF -+ -+#define MAX_UAF_OBJ_SIZE 8 /* in pages */ -+#define UAF_ASSERT(xxx) if (!(xxx)) BUG(); -+#define UAF_DEBUG__ -+#ifdef UAF_DEBUG -+#define uaf_printk(fmt,a...) printk(fmt, ##a) -+#else -+#define uaf_printk(a,...) -+#endif -+ -+struct uaf_stats { -+ atomic_t uaf_allocated; -+ atomic_t uaf_allocations; -+ atomic_t uaf_failed; -+}; -+ -+static int uaf_max = 8192; -+static void *uaf_bitmap = NULL; -+static spinlock_t uaf_lock; -+static int uaf_last_found = 0; -+static int uaf_used = 0; -+static struct vm_struct *uaf_area = NULL; -+static struct uaf_stats uaf_stats[MAX_UAF_OBJ_SIZE + 1]; -+ -+static int __init uaf_setup(char *str) -+{ -+ uaf_max = simple_strtoul(str, NULL, 0); -+ return 1; -+} -+ -+__setup("uaf=", uaf_setup); -+ -+ -+void uaf_init(void) -+{ -+ int size; -+ -+ printk("UAF: total vmalloc-space - %lu\n", -+ VMALLOC_END - VMALLOC_START); -+ -+ uaf_area = get_vm_area(PAGE_SIZE * uaf_max, VM_ALLOC); -+ if (!uaf_area) { -+ printk(KERN_ALERT "UAF: can't reserve %lu bytes in KVA\n", -+ PAGE_SIZE * uaf_max); -+ return; -+ } -+ -+ printk("UAF: reserved %lu bytes in KVA at 0x%p\n", -+ PAGE_SIZE * uaf_max, uaf_area->addr); -+ -+ /* how many bytes we need to track space usage? */ -+ size = uaf_max / 8 + 8; -+ -+ uaf_bitmap = vmalloc(size); -+ if (!uaf_bitmap) { -+ printk(KERN_ALERT -+ "UAF: can't allocate %d bytes for bitmap\n", size); -+ return; -+ } -+ memset(uaf_bitmap, 0, size); -+ spin_lock_init(&uaf_lock); -+ memset(uaf_stats, 0, sizeof(uaf_stats)); -+ -+ printk("UAF: allocated %d for bitmap\n", size); -+} -+ -+static int uaf_find(int len) -+{ -+ int new_last_found = -1; -+ int loop = 0; -+ int i, j; -+ -+ j = uaf_last_found; -+ -+ do { -+ i = find_next_zero_bit(uaf_bitmap, uaf_max, j); -+ if (i >= uaf_max) { -+ /* repeat from 0 */ -+ if (++loop > 1) { -+ /* this is 2nd loop and it's useless */ -+ return -1; -+ } -+ -+ i = find_next_zero_bit(uaf_bitmap, uaf_max, 0); -+ if (i >= uaf_max) -+ return -1; -+ -+ /* save found num for subsequent searches */ -+ if (new_last_found == -1) -+ new_last_found = uaf_last_found = i; -+ UAF_ASSERT(new_last_found < uaf_max); -+ } -+ -+ /* -+ * OK. found first zero bit. -+ * now, try to find requested cont. zero-space -+ */ -+ -+ /* FIXME: implmement multipage allocation! */ -+ break; -+ -+ /* -+ j = find_next_bit(uaf_bitmap, uaf_max, i); -+ if (++loop2 > 10000) { -+ printk("ALERT: loop2=%d\n", loop2); -+ return -1; -+ } -+ */ -+ } while (j - i < len); -+ -+ /* found! */ -+ if (new_last_found == -1) -+ uaf_last_found = i + 1; -+ if (uaf_last_found >= uaf_max) -+ uaf_last_found = 0; -+ return i; -+} -+ -+extern int __vmalloc_area_pages (unsigned long address, unsigned long size, -+ int gfp_mask, pgprot_t prot, -+ struct page ***pages); -+void * uaf_alloc(kmem_cache_t *cachep, int gfp_mask) -+{ -+ struct page *ptrs[MAX_UAF_OBJ_SIZE]; -+ int size = cachep->objsize; -+ struct page **pages; -+ unsigned long flags; -+ unsigned long addr; -+ int i, j, err = -2000; -+ -+ if (uaf_bitmap == NULL) -+ return NULL; -+ -+ if (!(cachep->flags & SLAB_USE_UAF)) -+ return NULL; -+ -+ pages = (struct page **) ptrs; -+ size = (size + (PAGE_SIZE - 1)) / PAGE_SIZE; -+ /* FIXME: implement multipage allocation! */ -+ if (size > 1) -+ return NULL; -+ if (size > MAX_UAF_OBJ_SIZE) { -+ printk(KERN_ALERT "size is too big: %d\n", size); -+ return NULL; -+ } -+ -+ if (uaf_used == uaf_max) { -+ uaf_printk("UAF: space exhausted!\n"); -+ atomic_inc(&uaf_stats[size].uaf_failed); -+ return NULL; -+ } -+ -+ -+ spin_lock_irqsave(&uaf_lock, flags); -+ i = uaf_find(size); -+ if (i < 0) { -+ spin_unlock_irqrestore(&uaf_lock, flags); -+ atomic_inc(&uaf_stats[size].uaf_failed); -+ return NULL; -+ } -+ for (j = 0; j < size; j++) { -+ UAF_ASSERT(!test_bit(i + j, uaf_bitmap)); -+ set_bit(i + j, uaf_bitmap); -+ uaf_used++; -+ } -+ spin_unlock_irqrestore(&uaf_lock, flags); -+ -+ addr = ((unsigned long) uaf_area->addr) + (PAGE_SIZE * i); -+ uaf_printk("UAF: found %d/%d, base 0x%p, map at 0x%lx: ", i, -+ size, uaf_area->addr, addr); -+ -+ /* OK. we've found free space, let's allocate pages */ -+ memset(pages, 0, sizeof(struct page *) * MAX_UAF_OBJ_SIZE); -+ for (j = 0; j < size; j++) { -+ pages[j] = alloc_page(gfp_mask); -+ if (pages[j] == NULL) -+ goto nomem; -+ uaf_printk("0x%p ", pages[j]); -+ } -+ -+ /* time to map just allocated pages */ -+ err = __vmalloc_area_pages(addr, PAGE_SIZE * size, gfp_mask, -+ PAGE_KERNEL, &pages); -+ pages = (struct page **) ptrs; -+ if (err == 0) { -+ /* put slab cache pointer in first page */ -+ ptrs[0]->list.next = (void *) cachep; -+ uaf_printk(" -> 0x%lx\n", addr); -+ atomic_inc(&uaf_stats[size].uaf_allocated); -+ atomic_inc(&uaf_stats[size].uaf_allocations); -+ if (!in_interrupt() && !in_softirq()) -+ flush_tlb_all(); -+ else -+ local_flush_tlb(); -+ size = cachep->objsize; -+ if (size < PAGE_SIZE) -+ memset((char *) addr + size, 0xa7, PAGE_SIZE - size); -+ return (void *) addr; -+ } -+ -+nomem: -+ printk(KERN_ALERT "can't map pages: %d\n", err); -+ for (j = 0; j < size; j++) -+ if (pages[j]) -+ __free_page(pages[j]); -+ -+ /* can't find free pages */ -+ spin_lock_irqsave(&uaf_lock, flags); -+ for (j = 0; j < size; j++) { -+ clear_bit(i + j, uaf_bitmap); -+ uaf_used--; -+ } -+ spin_unlock_irqrestore(&uaf_lock, flags); -+ atomic_inc(&uaf_stats[size].uaf_failed); -+ -+ return NULL; -+} -+ -+extern void free_area_pmd(pgd_t *dir, unsigned long address, -+ unsigned long size); -+static void uaf_unmap(unsigned long address, unsigned long size) -+{ -+ unsigned long end = (address + size); -+ pgd_t *dir; -+ -+ dir = pgd_offset_k(address); -+ flush_cache_all(); -+ do { -+ free_area_pmd(dir, address, end - address); -+ address = (address + PGDIR_SIZE) & PGDIR_MASK; -+ dir++; -+ } while (address && (address < end)); -+ -+ /* -+ * we must not call smp_call_function() with interrtups disabled -+ * otherwise we can get into deadlock -+ */ -+ if (!in_interrupt() && !in_softirq()) -+ flush_tlb_all(); -+ else -+ local_flush_tlb(); -+} -+ -+/* -+ * returns 1 if free was successfull -+ */ -+int uaf_cache_free(kmem_cache_t *cachep, void *addr) -+{ -+ struct page *pages[MAX_UAF_OBJ_SIZE]; -+ int size = cachep->objsize; -+ unsigned long flags; -+ int i, j; -+ -+ if (cachep->flags & SLAB_USE_UAF) -+ uaf_printk("UAF: to free 0x%p/%d\n", addr, size); -+ -+ size = (size + (PAGE_SIZE - 1)) / PAGE_SIZE; -+ if (size > MAX_UAF_OBJ_SIZE) -+ return 0; -+ -+ if (uaf_bitmap == NULL) -+ return 0; -+ -+ /* first, check is address is in UAF space */ -+ if ((unsigned) addr < (unsigned) uaf_area->addr || -+ (unsigned) addr >= (unsigned) uaf_area->addr + uaf_area->size) -+ return 0; -+ -+ uaf_printk("UAF: to free 0x%p/%d\n", addr, size); -+ -+ /* calculate placement in bitmap */ -+ i = (unsigned) addr - (unsigned) uaf_area->addr; -+ UAF_ASSERT(i >= 0); -+ i = i / PAGE_SIZE; -+ -+ /* check against double-free */ -+ spin_lock_irqsave(&uaf_lock, flags); -+ for (j = 0; j < size; j++) { -+ /* now check is correspondend bit set */ -+ unsigned long address; -+ UAF_ASSERT(i+j >= 0 && i+j < uaf_max); -+ BUG_ON(!test_bit(i+j, uaf_bitmap)); -+ -+ address = ((unsigned long) addr) + (PAGE_SIZE * j); -+ pages[j] = vmalloc_to_page((void *) address); -+ BUG_ON(pages[j] == NULL); -+ -+ /* now free space in UAF */ -+ clear_bit(i+j, uaf_bitmap); -+ uaf_used--; -+ } -+ spin_unlock_irqrestore(&uaf_lock, flags); -+ -+ /* check poison bytes */ -+ if (cachep->objsize < PAGE_SIZE) { -+ unsigned char *a = (void *) addr; -+ for (i = 0; i < PAGE_SIZE - cachep->objsize; i++) -+ if (a[cachep->objsize + i] != 0xa7) { -+ printk("corruption(0x%x) at %u in %s/0x%p\n", -+ (unsigned) a[cachep->objsize + i], -+ cachep->objsize + i, cachep->name, addr); -+ BUG(); -+ } -+ } -+ UAF_ASSERT(((unsigned long) addr & ~PAGE_MASK) == 0UL); -+ -+ /* calculate placement in bitmap */ -+ i = (unsigned) addr - (unsigned) uaf_area->addr; -+ UAF_ASSERT(i >= 0); -+ i = i / PAGE_SIZE; -+ -+ uaf_unmap((unsigned long) addr, PAGE_SIZE * size); -+ /* free all the pages */ -+ for (j = 0; j < size; j++) -+ __free_page(pages[j]); -+ -+ atomic_dec(&uaf_stats[size].uaf_allocated); -+ -+ uaf_printk("UAF: freed %d/%d at 0x%p\n", i, size, addr); -+ //printk("UAF: freed %d/%d at 0x%p\n", i, size, addr); -+ -+ return 1; -+} -+ -+struct page *uaf_vaddr_to_page(void *obj) -+{ -+ if (uaf_bitmap == NULL) -+ return NULL; -+ -+ /* first, check is address is in UAF space */ -+ if ((unsigned) obj < (unsigned) uaf_area->addr || -+ (unsigned) obj >= (unsigned) uaf_area->addr + uaf_area->size) -+ return NULL; -+ -+ return vmalloc_to_page(obj); -+} -+ -+int uaf_free(void *obj) -+{ -+ struct page *page = uaf_vaddr_to_page((void *) obj); -+ kmem_cache_t *c; -+ -+ if (!page) -+ return 0; -+ -+ c = GET_PAGE_CACHE(page); -+ return uaf_cache_free(c, (void *) obj); -+} -+ -+int uaf_is_allocated(void *obj) -+{ -+ unsigned long addr = (unsigned long) obj; -+ int i; -+ -+ if (uaf_bitmap == NULL) -+ return 0; -+ -+ addr &= PAGE_MASK; -+ /* first, check is address is in UAF space */ -+ if (addr < (unsigned long) uaf_area->addr || -+ addr >= (unsigned long) uaf_area->addr + uaf_area->size) -+ return 0; -+ -+ /* calculate placement in bitmap */ -+ i = (unsigned) addr - (unsigned) uaf_area->addr; -+ i = i / PAGE_SIZE; -+ return test_bit(i, uaf_bitmap); -+} -+ -+static void *uaf_s_start(struct seq_file *m, loff_t *pos) -+{ -+ loff_t n = *pos; -+ -+ if (!n) -+ seq_printf(m, "size(pgs) allocated failed allocations. " -+ "%d reserved, %d in use, %d last\n" -+ "start 0x%p, size %lu, bitmap 0x%p\n" -+ "VMALLOC_START 0x%x, VMALLOC_END 0x%x\n", -+ uaf_max, uaf_used, uaf_last_found, -+ uaf_area->addr, uaf_area->size, -+ uaf_bitmap, VMALLOC_START, VMALLOC_END); -+ else if (n > MAX_UAF_OBJ_SIZE) -+ return NULL; -+ -+ *pos = 1; -+ return (void *) 1; -+} -+ -+static void *uaf_s_next(struct seq_file *m, void *p, loff_t *pos) -+{ -+ unsigned long n = *pos; -+ ++*pos; -+ if (n + 1 > MAX_UAF_OBJ_SIZE) -+ return NULL; -+ return (void *) (n + 1); -+} -+ -+static void uaf_s_stop(struct seq_file *m, void *p) -+{ -+} -+ -+static int uaf_s_show(struct seq_file *m, void *p) -+{ -+ int n = (int) p; -+ -+ if (n > MAX_UAF_OBJ_SIZE) -+ return 0; -+ seq_printf(m, "%d %d %d %d\n", n, -+ atomic_read(&uaf_stats[n].uaf_allocated), -+ atomic_read(&uaf_stats[n].uaf_failed), -+ atomic_read(&uaf_stats[n].uaf_allocations)); -+ return 0; -+} -+ -+struct seq_operations uafinfo_op = { -+ .start = uaf_s_start, -+ .next = uaf_s_next, -+ .stop = uaf_s_stop, -+ .show = uaf_s_show, -+}; -+ -+ssize_t uafinfo_write(struct file *file, const char *buffer, -+ size_t count, loff_t *ppos) -+{ -+ char kbuf[MAX_SLABINFO_WRITE+1], *tmp; -+ char *key, *name; -+ int res; -+ struct list_head *p; -+ -+ if (count > MAX_SLABINFO_WRITE) -+ return -EINVAL; -+ if (copy_from_user(&kbuf, buffer, count)) -+ return -EFAULT; -+ kbuf[MAX_SLABINFO_WRITE] = '\0'; -+ -+ tmp = kbuf; -+ key = strsep(&tmp, " \t\n"); -+ if (!key) -+ return -EINVAL; -+ if (!strcmp(key, "on")) -+ res = 1; -+ else if (!strcmp(key, "off")) -+ res = 0; -+ else -+ return -EINVAL; -+ -+ name = strsep(&tmp, " \t\n"); -+ if (!name) -+ return -EINVAL; -+ -+ /* Find the cache in the chain of caches. */ -+ down(&cache_chain_sem); -+ list_for_each(p,&cache_chain) { -+ kmem_cache_t *cachep = list_entry(p, kmem_cache_t, next); -+ -+ if (!strcmp(cachep->name, name)) { -+ if (res) { -+ printk("UAF: use on %s\n", cachep->name); -+ cachep->flags |= SLAB_USE_UAF; -+ } else { -+ printk("UAF: dont use on %s\n", cachep->name); -+ cachep->flags &= ~SLAB_USE_UAF; -+ } -+ break; -+ } -+ } -+ up(&cache_chain_sem); -+ return count; -+} -+#endif -+ -Index: linux-2.4.24/mm/vmalloc.c -=================================================================== ---- linux-2.4.24.orig/mm/vmalloc.c 2004-07-16 09:24:01.000000000 -0400 -+++ linux-2.4.24/mm/vmalloc.c 2004-07-16 13:55:05.000000000 -0400 -@@ -53,7 +53,7 @@ - } while (address < end); - } - --static inline void free_area_pmd(pgd_t * dir, unsigned long address, unsigned long size) -+void free_area_pmd(pgd_t * dir, unsigned long address, unsigned long size) - { - pmd_t * pmd; - unsigned long end; -@@ -152,7 +152,7 @@ - return 0; - } - --static inline int __vmalloc_area_pages (unsigned long address, -+int __vmalloc_area_pages (unsigned long address, - unsigned long size, - int gfp_mask, - pgprot_t prot, -Index: linux-2.4.24/mm/page_alloc.c -=================================================================== ---- linux-2.4.24.orig/mm/page_alloc.c 2004-07-16 09:33:00.000000000 -0400 -+++ linux-2.4.24/mm/page_alloc.c 2004-07-16 13:55:05.000000000 -0400 -@@ -91,6 +91,12 @@ - zone_t *zone; - - arch_free_page(page, order); -+ -+ for (index = 0; index < (1 << order); index++) { -+ BUG_ON(atomic_read(&page[index].count) > 0); -+ BUG_ON(PageSlab(page + index)); -+ } -+ - /* - * Yes, think what happens when other parts of the kernel take - * a reference to a page in order to pin it for io. -ben -Index: linux-2.4.24/init/main.c -=================================================================== ---- linux-2.4.24.orig/init/main.c 2004-07-16 09:24:01.000000000 -0400 -+++ linux-2.4.24/init/main.c 2004-07-16 13:55:05.000000000 -0400 -@@ -437,6 +437,9 @@ - #if defined(CONFIG_SYSVIPC) - ipc_init(); - #endif -+#ifdef CONFIG_DEBUG_UAF -+ uaf_init(); -+#endif - rest_init(); - } - -Index: linux-2.4.24/fs/proc/proc_misc.c -=================================================================== ---- linux-2.4.24.orig/fs/proc/proc_misc.c 2004-07-16 09:23:51.000000000 -0400 -+++ linux-2.4.24/fs/proc/proc_misc.c 2004-07-16 13:55:05.000000000 -0400 -@@ -303,6 +303,22 @@ - release: seq_release, - }; - -+#ifdef CONFIG_DEBUG_UAF -+extern struct seq_operations uafinfo_op; -+extern ssize_t uafinfo_write(struct file *, const char *, size_t, loff_t *); -+static int uafinfo_open(struct inode *inode, struct file *file) -+{ -+ return seq_open(file, &uafinfo_op); -+} -+static struct file_operations proc_uafinfo_operations = { -+ .open = uafinfo_open, -+ .read = seq_read, -+ .write = uafinfo_write, -+ .llseek = seq_lseek, -+ .release = seq_release, -+}; -+#endif -+ - static int kstat_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) - { -@@ -640,6 +656,9 @@ - create_seq_entry("iomem", 0, &proc_iomem_operations); - create_seq_entry("partitions", 0, &proc_partitions_operations); - create_seq_entry("slabinfo",S_IWUSR|S_IRUGO,&proc_slabinfo_operations); -+#ifdef CONFIG_DEBUG_UAF -+ create_seq_entry("uafinfo",S_IWUSR|S_IRUGO,&proc_uafinfo_operations); -+#endif - #ifdef CONFIG_MODULES - create_seq_entry("ksyms", 0, &proc_ksyms_operations); - #endif -Index: linux-2.4.24/include/linux/slab.h -=================================================================== ---- linux-2.4.24.orig/include/linux/slab.h 2004-07-16 09:33:00.000000000 -0400 -+++ linux-2.4.24/include/linux/slab.h 2004-07-17 05:26:51.000000000 -0400 -@@ -40,6 +40,7 @@ - #define SLAB_HWCACHE_ALIGN 0x00002000UL /* align objs on a h/w cache lines */ - #define SLAB_CACHE_DMA 0x00004000UL /* use GFP_DMA memory */ - #define SLAB_MUST_HWCACHE_ALIGN 0x00008000UL /* force alignment */ -+#define SLAB_USE_UAF 0x00040000UL /* use UAF allocator */ - - /* flags passed to a constructor func */ - #define SLAB_CTOR_CONSTRUCTOR 0x001UL /* if not set, then deconstructor */ -Index: linux-2.4.24/include/asm-i386/io.h -=================================================================== ---- linux-2.4.24.orig/include/asm-i386/io.h 2004-07-16 09:23:54.000000000 -0400 -+++ linux-2.4.24/include/asm-i386/io.h 2004-07-17 05:27:02.000000000 -0400 -@@ -75,6 +75,16 @@ - - static inline unsigned long virt_to_phys(volatile void * address) - { -+#ifdef CONFIG_DEBUG_UAF -+ unsigned long addr = (unsigned long) address; -+ if (vmlist && addr >= VMALLOC_START && addr < VMALLOC_END) { -+ struct page *page = vmalloc_to_page((void *) address); -+ if (page) { -+ unsigned long offset = addr & ~PAGE_MASK; -+ address = page_address(page) + offset; -+ } -+ } -+#endif - return __pa(address); - } - -Index: linux-2.4.24/include/asm-i386/page.h -=================================================================== ---- linux-2.4.24.orig/include/asm-i386/page.h 2004-07-16 09:33:00.000000000 -0400 -+++ linux-2.4.24/include/asm-i386/page.h 2004-07-17 05:26:19.000000000 -0400 -@@ -131,9 +131,60 @@ - #define VMALLOC_RESERVE ((unsigned long)__VMALLOC_RESERVE) - #define __MAXMEM (-__PAGE_OFFSET-__VMALLOC_RESERVE) - #define MAXMEM ((unsigned long)(-PAGE_OFFSET-VMALLOC_RESERVE)) -+ -+#ifndef CONFIG_DEBUG_UAF - #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) - #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) - #define virt_to_page(kaddr) (mem_map + (__pa(kaddr) >> PAGE_SHIFT)) -+#else -+#define __pa(x) ({ \ -+ unsigned long __pn, __fr; \ -+ __pn = (unsigned long)(x)-PAGE_OFFSET; \ -+ __fr = __pn >> PAGE_SHIFT; \ -+ if (jiffies > HZ*3 && __fr >= max_mapnr) { \ -+ printk("invalid arg __pa(0x%x)" \ -+ " at %s:%d\n", (unsigned) (x), \ -+ __FILE__, __LINE__); \ -+ dump_stack(); \ -+ } \ -+ __pn; \ -+ }) -+ -+#define __va(x) ({ \ -+ unsigned long __pn; \ -+ __pn = (unsigned long) (x) >> PAGE_SHIFT; \ -+ if (jiffies > HZ*3 && __pn >= max_mapnr) { \ -+ printk("invalid arg __va(0x%x)" \ -+ " at %s:%d\n", (unsigned) (x), \ -+ __FILE__, __LINE__); \ -+ dump_stack(); \ -+ } \ -+ ((void *)((unsigned long)(x) + PAGE_OFFSET)); \ -+ }) -+#ifndef PKMAP_BASE -+#define PKMAP_BASE (0xfe000000UL) -+#endif -+#define virt_to_page(ka) ({ \ -+ struct page *_p; \ -+ if ((unsigned)(ka) >= VMALLOC_START && \ -+ (unsigned)(ka) < VMALLOC_END) { \ -+ _p = vmalloc_to_page((void *)(ka)); \ -+ if (!_p) { \ -+ printk(KERN_ALERT \ -+ "wrong address 0x%x, " \ -+ "VMALLOC_START 0x%x\n", \ -+ (unsigned) (ka), \ -+ (unsigned)VMALLOC_START); \ -+ _p = mem_map+(__pa(ka) >> PAGE_SHIFT); \ -+ dump_stack(); \ -+ } \ -+ } else \ -+ _p = mem_map+(__pa(ka) >> PAGE_SHIFT); \ -+ (_p); \ -+ }) -+#endif -+ -+ - #define VALID_PAGE(page) ((page - mem_map) < max_mapnr) - - #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ -Index: linux-2.4.24/arch/i386/config.in -=================================================================== ---- linux-2.4.24.orig/arch/i386/config.in 2004-07-16 09:33:02.000000000 -0400 -+++ linux-2.4.24/arch/i386/config.in 2004-07-16 13:55:05.000000000 -0400 -@@ -509,6 +509,9 @@ - bool ' Check for stack overflows' CONFIG_DEBUG_STACKOVERFLOW - bool ' Debug high memory support' CONFIG_DEBUG_HIGHMEM - bool ' Debug memory allocations' CONFIG_DEBUG_SLAB -+ if [ "$CONFIG_DEBUG_SLAB" != "n" ]; then -+ bool ' Debug memory allocations (use-after-free via vmalloced space)' CONFIG_DEBUG_UAF -+ fi - bool ' Memory mapped I/O debugging' CONFIG_DEBUG_IOVIRT - bool ' Magic SysRq key' CONFIG_MAGIC_SYSRQ - bool ' Spinlock debugging' CONFIG_DEBUG_SPINLOCK -Index: linux-2.4.24/kernel/ksyms.c -=================================================================== ---- linux-2.4.24.orig/kernel/ksyms.c 2004-07-16 09:36:49.000000000 -0400 -+++ linux-2.4.24/kernel/ksyms.c 2004-07-16 13:55:05.000000000 -0400 -@@ -123,6 +123,8 @@ - EXPORT_SYMBOL(kfree); - EXPORT_SYMBOL(vfree); - EXPORT_SYMBOL(__vmalloc); -+extern struct vm_struct * vmlist; -+EXPORT_SYMBOL(vmlist); - EXPORT_SYMBOL(vmap); - EXPORT_SYMBOL(vmalloc_to_page); - EXPORT_SYMBOL(mem_map); - -%diffstat - arch/i386/config.in | 3 - fs/proc/proc_misc.c | 19 + - include/asm-i386/io.h | 10 - include/asm-i386/page.h | 51 ++++ - include/linux/slab.h | 1 - init/main.c | 3 - kernel/ksyms.c | 2 - mm/page_alloc.c | 6 - mm/slab.c | 513 +++++++++++++++++++++++++++++++++++++++++++++++- - mm/vmalloc.c | 4 - 10 files changed, 608 insertions(+), 4 deletions(-) - diff --git a/lustre/kernel_patches/patches/smfs-export-symbol.patch b/lustre/kernel_patches/patches/smfs-export-symbol.patch deleted file mode 100644 index f2ca84b996..0000000000 --- a/lustre/kernel_patches/patches/smfs-export-symbol.patch +++ /dev/null @@ -1,13 +0,0 @@ -Index: linux-2.4.20-8/kernel/ksyms.c -=================================================================== ---- linux-2.4.20-8.orig/kernel/ksyms.c 2004-04-06 20:50:10.000000000 +0800 -+++ linux-2.4.20-8/kernel/ksyms.c 2004-04-06 22:50:31.000000000 +0800 -@@ -336,7 +336,7 @@ - EXPORT_SYMBOL(refile_buffer); - EXPORT_SYMBOL(max_sectors); - EXPORT_SYMBOL(max_readahead); -- -+EXPORT_SYMBOL(get_blkfops); - /* tty routines */ - EXPORT_SYMBOL(tty_hangup); - EXPORT_SYMBOL(tty_wait_until_sent); diff --git a/lustre/kernel_patches/patches/snapfs_core-2.4.20.patch b/lustre/kernel_patches/patches/snapfs_core-2.4.20.patch deleted file mode 100644 index 60b27d0f72..0000000000 --- a/lustre/kernel_patches/patches/snapfs_core-2.4.20.patch +++ /dev/null @@ -1,3082 +0,0 @@ -%patch -Index: linux-2.4.20-8/fs/ext3/snap.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/snap.c 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/snap.c 2004-01-27 00:07:10.000000000 +0800 -@@ -0,0 +1,2577 @@ -+/* fs/ext3/snap.c -+ * -+ * Copyright (c) 2002 Cluster File Systems, Inc. <info@clusterfs.com> -+ * started by Andreas Dilger <adilger@turbolinux.com> -+ * Peter Braam <braam@mountainviewdata.com> -+ * Harrison Xing <harrisonx@mountainviewdata.com> -+ * Eric Mei <Ericm@clusterfs.com> -+ * -+ * port to 2.4 by Wang Di <wangdi@clusterfs.com> -+ * Eric Mei <ericm@clusterfs.com> -+ * -+ * Functions for implementing snapshots in the ext3 filesystem. They are -+ * intended to hide the internals of the filesystem from the caller in -+ * such a way that the caller doesn't need to know about inode numbers, -+ * how the redirectors are implemented or stored, etc. It may not do that -+ * all yet, but it tries. -+ * -+ * The snapshot inode redirection is stored in the primary/direct inode as -+ * an extended attribute $snap, in the form of little-endian u32 inode -+ * numbers. -+ * -+ */ -+ -+#define EXPORT_SYMTAB -+#include <linux/module.h> -+ -+#include <linux/sched.h> -+#include <linux/jbd.h> -+#include <linux/mm.h> -+#include <linux/slab.h> -+#include <linux/locks.h> -+#include <linux/snap.h> -+#include <linux/ext3_jbd.h> -+#include <linux/ext3_fs.h> -+#include <linux/ext3_xattr.h> -+ -+#define EXT3_SNAP_ATTR "@snap" -+#define EXT3_SNAP_GENERATION_ATTR "@snap_generation" -+#define EXT3_MAX_SNAPS 20 -+#define EXT3_MAX_SNAP_DATA (sizeof(struct snap_ea)) -+#define EXT3_SNAP_INDEX EXT3_XATTR_INDEX_LUSTRE -+ -+#define EXT3_SNAP_DEBUG -+#ifdef EXT3_SNAP_DEBUG -+ #define snap_debug(f, a...) \ -+ do { \ -+ printk (KERN_INFO "SNAP DEBUG: (%s, %d): %s: ", \ -+ __FILE__, __LINE__, __FUNCTION__); \ -+ printk (f, ## a); \ -+ } while (0) -+ -+ #define snap_err(f, a...) \ -+ do { \ -+ printk (KERN_ERR "SNAP ERROR: (%s, %d): %s: ", \ -+ __FILE__, __LINE__, __FUNCTION__); \ -+ printk (f, ## a); \ -+ } while (0) -+ -+#else -+ #define snap_debug(f, a...) do {} while (0) -+ #define snap_err(f, a...) \ -+ do { \ -+ printk (KERN_ERR "SNAP ERROR: (%s, %d): ", \ -+ __FILE__, __LINE__); \ -+ printk (f, ## a); \ -+ } while (0) -+ -+#endif -+ -+#ifdef EXT3_SNAP_DEBUG -+ #define ALLOC(ptr, cast, size) \ -+ do { \ -+ ptr = (cast)kmalloc((size_t) size, GFP_KERNEL); \ -+ if (ptr == 0) { \ -+ printk(KERN_ERR "kmalloc returns 0 at %s:%d\n", \ -+ __FILE__, __LINE__); \ -+ } else { \ -+ snap_kmem += size; \ -+ printk(KERN_INFO "snap_alloc %d, kmem %ld\n", \ -+ (size_t)size, snap_kmem); \ -+ } \ -+ } while (0) -+ -+ #define FREE(ptr,size) \ -+ do { \ -+ kfree((ptr)); \ -+ snap_kmem -= size; \ -+ printk(KERN_INFO "snap_free %d, kmem %ld\n", \ -+ (size_t)size, snap_kmem); \ -+ } while (0) -+ -+#else -+ #define ALLOC(ptr, cast, size) \ -+ do { \ -+ ptr = (cast)kmalloc((size_t) size, GFP_KERNEL); \ -+ } while (0) -+ -+ #define FREE(ptr,size) \ -+ do { \ -+ kfree((ptr)); \ -+ } while (0) -+ -+#endif /* EXT3_SNAP_DEBUG */ -+ -+#ifdef EXT3_SNAP_DEBUG -+ /* modestr: convert inode mode to string . debug function */ -+ static char * modestr ( umode_t mode ) -+ { -+ if( S_ISREG(mode) ) -+ return "file"; -+ else if(S_ISDIR(mode)) -+ return "dir"; -+ else if(S_ISLNK(mode)) -+ return "link"; -+ else if(S_ISCHR(mode)) -+ return "char"; -+ else if(S_ISBLK(mode)) -+ return "block"; -+ else if(S_ISFIFO(mode)) -+ return "fifo"; -+ else if(S_ISSOCK(mode)) -+ return "sock"; -+ else -+ return "non-known"; -+ } -+#define DEBUG_INODE(inode) \ -+ if(inode && !IS_ERR(inode)) { \ -+ snap_debug("%s ino %lu, i_nlink %u, i_count %d, i_mode %u, i_size %lld, i_blocks %lu\n", \ -+ modestr(inode->i_mode), inode->i_ino, inode->i_nlink, \ -+ atomic_read(&inode->i_count), inode->i_mode, inode->i_size, \ -+ inode->i_blocks); } -+#else -+ #define modestr(mode) do {} while (0) -+ #define DEBUG_INODE(inode) -+ -+#endif /* EXT3_SNAP_DEBUG */ -+/* do file cow on: dir, symlink, regular but fs has filecow flag */ -+ -+#define IS_FILECOW_TYPE(inode) \ -+ (S_ISDIR(inode->i_mode) || \ -+ S_ISLNK(inode->i_mode) || \ -+ (S_ISREG(inode->i_mode) && \ -+ !SNAP_HAS_COMPAT_FEATURE(inode->i_sb, SNAP_FEATURE_COMPAT_BLOCKCOW))) -+ -+#define SNAP_ERROR(err) ((err) < 0 ? (err) : (-(err))) -+/* SNAP_ERROR(err): Make sure we return negative errors for Linux ( return positive errors) */ -+ -+#ifdef DEBUG -+#ifdef __KERNEL__ -+# ifdef __ia64__ -+# define CDEBUG_STACK (THREAD_SIZE - \ -+ ((unsigned long)__builtin_dwarf_cfa() & \ -+ (THREAD_SIZE - 1))) -+# else -+# define CDEBUG_STACK (THREAD_SIZE - \ -+ ((unsigned long)__builtin_frame_address(0) & \ -+ (THREAD_SIZE - 1))) -+# endif -+ -+#define snap_debug_msg(file, fn, line, stack, format, a...) \ -+ printf("(%s:%s,l. %d %d %lu): " format, file, fn, line, \ -+ getpid() , stack, ## a); -+#endif -+ -+#define CDEBUG(mask, format, a...) \ -+do { \ -+ CHECK_STACK(CDEBUG_STACK); \ -+ if (!(mask) || ((mask) & (D_ERROR | D_EMERG))) \ -+ snap_debug_msg(__FILE__, __FUNCTION__, __LINE__, \ -+ CDEBUG_STACK, format, ## a); \ -+} while (0) -+ -+#define CWARN (format, a...) CDEBUG(D_WARNING, format, ## a) -+#define CERROR(format, a...) CDEBUG(D_ERROR, format, ## a) -+#define CEMERG(format, a...) CDEBUG(D_EMERG, format, ## a) -+ -+#define RETURN(rc) \ -+do { \ -+ typeof(rc) RETURN__ret = (rc); \ -+ CDEBUG(D_TRACE, "Process leaving (rc=%lu : %ld : %lx)\n", \ -+ (long)RETURN__ret, (long)RETURN__ret, (long)RETURN__ret);\ -+ return RETURN__ret; \ -+} while (0) -+ -+#define ENTRY \ -+do { \ -+ CDEBUG(D_TRACE, "Process entered\n"); \ -+} while (0) -+ -+#define EXIT \ -+do { \ -+ CDEBUG(D_TRACE, "Process leaving\n"); \ -+} while(0) -+#else -+#define CDEBUG(mask, format, a...) do { } while (0) -+#define CWARN(format, a...) do { } while (0) -+#define CERROR(format, a...) printk("<3>" format, ## a) -+#define CEMERG(format, a...) printk("<0>" format, ## a) -+#define GOTO(label, rc) do { (void)(rc); goto label; } while (0) -+#define RETURN(rc) return (rc) -+#define ENTRY do { } while (0) -+#define EXIT do { } while (0) -+#endif /*DEBUG*/ -+ -+#define SNAP_ATTR_BUF_CNT 10 -+ -+#define SB_LAST_COWED_INO(sb) (EXT3_SB(sb)->s_es->s_last_cowed_pri_ino) -+#define SB_FIRST_COWED_INO(sb) (EXT3_SB(sb)->s_es->s_first_cowed_pri_ino) -+#define SB_SNAPTABLE_INO(sb) (EXT3_SB(sb)->s_es->s_snaptable_ino) -+#define SB_SNAP_LIST_SEM(sb) (EXT3_SB(sb)->s_snap_list_sem) -+#define SB_FEATURE_COMPAT(sb) (EXT3_SB(sb)->s_es->s_feature_compat) -+ -+#define SNAP_HAS_COMPAT_FEATURE(sb,mask) \ -+ (SB_FEATURE_COMPAT(sb) & cpu_to_le32(mask)) -+ -+/* NOTE: these macros are close dependant on the structure of snap ea */ -+#define SNAP_CNT_FROM_SIZE(size) ((((size)-sizeof(ino_t)*2)/2)/sizeof(ino_t)) -+#define SNAP_EA_SIZE_FROM_INDEX(index) (sizeof(ino_t)*2 + 2*sizeof(ino_t)*((index)+1)) -+ -+#define SNAP_EA_INO_BLOCK_SIZE(size) (((size)-sizeof(ino_t)*2)/2) -+#define SNAP_EA_PARENT_OFFSET(size) (sizeof(ino_t)*2 + SNAP_EA_INO_BLOCK_SIZE((size))) -+/*SET FLAGS*/ -+extern int ext3_bmap(struct address_space *mapping, long block); -+extern int ext3_load_inode_bitmap (struct super_block * sb, unsigned int block_group); -+extern int ext3_block_truncate_page(handle_t *handle, struct address_space *mapping, -+ loff_t from); -+/* helper functions to manipulate field 'parent' in snap_ea */ -+static inline int -+set_parent_ino(struct snap_ea *pea, int size, int index, ino_t val) -+{ -+ char * p = (char*) pea; -+ int offset; -+ -+ offset = sizeof(ino_t)*2 + (size - sizeof(ino_t)*2)/2; -+ offset += sizeof(ino_t) * index; -+ *(ino_t*)(p+offset) = val; -+ -+ return 0; -+} -+/* ext3_iterate_cowed_inode: -+ * iterate all the cowed inode with the same index and -+ * run the associate function @repeat -+ * -+ * For @repeat, if it returns non-zero value, it will exit the iterator -+ * -+ * return value: 0 or positive: success -+ * negative: failure -+ * additional: if the return value is positive, it must be the return value -+ * of function @repeat. -+ */ -+ -+static int ext3_iterate_cowed_inode( -+ struct super_block *sb, -+ int (*repeat)(struct inode *inode, void *priv), -+ struct inode **start, -+ void *priv) -+{ -+ struct inode *list_inode = NULL; -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ int err = 0; -+ -+ if (SB_FIRST_COWED_INO(sb) == 0) { -+ snap_debug("no cowed inode in the list\n"); -+ return 0; -+ } -+ -+ /* get head inode in the list */ -+ if (start != NULL && *start != NULL && (*start)->i_ino) -+ list_inode = iget(sb, (*start)->i_ino); -+ else -+ list_inode = iget (sb, le32_to_cpu( SB_FIRST_COWED_INO(sb) )); -+ -+ /* loop for all inode in list */ -+ while (list_inode) { -+ if (!list_inode->i_nlink || is_bad_inode(list_inode)) { -+ snap_err("inode %p, ino %lu, mode %o, nlink %d\n", -+ list_inode, -+ list_inode->i_ino, -+ list_inode->i_mode, -+ list_inode->i_nlink); -+ err = -EIO; -+ goto err_iput; -+ } -+ -+ err = ext3_xattr_get(list_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_err("inode %lu, error %d\n", list_inode->i_ino, err); -+ goto err_iput; -+ } -+ -+ if ((err = (*repeat)(list_inode, priv)) != 0) -+ goto err_iput; -+ -+ iput (list_inode); -+ -+ snaps = (struct snap_ea *) buf; -+ if (le32_to_cpu (snaps->next_ino) != 0) { -+ list_inode = iget(sb, le32_to_cpu(snaps->next_ino)); -+ } -+ else { -+ snap_debug ("cowed inode list end, exit\n"); -+ goto err_free; -+ } -+ } -+err_iput: -+ if (list_inode) -+ iput(list_inode); -+err_free: -+ return err; -+} -+static int get_cowed_ino(struct inode *pri, void *param) -+{ -+ ino_t *find = param; -+ (*find) = pri->i_ino; -+ return 0; -+} -+ -+/* Return 0 for error. */ -+static int get_cowed_ino_end (struct inode *inode) -+{ -+ int rc; -+ ino_t ino = 0; -+ -+ rc = ext3_iterate_cowed_inode(inode->i_sb, &get_cowed_ino, &inode, &ino); -+ -+ if (rc < 0) -+ return 0; -+ else -+ return ino; -+} -+ -+/* find the end of the primary inode, iterate if needed -+ * return 0 if any error found */ -+static inline ino_t find_last_cowed_ino(struct super_block *sb) -+{ -+ struct inode *inode = NULL; -+ ino_t first, last = 0; -+ -+ last = le32_to_cpu(SB_LAST_COWED_INO(sb)); -+ if (last) -+ return last; -+ -+ first = le32_to_cpu(SB_FIRST_COWED_INO(sb)); -+ -+ if (!first) { -+ snap_err("first cowed inode is NULL\n"); -+ goto exit; -+ } -+ -+ inode = iget(sb, first); -+ if (inode) { -+ if (is_bad_inode(inode)) { -+ snap_err("bad inode %lu\n", first); -+ goto exit; -+ } -+ -+ last = get_cowed_ino_end(inode); -+ } -+exit: -+ if (inode) -+ iput(inode); -+ return last; -+} -+ -+/* Insert the primary inode to the cowed inode list -+ * Append it to the list end -+ * -+ * @pri: inode to insert -+ * @buf_pri: the valid ea buf for @pri inode ( excluding the next_ino field) , -+ * it's used to write the ea for @pri inode -+ * -+ * To avoid list broken in abnormal case, it will first write the ea for @pri -+ * inode, and then write ea for the list end inode. Thus list broken is -+ * avoid even if there are errors when writting ea. -+ */ -+static int insert_cowed_ino_to_list (handle_t *handle, struct inode *pri, char *buf_pri) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ struct snap_ea *snaps_pri; -+ struct inode *last_inode = NULL; -+ struct ext3_sb_info *sbi = EXT3_SB(pri->i_sb); -+ int err = 0; -+ -+ snaps_pri = (struct snap_ea *)buf_pri; -+ -+ if (!SB_FIRST_COWED_INO(pri->i_sb)) { -+ /* we set the next_ino and write ea for pri inode */ -+ snaps_pri->next_ino = cpu_to_le32(0); -+ snaps_pri->prev_ino = cpu_to_le32(0); -+ -+ err = ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf_pri, EXT3_MAX_SNAP_DATA, 0); -+ if (err < 0) { -+ snap_err("ino %lu, set_ext_attr err %d\n", pri->i_ino, err); -+ return err; -+ } -+ lock_super(pri->i_sb); -+ ext3_journal_get_write_access(handle, sbi->s_sbh); -+ sbi->s_es->s_first_cowed_pri_ino = cpu_to_le32(pri->i_ino); -+ SB_FIRST_COWED_INO(pri->i_sb) = cpu_to_le32(pri->i_ino); -+ pri->i_sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, sbi->s_sbh); -+ unlock_super(pri->i_sb); -+ EXT3_I(pri)->i_flags |= EXT3_SNAP_PRI_FLAG; -+ return err; -+ } -+ -+ if (!SB_LAST_COWED_INO(pri->i_sb)){ -+ SB_LAST_COWED_INO(pri->i_sb) = find_last_cowed_ino(pri->i_sb); -+ if (!SB_LAST_COWED_INO(pri->i_sb) ){ -+ snap_err("error, last cowed inode is NULL\n"); -+ return (-EINVAL); -+ } -+ } -+ -+ last_inode = iget(pri->i_sb, SB_LAST_COWED_INO(pri->i_sb)); -+ if (!last_inode || is_bad_inode(last_inode)) { -+ iput(last_inode); -+ return -EINVAL; -+ } -+ err = ext3_xattr_get(last_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err == -ENODATA) { -+ snap_debug("no existing attributes - zeroing\n"); -+ memset(buf, 0, EXT3_MAX_SNAP_DATA); -+ } else if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_debug("got err %d when reading attributes\n", err); -+ goto exit; -+ } -+ /*set primary inode EA*/ -+ snaps_pri->next_ino = 0; -+ snaps_pri->prev_ino = cpu_to_le32(last_inode->i_ino); -+ -+ err = ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf_pri, EXT3_MAX_SNAP_DATA, 0); -+ if (err < 0) { -+ snap_debug("set attributes error for inode %lu\n", -+ (ulong)pri->i_ino); -+ goto exit; -+ } -+ -+ /*set last inode EA*/ -+ snaps = (struct snap_ea *) buf; -+ snaps->next_ino = cpu_to_le32(pri->i_ino); -+ err = ext3_xattr_set(handle, last_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA, 0); -+ if(err < 0){ -+ snap_debug("set attributes error for inode %lu\n", -+ (ulong)last_inode->i_ino); -+ goto exit; -+ } -+ -+ EXT3_I(pri)->i_flags |= EXT3_SNAP_PRI_FLAG; -+ -+ /* we update the new cowed ino list end in memory */ -+ SB_LAST_COWED_INO(pri->i_sb) = cpu_to_le32(pri->i_ino); -+ snap_debug("cowed_inode_list_end %lu, append ino=%lu\n", -+ last_inode->i_ino, pri->i_ino); -+exit: -+ if (last_inode) -+ iput(last_inode); -+ -+ return err; -+} -+ -+/* delelte the ino from cowed inode list */ -+static int delete_cowed_ino_from_list (handle_t *handle, struct inode *inode) -+{ -+ ino_t prev_ino = 0, next_ino = 0; -+ struct inode *prev_inode = NULL; -+ struct inode *next_inode = NULL; -+ struct snap_ea *snaps; -+ char buf[EXT3_MAX_SNAP_DATA]; -+ int err = 0; -+ -+ err = ext3_xattr_get(inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_err("get attr inode %lu, error %d\n", inode->i_ino, err); -+ goto err_exit; -+ } -+ -+ snaps = (struct snap_ea *) buf; -+ next_ino = le32_to_cpu(snaps->next_ino); -+ prev_ino = le32_to_cpu(snaps->prev_ino); -+ -+ /* if this is the first cowed ino */ -+ if (inode->i_ino == le32_to_cpu(SB_FIRST_COWED_INO(inode->i_sb))) { -+ SB_FIRST_COWED_INO(inode->i_sb) = cpu_to_le32(next_ino); -+ EXT3_I(inode)->i_flags &= ~EXT3_SNAP_PRI_FLAG; -+ if (next_ino == 0) -+ SB_LAST_COWED_INO(inode->i_sb) = 0; -+ } else { -+ if (!prev_ino) -+ goto err_exit; -+ -+ /* find previous inode and read its ea */ -+ prev_inode = iget(inode->i_sb, prev_ino); -+ if (!prev_inode || is_bad_inode(prev_inode)) -+ goto err_exit; -+ -+ err = ext3_xattr_get(prev_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_err("get attr inode %lu, error %d\n", prev_inode->i_ino, err); -+ goto err_exit; -+ } -+ -+ /* make the previous inode point to the next inode, -+ * but ignore errors because at current version we -+ * didn't use the previous pionter */ -+ snaps = (struct snap_ea *) buf; -+ snaps->next_ino = cpu_to_le32(next_ino); -+ -+ snap_debug("delete ino %lu from list\n", inode->i_ino); -+ -+ err = ext3_xattr_set(handle, prev_inode, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, buf, EXT3_MAX_SNAP_DATA, 0); -+ if (err < 0) { -+ snap_err("err %d setting ea for ino %lu\n", err, prev_inode->i_ino); -+ goto err_exit; -+ } -+ -+ if (next_ino == 0) { -+ SB_LAST_COWED_INO(inode->i_sb) = prev_ino; -+ goto err_exit; -+ } -+ -+ /* make the next inode point to the previous one */ -+ next_inode = iget(inode->i_sb, next_ino); -+ if (!next_inode || is_bad_inode(next_inode)) -+ goto err_exit; -+ -+ err = ext3_xattr_get(next_inode, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ snap_err("set attr inode %lu, error %d\n", next_inode->i_ino, err); -+ goto err_exit; -+ } -+ snaps = ( struct snap_ea *) buf; -+ snaps->prev_ino = cpu_to_le32(prev_ino); -+ -+ err = ext3_xattr_set(handle, next_inode, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, buf, EXT3_MAX_SNAP_DATA, 0); -+ if (err < 0) { -+ snap_err("err %d setting attributes for ino %lu\n", -+ err, next_inode->i_ino); -+ } -+ } -+err_exit: -+ iput(prev_inode); -+ iput(next_inode); -+ return err; -+} -+ -+static inline void lock_list(struct super_block *sb) -+{ -+ down(&SB_SNAP_LIST_SEM(sb)); -+} -+ -+static inline void unlock_list(struct super_block *sb) -+{ -+ up(&SB_SNAP_LIST_SEM(sb)); -+} -+ -+static int ext3_snap_feature (struct super_block *sb, int feature, int op) { -+ -+ int rc = -EINVAL; -+ handle_t *handle; -+ switch (op) { -+ case SNAP_SET_FEATURE: -+ handle = ext3_journal_start(sb->s_root->d_inode, 1); -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+ SB_FEATURE_COMPAT(sb) |= cpu_to_le32(feature); -+ sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ unlock_super(sb); -+ ext3_journal_stop(handle, sb->s_root->d_inode); -+ break; -+ case SNAP_CLEAR_FEATURE: -+ handle = ext3_journal_start(sb->s_root->d_inode, 1); -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, EXT3_SB(sb)->s_sbh); -+ SB_FEATURE_COMPAT(sb) &= ~cpu_to_le32(feature); -+ ext3_journal_dirty_metadata(handle, EXT3_SB(sb)->s_sbh); -+ sb->s_dirt = 1; -+ unlock_super(sb); -+ ext3_journal_stop(handle, sb->s_root->d_inode); -+ break; -+ case SNAP_HAS_FEATURE: -+ /*FIXME should lock super or not*/ -+ rc = SNAP_HAS_COMPAT_FEATURE(sb, feature); -+ break; -+ default: -+ break; -+ } -+ return rc; -+} -+ -+#ifdef _DEVICE_FAIL_TEST -+/*FIXME later*/ -+extern int loop_discard_io(kdev_t dev, long arg); -+/* -+ * modify failpos to let loop fail at certain point -+ * let pos=0 mean no fail point -+ */ -+static int failpos = 0; -+#define loopfail(pos) \ -+ do{ \ -+ if( pos == failpos ){ \ -+ int i; \ -+ printk(KERN_EMERG "SNAP; hit fail point %d\n", failpos);\ -+ for( i=0; i<15; i++ ) \ -+ loop_discard_io( MKDEV(7,i), 1 ); \ -+ } \ -+ }while(0) -+#else -+#define loopfail(pos) do{}while(0) -+#endif -+ -+/* Save the indirect inode in the snapshot table of the primary inode. */ -+static int ext3_set_indirect(struct inode *pri, int index, ino_t ind_ino, ino_t parent_ino ) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ int err = 0, inlist = 1; -+ int ea_size; -+ handle_t *handle = NULL; -+ -+ snap_debug("(ino %lu, parent %lu): saving ind %lu to index %d\n", -+ pri->i_ino, parent_ino, ind_ino, index); -+ -+ if (index < 0 || index > MAX_SNAPS || !pri) -+ return -EINVAL; -+ /* need lock the list before get_attr() to avoid race */ -+ lock_list(pri->i_sb); -+ /* read ea at first */ -+ err = ext3_xattr_get(pri, EXT3_SNAP_INDEX ,EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err == -ENODATA || err == -ENOATTR) { -+ snap_debug("no extended attributes - zeroing\n"); -+ memset(buf, 0, EXT3_MAX_SNAP_DATA); -+ /* XXX -+ * To judge a inode in list, we only see if it has snap ea. -+ * So take care of snap ea of primary inodes very carefully. -+ * Is it right in snapfs EXT3, check it later? -+ */ -+ inlist = 0; -+ } else if (err < 0 || err > EXT3_MAX_SNAP_DATA) { -+ goto out_unlock; -+ } -+ -+ handle = ext3_journal_start(pri, SNAP_SETIND_TRANS_BLOCKS); -+ if(!handle) { -+ err = PTR_ERR(handle); -+ goto out_unlock; -+ } -+ -+ snaps = (struct snap_ea *)buf; -+ snaps->ino[index] = cpu_to_le32 (ind_ino); -+ ea_size = EXT3_MAX_SNAP_DATA; -+ -+ set_parent_ino(snaps, ea_size, index, cpu_to_le32(parent_ino)); -+ -+ snap_debug("saving attributes\n"); -+ -+ if (inlist) { -+ err = ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA, 0); -+ } -+ else { -+ /* This will also write the ea for the pri inode, like above */ -+ err = insert_cowed_ino_to_list(handle, pri, buf); -+ } -+ ext3_mark_inode_dirty(handle, pri); -+ ext3_journal_stop(handle, pri); -+out_unlock: -+ unlock_list(pri->i_sb); -+ return err; -+} -+ -+/* -+ * is_redirector - determines if a primary inode is a redirector -+ * @inode: primary inode to test -+ * -+ * Returns 1 if the inode is a redirector, 0 otherwise. -+ */ -+static int is_redirector(struct inode *inode) -+{ -+ int is_redirector = 0; -+ int rc; -+ -+ rc = ext3_xattr_get(inode, EXT3_SNAP_INDEX ,EXT3_SNAP_ATTR, -+ NULL, 0); -+ if (rc > 0 && rc <= MAX_SNAP_DATA) -+ is_redirector = 1; -+ snap_debug("inode %lu %s redirector\n", inode->i_ino, -+ is_redirector ? "is" : "isn't"); -+ return is_redirector; -+} -+ -+/*if it's indirect inode or not */ -+static int is_indirect(struct inode *inode) -+{ -+ if (EXT3_I(inode)->i_flags |= EXT3_COW_FL) -+ return 1; -+ else -+ return 0; -+} -+/* -+ * Copy inode metadata from one inode to another, excluding blocks and size. -+ * FIXME do we copy EA data - ACLs and such (excluding snapshot data)? -+ */ -+static void ext3_copy_meta(handle_t *handle, struct inode *dst, struct inode *src) -+{ -+ int size; -+ -+ dst->i_mode = src->i_mode; -+ dst->i_nlink = src->i_nlink; -+ dst->i_uid = src->i_uid; -+ dst->i_gid = src->i_gid; -+ dst->i_atime = src->i_atime; -+ dst->i_mtime = src->i_mtime; -+ dst->i_ctime = src->i_ctime; -+// dst->i_version = src->i_version; -+ dst->i_attr_flags = src->i_attr_flags; -+ dst->i_generation = src->i_generation; -+ dst->u.ext3_i.i_dtime = src->u.ext3_i.i_dtime; -+ dst->u.ext3_i.i_flags = src->u.ext3_i.i_flags | EXT3_COW_FL; -+#ifdef EXT3_FRAGMENTS -+ dst->u.ext3_i.i_faddr = src->u.ext3_i.i_faddr; -+ dst->u.ext3_i.i_frag_no = src->u.ext3_i.i_frag_no; -+ dst->u.ext3_i.i_frag_size = src->u.ext3_i.i_frag_size; -+#endif -+ if ((size = ext3_xattr_list(src, NULL, 0)) > 0) { -+ char names[size]; -+ char *name; -+ int namelen; -+ -+ if (ext3_xattr_list(src, names, 0) < 0) -+ return; -+ /* -+ * the list of attribute names are stored as NUL terminated -+ * strings, with a double NUL string at the end. -+ */ -+ name = names; -+ while ((namelen = strlen(name))) { -+ int attrlen; -+ char *buf; -+ -+ /* don't copy snap data */ -+ if (!strcmp(name, EXT3_SNAP_ATTR)) { -+ snap_debug("skipping %s item\n", name); -+ continue; -+ } -+ snap_debug("copying %s item\n", name); -+ attrlen = ext3_xattr_get(src, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, NULL, 0); -+ if (attrlen < 0) -+ continue; -+ if ((buf = kmalloc(attrlen, GFP_ATOMIC)) == NULL) -+ break; -+ if (ext3_xattr_get(src, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, buf, attrlen) < 0) -+ continue; -+ if (ext3_xattr_set(handle, dst, EXT3_SNAP_INDEX, -+ EXT3_SNAP_ATTR, buf, attrlen, 0) < 0) -+ break; -+ kfree(buf); -+ name += namelen + 1; /* skip name and trailing NUL */ -+ } -+ } -+} -+ -+static inline int ext3_has_ea(struct inode *inode) -+{ -+ return (EXT3_I(inode)->i_file_acl != 0); -+} -+/* XXX This function has a very bad effect to -+ * the performance of filesystem, -+ * will find another way to fix it -+ */ -+static void fs_flushinval_pages(handle_t *handle, struct inode* inode) -+{ -+ if (inode->i_blocks > 0 && inode->i_mapping) { -+ fsync_inode_data_buffers(inode); -+ // ext3_block_truncate_page(handle, inode->i_mapping, inode->i_size); -+ truncate_inode_pages(inode->i_mapping, 0); -+ } -+} -+ -+/* ext3_migrate_data2: -+ * MOVE all the data blocks from inode src to inode dst as well as -+ * COPY all attributes(meta data) from inode src to inode dst. -+ * For extended attributes(EA), we COPY all the EAs but skip the Snap EA from src to dst. -+ * If the dst has Snap EA, then we CAN'T overwrite it. We CAN'T copy the src Snap EA. -+ * XXX for EA, can we change it to MOVE all the EAs(exclude Snap EA) to dst and copy it back to src ? -+ * This is for LAN free backup later. -+ */ -+ -+static int ext3_migrate_data (handle_t *handle, struct inode *dst, struct inode *src) -+{ -+ unsigned long err = 0; -+ /* 512 byte disk blocks per inode block */ -+ int bpib = src->i_sb->s_blocksize >> 9; -+ -+ if((!dst) || (!src)) -+ return -EINVAL; -+ -+ if (dst->i_ino == src->i_ino) -+ return 0; -+ -+ fs_flushinval_pages(handle, src); -+ -+ ext3_copy_meta(handle, dst, src); -+ -+ snap_debug("migrating data blocks from %lu to %lu\n", src->i_ino, dst->i_ino); -+ /* Can't check blocks in case of EAs */ -+ memcpy(EXT3_I(dst)->i_data, EXT3_I(src)->i_data, -+ sizeof(EXT3_I(src)->i_data)); -+ memset(EXT3_I(src)->i_data, 0, sizeof(EXT3_I(src)->i_data)); -+ -+ ext3_discard_prealloc(src); -+ -+ dst->i_size = EXT3_I(dst)->i_disksize = EXT3_I(src)->i_disksize; -+ src->i_size = EXT3_I(src)->i_disksize = 0; -+ -+ dst->i_blocks = src->i_blocks; -+ src->i_blocks = 0; -+ /* Check EA blocks here to modify i_blocks correctly */ -+ if(ext3_has_ea (src)) { -+ src->i_blocks += bpib; -+ if( ! ext3_has_ea (dst) ) -+ if( dst->i_blocks >= bpib ) -+ dst->i_blocks -= bpib; -+ } else { -+ if( ext3_has_ea (dst)) -+ dst->i_blocks += bpib; -+ } -+ -+ snap_debug("migrate data from ino %lu to ino %lu\n", -+ src->i_ino, dst->i_ino); -+ ext3_mark_inode_dirty(handle, src); -+ ext3_mark_inode_dirty(handle, dst); -+ -+ -+ return SNAP_ERROR(err); -+} -+ -+/** -+ * ext3_get_indirect - get a specific indirect inode from a primary inode -+ * @primary: primary (direct) inode -+ * @table: table of @slot + 1 indices in reverse chronological order -+ * @slot: starting slot number to check for indirect inode number -+ * -+ * We locate an indirect inode from a primary inode using the redirection -+ * table stored in the primary inode. Because the desired inode may actually -+ * be in a "newer" slot number than the supplied slot, we are given a table -+ * of indices in chronological order to search for the correct inode number. -+ * We walk table from @slot to 0 looking for a non-zero inode to load. -+ * -+ * To only load a specific index (and fail if it does not exist), you can -+ * pass @table = NULL, and the index number in @slot. If @slot == 0, the -+ * primary inode data is returned. -+ * -+ * We return a pointer to an inode, or an error. If the indirect inode for -+ * the given index does not exist, NULL is returned. -+ */ -+static struct inode *ext3_get_indirect(struct inode *primary, int *table, -+ int slot) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ ino_t ino; -+ struct inode *inode = NULL; -+ int err = 0, index = 0; -+ -+ if (slot < 0 || slot > EXT3_MAX_SNAPS || !primary) -+ return NULL; -+ -+ snap_debug("ino %lu, table %p, slot %d\n", primary->i_ino, table,slot); -+ -+ err = ext3_xattr_get(primary, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err == -ENODATA) { -+ slot = 0; -+ } else if (err < 0) { -+ snap_debug(" attribute read error\n"); -+ return NULL; -+ } -+ snaps = (struct snap_ea *)buf; -+ -+ /* if table is NULL and there is a slot */ -+ if( !table && slot ) { -+ index = slot; -+ ino = le32_to_cpu ( snaps->ino[index] ); -+ if(ino) inode = iget(primary->i_sb, ino); -+ goto err_free; -+ } -+ /* if table is not NULL */ -+ while ( !inode && slot > 0) { -+ index = table[slot]; -+ ino = le32_to_cpu ( snaps->ino[index] ); -+ -+ snap_debug("snap inode at slot %d is %lu\n", slot, ino); -+ if (!ino) { -+ --slot; -+ continue; -+ } -+ inode = iget(primary->i_sb, ino); -+ goto err_free; -+ } -+ if( slot == 0 && table ) { -+ snap_debug("redirector not found, using primary\n"); -+ inode = iget(primary->i_sb, primary->i_ino); -+ } -+err_free: -+ return inode; -+} -+ -+/* get the indirect ino at index of the primary inode -+ * return value: postive: indirect ino number -+ * negative or 0: error -+ */ -+static ino_t ext3_get_indirect_ino(struct inode *primary, int index) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ ino_t ino = 0; -+ int err; -+ -+ if (index < 0 || index > EXT3_MAX_SNAPS || !primary) -+ return 0; -+ -+ err = ext3_xattr_get(primary, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err == -ENOATTR) { -+ ino = -ENOATTR; -+ goto err_free; -+ } else if (err < 0) { -+ snap_err(EXT3_SNAP_ATTR " attribute read error\n"); -+ ino = -EINVAL; -+ goto err_free; -+ } -+ -+ snaps = (struct snap_ea *)buf; -+ ino = le32_to_cpu (snaps->ino[index]); -+ snap_debug("snap ino for %ld at index %d is %lu\n", -+ primary->i_ino, index, ino); -+err_free: -+ return ino; -+} -+/* ext3_copy_block - copy one data block from inode @src to @dst. -+ No lock here. User should do the lock. -+ User should check the return value to see if the result is correct. -+ Return value: -+ 1: The block has been copied successfully -+ 0: No block is copied, usually this is because src has no such blk -+ -1: Error -+*/ -+ -+static int ext3_copy_block (struct inode *dst, struct inode *src, int blk) -+{ -+ struct buffer_head *bh_dst = NULL, *bh_src = NULL; -+ int err = 0; -+ handle_t *handle = NULL; -+ -+ -+ snap_debug("copy blk %d from %lu to %lu \n", blk, src->i_ino, dst->i_ino); -+ /* -+ * ext3_getblk() require handle!=NULL -+ */ -+ if (S_ISREG(src->i_mode)) -+ return 0; -+ -+ handle = ext3_journal_start(dst, SNAP_COPYBLOCK_TRANS_BLOCKS); -+ if( !handle ) -+ return -1; -+ -+ bh_src = ext3_bread(handle, src, blk, 0, &err); -+ if (!bh_src) { -+ snap_err("error for src blk %d, error %d\n", blk, err); -+ goto exit_relese; -+ } -+ bh_dst = ext3_getblk(handle, dst, blk, 1, &err); -+ if (!bh_dst) { -+ snap_err("error for dst blk %d, error %d\n", blk, err); -+ err = -ENOSPC; -+ goto exit_relese; -+ } -+ snap_debug("copy block %lu to %lu (%ld bytes)\n", -+ bh_src->b_blocknr, bh_dst->b_blocknr, -+ src->i_sb->s_blocksize); -+ -+ ext3_journal_get_write_access(handle, bh_dst); -+ -+ memcpy(bh_dst->b_data, bh_src->b_data, src->i_sb->s_blocksize); -+ -+ ext3_journal_dirty_metadata(handle, bh_dst); -+ err = 1; -+exit_relese: -+ if (bh_src) brelse(bh_src); -+ if (bh_dst) brelse(bh_dst); -+ if (handle) -+ ext3_journal_stop(handle, dst); -+ return err; -+} -+ -+#ifdef EXT3_ENABLE_SNAP_ORPHAN -+/* -+ * add one inode to superblock's snap_orphan chain -+ * only add on-disk data for simplicity -+ */ -+static void add_snap_orphan(handle_t *handle, struct inode *pri, struct inode *ind) -+{ -+ struct ext3_sb_info *sb = &pri->i_sb->u.ext3_sb; -+ struct ext3_iloc iloc; -+ -+ if( ext3_get_inode_loc(ind, &iloc) ){ -+ snap_debug("--- get ind loc fail\n"); -+ brelse(iloc.bh); -+ return; -+ } -+ -+ snap_debug("add new ind inode %lu into orphan list," -+ " primary %lu, last orphan %u\n", -+ ind->i_ino, pri->i_ino, -+ sb->s_es->s_last_snap_orphan); -+ lock_super(pri->i_sb); -+ iloc.raw_inode->i_next_snap_orphan = sb->s_es->s_last_snap_orphan; -+ iloc.raw_inode->i_snap_primary = pri->i_ino; -+ ext3_mark_inode_dirty(handle, ind); -+ -+ ext3_journal_get_write_access(handle, sb->s_sbh); -+ sb->s_es->s_last_snap_orphan = ind->i_ino; -+ pri->i_sb->s_dirt = 1; -+ ext3_journal_dirty_metadata(handle, sb->s_sbh); -+ unlock_super(pri->i_sb); -+ brelse(iloc.bh); -+} -+ -+/* -+ * counterpart of add_snap_orphan -+ */ -+static void remove_snap_orphan(handle_t *handle, struct inode *ind) -+{ -+ struct ext3_sb_info *sb = &ind->i_sb->u.ext3_sb; -+ struct inode *pre = NULL, *inode = NULL; -+ struct ext3_iloc iloc, pre_iloc; -+ ino_t ino; -+ -+ lock_super(ind->i_sb); -+ for(ino = sb->s_es->s_last_snap_orphan; ino; ){ -+ snap_debug("found an orphan, ino=%lu\n", ino); -+ inode = iget( ind->i_sb, ino ); -+ if( !inode ){ -+ snap_debug("iget %lu fail\n", ino); -+ break; -+ } -+ if( ext3_get_inode_loc(inode, &iloc) ){ -+ snap_debug("get_inode_loc %lu fail\n", ino); -+ break; -+ } -+ if( ino == ind->i_ino ){ -+ if( !pre ){ -+ snap_debug("found at head of orphan chain\n"); -+ ext3_journal_get_write_access(handle, sb->s_sbh); -+ sb->s_es->s_last_snap_orphan = -+ iloc.raw_inode->i_next_snap_orphan; -+ ext3_journal_dirty_metadata(handle, sb->s_sbh); -+ snap_debug("set new last orphan: %u\n", -+ sb->s_es->s_last_snap_orphan); -+ break; -+ } -+ else { -+ snap_debug("found in middle of orphan chain\n"); -+ if( ext3_get_inode_loc(pre, &pre_iloc) ){ -+ snap_err("get pre_inode loc %lu fail\n", pre->i_ino); -+ break; -+ } -+ pre_iloc.raw_inode->i_next_snap_orphan = -+ iloc.raw_inode->i_next_snap_orphan; -+ ext3_mark_inode_dirty(handle, pre); -+ brelse(pre_iloc.bh); -+ break; -+ } -+ } -+ iput(pre); -+ pre = inode; -+ ino = iloc.raw_inode->i_next_snap_orphan; -+ brelse(iloc.bh); -+ } -+ iput(pre); -+ iput(inode); -+ unlock_super(ind->i_sb); -+ brelse(iloc.bh); -+} -+ -+/* -+ * FIXME: how about crashs again during recovery? -+ */ -+void snap_orphan_cleanup(struct super_block *sb) -+{ -+ ino_t ind_ino, pri_ino; -+ struct inode *ind = NULL, *pri = NULL; -+ struct ext3_iloc ind_iloc; -+ -+ if( (ind_ino = sb->u.ext3_sb.s_es->s_last_snap_orphan) == 0 ){ -+ snap_debug("snap_orphan_cleanup: nothing to do\n"); -+ return; -+ } -+ -+ snap_debug("------ begin cleanup snap orphans ------\n"); -+ do{ -+ ind = iget( sb, ind_ino ); -+ if( !ind ){ -+ snap_err("snap_orphan_cleanup: get " -+ "ind %lu fail\n", ind_ino); -+ break; -+ } -+ -+ if( ext3_get_inode_loc(ind, &ind_iloc) ){ -+ snap_err("snap_orphan_cleanup: get " -+ "iloc %lu fail\n", ind_ino); -+ iput( ind ); -+ break; -+ } -+ -+ ind_ino = sb->u.ext3_sb.s_es->s_last_snap_orphan = -+ ind_iloc.raw_inode->i_next_snap_orphan; -+ pri_ino = ind_iloc.raw_inode->i_snap_primary; -+ -+ pri = iget( sb, pri_ino ); -+ if( !pri ){ -+ snap_err("snap_orphan_cleanup: get primary " -+ "%lu fail\n", pri_ino); -+ iput( ind ); -+ }else -+ restore_snap_inode(pri, ind); -+ }while( ind_ino ); -+ snap_debug("------ end cleanup snap orphans ------\n"); -+ -+ sb->u.ext3_sb.s_es->s_last_snap_orphan = 0; -+ sb->s_dirt = 1; -+} -+#endif -+/* -+ * reserse operation of set_indirect() -+ * we should determine whether we had put pri into primary inode chain, -+ * if not, don't touch it -+ */ -+static void unset_indirect(handle_t *handle, struct inode *pri, struct inode *ind) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ int err, alone=1, index, found; -+ -+ snap_debug("pri %lu, ind %lu\n", pri->i_ino, ind->i_ino); -+ err = ext3_xattr_get(pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, buf, -+ EXT3_MAX_SNAP_DATA); -+ if ( err < 0 ) { -+ if( err == -ENOATTR ){ -+ snap_debug("primary inode has not EA\n"); -+ } -+ else{ -+ snap_debug("get EA error on primary inode," -+ "returned value %d\n", err); -+ } -+ goto exit; -+ } -+ -+ /* find ind's item in the ea */ -+ snaps = (struct snap_ea*)buf; -+ for(index=EXT3_MAX_SNAPS-1, found=-1; index>=0; index--) { -+ if( snaps->ino[index] == ind->i_ino ) -+ found = index; -+ else if( snaps->ino[index] ) -+ alone = 0; -+ } -+ -+ if(found >= 0) { -+ snap_debug("remove from primary inode's EA\n"); -+ snaps->ino[found] = 0; -+ snaps->parent_ino[found] = 0; -+ ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA, 0); -+ if(alone) { -+ snap_debug("delete from primary inodes chain\n"); -+ lock_list(pri->i_sb); -+ delete_cowed_ino_from_list(handle, pri); -+ unlock_list(pri->i_sb); -+ } -+ }else{ -+ snap_debug("didn't found ind in pri's EA, do nothing\n"); -+ } -+ -+exit: -+ return; -+} -+ -+ -+/* -+ * restore all data in @ind to @pri after free data blocks of @pri. -+ * then release @ind -+ */ -+static void restore_snap_inode(struct inode *pri, struct inode *ind) -+{ -+ handle_t *handle; -+ struct inode *tmp; -+ -+ snap_debug("restore from indirect %lu to primary %lu\n", -+ ind->i_ino, pri->i_ino); -+ -+ handle = ext3_journal_start(pri, SNAP_RESTOREORPHAN_TRANS_BLOCKS); -+ if( !handle ) -+ return; -+ -+ /* first: taken from pri's ea, or from fs-wide primary inode chain */ -+ unset_indirect(handle, pri, ind); -+ -+ /* second: throw out half-copied data in pri */ -+ if( pri->i_blocks ){ -+ tmp = ext3_new_inode(handle, pri, (int)pri->i_mode, 0); -+ if( !tmp ){ -+ snap_debug("ext3_new_inode error\n"); -+ goto exit; -+ } -+ -+ ext3_migrate_data(handle, tmp, pri); -+ snap_debug("freeing half-copied %lu blocks\n", tmp->i_blocks ); -+ tmp->i_nlink = 0; -+ iput( tmp ); -+ } -+ -+ /* third: restore ind inode to pri inode */ -+ snap_debug("restore %lu blocks to primary inode %lu\n", -+ ind->i_blocks, pri->i_ino); -+ ext3_migrate_data(handle, pri, ind); -+ -+ /* final: delete ind inode */ -+ ind->i_nlink = 0; -+ iput( ind ); -+ iput( pri ); -+ -+exit: -+ ext3_journal_stop(handle, pri); -+} -+ -+static handle_t * ext3_copy_data(handle_t *handle, struct inode *dst, -+ struct inode *src, int *has_orphan) -+{ -+ unsigned long blocks, blk, cur_blks; -+ int low_credits, save_ref; -+ -+ blocks =(src->i_size + src->i_sb->s_blocksize-1) >> -+ src->i_sb->s_blocksize_bits; -+ low_credits = handle->h_buffer_credits - SNAP_BIGCOPY_TRANS_BLOCKS; -+ -+ snap_debug("%lu blocks need to be copied," -+ "low credits limit %d\n", blocks, low_credits); -+ for (blk = 0, cur_blks= dst->i_blocks; blk < blocks; blk++) { -+ if (!ext3_bmap(src->i_mapping, blk)) -+ continue; -+ if(handle->h_buffer_credits <= low_credits) { -+ int needed = (blocks - blk) * EXT3_DATA_TRANS_BLOCKS; -+ if (needed > 4 * SNAP_COPYBLOCK_TRANS_BLOCKS) -+ needed = 4 * SNAP_COPYBLOCK_TRANS_BLOCKS; -+ if (journal_extend(handle, needed)) { -+ snap_debug("create_indirect:fail to extend " -+ "journal, restart trans\n"); -+ loopfail( 3 ); -+ if(!*has_orphan) { -+ snap_debug("add orphan ino %lu nlink %d to orphan list \n", -+ dst->i_ino, dst->i_nlink); -+#ifdef EXT3_ENABLE_SNAP_ORPHAN -+ add_snap_orphan(handle, dst, src); -+#else -+ ext3_orphan_add(handle, dst); -+#endif -+ *has_orphan = 1; -+ } -+ dst->u.ext3_i.i_disksize = -+ blk * dst->i_sb->s_blocksize; -+ dst->i_blocks = cur_blks; -+ dst->i_mtime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, dst); -+ -+ /* -+ * We can be sure the last handle was stoped -+ * ONLY if the handle's reference count is 1 -+ */ -+ save_ref = handle->h_ref; -+ handle->h_ref = 1; -+ if( ext3_journal_stop(handle, dst) ){ -+ snap_err("fail to stop journal\n"); -+ handle = NULL; -+ break; -+ } -+ loopfail ( 4 ); -+ handle = ext3_journal_start(dst, -+ low_credits + needed); -+ if( !handle ){ -+ snap_err("fail to restart handle\n"); -+ break; -+ } -+ handle->h_ref = save_ref; -+ } -+ } -+ if (ext3_copy_block( dst, src, blk) < 0 ) -+ break; -+ cur_blks += dst->i_sb->s_blocksize / 512; -+ } -+ dst->i_size = dst->u.ext3_i.i_disksize = src->i_size; -+ -+ return handle; -+} -+ -+static int ext3_set_generation(struct inode *inode, unsigned long gen) -+{ -+ handle_t *handle; -+ int err; -+ -+ handle = ext3_journal_start(inode, EXT3_XATTR_TRANS_BLOCKS); -+ -+ err = ext3_xattr_set(handle, inode, EXT3_SNAP_INDEX, EXT3_SNAP_GENERATION_ATTR, -+ (char*)&gen, sizeof(int), 0); -+ if (err < 0) { -+ snap_err("ino %lu, set_ext_attr err %d\n", inode->i_ino, err); -+ return err; -+ } -+ -+ ext3_journal_stop(handle, inode); -+ return 0; -+} -+ -+static int ext3_get_generation(struct inode *inode) -+{ -+ int err, gen; -+ -+ err = ext3_xattr_get(inode, EXT3_SNAP_INDEX, EXT3_SNAP_GENERATION_ATTR, -+ (char*)&gen, sizeof(gen)); -+ if (err < 0) { -+ if (err == -ENODATA) { -+ return 0; -+ } else { -+ snap_err("can not get generation from %lu \n", inode->i_ino); -+ return err; -+ } -+ } -+ return gen; -+} -+/** -+ * ext3_create_indirect - copy data, attributes from primary to new indir inode -+ * @pri: primary (source) inode -+ * @index: index in snapshot table where indirect inode should be stored -+ * @delete: flag that the primary inode is being deleted -+ * -+ * We copy all of the data blocks from the @*src inode to the @*dst inode, as -+ * well as copying the attributes from @*src to @*dst. If @delete == 1, then -+ * the primary inode will only be a redirector and will appear deleted. -+ * -+ * FIXME do we move EAs, only non-snap EAs, what? -+ * FIXME we could do readpage/writepage, but we would have to handle block -+ * allocation then, and it ruins sparse files for 1k/2k filesystems, -+ * at the expense of doing a memcpy. -+ */ -+ -+static struct inode *ext3_create_indirect( -+ struct inode *pri, -+ int index, -+ unsigned int gen, -+ ino_t parent_ino, -+ int del) -+{ -+ struct inode *ind; -+ handle_t *handle = NULL; -+ int err = 0; -+ int has_orphan = 0; -+ -+ if( pri == pri->i_sb->u.ext3_sb.s_journal_inode ){ -+ printk( KERN_EMERG "TRY TO COW JOUNRAL\n"); -+ return NULL; -+ } -+ snap_debug("creating indirect inode for %lu at index %d, %s pri\n", -+ pri->i_ino, index, del ? "deleting" : "preserve"); -+ -+ ind = ext3_get_indirect(pri, NULL, index); -+ -+ loopfail( 1 ); -+ -+ handle = ext3_journal_start(pri, SNAP_CREATEIND_TRANS_BLOCKS); -+ if( !handle ) -+ return NULL; -+ /* XXX ? We should pass an err argument to get_indirect and precisely -+ * detect the errors, for some errors, we should exit right away. -+ */ -+ -+ /* if the option is SNAP_DEL_PRI_WITH_IND and there is an indirect, -+ * we just free the primary data blocks and mark this inode delete -+ */ -+ if((del) && ind && !IS_ERR(ind)) { -+ struct inode *tmp; -+ /* for directory, we don't free the data blocks, -+ * or ext3_rmdir will report errors "bad dir, no data blocks" -+ */ -+ snap_debug("del==SNAP_DEL_PRI_WITH_IND && ind\n"); -+ if(!S_ISDIR(pri->i_mode)) { -+ /*Here delete the data of that pri inode. -+ * FIXME later, should throw the blocks of -+ * primary inode directly -+ */ -+ tmp = ext3_new_inode(handle, pri, (int)pri->i_mode, 0); -+ if(tmp) { -+ down(&tmp->i_sem); -+ ext3_migrate_data(handle, tmp, pri); -+ up(&tmp->i_sem); -+ tmp->i_nlink = 0; -+ iput(tmp); -+ } -+ else -+ snap_err("ext3_new_inode error\n"); -+ -+ pri->i_nlink = 1; -+ } -+ -+ pri->u.ext3_i.i_dtime = CURRENT_TIME; -+ ext3_mark_inode_dirty(handle, pri); -+ err = 0; -+ goto exit; -+ } -+ -+ if (ind && !IS_ERR(ind)) { -+ snap_debug("existing indirect ino %lu for %lu: index %d\n", -+ ind->i_ino, pri->i_ino, index); -+ err = 0; -+ goto exit; -+ } -+ /* XXX: check this, ext3_new_inode, the first arg should be "dir" */ -+ ind = ext3_new_inode(handle, pri, (int)pri->i_mode, 0); -+ if (!ind) -+ goto exit; -+ -+ loopfail( 2 ); -+ -+ snap_debug("got new inode %lu\n", ind->i_ino); -+ ind->i_rdev = pri->i_rdev; -+ ind->i_op = pri->i_op; -+ ext3_set_generation(ind, (unsigned long)gen); -+ /* If we are deleting the primary inode, we want to ensure that it is -+ * written to disk with a non-zero link count, otherwise the next iget -+ * and iput will mark the inode as free (which we don't want, we want -+ * it to stay a redirector). We fix this in ext3_destroy_indirect() -+ * when the last indirect inode is removed. -+ * -+ * We then do what ext3_delete_inode() does so that the metadata will -+ * appear the same as a deleted inode, and we can detect it later. -+ */ -+ if (del) { -+ snap_debug("deleting primary inode\n"); -+ -+ down(&ind->i_sem); -+ err = ext3_migrate_data(handle, ind, pri); -+ if (err) -+ goto exit_unlock; -+ -+ err = ext3_set_indirect(pri, index, ind->i_ino, parent_ino); -+ if (err) -+ goto exit_unlock; -+ -+ /* XXX for directory, we copy the block back -+ * or ext3_rmdir will report errors "bad dir, no data blocks" -+ */ -+ if( S_ISDIR(pri->i_mode)) { -+ handle = ext3_copy_data(handle, pri, ind, &has_orphan); -+ if(!handle) { -+ err = -EINVAL; -+ goto exit_unlock; -+ } -+ } -+ -+ pri->u.ext3_i.i_flags |= EXT3_DEL_FL; -+ ind->u.ext3_i.i_flags |= EXT3_COW_FL; -+ if(S_ISREG(pri->i_mode)) pri->i_nlink = 1; -+ pri->u.ext3_i.i_dtime = CURRENT_TIME; -+ //pri->u.ext3_i.i_generation++; -+ ext3_mark_inode_dirty(handle, pri); -+ ext3_mark_inode_dirty(handle, ind); -+ up(&ind->i_sem); -+ } else { -+ down(&ind->i_sem); -+ err = ext3_migrate_data(handle, ind, pri); -+ if (err) -+ goto exit_unlock; -+ -+ /* for regular files we do blocklevel COW's maybe */ -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, EXT3_FEATURE_COMPAT_BLOCKCOW) -+ && S_ISREG(pri->i_mode)) { -+ -+ snap_debug("ino %lu, do block cow\n",pri->i_ino); -+ /* because after migrate_data , pri->i_size is 0 */ -+ pri->i_size = ind->i_size; -+ } -+ else { -+ int bpib = pri->i_sb->s_blocksize >> 9; -+ snap_debug("ino %lu, do file cow\n", pri->i_ino); -+ -+ /* XXX: can we do this better? -+ * If it's a fast symlink, we should copy i_data back! -+ * The criteria to determine a fast symlink is: -+ * 1) it's a link and its i_blocks is 0 -+ * 2) it's a link and its i_blocks is bpib ( the case -+ * it has been cowed and has ea ) -+ */ -+ if( S_ISLNK(ind->i_mode) && -+ ((ind->i_blocks == 0) || (ext3_has_ea(ind) && ind->i_blocks == bpib))) { -+ snap_debug("ino %lu is fast symlink\n", pri->i_ino); -+ memcpy(EXT3_I(pri)->i_data, EXT3_I(ind)->i_data, -+ sizeof(EXT3_I(ind)->i_data)); -+ pri->i_size = ind->i_size; -+ } -+ else { -+ handle = ext3_copy_data(handle, pri, ind, &has_orphan); -+ if (!handle) -+ goto exit_unlock; -+ } -+ } -+ /* set cow flag for ind */ -+ ind->u.ext3_i.i_flags |= EXT3_COW_FL; -+ pri->u.ext3_i.i_flags &= ~EXT3_COW_FL; -+ -+ ext3_mark_inode_dirty(handle, pri); -+ ext3_mark_inode_dirty(handle, ind); -+ -+ err = ext3_set_indirect(pri, index, ind->i_ino, parent_ino); -+ if (err) -+ goto exit_unlock; -+ -+ up(&ind->i_sem); -+ } -+ -+ if (!EXT3_HAS_COMPAT_FEATURE(pri->i_sb, -+ EXT3_FEATURE_COMPAT_SNAPFS)) { -+ lock_super(pri->i_sb); -+ ext3_journal_get_write_access(handle, pri->i_sb->u.ext3_sb.s_sbh); -+ pri->i_sb->u.ext3_sb.s_es->s_feature_compat |= -+ cpu_to_le32(EXT3_FEATURE_COMPAT_SNAPFS); -+ ext3_journal_dirty_metadata(handle, pri->i_sb->u.ext3_sb.s_sbh); -+ pri->i_sb->s_dirt = 1; -+ unlock_super(pri->i_sb); -+ } -+ if (has_orphan) { -+ snap_debug("del %lu nlink %d from orphan list\n", -+ ind->i_ino, ind->i_nlink); -+#ifdef EXT3_ENABLE_SNAP_ORPHAN -+ remove_snap_orphan(handle, ind); -+#else -+ ext3_orphan_del(handle, ind); -+#endif -+ } -+ ext3_journal_stop(handle, pri); -+ -+ loopfail( 5 ); -+ -+ return ind; -+ -+exit_unlock: -+ up(&ind->i_sem); -+ ind->i_nlink = 0; -+exit: -+ if (has_orphan) { -+ snap_debug("del %lu nlink %d from orphan list\n", -+ ind->i_ino, ind->i_nlink); -+#ifdef EXT3_ENABLE_SNAP_ORPHAN -+ remove_snap_orphan(handle, ind); -+#else -+ ext3_orphan_del(handle, ind); -+#endif -+ } -+ iput(ind); -+ ext3_journal_stop(handle, pri); -+ if (err) -+ snap_err("exiting with error %d\n", err); -+ return NULL; -+} -+ -+ -+/* The following functions are used by destroy_indirect */ -+#define inode_bmap(inode, nr) (EXT3_I(inode)->i_data[(nr)]) -+#define inode_setbmap(inode, nr, physical) (EXT3_I(inode)->i_data[(nr)]=(physical)) -+ -+static inline int block_bmap (struct buffer_head * bh, int nr) -+{ -+ int tmp; -+ -+ if (!bh) -+ return 0; -+ tmp = le32_to_cpu(((u32 *) bh->b_data)[nr]); -+ brelse (bh); -+ return tmp; -+} -+ -+static inline int block_setbmap (handle_t *handle, struct buffer_head * bh, int nr, int physical) -+{ -+ -+ if (!bh) -+ return 0; -+ ext3_journal_get_write_access(handle, bh); -+ ((u32 *) bh->b_data)[nr] = cpu_to_le32(physical); -+ ext3_journal_dirty_metadata(handle, bh); -+ brelse (bh); -+ return 1; -+} -+ -+static int ext3_migrate_block (handle_t *handle, struct inode * dst, struct inode *src, int block) -+{ -+ int i1_d=0, i1_s=0, i2_d=0, i2_s=0, i3_d=0, i3_s=0; -+ int addr_per_block = EXT3_ADDR_PER_BLOCK(src->i_sb); -+ int addr_per_block_bits = EXT3_ADDR_PER_BLOCK_BITS(src->i_sb); -+ unsigned long blksz = src->i_sb->s_blocksize; -+ kdev_t ddev = dst->i_dev; -+ kdev_t sdev = src->i_dev; -+ int physical = 0; -+ -+ if (block < 0) { -+ ext3_warning (src->i_sb, "ext3_migrate_block", "block < 0"); -+ return 0; -+ } -+ if (block >= EXT3_NDIR_BLOCKS + addr_per_block + -+ (1 << (addr_per_block_bits * 2)) + -+ ((1 << (addr_per_block_bits * 2)) << addr_per_block_bits)) { -+ ext3_warning (src->i_sb, "ext3_migrate_block", "block > big"); -+ return 0; -+ } -+ /* EXT3_NDIR_BLOCK */ -+ if (block < EXT3_NDIR_BLOCKS) { -+ if( inode_bmap(dst, block) ) return 0; -+ else { -+ if( (physical = inode_bmap(src, block)) ) { -+ inode_setbmap (dst, block, physical); -+ inode_setbmap (src, block, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ } -+ /* EXT3_IND_BLOCK */ -+ block -= EXT3_NDIR_BLOCKS; -+ if (block < addr_per_block) { -+ i1_d = inode_bmap (dst, EXT3_IND_BLOCK); -+ -+ if (!i1_d) { -+ physical = inode_bmap(src, EXT3_IND_BLOCK); -+ if( physical ) { -+ inode_setbmap (dst, EXT3_IND_BLOCK, physical); -+ inode_setbmap (src, EXT3_IND_BLOCK, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ if( block_bmap (bread (ddev, i1_d, blksz), block )) -+ return 0; -+ -+ i1_s = inode_bmap (src, EXT3_IND_BLOCK); -+ if( !i1_s) return 0; -+ -+ physical = block_bmap ( bread (sdev, i1_s, blksz), block ); -+ -+ if( physical) { -+ block_setbmap(handle, bread(ddev, i1_d, blksz),block,physical); -+ block_setbmap(handle, bread(sdev, i1_s, blksz), block, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ /* EXT3_DIND_BLOCK */ -+ block -= addr_per_block; -+ if (block < (1 << (addr_per_block_bits * 2))) { -+ i1_d = inode_bmap (dst, EXT3_DIND_BLOCK); -+ i1_s = inode_bmap (src, EXT3_DIND_BLOCK); -+ if (!i1_d) { -+ if( (physical = inode_bmap(src, EXT3_DIND_BLOCK)) ) { -+ inode_setbmap (dst, EXT3_DIND_BLOCK, physical); -+ inode_setbmap (src, EXT3_DIND_BLOCK, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ i2_d = block_bmap (bread (ddev, i1_d, blksz), -+ block >> addr_per_block_bits); -+ -+ if (!i2_d) { -+ -+ if( !i1_s) return 0; -+ -+ physical = block_bmap (bread (sdev, i1_s, blksz), -+ block >> addr_per_block_bits); -+ if( physical) { -+ block_setbmap (handle, bread (ddev, i1_d, blksz), -+ block >> addr_per_block_bits, physical); -+ block_setbmap (handle, bread (sdev, i1_s, blksz), -+ block >> addr_per_block_bits, 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ physical = block_bmap (bread (ddev, i2_d, -+ blksz), -+ block & (addr_per_block - 1)); -+ if(physical) -+ return 0; -+ else { -+ i2_s = block_bmap (bread (sdev, i1_s, -+ blksz), -+ block >> addr_per_block_bits); -+ if(!i2_s) return 0; -+ -+ physical = block_bmap(bread (sdev, i2_s, -+ blksz), -+ block & (addr_per_block - 1)); -+ if(physical) { -+ block_setbmap(handle, bread (ddev, i2_d, blksz), -+ block & (addr_per_block - 1), physical); -+ block_setbmap(handle, bread (sdev, i2_s, blksz), -+ block & (addr_per_block - 1), 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ -+ } -+ /* EXT3_TIND_BLOCK */ -+ block -= (1 << (addr_per_block_bits * 2)); -+ i1_d = inode_bmap (dst, EXT3_TIND_BLOCK); -+ i1_s = inode_bmap (src, EXT3_TIND_BLOCK); -+ if (!i1_d) { -+ if( (physical = inode_bmap(src, EXT3_TIND_BLOCK)) ) -+ inode_setbmap (dst, EXT3_TIND_BLOCK, physical); -+ else -+ return 0; -+ } -+ i2_d = block_bmap (bread (ddev, i1_d, blksz), -+ block >> (addr_per_block_bits * 2)); -+ -+ if(i1_s) i2_s = block_bmap (bread (sdev, i1_s, blksz), -+ block >> (addr_per_block_bits * 2)); -+ -+ if (!i2_d) { -+ -+ if( !i1_s) return 0; -+ -+ physical = block_bmap (bread (sdev, i1_s, blksz), -+ block >> (addr_per_block_bits * 2)); -+ if(physical) { -+ block_setbmap (handle, bread (ddev, i1_d, blksz), -+ block >> (addr_per_block_bits * 2), physical); -+ block_setbmap (handle, bread (sdev, i1_s, blksz), -+ block >> (addr_per_block_bits * 2), 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ i3_d = block_bmap (bread (ddev, i2_d, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1)); -+ if( i2_s) i3_s = block_bmap (bread (sdev, i2_s, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1)); -+ -+ if (!i3_d) { -+ if (!i2_s) return 0; -+ physical = block_bmap (bread (sdev, i2_s, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1)); -+ if( physical) { -+ block_setbmap (handle, bread (ddev, i2_d, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1), -+ physical); -+ block_setbmap (handle, bread (sdev, i2_s, blksz), -+ (block >> addr_per_block_bits) & (addr_per_block - 1), -+ 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+ physical = block_bmap (bread (ddev, i3_d, blksz), -+ block & (addr_per_block - 1)) ; -+ if(physical) return 0; -+ else { -+ if(!i3_s) return 0; -+ physical = block_bmap (bread (sdev, i3_s, blksz), -+ block & (addr_per_block - 1)) ; -+ if( physical) { -+ block_setbmap (handle, bread (ddev, i3_d, blksz), -+ block & (addr_per_block - 1), physical); -+ block_setbmap (handle, bread (sdev, i3_s, blksz), -+ block & (addr_per_block - 1), 0); -+ return 1; -+ } -+ else -+ return 0; -+ } -+} -+ -+/* Generate i_blocks from blocks for an inode . -+ * We also calculate EA block here. -+ */ -+static unsigned long calculate_i_blocks(struct inode *inode, int blocks) -+{ -+ /* 512 byte disk blocks per inode block */ -+ int bpib = inode->i_sb->s_blocksize >> 9; -+ int addr_per_block = EXT3_ADDR_PER_BLOCK(inode->i_sb); -+ unsigned long i_blocks = 0; -+ int i=0; -+ int j=0; -+ int meta_blocks = 0; -+ -+ if( !inode ) return 0; -+ -+ if( blocks < 0 ) { -+ /* re-calculate blocks here */ -+ blocks = (inode->i_size + inode->i_sb->s_blocksize-1) -+ >> inode->i_sb->s_blocksize_bits; -+ } -+ -+ /* calculate data blocks */ -+ for(i = 0; i < blocks; i++ ) { -+ if(ext3_bmap(inode->i_mapping, i)) -+ i_blocks += bpib; -+ } -+ /* calculate meta blocks */ -+ blocks -= EXT3_NDIR_BLOCKS; -+ if( blocks > 0 ) { -+ meta_blocks++; -+ blocks -= addr_per_block; -+ } -+ if( blocks > 0 ) meta_blocks++; -+ i=0; -+ while( (blocks > 0) && (i < addr_per_block) ) { -+ meta_blocks++; -+ blocks -= addr_per_block; -+ i++; -+ } -+ if ( blocks > 0 ) meta_blocks += 2; -+ i=0; -+ j=0; -+ while( blocks > 0) { -+ meta_blocks++; -+ blocks -= addr_per_block; -+ i++; -+ if(i >= addr_per_block ) { -+ i=0; -+ j++; -+ } -+ if( j >= addr_per_block) { -+ j=0; -+ meta_blocks++; -+ } -+ } -+ /* calculate EA blocks */ -+ if( ext3_has_ea (inode) ) meta_blocks++; -+ -+ i_blocks += meta_blocks * bpib; -+ snap_debug("ino %lu, get i_blocks %lu\n", inode->i_ino, i_blocks); -+ return i_blocks; -+} -+ -+/** -+ * ext3_destroy_indirect - delete an indirect inode from the table -+ * @pri: primary inode -+ * @ind: indirect inode -+ * @index: index of inode that should be deleted -+ * -+ * We delete the @*ind inode, and remove it from the snapshot table. If @*ind -+ * is NULL, we use the inode at @index. -+ */ -+static int ext3_destroy_indirect(struct inode *pri, int index, -+ struct inode *next_ind) -+{ -+ char buf[EXT3_MAX_SNAP_DATA]; -+ struct snap_ea *snaps; -+ struct inode *ind; -+ int save = 0; -+ int i=0; -+ int err = 0; -+ handle_t *handle=NULL; -+ time_t ctime; -+ -+ if (index < 0 || index > EXT3_MAX_SNAPS) -+ return 0; -+ -+ if( pri == pri->i_sb->u.ext3_sb.s_journal_inode ){ -+ snap_err("TRY TO DESTROY JOURNAL'S IND\n"); -+ return -EINVAL; -+ } -+ -+ err = ext3_xattr_get(pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ if (err < 0) { -+ snap_err("inode %lu attribute read error\n", pri->i_ino); -+ return err; -+ } -+ -+ snaps = (struct snap_ea *)buf; -+ if ( !snaps->ino[index] ) { -+ snap_err("for pri ino %lu, index %d, redirect ino is 0\n", -+ pri->i_ino, index); -+ return -EINVAL; -+ } -+ -+ snap_debug("for pri ino %lu, reading inode %lu at index %d\n", -+ pri->i_ino, (ulong)le32_to_cpu(snaps->ino[index]), index); -+ -+ ind = iget(pri->i_sb, le32_to_cpu (snaps->ino[index]) ); -+ -+ if ( !ind || IS_ERR(ind) || is_bad_inode(ind)) -+ return -EINVAL; -+ -+ snap_debug("iget ind %lu, ref count = %d\n", -+ ind->i_ino, atomic_read(&ind->i_count)); -+ -+ handle = ext3_journal_start(pri, SNAP_DESTROY_TRANS_BLOCKS); -+ if (!handle) { -+ iput(ind); -+ return -EINVAL; -+ } -+ /* if it's block level cow, first copy the blocks back */ -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, EXT3_FEATURE_COMPAT_BLOCKCOW) && -+ S_ISREG(pri->i_mode)) { -+ -+ int blocks; -+ if (!next_ind) { -+ next_ind = pri; -+ down(&ind->i_sem); -+ } else { -+ double_down(&next_ind->i_sem, &ind->i_sem); -+ } -+ blocks = (next_ind->i_size + next_ind->i_sb->s_blocksize-1) -+ >> next_ind->i_sb->s_blocksize_bits; -+#define FAST_MIGRATE_BLOCK -+#ifdef FAST_MIGRATE_BLOCK -+ snap_debug("migrate block back from ino %lu to %lu\n", -+ ind->i_ino, next_ind->i_ino); -+ -+ for(i = 0; i < blocks; i++) { -+ if( ext3_bmap(next_ind->i_mapping, i) ) -+ continue; -+ if( !ext3_bmap(ind->i_mapping, i) ) -+ continue; -+ ext3_migrate_block(handle, next_ind, ind, i) ; -+ } -+ /* Now re-compute the i_blocks */ -+ /* XXX shall we take care of ind here? probably not */ -+ next_ind->i_blocks = calculate_i_blocks( next_ind, blocks); -+ ext3_mark_inode_dirty(handle, next_ind); -+ -+#else -+ for (i = 0; i < blocks; i++) { -+ if (ext3_bmap(next_ind->i_mapping, i)) -+ continue; -+ if (ext3_copy_block(next_ind, ind, i ) < 0) -+ break; -+ } -+ ext3_mark_inode_dirty(handle, next_ind); -+#endif -+ if (next_ind == pri) -+ up(&ind->i_sem); -+ else -+ double_up(&next_ind->i_sem, &ind->i_sem); -+ -+ } -+ -+ snap_debug("delete indirect ino %lu\n", ind->i_ino); -+ snap_debug("iput ind %lu, ref count = %d\n", -+ ind->i_ino, atomic_read(&ind->i_count)); -+ ind->i_nlink = 0; -+ iput (ind); -+ -+ snaps->ino[index] = cpu_to_le32(0); -+ for (i = 0; i < EXT3_MAX_SNAPS; i++) -+ save += snaps->ino[i]; -+ -+ if(!save) { -+ lock_list(pri->i_sb); -+ delete_cowed_ino_from_list(handle, pri); -+ unlock_list(pri->i_sb); -+ } -+ -+ /* if there are no cowed inode left, then remove snapfs feature */ -+ if(!SB_FIRST_COWED_INO(pri->i_sb)) { -+ -+ lock_super(pri->i_sb); -+ -+ ext3_journal_get_write_access(handle, pri->i_sb->u.ext3_sb.s_sbh); -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, -+ EXT3_FEATURE_COMPAT_SNAPFS)) { -+ pri->i_sb->u.ext3_sb.s_es->s_feature_compat &= -+ cpu_to_le32(~EXT3_FEATURE_COMPAT_SNAPFS); -+ } -+ /* clean up block level cow feature */ -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, -+ EXT3_FEATURE_COMPAT_BLOCKCOW)) { -+ pri->i_sb->u.ext3_sb.s_es->s_feature_compat &= -+ cpu_to_le32(~EXT3_FEATURE_COMPAT_BLOCKCOW); -+ } -+ /* XXX clean the extended attribute feature, -+ * this is not safe, find a better way -+ */ -+ if (EXT3_HAS_COMPAT_FEATURE(pri->i_sb, -+ EXT3_FEATURE_COMPAT_EXT_ATTR)) { -+ pri->i_sb->u.ext3_sb.s_es->s_feature_compat &= -+ cpu_to_le32(~EXT3_FEATURE_COMPAT_EXT_ATTR); -+ } -+ -+ ext3_journal_dirty_metadata(handle, pri->i_sb->u.ext3_sb.s_sbh); -+ pri->i_sb->s_dirt = 1; -+ unlock_super(pri->i_sb); -+ } -+ -+ /* -+ * If we are deleting the last indirect inode, and the primary inode -+ * has already been deleted, then mark the primary for deletion also. -+ * Otherwise, if we are deleting the last indirect inode remove the -+ * snaptable from the inode. XXX -+ */ -+ if (!save && pri->u.ext3_i.i_dtime) { -+ snap_debug("deleting primary %lu\n", pri->i_ino); -+ pri->i_nlink = 0; -+ /* reset err to 0 now */ -+ err = 0; -+ } else { -+ snap_debug("%s redirector table\n", -+ save ? "saving" : "deleting"); -+ /* XXX: since set ea will modify i_ctime of pri, -+ so save/restore i_ctime. Need this necessary ? */ -+ ctime = pri->i_ctime; -+ err = ext3_xattr_set(handle, pri, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ save ? buf : NULL, EXT3_MAX_SNAP_DATA, 0); -+ pri->i_ctime = ctime; -+ ext3_mark_inode_dirty(handle, pri); -+ } -+ ext3_journal_stop(handle, pri); -+ return err; -+} -+ -+/* restore a primary inode with the indirect inode at index */ -+static int ext3_restore_indirect(struct inode *pri, int index) -+{ -+ struct inode *ind; -+ struct inode *tmp; -+ int err = 0; -+ handle_t *handle = NULL; -+ -+ if (index < 0 || index > EXT3_MAX_SNAPS) -+ return -EINVAL; -+ -+ if( pri == pri->i_sb->u.ext3_sb.s_journal_inode ){ -+ printk( KERN_EMERG "TRY TO RESTORE JOURNAL\n"); -+ return -EINVAL; -+ } -+ snap_debug("pri ino %lu, index %d\n", pri->i_ino, index); -+ -+ ind = ext3_get_indirect(pri, NULL, index); -+ -+ if ( !ind ) -+ return -EINVAL; -+ -+ snap_debug("restore ino %lu to %lu\n", pri->i_ino, ind->i_ino); -+ -+ handle = ext3_journal_start(pri, SNAP_RESTORE_TRANS_BLOCKS); -+ if( !handle ) -+ return -EINVAL; -+ /* first destroy all the data blocks in primary inode */ -+ /* XXX: check this, ext3_new_inode, the first arg should be "dir" */ -+ tmp = ext3_new_inode(handle, pri, (int)pri->i_mode, 0); -+ if(tmp) { -+ double_down(&pri->i_sem, &tmp->i_sem); -+ ext3_migrate_data(handle, tmp, pri); -+ double_up(&pri->i_sem, &tmp->i_sem); -+ -+ tmp->i_nlink = 0; -+ iput(tmp); -+ } -+ else -+ snap_err("restore_indirect, new_inode err\n"); -+ -+ double_down(&pri->i_sem, &ind->i_sem); -+ ext3_migrate_data(handle, pri, ind); -+ /* clear the cow flag for pri because ind has it */ -+ pri->u.ext3_i.i_flags &= ~EXT3_COW_FL; -+ ext3_mark_inode_dirty(handle, pri); -+ double_up(&pri->i_sem, &ind->i_sem); -+ iput(ind); -+ -+// ext3_destroy_indirect(pri, index); -+ -+ ext3_journal_stop(handle, pri); -+ return err; -+} -+ -+ -+/** -+ * ext3_snap_iterate - iterate through all of the inodes -+ * @sb: filesystem superblock -+ * @repeat: pointer to function called on each valid inode -+ * @start: inode to start iterating at -+ * @priv: private data to the caller/repeat function -+ * -+ * If @start is NULL, then we do not return an inode pointer. If @*start is -+ * NULL, then we start at the beginning of the filesystem, and iterate over -+ * all of the inodes in the system. If @*start is non-NULL, then we start -+ * iterating at this inode. -+ * -+ * We call the repeat function for each inode that is in use. The repeat -+ * function must check if this is a redirector (with is_redirector) if it -+ * only wants to operate on redirector inodes. If there is an error or -+ * the repeat function returns non-zero, we return the last inode operated -+ * on in the @*start parameter. This allows the caller to restart the -+ * iteration at this inode if desired, by returning a positive value. -+ * Negative return values indicate an error. -+ * -+ * NOTE we cannot simply traverse the existing filesystem tree from the root -+ * inode, as there may be disconnected trees from deleted files/dirs -+ * -+ * FIXME If there was a list of inodes with EAs, we could simply walk the list -+ * intead of reading every inode. This is an internal implementation issue. -+ */ -+ -+static int ext3_iterate_all(struct super_block *sb, -+ int (*repeat)(struct inode *inode, void *priv), -+ struct inode **start, void *priv) -+{ -+ struct inode *tmp = NULL; -+ int gstart, gnum; -+ ino_t istart, ibase; -+ int err = 0; -+ -+ if (!start) -+ start = &tmp; -+ if (!*start) { -+ *start = iget(sb, EXT3_ROOT_INO); -+ if (!*start) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ if (is_bad_inode(*start)) { -+ err = -EIO; -+ goto exit; -+ } -+ } -+ if ((*start)->i_ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) { -+ snap_debug("invalid starting inode %ld\n",(*start)->i_ino); -+ err = -EINVAL; -+ goto exit; -+ } -+ if ((*start)->i_ino < EXT3_FIRST_INO(sb)) { -+ if ((err = (*repeat)(*start, priv) != 0)) -+ goto exit; -+ iput(*start); -+ *start = iget(sb, EXT3_FIRST_INO(sb)); -+ if (!*start) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ if (is_bad_inode(*start)) { -+ err = -EIO; -+ goto exit; -+ } -+ } -+ -+ gstart = ((*start)->i_ino - 1) / EXT3_INODES_PER_GROUP(sb); -+ istart = ((*start)->i_ino - 1) % EXT3_INODES_PER_GROUP(sb); -+ ibase = gstart * EXT3_INODES_PER_GROUP(sb); -+ for (gnum = gstart; gnum < EXT3_SB(sb)->s_groups_count; -+ gnum++, ibase += EXT3_INODES_PER_GROUP(sb)) { -+ struct ext3_group_desc * gdp; -+ int bitmap_nr; -+ char *bitmap; -+ int ibyte; -+ -+ gdp = ext3_get_group_desc (sb, gnum, NULL); -+ if (!gdp || le16_to_cpu(gdp->bg_free_inodes_count) == -+ EXT3_INODES_PER_GROUP(sb)) -+ continue; -+ -+ bitmap_nr = ext3_load_inode_bitmap(sb, gnum); -+ if (bitmap_nr < 0) -+ continue; -+ -+ bitmap = EXT3_SB(sb)->s_inode_bitmap[bitmap_nr]->b_data; -+ for (ibyte = istart >> 3; -+ ibyte < EXT3_INODES_PER_GROUP(sb) >> 3; -+ ibyte++) -+ { -+ int i; -+ int bit; -+ -+ if (!bitmap[ibyte]) -+ continue; -+ -+ /* FIXME need to verify if bit endianness will -+ * work properly here for all architectures. -+ */ -+ for (i = 1, bit = 1; i <= 8; i++, bit <<= 1) { -+ ino_t ino = ibase + (ibyte << 3) + i; -+ -+ if ((bitmap[ibyte] & bit) == 0) -+ continue; -+ if (*start) { -+ if (ino < (*start)->i_ino) -+ continue; -+ } else { -+ *start = iget(sb, ino); -+ if (!*start) { -+ err = -ENOMEM; -+ goto exit; -+ } -+ if (is_bad_inode(*start)) { -+ err = -EIO; -+ goto exit; -+ } -+ } -+ if ((err = (*repeat)(*start, priv)) != 0) -+ goto exit; -+ iput(*start); -+ *start = NULL; -+ } -+ } -+ istart = 0; -+ } -+exit: -+ iput(tmp); -+ return err; -+} -+ -+static int ext3_iterate(struct super_block *sb, -+ int (*repeat)(struct inode *inode, void *priv), -+ struct inode **start, void *priv, int flag) -+{ -+ switch(flag) { -+ case SNAP_ITERATE_ALL_INODE: -+ return ext3_iterate_all (sb, repeat, start, priv); -+ -+ case SNAP_ITERATE_COWED_INODE: -+ return ext3_iterate_cowed_inode (sb, repeat, start,priv); -+ -+ default: -+ return -EINVAL; -+ } -+} -+ -+static int find_snap_meta_index( -+ struct table_snap_meta_data *snap_meta, -+ char *name) -+{ -+ int i; -+ -+ /* table max length is null*/ -+ for( i = 0; i < TABLE_ITEM_COUNT; i++){ -+ /*compare name Max name Length 15*/ -+ if (snap_meta->array[i].name[0]){ -+ if(!strncmp(snap_meta->array[i].name, name, strlen(name))) -+ return i; -+ } -+ } -+ return -1; /* can not find */ -+} -+ -+int set_snap_meta_index( -+ struct table_snap_meta_data *snap_meta, -+ char *name, -+ int size) -+{ -+ int i; -+ -+ for( i = 0; i < TABLE_ITEM_COUNT; i++){ -+ /*compare name Max name Length 15*/ -+ if (! snap_meta->array[i].name[0]){ -+ strcpy(snap_meta->array[i].name, name); -+ snap_meta->count ++; -+ snap_meta->array[i].start = i * TABLE_ITEM_SIZE + 1; -+ snap_meta->array[i].len = size; -+ return i; -+ } -+ } -+ return -1; /* can not find */ -+} -+ -+static int ext3_get_meta_attr(struct super_block *sb, -+ char* name, char* buf, -+ int *size) -+{ -+ ino_t ino; -+ struct inode *inode; -+ struct buffer_head *bh = NULL; -+ struct table_snap_meta_data *s_attr; -+ unsigned long map_len = 0, left_size; -+ int i, error = 0, index = 0; -+ -+ ino = SB_SNAPTABLE_INO(sb); -+ if (ino == 0){ -+ snap_err("No table file \n"); -+ return -ENODATA; -+ } -+ inode = iget(sb, ino); -+ if(!inode || is_bad_inode(inode)){ -+ snap_err("unable to get table ino %lu\n", ino); -+ error = -ENOENT; -+ goto out_iput; -+ } -+ /*read the table from the table inode*/ -+ bh = ext3_bread(NULL, inode, 0, 0, &error); -+ if (!bh) { -+ snap_err("read table ino %lu, error %d\n", ino, error); -+ error = -ENODATA; -+ goto out_iput; -+ } -+ s_attr = (struct table_snap_meta_data *)(bh->b_data); -+ index = find_snap_meta_index(s_attr, name); -+ if (index < 0) { -+ snap_debug("not exit %s meta attr of table ino %lu \n", -+ name, inode->i_ino); -+ error = 0; -+ goto out_iput; -+ } -+ if (!buf || *size < s_attr->array[index].len) { -+ /*return the size of this meta attr */ -+ error = s_attr->array[index].len; -+ goto out_iput; -+ } -+ map_len = (s_attr->array[index].len + sb->s_blocksize - 1) >> sb->s_blocksize_bits; -+ left_size = *size; -+ for(i = 0; i < map_len; i++) { -+ struct buffer_head *array_bh = NULL; -+ -+ array_bh = ext3_bread(NULL, inode, -+ s_attr->array[index].start + i, -+ 0, &error); -+ if (!array_bh) { -+ snap_err("ino %lu read snap attr offset %d error %d \n", -+ inode->i_ino, (s_attr->array[index].start + i), -+ error); -+ goto out_iput; -+ } -+ if (left_size >= sb->s_blocksize) { -+ memcpy(buf, array_bh->b_data, sb->s_blocksize); -+ }else -+ memcpy(buf, array_bh->b_data, left_size); -+ left_size -= sb->s_blocksize; -+ brelse(array_bh); -+ } -+ *size = s_attr->array[index].len; -+out_iput: -+ brelse(bh); -+ iput(inode); -+ return error; -+} -+ -+static int ext3_set_meta_attr(struct super_block *sb, char* name, -+ char* buf, int size) -+{ -+ struct inode *inode = NULL; -+ handle_t *handle = NULL; -+ struct buffer_head *bh = NULL; -+ struct table_snap_meta_data *s_attr = NULL; -+ unsigned long ino; -+ int i, index = 0, error = 0; -+ unsigned long new_len = 0, left_size; -+ -+ ino = SB_SNAPTABLE_INO(sb); -+ -+ if (ino == 0 && !buf) { -+ snap_debug("no table ino \n"); -+ return 0; -+ } -+ -+ handle = ext3_journal_start(sb->s_root->d_inode, 2*EXT3_SETMETA_TRANS_BLOCKS); -+ if(!handle) -+ return -EINVAL; -+ -+ if (ino == 0) { -+ /*create table inode update table ino*/ -+ inode = ext3_new_inode(handle, sb->s_root->d_inode, (int)S_IFREG, 0); -+ if (!inode) -+ return -EINVAL; -+ lock_super(sb); -+ ext3_journal_get_write_access(handle, sb->u.ext3_sb.s_sbh); -+ SB_SNAPTABLE_INO(sb) = inode->i_ino; -+ ext3_journal_dirty_metadata(handle, sb->u.ext3_sb.s_sbh); -+ sb->s_dirt = 1; -+ unlock_super(sb); -+ -+ } else { -+ inode = iget(sb, ino); -+ if (!inode || !inode->i_nlink || is_bad_inode(inode)) { -+ snap_err("unable to get table ino %lu\n", ino); -+ error = -ENOENT; -+ goto exit; -+ } -+ } -+ /*read the table from the table inode, -+ * If can not find the block just create it*/ -+ bh = ext3_bread(handle, inode, 0, 1, &error); -+ if (!bh) { -+ snap_err("read table ino %lu, error %d\n", ino, error); -+ error = -ENODATA; -+ goto exit; -+ } -+ s_attr = (struct table_snap_meta_data *)(bh->b_data); -+ index = find_snap_meta_index(s_attr, name); -+ if (index < 0 && !buf) { -+ snap_debug("%s meta attr of table ino %lu do not exist\n", -+ name, inode->i_ino); -+ error = 0; -+ brelse(bh); -+ goto exit; -+ } -+ if (!buf) { -+ snap_debug("delete the meta attr %s in the table ino %lu", -+ name, inode->i_ino); -+ /*Here we only delete the entry of the attr -+ *FIXME, should we also delete the block of -+ * this attr -+ */ -+ ext3_journal_get_write_access(handle, bh); -+ memset(s_attr->array[index].name, 0, TABLE_ITEM_NAME_SIZE); -+ s_attr->array[index].len = 0; -+ s_attr->count --; -+ ext3_journal_dirty_metadata(handle, bh); -+ brelse(bh); -+ goto exit; -+ } -+ new_len = (size + sb->s_blocksize - 1) >> sb->s_blocksize_bits; -+ /*find the place to put this attr in that index*/ -+ ext3_journal_get_write_access(handle, bh); -+ if (index < 0){ -+ index = set_snap_meta_index(s_attr, name, size); -+ if (index < 0){ -+ snap_err("table full of ino %lu \n", inode->i_ino); -+ error = index; -+ brelse(bh); -+ goto exit; -+ } -+ } -+ s_attr->array[index].len = size; -+ journal_dirty_metadata(handle, bh); -+ brelse(bh); -+ /*put this attr to the snap table*/ -+ left_size = size; -+ for(i = 0; i < new_len; i++) { -+ struct buffer_head *array_bh = NULL; -+ -+ array_bh = ext3_bread(handle, inode, -+ s_attr->array[index].start + i, 1, &error); -+ if (!array_bh) { -+ snap_err("inode %lu Can not get the block of attr %s\n", -+ inode->i_ino, name); -+ error = -ENOSPC; -+ brelse(array_bh); -+ goto exit; -+ } -+ ext3_journal_get_write_access(handle, array_bh); -+ if (left_size > inode->i_sb->s_blocksize) -+ memcpy(array_bh->b_data, buf, inode->i_sb->s_blocksize); -+ else -+ memcpy(array_bh->b_data, buf, left_size); -+ ext3_journal_dirty_metadata(handle, array_bh); -+ left_size -= inode->i_sb->s_blocksize; -+ brelse(array_bh); -+ } -+exit: -+ if (handle) -+ ext3_journal_stop(handle, sb->s_root->d_inode); -+ iput(inode); -+ return error; -+} -+ -+struct snapshot_operations ext3_snap_operations = { -+ ops_version: SNAP_VERSION(2,0,2), -+ is_redirector: is_redirector, -+ is_indirect: is_indirect, -+ create_indirect: ext3_create_indirect, -+ get_indirect: ext3_get_indirect, -+ get_indirect_ino: ext3_get_indirect_ino, -+ destroy_indirect: ext3_destroy_indirect, -+ restore_indirect: ext3_restore_indirect, -+ iterate: ext3_iterate, -+ copy_block: ext3_copy_block, -+ set_indirect: ext3_set_indirect, -+ snap_feature: ext3_snap_feature, -+ get_generation: ext3_get_generation, -+ set_generation: ext3_set_generation, -+ get_meta_attr: ext3_get_meta_attr, -+ set_meta_attr: ext3_set_meta_attr, -+}; -+ -+EXPORT_SYMBOL(ext3_snap_operations); -+#ifdef SNAP_PROFILE -+EXPORT_SYMBOL(prof_snapdel); -+#endif -+ -+#ifdef SNAP_DEBUG_IOC -+ -+static int print_inode(struct inode *pri, void *index_val) -+{ -+ -+ int err=0; -+ struct snap_ea *snaps; -+ char buf[EXT3_MAX_SNAP_DATA]; -+ int index = *(int *)index_val; -+ -+ err = ext3_xattr_get(primary, EXT3_SNAP_INDEX, EXT3_SNAP_ATTR, -+ buf, EXT3_MAX_SNAP_DATA); -+ -+ if (err == -ENODATA) { -+ memset(buf, 0, EXT3_MAX_SNAP_DATA); -+ } -+ else if (err < 0) { -+ snap_err("got err %d when reading attributes\n", err); -+ goto err_exit; -+ } -+ -+ snaps = (struct snap_ea *) buf; -+ -+ if( le32_to_cpu(snaps->ino[index]) == 0 ) { -+ snap_debug("no redirected ino for primary inode %lu\n", -+ primary->i_ino); -+ } -+ else { -+ snap_debug("primary inode %lu , redirected ino=%d\n", -+ primary->i_ino,le32_to_cpu(snaps->ino[index])); -+ } -+err_exit: -+ return err; -+} -+ -+int snap_print(struct super_block *sb, int index) -+{ -+ ext3_iterate_cowed_inode(sb, &print_inode, NULL, &index); -+ return 0; -+} -+ -+static int ext3_snap_destroy_inode(struct inode *primary,void *index_val) -+{ -+ int index = *(int *)index_val; -+ int rc = 0; -+ printk("delete_inode for index %d\n",index); -+ rc = ext3_destroy_indirect(primary,index, NULL); -+ if(rc != 0) -+ printk("ERROR:ext3_destroy_indirect(ino %lu,index %d),ret %d\n", -+ primary->i_ino, index, rc); -+ return 0; -+} -+ -+int ext3_snap_delete(struct super_block *sb, int index) -+{ -+ ext3_iterate(sb, &ext3_snap_destroy_inode, NULL, &index, -+ SNAP_ITERATE_COWED_INODE); -+ return 0; -+} -+#endif -+ -+ -+ -+ -+ -+ -+ -+ -Index: linux-2.4.20-8/fs/ext3/Makefile -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/Makefile 2004-01-19 22:06:25.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/Makefile 2004-01-19 22:06:25.000000000 +0800 -@@ -13,7 +13,7 @@ - - obj-y := balloc.o bitmap.o dir.o file.o fsync.o ialloc.o inode.o iopen.o \ - ioctl.o namei.o super.o symlink.o hash.o ext3-exports.o \ -- xattr_trusted.o -+ xattr_trusted.o snap.o - obj-m := $(O_TARGET) - - export-objs += xattr.o -Index: linux-2.4.20-8/fs/ext3/inode.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/inode.c 2004-01-19 22:06:24.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/inode.c 2004-01-26 01:12:48.000000000 +0800 -@@ -1191,7 +1191,7 @@ - * So, if we see any bmap calls here on a modified, data-journaled file, - * take extra steps to flush any blocks which might be in the cache. - */ --static int ext3_bmap(struct address_space *mapping, long block) -+int ext3_bmap(struct address_space *mapping, long block) - { - struct inode *inode = mapping->host; - journal_t *journal; -@@ -1403,7 +1403,7 @@ - * This required during truncate. We need to physically zero the tail end - * of that block so it doesn't yield old data if the file is later grown. - */ --static int ext3_block_truncate_page(handle_t *handle, -+int ext3_block_truncate_page(handle_t *handle, - struct address_space *mapping, loff_t from) - { - unsigned long index = from >> PAGE_CACHE_SHIFT; -Index: linux-2.4.20-8/fs/ext3/ialloc.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/ialloc.c 2004-01-19 22:06:24.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/ialloc.c 2004-01-19 22:06:25.000000000 +0800 -@@ -160,6 +160,13 @@ - return retval; - } - -+/* Export load_inode_bitmap*/ -+int ext3_load_inode_bitmap (struct super_block * sb, -+ unsigned int block_group) -+{ -+ return load_inode_bitmap(sb, block_group); -+} -+ - /* - * NOTE! When we get the inode, we're the only people - * that have access to it, and as such there are no -Index: linux-2.4.20-8/fs/ext3/super.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/super.c 2004-01-19 22:06:24.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/super.c 2004-01-19 22:06:25.000000000 +0800 -@@ -1324,6 +1324,13 @@ - sbi->s_mount_state = le16_to_cpu(es->s_state); - sbi->s_addr_per_block_bits = log2(EXT3_ADDR_PER_BLOCK(sb)); - sbi->s_desc_per_block_bits = log2(EXT3_DESC_PER_BLOCK(sb)); -+#define EXT3_SNAP_FS -+#ifdef EXT3_SNAP_FS -+ init_MUTEX(&(sbi->s_snap_list_sem)); -+ sbi->s_snaptable_ino = le32_to_cpu(es->s_snaptable_ino); -+ sbi->s_first_cowed_pri_ino = le32_to_cpu(es->s_first_cowed_pri_ino); -+ sbi->s_last_cowed_pri_ino = le32_to_cpu(es->s_last_cowed_pri_ino); -+#endif - for (i=0; i < 4; i++) - sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]); - sbi->s_def_hash_version = es->s_def_hash_version; -Index: linux-2.4.20-8/fs/ext3/ext3-exports.c -=================================================================== ---- linux-2.4.20-8.orig/fs/ext3/ext3-exports.c 2004-01-19 22:06:19.000000000 +0800 -+++ linux-2.4.20-8/fs/ext3/ext3-exports.c 2004-01-26 01:13:53.000000000 +0800 -@@ -21,6 +21,9 @@ - EXPORT_SYMBOL(ext3_xattr_set); - EXPORT_SYMBOL(ext3_prep_san_write); - EXPORT_SYMBOL(ext3_map_inode_page); -+EXPORT_SYMBOL(ext3_orphan_add); -+EXPORT_SYMBOL(ext3_orphan_del); -+EXPORT_SYMBOL(ext3_block_truncate_page) - - EXPORT_SYMBOL(ext3_abort); - EXPORT_SYMBOL(ext3_decode_error); -Index: linux-2.4.20-8/include/linux/snap.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/snap.h 2003-01-30 18:24:37.000000000 +0800 -+++ linux-2.4.20-8/include/linux/snap.h 2004-01-19 22:11:26.000000000 +0800 -@@ -0,0 +1,266 @@ -+/* -+ * Copyright (c) 2002 Cluster File Systems, Inc. <info@clusterfs.com> -+ * started by Andreas Dilger <adilger@turbolinux.com> -+ * Peter Braam <braam@mountainviewdata.com> -+ * Harrison Xing <harrisonx@mountainviewdata.com> -+ * -+ * Redesigned 2003 by Peter Braam <braam@clusterfs.com> -+ * Eric Mei <Ericm@clusterfs.com> -+ * Wang Di <wangdi@clusterfs.com> -+ * -+ * Rewriten 2003 by Wang Di <wangdi@clusterfs.com> -+ * Eric Mei <ericm@clusterfs.com> -+ * -+ * Functions for implementing snapshots in the ext3 filesystem. They are -+ * intended to hide the internals of the filesystem from the caller in -+ * such a way that the caller doesn't need to know about inode numbers, -+ * how the redirectors are implemented or stored, etc. It may not do that -+ * all yet, but it tries. -+ * -+ * The snapshot inode redirection is stored in the primary/direct inode as -+ * an extended attribute $snap, in the form of little-endian u32 inode -+ * numbers. -+ * -+ */ -+ -+#ifndef _LINUX_SNAP_H -+#define _LINUX_SNAP_H -+ -+#include <linux/fs.h> -+ -+/* maximum number of snapshots available for users */ -+#define MAX_SNAPS 20 -+ -+/* snap extended attributes definition */ -+#define SNAP_ATTR "@snap" -+struct snap_ea{ -+ int generation; -+ ino_t prev_ino; -+ ino_t next_ino; -+ ino_t ino[MAX_SNAPS+1]; /* including current snapshot */ -+ ino_t parent_ino[MAX_SNAPS+1]; -+}; -+#define MAX_SNAP_DATA (sizeof(struct snap_ea)) -+#if 0 -+/* for compatibility with old 128 max snapshots */ -+#define MAX_SNAP128_DATA (sizeof(struct snap_ea) - (sizeof(ino_t) * 128 * 2)) -+#define ZERO_SNAP_ATTR_TOP(buf) \ -+ do { \ -+ struct snap_ea *p = (struct snap_ea*)buf; \ -+ memset(&p->ino[129], 0, sizeof(ino_t)*128); \ -+ memset(&p->parent_ino[129], 0, sizeof(ino_t)*128); \ -+ } while(0) -+ -+/* snap new ea definition , for logging of new inode */ -+#define SNAP_NEW_INO_ATTR "@snap_new" -+struct snap_new_ea{ -+ ino_t prev_ino; /* reserved. save the inode to a linked list */ -+ ino_t next_ino; -+ int new_index; /* indicate for which index this is a new inode */ -+}; -+#define NULL_NEW_INDEX -1 /* null new index, to clear the snap_new_ea */ -+ -+/* ea to identiry a indirect inode's infomation */ -+#define SNAP_INDIRECT_INFO_ATTR "@snap_indirect_inode_info" -+struct snap_indirect_info { -+ __u32 index; /* which index belongs to */ -+ __u32 reserved[3]; /* reserved */ -+}; -+#endif -+ -+/* snapfs meta data stored in extended attributes of root ino */ -+#define DISK_SNAP_META_ATTR "@disk_snap_meta_attr" -+struct disk_snap_meta_data { -+ ino_t snap_first_cowed_ino; -+ ino_t snap_table_ino; -+ __u32 snap_feature_compat; -+}; -+/*snapfs quota info */ -+ -+#define SNAP_USR_QUOTA 0 -+#define SNAP_GRP_QUOTA 1 -+#define DISK_SNAP_QUOTA_INFO "@disk_snap_quota_info" -+struct quota_info_len { -+ int uid_len; /*uid quota info length */ -+ int gid_len; /*gid quota info length */ -+}; -+/* -+ * Check if the EA @name is Snap EA or not. -+ * Snap EA includes the SNAP_ATTR, SNAP_NEW_INO_ATTR and DISK_SNAP_META_ATTR -+ */ -+ -+#define IS_SNAP_EA(name) ( (!strcmp((name), SNAP_ATTR)) || \ -+ (!strcmp((name), DISK_SNAP_META_ATTR))) -+ -+ -+ -+/* file system features */ -+#define SNAP_FEATURE_COMPAT_SNAPFS 0x0010 -+#define SNAP_FEATURE_COMPAT_BLOCKCOW 0x0020 -+ -+/* constants for snap_feature operations */ -+#define SNAP_CLEAR_FEATURE 0x0 -+#define SNAP_SET_FEATURE 0x1 -+#define SNAP_HAS_FEATURE 0x2 -+ -+/* snap flags for inode, within 1 byte range, each occupy 1 bit */ -+#define SNAP_INO_MAGIC 0x88 /* magic for snap inode */ -+#define SNAP_COW_FLAG 0x01 /* snap redirected inode */ -+#define SNAP_DEL_FLAG 0x02 /* snap deleted inode */ -+#define SNAP_TABLE_FLAG 0x04 /* snap table inode */ -+#define SNAP_PRI_FLAG 0x08 /* primary inode */ -+ -+/* no snapfs attributes for get_indirect_ino */ -+#define ENOSNAPATTR 320 -+ -+/* constants used by iterator */ -+#define SNAP_ITERATE_ALL_INODE 0x0 -+#define SNAP_ITERATE_COWED_INODE 0x1 -+ -+/* constants used by create_indirect */ -+#define SNAP_CREATE_IND_NORMAL 0x0 -+#define SNAP_CREATE_IND_DEL_PRI 0x1 -+ -+/* the data structure represent in the xfs_dinode.pad -+ offset 0: magic (1 byte) -+ offset 1: flag (1 byte) -+ offset 2: gen (4 bytes) -+ offset 6: unused -+ */ -+#define SIZEOF_MAGIC 1 -+#define SIZEOF_FLAG 1 -+#define SIZEOF_GENERATION 4 -+ -+#define MAGIC_OFFSET 0 -+#define FLAG_OFFSET 1 -+#define GENERATION_OFFSET 2 -+ -+#define SNAP_GET_DINODE_MAGIC(dinode) \ -+ (((__u8*)(dinode)->di_pad)[MAGIC_OFFSET]) -+#define SNAP_SET_DINODE_MAGIC(dinode) \ -+ ((__u8*)(dinode)->di_pad)[MAGIC_OFFSET] = (SNAP_INO_MAGIC) -+#define SNAP_GET_DINODE_FLAG(dinode) \ -+ (((__u8*)(dinode)->di_pad)[FLAG_OFFSET]) -+#define SNAP_SET_DINODE_FLAG(dinode, flag) \ -+ (((__u8*)(dinode)->di_pad)[FLAG_OFFSET] |= (flag)) -+#define SNAP_CLEAR_DINODE_FLAG(dinode, flag) \ -+ (((__u8*)(dinode)->di_pad)[FLAG_OFFSET] &= ~(flag)) -+#define SNAP_GET_DINODE_GEN(dinode) \ -+ (le32_to_cpu(*(__u32*)(&((__u8*)(dinode)->di_pad)[GENERATION_OFFSET]))) -+#define SNAP_SET_DINODE_GEN(dinode, gen) \ -+ *(__u32*)(&((__u8*)(dinode)->di_pad)[GENERATION_OFFSET]) = cpu_to_le32(gen) -+ -+#if 0 -+/* header of saving snaptable */ -+struct raw_data { -+ unsigned int size; /* buffer size passed by */ -+ char data[0]; /* followed by actual data */ -+}; -+ -+/* header of on-disk table data */ -+struct disk_snap_table_header { -+ __u32 magic; -+ __u32 version; -+ __u32 datasize; -+}; -+ -+/* table magic and version constant */ -+#define SNAP_TABLE_MAGIC 0xB3A2957F -+#define SNAP_TABLE_VERSION 1 -+ -+ -+#define SNAPTABLE_BLOCKS(sb,size) \ -+ (((size-sizeof(__u32)+sizeof(struct disk_snap_table_header)) \ -+ >> sb->s_blocksize_bits)+1) -+#endif -+ -+#define SNAP_VERSION(a,b,c) \ -+ (((a & 0xFF) << 16) | ((b & 0xFF) << 8) | (c & 0xFF)) -+#define SNAP_VERSION_MAJOR(v) \ -+ ((v >> 16) & 0xFF) -+#define SNAP_VERSION_MINOR(v) \ -+ ((v >> 8) & 0xFF) -+#define SNAP_VERSION_REL(v) \ -+ (v & 0xFF) -+ -+/* for snap meta attr table */ -+#define TABLE_ITEM_COUNT 200 -+#define TABLE_ITEM_SIZE 1000 -+#define TABLE_ITEM_NAME_SIZE 16 -+ -+/*snap table array */ -+struct snap_meta_array { -+ char name[TABLE_ITEM_NAME_SIZE]; -+ int start; /* where is the start of the array */ -+ int len; /* the len of the array */ -+}; -+/* snap table structure for record the information */ -+struct table_snap_meta_data { -+ int count; -+ struct snap_meta_array array[TABLE_ITEM_COUNT]; -+}; -+ -+ -+#if 0 -+#define SNAP_PROFILE -+#else -+#undef SNAP_PROFILE -+#endif -+ -+#ifdef SNAP_PROFILE -+struct profile_snapdel_stat -+{ -+ unsigned long total_tick; /* total time */ -+ unsigned long inodes; /* primary inodes */ -+ -+ unsigned long yield_count; /* for yeild cpu */ -+ unsigned long yield_tick; -+ unsigned long yield_max_tick; -+ -+ unsigned long getea_count; /* for get ea */ -+ unsigned long getea_tick; -+ unsigned long getea_max_tick; -+ -+ unsigned long setea_count; /* for set ea */ -+ unsigned long setea_tick; -+ unsigned long setea_max_tick; -+ -+ unsigned long converge_count; /* for converge */ -+ unsigned long converge_tick; -+ unsigned long converge_max_tick; -+}; -+ -+#endif -+ -+/* snapshot operations */ -+struct snapshot_operations { -+ unsigned int ops_version; -+ int (*is_redirector) (struct inode *inode); -+ int (*is_indirect) (struct inode *inode); -+ struct inode * (*create_indirect) (struct inode *pri, int index, -+ unsigned int gen, ino_t parent_ino, -+ int del); -+ struct inode * (*get_indirect) (struct inode *pri, int *table,int slot); -+ ino_t (*get_indirect_ino) (struct inode *pri, int index); -+ int (*destroy_indirect) (struct inode *pri, int index, -+ struct inode *next_ind); -+ int (*restore_indirect) (struct inode *pri, int index); -+ int (*iterate) (struct super_block *sb, -+ int (*repeat)(struct inode *inode, void *priv), -+ struct inode **start, void *priv, int flag); -+ int (*copy_block) ( struct inode *dst, struct inode *src, int blk); -+ int (*has_block) (struct inode *dst, int blk); -+ int (*set_indirect) (struct inode *pri, int index, -+ ino_t ind_ino, ino_t parent_ino ); -+ int (*snap_feature) (struct super_block *sb, int feature, int op); -+ int (*get_generation) (struct inode *pri); -+ int (*set_generation) (struct inode *pri, unsigned long new_gen); -+ int (*has_del_flag) (struct inode *inode); -+ int (*clear_del_flag) (struct inode *inode); -+ int (*set_meta_attr)(struct super_block *sb, char *name, -+ char *buf, int size); -+ int (*get_meta_attr)(struct super_block *sb, char *name, -+ char *buf, int *size); -+}; -+ -+#endif -Index: linux-2.4.20-8/include/linux/ext3_fs.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_fs.h 2004-01-19 22:06:24.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_fs.h 2004-01-19 22:11:15.000000000 +0800 -@@ -183,7 +183,13 @@ - #define EXT3_INDEX_FL 0x00001000 /* hash-indexed directory */ - #define EXT3_IMAGIC_FL 0x00002000 /* AFS directory */ - #define EXT3_JOURNAL_DATA_FL 0x00004000 /* file data should be journaled */ --#define EXT3_RESERVED_FL 0x80000000 /* reserved for ext3 lib */ -+/* For snapfs in EXT3 flags --- FIXME will find other ways to store it*/ -+#define EXT3_COW_FL 0x00008000 /* inode is snapshot cow */ -+#define EXT3_DEL_FL 0x00010000 /* inode is deleting in snapshot */ -+#define EXT3_SNAP_TABLE_FLAG 0x00020000 /* snap table inode */ -+/* FIXME For debugging will be removed later*/ -+#define EXT3_SNAP_PRI_FLAG 0x00040000 /* primary inode */ -+ - - #define EXT3_FL_USER_VISIBLE 0x00005FFF /* User visible flags */ - #define EXT3_FL_USER_MODIFIABLE 0x000000FF /* User modifiable flags */ -@@ -205,10 +211,25 @@ - /* EXT3_IOC_CREATE_INUM at bottom of file (visible to kernel and user). */ - #define EXT3_IOC_GETVERSION_OLD _IOR('v', 1, long) - #define EXT3_IOC_SETVERSION_OLD _IOW('v', 2, long) -+/* the following are for temporary test */ -+/* snapfs ioctls */ -+#define EXT3_IOC_CREATE_INDIR _IOW('v', 3, long) -+#define EXT3_IOC_GET_INDIR _IOW('v', 4, long) -+#define EXT3_IOC_DESTROY_INDIR _IOW('v', 5, long) -+#define EXT3_IOC_IS_REDIR _IOW('v', 6, long) -+#define EXT3_IOC_RESTORE_INDIR _IOW('v', 7, long) -+ -+#define EXT3_IOC_SNAP_SETFILECOW _IOW('v', 10, long) -+ -+/* XXX: the following are for temporary test, can be removed later */ -+#define EXT3_IOC_SNAP_PRINT _IOW('v', 11, long) -+#define EXT3_IOC_SNAP_DELETE _IOW('v', 12, long) -+#define EXT3_IOC_SNAP_RESTORE _IOW('v', 13, long) -+ -+ - #ifdef CONFIG_JBD_DEBUG - #define EXT3_IOC_WAIT_FOR_READONLY _IOR('f', 99, long) - #endif -- - /* - * Structure of an inode on the disk - */ -@@ -429,7 +450,15 @@ - __u8 s_def_hash_version; /* Default hash version to use */ - __u8 s_reserved_char_pad; - __u16 s_reserved_word_pad; -- __u32 s_reserved[192]; /* Padding to the end of the block */ -+ __u32 s_default_mount_opts; -+ __u32 s_first_meta_bg; /* First metablock group */ -+ __u32 s_mkfs_time; /* When the filesystem was created */ -+ /* for snapfs */ -+ __u32 s_first_cowed_pri_ino; /* For snapfs,the first cowed primary inode */ -+ __u32 s_last_cowed_pri_ino; /* last cowed ino in memory */ -+ __u32 s_snaptable_ino; /* snaptable ino in memory */ -+ __u32 s_last_snap_orphan; /* SnapFS: start of cowing indirect inode */ -+ __u32 s_reserved[186]; /* Padding to the end of the block,originally 204 */ - }; - - #ifdef __KERNEL__ -@@ -503,6 +532,9 @@ - #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ - #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ - -+#define EXT3_FEATURE_COMPAT_SNAPFS 0x0010 -+#define EXT3_FEATURE_COMPAT_BLOCKCOW 0x0020 -+ - #define EXT3_FEATURE_COMPAT_SUPP EXT2_FEATURE_COMPAT_EXT_ATTR - #define EXT3_FEATURE_INCOMPAT_SUPP (EXT3_FEATURE_INCOMPAT_FILETYPE| \ - EXT3_FEATURE_INCOMPAT_RECOVER) -Index: linux-2.4.20-8/include/linux/ext3_fs_sb.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_fs_sb.h 2004-01-19 22:06:18.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_fs_sb.h 2004-01-19 22:10:06.000000000 +0800 -@@ -86,6 +86,13 @@ - wait_queue_head_t s_delete_thread_queue; - wait_queue_head_t s_delete_waiter_queue; - #endif -+#define EXT3_SNAP_FS -+#ifdef EXT3_SNAP_FS -+ struct semaphore s_snap_list_sem; -+ unsigned long s_first_cowed_pri_ino;/* For snapfs,the first cowed primary inode */ -+ unsigned long s_last_cowed_pri_ino; /* last cowed ino in memory */ -+ unsigned long s_snaptable_ino; /* snaptable ino in memory */ -+#endif - }; - - #endif /* _LINUX_EXT3_FS_SB */ -Index: linux-2.4.20-8/include/linux/ext3_jbd.h -=================================================================== ---- linux-2.4.20-8.orig/include/linux/ext3_jbd.h 2004-01-19 22:06:15.000000000 +0800 -+++ linux-2.4.20-8/include/linux/ext3_jbd.h 2004-01-19 22:11:15.000000000 +0800 -@@ -71,6 +71,33 @@ - - #define EXT3_INDEX_EXTRA_TRANS_BLOCKS 8 - -+/*snapshot transaction blocks*/ -+ -+#define EXT3_EA_TRANS_BLOCKS EXT3_DATA_TRANS_BLOCKS -+#define EXT3_SETMETA_TRANS_BLOCKS EXT3_DATA_TRANS_BLOCKS -+#define EXT3_NEWINODE_TRANS_BLOCKS 10 -+#define SNAP_INSERTLIST_TRANS_BLOCKS (2 * EXT3_EA_TRANS_BLOCKS + 1) -+#define SNAP_DELETELIST_TRANS_BLOCKS (2 * EXT3_EA_TRANS_BLOCKS + 2) -+#define SNAP_COPYBLOCK_TRANS_BLOCKS (EXT3_DATA_TRANS_BLOCKS) -+#define SNAP_MIGRATEDATA_TRANS_BLOCKS 2 -+#define SNAP_SETIND_TRANS_BLOCKS (SNAP_INSERTLIST_TRANS_BLOCKS + 1) -+#define SNAP_ADDORPHAN_TRANS_BLOCKS 2 -+#define SNAP_REMOVEORPHAN_TRANS_BLOCKS 1 -+#define SNAP_RESTOREORPHAN_TRANS_BLOCKS (EXT3_EA_TRANS_BLOCKS + \ -+ SNAP_DELETELIST_TRANS_BLOCKS + \ -+ EXT3_NEWINODE_TRANS_BLOCKS + \ -+ 2 * SNAP_MIGRATEDATA_TRANS_BLOCKS) -+#define SNAP_BIGCOPY_TRANS_BLOCKS (2 * EXT3_DATA_TRANS_BLOCKS) -+#define SNAP_CREATEIND_TRANS_BLOCKS (EXT3_NEWINODE_TRANS_BLOCKS + \ -+ SNAP_MIGRATEDATA_TRANS_BLOCKS + \ -+ SNAP_SETIND_TRANS_BLOCKS + \ -+ SNAP_BIGCOPY_TRANS_BLOCKS + 3) -+#define SNAP_MIGRATEBLK_TRANS_BLOCKS 2 -+#define SNAP_DESTROY_TRANS_BLOCKS (SNAP_DELETELIST_TRANS_BLOCKS + \ -+ EXT3_EA_TRANS_BLOCKS + 2) -+#define SNAP_RESTORE_TRANS_BLOCKS (EXT3_NEWINODE_TRANS_BLOCKS + \ -+ 2 * SNAP_MIGRATEDATA_TRANS_BLOCKS + 1) -+ - int - ext3_mark_iloc_dirty(handle_t *handle, - struct inode *inode, - -%diffstat - fs/ext3/Makefile | 2 - fs/ext3/ext3-exports.c | 3 - fs/ext3/ialloc.c | 7 - fs/ext3/inode.c | 4 - fs/ext3/snap.c | 2577 +++++++++++++++++++++++++++++++++++++++++++++ - fs/ext3/super.c | 7 - include/linux/ext3_fs.h | 38 - include/linux/ext3_fs_sb.h | 7 - include/linux/ext3_jbd.h | 27 - include/linux/snap.h | 266 ++++ - 10 files changed, 2932 insertions(+), 6 deletions(-) - diff --git a/lustre/kernel_patches/patches/socket-exports-2.4.22-rh.patch b/lustre/kernel_patches/patches/socket-exports-2.4.22-rh.patch deleted file mode 100644 index 08ca1b256e..0000000000 --- a/lustre/kernel_patches/patches/socket-exports-2.4.22-rh.patch +++ /dev/null @@ -1,41 +0,0 @@ - include/linux/socket.h | 4 ++++ - net/netsyms.c | 1 + - net/socket.c | 2 +- - 3 files changed, 6 insertions(+), 1 deletion(-) - ---- linux-2.4.22-ac1/include/linux/socket.h~socket-exports-2.4.22-rh 2003-06-13 18:51:39.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/include/linux/socket.h 2003-09-26 00:49:43.000000000 +0400 -@@ -275,6 +275,10 @@ extern void memcpy_tokerneliovec(struct - extern int move_addr_to_user(void *kaddr, int klen, void *uaddr, int *ulen); - extern int move_addr_to_kernel(void *uaddr, int ulen, void *kaddr); - extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); -+struct socket; -+extern int sock_map_fd(struct socket *sock); -+extern struct socket *sockfd_lookup(int fd, int *err); -+ - #endif - #endif /* not kernel and not glibc */ - #endif /* _LINUX_SOCKET_H */ ---- linux-2.4.22-ac1/net/netsyms.c~socket-exports-2.4.22-rh 2003-09-26 00:49:19.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/net/netsyms.c 2003-09-26 00:50:20.000000000 +0400 -@@ -163,6 +163,7 @@ EXPORT_SYMBOL(put_cmsg); - EXPORT_SYMBOL(sock_kmalloc); - EXPORT_SYMBOL(sock_kfree_s); - EXPORT_SYMBOL(sockfd_lookup); -+EXPORT_SYMBOL(sock_map_fd); - - #ifdef CONFIG_FILTER - EXPORT_SYMBOL(sk_run_filter); ---- linux-2.4.22-ac1/net/socket.c~socket-exports-2.4.22-rh 2003-08-25 15:44:44.000000000 +0400 -+++ linux-2.4.22-ac1-alexey/net/socket.c 2003-09-26 00:49:43.000000000 +0400 -@@ -325,7 +325,7 @@ static struct dentry_operations sockfs_d - * but we take care of internal coherence yet. - */ - --static int sock_map_fd(struct socket *sock) -+int sock_map_fd(struct socket *sock) - { - int fd; - struct qstr this; - -_ diff --git a/lustre/kernel_patches/patches/socket-exports-vanilla.patch b/lustre/kernel_patches/patches/socket-exports-vanilla.patch deleted file mode 100644 index 9dd5008caf..0000000000 --- a/lustre/kernel_patches/patches/socket-exports-vanilla.patch +++ /dev/null @@ -1,42 +0,0 @@ - include/linux/socket.h | 4 ++++ - net/netsyms.c | 2 ++ - net/socket.c | 2 +- - 3 files changed, 7 insertions(+), 1 deletion(-) - ---- linux-2.4.20-l18/include/linux/socket.h~socket-exports-vanilla Fri Aug 22 15:43:58 2003 -+++ linux-2.4.20-l18-phil/include/linux/socket.h Fri Aug 22 16:26:37 2003 -@@ -260,6 +260,10 @@ extern void memcpy_tokerneliovec(struct - extern int move_addr_to_user(void *kaddr, int klen, void *uaddr, int *ulen); - extern int move_addr_to_kernel(void *uaddr, int ulen, void *kaddr); - extern int put_cmsg(struct msghdr*, int level, int type, int len, void *data); -+struct socket; -+extern int sock_map_fd(struct socket *sock); -+extern struct socket *sockfd_lookup(int fd, int *err); -+ - #endif - #endif /* not kernel and not glibc */ - #endif /* _LINUX_SOCKET_H */ ---- linux-2.4.20-l18/net/netsyms.c~socket-exports-vanilla Fri Aug 22 15:43:58 2003 -+++ linux-2.4.20-l18-phil/net/netsyms.c Fri Aug 22 16:25:04 2003 -@@ -159,6 +159,8 @@ EXPORT_SYMBOL(datagram_poll); - EXPORT_SYMBOL(put_cmsg); - EXPORT_SYMBOL(sock_kmalloc); - EXPORT_SYMBOL(sock_kfree_s); -+EXPORT_SYMBOL(sockfd_lookup); -+EXPORT_SYMBOL(sock_map_fd); - - #ifdef CONFIG_FILTER - EXPORT_SYMBOL(sk_run_filter); ---- linux-2.4.20-l18/net/socket.c~socket-exports-vanilla Fri Aug 22 15:43:58 2003 -+++ linux-2.4.20-l18-phil/net/socket.c Fri Aug 22 16:25:04 2003 -@@ -325,7 +325,7 @@ static struct dentry_operations sockfs_d - * but we take care of internal coherence yet. - */ - --static int sock_map_fd(struct socket *sock) -+int sock_map_fd(struct socket *sock) - { - int fd; - struct qstr this; - -_ diff --git a/lustre/kernel_patches/patches/tcp-zero-copy-2.4.19-pre1.patch b/lustre/kernel_patches/patches/tcp-zero-copy-2.4.19-pre1.patch deleted file mode 100644 index bcd3f733aa..0000000000 --- a/lustre/kernel_patches/patches/tcp-zero-copy-2.4.19-pre1.patch +++ /dev/null @@ -1,461 +0,0 @@ -Index: linux-2.4.19-pre1/include/linux/skbuff.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/linux/skbuff.h 2001-11-22 22:46:26.000000000 +0300 -+++ linux-2.4.19-pre1/include/linux/skbuff.h 2004-01-14 01:15:13.000000000 +0300 -@@ -116,6 +116,30 @@ - __u16 size; - }; - -+/* Support for callback when skb data has been released */ -+typedef struct zccd /* Zero Copy Callback Descriptor */ -+{ /* (embed as first member of custom struct) */ -+ atomic_t zccd_count; /* reference count */ -+ void (*zccd_destructor)(struct zccd *); /* callback when refcount reaches zero */ -+} zccd_t; -+ -+static inline void zccd_init (zccd_t *d, void (*callback)(zccd_t *)) -+{ -+ atomic_set (&d->zccd_count, 1); -+ d->zccd_destructor = callback; -+} -+ -+static inline void zccd_get (zccd_t *d) /* take a reference */ -+{ -+ atomic_inc (&d->zccd_count); -+} -+ -+static inline void zccd_put (zccd_t *d) /* release a reference */ -+{ -+ if (atomic_dec_and_test (&d->zccd_count)) -+ (d->zccd_destructor)(d); -+} -+ - /* This data is invariant across clones and lives at - * the end of the header data, ie. at skb->end. - */ -@@ -123,6 +147,12 @@ - atomic_t dataref; - unsigned int nr_frags; - struct sk_buff *frag_list; -+ zccd_t *zccd; /* zero copy descriptor */ -+ zccd_t *zccd2; /* 2nd zero copy descriptor */ -+ /* NB we expect zero-copy data to be at least 1 packet, so -+ * having 2 zccds means we don't unneccessarily split the packet -+ * where consecutive zero-copy sends abutt. -+ */ - skb_frag_t frags[MAX_SKB_FRAGS]; - }; - -Index: linux-2.4.19-pre1/include/net/tcp.h -=================================================================== ---- linux-2.4.19-pre1.orig/include/net/tcp.h 2001-11-22 22:47:22.000000000 +0300 -+++ linux-2.4.19-pre1/include/net/tcp.h 2004-01-14 01:15:13.000000000 +0300 -@@ -640,6 +640,8 @@ - - extern int tcp_sendmsg(struct sock *sk, struct msghdr *msg, int size); - extern ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags); -+extern ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd); - - extern int tcp_ioctl(struct sock *sk, - int cmd, -@@ -733,6 +735,9 @@ - struct msghdr *msg, - int len, int nonblock, - int flags, int *addr_len); -+extern int tcp_recvpackets(struct sock *sk, -+ struct sk_buff_head *packets, -+ int len, int nonblock); - - extern int tcp_listen_start(struct sock *sk); - -Index: linux-2.4.19-pre1/net/netsyms.c -=================================================================== ---- linux-2.4.19-pre1.orig/net/netsyms.c 2004-01-14 01:10:37.000000000 +0300 -+++ linux-2.4.19-pre1/net/netsyms.c 2004-01-14 01:15:54.000000000 +0300 -@@ -409,6 +409,9 @@ - - #endif - -+EXPORT_SYMBOL(tcp_sendpage_zccd); -+EXPORT_SYMBOL(tcp_recvpackets); -+ - EXPORT_SYMBOL(netlink_set_err); - EXPORT_SYMBOL(netlink_broadcast); - EXPORT_SYMBOL(netlink_unicast); -Index: linux-2.4.19-pre1/net/core/skbuff.c -=================================================================== ---- linux-2.4.19-pre1.orig/net/core/skbuff.c 2001-12-21 20:42:05.000000000 +0300 -+++ linux-2.4.19-pre1/net/core/skbuff.c 2004-01-14 01:15:13.000000000 +0300 -@@ -208,6 +208,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* skbuffs kick off with NO user zero copy descriptors */ -+ skb_shinfo(skb)->zccd2 = NULL; - return skb; - - nodata: -@@ -276,6 +278,10 @@ - { - if (!skb->cloned || - atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) { -+ if (skb_shinfo(skb)->zccd != NULL) /* zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd); /* release hold */ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd2); /* release hold */ - if (skb_shinfo(skb)->nr_frags) { - int i; - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) -@@ -532,6 +538,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* copied data => no user zero copy descriptor */ -+ skb_shinfo(skb)->zccd2 = NULL; - - /* We are no longer a clone, even if we were. */ - skb->cloned = 0; -@@ -578,6 +586,14 @@ - n->data_len = skb->data_len; - n->len = skb->len; - -+ if (skb_shinfo(skb)->zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd = skb_shinfo(skb)->zccd; -+ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd2); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd2 = skb_shinfo(skb)->zccd2; -+ - if (skb_shinfo(skb)->nr_frags) { - int i; - -@@ -620,6 +636,8 @@ - u8 *data; - int size = nhead + (skb->end - skb->head) + ntail; - long off; -+ zccd_t *zccd = skb_shinfo(skb)->zccd; /* stash user zero copy descriptor */ -+ zccd_t *zccd2 = skb_shinfo(skb)->zccd2; /* stash 2nd user zero copy descriptor */ - - if (skb_shared(skb)) - BUG(); -@@ -641,6 +659,11 @@ - if (skb_shinfo(skb)->frag_list) - skb_clone_fraglist(skb); - -+ if (zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (zccd); /* extra ref (pages are shared) */ -+ if (zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (zccd2); /* extra ref (pages are shared) */ -+ - skb_release_data(skb); - - off = (data+nhead) - skb->head; -@@ -655,6 +678,8 @@ - skb->nh.raw += off; - skb->cloned = 0; - atomic_set(&skb_shinfo(skb)->dataref, 1); -+ skb_shinfo(skb)->zccd = zccd; -+ skb_shinfo(skb)->zccd2 = zccd2; - return 0; - - nodata: -Index: linux-2.4.19-pre1/net/ipv4/tcp.c -=================================================================== ---- linux-2.4.19-pre1.orig/net/ipv4/tcp.c 2001-12-21 20:42:05.000000000 +0300 -+++ linux-2.4.19-pre1/net/ipv4/tcp.c 2004-01-14 01:15:13.000000000 +0300 -@@ -744,7 +744,7 @@ - goto out; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags); -+ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd); - - static inline int - can_coalesce(struct sk_buff *skb, int i, struct page *page, int off) -@@ -823,7 +823,8 @@ - return err; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags) -+/* Extra parameter: user zero copy descriptor (or NULL if not doing that) */ -+ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd) - { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int mss_now; -@@ -871,6 +872,17 @@ - copy = size; - - i = skb_shinfo(skb)->nr_frags; -+ -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != NULL && /* skb is part of a zcc I/O */ -+ skb_shinfo(skb)->zccd2 != NULL && -+ skb_shinfo(skb)->zccd != zccd && /* not the same one */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ tcp_mark_push (tp, skb); -+ goto new_segment; -+ } -+ - if (can_coalesce(skb, i, page, offset)) { - skb_shinfo(skb)->frags[i-1].size += copy; - } else if (i < MAX_SKB_FRAGS) { -@@ -881,6 +893,20 @@ - goto new_segment; - } - -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != zccd && /* not already referencing this zccd */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ zccd_get (zccd); /* bump ref count */ -+ -+ BUG_TRAP (skb_shinfo(skb)->zccd2 == NULL); -+ -+ if (skb_shinfo(skb)->zccd == NULL) /* reference this zccd */ -+ skb_shinfo(skb)->zccd = zccd; -+ else -+ skb_shinfo(skb)->zccd2 = zccd; -+ } -+ - skb->len += copy; - skb->data_len += copy; - skb->ip_summed = CHECKSUM_HW; -@@ -944,7 +970,31 @@ - - lock_sock(sk); - TCP_CHECK_TIMER(sk); -- res = do_tcp_sendpages(sk, &page, offset, size, flags); -+ res = do_tcp_sendpages(sk, &page, offset, size, flags, NULL); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return res; -+} -+ -+ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd) -+{ -+ ssize_t res; -+ struct sock *sk = sock->sk; -+ -+#define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) -+ -+ if (!(sk->route_caps & NETIF_F_SG) || /* caller shouldn't waste her time */ -+ !(sk->route_caps & TCP_ZC_CSUM_FLAGS)) /* on double mapping */ -+ BUG (); -+ -+#undef TCP_ZC_CSUM_FLAGS -+ -+ lock_sock(sk); -+ TCP_CHECK_TIMER(sk); -+ -+ res = do_tcp_sendpages(sk, &page, offset, size, flags, zccd); -+ - TCP_CHECK_TIMER(sk); - release_sock(sk); - return res; -@@ -1683,6 +1733,202 @@ - goto out; - } - -+int tcp_recvpackets (struct sock *sk, struct sk_buff_head *packets, -+ int len, int nonblock) -+{ -+ struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); -+ int copied; -+ long timeo; -+ -+ BUG_TRAP (len > 0); -+ /*BUG_TRAP ((flags & (MSG_OOB | MSG_PEEK | MSG_TRUNC)) == 0);*/ -+ -+ lock_sock(sk); -+ -+ TCP_CHECK_TIMER(sk); -+ -+ copied = -ENOTCONN; -+ if (sk->state == TCP_LISTEN) -+ goto out; -+ -+ copied = 0; -+ timeo = sock_rcvtimeo(sk, nonblock); -+ -+ do { -+ struct sk_buff * skb; -+ u32 offset; -+ unsigned long used; -+ int exhausted; -+ int eaten; -+ -+ /* Are we at urgent data? Stop if we have read anything. */ -+ if (copied && tp->urg_data && tp->urg_seq == tp->copied_seq) -+ break; -+ -+ /* We need to check signals first, to get correct SIGURG -+ * handling. FIXME: Need to check this doesnt impact 1003.1g -+ * and move it down to the bottom of the loop -+ */ -+ if (signal_pending(current)) { -+ if (copied) -+ break; -+ copied = timeo ? sock_intr_errno(timeo) : -EAGAIN; -+ break; -+ } -+ -+ /* Next get a buffer. */ -+ -+ skb = skb_peek(&sk->receive_queue); -+ -+ if (skb == NULL) /* nothing ready */ -+ { -+ if (copied) { -+ if (sk->err || -+ sk->state == TCP_CLOSE || -+ (sk->shutdown & RCV_SHUTDOWN) || -+ !timeo || -+ (0)) -+ break; -+ } else { -+ if (sk->done) -+ break; -+ -+ if (sk->err) { -+ copied = sock_error(sk); -+ break; -+ } -+ -+ if (sk->shutdown & RCV_SHUTDOWN) -+ break; -+ -+ if (sk->state == TCP_CLOSE) { -+ if (!sk->done) { -+ /* This occurs when user tries to read -+ * from never connected socket. -+ */ -+ copied = -ENOTCONN; -+ break; -+ } -+ break; -+ } -+ -+ if (!timeo) { -+ copied = -EAGAIN; -+ break; -+ } -+ } -+ -+ cleanup_rbuf(sk, copied); -+ timeo = tcp_data_wait(sk, timeo); -+ continue; -+ } -+ -+ BUG_TRAP (atomic_read (&skb->users) == 1); -+ -+ exhausted = eaten = 0; -+ -+ offset = tp->copied_seq - TCP_SKB_CB(skb)->seq; -+ if (skb->h.th->syn) -+ offset--; -+ -+ used = skb->len - offset; -+ -+ if (tp->urg_data) { -+ u32 urg_offset = tp->urg_seq - tp->copied_seq; -+ if (urg_offset < used) { -+ if (!urg_offset) { /* at urgent date */ -+ if (!sk->urginline) { -+ tp->copied_seq++; /* discard the single byte of urgent data */ -+ offset++; -+ used--; -+ } -+ } else /* truncate read */ -+ used = urg_offset; -+ } -+ } -+ -+ BUG_TRAP (used >= 0); -+ if (len < used) -+ used = len; -+ -+ if (used == 0) -+ exhausted = 1; -+ else -+ { -+ if (skb_is_nonlinear (skb)) -+ { -+ int rc = skb_linearize (skb, GFP_KERNEL); -+ -+ printk ("tcp_recvpackets(): linearising: %d\n", rc); -+ -+ if (rc) -+ { -+ if (!copied) -+ copied = rc; -+ break; -+ } -+ } -+ -+ if ((offset + used) == skb->len) /* consuming the whole packet */ -+ { -+ __skb_unlink (skb, &sk->receive_queue); -+ dst_release (skb->dst); -+ skb_orphan (skb); -+ __skb_pull (skb, offset); -+ __skb_queue_tail (packets, skb); -+ exhausted = eaten = 1; -+ } -+ else /* consuming only part of the packet */ -+ { -+ struct sk_buff *skb2 = skb_clone (skb, GFP_KERNEL); -+ -+ if (skb2 == NULL) -+ { -+ if (!copied) -+ copied = -ENOMEM; -+ break; -+ } -+ -+ dst_release (skb2->dst); -+ __skb_pull (skb2, offset); -+ __skb_trim (skb2, used); -+ __skb_queue_tail (packets, skb2); -+ } -+ -+ tp->copied_seq += used; -+ copied += used; -+ len -= used; -+ } -+ -+ if (tp->urg_data && after(tp->copied_seq,tp->urg_seq)) { -+ tp->urg_data = 0; -+ tcp_fast_path_check(sk, tp); -+ } -+ -+ if (!exhausted) -+ continue; -+ -+ if (skb->h.th->fin) -+ { -+ tp->copied_seq++; -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ break; -+ } -+ -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ -+ } while (len > 0); -+ -+ out: -+ /* Clean up data we have read: This will do ACK frames. */ -+ cleanup_rbuf(sk, copied); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return copied; -+} -+ - /* - * State processing on a close. This implements the state shift for - * sending our FIN frame. Note that we only send a FIN for some diff --git a/lustre/kernel_patches/patches/tcp-zero-copy-2.4.21-sles8sp3.patch b/lustre/kernel_patches/patches/tcp-zero-copy-2.4.21-sles8sp3.patch deleted file mode 100644 index a7859bdb5e..0000000000 --- a/lustre/kernel_patches/patches/tcp-zero-copy-2.4.21-sles8sp3.patch +++ /dev/null @@ -1,458 +0,0 @@ -Index: linux-2.4.21/include/linux/skbuff.h -=================================================================== ---- linux-2.4.21.orig/include/linux/skbuff.h 2004-04-24 02:38:40.000000000 -0400 -+++ linux-2.4.21/include/linux/skbuff.h 2004-04-24 02:47:46.000000000 -0400 -@@ -116,6 +116,30 @@ - __u16 size; - }; - -+/* Support for callback when skb data has been released */ -+typedef struct zccd /* Zero Copy Callback Descriptor */ -+{ /* (embed as first member of custom struct) */ -+ atomic_t zccd_count; /* reference count */ -+ void (*zccd_destructor)(struct zccd *); /* callback when refcount reaches zero */ -+} zccd_t; -+ -+static inline void zccd_init (zccd_t *d, void (*callback)(zccd_t *)) -+{ -+ atomic_set (&d->zccd_count, 1); -+ d->zccd_destructor = callback; -+} -+ -+static inline void zccd_get (zccd_t *d) /* take a reference */ -+{ -+ atomic_inc (&d->zccd_count); -+} -+ -+static inline void zccd_put (zccd_t *d) /* release a reference */ -+{ -+ if (atomic_dec_and_test (&d->zccd_count)) -+ (d->zccd_destructor)(d); -+} -+ - /* This data is invariant across clones and lives at - * the end of the header data, ie. at skb->end. - */ -@@ -123,6 +147,12 @@ - atomic_t dataref; - unsigned int nr_frags; - struct sk_buff *frag_list; -+ zccd_t *zccd; /* zero copy descriptor */ -+ zccd_t *zccd2; /* 2nd zero copy descriptor */ -+ /* NB we expect zero-copy data to be at least 1 packet, so -+ * having 2 zccds means we don't unneccessarily split the packet -+ * where consecutive zero-copy sends abutt. -+ */ - skb_frag_t frags[MAX_SKB_FRAGS]; - }; - -Index: linux-2.4.21/include/net/tcp.h -=================================================================== ---- linux-2.4.21.orig/include/net/tcp.h 2004-04-24 02:39:20.000000000 -0400 -+++ linux-2.4.21/include/net/tcp.h 2004-04-24 02:48:27.000000000 -0400 -@@ -646,6 +646,8 @@ - - extern int tcp_sendmsg(struct sock *sk, struct msghdr *msg, int size); - extern ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags); -+extern ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd); - - extern int tcp_ioctl(struct sock *sk, - int cmd, -@@ -742,6 +744,10 @@ - struct msghdr *msg, - int len, int nonblock, - int flags, int *addr_len); -+extern int tcp_recvpackets(struct sock *sk, -+ struct sk_buff_head *packets, -+ int len, int nonblock); -+ - - extern int tcp_listen_start(struct sock *sk); - -Index: linux-2.4.21/net/netsyms.c -=================================================================== ---- linux-2.4.21.orig/net/netsyms.c 2004-04-24 02:39:13.000000000 -0400 -+++ linux-2.4.21/net/netsyms.c 2004-04-24 02:47:46.000000000 -0400 -@@ -403,6 +403,8 @@ - - #endif - -+EXPORT_SYMBOL(tcp_sendpage_zccd); -+EXPORT_SYMBOL(tcp_recvpackets); - EXPORT_SYMBOL(tcp_read_sock); - - EXPORT_SYMBOL(netlink_set_err); -Index: linux-2.4.21/net/core/skbuff.c -=================================================================== ---- linux-2.4.21.orig/net/core/skbuff.c 2004-04-24 02:38:40.000000000 -0400 -+++ linux-2.4.21/net/core/skbuff.c 2004-04-24 02:47:46.000000000 -0400 -@@ -208,6 +208,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* skbuffs kick off with NO user zero copy descriptors */ -+ skb_shinfo(skb)->zccd2 = NULL; - return skb; - - nodata: -@@ -277,6 +279,10 @@ - { - if (!skb->cloned || - atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) { -+ if (skb_shinfo(skb)->zccd != NULL) /* zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd); /* release hold */ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd2); /* release hold */ - if (skb_shinfo(skb)->nr_frags) { - int i; - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) -@@ -535,6 +541,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* copied data => no user zero copy descriptor */ -+ skb_shinfo(skb)->zccd2 = NULL; - - /* We are no longer a clone, even if we were. */ - skb->cloned = 0; -@@ -581,6 +589,14 @@ - n->data_len = skb->data_len; - n->len = skb->len; - -+ if (skb_shinfo(skb)->zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd = skb_shinfo(skb)->zccd; -+ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd2); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd2 = skb_shinfo(skb)->zccd2; -+ - if (skb_shinfo(skb)->nr_frags) { - int i; - -@@ -623,6 +639,8 @@ - u8 *data; - int size = nhead + (skb->end - skb->head) + ntail; - long off; -+ zccd_t *zccd = skb_shinfo(skb)->zccd; /* stash user zero copy descriptor */ -+ zccd_t *zccd2 = skb_shinfo(skb)->zccd2; /* stash 2nd user zero copy descriptor */ - - if (skb_shared(skb)) - BUG(); -@@ -644,6 +662,11 @@ - if (skb_shinfo(skb)->frag_list) - skb_clone_fraglist(skb); - -+ if (zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (zccd); /* extra ref (pages are shared) */ -+ if (zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (zccd2); /* extra ref (pages are shared) */ -+ - skb_release_data(skb); - - off = (data+nhead) - skb->head; -@@ -658,6 +681,8 @@ - skb->nh.raw += off; - skb->cloned = 0; - atomic_set(&skb_shinfo(skb)->dataref, 1); -+ skb_shinfo(skb)->zccd = zccd; -+ skb_shinfo(skb)->zccd2 = zccd2; - return 0; - - nodata: -Index: linux-2.4.21/net/ipv4/tcp.c -=================================================================== ---- linux-2.4.21.orig/net/ipv4/tcp.c 2004-04-24 02:39:21.000000000 -0400 -+++ linux-2.4.21/net/ipv4/tcp.c 2004-04-24 02:50:40.000000000 -0400 -@@ -748,7 +748,7 @@ - goto out; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags); -+ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd); - - static inline int - can_coalesce(struct sk_buff *skb, int i, struct page *page, int off) -@@ -827,7 +827,7 @@ - return err; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags) -+ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd) - { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int mss_now; -@@ -875,6 +875,17 @@ - copy = size; - - i = skb_shinfo(skb)->nr_frags; -+ -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != NULL && /* skb is part of a zcc I/O */ -+ skb_shinfo(skb)->zccd2 != NULL && -+ skb_shinfo(skb)->zccd != zccd && /* not the same one */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ tcp_mark_push (tp, skb); -+ goto new_segment; -+ } -+ - if (can_coalesce(skb, i, page, offset)) { - skb_shinfo(skb)->frags[i-1].size += copy; - } else if (i < MAX_SKB_FRAGS) { -@@ -885,6 +896,20 @@ - goto new_segment; - } - -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != zccd && /* not already referencing this zccd */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ zccd_get (zccd); /* bump ref count */ -+ -+ BUG_TRAP (skb_shinfo(skb)->zccd2 == NULL); -+ -+ if (skb_shinfo(skb)->zccd == NULL) /* reference this zccd */ -+ skb_shinfo(skb)->zccd = zccd; -+ else -+ skb_shinfo(skb)->zccd2 = zccd; -+ } -+ - skb->len += copy; - skb->data_len += copy; - skb->ip_summed = CHECKSUM_HW; -@@ -948,7 +973,29 @@ - - lock_sock(sk); - TCP_CHECK_TIMER(sk); -- res = do_tcp_sendpages(sk, &page, offset, size, flags); -+ res = do_tcp_sendpages(sk, &page, offset, size, flags, NULL); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return res; -+} -+ -+ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd) -+{ -+ ssize_t res; -+ struct sock *sk = sock->sk; -+ -+#define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) -+ -+ if (!(sk->route_caps & NETIF_F_SG) || /* caller shouldn't waste her time */ -+ !(sk->route_caps & TCP_ZC_CSUM_FLAGS)) /* on double mapping */ -+ BUG (); -+ -+ lock_sock(sk); -+ TCP_CHECK_TIMER(sk); -+ -+ res = do_tcp_sendpages(sk, &page, 0, size, flags, zccd); -+ - TCP_CHECK_TIMER(sk); - release_sock(sk); - return res; -@@ -1772,6 +1819,202 @@ - goto out; - } - -+int tcp_recvpackets (struct sock *sk, struct sk_buff_head *packets, -+ int len, int nonblock) -+{ -+ struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); -+ int copied; -+ long timeo; -+ -+ BUG_TRAP (len > 0); -+ /*BUG_TRAP ((flags & (MSG_OOB | MSG_PEEK | MSG_TRUNC)) == 0);*/ -+ -+ lock_sock(sk); -+ -+ TCP_CHECK_TIMER(sk); -+ -+ copied = -ENOTCONN; -+ if (sk->state == TCP_LISTEN) -+ goto out; -+ -+ copied = 0; -+ timeo = sock_rcvtimeo(sk, nonblock); -+ -+ do { -+ struct sk_buff * skb; -+ u32 offset; -+ unsigned long used; -+ int exhausted; -+ int eaten; -+ -+ /* Are we at urgent data? Stop if we have read anything. */ -+ if (copied && tp->urg_data && tp->urg_seq == tp->copied_seq) -+ break; -+ -+ /* We need to check signals first, to get correct SIGURG -+ * handling. FIXME: Need to check this doesnt impact 1003.1g -+ * and move it down to the bottom of the loop -+ */ -+ if (signal_pending(current)) { -+ if (copied) -+ break; -+ copied = timeo ? sock_intr_errno(timeo) : -EAGAIN; -+ break; -+ } -+ -+ /* Next get a buffer. */ -+ -+ skb = skb_peek(&sk->receive_queue); -+ -+ if (skb == NULL) /* nothing ready */ -+ { -+ if (copied) { -+ if (sk->err || -+ sk->state == TCP_CLOSE || -+ (sk->shutdown & RCV_SHUTDOWN) || -+ !timeo || -+ (0)) -+ break; -+ } else { -+ if (sk->done) -+ break; -+ -+ if (sk->err) { -+ copied = sock_error(sk); -+ break; -+ } -+ -+ if (sk->shutdown & RCV_SHUTDOWN) -+ break; -+ -+ if (sk->state == TCP_CLOSE) { -+ if (!sk->done) { -+ /* This occurs when user tries to read -+ * from never connected socket. -+ */ -+ copied = -ENOTCONN; -+ break; -+ } -+ break; -+ } -+ -+ if (!timeo) { -+ copied = -EAGAIN; -+ break; -+ } -+ } -+ -+ cleanup_rbuf(sk, copied); -+ timeo = tcp_data_wait(sk, timeo); -+ continue; -+ } -+ -+ BUG_TRAP (atomic_read (&skb->users) == 1); -+ -+ exhausted = eaten = 0; -+ -+ offset = tp->copied_seq - TCP_SKB_CB(skb)->seq; -+ if (skb->h.th->syn) -+ offset--; -+ -+ used = skb->len - offset; -+ -+ if (tp->urg_data) { -+ u32 urg_offset = tp->urg_seq - tp->copied_seq; -+ if (urg_offset < used) { -+ if (!urg_offset) { /* at urgent date */ -+ if (!sk->urginline) { -+ tp->copied_seq++; /* discard the single byte of urgent data */ -+ offset++; -+ used--; -+ } -+ } else /* truncate read */ -+ used = urg_offset; -+ } -+ } -+ -+ BUG_TRAP (used >= 0); -+ if (len < used) -+ used = len; -+ -+ if (used == 0) -+ exhausted = 1; -+ else -+ { -+ if (skb_is_nonlinear (skb)) -+ { -+ int rc = skb_linearize (skb, GFP_KERNEL); -+ -+ printk ("tcp_recvpackets(): linearising: %d\n", rc); -+ -+ if (rc) -+ { -+ if (!copied) -+ copied = rc; -+ break; -+ } -+ } -+ -+ if ((offset + used) == skb->len) /* consuming the whole packet */ -+ { -+ __skb_unlink (skb, &sk->receive_queue); -+ dst_release (skb->dst); -+ skb_orphan (skb); -+ __skb_pull (skb, offset); -+ __skb_queue_tail (packets, skb); -+ exhausted = eaten = 1; -+ } -+ else /* consuming only part of the packet */ -+ { -+ struct sk_buff *skb2 = skb_clone (skb, GFP_KERNEL); -+ -+ if (skb2 == NULL) -+ { -+ if (!copied) -+ copied = -ENOMEM; -+ break; -+ } -+ -+ dst_release (skb2->dst); -+ __skb_pull (skb2, offset); -+ __skb_trim (skb2, used); -+ __skb_queue_tail (packets, skb2); -+ } -+ -+ tp->copied_seq += used; -+ copied += used; -+ len -= used; -+ } -+ -+ if (tp->urg_data && after(tp->copied_seq,tp->urg_seq)) { -+ tp->urg_data = 0; -+ tcp_fast_path_check(sk, tp); -+ } -+ -+ if (!exhausted) -+ continue; -+ -+ if (skb->h.th->fin) -+ { -+ tp->copied_seq++; -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ break; -+ } -+ -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ -+ } while (len > 0); -+ -+ out: -+ /* Clean up data we have read: This will do ACK frames. */ -+ cleanup_rbuf(sk, copied); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return copied; -+} -+ - /* - * State processing on a close. This implements the state shift for - * sending our FIN frame. Note that we only send a FIN for some diff --git a/lustre/kernel_patches/patches/tcp-zero-copy-2.4.21-suse2.patch b/lustre/kernel_patches/patches/tcp-zero-copy-2.4.21-suse2.patch deleted file mode 100644 index f61bc0733d..0000000000 --- a/lustre/kernel_patches/patches/tcp-zero-copy-2.4.21-suse2.patch +++ /dev/null @@ -1,468 +0,0 @@ -Index: linux-2.4.21-suse2/include/linux/skbuff.h -=================================================================== ---- linux-2.4.21-suse2.orig/include/linux/skbuff.h 2004-01-10 12:48:50.000000000 +0300 -+++ linux-2.4.21-suse2/include/linux/skbuff.h 2004-01-10 16:31:03.000000000 +0300 -@@ -116,6 +116,30 @@ - __u16 size; - }; - -+/* Support for callback when skb data has been released */ -+typedef struct zccd /* Zero Copy Callback Descriptor */ -+{ /* (embed as first member of custom struct) */ -+ atomic_t zccd_count; /* reference count */ -+ void (*zccd_destructor)(struct zccd *); /* callback when refcount reaches zero */ -+} zccd_t; -+ -+static inline void zccd_init (zccd_t *d, void (*callback)(zccd_t *)) -+{ -+ atomic_set (&d->zccd_count, 1); -+ d->zccd_destructor = callback; -+} -+ -+static inline void zccd_get (zccd_t *d) /* take a reference */ -+{ -+ atomic_inc (&d->zccd_count); -+} -+ -+static inline void zccd_put (zccd_t *d) /* release a reference */ -+{ -+ if (atomic_dec_and_test (&d->zccd_count)) -+ (d->zccd_destructor)(d); -+} -+ - /* This data is invariant across clones and lives at - * the end of the header data, ie. at skb->end. - */ -@@ -123,6 +147,12 @@ - atomic_t dataref; - unsigned int nr_frags; - struct sk_buff *frag_list; -+ zccd_t *zccd; /* zero copy descriptor */ -+ zccd_t *zccd2; /* 2nd zero copy descriptor */ -+ /* NB we expect zero-copy data to be at least 1 packet, so -+ * having 2 zccds means we don't unneccessarily split the packet -+ * where consecutive zero-copy sends abutt. -+ */ - skb_frag_t frags[MAX_SKB_FRAGS]; - }; - -Index: linux-2.4.21-suse2/include/net/tcp.h -=================================================================== ---- linux-2.4.21-suse2.orig/include/net/tcp.h 2003-11-11 03:47:27.000000000 +0300 -+++ linux-2.4.21-suse2/include/net/tcp.h 2004-01-10 16:33:16.000000000 +0300 -@@ -644,6 +644,8 @@ - - extern int tcp_sendmsg(struct sock *sk, struct msghdr *msg, int size); - extern ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags); -+extern ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd); - - extern int tcp_ioctl(struct sock *sk, - int cmd, -@@ -740,6 +742,9 @@ - struct msghdr *msg, - int len, int nonblock, - int flags, int *addr_len); -+extern int tcp_recvpackets(struct sock *sk, -+ struct sk_buff_head *packets, -+ int len, int nonblock); - extern int tcp_kvec_read(struct sock *sk, kvec_cb_t cb, int len); - extern int tcp_kvec_write(struct sock *sk, kvec_cb_t cb, int len); - -Index: linux-2.4.21-suse2/net/netsyms.c -=================================================================== ---- linux-2.4.21-suse2.orig/net/netsyms.c 2003-10-28 21:34:24.000000000 +0300 -+++ linux-2.4.21-suse2/net/netsyms.c 2004-01-10 16:30:46.000000000 +0300 -@@ -403,6 +403,8 @@ - - #endif - -+EXPORT_SYMBOL(tcp_sendpage_zccd); -+EXPORT_SYMBOL(tcp_recvpackets); - EXPORT_SYMBOL(tcp_read_sock); - - EXPORT_SYMBOL(netlink_set_err); -Index: linux-2.4.21-suse2/net/core/skbuff.c -=================================================================== ---- linux-2.4.21-suse2.orig/net/core/skbuff.c 2003-11-07 02:54:26.000000000 +0300 -+++ linux-2.4.21-suse2/net/core/skbuff.c 2004-01-10 16:30:46.000000000 +0300 -@@ -208,6 +208,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* skbuffs kick off with NO user zero copy descriptors */ -+ skb_shinfo(skb)->zccd2 = NULL; - return skb; - - nodata: -@@ -277,6 +279,10 @@ - { - if (!skb->cloned || - atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) { -+ if (skb_shinfo(skb)->zccd != NULL) /* zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd); /* release hold */ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd2); /* release hold */ - if (skb_shinfo(skb)->nr_frags) { - int i; - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) -@@ -535,6 +541,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* copied data => no user zero copy descriptor */ -+ skb_shinfo(skb)->zccd2 = NULL; - - /* We are no longer a clone, even if we were. */ - skb->cloned = 0; -@@ -581,6 +589,14 @@ - n->data_len = skb->data_len; - n->len = skb->len; - -+ if (skb_shinfo(skb)->zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd = skb_shinfo(skb)->zccd; -+ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd2); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd2 = skb_shinfo(skb)->zccd2; -+ - if (skb_shinfo(skb)->nr_frags) { - int i; - -@@ -623,6 +639,8 @@ - u8 *data; - int size = nhead + (skb->end - skb->head) + ntail; - long off; -+ zccd_t *zccd = skb_shinfo(skb)->zccd; /* stash user zero copy descriptor */ -+ zccd_t *zccd2 = skb_shinfo(skb)->zccd2; /* stash 2nd user zero copy descriptor */ - - if (skb_shared(skb)) - BUG(); -@@ -644,6 +662,11 @@ - if (skb_shinfo(skb)->frag_list) - skb_clone_fraglist(skb); - -+ if (zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (zccd); /* extra ref (pages are shared) */ -+ if (zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (zccd2); /* extra ref (pages are shared) */ -+ - skb_release_data(skb); - - off = (data+nhead) - skb->head; -@@ -658,6 +681,8 @@ - skb->nh.raw += off; - skb->cloned = 0; - atomic_set(&skb_shinfo(skb)->dataref, 1); -+ skb_shinfo(skb)->zccd = zccd; -+ skb_shinfo(skb)->zccd2 = zccd2; - return 0; - - nodata: -Index: linux-2.4.21-suse2/net/ipv4/tcp.c -=================================================================== ---- linux-2.4.21-suse2.orig/net/ipv4/tcp.c 2003-10-28 21:34:09.000000000 +0300 -+++ linux-2.4.21-suse2/net/ipv4/tcp.c 2004-01-10 16:35:26.000000000 +0300 -@@ -1013,7 +1013,7 @@ - goto out; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct kveclet *let, int poffset, size_t psize, int flags); -+ssize_t do_tcp_sendpages(struct sock *sk, struct kveclet *let, int poffset, size_t psize, int flags, zccd_t *zccd); - - static inline int - can_coalesce(struct sk_buff *skb, int i, struct page *page, int off) -@@ -1092,7 +1092,8 @@ - return err; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct kveclet *let, int poffset, size_t psize, int flags) -+/* Extra parameter: user zero copy descriptor (or NULL if not doing that) */ -+ssize_t do_tcp_sendpages(struct sock *sk, struct kveclet *let, int poffset, size_t psize, int flags, zccd_t *zccd) - { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int mss_now; -@@ -1145,6 +1146,17 @@ - copy = size; - - i = skb_shinfo(skb)->nr_frags; -+ -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != NULL && /* skb is part of a zcc I/O */ -+ skb_shinfo(skb)->zccd2 != NULL && -+ skb_shinfo(skb)->zccd != zccd && /* not the same one */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ tcp_mark_push (tp, skb); -+ goto new_segment; -+ } -+ - if (can_coalesce(skb, i, page, offset)) { - skb_shinfo(skb)->frags[i-1].size += copy; - } else if (i < MAX_SKB_FRAGS) { -@@ -1155,6 +1167,20 @@ - goto new_segment; - } - -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != zccd && /* not already referencing this zccd */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ zccd_get (zccd); /* bump ref count */ -+ -+ BUG_TRAP (skb_shinfo(skb)->zccd2 == NULL); -+ -+ if (skb_shinfo(skb)->zccd == NULL) /* reference this zccd */ -+ skb_shinfo(skb)->zccd = zccd; -+ else -+ skb_shinfo(skb)->zccd2 = zccd; -+ } -+ - skb->len += copy; - skb->data_len += copy; - skb->ip_summed = CHECKSUM_HW; -@@ -1221,7 +1247,30 @@ - - lock_sock(sk); - TCP_CHECK_TIMER(sk); -- res = do_tcp_sendpages(sk, &let, 0, size, flags); -+ res = do_tcp_sendpages(sk, &let, 0, size, flags, NULL); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return res; -+} -+ -+ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd) -+{ -+ struct kveclet let = { page, offset, size }; -+ ssize_t res; -+ struct sock *sk = sock->sk; -+ -+#define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) -+ -+ if (!(sk->route_caps & NETIF_F_SG) || /* caller shouldn't waste her time */ -+ !(sk->route_caps & TCP_ZC_CSUM_FLAGS)) /* on double mapping */ -+ BUG (); -+ -+ lock_sock(sk); -+ TCP_CHECK_TIMER(sk); -+ -+ res = do_tcp_sendpages(sk, &let, 0, size, flags, zccd); -+ - TCP_CHECK_TIMER(sk); - release_sock(sk); - return res; -@@ -1235,7 +1284,7 @@ - !(sk->route_caps & TCP_ZC_CSUM_FLAGS)) - BUG(); - -- res = do_tcp_sendpages(sk, info->cur_let, info->offset, info->len - info->done, MSG_DONTWAIT); -+ res = do_tcp_sendpages(sk, info->cur_let, info->offset, info->len - info->done, MSG_DONTWAIT, NULL); - if (res > 0) - info->done += res; - -@@ -2084,6 +2133,202 @@ - goto out; - } - -+int tcp_recvpackets (struct sock *sk, struct sk_buff_head *packets, -+ int len, int nonblock) -+{ -+ struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); -+ int copied; -+ long timeo; -+ -+ BUG_TRAP (len > 0); -+ /*BUG_TRAP ((flags & (MSG_OOB | MSG_PEEK | MSG_TRUNC)) == 0);*/ -+ -+ lock_sock(sk); -+ -+ TCP_CHECK_TIMER(sk); -+ -+ copied = -ENOTCONN; -+ if (sk->state == TCP_LISTEN) -+ goto out; -+ -+ copied = 0; -+ timeo = sock_rcvtimeo(sk, nonblock); -+ -+ do { -+ struct sk_buff * skb; -+ u32 offset; -+ unsigned long used; -+ int exhausted; -+ int eaten; -+ -+ /* Are we at urgent data? Stop if we have read anything. */ -+ if (copied && tp->urg_data && tp->urg_seq == tp->copied_seq) -+ break; -+ -+ /* We need to check signals first, to get correct SIGURG -+ * handling. FIXME: Need to check this doesnt impact 1003.1g -+ * and move it down to the bottom of the loop -+ */ -+ if (signal_pending(current)) { -+ if (copied) -+ break; -+ copied = timeo ? sock_intr_errno(timeo) : -EAGAIN; -+ break; -+ } -+ -+ /* Next get a buffer. */ -+ -+ skb = skb_peek(&sk->receive_queue); -+ -+ if (skb == NULL) /* nothing ready */ -+ { -+ if (copied) { -+ if (sk->err || -+ sk->state == TCP_CLOSE || -+ (sk->shutdown & RCV_SHUTDOWN) || -+ !timeo || -+ (0)) -+ break; -+ } else { -+ if (sk->done) -+ break; -+ -+ if (sk->err) { -+ copied = sock_error(sk); -+ break; -+ } -+ -+ if (sk->shutdown & RCV_SHUTDOWN) -+ break; -+ -+ if (sk->state == TCP_CLOSE) { -+ if (!sk->done) { -+ /* This occurs when user tries to read -+ * from never connected socket. -+ */ -+ copied = -ENOTCONN; -+ break; -+ } -+ break; -+ } -+ -+ if (!timeo) { -+ copied = -EAGAIN; -+ break; -+ } -+ } -+ -+ cleanup_rbuf(sk, copied); -+ timeo = tcp_data_wait(sk, timeo); -+ continue; -+ } -+ -+ BUG_TRAP (atomic_read (&skb->users) == 1); -+ -+ exhausted = eaten = 0; -+ -+ offset = tp->copied_seq - TCP_SKB_CB(skb)->seq; -+ if (skb->h.th->syn) -+ offset--; -+ -+ used = skb->len - offset; -+ -+ if (tp->urg_data) { -+ u32 urg_offset = tp->urg_seq - tp->copied_seq; -+ if (urg_offset < used) { -+ if (!urg_offset) { /* at urgent date */ -+ if (!sk->urginline) { -+ tp->copied_seq++; /* discard the single byte of urgent data */ -+ offset++; -+ used--; -+ } -+ } else /* truncate read */ -+ used = urg_offset; -+ } -+ } -+ -+ BUG_TRAP (used >= 0); -+ if (len < used) -+ used = len; -+ -+ if (used == 0) -+ exhausted = 1; -+ else -+ { -+ if (skb_is_nonlinear (skb)) -+ { -+ int rc = skb_linearize (skb, GFP_KERNEL); -+ -+ printk ("tcp_recvpackets(): linearising: %d\n", rc); -+ -+ if (rc) -+ { -+ if (!copied) -+ copied = rc; -+ break; -+ } -+ } -+ -+ if ((offset + used) == skb->len) /* consuming the whole packet */ -+ { -+ __skb_unlink (skb, &sk->receive_queue); -+ dst_release (skb->dst); -+ skb_orphan (skb); -+ __skb_pull (skb, offset); -+ __skb_queue_tail (packets, skb); -+ exhausted = eaten = 1; -+ } -+ else /* consuming only part of the packet */ -+ { -+ struct sk_buff *skb2 = skb_clone (skb, GFP_KERNEL); -+ -+ if (skb2 == NULL) -+ { -+ if (!copied) -+ copied = -ENOMEM; -+ break; -+ } -+ -+ dst_release (skb2->dst); -+ __skb_pull (skb2, offset); -+ __skb_trim (skb2, used); -+ __skb_queue_tail (packets, skb2); -+ } -+ -+ tp->copied_seq += used; -+ copied += used; -+ len -= used; -+ } -+ -+ if (tp->urg_data && after(tp->copied_seq,tp->urg_seq)) { -+ tp->urg_data = 0; -+ tcp_fast_path_check(sk, tp); -+ } -+ -+ if (!exhausted) -+ continue; -+ -+ if (skb->h.th->fin) -+ { -+ tp->copied_seq++; -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ break; -+ } -+ -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ -+ } while (len > 0); -+ -+ out: -+ /* Clean up data we have read: This will do ACK frames. */ -+ cleanup_rbuf(sk, copied); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return copied; -+} -+ - /* - * State processing on a close. This implements the state shift for - * sending our FIN frame. Note that we only send a FIN for some diff --git a/lustre/kernel_patches/patches/tcp-zero-copy-2.4.22-rh.patch b/lustre/kernel_patches/patches/tcp-zero-copy-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/tcp-zero-copy-2.4.22-rh.patch rename to lustre/kernel_patches/patches/tcp-zero-copy-2.4.24.patch diff --git a/lustre/kernel_patches/patches/tcp-zero-copy.patch b/lustre/kernel_patches/patches/tcp-zero-copy.patch deleted file mode 100644 index 1f3972678e..0000000000 --- a/lustre/kernel_patches/patches/tcp-zero-copy.patch +++ /dev/null @@ -1,460 +0,0 @@ -Index: linux-2.4.20/include/linux/skbuff.h -=================================================================== ---- linux-2.4.20.orig/include/linux/skbuff.h 2003-05-16 05:28:45.000000000 +0400 -+++ linux-2.4.20/include/linux/skbuff.h 2003-12-04 20:56:32.000000000 +0300 -@@ -116,6 +116,30 @@ - __u16 size; - }; - -+/* Support for callback when skb data has been released */ -+typedef struct zccd /* Zero Copy Callback Descriptor */ -+{ /* (embed as first member of custom struct) */ -+ atomic_t zccd_count; /* reference count */ -+ void (*zccd_destructor)(struct zccd *); /* callback when refcount reaches zero */ -+} zccd_t; -+ -+static inline void zccd_init (zccd_t *d, void (*callback)(zccd_t *)) -+{ -+ atomic_set (&d->zccd_count, 1); -+ d->zccd_destructor = callback; -+} -+ -+static inline void zccd_get (zccd_t *d) /* take a reference */ -+{ -+ atomic_inc (&d->zccd_count); -+} -+ -+static inline void zccd_put (zccd_t *d) /* release a reference */ -+{ -+ if (atomic_dec_and_test (&d->zccd_count)) -+ (d->zccd_destructor)(d); -+} -+ - /* This data is invariant across clones and lives at - * the end of the header data, ie. at skb->end. - */ -@@ -123,6 +147,12 @@ - atomic_t dataref; - unsigned int nr_frags; - struct sk_buff *frag_list; -+ zccd_t *zccd; /* zero copy descriptor */ -+ zccd_t *zccd2; /* 2nd zero copy descriptor */ -+ /* NB we expect zero-copy data to be at least 1 packet, so -+ * having 2 zccds means we don't unneccessarily split the packet -+ * where consecutive zero-copy sends abutt. -+ */ - skb_frag_t frags[MAX_SKB_FRAGS]; - }; - -Index: linux-2.4.20/include/net/tcp.h -=================================================================== ---- linux-2.4.20.orig/include/net/tcp.h 2003-05-16 05:29:15.000000000 +0400 -+++ linux-2.4.20/include/net/tcp.h 2003-12-04 20:56:32.000000000 +0300 -@@ -638,6 +638,8 @@ - - extern int tcp_sendmsg(struct sock *sk, struct msghdr *msg, int size); - extern ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags); -+extern ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd); - - extern int tcp_ioctl(struct sock *sk, - int cmd, -@@ -731,6 +733,9 @@ - struct msghdr *msg, - int len, int nonblock, - int flags, int *addr_len); -+extern int tcp_recvpackets(struct sock *sk, -+ struct sk_buff_head *packets, -+ int len, int nonblock); - - extern int tcp_listen_start(struct sock *sk); - -Index: linux-2.4.20/net/netsyms.c -=================================================================== ---- linux-2.4.20.orig/net/netsyms.c 2003-05-16 05:29:15.000000000 +0400 -+++ linux-2.4.20/net/netsyms.c 2003-12-04 20:56:44.000000000 +0300 -@@ -408,6 +408,8 @@ - - #endif - -+EXPORT_SYMBOL(tcp_sendpage_zccd); -+EXPORT_SYMBOL(tcp_recvpackets); - EXPORT_SYMBOL(tcp_read_sock); - - EXPORT_SYMBOL(netlink_set_err); -Index: linux-2.4.20/net/core/skbuff.c -=================================================================== ---- linux-2.4.20.orig/net/core/skbuff.c 2003-05-16 05:28:46.000000000 +0400 -+++ linux-2.4.20/net/core/skbuff.c 2003-12-04 20:56:32.000000000 +0300 -@@ -208,6 +208,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* skbuffs kick off with NO user zero copy descriptors */ -+ skb_shinfo(skb)->zccd2 = NULL; - return skb; - - nodata: -@@ -276,6 +278,10 @@ - { - if (!skb->cloned || - atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) { -+ if (skb_shinfo(skb)->zccd != NULL) /* zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd); /* release hold */ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd2); /* release hold */ - if (skb_shinfo(skb)->nr_frags) { - int i; - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) -@@ -532,6 +538,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* copied data => no user zero copy descriptor */ -+ skb_shinfo(skb)->zccd2 = NULL; - - /* We are no longer a clone, even if we were. */ - skb->cloned = 0; -@@ -578,6 +586,14 @@ - n->data_len = skb->data_len; - n->len = skb->len; - -+ if (skb_shinfo(skb)->zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd = skb_shinfo(skb)->zccd; -+ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd2); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd2 = skb_shinfo(skb)->zccd2; -+ - if (skb_shinfo(skb)->nr_frags) { - int i; - -@@ -620,6 +636,8 @@ - u8 *data; - int size = nhead + (skb->end - skb->head) + ntail; - long off; -+ zccd_t *zccd = skb_shinfo(skb)->zccd; /* stash user zero copy descriptor */ -+ zccd_t *zccd2 = skb_shinfo(skb)->zccd2; /* stash 2nd user zero copy descriptor */ - - if (skb_shared(skb)) - BUG(); -@@ -641,6 +659,11 @@ - if (skb_shinfo(skb)->frag_list) - skb_clone_fraglist(skb); - -+ if (zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (zccd); /* extra ref (pages are shared) */ -+ if (zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (zccd2); /* extra ref (pages are shared) */ -+ - skb_release_data(skb); - - off = (data+nhead) - skb->head; -@@ -655,6 +678,8 @@ - skb->nh.raw += off; - skb->cloned = 0; - atomic_set(&skb_shinfo(skb)->dataref, 1); -+ skb_shinfo(skb)->zccd = zccd; -+ skb_shinfo(skb)->zccd2 = zccd2; - return 0; - - nodata: -Index: linux-2.4.20/net/ipv4/tcp.c -=================================================================== ---- linux-2.4.20.orig/net/ipv4/tcp.c 2003-05-16 05:29:15.000000000 +0400 -+++ linux-2.4.20/net/ipv4/tcp.c 2003-12-04 20:56:32.000000000 +0300 -@@ -745,7 +745,7 @@ - goto out; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags); -+ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd); - - static inline int - can_coalesce(struct sk_buff *skb, int i, struct page *page, int off) -@@ -824,7 +824,8 @@ - return err; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags) -+/* Extra parameter: user zero copy descriptor (or NULL if not doing that) */ -+ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd) - { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int mss_now; -@@ -872,6 +873,17 @@ - copy = size; - - i = skb_shinfo(skb)->nr_frags; -+ -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != NULL && /* skb is part of a zcc I/O */ -+ skb_shinfo(skb)->zccd2 != NULL && -+ skb_shinfo(skb)->zccd != zccd && /* not the same one */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ tcp_mark_push (tp, skb); -+ goto new_segment; -+ } -+ - if (can_coalesce(skb, i, page, offset)) { - skb_shinfo(skb)->frags[i-1].size += copy; - } else if (i < MAX_SKB_FRAGS) { -@@ -882,6 +894,20 @@ - goto new_segment; - } - -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != zccd && /* not already referencing this zccd */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ zccd_get (zccd); /* bump ref count */ -+ -+ BUG_TRAP (skb_shinfo(skb)->zccd2 == NULL); -+ -+ if (skb_shinfo(skb)->zccd == NULL) /* reference this zccd */ -+ skb_shinfo(skb)->zccd = zccd; -+ else -+ skb_shinfo(skb)->zccd2 = zccd; -+ } -+ - skb->len += copy; - skb->data_len += copy; - skb->ip_summed = CHECKSUM_HW; -@@ -945,7 +971,31 @@ - - lock_sock(sk); - TCP_CHECK_TIMER(sk); -- res = do_tcp_sendpages(sk, &page, offset, size, flags); -+ res = do_tcp_sendpages(sk, &page, offset, size, flags, NULL); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return res; -+} -+ -+ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd) -+{ -+ ssize_t res; -+ struct sock *sk = sock->sk; -+ -+#define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) -+ -+ if (!(sk->route_caps & NETIF_F_SG) || /* caller shouldn't waste her time */ -+ !(sk->route_caps & TCP_ZC_CSUM_FLAGS)) /* on double mapping */ -+ BUG (); -+ -+#undef TCP_ZC_CSUM_FLAGS -+ -+ lock_sock(sk); -+ TCP_CHECK_TIMER(sk); -+ -+ res = do_tcp_sendpages(sk, &page, offset, size, flags, zccd); -+ - TCP_CHECK_TIMER(sk); - release_sock(sk); - return res; -@@ -1769,6 +1819,202 @@ - goto out; - } - -+int tcp_recvpackets (struct sock *sk, struct sk_buff_head *packets, -+ int len, int nonblock) -+{ -+ struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); -+ int copied; -+ long timeo; -+ -+ BUG_TRAP (len > 0); -+ /*BUG_TRAP ((flags & (MSG_OOB | MSG_PEEK | MSG_TRUNC)) == 0);*/ -+ -+ lock_sock(sk); -+ -+ TCP_CHECK_TIMER(sk); -+ -+ copied = -ENOTCONN; -+ if (sk->state == TCP_LISTEN) -+ goto out; -+ -+ copied = 0; -+ timeo = sock_rcvtimeo(sk, nonblock); -+ -+ do { -+ struct sk_buff * skb; -+ u32 offset; -+ unsigned long used; -+ int exhausted; -+ int eaten; -+ -+ /* Are we at urgent data? Stop if we have read anything. */ -+ if (copied && tp->urg_data && tp->urg_seq == tp->copied_seq) -+ break; -+ -+ /* We need to check signals first, to get correct SIGURG -+ * handling. FIXME: Need to check this doesnt impact 1003.1g -+ * and move it down to the bottom of the loop -+ */ -+ if (signal_pending(current)) { -+ if (copied) -+ break; -+ copied = timeo ? sock_intr_errno(timeo) : -EAGAIN; -+ break; -+ } -+ -+ /* Next get a buffer. */ -+ -+ skb = skb_peek(&sk->receive_queue); -+ -+ if (skb == NULL) /* nothing ready */ -+ { -+ if (copied) { -+ if (sk->err || -+ sk->state == TCP_CLOSE || -+ (sk->shutdown & RCV_SHUTDOWN) || -+ !timeo || -+ (0)) -+ break; -+ } else { -+ if (sk->done) -+ break; -+ -+ if (sk->err) { -+ copied = sock_error(sk); -+ break; -+ } -+ -+ if (sk->shutdown & RCV_SHUTDOWN) -+ break; -+ -+ if (sk->state == TCP_CLOSE) { -+ if (!sk->done) { -+ /* This occurs when user tries to read -+ * from never connected socket. -+ */ -+ copied = -ENOTCONN; -+ break; -+ } -+ break; -+ } -+ -+ if (!timeo) { -+ copied = -EAGAIN; -+ break; -+ } -+ } -+ -+ cleanup_rbuf(sk, copied); -+ timeo = tcp_data_wait(sk, timeo); -+ continue; -+ } -+ -+ BUG_TRAP (atomic_read (&skb->users) == 1); -+ -+ exhausted = eaten = 0; -+ -+ offset = tp->copied_seq - TCP_SKB_CB(skb)->seq; -+ if (skb->h.th->syn) -+ offset--; -+ -+ used = skb->len - offset; -+ -+ if (tp->urg_data) { -+ u32 urg_offset = tp->urg_seq - tp->copied_seq; -+ if (urg_offset < used) { -+ if (!urg_offset) { /* at urgent date */ -+ if (!sk->urginline) { -+ tp->copied_seq++; /* discard the single byte of urgent data */ -+ offset++; -+ used--; -+ } -+ } else /* truncate read */ -+ used = urg_offset; -+ } -+ } -+ -+ BUG_TRAP (used >= 0); -+ if (len < used) -+ used = len; -+ -+ if (used == 0) -+ exhausted = 1; -+ else -+ { -+ if (skb_is_nonlinear (skb)) -+ { -+ int rc = skb_linearize (skb, GFP_KERNEL); -+ -+ printk ("tcp_recvpackets(): linearising: %d\n", rc); -+ -+ if (rc) -+ { -+ if (!copied) -+ copied = rc; -+ break; -+ } -+ } -+ -+ if ((offset + used) == skb->len) /* consuming the whole packet */ -+ { -+ __skb_unlink (skb, &sk->receive_queue); -+ dst_release (skb->dst); -+ skb_orphan (skb); -+ __skb_pull (skb, offset); -+ __skb_queue_tail (packets, skb); -+ exhausted = eaten = 1; -+ } -+ else /* consuming only part of the packet */ -+ { -+ struct sk_buff *skb2 = skb_clone (skb, GFP_KERNEL); -+ -+ if (skb2 == NULL) -+ { -+ if (!copied) -+ copied = -ENOMEM; -+ break; -+ } -+ -+ dst_release (skb2->dst); -+ __skb_pull (skb2, offset); -+ __skb_trim (skb2, used); -+ __skb_queue_tail (packets, skb2); -+ } -+ -+ tp->copied_seq += used; -+ copied += used; -+ len -= used; -+ } -+ -+ if (tp->urg_data && after(tp->copied_seq,tp->urg_seq)) { -+ tp->urg_data = 0; -+ tcp_fast_path_check(sk, tp); -+ } -+ -+ if (!exhausted) -+ continue; -+ -+ if (skb->h.th->fin) -+ { -+ tp->copied_seq++; -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ break; -+ } -+ -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ -+ } while (len > 0); -+ -+ out: -+ /* Clean up data we have read: This will do ACK frames. */ -+ cleanup_rbuf(sk, copied); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return copied; -+} -+ - /* - * State processing on a close. This implements the state shift for - * sending our FIN frame. Note that we only send a FIN for some diff --git a/lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch b/lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch deleted file mode 100644 index a64ecf95df..0000000000 --- a/lustre/kernel_patches/patches/tcp_zero_copy_2.4.20_chaos.patch +++ /dev/null @@ -1,476 +0,0 @@ - include/linux/skbuff.h | 30 +++++ - include/net/tcp.h | 5 - net/core/skbuff.c | 25 ++++ - net/ipv4/tcp.c | 252 ++++++++++++++++++++++++++++++++++++++++++++++++- - net/netsyms.c | 2 - 5 files changed, 311 insertions(+), 3 deletions(-) - -Index: linux-2.4.20-rh-20.9/include/linux/skbuff.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/linux/skbuff.h 2003-09-13 19:34:24.000000000 +0400 -+++ linux-2.4.20-rh-20.9/include/linux/skbuff.h 2003-12-19 14:14:55.000000000 +0300 -@@ -116,6 +116,30 @@ - __u16 size; - }; - -+/* Support for callback when skb data has been released */ -+typedef struct zccd /* Zero Copy Callback Descriptor */ -+{ /* (embed as first member of custom struct) */ -+ atomic_t zccd_count; /* reference count */ -+ void (*zccd_destructor)(struct zccd *); /* callback when refcount reaches zero */ -+} zccd_t; -+ -+static inline void zccd_init (zccd_t *d, void (*callback)(zccd_t *)) -+{ -+ atomic_set (&d->zccd_count, 1); -+ d->zccd_destructor = callback; -+} -+ -+static inline void zccd_get (zccd_t *d) /* take a reference */ -+{ -+ atomic_inc (&d->zccd_count); -+} -+ -+static inline void zccd_put (zccd_t *d) /* release a reference */ -+{ -+ if (atomic_dec_and_test (&d->zccd_count)) -+ (d->zccd_destructor)(d); -+} -+ - /* This data is invariant across clones and lives at - * the end of the header data, ie. at skb->end. - */ -@@ -123,6 +147,12 @@ - atomic_t dataref; - unsigned int nr_frags; - struct sk_buff *frag_list; -+ zccd_t *zccd; /* zero copy descriptor */ -+ zccd_t *zccd2; /* 2nd zero copy descriptor */ -+ /* NB we expect zero-copy data to be at least 1 packet, so -+ * having 2 zccds means we don't unneccessarily split the packet -+ * where consecutive zero-copy sends abutt. -+ */ - skb_frag_t frags[MAX_SKB_FRAGS]; - }; - -Index: linux-2.4.20-rh-20.9/include/net/tcp.h -=================================================================== ---- linux-2.4.20-rh-20.9.orig/include/net/tcp.h 2003-09-13 19:34:25.000000000 +0400 -+++ linux-2.4.20-rh-20.9/include/net/tcp.h 2003-12-19 14:14:55.000000000 +0300 -@@ -643,6 +643,8 @@ - - extern int tcp_sendmsg(struct sock *sk, struct msghdr *msg, int size); - extern ssize_t tcp_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags); -+extern ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd); - - extern int tcp_ioctl(struct sock *sk, - int cmd, -@@ -737,6 +739,9 @@ - struct msghdr *msg, - int len, int nonblock, - int flags, int *addr_len); -+extern int tcp_recvpackets(struct sock *sk, -+ struct sk_buff_head *packets, -+ int len, int nonblock); - - extern int tcp_listen_start(struct sock *sk); - -Index: linux-2.4.20-rh-20.9/net/netsyms.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/net/netsyms.c 2003-09-13 19:34:24.000000000 +0400 -+++ linux-2.4.20-rh-20.9/net/netsyms.c 2003-12-19 14:15:24.000000000 +0300 -@@ -396,7 +396,7 @@ - EXPORT_SYMBOL(sysctl_tcp_wmem); - EXPORT_SYMBOL(sysctl_tcp_ecn); - EXPORT_SYMBOL(tcp_cwnd_application_limited); --EXPORT_SYMBOL(tcp_sendpage); -+EXPORT_SYMBOL(tcp_recvpackets); - EXPORT_SYMBOL(sysctl_tcp_low_latency); - - EXPORT_SYMBOL(tcp_write_xmit); -@@ -417,6 +417,8 @@ - - #endif - -+EXPORT_SYMBOL(tcp_sendpage); -+EXPORT_SYMBOL(tcp_sendpage_zccd); - EXPORT_SYMBOL(tcp_read_sock); - - EXPORT_SYMBOL(netlink_set_err); -Index: linux-2.4.20-rh-20.9/net/core/skbuff.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/net/core/skbuff.c 2003-09-13 19:34:19.000000000 +0400 -+++ linux-2.4.20-rh-20.9/net/core/skbuff.c 2003-12-19 14:14:56.000000000 +0300 -@@ -208,6 +208,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* skbuffs kick off with NO user zero copy descriptors */ -+ skb_shinfo(skb)->zccd2 = NULL; - return skb; - - nodata: -@@ -276,6 +278,10 @@ - { - if (!skb->cloned || - atomic_dec_and_test(&(skb_shinfo(skb)->dataref))) { -+ if (skb_shinfo(skb)->zccd != NULL) /* zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd); /* release hold */ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd zero copy callback descriptor? */ -+ zccd_put (skb_shinfo(skb)->zccd2); /* release hold */ - if (skb_shinfo(skb)->nr_frags) { - int i; - for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) -@@ -532,6 +538,8 @@ - atomic_set(&(skb_shinfo(skb)->dataref), 1); - skb_shinfo(skb)->nr_frags = 0; - skb_shinfo(skb)->frag_list = NULL; -+ skb_shinfo(skb)->zccd = NULL; /* copied data => no user zero copy descriptor */ -+ skb_shinfo(skb)->zccd2 = NULL; - - /* We are no longer a clone, even if we were. */ - skb->cloned = 0; -@@ -578,6 +586,14 @@ - n->data_len = skb->data_len; - n->len = skb->len; - -+ if (skb_shinfo(skb)->zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd = skb_shinfo(skb)->zccd; -+ -+ if (skb_shinfo(skb)->zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (skb_shinfo(skb)->zccd2); /* 1 more ref (pages are shared) */ -+ skb_shinfo(n)->zccd2 = skb_shinfo(skb)->zccd2; -+ - if (skb_shinfo(skb)->nr_frags) { - int i; - -@@ -620,6 +636,8 @@ - u8 *data; - int size = nhead + (skb->end - skb->head) + ntail; - long off; -+ zccd_t *zccd = skb_shinfo(skb)->zccd; /* stash user zero copy descriptor */ -+ zccd_t *zccd2 = skb_shinfo(skb)->zccd2; /* stash 2nd user zero copy descriptor */ - - if (skb_shared(skb)) - BUG(); -@@ -641,6 +659,11 @@ - if (skb_shinfo(skb)->frag_list) - skb_clone_fraglist(skb); - -+ if (zccd != NULL) /* user zero copy descriptor? */ -+ zccd_get (zccd); /* extra ref (pages are shared) */ -+ if (zccd2 != NULL) /* 2nd user zero copy descriptor? */ -+ zccd_get (zccd2); /* extra ref (pages are shared) */ -+ - skb_release_data(skb); - - off = (data+nhead) - skb->head; -@@ -655,6 +678,8 @@ - skb->nh.raw += off; - skb->cloned = 0; - atomic_set(&skb_shinfo(skb)->dataref, 1); -+ skb_shinfo(skb)->zccd = zccd; -+ skb_shinfo(skb)->zccd2 = zccd2; - return 0; - - nodata: -Index: linux-2.4.20-rh-20.9/net/ipv4/tcp.c -=================================================================== ---- linux-2.4.20-rh-20.9.orig/net/ipv4/tcp.c 2003-09-13 19:34:25.000000000 +0400 -+++ linux-2.4.20-rh-20.9/net/ipv4/tcp.c 2003-12-19 14:14:56.000000000 +0300 -@@ -747,7 +747,7 @@ - goto out; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags); -+ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd); - - static inline int - can_coalesce(struct sk_buff *skb, int i, struct page *page, int off) -@@ -826,7 +826,8 @@ - return err; - } - --ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags) -+/* Extra parameter: user zero copy descriptor (or NULL if not doing that) */ -+ssize_t do_tcp_sendpages(struct sock *sk, struct page **pages, int poffset, size_t psize, int flags, zccd_t *zccd) - { - struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); - int mss_now; -@@ -874,6 +875,17 @@ - copy = size; - - i = skb_shinfo(skb)->nr_frags; -+ -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != NULL && /* skb is part of a zcc I/O */ -+ skb_shinfo(skb)->zccd2 != NULL && -+ skb_shinfo(skb)->zccd != zccd && /* not the same one */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ tcp_mark_push (tp, skb); -+ goto new_segment; -+ } -+ - if (can_coalesce(skb, i, page, offset)) { - skb_shinfo(skb)->frags[i-1].size += copy; - } else if (i < MAX_SKB_FRAGS) { -@@ -884,6 +896,20 @@ - goto new_segment; - } - -+ if (zccd != NULL && /* this is a zcc I/O */ -+ skb_shinfo(skb)->zccd != zccd && /* not already referencing this zccd */ -+ skb_shinfo(skb)->zccd2 != zccd) -+ { -+ zccd_get (zccd); /* bump ref count */ -+ -+ BUG_TRAP (skb_shinfo(skb)->zccd2 == NULL); -+ -+ if (skb_shinfo(skb)->zccd == NULL) /* reference this zccd */ -+ skb_shinfo(skb)->zccd = zccd; -+ else -+ skb_shinfo(skb)->zccd2 = zccd; -+ } -+ - skb->len += copy; - skb->data_len += copy; - skb->ip_summed = CHECKSUM_HW; -@@ -947,7 +973,31 @@ - - lock_sock(sk); - TCP_CHECK_TIMER(sk); -- res = do_tcp_sendpages(sk, &page, offset, size, flags); -+ res = do_tcp_sendpages(sk, &page, offset, size, flags, NULL); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return res; -+} -+ -+ssize_t tcp_sendpage_zccd(struct socket *sock, struct page *page, int offset, size_t size, -+ int flags, zccd_t *zccd) -+{ -+ ssize_t res; -+ struct sock *sk = sock->sk; -+ -+#define TCP_ZC_CSUM_FLAGS (NETIF_F_IP_CSUM|NETIF_F_NO_CSUM|NETIF_F_HW_CSUM) -+ -+ if (!(sk->route_caps & NETIF_F_SG) || /* caller shouldn't waste her time */ -+ !(sk->route_caps & TCP_ZC_CSUM_FLAGS)) /* on double mapping */ -+ BUG (); -+ -+#undef TCP_ZC_CSUM_FLAGS -+ -+ lock_sock(sk); -+ TCP_CHECK_TIMER(sk); -+ -+ res = do_tcp_sendpages(sk, &page, offset, size, flags, zccd); -+ - TCP_CHECK_TIMER(sk); - release_sock(sk); - return res; -@@ -1771,6 +1821,202 @@ - goto out; - } - -+int tcp_recvpackets (struct sock *sk, struct sk_buff_head *packets, -+ int len, int nonblock) -+{ -+ struct tcp_opt *tp = &(sk->tp_pinfo.af_tcp); -+ int copied; -+ long timeo; -+ -+ BUG_TRAP (len > 0); -+ /*BUG_TRAP ((flags & (MSG_OOB | MSG_PEEK | MSG_TRUNC)) == 0);*/ -+ -+ lock_sock(sk); -+ -+ TCP_CHECK_TIMER(sk); -+ -+ copied = -ENOTCONN; -+ if (sk->state == TCP_LISTEN) -+ goto out; -+ -+ copied = 0; -+ timeo = sock_rcvtimeo(sk, nonblock); -+ -+ do { -+ struct sk_buff * skb; -+ u32 offset; -+ unsigned long used; -+ int exhausted; -+ int eaten; -+ -+ /* Are we at urgent data? Stop if we have read anything. */ -+ if (copied && tp->urg_data && tp->urg_seq == tp->copied_seq) -+ break; -+ -+ /* We need to check signals first, to get correct SIGURG -+ * handling. FIXME: Need to check this doesnt impact 1003.1g -+ * and move it down to the bottom of the loop -+ */ -+ if (signal_pending(current)) { -+ if (copied) -+ break; -+ copied = timeo ? sock_intr_errno(timeo) : -EAGAIN; -+ break; -+ } -+ -+ /* Next get a buffer. */ -+ -+ skb = skb_peek(&sk->receive_queue); -+ -+ if (skb == NULL) /* nothing ready */ -+ { -+ if (copied) { -+ if (sk->err || -+ sk->state == TCP_CLOSE || -+ (sk->shutdown & RCV_SHUTDOWN) || -+ !timeo || -+ (0)) -+ break; -+ } else { -+ if (sk->done) -+ break; -+ -+ if (sk->err) { -+ copied = sock_error(sk); -+ break; -+ } -+ -+ if (sk->shutdown & RCV_SHUTDOWN) -+ break; -+ -+ if (sk->state == TCP_CLOSE) { -+ if (!sk->done) { -+ /* This occurs when user tries to read -+ * from never connected socket. -+ */ -+ copied = -ENOTCONN; -+ break; -+ } -+ break; -+ } -+ -+ if (!timeo) { -+ copied = -EAGAIN; -+ break; -+ } -+ } -+ -+ cleanup_rbuf(sk, copied); -+ timeo = tcp_data_wait(sk, timeo); -+ continue; -+ } -+ -+ BUG_TRAP (atomic_read (&skb->users) == 1); -+ -+ exhausted = eaten = 0; -+ -+ offset = tp->copied_seq - TCP_SKB_CB(skb)->seq; -+ if (skb->h.th->syn) -+ offset--; -+ -+ used = skb->len - offset; -+ -+ if (tp->urg_data) { -+ u32 urg_offset = tp->urg_seq - tp->copied_seq; -+ if (urg_offset < used) { -+ if (!urg_offset) { /* at urgent date */ -+ if (!sk->urginline) { -+ tp->copied_seq++; /* discard the single byte of urgent data */ -+ offset++; -+ used--; -+ } -+ } else /* truncate read */ -+ used = urg_offset; -+ } -+ } -+ -+ BUG_TRAP (used >= 0); -+ if (len < used) -+ used = len; -+ -+ if (used == 0) -+ exhausted = 1; -+ else -+ { -+ if (skb_is_nonlinear (skb)) -+ { -+ int rc = skb_linearize (skb, GFP_KERNEL); -+ -+ printk ("tcp_recvpackets(): linearising: %d\n", rc); -+ -+ if (rc) -+ { -+ if (!copied) -+ copied = rc; -+ break; -+ } -+ } -+ -+ if ((offset + used) == skb->len) /* consuming the whole packet */ -+ { -+ __skb_unlink (skb, &sk->receive_queue); -+ dst_release (skb->dst); -+ skb_orphan (skb); -+ __skb_pull (skb, offset); -+ __skb_queue_tail (packets, skb); -+ exhausted = eaten = 1; -+ } -+ else /* consuming only part of the packet */ -+ { -+ struct sk_buff *skb2 = skb_clone (skb, GFP_KERNEL); -+ -+ if (skb2 == NULL) -+ { -+ if (!copied) -+ copied = -ENOMEM; -+ break; -+ } -+ -+ dst_release (skb2->dst); -+ __skb_pull (skb2, offset); -+ __skb_trim (skb2, used); -+ __skb_queue_tail (packets, skb2); -+ } -+ -+ tp->copied_seq += used; -+ copied += used; -+ len -= used; -+ } -+ -+ if (tp->urg_data && after(tp->copied_seq,tp->urg_seq)) { -+ tp->urg_data = 0; -+ tcp_fast_path_check(sk, tp); -+ } -+ -+ if (!exhausted) -+ continue; -+ -+ if (skb->h.th->fin) -+ { -+ tp->copied_seq++; -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ break; -+ } -+ -+ if (!eaten) -+ tcp_eat_skb (sk, skb); -+ -+ } while (len > 0); -+ -+ out: -+ /* Clean up data we have read: This will do ACK frames. */ -+ cleanup_rbuf(sk, copied); -+ TCP_CHECK_TIMER(sk); -+ release_sock(sk); -+ return copied; -+} -+ - /* - * State processing on a close. This implements the state shift for - * sending our FIN frame. Note that we only send a FIN for some diff --git a/lustre/kernel_patches/patches/uml-2.4.20-do_mmap_pgoff-fix.patch b/lustre/kernel_patches/patches/uml-2.4.20-do_mmap_pgoff-fix.patch deleted file mode 100644 index 844d7354fa..0000000000 --- a/lustre/kernel_patches/patches/uml-2.4.20-do_mmap_pgoff-fix.patch +++ /dev/null @@ -1,16 +0,0 @@ - arch/i386/kernel/sys_i386.c | 2 +- - 1 files changed, 1 insertion(+), 1 deletion(-) - ---- linux-2.4.20-vanilla/arch/i386/kernel/sys_i386.c~uml-2.4.20-do_mmap_pgoff-fix 2001-03-19 23:35:09.000000000 +0300 -+++ linux-2.4.20-vanilla-alexey/arch/i386/kernel/sys_i386.c 2003-09-15 10:26:19.000000000 +0400 -@@ -56,7 +56,7 @@ static inline long do_mmap2( - } - - down_write(¤t->mm->mmap_sem); -- error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); -+ error = do_mmap_pgoff(current->mm, file, addr, len, prot, flags, pgoff); - up_write(¤t->mm->mmap_sem); - - if (file) - -_ diff --git a/lustre/kernel_patches/patches/uml-2.4.20-fixes-1.patch b/lustre/kernel_patches/patches/uml-2.4.20-fixes-1.patch deleted file mode 100644 index 6f4c8e3a49..0000000000 --- a/lustre/kernel_patches/patches/uml-2.4.20-fixes-1.patch +++ /dev/null @@ -1,215 +0,0 @@ - arch/um/kernel/process.c | 2 +- - arch/um/kernel/skas/process.c | 26 +++++++++++++------------- - arch/um/kernel/skas/syscall_kern.c | 3 ++- - arch/um/kernel/trap_user.c | 2 +- - arch/um/kernel/tt/syscall_kern.c | 3 ++- - arch/um/kernel/tt/uaccess_user.c | 2 +- - arch/um/kernel/uaccess_user.c | 2 +- - arch/um/link.ld.in | 1 - - 8 files changed, 21 insertions(+), 20 deletions(-) - -Index: linux-2.4.20/arch/um/link.ld.in -=================================================================== ---- linux-2.4.20.orig/arch/um/link.ld.in 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/link.ld.in 2003-10-25 00:36:02.000000000 +0400 -@@ -6,7 +6,6 @@ - { - . = START() + SIZEOF_HEADERS; - -- . = ALIGN(4096); - __binary_start = .; - ifdef(`MODE_TT', ` - .thread_private : { -Index: linux-2.4.20/arch/um/kernel/process.c -=================================================================== ---- linux-2.4.20.orig/arch/um/kernel/process.c 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/kernel/process.c 2003-10-25 00:36:02.000000000 +0400 -@@ -232,7 +232,7 @@ - int n; - - *jmp_ptr = &buf; -- n = setjmp(buf); -+ n = sigsetjmp(buf, 1); - if(n != 0) - return(n); - (*fn)(arg); -Index: linux-2.4.20/arch/um/kernel/skas/process.c -=================================================================== ---- linux-2.4.20.orig/arch/um/kernel/skas/process.c 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/kernel/skas/process.c 2003-10-25 00:36:02.000000000 +0400 -@@ -59,11 +59,11 @@ - int err, syscall_nr, status; - - syscall_nr = PT_SYSCALL_NR(regs->skas.regs); -+ UPT_SYSCALL_NR(regs) = syscall_nr; - if(syscall_nr < 1){ - relay_signal(SIGTRAP, regs); - return; - } -- UPT_SYSCALL_NR(regs) = syscall_nr; - - err = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid); - if(err < 0) -@@ -189,7 +189,7 @@ - *switch_buf_ptr = &switch_buf; - *fork_buf_ptr = &fork_buf; - -- if(setjmp(fork_buf) == 0) -+ if(sigsetjmp(fork_buf, 1) == 0) - new_thread_proc(stack, handler); - - remove_sigstack(); -@@ -201,8 +201,8 @@ - - *switch_buf = &buf; - fork_buf = fb; -- if(setjmp(buf) == 0) -- longjmp(*fork_buf, 1); -+ if(sigsetjmp(buf, 1) == 0) -+ siglongjmp(*fork_buf, 1); - } - - static int move_registers(int int_op, int fp_op, union uml_pt_regs *regs, -@@ -260,8 +260,8 @@ - jmp_buf my_buf, **me_ptr = me, *next_buf = next; - - *me_ptr = &my_buf; -- if(setjmp(my_buf) == 0) -- longjmp(*next_buf, 1); -+ if(sigsetjmp(my_buf, 1) == 0) -+ siglongjmp(*next_buf, 1); - } - - static jmp_buf initial_jmpbuf; -@@ -277,14 +277,14 @@ - int n; - - *fork_buf_ptr = &initial_jmpbuf; -- n = setjmp(initial_jmpbuf); -+ n = sigsetjmp(initial_jmpbuf, 1); - if(n == 0) - new_thread_proc((void *) stack, new_thread_handler); - else if(n == 1) - remove_sigstack(); - else if(n == 2){ - (*cb_proc)(cb_arg); -- longjmp(*cb_back, 1); -+ siglongjmp(*cb_back, 1); - } - else if(n == 3){ - kmalloc_ok = 0; -@@ -294,7 +294,7 @@ - kmalloc_ok = 0; - return(1); - } -- longjmp(**switch_buf, 1); -+ siglongjmp(**switch_buf, 1); - } - - void remove_sigstack(void) -@@ -316,8 +316,8 @@ - cb_back = &here; - - block_signals(); -- if(setjmp(here) == 0) -- longjmp(initial_jmpbuf, 2); -+ if(sigsetjmp(here, 1) == 0) -+ siglongjmp(initial_jmpbuf, 2); - unblock_signals(); - - cb_proc = NULL; -@@ -328,13 +328,13 @@ - void halt_skas(void) - { - block_signals(); -- longjmp(initial_jmpbuf, 3); -+ siglongjmp(initial_jmpbuf, 3); - } - - void reboot_skas(void) - { - block_signals(); -- longjmp(initial_jmpbuf, 4); -+ siglongjmp(initial_jmpbuf, 4); - } - - int new_mm(int from) -Index: linux-2.4.20/arch/um/kernel/skas/syscall_kern.c -=================================================================== ---- linux-2.4.20.orig/arch/um/kernel/skas/syscall_kern.c 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/kernel/skas/syscall_kern.c 2003-10-25 00:36:02.000000000 +0400 -@@ -23,7 +23,8 @@ - nsyscalls++; - syscall = UPT_SYSCALL_NR(®s->regs); - -- if((syscall >= NR_syscalls) || (syscall < 0)) -+ if((syscall >= NR_syscalls) || (syscall < 0) || -+ (sys_call_table[syscall] == NULL)) - res = -ENOSYS; - else res = EXECUTE_SYSCALL(syscall, regs); - -Index: linux-2.4.20/arch/um/kernel/trap_user.c -=================================================================== ---- linux-2.4.20.orig/arch/um/kernel/trap_user.c 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/kernel/trap_user.c 2003-10-25 00:36:02.000000000 +0400 -@@ -125,7 +125,7 @@ - { - jmp_buf *buf = b; - -- longjmp(*buf, val); -+ siglongjmp(*buf, val); - } - - /* -Index: linux-2.4.20/arch/um/kernel/tt/syscall_kern.c -=================================================================== ---- linux-2.4.20.orig/arch/um/kernel/tt/syscall_kern.c 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/kernel/tt/syscall_kern.c 2003-10-25 00:36:02.000000000 +0400 -@@ -113,7 +113,8 @@ - nsyscalls++; - syscall = UPT_SYSCALL_NR(®s->regs); - -- if((syscall >= NR_syscalls) || (syscall < 0)) -+ if((syscall >= NR_syscalls) || (syscall < 0) || -+ (sys_call_table[syscall] == NULL)) - res = -ENOSYS; - else if(honeypot && check_bogosity(regs)) - res = -EFAULT; -Index: linux-2.4.20/arch/um/kernel/tt/uaccess_user.c -=================================================================== ---- linux-2.4.20.orig/arch/um/kernel/tt/uaccess_user.c 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/kernel/tt/uaccess_user.c 2003-10-25 00:36:02.000000000 +0400 -@@ -75,7 +75,7 @@ - jmp_buf jbuf; - - *fault_catcher = &jbuf; -- if(setjmp(jbuf) == 0){ -+ if(sigsetjmp(jbuf, 1) == 0){ - ret = strlen(str) + 1; - } - else { -Index: linux-2.4.20/arch/um/kernel/uaccess_user.c -=================================================================== ---- linux-2.4.20.orig/arch/um/kernel/uaccess_user.c 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/kernel/uaccess_user.c 2003-10-25 00:36:02.000000000 +0400 -@@ -20,7 +20,7 @@ - - jmp_buf jbuf; - *fault_catcher = &jbuf; -- if(setjmp(jbuf) == 0){ -+ if(sigsetjmp(jbuf, 1) == 0){ - (*op)(to, from, n); - ret = 0; - *faulted_out = 0; -Index: linux-2.4.20/arch/um/kernel/tt/ptproxy/sysdep.c -=================================================================== ---- linux-2.4.20.orig/arch/um/kernel/tt/ptproxy/sysdep.c 2003-10-25 00:35:59.000000000 +0400 -+++ linux-2.4.20/arch/um/kernel/tt/ptproxy/sysdep.c 2003-10-25 00:36:23.000000000 +0400 -@@ -9,6 +9,7 @@ - #include <string.h> - #include <stdlib.h> - #include <signal.h> -+#include <errno.h> - #include <sys/types.h> - #include <sys/ptrace.h> - #include <asm/ptrace.h> diff --git a/lustre/kernel_patches/patches/uml-2.4.24-do_mmap_pgoff-fix.patch b/lustre/kernel_patches/patches/uml-2.4.24-do_mmap_pgoff-fix.patch new file mode 100644 index 0000000000..a44071e785 --- /dev/null +++ b/lustre/kernel_patches/patches/uml-2.4.24-do_mmap_pgoff-fix.patch @@ -0,0 +1,42 @@ +--- linux-2.4.20-vanilla/arch/i386/kernel/sys_i386.c~uml-2.4.20-do_mmap_pgoff-fix 2001-03-19 23:35:09.000000000 +0300 ++++ linux-2.4.20-vanilla-alexey/arch/i386/kernel/sys_i386.c 2003-09-15 10:26:19.000000000 +0400 +@@ -56,7 +56,7 @@ static inline long do_mmap2( + } + + down_write(¤t->mm->mmap_sem); +- error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff); ++ error = do_mmap_pgoff(current->mm, file, addr, len, prot, flags, pgoff); + up_write(¤t->mm->mmap_sem); + + if (file) +--- linux-2.4.24-vanilla/arch/x86_64/kernel/sys_x86_64.c 2004-10-15 12:19:54.919366416 -0400 ++++ linux-2.4.24-vanilla-x86_64/arch/x86_64/kernel/sys_x86_64.c 2003-11-28 13:26:19.000000000 -0500 +@@ -56,7 +56,7 @@ + } + + down_write(¤t->mm->mmap_sem); +- error = do_mmap_pgoff(file, addr, len, prot, flags, off >> PAGE_SHIFT); ++ error = do_mmap_pgoff(current->mm, file, addr, len, prot, flags, off >> PAGE_SHIFT); + up_write(¤t->mm->mmap_sem); + + if (file) +--- linux-2.4.24-vanilla/arch/x86_64/ia32/sys_ia32.c 2003-11-28 13:26:19.000000000 -0500 ++++ linux-2.4.24-vanilla-x86_64/arch/x86_64/ia32/sys_ia32.c 2004-10-15 12:36:52.114075768 -0400 +@@ -335,7 +335,7 @@ + + mm = current->mm; + down_write(&mm->mmap_sem); +- retval = do_mmap_pgoff(file, a.addr, a.len, a.prot, a.flags, a.offset>>PAGE_SHIFT); ++ retval = do_mmap_pgoff(current->mm, file, a.addr, a.len, a.prot, a.flags, a.offset>>PAGE_SHIFT); + if (file) + fput(file); + +@@ -2111,7 +2111,7 @@ + prot |= PROT_EXEC; + + down_write(&mm->mmap_sem); +- error = do_mmap_pgoff(file, addr, len, prot, flags|MAP_32BIT, pgoff); ++ error = do_mmap_pgoff(current->mm, file, addr, len, prot, flags|MAP_32BIT, pgoff); + up_write(&mm->mmap_sem); + + if (file) diff --git a/lustre/kernel_patches/patches/uml-2.6.7-01-bb2.patch b/lustre/kernel_patches/patches/uml-2.6.7-01-bb2.patch new file mode 100644 index 0000000000..f10484dc45 --- /dev/null +++ b/lustre/kernel_patches/patches/uml-2.6.7-01-bb2.patch @@ -0,0 +1,20390 @@ +Index: uml-2.6.7/arch/um/kernel/skas/trap_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/trap_user.c 2004-07-16 19:36:33.534048512 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/trap_user.c 2004-07-16 19:47:23.734203064 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2002 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -35,14 +35,10 @@ + errno = save_errno; + } + +-extern int missed_ticks[]; +- + void user_signal(int sig, union uml_pt_regs *regs) + { + struct signal_info *info; + +- if(sig == SIGVTALRM) +- missed_ticks[cpu()]++; + regs->skas.is_user = 1; + regs->skas.fault_addr = 0; + regs->skas.fault_type = 0; +Index: uml-2.6.7/arch/um/kernel/irq.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/irq.c 2004-07-16 19:37:20.013982488 +0300 ++++ uml-2.6.7/arch/um/kernel/irq.c 2004-07-16 19:47:23.717205648 +0300 +@@ -29,6 +29,7 @@ + #include "user_util.h" + #include "kern_util.h" + #include "irq_user.h" ++#include "irq_kern.h" + + static void register_irq_proc (unsigned int irq); + +@@ -83,65 +84,55 @@ + end_none + }; + +-/* Not changed */ +-volatile unsigned long irq_err_count; +- + /* + * Generic, controller-independent functions: + */ + +-int get_irq_list(char *buf) ++int show_interrupts(struct seq_file *p, void *v) + { +- int i, j; +- unsigned long flags; ++ int i = *(loff_t *) v, j; + struct irqaction * action; +- char *p = buf; ++ unsigned long flags; + +- p += sprintf(p, " "); +- for (j=0; j<num_online_cpus(); j++) +- p += sprintf(p, "CPU%d ",j); +- *p++ = '\n'; ++ if (i == 0) { ++ seq_printf(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++) { ++ if (i < NR_IRQS) { + spin_lock_irqsave(&irq_desc[i].lock, flags); + action = irq_desc[i].action; + if (!action) +- goto end; +- p += sprintf(p, "%3d: ",i); ++ goto skip; ++ seq_printf(p, "%3d: ",i); + #ifndef CONFIG_SMP +- p += sprintf(p, "%10u ", kstat_irqs(i)); ++ seq_printf(p, "%10u ", kstat_irqs(i)); + #else +- for (j = 0; j < num_online_cpus(); j++) +- p += sprintf(p, "%10u ", +- kstat_cpu(cpu_logical_map(j)).irqs[i]); ++ for (j = 0; j < NR_CPUS; j++) ++ if (cpu_online(j)) ++ seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]); + #endif +- p += sprintf(p, " %14s", irq_desc[i].handler->typename); +- p += sprintf(p, " %s", action->name); ++ seq_printf(p, " %14s", irq_desc[i].handler->typename); ++ seq_printf(p, " %s", action->name); + + for (action=action->next; action; action = action->next) +- p += sprintf(p, ", %s", action->name); +- *p++ = '\n'; +- end: ++ seq_printf(p, ", %s", action->name); ++ ++ seq_putc(p, '\n'); ++skip: + spin_unlock_irqrestore(&irq_desc[i].lock, flags); ++ } else if (i == NR_IRQS) { ++ seq_printf(p, "NMI: "); ++ for (j = 0; j < NR_CPUS; j++) ++ if (cpu_online(j)) ++ seq_printf(p, "%10u ", nmi_count(j)); ++ seq_putc(p, '\n'); + } +- p += sprintf(p, "\n"); +-#ifdef notdef +-#ifdef CONFIG_SMP +- p += sprintf(p, "LOC: "); +- for (j = 0; j < num_online_cpus(); j++) +- p += sprintf(p, "%10u ", +- apic_timer_irqs[cpu_logical_map(j)]); +- p += sprintf(p, "\n"); +-#endif +-#endif +- p += sprintf(p, "ERR: %10lu\n", irq_err_count); +- return p - buf; +-} +- + +-int show_interrupts(struct seq_file *p, void *v) +-{ +- return(0); ++ return 0; + } + + /* +@@ -282,13 +273,12 @@ + * 0 return value means that this irq is already being + * handled by some other CPU. (or is disabled) + */ +- int cpu = smp_processor_id(); + irq_desc_t *desc = irq_desc + irq; + struct irqaction * action; + unsigned int status; + + irq_enter(); +- kstat_cpu(cpu).irqs[irq]++; ++ kstat_this_cpu.irqs[irq]++; + spin_lock(&desc->lock); + desc->handler->ack(irq); + /* +@@ -385,7 +375,7 @@ + */ + + int request_irq(unsigned int irq, +- void (*handler)(int, void *, struct pt_regs *), ++ irqreturn_t (*handler)(int, void *, struct pt_regs *), + unsigned long irqflags, + const char * devname, + void *dev_id) +@@ -433,15 +423,19 @@ + EXPORT_SYMBOL(request_irq); + + int um_request_irq(unsigned int irq, int fd, int type, +- void (*handler)(int, void *, struct pt_regs *), ++ irqreturn_t (*handler)(int, void *, struct pt_regs *), + unsigned long irqflags, const char * devname, + void *dev_id) + { +- int retval; ++ int err; + +- retval = request_irq(irq, handler, irqflags, devname, dev_id); +- if(retval) return(retval); +- return(activate_fd(irq, fd, type, dev_id)); ++ err = request_irq(irq, handler, irqflags, devname, dev_id); ++ if(err) ++ return(err); ++ ++ if(fd != -1) ++ err = activate_fd(irq, fd, type, dev_id); ++ return(err); + } + + /* this was setup_x86_irq but it seems pretty generic */ +@@ -474,7 +468,8 @@ + */ + spin_lock_irqsave(&desc->lock,flags); + p = &desc->action; +- if ((old = *p) != NULL) { ++ old = *p; ++ if (old != NULL) { + /* Can't share interrupts unless both agree to */ + if (!(old->flags & new->flags & SA_SHIRQ)) { + spin_unlock_irqrestore(&desc->lock,flags); +@@ -586,12 +581,14 @@ + unsigned long count, void *data) + { + int irq = (long) data, full_count = count, err; +- cpumask_t new_value, tmp; ++ cpumask_t new_value; + + if (!irq_desc[irq].handler->set_affinity) + return -EIO; + + err = cpumask_parse(buffer, count, new_value); ++ if(err) ++ return(err); + + #ifdef CONFIG_SMP + /* +@@ -599,9 +596,11 @@ + * way to make the system unusable accidentally :-) At least + * one online CPU still has to be targeted. + */ +- cpus_and(tmp, new_value, cpu_online_map); +- if (cpus_empty(tmp)) +- return -EINVAL; ++ { cpumask_t tmp; ++ cpus_and(tmp, new_value, cpu_online_map); ++ if (cpus_empty(tmp)) ++ return -EINVAL; ++ } + #endif + + irq_affinity[irq] = new_value; +Index: uml-2.6.7/arch/um/drivers/chan_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/chan_user.c 2004-07-16 19:35:52.587273368 +0300 ++++ uml-2.6.7/arch/um/drivers/chan_user.c 2004-07-16 19:47:24.392103048 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -7,7 +7,6 @@ + #include <stdlib.h> + #include <errno.h> + #include <termios.h> +-#include <fcntl.h> + #include <string.h> + #include <signal.h> + #include <sys/stat.h> +@@ -22,33 +21,6 @@ + #include "choose-mode.h" + #include "mode.h" + +-void generic_close(int fd, void *unused) +-{ +- close(fd); +-} +- +-int generic_read(int fd, char *c_out, void *unused) +-{ +- int n; +- +- n = read(fd, c_out, sizeof(*c_out)); +- if(n < 0){ +- if(errno == EAGAIN) return(0); +- return(-errno); +- } +- else if(n == 0) return(-EIO); +- return(1); +-} +- +-int generic_write(int fd, const char *buf, int n, void *unused) +-{ +- int count; +- +- count = write(fd, buf, n); +- if(count < 0) return(-errno); +- return(count); +-} +- + int generic_console_write(int fd, const char *buf, int n, void *unused) + { + struct termios save, new; +@@ -65,26 +37,6 @@ + return(err); + } + +-int generic_window_size(int fd, void *unused, unsigned short *rows_out, +- unsigned short *cols_out) +-{ +- struct winsize size; +- int ret = 0; +- +- if(ioctl(fd, TIOCGWINSZ, &size) == 0){ +- ret = ((*rows_out != size.ws_row) || +- (*cols_out != size.ws_col)); +- *rows_out = size.ws_row; +- *cols_out = size.ws_col; +- } +- return(ret); +-} +- +-void generic_free(void *data) +-{ +- kfree(data); +-} +- + static void winch_handler(int sig) + { + } +@@ -100,14 +52,16 @@ + struct winch_data *data = arg; + sigset_t sigs; + int pty_fd, pipe_fd; ++ int count, err; + char c = 1; + +- close(data->close_me); ++ os_close_file(data->close_me); + pty_fd = data->pty_fd; + pipe_fd = data->pipe_fd; +- if(write(pipe_fd, &c, sizeof(c)) != sizeof(c)) ++ count = os_write_file(pipe_fd, &c, sizeof(c)); ++ if(count != sizeof(c)) + printk("winch_thread : failed to write synchronization " +- "byte, errno = %d\n", errno); ++ "byte, err = %d\n", -count); + + signal(SIGWINCH, winch_handler); + sigfillset(&sigs); +@@ -123,26 +77,24 @@ + exit(1); + } + +- if(ioctl(pty_fd, TIOCSCTTY, 0) < 0){ +- printk("winch_thread : TIOCSCTTY failed, errno = %d\n", errno); +- exit(1); +- } +- if(tcsetpgrp(pty_fd, os_getpid()) < 0){ +- printk("winch_thread : tcsetpgrp failed, errno = %d\n", errno); ++ err = os_new_tty_pgrp(pty_fd, os_getpid()); ++ if(err < 0){ ++ printk("winch_thread : new_tty_pgrp failed, err = %d\n", -err); + exit(1); + } + +- if(read(pipe_fd, &c, sizeof(c)) != sizeof(c)) ++ count = os_read_file(pipe_fd, &c, sizeof(c)); ++ if(count != sizeof(c)) + printk("winch_thread : failed to read synchronization byte, " +- "errno = %d\n", errno); ++ "err = %d\n", -count); + + while(1){ + pause(); + +- if(write(pipe_fd, &c, sizeof(c)) != sizeof(c)){ +- printk("winch_thread : write failed, errno = %d\n", +- errno); +- } ++ count = os_write_file(pipe_fd, &c, sizeof(c)); ++ if(count != sizeof(c)) ++ printk("winch_thread : write failed, err = %d\n", ++ -count); + } + } + +@@ -154,8 +106,8 @@ + char c; + + err = os_pipe(fds, 1, 1); +- if(err){ +- printk("winch_tramp : os_pipe failed, errno = %d\n", -err); ++ if(err < 0){ ++ printk("winch_tramp : os_pipe failed, err = %d\n", -err); + return(err); + } + +@@ -168,12 +120,12 @@ + return(pid); + } + +- close(fds[1]); ++ os_close_file(fds[1]); + *fd_out = fds[0]; +- n = read(fds[0], &c, sizeof(c)); ++ n = os_read_file(fds[0], &c, sizeof(c)); + if(n != sizeof(c)){ + printk("winch_tramp : failed to read synchronization byte\n"); +- printk("read returned %d, errno = %d\n", n, errno); ++ printk("read failed, err = %d\n", -n); + printk("fd %d will not support SIGWINCH\n", fd); + *fd_out = -1; + } +@@ -183,20 +135,24 @@ + void register_winch(int fd, void *device_data) + { + int pid, thread, thread_fd; ++ int count; + char c = 1; + +- if(!isatty(fd)) return; ++ if(!isatty(fd)) ++ return; + + pid = tcgetpgrp(fd); +- if(!CHOOSE_MODE(is_tracer_winch(pid, fd, device_data), 0) && +- (pid == -1)){ ++ if(!CHOOSE_MODE_PROC(is_tracer_winch, is_skas_winch, pid, fd, ++ device_data) && (pid == -1)){ + thread = winch_tramp(fd, device_data, &thread_fd); + if(fd != -1){ + register_winch_irq(thread_fd, fd, thread, device_data); + +- if(write(thread_fd, &c, sizeof(c)) != sizeof(c)) ++ count = os_write_file(thread_fd, &c, sizeof(c)); ++ if(count != sizeof(c)) + printk("register_winch : failed to write " +- "synchronization byte\n"); ++ "synchronization byte, err = %d\n", ++ -count); + } + } + } +Index: uml-2.6.7/arch/um/drivers/cow_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/cow_user.c 2004-07-16 19:47:23.608222216 +0300 ++++ uml-2.6.7/arch/um/drivers/cow_user.c 2004-07-16 19:47:23.680211272 +0300 +@@ -0,0 +1,375 @@ ++#include <stddef.h> ++#include <string.h> ++#include <errno.h> ++#include <unistd.h> ++#include <byteswap.h> ++#include <sys/time.h> ++#include <sys/param.h> ++#include <sys/user.h> ++#include <netinet/in.h> ++ ++#include "os.h" ++ ++#include "cow.h" ++#include "cow_sys.h" ++ ++#define PATH_LEN_V1 256 ++ ++struct cow_header_v1 { ++ int magic; ++ int version; ++ char backing_file[PATH_LEN_V1]; ++ time_t mtime; ++ __u64 size; ++ int sectorsize; ++}; ++ ++#define PATH_LEN_V2 MAXPATHLEN ++ ++struct cow_header_v2 { ++ unsigned long magic; ++ unsigned long version; ++ char backing_file[PATH_LEN_V2]; ++ time_t mtime; ++ __u64 size; ++ int sectorsize; ++}; ++ ++/* Define PATH_LEN_V3 as the usual value of MAXPATHLEN, just hard-code it in ++ * case other systems have different values for MAXPATHLEN ++ */ ++#define PATH_LEN_V3 4096 ++ ++/* Changes from V2 - ++ * PATH_LEN_V3 as described above ++ * Explicitly specify field bit lengths for systems with different ++ * lengths for the usual C types. Not sure whether char or ++ * time_t should be changed, this can be changed later without ++ * breaking compatibility ++ * Add alignment field so that different alignments can be used for the ++ * bitmap and data ++ * Add cow_format field to allow for the possibility of different ways ++ * of specifying the COW blocks. For now, the only value is 0, ++ * for the traditional COW bitmap. ++ * Move the backing_file field to the end of the header. This allows ++ * for the possibility of expanding it into the padding required ++ * by the bitmap alignment. ++ * The bitmap and data portions of the file will be aligned as specified ++ * by the alignment field. This is to allow COW files to be ++ * put on devices with restrictions on access alignments, such as ++ * /dev/raw, with a 512 byte alignment restriction. This also ++ * allows the data to be more aligned more strictly than on ++ * sector boundaries. This is needed for ubd-mmap, which needs ++ * the data to be page aligned. ++ * Fixed (finally!) the rounding bug ++ */ ++ ++struct cow_header_v3 { ++ __u32 magic; ++ __u32 version; ++ time_t mtime; ++ __u64 size; ++ __u32 sectorsize; ++ __u32 alignment; ++ __u32 cow_format; ++ char backing_file[PATH_LEN_V3]; ++}; ++ ++/* COW format definitions - for now, we have only the usual COW bitmap */ ++#define COW_BITMAP 0 ++ ++union cow_header { ++ struct cow_header_v1 v1; ++ struct cow_header_v2 v2; ++ struct cow_header_v3 v3; ++}; ++ ++#define COW_MAGIC 0x4f4f4f4d /* MOOO */ ++#define COW_VERSION 3 ++ ++#define DIV_ROUND(x, len) (((x) + (len) - 1) / (len)) ++#define ROUND_UP(x, align) DIV_ROUND(x, align) * (align) ++ ++void cow_sizes(int version, __u64 size, int sectorsize, int align, ++ int bitmap_offset, unsigned long *bitmap_len_out, ++ int *data_offset_out) ++{ ++ if(version < 3){ ++ *bitmap_len_out = (size + sectorsize - 1) / (8 * sectorsize); ++ ++ *data_offset_out = bitmap_offset + *bitmap_len_out; ++ *data_offset_out = (*data_offset_out + sectorsize - 1) / ++ sectorsize; ++ *data_offset_out *= sectorsize; ++ } ++ else { ++ *bitmap_len_out = DIV_ROUND(size, sectorsize); ++ *bitmap_len_out = DIV_ROUND(*bitmap_len_out, 8); ++ ++ *data_offset_out = bitmap_offset + *bitmap_len_out; ++ *data_offset_out = ROUND_UP(*data_offset_out, align); ++ } ++} ++ ++static int absolutize(char *to, int size, char *from) ++{ ++ char save_cwd[256], *slash; ++ int remaining; ++ ++ if(getcwd(save_cwd, sizeof(save_cwd)) == NULL) { ++ cow_printf("absolutize : unable to get cwd - errno = %d\n", ++ errno); ++ return(-1); ++ } ++ slash = strrchr(from, '/'); ++ if(slash != NULL){ ++ *slash = '\0'; ++ if(chdir(from)){ ++ *slash = '/'; ++ cow_printf("absolutize : Can't cd to '%s' - " ++ "errno = %d\n", from, errno); ++ return(-1); ++ } ++ *slash = '/'; ++ if(getcwd(to, size) == NULL){ ++ cow_printf("absolutize : unable to get cwd of '%s' - " ++ "errno = %d\n", from, errno); ++ return(-1); ++ } ++ remaining = size - strlen(to); ++ if(strlen(slash) + 1 > remaining){ ++ cow_printf("absolutize : unable to fit '%s' into %d " ++ "chars\n", from, size); ++ return(-1); ++ } ++ strcat(to, slash); ++ } ++ else { ++ if(strlen(save_cwd) + 1 + strlen(from) + 1 > size){ ++ cow_printf("absolutize : unable to fit '%s' into %d " ++ "chars\n", from, size); ++ return(-1); ++ } ++ strcpy(to, save_cwd); ++ strcat(to, "/"); ++ strcat(to, from); ++ } ++ chdir(save_cwd); ++ return(0); ++} ++ ++int write_cow_header(char *cow_file, int fd, char *backing_file, ++ int sectorsize, int alignment, long long *size) ++{ ++ struct cow_header_v3 *header; ++ unsigned long modtime; ++ int err; ++ ++ err = cow_seek_file(fd, 0); ++ if(err < 0){ ++ cow_printf("write_cow_header - lseek failed, err = %d\n", -err); ++ goto out; ++ } ++ ++ err = -ENOMEM; ++ header = cow_malloc(sizeof(*header)); ++ if(header == NULL){ ++ cow_printf("Failed to allocate COW V3 header\n"); ++ goto out; ++ } ++ header->magic = htonl(COW_MAGIC); ++ header->version = htonl(COW_VERSION); ++ ++ err = -EINVAL; ++ if(strlen(backing_file) > sizeof(header->backing_file) - 1){ ++ cow_printf("Backing file name \"%s\" is too long - names are " ++ "limited to %d characters\n", backing_file, ++ sizeof(header->backing_file) - 1); ++ goto out_free; ++ } ++ ++ if(absolutize(header->backing_file, sizeof(header->backing_file), ++ backing_file)) ++ goto out_free; ++ ++ err = os_file_modtime(header->backing_file, &modtime); ++ if(err < 0){ ++ cow_printf("Backing file '%s' mtime request failed, " ++ "err = %d\n", header->backing_file, -err); ++ goto out_free; ++ } ++ ++ err = cow_file_size(header->backing_file, size); ++ if(err < 0){ ++ cow_printf("Couldn't get size of backing file '%s', " ++ "err = %d\n", header->backing_file, -err); ++ goto out_free; ++ } ++ ++ header->mtime = htonl(modtime); ++ header->size = htonll(*size); ++ header->sectorsize = htonl(sectorsize); ++ header->alignment = htonl(alignment); ++ header->cow_format = COW_BITMAP; ++ ++ err = os_write_file(fd, header, sizeof(*header)); ++ if(err != sizeof(*header)){ ++ cow_printf("Write of header to new COW file '%s' failed, " ++ "err = %d\n", cow_file, -err); ++ goto out_free; ++ } ++ err = 0; ++ out_free: ++ cow_free(header); ++ out: ++ return(err); ++} ++ ++int file_reader(__u64 offset, char *buf, int len, void *arg) ++{ ++ int fd = *((int *) arg); ++ ++ return(pread(fd, buf, len, offset)); ++} ++ ++/* XXX Need to sanity-check the values read from the header */ ++ ++int read_cow_header(int (*reader)(__u64, char *, int, void *), void *arg, ++ __u32 *version_out, char **backing_file_out, ++ time_t *mtime_out, __u64 *size_out, ++ int *sectorsize_out, __u32 *align_out, ++ int *bitmap_offset_out) ++{ ++ union cow_header *header; ++ char *file; ++ int err, n; ++ unsigned long version, magic; ++ ++ header = cow_malloc(sizeof(*header)); ++ if(header == NULL){ ++ cow_printf("read_cow_header - Failed to allocate header\n"); ++ return(-ENOMEM); ++ } ++ err = -EINVAL; ++ n = (*reader)(0, (char *) header, sizeof(*header), arg); ++ if(n < offsetof(typeof(header->v1), backing_file)){ ++ cow_printf("read_cow_header - short header\n"); ++ goto out; ++ } ++ ++ magic = header->v1.magic; ++ if(magic == COW_MAGIC) { ++ version = header->v1.version; ++ } ++ else if(magic == ntohl(COW_MAGIC)){ ++ version = ntohl(header->v1.version); ++ } ++ /* No error printed because the non-COW case comes through here */ ++ else goto out; ++ ++ *version_out = version; ++ ++ if(version == 1){ ++ if(n < sizeof(header->v1)){ ++ cow_printf("read_cow_header - failed to read V1 " ++ "header\n"); ++ goto out; ++ } ++ *mtime_out = header->v1.mtime; ++ *size_out = header->v1.size; ++ *sectorsize_out = header->v1.sectorsize; ++ *bitmap_offset_out = sizeof(header->v1); ++ *align_out = *sectorsize_out; ++ file = header->v1.backing_file; ++ } ++ else if(version == 2){ ++ if(n < sizeof(header->v2)){ ++ cow_printf("read_cow_header - failed to read V2 " ++ "header\n"); ++ goto out; ++ } ++ *mtime_out = ntohl(header->v2.mtime); ++ *size_out = ntohll(header->v2.size); ++ *sectorsize_out = ntohl(header->v2.sectorsize); ++ *bitmap_offset_out = sizeof(header->v2); ++ *align_out = *sectorsize_out; ++ file = header->v2.backing_file; ++ } ++ else if(version == 3){ ++ if(n < sizeof(header->v3)){ ++ cow_printf("read_cow_header - failed to read V2 " ++ "header\n"); ++ goto out; ++ } ++ *mtime_out = ntohl(header->v3.mtime); ++ *size_out = ntohll(header->v3.size); ++ *sectorsize_out = ntohl(header->v3.sectorsize); ++ *align_out = ntohl(header->v3.alignment); ++ *bitmap_offset_out = ROUND_UP(sizeof(header->v3), *align_out); ++ file = header->v3.backing_file; ++ } ++ else { ++ cow_printf("read_cow_header - invalid COW version\n"); ++ goto out; ++ } ++ err = -ENOMEM; ++ *backing_file_out = cow_strdup(file); ++ if(*backing_file_out == NULL){ ++ cow_printf("read_cow_header - failed to allocate backing " ++ "file\n"); ++ goto out; ++ } ++ err = 0; ++ out: ++ cow_free(header); ++ return(err); ++} ++ ++int init_cow_file(int fd, char *cow_file, char *backing_file, int sectorsize, ++ int alignment, int *bitmap_offset_out, ++ unsigned long *bitmap_len_out, int *data_offset_out) ++{ ++ __u64 size, offset; ++ char zero = 0; ++ int err; ++ ++ err = write_cow_header(cow_file, fd, backing_file, sectorsize, ++ alignment, &size); ++ if(err) ++ goto out; ++ ++ *bitmap_offset_out = ROUND_UP(sizeof(struct cow_header_v3), alignment); ++ cow_sizes(COW_VERSION, size, sectorsize, alignment, *bitmap_offset_out, ++ bitmap_len_out, data_offset_out); ++ ++ offset = *data_offset_out + size - sizeof(zero); ++ err = cow_seek_file(fd, offset); ++ if(err < 0){ ++ cow_printf("cow bitmap lseek failed : err = %d\n", -err); ++ goto out; ++ } ++ ++ /* does not really matter how much we write it is just to set EOF ++ * this also sets the entire COW bitmap ++ * to zero without having to allocate it ++ */ ++ err = cow_write_file(fd, &zero, sizeof(zero)); ++ if(err != sizeof(zero)){ ++ cow_printf("Write of bitmap to new COW file '%s' failed, " ++ "err = %d\n", cow_file, -err); ++ err = -EINVAL; ++ goto out; ++ } ++ ++ return(0); ++ ++ out: ++ return(err); ++} ++ ++/* ++ * --------------------------------------------------------------------------- ++ * Local variables: ++ * c-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/drivers/chan_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/chan_kern.c 2004-07-16 19:37:43.028483752 +0300 ++++ uml-2.6.7/arch/um/drivers/chan_kern.c 2004-07-16 19:47:24.392103048 +0300 +@@ -8,6 +8,7 @@ + #include <linux/list.h> + #include <linux/slab.h> + #include <linux/tty.h> ++#include <linux/string.h> + #include <linux/tty_flip.h> + #include <asm/irq.h> + #include "chan_kern.h" +@@ -16,6 +17,7 @@ + #include "irq_user.h" + #include "sigio.h" + #include "line.h" ++#include "os.h" + + static void *not_configged_init(char *str, int device, struct chan_opts *opts) + { +@@ -86,6 +88,52 @@ + .winch = 0, + }; + ++void generic_close(int fd, void *unused) ++{ ++ os_close_file(fd); ++} ++ ++int generic_read(int fd, char *c_out, void *unused) ++{ ++ int n; ++ ++ n = os_read_file(fd, c_out, sizeof(*c_out)); ++ ++ if(n == -EAGAIN) ++ return(0); ++ else if(n == 0) ++ return(-EIO); ++ return(n); ++} ++ ++int generic_write(int fd, const char *buf, int n, void *unused) ++{ ++ return(os_write_file(fd, buf, n)); ++} ++ ++int generic_window_size(int fd, void *unused, unsigned short *rows_out, ++ unsigned short *cols_out) ++{ ++ int rows, cols; ++ int ret; ++ ++ ret = os_window_size(fd, &rows, &cols); ++ if(ret < 0) ++ return(ret); ++ ++ ret = ((*rows_out != rows) || (*cols_out != cols)); ++ ++ *rows_out = rows; ++ *cols_out = cols; ++ ++ return(ret); ++} ++ ++void generic_free(void *data) ++{ ++ kfree(data); ++} ++ + static void tty_receive_char(struct tty_struct *tty, char ch) + { + if(tty == NULL) return; +@@ -265,6 +313,11 @@ + { + int n = 0; + ++ if(chan == NULL){ ++ CONFIG_CHUNK(str, size, n, "none", 1); ++ return(n); ++ } ++ + CONFIG_CHUNK(str, size, n, chan->ops->type, 0); + + if(chan->dev == NULL){ +@@ -420,7 +473,8 @@ + INIT_LIST_HEAD(chans); + } + +- if((out = strchr(str, ',')) != NULL){ ++ out = strchr(str, ','); ++ if(out != NULL){ + in = str; + *out = '\0'; + out++; +@@ -475,12 +529,15 @@ + goto out; + } + err = chan->ops->read(chan->fd, &c, chan->data); +- if(err > 0) tty_receive_char(tty, c); ++ if(err > 0) ++ tty_receive_char(tty, c); + } while(err > 0); ++ + if(err == 0) reactivate_fd(chan->fd, irq); + if(err == -EIO){ + if(chan->primary){ +- if(tty != NULL) tty_hangup(tty); ++ if(tty != NULL) ++ tty_hangup(tty); + line_disable(dev, irq); + close_chan(chans); + free_chan(chans); +Index: uml-2.6.7/arch/um/drivers/cow_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/cow_kern.c 2004-07-16 19:47:23.608222216 +0300 ++++ uml-2.6.7/arch/um/drivers/cow_kern.c 2004-07-16 19:47:23.679211424 +0300 +@@ -0,0 +1,630 @@ ++#define COW_MAJOR 60 ++#define MAJOR_NR COW_MAJOR ++ ++#include <linux/stddef.h> ++#include <linux/kernel.h> ++#include <linux/ctype.h> ++#include <linux/stat.h> ++#include <linux/vmalloc.h> ++#include <linux/blkdev.h> ++#include <linux/blk.h> ++#include <linux/fs.h> ++#include <linux/genhd.h> ++#include <linux/devfs_fs.h> ++#include <asm/uaccess.h> ++#include "2_5compat.h" ++#include "cow.h" ++#include "ubd_user.h" ++ ++#define COW_SHIFT 4 ++ ++struct cow { ++ int count; ++ char *cow_path; ++ dev_t cow_dev; ++ struct block_device *cow_bdev; ++ char *backing_path; ++ dev_t backing_dev; ++ struct block_device *backing_bdev; ++ int sectorsize; ++ unsigned long *bitmap; ++ unsigned long bitmap_len; ++ int bitmap_offset; ++ int data_offset; ++ devfs_handle_t devfs; ++ struct semaphore sem; ++ struct semaphore io_sem; ++ atomic_t working; ++ spinlock_t io_lock; ++ struct buffer_head *bh; ++ struct buffer_head *bhtail; ++ void *end_io; ++}; ++ ++#define DEFAULT_COW { \ ++ .count = 0, \ ++ .cow_path = NULL, \ ++ .cow_dev = 0, \ ++ .backing_path = NULL, \ ++ .backing_dev = 0, \ ++ .bitmap = NULL, \ ++ .bitmap_len = 0, \ ++ .bitmap_offset = 0, \ ++ .data_offset = 0, \ ++ .devfs = NULL, \ ++ .working = ATOMIC_INIT(0), \ ++ .io_lock = SPIN_LOCK_UNLOCKED, \ ++} ++ ++#define MAX_DEV (8) ++#define MAX_MINOR (MAX_DEV << COW_SHIFT) ++ ++struct cow cow_dev[MAX_DEV] = { [ 0 ... MAX_DEV - 1 ] = DEFAULT_COW }; ++ ++/* Not modified by this driver */ ++static int blk_sizes[MAX_MINOR] = { [ 0 ... MAX_MINOR - 1 ] = BLOCK_SIZE }; ++static int hardsect_sizes[MAX_MINOR] = { [ 0 ... MAX_MINOR - 1 ] = 512 }; ++ ++/* Protected by cow_lock */ ++static int sizes[MAX_MINOR] = { [ 0 ... MAX_MINOR - 1 ] = 0 }; ++ ++static struct hd_struct cow_part[MAX_MINOR] = ++ { [ 0 ... MAX_MINOR - 1 ] = { 0, 0, 0 } }; ++ ++/* Protected by io_request_lock */ ++static request_queue_t *cow_queue; ++ ++static int cow_open(struct inode *inode, struct file *filp); ++static int cow_release(struct inode * inode, struct file * file); ++static int cow_ioctl(struct inode * inode, struct file * file, ++ unsigned int cmd, unsigned long arg); ++static int cow_revalidate(kdev_t rdev); ++ ++static struct block_device_operations cow_blops = { ++ .open = cow_open, ++ .release = cow_release, ++ .ioctl = cow_ioctl, ++ .revalidate = cow_revalidate, ++}; ++ ++/* Initialized in an initcall, and unchanged thereafter */ ++devfs_handle_t cow_dir_handle; ++ ++#define INIT_GENDISK(maj, name, parts, shift, bsizes, max, blops) \ ++{ \ ++ .major = maj, \ ++ .major_name = name, \ ++ .minor_shift = shift, \ ++ .max_p = 1 << shift, \ ++ .part = parts, \ ++ .sizes = bsizes, \ ++ .nr_real = max, \ ++ .real_devices = NULL, \ ++ .next = NULL, \ ++ .fops = blops, \ ++ .de_arr = NULL, \ ++ .flags = 0 \ ++} ++ ++static spinlock_t cow_lock = SPIN_LOCK_UNLOCKED; ++ ++static struct gendisk cow_gendisk = INIT_GENDISK(MAJOR_NR, "cow", cow_part, ++ COW_SHIFT, sizes, MAX_DEV, ++ &cow_blops); ++ ++static int cow_add(int n) ++{ ++ struct cow *dev = &cow_dev[n]; ++ char name[sizeof("nnnnnn\0")]; ++ int err = -ENODEV; ++ ++ if(dev->cow_path == NULL) ++ goto out; ++ ++ sprintf(name, "%d", n); ++ dev->devfs = devfs_register(cow_dir_handle, name, DEVFS_FL_REMOVABLE, ++ MAJOR_NR, n << COW_SHIFT, S_IFBLK | ++ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, ++ &cow_blops, NULL); ++ ++ init_MUTEX_LOCKED(&dev->sem); ++ init_MUTEX(&dev->io_sem); ++ ++ return(0); ++ ++ out: ++ return(err); ++} ++ ++/* ++ * Add buffer_head to back of pending list ++ */ ++static void cow_add_bh(struct cow *cow, struct buffer_head *bh) ++{ ++ unsigned long flags; ++ ++ spin_lock_irqsave(&cow->io_lock, flags); ++ if(cow->bhtail != NULL){ ++ cow->bhtail->b_reqnext = bh; ++ cow->bhtail = bh; ++ } ++ else { ++ cow->bh = bh; ++ cow->bhtail = bh; ++ } ++ spin_unlock_irqrestore(&cow->io_lock, flags); ++} ++ ++/* ++* Grab first pending buffer ++*/ ++static struct buffer_head *cow_get_bh(struct cow *cow) ++{ ++ struct buffer_head *bh; ++ ++ spin_lock_irq(&cow->io_lock); ++ bh = cow->bh; ++ if(bh != NULL){ ++ if(bh == cow->bhtail) ++ cow->bhtail = NULL; ++ cow->bh = bh->b_reqnext; ++ bh->b_reqnext = NULL; ++ } ++ spin_unlock_irq(&cow->io_lock); ++ ++ return(bh); ++} ++ ++static void cow_handle_bh(struct cow *cow, struct buffer_head *bh, ++ struct buffer_head **cow_bh, int ncow_bh) ++{ ++ int i; ++ ++ if(ncow_bh > 0) ++ ll_rw_block(WRITE, ncow_bh, cow_bh); ++ ++ for(i = 0; i < ncow_bh ; i++){ ++ wait_on_buffer(cow_bh[i]); ++ brelse(cow_bh[i]); ++ } ++ ++ ll_rw_block(WRITE, 1, &bh); ++ brelse(bh); ++} ++ ++static struct buffer_head *cow_new_bh(struct cow *dev, int sector) ++{ ++ struct buffer_head *bh; ++ ++ sector = (dev->bitmap_offset + sector / 8) / dev->sectorsize; ++ bh = getblk(dev->cow_dev, sector, dev->sectorsize); ++ memcpy(bh->b_data, dev->bitmap + sector / (8 * sizeof(dev->bitmap[0])), ++ dev->sectorsize); ++ return(bh); ++} ++ ++/* Copied from loop.c, needed to avoid deadlocking in make_request. */ ++ ++static int cow_thread(void *data) ++{ ++ struct cow *dev = data; ++ struct buffer_head *bh; ++ ++ daemonize(); ++ exit_files(current); ++ ++ sprintf(current->comm, "cow%d", dev - cow_dev); ++ ++ spin_lock_irq(¤t->sigmask_lock); ++ sigfillset(¤t->blocked); ++ flush_signals(current); ++ spin_unlock_irq(¤t->sigmask_lock); ++ ++ atomic_inc(&dev->working); ++ ++ current->policy = SCHED_OTHER; ++ current->nice = -20; ++ ++ current->flags |= PF_NOIO; ++ ++ /* ++ * up sem, we are running ++ */ ++ up(&dev->sem); ++ ++ for(;;){ ++ int start, len, nbh, i, update_bitmap = 0; ++ struct buffer_head *cow_bh[2]; ++ ++ down_interruptible(&dev->io_sem); ++ /* ++ * could be upped because of tear-down, not because of ++ * pending work ++ */ ++ if(!atomic_read(&dev->working)) ++ break; ++ ++ bh = cow_get_bh(dev); ++ if(bh == NULL){ ++ printk(KERN_ERR "cow: missing bh\n"); ++ continue; ++ } ++ ++ start = bh->b_blocknr * bh->b_size / dev->sectorsize; ++ len = bh->b_size / dev->sectorsize; ++ for(i = 0; i < len ; i++){ ++ if(ubd_test_bit(start + i, ++ (unsigned char *) dev->bitmap)) ++ continue; ++ ++ update_bitmap = 1; ++ ubd_set_bit(start + i, (unsigned char *) dev->bitmap); ++ } ++ ++ cow_bh[0] = NULL; ++ cow_bh[1] = NULL; ++ nbh = 0; ++ if(update_bitmap){ ++ cow_bh[0] = cow_new_bh(dev, start); ++ nbh++; ++ if(start / dev->sectorsize != ++ (start + len) / dev->sectorsize){ ++ cow_bh[1] = cow_new_bh(dev, start + len); ++ nbh++; ++ } ++ } ++ ++ bh->b_dev = dev->cow_dev; ++ bh->b_blocknr += dev->data_offset / dev->sectorsize; ++ ++ cow_handle_bh(dev, bh, cow_bh, nbh); ++ ++ /* ++ * upped both for pending work and tear-down, lo_pending ++ * will hit zero then ++ */ ++ if(atomic_dec_and_test(&dev->working)) ++ break; ++ } ++ ++ up(&dev->sem); ++ return(0); ++} ++ ++static int cow_make_request(request_queue_t *q, int rw, struct buffer_head *bh) ++{ ++ struct cow *dev; ++ int n, minor; ++ ++ minor = MINOR(bh->b_rdev); ++ n = minor >> COW_SHIFT; ++ dev = &cow_dev[n]; ++ ++ dev->end_io = NULL; ++ if(ubd_test_bit(bh->b_rsector, (unsigned char *) dev->bitmap)){ ++ bh->b_rdev = dev->cow_dev; ++ bh->b_rsector += dev->data_offset / dev->sectorsize; ++ } ++ else if(rw == WRITE){ ++ bh->b_dev = dev->cow_dev; ++ bh->b_blocknr += dev->data_offset / dev->sectorsize; ++ ++ cow_add_bh(dev, bh); ++ up(&dev->io_sem); ++ return(0); ++ } ++ else { ++ bh->b_rdev = dev->backing_dev; ++ } ++ ++ return(1); ++} ++ ++int cow_init(void) ++{ ++ int i; ++ ++ cow_dir_handle = devfs_mk_dir (NULL, "cow", NULL); ++ if (devfs_register_blkdev(MAJOR_NR, "cow", &cow_blops)) { ++ printk(KERN_ERR "cow: unable to get major %d\n", MAJOR_NR); ++ return -1; ++ } ++ read_ahead[MAJOR_NR] = 8; /* 8 sector (4kB) read-ahead */ ++ blksize_size[MAJOR_NR] = blk_sizes; ++ blk_size[MAJOR_NR] = sizes; ++ INIT_HARDSECT(hardsect_size, MAJOR_NR, hardsect_sizes); ++ ++ cow_queue = BLK_DEFAULT_QUEUE(MAJOR_NR); ++ blk_init_queue(cow_queue, NULL); ++ INIT_ELV(cow_queue, &cow_queue->elevator); ++ blk_queue_make_request(cow_queue, cow_make_request); ++ ++ add_gendisk(&cow_gendisk); ++ ++ for(i=0;i<MAX_DEV;i++) ++ cow_add(i); ++ ++ return(0); ++} ++ ++__initcall(cow_init); ++ ++static int reader(__u64 start, char *buf, int count, void *arg) ++{ ++ dev_t dev = *((dev_t *) arg); ++ struct buffer_head *bh; ++ __u64 block; ++ int cur, offset, left, n, blocksize = get_hardsect_size(dev); ++ ++ if(blocksize == 0) ++ panic("Zero blocksize"); ++ ++ block = start / blocksize; ++ offset = start % blocksize; ++ left = count; ++ cur = 0; ++ while(left > 0){ ++ n = (left > blocksize) ? blocksize : left; ++ ++ bh = bread(dev, block, (n < 512) ? 512 : n); ++ if(bh == NULL) ++ return(-EIO); ++ ++ n -= offset; ++ memcpy(&buf[cur], bh->b_data + offset, n); ++ block++; ++ left -= n; ++ cur += n; ++ offset = 0; ++ brelse(bh); ++ } ++ ++ return(count); ++} ++ ++static int cow_open(struct inode *inode, struct file *filp) ++{ ++ int (*dev_ioctl)(struct inode *, struct file *, unsigned int, ++ unsigned long); ++ mm_segment_t fs; ++ struct cow *dev; ++ __u64 size; ++ __u32 version, align; ++ time_t mtime; ++ char *backing_file; ++ int n, offset, err = 0; ++ ++ n = DEVICE_NR(inode->i_rdev); ++ if(n >= MAX_DEV) ++ return(-ENODEV); ++ dev = &cow_dev[n]; ++ offset = n << COW_SHIFT; ++ ++ spin_lock(&cow_lock); ++ ++ if(dev->count == 0){ ++ dev->cow_dev = name_to_kdev_t(dev->cow_path); ++ if(dev->cow_dev == 0){ ++ printk(KERN_ERR "cow_open - name_to_kdev_t(\"%s\") " ++ "failed\n", dev->cow_path); ++ err = -ENODEV; ++ } ++ ++ dev->backing_dev = name_to_kdev_t(dev->backing_path); ++ if(dev->backing_dev == 0){ ++ printk(KERN_ERR "cow_open - name_to_kdev_t(\"%s\") " ++ "failed\n", dev->backing_path); ++ err = -ENODEV; ++ } ++ ++ if(err) ++ goto out; ++ ++ dev->cow_bdev = bdget(dev->cow_dev); ++ if(dev->cow_bdev == NULL){ ++ printk(KERN_ERR "cow_open - bdget(\"%s\") failed\n", ++ dev->cow_path); ++ err = -ENOMEM; ++ } ++ dev->backing_bdev = bdget(dev->backing_dev); ++ if(dev->backing_bdev == NULL){ ++ printk(KERN_ERR "cow_open - bdget(\"%s\") failed\n", ++ dev->backing_path); ++ err = -ENOMEM; ++ } ++ ++ if(err) ++ goto out; ++ ++ err = blkdev_get(dev->cow_bdev, FMODE_READ|FMODE_WRITE, 0, ++ BDEV_RAW); ++ if(err){ ++ printk("cow_open - blkdev_get of COW device failed, " ++ "error = %d\n", err); ++ goto out; ++ } ++ ++ err = blkdev_get(dev->backing_bdev, FMODE_READ, 0, BDEV_RAW); ++ if(err){ ++ printk("cow_open - blkdev_get of backing device " ++ "failed, error = %d\n", err); ++ goto out; ++ } ++ ++ err = read_cow_header(reader, &dev->cow_dev, &version, ++ &backing_file, &mtime, &size, ++ &dev->sectorsize, &align, ++ &dev->bitmap_offset); ++ if(err){ ++ printk(KERN_ERR "cow_open - read_cow_header failed, " ++ "err = %d\n", err); ++ goto out; ++ } ++ ++ cow_sizes(version, size, dev->sectorsize, align, ++ dev->bitmap_offset, &dev->bitmap_len, ++ &dev->data_offset); ++ dev->bitmap = (void *) vmalloc(dev->bitmap_len); ++ if(dev->bitmap == NULL){ ++ err = -ENOMEM; ++ printk(KERN_ERR "Failed to vmalloc COW bitmap\n"); ++ goto out; ++ } ++ flush_tlb_kernel_vm(); ++ ++ err = reader(dev->bitmap_offset, (char *) dev->bitmap, ++ dev->bitmap_len, &dev->cow_dev); ++ if(err < 0){ ++ printk(KERN_ERR "Failed to read COW bitmap\n"); ++ vfree(dev->bitmap); ++ goto out; ++ } ++ ++ dev_ioctl = dev->backing_bdev->bd_op->ioctl; ++ fs = get_fs(); ++ set_fs(KERNEL_DS); ++ err = (*dev_ioctl)(inode, filp, BLKGETSIZE, ++ (unsigned long) &sizes[offset]); ++ set_fs(fs); ++ if(err){ ++ printk(KERN_ERR "cow_open - BLKGETSIZE failed, " ++ "error = %d\n", err); ++ goto out; ++ } ++ ++ kernel_thread(cow_thread, dev, ++ CLONE_FS | CLONE_FILES | CLONE_SIGHAND); ++ down(&dev->sem); ++ } ++ dev->count++; ++ out: ++ spin_unlock(&cow_lock); ++ return(err); ++} ++ ++static int cow_release(struct inode * inode, struct file * file) ++{ ++ struct cow *dev; ++ int n, err; ++ ++ n = DEVICE_NR(inode->i_rdev); ++ if(n >= MAX_DEV) ++ return(-ENODEV); ++ dev = &cow_dev[n]; ++ ++ spin_lock(&cow_lock); ++ ++ if(--dev->count > 0) ++ goto out; ++ ++ err = blkdev_put(dev->cow_bdev, BDEV_RAW); ++ if(err) ++ printk("cow_release - blkdev_put of cow device failed, " ++ "error = %d\n", err); ++ bdput(dev->cow_bdev); ++ dev->cow_bdev = 0; ++ ++ err = blkdev_put(dev->backing_bdev, BDEV_RAW); ++ if(err) ++ printk("cow_release - blkdev_put of backing device failed, " ++ "error = %d\n", err); ++ bdput(dev->backing_bdev); ++ dev->backing_bdev = 0; ++ ++ out: ++ spin_unlock(&cow_lock); ++ return(0); ++} ++ ++static int cow_ioctl(struct inode * inode, struct file * file, ++ unsigned int cmd, unsigned long arg) ++{ ++ struct cow *dev; ++ int (*dev_ioctl)(struct inode *, struct file *, unsigned int, ++ unsigned long); ++ int n; ++ ++ n = DEVICE_NR(inode->i_rdev); ++ if(n >= MAX_DEV) ++ return(-ENODEV); ++ dev = &cow_dev[n]; ++ ++ dev_ioctl = dev->backing_bdev->bd_op->ioctl; ++ return((*dev_ioctl)(inode, file, cmd, arg)); ++} ++ ++static int cow_revalidate(kdev_t rdev) ++{ ++ printk(KERN_ERR "Need to implement cow_revalidate\n"); ++ return(0); ++} ++ ++static int parse_unit(char **ptr) ++{ ++ char *str = *ptr, *end; ++ int n = -1; ++ ++ if(isdigit(*str)) { ++ n = simple_strtoul(str, &end, 0); ++ if(end == str) ++ return(-1); ++ *ptr = end; ++ } ++ else if (('a' <= *str) && (*str <= 'h')) { ++ n = *str - 'a'; ++ str++; ++ *ptr = str; ++ } ++ return(n); ++} ++ ++static int cow_setup(char *str) ++{ ++ struct cow *dev; ++ char *cow_name, *backing_name; ++ int unit; ++ ++ unit = parse_unit(&str); ++ if(unit < 0){ ++ printk(KERN_ERR "cow_setup - Couldn't parse unit number\n"); ++ return(1); ++ } ++ ++ if(*str != '='){ ++ printk(KERN_ERR "cow_setup - Missing '=' after unit " ++ "number\n"); ++ return(1); ++ } ++ str++; ++ ++ cow_name = str; ++ backing_name = strchr(str, ','); ++ if(backing_name == NULL){ ++ printk(KERN_ERR "cow_setup - missing backing device name\n"); ++ return(0); ++ } ++ *backing_name = '\0'; ++ backing_name++; ++ ++ spin_lock(&cow_lock); ++ ++ dev = &cow_dev[unit]; ++ dev->cow_path = cow_name; ++ dev->backing_path = backing_name; ++ ++ spin_unlock(&cow_lock); ++ return(0); ++} ++ ++__setup("cow", cow_setup); ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/main.c +=================================================================== +--- uml-2.6.7.orig/arch/um/main.c 2004-07-16 19:37:17.425376016 +0300 ++++ uml-2.6.7/arch/um/main.c 2004-07-16 19:47:23.762198808 +0300 +@@ -8,6 +8,7 @@ + #include <stdlib.h> + #include <string.h> + #include <signal.h> ++#include <errno.h> + #include <sys/resource.h> + #include <sys/mman.h> + #include <sys/user.h> +@@ -123,12 +124,14 @@ + + set_stklim(); + +- if((new_argv = malloc((argc + 1) * sizeof(char *))) == NULL){ ++ new_argv = malloc((argc + 1) * sizeof(char *)); ++ if(new_argv == NULL){ + perror("Mallocing argv"); + exit(1); + } + for(i=0;i<argc;i++){ +- if((new_argv[i] = strdup(argv[i])) == NULL){ ++ new_argv[i] = strdup(argv[i]); ++ if(new_argv[i] == NULL){ + perror("Mallocing an arg"); + exit(1); + } +Index: uml-2.6.7/arch/um/kernel/tt/uaccess_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/uaccess_user.c 2004-07-16 19:36:22.358747416 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/uaccess_user.c 2004-07-16 19:47:23.752200328 +0300 +@@ -8,15 +8,20 @@ + #include <string.h> + #include "user_util.h" + #include "uml_uaccess.h" ++#include "task.h" ++#include "kern_util.h" + + int __do_copy_from_user(void *to, const void *from, int n, + void **fault_addr, void **fault_catcher) + { ++ struct tt_regs save = TASK_REGS(get_current())->tt; + unsigned long fault; + int faulted; + + fault = __do_user_copy(to, from, n, fault_addr, fault_catcher, + __do_copy, &faulted); ++ TASK_REGS(get_current())->tt = save; ++ + if(!faulted) return(0); + else return(n - (fault - (unsigned long) from)); + } +@@ -29,11 +34,14 @@ + int __do_strncpy_from_user(char *dst, const char *src, unsigned long count, + void **fault_addr, void **fault_catcher) + { ++ struct tt_regs save = TASK_REGS(get_current())->tt; + unsigned long fault; + int faulted; + + fault = __do_user_copy(dst, src, count, fault_addr, fault_catcher, + __do_strncpy, &faulted); ++ TASK_REGS(get_current())->tt = save; ++ + if(!faulted) return(strlen(dst)); + else return(-1); + } +@@ -46,11 +54,14 @@ + int __do_clear_user(void *mem, unsigned long len, + void **fault_addr, void **fault_catcher) + { ++ struct tt_regs save = TASK_REGS(get_current())->tt; + unsigned long fault; + int faulted; + + fault = __do_user_copy(mem, NULL, len, fault_addr, fault_catcher, + __do_clear, &faulted); ++ TASK_REGS(get_current())->tt = save; ++ + if(!faulted) return(0); + else return(len - (fault - (unsigned long) mem)); + } +@@ -58,19 +69,20 @@ + int __do_strnlen_user(const char *str, unsigned long n, + void **fault_addr, void **fault_catcher) + { ++ struct tt_regs save = TASK_REGS(get_current())->tt; + int ret; + unsigned long *faddrp = (unsigned long *)fault_addr; + jmp_buf jbuf; + + *fault_catcher = &jbuf; +- if(setjmp(jbuf) == 0){ ++ if(sigsetjmp(jbuf, 1) == 0) + ret = strlen(str) + 1; +- } +- else { +- ret = *faddrp - (unsigned long) str; +- } ++ else ret = *faddrp - (unsigned long) str; ++ + *fault_addr = NULL; + *fault_catcher = NULL; ++ ++ TASK_REGS(get_current())->tt = save; + return ret; + } + +Index: uml-2.6.7/arch/um/kernel/syscall_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/syscall_kern.c 2004-07-16 19:37:08.748695072 +0300 ++++ uml-2.6.7/arch/um/kernel/syscall_kern.c 2004-07-16 19:47:23.737202608 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -36,32 +36,34 @@ + + long sys_fork(void) + { +- struct task_struct *p; ++ long ret; + + current->thread.forking = 1; +- p = do_fork(SIGCHLD, 0, NULL, 0, NULL, NULL); ++ ret = do_fork(SIGCHLD, 0, NULL, 0, NULL, NULL); + current->thread.forking = 0; +- return(IS_ERR(p) ? PTR_ERR(p) : p->pid); ++ return(ret); + } + +-long sys_clone(unsigned long clone_flags, unsigned long newsp) ++long sys_clone(unsigned long clone_flags, unsigned long newsp, ++ int *parent_tid, int *child_tid) + { +- struct task_struct *p; ++ long ret; + + current->thread.forking = 1; +- p = do_fork(clone_flags, newsp, NULL, 0, NULL, NULL); ++ ret = do_fork(clone_flags, newsp, NULL, 0, parent_tid, child_tid); + current->thread.forking = 0; +- return(IS_ERR(p) ? PTR_ERR(p) : p->pid); ++ return(ret); + } + + long sys_vfork(void) + { +- struct task_struct *p; ++ long ret; + + current->thread.forking = 1; +- p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0, NULL, 0, NULL, NULL); ++ ret = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0, NULL, 0, NULL, ++ NULL); + current->thread.forking = 0; +- return(IS_ERR(p) ? PTR_ERR(p) : p->pid); ++ return(ret); + } + + /* common code for old and new mmaps */ +@@ -136,43 +138,12 @@ + + error = do_pipe(fd); + if (!error) { +- if (copy_to_user(fildes, fd, 2*sizeof(int))) ++ if (copy_to_user(fildes, fd, sizeof(fd))) + error = -EFAULT; + } + return error; + } + +-int sys_sigaction(int sig, const struct old_sigaction *act, +- struct old_sigaction *oact) +-{ +- struct k_sigaction new_ka, old_ka; +- int ret; +- +- if (act) { +- old_sigset_t mask; +- if (verify_area(VERIFY_READ, act, sizeof(*act)) || +- __get_user(new_ka.sa.sa_handler, &act->sa_handler) || +- __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) +- return -EFAULT; +- __get_user(new_ka.sa.sa_flags, &act->sa_flags); +- __get_user(mask, &act->sa_mask); +- siginitset(&new_ka.sa.sa_mask, mask); +- } +- +- ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); +- +- if (!ret && oact) { +- if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || +- __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || +- __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) +- return -EFAULT; +- __put_user(old_ka.sa.sa_flags, &oact->sa_flags); +- __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); +- } +- +- return ret; +-} +- + /* + * sys_ipc() is the de-multiplexer for the SysV IPC calls.. + * +@@ -254,7 +225,7 @@ + return sys_shmctl (first, second, + (struct shmid_ds *) ptr); + default: +- return -EINVAL; ++ return -ENOSYS; + } + } + +@@ -303,11 +274,6 @@ + return error; + } + +-int sys_sigaltstack(const stack_t *uss, stack_t *uoss) +-{ +- return(do_sigaltstack(uss, uoss, PT_REGS_SP(¤t->thread.regs))); +-} +- + long execute_syscall(void *r) + { + return(CHOOSE_MODE_PROC(execute_syscall_tt, execute_syscall_skas, r)); +Index: uml-2.6.7/arch/um/kernel/skas/util/mk_ptregs.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/util/mk_ptregs.c 2004-07-16 19:36:30.635489160 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/util/mk_ptregs.c 2004-07-16 19:47:23.736202760 +0300 +@@ -1,3 +1,4 @@ ++#include <stdio.h> + #include <asm/ptrace.h> + #include <asm/user.h> + +Index: uml-2.6.7/arch/um/kernel/skas/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/Makefile 2004-07-16 19:36:22.285758512 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/Makefile 2004-07-16 19:47:23.729203824 +0300 +@@ -5,20 +5,24 @@ + + obj-y = exec_kern.o exec_user.o mem.o mem_user.o mmu.o process.o \ + process_kern.o syscall_kern.o syscall_user.o time.o tlb.o trap_user.o \ +- sys-$(SUBARCH)/ ++ uaccess.o sys-$(SUBARCH)/ ++ ++host-progs := util/mk_ptregs ++clean-files := include/skas_ptregs.h + + USER_OBJS = $(filter %_user.o,$(obj-y)) process.o time.o + USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) + +-include/skas_ptregs.h : util/mk_ptregs +- util/mk_ptregs > $@ +- +-util/mk_ptregs : +- $(MAKE) -C util ++$(TOPDIR)/arch/um/include/skas_ptregs.h : $(src)/util/mk_ptregs ++ @echo -n ' Generating $@' ++ @$< > $@.tmp ++ @if [ -r $@ ] && cmp -s $@ $@.tmp; then \ ++ echo ' (unchanged)'; \ ++ rm -f $@.tmp; \ ++ else \ ++ echo ' (updated)'; \ ++ mv -f $@.tmp $@; \ ++ fi + + $(USER_OBJS) : %.o: %.c + $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< +- +-clean : +- $(MAKE) -C util clean +- $(RM) -f include/skas_ptregs.h +Index: uml-2.6.7/include/asm-um/irq.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/irq.h 2004-07-16 19:37:43.396427816 +0300 ++++ uml-2.6.7/include/asm-um/irq.h 2004-07-16 19:47:23.790194552 +0300 +@@ -1,15 +1,6 @@ + #ifndef __UM_IRQ_H + #define __UM_IRQ_H + +-/* The i386 irq.h has a struct task_struct in a prototype without including +- * sched.h. This forward declaration kills the resulting warning. +- */ +-struct task_struct; +- +-#include "asm/ptrace.h" +- +-#undef NR_IRQS +- + #define TIMER_IRQ 0 + #define UMN_IRQ 1 + #define CONSOLE_IRQ 2 +@@ -28,13 +19,4 @@ + #define LAST_IRQ XTERM_IRQ + #define NR_IRQS (LAST_IRQ + 1) + +-extern int um_request_irq(unsigned int irq, int fd, int type, +- void (*handler)(int, void *, struct pt_regs *), +- unsigned long irqflags, const char * devname, +- void *dev_id); +- +-struct irqaction; +-struct pt_regs; +-int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); +- + #endif +Index: uml-2.6.7/arch/um/drivers/line.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/line.c 2004-07-16 19:37:26.186044192 +0300 ++++ uml-2.6.7/arch/um/drivers/line.c 2004-07-16 19:47:23.685210512 +0300 +@@ -6,8 +6,8 @@ + #include "linux/sched.h" + #include "linux/slab.h" + #include "linux/list.h" ++#include "linux/interrupt.h" + #include "linux/devfs_fs_kernel.h" +-#include "asm/irq.h" + #include "asm/uaccess.h" + #include "chan_kern.h" + #include "irq_user.h" +@@ -16,38 +16,55 @@ + #include "user_util.h" + #include "kern_util.h" + #include "os.h" ++#include "irq_kern.h" + + #define LINE_BUFSIZE 4096 + +-void line_interrupt(int irq, void *data, struct pt_regs *unused) ++static irqreturn_t line_interrupt(int irq, void *data, struct pt_regs *unused) + { + struct line *dev = data; + + if(dev->count > 0) + chan_interrupt(&dev->chan_list, &dev->task, dev->tty, irq, + dev); ++ return IRQ_HANDLED; + } + +-void line_timer_cb(void *arg) ++static void line_timer_cb(void *arg) + { + struct line *dev = arg; + + line_interrupt(dev->driver->read_irq, dev, NULL); + } + +-static void buffer_data(struct line *line, const char *buf, int len) ++static int write_room(struct line *dev) + { +- int end; ++ int n; ++ ++ if(dev->buffer == NULL) return(LINE_BUFSIZE - 1); ++ ++ n = dev->head - dev->tail; ++ if(n <= 0) n = LINE_BUFSIZE + n; ++ return(n - 1); ++} ++ ++static int buffer_data(struct line *line, const char *buf, int len) ++{ ++ int end, room; + + if(line->buffer == NULL){ + line->buffer = kmalloc(LINE_BUFSIZE, GFP_ATOMIC); + if(line->buffer == NULL){ + printk("buffer_data - atomic allocation failed\n"); +- return; ++ return(0); + } + line->head = line->buffer; + line->tail = line->buffer; + } ++ ++ room = write_room(line); ++ len = (len > room) ? room : len; ++ + end = line->buffer + LINE_BUFSIZE - line->tail; + if(len < end){ + memcpy(line->tail, buf, len); +@@ -60,6 +77,8 @@ + memcpy(line->buffer, buf, len); + line->tail = line->buffer + len; + } ++ ++ return(len); + } + + static int flush_buffer(struct line *line) +@@ -95,7 +114,7 @@ + struct line *line; + char *new; + unsigned long flags; +- int n, err, i; ++ int n, err, i, ret = 0; + + if(tty->stopped) return 0; + +@@ -104,9 +123,13 @@ + if(new == NULL) + return(0); + n = copy_from_user(new, buf, len); +- if(n == len) +- return(-EFAULT); + buf = new; ++ if(n == len){ ++ len = -EFAULT; ++ goto out_free; ++ } ++ ++ len -= n; + } + + i = tty->index; +@@ -115,41 +138,50 @@ + down(&line->sem); + if(line->head != line->tail){ + local_irq_save(flags); +- buffer_data(line, buf, len); ++ ret += buffer_data(line, buf, len); + err = flush_buffer(line); + local_irq_restore(flags); + if(err <= 0) +- goto out; ++ goto out_up; + } + else { + n = write_chan(&line->chan_list, buf, len, + line->driver->write_irq); + if(n < 0){ +- len = n; +- goto out; ++ ret = n; ++ goto out_up; + } +- if(n < len) +- buffer_data(line, buf + n, len - n); ++ ++ len -= n; ++ ret += n; ++ if(len > 0) ++ ret += buffer_data(line, buf + n, len); + } +- out: ++ out_up: + up(&line->sem); +- return(len); ++ out_free: ++ if(from_user) ++ kfree(buf); ++ return(ret); + } + +-void line_write_interrupt(int irq, void *data, struct pt_regs *unused) ++static irqreturn_t line_write_interrupt(int irq, void *data, ++ struct pt_regs *unused) + { + struct line *dev = data; + struct tty_struct *tty = dev->tty; + int err; + + err = flush_buffer(dev); +- if(err == 0) return; ++ if(err == 0) ++ return(IRQ_NONE); + else if(err < 0){ + dev->head = dev->buffer; + dev->tail = dev->buffer; + } + +- if(tty == NULL) return; ++ if(tty == NULL) ++ return(IRQ_NONE); + + if(test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && + (tty->ldisc.write_wakeup != NULL)) +@@ -161,21 +193,9 @@ + * writes. + */ + +- if (waitqueue_active(&tty->write_wait)) ++ if(waitqueue_active(&tty->write_wait)) + wake_up_interruptible(&tty->write_wait); +- +-} +- +-int line_write_room(struct tty_struct *tty) +-{ +- struct line *dev = tty->driver_data; +- int n; +- +- if(dev->buffer == NULL) return(LINE_BUFSIZE - 1); +- +- n = dev->head - dev->tail; +- if(n <= 0) n = LINE_BUFSIZE + n; +- return(n - 1); ++ return(IRQ_HANDLED); + } + + int line_setup_irq(int fd, int input, int output, void *data) +@@ -305,7 +325,7 @@ + if(*end != '='){ + printk(KERN_ERR "line_setup failed to parse \"%s\"\n", + init); +- return(1); ++ return(0); + } + init = end; + } +@@ -313,12 +333,12 @@ + if((n >= 0) && (n >= num)){ + printk("line_setup - %d out of range ((0 ... %d) allowed)\n", + n, num); +- return(1); ++ return(0); + } + else if(n >= 0){ + if(lines[n].count > 0){ + printk("line_setup - device %d is open\n", n); +- return(1); ++ return(0); + } + if(lines[n].init_pri <= INIT_ONE){ + lines[n].init_pri = INIT_ONE; +@@ -332,7 +352,7 @@ + else if(!all_allowed){ + printk("line_setup - can't configure all devices from " + "mconsole\n"); +- return(1); ++ return(0); + } + else { + for(i = 0; i < num; i++){ +@@ -346,7 +366,7 @@ + } + } + } +- return(0); ++ return(1); + } + + int line_config(struct line *lines, int num, char *str) +@@ -357,7 +377,7 @@ + printk("line_config - uml_strdup failed\n"); + return(-ENOMEM); + } +- return(line_setup(lines, num, new, 0)); ++ return(!line_setup(lines, num, new, 0)); + } + + int line_get_config(char *name, struct line *lines, int num, char *str, +@@ -369,7 +389,7 @@ + + dev = simple_strtoul(name, &end, 0); + if((*end != '\0') || (end == name)){ +- *error_out = "line_setup failed to parse device number"; ++ *error_out = "line_get_config failed to parse device number"; + return(0); + } + +@@ -379,15 +399,15 @@ + } + + line = &lines[dev]; ++ + down(&line->sem); +- + if(!line->valid) + CONFIG_CHUNK(str, size, n, "none", 1); + else if(line->count == 0) + CONFIG_CHUNK(str, size, n, line->init_str, 1); + else n = chan_config_string(&line->chan_list, str, size, error_out); +- + up(&line->sem); ++ + return(n); + } + +@@ -396,7 +416,14 @@ + char config[sizeof("conxxxx=none\0")]; + + sprintf(config, "%s=none", str); +- return(line_setup(lines, num, config, 0)); ++ return(!line_setup(lines, num, config, 0)); ++} ++ ++int line_write_room(struct tty_struct *tty) ++{ ++ struct line *dev = tty->driver_data; ++ ++ return(write_room(dev)); + } + + struct tty_driver *line_register_devfs(struct lines *set, +@@ -412,7 +439,8 @@ + return NULL; + + driver->driver_name = line_driver->name; +- driver->name = line_driver->devfs_name; ++ driver->name = line_driver->device_name; ++ driver->devfs_name = line_driver->devfs_name; + driver->major = line_driver->major; + driver->minor_start = line_driver->minor_start; + driver->type = line_driver->type; +@@ -432,7 +460,7 @@ + + for(i = 0; i < nlines; i++){ + if(!lines[i].valid) +- tty_unregister_devfs(driver, i); ++ tty_unregister_device(driver, i); + } + + mconsole_register_dev(&line_driver->mc); +@@ -465,24 +493,25 @@ + struct line *line; + }; + +-void winch_interrupt(int irq, void *data, struct pt_regs *unused) ++irqreturn_t winch_interrupt(int irq, void *data, struct pt_regs *unused) + { + struct winch *winch = data; + struct tty_struct *tty; + int err; + char c; + +- err = generic_read(winch->fd, &c, NULL); +- if(err < 0){ +- if(err != -EAGAIN){ +- printk("winch_interrupt : read failed, errno = %d\n", +- -err); +- printk("fd %d is losing SIGWINCH support\n", +- winch->tty_fd); +- free_irq(irq, data); +- return; ++ if(winch->fd != -1){ ++ err = generic_read(winch->fd, &c, NULL); ++ if(err < 0){ ++ if(err != -EAGAIN){ ++ printk("winch_interrupt : read failed, " ++ "errno = %d\n", -err); ++ printk("fd %d is losing SIGWINCH support\n", ++ winch->tty_fd); ++ return(IRQ_HANDLED); ++ } ++ goto out; + } +- goto out; + } + tty = winch->line->tty; + if(tty != NULL){ +@@ -492,7 +521,9 @@ + kill_pg(tty->pgrp, SIGWINCH, 1); + } + out: +- reactivate_fd(winch->fd, WINCH_IRQ); ++ if(winch->fd != -1) ++ reactivate_fd(winch->fd, WINCH_IRQ); ++ return(IRQ_HANDLED); + } + + DECLARE_MUTEX(winch_handler_sem); +@@ -529,7 +560,10 @@ + + list_for_each(ele, &winch_handlers){ + winch = list_entry(ele, struct winch, list); +- close(winch->fd); ++ if(winch->fd != -1){ ++ deactivate_fd(winch->fd, WINCH_IRQ); ++ os_close_file(winch->fd); ++ } + if(winch->pid != -1) + os_kill_process(winch->pid, 1); + } +Index: uml-2.6.7/arch/um/kernel/tt/process_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/process_kern.c 2004-07-16 19:37:20.233949048 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/process_kern.c 2004-07-16 19:47:23.746201240 +0300 +@@ -62,7 +62,7 @@ + reading = 0; + err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c)); + if(err != sizeof(c)) +- panic("write of switch_pipe failed, errno = %d", -err); ++ panic("write of switch_pipe failed, err = %d", -err); + + reading = 1; + if((from->state == TASK_ZOMBIE) || (from->state == TASK_DEAD)) +@@ -104,48 +104,72 @@ + + void release_thread_tt(struct task_struct *task) + { +- os_kill_process(task->thread.mode.tt.extern_pid, 0); ++ int pid = task->thread.mode.tt.extern_pid; ++ ++ if(os_getpid() != pid) ++ os_kill_process(pid, 0); + } + + void exit_thread_tt(void) + { +- close(current->thread.mode.tt.switch_pipe[0]); +- close(current->thread.mode.tt.switch_pipe[1]); ++ os_close_file(current->thread.mode.tt.switch_pipe[0]); ++ os_close_file(current->thread.mode.tt.switch_pipe[1]); + } + + void schedule_tail(task_t *prev); + + static void new_thread_handler(int sig) + { ++ unsigned long disable; + int (*fn)(void *); + void *arg; + + fn = current->thread.request.u.thread.proc; + arg = current->thread.request.u.thread.arg; ++ + UPT_SC(¤t->thread.regs.regs) = (void *) (&sig + 1); ++ disable = (1 << (SIGVTALRM - 1)) | (1 << (SIGALRM - 1)) | ++ (1 << (SIGIO - 1)) | (1 << (SIGPROF - 1)); ++ SC_SIGMASK(UPT_SC(¤t->thread.regs.regs)) &= ~disable; ++ + suspend_new_thread(current->thread.mode.tt.switch_pipe[0]); + +- block_signals(); ++ force_flush_all(); ++ if(current->thread.prev_sched != NULL) ++ schedule_tail(current->thread.prev_sched); ++ current->thread.prev_sched = NULL; ++ + init_new_thread_signals(1); +-#ifdef CONFIG_SMP +- schedule_tail(current->thread.prev_sched); +-#endif + enable_timer(); + free_page(current->thread.temp_stack); + set_cmdline("(kernel thread)"); +- force_flush_all(); + +- current->thread.prev_sched = NULL; + change_sig(SIGUSR1, 1); + change_sig(SIGVTALRM, 1); + change_sig(SIGPROF, 1); +- unblock_signals(); ++ local_irq_enable(); + if(!run_kernel_thread(fn, arg, ¤t->thread.exec_buf)) + do_exit(0); + } + + static int new_thread_proc(void *stack) + { ++ /* local_irq_disable is needed to block out signals until this thread is ++ * properly scheduled. Otherwise, the tracing thread will get mighty ++ * upset about any signals that arrive before that. ++ * This has the complication that it sets the saved signal mask in ++ * the sigcontext to block signals. This gets restored when this ++ * thread (or a descendant, since they get a copy of this sigcontext) ++ * returns to userspace. ++ * So, this is compensated for elsewhere. ++ * XXX There is still a small window until local_irq_disable() actually ++ * finishes where signals are possible - shouldn't be a problem in ++ * practice since SIGIO hasn't been forwarded here yet, and the ++ * local_irq_disable should finish before a SIGVTALRM has time to be ++ * delivered. ++ */ ++ ++ local_irq_disable(); + init_new_thread_stack(stack, new_thread_handler); + os_usr1_process(os_getpid()); + return(0); +@@ -156,7 +180,7 @@ + * itself with a SIGUSR1. set_user_mode has to be run with SIGUSR1 off, + * so it is blocked before it's called. They are re-enabled on sigreturn + * despite the fact that they were blocked when the SIGUSR1 was issued because +- * copy_thread copies the parent's signcontext, including the signal mask ++ * copy_thread copies the parent's sigcontext, including the signal mask + * onto the signal frame. + */ + +@@ -165,35 +189,32 @@ + UPT_SC(¤t->thread.regs.regs) = (void *) (&sig + 1); + suspend_new_thread(current->thread.mode.tt.switch_pipe[0]); + +-#ifdef CONFIG_SMP +- schedule_tail(NULL); +-#endif ++ force_flush_all(); ++ if(current->thread.prev_sched != NULL) ++ schedule_tail(current->thread.prev_sched); ++ current->thread.prev_sched = NULL; ++ + enable_timer(); + change_sig(SIGVTALRM, 1); + local_irq_enable(); +- force_flush_all(); + if(current->mm != current->parent->mm) + protect_memory(uml_reserved, high_physmem - uml_reserved, 1, + 1, 0, 1); +- task_protections((unsigned long) current->thread_info); +- +- current->thread.prev_sched = NULL; ++ task_protections((unsigned long) current_thread); + + free_page(current->thread.temp_stack); ++ local_irq_disable(); + change_sig(SIGUSR1, 0); + set_user_mode(current); + } + +-static int sigusr1 = SIGUSR1; +- + int fork_tramp(void *stack) + { +- int sig = sigusr1; +- + local_irq_disable(); ++ arch_init_thread(); + init_new_thread_stack(stack, finish_fork_handler); + +- kill(os_getpid(), sig); ++ os_usr1_process(os_getpid()); + return(0); + } + +@@ -213,8 +234,8 @@ + } + + err = os_pipe(p->thread.mode.tt.switch_pipe, 1, 1); +- if(err){ +- printk("copy_thread : pipe failed, errno = %d\n", -err); ++ if(err < 0){ ++ printk("copy_thread : pipe failed, err = %d\n", -err); + return(err); + } + +@@ -377,8 +398,8 @@ + + pages = (1 << CONFIG_KERNEL_STACK_ORDER); + +- start = (unsigned long) current->thread_info + PAGE_SIZE; +- end = (unsigned long) current + PAGE_SIZE * pages; ++ start = (unsigned long) current_thread + PAGE_SIZE; ++ end = (unsigned long) current_thread + PAGE_SIZE * pages; + protect_memory(uml_reserved, start - uml_reserved, 1, w, 1, 1); + protect_memory(end, high_physmem - end, 1, w, 1, 1); + +@@ -454,8 +475,9 @@ + + init_task.thread.mode.tt.extern_pid = pid; + err = os_pipe(init_task.thread.mode.tt.switch_pipe, 1, 1); +- if(err) panic("Can't create switch pipe for init_task, errno = %d", +- err); ++ if(err) ++ panic("Can't create switch pipe for init_task, errno = %d", ++ -err); + } + + int singlestepping_tt(void *t) +Index: uml-2.6.7/arch/um/include/2_5compat.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/2_5compat.h 2004-07-16 19:36:37.163496752 +0300 ++++ uml-2.6.7/arch/um/include/2_5compat.h 2004-07-16 19:47:23.700208232 +0300 +@@ -6,20 +6,6 @@ + #ifndef __2_5_COMPAT_H__ + #define __2_5_COMPAT_H__ + +-#include "linux/version.h" +- +-#define INIT_CONSOLE(dev_name, write_proc, device_proc, setup_proc, f) { \ +- name : dev_name, \ +- write : write_proc, \ +- read : NULL, \ +- device : device_proc, \ +- setup : setup_proc, \ +- flags : f, \ +- index : -1, \ +- cflag : 0, \ +- next : NULL \ +-} +- + #define INIT_HARDSECT(arr, maj, sizes) + + #define SET_PRI(task) do ; while(0) +Index: uml-2.6.7/fs/hostfs/Makefile +=================================================================== +--- uml-2.6.7.orig/fs/hostfs/Makefile 2004-07-16 19:47:23.631218720 +0300 ++++ uml-2.6.7/fs/hostfs/Makefile 2004-07-16 19:47:23.784195464 +0300 +@@ -0,0 +1,26 @@ ++# ++# Copyright (C) 2000 Jeff Dike (jdike@karaya.com) ++# Licensed under the GPL ++# ++ ++# struct stat64 changed the inode field name between 2.2 and 2.4 from st_ino ++# to __st_ino. It stayed in the same place, so as long as the correct name ++# is used, hostfs compiled on 2.2 should work on 2.4 and vice versa. ++ ++STAT64_INO_FIELD := $(shell grep -q __st_ino /usr/include/bits/stat.h && \ ++ echo __)st_ino ++ ++hostfs-objs := hostfs_kern.o hostfs_user.o ++ ++obj-y = ++obj-$(CONFIG_HOSTFS) += hostfs.o ++ ++SINGLE_OBJS = $(foreach f,$(patsubst %.o,%,$(obj-y) $(obj-m)),$($(f)-objs)) ++ ++USER_OBJS := $(filter %_user.o,$(obj-y) $(obj-m) $(SINGLE_OBJS)) ++USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) ++ ++USER_CFLAGS += -DSTAT64_INO_FIELD=$(STAT64_INO_FIELD) ++ ++$(USER_OBJS) : %.o: %.c ++ $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< +Index: uml-2.6.7/arch/um/kernel/skas/mmu.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/mmu.c 2004-07-16 19:37:51.994120768 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/mmu.c 2004-07-16 19:47:23.730203672 +0300 +@@ -22,9 +22,11 @@ + else from = -1; + + mm->context.skas.mm_fd = new_mm(from); +- if(mm->context.skas.mm_fd < 0) +- panic("init_new_context_skas - new_mm failed, errno = %d\n", +- mm->context.skas.mm_fd); ++ if(mm->context.skas.mm_fd < 0){ ++ printk("init_new_context_skas - new_mm failed, errno = %d\n", ++ mm->context.skas.mm_fd); ++ return(mm->context.skas.mm_fd); ++ } + + return(0); + } +Index: uml-2.6.7/arch/um/kernel/skas/sys-i386/sigcontext.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/sys-i386/sigcontext.c 2004-07-16 19:35:56.079742432 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/sys-i386/sigcontext.c 2004-07-16 19:47:23.733203216 +0300 +@@ -12,10 +12,9 @@ + #include "kern_util.h" + #include "user.h" + #include "sigcontext.h" ++#include "mode.h" + +-extern int userspace_pid; +- +-int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr) ++int copy_sc_from_user_skas(int pid, union uml_pt_regs *regs, void *from_ptr) + { + struct sigcontext sc, *from = from_ptr; + unsigned long fpregs[FP_FRAME_SIZE]; +@@ -41,13 +40,12 @@ + regs->skas.regs[EIP] = sc.eip; + regs->skas.regs[CS] = sc.cs; + regs->skas.regs[EFL] = sc.eflags; +- regs->skas.regs[UESP] = sc.esp_at_signal; + regs->skas.regs[SS] = sc.ss; + regs->skas.fault_addr = sc.cr2; + regs->skas.fault_type = FAULT_WRITE(sc.err); + regs->skas.trap_type = sc.trapno; + +- err = ptrace(PTRACE_SETFPREGS, userspace_pid, 0, fpregs); ++ err = ptrace(PTRACE_SETFPREGS, pid, 0, fpregs); + if(err < 0){ + printk("copy_sc_to_user - PTRACE_SETFPREGS failed, " + "errno = %d\n", errno); +@@ -57,8 +55,9 @@ + return(0); + } + +-int copy_sc_to_user_skas(void *to_ptr, void *fp, union uml_pt_regs *regs, +- unsigned long fault_addr, int fault_type) ++int copy_sc_to_user_skas(int pid, void *to_ptr, void *fp, ++ union uml_pt_regs *regs, unsigned long fault_addr, ++ int fault_type) + { + struct sigcontext sc, *to = to_ptr; + struct _fpstate *to_fp; +@@ -86,7 +85,7 @@ + sc.err = TO_SC_ERR(fault_type); + sc.trapno = regs->skas.trap_type; + +- err = ptrace(PTRACE_GETFPREGS, userspace_pid, 0, fpregs); ++ err = ptrace(PTRACE_GETFPREGS, pid, 0, fpregs); + if(err < 0){ + printk("copy_sc_to_user - PTRACE_GETFPREGS failed, " + "errno = %d\n", errno); +Index: uml-2.6.7/arch/um/kernel/skas/process.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/process.c 2004-07-16 19:37:38.120229920 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/process.c 2004-07-16 19:47:24.793042096 +0300 +@@ -4,6 +4,7 @@ + */ + + #include <stdlib.h> ++#include <unistd.h> + #include <errno.h> + #include <signal.h> + #include <setjmp.h> +@@ -24,6 +25,19 @@ + #include "os.h" + #include "proc_mm.h" + #include "skas_ptrace.h" ++#include "chan_user.h" ++#include "signal_user.h" ++ ++int is_skas_winch(int pid, int fd, void *data) ++{ ++ if(pid != getpid()) ++ return(0); ++ ++ register_winch_irq(-1, fd, -1, data); ++ return(1); ++} ++ ++/* These are set once at boot time and not changed thereafter */ + + unsigned long exec_regs[FRAME_SIZE]; + unsigned long exec_fp_regs[HOST_FP_SIZE]; +@@ -43,37 +57,39 @@ + segv(fault.addr, 0, FAULT_WRITE(fault.is_write), 1, NULL); + } + +-static void handle_trap(int pid, union uml_pt_regs *regs) ++/*To use the same value of using_sysemu as the caller, ask it that value (in local_using_sysemu)*/ ++static void handle_trap(int pid, union uml_pt_regs *regs, int local_using_sysemu) + { + int err, syscall_nr, status; + + syscall_nr = PT_SYSCALL_NR(regs->skas.regs); ++ UPT_SYSCALL_NR(regs) = syscall_nr; + if(syscall_nr < 1){ + relay_signal(SIGTRAP, regs); + return; + } +- UPT_SYSCALL_NR(regs) = syscall_nr; + +- err = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid); +- if(err < 0) +- panic("handle_trap - nullifying syscall failed errno = %d\n", +- errno); ++ if (!local_using_sysemu) ++ { ++ err = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid); ++ if(err < 0) ++ panic("handle_trap - nullifying syscall failed errno = %d\n", ++ errno); + +- err = ptrace(PTRACE_SYSCALL, pid, 0, 0); +- if(err < 0) +- panic("handle_trap - continuing to end of syscall failed, " +- "errno = %d\n", errno); +- +- err = waitpid(pid, &status, WUNTRACED); +- if((err < 0) || !WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP)) +- panic("handle_trap - failed to wait at end of syscall, " +- "errno = %d, status = %d\n", errno, status); ++ err = ptrace(PTRACE_SYSCALL, pid, 0, 0); ++ if(err < 0) ++ panic("handle_trap - continuing to end of syscall failed, " ++ "errno = %d\n", errno); ++ ++ CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED)); ++ if((err < 0) || !WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP)) ++ panic("handle_trap - failed to wait at end of syscall, " ++ "errno = %d, status = %d\n", errno, status); ++ } + + handle_syscall(regs); + } + +-int userspace_pid; +- + static int userspace_tramp(void *arg) + { + init_new_thread_signals(0); +@@ -83,7 +99,11 @@ + return(0); + } + +-void start_userspace(void) ++/* Each element set once, and only accessed by a single processor anyway */ ++#define NR_CPUS 1 ++int userspace_pid[NR_CPUS]; ++ ++void start_userspace(int cpu) + { + void *stack; + unsigned long sp; +@@ -101,7 +121,7 @@ + panic("start_userspace : clone failed, errno = %d", errno); + + do { +- n = waitpid(pid, &status, WUNTRACED); ++ CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + if(n < 0) + panic("start_userspace : wait failed, errno = %d", + errno); +@@ -114,21 +134,27 @@ + if(munmap(stack, PAGE_SIZE) < 0) + panic("start_userspace : munmap failed, errno = %d\n", errno); + +- userspace_pid = pid; ++ userspace_pid[cpu] = pid; + } + + void userspace(union uml_pt_regs *regs) + { +- int err, status, op; ++ int err, status, op, pid = userspace_pid[0]; ++ int local_using_sysemu; /*To prevent races if using_sysemu changes under us.*/ + + restore_registers(regs); + +- err = ptrace(PTRACE_SYSCALL, userspace_pid, 0, 0); ++ local_using_sysemu = get_using_sysemu(); ++ ++ if (local_using_sysemu) ++ err = ptrace(PTRACE_SYSEMU, pid, 0, 0); ++ else ++ err = ptrace(PTRACE_SYSCALL, pid, 0, 0); + if(err) + panic("userspace - PTRACE_SYSCALL failed, errno = %d\n", + errno); + while(1){ +- err = waitpid(userspace_pid, &status, WUNTRACED); ++ CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED)); + if(err < 0) + panic("userspace - waitpid failed, errno = %d\n", + errno); +@@ -139,16 +165,17 @@ + if(WIFSTOPPED(status)){ + switch(WSTOPSIG(status)){ + case SIGSEGV: +- handle_segv(userspace_pid); ++ handle_segv(pid); + break; + case SIGTRAP: +- handle_trap(userspace_pid, regs); ++ handle_trap(pid, regs, local_using_sysemu); + break; + case SIGIO: + case SIGVTALRM: + case SIGILL: + case SIGBUS: + case SIGFPE: ++ case SIGWINCH: + user_signal(WSTOPSIG(status), regs); + break; + default: +@@ -160,9 +187,17 @@ + + restore_registers(regs); + +- op = singlestepping_skas() ? PTRACE_SINGLESTEP : +- PTRACE_SYSCALL; +- err = ptrace(op, userspace_pid, 0, 0); ++ /*Now we ended the syscall, so re-read local_using_sysemu.*/ ++ local_using_sysemu = get_using_sysemu(); ++ ++ if (local_using_sysemu) ++ op = singlestepping_skas() ? PTRACE_SINGLESTEP : ++ PTRACE_SYSEMU; ++ else ++ op = singlestepping_skas() ? PTRACE_SINGLESTEP : ++ PTRACE_SYSCALL; ++ ++ err = ptrace(op, pid, 0, 0); + if(err) + panic("userspace - PTRACE_SYSCALL failed, " + "errno = %d\n", errno); +@@ -172,13 +207,25 @@ + void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, + void (*handler)(int)) + { ++ unsigned long flags; + jmp_buf switch_buf, fork_buf; + + *switch_buf_ptr = &switch_buf; + *fork_buf_ptr = &fork_buf; + +- if(setjmp(fork_buf) == 0) ++ /* Somewhat subtle - siglongjmp restores the signal mask before doing ++ * the longjmp. This means that when jumping from one stack to another ++ * when the target stack has interrupts enabled, an interrupt may occur ++ * on the source stack. This is bad when starting up a process because ++ * it's not supposed to get timer ticks until it has been scheduled. ++ * So, we disable interrupts around the sigsetjmp to ensure that ++ * they can't happen until we get back here where they are safe. ++ */ ++ flags = get_signals(); ++ block_signals(); ++ if(sigsetjmp(fork_buf, 1) == 0) + new_thread_proc(stack, handler); ++ set_signals(flags); + + remove_sigstack(); + } +@@ -189,16 +236,16 @@ + + *switch_buf = &buf; + fork_buf = fb; +- if(setjmp(buf) == 0) +- longjmp(*fork_buf, 1); ++ if(sigsetjmp(buf, 1) == 0) ++ siglongjmp(*fork_buf, 1); + } + +-static int move_registers(int int_op, int fp_op, union uml_pt_regs *regs, +- unsigned long *fp_regs) ++static int move_registers(int pid, int int_op, int fp_op, ++ union uml_pt_regs *regs, unsigned long *fp_regs) + { +- if(ptrace(int_op, userspace_pid, 0, regs->skas.regs) < 0) ++ if(ptrace(int_op, pid, 0, regs->skas.regs) < 0) + return(-errno); +- if(ptrace(fp_op, userspace_pid, 0, fp_regs) < 0) ++ if(ptrace(fp_op, pid, 0, fp_regs) < 0) + return(-errno); + return(0); + } +@@ -217,10 +264,11 @@ + fp_regs = regs->skas.fp; + } + +- err = move_registers(PTRACE_GETREGS, fp_op, regs, fp_regs); ++ err = move_registers(userspace_pid[0], PTRACE_GETREGS, fp_op, regs, ++ fp_regs); + if(err) + panic("save_registers - saving registers failed, errno = %d\n", +- err); ++ -err); + } + + void restore_registers(union uml_pt_regs *regs) +@@ -237,10 +285,11 @@ + fp_regs = regs->skas.fp; + } + +- err = move_registers(PTRACE_SETREGS, fp_op, regs, fp_regs); ++ err = move_registers(userspace_pid[0], PTRACE_SETREGS, fp_op, regs, ++ fp_regs); + if(err) + panic("restore_registers - saving registers failed, " +- "errno = %d\n", err); ++ "errno = %d\n", -err); + } + + void switch_threads(void *me, void *next) +@@ -248,8 +297,8 @@ + jmp_buf my_buf, **me_ptr = me, *next_buf = next; + + *me_ptr = &my_buf; +- if(setjmp(my_buf) == 0) +- longjmp(*next_buf, 1); ++ if(sigsetjmp(my_buf, 1) == 0) ++ siglongjmp(*next_buf, 1); + } + + static jmp_buf initial_jmpbuf; +@@ -265,14 +314,14 @@ + int n; + + *fork_buf_ptr = &initial_jmpbuf; +- n = setjmp(initial_jmpbuf); ++ n = sigsetjmp(initial_jmpbuf, 1); + if(n == 0) + new_thread_proc((void *) stack, new_thread_handler); + else if(n == 1) + remove_sigstack(); + else if(n == 2){ + (*cb_proc)(cb_arg); +- longjmp(*cb_back, 1); ++ siglongjmp(*cb_back, 1); + } + else if(n == 3){ + kmalloc_ok = 0; +@@ -282,7 +331,7 @@ + kmalloc_ok = 0; + return(1); + } +- longjmp(**switch_buf, 1); ++ siglongjmp(**switch_buf, 1); + } + + void remove_sigstack(void) +@@ -304,8 +353,8 @@ + cb_back = &here; + + block_signals(); +- if(setjmp(here) == 0) +- longjmp(initial_jmpbuf, 2); ++ if(sigsetjmp(here, 1) == 0) ++ siglongjmp(initial_jmpbuf, 2); + unblock_signals(); + + cb_proc = NULL; +@@ -316,22 +365,23 @@ + void halt_skas(void) + { + block_signals(); +- longjmp(initial_jmpbuf, 3); ++ siglongjmp(initial_jmpbuf, 3); + } + + void reboot_skas(void) + { + block_signals(); +- longjmp(initial_jmpbuf, 4); ++ siglongjmp(initial_jmpbuf, 4); + } + + int new_mm(int from) + { + struct proc_mm_op copy; +- int n, fd = os_open_file("/proc/mm", of_write(OPENFLAGS()), 0); ++ int n, fd = os_open_file("/proc/mm", ++ of_cloexec(of_write(OPENFLAGS())), 0); + + if(fd < 0) +- return(-errno); ++ return(fd); + + if(from != -1){ + copy = ((struct proc_mm_op) { .op = MM_COPY_SEGMENTS, +@@ -340,8 +390,9 @@ + n = os_write_file(fd, ©, sizeof(copy)); + if(n != sizeof(copy)) + printk("new_mm : /proc/mm copy_segments failed, " +- "errno = %d\n", errno); ++ "err = %d\n", -n); + } ++ + return(fd); + } + +@@ -349,7 +400,8 @@ + { + int err; + +- err = ptrace(PTRACE_SWITCH_MM, userspace_pid, 0, mm_fd); ++#warning need cpu pid in switch_mm_skas ++ err = ptrace(PTRACE_SWITCH_MM, userspace_pid[0], 0, mm_fd); + if(err) + panic("switch_mm_skas - PTRACE_SWITCH_MM failed, errno = %d\n", + errno); +@@ -357,7 +409,8 @@ + + void kill_off_processes_skas(void) + { +- os_kill_process(userspace_pid, 1); ++#warning need to loop over userspace_pids in kill_off_processes_skas ++ os_kill_process(userspace_pid[0], 1); + } + + void init_registers(int pid) +Index: uml-2.6.7/arch/um/os-Linux/tty.c +=================================================================== +--- uml-2.6.7.orig/arch/um/os-Linux/tty.c 2004-07-16 19:36:54.138916096 +0300 ++++ uml-2.6.7/arch/um/os-Linux/tty.c 2004-07-16 19:47:23.769197744 +0300 +@@ -28,10 +28,10 @@ + struct grantpt_info info; + int fd; + +- if((fd = os_open_file("/dev/ptmx", of_rdwr(OPENFLAGS()), 0)) < 0){ +- printk("get_pty : Couldn't open /dev/ptmx - errno = %d\n", +- errno); +- return(-1); ++ fd = os_open_file("/dev/ptmx", of_rdwr(OPENFLAGS()), 0); ++ if(fd < 0){ ++ printk("get_pty : Couldn't open /dev/ptmx - err = %d\n", -fd); ++ return(fd); + } + + info.fd = fd; +@@ -39,7 +39,7 @@ + + if(info.res < 0){ + printk("get_pty : Couldn't grant pty - errno = %d\n", +- info.err); ++ -info.err); + return(-1); + } + if(unlockpt(fd) < 0){ +Index: uml-2.6.7/arch/um/sys-ia64/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-ia64/Makefile 2004-07-16 19:35:55.505829680 +0300 ++++ uml-2.6.7/arch/um/sys-ia64/Makefile 2004-07-16 19:47:23.778196376 +0300 +@@ -7,18 +7,5 @@ + $(OBJ): $(OBJS) + rm -f $@ + $(LD) $(LINKFLAGS) --start-group $^ --end-group -o $@ +-clean: +- rm -f $(OBJS) + +-fastdep: +- +-archmrproper: +- +-archclean: +- rm -f link.ld +- @$(MAKEBOOT) clean +- +-archdep: +- @$(MAKEBOOT) dep +- +-modules: ++clean-files := $(OBJS) link.ld +Index: uml-2.6.7/arch/um/sys-i386/util/mk_sc.c +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-i386/util/mk_sc.c 2004-07-16 19:37:26.086059392 +0300 ++++ uml-2.6.7/arch/um/sys-i386/util/mk_sc.c 2004-07-16 19:47:23.778196376 +0300 +@@ -38,6 +38,7 @@ + SC_OFFSET("SC_ERR", err); + SC_OFFSET("SC_CR2", cr2); + SC_OFFSET("SC_FPSTATE", fpstate); ++ SC_OFFSET("SC_SIGMASK", oldmask); + SC_FP_OFFSET("SC_FP_CW", cw); + SC_FP_OFFSET("SC_FP_SW", sw); + SC_FP_OFFSET("SC_FP_TAG", tag); +Index: uml-2.6.7/arch/um/sys-i386/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-i386/Makefile 2004-07-16 19:36:05.106370176 +0300 ++++ uml-2.6.7/arch/um/sys-i386/Makefile 2004-07-16 19:47:23.772197288 +0300 +@@ -1,7 +1,8 @@ +-obj-y = bugs.o checksum.o extable.o fault.o ksyms.o ldt.o module.o \ +- ptrace.o ptrace_user.o semaphore.o sigcontext.o syscalls.o sysrq.o ++obj-y = bugs.o checksum.o fault.o ksyms.o ldt.o ptrace.o ptrace_user.o \ ++ semaphore.o sigcontext.o syscalls.o sysrq.o time.o + + obj-$(CONFIG_HIGHMEM) += highmem.o ++obj-$(CONFIG_MODULES) += module.o + + USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o + USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) +@@ -9,6 +10,8 @@ + SYMLINKS = semaphore.c highmem.c module.c + SYMLINKS := $(foreach f,$(SYMLINKS),$(src)/$f) + ++clean-files := $(SYMLINKS) ++ + semaphore.c-dir = kernel + highmem.c-dir = mm + module.c-dir = kernel +@@ -24,19 +27,4 @@ + $(SYMLINKS): + $(call make_link,$@) + +-clean: +- $(MAKE) -C util clean +- +-fastdep: +- +-dep: +- +-archmrproper: +- rm -f $(SYMLINKS) +- +-archclean: +- +-archdep: +- +-modules: +- ++subdir- := util +Index: uml-2.6.7/arch/um/kernel/signal_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/signal_kern.c 2004-07-16 19:36:51.321344432 +0300 ++++ uml-2.6.7/arch/um/kernel/signal_kern.c 2004-07-16 19:47:23.726204280 +0300 +@@ -36,7 +36,7 @@ + if(sig == SIGSEGV){ + struct k_sigaction *ka; + +- ka = ¤t->sig->action[SIGSEGV - 1]; ++ ka = ¤t->sighand->action[SIGSEGV - 1]; + ka->sa.sa_handler = SIG_DFL; + } + force_sig(SIGSEGV, current); +@@ -60,10 +60,10 @@ + int err, ret; + + ret = 0; ++ /* Always make any pending restarted system calls return -EINTR */ ++ current_thread_info()->restart_block.fn = do_no_restart_syscall; + switch(error){ + case -ERESTART_RESTARTBLOCK: +- current_thread_info()->restart_block.fn = +- do_no_restart_syscall; + case -ERESTARTNOHAND: + ret = -EINTR; + break; +@@ -142,7 +142,7 @@ + return(0); + + /* Whee! Actually deliver the signal. */ +- ka = ¤t->sig->action[sig -1 ]; ++ ka = ¤t->sighand->action[sig -1 ]; + err = handle_signal(regs, sig, ka, &info, oldset, error); + if(!err) return(1); + +@@ -201,7 +201,7 @@ + } + } + +-int sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize) ++int sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize) + { + sigset_t saveset, newset; + +@@ -227,20 +227,59 @@ + } + } + ++int sys_sigaction(int sig, const struct old_sigaction __user *act, ++ struct old_sigaction __user *oact) ++{ ++ struct k_sigaction new_ka, old_ka; ++ int ret; ++ ++ if (act) { ++ old_sigset_t mask; ++ if (verify_area(VERIFY_READ, act, sizeof(*act)) || ++ __get_user(new_ka.sa.sa_handler, &act->sa_handler) || ++ __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) ++ return -EFAULT; ++ __get_user(new_ka.sa.sa_flags, &act->sa_flags); ++ __get_user(mask, &act->sa_mask); ++ siginitset(&new_ka.sa.sa_mask, mask); ++ } ++ ++ ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); ++ ++ if (!ret && oact) { ++ if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || ++ __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || ++ __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) ++ return -EFAULT; ++ __put_user(old_ka.sa.sa_flags, &oact->sa_flags); ++ __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); ++ } ++ ++ return ret; ++} ++ ++int sys_sigaltstack(const stack_t *uss, stack_t *uoss) ++{ ++ return(do_sigaltstack(uss, uoss, PT_REGS_SP(¤t->thread.regs))); ++} ++ ++extern int userspace_pid[]; ++ + static int copy_sc_from_user(struct pt_regs *to, void *from, + struct arch_frame_data *arch) + { + int ret; + + ret = CHOOSE_MODE(copy_sc_from_user_tt(UPT_SC(&to->regs), from, arch), +- copy_sc_from_user_skas(&to->regs, from)); ++ copy_sc_from_user_skas(userspace_pid[0], ++ &to->regs, from)); + return(ret); + } + + int sys_sigreturn(struct pt_regs regs) + { +- void *sc = sp_to_sc(PT_REGS_SP(¤t->thread.regs)); +- void *mask = sp_to_mask(PT_REGS_SP(¤t->thread.regs)); ++ void __user *sc = sp_to_sc(PT_REGS_SP(¤t->thread.regs)); ++ void __user *mask = sp_to_mask(PT_REGS_SP(¤t->thread.regs)); + int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long); + + spin_lock_irq(¤t->sighand->siglock); +@@ -257,8 +296,8 @@ + + int sys_rt_sigreturn(struct pt_regs regs) + { +- struct ucontext *uc = sp_to_uc(PT_REGS_SP(¤t->thread.regs)); +- void *fp; ++ unsigned long sp = PT_REGS_SP(¤t->thread.regs); ++ struct ucontext __user *uc = sp_to_uc(sp); + int sig_size = _NSIG_WORDS * sizeof(unsigned long); + + spin_lock_irq(¤t->sighand->siglock); +@@ -266,7 +305,6 @@ + sigdelsetmask(¤t->blocked, ~_BLOCKABLE); + recalc_sigpending(); + spin_unlock_irq(¤t->sighand->siglock); +- fp = (void *) (((unsigned long) uc) + sizeof(struct ucontext)); + copy_sc_from_user(¤t->thread.regs, &uc->uc_mcontext, + &signal_frame_si.common.arch); + return(PT_REGS_SYSCALL_RET(¤t->thread.regs)); +Index: uml-2.6.7/arch/um/kernel/sysrq.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/sysrq.c 2004-07-16 19:36:24.697391888 +0300 ++++ uml-2.6.7/arch/um/kernel/sysrq.c 2004-07-16 19:47:23.739202304 +0300 +@@ -44,6 +44,11 @@ + } + EXPORT_SYMBOL(dump_stack); + ++void show_stack(struct task_struct *task, unsigned long *sp) ++{ ++ show_trace(sp); ++} ++ + /* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically +Index: uml-2.6.7/arch/um/include/sysdep-i386/syscalls.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/sysdep-i386/syscalls.h 2004-07-16 19:36:04.873405592 +0300 ++++ uml-2.6.7/arch/um/include/sysdep-i386/syscalls.h 2004-07-16 19:47:23.708207016 +0300 +@@ -11,39 +11,34 @@ + #define EXECUTE_SYSCALL(syscall, regs) \ + ((long (*)(struct syscall_args)) (*sys_call_table[syscall]))(SYSCALL_ARGS(®s->regs)) + +-extern syscall_handler_t sys_modify_ldt; +-extern syscall_handler_t old_mmap_i386; +-extern syscall_handler_t old_select; +-extern syscall_handler_t sys_ni_syscall; +- + #define ARCH_SYSCALLS \ +- [ __NR_mmap ] = old_mmap_i386, \ +- [ __NR_select ] = old_select, \ +- [ __NR_vm86old ] = sys_ni_syscall, \ +- [ __NR_modify_ldt ] = sys_modify_ldt, \ +- [ __NR_lchown32 ] = sys_lchown, \ +- [ __NR_getuid32 ] = sys_getuid, \ +- [ __NR_getgid32 ] = sys_getgid, \ +- [ __NR_geteuid32 ] = sys_geteuid, \ +- [ __NR_getegid32 ] = sys_getegid, \ +- [ __NR_setreuid32 ] = sys_setreuid, \ +- [ __NR_setregid32 ] = sys_setregid, \ +- [ __NR_getgroups32 ] = sys_getgroups, \ +- [ __NR_setgroups32 ] = sys_setgroups, \ +- [ __NR_fchown32 ] = sys_fchown, \ +- [ __NR_setresuid32 ] = sys_setresuid, \ +- [ __NR_getresuid32 ] = sys_getresuid, \ +- [ __NR_setresgid32 ] = sys_setresgid, \ +- [ __NR_getresgid32 ] = sys_getresgid, \ +- [ __NR_chown32 ] = sys_chown, \ +- [ __NR_setuid32 ] = sys_setuid, \ +- [ __NR_setgid32 ] = sys_setgid, \ +- [ __NR_setfsuid32 ] = sys_setfsuid, \ +- [ __NR_setfsgid32 ] = sys_setfsgid, \ +- [ __NR_pivot_root ] = sys_pivot_root, \ +- [ __NR_mincore ] = sys_mincore, \ +- [ __NR_madvise ] = sys_madvise, \ +- [ 222 ] = sys_ni_syscall, ++ [ __NR_mmap ] = (syscall_handler_t *) old_mmap_i386, \ ++ [ __NR_select ] = (syscall_handler_t *) old_select, \ ++ [ __NR_vm86old ] = (syscall_handler_t *) sys_ni_syscall, \ ++ [ __NR_modify_ldt ] = (syscall_handler_t *) sys_modify_ldt, \ ++ [ __NR_lchown32 ] = (syscall_handler_t *) sys_lchown, \ ++ [ __NR_getuid32 ] = (syscall_handler_t *) sys_getuid, \ ++ [ __NR_getgid32 ] = (syscall_handler_t *) sys_getgid, \ ++ [ __NR_geteuid32 ] = (syscall_handler_t *) sys_geteuid, \ ++ [ __NR_getegid32 ] = (syscall_handler_t *) sys_getegid, \ ++ [ __NR_setreuid32 ] = (syscall_handler_t *) sys_setreuid, \ ++ [ __NR_setregid32 ] = (syscall_handler_t *) sys_setregid, \ ++ [ __NR_getgroups32 ] = (syscall_handler_t *) sys_getgroups, \ ++ [ __NR_setgroups32 ] = (syscall_handler_t *) sys_setgroups, \ ++ [ __NR_fchown32 ] = (syscall_handler_t *) sys_fchown, \ ++ [ __NR_setresuid32 ] = (syscall_handler_t *) sys_setresuid, \ ++ [ __NR_getresuid32 ] = (syscall_handler_t *) sys_getresuid, \ ++ [ __NR_setresgid32 ] = (syscall_handler_t *) sys_setresgid, \ ++ [ __NR_getresgid32 ] = (syscall_handler_t *) sys_getresgid, \ ++ [ __NR_chown32 ] = (syscall_handler_t *) sys_chown, \ ++ [ __NR_setuid32 ] = (syscall_handler_t *) sys_setuid, \ ++ [ __NR_setgid32 ] = (syscall_handler_t *) sys_setgid, \ ++ [ __NR_setfsuid32 ] = (syscall_handler_t *) sys_setfsuid, \ ++ [ __NR_setfsgid32 ] = (syscall_handler_t *) sys_setfsgid, \ ++ [ __NR_pivot_root ] = (syscall_handler_t *) sys_pivot_root, \ ++ [ __NR_mincore ] = (syscall_handler_t *) sys_mincore, \ ++ [ __NR_madvise ] = (syscall_handler_t *) sys_madvise, \ ++ [ 222 ] = (syscall_handler_t *) sys_ni_syscall, + + /* 222 doesn't yet have a name in include/asm-i386/unistd.h */ + +Index: uml-2.6.7/include/linux/time.h +=================================================================== +--- uml-2.6.7.orig/include/linux/time.h 2004-07-16 19:36:57.136460400 +0300 ++++ uml-2.6.7/include/linux/time.h 2004-07-16 19:47:23.805192272 +0300 +@@ -41,7 +41,7 @@ + * Have the 32 bit jiffies value wrap 5 minutes after boot + * so jiffies wrap bugs show up earlier. + */ +-#define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ)) ++#define INITIAL_JIFFIES ((unsigned long)(0)) + + /* + * Change timeval to jiffies, trying to avoid the +Index: uml-2.6.7/include/asm-um/page.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/page.h 2004-07-16 19:36:51.390333944 +0300 ++++ uml-2.6.7/include/asm-um/page.h 2004-07-16 19:47:23.792194248 +0300 +@@ -1,10 +1,14 @@ ++/* ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) ++ * Licensed under the GPL ++ */ ++ + #ifndef __UM_PAGE_H + #define __UM_PAGE_H + + struct page; + + #include "asm/arch/page.h" +-#include "asm/bug.h" + + #undef __pa + #undef __va +@@ -24,25 +28,36 @@ + + #define __va_space (8*1024*1024) + +-extern unsigned long region_pa(void *virt); +-extern void *region_va(unsigned long phys); +- +-#define __pa(virt) region_pa((void *) (virt)) +-#define __va(phys) region_va((unsigned long) (phys)) +- +-extern unsigned long page_to_pfn(struct page *page); +-extern struct page *pfn_to_page(unsigned long pfn); ++extern unsigned long to_phys(void *virt); ++extern void *to_virt(unsigned long phys); + +-extern struct page *phys_to_page(unsigned long phys); ++#define __pa(virt) to_phys((void *) virt) ++#define __va(phys) to_virt((unsigned long) phys) + +-#define virt_to_page(v) (phys_to_page(__pa(v))) ++#define page_to_pfn(page) ((page) - mem_map) ++#define pfn_to_page(pfn) (mem_map + (pfn)) + +-extern struct page *page_mem_map(struct page *page); ++#define phys_to_pfn(p) ((p) >> PAGE_SHIFT) ++#define pfn_to_phys(pfn) ((pfn) << PAGE_SHIFT) + +-#define pfn_valid(pfn) (page_mem_map(pfn_to_page(pfn)) != NULL) +-#define virt_addr_valid(v) pfn_valid(__pa(v) >> PAGE_SHIFT) ++#define pfn_valid(pfn) ((pfn) < max_mapnr) ++#define virt_addr_valid(v) pfn_valid(phys_to_pfn(__pa(v))) + + extern struct page *arch_validate(struct page *page, int mask, int order); + #define HAVE_ARCH_VALIDATE + ++extern void arch_free_page(struct page *page, int order); ++#define HAVE_ARCH_FREE_PAGE ++ + #endif ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/include/signal_user.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/signal_user.h 2004-07-16 19:35:55.511828768 +0300 ++++ uml-2.6.7/arch/um/include/signal_user.h 2004-07-16 19:47:23.705207472 +0300 +@@ -11,6 +11,8 @@ + extern int change_sig(int signal, int on); + extern void set_sigstack(void *stack, int size); + extern void set_handler(int sig, void (*handler)(int), int flags, ...); ++extern int set_signals(int enable); ++extern int get_signals(void); + + #endif + +Index: uml-2.6.7/include/asm-um/local.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/local.h 2004-07-16 19:47:23.633218416 +0300 ++++ uml-2.6.7/include/asm-um/local.h 2004-07-16 19:47:23.791194400 +0300 +@@ -0,0 +1,6 @@ ++#ifndef __UM_LOCAL_H ++#define __UM_LOCAL_H ++ ++#include "asm/arch/local.h" ++ ++#endif +Index: uml-2.6.7/include/asm-um/thread_info.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/thread_info.h 2004-07-16 19:36:22.451733280 +0300 ++++ uml-2.6.7/include/asm-um/thread_info.h 2004-07-16 19:47:23.803192576 +0300 +@@ -9,6 +9,7 @@ + #ifndef __ASSEMBLY__ + + #include <asm/processor.h> ++#include <asm/types.h> + + struct thread_info { + struct task_struct *task; /* main task structure */ +@@ -43,15 +44,18 @@ + static inline struct thread_info *current_thread_info(void) + { + struct thread_info *ti; +- __asm__("andl %%esp,%0; ":"=r" (ti) : "0" (~16383UL)); ++ unsigned long mask = PAGE_SIZE * ++ (1 << CONFIG_KERNEL_STACK_ORDER) - 1; ++ __asm__("andl %%esp,%0; ":"=r" (ti) : "0" (~mask)); + return ti; + } + + /* thread information allocation */ +-#define THREAD_SIZE (4*PAGE_SIZE) +-#define alloc_thread_info(tsk) ((struct thread_info *) \ +- __get_free_pages(GFP_KERNEL,2)) +-#define free_thread_info(ti) free_pages((unsigned long) (ti), 2) ++#define THREAD_SIZE ((1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE) ++#define alloc_thread_info(tsk) \ ++ ((struct thread_info *) kmalloc(THREAD_SIZE, GFP_KERNEL)) ++#define free_thread_info(ti) kfree(ti) ++ + #define get_thread_info(ti) get_task_struct((ti)->task) + #define put_thread_info(ti) put_task_struct((ti)->task) + +@@ -65,11 +69,13 @@ + #define TIF_POLLING_NRFLAG 3 /* true if poll_idle() is polling + * TIF_NEED_RESCHED + */ ++#define TIF_RESTART_BLOCK 4 + + #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) + #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) + #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) + #define _TIF_POLLING_NRFLAG (1 << TIF_POLLING_NRFLAG) ++#define _TIF_RESTART_BLOCK (1 << TIF_RESTART_BLOCK) + + #endif + +Index: uml-2.6.7/include/asm-um/dma-mapping.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/dma-mapping.h 2004-07-16 19:36:02.148819792 +0300 ++++ uml-2.6.7/include/asm-um/dma-mapping.h 2004-07-16 19:47:23.789194704 +0300 +@@ -1 +1,119 @@ +-#include <asm-generic/dma-mapping.h> ++#ifndef _ASM_DMA_MAPPING_H ++#define _ASM_DMA_MAPPING_H ++ ++static inline int ++dma_supported(struct device *dev, u64 mask) ++{ ++ BUG(); ++ return(0); ++} ++ ++static inline int ++dma_set_mask(struct device *dev, u64 dma_mask) ++{ ++ BUG(); ++ return(0); ++} ++ ++static inline void * ++dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle, ++ int flag) ++{ ++ BUG(); ++ return((void *) 0); ++} ++ ++static inline void ++dma_free_coherent(struct device *dev, size_t size, void *cpu_addr, ++ dma_addr_t dma_handle) ++{ ++ BUG(); ++} ++ ++static inline dma_addr_t ++dma_map_single(struct device *dev, void *cpu_addr, size_t size, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++ return(0); ++} ++ ++static inline void ++dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++} ++ ++static inline dma_addr_t ++dma_map_page(struct device *dev, struct page *page, ++ unsigned long offset, size_t size, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++ return(0); ++} ++ ++static inline void ++dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++} ++ ++static inline int ++dma_map_sg(struct device *dev, struct scatterlist *sg, int nents, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++ return(0); ++} ++ ++static inline void ++dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nhwentries, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++} ++ ++static inline void ++dma_sync_single(struct device *dev, dma_addr_t dma_handle, size_t size, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++} ++ ++static inline void ++dma_sync_sg(struct device *dev, struct scatterlist *sg, int nelems, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++} ++ ++#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) ++#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) ++#define dma_is_consistent(d) (1) ++ ++static inline int ++dma_get_cache_alignment(void) ++{ ++ BUG(); ++ return(0); ++} ++ ++static inline void ++dma_sync_single_range(struct device *dev, dma_addr_t dma_handle, ++ unsigned long offset, size_t size, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++} ++ ++static inline void ++dma_cache_sync(void *vaddr, size_t size, ++ enum dma_data_direction direction) ++{ ++ BUG(); ++} ++ ++#endif +Index: uml-2.6.7/arch/um/kernel/skas/syscall_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/syscall_user.c 2004-07-16 19:37:35.225669960 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/syscall_user.c 2004-07-16 19:47:23.732203368 +0300 +@@ -22,7 +22,7 @@ + + index = record_syscall_start(UPT_SYSCALL_NR(regs)); + +- syscall_trace(); ++ syscall_trace(regs, 1); + result = execute_syscall(regs); + + REGS_SET_SYSCALL_RETURN(regs->skas.regs, result); +@@ -30,7 +30,7 @@ + (result == -ERESTARTNOINTR)) + do_signal(result); + +- syscall_trace(); ++ syscall_trace(regs, 0); + record_syscall_end(index, result); + } + +Index: uml-2.6.7/arch/um/kernel/process.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/process.c 2004-07-16 19:37:22.968533328 +0300 ++++ uml-2.6.7/arch/um/kernel/process.c 2004-07-16 19:47:24.795041792 +0300 +@@ -9,18 +9,17 @@ + #include <sched.h> + #include <errno.h> + #include <stdarg.h> +-#include <fcntl.h> + #include <stdlib.h> + #include <setjmp.h> + #include <sys/time.h> + #include <sys/ptrace.h> +-#include <sys/ioctl.h> + #include <sys/wait.h> + #include <sys/mman.h> + #include <asm/ptrace.h> + #include <asm/sigcontext.h> + #include <asm/unistd.h> + #include <asm/page.h> ++#include <asm/user.h> + #include "user_util.h" + #include "kern_util.h" + #include "user.h" +@@ -58,7 +57,11 @@ + { + int flags = altstack ? SA_ONSTACK : 0; + +- set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags, ++ /* NODEFER is set here because SEGV isn't turned back on when the ++ * handler is ready to receive signals. This causes any segfault ++ * during a copy_user to kill the process because the fault is blocked. ++ */ ++ set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags | SA_NODEFER, + SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); + set_handler(SIGTRAP, (__sighandler_t) sig_handler, flags, + SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); +@@ -72,7 +75,6 @@ + SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); + set_handler(SIGUSR2, (__sighandler_t) sig_handler, + SA_NOMASK | flags, -1); +- (void) CHOOSE_MODE(signal(SIGCHLD, SIG_IGN), (void *) 0); + signal(SIGHUP, SIG_IGN); + + init_irq_signals(altstack); +@@ -123,11 +125,12 @@ + /* Start the process and wait for it to kill itself */ + new_pid = clone(outer_tramp, (void *) sp, clone_flags, &arg); + if(new_pid < 0) return(-errno); +- while((err = waitpid(new_pid, &status, 0) < 0) && (errno == EINTR)) ; ++ CATCH_EINTR(err = waitpid(new_pid, &status, 0)); + if(err < 0) panic("Waiting for outer trampoline failed - errno = %d", + errno); + if(!WIFSIGNALED(status) || (WTERMSIG(status) != SIGKILL)) +- panic("outer trampoline didn't exit with SIGKILL"); ++ panic("outer trampoline didn't exit with SIGKILL, " ++ "status = %d", status); + + return(arg.pid); + } +@@ -138,7 +141,7 @@ + + os_stop_process(os_getpid()); + +- if(read(fd, &c, sizeof(c)) != sizeof(c)) ++ if(os_read_file(fd, &c, sizeof(c)) != sizeof(c)) + panic("read failed in suspend_new_thread"); + } + +@@ -168,7 +171,7 @@ + pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL); + if(pid < 0) + panic("check_ptrace : clone failed, errno = %d", errno); +- n = waitpid(pid, &status, WUNTRACED); ++ CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + if(n < 0) + panic("check_ptrace : wait failed, errno = %d", errno); + if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP)) +@@ -185,7 +188,7 @@ + + if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) + panic("check_ptrace : ptrace failed, errno = %d", errno); +- n = waitpid(pid, &status, 0); ++ CATCH_EINTR(n = waitpid(pid, &status, 0)); + if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) + panic("check_ptrace : child exited with status 0x%x", status); + +@@ -193,6 +196,22 @@ + panic("check_ptrace : munmap failed, errno = %d", errno); + } + ++static int force_sysemu_disabled = 0; ++ ++static int __init nosysemu_cmd_param(char *str, int* add) ++{ ++ force_sysemu_disabled = 1; ++ return 0; ++} ++ ++__uml_setup("nosysemu", nosysemu_cmd_param, ++ "nosysemu\n" ++ " Turns off syscall emulation patch for ptrace (SYSEMU) on.\n" ++ " SYSEMU is a performance-patch introduced by Laurent Vivier. It changes\n" ++ " behaviour of ptrace() and helps reducing host context switch rate.\n" ++ " To make it working, you need a kernel patch for your host, too.\n" ++ " See http://perso.wanadoo.fr/laurent.vivier/UML/ for further information.\n"); ++ + void __init check_ptrace(void) + { + void *stack; +@@ -205,7 +224,7 @@ + if(ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) + panic("check_ptrace : ptrace failed, errno = %d", + errno); +- n = waitpid(pid, &status, WUNTRACED); ++ CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + if(n < 0) + panic("check_ptrace : wait failed, errno = %d", errno); + if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP)) +@@ -225,6 +244,45 @@ + } + stop_ptraced_child(pid, stack, 0); + printk("OK\n"); ++ ++#ifdef UML_CONFIG_MODE_SKAS ++ printk("Checking syscall emulation patch for ptrace..."); ++ set_using_sysemu(0); ++ pid = start_ptraced_child(&stack); ++ if(ptrace(PTRACE_SYSEMU, pid, 0, 0) >= 0) { ++ struct user_regs_struct regs; ++ ++ CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); ++ if (n < 0) ++ panic("check_ptrace : wait failed, errno = %d", errno); ++ if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP)) ++ panic("check_ptrace : expected SIGTRAP, " ++ "got status = %d", status); ++ ++ if (ptrace(PTRACE_GETREGS, pid, 0, ®s) < 0) ++ panic("check_ptrace : failed to read child " ++ "registers, errno = %d", errno); ++ regs.orig_eax = pid; ++ if (ptrace(PTRACE_SETREGS, pid, 0, ®s) < 0) ++ panic("check_ptrace : failed to modify child " ++ "registers, errno = %d", errno); ++ ++ stop_ptraced_child(pid, stack, 0); ++ ++ if (!force_sysemu_disabled) { ++ printk("found\n"); ++ set_using_sysemu(1); ++ } else { ++ printk("found but disabled\n"); ++ } ++ } ++ else ++ { ++ printk("missing\n"); ++ stop_ptraced_child(pid, stack, 1); ++ } ++#endif ++ + } + + int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr) +@@ -233,7 +289,7 @@ + int n; + + *jmp_ptr = &buf; +- n = setjmp(buf); ++ n = sigsetjmp(buf, 1); + if(n != 0) + return(n); + (*fn)(arg); +@@ -273,7 +329,7 @@ + stop_ptraced_child(pid, stack, 1); + + printf("Checking for /proc/mm..."); +- if(access("/proc/mm", W_OK)){ ++ if(os_access("/proc/mm", OS_ACC_W_OK) < 0){ + printf("not found\n"); + ret = 0; + } +Index: uml-2.6.7/arch/um/drivers/stdio_console.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/stdio_console.c 2004-07-16 19:36:13.845041696 +0300 ++++ uml-2.6.7/arch/um/drivers/stdio_console.c 2004-07-16 19:47:23.694209144 +0300 +@@ -83,7 +83,8 @@ + + static struct line_driver driver = { + .name = "UML console", +- .devfs_name = "vc/%d", ++ .device_name = "tty", ++ .devfs_name = "vc/", + .major = TTY_MAJOR, + .minor_start = 0, + .type = TTY_DRIVER_TYPE_CONSOLE, +@@ -159,6 +160,15 @@ + + static int con_init_done = 0; + ++static struct tty_operations console_ops = { ++ .open = con_open, ++ .close = con_close, ++ .write = con_write, ++ .chars_in_buffer = chars_in_buffer, ++ .set_termios = set_termios, ++ .write_room = line_write_room, ++}; ++ + int stdio_init(void) + { + char *new_title; +@@ -166,7 +176,8 @@ + printk(KERN_INFO "Initializing stdio console driver\n"); + + console_driver = line_register_devfs(&console_lines, &driver, +- &console_ops, vts, sizeof(vts)/sizeof(vts[0])); ++ &console_ops, vts, ++ sizeof(vts)/sizeof(vts[0])); + + lines_init(vts, sizeof(vts)/sizeof(vts[0])); + +@@ -178,24 +189,19 @@ + return(0); + } + +-__initcall(stdio_init); ++late_initcall(stdio_init); + + static void console_write(struct console *console, const char *string, + unsigned len) + { +- if(con_init_done) down(&vts[console->index].sem); +- console_write_chan(&vts[console->index].chan_list, string, len); +- if(con_init_done) up(&vts[console->index].sem); +-} ++ struct line *line = &vts[console->index]; + +-static struct tty_operations console_ops = { +- .open = con_open, +- .close = con_close, +- .write = con_write, +- .chars_in_buffer = chars_in_buffer, +- .set_termios = set_termios, +- .write_room = line_write_room, +-}; ++ if(con_init_done) ++ down(&line->sem); ++ console_write_chan(&line->chan_list, string, len); ++ if(con_init_done) ++ up(&line->sem); ++} + + static struct tty_driver *console_device(struct console *c, int *index) + { +@@ -208,22 +214,28 @@ + return(0); + } + +-static struct console stdiocons = INIT_CONSOLE("tty", console_write, +- console_device, console_setup, +- CON_PRINTBUFFER); ++static struct console stdiocons = { ++ name: "tty", ++ write: console_write, ++ device: console_device, ++ setup: console_setup, ++ flags: CON_PRINTBUFFER, ++ index: -1, ++}; + +-static void __init stdio_console_init(void) ++static int __init stdio_console_init(void) + { + INIT_LIST_HEAD(&vts[0].chan_list); + list_add(&init_console_chan.list, &vts[0].chan_list); + register_console(&stdiocons); ++ return(0); + } ++ + console_initcall(stdio_console_init); + + static int console_chan_setup(char *str) + { +- line_setup(vts, sizeof(vts)/sizeof(vts[0]), str, 1); +- return(1); ++ return(line_setup(vts, sizeof(vts)/sizeof(vts[0]), str, 1)); + } + + __setup("con", console_chan_setup); +Index: uml-2.6.7/arch/um/os-Linux/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/os-Linux/Makefile 2004-07-16 19:36:54.369880984 +0300 ++++ uml-2.6.7/arch/um/os-Linux/Makefile 2004-07-16 19:47:23.768197896 +0300 +@@ -3,13 +3,9 @@ + # Licensed under the GPL + # + +-obj-y = file.o process.o tty.o drivers/ ++obj-y = file.o process.o tty.o user_syms.o drivers/ + + USER_OBJS := $(foreach file,file.o process.o tty.o,$(obj)/$(file)) + + $(USER_OBJS) : %.o: %.c + $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< +- +-clean : +- +-archmrproper: +Index: uml-2.6.7/arch/um/kernel/skas/syscall_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/syscall_kern.c 2004-07-16 19:36:57.006480160 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/syscall_kern.c 2004-07-16 19:47:23.732203368 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2002 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +Index: uml-2.6.7/arch/um/drivers/pty.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/pty.c 2004-07-16 19:37:26.082060000 +0300 ++++ uml-2.6.7/arch/um/drivers/pty.c 2004-07-16 19:47:23.692209448 +0300 +@@ -7,12 +7,12 @@ + #include <unistd.h> + #include <string.h> + #include <errno.h> +-#include <fcntl.h> + #include <termios.h> + #include "chan_user.h" + #include "user.h" + #include "user_util.h" + #include "kern_util.h" ++#include "os.h" + + struct pty_chan { + void (*announce)(char *dev_name, int dev); +@@ -26,7 +26,8 @@ + { + struct pty_chan *data; + +- if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL); ++ data = um_kmalloc(sizeof(*data)); ++ if(data == NULL) return(NULL); + *data = ((struct pty_chan) { .announce = opts->announce, + .dev = device, + .raw = opts->raw }); +@@ -39,7 +40,8 @@ + char *dev; + int fd; + +- if((fd = get_pty()) < 0){ ++ fd = get_pty(); ++ if(fd < 0){ + printk("open_pts : Failed to open pts\n"); + return(-errno); + } +@@ -57,29 +59,27 @@ + + int getmaster(char *line) + { +- struct stat stb; + char *pty, *bank, *cp; +- int master; ++ int master, err; + + pty = &line[strlen("/dev/ptyp")]; + for (bank = "pqrs"; *bank; bank++) { + line[strlen("/dev/pty")] = *bank; + *pty = '0'; +- if (stat(line, &stb) < 0) ++ if (os_stat_file(line, NULL) < 0) + break; + for (cp = "0123456789abcdef"; *cp; cp++) { + *pty = *cp; +- master = open(line, O_RDWR); ++ master = os_open_file(line, of_rdwr(OPENFLAGS()), 0); + if (master >= 0) { + char *tp = &line[strlen("/dev/")]; +- int ok; + + /* verify slave side is usable */ + *tp = 't'; +- ok = access(line, R_OK|W_OK) == 0; ++ err = os_access(line, OS_ACC_RW_OK); + *tp = 'p'; +- if (ok) return(master); +- (void) close(master); ++ if(err == 0) return(master); ++ (void) os_close_file(master); + } + } + } +Index: uml-2.6.7/arch/um/util/mk_constants_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/util/mk_constants_kern.c 2004-07-16 19:35:59.020295400 +0300 ++++ uml-2.6.7/arch/um/util/mk_constants_kern.c 2004-07-16 19:47:23.781195920 +0300 +@@ -1,5 +1,6 @@ + #include "linux/kernel.h" + #include "linux/stringify.h" ++#include "linux/time.h" + #include "asm/page.h" + + extern void print_head(void); +@@ -11,6 +12,7 @@ + { + print_head(); + print_constant_int("UM_KERN_PAGE_SIZE", PAGE_SIZE); ++ + print_constant_str("UM_KERN_EMERG", KERN_EMERG); + print_constant_str("UM_KERN_ALERT", KERN_ALERT); + print_constant_str("UM_KERN_CRIT", KERN_CRIT); +@@ -19,6 +21,8 @@ + print_constant_str("UM_KERN_NOTICE", KERN_NOTICE); + print_constant_str("UM_KERN_INFO", KERN_INFO); + print_constant_str("UM_KERN_DEBUG", KERN_DEBUG); ++ ++ print_constant_int("UM_NSEC_PER_SEC", NSEC_PER_SEC); + print_tail(); + return(0); + } +Index: uml-2.6.7/arch/um/drivers/port_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/port_user.c 2004-07-16 19:36:57.124462224 +0300 ++++ uml-2.6.7/arch/um/drivers/port_user.c 2004-07-16 19:47:23.691209600 +0300 +@@ -47,10 +47,12 @@ + return(NULL); + } + +- if((kern_data = port_data(port)) == NULL) ++ kern_data = port_data(port); ++ if(kern_data == NULL) + return(NULL); + +- if((data = um_kmalloc(sizeof(*data))) == NULL) ++ data = um_kmalloc(sizeof(*data)); ++ if(data == NULL) + goto err; + + *data = ((struct port_chan) { .raw = opts->raw, +@@ -90,7 +92,7 @@ + struct port_chan *data = d; + + port_remove_dev(data->kernel_data); +- close(fd); ++ os_close_file(fd); + } + + int port_console_write(int fd, const char *buf, int n, void *d) +@@ -130,11 +132,15 @@ + goto out; + } + +- if((listen(fd, 1) < 0) || (os_set_fd_block(fd, 0))){ ++ if(listen(fd, 1) < 0){ + err = -errno; + goto out; + } + ++ err = os_set_fd_block(fd, 0); ++ if(err < 0) ++ goto out; ++ + return(fd); + out: + os_close_file(fd); +@@ -153,10 +159,10 @@ + dup2(data->sock_fd, 0); + dup2(data->sock_fd, 1); + dup2(data->sock_fd, 2); +- close(data->sock_fd); ++ os_close_file(data->sock_fd); + dup2(data->pipe_fd, 3); + os_shutdown_socket(3, 1, 0); +- close(data->pipe_fd); ++ os_close_file(data->pipe_fd); + } + + int port_connection(int fd, int *socket, int *pid_out) +@@ -166,11 +172,12 @@ + "/usr/lib/uml/port-helper", NULL }; + struct port_pre_exec_data data; + +- if((new = os_accept_connection(fd)) < 0) +- return(-errno); ++ new = os_accept_connection(fd); ++ if(new < 0) ++ return(new); + + err = os_pipe(socket, 0, 0); +- if(err) ++ if(err < 0) + goto out_close; + + data = ((struct port_pre_exec_data) +@@ -186,11 +193,11 @@ + + out_shutdown: + os_shutdown_socket(socket[0], 1, 1); +- close(socket[0]); ++ os_close_file(socket[0]); + os_shutdown_socket(socket[1], 1, 1); +- close(socket[1]); ++ os_close_file(socket[1]); + out_close: +- close(new); ++ os_close_file(new); + return(err); + } + +Index: uml-2.6.7/arch/um/drivers/port_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/port_kern.c 2004-07-16 19:35:56.025750640 +0300 ++++ uml-2.6.7/arch/um/drivers/port_kern.c 2004-07-16 19:47:23.690209752 +0300 +@@ -6,6 +6,7 @@ + #include "linux/list.h" + #include "linux/sched.h" + #include "linux/slab.h" ++#include "linux/interrupt.h" + #include "linux/irq.h" + #include "linux/spinlock.h" + #include "linux/errno.h" +@@ -14,6 +15,7 @@ + #include "kern_util.h" + #include "kern.h" + #include "irq_user.h" ++#include "irq_kern.h" + #include "port.h" + #include "init.h" + #include "os.h" +@@ -38,21 +40,21 @@ + struct connection { + struct list_head list; + int fd; +- int helper_pid; ++ int helper_pid; + int socket[2]; + int telnetd_pid; + struct port_list *port; + }; + +-static void pipe_interrupt(int irq, void *data, struct pt_regs *regs) ++static irqreturn_t pipe_interrupt(int irq, void *data, struct pt_regs *regs) + { + struct connection *conn = data; + int fd; + +- fd = os_rcv_fd(conn->socket[0], &conn->helper_pid); ++ fd = os_rcv_fd(conn->socket[0], &conn->helper_pid); + if(fd < 0){ + if(fd == -EAGAIN) +- return; ++ return(IRQ_NONE); + + printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n", + -fd); +@@ -65,6 +67,7 @@ + list_add(&conn->list, &conn->port->connections); + + up(&conn->port->sem); ++ return(IRQ_HANDLED); + } + + static int port_accept(struct port_list *port) +@@ -102,8 +105,7 @@ + } + + list_add(&conn->list, &port->pending); +- ret = 1; +- goto out; ++ return(1); + + out_free: + kfree(conn); +@@ -138,12 +140,13 @@ + + DECLARE_WORK(port_work, port_work_proc, NULL); + +-static void port_interrupt(int irq, void *data, struct pt_regs *regs) ++static irqreturn_t port_interrupt(int irq, void *data, struct pt_regs *regs) + { + struct port_list *port = data; + + port->has_connection = 1; + schedule_work(&port_work); ++ return(IRQ_HANDLED); + } + + void *port_data(int port_num) +Index: uml-2.6.7/arch/um/sys-i386/ptrace_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-i386/ptrace_user.c 2004-07-16 19:37:52.078108000 +0300 ++++ uml-2.6.7/arch/um/sys-i386/ptrace_user.c 2004-07-16 19:47:23.772197288 +0300 +@@ -39,10 +39,10 @@ + nregs = sizeof(dummy->u_debugreg)/sizeof(dummy->u_debugreg[0]); + for(i = 0; i < nregs; i++){ + if((i == 4) || (i == 5)) continue; +- if(ptrace(PTRACE_POKEUSR, pid, &dummy->u_debugreg[i], ++ if(ptrace(PTRACE_POKEUSER, pid, &dummy->u_debugreg[i], + regs[i]) < 0) +- printk("write_debugregs - ptrace failed, " +- "errno = %d\n", errno); ++ printk("write_debugregs - ptrace failed on " ++ "register %d, errno = %d\n", errno); + } + } + +@@ -54,7 +54,7 @@ + dummy = NULL; + nregs = sizeof(dummy->u_debugreg)/sizeof(dummy->u_debugreg[0]); + for(i = 0; i < nregs; i++){ +- regs[i] = ptrace(PTRACE_PEEKUSR, pid, ++ regs[i] = ptrace(PTRACE_PEEKUSER, pid, + &dummy->u_debugreg[i], 0); + } + } +Index: uml-2.6.7/arch/um/os-Linux/drivers/tuntap_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/os-Linux/drivers/tuntap_user.c 2004-07-16 19:37:46.493956920 +0300 ++++ uml-2.6.7/arch/um/os-Linux/drivers/tuntap_user.c 2004-07-16 19:47:24.802040728 +0300 +@@ -8,7 +8,6 @@ + #include <stdlib.h> + #include <unistd.h> + #include <errno.h> +-#include <fcntl.h> + #include <sys/wait.h> + #include <sys/socket.h> + #include <sys/un.h> +@@ -19,6 +18,7 @@ + #include "net_user.h" + #include "tuntap.h" + #include "kern_util.h" ++#include "user_util.h" + #include "user.h" + #include "helper.h" + #include "os.h" +@@ -61,7 +61,7 @@ + struct tuntap_pre_exec_data *data = arg; + + dup2(data->stdout, 1); +- close(data->close_me); ++ os_close_file(data->close_me); + } + + static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote, +@@ -86,7 +86,7 @@ + + if(pid < 0) return(-pid); + +- close(remote); ++ os_close_file(remote); + + msg.msg_name = NULL; + msg.msg_namelen = 0; +@@ -107,19 +107,19 @@ + if(n < 0){ + printk("tuntap_open_tramp : recvmsg failed - errno = %d\n", + errno); +- return(errno); ++ return(-errno); + } +- waitpid(pid, NULL, 0); ++ CATCH_EINTR(waitpid(pid, NULL, 0)); + + cmsg = CMSG_FIRSTHDR(&msg); + if(cmsg == NULL){ + printk("tuntap_open_tramp : didn't receive a message\n"); +- return(EINVAL); ++ return(-EINVAL); + } + if((cmsg->cmsg_level != SOL_SOCKET) || + (cmsg->cmsg_type != SCM_RIGHTS)){ + printk("tuntap_open_tramp : didn't receive a descriptor\n"); +- return(EINVAL); ++ return(-EINVAL); + } + *fd_out = ((int *) CMSG_DATA(cmsg))[0]; + return(0); +@@ -133,27 +133,29 @@ + int err, fds[2], len, used; + + err = tap_open_common(pri->dev, pri->gate_addr); +- if(err) return(err); ++ if(err < 0) ++ return(err); + + if(pri->fixed_config){ +- if((pri->fd = open("/dev/net/tun", O_RDWR)) < 0){ +- printk("Failed to open /dev/net/tun, errno = %d\n", +- errno); +- return(-errno); ++ pri->fd = os_open_file("/dev/net/tun", of_rdwr(OPENFLAGS()), 0); ++ if(pri->fd < 0){ ++ printk("Failed to open /dev/net/tun, err = %d\n", ++ -pri->fd); ++ return(pri->fd); + } + memset(&ifr, 0, sizeof(ifr)); +- ifr.ifr_flags = IFF_TAP; ++ ifr.ifr_flags = IFF_TAP | IFF_NO_PI; + strlcpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name)); + if(ioctl(pri->fd, TUNSETIFF, (void *) &ifr) < 0){ +- printk("TUNSETIFF failed, errno = %d", errno); +- close(pri->fd); ++ printk("TUNSETIFF failed, errno = %d\n", errno); ++ os_close_file(pri->fd); + return(-errno); + } + } + else { + err = os_pipe(fds, 0, 0); +- if(err){ +- printk("tuntap_open : os_pipe failed - errno = %d\n", ++ if(err < 0){ ++ printk("tuntap_open : os_pipe failed - err = %d\n", + -err); + return(err); + } +@@ -166,19 +168,19 @@ + fds[1], buffer, len, &used); + + output = buffer; +- if(err == 0){ +- pri->dev_name = uml_strdup(buffer); +- output += IFNAMSIZ; +- printk(output); +- free_output_buffer(buffer); +- } +- else { +- printk(output); ++ if(err < 0) { ++ printk("%s", output); + free_output_buffer(buffer); +- printk("tuntap_open_tramp failed - errno = %d\n", err); +- return(-err); ++ printk("tuntap_open_tramp failed - err = %d\n", -err); ++ return(err); + } +- close(fds[0]); ++ ++ pri->dev_name = uml_strdup(buffer); ++ output += IFNAMSIZ; ++ printk("%s", output); ++ free_output_buffer(buffer); ++ ++ os_close_file(fds[0]); + iter_addresses(pri->dev, open_addr, pri->dev_name); + } + +@@ -191,7 +193,7 @@ + + if(!pri->fixed_config) + iter_addresses(pri->dev, close_addr, pri->dev_name); +- close(fd); ++ os_close_file(fd); + pri->fd = -1; + } + +Index: uml-2.6.7/arch/um/kernel/um_arch.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/um_arch.c 2004-07-16 19:37:17.463370240 +0300 ++++ uml-2.6.7/arch/um/kernel/um_arch.c 2004-07-16 19:47:23.755199872 +0300 +@@ -38,13 +38,18 @@ + #include "mode_kern.h" + #include "mode.h" + +-#define DEFAULT_COMMAND_LINE "root=6200" ++#define DEFAULT_COMMAND_LINE "root=98:0" + + struct cpuinfo_um boot_cpu_data = { + .loops_per_jiffy = 0, + .ipi_pipe = { -1, -1 } + }; + ++/* Placeholder to make UML link until the vsyscall stuff is actually ++ * implemented ++ */ ++void *__kernel_vsyscall; ++ + unsigned long thread_saved_pc(struct task_struct *task) + { + return(os_process_pc(CHOOSE_MODE_PROC(thread_pid_tt, thread_pid_skas, +@@ -53,18 +58,22 @@ + + static int show_cpuinfo(struct seq_file *m, void *v) + { +- int index; ++ int index = 0; + +- index = (struct cpuinfo_um *)v - cpu_data; + #ifdef CONFIG_SMP ++ index = (struct cpuinfo_um *) v - cpu_data; + if (!cpu_online(index)) + return 0; + #endif + +- seq_printf(m, "bogomips\t: %lu.%02lu\n", ++ seq_printf(m, "processor\t: %d\n", index); ++ seq_printf(m, "vendor_id\t: User Mode Linux\n"); ++ seq_printf(m, "model name\t: UML\n"); ++ seq_printf(m, "mode\t\t: %s\n", CHOOSE_MODE("tt", "skas")); ++ seq_printf(m, "host\t\t: %s\n", host_info); ++ seq_printf(m, "bogomips\t: %lu.%02lu\n\n", + loops_per_jiffy/(500000/HZ), + (loops_per_jiffy/(5000/HZ)) % 100); +- seq_printf(m, "host\t\t: %s\n", host_info); + + return(0); + } +@@ -134,12 +143,12 @@ + if(umid != NULL){ + snprintf(argv1_begin, + (argv1_end - argv1_begin) * sizeof(*ptr), +- "(%s)", umid); ++ "(%s) ", umid); + ptr = &argv1_begin[strlen(argv1_begin)]; + } + else ptr = argv1_begin; + +- snprintf(ptr, (argv1_end - ptr) * sizeof(*ptr), " [%s]", cmd); ++ snprintf(ptr, (argv1_end - ptr) * sizeof(*ptr), "[%s]", cmd); + memset(argv1_begin + strlen(argv1_begin), '\0', + argv1_end - argv1_begin - strlen(argv1_begin)); + #endif +@@ -179,7 +188,7 @@ + static int __init uml_ncpus_setup(char *line, int *add) + { + if (!sscanf(line, "%d", &ncpus)) { +- printk("Couldn't parse [%s]\n", line); ++ printf("Couldn't parse [%s]\n", line); + return -1; + } + +@@ -210,7 +219,7 @@ + + static int __init mode_tt_setup(char *line, int *add) + { +- printk("CONFIG_MODE_TT disabled - 'mode=tt' ignored\n"); ++ printf("CONFIG_MODE_TT disabled - 'mode=tt' ignored\n"); + return(0); + } + +@@ -221,7 +230,7 @@ + + static int __init mode_tt_setup(char *line, int *add) + { +- printk("CONFIG_MODE_SKAS disabled - 'mode=tt' redundant\n"); ++ printf("CONFIG_MODE_SKAS disabled - 'mode=tt' redundant\n"); + return(0); + } + +@@ -291,7 +300,7 @@ + + /* Set during early boot */ + unsigned long brk_start; +-static struct vm_reserved kernel_vm_reserved; ++unsigned long end_iomem; + + #define MIN_VMALLOC (32 * 1024 * 1024) + +@@ -299,7 +308,7 @@ + { + unsigned long avail; + unsigned long virtmem_size, max_physmem; +- unsigned int i, add, err; ++ unsigned int i, add; + + for (i = 1; i < argc; i++){ + if((i == 1) && (argv[i][0] == ' ')) continue; +@@ -328,12 +337,16 @@ + argv1_end = &argv[1][strlen(argv[1])]; + #endif + +- set_usable_vm(uml_physmem, get_kmem_end()); +- + highmem = 0; +- max_physmem = get_kmem_end() - uml_physmem - MIN_VMALLOC; +- if(physmem_size > max_physmem){ +- highmem = physmem_size - max_physmem; ++ iomem_size = (iomem_size + PAGE_SIZE - 1) & PAGE_MASK; ++ max_physmem = get_kmem_end() - uml_physmem - iomem_size - MIN_VMALLOC; ++ ++ /* Zones have to begin on a 1 << MAX_ORDER page boundary, ++ * so this makes sure that's true for highmem ++ */ ++ max_physmem &= ~((1 << (PAGE_SHIFT + MAX_ORDER)) - 1); ++ if(physmem_size + iomem_size > max_physmem){ ++ highmem = physmem_size + iomem_size - max_physmem; + physmem_size -= highmem; + #ifndef CONFIG_HIGHMEM + highmem = 0; +@@ -343,11 +356,19 @@ + } + + high_physmem = uml_physmem + physmem_size; +- high_memory = (void *) high_physmem; ++ end_iomem = high_physmem + iomem_size; ++ high_memory = (void *) end_iomem; + + start_vm = VMALLOC_START; + +- setup_physmem(uml_physmem, uml_reserved, physmem_size); ++ setup_physmem(uml_physmem, uml_reserved, physmem_size, highmem); ++ if(init_maps(physmem_size, iomem_size, highmem)){ ++ printf("Failed to allocate mem_map for %ld bytes of physical " ++ "memory and %ld bytes of highmem\n", physmem_size, ++ highmem); ++ exit(1); ++ } ++ + virtmem_size = physmem_size; + avail = get_kmem_end() - start_vm; + if(physmem_size > avail) virtmem_size = avail; +@@ -357,28 +378,26 @@ + printf("Kernel virtual memory size shrunk to %ld bytes\n", + virtmem_size); + +- err = reserve_vm(high_physmem, end_vm, &kernel_vm_reserved); +- if(err){ +- printf("Failed to reserve VM area for kernel VM\n"); +- exit(1); +- } +- + uml_postsetup(); + + init_task.thread.kernel_stack = (unsigned long) &init_thread_info + + 2 * PAGE_SIZE; + + task_protections((unsigned long) &init_thread_info); ++ os_flush_stdout(); + + return(CHOOSE_MODE(start_uml_tt(), start_uml_skas())); + } + ++extern int uml_exitcode; ++ + static int panic_exit(struct notifier_block *self, unsigned long unused1, + void *unused2) + { + #ifdef CONFIG_MAGIC_SYSRQ +- handle_sysrq('p', ¤t->thread.regs, NULL, NULL); ++ handle_sysrq('p', ¤t->thread.regs, NULL); + #endif ++ uml_exitcode = 1; + machine_halt(); + return(0); + } +@@ -403,6 +422,11 @@ + arch_check_bugs(); + check_ptrace(); + check_sigio(); ++ check_devanon(); ++} ++ ++void apply_alternatives(void *start, void *end) ++{ + } + + /* +Index: uml-2.6.7/arch/um/kernel/mem.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/mem.c 2004-07-16 19:36:30.355531720 +0300 ++++ uml-2.6.7/arch/um/kernel/mem.c 2004-07-16 19:47:23.720205192 +0300 +@@ -1,74 +1,66 @@ + /* +- * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +-#include "linux/config.h" +-#include "linux/module.h" +-#include "linux/types.h" ++#include "linux/stddef.h" ++#include "linux/kernel.h" + #include "linux/mm.h" +-#include "linux/fs.h" +-#include "linux/init.h" + #include "linux/bootmem.h" + #include "linux/swap.h" +-#include "linux/slab.h" +-#include "linux/vmalloc.h" + #include "linux/highmem.h" ++#include "linux/gfp.h" + #include "asm/page.h" +-#include "asm/pgtable.h" ++#include "asm/fixmap.h" + #include "asm/pgalloc.h" +-#include "asm/bitops.h" +-#include "asm/uaccess.h" +-#include "asm/tlb.h" + #include "user_util.h" + #include "kern_util.h" +-#include "mem_user.h" +-#include "mem.h" + #include "kern.h" +-#include "init.h" +-#include "os.h" +-#include "mode_kern.h" ++#include "mem_user.h" + #include "uml_uaccess.h" ++#include "os.h" ++ ++extern char __binary_start; + + /* Changed during early boot */ +-pgd_t swapper_pg_dir[1024]; +-unsigned long high_physmem; +-unsigned long vm_start; +-unsigned long vm_end; +-unsigned long highmem; + unsigned long *empty_zero_page = NULL; + unsigned long *empty_bad_page = NULL; +- +-/* Not modified */ +-const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n"; +- +-extern char __init_begin, __init_end; +-extern long physmem_size; +- +-/* Not changed by UML */ +-DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); +- +-/* Changed during early boot */ ++pgd_t swapper_pg_dir[1024]; ++unsigned long highmem; + int kmalloc_ok = 0; + +-#define NREGIONS (phys_region_index(0xffffffff) - phys_region_index(0x0) + 1) +-struct mem_region *regions[NREGIONS] = { [ 0 ... NREGIONS - 1 ] = NULL }; +-#define REGION_SIZE ((0xffffffff & ~REGION_MASK) + 1) +- +-/* Changed during early boot */ + static unsigned long brk_end; + ++void unmap_physmem(void) ++{ ++ os_unmap_memory((void *) brk_end, uml_reserved - brk_end); ++} ++ + static void map_cb(void *unused) + { + map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, 0); + } + +-void unmap_physmem(void) ++#ifdef CONFIG_HIGHMEM ++static void setup_highmem(unsigned long highmem_start, ++ unsigned long highmem_len) + { +- os_unmap_memory((void *) brk_end, uml_reserved - brk_end); +-} ++ struct page *page; ++ unsigned long highmem_pfn; ++ int i; + +-extern char __binary_start; ++ highmem_start_page = virt_to_page(highmem_start); ++ ++ highmem_pfn = __pa(highmem_start) >> PAGE_SHIFT; ++ for(i = 0; i < highmem_len >> PAGE_SHIFT; i++){ ++ page = &mem_map[highmem_pfn + i]; ++ ClearPageReserved(page); ++ set_bit(PG_highmem, &page->flags); ++ set_page_count(page, 1); ++ __free_page(page); ++ } ++} ++#endif + + void mem_init(void) + { +@@ -103,50 +95,15 @@ + totalhigh_pages = highmem >> PAGE_SHIFT; + totalram_pages += totalhigh_pages; + num_physpages = totalram_pages; +- max_mapnr = totalram_pages; + max_pfn = totalram_pages; + printk(KERN_INFO "Memory: %luk available\n", + (unsigned long) nr_free_pages() << (PAGE_SHIFT-10)); + kmalloc_ok = 1; +-} +- +-/* Changed during early boot */ +-static unsigned long kmem_top = 0; +- +-unsigned long get_kmem_end(void) +-{ +- if(kmem_top == 0) +- kmem_top = CHOOSE_MODE(kmem_end_tt, kmem_end_skas); +- return(kmem_top); +-} +- +-void set_kmem_end(unsigned long new) +-{ +- kmem_top = new; +-} + + #ifdef CONFIG_HIGHMEM +-/* Changed during early boot */ +-pte_t *kmap_pte; +-pgprot_t kmap_prot; +- +-EXPORT_SYMBOL(kmap_prot); +-EXPORT_SYMBOL(kmap_pte); +- +-#define kmap_get_fixmap_pte(vaddr) \ +- pte_offset_kernel(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)) +- +-void __init kmap_init(void) +-{ +- unsigned long kmap_vstart; +- +- /* cache the first kmap pte */ +- kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); +- kmap_pte = kmap_get_fixmap_pte(kmap_vstart); +- +- kmap_prot = PAGE_KERNEL; ++ setup_highmem(end_iomem, highmem); ++#endif + } +-#endif /* CONFIG_HIGHMEM */ + + static void __init fixrange_init(unsigned long start, unsigned long end, + pgd_t *pgd_base) +@@ -178,76 +135,24 @@ + } + } + +-int init_maps(struct mem_region *region) +-{ +- struct page *p, *map; +- int i, n, len; +- +- if(region == &physmem_region){ +- region->mem_map = mem_map; +- return(0); +- } +- else if(region->mem_map != NULL) return(0); +- +- n = region->len >> PAGE_SHIFT; +- len = n * sizeof(struct page); +- if(kmalloc_ok){ +- map = kmalloc(len, GFP_KERNEL); +- if(map == NULL) map = vmalloc(len); +- } +- else map = alloc_bootmem_low_pages(len); +- +- if(map == NULL) +- return(-ENOMEM); +- for(i = 0; i < n; i++){ +- p = &map[i]; +- set_page_count(p, 0); +- SetPageReserved(p); +- INIT_LIST_HEAD(&p->list); +- } +- region->mem_map = map; +- return(0); +-} ++#if CONFIG_HIGHMEM ++pte_t *kmap_pte; ++pgprot_t kmap_prot; + +-DECLARE_MUTEX(regions_sem); ++#define kmap_get_fixmap_pte(vaddr) \ ++ pte_offset(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)) + +-static int setup_one_range(int fd, char *driver, unsigned long start, +- unsigned long pfn, int len, +- struct mem_region *region) ++void __init kmap_init(void) + { +- int i; +- +- down(®ions_sem); +- for(i = 0; i < NREGIONS; i++){ +- if(regions[i] == NULL) break; +- } +- if(i == NREGIONS){ +- printk("setup_range : no free regions\n"); +- i = -1; +- goto out; +- } +- +- if(fd == -1) +- fd = create_mem_file(len); ++ unsigned long kmap_vstart; + +- if(region == NULL){ +- region = alloc_bootmem_low_pages(sizeof(*region)); +- if(region == NULL) +- panic("Failed to allocating mem_region"); +- } ++ /* cache the first kmap pte */ ++ kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); ++ kmap_pte = kmap_get_fixmap_pte(kmap_vstart); + +- *region = ((struct mem_region) { .driver = driver, +- .start_pfn = pfn, +- .start = start, +- .len = len, +- .fd = fd } ); +- regions[i] = region; +- out: +- up(®ions_sem); +- return(i); ++ kmap_prot = PAGE_KERNEL; + } + +-#ifdef CONFIG_HIGHMEM + static void init_highmem(void) + { + pgd_t *pgd; +@@ -268,63 +173,20 @@ + + kmap_init(); + } +- +-void setup_highmem(unsigned long len) +-{ +- struct mem_region *region; +- struct page *page, *map; +- unsigned long phys; +- int i, cur, index; +- +- phys = physmem_size; +- do { +- cur = min(len, (unsigned long) REGION_SIZE); +- i = setup_one_range(-1, NULL, -1, phys >> PAGE_SHIFT, cur, +- NULL); +- if(i == -1){ +- printk("setup_highmem - setup_one_range failed\n"); +- return; +- } +- region = regions[i]; +- index = phys / PAGE_SIZE; +- region->mem_map = &mem_map[index]; +- +- map = region->mem_map; +- for(i = 0; i < (cur >> PAGE_SHIFT); i++){ +- page = &map[i]; +- ClearPageReserved(page); +- set_bit(PG_highmem, &page->flags); +- set_page_count(page, 1); +- __free_page(page); +- } +- phys += cur; +- len -= cur; +- } while(len > 0); +-} +-#endif ++#endif /* CONFIG_HIGHMEM */ + + void paging_init(void) + { +- struct mem_region *region; +- unsigned long zones_size[MAX_NR_ZONES], start, end, vaddr; +- int i, index; ++ unsigned long zones_size[MAX_NR_ZONES], vaddr; ++ int i; + + empty_zero_page = (unsigned long *) alloc_bootmem_low_pages(PAGE_SIZE); + empty_bad_page = (unsigned long *) alloc_bootmem_low_pages(PAGE_SIZE); + for(i=0;i<sizeof(zones_size)/sizeof(zones_size[0]);i++) + zones_size[i] = 0; +- zones_size[0] = (high_physmem >> PAGE_SHIFT) - +- (uml_physmem >> PAGE_SHIFT); ++ zones_size[0] = (end_iomem >> PAGE_SHIFT) - (uml_physmem >> PAGE_SHIFT); + zones_size[2] = highmem >> PAGE_SHIFT; + free_area_init(zones_size); +- start = phys_region_index(__pa(uml_physmem)); +- end = phys_region_index(__pa(high_physmem - 1)); +- for(i = start; i <= end; i++){ +- region = regions[i]; +- index = (region->start - uml_physmem) / PAGE_SIZE; +- region->mem_map = &mem_map[index]; +- if(i > start) free_bootmem(__pa(region->start), region->len); +- } + + /* + * Fixed mappings, only the page table structure has to be +@@ -335,15 +197,33 @@ + + #ifdef CONFIG_HIGHMEM + init_highmem(); +- setup_highmem(highmem); + #endif + } + +-pte_t __bad_page(void) ++struct page *arch_validate(struct page *page, int mask, int order) + { +- clear_page(empty_bad_page); +- return pte_mkdirty(mk_pte((struct page *) empty_bad_page, +- PAGE_SHARED)); ++ unsigned long addr, zero = 0; ++ int i; ++ ++ again: ++ if(page == NULL) return(page); ++ if(PageHighMem(page)) return(page); ++ ++ addr = (unsigned long) page_address(page); ++ for(i = 0; i < (1 << order); i++){ ++ current->thread.fault_addr = (void *) addr; ++ if(__do_copy_to_user((void *) addr, &zero, ++ sizeof(zero), ++ ¤t->thread.fault_addr, ++ ¤t->thread.fault_catcher)){ ++ if(!(mask & __GFP_WAIT)) return(NULL); ++ else break; ++ } ++ addr += PAGE_SIZE; ++ } ++ if(i == (1 << order)) return(page); ++ page = alloc_pages(mask, order); ++ goto again; + } + + /* This can't do anything because nothing in the kernel image can be freed +@@ -401,395 +281,6 @@ + printk("%d pages swap cached\n", cached); + } + +-static int __init uml_mem_setup(char *line, int *add) +-{ +- char *retptr; +- physmem_size = memparse(line,&retptr); +- return 0; +-} +-__uml_setup("mem=", uml_mem_setup, +-"mem=<Amount of desired ram>\n" +-" This controls how much \"physical\" memory the kernel allocates\n" +-" for the system. The size is specified as a number followed by\n" +-" one of 'k', 'K', 'm', 'M', which have the obvious meanings.\n" +-" This is not related to the amount of memory in the physical\n" +-" machine. It can be more, and the excess, if it's ever used, will\n" +-" just be swapped out.\n Example: mem=64M\n\n" +-); +- +-struct page *arch_validate(struct page *page, int mask, int order) +-{ +- unsigned long addr, zero = 0; +- int i; +- +- again: +- if(page == NULL) return(page); +- if(PageHighMem(page)) return(page); +- +- addr = (unsigned long) page_address(page); +- for(i = 0; i < (1 << order); i++){ +- current->thread.fault_addr = (void *) addr; +- if(__do_copy_to_user((void *) addr, &zero, +- sizeof(zero), +- ¤t->thread.fault_addr, +- ¤t->thread.fault_catcher)){ +- if(!(mask & __GFP_WAIT)) return(NULL); +- else break; +- } +- addr += PAGE_SIZE; +- } +- if(i == (1 << order)) return(page); +- page = alloc_pages(mask, order); +- goto again; +-} +- +-DECLARE_MUTEX(vm_reserved_sem); +-static struct list_head vm_reserved = LIST_HEAD_INIT(vm_reserved); +- +-/* Static structures, linked in to the list in early boot */ +-static struct vm_reserved head = { +- .list = LIST_HEAD_INIT(head.list), +- .start = 0, +- .end = 0xffffffff +-}; +- +-static struct vm_reserved tail = { +- .list = LIST_HEAD_INIT(tail.list), +- .start = 0, +- .end = 0xffffffff +-}; +- +-void set_usable_vm(unsigned long start, unsigned long end) +-{ +- list_add(&head.list, &vm_reserved); +- list_add(&tail.list, &head.list); +- head.end = start; +- tail.start = end; +-} +- +-int reserve_vm(unsigned long start, unsigned long end, void *e) +- +-{ +- struct vm_reserved *entry = e, *reserved, *prev; +- struct list_head *ele; +- int err; +- +- down(&vm_reserved_sem); +- list_for_each(ele, &vm_reserved){ +- reserved = list_entry(ele, struct vm_reserved, list); +- if(reserved->start >= end) goto found; +- } +- panic("Reserved vm out of range"); +- found: +- prev = list_entry(ele->prev, struct vm_reserved, list); +- if(prev->end > start) +- panic("Can't reserve vm"); +- if(entry == NULL) +- entry = kmalloc(sizeof(*entry), GFP_KERNEL); +- if(entry == NULL){ +- printk("reserve_vm : Failed to allocate entry\n"); +- err = -ENOMEM; +- goto out; +- } +- *entry = ((struct vm_reserved) +- { .list = LIST_HEAD_INIT(entry->list), +- .start = start, +- .end = end }); +- list_add(&entry->list, &prev->list); +- err = 0; +- out: +- up(&vm_reserved_sem); +- return(0); +-} +- +-unsigned long get_vm(unsigned long len) +-{ +- struct vm_reserved *this, *next; +- struct list_head *ele; +- unsigned long start; +- int err; +- +- down(&vm_reserved_sem); +- list_for_each(ele, &vm_reserved){ +- this = list_entry(ele, struct vm_reserved, list); +- next = list_entry(ele->next, struct vm_reserved, list); +- if((this->start < next->start) && +- (this->end + len + PAGE_SIZE <= next->start)) +- goto found; +- } +- up(&vm_reserved_sem); +- return(0); +- found: +- up(&vm_reserved_sem); +- start = (unsigned long) UML_ROUND_UP(this->end) + PAGE_SIZE; +- err = reserve_vm(start, start + len, NULL); +- if(err) return(0); +- return(start); +-} +- +-int nregions(void) +-{ +- return(NREGIONS); +-} +- +-void setup_range(int fd, char *driver, unsigned long start, unsigned long pfn, +- unsigned long len, int need_vm, struct mem_region *region, +- void *reserved) +-{ +- int i, cur; +- +- do { +- cur = min(len, (unsigned long) REGION_SIZE); +- i = setup_one_range(fd, driver, start, pfn, cur, region); +- region = regions[i]; +- if(need_vm && setup_region(region, reserved)){ +- kfree(region); +- regions[i] = NULL; +- return; +- } +- start += cur; +- if(pfn != -1) pfn += cur; +- len -= cur; +- } while(len > 0); +-} +- +-struct iomem { +- char *name; +- int fd; +- unsigned long size; +-}; +- +-/* iomem regions can only be added on the command line at the moment. +- * Locking will be needed when they can be added via mconsole. +- */ +- +-struct iomem iomem_regions[NREGIONS] = { [ 0 ... NREGIONS - 1 ] = +- { .name = NULL, +- .fd = -1, +- .size = 0 } }; +- +-int num_iomem_regions = 0; +- +-void add_iomem(char *name, int fd, unsigned long size) +-{ +- if(num_iomem_regions == sizeof(iomem_regions)/sizeof(iomem_regions[0])) +- return; +- size = (size + PAGE_SIZE - 1) & PAGE_MASK; +- iomem_regions[num_iomem_regions++] = +- ((struct iomem) { .name = name, +- .fd = fd, +- .size = size } ); +-} +- +-int setup_iomem(void) +-{ +- struct iomem *iomem; +- int i; +- +- for(i = 0; i < num_iomem_regions; i++){ +- iomem = &iomem_regions[i]; +- setup_range(iomem->fd, iomem->name, -1, -1, iomem->size, 1, +- NULL, NULL); +- } +- return(0); +-} +- +-__initcall(setup_iomem); +- +-#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) +-#define PFN_DOWN(x) ((x) >> PAGE_SHIFT) +- +-/* Changed during early boot */ +-static struct mem_region physmem_region; +-static struct vm_reserved physmem_reserved; +- +-void setup_physmem(unsigned long start, unsigned long reserve_end, +- unsigned long len) +-{ +- struct mem_region *region = &physmem_region; +- struct vm_reserved *reserved = &physmem_reserved; +- unsigned long cur, pfn = 0; +- int do_free = 1, bootmap_size; +- +- do { +- cur = min(len, (unsigned long) REGION_SIZE); +- if(region == NULL) +- region = alloc_bootmem_low_pages(sizeof(*region)); +- if(reserved == NULL) +- reserved = alloc_bootmem_low_pages(sizeof(*reserved)); +- if((region == NULL) || (reserved == NULL)) +- panic("Couldn't allocate physmem region or vm " +- "reservation\n"); +- setup_range(-1, NULL, start, pfn, cur, 1, region, reserved); +- +- if(do_free){ +- unsigned long reserve = reserve_end - start; +- int pfn = PFN_UP(__pa(reserve_end)); +- int delta = (len - reserve) >> PAGE_SHIFT; +- +- bootmap_size = init_bootmem(pfn, pfn + delta); +- free_bootmem(__pa(reserve_end) + bootmap_size, +- cur - bootmap_size - reserve); +- do_free = 0; +- } +- start += cur; +- pfn += cur >> PAGE_SHIFT; +- len -= cur; +- region = NULL; +- reserved = NULL; +- } while(len > 0); +-} +- +-struct mem_region *phys_region(unsigned long phys) +-{ +- unsigned int n = phys_region_index(phys); +- +- if(regions[n] == NULL) +- panic("Physical address in uninitialized region"); +- return(regions[n]); +-} +- +-unsigned long phys_offset(unsigned long phys) +-{ +- return(phys_addr(phys)); +-} +- +-struct page *phys_mem_map(unsigned long phys) +-{ +- return((struct page *) phys_region(phys)->mem_map); +-} +- +-struct page *pte_mem_map(pte_t pte) +-{ +- return(phys_mem_map(pte_val(pte))); +-} +- +-struct mem_region *page_region(struct page *page, int *index_out) +-{ +- int i; +- struct mem_region *region; +- struct page *map; +- +- for(i = 0; i < NREGIONS; i++){ +- region = regions[i]; +- if(region == NULL) continue; +- map = region->mem_map; +- if((page >= map) && (page < &map[region->len >> PAGE_SHIFT])){ +- if(index_out != NULL) *index_out = i; +- return(region); +- } +- } +- panic("No region found for page"); +- return(NULL); +-} +- +-unsigned long page_to_pfn(struct page *page) +-{ +- struct mem_region *region = page_region(page, NULL); +- +- return(region->start_pfn + (page - (struct page *) region->mem_map)); +-} +- +-struct mem_region *pfn_to_region(unsigned long pfn, int *index_out) +-{ +- struct mem_region *region; +- int i; +- +- for(i = 0; i < NREGIONS; i++){ +- region = regions[i]; +- if(region == NULL) +- continue; +- +- if((region->start_pfn <= pfn) && +- (region->start_pfn + (region->len >> PAGE_SHIFT) > pfn)){ +- if(index_out != NULL) +- *index_out = i; +- return(region); +- } +- } +- return(NULL); +-} +- +-struct page *pfn_to_page(unsigned long pfn) +-{ +- struct mem_region *region = pfn_to_region(pfn, NULL); +- struct page *mem_map = (struct page *) region->mem_map; +- +- return(&mem_map[pfn - region->start_pfn]); +-} +- +-unsigned long phys_to_pfn(unsigned long p) +-{ +- struct mem_region *region = regions[phys_region_index(p)]; +- +- return(region->start_pfn + (phys_addr(p) >> PAGE_SHIFT)); +-} +- +-unsigned long pfn_to_phys(unsigned long pfn) +-{ +- int n; +- struct mem_region *region = pfn_to_region(pfn, &n); +- +- return(mk_phys((pfn - region->start_pfn) << PAGE_SHIFT, n)); +-} +- +-struct page *page_mem_map(struct page *page) +-{ +- return((struct page *) page_region(page, NULL)->mem_map); +-} +- +-extern unsigned long region_pa(void *virt) +-{ +- struct mem_region *region; +- unsigned long addr = (unsigned long) virt; +- int i; +- +- for(i = 0; i < NREGIONS; i++){ +- region = regions[i]; +- if(region == NULL) continue; +- if((region->start <= addr) && +- (addr <= region->start + region->len)) +- return(mk_phys(addr - region->start, i)); +- } +- panic("region_pa : no region for virtual address"); +- return(0); +-} +- +-extern void *region_va(unsigned long phys) +-{ +- return((void *) (phys_region(phys)->start + phys_addr(phys))); +-} +- +-unsigned long page_to_phys(struct page *page) +-{ +- int n; +- struct mem_region *region = page_region(page, &n); +- struct page *map = region->mem_map; +- return(mk_phys((page - map) << PAGE_SHIFT, n)); +-} +- +-struct page *phys_to_page(unsigned long phys) +-{ +- struct page *mem_map; +- +- mem_map = phys_mem_map(phys); +- return(mem_map + (phys_offset(phys) >> PAGE_SHIFT)); +-} +- +-static int setup_mem_maps(void) +-{ +- struct mem_region *region; +- int i; +- +- for(i = 0; i < NREGIONS; i++){ +- region = regions[i]; +- if((region != NULL) && (region->fd > 0)) init_maps(region); +- } +- return(0); +-} +- +-__initcall(setup_mem_maps); +- + /* + * Allocate and free page tables. + */ +Index: uml-2.6.7/mm/page_alloc.c +=================================================================== +--- uml-2.6.7.orig/mm/page_alloc.c 2004-07-16 19:35:58.508373224 +0300 ++++ uml-2.6.7/mm/page_alloc.c 2004-07-16 19:47:23.806192120 +0300 +@@ -279,6 +279,8 @@ + LIST_HEAD(list); + int i; + ++ arch_free_page(page, order); ++ + mod_page_state(pgfree, 1 << order); + for (i = 0 ; i < (1 << order) ; ++i) + free_pages_check(__FUNCTION__, page + i); +@@ -497,6 +499,8 @@ + struct per_cpu_pages *pcp; + unsigned long flags; + ++ arch_free_page(page, 0); ++ + kernel_map_pages(page, 1, 0); + inc_page_state(pgfree); + free_pages_check(__FUNCTION__, page); +Index: uml-2.6.7/arch/um/kernel/skas/uaccess.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/uaccess.c 2004-07-16 19:47:23.621220240 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/uaccess.c 2004-07-16 19:47:23.735202912 +0300 +@@ -0,0 +1,219 @@ ++/* ++ * Copyright (C) 2002 - 2003 Jeff Dike (jdike@addtoit.com) ++ * Licensed under the GPL ++ */ ++ ++#include "linux/stddef.h" ++#include "linux/kernel.h" ++#include "linux/string.h" ++#include "linux/fs.h" ++#include "linux/highmem.h" ++#include "asm/page.h" ++#include "asm/pgtable.h" ++#include "asm/uaccess.h" ++#include "kern_util.h" ++ ++extern void *um_virt_to_phys(struct task_struct *task, unsigned long addr, ++ pte_t *pte_out); ++ ++static unsigned long maybe_map(unsigned long virt, int is_write) ++{ ++ pte_t pte; ++ int err; ++ ++ void *phys = um_virt_to_phys(current, virt, &pte); ++ int dummy_code; ++ ++ if(IS_ERR(phys) || (is_write && !pte_write(pte))){ ++ err = handle_page_fault(virt, 0, is_write, 0, &dummy_code); ++ if(err) ++ return(0); ++ phys = um_virt_to_phys(current, virt, NULL); ++ } ++ return((unsigned long) phys); ++} ++ ++static int do_op(unsigned long addr, int len, int is_write, ++ int (*op)(unsigned long addr, int len, void *arg), void *arg) ++{ ++ struct page *page; ++ int n; ++ ++ addr = maybe_map(addr, is_write); ++ if(addr == -1) ++ return(-1); ++ ++ page = phys_to_page(addr); ++ addr = (unsigned long) kmap(page) + (addr & ~PAGE_MASK); ++ n = (*op)(addr, len, arg); ++ kunmap(page); ++ ++ return(n); ++} ++ ++static int buffer_op(unsigned long addr, int len, int is_write, ++ int (*op)(unsigned long addr, int len, void *arg), ++ void *arg) ++{ ++ int size = min(PAGE_ALIGN(addr) - addr, (unsigned long) len); ++ int remain = len, n; ++ ++ n = do_op(addr, size, is_write, op, arg); ++ if(n != 0) ++ return(n < 0 ? remain : 0); ++ ++ addr += size; ++ remain -= size; ++ if(remain == 0) ++ return(0); ++ ++ while(addr < ((addr + remain) & PAGE_MASK)){ ++ n = do_op(addr, PAGE_SIZE, is_write, op, arg); ++ if(n != 0) ++ return(n < 0 ? remain : 0); ++ ++ addr += PAGE_SIZE; ++ remain -= PAGE_SIZE; ++ } ++ if(remain == 0) ++ return(0); ++ ++ n = do_op(addr, remain, is_write, op, arg); ++ if(n != 0) ++ return(n < 0 ? remain : 0); ++ return(0); ++} ++ ++static int copy_chunk_from_user(unsigned long from, int len, void *arg) ++{ ++ unsigned long *to_ptr = arg, to = *to_ptr; ++ ++ memcpy((void *) to, (void *) from, len); ++ *to_ptr += len; ++ return(0); ++} ++ ++int copy_from_user_skas(void *to, const void *from, int n) ++{ ++ if(segment_eq(get_fs(), KERNEL_DS)){ ++ memcpy(to, from, n); ++ return(0); ++ } ++ ++ return(access_ok_skas(VERIFY_READ, from, n) ? ++ buffer_op((unsigned long) from, n, 0, copy_chunk_from_user, &to): ++ n); ++} ++ ++static int copy_chunk_to_user(unsigned long to, int len, void *arg) ++{ ++ unsigned long *from_ptr = arg, from = *from_ptr; ++ ++ memcpy((void *) to, (void *) from, len); ++ *from_ptr += len; ++ return(0); ++} ++ ++int copy_to_user_skas(void *to, const void *from, int n) ++{ ++ if(segment_eq(get_fs(), KERNEL_DS)){ ++ memcpy(to, from, n); ++ return(0); ++ } ++ ++ return(access_ok_skas(VERIFY_WRITE, to, n) ? ++ buffer_op((unsigned long) to, n, 1, copy_chunk_to_user, &from) : ++ n); ++} ++ ++static int strncpy_chunk_from_user(unsigned long from, int len, void *arg) ++{ ++ char **to_ptr = arg, *to = *to_ptr; ++ int n; ++ ++ strncpy(to, (void *) from, len); ++ n = strnlen(to, len); ++ *to_ptr += n; ++ ++ if(n < len) ++ return(1); ++ return(0); ++} ++ ++int strncpy_from_user_skas(char *dst, const char *src, int count) ++{ ++ int n; ++ char *ptr = dst; ++ ++ if(segment_eq(get_fs(), KERNEL_DS)){ ++ strncpy(dst, src, count); ++ return(strnlen(dst, count)); ++ } ++ ++ if(!access_ok_skas(VERIFY_READ, src, 1)) ++ return(-EFAULT); ++ ++ n = buffer_op((unsigned long) src, count, 0, strncpy_chunk_from_user, ++ &ptr); ++ if(n != 0) ++ return(-EFAULT); ++ return(strnlen(dst, count)); ++} ++ ++static int clear_chunk(unsigned long addr, int len, void *unused) ++{ ++ memset((void *) addr, 0, len); ++ return(0); ++} ++ ++int __clear_user_skas(void *mem, int len) ++{ ++ return(buffer_op((unsigned long) mem, len, 1, clear_chunk, NULL)); ++} ++ ++int clear_user_skas(void *mem, int len) ++{ ++ if(segment_eq(get_fs(), KERNEL_DS)){ ++ memset(mem, 0, len); ++ return(0); ++ } ++ ++ return(access_ok_skas(VERIFY_WRITE, mem, len) ? ++ buffer_op((unsigned long) mem, len, 1, clear_chunk, NULL) : len); ++} ++ ++static int strnlen_chunk(unsigned long str, int len, void *arg) ++{ ++ int *len_ptr = arg, n; ++ ++ n = strnlen((void *) str, len); ++ *len_ptr += n; ++ ++ if(n < len) ++ return(1); ++ return(0); ++} ++ ++int strnlen_user_skas(const void *str, int len) ++{ ++ int count = 0, n; ++ ++ if(segment_eq(get_fs(), KERNEL_DS)) ++ return(strnlen(str, len) + 1); ++ ++ n = buffer_op((unsigned long) str, len, 0, strnlen_chunk, &count); ++ if(n == 0) ++ return(count + 1); ++ return(-EFAULT); ++} ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/Makefile 2004-07-16 19:36:57.056472560 +0300 ++++ uml-2.6.7/arch/um/Makefile 2004-07-16 19:47:24.132142568 +0300 +@@ -22,17 +22,21 @@ + $(ARCH_DIR)/sys-$(SUBARCH)/ + + # Have to precede the include because the included Makefiles reference them. +-SYMLINK_HEADERS = include/asm-um/archparam.h include/asm-um/system.h \ +- include/asm-um/sigcontext.h include/asm-um/processor.h \ +- include/asm-um/ptrace.h include/asm-um/arch-signal.h ++SYMLINK_HEADERS = archparam.h system.h sigcontext.h processor.h ptrace.h \ ++ arch-signal.h module.h ++SYMLINK_HEADERS := $(foreach header,$(SYMLINK_HEADERS),include/asm-um/$(header)) + + ARCH_SYMLINKS = include/asm-um/arch $(ARCH_DIR)/include/sysdep $(ARCH_DIR)/os \ + $(SYMLINK_HEADERS) $(ARCH_DIR)/include/uml-config.h + + GEN_HEADERS += $(ARCH_DIR)/include/task.h $(ARCH_DIR)/include/kern_constants.h + +-include $(ARCH_DIR)/Makefile-$(SUBARCH) +-include $(ARCH_DIR)/Makefile-os-$(OS) ++# This target adds dependencies to "prepare". They are defined in the included ++# Makefiles (see Makefile-i386). ++ ++.PHONY: sys_prepare ++sys_prepare: ++ @: + + MAKEFILE-$(CONFIG_MODE_TT) += Makefile-tt + MAKEFILE-$(CONFIG_MODE_SKAS) += Makefile-skas +@@ -41,6 +45,9 @@ + include $(addprefix $(ARCH_DIR)/,$(MAKEFILE-y)) + endif + ++include $(ARCH_DIR)/Makefile-$(SUBARCH) ++include $(ARCH_DIR)/Makefile-os-$(OS) ++ + EXTRAVERSION := $(EXTRAVERSION)-1um + + ARCH_INCLUDE = -I$(ARCH_DIR)/include +@@ -52,14 +59,22 @@ + + CFLAGS += $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ + -D_LARGEFILE64_SOURCE $(ARCH_INCLUDE) -Derrno=kernel_errno \ +- $(MODE_INCLUDE) ++ -Dsigprocmask=kernel_sigprocmask $(MODE_INCLUDE) ++ ++CFLAGS += $(call check_gcc,-fno-unit-at-a-time,) + + LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc + ++# These are needed for clean and mrproper, since in that case .config is not ++# included; the values here are meaningless ++ ++CONFIG_NEST_LEVEL ?= 0 ++CONFIG_KERNEL_HALF_GIGS ?= 0 ++ + SIZE = (($(CONFIG_NEST_LEVEL) + $(CONFIG_KERNEL_HALF_GIGS)) * 0x20000000) + + ifeq ($(CONFIG_MODE_SKAS), y) +-$(SYS_HEADERS) : $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h ++$(SYS_HEADERS) : $(TOPDIR)/$(ARCH_DIR)/include/skas_ptregs.h + endif + + include/linux/version.h: arch/$(ARCH)/Makefile +@@ -98,17 +113,17 @@ + CONFIG_KERNEL_STACK_ORDER ?= 2 + STACK_SIZE := $(shell echo $$[ 4096 * (1 << $(CONFIG_KERNEL_STACK_ORDER)) ] ) + +-AFLAGS_vmlinux.lds.o = -U$(SUBARCH) \ ++AFLAGS_vmlinux.lds.o = $(shell echo -U$(SUBARCH) \ + -DSTART=$$(($(TOP_ADDR) - $(SIZE))) -DELF_ARCH=$(ELF_ARCH) \ + -DELF_FORMAT=\"$(ELF_FORMAT)\" $(CPP_MODE_TT) \ +- -DKERNEL_STACK_SIZE=$(STACK_SIZE) ++ -DKERNEL_STACK_SIZE=$(STACK_SIZE)) + +-AFLAGS_$(LD_SCRIPT-y:.s=).o = $(AFLAGS_vmlinux.lds.o) -P -C -Uum ++export AFLAGS_$(LD_SCRIPT-y:.s=).o = $(AFLAGS_vmlinux.lds.o) -P -C -Uum + + LD_SCRIPT-y := $(ARCH_DIR)/$(LD_SCRIPT-y) + +-$(LD_SCRIPT-y) : $(LD_SCRIPT-y:.s=.S) scripts FORCE +- $(call if_changed_dep,as_s_S) ++#$(LD_SCRIPT-y) : $(LD_SCRIPT-y:.s=.S) scripts FORCE ++# $(call if_changed_dep,as_s_S) + + linux: vmlinux $(LD_SCRIPT-y) + $(CC) -Wl,-T,$(LD_SCRIPT-y) $(LINK-y) $(LINK_WRAPS) \ +@@ -116,37 +131,47 @@ + + USER_CFLAGS := $(patsubst -I%,,$(CFLAGS)) + USER_CFLAGS := $(patsubst -Derrno=kernel_errno,,$(USER_CFLAGS)) ++USER_CFLAGS := $(patsubst -Dsigprocmask=kernel_sigprocmask,,$(USER_CFLAGS)) + USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \ + $(MODE_INCLUDE) + + # To get a definition of F_SETSIG + USER_CFLAGS += -D_GNU_SOURCE + ++# From main Makefile, these options are set after including the ARCH makefile. ++# So copy them here. ++ ++ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE ++USER_CFLAGS += -Os ++else ++USER_CFLAGS += -O2 ++endif ++ ++ifndef CONFIG_FRAME_POINTER ++USER_CFLAGS += -fomit-frame-pointer ++endif ++ ++ifdef CONFIG_DEBUG_INFO ++USER_CFLAGS += -g ++endif ++ + CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/uml.lds.s \ +- $(ARCH_DIR)/dyn_link.ld.s $(GEN_HEADERS) ++ $(ARCH_DIR)/dyn_link.ld.s $(ARCH_DIR)/include/uml-config.h \ ++ $(GEN_HEADERS) ++ ++MRPROPER_FILES += $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) \ ++ $(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS)) + +-$(ARCH_DIR)/main.o: $(ARCH_DIR)/main.c +- $(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< ++$(ARCH_DIR)/main.o: $(ARCH_DIR)/main.c sys_prepare ++ @ echo ' MAIN $@' ++ @ $(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< + + archmrproper: +- for d in $(ARCH_SUBDIRS) $(ARCH_DIR)/util; \ +- do \ +- $(MAKE) -C $$d archmrproper; \ +- done +- rm -f $(CLEAN_FILES) $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) include/asm \ +- $(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS)) +- +-archclean: sysclean +- for d in $(ARCH_SUBDIRS) $(ARCH_DIR)/util; \ +- do \ +- $(MAKE) -C $$d clean; \ +- done +- find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ +- -o -name '*.gcov' \) -type f -print | xargs rm -f +- rm -f linux x.i gmon.out $(ARCH_DIR)/link.ld $(GEN_HEADERS) ++ @: + +-archdep: +- for d in $(ARCH_SUBDIRS); do $(MAKE) -C $$d fastdep; done ++archclean: ++ @find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ ++ -o -name '*.gcov' \) -type f -print | xargs rm -f + + $(SYMLINK_HEADERS): + cd $(TOPDIR)/$(dir $@) ; \ +@@ -161,19 +186,32 @@ + $(ARCH_DIR)/os: + cd $(ARCH_DIR) && ln -sf os-$(OS) os + +-$(ARCH_DIR)/include/uml-config.h : +- sed 's/ CONFIG/ UML_CONFIG/' $(TOPDIR)/include/linux/autoconf.h > $@ ++# Generated files ++define filechk_umlconfig ++ sed 's/ CONFIG/ UML_CONFIG/' ++endef ++ ++$(ARCH_DIR)/include/uml-config.h : $(TOPDIR)/include/linux/autoconf.h ++ $(call filechk,umlconfig) ++ ++filechk_gen_header = $< + + $(ARCH_DIR)/include/task.h : $(ARCH_DIR)/util/mk_task +- $< > $@ ++ $(call filechk,gen_header) + + $(ARCH_DIR)/include/kern_constants.h : $(ARCH_DIR)/util/mk_constants +- $< > $@ ++ $(call filechk,gen_header) + +-$(ARCH_DIR)/util/mk_task : $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h \ +- $(ARCH_DIR)/util FORCE ; ++$(ARCH_DIR)/util/mk_task $(ARCH_DIR)/util/mk_constants : $(ARCH_DIR)/util \ ++ sys_prepare FORCE ; + + $(ARCH_DIR)/util: FORCE +- @$(call descend,$@,) ++ $(Q)$(MAKE) $(build)=$@ ++ ++export SUBARCH USER_CFLAGS OS ++ ++all: linux + +-export SUBARCH USER_CFLAGS OS ++define archhelp ++ echo '* linux - Binary kernel image (./linux)' ++endef +Index: uml-2.6.7/arch/um/kernel/tt/unmap.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/unmap.c 2004-07-16 19:37:13.584959848 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/unmap.c 2004-07-16 19:47:23.753200176 +0300 +@@ -3,10 +3,7 @@ + * Licensed under the GPL + */ + +-#include <stdio.h> +-#include <errno.h> + #include <sys/mman.h> +-#include "user.h" + + int switcheroo(int fd, int prot, void *from, void *to, int size) + { +Index: uml-2.6.7/arch/um/kernel/tt/ptproxy/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/ptproxy/Makefile 2004-07-16 19:36:30.113568504 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/ptproxy/Makefile 2004-07-16 19:47:23.746201240 +0300 +@@ -9,5 +9,3 @@ + + $(USER_OBJS) : %.o: %.c + $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< +- +-clean: +Index: uml-2.6.7/arch/um/kernel/mem_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/mem_user.c 2004-07-16 19:36:47.959855456 +0300 ++++ uml-2.6.7/arch/um/kernel/mem_user.c 2004-07-16 19:47:23.721205040 +0300 +@@ -34,10 +34,9 @@ + #include <stddef.h> + #include <stdarg.h> + #include <unistd.h> +-#include <fcntl.h> + #include <errno.h> + #include <string.h> +-#include <sys/stat.h> ++#include <fcntl.h> + #include <sys/types.h> + #include <sys/mman.h> + #include "kern_util.h" +@@ -47,105 +46,145 @@ + #include "init.h" + #include "os.h" + #include "tempfile.h" ++#include "kern_constants.h" + + extern struct mem_region physmem_region; + + #define TEMPNAME_TEMPLATE "vm_file-XXXXXX" + +-int create_mem_file(unsigned long len) ++static int create_tmp_file(unsigned long len) + { +- int fd; ++ int fd, err; + char zero; + + fd = make_tempfile(TEMPNAME_TEMPLATE, NULL, 1); +- if (fchmod(fd, 0777) < 0){ +- perror("fchmod"); ++ if(fd < 0) { ++ os_print_error(fd, "make_tempfile"); ++ exit(1); ++ } ++ ++ err = os_mode_fd(fd, 0777); ++ if(err < 0){ ++ os_print_error(err, "os_mode_fd"); + exit(1); + } +- if(os_seek_file(fd, len) < 0){ +- perror("lseek"); ++ err = os_seek_file(fd, len); ++ if(err < 0){ ++ os_print_error(err, "os_seek_file"); + exit(1); + } + zero = 0; +- if(write(fd, &zero, 1) != 1){ +- perror("write"); ++ err = os_write_file(fd, &zero, 1); ++ if(err != 1){ ++ os_print_error(err, "os_write_file"); + exit(1); + } +- if(fcntl(fd, F_SETFD, 1) != 0) +- perror("Setting FD_CLOEXEC failed"); ++ + return(fd); + } + +-int setup_region(struct mem_region *region, void *entry) ++static int have_devanon = 0; ++ ++void check_devanon(void) ++{ ++ int fd; ++ ++ printk("Checking for /dev/anon on the host..."); ++ fd = open("/dev/anon", O_RDWR); ++ if(fd < 0){ ++ printk("Not available (open failed with errno %d)\n", errno); ++ return; ++ } ++ ++ printk("OK\n"); ++ have_devanon = 1; ++} ++ ++static int create_anon_file(unsigned long len) + { +- void *loc, *start; +- char *driver; +- int err, offset; +- +- if(region->start != -1){ +- err = reserve_vm(region->start, +- region->start + region->len, entry); +- if(err){ +- printk("setup_region : failed to reserve " +- "0x%x - 0x%x for driver '%s'\n", +- region->start, +- region->start + region->len, +- region->driver); +- return(-1); +- } +- } +- else region->start = get_vm(region->len); +- if(region->start == 0){ +- if(region->driver == NULL) driver = "physmem"; +- else driver = region->driver; +- printk("setup_region : failed to find vm for " +- "driver '%s' (length %d)\n", driver, region->len); +- return(-1); +- } +- if(region->start == uml_physmem){ +- start = (void *) uml_reserved; +- offset = uml_reserved - uml_physmem; +- } +- else { +- start = (void *) region->start; +- offset = 0; +- } +- +- loc = mmap(start, region->len - offset, PROT_READ | PROT_WRITE, +- MAP_SHARED | MAP_FIXED, region->fd, offset); +- if(loc != start){ +- perror("Mapping memory"); ++ void *addr; ++ int fd; ++ ++ fd = open("/dev/anon", O_RDWR); ++ if(fd < 0) { ++ os_print_error(fd, "opening /dev/anon"); + exit(1); + } +- return(0); ++ ++ addr = mmap(NULL, len, PROT_READ | PROT_WRITE , MAP_PRIVATE, fd, 0); ++ if(addr == MAP_FAILED){ ++ os_print_error((int) addr, "mapping physmem file"); ++ exit(1); ++ } ++ munmap(addr, len); ++ ++ return(fd); ++} ++ ++int create_mem_file(unsigned long len) ++{ ++ int err, fd; ++ ++ if(have_devanon) ++ fd = create_anon_file(len); ++ else fd = create_tmp_file(len); ++ ++ err = os_set_exec_close(fd, 1); ++ if(err < 0) ++ os_print_error(err, "exec_close"); ++ return(fd); + } + ++struct iomem_region *iomem_regions = NULL; ++int iomem_size = 0; ++ + static int __init parse_iomem(char *str, int *add) + { +- struct stat buf; ++ struct iomem_region *new; ++ struct uml_stat buf; + char *file, *driver; +- int fd; ++ int fd, err; + + driver = str; + file = strchr(str,','); + if(file == NULL){ +- printk("parse_iomem : failed to parse iomem\n"); +- return(1); ++ printf("parse_iomem : failed to parse iomem\n"); ++ goto out; + } + *file = '\0'; + file++; + fd = os_open_file(file, of_rdwr(OPENFLAGS()), 0); + if(fd < 0){ +- printk("parse_iomem - Couldn't open io file, errno = %d\n", +- errno); +- return(1); +- } +- if(fstat(fd, &buf) < 0) { +- printk("parse_iomem - cannot fstat file, errno = %d\n", errno); +- return(1); ++ os_print_error(fd, "parse_iomem - Couldn't open io file"); ++ goto out; + } +- add_iomem(driver, fd, buf.st_size); ++ ++ err = os_stat_fd(fd, &buf); ++ if(err < 0){ ++ os_print_error(err, "parse_iomem - cannot stat_fd file"); ++ goto out_close; ++ } ++ ++ new = malloc(sizeof(*new)); ++ if(new == NULL){ ++ perror("Couldn't allocate iomem_region struct"); ++ goto out_close; ++ } ++ ++ *new = ((struct iomem_region) { .next = iomem_regions, ++ .driver = driver, ++ .fd = fd, ++ .size = buf.ust_size, ++ .phys = 0, ++ .virt = 0 }); ++ iomem_regions = new; ++ iomem_size += new->size + UM_KERN_PAGE_SIZE; ++ + return(0); ++ out_close: ++ os_close_file(fd); ++ out: ++ return(1); + } + + __uml_setup("iomem=", parse_iomem, +@@ -153,73 +192,20 @@ + " Configure <file> as an IO memory region named <name>.\n\n" + ); + +-#ifdef notdef +-int logging = 0; +-int logging_fd = -1; +- +-int logging_line = 0; +-char logging_buf[256]; +- +-void log(char *fmt, ...) +-{ +- va_list ap; +- struct timeval tv; +- struct openflags flags; +- +- if(logging == 0) return; +- if(logging_fd < 0){ +- flags = of_create(of_trunc(of_rdrw(OPENFLAGS()))); +- logging_fd = os_open_file("log", flags, 0644); +- } +- gettimeofday(&tv, NULL); +- sprintf(logging_buf, "%d\t %u.%u ", logging_line++, tv.tv_sec, +- tv.tv_usec); +- va_start(ap, fmt); +- vsprintf(&logging_buf[strlen(logging_buf)], fmt, ap); +- va_end(ap); +- write(logging_fd, logging_buf, strlen(logging_buf)); +-} +-#endif +- +-int map_memory(unsigned long virt, unsigned long phys, unsigned long len, +- int r, int w, int x) +-{ +- struct mem_region *region = phys_region(phys); +- +- return(os_map_memory((void *) virt, region->fd, phys_offset(phys), len, +- r, w, x)); +-} +- + int protect_memory(unsigned long addr, unsigned long len, int r, int w, int x, + int must_succeed) + { +- if(os_protect_memory((void *) addr, len, r, w, x) < 0){ ++ int err; ++ ++ err = os_protect_memory((void *) addr, len, r, w, x); ++ if(err < 0){ + if(must_succeed) +- panic("protect failed, errno = %d", errno); +- else return(-errno); ++ panic("protect failed, err = %d", -err); ++ else return(err); + } + return(0); + } + +-unsigned long find_iomem(char *driver, unsigned long *len_out) +-{ +- struct mem_region *region; +- int i, n; +- +- n = nregions(); +- for(i = 0; i < n; i++){ +- region = regions[i]; +- if(region == NULL) continue; +- if((region->driver != NULL) && +- !strcmp(region->driver, driver)){ +- *len_out = region->len; +- return(region->start); +- } +- } +- *len_out = 0; +- return 0; +-} +- + /* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically +Index: uml-2.6.7/arch/um/kernel/init_task.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/init_task.c 2004-07-16 19:37:49.384517488 +0300 ++++ uml-2.6.7/arch/um/kernel/init_task.c 2004-07-16 19:47:23.716205800 +0300 +@@ -8,7 +8,6 @@ + #include "linux/module.h" + #include "linux/sched.h" + #include "linux/init_task.h" +-#include "linux/version.h" + #include "asm/uaccess.h" + #include "asm/pgtable.h" + #include "user_util.h" +@@ -18,7 +17,7 @@ + struct mm_struct init_mm = INIT_MM(init_mm); + static struct files_struct init_files = INIT_FILES; + static struct signal_struct init_signals = INIT_SIGNALS(init_signals); +- ++static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); + EXPORT_SYMBOL(init_mm); + + /* +@@ -43,26 +42,12 @@ + __attribute__((__section__(".data.init_task"))) = + { INIT_THREAD_INFO(init_task) }; + +-struct task_struct *alloc_task_struct(void) +-{ +- return((struct task_struct *) +- __get_free_pages(GFP_KERNEL, CONFIG_KERNEL_STACK_ORDER)); +-} +- + void unprotect_stack(unsigned long stack) + { + protect_memory(stack, (1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE, + 1, 1, 0, 1); + } + +-void free_task_struct(struct task_struct *task) +-{ +- /* free_pages decrements the page counter and only actually frees +- * the pages if they are now not accessed by anything. +- */ +- free_pages((unsigned long) task, CONFIG_KERNEL_STACK_ORDER); +-} +- + /* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically +Index: uml-2.6.7/arch/um/kernel/tty_log.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tty_log.c 2004-07-16 19:36:56.920493232 +0300 ++++ uml-2.6.7/arch/um/kernel/tty_log.c 2004-07-16 19:47:23.753200176 +0300 +@@ -9,10 +9,10 @@ + #include <stdio.h> + #include <stdlib.h> + #include <unistd.h> +-#include <fcntl.h> + #include <sys/time.h> + #include "init.h" + #include "user.h" ++#include "kern_util.h" + #include "os.h" + + #define TTY_LOG_DIR "./" +@@ -24,29 +24,40 @@ + #define TTY_LOG_OPEN 1 + #define TTY_LOG_CLOSE 2 + #define TTY_LOG_WRITE 3 ++#define TTY_LOG_EXEC 4 ++ ++#define TTY_READ 1 ++#define TTY_WRITE 2 + + struct tty_log_buf { + int what; + unsigned long tty; + int len; ++ int direction; ++ unsigned long sec; ++ unsigned long usec; + }; + +-int open_tty_log(void *tty) ++int open_tty_log(void *tty, void *current_tty) + { + struct timeval tv; + struct tty_log_buf data; + char buf[strlen(tty_log_dir) + sizeof("01234567890-01234567\0")]; + int fd; + ++ gettimeofday(&tv, NULL); + if(tty_log_fd != -1){ +- data = ((struct tty_log_buf) { what : TTY_LOG_OPEN, +- tty : (unsigned long) tty, +- len : 0 }); +- write(tty_log_fd, &data, sizeof(data)); ++ data = ((struct tty_log_buf) { .what = TTY_LOG_OPEN, ++ .tty = (unsigned long) tty, ++ .len = sizeof(current_tty), ++ .direction = 0, ++ .sec = tv.tv_sec, ++ .usec = tv.tv_usec } ); ++ os_write_file(tty_log_fd, &data, sizeof(data)); ++ os_write_file(tty_log_fd, ¤t_tty, data.len); + return(tty_log_fd); + } + +- gettimeofday(&tv, NULL); + sprintf(buf, "%s/%0u-%0u", tty_log_dir, (unsigned int) tv.tv_sec, + (unsigned int) tv.tv_usec); + +@@ -62,30 +73,117 @@ + void close_tty_log(int fd, void *tty) + { + struct tty_log_buf data; ++ struct timeval tv; + + if(tty_log_fd != -1){ +- data = ((struct tty_log_buf) { what : TTY_LOG_CLOSE, +- tty : (unsigned long) tty, +- len : 0 }); +- write(tty_log_fd, &data, sizeof(data)); ++ gettimeofday(&tv, NULL); ++ data = ((struct tty_log_buf) { .what = TTY_LOG_CLOSE, ++ .tty = (unsigned long) tty, ++ .len = 0, ++ .direction = 0, ++ .sec = tv.tv_sec, ++ .usec = tv.tv_usec } ); ++ os_write_file(tty_log_fd, &data, sizeof(data)); + return; + } +- close(fd); ++ os_close_file(fd); + } + +-int write_tty_log(int fd, char *buf, int len, void *tty) ++static int log_chunk(int fd, const char *buf, int len) + { ++ int total = 0, try, missed, n; ++ char chunk[64]; ++ ++ while(len > 0){ ++ try = (len > sizeof(chunk)) ? sizeof(chunk) : len; ++ missed = copy_from_user_proc(chunk, (char *) buf, try); ++ try -= missed; ++ n = os_write_file(fd, chunk, try); ++ if(n != try) { ++ if(n < 0) ++ return(n); ++ return(-EIO); ++ } ++ if(missed != 0) ++ return(-EFAULT); ++ ++ len -= try; ++ total += try; ++ buf += try; ++ } ++ ++ return(total); ++} ++ ++int write_tty_log(int fd, const char *buf, int len, void *tty, int is_read) ++{ ++ struct timeval tv; + struct tty_log_buf data; ++ int direction; + + if(fd == tty_log_fd){ +- data = ((struct tty_log_buf) { what : TTY_LOG_WRITE, +- tty : (unsigned long) tty, +- len : len }); +- write(tty_log_fd, &data, sizeof(data)); ++ gettimeofday(&tv, NULL); ++ direction = is_read ? TTY_READ : TTY_WRITE; ++ data = ((struct tty_log_buf) { .what = TTY_LOG_WRITE, ++ .tty = (unsigned long) tty, ++ .len = len, ++ .direction = direction, ++ .sec = tv.tv_sec, ++ .usec = tv.tv_usec } ); ++ os_write_file(tty_log_fd, &data, sizeof(data)); + } +- return(write(fd, buf, len)); ++ ++ return(log_chunk(fd, buf, len)); + } + ++void log_exec(char **argv, void *tty) ++{ ++ struct timeval tv; ++ struct tty_log_buf data; ++ char **ptr,*arg; ++ int len; ++ ++ if(tty_log_fd == -1) return; ++ ++ gettimeofday(&tv, NULL); ++ ++ len = 0; ++ for(ptr = argv; ; ptr++){ ++ if(copy_from_user_proc(&arg, ptr, sizeof(arg))) ++ return; ++ if(arg == NULL) break; ++ len += strlen_user_proc(arg); ++ } ++ ++ data = ((struct tty_log_buf) { .what = TTY_LOG_EXEC, ++ .tty = (unsigned long) tty, ++ .len = len, ++ .direction = 0, ++ .sec = tv.tv_sec, ++ .usec = tv.tv_usec } ); ++ os_write_file(tty_log_fd, &data, sizeof(data)); ++ ++ for(ptr = argv; ; ptr++){ ++ if(copy_from_user_proc(&arg, ptr, sizeof(arg))) ++ return; ++ if(arg == NULL) break; ++ log_chunk(tty_log_fd, arg, strlen_user_proc(arg)); ++ } ++} ++ ++extern void register_tty_logger(int (*opener)(void *, void *), ++ int (*writer)(int, const char *, int, ++ void *, int), ++ void (*closer)(int, void *)); ++ ++static int register_logger(void) ++{ ++ register_tty_logger(open_tty_log, write_tty_log, close_tty_log); ++ return(0); ++} ++ ++__uml_initcall(register_logger); ++ + static int __init set_tty_log_dir(char *name, int *add) + { + tty_log_dir = name; +@@ -104,7 +202,7 @@ + + tty_log_fd = strtoul(name, &end, 0); + if((*end != '\0') || (end == name)){ +- printk("set_tty_log_fd - strtoul failed on '%s'\n", name); ++ printf("set_tty_log_fd - strtoul failed on '%s'\n", name); + tty_log_fd = -1; + } + return 0; +Index: uml-2.6.7/arch/um/kernel/process_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/process_kern.c 2004-07-16 19:36:45.946161584 +0300 ++++ uml-2.6.7/arch/um/kernel/process_kern.c 2004-07-16 19:47:23.723204736 +0300 +@@ -16,6 +16,7 @@ + #include "linux/module.h" + #include "linux/init.h" + #include "linux/capability.h" ++#include "linux/spinlock.h" + #include "asm/unistd.h" + #include "asm/mman.h" + #include "asm/segment.h" +@@ -23,7 +24,6 @@ + #include "asm/pgtable.h" + #include "asm/processor.h" + #include "asm/tlbflush.h" +-#include "asm/spinlock.h" + #include "asm/uaccess.h" + #include "asm/user.h" + #include "user_util.h" +@@ -52,17 +52,12 @@ + + struct task_struct *get_task(int pid, int require) + { +- struct task_struct *task, *ret; ++ struct task_struct *ret; + +- ret = NULL; + read_lock(&tasklist_lock); +- for_each_process(task){ +- if(task->pid == pid){ +- ret = task; +- break; +- } +- } ++ ret = find_task_by_pid(pid); + read_unlock(&tasklist_lock); ++ + if(require && (ret == NULL)) panic("get_task couldn't find a task\n"); + return(ret); + } +@@ -95,7 +90,8 @@ + int flags = GFP_KERNEL; + + if(atomic) flags |= GFP_ATOMIC; +- if((page = __get_free_pages(flags, order)) == 0) ++ page = __get_free_pages(flags, order); ++ if(page == 0) + return(0); + stack_protections(page); + return(page); +@@ -103,13 +99,15 @@ + + int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) + { +- struct task_struct *p; ++ int pid; + + current->thread.request.u.thread.proc = fn; + current->thread.request.u.thread.arg = arg; +- p = do_fork(CLONE_VM | flags, 0, NULL, 0, NULL, NULL); +- if(IS_ERR(p)) panic("do_fork failed in kernel_thread"); +- return(p->pid); ++ pid = do_fork(CLONE_VM | CLONE_UNTRACED | flags, 0, NULL, 0, NULL, ++ NULL); ++ if(pid < 0) ++ panic("do_fork failed in kernel_thread, errno = %d", pid); ++ return(pid); + } + + void switch_mm(struct mm_struct *prev, struct mm_struct *next, +@@ -129,7 +127,7 @@ + { external_pid(task), task }); + } + +-void *switch_to(void *prev, void *next, void *last) ++void *_switch_to(void *prev, void *next, void *last) + { + return(CHOOSE_MODE(switch_to_tt(prev, next), + switch_to_skas(prev, next))); +@@ -149,7 +147,7 @@ + void exit_thread(void) + { + CHOOSE_MODE(exit_thread_tt(), exit_thread_skas()); +- unprotect_stack((unsigned long) current->thread_info); ++ unprotect_stack((unsigned long) current_thread); + } + + void *get_current(void) +@@ -157,6 +155,10 @@ + return(current); + } + ++void prepare_to_copy(struct task_struct *tsk) ++{ ++} ++ + int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, + unsigned long stack_top, struct task_struct * p, + struct pt_regs *regs) +@@ -190,7 +192,7 @@ + + void default_idle(void) + { +- idle_timer(); ++ uml_idle_timer(); + + atomic_inc(&init_mm.mm_count); + current->mm = &init_mm; +@@ -367,10 +369,15 @@ + return(clear_user(buf, size)); + } + ++int strlen_user_proc(char *str) ++{ ++ return(strlen_user(str)); ++} ++ + int smp_sigio_handler(void) + { + #ifdef CONFIG_SMP +- int cpu = current->thread_info->cpu; ++ int cpu = current_thread->cpu; + IPI_handler(cpu); + if(cpu != 0) + return(1); +@@ -385,7 +392,7 @@ + + int cpu(void) + { +- return(current->thread_info->cpu); ++ return(current_thread->cpu); + } + + /* +Index: uml-2.6.7/arch/um/config.release +=================================================================== +--- uml-2.6.7.orig/arch/um/config.release 2004-07-16 19:37:40.174917560 +0300 ++++ uml-2.6.7/arch/um/config.release 2004-07-16 19:47:23.675212032 +0300 +@@ -228,7 +228,6 @@ + CONFIG_EXT2_FS=y + CONFIG_SYSV_FS=m + CONFIG_UDF_FS=m +-# CONFIG_UDF_RW is not set + CONFIG_UFS_FS=m + # CONFIG_UFS_FS_WRITE is not set + +Index: uml-2.6.7/fs/hostfs/hostfs_kern.c +=================================================================== +--- uml-2.6.7.orig/fs/hostfs/hostfs_kern.c 2004-07-16 19:47:23.631218720 +0300 ++++ uml-2.6.7/fs/hostfs/hostfs_kern.c 2004-07-16 19:47:24.263122656 +0300 +@@ -0,0 +1,1024 @@ ++/* ++ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) ++ * Licensed under the GPL ++ * ++ * Ported the filesystem routines to 2.5. ++ * 2003-02-10 Petr Baudis <pasky@ucw.cz> ++ */ ++ ++#include <linux/stddef.h> ++#include <linux/fs.h> ++#include <linux/version.h> ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/slab.h> ++#include <linux/pagemap.h> ++#include <linux/blkdev.h> ++#include <linux/list.h> ++#include <linux/buffer_head.h> ++#include <linux/root_dev.h> ++#include <linux/statfs.h> ++#include <asm/uaccess.h> ++#include "hostfs.h" ++#include "kern_util.h" ++#include "kern.h" ++#include "user_util.h" ++#include "2_5compat.h" ++#include "init.h" ++ ++struct hostfs_inode_info { ++ char *host_filename; ++ int fd; ++ int mode; ++ struct inode vfs_inode; ++}; ++ ++static inline struct hostfs_inode_info *HOSTFS_I(struct inode *inode) ++{ ++ return(list_entry(inode, struct hostfs_inode_info, vfs_inode)); ++} ++ ++#define FILE_HOSTFS_I(file) HOSTFS_I((file)->f_dentry->d_inode) ++ ++int hostfs_d_delete(struct dentry *dentry) ++{ ++ return(1); ++} ++ ++struct dentry_operations hostfs_dentry_ops = { ++ .d_delete = hostfs_d_delete, ++}; ++ ++/* Changed in hostfs_args before the kernel starts running */ ++static char *root_ino = "/"; ++static int append = 0; ++ ++#define HOSTFS_SUPER_MAGIC 0x00c0ffee ++ ++static struct inode_operations hostfs_iops; ++static struct inode_operations hostfs_dir_iops; ++static struct address_space_operations hostfs_link_aops; ++ ++#ifndef MODULE ++static int __init hostfs_args(char *options, int *add) ++{ ++ char *ptr; ++ ++ ptr = strchr(options, ','); ++ if(ptr != NULL) ++ *ptr++ = '\0'; ++ if(*options != '\0') ++ root_ino = options; ++ ++ options = ptr; ++ while(options){ ++ ptr = strchr(options, ','); ++ if(ptr != NULL) ++ *ptr++ = '\0'; ++ if(*options != '\0'){ ++ if(!strcmp(options, "append")) ++ append = 1; ++ else printf("hostfs_args - unsupported option - %s\n", ++ options); ++ } ++ options = ptr; ++ } ++ return(0); ++} ++ ++__uml_setup("hostfs=", hostfs_args, ++"hostfs=<root dir>,<flags>,...\n" ++" This is used to set hostfs parameters. The root directory argument\n" ++" is used to confine all hostfs mounts to within the specified directory\n" ++" tree on the host. If this isn't specified, then a user inside UML can\n" ++" mount anything on the host that's accessible to the user that's running\n" ++" it.\n" ++" The only flag currently supported is 'append', which specifies that all\n" ++" files opened by hostfs will be opened in append mode.\n\n" ++); ++#endif ++ ++static char *dentry_name(struct dentry *dentry, int extra) ++{ ++ struct dentry *parent; ++ char *root, *name; ++ int len; ++ ++ len = 0; ++ parent = dentry; ++ while(parent->d_parent != parent){ ++ len += parent->d_name.len + 1; ++ parent = parent->d_parent; ++ } ++ ++ root = HOSTFS_I(parent->d_inode)->host_filename; ++ len += strlen(root); ++ name = kmalloc(len + extra + 1, GFP_KERNEL); ++ if(name == NULL) return(NULL); ++ ++ name[len] = '\0'; ++ parent = dentry; ++ while(parent->d_parent != parent){ ++ len -= parent->d_name.len + 1; ++ name[len] = '/'; ++ strncpy(&name[len + 1], parent->d_name.name, ++ parent->d_name.len); ++ parent = parent->d_parent; ++ } ++ strncpy(name, root, strlen(root)); ++ return(name); ++} ++ ++static char *inode_name(struct inode *ino, int extra) ++{ ++ struct dentry *dentry; ++ ++ dentry = list_entry(ino->i_dentry.next, struct dentry, d_alias); ++ return(dentry_name(dentry, extra)); ++} ++ ++static int read_name(struct inode *ino, char *name) ++{ ++ /* The non-int inode fields are copied into ints by stat_file and ++ * then copied into the inode because passing the actual pointers ++ * in and having them treated as int * breaks on big-endian machines ++ */ ++ int err; ++ int i_mode, i_nlink, i_blksize; ++ unsigned long long i_size; ++ unsigned long long i_ino; ++ unsigned long long i_blocks; ++ ++ err = stat_file(name, &i_ino, &i_mode, &i_nlink, &ino->i_uid, ++ &ino->i_gid, &i_size, &ino->i_atime, &ino->i_mtime, ++ &ino->i_ctime, &i_blksize, &i_blocks); ++ if(err) ++ return(err); ++ ++ ino->i_ino = i_ino; ++ ino->i_mode = i_mode; ++ ino->i_nlink = i_nlink; ++ ino->i_size = i_size; ++ ino->i_blksize = i_blksize; ++ ino->i_blocks = i_blocks; ++ if((ino->i_sb->s_dev == ROOT_DEV) && (ino->i_uid == getuid())) ++ ino->i_uid = 0; ++ return(0); ++} ++ ++static char *follow_link(char *link) ++{ ++ int len, n; ++ char *name, *resolved, *end; ++ ++ len = 64; ++ while(1){ ++ n = -ENOMEM; ++ name = kmalloc(len, GFP_KERNEL); ++ if(name == NULL) ++ goto out; ++ ++ n = do_readlink(link, name, len); ++ if(n < len) ++ break; ++ len *= 2; ++ kfree(name); ++ } ++ if(n < 0) ++ goto out_free; ++ ++ if(*name == '/') ++ return(name); ++ ++ end = strrchr(link, '/'); ++ if(end == NULL) ++ return(name); ++ ++ *(end + 1) = '\0'; ++ len = strlen(link) + strlen(name) + 1; ++ ++ resolved = kmalloc(len, GFP_KERNEL); ++ if(resolved == NULL){ ++ n = -ENOMEM; ++ goto out_free; ++ } ++ ++ sprintf(resolved, "%s%s", link, name); ++ kfree(name); ++ kfree(link); ++ return(resolved); ++ ++ out_free: ++ kfree(name); ++ out: ++ return(ERR_PTR(n)); ++} ++ ++static int read_inode(struct inode *ino) ++{ ++ char *name; ++ int err = 0; ++ ++ /* Unfortunately, we are called from iget() when we don't have a dentry ++ * allocated yet. ++ */ ++ if(list_empty(&ino->i_dentry)) ++ goto out; ++ ++ err = -ENOMEM; ++ name = inode_name(ino, 0); ++ if(name == NULL) ++ goto out; ++ ++ if(file_type(name, NULL) == OS_TYPE_SYMLINK){ ++ name = follow_link(name); ++ if(IS_ERR(name)){ ++ err = PTR_ERR(name); ++ goto out; ++ } ++ } ++ ++ err = read_name(ino, name); ++ kfree(name); ++ out: ++ return(err); ++} ++ ++int hostfs_statfs(struct super_block *sb, struct kstatfs *sf) ++{ ++ /* do_statfs uses struct statfs64 internally, but the linux kernel ++ * struct statfs still has 32-bit versions for most of these fields, ++ * so we convert them here ++ */ ++ int err; ++ long long f_blocks; ++ long long f_bfree; ++ long long f_bavail; ++ long long f_files; ++ long long f_ffree; ++ ++ err = do_statfs(HOSTFS_I(sb->s_root->d_inode)->host_filename, ++ &sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files, ++ &f_ffree, &sf->f_fsid, sizeof(sf->f_fsid), ++ &sf->f_namelen, sf->f_spare); ++ if(err) return(err); ++ sf->f_blocks = f_blocks; ++ sf->f_bfree = f_bfree; ++ sf->f_bavail = f_bavail; ++ sf->f_files = f_files; ++ sf->f_ffree = f_ffree; ++ sf->f_type = HOSTFS_SUPER_MAGIC; ++ return(0); ++} ++ ++static struct inode *hostfs_alloc_inode(struct super_block *sb) ++{ ++ struct hostfs_inode_info *hi; ++ ++ hi = kmalloc(sizeof(*hi), GFP_KERNEL); ++ if(hi == NULL) ++ return(NULL); ++ ++ *hi = ((struct hostfs_inode_info) { .host_filename = NULL, ++ .fd = -1, ++ .mode = 0 }); ++ inode_init_once(&hi->vfs_inode); ++ return(&hi->vfs_inode); ++} ++ ++static void hostfs_delete_inode(struct inode *inode) ++{ ++ if(HOSTFS_I(inode)->fd != -1) { ++ close_file(&HOSTFS_I(inode)->fd); ++ printk("Closing host fd in .delete_inode\n"); ++ HOSTFS_I(inode)->fd = -1; ++ } ++ clear_inode(inode); ++} ++ ++static void hostfs_destroy_inode(struct inode *inode) ++{ ++ if(HOSTFS_I(inode)->host_filename) ++ kfree(HOSTFS_I(inode)->host_filename); ++ ++ if(HOSTFS_I(inode)->fd != -1) { ++ close_file(&HOSTFS_I(inode)->fd); ++ printk("Closing host fd in .destroy_inode\n"); ++ } ++ ++ kfree(HOSTFS_I(inode)); ++} ++ ++static void hostfs_read_inode(struct inode *inode) ++{ ++ read_inode(inode); ++} ++ ++static struct super_operations hostfs_sbops = { ++ .alloc_inode = hostfs_alloc_inode, ++ .drop_inode = generic_delete_inode, ++ .delete_inode = hostfs_delete_inode, ++ .destroy_inode = hostfs_destroy_inode, ++ .read_inode = hostfs_read_inode, ++ .statfs = hostfs_statfs, ++}; ++ ++int hostfs_readdir(struct file *file, void *ent, filldir_t filldir) ++{ ++ void *dir; ++ char *name; ++ unsigned long long next, ino; ++ int error, len; ++ ++ name = dentry_name(file->f_dentry, 0); ++ if(name == NULL) return(-ENOMEM); ++ dir = open_dir(name, &error); ++ kfree(name); ++ if(dir == NULL) return(-error); ++ next = file->f_pos; ++ while((name = read_dir(dir, &next, &ino, &len)) != NULL){ ++ error = (*filldir)(ent, name, len, file->f_pos, ++ ino, DT_UNKNOWN); ++ if(error) break; ++ file->f_pos = next; ++ } ++ close_dir(dir); ++ return(0); ++} ++ ++int hostfs_file_open(struct inode *ino, struct file *file) ++{ ++ char *name; ++ int mode = 0, r = 0, w = 0, fd; ++ ++ mode = file->f_mode & (FMODE_READ | FMODE_WRITE); ++ if((mode & HOSTFS_I(ino)->mode) == mode) ++ return(0); ++ ++ /* The file may already have been opened, but with the wrong access, ++ * so this resets things and reopens the file with the new access. ++ */ ++ if(HOSTFS_I(ino)->fd != -1){ ++ close_file(&HOSTFS_I(ino)->fd); ++ HOSTFS_I(ino)->fd = -1; ++ } ++ ++ HOSTFS_I(ino)->mode |= mode; ++ if(HOSTFS_I(ino)->mode & FMODE_READ) ++ r = 1; ++ if(HOSTFS_I(ino)->mode & FMODE_WRITE) ++ w = 1; ++ if(w) ++ r = 1; ++ ++ name = dentry_name(file->f_dentry, 0); ++ if(name == NULL) ++ return(-ENOMEM); ++ ++ fd = open_file(name, r, w, append); ++ kfree(name); ++ if(fd < 0) return(fd); ++ FILE_HOSTFS_I(file)->fd = fd; ++ ++ return(0); ++} ++ ++int hostfs_fsync(struct file *file, struct dentry *dentry, int datasync) ++{ ++ return(0); ++} ++ ++static struct file_operations hostfs_file_fops = { ++ .llseek = generic_file_llseek, ++ .read = generic_file_read, ++ .write = generic_file_write, ++ .mmap = generic_file_mmap, ++ .open = hostfs_file_open, ++ .release = NULL, ++ .fsync = hostfs_fsync, ++}; ++ ++static struct file_operations hostfs_dir_fops = { ++ .readdir = hostfs_readdir, ++ .read = generic_read_dir, ++}; ++ ++int hostfs_writepage(struct page *page, struct writeback_control *wbc) ++{ ++ struct address_space *mapping = page->mapping; ++ struct inode *inode = mapping->host; ++ char *buffer; ++ unsigned long long base; ++ int count = PAGE_CACHE_SIZE; ++ int end_index = inode->i_size >> PAGE_CACHE_SHIFT; ++ int err; ++ ++ if (page->index >= end_index) ++ count = inode->i_size & (PAGE_CACHE_SIZE-1); ++ ++ buffer = kmap(page); ++ base = ((unsigned long long) page->index) << PAGE_CACHE_SHIFT; ++ ++ err = write_file(HOSTFS_I(inode)->fd, &base, buffer, count); ++ if(err != count){ ++ ClearPageUptodate(page); ++ goto out; ++ } ++ ++ if (base > inode->i_size) ++ inode->i_size = base; ++ ++ if (PageError(page)) ++ ClearPageError(page); ++ err = 0; ++ ++ out: ++ kunmap(page); ++ ++ unlock_page(page); ++ return err; ++} ++ ++int hostfs_readpage(struct file *file, struct page *page) ++{ ++ char *buffer; ++ long long start; ++ int err = 0; ++ ++ start = (long long) page->index << PAGE_CACHE_SHIFT; ++ buffer = kmap(page); ++ err = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer, ++ PAGE_CACHE_SIZE); ++ if(err < 0) goto out; ++ ++ memset(&buffer[err], 0, PAGE_CACHE_SIZE - err); ++ ++ flush_dcache_page(page); ++ SetPageUptodate(page); ++ if (PageError(page)) ClearPageError(page); ++ err = 0; ++ out: ++ kunmap(page); ++ unlock_page(page); ++ return(err); ++} ++ ++int hostfs_prepare_write(struct file *file, struct page *page, ++ unsigned int from, unsigned int to) ++{ ++ char *buffer; ++ long long start, tmp; ++ int err; ++ ++ start = (long long) page->index << PAGE_CACHE_SHIFT; ++ buffer = kmap(page); ++ if(from != 0){ ++ tmp = start; ++ err = read_file(FILE_HOSTFS_I(file)->fd, &tmp, buffer, ++ from); ++ if(err < 0) goto out; ++ } ++ if(to != PAGE_CACHE_SIZE){ ++ start += to; ++ err = read_file(FILE_HOSTFS_I(file)->fd, &start, buffer + to, ++ PAGE_CACHE_SIZE - to); ++ if(err < 0) goto out; ++ } ++ err = 0; ++ out: ++ kunmap(page); ++ return(err); ++} ++ ++int hostfs_commit_write(struct file *file, struct page *page, unsigned from, ++ unsigned to) ++{ ++ struct address_space *mapping = page->mapping; ++ struct inode *inode = mapping->host; ++ char *buffer; ++ long long start; ++ int err = 0; ++ ++ start = (long long) (page->index << PAGE_CACHE_SHIFT) + from; ++ buffer = kmap(page); ++ err = write_file(FILE_HOSTFS_I(file)->fd, &start, buffer + from, ++ to - from); ++ if(err > 0) err = 0; ++ if(!err && (start > inode->i_size)) ++ inode->i_size = start; ++ ++ kunmap(page); ++ return(err); ++} ++ ++static struct address_space_operations hostfs_aops = { ++ .writepage = hostfs_writepage, ++ .readpage = hostfs_readpage, ++/* .set_page_dirty = __set_page_dirty_nobuffers, */ ++ .prepare_write = hostfs_prepare_write, ++ .commit_write = hostfs_commit_write ++}; ++ ++static int init_inode(struct inode *inode, struct dentry *dentry) ++{ ++ char *name; ++ int type, err = -ENOMEM, rdev; ++ ++ if(dentry){ ++ name = dentry_name(dentry, 0); ++ if(name == NULL) ++ goto out; ++ type = file_type(name, &rdev); ++ kfree(name); ++ } ++ else type = OS_TYPE_DIR; ++ ++ err = 0; ++ if(type == OS_TYPE_SYMLINK) ++ inode->i_op = &page_symlink_inode_operations; ++ else if(type == OS_TYPE_DIR) ++ inode->i_op = &hostfs_dir_iops; ++ else inode->i_op = &hostfs_iops; ++ ++ if(type == OS_TYPE_DIR) inode->i_fop = &hostfs_dir_fops; ++ else inode->i_fop = &hostfs_file_fops; ++ ++ if(type == OS_TYPE_SYMLINK) ++ inode->i_mapping->a_ops = &hostfs_link_aops; ++ else inode->i_mapping->a_ops = &hostfs_aops; ++ ++ switch (type) { ++ case OS_TYPE_CHARDEV: ++ init_special_inode(inode, S_IFCHR, rdev); ++ break; ++ case OS_TYPE_BLOCKDEV: ++ init_special_inode(inode, S_IFBLK, rdev); ++ break; ++ case OS_TYPE_FIFO: ++ init_special_inode(inode, S_IFIFO, 0); ++ break; ++ case OS_TYPE_SOCK: ++ init_special_inode(inode, S_IFSOCK, 0); ++ break; ++ } ++ out: ++ return(err); ++} ++ ++int hostfs_create(struct inode *dir, struct dentry *dentry, int mode, ++ struct nameidata *nd) ++{ ++ struct inode *inode; ++ char *name; ++ int error, fd; ++ ++ error = -ENOMEM; ++ inode = iget(dir->i_sb, 0); ++ if(inode == NULL) goto out; ++ ++ error = init_inode(inode, dentry); ++ if(error) ++ goto out_put; ++ ++ error = -ENOMEM; ++ name = dentry_name(dentry, 0); ++ if(name == NULL) ++ goto out_put; ++ ++ fd = file_create(name, ++ mode & S_IRUSR, mode & S_IWUSR, mode & S_IXUSR, ++ mode & S_IRGRP, mode & S_IWGRP, mode & S_IXGRP, ++ mode & S_IROTH, mode & S_IWOTH, mode & S_IXOTH); ++ if(fd < 0) ++ error = fd; ++ else error = read_name(inode, name); ++ ++ kfree(name); ++ if(error) ++ goto out_put; ++ ++ HOSTFS_I(inode)->fd = fd; ++ HOSTFS_I(inode)->mode = FMODE_READ | FMODE_WRITE; ++ d_instantiate(dentry, inode); ++ return(0); ++ ++ out_put: ++ iput(inode); ++ out: ++ return(error); ++} ++ ++struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry, ++ struct nameidata *nd) ++{ ++ struct inode *inode; ++ char *name; ++ int err; ++ ++ err = -ENOMEM; ++ inode = iget(ino->i_sb, 0); ++ if(inode == NULL) ++ goto out; ++ ++ err = init_inode(inode, dentry); ++ if(err) ++ goto out_put; ++ ++ err = -ENOMEM; ++ name = dentry_name(dentry, 0); ++ if(name == NULL) ++ goto out_put; ++ ++ err = read_name(inode, name); ++ kfree(name); ++ if(err == -ENOENT){ ++ iput(inode); ++ inode = NULL; ++ } ++ else if(err) ++ goto out_put; ++ ++ d_add(dentry, inode); ++ dentry->d_op = &hostfs_dentry_ops; ++ return(NULL); ++ ++ out_put: ++ iput(inode); ++ out: ++ return(ERR_PTR(err)); ++} ++ ++static char *inode_dentry_name(struct inode *ino, struct dentry *dentry) ++{ ++ char *file; ++ int len; ++ ++ file = inode_name(ino, dentry->d_name.len + 1); ++ if(file == NULL) return(NULL); ++ strcat(file, "/"); ++ len = strlen(file); ++ strncat(file, dentry->d_name.name, dentry->d_name.len); ++ file[len + dentry->d_name.len] = '\0'; ++ return(file); ++} ++ ++int hostfs_link(struct dentry *to, struct inode *ino, struct dentry *from) ++{ ++ char *from_name, *to_name; ++ int err; ++ ++ if((from_name = inode_dentry_name(ino, from)) == NULL) ++ return(-ENOMEM); ++ to_name = dentry_name(to, 0); ++ if(to_name == NULL){ ++ kfree(from_name); ++ return(-ENOMEM); ++ } ++ err = link_file(to_name, from_name); ++ kfree(from_name); ++ kfree(to_name); ++ return(err); ++} ++ ++int hostfs_unlink(struct inode *ino, struct dentry *dentry) ++{ ++ char *file; ++ int err; ++ ++ if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); ++ if(append) ++ return(-EPERM); ++ ++ err = unlink_file(file); ++ kfree(file); ++ return(err); ++} ++ ++int hostfs_symlink(struct inode *ino, struct dentry *dentry, const char *to) ++{ ++ char *file; ++ int err; ++ ++ if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); ++ err = make_symlink(file, to); ++ kfree(file); ++ return(err); ++} ++ ++int hostfs_mkdir(struct inode *ino, struct dentry *dentry, int mode) ++{ ++ char *file; ++ int err; ++ ++ if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); ++ err = do_mkdir(file, mode); ++ kfree(file); ++ return(err); ++} ++ ++int hostfs_rmdir(struct inode *ino, struct dentry *dentry) ++{ ++ char *file; ++ int err; ++ ++ if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); ++ err = do_rmdir(file); ++ kfree(file); ++ return(err); ++} ++ ++int hostfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev) ++{ ++ struct inode *inode; ++ char *name; ++ int err = -ENOMEM; ++ ++ inode = iget(dir->i_sb, 0); ++ if(inode == NULL) ++ goto out; ++ ++ err = init_inode(inode, dentry); ++ if(err) ++ goto out_put; ++ ++ err = -ENOMEM; ++ name = dentry_name(dentry, 0); ++ if(name == NULL) ++ goto out_put; ++ ++ init_special_inode(inode, mode, dev); ++ err = do_mknod(name, mode, dev); ++ if(err) ++ goto out_free; ++ ++ err = read_name(inode, name); ++ kfree(name); ++ if(err) ++ goto out_put; ++ ++ d_instantiate(dentry, inode); ++ return(0); ++ ++ out_free: ++ kfree(name); ++ out_put: ++ iput(inode); ++ out: ++ return(err); ++} ++ ++int hostfs_rename(struct inode *from_ino, struct dentry *from, ++ struct inode *to_ino, struct dentry *to) ++{ ++ char *from_name, *to_name; ++ int err; ++ ++ if((from_name = inode_dentry_name(from_ino, from)) == NULL) ++ return(-ENOMEM); ++ if((to_name = inode_dentry_name(to_ino, to)) == NULL){ ++ kfree(from_name); ++ return(-ENOMEM); ++ } ++ err = rename_file(from_name, to_name); ++ kfree(from_name); ++ kfree(to_name); ++ return(err); ++} ++ ++void hostfs_truncate(struct inode *ino) ++{ ++ not_implemented(); ++} ++ ++int hostfs_permission(struct inode *ino, int desired, struct nameidata *nd) ++{ ++ char *name; ++ int r = 0, w = 0, x = 0, err; ++ ++ if(desired & MAY_READ) r = 1; ++ if(desired & MAY_WRITE) w = 1; ++ if(desired & MAY_EXEC) x = 1; ++ name = inode_name(ino, 0); ++ if(name == NULL) return(-ENOMEM); ++ err = access_file(name, r, w, x); ++ kfree(name); ++ if(!err) err = vfs_permission(ino, desired); ++ return(err); ++} ++ ++int hostfs_setattr(struct dentry *dentry, struct iattr *attr) ++{ ++ struct hostfs_iattr attrs; ++ char *name; ++ int err; ++ ++ if(append) ++ attr->ia_valid &= ~ATTR_SIZE; ++ ++ attrs.ia_valid = 0; ++ if(attr->ia_valid & ATTR_MODE){ ++ attrs.ia_valid |= HOSTFS_ATTR_MODE; ++ attrs.ia_mode = attr->ia_mode; ++ } ++ if(attr->ia_valid & ATTR_UID){ ++ if((dentry->d_inode->i_sb->s_dev == ROOT_DEV) && ++ (attr->ia_uid == 0)) ++ attr->ia_uid = getuid(); ++ attrs.ia_valid |= HOSTFS_ATTR_UID; ++ attrs.ia_uid = attr->ia_uid; ++ } ++ if(attr->ia_valid & ATTR_GID){ ++ if((dentry->d_inode->i_sb->s_dev == ROOT_DEV) && ++ (attr->ia_gid == 0)) ++ attr->ia_gid = getuid(); ++ attrs.ia_valid |= HOSTFS_ATTR_GID; ++ attrs.ia_gid = attr->ia_gid; ++ } ++ if(attr->ia_valid & ATTR_SIZE){ ++ attrs.ia_valid |= HOSTFS_ATTR_SIZE; ++ attrs.ia_size = attr->ia_size; ++ } ++ if(attr->ia_valid & ATTR_ATIME){ ++ attrs.ia_valid |= HOSTFS_ATTR_ATIME; ++ attrs.ia_atime = attr->ia_atime; ++ } ++ if(attr->ia_valid & ATTR_MTIME){ ++ attrs.ia_valid |= HOSTFS_ATTR_MTIME; ++ attrs.ia_mtime = attr->ia_mtime; ++ } ++ if(attr->ia_valid & ATTR_CTIME){ ++ attrs.ia_valid |= HOSTFS_ATTR_CTIME; ++ attrs.ia_ctime = attr->ia_ctime; ++ } ++ if(attr->ia_valid & ATTR_ATIME_SET){ ++ attrs.ia_valid |= HOSTFS_ATTR_ATIME_SET; ++ } ++ if(attr->ia_valid & ATTR_MTIME_SET){ ++ attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET; ++ } ++ name = dentry_name(dentry, 0); ++ if(name == NULL) return(-ENOMEM); ++ err = set_attr(name, &attrs); ++ kfree(name); ++ if(err) ++ return(err); ++ ++ return(inode_setattr(dentry->d_inode, attr)); ++} ++ ++int hostfs_getattr(struct vfsmount *mnt, struct dentry *dentry, ++ struct kstat *stat) ++{ ++ generic_fillattr(dentry->d_inode, stat); ++ return(0); ++} ++ ++static struct inode_operations hostfs_iops = { ++ .create = hostfs_create, ++ .link = hostfs_link, ++ .unlink = hostfs_unlink, ++ .symlink = hostfs_symlink, ++ .mkdir = hostfs_mkdir, ++ .rmdir = hostfs_rmdir, ++ .mknod = hostfs_mknod, ++ .rename = hostfs_rename, ++ .truncate = hostfs_truncate, ++ .permission = hostfs_permission, ++ .setattr = hostfs_setattr, ++ .getattr = hostfs_getattr, ++}; ++ ++static struct inode_operations hostfs_dir_iops = { ++ .create = hostfs_create, ++ .lookup = hostfs_lookup, ++ .link = hostfs_link, ++ .unlink = hostfs_unlink, ++ .symlink = hostfs_symlink, ++ .mkdir = hostfs_mkdir, ++ .rmdir = hostfs_rmdir, ++ .mknod = hostfs_mknod, ++ .rename = hostfs_rename, ++ .truncate = hostfs_truncate, ++ .permission = hostfs_permission, ++ .setattr = hostfs_setattr, ++ .getattr = hostfs_getattr, ++}; ++ ++int hostfs_link_readpage(struct file *file, struct page *page) ++{ ++ char *buffer, *name; ++ long long start; ++ int err; ++ ++ start = page->index << PAGE_CACHE_SHIFT; ++ buffer = kmap(page); ++ name = inode_name(page->mapping->host, 0); ++ if(name == NULL) return(-ENOMEM); ++ err = do_readlink(name, buffer, PAGE_CACHE_SIZE); ++ kfree(name); ++ if(err == PAGE_CACHE_SIZE) ++ err = -E2BIG; ++ else if(err > 0){ ++ flush_dcache_page(page); ++ SetPageUptodate(page); ++ if (PageError(page)) ClearPageError(page); ++ err = 0; ++ } ++ kunmap(page); ++ unlock_page(page); ++ return(err); ++} ++ ++static struct address_space_operations hostfs_link_aops = { ++ .readpage = hostfs_link_readpage, ++}; ++ ++static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) ++{ ++ struct inode *root_inode; ++ char *name, *data = d; ++ int err; ++ ++ sb->s_blocksize = 1024; ++ sb->s_blocksize_bits = 10; ++ sb->s_magic = HOSTFS_SUPER_MAGIC; ++ sb->s_op = &hostfs_sbops; ++ ++ if((data == NULL) || (*data == '\0')) ++ data = root_ino; ++ ++ err = -ENOMEM; ++ name = kmalloc(strlen(data) + 1, GFP_KERNEL); ++ if(name == NULL) ++ goto out; ++ ++ strcpy(name, data); ++ ++ root_inode = iget(sb, 0); ++ if(root_inode == NULL) ++ goto out_free; ++ ++ err = init_inode(root_inode, NULL); ++ if(err) ++ goto out_put; ++ ++ HOSTFS_I(root_inode)->host_filename = name; ++ ++ err = -ENOMEM; ++ sb->s_root = d_alloc_root(root_inode); ++ if(sb->s_root == NULL) ++ goto out_put; ++ ++ err = read_inode(root_inode); ++ if(err) ++ goto out_put; ++ ++ return(0); ++ ++ out_put: ++ iput(root_inode); ++ out_free: ++ kfree(name); ++ out: ++ return(err); ++} ++ ++static struct super_block *hostfs_read_sb(struct file_system_type *type, ++ int flags, const char *dev_name, ++ void *data) ++{ ++ return(get_sb_nodev(type, flags, data, hostfs_fill_sb_common)); ++} ++ ++static struct file_system_type hostfs_type = { ++ .owner = THIS_MODULE, ++ .name = "hostfs", ++ .get_sb = hostfs_read_sb, ++ .kill_sb = kill_anon_super, ++ .fs_flags = 0, ++}; ++ ++static int __init init_hostfs(void) ++{ ++ return(register_filesystem(&hostfs_type)); ++} ++ ++static void __exit exit_hostfs(void) ++{ ++ unregister_filesystem(&hostfs_type); ++} ++ ++module_init(init_hostfs) ++module_exit(exit_hostfs) ++MODULE_LICENSE("GPL"); ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/include/asm-um/module-generic.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/module-generic.h 2004-07-16 19:47:23.634218264 +0300 ++++ uml-2.6.7/include/asm-um/module-generic.h 2004-07-16 19:47:23.791194400 +0300 +@@ -0,0 +1,6 @@ ++#ifndef __UM_MODULE_GENERIC_H ++#define __UM_MODULE_GENERIC_H ++ ++#include "asm/arch/module.h" ++ ++#endif +Index: uml-2.6.7/arch/um/include/user_util.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/user_util.h 2004-07-16 19:36:02.218809152 +0300 ++++ uml-2.6.7/arch/um/include/user_util.h 2004-07-16 19:47:24.794041944 +0300 +@@ -14,8 +14,6 @@ + extern int unlockpt(int __fd); + extern char *ptsname(int __fd); + +-enum { OP_NONE, OP_EXEC, OP_FORK, OP_TRACE_ON, OP_REBOOT, OP_HALT, OP_CB }; +- + struct cpu_task { + int pid; + void *task; +@@ -59,13 +57,11 @@ + extern void *add_signal_handler(int sig, void (*handler)(int)); + extern int start_fork_tramp(void *arg, unsigned long temp_stack, + int clone_flags, int (*tramp)(void *)); +-extern int clone_and_wait(int (*fn)(void *), void *arg, void *sp, int flags); + extern int linux_main(int argc, char **argv); + extern void set_cmdline(char *cmd); + extern void input_cb(void (*proc)(void *), void *arg, int arg_len); + extern int get_pty(void); + extern void *um_kmalloc(int size); +-extern int raw(int fd, int complain); + extern int switcheroo(int fd, int prot, void *from, void *to, int size); + extern void setup_machinename(char *machine_out); + extern void setup_hostinfo(void); +@@ -86,11 +82,17 @@ + extern int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr); + extern void write_sigio_workaround(void); + extern void arch_check_bugs(void); ++extern int cpu_feature(char *what, char *buf, int len); + extern int arch_handle_signal(int sig, union uml_pt_regs *regs); + extern int arch_fixup(unsigned long address, void *sc_ptr); + extern void forward_pending_sigio(int target); + extern int can_do_skas(void); +- ++extern void arch_init_thread(void); ++ ++extern int __raw(int fd, int complain, int now); ++#define raw(fd, complain) __raw((fd), (complain), 1) ++ ++#define CATCH_EINTR(expr) while ( ((expr) < 0) && errno == EINTR) + #endif + + /* +Index: uml-2.6.7/include/asm-um/cpufeature.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/cpufeature.h 2004-07-16 19:47:23.633218416 +0300 ++++ uml-2.6.7/include/asm-um/cpufeature.h 2004-07-16 19:47:23.788194856 +0300 +@@ -0,0 +1,6 @@ ++#ifndef __UM_CPUFEATURE_H ++#define __UM_CPUFEATURE_H ++ ++#include "asm/arch/cpufeature.h" ++ ++#endif +Index: uml-2.6.7/arch/um/kernel/uaccess_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/uaccess_user.c 2004-07-16 19:37:08.883674552 +0300 ++++ uml-2.6.7/arch/um/kernel/uaccess_user.c 2004-07-16 19:47:23.754200024 +0300 +@@ -20,7 +20,7 @@ + + jmp_buf jbuf; + *fault_catcher = &jbuf; +- if(setjmp(jbuf) == 0){ ++ if(sigsetjmp(jbuf, 1) == 0){ + (*op)(to, from, n); + ret = 0; + *faulted_out = 0; +Index: uml-2.6.7/arch/um/kernel/tt/exec_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/exec_kern.c 2004-07-16 19:36:10.502549832 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/exec_kern.c 2004-07-16 19:47:23.743201696 +0300 +@@ -17,6 +17,7 @@ + #include "mem_user.h" + #include "os.h" + #include "tlb.h" ++#include "mode.h" + + static int exec_tramp(void *sig_stack) + { +@@ -47,17 +48,17 @@ + do_exit(SIGKILL); + } + +- if(current->thread_info->cpu == 0) ++ if(current_thread->cpu == 0) + forward_interrupts(new_pid); + current->thread.request.op = OP_EXEC; + current->thread.request.u.exec.pid = new_pid; +- unprotect_stack((unsigned long) current->thread_info); ++ unprotect_stack((unsigned long) current_thread); + os_usr1_process(os_getpid()); + + enable_timer(); + free_page(stack); + protect_memory(uml_reserved, high_physmem - uml_reserved, 1, 1, 0, 1); +- task_protections((unsigned long) current->thread_info); ++ task_protections((unsigned long) current_thread); + force_flush_all(); + unblock_signals(); + } +Index: uml-2.6.7/arch/um/kernel/frame.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/frame.c 2004-07-16 19:36:25.094331544 +0300 ++++ uml-2.6.7/arch/um/kernel/frame.c 2004-07-16 19:47:24.796041640 +0300 +@@ -21,6 +21,7 @@ + #include "sysdep/sigcontext.h" + #include "frame_user.h" + #include "kern_util.h" ++#include "user_util.h" + #include "ptrace_user.h" + #include "os.h" + +@@ -40,7 +41,7 @@ + /* Wait for it to stop itself and continue it with a SIGUSR1 to force + * it into the signal handler. + */ +- n = waitpid(pid, &status, WUNTRACED); ++ CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + if(n < 0){ + printf("capture_stack : waitpid failed - errno = %d\n", errno); + exit(1); +@@ -60,7 +61,7 @@ + * At this point, the handler has stuffed the addresses of + * sig, sc, and SA_RESTORER in raw. + */ +- n = waitpid(pid, &status, WUNTRACED); ++ CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + if(n < 0){ + printf("capture_stack : waitpid failed - errno = %d\n", errno); + exit(1); +@@ -82,7 +83,8 @@ + errno); + exit(1); + } +- if(waitpid(pid, &status, 0) < 0){ ++ CATCH_EINTR(n = waitpid(pid, &status, 0)); ++ if(n < 0){ + printf("capture_stack : waitpid failed - errno = %d\n", errno); + exit(1); + } +@@ -279,7 +281,7 @@ + struct sc_frame_raw raw_sc; + struct si_frame_raw raw_si; + void *stack, *sigstack; +- unsigned long top, sig_top, base; ++ unsigned long top, base; + + stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); +@@ -292,7 +294,6 @@ + } + + top = (unsigned long) stack + PAGE_SIZE - sizeof(void *); +- sig_top = (unsigned long) sigstack + PAGE_SIZE; + + /* Get the sigcontext, no sigrestorer layout */ + raw_sc.restorer = 0; +Index: uml-2.6.7/include/asm-um/unistd.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/unistd.h 2004-07-16 19:37:20.150961664 +0300 ++++ uml-2.6.7/include/asm-um/unistd.h 2004-07-16 19:47:23.804192424 +0300 +@@ -48,7 +48,10 @@ + set_fs(KERNEL_DS); \ + ret = sys(args); \ + set_fs(fs); \ +- return ret; ++ if (ret >= 0) \ ++ return ret; \ ++ errno = -(long)ret; \ ++ return -1; + + static inline long open(const char *pathname, int flags, int mode) + { +Index: uml-2.6.7/arch/um/include/mem_kern.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/mem_kern.h 2004-07-16 19:47:23.613221456 +0300 ++++ uml-2.6.7/arch/um/include/mem_kern.h 2004-07-16 19:47:23.704207624 +0300 +@@ -0,0 +1,30 @@ ++/* ++ * Copyright (C) 2003 Jeff Dike (jdike@addtoit.com) ++ * Licensed under the GPL ++ */ ++ ++#ifndef __MEM_KERN_H__ ++#define __MEM_KERN_H__ ++ ++#include "linux/list.h" ++#include "linux/types.h" ++ ++struct remapper { ++ struct list_head list; ++ int (*proc)(int, unsigned long, int, __u64); ++}; ++ ++extern void register_remapper(struct remapper *info); ++ ++#endif ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/dyn.lds.S +=================================================================== +--- uml-2.6.7.orig/arch/um/dyn.lds.S 2004-07-16 19:36:43.059600408 +0300 ++++ uml-2.6.7/arch/um/dyn.lds.S 2004-07-16 19:47:23.700208232 +0300 +@@ -1,3 +1,5 @@ ++#include <asm-generic/vmlinux.lds.h> ++ + OUTPUT_FORMAT(ELF_FORMAT) + OUTPUT_ARCH(ELF_ARCH) + ENTRY(_start) +@@ -10,12 +12,15 @@ + { + . = START + SIZEOF_HEADERS; + .interp : { *(.interp) } +- . = ALIGN(4096); + __binary_start = .; + . = ALIGN(4096); /* Init code and data */ + _stext = .; + __init_begin = .; +- .text.init : { *(.text.init) } ++ .init.text : { ++ _sinittext = .; ++ *(.init.text) ++ _einittext = .; ++ } + + . = ALIGN(4096); + +@@ -55,7 +60,9 @@ + } =0x90909090 + .plt : { *(.plt) } + .text : { +- *(.text .stub .text.* .gnu.linkonce.t.*) ++ *(.text) ++ SCHED_TEXT ++ *(.stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + } =0x90909090 +@@ -67,7 +74,7 @@ + + #include "asm/common.lds.S" + +- .data.init : { *(.data.init) } ++ init.data : { *(.init.data) } + + /* Ensure the __preinit_array_start label is properly aligned. We + could instead move the label definition inside the section, but +Index: uml-2.6.7/arch/um/kernel/trap_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/trap_user.c 2004-07-16 19:36:37.162496904 +0300 ++++ uml-2.6.7/arch/um/kernel/trap_user.c 2004-07-16 19:47:24.799041184 +0300 +@@ -5,11 +5,9 @@ + + #include <stdlib.h> + #include <errno.h> +-#include <fcntl.h> + #include <setjmp.h> + #include <signal.h> + #include <sys/time.h> +-#include <sys/ioctl.h> + #include <sys/ptrace.h> + #include <sys/wait.h> + #include <asm/page.h> +@@ -34,7 +32,14 @@ + { + kill(pid, SIGKILL); + kill(pid, SIGCONT); +- while(waitpid(pid, NULL, 0) > 0) kill(pid, SIGCONT); ++ do { ++ int n; ++ CATCH_EINTR(n = waitpid(pid, NULL, 0)); ++ if (n > 0) ++ kill(pid, SIGCONT); ++ else ++ break; ++ } while(1); + } + + /* Unlocked - don't care if this is a bit off */ +@@ -82,6 +87,8 @@ + .is_irq = 0 }, + [ SIGILL ] { .handler = relay_signal, + .is_irq = 0 }, ++ [ SIGWINCH ] { .handler = winch, ++ .is_irq = 1 }, + [ SIGBUS ] { .handler = bus_handler, + .is_irq = 0 }, + [ SIGSEGV] { .handler = segv_handler, +@@ -102,12 +109,11 @@ + sig, &sc); + } + +-extern int timer_irq_inited, missed_ticks[]; ++extern int timer_irq_inited; + + void alarm_handler(int sig, struct sigcontext sc) + { + if(!timer_irq_inited) return; +- missed_ticks[cpu()]++; + + if(sig == SIGALRM) + switch_timers(0); +@@ -123,7 +129,7 @@ + { + jmp_buf *buf = b; + +- longjmp(*buf, val); ++ siglongjmp(*buf, val); + } + + /* +Index: uml-2.6.7/arch/um/Kconfig_net +=================================================================== +--- uml-2.6.7.orig/arch/um/Kconfig_net 2004-07-16 19:36:54.256898160 +0300 ++++ uml-2.6.7/arch/um/Kconfig_net 2004-07-16 19:47:23.712206408 +0300 +@@ -1,5 +1,5 @@ + +-menu "Network Devices" ++menu "UML Network Devices" + depends on NET + + # UML virtual driver +@@ -176,73 +176,5 @@ + + Startup example: "eth0=slirp,FE:FD:01:02:03:04,/usr/local/bin/slirp" + +- +-# Below are hardware-independent drivers mirrored from +-# drivers/net/Config.in. It would be nice if Linux +-# had HW independent drivers separated from the other +-# but it does not. Until then each non-ISA/PCI arch +-# needs to provide it's own menu of network drivers +-config DUMMY +- tristate "Dummy net driver support" +- +-config BONDING +- tristate "Bonding driver support" +- +-config EQUALIZER +- tristate "EQL (serial line load balancing) support" +- +-config TUN +- tristate "Universal TUN/TAP device driver support" +- +-config ETHERTAP +- tristate "Ethertap network tap (OBSOLETE)" +- depends on EXPERIMENTAL && NETLINK +- +-config PPP +- tristate "PPP (point-to-point protocol) support" +- +-config PPP_MULTILINK +- bool "PPP multilink support (EXPERIMENTAL)" +- depends on PPP && EXPERIMENTAL +- +-config PPP_FILTER +- bool "PPP filtering" +- depends on PPP && FILTER +- +-config PPP_ASYNC +- tristate "PPP support for async serial ports" +- depends on PPP +- +-config PPP_SYNC_TTY +- tristate "PPP support for sync tty ports" +- depends on PPP +- +-config PPP_DEFLATE +- tristate "PPP Deflate compression" +- depends on PPP +- +-config PPP_BSDCOMP +- tristate "PPP BSD-Compress compression" +- depends on PPP +- +-config PPPOE +- tristate "PPP over Ethernet (EXPERIMENTAL)" +- depends on PPP && EXPERIMENTAL +- +-config SLIP +- tristate "SLIP (serial line) support" +- +-config SLIP_COMPRESSED +- bool "CSLIP compressed headers" +- depends on SLIP=y +- +-config SLIP_SMART +- bool "Keepalive and linefill" +- depends on SLIP=y +- +-config SLIP_MODE_SLIP6 +- bool "Six bit SLIP encapsulation" +- depends on SLIP=y +- + endmenu + +Index: uml-2.6.7/fs/hppfs/Makefile +=================================================================== +--- uml-2.6.7.orig/fs/hppfs/Makefile 2004-07-16 19:47:23.632218568 +0300 ++++ uml-2.6.7/fs/hppfs/Makefile 2004-07-16 19:47:23.786195160 +0300 +@@ -0,0 +1,19 @@ ++# ++# Copyright (C) 2002, 2003 Jeff Dike (jdike@karaya.com) ++# Licensed under the GPL ++# ++ ++hppfs-objs := hppfs_kern.o ++ ++obj-y = ++obj-$(CONFIG_HPPFS) += hppfs.o ++ ++clean: ++ ++modules: ++ ++fastdep: ++ ++dep: ++ ++archmrproper: clean +Index: uml-2.6.7/arch/um/kernel/trap_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/trap_kern.c 2004-07-16 19:35:56.026750488 +0300 ++++ uml-2.6.7/arch/um/kernel/trap_kern.c 2004-07-16 19:47:23.742201848 +0300 +@@ -16,12 +16,15 @@ + #include "asm/tlbflush.h" + #include "asm/a.out.h" + #include "asm/current.h" ++#include "asm/irq.h" + #include "user_util.h" + #include "kern_util.h" + #include "kern.h" + #include "chan_kern.h" + #include "mconsole_kern.h" + #include "2_5compat.h" ++#include "mem.h" ++#include "mem_kern.h" + + int handle_page_fault(unsigned long address, unsigned long ip, + int is_write, int is_user, int *code_out) +@@ -51,12 +54,12 @@ + if(is_write && !(vma->vm_flags & VM_WRITE)) + goto out; + page = address & PAGE_MASK; +- if(page == (unsigned long) current->thread_info + PAGE_SIZE) ++ if(page == (unsigned long) current_thread + PAGE_SIZE) + panic("Kernel stack overflow"); + pgd = pgd_offset(mm, page); + pmd = pmd_offset(pgd, page); +- survive: + do { ++ survive: + switch (handle_mm_fault(mm, vma, address, is_write)){ + case VM_FAULT_MINOR: + current->min_flt++; +@@ -71,14 +74,20 @@ + err = -ENOMEM; + goto out_of_memory; + default: +- BUG(); ++ if (current->pid == 1) { ++ up_read(&mm->mmap_sem); ++ yield(); ++ down_read(&mm->mmap_sem); ++ goto survive; ++ } ++ goto out; + } + pte = pte_offset_kernel(pmd, page); + } while(!pte_present(*pte)); ++ err = 0; + *pte = pte_mkyoung(*pte); + if(pte_write(*pte)) *pte = pte_mkdirty(*pte); + flush_tlb_page(vma, page); +- err = 0; + out: + up_read(&mm->mmap_sem); + return(err); +@@ -98,6 +107,33 @@ + goto out; + } + ++LIST_HEAD(physmem_remappers); ++ ++void register_remapper(struct remapper *info) ++{ ++ list_add(&info->list, &physmem_remappers); ++} ++ ++static int check_remapped_addr(unsigned long address, int is_write) ++{ ++ struct remapper *remapper; ++ struct list_head *ele; ++ __u64 offset; ++ int fd; ++ ++ fd = phys_mapping(__pa(address), &offset); ++ if(fd == -1) ++ return(0); ++ ++ list_for_each(ele, &physmem_remappers){ ++ remapper = list_entry(ele, struct remapper, list); ++ if((*remapper->proc)(fd, address, is_write, offset)) ++ return(1); ++ } ++ ++ return(0); ++} ++ + unsigned long segv(unsigned long address, unsigned long ip, int is_write, + int is_user, void *sc) + { +@@ -109,7 +145,9 @@ + flush_tlb_kernel_vm(); + return(0); + } +- if(current->mm == NULL) ++ else if(check_remapped_addr(address & PAGE_MASK, is_write)) ++ return(0); ++ else if(current->mm == NULL) + panic("Segfault with no mm"); + err = handle_page_fault(address, ip, is_write, is_user, &si.si_code); + +@@ -120,9 +158,8 @@ + current->thread.fault_addr = (void *) address; + do_longjmp(catcher, 1); + } +- else if(current->thread.fault_addr != NULL){ ++ else if(current->thread.fault_addr != NULL) + panic("fault_addr set but no fault catcher"); +- } + else if(arch_fixup(ip, sc)) + return(0); + +@@ -155,8 +192,6 @@ + { + struct siginfo si; + +- printk(KERN_ERR "Unfixable SEGV in '%s' (pid %d) at 0x%lx " +- "(ip 0x%lx)\n", current->comm, current->pid, address, ip); + si.si_signo = SIGSEGV; + si.si_code = SEGV_ACCERR; + si.si_addr = (void *) address; +@@ -180,6 +215,11 @@ + else relay_signal(sig, regs); + } + ++void winch(int sig, union uml_pt_regs *regs) ++{ ++ do_IRQ(WINCH_IRQ, regs); ++} ++ + void trap_init(void) + { + } +Index: uml-2.6.7/arch/um/drivers/cow_sys.h +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/cow_sys.h 2004-07-16 19:47:23.608222216 +0300 ++++ uml-2.6.7/arch/um/drivers/cow_sys.h 2004-07-16 19:47:23.679211424 +0300 +@@ -0,0 +1,48 @@ ++#ifndef __COW_SYS_H__ ++#define __COW_SYS_H__ ++ ++#include "kern_util.h" ++#include "user_util.h" ++#include "os.h" ++#include "user.h" ++ ++static inline void *cow_malloc(int size) ++{ ++ return(um_kmalloc(size)); ++} ++ ++static inline void cow_free(void *ptr) ++{ ++ kfree(ptr); ++} ++ ++#define cow_printf printk ++ ++static inline char *cow_strdup(char *str) ++{ ++ return(uml_strdup(str)); ++} ++ ++static inline int cow_seek_file(int fd, __u64 offset) ++{ ++ return(os_seek_file(fd, offset)); ++} ++ ++static inline int cow_file_size(char *file, __u64 *size_out) ++{ ++ return(os_file_size(file, size_out)); ++} ++ ++static inline int cow_write_file(int fd, char *buf, int size) ++{ ++ return(os_write_file(fd, buf, size)); ++} ++ ++#endif ++ ++/* ++ * --------------------------------------------------------------------------- ++ * Local variables: ++ * c-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/drivers/harddog_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/harddog_user.c 2004-07-16 19:36:22.284758664 +0300 ++++ uml-2.6.7/arch/um/drivers/harddog_user.c 2004-07-16 19:47:23.682210968 +0300 +@@ -27,10 +27,10 @@ + dup2(data->stdin, 0); + dup2(data->stdout, 1); + dup2(data->stdout, 2); +- close(data->stdin); +- close(data->stdout); +- close(data->close_me[0]); +- close(data->close_me[1]); ++ os_close_file(data->stdin); ++ os_close_file(data->stdout); ++ os_close_file(data->close_me[0]); ++ os_close_file(data->close_me[1]); + } + + int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock) +@@ -44,15 +44,15 @@ + char **args = NULL; + + err = os_pipe(in_fds, 1, 0); +- if(err){ +- printk("harddog_open - os_pipe failed, errno = %d\n", -err); +- return(err); ++ if(err < 0){ ++ printk("harddog_open - os_pipe failed, err = %d\n", -err); ++ goto out; + } + + err = os_pipe(out_fds, 1, 0); +- if(err){ +- printk("harddog_open - os_pipe failed, errno = %d\n", -err); +- return(err); ++ if(err < 0){ ++ printk("harddog_open - os_pipe failed, err = %d\n", -err); ++ goto out_close_in; + } + + data.stdin = out_fds[0]; +@@ -72,42 +72,47 @@ + + pid = run_helper(pre_exec, &data, args, NULL); + +- close(out_fds[0]); +- close(in_fds[1]); ++ os_close_file(out_fds[0]); ++ os_close_file(in_fds[1]); + + if(pid < 0){ + err = -pid; +- printk("harddog_open - run_helper failed, errno = %d\n", err); +- goto out; ++ printk("harddog_open - run_helper failed, errno = %d\n", -err); ++ goto out_close_out; + } + +- n = read(in_fds[0], &c, sizeof(c)); ++ n = os_read_file(in_fds[0], &c, sizeof(c)); + if(n == 0){ + printk("harddog_open - EOF on watchdog pipe\n"); + helper_wait(pid); + err = -EIO; +- goto out; ++ goto out_close_out; + } + else if(n < 0){ + printk("harddog_open - read of watchdog pipe failed, " +- "errno = %d\n", errno); ++ "err = %d\n", -n); + helper_wait(pid); +- err = -errno; +- goto out; ++ err = n; ++ goto out_close_out; + } + *in_fd_ret = in_fds[0]; + *out_fd_ret = out_fds[1]; + return(0); ++ ++ out_close_in: ++ os_close_file(in_fds[0]); ++ os_close_file(in_fds[1]); ++ out_close_out: ++ os_close_file(out_fds[0]); ++ os_close_file(out_fds[1]); + out: +- close(out_fds[1]); +- close(in_fds[0]); + return(err); + } + + void stop_watchdog(int in_fd, int out_fd) + { +- close(in_fd); +- close(out_fd); ++ os_close_file(in_fd); ++ os_close_file(out_fd); + } + + int ping_watchdog(int fd) +@@ -115,11 +120,12 @@ + int n; + char c = '\n'; + +- n = write(fd, &c, sizeof(c)); +- if(n < sizeof(c)){ +- printk("ping_watchdog - write failed, errno = %d\n", +- errno); +- return(-errno); ++ n = os_write_file(fd, &c, sizeof(c)); ++ if(n != sizeof(c)){ ++ printk("ping_watchdog - write failed, err = %d\n", -n); ++ if(n < 0) ++ return(n); ++ return(-EIO); + } + return 1; + +Index: uml-2.6.7/fs/hostfs/hostfs_user.c +=================================================================== +--- uml-2.6.7.orig/fs/hostfs/hostfs_user.c 2004-07-16 19:47:23.631218720 +0300 ++++ uml-2.6.7/fs/hostfs/hostfs_user.c 2004-07-16 19:47:23.783195616 +0300 +@@ -0,0 +1,361 @@ ++/* ++ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) ++ * Licensed under the GPL ++ */ ++ ++#include <unistd.h> ++#include <stdio.h> ++#include <fcntl.h> ++#include <dirent.h> ++#include <errno.h> ++#include <utime.h> ++#include <string.h> ++#include <sys/stat.h> ++#include <sys/time.h> ++#include <sys/vfs.h> ++#include "hostfs.h" ++#include "kern_util.h" ++#include "user.h" ++ ++int stat_file(const char *path, unsigned long long *inode_out, int *mode_out, ++ int *nlink_out, int *uid_out, int *gid_out, ++ unsigned long long *size_out, struct timespec *atime_out, ++ struct timespec *mtime_out, struct timespec *ctime_out, ++ int *blksize_out, unsigned long long *blocks_out) ++{ ++ struct stat64 buf; ++ ++ if(lstat64(path, &buf) < 0) ++ return(-errno); ++ ++ /* See the Makefile for why STAT64_INO_FIELD is passed in ++ * by the build ++ */ ++ if(inode_out != NULL) *inode_out = buf.STAT64_INO_FIELD; ++ if(mode_out != NULL) *mode_out = buf.st_mode; ++ if(nlink_out != NULL) *nlink_out = buf.st_nlink; ++ if(uid_out != NULL) *uid_out = buf.st_uid; ++ if(gid_out != NULL) *gid_out = buf.st_gid; ++ if(size_out != NULL) *size_out = buf.st_size; ++ if(atime_out != NULL) { ++ atime_out->tv_sec = buf.st_atime; ++ atime_out->tv_nsec = 0; ++ } ++ if(mtime_out != NULL) { ++ mtime_out->tv_sec = buf.st_mtime; ++ mtime_out->tv_nsec = 0; ++ } ++ if(ctime_out != NULL) { ++ ctime_out->tv_sec = buf.st_ctime; ++ ctime_out->tv_nsec = 0; ++ } ++ if(blksize_out != NULL) *blksize_out = buf.st_blksize; ++ if(blocks_out != NULL) *blocks_out = buf.st_blocks; ++ return(0); ++} ++ ++int file_type(const char *path, int *rdev) ++{ ++ struct stat64 buf; ++ ++ if(lstat64(path, &buf) < 0) ++ return(-errno); ++ if(rdev != NULL) ++ *rdev = buf.st_rdev; ++ ++ if(S_ISDIR(buf.st_mode)) return(OS_TYPE_DIR); ++ else if(S_ISLNK(buf.st_mode)) return(OS_TYPE_SYMLINK); ++ else if(S_ISCHR(buf.st_mode)) return(OS_TYPE_CHARDEV); ++ else if(S_ISBLK(buf.st_mode)) return(OS_TYPE_BLOCKDEV); ++ else if(S_ISFIFO(buf.st_mode))return(OS_TYPE_FIFO); ++ else if(S_ISSOCK(buf.st_mode))return(OS_TYPE_SOCK); ++ else return(OS_TYPE_FILE); ++} ++ ++int access_file(char *path, int r, int w, int x) ++{ ++ int mode = 0; ++ ++ if(r) mode = R_OK; ++ if(w) mode |= W_OK; ++ if(x) mode |= X_OK; ++ if(access(path, mode) != 0) return(-errno); ++ else return(0); ++} ++ ++int open_file(char *path, int r, int w, int append) ++{ ++ int mode = 0, fd; ++ ++ if(r && !w) ++ mode = O_RDONLY; ++ else if(!r && w) ++ mode = O_WRONLY; ++ else if(r && w) ++ mode = O_RDWR; ++ else panic("Impossible mode in open_file"); ++ ++ if(append) ++ mode |= O_APPEND; ++ fd = open64(path, mode); ++ if(fd < 0) return(-errno); ++ else return(fd); ++} ++ ++void *open_dir(char *path, int *err_out) ++{ ++ DIR *dir; ++ ++ dir = opendir(path); ++ *err_out = errno; ++ if(dir == NULL) return(NULL); ++ return(dir); ++} ++ ++char *read_dir(void *stream, unsigned long long *pos, ++ unsigned long long *ino_out, int *len_out) ++{ ++ DIR *dir = stream; ++ struct dirent *ent; ++ ++ seekdir(dir, *pos); ++ ent = readdir(dir); ++ if(ent == NULL) return(NULL); ++ *len_out = strlen(ent->d_name); ++ *ino_out = ent->d_ino; ++ *pos = telldir(dir); ++ return(ent->d_name); ++} ++ ++int read_file(int fd, unsigned long long *offset, char *buf, int len) ++{ ++ int n; ++ ++ n = pread64(fd, buf, len, *offset); ++ if(n < 0) return(-errno); ++ *offset += n; ++ return(n); ++} ++ ++int write_file(int fd, unsigned long long *offset, const char *buf, int len) ++{ ++ int n; ++ ++ n = pwrite64(fd, buf, len, *offset); ++ if(n < 0) return(-errno); ++ *offset += n; ++ return(n); ++} ++ ++int lseek_file(int fd, long long offset, int whence) ++{ ++ int ret; ++ ++ ret = lseek64(fd, offset, whence); ++ if(ret < 0) return(-errno); ++ return(0); ++} ++ ++void close_file(void *stream) ++{ ++ close(*((int *) stream)); ++} ++ ++void close_dir(void *stream) ++{ ++ closedir(stream); ++} ++ ++int file_create(char *name, int ur, int uw, int ux, int gr, ++ int gw, int gx, int or, int ow, int ox) ++{ ++ int mode, fd; ++ ++ mode = 0; ++ mode |= ur ? S_IRUSR : 0; ++ mode |= uw ? S_IWUSR : 0; ++ mode |= ux ? S_IXUSR : 0; ++ mode |= gr ? S_IRGRP : 0; ++ mode |= gw ? S_IWGRP : 0; ++ mode |= gx ? S_IXGRP : 0; ++ mode |= or ? S_IROTH : 0; ++ mode |= ow ? S_IWOTH : 0; ++ mode |= ox ? S_IXOTH : 0; ++ fd = open64(name, O_CREAT | O_RDWR, mode); ++ if(fd < 0) ++ return(-errno); ++ return(fd); ++} ++ ++int set_attr(const char *file, struct hostfs_iattr *attrs) ++{ ++ struct utimbuf buf; ++ int err, ma; ++ ++ if(attrs->ia_valid & HOSTFS_ATTR_MODE){ ++ if(chmod(file, attrs->ia_mode) != 0) return(-errno); ++ } ++ if(attrs->ia_valid & HOSTFS_ATTR_UID){ ++ if(chown(file, attrs->ia_uid, -1)) return(-errno); ++ } ++ if(attrs->ia_valid & HOSTFS_ATTR_GID){ ++ if(chown(file, -1, attrs->ia_gid)) return(-errno); ++ } ++ if(attrs->ia_valid & HOSTFS_ATTR_SIZE){ ++ if(truncate(file, attrs->ia_size)) return(-errno); ++ } ++ ma = HOSTFS_ATTR_ATIME_SET | HOSTFS_ATTR_MTIME_SET; ++ if((attrs->ia_valid & ma) == ma){ ++ buf.actime = attrs->ia_atime.tv_sec; ++ buf.modtime = attrs->ia_mtime.tv_sec; ++ if(utime(file, &buf) != 0) return(-errno); ++ } ++ else { ++ struct timespec ts; ++ ++ if(attrs->ia_valid & HOSTFS_ATTR_ATIME_SET){ ++ err = stat_file(file, NULL, NULL, NULL, NULL, NULL, ++ NULL, NULL, &ts, NULL, NULL, NULL); ++ if(err != 0) ++ return(err); ++ buf.actime = attrs->ia_atime.tv_sec; ++ buf.modtime = ts.tv_sec; ++ if(utime(file, &buf) != 0) ++ return(-errno); ++ } ++ if(attrs->ia_valid & HOSTFS_ATTR_MTIME_SET){ ++ err = stat_file(file, NULL, NULL, NULL, NULL, NULL, ++ NULL, &ts, NULL, NULL, NULL, NULL); ++ if(err != 0) ++ return(err); ++ buf.actime = ts.tv_sec; ++ buf.modtime = attrs->ia_mtime.tv_sec; ++ if(utime(file, &buf) != 0) ++ return(-errno); ++ } ++ } ++ if(attrs->ia_valid & HOSTFS_ATTR_CTIME) ; ++ if(attrs->ia_valid & (HOSTFS_ATTR_ATIME | HOSTFS_ATTR_MTIME)){ ++ err = stat_file(file, NULL, NULL, NULL, NULL, NULL, NULL, ++ &attrs->ia_atime, &attrs->ia_mtime, NULL, ++ NULL, NULL); ++ if(err != 0) return(err); ++ } ++ return(0); ++} ++ ++int make_symlink(const char *from, const char *to) ++{ ++ int err; ++ ++ err = symlink(to, from); ++ if(err) return(-errno); ++ return(0); ++} ++ ++int unlink_file(const char *file) ++{ ++ int err; ++ ++ err = unlink(file); ++ if(err) return(-errno); ++ return(0); ++} ++ ++int do_mkdir(const char *file, int mode) ++{ ++ int err; ++ ++ err = mkdir(file, mode); ++ if(err) return(-errno); ++ return(0); ++} ++ ++int do_rmdir(const char *file) ++{ ++ int err; ++ ++ err = rmdir(file); ++ if(err) return(-errno); ++ return(0); ++} ++ ++int do_mknod(const char *file, int mode, int dev) ++{ ++ int err; ++ ++ err = mknod(file, mode, dev); ++ if(err) return(-errno); ++ return(0); ++} ++ ++int link_file(const char *to, const char *from) ++{ ++ int err; ++ ++ err = link(to, from); ++ if(err) return(-errno); ++ return(0); ++} ++ ++int do_readlink(char *file, char *buf, int size) ++{ ++ int n; ++ ++ n = readlink(file, buf, size); ++ if(n < 0) ++ return(-errno); ++ if(n < size) ++ buf[n] = '\0'; ++ return(n); ++} ++ ++int rename_file(char *from, char *to) ++{ ++ int err; ++ ++ err = rename(from, to); ++ if(err < 0) return(-errno); ++ return(0); ++} ++ ++int do_statfs(char *root, long *bsize_out, long long *blocks_out, ++ long long *bfree_out, long long *bavail_out, ++ long long *files_out, long long *ffree_out, ++ void *fsid_out, int fsid_size, long *namelen_out, ++ long *spare_out) ++{ ++ struct statfs64 buf; ++ int err; ++ ++ err = statfs64(root, &buf); ++ if(err < 0) return(-errno); ++ *bsize_out = buf.f_bsize; ++ *blocks_out = buf.f_blocks; ++ *bfree_out = buf.f_bfree; ++ *bavail_out = buf.f_bavail; ++ *files_out = buf.f_files; ++ *ffree_out = buf.f_ffree; ++ memcpy(fsid_out, &buf.f_fsid, ++ sizeof(buf.f_fsid) > fsid_size ? fsid_size : ++ sizeof(buf.f_fsid)); ++ *namelen_out = buf.f_namelen; ++ spare_out[0] = buf.f_spare[0]; ++ spare_out[1] = buf.f_spare[1]; ++ spare_out[2] = buf.f_spare[2]; ++ spare_out[3] = buf.f_spare[3]; ++ spare_out[4] = buf.f_spare[4]; ++ spare_out[5] = buf.f_spare[5]; ++ return(0); ++} ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/kernel/skas/mem_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/mem_user.c 2004-07-16 19:36:25.158321816 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/mem_user.c 2004-07-16 19:47:23.729203824 +0300 +@@ -7,6 +7,7 @@ + #include <sys/mman.h> + #include <sys/ptrace.h> + #include "mem_user.h" ++#include "mem.h" + #include "user.h" + #include "os.h" + #include "proc_mm.h" +@@ -15,12 +16,12 @@ + int r, int w, int x) + { + struct proc_mm_op map; +- struct mem_region *region; +- int prot, n; ++ __u64 offset; ++ int prot, n, phys_fd; + + prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | + (x ? PROT_EXEC : 0); +- region = phys_region(phys); ++ phys_fd = phys_mapping(phys, &offset); + + map = ((struct proc_mm_op) { .op = MM_MMAP, + .u = +@@ -30,12 +31,12 @@ + .prot = prot, + .flags = MAP_SHARED | + MAP_FIXED, +- .fd = region->fd, +- .offset = phys_offset(phys) ++ .fd = phys_fd, ++ .offset = offset + } } } ); + n = os_write_file(fd, &map, sizeof(map)); + if(n != sizeof(map)) +- printk("map : /proc/mm map failed, errno = %d\n", errno); ++ printk("map : /proc/mm map failed, err = %d\n", -n); + } + + int unmap(int fd, void *addr, int len) +@@ -49,8 +50,13 @@ + { .addr = (unsigned long) addr, + .len = len } } } ); + n = os_write_file(fd, &unmap, sizeof(unmap)); +- if((n != 0) && (n != sizeof(unmap))) +- return(-errno); ++ if(n != sizeof(unmap)) { ++ if(n < 0) ++ return(n); ++ else if(n > 0) ++ return(-EIO); ++ } ++ + return(0); + } + +@@ -71,11 +77,15 @@ + .prot = prot } } } ); + + n = os_write_file(fd, &protect, sizeof(protect)); +- if((n != 0) && (n != sizeof(protect))){ ++ if(n != sizeof(protect)) { ++ if(n == 0) return(0); ++ + if(must_succeed) +- panic("protect failed, errno = %d", errno); +- return(-errno); ++ panic("protect failed, err = %d", -n); ++ ++ return(-EIO); + } ++ + return(0); + } + +Index: uml-2.6.7/arch/um/kernel/skas/include/ptrace-skas.h +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/include/ptrace-skas.h 2004-07-16 19:36:04.873405592 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/include/ptrace-skas.h 2004-07-16 19:47:24.724052584 +0300 +@@ -10,6 +10,15 @@ + + #ifdef UML_CONFIG_MODE_SKAS + ++/* syscall emulation path in ptrace */ ++ ++#ifndef PTRACE_SYSEMU ++#define PTRACE_SYSEMU 31 ++#endif ++ ++void set_using_sysemu(int value); ++int get_using_sysemu(void); ++ + #include "skas_ptregs.h" + + #define HOST_FRAME_SIZE 17 +Index: uml-2.6.7/include/asm-um/archparam-i386.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/archparam-i386.h 2004-07-16 19:37:19.977987960 +0300 ++++ uml-2.6.7/include/asm-um/archparam-i386.h 2004-07-16 19:47:23.787195008 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -56,6 +56,93 @@ + pr_reg[16] = PT_REGS_SS(regs); \ + } while(0); + ++#if 0 /* Turn this back on when UML has VSYSCALL working */ ++#define VSYSCALL_BASE (__fix_to_virt(FIX_VSYSCALL)) ++#else ++#define VSYSCALL_BASE 0 ++#endif ++ ++#define VSYSCALL_EHDR ((const struct elfhdr *) VSYSCALL_BASE) ++#define VSYSCALL_ENTRY ((unsigned long) &__kernel_vsyscall) ++extern void *__kernel_vsyscall; ++ ++/* ++ * Architecture-neutral AT_ values in 0-17, leave some room ++ * for more of them, start the x86-specific ones at 32. ++ */ ++#define AT_SYSINFO 32 ++#define AT_SYSINFO_EHDR 33 ++ ++#define ARCH_DLINFO \ ++do { \ ++ NEW_AUX_ENT(AT_SYSINFO, VSYSCALL_ENTRY); \ ++ NEW_AUX_ENT(AT_SYSINFO_EHDR, VSYSCALL_BASE); \ ++} while (0) ++ ++/* ++ * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out ++ * extra segments containing the vsyscall DSO contents. Dumping its ++ * contents makes post-mortem fully interpretable later without matching up ++ * the same kernel and hardware config to see what PC values meant. ++ * Dumping its extra ELF program headers includes all the other information ++ * a debugger needs to easily find how the vsyscall DSO was being used. ++ */ ++#if 0 ++#define ELF_CORE_EXTRA_PHDRS (VSYSCALL_EHDR->e_phnum) ++#endif ++ ++#undef ELF_CORE_EXTRA_PHDRS ++ ++#if 0 ++#define ELF_CORE_WRITE_EXTRA_PHDRS \ ++do { \ ++ const struct elf_phdr *const vsyscall_phdrs = \ ++ (const struct elf_phdr *) (VSYSCALL_BASE \ ++ + VSYSCALL_EHDR->e_phoff); \ ++ int i; \ ++ Elf32_Off ofs = 0; \ ++ for (i = 0; i < VSYSCALL_EHDR->e_phnum; ++i) { \ ++ struct elf_phdr phdr = vsyscall_phdrs[i]; \ ++ if (phdr.p_type == PT_LOAD) { \ ++ ofs = phdr.p_offset = offset; \ ++ offset += phdr.p_filesz; \ ++ } \ ++ else \ ++ phdr.p_offset += ofs; \ ++ phdr.p_paddr = 0; /* match other core phdrs */ \ ++ DUMP_WRITE(&phdr, sizeof(phdr)); \ ++ } \ ++} while (0) ++#define ELF_CORE_WRITE_EXTRA_DATA \ ++do { \ ++ const struct elf_phdr *const vsyscall_phdrs = \ ++ (const struct elf_phdr *) (VSYSCALL_BASE \ ++ + VSYSCALL_EHDR->e_phoff); \ ++ int i; \ ++ for (i = 0; i < VSYSCALL_EHDR->e_phnum; ++i) { \ ++ if (vsyscall_phdrs[i].p_type == PT_LOAD) \ ++ DUMP_WRITE((void *) vsyscall_phdrs[i].p_vaddr, \ ++ vsyscall_phdrs[i].p_filesz); \ ++ } \ ++} while (0) ++#endif ++ ++#undef ELF_CORE_WRITE_EXTRA_PHDRS ++#undef ELF_CORE_WRITE_EXTRA_DATA ++ ++#define R_386_NONE 0 ++#define R_386_32 1 ++#define R_386_PC32 2 ++#define R_386_GOT32 3 ++#define R_386_PLT32 4 ++#define R_386_COPY 5 ++#define R_386_GLOB_DAT 6 ++#define R_386_JMP_SLOT 7 ++#define R_386_RELATIVE 8 ++#define R_386_GOTOFF 9 ++#define R_386_GOTPC 10 ++#define R_386_NUM 11 ++ + /********* Bits for asm-um/delay.h **********/ + + typedef unsigned long um_udelay_t; +Index: uml-2.6.7/arch/um/kernel/skas/process_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/process_kern.c 2004-07-16 19:37:52.070109216 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/process_kern.c 2004-07-16 19:47:24.725052432 +0300 +@@ -6,6 +6,12 @@ + #include "linux/sched.h" + #include "linux/slab.h" + #include "linux/ptrace.h" ++#include "linux/proc_fs.h" ++#include "linux/file.h" ++#include "linux/errno.h" ++#include "linux/init.h" ++#include "asm/uaccess.h" ++#include "asm/atomic.h" + #include "kern_util.h" + #include "time_user.h" + #include "signal_user.h" +@@ -17,6 +23,59 @@ + #include "kern.h" + #include "mode.h" + ++#ifdef PTRACE_SYSEMU ++static atomic_t using_sysemu; ++#endif ++ ++void set_using_sysemu(int value) ++{ ++ atomic_set(&using_sysemu, value); ++} ++ ++int get_using_sysemu(void) ++{ ++ return atomic_read(&using_sysemu); ++} ++ ++int proc_read_sysemu(char *buf, char **start, off_t offset, int size,int *eof, void *data) ++{ ++ if (snprintf(buf, size, "%d\n", get_using_sysemu()) < size) /*No overflow*/ ++ *eof = 1; ++ ++ return strlen(buf); ++} ++ ++int proc_write_sysemu(struct file *file,const char *buf, unsigned long count,void *data) ++{ ++ char tmp[2]; ++ ++ if (copy_from_user(tmp, buf, 1)) ++ return -EFAULT; ++ ++ if (tmp[0] == '0' || tmp[0] == '1') ++ set_using_sysemu(tmp[0] - '0'); ++ return count; /*We use the first char, but pretend to write everything*/ ++} ++ ++int __init make_proc_sysemu(void) ++{ ++ struct proc_dir_entry *ent; ++ ++ ent = create_proc_entry("sysemu", 00600, &proc_root); ++ ent->read_proc = proc_read_sysemu; ++ ent->write_proc = proc_write_sysemu; ++ ++ if (ent == NULL) ++ { ++ printk("Failed to register /proc/sysemu\n"); ++ return(0); ++ } ++ ++ return 0; ++} ++ ++late_initcall(make_proc_sysemu); ++ + int singlestepping_skas(void) + { + int ret = current->ptrace & PT_DTRACE; +@@ -61,11 +120,13 @@ + thread_wait(¤t->thread.mode.skas.switch_buf, + current->thread.mode.skas.fork_buf); + +-#ifdef CONFIG_SMP +- schedule_tail(NULL); +-#endif ++ if(current->thread.prev_sched != NULL) ++ schedule_tail(current->thread.prev_sched); + current->thread.prev_sched = NULL; + ++ /* The return value is 1 if the kernel thread execs a process, ++ * 0 if it just exits ++ */ + n = run_kernel_thread(fn, arg, ¤t->thread.exec_buf); + if(n == 1) + userspace(¤t->thread.regs.regs); +@@ -93,11 +154,11 @@ + current->thread.mode.skas.fork_buf); + + force_flush_all(); +-#ifdef CONFIG_SMP ++ if(current->thread.prev_sched == NULL) ++ panic("blech"); ++ + schedule_tail(current->thread.prev_sched); +-#endif + current->thread.prev_sched = NULL; +- unblock_signals(); + + userspace(¤t->thread.regs.regs); + } +@@ -136,7 +197,7 @@ + + void init_idle_skas(void) + { +- cpu_tasks[current->thread_info->cpu].pid = os_getpid(); ++ cpu_tasks[current_thread->cpu].pid = os_getpid(); + default_idle(); + } + +@@ -160,11 +221,11 @@ + + int start_uml_skas(void) + { +- start_userspace(); ++ start_userspace(0); + capture_signal_stack(); ++ uml_idle_timer(); + + init_new_thread_signals(1); +- idle_timer(); + + init_task.thread.request.u.thread.proc = start_kernel_proc; + init_task.thread.request.u.thread.arg = NULL; +@@ -175,12 +236,14 @@ + + int external_pid_skas(struct task_struct *task) + { +- return(userspace_pid); ++#warning Need to look up userspace_pid by cpu ++ return(userspace_pid[0]); + } + + int thread_pid_skas(struct task_struct *task) + { +- return(userspace_pid); ++#warning Need to look up userspace_pid by cpu ++ return(userspace_pid[0]); + } + + /* +Index: uml-2.6.7/arch/um/kernel/helper.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/helper.c 2004-07-16 19:36:40.052057624 +0300 ++++ uml-2.6.7/arch/um/kernel/helper.c 2004-07-16 19:47:24.798041336 +0300 +@@ -7,12 +7,12 @@ + #include <stdlib.h> + #include <unistd.h> + #include <errno.h> +-#include <fcntl.h> + #include <sched.h> + #include <sys/signal.h> + #include <sys/wait.h> + #include "user.h" + #include "kern_util.h" ++#include "user_util.h" + #include "os.h" + + struct helper_data { +@@ -33,6 +33,7 @@ + { + struct helper_data *data = arg; + char **argv = data->argv; ++ int errval; + + if(helper_pause){ + signal(SIGHUP, helper_hup); +@@ -41,8 +42,9 @@ + if(data->pre_exec != NULL) + (*data->pre_exec)(data->pre_data); + execvp(argv[0], argv); ++ errval = errno; + printk("execvp of '%s' failed - errno = %d\n", argv[0], errno); +- write(data->fd, &errno, sizeof(errno)); ++ os_write_file(data->fd, &errval, sizeof(errval)); + os_kill_process(os_getpid(), 0); + return(0); + } +@@ -59,17 +61,20 @@ + if((stack_out != NULL) && (*stack_out != 0)) + stack = *stack_out; + else stack = alloc_stack(0, um_in_interrupt()); +- if(stack == 0) return(-ENOMEM); ++ if(stack == 0) ++ return(-ENOMEM); + + err = os_pipe(fds, 1, 0); +- if(err){ +- printk("run_helper : pipe failed, errno = %d\n", -err); +- return(err); ++ if(err < 0){ ++ printk("run_helper : pipe failed, err = %d\n", -err); ++ goto out_free; + } +- if(fcntl(fds[1], F_SETFD, 1) != 0){ +- printk("run_helper : setting FD_CLOEXEC failed, errno = %d\n", +- errno); +- return(-errno); ++ ++ err = os_set_exec_close(fds[1], 1); ++ if(err < 0){ ++ printk("run_helper : setting FD_CLOEXEC failed, err = %d\n", ++ -err); ++ goto out_close; + } + + sp = stack + page_size() - sizeof(void *); +@@ -80,23 +85,34 @@ + pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data); + if(pid < 0){ + printk("run_helper : clone failed, errno = %d\n", errno); +- return(-errno); ++ err = -errno; ++ goto out_close; + } +- close(fds[1]); +- n = read(fds[0], &err, sizeof(err)); ++ ++ os_close_file(fds[1]); ++ n = os_read_file(fds[0], &err, sizeof(err)); + if(n < 0){ +- printk("run_helper : read on pipe failed, errno = %d\n", +- errno); +- return(-errno); ++ printk("run_helper : read on pipe failed, err = %d\n", -n); ++ err = n; ++ goto out_kill; + } + else if(n != 0){ +- waitpid(pid, NULL, 0); +- pid = -err; ++ CATCH_EINTR(n = waitpid(pid, NULL, 0)); ++ pid = -errno; + } + + if(stack_out == NULL) free_stack(stack, 0); + else *stack_out = stack; + return(pid); ++ ++ out_kill: ++ os_kill_process(pid, 1); ++ out_close: ++ os_close_file(fds[0]); ++ os_close_file(fds[1]); ++ out_free: ++ free_stack(stack, 0); ++ return(err); + } + + int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags, +@@ -117,9 +133,11 @@ + } + if(stack_out == NULL){ + pid = waitpid(pid, &status, 0); +- if(pid < 0) ++ if(pid < 0){ + printk("run_helper_thread - wait failed, errno = %d\n", +- pid); ++ errno); ++ pid = -errno; ++ } + if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) + printk("run_helper_thread - thread returned status " + "0x%x\n", status); +Index: uml-2.6.7/arch/um/drivers/fd.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/fd.c 2004-07-16 19:37:38.077236456 +0300 ++++ uml-2.6.7/arch/um/drivers/fd.c 2004-07-16 19:47:23.681211120 +0300 +@@ -35,7 +35,8 @@ + printk("fd_init : couldn't parse file descriptor '%s'\n", str); + return(NULL); + } +- if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL); ++ data = um_kmalloc(sizeof(*data)); ++ if(data == NULL) return(NULL); + *data = ((struct fd_chan) { .fd = n, + .raw = opts->raw }); + return(data); +Index: uml-2.6.7/arch/um/include/kern_util.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/kern_util.h 2004-07-16 19:36:25.260306312 +0300 ++++ uml-2.6.7/arch/um/include/kern_util.h 2004-07-16 19:47:23.702207928 +0300 +@@ -60,12 +60,11 @@ + extern void paging_init(void); + extern void init_flush_vm(void); + extern void *syscall_sp(void *t); +-extern void syscall_trace(void); ++extern void syscall_trace(union uml_pt_regs *regs, int entryexit); + extern int hz(void); +-extern void idle_timer(void); ++extern void uml_idle_timer(void); + extern unsigned int do_IRQ(int irq, union uml_pt_regs *regs); + extern int external_pid(void *t); +-extern int pid_to_processor_id(int pid); + extern void boot_timer_handler(int sig); + extern void interrupt_end(void); + extern void initial_thread_cb(void (*proc)(void *), void *arg); +@@ -89,9 +88,7 @@ + extern char *uml_strdup(char *string); + extern void unprotect_kernel_mem(void); + extern void protect_kernel_mem(void); +-extern void set_kmem_end(unsigned long); + extern void uml_cleanup(void); +-extern int pid_to_processor_id(int pid); + extern void set_current(void *t); + extern void lock_signalled_task(void *t); + extern void IPI_handler(int cpu); +@@ -100,7 +97,9 @@ + extern int clear_user_proc(void *buf, int size); + extern int copy_to_user_proc(void *to, void *from, int size); + extern int copy_from_user_proc(void *to, void *from, int size); ++extern int strlen_user_proc(char *str); + extern void bus_handler(int sig, union uml_pt_regs *regs); ++extern void winch(int sig, union uml_pt_regs *regs); + extern long execute_syscall(void *r); + extern int smp_sigio_handler(void); + extern void *get_current(void); +@@ -111,6 +110,8 @@ + extern void free_irq(unsigned int, void *); + extern int um_in_interrupt(void); + extern int cpu(void); ++extern unsigned long long time_stamp(void); ++ + #endif + + /* +Index: uml-2.6.7/include/asm-um/sections.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/sections.h 2004-07-16 19:47:23.634218264 +0300 ++++ uml-2.6.7/include/asm-um/sections.h 2004-07-16 19:47:23.795193792 +0300 +@@ -0,0 +1,7 @@ ++#ifndef _UM_SECTIONS_H ++#define _UM_SECTIONS_H ++ ++/* nothing to see, move along */ ++#include <asm-generic/sections.h> ++ ++#endif +Index: uml-2.6.7/include/asm-um/pgtable.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/pgtable.h 2004-07-16 19:37:51.945128216 +0300 ++++ uml-2.6.7/include/asm-um/pgtable.h 2004-07-16 19:47:23.793194096 +0300 +@@ -12,8 +12,6 @@ + #include "asm/page.h" + #include "asm/fixmap.h" + +-extern pgd_t swapper_pg_dir[1024]; +- + extern void *um_virt_to_phys(struct task_struct *task, unsigned long virt, + pte_t *pte_out); + +@@ -49,6 +47,8 @@ + #define pgd_ERROR(e) \ + printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) + ++extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; ++ + /* + * pgd entries used up by user/kernel: + */ +@@ -65,10 +65,10 @@ + * area for the same reason. ;) + */ + +-extern unsigned long high_physmem; ++extern unsigned long end_iomem; + + #define VMALLOC_OFFSET (__va_space) +-#define VMALLOC_START (((unsigned long) high_physmem + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) ++#define VMALLOC_START ((end_iomem + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) + + #ifdef CONFIG_HIGHMEM + # define VMALLOC_END (PKMAP_BASE-2*PAGE_SIZE) +@@ -78,12 +78,13 @@ + + #define _PAGE_PRESENT 0x001 + #define _PAGE_NEWPAGE 0x002 +-#define _PAGE_PROTNONE 0x004 /* If not present */ +-#define _PAGE_RW 0x008 +-#define _PAGE_USER 0x010 +-#define _PAGE_ACCESSED 0x020 +-#define _PAGE_DIRTY 0x040 +-#define _PAGE_NEWPROT 0x080 ++#define _PAGE_NEWPROT 0x004 ++#define _PAGE_FILE 0x008 /* set:pagecache unset:swap */ ++#define _PAGE_PROTNONE 0x010 /* If not present */ ++#define _PAGE_RW 0x020 ++#define _PAGE_USER 0x040 ++#define _PAGE_ACCESSED 0x080 ++#define _PAGE_DIRTY 0x100 + + #define REGION_MASK 0xf0000000 + #define REGION_SHIFT 28 +@@ -143,7 +144,8 @@ + + #define BAD_PAGETABLE __bad_pagetable() + #define BAD_PAGE __bad_page() +-#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) ++ ++#define ZERO_PAGE(vaddr) virt_to_page(empty_zero_page) + + /* number of bits that fit into a memory pointer */ + #define BITS_PER_PTR (8*sizeof(unsigned long)) +@@ -164,9 +166,6 @@ + + #define pte_clear(xp) do { pte_val(*(xp)) = _PAGE_NEWPAGE; } while (0) + +-#define phys_region_index(x) (((x) & REGION_MASK) >> REGION_SHIFT) +-#define pte_region_index(x) phys_region_index(pte_val(x)) +- + #define pmd_none(x) (!(pmd_val(x) & ~_PAGE_NEWPAGE)) + #define pmd_bad(x) ((pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE) + #define pmd_present(x) (pmd_val(x) & _PAGE_PRESENT) +@@ -188,19 +187,25 @@ + + #define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT)) + +-extern struct page *pte_mem_map(pte_t pte); +-extern struct page *phys_mem_map(unsigned long phys); +-extern unsigned long phys_to_pfn(unsigned long p); +-extern unsigned long pfn_to_phys(unsigned long pfn); +- +-#define pte_page(x) pfn_to_page(pte_pfn(x)) +-#define pte_address(x) (__va(pte_val(x) & PAGE_MASK)) +-#define mk_phys(a, r) ((a) + (r << REGION_SHIFT)) +-#define phys_addr(p) ((p) & ~REGION_MASK) +-#define phys_page(p) (phys_mem_map(p) + ((phys_addr(p)) >> PAGE_SHIFT)) ++#define pte_page(pte) phys_to_page(pte_val(pte)) ++#define pmd_page(pmd) phys_to_page(pmd_val(pmd) & PAGE_MASK) ++ + #define pte_pfn(x) phys_to_pfn(pte_val(x)) + #define pfn_pte(pfn, prot) __pte(pfn_to_phys(pfn) | pgprot_val(prot)) +-#define pfn_pmd(pfn, prot) __pmd(pfn_to_phys(pfn) | pgprot_val(prot)) ++ ++extern struct page *phys_to_page(const unsigned long phys); ++extern struct page *__virt_to_page(const unsigned long virt); ++#define virt_to_page(addr) __virt_to_page((const unsigned long) addr) ++ ++/* ++ * Bits 0 through 3 are taken ++ */ ++#define PTE_FILE_MAX_BITS 28 ++ ++#define pte_to_pgoff(pte) ((pte).pte_low >> 4) ++ ++#define pgoff_to_pte(off) \ ++ ((pte_t) { ((off) << 4) + _PAGE_FILE }) + + static inline pte_t pte_mknewprot(pte_t pte) + { +@@ -235,6 +240,12 @@ + * The following only work if pte_present() is true. + * Undefined behaviour if not.. + */ ++static inline int pte_user(pte_t pte) ++{ ++ return((pte_val(pte) & _PAGE_USER) && ++ !(pte_val(pte) & _PAGE_PROTNONE)); ++} ++ + static inline int pte_read(pte_t pte) + { + return((pte_val(pte) & _PAGE_USER) && +@@ -252,6 +263,14 @@ + !(pte_val(pte) & _PAGE_PROTNONE)); + } + ++/* ++ * The following only works if pte_present() is not true. ++ */ ++static inline int pte_file(pte_t pte) ++{ ++ return (pte).pte_low & _PAGE_FILE; ++} ++ + static inline int pte_dirty(pte_t pte) { return pte_val(pte) & _PAGE_DIRTY; } + static inline int pte_young(pte_t pte) { return pte_val(pte) & _PAGE_ACCESSED; } + static inline int pte_newpage(pte_t pte) { return pte_val(pte) & _PAGE_NEWPAGE; } +@@ -334,14 +353,7 @@ + * and a page entry and page directory to the page they refer to. + */ + +-#define mk_pte(page, pgprot) \ +-({ \ +- pte_t __pte; \ +- \ +- pte_val(__pte) = page_to_phys(page) + pgprot_val(pgprot);\ +- if(pte_present(__pte)) pte_mknewprot(pte_mknewpage(__pte)); \ +- __pte; \ +-}) ++extern pte_t mk_pte(struct page *page, pgprot_t pgprot); + + static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) + { +@@ -351,17 +363,27 @@ + } + + #define pmd_page_kernel(pmd) ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) +-#define pmd_page(pmd) (phys_mem_map(pmd_val(pmd) & PAGE_MASK) + \ +- ((phys_addr(pmd_val(pmd)) >> PAGE_SHIFT))) + +-/* to find an entry in a page-table-directory. */ ++/* ++ * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD] ++ * ++ * this macro returns the index of the entry in the pgd page which would ++ * control the given virtual address ++ */ + #define pgd_index(address) ((address >> PGDIR_SHIFT) & (PTRS_PER_PGD-1)) + +-/* to find an entry in a page-table-directory */ ++/* ++ * pgd_offset() returns a (pgd_t *) ++ * pgd_index() is used get the offset into the pgd page's array of pgd_t's; ++ */ + #define pgd_offset(mm, address) \ + ((mm)->pgd + ((address) >> PGDIR_SHIFT)) + +-/* to find an entry in a kernel page-table-directory */ ++ ++/* ++ * a shortcut which implies the use of the kernel's pgd, instead ++ * of a process's ++ */ + #define pgd_offset_k(address) pgd_offset(&init_mm, address) + + #define pmd_index(address) \ +@@ -373,7 +395,12 @@ + return (pmd_t *) dir; + } + +-/* Find an entry in the third-level page table.. */ ++/* ++ * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE] ++ * ++ * this macro returns the index of the entry in the pte page which would ++ * control the given virtual address ++ */ + #define pte_index(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)) + #define pte_offset_kernel(dir, address) \ + ((pte_t *) pmd_page_kernel(*(dir)) + pte_index(address)) +@@ -387,11 +414,11 @@ + #define update_mmu_cache(vma,address,pte) do ; while (0) + + /* Encode and de-code a swap entry */ +-#define __swp_type(x) (((x).val >> 3) & 0x7f) +-#define __swp_offset(x) ((x).val >> 10) ++#define __swp_type(x) (((x).val >> 4) & 0x3f) ++#define __swp_offset(x) ((x).val >> 11) + + #define __swp_entry(type, offset) \ +- ((swp_entry_t) { ((type) << 3) | ((offset) << 10) }) ++ ((swp_entry_t) { ((type) << 4) | ((offset) << 11) }) + #define __pte_to_swp_entry(pte) \ + ((swp_entry_t) { pte_val(pte_mkuptodate(pte)) }) + #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) +Index: uml-2.6.7/arch/um/Kconfig_char +=================================================================== +--- uml-2.6.7.orig/arch/um/Kconfig_char 2004-07-16 19:36:33.679026472 +0300 ++++ uml-2.6.7/arch/um/Kconfig_char 2004-07-16 19:47:24.069152144 +0300 +@@ -108,11 +108,60 @@ + + config UNIX98_PTYS + bool "Unix98 PTY support" +- +-config UNIX98_PTY_COUNT +- int "Maximum number of Unix98 PTYs in use (0-2048)" +- depends on UNIX98_PTYS ++ ---help--- ++ A pseudo terminal (PTY) is a software device consisting of two ++ halves: a master and a slave. The slave device behaves identical to ++ a physical terminal; the master device is used by a process to ++ read data from and write data to the slave, thereby emulating a ++ terminal. Typical programs for the master side are telnet servers ++ and xterms. ++ ++ Linux has traditionally used the BSD-like names /dev/ptyxx for ++ masters and /dev/ttyxx for slaves of pseudo terminals. This scheme ++ has a number of problems. The GNU C library glibc 2.1 and later, ++ however, supports the Unix98 naming standard: in order to acquire a ++ pseudo terminal, a process opens /dev/ptmx; the number of the pseudo ++ terminal is then made available to the process and the pseudo ++ terminal slave can be accessed as /dev/pts/<number>. What was ++ traditionally /dev/ttyp2 will then be /dev/pts/2, for example. ++ ++ All modern Linux systems use the Unix98 ptys. Say Y unless ++ you're on an embedded system and want to conserve memory. ++ ++config LEGACY_PTYS ++ bool "Legacy (BSD) PTY support" ++ default y ++ ---help--- ++ A pseudo terminal (PTY) is a software device consisting of two ++ halves: a master and a slave. The slave device behaves identical to ++ a physical terminal; the master device is used by a process to ++ read data from and write data to the slave, thereby emulating a ++ terminal. Typical programs for the master side are telnet servers ++ and xterms. ++ ++ Linux has traditionally used the BSD-like names /dev/ptyxx ++ for masters and /dev/ttyxx for slaves of pseudo ++ terminals. This scheme has a number of problems, including ++ security. This option enables these legacy devices; on most ++ systems, it is safe to say N. ++ ++ ++config LEGACY_PTY_COUNT ++ int "Maximum number of legacy PTY in use" ++ depends on LEGACY_PTYS + default "256" ++ ---help--- ++ The maximum number of legacy PTYs that can be used at any one time. ++ The default is 256, and should be more than enough. Embedded ++ systems may want to reduce this to save memory. ++ ++ When not in use, each legacy PTY occupies 12 bytes on 32-bit ++ architectures and 24 bytes on 64-bit architectures. ++ ++#config UNIX98_PTY_COUNT ++# int "Maximum number of Unix98 PTYs in use (0-2048)" ++# depends on UNIX98_PTYS ++# default "256" + + config WATCHDOG + bool "Watchdog Timer Support" +Index: uml-2.6.7/arch/um/kernel/user_util.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/user_util.c 2004-07-16 19:36:07.233046872 +0300 ++++ uml-2.6.7/arch/um/kernel/user_util.c 2004-07-16 19:47:24.794041944 +0300 +@@ -5,7 +5,6 @@ + + #include <stdio.h> + #include <stdlib.h> +-#include <fcntl.h> + #include <unistd.h> + #include <limits.h> + #include <sys/mman.h> +@@ -82,10 +81,10 @@ + int status, ret; + + while(1){ +- if(((ret = waitpid(pid, &status, WUNTRACED)) < 0) || ++ CATCH_EINTR(ret = waitpid(pid, &status, WUNTRACED)); ++ if((ret < 0) || + !WIFSTOPPED(status) || (WSTOPSIG(status) != sig)){ + if(ret < 0){ +- if(errno == EINTR) continue; + printk("wait failed, errno = %d\n", + errno); + } +@@ -119,29 +118,36 @@ + } + } + +-int clone_and_wait(int (*fn)(void *), void *arg, void *sp, int flags) +-{ +- int pid; +- +- pid = clone(fn, sp, flags, arg); +- if(pid < 0) return(-1); +- wait_for_stop(pid, SIGSTOP, PTRACE_CONT, NULL); +- ptrace(PTRACE_CONT, pid, 0, 0); +- return(pid); +-} +- +-int raw(int fd, int complain) ++int __raw(int fd, int complain, int now) + { + struct termios tt; + int err; ++ int when; ++ ++ CATCH_EINTR(err = tcgetattr(fd, &tt)); ++ ++ if (err < 0) { ++ if (complain) ++ printk("tcgetattr failed, errno = %d\n", errno); ++ return(-errno); ++ } + +- tcgetattr(fd, &tt); + cfmakeraw(&tt); +- err = tcsetattr(fd, TCSANOW, &tt); +- if((err < 0) && complain){ +- printk("tcsetattr failed, errno = %d\n", errno); ++ ++ if (now) ++ when = TCSANOW; ++ else ++ when = TCSADRAIN; ++ ++ CATCH_EINTR(err = tcsetattr(fd, when, &tt)); ++ ++ if (err < 0) { ++ if (complain) ++ printk("tcsetattr failed, errno = %d\n", errno); + return(-errno); + } ++ /*XXX: tcsetattr could have applied only some changes ++ * (and cfmakeraw() is a set of changes) */ + return(0); + } + +Index: uml-2.6.7/arch/um/kernel/umid.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/umid.c 2004-07-16 19:37:31.857182048 +0300 ++++ uml-2.6.7/arch/um/kernel/umid.c 2004-07-16 19:47:23.756199720 +0300 +@@ -5,7 +5,6 @@ + + #include <stdio.h> + #include <unistd.h> +-#include <fcntl.h> + #include <errno.h> + #include <string.h> + #include <stdlib.h> +@@ -33,18 +32,19 @@ + static int umid_is_random = 1; + static int umid_inited = 0; + +-static int make_umid(void); ++static int make_umid(int (*printer)(const char *fmt, ...)); + +-static int __init set_umid(char *name, int is_random) ++static int __init set_umid(char *name, int is_random, ++ int (*printer)(const char *fmt, ...)) + { + if(umid_inited){ +- printk("Unique machine name can't be set twice\n"); ++ (*printer)("Unique machine name can't be set twice\n"); + return(-1); + } + + if(strlen(name) > UMID_LEN - 1) +- printk("Unique machine name is being truncated to %s " +- "characters\n", UMID_LEN); ++ (*printer)("Unique machine name is being truncated to %s " ++ "characters\n", UMID_LEN); + strlcpy(umid, name, sizeof(umid)); + + umid_is_random = is_random; +@@ -54,7 +54,7 @@ + + static int __init set_umid_arg(char *name, int *add) + { +- return(set_umid(name, 0)); ++ return(set_umid(name, 0, printf)); + } + + __uml_setup("umid=", set_umid_arg, +@@ -67,7 +67,7 @@ + { + int n; + +- if(!umid_inited && make_umid()) return(-1); ++ if(!umid_inited && make_umid(printk)) return(-1); + + n = strlen(uml_dir) + strlen(umid) + strlen(name) + 1; + if(n > len){ +@@ -85,22 +85,23 @@ + { + char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; + char pid[sizeof("nnnnn\0")]; +- int fd; ++ int fd, n; + + if(umid_file_name("pid", file, sizeof(file))) return 0; + + fd = os_open_file(file, of_create(of_excl(of_rdwr(OPENFLAGS()))), + 0644); + if(fd < 0){ +- printk("Open of machine pid file \"%s\" failed - " +- "errno = %d\n", file, -fd); ++ printf("Open of machine pid file \"%s\" failed - " ++ "err = %d\n", file, -fd); + return 0; + } + + sprintf(pid, "%d\n", os_getpid()); +- if(write(fd, pid, strlen(pid)) != strlen(pid)) +- printk("Write of pid file failed - errno = %d\n", errno); +- close(fd); ++ n = os_write_file(fd, pid, strlen(pid)); ++ if(n != strlen(pid)) ++ printf("Write of pid file failed - err = %d\n", -n); ++ os_close_file(fd); + return 0; + } + +@@ -111,7 +112,8 @@ + int len; + char file[256]; + +- if((directory = opendir(dir)) == NULL){ ++ directory = opendir(dir); ++ if(directory == NULL){ + printk("actually_do_remove : couldn't open directory '%s', " + "errno = %d\n", dir, errno); + return(1); +@@ -160,22 +162,24 @@ + { + char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; + char pid[sizeof("nnnnn\0")], *end; +- int dead, fd, p; ++ int dead, fd, p, n; + + sprintf(file, "%s/pid", dir); + dead = 0; +- if((fd = os_open_file(file, of_read(OPENFLAGS()), 0)) < 0){ ++ fd = os_open_file(file, of_read(OPENFLAGS()), 0); ++ if(fd < 0){ + if(fd != -ENOENT){ + printk("not_dead_yet : couldn't open pid file '%s', " +- "errno = %d\n", file, -fd); ++ "err = %d\n", file, -fd); + return(1); + } + dead = 1; + } + if(fd > 0){ +- if(read(fd, pid, sizeof(pid)) < 0){ ++ n = os_read_file(fd, pid, sizeof(pid)); ++ if(n < 0){ + printk("not_dead_yet : couldn't read pid file '%s', " +- "errno = %d\n", file, errno); ++ "err = %d\n", file, -n); + return(1); + } + p = strtoul(pid, &end, 0); +@@ -197,7 +201,7 @@ + if((strlen(name) > 0) && (name[strlen(name) - 1] != '/')){ + uml_dir = malloc(strlen(name) + 1); + if(uml_dir == NULL){ +- printk("Failed to malloc uml_dir - error = %d\n", ++ printf("Failed to malloc uml_dir - error = %d\n", + errno); + uml_dir = name; + return(0); +@@ -217,7 +221,7 @@ + char *home = getenv("HOME"); + + if(home == NULL){ +- printk("make_uml_dir : no value in environment for " ++ printf("make_uml_dir : no value in environment for " + "$HOME\n"); + exit(1); + } +@@ -232,57 +236,59 @@ + dir[len + 1] = '\0'; + } + +- if((uml_dir = malloc(strlen(dir) + 1)) == NULL){ ++ uml_dir = malloc(strlen(dir) + 1); ++ if(uml_dir == NULL){ + printf("make_uml_dir : malloc failed, errno = %d\n", errno); + exit(1); + } + strcpy(uml_dir, dir); + + if((mkdir(uml_dir, 0777) < 0) && (errno != EEXIST)){ +- printk("Failed to mkdir %s - errno = %i\n", uml_dir, errno); ++ printf("Failed to mkdir %s - errno = %i\n", uml_dir, errno); + return(-1); + } + return 0; + } + +-static int __init make_umid(void) ++static int __init make_umid(int (*printer)(const char *fmt, ...)) + { + int fd, err; + char tmp[strlen(uml_dir) + UMID_LEN + 1]; + + strlcpy(tmp, uml_dir, sizeof(tmp)); + +- if(*umid == 0){ ++ if(!umid_inited){ + strcat(tmp, "XXXXXX"); + fd = mkstemp(tmp); + if(fd < 0){ +- printk("make_umid - mkstemp failed, errno = %d\n", +- errno); ++ (*printer)("make_umid - mkstemp failed, errno = %d\n", ++ errno); + return(1); + } + +- close(fd); ++ os_close_file(fd); + /* There's a nice tiny little race between this unlink and + * the mkdir below. It'd be nice if there were a mkstemp + * for directories. + */ + unlink(tmp); +- set_umid(&tmp[strlen(uml_dir)], 1); ++ set_umid(&tmp[strlen(uml_dir)], 1, printer); + } + + sprintf(tmp, "%s%s", uml_dir, umid); + +- if((err = mkdir(tmp, 0777)) < 0){ ++ err = mkdir(tmp, 0777); ++ if(err < 0){ + if(errno == EEXIST){ + if(not_dead_yet(tmp)){ +- printk("umid '%s' is in use\n", umid); ++ (*printer)("umid '%s' is in use\n", umid); + return(-1); + } + err = mkdir(tmp, 0777); + } + } + if(err < 0){ +- printk("Failed to create %s - errno = %d\n", umid, errno); ++ (*printer)("Failed to create %s - errno = %d\n", umid, errno); + return(-1); + } + +@@ -295,7 +301,13 @@ + ); + + __uml_postsetup(make_uml_dir); +-__uml_postsetup(make_umid); ++ ++static int __init make_umid_setup(void) ++{ ++ return(make_umid(printf)); ++} ++ ++__uml_postsetup(make_umid_setup); + __uml_postsetup(create_pid_file); + + /* +Index: uml-2.6.7/include/linux/ghash.h +=================================================================== +--- uml-2.6.7.orig/include/linux/ghash.h 2004-07-16 19:47:23.863183456 +0300 ++++ uml-2.6.7/include/linux/ghash.h 2004-07-16 19:47:23.875181632 +0300 +@@ -0,0 +1,236 @@ ++/* ++ * include/linux/ghash.h -- generic hashing with fuzzy retrieval ++ * ++ * (C) 1997 Thomas Schoebel-Theuer ++ * ++ * The algorithms implemented here seem to be a completely new invention, ++ * and I'll publish the fundamentals in a paper. ++ */ ++ ++#ifndef _GHASH_H ++#define _GHASH_H ++/* HASHSIZE _must_ be a power of two!!! */ ++ ++ ++#define DEF_HASH_FUZZY_STRUCTS(NAME,HASHSIZE,TYPE) \ ++\ ++struct NAME##_table {\ ++ TYPE * hashtable[HASHSIZE];\ ++ TYPE * sorted_list;\ ++ int nr_entries;\ ++};\ ++\ ++struct NAME##_ptrs {\ ++ TYPE * next_hash;\ ++ TYPE * prev_hash;\ ++ TYPE * next_sorted;\ ++ TYPE * prev_sorted;\ ++}; ++ ++#define DEF_HASH_FUZZY(LINKAGE,NAME,HASHSIZE,TYPE,PTRS,KEYTYPE,KEY,KEYCMP,KEYEQ,HASHFN)\ ++\ ++LINKAGE void insert_##NAME##_hash(struct NAME##_table * tbl, TYPE * elem)\ ++{\ ++ int ix = HASHFN(elem->KEY);\ ++ TYPE ** base = &tbl->hashtable[ix];\ ++ TYPE * ptr = *base;\ ++ TYPE * prev = NULL;\ ++\ ++ tbl->nr_entries++;\ ++ while(ptr && KEYCMP(ptr->KEY, elem->KEY)) {\ ++ base = &ptr->PTRS.next_hash;\ ++ prev = ptr;\ ++ ptr = *base;\ ++ }\ ++ elem->PTRS.next_hash = ptr;\ ++ elem->PTRS.prev_hash = prev;\ ++ if(ptr) {\ ++ ptr->PTRS.prev_hash = elem;\ ++ }\ ++ *base = elem;\ ++\ ++ ptr = prev;\ ++ if(!ptr) {\ ++ ptr = tbl->sorted_list;\ ++ prev = NULL;\ ++ } else {\ ++ prev = ptr->PTRS.prev_sorted;\ ++ }\ ++ while(ptr) {\ ++ TYPE * next = ptr->PTRS.next_hash;\ ++ if(next && KEYCMP(next->KEY, elem->KEY)) {\ ++ prev = ptr;\ ++ ptr = next;\ ++ } else if(KEYCMP(ptr->KEY, elem->KEY)) {\ ++ prev = ptr;\ ++ ptr = ptr->PTRS.next_sorted;\ ++ } else\ ++ break;\ ++ }\ ++ elem->PTRS.next_sorted = ptr;\ ++ elem->PTRS.prev_sorted = prev;\ ++ if(ptr) {\ ++ ptr->PTRS.prev_sorted = elem;\ ++ }\ ++ if(prev) {\ ++ prev->PTRS.next_sorted = elem;\ ++ } else {\ ++ tbl->sorted_list = elem;\ ++ }\ ++}\ ++\ ++LINKAGE void remove_##NAME##_hash(struct NAME##_table * tbl, TYPE * elem)\ ++{\ ++ TYPE * next = elem->PTRS.next_hash;\ ++ TYPE * prev = elem->PTRS.prev_hash;\ ++\ ++ tbl->nr_entries--;\ ++ if(next)\ ++ next->PTRS.prev_hash = prev;\ ++ if(prev)\ ++ prev->PTRS.next_hash = next;\ ++ else {\ ++ int ix = HASHFN(elem->KEY);\ ++ tbl->hashtable[ix] = next;\ ++ }\ ++\ ++ next = elem->PTRS.next_sorted;\ ++ prev = elem->PTRS.prev_sorted;\ ++ if(next)\ ++ next->PTRS.prev_sorted = prev;\ ++ if(prev)\ ++ prev->PTRS.next_sorted = next;\ ++ else\ ++ tbl->sorted_list = next;\ ++}\ ++\ ++LINKAGE TYPE * find_##NAME##_hash(struct NAME##_table * tbl, KEYTYPE pos)\ ++{\ ++ int ix = hashfn(pos);\ ++ TYPE * ptr = tbl->hashtable[ix];\ ++ while(ptr && KEYCMP(ptr->KEY, pos))\ ++ ptr = ptr->PTRS.next_hash;\ ++ if(ptr && !KEYEQ(ptr->KEY, pos))\ ++ ptr = NULL;\ ++ return ptr;\ ++}\ ++\ ++LINKAGE TYPE * find_##NAME##_hash_fuzzy(struct NAME##_table * tbl, KEYTYPE pos)\ ++{\ ++ int ix;\ ++ int offset;\ ++ TYPE * ptr;\ ++ TYPE * next;\ ++\ ++ ptr = tbl->sorted_list;\ ++ if(!ptr || KEYCMP(pos, ptr->KEY))\ ++ return NULL;\ ++ ix = HASHFN(pos);\ ++ offset = HASHSIZE;\ ++ do {\ ++ offset >>= 1;\ ++ next = tbl->hashtable[(ix+offset) & ((HASHSIZE)-1)];\ ++ if(next && (KEYCMP(next->KEY, pos) || KEYEQ(next->KEY, pos))\ ++ && KEYCMP(ptr->KEY, next->KEY))\ ++ ptr = next;\ ++ } while(offset);\ ++\ ++ for(;;) {\ ++ next = ptr->PTRS.next_hash;\ ++ if(next) {\ ++ if(KEYCMP(next->KEY, pos)) {\ ++ ptr = next;\ ++ continue;\ ++ }\ ++ }\ ++ next = ptr->PTRS.next_sorted;\ ++ if(next && KEYCMP(next->KEY, pos)) {\ ++ ptr = next;\ ++ continue;\ ++ }\ ++ return ptr;\ ++ }\ ++ return NULL;\ ++} ++ ++/* LINKAGE - empty or "static", depending on whether you want the definitions to ++ * be public or not ++ * NAME - a string to stick in names to make this hash table type distinct from ++ * any others ++ * HASHSIZE - number of buckets ++ * TYPE - type of data contained in the buckets - must be a structure, one ++ * field is of type NAME_ptrs, another is the hash key ++ * PTRS - TYPE must contain a field of type NAME_ptrs, PTRS is the name of that ++ * field ++ * KEYTYPE - type of the key field within TYPE ++ * KEY - name of the key field within TYPE ++ * KEYCMP - pointer to function that compares KEYTYPEs to each other - the ++ * prototype is int KEYCMP(KEYTYPE, KEYTYPE), it returns zero for equal, ++ * non-zero for not equal ++ * HASHFN - the hash function - the prototype is int HASHFN(KEYTYPE), ++ * it returns a number in the range 0 ... HASHSIZE - 1 ++ * Call DEF_HASH_STRUCTS, define your hash table as a NAME_table, then call ++ * DEF_HASH. ++ */ ++ ++#define DEF_HASH_STRUCTS(NAME,HASHSIZE,TYPE) \ ++\ ++struct NAME##_table {\ ++ TYPE * hashtable[HASHSIZE];\ ++ int nr_entries;\ ++};\ ++\ ++struct NAME##_ptrs {\ ++ TYPE * next_hash;\ ++ TYPE * prev_hash;\ ++}; ++ ++#define DEF_HASH(LINKAGE,NAME,TYPE,PTRS,KEYTYPE,KEY,KEYCMP,HASHFN)\ ++\ ++LINKAGE void insert_##NAME##_hash(struct NAME##_table * tbl, TYPE * elem)\ ++{\ ++ int ix = HASHFN(elem->KEY);\ ++ TYPE ** base = &tbl->hashtable[ix];\ ++ TYPE * ptr = *base;\ ++ TYPE * prev = NULL;\ ++\ ++ tbl->nr_entries++;\ ++ while(ptr && KEYCMP(ptr->KEY, elem->KEY)) {\ ++ base = &ptr->PTRS.next_hash;\ ++ prev = ptr;\ ++ ptr = *base;\ ++ }\ ++ elem->PTRS.next_hash = ptr;\ ++ elem->PTRS.prev_hash = prev;\ ++ if(ptr) {\ ++ ptr->PTRS.prev_hash = elem;\ ++ }\ ++ *base = elem;\ ++}\ ++\ ++LINKAGE void remove_##NAME##_hash(struct NAME##_table * tbl, TYPE * elem)\ ++{\ ++ TYPE * next = elem->PTRS.next_hash;\ ++ TYPE * prev = elem->PTRS.prev_hash;\ ++\ ++ tbl->nr_entries--;\ ++ if(next)\ ++ next->PTRS.prev_hash = prev;\ ++ if(prev)\ ++ prev->PTRS.next_hash = next;\ ++ else {\ ++ int ix = HASHFN(elem->KEY);\ ++ tbl->hashtable[ix] = next;\ ++ }\ ++}\ ++\ ++LINKAGE TYPE * find_##NAME##_hash(struct NAME##_table * tbl, KEYTYPE pos)\ ++{\ ++ int ix = HASHFN(pos);\ ++ TYPE * ptr = tbl->hashtable[ix];\ ++ while(ptr && KEYCMP(ptr->KEY, pos))\ ++ ptr = ptr->PTRS.next_hash;\ ++ return ptr;\ ++} ++ ++#endif +Index: uml-2.6.7/arch/um/kernel/tt/include/mode.h +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/include/mode.h 2004-07-16 19:36:59.998025376 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/include/mode.h 2004-07-16 19:47:23.743201696 +0300 +@@ -8,6 +8,8 @@ + + #include "sysdep/ptrace.h" + ++enum { OP_NONE, OP_EXEC, OP_FORK, OP_TRACE_ON, OP_REBOOT, OP_HALT, OP_CB }; ++ + extern int tracing_pid; + + extern int tracer(int (*init_proc)(void *), void *sp); +Index: uml-2.6.7/arch/um/include/os.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/os.h 2004-07-16 19:36:10.807503472 +0300 ++++ uml-2.6.7/arch/um/include/os.h 2004-07-16 19:47:23.705207472 +0300 +@@ -17,6 +17,32 @@ + #define OS_TYPE_FIFO 6 + #define OS_TYPE_SOCK 7 + ++/* os_access() flags */ ++#define OS_ACC_F_OK 0 /* Test for existence. */ ++#define OS_ACC_X_OK 1 /* Test for execute permission. */ ++#define OS_ACC_W_OK 2 /* Test for write permission. */ ++#define OS_ACC_R_OK 4 /* Test for read permission. */ ++#define OS_ACC_RW_OK (OS_ACC_W_OK | OS_ACC_R_OK) /* Test for RW permission */ ++ ++/* ++ * types taken from stat_file() in hostfs_user.c ++ * (if they are wrong here, they are wrong there...). ++ */ ++struct uml_stat { ++ int ust_dev; /* device */ ++ unsigned long long ust_ino; /* inode */ ++ int ust_mode; /* protection */ ++ int ust_nlink; /* number of hard links */ ++ int ust_uid; /* user ID of owner */ ++ int ust_gid; /* group ID of owner */ ++ unsigned long long ust_size; /* total size, in bytes */ ++ int ust_blksize; /* blocksize for filesystem I/O */ ++ unsigned long long ust_blocks; /* number of blocks allocated */ ++ unsigned long ust_atime; /* time of last access */ ++ unsigned long ust_mtime; /* time of last modification */ ++ unsigned long ust_ctime; /* time of last change */ ++}; ++ + struct openflags { + unsigned int r : 1; + unsigned int w : 1; +@@ -84,29 +110,47 @@ + flags.e = 1; + return(flags); + } +- ++ + static inline struct openflags of_cloexec(struct openflags flags) + { + flags.cl = 1; + return(flags); + } + ++extern int os_stat_file(const char *file_name, struct uml_stat *buf); ++extern int os_stat_fd(const int fd, struct uml_stat *buf); ++extern int os_access(const char *file, int mode); ++extern void os_print_error(int error, const char* str); ++extern int os_get_exec_close(int fd, int *close_on_exec); ++extern int os_set_exec_close(int fd, int close_on_exec); ++extern int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg); ++extern int os_window_size(int fd, int *rows, int *cols); ++extern int os_new_tty_pgrp(int fd, int pid); ++extern int os_get_ifname(int fd, char *namebuf); ++extern int os_set_slip(int fd); ++extern int os_set_owner(int fd, int pid); ++extern int os_sigio_async(int master, int slave); ++extern int os_mode_fd(int fd, int mode); ++ + extern int os_seek_file(int fd, __u64 offset); + extern int os_open_file(char *file, struct openflags flags, int mode); + extern int os_read_file(int fd, void *buf, int len); +-extern int os_write_file(int fd, void *buf, int count); ++extern int os_write_file(int fd, const void *buf, int count); + extern int os_file_size(char *file, long long *size_out); ++extern int os_file_modtime(char *file, unsigned long *modtime); + extern int os_pipe(int *fd, int stream, int close_on_exec); + extern int os_set_fd_async(int fd, int owner); + extern int os_set_fd_block(int fd, int blocking); + extern int os_accept_connection(int fd); ++extern int os_create_unix_socket(char *file, int len, int close_on_exec); + extern int os_shutdown_socket(int fd, int r, int w); + extern void os_close_file(int fd); + extern int os_rcv_fd(int fd, int *helper_pid_out); +-extern int create_unix_socket(char *file, int len); ++extern int create_unix_socket(char *file, int len, int close_on_exec); + extern int os_connect_socket(char *name); + extern int os_file_type(char *file); + extern int os_file_mode(char *file, struct openflags *mode_out); ++extern int os_lock_file(int fd, int excl); + + extern unsigned long os_process_pc(int pid); + extern int os_process_parent(int pid); +@@ -115,11 +159,12 @@ + extern void os_usr1_process(int pid); + extern int os_getpid(void); + +-extern int os_map_memory(void *virt, int fd, unsigned long off, ++extern int os_map_memory(void *virt, int fd, unsigned long long off, + unsigned long len, int r, int w, int x); + extern int os_protect_memory(void *addr, unsigned long len, + int r, int w, int x); + extern int os_unmap_memory(void *addr, int len); ++extern void os_flush_stdout(void); + + #endif + +Index: uml-2.6.7/arch/um/kernel/tt/exec_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/exec_user.c 2004-07-16 19:37:20.241947832 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/exec_user.c 2004-07-16 19:47:24.799041184 +0300 +@@ -19,13 +19,18 @@ + void do_exec(int old_pid, int new_pid) + { + unsigned long regs[FRAME_SIZE]; ++ int err; + + if((ptrace(PTRACE_ATTACH, new_pid, 0, 0) < 0) || +- (ptrace(PTRACE_CONT, new_pid, 0, 0) < 0) || +- (waitpid(new_pid, 0, WUNTRACED) < 0)) ++ (ptrace(PTRACE_CONT, new_pid, 0, 0) < 0)) + tracer_panic("do_exec failed to attach proc - errno = %d", + errno); + ++ CATCH_EINTR(err = waitpid(new_pid, 0, WUNTRACED)); ++ if (err < 0) ++ tracer_panic("do_exec failed to attach proc in waitpid - errno = %d", ++ errno); ++ + if(ptrace_getregs(old_pid, regs) < 0) + tracer_panic("do_exec failed to get registers - errno = %d", + errno); +Index: uml-2.6.7/include/asm-um/timex.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/timex.h 2004-07-16 19:36:59.398116576 +0300 ++++ uml-2.6.7/include/asm-um/timex.h 2004-07-16 19:47:23.803192576 +0300 +@@ -1,8 +1,6 @@ + #ifndef __UM_TIMEX_H + #define __UM_TIMEX_H + +-#include "linux/time.h" +- + typedef unsigned long cycles_t; + + #define cacheflush_time (0) +Index: uml-2.6.7/arch/um/kernel/skas/include/skas.h +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/include/skas.h 2004-07-16 19:36:19.759142616 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/include/skas.h 2004-07-16 19:47:23.727204128 +0300 +@@ -8,7 +8,7 @@ + + #include "sysdep/ptrace.h" + +-extern int userspace_pid; ++extern int userspace_pid[]; + + extern void switch_threads(void *me, void *next); + extern void thread_wait(void *sw, void *fb); +@@ -32,7 +32,7 @@ + extern int new_mm(int from); + extern void save_registers(union uml_pt_regs *regs); + extern void restore_registers(union uml_pt_regs *regs); +-extern void start_userspace(void); ++extern void start_userspace(int cpu); + extern void init_registers(int pid); + + #endif +Index: uml-2.6.7/arch/um/drivers/mmapper_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/mmapper_kern.c 2004-07-16 19:36:04.585449368 +0300 ++++ uml-2.6.7/arch/um/drivers/mmapper_kern.c 2004-07-16 19:47:23.688210056 +0300 +@@ -120,7 +120,10 @@ + printk(KERN_INFO "Mapper v0.1\n"); + + v_buf = (char *) find_iomem("mmapper", &mmapper_size); +- if(mmapper_size == 0) return(0); ++ if(mmapper_size == 0){ ++ printk(KERN_ERR "mmapper_init - find_iomem failed\n"); ++ return(0); ++ } + + p_buf = __pa(v_buf); + +Index: uml-2.6.7/arch/um/os-Linux/process.c +=================================================================== +--- uml-2.6.7.orig/arch/um/os-Linux/process.c 2004-07-16 19:36:02.092828304 +0300 ++++ uml-2.6.7/arch/um/os-Linux/process.c 2004-07-16 19:47:24.802040728 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2002 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -7,32 +7,38 @@ + #include <stdio.h> + #include <errno.h> + #include <signal.h> ++#include <linux/unistd.h> + #include <sys/mman.h> + #include <sys/wait.h> + #include "os.h" + #include "user.h" ++#include "user_util.h" ++ ++#define ARBITRARY_ADDR -1 ++#define FAILURE_PID -1 + + unsigned long os_process_pc(int pid) + { + char proc_stat[sizeof("/proc/#####/stat\0")], buf[256]; + unsigned long pc; +- int fd; ++ int fd, err; + + sprintf(proc_stat, "/proc/%d/stat", pid); + fd = os_open_file(proc_stat, of_read(OPENFLAGS()), 0); + if(fd < 0){ +- printk("os_process_pc - couldn't open '%s', errno = %d\n", +- proc_stat, errno); +- return(-1); ++ printk("os_process_pc - couldn't open '%s', err = %d\n", ++ proc_stat, -fd); ++ return(ARBITRARY_ADDR); + } +- if(read(fd, buf, sizeof(buf)) < 0){ +- printk("os_process_pc - couldn't read '%s', errno = %d\n", +- proc_stat, errno); +- close(fd); +- return(-1); ++ err = os_read_file(fd, buf, sizeof(buf)); ++ if(err < 0){ ++ printk("os_process_pc - couldn't read '%s', err = %d\n", ++ proc_stat, -err); ++ os_close_file(fd); ++ return(ARBITRARY_ADDR); + } +- close(fd); +- pc = -1; ++ os_close_file(fd); ++ pc = ARBITRARY_ADDR; + if(sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*d %*d %*d " + "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d " + "%*d %*d %*d %*d %ld", &pc) != 1){ +@@ -52,22 +58,23 @@ + snprintf(stat, sizeof(stat), "/proc/%d/stat", pid); + fd = os_open_file(stat, of_read(OPENFLAGS()), 0); + if(fd < 0){ +- printk("Couldn't open '%s', errno = %d\n", stat, -fd); +- return(-1); ++ printk("Couldn't open '%s', err = %d\n", stat, -fd); ++ return(FAILURE_PID); + } + +- n = read(fd, data, sizeof(data)); +- close(fd); ++ n = os_read_file(fd, data, sizeof(data)); ++ os_close_file(fd); + + if(n < 0){ +- printk("Couldn't read '%s', errno = %d\n", stat); +- return(-1); ++ printk("Couldn't read '%s', err = %d\n", stat, -n); ++ return(FAILURE_PID); + } + +- parent = -1; ++ parent = FAILURE_PID; + /* XXX This will break if there is a space in the command */ + n = sscanf(data, "%*d %*s %*c %d", &parent); +- if(n != 1) printk("Failed to scan '%s'\n", data); ++ if(n != 1) ++ printk("Failed to scan '%s'\n", data); + + return(parent); + } +@@ -81,13 +88,17 @@ + { + kill(pid, SIGKILL); + if(reap_child) +- waitpid(pid, NULL, 0); ++ CATCH_EINTR(waitpid(pid, NULL, 0)); + + } + + void os_usr1_process(int pid) + { ++#ifdef __NR_tkill ++ syscall(__NR_tkill, pid, SIGUSR1); ++#else + kill(pid, SIGUSR1); ++#endif + } + + int os_getpid(void) +@@ -95,7 +106,7 @@ + return(getpid()); + } + +-int os_map_memory(void *virt, int fd, unsigned long off, unsigned long len, ++int os_map_memory(void *virt, int fd, unsigned long long off, unsigned long len, + int r, int w, int x) + { + void *loc; +@@ -104,8 +115,8 @@ + prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | + (x ? PROT_EXEC : 0); + +- loc = mmap((void *) virt, len, prot, MAP_SHARED | MAP_FIXED, +- fd, off); ++ loc = mmap64((void *) virt, len, prot, MAP_SHARED | MAP_FIXED, ++ fd, off); + if(loc == MAP_FAILED) + return(-errno); + return(0); +@@ -126,7 +137,8 @@ + int err; + + err = munmap(addr, len); +- if(err < 0) return(-errno); ++ if(err < 0) ++ return(-errno); + return(0); + } + +Index: uml-2.6.7/arch/um/include/mem_user.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/mem_user.h 2004-07-16 19:37:02.661620448 +0300 ++++ uml-2.6.7/arch/um/include/mem_user.h 2004-07-16 19:47:23.704207624 +0300 +@@ -32,43 +32,38 @@ + #ifndef _MEM_USER_H + #define _MEM_USER_H + +-struct mem_region { ++struct iomem_region { ++ struct iomem_region *next; + char *driver; +- unsigned long start_pfn; +- unsigned long start; +- unsigned long len; +- void *mem_map; + int fd; ++ int size; ++ unsigned long phys; ++ unsigned long virt; + }; + +-extern struct mem_region *regions[]; +-extern struct mem_region physmem_region; ++extern struct iomem_region *iomem_regions; ++extern int iomem_size; + + #define ROUND_4M(n) ((((unsigned long) (n)) + (1 << 22)) & ~((1 << 22) - 1)) + + extern unsigned long host_task_size; + extern unsigned long task_size; + ++extern void check_devanon(void); + extern int init_mem_user(void); + extern int create_mem_file(unsigned long len); +-extern void setup_range(int fd, char *driver, unsigned long start, +- unsigned long pfn, unsigned long total, int need_vm, +- struct mem_region *region, void *reserved); + extern void setup_memory(void *entry); + extern unsigned long find_iomem(char *driver, unsigned long *len_out); +-extern int init_maps(struct mem_region *region); +-extern int nregions(void); +-extern int reserve_vm(unsigned long start, unsigned long end, void *e); ++extern int init_maps(unsigned long physmem, unsigned long iomem, ++ unsigned long highmem); + extern unsigned long get_vm(unsigned long len); + extern void setup_physmem(unsigned long start, unsigned long usable, +- unsigned long len); +-extern int setup_region(struct mem_region *region, void *entry); ++ unsigned long len, unsigned long highmem); + extern void add_iomem(char *name, int fd, unsigned long size); +-extern struct mem_region *phys_region(unsigned long phys); + extern unsigned long phys_offset(unsigned long phys); + extern void unmap_physmem(void); +-extern int map_memory(unsigned long virt, unsigned long phys, +- unsigned long len, int r, int w, int x); ++extern void map_memory(unsigned long virt, unsigned long phys, ++ unsigned long len, int r, int w, int x); + extern int protect_memory(unsigned long addr, unsigned long len, + int r, int w, int x, int must_succeed); + extern unsigned long get_kmem_end(void); +Index: uml-2.6.7/arch/um/drivers/mcast_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/mcast_user.c 2004-07-16 19:36:45.956160064 +0300 ++++ uml-2.6.7/arch/um/drivers/mcast_user.c 2004-07-16 19:47:23.686210360 +0300 +@@ -23,6 +23,7 @@ + #include "kern_util.h" + #include "user_util.h" + #include "user.h" ++#include "os.h" + + #define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) + +@@ -62,7 +63,8 @@ + goto out; + } + +- if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ ++ fd = socket(AF_INET, SOCK_DGRAM, 0); ++ if (fd < 0){ + printk("mcast_open : data socket failed, errno = %d\n", + errno); + fd = -ENOMEM; +@@ -72,7 +74,7 @@ + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) { + printk("mcast_open: SO_REUSEADDR failed, errno = %d\n", + errno); +- close(fd); ++ os_close_file(fd); + fd = -EINVAL; + goto out; + } +@@ -82,7 +84,7 @@ + sizeof(pri->ttl)) < 0) { + printk("mcast_open: IP_MULTICAST_TTL failed, error = %d\n", + errno); +- close(fd); ++ os_close_file(fd); + fd = -EINVAL; + goto out; + } +@@ -91,7 +93,7 @@ + if (setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &yes, sizeof(yes)) < 0) { + printk("mcast_open: IP_MULTICAST_LOOP failed, error = %d\n", + errno); +- close(fd); ++ os_close_file(fd); + fd = -EINVAL; + goto out; + } +@@ -99,7 +101,7 @@ + /* bind socket to mcast address */ + if (bind(fd, (struct sockaddr *) sin, sizeof(*sin)) < 0) { + printk("mcast_open : data bind failed, errno = %d\n", errno); +- close(fd); ++ os_close_file(fd); + fd = -EINVAL; + goto out; + } +@@ -115,7 +117,7 @@ + "interface on the host.\n"); + printk("eth0 should be configured in order to use the " + "multicast transport.\n"); +- close(fd); ++ os_close_file(fd); + fd = -EINVAL; + } + +@@ -137,7 +139,7 @@ + errno); + } + +- close(fd); ++ os_close_file(fd); + } + + int mcast_user_write(int fd, void *buf, int len, struct mcast_data *pri) +Index: uml-2.6.7/arch/um/drivers/slirp_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/slirp_user.c 2004-07-16 19:37:02.720611480 +0300 ++++ uml-2.6.7/arch/um/drivers/slirp_user.c 2004-07-16 19:47:24.797041488 +0300 +@@ -4,8 +4,7 @@ + #include <stddef.h> + #include <sched.h> + #include <string.h> +-#include <sys/fcntl.h> +-#include <sys/errno.h> ++#include <errno.h> + #include <sys/wait.h> + #include <sys/signal.h> + #include "user_util.h" +@@ -48,15 +47,15 @@ + + return(pid); + } +- ++ ++/* XXX This is just a trivial wrapper around os_pipe */ + static int slirp_datachan(int *mfd, int *sfd) + { + int fds[2], err; + + err = os_pipe(fds, 1, 1); +- if(err){ +- printk("slirp_datachan: Failed to open pipe, errno = %d\n", +- -err); ++ if(err < 0){ ++ printk("slirp_datachan: Failed to open pipe, err = %d\n", -err); + return(err); + } + +@@ -77,7 +76,7 @@ + pid = slirp_tramp(pri->argw.argv, sfd); + + if(pid < 0){ +- printk("slirp_tramp failed - errno = %d\n", pid); ++ printk("slirp_tramp failed - errno = %d\n", -pid); + os_close_file(sfd); + os_close_file(mfd); + return(pid); +@@ -97,8 +96,8 @@ + struct slirp_data *pri = data; + int status,err; + +- close(fd); +- close(pri->slave); ++ os_close_file(fd); ++ os_close_file(pri->slave); + + pri->slave = -1; + +@@ -114,13 +113,13 @@ + } + #endif + +- err = waitpid(pri->pid, &status, WNOHANG); +- if(err<0) { ++ CATCH_EINTR(err = waitpid(pri->pid, &status, WNOHANG)); ++ if(err < 0) { + printk("slirp_close: waitpid returned %d\n", errno); + return; + } + +- if(err==0) { ++ if(err == 0) { + printk("slirp_close: process %d has not exited\n"); + return; + } +Index: uml-2.6.7/arch/um/kernel/tempfile.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tempfile.c 2004-07-16 19:36:48.252810920 +0300 ++++ uml-2.6.7/arch/um/kernel/tempfile.c 2004-07-16 19:47:23.740202152 +0300 +@@ -28,6 +28,7 @@ + } + if((dir == NULL) || (*dir == '\0')) + dir = "/tmp"; ++ + tempdir = malloc(strlen(dir) + 2); + if(tempdir == NULL){ + fprintf(stderr, "Failed to malloc tempdir, " +@@ -49,7 +50,8 @@ + else + *tempname = 0; + strcat(tempname, template); +- if((fd = mkstemp(tempname)) < 0){ ++ fd = mkstemp(tempname); ++ if(fd < 0){ + fprintf(stderr, "open - cannot create %s: %s\n", tempname, + strerror(errno)); + return -1; +@@ -59,7 +61,8 @@ + return -1; + } + if(out_tempname){ +- if((*out_tempname = strdup(tempname)) == NULL){ ++ *out_tempname = strdup(tempname); ++ if(*out_tempname == NULL){ + perror("strdup"); + return -1; + } +Index: uml-2.6.7/arch/um/sys-i386/util/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-i386/util/Makefile 2004-07-16 19:37:40.976795656 +0300 ++++ uml-2.6.7/arch/um/sys-i386/util/Makefile 2004-07-16 19:47:23.773197136 +0300 +@@ -1,15 +1,10 @@ ++host-progs := mk_sc mk_thread ++always := $(host-progs) + +-host-progs := mk_sc +-always := $(host-progs) mk_thread +-targets := mk_thread_kern.o mk_thread_user.o ++mk_thread-objs := mk_thread_kern.o mk_thread_user.o + +-mk_sc-objs := mk_sc.o +- +-$(obj)/mk_thread : $(obj)/mk_thread_kern.o $(obj)/mk_thread_user.o +- $(CC) $(CFLAGS) -o $@ $^ +- +-$(obj)/mk_thread_user.o : $(src)/mk_thread_user.c +- $(CC) $(USER_CFLAGS) -c -o $@ $< ++HOSTCFLAGS_mk_thread_kern.o := $(CFLAGS) $(CPPFLAGS) ++HOSTCFLAGS_mk_thread_user.o := $(USER_CFLAGS) + + clean : + $(RM) -f $(build-targets) +Index: uml-2.6.7/arch/um/kernel/tt/tracer.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/tracer.c 2004-07-16 19:35:55.561821168 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/tracer.c 2004-07-16 19:47:24.801040880 +0300 +@@ -39,16 +39,17 @@ + return(0); + + register_winch_irq(tracer_winch[0], fd, -1, data); +- return(0); ++ return(1); + } + + static void tracer_winch_handler(int sig) + { ++ int n; + char c = 1; + +- if(write(tracer_winch[1], &c, sizeof(c)) != sizeof(c)) +- printk("tracer_winch_handler - write failed, errno = %d\n", +- errno); ++ n = os_write_file(tracer_winch[1], &c, sizeof(c)); ++ if(n != sizeof(c)) ++ printk("tracer_winch_handler - write failed, err = %d\n", -n); + } + + /* Called only by the tracing thread during initialization */ +@@ -58,9 +59,8 @@ + int err; + + err = os_pipe(tracer_winch, 1, 1); +- if(err){ +- printk("setup_tracer_winch : os_pipe failed, errno = %d\n", +- -err); ++ if(err < 0){ ++ printk("setup_tracer_winch : os_pipe failed, err = %d\n", -err); + return; + } + signal(SIGWINCH, tracer_winch_handler); +@@ -130,8 +130,8 @@ + case SIGTSTP: + if(ptrace(PTRACE_CONT, pid, 0, sig) < 0) + tracer_panic("sleeping_process_signal : Failed to " +- "continue pid %d, errno = %d\n", pid, +- sig); ++ "continue pid %d, signal = %d, " ++ "errno = %d\n", pid, sig, errno); + break; + + /* This happens when the debugger (e.g. strace) is doing system call +@@ -145,7 +145,7 @@ + if(ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) + tracer_panic("sleeping_process_signal : Failed to " + "PTRACE_SYSCALL pid %d, errno = %d\n", +- pid, sig); ++ pid, errno); + break; + case SIGSTOP: + break; +@@ -192,7 +192,7 @@ + printf("tracing thread pid = %d\n", tracing_pid); + + pid = clone(signal_tramp, sp, CLONE_FILES | SIGCHLD, init_proc); +- n = waitpid(pid, &status, WUNTRACED); ++ CATCH_EINTR(n = waitpid(pid, &status, WUNTRACED)); + if(n < 0){ + printf("waitpid on idle thread failed, errno = %d\n", errno); + exit(1); +@@ -218,7 +218,7 @@ + err = attach(debugger_parent); + if(err){ + printf("Failed to attach debugger parent %d, " +- "errno = %d\n", debugger_parent, err); ++ "errno = %d\n", debugger_parent, -err); + debugger_parent = -1; + } + else { +@@ -233,7 +233,8 @@ + } + set_cmdline("(tracing thread)"); + while(1){ +- if((pid = waitpid(-1, &status, WUNTRACED)) <= 0){ ++ CATCH_EINTR(pid = waitpid(-1, &status, WUNTRACED)); ++ if(pid <= 0){ + if(errno != ECHILD){ + printf("wait failed - errno = %d\n", errno); + } +@@ -401,7 +402,7 @@ + + if(!strcmp(line, "go")) debug_stop = 0; + else if(!strcmp(line, "parent")) debug_parent = 1; +- else printk("Unknown debug option : '%s'\n", line); ++ else printf("Unknown debug option : '%s'\n", line); + + line = next; + } +Index: uml-2.6.7/arch/um/drivers/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/Makefile 2004-07-16 19:36:51.389334096 +0300 ++++ uml-2.6.7/arch/um/drivers/Makefile 2004-07-16 19:47:24.526082680 +0300 +@@ -1,5 +1,5 @@ + # +-# Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com) ++# Copyright (C) 2000, 2002, 2003 Jeff Dike (jdike@karaya.com) + # Licensed under the GPL + # + +@@ -15,7 +15,7 @@ + #pcap-objs := pcap_kern.o pcap_user.o $(PCAP) + net-objs := net_kern.o net_user.o + mconsole-objs := mconsole_kern.o mconsole_user.o +-hostaudio-objs := hostaudio_kern.o hostaudio_user.o ++hostaudio-objs := hostaudio_kern.o + ubd-objs := ubd_kern.o ubd_user.o + port-objs := port_kern.o port_user.o + harddog-objs := harddog_kern.o harddog_user.o +@@ -39,6 +39,8 @@ + obj-$(CONFIG_TTY_CHAN) += tty.o + obj-$(CONFIG_XTERM_CHAN) += xterm.o xterm_kern.o + obj-$(CONFIG_UML_WATCHDOG) += harddog.o ++obj-$(CONFIG_BLK_DEV_COW) += cow_kern.o ++obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o + + obj-y += stdio_console.o $(CHAN_OBJS) + +@@ -46,18 +48,7 @@ + + USER_OBJS := $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS)) fd.o \ + null.o pty.o tty.o xterm.o +-USER_OBJS := $(foreach file,$(USER_OBJS),arch/um/drivers/$(file)) ++USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) + + $(USER_OBJS) : %.o: %.c + $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< +- +-clean: +- +-modules: +- +-fastdep: +- +-dep: +- +-archmrproper: clean +- +Index: uml-2.6.7/arch/um/kernel/tt/uaccess.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/uaccess.c 2004-07-16 19:47:23.625219632 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/uaccess.c 2004-07-16 19:47:23.751200480 +0300 +@@ -0,0 +1,73 @@ ++/* ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) ++ * Licensed under the GPL ++ */ ++ ++#include "linux/sched.h" ++#include "asm/uaccess.h" ++ ++int copy_from_user_tt(void *to, const void *from, int n) ++{ ++ if(!access_ok_tt(VERIFY_READ, from, n)) ++ return(n); ++ ++ return(__do_copy_from_user(to, from, n, ¤t->thread.fault_addr, ++ ¤t->thread.fault_catcher)); ++} ++ ++int copy_to_user_tt(void *to, const void *from, int n) ++{ ++ if(!access_ok_tt(VERIFY_WRITE, to, n)) ++ return(n); ++ ++ return(__do_copy_to_user(to, from, n, ¤t->thread.fault_addr, ++ ¤t->thread.fault_catcher)); ++} ++ ++int strncpy_from_user_tt(char *dst, const char *src, int count) ++{ ++ int n; ++ ++ if(!access_ok_tt(VERIFY_READ, src, 1)) ++ return(-EFAULT); ++ ++ n = __do_strncpy_from_user(dst, src, count, ++ ¤t->thread.fault_addr, ++ ¤t->thread.fault_catcher); ++ if(n < 0) return(-EFAULT); ++ return(n); ++} ++ ++int __clear_user_tt(void *mem, int len) ++{ ++ return(__do_clear_user(mem, len, ++ ¤t->thread.fault_addr, ++ ¤t->thread.fault_catcher)); ++} ++ ++int clear_user_tt(void *mem, int len) ++{ ++ if(!access_ok_tt(VERIFY_WRITE, mem, len)) ++ return(len); ++ ++ return(__do_clear_user(mem, len, ¤t->thread.fault_addr, ++ ¤t->thread.fault_catcher)); ++} ++ ++int strnlen_user_tt(const void *str, int len) ++{ ++ return(__do_strnlen_user(str, len, ++ ¤t->thread.fault_addr, ++ ¤t->thread.fault_catcher)); ++} ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/kernel/skas/util/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/util/Makefile 2004-07-16 19:37:20.411921992 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/util/Makefile 2004-07-16 19:47:23.735202912 +0300 +@@ -1,10 +1,9 @@ + all: mk_ptregs + + mk_ptregs : mk_ptregs.o +- $(CC) -o mk_ptregs mk_ptregs.o ++ $(HOSTCC) -o mk_ptregs mk_ptregs.o + + mk_ptregs.o : mk_ptregs.c +- $(CC) -c $< ++ $(HOSTCC) -c $< + +-clean : +- $(RM) -f mk_ptregs *.o *~ ++clean-files := mk_ptregs *.o *~ +Index: uml-2.6.7/arch/um/kernel/skas/sys-i386/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/sys-i386/Makefile 2004-07-16 19:37:26.083059848 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/sys-i386/Makefile 2004-07-16 19:47:23.733203216 +0300 +@@ -10,5 +10,3 @@ + + $(USER_OBJS) : %.o: %.c + $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< +- +-clean : +Index: uml-2.6.7/arch/um/kernel/sigio_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/sigio_kern.c 2004-07-16 19:36:16.630618224 +0300 ++++ uml-2.6.7/arch/um/kernel/sigio_kern.c 2004-07-16 19:47:23.725204432 +0300 +@@ -6,18 +6,21 @@ + #include "linux/kernel.h" + #include "linux/list.h" + #include "linux/slab.h" +-#include "asm/irq.h" ++#include "linux/signal.h" ++#include "linux/interrupt.h" + #include "init.h" + #include "sigio.h" + #include "irq_user.h" ++#include "irq_kern.h" + + /* Protected by sigio_lock() called from write_sigio_workaround */ + static int sigio_irq_fd = -1; + +-void sigio_interrupt(int irq, void *data, struct pt_regs *unused) ++irqreturn_t sigio_interrupt(int irq, void *data, struct pt_regs *unused) + { + read_sigio_fd(sigio_irq_fd); + reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ); ++ return(IRQ_HANDLED); + } + + int write_sigio_irq(int fd) +Index: uml-2.6.7/include/asm-um/system-generic.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/system-generic.h 2004-07-16 19:37:46.190003128 +0300 ++++ uml-2.6.7/include/asm-um/system-generic.h 2004-07-16 19:47:23.802192728 +0300 +@@ -23,8 +23,10 @@ + extern void block_signals(void); + extern void unblock_signals(void); + +-#define local_save_flags(flags) do { (flags) = get_signals(); } while(0) +-#define local_irq_restore(flags) do { set_signals(flags); } while(0) ++#define local_save_flags(flags) do { typecheck(unsigned long, flags); \ ++ (flags) = get_signals(); } while(0) ++#define local_irq_restore(flags) do { typecheck(unsigned long, flags); \ ++ set_signals(flags); } while(0) + + #define local_irq_save(flags) do { local_save_flags(flags); \ + local_irq_disable(); } while(0) +@@ -39,4 +41,7 @@ + (flags == 0); \ + }) + ++extern void *_switch_to(void *prev, void *next, void *last); ++#define switch_to(prev, next, last) prev = _switch_to(prev, next, last) ++ + #endif +Index: uml-2.6.7/include/asm-um/uaccess.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/uaccess.h 2004-07-16 19:37:05.104249112 +0300 ++++ uml-2.6.7/include/asm-um/uaccess.h 2004-07-16 19:47:23.804192424 +0300 +@@ -6,6 +6,8 @@ + #ifndef __UM_UACCESS_H + #define __UM_UACCESS_H + ++#include "linux/sched.h" ++ + #define VERIFY_READ 0 + #define VERIFY_WRITE 1 + +Index: uml-2.6.7/arch/um/util/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/util/Makefile 2004-07-16 19:37:43.611395136 +0300 ++++ uml-2.6.7/arch/um/util/Makefile 2004-07-16 19:47:23.780196072 +0300 +@@ -1,23 +1,8 @@ +-always := mk_task mk_constants +-targets := mk_task_user.o mk_task_kern.o \ +- mk_constants_user.o mk_constants_kern.o ++host-progs := mk_task mk_constants ++always := $(host-progs) + +-$(obj)/mk_task: $(obj)/mk_task_user.o $(obj)/mk_task_kern.o +- $(CC) -o $@ $^ ++mk_task-objs := mk_task_user.o mk_task_kern.o ++mk_constants-objs := mk_constants_user.o mk_constants_kern.o + +-$(obj)/mk_task_user.o: $(src)/mk_task_user.c +- $(CC) -o $@ -c $< +- +-$(obj)/mk_constants : $(obj)/mk_constants_user.o $(obj)/mk_constants_kern.o +- $(CC) -o $@ $^ +- +-$(obj)/mk_constants_user.o : $(src)/mk_constants_user.c +- $(CC) -c $< -o $@ +- +-$(obj)/mk_constants_kern.o : $(src)/mk_constants_kern.c +- $(CC) $(CFLAGS) -c $< -o $@ +- +-clean: +- $(RM) $(build-targets) +- +-archmrproper: ++HOSTCFLAGS_mk_task_kern.o := $(CFLAGS) $(CPPFLAGS) ++HOSTCFLAGS_mk_constants_kern.o := $(CFLAGS) $(CPPFLAGS) +Index: uml-2.6.7/arch/um/os-Linux/file.c +=================================================================== +--- uml-2.6.7.orig/arch/um/os-Linux/file.c 2004-07-16 19:37:43.530407448 +0300 ++++ uml-2.6.7/arch/um/os-Linux/file.c 2004-07-16 19:47:23.767198048 +0300 +@@ -8,6 +8,8 @@ + #include <errno.h> + #include <fcntl.h> + #include <signal.h> ++#include <sys/types.h> ++#include <sys/stat.h> + #include <sys/socket.h> + #include <sys/un.h> + #include <sys/ioctl.h> +@@ -17,33 +19,235 @@ + #include "user.h" + #include "kern_util.h" + +-int os_file_type(char *file) ++static void copy_stat(struct uml_stat *dst, struct stat64 *src) ++{ ++ *dst = ((struct uml_stat) { ++ .ust_dev = src->st_dev, /* device */ ++ .ust_ino = src->st_ino, /* inode */ ++ .ust_mode = src->st_mode, /* protection */ ++ .ust_nlink = src->st_nlink, /* number of hard links */ ++ .ust_uid = src->st_uid, /* user ID of owner */ ++ .ust_gid = src->st_gid, /* group ID of owner */ ++ .ust_size = src->st_size, /* total size, in bytes */ ++ .ust_blksize = src->st_blksize, /* blocksize for filesys I/O */ ++ .ust_blocks = src->st_blocks, /* number of blocks allocated */ ++ .ust_atime = src->st_atime, /* time of last access */ ++ .ust_mtime = src->st_mtime, /* time of last modification */ ++ .ust_ctime = src->st_ctime, /* time of last change */ ++ }); ++} ++ ++int os_stat_fd(const int fd, struct uml_stat *ubuf) ++{ ++ struct stat64 sbuf; ++ int err; ++ ++ do { ++ err = fstat64(fd, &sbuf); ++ } while((err < 0) && (errno == EINTR)) ; ++ ++ if(err < 0) ++ return(-errno); ++ ++ if(ubuf != NULL) ++ copy_stat(ubuf, &sbuf); ++ return(err); ++} ++ ++int os_stat_file(const char *file_name, struct uml_stat *ubuf) ++{ ++ struct stat64 sbuf; ++ int err; ++ ++ do { ++ err = stat64(file_name, &sbuf); ++ } while((err < 0) && (errno == EINTR)) ; ++ ++ if(err < 0) ++ return(-errno); ++ ++ if(ubuf != NULL) ++ copy_stat(ubuf, &sbuf); ++ return(err); ++} ++ ++int os_access(const char* file, int mode) ++{ ++ int amode, err; ++ ++ amode=(mode&OS_ACC_R_OK ? R_OK : 0) | (mode&OS_ACC_W_OK ? W_OK : 0) | ++ (mode&OS_ACC_X_OK ? X_OK : 0) | (mode&OS_ACC_F_OK ? F_OK : 0) ; ++ ++ err = access(file, amode); ++ if(err < 0) ++ return(-errno); ++ ++ return(0); ++} ++ ++void os_print_error(int error, const char* str) ++{ ++ errno = error < 0 ? -error : error; ++ ++ perror(str); ++} ++ ++/* FIXME? required only by hostaudio (because it passes ioctls verbatim) */ ++int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg) ++{ ++ int err; ++ ++ err = ioctl(fd, cmd, arg); ++ if(err < 0) ++ return(-errno); ++ ++ return(err); ++} ++ ++int os_window_size(int fd, int *rows, int *cols) ++{ ++ struct winsize size; ++ ++ if(ioctl(fd, TIOCGWINSZ, &size) < 0) ++ return(-errno); ++ ++ *rows = size.ws_row; ++ *cols = size.ws_col; ++ ++ return(0); ++} ++ ++int os_new_tty_pgrp(int fd, int pid) + { +- struct stat64 buf; ++ if(ioctl(fd, TIOCSCTTY, 0) < 0){ ++ printk("TIOCSCTTY failed, errno = %d\n", errno); ++ return(-errno); ++ } ++ ++ if(tcsetpgrp(fd, pid) < 0){ ++ printk("tcsetpgrp failed, errno = %d\n", errno); ++ return(-errno); ++ } ++ ++ return(0); ++} ++ ++/* FIXME: ensure namebuf in os_get_if_name is big enough */ ++int os_get_ifname(int fd, char* namebuf) ++{ ++ if(ioctl(fd, SIOCGIFNAME, namebuf) < 0) ++ return(-errno); ++ ++ return(0); ++} ++ ++int os_set_slip(int fd) ++{ ++ int disc, sencap; ++ ++ disc = N_SLIP; ++ if(ioctl(fd, TIOCSETD, &disc) < 0){ ++ printk("Failed to set slip line discipline - " ++ "errno = %d\n", errno); ++ return(-errno); ++ } ++ ++ sencap = 0; ++ if(ioctl(fd, SIOCSIFENCAP, &sencap) < 0){ ++ printk("Failed to set slip encapsulation - " ++ "errno = %d\n", errno); ++ return(-errno); ++ } ++ ++ return(0); ++} ++ ++int os_set_owner(int fd, int pid) ++{ ++ if(fcntl(fd, F_SETOWN, pid) < 0){ ++ int save_errno = errno; ++ ++ if(fcntl(fd, F_GETOWN, 0) != pid) ++ return(-save_errno); ++ } ++ ++ return(0); ++} ++ ++/* FIXME? moved wholesale from sigio_user.c to get fcntls out of that file */ ++int os_sigio_async(int master, int slave) ++{ ++ int flags; + +- if(stat64(file, &buf) == -1) ++ flags = fcntl(master, F_GETFL); ++ if(flags < 0) { ++ printk("fcntl F_GETFL failed, errno = %d\n", errno); + return(-errno); ++ } ++ ++ if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) || ++ (fcntl(master, F_SETOWN, os_getpid()) < 0)){ ++ printk("fcntl F_SETFL or F_SETOWN failed, errno = %d\n", errno); ++ return(-errno); ++ } ++ ++ if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0)){ ++ printk("fcntl F_SETFL failed, errno = %d\n", errno); ++ return(-errno); ++ } + +- if(S_ISDIR(buf.st_mode)) return(OS_TYPE_DIR); +- else if(S_ISLNK(buf.st_mode)) return(OS_TYPE_SYMLINK); +- else if(S_ISCHR(buf.st_mode)) return(OS_TYPE_CHARDEV); +- else if(S_ISBLK(buf.st_mode)) return(OS_TYPE_BLOCKDEV); +- else if(S_ISFIFO(buf.st_mode)) return(OS_TYPE_FIFO); +- else if(S_ISSOCK(buf.st_mode)) return(OS_TYPE_SOCK); ++ return(0); ++} ++ ++int os_mode_fd(int fd, int mode) ++{ ++ int err; ++ ++ do { ++ err = fchmod(fd, mode); ++ } while((err < 0) && (errno==EINTR)) ; ++ ++ if(err < 0) ++ return(-errno); ++ ++ return(0); ++} ++ ++int os_file_type(char *file) ++{ ++ struct uml_stat buf; ++ int err; ++ ++ err = os_stat_file(file, &buf); ++ if(err < 0) ++ return(err); ++ ++ if(S_ISDIR(buf.ust_mode)) return(OS_TYPE_DIR); ++ else if(S_ISLNK(buf.ust_mode)) return(OS_TYPE_SYMLINK); ++ else if(S_ISCHR(buf.ust_mode)) return(OS_TYPE_CHARDEV); ++ else if(S_ISBLK(buf.ust_mode)) return(OS_TYPE_BLOCKDEV); ++ else if(S_ISFIFO(buf.ust_mode)) return(OS_TYPE_FIFO); ++ else if(S_ISSOCK(buf.ust_mode)) return(OS_TYPE_SOCK); + else return(OS_TYPE_FILE); + } + + int os_file_mode(char *file, struct openflags *mode_out) + { ++ int err; ++ + *mode_out = OPENFLAGS(); + +- if(!access(file, W_OK)) *mode_out = of_write(*mode_out); +- else if(errno != EACCES) +- return(-errno); ++ err = os_access(file, OS_ACC_W_OK); ++ if((err < 0) && (err != -EACCES)) ++ return(err); + +- if(!access(file, R_OK)) *mode_out = of_read(*mode_out); +- else if(errno != EACCES) +- return(-errno); ++ *mode_out = of_write(*mode_out); ++ ++ err = os_access(file, OS_ACC_R_OK); ++ if((err < 0) && (err != -EACCES)) ++ return(err); ++ ++ *mode_out = of_read(*mode_out); + + return(0); + } +@@ -63,16 +267,14 @@ + if(flags.e) f |= O_EXCL; + + fd = open64(file, f, mode); +- if(fd < 0) return(-errno); +- +- if(flags.cl){ +- if(fcntl(fd, F_SETFD, 1)){ +- close(fd); +- return(-errno); +- } ++ if(fd < 0) ++ return(-errno); ++ ++ if(flags.cl && fcntl(fd, F_SETFD, 1)){ ++ os_close_file(fd); ++ return(-errno); + } + +- return(fd); + return(fd); + } + +@@ -90,7 +292,7 @@ + + err = connect(fd, (struct sockaddr *) &sock, sizeof(sock)); + if(err) +- return(err); ++ return(-errno); + + return(fd); + } +@@ -109,88 +311,162 @@ + return(0); + } + +-int os_read_file(int fd, void *buf, int len) ++static int fault_buffer(void *start, int len, ++ int (*copy_proc)(void *addr, void *buf, int len)) + { +- int n; ++ int page = getpagesize(), i; ++ char c; + +- /* Force buf into memory if it's not already. */ ++ for(i = 0; i < len; i += page){ ++ if((*copy_proc)(start + i, &c, sizeof(c))) ++ return(-EFAULT); ++ } ++ if((len % page) != 0){ ++ if((*copy_proc)(start + len - 1, &c, sizeof(c))) ++ return(-EFAULT); ++ } ++ return(0); ++} + +- /* XXX This fails if buf is kernel memory */ +-#ifdef notdef +- if(copy_to_user_proc(buf, &c, sizeof(c))) +- return(-EFAULT); +-#endif ++static int file_io(int fd, void *buf, int len, ++ int (*io_proc)(int fd, void *buf, int len), ++ int (*copy_user_proc)(void *addr, void *buf, int len)) ++{ ++ int n, err; ++ ++ do { ++ n = (*io_proc)(fd, buf, len); ++ if((n < 0) && (errno == EFAULT)){ ++ err = fault_buffer(buf, len, copy_user_proc); ++ if(err) ++ return(err); ++ n = (*io_proc)(fd, buf, len); ++ } ++ } while((n < 0) && (errno == EINTR)); + +- n = read(fd, buf, len); + if(n < 0) + return(-errno); + return(n); + } + +-int os_write_file(int fd, void *buf, int count) ++int os_read_file(int fd, void *buf, int len) + { +- int n; +- +- /* Force buf into memory if it's not already. */ +- +- /* XXX This fails if buf is kernel memory */ +-#ifdef notdef +- if(copy_to_user_proc(buf, buf, buf[0])) +- return(-EFAULT); +-#endif ++ return(file_io(fd, buf, len, (int (*)(int, void *, int)) read, ++ copy_from_user_proc)); ++} + +- n = write(fd, buf, count); +- if(n < 0) +- return(-errno); +- return(n); ++int os_write_file(int fd, const void *buf, int len) ++{ ++ return(file_io(fd, (void *) buf, len, ++ (int (*)(int, void *, int)) write, copy_to_user_proc)); + } + + int os_file_size(char *file, long long *size_out) + { +- struct stat64 buf; ++ struct uml_stat buf; ++ int err; + +- if(stat64(file, &buf) == -1){ +- printk("Couldn't stat \"%s\" : errno = %d\n", file, errno); +- return(-errno); ++ err = os_stat_file(file, &buf); ++ if(err < 0){ ++ printk("Couldn't stat \"%s\" : err = %d\n", file, -err); ++ return(err); + } +- if(S_ISBLK(buf.st_mode)){ ++ ++ if(S_ISBLK(buf.ust_mode)){ + int fd, blocks; + +- if((fd = open64(file, O_RDONLY)) < 0){ +- printk("Couldn't open \"%s\", errno = %d\n", file, +- errno); +- return(-errno); ++ fd = os_open_file(file, of_read(OPENFLAGS()), 0); ++ if(fd < 0){ ++ printk("Couldn't open \"%s\", errno = %d\n", file, -fd); ++ return(fd); + } + if(ioctl(fd, BLKGETSIZE, &blocks) < 0){ + printk("Couldn't get the block size of \"%s\", " + "errno = %d\n", file, errno); +- close(fd); +- return(-errno); ++ err = -errno; ++ os_close_file(fd); ++ return(err); + } + *size_out = ((long long) blocks) * 512; +- close(fd); ++ os_close_file(fd); + return(0); + } +- *size_out = buf.st_size; ++ *size_out = buf.ust_size; ++ return(0); ++} ++ ++int os_file_modtime(char *file, unsigned long *modtime) ++{ ++ struct uml_stat buf; ++ int err; ++ ++ err = os_stat_file(file, &buf); ++ if(err < 0){ ++ printk("Couldn't stat \"%s\" : err = %d\n", file, -err); ++ return(err); ++ } ++ ++ *modtime = buf.ust_mtime; + return(0); + } + ++int os_get_exec_close(int fd, int* close_on_exec) ++{ ++ int ret; ++ ++ do { ++ ret = fcntl(fd, F_GETFD); ++ } while((ret < 0) && (errno == EINTR)) ; ++ ++ if(ret < 0) ++ return(-errno); ++ ++ *close_on_exec = (ret&FD_CLOEXEC) ? 1 : 0; ++ return(ret); ++} ++ ++int os_set_exec_close(int fd, int close_on_exec) ++{ ++ int flag, err; ++ ++ if(close_on_exec) flag = FD_CLOEXEC; ++ else flag = 0; ++ ++ do { ++ err = fcntl(fd, F_SETFD, flag); ++ } while((err < 0) && (errno == EINTR)) ; ++ ++ if(err < 0) ++ return(-errno); ++ return(err); ++} ++ + int os_pipe(int *fds, int stream, int close_on_exec) + { + int err, type = stream ? SOCK_STREAM : SOCK_DGRAM; + + err = socketpair(AF_UNIX, type, 0, fds); +- if(err) ++ if(err < 0) + return(-errno); + + if(!close_on_exec) + return(0); + +- if((fcntl(fds[0], F_SETFD, 1) < 0) || (fcntl(fds[1], F_SETFD, 1) < 0)) +- printk("os_pipe : Setting FD_CLOEXEC failed, errno = %d", +- errno); ++ err = os_set_exec_close(fds[0], 1); ++ if(err < 0) ++ goto error; ++ ++ err = os_set_exec_close(fds[1], 1); ++ if(err < 0) ++ goto error; + + return(0); ++ ++ error: ++ printk("os_pipe : Setting FD_CLOEXEC failed, err = %d\n", -err); ++ os_close_file(fds[1]); ++ os_close_file(fds[0]); ++ return(err); + } + + int os_set_fd_async(int fd, int owner) +@@ -270,7 +546,7 @@ + return(-EINVAL); + } + err = shutdown(fd, what); +- if(err) ++ if(err < 0) + return(-errno); + return(0); + } +@@ -315,7 +591,7 @@ + return(new); + } + +-int create_unix_socket(char *file, int len) ++int os_create_unix_socket(char *file, int len, int close_on_exec) + { + struct sockaddr_un addr; + int sock, err; +@@ -327,6 +603,13 @@ + return(-errno); + } + ++ if(close_on_exec) { ++ err = os_set_exec_close(sock, 1); ++ if(err < 0) ++ printk("create_unix_socket : close_on_exec failed, " ++ "err = %d", -err); ++ } ++ + addr.sun_family = AF_UNIX; + + /* XXX Be more careful about overflow */ +@@ -334,14 +617,45 @@ + + err = bind(sock, (struct sockaddr *) &addr, sizeof(addr)); + if (err < 0){ +- printk("create_listening_socket - bind failed, errno = %d\n", +- errno); ++ printk("create_listening_socket at '%s' - bind failed, " ++ "errno = %d\n", file, errno); + return(-errno); + } + + return(sock); + } + ++void os_flush_stdout(void) ++{ ++ fflush(stdout); ++} ++ ++int os_lock_file(int fd, int excl) ++{ ++ int type = excl ? F_WRLCK : F_RDLCK; ++ struct flock lock = ((struct flock) { .l_type = type, ++ .l_whence = SEEK_SET, ++ .l_start = 0, ++ .l_len = 0 } ); ++ int err, save; ++ ++ err = fcntl(fd, F_SETLK, &lock); ++ if(!err) ++ goto out; ++ ++ save = -errno; ++ err = fcntl(fd, F_GETLK, &lock); ++ if(err){ ++ err = -errno; ++ goto out; ++ } ++ ++ printk("F_SETLK failed, file already locked by pid %d\n", lock.l_pid); ++ err = save; ++ out: ++ return(err); ++} ++ + /* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically +Index: uml-2.6.7/arch/um/kernel/tt/sys-i386/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/sys-i386/Makefile 2004-07-16 19:36:33.266089248 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/sys-i386/Makefile 2004-07-16 19:47:23.750200632 +0300 +@@ -10,5 +10,3 @@ + + $(USER_OBJS) : %.o: %.c + $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< +- +-clean : +Index: uml-2.6.7/arch/um/kernel/skas/exec_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/exec_user.c 2004-07-16 19:36:07.836955064 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/exec_user.c 2004-07-16 19:47:24.798041336 +0300 +@@ -11,6 +11,7 @@ + #include <sys/ptrace.h> + #include "user.h" + #include "kern_util.h" ++#include "user_util.h" + #include "os.h" + #include "time_user.h" + +@@ -26,7 +27,7 @@ + + int user_thread(unsigned long stack, int flags) + { +- int pid, status; ++ int pid, status, err; + + pid = clone(user_thread_tramp, (void *) stack_sp(stack), + flags | CLONE_FILES | SIGCHLD, NULL); +@@ -35,7 +36,8 @@ + return(pid); + } + +- if(waitpid(pid, &status, WUNTRACED) < 0){ ++ CATCH_EINTR(err = waitpid(pid, &status, WUNTRACED)); ++ if(err < 0){ + printk("user_thread - waitpid failed, errno = %d\n", errno); + return(-errno); + } +Index: uml-2.6.7/arch/um/kernel/tt/mem_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/mem_user.c 2004-07-16 19:36:16.863582808 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/mem_user.c 2004-07-16 19:47:23.745201392 +0300 +@@ -25,14 +25,13 @@ + size = (unsigned long) segment_end - + (unsigned long) segment_start; + data = create_mem_file(size); +- if((addr = mmap(NULL, size, PROT_WRITE | PROT_READ, +- MAP_SHARED, data, 0)) == MAP_FAILED){ ++ addr = mmap(NULL, size, PROT_WRITE | PROT_READ, MAP_SHARED, data, 0); ++ if(addr == MAP_FAILED){ + perror("mapping new data segment"); + exit(1); + } + memcpy(addr, segment_start, size); +- if(switcheroo(data, prot, addr, segment_start, +- size) < 0){ ++ if(switcheroo(data, prot, addr, segment_start, size) < 0){ + printf("switcheroo failed\n"); + exit(1); + } +Index: uml-2.6.7/arch/um/kernel/ksyms.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/ksyms.c 2004-07-16 19:35:55.815782560 +0300 ++++ uml-2.6.7/arch/um/kernel/ksyms.c 2004-07-16 19:47:24.866031000 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2001 - 2004 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -8,7 +8,7 @@ + #include "linux/string.h" + #include "linux/smp_lock.h" + #include "linux/spinlock.h" +-#include <linux/highmem.h> ++#include "linux/highmem.h" + #include "asm/current.h" + #include "asm/delay.h" + #include "asm/processor.h" +@@ -19,6 +19,7 @@ + #include "asm/tlbflush.h" + #include "kern_util.h" + #include "user_util.h" ++#include "mem_user.h" + #include "os.h" + #include "helper.h" + +@@ -34,34 +35,66 @@ + EXPORT_SYMBOL(flush_tlb_range); + EXPORT_SYMBOL(host_task_size); + EXPORT_SYMBOL(arch_validate); ++EXPORT_SYMBOL(get_kmem_end); + +-EXPORT_SYMBOL(region_pa); +-EXPORT_SYMBOL(region_va); +-EXPORT_SYMBOL(phys_mem_map); +-EXPORT_SYMBOL(page_mem_map); + EXPORT_SYMBOL(page_to_phys); + EXPORT_SYMBOL(phys_to_page); + EXPORT_SYMBOL(high_physmem); + EXPORT_SYMBOL(empty_zero_page); + EXPORT_SYMBOL(um_virt_to_phys); ++EXPORT_SYMBOL(__virt_to_page); ++EXPORT_SYMBOL(to_phys); ++EXPORT_SYMBOL(to_virt); + EXPORT_SYMBOL(mode_tt); + EXPORT_SYMBOL(handle_page_fault); ++EXPORT_SYMBOL(find_iomem); + ++#ifdef CONFIG_MODE_TT ++EXPORT_SYMBOL(strncpy_from_user_tt); ++EXPORT_SYMBOL(copy_from_user_tt); ++EXPORT_SYMBOL(copy_to_user_tt); ++#endif ++ ++#ifdef CONFIG_MODE_SKAS ++EXPORT_SYMBOL(strncpy_from_user_skas); ++EXPORT_SYMBOL(copy_to_user_skas); ++EXPORT_SYMBOL(copy_from_user_skas); ++#endif ++ ++EXPORT_SYMBOL(os_stat_fd); ++EXPORT_SYMBOL(os_stat_file); ++EXPORT_SYMBOL(os_access); ++EXPORT_SYMBOL(os_print_error); ++EXPORT_SYMBOL(os_get_exec_close); ++EXPORT_SYMBOL(os_set_exec_close); + EXPORT_SYMBOL(os_getpid); + EXPORT_SYMBOL(os_open_file); + EXPORT_SYMBOL(os_read_file); + EXPORT_SYMBOL(os_write_file); + EXPORT_SYMBOL(os_seek_file); ++EXPORT_SYMBOL(os_lock_file); ++EXPORT_SYMBOL(os_ioctl_generic); + EXPORT_SYMBOL(os_pipe); + EXPORT_SYMBOL(os_file_type); ++EXPORT_SYMBOL(os_file_mode); ++EXPORT_SYMBOL(os_file_size); ++EXPORT_SYMBOL(os_flush_stdout); + EXPORT_SYMBOL(os_close_file); ++EXPORT_SYMBOL(os_set_fd_async); ++EXPORT_SYMBOL(os_set_fd_block); + EXPORT_SYMBOL(helper_wait); + EXPORT_SYMBOL(os_shutdown_socket); ++EXPORT_SYMBOL(os_create_unix_socket); + EXPORT_SYMBOL(os_connect_socket); ++EXPORT_SYMBOL(os_accept_connection); ++EXPORT_SYMBOL(os_rcv_fd); + EXPORT_SYMBOL(run_helper); + EXPORT_SYMBOL(start_thread); + EXPORT_SYMBOL(dump_thread); + ++EXPORT_SYMBOL(do_gettimeofday); ++EXPORT_SYMBOL(do_settimeofday); ++ + /* This is here because UML expands open to sys_open, not to a system + * call instruction. + */ +@@ -90,3 +123,13 @@ + EXPORT_SYMBOL(kmap_atomic_to_page); + #endif + ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/include/linux/gfp.h +=================================================================== +--- uml-2.6.7.orig/include/linux/gfp.h 2004-07-16 19:36:13.897033792 +0300 ++++ uml-2.6.7/include/linux/gfp.h 2004-07-16 19:47:23.805192272 +0300 +@@ -73,6 +73,11 @@ + * For the normal case of non-DISCONTIGMEM systems the NODE_DATA() gets + * optimized to &contig_page_data at compile-time. + */ ++ ++#ifndef HAVE_ARCH_FREE_PAGE ++static inline void arch_free_page(struct page *page, int order) { } ++#endif ++ + extern struct page * + FASTCALL(__alloc_pages(unsigned int, unsigned int, struct zonelist *)); + +Index: uml-2.6.7/arch/um/defconfig +=================================================================== +--- uml-2.6.7.orig/arch/um/defconfig 2004-07-16 19:37:02.601629568 +0300 ++++ uml-2.6.7/arch/um/defconfig 2004-07-16 19:47:23.676211880 +0300 +@@ -3,29 +3,19 @@ + # + CONFIG_USERMODE=y + CONFIG_MMU=y +-CONFIG_SWAP=y + CONFIG_UID16=y + CONFIG_RWSEM_GENERIC_SPINLOCK=y +-CONFIG_CONFIG_LOG_BUF_SHIFT=14 + + # +-# Code maturity level options +-# +-CONFIG_EXPERIMENTAL=y +- +-# +-# General Setup ++# UML-specific options + # + CONFIG_MODE_TT=y + CONFIG_MODE_SKAS=y + CONFIG_NET=y +-CONFIG_SYSVIPC=y +-CONFIG_BSD_PROCESS_ACCT=y +-CONFIG_SYSCTL=y +-CONFIG_BINFMT_AOUT=y + CONFIG_BINFMT_ELF=y + CONFIG_BINFMT_MISC=y + CONFIG_HOSTFS=y ++CONFIG_HPPFS=y + CONFIG_MCONSOLE=y + CONFIG_MAGIC_SYSRQ=y + # CONFIG_HOST_2G_2G is not set +@@ -36,12 +26,43 @@ + # CONFIG_HIGHMEM is not set + CONFIG_PROC_MM=y + CONFIG_KERNEL_STACK_ORDER=2 ++CONFIG_UML_REAL_TIME_CLOCK=y ++ ++# ++# Code maturity level options ++# ++CONFIG_EXPERIMENTAL=y ++CONFIG_CLEAN_COMPILE=y ++CONFIG_STANDALONE=y ++CONFIG_BROKEN_ON_SMP=y ++ ++# ++# General setup ++# ++CONFIG_SWAP=y ++CONFIG_SYSVIPC=y ++CONFIG_BSD_PROCESS_ACCT=y ++CONFIG_SYSCTL=y ++CONFIG_LOG_BUF_SHIFT=14 ++# CONFIG_HOTPLUG is not set ++# CONFIG_IKCONFIG is not set ++# CONFIG_EMBEDDED is not set ++CONFIG_KALLSYMS=y ++CONFIG_FUTEX=y ++CONFIG_EPOLL=y ++CONFIG_IOSCHED_NOOP=y ++CONFIG_IOSCHED_AS=y ++CONFIG_IOSCHED_DEADLINE=y ++# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set + + # + # Loadable module support + # +-CONFIG_MODULES=y +-# CONFIG_KMOD is not set ++# CONFIG_MODULES is not set ++ ++# ++# Generic Driver Options ++# + + # + # Character Devices +@@ -69,6 +90,7 @@ + # + CONFIG_BLK_DEV_UBD=y + # CONFIG_BLK_DEV_UBD_SYNC is not set ++CONFIG_BLK_DEV_COW_COMMON=y + CONFIG_BLK_DEV_LOOP=y + CONFIG_BLK_DEV_NBD=y + CONFIG_BLK_DEV_RAM=y +@@ -78,7 +100,7 @@ + CONFIG_NETDEVICES=y + + # +-# Network Devices ++# UML Network Devices + # + CONFIG_UML_NET=y + CONFIG_UML_NET_ETHERTAP=y +@@ -88,22 +110,6 @@ + CONFIG_UML_NET_MCAST=y + # CONFIG_UML_NET_PCAP is not set + CONFIG_UML_NET_SLIRP=y +-CONFIG_DUMMY=y +-# CONFIG_BONDING is not set +-# CONFIG_EQUALIZER is not set +-CONFIG_TUN=y +-# CONFIG_ETHERTAP is not set +-CONFIG_PPP=y +-# CONFIG_PPP_MULTILINK is not set +-# CONFIG_PPP_ASYNC is not set +-# CONFIG_PPP_SYNC_TTY is not set +-# CONFIG_PPP_DEFLATE is not set +-# CONFIG_PPP_BSDCOMP is not set +-# CONFIG_PPPOE is not set +-CONFIG_SLIP=y +-# CONFIG_SLIP_COMPRESSED is not set +-# CONFIG_SLIP_SMART is not set +-# CONFIG_SLIP_MODE_SLIP6 is not set + + # + # Networking support +@@ -115,8 +121,6 @@ + CONFIG_PACKET=y + CONFIG_PACKET_MMAP=y + # CONFIG_NETLINK_DEV is not set +-# CONFIG_NETFILTER is not set +-# CONFIG_FILTER is not set + CONFIG_UNIX=y + # CONFIG_NET_KEY is not set + CONFIG_INET=y +@@ -130,8 +134,11 @@ + # CONFIG_SYN_COOKIES is not set + # CONFIG_INET_AH is not set + # CONFIG_INET_ESP is not set +-# CONFIG_XFRM_USER is not set ++# CONFIG_INET_IPCOMP is not set + # CONFIG_IPV6 is not set ++# CONFIG_DECNET is not set ++# CONFIG_BRIDGE is not set ++# CONFIG_NETFILTER is not set + + # + # SCTP Configuration (EXPERIMENTAL) +@@ -140,9 +147,9 @@ + # 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_LLC2 is not set ++# CONFIG_IPX is not set ++# CONFIG_ATALK is not set + # CONFIG_X25 is not set + # CONFIG_LAPB is not set + # CONFIG_NET_DIVERT is not set +@@ -160,6 +167,10 @@ + # Network testing + # + # CONFIG_NET_PKTGEN is not set ++CONFIG_DUMMY=y ++# CONFIG_BONDING is not set ++# CONFIG_EQUALIZER is not set ++CONFIG_TUN=y + + # + # Ethernet (10 or 100Mbit) +@@ -171,12 +182,28 @@ + # + + # ++# Ethernet (10000 Mbit) ++# ++CONFIG_PPP=y ++# CONFIG_PPP_MULTILINK is not set ++# CONFIG_PPP_FILTER is not set ++# CONFIG_PPP_ASYNC is not set ++# CONFIG_PPP_SYNC_TTY is not set ++# CONFIG_PPP_DEFLATE is not set ++# CONFIG_PPP_BSDCOMP is not set ++# CONFIG_PPPOE is not set ++CONFIG_SLIP=y ++# CONFIG_SLIP_COMPRESSED is not set ++# CONFIG_SLIP_SMART is not set ++# CONFIG_SLIP_MODE_SLIP6 is not set ++ ++# + # Wireless LAN (non-hamradio) + # + # CONFIG_NET_RADIO is not set + + # +-# Token Ring devices (depends on LLC=y) ++# Token Ring devices + # + # CONFIG_SHAPER is not set + +@@ -186,68 +213,100 @@ + # CONFIG_WAN is not set + + # ++# Amateur Radio support ++# ++# CONFIG_HAMRADIO is not set ++ ++# ++# IrDA (infrared) support ++# ++# CONFIG_IRDA is not set ++ ++# ++# Bluetooth support ++# ++# CONFIG_BT is not set ++ ++# + # File systems + # ++CONFIG_EXT2_FS=y ++# CONFIG_EXT2_FS_XATTR is not set ++# CONFIG_EXT3_FS is not set ++# CONFIG_JBD is not set ++CONFIG_REISERFS_FS=y ++# CONFIG_REISERFS_CHECK is not set ++# CONFIG_REISERFS_PROC_INFO is not set ++# CONFIG_JFS_FS is not set ++# CONFIG_XFS_FS is not set ++CONFIG_MINIX_FS=y ++# CONFIG_ROMFS_FS is not set + CONFIG_QUOTA=y + # CONFIG_QFMT_V1 is not set + # CONFIG_QFMT_V2 is not set + CONFIG_QUOTACTL=y +-CONFIG_AUTOFS_FS=m +-CONFIG_AUTOFS4_FS=m +-CONFIG_REISERFS_FS=m +-# CONFIG_REISERFS_CHECK is not set +-# CONFIG_REISERFS_PROC_INFO is not set ++CONFIG_AUTOFS_FS=y ++CONFIG_AUTOFS4_FS=y ++ ++# ++# CD-ROM/DVD Filesystems ++# ++CONFIG_ISO9660_FS=y ++# CONFIG_JOLIET is not set ++# CONFIG_ZISOFS is not set ++# CONFIG_UDF_FS is not set ++ ++# ++# DOS/FAT/NT Filesystems ++# ++CONFIG_FAT_FS=y ++CONFIG_MSDOS_FS=y ++CONFIG_VFAT_FS=y ++# CONFIG_NTFS_FS is not set ++ ++# ++# Pseudo filesystems ++# ++CONFIG_PROC_FS=y ++CONFIG_PROC_KCORE=y ++CONFIG_DEVFS_FS=y ++CONFIG_DEVFS_MOUNT=y ++# CONFIG_DEVFS_DEBUG is not set ++# CONFIG_DEVPTS_FS_XATTR is not set ++CONFIG_TMPFS=y ++# CONFIG_HUGETLB_PAGE is not set ++CONFIG_RAMFS=y ++ ++# ++# Miscellaneous filesystems ++# + # CONFIG_ADFS_FS is not set + # CONFIG_AFFS_FS is not set + # CONFIG_HFS_FS is not set ++# CONFIG_HFSPLUS_FS is not set + # CONFIG_BEFS_FS is not set + # CONFIG_BFS_FS is not set +-# CONFIG_EXT3_FS is not set +-# CONFIG_JBD is not set +-CONFIG_FAT_FS=m +-CONFIG_MSDOS_FS=m +-CONFIG_VFAT_FS=m + # CONFIG_EFS_FS is not set + CONFIG_JFFS_FS=y + CONFIG_JFFS_FS_VERBOSE=0 +-CONFIG_JFFS_PROC_FS=y + # CONFIG_JFFS2_FS is not set + # CONFIG_CRAMFS is not set +-# CONFIG_TMPFS is not set +-CONFIG_RAMFS=y +-CONFIG_ISO9660_FS=m +-# CONFIG_JOLIET is not set +-# CONFIG_ZISOFS is not set +-# CONFIG_JFS_FS is not set +-CONFIG_MINIX_FS=m + # CONFIG_VXFS_FS is not set +-# CONFIG_NTFS_FS is not set + # CONFIG_HPFS_FS is not set +-CONFIG_PROC_FS=y +-CONFIG_DEVFS_FS=y +-CONFIG_DEVFS_MOUNT=y +-# CONFIG_DEVFS_DEBUG is not set +-CONFIG_DEVPTS_FS=y + # CONFIG_QNX4FS_FS is not set +-# CONFIG_ROMFS_FS is not set +-CONFIG_EXT2_FS=y +-# CONFIG_EXT2_FS_XATTR is not set + # CONFIG_SYSV_FS is not set +-# CONFIG_UDF_FS is not set + # CONFIG_UFS_FS is not set +-# CONFIG_XFS_FS is not set + + # + # Network File Systems + # +-# CONFIG_CODA_FS is not set +-# CONFIG_INTERMEZZO_FS is not set + # CONFIG_NFS_FS is not set + # CONFIG_NFSD is not set + # CONFIG_EXPORTFS is not set +-# CONFIG_CIFS 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_AFS_FS is not set + + # +@@ -255,11 +314,11 @@ + # + # CONFIG_PARTITION_ADVANCED is not set + CONFIG_MSDOS_PARTITION=y +-CONFIG_NLS=y + + # + # Native Language Support + # ++CONFIG_NLS=y + CONFIG_NLS_DEFAULT="iso8859-1" + # CONFIG_NLS_CODEPAGE_437 is not set + # CONFIG_NLS_CODEPAGE_737 is not set +@@ -317,28 +376,7 @@ + # + # SCSI support + # +-CONFIG_SCSI=y +-CONFIG_GENERIC_ISA_DMA=y +- +-# +-# SCSI support type (disk, tape, CD-ROM) +-# +-CONFIG_BLK_DEV_SD=y +-CONFIG_SD_EXTRA_DEVS=40 +-CONFIG_CHR_DEV_ST=y +-CONFIG_BLK_DEV_SR=y +-CONFIG_BLK_DEV_SR_VENDOR=y +-CONFIG_SR_EXTRA_DEVS=2 +-CONFIG_CHR_DEV_SG=y +- +-# +-# Some SCSI devices (e.g. CD jukebox) support multiple LUNs +-# +-CONFIG_SCSI_DEBUG_QUEUES=y +-CONFIG_SCSI_MULTI_LUN=y +-CONFIG_SCSI_CONSTANTS=y +-CONFIG_SCSI_LOGGING=y +-CONFIG_SCSI_DEBUG=y ++# CONFIG_SCSI is not set + + # + # Multi-device support (RAID and LVM) +@@ -360,6 +398,7 @@ + CONFIG_MTD_BLOCK=y + # CONFIG_FTL is not set + # CONFIG_NFTL is not set ++# CONFIG_INFTL is not set + + # + # RAM/ROM/Flash chip drivers +@@ -374,20 +413,21 @@ + # + # Mapping drivers for chip access + # ++# CONFIG_MTD_COMPLEX_MAPPINGS is not set + + # + # Self-contained MTD device drivers + # + # CONFIG_MTD_SLRAM is not set + # CONFIG_MTD_MTDRAM is not set +-CONFIG_MTD_BLKMTD=m ++CONFIG_MTD_BLKMTD=y + + # + # Disk-On-Chip Device Drivers + # +-# CONFIG_MTD_DOC1000 is not set + # CONFIG_MTD_DOC2000 is not set + # CONFIG_MTD_DOC2001 is not set ++# CONFIG_MTD_DOC2001PLUS is not set + + # + # NAND Flash Device Drivers +Index: uml-2.6.7/arch/um/kernel/physmem.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/physmem.c 2004-07-16 19:47:23.617220848 +0300 ++++ uml-2.6.7/arch/um/kernel/physmem.c 2004-07-16 19:47:23.722204888 +0300 +@@ -0,0 +1,468 @@ ++/* ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) ++ * Licensed under the GPL ++ */ ++ ++#include "linux/mm.h" ++#include "linux/ghash.h" ++#include "linux/slab.h" ++#include "linux/vmalloc.h" ++#include "linux/bootmem.h" ++#include "asm/types.h" ++#include "asm/pgtable.h" ++#include "kern_util.h" ++#include "user_util.h" ++#include "mode_kern.h" ++#include "mem.h" ++#include "mem_user.h" ++#include "os.h" ++#include "kern.h" ++#include "init.h" ++ ++#if 0 ++static pgd_t physmem_pgd[PTRS_PER_PGD]; ++ ++static struct phys_desc *lookup_mapping(void *addr) ++{ ++ pgd = &physmem_pgd[pgd_index(addr)]; ++ if(pgd_none(pgd)) ++ return(NULL); ++ ++ pmd = pmd_offset(pgd, addr); ++ if(pmd_none(pmd)) ++ return(NULL); ++ ++ pte = pte_offset_kernel(pmd, addr); ++ return((struct phys_desc *) pte_val(pte)); ++} ++ ++static struct add_mapping(void *addr, struct phys_desc *new) ++{ ++} ++#endif ++ ++#define PHYS_HASHSIZE (8192) ++ ++struct phys_desc; ++ ++DEF_HASH_STRUCTS(virtmem, PHYS_HASHSIZE, struct phys_desc); ++ ++struct phys_desc { ++ struct virtmem_ptrs virt_ptrs; ++ int fd; ++ __u64 offset; ++ void *virt; ++ unsigned long phys; ++ struct list_head list; ++}; ++ ++struct virtmem_table virtmem_hash; ++ ++static int virt_cmp(void *virt1, void *virt2) ++{ ++ return(virt1 != virt2); ++} ++ ++static int virt_hash(void *virt) ++{ ++ unsigned long addr = ((unsigned long) virt) >> PAGE_SHIFT; ++ return(addr % PHYS_HASHSIZE); ++} ++ ++DEF_HASH(static, virtmem, struct phys_desc, virt_ptrs, void *, virt, virt_cmp, ++ virt_hash); ++ ++LIST_HEAD(descriptor_mappings); ++ ++struct desc_mapping { ++ int fd; ++ struct list_head list; ++ struct list_head pages; ++}; ++ ++static struct desc_mapping *find_mapping(int fd) ++{ ++ struct desc_mapping *desc; ++ struct list_head *ele; ++ ++ list_for_each(ele, &descriptor_mappings){ ++ desc = list_entry(ele, struct desc_mapping, list); ++ if(desc->fd == fd) ++ return(desc); ++ } ++ ++ return(NULL); ++} ++ ++static struct desc_mapping *descriptor_mapping(int fd) ++{ ++ struct desc_mapping *desc; ++ ++ desc = find_mapping(fd); ++ if(desc != NULL) ++ return(desc); ++ ++ desc = kmalloc(sizeof(*desc), GFP_ATOMIC); ++ if(desc == NULL) ++ return(NULL); ++ ++ *desc = ((struct desc_mapping) ++ { .fd = fd, ++ .list = LIST_HEAD_INIT(desc->list), ++ .pages = LIST_HEAD_INIT(desc->pages) }); ++ list_add(&desc->list, &descriptor_mappings); ++ ++ return(desc); ++} ++ ++int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w) ++{ ++ struct desc_mapping *fd_maps; ++ struct phys_desc *desc; ++ unsigned long phys; ++ int err; ++ ++ fd_maps = descriptor_mapping(fd); ++ if(fd_maps == NULL) ++ return(-ENOMEM); ++ ++ phys = __pa(virt); ++ if(find_virtmem_hash(&virtmem_hash, virt) != NULL) ++ panic("Address 0x%p is already substituted\n", virt); ++ ++ err = -ENOMEM; ++ desc = kmalloc(sizeof(*desc), GFP_ATOMIC); ++ if(desc == NULL) ++ goto out; ++ ++ *desc = ((struct phys_desc) ++ { .virt_ptrs = { NULL, NULL }, ++ .fd = fd, ++ .offset = offset, ++ .virt = virt, ++ .phys = __pa(virt), ++ .list = LIST_HEAD_INIT(desc->list) }); ++ insert_virtmem_hash(&virtmem_hash, desc); ++ ++ list_add(&desc->list, &fd_maps->pages); ++ ++ virt = (void *) ((unsigned long) virt & PAGE_MASK); ++ err = os_map_memory(virt, fd, offset, PAGE_SIZE, 1, w, 0); ++ if(!err) ++ goto out; ++ ++ remove_virtmem_hash(&virtmem_hash, desc); ++ kfree(desc); ++ out: ++ return(err); ++} ++ ++static int physmem_fd = -1; ++ ++static void remove_mapping(struct phys_desc *desc) ++{ ++ void *virt = desc->virt; ++ int err; ++ ++ remove_virtmem_hash(&virtmem_hash, desc); ++ list_del(&desc->list); ++ kfree(desc); ++ ++ err = os_map_memory(virt, physmem_fd, __pa(virt), PAGE_SIZE, 1, 1, 0); ++ if(err) ++ panic("Failed to unmap block device page from physical memory, " ++ "errno = %d", -err); ++} ++ ++int physmem_remove_mapping(void *virt) ++{ ++ struct phys_desc *desc; ++ ++ virt = (void *) ((unsigned long) virt & PAGE_MASK); ++ desc = find_virtmem_hash(&virtmem_hash, virt); ++ if(desc == NULL) ++ return(0); ++ ++ remove_mapping(desc); ++ return(1); ++} ++ ++void physmem_forget_descriptor(int fd) ++{ ++ struct desc_mapping *desc; ++ struct phys_desc *page; ++ struct list_head *ele, *next; ++ __u64 offset; ++ void *addr; ++ int err; ++ ++ desc = find_mapping(fd); ++ if(desc == NULL) ++ return; ++ ++ list_for_each_safe(ele, next, &desc->pages){ ++ page = list_entry(ele, struct phys_desc, list); ++ offset = page->offset; ++ addr = page->virt; ++ remove_mapping(page); ++ err = os_seek_file(fd, offset); ++ if(err) ++ panic("physmem_forget_descriptor - failed to seek " ++ "to %lld in fd %d, error = %d\n", ++ offset, fd, -err); ++ err = os_read_file(fd, addr, PAGE_SIZE); ++ if(err < 0) ++ panic("physmem_forget_descriptor - failed to read " ++ "from fd %d to 0x%p, error = %d\n", ++ fd, addr, -err); ++ } ++ ++ list_del(&desc->list); ++ kfree(desc); ++} ++ ++void arch_free_page(struct page *page, int order) ++{ ++ void *virt; ++ int i; ++ ++ for(i = 0; i < (1 << order); i++){ ++ virt = __va(page_to_phys(page + i)); ++ physmem_remove_mapping(virt); ++ } ++} ++ ++int is_remapped(void *virt) ++{ ++ return(find_virtmem_hash(&virtmem_hash, virt) != NULL); ++} ++ ++/* Changed during early boot */ ++unsigned long high_physmem; ++ ++extern unsigned long physmem_size; ++ ++void *to_virt(unsigned long phys) ++{ ++ return((void *) uml_physmem + phys); ++} ++ ++unsigned long to_phys(void *virt) ++{ ++ return(((unsigned long) virt) - uml_physmem); ++} ++ ++int init_maps(unsigned long physmem, unsigned long iomem, unsigned long highmem) ++{ ++ struct page *p, *map; ++ unsigned long phys_len, phys_pages, highmem_len, highmem_pages; ++ unsigned long iomem_len, iomem_pages, total_len, total_pages; ++ int i; ++ ++ phys_pages = physmem >> PAGE_SHIFT; ++ phys_len = phys_pages * sizeof(struct page); ++ ++ iomem_pages = iomem >> PAGE_SHIFT; ++ iomem_len = iomem_pages * sizeof(struct page); ++ ++ highmem_pages = highmem >> PAGE_SHIFT; ++ highmem_len = highmem_pages * sizeof(struct page); ++ ++ total_pages = phys_pages + iomem_pages + highmem_pages; ++ total_len = phys_len + iomem_pages + highmem_len; ++ ++ if(kmalloc_ok){ ++ map = kmalloc(total_len, GFP_KERNEL); ++ if(map == NULL) ++ map = vmalloc(total_len); ++ } ++ else map = alloc_bootmem_low_pages(total_len); ++ ++ if(map == NULL) ++ return(-ENOMEM); ++ ++ for(i = 0; i < total_pages; i++){ ++ p = &map[i]; ++ set_page_count(p, 0); ++ SetPageReserved(p); ++ INIT_LIST_HEAD(&p->lru); ++ } ++ ++ mem_map = map; ++ max_mapnr = total_pages; ++ return(0); ++} ++ ++struct page *phys_to_page(const unsigned long phys) ++{ ++ return(&mem_map[phys >> PAGE_SHIFT]); ++} ++ ++struct page *__virt_to_page(const unsigned long virt) ++{ ++ return(&mem_map[__pa(virt) >> PAGE_SHIFT]); ++} ++ ++unsigned long page_to_phys(struct page *page) ++{ ++ return((page - mem_map) << PAGE_SHIFT); ++} ++ ++pte_t mk_pte(struct page *page, pgprot_t pgprot) ++{ ++ pte_t pte; ++ ++ pte_val(pte) = page_to_phys(page) + pgprot_val(pgprot); ++ if(pte_present(pte)) pte_mknewprot(pte_mknewpage(pte)); ++ return(pte); ++} ++ ++/* Changed during early boot */ ++static unsigned long kmem_top = 0; ++ ++unsigned long get_kmem_end(void) ++{ ++ if(kmem_top == 0) ++ kmem_top = CHOOSE_MODE(kmem_end_tt, kmem_end_skas); ++ return(kmem_top); ++} ++ ++void map_memory(unsigned long virt, unsigned long phys, unsigned long len, ++ int r, int w, int x) ++{ ++ __u64 offset; ++ int fd, err; ++ ++ fd = phys_mapping(phys, &offset); ++ err = os_map_memory((void *) virt, fd, offset, len, r, w, x); ++ if(err) ++ panic("map_memory(0x%lx, %d, 0x%llx, %ld, %d, %d, %d) failed, " ++ "err = %d\n", virt, fd, offset, len, r, w, x, err); ++} ++ ++#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) ++ ++void setup_physmem(unsigned long start, unsigned long reserve_end, ++ unsigned long len, unsigned long highmem) ++{ ++ unsigned long reserve = reserve_end - start; ++ int pfn = PFN_UP(__pa(reserve_end)); ++ int delta = (len - reserve) >> PAGE_SHIFT; ++ int err, offset, bootmap_size; ++ ++ physmem_fd = create_mem_file(len + highmem); ++ ++ offset = uml_reserved - uml_physmem; ++ err = os_map_memory((void *) uml_reserved, physmem_fd, offset, ++ len - offset, 1, 1, 0); ++ if(err < 0){ ++ os_print_error(err, "Mapping memory"); ++ exit(1); ++ } ++ ++ bootmap_size = init_bootmem(pfn, pfn + delta); ++ free_bootmem(__pa(reserve_end) + bootmap_size, ++ len - bootmap_size - reserve); ++} ++ ++int phys_mapping(unsigned long phys, __u64 *offset_out) ++{ ++ struct phys_desc *desc = find_virtmem_hash(&virtmem_hash, ++ __va(phys & PAGE_MASK)); ++ int fd = -1; ++ ++ if(desc != NULL){ ++ fd = desc->fd; ++ *offset_out = desc->offset; ++ } ++ else if(phys < physmem_size){ ++ fd = physmem_fd; ++ *offset_out = phys; ++ } ++ else if(phys < __pa(end_iomem)){ ++ struct iomem_region *region = iomem_regions; ++ ++ while(region != NULL){ ++ if((phys >= region->phys) && ++ (phys < region->phys + region->size)){ ++ fd = region->fd; ++ *offset_out = phys - region->phys; ++ break; ++ } ++ region = region->next; ++ } ++ } ++ else if(phys < __pa(end_iomem) + highmem){ ++ fd = physmem_fd; ++ *offset_out = phys - iomem_size; ++ } ++ ++ return(fd); ++} ++ ++static int __init uml_mem_setup(char *line, int *add) ++{ ++ char *retptr; ++ physmem_size = memparse(line,&retptr); ++ return 0; ++} ++__uml_setup("mem=", uml_mem_setup, ++"mem=<Amount of desired ram>\n" ++" This controls how much \"physical\" memory the kernel allocates\n" ++" for the system. The size is specified as a number followed by\n" ++" one of 'k', 'K', 'm', 'M', which have the obvious meanings.\n" ++" This is not related to the amount of memory in the host. It can\n" ++" be more, and the excess, if it's ever used, will just be swapped out.\n" ++" Example: mem=64M\n\n" ++); ++ ++unsigned long find_iomem(char *driver, unsigned long *len_out) ++{ ++ struct iomem_region *region = iomem_regions; ++ ++ while(region != NULL){ ++ if(!strcmp(region->driver, driver)){ ++ *len_out = region->size; ++ return(region->virt); ++ } ++ } ++ ++ return(0); ++} ++ ++int setup_iomem(void) ++{ ++ struct iomem_region *region = iomem_regions; ++ unsigned long iomem_start = high_physmem + PAGE_SIZE; ++ int err; ++ ++ while(region != NULL){ ++ err = os_map_memory((void *) iomem_start, region->fd, 0, ++ region->size, 1, 1, 0); ++ if(err) ++ printk("Mapping iomem region for driver '%s' failed, " ++ "errno = %d\n", region->driver, -err); ++ else { ++ region->virt = iomem_start; ++ region->phys = __pa(region->virt); ++ } ++ ++ iomem_start += region->size + PAGE_SIZE; ++ region = region->next; ++ } ++ ++ return(0); ++} ++ ++__initcall(setup_iomem); ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/kernel/irq_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/irq_user.c 2004-07-16 19:36:33.534048512 +0300 ++++ uml-2.6.7/arch/um/kernel/irq_user.c 2004-07-16 19:47:23.717205648 +0300 +@@ -6,7 +6,6 @@ + #include <stdlib.h> + #include <unistd.h> + #include <errno.h> +-#include <fcntl.h> + #include <signal.h> + #include <string.h> + #include <sys/poll.h> +@@ -49,7 +48,8 @@ + + if(smp_sigio_handler()) return; + while(1){ +- if((n = poll(pollfds, pollfds_num, 0)) < 0){ ++ n = poll(pollfds, pollfds_num, 0); ++ if(n < 0){ + if(errno == EINTR) continue; + printk("sigio_handler : poll returned %d, " + "errno = %d\n", n, errno); +@@ -366,34 +366,31 @@ + + void forward_ipi(int fd, int pid) + { +- if(fcntl(fd, F_SETOWN, pid) < 0){ +- int save_errno = errno; +- if(fcntl(fd, F_GETOWN, 0) != pid){ +- printk("forward_ipi: F_SETOWN failed, fd = %d, " +- "me = %d, target = %d, errno = %d\n", fd, +- os_getpid(), pid, save_errno); +- } +- } ++ int err; ++ ++ err = os_set_owner(fd, pid); ++ if(err < 0) ++ printk("forward_ipi: set_owner failed, fd = %d, me = %d, " ++ "target = %d, err = %d\n", fd, os_getpid(), pid, -err); + } + + void forward_interrupts(int pid) + { + struct irq_fd *irq; + unsigned long flags; ++ int err; + + flags = irq_lock(); + for(irq=active_fds;irq != NULL;irq = irq->next){ +- if(fcntl(irq->fd, F_SETOWN, pid) < 0){ +- int save_errno = errno; +- if(fcntl(irq->fd, F_GETOWN, 0) != pid){ +- /* XXX Just remove the irq rather than +- * print out an infinite stream of these +- */ +- printk("Failed to forward %d to pid %d, " +- "errno = %d\n", irq->fd, pid, +- save_errno); +- } ++ err = os_set_owner(irq->fd, pid); ++ if(err < 0){ ++ /* XXX Just remove the irq rather than ++ * print out an infinite stream of these ++ */ ++ printk("Failed to forward %d to pid %d, err = %d\n", ++ irq->fd, pid, -err); + } ++ + irq->pid = pid; + } + irq_unlock(flags); +Index: uml-2.6.7/arch/um/include/line.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/line.h 2004-07-16 19:37:13.937906192 +0300 ++++ uml-2.6.7/arch/um/include/line.h 2004-07-16 19:47:23.702207928 +0300 +@@ -9,12 +9,14 @@ + #include "linux/list.h" + #include "linux/workqueue.h" + #include "linux/tty.h" ++#include "linux/interrupt.h" + #include "asm/semaphore.h" + #include "chan_user.h" + #include "mconsole_kern.h" + + struct line_driver { + char *name; ++ char *device_name; + char *devfs_name; + short major; + short minor_start; +@@ -67,8 +69,6 @@ + + #define LINES_INIT(n) { num : n } + +-extern void line_interrupt(int irq, void *data, struct pt_regs *unused); +-extern void line_write_interrupt(int irq, void *data, struct pt_regs *unused); + extern void line_close(struct line *lines, struct tty_struct *tty); + extern int line_open(struct line *lines, struct tty_struct *tty, + struct chan_opts *opts); +Index: uml-2.6.7/arch/um/sys-i386/fault.c +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-i386/fault.c 2004-07-16 19:36:42.987611352 +0300 ++++ uml-2.6.7/arch/um/sys-i386/fault.c 2004-07-16 19:47:23.771197440 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2002 - 2004 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -7,16 +7,24 @@ + #include "sysdep/ptrace.h" + #include "sysdep/sigcontext.h" + +-extern unsigned long search_exception_table(unsigned long addr); ++/* These two are from asm-um/uaccess.h and linux/module.h, check them. */ ++struct exception_table_entry ++{ ++ unsigned long insn; ++ unsigned long fixup; ++}; + ++const struct exception_table_entry *search_exception_tables(unsigned long add); ++ ++/* Compare this to arch/i386/mm/extable.c:fixup_exception() */ + int arch_fixup(unsigned long address, void *sc_ptr) + { + struct sigcontext *sc = sc_ptr; +- unsigned long fixup; ++ const struct exception_table_entry *fixup; + + fixup = search_exception_tables(address); + if(fixup != 0){ +- sc->eip = fixup; ++ sc->eip = fixup->fixup; + return(1); + } + return(0); +Index: uml-2.6.7/arch/um/kernel/smp.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/smp.c 2004-07-16 19:36:13.630074376 +0300 ++++ uml-2.6.7/arch/um/kernel/smp.c 2004-07-16 19:47:23.736202760 +0300 +@@ -1,9 +1,15 @@ + /* +- * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + + #include "linux/config.h" ++#include "linux/percpu.h" ++#include "asm/pgalloc.h" ++#include "asm/tlb.h" ++ ++/* For some reason, mmu_gathers are referenced when CONFIG_SMP is off. */ ++DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); + + #ifdef CONFIG_SMP + +@@ -23,7 +29,7 @@ + #include "os.h" + + /* CPU online map, set by smp_boot_cpus */ +-unsigned long cpu_online_map = cpumask_of_cpu(0); ++unsigned long cpu_online_map = CPU_MASK_NONE; + + EXPORT_SYMBOL(cpu_online_map); + +@@ -55,7 +61,7 @@ + + void smp_send_reschedule(int cpu) + { +- write(cpu_data[cpu].ipi_pipe[1], "R", 1); ++ os_write_file(cpu_data[cpu].ipi_pipe[1], "R", 1); + num_reschedules_sent++; + } + +@@ -100,35 +106,34 @@ + + printk(KERN_INFO "Stopping all CPUs..."); + for(i = 0; i < num_online_cpus(); i++){ +- if(i == current->thread_info->cpu) ++ if(i == current_thread->cpu) + continue; +- write(cpu_data[i].ipi_pipe[1], "S", 1); ++ os_write_file(cpu_data[i].ipi_pipe[1], "S", 1); + } + printk("done\n"); + } + +-static cpumask_t smp_commenced_mask; +-static cpumask_t smp_callin_map = CPU_MASK_NONE; ++static cpumask_t smp_commenced_mask = CPU_MASK_NONE; ++static cpumask_t cpu_callin_map = CPU_MASK_NONE; + + static int idle_proc(void *cpup) + { + int cpu = (int) cpup, err; + + err = os_pipe(cpu_data[cpu].ipi_pipe, 1, 1); +- if(err) +- panic("CPU#%d failed to create IPI pipe, errno = %d", cpu, +- -err); ++ if(err < 0) ++ panic("CPU#%d failed to create IPI pipe, err = %d", cpu, -err); + + activate_ipi(cpu_data[cpu].ipi_pipe[0], + current->thread.mode.tt.extern_pid); + + wmb(); +- if (cpu_test_and_set(cpu, &smp_callin_map)) { ++ if (cpu_test_and_set(cpu, cpu_callin_map)) { + printk("huh, CPU#%d already present??\n", cpu); + BUG(); + } + +- while (!cpu_isset(cpu, &smp_commenced_mask)) ++ while (!cpu_isset(cpu, smp_commenced_mask)) + cpu_relax(); + + cpu_set(cpu, cpu_online_map); +@@ -143,16 +148,20 @@ + + current->thread.request.u.thread.proc = idle_proc; + current->thread.request.u.thread.arg = (void *) cpu; +- new_task = do_fork(CLONE_VM | CLONE_IDLETASK, 0, NULL, 0, NULL, NULL); +- if(IS_ERR(new_task)) panic("do_fork failed in idle_thread"); ++ new_task = copy_process(CLONE_VM | CLONE_IDLETASK, 0, NULL, 0, NULL, ++ NULL); ++ if(IS_ERR(new_task)) ++ panic("copy_process failed in idle_thread, error = %ld", ++ PTR_ERR(new_task)); + + cpu_tasks[cpu] = ((struct cpu_task) + { .pid = new_task->thread.mode.tt.extern_pid, + .task = new_task } ); + idle_threads[cpu] = new_task; +- CHOOSE_MODE(write(new_task->thread.mode.tt.switch_pipe[1], &c, ++ CHOOSE_MODE(os_write_file(new_task->thread.mode.tt.switch_pipe[1], &c, + sizeof(c)), + ({ panic("skas mode doesn't support SMP"); })); ++ wake_up_forked_process(new_task); + return(new_task); + } + +@@ -160,15 +169,17 @@ + { + struct task_struct *idle; + unsigned long waittime; +- int err, cpu; ++ int err, cpu, me = smp_processor_id(); + +- cpu_set(0, cpu_online_map); +- cpu_set(0, smp_callin_map); ++ cpu_clear(me, cpu_online_map); ++ cpu_set(me, cpu_online_map); ++ cpu_set(me, cpu_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); ++ err = os_pipe(cpu_data[me].ipi_pipe, 1, 1); ++ if(err < 0) ++ panic("CPU#0 failed to create IPI pipe, errno = %d", -err); + +- activate_ipi(cpu_data[0].ipi_pipe[0], ++ activate_ipi(cpu_data[me].ipi_pipe[0], + current->thread.mode.tt.extern_pid); + + for(cpu = 1; cpu < ncpus; cpu++){ +@@ -180,10 +191,10 @@ + unhash_process(idle); + + waittime = 200000000; +- while (waittime-- && !cpu_isset(cpu, smp_callin_map)) ++ while (waittime-- && !cpu_isset(cpu, cpu_callin_map)) + cpu_relax(); + +- if (cpu_isset(cpu, smp_callin_map)) ++ if (cpu_isset(cpu, cpu_callin_map)) + printk("done\n"); + else printk("failed\n"); + } +@@ -216,7 +227,7 @@ + int fd; + + fd = cpu_data[cpu].ipi_pipe[0]; +- while (read(fd, &c, 1) == 1) { ++ while (os_read_file(fd, &c, 1) == 1) { + switch (c) { + case 'C': + smp_call_function_slave(cpu); +@@ -276,9 +287,9 @@ + info = _info; + + for (i=0;i<NR_CPUS;i++) +- if((i != current->thread_info->cpu) && ++ if((i != current_thread->cpu) && + cpu_isset(i, cpu_online_map)) +- write(cpu_data[i].ipi_pipe[1], "C", 1); ++ os_write_file(cpu_data[i].ipi_pipe[1], "C", 1); + + while (atomic_read(&scf_started) != cpus) + barrier(); +Index: uml-2.6.7/arch/um/drivers/slip_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/slip_user.c 2004-07-16 19:37:26.082060000 +0300 ++++ uml-2.6.7/arch/um/drivers/slip_user.c 2004-07-16 19:47:24.797041488 +0300 +@@ -4,11 +4,9 @@ + #include <stddef.h> + #include <sched.h> + #include <string.h> +-#include <sys/fcntl.h> +-#include <sys/errno.h> ++#include <errno.h> + #include <sys/termios.h> + #include <sys/wait.h> +-#include <sys/ioctl.h> + #include <sys/signal.h> + #include "user_util.h" + #include "kern_util.h" +@@ -65,9 +63,9 @@ + { + struct slip_pre_exec_data *data = arg; + +- if(data->stdin != -1) dup2(data->stdin, 0); ++ if(data->stdin >= 0) dup2(data->stdin, 0); + dup2(data->stdout, 1); +- if(data->close_me != -1) close(data->close_me); ++ if(data->close_me >= 0) os_close_file(data->close_me); + } + + static int slip_tramp(char **argv, int fd) +@@ -77,8 +75,8 @@ + int status, pid, fds[2], err, output_len; + + err = os_pipe(fds, 1, 0); +- if(err){ +- printk("slip_tramp : pipe failed, errno = %d\n", -err); ++ if(err < 0){ ++ printk("slip_tramp : pipe failed, err = %d\n", -err); + return(err); + } + +@@ -96,16 +94,18 @@ + printk("slip_tramp : failed to allocate output " + "buffer\n"); + +- close(fds[1]); ++ os_close_file(fds[1]); + read_output(fds[0], output, output_len); + if(output != NULL){ + printk("%s", output); + kfree(output); + } +- if(waitpid(pid, &status, 0) < 0) err = errno; ++ CATCH_EINTR(err = waitpid(pid, &status, 0)); ++ if(err < 0) ++ err = errno; + else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){ + printk("'%s' didn't exit with status 0\n", argv[0]); +- err = EINVAL; ++ err = -EINVAL; + } + } + return(err); +@@ -118,15 +118,17 @@ + char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")]; + char *argv[] = { "uml_net", version_buf, "slip", "up", gate_buf, + NULL }; +- int sfd, mfd, disc, sencap, err; ++ int sfd, mfd, err; + +- if((mfd = get_pty()) < 0){ +- printk("umn : Failed to open pty\n"); +- return(-1); ++ mfd = get_pty(); ++ if(mfd < 0){ ++ printk("umn : Failed to open pty, err = %d\n", -mfd); ++ return(mfd); + } +- if((sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0)) < 0){ +- printk("Couldn't open tty for slip line\n"); +- return(-1); ++ sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0); ++ if(sfd < 0){ ++ printk("Couldn't open tty for slip line, err = %d\n", -sfd); ++ return(sfd); + } + if(set_up_tty(sfd)) return(-1); + pri->slave = sfd; +@@ -138,28 +140,23 @@ + + err = slip_tramp(argv, sfd); + +- if(err != 0){ +- printk("slip_tramp failed - errno = %d\n", err); +- return(-err); ++ if(err < 0){ ++ printk("slip_tramp failed - err = %d\n", -err); ++ return(err); + } +- if(ioctl(pri->slave, SIOCGIFNAME, pri->name) < 0){ +- printk("SIOCGIFNAME failed, errno = %d\n", errno); +- return(-errno); ++ err = os_get_ifname(pri->slave, pri->name); ++ if(err < 0){ ++ printk("get_ifname failed, err = %d\n", -err); ++ return(err); + } + iter_addresses(pri->dev, open_addr, pri->name); + } + else { +- disc = N_SLIP; +- if(ioctl(sfd, TIOCSETD, &disc) < 0){ +- printk("Failed to set slip line discipline - " +- "errno = %d\n", errno); +- return(-errno); +- } +- sencap = 0; +- if(ioctl(sfd, SIOCSIFENCAP, &sencap) < 0){ +- printk("Failed to set slip encapsulation - " +- "errno = %d\n", errno); +- return(-errno); ++ err = os_set_slip(sfd); ++ if(err < 0){ ++ printk("Failed to set slip discipline encapsulation - " ++ "err = %d\n", -err); ++ return(err); + } + } + return(mfd); +@@ -181,9 +178,9 @@ + err = slip_tramp(argv, -1); + + if(err != 0) +- printk("slip_tramp failed - errno = %d\n", err); +- close(fd); +- close(pri->slave); ++ printk("slip_tramp failed - errno = %d\n", -err); ++ os_close_file(fd); ++ os_close_file(pri->slave); + pri->slave = -1; + } + +@@ -243,7 +240,7 @@ + { + struct slip_data *pri = data; + +- if(pri->slave == -1) return; ++ if(pri->slave < 0) return; + open_addr(addr, netmask, pri->name); + } + +@@ -252,7 +249,7 @@ + { + struct slip_data *pri = data; + +- if(pri->slave == -1) return; ++ if(pri->slave < 0) return; + close_addr(addr, netmask, pri->name); + } + +Index: uml-2.6.7/fs/hostfs/hostfs.h +=================================================================== +--- uml-2.6.7.orig/fs/hostfs/hostfs.h 2004-07-16 19:47:23.631218720 +0300 ++++ uml-2.6.7/fs/hostfs/hostfs.h 2004-07-16 19:47:23.781195920 +0300 +@@ -0,0 +1,79 @@ ++#ifndef __UM_FS_HOSTFS ++#define __UM_FS_HOSTFS ++ ++#include "os.h" ++ ++/* These are exactly the same definitions as in fs.h, but the names are ++ * changed so that this file can be included in both kernel and user files. ++ */ ++ ++#define HOSTFS_ATTR_MODE 1 ++#define HOSTFS_ATTR_UID 2 ++#define HOSTFS_ATTR_GID 4 ++#define HOSTFS_ATTR_SIZE 8 ++#define HOSTFS_ATTR_ATIME 16 ++#define HOSTFS_ATTR_MTIME 32 ++#define HOSTFS_ATTR_CTIME 64 ++#define HOSTFS_ATTR_ATIME_SET 128 ++#define HOSTFS_ATTR_MTIME_SET 256 ++#define HOSTFS_ATTR_FORCE 512 /* Not a change, but a change it */ ++#define HOSTFS_ATTR_ATTR_FLAG 1024 ++ ++struct hostfs_iattr { ++ unsigned int ia_valid; ++ mode_t ia_mode; ++ uid_t ia_uid; ++ gid_t ia_gid; ++ loff_t ia_size; ++ struct timespec ia_atime; ++ struct timespec ia_mtime; ++ struct timespec ia_ctime; ++ unsigned int ia_attr_flags; ++}; ++ ++extern int stat_file(const char *path, unsigned long long *inode_out, ++ int *mode_out, int *nlink_out, int *uid_out, int *gid_out, ++ unsigned long long *size_out, struct timespec *atime_out, ++ struct timespec *mtime_out, struct timespec *ctime_out, ++ int *blksize_out, unsigned long long *blocks_out); ++extern int access_file(char *path, int r, int w, int x); ++extern int open_file(char *path, int r, int w, int append); ++extern int file_type(const char *path, int *rdev); ++extern void *open_dir(char *path, int *err_out); ++extern char *read_dir(void *stream, unsigned long long *pos, ++ unsigned long long *ino_out, int *len_out); ++extern void close_file(void *stream); ++extern void close_dir(void *stream); ++extern int read_file(int fd, unsigned long long *offset, char *buf, int len); ++extern int write_file(int fd, unsigned long long *offset, const char *buf, ++ int len); ++extern int lseek_file(int fd, long long offset, int whence); ++extern int file_create(char *name, int ur, int uw, int ux, int gr, ++ int gw, int gx, int or, int ow, int ox); ++extern int set_attr(const char *file, struct hostfs_iattr *attrs); ++extern int make_symlink(const char *from, const char *to); ++extern int unlink_file(const char *file); ++extern int do_mkdir(const char *file, int mode); ++extern int do_rmdir(const char *file); ++extern int do_mknod(const char *file, int mode, int dev); ++extern int link_file(const char *from, const char *to); ++extern int do_readlink(char *file, char *buf, int size); ++extern int rename_file(char *from, char *to); ++extern int do_statfs(char *root, long *bsize_out, long long *blocks_out, ++ long long *bfree_out, long long *bavail_out, ++ long long *files_out, long long *ffree_out, ++ void *fsid_out, int fsid_size, long *namelen_out, ++ long *spare_out); ++ ++#endif ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/kernel/sigio_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/sigio_user.c 2004-07-16 19:37:38.307201496 +0300 ++++ uml-2.6.7/arch/um/kernel/sigio_user.c 2004-07-16 19:47:24.458093016 +0300 +@@ -7,7 +7,6 @@ + #include <stdlib.h> + #include <termios.h> + #include <pty.h> +-#include <fcntl.h> + #include <signal.h> + #include <errno.h> + #include <string.h> +@@ -17,6 +16,7 @@ + #include "init.h" + #include "user.h" + #include "kern_util.h" ++#include "user_util.h" + #include "sigio.h" + #include "helper.h" + #include "os.h" +@@ -26,7 +26,7 @@ + int pty_close_sigio = 0; + + /* Used as a flag during SIGIO testing early in boot */ +-static int got_sigio = 0; ++static volatile int got_sigio = 0; + + void __init handler(int sig) + { +@@ -45,19 +45,18 @@ + + info->err = 0; + if(openpty(&info->master, &info->slave, NULL, NULL, NULL)) +- info->err = errno; ++ info->err = -errno; + } + + void __init check_one_sigio(void (*proc)(int, int)) + { + struct sigaction old, new; +- struct termios tt; + struct openpty_arg pty = { .master = -1, .slave = -1 }; +- int master, slave, flags; ++ int master, slave, err; + + initial_thread_cb(openpty_cb, &pty); + if(pty.err){ +- printk("openpty failed, errno = %d\n", pty.err); ++ printk("openpty failed, errno = %d\n", -pty.err); + return; + } + +@@ -69,23 +68,13 @@ + return; + } + +- if(tcgetattr(master, &tt) < 0) +- panic("check_sigio : tcgetattr failed, errno = %d\n", errno); +- cfmakeraw(&tt); +- if(tcsetattr(master, TCSADRAIN, &tt) < 0) +- panic("check_sigio : tcsetattr failed, errno = %d\n", errno); +- +- if((flags = fcntl(master, F_GETFL)) < 0) +- panic("tty_fds : fcntl F_GETFL failed, errno = %d\n", errno); +- +- if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) || +- (fcntl(master, F_SETOWN, os_getpid()) < 0)) +- panic("check_sigio : fcntl F_SETFL or F_SETOWN failed, " +- "errno = %d\n", errno); +- +- if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0)) +- panic("check_sigio : fcntl F_SETFL failed, errno = %d\n", +- errno); ++ err = __raw(master, 1, 0); //Not now, but complain so we now where we failed. ++ if (err < 0) ++ panic("check_sigio : __raw failed, errno = %d\n", -err); ++ ++ err = os_sigio_async(master, slave); ++ if(err < 0) ++ panic("tty_fds : sigio_async failed, err = %d\n", -err); + + if(sigaction(SIGIO, NULL, &old) < 0) + panic("check_sigio : sigaction 1 failed, errno = %d\n", errno); +@@ -97,8 +86,8 @@ + got_sigio = 0; + (*proc)(master, slave); + +- close(master); +- close(slave); ++ os_close_file(master); ++ os_close_file(slave); + + if(sigaction(SIGIO, &old, NULL) < 0) + panic("check_sigio : sigaction 3 failed, errno = %d\n", errno); +@@ -112,25 +101,25 @@ + printk("Checking that host ptys support output SIGIO..."); + + memset(buf, 0, sizeof(buf)); +- while(write(master, buf, sizeof(buf)) > 0) ; ++ ++ while(os_write_file(master, buf, sizeof(buf)) > 0) ; + if(errno != EAGAIN) + panic("check_sigio : write failed, errno = %d\n", errno); +- +- while(((n = read(slave, buf, sizeof(buf))) > 0) && !got_sigio) ; ++ while(((n = os_read_file(slave, buf, sizeof(buf))) > 0) && !got_sigio) ; + + if(got_sigio){ + printk("Yes\n"); + pty_output_sigio = 1; + } +- else if(errno == EAGAIN) printk("No, enabling workaround\n"); +- else panic("check_sigio : read failed, errno = %d\n", errno); ++ else if(n == -EAGAIN) printk("No, enabling workaround\n"); ++ else panic("check_sigio : read failed, err = %d\n", n); + } + + static void tty_close(int master, int slave) + { + printk("Checking that host ptys support SIGIO on close..."); + +- close(slave); ++ os_close_file(slave); + if(got_sigio){ + printk("Yes\n"); + pty_close_sigio = 1; +@@ -140,7 +129,8 @@ + + void __init check_sigio(void) + { +- if(access("/dev/ptmx", R_OK) && access("/dev/ptyp0", R_OK)){ ++ if((os_access("/dev/ptmx", OS_ACC_R_OK) < 0) && ++ (os_access("/dev/ptyp0", OS_ACC_R_OK) < 0)){ + printk("No pseudo-terminals available - skipping pty SIGIO " + "check\n"); + return; +@@ -201,11 +191,10 @@ + p = &fds->poll[i]; + if(p->revents == 0) continue; + if(p->fd == sigio_private[1]){ +- n = read(sigio_private[1], &c, sizeof(c)); ++ n = os_read_file(sigio_private[1], &c, sizeof(c)); + if(n != sizeof(c)) + printk("write_sigio_thread : " +- "read failed, errno = %d\n", +- errno); ++ "read failed, err = %d\n", -n); + tmp = current_poll; + current_poll = next_poll; + next_poll = tmp; +@@ -218,10 +207,10 @@ + (fds->used - i) * sizeof(*fds->poll)); + } + +- n = write(respond_fd, &c, sizeof(c)); ++ n = os_write_file(respond_fd, &c, sizeof(c)); + if(n != sizeof(c)) + printk("write_sigio_thread : write failed, " +- "errno = %d\n", errno); ++ "err = %d\n", -n); + } + } + } +@@ -252,15 +241,15 @@ + char c; + + flags = set_signals(0); +- n = write(sigio_private[0], &c, sizeof(c)); ++ n = os_write_file(sigio_private[0], &c, sizeof(c)); + if(n != sizeof(c)){ +- printk("update_thread : write failed, errno = %d\n", errno); ++ printk("update_thread : write failed, err = %d\n", -n); + goto fail; + } + +- n = read(sigio_private[0], &c, sizeof(c)); ++ n = os_read_file(sigio_private[0], &c, sizeof(c)); + if(n != sizeof(c)){ +- printk("update_thread : read failed, errno = %d\n", errno); ++ printk("update_thread : read failed, err = %d\n", -n); + goto fail; + } + +@@ -271,10 +260,10 @@ + if(write_sigio_pid != -1) + os_kill_process(write_sigio_pid, 1); + write_sigio_pid = -1; +- close(sigio_private[0]); +- close(sigio_private[1]); +- close(write_sigio_fds[0]); +- close(write_sigio_fds[1]); ++ os_close_file(sigio_private[0]); ++ os_close_file(sigio_private[1]); ++ os_close_file(write_sigio_fds[0]); ++ os_close_file(write_sigio_fds[1]); + sigio_unlock(); + set_signals(flags); + } +@@ -369,15 +358,15 @@ + goto out; + + err = os_pipe(write_sigio_fds, 1, 1); +- if(err){ ++ if(err < 0){ + printk("write_sigio_workaround - os_pipe 1 failed, " +- "errno = %d\n", -err); ++ "err = %d\n", -err); + goto out; + } + err = os_pipe(sigio_private, 1, 1); +- if(err){ ++ if(err < 0){ + printk("write_sigio_workaround - os_pipe 2 failed, " +- "errno = %d\n", -err); ++ "err = %d\n", -err); + goto out_close1; + } + if(setup_initial_poll(sigio_private[1])) +@@ -399,11 +388,11 @@ + os_kill_process(write_sigio_pid, 1); + write_sigio_pid = -1; + out_close2: +- close(sigio_private[0]); +- close(sigio_private[1]); ++ os_close_file(sigio_private[0]); ++ os_close_file(sigio_private[1]); + out_close1: +- close(write_sigio_fds[0]); +- close(write_sigio_fds[1]); ++ os_close_file(write_sigio_fds[0]); ++ os_close_file(write_sigio_fds[1]); + sigio_unlock(); + } + +@@ -412,10 +401,16 @@ + int n; + char c; + +- n = read(fd, &c, sizeof(c)); ++ n = os_read_file(fd, &c, sizeof(c)); + if(n != sizeof(c)){ +- printk("read_sigio_fd - read failed, errno = %d\n", errno); +- return(-errno); ++ if(n < 0) { ++ printk("read_sigio_fd - read failed, err = %d\n", -n); ++ return(n); ++ } ++ else { ++ printk("read_sigio_fd - short read, bytes = %d\n", n); ++ return(-EIO); ++ } + } + return(n); + } +Index: uml-2.6.7/include/asm-um/system-i386.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/system-i386.h 2004-07-16 19:36:25.160321512 +0300 ++++ uml-2.6.7/include/asm-um/system-i386.h 2004-07-16 19:47:23.802192728 +0300 +@@ -2,36 +2,5 @@ + #define __UM_SYSTEM_I386_H + + #include "asm/system-generic.h" +- +-static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, +- unsigned long new, int size) +-{ +- unsigned long prev; +- switch (size) { +- case 1: +- __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2" +- : "=a"(prev) +- : "q"(new), "m"(*__xg(ptr)), "0"(old) +- : "memory"); +- return prev; +- case 2: +- __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2" +- : "=a"(prev) +- : "q"(new), "m"(*__xg(ptr)), "0"(old) +- : "memory"); +- return prev; +- case 4: +- __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2" +- : "=a"(prev) +- : "q"(new), "m"(*__xg(ptr)), "0"(old) +- : "memory"); +- return prev; +- } +- return old; +-} +- +-#define cmpxchg(ptr,o,n)\ +- ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\ +- (unsigned long)(n),sizeof(*(ptr)))) + + #endif +Index: uml-2.6.7/arch/um/sys-i386/time.c +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-i386/time.c 2004-07-16 19:47:23.629219024 +0300 ++++ uml-2.6.7/arch/um/sys-i386/time.c 2004-07-16 19:47:23.773197136 +0300 +@@ -0,0 +1,24 @@ ++/* ++ * sys-i386/time.c ++ * Created 25.9.2002 Sapan Bhatia ++ * ++ */ ++ ++unsigned long long time_stamp(void) ++{ ++ unsigned long low, high; ++ ++ asm("rdtsc" : "=a" (low), "=d" (high)); ++ return((((unsigned long long) high) << 32) + low); ++} ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/Makefile-i386 +=================================================================== +--- uml-2.6.7.orig/arch/um/Makefile-i386 2004-07-16 19:37:17.426375864 +0300 ++++ uml-2.6.7/arch/um/Makefile-i386 2004-07-16 19:47:23.764198504 +0300 +@@ -16,22 +16,27 @@ + + SYS_HEADERS = $(SYS_DIR)/sc.h $(SYS_DIR)/thread.h + ++sys_prepare: $(SYS_DIR)/sc.h ++ + prepare: $(SYS_HEADERS) + ++filechk_$(SYS_DIR)/sc.h := $(SYS_UTIL_DIR)/mk_sc ++ + $(SYS_DIR)/sc.h: $(SYS_UTIL_DIR)/mk_sc +- $< > $@ ++ $(call filechk,$@) ++ ++filechk_$(SYS_DIR)/thread.h := $(SYS_UTIL_DIR)/mk_thread + + $(SYS_DIR)/thread.h: $(SYS_UTIL_DIR)/mk_thread +- $< > $@ ++ $(call filechk,$@) + +-$(SYS_UTIL_DIR)/mk_sc: FORCE ; +- @$(call descend,$(SYS_UTIL_DIR),$@) ++$(SYS_UTIL_DIR)/mk_sc: scripts/basic/fixdep include/config/MARKER FORCE ; ++ $(Q)$(MAKE) $(build)=$(SYS_UTIL_DIR) $@ + +-$(SYS_UTIL_DIR)/mk_thread: $(ARCH_SYMLINKS) $(GEN_HEADERS) FORCE ; +- @$(call descend,$(SYS_UTIL_DIR),$@) ++$(SYS_UTIL_DIR)/mk_thread: $(ARCH_SYMLINKS) $(GEN_HEADERS) sys_prepare FORCE ; ++ $(Q)$(MAKE) $(build)=$(SYS_UTIL_DIR) $@ + + $(SYS_UTIL_DIR): include/asm FORCE +- @$(call descend,$@,) ++ $(Q)$(MAKE) $(build)=$(SYS_UTIL_DIR) + +-sysclean : +- rm -f $(SYS_HEADERS) ++CLEAN_FILES += $(SYS_HEADERS) +Index: uml-2.6.7/include/asm-um/smp.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/smp.h 2004-07-16 19:35:49.282775728 +0300 ++++ uml-2.6.7/include/asm-um/smp.h 2004-07-16 19:47:23.795193792 +0300 +@@ -10,7 +10,7 @@ + + extern cpumask_t cpu_online_map; + +-#define smp_processor_id() (current->thread_info->cpu) ++#define smp_processor_id() (current_thread->cpu) + #define cpu_logical_map(n) (n) + #define cpu_number_map(n) (n) + #define PROC_CHANGE_PENALTY 15 /* Pick a number, any number */ +Index: uml-2.6.7/arch/um/Kconfig_block +=================================================================== +--- uml-2.6.7.orig/arch/um/Kconfig_block 2004-07-16 19:37:05.104249112 +0300 ++++ uml-2.6.7/arch/um/Kconfig_block 2004-07-16 19:47:23.711206560 +0300 +@@ -29,6 +29,20 @@ + wise choice too. In all other cases (for example, if you're just + playing around with User-Mode Linux) you can choose N. + ++# Turn this back on when the driver actually works ++# ++#config BLK_DEV_COW ++# tristate "COW block device" ++# help ++# This is a layered driver which sits above two other block devices. ++# One is read-only, and the other is a read-write layer which stores ++# all changes. This provides the illusion that the read-only layer ++# can be mounted read-write and changed. ++ ++config BLK_DEV_COW_COMMON ++ bool ++ default BLK_DEV_COW || BLK_DEV_UBD ++ + config BLK_DEV_LOOP + tristate "Loopback device support" + +Index: uml-2.6.7/arch/um/kernel/initrd_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/initrd_user.c 2004-07-16 19:36:07.784962968 +0300 ++++ uml-2.6.7/arch/um/kernel/initrd_user.c 2004-07-16 19:47:23.715205952 +0300 +@@ -6,7 +6,6 @@ + #include <unistd.h> + #include <sys/types.h> + #include <sys/stat.h> +-#include <fcntl.h> + #include <errno.h> + + #include "user_util.h" +@@ -19,13 +18,15 @@ + { + int fd, n; + +- if((fd = os_open_file(filename, of_read(OPENFLAGS()), 0)) < 0){ +- printk("Opening '%s' failed - errno = %d\n", filename, errno); ++ fd = os_open_file(filename, of_read(OPENFLAGS()), 0); ++ if(fd < 0){ ++ printk("Opening '%s' failed - err = %d\n", filename, -fd); + return(-1); + } +- if((n = read(fd, buf, size)) != size){ +- printk("Read of %d bytes from '%s' returned %d, errno = %d\n", +- size, filename, n, errno); ++ n = os_read_file(fd, buf, size); ++ if(n != size){ ++ printk("Read of %d bytes from '%s' failed, err = %d\n", size, ++ filename, -n); + return(-1); + } + return(0); +Index: uml-2.6.7/arch/um/include/sysdep-i386/frame_user.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/sysdep-i386/frame_user.h 2004-07-16 19:37:34.631760248 +0300 ++++ uml-2.6.7/arch/um/include/sysdep-i386/frame_user.h 2004-07-16 19:47:23.707207168 +0300 +@@ -56,26 +56,26 @@ + * it would have to be __builtin_frame_address(1). + */ + +-static inline unsigned long frame_restorer(void) +-{ +- unsigned long *fp; +- +- fp = __builtin_frame_address(0); +- return((unsigned long) (fp + 1)); +-} ++#define frame_restorer() \ ++({ \ ++ unsigned long *fp; \ ++\ ++ fp = __builtin_frame_address(0); \ ++ ((unsigned long) (fp + 1)); \ ++}) + + /* Similarly, this returns the value of sp when the handler was first + * entered. This is used to calculate the proper sp when delivering + * signals. + */ + +-static inline unsigned long frame_sp(void) +-{ +- unsigned long *fp; +- +- fp = __builtin_frame_address(0); +- return((unsigned long) (fp + 1)); +-} ++#define frame_sp() \ ++({ \ ++ unsigned long *fp; \ ++\ ++ fp = __builtin_frame_address(0); \ ++ ((unsigned long) (fp + 1)); \ ++}) + + #endif + +Index: uml-2.6.7/arch/um/drivers/tty.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/tty.c 2004-07-16 19:36:25.316297800 +0300 ++++ uml-2.6.7/arch/um/drivers/tty.c 2004-07-16 19:47:23.695208992 +0300 +@@ -5,7 +5,6 @@ + + #include <stdio.h> + #include <termios.h> +-#include <fcntl.h> + #include <errno.h> + #include <unistd.h> + #include "chan_user.h" +@@ -30,7 +29,8 @@ + } + str++; + +- if((data = um_kmalloc(sizeof(*data))) == NULL) ++ data = um_kmalloc(sizeof(*data)); ++ if(data == NULL) + return(NULL); + *data = ((struct tty_chan) { .dev = str, + .raw = opts->raw }); +Index: uml-2.6.7/arch/um/drivers/net_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/net_kern.c 2004-07-16 19:36:37.183493712 +0300 ++++ uml-2.6.7/arch/um/drivers/net_kern.c 2004-07-16 19:47:23.689209904 +0300 +@@ -26,6 +26,7 @@ + #include "mconsole_kern.h" + #include "init.h" + #include "irq_user.h" ++#include "irq_kern.h" + + static spinlock_t opened_lock = SPIN_LOCK_UNLOCKED; + LIST_HEAD(opened); +@@ -37,7 +38,8 @@ + struct sk_buff *skb; + + /* If we can't allocate memory, try again next round. */ +- if ((skb = dev_alloc_skb(dev->mtu)) == NULL) { ++ skb = dev_alloc_skb(dev->mtu); ++ if (skb == NULL) { + lp->stats.rx_dropped++; + return 0; + } +@@ -61,14 +63,14 @@ + return pkt_len; + } + +-void uml_net_interrupt(int irq, void *dev_id, struct pt_regs *regs) ++irqreturn_t uml_net_interrupt(int irq, void *dev_id, struct pt_regs *regs) + { + struct net_device *dev = dev_id; + struct uml_net_private *lp = dev->priv; + int err; + + if(!netif_running(dev)) +- return; ++ return(IRQ_NONE); + + spin_lock(&lp->lock); + while((err = uml_net_rx(dev)) > 0) ; +@@ -83,6 +85,7 @@ + + out: + spin_unlock(&lp->lock); ++ return(IRQ_HANDLED); + } + + static int uml_net_open(struct net_device *dev) +@@ -250,37 +253,6 @@ + #endif + } + +-/* +- * default do nothing hard header packet routines for struct net_device init. +- * real ethernet transports will overwrite with real routines. +- */ +-static int uml_net_hard_header(struct sk_buff *skb, struct net_device *dev, +- unsigned short type, void *daddr, void *saddr, unsigned len) +-{ +- return(0); /* no change */ +-} +- +-static int uml_net_rebuild_header(struct sk_buff *skb) +-{ +- return(0); /* ignore */ +-} +- +-static int uml_net_header_cache(struct neighbour *neigh, struct hh_cache *hh) +-{ +- return(-1); /* fail */ +-} +- +-static void uml_net_header_cache_update(struct hh_cache *hh, +- struct net_device *dev, unsigned char * haddr) +-{ +- /* ignore */ +-} +- +-static int uml_net_header_parse(struct sk_buff *skb, unsigned char *haddr) +-{ +- return(0); /* nothing */ +-} +- + static spinlock_t devices_lock = SPIN_LOCK_UNLOCKED; + static struct list_head devices = LIST_HEAD_INIT(devices); + +@@ -290,7 +262,7 @@ + struct uml_net *device; + struct net_device *dev; + struct uml_net_private *lp; +- int err, size; ++ int save, err, size; + + size = transport->private_size + sizeof(struct uml_net_private) + + sizeof(((struct uml_net_private *) 0)->user); +@@ -332,12 +304,6 @@ + snprintf(dev->name, sizeof(dev->name), "eth%d", n); + device->dev = dev; + +- dev->hard_header = uml_net_hard_header; +- dev->rebuild_header = uml_net_rebuild_header; +- dev->hard_header_cache = uml_net_header_cache; +- dev->header_cache_update= uml_net_header_cache_update; +- dev->hard_header_parse = uml_net_header_parse; +- + (*transport->kern->init)(dev, init); + + dev->mtu = transport->user->max_packet; +@@ -364,21 +330,29 @@ + } + lp = dev->priv; + +- INIT_LIST_HEAD(&lp->list); +- spin_lock_init(&lp->lock); +- lp->dev = dev; +- lp->fd = -1; +- lp->mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0 }; +- lp->have_mac = device->have_mac; +- lp->protocol = transport->kern->protocol; +- lp->open = transport->user->open; +- lp->close = transport->user->close; +- lp->remove = transport->user->remove; +- lp->read = transport->kern->read; +- lp->write = transport->kern->write; +- lp->add_address = transport->user->add_address; +- lp->delete_address = transport->user->delete_address; +- lp->set_mtu = transport->user->set_mtu; ++ /* lp.user is the first four bytes of the transport data, which ++ * has already been initialized. This structure assignment will ++ * overwrite that, so we make sure that .user gets overwritten with ++ * what it already has. ++ */ ++ save = lp->user[0]; ++ *lp = ((struct uml_net_private) ++ { .list = LIST_HEAD_INIT(lp->list), ++ .lock = SPIN_LOCK_UNLOCKED, ++ .dev = dev, ++ .fd = -1, ++ .mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0}, ++ .have_mac = device->have_mac, ++ .protocol = transport->kern->protocol, ++ .open = transport->user->open, ++ .close = transport->user->close, ++ .remove = transport->user->remove, ++ .read = transport->kern->read, ++ .write = transport->kern->write, ++ .add_address = transport->user->add_address, ++ .delete_address = transport->user->delete_address, ++ .set_mtu = transport->user->set_mtu, ++ .user = { save } }); + + init_timer(&lp->tl); + lp->tl.function = uml_net_user_timer_expire; +@@ -611,7 +585,8 @@ + unregister_netdev(dev); + + list_del(&device->list); +- free_netdev(device); ++ kfree(device); ++ free_netdev(dev); + return(0); + } + +Index: uml-2.6.7/arch/um/kernel/tt/syscall_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/syscall_kern.c 2004-07-16 19:35:49.170792752 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/syscall_kern.c 2004-07-16 19:47:23.749200784 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +Index: uml-2.6.7/arch/um/kernel/config.c.in +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/config.c.in 2004-07-16 19:37:08.932667104 +0300 ++++ uml-2.6.7/arch/um/kernel/config.c.in 2004-07-16 19:47:23.712206408 +0300 +@@ -7,9 +7,7 @@ + #include <stdlib.h> + #include "init.h" + +-static __initdata char *config = " +-CONFIG +-"; ++static __initdata char *config = "CONFIG"; + + static int __init print_config(char *line, int *add) + { +Index: uml-2.6.7/arch/um/include/mconsole.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/mconsole.h 2004-07-16 19:36:32.705174520 +0300 ++++ uml-2.6.7/arch/um/include/mconsole.h 2004-07-16 19:47:23.703207776 +0300 +@@ -41,11 +41,13 @@ + + struct mc_request; + ++enum mc_context { MCONSOLE_INTR, MCONSOLE_PROC }; ++ + struct mconsole_command + { + char *command; + void (*handler)(struct mc_request *req); +- int as_interrupt; ++ enum mc_context context; + }; + + struct mc_request +@@ -77,6 +79,8 @@ + extern void mconsole_cad(struct mc_request *req); + extern void mconsole_stop(struct mc_request *req); + extern void mconsole_go(struct mc_request *req); ++extern void mconsole_log(struct mc_request *req); ++extern void mconsole_proc(struct mc_request *req); + + extern int mconsole_get_request(int fd, struct mc_request *req); + extern int mconsole_notify(char *sock_name, int type, const void *data, +Index: uml-2.6.7/arch/um/kernel/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/Makefile 2004-07-16 19:37:05.102249416 +0300 ++++ uml-2.6.7/arch/um/kernel/Makefile 2004-07-16 19:47:23.718205496 +0300 +@@ -7,11 +7,11 @@ + + obj-y = checksum.o config.o exec_kern.o exitcode.o frame_kern.o frame.o \ + helper.o init_task.o irq.o irq_user.o ksyms.o mem.o mem_user.o \ +- process.o process_kern.o ptrace.o reboot.o resource.o sigio_user.o \ +- sigio_kern.o signal_kern.o signal_user.o smp.o syscall_kern.o \ +- syscall_user.o sysrq.o sys_call_table.o tempfile.o time.o \ +- time_kern.o tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o \ +- umid.o user_syms.o user_util.o ++ physmem.o process.o process_kern.o ptrace.o reboot.o resource.o \ ++ sigio_user.o sigio_kern.o signal_kern.o signal_user.o smp.o \ ++ syscall_kern.o syscall_user.o sysrq.o sys_call_table.o tempfile.o \ ++ time.o time_kern.o tlb.o trap_kern.o trap_user.o uaccess_user.o \ ++ um_arch.o umid.o user_util.o + + obj-$(CONFIG_BLK_DEV_INITRD) += initrd_kern.o initrd_user.o + obj-$(CONFIG_GPROF) += gprof_syms.o +@@ -24,43 +24,27 @@ + user-objs-$(CONFIG_TTY_LOG) += tty_log.o + + USER_OBJS := $(filter %_user.o,$(obj-y)) $(user-objs-y) config.o helper.o \ +- process.o tempfile.o time.o tty_log.o umid.o user_util.o user_syms.o ++ process.o tempfile.o time.o tty_log.o umid.o user_util.o + USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file)) + +-DMODULES-$(CONFIG_MODULES) = -D__CONFIG_MODULES__ +-DMODVERSIONS-$(CONFIG_MODVERSIONS) = -D__CONFIG_MODVERSIONS__ +- +- +-CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \ +- -I/usr/include -I../include +- + CFLAGS_frame.o := $(patsubst -fomit-frame-pointer,,$(USER_CFLAGS)) + +-$(USER_OBJS) : %.o: %.c +- $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< +- + # This has to be separate because it needs be compiled with frame pointers + # regardless of how the rest of the kernel is built. + + $(obj)/frame.o: $(src)/frame.c + $(CC) $(CFLAGS_$(notdir $@)) -c -o $@ $< + +-QUOTE = 'my $$config=`cat $(TOPDIR)/.config`; $$config =~ s/"/\\"/g ; while(<STDIN>) { $$_ =~ s/CONFIG/$$config/; print $$_ }' ++$(USER_OBJS) : %.o: %.c ++ $(CC) $(CFLAGS_$(notdir $@)) $(USER_CFLAGS) -c -o $@ $< + +-$(obj)/config.c : $(src)/config.c.in $(TOPDIR)/.config +- $(PERL) -e $(QUOTE) < $(src)/config.c.in > $@ ++QUOTE = 'my $$config=`cat $(TOPDIR)/.config`; $$config =~ s/"/\\"/g ; $$config =~ s/\n/\\n"\n"/g ; while(<STDIN>) { $$_ =~ s/CONFIG/$$config/; print $$_ }' + + $(obj)/config.o : $(obj)/config.c + +-clean: +- rm -f config.c +- for dir in $(subdir-y) ; do $(MAKE) -C $$dir clean; done +- +-modules: +- +-fastdep: +- +-dep: +- +-archmrproper: clean ++quiet_cmd_quote = QUOTE $@ ++cmd_quote = $(PERL) -e $(QUOTE) < $< > $@ + ++targets += config.c ++$(obj)/config.c : $(src)/config.c.in $(TOPDIR)/.config FORCE ++ $(call if_changed,quote) +Index: uml-2.6.7/arch/um/drivers/xterm_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/xterm_kern.c 2004-07-16 19:37:08.927667864 +0300 ++++ uml-2.6.7/arch/um/drivers/xterm_kern.c 2004-07-16 19:47:23.699208384 +0300 +@@ -5,9 +5,12 @@ + + #include "linux/errno.h" + #include "linux/slab.h" ++#include "linux/signal.h" ++#include "linux/interrupt.h" + #include "asm/semaphore.h" + #include "asm/irq.h" + #include "irq_user.h" ++#include "irq_kern.h" + #include "kern_util.h" + #include "os.h" + #include "xterm.h" +@@ -19,17 +22,18 @@ + int new_fd; + }; + +-static void xterm_interrupt(int irq, void *data, struct pt_regs *regs) ++static irqreturn_t xterm_interrupt(int irq, void *data, struct pt_regs *regs) + { + struct xterm_wait *xterm = data; + int fd; + + fd = os_rcv_fd(xterm->fd, &xterm->pid); + if(fd == -EAGAIN) +- return; ++ return(IRQ_NONE); + + xterm->new_fd = fd; + up(&xterm->sem); ++ return(IRQ_HANDLED); + } + + int xterm_fd(int socket, int *pid_out) +@@ -54,7 +58,8 @@ + if(err){ + printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, " + "err = %d\n", err); +- return(err); ++ ret = err; ++ goto out; + } + down(&data->sem); + +@@ -62,6 +67,7 @@ + + ret = data->new_fd; + *pid_out = data->pid; ++ out: + kfree(data); + + return(ret); +Index: uml-2.6.7/arch/um/drivers/cow.h +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/cow.h 2004-07-16 19:47:23.607222368 +0300 ++++ uml-2.6.7/arch/um/drivers/cow.h 2004-07-16 19:47:23.678211576 +0300 +@@ -0,0 +1,41 @@ ++#ifndef __COW_H__ ++#define __COW_H__ ++ ++#include <asm/types.h> ++ ++#if __BYTE_ORDER == __BIG_ENDIAN ++# define ntohll(x) (x) ++# define htonll(x) (x) ++#elif __BYTE_ORDER == __LITTLE_ENDIAN ++# define ntohll(x) bswap_64(x) ++# define htonll(x) bswap_64(x) ++#else ++#error "__BYTE_ORDER not defined" ++#endif ++ ++extern int init_cow_file(int fd, char *cow_file, char *backing_file, ++ int sectorsize, int alignment, int *bitmap_offset_out, ++ unsigned long *bitmap_len_out, int *data_offset_out); ++ ++extern int file_reader(__u64 offset, char *buf, int len, void *arg); ++extern int read_cow_header(int (*reader)(__u64, char *, int, void *), ++ void *arg, __u32 *version_out, ++ char **backing_file_out, time_t *mtime_out, ++ __u64 *size_out, int *sectorsize_out, ++ __u32 *align_out, int *bitmap_offset_out); ++ ++extern int write_cow_header(char *cow_file, int fd, char *backing_file, ++ int sectorsize, int alignment, long long *size); ++ ++extern void cow_sizes(int version, __u64 size, int sectorsize, int align, ++ int bitmap_offset, unsigned long *bitmap_len_out, ++ int *data_offset_out); ++ ++#endif ++ ++/* ++ * --------------------------------------------------------------------------- ++ * Local variables: ++ * c-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/sys-ppc/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-ppc/Makefile 2004-07-16 19:36:37.299476080 +0300 ++++ uml-2.6.7/arch/um/sys-ppc/Makefile 2004-07-16 19:47:23.779196224 +0300 +@@ -66,13 +66,4 @@ + $(CC) $(EXTRA_AFLAGS) $(AFLAGS) -D__ASSEMBLY__ -D__UM_PPC__ -c $< -o $*.o + rm -f asm + +-clean: +- rm -f $(OBJS) +- rm -f ppc_defs.h +- rm -f checksum.S semaphore.c mk_defs.c +- +-fastdep: +- +-dep: +- +-modules: ++clean-files := $(OBJS) ppc_defs.h checksum.S semaphore.c mk_defs.c +Index: uml-2.6.7/arch/um/os-Linux/user_syms.c +=================================================================== +--- uml-2.6.7.orig/arch/um/os-Linux/user_syms.c 2004-07-16 19:47:23.629219024 +0300 ++++ uml-2.6.7/arch/um/os-Linux/user_syms.c 2004-07-16 19:47:23.769197744 +0300 +@@ -0,0 +1,88 @@ ++#include "linux/types.h" ++#include "linux/module.h" ++ ++/* Some of this are builtin function (some are not but could in the future), ++ * so I *must* declare good prototypes for them and then EXPORT them. ++ * The kernel code uses the macro defined by include/linux/string.h, ++ * so I undef macros; the userspace code does not include that and I ++ * add an EXPORT for the glibc one.*/ ++ ++#undef strlen ++#undef strstr ++#undef memcpy ++#undef memset ++ ++extern size_t strlen(const char *); ++extern void *memcpy(void *, const void *, size_t); ++extern void *memset(void *, int, size_t); ++extern int printf(const char *, ...); ++ ++EXPORT_SYMBOL(strlen); ++EXPORT_SYMBOL(memcpy); ++EXPORT_SYMBOL(memset); ++EXPORT_SYMBOL(printf); ++ ++EXPORT_SYMBOL(strstr); ++ ++/* Here, instead, I can provide a fake prototype. Yes, someone cares: genksyms. ++ * However, the modules will use the CRC defined *here*, no matter if it is ++ * good; so the versions of these symbols will always match ++ */ ++#define EXPORT_SYMBOL_PROTO(sym) \ ++ int sym(void); \ ++ EXPORT_SYMBOL(sym); ++ ++EXPORT_SYMBOL_PROTO(__errno_location); ++ ++EXPORT_SYMBOL_PROTO(access); ++EXPORT_SYMBOL_PROTO(open); ++EXPORT_SYMBOL_PROTO(open64); ++EXPORT_SYMBOL_PROTO(close); ++EXPORT_SYMBOL_PROTO(read); ++EXPORT_SYMBOL_PROTO(write); ++EXPORT_SYMBOL_PROTO(dup2); ++EXPORT_SYMBOL_PROTO(__xstat); ++EXPORT_SYMBOL_PROTO(__lxstat); ++EXPORT_SYMBOL_PROTO(__lxstat64); ++EXPORT_SYMBOL_PROTO(lseek); ++EXPORT_SYMBOL_PROTO(lseek64); ++EXPORT_SYMBOL_PROTO(chown); ++EXPORT_SYMBOL_PROTO(truncate); ++EXPORT_SYMBOL_PROTO(utime); ++EXPORT_SYMBOL_PROTO(chmod); ++EXPORT_SYMBOL_PROTO(rename); ++EXPORT_SYMBOL_PROTO(__xmknod); ++ ++EXPORT_SYMBOL_PROTO(symlink); ++EXPORT_SYMBOL_PROTO(link); ++EXPORT_SYMBOL_PROTO(unlink); ++EXPORT_SYMBOL_PROTO(readlink); ++ ++EXPORT_SYMBOL_PROTO(mkdir); ++EXPORT_SYMBOL_PROTO(rmdir); ++EXPORT_SYMBOL_PROTO(opendir); ++EXPORT_SYMBOL_PROTO(readdir); ++EXPORT_SYMBOL_PROTO(closedir); ++EXPORT_SYMBOL_PROTO(seekdir); ++EXPORT_SYMBOL_PROTO(telldir); ++ ++EXPORT_SYMBOL_PROTO(ioctl); ++ ++EXPORT_SYMBOL_PROTO(pread64); ++EXPORT_SYMBOL_PROTO(pwrite64); ++ ++EXPORT_SYMBOL_PROTO(statfs); ++EXPORT_SYMBOL_PROTO(statfs64); ++ ++EXPORT_SYMBOL_PROTO(getuid); ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/include/irq_kern.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/irq_kern.h 2004-07-16 19:47:23.612221608 +0300 ++++ uml-2.6.7/arch/um/include/irq_kern.h 2004-07-16 19:47:23.701208080 +0300 +@@ -0,0 +1,28 @@ ++/* ++ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) ++ * Licensed under the GPL ++ */ ++ ++#ifndef __IRQ_KERN_H__ ++#define __IRQ_KERN_H__ ++ ++#include "linux/interrupt.h" ++ ++extern int um_request_irq(unsigned int irq, int fd, int type, ++ irqreturn_t (*handler)(int, void *, ++ struct pt_regs *), ++ unsigned long irqflags, const char * devname, ++ void *dev_id); ++ ++#endif ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/fs/hppfs/hppfs_kern.c +=================================================================== +--- uml-2.6.7.orig/fs/hppfs/hppfs_kern.c 2004-07-16 19:47:23.632218568 +0300 ++++ uml-2.6.7/fs/hppfs/hppfs_kern.c 2004-07-16 19:47:23.785195312 +0300 +@@ -0,0 +1,811 @@ ++/* ++ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) ++ * Licensed under the GPL ++ */ ++ ++#include <linux/fs.h> ++#include <linux/module.h> ++#include <linux/init.h> ++#include <linux/slab.h> ++#include <linux/list.h> ++#include <linux/kernel.h> ++#include <linux/ctype.h> ++#include <linux/dcache.h> ++#include <linux/statfs.h> ++#include <asm/uaccess.h> ++#include <asm/fcntl.h> ++#include "os.h" ++ ++static int init_inode(struct inode *inode, struct dentry *dentry); ++ ++struct hppfs_data { ++ struct list_head list; ++ char contents[PAGE_SIZE - sizeof(struct list_head)]; ++}; ++ ++struct hppfs_private { ++ struct file proc_file; ++ int host_fd; ++ loff_t len; ++ struct hppfs_data *contents; ++}; ++ ++struct hppfs_inode_info { ++ struct dentry *proc_dentry; ++ struct inode vfs_inode; ++}; ++ ++static inline struct hppfs_inode_info *HPPFS_I(struct inode *inode) ++{ ++ return(list_entry(inode, struct hppfs_inode_info, vfs_inode)); ++} ++ ++#define HPPFS_SUPER_MAGIC 0xb00000ee ++ ++static struct super_operations hppfs_sbops; ++ ++static int is_pid(struct dentry *dentry) ++{ ++ struct super_block *sb; ++ int i; ++ ++ sb = dentry->d_sb; ++ if((sb->s_op != &hppfs_sbops) || (dentry->d_parent != sb->s_root)) ++ return(0); ++ ++ for(i = 0; i < dentry->d_name.len; i++){ ++ if(!isdigit(dentry->d_name.name[i])) ++ return(0); ++ } ++ return(1); ++} ++ ++static char *dentry_name(struct dentry *dentry, int extra) ++{ ++ struct dentry *parent; ++ char *root, *name; ++ const char *seg_name; ++ int len, seg_len; ++ ++ len = 0; ++ parent = dentry; ++ while(parent->d_parent != parent){ ++ if(is_pid(parent)) ++ len += strlen("pid") + 1; ++ else len += parent->d_name.len + 1; ++ parent = parent->d_parent; ++ } ++ ++ root = "proc"; ++ len += strlen(root); ++ name = kmalloc(len + extra + 1, GFP_KERNEL); ++ if(name == NULL) return(NULL); ++ ++ name[len] = '\0'; ++ parent = dentry; ++ while(parent->d_parent != parent){ ++ if(is_pid(parent)){ ++ seg_name = "pid"; ++ seg_len = strlen("pid"); ++ } ++ else { ++ seg_name = parent->d_name.name; ++ seg_len = parent->d_name.len; ++ } ++ ++ len -= seg_len + 1; ++ name[len] = '/'; ++ strncpy(&name[len + 1], seg_name, seg_len); ++ parent = parent->d_parent; ++ } ++ strncpy(name, root, strlen(root)); ++ return(name); ++} ++ ++struct dentry_operations hppfs_dentry_ops = { ++}; ++ ++static int file_removed(struct dentry *dentry, const char *file) ++{ ++ char *host_file; ++ int extra, fd; ++ ++ extra = 0; ++ if(file != NULL) extra += strlen(file) + 1; ++ ++ host_file = dentry_name(dentry, extra + strlen("/remove")); ++ if(host_file == NULL){ ++ printk("file_removed : allocation failed\n"); ++ return(-ENOMEM); ++ } ++ ++ if(file != NULL){ ++ strcat(host_file, "/"); ++ strcat(host_file, file); ++ } ++ strcat(host_file, "/remove"); ++ ++ fd = os_open_file(host_file, of_read(OPENFLAGS()), 0); ++ kfree(host_file); ++ if(fd > 0){ ++ os_close_file(fd); ++ return(1); ++ } ++ return(0); ++} ++ ++static void hppfs_read_inode(struct inode *ino) ++{ ++ struct inode *proc_ino; ++ ++ if(HPPFS_I(ino)->proc_dentry == NULL) ++ return; ++ ++ proc_ino = HPPFS_I(ino)->proc_dentry->d_inode; ++ ino->i_uid = proc_ino->i_uid; ++ ino->i_gid = proc_ino->i_gid; ++ ino->i_atime = proc_ino->i_atime; ++ ino->i_mtime = proc_ino->i_mtime; ++ ino->i_ctime = proc_ino->i_ctime; ++ ino->i_ino = proc_ino->i_ino; ++ ino->i_mode = proc_ino->i_mode; ++ ino->i_nlink = proc_ino->i_nlink; ++ ino->i_size = proc_ino->i_size; ++ ino->i_blksize = proc_ino->i_blksize; ++ ino->i_blocks = proc_ino->i_blocks; ++} ++ ++static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry, ++ struct nameidata *nd) ++{ ++ struct dentry *proc_dentry, *new, *parent; ++ struct inode *inode; ++ int err, deleted; ++ ++ deleted = file_removed(dentry, NULL); ++ if(deleted < 0) ++ return(ERR_PTR(deleted)); ++ else if(deleted) ++ return(ERR_PTR(-ENOENT)); ++ ++ err = -ENOMEM; ++ parent = HPPFS_I(ino)->proc_dentry; ++ down(&parent->d_inode->i_sem); ++ proc_dentry = d_lookup(parent, &dentry->d_name); ++ if(proc_dentry == NULL){ ++ proc_dentry = d_alloc(parent, &dentry->d_name); ++ if(proc_dentry == NULL){ ++ up(&parent->d_inode->i_sem); ++ goto out; ++ } ++ new = (*parent->d_inode->i_op->lookup)(parent->d_inode, ++ proc_dentry, NULL); ++ if(new){ ++ dput(proc_dentry); ++ proc_dentry = new; ++ } ++ } ++ up(&parent->d_inode->i_sem); ++ ++ if(IS_ERR(proc_dentry)) ++ return(proc_dentry); ++ ++ inode = iget(ino->i_sb, 0); ++ if(inode == NULL) ++ goto out_dput; ++ ++ err = init_inode(inode, proc_dentry); ++ if(err) ++ goto out_put; ++ ++ hppfs_read_inode(inode); ++ ++ d_add(dentry, inode); ++ dentry->d_op = &hppfs_dentry_ops; ++ return(NULL); ++ ++ out_put: ++ iput(inode); ++ out_dput: ++ dput(proc_dentry); ++ out: ++ return(ERR_PTR(err)); ++} ++ ++static struct inode_operations hppfs_file_iops = { ++}; ++ ++static ssize_t read_proc(struct file *file, char *buf, ssize_t count, ++ loff_t *ppos, int is_user) ++{ ++ ssize_t (*read)(struct file *, char *, size_t, loff_t *); ++ ssize_t n; ++ ++ read = file->f_dentry->d_inode->i_fop->read; ++ ++ if(!is_user) ++ set_fs(KERNEL_DS); ++ ++ n = (*read)(file, buf, count, &file->f_pos); ++ ++ if(!is_user) ++ set_fs(USER_DS); ++ ++ if(ppos) *ppos = file->f_pos; ++ return(n); ++} ++ ++static ssize_t hppfs_read_file(int fd, char *buf, ssize_t count) ++{ ++ ssize_t n; ++ int cur, err; ++ char *new_buf; ++ ++ n = -ENOMEM; ++ new_buf = kmalloc(PAGE_SIZE, GFP_KERNEL); ++ if(new_buf == NULL){ ++ printk("hppfs_read_file : kmalloc failed\n"); ++ goto out; ++ } ++ n = 0; ++ while(count > 0){ ++ cur = min_t(ssize_t, count, PAGE_SIZE); ++ err = os_read_file(fd, new_buf, cur); ++ if(err < 0){ ++ printk("hppfs_read : read failed, errno = %d\n", ++ count); ++ n = err; ++ goto out_free; ++ } ++ else if(err == 0) ++ break; ++ ++ if(copy_to_user(buf, new_buf, err)){ ++ n = -EFAULT; ++ goto out_free; ++ } ++ n += err; ++ count -= err; ++ } ++ out_free: ++ kfree(new_buf); ++ out: ++ return(n); ++} ++ ++static ssize_t hppfs_read(struct file *file, char *buf, size_t count, ++ loff_t *ppos) ++{ ++ struct hppfs_private *hppfs = file->private_data; ++ struct hppfs_data *data; ++ loff_t off; ++ int err; ++ ++ if(hppfs->contents != NULL){ ++ if(*ppos >= hppfs->len) return(0); ++ ++ data = hppfs->contents; ++ off = *ppos; ++ while(off >= sizeof(data->contents)){ ++ data = list_entry(data->list.next, struct hppfs_data, ++ list); ++ off -= sizeof(data->contents); ++ } ++ ++ if(off + count > hppfs->len) ++ count = hppfs->len - off; ++ copy_to_user(buf, &data->contents[off], count); ++ *ppos += count; ++ } ++ else if(hppfs->host_fd != -1){ ++ err = os_seek_file(hppfs->host_fd, *ppos); ++ if(err){ ++ printk("hppfs_read : seek failed, errno = %d\n", err); ++ return(err); ++ } ++ count = hppfs_read_file(hppfs->host_fd, buf, count); ++ if(count > 0) ++ *ppos += count; ++ } ++ else count = read_proc(&hppfs->proc_file, buf, count, ppos, 1); ++ ++ return(count); ++} ++ ++static ssize_t hppfs_write(struct file *file, const char *buf, size_t len, ++ loff_t *ppos) ++{ ++ struct hppfs_private *data = file->private_data; ++ struct file *proc_file = &data->proc_file; ++ ssize_t (*write)(struct file *, const char *, size_t, loff_t *); ++ int err; ++ ++ write = proc_file->f_dentry->d_inode->i_fop->write; ++ ++ proc_file->f_pos = file->f_pos; ++ err = (*write)(proc_file, buf, len, &proc_file->f_pos); ++ file->f_pos = proc_file->f_pos; ++ ++ return(err); ++} ++ ++static int open_host_sock(char *host_file, int *filter_out) ++{ ++ char *end; ++ int fd; ++ ++ end = &host_file[strlen(host_file)]; ++ strcpy(end, "/rw"); ++ *filter_out = 1; ++ fd = os_connect_socket(host_file); ++ if(fd > 0) ++ return(fd); ++ ++ strcpy(end, "/r"); ++ *filter_out = 0; ++ fd = os_connect_socket(host_file); ++ return(fd); ++} ++ ++static void free_contents(struct hppfs_data *head) ++{ ++ struct hppfs_data *data; ++ struct list_head *ele, *next; ++ ++ if(head == NULL) return; ++ ++ list_for_each_safe(ele, next, &head->list){ ++ data = list_entry(ele, struct hppfs_data, list); ++ kfree(data); ++ } ++ kfree(head); ++} ++ ++static struct hppfs_data *hppfs_get_data(int fd, int filter, ++ struct file *proc_file, ++ struct file *hppfs_file, ++ loff_t *size_out) ++{ ++ struct hppfs_data *data, *new, *head; ++ int n, err; ++ ++ err = -ENOMEM; ++ data = kmalloc(sizeof(*data), GFP_KERNEL); ++ if(data == NULL){ ++ printk("hppfs_get_data : head allocation failed\n"); ++ goto failed; ++ } ++ ++ INIT_LIST_HEAD(&data->list); ++ ++ head = data; ++ *size_out = 0; ++ ++ if(filter){ ++ while((n = read_proc(proc_file, data->contents, ++ sizeof(data->contents), NULL, 0)) > 0) ++ os_write_file(fd, data->contents, n); ++ err = os_shutdown_socket(fd, 0, 1); ++ if(err){ ++ printk("hppfs_get_data : failed to shut down " ++ "socket\n"); ++ goto failed_free; ++ } ++ } ++ while(1){ ++ n = os_read_file(fd, data->contents, sizeof(data->contents)); ++ if(n < 0){ ++ err = n; ++ printk("hppfs_get_data : read failed, errno = %d\n", ++ err); ++ goto failed_free; ++ } ++ else if(n == 0) ++ break; ++ ++ *size_out += n; ++ ++ if(n < sizeof(data->contents)) ++ break; ++ ++ new = kmalloc(sizeof(*data), GFP_KERNEL); ++ if(new == 0){ ++ printk("hppfs_get_data : data allocation failed\n"); ++ err = -ENOMEM; ++ goto failed_free; ++ } ++ ++ INIT_LIST_HEAD(&new->list); ++ list_add(&new->list, &data->list); ++ data = new; ++ } ++ return(head); ++ ++ failed_free: ++ free_contents(head); ++ failed: ++ return(ERR_PTR(err)); ++} ++ ++static struct hppfs_private *hppfs_data(void) ++{ ++ struct hppfs_private *data; ++ ++ data = kmalloc(sizeof(*data), GFP_KERNEL); ++ if(data == NULL) ++ return(data); ++ ++ *data = ((struct hppfs_private ) { .host_fd = -1, ++ .len = -1, ++ .contents = NULL } ); ++ return(data); ++} ++ ++static int file_mode(int fmode) ++{ ++ if(fmode == (FMODE_READ | FMODE_WRITE)) ++ return(O_RDWR); ++ if(fmode == FMODE_READ) ++ return(O_RDONLY); ++ if(fmode == FMODE_WRITE) ++ return(O_WRONLY); ++ return(0); ++} ++ ++static int hppfs_open(struct inode *inode, struct file *file) ++{ ++ struct hppfs_private *data; ++ struct dentry *proc_dentry; ++ char *host_file; ++ int err, fd, type, filter; ++ ++ err = -ENOMEM; ++ data = hppfs_data(); ++ if(data == NULL) ++ goto out; ++ ++ host_file = dentry_name(file->f_dentry, strlen("/rw")); ++ if(host_file == NULL) ++ goto out_free2; ++ ++ proc_dentry = HPPFS_I(inode)->proc_dentry; ++ ++ /* XXX This isn't closed anywhere */ ++ err = open_private_file(&data->proc_file, proc_dentry, ++ file_mode(file->f_mode)); ++ if(err) ++ goto out_free1; ++ ++ type = os_file_type(host_file); ++ if(type == OS_TYPE_FILE){ ++ fd = os_open_file(host_file, of_read(OPENFLAGS()), 0); ++ if(fd >= 0) ++ data->host_fd = fd; ++ else printk("hppfs_open : failed to open '%s', errno = %d\n", ++ host_file, -fd); ++ ++ data->contents = NULL; ++ } ++ else if(type == OS_TYPE_DIR){ ++ fd = open_host_sock(host_file, &filter); ++ if(fd > 0){ ++ data->contents = hppfs_get_data(fd, filter, ++ &data->proc_file, ++ file, &data->len); ++ if(!IS_ERR(data->contents)) ++ data->host_fd = fd; ++ } ++ else printk("hppfs_open : failed to open a socket in " ++ "'%s', errno = %d\n", host_file, -fd); ++ } ++ kfree(host_file); ++ ++ file->private_data = data; ++ return(0); ++ ++ out_free1: ++ kfree(host_file); ++ out_free2: ++ free_contents(data->contents); ++ kfree(data); ++ out: ++ return(err); ++} ++ ++static int hppfs_dir_open(struct inode *inode, struct file *file) ++{ ++ struct hppfs_private *data; ++ struct dentry *proc_dentry; ++ int err; ++ ++ err = -ENOMEM; ++ data = hppfs_data(); ++ if(data == NULL) ++ goto out; ++ ++ proc_dentry = HPPFS_I(inode)->proc_dentry; ++ err = open_private_file(&data->proc_file, proc_dentry, ++ file_mode(file->f_mode)); ++ if(err) ++ goto out_free; ++ ++ file->private_data = data; ++ return(0); ++ ++ out_free: ++ kfree(data); ++ out: ++ return(err); ++} ++ ++static loff_t hppfs_llseek(struct file *file, loff_t off, int where) ++{ ++ struct hppfs_private *data = file->private_data; ++ struct file *proc_file = &data->proc_file; ++ loff_t (*llseek)(struct file *, loff_t, int); ++ loff_t ret; ++ ++ llseek = proc_file->f_dentry->d_inode->i_fop->llseek; ++ if(llseek != NULL){ ++ ret = (*llseek)(proc_file, off, where); ++ if(ret < 0) ++ return(ret); ++ } ++ ++ return(default_llseek(file, off, where)); ++} ++ ++static struct file_operations hppfs_file_fops = { ++ .owner = NULL, ++ .llseek = hppfs_llseek, ++ .read = hppfs_read, ++ .write = hppfs_write, ++ .open = hppfs_open, ++}; ++ ++struct hppfs_dirent { ++ void *vfs_dirent; ++ filldir_t filldir; ++ struct dentry *dentry; ++}; ++ ++static int hppfs_filldir(void *d, const char *name, int size, ++ loff_t offset, ino_t inode, unsigned int type) ++{ ++ struct hppfs_dirent *dirent = d; ++ ++ if(file_removed(dirent->dentry, name)) ++ return(0); ++ ++ return((*dirent->filldir)(dirent->vfs_dirent, name, size, offset, ++ inode, type)); ++} ++ ++static int hppfs_readdir(struct file *file, void *ent, filldir_t filldir) ++{ ++ struct hppfs_private *data = file->private_data; ++ struct file *proc_file = &data->proc_file; ++ int (*readdir)(struct file *, void *, filldir_t); ++ struct hppfs_dirent dirent = ((struct hppfs_dirent) ++ { .vfs_dirent = ent, ++ .filldir = filldir, ++ .dentry = file->f_dentry } ); ++ int err; ++ ++ readdir = proc_file->f_dentry->d_inode->i_fop->readdir; ++ ++ proc_file->f_pos = file->f_pos; ++ err = (*readdir)(proc_file, &dirent, hppfs_filldir); ++ file->f_pos = proc_file->f_pos; ++ ++ return(err); ++} ++ ++static int hppfs_fsync(struct file *file, struct dentry *dentry, int datasync) ++{ ++ return(0); ++} ++ ++static struct file_operations hppfs_dir_fops = { ++ .owner = NULL, ++ .readdir = hppfs_readdir, ++ .open = hppfs_dir_open, ++ .fsync = hppfs_fsync, ++}; ++ ++static int hppfs_statfs(struct super_block *sb, struct kstatfs *sf) ++{ ++ sf->f_blocks = 0; ++ sf->f_bfree = 0; ++ sf->f_bavail = 0; ++ sf->f_files = 0; ++ sf->f_ffree = 0; ++ sf->f_type = HPPFS_SUPER_MAGIC; ++ return(0); ++} ++ ++static struct inode *hppfs_alloc_inode(struct super_block *sb) ++{ ++ struct hppfs_inode_info *hi; ++ ++ hi = kmalloc(sizeof(*hi), GFP_KERNEL); ++ if(hi == NULL) ++ return(NULL); ++ ++ *hi = ((struct hppfs_inode_info) { .proc_dentry = NULL }); ++ inode_init_once(&hi->vfs_inode); ++ return(&hi->vfs_inode); ++} ++ ++void hppfs_delete_inode(struct inode *ino) ++{ ++ clear_inode(ino); ++} ++ ++static void hppfs_destroy_inode(struct inode *inode) ++{ ++ kfree(HPPFS_I(inode)); ++} ++ ++static struct super_operations hppfs_sbops = { ++ .alloc_inode = hppfs_alloc_inode, ++ .destroy_inode = hppfs_destroy_inode, ++ .read_inode = hppfs_read_inode, ++ .delete_inode = hppfs_delete_inode, ++ .statfs = hppfs_statfs, ++}; ++ ++static int hppfs_readlink(struct dentry *dentry, char *buffer, int buflen) ++{ ++ struct file proc_file; ++ struct dentry *proc_dentry; ++ int (*readlink)(struct dentry *, char *, int); ++ int err, n; ++ ++ proc_dentry = HPPFS_I(dentry->d_inode)->proc_dentry; ++ err = open_private_file(&proc_file, proc_dentry, O_RDONLY); ++ if(err) ++ return(err); ++ ++ readlink = proc_dentry->d_inode->i_op->readlink; ++ n = (*readlink)(proc_dentry, buffer, buflen); ++ ++ close_private_file(&proc_file); ++ ++ return(n); ++} ++ ++static int hppfs_follow_link(struct dentry *dentry, struct nameidata *nd) ++{ ++ struct file proc_file; ++ struct dentry *proc_dentry; ++ int (*follow_link)(struct dentry *, struct nameidata *); ++ int err, n; ++ ++ proc_dentry = HPPFS_I(dentry->d_inode)->proc_dentry; ++ err = open_private_file(&proc_file, proc_dentry, O_RDONLY); ++ if(err) ++ return(err); ++ ++ follow_link = proc_dentry->d_inode->i_op->follow_link; ++ n = (*follow_link)(proc_dentry, nd); ++ ++ close_private_file(&proc_file); ++ ++ return(n); ++} ++ ++static struct inode_operations hppfs_dir_iops = { ++ .lookup = hppfs_lookup, ++}; ++ ++static struct inode_operations hppfs_link_iops = { ++ .readlink = hppfs_readlink, ++ .follow_link = hppfs_follow_link, ++}; ++ ++static int init_inode(struct inode *inode, struct dentry *dentry) ++{ ++ if(S_ISDIR(dentry->d_inode->i_mode)){ ++ inode->i_op = &hppfs_dir_iops; ++ inode->i_fop = &hppfs_dir_fops; ++ } ++ else if(S_ISLNK(dentry->d_inode->i_mode)){ ++ inode->i_op = &hppfs_link_iops; ++ inode->i_fop = &hppfs_file_fops; ++ } ++ else { ++ inode->i_op = &hppfs_file_iops; ++ inode->i_fop = &hppfs_file_fops; ++ } ++ ++ HPPFS_I(inode)->proc_dentry = dentry; ++ ++ return(0); ++} ++ ++static int hppfs_fill_super(struct super_block *sb, void *d, int silent) ++{ ++ struct inode *root_inode; ++ struct file_system_type *procfs; ++ struct super_block *proc_sb; ++ int err; ++ ++ err = -ENOENT; ++ procfs = get_fs_type("proc"); ++ if(procfs == NULL) ++ goto out; ++ ++ if(list_empty(&procfs->fs_supers)) ++ goto out; ++ ++ proc_sb = list_entry(procfs->fs_supers.next, struct super_block, ++ s_instances); ++ ++ sb->s_blocksize = 1024; ++ sb->s_blocksize_bits = 10; ++ sb->s_magic = HPPFS_SUPER_MAGIC; ++ sb->s_op = &hppfs_sbops; ++ ++ root_inode = iget(sb, 0); ++ if(root_inode == NULL) ++ goto out; ++ ++ err = init_inode(root_inode, proc_sb->s_root); ++ if(err) ++ goto out_put; ++ ++ err = -ENOMEM; ++ sb->s_root = d_alloc_root(root_inode); ++ if(sb->s_root == NULL) ++ goto out_put; ++ ++ hppfs_read_inode(root_inode); ++ ++ return(0); ++ ++ out_put: ++ iput(root_inode); ++ out: ++ return(err); ++} ++ ++static struct super_block *hppfs_read_super(struct file_system_type *type, ++ int flags, const char *dev_name, ++ void *data) ++{ ++ return(get_sb_nodev(type, flags, data, hppfs_fill_super)); ++} ++ ++static struct file_system_type hppfs_type = { ++ .owner = THIS_MODULE, ++ .name = "hppfs", ++ .get_sb = hppfs_read_super, ++ .kill_sb = kill_anon_super, ++ .fs_flags = 0, ++}; ++ ++static int __init init_hppfs(void) ++{ ++ return(register_filesystem(&hppfs_type)); ++} ++ ++static void __exit exit_hppfs(void) ++{ ++ unregister_filesystem(&hppfs_type); ++} ++ ++module_init(init_hppfs) ++module_exit(exit_hppfs) ++MODULE_LICENSE("GPL"); ++ ++/* ++ * Overrides for Emacs so that we 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-file-style: "linux" ++ * End: ++ */ +Index: uml-2.6.7/arch/um/drivers/ssl.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/ssl.c 2004-07-16 19:36:42.449693128 +0300 ++++ uml-2.6.7/arch/um/drivers/ssl.c 2004-07-16 19:47:23.694209144 +0300 +@@ -10,6 +10,7 @@ + #include "linux/major.h" + #include "linux/mm.h" + #include "linux/init.h" ++#include "linux/console.h" + #include "asm/termbits.h" + #include "asm/irq.h" + #include "line.h" +@@ -53,8 +54,9 @@ + + static struct line_driver driver = { + .name = "UML serial line", +- .devfs_name = "tts/%d", +- .major = TTYAUX_MAJOR, ++ .device_name = "ttS", ++ .devfs_name = "tts/", ++ .major = TTY_MAJOR, + .minor_start = 64, + .type = TTY_DRIVER_TYPE_SERIAL, + .subtype = 0, +@@ -149,6 +151,9 @@ + case TCSETSW: + case TCGETA: + case TIOCMGET: ++ case TCSBRK: ++ case TCSBRKP: ++ case TIOCMSET: + ret = -ENOIOCTLCMD; + break; + default: +@@ -212,6 +217,37 @@ + */ + static int ssl_init_done = 0; + ++static void ssl_console_write(struct console *c, const char *string, ++ unsigned len) ++{ ++ struct line *line = &serial_lines[c->index]; ++ if(ssl_init_done) ++ down(&line->sem); ++ console_write_chan(&line->chan_list, string, len); ++ if(ssl_init_done) ++ up(&line->sem); ++} ++ ++static struct tty_driver *ssl_console_device(struct console *c, int *index) ++{ ++ *index = c->index; ++ return ssl_driver; ++} ++ ++static int ssl_console_setup(struct console *co, char *options) ++{ ++ return(0); ++} ++ ++static struct console ssl_cons = { ++ name: "ttyS", ++ write: ssl_console_write, ++ device: ssl_console_device, ++ setup: ssl_console_setup, ++ flags: CON_PRINTBUFFER, ++ index: -1, ++}; ++ + int ssl_init(void) + { + char *new_title; +@@ -227,17 +263,18 @@ + new_title = add_xterm_umid(opts.xterm_title); + if(new_title != NULL) opts.xterm_title = new_title; + ++ register_console(&ssl_cons); + ssl_init_done = 1; + return(0); + } + +-__initcall(ssl_init); ++late_initcall(ssl_init); + + static int ssl_chan_setup(char *str) + { +- line_setup(serial_lines, sizeof(serial_lines)/sizeof(serial_lines[0]), +- str, 1); +- return(1); ++ return(line_setup(serial_lines, ++ sizeof(serial_lines)/sizeof(serial_lines[0]), ++ str, 1)); + } + + __setup("ssl", ssl_chan_setup); +Index: uml-2.6.7/arch/um/kernel/tt/Makefile +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/Makefile 2004-07-16 19:36:45.804183168 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/Makefile 2004-07-16 19:47:23.744201544 +0300 +@@ -1,5 +1,5 @@ + # +-# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) ++# Copyright (C) 2002 - 2003 Jeff Dike (jdike@addtoit.com) + # Licensed under the GPL + # + +@@ -7,7 +7,7 @@ + + obj-y = exec_kern.o exec_user.o gdb.o ksyms.o mem.o mem_user.o process_kern.o \ + syscall_kern.o syscall_user.o time.o tlb.o tracer.o trap_user.o \ +- uaccess_user.o sys-$(SUBARCH)/ ++ uaccess.o uaccess_user.o sys-$(SUBARCH)/ + + obj-$(CONFIG_PT_PROXY) += gdb_kern.o ptproxy/ + +@@ -27,5 +27,3 @@ + + $(obj)/unmap_fin.o : $(src)/unmap.o + ld -r -o $@ $< -lc -L/usr/lib +- +-clean : +Index: uml-2.6.7/fs/Makefile +=================================================================== +--- uml-2.6.7.orig/fs/Makefile 2004-07-16 19:36:51.434327256 +0300 ++++ uml-2.6.7/fs/Makefile 2004-07-16 19:47:23.786195160 +0300 +@@ -91,3 +91,5 @@ + obj-$(CONFIG_XFS_FS) += xfs/ + obj-$(CONFIG_AFS_FS) += afs/ + obj-$(CONFIG_BEFS_FS) += befs/ ++obj-$(CONFIG_HOSTFS) += hostfs/ ++obj-$(CONFIG_HPPFS) += hppfs/ +Index: uml-2.6.7/arch/um/kernel/tt/tlb.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/tlb.c 2004-07-16 19:35:58.497374896 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/tlb.c 2004-07-16 19:47:23.750200632 +0300 +@@ -10,6 +10,7 @@ + #include "asm/page.h" + #include "asm/pgtable.h" + #include "asm/uaccess.h" ++#include "asm/tlbflush.h" + #include "user_util.h" + #include "mem_user.h" + #include "os.h" +Index: uml-2.6.7/arch/um/kernel/reboot.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/reboot.c 2004-07-16 19:36:45.791185144 +0300 ++++ uml-2.6.7/arch/um/kernel/reboot.c 2004-07-16 19:47:23.724204584 +0300 +@@ -15,6 +15,7 @@ + #ifdef CONFIG_SMP + static void kill_idlers(int me) + { ++#ifdef CONFIG_MODE_TT + struct task_struct *p; + int i; + +@@ -23,6 +24,7 @@ + if((p != NULL) && (p->thread.mode.tt.extern_pid != me)) + os_kill_process(p->thread.mode.tt.extern_pid, 0); + } ++#endif + } + #endif + +Index: uml-2.6.7/arch/um/kernel/ptrace.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/ptrace.c 2004-07-16 19:36:04.815414408 +0300 ++++ uml-2.6.7/arch/um/kernel/ptrace.c 2004-07-16 19:47:23.724204584 +0300 +@@ -24,11 +24,6 @@ + { + } + +-extern long do_mmap2(struct task_struct *task, unsigned long addr, +- unsigned long len, unsigned long prot, +- unsigned long flags, unsigned long fd, +- unsigned long pgoff); +- + int sys_ptrace(long request, long pid, long addr, long data) + { + struct task_struct *child; +@@ -302,8 +297,17 @@ + return ret; + } + +-void syscall_trace(void) ++void syscall_trace(union uml_pt_regs *regs, int entryexit) + { ++ if (unlikely(current->audit_context)) { ++ if (!entryexit) ++ audit_syscall_entry(current, regs->orig_eax, ++ regs->ebx, regs->ecx, ++ regs->edx, regs->esi); ++ else ++ audit_syscall_exit(current, regs->eax); ++ } ++ + if (!test_thread_flag(TIF_SYSCALL_TRACE)) + return; + if (!(current->ptrace & PT_PTRACED)) +@@ -311,11 +315,8 @@ + + /* the 0x80 provides a way for the tracing parent to distinguish + between a syscall stop and SIGTRAP delivery */ +- current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) +- ? 0x80 : 0); +- current->state = TASK_STOPPED; +- notify_parent(current, SIGCHLD); +- schedule(); ++ ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) ++ ? 0x80 : 0)); + + /* + * this isn't the same as continuing with a signal, but it will do +Index: uml-2.6.7/arch/um/include/um_uaccess.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/um_uaccess.h 2004-07-16 19:37:08.610716048 +0300 ++++ uml-2.6.7/arch/um/include/um_uaccess.h 2004-07-16 19:47:23.709206864 +0300 +@@ -38,22 +38,73 @@ + from, n)); + } + ++/* ++ * strncpy_from_user: - Copy a NUL terminated string from userspace. ++ * @dst: Destination address, in kernel space. This buffer must be at ++ * least @count bytes long. ++ * @src: Source address, in user space. ++ * @count: Maximum number of bytes to copy, including the trailing NUL. ++ * ++ * Copies a NUL-terminated string from userspace to kernel space. ++ * ++ * On success, returns the length of the string (not including the trailing ++ * NUL). ++ * ++ * If access to userspace fails, returns -EFAULT (some data may have been ++ * copied). ++ * ++ * If @count is smaller than the length of the string, copies @count bytes ++ * and returns @count. ++ */ ++ + static inline int strncpy_from_user(char *dst, const char *src, int count) + { + return(CHOOSE_MODE_PROC(strncpy_from_user_tt, strncpy_from_user_skas, + dst, src, count)); + } + ++/* ++ * __clear_user: - Zero a block of memory in user space, with less checking. ++ * @to: Destination address, in user space. ++ * @n: Number of bytes to zero. ++ * ++ * Zero a block of memory in user space. Caller must check ++ * the specified block with access_ok() before calling this function. ++ * ++ * Returns number of bytes that could not be cleared. ++ * On success, this will be zero. ++ */ + static inline int __clear_user(void *mem, int len) + { + return(CHOOSE_MODE_PROC(__clear_user_tt, __clear_user_skas, mem, len)); + } + ++/* ++ * clear_user: - Zero a block of memory in user space. ++ * @to: Destination address, in user space. ++ * @n: Number of bytes to zero. ++ * ++ * Zero a block of memory in user space. ++ * ++ * Returns number of bytes that could not be cleared. ++ * On success, this will be zero. ++ */ + static inline int clear_user(void *mem, int len) + { + return(CHOOSE_MODE_PROC(clear_user_tt, clear_user_skas, mem, len)); + } + ++/* ++ * strlen_user: - Get the size of a string in user space. ++ * @str: The string to measure. ++ * @n: The maximum valid length ++ * ++ * Get the size of a NUL-terminated string in user space. ++ * ++ * Returns the size of the string INCLUDING the terminating NUL. ++ * On exception, returns 0. ++ * If the string is too long, returns a value greater than @n. ++ */ + static inline int strnlen_user(const void *str, int len) + { + return(CHOOSE_MODE_PROC(strnlen_user_tt, strnlen_user_skas, str, len)); +Index: uml-2.6.7/include/asm-um/current.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/current.h 2004-07-16 19:35:58.909312272 +0300 ++++ uml-2.6.7/include/asm-um/current.h 2004-07-16 19:47:23.788194856 +0300 +@@ -16,8 +16,10 @@ + #define CURRENT_THREAD(dummy) (((unsigned long) &dummy) & \ + (PAGE_MASK << CONFIG_KERNEL_STACK_ORDER)) + +-#define current ({ int dummy; \ +- ((struct thread_info *) CURRENT_THREAD(dummy))->task; }) ++#define current_thread \ ++ ({ int dummy; ((struct thread_info *) CURRENT_THREAD(dummy)); }) ++ ++#define current (current_thread->task) + + #endif /* __ASSEMBLY__ */ + +Index: uml-2.6.7/arch/um/sys-i386/bugs.c +=================================================================== +--- uml-2.6.7.orig/arch/um/sys-i386/bugs.c 2004-07-16 19:37:17.366384984 +0300 ++++ uml-2.6.7/arch/um/sys-i386/bugs.c 2004-07-16 19:47:23.770197592 +0300 +@@ -4,20 +4,21 @@ + */ + + #include <unistd.h> +-#include <fcntl.h> + #include <errno.h> + #include <string.h> + #include <sys/signal.h> ++#include <asm/ldt.h> + #include "kern_util.h" + #include "user.h" + #include "sysdep/ptrace.h" + #include "task.h" ++#include "os.h" + + #define MAXTOKEN 64 + + /* Set during early boot */ +-int cpu_has_cmov = 1; +-int cpu_has_xmm = 0; ++int host_has_cmov = 1; ++int host_has_xmm = 0; + + static char token(int fd, char *buf, int len, char stop) + { +@@ -27,13 +28,15 @@ + ptr = buf; + end = &buf[len]; + do { +- n = read(fd, ptr, sizeof(*ptr)); ++ n = os_read_file(fd, ptr, sizeof(*ptr)); + c = *ptr++; +- if(n == 0) return(0); +- else if(n != sizeof(*ptr)){ +- printk("Reading /proc/cpuinfo failed, " +- "errno = %d\n", errno); +- return(-errno); ++ if(n != sizeof(*ptr)){ ++ if(n == 0) return(0); ++ printk("Reading /proc/cpuinfo failed, err = %d\n", -n); ++ if(n < 0) ++ return(n); ++ else ++ return(-EIO); + } + } while((c != '\n') && (c != stop) && (ptr < end)); + +@@ -45,45 +48,79 @@ + return(c); + } + +-static int check_cpu_feature(char *feature, int *have_it) ++static int find_cpuinfo_line(int fd, char *key, char *scratch, int len) + { +- char buf[MAXTOKEN], c; +- int fd, len = sizeof(buf)/sizeof(buf[0]), n; +- +- printk("Checking for host processor %s support...", feature); +- fd = open("/proc/cpuinfo", O_RDONLY); +- if(fd < 0){ +- printk("Couldn't open /proc/cpuinfo, errno = %d\n", errno); +- return(0); +- } ++ int n; ++ char c; + +- *have_it = 0; +- buf[len - 1] = '\0'; ++ scratch[len - 1] = '\0'; + while(1){ +- c = token(fd, buf, len - 1, ':'); +- if(c <= 0) goto out; ++ c = token(fd, scratch, len - 1, ':'); ++ if(c <= 0) ++ return(0); + else if(c != ':'){ + printk("Failed to find ':' in /proc/cpuinfo\n"); +- goto out; ++ return(0); + } + +- if(!strncmp(buf, "flags", strlen("flags"))) break; ++ if(!strncmp(scratch, key, strlen(key))) ++ return(1); + + do { +- n = read(fd, &c, sizeof(c)); ++ n = os_read_file(fd, &c, sizeof(c)); + if(n != sizeof(c)){ + printk("Failed to find newline in " +- "/proc/cpuinfo, n = %d, errno = %d\n", +- n, errno); +- goto out; ++ "/proc/cpuinfo, err = %d\n", -n); ++ return(0); + } + } while(c != '\n'); + } ++ return(0); ++} ++ ++int cpu_feature(char *what, char *buf, int len) ++{ ++ int fd, ret = 0; ++ ++ fd = os_open_file("/proc/cpuinfo", of_read(OPENFLAGS()), 0); ++ if(fd < 0){ ++ printk("Couldn't open /proc/cpuinfo, err = %d\n", -fd); ++ return(0); ++ } ++ ++ if(!find_cpuinfo_line(fd, what, buf, len)){ ++ printk("Couldn't find '%s' line in /proc/cpuinfo\n", what); ++ goto out_close; ++ } ++ ++ token(fd, buf, len, '\n'); ++ ret = 1; ++ ++ out_close: ++ os_close_file(fd); ++ return(ret); ++} ++ ++static int check_cpu_flag(char *feature, int *have_it) ++{ ++ char buf[MAXTOKEN], c; ++ int fd, len = sizeof(buf)/sizeof(buf[0]); ++ ++ printk("Checking for host processor %s support...", feature); ++ fd = os_open_file("/proc/cpuinfo", of_read(OPENFLAGS()), 0); ++ if(fd < 0){ ++ printk("Couldn't open /proc/cpuinfo, err = %d\n", -fd); ++ return(0); ++ } ++ ++ *have_it = 0; ++ if(!find_cpuinfo_line(fd, "flags", buf, sizeof(buf) / sizeof(buf[0]))) ++ goto out; + + c = token(fd, buf, len - 1, ' '); + if(c < 0) goto out; + else if(c != ' '){ +- printk("Failed to find ':' in /proc/cpuinfo\n"); ++ printk("Failed to find ' ' in /proc/cpuinfo\n"); + goto out; + } + +@@ -100,21 +137,48 @@ + out: + if(*have_it == 0) printk("No\n"); + else if(*have_it == 1) printk("Yes\n"); +- close(fd); ++ os_close_file(fd); + return(1); + } + ++#if 0 /* This doesn't work in tt mode, plus it's causing compilation problems ++ * for some people. ++ */ ++static void disable_lcall(void) ++{ ++ struct modify_ldt_ldt_s ldt; ++ int err; ++ ++ bzero(&ldt, sizeof(ldt)); ++ ldt.entry_number = 7; ++ ldt.base_addr = 0; ++ ldt.limit = 0; ++ err = modify_ldt(1, &ldt, sizeof(ldt)); ++ if(err) ++ printk("Failed to disable lcall7 - errno = %d\n", errno); ++} ++#endif ++ ++void arch_init_thread(void) ++{ ++#if 0 ++ disable_lcall(); ++#endif ++} ++ + void arch_check_bugs(void) + { + int have_it; + +- if(access("/proc/cpuinfo", R_OK)){ ++ if(os_access("/proc/cpuinfo", OS_ACC_R_OK) < 0){ + printk("/proc/cpuinfo not available - skipping CPU capability " + "checks\n"); + return; + } +- if(check_cpu_feature("cmov", &have_it)) cpu_has_cmov = have_it; +- if(check_cpu_feature("xmm", &have_it)) cpu_has_xmm = have_it; ++ if(check_cpu_flag("cmov", &have_it)) ++ host_has_cmov = have_it; ++ if(check_cpu_flag("xmm", &have_it)) ++ host_has_xmm = have_it; + } + + int arch_handle_signal(int sig, union uml_pt_regs *regs) +@@ -130,18 +194,18 @@ + if((*((char *) ip) != 0x0f) || ((*((char *) (ip + 1)) & 0xf0) != 0x40)) + return(0); + +- if(cpu_has_cmov == 0) ++ if(host_has_cmov == 0) + panic("SIGILL caused by cmov, which this processor doesn't " + "implement, boot a filesystem compiled for older " + "processors"); +- else if(cpu_has_cmov == 1) ++ else if(host_has_cmov == 1) + panic("SIGILL caused by cmov, which this processor claims to " + "implement"); +- else if(cpu_has_cmov == -1) ++ else if(host_has_cmov == -1) + panic("SIGILL caused by cmov, couldn't tell if this processor " + "implements it, boot a filesystem compiled for older " + "processors"); +- else panic("Bad value for cpu_has_cmov (%d)", cpu_has_cmov); ++ else panic("Bad value for host_has_cmov (%d)", host_has_cmov); + return(0); + } + +Index: uml-2.6.7/arch/um/kernel/skas/include/mode.h +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/include/mode.h 2004-07-16 19:36:48.253810768 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/include/mode.h 2004-07-16 19:47:23.727204128 +0300 +@@ -12,14 +12,16 @@ + extern int have_fpx_regs; + + extern void user_time_init_skas(void); +-extern int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr); +-extern int copy_sc_to_user_skas(void *to_ptr, void *fp, ++extern int copy_sc_from_user_skas(int pid, union uml_pt_regs *regs, ++ void *from_ptr); ++extern int copy_sc_to_user_skas(int pid, void *to_ptr, void *fp, + union uml_pt_regs *regs, + unsigned long fault_addr, int fault_type); + extern void sig_handler_common_skas(int sig, void *sc_ptr); + extern void halt_skas(void); + extern void reboot_skas(void); + extern void kill_off_processes_skas(void); ++extern int is_skas_winch(int pid, int fd, void *data); + + #endif + +Index: uml-2.6.7/arch/um/include/sysdep-i386/sigcontext.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/sysdep-i386/sigcontext.h 2004-07-16 19:37:08.763692792 +0300 ++++ uml-2.6.7/arch/um/include/sysdep-i386/sigcontext.h 2004-07-16 19:47:23.707207168 +0300 +@@ -28,8 +28,8 @@ + */ + #define SC_START_SYSCALL(sc) do SC_EAX(sc) = -ENOSYS; while(0) + +-/* These are General Protection and Page Fault */ +-#define SEGV_IS_FIXABLE(trap) ((trap == 13) || (trap == 14)) ++/* This is Page Fault */ ++#define SEGV_IS_FIXABLE(trap) (trap == 14) + + #define SC_SEGV_IS_FIXABLE(sc) (SEGV_IS_FIXABLE(SC_TRAPNO(sc))) + +Index: uml-2.6.7/arch/um/drivers/net_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/net_user.c 2004-07-16 19:36:10.505549376 +0300 ++++ uml-2.6.7/arch/um/drivers/net_user.c 2004-07-16 19:47:24.796041640 +0300 +@@ -26,8 +26,7 @@ + if(gate_addr == NULL) return(0); + if(sscanf(gate_addr, "%d.%d.%d.%d", &tap_addr[0], + &tap_addr[1], &tap_addr[2], &tap_addr[3]) != 4){ +- printk("Invalid tap IP address - '%s'\n", +- gate_addr); ++ printk("Invalid tap IP address - '%s'\n", gate_addr); + return(-EINVAL); + } + return(0); +@@ -60,18 +59,18 @@ + } + + *output = '\0'; +- if(read(fd, &remain, sizeof(remain)) != sizeof(remain)){ +- printk("read_output - read of length failed, errno = %d\n", +- errno); ++ n = os_read_file(fd, &remain, sizeof(remain)); ++ if(n != sizeof(remain)){ ++ printk("read_output - read of length failed, err = %d\n", -n); + return; + } + + while(remain != 0){ + n = (remain < len) ? remain : len; +- actual = read(fd, output, n); ++ actual = os_read_file(fd, output, n); + if(actual != n){ + printk("read_output - read of data failed, " +- "errno = %d\n", errno); ++ "err = %d\n", -actual); + return; + } + remain -= actual; +@@ -83,13 +82,12 @@ + { + int n; + +- while(((n = read(fd, buf, len)) < 0) && (errno == EINTR)) ; ++ n = os_read_file(fd, buf, len); + +- if(n < 0){ +- if(errno == EAGAIN) return(0); +- return(-errno); +- } +- else if(n == 0) return(-ENOTCONN); ++ if(n == -EAGAIN) ++ return(0); ++ else if(n == 0) ++ return(-ENOTCONN); + return(n); + } + +@@ -112,13 +110,13 @@ + { + int n; + +- while(((n = write(fd, buf, len)) < 0) && (errno == EINTR)) ; +- if(n < 0){ +- if(errno == EAGAIN) return(0); +- return(-errno); +- } +- else if(n == 0) return(-ENOTCONN); +- return(n); ++ n = os_write_file(fd, buf, len); ++ ++ if(n == -EAGAIN) ++ return(0); ++ else if(n == 0) ++ return(-ENOTCONN); ++ return(n); + } + + int net_send(int fd, void *buf, int len) +@@ -157,7 +155,7 @@ + { + struct change_pre_exec_data *data = arg; + +- close(data->close_me); ++ os_close_file(data->close_me); + dup2(data->stdout, 1); + } + +@@ -167,17 +165,18 @@ + struct change_pre_exec_data pe_data; + + err = os_pipe(fds, 1, 0); +- if(err){ +- printk("change_tramp - pipe failed, errno = %d\n", -err); ++ if(err < 0){ ++ printk("change_tramp - pipe failed, err = %d\n", -err); + return(err); + } + pe_data.close_me = fds[0]; + pe_data.stdout = fds[1]; + pid = run_helper(change_pre_exec, &pe_data, argv, NULL); + +- close(fds[1]); ++ os_close_file(fds[1]); + read_output(fds[0], output, output_len); +- waitpid(pid, NULL, 0); ++ ++ CATCH_EINTR(err = waitpid(pid, NULL, 0)); + return(pid); + } + +Index: uml-2.6.7/include/asm-um/processor-generic.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/processor-generic.h 2004-07-16 19:36:07.621987744 +0300 ++++ uml-2.6.7/include/asm-um/processor-generic.h 2004-07-16 19:47:23.794193944 +0300 +@@ -11,33 +11,14 @@ + struct task_struct; + + #include "linux/config.h" +-#include "linux/signal.h" + #include "asm/ptrace.h" +-#include "asm/siginfo.h" + #include "choose-mode.h" + + struct mm_struct; + + #define current_text_addr() ((void *) 0) + +-#define cpu_relax() do ; while (0) +- +-#ifdef CONFIG_MODE_TT +-struct proc_tt_mode { +- int extern_pid; +- int tracing; +- int switch_pipe[2]; +- int singlestep_syscall; +- int vm_seq; +-}; +-#endif +- +-#ifdef CONFIG_MODE_SKAS +-struct proc_skas_mode { +- void *switch_buf; +- void *fork_buf; +-}; +-#endif ++#define cpu_relax() barrier() + + struct thread_struct { + int forking; +@@ -46,6 +27,7 @@ + struct pt_regs regs; + unsigned long cr2; + int err; ++ unsigned long trap_no; + void *fault_addr; + void *fault_catcher; + struct task_struct *prev_sched; +@@ -54,10 +36,20 @@ + struct arch_thread arch; + union { + #ifdef CONFIG_MODE_TT +- struct proc_tt_mode tt; ++ struct { ++ int extern_pid; ++ int tracing; ++ int switch_pipe[2]; ++ int singlestep_syscall; ++ int vm_seq; ++ } tt; + #endif + #ifdef CONFIG_MODE_SKAS +- struct proc_skas_mode skas; ++ struct { ++ void *switch_buf; ++ void *fork_buf; ++ int mm_count; ++ } skas; + #endif + } mode; + struct { +@@ -99,14 +91,19 @@ + } mm_segment_t; + + extern struct task_struct *alloc_task_struct(void); +-extern void free_task_struct(struct task_struct *task); + + extern void release_thread(struct task_struct *); + extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); + extern void dump_thread(struct pt_regs *regs, struct user *u); ++extern void prepare_to_copy(struct task_struct *tsk); + + extern unsigned long thread_saved_pc(struct task_struct *t); + ++static inline void mm_copy_segments(struct mm_struct *from_mm, ++ struct mm_struct *new_mm) ++{ ++} ++ + #define init_stack (init_thread_union.stack) + + /* +Index: uml-2.6.7/include/asm-um/fixmap.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/fixmap.h 2004-07-16 19:37:31.708204696 +0300 ++++ uml-2.6.7/include/asm-um/fixmap.h 2004-07-16 19:47:23.790194552 +0300 +@@ -34,6 +34,7 @@ + FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ + FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, + #endif ++ FIX_VSYSCALL, + __end_of_fixed_addresses + }; + +@@ -63,6 +64,13 @@ + #define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT)) + #define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT) + ++/* ++ * This is the range that is readable by user mode, and things ++ * acting like user mode such as get_user_pages. ++ */ ++#define FIXADDR_USER_START (__fix_to_virt(FIX_VSYSCALL)) ++#define FIXADDR_USER_END (FIXADDR_USER_START + PAGE_SIZE) ++ + extern void __this_fixmap_does_not_exist(void); + + /* +Index: uml-2.6.7/arch/um/os-Linux/drivers/ethertap_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/os-Linux/drivers/ethertap_kern.c 2004-07-16 19:35:55.747792896 +0300 ++++ uml-2.6.7/arch/um/os-Linux/drivers/ethertap_kern.c 2004-07-16 19:47:23.765198352 +0300 +@@ -8,7 +8,6 @@ + #include "linux/init.h" + #include "linux/netdevice.h" + #include "linux/etherdevice.h" +-#include "linux/init.h" + #include "net_kern.h" + #include "net_user.h" + #include "etap.h" +Index: uml-2.6.7/arch/um/kernel/tt/syscall_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/syscall_user.c 2004-07-16 19:37:02.608628504 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/syscall_user.c 2004-07-16 19:47:23.749200784 +0300 +@@ -33,7 +33,7 @@ + SC_START_SYSCALL(sc); + + index = record_syscall_start(syscall); +- syscall_trace(); ++ syscall_trace(regs, 1); + result = execute_syscall(regs); + + /* regs->sc may have changed while the system call ran (there may +@@ -46,7 +46,7 @@ + (result == -ERESTARTNOINTR)) + do_signal(result); + +- syscall_trace(); ++ syscall_trace(regs, 0); + record_syscall_end(index, result); + } + +Index: uml-2.6.7/arch/um/drivers/ubd_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/ubd_kern.c 2004-07-16 19:36:39.996066136 +0300 ++++ uml-2.6.7/arch/um/drivers/ubd_kern.c 2004-07-16 19:47:23.697208688 +0300 +@@ -8,6 +8,13 @@ + * old style ubd by setting UBD_SHIFT to 0 + * 2002-09-27...2002-10-18 massive tinkering for 2.5 + * partitions have changed in 2.5 ++ * 2003-01-29 more tinkering for 2.5.59-1 ++ * This should now address the sysfs problems and has ++ * the symlink for devfs to allow for booting with ++ * the common /dev/ubd/discX/... names rather than ++ * only /dev/ubdN/discN this version also has lots of ++ * clean ups preparing for ubd-many. ++ * James McMechan + */ + + #define MAJOR_NR UBD_MAJOR +@@ -40,9 +47,12 @@ + #include "mconsole_kern.h" + #include "init.h" + #include "irq_user.h" ++#include "irq_kern.h" + #include "ubd_user.h" + #include "2_5compat.h" + #include "os.h" ++#include "mem.h" ++#include "mem_kern.h" + + static spinlock_t ubd_io_lock = SPIN_LOCK_UNLOCKED; + static spinlock_t ubd_lock = SPIN_LOCK_UNLOCKED; +@@ -56,6 +66,10 @@ + + #define MAX_DEV (8) + ++/* Changed in early boot */ ++static int ubd_do_mmap = 0; ++#define UBD_MMAP_BLOCK_SIZE PAGE_SIZE ++ + static struct block_device_operations ubd_blops = { + .owner = THIS_MODULE, + .open = ubd_open, +@@ -67,7 +81,7 @@ + static request_queue_t *ubd_queue; + + /* Protected by ubd_lock */ +-static int fake_major = 0; ++static int fake_major = MAJOR_NR; + + static struct gendisk *ubd_gendisk[MAX_DEV]; + static struct gendisk *fake_gendisk[MAX_DEV]; +@@ -96,13 +110,19 @@ + + struct ubd { + char *file; +- int is_dir; + int count; + int fd; + __u64 size; + struct openflags boot_openflags; + struct openflags openflags; ++ int no_cow; + struct cow cow; ++ ++ int map_writes; ++ int map_reads; ++ int nomap_writes; ++ int nomap_reads; ++ int write_maps; + }; + + #define DEFAULT_COW { \ +@@ -115,21 +135,28 @@ + + #define DEFAULT_UBD { \ + .file = NULL, \ +- .is_dir = 0, \ + .count = 0, \ + .fd = -1, \ + .size = -1, \ + .boot_openflags = OPEN_FLAGS, \ + .openflags = OPEN_FLAGS, \ ++ .no_cow = 0, \ + .cow = DEFAULT_COW, \ ++ .map_writes = 0, \ ++ .map_reads = 0, \ ++ .nomap_writes = 0, \ ++ .nomap_reads = 0, \ ++ .write_maps = 0, \ + } + + struct ubd ubd_dev[MAX_DEV] = { [ 0 ... MAX_DEV - 1 ] = DEFAULT_UBD }; + + static int ubd0_init(void) + { +- if(ubd_dev[0].file == NULL) +- ubd_dev[0].file = "root_fs"; ++ struct ubd *dev = &ubd_dev[0]; ++ ++ if(dev->file == NULL) ++ dev->file = "root_fs"; + return(0); + } + +@@ -196,19 +223,46 @@ + " Create ide0 entries that map onto ubd devices.\n\n" + ); + ++static int parse_unit(char **ptr) ++{ ++ char *str = *ptr, *end; ++ int n = -1; ++ ++ if(isdigit(*str)) { ++ n = simple_strtoul(str, &end, 0); ++ if(end == str) ++ return(-1); ++ *ptr = end; ++ } ++ else if (('a' <= *str) && (*str <= 'h')) { ++ n = *str - 'a'; ++ str++; ++ *ptr = str; ++ } ++ return(n); ++} ++ + static int ubd_setup_common(char *str, int *index_out) + { ++ struct ubd *dev; + struct openflags flags = global_openflags; + char *backing_file; + int n, err; + + if(index_out) *index_out = -1; +- n = *str++; ++ n = *str; + if(n == '='){ +- static int fake_major_allowed = 1; + char *end; + int major; + ++ str++; ++ if(!strcmp(str, "mmap")){ ++ CHOOSE_MODE(printk("mmap not supported by the ubd " ++ "driver in tt mode\n"), ++ ubd_do_mmap = 1); ++ return(0); ++ } ++ + if(!strcmp(str, "sync")){ + global_openflags.s = 1; + return(0); +@@ -220,20 +274,14 @@ + return(1); + } + +- if(!fake_major_allowed){ +- printk(KERN_ERR "Can't assign a fake major twice\n"); +- return(1); +- } +- + err = 1; + spin_lock(&ubd_lock); +- if(!fake_major_allowed){ ++ if(fake_major != MAJOR_NR){ + printk(KERN_ERR "Can't assign a fake major twice\n"); + goto out1; + } + + fake_major = major; +- fake_major_allowed = 0; + + printk(KERN_INFO "Setting extra ubd major number to %d\n", + major); +@@ -243,25 +291,23 @@ + return(err); + } + +- if(n < '0'){ +- printk(KERN_ERR "ubd_setup : index out of range\n"); } +- +- if((n >= '0') && (n <= '9')) n -= '0'; +- else if((n >= 'a') && (n <= 'z')) n -= 'a'; +- else { +- printk(KERN_ERR "ubd_setup : device syntax invalid\n"); ++ n = parse_unit(&str); ++ if(n < 0){ ++ printk(KERN_ERR "ubd_setup : couldn't parse unit number " ++ "'%s'\n", str); + return(1); + } + if(n >= MAX_DEV){ +- printk(KERN_ERR "ubd_setup : index out of range " +- "(%d devices)\n", MAX_DEV); ++ printk(KERN_ERR "ubd_setup : index %d out of range " ++ "(%d devices)\n", n, MAX_DEV); + return(1); + } + + err = 1; + spin_lock(&ubd_lock); + +- if(ubd_dev[n].file != NULL){ ++ dev = &ubd_dev[n]; ++ if(dev->file != NULL){ + printk(KERN_ERR "ubd_setup : device already configured\n"); + goto out2; + } +@@ -276,6 +322,11 @@ + flags.s = 1; + str++; + } ++ if (*str == 'd'){ ++ dev->no_cow = 1; ++ str++; ++ } ++ + if(*str++ != '='){ + printk(KERN_ERR "ubd_setup : Expected '='\n"); + goto out2; +@@ -284,14 +335,17 @@ + err = 0; + backing_file = strchr(str, ','); + if(backing_file){ +- *backing_file = '\0'; +- backing_file++; ++ if(dev->no_cow) ++ printk(KERN_ERR "Can't specify both 'd' and a " ++ "cow file\n"); ++ else { ++ *backing_file = '\0'; ++ backing_file++; ++ } + } +- ubd_dev[n].file = str; +- if(ubd_is_dir(ubd_dev[n].file)) +- ubd_dev[n].is_dir = 1; +- ubd_dev[n].cow.file = backing_file; +- ubd_dev[n].boot_openflags = flags; ++ dev->file = str; ++ dev->cow.file = backing_file; ++ dev->boot_openflags = flags; + out2: + spin_unlock(&ubd_lock); + return(err); +@@ -321,8 +375,7 @@ + static int fakehd_set = 0; + static int fakehd(char *str) + { +- printk(KERN_INFO +- "fakehd : Changing ubd name to \"hd\".\n"); ++ printk(KERN_INFO "fakehd : Changing ubd name to \"hd\".\n"); + fakehd_set = 1; + return 1; + } +@@ -368,32 +421,42 @@ + { + struct io_thread_req req; + struct request *rq = elv_next_request(ubd_queue); +- int n; ++ int n, err; + + do_ubd = NULL; + intr_count++; + n = read_ubd_fs(thread_fd, &req, sizeof(req)); + if(n != sizeof(req)){ + printk(KERN_ERR "Pid %d - spurious interrupt in ubd_handler, " +- "errno = %d\n", os_getpid(), -n); ++ "err = %d\n", os_getpid(), -n); + spin_lock(&ubd_io_lock); + end_request(rq, 0); + spin_unlock(&ubd_io_lock); + return; + } + +- if((req.offset != ((__u64) (rq->sector)) << 9) || +- (req.length != (rq->current_nr_sectors) << 9)) ++ if((req.op != UBD_MMAP) && ++ ((req.offset != ((__u64) (rq->sector)) << 9) || ++ (req.length != (rq->current_nr_sectors) << 9))) + panic("I/O op mismatch"); + ++ if(req.map_fd != -1){ ++ err = physmem_subst_mapping(req.buffer, req.map_fd, ++ req.map_offset, 1); ++ if(err) ++ printk("ubd_handler - physmem_subst_mapping failed, " ++ "err = %d\n", -err); ++ } ++ + ubd_finish(rq, req.error); + reactivate_fd(thread_fd, UBD_IRQ); + do_ubd_request(ubd_queue); + } + +-static void ubd_intr(int irq, void *dev, struct pt_regs *unused) ++static irqreturn_t ubd_intr(int irq, void *dev, struct pt_regs *unused) + { + ubd_handler(); ++ return(IRQ_HANDLED); + } + + /* Only changed by ubd_init, which is an initcall. */ +@@ -417,10 +480,14 @@ + + static void ubd_close(struct ubd *dev) + { ++ if(ubd_do_mmap) ++ physmem_forget_descriptor(dev->fd); + os_close_file(dev->fd); + if(dev->cow.file == NULL) + return; + ++ if(ubd_do_mmap) ++ physmem_forget_descriptor(dev->cow.fd); + os_close_file(dev->cow.fd); + vfree(dev->cow.bitmap); + dev->cow.bitmap = NULL; +@@ -429,18 +496,20 @@ + static int ubd_open_dev(struct ubd *dev) + { + struct openflags flags; +- int err, n, create_cow, *create_ptr; ++ char **back_ptr; ++ int err, create_cow, *create_ptr; + ++ dev->openflags = dev->boot_openflags; + create_cow = 0; + create_ptr = (dev->cow.file != NULL) ? &create_cow : NULL; +- dev->fd = open_ubd_file(dev->file, &dev->openflags, &dev->cow.file, ++ back_ptr = dev->no_cow ? NULL : &dev->cow.file; ++ dev->fd = open_ubd_file(dev->file, &dev->openflags, back_ptr, + &dev->cow.bitmap_offset, &dev->cow.bitmap_len, + &dev->cow.data_offset, create_ptr); + + if((dev->fd == -ENOENT) && create_cow){ +- n = dev - ubd_dev; + dev->fd = create_cow_file(dev->file, dev->cow.file, +- dev->openflags, 1 << 9, ++ dev->openflags, 1 << 9, PAGE_SIZE, + &dev->cow.bitmap_offset, + &dev->cow.bitmap_len, + &dev->cow.data_offset); +@@ -455,13 +524,17 @@ + if(dev->cow.file != NULL){ + err = -ENOMEM; + dev->cow.bitmap = (void *) vmalloc(dev->cow.bitmap_len); +- if(dev->cow.bitmap == NULL) goto error; ++ if(dev->cow.bitmap == NULL){ ++ printk(KERN_ERR "Failed to vmalloc COW bitmap\n"); ++ goto error; ++ } + flush_tlb_kernel_vm(); + + err = read_cow_bitmap(dev->fd, dev->cow.bitmap, + dev->cow.bitmap_offset, + dev->cow.bitmap_len); +- if(err) goto error; ++ if(err < 0) ++ goto error; + + flags = dev->openflags; + flags.w = 0; +@@ -481,17 +554,31 @@ + + { + struct gendisk *disk; ++ char from[sizeof("ubd/nnnnn\0")], to[sizeof("discnnnnn/disc\0")]; ++ int err; + + disk = alloc_disk(1 << UBD_SHIFT); +- if (!disk) +- return -ENOMEM; ++ if(disk == NULL) ++ return(-ENOMEM); + + disk->major = major; + disk->first_minor = unit << UBD_SHIFT; + disk->fops = &ubd_blops; + set_capacity(disk, size / 512); +- sprintf(disk->disk_name, "ubd"); +- sprintf(disk->devfs_name, "ubd/disc%d", unit); ++ if(major == MAJOR_NR){ ++ sprintf(disk->disk_name, "ubd%c", 'a' + unit); ++ sprintf(disk->devfs_name, "ubd/disc%d", unit); ++ sprintf(from, "ubd/%d", unit); ++ sprintf(to, "disc%d/disc", unit); ++ err = devfs_mk_symlink(from, to); ++ if(err) ++ printk("ubd_new_disk failed to make link from %s to " ++ "%s, error = %d\n", from, to, err); ++ } ++ else { ++ sprintf(disk->disk_name, "ubd_fake%d", unit); ++ sprintf(disk->devfs_name, "ubd_fake/disc%d", unit); ++ } + + disk->private_data = &ubd_dev[unit]; + disk->queue = ubd_queue; +@@ -506,24 +593,21 @@ + struct ubd *dev = &ubd_dev[n]; + int err; + +- if(dev->is_dir) +- return(-EISDIR); +- +- if (!dev->file) ++ if(dev->file == NULL) + return(-ENODEV); + + if (ubd_open_dev(dev)) + return(-ENODEV); + + err = ubd_file_size(dev, &dev->size); +- if(err) ++ if(err < 0) + return(err); + + err = ubd_new_disk(MAJOR_NR, dev->size, n, &ubd_gendisk[n]); + if(err) + return(err); + +- if(fake_major) ++ if(fake_major != MAJOR_NR) + ubd_new_disk(fake_major, dev->size, n, + &fake_gendisk[n]); + +@@ -561,42 +645,42 @@ + return(err); + } + +-static int ubd_get_config(char *dev, char *str, int size, char **error_out) ++static int ubd_get_config(char *name, char *str, int size, char **error_out) + { +- struct ubd *ubd; ++ struct ubd *dev; + char *end; +- int major, n = 0; ++ int n, len = 0; + +- major = simple_strtoul(dev, &end, 0); +- if((*end != '\0') || (end == dev)){ +- *error_out = "ubd_get_config : didn't parse major number"; ++ n = simple_strtoul(name, &end, 0); ++ if((*end != '\0') || (end == name)){ ++ *error_out = "ubd_get_config : didn't parse device number"; + return(-1); + } + +- if((major >= MAX_DEV) || (major < 0)){ +- *error_out = "ubd_get_config : major number out of range"; ++ if((n >= MAX_DEV) || (n < 0)){ ++ *error_out = "ubd_get_config : device number out of range"; + return(-1); + } + +- ubd = &ubd_dev[major]; ++ dev = &ubd_dev[n]; + spin_lock(&ubd_lock); + +- if(ubd->file == NULL){ +- CONFIG_CHUNK(str, size, n, "", 1); ++ if(dev->file == NULL){ ++ CONFIG_CHUNK(str, size, len, "", 1); + goto out; + } + +- CONFIG_CHUNK(str, size, n, ubd->file, 0); ++ CONFIG_CHUNK(str, size, len, dev->file, 0); + +- if(ubd->cow.file != NULL){ +- CONFIG_CHUNK(str, size, n, ",", 0); +- CONFIG_CHUNK(str, size, n, ubd->cow.file, 1); ++ if(dev->cow.file != NULL){ ++ CONFIG_CHUNK(str, size, len, ",", 0); ++ CONFIG_CHUNK(str, size, len, dev->cow.file, 1); + } +- else CONFIG_CHUNK(str, size, n, "", 1); ++ else CONFIG_CHUNK(str, size, len, "", 1); + + out: + spin_unlock(&ubd_lock); +- return(n); ++ return(len); + } + + static int ubd_remove(char *str) +@@ -604,11 +688,9 @@ + struct ubd *dev; + int n, err = -ENODEV; + +- if(!isdigit(*str)) +- return(err); /* it should be a number 0-7/a-h */ ++ n = parse_unit(&str); + +- n = *str - '0'; +- if(n >= MAX_DEV) ++ if((n < 0) || (n >= MAX_DEV)) + return(err); + + dev = &ubd_dev[n]; +@@ -669,7 +751,7 @@ + + elevator_init(ubd_queue, &elevator_noop); + +- if (fake_major != 0) { ++ if (fake_major != MAJOR_NR) { + char name[sizeof("ubd_nnn\0")]; + + snprintf(name, sizeof(name), "ubd_%d", fake_major); +@@ -696,6 +778,7 @@ + io_pid = start_io_thread(stack + PAGE_SIZE - sizeof(void *), + &thread_fd); + if(io_pid < 0){ ++ io_pid = -1; + printk(KERN_ERR + "ubd : Failed to start I/O thread (errno = %d) - " + "falling back to synchronous I/O\n", -io_pid); +@@ -703,8 +786,8 @@ + } + err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr, + SA_INTERRUPT, "ubd", ubd_dev); +- if(err != 0) printk(KERN_ERR +- "um_request_irq failed - errno = %d\n", -err); ++ if(err != 0) ++ printk(KERN_ERR "um_request_irq failed - errno = %d\n", -err); + return(err); + } + +@@ -714,15 +797,9 @@ + { + struct gendisk *disk = inode->i_bdev->bd_disk; + struct ubd *dev = disk->private_data; +- int err = -EISDIR; +- +- if(dev->is_dir == 1) +- goto out; ++ int err = 0; + +- err = 0; + if(dev->count == 0){ +- dev->openflags = dev->boot_openflags; +- + err = ubd_open_dev(dev); + if(err){ + printk(KERN_ERR "%s: Can't open \"%s\": errno = %d\n", +@@ -749,62 +826,156 @@ + return(0); + } + +-void cowify_req(struct io_thread_req *req, struct ubd *dev) ++static void cowify_bitmap(__u64 io_offset, int length, unsigned long *cow_mask, ++ __u64 *cow_offset, unsigned long *bitmap, ++ __u64 bitmap_offset, unsigned long *bitmap_words, ++ __u64 bitmap_len) ++{ ++ __u64 sector = io_offset >> 9; ++ int i, update_bitmap = 0; ++ ++ for(i = 0; i < length >> 9; i++){ ++ if(cow_mask != NULL) ++ ubd_set_bit(i, (unsigned char *) cow_mask); ++ if(ubd_test_bit(sector + i, (unsigned char *) bitmap)) ++ continue; ++ ++ update_bitmap = 1; ++ ubd_set_bit(sector + i, (unsigned char *) bitmap); ++ } ++ ++ if(!update_bitmap) ++ return; ++ ++ *cow_offset = sector / (sizeof(unsigned long) * 8); ++ ++ /* This takes care of the case where we're exactly at the end of the ++ * device, and *cow_offset + 1 is off the end. So, just back it up ++ * by one word. Thanks to Lynn Kerby for the fix and James McMechan ++ * for the original diagnosis. ++ */ ++ if(*cow_offset == ((bitmap_len + sizeof(unsigned long) - 1) / ++ sizeof(unsigned long) - 1)) ++ (*cow_offset)--; ++ ++ bitmap_words[0] = bitmap[*cow_offset]; ++ bitmap_words[1] = bitmap[*cow_offset + 1]; ++ ++ *cow_offset *= sizeof(unsigned long); ++ *cow_offset += bitmap_offset; ++} ++ ++static void cowify_req(struct io_thread_req *req, unsigned long *bitmap, ++ __u64 bitmap_offset, __u64 bitmap_len) + { +- int i, update_bitmap, sector = req->offset >> 9; ++ __u64 sector = req->offset >> 9; ++ int i; + + if(req->length > (sizeof(req->sector_mask) * 8) << 9) + panic("Operation too long"); ++ + if(req->op == UBD_READ) { + for(i = 0; i < req->length >> 9; i++){ +- if(ubd_test_bit(sector + i, (unsigned char *) +- dev->cow.bitmap)){ ++ if(ubd_test_bit(sector + i, (unsigned char *) bitmap)) + ubd_set_bit(i, (unsigned char *) + &req->sector_mask); +- } + } +- } +- else { +- update_bitmap = 0; +- for(i = 0; i < req->length >> 9; i++){ +- ubd_set_bit(i, (unsigned char *) +- &req->sector_mask); +- if(!ubd_test_bit(sector + i, (unsigned char *) +- dev->cow.bitmap)) +- update_bitmap = 1; +- ubd_set_bit(sector + i, (unsigned char *) +- dev->cow.bitmap); +- } +- if(update_bitmap){ +- req->cow_offset = sector / (sizeof(unsigned long) * 8); +- req->bitmap_words[0] = +- dev->cow.bitmap[req->cow_offset]; +- req->bitmap_words[1] = +- dev->cow.bitmap[req->cow_offset + 1]; +- req->cow_offset *= sizeof(unsigned long); +- req->cow_offset += dev->cow.bitmap_offset; ++ } ++ else cowify_bitmap(req->offset, req->length, &req->sector_mask, ++ &req->cow_offset, bitmap, bitmap_offset, ++ req->bitmap_words, bitmap_len); ++} ++ ++static int mmap_fd(struct request *req, struct ubd *dev, __u64 offset) ++{ ++ __u64 sector; ++ unsigned char *bitmap; ++ int bit, i; ++ ++ /* mmap must have been requested on the command line */ ++ if(!ubd_do_mmap) ++ return(-1); ++ ++ /* The buffer must be page aligned */ ++ if(((unsigned long) req->buffer % UBD_MMAP_BLOCK_SIZE) != 0) ++ return(-1); ++ ++ /* The request must be a page long */ ++ if((req->current_nr_sectors << 9) != PAGE_SIZE) ++ return(-1); ++ ++ if(dev->cow.file == NULL) ++ return(dev->fd); ++ ++ sector = offset >> 9; ++ bitmap = (unsigned char *) dev->cow.bitmap; ++ bit = ubd_test_bit(sector, bitmap); ++ ++ for(i = 1; i < req->current_nr_sectors; i++){ ++ if(ubd_test_bit(sector + i, bitmap) != bit) ++ return(-1); ++ } ++ ++ if(bit || (rq_data_dir(req) == WRITE)) ++ offset += dev->cow.data_offset; ++ ++ /* The data on disk must be page aligned */ ++ if((offset % UBD_MMAP_BLOCK_SIZE) != 0) ++ return(-1); ++ ++ return(bit ? dev->fd : dev->cow.fd); ++} ++ ++static int prepare_mmap_request(struct ubd *dev, int fd, __u64 offset, ++ struct request *req, ++ struct io_thread_req *io_req) ++{ ++ int err; ++ ++ if(rq_data_dir(req) == WRITE){ ++ /* Writes are almost no-ops since the new data is already in the ++ * host page cache ++ */ ++ dev->map_writes++; ++ if(dev->cow.file != NULL) ++ cowify_bitmap(io_req->offset, io_req->length, ++ &io_req->sector_mask, &io_req->cow_offset, ++ dev->cow.bitmap, dev->cow.bitmap_offset, ++ io_req->bitmap_words, ++ dev->cow.bitmap_len); ++ } ++ else { ++ int w; ++ ++ if((dev->cow.file != NULL) && (fd == dev->cow.fd)) ++ w = 0; ++ else w = dev->openflags.w; ++ ++ if((dev->cow.file != NULL) && (fd == dev->fd)) ++ offset += dev->cow.data_offset; ++ ++ err = physmem_subst_mapping(req->buffer, fd, offset, w); ++ if(err){ ++ printk("physmem_subst_mapping failed, err = %d\n", ++ -err); ++ return(1); + } ++ dev->map_reads++; + } ++ io_req->op = UBD_MMAP; ++ io_req->buffer = req->buffer; ++ return(0); + } + + static int prepare_request(struct request *req, struct io_thread_req *io_req) + { + struct gendisk *disk = req->rq_disk; + struct ubd *dev = disk->private_data; +- __u64 block; +- int nsect; ++ __u64 offset; ++ int len, fd; + + if(req->rq_status == RQ_INACTIVE) return(1); + +- if(dev->is_dir){ +- strcpy(req->buffer, "HOSTFS:"); +- strcat(req->buffer, dev->file); +- spin_lock(&ubd_io_lock); +- end_request(req, 1); +- spin_unlock(&ubd_io_lock); +- return(1); +- } +- + if((rq_data_dir(req) == WRITE) && !dev->openflags.w){ + printk("Write attempted on readonly ubd device %s\n", + disk->disk_name); +@@ -814,23 +985,49 @@ + return(1); + } + +- block = req->sector; +- nsect = req->current_nr_sectors; ++ offset = ((__u64) req->sector) << 9; ++ len = req->current_nr_sectors << 9; + +- io_req->op = rq_data_dir(req) == READ ? UBD_READ : UBD_WRITE; + io_req->fds[0] = (dev->cow.file != NULL) ? dev->cow.fd : dev->fd; + io_req->fds[1] = dev->fd; ++ io_req->map_fd = -1; ++ io_req->cow_offset = -1; ++ io_req->offset = offset; ++ io_req->length = len; ++ io_req->error = 0; ++ io_req->sector_mask = 0; ++ ++ fd = mmap_fd(req, dev, io_req->offset); ++ if(fd > 0){ ++ /* If mmapping is otherwise OK, but the first access to the ++ * page is a write, then it's not mapped in yet. So we have ++ * to write the data to disk first, then we can map the disk ++ * page in and continue normally from there. ++ */ ++ if((rq_data_dir(req) == WRITE) && !is_remapped(req->buffer)){ ++ io_req->map_fd = dev->fd; ++ io_req->map_offset = io_req->offset + ++ dev->cow.data_offset; ++ dev->write_maps++; ++ } ++ else return(prepare_mmap_request(dev, fd, io_req->offset, req, ++ io_req)); ++ } ++ ++ if(rq_data_dir(req) == READ) ++ dev->nomap_reads++; ++ else dev->nomap_writes++; ++ ++ io_req->op = (rq_data_dir(req) == READ) ? UBD_READ : UBD_WRITE; + io_req->offsets[0] = 0; + io_req->offsets[1] = dev->cow.data_offset; +- io_req->offset = ((__u64) block) << 9; +- io_req->length = nsect << 9; + io_req->buffer = req->buffer; + io_req->sectorsize = 1 << 9; +- io_req->sector_mask = 0; +- io_req->cow_offset = -1; +- io_req->error = 0; + +- if(dev->cow.file != NULL) cowify_req(io_req, dev); ++ if(dev->cow.file != NULL) ++ cowify_req(io_req, dev->cow.bitmap, dev->cow.bitmap_offset, ++ dev->cow.bitmap_len); ++ + return(0); + } + +@@ -841,7 +1038,7 @@ + int err, n; + + if(thread_fd == -1){ +- while(!list_empty(&q->queue_head)){ ++ while(!elv_queue_empty(q)){ + req = elv_next_request(q); + err = prepare_request(req, &io_req); + if(!err){ +@@ -851,7 +1048,8 @@ + } + } + else { +- if(do_ubd || list_empty(&q->queue_head)) return; ++ if(do_ubd || elv_queue_empty(q)) ++ return; + req = elv_next_request(q); + err = prepare_request(req, &io_req); + if(!err){ +@@ -885,7 +1083,7 @@ + g.heads = 128; + g.sectors = 32; + g.cylinders = dev->size / (128 * 32 * 512); +- g.start = 2; ++ g.start = get_start_sect(inode->i_bdev); + return(copy_to_user(loc, &g, sizeof(g)) ? -EFAULT : 0); + + case HDIO_SET_UNMASKINTR: +@@ -935,6 +1133,142 @@ + return(-EINVAL); + } + ++static int ubd_check_remapped(int fd, unsigned long address, int is_write, ++ __u64 offset) ++{ ++ __u64 bitmap_offset; ++ unsigned long new_bitmap[2]; ++ int i, err, n; ++ ++ /* If it's not a write access, we can't do anything about it */ ++ if(!is_write) ++ return(0); ++ ++ /* We have a write */ ++ for(i = 0; i < sizeof(ubd_dev) / sizeof(ubd_dev[0]); i++){ ++ struct ubd *dev = &ubd_dev[i]; ++ ++ if((dev->fd != fd) && (dev->cow.fd != fd)) ++ continue; ++ ++ /* It's a write to a ubd device */ ++ ++ if(!dev->openflags.w){ ++ /* It's a write access on a read-only device - probably ++ * shouldn't happen. If the kernel is trying to change ++ * something with no intention of writing it back out, ++ * then this message will clue us in that this needs ++ * fixing ++ */ ++ printk("Write access to mapped page from readonly ubd " ++ "device %d\n", i); ++ return(0); ++ } ++ ++ /* It's a write to a writeable ubd device - it must be COWed ++ * because, otherwise, the page would have been mapped in ++ * writeable ++ */ ++ ++ if(!dev->cow.file) ++ panic("Write fault on writeable non-COW ubd device %d", ++ i); ++ ++ /* It should also be an access to the backing file since the ++ * COW pages should be mapped in read-write ++ */ ++ ++ if(fd == dev->fd) ++ panic("Write fault on a backing page of ubd " ++ "device %d\n", i); ++ ++ /* So, we do the write, copying the backing data to the COW ++ * file... ++ */ ++ ++ err = os_seek_file(dev->fd, offset + dev->cow.data_offset); ++ if(err < 0) ++ panic("Couldn't seek to %lld in COW file of ubd " ++ "device %d, err = %d", ++ offset + dev->cow.data_offset, i, -err); ++ ++ n = os_write_file(dev->fd, (void *) address, PAGE_SIZE); ++ if(n != PAGE_SIZE) ++ panic("Couldn't copy data to COW file of ubd " ++ "device %d, err = %d", i, -n); ++ ++ /* ... updating the COW bitmap... */ ++ ++ cowify_bitmap(offset, PAGE_SIZE, NULL, &bitmap_offset, ++ dev->cow.bitmap, dev->cow.bitmap_offset, ++ new_bitmap, dev->cow.bitmap_len); ++ ++ err = os_seek_file(dev->fd, bitmap_offset); ++ if(err < 0) ++ panic("Couldn't seek to %lld in COW file of ubd " ++ "device %d, err = %d", bitmap_offset, i, -err); ++ ++ n = os_write_file(dev->fd, new_bitmap, sizeof(new_bitmap)); ++ if(n != sizeof(new_bitmap)) ++ panic("Couldn't update bitmap of ubd device %d, " ++ "err = %d", i, -n); ++ ++ /* Maybe we can map the COW page in, and maybe we can't. If ++ * it is a pre-V3 COW file, we can't, since the alignment will ++ * be wrong. If it is a V3 or later COW file which has been ++ * moved to a system with a larger page size, then maybe we ++ * can't, depending on the exact location of the page. ++ */ ++ ++ offset += dev->cow.data_offset; ++ ++ /* Remove the remapping, putting the original anonymous page ++ * back. If the COW file can be mapped in, that is done. ++ * Otherwise, the COW page is read in. ++ */ ++ ++ if(!physmem_remove_mapping((void *) address)) ++ panic("Address 0x%lx not remapped by ubd device %d", ++ address, i); ++ if((offset % UBD_MMAP_BLOCK_SIZE) == 0) ++ physmem_subst_mapping((void *) address, dev->fd, ++ offset, 1); ++ else { ++ err = os_seek_file(dev->fd, offset); ++ if(err < 0) ++ panic("Couldn't seek to %lld in COW file of " ++ "ubd device %d, err = %d", offset, i, ++ -err); ++ ++ n = os_read_file(dev->fd, (void *) address, PAGE_SIZE); ++ if(n != PAGE_SIZE) ++ panic("Failed to read page from offset %llx of " ++ "COW file of ubd device %d, err = %d", ++ offset, i, -n); ++ } ++ ++ return(1); ++ } ++ ++ /* It's not a write on a ubd device */ ++ return(0); ++} ++ ++static struct remapper ubd_remapper = { ++ .list = LIST_HEAD_INIT(ubd_remapper.list), ++ .proc = ubd_check_remapped, ++}; ++ ++static int ubd_remapper_setup(void) ++{ ++ if(ubd_do_mmap) ++ register_remapper(&ubd_remapper); ++ ++ return(0); ++} ++ ++__initcall(ubd_remapper_setup); ++ + /* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically +Index: uml-2.6.7/arch/um/drivers/xterm.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/xterm.c 2004-07-16 19:35:55.930765080 +0300 ++++ uml-2.6.7/arch/um/drivers/xterm.c 2004-07-16 19:47:23.699208384 +0300 +@@ -8,7 +8,6 @@ + #include <unistd.h> + #include <string.h> + #include <errno.h> +-#include <fcntl.h> + #include <termios.h> + #include <signal.h> + #include <sched.h> +@@ -36,7 +35,8 @@ + { + struct xterm_chan *data; + +- if((data = malloc(sizeof(*data))) == NULL) return(NULL); ++ data = malloc(sizeof(*data)); ++ if(data == NULL) return(NULL); + *data = ((struct xterm_chan) { .pid = -1, + .helper_pid = -1, + .device = device, +@@ -93,7 +93,7 @@ + "/usr/lib/uml/port-helper", "-uml-socket", + file, NULL }; + +- if(access(argv[4], X_OK)) ++ if(os_access(argv[4], OS_ACC_X_OK) < 0) + argv[4] = "port-helper"; + + fd = mkstemp(file); +@@ -106,13 +106,13 @@ + printk("xterm_open : unlink failed, errno = %d\n", errno); + return(-errno); + } +- close(fd); ++ os_close_file(fd); + +- fd = create_unix_socket(file, sizeof(file)); ++ fd = os_create_unix_socket(file, sizeof(file), 1); + if(fd < 0){ + printk("xterm_open : create_unix_socket failed, errno = %d\n", + -fd); +- return(-fd); ++ return(fd); + } + + sprintf(title, data->title, data->device); +@@ -128,15 +128,16 @@ + if(data->direct_rcv) + new = os_rcv_fd(fd, &data->helper_pid); + else { +- if((err = os_set_fd_block(fd, 0)) != 0){ ++ err = os_set_fd_block(fd, 0); ++ if(err < 0){ + printk("xterm_open : failed to set descriptor " +- "non-blocking, errno = %d\n", err); ++ "non-blocking, err = %d\n", -err); + return(err); + } + new = xterm_fd(fd, &data->helper_pid); + } + if(new < 0){ +- printk("xterm_open : os_rcv_fd failed, errno = %d\n", -new); ++ printk("xterm_open : os_rcv_fd failed, err = %d\n", -new); + goto out; + } + +@@ -160,7 +161,7 @@ + if(data->helper_pid != -1) + os_kill_process(data->helper_pid, 0); + data->helper_pid = -1; +- close(fd); ++ os_close_file(fd); + } + + void xterm_free(void *d) +Index: uml-2.6.7/arch/um/drivers/mconsole_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/mconsole_kern.c 2004-07-16 19:35:52.654263184 +0300 ++++ uml-2.6.7/arch/um/drivers/mconsole_kern.c 2004-07-16 19:47:23.687210208 +0300 +@@ -1,6 +1,6 @@ + /* + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) +- * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2001 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -15,6 +15,9 @@ + #include "linux/sysrq.h" + #include "linux/workqueue.h" + #include "linux/module.h" ++#include "linux/file.h" ++#include "linux/fs.h" ++#include "linux/namei.h" + #include "linux/proc_fs.h" + #include "asm/irq.h" + #include "asm/uaccess.h" +@@ -27,6 +30,7 @@ + #include "init.h" + #include "os.h" + #include "umid.h" ++#include "irq_kern.h" + + static int do_unlink_socket(struct notifier_block *notifier, + unsigned long what, void *data) +@@ -67,7 +71,7 @@ + + DECLARE_WORK(mconsole_work, mc_work_proc, NULL); + +-void mconsole_interrupt(int irq, void *dev_id, struct pt_regs *regs) ++irqreturn_t mconsole_interrupt(int irq, void *dev_id, struct pt_regs *regs) + { + int fd; + struct mconsole_entry *new; +@@ -75,9 +79,10 @@ + + fd = (int) dev_id; + while (mconsole_get_request(fd, &req)){ +- if(req.cmd->as_interrupt) (*req.cmd->handler)(&req); ++ if(req.cmd->context == MCONSOLE_INTR) ++ (*req.cmd->handler)(&req); + else { +- new = kmalloc(sizeof(req), GFP_ATOMIC); ++ new = kmalloc(sizeof(*new), GFP_ATOMIC); + if(new == NULL) + mconsole_reply(&req, "Out of memory", 1, 0); + else { +@@ -88,6 +93,7 @@ + } + if(!list_empty(&mc_requests)) schedule_work(&mconsole_work); + reactivate_fd(fd, MCONSOLE_IRQ); ++ return(IRQ_HANDLED); + } + + void mconsole_version(struct mc_request *req) +@@ -100,20 +106,109 @@ + mconsole_reply(req, version, 0, 0); + } + ++void mconsole_log(struct mc_request *req) ++{ ++ int len; ++ char *ptr = req->request.data; ++ ++ ptr += strlen("log "); ++ ++ len = req->len - (ptr - req->request.data); ++ printk("%.*s", len, ptr); ++ mconsole_reply(req, "", 0, 0); ++} ++ ++void mconsole_proc(struct mc_request *req) ++{ ++ struct nameidata nd; ++ struct file_system_type *proc; ++ struct super_block *super; ++ struct file *file; ++ int n, err; ++ char *ptr = req->request.data, *buf; ++ ++ ptr += strlen("proc"); ++ while(isspace(*ptr)) ptr++; ++ ++ proc = get_fs_type("proc"); ++ if(proc == NULL){ ++ mconsole_reply(req, "procfs not registered", 1, 0); ++ goto out; ++ } ++ ++ super = (*proc->get_sb)(proc, 0, NULL, NULL); ++ put_filesystem(proc); ++ if(super == NULL){ ++ mconsole_reply(req, "Failed to get procfs superblock", 1, 0); ++ goto out; ++ } ++ up_write(&super->s_umount); ++ ++ nd.dentry = super->s_root; ++ nd.mnt = NULL; ++ nd.flags = O_RDONLY + 1; ++ nd.last_type = LAST_ROOT; ++ ++ err = link_path_walk(ptr, &nd); ++ if(err){ ++ mconsole_reply(req, "Failed to look up file", 1, 0); ++ goto out_kill; ++ } ++ ++ file = dentry_open(nd.dentry, nd.mnt, O_RDONLY); ++ if(IS_ERR(file)){ ++ mconsole_reply(req, "Failed to open file", 1, 0); ++ goto out_kill; ++ } ++ ++ buf = kmalloc(PAGE_SIZE, GFP_KERNEL); ++ if(buf == NULL){ ++ mconsole_reply(req, "Failed to allocate buffer", 1, 0); ++ goto out_fput; ++ } ++ ++ if((file->f_op != NULL) && (file->f_op->read != NULL)){ ++ do { ++ n = (*file->f_op->read)(file, buf, PAGE_SIZE - 1, ++ &file->f_pos); ++ if(n >= 0){ ++ buf[n] = '\0'; ++ mconsole_reply(req, buf, 0, (n > 0)); ++ } ++ else { ++ mconsole_reply(req, "Read of file failed", ++ 1, 0); ++ goto out_free; ++ } ++ } while(n > 0); ++ } ++ else mconsole_reply(req, "", 0, 0); ++ ++ out_free: ++ kfree(buf); ++ out_fput: ++ fput(file); ++ out_kill: ++ deactivate_super(super); ++ out: ; ++} ++ + #define UML_MCONSOLE_HELPTEXT \ +-"Commands: +- version - Get kernel version +- help - Print this message +- halt - Halt UML +- reboot - Reboot UML +- config <dev>=<config> - Add a new device to UML; +- same syntax as command line +- config <dev> - Query the configuration of a device +- remove <dev> - Remove a device from UML +- sysrq <letter> - Performs the SysRq action controlled by the letter +- cad - invoke the Ctl-Alt-Del handler +- stop - pause the UML; it will do nothing until it receives a 'go' +- go - continue the UML after a 'stop' ++"Commands: \n\ ++ version - Get kernel version \n\ ++ help - Print this message \n\ ++ halt - Halt UML \n\ ++ reboot - Reboot UML \n\ ++ config <dev>=<config> - Add a new device to UML; \n\ ++ same syntax as command line \n\ ++ config <dev> - Query the configuration of a device \n\ ++ remove <dev> - Remove a device from UML \n\ ++ sysrq <letter> - Performs the SysRq action controlled by the letter \n\ ++ cad - invoke the Ctl-Alt-Del handler \n\ ++ stop - pause the UML; it will do nothing until it receives a 'go' \n\ ++ go - continue the UML after a 'stop' \n\ ++ log <string> - make UML enter <string> into the kernel log\n\ ++ proc <file> - returns the contents of the UML's /proc/<file>\n\ + " + + void mconsole_help(struct mc_request *req) +@@ -302,7 +397,7 @@ + if(umid_file_name("mconsole", file, sizeof(file))) return(-1); + snprintf(mconsole_socket_name, sizeof(file), "%s", file); + +- sock = create_unix_socket(file, sizeof(file)); ++ sock = os_create_unix_socket(file, sizeof(file), 1); + if (sock < 0){ + printk("Failed to initialize management console\n"); + return(1); +@@ -344,11 +439,16 @@ + if(buf == NULL) + return(-ENOMEM); + +- if(copy_from_user(buf, buffer, count)) +- return(-EFAULT); ++ if(copy_from_user(buf, buffer, count)){ ++ count = -EFAULT; ++ goto out; ++ } ++ + buf[count] = '\0'; + + mconsole_notify(notify_socket, MCONSOLE_USER_NOTIFY, buf, count); ++ out: ++ kfree(buf); + return(count); + } + +Index: uml-2.6.7/arch/um/Makefile-skas +=================================================================== +--- uml-2.6.7.orig/arch/um/Makefile-skas 2004-07-16 19:36:37.092507544 +0300 ++++ uml-2.6.7/arch/um/Makefile-skas 2004-07-16 19:47:23.764198504 +0300 +@@ -14,7 +14,7 @@ + LINK_SKAS = -Wl,-rpath,/lib + LD_SCRIPT_SKAS = dyn.lds.s + +-GEN_HEADERS += $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h ++GEN_HEADERS += $(TOPDIR)/$(ARCH_DIR)/include/skas_ptregs.h + +-$(ARCH_DIR)/kernel/skas/include/skas_ptregs.h : +- $(MAKE) -C $(ARCH_DIR)/kernel/skas include/skas_ptregs.h ++$(TOPDIR)/$(ARCH_DIR)/include/skas_ptregs.h : ++ $(Q)$(MAKE) $(build)=$(ARCH_DIR)/kernel/skas $@ +Index: uml-2.6.7/arch/um/kernel/sys_call_table.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/sys_call_table.c 2004-07-16 19:37:20.386925792 +0300 ++++ uml-2.6.7/arch/um/kernel/sys_call_table.c 2004-07-16 19:47:23.739202304 +0300 +@@ -5,7 +5,6 @@ + + #include "linux/config.h" + #include "linux/unistd.h" +-#include "linux/version.h" + #include "linux/sys.h" + #include "linux/swap.h" + #include "linux/syscalls.h" +@@ -14,251 +13,50 @@ + #include "sysdep/syscalls.h" + #include "kern_util.h" + +-extern syscall_handler_t sys_restart_syscall; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_exit; ++#ifdef CONFIG_NFSD ++#define NFSSERVCTL sys_nfsservctl ++#else ++#define NFSSERVCTL sys_ni_syscall ++#endif ++ ++#define LAST_GENERIC_SYSCALL __NR_vserver ++ ++#if LAST_GENERIC_SYSCALL > LAST_ARCH_SYSCALL ++#define LAST_SYSCALL LAST_GENERIC_SYSCALL ++#else ++#define LAST_SYSCALL LAST_ARCH_SYSCALL ++#endif ++ + extern syscall_handler_t sys_fork; +-extern syscall_handler_t sys_creat; +-extern syscall_handler_t sys_link; +-extern syscall_handler_t sys_unlink; +-extern syscall_handler_t sys_chdir; +-extern syscall_handler_t sys_mknod; +-extern syscall_handler_t sys_chmod; +-extern syscall_handler_t sys_lchown16; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_stat; +-extern syscall_handler_t sys_getpid; +-extern syscall_handler_t sys_oldumount; +-extern syscall_handler_t sys_setuid16; +-extern syscall_handler_t sys_getuid16; ++extern syscall_handler_t sys_execve; ++extern syscall_handler_t um_time; ++extern syscall_handler_t um_mount; ++extern syscall_handler_t um_stime; + extern syscall_handler_t sys_ptrace; +-extern syscall_handler_t sys_alarm; +-extern syscall_handler_t sys_fstat; +-extern syscall_handler_t sys_pause; +-extern syscall_handler_t sys_utime; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_access; +-extern syscall_handler_t sys_nice; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_sync; +-extern syscall_handler_t sys_kill; +-extern syscall_handler_t sys_rename; +-extern syscall_handler_t sys_mkdir; +-extern syscall_handler_t sys_rmdir; + extern syscall_handler_t sys_pipe; +-extern syscall_handler_t sys_times; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_brk; +-extern syscall_handler_t sys_setgid16; +-extern syscall_handler_t sys_getgid16; +-extern syscall_handler_t sys_signal; +-extern syscall_handler_t sys_geteuid16; +-extern syscall_handler_t sys_getegid16; +-extern syscall_handler_t sys_acct; +-extern syscall_handler_t sys_umount; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_ioctl; +-extern syscall_handler_t sys_fcntl; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_setpgid; +-extern syscall_handler_t sys_ni_syscall; + extern syscall_handler_t sys_olduname; +-extern syscall_handler_t sys_umask; +-extern syscall_handler_t sys_chroot; +-extern syscall_handler_t sys_ustat; +-extern syscall_handler_t sys_dup2; +-extern syscall_handler_t sys_getppid; +-extern syscall_handler_t sys_getpgrp; + extern syscall_handler_t sys_sigaction; +-extern syscall_handler_t sys_sgetmask; +-extern syscall_handler_t sys_ssetmask; +-extern syscall_handler_t sys_setreuid16; +-extern syscall_handler_t sys_setregid16; + extern syscall_handler_t sys_sigsuspend; +-extern syscall_handler_t sys_sigpending; +-extern syscall_handler_t sys_sethostname; +-extern syscall_handler_t sys_setrlimit; +-extern syscall_handler_t sys_old_getrlimit; +-extern syscall_handler_t sys_getrusage; +-extern syscall_handler_t sys_gettimeofday; +-extern syscall_handler_t sys_settimeofday; +-extern syscall_handler_t sys_getgroups16; +-extern syscall_handler_t sys_setgroups16; +-extern syscall_handler_t sys_symlink; +-extern syscall_handler_t sys_lstat; +-extern syscall_handler_t sys_readlink; +-extern syscall_handler_t sys_swapon; +-extern syscall_handler_t sys_uselib; +-extern syscall_handler_t sys_reboot; + extern syscall_handler_t old_readdir; +-extern syscall_handler_t sys_munmap; +-extern syscall_handler_t sys_truncate; +-extern syscall_handler_t sys_ftruncate; +-extern syscall_handler_t sys_fchmod; +-extern syscall_handler_t sys_fchown16; +-extern syscall_handler_t sys_getpriority; +-extern syscall_handler_t sys_setpriority; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_statfs; +-extern syscall_handler_t sys_fstatfs; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_socketcall; +-extern syscall_handler_t sys_syslog; +-extern syscall_handler_t sys_setitimer; +-extern syscall_handler_t sys_getitimer; +-extern syscall_handler_t sys_newstat; +-extern syscall_handler_t sys_newlstat; +-extern syscall_handler_t sys_newfstat; + extern syscall_handler_t sys_uname; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_vhangup; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_swapoff; +-extern syscall_handler_t sys_sysinfo; + extern syscall_handler_t sys_ipc; +-extern syscall_handler_t sys_fsync; + extern syscall_handler_t sys_sigreturn; +-extern syscall_handler_t sys_rt_sigreturn; + extern syscall_handler_t sys_clone; +-extern syscall_handler_t sys_setdomainname; +-extern syscall_handler_t sys_newuname; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_adjtimex; +-extern syscall_handler_t sys_mprotect; +-extern syscall_handler_t sys_sigprocmask; +-extern syscall_handler_t sys_init_module; +-extern syscall_handler_t sys_delete_module; +-extern syscall_handler_t sys_quotactl; +-extern syscall_handler_t sys_getpgid; +-extern syscall_handler_t sys_fchdir; +-extern syscall_handler_t sys_bdflush; +-extern syscall_handler_t sys_sysfs; +-extern syscall_handler_t sys_personality; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_setfsuid16; +-extern syscall_handler_t sys_setfsgid16; +-extern syscall_handler_t sys_llseek; +-extern syscall_handler_t sys_getdents; +-extern syscall_handler_t sys_flock; +-extern syscall_handler_t sys_msync; +-extern syscall_handler_t sys_readv; +-extern syscall_handler_t sys_writev; +-extern syscall_handler_t sys_getsid; +-extern syscall_handler_t sys_fdatasync; +-extern syscall_handler_t sys_mlock; +-extern syscall_handler_t sys_munlock; +-extern syscall_handler_t sys_mlockall; +-extern syscall_handler_t sys_munlockall; +-extern syscall_handler_t sys_sched_setparam; +-extern syscall_handler_t sys_sched_getparam; +-extern syscall_handler_t sys_sched_setscheduler; +-extern syscall_handler_t sys_sched_getscheduler; +-extern syscall_handler_t sys_sched_get_priority_max; +-extern syscall_handler_t sys_sched_get_priority_min; +-extern syscall_handler_t sys_sched_rr_get_interval; +-extern syscall_handler_t sys_nanosleep; +-extern syscall_handler_t sys_mremap; +-extern syscall_handler_t sys_setresuid16; +-extern syscall_handler_t sys_getresuid16; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_poll; +-extern syscall_handler_t sys_nfsservctl; +-extern syscall_handler_t sys_setresgid16; +-extern syscall_handler_t sys_getresgid16; +-extern syscall_handler_t sys_prctl; +-extern syscall_handler_t sys_ni_syscall; ++extern syscall_handler_t sys_rt_sigreturn; + extern syscall_handler_t sys_rt_sigaction; +-extern syscall_handler_t sys_rt_sigprocmask; +-extern syscall_handler_t sys_rt_sigpending; +-extern syscall_handler_t sys_rt_sigtimedwait; +-extern syscall_handler_t sys_rt_sigqueueinfo; +-extern syscall_handler_t sys_rt_sigsuspend; +-extern syscall_handler_t sys_pread64; +-extern syscall_handler_t sys_pwrite64; +-extern syscall_handler_t sys_chown16; +-extern syscall_handler_t sys_getcwd; +-extern syscall_handler_t sys_capget; +-extern syscall_handler_t sys_capset; + extern syscall_handler_t sys_sigaltstack; +-extern syscall_handler_t sys_sendfile; +-extern syscall_handler_t sys_ni_syscall; +-extern syscall_handler_t sys_ni_syscall; + extern syscall_handler_t sys_vfork; +-extern syscall_handler_t sys_getrlimit; + extern syscall_handler_t sys_mmap2; +-extern syscall_handler_t sys_truncate64; +-extern syscall_handler_t sys_ftruncate64; +-extern syscall_handler_t sys_stat64; +-extern syscall_handler_t sys_lstat64; +-extern syscall_handler_t sys_fstat64; +-extern syscall_handler_t sys_lchown; +-extern syscall_handler_t sys_getuid; +-extern syscall_handler_t sys_getgid; +-extern syscall_handler_t sys_geteuid; +-extern syscall_handler_t sys_getegid; +-extern syscall_handler_t sys_setreuid; +-extern syscall_handler_t sys_setregid; +-extern syscall_handler_t sys_getgroups; +-extern syscall_handler_t sys_setgroups; +-extern syscall_handler_t sys_fchown; +-extern syscall_handler_t sys_setresuid; +-extern syscall_handler_t sys_getresuid; +-extern syscall_handler_t sys_setresgid; +-extern syscall_handler_t sys_getresgid; +-extern syscall_handler_t sys_chown; +-extern syscall_handler_t sys_setuid; +-extern syscall_handler_t sys_setgid; +-extern syscall_handler_t sys_setfsuid; +-extern syscall_handler_t sys_setfsgid; +-extern syscall_handler_t sys_pivot_root; +-extern syscall_handler_t sys_mincore; +-extern syscall_handler_t sys_madvise; +-extern syscall_handler_t sys_fcntl64; +-extern syscall_handler_t sys_getdents64; +-extern syscall_handler_t sys_gettid; +-extern syscall_handler_t sys_readahead; +-extern syscall_handler_t sys_tkill; +-extern syscall_handler_t sys_sendfile64; +-extern syscall_handler_t sys_futex; +-extern syscall_handler_t sys_sched_setaffinity; +-extern syscall_handler_t sys_sched_getaffinity; +-extern syscall_handler_t sys_io_setup; +-extern syscall_handler_t sys_io_destroy; +-extern syscall_handler_t sys_io_getevents; +-extern syscall_handler_t sys_io_submit; +-extern syscall_handler_t sys_io_cancel; +-extern syscall_handler_t sys_exit_group; +-extern syscall_handler_t sys_lookup_dcookie; +-extern syscall_handler_t sys_epoll_create; +-extern syscall_handler_t sys_epoll_ctl; +-extern syscall_handler_t sys_epoll_wait; +-extern syscall_handler_t sys_remap_file_pages; +-extern syscall_handler_t sys_set_tid_address; +- +-#ifdef CONFIG_NFSD +-#define NFSSERVCTL sys_nfsservctl +-#else +-#define NFSSERVCTL sys_ni_syscall +-#endif +- +-extern syscall_handler_t um_mount; +-extern syscall_handler_t um_time; +-extern syscall_handler_t um_stime; +- +-#define LAST_GENERIC_SYSCALL __NR_set_tid_address +- +-#if LAST_GENERIC_SYSCALL > LAST_ARCH_SYSCALL +-#define LAST_SYSCALL LAST_GENERIC_SYSCALL +-#else +-#define LAST_SYSCALL LAST_ARCH_SYSCALL +-#endif ++extern syscall_handler_t sys_timer_create; ++extern syscall_handler_t old_mmap_i386; ++extern syscall_handler_t old_select; ++extern syscall_handler_t sys_modify_ldt; ++extern syscall_handler_t sys_rt_sigsuspend; + + syscall_handler_t *sys_call_table[] = { +- [ __NR_restart_syscall ] = sys_restart_syscall, +- [ __NR_exit ] = sys_exit, +- [ __NR_fork ] = sys_fork, ++ [ __NR_restart_syscall ] = (syscall_handler_t *) sys_restart_syscall, ++ [ __NR_exit ] (syscall_handler_t *) sys_exit, ++ [ __NR_fork ] (syscall_handler_t *) sys_fork, + [ __NR_read ] = (syscall_handler_t *) sys_read, + [ __NR_write ] = (syscall_handler_t *) sys_write, + +@@ -266,229 +64,249 @@ + [ __NR_open ] = (syscall_handler_t *) sys_open, + [ __NR_close ] = (syscall_handler_t *) sys_close, + [ __NR_waitpid ] = (syscall_handler_t *) sys_waitpid, +- [ __NR_creat ] = sys_creat, +- [ __NR_link ] = sys_link, +- [ __NR_unlink ] = sys_unlink, ++ [ __NR_creat ] (syscall_handler_t *) sys_creat, ++ [ __NR_link ] (syscall_handler_t *) sys_link, ++ [ __NR_unlink ] (syscall_handler_t *) sys_unlink, + [ __NR_execve ] = (syscall_handler_t *) sys_execve, + + /* declared differently in kern_util.h */ +- [ __NR_chdir ] = sys_chdir, ++ [ __NR_chdir ] (syscall_handler_t *) sys_chdir, + [ __NR_time ] = um_time, +- [ __NR_mknod ] = sys_mknod, +- [ __NR_chmod ] = sys_chmod, +- [ __NR_lchown ] = sys_lchown16, +- [ __NR_break ] = sys_ni_syscall, +- [ __NR_oldstat ] = sys_stat, ++ [ __NR_mknod ] (syscall_handler_t *) sys_mknod, ++ [ __NR_chmod ] (syscall_handler_t *) sys_chmod, ++ [ __NR_lchown ] (syscall_handler_t *) sys_lchown16, ++ [ __NR_break ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_oldstat ] (syscall_handler_t *) sys_stat, + [ __NR_lseek ] = (syscall_handler_t *) sys_lseek, +- [ __NR_getpid ] = sys_getpid, ++ [ __NR_getpid ] (syscall_handler_t *) sys_getpid, + [ __NR_mount ] = um_mount, +- [ __NR_umount ] = sys_oldumount, +- [ __NR_setuid ] = sys_setuid16, +- [ __NR_getuid ] = sys_getuid16, ++ [ __NR_umount ] (syscall_handler_t *) sys_oldumount, ++ [ __NR_setuid ] (syscall_handler_t *) sys_setuid16, ++ [ __NR_getuid ] (syscall_handler_t *) sys_getuid16, + [ __NR_stime ] = um_stime, +- [ __NR_ptrace ] = sys_ptrace, +- [ __NR_alarm ] = sys_alarm, +- [ __NR_oldfstat ] = sys_fstat, +- [ __NR_pause ] = sys_pause, +- [ __NR_utime ] = sys_utime, +- [ __NR_stty ] = sys_ni_syscall, +- [ __NR_gtty ] = sys_ni_syscall, +- [ __NR_access ] = sys_access, +- [ __NR_nice ] = sys_nice, +- [ __NR_ftime ] = sys_ni_syscall, +- [ __NR_sync ] = sys_sync, +- [ __NR_kill ] = sys_kill, +- [ __NR_rename ] = sys_rename, +- [ __NR_mkdir ] = sys_mkdir, +- [ __NR_rmdir ] = sys_rmdir, ++ [ __NR_ptrace ] (syscall_handler_t *) sys_ptrace, ++ [ __NR_alarm ] (syscall_handler_t *) sys_alarm, ++ [ __NR_oldfstat ] (syscall_handler_t *) sys_fstat, ++ [ __NR_pause ] (syscall_handler_t *) sys_pause, ++ [ __NR_utime ] (syscall_handler_t *) sys_utime, ++ [ __NR_stty ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_gtty ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_access ] (syscall_handler_t *) sys_access, ++ [ __NR_nice ] (syscall_handler_t *) sys_nice, ++ [ __NR_ftime ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_sync ] (syscall_handler_t *) sys_sync, ++ [ __NR_kill ] (syscall_handler_t *) sys_kill, ++ [ __NR_rename ] (syscall_handler_t *) sys_rename, ++ [ __NR_mkdir ] (syscall_handler_t *) sys_mkdir, ++ [ __NR_rmdir ] (syscall_handler_t *) sys_rmdir, + + /* Declared differently in asm/unistd.h */ + [ __NR_dup ] = (syscall_handler_t *) sys_dup, +- [ __NR_pipe ] = sys_pipe, +- [ __NR_times ] = sys_times, +- [ __NR_prof ] = sys_ni_syscall, +- [ __NR_brk ] = sys_brk, +- [ __NR_setgid ] = sys_setgid16, +- [ __NR_getgid ] = sys_getgid16, +- [ __NR_signal ] = sys_signal, +- [ __NR_geteuid ] = sys_geteuid16, +- [ __NR_getegid ] = sys_getegid16, +- [ __NR_acct ] = sys_acct, +- [ __NR_umount2 ] = sys_umount, +- [ __NR_lock ] = sys_ni_syscall, +- [ __NR_ioctl ] = sys_ioctl, +- [ __NR_fcntl ] = sys_fcntl, +- [ __NR_mpx ] = sys_ni_syscall, +- [ __NR_setpgid ] = sys_setpgid, +- [ __NR_ulimit ] = sys_ni_syscall, +- [ __NR_oldolduname ] = sys_olduname, +- [ __NR_umask ] = sys_umask, +- [ __NR_chroot ] = sys_chroot, +- [ __NR_ustat ] = sys_ustat, +- [ __NR_dup2 ] = sys_dup2, +- [ __NR_getppid ] = sys_getppid, +- [ __NR_getpgrp ] = sys_getpgrp, ++ [ __NR_pipe ] (syscall_handler_t *) sys_pipe, ++ [ __NR_times ] (syscall_handler_t *) sys_times, ++ [ __NR_prof ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_brk ] (syscall_handler_t *) sys_brk, ++ [ __NR_setgid ] (syscall_handler_t *) sys_setgid16, ++ [ __NR_getgid ] (syscall_handler_t *) sys_getgid16, ++ [ __NR_signal ] (syscall_handler_t *) sys_signal, ++ [ __NR_geteuid ] (syscall_handler_t *) sys_geteuid16, ++ [ __NR_getegid ] (syscall_handler_t *) sys_getegid16, ++ [ __NR_acct ] (syscall_handler_t *) sys_acct, ++ [ __NR_umount2 ] (syscall_handler_t *) sys_umount, ++ [ __NR_lock ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_ioctl ] (syscall_handler_t *) sys_ioctl, ++ [ __NR_fcntl ] (syscall_handler_t *) sys_fcntl, ++ [ __NR_mpx ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_setpgid ] (syscall_handler_t *) sys_setpgid, ++ [ __NR_ulimit ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_oldolduname ] (syscall_handler_t *) sys_olduname, ++ [ __NR_umask ] (syscall_handler_t *) sys_umask, ++ [ __NR_chroot ] (syscall_handler_t *) sys_chroot, ++ [ __NR_ustat ] (syscall_handler_t *) sys_ustat, ++ [ __NR_dup2 ] (syscall_handler_t *) sys_dup2, ++ [ __NR_getppid ] (syscall_handler_t *) sys_getppid, ++ [ __NR_getpgrp ] (syscall_handler_t *) sys_getpgrp, + [ __NR_setsid ] = (syscall_handler_t *) sys_setsid, +- [ __NR_sigaction ] = sys_sigaction, +- [ __NR_sgetmask ] = sys_sgetmask, +- [ __NR_ssetmask ] = sys_ssetmask, +- [ __NR_setreuid ] = sys_setreuid16, +- [ __NR_setregid ] = sys_setregid16, +- [ __NR_sigsuspend ] = sys_sigsuspend, +- [ __NR_sigpending ] = sys_sigpending, +- [ __NR_sethostname ] = sys_sethostname, +- [ __NR_setrlimit ] = sys_setrlimit, +- [ __NR_getrlimit ] = sys_old_getrlimit, +- [ __NR_getrusage ] = sys_getrusage, +- [ __NR_gettimeofday ] = sys_gettimeofday, +- [ __NR_settimeofday ] = sys_settimeofday, +- [ __NR_getgroups ] = sys_getgroups16, +- [ __NR_setgroups ] = sys_setgroups16, +- [ __NR_symlink ] = sys_symlink, +- [ __NR_oldlstat ] = sys_lstat, +- [ __NR_readlink ] = sys_readlink, +- [ __NR_uselib ] = sys_uselib, ++ [ __NR_sigaction ] (syscall_handler_t *) sys_sigaction, ++ [ __NR_sgetmask ] (syscall_handler_t *) sys_sgetmask, ++ [ __NR_ssetmask ] (syscall_handler_t *) sys_ssetmask, ++ [ __NR_setreuid ] (syscall_handler_t *) sys_setreuid16, ++ [ __NR_setregid ] (syscall_handler_t *) sys_setregid16, ++ [ __NR_sigsuspend ] (syscall_handler_t *) sys_sigsuspend, ++ [ __NR_sigpending ] (syscall_handler_t *) sys_sigpending, ++ [ __NR_sethostname ] (syscall_handler_t *) sys_sethostname, ++ [ __NR_setrlimit ] (syscall_handler_t *) sys_setrlimit, ++ [ __NR_getrlimit ] (syscall_handler_t *) sys_old_getrlimit, ++ [ __NR_getrusage ] (syscall_handler_t *) sys_getrusage, ++ [ __NR_gettimeofday ] (syscall_handler_t *) sys_gettimeofday, ++ [ __NR_settimeofday ] (syscall_handler_t *) sys_settimeofday, ++ [ __NR_getgroups ] (syscall_handler_t *) sys_getgroups16, ++ [ __NR_setgroups ] (syscall_handler_t *) sys_setgroups16, ++ [ __NR_symlink ] (syscall_handler_t *) sys_symlink, ++ [ __NR_oldlstat ] (syscall_handler_t *) sys_lstat, ++ [ __NR_readlink ] (syscall_handler_t *) sys_readlink, ++ [ __NR_uselib ] (syscall_handler_t *) sys_uselib, + [ __NR_swapon ] = (syscall_handler_t *) sys_swapon, +- [ __NR_reboot ] = sys_reboot, ++ [ __NR_reboot ] (syscall_handler_t *) sys_reboot, + [ __NR_readdir ] = old_readdir, +- [ __NR_munmap ] = sys_munmap, +- [ __NR_truncate ] = sys_truncate, +- [ __NR_ftruncate ] = sys_ftruncate, +- [ __NR_fchmod ] = sys_fchmod, +- [ __NR_fchown ] = sys_fchown16, +- [ __NR_getpriority ] = sys_getpriority, +- [ __NR_setpriority ] = sys_setpriority, +- [ __NR_profil ] = sys_ni_syscall, +- [ __NR_statfs ] = sys_statfs, +- [ __NR_fstatfs ] = sys_fstatfs, +- [ __NR_ioperm ] = sys_ni_syscall, +- [ __NR_socketcall ] = sys_socketcall, +- [ __NR_syslog ] = sys_syslog, +- [ __NR_setitimer ] = sys_setitimer, +- [ __NR_getitimer ] = sys_getitimer, +- [ __NR_stat ] = sys_newstat, +- [ __NR_lstat ] = sys_newlstat, +- [ __NR_fstat ] = sys_newfstat, +- [ __NR_olduname ] = sys_uname, +- [ __NR_iopl ] = sys_ni_syscall, +- [ __NR_vhangup ] = sys_vhangup, +- [ __NR_idle ] = sys_ni_syscall, ++ [ __NR_munmap ] (syscall_handler_t *) sys_munmap, ++ [ __NR_truncate ] (syscall_handler_t *) sys_truncate, ++ [ __NR_ftruncate ] (syscall_handler_t *) sys_ftruncate, ++ [ __NR_fchmod ] (syscall_handler_t *) sys_fchmod, ++ [ __NR_fchown ] (syscall_handler_t *) sys_fchown16, ++ [ __NR_getpriority ] (syscall_handler_t *) sys_getpriority, ++ [ __NR_setpriority ] (syscall_handler_t *) sys_setpriority, ++ [ __NR_profil ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_statfs ] (syscall_handler_t *) sys_statfs, ++ [ __NR_fstatfs ] (syscall_handler_t *) sys_fstatfs, ++ [ __NR_ioperm ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_socketcall ] (syscall_handler_t *) sys_socketcall, ++ [ __NR_syslog ] (syscall_handler_t *) sys_syslog, ++ [ __NR_setitimer ] (syscall_handler_t *) sys_setitimer, ++ [ __NR_getitimer ] (syscall_handler_t *) sys_getitimer, ++ [ __NR_stat ] (syscall_handler_t *) sys_newstat, ++ [ __NR_lstat ] (syscall_handler_t *) sys_newlstat, ++ [ __NR_fstat ] (syscall_handler_t *) sys_newfstat, ++ [ __NR_olduname ] (syscall_handler_t *) sys_uname, ++ [ __NR_iopl ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_vhangup ] (syscall_handler_t *) sys_vhangup, ++ [ __NR_idle ] (syscall_handler_t *) sys_ni_syscall, + [ __NR_wait4 ] = (syscall_handler_t *) sys_wait4, + [ __NR_swapoff ] = (syscall_handler_t *) sys_swapoff, +- [ __NR_sysinfo ] = sys_sysinfo, +- [ __NR_ipc ] = sys_ipc, +- [ __NR_fsync ] = sys_fsync, +- [ __NR_sigreturn ] = sys_sigreturn, +- [ __NR_clone ] = sys_clone, +- [ __NR_setdomainname ] = sys_setdomainname, +- [ __NR_uname ] = sys_newuname, +- [ __NR_adjtimex ] = sys_adjtimex, +- [ __NR_mprotect ] = sys_mprotect, +- [ __NR_sigprocmask ] = sys_sigprocmask, +- [ __NR_create_module ] = sys_ni_syscall, +- [ __NR_init_module ] = sys_init_module, +- [ __NR_delete_module ] = sys_delete_module, +- [ __NR_get_kernel_syms ] = sys_ni_syscall, +- [ __NR_quotactl ] = sys_quotactl, +- [ __NR_getpgid ] = sys_getpgid, +- [ __NR_fchdir ] = sys_fchdir, +- [ __NR_bdflush ] = sys_bdflush, +- [ __NR_sysfs ] = sys_sysfs, +- [ __NR_personality ] = sys_personality, +- [ __NR_afs_syscall ] = sys_ni_syscall, +- [ __NR_setfsuid ] = sys_setfsuid16, +- [ __NR_setfsgid ] = sys_setfsgid16, +- [ __NR__llseek ] = sys_llseek, +- [ __NR_getdents ] = sys_getdents, ++ [ __NR_sysinfo ] (syscall_handler_t *) sys_sysinfo, ++ [ __NR_ipc ] (syscall_handler_t *) sys_ipc, ++ [ __NR_fsync ] (syscall_handler_t *) sys_fsync, ++ [ __NR_sigreturn ] (syscall_handler_t *) sys_sigreturn, ++ [ __NR_clone ] (syscall_handler_t *) sys_clone, ++ [ __NR_setdomainname ] (syscall_handler_t *) sys_setdomainname, ++ [ __NR_uname ] (syscall_handler_t *) sys_newuname, ++ [ __NR_adjtimex ] (syscall_handler_t *) sys_adjtimex, ++ [ __NR_mprotect ] (syscall_handler_t *) sys_mprotect, ++ [ __NR_sigprocmask ] (syscall_handler_t *) sys_sigprocmask, ++ [ __NR_create_module ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_init_module ] (syscall_handler_t *) sys_init_module, ++ [ __NR_delete_module ] (syscall_handler_t *) sys_delete_module, ++ [ __NR_get_kernel_syms ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_quotactl ] (syscall_handler_t *) sys_quotactl, ++ [ __NR_getpgid ] (syscall_handler_t *) sys_getpgid, ++ [ __NR_fchdir ] (syscall_handler_t *) sys_fchdir, ++ [ __NR_bdflush ] (syscall_handler_t *) sys_bdflush, ++ [ __NR_sysfs ] (syscall_handler_t *) sys_sysfs, ++ [ __NR_personality ] (syscall_handler_t *) sys_personality, ++ [ __NR_afs_syscall ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_setfsuid ] (syscall_handler_t *) sys_setfsuid16, ++ [ __NR_setfsgid ] (syscall_handler_t *) sys_setfsgid16, ++ [ __NR__llseek ] (syscall_handler_t *) sys_llseek, ++ [ __NR_getdents ] (syscall_handler_t *) sys_getdents, + [ __NR__newselect ] = (syscall_handler_t *) sys_select, +- [ __NR_flock ] = sys_flock, +- [ __NR_msync ] = sys_msync, +- [ __NR_readv ] = sys_readv, +- [ __NR_writev ] = sys_writev, +- [ __NR_getsid ] = sys_getsid, +- [ __NR_fdatasync ] = sys_fdatasync, ++ [ __NR_flock ] (syscall_handler_t *) sys_flock, ++ [ __NR_msync ] (syscall_handler_t *) sys_msync, ++ [ __NR_readv ] (syscall_handler_t *) sys_readv, ++ [ __NR_writev ] (syscall_handler_t *) sys_writev, ++ [ __NR_getsid ] (syscall_handler_t *) sys_getsid, ++ [ __NR_fdatasync ] (syscall_handler_t *) sys_fdatasync, + [ __NR__sysctl ] = (syscall_handler_t *) sys_sysctl, +- [ __NR_mlock ] = sys_mlock, +- [ __NR_munlock ] = sys_munlock, +- [ __NR_mlockall ] = sys_mlockall, +- [ __NR_munlockall ] = sys_munlockall, +- [ __NR_sched_setparam ] = sys_sched_setparam, +- [ __NR_sched_getparam ] = sys_sched_getparam, +- [ __NR_sched_setscheduler ] = sys_sched_setscheduler, +- [ __NR_sched_getscheduler ] = sys_sched_getscheduler, ++ [ __NR_mlock ] (syscall_handler_t *) sys_mlock, ++ [ __NR_munlock ] (syscall_handler_t *) sys_munlock, ++ [ __NR_mlockall ] (syscall_handler_t *) sys_mlockall, ++ [ __NR_munlockall ] (syscall_handler_t *) sys_munlockall, ++ [ __NR_sched_setparam ] (syscall_handler_t *) sys_sched_setparam, ++ [ __NR_sched_getparam ] (syscall_handler_t *) sys_sched_getparam, ++ [ __NR_sched_setscheduler ] (syscall_handler_t *) sys_sched_setscheduler, ++ [ __NR_sched_getscheduler ] (syscall_handler_t *) sys_sched_getscheduler, + [ __NR_sched_yield ] = (syscall_handler_t *) yield, +- [ __NR_sched_get_priority_max ] = sys_sched_get_priority_max, +- [ __NR_sched_get_priority_min ] = sys_sched_get_priority_min, +- [ __NR_sched_rr_get_interval ] = sys_sched_rr_get_interval, +- [ __NR_nanosleep ] = sys_nanosleep, +- [ __NR_mremap ] = sys_mremap, +- [ __NR_setresuid ] = sys_setresuid16, +- [ __NR_getresuid ] = sys_getresuid16, +- [ __NR_vm86 ] = sys_ni_syscall, +- [ __NR_query_module ] = sys_ni_syscall, +- [ __NR_poll ] = sys_poll, +- [ __NR_nfsservctl ] = NFSSERVCTL, +- [ __NR_setresgid ] = sys_setresgid16, +- [ __NR_getresgid ] = sys_getresgid16, +- [ __NR_prctl ] = sys_prctl, +- [ __NR_rt_sigreturn ] = sys_rt_sigreturn, +- [ __NR_rt_sigaction ] = sys_rt_sigaction, +- [ __NR_rt_sigprocmask ] = sys_rt_sigprocmask, +- [ __NR_rt_sigpending ] = sys_rt_sigpending, +- [ __NR_rt_sigtimedwait ] = sys_rt_sigtimedwait, +- [ __NR_rt_sigqueueinfo ] = sys_rt_sigqueueinfo, +- [ __NR_rt_sigsuspend ] = sys_rt_sigsuspend, +- [ __NR_pread64 ] = sys_pread64, +- [ __NR_pwrite64 ] = sys_pwrite64, +- [ __NR_chown ] = sys_chown16, +- [ __NR_getcwd ] = sys_getcwd, +- [ __NR_capget ] = sys_capget, +- [ __NR_capset ] = sys_capset, +- [ __NR_sigaltstack ] = sys_sigaltstack, +- [ __NR_sendfile ] = sys_sendfile, +- [ __NR_getpmsg ] = sys_ni_syscall, +- [ __NR_putpmsg ] = sys_ni_syscall, +- [ __NR_vfork ] = sys_vfork, +- [ __NR_ugetrlimit ] = sys_getrlimit, +- [ __NR_mmap2 ] = sys_mmap2, +- [ __NR_truncate64 ] = sys_truncate64, +- [ __NR_ftruncate64 ] = sys_ftruncate64, +- [ __NR_stat64 ] = sys_stat64, +- [ __NR_lstat64 ] = sys_lstat64, +- [ __NR_fstat64 ] = sys_fstat64, +- [ __NR_fcntl64 ] = sys_fcntl64, +- [ __NR_getdents64 ] = sys_getdents64, +- [ __NR_gettid ] = sys_gettid, +- [ __NR_readahead ] = sys_readahead, +- [ __NR_setxattr ] = sys_ni_syscall, +- [ __NR_lsetxattr ] = sys_ni_syscall, +- [ __NR_fsetxattr ] = sys_ni_syscall, +- [ __NR_getxattr ] = sys_ni_syscall, +- [ __NR_lgetxattr ] = sys_ni_syscall, +- [ __NR_fgetxattr ] = sys_ni_syscall, +- [ __NR_listxattr ] = sys_ni_syscall, +- [ __NR_llistxattr ] = sys_ni_syscall, +- [ __NR_flistxattr ] = sys_ni_syscall, +- [ __NR_removexattr ] = sys_ni_syscall, +- [ __NR_lremovexattr ] = sys_ni_syscall, +- [ __NR_fremovexattr ] = sys_ni_syscall, +- [ __NR_tkill ] = sys_tkill, +- [ __NR_sendfile64 ] = sys_sendfile64, +- [ __NR_futex ] = sys_futex, +- [ __NR_sched_setaffinity ] = sys_sched_setaffinity, +- [ __NR_sched_getaffinity ] = sys_sched_getaffinity, +- [ __NR_io_setup ] = sys_io_setup, +- [ __NR_io_destroy ] = sys_io_destroy, +- [ __NR_io_getevents ] = sys_io_getevents, +- [ __NR_io_submit ] = sys_io_submit, +- [ __NR_io_cancel ] = sys_io_cancel, +- [ __NR_exit_group ] = sys_exit_group, +- [ __NR_lookup_dcookie ] = sys_lookup_dcookie, +- [ __NR_epoll_create ] = sys_epoll_create, +- [ __NR_epoll_ctl ] = sys_epoll_ctl, +- [ __NR_epoll_wait ] = sys_epoll_wait, +- [ __NR_remap_file_pages ] = sys_remap_file_pages, +- [ __NR_set_tid_address ] = sys_set_tid_address, ++ [ __NR_sched_get_priority_max ] (syscall_handler_t *) sys_sched_get_priority_max, ++ [ __NR_sched_get_priority_min ] (syscall_handler_t *) sys_sched_get_priority_min, ++ [ __NR_sched_rr_get_interval ] (syscall_handler_t *) sys_sched_rr_get_interval, ++ [ __NR_nanosleep ] (syscall_handler_t *) sys_nanosleep, ++ [ __NR_mremap ] (syscall_handler_t *) sys_mremap, ++ [ __NR_setresuid ] (syscall_handler_t *) sys_setresuid16, ++ [ __NR_getresuid ] (syscall_handler_t *) sys_getresuid16, ++ [ __NR_vm86 ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_query_module ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_poll ] (syscall_handler_t *) sys_poll, ++ [ __NR_nfsservctl ] = (syscall_handler_t *) NFSSERVCTL, ++ [ __NR_setresgid ] (syscall_handler_t *) sys_setresgid16, ++ [ __NR_getresgid ] (syscall_handler_t *) sys_getresgid16, ++ [ __NR_prctl ] (syscall_handler_t *) sys_prctl, ++ [ __NR_rt_sigreturn ] (syscall_handler_t *) sys_rt_sigreturn, ++ [ __NR_rt_sigaction ] (syscall_handler_t *) sys_rt_sigaction, ++ [ __NR_rt_sigprocmask ] (syscall_handler_t *) sys_rt_sigprocmask, ++ [ __NR_rt_sigpending ] (syscall_handler_t *) sys_rt_sigpending, ++ [ __NR_rt_sigtimedwait ] (syscall_handler_t *) sys_rt_sigtimedwait, ++ [ __NR_rt_sigqueueinfo ] (syscall_handler_t *) sys_rt_sigqueueinfo, ++ [ __NR_rt_sigsuspend ] (syscall_handler_t *) sys_rt_sigsuspend, ++ [ __NR_pread64 ] (syscall_handler_t *) sys_pread64, ++ [ __NR_pwrite64 ] (syscall_handler_t *) sys_pwrite64, ++ [ __NR_chown ] (syscall_handler_t *) sys_chown16, ++ [ __NR_getcwd ] (syscall_handler_t *) sys_getcwd, ++ [ __NR_capget ] (syscall_handler_t *) sys_capget, ++ [ __NR_capset ] (syscall_handler_t *) sys_capset, ++ [ __NR_sigaltstack ] (syscall_handler_t *) sys_sigaltstack, ++ [ __NR_sendfile ] (syscall_handler_t *) sys_sendfile, ++ [ __NR_getpmsg ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_putpmsg ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_vfork ] (syscall_handler_t *) sys_vfork, ++ [ __NR_ugetrlimit ] (syscall_handler_t *) sys_getrlimit, ++ [ __NR_mmap2 ] (syscall_handler_t *) sys_mmap2, ++ [ __NR_truncate64 ] (syscall_handler_t *) sys_truncate64, ++ [ __NR_ftruncate64 ] (syscall_handler_t *) sys_ftruncate64, ++ [ __NR_stat64 ] (syscall_handler_t *) sys_stat64, ++ [ __NR_lstat64 ] (syscall_handler_t *) sys_lstat64, ++ [ __NR_fstat64 ] (syscall_handler_t *) sys_fstat64, ++ [ __NR_getdents64 ] (syscall_handler_t *) sys_getdents64, ++ [ __NR_fcntl64 ] (syscall_handler_t *) sys_fcntl64, ++ [ 223 ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_gettid ] (syscall_handler_t *) sys_gettid, ++ [ __NR_readahead ] (syscall_handler_t *) sys_readahead, ++ [ __NR_setxattr ] (syscall_handler_t *) sys_setxattr, ++ [ __NR_lsetxattr ] (syscall_handler_t *) sys_lsetxattr, ++ [ __NR_fsetxattr ] (syscall_handler_t *) sys_fsetxattr, ++ [ __NR_getxattr ] (syscall_handler_t *) sys_getxattr, ++ [ __NR_lgetxattr ] (syscall_handler_t *) sys_lgetxattr, ++ [ __NR_fgetxattr ] (syscall_handler_t *) sys_fgetxattr, ++ [ __NR_listxattr ] (syscall_handler_t *) sys_listxattr, ++ [ __NR_llistxattr ] (syscall_handler_t *) sys_llistxattr, ++ [ __NR_flistxattr ] (syscall_handler_t *) sys_flistxattr, ++ [ __NR_removexattr ] (syscall_handler_t *) sys_removexattr, ++ [ __NR_lremovexattr ] (syscall_handler_t *) sys_lremovexattr, ++ [ __NR_fremovexattr ] (syscall_handler_t *) sys_fremovexattr, ++ [ __NR_tkill ] (syscall_handler_t *) sys_tkill, ++ [ __NR_sendfile64 ] (syscall_handler_t *) sys_sendfile64, ++ [ __NR_futex ] (syscall_handler_t *) sys_futex, ++ [ __NR_sched_setaffinity ] (syscall_handler_t *) sys_sched_setaffinity, ++ [ __NR_sched_getaffinity ] (syscall_handler_t *) sys_sched_getaffinity, ++ [ __NR_set_thread_area ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_get_thread_area ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_io_setup ] (syscall_handler_t *) sys_io_setup, ++ [ __NR_io_destroy ] (syscall_handler_t *) sys_io_destroy, ++ [ __NR_io_getevents ] (syscall_handler_t *) sys_io_getevents, ++ [ __NR_io_submit ] (syscall_handler_t *) sys_io_submit, ++ [ __NR_io_cancel ] (syscall_handler_t *) sys_io_cancel, ++ [ __NR_fadvise64 ] (syscall_handler_t *) sys_fadvise64, ++ [ 251 ] (syscall_handler_t *) sys_ni_syscall, ++ [ __NR_exit_group ] (syscall_handler_t *) sys_exit_group, ++ [ __NR_lookup_dcookie ] (syscall_handler_t *) sys_lookup_dcookie, ++ [ __NR_epoll_create ] (syscall_handler_t *) sys_epoll_create, ++ [ __NR_epoll_ctl ] (syscall_handler_t *) sys_epoll_ctl, ++ [ __NR_epoll_wait ] (syscall_handler_t *) sys_epoll_wait, ++ [ __NR_remap_file_pages ] (syscall_handler_t *) sys_remap_file_pages, ++ [ __NR_set_tid_address ] (syscall_handler_t *) sys_set_tid_address, ++ [ __NR_timer_create ] (syscall_handler_t *) sys_timer_create, ++ [ __NR_timer_settime ] (syscall_handler_t *) sys_timer_settime, ++ [ __NR_timer_gettime ] (syscall_handler_t *) sys_timer_gettime, ++ [ __NR_timer_getoverrun ] (syscall_handler_t *) sys_timer_getoverrun, ++ [ __NR_timer_delete ] (syscall_handler_t *) sys_timer_delete, ++ [ __NR_clock_settime ] (syscall_handler_t *) sys_clock_settime, ++ [ __NR_clock_gettime ] (syscall_handler_t *) sys_clock_gettime, ++ [ __NR_clock_getres ] (syscall_handler_t *) sys_clock_getres, ++ [ __NR_clock_nanosleep ] (syscall_handler_t *) sys_clock_nanosleep, ++ [ __NR_statfs64 ] (syscall_handler_t *) sys_statfs64, ++ [ __NR_fstatfs64 ] (syscall_handler_t *) sys_fstatfs64, ++ [ __NR_tgkill ] (syscall_handler_t *) sys_tgkill, ++ [ __NR_utimes ] (syscall_handler_t *) sys_utimes, ++ [ __NR_fadvise64_64 ] (syscall_handler_t *) sys_fadvise64_64, ++ [ __NR_vserver ] (syscall_handler_t *) sys_ni_syscall, + + ARCH_SYSCALLS + [ LAST_SYSCALL + 1 ... NR_syscalls ] = +Index: uml-2.6.7/arch/um/kernel/exec_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/exec_kern.c 2004-07-16 19:36:16.769597096 +0300 ++++ uml-2.6.7/arch/um/kernel/exec_kern.c 2004-07-16 19:47:23.713206256 +0300 +@@ -32,10 +32,15 @@ + CHOOSE_MODE_PROC(start_thread_tt, start_thread_skas, regs, eip, esp); + } + ++extern void log_exec(char **argv, void *tty); ++ + static int execve1(char *file, char **argv, char **env) + { + int error; + ++#ifdef CONFIG_TTY_LOG ++ log_exec(argv, current->tty); ++#endif + error = do_execve(file, argv, env, ¤t->thread.regs); + if (error == 0){ + current->ptrace &= ~PT_DTRACE; +Index: uml-2.6.7/arch/um/drivers/daemon_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/daemon_user.c 2004-07-16 19:36:30.112568656 +0300 ++++ uml-2.6.7/arch/um/drivers/daemon_user.c 2004-07-16 19:47:23.681211120 +0300 +@@ -53,7 +53,8 @@ + struct request_v3 req; + int fd, n, err; + +- if((pri->control = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){ ++ pri->control = socket(AF_UNIX, SOCK_STREAM, 0); ++ if(pri->control < 0){ + printk("daemon_open : control socket failed, errno = %d\n", + errno); + return(-errno); +@@ -67,7 +68,8 @@ + goto out; + } + +- if((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0){ ++ fd = socket(AF_UNIX, SOCK_DGRAM, 0); ++ if(fd < 0){ + printk("daemon_open : data socket failed, errno = %d\n", + errno); + err = -errno; +@@ -91,18 +93,18 @@ + req.version = SWITCH_VERSION; + req.type = REQ_NEW_CONTROL; + req.sock = *local_addr; +- n = write(pri->control, &req, sizeof(req)); ++ n = os_write_file(pri->control, &req, sizeof(req)); + if(n != sizeof(req)){ +- printk("daemon_open : control setup request returned %d, " +- "errno = %d\n", n, errno); ++ printk("daemon_open : control setup request failed, err = %d\n", ++ -n); + err = -ENOTCONN; + goto out; + } + +- n = read(pri->control, sun, sizeof(*sun)); ++ n = os_read_file(pri->control, sun, sizeof(*sun)); + if(n != sizeof(*sun)){ +- printk("daemon_open : read of data socket returned %d, " +- "errno = %d\n", n, errno); ++ printk("daemon_open : read of data socket failed, err = %d\n", ++ -n); + err = -ENOTCONN; + goto out_close; + } +@@ -111,9 +113,9 @@ + return(fd); + + out_close: +- close(fd); ++ os_close_file(fd); + out: +- close(pri->control); ++ os_close_file(pri->control); + return(err); + } + +@@ -153,8 +155,8 @@ + { + struct daemon_data *pri = data; + +- close(pri->fd); +- close(pri->control); ++ os_close_file(pri->fd); ++ os_close_file(pri->control); + if(pri->data_addr != NULL) kfree(pri->data_addr); + if(pri->ctl_addr != NULL) kfree(pri->ctl_addr); + if(pri->local_addr != NULL) kfree(pri->local_addr); +Index: uml-2.6.7/include/asm-um/elf.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/elf.h 2004-07-16 19:37:00.001024920 +0300 ++++ uml-2.6.7/include/asm-um/elf.h 2004-07-16 19:47:23.789194704 +0300 +@@ -15,4 +15,17 @@ + + #define USE_ELF_CORE_DUMP + ++#define R_386_NONE 0 ++#define R_386_32 1 ++#define R_386_PC32 2 ++#define R_386_GOT32 3 ++#define R_386_PLT32 4 ++#define R_386_COPY 5 ++#define R_386_GLOB_DAT 6 ++#define R_386_JMP_SLOT 7 ++#define R_386_RELATIVE 8 ++#define R_386_GOTOFF 9 ++#define R_386_GOTPC 10 ++#define R_386_NUM 11 ++ + #endif +Index: uml-2.6.7/arch/um/kernel/skas/include/uaccess.h +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/skas/include/uaccess.h 2004-07-16 19:36:33.265089400 +0300 ++++ uml-2.6.7/arch/um/kernel/skas/include/uaccess.h 2004-07-16 19:47:23.728203976 +0300 +@@ -6,20 +6,12 @@ + #ifndef __SKAS_UACCESS_H + #define __SKAS_UACCESS_H + +-#include "linux/string.h" +-#include "linux/sched.h" +-#include "linux/err.h" +-#include "asm/processor.h" +-#include "asm/pgtable.h" + #include "asm/errno.h" +-#include "asm/current.h" +-#include "asm/a.out.h" +-#include "kern_util.h" + + #define access_ok_skas(type, addr, size) \ + ((segment_eq(get_fs(), KERNEL_DS)) || \ + (((unsigned long) (addr) < TASK_SIZE) && \ +- ((unsigned long) (addr) + (size) < TASK_SIZE))) ++ ((unsigned long) (addr) + (size) <= TASK_SIZE))) + + static inline int verify_area_skas(int type, const void * addr, + unsigned long size) +@@ -27,197 +19,12 @@ + return(access_ok_skas(type, addr, size) ? 0 : -EFAULT); + } + +-static inline unsigned long maybe_map(unsigned long virt, int is_write) +-{ +- pte_t pte; +- +- void *phys = um_virt_to_phys(current, virt, &pte); +- int dummy_code; +- +- if(IS_ERR(phys) || (is_write && !pte_write(pte))){ +- if(handle_page_fault(virt, 0, is_write, 0, &dummy_code)) +- return(0); +- phys = um_virt_to_phys(current, virt, NULL); +- } +- return((unsigned long) __va((unsigned long) phys)); +-} +- +-static inline int buffer_op(unsigned long addr, int len, +- int (*op)(unsigned long addr, int len, void *arg), +- void *arg) +-{ +- int size = min(PAGE_ALIGN(addr) - addr, (unsigned long) len); +- int remain = len, n; +- +- n = (*op)(addr, size, arg); +- if(n != 0) +- return(n < 0 ? remain : 0); +- +- addr += size; +- remain -= size; +- if(remain == 0) +- return(0); +- +- while(addr < ((addr + remain) & PAGE_MASK)){ +- n = (*op)(addr, PAGE_SIZE, arg); +- if(n != 0) +- return(n < 0 ? remain : 0); +- +- addr += PAGE_SIZE; +- remain -= PAGE_SIZE; +- } +- if(remain == 0) +- return(0); +- +- n = (*op)(addr, remain, arg); +- if(n != 0) +- return(n < 0 ? remain : 0); +- return(0); +-} +- +-static inline int copy_chunk_from_user(unsigned long from, int len, void *arg) +-{ +- unsigned long *to_ptr = arg, to = *to_ptr; +- +- from = maybe_map(from, 0); +- if(from == 0) +- return(-1); +- +- memcpy((void *) to, (void *) from, len); +- *to_ptr += len; +- return(0); +-} +- +-static inline int copy_from_user_skas(void *to, const void *from, int n) +-{ +- if(segment_eq(get_fs(), KERNEL_DS)){ +- memcpy(to, from, n); +- return(0); +- } +- +- return(access_ok_skas(VERIFY_READ, from, n) ? +- buffer_op((unsigned long) from, n, copy_chunk_from_user, &to) : +- n); +-} +- +-static inline int copy_chunk_to_user(unsigned long to, int len, void *arg) +-{ +- unsigned long *from_ptr = arg, from = *from_ptr; +- +- to = maybe_map(to, 1); +- if(to == 0) +- return(-1); +- +- memcpy((void *) to, (void *) from, len); +- *from_ptr += len; +- return(0); +-} +- +-static inline int copy_to_user_skas(void *to, const void *from, int n) +-{ +- if(segment_eq(get_fs(), KERNEL_DS)){ +- memcpy(to, from, n); +- return(0); +- } +- +- return(access_ok_skas(VERIFY_WRITE, to, n) ? +- buffer_op((unsigned long) to, n, copy_chunk_to_user, &from) : +- n); +-} +- +-static inline int strncpy_chunk_from_user(unsigned long from, int len, +- void *arg) +-{ +- char **to_ptr = arg, *to = *to_ptr; +- int n; +- +- from = maybe_map(from, 0); +- if(from == 0) +- return(-1); +- +- strncpy(to, (void *) from, len); +- n = strnlen(to, len); +- *to_ptr += n; +- +- if(n < len) +- return(1); +- return(0); +-} +- +-static inline int strncpy_from_user_skas(char *dst, const char *src, int count) +-{ +- int n; +- char *ptr = dst; +- +- if(segment_eq(get_fs(), KERNEL_DS)){ +- strncpy(dst, src, count); +- return(strnlen(dst, count)); +- } +- +- if(!access_ok_skas(VERIFY_READ, src, 1)) +- return(-EFAULT); +- +- n = buffer_op((unsigned long) src, count, strncpy_chunk_from_user, +- &ptr); +- if(n != 0) +- return(-EFAULT); +- return(strnlen(dst, count)); +-} +- +-static inline int clear_chunk(unsigned long addr, int len, void *unused) +-{ +- addr = maybe_map(addr, 1); +- if(addr == 0) +- return(-1); +- +- memset((void *) addr, 0, len); +- return(0); +-} +- +-static inline int __clear_user_skas(void *mem, int len) +-{ +- return(buffer_op((unsigned long) mem, len, clear_chunk, NULL)); +-} +- +-static inline int clear_user_skas(void *mem, int len) +-{ +- if(segment_eq(get_fs(), KERNEL_DS)){ +- memset(mem, 0, len); +- return(0); +- } +- +- return(access_ok_skas(VERIFY_WRITE, mem, len) ? +- buffer_op((unsigned long) mem, len, clear_chunk, NULL) : len); +-} +- +-static inline int strnlen_chunk(unsigned long str, int len, void *arg) +-{ +- int *len_ptr = arg, n; +- +- str = maybe_map(str, 0); +- if(str == 0) +- return(-1); +- +- n = strnlen((void *) str, len); +- *len_ptr += n; +- +- if(n < len) +- return(1); +- return(0); +-} +- +-static inline int strnlen_user_skas(const void *str, int len) +-{ +- int count = 0, n; +- +- if(segment_eq(get_fs(), KERNEL_DS)) +- return(strnlen(str, len) + 1); +- +- n = buffer_op((unsigned long) str, len, strnlen_chunk, &count); +- if(n == 0) +- return(count + 1); +- return(-EFAULT); +-} ++extern int copy_from_user_skas(void *to, const void *from, int n); ++extern int copy_to_user_skas(void *to, const void *from, int n); ++extern int strncpy_from_user_skas(char *dst, const char *src, int count); ++extern int __clear_user_skas(void *mem, int len); ++extern int clear_user_skas(void *mem, int len); ++extern int strnlen_user_skas(const void *str, int len); + + #endif + +Index: uml-2.6.7/arch/um/Kconfig +=================================================================== +--- uml-2.6.7.orig/arch/um/Kconfig 2004-07-16 19:36:40.087052304 +0300 ++++ uml-2.6.7/arch/um/Kconfig 2004-07-16 19:47:23.711206560 +0300 +@@ -61,6 +61,20 @@ + + config NET + bool "Networking support" ++ help ++ Unless you really know what you are doing, you should say Y here. ++ The reason is that some programs need kernel networking support even ++ when running on a stand-alone machine that isn't connected to any ++ other computer. If you are upgrading from an older kernel, you ++ should consider updating your networking tools too because changes ++ in the kernel and the tools often go hand in hand. The tools are ++ contained in the package net-tools, the location and version number ++ of which are given in Documentation/Changes. ++ ++ For a general introduction to Linux networking, it is highly ++ recommended to read the NET-HOWTO, available from ++ <http://www.tldp.org/docs.html#howto>. ++ + + source "fs/Kconfig.binfmt" + +@@ -85,6 +99,19 @@ + If you'd like to be able to work with files stored on the host, + say Y or M here; otherwise say N. + ++config HPPFS ++ tristate "HoneyPot ProcFS" ++ help ++ hppfs (HoneyPot ProcFS) is a filesystem which allows UML /proc ++ entries to be overridden, removed, or fabricated from the host. ++ Its purpose is to allow a UML to appear to be a physical machine ++ by removing or changing anything in /proc which gives away the ++ identity of a UML. ++ ++ See http://user-mode-linux.sf.net/hppfs.html for more information. ++ ++ You only need this if you are setting up a UML honeypot. Otherwise, ++ it is safe to say 'N' here. + + config MCONSOLE + bool "Management console" +@@ -105,6 +132,16 @@ + config MAGIC_SYSRQ + bool "Magic SysRq key" + depends on MCONSOLE ++ help ++ If you say Y here, you will have some control over the system even ++ if the system crashes for example during kernel debugging (e.g., you ++ will be able to flush the buffer cache to disk, reboot the system ++ immediately or dump some status information). This is accomplished ++ by pressing various keys while holding SysRq (Alt+PrintScreen). It ++ also works on a serial console (on PC hardware at least), if you ++ send a BREAK and then within 5 seconds a command keypress. The ++ keys are documented in Documentation/sysrq.txt. Don't say Y ++ unless you really know what this hack does. + + config HOST_2G_2G + bool "2G/2G host address space split" +@@ -168,6 +205,17 @@ + be 1 << order pages. The default is OK unless you're running Valgrind + on UML, in which case, set this to 3. + ++config UML_REAL_TIME_CLOCK ++ bool "Real-time Clock" ++ default y ++ help ++ This option makes UML time deltas match wall clock deltas. This should ++ normally be enabled. The exception would be if you are debugging with ++ UML and spend long times with UML stopped at a breakpoint. In this ++ case, when UML is restarted, it will call the timer enough times to make ++ up for the time spent at the breakpoint. This could result in a ++ noticable lag. If this is a problem, then disable this option. ++ + endmenu + + source "init/Kconfig" +@@ -240,6 +288,10 @@ + config PT_PROXY + bool "Enable ptrace proxy" + depends on XTERM_CHAN && DEBUG_INFO ++ help ++ This option enables a debugging interface which allows gdb to debug ++ the kernel without needing to actually attach to kernel threads. ++ If you want to do kernel debugging, say Y here; otherwise say N. + + config GPROF + bool "Enable gprof support" +Index: uml-2.6.7/arch/um/drivers/hostaudio_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/hostaudio_kern.c 2004-07-16 19:37:40.179916800 +0300 ++++ uml-2.6.7/arch/um/drivers/hostaudio_kern.c 2004-07-16 19:47:24.525082832 +0300 +@@ -5,44 +5,64 @@ + + #include "linux/config.h" + #include "linux/module.h" +-#include "linux/version.h" + #include "linux/init.h" + #include "linux/slab.h" + #include "linux/fs.h" + #include "linux/sound.h" + #include "linux/soundcard.h" ++#include "asm/uaccess.h" + #include "kern_util.h" + #include "init.h" +-#include "hostaudio.h" ++#include "os.h" ++ ++struct hostaudio_state { ++ int fd; ++}; ++ ++struct hostmixer_state { ++ int fd; ++}; ++ ++#define HOSTAUDIO_DEV_DSP "/dev/sound/dsp" ++#define HOSTAUDIO_DEV_MIXER "/dev/sound/mixer" + + /* Only changed from linux_main at boot time */ + char *dsp = HOSTAUDIO_DEV_DSP; + char *mixer = HOSTAUDIO_DEV_MIXER; + ++#define DSP_HELP \ ++" This is used to specify the host dsp device to the hostaudio driver.\n" \ ++" The default is \"" HOSTAUDIO_DEV_DSP "\".\n\n" ++ ++#define MIXER_HELP \ ++" This is used to specify the host mixer device to the hostaudio driver.\n" \ ++" The default is \"" HOSTAUDIO_DEV_MIXER "\".\n\n" ++ + #ifndef MODULE + static int set_dsp(char *name, int *add) + { +- dsp = uml_strdup(name); ++ dsp = name; + return(0); + } + +-__uml_setup("dsp=", set_dsp, +-"dsp=<dsp device>\n" +-" This is used to specify the host dsp device to the hostaudio driver.\n" +-" The default is \"" HOSTAUDIO_DEV_DSP "\".\n\n" +-); ++__uml_setup("dsp=", set_dsp, "dsp=<dsp device>\n" DSP_HELP); + + static int set_mixer(char *name, int *add) + { +- mixer = uml_strdup(name); ++ mixer = name; + return(0); + } + +-__uml_setup("mixer=", set_mixer, +-"mixer=<mixer device>\n" +-" This is used to specify the host mixer device to the hostaudio driver.\n" +-" The default is \"" HOSTAUDIO_DEV_MIXER "\".\n\n" +-); ++__uml_setup("mixer=", set_mixer, "mixer=<mixer device>\n" MIXER_HELP); ++ ++#else /*MODULE*/ ++ ++MODULE_PARM(dsp, "s"); ++MODULE_PARM_DESC(dsp, DSP_HELP); ++ ++MODULE_PARM(mixer, "s"); ++MODULE_PARM_DESC(mixer, MIXER_HELP); ++ + #endif + + /* /dev/dsp file operations */ +@@ -51,23 +71,55 @@ + loff_t *ppos) + { + struct hostaudio_state *state = file->private_data; ++ void *kbuf; ++ int ret; + + #ifdef DEBUG + printk("hostaudio: read called, count = %d\n", count); + #endif + +- return(hostaudio_read_user(state, buffer, count, ppos)); ++ kbuf = kmalloc(count, GFP_KERNEL); ++ if(kbuf == NULL) ++ return(-ENOMEM); ++ ++ ret = os_read_file(state->fd, kbuf, count); ++ if(ret < 0) ++ goto out; ++ ++ if(copy_to_user(buffer, kbuf, ret)) ++ ret = -EFAULT; ++ ++ out: ++ kfree(kbuf); ++ return(ret); + } + + static ssize_t hostaudio_write(struct file *file, const char *buffer, + size_t count, loff_t *ppos) + { + struct hostaudio_state *state = file->private_data; ++ void *kbuf; ++ int ret; + + #ifdef DEBUG + printk("hostaudio: write called, count = %d\n", count); + #endif +- return(hostaudio_write_user(state, buffer, count, ppos)); ++ ++ kbuf = kmalloc(count, GFP_KERNEL); ++ if(kbuf == NULL) ++ return(-ENOMEM); ++ ++ ret = -EFAULT; ++ if(copy_from_user(kbuf, buffer, count)) ++ goto out; ++ ++ ret = os_write_file(state->fd, kbuf, count); ++ if(ret < 0) ++ goto out; ++ ++ out: ++ kfree(kbuf); ++ return(ret); + } + + static unsigned int hostaudio_poll(struct file *file, +@@ -86,12 +138,43 @@ + unsigned int cmd, unsigned long arg) + { + struct hostaudio_state *state = file->private_data; ++ unsigned long data = 0; ++ int ret; + + #ifdef DEBUG + printk("hostaudio: ioctl called, cmd = %u\n", cmd); + #endif ++ switch(cmd){ ++ case SNDCTL_DSP_SPEED: ++ case SNDCTL_DSP_STEREO: ++ case SNDCTL_DSP_GETBLKSIZE: ++ case SNDCTL_DSP_CHANNELS: ++ case SNDCTL_DSP_SUBDIVIDE: ++ case SNDCTL_DSP_SETFRAGMENT: ++ if(get_user(data, (int *) arg)) ++ return(-EFAULT); ++ break; ++ default: ++ break; ++ } ++ ++ ret = os_ioctl_generic(state->fd, cmd, (unsigned long) &data); ++ ++ switch(cmd){ ++ case SNDCTL_DSP_SPEED: ++ case SNDCTL_DSP_STEREO: ++ case SNDCTL_DSP_GETBLKSIZE: ++ case SNDCTL_DSP_CHANNELS: ++ case SNDCTL_DSP_SUBDIVIDE: ++ case SNDCTL_DSP_SETFRAGMENT: ++ if(put_user(data, (int *) arg)) ++ return(-EFAULT); ++ break; ++ default: ++ break; ++ } + +- return(hostaudio_ioctl_user(state, cmd, arg)); ++ return(ret); + } + + static int hostaudio_open(struct inode *inode, struct file *file) +@@ -110,12 +193,17 @@ + if(file->f_mode & FMODE_READ) r = 1; + if(file->f_mode & FMODE_WRITE) w = 1; + +- ret = hostaudio_open_user(state, r, w, dsp); ++ ret = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0); ++ + if(ret < 0){ ++ printk("hostaudio_open failed to open '%s', err = %d\n", ++ dsp, -ret); + kfree(state); + return(ret); + } + ++ state->fd = ret; ++ + file->private_data = state; + return(0); + } +@@ -123,16 +211,19 @@ + static int hostaudio_release(struct inode *inode, struct file *file) + { + struct hostaudio_state *state = file->private_data; +- int ret; + + #ifdef DEBUG + printk("hostaudio: release called\n"); + #endif + +- ret = hostaudio_release_user(state); ++ if(state->fd >= 0){ ++ os_close_file(state->fd); ++ state->fd = -1; ++ } ++ + kfree(state); + +- return(ret); ++ return(0); + } + + /* /dev/mixer file operations */ +@@ -146,7 +237,7 @@ + printk("hostmixer: ioctl called\n"); + #endif + +- return(hostmixer_ioctl_mixdev_user(state, cmd, arg)); ++ return(os_ioctl_generic(state->fd, cmd, arg)); + } + + static int hostmixer_open_mixdev(struct inode *inode, struct file *file) +@@ -165,13 +256,17 @@ + if(file->f_mode & FMODE_READ) r = 1; + if(file->f_mode & FMODE_WRITE) w = 1; + +- ret = hostmixer_open_mixdev_user(state, r, w, mixer); ++ ret = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0); + + if(ret < 0){ ++ printk("hostaudio_open_mixdev failed to open '%s', err = %d\n", ++ dsp, -ret); + kfree(state); + return(ret); + } + ++ state->fd = ret; ++ + file->private_data = state; + return(0); + } +@@ -179,16 +274,18 @@ + static int hostmixer_release(struct inode *inode, struct file *file) + { + struct hostmixer_state *state = file->private_data; +- int ret; + + #ifdef DEBUG + printk("hostmixer: release called\n"); + #endif + +- ret = hostmixer_release_mixdev_user(state); ++ if(state->fd >= 0){ ++ os_close_file(state->fd); ++ state->fd = -1; ++ } + kfree(state); + +- return(ret); ++ return(0); + } + + +@@ -225,7 +322,8 @@ + + static int __init hostaudio_init_module(void) + { +- printk(KERN_INFO "UML Audio Relay\n"); ++ printk(KERN_INFO "UML Audio Relay (host dsp = %s, host mixer = %s)\n", ++ dsp, mixer); + + module_data.dev_audio = register_sound_dsp(&hostaudio_fops, -1); + if(module_data.dev_audio < 0){ +Index: uml-2.6.7/arch/um/include/user.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/user.h 2004-07-16 19:35:55.750792440 +0300 ++++ uml-2.6.7/arch/um/include/user.h 2004-07-16 19:47:23.709206864 +0300 +@@ -14,6 +14,7 @@ + extern void kfree(void *ptr); + extern int in_aton(char *str); + extern int open_gdb_chan(void); ++extern int strlcpy(char *, const char *, int); + + #endif + +Index: uml-2.6.7/arch/um/include/skas_ptrace.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/skas_ptrace.h 2004-07-16 19:37:26.080060304 +0300 ++++ uml-2.6.7/arch/um/include/skas_ptrace.h 2004-07-16 19:47:23.706207320 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) + * Licensed under the GPL + */ + +Index: uml-2.6.7/arch/um/kernel/tt/ptproxy/sysdep.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/ptproxy/sysdep.c 2004-07-16 19:37:13.940905736 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/ptproxy/sysdep.c 2004-07-16 19:47:23.747201088 +0300 +@@ -9,6 +9,7 @@ + #include <string.h> + #include <stdlib.h> + #include <signal.h> ++#include <errno.h> + #include <sys/types.h> + #include <sys/ptrace.h> + #include <asm/ptrace.h> +Index: uml-2.6.7/arch/um/kernel/tt/ptproxy/proxy.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/ptproxy/proxy.c 2004-07-16 19:36:56.795512232 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/ptproxy/proxy.c 2004-07-16 19:47:24.800041032 +0300 +@@ -15,7 +15,6 @@ + #include <unistd.h> + #include <signal.h> + #include <string.h> +-#include <fcntl.h> + #include <termios.h> + #include <sys/wait.h> + #include <sys/types.h> +@@ -273,7 +272,7 @@ + + child_proxy(1, W_EXITCODE(0, 0)); + while(debugger.waiting == 1){ +- pid = waitpid(debugger.pid, &status, WUNTRACED); ++ CATCH_EINTR(pid = waitpid(debugger.pid, &status, WUNTRACED)); + if(pid != debugger.pid){ + printk("fake_child_exit - waitpid failed, " + "errno = %d\n", errno); +@@ -281,7 +280,7 @@ + } + debugger_proxy(status, debugger.pid); + } +- pid = waitpid(debugger.pid, &status, WUNTRACED); ++ CATCH_EINTR(pid = waitpid(debugger.pid, &status, WUNTRACED)); + if(pid != debugger.pid){ + printk("fake_child_exit - waitpid failed, " + "errno = %d\n", errno); +@@ -293,10 +292,10 @@ + } + + char gdb_init_string[] = +-"att 1 +-b panic +-b stop +-handle SIGWINCH nostop noprint pass ++"att 1 \n\ ++b panic \n\ ++b stop \n\ ++handle SIGWINCH nostop noprint pass \n\ + "; + + int start_debugger(char *prog, int startup, int stop, int *fd_out) +@@ -304,7 +303,8 @@ + int slave, child; + + slave = open_gdb_chan(); +- if((child = fork()) == 0){ ++ child = fork(); ++ if(child == 0){ + char *tempname = NULL; + int fd; + +@@ -327,18 +327,19 @@ + exit(1); + #endif + } +- if((fd = make_tempfile("/tmp/gdb_init-XXXXXX", &tempname, 0)) < 0){ +- printk("start_debugger : make_tempfile failed, errno = %d\n", +- errno); ++ fd = make_tempfile("/tmp/gdb_init-XXXXXX", &tempname, 0); ++ if(fd < 0){ ++ printk("start_debugger : make_tempfile failed," ++ "err = %d\n", -fd); + exit(1); + } +- write(fd, gdb_init_string, sizeof(gdb_init_string) - 1); ++ os_write_file(fd, gdb_init_string, sizeof(gdb_init_string) - 1); + if(startup){ + if(stop){ +- write(fd, "b start_kernel\n", ++ os_write_file(fd, "b start_kernel\n", + strlen("b start_kernel\n")); + } +- write(fd, "c\n", strlen("c\n")); ++ os_write_file(fd, "c\n", strlen("c\n")); + } + if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ + printk("start_debugger : PTRACE_TRACEME failed, " +Index: uml-2.6.7/arch/um/kernel/tt/include/uaccess.h +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/include/uaccess.h 2004-07-16 19:37:00.052017168 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/include/uaccess.h 2004-07-16 19:47:23.744201544 +0300 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2000 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -43,65 +43,19 @@ + + extern int __do_copy_from_user(void *to, const void *from, int n, + void **fault_addr, void **fault_catcher); +- +-static inline int copy_from_user_tt(void *to, const void *from, int n) +-{ +- return(access_ok_tt(VERIFY_READ, from, n) ? +- __do_copy_from_user(to, from, n, +- ¤t->thread.fault_addr, +- ¤t->thread.fault_catcher) : n); +-} +- +-static inline int copy_to_user_tt(void *to, const void *from, int n) +-{ +- return(access_ok_tt(VERIFY_WRITE, to, n) ? +- __do_copy_to_user(to, from, n, +- ¤t->thread.fault_addr, +- ¤t->thread.fault_catcher) : n); +-} +- + extern int __do_strncpy_from_user(char *dst, const char *src, size_t n, + void **fault_addr, void **fault_catcher); +- +-static inline int strncpy_from_user_tt(char *dst, const char *src, int count) +-{ +- int n; +- +- if(!access_ok_tt(VERIFY_READ, src, 1)) return(-EFAULT); +- n = __do_strncpy_from_user(dst, src, count, +- ¤t->thread.fault_addr, +- ¤t->thread.fault_catcher); +- if(n < 0) return(-EFAULT); +- return(n); +-} +- + extern int __do_clear_user(void *mem, size_t len, void **fault_addr, + void **fault_catcher); +- +-static inline int __clear_user_tt(void *mem, int len) +-{ +- return(__do_clear_user(mem, len, +- ¤t->thread.fault_addr, +- ¤t->thread.fault_catcher)); +-} +- +-static inline int clear_user_tt(void *mem, int len) +-{ +- return(access_ok_tt(VERIFY_WRITE, mem, len) ? +- __do_clear_user(mem, len, +- ¤t->thread.fault_addr, +- ¤t->thread.fault_catcher) : len); +-} +- + extern int __do_strnlen_user(const char *str, unsigned long n, + void **fault_addr, void **fault_catcher); + +-static inline int strnlen_user_tt(const void *str, int len) +-{ +- return(__do_strnlen_user(str, len, +- ¤t->thread.fault_addr, +- ¤t->thread.fault_catcher)); +-} ++extern int copy_from_user_tt(void *to, const void *from, int n); ++extern int copy_to_user_tt(void *to, const void *from, int n); ++extern int strncpy_from_user_tt(char *dst, const char *src, int count); ++extern int __clear_user_tt(void *mem, int len); ++extern int clear_user_tt(void *mem, int len); ++extern int strnlen_user_tt(const void *str, int len); + + #endif + +Index: uml-2.6.7/arch/um/drivers/null.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/null.c 2004-07-16 19:35:59.203267584 +0300 ++++ uml-2.6.7/arch/um/drivers/null.c 2004-07-16 19:47:23.690209752 +0300 +@@ -5,7 +5,6 @@ + + #include <stdlib.h> + #include <errno.h> +-#include <fcntl.h> + #include "chan_user.h" + #include "os.h" + +Index: uml-2.6.7/arch/um/kernel/frame_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/frame_kern.c 2004-07-16 19:37:51.994120768 +0300 ++++ uml-2.6.7/arch/um/kernel/frame_kern.c 2004-07-16 19:47:23.714206104 +0300 +@@ -6,7 +6,6 @@ + #include "asm/ptrace.h" + #include "asm/uaccess.h" + #include "asm/signal.h" +-#include "asm/uaccess.h" + #include "asm/ucontext.h" + #include "frame_kern.h" + #include "sigcontext.h" +@@ -29,12 +28,15 @@ + sizeof(restorer))); + } + ++extern int userspace_pid[]; ++ + static int copy_sc_to_user(void *to, void *fp, struct pt_regs *from, + struct arch_frame_data *arch) + { + return(CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs), + arch), +- copy_sc_to_user_skas(to, fp, &from->regs, ++ copy_sc_to_user_skas(userspace_pid[0], to, fp, ++ &from->regs, + current->thread.cr2, + current->thread.err))); + } +Index: uml-2.6.7/arch/um/include/mem.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/mem.h 2004-07-16 19:37:46.189003280 +0300 ++++ uml-2.6.7/arch/um/include/mem.h 2004-07-16 19:47:23.703207776 +0300 +@@ -1,19 +1,18 @@ + /* +- * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2002, 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + + #ifndef __MEM_H__ + #define __MEM_H__ + +-struct vm_reserved { +- struct list_head list; +- unsigned long start; +- unsigned long end; +-}; ++#include "linux/types.h" + +-extern void set_usable_vm(unsigned long start, unsigned long end); +-extern void set_kmem_end(unsigned long new); ++extern int phys_mapping(unsigned long phys, __u64 *offset_out); ++extern int physmem_subst_mapping(void *virt, int fd, __u64 offset, int w); ++extern int is_remapped(void *virt); ++extern int physmem_remove_mapping(void *virt); ++extern void physmem_forget_descriptor(int fd); + + #endif + +Index: uml-2.6.7/arch/um/include/ubd_user.h +=================================================================== +--- uml-2.6.7.orig/arch/um/include/ubd_user.h 2004-07-16 19:36:48.255810464 +0300 ++++ uml-2.6.7/arch/um/include/ubd_user.h 2004-07-16 19:47:23.708207016 +0300 +@@ -9,7 +9,7 @@ + + #include "os.h" + +-enum ubd_req { UBD_READ, UBD_WRITE }; ++enum ubd_req { UBD_READ, UBD_WRITE, UBD_MMAP }; + + struct io_thread_req { + enum ubd_req op; +@@ -20,8 +20,10 @@ + char *buffer; + int sectorsize; + unsigned long sector_mask; +- unsigned long cow_offset; ++ unsigned long long cow_offset; + unsigned long bitmap_words[2]; ++ int map_fd; ++ unsigned long long map_offset; + int error; + }; + +@@ -31,7 +33,7 @@ + int *create_cow_out); + extern int create_cow_file(char *cow_file, char *backing_file, + struct openflags flags, int sectorsize, +- int *bitmap_offset_out, ++ int alignment, int *bitmap_offset_out, + unsigned long *bitmap_len_out, + int *data_offset_out); + extern int read_cow_bitmap(int fd, void *buf, int offset, int len); +@@ -39,7 +41,6 @@ + extern int write_ubd_fs(int fd, char *buffer, int len); + extern int start_io_thread(unsigned long sp, int *fds_out); + extern void do_io(struct io_thread_req *req); +-extern int ubd_is_dir(char *file); + + static inline int ubd_test_bit(__u64 bit, unsigned char *data) + { +Index: uml-2.6.7/arch/um/uml.lds.S +=================================================================== +--- uml-2.6.7.orig/arch/um/uml.lds.S 2004-07-16 19:36:36.401612576 +0300 ++++ uml-2.6.7/arch/um/uml.lds.S 2004-07-16 19:47:23.780196072 +0300 +@@ -9,7 +9,6 @@ + { + . = START + SIZEOF_HEADERS; + +- . = ALIGN(4096); + __binary_start = .; + #ifdef MODE_TT + .thread_private : { +@@ -26,11 +25,16 @@ + . = ALIGN(4096); /* Init code and data */ + _stext = .; + __init_begin = .; +- .text.init : { *(.text.init) } ++ .init.text : { ++ _sinittext = .; ++ *(.init.text) ++ _einittext = .; ++ } + . = ALIGN(4096); + .text : + { + *(.text) ++ SCHED_TEXT + /* .gnu.warning sections are handled specially by elf32.em. */ + *(.gnu.warning) + *(.gnu.linkonce.t*) +@@ -38,7 +42,7 @@ + + #include "asm/common.lds.S" + +- .data.init : { *(.data.init) } ++ init.data : { *(init.data) } + .data : + { + . = ALIGN(KERNEL_STACK_SIZE); /* init_task */ +Index: uml-2.6.7/arch/um/os-Linux/drivers/ethertap_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/os-Linux/drivers/ethertap_user.c 2004-07-16 19:36:42.453692520 +0300 ++++ uml-2.6.7/arch/um/os-Linux/drivers/ethertap_user.c 2004-07-16 19:47:24.801040880 +0300 +@@ -8,7 +8,6 @@ + #include <stdio.h> + #include <unistd.h> + #include <stddef.h> +-#include <fcntl.h> + #include <stdlib.h> + #include <sys/errno.h> + #include <sys/socket.h> +@@ -17,6 +16,7 @@ + #include <net/if.h> + #include "user.h" + #include "kern_util.h" ++#include "user_util.h" + #include "net_user.h" + #include "etap.h" + #include "helper.h" +@@ -42,13 +42,14 @@ + { + struct addr_change change; + void *output; ++ int n; + + change.what = op; + memcpy(change.addr, addr, sizeof(change.addr)); + memcpy(change.netmask, netmask, sizeof(change.netmask)); +- if(write(fd, &change, sizeof(change)) != sizeof(change)) +- printk("etap_change - request failed, errno = %d\n", +- errno); ++ n = os_write_file(fd, &change, sizeof(change)); ++ if(n != sizeof(change)) ++ printk("etap_change - request failed, err = %d\n", -n); + output = um_kmalloc(page_size()); + if(output == NULL) + printk("etap_change : Failed to allocate output buffer\n"); +@@ -82,15 +83,15 @@ + struct etap_pre_exec_data *data = arg; + + dup2(data->control_remote, 1); +- close(data->data_me); +- close(data->control_me); ++ os_close_file(data->data_me); ++ os_close_file(data->control_me); + } + + static int etap_tramp(char *dev, char *gate, int control_me, + int control_remote, int data_me, int data_remote) + { + struct etap_pre_exec_data pe_data; +- int pid, status, err; ++ int pid, status, err, n; + char version_buf[sizeof("nnnnn\0")]; + char data_fd_buf[sizeof("nnnnnn\0")]; + char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")]; +@@ -114,21 +115,22 @@ + pe_data.data_me = data_me; + pid = run_helper(etap_pre_exec, &pe_data, args, NULL); + +- if(pid < 0) err = errno; +- close(data_remote); +- close(control_remote); +- if(read(control_me, &c, sizeof(c)) != sizeof(c)){ +- printk("etap_tramp : read of status failed, errno = %d\n", +- errno); +- return(EINVAL); ++ if(pid < 0) err = pid; ++ os_close_file(data_remote); ++ os_close_file(control_remote); ++ n = os_read_file(control_me, &c, sizeof(c)); ++ if(n != sizeof(c)){ ++ printk("etap_tramp : read of status failed, err = %d\n", -n); ++ return(-EINVAL); + } + if(c != 1){ + printk("etap_tramp : uml_net failed\n"); +- err = EINVAL; +- if(waitpid(pid, &status, 0) < 0) err = errno; +- else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 1)){ ++ err = -EINVAL; ++ CATCH_EINTR(n = waitpid(pid, &status, 0)); ++ if(n < 0) ++ err = -errno; ++ else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 1)) + printk("uml_net didn't exit with status 1\n"); +- } + } + return(err); + } +@@ -143,14 +145,14 @@ + if(err) return(err); + + err = os_pipe(data_fds, 0, 0); +- if(err){ +- printk("data os_pipe failed - errno = %d\n", -err); ++ if(err < 0){ ++ printk("data os_pipe failed - err = %d\n", -err); + return(err); + } + + err = os_pipe(control_fds, 1, 0); +- if(err){ +- printk("control os_pipe failed - errno = %d\n", -err); ++ if(err < 0){ ++ printk("control os_pipe failed - err = %d\n", -err); + return(err); + } + +@@ -167,9 +169,9 @@ + kfree(output); + } + +- if(err != 0){ +- printk("etap_tramp failed - errno = %d\n", err); +- return(-err); ++ if(err < 0){ ++ printk("etap_tramp failed - err = %d\n", -err); ++ return(err); + } + + pri->data_fd = data_fds[0]; +@@ -183,11 +185,11 @@ + struct ethertap_data *pri = data; + + iter_addresses(pri->dev, etap_close_addr, &pri->control_fd); +- close(fd); ++ os_close_file(fd); + os_shutdown_socket(pri->data_fd, 1, 1); +- close(pri->data_fd); ++ os_close_file(pri->data_fd); + pri->data_fd = -1; +- close(pri->control_fd); ++ os_close_file(pri->control_fd); + pri->control_fd = -1; + } + +Index: uml-2.6.7/arch/um/drivers/ubd_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/ubd_user.c 2004-07-16 19:36:13.849041088 +0300 ++++ uml-2.6.7/arch/um/drivers/ubd_user.c 2004-07-16 19:47:23.698208536 +0300 +@@ -11,11 +11,8 @@ + #include <signal.h> + #include <string.h> + #include <netinet/in.h> +-#include <sys/stat.h> + #include <sys/time.h> +-#include <sys/fcntl.h> + #include <sys/socket.h> +-#include <string.h> + #include <sys/mman.h> + #include <sys/param.h> + #include "asm/types.h" +@@ -24,146 +21,30 @@ + #include "user.h" + #include "ubd_user.h" + #include "os.h" ++#include "cow.h" + + #include <endian.h> + #include <byteswap.h> +-#if __BYTE_ORDER == __BIG_ENDIAN +-# define ntohll(x) (x) +-# define htonll(x) (x) +-#elif __BYTE_ORDER == __LITTLE_ENDIAN +-# define ntohll(x) bswap_64(x) +-# define htonll(x) bswap_64(x) +-#else +-#error "__BYTE_ORDER not defined" +-#endif +- +-#define PATH_LEN_V1 256 +- +-struct cow_header_v1 { +- int magic; +- int version; +- char backing_file[PATH_LEN_V1]; +- time_t mtime; +- __u64 size; +- int sectorsize; +-}; +- +-#define PATH_LEN_V2 MAXPATHLEN +- +-struct cow_header_v2 { +- unsigned long magic; +- unsigned long version; +- char backing_file[PATH_LEN_V2]; +- time_t mtime; +- __u64 size; +- int sectorsize; +-}; +- +-union cow_header { +- struct cow_header_v1 v1; +- struct cow_header_v2 v2; +-}; +- +-#define COW_MAGIC 0x4f4f4f4d /* MOOO */ +-#define COW_VERSION 2 +- +-static void sizes(__u64 size, int sectorsize, int bitmap_offset, +- unsigned long *bitmap_len_out, int *data_offset_out) +-{ +- *bitmap_len_out = (size + sectorsize - 1) / (8 * sectorsize); +- +- *data_offset_out = bitmap_offset + *bitmap_len_out; +- *data_offset_out = (*data_offset_out + sectorsize - 1) / sectorsize; +- *data_offset_out *= sectorsize; +-} +- +-static int read_cow_header(int fd, int *magic_out, char **backing_file_out, +- time_t *mtime_out, __u64 *size_out, +- int *sectorsize_out, int *bitmap_offset_out) +-{ +- union cow_header *header; +- char *file; +- int err, n; +- unsigned long version, magic; +- +- header = um_kmalloc(sizeof(*header)); +- if(header == NULL){ +- printk("read_cow_header - Failed to allocate header\n"); +- return(-ENOMEM); +- } +- err = -EINVAL; +- n = read(fd, header, sizeof(*header)); +- if(n < offsetof(typeof(header->v1), backing_file)){ +- printk("read_cow_header - short header\n"); +- goto out; +- } +- +- magic = header->v1.magic; +- if(magic == COW_MAGIC) { +- version = header->v1.version; +- } +- else if(magic == ntohl(COW_MAGIC)){ +- version = ntohl(header->v1.version); +- } +- else goto out; +- +- *magic_out = COW_MAGIC; +- +- if(version == 1){ +- if(n < sizeof(header->v1)){ +- printk("read_cow_header - failed to read V1 header\n"); +- goto out; +- } +- *mtime_out = header->v1.mtime; +- *size_out = header->v1.size; +- *sectorsize_out = header->v1.sectorsize; +- *bitmap_offset_out = sizeof(header->v1); +- file = header->v1.backing_file; +- } +- else if(version == 2){ +- if(n < sizeof(header->v2)){ +- printk("read_cow_header - failed to read V2 header\n"); +- goto out; +- } +- *mtime_out = ntohl(header->v2.mtime); +- *size_out = ntohll(header->v2.size); +- *sectorsize_out = ntohl(header->v2.sectorsize); +- *bitmap_offset_out = sizeof(header->v2); +- file = header->v2.backing_file; +- } +- else { +- printk("read_cow_header - invalid COW version\n"); +- goto out; +- } +- err = -ENOMEM; +- *backing_file_out = uml_strdup(file); +- if(*backing_file_out == NULL){ +- printk("read_cow_header - failed to allocate backing file\n"); +- goto out; +- } +- err = 0; +- out: +- kfree(header); +- return(err); +-} + + static int same_backing_files(char *from_cmdline, char *from_cow, char *cow) + { +- struct stat buf1, buf2; ++ struct uml_stat buf1, buf2; ++ int err; + + if(from_cmdline == NULL) return(1); + if(!strcmp(from_cmdline, from_cow)) return(1); + +- if(stat(from_cmdline, &buf1) < 0){ +- printk("Couldn't stat '%s', errno = %d\n", from_cmdline, +- errno); ++ err = os_stat_file(from_cmdline, &buf1); ++ if(err < 0){ ++ printk("Couldn't stat '%s', err = %d\n", from_cmdline, -err); + return(1); + } +- if(stat(from_cow, &buf2) < 0){ +- printk("Couldn't stat '%s', errno = %d\n", from_cow, errno); ++ err = os_stat_file(from_cow, &buf2); ++ if(err < 0){ ++ printk("Couldn't stat '%s', err = %d\n", from_cow, -err); + return(1); + } +- if((buf1.st_dev == buf2.st_dev) && (buf1.st_ino == buf2.st_ino)) ++ if((buf1.ust_dev == buf2.ust_dev) && (buf1.ust_ino == buf2.ust_ino)) + return(1); + + printk("Backing file mismatch - \"%s\" requested,\n" +@@ -174,20 +55,21 @@ + + static int backing_file_mismatch(char *file, __u64 size, time_t mtime) + { +- struct stat64 buf; ++ unsigned long modtime; + long long actual; + int err; + +- if(stat64(file, &buf) < 0){ +- printk("Failed to stat backing file \"%s\", errno = %d\n", +- file, errno); +- return(-errno); ++ err = os_file_modtime(file, &modtime); ++ if(err < 0){ ++ printk("Failed to get modification time of backing file " ++ "\"%s\", err = %d\n", file, -err); ++ return(err); + } + + err = os_file_size(file, &actual); +- if(err){ ++ if(err < 0){ + printk("Failed to get size of backing file \"%s\", " +- "errno = %d\n", file, -err); ++ "err = %d\n", file, -err); + return(err); + } + +@@ -196,9 +78,9 @@ + "file\n", size, actual); + return(-EINVAL); + } +- if(buf.st_mtime != mtime){ ++ if(modtime != mtime){ + printk("mtime mismatch (%ld vs %ld) of COW header vs backing " +- "file\n", mtime, buf.st_mtime); ++ "file\n", mtime, modtime); + return(-EINVAL); + } + return(0); +@@ -209,124 +91,16 @@ + int err; + + err = os_seek_file(fd, offset); +- if(err != 0) return(-errno); +- err = read(fd, buf, len); +- if(err < 0) return(-errno); +- return(0); +-} ++ if(err < 0) ++ return(err); + +-static int absolutize(char *to, int size, char *from) +-{ +- char save_cwd[256], *slash; +- int remaining; ++ err = os_read_file(fd, buf, len); ++ if(err < 0) ++ return(err); + +- if(getcwd(save_cwd, sizeof(save_cwd)) == NULL) { +- printk("absolutize : unable to get cwd - errno = %d\n", errno); +- return(-1); +- } +- slash = strrchr(from, '/'); +- if(slash != NULL){ +- *slash = '\0'; +- if(chdir(from)){ +- *slash = '/'; +- printk("absolutize : Can't cd to '%s' - errno = %d\n", +- from, errno); +- return(-1); +- } +- *slash = '/'; +- if(getcwd(to, size) == NULL){ +- printk("absolutize : unable to get cwd of '%s' - " +- "errno = %d\n", from, errno); +- return(-1); +- } +- remaining = size - strlen(to); +- if(strlen(slash) + 1 > remaining){ +- printk("absolutize : unable to fit '%s' into %d " +- "chars\n", from, size); +- return(-1); +- } +- strcat(to, slash); +- } +- else { +- if(strlen(save_cwd) + 1 + strlen(from) + 1 > size){ +- printk("absolutize : unable to fit '%s' into %d " +- "chars\n", from, size); +- return(-1); +- } +- strcpy(to, save_cwd); +- strcat(to, "/"); +- strcat(to, from); +- } +- chdir(save_cwd); + return(0); + } + +-static int write_cow_header(char *cow_file, int fd, char *backing_file, +- int sectorsize, long long *size) +-{ +- struct cow_header_v2 *header; +- struct stat64 buf; +- int err; +- +- err = os_seek_file(fd, 0); +- if(err != 0){ +- printk("write_cow_header - lseek failed, errno = %d\n", errno); +- return(-errno); +- } +- +- err = -ENOMEM; +- header = um_kmalloc(sizeof(*header)); +- if(header == NULL){ +- printk("Failed to allocate COW V2 header\n"); +- goto out; +- } +- header->magic = htonl(COW_MAGIC); +- header->version = htonl(COW_VERSION); +- +- err = -EINVAL; +- if(strlen(backing_file) > sizeof(header->backing_file) - 1){ +- printk("Backing file name \"%s\" is too long - names are " +- "limited to %d characters\n", backing_file, +- sizeof(header->backing_file) - 1); +- goto out_free; +- } +- +- if(absolutize(header->backing_file, sizeof(header->backing_file), +- backing_file)) +- goto out_free; +- +- err = stat64(header->backing_file, &buf); +- if(err < 0){ +- printk("Stat of backing file '%s' failed, errno = %d\n", +- header->backing_file, errno); +- err = -errno; +- goto out_free; +- } +- +- err = os_file_size(header->backing_file, size); +- if(err){ +- printk("Couldn't get size of backing file '%s', errno = %d\n", +- header->backing_file, -*size); +- goto out_free; +- } +- +- header->mtime = htonl(buf.st_mtime); +- header->size = htonll(*size); +- header->sectorsize = htonl(sectorsize); +- +- err = write(fd, header, sizeof(*header)); +- if(err != sizeof(*header)){ +- printk("Write of header to new COW file '%s' failed, " +- "errno = %d\n", cow_file, errno); +- goto out_free; +- } +- err = 0; +- out_free: +- kfree(header); +- out: +- return(err); +-} +- + int open_ubd_file(char *file, struct openflags *openflags, + char **backing_file_out, int *bitmap_offset_out, + unsigned long *bitmap_len_out, int *data_offset_out, +@@ -334,26 +108,36 @@ + { + time_t mtime; + __u64 size; ++ __u32 version, align; + char *backing_file; +- int fd, err, sectorsize, magic, same, mode = 0644; ++ int fd, err, sectorsize, same, mode = 0644; + +- if((fd = os_open_file(file, *openflags, mode)) < 0){ ++ fd = os_open_file(file, *openflags, mode); ++ if(fd < 0){ + if((fd == -ENOENT) && (create_cow_out != NULL)) + *create_cow_out = 1; + if(!openflags->w || + ((errno != EROFS) && (errno != EACCES))) return(-errno); + openflags->w = 0; +- if((fd = os_open_file(file, *openflags, mode)) < 0) ++ fd = os_open_file(file, *openflags, mode); ++ if(fd < 0) + return(fd); + } ++ ++ err = os_lock_file(fd, openflags->w); ++ if(err < 0){ ++ printk("Failed to lock '%s', err = %d\n", file, -err); ++ goto out_close; ++ } ++ + if(backing_file_out == NULL) return(fd); + +- err = read_cow_header(fd, &magic, &backing_file, &mtime, &size, +- §orsize, bitmap_offset_out); ++ err = read_cow_header(file_reader, &fd, &version, &backing_file, &mtime, ++ &size, §orsize, &align, bitmap_offset_out); + if(err && (*backing_file_out != NULL)){ + printk("Failed to read COW header from COW file \"%s\", " +- "errno = %d\n", file, err); +- goto error; ++ "errno = %d\n", file, -err); ++ goto out_close; + } + if(err) return(fd); + +@@ -363,36 +147,33 @@ + + if(!same && !backing_file_mismatch(*backing_file_out, size, mtime)){ + printk("Switching backing file to '%s'\n", *backing_file_out); +- err = write_cow_header(file, fd, *backing_file_out, +- sectorsize, &size); ++ err = write_cow_header(file, fd, *backing_file_out, ++ sectorsize, align, &size); + if(err){ +- printk("Switch failed, errno = %d\n", err); ++ printk("Switch failed, errno = %d\n", -err); + return(err); + } + } + else { + *backing_file_out = backing_file; + err = backing_file_mismatch(*backing_file_out, size, mtime); +- if(err) goto error; ++ if(err) goto out_close; + } + +- sizes(size, sectorsize, *bitmap_offset_out, bitmap_len_out, +- data_offset_out); ++ cow_sizes(version, size, sectorsize, align, *bitmap_offset_out, ++ bitmap_len_out, data_offset_out); + + return(fd); +- error: +- close(fd); ++ out_close: ++ os_close_file(fd); + return(err); + } + + int create_cow_file(char *cow_file, char *backing_file, struct openflags flags, +- int sectorsize, int *bitmap_offset_out, ++ int sectorsize, int alignment, int *bitmap_offset_out, + unsigned long *bitmap_len_out, int *data_offset_out) + { +- __u64 blocks; +- long zero; +- int err, fd, i; +- long long size; ++ int err, fd; + + flags.c = 1; + fd = open_ubd_file(cow_file, &flags, NULL, NULL, NULL, NULL, NULL); +@@ -403,57 +184,49 @@ + goto out; + } + +- err = write_cow_header(cow_file, fd, backing_file, sectorsize, &size); +- if(err) goto out_close; +- +- blocks = (size + sectorsize - 1) / sectorsize; +- blocks = (blocks + sizeof(long) * 8 - 1) / (sizeof(long) * 8); +- zero = 0; +- for(i = 0; i < blocks; i++){ +- err = write(fd, &zero, sizeof(zero)); +- if(err != sizeof(zero)){ +- printk("Write of bitmap to new COW file '%s' failed, " +- "errno = %d\n", cow_file, errno); +- goto out_close; +- } +- } +- +- sizes(size, sectorsize, sizeof(struct cow_header_v2), +- bitmap_len_out, data_offset_out); +- *bitmap_offset_out = sizeof(struct cow_header_v2); +- +- return(fd); +- +- out_close: +- close(fd); ++ err = init_cow_file(fd, cow_file, backing_file, sectorsize, alignment, ++ bitmap_offset_out, bitmap_len_out, ++ data_offset_out); ++ if(!err) ++ return(fd); ++ os_close_file(fd); + out: + return(err); + } + ++/* XXX Just trivial wrappers around os_read_file and os_write_file */ + int read_ubd_fs(int fd, void *buffer, int len) + { +- int n; +- +- n = read(fd, buffer, len); +- if(n < 0) return(-errno); +- else return(n); ++ return(os_read_file(fd, buffer, len)); + } + + int write_ubd_fs(int fd, char *buffer, int len) + { +- int n; +- +- n = write(fd, buffer, len); +- if(n < 0) return(-errno); +- else return(n); ++ return(os_write_file(fd, buffer, len)); + } + +-int ubd_is_dir(char *file) ++static int update_bitmap(struct io_thread_req *req) + { +- struct stat64 buf; ++ int n; ++ ++ if(req->cow_offset == -1) ++ return(0); ++ ++ n = os_seek_file(req->fds[1], req->cow_offset); ++ if(n < 0){ ++ printk("do_io - bitmap lseek failed : err = %d\n", -n); ++ return(1); ++ } ++ ++ n = os_write_file(req->fds[1], &req->bitmap_words, ++ sizeof(req->bitmap_words)); ++ if(n != sizeof(req->bitmap_words)){ ++ printk("do_io - bitmap update failed, err = %d fd = %d\n", -n, ++ req->fds[1]); ++ return(1); ++ } + +- if(stat64(file, &buf) < 0) return(0); +- return(S_ISDIR(buf.st_mode)); ++ return(0); + } + + void do_io(struct io_thread_req *req) +@@ -461,8 +234,18 @@ + char *buf; + unsigned long len; + int n, nsectors, start, end, bit; ++ int err; + __u64 off; + ++ if(req->op == UBD_MMAP){ ++ /* Touch the page to force the host to do any necessary IO to ++ * get it into memory ++ */ ++ n = *((volatile int *) req->buffer); ++ req->error = update_bitmap(req); ++ return; ++ } ++ + nsectors = req->length / req->sectorsize; + start = 0; + do { +@@ -473,15 +256,14 @@ + &req->sector_mask) == bit)) + end++; + +- if(end != nsectors) +- printk("end != nsectors\n"); + off = req->offset + req->offsets[bit] + + start * req->sectorsize; + len = (end - start) * req->sectorsize; + buf = &req->buffer[start * req->sectorsize]; + +- if(os_seek_file(req->fds[bit], off) != 0){ +- printk("do_io - lseek failed : errno = %d\n", errno); ++ err = os_seek_file(req->fds[bit], off); ++ if(err < 0){ ++ printk("do_io - lseek failed : err = %d\n", -err); + req->error = 1; + return; + } +@@ -490,11 +272,10 @@ + do { + buf = &buf[n]; + len -= n; +- n = read(req->fds[bit], buf, len); ++ n = os_read_file(req->fds[bit], buf, len); + if (n < 0) { +- printk("do_io - read returned %d : " +- "errno = %d fd = %d\n", n, +- errno, req->fds[bit]); ++ printk("do_io - read failed, err = %d " ++ "fd = %d\n", -n, req->fds[bit]); + req->error = 1; + return; + } +@@ -502,11 +283,10 @@ + if (n < len) memset(&buf[n], 0, len - n); + } + else { +- n = write(req->fds[bit], buf, len); ++ n = os_write_file(req->fds[bit], buf, len); + if(n != len){ +- printk("do_io - write returned %d : " +- "errno = %d fd = %d\n", n, +- errno, req->fds[bit]); ++ printk("do_io - write failed err = %d " ++ "fd = %d\n", -n, req->fds[bit]); + req->error = 1; + return; + } +@@ -515,24 +295,7 @@ + start = end; + } while(start < nsectors); + +- if(req->cow_offset != -1){ +- if(os_seek_file(req->fds[1], req->cow_offset) != 0){ +- printk("do_io - bitmap lseek failed : errno = %d\n", +- errno); +- req->error = 1; +- return; +- } +- n = write(req->fds[1], &req->bitmap_words, +- sizeof(req->bitmap_words)); +- if(n != sizeof(req->bitmap_words)){ +- printk("do_io - bitmap update returned %d : " +- "errno = %d fd = %d\n", n, errno, req->fds[1]); +- req->error = 1; +- return; +- } +- } +- req->error = 0; +- return; ++ req->error = update_bitmap(req); + } + + /* Changed in start_io_thread, which is serialized by being called only +@@ -550,19 +313,23 @@ + + signal(SIGWINCH, SIG_IGN); + while(1){ +- n = read(kernel_fd, &req, sizeof(req)); +- if(n < 0) printk("io_thread - read returned %d, errno = %d\n", +- n, errno); +- else if(n < sizeof(req)){ +- printk("io_thread - short read : length = %d\n", n); ++ n = os_read_file(kernel_fd, &req, sizeof(req)); ++ if(n != sizeof(req)){ ++ if(n < 0) ++ printk("io_thread - read failed, fd = %d, " ++ "err = %d\n", kernel_fd, -n); ++ else { ++ printk("io_thread - short read, fd = %d, " ++ "length = %d\n", kernel_fd, n); ++ } + continue; + } + io_count++; + do_io(&req); +- n = write(kernel_fd, &req, sizeof(req)); ++ n = os_write_file(kernel_fd, &req, sizeof(req)); + if(n != sizeof(req)) +- printk("io_thread - write failed, errno = %d\n", +- errno); ++ printk("io_thread - write failed, fd = %d, err = %d\n", ++ kernel_fd, -n); + } + } + +@@ -571,10 +338,11 @@ + int pid, fds[2], err; + + err = os_pipe(fds, 1, 1); +- if(err){ +- printk("start_io_thread - os_pipe failed, errno = %d\n", -err); +- return(-1); ++ if(err < 0){ ++ printk("start_io_thread - os_pipe failed, err = %d\n", -err); ++ goto out; + } ++ + kernel_fd = fds[0]; + *fd_out = fds[1]; + +@@ -582,32 +350,19 @@ + NULL); + if(pid < 0){ + printk("start_io_thread - clone failed : errno = %d\n", errno); +- return(-errno); ++ goto out_close; + } +- return(pid); +-} +- +-#ifdef notdef +-int start_io_thread(unsigned long sp, int *fd_out) +-{ +- int pid; + +- if((kernel_fd = get_pty()) < 0) return(-1); +- raw(kernel_fd, 0); +- if((*fd_out = open(ptsname(kernel_fd), O_RDWR)) < 0){ +- printk("Couldn't open tty for IO\n"); +- return(-1); +- } +- +- pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM | SIGCHLD, +- NULL); +- if(pid < 0){ +- printk("start_io_thread - clone failed : errno = %d\n", errno); +- return(-errno); +- } + return(pid); ++ ++ out_close: ++ os_close_file(fds[0]); ++ os_close_file(fds[1]); ++ kernel_fd = -1; ++ *fd_out = -1; ++ out: ++ return(err); + } +-#endif + + /* + * Overrides for Emacs so that we follow Linus's tabbing style. +Index: uml-2.6.7/scripts/basic/fixdep.c +=================================================================== +--- uml-2.6.7.orig/scripts/basic/fixdep.c 2004-07-16 19:36:40.092051544 +0300 ++++ uml-2.6.7/scripts/basic/fixdep.c 2004-07-16 19:47:24.197132688 +0300 +@@ -93,6 +93,14 @@ + * (Note: it'd be easy to port over the complete mkdep state machine, + * but I don't think the added complexity is worth it) + */ ++/* ++ * Note 2: if somebody writes HELLO_CONFIG_BOOM in a file, it will depend onto ++ * CONFIG_BOOM. This could seem a bug (not too hard to fix), but please do not ++ * fix it! Some UserModeLinux files (look at arch/um/) call CONFIG_BOOM as ++ * UML_CONFIG_BOOM, to avoid conflicts with /usr/include/linux/autoconf.h, ++ * through arch/um/include/uml-config.h; this fixdep "bug" makes sure that ++ * those files will have correct dependencies. ++ */ + + #include <sys/types.h> + #include <sys/stat.h> +@@ -310,6 +318,7 @@ + } + memcpy(s, m, p-m); s[p-m] = 0; + if (strrcmp(s, "include/linux/autoconf.h") && ++ strrcmp(s, "arch/um/include/uml-config.h") && + strrcmp(s, ".ver")) { + printf(" %s \\\n", s); + do_config_file(s); +Index: uml-2.6.7/include/asm-um/processor-i386.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/processor-i386.h 2004-07-16 19:35:55.931764928 +0300 ++++ uml-2.6.7/include/asm-um/processor-i386.h 2004-07-16 19:47:23.794193944 +0300 +@@ -6,8 +6,8 @@ + #ifndef __UM_PROCESSOR_I386_H + #define __UM_PROCESSOR_I386_H + +-extern int cpu_has_xmm; +-extern int cpu_has_cmov; ++extern int host_has_xmm; ++extern int host_has_cmov; + + struct arch_thread { + unsigned long debugregs[8]; +Index: uml-2.6.7/arch/um/kernel/time.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/time.c 2004-07-16 19:36:10.588536760 +0300 ++++ uml-2.6.7/arch/um/kernel/time.c 2004-07-16 19:47:24.262122808 +0300 +@@ -4,24 +4,34 @@ + */ + + #include <stdio.h> ++#include <stdlib.h> + #include <unistd.h> + #include <time.h> + #include <sys/time.h> + #include <signal.h> + #include <errno.h> +-#include "linux/module.h" ++#include <string.h> + #include "user_util.h" + #include "kern_util.h" + #include "user.h" + #include "process.h" + #include "signal_user.h" + #include "time_user.h" ++#include "kern_constants.h" ++ ++/* XXX This really needs to be declared and initialized in a kernel file since ++ * it's in <linux/time.h> ++ */ ++extern struct timespec wall_to_monotonic; + + extern struct timeval xtime; + ++struct timeval local_offset = { 0, 0 }; ++ + void timer(void) + { + gettimeofday(&xtime, NULL); ++ timeradd(&xtime, &local_offset, &xtime); + } + + void set_interval(int timer_type) +@@ -66,7 +76,7 @@ + errno); + } + +-void idle_timer(void) ++void uml_idle_timer(void) + { + if(signal(SIGVTALRM, SIG_IGN) == SIG_ERR) + panic("Couldn't unset SIGVTALRM handler"); +@@ -76,14 +86,60 @@ + set_interval(ITIMER_REAL); + } + ++static unsigned long long get_host_hz(void) ++{ ++ char mhzline[16], *end; ++ unsigned long long mhz; ++ int ret, mult, rest, len; ++ ++ ret = cpu_feature("cpu MHz", mhzline, ++ sizeof(mhzline) / sizeof(mhzline[0])); ++ if(!ret) ++ panic ("Could not get host MHZ"); ++ ++ mhz = strtoul(mhzline, &end, 10); ++ ++ /* This business is to parse a floating point number without using ++ * floating types. ++ */ ++ ++ rest = 0; ++ mult = 0; ++ if(*end == '.'){ ++ end++; ++ len = strlen(end); ++ if(len < 6) ++ mult = 6 - len; ++ else if(len > 6) ++ end[6] = '\0'; ++ rest = strtoul(end, NULL, 10); ++ while(mult-- > 0) ++ rest *= 10; ++ } ++ ++ return(1000000 * mhz + rest); ++} ++ ++unsigned long long host_hz = 0; ++ ++extern int do_posix_clock_monotonic_gettime(struct timespec *tp); ++ + void time_init(void) + { ++ struct timespec now; ++ ++ host_hz = get_host_hz(); + if(signal(SIGVTALRM, boot_timer_handler) == SIG_ERR) + panic("Couldn't set SIGVTALRM handler"); + set_interval(ITIMER_VIRTUAL); ++ ++ do_posix_clock_monotonic_gettime(&now); ++ wall_to_monotonic.tv_sec = -now.tv_sec; ++ wall_to_monotonic.tv_nsec = -now.tv_nsec; + } + +-struct timeval local_offset = { 0, 0 }; ++/* Declared in linux/time.h, which can't be included here */ ++extern void clock_was_set(void); + + void do_gettimeofday(struct timeval *tv) + { +@@ -96,15 +152,13 @@ + clock_was_set(); + } + +-EXPORT_SYMBOL(do_gettimeofday); +- + int do_settimeofday(struct timespec *tv) + { + struct timeval now; + unsigned long flags; + struct timeval tv_in; + +- if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC) ++ if ((unsigned long) tv->tv_nsec >= UM_NSEC_PER_SEC) + return -EINVAL; + + tv_in.tv_sec = tv->tv_sec; +@@ -114,9 +168,9 @@ + gettimeofday(&now, NULL); + timersub(&tv_in, &now, &local_offset); + time_unlock(flags); +-} + +-EXPORT_SYMBOL(do_settimeofday); ++ return(0); ++} + + void idle_sleep(int secs) + { +Index: uml-2.6.7/arch/um/drivers/mconsole_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/mconsole_user.c 2004-07-16 19:36:07.180054928 +0300 ++++ uml-2.6.7/arch/um/drivers/mconsole_user.c 2004-07-16 19:47:23.687210208 +0300 +@@ -1,6 +1,6 @@ + /* + * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) +- * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) ++ * Copyright (C) 2001 - 2003 Jeff Dike (jdike@addtoit.com) + * Licensed under the GPL + */ + +@@ -18,16 +18,18 @@ + #include "umid.h" + + static struct mconsole_command commands[] = { +- { "version", mconsole_version, 1 }, +- { "halt", mconsole_halt, 0 }, +- { "reboot", mconsole_reboot, 0 }, +- { "config", mconsole_config, 0 }, +- { "remove", mconsole_remove, 0 }, +- { "sysrq", mconsole_sysrq, 1 }, +- { "help", mconsole_help, 1 }, +- { "cad", mconsole_cad, 1 }, +- { "stop", mconsole_stop, 0 }, +- { "go", mconsole_go, 1 }, ++ { "version", mconsole_version, MCONSOLE_INTR }, ++ { "halt", mconsole_halt, MCONSOLE_PROC }, ++ { "reboot", mconsole_reboot, MCONSOLE_PROC }, ++ { "config", mconsole_config, MCONSOLE_PROC }, ++ { "remove", mconsole_remove, MCONSOLE_PROC }, ++ { "sysrq", mconsole_sysrq, MCONSOLE_INTR }, ++ { "help", mconsole_help, MCONSOLE_INTR }, ++ { "cad", mconsole_cad, MCONSOLE_INTR }, ++ { "stop", mconsole_stop, MCONSOLE_PROC }, ++ { "go", mconsole_go, MCONSOLE_INTR }, ++ { "log", mconsole_log, MCONSOLE_INTR }, ++ { "proc", mconsole_proc, MCONSOLE_PROC }, + }; + + /* Initialized in mconsole_init, which is an initcall */ +@@ -139,6 +141,7 @@ + memcpy(reply.data, str, len); + reply.data[len] = '\0'; + total -= len; ++ str += len; + reply.len = len + 1; + + len = sizeof(reply) + reply.len - sizeof(reply.data); +Index: uml-2.6.7/include/asm-um/module-i386.h +=================================================================== +--- uml-2.6.7.orig/include/asm-um/module-i386.h 2004-07-16 19:47:23.634218264 +0300 ++++ uml-2.6.7/include/asm-um/module-i386.h 2004-07-16 19:47:23.792194248 +0300 +@@ -0,0 +1,13 @@ ++#ifndef __UM_MODULE_I386_H ++#define __UM_MODULE_I386_H ++ ++/* UML is simple */ ++struct mod_arch_specific ++{ ++}; ++ ++#define Elf_Shdr Elf32_Shdr ++#define Elf_Sym Elf32_Sym ++#define Elf_Ehdr Elf32_Ehdr ++ ++#endif +Index: uml-2.6.7/arch/um/kernel/tt/ptproxy/wait.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/tt/ptproxy/wait.c 2004-07-16 19:37:26.029068056 +0300 ++++ uml-2.6.7/arch/um/kernel/tt/ptproxy/wait.c 2004-07-16 19:47:23.748200936 +0300 +@@ -56,21 +56,23 @@ + int real_wait_return(struct debugger *debugger) + { + unsigned long ip; +- int err, pid; ++ int pid; + + pid = debugger->pid; ++ + ip = ptrace(PTRACE_PEEKUSER, pid, PT_IP_OFFSET, 0); +- ip = IP_RESTART_SYSCALL(ip); +- err = ptrace(PTRACE_POKEUSER, pid, PT_IP_OFFSET, ip); ++ IP_RESTART_SYSCALL(ip); ++ + if(ptrace(PTRACE_POKEUSER, pid, PT_IP_OFFSET, ip) < 0) + tracer_panic("real_wait_return : Failed to restart system " +- "call, errno = %d\n"); ++ "call, errno = %d\n", errno); ++ + if((ptrace(PTRACE_SYSCALL, debugger->pid, 0, SIGCHLD) < 0) || + (ptrace(PTRACE_SYSCALL, debugger->pid, 0, 0) < 0) || + (ptrace(PTRACE_SYSCALL, debugger->pid, 0, 0) < 0) || + debugger_normal_return(debugger, -1)) + tracer_panic("real_wait_return : gdb failed to wait, " +- "errno = %d\n"); ++ "errno = %d\n", errno); + return(0); + } + +Index: uml-2.6.7/include/asm-um/common.lds.S +=================================================================== +--- uml-2.6.7.orig/include/asm-um/common.lds.S 2004-07-16 19:36:10.607533872 +0300 ++++ uml-2.6.7/include/asm-um/common.lds.S 2004-07-16 19:47:23.787195008 +0300 +@@ -1,3 +1,5 @@ ++#include <asm-generic/vmlinux.lds.h> ++ + .fini : { *(.fini) } =0x9090 + _etext = .; + PROVIDE (etext = .); +@@ -13,18 +15,6 @@ + + RODATA + +- __start___ksymtab = .; /* Kernel symbol table */ +- __ksymtab : { *(__ksymtab) } +- __stop___ksymtab = .; +- +- __start___gpl_ksymtab = .; /* Kernel symbol table: GPL-only symbols */ +- __gpl_ksymtab : { *(__gpl_ksymtab) } +- __stop___gpl_ksymtab = .; +- +- __start___kallsyms = .; /* All kernel symbols */ +- __kallsyms : { *(__kallsyms) } +- __stop___kallsyms = .; +- + .unprotected : { *(.unprotected) } + . = ALIGN(4096); + PROVIDE (_unprotected_end = .); +@@ -67,11 +57,17 @@ + } + __initcall_end = .; + ++ __con_initcall_start = .; ++ .con_initcall.init : { *(.con_initcall.init) } ++ __con_initcall_end = .; ++ + __uml_initcall_start = .; + .uml.initcall.init : { *(.uml.initcall.init) } + __uml_initcall_end = .; + __init_end = .; + ++ SECURITY_INIT ++ + __exitcall_begin = .; + .exitcall : { *(.exitcall.exit) } + __exitcall_end = .; +@@ -80,7 +76,33 @@ + .uml.exitcall : { *(.uml.exitcall.exit) } + __uml_exitcall_end = .; + +- . = ALIGN(4096); ++ . = ALIGN(4); ++ __alt_instructions = .; ++ .altinstructions : { *(.altinstructions) } ++ __alt_instructions_end = .; ++ .altinstr_replacement : { *(.altinstr_replacement) } ++ /* .exit.text is discard at runtime, not link time, to deal with references ++ from .altinstructions and .eh_frame */ ++ .exit.text : { *(.exit.text) } ++ .exit.data : { *(.exit.data) } ++ ++ __preinit_array_start = .; ++ .preinit_array : { *(.preinit_array) } ++ __preinit_array_end = .; ++ __init_array_start = .; ++ .init_array : { *(.init_array) } ++ __init_array_end = .; ++ __fini_array_start = .; ++ .fini_array : { *(.fini_array) } ++ __fini_array_end = .; ++ ++ . = ALIGN(4096); + __initramfs_start = .; + .init.ramfs : { *(.init.ramfs) } + __initramfs_end = .; ++ ++ /* Sections to be discarded */ ++ /DISCARD/ : { ++ *(.exitcall.exit) ++ } ++ +Index: uml-2.6.7/arch/um/drivers/hostaudio_user.c +=================================================================== +--- uml-2.6.7.orig/arch/um/drivers/hostaudio_user.c 2004-07-16 19:37:08.767692184 +0300 ++++ uml-2.6.7/arch/um/drivers/hostaudio_user.c 1970-01-01 03:00:00.000000000 +0300 +@@ -1,149 +0,0 @@ +-/* +- * Copyright (C) 2002 Steve Schmidtke +- * Licensed under the GPL +- */ +- +-#include <sys/types.h> +-#include <sys/stat.h> +-#include <sys/ioctl.h> +-#include <fcntl.h> +-#include <unistd.h> +-#include <errno.h> +-#include "hostaudio.h" +-#include "user_util.h" +-#include "kern_util.h" +-#include "user.h" +-#include "os.h" +- +-/* /dev/dsp file operations */ +- +-ssize_t hostaudio_read_user(struct hostaudio_state *state, char *buffer, +- size_t count, loff_t *ppos) +-{ +- ssize_t ret; +- +-#ifdef DEBUG +- printk("hostaudio: read_user called, count = %d\n", count); +-#endif +- +- ret = read(state->fd, buffer, count); +- +- if(ret < 0) return(-errno); +- return(ret); +-} +- +-ssize_t hostaudio_write_user(struct hostaudio_state *state, const char *buffer, +- size_t count, loff_t *ppos) +-{ +- ssize_t ret; +- +-#ifdef DEBUG +- printk("hostaudio: write_user called, count = %d\n", count); +-#endif +- +- ret = write(state->fd, buffer, count); +- +- if(ret < 0) return(-errno); +- return(ret); +-} +- +-int hostaudio_ioctl_user(struct hostaudio_state *state, unsigned int cmd, +- unsigned long arg) +-{ +- int ret; +-#ifdef DEBUG +- printk("hostaudio: ioctl_user called, cmd = %u\n", cmd); +-#endif +- +- ret = ioctl(state->fd, cmd, arg); +- +- if(ret < 0) return(-errno); +- return(ret); +-} +- +-int hostaudio_open_user(struct hostaudio_state *state, int r, int w, char *dsp) +-{ +-#ifdef DEBUG +- printk("hostaudio: open_user called\n"); +-#endif +- +- state->fd = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0); +- +- if(state->fd >= 0) return(0); +- +- printk("hostaudio_open_user failed to open '%s', errno = %d\n", +- dsp, errno); +- +- return(-errno); +-} +- +-int hostaudio_release_user(struct hostaudio_state *state) +-{ +-#ifdef DEBUG +- printk("hostaudio: release called\n"); +-#endif +- if(state->fd >= 0){ +- close(state->fd); +- state->fd=-1; +- } +- +- return(0); +-} +- +-/* /dev/mixer file operations */ +- +-int hostmixer_ioctl_mixdev_user(struct hostmixer_state *state, +- unsigned int cmd, unsigned long arg) +-{ +- int ret; +-#ifdef DEBUG +- printk("hostmixer: ioctl_user called cmd = %u\n",cmd); +-#endif +- +- ret = ioctl(state->fd, cmd, arg); +- if(ret < 0) +- return(-errno); +- return(ret); +-} +- +-int hostmixer_open_mixdev_user(struct hostmixer_state *state, int r, int w, +- char *mixer) +-{ +-#ifdef DEBUG +- printk("hostmixer: open_user called\n"); +-#endif +- +- state->fd = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0); +- +- if(state->fd >= 0) return(0); +- +- printk("hostaudio_open_mixdev_user failed to open '%s', errno = %d\n", +- mixer, errno); +- +- return(-errno); +-} +- +-int hostmixer_release_mixdev_user(struct hostmixer_state *state) +-{ +-#ifdef DEBUG +- printk("hostmixer: release_user called\n"); +-#endif +- +- if(state->fd >= 0){ +- close(state->fd); +- state->fd = -1; +- } +- +- return 0; +-} +- +-/* +- * Overrides for Emacs so that we 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-file-style: "linux" +- * End: +- */ +Index: uml-2.6.7/arch/um/kernel/time_kern.c +=================================================================== +--- uml-2.6.7.orig/arch/um/kernel/time_kern.c 2004-07-16 19:36:57.116463440 +0300 ++++ uml-2.6.7/arch/um/kernel/time_kern.c 2004-07-16 19:47:24.262122808 +0300 +@@ -30,22 +30,60 @@ + return(HZ); + } + ++/* ++ * Scheduler clock - returns current time in nanosec units. ++ */ ++unsigned long long sched_clock(void) ++{ ++ return (unsigned long long)jiffies_64 * (1000000000 / HZ); ++} ++ + /* Changed at early boot */ + int timer_irq_inited = 0; + +-/* missed_ticks will be modified after kernel memory has been +- * write-protected, so this puts it in a section which will be left +- * write-enabled. +- */ +-int __attribute__ ((__section__ (".unprotected"))) missed_ticks[NR_CPUS]; ++static int first_tick; ++static unsigned long long prev_tsc; ++#ifdef CONFIG_UML_REAL_TIME_CLOCK ++static long long delta; /* Deviation per interval */ ++#endif ++ ++extern unsigned long long host_hz; + + void timer_irq(union uml_pt_regs *regs) + { +- int cpu = current->thread_info->cpu, ticks = missed_ticks[cpu]; ++ unsigned long long ticks = 0; ++ ++ if(!timer_irq_inited){ ++ /* This is to ensure that ticks don't pile up when ++ * the timer handler is suspended */ ++ first_tick = 0; ++ return; ++ } + +- if(!timer_irq_inited) return; +- missed_ticks[cpu] = 0; +- while(ticks--) do_IRQ(TIMER_IRQ, regs); ++ if(first_tick){ ++#ifdef CONFIG_UML_REAL_TIME_CLOCK ++ unsigned long long tsc; ++ /* We've had 1 tick */ ++ tsc = time_stamp(); ++ ++ delta += tsc - prev_tsc; ++ prev_tsc = tsc; ++ ++ ticks += (delta * HZ) / host_hz; ++ delta -= (ticks * host_hz) / HZ; ++#else ++ ticks = 1; ++#endif ++ } ++ else { ++ prev_tsc = time_stamp(); ++ first_tick = 1; ++ } ++ ++ while(ticks > 0){ ++ do_IRQ(TIMER_IRQ, regs); ++ ticks--; ++ } + } + + void boot_timer_handler(int sig) +@@ -58,12 +96,15 @@ + do_timer(®s); + } + +-void um_timer(int irq, void *dev, struct pt_regs *regs) ++irqreturn_t um_timer(int irq, void *dev, struct pt_regs *regs) + { ++ unsigned long flags; ++ + do_timer(regs); +- write_seqlock(&xtime_lock); ++ write_seqlock_irqsave(&xtime_lock, flags); + timer(); +- write_sequnlock(&xtime_lock); ++ write_sequnlock_irqrestore(&xtime_lock, flags); ++ return(IRQ_HANDLED); + } + + long um_time(int * tloc) +@@ -81,12 +122,12 @@ + long um_stime(int * tptr) + { + int value; +- struct timeval new; ++ struct timespec new; + + if (get_user(value, tptr)) + return -EFAULT; + new.tv_sec = value; +- new.tv_usec = 0; ++ new.tv_nsec = 0; + do_settimeofday(&new); + return 0; + } +@@ -125,9 +166,11 @@ + void timer_handler(int sig, union uml_pt_regs *regs) + { + #ifdef CONFIG_SMP ++ local_irq_disable(); + update_process_times(user_context(UPT_SP(regs))); ++ local_irq_enable(); + #endif +- if(current->thread_info->cpu == 0) ++ if(current_thread->cpu == 0) + timer_irq(regs); + } + +@@ -136,6 +179,7 @@ + unsigned long time_lock(void) + { + unsigned long flags; ++ + spin_lock_irqsave(&timer_spinlock, flags); + return(flags); + } +@@ -150,8 +194,8 @@ + int err; + + CHOOSE_MODE(user_time_init_tt(), user_time_init_skas()); +- if((err = request_irq(TIMER_IRQ, um_timer, SA_INTERRUPT, "timer", +- NULL)) != 0) ++ err = request_irq(TIMER_IRQ, um_timer, SA_INTERRUPT, "timer", NULL); ++ if(err != 0) + printk(KERN_ERR "timer_init : request_irq failed - " + "errno = %d\n", -err); + timer_irq_inited = 1; +@@ -160,7 +204,6 @@ + + __initcall(timer_init); + +- + /* + * Overrides for Emacs so that we follow Linus's tabbing style. + * Emacs will notice this stuff at the end of the file and automatically diff --git a/lustre/kernel_patches/patches/uml-export-end_iomem.patch b/lustre/kernel_patches/patches/uml-export-end_iomem-2.4.24.patch similarity index 100% rename from lustre/kernel_patches/patches/uml-export-end_iomem.patch rename to lustre/kernel_patches/patches/uml-export-end_iomem-2.4.24.patch diff --git a/lustre/kernel_patches/patches/uml-patch-2.4.20-6.patch b/lustre/kernel_patches/patches/uml-patch-2.4.20-6.patch deleted file mode 100644 index 6bb0d68718..0000000000 --- a/lustre/kernel_patches/patches/uml-patch-2.4.20-6.patch +++ /dev/null @@ -1,39586 +0,0 @@ -diff -Naur -X ../exclude-files orig/arch/um/common.ld.in um/arch/um/common.ld.in ---- orig/arch/um/common.ld.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/common.ld.in 2003-02-04 19:35:13.000000000 -0500 -@@ -0,0 +1,53 @@ -+ .kstrtab : { *(.kstrtab) } -+ -+ . = ALIGN(16); /* Exception table */ -+ __start___ex_table = .; -+ __ex_table : { *(__ex_table) } -+ __stop___ex_table = .; -+ -+ __start___ksymtab = .; /* Kernel symbol table */ -+ __ksymtab : { *(__ksymtab) } -+ __stop___ksymtab = .; -+ -+ .unprotected : { *(.unprotected) } -+ . = ALIGN(4096); -+ PROVIDE (_unprotected_end = .); -+ -+ . = ALIGN(4096); -+ __uml_setup_start = .; -+ .uml.setup.init : { *(.uml.setup.init) } -+ __uml_setup_end = .; -+ __uml_help_start = .; -+ .uml.help.init : { *(.uml.help.init) } -+ __uml_help_end = .; -+ __uml_postsetup_start = .; -+ .uml.postsetup.init : { *(.uml.postsetup.init) } -+ __uml_postsetup_end = .; -+ __setup_start = .; -+ .setup.init : { *(.setup.init) } -+ __setup_end = .; -+ __initcall_start = .; -+ .initcall.init : { *(.initcall.init) } -+ __initcall_end = .; -+ __uml_initcall_start = .; -+ .uml.initcall.init : { *(.uml.initcall.init) } -+ __uml_initcall_end = .; -+ __init_end = .; -+ __exitcall_begin = .; -+ .exitcall : { *(.exitcall.exit) } -+ __exitcall_end = .; -+ __uml_exitcall_begin = .; -+ .uml.exitcall : { *(.uml.exitcall.exit) } -+ __uml_exitcall_end = .; -+ -+ __preinit_array_start = .; -+ .preinit_array : { *(.preinit_array) } -+ __preinit_array_end = .; -+ __init_array_start = .; -+ .init_array : { *(.init_array) } -+ __init_array_end = .; -+ __fini_array_start = .; -+ .fini_array : { *(.fini_array) } -+ __fini_array_end = .; -+ -+ .data.init : { *(.data.init) } -diff -Naur -X ../exclude-files orig/arch/um/config_block.in um/arch/um/config_block.in ---- orig/arch/um/config_block.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/config_block.in 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,16 @@ -+mainmenu_option next_comment -+comment 'Block Devices' -+ -+bool 'Virtual block device' CONFIG_BLK_DEV_UBD -+dep_bool ' Always do synchronous disk IO for UBD' CONFIG_BLK_DEV_UBD_SYNC $CONFIG_BLK_DEV_UBD -+tristate 'Loopback device support' CONFIG_BLK_DEV_LOOP -+dep_tristate 'Network block device support' CONFIG_BLK_DEV_NBD $CONFIG_NET -+tristate 'RAM disk support' CONFIG_BLK_DEV_RAM -+if [ "$CONFIG_BLK_DEV_RAM" = "y" -o "$CONFIG_BLK_DEV_RAM" = "m" ]; then -+ int ' Default RAM disk size' CONFIG_BLK_DEV_RAM_SIZE 4096 -+fi -+dep_bool ' Initial RAM disk (initrd) support' CONFIG_BLK_DEV_INITRD $CONFIG_BLK_DEV_RAM -+ -+tristate 'Example IO memory driver' CONFIG_MMAPPER -+ -+endmenu -diff -Naur -X ../exclude-files orig/arch/um/config_char.in um/arch/um/config_char.in ---- orig/arch/um/config_char.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/config_char.in 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,37 @@ -+mainmenu_option next_comment -+comment 'Character Devices' -+ -+define_bool CONFIG_STDIO_CONSOLE y -+ -+bool 'Virtual serial line' CONFIG_SSL -+ -+bool 'file descriptor channel support' CONFIG_FD_CHAN -+bool 'null channel support' CONFIG_NULL_CHAN -+bool 'port channel support' CONFIG_PORT_CHAN -+bool 'pty channel support' CONFIG_PTY_CHAN -+bool 'tty channel support' CONFIG_TTY_CHAN -+bool 'xterm channel support' CONFIG_XTERM_CHAN -+string 'Default main console channel initialization' CONFIG_CON_ZERO_CHAN \ -+ "fd:0,fd:1" -+string 'Default console channel initialization' CONFIG_CON_CHAN "xterm" -+string 'Default serial line channel initialization' CONFIG_SSL_CHAN "pty" -+ -+ -+bool 'Unix98 PTY support' CONFIG_UNIX98_PTYS -+if [ "$CONFIG_UNIX98_PTYS" = "y" ]; then -+ int 'Maximum number of Unix98 PTYs in use (0-2048)' CONFIG_UNIX98_PTY_COUNT 256 -+fi -+ -+bool 'Watchdog Timer Support' CONFIG_WATCHDOG -+dep_bool ' Disable watchdog shutdown on close' CONFIG_WATCHDOG_NOWAYOUT \ -+ $CONFIG_WATCHDOG -+dep_tristate ' Software Watchdog' CONFIG_SOFT_WATCHDOG $CONFIG_WATCHDOG -+dep_tristate ' UML watchdog' CONFIG_UML_WATCHDOG $CONFIG_WATCHDOG -+ -+tristate 'Sound support' CONFIG_UML_SOUND -+define_tristate CONFIG_SOUND $CONFIG_UML_SOUND -+define_tristate CONFIG_HOSTAUDIO $CONFIG_UML_SOUND -+ -+bool 'Enable tty logging' CONFIG_TTY_LOG -+ -+endmenu -diff -Naur -X ../exclude-files orig/arch/um/config.in um/arch/um/config.in ---- orig/arch/um/config.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/config.in 2003-02-27 13:12:39.000000000 -0500 -@@ -0,0 +1,104 @@ -+define_bool CONFIG_USERMODE y -+ -+mainmenu_name "Linux/Usermode Kernel Configuration" -+ -+define_bool CONFIG_ISA n -+define_bool CONFIG_SBUS n -+define_bool CONFIG_PCI n -+ -+define_bool CONFIG_UID16 y -+ -+define_bool CONFIG_RWSEM_XCHGADD_ALGORITHM y -+ -+mainmenu_option next_comment -+comment 'Code maturity level options' -+bool 'Prompt for development and/or incomplete code/drivers' CONFIG_EXPERIMENTAL -+endmenu -+ -+mainmenu_option next_comment -+comment 'General Setup' -+ -+bool 'Separate kernel address space support' CONFIG_MODE_SKAS -+ -+# This is to ensure that at least one of the modes is enabled. When neither -+# is present in defconfig, they default to N, which is bad. -+if [ "$CONFIG_MODE_SKAS" != "y" ]; then -+ define_bool CONFIG_MODE_TT y -+fi -+ -+bool 'Tracing thread support' CONFIG_MODE_TT -+if [ "$CONFIG_MODE_TT" != "y" ]; then -+ bool 'Statically linked binary when CONFIG_MODE_TT is disabled' CONFIG_STATIC_LINK -+fi -+bool 'Networking support' CONFIG_NET -+bool 'System V IPC' CONFIG_SYSVIPC -+bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT -+bool 'Sysctl support' CONFIG_SYSCTL -+tristate 'Kernel support for a.out binaries' CONFIG_BINFMT_AOUT -+tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF -+tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC -+tristate 'Host filesystem' CONFIG_HOSTFS -+tristate 'Honeypot proc filesystem' CONFIG_HPPFS -+bool 'Management console' CONFIG_MCONSOLE -+dep_bool 'Magic SysRq key' CONFIG_MAGIC_SYSRQ $CONFIG_MCONSOLE -+bool '2G/2G host address space split' CONFIG_HOST_2G_2G -+bool 'Symmetric multi-processing support' CONFIG_UML_SMP -+define_bool CONFIG_SMP $CONFIG_UML_SMP -+int 'Nesting level' CONFIG_NEST_LEVEL 0 -+int 'Kernel address space size (in .5G units)' CONFIG_KERNEL_HALF_GIGS 1 -+bool 'Highmem support' CONFIG_HIGHMEM -+bool '/proc/mm' CONFIG_PROC_MM -+int 'Kernel stack size order' CONFIG_KERNEL_STACK_ORDER 2 -+endmenu -+ -+mainmenu_option next_comment -+comment 'Loadable module support' -+bool 'Enable loadable module support' CONFIG_MODULES -+if [ "$CONFIG_MODULES" = "y" ]; then -+# MODVERSIONS does not yet work in this architecture -+# bool ' Set version information on all module symbols' CONFIG_MODVERSIONS -+ bool ' Kernel module loader' CONFIG_KMOD -+fi -+endmenu -+ -+source arch/um/config_char.in -+ -+source arch/um/config_block.in -+ -+define_bool CONFIG_NETDEVICES $CONFIG_NET -+ -+if [ "$CONFIG_NET" = "y" ]; then -+ source arch/um/config_net.in -+ source net/Config.in -+fi -+ -+source fs/Config.in -+ -+mainmenu_option next_comment -+comment 'SCSI support' -+ -+tristate 'SCSI support' CONFIG_SCSI -+ -+if [ "$CONFIG_SCSI" != "n" ]; then -+ source arch/um/config_scsi.in -+fi -+endmenu -+ -+source drivers/md/Config.in -+ -+source drivers/mtd/Config.in -+ -+source lib/Config.in -+ -+mainmenu_option next_comment -+comment 'Kernel hacking' -+bool 'Debug memory allocations' CONFIG_DEBUG_SLAB -+bool 'Enable kernel debugging symbols' CONFIG_DEBUGSYM -+if [ "$CONFIG_XTERM_CHAN" = "y" ]; then -+ dep_bool 'Enable ptrace proxy' CONFIG_PT_PROXY $CONFIG_DEBUGSYM -+else -+ define_bool CONFIG_PT_PROXY n -+fi -+dep_bool 'Enable gprof support' CONFIG_GPROF $CONFIG_DEBUGSYM -+dep_bool 'Enable gcov support' CONFIG_GCOV $CONFIG_DEBUGSYM -+endmenu -diff -Naur -X ../exclude-files orig/arch/um/config_net.in um/arch/um/config_net.in ---- orig/arch/um/config_net.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/config_net.in 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,47 @@ -+mainmenu_option next_comment -+comment 'Network Devices' -+ -+# UML virtual driver -+bool 'Virtual network device' CONFIG_UML_NET -+ -+dep_bool ' Ethertap transport' CONFIG_UML_NET_ETHERTAP $CONFIG_UML_NET -+dep_bool ' TUN/TAP transport' CONFIG_UML_NET_TUNTAP $CONFIG_UML_NET -+dep_bool ' SLIP transport' CONFIG_UML_NET_SLIP $CONFIG_UML_NET -+dep_bool ' SLiRP transport' CONFIG_UML_NET_SLIRP $CONFIG_UML_NET -+dep_bool ' Daemon transport' CONFIG_UML_NET_DAEMON $CONFIG_UML_NET -+dep_bool ' Multicast transport' CONFIG_UML_NET_MCAST $CONFIG_UML_NET -+dep_bool ' pcap transport' CONFIG_UML_NET_PCAP $CONFIG_UML_NET -+ -+# Below are hardware-independent drivers mirrored from -+# drivers/net/Config.in. It would be nice if Linux -+# had HW independent drivers separated from the other -+# but it does not. Until then each non-ISA/PCI arch -+# needs to provide it's own menu of network drivers -+ -+tristate 'Dummy net driver support' CONFIG_DUMMY -+tristate 'Bonding driver support' CONFIG_BONDING -+tristate 'EQL (serial line load balancing) support' CONFIG_EQUALIZER -+tristate 'Universal TUN/TAP device driver support' CONFIG_TUN -+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then -+ if [ "$CONFIG_NETLINK" = "y" ]; then -+ tristate 'Ethertap network tap (OBSOLETE)' CONFIG_ETHERTAP -+ fi -+fi -+ -+tristate 'PPP (point-to-point protocol) support' CONFIG_PPP -+if [ ! "$CONFIG_PPP" = "n" ]; then -+ dep_bool ' PPP multilink support (EXPERIMENTAL)' CONFIG_PPP_MULTILINK $CONFIG_EXPERIMENTAL -+ dep_bool ' PPP filtering' CONFIG_PPP_FILTER $CONFIG_FILTER -+ dep_tristate ' PPP support for async serial ports' CONFIG_PPP_ASYNC $CONFIG_PPP -+ dep_tristate ' PPP support for sync tty ports' CONFIG_PPP_SYNC_TTY $CONFIG_PPP -+ dep_tristate ' PPP Deflate compression' CONFIG_PPP_DEFLATE $CONFIG_PPP -+ dep_tristate ' PPP BSD-Compress compression' CONFIG_PPP_BSDCOMP $CONFIG_PPP -+ dep_tristate ' PPP over Ethernet (EXPERIMENTAL)' CONFIG_PPPOE $CONFIG_PPP $CONFIG_EXPERIMENTAL -+fi -+ -+tristate 'SLIP (serial line) support' CONFIG_SLIP -+dep_bool ' CSLIP compressed headers' CONFIG_SLIP_COMPRESSED $CONFIG_SLIP -+dep_bool ' Keepalive and linefill' CONFIG_SLIP_SMART $CONFIG_SLIP -+dep_bool ' Six bit SLIP encapsulation' CONFIG_SLIP_MODE_SLIP6 $CONFIG_SLIP -+ -+endmenu -diff -Naur -X ../exclude-files orig/arch/um/config.release um/arch/um/config.release ---- orig/arch/um/config.release 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/config.release 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,302 @@ -+# -+# Automatically generated make config: don't edit -+# -+CONFIG_USERMODE=y -+# CONFIG_ISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_PCI is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_XCHGADD_ALGORITHM=y -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+ -+# -+# General Setup -+# -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+CONFIG_BSD_PROCESS_ACCT=y -+CONFIG_SYSCTL=y -+CONFIG_BINFMT_AOUT=y -+CONFIG_BINFMT_ELF=y -+CONFIG_BINFMT_MISC=y -+CONFIG_HOSTFS=y -+# CONFIG_HPPFS is not set -+CONFIG_MCONSOLE=y -+CONFIG_MAGIC_SYSRQ=y -+# CONFIG_HOST_2G_2G is not set -+# CONFIG_UML_SMP is not set -+# CONFIG_SMP is not set -+CONFIG_NEST_LEVEL=0 -+CONFIG_KERNEL_HALF_GIGS=1 -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+CONFIG_KMOD=y -+ -+# -+# Character Devices -+# -+CONFIG_STDIO_CONSOLE=y -+CONFIG_SSL=y -+CONFIG_FD_CHAN=y -+# CONFIG_NULL_CHAN is not set -+CONFIG_PORT_CHAN=y -+CONFIG_PTY_CHAN=y -+CONFIG_TTY_CHAN=y -+CONFIG_XTERM_CHAN=y -+CONFIG_CON_ZERO_CHAN="fd:0,fd:1" -+CONFIG_CON_CHAN="xterm" -+CONFIG_SSL_CHAN="pty" -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+# CONFIG_WATCHDOG is not set -+CONFIG_UML_SOUND=y -+CONFIG_SOUND=y -+CONFIG_HOSTAUDIO=y -+# CONFIG_TTY_LOG is not set -+ -+# -+# Block Devices -+# -+CONFIG_BLK_DEV_UBD=y -+# CONFIG_BLK_DEV_UBD_SYNC is not set -+CONFIG_BLK_DEV_LOOP=y -+CONFIG_BLK_DEV_NBD=y -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_SIZE=4096 -+CONFIG_BLK_DEV_INITRD=y -+# CONFIG_MMAPPER is not set -+CONFIG_NETDEVICES=y -+ -+# -+# Network Devices -+# -+CONFIG_UML_NET=y -+CONFIG_UML_NET_ETHERTAP=y -+CONFIG_UML_NET_TUNTAP=y -+CONFIG_UML_NET_SLIP=y -+CONFIG_UML_NET_DAEMON=y -+CONFIG_UML_NET_MCAST=y -+CONFIG_DUMMY=y -+CONFIG_BONDING=m -+CONFIG_EQUALIZER=m -+CONFIG_TUN=y -+CONFIG_PPP=m -+CONFIG_PPP_MULTILINK=y -+# CONFIG_PPP_ASYNC is not set -+CONFIG_PPP_SYNC_TTY=m -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+CONFIG_PPPOE=m -+CONFIG_SLIP=m -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+CONFIG_PACKET_MMAP=y -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_FILTER is not set -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# 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_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+ -+# -+# -+# -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+ -+# -+# Appletalk devices -+# -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC 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 -+ -+# -+# File systems -+# -+CONFIG_QUOTA=y -+CONFIG_AUTOFS_FS=m -+CONFIG_AUTOFS4_FS=m -+CONFIG_REISERFS_FS=m -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+CONFIG_ADFS_FS=m -+# CONFIG_ADFS_FS_RW is not set -+CONFIG_AFFS_FS=m -+CONFIG_HFS_FS=m -+CONFIG_BFS_FS=m -+CONFIG_EXT3_FS=y -+CONFIG_JBD=y -+# CONFIG_JBD_DEBUG is not set -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+CONFIG_UMSDOS_FS=y -+CONFIG_VFAT_FS=y -+CONFIG_EFS_FS=m -+CONFIG_CRAMFS=m -+CONFIG_TMPFS=y -+CONFIG_RAMFS=y -+CONFIG_ISO9660_FS=y -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+CONFIG_MINIX_FS=m -+CONFIG_VXFS_FS=m -+# CONFIG_NTFS_FS is not set -+CONFIG_HPFS_FS=m -+CONFIG_PROC_FS=y -+CONFIG_DEVFS_FS=y -+CONFIG_DEVFS_MOUNT=y -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+CONFIG_QNX4FS_FS=m -+# CONFIG_QNX4FS_RW is not set -+CONFIG_ROMFS_FS=m -+CONFIG_EXT2_FS=y -+CONFIG_SYSV_FS=m -+CONFIG_UDF_FS=m -+# CONFIG_UDF_RW is not set -+CONFIG_UFS_FS=m -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+CONFIG_NFS_FS=y -+CONFIG_NFS_V3=y -+CONFIG_NFSD=y -+CONFIG_NFSD_V3=y -+CONFIG_SUNRPC=y -+CONFIG_LOCKD=y -+CONFIG_LOCKD_V4=y -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_ZISOFS_FS is not set -+CONFIG_ZLIB_FS_INFLATE=m -+ -+# -+# Partition Types -+# -+# CONFIG_PARTITION_ADVANCED is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_SMB_NLS is not set -+CONFIG_NLS=y -+ -+# -+# Native Language Support -+# -+CONFIG_NLS_DEFAULT="iso8859-1" -+# CONFIG_NLS_CODEPAGE_437 is not set -+# 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 is not set -+# 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 -+ -+# -+# SCSI support -+# -+CONFIG_SCSI=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+# CONFIG_BLK_DEV_SD is not set -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_BLK_DEV_SR is not set -+# CONFIG_CHR_DEV_SG is not set -+ -+# -+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -+# -+# CONFIG_SCSI_DEBUG_QUEUES is not set -+# CONFIG_SCSI_MULTI_LUN is not set -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+CONFIG_SCSI_DEBUG=m -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+# CONFIG_MTD is not set -+ -+# -+# Kernel hacking -+# -+# CONFIG_DEBUG_SLAB is not set -+# CONFIG_DEBUGSYM is not set -diff -Naur -X ../exclude-files orig/arch/um/config_scsi.in um/arch/um/config_scsi.in ---- orig/arch/um/config_scsi.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/config_scsi.in 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,30 @@ -+comment 'SCSI support type (disk, tape, CD-ROM)' -+ -+dep_tristate ' SCSI disk support' CONFIG_BLK_DEV_SD $CONFIG_SCSI -+ -+if [ "$CONFIG_BLK_DEV_SD" != "n" ]; then -+ int 'Maximum number of SCSI disks that can be loaded as modules' CONFIG_SD_EXTRA_DEVS 40 -+fi -+ -+dep_tristate ' SCSI tape support' CONFIG_CHR_DEV_ST $CONFIG_SCSI -+ -+dep_tristate ' SCSI CD-ROM support' CONFIG_BLK_DEV_SR $CONFIG_SCSI -+ -+if [ "$CONFIG_BLK_DEV_SR" != "n" ]; then -+ bool ' Enable vendor-specific extensions (for SCSI CDROM)' CONFIG_BLK_DEV_SR_VENDOR -+ int 'Maximum number of CDROM devices that can be loaded as modules' CONFIG_SR_EXTRA_DEVS 2 -+fi -+dep_tristate ' SCSI generic support' CONFIG_CHR_DEV_SG $CONFIG_SCSI -+ -+comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs' -+ -+#if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then -+ bool ' Enable extra checks in new queueing code' CONFIG_SCSI_DEBUG_QUEUES -+#fi -+ -+bool ' Probe all LUNs on each SCSI device' CONFIG_SCSI_MULTI_LUN -+ -+bool ' Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS -+bool ' SCSI logging facility' CONFIG_SCSI_LOGGING -+ -+dep_tristate 'SCSI debugging host simulator (EXPERIMENTAL)' CONFIG_SCSI_DEBUG $CONFIG_SCSI -diff -Naur -X ../exclude-files orig/arch/um/defconfig um/arch/um/defconfig ---- orig/arch/um/defconfig 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/defconfig 2003-01-20 11:26:54.000000000 -0500 -@@ -0,0 +1,396 @@ -+# -+# Automatically generated make config: don't edit -+# -+CONFIG_USERMODE=y -+# CONFIG_ISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_PCI is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_XCHGADD_ALGORITHM=y -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+ -+# -+# General Setup -+# -+CONFIG_MODE_TT=y -+CONFIG_MODE_SKAS=y -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+CONFIG_BSD_PROCESS_ACCT=y -+CONFIG_SYSCTL=y -+CONFIG_BINFMT_AOUT=y -+CONFIG_BINFMT_ELF=y -+CONFIG_BINFMT_MISC=y -+CONFIG_HOSTFS=y -+CONFIG_HPPFS=y -+CONFIG_MCONSOLE=y -+CONFIG_MAGIC_SYSRQ=y -+# CONFIG_HOST_2G_2G is not set -+# CONFIG_UML_SMP is not set -+# CONFIG_SMP is not set -+CONFIG_NEST_LEVEL=0 -+CONFIG_KERNEL_HALF_GIGS=1 -+# CONFIG_HIGHMEM is not set -+CONFIG_PROC_MM=y -+CONFIG_KERNEL_STACK_ORDER=2 -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+# CONFIG_KMOD is not set -+ -+# -+# Character Devices -+# -+CONFIG_STDIO_CONSOLE=y -+CONFIG_SSL=y -+CONFIG_FD_CHAN=y -+CONFIG_NULL_CHAN=y -+CONFIG_PORT_CHAN=y -+CONFIG_PTY_CHAN=y -+CONFIG_TTY_CHAN=y -+CONFIG_XTERM_CHAN=y -+CONFIG_CON_ZERO_CHAN="fd:0,fd:1" -+CONFIG_CON_CHAN="xterm" -+CONFIG_SSL_CHAN="pty" -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+# CONFIG_WATCHDOG is not set -+# CONFIG_WATCHDOG_NOWAYOUT is not set -+# CONFIG_SOFT_WATCHDOG is not set -+# CONFIG_UML_WATCHDOG is not set -+CONFIG_UML_SOUND=y -+CONFIG_SOUND=y -+CONFIG_HOSTAUDIO=y -+# CONFIG_TTY_LOG is not set -+ -+# -+# Block Devices -+# -+CONFIG_BLK_DEV_UBD=y -+# CONFIG_BLK_DEV_UBD_SYNC is not set -+CONFIG_BLK_DEV_LOOP=y -+CONFIG_BLK_DEV_NBD=y -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_SIZE=4096 -+CONFIG_BLK_DEV_INITRD=y -+# CONFIG_MMAPPER is not set -+CONFIG_NETDEVICES=y -+ -+# -+# Network Devices -+# -+CONFIG_UML_NET=y -+CONFIG_UML_NET_ETHERTAP=y -+CONFIG_UML_NET_TUNTAP=y -+CONFIG_UML_NET_SLIP=y -+CONFIG_UML_NET_SLIRP=y -+CONFIG_UML_NET_DAEMON=y -+CONFIG_UML_NET_MCAST=y -+# CONFIG_UML_NET_PCAP is not set -+CONFIG_DUMMY=y -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+CONFIG_TUN=y -+CONFIG_PPP=y -+# CONFIG_PPP_MULTILINK is not set -+# CONFIG_PPP_FILTER is not set -+# CONFIG_PPP_ASYNC is not set -+# CONFIG_PPP_SYNC_TTY is not set -+# CONFIG_PPP_DEFLATE is not set -+# CONFIG_PPP_BSDCOMP is not set -+# CONFIG_PPPOE is not set -+CONFIG_SLIP=y -+# CONFIG_SLIP_COMPRESSED is not set -+# CONFIG_SLIP_SMART is not set -+# CONFIG_SLIP_MODE_SLIP6 is not set -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+CONFIG_PACKET_MMAP=y -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_FILTER is not set -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# 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_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+ -+# -+# -+# -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+ -+# -+# Appletalk devices -+# -+# CONFIG_DEV_APPLETALK is not set -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC 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 -+ -+# -+# File systems -+# -+CONFIG_QUOTA=y -+CONFIG_AUTOFS_FS=y -+CONFIG_AUTOFS4_FS=y -+CONFIG_REISERFS_FS=y -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_ADFS_FS is not set -+# CONFIG_ADFS_FS_RW is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EXT3_FS is not set -+# CONFIG_JBD is not set -+# CONFIG_JBD_DEBUG is not set -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+CONFIG_UMSDOS_FS=y -+CONFIG_VFAT_FS=y -+# CONFIG_EFS_FS is not set -+CONFIG_JFFS_FS=y -+CONFIG_JFFS_FS_VERBOSE=0 -+CONFIG_JFFS_PROC_FS=y -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+# CONFIG_CRAMFS is not set -+# CONFIG_TMPFS is not set -+CONFIG_RAMFS=y -+CONFIG_ISO9660_FS=y -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+CONFIG_MINIX_FS=y -+# CONFIG_VXFS_FS is not set -+# CONFIG_NTFS_FS is not set -+# CONFIG_NTFS_RW is not set -+# CONFIG_HPFS_FS is not set -+CONFIG_PROC_FS=y -+CONFIG_DEVFS_FS=y -+CONFIG_DEVFS_MOUNT=y -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_QNX4FS_RW is not set -+# CONFIG_ROMFS_FS is not set -+CONFIG_EXT2_FS=y -+# CONFIG_SYSV_FS is not set -+# CONFIG_UDF_FS is not set -+# CONFIG_UDF_RW is not set -+# CONFIG_UFS_FS is not set -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+# CONFIG_NFS_FS is not set -+# CONFIG_NFS_V3 is not set -+# CONFIG_ROOT_NFS is not set -+# CONFIG_NFSD is not set -+# CONFIG_NFSD_V3 is not set -+# CONFIG_SUNRPC is not set -+# CONFIG_LOCKD is not set -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_NCPFS_PACKET_SIGNING is not set -+# CONFIG_NCPFS_IOCTL_LOCKING is not set -+# CONFIG_NCPFS_STRONG is not set -+# CONFIG_NCPFS_NFS_NS is not set -+# CONFIG_NCPFS_OS2_NS is not set -+# CONFIG_NCPFS_SMALLDOS is not set -+# CONFIG_NCPFS_NLS is not set -+# CONFIG_NCPFS_EXTRAS is not set -+# CONFIG_ZISOFS_FS is not set -+# CONFIG_ZLIB_FS_INFLATE is not set -+ -+# -+# Partition Types -+# -+# CONFIG_PARTITION_ADVANCED is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_SMB_NLS is not set -+CONFIG_NLS=y -+ -+# -+# Native Language Support -+# -+CONFIG_NLS_DEFAULT="iso8859-1" -+# CONFIG_NLS_CODEPAGE_437 is not set -+# 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 is not set -+# 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 -+ -+# -+# SCSI support -+# -+CONFIG_SCSI=y -+ -+# -+# SCSI support type (disk, tape, CD-ROM) -+# -+# CONFIG_BLK_DEV_SD is not set -+# CONFIG_CHR_DEV_ST is not set -+# CONFIG_BLK_DEV_SR is not set -+# CONFIG_CHR_DEV_SG is not set -+ -+# -+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs -+# -+# CONFIG_SCSI_DEBUG_QUEUES is not set -+# CONFIG_SCSI_MULTI_LUN is not set -+# CONFIG_SCSI_CONSTANTS is not set -+# CONFIG_SCSI_LOGGING is not set -+CONFIG_SCSI_DEBUG=y -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+# CONFIG_BLK_DEV_MD is not set -+# CONFIG_MD_LINEAR is not set -+# CONFIG_MD_RAID0 is not set -+# CONFIG_MD_RAID1 is not set -+# CONFIG_MD_RAID5 is not set -+# CONFIG_MD_MULTIPATH is not set -+# CONFIG_BLK_DEV_LVM is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+# CONFIG_MTD_PARTITIONS is not set -+# CONFIG_MTD_CONCAT is not set -+# CONFIG_MTD_REDBOOT_PARTS is not set -+ -+# -+# User Modules And Translation Layers -+# -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+# CONFIG_MTD_CFI is not set -+# CONFIG_MTD_JEDECPROBE is not set -+# CONFIG_MTD_GEN_PROBE is not set -+# CONFIG_MTD_CFI_INTELEXT is not set -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+# CONFIG_MTD_OBSOLETE_CHIPS is not set -+# CONFIG_MTD_AMDSTD is not set -+# CONFIG_MTD_SHARP is not set -+# CONFIG_MTD_JEDEC is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_PHYSMAP is not set -+# CONFIG_MTD_PCI is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_PMC551 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+CONFIG_MTD_BLKMTD=y -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC1000 is not set -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOCPROBE is not set -+ -+# -+# NAND Flash Device Drivers -+# -+# CONFIG_MTD_NAND is not set -+ -+# -+# Kernel hacking -+# -+# CONFIG_DEBUG_SLAB is not set -+CONFIG_DEBUGSYM=y -+CONFIG_PT_PROXY=y -+# CONFIG_GPROF is not set -+# CONFIG_GCOV is not set -diff -Naur -X ../exclude-files orig/arch/um/drivers/chan_kern.c um/arch/um/drivers/chan_kern.c ---- orig/arch/um/drivers/chan_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/chan_kern.c 2003-03-06 19:25:16.000000000 -0500 -@@ -0,0 +1,510 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <linux/stddef.h> -+#include <linux/kernel.h> -+#include <linux/list.h> -+#include <linux/slab.h> -+#include <linux/tty.h> -+#include <linux/string.h> -+#include <linux/tty_flip.h> -+#include <asm/irq.h> -+#include "chan_kern.h" -+#include "user_util.h" -+#include "kern.h" -+#include "irq_user.h" -+#include "sigio.h" -+#include "line.h" -+ -+static void *not_configged_init(char *str, int device, struct chan_opts *opts) -+{ -+ printk(KERN_ERR "Using a channel type which is configured out of " -+ "UML\n"); -+ return(NULL); -+} -+ -+static int not_configged_open(int input, int output, int primary, void *data, -+ char **dev_out) -+{ -+ printk(KERN_ERR "Using a channel type which is configured out of " -+ "UML\n"); -+ return(-ENODEV); -+} -+ -+static void not_configged_close(int fd, void *data) -+{ -+ printk(KERN_ERR "Using a channel type which is configured out of " -+ "UML\n"); -+} -+ -+static int not_configged_read(int fd, char *c_out, void *data) -+{ -+ printk(KERN_ERR "Using a channel type which is configured out of " -+ "UML\n"); -+ return(-EIO); -+} -+ -+static int not_configged_write(int fd, const char *buf, int len, void *data) -+{ -+ printk(KERN_ERR "Using a channel type which is configured out of " -+ "UML\n"); -+ return(-EIO); -+} -+ -+static int not_configged_console_write(int fd, const char *buf, int len, -+ void *data) -+{ -+ printk(KERN_ERR "Using a channel type which is configured out of " -+ "UML\n"); -+ return(-EIO); -+} -+ -+static int not_configged_window_size(int fd, void *data, unsigned short *rows, -+ unsigned short *cols) -+{ -+ printk(KERN_ERR "Using a channel type which is configured out of " -+ "UML\n"); -+ return(-ENODEV); -+} -+ -+static void not_configged_free(void *data) -+{ -+ printk(KERN_ERR "Using a channel type which is configured out of " -+ "UML\n"); -+} -+ -+static struct chan_ops not_configged_ops = { -+ .init = not_configged_init, -+ .open = not_configged_open, -+ .close = not_configged_close, -+ .read = not_configged_read, -+ .write = not_configged_write, -+ .console_write = not_configged_console_write, -+ .window_size = not_configged_window_size, -+ .free = not_configged_free, -+ .winch = 0, -+}; -+ -+static void tty_receive_char(struct tty_struct *tty, char ch) -+{ -+ if(tty == NULL) return; -+ -+ if(I_IXON(tty) && !I_IXOFF(tty) && !tty->raw) { -+ if(ch == STOP_CHAR(tty)){ -+ stop_tty(tty); -+ return; -+ } -+ else if(ch == START_CHAR(tty)){ -+ start_tty(tty); -+ return; -+ } -+ } -+ -+ if((tty->flip.flag_buf_ptr == NULL) || -+ (tty->flip.char_buf_ptr == NULL)) -+ return; -+ tty_insert_flip_char(tty, ch, TTY_NORMAL); -+} -+ -+static int open_one_chan(struct chan *chan, int input, int output, int primary) -+{ -+ int fd; -+ -+ if(chan->opened) return(0); -+ if(chan->ops->open == NULL) fd = 0; -+ else fd = (*chan->ops->open)(input, output, primary, chan->data, -+ &chan->dev); -+ if(fd < 0) return(fd); -+ chan->fd = fd; -+ -+ chan->opened = 1; -+ return(0); -+} -+ -+int open_chan(struct list_head *chans) -+{ -+ struct list_head *ele; -+ struct chan *chan; -+ int ret, err = 0; -+ -+ list_for_each(ele, chans){ -+ chan = list_entry(ele, struct chan, list); -+ ret = open_one_chan(chan, chan->input, chan->output, -+ chan->primary); -+ if(chan->primary) err = ret; -+ } -+ return(err); -+} -+ -+void chan_enable_winch(struct list_head *chans, void *line) -+{ -+ struct list_head *ele; -+ struct chan *chan; -+ -+ list_for_each(ele, chans){ -+ chan = list_entry(ele, struct chan, list); -+ if(chan->primary && chan->output && chan->ops->winch){ -+ register_winch(chan->fd, line); -+ return; -+ } -+ } -+} -+ -+void enable_chan(struct list_head *chans, void *data) -+{ -+ struct list_head *ele; -+ struct chan *chan; -+ -+ list_for_each(ele, chans){ -+ chan = list_entry(ele, struct chan, list); -+ if(!chan->opened) continue; -+ -+ line_setup_irq(chan->fd, chan->input, chan->output, data); -+ } -+} -+ -+void close_chan(struct list_head *chans) -+{ -+ struct list_head *ele; -+ struct chan *chan; -+ -+ /* Close in reverse order as open in case more than one of them -+ * refers to the same device and they save and restore that device's -+ * state. Then, the first one opened will have the original state, -+ * so it must be the last closed. -+ */ -+ for(ele = chans->prev; ele != chans; ele = ele->prev){ -+ chan = list_entry(ele, struct chan, list); -+ if(!chan->opened) continue; -+ if(chan->ops->close != NULL) -+ (*chan->ops->close)(chan->fd, chan->data); -+ chan->opened = 0; -+ chan->fd = -1; -+ } -+} -+ -+int write_chan(struct list_head *chans, const char *buf, int len, -+ int write_irq) -+{ -+ struct list_head *ele; -+ struct chan *chan; -+ int n, ret = 0; -+ -+ list_for_each(ele, chans){ -+ chan = list_entry(ele, struct chan, list); -+ if(!chan->output || (chan->ops->write == NULL)) continue; -+ n = chan->ops->write(chan->fd, buf, len, chan->data); -+ if(chan->primary){ -+ ret = n; -+ if((ret == -EAGAIN) || ((ret >= 0) && (ret < len))){ -+ reactivate_fd(chan->fd, write_irq); -+ if(ret == -EAGAIN) ret = 0; -+ } -+ } -+ } -+ return(ret); -+} -+ -+int console_write_chan(struct list_head *chans, const char *buf, int len) -+{ -+ struct list_head *ele; -+ struct chan *chan; -+ int n, ret = 0; -+ -+ list_for_each(ele, chans){ -+ chan = list_entry(ele, struct chan, list); -+ if(!chan->output || (chan->ops->console_write == NULL)) -+ continue; -+ n = chan->ops->console_write(chan->fd, buf, len, chan->data); -+ if(chan->primary) ret = n; -+ } -+ return(ret); -+} -+ -+int chan_window_size(struct list_head *chans, unsigned short *rows_out, -+ unsigned short *cols_out) -+{ -+ struct list_head *ele; -+ struct chan *chan; -+ -+ list_for_each(ele, chans){ -+ chan = list_entry(ele, struct chan, list); -+ if(chan->primary){ -+ if(chan->ops->window_size == NULL) return(0); -+ return(chan->ops->window_size(chan->fd, chan->data, -+ rows_out, cols_out)); -+ } -+ } -+ return(0); -+} -+ -+void free_one_chan(struct chan *chan) -+{ -+ list_del(&chan->list); -+ if(chan->ops->free != NULL) -+ (*chan->ops->free)(chan->data); -+ free_irq_by_fd(chan->fd); -+ if(chan->primary && chan->output) ignore_sigio_fd(chan->fd); -+ kfree(chan); -+} -+ -+void free_chan(struct list_head *chans) -+{ -+ struct list_head *ele, *next; -+ struct chan *chan; -+ -+ list_for_each_safe(ele, next, chans){ -+ chan = list_entry(ele, struct chan, list); -+ free_one_chan(chan); -+ } -+} -+ -+static int one_chan_config_string(struct chan *chan, char *str, int size, -+ char **error_out) -+{ -+ int n = 0; -+ -+ CONFIG_CHUNK(str, size, n, chan->ops->type, 0); -+ -+ if(chan->dev == NULL){ -+ CONFIG_CHUNK(str, size, n, "", 1); -+ return(n); -+ } -+ -+ CONFIG_CHUNK(str, size, n, ":", 0); -+ CONFIG_CHUNK(str, size, n, chan->dev, 0); -+ -+ return(n); -+} -+ -+static int chan_pair_config_string(struct chan *in, struct chan *out, -+ char *str, int size, char **error_out) -+{ -+ int n; -+ -+ n = one_chan_config_string(in, str, size, error_out); -+ str += n; -+ size -= n; -+ -+ if(in == out){ -+ CONFIG_CHUNK(str, size, n, "", 1); -+ return(n); -+ } -+ -+ CONFIG_CHUNK(str, size, n, ",", 1); -+ n = one_chan_config_string(out, str, size, error_out); -+ str += n; -+ size -= n; -+ CONFIG_CHUNK(str, size, n, "", 1); -+ -+ return(n); -+} -+ -+int chan_config_string(struct list_head *chans, char *str, int size, -+ char **error_out) -+{ -+ struct list_head *ele; -+ struct chan *chan, *in = NULL, *out = NULL; -+ -+ list_for_each(ele, chans){ -+ chan = list_entry(ele, struct chan, list); -+ if(!chan->primary) -+ continue; -+ if(chan->input) -+ in = chan; -+ if(chan->output) -+ out = chan; -+ } -+ -+ return(chan_pair_config_string(in, out, str, size, error_out)); -+} -+ -+struct chan_type { -+ char *key; -+ struct chan_ops *ops; -+}; -+ -+struct chan_type chan_table[] = { -+#ifdef CONFIG_FD_CHAN -+ { "fd", &fd_ops }, -+#else -+ { "fd", ¬_configged_ops }, -+#endif -+ -+#ifdef CONFIG_NULL_CHAN -+ { "null", &null_ops }, -+#else -+ { "null", ¬_configged_ops }, -+#endif -+ -+#ifdef CONFIG_PORT_CHAN -+ { "port", &port_ops }, -+#else -+ { "port", ¬_configged_ops }, -+#endif -+ -+#ifdef CONFIG_PTY_CHAN -+ { "pty", &pty_ops }, -+ { "pts", &pts_ops }, -+#else -+ { "pty", ¬_configged_ops }, -+ { "pts", ¬_configged_ops }, -+#endif -+ -+#ifdef CONFIG_TTY_CHAN -+ { "tty", &tty_ops }, -+#else -+ { "tty", ¬_configged_ops }, -+#endif -+ -+#ifdef CONFIG_XTERM_CHAN -+ { "xterm", &xterm_ops }, -+#else -+ { "xterm", ¬_configged_ops }, -+#endif -+}; -+ -+static struct chan *parse_chan(char *str, int pri, int device, -+ struct chan_opts *opts) -+{ -+ struct chan_type *entry; -+ struct chan_ops *ops; -+ struct chan *chan; -+ void *data; -+ int i; -+ -+ ops = NULL; -+ data = NULL; -+ for(i = 0; i < sizeof(chan_table)/sizeof(chan_table[0]); i++){ -+ entry = &chan_table[i]; -+ if(!strncmp(str, entry->key, strlen(entry->key))){ -+ ops = entry->ops; -+ str += strlen(entry->key); -+ break; -+ } -+ } -+ if(ops == NULL){ -+ printk(KERN_ERR "parse_chan couldn't parse \"%s\"\n", -+ str); -+ return(NULL); -+ } -+ if(ops->init == NULL) return(NULL); -+ data = (*ops->init)(str, device, opts); -+ if(data == NULL) return(NULL); -+ -+ chan = kmalloc(sizeof(*chan), GFP_KERNEL); -+ if(chan == NULL) return(NULL); -+ *chan = ((struct chan) { .list = LIST_HEAD_INIT(chan->list), -+ .primary = 1, -+ .input = 0, -+ .output = 0, -+ .opened = 0, -+ .fd = -1, -+ .pri = pri, -+ .ops = ops, -+ .data = data }); -+ return(chan); -+} -+ -+int parse_chan_pair(char *str, struct list_head *chans, int pri, int device, -+ struct chan_opts *opts) -+{ -+ struct chan *new, *chan; -+ char *in, *out; -+ -+ if(!list_empty(chans)){ -+ chan = list_entry(chans->next, struct chan, list); -+ if(chan->pri >= pri) return(0); -+ free_chan(chans); -+ INIT_LIST_HEAD(chans); -+ } -+ -+ if((out = strchr(str, ',')) != NULL){ -+ in = str; -+ *out = '\0'; -+ out++; -+ new = parse_chan(in, pri, device, opts); -+ if(new == NULL) return(-1); -+ new->input = 1; -+ list_add(&new->list, chans); -+ -+ new = parse_chan(out, pri, device, opts); -+ if(new == NULL) return(-1); -+ list_add(&new->list, chans); -+ new->output = 1; -+ } -+ else { -+ new = parse_chan(str, pri, device, opts); -+ if(new == NULL) return(-1); -+ list_add(&new->list, chans); -+ new->input = 1; -+ new->output = 1; -+ } -+ return(0); -+} -+ -+int chan_out_fd(struct list_head *chans) -+{ -+ struct list_head *ele; -+ struct chan *chan; -+ -+ list_for_each(ele, chans){ -+ chan = list_entry(ele, struct chan, list); -+ if(chan->primary && chan->output) -+ return(chan->fd); -+ } -+ return(-1); -+} -+ -+void chan_interrupt(struct list_head *chans, struct tq_struct *task, -+ struct tty_struct *tty, int irq, void *dev) -+{ -+ struct list_head *ele, *next; -+ struct chan *chan; -+ int err; -+ char c; -+ -+ list_for_each_safe(ele, next, chans){ -+ chan = list_entry(ele, struct chan, list); -+ if(!chan->input || (chan->ops->read == NULL)) continue; -+ do { -+ if((tty != NULL) && -+ (tty->flip.count >= TTY_FLIPBUF_SIZE)){ -+ queue_task(task, &tq_timer); -+ goto out; -+ } -+ err = chan->ops->read(chan->fd, &c, chan->data); -+ if(err > 0) tty_receive_char(tty, c); -+ } while(err > 0); -+ if(err == 0) reactivate_fd(chan->fd, irq); -+ if(err == -EIO){ -+ if(chan->primary){ -+ if(tty != NULL) tty_hangup(tty); -+ line_disable(dev, irq); -+ close_chan(chans); -+ free_chan(chans); -+ return; -+ } -+ else { -+ if(chan->ops->close != NULL) -+ chan->ops->close(chan->fd, chan->data); -+ free_one_chan(chan); -+ } -+ } -+ } -+ out: -+ if(tty) tty_flip_buffer_push(tty); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/chan_user.c um/arch/um/drivers/chan_user.c ---- orig/arch/um/drivers/chan_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/chan_user.c 2003-03-26 13:23:48.000000000 -0500 -@@ -0,0 +1,213 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <unistd.h> -+#include <stdlib.h> -+#include <errno.h> -+#include <termios.h> -+#include <fcntl.h> -+#include <string.h> -+#include <signal.h> -+#include <sys/stat.h> -+#include <sys/ioctl.h> -+#include <sys/socket.h> -+#include "kern_util.h" -+#include "user_util.h" -+#include "chan_user.h" -+#include "user.h" -+#include "helper.h" -+#include "os.h" -+#include "choose-mode.h" -+#include "mode.h" -+ -+void generic_close(int fd, void *unused) -+{ -+ close(fd); -+} -+ -+int generic_read(int fd, char *c_out, void *unused) -+{ -+ int n; -+ -+ n = read(fd, c_out, sizeof(*c_out)); -+ if(n < 0){ -+ if(errno == EAGAIN) return(0); -+ return(-errno); -+ } -+ else if(n == 0) return(-EIO); -+ return(1); -+} -+ -+int generic_write(int fd, const char *buf, int n, void *unused) -+{ -+ int count; -+ -+ count = write(fd, buf, n); -+ if(count < 0) return(-errno); -+ return(count); -+} -+ -+int generic_console_write(int fd, const char *buf, int n, void *unused) -+{ -+ struct termios save, new; -+ int err; -+ -+ if(isatty(fd)){ -+ tcgetattr(fd, &save); -+ new = save; -+ new.c_oflag |= OPOST; -+ tcsetattr(fd, TCSAFLUSH, &new); -+ } -+ err = generic_write(fd, buf, n, NULL); -+ if(isatty(fd)) tcsetattr(fd, TCSAFLUSH, &save); -+ return(err); -+} -+ -+int generic_window_size(int fd, void *unused, unsigned short *rows_out, -+ unsigned short *cols_out) -+{ -+ struct winsize size; -+ int ret = 0; -+ -+ if(ioctl(fd, TIOCGWINSZ, &size) == 0){ -+ ret = ((*rows_out != size.ws_row) || -+ (*cols_out != size.ws_col)); -+ *rows_out = size.ws_row; -+ *cols_out = size.ws_col; -+ } -+ return(ret); -+} -+ -+void generic_free(void *data) -+{ -+ kfree(data); -+} -+ -+static void winch_handler(int sig) -+{ -+} -+ -+struct winch_data { -+ int pty_fd; -+ int pipe_fd; -+ int close_me; -+}; -+ -+static int winch_thread(void *arg) -+{ -+ struct winch_data *data = arg; -+ sigset_t sigs; -+ int pty_fd, pipe_fd; -+ char c = 1; -+ -+ close(data->close_me); -+ pty_fd = data->pty_fd; -+ pipe_fd = data->pipe_fd; -+ if(write(pipe_fd, &c, sizeof(c)) != sizeof(c)) -+ printk("winch_thread : failed to write synchronization " -+ "byte, errno = %d\n", errno); -+ -+ signal(SIGWINCH, winch_handler); -+ sigfillset(&sigs); -+ sigdelset(&sigs, SIGWINCH); -+ if(sigprocmask(SIG_SETMASK, &sigs, NULL) < 0){ -+ printk("winch_thread : sigprocmask failed, errno = %d\n", -+ errno); -+ exit(1); -+ } -+ -+ if(setsid() < 0){ -+ printk("winch_thread : setsid failed, errno = %d\n", errno); -+ exit(1); -+ } -+ -+ if(ioctl(pty_fd, TIOCSCTTY, 0) < 0){ -+ printk("winch_thread : TIOCSCTTY failed, errno = %d\n", errno); -+ exit(1); -+ } -+ if(tcsetpgrp(pty_fd, os_getpid()) < 0){ -+ printk("winch_thread : tcsetpgrp failed, errno = %d\n", errno); -+ exit(1); -+ } -+ -+ if(read(pipe_fd, &c, sizeof(c)) != sizeof(c)) -+ printk("winch_thread : failed to read synchronization byte, " -+ "errno = %d\n", errno); -+ -+ while(1){ -+ pause(); -+ -+ if(write(pipe_fd, &c, sizeof(c)) != sizeof(c)){ -+ printk("winch_thread : write failed, errno = %d\n", -+ errno); -+ } -+ } -+} -+ -+static int winch_tramp(int fd, void *device_data, int *fd_out) -+{ -+ struct winch_data data; -+ unsigned long stack; -+ int fds[2], pid, n, err; -+ char c; -+ -+ err = os_pipe(fds, 1, 1); -+ if(err){ -+ printk("winch_tramp : os_pipe failed, errno = %d\n", -err); -+ return(err); -+ } -+ -+ data = ((struct winch_data) { .pty_fd = fd, -+ .pipe_fd = fds[1], -+ .close_me = fds[0] } ); -+ pid = run_helper_thread(winch_thread, &data, 0, &stack, 0); -+ if(pid < 0){ -+ printk("fork of winch_thread failed - errno = %d\n", errno); -+ return(pid); -+ } -+ -+ close(fds[1]); -+ *fd_out = fds[0]; -+ n = read(fds[0], &c, sizeof(c)); -+ if(n != sizeof(c)){ -+ printk("winch_tramp : failed to read synchronization byte\n"); -+ printk("read returned %d, errno = %d\n", n, errno); -+ printk("fd %d will not support SIGWINCH\n", fd); -+ *fd_out = -1; -+ } -+ return(pid); -+} -+ -+void register_winch(int fd, void *device_data) -+{ -+ int pid, thread, thread_fd; -+ char c = 1; -+ -+ if(!isatty(fd)) return; -+ -+ pid = tcgetpgrp(fd); -+ if(!CHOOSE_MODE_PROC(is_tracer_winch, is_skas_winch, pid, fd, -+ device_data) && (pid == -1)){ -+ thread = winch_tramp(fd, device_data, &thread_fd); -+ if(fd != -1){ -+ register_winch_irq(thread_fd, fd, thread, device_data); -+ -+ if(write(thread_fd, &c, sizeof(c)) != sizeof(c)) -+ printk("register_winch : failed to write " -+ "synchronization byte\n"); -+ } -+ } -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/cow.h um/arch/um/drivers/cow.h ---- orig/arch/um/drivers/cow.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/cow.h 2003-06-05 14:28:44.000000000 -0400 -@@ -0,0 +1,34 @@ -+#ifndef __COW_H__ -+#define __COW_H__ -+ -+#include <asm/types.h> -+ -+#if __BYTE_ORDER == __BIG_ENDIAN -+# define ntohll(x) (x) -+# define htonll(x) (x) -+#elif __BYTE_ORDER == __LITTLE_ENDIAN -+# define ntohll(x) bswap_64(x) -+# define htonll(x) bswap_64(x) -+#else -+#error "__BYTE_ORDER not defined" -+#endif -+ -+extern int init_cow_file(int fd, char *cow_file, char *backing_file, -+ int sectorsize, int *bitmap_offset_out, -+ unsigned long *bitmap_len_out, int *data_offset_out); -+extern int read_cow_header(int fd, __u32 *magic_out, char **backing_file_out, -+ time_t *mtime_out, __u64 *size_out, -+ int *sectorsize_out, int *bitmap_offset_out); -+extern int write_cow_header(char *cow_file, int fd, char *backing_file, -+ int sectorsize, long long *size); -+extern void cow_sizes(__u64 size, int sectorsize, int bitmap_offset, -+ unsigned long *bitmap_len_out, int *data_offset_out); -+ -+#endif -+ -+/* -+ * --------------------------------------------------------------------------- -+ * Local variables: -+ * c-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/cow_sys.h um/arch/um/drivers/cow_sys.h ---- orig/arch/um/drivers/cow_sys.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/cow_sys.h 2003-06-05 14:29:25.000000000 -0400 -@@ -0,0 +1,48 @@ -+#ifndef __COW_SYS_H__ -+#define __COW_SYS_H__ -+ -+#include "kern_util.h" -+#include "user_util.h" -+#include "os.h" -+#include "user.h" -+ -+static inline void *cow_malloc(int size) -+{ -+ return(um_kmalloc(size)); -+} -+ -+static inline void cow_free(void *ptr) -+{ -+ kfree(ptr); -+} -+ -+#define cow_printf printk -+ -+static inline char *cow_strdup(char *str) -+{ -+ return(uml_strdup(str)); -+} -+ -+static inline int cow_seek_file(int fd, __u64 offset) -+{ -+ return(os_seek_file(fd, offset)); -+} -+ -+static inline int cow_file_size(char *file, __u64 *size_out) -+{ -+ return(os_file_size(file, size_out)); -+} -+ -+static inline int cow_write_file(int fd, char *buf, int size) -+{ -+ return(os_write_file(fd, buf, size)); -+} -+ -+#endif -+ -+/* -+ * --------------------------------------------------------------------------- -+ * Local variables: -+ * c-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/cow_user.c um/arch/um/drivers/cow_user.c ---- orig/arch/um/drivers/cow_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/cow_user.c 2003-06-05 14:39:18.000000000 -0400 -@@ -0,0 +1,287 @@ -+#include <stddef.h> -+#include <string.h> -+#include <errno.h> -+#include <unistd.h> -+#include <byteswap.h> -+#include <sys/stat.h> -+#include <sys/time.h> -+#include <sys/param.h> -+#include <netinet/in.h> -+ -+#include "cow.h" -+#include "cow_sys.h" -+ -+#define PATH_LEN_V1 256 -+ -+struct cow_header_v1 { -+ int magic; -+ int version; -+ char backing_file[PATH_LEN_V1]; -+ time_t mtime; -+ __u64 size; -+ int sectorsize; -+}; -+ -+#define PATH_LEN_V2 MAXPATHLEN -+ -+struct cow_header_v2 { -+ unsigned long magic; -+ unsigned long version; -+ char backing_file[PATH_LEN_V2]; -+ time_t mtime; -+ __u64 size; -+ int sectorsize; -+}; -+ -+union cow_header { -+ struct cow_header_v1 v1; -+ struct cow_header_v2 v2; -+}; -+ -+#define COW_MAGIC 0x4f4f4f4d /* MOOO */ -+#define COW_VERSION 2 -+ -+void cow_sizes(__u64 size, int sectorsize, int bitmap_offset, -+ unsigned long *bitmap_len_out, int *data_offset_out) -+{ -+ *bitmap_len_out = (size + sectorsize - 1) / (8 * sectorsize); -+ -+ *data_offset_out = bitmap_offset + *bitmap_len_out; -+ *data_offset_out = (*data_offset_out + sectorsize - 1) / sectorsize; -+ *data_offset_out *= sectorsize; -+} -+ -+static int absolutize(char *to, int size, char *from) -+{ -+ char save_cwd[256], *slash; -+ int remaining; -+ -+ if(getcwd(save_cwd, sizeof(save_cwd)) == NULL) { -+ cow_printf("absolutize : unable to get cwd - errno = %d\n", -+ errno); -+ return(-1); -+ } -+ slash = strrchr(from, '/'); -+ if(slash != NULL){ -+ *slash = '\0'; -+ if(chdir(from)){ -+ *slash = '/'; -+ cow_printf("absolutize : Can't cd to '%s' - " -+ "errno = %d\n", from, errno); -+ return(-1); -+ } -+ *slash = '/'; -+ if(getcwd(to, size) == NULL){ -+ cow_printf("absolutize : unable to get cwd of '%s' - " -+ "errno = %d\n", from, errno); -+ return(-1); -+ } -+ remaining = size - strlen(to); -+ if(strlen(slash) + 1 > remaining){ -+ cow_printf("absolutize : unable to fit '%s' into %d " -+ "chars\n", from, size); -+ return(-1); -+ } -+ strcat(to, slash); -+ } -+ else { -+ if(strlen(save_cwd) + 1 + strlen(from) + 1 > size){ -+ cow_printf("absolutize : unable to fit '%s' into %d " -+ "chars\n", from, size); -+ return(-1); -+ } -+ strcpy(to, save_cwd); -+ strcat(to, "/"); -+ strcat(to, from); -+ } -+ chdir(save_cwd); -+ return(0); -+} -+ -+int write_cow_header(char *cow_file, int fd, char *backing_file, -+ int sectorsize, long long *size) -+{ -+ struct cow_header_v2 *header; -+ struct stat64 buf; -+ int err; -+ -+ err = cow_seek_file(fd, 0); -+ if(err != 0){ -+ cow_printf("write_cow_header - lseek failed, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ -+ err = -ENOMEM; -+ header = cow_malloc(sizeof(*header)); -+ if(header == NULL){ -+ cow_printf("Failed to allocate COW V2 header\n"); -+ goto out; -+ } -+ header->magic = htonl(COW_MAGIC); -+ header->version = htonl(COW_VERSION); -+ -+ err = -EINVAL; -+ if(strlen(backing_file) > sizeof(header->backing_file) - 1){ -+ cow_printf("Backing file name \"%s\" is too long - names are " -+ "limited to %d characters\n", backing_file, -+ sizeof(header->backing_file) - 1); -+ goto out_free; -+ } -+ -+ if(absolutize(header->backing_file, sizeof(header->backing_file), -+ backing_file)) -+ goto out_free; -+ -+ err = stat64(header->backing_file, &buf); -+ if(err < 0){ -+ cow_printf("Stat of backing file '%s' failed, errno = %d\n", -+ header->backing_file, errno); -+ err = -errno; -+ goto out_free; -+ } -+ -+ err = cow_file_size(header->backing_file, size); -+ if(err){ -+ cow_printf("Couldn't get size of backing file '%s', " -+ "errno = %d\n", header->backing_file, -*size); -+ goto out_free; -+ } -+ -+ header->mtime = htonl(buf.st_mtime); -+ header->size = htonll(*size); -+ header->sectorsize = htonl(sectorsize); -+ -+ err = write(fd, header, sizeof(*header)); -+ if(err != sizeof(*header)){ -+ cow_printf("Write of header to new COW file '%s' failed, " -+ "errno = %d\n", cow_file, errno); -+ goto out_free; -+ } -+ err = 0; -+ out_free: -+ cow_free(header); -+ out: -+ return(err); -+} -+ -+int read_cow_header(int fd, __u32 *magic_out, char **backing_file_out, -+ time_t *mtime_out, __u64 *size_out, -+ int *sectorsize_out, int *bitmap_offset_out) -+{ -+ union cow_header *header; -+ char *file; -+ int err, n; -+ unsigned long version, magic; -+ -+ header = cow_malloc(sizeof(*header)); -+ if(header == NULL){ -+ cow_printf("read_cow_header - Failed to allocate header\n"); -+ return(-ENOMEM); -+ } -+ err = -EINVAL; -+ n = read(fd, header, sizeof(*header)); -+ if(n < offsetof(typeof(header->v1), backing_file)){ -+ cow_printf("read_cow_header - short header\n"); -+ goto out; -+ } -+ -+ magic = header->v1.magic; -+ if(magic == COW_MAGIC) { -+ version = header->v1.version; -+ } -+ else if(magic == ntohl(COW_MAGIC)){ -+ version = ntohl(header->v1.version); -+ } -+ else goto out; -+ -+ *magic_out = COW_MAGIC; -+ -+ if(version == 1){ -+ if(n < sizeof(header->v1)){ -+ cow_printf("read_cow_header - failed to read V1 " -+ "header\n"); -+ goto out; -+ } -+ *mtime_out = header->v1.mtime; -+ *size_out = header->v1.size; -+ *sectorsize_out = header->v1.sectorsize; -+ *bitmap_offset_out = sizeof(header->v1); -+ file = header->v1.backing_file; -+ } -+ else if(version == 2){ -+ if(n < sizeof(header->v2)){ -+ cow_printf("read_cow_header - failed to read V2 " -+ "header\n"); -+ goto out; -+ } -+ *mtime_out = ntohl(header->v2.mtime); -+ *size_out = ntohll(header->v2.size); -+ *sectorsize_out = ntohl(header->v2.sectorsize); -+ *bitmap_offset_out = sizeof(header->v2); -+ file = header->v2.backing_file; -+ } -+ else { -+ cow_printf("read_cow_header - invalid COW version\n"); -+ goto out; -+ } -+ err = -ENOMEM; -+ *backing_file_out = cow_strdup(file); -+ if(*backing_file_out == NULL){ -+ cow_printf("read_cow_header - failed to allocate backing " -+ "file\n"); -+ goto out; -+ } -+ err = 0; -+ out: -+ cow_free(header); -+ return(err); -+} -+ -+int init_cow_file(int fd, char *cow_file, char *backing_file, int sectorsize, -+ int *bitmap_offset_out, unsigned long *bitmap_len_out, -+ int *data_offset_out) -+{ -+ __u64 size, offset; -+ char zero = 0; -+ int err; -+ -+ err = write_cow_header(cow_file, fd, backing_file, sectorsize, &size); -+ if(err) -+ goto out; -+ -+ cow_sizes(size, sectorsize, sizeof(struct cow_header_v2), -+ bitmap_len_out, data_offset_out); -+ *bitmap_offset_out = sizeof(struct cow_header_v2); -+ -+ offset = *data_offset_out + size - sizeof(zero); -+ err = cow_seek_file(fd, offset); -+ if(err != 0){ -+ cow_printf("cow bitmap lseek failed : errno = %d\n", errno); -+ goto out; -+ } -+ -+ /* does not really matter how much we write it is just to set EOF -+ * this also sets the entire COW bitmap -+ * to zero without having to allocate it -+ */ -+ err = cow_write_file(fd, &zero, sizeof(zero)); -+ if(err != sizeof(zero)){ -+ err = -EINVAL; -+ cow_printf("Write of bitmap to new COW file '%s' failed, " -+ "errno = %d\n", cow_file, errno); -+ goto out; -+ } -+ -+ return(0); -+ -+ out: -+ return(err); -+} -+ -+/* -+ * --------------------------------------------------------------------------- -+ * Local variables: -+ * c-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon.h um/arch/um/drivers/daemon.h ---- orig/arch/um/drivers/daemon.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/daemon.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,35 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "net_user.h" -+ -+#define SWITCH_VERSION 3 -+ -+struct daemon_data { -+ char *sock_type; -+ char *ctl_sock; -+ void *ctl_addr; -+ void *data_addr; -+ void *local_addr; -+ int fd; -+ int control; -+ void *dev; -+}; -+ -+extern struct net_user_info daemon_user_info; -+ -+extern int daemon_user_write(int fd, void *buf, int len, -+ struct daemon_data *pri); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon_kern.c um/arch/um/drivers/daemon_kern.c ---- orig/arch/um/drivers/daemon_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/daemon_kern.c 2002-12-15 21:19:17.000000000 -0500 -@@ -0,0 +1,113 @@ -+/* -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and -+ * James Leu (jleu@mindspring.net). -+ * Copyright (C) 2001 by various other people who didn't put their name here. -+ * Licensed under the GPL. -+ */ -+ -+#include "linux/kernel.h" -+#include "linux/init.h" -+#include "linux/netdevice.h" -+#include "linux/etherdevice.h" -+#include "net_kern.h" -+#include "net_user.h" -+#include "daemon.h" -+ -+struct daemon_init { -+ char *sock_type; -+ char *ctl_sock; -+}; -+ -+void daemon_init(struct net_device *dev, void *data) -+{ -+ struct uml_net_private *pri; -+ struct daemon_data *dpri; -+ struct daemon_init *init = data; -+ -+ init_etherdev(dev, 0); -+ pri = dev->priv; -+ dpri = (struct daemon_data *) pri->user; -+ *dpri = ((struct daemon_data) -+ { .sock_type = init->sock_type, -+ .ctl_sock = init->ctl_sock, -+ .ctl_addr = NULL, -+ .data_addr = NULL, -+ .local_addr = NULL, -+ .fd = -1, -+ .control = -1, -+ .dev = dev }); -+ -+ printk("daemon backend (uml_switch version %d) - %s:%s", -+ SWITCH_VERSION, dpri->sock_type, dpri->ctl_sock); -+ printk("\n"); -+} -+ -+static int daemon_read(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); -+ if(*skb == NULL) return(-ENOMEM); -+ return(net_recvfrom(fd, (*skb)->mac.raw, -+ (*skb)->dev->mtu + ETH_HEADER_OTHER)); -+} -+ -+static int daemon_write(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ return(daemon_user_write(fd, (*skb)->data, (*skb)->len, -+ (struct daemon_data *) &lp->user)); -+} -+ -+static struct net_kern_info daemon_kern_info = { -+ .init = daemon_init, -+ .protocol = eth_protocol, -+ .read = daemon_read, -+ .write = daemon_write, -+}; -+ -+int daemon_setup(char *str, char **mac_out, void *data) -+{ -+ struct daemon_init *init = data; -+ char *remain; -+ -+ *init = ((struct daemon_init) -+ { .sock_type = "unix", -+ .ctl_sock = "/tmp/uml.ctl" }); -+ -+ remain = split_if_spec(str, mac_out, &init->sock_type, &init->ctl_sock, -+ NULL); -+ if(remain != NULL) -+ printk(KERN_WARNING "daemon_setup : Ignoring data socket " -+ "specification\n"); -+ -+ return(1); -+} -+ -+static struct transport daemon_transport = { -+ .list = LIST_HEAD_INIT(daemon_transport.list), -+ .name = "daemon", -+ .setup = daemon_setup, -+ .user = &daemon_user_info, -+ .kern = &daemon_kern_info, -+ .private_size = sizeof(struct daemon_data), -+ .setup_size = sizeof(struct daemon_init), -+}; -+ -+static int register_daemon(void) -+{ -+ register_transport(&daemon_transport); -+ return(1); -+} -+ -+__initcall(register_daemon); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/daemon_user.c um/arch/um/drivers/daemon_user.c ---- orig/arch/um/drivers/daemon_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/daemon_user.c 2003-01-17 13:48:59.000000000 -0500 -@@ -0,0 +1,195 @@ -+/* -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and -+ * James Leu (jleu@mindspring.net). -+ * Copyright (C) 2001 by various other people who didn't put their name here. -+ * Licensed under the GPL. -+ */ -+ -+#include <errno.h> -+#include <unistd.h> -+#include <stdint.h> -+#include <sys/socket.h> -+#include <sys/un.h> -+#include <sys/time.h> -+#include "net_user.h" -+#include "daemon.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "user.h" -+#include "os.h" -+ -+#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) -+ -+enum request_type { REQ_NEW_CONTROL }; -+ -+#define SWITCH_MAGIC 0xfeedface -+ -+struct request_v3 { -+ uint32_t magic; -+ uint32_t version; -+ enum request_type type; -+ struct sockaddr_un sock; -+}; -+ -+static struct sockaddr_un *new_addr(void *name, int len) -+{ -+ struct sockaddr_un *sun; -+ -+ sun = um_kmalloc(sizeof(struct sockaddr_un)); -+ if(sun == NULL){ -+ printk("new_addr: allocation of sockaddr_un failed\n"); -+ return(NULL); -+ } -+ sun->sun_family = AF_UNIX; -+ memcpy(sun->sun_path, name, len); -+ return(sun); -+} -+ -+static int connect_to_switch(struct daemon_data *pri) -+{ -+ struct sockaddr_un *ctl_addr = pri->ctl_addr; -+ struct sockaddr_un *local_addr = pri->local_addr; -+ struct sockaddr_un *sun; -+ struct request_v3 req; -+ int fd, n, err; -+ -+ if((pri->control = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){ -+ printk("daemon_open : control socket failed, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ -+ if(connect(pri->control, (struct sockaddr *) ctl_addr, -+ sizeof(*ctl_addr)) < 0){ -+ printk("daemon_open : control connect failed, errno = %d\n", -+ errno); -+ err = -errno; -+ goto out; -+ } -+ -+ if((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0){ -+ printk("daemon_open : data socket failed, errno = %d\n", -+ errno); -+ err = -errno; -+ goto out; -+ } -+ if(bind(fd, (struct sockaddr *) local_addr, sizeof(*local_addr)) < 0){ -+ printk("daemon_open : data bind failed, errno = %d\n", -+ errno); -+ err = -errno; -+ goto out_close; -+ } -+ -+ sun = um_kmalloc(sizeof(struct sockaddr_un)); -+ if(sun == NULL){ -+ printk("new_addr: allocation of sockaddr_un failed\n"); -+ err = -ENOMEM; -+ goto out_close; -+ } -+ -+ req.magic = SWITCH_MAGIC; -+ req.version = SWITCH_VERSION; -+ req.type = REQ_NEW_CONTROL; -+ req.sock = *local_addr; -+ n = write(pri->control, &req, sizeof(req)); -+ if(n != sizeof(req)){ -+ printk("daemon_open : control setup request returned %d, " -+ "errno = %d\n", n, errno); -+ err = -ENOTCONN; -+ goto out; -+ } -+ -+ n = read(pri->control, sun, sizeof(*sun)); -+ if(n != sizeof(*sun)){ -+ printk("daemon_open : read of data socket returned %d, " -+ "errno = %d\n", n, errno); -+ err = -ENOTCONN; -+ goto out_close; -+ } -+ -+ pri->data_addr = sun; -+ return(fd); -+ -+ out_close: -+ close(fd); -+ out: -+ close(pri->control); -+ return(err); -+} -+ -+static void daemon_user_init(void *data, void *dev) -+{ -+ struct daemon_data *pri = data; -+ struct timeval tv; -+ struct { -+ char zero; -+ int pid; -+ int usecs; -+ } name; -+ -+ if(!strcmp(pri->sock_type, "unix")) -+ pri->ctl_addr = new_addr(pri->ctl_sock, -+ strlen(pri->ctl_sock) + 1); -+ name.zero = 0; -+ name.pid = os_getpid(); -+ gettimeofday(&tv, NULL); -+ name.usecs = tv.tv_usec; -+ pri->local_addr = new_addr(&name, sizeof(name)); -+ pri->dev = dev; -+ pri->fd = connect_to_switch(pri); -+ if(pri->fd < 0){ -+ kfree(pri->local_addr); -+ pri->local_addr = NULL; -+ } -+} -+ -+static int daemon_open(void *data) -+{ -+ struct daemon_data *pri = data; -+ return(pri->fd); -+} -+ -+static void daemon_remove(void *data) -+{ -+ struct daemon_data *pri = data; -+ -+ close(pri->fd); -+ close(pri->control); -+ if(pri->data_addr != NULL) kfree(pri->data_addr); -+ if(pri->ctl_addr != NULL) kfree(pri->ctl_addr); -+ if(pri->local_addr != NULL) kfree(pri->local_addr); -+} -+ -+int daemon_user_write(int fd, void *buf, int len, struct daemon_data *pri) -+{ -+ struct sockaddr_un *data_addr = pri->data_addr; -+ -+ return(net_sendto(fd, buf, len, data_addr, sizeof(*data_addr))); -+} -+ -+static int daemon_set_mtu(int mtu, void *data) -+{ -+ return(mtu); -+} -+ -+struct net_user_info daemon_user_info = { -+ .init = daemon_user_init, -+ .open = daemon_open, -+ .close = NULL, -+ .remove = daemon_remove, -+ .set_mtu = daemon_set_mtu, -+ .add_address = NULL, -+ .delete_address = NULL, -+ .max_packet = MAX_PACKET - ETH_HEADER_OTHER -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/fd.c um/arch/um/drivers/fd.c ---- orig/arch/um/drivers/fd.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/fd.c 2002-12-15 20:57:25.000000000 -0500 -@@ -0,0 +1,96 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <termios.h> -+#include "user.h" -+#include "user_util.h" -+#include "chan_user.h" -+ -+struct fd_chan { -+ int fd; -+ int raw; -+ struct termios tt; -+ char str[sizeof("1234567890\0")]; -+}; -+ -+void *fd_init(char *str, int device, struct chan_opts *opts) -+{ -+ struct fd_chan *data; -+ char *end; -+ int n; -+ -+ if(*str != ':'){ -+ printk("fd_init : channel type 'fd' must specify a file " -+ "descriptor\n"); -+ return(NULL); -+ } -+ str++; -+ n = strtoul(str, &end, 0); -+ if((*end != '\0') || (end == str)){ -+ printk("fd_init : couldn't parse file descriptor '%s'\n", str); -+ return(NULL); -+ } -+ if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL); -+ *data = ((struct fd_chan) { .fd = n, -+ .raw = opts->raw }); -+ return(data); -+} -+ -+int fd_open(int input, int output, int primary, void *d, char **dev_out) -+{ -+ struct fd_chan *data = d; -+ -+ if(data->raw && isatty(data->fd)){ -+ tcgetattr(data->fd, &data->tt); -+ raw(data->fd, 0); -+ } -+ sprintf(data->str, "%d", data->fd); -+ *dev_out = data->str; -+ return(data->fd); -+} -+ -+void fd_close(int fd, void *d) -+{ -+ struct fd_chan *data = d; -+ -+ if(data->raw && isatty(fd)){ -+ tcsetattr(fd, TCSAFLUSH, &data->tt); -+ data->raw = 0; -+ } -+} -+ -+int fd_console_write(int fd, const char *buf, int n, void *d) -+{ -+ struct fd_chan *data = d; -+ -+ return(generic_console_write(fd, buf, n, &data->tt)); -+} -+ -+struct chan_ops fd_ops = { -+ .type = "fd", -+ .init = fd_init, -+ .open = fd_open, -+ .close = fd_close, -+ .read = generic_read, -+ .write = generic_write, -+ .console_write = fd_console_write, -+ .window_size = generic_window_size, -+ .free = generic_free, -+ .winch = 1, -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/harddog_kern.c um/arch/um/drivers/harddog_kern.c ---- orig/arch/um/drivers/harddog_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/harddog_kern.c 2002-12-15 20:57:42.000000000 -0500 -@@ -0,0 +1,194 @@ -+/* UML hardware watchdog, shamelessly stolen from: -+ * -+ * SoftDog 0.05: A Software Watchdog Device -+ * -+ * (c) Copyright 1996 Alan Cox <alan@redhat.com>, All Rights Reserved. -+ * http://www.redhat.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 of the License, or (at your option) any later version. -+ * -+ * Neither Alan Cox nor CymruNet Ltd. admit liability nor provide -+ * warranty for any of this software. This material is provided -+ * "AS-IS" and at no charge. -+ * -+ * (c) Copyright 1995 Alan Cox <alan@lxorguk.ukuu.org.uk> -+ * -+ * Software only watchdog driver. Unlike its big brother the WDT501P -+ * driver this won't always recover a failed machine. -+ * -+ * 03/96: Angelo Haritsis <ah@doc.ic.ac.uk> : -+ * Modularised. -+ * Added soft_margin; use upon insmod to change the timer delay. -+ * NB: uses same minor as wdt (WATCHDOG_MINOR); we could use separate -+ * minors. -+ * -+ * 19980911 Alan Cox -+ * Made SMP safe for 2.3.x -+ * -+ * 20011127 Joel Becker (jlbec@evilplan.org> -+ * Added soft_noboot; Allows testing the softdog trigger without -+ * requiring a recompile. -+ * Added WDIOC_GETTIMEOUT and WDIOC_SETTIMOUT. -+ */ -+ -+#include <linux/module.h> -+#include <linux/config.h> -+#include <linux/types.h> -+#include <linux/kernel.h> -+#include <linux/fs.h> -+#include <linux/mm.h> -+#include <linux/miscdevice.h> -+#include <linux/watchdog.h> -+#include <linux/reboot.h> -+#include <linux/smp_lock.h> -+#include <linux/init.h> -+#include <asm/uaccess.h> -+#include "helper.h" -+#include "mconsole.h" -+ -+MODULE_LICENSE("GPL"); -+ -+/* Locked by the BKL in harddog_open and harddog_release */ -+static int timer_alive; -+static int harddog_in_fd = -1; -+static int harddog_out_fd = -1; -+ -+/* -+ * Allow only one person to hold it open -+ */ -+ -+extern int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock); -+ -+static int harddog_open(struct inode *inode, struct file *file) -+{ -+ int err; -+ char *sock = NULL; -+ -+ lock_kernel(); -+ if(timer_alive) -+ return -EBUSY; -+#ifdef CONFIG_HARDDOG_NOWAYOUT -+ MOD_INC_USE_COUNT; -+#endif -+ -+#ifdef CONFIG_MCONSOLE -+ sock = mconsole_notify_socket(); -+#endif -+ err = start_watchdog(&harddog_in_fd, &harddog_out_fd, sock); -+ if(err) return(err); -+ -+ timer_alive = 1; -+ unlock_kernel(); -+ return 0; -+} -+ -+extern void stop_watchdog(int in_fd, int out_fd); -+ -+static int harddog_release(struct inode *inode, struct file *file) -+{ -+ /* -+ * Shut off the timer. -+ */ -+ lock_kernel(); -+ -+ stop_watchdog(harddog_in_fd, harddog_out_fd); -+ harddog_in_fd = -1; -+ harddog_out_fd = -1; -+ -+ timer_alive=0; -+ unlock_kernel(); -+ return 0; -+} -+ -+extern int ping_watchdog(int fd); -+ -+static ssize_t harddog_write(struct file *file, const char *data, size_t len, -+ loff_t *ppos) -+{ -+ /* Can't seek (pwrite) on this device */ -+ if (ppos != &file->f_pos) -+ return -ESPIPE; -+ -+ /* -+ * Refresh the timer. -+ */ -+ if(len) -+ return(ping_watchdog(harddog_out_fd)); -+ return 0; -+} -+ -+static int harddog_ioctl(struct inode *inode, struct file *file, -+ unsigned int cmd, unsigned long arg) -+{ -+ static struct watchdog_info ident = { -+ WDIOF_SETTIMEOUT, -+ 0, -+ "UML Hardware Watchdog" -+ }; -+ switch (cmd) { -+ default: -+ return -ENOTTY; -+ case WDIOC_GETSUPPORT: -+ if(copy_to_user((struct harddog_info *)arg, &ident, -+ sizeof(ident))) -+ return -EFAULT; -+ return 0; -+ case WDIOC_GETSTATUS: -+ case WDIOC_GETBOOTSTATUS: -+ return put_user(0,(int *)arg); -+ case WDIOC_KEEPALIVE: -+ return(ping_watchdog(harddog_out_fd)); -+ } -+} -+ -+static struct file_operations harddog_fops = { -+ .owner = THIS_MODULE, -+ .write = harddog_write, -+ .ioctl = harddog_ioctl, -+ .open = harddog_open, -+ .release = harddog_release, -+}; -+ -+static struct miscdevice harddog_miscdev = { -+ .minor = WATCHDOG_MINOR, -+ .name = "watchdog", -+ .fops = &harddog_fops, -+}; -+ -+static char banner[] __initdata = KERN_INFO "UML Watchdog Timer\n"; -+ -+static int __init harddog_init(void) -+{ -+ int ret; -+ -+ ret = misc_register(&harddog_miscdev); -+ -+ if (ret) -+ return ret; -+ -+ printk(banner); -+ -+ return(0); -+} -+ -+static void __exit harddog_exit(void) -+{ -+ misc_deregister(&harddog_miscdev); -+} -+ -+module_init(harddog_init); -+module_exit(harddog_exit); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/harddog_user.c um/arch/um/drivers/harddog_user.c ---- orig/arch/um/drivers/harddog_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/harddog_user.c 2002-12-04 16:38:05.000000000 -0500 -@@ -0,0 +1,137 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <errno.h> -+#include "user_util.h" -+#include "user.h" -+#include "helper.h" -+#include "mconsole.h" -+#include "os.h" -+#include "choose-mode.h" -+#include "mode.h" -+ -+struct dog_data { -+ int stdin; -+ int stdout; -+ int close_me[2]; -+}; -+ -+static void pre_exec(void *d) -+{ -+ struct dog_data *data = d; -+ -+ dup2(data->stdin, 0); -+ dup2(data->stdout, 1); -+ dup2(data->stdout, 2); -+ close(data->stdin); -+ close(data->stdout); -+ close(data->close_me[0]); -+ close(data->close_me[1]); -+} -+ -+int start_watchdog(int *in_fd_ret, int *out_fd_ret, char *sock) -+{ -+ struct dog_data data; -+ int in_fds[2], out_fds[2], pid, n, err; -+ char pid_buf[sizeof("nnnnn\0")], c; -+ char *pid_args[] = { "/usr/bin/uml_watchdog", "-pid", pid_buf, NULL }; -+ char *mconsole_args[] = { "/usr/bin/uml_watchdog", "-mconsole", NULL, -+ NULL }; -+ char **args = NULL; -+ -+ err = os_pipe(in_fds, 1, 0); -+ if(err){ -+ printk("harddog_open - os_pipe failed, errno = %d\n", -err); -+ return(err); -+ } -+ -+ err = os_pipe(out_fds, 1, 0); -+ if(err){ -+ printk("harddog_open - os_pipe failed, errno = %d\n", -err); -+ return(err); -+ } -+ -+ data.stdin = out_fds[0]; -+ data.stdout = in_fds[1]; -+ data.close_me[0] = out_fds[1]; -+ data.close_me[1] = in_fds[0]; -+ -+ if(sock != NULL){ -+ mconsole_args[2] = sock; -+ args = mconsole_args; -+ } -+ else { -+ /* XXX The os_getpid() is not SMP correct */ -+ sprintf(pid_buf, "%d", CHOOSE_MODE(tracing_pid, os_getpid())); -+ args = pid_args; -+ } -+ -+ pid = run_helper(pre_exec, &data, args, NULL); -+ -+ close(out_fds[0]); -+ close(in_fds[1]); -+ -+ if(pid < 0){ -+ err = -pid; -+ printk("harddog_open - run_helper failed, errno = %d\n", err); -+ goto out; -+ } -+ -+ n = read(in_fds[0], &c, sizeof(c)); -+ if(n == 0){ -+ printk("harddog_open - EOF on watchdog pipe\n"); -+ helper_wait(pid); -+ err = -EIO; -+ goto out; -+ } -+ else if(n < 0){ -+ printk("harddog_open - read of watchdog pipe failed, " -+ "errno = %d\n", errno); -+ helper_wait(pid); -+ err = -errno; -+ goto out; -+ } -+ *in_fd_ret = in_fds[0]; -+ *out_fd_ret = out_fds[1]; -+ return(0); -+ out: -+ close(out_fds[1]); -+ close(in_fds[0]); -+ return(err); -+} -+ -+void stop_watchdog(int in_fd, int out_fd) -+{ -+ close(in_fd); -+ close(out_fd); -+} -+ -+int ping_watchdog(int fd) -+{ -+ int n; -+ char c = '\n'; -+ -+ n = write(fd, &c, sizeof(c)); -+ if(n < sizeof(c)){ -+ printk("ping_watchdog - write failed, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ return 1; -+ -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/hostaudio_kern.c um/arch/um/drivers/hostaudio_kern.c ---- orig/arch/um/drivers/hostaudio_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/hostaudio_kern.c 2003-03-28 21:57:16.000000000 -0500 -@@ -0,0 +1,330 @@ -+/* -+ * Copyright (C) 2002 Steve Schmidtke -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/module.h" -+#include "linux/version.h" -+#include "linux/init.h" -+#include "linux/slab.h" -+#include "linux/fs.h" -+#include "linux/sound.h" -+#include "linux/soundcard.h" -+#include "asm/uaccess.h" -+#include "kern_util.h" -+#include "init.h" -+#include "hostaudio.h" -+ -+/* Only changed from linux_main at boot time */ -+char *dsp = HOSTAUDIO_DEV_DSP; -+char *mixer = HOSTAUDIO_DEV_MIXER; -+ -+#ifndef MODULE -+static int set_dsp(char *name, int *add) -+{ -+ dsp = name; -+ return(0); -+} -+ -+__uml_setup("dsp=", set_dsp, -+"dsp=<dsp device>\n" -+" This is used to specify the host dsp device to the hostaudio driver.\n" -+" The default is \"" HOSTAUDIO_DEV_DSP "\".\n\n" -+); -+ -+static int set_mixer(char *name, int *add) -+{ -+ mixer = name; -+ return(0); -+} -+ -+__uml_setup("mixer=", set_mixer, -+"mixer=<mixer device>\n" -+" This is used to specify the host mixer device to the hostaudio driver.\n" -+" The default is \"" HOSTAUDIO_DEV_MIXER "\".\n\n" -+); -+#endif -+ -+/* /dev/dsp file operations */ -+ -+static ssize_t hostaudio_read(struct file *file, char *buffer, size_t count, -+ loff_t *ppos) -+{ -+ struct hostaudio_state *state = file->private_data; -+ void *kbuf; -+ int err; -+ -+#ifdef DEBUG -+ printk("hostaudio: read called, count = %d\n", count); -+#endif -+ -+ kbuf = kmalloc(count, GFP_KERNEL); -+ if(kbuf == NULL) -+ return(-ENOMEM); -+ -+ err = hostaudio_read_user(state, kbuf, count, ppos); -+ if(err < 0) -+ goto out; -+ -+ if(copy_to_user(buffer, kbuf, err)) -+ err = -EFAULT; -+ -+ out: -+ kfree(kbuf); -+ return(err); -+} -+ -+static ssize_t hostaudio_write(struct file *file, const char *buffer, -+ size_t count, loff_t *ppos) -+{ -+ struct hostaudio_state *state = file->private_data; -+ void *kbuf; -+ int err; -+ -+#ifdef DEBUG -+ printk("hostaudio: write called, count = %d\n", count); -+#endif -+ -+ kbuf = kmalloc(count, GFP_KERNEL); -+ if(kbuf == NULL) -+ return(-ENOMEM); -+ -+ err = -EFAULT; -+ if(copy_from_user(kbuf, buffer, count)) -+ goto out; -+ -+ err = hostaudio_write_user(state, kbuf, count, ppos); -+ if(err < 0) -+ goto out; -+ -+ out: -+ kfree(kbuf); -+ return(err); -+} -+ -+static unsigned int hostaudio_poll(struct file *file, -+ struct poll_table_struct *wait) -+{ -+ unsigned int mask = 0; -+ -+#ifdef DEBUG -+ printk("hostaudio: poll called (unimplemented)\n"); -+#endif -+ -+ return(mask); -+} -+ -+static int hostaudio_ioctl(struct inode *inode, struct file *file, -+ unsigned int cmd, unsigned long arg) -+{ -+ struct hostaudio_state *state = file->private_data; -+ unsigned long data = 0; -+ int err; -+ -+#ifdef DEBUG -+ printk("hostaudio: ioctl called, cmd = %u\n", cmd); -+#endif -+ switch(cmd){ -+ case SNDCTL_DSP_SPEED: -+ case SNDCTL_DSP_STEREO: -+ case SNDCTL_DSP_GETBLKSIZE: -+ case SNDCTL_DSP_CHANNELS: -+ case SNDCTL_DSP_SUBDIVIDE: -+ case SNDCTL_DSP_SETFRAGMENT: -+ if(get_user(data, (int *) arg)) -+ return(-EFAULT); -+ break; -+ default: -+ break; -+ } -+ -+ err = hostaudio_ioctl_user(state, cmd, (unsigned long) &data); -+ -+ switch(cmd){ -+ case SNDCTL_DSP_SPEED: -+ case SNDCTL_DSP_STEREO: -+ case SNDCTL_DSP_GETBLKSIZE: -+ case SNDCTL_DSP_CHANNELS: -+ case SNDCTL_DSP_SUBDIVIDE: -+ case SNDCTL_DSP_SETFRAGMENT: -+ if(put_user(data, (int *) arg)) -+ return(-EFAULT); -+ break; -+ default: -+ break; -+ } -+ -+ return(err); -+} -+ -+static int hostaudio_open(struct inode *inode, struct file *file) -+{ -+ struct hostaudio_state *state; -+ int r = 0, w = 0; -+ int ret; -+ -+#ifdef DEBUG -+ printk("hostaudio: open called (host: %s)\n", dsp); -+#endif -+ -+ state = kmalloc(sizeof(struct hostaudio_state), GFP_KERNEL); -+ if(state == NULL) return(-ENOMEM); -+ -+ if(file->f_mode & FMODE_READ) r = 1; -+ if(file->f_mode & FMODE_WRITE) w = 1; -+ -+ ret = hostaudio_open_user(state, r, w, dsp); -+ if(ret < 0){ -+ kfree(state); -+ return(ret); -+ } -+ -+ file->private_data = state; -+ return(0); -+} -+ -+static int hostaudio_release(struct inode *inode, struct file *file) -+{ -+ struct hostaudio_state *state = file->private_data; -+ int ret; -+ -+#ifdef DEBUG -+ printk("hostaudio: release called\n"); -+#endif -+ -+ ret = hostaudio_release_user(state); -+ kfree(state); -+ -+ return(ret); -+} -+ -+/* /dev/mixer file operations */ -+ -+static int hostmixer_ioctl_mixdev(struct inode *inode, struct file *file, -+ unsigned int cmd, unsigned long arg) -+{ -+ struct hostmixer_state *state = file->private_data; -+ -+#ifdef DEBUG -+ printk("hostmixer: ioctl called\n"); -+#endif -+ -+ return(hostmixer_ioctl_mixdev_user(state, cmd, arg)); -+} -+ -+static int hostmixer_open_mixdev(struct inode *inode, struct file *file) -+{ -+ struct hostmixer_state *state; -+ int r = 0, w = 0; -+ int ret; -+ -+#ifdef DEBUG -+ printk("hostmixer: open called (host: %s)\n", mixer); -+#endif -+ -+ state = kmalloc(sizeof(struct hostmixer_state), GFP_KERNEL); -+ if(state == NULL) return(-ENOMEM); -+ -+ if(file->f_mode & FMODE_READ) r = 1; -+ if(file->f_mode & FMODE_WRITE) w = 1; -+ -+ ret = hostmixer_open_mixdev_user(state, r, w, mixer); -+ -+ if(ret < 0){ -+ kfree(state); -+ return(ret); -+ } -+ -+ file->private_data = state; -+ return(0); -+} -+ -+static int hostmixer_release(struct inode *inode, struct file *file) -+{ -+ struct hostmixer_state *state = file->private_data; -+ int ret; -+ -+#ifdef DEBUG -+ printk("hostmixer: release called\n"); -+#endif -+ -+ ret = hostmixer_release_mixdev_user(state); -+ kfree(state); -+ -+ return(ret); -+} -+ -+ -+/* kernel module operations */ -+ -+static struct file_operations hostaudio_fops = { -+ .owner = THIS_MODULE, -+ .llseek = no_llseek, -+ .read = hostaudio_read, -+ .write = hostaudio_write, -+ .poll = hostaudio_poll, -+ .ioctl = hostaudio_ioctl, -+ .mmap = NULL, -+ .open = hostaudio_open, -+ .release = hostaudio_release, -+}; -+ -+static struct file_operations hostmixer_fops = { -+ .owner = THIS_MODULE, -+ .llseek = no_llseek, -+ .ioctl = hostmixer_ioctl_mixdev, -+ .open = hostmixer_open_mixdev, -+ .release = hostmixer_release, -+}; -+ -+struct { -+ int dev_audio; -+ int dev_mixer; -+} module_data; -+ -+MODULE_AUTHOR("Steve Schmidtke"); -+MODULE_DESCRIPTION("UML Audio Relay"); -+MODULE_LICENSE("GPL"); -+ -+static int __init hostaudio_init_module(void) -+{ -+ printk(KERN_INFO "UML Audio Relay (host dsp = %s, host mixer = %s)\n", -+ dsp, mixer); -+ -+ module_data.dev_audio = register_sound_dsp(&hostaudio_fops, -1); -+ if(module_data.dev_audio < 0){ -+ printk(KERN_ERR "hostaudio: couldn't register DSP device!\n"); -+ return -ENODEV; -+ } -+ -+ module_data.dev_mixer = register_sound_mixer(&hostmixer_fops, -1); -+ if(module_data.dev_mixer < 0){ -+ printk(KERN_ERR "hostmixer: couldn't register mixer " -+ "device!\n"); -+ unregister_sound_dsp(module_data.dev_audio); -+ return -ENODEV; -+ } -+ -+ return 0; -+} -+ -+static void __exit hostaudio_cleanup_module (void) -+{ -+ unregister_sound_mixer(module_data.dev_mixer); -+ unregister_sound_dsp(module_data.dev_audio); -+} -+ -+module_init(hostaudio_init_module); -+module_exit(hostaudio_cleanup_module); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/hostaudio_user.c um/arch/um/drivers/hostaudio_user.c ---- orig/arch/um/drivers/hostaudio_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/hostaudio_user.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,149 @@ -+/* -+ * Copyright (C) 2002 Steve Schmidtke -+ * Licensed under the GPL -+ */ -+ -+#include <sys/types.h> -+#include <sys/stat.h> -+#include <sys/ioctl.h> -+#include <fcntl.h> -+#include <unistd.h> -+#include <errno.h> -+#include "hostaudio.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "os.h" -+ -+/* /dev/dsp file operations */ -+ -+ssize_t hostaudio_read_user(struct hostaudio_state *state, char *buffer, -+ size_t count, loff_t *ppos) -+{ -+ ssize_t ret; -+ -+#ifdef DEBUG -+ printk("hostaudio: read_user called, count = %d\n", count); -+#endif -+ -+ ret = read(state->fd, buffer, count); -+ -+ if(ret < 0) return(-errno); -+ return(ret); -+} -+ -+ssize_t hostaudio_write_user(struct hostaudio_state *state, const char *buffer, -+ size_t count, loff_t *ppos) -+{ -+ ssize_t ret; -+ -+#ifdef DEBUG -+ printk("hostaudio: write_user called, count = %d\n", count); -+#endif -+ -+ ret = write(state->fd, buffer, count); -+ -+ if(ret < 0) return(-errno); -+ return(ret); -+} -+ -+int hostaudio_ioctl_user(struct hostaudio_state *state, unsigned int cmd, -+ unsigned long arg) -+{ -+ int ret; -+#ifdef DEBUG -+ printk("hostaudio: ioctl_user called, cmd = %u\n", cmd); -+#endif -+ -+ ret = ioctl(state->fd, cmd, arg); -+ -+ if(ret < 0) return(-errno); -+ return(ret); -+} -+ -+int hostaudio_open_user(struct hostaudio_state *state, int r, int w, char *dsp) -+{ -+#ifdef DEBUG -+ printk("hostaudio: open_user called\n"); -+#endif -+ -+ state->fd = os_open_file(dsp, of_set_rw(OPENFLAGS(), r, w), 0); -+ -+ if(state->fd >= 0) return(0); -+ -+ printk("hostaudio_open_user failed to open '%s', errno = %d\n", -+ dsp, errno); -+ -+ return(-errno); -+} -+ -+int hostaudio_release_user(struct hostaudio_state *state) -+{ -+#ifdef DEBUG -+ printk("hostaudio: release called\n"); -+#endif -+ if(state->fd >= 0){ -+ close(state->fd); -+ state->fd=-1; -+ } -+ -+ return(0); -+} -+ -+/* /dev/mixer file operations */ -+ -+int hostmixer_ioctl_mixdev_user(struct hostmixer_state *state, -+ unsigned int cmd, unsigned long arg) -+{ -+ int ret; -+#ifdef DEBUG -+ printk("hostmixer: ioctl_user called cmd = %u\n",cmd); -+#endif -+ -+ ret = ioctl(state->fd, cmd, arg); -+ if(ret < 0) -+ return(-errno); -+ return(ret); -+} -+ -+int hostmixer_open_mixdev_user(struct hostmixer_state *state, int r, int w, -+ char *mixer) -+{ -+#ifdef DEBUG -+ printk("hostmixer: open_user called\n"); -+#endif -+ -+ state->fd = os_open_file(mixer, of_set_rw(OPENFLAGS(), r, w), 0); -+ -+ if(state->fd >= 0) return(0); -+ -+ printk("hostaudio_open_mixdev_user failed to open '%s', errno = %d\n", -+ mixer, errno); -+ -+ return(-errno); -+} -+ -+int hostmixer_release_mixdev_user(struct hostmixer_state *state) -+{ -+#ifdef DEBUG -+ printk("hostmixer: release_user called\n"); -+#endif -+ -+ if(state->fd >= 0){ -+ close(state->fd); -+ state->fd = -1; -+ } -+ -+ return 0; -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/line.c um/arch/um/drivers/line.c ---- orig/arch/um/drivers/line.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/line.c 2003-03-26 15:09:44.000000000 -0500 -@@ -0,0 +1,589 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sched.h" -+#include "linux/slab.h" -+#include "linux/list.h" -+#include "linux/devfs_fs_kernel.h" -+#include "asm/irq.h" -+#include "asm/uaccess.h" -+#include "chan_kern.h" -+#include "irq_user.h" -+#include "line.h" -+#include "kern.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "os.h" -+ -+#define LINE_BUFSIZE 4096 -+ -+void line_interrupt(int irq, void *data, struct pt_regs *unused) -+{ -+ struct line *dev = data; -+ -+ if(dev->count > 0) -+ chan_interrupt(&dev->chan_list, &dev->task, dev->tty, irq, -+ dev); -+} -+ -+void line_timer_cb(void *arg) -+{ -+ struct line *dev = arg; -+ -+ line_interrupt(dev->driver->read_irq, dev, NULL); -+} -+ -+static void buffer_data(struct line *line, const char *buf, int len) -+{ -+ int end; -+ -+ if(line->buffer == NULL){ -+ line->buffer = kmalloc(LINE_BUFSIZE, GFP_ATOMIC); -+ if(line->buffer == NULL){ -+ printk("buffer_data - atomic allocation failed\n"); -+ return; -+ } -+ line->head = line->buffer; -+ line->tail = line->buffer; -+ } -+ end = line->buffer + LINE_BUFSIZE - line->tail; -+ if(len < end){ -+ memcpy(line->tail, buf, len); -+ line->tail += len; -+ } -+ else { -+ memcpy(line->tail, buf, end); -+ buf += end; -+ len -= end; -+ memcpy(line->buffer, buf, len); -+ line->tail = line->buffer + len; -+ } -+} -+ -+static int flush_buffer(struct line *line) -+{ -+ int n, count; -+ -+ if((line->buffer == NULL) || (line->head == line->tail)) return(1); -+ -+ if(line->tail < line->head){ -+ count = line->buffer + LINE_BUFSIZE - line->head; -+ n = write_chan(&line->chan_list, line->head, count, -+ line->driver->write_irq); -+ if(n < 0) return(n); -+ if(n == count) line->head = line->buffer; -+ else { -+ line->head += n; -+ return(0); -+ } -+ } -+ -+ count = line->tail - line->head; -+ n = write_chan(&line->chan_list, line->head, count, -+ line->driver->write_irq); -+ if(n < 0) return(n); -+ -+ line->head += n; -+ return(line->head == line->tail); -+} -+ -+int line_write(struct line *lines, struct tty_struct *tty, int from_user, -+ const char *buf, int len) -+{ -+ struct line *line; -+ char *new; -+ unsigned long flags; -+ int n, err, i; -+ -+ if(tty->stopped) return 0; -+ -+ if(from_user){ -+ new = kmalloc(len, GFP_KERNEL); -+ if(new == NULL) -+ return(0); -+ n = copy_from_user(new, buf, len); -+ if(n == len) -+ return(-EFAULT); -+ buf = new; -+ } -+ -+ i = minor(tty->device) - tty->driver.minor_start; -+ line = &lines[i]; -+ -+ down(&line->sem); -+ if(line->head != line->tail){ -+ local_irq_save(flags); -+ buffer_data(line, buf, len); -+ err = flush_buffer(line); -+ local_irq_restore(flags); -+ if(err <= 0) -+ goto out; -+ } -+ else { -+ n = write_chan(&line->chan_list, buf, len, -+ line->driver->write_irq); -+ if(n < 0){ -+ len = n; -+ goto out; -+ } -+ if(n < len) -+ buffer_data(line, buf + n, len - n); -+ } -+ out: -+ up(&line->sem); -+ -+ if(from_user) -+ kfree(buf); -+ return(len); -+} -+ -+void line_write_interrupt(int irq, void *data, struct pt_regs *unused) -+{ -+ struct line *dev = data; -+ struct tty_struct *tty = dev->tty; -+ int err; -+ -+ err = flush_buffer(dev); -+ if(err == 0) return; -+ else if(err < 0){ -+ dev->head = dev->buffer; -+ dev->tail = dev->buffer; -+ } -+ -+ if(tty == NULL) return; -+ -+ if(test_bit(TTY_DO_WRITE_WAKEUP, &tty->flags) && -+ (tty->ldisc.write_wakeup != NULL)) -+ (tty->ldisc.write_wakeup)(tty); -+ -+ /* BLOCKING mode -+ * In blocking mode, everything sleeps on tty->write_wait. -+ * Sleeping in the console driver would break non-blocking -+ * writes. -+ */ -+ -+ if (waitqueue_active(&tty->write_wait)) -+ wake_up_interruptible(&tty->write_wait); -+ -+} -+ -+int line_write_room(struct tty_struct *tty) -+{ -+ struct line *dev = tty->driver_data; -+ int n; -+ -+ if(dev->buffer == NULL) return(LINE_BUFSIZE - 1); -+ -+ n = dev->head - dev->tail; -+ if(n <= 0) n = LINE_BUFSIZE + n; -+ return(n - 1); -+} -+ -+int line_setup_irq(int fd, int input, int output, void *data) -+{ -+ struct line *line = data; -+ struct line_driver *driver = line->driver; -+ int err = 0, flags = SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM; -+ -+ if(input) err = um_request_irq(driver->read_irq, fd, IRQ_READ, -+ line_interrupt, flags, -+ driver->read_irq_name, line); -+ if(err) return(err); -+ if(output) err = um_request_irq(driver->write_irq, fd, IRQ_WRITE, -+ line_write_interrupt, flags, -+ driver->write_irq_name, line); -+ line->have_irq = 1; -+ return(err); -+} -+ -+void line_disable(struct line *line, int current_irq) -+{ -+ if(!line->have_irq) return; -+ -+ if(line->driver->read_irq == current_irq) -+ free_irq_later(line->driver->read_irq, line); -+ else -+ free_irq(line->driver->read_irq, line); -+ -+ if(line->driver->write_irq == current_irq) -+ free_irq_later(line->driver->write_irq, line); -+ else -+ free_irq(line->driver->write_irq, line); -+ -+ line->have_irq = 0; -+} -+ -+int line_open(struct line *lines, struct tty_struct *tty, -+ struct chan_opts *opts) -+{ -+ struct line *line; -+ int n, err = 0; -+ -+ if(tty == NULL) n = 0; -+ else n = minor(tty->device) - tty->driver.minor_start; -+ line = &lines[n]; -+ -+ down(&line->sem); -+ if(line->count == 0){ -+ if(!line->valid){ -+ err = -ENODEV; -+ goto out; -+ } -+ if(list_empty(&line->chan_list)){ -+ err = parse_chan_pair(line->init_str, &line->chan_list, -+ line->init_pri, n, opts); -+ if(err) goto out; -+ err = open_chan(&line->chan_list); -+ if(err) goto out; -+ } -+ enable_chan(&line->chan_list, line); -+ INIT_TQUEUE(&line->task, line_timer_cb, line); -+ } -+ -+ if(!line->sigio){ -+ chan_enable_winch(&line->chan_list, line); -+ line->sigio = 1; -+ } -+ -+ /* This is outside the if because the initial console is opened -+ * with tty == NULL -+ */ -+ line->tty = tty; -+ -+ if(tty != NULL){ -+ tty->driver_data = line; -+ chan_window_size(&line->chan_list, &tty->winsize.ws_row, -+ &tty->winsize.ws_col); -+ } -+ -+ line->count++; -+ out: -+ up(&line->sem); -+ return(err); -+} -+ -+void line_close(struct line *lines, struct tty_struct *tty) -+{ -+ struct line *line; -+ int n; -+ -+ if(tty == NULL) n = 0; -+ else n = minor(tty->device) - tty->driver.minor_start; -+ line = &lines[n]; -+ -+ down(&line->sem); -+ line->count--; -+ -+ /* I don't like this, but I can't think of anything better. What's -+ * going on is that the tty is in the process of being closed for -+ * the last time. Its count hasn't been dropped yet, so it's still -+ * at 1. This may happen when line->count != 0 because of the initial -+ * console open (without a tty) bumping it up to 1. -+ */ -+ if((line->tty != NULL) && (line->tty->count == 1)) -+ line->tty = NULL; -+ if(line->count == 0) -+ line_disable(line, -1); -+ up(&line->sem); -+} -+ -+void close_lines(struct line *lines, int nlines) -+{ -+ int i; -+ -+ for(i = 0; i < nlines; i++) -+ close_chan(&lines[i].chan_list); -+} -+ -+int line_setup(struct line *lines, int num, char *init, int all_allowed) -+{ -+ int i, n; -+ char *end; -+ -+ if(*init == '=') n = -1; -+ else { -+ n = simple_strtoul(init, &end, 0); -+ if(*end != '='){ -+ printk(KERN_ERR "line_setup failed to parse \"%s\"\n", -+ init); -+ return(1); -+ } -+ init = end; -+ } -+ init++; -+ if((n >= 0) && (n >= num)){ -+ printk("line_setup - %d out of range ((0 ... %d) allowed)\n", -+ n, num); -+ return(1); -+ } -+ else if(n >= 0){ -+ if(lines[n].count > 0){ -+ printk("line_setup - device %d is open\n", n); -+ return(1); -+ } -+ if(lines[n].init_pri <= INIT_ONE){ -+ lines[n].init_pri = INIT_ONE; -+ if(!strcmp(init, "none")) lines[n].valid = 0; -+ else { -+ lines[n].init_str = init; -+ lines[n].valid = 1; -+ } -+ } -+ } -+ else if(!all_allowed){ -+ printk("line_setup - can't configure all devices from " -+ "mconsole\n"); -+ return(1); -+ } -+ else { -+ for(i = 0; i < num; i++){ -+ if(lines[i].init_pri <= INIT_ALL){ -+ lines[i].init_pri = INIT_ALL; -+ if(!strcmp(init, "none")) lines[i].valid = 0; -+ else { -+ lines[i].init_str = init; -+ lines[i].valid = 1; -+ } -+ } -+ } -+ } -+ return(0); -+} -+ -+int line_config(struct line *lines, int num, char *str) -+{ -+ char *new = uml_strdup(str); -+ -+ if(new == NULL){ -+ printk("line_config - uml_strdup failed\n"); -+ return(-ENOMEM); -+ } -+ return(line_setup(lines, num, new, 0)); -+} -+ -+int line_get_config(char *name, struct line *lines, int num, char *str, -+ int size, char **error_out) -+{ -+ struct line *line; -+ char *end; -+ int dev, n = 0; -+ -+ dev = simple_strtoul(name, &end, 0); -+ if((*end != '\0') || (end == name)){ -+ *error_out = "line_get_config failed to parse device number"; -+ return(0); -+ } -+ -+ if((dev < 0) || (dev >= num)){ -+ *error_out = "device number of of range"; -+ return(0); -+ } -+ -+ line = &lines[dev]; -+ -+ down(&line->sem); -+ if(!line->valid) -+ CONFIG_CHUNK(str, size, n, "none", 1); -+ else if(line->count == 0) -+ CONFIG_CHUNK(str, size, n, line->init_str, 1); -+ else n = chan_config_string(&line->chan_list, str, size, error_out); -+ up(&line->sem); -+ -+ return(n); -+} -+ -+int line_remove(struct line *lines, int num, char *str) -+{ -+ char config[sizeof("conxxxx=none\0")]; -+ -+ sprintf(config, "%s=none", str); -+ return(line_setup(lines, num, config, 0)); -+} -+ -+void line_register_devfs(struct lines *set, struct line_driver *line_driver, -+ struct tty_driver *driver, struct line *lines, -+ int nlines) -+{ -+ int err, i, n; -+ char *from, *to; -+ -+ driver->driver_name = line_driver->name; -+ driver->name = line_driver->devfs_name; -+ driver->major = line_driver->major; -+ driver->minor_start = line_driver->minor_start; -+ driver->type = line_driver->type; -+ driver->subtype = line_driver->subtype; -+ driver->magic = TTY_DRIVER_MAGIC; -+ driver->flags = TTY_DRIVER_REAL_RAW; -+ -+ n = set->num; -+ driver->num = n; -+ driver->table = kmalloc(n * sizeof(driver->table[0]), GFP_KERNEL); -+ driver->termios = kmalloc(n * sizeof(driver->termios[0]), GFP_KERNEL); -+ driver->termios_locked = kmalloc(n * sizeof(driver->termios_locked[0]), -+ GFP_KERNEL); -+ if((driver->table == NULL) || (driver->termios == NULL) || -+ (driver->termios_locked == NULL)) -+ panic("Failed to allocate driver table"); -+ -+ memset(driver->table, 0, n * sizeof(driver->table[0])); -+ memset(driver->termios, 0, n * sizeof(driver->termios[0])); -+ memset(driver->termios_locked, 0, -+ n * sizeof(driver->termios_locked[0])); -+ -+ driver->write_room = line_write_room; -+ driver->init_termios = tty_std_termios; -+ -+ if (tty_register_driver(driver)) -+ panic("line_register_devfs : Couldn't register driver\n"); -+ -+ from = line_driver->symlink_from; -+ to = line_driver->symlink_to; -+ err = devfs_mk_symlink(NULL, from, 0, to, NULL, NULL); -+ if(err) printk("Symlink creation from /dev/%s to /dev/%s " -+ "returned %d\n", from, to, err); -+ -+ for(i = 0; i < nlines; i++){ -+ if(!lines[i].valid) -+ tty_unregister_devfs(driver, driver->minor_start + i); -+ } -+ -+ mconsole_register_dev(&line_driver->mc); -+} -+ -+void lines_init(struct line *lines, int nlines) -+{ -+ struct line *line; -+ int i; -+ -+ for(i = 0; i < nlines; i++){ -+ line = &lines[i]; -+ INIT_LIST_HEAD(&line->chan_list); -+ sema_init(&line->sem, 1); -+ if(line->init_str != NULL){ -+ line->init_str = uml_strdup(line->init_str); -+ if(line->init_str == NULL) -+ printk("lines_init - uml_strdup returned " -+ "NULL\n"); -+ } -+ } -+} -+ -+struct winch { -+ struct list_head list; -+ int fd; -+ int tty_fd; -+ int pid; -+ struct line *line; -+}; -+ -+void winch_interrupt(int irq, void *data, struct pt_regs *unused) -+{ -+ struct winch *winch = data; -+ struct tty_struct *tty; -+ int err; -+ char c; -+ -+ if(winch->fd != -1){ -+ err = generic_read(winch->fd, &c, NULL); -+ if(err < 0){ -+ if(err != -EAGAIN){ -+ printk("winch_interrupt : read failed, " -+ "errno = %d\n", -err); -+ printk("fd %d is losing SIGWINCH support\n", -+ winch->tty_fd); -+ return; -+ } -+ goto out; -+ } -+ } -+ tty = winch->line->tty; -+ if(tty != NULL){ -+ chan_window_size(&winch->line->chan_list, -+ &tty->winsize.ws_row, -+ &tty->winsize.ws_col); -+ kill_pg(tty->pgrp, SIGWINCH, 1); -+ } -+ out: -+ if(winch->fd != -1) -+ reactivate_fd(winch->fd, WINCH_IRQ); -+} -+ -+DECLARE_MUTEX(winch_handler_sem); -+LIST_HEAD(winch_handlers); -+ -+void register_winch_irq(int fd, int tty_fd, int pid, void *line) -+{ -+ struct winch *winch; -+ -+ down(&winch_handler_sem); -+ winch = kmalloc(sizeof(*winch), GFP_KERNEL); -+ if(winch == NULL){ -+ printk("register_winch_irq - kmalloc failed\n"); -+ goto out; -+ } -+ *winch = ((struct winch) { .list = LIST_HEAD_INIT(winch->list), -+ .fd = fd, -+ .tty_fd = tty_fd, -+ .pid = pid, -+ .line = line }); -+ list_add(&winch->list, &winch_handlers); -+ if(um_request_irq(WINCH_IRQ, fd, IRQ_READ, winch_interrupt, -+ SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, -+ "winch", winch) < 0) -+ printk("register_winch_irq - failed to register IRQ\n"); -+ out: -+ up(&winch_handler_sem); -+} -+ -+static void winch_cleanup(void) -+{ -+ struct list_head *ele; -+ struct winch *winch; -+ -+ list_for_each(ele, &winch_handlers){ -+ winch = list_entry(ele, struct winch, list); -+ if(winch->fd != -1){ -+ deactivate_fd(winch->fd, WINCH_IRQ); -+ close(winch->fd); -+ } -+ if(winch->pid != -1) -+ os_kill_process(winch->pid, 1); -+ } -+} -+ -+__uml_exitcall(winch_cleanup); -+ -+char *add_xterm_umid(char *base) -+{ -+ char *umid, *title; -+ int len; -+ -+ umid = get_umid(1); -+ if(umid == NULL) return(base); -+ -+ len = strlen(base) + strlen(" ()") + strlen(umid) + 1; -+ title = kmalloc(len, GFP_KERNEL); -+ if(title == NULL){ -+ printk("Failed to allocate buffer for xterm title\n"); -+ return(base); -+ } -+ -+ strncpy(title, base, len); -+ len -= strlen(title); -+ snprintf(&title[strlen(title)], len, " (%s)", umid); -+ return(title); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/Makefile um/arch/um/drivers/Makefile ---- orig/arch/um/drivers/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/Makefile 2003-06-05 13:48:51.000000000 -0400 -@@ -0,0 +1,94 @@ -+# -+# Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET := built-in.o -+ -+CHAN_OBJS := chan_kern.o chan_user.o line.o -+ -+list-multi := slip.o slirp.o daemon.o mcast.o mconsole.o net.o ubd.o \ -+ hostaudio.o pcap.o port.o harddog.o -+ -+slip-objs := slip_kern.o slip_user.o -+slirp-objs := slirp_kern.o slirp_user.o -+daemon-objs := daemon_kern.o daemon_user.o -+mcast-objs := mcast_kern.o mcast_user.o -+pcap-objs := pcap_kern.o pcap_user.o -lpcap -L/usr/lib -+net-objs := net_kern.o net_user.o -+mconsole-objs := mconsole_kern.o mconsole_user.o -+hostaudio-objs := hostaudio_kern.o hostaudio_user.o -+ubd-objs := ubd_kern.o ubd_user.o cow_user.o -+port-objs := port_kern.o port_user.o -+harddog-objs := harddog_kern.o harddog_user.o -+ -+export-objs := mconsole_kern.o -+ -+obj-y = -+obj-$(CONFIG_SSL) += ssl.o -+obj-$(CONFIG_UML_NET_SLIP) += slip.o -+obj-$(CONFIG_UML_NET_SLIRP) += slirp.o -+obj-$(CONFIG_UML_NET_DAEMON) += daemon.o -+obj-$(CONFIG_UML_NET_MCAST) += mcast.o -+obj-$(CONFIG_UML_NET_PCAP) += pcap.o -+obj-$(CONFIG_UML_NET) += net.o -+obj-$(CONFIG_MCONSOLE) += mconsole.o -+obj-$(CONFIG_MMAPPER) += mmapper_kern.o -+obj-$(CONFIG_BLK_DEV_UBD) += ubd.o -+obj-$(CONFIG_HOSTAUDIO) += hostaudio.o -+obj-$(CONFIG_FD_CHAN) += fd.o -+obj-$(CONFIG_NULL_CHAN) += null.o -+obj-$(CONFIG_PORT_CHAN) += port.o -+obj-$(CONFIG_PTY_CHAN) += pty.o -+obj-$(CONFIG_TTY_CHAN) += tty.o -+obj-$(CONFIG_XTERM_CHAN) += xterm.o xterm_kern.o -+obj-$(CONFIG_UML_WATCHDOG) += harddog.o -+ -+CFLAGS_pcap_user.o = -I/usr/include/pcap -+ -+obj-y += stdio_console.o $(CHAN_OBJS) -+ -+USER_SINGLE_OBJS = $(foreach f,$(patsubst %.o,%,$(obj-y) $(obj-m)),$($(f)-objs)) -+ -+USER_OBJS = $(filter %_user.o,$(obj-y) $(obj-m) $(USER_SINGLE_OBJS)) fd.o \ -+ null.o pty.o tty.o xterm.o -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+clean: -+ -+modules: -+ -+fastdep: -+ -+dep: -+ -+archmrproper: -+ -+daemon.o : $(daemon-objs) -+ -+slip.o : $(slip-objs) -+ -+slirp.o : $(slirp-objs) -+ -+mcast.o : $(mcast-objs) -+ -+pcap.o : $(pcap-objs) -+ -+mconsole.o : $(mconsole-objs) -+ -+net.o : $(net-objs) -+ -+hostaudio.o : $(hostaudio-objs) -+ -+ubd.o : $(ubd-objs) -+ -+port.o : $(port-objs) -+ -+harddog.o : $(harddog-objs) -+ -+$(list-multi) : # This doesn't work, but should : '%.o : $(%-objs)' -+ $(LD) $(LD_RFLAG) -r -o $@ $($(patsubst %.o,%,$@)-objs) -diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast.h um/arch/um/drivers/mcast.h ---- orig/arch/um/drivers/mcast.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/mcast.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "net_user.h" -+ -+struct mcast_data { -+ char *addr; -+ unsigned short port; -+ void *mcast_addr; -+ int ttl; -+ void *dev; -+}; -+ -+extern struct net_user_info mcast_user_info; -+ -+extern int mcast_user_write(int fd, void *buf, int len, -+ struct mcast_data *pri); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast_kern.c um/arch/um/drivers/mcast_kern.c ---- orig/arch/um/drivers/mcast_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/mcast_kern.c 2002-12-15 20:58:55.000000000 -0500 -@@ -0,0 +1,145 @@ -+/* -+ * user-mode-linux networking multicast transport -+ * Copyright (C) 2001 by Harald Welte <laforge@gnumonks.org> -+ * -+ * based on the existing uml-networking code, which is -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and -+ * James Leu (jleu@mindspring.net). -+ * Copyright (C) 2001 by various other people who didn't put their name here. -+ * -+ * Licensed under the GPL. -+ */ -+ -+#include "linux/kernel.h" -+#include "linux/init.h" -+#include "linux/netdevice.h" -+#include "linux/etherdevice.h" -+#include "linux/in.h" -+#include "linux/inet.h" -+#include "net_kern.h" -+#include "net_user.h" -+#include "mcast.h" -+ -+struct mcast_init { -+ char *addr; -+ int port; -+ int ttl; -+}; -+ -+void mcast_init(struct net_device *dev, void *data) -+{ -+ struct uml_net_private *pri; -+ struct mcast_data *dpri; -+ struct mcast_init *init = data; -+ -+ init_etherdev(dev, 0); -+ pri = dev->priv; -+ dpri = (struct mcast_data *) pri->user; -+ *dpri = ((struct mcast_data) -+ { .addr = init->addr, -+ .port = init->port, -+ .ttl = init->ttl, -+ .mcast_addr = NULL, -+ .dev = dev }); -+ printk("mcast backend "); -+ printk("multicast adddress: %s:%u, TTL:%u ", -+ dpri->addr, dpri->port, dpri->ttl); -+ -+ printk("\n"); -+} -+ -+static int mcast_read(int fd, struct sk_buff **skb, struct uml_net_private *lp) -+{ -+ *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); -+ if(*skb == NULL) return(-ENOMEM); -+ return(net_recvfrom(fd, (*skb)->mac.raw, -+ (*skb)->dev->mtu + ETH_HEADER_OTHER)); -+} -+ -+static int mcast_write(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ return mcast_user_write(fd, (*skb)->data, (*skb)->len, -+ (struct mcast_data *) &lp->user); -+} -+ -+static struct net_kern_info mcast_kern_info = { -+ .init = mcast_init, -+ .protocol = eth_protocol, -+ .read = mcast_read, -+ .write = mcast_write, -+}; -+ -+int mcast_setup(char *str, char **mac_out, void *data) -+{ -+ struct mcast_init *init = data; -+ char *port_str = NULL, *ttl_str = NULL, *remain; -+ char *last; -+ int n; -+ -+ *init = ((struct mcast_init) -+ { .addr = "239.192.168.1", -+ .port = 1102, -+ .ttl = 1 }); -+ -+ remain = split_if_spec(str, mac_out, &init->addr, &port_str, &ttl_str, -+ NULL); -+ if(remain != NULL){ -+ printk(KERN_ERR "mcast_setup - Extra garbage on " -+ "specification : '%s'\n", remain); -+ return(0); -+ } -+ -+ if(port_str != NULL){ -+ n = simple_strtoul(port_str, &last, 10); -+ if((*last != '\0') || (last == port_str)){ -+ printk(KERN_ERR "mcast_setup - Bad port : '%s'\n", -+ port_str); -+ return(0); -+ } -+ init->port = htons(n); -+ } -+ -+ if(ttl_str != NULL){ -+ init->ttl = simple_strtoul(ttl_str, &last, 10); -+ if((*last != '\0') || (last == ttl_str)){ -+ printk(KERN_ERR "mcast_setup - Bad ttl : '%s'\n", -+ ttl_str); -+ return(0); -+ } -+ } -+ -+ printk(KERN_INFO "Configured mcast device: %s:%u-%u\n", init->addr, -+ init->port, init->ttl); -+ -+ return(1); -+} -+ -+static struct transport mcast_transport = { -+ .list = LIST_HEAD_INIT(mcast_transport.list), -+ .name = "mcast", -+ .setup = mcast_setup, -+ .user = &mcast_user_info, -+ .kern = &mcast_kern_info, -+ .private_size = sizeof(struct mcast_data), -+ .setup_size = sizeof(struct mcast_init), -+}; -+ -+static int register_mcast(void) -+{ -+ register_transport(&mcast_transport); -+ return(1); -+} -+ -+__initcall(register_mcast); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/mcast_user.c um/arch/um/drivers/mcast_user.c ---- orig/arch/um/drivers/mcast_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/mcast_user.c 2002-12-15 21:19:16.000000000 -0500 -@@ -0,0 +1,175 @@ -+/* -+ * user-mode-linux networking multicast transport -+ * Copyright (C) 2001 by Harald Welte <laforge@gnumonks.org> -+ * -+ * based on the existing uml-networking code, which is -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and -+ * James Leu (jleu@mindspring.net). -+ * Copyright (C) 2001 by various other people who didn't put their name here. -+ * -+ * Licensed under the GPL. -+ * -+ */ -+ -+#include <errno.h> -+#include <unistd.h> -+#include <linux/inet.h> -+#include <sys/socket.h> -+#include <sys/un.h> -+#include <sys/time.h> -+#include <netinet/in.h> -+#include "net_user.h" -+#include "mcast.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "user.h" -+ -+#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) -+ -+static struct sockaddr_in *new_addr(char *addr, unsigned short port) -+{ -+ struct sockaddr_in *sin; -+ -+ sin = um_kmalloc(sizeof(struct sockaddr_in)); -+ if(sin == NULL){ -+ printk("new_addr: allocation of sockaddr_in failed\n"); -+ return(NULL); -+ } -+ sin->sin_family = AF_INET; -+ sin->sin_addr.s_addr = in_aton(addr); -+ sin->sin_port = port; -+ return(sin); -+} -+ -+static void mcast_user_init(void *data, void *dev) -+{ -+ struct mcast_data *pri = data; -+ -+ pri->mcast_addr = new_addr(pri->addr, pri->port); -+ pri->dev = dev; -+} -+ -+static int mcast_open(void *data) -+{ -+ struct mcast_data *pri = data; -+ struct sockaddr_in *sin = pri->mcast_addr; -+ struct ip_mreq mreq; -+ int fd, yes = 1; -+ -+ -+ if ((sin->sin_addr.s_addr == 0) || (sin->sin_port == 0)) { -+ fd = -EINVAL; -+ goto out; -+ } -+ -+ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0){ -+ printk("mcast_open : data socket failed, errno = %d\n", -+ errno); -+ fd = -ENOMEM; -+ goto out; -+ } -+ -+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) { -+ printk("mcast_open: SO_REUSEADDR failed, errno = %d\n", -+ errno); -+ close(fd); -+ fd = -EINVAL; -+ goto out; -+ } -+ -+ /* set ttl according to config */ -+ if (setsockopt(fd, SOL_IP, IP_MULTICAST_TTL, &pri->ttl, -+ sizeof(pri->ttl)) < 0) { -+ printk("mcast_open: IP_MULTICAST_TTL failed, error = %d\n", -+ errno); -+ close(fd); -+ fd = -EINVAL; -+ goto out; -+ } -+ -+ /* set LOOP, so data does get fed back to local sockets */ -+ if (setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP, &yes, sizeof(yes)) < 0) { -+ printk("mcast_open: IP_MULTICAST_LOOP failed, error = %d\n", -+ errno); -+ close(fd); -+ fd = -EINVAL; -+ goto out; -+ } -+ -+ /* bind socket to mcast address */ -+ if (bind(fd, (struct sockaddr *) sin, sizeof(*sin)) < 0) { -+ printk("mcast_open : data bind failed, errno = %d\n", errno); -+ close(fd); -+ fd = -EINVAL; -+ goto out; -+ } -+ -+ /* subscribe to the multicast group */ -+ mreq.imr_multiaddr.s_addr = sin->sin_addr.s_addr; -+ mreq.imr_interface.s_addr = 0; -+ if (setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP, -+ &mreq, sizeof(mreq)) < 0) { -+ printk("mcast_open: IP_ADD_MEMBERSHIP failed, error = %d\n", -+ errno); -+ printk("There appears not to be a multicast-capable network " -+ "interface on the host.\n"); -+ printk("eth0 should be configured in order to use the " -+ "multicast transport.\n"); -+ close(fd); -+ fd = -EINVAL; -+ } -+ -+ out: -+ return(fd); -+} -+ -+static void mcast_close(int fd, void *data) -+{ -+ struct ip_mreq mreq; -+ struct mcast_data *pri = data; -+ struct sockaddr_in *sin = pri->mcast_addr; -+ -+ mreq.imr_multiaddr.s_addr = sin->sin_addr.s_addr; -+ mreq.imr_interface.s_addr = 0; -+ if (setsockopt(fd, SOL_IP, IP_DROP_MEMBERSHIP, -+ &mreq, sizeof(mreq)) < 0) { -+ printk("mcast_open: IP_DROP_MEMBERSHIP failed, error = %d\n", -+ errno); -+ } -+ -+ close(fd); -+} -+ -+int mcast_user_write(int fd, void *buf, int len, struct mcast_data *pri) -+{ -+ struct sockaddr_in *data_addr = pri->mcast_addr; -+ -+ return(net_sendto(fd, buf, len, data_addr, sizeof(*data_addr))); -+} -+ -+static int mcast_set_mtu(int mtu, void *data) -+{ -+ return(mtu); -+} -+ -+struct net_user_info mcast_user_info = { -+ .init = mcast_user_init, -+ .open = mcast_open, -+ .close = mcast_close, -+ .remove = NULL, -+ .set_mtu = mcast_set_mtu, -+ .add_address = NULL, -+ .delete_address = NULL, -+ .max_packet = MAX_PACKET - ETH_HEADER_OTHER -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/mconsole_kern.c um/arch/um/drivers/mconsole_kern.c ---- orig/arch/um/drivers/mconsole_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/mconsole_kern.c 2003-03-28 21:58:11.000000000 -0500 -@@ -0,0 +1,453 @@ -+/* -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/kernel.h" -+#include "linux/slab.h" -+#include "linux/init.h" -+#include "linux/notifier.h" -+#include "linux/reboot.h" -+#include "linux/utsname.h" -+#include "linux/ctype.h" -+#include "linux/interrupt.h" -+#include "linux/sysrq.h" -+#include "linux/tqueue.h" -+#include "linux/module.h" -+#include "linux/proc_fs.h" -+#include "asm/irq.h" -+#include "asm/uaccess.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "mconsole.h" -+#include "mconsole_kern.h" -+#include "irq_user.h" -+#include "init.h" -+#include "os.h" -+#include "umid.h" -+ -+static int do_unlink_socket(struct notifier_block *notifier, -+ unsigned long what, void *data) -+{ -+ return(mconsole_unlink_socket()); -+} -+ -+ -+static struct notifier_block reboot_notifier = { -+ .notifier_call = do_unlink_socket, -+ .priority = 0, -+}; -+ -+/* Safe without explicit locking for now. Tasklets provide their own -+ * locking, and the interrupt handler is safe because it can't interrupt -+ * itself and it can only happen on CPU 0. -+ */ -+ -+LIST_HEAD(mc_requests); -+ -+void mc_task_proc(void *unused) -+{ -+ struct mconsole_entry *req; -+ unsigned long flags; -+ int done; -+ -+ do { -+ save_flags(flags); -+ req = list_entry(mc_requests.next, struct mconsole_entry, -+ list); -+ list_del(&req->list); -+ done = list_empty(&mc_requests); -+ restore_flags(flags); -+ req->request.cmd->handler(&req->request); -+ kfree(req); -+ } while(!done); -+} -+ -+struct tq_struct mconsole_task = { -+ .routine = mc_task_proc, -+ .data = NULL -+}; -+ -+void mconsole_interrupt(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ int fd; -+ struct mconsole_entry *new; -+ struct mc_request req; -+ -+ fd = (int) dev_id; -+ while (mconsole_get_request(fd, &req)){ -+ if(req.cmd->as_interrupt) (*req.cmd->handler)(&req); -+ else { -+ new = kmalloc(sizeof(req), GFP_ATOMIC); -+ if(new == NULL) -+ mconsole_reply(&req, "Out of memory", 1, 0); -+ else { -+ new->request = req; -+ list_add(&new->list, &mc_requests); -+ } -+ } -+ } -+ if(!list_empty(&mc_requests)) schedule_task(&mconsole_task); -+ reactivate_fd(fd, MCONSOLE_IRQ); -+} -+ -+void mconsole_version(struct mc_request *req) -+{ -+ char version[256]; -+ -+ sprintf(version, "%s %s %s %s %s", system_utsname.sysname, -+ system_utsname.nodename, system_utsname.release, -+ system_utsname.version, system_utsname.machine); -+ mconsole_reply(req, version, 0, 0); -+} -+ -+#define UML_MCONSOLE_HELPTEXT \ -+"Commands: \n\ -+ version - Get kernel version \n\ -+ help - Print this message \n\ -+ halt - Halt UML \n\ -+ reboot - Reboot UML \n\ -+ config <dev>=<config> - Add a new device to UML; \n\ -+ same syntax as command line \n\ -+ config <dev> - Query the configuration of a device \n\ -+ remove <dev> - Remove a device from UML \n\ -+ sysrq <letter> - Performs the SysRq action controlled by the letter \n\ -+ cad - invoke the Ctl-Alt-Del handler \n\ -+ stop - pause the UML; it will do nothing until it receives a 'go' \n\ -+ go - continue the UML after a 'stop' \n\ -+" -+ -+void mconsole_help(struct mc_request *req) -+{ -+ mconsole_reply(req, UML_MCONSOLE_HELPTEXT, 0, 0); -+} -+ -+void mconsole_halt(struct mc_request *req) -+{ -+ mconsole_reply(req, "", 0, 0); -+ machine_halt(); -+} -+ -+void mconsole_reboot(struct mc_request *req) -+{ -+ mconsole_reply(req, "", 0, 0); -+ machine_restart(NULL); -+} -+ -+extern void ctrl_alt_del(void); -+ -+void mconsole_cad(struct mc_request *req) -+{ -+ mconsole_reply(req, "", 0, 0); -+ ctrl_alt_del(); -+} -+ -+void mconsole_go(struct mc_request *req) -+{ -+ mconsole_reply(req, "Not stopped", 1, 0); -+} -+ -+void mconsole_stop(struct mc_request *req) -+{ -+ deactivate_fd(req->originating_fd, MCONSOLE_IRQ); -+ os_set_fd_block(req->originating_fd, 1); -+ mconsole_reply(req, "", 0, 0); -+ while(mconsole_get_request(req->originating_fd, req)){ -+ if(req->cmd->handler == mconsole_go) break; -+ (*req->cmd->handler)(req); -+ } -+ os_set_fd_block(req->originating_fd, 0); -+ reactivate_fd(req->originating_fd, MCONSOLE_IRQ); -+ mconsole_reply(req, "", 0, 0); -+} -+ -+/* This list is populated by __initcall routines. */ -+ -+LIST_HEAD(mconsole_devices); -+ -+void mconsole_register_dev(struct mc_device *new) -+{ -+ list_add(&new->list, &mconsole_devices); -+} -+ -+static struct mc_device *mconsole_find_dev(char *name) -+{ -+ struct list_head *ele; -+ struct mc_device *dev; -+ -+ list_for_each(ele, &mconsole_devices){ -+ dev = list_entry(ele, struct mc_device, list); -+ if(!strncmp(name, dev->name, strlen(dev->name))) -+ return(dev); -+ } -+ return(NULL); -+} -+ -+#define CONFIG_BUF_SIZE 64 -+ -+static void mconsole_get_config(int (*get_config)(char *, char *, int, -+ char **), -+ struct mc_request *req, char *name) -+{ -+ char default_buf[CONFIG_BUF_SIZE], *error, *buf; -+ int n, size; -+ -+ if(get_config == NULL){ -+ mconsole_reply(req, "No get_config routine defined", 1, 0); -+ return; -+ } -+ -+ error = NULL; -+ size = sizeof(default_buf)/sizeof(default_buf[0]); -+ buf = default_buf; -+ -+ while(1){ -+ n = (*get_config)(name, buf, size, &error); -+ if(error != NULL){ -+ mconsole_reply(req, error, 1, 0); -+ goto out; -+ } -+ -+ if(n <= size){ -+ mconsole_reply(req, buf, 0, 0); -+ goto out; -+ } -+ -+ if(buf != default_buf) -+ kfree(buf); -+ -+ size = n; -+ buf = kmalloc(size, GFP_KERNEL); -+ if(buf == NULL){ -+ mconsole_reply(req, "Failed to allocate buffer", 1, 0); -+ return; -+ } -+ } -+ out: -+ if(buf != default_buf) -+ kfree(buf); -+ -+} -+ -+void mconsole_config(struct mc_request *req) -+{ -+ struct mc_device *dev; -+ char *ptr = req->request.data, *name; -+ int err; -+ -+ ptr += strlen("config"); -+ while(isspace(*ptr)) ptr++; -+ dev = mconsole_find_dev(ptr); -+ if(dev == NULL){ -+ mconsole_reply(req, "Bad configuration option", 1, 0); -+ return; -+ } -+ -+ name = &ptr[strlen(dev->name)]; -+ ptr = name; -+ while((*ptr != '=') && (*ptr != '\0')) -+ ptr++; -+ -+ if(*ptr == '='){ -+ err = (*dev->config)(name); -+ mconsole_reply(req, "", err, 0); -+ } -+ else mconsole_get_config(dev->get_config, req, name); -+} -+ -+void mconsole_remove(struct mc_request *req) -+{ -+ struct mc_device *dev; -+ char *ptr = req->request.data; -+ int err; -+ -+ ptr += strlen("remove"); -+ while(isspace(*ptr)) ptr++; -+ dev = mconsole_find_dev(ptr); -+ if(dev == NULL){ -+ mconsole_reply(req, "Bad remove option", 1, 0); -+ return; -+ } -+ err = (*dev->remove)(&ptr[strlen(dev->name)]); -+ mconsole_reply(req, "", err, 0); -+} -+ -+#ifdef CONFIG_MAGIC_SYSRQ -+void mconsole_sysrq(struct mc_request *req) -+{ -+ char *ptr = req->request.data; -+ -+ ptr += strlen("sysrq"); -+ while(isspace(*ptr)) ptr++; -+ -+ handle_sysrq(*ptr, ¤t->thread.regs, NULL, NULL); -+ mconsole_reply(req, "", 0, 0); -+} -+#else -+void mconsole_sysrq(struct mc_request *req) -+{ -+ mconsole_reply(req, "Sysrq not compiled in", 1, 0); -+} -+#endif -+ -+/* Changed by mconsole_setup, which is __setup, and called before SMP is -+ * active. -+ */ -+static char *notify_socket = NULL; -+ -+int mconsole_init(void) -+{ -+ int err, sock; -+ char file[256]; -+ -+ if(umid_file_name("mconsole", file, sizeof(file))) return(-1); -+ snprintf(mconsole_socket_name, sizeof(file), "%s", file); -+ -+ sock = create_unix_socket(file, sizeof(file)); -+ if (sock < 0){ -+ printk("Failed to initialize management console\n"); -+ return(1); -+ } -+ -+ register_reboot_notifier(&reboot_notifier); -+ -+ err = um_request_irq(MCONSOLE_IRQ, sock, IRQ_READ, mconsole_interrupt, -+ SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, -+ "mconsole", (void *)sock); -+ if (err){ -+ printk("Failed to get IRQ for management console\n"); -+ return(1); -+ } -+ -+ if(notify_socket != NULL){ -+ notify_socket = uml_strdup(notify_socket); -+ if(notify_socket != NULL) -+ mconsole_notify(notify_socket, MCONSOLE_SOCKET, -+ mconsole_socket_name, -+ strlen(mconsole_socket_name) + 1); -+ else printk(KERN_ERR "mconsole_setup failed to strdup " -+ "string\n"); -+ } -+ -+ printk("mconsole (version %d) initialized on %s\n", -+ MCONSOLE_VERSION, mconsole_socket_name); -+ return(0); -+} -+ -+__initcall(mconsole_init); -+ -+static int write_proc_mconsole(struct file *file, const char *buffer, -+ unsigned long count, void *data) -+{ -+ char *buf; -+ -+ buf = kmalloc(count + 1, GFP_KERNEL); -+ if(buf == NULL) -+ return(-ENOMEM); -+ -+ if(copy_from_user(buf, buffer, count)) -+ return(-EFAULT); -+ buf[count] = '\0'; -+ -+ mconsole_notify(notify_socket, MCONSOLE_USER_NOTIFY, buf, count); -+ return(count); -+} -+ -+static int create_proc_mconsole(void) -+{ -+ struct proc_dir_entry *ent; -+ -+ if(notify_socket == NULL) return(0); -+ -+ ent = create_proc_entry("mconsole", S_IFREG | 0200, NULL); -+ if(ent == NULL){ -+ printk("create_proc_mconsole : create_proc_entry failed\n"); -+ return(0); -+ } -+ -+ ent->read_proc = NULL; -+ ent->write_proc = write_proc_mconsole; -+ return(0); -+} -+ -+static spinlock_t notify_spinlock = SPIN_LOCK_UNLOCKED; -+ -+void lock_notify(void) -+{ -+ spin_lock(¬ify_spinlock); -+} -+ -+void unlock_notify(void) -+{ -+ spin_unlock(¬ify_spinlock); -+} -+ -+__initcall(create_proc_mconsole); -+ -+#define NOTIFY "=notify:" -+ -+static int mconsole_setup(char *str) -+{ -+ if(!strncmp(str, NOTIFY, strlen(NOTIFY))){ -+ str += strlen(NOTIFY); -+ notify_socket = str; -+ } -+ else printk(KERN_ERR "mconsole_setup : Unknown option - '%s'\n", str); -+ return(1); -+} -+ -+__setup("mconsole", mconsole_setup); -+ -+__uml_help(mconsole_setup, -+"mconsole=notify:<socket>\n" -+" Requests that the mconsole driver send a message to the named Unix\n" -+" socket containing the name of the mconsole socket. This also serves\n" -+" to notify outside processes when UML has booted far enough to respond\n" -+" to mconsole requests.\n\n" -+); -+ -+static int notify_panic(struct notifier_block *self, unsigned long unused1, -+ void *ptr) -+{ -+ char *message = ptr; -+ -+ if(notify_socket == NULL) return(0); -+ -+ mconsole_notify(notify_socket, MCONSOLE_PANIC, message, -+ strlen(message) + 1); -+ return(0); -+} -+ -+static struct notifier_block panic_exit_notifier = { -+ .notifier_call = notify_panic, -+ .next = NULL, -+ .priority = 1 -+}; -+ -+static int add_notifier(void) -+{ -+ notifier_chain_register(&panic_notifier_list, &panic_exit_notifier); -+ return(0); -+} -+ -+__initcall(add_notifier); -+ -+char *mconsole_notify_socket(void) -+{ -+ return(notify_socket); -+} -+ -+EXPORT_SYMBOL(mconsole_notify_socket); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/mconsole_user.c um/arch/um/drivers/mconsole_user.c ---- orig/arch/um/drivers/mconsole_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/mconsole_user.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,212 @@ -+/* -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <errno.h> -+#include <signal.h> -+#include <sys/socket.h> -+#include <sys/types.h> -+#include <sys/uio.h> -+#include <sys/un.h> -+#include <unistd.h> -+#include "user.h" -+#include "mconsole.h" -+#include "umid.h" -+ -+static struct mconsole_command commands[] = { -+ { "version", mconsole_version, 1 }, -+ { "halt", mconsole_halt, 0 }, -+ { "reboot", mconsole_reboot, 0 }, -+ { "config", mconsole_config, 0 }, -+ { "remove", mconsole_remove, 0 }, -+ { "sysrq", mconsole_sysrq, 1 }, -+ { "help", mconsole_help, 1 }, -+ { "cad", mconsole_cad, 1 }, -+ { "stop", mconsole_stop, 0 }, -+ { "go", mconsole_go, 1 }, -+}; -+ -+/* Initialized in mconsole_init, which is an initcall */ -+char mconsole_socket_name[256]; -+ -+int mconsole_reply_v0(struct mc_request *req, char *reply) -+{ -+ struct iovec iov; -+ struct msghdr msg; -+ -+ iov.iov_base = reply; -+ iov.iov_len = strlen(reply); -+ -+ msg.msg_name = &(req->origin); -+ msg.msg_namelen = req->originlen; -+ msg.msg_iov = &iov; -+ msg.msg_iovlen = 1; -+ msg.msg_control = NULL; -+ msg.msg_controllen = 0; -+ msg.msg_flags = 0; -+ -+ return sendmsg(req->originating_fd, &msg, 0); -+} -+ -+static struct mconsole_command *mconsole_parse(struct mc_request *req) -+{ -+ struct mconsole_command *cmd; -+ int i; -+ -+ for(i=0;i<sizeof(commands)/sizeof(commands[0]);i++){ -+ cmd = &commands[i]; -+ if(!strncmp(req->request.data, cmd->command, -+ strlen(cmd->command))){ -+ return(cmd); -+ } -+ } -+ return(NULL); -+} -+ -+#define MIN(a,b) ((a)<(b) ? (a):(b)) -+ -+#define STRINGX(x) #x -+#define STRING(x) STRINGX(x) -+ -+int mconsole_get_request(int fd, struct mc_request *req) -+{ -+ int len; -+ -+ req->originlen = sizeof(req->origin); -+ req->len = recvfrom(fd, &req->request, sizeof(req->request), 0, -+ (struct sockaddr *) req->origin, &req->originlen); -+ if (req->len < 0) -+ return 0; -+ -+ req->originating_fd = fd; -+ -+ if(req->request.magic != MCONSOLE_MAGIC){ -+ /* Unversioned request */ -+ len = MIN(sizeof(req->request.data) - 1, -+ strlen((char *) &req->request)); -+ memmove(req->request.data, &req->request, len); -+ req->request.data[len] = '\0'; -+ -+ req->request.magic = MCONSOLE_MAGIC; -+ req->request.version = 0; -+ req->request.len = len; -+ -+ mconsole_reply_v0(req, "ERR Version 0 mconsole clients are " -+ "not supported by this driver"); -+ return(0); -+ } -+ -+ if(req->request.len >= MCONSOLE_MAX_DATA){ -+ mconsole_reply(req, "Request too large", 1, 0); -+ return(0); -+ } -+ if(req->request.version != MCONSOLE_VERSION){ -+ mconsole_reply(req, "This driver only supports version " -+ STRING(MCONSOLE_VERSION) " clients", 1, 0); -+ } -+ -+ req->request.data[req->request.len] = '\0'; -+ req->cmd = mconsole_parse(req); -+ if(req->cmd == NULL){ -+ mconsole_reply(req, "Unknown command", 1, 0); -+ return(0); -+ } -+ -+ return(1); -+} -+ -+int mconsole_reply(struct mc_request *req, char *str, int err, int more) -+{ -+ struct mconsole_reply reply; -+ int total, len, n; -+ -+ total = strlen(str); -+ do { -+ reply.err = err; -+ -+ /* err can only be true on the first packet */ -+ err = 0; -+ -+ len = MIN(total, MCONSOLE_MAX_DATA - 1); -+ -+ if(len == total) reply.more = more; -+ else reply.more = 1; -+ -+ memcpy(reply.data, str, len); -+ reply.data[len] = '\0'; -+ total -= len; -+ reply.len = len + 1; -+ -+ len = sizeof(reply) + reply.len - sizeof(reply.data); -+ -+ n = sendto(req->originating_fd, &reply, len, 0, -+ (struct sockaddr *) req->origin, req->originlen); -+ -+ if(n < 0) return(-errno); -+ } while(total > 0); -+ return(0); -+} -+ -+int mconsole_unlink_socket(void) -+{ -+ unlink(mconsole_socket_name); -+ return 0; -+} -+ -+static int notify_sock = -1; -+ -+int mconsole_notify(char *sock_name, int type, const void *data, int len) -+{ -+ struct sockaddr_un target; -+ struct mconsole_notify packet; -+ int n, err = 0; -+ -+ lock_notify(); -+ if(notify_sock < 0){ -+ notify_sock = socket(PF_UNIX, SOCK_DGRAM, 0); -+ if(notify_sock < 0){ -+ printk("mconsole_notify - socket failed, errno = %d\n", -+ errno); -+ err = -errno; -+ } -+ } -+ unlock_notify(); -+ -+ if(err) -+ return(err); -+ -+ target.sun_family = AF_UNIX; -+ strcpy(target.sun_path, sock_name); -+ -+ packet.magic = MCONSOLE_MAGIC; -+ packet.version = MCONSOLE_VERSION; -+ packet.type = type; -+ len = (len > sizeof(packet.data)) ? sizeof(packet.data) : len; -+ packet.len = len; -+ memcpy(packet.data, data, len); -+ -+ err = 0; -+ len = sizeof(packet) + packet.len - sizeof(packet.data); -+ n = sendto(notify_sock, &packet, len, 0, (struct sockaddr *) &target, -+ sizeof(target)); -+ if(n < 0){ -+ printk("mconsole_notify - sendto failed, errno = %d\n", errno); -+ err = -errno; -+ } -+ return(err); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/mmapper_kern.c um/arch/um/drivers/mmapper_kern.c ---- orig/arch/um/drivers/mmapper_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/mmapper_kern.c 2002-12-15 21:03:08.000000000 -0500 -@@ -0,0 +1,148 @@ -+/* -+ * arch/um/drivers/mmapper_kern.c -+ * -+ * BRIEF MODULE DESCRIPTION -+ * -+ * Copyright (C) 2000 RidgeRun, Inc. -+ * Author: RidgeRun, Inc. -+ * Greg Lonnon glonnon@ridgerun.com or info@ridgerun.com -+ * -+ */ -+#include <linux/kdev_t.h> -+#include <linux/time.h> -+#include <linux/devfs_fs_kernel.h> -+#include <linux/module.h> -+#include <linux/mm.h> -+#include <linux/slab.h> -+#include <linux/init.h> -+#include <asm/uaccess.h> -+#include <asm/irq.h> -+#include <asm/smplock.h> -+#include <asm/pgtable.h> -+#include "mem_user.h" -+#include "user_util.h" -+ -+/* These are set in mmapper_init, which is called at boot time */ -+static unsigned long mmapper_size; -+static unsigned long p_buf = 0; -+static char *v_buf = NULL; -+ -+static ssize_t -+mmapper_read(struct file *file, char *buf, size_t count, loff_t *ppos) -+{ -+ if(*ppos > mmapper_size) -+ return -EINVAL; -+ -+ if(count + *ppos > mmapper_size) -+ count = count + *ppos - mmapper_size; -+ -+ if(count < 0) -+ return -EINVAL; -+ -+ copy_to_user(buf,&v_buf[*ppos],count); -+ -+ return count; -+} -+ -+static ssize_t -+mmapper_write(struct file *file, const char *buf, size_t count, loff_t *ppos) -+{ -+ if(*ppos > mmapper_size) -+ return -EINVAL; -+ -+ if(count + *ppos > mmapper_size) -+ count = count + *ppos - mmapper_size; -+ -+ if(count < 0) -+ return -EINVAL; -+ -+ copy_from_user(&v_buf[*ppos],buf,count); -+ -+ return count; -+} -+ -+static int -+mmapper_ioctl(struct inode *inode, struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ return(-ENOIOCTLCMD); -+} -+ -+static int -+mmapper_mmap(struct file *file, struct vm_area_struct * vma) -+{ -+ int ret = -EINVAL; -+ int size; -+ -+ lock_kernel(); -+ if (vma->vm_pgoff != 0) -+ goto out; -+ -+ size = vma->vm_end - vma->vm_start; -+ if(size > mmapper_size) return(-EFAULT); -+ -+ /* XXX A comment above remap_page_range says it should only be -+ * called when the mm semaphore is held -+ */ -+ if (remap_page_range(vma->vm_start, p_buf, size, vma->vm_page_prot)) -+ goto out; -+ ret = 0; -+out: -+ unlock_kernel(); -+ return ret; -+} -+ -+static int -+mmapper_open(struct inode *inode, struct file *file) -+{ -+ return 0; -+} -+ -+static int -+mmapper_release(struct inode *inode, struct file *file) -+{ -+ return 0; -+} -+ -+static struct file_operations mmapper_fops = { -+ .owner = THIS_MODULE, -+ .read = mmapper_read, -+ .write = mmapper_write, -+ .ioctl = mmapper_ioctl, -+ .mmap = mmapper_mmap, -+ .open = mmapper_open, -+ .release = mmapper_release, -+}; -+ -+static int __init mmapper_init(void) -+{ -+ printk(KERN_INFO "Mapper v0.1\n"); -+ -+ v_buf = (char *) find_iomem("mmapper", &mmapper_size); -+ if(mmapper_size == 0) return(0); -+ -+ p_buf = __pa(v_buf); -+ -+ devfs_register (NULL, "mmapper", DEVFS_FL_DEFAULT, -+ 30, 0, S_IFCHR | S_IRUGO | S_IWUGO, -+ &mmapper_fops, NULL); -+ devfs_mk_symlink(NULL, "mmapper0", DEVFS_FL_DEFAULT, "mmapper", -+ NULL, NULL); -+ return(0); -+} -+ -+static void mmapper_exit(void) -+{ -+} -+ -+module_init(mmapper_init); -+module_exit(mmapper_exit); -+ -+MODULE_AUTHOR("Greg Lonnon <glonnon@ridgerun.com>"); -+MODULE_DESCRIPTION("DSPLinux simulator mmapper driver"); -+/* -+ * --------------------------------------------------------------------------- -+ * Local variables: -+ * c-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/net_kern.c um/arch/um/drivers/net_kern.c ---- orig/arch/um/drivers/net_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/net_kern.c 2002-12-15 21:19:16.000000000 -0500 -@@ -0,0 +1,870 @@ -+/* -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and -+ * James Leu (jleu@mindspring.net). -+ * Copyright (C) 2001 by various other people who didn't put their name here. -+ * Licensed under the GPL. -+ */ -+ -+#include "linux/config.h" -+#include "linux/kernel.h" -+#include "linux/netdevice.h" -+#include "linux/rtnetlink.h" -+#include "linux/skbuff.h" -+#include "linux/socket.h" -+#include "linux/spinlock.h" -+#include "linux/module.h" -+#include "linux/init.h" -+#include "linux/etherdevice.h" -+#include "linux/list.h" -+#include "linux/inetdevice.h" -+#include "linux/ctype.h" -+#include "linux/bootmem.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "net_kern.h" -+#include "net_user.h" -+#include "mconsole_kern.h" -+#include "init.h" -+#include "irq_user.h" -+ -+static spinlock_t opened_lock = SPIN_LOCK_UNLOCKED; -+LIST_HEAD(opened); -+ -+static int uml_net_rx(struct net_device *dev) -+{ -+ struct uml_net_private *lp = dev->priv; -+ int pkt_len; -+ struct sk_buff *skb; -+ -+ /* If we can't allocate memory, try again next round. */ -+ if ((skb = dev_alloc_skb(dev->mtu)) == NULL) { -+ lp->stats.rx_dropped++; -+ return 0; -+ } -+ -+ skb->dev = dev; -+ skb_put(skb, dev->mtu); -+ skb->mac.raw = skb->data; -+ pkt_len = (*lp->read)(lp->fd, &skb, lp); -+ -+ if (pkt_len > 0) { -+ skb_trim(skb, pkt_len); -+ skb->protocol = (*lp->protocol)(skb); -+ netif_rx(skb); -+ -+ lp->stats.rx_bytes += skb->len; -+ lp->stats.rx_packets++; -+ return pkt_len; -+ } -+ -+ kfree_skb(skb); -+ return pkt_len; -+} -+ -+void uml_net_interrupt(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ struct net_device *dev = dev_id; -+ struct uml_net_private *lp = dev->priv; -+ int err; -+ -+ if(!netif_running(dev)) -+ return; -+ -+ spin_lock(&lp->lock); -+ while((err = uml_net_rx(dev)) > 0) ; -+ if(err < 0) { -+ printk(KERN_ERR -+ "Device '%s' read returned %d, shutting it down\n", -+ dev->name, err); -+ dev_close(dev); -+ goto out; -+ } -+ reactivate_fd(lp->fd, UM_ETH_IRQ); -+ -+ out: -+ spin_unlock(&lp->lock); -+} -+ -+static int uml_net_open(struct net_device *dev) -+{ -+ struct uml_net_private *lp = dev->priv; -+ char addr[sizeof("255.255.255.255\0")]; -+ int err; -+ -+ spin_lock(&lp->lock); -+ -+ if(lp->fd >= 0){ -+ err = -ENXIO; -+ goto out; -+ } -+ -+ if(!lp->have_mac){ -+ dev_ip_addr(dev, addr, &lp->mac[2]); -+ set_ether_mac(dev, lp->mac); -+ } -+ -+ lp->fd = (*lp->open)(&lp->user); -+ if(lp->fd < 0){ -+ err = lp->fd; -+ goto out; -+ } -+ -+ err = um_request_irq(dev->irq, lp->fd, IRQ_READ, uml_net_interrupt, -+ SA_INTERRUPT | SA_SHIRQ, dev->name, dev); -+ if(err != 0){ -+ printk(KERN_ERR "uml_net_open: failed to get irq(%d)\n", err); -+ if(lp->close != NULL) (*lp->close)(lp->fd, &lp->user); -+ lp->fd = -1; -+ err = -ENETUNREACH; -+ } -+ -+ lp->tl.data = (unsigned long) &lp->user; -+ netif_start_queue(dev); -+ -+ spin_lock(&opened_lock); -+ list_add(&lp->list, &opened); -+ spin_unlock(&opened_lock); -+ MOD_INC_USE_COUNT; -+ out: -+ spin_unlock(&lp->lock); -+ return(err); -+} -+ -+static int uml_net_close(struct net_device *dev) -+{ -+ struct uml_net_private *lp = dev->priv; -+ -+ netif_stop_queue(dev); -+ spin_lock(&lp->lock); -+ -+ free_irq(dev->irq, dev); -+ if(lp->close != NULL) (*lp->close)(lp->fd, &lp->user); -+ lp->fd = -1; -+ spin_lock(&opened_lock); -+ list_del(&lp->list); -+ spin_unlock(&opened_lock); -+ -+ MOD_DEC_USE_COUNT; -+ spin_unlock(&lp->lock); -+ return 0; -+} -+ -+static int uml_net_start_xmit(struct sk_buff *skb, struct net_device *dev) -+{ -+ struct uml_net_private *lp = dev->priv; -+ unsigned long flags; -+ int len; -+ -+ netif_stop_queue(dev); -+ -+ spin_lock_irqsave(&lp->lock, flags); -+ -+ len = (*lp->write)(lp->fd, &skb, lp); -+ -+ if(len == skb->len) { -+ lp->stats.tx_packets++; -+ lp->stats.tx_bytes += skb->len; -+ dev->trans_start = jiffies; -+ netif_start_queue(dev); -+ -+ /* this is normally done in the interrupt when tx finishes */ -+ netif_wake_queue(dev); -+ } -+ else if(len == 0){ -+ netif_start_queue(dev); -+ lp->stats.tx_dropped++; -+ } -+ else { -+ netif_start_queue(dev); -+ printk(KERN_ERR "uml_net_start_xmit: failed(%d)\n", len); -+ } -+ -+ spin_unlock_irqrestore(&lp->lock, flags); -+ -+ dev_kfree_skb(skb); -+ -+ return 0; -+} -+ -+static struct net_device_stats *uml_net_get_stats(struct net_device *dev) -+{ -+ struct uml_net_private *lp = dev->priv; -+ return &lp->stats; -+} -+ -+static void uml_net_set_multicast_list(struct net_device *dev) -+{ -+ if (dev->flags & IFF_PROMISC) return; -+ else if (dev->mc_count) dev->flags |= IFF_ALLMULTI; -+ else dev->flags &= ~IFF_ALLMULTI; -+} -+ -+static void uml_net_tx_timeout(struct net_device *dev) -+{ -+ dev->trans_start = jiffies; -+ netif_wake_queue(dev); -+} -+ -+static int uml_net_set_mac(struct net_device *dev, void *addr) -+{ -+ struct uml_net_private *lp = dev->priv; -+ struct sockaddr *hwaddr = addr; -+ -+ spin_lock(&lp->lock); -+ memcpy(dev->dev_addr, hwaddr->sa_data, ETH_ALEN); -+ spin_unlock(&lp->lock); -+ -+ return(0); -+} -+ -+static int uml_net_change_mtu(struct net_device *dev, int new_mtu) -+{ -+ struct uml_net_private *lp = dev->priv; -+ int err = 0; -+ -+ spin_lock(&lp->lock); -+ -+ new_mtu = (*lp->set_mtu)(new_mtu, &lp->user); -+ if(new_mtu < 0){ -+ err = new_mtu; -+ goto out; -+ } -+ -+ dev->mtu = new_mtu; -+ -+ out: -+ spin_unlock(&lp->lock); -+ return err; -+} -+ -+static int uml_net_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) -+{ -+ return(-EINVAL); -+} -+ -+void uml_net_user_timer_expire(unsigned long _conn) -+{ -+#ifdef undef -+ struct connection *conn = (struct connection *)_conn; -+ -+ dprintk(KERN_INFO "uml_net_user_timer_expire [%p]\n", conn); -+ do_connect(conn); -+#endif -+} -+ -+/* -+ * default do nothing hard header packet routines for struct net_device init. -+ * real ethernet transports will overwrite with real routines. -+ */ -+static int uml_net_hard_header(struct sk_buff *skb, struct net_device *dev, -+ unsigned short type, void *daddr, void *saddr, unsigned len) -+{ -+ return(0); /* no change */ -+} -+ -+static int uml_net_rebuild_header(struct sk_buff *skb) -+{ -+ return(0); /* ignore */ -+} -+ -+static int uml_net_header_cache(struct neighbour *neigh, struct hh_cache *hh) -+{ -+ return(-1); /* fail */ -+} -+ -+static void uml_net_header_cache_update(struct hh_cache *hh, -+ struct net_device *dev, unsigned char * haddr) -+{ -+ /* ignore */ -+} -+ -+static int uml_net_header_parse(struct sk_buff *skb, unsigned char *haddr) -+{ -+ return(0); /* nothing */ -+} -+ -+static spinlock_t devices_lock = SPIN_LOCK_UNLOCKED; -+static struct list_head devices = LIST_HEAD_INIT(devices); -+ -+static int eth_configure(int n, void *init, char *mac, -+ struct transport *transport) -+{ -+ struct uml_net *device; -+ struct net_device *dev; -+ struct uml_net_private *lp; -+ int save, err, size; -+ -+ size = transport->private_size + sizeof(struct uml_net_private) + -+ sizeof(((struct uml_net_private *) 0)->user); -+ -+ device = kmalloc(sizeof(*device), GFP_KERNEL); -+ if(device == NULL){ -+ printk(KERN_ERR "eth_configure failed to allocate uml_net\n"); -+ return(1); -+ } -+ -+ *device = ((struct uml_net) { .list = LIST_HEAD_INIT(device->list), -+ .dev = NULL, -+ .index = n, -+ .mac = { [ 0 ... 5 ] = 0 }, -+ .have_mac = 0 }); -+ -+ spin_lock(&devices_lock); -+ list_add(&device->list, &devices); -+ spin_unlock(&devices_lock); -+ -+ if(setup_etheraddr(mac, device->mac)) -+ device->have_mac = 1; -+ -+ printk(KERN_INFO "Netdevice %d ", n); -+ if(device->have_mac) printk("(%02x:%02x:%02x:%02x:%02x:%02x) ", -+ device->mac[0], device->mac[1], -+ device->mac[2], device->mac[3], -+ device->mac[4], device->mac[5]); -+ printk(": "); -+ dev = kmalloc(sizeof(*dev) + size, GFP_KERNEL); -+ if(dev == NULL){ -+ printk(KERN_ERR "eth_configure: failed to allocate device\n"); -+ return(1); -+ } -+ memset(dev, 0, sizeof(*dev) + size); -+ -+ snprintf(dev->name, sizeof(dev->name), "eth%d", n); -+ dev->priv = (void *) &dev[1]; -+ device->dev = dev; -+ -+ dev->hard_header = uml_net_hard_header; -+ dev->rebuild_header = uml_net_rebuild_header; -+ dev->hard_header_cache = uml_net_header_cache; -+ dev->header_cache_update= uml_net_header_cache_update; -+ dev->hard_header_parse = uml_net_header_parse; -+ -+ (*transport->kern->init)(dev, init); -+ -+ dev->mtu = transport->user->max_packet; -+ dev->open = uml_net_open; -+ dev->hard_start_xmit = uml_net_start_xmit; -+ dev->stop = uml_net_close; -+ dev->get_stats = uml_net_get_stats; -+ dev->set_multicast_list = uml_net_set_multicast_list; -+ dev->tx_timeout = uml_net_tx_timeout; -+ dev->set_mac_address = uml_net_set_mac; -+ dev->change_mtu = uml_net_change_mtu; -+ dev->do_ioctl = uml_net_ioctl; -+ dev->watchdog_timeo = (HZ >> 1); -+ dev->irq = UM_ETH_IRQ; -+ -+ rtnl_lock(); -+ err = register_netdevice(dev); -+ rtnl_unlock(); -+ if(err) -+ return(1); -+ lp = dev->priv; -+ -+ /* lp.user is the first four bytes of the transport data, which -+ * has already been initialized. This structure assignment will -+ * overwrite that, so we make sure that .user gets overwritten with -+ * what it already has. -+ */ -+ save = lp->user[0]; -+ *lp = ((struct uml_net_private) -+ { .list = LIST_HEAD_INIT(lp->list), -+ .lock = SPIN_LOCK_UNLOCKED, -+ .dev = dev, -+ .fd = -1, -+ .mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0}, -+ .have_mac = device->have_mac, -+ .protocol = transport->kern->protocol, -+ .open = transport->user->open, -+ .close = transport->user->close, -+ .remove = transport->user->remove, -+ .read = transport->kern->read, -+ .write = transport->kern->write, -+ .add_address = transport->user->add_address, -+ .delete_address = transport->user->delete_address, -+ .set_mtu = transport->user->set_mtu, -+ .user = { save } }); -+ init_timer(&lp->tl); -+ lp->tl.function = uml_net_user_timer_expire; -+ memset(&lp->stats, 0, sizeof(lp->stats)); -+ if(lp->have_mac) memcpy(lp->mac, device->mac, sizeof(lp->mac)); -+ -+ if(transport->user->init) -+ (*transport->user->init)(&lp->user, dev); -+ -+ if(device->have_mac) -+ set_ether_mac(dev, device->mac); -+ return(0); -+} -+ -+static struct uml_net *find_device(int n) -+{ -+ struct uml_net *device; -+ struct list_head *ele; -+ -+ spin_lock(&devices_lock); -+ list_for_each(ele, &devices){ -+ device = list_entry(ele, struct uml_net, list); -+ if(device->index == n) -+ goto out; -+ } -+ device = NULL; -+ out: -+ spin_unlock(&devices_lock); -+ return(device); -+} -+ -+static int eth_parse(char *str, int *index_out, char **str_out) -+{ -+ char *end; -+ int n; -+ -+ n = simple_strtoul(str, &end, 0); -+ if(end == str){ -+ printk(KERN_ERR "eth_setup: Failed to parse '%s'\n", str); -+ return(1); -+ } -+ if(n < 0){ -+ printk(KERN_ERR "eth_setup: device %d is negative\n", n); -+ return(1); -+ } -+ str = end; -+ if(*str != '='){ -+ printk(KERN_ERR -+ "eth_setup: expected '=' after device number\n"); -+ return(1); -+ } -+ str++; -+ if(find_device(n)){ -+ printk(KERN_ERR "eth_setup: Device %d already configured\n", -+ n); -+ return(1); -+ } -+ if(index_out) *index_out = n; -+ *str_out = str; -+ return(0); -+} -+ -+struct eth_init { -+ struct list_head list; -+ char *init; -+ int index; -+}; -+ -+/* Filled in at boot time. Will need locking if the transports become -+ * modular. -+ */ -+struct list_head transports = LIST_HEAD_INIT(transports); -+ -+/* Filled in during early boot */ -+struct list_head eth_cmd_line = LIST_HEAD_INIT(eth_cmd_line); -+ -+static int check_transport(struct transport *transport, char *eth, int n, -+ void **init_out, char **mac_out) -+{ -+ int len; -+ -+ len = strlen(transport->name); -+ if(strncmp(eth, transport->name, len)) -+ return(0); -+ -+ eth += len; -+ if(*eth == ',') -+ eth++; -+ else if(*eth != '\0') -+ return(0); -+ -+ *init_out = kmalloc(transport->setup_size, GFP_KERNEL); -+ if(*init_out == NULL) -+ return(1); -+ -+ if(!transport->setup(eth, mac_out, *init_out)){ -+ kfree(*init_out); -+ *init_out = NULL; -+ } -+ return(1); -+} -+ -+void register_transport(struct transport *new) -+{ -+ struct list_head *ele, *next; -+ struct eth_init *eth; -+ void *init; -+ char *mac = NULL; -+ int match; -+ -+ list_add(&new->list, &transports); -+ -+ list_for_each_safe(ele, next, ð_cmd_line){ -+ eth = list_entry(ele, struct eth_init, list); -+ match = check_transport(new, eth->init, eth->index, &init, -+ &mac); -+ if(!match) -+ continue; -+ else if(init != NULL){ -+ eth_configure(eth->index, init, mac, new); -+ kfree(init); -+ } -+ list_del(ð->list); -+ } -+} -+ -+static int eth_setup_common(char *str, int index) -+{ -+ struct list_head *ele; -+ struct transport *transport; -+ void *init; -+ char *mac = NULL; -+ -+ list_for_each(ele, &transports){ -+ transport = list_entry(ele, struct transport, list); -+ if(!check_transport(transport, str, index, &init, &mac)) -+ continue; -+ if(init != NULL){ -+ eth_configure(index, init, mac, transport); -+ kfree(init); -+ } -+ return(1); -+ } -+ return(0); -+} -+ -+static int eth_setup(char *str) -+{ -+ struct eth_init *new; -+ int n, err; -+ -+ err = eth_parse(str, &n, &str); -+ if(err) return(1); -+ -+ new = alloc_bootmem(sizeof(new)); -+ if(new == NULL){ -+ printk("eth_init : alloc_bootmem failed\n"); -+ return(1); -+ } -+ *new = ((struct eth_init) { .list = LIST_HEAD_INIT(new->list), -+ .index = n, -+ .init = str }); -+ list_add_tail(&new->list, ð_cmd_line); -+ return(1); -+} -+ -+__setup("eth", eth_setup); -+__uml_help(eth_setup, -+"eth[0-9]+=<transport>,<options>\n" -+" Configure a network device.\n\n" -+); -+ -+static int eth_init(void) -+{ -+ struct list_head *ele, *next; -+ struct eth_init *eth; -+ -+ list_for_each_safe(ele, next, ð_cmd_line){ -+ eth = list_entry(ele, struct eth_init, list); -+ -+ if(eth_setup_common(eth->init, eth->index)) -+ list_del(ð->list); -+ } -+ -+ return(1); -+} -+ -+__initcall(eth_init); -+ -+static int net_config(char *str) -+{ -+ int n, err; -+ -+ err = eth_parse(str, &n, &str); -+ if(err) return(err); -+ -+ str = uml_strdup(str); -+ if(str == NULL){ -+ printk(KERN_ERR "net_config failed to strdup string\n"); -+ return(-1); -+ } -+ err = !eth_setup_common(str, n); -+ if(err) -+ kfree(str); -+ return(err); -+} -+ -+static int net_remove(char *str) -+{ -+ struct uml_net *device; -+ struct net_device *dev; -+ struct uml_net_private *lp; -+ char *end; -+ int n; -+ -+ n = simple_strtoul(str, &end, 0); -+ if((*end != '\0') || (end == str)) -+ return(-1); -+ -+ device = find_device(n); -+ if(device == NULL) -+ return(0); -+ -+ dev = device->dev; -+ lp = dev->priv; -+ if(lp->fd > 0) return(-1); -+ if(lp->remove != NULL) (*lp->remove)(&lp->user); -+ unregister_netdev(dev); -+ -+ list_del(&device->list); -+ kfree(device); -+ return(0); -+} -+ -+static struct mc_device net_mc = { -+ .name = "eth", -+ .config = net_config, -+ .get_config = NULL, -+ .remove = net_remove, -+}; -+ -+static int uml_inetaddr_event(struct notifier_block *this, unsigned long event, -+ void *ptr) -+{ -+ struct in_ifaddr *ifa = ptr; -+ u32 addr = ifa->ifa_address; -+ u32 netmask = ifa->ifa_mask; -+ struct net_device *dev = ifa->ifa_dev->dev; -+ struct uml_net_private *lp; -+ void (*proc)(unsigned char *, unsigned char *, void *); -+ unsigned char addr_buf[4], netmask_buf[4]; -+ -+ if(dev->open != uml_net_open) return(NOTIFY_DONE); -+ -+ lp = dev->priv; -+ -+ proc = NULL; -+ switch (event){ -+ case NETDEV_UP: -+ proc = lp->add_address; -+ break; -+ case NETDEV_DOWN: -+ proc = lp->delete_address; -+ break; -+ } -+ if(proc != NULL){ -+ addr_buf[0] = addr & 0xff; -+ addr_buf[1] = (addr >> 8) & 0xff; -+ addr_buf[2] = (addr >> 16) & 0xff; -+ addr_buf[3] = addr >> 24; -+ netmask_buf[0] = netmask & 0xff; -+ netmask_buf[1] = (netmask >> 8) & 0xff; -+ netmask_buf[2] = (netmask >> 16) & 0xff; -+ netmask_buf[3] = netmask >> 24; -+ (*proc)(addr_buf, netmask_buf, &lp->user); -+ } -+ return(NOTIFY_DONE); -+} -+ -+struct notifier_block uml_inetaddr_notifier = { -+ .notifier_call = uml_inetaddr_event, -+}; -+ -+static int uml_net_init(void) -+{ -+ struct list_head *ele; -+ struct uml_net_private *lp; -+ struct in_device *ip; -+ struct in_ifaddr *in; -+ -+ mconsole_register_dev(&net_mc); -+ register_inetaddr_notifier(¨_inetaddr_notifier); -+ -+ /* Devices may have been opened already, so the uml_inetaddr_notifier -+ * didn't get a chance to run for them. This fakes it so that -+ * addresses which have already been set up get handled properly. -+ */ -+ list_for_each(ele, &opened){ -+ lp = list_entry(ele, struct uml_net_private, list); -+ ip = lp->dev->ip_ptr; -+ if(ip == NULL) continue; -+ in = ip->ifa_list; -+ while(in != NULL){ -+ uml_inetaddr_event(NULL, NETDEV_UP, in); -+ in = in->ifa_next; -+ } -+ } -+ -+ return(0); -+} -+ -+__initcall(uml_net_init); -+ -+static void close_devices(void) -+{ -+ struct list_head *ele; -+ struct uml_net_private *lp; -+ -+ list_for_each(ele, &opened){ -+ lp = list_entry(ele, struct uml_net_private, list); -+ if(lp->close != NULL) (*lp->close)(lp->fd, &lp->user); -+ if(lp->remove != NULL) (*lp->remove)(&lp->user); -+ } -+} -+ -+__uml_exitcall(close_devices); -+ -+int setup_etheraddr(char *str, unsigned char *addr) -+{ -+ char *end; -+ int i; -+ -+ if(str == NULL) -+ return(0); -+ for(i=0;i<6;i++){ -+ addr[i] = simple_strtoul(str, &end, 16); -+ if((end == str) || -+ ((*end != ':') && (*end != ',') && (*end != '\0'))){ -+ printk(KERN_ERR -+ "setup_etheraddr: failed to parse '%s' " -+ "as an ethernet address\n", str); -+ return(0); -+ } -+ str = end + 1; -+ } -+ if(addr[0] & 1){ -+ printk(KERN_ERR -+ "Attempt to assign a broadcast ethernet address to a " -+ "device disallowed\n"); -+ return(0); -+ } -+ return(1); -+} -+ -+void dev_ip_addr(void *d, char *buf, char *bin_buf) -+{ -+ struct net_device *dev = d; -+ struct in_device *ip = dev->ip_ptr; -+ struct in_ifaddr *in; -+ u32 addr; -+ -+ if((ip == NULL) || ((in = ip->ifa_list) == NULL)){ -+ printk(KERN_WARNING "dev_ip_addr - device not assigned an " -+ "IP address\n"); -+ return; -+ } -+ addr = in->ifa_address; -+ sprintf(buf, "%d.%d.%d.%d", addr & 0xff, (addr >> 8) & 0xff, -+ (addr >> 16) & 0xff, addr >> 24); -+ if(bin_buf){ -+ bin_buf[0] = addr & 0xff; -+ bin_buf[1] = (addr >> 8) & 0xff; -+ bin_buf[2] = (addr >> 16) & 0xff; -+ bin_buf[3] = addr >> 24; -+ } -+} -+ -+void set_ether_mac(void *d, unsigned char *addr) -+{ -+ struct net_device *dev = d; -+ -+ memcpy(dev->dev_addr, addr, ETH_ALEN); -+} -+ -+struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra) -+{ -+ if((skb != NULL) && (skb_tailroom(skb) < extra)){ -+ struct sk_buff *skb2; -+ -+ skb2 = skb_copy_expand(skb, 0, extra, GFP_ATOMIC); -+ dev_kfree_skb(skb); -+ skb = skb2; -+ } -+ if(skb != NULL) skb_put(skb, extra); -+ return(skb); -+} -+ -+void iter_addresses(void *d, void (*cb)(unsigned char *, unsigned char *, -+ void *), -+ void *arg) -+{ -+ struct net_device *dev = d; -+ struct in_device *ip = dev->ip_ptr; -+ struct in_ifaddr *in; -+ unsigned char address[4], netmask[4]; -+ -+ if(ip == NULL) return; -+ in = ip->ifa_list; -+ while(in != NULL){ -+ address[0] = in->ifa_address & 0xff; -+ address[1] = (in->ifa_address >> 8) & 0xff; -+ address[2] = (in->ifa_address >> 16) & 0xff; -+ address[3] = in->ifa_address >> 24; -+ netmask[0] = in->ifa_mask & 0xff; -+ netmask[1] = (in->ifa_mask >> 8) & 0xff; -+ netmask[2] = (in->ifa_mask >> 16) & 0xff; -+ netmask[3] = in->ifa_mask >> 24; -+ (*cb)(address, netmask, arg); -+ in = in->ifa_next; -+ } -+} -+ -+int dev_netmask(void *d, void *m) -+{ -+ struct net_device *dev = d; -+ struct in_device *ip = dev->ip_ptr; -+ struct in_ifaddr *in; -+ __u32 *mask_out = m; -+ -+ if(ip == NULL) -+ return(1); -+ -+ in = ip->ifa_list; -+ if(in == NULL) -+ return(1); -+ -+ *mask_out = in->ifa_mask; -+ return(0); -+} -+ -+void *get_output_buffer(int *len_out) -+{ -+ void *ret; -+ -+ ret = (void *) __get_free_pages(GFP_KERNEL, 0); -+ if(ret) *len_out = PAGE_SIZE; -+ else *len_out = 0; -+ return(ret); -+} -+ -+void free_output_buffer(void *buffer) -+{ -+ free_pages((unsigned long) buffer, 0); -+} -+ -+int tap_setup_common(char *str, char *type, char **dev_name, char **mac_out, -+ char **gate_addr) -+{ -+ char *remain; -+ -+ remain = split_if_spec(str, dev_name, mac_out, gate_addr, NULL); -+ if(remain != NULL){ -+ printk("tap_setup_common - Extra garbage on specification : " -+ "'%s'\n", remain); -+ return(1); -+ } -+ -+ return(0); -+} -+ -+unsigned short eth_protocol(struct sk_buff *skb) -+{ -+ return(eth_type_trans(skb, skb->dev)); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/net_user.c um/arch/um/drivers/net_user.c ---- orig/arch/um/drivers/net_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/net_user.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,254 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stddef.h> -+#include <stdarg.h> -+#include <unistd.h> -+#include <stdio.h> -+#include <errno.h> -+#include <stdlib.h> -+#include <string.h> -+#include <sys/socket.h> -+#include <sys/wait.h> -+#include "user.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "net_user.h" -+#include "helper.h" -+#include "os.h" -+ -+int tap_open_common(void *dev, char *gate_addr) -+{ -+ int tap_addr[4]; -+ -+ if(gate_addr == NULL) return(0); -+ if(sscanf(gate_addr, "%d.%d.%d.%d", &tap_addr[0], -+ &tap_addr[1], &tap_addr[2], &tap_addr[3]) != 4){ -+ printk("Invalid tap IP address - '%s'\n", -+ gate_addr); -+ return(-EINVAL); -+ } -+ return(0); -+} -+ -+void tap_check_ips(char *gate_addr, char *eth_addr) -+{ -+ int tap_addr[4]; -+ -+ if((gate_addr != NULL) && -+ (sscanf(gate_addr, "%d.%d.%d.%d", &tap_addr[0], -+ &tap_addr[1], &tap_addr[2], &tap_addr[3]) == 4) && -+ (eth_addr[0] == tap_addr[0]) && -+ (eth_addr[1] == tap_addr[1]) && -+ (eth_addr[2] == tap_addr[2]) && -+ (eth_addr[3] == tap_addr[3])){ -+ printk("The tap IP address and the UML eth IP address" -+ " must be different\n"); -+ } -+} -+ -+void read_output(int fd, char *output, int len) -+{ -+ int remain, n, actual; -+ char c; -+ -+ if(output == NULL){ -+ output = &c; -+ len = sizeof(c); -+ } -+ -+ *output = '\0'; -+ if(read(fd, &remain, sizeof(remain)) != sizeof(remain)){ -+ printk("read_output - read of length failed, errno = %d\n", -+ errno); -+ return; -+ } -+ -+ while(remain != 0){ -+ n = (remain < len) ? remain : len; -+ actual = read(fd, output, n); -+ if(actual != n){ -+ printk("read_output - read of data failed, " -+ "errno = %d\n", errno); -+ return; -+ } -+ remain -= actual; -+ } -+ return; -+} -+ -+int net_read(int fd, void *buf, int len) -+{ -+ int n; -+ -+ while(((n = read(fd, buf, len)) < 0) && (errno == EINTR)) ; -+ -+ if(n < 0){ -+ if(errno == EAGAIN) return(0); -+ return(-errno); -+ } -+ else if(n == 0) return(-ENOTCONN); -+ return(n); -+} -+ -+int net_recvfrom(int fd, void *buf, int len) -+{ -+ int n; -+ -+ while(((n = recvfrom(fd, buf, len, 0, NULL, NULL)) < 0) && -+ (errno == EINTR)) ; -+ -+ if(n < 0){ -+ if(errno == EAGAIN) return(0); -+ return(-errno); -+ } -+ else if(n == 0) return(-ENOTCONN); -+ return(n); -+} -+ -+int net_write(int fd, void *buf, int len) -+{ -+ int n; -+ -+ while(((n = write(fd, buf, len)) < 0) && (errno == EINTR)) ; -+ if(n < 0){ -+ if(errno == EAGAIN) return(0); -+ return(-errno); -+ } -+ else if(n == 0) return(-ENOTCONN); -+ return(n); -+} -+ -+int net_send(int fd, void *buf, int len) -+{ -+ int n; -+ -+ while(((n = send(fd, buf, len, 0)) < 0) && (errno == EINTR)) ; -+ if(n < 0){ -+ if(errno == EAGAIN) return(0); -+ return(-errno); -+ } -+ else if(n == 0) return(-ENOTCONN); -+ return(n); -+} -+ -+int net_sendto(int fd, void *buf, int len, void *to, int sock_len) -+{ -+ int n; -+ -+ while(((n = sendto(fd, buf, len, 0, (struct sockaddr *) to, -+ sock_len)) < 0) && (errno == EINTR)) ; -+ if(n < 0){ -+ if(errno == EAGAIN) return(0); -+ return(-errno); -+ } -+ else if(n == 0) return(-ENOTCONN); -+ return(n); -+} -+ -+struct change_pre_exec_data { -+ int close_me; -+ int stdout; -+}; -+ -+static void change_pre_exec(void *arg) -+{ -+ struct change_pre_exec_data *data = arg; -+ -+ close(data->close_me); -+ dup2(data->stdout, 1); -+} -+ -+static int change_tramp(char **argv, char *output, int output_len) -+{ -+ int pid, fds[2], err; -+ struct change_pre_exec_data pe_data; -+ -+ err = os_pipe(fds, 1, 0); -+ if(err){ -+ printk("change_tramp - pipe failed, errno = %d\n", -err); -+ return(err); -+ } -+ pe_data.close_me = fds[0]; -+ pe_data.stdout = fds[1]; -+ pid = run_helper(change_pre_exec, &pe_data, argv, NULL); -+ -+ close(fds[1]); -+ read_output(fds[0], output, output_len); -+ waitpid(pid, NULL, 0); -+ return(pid); -+} -+ -+static void change(char *dev, char *what, unsigned char *addr, -+ unsigned char *netmask) -+{ -+ char addr_buf[sizeof("255.255.255.255\0")]; -+ char netmask_buf[sizeof("255.255.255.255\0")]; -+ char version[sizeof("nnnnn\0")]; -+ char *argv[] = { "uml_net", version, what, dev, addr_buf, -+ netmask_buf, NULL }; -+ char *output; -+ int output_len, pid; -+ -+ sprintf(version, "%d", UML_NET_VERSION); -+ sprintf(addr_buf, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); -+ sprintf(netmask_buf, "%d.%d.%d.%d", netmask[0], netmask[1], -+ netmask[2], netmask[3]); -+ -+ output_len = page_size(); -+ output = um_kmalloc(output_len); -+ if(output == NULL) -+ printk("change : failed to allocate output buffer\n"); -+ -+ pid = change_tramp(argv, output, output_len); -+ if(pid < 0) return; -+ -+ if(output != NULL){ -+ printk("%s", output); -+ kfree(output); -+ } -+} -+ -+void open_addr(unsigned char *addr, unsigned char *netmask, void *arg) -+{ -+ change(arg, "add", addr, netmask); -+} -+ -+void close_addr(unsigned char *addr, unsigned char *netmask, void *arg) -+{ -+ change(arg, "del", addr, netmask); -+} -+ -+char *split_if_spec(char *str, ...) -+{ -+ char **arg, *end; -+ va_list ap; -+ -+ va_start(ap, str); -+ while((arg = va_arg(ap, char **)) != NULL){ -+ if(*str == '\0') -+ return(NULL); -+ end = strchr(str, ','); -+ if(end != str) -+ *arg = str; -+ if(end == NULL) -+ return(NULL); -+ *end++ = '\0'; -+ str = end; -+ } -+ va_end(ap); -+ return(str); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/null.c um/arch/um/drivers/null.c ---- orig/arch/um/drivers/null.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/null.c 2002-12-15 21:04:00.000000000 -0500 -@@ -0,0 +1,56 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <errno.h> -+#include <fcntl.h> -+#include "chan_user.h" -+#include "os.h" -+ -+static int null_chan; -+ -+void *null_init(char *str, int device, struct chan_opts *opts) -+{ -+ return(&null_chan); -+} -+ -+int null_open(int input, int output, int primary, void *d, char **dev_out) -+{ -+ *dev_out = NULL; -+ return(os_open_file(DEV_NULL, of_rdwr(OPENFLAGS()), 0)); -+} -+ -+int null_read(int fd, char *c_out, void *unused) -+{ -+ return(-ENODEV); -+} -+ -+void null_free(void *data) -+{ -+} -+ -+struct chan_ops null_ops = { -+ .type = "null", -+ .init = null_init, -+ .open = null_open, -+ .close = generic_close, -+ .read = null_read, -+ .write = generic_write, -+ .console_write = generic_console_write, -+ .window_size = generic_window_size, -+ .free = null_free, -+ .winch = 0, -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_kern.c um/arch/um/drivers/pcap_kern.c ---- orig/arch/um/drivers/pcap_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/pcap_kern.c 2002-12-15 21:19:15.000000000 -0500 -@@ -0,0 +1,127 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike <jdike@karaya.com> -+ * Licensed under the GPL. -+ */ -+ -+#include "linux/init.h" -+#include "linux/netdevice.h" -+#include "linux/etherdevice.h" -+#include "net_kern.h" -+#include "net_user.h" -+#include "pcap_user.h" -+ -+struct pcap_init { -+ char *host_if; -+ int promisc; -+ int optimize; -+ char *filter; -+}; -+ -+void pcap_init(struct net_device *dev, void *data) -+{ -+ struct uml_net_private *pri; -+ struct pcap_data *ppri; -+ struct pcap_init *init = data; -+ -+ init_etherdev(dev, 0); -+ pri = dev->priv; -+ ppri = (struct pcap_data *) pri->user; -+ *ppri = ((struct pcap_data) -+ { .host_if = init->host_if, -+ .promisc = init->promisc, -+ .optimize = init->optimize, -+ .filter = init->filter, -+ .compiled = NULL, -+ .pcap = NULL }); -+} -+ -+static int pcap_read(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); -+ if(*skb == NULL) return(-ENOMEM); -+ return(pcap_user_read(fd, (*skb)->mac.raw, -+ (*skb)->dev->mtu + ETH_HEADER_OTHER, -+ (struct pcap_data *) &lp->user)); -+} -+ -+static int pcap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) -+{ -+ return(-EPERM); -+} -+ -+static struct net_kern_info pcap_kern_info = { -+ .init = pcap_init, -+ .protocol = eth_protocol, -+ .read = pcap_read, -+ .write = pcap_write, -+}; -+ -+int pcap_setup(char *str, char **mac_out, void *data) -+{ -+ struct pcap_init *init = data; -+ char *remain, *host_if = NULL, *options[2] = { NULL, NULL }; -+ int i; -+ -+ *init = ((struct pcap_init) -+ { .host_if = "eth0", -+ .promisc = 1, -+ .optimize = 0, -+ .filter = NULL }); -+ -+ remain = split_if_spec(str, &host_if, &init->filter, -+ &options[0], &options[1], NULL); -+ if(remain != NULL){ -+ printk(KERN_ERR "pcap_setup - Extra garbage on " -+ "specification : '%s'\n", remain); -+ return(0); -+ } -+ -+ if(host_if != NULL) -+ init->host_if = host_if; -+ -+ for(i = 0; i < sizeof(options)/sizeof(options[0]); i++){ -+ if(options[i] == NULL) -+ continue; -+ if(!strcmp(options[i], "promisc")) -+ init->promisc = 1; -+ else if(!strcmp(options[i], "nopromisc")) -+ init->promisc = 0; -+ else if(!strcmp(options[i], "optimize")) -+ init->optimize = 1; -+ else if(!strcmp(options[i], "nooptimize")) -+ init->optimize = 0; -+ else printk("pcap_setup : bad option - '%s'\n", options[i]); -+ } -+ -+ return(1); -+} -+ -+static struct transport pcap_transport = { -+ .list = LIST_HEAD_INIT(pcap_transport.list), -+ .name = "pcap", -+ .setup = pcap_setup, -+ .user = &pcap_user_info, -+ .kern = &pcap_kern_info, -+ .private_size = sizeof(struct pcap_data), -+ .setup_size = sizeof(struct pcap_init), -+}; -+ -+static int register_pcap(void) -+{ -+ register_transport(&pcap_transport); -+ return(1); -+} -+ -+__initcall(register_pcap); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_user.c um/arch/um/drivers/pcap_user.c ---- orig/arch/um/drivers/pcap_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/pcap_user.c 2002-12-15 21:04:39.000000000 -0500 -@@ -0,0 +1,143 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike <jdike@karaya.com> -+ * Licensed under the GPL. -+ */ -+ -+#include <unistd.h> -+#include <stdlib.h> -+#include <string.h> -+#include <errno.h> -+#include <pcap.h> -+#include <asm/types.h> -+#include "net_user.h" -+#include "pcap_user.h" -+#include "user.h" -+ -+#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) -+ -+#define PCAP_FD(p) (*(int *)(p)) -+ -+static void pcap_user_init(void *data, void *dev) -+{ -+ struct pcap_data *pri = data; -+ pcap_t *p; -+ char errors[PCAP_ERRBUF_SIZE]; -+ -+ p = pcap_open_live(pri->host_if, MAX_PACKET, pri->promisc, 0, errors); -+ if(p == NULL){ -+ printk("pcap_user_init : pcap_open_live failed - '%s'\n", -+ errors); -+ return; -+ } -+ -+ pri->dev = dev; -+ pri->pcap = p; -+} -+ -+static int pcap_open(void *data) -+{ -+ struct pcap_data *pri = data; -+ __u32 netmask; -+ int err; -+ -+ if(pri->pcap == NULL) -+ return(-ENODEV); -+ -+ if(pri->filter != NULL){ -+ err = dev_netmask(pri->dev, &netmask); -+ if(err < 0){ -+ printk("pcap_open : dev_netmask failed\n"); -+ return(-EIO); -+ } -+ -+ pri->compiled = um_kmalloc(sizeof(struct bpf_program)); -+ if(pri->compiled == NULL){ -+ printk("pcap_open : kmalloc failed\n"); -+ return(-ENOMEM); -+ } -+ -+ err = pcap_compile(pri->pcap, -+ (struct bpf_program *) pri->compiled, -+ pri->filter, pri->optimize, netmask); -+ if(err < 0){ -+ printk("pcap_open : pcap_compile failed - '%s'\n", -+ pcap_geterr(pri->pcap)); -+ return(-EIO); -+ } -+ -+ err = pcap_setfilter(pri->pcap, pri->compiled); -+ if(err < 0){ -+ printk("pcap_open : pcap_setfilter failed - '%s'\n", -+ pcap_geterr(pri->pcap)); -+ return(-EIO); -+ } -+ } -+ -+ return(PCAP_FD(pri->pcap)); -+} -+ -+static void pcap_remove(void *data) -+{ -+ struct pcap_data *pri = data; -+ -+ if(pri->compiled != NULL) -+ pcap_freecode(pri->compiled); -+ -+ pcap_close(pri->pcap); -+} -+ -+struct pcap_handler_data { -+ char *buffer; -+ int len; -+}; -+ -+static void handler(u_char *data, const struct pcap_pkthdr *header, -+ const u_char *packet) -+{ -+ int len; -+ -+ struct pcap_handler_data *hdata = (struct pcap_handler_data *) data; -+ -+ len = hdata->len < header->caplen ? hdata->len : header->caplen; -+ memcpy(hdata->buffer, packet, len); -+ hdata->len = len; -+} -+ -+int pcap_user_read(int fd, void *buffer, int len, struct pcap_data *pri) -+{ -+ struct pcap_handler_data hdata = ((struct pcap_handler_data) -+ { .buffer = buffer, -+ .len = len }); -+ int n; -+ -+ n = pcap_dispatch(pri->pcap, 1, handler, (u_char *) &hdata); -+ if(n < 0){ -+ printk("pcap_dispatch failed - %s\n", pcap_geterr(pri->pcap)); -+ return(-EIO); -+ } -+ else if(n == 0) -+ return(0); -+ return(hdata.len); -+} -+ -+struct net_user_info pcap_user_info = { -+ .init = pcap_user_init, -+ .open = pcap_open, -+ .close = NULL, -+ .remove = pcap_remove, -+ .set_mtu = NULL, -+ .add_address = NULL, -+ .delete_address = NULL, -+ .max_packet = MAX_PACKET - ETH_HEADER_OTHER -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/pcap_user.h um/arch/um/drivers/pcap_user.h ---- orig/arch/um/drivers/pcap_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/pcap_user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,31 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "net_user.h" -+ -+struct pcap_data { -+ char *host_if; -+ int promisc; -+ int optimize; -+ char *filter; -+ void *compiled; -+ void *pcap; -+ void *dev; -+}; -+ -+extern struct net_user_info pcap_user_info; -+ -+extern int pcap_user_read(int fd, void *buf, int len, struct pcap_data *pri); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/port.h um/arch/um/drivers/port.h ---- orig/arch/um/drivers/port.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/port.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __PORT_H__ -+#define __PORT_H__ -+ -+extern void *port_data(int port); -+extern int port_wait(void *data); -+extern void port_kern_close(void *d); -+extern int port_connection(int fd, int *socket_out, int *pid_out); -+extern int port_listen_fd(int port); -+extern void port_read(int fd, void *data); -+extern void port_kern_free(void *d); -+extern int port_rcv_fd(int fd); -+extern void port_remove_dev(void *d); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/port_kern.c um/arch/um/drivers/port_kern.c ---- orig/arch/um/drivers/port_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/port_kern.c 2002-12-30 20:57:42.000000000 -0500 -@@ -0,0 +1,302 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/list.h" -+#include "linux/sched.h" -+#include "linux/slab.h" -+#include "linux/irq.h" -+#include "linux/spinlock.h" -+#include "linux/errno.h" -+#include "asm/semaphore.h" -+#include "asm/errno.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "irq_user.h" -+#include "port.h" -+#include "init.h" -+#include "os.h" -+ -+struct port_list { -+ struct list_head list; -+ int has_connection; -+ struct semaphore sem; -+ int port; -+ int fd; -+ spinlock_t lock; -+ struct list_head pending; -+ struct list_head connections; -+}; -+ -+struct port_dev { -+ struct port_list *port; -+ int helper_pid; -+ int telnetd_pid; -+}; -+ -+struct connection { -+ struct list_head list; -+ int fd; -+ int helper_pid; -+ int socket[2]; -+ int telnetd_pid; -+ struct port_list *port; -+}; -+ -+static void pipe_interrupt(int irq, void *data, struct pt_regs *regs) -+{ -+ struct connection *conn = data; -+ int fd; -+ -+ fd = os_rcv_fd(conn->socket[0], &conn->helper_pid); -+ if(fd < 0){ -+ if(fd == -EAGAIN) -+ return; -+ -+ printk(KERN_ERR "pipe_interrupt : os_rcv_fd returned %d\n", -+ -fd); -+ os_close_file(conn->fd); -+ } -+ -+ list_del(&conn->list); -+ -+ conn->fd = fd; -+ list_add(&conn->list, &conn->port->connections); -+ -+ up(&conn->port->sem); -+} -+ -+static int port_accept(struct port_list *port) -+{ -+ struct connection *conn; -+ int fd, socket[2], pid, ret = 0; -+ -+ fd = port_connection(port->fd, socket, &pid); -+ if(fd < 0){ -+ if(fd != -EAGAIN) -+ printk(KERN_ERR "port_accept : port_connection " -+ "returned %d\n", -fd); -+ goto out; -+ } -+ -+ conn = kmalloc(sizeof(*conn), GFP_ATOMIC); -+ if(conn == NULL){ -+ printk(KERN_ERR "port_accept : failed to allocate " -+ "connection\n"); -+ goto out_close; -+ } -+ *conn = ((struct connection) -+ { .list = LIST_HEAD_INIT(conn->list), -+ .fd = fd, -+ .socket = { socket[0], socket[1] }, -+ .telnetd_pid = pid, -+ .port = port }); -+ -+ if(um_request_irq(TELNETD_IRQ, socket[0], IRQ_READ, pipe_interrupt, -+ SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, -+ "telnetd", conn)){ -+ printk(KERN_ERR "port_accept : failed to get IRQ for " -+ "telnetd\n"); -+ goto out_free; -+ } -+ -+ list_add(&conn->list, &port->pending); -+ return(1); -+ -+ out_free: -+ kfree(conn); -+ out_close: -+ os_close_file(fd); -+ if(pid != -1) -+ os_kill_process(pid, 1); -+ out: -+ return(ret); -+} -+ -+DECLARE_MUTEX(ports_sem); -+struct list_head ports = LIST_HEAD_INIT(ports); -+ -+void port_task_proc(void *unused) -+{ -+ struct port_list *port; -+ struct list_head *ele; -+ unsigned long flags; -+ -+ save_flags(flags); -+ list_for_each(ele, &ports){ -+ port = list_entry(ele, struct port_list, list); -+ if(!port->has_connection) -+ continue; -+ reactivate_fd(port->fd, ACCEPT_IRQ); -+ while(port_accept(port)) ; -+ port->has_connection = 0; -+ } -+ restore_flags(flags); -+} -+ -+struct tq_struct port_task = { -+ .routine = port_task_proc, -+ .data = NULL -+}; -+ -+static void port_interrupt(int irq, void *data, struct pt_regs *regs) -+{ -+ struct port_list *port = data; -+ -+ port->has_connection = 1; -+ schedule_task(&port_task); -+} -+ -+void *port_data(int port_num) -+{ -+ struct list_head *ele; -+ struct port_list *port; -+ struct port_dev *dev = NULL; -+ int fd; -+ -+ down(&ports_sem); -+ list_for_each(ele, &ports){ -+ port = list_entry(ele, struct port_list, list); -+ if(port->port == port_num) goto found; -+ } -+ port = kmalloc(sizeof(struct port_list), GFP_KERNEL); -+ if(port == NULL){ -+ printk(KERN_ERR "Allocation of port list failed\n"); -+ goto out; -+ } -+ -+ fd = port_listen_fd(port_num); -+ if(fd < 0){ -+ printk(KERN_ERR "binding to port %d failed, errno = %d\n", -+ port_num, -fd); -+ goto out_free; -+ } -+ if(um_request_irq(ACCEPT_IRQ, fd, IRQ_READ, port_interrupt, -+ SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, "port", -+ port)){ -+ printk(KERN_ERR "Failed to get IRQ for port %d\n", port_num); -+ goto out_close; -+ } -+ -+ *port = ((struct port_list) -+ { .list = LIST_HEAD_INIT(port->list), -+ .has_connection = 0, -+ .sem = __SEMAPHORE_INITIALIZER(port->sem, -+ 0), -+ .lock = SPIN_LOCK_UNLOCKED, -+ .port = port_num, -+ .fd = fd, -+ .pending = LIST_HEAD_INIT(port->pending), -+ .connections = LIST_HEAD_INIT(port->connections) }); -+ list_add(&port->list, &ports); -+ -+ found: -+ dev = kmalloc(sizeof(struct port_dev), GFP_KERNEL); -+ if(dev == NULL){ -+ printk(KERN_ERR "Allocation of port device entry failed\n"); -+ goto out; -+ } -+ -+ *dev = ((struct port_dev) { .port = port, -+ .helper_pid = -1, -+ .telnetd_pid = -1 }); -+ goto out; -+ -+ out_free: -+ kfree(port); -+ out_close: -+ os_close_file(fd); -+ out: -+ up(&ports_sem); -+ return(dev); -+} -+ -+int port_wait(void *data) -+{ -+ struct port_dev *dev = data; -+ struct connection *conn; -+ struct port_list *port = dev->port; -+ int fd; -+ -+ while(1){ -+ if(down_interruptible(&port->sem)) -+ return(-ERESTARTSYS); -+ -+ spin_lock(&port->lock); -+ -+ conn = list_entry(port->connections.next, struct connection, -+ list); -+ list_del(&conn->list); -+ spin_unlock(&port->lock); -+ -+ os_shutdown_socket(conn->socket[0], 1, 1); -+ os_close_file(conn->socket[0]); -+ os_shutdown_socket(conn->socket[1], 1, 1); -+ os_close_file(conn->socket[1]); -+ -+ /* This is done here because freeing an IRQ can't be done -+ * within the IRQ handler. So, pipe_interrupt always ups -+ * the semaphore regardless of whether it got a successful -+ * connection. Then we loop here throwing out failed -+ * connections until a good one is found. -+ */ -+ free_irq(TELNETD_IRQ, conn); -+ -+ if(conn->fd >= 0) break; -+ os_close_file(conn->fd); -+ kfree(conn); -+ } -+ -+ fd = conn->fd; -+ dev->helper_pid = conn->helper_pid; -+ dev->telnetd_pid = conn->telnetd_pid; -+ kfree(conn); -+ -+ return(fd); -+} -+ -+void port_remove_dev(void *d) -+{ -+ struct port_dev *dev = d; -+ -+ if(dev->helper_pid != -1) -+ os_kill_process(dev->helper_pid, 0); -+ if(dev->telnetd_pid != -1) -+ os_kill_process(dev->telnetd_pid, 1); -+ dev->helper_pid = -1; -+ dev->telnetd_pid = -1; -+} -+ -+void port_kern_free(void *d) -+{ -+ struct port_dev *dev = d; -+ -+ port_remove_dev(dev); -+ kfree(dev); -+} -+ -+static void free_port(void) -+{ -+ struct list_head *ele; -+ struct port_list *port; -+ -+ list_for_each(ele, &ports){ -+ port = list_entry(ele, struct port_list, list); -+ free_irq_by_fd(port->fd); -+ os_close_file(port->fd); -+ } -+} -+ -+__uml_exitcall(free_port); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/port_user.c um/arch/um/drivers/port_user.c ---- orig/arch/um/drivers/port_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/port_user.c 2002-12-16 22:46:20.000000000 -0500 -@@ -0,0 +1,206 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stddef.h> -+#include <stdlib.h> -+#include <string.h> -+#include <errno.h> -+#include <unistd.h> -+#include <termios.h> -+#include <sys/socket.h> -+#include <sys/un.h> -+#include <netinet/in.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "chan_user.h" -+#include "port.h" -+#include "helper.h" -+#include "os.h" -+ -+struct port_chan { -+ int raw; -+ struct termios tt; -+ void *kernel_data; -+ char dev[sizeof("32768\0")]; -+}; -+ -+void *port_init(char *str, int device, struct chan_opts *opts) -+{ -+ struct port_chan *data; -+ void *kern_data; -+ char *end; -+ int port; -+ -+ if(*str != ':'){ -+ printk("port_init : channel type 'port' must specify a " -+ "port number\n"); -+ return(NULL); -+ } -+ str++; -+ port = strtoul(str, &end, 0); -+ if((*end != '\0') || (end == str)){ -+ printk("port_init : couldn't parse port '%s'\n", str); -+ return(NULL); -+ } -+ -+ if((kern_data = port_data(port)) == NULL) -+ return(NULL); -+ -+ if((data = um_kmalloc(sizeof(*data))) == NULL) -+ goto err; -+ -+ *data = ((struct port_chan) { .raw = opts->raw, -+ .kernel_data = kern_data }); -+ sprintf(data->dev, "%d", port); -+ -+ return(data); -+ err: -+ port_kern_free(kern_data); -+ return(NULL); -+} -+ -+void port_free(void *d) -+{ -+ struct port_chan *data = d; -+ -+ port_kern_free(data->kernel_data); -+ kfree(data); -+} -+ -+int port_open(int input, int output, int primary, void *d, char **dev_out) -+{ -+ struct port_chan *data = d; -+ int fd; -+ -+ fd = port_wait(data->kernel_data); -+ if((fd >= 0) && data->raw){ -+ tcgetattr(fd, &data->tt); -+ raw(fd, 0); -+ } -+ *dev_out = data->dev; -+ return(fd); -+} -+ -+void port_close(int fd, void *d) -+{ -+ struct port_chan *data = d; -+ -+ port_remove_dev(data->kernel_data); -+ close(fd); -+} -+ -+int port_console_write(int fd, const char *buf, int n, void *d) -+{ -+ struct port_chan *data = d; -+ -+ return(generic_console_write(fd, buf, n, &data->tt)); -+} -+ -+struct chan_ops port_ops = { -+ .type = "port", -+ .init = port_init, -+ .open = port_open, -+ .close = port_close, -+ .read = generic_read, -+ .write = generic_write, -+ .console_write = port_console_write, -+ .window_size = generic_window_size, -+ .free = port_free, -+ .winch = 1, -+}; -+ -+int port_listen_fd(int port) -+{ -+ struct sockaddr_in addr; -+ int fd, err; -+ -+ fd = socket(PF_INET, SOCK_STREAM, 0); -+ if(fd == -1) -+ return(-errno); -+ -+ addr.sin_family = AF_INET; -+ addr.sin_port = htons(port); -+ addr.sin_addr.s_addr = htonl(INADDR_ANY); -+ if(bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0){ -+ err = -errno; -+ goto out; -+ } -+ -+ if((listen(fd, 1) < 0) || (os_set_fd_block(fd, 0))){ -+ err = -errno; -+ goto out; -+ } -+ -+ return(fd); -+ out: -+ os_close_file(fd); -+ return(err); -+} -+ -+struct port_pre_exec_data { -+ int sock_fd; -+ int pipe_fd; -+}; -+ -+void port_pre_exec(void *arg) -+{ -+ struct port_pre_exec_data *data = arg; -+ -+ dup2(data->sock_fd, 0); -+ dup2(data->sock_fd, 1); -+ dup2(data->sock_fd, 2); -+ close(data->sock_fd); -+ dup2(data->pipe_fd, 3); -+ os_shutdown_socket(3, 1, 0); -+ close(data->pipe_fd); -+} -+ -+int port_connection(int fd, int *socket, int *pid_out) -+{ -+ int new, err; -+ char *argv[] = { "/usr/sbin/in.telnetd", "-L", -+ "/usr/lib/uml/port-helper", NULL }; -+ struct port_pre_exec_data data; -+ -+ if((new = os_accept_connection(fd)) < 0) -+ return(-errno); -+ -+ err = os_pipe(socket, 0, 0); -+ if(err) -+ goto out_close; -+ -+ data = ((struct port_pre_exec_data) -+ { .sock_fd = new, -+ .pipe_fd = socket[1] }); -+ -+ err = run_helper(port_pre_exec, &data, argv, NULL); -+ if(err < 0) -+ goto out_shutdown; -+ -+ *pid_out = err; -+ return(new); -+ -+ out_shutdown: -+ os_shutdown_socket(socket[0], 1, 1); -+ close(socket[0]); -+ os_shutdown_socket(socket[1], 1, 1); -+ close(socket[1]); -+ out_close: -+ close(new); -+ return(err); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/pty.c um/arch/um/drivers/pty.c ---- orig/arch/um/drivers/pty.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/pty.c 2002-12-15 21:06:01.000000000 -0500 -@@ -0,0 +1,148 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <string.h> -+#include <errno.h> -+#include <fcntl.h> -+#include <termios.h> -+#include "chan_user.h" -+#include "user.h" -+#include "user_util.h" -+#include "kern_util.h" -+ -+struct pty_chan { -+ void (*announce)(char *dev_name, int dev); -+ int dev; -+ int raw; -+ struct termios tt; -+ char dev_name[sizeof("/dev/pts/0123456\0")]; -+}; -+ -+void *pty_chan_init(char *str, int device, struct chan_opts *opts) -+{ -+ struct pty_chan *data; -+ -+ if((data = um_kmalloc(sizeof(*data))) == NULL) return(NULL); -+ *data = ((struct pty_chan) { .announce = opts->announce, -+ .dev = device, -+ .raw = opts->raw }); -+ return(data); -+} -+ -+int pts_open(int input, int output, int primary, void *d, char **dev_out) -+{ -+ struct pty_chan *data = d; -+ char *dev; -+ int fd; -+ -+ if((fd = get_pty()) < 0){ -+ printk("open_pts : Failed to open pts\n"); -+ return(-errno); -+ } -+ if(data->raw){ -+ tcgetattr(fd, &data->tt); -+ raw(fd, 0); -+ } -+ -+ dev = ptsname(fd); -+ sprintf(data->dev_name, "%s", dev); -+ *dev_out = data->dev_name; -+ if(data->announce) (*data->announce)(dev, data->dev); -+ return(fd); -+} -+ -+int getmaster(char *line) -+{ -+ struct stat stb; -+ char *pty, *bank, *cp; -+ int master; -+ -+ pty = &line[strlen("/dev/ptyp")]; -+ for (bank = "pqrs"; *bank; bank++) { -+ line[strlen("/dev/pty")] = *bank; -+ *pty = '0'; -+ if (stat(line, &stb) < 0) -+ break; -+ for (cp = "0123456789abcdef"; *cp; cp++) { -+ *pty = *cp; -+ master = open(line, O_RDWR); -+ if (master >= 0) { -+ char *tp = &line[strlen("/dev/")]; -+ int ok; -+ -+ /* verify slave side is usable */ -+ *tp = 't'; -+ ok = access(line, R_OK|W_OK) == 0; -+ *tp = 'p'; -+ if (ok) return(master); -+ (void) close(master); -+ } -+ } -+ } -+ return(-1); -+} -+ -+int pty_open(int input, int output, int primary, void *d, char **dev_out) -+{ -+ struct pty_chan *data = d; -+ int fd; -+ char dev[sizeof("/dev/ptyxx\0")] = "/dev/ptyxx"; -+ -+ fd = getmaster(dev); -+ if(fd < 0) return(-errno); -+ -+ if(data->raw) raw(fd, 0); -+ if(data->announce) (*data->announce)(dev, data->dev); -+ -+ sprintf(data->dev_name, "%s", dev); -+ *dev_out = data->dev_name; -+ return(fd); -+} -+ -+int pty_console_write(int fd, const char *buf, int n, void *d) -+{ -+ struct pty_chan *data = d; -+ -+ return(generic_console_write(fd, buf, n, &data->tt)); -+} -+ -+struct chan_ops pty_ops = { -+ .type = "pty", -+ .init = pty_chan_init, -+ .open = pty_open, -+ .close = generic_close, -+ .read = generic_read, -+ .write = generic_write, -+ .console_write = pty_console_write, -+ .window_size = generic_window_size, -+ .free = generic_free, -+ .winch = 0, -+}; -+ -+struct chan_ops pts_ops = { -+ .type = "pts", -+ .init = pty_chan_init, -+ .open = pts_open, -+ .close = generic_close, -+ .read = generic_read, -+ .write = generic_write, -+ .console_write = pty_console_write, -+ .window_size = generic_window_size, -+ .free = generic_free, -+ .winch = 0, -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/slip.h um/arch/um/drivers/slip.h ---- orig/arch/um/drivers/slip.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/slip.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,39 @@ -+#ifndef __UM_SLIP_H -+#define __UM_SLIP_H -+ -+#define BUF_SIZE 1500 -+ /* two bytes each for a (pathological) max packet of escaped chars + * -+ * terminating END char + initial END char */ -+#define ENC_BUF_SIZE (2 * BUF_SIZE + 2) -+ -+struct slip_data { -+ void *dev; -+ char name[sizeof("slnnnnn\0")]; -+ char *addr; -+ char *gate_addr; -+ int slave; -+ char ibuf[ENC_BUF_SIZE]; -+ char obuf[ENC_BUF_SIZE]; -+ int more; /* more data: do not read fd until ibuf has been drained */ -+ int pos; -+ int esc; -+}; -+ -+extern struct net_user_info slip_user_info; -+ -+extern int set_umn_addr(int fd, char *addr, char *ptp_addr); -+extern int slip_user_read(int fd, void *buf, int len, struct slip_data *pri); -+extern int slip_user_write(int fd, void *buf, int len, struct slip_data *pri); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_kern.c um/arch/um/drivers/slip_kern.c ---- orig/arch/um/drivers/slip_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/slip_kern.c 2002-12-15 21:06:24.000000000 -0500 -@@ -0,0 +1,109 @@ -+#include "linux/config.h" -+#include "linux/kernel.h" -+#include "linux/stddef.h" -+#include "linux/init.h" -+#include "linux/netdevice.h" -+#include "linux/if_arp.h" -+#include "net_kern.h" -+#include "net_user.h" -+#include "kern.h" -+#include "slip.h" -+ -+struct slip_init { -+ char *gate_addr; -+}; -+ -+void slip_init(struct net_device *dev, void *data) -+{ -+ struct uml_net_private *private; -+ struct slip_data *spri; -+ struct slip_init *init = data; -+ -+ private = dev->priv; -+ spri = (struct slip_data *) private->user; -+ *spri = ((struct slip_data) -+ { .name = { '\0' }, -+ .addr = NULL, -+ .gate_addr = init->gate_addr, -+ .slave = -1, -+ .ibuf = { '\0' }, -+ .obuf = { '\0' }, -+ .pos = 0, -+ .esc = 0, -+ .dev = dev }); -+ -+ dev->init = NULL; -+ dev->hard_header_len = 0; -+ dev->addr_len = 4; -+ dev->type = ARPHRD_ETHER; -+ dev->tx_queue_len = 256; -+ dev->flags = IFF_NOARP; -+ printk("SLIP backend - SLIP IP = %s\n", spri->gate_addr); -+} -+ -+static unsigned short slip_protocol(struct sk_buff *skbuff) -+{ -+ return(htons(ETH_P_IP)); -+} -+ -+static int slip_read(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ return(slip_user_read(fd, (*skb)->mac.raw, (*skb)->dev->mtu, -+ (struct slip_data *) &lp->user)); -+} -+ -+static int slip_write(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ return(slip_user_write(fd, (*skb)->data, (*skb)->len, -+ (struct slip_data *) &lp->user)); -+} -+ -+struct net_kern_info slip_kern_info = { -+ .init = slip_init, -+ .protocol = slip_protocol, -+ .read = slip_read, -+ .write = slip_write, -+}; -+ -+static int slip_setup(char *str, char **mac_out, void *data) -+{ -+ struct slip_init *init = data; -+ -+ *init = ((struct slip_init) -+ { .gate_addr = NULL }); -+ -+ if(str[0] != '\0') -+ init->gate_addr = str; -+ return(1); -+} -+ -+static struct transport slip_transport = { -+ .list = LIST_HEAD_INIT(slip_transport.list), -+ .name = "slip", -+ .setup = slip_setup, -+ .user = &slip_user_info, -+ .kern = &slip_kern_info, -+ .private_size = sizeof(struct slip_data), -+ .setup_size = sizeof(struct slip_init), -+}; -+ -+static int register_slip(void) -+{ -+ register_transport(&slip_transport); -+ return(1); -+} -+ -+__initcall(register_slip); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_proto.h um/arch/um/drivers/slip_proto.h ---- orig/arch/um/drivers/slip_proto.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/slip_proto.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,93 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UM_SLIP_PROTO_H__ -+#define __UM_SLIP_PROTO_H__ -+ -+/* SLIP protocol characters. */ -+#define SLIP_END 0300 /* indicates end of frame */ -+#define SLIP_ESC 0333 /* indicates byte stuffing */ -+#define SLIP_ESC_END 0334 /* ESC ESC_END means END 'data' */ -+#define SLIP_ESC_ESC 0335 /* ESC ESC_ESC means ESC 'data' */ -+ -+static inline int slip_unesc(unsigned char c,char *buf,int *pos, int *esc) -+{ -+ int ret; -+ -+ switch(c){ -+ case SLIP_END: -+ *esc = 0; -+ ret=*pos; -+ *pos=0; -+ return(ret); -+ case SLIP_ESC: -+ *esc = 1; -+ return(0); -+ case SLIP_ESC_ESC: -+ if(*esc){ -+ *esc = 0; -+ c = SLIP_ESC; -+ } -+ break; -+ case SLIP_ESC_END: -+ if(*esc){ -+ *esc = 0; -+ c = SLIP_END; -+ } -+ break; -+ } -+ buf[(*pos)++] = c; -+ return(0); -+} -+ -+static inline int slip_esc(unsigned char *s, unsigned char *d, int len) -+{ -+ unsigned char *ptr = d; -+ unsigned char c; -+ -+ /* -+ * Send an initial END character to flush out any -+ * data that may have accumulated in the receiver -+ * due to line noise. -+ */ -+ -+ *ptr++ = SLIP_END; -+ -+ /* -+ * For each byte in the packet, send the appropriate -+ * character sequence, according to the SLIP protocol. -+ */ -+ -+ while (len-- > 0) { -+ switch(c = *s++) { -+ case SLIP_END: -+ *ptr++ = SLIP_ESC; -+ *ptr++ = SLIP_ESC_END; -+ break; -+ case SLIP_ESC: -+ *ptr++ = SLIP_ESC; -+ *ptr++ = SLIP_ESC_ESC; -+ break; -+ default: -+ *ptr++ = c; -+ break; -+ } -+ } -+ *ptr++ = SLIP_END; -+ return (ptr - d); -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/slip_user.c um/arch/um/drivers/slip_user.c ---- orig/arch/um/drivers/slip_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/slip_user.c 2002-12-15 21:06:35.000000000 -0500 -@@ -0,0 +1,279 @@ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <stddef.h> -+#include <sched.h> -+#include <string.h> -+#include <sys/fcntl.h> -+#include <sys/errno.h> -+#include <sys/termios.h> -+#include <sys/wait.h> -+#include <sys/ioctl.h> -+#include <sys/signal.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "net_user.h" -+#include "slip.h" -+#include "slip_proto.h" -+#include "helper.h" -+#include "os.h" -+ -+void slip_user_init(void *data, void *dev) -+{ -+ struct slip_data *pri = data; -+ -+ pri->dev = dev; -+} -+ -+static int set_up_tty(int fd) -+{ -+ int i; -+ struct termios tios; -+ -+ if (tcgetattr(fd, &tios) < 0) { -+ printk("could not get initial terminal attributes\n"); -+ return(-1); -+ } -+ -+ tios.c_cflag = CS8 | CREAD | HUPCL | CLOCAL; -+ tios.c_iflag = IGNBRK | IGNPAR; -+ tios.c_oflag = 0; -+ tios.c_lflag = 0; -+ for (i = 0; i < NCCS; i++) -+ tios.c_cc[i] = 0; -+ tios.c_cc[VMIN] = 1; -+ tios.c_cc[VTIME] = 0; -+ -+ cfsetospeed(&tios, B38400); -+ cfsetispeed(&tios, B38400); -+ -+ if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) { -+ printk("failed to set terminal attributes\n"); -+ return(-1); -+ } -+ return(0); -+} -+ -+struct slip_pre_exec_data { -+ int stdin; -+ int stdout; -+ int close_me; -+}; -+ -+static void slip_pre_exec(void *arg) -+{ -+ struct slip_pre_exec_data *data = arg; -+ -+ if(data->stdin != -1) dup2(data->stdin, 0); -+ dup2(data->stdout, 1); -+ if(data->close_me != -1) close(data->close_me); -+} -+ -+static int slip_tramp(char **argv, int fd) -+{ -+ struct slip_pre_exec_data pe_data; -+ char *output; -+ int status, pid, fds[2], err, output_len; -+ -+ err = os_pipe(fds, 1, 0); -+ if(err){ -+ printk("slip_tramp : pipe failed, errno = %d\n", -err); -+ return(err); -+ } -+ -+ err = 0; -+ pe_data.stdin = fd; -+ pe_data.stdout = fds[1]; -+ pe_data.close_me = fds[0]; -+ pid = run_helper(slip_pre_exec, &pe_data, argv, NULL); -+ -+ if(pid < 0) err = pid; -+ else { -+ output_len = page_size(); -+ output = um_kmalloc(output_len); -+ if(output == NULL) -+ printk("slip_tramp : failed to allocate output " -+ "buffer\n"); -+ -+ close(fds[1]); -+ read_output(fds[0], output, output_len); -+ if(output != NULL){ -+ printk("%s", output); -+ kfree(output); -+ } -+ if(waitpid(pid, &status, 0) < 0) err = errno; -+ else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){ -+ printk("'%s' didn't exit with status 0\n", argv[0]); -+ err = EINVAL; -+ } -+ } -+ return(err); -+} -+ -+static int slip_open(void *data) -+{ -+ struct slip_data *pri = data; -+ char version_buf[sizeof("nnnnn\0")]; -+ char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")]; -+ char *argv[] = { "uml_net", version_buf, "slip", "up", gate_buf, -+ NULL }; -+ int sfd, mfd, disc, sencap, err; -+ -+ if((mfd = get_pty()) < 0){ -+ printk("umn : Failed to open pty\n"); -+ return(-1); -+ } -+ if((sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0)) < 0){ -+ printk("Couldn't open tty for slip line\n"); -+ return(-1); -+ } -+ if(set_up_tty(sfd)) return(-1); -+ pri->slave = sfd; -+ pri->pos = 0; -+ pri->esc = 0; -+ if(pri->gate_addr != NULL){ -+ sprintf(version_buf, "%d", UML_NET_VERSION); -+ strcpy(gate_buf, pri->gate_addr); -+ -+ err = slip_tramp(argv, sfd); -+ -+ if(err != 0){ -+ printk("slip_tramp failed - errno = %d\n", err); -+ return(-err); -+ } -+ if(ioctl(pri->slave, SIOCGIFNAME, pri->name) < 0){ -+ printk("SIOCGIFNAME failed, errno = %d\n", errno); -+ return(-errno); -+ } -+ iter_addresses(pri->dev, open_addr, pri->name); -+ } -+ else { -+ disc = N_SLIP; -+ if(ioctl(sfd, TIOCSETD, &disc) < 0){ -+ printk("Failed to set slip line discipline - " -+ "errno = %d\n", errno); -+ return(-errno); -+ } -+ sencap = 0; -+ if(ioctl(sfd, SIOCSIFENCAP, &sencap) < 0){ -+ printk("Failed to set slip encapsulation - " -+ "errno = %d\n", errno); -+ return(-errno); -+ } -+ } -+ return(mfd); -+} -+ -+static void slip_close(int fd, void *data) -+{ -+ struct slip_data *pri = data; -+ char version_buf[sizeof("nnnnn\0")]; -+ char *argv[] = { "uml_net", version_buf, "slip", "down", pri->name, -+ NULL }; -+ int err; -+ -+ if(pri->gate_addr != NULL) -+ iter_addresses(pri->dev, close_addr, pri->name); -+ -+ sprintf(version_buf, "%d", UML_NET_VERSION); -+ -+ err = slip_tramp(argv, -1); -+ -+ if(err != 0) -+ printk("slip_tramp failed - errno = %d\n", err); -+ close(fd); -+ close(pri->slave); -+ pri->slave = -1; -+} -+ -+int slip_user_read(int fd, void *buf, int len, struct slip_data *pri) -+{ -+ int i, n, size, start; -+ -+ if(pri->more>0) { -+ i = 0; -+ while(i < pri->more) { -+ size = slip_unesc(pri->ibuf[i++], -+ pri->ibuf, &pri->pos, &pri->esc); -+ if(size){ -+ memcpy(buf, pri->ibuf, size); -+ memmove(pri->ibuf, &pri->ibuf[i], pri->more-i); -+ pri->more=pri->more-i; -+ return(size); -+ } -+ } -+ pri->more=0; -+ } -+ -+ n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos); -+ if(n <= 0) return(n); -+ -+ start = pri->pos; -+ for(i = 0; i < n; i++){ -+ size = slip_unesc(pri->ibuf[start + i], -+ pri->ibuf, &pri->pos, &pri->esc); -+ if(size){ -+ memcpy(buf, pri->ibuf, size); -+ memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1)); -+ pri->more=n-(i+1); -+ return(size); -+ } -+ } -+ return(0); -+} -+ -+int slip_user_write(int fd, void *buf, int len, struct slip_data *pri) -+{ -+ int actual, n; -+ -+ actual = slip_esc(buf, pri->obuf, len); -+ n = net_write(fd, pri->obuf, actual); -+ if(n < 0) return(n); -+ else return(len); -+} -+ -+static int slip_set_mtu(int mtu, void *data) -+{ -+ return(mtu); -+} -+ -+static void slip_add_addr(unsigned char *addr, unsigned char *netmask, -+ void *data) -+{ -+ struct slip_data *pri = data; -+ -+ if(pri->slave == -1) return; -+ open_addr(addr, netmask, pri->name); -+} -+ -+static void slip_del_addr(unsigned char *addr, unsigned char *netmask, -+ void *data) -+{ -+ struct slip_data *pri = data; -+ -+ if(pri->slave == -1) return; -+ close_addr(addr, netmask, pri->name); -+} -+ -+struct net_user_info slip_user_info = { -+ .init = slip_user_init, -+ .open = slip_open, -+ .close = slip_close, -+ .remove = NULL, -+ .set_mtu = slip_set_mtu, -+ .add_address = slip_add_addr, -+ .delete_address = slip_del_addr, -+ .max_packet = BUF_SIZE -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp.h um/arch/um/drivers/slirp.h ---- orig/arch/um/drivers/slirp.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/slirp.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,51 @@ -+#ifndef __UM_SLIRP_H -+#define __UM_SLIRP_H -+ -+#define BUF_SIZE 1500 -+ /* two bytes each for a (pathological) max packet of escaped chars + * -+ * terminating END char + initial END char */ -+#define ENC_BUF_SIZE (2 * BUF_SIZE + 2) -+ -+#define SLIRP_MAX_ARGS 100 -+/* -+ * XXX this next definition is here because I don't understand why this -+ * initializer doesn't work in slirp_kern.c: -+ * -+ * argv : { init->argv[ 0 ... SLIRP_MAX_ARGS-1 ] }, -+ * -+ * or why I can't typecast like this: -+ * -+ * argv : (char* [SLIRP_MAX_ARGS])(init->argv), -+ */ -+struct arg_list_dummy_wrapper { char *argv[SLIRP_MAX_ARGS]; }; -+ -+struct slirp_data { -+ void *dev; -+ struct arg_list_dummy_wrapper argw; -+ int pid; -+ int slave; -+ char ibuf[ENC_BUF_SIZE]; -+ char obuf[ENC_BUF_SIZE]; -+ int more; /* more data: do not read fd until ibuf has been drained */ -+ int pos; -+ int esc; -+}; -+ -+extern struct net_user_info slirp_user_info; -+ -+extern int set_umn_addr(int fd, char *addr, char *ptp_addr); -+extern int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri); -+extern int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp_kern.c um/arch/um/drivers/slirp_kern.c ---- orig/arch/um/drivers/slirp_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/slirp_kern.c 2002-12-15 21:06:54.000000000 -0500 -@@ -0,0 +1,132 @@ -+#include "linux/kernel.h" -+#include "linux/stddef.h" -+#include "linux/init.h" -+#include "linux/netdevice.h" -+#include "linux/if_arp.h" -+#include "net_kern.h" -+#include "net_user.h" -+#include "kern.h" -+#include "slirp.h" -+ -+struct slirp_init { -+ struct arg_list_dummy_wrapper argw; /* XXX should be simpler... */ -+}; -+ -+void slirp_init(struct net_device *dev, void *data) -+{ -+ struct uml_net_private *private; -+ struct slirp_data *spri; -+ struct slirp_init *init = data; -+ int i; -+ -+ private = dev->priv; -+ spri = (struct slirp_data *) private->user; -+ *spri = ((struct slirp_data) -+ { .argw = init->argw, -+ .pid = -1, -+ .slave = -1, -+ .ibuf = { '\0' }, -+ .obuf = { '\0' }, -+ .pos = 0, -+ .esc = 0, -+ .dev = dev }); -+ -+ dev->init = NULL; -+ dev->hard_header_len = 0; -+ dev->addr_len = 4; -+ dev->type = ARPHRD_ETHER; -+ dev->tx_queue_len = 256; -+ dev->flags = IFF_NOARP; -+ printk("SLIRP backend - command line:"); -+ for(i=0;spri->argw.argv[i]!=NULL;i++) { -+ printk(" '%s'",spri->argw.argv[i]); -+ } -+ printk("\n"); -+} -+ -+static unsigned short slirp_protocol(struct sk_buff *skbuff) -+{ -+ return(htons(ETH_P_IP)); -+} -+ -+static int slirp_read(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ return(slirp_user_read(fd, (*skb)->mac.raw, (*skb)->dev->mtu, -+ (struct slirp_data *) &lp->user)); -+} -+ -+static int slirp_write(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ return(slirp_user_write(fd, (*skb)->data, (*skb)->len, -+ (struct slirp_data *) &lp->user)); -+} -+ -+struct net_kern_info slirp_kern_info = { -+ .init = slirp_init, -+ .protocol = slirp_protocol, -+ .read = slirp_read, -+ .write = slirp_write, -+}; -+ -+static int slirp_setup(char *str, char **mac_out, void *data) -+{ -+ struct slirp_init *init = data; -+ int i=0; -+ -+ *init = ((struct slirp_init) -+ { argw : { { "slirp", NULL } } }); -+ -+ str = split_if_spec(str, mac_out, NULL); -+ -+ if(str == NULL) { /* no command line given after MAC addr */ -+ return(1); -+ } -+ -+ do { -+ if(i>=SLIRP_MAX_ARGS-1) { -+ printk("slirp_setup: truncating slirp arguments\n"); -+ break; -+ } -+ init->argw.argv[i++] = str; -+ while(*str && *str!=',') { -+ if(*str=='_') *str=' '; -+ str++; -+ } -+ if(*str!=',') -+ break; -+ *str++='\0'; -+ } while(1); -+ init->argw.argv[i]=NULL; -+ return(1); -+} -+ -+static struct transport slirp_transport = { -+ .list = LIST_HEAD_INIT(slirp_transport.list), -+ .name = "slirp", -+ .setup = slirp_setup, -+ .user = &slirp_user_info, -+ .kern = &slirp_kern_info, -+ .private_size = sizeof(struct slirp_data), -+ .setup_size = sizeof(struct slirp_init), -+}; -+ -+static int register_slirp(void) -+{ -+ register_transport(&slirp_transport); -+ return(1); -+} -+ -+__initcall(register_slirp); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/slirp_user.c um/arch/um/drivers/slirp_user.c ---- orig/arch/um/drivers/slirp_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/slirp_user.c 2002-12-15 21:07:08.000000000 -0500 -@@ -0,0 +1,202 @@ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <stddef.h> -+#include <sched.h> -+#include <string.h> -+#include <sys/fcntl.h> -+#include <sys/errno.h> -+#include <sys/wait.h> -+#include <sys/signal.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "net_user.h" -+#include "slirp.h" -+#include "slip_proto.h" -+#include "helper.h" -+#include "os.h" -+ -+void slirp_user_init(void *data, void *dev) -+{ -+ struct slirp_data *pri = data; -+ -+ pri->dev = dev; -+} -+ -+struct slirp_pre_exec_data { -+ int stdin; -+ int stdout; -+}; -+ -+static void slirp_pre_exec(void *arg) -+{ -+ struct slirp_pre_exec_data *data = arg; -+ -+ if(data->stdin != -1) dup2(data->stdin, 0); -+ if(data->stdout != -1) dup2(data->stdout, 1); -+} -+ -+static int slirp_tramp(char **argv, int fd) -+{ -+ struct slirp_pre_exec_data pe_data; -+ int pid; -+ -+ pe_data.stdin = fd; -+ pe_data.stdout = fd; -+ pid = run_helper(slirp_pre_exec, &pe_data, argv, NULL); -+ -+ return(pid); -+} -+ -+static int slirp_datachan(int *mfd, int *sfd) -+{ -+ int fds[2], err; -+ -+ err = os_pipe(fds, 1, 1); -+ if(err){ -+ printk("slirp_datachan: Failed to open pipe, errno = %d\n", -+ -err); -+ return(err); -+ } -+ -+ *mfd = fds[0]; -+ *sfd = fds[1]; -+ return(0); -+} -+ -+static int slirp_open(void *data) -+{ -+ struct slirp_data *pri = data; -+ int sfd, mfd, pid, err; -+ -+ err = slirp_datachan(&mfd, &sfd); -+ if(err) -+ return(err); -+ -+ pid = slirp_tramp(pri->argw.argv, sfd); -+ -+ if(pid < 0){ -+ printk("slirp_tramp failed - errno = %d\n", pid); -+ os_close_file(sfd); -+ os_close_file(mfd); -+ return(pid); -+ } -+ -+ pri->slave = sfd; -+ pri->pos = 0; -+ pri->esc = 0; -+ -+ pri->pid = pid; -+ -+ return(mfd); -+} -+ -+static void slirp_close(int fd, void *data) -+{ -+ struct slirp_data *pri = data; -+ int status,err; -+ -+ close(fd); -+ close(pri->slave); -+ -+ pri->slave = -1; -+ -+ if(pri->pid<1) { -+ printk("slirp_close: no child process to shut down\n"); -+ return; -+ } -+ -+#if 0 -+ if(kill(pri->pid, SIGHUP)<0) { -+ printk("slirp_close: sending hangup to %d failed (%d)\n", -+ pri->pid, errno); -+ } -+#endif -+ -+ err = waitpid(pri->pid, &status, WNOHANG); -+ if(err<0) { -+ printk("slirp_close: waitpid returned %d\n", errno); -+ return; -+ } -+ -+ if(err==0) { -+ printk("slirp_close: process %d has not exited\n"); -+ return; -+ } -+ -+ pri->pid = -1; -+} -+ -+int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri) -+{ -+ int i, n, size, start; -+ -+ if(pri->more>0) { -+ i = 0; -+ while(i < pri->more) { -+ size = slip_unesc(pri->ibuf[i++], -+ pri->ibuf,&pri->pos,&pri->esc); -+ if(size){ -+ memcpy(buf, pri->ibuf, size); -+ memmove(pri->ibuf, &pri->ibuf[i], pri->more-i); -+ pri->more=pri->more-i; -+ return(size); -+ } -+ } -+ pri->more=0; -+ } -+ -+ n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos); -+ if(n <= 0) return(n); -+ -+ start = pri->pos; -+ for(i = 0; i < n; i++){ -+ size = slip_unesc(pri->ibuf[start + i], -+ pri->ibuf,&pri->pos,&pri->esc); -+ if(size){ -+ memcpy(buf, pri->ibuf, size); -+ memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1)); -+ pri->more=n-(i+1); -+ return(size); -+ } -+ } -+ return(0); -+} -+ -+int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri) -+{ -+ int actual, n; -+ -+ actual = slip_esc(buf, pri->obuf, len); -+ n = net_write(fd, pri->obuf, actual); -+ if(n < 0) return(n); -+ else return(len); -+} -+ -+static int slirp_set_mtu(int mtu, void *data) -+{ -+ return(mtu); -+} -+ -+struct net_user_info slirp_user_info = { -+ .init = slirp_user_init, -+ .open = slirp_open, -+ .close = slirp_close, -+ .remove = NULL, -+ .set_mtu = slirp_set_mtu, -+ .add_address = NULL, -+ .delete_address = NULL, -+ .max_packet = BUF_SIZE -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/ssl.c um/arch/um/drivers/ssl.c ---- orig/arch/um/drivers/ssl.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/ssl.c 2003-03-06 18:55:01.000000000 -0500 -@@ -0,0 +1,265 @@ -+/* -+ * Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/fs.h" -+#include "linux/tty.h" -+#include "linux/tty_driver.h" -+#include "linux/major.h" -+#include "linux/mm.h" -+#include "linux/init.h" -+#include "asm/termbits.h" -+#include "asm/irq.h" -+#include "line.h" -+#include "ssl.h" -+#include "chan_kern.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "init.h" -+#include "irq_user.h" -+#include "mconsole_kern.h" -+#include "2_5compat.h" -+ -+static int ssl_version = 1; -+ -+/* Referenced only by tty_driver below - presumably it's locked correctly -+ * by the tty driver. -+ */ -+static int ssl_refcount = 0; -+ -+static struct tty_driver ssl_driver; -+ -+#define NR_PORTS 64 -+ -+void ssl_announce(char *dev_name, int dev) -+{ -+ printk(KERN_INFO "Serial line %d assigned device '%s'\n", dev, -+ dev_name); -+} -+ -+static struct chan_opts opts = { -+ .announce = ssl_announce, -+ .xterm_title = "Serial Line #%d", -+ .raw = 1, -+ .tramp_stack = 0, -+ .in_kernel = 1, -+}; -+ -+static int ssl_config(char *str); -+static int ssl_get_config(char *dev, char *str, int size, char **error_out); -+static int ssl_remove(char *str); -+ -+static struct line_driver driver = { -+ .name = "UML serial line", -+ .devfs_name = "tts/%d", -+ .major = TTY_MAJOR, -+ .minor_start = 64, -+ .type = TTY_DRIVER_TYPE_SERIAL, -+ .subtype = 0, -+ .read_irq = SSL_IRQ, -+ .read_irq_name = "ssl", -+ .write_irq = SSL_WRITE_IRQ, -+ .write_irq_name = "ssl-write", -+ .symlink_from = "serial", -+ .symlink_to = "tts", -+ .mc = { -+ .name = "ssl", -+ .config = ssl_config, -+ .get_config = ssl_get_config, -+ .remove = ssl_remove, -+ }, -+}; -+ -+/* The array is initialized by line_init, which is an initcall. The -+ * individual elements are protected by individual semaphores. -+ */ -+static struct line serial_lines[NR_PORTS] = -+ { [0 ... NR_PORTS - 1] = LINE_INIT(CONFIG_SSL_CHAN, &driver) }; -+ -+static struct lines lines = LINES_INIT(NR_PORTS); -+ -+static int ssl_config(char *str) -+{ -+ return(line_config(serial_lines, -+ sizeof(serial_lines)/sizeof(serial_lines[0]), str)); -+} -+ -+static int ssl_get_config(char *dev, char *str, int size, char **error_out) -+{ -+ return(line_get_config(dev, serial_lines, -+ sizeof(serial_lines)/sizeof(serial_lines[0]), -+ str, size, error_out)); -+} -+ -+static int ssl_remove(char *str) -+{ -+ return(line_remove(serial_lines, -+ sizeof(serial_lines)/sizeof(serial_lines[0]), str)); -+} -+ -+int ssl_open(struct tty_struct *tty, struct file *filp) -+{ -+ return(line_open(serial_lines, tty, &opts)); -+} -+ -+static void ssl_close(struct tty_struct *tty, struct file * filp) -+{ -+ line_close(serial_lines, tty); -+} -+ -+static int ssl_write(struct tty_struct * tty, int from_user, -+ const unsigned char *buf, int count) -+{ -+ return(line_write(serial_lines, tty, from_user, buf, count)); -+} -+ -+static void ssl_put_char(struct tty_struct *tty, unsigned char ch) -+{ -+ line_write(serial_lines, tty, 0, &ch, sizeof(ch)); -+} -+ -+static void ssl_flush_chars(struct tty_struct *tty) -+{ -+ return; -+} -+ -+static int ssl_chars_in_buffer(struct tty_struct *tty) -+{ -+ return(0); -+} -+ -+static void ssl_flush_buffer(struct tty_struct *tty) -+{ -+ return; -+} -+ -+static int ssl_ioctl(struct tty_struct *tty, struct file * file, -+ unsigned int cmd, unsigned long arg) -+{ -+ int ret; -+ -+ ret = 0; -+ switch(cmd){ -+ case TCGETS: -+ case TCSETS: -+ case TCFLSH: -+ case TCSETSF: -+ case TCSETSW: -+ case TCGETA: -+ case TIOCMGET: -+ ret = -ENOIOCTLCMD; -+ break; -+ default: -+ printk(KERN_ERR -+ "Unimplemented ioctl in ssl_ioctl : 0x%x\n", cmd); -+ ret = -ENOIOCTLCMD; -+ break; -+ } -+ return(ret); -+} -+ -+static void ssl_throttle(struct tty_struct * tty) -+{ -+ printk(KERN_ERR "Someone should implement ssl_throttle\n"); -+} -+ -+static void ssl_unthrottle(struct tty_struct * tty) -+{ -+ printk(KERN_ERR "Someone should implement ssl_unthrottle\n"); -+} -+ -+static void ssl_set_termios(struct tty_struct *tty, -+ struct termios *old_termios) -+{ -+} -+ -+static void ssl_stop(struct tty_struct *tty) -+{ -+ printk(KERN_ERR "Someone should implement ssl_stop\n"); -+} -+ -+static void ssl_start(struct tty_struct *tty) -+{ -+ printk(KERN_ERR "Someone should implement ssl_start\n"); -+} -+ -+void ssl_hangup(struct tty_struct *tty) -+{ -+} -+ -+static struct tty_driver ssl_driver = { -+ .refcount = &ssl_refcount, -+ .open = ssl_open, -+ .close = ssl_close, -+ .write = ssl_write, -+ .put_char = ssl_put_char, -+ .flush_chars = ssl_flush_chars, -+ .chars_in_buffer = ssl_chars_in_buffer, -+ .flush_buffer = ssl_flush_buffer, -+ .ioctl = ssl_ioctl, -+ .throttle = ssl_throttle, -+ .unthrottle = ssl_unthrottle, -+ .set_termios = ssl_set_termios, -+ .stop = ssl_stop, -+ .start = ssl_start, -+ .hangup = ssl_hangup -+}; -+ -+/* Changed by ssl_init and referenced by ssl_exit, which are both serialized -+ * by being an initcall and exitcall, respectively. -+ */ -+static int ssl_init_done = 0; -+ -+int ssl_init(void) -+{ -+ char *new_title; -+ -+ printk(KERN_INFO "Initializing software serial port version %d\n", -+ ssl_version); -+ -+ line_register_devfs(&lines, &driver, &ssl_driver, serial_lines, -+ sizeof(serial_lines)/sizeof(serial_lines[0])); -+ -+ lines_init(serial_lines, sizeof(serial_lines)/sizeof(serial_lines[0])); -+ -+ new_title = add_xterm_umid(opts.xterm_title); -+ if(new_title != NULL) opts.xterm_title = new_title; -+ -+ ssl_init_done = 1; -+ return(0); -+} -+ -+__initcall(ssl_init); -+ -+static int ssl_chan_setup(char *str) -+{ -+ line_setup(serial_lines, sizeof(serial_lines)/sizeof(serial_lines[0]), -+ str, 1); -+ return(1); -+} -+ -+__setup("ssl", ssl_chan_setup); -+__channel_help(ssl_chan_setup, "ssl"); -+ -+static void ssl_exit(void) -+{ -+ if(!ssl_init_done) return; -+ close_lines(serial_lines, -+ sizeof(serial_lines)/sizeof(serial_lines[0])); -+} -+ -+__uml_exitcall(ssl_exit); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/ssl.h um/arch/um/drivers/ssl.h ---- orig/arch/um/drivers/ssl.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/ssl.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,23 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SSL_H__ -+#define __SSL_H__ -+ -+extern int ssl_read(int fd, int line); -+extern void ssl_receive_char(int line, char ch); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/stdio_console.c um/arch/um/drivers/stdio_console.c ---- orig/arch/um/drivers/stdio_console.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/stdio_console.c 2002-12-15 21:08:20.000000000 -0500 -@@ -0,0 +1,250 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/posix_types.h" -+#include "linux/tty.h" -+#include "linux/tty_flip.h" -+#include "linux/types.h" -+#include "linux/major.h" -+#include "linux/kdev_t.h" -+#include "linux/console.h" -+#include "linux/string.h" -+#include "linux/sched.h" -+#include "linux/list.h" -+#include "linux/init.h" -+#include "linux/interrupt.h" -+#include "linux/slab.h" -+#include "asm/current.h" -+#include "asm/softirq.h" -+#include "asm/hardirq.h" -+#include "asm/irq.h" -+#include "stdio_console.h" -+#include "line.h" -+#include "chan_kern.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "irq_user.h" -+#include "mconsole_kern.h" -+#include "init.h" -+#include "2_5compat.h" -+ -+#define MAX_TTYS (8) -+ -+/* Referenced only by tty_driver below - presumably it's locked correctly -+ * by the tty driver. -+ */ -+ -+static struct tty_driver console_driver; -+ -+static int console_refcount = 0; -+ -+static struct chan_ops init_console_ops = { -+ .type = "you shouldn't see this", -+ .init = NULL, -+ .open = NULL, -+ .close = NULL, -+ .read = NULL, -+ .write = NULL, -+ .console_write = generic_write, -+ .window_size = NULL, -+ .free = NULL, -+ .winch = 0, -+}; -+ -+static struct chan init_console_chan = { -+ .list = { }, -+ .primary = 1, -+ .input = 0, -+ .output = 1, -+ .opened = 1, -+ .fd = 1, -+ .pri = INIT_STATIC, -+ .ops = &init_console_ops, -+ .data = NULL -+}; -+ -+void stdio_announce(char *dev_name, int dev) -+{ -+ printk(KERN_INFO "Virtual console %d assigned device '%s'\n", dev, -+ dev_name); -+} -+ -+static struct chan_opts opts = { -+ .announce = stdio_announce, -+ .xterm_title = "Virtual Console #%d", -+ .raw = 1, -+ .tramp_stack = 0, -+ .in_kernel = 1, -+}; -+ -+static int con_config(char *str); -+static int con_get_config(char *dev, char *str, int size, char **error_out); -+static int con_remove(char *str); -+ -+static struct line_driver driver = { -+ .name = "UML console", -+ .devfs_name = "vc/%d", -+ .major = TTY_MAJOR, -+ .minor_start = 0, -+ .type = TTY_DRIVER_TYPE_CONSOLE, -+ .subtype = SYSTEM_TYPE_CONSOLE, -+ .read_irq = CONSOLE_IRQ, -+ .read_irq_name = "console", -+ .write_irq = CONSOLE_WRITE_IRQ, -+ .write_irq_name = "console-write", -+ .symlink_from = "ttys", -+ .symlink_to = "vc", -+ .mc = { -+ .name = "con", -+ .config = con_config, -+ .get_config = con_get_config, -+ .remove = con_remove, -+ }, -+}; -+ -+static struct lines console_lines = LINES_INIT(MAX_TTYS); -+ -+/* The array is initialized by line_init, which is an initcall. The -+ * individual elements are protected by individual semaphores. -+ */ -+struct line vts[MAX_TTYS] = { LINE_INIT(CONFIG_CON_ZERO_CHAN, &driver), -+ [ 1 ... MAX_TTYS - 1 ] = -+ LINE_INIT(CONFIG_CON_CHAN, &driver) }; -+ -+static int con_config(char *str) -+{ -+ return(line_config(vts, sizeof(vts)/sizeof(vts[0]), str)); -+} -+ -+static int con_get_config(char *dev, char *str, int size, char **error_out) -+{ -+ return(line_get_config(dev, vts, sizeof(vts)/sizeof(vts[0]), str, -+ size, error_out)); -+} -+ -+static int con_remove(char *str) -+{ -+ return(line_remove(vts, sizeof(vts)/sizeof(vts[0]), str)); -+} -+ -+static int open_console(struct tty_struct *tty) -+{ -+ return(line_open(vts, tty, &opts)); -+} -+ -+static int con_open(struct tty_struct *tty, struct file *filp) -+{ -+ return(open_console(tty)); -+} -+ -+static void con_close(struct tty_struct *tty, struct file *filp) -+{ -+ line_close(vts, tty); -+} -+ -+static int con_write(struct tty_struct *tty, int from_user, -+ const unsigned char *buf, int count) -+{ -+ return(line_write(vts, tty, from_user, buf, count)); -+} -+ -+static void set_termios(struct tty_struct *tty, struct termios * old) -+{ -+} -+ -+static int chars_in_buffer(struct tty_struct *tty) -+{ -+ return(0); -+} -+ -+static int con_init_done = 0; -+ -+int stdio_init(void) -+{ -+ char *new_title; -+ -+ printk(KERN_INFO "Initializing stdio console driver\n"); -+ -+ line_register_devfs(&console_lines, &driver, &console_driver, vts, -+ sizeof(vts)/sizeof(vts[0])); -+ -+ lines_init(vts, sizeof(vts)/sizeof(vts[0])); -+ -+ new_title = add_xterm_umid(opts.xterm_title); -+ if(new_title != NULL) opts.xterm_title = new_title; -+ -+ open_console(NULL); -+ con_init_done = 1; -+ return(0); -+} -+ -+__initcall(stdio_init); -+ -+static void console_write(struct console *console, const char *string, -+ unsigned len) -+{ -+ if(con_init_done) down(&vts[console->index].sem); -+ console_write_chan(&vts[console->index].chan_list, string, len); -+ if(con_init_done) up(&vts[console->index].sem); -+} -+ -+static struct tty_driver console_driver = { -+ .refcount = &console_refcount, -+ .open = con_open, -+ .close = con_close, -+ .write = con_write, -+ .chars_in_buffer = chars_in_buffer, -+ .set_termios = set_termios -+}; -+ -+static kdev_t console_device(struct console *c) -+{ -+ return mk_kdev(TTY_MAJOR, c->index); -+} -+ -+static int console_setup(struct console *co, char *options) -+{ -+ return(0); -+} -+ -+static struct console stdiocons = INIT_CONSOLE("tty", console_write, -+ console_device, console_setup, -+ CON_PRINTBUFFER); -+ -+void stdio_console_init(void) -+{ -+ INIT_LIST_HEAD(&vts[0].chan_list); -+ list_add(&init_console_chan.list, &vts[0].chan_list); -+ register_console(&stdiocons); -+} -+ -+static int console_chan_setup(char *str) -+{ -+ line_setup(vts, sizeof(vts)/sizeof(vts[0]), str, 1); -+ return(1); -+} -+ -+__setup("con", console_chan_setup); -+__channel_help(console_chan_setup, "con"); -+ -+static void console_exit(void) -+{ -+ if(!con_init_done) return; -+ close_lines(vts, sizeof(vts)/sizeof(vts[0])); -+} -+ -+__uml_exitcall(console_exit); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/stdio_console.h um/arch/um/drivers/stdio_console.h ---- orig/arch/um/drivers/stdio_console.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/stdio_console.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,21 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __STDIO_CONSOLE_H -+#define __STDIO_CONSOLE_H -+ -+extern void save_console_flags(void); -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/tty.c um/arch/um/drivers/tty.c ---- orig/arch/um/drivers/tty.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/tty.c 2002-12-15 21:08:41.000000000 -0500 -@@ -0,0 +1,86 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <termios.h> -+#include <fcntl.h> -+#include <errno.h> -+#include <unistd.h> -+#include "chan_user.h" -+#include "user_util.h" -+#include "user.h" -+#include "os.h" -+ -+struct tty_chan { -+ char *dev; -+ int raw; -+ struct termios tt; -+}; -+ -+void *tty_chan_init(char *str, int device, struct chan_opts *opts) -+{ -+ struct tty_chan *data; -+ -+ if(*str != ':'){ -+ printk("tty_init : channel type 'tty' must specify " -+ "a device\n"); -+ return(NULL); -+ } -+ str++; -+ -+ if((data = um_kmalloc(sizeof(*data))) == NULL) -+ return(NULL); -+ *data = ((struct tty_chan) { .dev = str, -+ .raw = opts->raw }); -+ -+ return(data); -+} -+ -+int tty_open(int input, int output, int primary, void *d, char **dev_out) -+{ -+ struct tty_chan *data = d; -+ int fd; -+ -+ fd = os_open_file(data->dev, of_set_rw(OPENFLAGS(), input, output), 0); -+ if(fd < 0) return(fd); -+ if(data->raw){ -+ tcgetattr(fd, &data->tt); -+ raw(fd, 0); -+ } -+ -+ *dev_out = data->dev; -+ return(fd); -+} -+ -+int tty_console_write(int fd, const char *buf, int n, void *d) -+{ -+ struct tty_chan *data = d; -+ -+ return(generic_console_write(fd, buf, n, &data->tt)); -+} -+ -+struct chan_ops tty_ops = { -+ .type = "tty", -+ .init = tty_chan_init, -+ .open = tty_open, -+ .close = generic_close, -+ .read = generic_read, -+ .write = generic_write, -+ .console_write = tty_console_write, -+ .window_size = generic_window_size, -+ .free = generic_free, -+ .winch = 0, -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_kern.c um/arch/um/drivers/ubd_kern.c ---- orig/arch/um/drivers/ubd_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/ubd_kern.c 2003-03-11 15:46:36.000000000 -0500 -@@ -0,0 +1,1067 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+/* 2001-09-28...2002-04-17 -+ * Partition stuff by James_McMechan@hotmail.com -+ * old style ubd by setting UBD_SHIFT to 0 -+ */ -+ -+#define MAJOR_NR UBD_MAJOR -+#define UBD_SHIFT 4 -+ -+#include "linux/config.h" -+#include "linux/blk.h" -+#include "linux/blkdev.h" -+#include "linux/hdreg.h" -+#include "linux/init.h" -+#include "linux/devfs_fs_kernel.h" -+#include "linux/cdrom.h" -+#include "linux/proc_fs.h" -+#include "linux/ctype.h" -+#include "linux/capability.h" -+#include "linux/mm.h" -+#include "linux/vmalloc.h" -+#include "linux/blkpg.h" -+#include "linux/genhd.h" -+#include "linux/spinlock.h" -+#include "asm/segment.h" -+#include "asm/uaccess.h" -+#include "asm/irq.h" -+#include "asm/types.h" -+#include "user_util.h" -+#include "mem_user.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "mconsole_kern.h" -+#include "init.h" -+#include "irq_user.h" -+#include "ubd_user.h" -+#include "2_5compat.h" -+#include "os.h" -+ -+static int ubd_open(struct inode * inode, struct file * filp); -+static int ubd_release(struct inode * inode, struct file * file); -+static int ubd_ioctl(struct inode * inode, struct file * file, -+ unsigned int cmd, unsigned long arg); -+static int ubd_revalidate(kdev_t rdev); -+static int ubd_revalidate1(kdev_t rdev); -+ -+#define MAX_DEV (8) -+#define MAX_MINOR (MAX_DEV << UBD_SHIFT) -+ -+/* Not modified by this driver */ -+static int blk_sizes[MAX_MINOR] = { [ 0 ... MAX_MINOR - 1 ] = BLOCK_SIZE }; -+static int hardsect_sizes[MAX_MINOR] = { [ 0 ... MAX_MINOR - 1 ] = 512 }; -+ -+/* Protected by ubd_lock */ -+static int sizes[MAX_MINOR] = { [ 0 ... MAX_MINOR - 1 ] = 0 }; -+ -+static struct block_device_operations ubd_blops = { -+ .open = ubd_open, -+ .release = ubd_release, -+ .ioctl = ubd_ioctl, -+ .revalidate = ubd_revalidate, -+}; -+ -+/* Protected by ubd_lock, except in prepare_request and ubd_ioctl because -+ * the block layer should ensure that the device is idle before closing it. -+ */ -+static struct hd_struct ubd_part[MAX_MINOR] = -+ { [ 0 ... MAX_MINOR - 1 ] = { 0, 0, 0 } }; -+ -+/* Protected by io_request_lock */ -+static request_queue_t *ubd_queue; -+ -+/* Protected by ubd_lock */ -+static int fake_major = MAJOR_NR; -+ -+static spinlock_t ubd_lock = SPIN_LOCK_UNLOCKED; -+ -+#define INIT_GENDISK(maj, name, parts, shift, bsizes, max, blops) \ -+{ \ -+ .major = maj, \ -+ .major_name = name, \ -+ .minor_shift = shift, \ -+ .max_p = 1 << shift, \ -+ .part = parts, \ -+ .sizes = bsizes, \ -+ .nr_real = max, \ -+ .real_devices = NULL, \ -+ .next = NULL, \ -+ .fops = blops, \ -+ .de_arr = NULL, \ -+ .flags = 0 \ -+} -+ -+static struct gendisk ubd_gendisk = INIT_GENDISK(MAJOR_NR, "ubd", ubd_part, -+ UBD_SHIFT, sizes, MAX_DEV, -+ &ubd_blops); -+static struct gendisk fake_gendisk = INIT_GENDISK(0, "ubd", ubd_part, -+ UBD_SHIFT, sizes, MAX_DEV, -+ &ubd_blops); -+ -+#ifdef CONFIG_BLK_DEV_UBD_SYNC -+#define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 1, .c = 0, \ -+ .cl = 1 }) -+#else -+#define OPEN_FLAGS ((struct openflags) { .r = 1, .w = 1, .s = 0, .c = 0, \ -+ .cl = 1 }) -+#endif -+ -+/* Not protected - changed only in ubd_setup_common and then only to -+ * to enable O_SYNC. -+ */ -+static struct openflags global_openflags = OPEN_FLAGS; -+ -+struct cow { -+ char *file; -+ int fd; -+ unsigned long *bitmap; -+ unsigned long bitmap_len; -+ int bitmap_offset; -+ int data_offset; -+}; -+ -+struct ubd { -+ char *file; -+ int count; -+ int fd; -+ __u64 size; -+ struct openflags boot_openflags; -+ struct openflags openflags; -+ devfs_handle_t devfs; -+ struct cow cow; -+}; -+ -+#define DEFAULT_COW { \ -+ .file = NULL, \ -+ .fd = -1, \ -+ .bitmap = NULL, \ -+ .bitmap_offset = 0, \ -+ .data_offset = 0, \ -+} -+ -+#define DEFAULT_UBD { \ -+ .file = NULL, \ -+ .count = 0, \ -+ .fd = -1, \ -+ .size = -1, \ -+ .boot_openflags = OPEN_FLAGS, \ -+ .openflags = OPEN_FLAGS, \ -+ .devfs = NULL, \ -+ .cow = DEFAULT_COW, \ -+} -+ -+struct ubd ubd_dev[MAX_DEV] = { [ 0 ... MAX_DEV - 1 ] = DEFAULT_UBD }; -+ -+static int ubd0_init(void) -+{ -+ struct ubd *dev = &ubd_dev[0]; -+ -+ if(dev->file == NULL) -+ dev->file = "root_fs"; -+ return(0); -+} -+ -+__initcall(ubd0_init); -+ -+/* Only changed by fake_ide_setup which is a setup */ -+static int fake_ide = 0; -+static struct proc_dir_entry *proc_ide_root = NULL; -+static struct proc_dir_entry *proc_ide = NULL; -+ -+static void make_proc_ide(void) -+{ -+ proc_ide_root = proc_mkdir("ide", 0); -+ proc_ide = proc_mkdir("ide0", proc_ide_root); -+} -+ -+static int proc_ide_read_media(char *page, char **start, off_t off, int count, -+ int *eof, void *data) -+{ -+ int len; -+ -+ strcpy(page, "disk\n"); -+ len = strlen("disk\n"); -+ len -= off; -+ if (len < count){ -+ *eof = 1; -+ if (len <= 0) return 0; -+ } -+ else len = count; -+ *start = page + off; -+ return len; -+} -+ -+static void make_ide_entries(char *dev_name) -+{ -+ struct proc_dir_entry *dir, *ent; -+ char name[64]; -+ -+ if(!fake_ide) return; -+ -+ /* Without locking this could race if a UML was booted with no -+ * disks and then two mconsole requests which add disks came in -+ * at the same time. -+ */ -+ spin_lock(&ubd_lock); -+ if(proc_ide_root == NULL) make_proc_ide(); -+ spin_unlock(&ubd_lock); -+ -+ dir = proc_mkdir(dev_name, proc_ide); -+ if(!dir) return; -+ -+ ent = create_proc_entry("media", S_IFREG|S_IRUGO, dir); -+ if(!ent) return; -+ ent->nlink = 1; -+ ent->data = NULL; -+ ent->read_proc = proc_ide_read_media; -+ ent->write_proc = NULL; -+ sprintf(name,"ide0/%s", dev_name); -+ proc_symlink(dev_name, proc_ide_root, name); -+} -+ -+static int fake_ide_setup(char *str) -+{ -+ fake_ide = 1; -+ return(1); -+} -+ -+__setup("fake_ide", fake_ide_setup); -+ -+__uml_help(fake_ide_setup, -+"fake_ide\n" -+" Create ide0 entries that map onto ubd devices.\n\n" -+); -+ -+static int parse_unit(char **ptr) -+{ -+ char *str = *ptr, *end; -+ int n = -1; -+ -+ if(isdigit(*str)) { -+ n = simple_strtoul(str, &end, 0); -+ if(end == str) -+ return(-1); -+ *ptr = end; -+ } -+ else if (('a' <= *str) && (*str <= 'h')) { -+ n = *str - 'a'; -+ str++; -+ *ptr = str; -+ } -+ return(n); -+} -+ -+static int ubd_setup_common(char *str, int *index_out) -+{ -+ struct openflags flags = global_openflags; -+ struct ubd *dev; -+ char *backing_file; -+ int n, err; -+ -+ if(index_out) *index_out = -1; -+ n = *str; -+ if(n == '='){ -+ char *end; -+ int major; -+ -+ str++; -+ if(!strcmp(str, "sync")){ -+ global_openflags.s = 1; -+ return(0); -+ } -+ major = simple_strtoul(str, &end, 0); -+ if((*end != '\0') || (end == str)){ -+ printk(KERN_ERR -+ "ubd_setup : didn't parse major number\n"); -+ return(1); -+ } -+ -+ err = 1; -+ spin_lock(&ubd_lock); -+ if(fake_major != MAJOR_NR){ -+ printk(KERN_ERR "Can't assign a fake major twice\n"); -+ goto out1; -+ } -+ -+ fake_gendisk.major = major; -+ fake_major = major; -+ -+ printk(KERN_INFO "Setting extra ubd major number to %d\n", -+ major); -+ err = 0; -+ out1: -+ spin_unlock(&ubd_lock); -+ return(err); -+ } -+ -+ n = parse_unit(&str); -+ if(n < 0){ -+ printk(KERN_ERR "ubd_setup : couldn't parse unit number " -+ "'%s'\n", str); -+ return(1); -+ } -+ -+ if(n >= MAX_DEV){ -+ printk(KERN_ERR "ubd_setup : index %d out of range " -+ "(%d devices)\n", n, MAX_DEV); -+ return(1); -+ } -+ -+ err = 1; -+ spin_lock(&ubd_lock); -+ -+ dev = &ubd_dev[n]; -+ if(dev->file != NULL){ -+ printk(KERN_ERR "ubd_setup : device already configured\n"); -+ goto out2; -+ } -+ -+ if(index_out) *index_out = n; -+ -+ if (*str == 'r'){ -+ flags.w = 0; -+ str++; -+ } -+ if (*str == 's'){ -+ flags.s = 1; -+ str++; -+ } -+ if(*str++ != '='){ -+ printk(KERN_ERR "ubd_setup : Expected '='\n"); -+ goto out2; -+ } -+ -+ err = 0; -+ backing_file = strchr(str, ','); -+ if(backing_file){ -+ *backing_file = '\0'; -+ backing_file++; -+ } -+ dev->file = str; -+ dev->cow.file = backing_file; -+ dev->boot_openflags = flags; -+ out2: -+ spin_unlock(&ubd_lock); -+ return(err); -+} -+ -+static int ubd_setup(char *str) -+{ -+ ubd_setup_common(str, NULL); -+ return(1); -+} -+ -+__setup("ubd", ubd_setup); -+__uml_help(ubd_setup, -+"ubd<n>=<filename>\n" -+" This is used to associate a device with a file in the underlying\n" -+" filesystem. Usually, there is a filesystem in the file, but \n" -+" that's not required. Swap devices containing swap files can be\n" -+" specified like this. Also, a file which doesn't contain a\n" -+" filesystem can have its contents read in the virtual \n" -+" machine by running dd on the device. n must be in the range\n" -+" 0 to 7. Appending an 'r' to the number will cause that device\n" -+" to be mounted read-only. For example ubd1r=./ext_fs. Appending\n" -+" an 's' (has to be _after_ 'r', if there is one) will cause data\n" -+" to be written to disk on the host immediately.\n\n" -+); -+ -+static int fakehd(char *str) -+{ -+ printk(KERN_INFO -+ "fakehd : Changing ubd_gendisk.major_name to \"hd\".\n"); -+ ubd_gendisk.major_name = "hd"; -+ return(1); -+} -+ -+__setup("fakehd", fakehd); -+__uml_help(fakehd, -+"fakehd\n" -+" Change the ubd device name to \"hd\".\n\n" -+); -+ -+static void do_ubd_request(request_queue_t * q); -+ -+/* Only changed by ubd_init, which is an initcall. */ -+int thread_fd = -1; -+ -+/* Changed by ubd_handler, which is serialized because interrupts only -+ * happen on CPU 0. -+ */ -+int intr_count = 0; -+ -+static void ubd_finish(int error) -+{ -+ int nsect; -+ -+ if(error){ -+ end_request(0); -+ return; -+ } -+ nsect = CURRENT->current_nr_sectors; -+ CURRENT->sector += nsect; -+ CURRENT->buffer += nsect << 9; -+ CURRENT->errors = 0; -+ CURRENT->nr_sectors -= nsect; -+ CURRENT->current_nr_sectors = 0; -+ end_request(1); -+} -+ -+static void ubd_handler(void) -+{ -+ struct io_thread_req req; -+ int n; -+ -+ DEVICE_INTR = NULL; -+ intr_count++; -+ n = read_ubd_fs(thread_fd, &req, sizeof(req)); -+ if(n != sizeof(req)){ -+ printk(KERN_ERR "Pid %d - spurious interrupt in ubd_handler, " -+ "errno = %d\n", os_getpid(), -n); -+ spin_lock(&io_request_lock); -+ end_request(0); -+ spin_unlock(&io_request_lock); -+ return; -+ } -+ -+ if((req.offset != ((__u64) (CURRENT->sector)) << 9) || -+ (req.length != (CURRENT->current_nr_sectors) << 9)) -+ panic("I/O op mismatch"); -+ -+ spin_lock(&io_request_lock); -+ ubd_finish(req.error); -+ reactivate_fd(thread_fd, UBD_IRQ); -+ do_ubd_request(ubd_queue); -+ spin_unlock(&io_request_lock); -+} -+ -+static void ubd_intr(int irq, void *dev, struct pt_regs *unused) -+{ -+ ubd_handler(); -+} -+ -+/* Only changed by ubd_init, which is an initcall. */ -+static int io_pid = -1; -+ -+void kill_io_thread(void) -+{ -+ if(io_pid != -1) -+ os_kill_process(io_pid, 1); -+} -+ -+__uml_exitcall(kill_io_thread); -+ -+/* Initialized in an initcall, and unchanged thereafter */ -+devfs_handle_t ubd_dir_handle; -+ -+static int ubd_add(int n) -+{ -+ struct ubd *dev = &ubd_dev[n]; -+ char name[sizeof("nnnnnn\0")], dev_name[sizeof("ubd0x")]; -+ int err = -EISDIR; -+ -+ if(dev->file == NULL) -+ goto out; -+ -+ err = ubd_revalidate1(MKDEV(MAJOR_NR, n << UBD_SHIFT)); -+ if(err) -+ goto out; -+ -+ sprintf(name, "%d", n); -+ dev->devfs = devfs_register(ubd_dir_handle, name, DEVFS_FL_REMOVABLE, -+ MAJOR_NR, n << UBD_SHIFT, S_IFBLK | -+ S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP, -+ &ubd_blops, NULL); -+ -+ if(!strcmp(ubd_gendisk.major_name, "ubd")) -+ sprintf(dev_name, "%s%d", ubd_gendisk.major_name, n); -+ else sprintf(dev_name, "%s%c", ubd_gendisk.major_name, -+ n + 'a'); -+ -+ make_ide_entries(dev_name); -+ return(0); -+ -+ out: -+ return(err); -+} -+ -+static int ubd_config(char *str) -+{ -+ int n, err; -+ -+ str = uml_strdup(str); -+ if(str == NULL){ -+ printk(KERN_ERR "ubd_config failed to strdup string\n"); -+ return(1); -+ } -+ err = ubd_setup_common(str, &n); -+ if(err){ -+ kfree(str); -+ return(-1); -+ } -+ if(n == -1) return(0); -+ -+ spin_lock(&ubd_lock); -+ err = ubd_add(n); -+ if(err) -+ ubd_dev[n].file = NULL; -+ spin_unlock(&ubd_lock); -+ -+ return(err); -+} -+ -+static int ubd_get_config(char *name, char *str, int size, char **error_out) -+{ -+ struct ubd *dev; -+ char *end; -+ int n, len = 0; -+ -+ n = simple_strtoul(name, &end, 0); -+ if((*end != '\0') || (end == name)){ -+ *error_out = "ubd_get_config : didn't parse device number"; -+ return(-1); -+ } -+ -+ if((n >= MAX_DEV) || (n < 0)){ -+ *error_out = "ubd_get_config : device number out of range"; -+ return(-1); -+ } -+ -+ dev = &ubd_dev[n]; -+ spin_lock(&ubd_lock); -+ -+ if(dev->file == NULL){ -+ CONFIG_CHUNK(str, size, len, "", 1); -+ goto out; -+ } -+ -+ CONFIG_CHUNK(str, size, len, dev->file, 0); -+ -+ if(dev->cow.file != NULL){ -+ CONFIG_CHUNK(str, size, len, ",", 0); -+ CONFIG_CHUNK(str, size, len, dev->cow.file, 1); -+ } -+ else CONFIG_CHUNK(str, size, len, "", 1); -+ -+ out: -+ spin_unlock(&ubd_lock); -+ return(len); -+} -+ -+static int ubd_remove(char *str) -+{ -+ struct ubd *dev; -+ int n, err = -ENODEV; -+ -+ if(isdigit(*str)){ -+ char *end; -+ n = simple_strtoul(str, &end, 0); -+ if ((*end != '\0') || (end == str)) -+ return(err); -+ } -+ else if (('a' <= *str) && (*str <= 'h')) -+ n = *str - 'a'; -+ else -+ return(err); /* it should be a number 0-7/a-h */ -+ -+ if((n < 0) || (n >= MAX_DEV)) -+ return(err); -+ -+ dev = &ubd_dev[n]; -+ -+ spin_lock(&ubd_lock); -+ err = 0; -+ if(dev->file == NULL) -+ goto out; -+ err = -1; -+ if(dev->count > 0) -+ goto out; -+ if(dev->devfs != NULL) -+ devfs_unregister(dev->devfs); -+ -+ *dev = ((struct ubd) DEFAULT_UBD); -+ err = 0; -+ out: -+ spin_unlock(&ubd_lock); -+ return(err); -+} -+ -+static struct mc_device ubd_mc = { -+ .name = "ubd", -+ .config = ubd_config, -+ .get_config = ubd_get_config, -+ .remove = ubd_remove, -+}; -+ -+static int ubd_mc_init(void) -+{ -+ mconsole_register_dev(&ubd_mc); -+ return(0); -+} -+ -+__initcall(ubd_mc_init); -+ -+static request_queue_t *ubd_get_queue(kdev_t device) -+{ -+ return(ubd_queue); -+} -+ -+int ubd_init(void) -+{ -+ unsigned long stack; -+ int i, err; -+ -+ ubd_dir_handle = devfs_mk_dir (NULL, "ubd", NULL); -+ if (devfs_register_blkdev(MAJOR_NR, "ubd", &ubd_blops)) { -+ printk(KERN_ERR "ubd: unable to get major %d\n", MAJOR_NR); -+ return -1; -+ } -+ read_ahead[MAJOR_NR] = 8; /* 8 sector (4kB) read-ahead */ -+ blksize_size[MAJOR_NR] = blk_sizes; -+ blk_size[MAJOR_NR] = sizes; -+ INIT_HARDSECT(hardsect_size, MAJOR_NR, hardsect_sizes); -+ -+ ubd_queue = BLK_DEFAULT_QUEUE(MAJOR_NR); -+ blk_init_queue(ubd_queue, DEVICE_REQUEST); -+ INIT_ELV(ubd_queue, &ubd_queue->elevator); -+ -+ add_gendisk(&ubd_gendisk); -+ if (fake_major != MAJOR_NR){ -+ /* major number 0 is used to auto select */ -+ err = devfs_register_blkdev(fake_major, "fake", &ubd_blops); -+ if(fake_major == 0){ -+ /* auto device number case */ -+ fake_major = err; -+ if(err == 0) -+ return(-ENODEV); -+ } -+ else if (err){ -+ /* not auto so normal error */ -+ printk(KERN_ERR "ubd: error %d getting major %d\n", -+ err, fake_major); -+ return(-ENODEV); -+ } -+ -+ blk_dev[fake_major].queue = ubd_get_queue; -+ read_ahead[fake_major] = 8; /* 8 sector (4kB) read-ahead */ -+ blksize_size[fake_major] = blk_sizes; -+ blk_size[fake_major] = sizes; -+ INIT_HARDSECT(hardsect_size, fake_major, hardsect_sizes); -+ add_gendisk(&fake_gendisk); -+ } -+ -+ for(i=0;i<MAX_DEV;i++) -+ ubd_add(i); -+ -+ if(global_openflags.s){ -+ printk(KERN_INFO "ubd : Synchronous mode\n"); -+ return(0); -+ } -+ stack = alloc_stack(0, 0); -+ io_pid = start_io_thread(stack + PAGE_SIZE - sizeof(void *), -+ &thread_fd); -+ if(io_pid < 0){ -+ printk(KERN_ERR -+ "ubd : Failed to start I/O thread (errno = %d) - " -+ "falling back to synchronous I/O\n", -io_pid); -+ return(0); -+ } -+ err = um_request_irq(UBD_IRQ, thread_fd, IRQ_READ, ubd_intr, -+ SA_INTERRUPT, "ubd", ubd_dev); -+ if(err != 0) printk(KERN_ERR -+ "um_request_irq failed - errno = %d\n", -err); -+ return(err); -+} -+ -+__initcall(ubd_init); -+ -+static void ubd_close(struct ubd *dev) -+{ -+ os_close_file(dev->fd); -+ if(dev->cow.file != NULL) { -+ os_close_file(dev->cow.fd); -+ vfree(dev->cow.bitmap); -+ dev->cow.bitmap = NULL; -+ } -+} -+ -+static int ubd_open_dev(struct ubd *dev) -+{ -+ struct openflags flags; -+ int err, create_cow, *create_ptr; -+ -+ dev->openflags = dev->boot_openflags; -+ create_cow = 0; -+ create_ptr = (dev->cow.file != NULL) ? &create_cow : NULL; -+ dev->fd = open_ubd_file(dev->file, &dev->openflags, &dev->cow.file, -+ &dev->cow.bitmap_offset, &dev->cow.bitmap_len, -+ &dev->cow.data_offset, create_ptr); -+ -+ if((dev->fd == -ENOENT) && create_cow){ -+ dev->fd = create_cow_file(dev->file, dev->cow.file, -+ dev->openflags, 1 << 9, -+ &dev->cow.bitmap_offset, -+ &dev->cow.bitmap_len, -+ &dev->cow.data_offset); -+ if(dev->fd >= 0){ -+ printk(KERN_INFO "Creating \"%s\" as COW file for " -+ "\"%s\"\n", dev->file, dev->cow.file); -+ } -+ } -+ -+ if(dev->fd < 0) return(dev->fd); -+ -+ if(dev->cow.file != NULL){ -+ err = -ENOMEM; -+ dev->cow.bitmap = (void *) vmalloc(dev->cow.bitmap_len); -+ if(dev->cow.bitmap == NULL) goto error; -+ flush_tlb_kernel_vm(); -+ -+ err = read_cow_bitmap(dev->fd, dev->cow.bitmap, -+ dev->cow.bitmap_offset, -+ dev->cow.bitmap_len); -+ if(err) goto error; -+ -+ flags = dev->openflags; -+ flags.w = 0; -+ err = open_ubd_file(dev->cow.file, &flags, NULL, NULL, NULL, -+ NULL, NULL); -+ if(err < 0) goto error; -+ dev->cow.fd = err; -+ } -+ return(0); -+ error: -+ os_close_file(dev->fd); -+ return(err); -+} -+ -+static int ubd_file_size(struct ubd *dev, __u64 *size_out) -+{ -+ char *file; -+ -+ file = dev->cow.file ? dev->cow.file : dev->file; -+ return(os_file_size(file, size_out)); -+} -+ -+static int ubd_open(struct inode *inode, struct file *filp) -+{ -+ struct ubd *dev; -+ int n, offset, err = 0; -+ -+ n = DEVICE_NR(inode->i_rdev); -+ dev = &ubd_dev[n]; -+ if(n >= MAX_DEV) -+ return -ENODEV; -+ -+ spin_lock(&ubd_lock); -+ offset = n << UBD_SHIFT; -+ -+ if(dev->count == 0){ -+ err = ubd_open_dev(dev); -+ if(err){ -+ printk(KERN_ERR "ubd%d: Can't open \"%s\": " -+ "errno = %d\n", n, dev->file, -err); -+ goto out; -+ } -+ err = ubd_file_size(dev, &dev->size); -+ if(err) -+ goto out; -+ sizes[offset] = dev->size / BLOCK_SIZE; -+ ubd_part[offset].nr_sects = dev->size / hardsect_sizes[offset]; -+ } -+ dev->count++; -+ if((filp->f_mode & FMODE_WRITE) && !dev->openflags.w){ -+ if(--dev->count == 0) ubd_close(dev); -+ err = -EROFS; -+ } -+ out: -+ spin_unlock(&ubd_lock); -+ return(err); -+} -+ -+static int ubd_release(struct inode * inode, struct file * file) -+{ -+ int n, offset; -+ -+ n = DEVICE_NR(inode->i_rdev); -+ offset = n << UBD_SHIFT; -+ if(n >= MAX_DEV) -+ return -ENODEV; -+ -+ spin_lock(&ubd_lock); -+ if(--ubd_dev[n].count == 0) -+ ubd_close(&ubd_dev[n]); -+ spin_unlock(&ubd_lock); -+ -+ return(0); -+} -+ -+void cowify_req(struct io_thread_req *req, struct ubd *dev) -+{ -+ int i, update_bitmap, sector = req->offset >> 9; -+ -+ if(req->length > (sizeof(req->sector_mask) * 8) << 9) -+ panic("Operation too long"); -+ if(req->op == UBD_READ) { -+ for(i = 0; i < req->length >> 9; i++){ -+ if(ubd_test_bit(sector + i, (unsigned char *) -+ dev->cow.bitmap)){ -+ ubd_set_bit(i, (unsigned char *) -+ &req->sector_mask); -+ } -+ } -+ } -+ else { -+ update_bitmap = 0; -+ for(i = 0; i < req->length >> 9; i++){ -+ ubd_set_bit(i, (unsigned char *) -+ &req->sector_mask); -+ if(!ubd_test_bit(sector + i, (unsigned char *) -+ dev->cow.bitmap)) -+ update_bitmap = 1; -+ ubd_set_bit(sector + i, (unsigned char *) -+ dev->cow.bitmap); -+ } -+ if(update_bitmap){ -+ req->cow_offset = sector / (sizeof(unsigned long) * 8); -+ req->bitmap_words[0] = -+ dev->cow.bitmap[req->cow_offset]; -+ req->bitmap_words[1] = -+ dev->cow.bitmap[req->cow_offset + 1]; -+ req->cow_offset *= sizeof(unsigned long); -+ req->cow_offset += dev->cow.bitmap_offset; -+ } -+ } -+} -+ -+static int prepare_request(struct request *req, struct io_thread_req *io_req) -+{ -+ struct ubd *dev; -+ __u64 block; -+ int nsect, minor, n; -+ -+ if(req->rq_status == RQ_INACTIVE) return(1); -+ -+ minor = MINOR(req->rq_dev); -+ n = minor >> UBD_SHIFT; -+ dev = &ubd_dev[n]; -+ if(IS_WRITE(req) && !dev->openflags.w){ -+ printk("Write attempted on readonly ubd device %d\n", n); -+ end_request(0); -+ return(1); -+ } -+ -+ req->sector += ubd_part[minor].start_sect; -+ block = req->sector; -+ nsect = req->current_nr_sectors; -+ -+ io_req->op = (req->cmd == READ) ? UBD_READ : UBD_WRITE; -+ io_req->fds[0] = (dev->cow.file != NULL) ? dev->cow.fd : dev->fd; -+ io_req->fds[1] = dev->fd; -+ io_req->offsets[0] = 0; -+ io_req->offsets[1] = dev->cow.data_offset; -+ io_req->offset = ((__u64) block) << 9; -+ io_req->length = nsect << 9; -+ io_req->buffer = req->buffer; -+ io_req->sectorsize = 1 << 9; -+ io_req->sector_mask = 0; -+ io_req->cow_offset = -1; -+ io_req->error = 0; -+ -+ if(dev->cow.file != NULL) cowify_req(io_req, dev); -+ return(0); -+} -+ -+static void do_ubd_request(request_queue_t *q) -+{ -+ struct io_thread_req io_req; -+ struct request *req; -+ int err, n; -+ -+ if(thread_fd == -1){ -+ while(!list_empty(&q->queue_head)){ -+ req = blkdev_entry_next_request(&q->queue_head); -+ err = prepare_request(req, &io_req); -+ if(!err){ -+ do_io(&io_req); -+ ubd_finish(io_req.error); -+ } -+ } -+ } -+ else { -+ if(DEVICE_INTR || list_empty(&q->queue_head)) return; -+ req = blkdev_entry_next_request(&q->queue_head); -+ err = prepare_request(req, &io_req); -+ if(!err){ -+ SET_INTR(ubd_handler); -+ n = write_ubd_fs(thread_fd, (char *) &io_req, -+ sizeof(io_req)); -+ if(n != sizeof(io_req)) -+ printk("write to io thread failed, " -+ "errno = %d\n", -n); -+ } -+ } -+} -+ -+static int ubd_ioctl(struct inode * inode, struct file * file, -+ unsigned int cmd, unsigned long arg) -+{ -+ struct hd_geometry *loc = (struct hd_geometry *) arg; -+ struct ubd *dev; -+ int n, minor, err; -+ struct hd_driveid ubd_id = { -+ .cyls = 0, -+ .heads = 128, -+ .sectors = 32, -+ }; -+ -+ if(!inode) return(-EINVAL); -+ minor = MINOR(inode->i_rdev); -+ n = minor >> UBD_SHIFT; -+ if(n >= MAX_DEV) -+ return(-EINVAL); -+ dev = &ubd_dev[n]; -+ switch (cmd) { -+ struct hd_geometry g; -+ struct cdrom_volctrl volume; -+ case HDIO_GETGEO: -+ if(!loc) return(-EINVAL); -+ g.heads = 128; -+ g.sectors = 32; -+ g.cylinders = dev->size / (128 * 32 * hardsect_sizes[minor]); -+ g.start = 2; -+ return(copy_to_user(loc, &g, sizeof(g)) ? -EFAULT : 0); -+ case BLKGETSIZE: /* Return device size */ -+ if(!arg) return(-EINVAL); -+ err = verify_area(VERIFY_WRITE, (long *) arg, sizeof(long)); -+ if(err) -+ return(err); -+ put_user(ubd_part[minor].nr_sects, (long *) arg); -+ return(0); -+ case BLKRRPART: /* Re-read partition tables */ -+ return(ubd_revalidate(inode->i_rdev)); -+ -+ case HDIO_SET_UNMASKINTR: -+ if(!capable(CAP_SYS_ADMIN)) return(-EACCES); -+ if((arg > 1) || (minor & 0x3F)) return(-EINVAL); -+ return(0); -+ -+ case HDIO_GET_UNMASKINTR: -+ if(!arg) return(-EINVAL); -+ err = verify_area(VERIFY_WRITE, (long *) arg, sizeof(long)); -+ if(err) -+ return(err); -+ return(0); -+ -+ case HDIO_GET_MULTCOUNT: -+ if(!arg) return(-EINVAL); -+ err = verify_area(VERIFY_WRITE, (long *) arg, sizeof(long)); -+ if(err) -+ return(err); -+ return(0); -+ -+ case HDIO_SET_MULTCOUNT: -+ if(!capable(CAP_SYS_ADMIN)) return(-EACCES); -+ if(MINOR(inode->i_rdev) & 0x3F) return(-EINVAL); -+ return(0); -+ -+ case HDIO_GET_IDENTITY: -+ ubd_id.cyls = dev->size / (128 * 32 * hardsect_sizes[minor]); -+ if(copy_to_user((char *) arg, (char *) &ubd_id, -+ sizeof(ubd_id))) -+ return(-EFAULT); -+ return(0); -+ -+ case CDROMVOLREAD: -+ if(copy_from_user(&volume, (char *) arg, sizeof(volume))) -+ return(-EFAULT); -+ volume.channel0 = 255; -+ volume.channel1 = 255; -+ volume.channel2 = 255; -+ volume.channel3 = 255; -+ if(copy_to_user((char *) arg, &volume, sizeof(volume))) -+ return(-EFAULT); -+ return(0); -+ -+ default: -+ return blk_ioctl(inode->i_rdev, cmd, arg); -+ } -+} -+ -+static int ubd_revalidate1(kdev_t rdev) -+{ -+ int i, n, offset, err = 0, pcount = 1 << UBD_SHIFT; -+ struct ubd *dev; -+ struct hd_struct *part; -+ -+ n = DEVICE_NR(rdev); -+ offset = n << UBD_SHIFT; -+ dev = &ubd_dev[n]; -+ -+ part = &ubd_part[offset]; -+ -+ /* clear all old partition counts */ -+ for(i = 1; i < pcount; i++) { -+ part[i].start_sect = 0; -+ part[i].nr_sects = 0; -+ } -+ -+ /* If it already has been opened we can check the partitions -+ * directly -+ */ -+ if(dev->count){ -+ part->start_sect = 0; -+ register_disk(&ubd_gendisk, MKDEV(MAJOR_NR, offset), pcount, -+ &ubd_blops, part->nr_sects); -+ } -+ else if(dev->file){ -+ err = ubd_open_dev(dev); -+ if(err){ -+ printk(KERN_ERR "unable to open %s for validation\n", -+ dev->file); -+ goto out; -+ } -+ -+ /* have to recompute sizes since we opened it */ -+ err = ubd_file_size(dev, &dev->size); -+ if(err) { -+ ubd_close(dev); -+ goto out; -+ } -+ part->start_sect = 0; -+ part->nr_sects = dev->size / hardsect_sizes[offset]; -+ register_disk(&ubd_gendisk, MKDEV(MAJOR_NR, offset), pcount, -+ &ubd_blops, part->nr_sects); -+ -+ /* we are done so close it */ -+ ubd_close(dev); -+ } -+ else err = -ENODEV; -+ out: -+ return(err); -+} -+ -+static int ubd_revalidate(kdev_t rdev) -+{ -+ int err; -+ -+ spin_lock(&ubd_lock); -+ err = ubd_revalidate1(rdev); -+ spin_unlock(&ubd_lock); -+ return(err); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/ubd_user.c um/arch/um/drivers/ubd_user.c ---- orig/arch/um/drivers/ubd_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/ubd_user.c 2003-06-05 14:39:22.000000000 -0400 -@@ -0,0 +1,372 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Copyright (C) 2001 Ridgerun,Inc (glonnon@ridgerun.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stddef.h> -+#include <unistd.h> -+#include <errno.h> -+#include <sched.h> -+#include <signal.h> -+#include <string.h> -+#include <netinet/in.h> -+#include <sys/stat.h> -+#include <sys/time.h> -+#include <sys/fcntl.h> -+#include <sys/socket.h> -+#include <string.h> -+#include <sys/mman.h> -+#include <sys/param.h> -+#include "asm/types.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "ubd_user.h" -+#include "os.h" -+#include "cow.h" -+ -+#include <endian.h> -+#include <byteswap.h> -+ -+static int same_backing_files(char *from_cmdline, char *from_cow, char *cow) -+{ -+ struct stat64 buf1, buf2; -+ -+ if(from_cmdline == NULL) return(1); -+ if(!strcmp(from_cmdline, from_cow)) return(1); -+ -+ if(stat64(from_cmdline, &buf1) < 0){ -+ printk("Couldn't stat '%s', errno = %d\n", from_cmdline, -+ errno); -+ return(1); -+ } -+ if(stat64(from_cow, &buf2) < 0){ -+ printk("Couldn't stat '%s', errno = %d\n", from_cow, errno); -+ return(1); -+ } -+ if((buf1.st_dev == buf2.st_dev) && (buf1.st_ino == buf2.st_ino)) -+ return(1); -+ -+ printk("Backing file mismatch - \"%s\" requested,\n" -+ "\"%s\" specified in COW header of \"%s\"\n", -+ from_cmdline, from_cow, cow); -+ return(0); -+} -+ -+static int backing_file_mismatch(char *file, __u64 size, time_t mtime) -+{ -+ struct stat64 buf; -+ long long actual; -+ int err; -+ -+ printk("%ld", htonll(size)); -+ if(stat64(file, &buf) < 0){ -+ printk("Failed to stat backing file \"%s\", errno = %d\n", -+ file, errno); -+ return(-errno); -+ } -+ -+ err = os_file_size(file, &actual); -+ if(err){ -+ printk("Failed to get size of backing file \"%s\", " -+ "errno = %d\n", file, -err); -+ return(err); -+ } -+ -+ if(actual != size){ -+ printk("Size mismatch (%ld vs %ld) of COW header vs backing " -+ "file\n", size, actual); -+ return(-EINVAL); -+ } -+ if(buf.st_mtime != mtime){ -+ printk("mtime mismatch (%ld vs %ld) of COW header vs backing " -+ "file\n", mtime, buf.st_mtime); -+ return(-EINVAL); -+ } -+ return(0); -+} -+ -+int read_cow_bitmap(int fd, void *buf, int offset, int len) -+{ -+ int err; -+ -+ err = os_seek_file(fd, offset); -+ if(err != 0) return(-errno); -+ err = read(fd, buf, len); -+ if(err < 0) return(-errno); -+ return(0); -+} -+ -+int open_ubd_file(char *file, struct openflags *openflags, -+ char **backing_file_out, int *bitmap_offset_out, -+ unsigned long *bitmap_len_out, int *data_offset_out, -+ int *create_cow_out) -+{ -+ time_t mtime; -+ __u64 size; -+ char *backing_file; -+ int fd, err, sectorsize, magic, same, mode = 0644; -+ -+ if((fd = os_open_file(file, *openflags, mode)) < 0){ -+ if((fd == -ENOENT) && (create_cow_out != NULL)) -+ *create_cow_out = 1; -+ if(!openflags->w || -+ ((errno != EROFS) && (errno != EACCES))) return(-errno); -+ openflags->w = 0; -+ if((fd = os_open_file(file, *openflags, mode)) < 0) -+ return(fd); -+ } -+ -+ err = os_lock_file(fd, openflags->w); -+ if(err){ -+ printk("Failed to lock '%s', errno = %d\n", file, -err); -+ goto error; -+ } -+ -+ if(backing_file_out == NULL) return(fd); -+ -+ err = read_cow_header(fd, &magic, &backing_file, &mtime, &size, -+ §orsize, bitmap_offset_out); -+ if(err && (*backing_file_out != NULL)){ -+ printk("Failed to read COW header from COW file \"%s\", " -+ "errno = %d\n", file, err); -+ goto error; -+ } -+ if(err) return(fd); -+ -+ if(backing_file_out == NULL) return(fd); -+ -+ same = same_backing_files(*backing_file_out, backing_file, file); -+ -+ if(!same && !backing_file_mismatch(*backing_file_out, size, mtime)){ -+ printk("Switching backing file to '%s'\n", *backing_file_out); -+ err = write_cow_header(file, fd, *backing_file_out, -+ sectorsize, &size); -+ if(err){ -+ printk("Switch failed, errno = %d\n", err); -+ return(err); -+ } -+ } -+ else { -+ *backing_file_out = backing_file; -+ err = backing_file_mismatch(*backing_file_out, size, mtime); -+ if(err) goto error; -+ } -+ -+ cow_sizes(size, sectorsize, *bitmap_offset_out, bitmap_len_out, -+ data_offset_out); -+ -+ return(fd); -+ error: -+ os_close_file(fd); -+ return(err); -+} -+ -+int create_cow_file(char *cow_file, char *backing_file, struct openflags flags, -+ int sectorsize, int *bitmap_offset_out, -+ unsigned long *bitmap_len_out, int *data_offset_out) -+{ -+ int err, fd; -+ -+ flags.c = 1; -+ fd = open_ubd_file(cow_file, &flags, NULL, NULL, NULL, NULL, NULL); -+ if(fd < 0){ -+ err = fd; -+ printk("Open of COW file '%s' failed, errno = %d\n", cow_file, -+ -err); -+ goto out; -+ } -+ -+ err = init_cow_file(fd, cow_file, backing_file, sectorsize, -+ bitmap_offset_out, bitmap_len_out, -+ data_offset_out); -+ if(!err) -+ return(fd); -+ -+ os_close_file(fd); -+ out: -+ return(err); -+} -+ -+int read_ubd_fs(int fd, void *buffer, int len) -+{ -+ int n; -+ -+ n = read(fd, buffer, len); -+ if(n < 0) return(-errno); -+ else return(n); -+} -+ -+int write_ubd_fs(int fd, char *buffer, int len) -+{ -+ int n; -+ -+ n = write(fd, buffer, len); -+ if(n < 0) return(-errno); -+ else return(n); -+} -+ -+void do_io(struct io_thread_req *req) -+{ -+ char *buf; -+ unsigned long len; -+ int n, nsectors, start, end, bit; -+ __u64 off; -+ -+ nsectors = req->length / req->sectorsize; -+ start = 0; -+ do { -+ bit = ubd_test_bit(start, (unsigned char *) &req->sector_mask); -+ end = start; -+ while((end < nsectors) && -+ (ubd_test_bit(end, (unsigned char *) -+ &req->sector_mask) == bit)) -+ end++; -+ -+ if(end != nsectors) -+ printk("end != nsectors\n"); -+ off = req->offset + req->offsets[bit] + -+ start * req->sectorsize; -+ len = (end - start) * req->sectorsize; -+ buf = &req->buffer[start * req->sectorsize]; -+ -+ if(os_seek_file(req->fds[bit], off) != 0){ -+ printk("do_io - lseek failed : errno = %d\n", errno); -+ req->error = 1; -+ return; -+ } -+ if(req->op == UBD_READ){ -+ n = 0; -+ do { -+ buf = &buf[n]; -+ len -= n; -+ n = read(req->fds[bit], buf, len); -+ if (n < 0) { -+ printk("do_io - read returned %d : " -+ "errno = %d fd = %d\n", n, -+ errno, req->fds[bit]); -+ req->error = 1; -+ return; -+ } -+ } while((n < len) && (n != 0)); -+ if (n < len) memset(&buf[n], 0, len - n); -+ } -+ else { -+ n = write(req->fds[bit], buf, len); -+ if(n != len){ -+ printk("do_io - write returned %d : " -+ "errno = %d fd = %d\n", n, -+ errno, req->fds[bit]); -+ req->error = 1; -+ return; -+ } -+ } -+ -+ start = end; -+ } while(start < nsectors); -+ -+ if(req->cow_offset != -1){ -+ if(os_seek_file(req->fds[1], req->cow_offset) != 0){ -+ printk("do_io - bitmap lseek failed : errno = %d\n", -+ errno); -+ req->error = 1; -+ return; -+ } -+ n = write(req->fds[1], &req->bitmap_words, -+ sizeof(req->bitmap_words)); -+ if(n != sizeof(req->bitmap_words)){ -+ printk("do_io - bitmap update returned %d : " -+ "errno = %d fd = %d\n", n, errno, req->fds[1]); -+ req->error = 1; -+ return; -+ } -+ } -+ req->error = 0; -+ return; -+} -+ -+/* Changed in start_io_thread, which is serialized by being called only -+ * from ubd_init, which is an initcall. -+ */ -+int kernel_fd = -1; -+ -+/* Only changed by the io thread */ -+int io_count = 0; -+ -+int io_thread(void *arg) -+{ -+ struct io_thread_req req; -+ int n; -+ -+ signal(SIGWINCH, SIG_IGN); -+ while(1){ -+ n = read(kernel_fd, &req, sizeof(req)); -+ if(n < 0) printk("io_thread - read returned %d, errno = %d\n", -+ n, errno); -+ else if(n < sizeof(req)){ -+ printk("io_thread - short read : length = %d\n", n); -+ continue; -+ } -+ io_count++; -+ do_io(&req); -+ n = write(kernel_fd, &req, sizeof(req)); -+ if(n != sizeof(req)) -+ printk("io_thread - write failed, errno = %d\n", -+ errno); -+ } -+} -+ -+int start_io_thread(unsigned long sp, int *fd_out) -+{ -+ int pid, fds[2], err; -+ -+ err = os_pipe(fds, 1, 1); -+ if(err){ -+ printk("start_io_thread - os_pipe failed, errno = %d\n", -err); -+ return(-1); -+ } -+ kernel_fd = fds[0]; -+ *fd_out = fds[1]; -+ -+ pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM | SIGCHLD, -+ NULL); -+ if(pid < 0){ -+ printk("start_io_thread - clone failed : errno = %d\n", errno); -+ return(-errno); -+ } -+ return(pid); -+} -+ -+#ifdef notdef -+int start_io_thread(unsigned long sp, int *fd_out) -+{ -+ int pid; -+ -+ if((kernel_fd = get_pty()) < 0) return(-1); -+ raw(kernel_fd, 0); -+ if((*fd_out = open(ptsname(kernel_fd), O_RDWR)) < 0){ -+ printk("Couldn't open tty for IO\n"); -+ return(-1); -+ } -+ -+ pid = clone(io_thread, (void *) sp, CLONE_FILES | CLONE_VM | SIGCHLD, -+ NULL); -+ if(pid < 0){ -+ printk("start_io_thread - clone failed : errno = %d\n", errno); -+ return(-errno); -+ } -+ return(pid); -+} -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm.c um/arch/um/drivers/xterm.c ---- orig/arch/um/drivers/xterm.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/xterm.c 2002-12-30 20:49:22.000000000 -0500 -@@ -0,0 +1,200 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <string.h> -+#include <errno.h> -+#include <fcntl.h> -+#include <termios.h> -+#include <signal.h> -+#include <sched.h> -+#include <sys/socket.h> -+#include "kern_util.h" -+#include "chan_user.h" -+#include "helper.h" -+#include "user_util.h" -+#include "user.h" -+#include "os.h" -+#include "xterm.h" -+ -+struct xterm_chan { -+ int pid; -+ int helper_pid; -+ char *title; -+ int device; -+ int raw; -+ struct termios tt; -+ unsigned long stack; -+ int direct_rcv; -+}; -+ -+void *xterm_init(char *str, int device, struct chan_opts *opts) -+{ -+ struct xterm_chan *data; -+ -+ if((data = malloc(sizeof(*data))) == NULL) return(NULL); -+ *data = ((struct xterm_chan) { .pid = -1, -+ .helper_pid = -1, -+ .device = device, -+ .title = opts->xterm_title, -+ .raw = opts->raw, -+ .stack = opts->tramp_stack, -+ .direct_rcv = !opts->in_kernel } ); -+ return(data); -+} -+ -+/* Only changed by xterm_setup, which is a setup */ -+static char *terminal_emulator = "xterm"; -+static char *title_switch = "-T"; -+static char *exec_switch = "-e"; -+ -+static int __init xterm_setup(char *line, int *add) -+{ -+ *add = 0; -+ terminal_emulator = line; -+ -+ line = strchr(line, ','); -+ if(line == NULL) return(0); -+ *line++ = '\0'; -+ if(*line) title_switch = line; -+ -+ line = strchr(line, ','); -+ if(line == NULL) return(0); -+ *line++ = '\0'; -+ if(*line) exec_switch = line; -+ -+ return(0); -+} -+ -+__uml_setup("xterm=", xterm_setup, -+"xterm=<terminal emulator>,<title switch>,<exec switch>\n" -+" Specifies an alternate terminal emulator to use for the debugger,\n" -+" consoles, and serial lines when they are attached to the xterm channel.\n" -+" The values are the terminal emulator binary, the switch it uses to set\n" -+" its title, and the switch it uses to execute a subprocess,\n" -+" respectively. The title switch must have the form '<switch> title',\n" -+" not '<switch>=title'. Similarly, the exec switch must have the form\n" -+" '<switch> command arg1 arg2 ...'.\n" -+" The default values are 'xterm=xterm,-T,-e'. Values for gnome-terminal\n" -+" are 'xterm=gnome-terminal,-t,-x'.\n\n" -+); -+ -+int xterm_open(int input, int output, int primary, void *d, char **dev_out) -+{ -+ struct xterm_chan *data = d; -+ unsigned long stack; -+ int pid, fd, new, err; -+ char title[256], file[] = "/tmp/xterm-pipeXXXXXX"; -+ char *argv[] = { terminal_emulator, title_switch, title, exec_switch, -+ "/usr/lib/uml/port-helper", "-uml-socket", -+ file, NULL }; -+ -+ if(access(argv[4], X_OK)) -+ argv[4] = "port-helper"; -+ -+ fd = mkstemp(file); -+ if(fd < 0){ -+ printk("xterm_open : mkstemp failed, errno = %d\n", errno); -+ return(-errno); -+ } -+ -+ if(unlink(file)){ -+ printk("xterm_open : unlink failed, errno = %d\n", errno); -+ return(-errno); -+ } -+ close(fd); -+ -+ fd = create_unix_socket(file, sizeof(file)); -+ if(fd < 0){ -+ printk("xterm_open : create_unix_socket failed, errno = %d\n", -+ -fd); -+ return(-fd); -+ } -+ -+ sprintf(title, data->title, data->device); -+ stack = data->stack; -+ pid = run_helper(NULL, NULL, argv, &stack); -+ if(pid < 0){ -+ printk("xterm_open : run_helper failed, errno = %d\n", -pid); -+ return(pid); -+ } -+ -+ if(data->stack == 0) free_stack(stack, 0); -+ -+ if(data->direct_rcv) -+ new = os_rcv_fd(fd, &data->helper_pid); -+ else { -+ if((err = os_set_fd_block(fd, 0)) != 0){ -+ printk("xterm_open : failed to set descriptor " -+ "non-blocking, errno = %d\n", err); -+ return(err); -+ } -+ new = xterm_fd(fd, &data->helper_pid); -+ } -+ if(new < 0){ -+ printk("xterm_open : os_rcv_fd failed, errno = %d\n", -new); -+ goto out; -+ } -+ -+ tcgetattr(new, &data->tt); -+ if(data->raw) raw(new, 0); -+ -+ data->pid = pid; -+ *dev_out = NULL; -+ out: -+ unlink(file); -+ return(new); -+} -+ -+void xterm_close(int fd, void *d) -+{ -+ struct xterm_chan *data = d; -+ -+ if(data->pid != -1) -+ os_kill_process(data->pid, 1); -+ data->pid = -1; -+ if(data->helper_pid != -1) -+ os_kill_process(data->helper_pid, 0); -+ data->helper_pid = -1; -+ close(fd); -+} -+ -+void xterm_free(void *d) -+{ -+ free(d); -+} -+ -+int xterm_console_write(int fd, const char *buf, int n, void *d) -+{ -+ struct xterm_chan *data = d; -+ -+ return(generic_console_write(fd, buf, n, &data->tt)); -+} -+ -+struct chan_ops xterm_ops = { -+ .type = "xterm", -+ .init = xterm_init, -+ .open = xterm_open, -+ .close = xterm_close, -+ .read = generic_read, -+ .write = generic_write, -+ .console_write = xterm_console_write, -+ .window_size = generic_window_size, -+ .free = xterm_free, -+ .winch = 1, -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm.h um/arch/um/drivers/xterm.h ---- orig/arch/um/drivers/xterm.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/xterm.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,22 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __XTERM_H__ -+#define __XTERM_H__ -+ -+extern int xterm_fd(int socket, int *pid_out); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/drivers/xterm_kern.c um/arch/um/drivers/xterm_kern.c ---- orig/arch/um/drivers/xterm_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/drivers/xterm_kern.c 2002-12-17 17:31:20.000000000 -0500 -@@ -0,0 +1,79 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/errno.h" -+#include "linux/slab.h" -+#include "asm/semaphore.h" -+#include "asm/irq.h" -+#include "irq_user.h" -+#include "kern_util.h" -+#include "os.h" -+#include "xterm.h" -+ -+struct xterm_wait { -+ struct semaphore sem; -+ int fd; -+ int pid; -+ int new_fd; -+}; -+ -+static void xterm_interrupt(int irq, void *data, struct pt_regs *regs) -+{ -+ struct xterm_wait *xterm = data; -+ int fd; -+ -+ fd = os_rcv_fd(xterm->fd, &xterm->pid); -+ if(fd == -EAGAIN) -+ return; -+ -+ xterm->new_fd = fd; -+ up(&xterm->sem); -+} -+ -+int xterm_fd(int socket, int *pid_out) -+{ -+ struct xterm_wait *data; -+ int err, ret; -+ -+ data = kmalloc(sizeof(*data), GFP_KERNEL); -+ if(data == NULL){ -+ printk(KERN_ERR "xterm_fd : failed to allocate xterm_wait\n"); -+ return(-ENOMEM); -+ } -+ *data = ((struct xterm_wait) -+ { .sem = __SEMAPHORE_INITIALIZER(data->sem, 0), -+ .fd = socket, -+ .pid = -1, -+ .new_fd = -1 }); -+ -+ err = um_request_irq(XTERM_IRQ, socket, IRQ_READ, xterm_interrupt, -+ SA_INTERRUPT | SA_SHIRQ | SA_SAMPLE_RANDOM, -+ "xterm", data); -+ if(err){ -+ printk(KERN_ERR "xterm_fd : failed to get IRQ for xterm, " -+ "err = %d\n", err); -+ return(err); -+ } -+ down(&data->sem); -+ -+ free_irq(XTERM_IRQ, data); -+ -+ ret = data->new_fd; -+ *pid_out = data->pid; -+ kfree(data); -+ -+ return(ret); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/dyn_link.ld.in um/arch/um/dyn_link.ld.in ---- orig/arch/um/dyn_link.ld.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/dyn_link.ld.in 2003-01-17 23:37:27.000000000 -0500 -@@ -0,0 +1,172 @@ -+OUTPUT_FORMAT("ELF_FORMAT") -+OUTPUT_ARCH(ELF_ARCH) -+ENTRY(_start) -+SEARCH_DIR("/usr/local/i686-pc-linux-gnu/lib"); SEARCH_DIR("/usr/local/lib"); SEARCH_DIR("/lib"); SEARCH_DIR("/usr/lib"); -+/* Do we need any of these for elf? -+ __DYNAMIC = 0; */ -+SECTIONS -+{ -+ . = START() + SIZEOF_HEADERS; -+ .interp : { *(.interp) } -+ . = ALIGN(4096); -+ __binary_start = .; -+ . = ALIGN(4096); /* Init code and data */ -+ _stext = .; -+ __init_begin = .; -+ .text.init : { *(.text.init) } -+ -+ . = ALIGN(4096); -+ -+ /* Read-only sections, merged into text segment: */ -+ .hash : { *(.hash) } -+ .dynsym : { *(.dynsym) } -+ .dynstr : { *(.dynstr) } -+ .gnu.version : { *(.gnu.version) } -+ .gnu.version_d : { *(.gnu.version_d) } -+ .gnu.version_r : { *(.gnu.version_r) } -+ .rel.init : { *(.rel.init) } -+ .rela.init : { *(.rela.init) } -+ .rel.text : { *(.rel.text .rel.text.* .rel.gnu.linkonce.t.*) } -+ .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) } -+ .rel.fini : { *(.rel.fini) } -+ .rela.fini : { *(.rela.fini) } -+ .rel.rodata : { *(.rel.rodata .rel.rodata.* .rel.gnu.linkonce.r.*) } -+ .rela.rodata : { *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) } -+ .rel.data : { *(.rel.data .rel.data.* .rel.gnu.linkonce.d.*) } -+ .rela.data : { *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) } -+ .rel.tdata : { *(.rel.tdata .rel.tdata.* .rel.gnu.linkonce.td.*) } -+ .rela.tdata : { *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) } -+ .rel.tbss : { *(.rel.tbss .rel.tbss.* .rel.gnu.linkonce.tb.*) } -+ .rela.tbss : { *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) } -+ .rel.ctors : { *(.rel.ctors) } -+ .rela.ctors : { *(.rela.ctors) } -+ .rel.dtors : { *(.rel.dtors) } -+ .rela.dtors : { *(.rela.dtors) } -+ .rel.got : { *(.rel.got) } -+ .rela.got : { *(.rela.got) } -+ .rel.bss : { *(.rel.bss .rel.bss.* .rel.gnu.linkonce.b.*) } -+ .rela.bss : { *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) } -+ .rel.plt : { *(.rel.plt) } -+ .rela.plt : { *(.rela.plt) } -+ .init : { -+ KEEP (*(.init)) -+ } =0x90909090 -+ .plt : { *(.plt) } -+ .text : { -+ *(.text .stub .text.* .gnu.linkonce.t.*) -+ /* .gnu.warning sections are handled specially by elf32.em. */ -+ *(.gnu.warning) -+ } =0x90909090 -+ .fini : { -+ KEEP (*(.fini)) -+ } =0x90909090 -+ -+ PROVIDE (__etext = .); -+ PROVIDE (_etext = .); -+ PROVIDE (etext = .); -+ .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } -+ .rodata1 : { *(.rodata1) } -+ .eh_frame_hdr : { *(.eh_frame_hdr) } -+ -+ -+ . = ALIGN(4096); -+ PROVIDE (_sdata = .); -+ -+include(`arch/um/common.ld.in') -+ -+ /* Ensure the __preinit_array_start label is properly aligned. We -+ could instead move the label definition inside the section, but -+ the linker would then create the section even if it turns out to -+ be empty, which isn't pretty. */ -+ . = ALIGN(32 / 8); -+ .preinit_array : { *(.preinit_array) } -+ .init_array : { *(.init_array) } -+ .fini_array : { *(.fini_array) } -+ .data : { -+ . = ALIGN(KERNEL_STACK_SIZE); /* init_task */ -+ *(.data.init_task) -+ *(.data .data.* .gnu.linkonce.d.*) -+ SORT(CONSTRUCTORS) -+ } -+ .data1 : { *(.data1) } -+ .tdata : { *(.tdata .tdata.* .gnu.linkonce.td.*) } -+ .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } -+ .eh_frame : { KEEP (*(.eh_frame)) } -+ .gcc_except_table : { *(.gcc_except_table) } -+ .dynamic : { *(.dynamic) } -+ .ctors : { -+ /* gcc uses crtbegin.o to find the start of -+ the constructors, so we make sure it is -+ first. Because this is a wildcard, it -+ doesn't matter if the user does not -+ actually link against crtbegin.o; the -+ linker won't look for a file to match a -+ wildcard. The wildcard also means that it -+ doesn't matter which directory crtbegin.o -+ is in. */ -+ KEEP (*crtbegin.o(.ctors)) -+ /* We don't want to include the .ctor section from -+ from the crtend.o file until after the sorted ctors. -+ The .ctor section from the crtend file contains the -+ end of ctors marker and it must be last */ -+ KEEP (*(EXCLUDE_FILE (*crtend.o ) .ctors)) -+ KEEP (*(SORT(.ctors.*))) -+ KEEP (*(.ctors)) -+ } -+ .dtors : { -+ KEEP (*crtbegin.o(.dtors)) -+ KEEP (*(EXCLUDE_FILE (*crtend.o ) .dtors)) -+ KEEP (*(SORT(.dtors.*))) -+ KEEP (*(.dtors)) -+ } -+ .jcr : { KEEP (*(.jcr)) } -+ .got : { *(.got.plt) *(.got) } -+ _edata = .; -+ PROVIDE (edata = .); -+ __bss_start = .; -+ .bss : { -+ *(.dynbss) -+ *(.bss .bss.* .gnu.linkonce.b.*) -+ *(COMMON) -+ /* Align here to ensure that the .bss section occupies space up to -+ _end. Align after .bss to ensure correct alignment even if the -+ .bss section disappears because there are no input sections. */ -+ . = ALIGN(32 / 8); -+ . = ALIGN(32 / 8); -+ } -+ _end = .; -+ PROVIDE (end = .); -+ /* Stabs debugging sections. */ -+ .stab 0 : { *(.stab) } -+ .stabstr 0 : { *(.stabstr) } -+ .stab.excl 0 : { *(.stab.excl) } -+ .stab.exclstr 0 : { *(.stab.exclstr) } -+ .stab.index 0 : { *(.stab.index) } -+ .stab.indexstr 0 : { *(.stab.indexstr) } -+ .comment 0 : { *(.comment) } -+ /* DWARF debug sections. -+ Symbols in the DWARF debugging sections are relative to the beginning -+ of the section so we begin them at 0. */ -+ /* DWARF 1 */ -+ .debug 0 : { *(.debug) } -+ .line 0 : { *(.line) } -+ /* GNU DWARF 1 extensions */ -+ .debug_srcinfo 0 : { *(.debug_srcinfo) } -+ .debug_sfnames 0 : { *(.debug_sfnames) } -+ /* DWARF 1.1 and DWARF 2 */ -+ .debug_aranges 0 : { *(.debug_aranges) } -+ .debug_pubnames 0 : { *(.debug_pubnames) } -+ /* DWARF 2 */ -+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } -+ .debug_abbrev 0 : { *(.debug_abbrev) } -+ .debug_line 0 : { *(.debug_line) } -+ .debug_frame 0 : { *(.debug_frame) } -+ .debug_str 0 : { *(.debug_str) } -+ .debug_loc 0 : { *(.debug_loc) } -+ .debug_macinfo 0 : { *(.debug_macinfo) } -+ /* SGI/MIPS DWARF 2 extensions */ -+ .debug_weaknames 0 : { *(.debug_weaknames) } -+ .debug_funcnames 0 : { *(.debug_funcnames) } -+ .debug_typenames 0 : { *(.debug_typenames) } -+ .debug_varnames 0 : { *(.debug_varnames) } -+} -diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs.h um/arch/um/fs/hostfs/hostfs.h ---- orig/arch/um/fs/hostfs/hostfs.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/fs/hostfs/hostfs.h 2003-05-22 11:03:20.000000000 -0400 -@@ -0,0 +1,69 @@ -+#ifndef __UM_FS_HOSTFS -+#define __UM_FS_HOSTFS -+ -+#include "os.h" -+ -+/* These are exactly the same definitions as in fs.h, but the names are -+ * changed so that this file can be included in both kernel and user files. -+ */ -+ -+#define HOSTFS_ATTR_MODE 1 -+#define HOSTFS_ATTR_UID 2 -+#define HOSTFS_ATTR_GID 4 -+#define HOSTFS_ATTR_SIZE 8 -+#define HOSTFS_ATTR_ATIME 16 -+#define HOSTFS_ATTR_MTIME 32 -+#define HOSTFS_ATTR_CTIME 64 -+#define HOSTFS_ATTR_ATIME_SET 128 -+#define HOSTFS_ATTR_MTIME_SET 256 -+#define HOSTFS_ATTR_FORCE 512 /* Not a change, but a change it */ -+#define HOSTFS_ATTR_ATTR_FLAG 1024 -+ -+struct hostfs_iattr { -+ unsigned int ia_valid; -+ mode_t ia_mode; -+ uid_t ia_uid; -+ gid_t ia_gid; -+ loff_t ia_size; -+ time_t ia_atime; -+ time_t ia_mtime; -+ time_t ia_ctime; -+ unsigned int ia_attr_flags; -+}; -+ -+extern int stat_file(const char *path, int *dev_out, -+ unsigned long long *inode_out, int *mode_out, -+ int *nlink_out, int *uid_out, int *gid_out, -+ unsigned long long *size_out, unsigned long *atime_out, -+ unsigned long *mtime_out, unsigned long *ctime_out, -+ int *blksize_out, unsigned long long *blocks_out); -+extern int access_file(char *path, int r, int w, int x); -+extern int open_file(char *path, int r, int w, int append); -+extern int file_type(const char *path, int *rdev); -+extern void *open_dir(char *path, int *err_out); -+extern char *read_dir(void *stream, unsigned long long *pos, -+ unsigned long long *ino_out, int *len_out); -+extern void close_file(void *stream); -+extern void close_dir(void *stream); -+extern int read_file(int fd, unsigned long long *offset, char *buf, int len); -+extern int write_file(int fd, unsigned long long *offset, const char *buf, -+ int len); -+extern int lseek_file(int fd, long long offset, int whence); -+extern int file_create(char *name, int ur, int uw, int ux, int gr, -+ int gw, int gx, int or, int ow, int ox); -+extern int set_attr(const char *file, struct hostfs_iattr *attrs); -+extern int make_symlink(const char *from, const char *to); -+extern int unlink_file(const char *file); -+extern int do_mkdir(const char *file, int mode); -+extern int do_rmdir(const char *file); -+extern int do_mknod(const char *file, int mode, int dev); -+extern int link_file(const char *from, const char *to); -+extern int do_readlink(char *file, char *buf, int size); -+extern int rename_file(char *from, char *to); -+extern int do_statfs(char *root, long *bsize_out, long long *blocks_out, -+ long long *bfree_out, long long *bavail_out, -+ long long *files_out, long long *ffree_out, -+ void *fsid_out, int fsid_size, long *namelen_out, -+ long *spare_out); -+ -+#endif -diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_kern.c um/arch/um/fs/hostfs/hostfs_kern.c ---- orig/arch/um/fs/hostfs/hostfs_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/fs/hostfs/hostfs_kern.c 2003-05-22 11:26:25.000000000 -0400 -@@ -0,0 +1,923 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <linux/stddef.h> -+#include <linux/fs.h> -+#include <linux/version.h> -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/slab.h> -+#include <linux/pagemap.h> -+#include <linux/blkdev.h> -+#include <asm/uaccess.h> -+#include "hostfs.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "user_util.h" -+#include "2_5compat.h" -+#include "init.h" -+ -+#define file_hostfs_i(file) (&(file)->f_dentry->d_inode->u.hostfs_i) -+ -+int hostfs_d_delete(struct dentry *dentry) -+{ -+ return(1); -+} -+ -+struct dentry_operations hostfs_dentry_ops = { -+ .d_delete = hostfs_d_delete, -+}; -+ -+/* Changed in hostfs_args before the kernel starts running */ -+static char *root_ino = "/"; -+static int append = 0; -+ -+#define HOSTFS_SUPER_MAGIC 0x00c0ffee -+ -+static struct inode_operations hostfs_iops; -+static struct inode_operations hostfs_dir_iops; -+static struct address_space_operations hostfs_link_aops; -+ -+static int __init hostfs_args(char *options, int *add) -+{ -+ char *ptr; -+ -+ ptr = strchr(options, ','); -+ if(ptr != NULL) -+ *ptr++ = '\0'; -+ if(*options != '\0') -+ root_ino = options; -+ -+ options = ptr; -+ while(options){ -+ ptr = strchr(options, ','); -+ if(ptr != NULL) -+ *ptr++ = '\0'; -+ if(*options != '\0'){ -+ if(!strcmp(options, "append")) -+ append = 1; -+ else printf("hostfs_args - unsupported option - %s\n", -+ options); -+ } -+ options = ptr; -+ } -+ return(0); -+} -+ -+__uml_setup("hostfs=", hostfs_args, -+"hostfs=<root dir>,<flags>,...\n" -+" This is used to set hostfs parameters. The root directory argument\n" -+" is used to confine all hostfs mounts to within the specified directory\n" -+" tree on the host. If this isn't specified, then a user inside UML can\n" -+" mount anything on the host that's accessible to the user that's running\n" -+" it.\n" -+" The only flag currently supported is 'append', which specifies that all\n" -+" files opened by hostfs will be opened in append mode.\n\n" -+); -+ -+static char *dentry_name(struct dentry *dentry, int extra) -+{ -+ struct dentry *parent; -+ char *root, *name; -+ int len; -+ -+ len = 0; -+ parent = dentry; -+ while(parent->d_parent != parent){ -+ len += parent->d_name.len + 1; -+ parent = parent->d_parent; -+ } -+ -+ root = parent->d_inode->u.hostfs_i.host_filename; -+ len += strlen(root); -+ name = kmalloc(len + extra + 1, GFP_KERNEL); -+ if(name == NULL) return(NULL); -+ -+ name[len] = '\0'; -+ parent = dentry; -+ while(parent->d_parent != parent){ -+ len -= parent->d_name.len + 1; -+ name[len] = '/'; -+ strncpy(&name[len + 1], parent->d_name.name, -+ parent->d_name.len); -+ parent = parent->d_parent; -+ } -+ strncpy(name, root, strlen(root)); -+ return(name); -+} -+ -+static char *inode_name(struct inode *ino, int extra) -+{ -+ struct dentry *dentry; -+ -+ dentry = list_entry(ino->i_dentry.next, struct dentry, d_alias); -+ return(dentry_name(dentry, extra)); -+} -+ -+static int read_name(struct inode *ino, char *name) -+{ -+ /* The non-int inode fields are copied into ints by stat_file and -+ * then copied into the inode because passing the actual pointers -+ * in and having them treated as int * breaks on big-endian machines -+ */ -+ int err; -+ int i_dev, i_mode, i_nlink, i_blksize; -+ unsigned long long i_size; -+ unsigned long long i_ino; -+ unsigned long long i_blocks; -+ err = stat_file(name, &i_dev, &i_ino, &i_mode, &i_nlink, -+ &ino->i_uid, &ino->i_gid, &i_size, &ino->i_atime, -+ &ino->i_mtime, &ino->i_ctime, &i_blksize, &i_blocks); -+ if(err) return(err); -+ ino->i_ino = i_ino; -+ ino->i_dev = i_dev; -+ ino->i_mode = i_mode; -+ ino->i_nlink = i_nlink; -+ ino->i_size = i_size; -+ ino->i_blksize = i_blksize; -+ ino->i_blocks = i_blocks; -+ if(kdev_same(ino->i_sb->s_dev, ROOT_DEV) && (ino->i_uid == getuid())) -+ ino->i_uid = 0; -+ return(0); -+} -+ -+static char *follow_link(char *link) -+{ -+ int len, n; -+ char *name, *resolved, *end; -+ -+ len = 64; -+ while(1){ -+ n = -ENOMEM; -+ name = kmalloc(len, GFP_KERNEL); -+ if(name == NULL) -+ goto out; -+ -+ n = do_readlink(link, name, len); -+ if(n < len) -+ break; -+ len *= 2; -+ kfree(name); -+ } -+ if(n < 0) -+ goto out_free; -+ -+ if(*name == '/') -+ return(name); -+ -+ end = strrchr(link, '/'); -+ if(end == NULL) -+ return(name); -+ -+ *(end + 1) = '\0'; -+ len = strlen(link) + strlen(name) + 1; -+ -+ resolved = kmalloc(len, GFP_KERNEL); -+ if(resolved == NULL){ -+ n = -ENOMEM; -+ goto out_free; -+ } -+ -+ sprintf(resolved, "%s%s", link, name); -+ kfree(name); -+ kfree(link); -+ return(resolved); -+ -+ out_free: -+ kfree(name); -+ out: -+ return(ERR_PTR(n)); -+} -+ -+static int read_inode(struct inode *ino) -+{ -+ char *name; -+ int err; -+ -+ err = -ENOMEM; -+ name = inode_name(ino, 0); -+ if(name == NULL) -+ goto out; -+ -+ if(file_type(name, NULL) == OS_TYPE_SYMLINK){ -+ name = follow_link(name); -+ if(IS_ERR(name)){ -+ err = PTR_ERR(name); -+ goto out; -+ } -+ } -+ -+ err = read_name(ino, name); -+ kfree(name); -+ out: -+ return(err); -+} -+ -+void hostfs_delete_inode(struct inode *ino) -+{ -+ if(ino->u.hostfs_i.host_filename) -+ kfree(ino->u.hostfs_i.host_filename); -+ ino->u.hostfs_i.host_filename = NULL; -+ -+ if(ino->u.hostfs_i.fd != -1) -+ close_file(&ino->u.hostfs_i.fd); -+ -+ ino->u.hostfs_i.mode = 0; -+ clear_inode(ino); -+} -+ -+int hostfs_statfs(struct super_block *sb, struct statfs *sf) -+{ -+ /* do_statfs uses struct statfs64 internally, but the linux kernel -+ * struct statfs still has 32-bit versions for most of these fields, -+ * so we convert them here -+ */ -+ int err; -+ long long f_blocks; -+ long long f_bfree; -+ long long f_bavail; -+ long long f_files; -+ long long f_ffree; -+ -+ err = do_statfs(sb->s_root->d_inode->u.hostfs_i.host_filename, -+ &sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files, -+ &f_ffree, &sf->f_fsid, sizeof(sf->f_fsid), -+ &sf->f_namelen, sf->f_spare); -+ if(err) return(err); -+ sf->f_blocks = f_blocks; -+ sf->f_bfree = f_bfree; -+ sf->f_bavail = f_bavail; -+ sf->f_files = f_files; -+ sf->f_ffree = f_ffree; -+ sf->f_type = HOSTFS_SUPER_MAGIC; -+ return(0); -+} -+ -+static struct super_operations hostfs_sbops = { -+ .put_inode = force_delete, -+ .delete_inode = hostfs_delete_inode, -+ .statfs = hostfs_statfs, -+}; -+ -+int hostfs_readdir(struct file *file, void *ent, filldir_t filldir) -+{ -+ void *dir; -+ char *name; -+ unsigned long long next, ino; -+ int error, len; -+ -+ name = dentry_name(file->f_dentry, 0); -+ if(name == NULL) return(-ENOMEM); -+ dir = open_dir(name, &error); -+ kfree(name); -+ if(dir == NULL) return(-error); -+ next = file->f_pos; -+ while((name = read_dir(dir, &next, &ino, &len)) != NULL){ -+ error = (*filldir)(ent, name, len, file->f_pos, -+ ino, DT_UNKNOWN); -+ if(error) break; -+ file->f_pos = next; -+ } -+ close_dir(dir); -+ return(0); -+} -+ -+int hostfs_file_open(struct inode *ino, struct file *file) -+{ -+ char *name; -+ int mode = 0, r = 0, w = 0, fd; -+ -+ mode = file->f_mode & (FMODE_READ | FMODE_WRITE); -+ if((mode & ino->u.hostfs_i.mode) == mode) -+ return(0); -+ -+ /* The file may already have been opened, but with the wrong access, -+ * so this resets things and reopens the file with the new access. -+ */ -+ if(ino->u.hostfs_i.fd != -1){ -+ close_file(&ino->u.hostfs_i.fd); -+ ino->u.hostfs_i.fd = -1; -+ } -+ -+ ino->u.hostfs_i.mode |= mode; -+ if(ino->u.hostfs_i.mode & FMODE_READ) -+ r = 1; -+ if(ino->u.hostfs_i.mode & FMODE_WRITE) -+ w = 1; -+ if(w) -+ r = 1; -+ -+ name = dentry_name(file->f_dentry, 0); -+ if(name == NULL) -+ return(-ENOMEM); -+ -+ fd = open_file(name, r, w, append); -+ kfree(name); -+ if(fd < 0) return(fd); -+ file_hostfs_i(file)->fd = fd; -+ -+ return(0); -+} -+ -+int hostfs_dir_open(struct inode *ino, struct file *file) -+{ -+ return(0); -+} -+ -+int hostfs_dir_release(struct inode *ino, struct file *file) -+{ -+ return(0); -+} -+ -+int hostfs_fsync(struct file *file, struct dentry *dentry, int datasync) -+{ -+ return(0); -+} -+ -+static struct file_operations hostfs_file_fops = { -+ .owner = NULL, -+ .read = generic_file_read, -+ .write = generic_file_write, -+ .mmap = generic_file_mmap, -+ .open = hostfs_file_open, -+ .release = NULL, -+ .fsync = hostfs_fsync, -+}; -+ -+static struct file_operations hostfs_dir_fops = { -+ .owner = NULL, -+ .readdir = hostfs_readdir, -+ .open = hostfs_dir_open, -+ .release = hostfs_dir_release, -+ .fsync = hostfs_fsync, -+}; -+ -+int hostfs_writepage(struct page *page) -+{ -+ struct address_space *mapping = page->mapping; -+ struct inode *inode = mapping->host; -+ char *buffer; -+ unsigned long long base; -+ int count = PAGE_CACHE_SIZE; -+ int end_index = inode->i_size >> PAGE_CACHE_SHIFT; -+ int err; -+ -+ if (page->index >= end_index) -+ count = inode->i_size & (PAGE_CACHE_SIZE-1); -+ -+ buffer = kmap(page); -+ base = ((unsigned long long) page->index) << PAGE_CACHE_SHIFT; -+ -+ err = write_file(inode->u.hostfs_i.fd, &base, buffer, count); -+ if(err != count){ -+ ClearPageUptodate(page); -+ goto out; -+ } -+ -+ if (base > inode->i_size) -+ inode->i_size = base; -+ -+ if (PageError(page)) -+ ClearPageError(page); -+ err = 0; -+ -+ out: -+ kunmap(page); -+ -+ UnlockPage(page); -+ return err; -+} -+ -+int hostfs_readpage(struct file *file, struct page *page) -+{ -+ char *buffer; -+ long long start; -+ int err = 0; -+ -+ start = (long long) page->index << PAGE_CACHE_SHIFT; -+ buffer = kmap(page); -+ err = read_file(file_hostfs_i(file)->fd, &start, buffer, -+ PAGE_CACHE_SIZE); -+ if(err < 0) goto out; -+ -+ memset(&buffer[err], 0, PAGE_CACHE_SIZE - err); -+ -+ flush_dcache_page(page); -+ SetPageUptodate(page); -+ if (PageError(page)) ClearPageError(page); -+ err = 0; -+ out: -+ kunmap(page); -+ UnlockPage(page); -+ return(err); -+} -+ -+int hostfs_prepare_write(struct file *file, struct page *page, -+ unsigned int from, unsigned int to) -+{ -+ char *buffer; -+ long long start, tmp; -+ int err; -+ -+ start = (long long) page->index << PAGE_CACHE_SHIFT; -+ buffer = kmap(page); -+ if(from != 0){ -+ tmp = start; -+ err = read_file(file_hostfs_i(file)->fd, &tmp, buffer, -+ from); -+ if(err < 0) goto out; -+ } -+ if(to != PAGE_CACHE_SIZE){ -+ start += to; -+ err = read_file(file_hostfs_i(file)->fd, &start, buffer + to, -+ PAGE_CACHE_SIZE - to); -+ if(err < 0) goto out; -+ } -+ err = 0; -+ out: -+ kunmap(page); -+ return(err); -+} -+ -+int hostfs_commit_write(struct file *file, struct page *page, unsigned from, -+ unsigned to) -+{ -+ struct address_space *mapping = page->mapping; -+ struct inode *inode = mapping->host; -+ char *buffer; -+ long long start; -+ int err = 0; -+ -+ start = (long long) (page->index << PAGE_CACHE_SHIFT) + from; -+ buffer = kmap(page); -+ err = write_file(file_hostfs_i(file)->fd, &start, buffer + from, -+ to - from); -+ if(err > 0) err = 0; -+ if(!err && (start > inode->i_size)) -+ inode->i_size = start; -+ -+ kunmap(page); -+ return(err); -+} -+ -+static struct address_space_operations hostfs_aops = { -+ .writepage = hostfs_writepage, -+ .readpage = hostfs_readpage, -+/* .set_page_dirty = __set_page_dirty_nobuffers, */ -+ .prepare_write = hostfs_prepare_write, -+ .commit_write = hostfs_commit_write -+}; -+ -+static struct inode *get_inode(struct super_block *sb, struct dentry *dentry, -+ int *error) -+{ -+ struct inode *inode; -+ char *name; -+ int type, err = -ENOMEM, rdev; -+ -+ inode = new_inode(sb); -+ if(inode == NULL) -+ goto out; -+ -+ inode->u.hostfs_i.host_filename = NULL; -+ inode->u.hostfs_i.fd = -1; -+ inode->u.hostfs_i.mode = 0; -+ insert_inode_hash(inode); -+ if(dentry){ -+ name = dentry_name(dentry, 0); -+ if(name == NULL){ -+ err = -ENOMEM; -+ goto out_put; -+ } -+ type = file_type(name, &rdev); -+ kfree(name); -+ } -+ else type = OS_TYPE_DIR; -+ inode->i_sb = sb; -+ -+ err = 0; -+ if(type == OS_TYPE_SYMLINK) -+ inode->i_op = &page_symlink_inode_operations; -+ else if(type == OS_TYPE_DIR) -+ inode->i_op = &hostfs_dir_iops; -+ else inode->i_op = &hostfs_iops; -+ -+ if(type == OS_TYPE_DIR) inode->i_fop = &hostfs_dir_fops; -+ else inode->i_fop = &hostfs_file_fops; -+ -+ if(type == OS_TYPE_SYMLINK) -+ inode->i_mapping->a_ops = &hostfs_link_aops; -+ else inode->i_mapping->a_ops = &hostfs_aops; -+ -+ switch (type) { -+ case OS_TYPE_CHARDEV: -+ init_special_inode(inode, S_IFCHR, rdev); -+ break; -+ case OS_TYPE_BLOCKDEV: -+ init_special_inode(inode, S_IFBLK, rdev); -+ break; -+ case OS_TYPE_FIFO: -+ init_special_inode(inode, S_IFIFO, 0); -+ break; -+ case OS_TYPE_SOCK: -+ init_special_inode(inode, S_IFSOCK, 0); -+ break; -+ } -+ -+ if(error) *error = err; -+ return(inode); -+ out_put: -+ iput(inode); -+ out: -+ if(error) *error = err; -+ return(NULL); -+} -+ -+int hostfs_create(struct inode *dir, struct dentry *dentry, int mode) -+{ -+ struct inode *inode; -+ char *name; -+ int error, fd; -+ -+ inode = get_inode(dir->i_sb, dentry, &error); -+ if(error) return(error); -+ name = dentry_name(dentry, 0); -+ if(name == NULL){ -+ iput(inode); -+ return(-ENOMEM); -+ } -+ fd = file_create(name, -+ mode & S_IRUSR, mode & S_IWUSR, mode & S_IXUSR, -+ mode & S_IRGRP, mode & S_IWGRP, mode & S_IXGRP, -+ mode & S_IROTH, mode & S_IWOTH, mode & S_IXOTH); -+ if(fd < 0) -+ error = fd; -+ else error = read_name(inode, name); -+ -+ kfree(name); -+ if(error){ -+ iput(inode); -+ return(error); -+ } -+ inode->u.hostfs_i.fd = fd; -+ inode->u.hostfs_i.mode = FMODE_READ | FMODE_WRITE; -+ d_instantiate(dentry, inode); -+ return(0); -+} -+ -+struct dentry *hostfs_lookup(struct inode *ino, struct dentry *dentry) -+{ -+ struct inode *inode; -+ char *name; -+ int error; -+ -+ inode = get_inode(ino->i_sb, dentry, &error); -+ if(error != 0) return(ERR_PTR(error)); -+ name = dentry_name(dentry, 0); -+ if(name == NULL) return(ERR_PTR(-ENOMEM)); -+ error = read_name(inode, name); -+ kfree(name); -+ if(error){ -+ iput(inode); -+ if(error == -ENOENT) inode = NULL; -+ else return(ERR_PTR(error)); -+ } -+ d_add(dentry, inode); -+ dentry->d_op = &hostfs_dentry_ops; -+ return(NULL); -+} -+ -+static char *inode_dentry_name(struct inode *ino, struct dentry *dentry) -+{ -+ char *file; -+ int len; -+ -+ file = inode_name(ino, dentry->d_name.len + 1); -+ if(file == NULL) return(NULL); -+ strcat(file, "/"); -+ len = strlen(file); -+ strncat(file, dentry->d_name.name, dentry->d_name.len); -+ file[len + dentry->d_name.len] = '\0'; -+ return(file); -+} -+ -+int hostfs_link(struct dentry *to, struct inode *ino, struct dentry *from) -+{ -+ char *from_name, *to_name; -+ int err; -+ -+ if((from_name = inode_dentry_name(ino, from)) == NULL) -+ return(-ENOMEM); -+ to_name = dentry_name(to, 0); -+ if(to_name == NULL){ -+ kfree(from_name); -+ return(-ENOMEM); -+ } -+ err = link_file(to_name, from_name); -+ kfree(from_name); -+ kfree(to_name); -+ return(err); -+} -+ -+int hostfs_unlink(struct inode *ino, struct dentry *dentry) -+{ -+ char *file; -+ int err; -+ -+ if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); -+ if(append) -+ return(-EPERM); -+ -+ err = unlink_file(file); -+ kfree(file); -+ return(err); -+} -+ -+int hostfs_symlink(struct inode *ino, struct dentry *dentry, const char *to) -+{ -+ char *file; -+ int err; -+ -+ if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); -+ err = make_symlink(file, to); -+ kfree(file); -+ return(err); -+} -+ -+int hostfs_mkdir(struct inode *ino, struct dentry *dentry, int mode) -+{ -+ char *file; -+ int err; -+ -+ if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); -+ err = do_mkdir(file, mode); -+ kfree(file); -+ return(err); -+} -+ -+int hostfs_rmdir(struct inode *ino, struct dentry *dentry) -+{ -+ char *file; -+ int err; -+ -+ if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); -+ err = do_rmdir(file); -+ kfree(file); -+ return(err); -+} -+ -+int hostfs_mknod(struct inode *dir, struct dentry *dentry, int mode, int dev) -+{ -+ struct inode *inode; -+ char *name; -+ int error; -+ -+ inode = get_inode(dir->i_sb, dentry, &error); -+ if(error) return(error); -+ name = dentry_name(dentry, 0); -+ if(name == NULL){ -+ iput(inode); -+ return(-ENOMEM); -+ } -+ init_special_inode(inode, mode, dev); -+ error = do_mknod(name, mode, dev); -+ if(!error) error = read_name(inode, name); -+ kfree(name); -+ if(error){ -+ iput(inode); -+ return(error); -+ } -+ d_instantiate(dentry, inode); -+ return(0); -+} -+ -+int hostfs_rename(struct inode *from_ino, struct dentry *from, -+ struct inode *to_ino, struct dentry *to) -+{ -+ char *from_name, *to_name; -+ int err; -+ -+ if((from_name = inode_dentry_name(from_ino, from)) == NULL) -+ return(-ENOMEM); -+ if((to_name = inode_dentry_name(to_ino, to)) == NULL){ -+ kfree(from_name); -+ return(-ENOMEM); -+ } -+ err = rename_file(from_name, to_name); -+ kfree(from_name); -+ kfree(to_name); -+ return(err); -+} -+ -+void hostfs_truncate(struct inode *ino) -+{ -+ not_implemented(); -+} -+ -+int hostfs_permission(struct inode *ino, int desired) -+{ -+ char *name; -+ int r = 0, w = 0, x = 0, err; -+ -+ if(desired & MAY_READ) r = 1; -+ if(desired & MAY_WRITE) w = 1; -+ if(desired & MAY_EXEC) x = 1; -+ name = inode_name(ino, 0); -+ if(name == NULL) return(-ENOMEM); -+ err = access_file(name, r, w, x); -+ kfree(name); -+ if(!err) err = vfs_permission(ino, desired); -+ return(err); -+} -+ -+int hostfs_setattr(struct dentry *dentry, struct iattr *attr) -+{ -+ struct hostfs_iattr attrs; -+ char *name; -+ int err; -+ -+ if(append) -+ attr->ia_valid &= ~ATTR_SIZE; -+ -+ attrs.ia_valid = 0; -+ if(attr->ia_valid & ATTR_MODE){ -+ attrs.ia_valid |= HOSTFS_ATTR_MODE; -+ attrs.ia_mode = attr->ia_mode; -+ } -+ if(attr->ia_valid & ATTR_UID){ -+ if(kdev_same(dentry->d_inode->i_sb->s_dev, ROOT_DEV) && -+ (attr->ia_uid == 0)) -+ attr->ia_uid = getuid(); -+ attrs.ia_valid |= HOSTFS_ATTR_UID; -+ attrs.ia_uid = attr->ia_uid; -+ } -+ if(attr->ia_valid & ATTR_GID){ -+ if(kdev_same(dentry->d_inode->i_sb->s_dev, ROOT_DEV) && -+ (attr->ia_gid == 0)) -+ attr->ia_gid = getuid(); -+ attrs.ia_valid |= HOSTFS_ATTR_GID; -+ attrs.ia_gid = attr->ia_gid; -+ } -+ if(attr->ia_valid & ATTR_SIZE){ -+ attrs.ia_valid |= HOSTFS_ATTR_SIZE; -+ attrs.ia_size = attr->ia_size; -+ } -+ if(attr->ia_valid & ATTR_ATIME){ -+ attrs.ia_valid |= HOSTFS_ATTR_ATIME; -+ attrs.ia_atime = attr->ia_atime; -+ } -+ if(attr->ia_valid & ATTR_MTIME){ -+ attrs.ia_valid |= HOSTFS_ATTR_MTIME; -+ attrs.ia_mtime = attr->ia_mtime; -+ } -+ if(attr->ia_valid & ATTR_CTIME){ -+ attrs.ia_valid |= HOSTFS_ATTR_CTIME; -+ attrs.ia_ctime = attr->ia_ctime; -+ } -+ if(attr->ia_valid & ATTR_ATIME_SET){ -+ attrs.ia_valid |= HOSTFS_ATTR_ATIME_SET; -+ } -+ if(attr->ia_valid & ATTR_MTIME_SET){ -+ attrs.ia_valid |= HOSTFS_ATTR_MTIME_SET; -+ } -+ name = dentry_name(dentry, 0); -+ if(name == NULL) return(-ENOMEM); -+ err = set_attr(name, &attrs); -+ kfree(name); -+ if(err) -+ return(err); -+ -+ return(inode_setattr(dentry->d_inode, attr)); -+} -+ -+int hostfs_getattr(struct dentry *dentry, struct iattr *attr) -+{ -+ not_implemented(); -+ return(-EINVAL); -+} -+ -+static struct inode_operations hostfs_iops = { -+ .create = hostfs_create, -+ .link = hostfs_link, -+ .unlink = hostfs_unlink, -+ .symlink = hostfs_symlink, -+ .mkdir = hostfs_mkdir, -+ .rmdir = hostfs_rmdir, -+ .mknod = hostfs_mknod, -+ .rename = hostfs_rename, -+ .truncate = hostfs_truncate, -+ .permission = hostfs_permission, -+ .setattr = hostfs_setattr, -+ .getattr = hostfs_getattr, -+}; -+ -+static struct inode_operations hostfs_dir_iops = { -+ .create = hostfs_create, -+ .lookup = hostfs_lookup, -+ .link = hostfs_link, -+ .unlink = hostfs_unlink, -+ .symlink = hostfs_symlink, -+ .mkdir = hostfs_mkdir, -+ .rmdir = hostfs_rmdir, -+ .mknod = hostfs_mknod, -+ .rename = hostfs_rename, -+ .truncate = hostfs_truncate, -+ .permission = hostfs_permission, -+ .setattr = hostfs_setattr, -+ .getattr = hostfs_getattr, -+}; -+ -+int hostfs_link_readpage(struct file *file, struct page *page) -+{ -+ char *buffer, *name; -+ long long start; -+ int err; -+ -+ start = page->index << PAGE_CACHE_SHIFT; -+ buffer = kmap(page); -+ name = inode_name(page->mapping->host, 0); -+ if(name == NULL) return(-ENOMEM); -+ err = do_readlink(name, buffer, PAGE_CACHE_SIZE); -+ kfree(name); -+ if(err == PAGE_CACHE_SIZE) -+ err = -E2BIG; -+ else if(err > 0){ -+ flush_dcache_page(page); -+ SetPageUptodate(page); -+ if (PageError(page)) ClearPageError(page); -+ err = 0; -+ } -+ kunmap(page); -+ UnlockPage(page); -+ return(err); -+} -+ -+static struct address_space_operations hostfs_link_aops = { -+ .readpage = hostfs_link_readpage, -+}; -+ -+static struct super_block *hostfs_read_super_common(struct super_block *sb, -+ char *data) -+{ -+ struct inode *root_inode; -+ char *name; -+ -+ sb->s_blocksize = 1024; -+ sb->s_blocksize_bits = 10; -+ sb->s_magic = HOSTFS_SUPER_MAGIC; -+ sb->s_op = &hostfs_sbops; -+ if((data == NULL) || (*((char *) data) == '\0')) data = root_ino; -+ name = kmalloc(strlen(data) + 1, GFP_KERNEL); -+ if(name == NULL) return(NULL); -+ strcpy(name, data); -+ root_inode = get_inode(sb, NULL, NULL); -+ if(root_inode == NULL) -+ goto out_free; -+ -+ root_inode->u.hostfs_i.host_filename = name; -+ sb->s_root = d_alloc_root(root_inode); -+ if(read_inode(root_inode)) -+ goto out_put; -+ return(sb); -+ -+ out_free: -+ kfree(name); -+ out_put: -+ iput(root_inode); -+ return(NULL); -+} -+ -+struct super_block *hostfs_read_super(struct super_block *sb, void *data, -+ int silent) -+{ -+ return(hostfs_read_super_common(sb, data)); -+} -+ -+DECLARE_FSTYPE(hostfs_type, "hostfs", hostfs_read_super, 0); -+ -+static int __init init_hostfs(void) -+{ -+ return(register_filesystem(&hostfs_type)); -+} -+ -+static void __exit exit_hostfs(void) -+{ -+ unregister_filesystem(&hostfs_type); -+} -+ -+module_init(init_hostfs) -+module_exit(exit_hostfs) -+MODULE_LICENSE("GPL"); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/hostfs_user.c um/arch/um/fs/hostfs/hostfs_user.c ---- orig/arch/um/fs/hostfs/hostfs_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/fs/hostfs/hostfs_user.c 2003-05-22 11:06:46.000000000 -0400 -@@ -0,0 +1,347 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <unistd.h> -+#include <stdio.h> -+#include <fcntl.h> -+#include <dirent.h> -+#include <errno.h> -+#include <utime.h> -+#include <string.h> -+#include <sys/stat.h> -+#include <sys/time.h> -+#include <sys/vfs.h> -+#include "hostfs.h" -+#include "kern_util.h" -+#include "user.h" -+ -+int stat_file(const char *path, int *dev_out, unsigned long long *inode_out, -+ int *mode_out, int *nlink_out, int *uid_out, int *gid_out, -+ unsigned long long *size_out, unsigned long *atime_out, -+ unsigned long *mtime_out, unsigned long *ctime_out, -+ int *blksize_out, unsigned long long *blocks_out) -+{ -+ struct stat64 buf; -+ -+ if(lstat64(path, &buf) < 0) -+ return(-errno); -+ if(dev_out != NULL) *dev_out = buf.st_dev; -+ -+ /* See the Makefile for why STAT64_INO_FIELD is passed in -+ * by the build -+ */ -+ if(inode_out != NULL) *inode_out = buf.STAT64_INO_FIELD; -+ if(mode_out != NULL) *mode_out = buf.st_mode; -+ if(nlink_out != NULL) *nlink_out = buf.st_nlink; -+ if(uid_out != NULL) *uid_out = buf.st_uid; -+ if(gid_out != NULL) *gid_out = buf.st_gid; -+ if(size_out != NULL) *size_out = buf.st_size; -+ if(atime_out != NULL) *atime_out = buf.st_atime; -+ if(mtime_out != NULL) *mtime_out = buf.st_mtime; -+ if(ctime_out != NULL) *ctime_out = buf.st_ctime; -+ if(blksize_out != NULL) *blksize_out = buf.st_blksize; -+ if(blocks_out != NULL) *blocks_out = buf.st_blocks; -+ return(0); -+} -+ -+int file_type(const char *path, int *rdev) -+{ -+ struct stat64 buf; -+ -+ if(lstat64(path, &buf) < 0) -+ return(-errno); -+ if(rdev != NULL) -+ *rdev = buf.st_rdev; -+ -+ if(S_ISDIR(buf.st_mode)) return(OS_TYPE_DIR); -+ else if(S_ISLNK(buf.st_mode)) return(OS_TYPE_SYMLINK); -+ else if(S_ISCHR(buf.st_mode)) return(OS_TYPE_CHARDEV); -+ else if(S_ISBLK(buf.st_mode)) return(OS_TYPE_BLOCKDEV); -+ else if(S_ISFIFO(buf.st_mode))return(OS_TYPE_FIFO); -+ else if(S_ISSOCK(buf.st_mode))return(OS_TYPE_SOCK); -+ else return(OS_TYPE_FILE); -+} -+ -+int access_file(char *path, int r, int w, int x) -+{ -+ int mode = 0; -+ -+ if(r) mode = R_OK; -+ if(w) mode |= W_OK; -+ if(x) mode |= X_OK; -+ if(access(path, mode) != 0) return(-errno); -+ else return(0); -+} -+ -+int open_file(char *path, int r, int w, int append) -+{ -+ int mode = 0, fd; -+ -+ if(r && !w) -+ mode = O_RDONLY; -+ else if(!r && w) -+ mode = O_WRONLY; -+ else if(r && w) -+ mode = O_RDWR; -+ else panic("Impossible mode in open_file"); -+ -+ if(append) -+ mode |= O_APPEND; -+ fd = open64(path, mode); -+ if(fd < 0) return(-errno); -+ else return(fd); -+} -+ -+void *open_dir(char *path, int *err_out) -+{ -+ DIR *dir; -+ -+ dir = opendir(path); -+ *err_out = errno; -+ if(dir == NULL) return(NULL); -+ return(dir); -+} -+ -+char *read_dir(void *stream, unsigned long long *pos, -+ unsigned long long *ino_out, int *len_out) -+{ -+ DIR *dir = stream; -+ struct dirent *ent; -+ -+ seekdir(dir, *pos); -+ ent = readdir(dir); -+ if(ent == NULL) return(NULL); -+ *len_out = strlen(ent->d_name); -+ *ino_out = ent->d_ino; -+ *pos = telldir(dir); -+ return(ent->d_name); -+} -+ -+int read_file(int fd, unsigned long long *offset, char *buf, int len) -+{ -+ int n; -+ -+ n = pread64(fd, buf, len, *offset); -+ if(n < 0) return(-errno); -+ *offset += n; -+ return(n); -+} -+ -+int write_file(int fd, unsigned long long *offset, const char *buf, int len) -+{ -+ int n; -+ -+ n = pwrite64(fd, buf, len, *offset); -+ if(n < 0) return(-errno); -+ *offset += n; -+ return(n); -+} -+ -+int lseek_file(int fd, long long offset, int whence) -+{ -+ int ret; -+ -+ ret = lseek64(fd, offset, whence); -+ if(ret < 0) return(-errno); -+ return(0); -+} -+ -+void close_file(void *stream) -+{ -+ close(*((int *) stream)); -+} -+ -+void close_dir(void *stream) -+{ -+ closedir(stream); -+} -+ -+int file_create(char *name, int ur, int uw, int ux, int gr, -+ int gw, int gx, int or, int ow, int ox) -+{ -+ int mode, fd; -+ -+ mode = 0; -+ mode |= ur ? S_IRUSR : 0; -+ mode |= uw ? S_IWUSR : 0; -+ mode |= ux ? S_IXUSR : 0; -+ mode |= gr ? S_IRGRP : 0; -+ mode |= gw ? S_IWGRP : 0; -+ mode |= gx ? S_IXGRP : 0; -+ mode |= or ? S_IROTH : 0; -+ mode |= ow ? S_IWOTH : 0; -+ mode |= ox ? S_IXOTH : 0; -+ fd = open64(name, O_CREAT | O_RDWR, mode); -+ if(fd < 0) -+ return(-errno); -+ return(fd); -+} -+ -+int set_attr(const char *file, struct hostfs_iattr *attrs) -+{ -+ struct utimbuf buf; -+ int err, ma; -+ -+ if(attrs->ia_valid & HOSTFS_ATTR_MODE){ -+ if(chmod(file, attrs->ia_mode) != 0) return(-errno); -+ } -+ if(attrs->ia_valid & HOSTFS_ATTR_UID){ -+ if(chown(file, attrs->ia_uid, -1)) return(-errno); -+ } -+ if(attrs->ia_valid & HOSTFS_ATTR_GID){ -+ if(chown(file, -1, attrs->ia_gid)) return(-errno); -+ } -+ if(attrs->ia_valid & HOSTFS_ATTR_SIZE){ -+ if(truncate(file, attrs->ia_size)) return(-errno); -+ } -+ ma = HOSTFS_ATTR_ATIME_SET | HOSTFS_ATTR_MTIME_SET; -+ if((attrs->ia_valid & ma) == ma){ -+ buf.actime = attrs->ia_atime; -+ buf.modtime = attrs->ia_mtime; -+ if(utime(file, &buf) != 0) return(-errno); -+ } -+ else { -+ if(attrs->ia_valid & HOSTFS_ATTR_ATIME_SET){ -+ err = stat_file(file, NULL, NULL, NULL, NULL, NULL, -+ NULL, NULL, NULL, &buf.modtime, NULL, -+ NULL, NULL); -+ if(err != 0) return(err); -+ buf.actime = attrs->ia_atime; -+ if(utime(file, &buf) != 0) return(-errno); -+ } -+ if(attrs->ia_valid & HOSTFS_ATTR_MTIME_SET){ -+ err = stat_file(file, NULL, NULL, NULL, NULL, NULL, -+ NULL, NULL, &buf.actime, NULL, NULL, -+ NULL, NULL); -+ if(err != 0) return(err); -+ buf.modtime = attrs->ia_mtime; -+ if(utime(file, &buf) != 0) return(-errno); -+ } -+ } -+ if(attrs->ia_valid & HOSTFS_ATTR_CTIME) ; -+ if(attrs->ia_valid & (HOSTFS_ATTR_ATIME | HOSTFS_ATTR_MTIME)){ -+ err = stat_file(file, NULL, NULL, NULL, NULL, NULL, -+ NULL, NULL, &attrs->ia_atime, &attrs->ia_mtime, -+ NULL, NULL, NULL); -+ if(err != 0) return(err); -+ } -+ return(0); -+} -+ -+int make_symlink(const char *from, const char *to) -+{ -+ int err; -+ -+ err = symlink(to, from); -+ if(err) return(-errno); -+ return(0); -+} -+ -+int unlink_file(const char *file) -+{ -+ int err; -+ -+ err = unlink(file); -+ if(err) return(-errno); -+ return(0); -+} -+ -+int do_mkdir(const char *file, int mode) -+{ -+ int err; -+ -+ err = mkdir(file, mode); -+ if(err) return(-errno); -+ return(0); -+} -+ -+int do_rmdir(const char *file) -+{ -+ int err; -+ -+ err = rmdir(file); -+ if(err) return(-errno); -+ return(0); -+} -+ -+int do_mknod(const char *file, int mode, int dev) -+{ -+ int err; -+ -+ err = mknod(file, mode, dev); -+ if(err) return(-errno); -+ return(0); -+} -+ -+int link_file(const char *to, const char *from) -+{ -+ int err; -+ -+ err = link(to, from); -+ if(err) return(-errno); -+ return(0); -+} -+ -+int do_readlink(char *file, char *buf, int size) -+{ -+ int n; -+ -+ n = readlink(file, buf, size); -+ if(n < 0) -+ return(-errno); -+ if(n < size) -+ buf[n] = '\0'; -+ return(n); -+} -+ -+int rename_file(char *from, char *to) -+{ -+ int err; -+ -+ err = rename(from, to); -+ if(err < 0) return(-errno); -+ return(0); -+} -+ -+int do_statfs(char *root, long *bsize_out, long long *blocks_out, -+ long long *bfree_out, long long *bavail_out, -+ long long *files_out, long long *ffree_out, -+ void *fsid_out, int fsid_size, long *namelen_out, -+ long *spare_out) -+{ -+ struct statfs64 buf; -+ int err; -+ -+ err = statfs64(root, &buf); -+ if(err < 0) return(-errno); -+ *bsize_out = buf.f_bsize; -+ *blocks_out = buf.f_blocks; -+ *bfree_out = buf.f_bfree; -+ *bavail_out = buf.f_bavail; -+ *files_out = buf.f_files; -+ *ffree_out = buf.f_ffree; -+ memcpy(fsid_out, &buf.f_fsid, -+ sizeof(buf.f_fsid) > fsid_size ? fsid_size : -+ sizeof(buf.f_fsid)); -+ *namelen_out = buf.f_namelen; -+ spare_out[0] = buf.f_spare[0]; -+ spare_out[1] = buf.f_spare[1]; -+ spare_out[2] = buf.f_spare[2]; -+ spare_out[3] = buf.f_spare[3]; -+ spare_out[4] = buf.f_spare[4]; -+ spare_out[5] = buf.f_spare[5]; -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/fs/hostfs/Makefile um/arch/um/fs/hostfs/Makefile ---- orig/arch/um/fs/hostfs/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/fs/hostfs/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,24 @@ -+# -+# Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+# struct stat64 changed the inode field name between 2.2 and 2.4 from st_ino -+# to __st_ino. It stayed in the same place, so as long as the correct name -+# is used, hostfs compiled on 2.2 should work on 2.4 and vice versa. -+ -+STAT64_INO_FIELD := $(shell grep -q __st_ino /usr/include/bits/stat.h && \ -+ echo __)st_ino -+ -+USER_CFLAGS := $(USER_CFLAGS) -DSTAT64_INO_FIELD=$(STAT64_INO_FIELD) -+ -+O_TARGET := hostfs.o -+obj-y = hostfs_kern.o hostfs_user.o -+obj-m = $(O_TARGET) -+ -+USER_OBJS = $(filter %_user.o,$(obj-y)) -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -diff -Naur -X ../exclude-files orig/arch/um/fs/hppfs/hppfs_kern.c um/arch/um/fs/hppfs/hppfs_kern.c ---- orig/arch/um/fs/hppfs/hppfs_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/fs/hppfs/hppfs_kern.c 2003-02-27 13:14:26.000000000 -0500 -@@ -0,0 +1,725 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <linux/fs.h> -+#include <linux/module.h> -+#include <linux/slab.h> -+#include <linux/list.h> -+#include <linux/kernel.h> -+#include <linux/ctype.h> -+#include <asm/uaccess.h> -+#include "os.h" -+ -+struct hppfs_data { -+ struct list_head list; -+ char contents[PAGE_SIZE - sizeof(struct list_head)]; -+}; -+ -+struct hppfs_private { -+ struct file proc_file; -+ int host_fd; -+ loff_t len; -+ struct hppfs_data *contents; -+}; -+ -+#define HPPFS_SUPER_MAGIC 0xb00000ee -+ -+static struct super_operations hppfs_sbops; -+ -+static struct inode *get_inode(struct super_block *sb, struct dentry *dentry, -+ int *error); -+ -+static int is_pid(struct dentry *dentry) -+{ -+ struct super_block *sb; -+ int i; -+ -+ sb = dentry->d_sb; -+ if((sb->s_op != &hppfs_sbops) || (dentry->d_parent != sb->s_root)) -+ return(0); -+ -+ for(i = 0; i < dentry->d_name.len; i++){ -+ if(!isdigit(dentry->d_name.name[i])) -+ return(0); -+ } -+ return(1); -+} -+ -+static char *dentry_name(struct dentry *dentry, int extra) -+{ -+ struct dentry *parent; -+ char *root, *name; -+ const char *seg_name; -+ int len, seg_len; -+ -+ len = 0; -+ parent = dentry; -+ while(parent->d_parent != parent){ -+ if(is_pid(parent)) -+ len += strlen("pid") + 1; -+ else len += parent->d_name.len + 1; -+ parent = parent->d_parent; -+ } -+ -+ root = "proc"; -+ len += strlen(root); -+ name = kmalloc(len + extra + 1, GFP_KERNEL); -+ if(name == NULL) return(NULL); -+ -+ name[len] = '\0'; -+ parent = dentry; -+ while(parent->d_parent != parent){ -+ if(is_pid(parent)){ -+ seg_name = "pid"; -+ seg_len = strlen("pid"); -+ } -+ else { -+ seg_name = parent->d_name.name; -+ seg_len = parent->d_name.len; -+ } -+ -+ len -= seg_len + 1; -+ name[len] = '/'; -+ strncpy(&name[len + 1], seg_name, seg_len); -+ parent = parent->d_parent; -+ } -+ strncpy(name, root, strlen(root)); -+ return(name); -+} -+ -+struct dentry_operations hppfs_dentry_ops = { -+}; -+ -+static int file_removed(struct dentry *dentry, const char *file) -+{ -+ char *host_file; -+ int extra, fd; -+ -+ extra = 0; -+ if(file != NULL) extra += strlen(file) + 1; -+ -+ host_file = dentry_name(dentry, extra + strlen("/remove")); -+ if(host_file == NULL){ -+ printk("file_removed : allocation failed\n"); -+ return(-ENOMEM); -+ } -+ -+ if(file != NULL){ -+ strcat(host_file, "/"); -+ strcat(host_file, file); -+ } -+ strcat(host_file, "/remove"); -+ -+ fd = os_open_file(host_file, of_read(OPENFLAGS()), 0); -+ kfree(host_file); -+ if(fd > 0){ -+ os_close_file(fd); -+ return(1); -+ } -+ return(0); -+} -+ -+static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry) -+{ -+ struct dentry *proc_dentry; -+ struct inode *inode; -+ int err, deleted; -+ -+ deleted = file_removed(dentry, NULL); -+ if(deleted < 0) -+ return(ERR_PTR(deleted)); -+ else if(deleted) -+ return(ERR_PTR(-ENOENT)); -+ -+ proc_dentry = lookup_hash(&dentry->d_name, ino->u.hppfs_i.proc_dentry); -+ if(IS_ERR(proc_dentry)) -+ return(proc_dentry); -+ -+ inode = get_inode(ino->i_sb, proc_dentry, &err); -+ if(err != 0) -+ return(ERR_PTR(err)); -+ -+ d_add(dentry, inode); -+ dentry->d_op = &hppfs_dentry_ops; -+ return(NULL); -+} -+ -+static struct inode_operations hppfs_file_iops = { -+}; -+ -+static struct inode_operations hppfs_dir_iops = { -+ .lookup = hppfs_lookup, -+}; -+ -+static ssize_t read_proc(struct file *file, char *buf, ssize_t count, -+ loff_t *ppos, int is_user) -+{ -+ ssize_t (*read)(struct file *, char *, size_t, loff_t *); -+ ssize_t n; -+ -+ read = file->f_dentry->d_inode->i_fop->read; -+ -+ if(!is_user) -+ set_fs(KERNEL_DS); -+ -+ n = (*read)(file, buf, count, &file->f_pos); -+ -+ if(!is_user) -+ set_fs(USER_DS); -+ -+ if(ppos) *ppos = file->f_pos; -+ return(n); -+} -+ -+static ssize_t hppfs_read_file(int fd, char *buf, ssize_t count) -+{ -+ ssize_t n; -+ int cur, err; -+ char *new_buf; -+ -+ n = -ENOMEM; -+ new_buf = kmalloc(PAGE_SIZE, GFP_KERNEL); -+ if(new_buf == NULL){ -+ printk("hppfs_read_file : kmalloc failed\n"); -+ goto out; -+ } -+ n = 0; -+ while(count > 0){ -+ cur = min_t(ssize_t, count, PAGE_SIZE); -+ err = os_read_file(fd, new_buf, cur); -+ if(err < 0){ -+ printk("hppfs_read : read failed, errno = %d\n", -+ count); -+ n = err; -+ goto out_free; -+ } -+ else if(err == 0) -+ break; -+ -+ if(copy_to_user(buf, new_buf, err)){ -+ n = -EFAULT; -+ goto out_free; -+ } -+ n += err; -+ count -= err; -+ } -+ out_free: -+ kfree(new_buf); -+ out: -+ return(n); -+} -+ -+static ssize_t hppfs_read(struct file *file, char *buf, size_t count, -+ loff_t *ppos) -+{ -+ struct hppfs_private *hppfs = file->private_data; -+ struct hppfs_data *data; -+ loff_t off; -+ int err; -+ -+ if(hppfs->contents != NULL){ -+ if(*ppos >= hppfs->len) return(0); -+ -+ data = hppfs->contents; -+ off = *ppos; -+ while(off >= sizeof(data->contents)){ -+ data = list_entry(data->list.next, struct hppfs_data, -+ list); -+ off -= sizeof(data->contents); -+ } -+ -+ if(off + count > hppfs->len) -+ count = hppfs->len - off; -+ copy_to_user(buf, &data->contents[off], count); -+ *ppos += count; -+ } -+ else if(hppfs->host_fd != -1){ -+ err = os_seek_file(hppfs->host_fd, *ppos); -+ if(err){ -+ printk("hppfs_read : seek failed, errno = %d\n", err); -+ return(err); -+ } -+ count = hppfs_read_file(hppfs->host_fd, buf, count); -+ if(count > 0) -+ *ppos += count; -+ } -+ else count = read_proc(&hppfs->proc_file, buf, count, ppos, 1); -+ -+ return(count); -+} -+ -+static ssize_t hppfs_write(struct file *file, const char *buf, size_t len, -+ loff_t *ppos) -+{ -+ struct hppfs_private *data = file->private_data; -+ struct file *proc_file = &data->proc_file; -+ ssize_t (*write)(struct file *, const char *, size_t, loff_t *); -+ int err; -+ -+ write = proc_file->f_dentry->d_inode->i_fop->write; -+ -+ proc_file->f_pos = file->f_pos; -+ err = (*write)(proc_file, buf, len, &proc_file->f_pos); -+ file->f_pos = proc_file->f_pos; -+ -+ return(err); -+} -+ -+static int open_host_sock(char *host_file, int *filter_out) -+{ -+ char *end; -+ int fd; -+ -+ end = &host_file[strlen(host_file)]; -+ strcpy(end, "/rw"); -+ *filter_out = 1; -+ fd = os_connect_socket(host_file); -+ if(fd > 0) -+ return(fd); -+ -+ strcpy(end, "/r"); -+ *filter_out = 0; -+ fd = os_connect_socket(host_file); -+ return(fd); -+} -+ -+static void free_contents(struct hppfs_data *head) -+{ -+ struct hppfs_data *data; -+ struct list_head *ele, *next; -+ -+ if(head == NULL) return; -+ -+ list_for_each_safe(ele, next, &head->list){ -+ data = list_entry(ele, struct hppfs_data, list); -+ kfree(data); -+ } -+ kfree(head); -+} -+ -+static struct hppfs_data *hppfs_get_data(int fd, int filter, -+ struct file *proc_file, -+ struct file *hppfs_file, -+ loff_t *size_out) -+{ -+ struct hppfs_data *data, *new, *head; -+ int n, err; -+ -+ err = -ENOMEM; -+ data = kmalloc(sizeof(*data), GFP_KERNEL); -+ if(data == NULL){ -+ printk("hppfs_get_data : head allocation failed\n"); -+ goto failed; -+ } -+ -+ INIT_LIST_HEAD(&data->list); -+ -+ head = data; -+ *size_out = 0; -+ -+ if(filter){ -+ while((n = read_proc(proc_file, data->contents, -+ sizeof(data->contents), NULL, 0)) > 0) -+ os_write_file(fd, data->contents, n); -+ err = os_shutdown_socket(fd, 0, 1); -+ if(err){ -+ printk("hppfs_get_data : failed to shut down " -+ "socket\n"); -+ goto failed_free; -+ } -+ } -+ while(1){ -+ n = os_read_file(fd, data->contents, sizeof(data->contents)); -+ if(n < 0){ -+ err = n; -+ printk("hppfs_get_data : read failed, errno = %d\n", -+ err); -+ goto failed_free; -+ } -+ else if(n == 0) -+ break; -+ -+ *size_out += n; -+ -+ if(n < sizeof(data->contents)) -+ break; -+ -+ new = kmalloc(sizeof(*data), GFP_KERNEL); -+ if(new == 0){ -+ printk("hppfs_get_data : data allocation failed\n"); -+ err = -ENOMEM; -+ goto failed_free; -+ } -+ -+ INIT_LIST_HEAD(&new->list); -+ list_add(&new->list, &data->list); -+ data = new; -+ } -+ return(head); -+ -+ failed_free: -+ free_contents(head); -+ failed: -+ return(ERR_PTR(err)); -+} -+ -+static struct hppfs_private *hppfs_data(void) -+{ -+ struct hppfs_private *data; -+ -+ data = kmalloc(sizeof(*data), GFP_KERNEL); -+ if(data == NULL) -+ return(data); -+ -+ *data = ((struct hppfs_private ) { .host_fd = -1, -+ .len = -1, -+ .contents = NULL } ); -+ return(data); -+} -+ -+static int hppfs_open(struct inode *inode, struct file *file) -+{ -+ struct hppfs_private *data; -+ struct dentry *proc_dentry; -+ char *host_file; -+ int err, fd, type, filter; -+ -+ err = -ENOMEM; -+ data = hppfs_data(); -+ if(data == NULL) -+ goto out; -+ -+ host_file = dentry_name(file->f_dentry, strlen("/rw")); -+ if(host_file == NULL) -+ goto out_free2; -+ -+ proc_dentry = inode->u.hppfs_i.proc_dentry; -+ err = init_private_file(&data->proc_file, proc_dentry, file->f_mode); -+ if(err) -+ goto out_free1; -+ -+ type = os_file_type(host_file); -+ if(type == OS_TYPE_FILE){ -+ fd = os_open_file(host_file, of_read(OPENFLAGS()), 0); -+ if(fd >= 0) -+ data->host_fd = fd; -+ else printk("hppfs_open : failed to open '%s', errno = %d\n", -+ host_file, -fd); -+ -+ data->contents = NULL; -+ } -+ else if(type == OS_TYPE_DIR){ -+ fd = open_host_sock(host_file, &filter); -+ if(fd > 0){ -+ data->contents = hppfs_get_data(fd, filter, -+ &data->proc_file, -+ file, &data->len); -+ if(!IS_ERR(data->contents)) -+ data->host_fd = fd; -+ } -+ else printk("hppfs_open : failed to open a socket in " -+ "'%s', errno = %d\n", host_file, -fd); -+ } -+ kfree(host_file); -+ -+ file->private_data = data; -+ return(0); -+ -+ out_free1: -+ kfree(host_file); -+ out_free2: -+ free_contents(data->contents); -+ kfree(data); -+ out: -+ return(err); -+} -+ -+static int hppfs_dir_open(struct inode *inode, struct file *file) -+{ -+ struct hppfs_private *data; -+ struct dentry *proc_dentry; -+ int err; -+ -+ err = -ENOMEM; -+ data = hppfs_data(); -+ if(data == NULL) -+ goto out; -+ -+ proc_dentry = inode->u.hppfs_i.proc_dentry; -+ err = init_private_file(&data->proc_file, proc_dentry, file->f_mode); -+ if(err) -+ goto out_free; -+ -+ file->private_data = data; -+ return(0); -+ -+ out_free: -+ kfree(data); -+ out: -+ return(err); -+} -+ -+static loff_t hppfs_llseek(struct file *file, loff_t off, int where) -+{ -+ struct hppfs_private *data = file->private_data; -+ struct file *proc_file = &data->proc_file; -+ loff_t (*llseek)(struct file *, loff_t, int); -+ loff_t ret; -+ -+ llseek = proc_file->f_dentry->d_inode->i_fop->llseek; -+ if(llseek != NULL){ -+ ret = (*llseek)(proc_file, off, where); -+ if(ret < 0) -+ return(ret); -+ } -+ -+ return(default_llseek(file, off, where)); -+} -+ -+struct hppfs_dirent { -+ void *vfs_dirent; -+ filldir_t filldir; -+ struct dentry *dentry; -+}; -+ -+static int hppfs_filldir(void *d, const char *name, int size, -+ loff_t offset, ino_t inode, unsigned int type) -+{ -+ struct hppfs_dirent *dirent = d; -+ -+ if(file_removed(dirent->dentry, name)) -+ return(0); -+ -+ return((*dirent->filldir)(dirent->vfs_dirent, name, size, offset, -+ inode, type)); -+} -+ -+static int hppfs_readdir(struct file *file, void *ent, filldir_t filldir) -+{ -+ struct hppfs_private *data = file->private_data; -+ struct file *proc_file = &data->proc_file; -+ int (*readdir)(struct file *, void *, filldir_t); -+ struct hppfs_dirent dirent = ((struct hppfs_dirent) -+ { .vfs_dirent = ent, -+ .filldir = filldir, -+ .dentry = file->f_dentry } ); -+ int err; -+ -+ readdir = proc_file->f_dentry->d_inode->i_fop->readdir; -+ -+ proc_file->f_pos = file->f_pos; -+ err = (*readdir)(proc_file, &dirent, hppfs_filldir); -+ file->f_pos = proc_file->f_pos; -+ -+ return(err); -+} -+ -+static int hppfs_fsync(struct file *file, struct dentry *dentry, int datasync) -+{ -+ return(0); -+} -+ -+static struct file_operations hppfs_file_fops = { -+ .owner = NULL, -+ .llseek = hppfs_llseek, -+ .read = hppfs_read, -+ .write = hppfs_write, -+ .open = hppfs_open, -+}; -+ -+static struct file_operations hppfs_dir_fops = { -+ .owner = NULL, -+ .readdir = hppfs_readdir, -+ .open = hppfs_dir_open, -+ .fsync = hppfs_fsync, -+}; -+ -+static int hppfs_statfs(struct super_block *sb, struct statfs *sf) -+{ -+ sf->f_blocks = 0; -+ sf->f_bfree = 0; -+ sf->f_bavail = 0; -+ sf->f_files = 0; -+ sf->f_ffree = 0; -+ sf->f_type = HPPFS_SUPER_MAGIC; -+ return(0); -+} -+ -+static struct super_operations hppfs_sbops = { -+ .put_inode = force_delete, -+ .delete_inode = NULL, -+ .statfs = hppfs_statfs, -+}; -+ -+static int hppfs_readlink(struct dentry *dentry, char *buffer, int buflen) -+{ -+ struct file proc_file; -+ struct dentry *proc_dentry; -+ int (*readlink)(struct dentry *, char *, int); -+ int err, n; -+ -+ proc_dentry = dentry->d_inode->u.hppfs_i.proc_dentry; -+ err = init_private_file(&proc_file, proc_dentry, FMODE_READ); -+ if(err) -+ return(err); -+ -+ readlink = proc_dentry->d_inode->i_op->readlink; -+ n = (*readlink)(proc_dentry, buffer, buflen); -+ -+ if(proc_file.f_op->release) -+ (*proc_file.f_op->release)(proc_dentry->d_inode, &proc_file); -+ -+ return(n); -+} -+ -+static int hppfs_follow_link(struct dentry *dentry, struct nameidata *nd) -+{ -+ struct file proc_file; -+ struct dentry *proc_dentry; -+ int (*follow_link)(struct dentry *, struct nameidata *); -+ int err, n; -+ -+ proc_dentry = dentry->d_inode->u.hppfs_i.proc_dentry; -+ err = init_private_file(&proc_file, proc_dentry, FMODE_READ); -+ if(err) -+ return(err); -+ -+ follow_link = proc_dentry->d_inode->i_op->follow_link; -+ n = (*follow_link)(proc_dentry, nd); -+ -+ if(proc_file.f_op->release) -+ (*proc_file.f_op->release)(proc_dentry->d_inode, &proc_file); -+ -+ return(n); -+} -+ -+static struct inode_operations hppfs_link_iops = { -+ .readlink = hppfs_readlink, -+ .follow_link = hppfs_follow_link, -+}; -+ -+static void read_inode(struct inode *ino) -+{ -+ struct inode *proc_ino; -+ -+ proc_ino = ino->u.hppfs_i.proc_dentry->d_inode; -+ ino->i_uid = proc_ino->i_uid; -+ ino->i_gid = proc_ino->i_gid; -+ ino->i_atime = proc_ino->i_atime; -+ ino->i_mtime = proc_ino->i_mtime; -+ ino->i_ctime = proc_ino->i_ctime; -+ ino->i_ino = proc_ino->i_ino; -+ ino->i_dev = proc_ino->i_dev; -+ ino->i_mode = proc_ino->i_mode; -+ ino->i_nlink = proc_ino->i_nlink; -+ ino->i_size = proc_ino->i_size; -+ ino->i_blksize = proc_ino->i_blksize; -+ ino->i_blocks = proc_ino->i_blocks; -+} -+ -+static struct inode *get_inode(struct super_block *sb, struct dentry *dentry, -+ int *error) -+{ -+ struct inode *inode; -+ int err = -ENOMEM; -+ -+ inode = new_inode(sb); -+ if(inode == NULL) -+ goto out; -+ -+ insert_inode_hash(inode); -+ if(S_ISDIR(dentry->d_inode->i_mode)){ -+ inode->i_op = &hppfs_dir_iops; -+ inode->i_fop = &hppfs_dir_fops; -+ } -+ else if(S_ISLNK(dentry->d_inode->i_mode)){ -+ inode->i_op = &hppfs_link_iops; -+ inode->i_fop = &hppfs_file_fops; -+ } -+ else { -+ inode->i_op = &hppfs_file_iops; -+ inode->i_fop = &hppfs_file_fops; -+ } -+ -+ inode->i_sb = sb; -+ inode->u.hppfs_i.proc_dentry = dentry; -+ -+ read_inode(inode); -+ err = 0; -+ -+ if(error) *error = err; -+ return(inode); -+ out: -+ if(error) *error = err; -+ return(NULL); -+} -+ -+static struct super_block *hppfs_read_super(struct super_block *sb, void *d, -+ int silent) -+{ -+ struct inode *root_inode; -+ struct file_system_type *procfs; -+ struct super_block *proc_sb; -+ -+ procfs = get_fs_type("proc"); -+ if(procfs == NULL) -+ goto out; -+ -+ if(list_empty(&procfs->fs_supers)) -+ goto out; -+ -+ proc_sb = list_entry(procfs->fs_supers.next, struct super_block, -+ s_instances); -+ -+ sb->s_blocksize = 1024; -+ sb->s_blocksize_bits = 10; -+ sb->s_magic = HPPFS_SUPER_MAGIC; -+ sb->s_op = &hppfs_sbops; -+ -+ dget(proc_sb->s_root); -+ root_inode = get_inode(sb, proc_sb->s_root, NULL); -+ if(root_inode == NULL) -+ goto out_dput; -+ -+ sb->s_root = d_alloc_root(root_inode); -+ if(sb->s_root == NULL) -+ goto out_put; -+ -+ return(sb); -+ -+ out_put: -+ iput(root_inode); -+ out_dput: -+ dput(proc_sb->s_root); -+ out: -+ return(NULL); -+} -+ -+DECLARE_FSTYPE(hppfs_type, "hppfs", hppfs_read_super, 0); -+ -+static int __init init_hppfs(void) -+{ -+ return(register_filesystem(&hppfs_type)); -+} -+ -+static void __exit exit_hppfs(void) -+{ -+ unregister_filesystem(&hppfs_type); -+} -+ -+module_init(init_hppfs) -+module_exit(exit_hppfs) -+MODULE_LICENSE("GPL"); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/fs/hppfs/Makefile um/arch/um/fs/hppfs/Makefile ---- orig/arch/um/fs/hppfs/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/fs/hppfs/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,10 @@ -+O_TARGET := hppfs.o -+obj-y = hppfs_kern.o #hppfs_user.o -+obj-m = $(O_TARGET) -+ -+CFLAGS_hppfs_kern.o := $(CFLAGS) -+#CFLAGS_hppfs_user.o := $(USER_CFLAGS) -+ -+override CFLAGS = -+ -+include $(TOPDIR)/Rules.make -diff -Naur -X ../exclude-files orig/arch/um/fs/Makefile um/arch/um/fs/Makefile ---- orig/arch/um/fs/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/fs/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,23 @@ -+# -+# Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET := built-in.o -+ -+subdir-y = -+subdir-m = -+ -+subdir-$(CONFIG_HOSTFS) += hostfs -+subdir-$(CONFIG_HPPFS) += hppfs -+ -+obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) -+obj-m += $(join $(subdir-m),$(subdir-m:%=/%.o)) -+ -+include $(TOPDIR)/Rules.make -+ -+dep: -+ -+clean: -+ -+archmrproper: -diff -Naur -X ../exclude-files orig/arch/um/include/2_5compat.h um/arch/um/include/2_5compat.h ---- orig/arch/um/include/2_5compat.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/2_5compat.h 2003-02-27 20:15:19.000000000 -0500 -@@ -0,0 +1,46 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __2_5_COMPAT_H__ -+#define __2_5_COMPAT_H__ -+ -+#include "linux/version.h" -+ -+#define INIT_CONSOLE(dev_name, write_proc, device_proc, setup_proc, f) { \ -+ name : dev_name, \ -+ write : write_proc, \ -+ read : NULL, \ -+ device : device_proc, \ -+ unblank : NULL, \ -+ setup : setup_proc, \ -+ flags : f, \ -+ index : -1, \ -+ cflag : 0, \ -+ next : NULL \ -+} -+ -+#define INIT_ELV(queue, elv) elevator_init(elv, ELV_NOOP) -+ -+#define ELV_NOOP ELEVATOR_NOOP -+ -+#define INIT_HARDSECT(arr, maj, sizes) arr[maj] = sizes -+ -+#define IS_WRITE(req) ((req)->cmd == WRITE) -+ -+#define SET_PRI(task) \ -+ do { (task)->nice = 20; (task)->counter = -100; } while(0); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/chan_kern.h um/arch/um/include/chan_kern.h ---- orig/arch/um/include/chan_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/chan_kern.h 2002-11-15 13:32:35.000000000 -0500 -@@ -0,0 +1,56 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __CHAN_KERN_H__ -+#define __CHAN_KERN_H__ -+ -+#include "linux/tty.h" -+#include "linux/list.h" -+#include "chan_user.h" -+ -+struct chan { -+ struct list_head list; -+ char *dev; -+ unsigned int primary:1; -+ unsigned int input:1; -+ unsigned int output:1; -+ unsigned int opened:1; -+ int fd; -+ enum chan_init_pri pri; -+ struct chan_ops *ops; -+ void *data; -+}; -+ -+extern void chan_interrupt(struct list_head *chans, struct tq_struct *task, -+ struct tty_struct *tty, int irq, void *dev); -+extern int parse_chan_pair(char *str, struct list_head *chans, int pri, -+ int device, struct chan_opts *opts); -+extern int open_chan(struct list_head *chans); -+extern int write_chan(struct list_head *chans, const char *buf, int len, -+ int write_irq); -+extern int console_write_chan(struct list_head *chans, const char *buf, -+ int len); -+extern void close_chan(struct list_head *chans); -+extern void chan_enable_winch(struct list_head *chans, void *line); -+extern void enable_chan(struct list_head *chans, void *data); -+extern int chan_window_size(struct list_head *chans, -+ unsigned short *rows_out, -+ unsigned short *cols_out); -+extern int chan_out_fd(struct list_head *chans); -+extern int chan_config_string(struct list_head *chans, char *str, int size, -+ char **error_out); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/chan_user.h um/arch/um/include/chan_user.h ---- orig/arch/um/include/chan_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/chan_user.h 2002-11-06 16:44:00.000000000 -0500 -@@ -0,0 +1,66 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __CHAN_USER_H__ -+#define __CHAN_USER_H__ -+ -+#include "init.h" -+ -+struct chan_opts { -+ void (*announce)(char *dev_name, int dev); -+ char *xterm_title; -+ int raw; -+ unsigned long tramp_stack; -+ int in_kernel; -+}; -+ -+enum chan_init_pri { INIT_STATIC, INIT_ALL, INIT_ONE }; -+ -+struct chan_ops { -+ char *type; -+ void *(*init)(char *, int, struct chan_opts *); -+ int (*open)(int, int, int, void *, char **); -+ void (*close)(int, void *); -+ int (*read)(int, char *, void *); -+ int (*write)(int, const char *, int, void *); -+ int (*console_write)(int, const char *, int, void *); -+ int (*window_size)(int, void *, unsigned short *, unsigned short *); -+ void (*free)(void *); -+ int winch; -+}; -+ -+extern struct chan_ops fd_ops, null_ops, port_ops, pts_ops, pty_ops, tty_ops, -+ xterm_ops; -+ -+extern void generic_close(int fd, void *unused); -+extern int generic_read(int fd, char *c_out, void *unused); -+extern int generic_write(int fd, const char *buf, int n, void *unused); -+extern int generic_console_write(int fd, const char *buf, int n, void *state); -+extern int generic_window_size(int fd, void *unused, unsigned short *rows_out, -+ unsigned short *cols_out); -+extern void generic_free(void *data); -+ -+extern void register_winch(int fd, void *device_data); -+extern void register_winch_irq(int fd, int tty_fd, int pid, void *line); -+ -+#define __channel_help(fn, prefix) \ -+__uml_help(fn, prefix "[0-9]*=<channel description>\n" \ -+" Attach a console or serial line to a host channel. See\n" \ -+" http://user-mode-linux.sourceforge.net/input.html for a complete\n" \ -+" description of this switch.\n\n" \ -+); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/choose-mode.h um/arch/um/include/choose-mode.h ---- orig/arch/um/include/choose-mode.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/choose-mode.h 2003-01-17 13:23:32.000000000 -0500 -@@ -0,0 +1,35 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __CHOOSE_MODE_H__ -+#define __CHOOSE_MODE_H__ -+ -+#include "uml-config.h" -+ -+#if defined(UML_CONFIG_MODE_TT) && defined(UML_CONFIG_MODE_SKAS) -+#define CHOOSE_MODE(tt, skas) (mode_tt ? (tt) : (skas)) -+ -+#elif defined(UML_CONFIG_MODE_SKAS) -+#define CHOOSE_MODE(tt, skas) (skas) -+ -+#elif defined(UML_CONFIG_MODE_TT) -+#define CHOOSE_MODE(tt, skas) (tt) -+#endif -+ -+#define CHOOSE_MODE_PROC(tt, skas, args...) \ -+ CHOOSE_MODE(tt(args), skas(args)) -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/frame.h um/arch/um/include/frame.h ---- orig/arch/um/include/frame.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/frame.h 2002-12-02 21:43:03.000000000 -0500 -@@ -0,0 +1,53 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __FRAME_H_ -+#define __FRAME_H_ -+ -+#include "sysdep/frame.h" -+ -+struct frame_common { -+ void *data; -+ int len; -+ int sig_index; -+ int sr_index; -+ int sr_relative; -+ int sp_index; -+ struct arch_frame_data arch; -+}; -+ -+struct sc_frame { -+ struct frame_common common; -+ int sc_index; -+}; -+ -+extern struct sc_frame signal_frame_sc; -+ -+extern struct sc_frame signal_frame_sc_sr; -+ -+struct si_frame { -+ struct frame_common common; -+ int sip_index; -+ int si_index; -+ int ucp_index; -+ int uc_index; -+}; -+ -+extern struct si_frame signal_frame_si; -+ -+extern void capture_signal_stack(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/frame_kern.h um/arch/um/include/frame_kern.h ---- orig/arch/um/include/frame_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/frame_kern.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,34 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __FRAME_KERN_H_ -+#define __FRAME_KERN_H_ -+ -+#include "frame.h" -+#include "sysdep/frame_kern.h" -+ -+extern int setup_signal_stack_sc(unsigned long stack_top, int sig, -+ unsigned long handler, -+ void (*restorer)(void), -+ struct pt_regs *regs, -+ sigset_t *mask); -+extern int setup_signal_stack_si(unsigned long stack_top, int sig, -+ unsigned long handler, -+ void (*restorer)(void), -+ struct pt_regs *regs, siginfo_t *info, -+ sigset_t *mask); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/frame_user.h um/arch/um/include/frame_user.h ---- orig/arch/um/include/frame_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/frame_user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,23 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __FRAME_USER_H_ -+#define __FRAME_USER_H_ -+ -+#include "sysdep/frame_user.h" -+#include "frame.h" -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/helper.h um/arch/um/include/helper.h ---- orig/arch/um/include/helper.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/helper.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __HELPER_H__ -+#define __HELPER_H__ -+ -+extern int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, -+ unsigned long *stack_out); -+extern int run_helper_thread(int (*proc)(void *), void *arg, -+ unsigned int flags, unsigned long *stack_out, -+ int stack_order); -+extern int helper_wait(int pid); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/hostaudio.h um/arch/um/include/hostaudio.h ---- orig/arch/um/include/hostaudio.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/hostaudio.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,48 @@ -+/* -+ * Copyright (C) 2002 Steve Schmidtke -+ * Licensed under the GPL -+ */ -+ -+#ifndef HOSTAUDIO_H -+#define HOSTAUDIO_H -+ -+#define HOSTAUDIO_DEV_DSP "/dev/sound/dsp" -+#define HOSTAUDIO_DEV_MIXER "/dev/sound/mixer" -+ -+struct hostaudio_state { -+ int fd; -+}; -+ -+struct hostmixer_state { -+ int fd; -+}; -+ -+/* UML user-side protoypes */ -+extern ssize_t hostaudio_read_user(struct hostaudio_state *state, char *buffer, -+ size_t count, loff_t *ppos); -+extern ssize_t hostaudio_write_user(struct hostaudio_state *state, -+ const char *buffer, size_t count, -+ loff_t *ppos); -+extern int hostaudio_ioctl_user(struct hostaudio_state *state, -+ unsigned int cmd, unsigned long arg); -+extern int hostaudio_open_user(struct hostaudio_state *state, int r, int w, -+ char *dsp); -+extern int hostaudio_release_user(struct hostaudio_state *state); -+extern int hostmixer_ioctl_mixdev_user(struct hostmixer_state *state, -+ unsigned int cmd, unsigned long arg); -+extern int hostmixer_open_mixdev_user(struct hostmixer_state *state, int r, -+ int w, char *mixer); -+extern int hostmixer_release_mixdev_user(struct hostmixer_state *state); -+ -+#endif /* HOSTAUDIO_H */ -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/init.h um/arch/um/include/init.h ---- orig/arch/um/include/init.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/init.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,114 @@ -+#ifndef _LINUX_UML_INIT_H -+#define _LINUX_UML_INIT_H -+ -+/* These macros are used to mark some functions or -+ * initialized data (doesn't apply to uninitialized data) -+ * as `initialization' functions. The kernel can take this -+ * as hint that the function is used only during the initialization -+ * phase and free up used memory resources after -+ * -+ * Usage: -+ * For functions: -+ * -+ * You should add __init immediately before the function name, like: -+ * -+ * static void __init initme(int x, int y) -+ * { -+ * extern int z; z = x * y; -+ * } -+ * -+ * If the function has a prototype somewhere, you can also add -+ * __init between closing brace of the prototype and semicolon: -+ * -+ * extern int initialize_foobar_device(int, int, int) __init; -+ * -+ * For initialized data: -+ * You should insert __initdata between the variable name and equal -+ * sign followed by value, e.g.: -+ * -+ * static int init_variable __initdata = 0; -+ * static char linux_logo[] __initdata = { 0x32, 0x36, ... }; -+ * -+ * Don't forget to initialize data not at file scope, i.e. within a function, -+ * as gcc otherwise puts the data into the bss section and not into the init -+ * section. -+ * -+ * Also note, that this data cannot be "const". -+ */ -+ -+#ifndef _LINUX_INIT_H -+typedef int (*initcall_t)(void); -+typedef void (*exitcall_t)(void); -+ -+#define __init __attribute__ ((__section__ (".text.init"))) -+#define __exit __attribute__ ((unused, __section__(".text.exit"))) -+#define __initdata __attribute__ ((__section__ (".data.init"))) -+ -+#endif -+ -+#ifndef MODULE -+struct uml_param { -+ const char *str; -+ int (*setup_func)(char *, int *); -+}; -+ -+extern initcall_t __uml_initcall_start, __uml_initcall_end; -+extern initcall_t __uml_postsetup_start, __uml_postsetup_end; -+extern const char *__uml_help_start, *__uml_help_end; -+#endif -+ -+#define __uml_initcall(fn) \ -+ static initcall_t __uml_initcall_##fn __uml_init_call = fn -+ -+#define __uml_exitcall(fn) \ -+ static exitcall_t __uml_exitcall_##fn __uml_exit_call = fn -+ -+extern struct uml_param __uml_setup_start, __uml_setup_end; -+ -+#define __uml_postsetup(fn) \ -+ static initcall_t __uml_postsetup_##fn __uml_postsetup_call = fn -+ -+#define __non_empty_string(dummyname,string) \ -+ struct __uml_non_empty_string_struct_##dummyname \ -+ { \ -+ char _string[sizeof(string)-2]; \ -+ } -+ -+#ifndef MODULE -+#define __uml_setup(str, fn, help...) \ -+ __non_empty_string(fn ##_setup, str); \ -+ __uml_help(fn, help); \ -+ static char __uml_setup_str_##fn[] __initdata = str; \ -+ static struct uml_param __uml_setup_##fn __uml_init_setup = { __uml_setup_str_##fn, fn } -+#else -+#define __uml_setup(str, fn, help...) \ -+ -+#endif -+ -+#define __uml_help(fn, help...) \ -+ __non_empty_string(fn ##__help, help); \ -+ static char __uml_help_str_##fn[] __initdata = help; \ -+ static const char *__uml_help_##fn __uml_setup_help = __uml_help_str_##fn -+ -+/* -+ * Mark functions and data as being only used at initialization -+ * or exit time. -+ */ -+#define __uml_init_setup __attribute__ ((unused,__section__ (".uml.setup.init"))) -+#define __uml_setup_help __attribute__ ((unused,__section__ (".uml.help.init"))) -+#define __uml_init_call __attribute__ ((unused,__section__ (".uml.initcall.init"))) -+#define __uml_postsetup_call __attribute__ ((unused,__section__ (".uml.postsetup.init"))) -+#define __uml_exit_call __attribute__ ((unused,__section__ (".uml.exitcall.exit"))) -+ -+#endif /* _LINUX_UML_INIT_H */ -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/initrd.h um/arch/um/include/initrd.h ---- orig/arch/um/include/initrd.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/initrd.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,22 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __INITRD_USER_H__ -+#define __INITRD_USER_H__ -+ -+extern int load_initrd(char *filename, void *buf, int size); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/irq_kern.h um/arch/um/include/irq_kern.h ---- orig/arch/um/include/irq_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/irq_kern.h 2003-05-15 13:57:48.000000000 -0400 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __IRQ_KERN_H__ -+#define __IRQ_KERN_H__ -+ -+#include "linux/interrupt.h" -+ -+extern int um_request_irq(unsigned int irq, int fd, int type, -+ void (*handler)(int, void *, struct pt_regs *), -+ unsigned long irqflags, const char * devname, -+ void *dev_id); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/irq_user.h um/arch/um/include/irq_user.h ---- orig/arch/um/include/irq_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/irq_user.h 2002-12-08 20:38:42.000000000 -0500 -@@ -0,0 +1,35 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __IRQ_USER_H__ -+#define __IRQ_USER_H__ -+ -+enum { IRQ_READ, IRQ_WRITE }; -+ -+extern void sigio_handler(int sig, union uml_pt_regs *regs); -+extern int activate_fd(int irq, int fd, int type, void *dev_id); -+extern void free_irq_by_irq_and_dev(int irq, void *dev_id); -+extern void free_irq_by_fd(int fd); -+extern void reactivate_fd(int fd, int irqnum); -+extern void deactivate_fd(int fd, int irqnum); -+extern void forward_interrupts(int pid); -+extern void init_irq_signals(int on_sigstack); -+extern void forward_ipi(int fd, int pid); -+extern void free_irq_later(int irq, void *dev_id); -+extern int activate_ipi(int fd, int pid); -+extern unsigned long irq_lock(void); -+extern void irq_unlock(unsigned long flags); -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/kern.h um/arch/um/include/kern.h ---- orig/arch/um/include/kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/kern.h 2002-11-02 21:38:02.000000000 -0500 -@@ -0,0 +1,48 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __KERN_H__ -+#define __KERN_H__ -+ -+/* These are all user-mode things which are convenient to call directly -+ * from kernel code and for which writing a wrapper is too much of a pain. -+ * The regular include files can't be included because this file is included -+ * only into kernel code, and user-space includes conflict with kernel -+ * includes. -+ */ -+ -+extern int errno; -+ -+extern int clone(int (*proc)(void *), void *sp, int flags, void *data); -+extern int sleep(int); -+extern int printf(char *fmt, ...); -+extern char *strerror(int errnum); -+extern char *ptsname(int __fd); -+extern int munmap(void *, int); -+extern void *sbrk(int increment); -+extern void *malloc(int size); -+extern void perror(char *err); -+extern int kill(int pid, int sig); -+extern int getuid(void); -+extern int pause(void); -+extern int write(int, const void *, int); -+extern int exit(int); -+extern int close(int); -+extern int read(unsigned int, char *, int); -+extern int pipe(int *); -+extern int sched_yield(void); -+extern int ptrace(int op, int pid, long addr, long data); -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/kern_util.h um/arch/um/include/kern_util.h ---- orig/arch/um/include/kern_util.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/kern_util.h 2003-04-16 16:00:11.000000000 -0400 -@@ -0,0 +1,121 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __KERN_UTIL_H__ -+#define __KERN_UTIL_H__ -+ -+#include "sysdep/ptrace.h" -+ -+extern int ncpus; -+extern char *linux_prog; -+extern char *gdb_init; -+extern int kmalloc_ok; -+extern int timer_irq_inited; -+extern int jail; -+extern int nsyscalls; -+ -+#define UML_ROUND_DOWN(addr) ((void *)(((unsigned long) addr) & PAGE_MASK)) -+#define UML_ROUND_UP(addr) \ -+ UML_ROUND_DOWN(((unsigned long) addr) + PAGE_SIZE - 1) -+ -+extern int kernel_fork(unsigned long flags, int (*fn)(void *), void * arg); -+extern unsigned long stack_sp(unsigned long page); -+extern int kernel_thread_proc(void *data); -+extern void syscall_segv(int sig); -+extern int current_pid(void); -+extern unsigned long alloc_stack(int order, int atomic); -+extern int do_signal(int error); -+extern int is_stack_fault(unsigned long sp); -+extern unsigned long segv(unsigned long address, unsigned long ip, -+ int is_write, int is_user, void *sc); -+extern unsigned long handle_page_fault(unsigned long address, unsigned long ip, -+ int is_write, int is_user, -+ int *code_out); -+extern void syscall_ready(void); -+extern int segv_syscall(void); -+extern void kern_finish_exec(void *task, int new_pid, unsigned long stack); -+extern int page_size(void); -+extern int page_mask(void); -+extern int need_finish_fork(void); -+extern void free_stack(unsigned long stack, int order); -+extern void add_input_request(int op, void (*proc)(int), void *arg); -+extern int sys_execve(char *file, char **argv, char **env); -+extern char *current_cmd(void); -+extern void timer_handler(int sig, union uml_pt_regs *regs); -+extern int set_signals(int enable); -+extern void force_sigbus(void); -+extern int pid_to_processor_id(int pid); -+extern void block_signals(void); -+extern void unblock_signals(void); -+extern void deliver_signals(void *t); -+extern int next_syscall_index(int max); -+extern int next_trap_index(int max); -+extern void cpu_idle(void); -+extern void finish_fork(void); -+extern void paging_init(void); -+extern void init_flush_vm(void); -+extern void *syscall_sp(void *t); -+extern void syscall_trace(void); -+extern int hz(void); -+extern void idle_timer(void); -+extern unsigned int do_IRQ(int irq, union uml_pt_regs *regs); -+extern int external_pid(void *t); -+extern void boot_timer_handler(int sig); -+extern void interrupt_end(void); -+extern void initial_thread_cb(void (*proc)(void *), void *arg); -+extern int debugger_signal(int status, int pid); -+extern void debugger_parent_signal(int status, int pid); -+extern void child_signal(int pid, int status); -+extern int init_ptrace_proxy(int idle_pid, int startup, int stop); -+extern int init_parent_proxy(int pid); -+extern void check_stack_overflow(void *ptr); -+extern void relay_signal(int sig, union uml_pt_regs *regs); -+extern void not_implemented(void); -+extern int user_context(unsigned long sp); -+extern void timer_irq(union uml_pt_regs *regs); -+extern void unprotect_stack(unsigned long stack); -+extern void do_uml_exitcalls(void); -+extern int attach_debugger(int idle_pid, int pid, int stop); -+extern void bad_segv(unsigned long address, unsigned long ip, int is_write); -+extern int config_gdb(char *str); -+extern int remove_gdb(void); -+extern char *uml_strdup(char *string); -+extern void unprotect_kernel_mem(void); -+extern void protect_kernel_mem(void); -+extern void set_kmem_end(unsigned long); -+extern void uml_cleanup(void); -+extern void set_current(void *t); -+extern void lock_signalled_task(void *t); -+extern void IPI_handler(int cpu); -+extern int jail_setup(char *line, int *add); -+extern void *get_init_task(void); -+extern int clear_user_proc(void *buf, int size); -+extern int copy_to_user_proc(void *to, void *from, int size); -+extern int copy_from_user_proc(void *to, void *from, int size); -+extern int strlen_user_proc(char *str); -+extern void bus_handler(int sig, union uml_pt_regs *regs); -+extern void winch(int sig, union uml_pt_regs *regs); -+extern long execute_syscall(void *r); -+extern int smp_sigio_handler(void); -+extern void *get_current(void); -+extern struct task_struct *get_task(int pid, int require); -+extern void machine_halt(void); -+extern int is_syscall(unsigned long addr); -+extern void arch_switch(void); -+extern void free_irq(unsigned int, void *); -+extern int um_in_interrupt(void); -+extern int cpu(void); -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/line.h um/arch/um/include/line.h ---- orig/arch/um/include/line.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/line.h 2002-11-15 13:44:44.000000000 -0500 -@@ -0,0 +1,106 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __LINE_H__ -+#define __LINE_H__ -+ -+#include "linux/list.h" -+#include "linux/tqueue.h" -+#include "linux/tty.h" -+#include "asm/semaphore.h" -+#include "chan_user.h" -+#include "mconsole_kern.h" -+ -+struct line_driver { -+ char *name; -+ char *devfs_name; -+ short major; -+ short minor_start; -+ short type; -+ short subtype; -+ int read_irq; -+ char *read_irq_name; -+ int write_irq; -+ char *write_irq_name; -+ char *symlink_from; -+ char *symlink_to; -+ struct mc_device mc; -+}; -+ -+struct line { -+ char *init_str; -+ int init_pri; -+ struct list_head chan_list; -+ int valid; -+ int count; -+ struct tty_struct *tty; -+ struct semaphore sem; -+ char *buffer; -+ char *head; -+ char *tail; -+ int sigio; -+ struct tq_struct task; -+ struct line_driver *driver; -+ int have_irq; -+}; -+ -+#define LINE_INIT(str, d) \ -+ { init_str : str, \ -+ init_pri : INIT_STATIC, \ -+ chan_list : { }, \ -+ valid : 1, \ -+ count : 0, \ -+ tty : NULL, \ -+ sem : { }, \ -+ buffer : NULL, \ -+ head : NULL, \ -+ tail : NULL, \ -+ sigio : 0, \ -+ driver : d, \ -+ have_irq : 0 } -+ -+struct lines { -+ int num; -+}; -+ -+#define LINES_INIT(n) { num : n } -+ -+extern void line_interrupt(int irq, void *data, struct pt_regs *unused); -+extern void line_write_interrupt(int irq, void *data, struct pt_regs *unused); -+extern void line_close(struct line *lines, struct tty_struct *tty); -+extern int line_open(struct line *lines, struct tty_struct *tty, -+ struct chan_opts *opts); -+extern int line_setup(struct line *lines, int num, char *init, -+ int all_allowed); -+extern int line_write(struct line *line, struct tty_struct *tty, int from_user, -+ const char *buf, int len); -+extern int line_write_room(struct tty_struct *tty); -+extern char *add_xterm_umid(char *base); -+extern int line_setup_irq(int fd, int input, int output, void *data); -+extern void line_close_chan(struct line *line); -+extern void line_disable(struct line *line, int current_irq); -+extern void line_register_devfs(struct lines *set, -+ struct line_driver *line_driver, -+ struct tty_driver *driver, struct line *lines, -+ int nlines); -+extern void lines_init(struct line *lines, int nlines); -+extern void close_lines(struct line *lines, int nlines); -+extern int line_config(struct line *lines, int num, char *str); -+extern int line_remove(struct line *lines, int num, char *str); -+extern int line_get_config(char *dev, struct line *lines, int num, char *str, -+ int size, char **error_out); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/Makefile um/arch/um/include/Makefile ---- orig/arch/um/include/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,7 @@ -+all : sc.h -+ -+sc.h : ../util/mk_sc -+ ../util/mk_sc > $@ -+ -+../util/mk_sc : -+ $(MAKE) -C ../util mk_sc -diff -Naur -X ../exclude-files orig/arch/um/include/mconsole.h um/arch/um/include/mconsole.h ---- orig/arch/um/include/mconsole.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/mconsole.h 2003-01-17 13:48:25.000000000 -0500 -@@ -0,0 +1,99 @@ -+/* -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __MCONSOLE_H__ -+#define __MCONSOLE_H__ -+ -+#ifndef __KERNEL__ -+#include <stdint.h> -+#define u32 uint32_t -+#endif -+ -+#define MCONSOLE_MAGIC (0xcafebabe) -+#define MCONSOLE_MAX_DATA (512) -+#define MCONSOLE_VERSION 2 -+ -+struct mconsole_request { -+ u32 magic; -+ u32 version; -+ u32 len; -+ char data[MCONSOLE_MAX_DATA]; -+}; -+ -+struct mconsole_reply { -+ u32 err; -+ u32 more; -+ u32 len; -+ char data[MCONSOLE_MAX_DATA]; -+}; -+ -+struct mconsole_notify { -+ u32 magic; -+ u32 version; -+ enum { MCONSOLE_SOCKET, MCONSOLE_PANIC, MCONSOLE_HANG, -+ MCONSOLE_USER_NOTIFY } type; -+ u32 len; -+ char data[MCONSOLE_MAX_DATA]; -+}; -+ -+struct mc_request; -+ -+struct mconsole_command -+{ -+ char *command; -+ void (*handler)(struct mc_request *req); -+ int as_interrupt; -+}; -+ -+struct mc_request -+{ -+ int len; -+ int as_interrupt; -+ -+ int originating_fd; -+ int originlen; -+ unsigned char origin[128]; /* sockaddr_un */ -+ -+ struct mconsole_request request; -+ struct mconsole_command *cmd; -+}; -+ -+extern char mconsole_socket_name[]; -+ -+extern int mconsole_unlink_socket(void); -+extern int mconsole_reply(struct mc_request *req, char *reply, int err, -+ int more); -+ -+extern void mconsole_version(struct mc_request *req); -+extern void mconsole_help(struct mc_request *req); -+extern void mconsole_halt(struct mc_request *req); -+extern void mconsole_reboot(struct mc_request *req); -+extern void mconsole_config(struct mc_request *req); -+extern void mconsole_remove(struct mc_request *req); -+extern void mconsole_sysrq(struct mc_request *req); -+extern void mconsole_cad(struct mc_request *req); -+extern void mconsole_stop(struct mc_request *req); -+extern void mconsole_go(struct mc_request *req); -+ -+extern int mconsole_get_request(int fd, struct mc_request *req); -+extern int mconsole_notify(char *sock_name, int type, const void *data, -+ int len); -+extern char *mconsole_notify_socket(void); -+extern void lock_notify(void); -+extern void unlock_notify(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/mconsole_kern.h um/arch/um/include/mconsole_kern.h ---- orig/arch/um/include/mconsole_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/mconsole_kern.h 2002-11-15 15:21:58.000000000 -0500 -@@ -0,0 +1,62 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __MCONSOLE_KERN_H__ -+#define __MCONSOLE_KERN_H__ -+ -+#include "linux/config.h" -+#include "linux/list.h" -+#include "mconsole.h" -+ -+struct mconsole_entry { -+ struct list_head list; -+ struct mc_request request; -+}; -+ -+struct mc_device { -+ struct list_head list; -+ char *name; -+ int (*config)(char *); -+ int (*get_config)(char *, char *, int, char **); -+ int (*remove)(char *); -+}; -+ -+#define CONFIG_CHUNK(str, size, current, chunk, end) \ -+do { \ -+ current += strlen(chunk); \ -+ if(current >= size) \ -+ str = NULL; \ -+ if(str != NULL){ \ -+ strcpy(str, chunk); \ -+ str += strlen(chunk); \ -+ } \ -+ if(end) \ -+ current++; \ -+} while(0) -+ -+#ifdef CONFIG_MCONSOLE -+ -+extern void mconsole_register_dev(struct mc_device *new); -+ -+#else -+ -+static inline void mconsole_register_dev(struct mc_device *new) -+{ -+} -+ -+#endif -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/mem.h um/arch/um/include/mem.h ---- orig/arch/um/include/mem.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/mem.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,29 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __MEM_H__ -+#define __MEM_H__ -+ -+struct vm_reserved { -+ struct list_head list; -+ unsigned long start; -+ unsigned long end; -+}; -+ -+extern void set_usable_vm(unsigned long start, unsigned long end); -+extern void set_kmem_end(unsigned long new); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/mem_user.h um/arch/um/include/mem_user.h ---- orig/arch/um/include/mem_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/mem_user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,87 @@ -+/* -+ * arch/um/include/mem_user.h -+ * -+ * BRIEF MODULE DESCRIPTION -+ * user side memory interface for support IO memory inside user mode linux -+ * -+ * Copyright (C) 2001 RidgeRun, Inc. -+ * Author: RidgeRun, Inc. -+ * Greg Lonnon glonnon@ridgerun.com or info@ridgerun.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 of the License, or (at your -+ * option) any later version. -+ * -+ * THIS SOFTWARE IS PROVIDED ``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. -+ * -+ * 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 _MEM_USER_H -+#define _MEM_USER_H -+ -+struct mem_region { -+ char *driver; -+ unsigned long start_pfn; -+ unsigned long start; -+ unsigned long len; -+ void *mem_map; -+ int fd; -+}; -+ -+extern struct mem_region *regions[]; -+extern struct mem_region physmem_region; -+ -+#define ROUND_4M(n) ((((unsigned long) (n)) + (1 << 22)) & ~((1 << 22) - 1)) -+ -+extern unsigned long host_task_size; -+extern unsigned long task_size; -+ -+extern int init_mem_user(void); -+extern int create_mem_file(unsigned long len); -+extern void setup_range(int fd, char *driver, unsigned long start, -+ unsigned long pfn, unsigned long total, int need_vm, -+ struct mem_region *region, void *reserved); -+extern void setup_memory(void *entry); -+extern unsigned long find_iomem(char *driver, unsigned long *len_out); -+extern int init_maps(struct mem_region *region); -+extern int nregions(void); -+extern int reserve_vm(unsigned long start, unsigned long end, void *e); -+extern unsigned long get_vm(unsigned long len); -+extern void setup_physmem(unsigned long start, unsigned long usable, -+ unsigned long len); -+extern int setup_region(struct mem_region *region, void *entry); -+extern void add_iomem(char *name, int fd, unsigned long size); -+extern struct mem_region *phys_region(unsigned long phys); -+extern unsigned long phys_offset(unsigned long phys); -+extern void unmap_physmem(void); -+extern int map_memory(unsigned long virt, unsigned long phys, -+ unsigned long len, int r, int w, int x); -+extern int protect_memory(unsigned long addr, unsigned long len, -+ int r, int w, int x, int must_succeed); -+extern unsigned long get_kmem_end(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/mode.h um/arch/um/include/mode.h ---- orig/arch/um/include/mode.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/mode.h 2003-01-17 13:23:32.000000000 -0500 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __MODE_H__ -+#define __MODE_H__ -+ -+#include "uml-config.h" -+ -+#ifdef UML_CONFIG_MODE_TT -+#include "../kernel/tt/include/mode.h" -+#endif -+ -+#ifdef UML_CONFIG_MODE_SKAS -+#include "../kernel/skas/include/mode.h" -+#endif -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/mode_kern.h um/arch/um/include/mode_kern.h ---- orig/arch/um/include/mode_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/mode_kern.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __MODE_KERN_H__ -+#define __MODE_KERN_H__ -+ -+#include "linux/config.h" -+ -+#ifdef CONFIG_MODE_TT -+#include "../kernel/tt/include/mode_kern.h" -+#endif -+ -+#ifdef CONFIG_MODE_SKAS -+#include "../kernel/skas/include/mode_kern.h" -+#endif -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/net_kern.h um/arch/um/include/net_kern.h ---- orig/arch/um/include/net_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/net_kern.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,81 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UM_NET_KERN_H -+#define __UM_NET_KERN_H -+ -+#include "linux/netdevice.h" -+#include "linux/skbuff.h" -+#include "linux/socket.h" -+#include "linux/list.h" -+ -+struct uml_net { -+ struct list_head list; -+ struct net_device *dev; -+ int index; -+ unsigned char mac[ETH_ALEN]; -+ int have_mac; -+}; -+ -+struct uml_net_private { -+ struct list_head list; -+ spinlock_t lock; -+ struct net_device *dev; -+ struct timer_list tl; -+ struct net_device_stats stats; -+ int fd; -+ unsigned char mac[ETH_ALEN]; -+ int have_mac; -+ unsigned short (*protocol)(struct sk_buff *); -+ int (*open)(void *); -+ void (*close)(int, void *); -+ void (*remove)(void *); -+ int (*read)(int, struct sk_buff **skb, struct uml_net_private *); -+ int (*write)(int, struct sk_buff **skb, struct uml_net_private *); -+ -+ void (*add_address)(unsigned char *, unsigned char *, void *); -+ void (*delete_address)(unsigned char *, unsigned char *, void *); -+ int (*set_mtu)(int mtu, void *); -+ int user[1]; -+}; -+ -+struct net_kern_info { -+ void (*init)(struct net_device *, void *); -+ unsigned short (*protocol)(struct sk_buff *); -+ int (*read)(int, struct sk_buff **skb, struct uml_net_private *); -+ int (*write)(int, struct sk_buff **skb, struct uml_net_private *); -+}; -+ -+struct transport { -+ struct list_head list; -+ char *name; -+ int (*setup)(char *, char **, void *); -+ struct net_user_info *user; -+ struct net_kern_info *kern; -+ int private_size; -+ int setup_size; -+}; -+ -+extern struct net_device *ether_init(int); -+extern unsigned short ether_protocol(struct sk_buff *); -+extern int setup_etheraddr(char *str, unsigned char *addr); -+extern struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra); -+extern int tap_setup_common(char *str, char *type, char **dev_name, -+ char **mac_out, char **gate_addr); -+extern void register_transport(struct transport *new); -+extern unsigned short eth_protocol(struct sk_buff *skb); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/net_user.h um/arch/um/include/net_user.h ---- orig/arch/um/include/net_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/net_user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,66 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UM_NET_USER_H__ -+#define __UM_NET_USER_H__ -+ -+#define ETH_ADDR_LEN (6) -+#define ETH_HEADER_ETHERTAP (16) -+#define ETH_HEADER_OTHER (14) -+#define ETH_MAX_PACKET (1500) -+ -+#define UML_NET_VERSION (4) -+ -+struct net_user_info { -+ void (*init)(void *, void *); -+ int (*open)(void *); -+ void (*close)(int, void *); -+ void (*remove)(void *); -+ int (*set_mtu)(int mtu, void *); -+ void (*add_address)(unsigned char *, unsigned char *, void *); -+ void (*delete_address)(unsigned char *, unsigned char *, void *); -+ int max_packet; -+}; -+ -+extern void ether_user_init(void *data, void *dev); -+extern void dev_ip_addr(void *d, char *buf, char *bin_buf); -+extern void set_ether_mac(void *d, unsigned char *addr); -+extern void iter_addresses(void *d, void (*cb)(unsigned char *, -+ unsigned char *, void *), -+ void *arg); -+ -+extern void *get_output_buffer(int *len_out); -+extern void free_output_buffer(void *buffer); -+ -+extern int tap_open_common(void *dev, char *gate_addr); -+extern void tap_check_ips(char *gate_addr, char *eth_addr); -+ -+extern void read_output(int fd, char *output_out, int len); -+ -+extern int net_read(int fd, void *buf, int len); -+extern int net_recvfrom(int fd, void *buf, int len); -+extern int net_write(int fd, void *buf, int len); -+extern int net_send(int fd, void *buf, int len); -+extern int net_sendto(int fd, void *buf, int len, void *to, int sock_len); -+ -+extern void open_addr(unsigned char *addr, unsigned char *netmask, void *arg); -+extern void close_addr(unsigned char *addr, unsigned char *netmask, void *arg); -+ -+extern char *split_if_spec(char *str, ...); -+ -+extern int dev_netmask(void *d, void *m); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/os.h um/arch/um/include/os.h ---- orig/arch/um/include/os.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/os.h 2003-02-04 19:11:32.000000000 -0500 -@@ -0,0 +1,137 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __OS_H__ -+#define __OS_H__ -+ -+#include "asm/types.h" -+#include "../os/include/file.h" -+ -+#define OS_TYPE_FILE 1 -+#define OS_TYPE_DIR 2 -+#define OS_TYPE_SYMLINK 3 -+#define OS_TYPE_CHARDEV 4 -+#define OS_TYPE_BLOCKDEV 5 -+#define OS_TYPE_FIFO 6 -+#define OS_TYPE_SOCK 7 -+ -+struct openflags { -+ unsigned int r : 1; -+ unsigned int w : 1; -+ unsigned int s : 1; /* O_SYNC */ -+ unsigned int c : 1; /* O_CREAT */ -+ unsigned int t : 1; /* O_TRUNC */ -+ unsigned int a : 1; /* O_APPEND */ -+ unsigned int e : 1; /* O_EXCL */ -+ unsigned int cl : 1; /* FD_CLOEXEC */ -+}; -+ -+#define OPENFLAGS() ((struct openflags) { .r = 0, .w = 0, .s = 0, .c = 0, \ -+ .t = 0, .a = 0, .e = 0, .cl = 0 }) -+ -+static inline struct openflags of_read(struct openflags flags) -+{ -+ flags.r = 1; -+ return(flags); -+} -+ -+static inline struct openflags of_write(struct openflags flags) -+{ -+ flags.w = 1; -+ return(flags); -+} -+ -+static inline struct openflags of_rdwr(struct openflags flags) -+{ -+ return(of_read(of_write(flags))); -+} -+ -+static inline struct openflags of_set_rw(struct openflags flags, int r, int w) -+{ -+ flags.r = r; -+ flags.w = w; -+ return(flags); -+} -+ -+static inline struct openflags of_sync(struct openflags flags) -+{ -+ flags.s = 1; -+ return(flags); -+} -+ -+static inline struct openflags of_create(struct openflags flags) -+{ -+ flags.c = 1; -+ return(flags); -+} -+ -+static inline struct openflags of_trunc(struct openflags flags) -+{ -+ flags.t = 1; -+ return(flags); -+} -+ -+static inline struct openflags of_append(struct openflags flags) -+{ -+ flags.a = 1; -+ return(flags); -+} -+ -+static inline struct openflags of_excl(struct openflags flags) -+{ -+ flags.e = 1; -+ return(flags); -+} -+ -+static inline struct openflags of_cloexec(struct openflags flags) -+{ -+ flags.cl = 1; -+ return(flags); -+} -+ -+extern int os_seek_file(int fd, __u64 offset); -+extern int os_open_file(char *file, struct openflags flags, int mode); -+extern int os_read_file(int fd, void *buf, int len); -+extern int os_write_file(int fd, void *buf, int count); -+extern int os_file_size(char *file, long long *size_out); -+extern int os_pipe(int *fd, int stream, int close_on_exec); -+extern int os_set_fd_async(int fd, int owner); -+extern int os_set_fd_block(int fd, int blocking); -+extern int os_accept_connection(int fd); -+extern int os_shutdown_socket(int fd, int r, int w); -+extern void os_close_file(int fd); -+extern int os_rcv_fd(int fd, int *helper_pid_out); -+extern int create_unix_socket(char *file, int len); -+extern int os_connect_socket(char *name); -+extern int os_file_type(char *file); -+extern int os_file_mode(char *file, struct openflags *mode_out); -+extern int os_lock_file(int fd, int excl); -+ -+extern unsigned long os_process_pc(int pid); -+extern int os_process_parent(int pid); -+extern void os_stop_process(int pid); -+extern void os_kill_process(int pid, int reap_child); -+extern void os_usr1_process(int pid); -+extern int os_getpid(void); -+ -+extern int os_map_memory(void *virt, int fd, unsigned long off, -+ unsigned long len, int r, int w, int x); -+extern int os_protect_memory(void *addr, unsigned long len, -+ int r, int w, int x); -+extern int os_unmap_memory(void *addr, int len); -+extern void os_flush_stdout(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/process.h um/arch/um/include/process.h ---- orig/arch/um/include/process.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/process.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,25 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __PROCESS_H__ -+#define __PROCESS_H__ -+ -+#include <asm/sigcontext.h> -+ -+extern void sig_handler(int sig, struct sigcontext sc); -+extern void alarm_handler(int sig, struct sigcontext sc); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/ptrace_user.h um/arch/um/include/ptrace_user.h ---- orig/arch/um/include/ptrace_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/ptrace_user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,18 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __PTRACE_USER_H__ -+#define __PTRACE_USER_H__ -+ -+#include "sysdep/ptrace_user.h" -+ -+extern int ptrace_getregs(long pid, unsigned long *regs_out); -+extern int ptrace_setregs(long pid, unsigned long *regs_in); -+extern int ptrace_getfpregs(long pid, unsigned long *regs_out); -+extern void arch_enter_kernel(void *task, int pid); -+extern void arch_leave_kernel(void *task, int pid); -+extern void ptrace_pokeuser(unsigned long addr, unsigned long data); -+ -+#endif -diff -Naur -X ../exclude-files orig/arch/um/include/sigcontext.h um/arch/um/include/sigcontext.h ---- orig/arch/um/include/sigcontext.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sigcontext.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,25 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UML_SIGCONTEXT_H__ -+#define __UML_SIGCONTEXT_H__ -+ -+#include "sysdep/sigcontext.h" -+ -+extern int sc_size(void *data); -+extern void sc_to_sc(void *to_ptr, void *from_ptr); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sigio.h um/arch/um/include/sigio.h ---- orig/arch/um/include/sigio.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sigio.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,28 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SIGIO_H__ -+#define __SIGIO_H__ -+ -+extern int write_sigio_irq(int fd); -+extern int register_sigio_fd(int fd); -+extern int read_sigio_fd(int fd); -+extern int add_sigio_fd(int fd, int read); -+extern int ignore_sigio_fd(int fd); -+extern void sigio_lock(void); -+extern void sigio_unlock(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/signal_kern.h um/arch/um/include/signal_kern.h ---- orig/arch/um/include/signal_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/signal_kern.h 2002-12-05 18:08:47.000000000 -0500 -@@ -0,0 +1,22 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SIGNAL_KERN_H__ -+#define __SIGNAL_KERN_H__ -+ -+extern int have_signals(void *t); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/signal_user.h um/arch/um/include/signal_user.h ---- orig/arch/um/include/signal_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/signal_user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,26 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SIGNAL_USER_H__ -+#define __SIGNAL_USER_H__ -+ -+extern int signal_stack_size; -+ -+extern int change_sig(int signal, int on); -+extern void set_sigstack(void *stack, int size); -+extern void set_handler(int sig, void (*handler)(int), int flags, ...); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/skas_ptrace.h um/arch/um/include/skas_ptrace.h ---- orig/arch/um/include/skas_ptrace.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/skas_ptrace.h 2002-12-16 11:54:52.000000000 -0500 -@@ -0,0 +1,36 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SKAS_PTRACE_H -+#define __SKAS_PTRACE_H -+ -+struct ptrace_faultinfo { -+ int is_write; -+ unsigned long addr; -+}; -+ -+struct ptrace_ldt { -+ int func; -+ void *ptr; -+ unsigned long bytecount; -+}; -+ -+#define PTRACE_FAULTINFO 52 -+#define PTRACE_SIGPENDING 53 -+#define PTRACE_LDT 54 -+#define PTRACE_SWITCH_MM 55 -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/syscall_user.h um/arch/um/include/syscall_user.h ---- orig/arch/um/include/syscall_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/syscall_user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,23 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYSCALL_USER_H -+#define __SYSCALL_USER_H -+ -+extern int record_syscall_start(int syscall); -+extern void record_syscall_end(int index, int result); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/checksum.h um/arch/um/include/sysdep-i386/checksum.h ---- orig/arch/um/include/sysdep-i386/checksum.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-i386/checksum.h 2002-10-29 21:23:02.000000000 -0500 -@@ -0,0 +1,217 @@ -+/* -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UM_SYSDEP_CHECKSUM_H -+#define __UM_SYSDEP_CHECKSUM_H -+ -+#include "linux/string.h" -+ -+/* -+ * computes the checksum of a memory block at buff, length len, -+ * and adds in "sum" (32-bit) -+ * -+ * returns a 32-bit number suitable for feeding into itself -+ * or csum_tcpudp_magic -+ * -+ * this function must be called with even lengths, except -+ * for the last fragment, which may be odd -+ * -+ * it's best to have buff aligned on a 32-bit boundary -+ */ -+unsigned int csum_partial(const unsigned char * buff, int len, -+ unsigned int sum); -+ -+/* -+ * the same as csum_partial, but copies from src while it -+ * checksums, and handles user-space pointer exceptions correctly, when needed. -+ * -+ * here even more important to align src and dst on a 32-bit (or even -+ * better 64-bit) boundary -+ */ -+ -+unsigned int csum_partial_copy_to(const char *src, char *dst, int len, -+ int sum, int *err_ptr); -+unsigned int csum_partial_copy_from(const char *src, char *dst, int len, -+ int sum, int *err_ptr); -+ -+/* -+ * Note: when you get a NULL pointer exception here this means someone -+ * passed in an incorrect kernel address to one of these functions. -+ * -+ * If you use these functions directly please don't forget the -+ * verify_area(). -+ */ -+ -+static __inline__ -+unsigned int csum_partial_copy_nocheck(const char *src, char *dst, -+ int len, int sum) -+{ -+ memcpy(dst, src, len); -+ return(csum_partial(dst, len, sum)); -+} -+ -+static __inline__ -+unsigned int csum_partial_copy_from_user(const char *src, char *dst, -+ int len, int sum, int *err_ptr) -+{ -+ return csum_partial_copy_from(src, dst, len, sum, err_ptr); -+} -+ -+/* -+ * These are the old (and unsafe) way of doing checksums, a warning message -+ * will be printed if they are used and an exeption occurs. -+ * -+ * these functions should go away after some time. -+ */ -+ -+#define csum_partial_copy_fromuser csum_partial_copy_from_user -+unsigned int csum_partial_copy( const char *src, char *dst, int len, int sum); -+ -+/* -+ * This is a version of ip_compute_csum() optimized for IP headers, -+ * which always checksum on 4 octet boundaries. -+ * -+ * By Jorge Cwik <jorge@laser.satlink.net>, adapted for linux by -+ * Arnt Gulbrandsen. -+ */ -+static inline unsigned short ip_fast_csum(unsigned char * iph, -+ unsigned int ihl) -+{ -+ unsigned int sum; -+ -+ __asm__ __volatile__( -+ "movl (%1), %0 ;\n" -+ "subl $4, %2 ;\n" -+ "jbe 2f ;\n" -+ "addl 4(%1), %0 ;\n" -+ "adcl 8(%1), %0 ;\n" -+ "adcl 12(%1), %0 ;\n" -+"1: adcl 16(%1), %0 ;\n" -+ "lea 4(%1), %1 ;\n" -+ "decl %2 ;\n" -+ "jne 1b ;\n" -+ "adcl $0, %0 ;\n" -+ "movl %0, %2 ;\n" -+ "shrl $16, %0 ;\n" -+ "addw %w2, %w0 ;\n" -+ "adcl $0, %0 ;\n" -+ "notl %0 ;\n" -+"2: ;\n" -+ /* Since the input registers which are loaded with iph and ipl -+ are modified, we must also specify them as outputs, or gcc -+ will assume they contain their original values. */ -+ : "=r" (sum), "=r" (iph), "=r" (ihl) -+ : "1" (iph), "2" (ihl)); -+ return(sum); -+} -+ -+/* -+ * Fold a partial checksum -+ */ -+ -+static inline unsigned int csum_fold(unsigned int sum) -+{ -+ __asm__( -+ "addl %1, %0 ;\n" -+ "adcl $0xffff, %0 ;\n" -+ : "=r" (sum) -+ : "r" (sum << 16), "0" (sum & 0xffff0000) -+ ); -+ return (~sum) >> 16; -+} -+ -+static inline unsigned long csum_tcpudp_nofold(unsigned long saddr, -+ unsigned long daddr, -+ unsigned short len, -+ unsigned short proto, -+ unsigned int sum) -+{ -+ __asm__( -+ "addl %1, %0 ;\n" -+ "adcl %2, %0 ;\n" -+ "adcl %3, %0 ;\n" -+ "adcl $0, %0 ;\n" -+ : "=r" (sum) -+ : "g" (daddr), "g"(saddr), "g"((ntohs(len)<<16)+proto*256), "0"(sum)); -+ return sum; -+} -+ -+/* -+ * computes the checksum of the TCP/UDP pseudo-header -+ * returns a 16-bit checksum, already complemented -+ */ -+static inline unsigned short int csum_tcpudp_magic(unsigned long saddr, -+ unsigned long daddr, -+ unsigned short len, -+ unsigned short proto, -+ unsigned int sum) -+{ -+ return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); -+} -+ -+/* -+ * this routine is used for miscellaneous IP-like checksums, mainly -+ * in icmp.c -+ */ -+ -+static inline unsigned short ip_compute_csum(unsigned char * buff, int len) -+{ -+ return csum_fold (csum_partial(buff, len, 0)); -+} -+ -+#define _HAVE_ARCH_IPV6_CSUM -+static __inline__ unsigned short int csum_ipv6_magic(struct in6_addr *saddr, -+ struct in6_addr *daddr, -+ __u32 len, -+ unsigned short proto, -+ unsigned int sum) -+{ -+ __asm__( -+ "addl 0(%1), %0 ;\n" -+ "adcl 4(%1), %0 ;\n" -+ "adcl 8(%1), %0 ;\n" -+ "adcl 12(%1), %0 ;\n" -+ "adcl 0(%2), %0 ;\n" -+ "adcl 4(%2), %0 ;\n" -+ "adcl 8(%2), %0 ;\n" -+ "adcl 12(%2), %0 ;\n" -+ "adcl %3, %0 ;\n" -+ "adcl %4, %0 ;\n" -+ "adcl $0, %0 ;\n" -+ : "=&r" (sum) -+ : "r" (saddr), "r" (daddr), -+ "r"(htonl(len)), "r"(htonl(proto)), "0"(sum)); -+ -+ return csum_fold(sum); -+} -+ -+/* -+ * Copy and checksum to user -+ */ -+#define HAVE_CSUM_COPY_USER -+static __inline__ unsigned int csum_and_copy_to_user(const char *src, -+ char *dst, int len, -+ int sum, int *err_ptr) -+{ -+ if (access_ok(VERIFY_WRITE, dst, len)) -+ return(csum_partial_copy_to(src, dst, len, sum, err_ptr)); -+ -+ if (len) -+ *err_ptr = -EFAULT; -+ -+ return -1; /* invalid checksum */ -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame.h um/arch/um/include/sysdep-i386/frame.h ---- orig/arch/um/include/sysdep-i386/frame.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-i386/frame.h 2002-12-06 14:07:54.000000000 -0500 -@@ -0,0 +1,29 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __FRAME_I386_H -+#define __FRAME_I386_H -+ -+struct arch_frame_data_raw { -+ unsigned long fp_start; -+ unsigned long sr; -+}; -+ -+struct arch_frame_data { -+ int fpstate_size; -+}; -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame_kern.h um/arch/um/include/sysdep-i386/frame_kern.h ---- orig/arch/um/include/sysdep-i386/frame_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-i386/frame_kern.h 2002-12-02 21:45:04.000000000 -0500 -@@ -0,0 +1,69 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __FRAME_KERN_I386_H -+#define __FRAME_KERN_I386_H -+ -+/* This is called from sys_sigreturn. It takes the sp at the point of the -+ * sigreturn system call and returns the address of the sigcontext struct -+ * on the stack. -+ */ -+ -+static inline void *sp_to_sc(unsigned long sp) -+{ -+ return((void *) sp); -+} -+ -+static inline void *sp_to_uc(unsigned long sp) -+{ -+ unsigned long uc; -+ -+ uc = sp + signal_frame_si.uc_index - -+ signal_frame_si.common.sp_index - 4; -+ return((void *) uc); -+} -+ -+static inline void *sp_to_rt_sc(unsigned long sp) -+{ -+ unsigned long sc; -+ -+ sc = sp - signal_frame_si.common.sp_index + -+ signal_frame_si.common.len - 4; -+ return((void *) sc); -+} -+ -+static inline void *sp_to_mask(unsigned long sp) -+{ -+ unsigned long mask; -+ -+ mask = sp - signal_frame_sc.common.sp_index + -+ signal_frame_sc.common.len - 8; -+ return((void *) mask); -+} -+ -+extern int sc_size(void *data); -+ -+static inline void *sp_to_rt_mask(unsigned long sp) -+{ -+ unsigned long mask; -+ -+ mask = sp - signal_frame_si.common.sp_index + -+ signal_frame_si.common.len + -+ sc_size(&signal_frame_si.common.arch) - 4; -+ return((void *) mask); -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/frame_user.h um/arch/um/include/sysdep-i386/frame_user.h ---- orig/arch/um/include/sysdep-i386/frame_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-i386/frame_user.h 2002-12-06 14:13:59.000000000 -0500 -@@ -0,0 +1,91 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __FRAME_USER_I386_H -+#define __FRAME_USER_I386_H -+ -+#include <asm/page.h> -+#include "sysdep/frame.h" -+ -+/* This stuff is to calculate the size of the fp state struct at runtime -+ * because it has changed between 2.2 and 2.4 and it would be good for a -+ * UML compiled on one to work on the other. -+ * So, setup_arch_frame_raw fills in the arch struct with the raw data, which -+ * just contains the address of the end of the sigcontext. This is invoked -+ * from the signal handler. -+ * setup_arch_frame uses that data to figure out what -+ * arch_frame_data.fpstate_size should be. It really has no idea, since it's -+ * not allowed to do sizeof(struct fpstate) but it's safe to consider that it's -+ * everything from the end of the sigcontext up to the top of the stack. So, -+ * it masks off the page number to get the offset within the page and subtracts -+ * that from the page size, and that's how big the fpstate struct will be -+ * considered to be. -+ */ -+ -+static inline void setup_arch_frame_raw(struct arch_frame_data_raw *data, -+ void *end, unsigned long srp) -+{ -+ unsigned long sr = *((unsigned long *) srp); -+ -+ data->fp_start = (unsigned long) end; -+ if((sr & PAGE_MASK) == ((unsigned long) end & PAGE_MASK)) -+ data->sr = sr; -+ else data->sr = 0; -+} -+ -+static inline void setup_arch_frame(struct arch_frame_data_raw *in, -+ struct arch_frame_data *out) -+{ -+ unsigned long fpstate_start = in->fp_start; -+ -+ if(in->sr == 0){ -+ fpstate_start &= ~PAGE_MASK; -+ out->fpstate_size = PAGE_SIZE - fpstate_start; -+ } -+ else { -+ out->fpstate_size = in->sr - fpstate_start; -+ } -+} -+ -+/* This figures out where on the stack the SA_RESTORER function address -+ * is stored. For i386, it's the signal handler return address, so it's -+ * located next to the frame pointer. -+ * This is inlined, so __builtin_frame_address(0) is correct. Otherwise, -+ * it would have to be __builtin_frame_address(1). -+ */ -+ -+static inline unsigned long frame_restorer(void) -+{ -+ unsigned long *fp; -+ -+ fp = __builtin_frame_address(0); -+ return((unsigned long) (fp + 1)); -+} -+ -+/* Similarly, this returns the value of sp when the handler was first -+ * entered. This is used to calculate the proper sp when delivering -+ * signals. -+ */ -+ -+static inline unsigned long frame_sp(void) -+{ -+ unsigned long *fp; -+ -+ fp = __builtin_frame_address(0); -+ return((unsigned long) (fp + 1)); -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/ptrace.h um/arch/um/include/sysdep-i386/ptrace.h ---- orig/arch/um/include/sysdep-i386/ptrace.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-i386/ptrace.h 2003-01-17 13:23:31.000000000 -0500 -@@ -0,0 +1,193 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYSDEP_I386_PTRACE_H -+#define __SYSDEP_I386_PTRACE_H -+ -+#include "uml-config.h" -+ -+#ifdef UML_CONFIG_MODE_TT -+#include "ptrace-tt.h" -+#endif -+ -+#ifdef UML_CONFIG_MODE_SKAS -+#include "ptrace-skas.h" -+#endif -+ -+#include "choose-mode.h" -+ -+union uml_pt_regs { -+#ifdef UML_CONFIG_MODE_TT -+ struct tt_regs { -+ long syscall; -+ void *sc; -+ } tt; -+#endif -+#ifdef UML_CONFIG_MODE_SKAS -+ struct skas_regs { -+ unsigned long regs[HOST_FRAME_SIZE]; -+ unsigned long fp[HOST_FP_SIZE]; -+ unsigned long xfp[HOST_XFP_SIZE]; -+ unsigned long fault_addr; -+ unsigned long fault_type; -+ unsigned long trap_type; -+ long syscall; -+ int is_user; -+ } skas; -+#endif -+}; -+ -+#define EMPTY_UML_PT_REGS { } -+ -+extern int mode_tt; -+ -+#define UPT_SC(r) ((r)->tt.sc) -+#define UPT_IP(r) \ -+ CHOOSE_MODE(SC_IP(UPT_SC(r)), REGS_IP((r)->skas.regs)) -+#define UPT_SP(r) \ -+ CHOOSE_MODE(SC_SP(UPT_SC(r)), REGS_SP((r)->skas.regs)) -+#define UPT_EFLAGS(r) \ -+ CHOOSE_MODE(SC_EFLAGS(UPT_SC(r)), REGS_EFLAGS((r)->skas.regs)) -+#define UPT_EAX(r) \ -+ CHOOSE_MODE(SC_EAX(UPT_SC(r)), REGS_EAX((r)->skas.regs)) -+#define UPT_EBX(r) \ -+ CHOOSE_MODE(SC_EBX(UPT_SC(r)), REGS_EBX((r)->skas.regs)) -+#define UPT_ECX(r) \ -+ CHOOSE_MODE(SC_ECX(UPT_SC(r)), REGS_ECX((r)->skas.regs)) -+#define UPT_EDX(r) \ -+ CHOOSE_MODE(SC_EDX(UPT_SC(r)), REGS_EDX((r)->skas.regs)) -+#define UPT_ESI(r) \ -+ CHOOSE_MODE(SC_ESI(UPT_SC(r)), REGS_ESI((r)->skas.regs)) -+#define UPT_EDI(r) \ -+ CHOOSE_MODE(SC_EDI(UPT_SC(r)), REGS_EDI((r)->skas.regs)) -+#define UPT_EBP(r) \ -+ CHOOSE_MODE(SC_EBP(UPT_SC(r)), REGS_EBP((r)->skas.regs)) -+#define UPT_ORIG_EAX(r) \ -+ CHOOSE_MODE((r)->tt.syscall, (r)->skas.syscall) -+#define UPT_CS(r) \ -+ CHOOSE_MODE(SC_CS(UPT_SC(r)), REGS_CS((r)->skas.regs)) -+#define UPT_SS(r) \ -+ CHOOSE_MODE(SC_SS(UPT_SC(r)), REGS_SS((r)->skas.regs)) -+#define UPT_DS(r) \ -+ CHOOSE_MODE(SC_DS(UPT_SC(r)), REGS_DS((r)->skas.regs)) -+#define UPT_ES(r) \ -+ CHOOSE_MODE(SC_ES(UPT_SC(r)), REGS_ES((r)->skas.regs)) -+#define UPT_FS(r) \ -+ CHOOSE_MODE(SC_FS(UPT_SC(r)), REGS_FS((r)->skas.regs)) -+#define UPT_GS(r) \ -+ CHOOSE_MODE(SC_GS(UPT_SC(r)), REGS_GS((r)->skas.regs)) -+ -+#define UPT_SYSCALL_ARG1(r) UPT_EBX(r) -+#define UPT_SYSCALL_ARG2(r) UPT_ECX(r) -+#define UPT_SYSCALL_ARG3(r) UPT_EDX(r) -+#define UPT_SYSCALL_ARG4(r) UPT_ESI(r) -+#define UPT_SYSCALL_ARG5(r) UPT_EDI(r) -+#define UPT_SYSCALL_ARG6(r) UPT_EBP(r) -+ -+extern int user_context(unsigned long sp); -+ -+#define UPT_IS_USER(r) \ -+ CHOOSE_MODE(user_context(UPT_SP(r)), (r)->skas.is_user) -+ -+struct syscall_args { -+ unsigned long args[6]; -+}; -+ -+#define SYSCALL_ARGS(r) ((struct syscall_args) \ -+ { .args = { UPT_SYSCALL_ARG1(r), \ -+ UPT_SYSCALL_ARG2(r), \ -+ UPT_SYSCALL_ARG3(r), \ -+ UPT_SYSCALL_ARG4(r), \ -+ UPT_SYSCALL_ARG5(r), \ -+ UPT_SYSCALL_ARG6(r) } } ) -+ -+#define UPT_REG(regs, reg) \ -+ ({ unsigned long val; \ -+ switch(reg){ \ -+ case EIP: val = UPT_IP(regs); break; \ -+ case UESP: val = UPT_SP(regs); break; \ -+ case EAX: val = UPT_EAX(regs); break; \ -+ case EBX: val = UPT_EBX(regs); break; \ -+ case ECX: val = UPT_ECX(regs); break; \ -+ case EDX: val = UPT_EDX(regs); break; \ -+ case ESI: val = UPT_ESI(regs); break; \ -+ case EDI: val = UPT_EDI(regs); break; \ -+ case EBP: val = UPT_EBP(regs); break; \ -+ case ORIG_EAX: val = UPT_ORIG_EAX(regs); break; \ -+ case CS: val = UPT_CS(regs); break; \ -+ case SS: val = UPT_SS(regs); break; \ -+ case DS: val = UPT_DS(regs); break; \ -+ case ES: val = UPT_ES(regs); break; \ -+ case FS: val = UPT_FS(regs); break; \ -+ case GS: val = UPT_GS(regs); break; \ -+ case EFL: val = UPT_EFLAGS(regs); break; \ -+ default : \ -+ panic("Bad register in UPT_REG : %d\n", reg); \ -+ val = -1; \ -+ } \ -+ val; \ -+ }) -+ -+ -+#define UPT_SET(regs, reg, val) \ -+ do { \ -+ switch(reg){ \ -+ case EIP: UPT_IP(regs) = val; break; \ -+ case UESP: UPT_SP(regs) = val; break; \ -+ case EAX: UPT_EAX(regs) = val; break; \ -+ case EBX: UPT_EBX(regs) = val; break; \ -+ case ECX: UPT_ECX(regs) = val; break; \ -+ case EDX: UPT_EDX(regs) = val; break; \ -+ case ESI: UPT_ESI(regs) = val; break; \ -+ case EDI: UPT_EDI(regs) = val; break; \ -+ case EBP: UPT_EBP(regs) = val; break; \ -+ case ORIG_EAX: UPT_ORIG_EAX(regs) = val; break; \ -+ case CS: UPT_CS(regs) = val; break; \ -+ case SS: UPT_SS(regs) = val; break; \ -+ case DS: UPT_DS(regs) = val; break; \ -+ case ES: UPT_ES(regs) = val; break; \ -+ case FS: UPT_FS(regs) = val; break; \ -+ case GS: UPT_GS(regs) = val; break; \ -+ case EFL: UPT_EFLAGS(regs) = val; break; \ -+ default : \ -+ panic("Bad register in UPT_SET : %d\n", reg); \ -+ break; \ -+ } \ -+ } while (0) -+ -+#define UPT_SET_SYSCALL_RETURN(r, res) \ -+ CHOOSE_MODE(SC_SET_SYSCALL_RETURN(UPT_SC(r), (res)), \ -+ REGS_SET_SYSCALL_RETURN((r)->skas.regs, (res))) -+ -+#define UPT_RESTART_SYSCALL(r) \ -+ CHOOSE_MODE(SC_RESTART_SYSCALL(UPT_SC(r)), \ -+ REGS_RESTART_SYSCALL((r)->skas.regs)) -+ -+#define UPT_ORIG_SYSCALL(r) UPT_EAX(r) -+#define UPT_SYSCALL_NR(r) UPT_ORIG_EAX(r) -+#define UPT_SYSCALL_RET(r) UPT_EAX(r) -+ -+#define UPT_SEGV_IS_FIXABLE(r) \ -+ CHOOSE_MODE(SC_SEGV_IS_FIXABLE(UPT_SC(r)), \ -+ REGS_SEGV_IS_FIXABLE(&r->skas)) -+ -+#define UPT_FAULT_ADDR(r) \ -+ CHOOSE_MODE(SC_FAULT_ADDR(UPT_SC(r)), REGS_FAULT_ADDR(&r->skas)) -+ -+#define UPT_FAULT_WRITE(r) \ -+ CHOOSE_MODE(SC_FAULT_WRITE(UPT_SC(r)), REGS_FAULT_WRITE(&r->skas)) -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/ptrace_user.h um/arch/um/include/sysdep-i386/ptrace_user.h ---- orig/arch/um/include/sysdep-i386/ptrace_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-i386/ptrace_user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,62 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYSDEP_I386_PTRACE_USER_H__ -+#define __SYSDEP_I386_PTRACE_USER_H__ -+ -+#include <asm/ptrace.h> -+ -+#define PT_OFFSET(r) ((r) * sizeof(long)) -+ -+#define PT_SYSCALL_NR(regs) ((regs)[ORIG_EAX]) -+#define PT_SYSCALL_NR_OFFSET PT_OFFSET(ORIG_EAX) -+ -+#define PT_SYSCALL_ARG1_OFFSET PT_OFFSET(EBX) -+#define PT_SYSCALL_ARG2_OFFSET PT_OFFSET(ECX) -+#define PT_SYSCALL_ARG3_OFFSET PT_OFFSET(EDX) -+#define PT_SYSCALL_ARG4_OFFSET PT_OFFSET(ESI) -+#define PT_SYSCALL_ARG5_OFFSET PT_OFFSET(EDI) -+ -+#define PT_SYSCALL_RET_OFFSET PT_OFFSET(EAX) -+ -+#define PT_IP_OFFSET PT_OFFSET(EIP) -+#define PT_IP(regs) ((regs)[EIP]) -+#define PT_SP(regs) ((regs)[UESP]) -+ -+#ifndef FRAME_SIZE -+#define FRAME_SIZE (17) -+#endif -+#define FRAME_SIZE_OFFSET (FRAME_SIZE * sizeof(unsigned long)) -+ -+#define FP_FRAME_SIZE (27) -+#define FPX_FRAME_SIZE (128) -+ -+#ifdef PTRACE_GETREGS -+#define UM_HAVE_GETREGS -+#endif -+ -+#ifdef PTRACE_SETREGS -+#define UM_HAVE_SETREGS -+#endif -+ -+#ifdef PTRACE_GETFPREGS -+#define UM_HAVE_GETFPREGS -+#endif -+ -+#ifdef PTRACE_SETFPREGS -+#define UM_HAVE_SETFPREGS -+#endif -+ -+#ifdef PTRACE_GETFPXREGS -+#define UM_HAVE_GETFPXREGS -+#endif -+ -+#ifdef PTRACE_SETFPXREGS -+#define UM_HAVE_SETFPXREGS -+#endif -+ -+extern void update_debugregs(int seq); -+ -+#endif -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/sigcontext.h um/arch/um/include/sysdep-i386/sigcontext.h ---- orig/arch/um/include/sysdep-i386/sigcontext.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-i386/sigcontext.h 2002-12-08 18:21:33.000000000 -0500 -@@ -0,0 +1,49 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYS_SIGCONTEXT_I386_H -+#define __SYS_SIGCONTEXT_I386_H -+ -+#include "sc.h" -+ -+#define IP_RESTART_SYSCALL(ip) ((ip) -= 2) -+ -+#define SC_RESTART_SYSCALL(sc) IP_RESTART_SYSCALL(SC_IP(sc)) -+#define SC_SET_SYSCALL_RETURN(sc, result) SC_EAX(sc) = (result) -+ -+#define SC_FAULT_ADDR(sc) SC_CR2(sc) -+#define SC_FAULT_TYPE(sc) SC_ERR(sc) -+ -+#define FAULT_WRITE(err) (err & 2) -+#define TO_SC_ERR(is_write) ((is_write) ? 2 : 0) -+ -+#define SC_FAULT_WRITE(sc) (FAULT_WRITE(SC_ERR(sc))) -+ -+#define SC_TRAP_TYPE(sc) SC_TRAPNO(sc) -+ -+/* ptrace expects that, at the start of a system call, %eax contains -+ * -ENOSYS, so this makes it so. -+ */ -+#define SC_START_SYSCALL(sc) do SC_EAX(sc) = -ENOSYS; while(0) -+ -+/* These are General Protection and Page Fault */ -+#define SEGV_IS_FIXABLE(trap) ((trap == 13) || (trap == 14)) -+ -+#define SC_SEGV_IS_FIXABLE(sc) (SEGV_IS_FIXABLE(SC_TRAPNO(sc))) -+ -+extern unsigned long *sc_sigmask(void *sc_ptr); -+extern int sc_get_fpregs(unsigned long buf, void *sc_ptr); -+ -+#endif -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-i386/syscalls.h um/arch/um/include/sysdep-i386/syscalls.h ---- orig/arch/um/include/sysdep-i386/syscalls.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-i386/syscalls.h 2002-12-08 18:04:15.000000000 -0500 -@@ -0,0 +1,61 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "asm/unistd.h" -+#include "sysdep/ptrace.h" -+ -+typedef long syscall_handler_t(struct pt_regs); -+ -+#define EXECUTE_SYSCALL(syscall, regs) \ -+ ((long (*)(struct syscall_args)) (*sys_call_table[syscall]))(SYSCALL_ARGS(®s->regs)) -+ -+extern syscall_handler_t sys_modify_ldt; -+extern syscall_handler_t old_mmap_i386; -+extern syscall_handler_t old_select; -+extern syscall_handler_t sys_ni_syscall; -+ -+#define ARCH_SYSCALLS \ -+ [ __NR_mmap ] = old_mmap_i386, \ -+ [ __NR_select ] = old_select, \ -+ [ __NR_vm86old ] = sys_ni_syscall, \ -+ [ __NR_modify_ldt ] = sys_modify_ldt, \ -+ [ __NR_lchown32 ] = sys_lchown, \ -+ [ __NR_getuid32 ] = sys_getuid, \ -+ [ __NR_getgid32 ] = sys_getgid, \ -+ [ __NR_geteuid32 ] = sys_geteuid, \ -+ [ __NR_getegid32 ] = sys_getegid, \ -+ [ __NR_setreuid32 ] = sys_setreuid, \ -+ [ __NR_setregid32 ] = sys_setregid, \ -+ [ __NR_getgroups32 ] = sys_getgroups, \ -+ [ __NR_setgroups32 ] = sys_setgroups, \ -+ [ __NR_fchown32 ] = sys_fchown, \ -+ [ __NR_setresuid32 ] = sys_setresuid, \ -+ [ __NR_getresuid32 ] = sys_getresuid, \ -+ [ __NR_setresgid32 ] = sys_setresgid, \ -+ [ __NR_getresgid32 ] = sys_getresgid, \ -+ [ __NR_chown32 ] = sys_chown, \ -+ [ __NR_setuid32 ] = sys_setuid, \ -+ [ __NR_setgid32 ] = sys_setgid, \ -+ [ __NR_setfsuid32 ] = sys_setfsuid, \ -+ [ __NR_setfsgid32 ] = sys_setfsgid, \ -+ [ __NR_pivot_root ] = sys_pivot_root, \ -+ [ __NR_mincore ] = sys_mincore, \ -+ [ __NR_madvise ] = sys_madvise, \ -+ [ 222 ] = sys_ni_syscall, -+ -+/* 222 doesn't yet have a name in include/asm-i386/unistd.h */ -+ -+#define LAST_ARCH_SYSCALL 222 -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/ptrace.h um/arch/um/include/sysdep-ia64/ptrace.h ---- orig/arch/um/include/sysdep-ia64/ptrace.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-ia64/ptrace.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,26 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYSDEP_IA64_PTRACE_H -+#define __SYSDEP_IA64_PTRACE_H -+ -+struct sys_pt_regs { -+ int foo; -+}; -+ -+#define EMPTY_REGS { 0 } -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/sigcontext.h um/arch/um/include/sysdep-ia64/sigcontext.h ---- orig/arch/um/include/sysdep-ia64/sigcontext.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-ia64/sigcontext.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,20 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYSDEP_IA64_SIGCONTEXT_H -+#define __SYSDEP_IA64_SIGCONTEXT_H -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ia64/syscalls.h um/arch/um/include/sysdep-ia64/syscalls.h ---- orig/arch/um/include/sysdep-ia64/syscalls.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-ia64/syscalls.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,20 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYSDEP_IA64_SYSCALLS_H -+#define __SYSDEP_IA64_SYSCALLS_H -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/ptrace.h um/arch/um/include/sysdep-ppc/ptrace.h ---- orig/arch/um/include/sysdep-ppc/ptrace.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-ppc/ptrace.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,104 @@ -+/* -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYS_PTRACE_PPC_H -+#define __SYS_PTRACE_PPC_H -+ -+#include "linux/config.h" -+#include "linux/types.h" -+ -+/* the following taken from <asm-ppc/ptrace.h> */ -+ -+#ifdef CONFIG_PPC64 -+#define PPC_REG unsigned long /*long*/ -+#else -+#define PPC_REG unsigned long -+#endif -+struct sys_pt_regs_s { -+ PPC_REG gpr[32]; -+ PPC_REG nip; -+ PPC_REG msr; -+ PPC_REG orig_gpr3; /* Used for restarting system calls */ -+ PPC_REG ctr; -+ PPC_REG link; -+ PPC_REG xer; -+ PPC_REG ccr; -+ PPC_REG mq; /* 601 only (not used at present) */ -+ /* Used on APUS to hold IPL value. */ -+ PPC_REG trap; /* Reason for being here */ -+ PPC_REG dar; /* Fault registers */ -+ PPC_REG dsisr; -+ PPC_REG result; /* Result of a system call */ -+}; -+ -+#define NUM_REGS (sizeof(struct sys_pt_regs_s) / sizeof(PPC_REG)) -+ -+struct sys_pt_regs { -+ PPC_REG regs[sizeof(struct sys_pt_regs_s) / sizeof(PPC_REG)]; -+}; -+ -+#define UM_MAX_REG (PT_FPR0) -+#define UM_MAX_REG_OFFSET (UM_MAX_REG * sizeof(PPC_REG)) -+ -+#define EMPTY_REGS { { [ 0 ... NUM_REGS - 1] = 0 } } -+ -+#define UM_REG(r, n) ((r)->regs[n]) -+ -+#define UM_SYSCALL_RET(r) UM_REG(r, PT_R3) -+#define UM_SP(r) UM_REG(r, PT_R1) -+#define UM_IP(r) UM_REG(r, PT_NIP) -+#define UM_ELF_ZERO(r) UM_REG(r, PT_FPSCR) -+#define UM_SYSCALL_NR(r) UM_REG(r, PT_R0) -+#define UM_SYSCALL_ARG1(r) UM_REG(r, PT_ORIG_R3) -+#define UM_SYSCALL_ARG2(r) UM_REG(r, PT_R4) -+#define UM_SYSCALL_ARG3(r) UM_REG(r, PT_R5) -+#define UM_SYSCALL_ARG4(r) UM_REG(r, PT_R6) -+#define UM_SYSCALL_ARG5(r) UM_REG(r, PT_R7) -+#define UM_SYSCALL_ARG6(r) UM_REG(r, PT_R8) -+ -+#define UM_SYSCALL_NR_OFFSET (PT_R0 * sizeof(PPC_REG)) -+#define UM_SYSCALL_RET_OFFSET (PT_R3 * sizeof(PPC_REG)) -+#define UM_SYSCALL_ARG1_OFFSET (PT_R3 * sizeof(PPC_REG)) -+#define UM_SYSCALL_ARG2_OFFSET (PT_R4 * sizeof(PPC_REG)) -+#define UM_SYSCALL_ARG3_OFFSET (PT_R5 * sizeof(PPC_REG)) -+#define UM_SYSCALL_ARG4_OFFSET (PT_R6 * sizeof(PPC_REG)) -+#define UM_SYSCALL_ARG5_OFFSET (PT_R7 * sizeof(PPC_REG)) -+#define UM_SYSCALL_ARG6_OFFSET (PT_R8 * sizeof(PPC_REG)) -+#define UM_SP_OFFSET (PT_R1 * sizeof(PPC_REG)) -+#define UM_IP_OFFSET (PT_NIP * sizeof(PPC_REG)) -+#define UM_ELF_ZERO_OFFSET (PT_R3 * sizeof(PPC_REG)) -+ -+#define UM_SET_SYSCALL_RETURN(_regs, result) \ -+do { \ -+ if (result < 0) { \ -+ (_regs)->regs[PT_CCR] |= 0x10000000; \ -+ UM_SYSCALL_RET((_regs)) = -result; \ -+ } else { \ -+ UM_SYSCALL_RET((_regs)) = result; \ -+ } \ -+} while(0) -+ -+extern void shove_aux_table(unsigned long sp); -+#define UM_FIX_EXEC_STACK(sp) shove_aux_table(sp); -+ -+/* These aren't actually defined. The undefs are just to make sure -+ * everyone's clear on the concept. -+ */ -+#undef UML_HAVE_GETREGS -+#undef UML_HAVE_GETFPREGS -+#undef UML_HAVE_SETREGS -+#undef UML_HAVE_SETFPREGS -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/sigcontext.h um/arch/um/include/sysdep-ppc/sigcontext.h ---- orig/arch/um/include/sysdep-ppc/sigcontext.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-ppc/sigcontext.h 2002-11-23 22:02:19.000000000 -0500 -@@ -0,0 +1,62 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SYS_SIGCONTEXT_PPC_H -+#define __SYS_SIGCONTEXT_PPC_H -+ -+#define DSISR_WRITE 0x02000000 -+ -+#define SC_FAULT_ADDR(sc) ({ \ -+ struct sigcontext *_sc = (sc); \ -+ long retval = -1; \ -+ switch (_sc->regs->trap) { \ -+ case 0x300: \ -+ /* data exception */ \ -+ retval = _sc->regs->dar; \ -+ break; \ -+ case 0x400: \ -+ /* instruction exception */ \ -+ retval = _sc->regs->nip; \ -+ break; \ -+ default: \ -+ panic("SC_FAULT_ADDR: unhandled trap type\n"); \ -+ } \ -+ retval; \ -+ }) -+ -+#define SC_FAULT_WRITE(sc) ({ \ -+ struct sigcontext *_sc = (sc); \ -+ long retval = -1; \ -+ switch (_sc->regs->trap) { \ -+ case 0x300: \ -+ /* data exception */ \ -+ retval = !!(_sc->regs->dsisr & DSISR_WRITE); \ -+ break; \ -+ case 0x400: \ -+ /* instruction exception: not a write */ \ -+ retval = 0; \ -+ break; \ -+ default: \ -+ panic("SC_FAULT_ADDR: unhandled trap type\n"); \ -+ } \ -+ retval; \ -+ }) -+ -+#define SC_IP(sc) ((sc)->regs->nip) -+#define SC_SP(sc) ((sc)->regs->gpr[1]) -+#define SEGV_IS_FIXABLE(sc) (1) -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysdep-ppc/syscalls.h um/arch/um/include/sysdep-ppc/syscalls.h ---- orig/arch/um/include/sysdep-ppc/syscalls.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysdep-ppc/syscalls.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,50 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+typedef long syscall_handler_t(unsigned long arg1, unsigned long arg2, -+ unsigned long arg3, unsigned long arg4, -+ unsigned long arg5, unsigned long arg6); -+ -+#define EXECUTE_SYSCALL(syscall, regs) \ -+ (*sys_call_table[syscall])(UM_SYSCALL_ARG1(®s), \ -+ UM_SYSCALL_ARG2(®s), \ -+ UM_SYSCALL_ARG3(®s), \ -+ UM_SYSCALL_ARG4(®s), \ -+ UM_SYSCALL_ARG5(®s), \ -+ UM_SYSCALL_ARG6(®s)) -+ -+extern syscall_handler_t sys_mincore; -+extern syscall_handler_t sys_madvise; -+ -+/* old_mmap needs the correct prototype since syscall_kern.c includes -+ * this file. -+ */ -+int old_mmap(unsigned long addr, unsigned long len, -+ unsigned long prot, unsigned long flags, -+ unsigned long fd, unsigned long offset); -+ -+#define ARCH_SYSCALLS \ -+ [ __NR_modify_ldt ] = sys_ni_syscall, \ -+ [ __NR_pciconfig_read ] = sys_ni_syscall, \ -+ [ __NR_pciconfig_write ] = sys_ni_syscall, \ -+ [ __NR_pciconfig_iobase ] = sys_ni_syscall, \ -+ [ __NR_pivot_root ] = sys_ni_syscall, \ -+ [ __NR_multiplexer ] = sys_ni_syscall, \ -+ [ __NR_mmap ] = old_mmap, \ -+ [ __NR_madvise ] = sys_madvise, \ -+ [ __NR_mincore ] = sys_mincore, -+ -+#define LAST_ARCH_SYSCALL __NR_mincore -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/sysrq.h um/arch/um/include/sysrq.h ---- orig/arch/um/include/sysrq.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/sysrq.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,6 @@ -+#ifndef __UM_SYSRQ_H -+#define __UM_SYSRQ_H -+ -+extern void show_trace(unsigned long *stack); -+ -+#endif -diff -Naur -X ../exclude-files orig/arch/um/include/tempfile.h um/arch/um/include/tempfile.h ---- orig/arch/um/include/tempfile.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/tempfile.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,21 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __TEMPFILE_H__ -+#define __TEMPFILE_H__ -+ -+extern int make_tempfile(const char *template, char **tempname, int do_unlink); -+ -+#endif -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/time_user.h um/arch/um/include/time_user.h ---- orig/arch/um/include/time_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/time_user.h 2003-01-08 12:55:47.000000000 -0500 -@@ -0,0 +1,17 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __TIME_USER_H__ -+#define __TIME_USER_H__ -+ -+extern void timer(void); -+extern void switch_timers(int to_real); -+extern void set_interval(int timer_type); -+extern void idle_sleep(int secs); -+extern void enable_timer(void); -+extern unsigned long time_lock(void); -+extern void time_unlock(unsigned long); -+ -+#endif -diff -Naur -X ../exclude-files orig/arch/um/include/tlb.h um/arch/um/include/tlb.h ---- orig/arch/um/include/tlb.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/tlb.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,23 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __TLB_H__ -+#define __TLB_H__ -+ -+extern void mprotect_kernel_vm(int w); -+extern void force_flush_all(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/ubd_user.h um/arch/um/include/ubd_user.h ---- orig/arch/um/include/ubd_user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/ubd_user.h 2003-03-06 18:09:14.000000000 -0500 -@@ -0,0 +1,77 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Copyright (C) 2001 RidgeRun, Inc (glonnon@ridgerun.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UM_UBD_USER_H -+#define __UM_UBD_USER_H -+ -+#include "os.h" -+ -+enum ubd_req { UBD_READ, UBD_WRITE }; -+ -+struct io_thread_req { -+ enum ubd_req op; -+ int fds[2]; -+ unsigned long offsets[2]; -+ unsigned long long offset; -+ unsigned long length; -+ char *buffer; -+ int sectorsize; -+ unsigned long sector_mask; -+ unsigned long cow_offset; -+ unsigned long bitmap_words[2]; -+ int error; -+}; -+ -+extern int open_ubd_file(char *file, struct openflags *openflags, -+ char **backing_file_out, int *bitmap_offset_out, -+ unsigned long *bitmap_len_out, int *data_offset_out, -+ int *create_cow_out); -+extern int create_cow_file(char *cow_file, char *backing_file, -+ struct openflags flags, int sectorsize, -+ int *bitmap_offset_out, -+ unsigned long *bitmap_len_out, -+ int *data_offset_out); -+extern int read_cow_bitmap(int fd, void *buf, int offset, int len); -+extern int read_ubd_fs(int fd, void *buffer, int len); -+extern int write_ubd_fs(int fd, char *buffer, int len); -+extern int start_io_thread(unsigned long sp, int *fds_out); -+extern void do_io(struct io_thread_req *req); -+ -+static inline int ubd_test_bit(__u64 bit, unsigned char *data) -+{ -+ __u64 n; -+ int bits, off; -+ -+ bits = sizeof(data[0]) * 8; -+ n = bit / bits; -+ off = bit % bits; -+ return((data[n] & (1 << off)) != 0); -+} -+ -+static inline void ubd_set_bit(__u64 bit, unsigned char *data) -+{ -+ __u64 n; -+ int bits, off; -+ -+ bits = sizeof(data[0]) * 8; -+ n = bit / bits; -+ off = bit % bits; -+ data[n] |= (1 << off); -+} -+ -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/umid.h um/arch/um/include/umid.h ---- orig/arch/um/include/umid.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/umid.h 2002-12-16 20:52:19.000000000 -0500 -@@ -0,0 +1,22 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UMID_H__ -+#define __UMID_H__ -+ -+extern int umid_file_name(char *name, char *buf, int len); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/uml_uaccess.h um/arch/um/include/uml_uaccess.h ---- orig/arch/um/include/uml_uaccess.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/uml_uaccess.h 2002-12-19 13:15:22.000000000 -0500 -@@ -0,0 +1,28 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UML_UACCESS_H__ -+#define __UML_UACCESS_H__ -+ -+extern int __do_copy_to_user(void *to, const void *from, int n, -+ void **fault_addr, void **fault_catcher); -+extern unsigned long __do_user_copy(void *to, const void *from, int n, -+ void **fault_addr, void **fault_catcher, -+ void (*op)(void *to, const void *from, -+ int n), int *faulted_out); -+void __do_copy(void *to, const void *from, int n); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/um_mmu.h um/arch/um/include/um_mmu.h ---- orig/arch/um/include/um_mmu.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/um_mmu.h 2002-11-09 12:51:43.000000000 -0500 -@@ -0,0 +1,40 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __ARCH_UM_MMU_H -+#define __ARCH_UM_MMU_H -+ -+#include "linux/config.h" -+#include "choose-mode.h" -+ -+#ifdef CONFIG_MODE_TT -+#include "../kernel/tt/include/mmu.h" -+#endif -+ -+#ifdef CONFIG_MODE_SKAS -+#include "../kernel/skas/include/mmu.h" -+#endif -+ -+typedef union { -+#ifdef CONFIG_MODE_TT -+ struct mmu_context_tt tt; -+#endif -+#ifdef CONFIG_MODE_SKAS -+ struct mmu_context_skas skas; -+#endif -+} mm_context_t; -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/umn.h um/arch/um/include/umn.h ---- orig/arch/um/include/umn.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/umn.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UMN_H -+#define __UMN_H -+ -+extern int open_umn_tty(int *slave_out, int *slipno_out); -+extern void close_umn_tty(int master, int slave); -+extern int umn_send_packet(int fd, void *data, int len); -+extern int set_umn_addr(int fd, char *addr, char *ptp_addr); -+extern void slip_unesc(unsigned char s); -+extern void umn_read(int fd); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/um_uaccess.h um/arch/um/include/um_uaccess.h ---- orig/arch/um/include/um_uaccess.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/um_uaccess.h 2002-11-23 22:03:02.000000000 -0500 -@@ -0,0 +1,73 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __ARCH_UM_UACCESS_H -+#define __ARCH_UM_UACCESS_H -+ -+#include "linux/config.h" -+#include "choose-mode.h" -+ -+#ifdef CONFIG_MODE_TT -+#include "../kernel/tt/include/uaccess.h" -+#endif -+ -+#ifdef CONFIG_MODE_SKAS -+#include "../kernel/skas/include/uaccess.h" -+#endif -+ -+#define access_ok(type, addr, size) \ -+ CHOOSE_MODE_PROC(access_ok_tt, access_ok_skas, type, addr, size) -+ -+static inline int verify_area(int type, const void * addr, unsigned long size) -+{ -+ return(CHOOSE_MODE_PROC(verify_area_tt, verify_area_skas, type, addr, -+ size)); -+} -+ -+static inline int copy_from_user(void *to, const void *from, int n) -+{ -+ return(CHOOSE_MODE_PROC(copy_from_user_tt, copy_from_user_skas, to, -+ from, n)); -+} -+ -+static inline int copy_to_user(void *to, const void *from, int n) -+{ -+ return(CHOOSE_MODE_PROC(copy_to_user_tt, copy_to_user_skas, to, -+ from, n)); -+} -+ -+static inline int strncpy_from_user(char *dst, const char *src, int count) -+{ -+ return(CHOOSE_MODE_PROC(strncpy_from_user_tt, strncpy_from_user_skas, -+ dst, src, count)); -+} -+ -+static inline int __clear_user(void *mem, int len) -+{ -+ return(CHOOSE_MODE_PROC(__clear_user_tt, __clear_user_skas, mem, len)); -+} -+ -+static inline int clear_user(void *mem, int len) -+{ -+ return(CHOOSE_MODE_PROC(clear_user_tt, clear_user_skas, mem, len)); -+} -+ -+static inline int strnlen_user(const void *str, int len) -+{ -+ return(CHOOSE_MODE_PROC(strnlen_user_tt, strnlen_user_skas, str, len)); -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/user.h um/arch/um/include/user.h ---- orig/arch/um/include/user.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/user.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,29 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __USER_H__ -+#define __USER_H__ -+ -+extern void panic(const char *fmt, ...); -+extern int printk(const char *fmt, ...); -+extern void schedule(void); -+extern void *um_kmalloc(int size); -+extern void *um_kmalloc_atomic(int size); -+extern void kfree(void *ptr); -+extern int in_aton(char *str); -+extern int open_gdb_chan(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/include/user_util.h um/arch/um/include/user_util.h ---- orig/arch/um/include/user_util.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/include/user_util.h 2003-05-15 13:53:40.000000000 -0400 -@@ -0,0 +1,104 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __USER_UTIL_H__ -+#define __USER_UTIL_H__ -+ -+#include "sysdep/ptrace.h" -+ -+extern int mode_tt; -+ -+extern int grantpt(int __fd); -+extern int unlockpt(int __fd); -+extern char *ptsname(int __fd); -+ -+enum { OP_NONE, OP_EXEC, OP_FORK, OP_TRACE_ON, OP_REBOOT, OP_HALT, OP_CB }; -+ -+struct cpu_task { -+ int pid; -+ void *task; -+}; -+ -+extern struct cpu_task cpu_tasks[]; -+ -+struct signal_info { -+ void (*handler)(int, union uml_pt_regs *); -+ int is_irq; -+}; -+ -+extern struct signal_info sig_info[]; -+ -+extern unsigned long low_physmem; -+extern unsigned long high_physmem; -+extern unsigned long uml_physmem; -+extern unsigned long uml_reserved; -+extern unsigned long end_vm; -+extern unsigned long start_vm; -+extern unsigned long highmem; -+ -+extern char host_info[]; -+ -+extern char saved_command_line[]; -+extern char command_line[]; -+ -+extern char *tempdir; -+ -+extern unsigned long _stext, _etext, _sdata, _edata, __bss_start, _end; -+extern unsigned long _unprotected_end; -+extern unsigned long brk_start; -+ -+extern int pty_output_sigio; -+extern int pty_close_sigio; -+ -+extern void stop(void); -+extern void stack_protections(unsigned long address); -+extern void task_protections(unsigned long address); -+extern int wait_for_stop(int pid, int sig, int cont_type, void *relay); -+extern void *add_signal_handler(int sig, void (*handler)(int)); -+extern int start_fork_tramp(void *arg, unsigned long temp_stack, -+ int clone_flags, int (*tramp)(void *)); -+extern int linux_main(int argc, char **argv); -+extern void set_cmdline(char *cmd); -+extern void input_cb(void (*proc)(void *), void *arg, int arg_len); -+extern int get_pty(void); -+extern void *um_kmalloc(int size); -+extern int raw(int fd, int complain); -+extern int switcheroo(int fd, int prot, void *from, void *to, int size); -+extern void setup_machinename(char *machine_out); -+extern void setup_hostinfo(void); -+extern void add_arg(char *cmd_line, char *arg); -+extern void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int)); -+extern void init_new_thread_signals(int altstack); -+extern void do_exec(int old_pid, int new_pid); -+extern void tracer_panic(char *msg, ...); -+extern char *get_umid(int only_if_set); -+extern void do_longjmp(void *p, int val); -+extern void suspend_new_thread(int fd); -+extern int detach(int pid, int sig); -+extern int attach(int pid); -+extern void kill_child_dead(int pid); -+extern int cont(int pid); -+extern void check_ptrace(void); -+extern void check_sigio(void); -+extern int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr); -+extern void write_sigio_workaround(void); -+extern void arch_check_bugs(void); -+extern int arch_handle_signal(int sig, union uml_pt_regs *regs); -+extern int arch_fixup(unsigned long address, void *sc_ptr); -+extern int can_do_skas(void); -+extern void arch_init_thread(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/checksum.c um/arch/um/kernel/checksum.c ---- orig/arch/um/kernel/checksum.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/checksum.c 2002-10-31 22:39:58.000000000 -0500 -@@ -0,0 +1,42 @@ -+#include "asm/uaccess.h" -+#include "linux/errno.h" -+ -+extern unsigned int arch_csum_partial(const char *buff, int len, int sum); -+ -+extern unsigned int csum_partial(char *buff, int len, int sum) -+{ -+ return(arch_csum_partial(buff, len, sum)); -+} -+ -+unsigned int csum_partial_copy_to(const char *src, char *dst, int len, -+ int sum, int *err_ptr) -+{ -+ if(copy_to_user(dst, src, len)){ -+ *err_ptr = -EFAULT; -+ return(-1); -+ } -+ -+ return(arch_csum_partial(src, len, sum)); -+} -+ -+unsigned int csum_partial_copy_from(const char *src, char *dst, int len, -+ int sum, int *err_ptr) -+{ -+ if(copy_from_user(dst, src, len)){ -+ *err_ptr = -EFAULT; -+ return(-1); -+ } -+ -+ return(arch_csum_partial(dst, len, sum)); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/config.c.in um/arch/um/kernel/config.c.in ---- orig/arch/um/kernel/config.c.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/config.c.in 2003-04-10 11:17:55.000000000 -0400 -@@ -0,0 +1,32 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include "init.h" -+ -+static __initdata char *config = "CONFIG"; -+ -+static int __init print_config(char *line, int *add) -+{ -+ printf("%s", config); -+ exit(0); -+} -+ -+__uml_setup("--showconfig", print_config, -+"--showconfig\n" -+" Prints the config file that this UML binary was generated from.\n\n" -+); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/exec_kern.c um/arch/um/kernel/exec_kern.c ---- orig/arch/um/kernel/exec_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/exec_kern.c 2003-04-16 16:35:05.000000000 -0400 -@@ -0,0 +1,86 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/slab.h" -+#include "linux/smp_lock.h" -+#include "asm/ptrace.h" -+#include "asm/pgtable.h" -+#include "asm/pgalloc.h" -+#include "asm/uaccess.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "mem_user.h" -+#include "kern.h" -+#include "irq_user.h" -+#include "tlb.h" -+#include "2_5compat.h" -+#include "os.h" -+#include "time_user.h" -+#include "choose-mode.h" -+#include "mode_kern.h" -+ -+void flush_thread(void) -+{ -+ CHOOSE_MODE(flush_thread_tt(), flush_thread_skas()); -+} -+ -+void start_thread(struct pt_regs *regs, unsigned long eip, unsigned long esp) -+{ -+ CHOOSE_MODE_PROC(start_thread_tt, start_thread_skas, regs, eip, esp); -+} -+ -+extern void log_exec(char **argv, void *tty); -+ -+static int execve1(char *file, char **argv, char **env) -+{ -+ int error; -+ -+#ifdef CONFIG_TTY_LOG -+ log_exec(argv, current->tty); -+#endif -+ error = do_execve(file, argv, env, ¤t->thread.regs); -+ if (error == 0){ -+ current->ptrace &= ~PT_DTRACE; -+ set_cmdline(current_cmd()); -+ } -+ return(error); -+} -+ -+int um_execve(char *file, char **argv, char **env) -+{ -+ int err; -+ -+ err = execve1(file, argv, env); -+ if(!err) -+ do_longjmp(current->thread.exec_buf, 1); -+ return(err); -+} -+ -+int sys_execve(char *file, char **argv, char **env) -+{ -+ int error; -+ char *filename; -+ -+ lock_kernel(); -+ filename = getname((char *) file); -+ error = PTR_ERR(filename); -+ if (IS_ERR(filename)) goto out; -+ error = execve1(filename, argv, env); -+ putname(filename); -+ out: -+ unlock_kernel(); -+ return(error); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/exitcode.c um/arch/um/kernel/exitcode.c ---- orig/arch/um/kernel/exitcode.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/exitcode.c 2002-11-07 18:22:04.000000000 -0500 -@@ -0,0 +1,73 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/init.h" -+#include "linux/ctype.h" -+#include "linux/proc_fs.h" -+#include "asm/uaccess.h" -+ -+/* If read and write race, the read will still atomically read a valid -+ * value. -+ */ -+int uml_exitcode = 0; -+ -+static int read_proc_exitcode(char *page, char **start, off_t off, -+ int count, int *eof, void *data) -+{ -+ int len; -+ -+ len = sprintf(page, "%d\n", uml_exitcode); -+ len -= off; -+ if(len <= off+count) *eof = 1; -+ *start = page + off; -+ if(len > count) len = count; -+ if(len < 0) len = 0; -+ return(len); -+} -+ -+static int write_proc_exitcode(struct file *file, const char *buffer, -+ unsigned long count, void *data) -+{ -+ char *end, buf[sizeof("nnnnn\0")]; -+ int tmp; -+ -+ if(copy_from_user(buf, buffer, count)) -+ return(-EFAULT); -+ tmp = simple_strtol(buf, &end, 0); -+ if((*end != '\0') && !isspace(*end)) -+ return(-EINVAL); -+ uml_exitcode = tmp; -+ return(count); -+} -+ -+static int make_proc_exitcode(void) -+{ -+ struct proc_dir_entry *ent; -+ -+ ent = create_proc_entry("exitcode", 0600, &proc_root); -+ if(ent == NULL){ -+ printk("make_proc_exitcode : Failed to register " -+ "/proc/exitcode\n"); -+ return(0); -+ } -+ -+ ent->read_proc = read_proc_exitcode; -+ ent->write_proc = write_proc_exitcode; -+ -+ return(0); -+} -+ -+__initcall(make_proc_exitcode); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/frame.c um/arch/um/kernel/frame.c ---- orig/arch/um/kernel/frame.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/frame.c 2002-12-11 11:12:41.000000000 -0500 -@@ -0,0 +1,342 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <string.h> -+#include <signal.h> -+#include <wait.h> -+#include <sched.h> -+#include <errno.h> -+#include <sys/ptrace.h> -+#include <sys/syscall.h> -+#include <sys/mman.h> -+#include <asm/page.h> -+#include <asm/ptrace.h> -+#include <asm/sigcontext.h> -+#include "sysdep/ptrace.h" -+#include "sysdep/sigcontext.h" -+#include "frame_user.h" -+#include "kern_util.h" -+#include "ptrace_user.h" -+#include "os.h" -+ -+static int capture_stack(int (*child)(void *arg), void *arg, void *sp, -+ unsigned long top, void **data_out) -+{ -+ unsigned long regs[FRAME_SIZE]; -+ int pid, status, n, len; -+ -+ /* Start the child as a thread */ -+ pid = clone(child, sp, CLONE_VM | SIGCHLD, arg); -+ if(pid < 0){ -+ printf("capture_stack : clone failed - errno = %d\n", errno); -+ exit(1); -+ } -+ -+ /* Wait for it to stop itself and continue it with a SIGUSR1 to force -+ * it into the signal handler. -+ */ -+ n = waitpid(pid, &status, WUNTRACED); -+ if(n < 0){ -+ printf("capture_stack : waitpid failed - errno = %d\n", errno); -+ exit(1); -+ } -+ if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP)){ -+ fprintf(stderr, "capture_stack : Expected SIGSTOP, " -+ "got status = 0x%x\n", status); -+ exit(1); -+ } -+ if(ptrace(PTRACE_CONT, pid, 0, SIGUSR1) < 0){ -+ printf("capture_stack : PTRACE_CONT failed - errno = %d\n", -+ errno); -+ exit(1); -+ } -+ -+ /* Wait for it to stop itself again and grab its registers again. -+ * At this point, the handler has stuffed the addresses of -+ * sig, sc, and SA_RESTORER in raw. -+ */ -+ n = waitpid(pid, &status, WUNTRACED); -+ if(n < 0){ -+ printf("capture_stack : waitpid failed - errno = %d\n", errno); -+ exit(1); -+ } -+ if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP)){ -+ fprintf(stderr, "capture_stack : Expected SIGSTOP, " -+ "got status = 0x%x\n", status); -+ exit(1); -+ } -+ if(ptrace(PTRACE_GETREGS, pid, 0, regs) < 0){ -+ printf("capture_stack : PTRACE_GETREGS failed - errno = %d\n", -+ errno); -+ exit(1); -+ } -+ -+ /* It has outlived its usefulness, so continue it so it can exit */ -+ if(ptrace(PTRACE_CONT, pid, 0, 0) < 0){ -+ printf("capture_stack : PTRACE_CONT failed - errno = %d\n", -+ errno); -+ exit(1); -+ } -+ if(waitpid(pid, &status, 0) < 0){ -+ printf("capture_stack : waitpid failed - errno = %d\n", errno); -+ exit(1); -+ } -+ if(!WIFSIGNALED(status) || (WTERMSIG(status) != 9)){ -+ printf("capture_stack : Expected exit signal 9, " -+ "got status = 0x%x\n", status); -+ exit(1); -+ } -+ -+ /* The frame that we want is the top of the signal stack */ -+ -+ len = top - PT_SP(regs); -+ *data_out = malloc(len); -+ if(*data_out == NULL){ -+ printf("capture_stack : malloc failed - errno = %d\n", errno); -+ exit(1); -+ } -+ memcpy(*data_out, (void *) PT_SP(regs), len); -+ -+ return(len); -+} -+ -+struct common_raw { -+ void *stack; -+ int size; -+ unsigned long sig; -+ unsigned long sr; -+ unsigned long sp; -+ struct arch_frame_data_raw arch; -+}; -+ -+#define SA_RESTORER (0x04000000) -+ -+typedef unsigned long old_sigset_t; -+ -+struct old_sigaction { -+ __sighandler_t handler; -+ old_sigset_t sa_mask; -+ unsigned long sa_flags; -+ void (*sa_restorer)(void); -+}; -+ -+static void child_common(struct common_raw *common, sighandler_t handler, -+ int restorer, int flags) -+{ -+ stack_t ss = ((stack_t) { .ss_sp = common->stack, -+ .ss_flags = 0, -+ .ss_size = common->size }); -+ int err; -+ -+ if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ -+ printf("PTRACE_TRACEME failed, errno = %d\n", errno); -+ } -+ if(sigaltstack(&ss, NULL) < 0){ -+ printf("sigaltstack failed - errno = %d\n", errno); -+ kill(getpid(), SIGKILL); -+ } -+ -+ if(restorer){ -+ struct sigaction sa; -+ -+ sa.sa_handler = handler; -+ sigemptyset(&sa.sa_mask); -+ sa.sa_flags = SA_ONSTACK | flags; -+ err = sigaction(SIGUSR1, &sa, NULL); -+ } -+ else { -+ struct old_sigaction sa; -+ -+ sa.handler = handler; -+ sa.sa_mask = 0; -+ sa.sa_flags = (SA_ONSTACK | flags) & ~SA_RESTORER; -+ err = syscall(__NR_sigaction, SIGUSR1, &sa, NULL); -+ } -+ -+ if(err < 0){ -+ printf("sigaction failed - errno = %d\n", errno); -+ kill(getpid(), SIGKILL); -+ } -+ -+ os_stop_process(os_getpid()); -+} -+ -+/* Changed only during early boot */ -+struct sc_frame signal_frame_sc; -+ -+struct sc_frame signal_frame_sc_sr; -+ -+struct sc_frame_raw { -+ struct common_raw common; -+ unsigned long sc; -+ int restorer; -+}; -+ -+/* Changed only during early boot */ -+static struct sc_frame_raw *raw_sc = NULL; -+ -+static void sc_handler(int sig, struct sigcontext sc) -+{ -+ raw_sc->common.sig = (unsigned long) &sig; -+ raw_sc->common.sr = frame_restorer(); -+ raw_sc->common.sp = frame_sp(); -+ raw_sc->sc = (unsigned long) ≻ -+ setup_arch_frame_raw(&raw_sc->common.arch, &sc + 1, raw_sc->common.sr); -+ -+ os_stop_process(os_getpid()); -+ kill(getpid(), SIGKILL); -+} -+ -+static int sc_child(void *arg) -+{ -+ raw_sc = arg; -+ child_common(&raw_sc->common, (sighandler_t) sc_handler, -+ raw_sc->restorer, 0); -+ return(-1); -+} -+ -+/* Changed only during early boot */ -+struct si_frame signal_frame_si; -+ -+struct si_frame_raw { -+ struct common_raw common; -+ unsigned long sip; -+ unsigned long si; -+ unsigned long ucp; -+ unsigned long uc; -+}; -+ -+/* Changed only during early boot */ -+static struct si_frame_raw *raw_si = NULL; -+ -+static void si_handler(int sig, siginfo_t *si, struct ucontext *ucontext) -+{ -+ raw_si->common.sig = (unsigned long) &sig; -+ raw_si->common.sr = frame_restorer(); -+ raw_si->common.sp = frame_sp(); -+ raw_si->sip = (unsigned long) &si; -+ raw_si->si = (unsigned long) si; -+ raw_si->ucp = (unsigned long) &ucontext; -+ raw_si->uc = (unsigned long) ucontext; -+ setup_arch_frame_raw(&raw_si->common.arch, -+ ucontext->uc_mcontext.fpregs, raw_si->common.sr); -+ -+ os_stop_process(os_getpid()); -+ kill(getpid(), SIGKILL); -+} -+ -+static int si_child(void *arg) -+{ -+ raw_si = arg; -+ child_common(&raw_si->common, (sighandler_t) si_handler, 1, -+ SA_SIGINFO); -+ return(-1); -+} -+ -+static int relative_sr(unsigned long sr, int sr_index, void *stack, -+ void *framep) -+{ -+ unsigned long *srp = (unsigned long *) sr; -+ unsigned long frame = (unsigned long) framep; -+ -+ if((*srp & PAGE_MASK) == (unsigned long) stack){ -+ *srp -= sr; -+ *((unsigned long *) (frame + sr_index)) = *srp; -+ return(1); -+ } -+ else return(0); -+} -+ -+static unsigned long capture_stack_common(int (*proc)(void *), void *arg, -+ struct common_raw *common_in, -+ void *top, void *sigstack, -+ int stack_len, -+ struct frame_common *common_out) -+{ -+ unsigned long sig_top = (unsigned long) sigstack + stack_len, base; -+ -+ common_in->stack = (void *) sigstack; -+ common_in->size = stack_len; -+ common_out->len = capture_stack(proc, arg, top, sig_top, -+ &common_out->data); -+ base = sig_top - common_out->len; -+ common_out->sig_index = common_in->sig - base; -+ common_out->sp_index = common_in->sp - base; -+ common_out->sr_index = common_in->sr - base; -+ common_out->sr_relative = relative_sr(common_in->sr, -+ common_out->sr_index, sigstack, -+ common_out->data); -+ return(base); -+} -+ -+void capture_signal_stack(void) -+{ -+ struct sc_frame_raw raw_sc; -+ struct si_frame_raw raw_si; -+ void *stack, *sigstack; -+ unsigned long top, sig_top, base; -+ -+ stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -+ sigstack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -+ if((stack == MAP_FAILED) || (sigstack == MAP_FAILED)){ -+ printf("capture_signal_stack : mmap failed - errno = %d\n", -+ errno); -+ exit(1); -+ } -+ -+ top = (unsigned long) stack + PAGE_SIZE - sizeof(void *); -+ sig_top = (unsigned long) sigstack + PAGE_SIZE; -+ -+ /* Get the sigcontext, no sigrestorer layout */ -+ raw_sc.restorer = 0; -+ base = capture_stack_common(sc_child, &raw_sc, &raw_sc.common, -+ (void *) top, sigstack, PAGE_SIZE, -+ &signal_frame_sc.common); -+ -+ signal_frame_sc.sc_index = raw_sc.sc - base; -+ setup_arch_frame(&raw_sc.common.arch, &signal_frame_sc.common.arch); -+ -+ /* Ditto for the sigcontext, sigrestorer layout */ -+ raw_sc.restorer = 1; -+ base = capture_stack_common(sc_child, &raw_sc, &raw_sc.common, -+ (void *) top, sigstack, PAGE_SIZE, -+ &signal_frame_sc_sr.common); -+ signal_frame_sc_sr.sc_index = raw_sc.sc - base; -+ setup_arch_frame(&raw_sc.common.arch, &signal_frame_sc_sr.common.arch); -+ -+ /* And the siginfo layout */ -+ -+ base = capture_stack_common(si_child, &raw_si, &raw_si.common, -+ (void *) top, sigstack, PAGE_SIZE, -+ &signal_frame_si.common); -+ signal_frame_si.sip_index = raw_si.sip - base; -+ signal_frame_si.si_index = raw_si.si - base; -+ signal_frame_si.ucp_index = raw_si.ucp - base; -+ signal_frame_si.uc_index = raw_si.uc - base; -+ setup_arch_frame(&raw_si.common.arch, &signal_frame_si.common.arch); -+ -+ if((munmap(stack, PAGE_SIZE) < 0) || -+ (munmap(sigstack, PAGE_SIZE) < 0)){ -+ printf("capture_signal_stack : munmap failed - errno = %d\n", -+ errno); -+ exit(1); -+ } -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/frame_kern.c um/arch/um/kernel/frame_kern.c ---- orig/arch/um/kernel/frame_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/frame_kern.c 2002-12-08 19:44:13.000000000 -0500 -@@ -0,0 +1,171 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "asm/ptrace.h" -+#include "asm/uaccess.h" -+#include "asm/signal.h" -+#include "asm/uaccess.h" -+#include "asm/ucontext.h" -+#include "frame_kern.h" -+#include "sigcontext.h" -+#include "sysdep/ptrace.h" -+#include "choose-mode.h" -+#include "mode.h" -+ -+int copy_siginfo_to_user(siginfo_t *to, siginfo_t *from) -+{ -+ if (!access_ok (VERIFY_WRITE, to, sizeof(siginfo_t))) -+ return -EFAULT; -+ if (from->si_code < 0) -+ return __copy_to_user(to, from, sizeof(siginfo_t)); -+ else { -+ int err; -+ -+ /* If you change siginfo_t structure, please be sure -+ this code is fixed accordingly. -+ It should never copy any pad contained in the structure -+ to avoid security leaks, but must copy the generic -+ 3 ints plus the relevant union member. */ -+ err = __put_user(from->si_signo, &to->si_signo); -+ err |= __put_user(from->si_errno, &to->si_errno); -+ err |= __put_user((short)from->si_code, &to->si_code); -+ /* First 32bits of unions are always present. */ -+ err |= __put_user(from->si_pid, &to->si_pid); -+ switch (from->si_code >> 16) { -+ case __SI_FAULT >> 16: -+ break; -+ case __SI_CHLD >> 16: -+ err |= __put_user(from->si_utime, &to->si_utime); -+ err |= __put_user(from->si_stime, &to->si_stime); -+ err |= __put_user(from->si_status, &to->si_status); -+ default: -+ err |= __put_user(from->si_uid, &to->si_uid); -+ break; -+ } -+ return err; -+ } -+} -+ -+static int copy_restorer(void (*restorer)(void), unsigned long start, -+ unsigned long sr_index, int sr_relative) -+{ -+ unsigned long sr; -+ -+ if(sr_relative){ -+ sr = (unsigned long) restorer; -+ sr += start + sr_index; -+ restorer = (void (*)(void)) sr; -+ } -+ -+ return(copy_to_user((void *) (start + sr_index), &restorer, -+ sizeof(restorer))); -+} -+ -+static int copy_sc_to_user(void *to, void *fp, struct pt_regs *from, -+ struct arch_frame_data *arch) -+{ -+ return(CHOOSE_MODE(copy_sc_to_user_tt(to, fp, UPT_SC(&from->regs), -+ arch), -+ copy_sc_to_user_skas(to, fp, &from->regs, -+ current->thread.cr2, -+ current->thread.err))); -+} -+ -+static int copy_ucontext_to_user(struct ucontext *uc, void *fp, sigset_t *set, -+ unsigned long sp) -+{ -+ int err = 0; -+ -+ err |= put_user(current->sas_ss_sp, &uc->uc_stack.ss_sp); -+ err |= put_user(sas_ss_flags(sp), &uc->uc_stack.ss_flags); -+ err |= put_user(current->sas_ss_size, &uc->uc_stack.ss_size); -+ err |= copy_sc_to_user(&uc->uc_mcontext, fp, ¤t->thread.regs, -+ &signal_frame_si.common.arch); -+ err |= copy_to_user(&uc->uc_sigmask, set, sizeof(*set)); -+ return(err); -+} -+ -+int setup_signal_stack_si(unsigned long stack_top, int sig, -+ unsigned long handler, void (*restorer)(void), -+ struct pt_regs *regs, siginfo_t *info, -+ sigset_t *mask) -+{ -+ unsigned long start; -+ void *sip, *ucp, *fp; -+ -+ start = stack_top - signal_frame_si.common.len; -+ sip = (void *) (start + signal_frame_si.si_index); -+ ucp = (void *) (start + signal_frame_si.uc_index); -+ fp = (void *) (((unsigned long) ucp) + sizeof(struct ucontext)); -+ -+ if(restorer == NULL) -+ panic("setup_signal_stack_si - no restorer"); -+ -+ if(copy_to_user((void *) start, signal_frame_si.common.data, -+ signal_frame_si.common.len) || -+ copy_to_user((void *) (start + signal_frame_si.common.sig_index), -+ &sig, sizeof(sig)) || -+ copy_siginfo_to_user(sip, info) || -+ copy_to_user((void *) (start + signal_frame_si.sip_index), &sip, -+ sizeof(sip)) || -+ copy_ucontext_to_user(ucp, fp, mask, PT_REGS_SP(regs)) || -+ copy_to_user((void *) (start + signal_frame_si.ucp_index), &ucp, -+ sizeof(ucp)) || -+ copy_restorer(restorer, start, signal_frame_si.common.sr_index, -+ signal_frame_si.common.sr_relative)) -+ return(1); -+ -+ PT_REGS_IP(regs) = handler; -+ PT_REGS_SP(regs) = start + signal_frame_si.common.sp_index; -+ return(0); -+} -+ -+int setup_signal_stack_sc(unsigned long stack_top, int sig, -+ unsigned long handler, void (*restorer)(void), -+ struct pt_regs *regs, sigset_t *mask) -+{ -+ struct frame_common *frame = &signal_frame_sc_sr.common; -+ void *user_sc; -+ int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long); -+ unsigned long sigs, sr; -+ unsigned long start = stack_top - frame->len - sig_size; -+ -+ user_sc = (void *) (start + signal_frame_sc_sr.sc_index); -+ if(restorer == NULL){ -+ frame = &signal_frame_sc.common; -+ user_sc = (void *) (start + signal_frame_sc.sc_index); -+ sr = (unsigned long) frame->data; -+ sr += frame->sr_index; -+ sr = *((unsigned long *) sr); -+ restorer = ((void (*)(void)) sr); -+ } -+ -+ sigs = start + frame->len; -+ if(copy_to_user((void *) start, frame->data, frame->len) || -+ copy_to_user((void *) (start + frame->sig_index), &sig, -+ sizeof(sig)) || -+ copy_sc_to_user(user_sc, NULL, regs, -+ &signal_frame_sc.common.arch) || -+ copy_to_user(sc_sigmask(user_sc), mask, sizeof(mask->sig[0])) || -+ copy_to_user((void *) sigs, &mask->sig[1], sig_size) || -+ copy_restorer(restorer, start, frame->sr_index, frame->sr_relative)) -+ return(1); -+ -+ PT_REGS_IP(regs) = handler; -+ PT_REGS_SP(regs) = start + frame->sp_index; -+ -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/gmon_syms.c um/arch/um/kernel/gmon_syms.c ---- orig/arch/um/kernel/gmon_syms.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/gmon_syms.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,20 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/module.h" -+ -+extern void __bb_init_func(void *); -+EXPORT_SYMBOL(__bb_init_func); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/gprof_syms.c um/arch/um/kernel/gprof_syms.c ---- orig/arch/um/kernel/gprof_syms.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/gprof_syms.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,20 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/module.h" -+ -+extern void mcount(void); -+EXPORT_SYMBOL(mcount); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/helper.c um/arch/um/kernel/helper.c ---- orig/arch/um/kernel/helper.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/helper.c 2002-10-31 10:34:23.000000000 -0500 -@@ -0,0 +1,153 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <errno.h> -+#include <fcntl.h> -+#include <sched.h> -+#include <sys/signal.h> -+#include <sys/wait.h> -+#include "user.h" -+#include "kern_util.h" -+#include "os.h" -+ -+struct helper_data { -+ void (*pre_exec)(void*); -+ void *pre_data; -+ char **argv; -+ int fd; -+}; -+ -+/* Debugging aid, changed only from gdb */ -+int helper_pause = 0; -+ -+static void helper_hup(int sig) -+{ -+} -+ -+static int helper_child(void *arg) -+{ -+ struct helper_data *data = arg; -+ char **argv = data->argv; -+ -+ if(helper_pause){ -+ signal(SIGHUP, helper_hup); -+ pause(); -+ } -+ if(data->pre_exec != NULL) -+ (*data->pre_exec)(data->pre_data); -+ execvp(argv[0], argv); -+ printk("execvp of '%s' failed - errno = %d\n", argv[0], errno); -+ write(data->fd, &errno, sizeof(errno)); -+ os_kill_process(os_getpid(), 0); -+ return(0); -+} -+ -+/* XXX The alloc_stack here breaks if this is called in the tracing thread */ -+ -+int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv, -+ unsigned long *stack_out) -+{ -+ struct helper_data data; -+ unsigned long stack, sp; -+ int pid, fds[2], err, n; -+ -+ if((stack_out != NULL) && (*stack_out != 0)) -+ stack = *stack_out; -+ else stack = alloc_stack(0, um_in_interrupt()); -+ if(stack == 0) return(-ENOMEM); -+ -+ err = os_pipe(fds, 1, 0); -+ if(err){ -+ printk("run_helper : pipe failed, errno = %d\n", -err); -+ return(err); -+ } -+ if(fcntl(fds[1], F_SETFD, 1) != 0){ -+ printk("run_helper : setting FD_CLOEXEC failed, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ -+ sp = stack + page_size() - sizeof(void *); -+ data.pre_exec = pre_exec; -+ data.pre_data = pre_data; -+ data.argv = argv; -+ data.fd = fds[1]; -+ pid = clone(helper_child, (void *) sp, CLONE_VM | SIGCHLD, &data); -+ if(pid < 0){ -+ printk("run_helper : clone failed, errno = %d\n", errno); -+ return(-errno); -+ } -+ close(fds[1]); -+ n = read(fds[0], &err, sizeof(err)); -+ if(n < 0){ -+ printk("run_helper : read on pipe failed, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ else if(n != 0){ -+ waitpid(pid, NULL, 0); -+ pid = -err; -+ } -+ -+ if(stack_out == NULL) free_stack(stack, 0); -+ else *stack_out = stack; -+ return(pid); -+} -+ -+int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags, -+ unsigned long *stack_out, int stack_order) -+{ -+ unsigned long stack, sp; -+ int pid, status; -+ -+ stack = alloc_stack(stack_order, um_in_interrupt()); -+ if(stack == 0) return(-ENOMEM); -+ -+ sp = stack + (page_size() << stack_order) - sizeof(void *); -+ pid = clone(proc, (void *) sp, flags | SIGCHLD, arg); -+ if(pid < 0){ -+ printk("run_helper_thread : clone failed, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ if(stack_out == NULL){ -+ pid = waitpid(pid, &status, 0); -+ if(pid < 0) -+ printk("run_helper_thread - wait failed, errno = %d\n", -+ pid); -+ if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)) -+ printk("run_helper_thread - thread returned status " -+ "0x%x\n", status); -+ free_stack(stack, stack_order); -+ } -+ else *stack_out = stack; -+ return(pid); -+} -+ -+int helper_wait(int pid, int block) -+{ -+ int ret; -+ -+ ret = waitpid(pid, NULL, WNOHANG); -+ if(ret < 0){ -+ printk("helper_wait : waitpid failed, errno = %d\n", errno); -+ return(-errno); -+ } -+ return(ret); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/initrd_kern.c um/arch/um/kernel/initrd_kern.c ---- orig/arch/um/kernel/initrd_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/initrd_kern.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,59 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/init.h" -+#include "linux/bootmem.h" -+#include "linux/blk.h" -+#include "asm/types.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "initrd.h" -+#include "init.h" -+#include "os.h" -+ -+/* Changed by uml_initrd_setup, which is a setup */ -+static char *initrd __initdata = NULL; -+ -+static int __init read_initrd(void) -+{ -+ void *area; -+ long long size; -+ int err; -+ -+ if(initrd == NULL) return 0; -+ err = os_file_size(initrd, &size); -+ if(err) return 0; -+ area = alloc_bootmem(size); -+ if(area == NULL) return 0; -+ if(load_initrd(initrd, area, size) == -1) return 0; -+ initrd_start = (unsigned long) area; -+ initrd_end = initrd_start + size; -+ return 0; -+} -+ -+__uml_postsetup(read_initrd); -+ -+static int __init uml_initrd_setup(char *line, int *add) -+{ -+ initrd = line; -+ return 0; -+} -+ -+__uml_setup("initrd=", uml_initrd_setup, -+"initrd=<initrd image>\n" -+" This is used to boot UML from an initrd image. The argument is the\n" -+" name of the file containing the image.\n\n" -+); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/initrd_user.c um/arch/um/kernel/initrd_user.c ---- orig/arch/um/kernel/initrd_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/initrd_user.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,43 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <unistd.h> -+#include <sys/types.h> -+#include <sys/stat.h> -+#include <fcntl.h> -+#include <errno.h> -+ -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "initrd.h" -+#include "os.h" -+ -+int load_initrd(char *filename, void *buf, int size) -+{ -+ int fd, n; -+ -+ if((fd = os_open_file(filename, of_read(OPENFLAGS()), 0)) < 0){ -+ printk("Opening '%s' failed - errno = %d\n", filename, errno); -+ return(-1); -+ } -+ if((n = read(fd, buf, size)) != size){ -+ printk("Read of %d bytes from '%s' returned %d, errno = %d\n", -+ size, filename, n, errno); -+ return(-1); -+ } -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/init_task.c um/arch/um/kernel/init_task.c ---- orig/arch/um/kernel/init_task.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/init_task.c 2002-12-28 19:58:44.000000000 -0500 -@@ -0,0 +1,61 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/mm.h" -+#include "linux/sched.h" -+#include "linux/version.h" -+#include "asm/uaccess.h" -+#include "asm/pgtable.h" -+#include "user_util.h" -+#include "mem_user.h" -+ -+static struct fs_struct init_fs = INIT_FS; -+static struct files_struct init_files = INIT_FILES; -+static struct signal_struct init_signals = INIT_SIGNALS; -+struct mm_struct init_mm = INIT_MM(init_mm); -+ -+/* -+ * Initial task structure. -+ * -+ * We need to make sure that this is 16384-byte aligned due to the -+ * way process stacks are handled. This is done by having a special -+ * "init_task" linker map entry.. -+ */ -+ -+union task_union init_task_union -+__attribute__((__section__(".data.init_task"))) = -+{ INIT_TASK(init_task_union.task) }; -+ -+struct task_struct *alloc_task_struct(void) -+{ -+ return((struct task_struct *) -+ __get_free_pages(GFP_KERNEL, CONFIG_KERNEL_STACK_ORDER)); -+} -+ -+void unprotect_stack(unsigned long stack) -+{ -+ protect_memory(stack, (1 << CONFIG_KERNEL_STACK_ORDER) * PAGE_SIZE, -+ 1, 1, 0, 1); -+} -+ -+void free_task_struct(struct task_struct *task) -+{ -+ /* free_pages decrements the page counter and only actually frees -+ * the pages if they are now not accessed by anything. -+ */ -+ free_pages((unsigned long) task, CONFIG_KERNEL_STACK_ORDER); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/irq.c um/arch/um/kernel/irq.c ---- orig/arch/um/kernel/irq.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/irq.c 2003-03-26 14:45:29.000000000 -0500 -@@ -0,0 +1,842 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ * Derived (i.e. mostly copied) from arch/i386/kernel/irq.c: -+ * Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar -+ */ -+ -+#include "linux/config.h" -+#include "linux/kernel.h" -+#include "linux/smp.h" -+#include "linux/irq.h" -+#include "linux/kernel_stat.h" -+#include "linux/interrupt.h" -+#include "linux/random.h" -+#include "linux/slab.h" -+#include "linux/file.h" -+#include "linux/proc_fs.h" -+#include "linux/init.h" -+#include "linux/seq_file.h" -+#include "asm/irq.h" -+#include "asm/hw_irq.h" -+#include "asm/hardirq.h" -+#include "asm/atomic.h" -+#include "asm/signal.h" -+#include "asm/system.h" -+#include "asm/errno.h" -+#include "asm/uaccess.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "irq_user.h" -+ -+static void register_irq_proc (unsigned int irq); -+ -+irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = -+ { [0 ... NR_IRQS-1] = { 0, &no_irq_type, NULL, 0, SPIN_LOCK_UNLOCKED}}; -+ -+/* -+ * Generic no controller code -+ */ -+ -+static void enable_none(unsigned int irq) { } -+static unsigned int startup_none(unsigned int irq) { return 0; } -+static void disable_none(unsigned int irq) { } -+static void ack_none(unsigned int irq) -+{ -+/* -+ * 'what should we do if we get a hw irq event on an illegal vector'. -+ * each architecture has to answer this themselves, it doesnt deserve -+ * a generic callback i think. -+ */ -+#if CONFIG_X86 -+ printk(KERN_ERR "unexpected IRQ trap at vector %02x\n", irq); -+#ifdef CONFIG_X86_LOCAL_APIC -+ /* -+ * Currently unexpected vectors happen only on SMP and APIC. -+ * We _must_ ack these because every local APIC has only N -+ * irq slots per priority level, and a 'hanging, unacked' IRQ -+ * holds up an irq slot - in excessive cases (when multiple -+ * unexpected vectors occur) that might lock up the APIC -+ * completely. -+ */ -+ ack_APIC_irq(); -+#endif -+#endif -+} -+ -+/* startup is the same as "enable", shutdown is same as "disable" */ -+#define shutdown_none disable_none -+#define end_none enable_none -+ -+struct hw_interrupt_type no_irq_type = { -+ "none", -+ startup_none, -+ shutdown_none, -+ enable_none, -+ disable_none, -+ ack_none, -+ end_none -+}; -+ -+/* Not changed */ -+volatile unsigned long irq_err_count; -+ -+/* -+ * Generic, controller-independent functions: -+ */ -+ -+int get_irq_list(char *buf) -+{ -+ int i, j; -+ unsigned long flags; -+ struct irqaction * action; -+ char *p = buf; -+ -+ p += sprintf(p, " "); -+ for (j=0; j<smp_num_cpus; j++) -+ p += sprintf(p, "CPU%d ",j); -+ *p++ = '\n'; -+ -+ for (i = 0 ; i < NR_IRQS ; i++) { -+ spin_lock_irqsave(&irq_desc[i].lock, flags); -+ action = irq_desc[i].action; -+ if (!action) -+ goto end; -+ p += sprintf(p, "%3d: ",i); -+#ifndef CONFIG_SMP -+ p += sprintf(p, "%10u ", kstat_irqs(i)); -+#else -+ for (j = 0; j < smp_num_cpus; j++) -+ p += sprintf(p, "%10u ", -+ kstat.irqs[cpu_logical_map(j)][i]); -+#endif -+ p += sprintf(p, " %14s", irq_desc[i].handler->typename); -+ p += sprintf(p, " %s", action->name); -+ -+ for (action=action->next; action; action = action->next) -+ p += sprintf(p, ", %s", action->name); -+ *p++ = '\n'; -+ end: -+ spin_unlock_irqrestore(&irq_desc[i].lock, flags); -+ } -+ p += sprintf(p, "\n"); -+#ifdef notdef -+#if CONFIG_SMP -+ p += sprintf(p, "LOC: "); -+ for (j = 0; j < smp_num_cpus; j++) -+ p += sprintf(p, "%10u ", -+ apic_timer_irqs[cpu_logical_map(j)]); -+ p += sprintf(p, "\n"); -+#endif -+#endif -+ p += sprintf(p, "ERR: %10lu\n", irq_err_count); -+ return p - buf; -+} -+ -+ -+/* -+ * This should really return information about whether -+ * we should do bottom half handling etc. Right now we -+ * end up _always_ checking the bottom half, which is a -+ * waste of time and is not what some drivers would -+ * prefer. -+ */ -+int handle_IRQ_event(unsigned int irq, struct pt_regs * regs, -+ struct irqaction * action) -+{ -+ int status; -+ int cpu = smp_processor_id(); -+ -+ irq_enter(cpu, irq); -+ -+ status = 1; /* Force the "do bottom halves" bit */ -+ -+ if (!(action->flags & SA_INTERRUPT)) -+ __sti(); -+ -+ do { -+ status |= action->flags; -+ action->handler(irq, action->dev_id, regs); -+ action = action->next; -+ } while (action); -+ if (status & SA_SAMPLE_RANDOM) -+ add_interrupt_randomness(irq); -+ __cli(); -+ -+ irq_exit(cpu, irq); -+ -+ return status; -+} -+ -+/* -+ * Generic enable/disable code: this just calls -+ * down into the PIC-specific version for the actual -+ * hardware disable after having gotten the irq -+ * controller lock. -+ */ -+ -+/** -+ * disable_irq_nosync - disable an irq without waiting -+ * @irq: Interrupt to disable -+ * -+ * Disable the selected interrupt line. Disables of an interrupt -+ * stack. Unlike disable_irq(), this function does not ensure existing -+ * instances of the IRQ handler have completed before returning. -+ * -+ * This function may be called from IRQ context. -+ */ -+ -+void inline disable_irq_nosync(unsigned int irq) -+{ -+ irq_desc_t *desc = irq_desc + irq; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&desc->lock, flags); -+ if (!desc->depth++) { -+ desc->status |= IRQ_DISABLED; -+ desc->handler->disable(irq); -+ } -+ spin_unlock_irqrestore(&desc->lock, flags); -+} -+ -+/** -+ * disable_irq - disable an irq and wait for completion -+ * @irq: Interrupt to disable -+ * -+ * Disable the selected interrupt line. Disables of an interrupt -+ * stack. That is for two disables you need two enables. This -+ * function waits for any pending IRQ handlers for this interrupt -+ * to complete before returning. If you use this function while -+ * holding a resource the IRQ handler may need you will deadlock. -+ * -+ * This function may be called - with care - from IRQ context. -+ */ -+ -+void disable_irq(unsigned int irq) -+{ -+ disable_irq_nosync(irq); -+ -+ if (!local_irq_count(smp_processor_id())) { -+ do { -+ barrier(); -+ } while (irq_desc[irq].status & IRQ_INPROGRESS); -+ } -+} -+ -+/** -+ * enable_irq - enable interrupt handling on an irq -+ * @irq: Interrupt to enable -+ * -+ * Re-enables the processing of interrupts on this IRQ line -+ * providing no disable_irq calls are now in effect. -+ * -+ * This function may be called from IRQ context. -+ */ -+ -+void enable_irq(unsigned int irq) -+{ -+ irq_desc_t *desc = irq_desc + irq; -+ unsigned long flags; -+ -+ spin_lock_irqsave(&desc->lock, flags); -+ switch (desc->depth) { -+ case 1: { -+ unsigned int status = desc->status & ~IRQ_DISABLED; -+ desc->status = status; -+ if ((status & (IRQ_PENDING | IRQ_REPLAY)) == IRQ_PENDING) { -+ desc->status = status | IRQ_REPLAY; -+ hw_resend_irq(desc->handler,irq); -+ } -+ desc->handler->enable(irq); -+ /* fall-through */ -+ } -+ default: -+ desc->depth--; -+ break; -+ case 0: -+ printk(KERN_ERR "enable_irq() unbalanced from %p\n", -+ __builtin_return_address(0)); -+ } -+ spin_unlock_irqrestore(&desc->lock, flags); -+} -+ -+/* -+ * do_IRQ handles all normal device IRQ's (the special -+ * SMP cross-CPU interrupts have their own specific -+ * handlers). -+ */ -+unsigned int do_IRQ(int irq, union uml_pt_regs *regs) -+{ -+ /* -+ * 0 return value means that this irq is already being -+ * handled by some other CPU. (or is disabled) -+ */ -+ int cpu = smp_processor_id(); -+ irq_desc_t *desc = irq_desc + irq; -+ struct irqaction * action; -+ unsigned int status; -+ -+ kstat.irqs[cpu][irq]++; -+ spin_lock(&desc->lock); -+ desc->handler->ack(irq); -+ /* -+ REPLAY is when Linux resends an IRQ that was dropped earlier -+ WAITING is used by probe to mark irqs that are being tested -+ */ -+ status = desc->status & ~(IRQ_REPLAY | IRQ_WAITING); -+ status |= IRQ_PENDING; /* we _want_ to handle it */ -+ -+ /* -+ * If the IRQ is disabled for whatever reason, we cannot -+ * use the action we have. -+ */ -+ action = NULL; -+ if (!(status & (IRQ_DISABLED | IRQ_INPROGRESS))) { -+ action = desc->action; -+ status &= ~IRQ_PENDING; /* we commit to handling */ -+ status |= IRQ_INPROGRESS; /* we are handling it */ -+ } -+ desc->status = status; -+ -+ /* -+ * If there is no IRQ handler or it was disabled, exit early. -+ Since we set PENDING, if another processor is handling -+ a different instance of this same irq, the other processor -+ will take care of it. -+ */ -+ if (!action) -+ goto out; -+ -+ /* -+ * Edge triggered interrupts need to remember -+ * pending events. -+ * This applies to any hw interrupts that allow a second -+ * instance of the same irq to arrive while we are in do_IRQ -+ * or in the handler. But the code here only handles the _second_ -+ * instance of the irq, not the third or fourth. So it is mostly -+ * useful for irq hardware that does not mask cleanly in an -+ * SMP environment. -+ */ -+ for (;;) { -+ spin_unlock(&desc->lock); -+ handle_IRQ_event(irq, (struct pt_regs *) regs, action); -+ spin_lock(&desc->lock); -+ -+ if (!(desc->status & IRQ_PENDING)) -+ break; -+ desc->status &= ~IRQ_PENDING; -+ } -+ desc->status &= ~IRQ_INPROGRESS; -+out: -+ /* -+ * The ->end() handler has to deal with interrupts which got -+ * disabled while the handler was running. -+ */ -+ desc->handler->end(irq); -+ spin_unlock(&desc->lock); -+ -+ if (softirq_pending(cpu)) -+ do_softirq(); -+ return 1; -+} -+ -+/** -+ * request_irq - allocate an interrupt line -+ * @irq: Interrupt line to allocate -+ * @handler: Function to be called when the IRQ occurs -+ * @irqflags: Interrupt type flags -+ * @devname: An ascii name for the claiming device -+ * @dev_id: A cookie passed back to the handler function -+ * -+ * This call allocates interrupt resources and enables the -+ * interrupt line and IRQ handling. From the point this -+ * call is made your handler function may be invoked. Since -+ * your handler function must clear any interrupt the board -+ * raises, you must take care both to initialise your hardware -+ * and to set up the interrupt handler in the right order. -+ * -+ * Dev_id must be globally unique. Normally the address of the -+ * device data structure is used as the cookie. Since the handler -+ * receives this value it makes sense to use it. -+ * -+ * If your interrupt is shared you must pass a non NULL dev_id -+ * as this is required when freeing the interrupt. -+ * -+ * Flags: -+ * -+ * SA_SHIRQ Interrupt is shared -+ * -+ * SA_INTERRUPT Disable local interrupts while processing -+ * -+ * SA_SAMPLE_RANDOM The interrupt can be used for entropy -+ * -+ */ -+ -+int request_irq(unsigned int irq, -+ void (*handler)(int, void *, struct pt_regs *), -+ unsigned long irqflags, -+ const char * devname, -+ void *dev_id) -+{ -+ int retval; -+ struct irqaction * action; -+ -+#if 1 -+ /* -+ * Sanity-check: shared interrupts should REALLY pass in -+ * a real dev-ID, otherwise we'll have trouble later trying -+ * to figure out which interrupt is which (messes up the -+ * interrupt freeing logic etc). -+ */ -+ if (irqflags & SA_SHIRQ) { -+ if (!dev_id) -+ printk(KERN_ERR "Bad boy: %s (at 0x%x) called us " -+ "without a dev_id!\n", devname, (&irq)[-1]); -+ } -+#endif -+ -+ if (irq >= NR_IRQS) -+ return -EINVAL; -+ if (!handler) -+ return -EINVAL; -+ -+ action = (struct irqaction *) -+ kmalloc(sizeof(struct irqaction), GFP_KERNEL); -+ if (!action) -+ return -ENOMEM; -+ -+ action->handler = handler; -+ action->flags = irqflags; -+ action->mask = 0; -+ action->name = devname; -+ action->next = NULL; -+ action->dev_id = dev_id; -+ -+ retval = setup_irq(irq, action); -+ if (retval) -+ kfree(action); -+ return retval; -+} -+ -+int um_request_irq(unsigned int irq, int fd, int type, -+ void (*handler)(int, void *, struct pt_regs *), -+ unsigned long irqflags, const char * devname, -+ void *dev_id) -+{ -+ int err; -+ -+ err = request_irq(irq, handler, irqflags, devname, dev_id); -+ if(err) -+ return(err); -+ -+ if(fd != -1) -+ err = activate_fd(irq, fd, type, dev_id); -+ return(err); -+} -+ -+/* this was setup_x86_irq but it seems pretty generic */ -+int setup_irq(unsigned int irq, struct irqaction * new) -+{ -+ int shared = 0; -+ unsigned long flags; -+ struct irqaction *old, **p; -+ irq_desc_t *desc = irq_desc + irq; -+ -+ /* -+ * Some drivers like serial.c use request_irq() heavily, -+ * so we have to be careful not to interfere with a -+ * running system. -+ */ -+ if (new->flags & SA_SAMPLE_RANDOM) { -+ /* -+ * This function might sleep, we want to call it first, -+ * outside of the atomic block. -+ * Yes, this might clear the entropy pool if the wrong -+ * driver is attempted to be loaded, without actually -+ * installing a new handler, but is this really a problem, -+ * only the sysadmin is able to do this. -+ */ -+ rand_initialize_irq(irq); -+ } -+ -+ /* -+ * The following block of code has to be executed atomically -+ */ -+ spin_lock_irqsave(&desc->lock,flags); -+ p = &desc->action; -+ if ((old = *p) != NULL) { -+ /* Can't share interrupts unless both agree to */ -+ if (!(old->flags & new->flags & SA_SHIRQ)) { -+ spin_unlock_irqrestore(&desc->lock,flags); -+ return -EBUSY; -+ } -+ -+ /* add new interrupt at end of irq queue */ -+ do { -+ p = &old->next; -+ old = *p; -+ } while (old); -+ shared = 1; -+ } -+ -+ *p = new; -+ -+ if (!shared) { -+ desc->depth = 0; -+ desc->status &= ~IRQ_DISABLED; -+ desc->handler->startup(irq); -+ } -+ spin_unlock_irqrestore(&desc->lock,flags); -+ -+ register_irq_proc(irq); -+ return 0; -+} -+ -+/** -+ * free_irq - free an interrupt -+ * @irq: Interrupt line to free -+ * @dev_id: Device identity to free -+ * -+ * Remove an interrupt handler. The handler is removed and if the -+ * interrupt line is no longer in use by any driver it is disabled. -+ * On a shared IRQ the caller must ensure the interrupt is disabled -+ * on the card it drives before calling this function. The function -+ * does not return until any executing interrupts for this IRQ -+ * have completed. -+ * -+ * This function may be called from interrupt context. -+ * -+ * Bugs: Attempting to free an irq in a handler for the same irq hangs -+ * the machine. -+ */ -+ -+void free_irq(unsigned int irq, void *dev_id) -+{ -+ irq_desc_t *desc; -+ struct irqaction **p; -+ unsigned long flags; -+ -+ if (irq >= NR_IRQS) -+ return; -+ -+ desc = irq_desc + irq; -+ spin_lock_irqsave(&desc->lock,flags); -+ p = &desc->action; -+ for (;;) { -+ struct irqaction * action = *p; -+ if (action) { -+ struct irqaction **pp = p; -+ p = &action->next; -+ if (action->dev_id != dev_id) -+ continue; -+ -+ /* Found it - now remove it from the list of entries */ -+ *pp = action->next; -+ if (!desc->action) { -+ desc->status |= IRQ_DISABLED; -+ desc->handler->shutdown(irq); -+ } -+ free_irq_by_irq_and_dev(irq, dev_id); -+ spin_unlock_irqrestore(&desc->lock,flags); -+ -+#ifdef CONFIG_SMP -+ /* Wait to make sure it's not being used on another CPU */ -+ while (desc->status & IRQ_INPROGRESS) -+ barrier(); -+#endif -+ kfree(action); -+ return; -+ } -+ printk(KERN_ERR "Trying to free free IRQ%d\n",irq); -+ spin_unlock_irqrestore(&desc->lock,flags); -+ return; -+ } -+} -+ -+/* These are initialized by sysctl_init, which is called from init/main.c */ -+static struct proc_dir_entry * root_irq_dir; -+static struct proc_dir_entry * irq_dir [NR_IRQS]; -+static struct proc_dir_entry * smp_affinity_entry [NR_IRQS]; -+ -+/* 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 }; -+ -+#define HEX_DIGITS 8 -+ -+static int irq_affinity_read_proc (char *page, char **start, off_t off, -+ int count, int *eof, void *data) -+{ -+ if (count < HEX_DIGITS+1) -+ return -EINVAL; -+ return sprintf (page, "%08lx\n", irq_affinity[(long)data]); -+} -+ -+static unsigned int parse_hex_value (const char *buffer, -+ unsigned long count, unsigned long *ret) -+{ -+ unsigned char hexnum [HEX_DIGITS]; -+ unsigned long value; -+ int i; -+ -+ if (!count) -+ return -EINVAL; -+ if (count > HEX_DIGITS) -+ count = HEX_DIGITS; -+ if (copy_from_user(hexnum, buffer, count)) -+ return -EFAULT; -+ -+ /* -+ * 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]; -+ -+ switch (c) { -+ case '0' ... '9': c -= '0'; break; -+ case 'a' ... 'f': c -= 'a'-10; break; -+ case 'A' ... 'F': c -= 'A'-10; break; -+ default: -+ goto out; -+ } -+ value = (value << 4) | c; -+ } -+out: -+ *ret = value; -+ return 0; -+} -+ -+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; -+ -+ if (!irq_desc[irq].handler->set_affinity) -+ return -EIO; -+ -+ err = parse_hex_value(buffer, count, &new_value); -+ -+#if CONFIG_SMP -+ /* -+ * Do not allow disabling IRQs completely - it's a too easy -+ * way to make the system unusable accidentally :-) At least -+ * one online CPU still has to be targeted. -+ */ -+ if (!(new_value & cpu_online_map)) -+ return -EINVAL; -+#endif -+ -+ irq_affinity[irq] = new_value; -+ irq_desc[irq].handler->set_affinity(irq, new_value); -+ -+ return full_count; -+} -+ -+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; -+ if (count < HEX_DIGITS+1) -+ return -EINVAL; -+ return sprintf (page, "%08lx\n", *mask); -+} -+ -+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; -+ -+ err = parse_hex_value(buffer, count, &new_value); -+ if (err) -+ return err; -+ -+ *mask = new_value; -+ return full_count; -+} -+ -+#define MAX_NAMELEN 10 -+ -+static void register_irq_proc (unsigned int irq) -+{ -+ struct proc_dir_entry *entry; -+ char name [MAX_NAMELEN]; -+ -+ if (!root_irq_dir || (irq_desc[irq].handler == &no_irq_type) || -+ irq_dir[irq]) -+ return; -+ -+ memset(name, 0, MAX_NAMELEN); -+ sprintf(name, "%d", irq); -+ -+ /* create /proc/irq/1234 */ -+ irq_dir[irq] = proc_mkdir(name, root_irq_dir); -+ -+ /* create /proc/irq/1234/smp_affinity */ -+ entry = create_proc_entry("smp_affinity", 0600, irq_dir[irq]); -+ -+ entry->nlink = 1; -+ entry->data = (void *)(long)irq; -+ entry->read_proc = irq_affinity_read_proc; -+ entry->write_proc = irq_affinity_write_proc; -+ -+ smp_affinity_entry[irq] = entry; -+} -+ -+/* Read and written as a long */ -+unsigned long prof_cpu_mask = -1; -+ -+void __init init_irq_proc (void) -+{ -+ struct proc_dir_entry *entry; -+ int i; -+ -+ /* create /proc/irq */ -+ root_irq_dir = proc_mkdir("irq", 0); -+ -+ /* create /proc/irq/prof_cpu_mask */ -+ entry = create_proc_entry("prof_cpu_mask", 0600, root_irq_dir); -+ -+ entry->nlink = 1; -+ entry->data = (void *)&prof_cpu_mask; -+ entry->read_proc = prof_cpu_mask_read_proc; -+ entry->write_proc = prof_cpu_mask_write_proc; -+ -+ /* -+ * Create entries for all existing IRQs. -+ */ -+ for (i = 0; i < NR_IRQS; i++) -+ register_irq_proc(i); -+} -+ -+static spinlock_t irq_spinlock = SPIN_LOCK_UNLOCKED; -+ -+unsigned long irq_lock(void) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&irq_spinlock, flags); -+ return(flags); -+} -+ -+void irq_unlock(unsigned long flags) -+{ -+ spin_unlock_irqrestore(&irq_spinlock, flags); -+} -+ -+unsigned long probe_irq_on(void) -+{ -+ return(0); -+} -+ -+int probe_irq_off(unsigned long val) -+{ -+ return(0); -+} -+ -+static unsigned int startup_SIGIO_irq(unsigned int irq) -+{ -+ return(0); -+} -+ -+static void shutdown_SIGIO_irq(unsigned int irq) -+{ -+} -+ -+static void enable_SIGIO_irq(unsigned int irq) -+{ -+} -+ -+static void disable_SIGIO_irq(unsigned int irq) -+{ -+} -+ -+static void mask_and_ack_SIGIO(unsigned int irq) -+{ -+} -+ -+static void end_SIGIO_irq(unsigned int irq) -+{ -+} -+ -+static unsigned int startup_SIGVTALRM_irq(unsigned int irq) -+{ -+ return(0); -+} -+ -+static void shutdown_SIGVTALRM_irq(unsigned int irq) -+{ -+} -+ -+static void enable_SIGVTALRM_irq(unsigned int irq) -+{ -+} -+ -+static void disable_SIGVTALRM_irq(unsigned int irq) -+{ -+} -+ -+static void mask_and_ack_SIGVTALRM(unsigned int irq) -+{ -+} -+ -+static void end_SIGVTALRM_irq(unsigned int irq) -+{ -+} -+ -+static struct hw_interrupt_type SIGIO_irq_type = { -+ "SIGIO", -+ startup_SIGIO_irq, -+ shutdown_SIGIO_irq, -+ enable_SIGIO_irq, -+ disable_SIGIO_irq, -+ mask_and_ack_SIGIO, -+ end_SIGIO_irq, -+ NULL -+}; -+ -+static struct hw_interrupt_type SIGVTALRM_irq_type = { -+ "SIGVTALRM", -+ startup_SIGVTALRM_irq, -+ shutdown_SIGVTALRM_irq, -+ enable_SIGVTALRM_irq, -+ disable_SIGVTALRM_irq, -+ mask_and_ack_SIGVTALRM, -+ end_SIGVTALRM_irq, -+ NULL -+}; -+ -+void __init init_IRQ(void) -+{ -+ int i; -+ -+ irq_desc[TIMER_IRQ].status = IRQ_DISABLED; -+ irq_desc[TIMER_IRQ].action = 0; -+ irq_desc[TIMER_IRQ].depth = 1; -+ irq_desc[TIMER_IRQ].handler = &SIGVTALRM_irq_type; -+ enable_irq(TIMER_IRQ); -+ for(i=1;i<NR_IRQS;i++){ -+ irq_desc[i].status = IRQ_DISABLED; -+ irq_desc[i].action = 0; -+ irq_desc[i].depth = 1; -+ irq_desc[i].handler = &SIGIO_irq_type; -+ enable_irq(i); -+ } -+ init_irq_signals(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/irq_user.c um/arch/um/kernel/irq_user.c ---- orig/arch/um/kernel/irq_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/irq_user.c 2002-12-22 15:49:46.000000000 -0500 -@@ -0,0 +1,427 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <unistd.h> -+#include <errno.h> -+#include <fcntl.h> -+#include <signal.h> -+#include <string.h> -+#include <sys/poll.h> -+#include <sys/types.h> -+#include <sys/time.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "process.h" -+#include "signal_user.h" -+#include "sigio.h" -+#include "irq_user.h" -+#include "os.h" -+ -+struct irq_fd { -+ struct irq_fd *next; -+ void *id; -+ int fd; -+ int type; -+ int irq; -+ int pid; -+ int events; -+ int current_events; -+ int freed; -+}; -+ -+static struct irq_fd *active_fds = NULL; -+static struct irq_fd **last_irq_ptr = &active_fds; -+ -+static struct pollfd *pollfds = NULL; -+static int pollfds_num = 0; -+static int pollfds_size = 0; -+ -+extern int io_count, intr_count; -+ -+void sigio_handler(int sig, union uml_pt_regs *regs) -+{ -+ struct irq_fd *irq_fd, *next; -+ int i, n; -+ -+ if(smp_sigio_handler()) return; -+ while(1){ -+ if((n = poll(pollfds, pollfds_num, 0)) < 0){ -+ if(errno == EINTR) continue; -+ printk("sigio_handler : poll returned %d, " -+ "errno = %d\n", n, errno); -+ break; -+ } -+ if(n == 0) break; -+ -+ irq_fd = active_fds; -+ for(i = 0; i < pollfds_num; i++){ -+ if(pollfds[i].revents != 0){ -+ irq_fd->current_events = pollfds[i].revents; -+ pollfds[i].fd = -1; -+ } -+ irq_fd = irq_fd->next; -+ } -+ -+ for(irq_fd = active_fds; irq_fd != NULL; irq_fd = next){ -+ next = irq_fd->next; -+ if(irq_fd->current_events != 0){ -+ irq_fd->current_events = 0; -+ do_IRQ(irq_fd->irq, regs); -+ -+ /* This is here because the next irq may be -+ * freed in the handler. If a console goes -+ * away, both the read and write irqs will be -+ * freed. After do_IRQ, ->next will point to -+ * a good IRQ. -+ * Irqs can't be freed inside their handlers, -+ * so the next best thing is to have them -+ * marked as needing freeing, so that they -+ * can be freed here. -+ */ -+ next = irq_fd->next; -+ if(irq_fd->freed) -+ free_irq(irq_fd->irq, irq_fd->id); -+ } -+ } -+ } -+} -+ -+int activate_ipi(int fd, int pid) -+{ -+ return(os_set_fd_async(fd, pid)); -+} -+ -+static void maybe_sigio_broken(int fd, int type) -+{ -+ if(isatty(fd)){ -+ if((type == IRQ_WRITE) && !pty_output_sigio){ -+ write_sigio_workaround(); -+ add_sigio_fd(fd, 0); -+ } -+ else if((type == IRQ_READ) && !pty_close_sigio){ -+ write_sigio_workaround(); -+ add_sigio_fd(fd, 1); -+ } -+ } -+} -+ -+int activate_fd(int irq, int fd, int type, void *dev_id) -+{ -+ struct pollfd *tmp_pfd; -+ struct irq_fd *new_fd, *irq_fd; -+ unsigned long flags; -+ int pid, events, err, n, size; -+ -+ pid = os_getpid(); -+ err = os_set_fd_async(fd, pid); -+ if(err < 0) -+ goto out; -+ -+ new_fd = um_kmalloc(sizeof(*new_fd)); -+ err = -ENOMEM; -+ if(new_fd == NULL) -+ goto out; -+ -+ if(type == IRQ_READ) events = POLLIN | POLLPRI; -+ else events = POLLOUT; -+ *new_fd = ((struct irq_fd) { .next = NULL, -+ .id = dev_id, -+ .fd = fd, -+ .type = type, -+ .irq = irq, -+ .pid = pid, -+ .events = events, -+ .current_events = 0, -+ .freed = 0 } ); -+ -+ /* Critical section - locked by a spinlock because this stuff can -+ * be changed from interrupt handlers. The stuff above is done -+ * outside the lock because it allocates memory. -+ */ -+ -+ /* Actually, it only looks like it can be called from interrupt -+ * context. The culprit is reactivate_fd, which calls -+ * maybe_sigio_broken, which calls write_sigio_workaround, -+ * which calls activate_fd. However, write_sigio_workaround should -+ * only be called once, at boot time. That would make it clear that -+ * this is called only from process context, and can be locked with -+ * a semaphore. -+ */ -+ flags = irq_lock(); -+ for(irq_fd = active_fds; irq_fd != NULL; irq_fd = irq_fd->next){ -+ if((irq_fd->fd == fd) && (irq_fd->type == type)){ -+ printk("Registering fd %d twice\n", fd); -+ printk("Irqs : %d, %d\n", irq_fd->irq, irq); -+ printk("Ids : 0x%x, 0x%x\n", irq_fd->id, dev_id); -+ goto out_unlock; -+ } -+ } -+ -+ n = pollfds_num; -+ if(n == pollfds_size){ -+ while(1){ -+ /* Here we have to drop the lock in order to call -+ * kmalloc, which might sleep. If something else -+ * came in and changed the pollfds array, we free -+ * the buffer and try again. -+ */ -+ irq_unlock(flags); -+ size = (pollfds_num + 1) * sizeof(pollfds[0]); -+ tmp_pfd = um_kmalloc(size); -+ flags = irq_lock(); -+ if(tmp_pfd == NULL) -+ goto out_unlock; -+ if(n == pollfds_size) -+ break; -+ kfree(tmp_pfd); -+ } -+ if(pollfds != NULL){ -+ memcpy(tmp_pfd, pollfds, -+ sizeof(pollfds[0]) * pollfds_size); -+ kfree(pollfds); -+ } -+ pollfds = tmp_pfd; -+ pollfds_size++; -+ } -+ -+ if(type == IRQ_WRITE) -+ fd = -1; -+ -+ pollfds[pollfds_num] = ((struct pollfd) { .fd = fd, -+ .events = events, -+ .revents = 0 }); -+ pollfds_num++; -+ -+ *last_irq_ptr = new_fd; -+ last_irq_ptr = &new_fd->next; -+ -+ irq_unlock(flags); -+ -+ /* This calls activate_fd, so it has to be outside the critical -+ * section. -+ */ -+ maybe_sigio_broken(fd, type); -+ -+ return(0); -+ -+ out_unlock: -+ irq_unlock(flags); -+ kfree(new_fd); -+ out: -+ return(err); -+} -+ -+static void free_irq_by_cb(int (*test)(struct irq_fd *, void *), void *arg) -+{ -+ struct irq_fd **prev; -+ unsigned long flags; -+ int i = 0; -+ -+ flags = irq_lock(); -+ prev = &active_fds; -+ while(*prev != NULL){ -+ if((*test)(*prev, arg)){ -+ struct irq_fd *old_fd = *prev; -+ if((pollfds[i].fd != -1) && -+ (pollfds[i].fd != (*prev)->fd)){ -+ printk("free_irq_by_cb - mismatch between " -+ "active_fds and pollfds, fd %d vs %d\n", -+ (*prev)->fd, pollfds[i].fd); -+ goto out; -+ } -+ memcpy(&pollfds[i], &pollfds[i + 1], -+ (pollfds_num - i - 1) * sizeof(pollfds[0])); -+ pollfds_num--; -+ if(last_irq_ptr == &old_fd->next) -+ last_irq_ptr = prev; -+ *prev = (*prev)->next; -+ if(old_fd->type == IRQ_WRITE) -+ ignore_sigio_fd(old_fd->fd); -+ kfree(old_fd); -+ continue; -+ } -+ prev = &(*prev)->next; -+ i++; -+ } -+ out: -+ irq_unlock(flags); -+} -+ -+struct irq_and_dev { -+ int irq; -+ void *dev; -+}; -+ -+static int same_irq_and_dev(struct irq_fd *irq, void *d) -+{ -+ struct irq_and_dev *data = d; -+ -+ return((irq->irq == data->irq) && (irq->id == data->dev)); -+} -+ -+void free_irq_by_irq_and_dev(int irq, void *dev) -+{ -+ struct irq_and_dev data = ((struct irq_and_dev) { .irq = irq, -+ .dev = dev }); -+ -+ free_irq_by_cb(same_irq_and_dev, &data); -+} -+ -+static int same_fd(struct irq_fd *irq, void *fd) -+{ -+ return(irq->fd == *((int *) fd)); -+} -+ -+void free_irq_by_fd(int fd) -+{ -+ free_irq_by_cb(same_fd, &fd); -+} -+ -+static struct irq_fd *find_irq_by_fd(int fd, int irqnum, int *index_out) -+{ -+ struct irq_fd *irq; -+ int i = 0; -+ -+ for(irq=active_fds; irq != NULL; irq = irq->next){ -+ if((irq->fd == fd) && (irq->irq == irqnum)) break; -+ i++; -+ } -+ if(irq == NULL){ -+ printk("find_irq_by_fd doesn't have descriptor %d\n", fd); -+ goto out; -+ } -+ if((pollfds[i].fd != -1) && (pollfds[i].fd != fd)){ -+ printk("find_irq_by_fd - mismatch between active_fds and " -+ "pollfds, fd %d vs %d, need %d\n", irq->fd, -+ pollfds[i].fd, fd); -+ irq = NULL; -+ goto out; -+ } -+ *index_out = i; -+ out: -+ return(irq); -+} -+ -+void free_irq_later(int irq, void *dev_id) -+{ -+ struct irq_fd *irq_fd; -+ unsigned long flags; -+ -+ flags = irq_lock(); -+ for(irq_fd = active_fds; irq_fd != NULL; irq_fd = irq_fd->next){ -+ if((irq_fd->irq == irq) && (irq_fd->id == dev_id)) -+ break; -+ } -+ if(irq_fd == NULL){ -+ printk("free_irq_later found no irq, irq = %d, " -+ "dev_id = 0x%p\n", irq, dev_id); -+ goto out; -+ } -+ irq_fd->freed = 1; -+ out: -+ irq_unlock(flags); -+} -+ -+void reactivate_fd(int fd, int irqnum) -+{ -+ struct irq_fd *irq; -+ unsigned long flags; -+ int i; -+ -+ flags = irq_lock(); -+ irq = find_irq_by_fd(fd, irqnum, &i); -+ if(irq == NULL){ -+ irq_unlock(flags); -+ return; -+ } -+ -+ pollfds[i].fd = irq->fd; -+ -+ irq_unlock(flags); -+ -+ /* This calls activate_fd, so it has to be outside the critical -+ * section. -+ */ -+ maybe_sigio_broken(fd, irq->type); -+} -+ -+void deactivate_fd(int fd, int irqnum) -+{ -+ struct irq_fd *irq; -+ unsigned long flags; -+ int i; -+ -+ flags = irq_lock(); -+ irq = find_irq_by_fd(fd, irqnum, &i); -+ if(irq == NULL) -+ goto out; -+ pollfds[i].fd = -1; -+ out: -+ irq_unlock(flags); -+} -+ -+void forward_ipi(int fd, int pid) -+{ -+ if(fcntl(fd, F_SETOWN, pid) < 0){ -+ int save_errno = errno; -+ if(fcntl(fd, F_GETOWN, 0) != pid){ -+ printk("forward_ipi: F_SETOWN failed, fd = %d, " -+ "me = %d, target = %d, errno = %d\n", fd, -+ os_getpid(), pid, save_errno); -+ } -+ } -+} -+ -+void forward_interrupts(int pid) -+{ -+ struct irq_fd *irq; -+ unsigned long flags; -+ -+ flags = irq_lock(); -+ for(irq=active_fds;irq != NULL;irq = irq->next){ -+ if(fcntl(irq->fd, F_SETOWN, pid) < 0){ -+ int save_errno = errno; -+ if(fcntl(irq->fd, F_GETOWN, 0) != pid){ -+ /* XXX Just remove the irq rather than -+ * print out an infinite stream of these -+ */ -+ printk("Failed to forward %d to pid %d, " -+ "errno = %d\n", irq->fd, pid, -+ save_errno); -+ } -+ } -+ irq->pid = pid; -+ } -+ irq_unlock(flags); -+} -+ -+void init_irq_signals(int on_sigstack) -+{ -+ __sighandler_t h; -+ int flags; -+ -+ flags = on_sigstack ? SA_ONSTACK : 0; -+ if(timer_irq_inited) h = (__sighandler_t) alarm_handler; -+ else h = boot_timer_handler; -+ -+ set_handler(SIGVTALRM, h, flags | SA_RESTART, -+ SIGUSR1, SIGIO, SIGWINCH, SIGALRM, -1); -+ set_handler(SIGIO, (__sighandler_t) sig_handler, flags | SA_RESTART, -+ SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); -+ signal(SIGWINCH, SIG_IGN); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/ksyms.c um/arch/um/kernel/ksyms.c ---- orig/arch/um/kernel/ksyms.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/ksyms.c 2002-12-17 13:29:43.000000000 -0500 -@@ -0,0 +1,94 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/module.h" -+#include "linux/string.h" -+#include "linux/smp_lock.h" -+#include "linux/spinlock.h" -+#include "asm/current.h" -+#include "asm/delay.h" -+#include "asm/processor.h" -+#include "asm/unistd.h" -+#include "asm/pgalloc.h" -+#include "asm/pgtable.h" -+#include "asm/page.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "os.h" -+#include "helper.h" -+ -+EXPORT_SYMBOL(stop); -+EXPORT_SYMBOL(strtok); -+EXPORT_SYMBOL(uml_physmem); -+EXPORT_SYMBOL(set_signals); -+EXPORT_SYMBOL(get_signals); -+EXPORT_SYMBOL(kernel_thread); -+EXPORT_SYMBOL(__const_udelay); -+EXPORT_SYMBOL(__udelay); -+EXPORT_SYMBOL(sys_waitpid); -+EXPORT_SYMBOL(task_size); -+EXPORT_SYMBOL(flush_tlb_range); -+EXPORT_SYMBOL(host_task_size); -+EXPORT_SYMBOL(arch_validate); -+ -+EXPORT_SYMBOL(region_pa); -+EXPORT_SYMBOL(region_va); -+EXPORT_SYMBOL(phys_mem_map); -+EXPORT_SYMBOL(page_mem_map); -+EXPORT_SYMBOL(high_physmem); -+EXPORT_SYMBOL(empty_zero_page); -+EXPORT_SYMBOL(um_virt_to_phys); -+EXPORT_SYMBOL(mode_tt); -+EXPORT_SYMBOL(handle_page_fault); -+ -+EXPORT_SYMBOL(os_getpid); -+EXPORT_SYMBOL(os_open_file); -+EXPORT_SYMBOL(os_read_file); -+EXPORT_SYMBOL(os_write_file); -+EXPORT_SYMBOL(os_seek_file); -+EXPORT_SYMBOL(os_pipe); -+EXPORT_SYMBOL(os_file_type); -+EXPORT_SYMBOL(os_close_file); -+EXPORT_SYMBOL(helper_wait); -+EXPORT_SYMBOL(os_shutdown_socket); -+EXPORT_SYMBOL(os_connect_socket); -+EXPORT_SYMBOL(run_helper); -+EXPORT_SYMBOL(start_thread); -+EXPORT_SYMBOL(dump_thread); -+ -+/* This is here because UML expands open to sys_open, not to a system -+ * call instruction. -+ */ -+EXPORT_SYMBOL(sys_open); -+EXPORT_SYMBOL(sys_lseek); -+EXPORT_SYMBOL(sys_read); -+EXPORT_SYMBOL(sys_wait4); -+ -+#ifdef CONFIG_SMP -+ -+/* required for SMP */ -+ -+extern void FASTCALL( __write_lock_failed(rwlock_t *rw)); -+EXPORT_SYMBOL_NOVERS(__write_lock_failed); -+ -+extern void FASTCALL( __read_lock_failed(rwlock_t *rw)); -+EXPORT_SYMBOL_NOVERS(__read_lock_failed); -+ -+EXPORT_SYMBOL(kernel_flag_cacheline); -+EXPORT_SYMBOL(smp_num_cpus); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/Makefile um/arch/um/kernel/Makefile ---- orig/arch/um/kernel/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/Makefile 2003-04-10 11:14:55.000000000 -0400 -@@ -0,0 +1,73 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET = built-in.o -+ -+obj-y = config.o checksum.o exec_kern.o exitcode.o frame_kern.o frame.o \ -+ helper.o init_task.o irq.o irq_user.o ksyms.o mem.o mem_user.o \ -+ process.o process_kern.o ptrace.o reboot.o resource.o sigio_user.o \ -+ sigio_kern.o signal_kern.o signal_user.o smp.o syscall_kern.o \ -+ syscall_user.o sysrq.o sys_call_table.o tempfile.o time.o \ -+ time_kern.o tlb.o trap_kern.o trap_user.o uaccess_user.o um_arch.o \ -+ umid.o user_syms.o user_util.o -+ -+obj-$(CONFIG_BLK_DEV_INITRD) += initrd_kern.o initrd_user.o -+obj-$(CONFIG_GPROF) += gprof_syms.o -+obj-$(CONFIG_GCOV) += gmon_syms.o -+obj-$(CONFIG_TTY_LOG) += tty_log.o -+ -+subdir-$(CONFIG_MODE_TT) += tt -+subdir-$(CONFIG_MODE_SKAS) += skas -+ -+user-objs-$(CONFIG_TTY_LOG) += tty_log.o -+ -+obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) -+ -+# user_syms.o not included here because Rules.make has its own ideas about -+# building anything in export-objs -+ -+USER_OBJS = $(filter %_user.o,$(obj-y)) $(user-objs-y) config.o helper.o \ -+ process.o tempfile.o time.o umid.o user_util.o -+ -+DMODULES-$(CONFIG_MODULES) = -D__CONFIG_MODULES__ -+DMODVERSIONS-$(CONFIG_MODVERSIONS) = -D__CONFIG_MODVERSIONS__ -+ -+export-objs-$(CONFIG_GPROF) += gprof_syms.o -+export-objs-$(CONFIG_GCOV) += gmon_syms.o -+ -+export-objs = ksyms.o process_kern.o signal_kern.o user_syms.o $(export-objs-y) -+ -+CFLAGS_user_syms.o = -D__AUTOCONF_INCLUDED__ $(DMODULES-y) $(DMODVERSIONS-y) \ -+ -I/usr/include -I../include -+ -+CFLAGS_frame.o := $(patsubst -fomit-frame-pointer,,$(USER_CFLAGS)) -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+# This has to be separate because it needs be compiled with frame pointers -+# regardless of how the rest of the kernel is built. -+ -+frame.o: frame.c -+ $(CC) $(CFLAGS_$@) -c -o $@ $< -+ -+QUOTE = 'my $$config=`cat $(TOPDIR)/.config`; $$config =~ s/"/\\"/g ; $$config =~ s/\n/\\n"\n"/g ; while(<STDIN>) { $$_ =~ s/CONFIG/$$config/; print $$_ }' -+ -+config.c : config.c.in $(TOPDIR)/.config -+ $(PERL) -e $(QUOTE) < config.c.in > $@ -+ -+clean: -+ $(RM) config.c -+ for dir in $(subdir-y) ; do $(MAKE) -C $$dir clean; done -+ -+modules: -+ -+fastdep: -+ -+dep: -+ -+archmrproper: clean -diff -Naur -X ../exclude-files orig/arch/um/kernel/mem.c um/arch/um/kernel/mem.c ---- orig/arch/um/kernel/mem.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/mem.c 2003-03-30 14:30:26.000000000 -0500 -@@ -0,0 +1,852 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/types.h" -+#include "linux/mm.h" -+#include "linux/fs.h" -+#include "linux/init.h" -+#include "linux/bootmem.h" -+#include "linux/swap.h" -+#include "linux/slab.h" -+#include "linux/vmalloc.h" -+#include "linux/highmem.h" -+#include "asm/page.h" -+#include "asm/pgtable.h" -+#include "asm/pgalloc.h" -+#include "asm/bitops.h" -+#include "asm/uaccess.h" -+#include "asm/tlb.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "mem_user.h" -+#include "mem.h" -+#include "kern.h" -+#include "init.h" -+#include "os.h" -+#include "mode_kern.h" -+#include "uml_uaccess.h" -+ -+/* Changed during early boot */ -+pgd_t swapper_pg_dir[1024]; -+unsigned long high_physmem; -+unsigned long vm_start; -+unsigned long vm_end; -+unsigned long highmem; -+unsigned long *empty_zero_page = NULL; -+unsigned long *empty_bad_page = NULL; -+ -+/* Not modified */ -+const char bad_pmd_string[] = "Bad pmd in pte_alloc: %08lx\n"; -+ -+/* Changed during early boot */ -+static unsigned long totalram_pages = 0; -+ -+extern char __init_begin, __init_end; -+extern long physmem_size; -+ -+#ifdef CONFIG_SMP -+/* Not changed by UML */ -+mmu_gather_t mmu_gathers[NR_CPUS]; -+#endif -+ -+/* Changed during early boot */ -+int kmalloc_ok = 0; -+ -+#define NREGIONS (phys_region_index(0xffffffff) - phys_region_index(0x0) + 1) -+struct mem_region *regions[NREGIONS] = { [ 0 ... NREGIONS - 1 ] = NULL }; -+#define REGION_SIZE ((0xffffffff & ~REGION_MASK) + 1) -+ -+/* Changed during early boot */ -+static unsigned long brk_end; -+ -+static void map_cb(void *unused) -+{ -+ map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, 0); -+} -+ -+void unmap_physmem(void) -+{ -+ os_unmap_memory((void *) brk_end, uml_reserved - brk_end); -+} -+ -+extern char __binary_start; -+ -+void mem_init(void) -+{ -+ unsigned long start; -+ -+#ifdef CONFIG_HIGHMEM -+ highmem_start_page = phys_page(__pa(high_physmem)); -+#endif -+ -+ /* clear the zero-page */ -+ memset((void *) empty_zero_page, 0, PAGE_SIZE); -+ -+ /* Map in the area just after the brk now that kmalloc is about -+ * to be turned on. -+ */ -+ brk_end = (unsigned long) UML_ROUND_UP(sbrk(0)); -+ map_cb(NULL); -+ initial_thread_cb(map_cb, NULL); -+ free_bootmem(__pa(brk_end), uml_reserved - brk_end); -+ uml_reserved = brk_end; -+ -+ /* Fill in any hole at the start of the binary */ -+ start = (unsigned long) &__binary_start; -+ if(uml_physmem != start){ -+ map_memory(uml_physmem, __pa(uml_physmem), start - uml_physmem, -+ 1, 1, 0); -+ } -+ -+ /* this will put all low memory onto the freelists */ -+ totalram_pages = free_all_bootmem(); -+ totalram_pages += highmem >> PAGE_SHIFT; -+ max_mapnr = totalram_pages; -+ num_physpages = totalram_pages; -+ printk(KERN_INFO "Memory: %luk available\n", -+ (unsigned long) nr_free_pages() << (PAGE_SHIFT-10)); -+ kmalloc_ok = 1; -+} -+ -+/* Changed during early boot */ -+static unsigned long kmem_top = 0; -+ -+unsigned long get_kmem_end(void) -+{ -+ if(kmem_top == 0) -+ kmem_top = CHOOSE_MODE(kmem_end_tt, kmem_end_skas); -+ return(kmem_top); -+} -+ -+void set_kmem_end(unsigned long new) -+{ -+ kmem_top = new; -+} -+ -+#if CONFIG_HIGHMEM -+/* Changed during early boot */ -+pte_t *kmap_pte; -+pgprot_t kmap_prot; -+ -+#define kmap_get_fixmap_pte(vaddr) \ -+ pte_offset(pmd_offset(pgd_offset_k(vaddr), (vaddr)), (vaddr)) -+ -+void __init kmap_init(void) -+{ -+ unsigned long kmap_vstart; -+ -+ /* cache the first kmap pte */ -+ kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN); -+ kmap_pte = kmap_get_fixmap_pte(kmap_vstart); -+ -+ kmap_prot = PAGE_KERNEL; -+} -+#endif /* CONFIG_HIGHMEM */ -+ -+static void __init fixrange_init(unsigned long start, unsigned long end, -+ pgd_t *pgd_base) -+{ -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ int i, j; -+ unsigned long vaddr; -+ -+ vaddr = start; -+ i = __pgd_offset(vaddr); -+ j = __pmd_offset(vaddr); -+ pgd = pgd_base + i; -+ -+ for ( ; (i < PTRS_PER_PGD) && (vaddr < end); pgd++, i++) { -+ pmd = (pmd_t *)pgd; -+ for (; (j < PTRS_PER_PMD) && (vaddr != end); pmd++, j++) { -+ if (pmd_none(*pmd)) { -+ pte = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE); -+ set_pmd(pmd, __pmd(_KERNPG_TABLE + -+ (unsigned long) __pa(pte))); -+ if (pte != pte_offset(pmd, 0)) -+ BUG(); -+ } -+ vaddr += PMD_SIZE; -+ } -+ j = 0; -+ } -+} -+ -+int init_maps(struct mem_region *region) -+{ -+ struct page *p, *map; -+ int i, n, len; -+ -+ if(region == &physmem_region){ -+ region->mem_map = mem_map; -+ return(0); -+ } -+ else if(region->mem_map != NULL) return(0); -+ -+ n = region->len >> PAGE_SHIFT; -+ len = n * sizeof(struct page); -+ if(kmalloc_ok){ -+ map = kmalloc(len, GFP_KERNEL); -+ if(map == NULL) map = vmalloc(len); -+ } -+ else map = alloc_bootmem_low_pages(len); -+ -+ if(map == NULL) -+ return(-ENOMEM); -+ for(i = 0; i < n; i++){ -+ p = &map[i]; -+ set_page_count(p, 0); -+ SetPageReserved(p); -+ INIT_LIST_HEAD(&p->list); -+ } -+ region->mem_map = map; -+ return(0); -+} -+ -+DECLARE_MUTEX(regions_sem); -+ -+static int setup_one_range(int fd, char *driver, unsigned long start, -+ unsigned long pfn, int len, -+ struct mem_region *region) -+{ -+ int i; -+ -+ down(®ions_sem); -+ for(i = 0; i < NREGIONS; i++){ -+ if(regions[i] == NULL) break; -+ } -+ if(i == NREGIONS){ -+ printk("setup_one_range : no free regions\n"); -+ i = -1; -+ goto out; -+ } -+ -+ if(fd == -1) -+ fd = create_mem_file(len); -+ -+ if(region == NULL){ -+ if(kmalloc_ok) -+ region = kmalloc(sizeof(*region), GFP_KERNEL); -+ else region = alloc_bootmem_low_pages(sizeof(*region)); -+ if(region == NULL) -+ panic("Failed to allocating mem_region"); -+ } -+ -+ *region = ((struct mem_region) { .driver = driver, -+ .start_pfn = pfn, -+ .start = start, -+ .len = len, -+ .fd = fd } ); -+ regions[i] = region; -+ out: -+ up(®ions_sem); -+ return(i); -+} -+ -+#ifdef CONFIG_HIGHMEM -+static void init_highmem(void) -+{ -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ unsigned long vaddr; -+ -+ /* -+ * Permanent kmaps: -+ */ -+ vaddr = PKMAP_BASE; -+ fixrange_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, swapper_pg_dir); -+ -+ pgd = swapper_pg_dir + __pgd_offset(vaddr); -+ pmd = pmd_offset(pgd, vaddr); -+ pte = pte_offset(pmd, vaddr); -+ pkmap_page_table = pte; -+ -+ kmap_init(); -+} -+ -+void setup_highmem(unsigned long len) -+{ -+ struct mem_region *region; -+ struct page *page, *map; -+ unsigned long phys; -+ int i, cur, index; -+ -+ phys = physmem_size; -+ do { -+ cur = min(len, (unsigned long) REGION_SIZE); -+ i = setup_one_range(-1, NULL, -1, phys >> PAGE_SHIFT, cur, -+ NULL); -+ if(i == -1){ -+ printk("setup_highmem - setup_one_range failed\n"); -+ return; -+ } -+ region = regions[i]; -+ index = phys / PAGE_SIZE; -+ region->mem_map = &mem_map[index]; -+ -+ map = region->mem_map; -+ for(i = 0; i < (cur >> PAGE_SHIFT); i++){ -+ page = &map[i]; -+ ClearPageReserved(page); -+ set_bit(PG_highmem, &page->flags); -+ atomic_set(&page->count, 1); -+ __free_page(page); -+ } -+ phys += cur; -+ len -= cur; -+ } while(len > 0); -+} -+#endif -+ -+void paging_init(void) -+{ -+ struct mem_region *region; -+ unsigned long zones_size[MAX_NR_ZONES], start, end, vaddr; -+ int i, index; -+ -+ empty_zero_page = (unsigned long *) alloc_bootmem_low_pages(PAGE_SIZE); -+ empty_bad_page = (unsigned long *) alloc_bootmem_low_pages(PAGE_SIZE); -+ for(i=0;i<sizeof(zones_size)/sizeof(zones_size[0]);i++) -+ zones_size[i] = 0; -+ zones_size[0] = (high_physmem >> PAGE_SHIFT) - -+ (uml_physmem >> PAGE_SHIFT); -+ zones_size[2] = highmem >> PAGE_SHIFT; -+ free_area_init(zones_size); -+ start = phys_region_index(__pa(uml_physmem)); -+ end = phys_region_index(__pa(high_physmem - 1)); -+ for(i = start; i <= end; i++){ -+ region = regions[i]; -+ index = (region->start - uml_physmem) / PAGE_SIZE; -+ region->mem_map = &mem_map[index]; -+ if(i > start) free_bootmem(__pa(region->start), region->len); -+ } -+ -+ /* -+ * Fixed mappings, only the page table structure has to be -+ * created - mappings will be set by set_fixmap(): -+ */ -+ vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK; -+ fixrange_init(vaddr, FIXADDR_TOP, swapper_pg_dir); -+ -+#if CONFIG_HIGHMEM -+ init_highmem(); -+ setup_highmem(highmem); -+#endif -+} -+ -+/* Changed by meminfo_compat, which is a setup */ -+static int meminfo_22 = 0; -+ -+static int meminfo_compat(char *str) -+{ -+ meminfo_22 = 1; -+ return(1); -+} -+ -+__setup("22_meminfo", meminfo_compat); -+ -+void si_meminfo(struct sysinfo *val) -+{ -+ val->totalram = totalram_pages; -+ val->sharedram = 0; -+ val->freeram = nr_free_pages(); -+ val->bufferram = atomic_read(&buffermem_pages); -+ val->totalhigh = highmem >> PAGE_SHIFT; -+ val->freehigh = nr_free_highpages(); -+ val->mem_unit = PAGE_SIZE; -+ if(meminfo_22){ -+ val->freeram <<= PAGE_SHIFT; -+ val->bufferram <<= PAGE_SHIFT; -+ val->totalram <<= PAGE_SHIFT; -+ val->sharedram <<= PAGE_SHIFT; -+ } -+} -+ -+pte_t __bad_page(void) -+{ -+ clear_page(empty_bad_page); -+ return pte_mkdirty(mk_pte((struct page *) empty_bad_page, -+ PAGE_SHARED)); -+} -+ -+/* This can't do anything because nothing in the kernel image can be freed -+ * since it's not in kernel physical memory. -+ */ -+ -+void free_initmem(void) -+{ -+} -+ -+#ifdef CONFIG_BLK_DEV_INITRD -+ -+void free_initrd_mem(unsigned long start, unsigned long end) -+{ -+ if (start < end) -+ printk ("Freeing initrd memory: %ldk freed\n", -+ (end - start) >> 10); -+ for (; start < end; start += PAGE_SIZE) { -+ ClearPageReserved(virt_to_page(start)); -+ set_page_count(virt_to_page(start), 1); -+ free_page(start); -+ totalram_pages++; -+ } -+} -+ -+#endif -+ -+int do_check_pgt_cache(int low, int high) -+{ -+ int freed = 0; -+ if(pgtable_cache_size > high) { -+ do { -+ if (pgd_quicklist) { -+ free_pgd_slow(get_pgd_fast()); -+ freed++; -+ } -+ if (pmd_quicklist) { -+ pmd_free_slow(pmd_alloc_one_fast(NULL, 0)); -+ freed++; -+ } -+ if (pte_quicklist) { -+ pte_free_slow(pte_alloc_one_fast(NULL, 0)); -+ freed++; -+ } -+ } while(pgtable_cache_size > low); -+ } -+ return freed; -+} -+ -+void show_mem(void) -+{ -+ int i, total = 0, reserved = 0; -+ int shared = 0, cached = 0; -+ int highmem = 0; -+ -+ printk("Mem-info:\n"); -+ show_free_areas(); -+ printk("Free swap: %6dkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); -+ i = max_mapnr; -+ while(i-- > 0) { -+ total++; -+ if(PageHighMem(mem_map + i)) -+ highmem++; -+ if(PageReserved(mem_map + i)) -+ reserved++; -+ else if(PageSwapCache(mem_map + i)) -+ cached++; -+ else if(page_count(mem_map + i)) -+ shared += page_count(mem_map + i) - 1; -+ } -+ printk("%d pages of RAM\n", total); -+ printk("%d pages of HIGHMEM\n", highmem); -+ printk("%d reserved pages\n", reserved); -+ printk("%d pages shared\n", shared); -+ printk("%d pages swap cached\n", cached); -+ printk("%ld pages in page table cache\n", pgtable_cache_size); -+ show_buffers(); -+} -+ -+static int __init uml_mem_setup(char *line, int *add) -+{ -+ char *retptr; -+ physmem_size = memparse(line,&retptr); -+ return 0; -+} -+__uml_setup("mem=", uml_mem_setup, -+"mem=<Amount of desired ram>\n" -+" This controls how much \"physical\" memory the kernel allocates\n" -+" for the system. The size is specified as a number followed by\n" -+" one of 'k', 'K', 'm', 'M', which have the obvious meanings.\n" -+" This is not related to the amount of memory in the physical\n" -+" machine. It can be more, and the excess, if it's ever used, will\n" -+" just be swapped out.\n Example: mem=64M\n\n" -+); -+ -+struct page *arch_validate(struct page *page, int mask, int order) -+{ -+ unsigned long addr, zero = 0; -+ int i; -+ -+ again: -+ if(page == NULL) return(page); -+ if(PageHighMem(page)) return(page); -+ -+ addr = (unsigned long) page_address(page); -+ for(i = 0; i < (1 << order); i++){ -+ current->thread.fault_addr = (void *) addr; -+ if(__do_copy_to_user((void *) addr, &zero, -+ sizeof(zero), -+ ¤t->thread.fault_addr, -+ ¤t->thread.fault_catcher)){ -+ if(!(mask & __GFP_WAIT)) return(NULL); -+ else break; -+ } -+ addr += PAGE_SIZE; -+ } -+ if(i == (1 << order)) return(page); -+ page = _alloc_pages(mask, order); -+ goto again; -+} -+ -+DECLARE_MUTEX(vm_reserved_sem); -+static struct list_head vm_reserved = LIST_HEAD_INIT(vm_reserved); -+ -+/* Static structures, linked in to the list in early boot */ -+static struct vm_reserved head = { -+ .list = LIST_HEAD_INIT(head.list), -+ .start = 0, -+ .end = 0xffffffff -+}; -+ -+static struct vm_reserved tail = { -+ .list = LIST_HEAD_INIT(tail.list), -+ .start = 0, -+ .end = 0xffffffff -+}; -+ -+void set_usable_vm(unsigned long start, unsigned long end) -+{ -+ list_add(&head.list, &vm_reserved); -+ list_add(&tail.list, &head.list); -+ head.end = start; -+ tail.start = end; -+} -+ -+int reserve_vm(unsigned long start, unsigned long end, void *e) -+ -+{ -+ struct vm_reserved *entry = e, *reserved, *prev; -+ struct list_head *ele; -+ int err; -+ -+ down(&vm_reserved_sem); -+ list_for_each(ele, &vm_reserved){ -+ reserved = list_entry(ele, struct vm_reserved, list); -+ if(reserved->start >= end) goto found; -+ } -+ panic("Reserved vm out of range"); -+ found: -+ prev = list_entry(ele->prev, struct vm_reserved, list); -+ if(prev->end > start) -+ panic("Can't reserve vm"); -+ if(entry == NULL) -+ entry = kmalloc(sizeof(*entry), GFP_KERNEL); -+ if(entry == NULL){ -+ printk("reserve_vm : Failed to allocate entry\n"); -+ err = -ENOMEM; -+ goto out; -+ } -+ *entry = ((struct vm_reserved) -+ { .list = LIST_HEAD_INIT(entry->list), -+ .start = start, -+ .end = end }); -+ list_add(&entry->list, &prev->list); -+ err = 0; -+ out: -+ up(&vm_reserved_sem); -+ return(0); -+} -+ -+unsigned long get_vm(unsigned long len) -+{ -+ struct vm_reserved *this, *next; -+ struct list_head *ele; -+ unsigned long start; -+ int err; -+ -+ down(&vm_reserved_sem); -+ list_for_each(ele, &vm_reserved){ -+ this = list_entry(ele, struct vm_reserved, list); -+ next = list_entry(ele->next, struct vm_reserved, list); -+ if((this->start < next->start) && -+ (this->end + len + PAGE_SIZE <= next->start)) -+ goto found; -+ } -+ up(&vm_reserved_sem); -+ return(0); -+ found: -+ up(&vm_reserved_sem); -+ start = (unsigned long) UML_ROUND_UP(this->end) + PAGE_SIZE; -+ err = reserve_vm(start, start + len, NULL); -+ if(err) return(0); -+ return(start); -+} -+ -+int nregions(void) -+{ -+ return(NREGIONS); -+} -+ -+void setup_range(int fd, char *driver, unsigned long start, unsigned long pfn, -+ unsigned long len, int need_vm, struct mem_region *region, -+ void *reserved) -+{ -+ int i, cur; -+ -+ do { -+ cur = min(len, (unsigned long) REGION_SIZE); -+ i = setup_one_range(fd, driver, start, pfn, cur, region); -+ region = regions[i]; -+ if(need_vm && setup_region(region, reserved)){ -+ kfree(region); -+ regions[i] = NULL; -+ return; -+ } -+ start += cur; -+ if(pfn != -1) pfn += cur; -+ len -= cur; -+ } while(len > 0); -+} -+ -+struct iomem { -+ char *name; -+ int fd; -+ unsigned long size; -+}; -+ -+/* iomem regions can only be added on the command line at the moment. -+ * Locking will be needed when they can be added via mconsole. -+ */ -+ -+struct iomem iomem_regions[NREGIONS] = { [ 0 ... NREGIONS - 1 ] = -+ { .name = NULL, -+ .fd = -1, -+ .size = 0 } }; -+ -+int num_iomem_regions = 0; -+ -+void add_iomem(char *name, int fd, unsigned long size) -+{ -+ if(num_iomem_regions == sizeof(iomem_regions)/sizeof(iomem_regions[0])) -+ return; -+ size = (size + PAGE_SIZE - 1) & PAGE_MASK; -+ iomem_regions[num_iomem_regions++] = -+ ((struct iomem) { .name = name, -+ .fd = fd, -+ .size = size } ); -+} -+ -+int setup_iomem(void) -+{ -+ struct iomem *iomem; -+ int i; -+ -+ for(i = 0; i < num_iomem_regions; i++){ -+ iomem = &iomem_regions[i]; -+ setup_range(iomem->fd, iomem->name, -1, -1, iomem->size, 1, -+ NULL, NULL); -+ } -+ return(0); -+} -+ -+__initcall(setup_iomem); -+ -+#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) -+#define PFN_DOWN(x) ((x) >> PAGE_SHIFT) -+ -+/* Changed during early boot */ -+static struct mem_region physmem_region; -+static struct vm_reserved physmem_reserved; -+ -+void setup_physmem(unsigned long start, unsigned long reserve_end, -+ unsigned long len) -+{ -+ struct mem_region *region = &physmem_region; -+ struct vm_reserved *reserved = &physmem_reserved; -+ unsigned long cur, pfn = 0; -+ int do_free = 1, bootmap_size; -+ -+ do { -+ cur = min(len, (unsigned long) REGION_SIZE); -+ if(region == NULL) -+ region = alloc_bootmem_low_pages(sizeof(*region)); -+ if(reserved == NULL) -+ reserved = alloc_bootmem_low_pages(sizeof(*reserved)); -+ if((region == NULL) || (reserved == NULL)) -+ panic("Couldn't allocate physmem region or vm " -+ "reservation\n"); -+ setup_range(-1, NULL, start, pfn, cur, 1, region, reserved); -+ -+ if(do_free){ -+ unsigned long reserve = reserve_end - start; -+ int pfn = PFN_UP(__pa(reserve_end)); -+ int delta = (len - reserve) >> PAGE_SHIFT; -+ -+ bootmap_size = init_bootmem(pfn, pfn + delta); -+ free_bootmem(__pa(reserve_end) + bootmap_size, -+ cur - bootmap_size - reserve); -+ do_free = 0; -+ } -+ start += cur; -+ pfn += cur >> PAGE_SHIFT; -+ len -= cur; -+ region = NULL; -+ reserved = NULL; -+ } while(len > 0); -+} -+ -+struct mem_region *phys_region(unsigned long phys) -+{ -+ unsigned int n = phys_region_index(phys); -+ -+ if(regions[n] == NULL) -+ panic("Physical address in uninitialized region"); -+ return(regions[n]); -+} -+ -+unsigned long phys_offset(unsigned long phys) -+{ -+ return(phys_addr(phys)); -+} -+ -+struct page *phys_mem_map(unsigned long phys) -+{ -+ return((struct page *) phys_region(phys)->mem_map); -+} -+ -+struct page *pte_mem_map(pte_t pte) -+{ -+ return(phys_mem_map(pte_val(pte))); -+} -+ -+struct mem_region *page_region(struct page *page, int *index_out) -+{ -+ int i; -+ struct mem_region *region; -+ struct page *map; -+ -+ for(i = 0; i < NREGIONS; i++){ -+ region = regions[i]; -+ if(region == NULL) continue; -+ map = region->mem_map; -+ if((page >= map) && (page < &map[region->len >> PAGE_SHIFT])){ -+ if(index_out != NULL) *index_out = i; -+ return(region); -+ } -+ } -+ panic("No region found for page"); -+ return(NULL); -+} -+ -+unsigned long page_to_pfn(struct page *page) -+{ -+ struct mem_region *region = page_region(page, NULL); -+ -+ return(region->start_pfn + (page - (struct page *) region->mem_map)); -+} -+ -+struct mem_region *pfn_to_region(unsigned long pfn, int *index_out) -+{ -+ struct mem_region *region; -+ int i; -+ -+ for(i = 0; i < NREGIONS; i++){ -+ region = regions[i]; -+ if(region == NULL) -+ continue; -+ -+ if((region->start_pfn <= pfn) && -+ (region->start_pfn + (region->len >> PAGE_SHIFT) > pfn)){ -+ if(index_out != NULL) -+ *index_out = i; -+ return(region); -+ } -+ } -+ return(NULL); -+} -+ -+struct page *pfn_to_page(unsigned long pfn) -+{ -+ struct mem_region *region = pfn_to_region(pfn, NULL); -+ struct page *mem_map = (struct page *) region->mem_map; -+ -+ return(&mem_map[pfn - region->start_pfn]); -+} -+ -+unsigned long phys_to_pfn(unsigned long p) -+{ -+ struct mem_region *region = regions[phys_region_index(p)]; -+ -+ return(region->start_pfn + (phys_addr(p) >> PAGE_SHIFT)); -+} -+ -+unsigned long pfn_to_phys(unsigned long pfn) -+{ -+ int n; -+ struct mem_region *region = pfn_to_region(pfn, &n); -+ -+ return(mk_phys((pfn - region->start_pfn) << PAGE_SHIFT, n)); -+} -+ -+struct page *page_mem_map(struct page *page) -+{ -+ return((struct page *) page_region(page, NULL)->mem_map); -+} -+ -+extern unsigned long region_pa(void *virt) -+{ -+ struct mem_region *region; -+ unsigned long addr = (unsigned long) virt; -+ int i; -+ -+ for(i = 0; i < NREGIONS; i++){ -+ region = regions[i]; -+ if(region == NULL) continue; -+ if((region->start <= addr) && -+ (addr <= region->start + region->len)) -+ return(mk_phys(addr - region->start, i)); -+ } -+ panic("region_pa : no region for virtual address"); -+ return(0); -+} -+ -+extern void *region_va(unsigned long phys) -+{ -+ return((void *) (phys_region(phys)->start + phys_addr(phys))); -+} -+ -+unsigned long page_to_phys(struct page *page) -+{ -+ int n; -+ struct mem_region *region = page_region(page, &n); -+ struct page *map = region->mem_map; -+ return(mk_phys((page - map) << PAGE_SHIFT, n)); -+} -+ -+struct page *phys_to_page(unsigned long phys) -+{ -+ struct page *mem_map; -+ -+ mem_map = phys_mem_map(phys); -+ return(mem_map + (phys_offset(phys) >> PAGE_SHIFT)); -+} -+ -+static int setup_mem_maps(void) -+{ -+ struct mem_region *region; -+ int i; -+ -+ for(i = 0; i < NREGIONS; i++){ -+ region = regions[i]; -+ if((region != NULL) && (region->fd > 0)) init_maps(region); -+ } -+ return(0); -+} -+ -+__initcall(setup_mem_maps); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/mem_user.c um/arch/um/kernel/mem_user.c ---- orig/arch/um/kernel/mem_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/mem_user.c 2003-03-06 16:05:21.000000000 -0500 -@@ -0,0 +1,232 @@ -+/* -+ * arch/um/kernel/mem_user.c -+ * -+ * BRIEF MODULE DESCRIPTION -+ * user side memory routines for supporting IO memory inside user mode linux -+ * -+ * Copyright (C) 2001 RidgeRun, Inc. -+ * Author: RidgeRun, Inc. -+ * Greg Lonnon glonnon@ridgerun.com or info@ridgerun.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 of the License, or (at your -+ * option) any later version. -+ * -+ * THIS SOFTWARE IS PROVIDED ``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. -+ * -+ * 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 <stdio.h> -+#include <stdlib.h> -+#include <stddef.h> -+#include <stdarg.h> -+#include <unistd.h> -+#include <fcntl.h> -+#include <errno.h> -+#include <string.h> -+#include <sys/stat.h> -+#include <sys/types.h> -+#include <sys/mman.h> -+#include "kern_util.h" -+#include "user.h" -+#include "user_util.h" -+#include "mem_user.h" -+#include "init.h" -+#include "os.h" -+#include "tempfile.h" -+ -+extern struct mem_region physmem_region; -+ -+#define TEMPNAME_TEMPLATE "vm_file-XXXXXX" -+ -+int create_mem_file(unsigned long len) -+{ -+ int fd; -+ char zero; -+ -+ fd = make_tempfile(TEMPNAME_TEMPLATE, NULL, 1); -+ if (fchmod(fd, 0777) < 0){ -+ perror("fchmod"); -+ exit(1); -+ } -+ if(os_seek_file(fd, len) < 0){ -+ perror("lseek"); -+ exit(1); -+ } -+ zero = 0; -+ if(write(fd, &zero, 1) != 1){ -+ perror("write"); -+ exit(1); -+ } -+ if(fcntl(fd, F_SETFD, 1) != 0) -+ perror("Setting FD_CLOEXEC failed"); -+ return(fd); -+} -+ -+int setup_region(struct mem_region *region, void *entry) -+{ -+ void *loc, *start; -+ char *driver; -+ int err, offset; -+ -+ if(region->start != -1){ -+ err = reserve_vm(region->start, -+ region->start + region->len, entry); -+ if(err){ -+ printk("setup_region : failed to reserve " -+ "0x%x - 0x%x for driver '%s'\n", -+ region->start, -+ region->start + region->len, -+ region->driver); -+ return(-1); -+ } -+ } -+ else region->start = get_vm(region->len); -+ if(region->start == 0){ -+ if(region->driver == NULL) driver = "physmem"; -+ else driver = region->driver; -+ printk("setup_region : failed to find vm for " -+ "driver '%s' (length %d)\n", driver, region->len); -+ return(-1); -+ } -+ if(region->start == uml_physmem){ -+ start = (void *) uml_reserved; -+ offset = uml_reserved - uml_physmem; -+ } -+ else { -+ start = (void *) region->start; -+ offset = 0; -+ } -+ -+ loc = mmap(start, region->len - offset, PROT_READ | PROT_WRITE, -+ MAP_SHARED | MAP_FIXED, region->fd, offset); -+ if(loc != start){ -+ perror("Mapping memory"); -+ exit(1); -+ } -+ return(0); -+} -+ -+static int __init parse_iomem(char *str, int *add) -+{ -+ struct stat64 buf; -+ char *file, *driver; -+ int fd; -+ -+ driver = str; -+ file = strchr(str,','); -+ if(file == NULL){ -+ printf("parse_iomem : failed to parse iomem\n"); -+ return(1); -+ } -+ *file = '\0'; -+ file++; -+ fd = os_open_file(file, of_rdwr(OPENFLAGS()), 0); -+ if(fd < 0){ -+ printf("parse_iomem - Couldn't open io file, errno = %d\n", -+ errno); -+ return(1); -+ } -+ if(fstat64(fd, &buf) < 0) { -+ printf("parse_iomem - cannot fstat file, errno = %d\n", errno); -+ return(1); -+ } -+ add_iomem(driver, fd, buf.st_size); -+ return(0); -+} -+ -+__uml_setup("iomem=", parse_iomem, -+"iomem=<name>,<file>\n" -+" Configure <file> as an IO memory region named <name>.\n\n" -+); -+ -+#ifdef notdef -+int logging = 0; -+int logging_fd = -1; -+ -+int logging_line = 0; -+char logging_buf[256]; -+ -+void log(char *fmt, ...) -+{ -+ va_list ap; -+ struct timeval tv; -+ struct openflags flags; -+ -+ if(logging == 0) return; -+ if(logging_fd < 0){ -+ flags = of_create(of_trunc(of_rdrw(OPENFLAGS()))); -+ logging_fd = os_open_file("log", flags, 0644); -+ } -+ gettimeofday(&tv, NULL); -+ sprintf(logging_buf, "%d\t %u.%u ", logging_line++, tv.tv_sec, -+ tv.tv_usec); -+ va_start(ap, fmt); -+ vsprintf(&logging_buf[strlen(logging_buf)], fmt, ap); -+ va_end(ap); -+ write(logging_fd, logging_buf, strlen(logging_buf)); -+} -+#endif -+ -+int map_memory(unsigned long virt, unsigned long phys, unsigned long len, -+ int r, int w, int x) -+{ -+ struct mem_region *region = phys_region(phys); -+ -+ return(os_map_memory((void *) virt, region->fd, phys_offset(phys), len, -+ r, w, x)); -+} -+ -+int protect_memory(unsigned long addr, unsigned long len, int r, int w, int x, -+ int must_succeed) -+{ -+ if(os_protect_memory((void *) addr, len, r, w, x) < 0){ -+ if(must_succeed) -+ panic("protect failed, errno = %d", errno); -+ else return(-errno); -+ } -+ return(0); -+} -+ -+unsigned long find_iomem(char *driver, unsigned long *len_out) -+{ -+ struct mem_region *region; -+ int i, n; -+ -+ n = nregions(); -+ for(i = 0; i < n; i++){ -+ region = regions[i]; -+ if(region == NULL) continue; -+ if((region->driver != NULL) && -+ !strcmp(region->driver, driver)){ -+ *len_out = region->len; -+ return(region->start); -+ } -+ } -+ *len_out = 0; -+ return 0; -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/mprot.h um/arch/um/kernel/mprot.h ---- orig/arch/um/kernel/mprot.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/mprot.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,6 @@ -+#ifndef __MPROT_H__ -+#define __MPROT_H__ -+ -+extern void no_access(unsigned long addr, unsigned int len); -+ -+#endif -diff -Naur -X ../exclude-files orig/arch/um/kernel/process.c um/arch/um/kernel/process.c ---- orig/arch/um/kernel/process.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/process.c 2003-04-23 20:36:15.000000000 -0400 -@@ -0,0 +1,286 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <signal.h> -+#include <sched.h> -+#include <errno.h> -+#include <stdarg.h> -+#include <fcntl.h> -+#include <stdlib.h> -+#include <setjmp.h> -+#include <sys/time.h> -+#include <sys/ptrace.h> -+#include <sys/ioctl.h> -+#include <sys/wait.h> -+#include <sys/mman.h> -+#include <asm/ptrace.h> -+#include <asm/sigcontext.h> -+#include <asm/unistd.h> -+#include <asm/page.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "process.h" -+#include "signal_kern.h" -+#include "signal_user.h" -+#include "sysdep/ptrace.h" -+#include "sysdep/sigcontext.h" -+#include "irq_user.h" -+#include "ptrace_user.h" -+#include "time_user.h" -+#include "init.h" -+#include "os.h" -+#include "uml-config.h" -+#include "choose-mode.h" -+#include "mode.h" -+#ifdef UML_CONFIG_MODE_SKAS -+#include "skas.h" -+#include "skas_ptrace.h" -+#endif -+ -+void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int)) -+{ -+ int flags = 0, pages; -+ -+ if(sig_stack != NULL){ -+ pages = (1 << UML_CONFIG_KERNEL_STACK_ORDER) - 2; -+ set_sigstack(sig_stack, pages * page_size()); -+ flags = SA_ONSTACK; -+ } -+ if(usr1_handler) set_handler(SIGUSR1, usr1_handler, flags, -1); -+} -+ -+void init_new_thread_signals(int altstack) -+{ -+ int flags = altstack ? SA_ONSTACK : 0; -+ -+ set_handler(SIGSEGV, (__sighandler_t) sig_handler, flags, -+ SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); -+ set_handler(SIGTRAP, (__sighandler_t) sig_handler, flags, -+ SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); -+ set_handler(SIGFPE, (__sighandler_t) sig_handler, flags, -+ SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); -+ set_handler(SIGILL, (__sighandler_t) sig_handler, flags, -+ SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); -+ set_handler(SIGBUS, (__sighandler_t) sig_handler, flags, -+ SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); -+ set_handler(SIGWINCH, (__sighandler_t) sig_handler, flags, -+ SIGUSR1, SIGIO, SIGWINCH, SIGALRM, SIGVTALRM, -1); -+ set_handler(SIGUSR2, (__sighandler_t) sig_handler, -+ SA_NOMASK | flags, -1); -+ signal(SIGHUP, SIG_IGN); -+ -+ init_irq_signals(altstack); -+} -+ -+struct tramp { -+ int (*tramp)(void *); -+ void *tramp_data; -+ unsigned long temp_stack; -+ int flags; -+ int pid; -+}; -+ -+/* See above for why sigkill is here */ -+ -+int sigkill = SIGKILL; -+ -+int outer_tramp(void *arg) -+{ -+ struct tramp *t; -+ int sig = sigkill; -+ -+ t = arg; -+ t->pid = clone(t->tramp, (void *) t->temp_stack + page_size()/2, -+ t->flags, t->tramp_data); -+ if(t->pid > 0) wait_for_stop(t->pid, SIGSTOP, PTRACE_CONT, NULL); -+ kill(os_getpid(), sig); -+ _exit(0); -+} -+ -+int start_fork_tramp(void *thread_arg, unsigned long temp_stack, -+ int clone_flags, int (*tramp)(void *)) -+{ -+ struct tramp arg; -+ unsigned long sp; -+ int new_pid, status, err; -+ -+ /* The trampoline will run on the temporary stack */ -+ sp = stack_sp(temp_stack); -+ -+ clone_flags |= CLONE_FILES | SIGCHLD; -+ -+ arg.tramp = tramp; -+ arg.tramp_data = thread_arg; -+ arg.temp_stack = temp_stack; -+ arg.flags = clone_flags; -+ -+ /* Start the process and wait for it to kill itself */ -+ new_pid = clone(outer_tramp, (void *) sp, clone_flags, &arg); -+ if(new_pid < 0) return(-errno); -+ while((err = waitpid(new_pid, &status, 0) < 0) && (errno == EINTR)) ; -+ if(err < 0) panic("Waiting for outer trampoline failed - errno = %d", -+ errno); -+ if(!WIFSIGNALED(status) || (WTERMSIG(status) != SIGKILL)) -+ panic("outer trampoline didn't exit with SIGKILL"); -+ -+ return(arg.pid); -+} -+ -+void suspend_new_thread(int fd) -+{ -+ char c; -+ -+ os_stop_process(os_getpid()); -+ -+ if(read(fd, &c, sizeof(c)) != sizeof(c)) -+ panic("read failed in suspend_new_thread"); -+} -+ -+static int ptrace_child(void *arg) -+{ -+ int pid = os_getpid(); -+ -+ if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ -+ perror("ptrace"); -+ os_kill_process(pid, 0); -+ } -+ os_stop_process(pid); -+ _exit(os_getpid() == pid); -+} -+ -+static int start_ptraced_child(void **stack_out) -+{ -+ void *stack; -+ unsigned long sp; -+ int pid, n, status; -+ -+ stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -+ if(stack == MAP_FAILED) -+ panic("check_ptrace : mmap failed, errno = %d", errno); -+ sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); -+ pid = clone(ptrace_child, (void *) sp, SIGCHLD, NULL); -+ if(pid < 0) -+ panic("check_ptrace : clone failed, errno = %d", errno); -+ n = waitpid(pid, &status, WUNTRACED); -+ if(n < 0) -+ panic("check_ptrace : wait failed, errno = %d", errno); -+ if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP)) -+ panic("check_ptrace : expected SIGSTOP, got status = %d", -+ status); -+ -+ *stack_out = stack; -+ return(pid); -+} -+ -+static void stop_ptraced_child(int pid, void *stack, int exitcode) -+{ -+ int status, n; -+ -+ if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) -+ panic("check_ptrace : ptrace failed, errno = %d", errno); -+ n = waitpid(pid, &status, 0); -+ if(!WIFEXITED(status) || (WEXITSTATUS(status) != exitcode)) -+ panic("check_ptrace : child exited with status 0x%x", status); -+ -+ if(munmap(stack, PAGE_SIZE) < 0) -+ panic("check_ptrace : munmap failed, errno = %d", errno); -+} -+ -+void __init check_ptrace(void) -+{ -+ void *stack; -+ int pid, syscall, n, status; -+ -+ printk("Checking that ptrace can change system call numbers..."); -+ pid = start_ptraced_child(&stack); -+ -+ while(1){ -+ if(ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) -+ panic("check_ptrace : ptrace failed, errno = %d", -+ errno); -+ n = waitpid(pid, &status, WUNTRACED); -+ if(n < 0) -+ panic("check_ptrace : wait failed, errno = %d", errno); -+ if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP)) -+ panic("check_ptrace : expected SIGTRAP, " -+ "got status = %d", status); -+ -+ syscall = ptrace(PTRACE_PEEKUSER, pid, PT_SYSCALL_NR_OFFSET, -+ 0); -+ if(syscall == __NR_getpid){ -+ n = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, -+ __NR_getppid); -+ if(n < 0) -+ panic("check_ptrace : failed to modify system " -+ "call, errno = %d", errno); -+ break; -+ } -+ } -+ stop_ptraced_child(pid, stack, 0); -+ printk("OK\n"); -+} -+ -+int run_kernel_thread(int (*fn)(void *), void *arg, void **jmp_ptr) -+{ -+ jmp_buf buf; -+ int n; -+ -+ *jmp_ptr = &buf; -+ n = setjmp(buf); -+ if(n != 0) -+ return(n); -+ (*fn)(arg); -+ return(0); -+} -+ -+int can_do_skas(void) -+{ -+#ifdef UML_CONFIG_MODE_SKAS -+ struct ptrace_faultinfo fi; -+ void *stack; -+ int pid, n, ret = 1; -+ -+ printf("Checking for the skas3 patch in the host..."); -+ pid = start_ptraced_child(&stack); -+ -+ n = ptrace(PTRACE_FAULTINFO, pid, 0, &fi); -+ if(n < 0){ -+ if(errno == EIO) -+ printf("not found\n"); -+ else printf("No (unexpected errno - %d)\n", errno); -+ ret = 0; -+ } -+ else printf("found\n"); -+ -+ init_registers(pid); -+ stop_ptraced_child(pid, stack, 1); -+ -+ printf("Checking for /proc/mm..."); -+ if(access("/proc/mm", W_OK)){ -+ printf("not found\n"); -+ ret = 0; -+ } -+ else printf("found\n"); -+ -+ return(ret); -+#else -+ return(0); -+#endif -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/process_kern.c um/arch/um/kernel/process_kern.c ---- orig/arch/um/kernel/process_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/process_kern.c 2003-04-16 16:02:09.000000000 -0400 -@@ -0,0 +1,391 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/kernel.h" -+#include "linux/sched.h" -+#include "linux/interrupt.h" -+#include "linux/mm.h" -+#include "linux/slab.h" -+#include "linux/utsname.h" -+#include "linux/fs.h" -+#include "linux/utime.h" -+#include "linux/smp_lock.h" -+#include "linux/module.h" -+#include "linux/init.h" -+#include "linux/capability.h" -+#include "asm/unistd.h" -+#include "asm/mman.h" -+#include "asm/segment.h" -+#include "asm/stat.h" -+#include "asm/pgtable.h" -+#include "asm/processor.h" -+#include "asm/pgalloc.h" -+#include "asm/spinlock.h" -+#include "asm/uaccess.h" -+#include "asm/user.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "signal_kern.h" -+#include "signal_user.h" -+#include "init.h" -+#include "irq_user.h" -+#include "mem_user.h" -+#include "time_user.h" -+#include "tlb.h" -+#include "frame_kern.h" -+#include "sigcontext.h" -+#include "2_5compat.h" -+#include "os.h" -+#include "mode.h" -+#include "mode_kern.h" -+#include "choose-mode.h" -+ -+/* This is a per-cpu array. A processor only modifies its entry and it only -+ * cares about its entry, so it's OK if another processor is modifying its -+ * entry. -+ */ -+struct cpu_task cpu_tasks[NR_CPUS] = { [0 ... NR_CPUS - 1] = { -1, NULL } }; -+ -+struct task_struct *get_task(int pid, int require) -+{ -+ struct task_struct *ret; -+ -+ read_lock(&tasklist_lock); -+ ret = find_task_by_pid(pid); -+ read_unlock(&tasklist_lock); -+ -+ if(require && (ret == NULL)) panic("get_task couldn't find a task\n"); -+ return(ret); -+} -+ -+int external_pid(void *t) -+{ -+ struct task_struct *task = t ? t : current; -+ -+ return(CHOOSE_MODE_PROC(external_pid_tt, external_pid_skas, task)); -+} -+ -+int pid_to_processor_id(int pid) -+{ -+ int i; -+ -+ for(i = 0; i < smp_num_cpus; i++){ -+ if(cpu_tasks[i].pid == pid) return(i); -+ } -+ return(-1); -+} -+ -+void free_stack(unsigned long stack, int order) -+{ -+ free_pages(stack, order); -+} -+ -+unsigned long alloc_stack(int order, int atomic) -+{ -+ unsigned long page; -+ int flags = GFP_KERNEL; -+ -+ if(atomic) flags |= GFP_ATOMIC; -+ if((page = __get_free_pages(flags, order)) == 0) -+ return(0); -+ stack_protections(page); -+ return(page); -+} -+ -+int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags) -+{ -+ int pid; -+ -+ current->thread.request.u.thread.proc = fn; -+ current->thread.request.u.thread.arg = arg; -+ pid = do_fork(CLONE_VM | flags, 0, NULL, 0); -+ if(pid < 0) panic("do_fork failed in kernel_thread"); -+ return(pid); -+} -+ -+void switch_mm(struct mm_struct *prev, struct mm_struct *next, -+ struct task_struct *tsk, unsigned cpu) -+{ -+ if (prev != next) -+ clear_bit(cpu, &prev->cpu_vm_mask); -+ set_bit(cpu, &next->cpu_vm_mask); -+} -+ -+void set_current(void *t) -+{ -+ struct task_struct *task = t; -+ -+ cpu_tasks[task->processor] = ((struct cpu_task) -+ { external_pid(task), task }); -+} -+ -+void *_switch_to(void *prev, void *next) -+{ -+ return(CHOOSE_MODE(_switch_to_tt(prev, next), -+ _switch_to_skas(prev, next))); -+} -+ -+void interrupt_end(void) -+{ -+ if(current->need_resched) schedule(); -+ if(current->sigpending != 0) do_signal(0); -+} -+ -+void release_thread(struct task_struct *task) -+{ -+ CHOOSE_MODE(release_thread_tt(task), release_thread_skas(task)); -+} -+ -+void exit_thread(void) -+{ -+ CHOOSE_MODE(exit_thread_tt(), exit_thread_skas()); -+ unprotect_stack((unsigned long) current); -+} -+ -+void *get_current(void) -+{ -+ return(current); -+} -+ -+int copy_thread(int nr, unsigned long clone_flags, unsigned long sp, -+ unsigned long stack_top, struct task_struct * p, -+ struct pt_regs *regs) -+{ -+ p->thread = (struct thread_struct) INIT_THREAD; -+ p->thread.kernel_stack = (unsigned long) p + 2 * PAGE_SIZE; -+ -+ return(CHOOSE_MODE_PROC(copy_thread_tt, copy_thread_skas, nr, -+ clone_flags, sp, stack_top, p, regs)); -+} -+ -+void initial_thread_cb(void (*proc)(void *), void *arg) -+{ -+ int save_kmalloc_ok = kmalloc_ok; -+ -+ kmalloc_ok = 0; -+ CHOOSE_MODE_PROC(initial_thread_cb_tt, initial_thread_cb_skas, proc, -+ arg); -+ kmalloc_ok = save_kmalloc_ok; -+} -+ -+unsigned long stack_sp(unsigned long page) -+{ -+ return(page + PAGE_SIZE - sizeof(void *)); -+} -+ -+int current_pid(void) -+{ -+ return(current->pid); -+} -+ -+void cpu_idle(void) -+{ -+ CHOOSE_MODE(init_idle_tt(), init_idle_skas()); -+ -+ atomic_inc(&init_mm.mm_count); -+ current->mm = &init_mm; -+ current->active_mm = &init_mm; -+ -+ while(1){ -+ /* endless idle loop with no priority at all */ -+ SET_PRI(current); -+ -+ /* -+ * although we are an idle CPU, we do not want to -+ * get into the scheduler unnecessarily. -+ */ -+ if (current->need_resched) { -+ schedule(); -+ check_pgt_cache(); -+ } -+ idle_sleep(10); -+ } -+} -+ -+int page_size(void) -+{ -+ return(PAGE_SIZE); -+} -+ -+int page_mask(void) -+{ -+ return(PAGE_MASK); -+} -+ -+void *um_virt_to_phys(struct task_struct *task, unsigned long addr, -+ pte_t *pte_out) -+{ -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ -+ if(task->mm == NULL) -+ return(ERR_PTR(-EINVAL)); -+ pgd = pgd_offset(task->mm, addr); -+ pmd = pmd_offset(pgd, addr); -+ if(!pmd_present(*pmd)) -+ return(ERR_PTR(-EINVAL)); -+ pte = pte_offset(pmd, addr); -+ if(!pte_present(*pte)) -+ return(ERR_PTR(-EINVAL)); -+ if(pte_out != NULL) -+ *pte_out = *pte; -+ return((void *) (pte_val(*pte) & PAGE_MASK) + (addr & ~PAGE_MASK)); -+} -+ -+char *current_cmd(void) -+{ -+#if defined(CONFIG_SMP) || defined(CONFIG_HIGHMEM) -+ return("(Unknown)"); -+#else -+ void *addr = um_virt_to_phys(current, current->mm->arg_start, NULL); -+ return IS_ERR(addr) ? "(Unknown)": __va((unsigned long) addr); -+#endif -+} -+ -+void force_sigbus(void) -+{ -+ printk(KERN_ERR "Killing pid %d because of a lack of memory\n", -+ current->pid); -+ lock_kernel(); -+ sigaddset(¤t->pending.signal, SIGBUS); -+ recalc_sigpending(current); -+ current->flags |= PF_SIGNALED; -+ do_exit(SIGBUS | 0x80); -+} -+ -+void dump_thread(struct pt_regs *regs, struct user *u) -+{ -+} -+ -+void enable_hlt(void) -+{ -+ panic("enable_hlt"); -+} -+ -+void disable_hlt(void) -+{ -+ panic("disable_hlt"); -+} -+ -+extern int signal_frame_size; -+ -+void *um_kmalloc(int size) -+{ -+ return(kmalloc(size, GFP_KERNEL)); -+} -+ -+void *um_kmalloc_atomic(int size) -+{ -+ return(kmalloc(size, GFP_ATOMIC)); -+} -+ -+unsigned long get_fault_addr(void) -+{ -+ return((unsigned long) current->thread.fault_addr); -+} -+ -+EXPORT_SYMBOL(get_fault_addr); -+ -+void not_implemented(void) -+{ -+ printk(KERN_DEBUG "Something isn't implemented in here\n"); -+} -+ -+EXPORT_SYMBOL(not_implemented); -+ -+int user_context(unsigned long sp) -+{ -+ unsigned long stack; -+ -+ stack = sp & (PAGE_MASK << CONFIG_KERNEL_STACK_ORDER); -+ stack += 2 * PAGE_SIZE; -+ return(stack != current->thread.kernel_stack); -+} -+ -+extern void remove_umid_dir(void); -+ -+__uml_exitcall(remove_umid_dir); -+ -+extern exitcall_t __uml_exitcall_begin, __uml_exitcall_end; -+ -+void do_uml_exitcalls(void) -+{ -+ exitcall_t *call; -+ -+ call = &__uml_exitcall_end; -+ while (--call >= &__uml_exitcall_begin) -+ (*call)(); -+} -+ -+char *uml_strdup(char *string) -+{ -+ char *new; -+ -+ new = kmalloc(strlen(string) + 1, GFP_KERNEL); -+ if(new == NULL) return(NULL); -+ strcpy(new, string); -+ return(new); -+} -+ -+void *get_init_task(void) -+{ -+ return(&init_task_union.task); -+} -+ -+int copy_to_user_proc(void *to, void *from, int size) -+{ -+ return(copy_to_user(to, from, size)); -+} -+ -+int copy_from_user_proc(void *to, void *from, int size) -+{ -+ return(copy_from_user(to, from, size)); -+} -+ -+int clear_user_proc(void *buf, int size) -+{ -+ return(clear_user(buf, size)); -+} -+ -+int strlen_user_proc(char *str) -+{ -+ return(strlen_user(str)); -+} -+ -+int smp_sigio_handler(void) -+{ -+#ifdef CONFIG_SMP -+ int cpu = current->processor; -+ -+ IPI_handler(cpu); -+ if(cpu != 0) -+ return(1); -+#endif -+ return(0); -+} -+ -+int um_in_interrupt(void) -+{ -+ return(in_interrupt()); -+} -+ -+int cpu(void) -+{ -+ return(current->processor); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/ptrace.c um/arch/um/kernel/ptrace.c ---- orig/arch/um/kernel/ptrace.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/ptrace.c 2002-12-28 22:50:21.000000000 -0500 -@@ -0,0 +1,325 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sched.h" -+#include "linux/mm.h" -+#include "linux/errno.h" -+#include "linux/smp_lock.h" -+#ifdef CONFIG_PROC_MM -+#include "linux/proc_mm.h" -+#endif -+#include "asm/ptrace.h" -+#include "asm/uaccess.h" -+#include "kern_util.h" -+#include "ptrace_user.h" -+ -+/* -+ * Called by kernel/ptrace.c when detaching.. -+ */ -+void ptrace_disable(struct task_struct *child) -+{ -+} -+ -+extern long do_mmap2(struct task_struct *task, unsigned long addr, -+ unsigned long len, unsigned long prot, -+ unsigned long flags, unsigned long fd, -+ unsigned long pgoff); -+ -+int sys_ptrace(long request, long pid, long addr, long data) -+{ -+ struct task_struct *child; -+ int i, ret; -+ -+ lock_kernel(); -+ ret = -EPERM; -+ if (request == PTRACE_TRACEME) { -+ /* are we already being traced? */ -+ if (current->ptrace & PT_PTRACED) -+ goto out; -+ /* set the ptrace bit in the process flags. */ -+ current->ptrace |= PT_PTRACED; -+ ret = 0; -+ goto out; -+ } -+ ret = -ESRCH; -+ read_lock(&tasklist_lock); -+ child = find_task_by_pid(pid); -+ if (child) -+ get_task_struct(child); -+ read_unlock(&tasklist_lock); -+ if (!child) -+ goto out; -+ -+ ret = -EPERM; -+ if (pid == 1) /* you may not mess with init */ -+ goto out_tsk; -+ -+ if (request == PTRACE_ATTACH) { -+ ret = ptrace_attach(child); -+ goto out_tsk; -+ } -+ -+ ret = ptrace_check_attach(child, request == PTRACE_KILL); -+ if (ret < 0) -+ goto out_tsk; -+ -+ switch (request) { -+ /* when I and D space are separate, these will need to be fixed. */ -+ case PTRACE_PEEKTEXT: /* read word at location addr. */ -+ case PTRACE_PEEKDATA: { -+ unsigned long tmp; -+ int copied; -+ -+ ret = -EIO; -+ copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0); -+ if (copied != sizeof(tmp)) -+ break; -+ ret = put_user(tmp,(unsigned long *) data); -+ break; -+ } -+ -+ /* read the word at location addr in the USER area. */ -+ case PTRACE_PEEKUSR: { -+ unsigned long tmp; -+ -+ ret = -EIO; -+ if ((addr & 3) || addr < 0) -+ break; -+ -+ tmp = 0; /* Default return condition */ -+ if(addr < FRAME_SIZE_OFFSET){ -+ tmp = getreg(child, addr); -+ } -+ else if((addr >= offsetof(struct user, u_debugreg[0])) && -+ (addr <= offsetof(struct user, u_debugreg[7]))){ -+ addr -= offsetof(struct user, u_debugreg[0]); -+ addr = addr >> 2; -+ tmp = child->thread.arch.debugregs[addr]; -+ } -+ ret = put_user(tmp, (unsigned long *) data); -+ break; -+ } -+ -+ /* when I and D space are separate, this will have to be fixed. */ -+ case PTRACE_POKETEXT: /* write the word at location addr. */ -+ case PTRACE_POKEDATA: -+ ret = -EIO; -+ if (access_process_vm(child, addr, &data, sizeof(data), -+ 1) != sizeof(data)) -+ break; -+ ret = 0; -+ break; -+ -+ case PTRACE_POKEUSR: /* write the word at location addr in the USER area */ -+ ret = -EIO; -+ if ((addr & 3) || addr < 0) -+ break; -+ -+ if (addr < FRAME_SIZE_OFFSET) { -+ ret = putreg(child, addr, data); -+ break; -+ } -+ else if((addr >= offsetof(struct user, u_debugreg[0])) && -+ (addr <= offsetof(struct user, u_debugreg[7]))){ -+ addr -= offsetof(struct user, u_debugreg[0]); -+ addr = addr >> 2; -+ if((addr == 4) || (addr == 5)) break; -+ child->thread.arch.debugregs[addr] = data; -+ ret = 0; -+ } -+ -+ break; -+ -+ case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */ -+ case PTRACE_CONT: { /* restart after signal. */ -+ ret = -EIO; -+ if ((unsigned long) data > _NSIG) -+ break; -+ if (request == PTRACE_SYSCALL) -+ child->ptrace |= PT_TRACESYS; -+ else -+ child->ptrace &= ~PT_TRACESYS; -+ child->exit_code = data; -+ wake_up_process(child); -+ ret = 0; -+ break; -+ } -+ -+/* -+ * make the child exit. Best I can do is send it a sigkill. -+ * perhaps it should be put in the status that it wants to -+ * exit. -+ */ -+ case PTRACE_KILL: { -+ ret = 0; -+ if (child->state == TASK_ZOMBIE) /* already dead */ -+ break; -+ child->exit_code = SIGKILL; -+ wake_up_process(child); -+ break; -+ } -+ -+ case PTRACE_SINGLESTEP: { /* set the trap flag. */ -+ ret = -EIO; -+ if ((unsigned long) data > _NSIG) -+ break; -+ child->ptrace &= ~PT_TRACESYS; -+ child->ptrace |= PT_DTRACE; -+ child->exit_code = data; -+ /* give it a chance to run. */ -+ wake_up_process(child); -+ ret = 0; -+ break; -+ } -+ -+ case PTRACE_DETACH: -+ /* detach a process that was attached. */ -+ ret = ptrace_detach(child, data); -+ break; -+ -+#ifdef PTRACE_GETREGS -+ case PTRACE_GETREGS: { /* Get all gp regs from the child. */ -+ if (!access_ok(VERIFY_WRITE, (unsigned long *)data, -+ FRAME_SIZE_OFFSET)) { -+ ret = -EIO; -+ break; -+ } -+ for ( i = 0; i < FRAME_SIZE_OFFSET; i += sizeof(long) ) { -+ __put_user(getreg(child, i), (unsigned long *) data); -+ data += sizeof(long); -+ } -+ ret = 0; -+ break; -+ } -+#endif -+#ifdef PTRACE_SETREGS -+ case PTRACE_SETREGS: { /* Set all gp regs in the child. */ -+ unsigned long tmp = 0; -+ if (!access_ok(VERIFY_READ, (unsigned *)data, -+ FRAME_SIZE_OFFSET)) { -+ ret = -EIO; -+ break; -+ } -+ for ( i = 0; i < FRAME_SIZE_OFFSET; i += sizeof(long) ) { -+ __get_user(tmp, (unsigned long *) data); -+ putreg(child, i, tmp); -+ data += sizeof(long); -+ } -+ ret = 0; -+ break; -+ } -+#endif -+#ifdef PTRACE_GETFPREGS -+ case PTRACE_GETFPREGS: /* Get the child FPU state. */ -+ ret = get_fpregs(data, child); -+ break; -+#endif -+#ifdef PTRACE_SETFPREGS -+ case PTRACE_SETFPREGS: /* Set the child FPU state. */ -+ ret = set_fpregs(data, child); -+ break; -+#endif -+#ifdef PTRACE_GETFPXREGS -+ case PTRACE_GETFPXREGS: /* Get the child FPU state. */ -+ ret = get_fpxregs(data, child); -+ break; -+#endif -+#ifdef PTRACE_SETFPXREGS -+ case PTRACE_SETFPXREGS: /* Set the child FPU state. */ -+ ret = set_fpxregs(data, child); -+ break; -+#endif -+ case PTRACE_FAULTINFO: { -+ struct ptrace_faultinfo fault; -+ -+ fault = ((struct ptrace_faultinfo) -+ { .is_write = child->thread.err, -+ .addr = child->thread.cr2 }); -+ ret = copy_to_user((unsigned long *) data, &fault, -+ sizeof(fault)); -+ if(ret) -+ break; -+ break; -+ } -+ case PTRACE_SIGPENDING: -+ ret = copy_to_user((unsigned long *) data, -+ &child->pending.signal, -+ sizeof(child->pending.signal)); -+ break; -+ -+ case PTRACE_LDT: { -+ struct ptrace_ldt ldt; -+ -+ if(copy_from_user(&ldt, (unsigned long *) data, -+ sizeof(ldt))){ -+ ret = -EIO; -+ break; -+ } -+ -+ /* This one is confusing, so just punt and return -EIO for -+ * now -+ */ -+ ret = -EIO; -+ break; -+ } -+#ifdef CONFIG_PROC_MM -+ case PTRACE_SWITCH_MM: { -+ struct mm_struct *old = child->mm; -+ struct mm_struct *new = proc_mm_get_mm(data); -+ -+ if(IS_ERR(new)){ -+ ret = PTR_ERR(new); -+ break; -+ } -+ -+ atomic_inc(&new->mm_users); -+ child->mm = new; -+ child->active_mm = new; -+ mmput(old); -+ ret = 0; -+ break; -+ } -+#endif -+ default: -+ ret = -EIO; -+ break; -+ } -+ out_tsk: -+ free_task_struct(child); -+ out: -+ unlock_kernel(); -+ return ret; -+} -+ -+void syscall_trace(void) -+{ -+ if ((current->ptrace & (PT_PTRACED|PT_TRACESYS)) -+ != (PT_PTRACED|PT_TRACESYS)) -+ return; -+ current->exit_code = SIGTRAP; -+ current->state = TASK_STOPPED; -+ notify_parent(current, SIGCHLD); -+ schedule(); -+ /* -+ * this isn't the same as continuing with a signal, but it will do -+ * for normal use. strace only continues with a signal if the -+ * stopping signal is not SIGTRAP. -brl -+ */ -+ if (current->exit_code) { -+ send_sig(current->exit_code, current, 1); -+ current->exit_code = 0; -+ } -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/reboot.c um/arch/um/kernel/reboot.c ---- orig/arch/um/kernel/reboot.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/reboot.c 2002-12-30 20:57:42.000000000 -0500 -@@ -0,0 +1,71 @@ -+/* -+ * Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sched.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "os.h" -+#include "mode.h" -+#include "choose-mode.h" -+ -+#ifdef CONFIG_SMP -+static void kill_idlers(int me) -+{ -+ struct task_struct *p; -+ int i; -+ -+ for(i = 0; i < sizeof(init_tasks)/sizeof(init_tasks[0]); i++){ -+ p = init_tasks[i]; -+ if((p != NULL) && (p->thread.mode.tt.extern_pid != me) && -+ (p->thread.mode.tt.extern_pid != -1)) -+ os_kill_process(p->thread.mode.tt.extern_pid, 0); -+ } -+} -+#endif -+ -+static void kill_off_processes(void) -+{ -+ CHOOSE_MODE(kill_off_processes_tt(), kill_off_processes_skas()); -+#ifdef CONFIG_SMP -+ kill_idlers(os_getpid()); -+#endif -+} -+ -+void uml_cleanup(void) -+{ -+ kill_off_processes(); -+ do_uml_exitcalls(); -+} -+ -+void machine_restart(char * __unused) -+{ -+ do_uml_exitcalls(); -+ kill_off_processes(); -+ CHOOSE_MODE(reboot_tt(), reboot_skas()); -+} -+ -+void machine_power_off(void) -+{ -+ do_uml_exitcalls(); -+ kill_off_processes(); -+ CHOOSE_MODE(halt_tt(), halt_skas()); -+} -+ -+void machine_halt(void) -+{ -+ machine_power_off(); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/resource.c um/arch/um/kernel/resource.c ---- orig/arch/um/kernel/resource.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/resource.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,23 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/pci.h" -+ -+unsigned long resource_fixup(struct pci_dev * dev, struct resource * res, -+ unsigned long start, unsigned long size) -+{ -+ return start; -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/sigio_kern.c um/arch/um/kernel/sigio_kern.c ---- orig/arch/um/kernel/sigio_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/sigio_kern.c 2003-05-11 18:34:01.000000000 -0400 -@@ -0,0 +1,57 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/kernel.h" -+#include "linux/list.h" -+#include "linux/slab.h" -+#include "asm/irq.h" -+#include "init.h" -+#include "sigio.h" -+#include "irq_user.h" -+#include "irq_kern.h" -+ -+/* Protected by sigio_lock() called from write_sigio_workaround */ -+static int sigio_irq_fd = -1; -+ -+void sigio_interrupt(int irq, void *data, struct pt_regs *unused) -+{ -+ read_sigio_fd(sigio_irq_fd); -+ reactivate_fd(sigio_irq_fd, SIGIO_WRITE_IRQ); -+} -+ -+int write_sigio_irq(int fd) -+{ -+ if(um_request_irq(SIGIO_WRITE_IRQ, fd, IRQ_READ, sigio_interrupt, -+ SA_INTERRUPT | SA_SAMPLE_RANDOM, "write sigio", -+ NULL)){ -+ printk("write_sigio_irq : um_request_irq failed\n"); -+ return(-1); -+ } -+ sigio_irq_fd = fd; -+ return(0); -+} -+ -+static spinlock_t sigio_spinlock = SPIN_LOCK_UNLOCKED; -+ -+void sigio_lock(void) -+{ -+ spin_lock(&sigio_spinlock); -+} -+ -+void sigio_unlock(void) -+{ -+ spin_unlock(&sigio_spinlock); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/sigio_user.c um/arch/um/kernel/sigio_user.c ---- orig/arch/um/kernel/sigio_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/sigio_user.c 2002-12-29 23:36:35.000000000 -0500 -@@ -0,0 +1,440 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <unistd.h> -+#include <stdlib.h> -+#include <termios.h> -+#include <pty.h> -+#include <fcntl.h> -+#include <signal.h> -+#include <errno.h> -+#include <string.h> -+#include <sched.h> -+#include <sys/socket.h> -+#include <sys/poll.h> -+#include "init.h" -+#include "user.h" -+#include "kern_util.h" -+#include "sigio.h" -+#include "helper.h" -+#include "os.h" -+ -+/* Changed during early boot */ -+int pty_output_sigio = 0; -+int pty_close_sigio = 0; -+ -+/* Used as a flag during SIGIO testing early in boot */ -+static int got_sigio = 0; -+ -+void __init handler(int sig) -+{ -+ got_sigio = 1; -+} -+ -+struct openpty_arg { -+ int master; -+ int slave; -+ int err; -+}; -+ -+static void openpty_cb(void *arg) -+{ -+ struct openpty_arg *info = arg; -+ -+ info->err = 0; -+ if(openpty(&info->master, &info->slave, NULL, NULL, NULL)) -+ info->err = errno; -+} -+ -+void __init check_one_sigio(void (*proc)(int, int)) -+{ -+ struct sigaction old, new; -+ struct termios tt; -+ struct openpty_arg pty = { .master = -1, .slave = -1 }; -+ int master, slave, flags; -+ -+ initial_thread_cb(openpty_cb, &pty); -+ if(pty.err){ -+ printk("openpty failed, errno = %d\n", pty.err); -+ return; -+ } -+ -+ master = pty.master; -+ slave = pty.slave; -+ -+ if((master == -1) || (slave == -1)){ -+ printk("openpty failed to allocate a pty\n"); -+ return; -+ } -+ -+ if(tcgetattr(master, &tt) < 0) -+ panic("check_sigio : tcgetattr failed, errno = %d\n", errno); -+ cfmakeraw(&tt); -+ if(tcsetattr(master, TCSADRAIN, &tt) < 0) -+ panic("check_sigio : tcsetattr failed, errno = %d\n", errno); -+ -+ if((flags = fcntl(master, F_GETFL)) < 0) -+ panic("tty_fds : fcntl F_GETFL failed, errno = %d\n", errno); -+ -+ if((fcntl(master, F_SETFL, flags | O_NONBLOCK | O_ASYNC) < 0) || -+ (fcntl(master, F_SETOWN, os_getpid()) < 0)) -+ panic("check_sigio : fcntl F_SETFL or F_SETOWN failed, " -+ "errno = %d\n", errno); -+ -+ if((fcntl(slave, F_SETFL, flags | O_NONBLOCK) < 0)) -+ panic("check_sigio : fcntl F_SETFL failed, errno = %d\n", -+ errno); -+ -+ if(sigaction(SIGIO, NULL, &old) < 0) -+ panic("check_sigio : sigaction 1 failed, errno = %d\n", errno); -+ new = old; -+ new.sa_handler = handler; -+ if(sigaction(SIGIO, &new, NULL) < 0) -+ panic("check_sigio : sigaction 2 failed, errno = %d\n", errno); -+ -+ got_sigio = 0; -+ (*proc)(master, slave); -+ -+ close(master); -+ close(slave); -+ -+ if(sigaction(SIGIO, &old, NULL) < 0) -+ panic("check_sigio : sigaction 3 failed, errno = %d\n", errno); -+} -+ -+static void tty_output(int master, int slave) -+{ -+ int n; -+ char buf[512]; -+ -+ printk("Checking that host ptys support output SIGIO..."); -+ -+ memset(buf, 0, sizeof(buf)); -+ while(write(master, buf, sizeof(buf)) > 0) ; -+ if(errno != EAGAIN) -+ panic("check_sigio : write failed, errno = %d\n", errno); -+ -+ while(((n = read(slave, buf, sizeof(buf))) > 0) && !got_sigio) ; -+ -+ if(got_sigio){ -+ printk("Yes\n"); -+ pty_output_sigio = 1; -+ } -+ else if(errno == EAGAIN) printk("No, enabling workaround\n"); -+ else panic("check_sigio : read failed, errno = %d\n", errno); -+} -+ -+static void tty_close(int master, int slave) -+{ -+ printk("Checking that host ptys support SIGIO on close..."); -+ -+ close(slave); -+ if(got_sigio){ -+ printk("Yes\n"); -+ pty_close_sigio = 1; -+ } -+ else printk("No, enabling workaround\n"); -+} -+ -+void __init check_sigio(void) -+{ -+ if(access("/dev/ptmx", R_OK) && access("/dev/ptyp0", R_OK)){ -+ printk("No pseudo-terminals available - skipping pty SIGIO " -+ "check\n"); -+ return; -+ } -+ check_one_sigio(tty_output); -+ check_one_sigio(tty_close); -+} -+ -+/* Protected by sigio_lock(), also used by sigio_cleanup, which is an -+ * exitcall. -+ */ -+static int write_sigio_pid = -1; -+ -+/* These arrays are initialized before the sigio thread is started, and -+ * the descriptors closed after it is killed. So, it can't see them change. -+ * On the UML side, they are changed under the sigio_lock. -+ */ -+static int write_sigio_fds[2] = { -1, -1 }; -+static int sigio_private[2] = { -1, -1 }; -+ -+struct pollfds { -+ struct pollfd *poll; -+ int size; -+ int used; -+}; -+ -+/* Protected by sigio_lock(). Used by the sigio thread, but the UML thread -+ * synchronizes with it. -+ */ -+struct pollfds current_poll = { -+ .poll = NULL, -+ .size = 0, -+ .used = 0 -+}; -+ -+struct pollfds next_poll = { -+ .poll = NULL, -+ .size = 0, -+ .used = 0 -+}; -+ -+static int write_sigio_thread(void *unused) -+{ -+ struct pollfds *fds, tmp; -+ struct pollfd *p; -+ int i, n, respond_fd; -+ char c; -+ -+ fds = ¤t_poll; -+ while(1){ -+ n = poll(fds->poll, fds->used, -1); -+ if(n < 0){ -+ if(errno == EINTR) continue; -+ printk("write_sigio_thread : poll returned %d, " -+ "errno = %d\n", n, errno); -+ } -+ for(i = 0; i < fds->used; i++){ -+ p = &fds->poll[i]; -+ if(p->revents == 0) continue; -+ if(p->fd == sigio_private[1]){ -+ n = read(sigio_private[1], &c, sizeof(c)); -+ if(n != sizeof(c)) -+ printk("write_sigio_thread : " -+ "read failed, errno = %d\n", -+ errno); -+ tmp = current_poll; -+ current_poll = next_poll; -+ next_poll = tmp; -+ respond_fd = sigio_private[1]; -+ } -+ else { -+ respond_fd = write_sigio_fds[1]; -+ fds->used--; -+ memmove(&fds->poll[i], &fds->poll[i + 1], -+ (fds->used - i) * sizeof(*fds->poll)); -+ } -+ -+ n = write(respond_fd, &c, sizeof(c)); -+ if(n != sizeof(c)) -+ printk("write_sigio_thread : write failed, " -+ "errno = %d\n", errno); -+ } -+ } -+} -+ -+static int need_poll(int n) -+{ -+ if(n <= next_poll.size){ -+ next_poll.used = n; -+ return(0); -+ } -+ if(next_poll.poll != NULL) kfree(next_poll.poll); -+ next_poll.poll = um_kmalloc_atomic(n * sizeof(struct pollfd)); -+ if(next_poll.poll == NULL){ -+ printk("need_poll : failed to allocate new pollfds\n"); -+ next_poll.size = 0; -+ next_poll.used = 0; -+ return(-1); -+ } -+ next_poll.size = n; -+ next_poll.used = n; -+ return(0); -+} -+ -+static void update_thread(void) -+{ -+ unsigned long flags; -+ int n; -+ char c; -+ -+ flags = set_signals(0); -+ n = write(sigio_private[0], &c, sizeof(c)); -+ if(n != sizeof(c)){ -+ printk("update_thread : write failed, errno = %d\n", errno); -+ goto fail; -+ } -+ -+ n = read(sigio_private[0], &c, sizeof(c)); -+ if(n != sizeof(c)){ -+ printk("update_thread : read failed, errno = %d\n", errno); -+ goto fail; -+ } -+ -+ set_signals(flags); -+ return; -+ fail: -+ sigio_lock(); -+ if(write_sigio_pid != -1) -+ os_kill_process(write_sigio_pid, 1); -+ write_sigio_pid = -1; -+ close(sigio_private[0]); -+ close(sigio_private[1]); -+ close(write_sigio_fds[0]); -+ close(write_sigio_fds[1]); -+ sigio_unlock(); -+ set_signals(flags); -+} -+ -+int add_sigio_fd(int fd, int read) -+{ -+ int err = 0, i, n, events; -+ -+ sigio_lock(); -+ for(i = 0; i < current_poll.used; i++){ -+ if(current_poll.poll[i].fd == fd) -+ goto out; -+ } -+ -+ n = current_poll.used + 1; -+ err = need_poll(n); -+ if(err) -+ goto out; -+ -+ for(i = 0; i < current_poll.used; i++) -+ next_poll.poll[i] = current_poll.poll[i]; -+ -+ if(read) events = POLLIN; -+ else events = POLLOUT; -+ -+ next_poll.poll[n - 1] = ((struct pollfd) { .fd = fd, -+ .events = events, -+ .revents = 0 }); -+ update_thread(); -+ out: -+ sigio_unlock(); -+ return(err); -+} -+ -+int ignore_sigio_fd(int fd) -+{ -+ struct pollfd *p; -+ int err = 0, i, n = 0; -+ -+ sigio_lock(); -+ for(i = 0; i < current_poll.used; i++){ -+ if(current_poll.poll[i].fd == fd) break; -+ } -+ if(i == current_poll.used) -+ goto out; -+ -+ err = need_poll(current_poll.used - 1); -+ if(err) -+ goto out; -+ -+ for(i = 0; i < current_poll.used; i++){ -+ p = ¤t_poll.poll[i]; -+ if(p->fd != fd) next_poll.poll[n++] = current_poll.poll[i]; -+ } -+ if(n == i){ -+ printk("ignore_sigio_fd : fd %d not found\n", fd); -+ err = -1; -+ goto out; -+ } -+ -+ update_thread(); -+ out: -+ sigio_unlock(); -+ return(err); -+} -+ -+static int setup_initial_poll(int fd) -+{ -+ struct pollfd *p; -+ -+ p = um_kmalloc(sizeof(struct pollfd)); -+ if(p == NULL){ -+ printk("setup_initial_poll : failed to allocate poll\n"); -+ return(-1); -+ } -+ *p = ((struct pollfd) { .fd = fd, -+ .events = POLLIN, -+ .revents = 0 }); -+ current_poll = ((struct pollfds) { .poll = p, -+ .used = 1, -+ .size = 1 }); -+ return(0); -+} -+ -+void write_sigio_workaround(void) -+{ -+ unsigned long stack; -+ int err; -+ -+ sigio_lock(); -+ if(write_sigio_pid != -1) -+ goto out; -+ -+ err = os_pipe(write_sigio_fds, 1, 1); -+ if(err){ -+ printk("write_sigio_workaround - os_pipe 1 failed, " -+ "errno = %d\n", -err); -+ goto out; -+ } -+ err = os_pipe(sigio_private, 1, 1); -+ if(err){ -+ printk("write_sigio_workaround - os_pipe 2 failed, " -+ "errno = %d\n", -err); -+ goto out_close1; -+ } -+ if(setup_initial_poll(sigio_private[1])) -+ goto out_close2; -+ -+ write_sigio_pid = run_helper_thread(write_sigio_thread, NULL, -+ CLONE_FILES | CLONE_VM, &stack, 0); -+ -+ if(write_sigio_pid < 0) goto out_close2; -+ -+ if(write_sigio_irq(write_sigio_fds[0])) -+ goto out_kill; -+ -+ out: -+ sigio_unlock(); -+ return; -+ -+ out_kill: -+ os_kill_process(write_sigio_pid, 1); -+ write_sigio_pid = -1; -+ out_close2: -+ close(sigio_private[0]); -+ close(sigio_private[1]); -+ out_close1: -+ close(write_sigio_fds[0]); -+ close(write_sigio_fds[1]); -+ sigio_unlock(); -+} -+ -+int read_sigio_fd(int fd) -+{ -+ int n; -+ char c; -+ -+ n = read(fd, &c, sizeof(c)); -+ if(n != sizeof(c)){ -+ printk("read_sigio_fd - read failed, errno = %d\n", errno); -+ return(-errno); -+ } -+ return(n); -+} -+ -+static void sigio_cleanup(void) -+{ -+ if(write_sigio_pid != -1) -+ os_kill_process(write_sigio_pid, 1); -+} -+ -+__uml_exitcall(sigio_cleanup); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/signal_kern.c um/arch/um/kernel/signal_kern.c ---- orig/arch/um/kernel/signal_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/signal_kern.c 2002-12-08 19:44:13.000000000 -0500 -@@ -0,0 +1,367 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/stddef.h" -+#include "linux/sys.h" -+#include "linux/sched.h" -+#include "linux/wait.h" -+#include "linux/kernel.h" -+#include "linux/smp_lock.h" -+#include "linux/module.h" -+#include "linux/slab.h" -+#include "asm/signal.h" -+#include "asm/uaccess.h" -+#include "asm/ucontext.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "signal_kern.h" -+#include "signal_user.h" -+#include "kern.h" -+#include "frame_kern.h" -+#include "sigcontext.h" -+#include "mode.h" -+ -+EXPORT_SYMBOL(block_signals); -+EXPORT_SYMBOL(unblock_signals); -+ -+static void force_segv(int sig) -+{ -+ if(sig == SIGSEGV){ -+ struct k_sigaction *ka; -+ -+ ka = ¤t->sig->action[SIGSEGV - 1]; -+ ka->sa.sa_handler = SIG_DFL; -+ } -+ force_sig(SIGSEGV, current); -+} -+ -+#define _S(nr) (1<<((nr)-1)) -+ -+#define _BLOCKABLE (~(_S(SIGKILL) | _S(SIGSTOP))) -+ -+/* -+ * OK, we're invoking a handler -+ */ -+static int handle_signal(struct pt_regs *regs, unsigned long signr, -+ struct k_sigaction *ka, siginfo_t *info, -+ sigset_t *oldset, int error) -+{ -+ __sighandler_t handler; -+ void (*restorer)(void); -+ unsigned long sp; -+ sigset_t save; -+ int err, ret; -+ -+ ret = 0; -+ switch(error){ -+ case -ERESTARTNOHAND: -+ ret = -EINTR; -+ break; -+ -+ case -ERESTARTSYS: -+ if (!(ka->sa.sa_flags & SA_RESTART)) { -+ ret = -EINTR; -+ break; -+ } -+ /* fallthrough */ -+ case -ERESTARTNOINTR: -+ PT_REGS_RESTART_SYSCALL(regs); -+ PT_REGS_ORIG_SYSCALL(regs) = PT_REGS_SYSCALL_NR(regs); -+ -+ /* This is because of the UM_SET_SYSCALL_RETURN and the fact -+ * that on i386 the system call number and return value are -+ * in the same register. When the system call restarts, %eax -+ * had better have the system call number in it. Since the -+ * return value doesn't matter (except that it shouldn't be -+ * -ERESTART*), we'll stick the system call number there. -+ */ -+ ret = PT_REGS_SYSCALL_NR(regs); -+ break; -+ } -+ -+ handler = ka->sa.sa_handler; -+ save = *oldset; -+ -+ if (ka->sa.sa_flags & SA_ONESHOT) -+ ka->sa.sa_handler = SIG_DFL; -+ -+ if (!(ka->sa.sa_flags & SA_NODEFER)) { -+ spin_lock_irq(¤t->sigmask_lock); -+ sigorsets(¤t->blocked, ¤t->blocked, -+ &ka->sa.sa_mask); -+ sigaddset(¤t->blocked, signr); -+ recalc_sigpending(current); -+ spin_unlock_irq(¤t->sigmask_lock); -+ } -+ -+ sp = PT_REGS_SP(regs); -+ -+ if((ka->sa.sa_flags & SA_ONSTACK) && (sas_ss_flags(sp) == 0)) -+ sp = current->sas_ss_sp + current->sas_ss_size; -+ -+ if(error != 0) PT_REGS_SET_SYSCALL_RETURN(regs, ret); -+ -+ if (ka->sa.sa_flags & SA_RESTORER) restorer = ka->sa.sa_restorer; -+ else restorer = NULL; -+ -+ if(ka->sa.sa_flags & SA_SIGINFO) -+ err = setup_signal_stack_si(sp, signr, (unsigned long) handler, -+ restorer, regs, info, &save); -+ else -+ err = setup_signal_stack_sc(sp, signr, (unsigned long) handler, -+ restorer, regs, &save); -+ if(err) goto segv; -+ -+ return(0); -+ segv: -+ force_segv(signr); -+ return(1); -+} -+ -+/* -+ * Note that 'init' is a special process: it doesn't get signals it doesn't -+ * want to handle. Thus you cannot kill init even with a SIGKILL even by -+ * mistake. -+ */ -+ -+static int kern_do_signal(struct pt_regs *regs, sigset_t *oldset, int error) -+{ -+ siginfo_t info; -+ struct k_sigaction *ka; -+ int err; -+ -+ if (!oldset) -+ oldset = ¤t->blocked; -+ -+ for (;;) { -+ unsigned long signr; -+ -+ spin_lock_irq(¤t->sigmask_lock); -+ signr = dequeue_signal(¤t->blocked, &info); -+ spin_unlock_irq(¤t->sigmask_lock); -+ -+ if (!signr) -+ break; -+ -+ if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) { -+ /* Let the debugger run. */ -+ current->exit_code = signr; -+ current->state = TASK_STOPPED; -+ notify_parent(current, SIGCHLD); -+ schedule(); -+ -+ /* We're back. Did the debugger cancel the sig? */ -+ if (!(signr = current->exit_code)) -+ continue; -+ current->exit_code = 0; -+ -+ /* The debugger continued. Ignore SIGSTOP. */ -+ if (signr == SIGSTOP) -+ continue; -+ -+ /* Update the siginfo structure. Is this good? */ -+ if (signr != info.si_signo) { -+ info.si_signo = signr; -+ info.si_errno = 0; -+ info.si_code = SI_USER; -+ info.si_pid = current->p_pptr->pid; -+ info.si_uid = current->p_pptr->uid; -+ } -+ -+ /* If the (new) signal is now blocked, requeue it. */ -+ if (sigismember(¤t->blocked, signr)) { -+ send_sig_info(signr, &info, current); -+ continue; -+ } -+ } -+ -+ ka = ¤t->sig->action[signr-1]; -+ if (ka->sa.sa_handler == SIG_IGN) { -+ if (signr != SIGCHLD) -+ continue; -+ /* Check for SIGCHLD: it's special. */ -+ while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0) -+ /* nothing */; -+ continue; -+ } -+ -+ if (ka->sa.sa_handler == SIG_DFL) { -+ int exit_code = signr; -+ -+ /* Init gets no signals it doesn't want. */ -+ if (current->pid == 1) -+ continue; -+ -+ switch (signr) { -+ case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG: -+ continue; -+ -+ case SIGTSTP: case SIGTTIN: case SIGTTOU: -+ if (is_orphaned_pgrp(current->pgrp)) -+ continue; -+ /* FALLTHRU */ -+ -+ case SIGSTOP: { -+ struct signal_struct *sig; -+ current->state = TASK_STOPPED; -+ current->exit_code = signr; -+ sig = current->p_pptr->sig; -+ if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP)) -+ notify_parent(current, SIGCHLD); -+ schedule(); -+ continue; -+ } -+ case SIGQUIT: case SIGILL: case SIGTRAP: -+ case SIGABRT: case SIGFPE: case SIGSEGV: -+ case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ: -+ if (do_coredump(signr, ¤t->thread.regs)) -+ exit_code |= 0x80; -+ /* FALLTHRU */ -+ -+ default: -+ sig_exit(signr, exit_code, &info); -+ /* NOTREACHED */ -+ } -+ } -+ -+ /* Whee! Actually deliver the signal. */ -+ err = handle_signal(regs, signr, ka, &info, oldset, error); -+ if(!err) return(1); -+ } -+ -+ /* Did we come from a system call? */ -+ if(PT_REGS_SYSCALL_NR(regs) >= 0){ -+ /* Restart the system call - no handlers present */ -+ if(PT_REGS_SYSCALL_RET(regs) == -ERESTARTNOHAND || -+ PT_REGS_SYSCALL_RET(regs) == -ERESTARTSYS || -+ PT_REGS_SYSCALL_RET(regs) == -ERESTARTNOINTR){ -+ PT_REGS_ORIG_SYSCALL(regs) = PT_REGS_SYSCALL_NR(regs); -+ PT_REGS_RESTART_SYSCALL(regs); -+ } -+ } -+ -+ /* This closes a way to execute a system call on the host. If -+ * you set a breakpoint on a system call instruction and singlestep -+ * from it, the tracing thread used to PTRACE_SINGLESTEP the process -+ * rather than PTRACE_SYSCALL it, allowing the system call to execute -+ * on the host. The tracing thread will check this flag and -+ * PTRACE_SYSCALL if necessary. -+ */ -+ if((current->ptrace & PT_DTRACE) && -+ is_syscall(PT_REGS_IP(¤t->thread.regs))) -+ (void) CHOOSE_MODE(current->thread.mode.tt.singlestep_syscall = 1, 0); -+ -+ return(0); -+} -+ -+int do_signal(int error) -+{ -+ return(kern_do_signal(¤t->thread.regs, NULL, error)); -+} -+ -+/* -+ * Atomically swap in the new signal mask, and wait for a signal. -+ */ -+int sys_sigsuspend(int history0, int history1, old_sigset_t mask) -+{ -+ sigset_t saveset; -+ -+ mask &= _BLOCKABLE; -+ spin_lock_irq(¤t->sigmask_lock); -+ saveset = current->blocked; -+ siginitset(¤t->blocked, mask); -+ recalc_sigpending(current); -+ spin_unlock_irq(¤t->sigmask_lock); -+ -+ while (1) { -+ current->state = TASK_INTERRUPTIBLE; -+ schedule(); -+ if(kern_do_signal(¤t->thread.regs, &saveset, -EINTR)) -+ return(-EINTR); -+ } -+} -+ -+int sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize) -+{ -+ sigset_t saveset, newset; -+ -+ /* XXX: Don't preclude handling different sized sigset_t's. */ -+ if (sigsetsize != sizeof(sigset_t)) -+ return -EINVAL; -+ -+ if (copy_from_user(&newset, unewset, sizeof(newset))) -+ return -EFAULT; -+ sigdelsetmask(&newset, ~_BLOCKABLE); -+ -+ spin_lock_irq(¤t->sigmask_lock); -+ saveset = current->blocked; -+ current->blocked = newset; -+ recalc_sigpending(current); -+ spin_unlock_irq(¤t->sigmask_lock); -+ -+ while (1) { -+ current->state = TASK_INTERRUPTIBLE; -+ schedule(); -+ if (kern_do_signal(¤t->thread.regs, &saveset, -EINTR)) -+ return(-EINTR); -+ } -+} -+ -+static int copy_sc_from_user(struct pt_regs *to, void *from, -+ struct arch_frame_data *arch) -+{ -+ int ret; -+ -+ ret = CHOOSE_MODE(copy_sc_from_user_tt(UPT_SC(&to->regs), from, arch), -+ copy_sc_from_user_skas(&to->regs, from)); -+ return(ret); -+} -+ -+int sys_sigreturn(struct pt_regs regs) -+{ -+ void *sc = sp_to_sc(PT_REGS_SP(¤t->thread.regs)); -+ void *mask = sp_to_mask(PT_REGS_SP(¤t->thread.regs)); -+ int sig_size = (_NSIG_WORDS - 1) * sizeof(unsigned long); -+ -+ spin_lock_irq(¤t->sigmask_lock); -+ copy_from_user(¤t->blocked.sig[0], sc_sigmask(sc), -+ sizeof(current->blocked.sig[0])); -+ copy_from_user(¤t->blocked.sig[1], mask, sig_size); -+ sigdelsetmask(¤t->blocked, ~_BLOCKABLE); -+ recalc_sigpending(current); -+ spin_unlock_irq(¤t->sigmask_lock); -+ copy_sc_from_user(¤t->thread.regs, sc, -+ &signal_frame_sc.common.arch); -+ return(PT_REGS_SYSCALL_RET(¤t->thread.regs)); -+} -+ -+int sys_rt_sigreturn(struct pt_regs regs) -+{ -+ struct ucontext *uc = sp_to_uc(PT_REGS_SP(¤t->thread.regs)); -+ void *fp; -+ int sig_size = _NSIG_WORDS * sizeof(unsigned long); -+ -+ spin_lock_irq(¤t->sigmask_lock); -+ copy_from_user(¤t->blocked, &uc->uc_sigmask, sig_size); -+ sigdelsetmask(¤t->blocked, ~_BLOCKABLE); -+ recalc_sigpending(current); -+ spin_unlock_irq(¤t->sigmask_lock); -+ fp = (void *) (((unsigned long) uc) + sizeof(struct ucontext)); -+ copy_sc_from_user(¤t->thread.regs, &uc->uc_mcontext, -+ &signal_frame_si.common.arch); -+ return(PT_REGS_SYSCALL_RET(¤t->thread.regs)); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/signal_user.c um/arch/um/kernel/signal_user.c ---- orig/arch/um/kernel/signal_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/signal_user.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,142 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <stdlib.h> -+#include <signal.h> -+#include <errno.h> -+#include <stdarg.h> -+#include <string.h> -+#include <sys/mman.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "signal_user.h" -+#include "signal_kern.h" -+#include "sysdep/sigcontext.h" -+#include "sigcontext.h" -+ -+void set_sigstack(void *sig_stack, int size) -+{ -+ stack_t stack = ((stack_t) { .ss_flags = 0, -+ .ss_sp = (__ptr_t) sig_stack, -+ .ss_size = size - sizeof(void *) }); -+ -+ if(sigaltstack(&stack, NULL) != 0) -+ panic("enabling signal stack failed, errno = %d\n", errno); -+} -+ -+void set_handler(int sig, void (*handler)(int), int flags, ...) -+{ -+ struct sigaction action; -+ va_list ap; -+ int mask; -+ -+ va_start(ap, flags); -+ action.sa_handler = handler; -+ sigemptyset(&action.sa_mask); -+ while((mask = va_arg(ap, int)) != -1){ -+ sigaddset(&action.sa_mask, mask); -+ } -+ action.sa_flags = flags; -+ action.sa_restorer = NULL; -+ if(sigaction(sig, &action, NULL) < 0) -+ panic("sigaction failed"); -+} -+ -+int change_sig(int signal, int on) -+{ -+ sigset_t sigset, old; -+ -+ sigemptyset(&sigset); -+ sigaddset(&sigset, signal); -+ sigprocmask(on ? SIG_UNBLOCK : SIG_BLOCK, &sigset, &old); -+ return(!sigismember(&old, signal)); -+} -+ -+static void change_signals(int type) -+{ -+ sigset_t mask; -+ -+ sigemptyset(&mask); -+ sigaddset(&mask, SIGVTALRM); -+ sigaddset(&mask, SIGALRM); -+ sigaddset(&mask, SIGIO); -+ sigaddset(&mask, SIGPROF); -+ if(sigprocmask(type, &mask, NULL) < 0) -+ panic("Failed to change signal mask - errno = %d", errno); -+} -+ -+void block_signals(void) -+{ -+ change_signals(SIG_BLOCK); -+} -+ -+void unblock_signals(void) -+{ -+ change_signals(SIG_UNBLOCK); -+} -+ -+#define SIGIO_BIT 0 -+#define SIGVTALRM_BIT 1 -+ -+static int enable_mask(sigset_t *mask) -+{ -+ int sigs; -+ -+ sigs = sigismember(mask, SIGIO) ? 0 : 1 << SIGIO_BIT; -+ sigs |= sigismember(mask, SIGVTALRM) ? 0 : 1 << SIGVTALRM_BIT; -+ sigs |= sigismember(mask, SIGALRM) ? 0 : 1 << SIGVTALRM_BIT; -+ return(sigs); -+} -+ -+int get_signals(void) -+{ -+ sigset_t mask; -+ -+ if(sigprocmask(SIG_SETMASK, NULL, &mask) < 0) -+ panic("Failed to get signal mask"); -+ return(enable_mask(&mask)); -+} -+ -+int set_signals(int enable) -+{ -+ sigset_t mask; -+ int ret; -+ -+ sigemptyset(&mask); -+ if(enable & (1 << SIGIO_BIT)) -+ sigaddset(&mask, SIGIO); -+ if(enable & (1 << SIGVTALRM_BIT)){ -+ sigaddset(&mask, SIGVTALRM); -+ sigaddset(&mask, SIGALRM); -+ } -+ if(sigprocmask(SIG_UNBLOCK, &mask, &mask) < 0) -+ panic("Failed to enable signals"); -+ ret = enable_mask(&mask); -+ sigemptyset(&mask); -+ if((enable & (1 << SIGIO_BIT)) == 0) -+ sigaddset(&mask, SIGIO); -+ if((enable & (1 << SIGVTALRM_BIT)) == 0){ -+ sigaddset(&mask, SIGVTALRM); -+ sigaddset(&mask, SIGALRM); -+ } -+ if(sigprocmask(SIG_BLOCK, &mask, NULL) < 0) -+ panic("Failed to block signals"); -+ -+ return(ret); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/exec_kern.c um/arch/um/kernel/skas/exec_kern.c ---- orig/arch/um/kernel/skas/exec_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/exec_kern.c 2002-11-11 18:57:19.000000000 -0500 -@@ -0,0 +1,41 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/kernel.h" -+#include "asm/current.h" -+#include "asm/page.h" -+#include "asm/signal.h" -+#include "asm/ptrace.h" -+#include "asm/uaccess.h" -+#include "asm/mmu_context.h" -+#include "tlb.h" -+#include "skas.h" -+#include "mmu.h" -+#include "os.h" -+ -+void flush_thread_skas(void) -+{ -+ force_flush_all(); -+ switch_mm_skas(current->mm->context.skas.mm_fd); -+} -+ -+void start_thread_skas(struct pt_regs *regs, unsigned long eip, -+ unsigned long esp) -+{ -+ set_fs(USER_DS); -+ PT_REGS_IP(regs) = eip; -+ PT_REGS_SP(regs) = esp; -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/exec_user.c um/arch/um/kernel/skas/exec_user.c ---- orig/arch/um/kernel/skas/exec_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/exec_user.c 2002-11-03 19:23:01.000000000 -0500 -@@ -0,0 +1,61 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <errno.h> -+#include <signal.h> -+#include <sched.h> -+#include <sys/wait.h> -+#include <sys/ptrace.h> -+#include "user.h" -+#include "kern_util.h" -+#include "os.h" -+#include "time_user.h" -+ -+static int user_thread_tramp(void *arg) -+{ -+ if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) -+ panic("user_thread_tramp - PTRACE_TRACEME failed, " -+ "errno = %d\n", errno); -+ enable_timer(); -+ os_stop_process(os_getpid()); -+ return(0); -+} -+ -+int user_thread(unsigned long stack, int flags) -+{ -+ int pid, status; -+ -+ pid = clone(user_thread_tramp, (void *) stack_sp(stack), -+ flags | CLONE_FILES | SIGCHLD, NULL); -+ if(pid < 0){ -+ printk("user_thread - clone failed, errno = %d\n", errno); -+ return(pid); -+ } -+ -+ if(waitpid(pid, &status, WUNTRACED) < 0){ -+ printk("user_thread - waitpid failed, errno = %d\n", errno); -+ return(-errno); -+ } -+ -+ if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP)){ -+ printk("user_thread - trampoline didn't stop, status = %d\n", -+ status); -+ return(-EINVAL); -+ } -+ -+ return(pid); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mmu.h um/arch/um/kernel/skas/include/mmu.h ---- orig/arch/um/kernel/skas/include/mmu.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/include/mmu.h 2002-11-10 21:21:50.000000000 -0500 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SKAS_MMU_H -+#define __SKAS_MMU_H -+ -+#include "linux/list.h" -+#include "linux/spinlock.h" -+ -+struct mmu_context_skas { -+ int mm_fd; -+}; -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mode.h um/arch/um/kernel/skas/include/mode.h ---- orig/arch/um/kernel/skas/include/mode.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/include/mode.h 2003-03-26 13:27:46.000000000 -0500 -@@ -0,0 +1,36 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __MODE_SKAS_H__ -+#define __MODE_SKAS_H__ -+ -+extern unsigned long exec_regs[]; -+extern unsigned long exec_fp_regs[]; -+extern unsigned long exec_fpx_regs[]; -+extern int have_fpx_regs; -+ -+extern void user_time_init_skas(void); -+extern int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr); -+extern int copy_sc_to_user_skas(void *to_ptr, void *fp, -+ union uml_pt_regs *regs, -+ unsigned long fault_addr, int fault_type); -+extern void sig_handler_common_skas(int sig, void *sc_ptr); -+extern void halt_skas(void); -+extern void reboot_skas(void); -+extern void kill_off_processes_skas(void); -+extern int is_skas_winch(int pid, int fd, void *data); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/mode_kern.h um/arch/um/kernel/skas/include/mode_kern.h ---- orig/arch/um/kernel/skas/include/mode_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/include/mode_kern.h 2002-12-16 21:49:11.000000000 -0500 -@@ -0,0 +1,51 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SKAS_MODE_KERN_H__ -+#define __SKAS_MODE_KERN_H__ -+ -+#include "linux/sched.h" -+#include "asm/page.h" -+#include "asm/ptrace.h" -+ -+extern void flush_thread_skas(void); -+extern void *_switch_to_skas(void *prev, void *next); -+extern void start_thread_skas(struct pt_regs *regs, unsigned long eip, -+ unsigned long esp); -+extern int copy_thread_skas(int nr, unsigned long clone_flags, -+ unsigned long sp, unsigned long stack_top, -+ struct task_struct *p, struct pt_regs *regs); -+extern void release_thread_skas(struct task_struct *task); -+extern void exit_thread_skas(void); -+extern void initial_thread_cb_skas(void (*proc)(void *), void *arg); -+extern void init_idle_skas(void); -+extern void flush_tlb_kernel_vm_skas(void); -+extern void __flush_tlb_one_skas(unsigned long addr); -+extern void flush_tlb_range_skas(struct mm_struct *mm, unsigned long start, -+ unsigned long end); -+extern void flush_tlb_mm_skas(struct mm_struct *mm); -+extern void force_flush_all_skas(void); -+extern long execute_syscall_skas(void *r); -+extern void before_mem_skas(unsigned long unused); -+extern unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out, -+ unsigned long *task_size_out); -+extern int start_uml_skas(void); -+extern int external_pid_skas(struct task_struct *task); -+extern int thread_pid_skas(struct thread_struct *thread); -+ -+#define kmem_end_skas (host_task_size - 1024 * 1024) -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/proc_mm.h um/arch/um/kernel/skas/include/proc_mm.h ---- orig/arch/um/kernel/skas/include/proc_mm.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/include/proc_mm.h 2002-11-13 11:57:23.000000000 -0500 -@@ -0,0 +1,55 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SKAS_PROC_MM_H -+#define __SKAS_PROC_MM_H -+ -+#define MM_MMAP 54 -+#define MM_MUNMAP 55 -+#define MM_MPROTECT 56 -+#define MM_COPY_SEGMENTS 57 -+ -+struct mm_mmap { -+ unsigned long addr; -+ unsigned long len; -+ unsigned long prot; -+ unsigned long flags; -+ unsigned long fd; -+ unsigned long offset; -+}; -+ -+struct mm_munmap { -+ unsigned long addr; -+ unsigned long len; -+}; -+ -+struct mm_mprotect { -+ unsigned long addr; -+ unsigned long len; -+ unsigned int prot; -+}; -+ -+struct proc_mm_op { -+ int op; -+ union { -+ struct mm_mmap mmap; -+ struct mm_munmap munmap; -+ struct mm_mprotect mprotect; -+ int copy_segments; -+ } u; -+}; -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/ptrace-skas.h um/arch/um/kernel/skas/include/ptrace-skas.h ---- orig/arch/um/kernel/skas/include/ptrace-skas.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/include/ptrace-skas.h 2003-01-17 13:22:09.000000000 -0500 -@@ -0,0 +1,57 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __PTRACE_SKAS_H -+#define __PTRACE_SKAS_H -+ -+#include "uml-config.h" -+ -+#ifdef UML_CONFIG_MODE_SKAS -+ -+#include "skas_ptregs.h" -+ -+#define HOST_FRAME_SIZE 17 -+ -+#define REGS_IP(r) ((r)[HOST_IP]) -+#define REGS_SP(r) ((r)[HOST_SP]) -+#define REGS_EFLAGS(r) ((r)[HOST_EFLAGS]) -+#define REGS_EAX(r) ((r)[HOST_EAX]) -+#define REGS_EBX(r) ((r)[HOST_EBX]) -+#define REGS_ECX(r) ((r)[HOST_ECX]) -+#define REGS_EDX(r) ((r)[HOST_EDX]) -+#define REGS_ESI(r) ((r)[HOST_ESI]) -+#define REGS_EDI(r) ((r)[HOST_EDI]) -+#define REGS_EBP(r) ((r)[HOST_EBP]) -+#define REGS_CS(r) ((r)[HOST_CS]) -+#define REGS_SS(r) ((r)[HOST_SS]) -+#define REGS_DS(r) ((r)[HOST_DS]) -+#define REGS_ES(r) ((r)[HOST_ES]) -+#define REGS_FS(r) ((r)[HOST_FS]) -+#define REGS_GS(r) ((r)[HOST_GS]) -+ -+#define REGS_SET_SYSCALL_RETURN(r, res) REGS_EAX(r) = (res) -+ -+#define REGS_RESTART_SYSCALL(r) IP_RESTART_SYSCALL(REGS_IP(r)) -+ -+#define REGS_SEGV_IS_FIXABLE(r) SEGV_IS_FIXABLE((r)->trap_type) -+ -+#define REGS_FAULT_ADDR(r) ((r)->fault_addr) -+ -+#define REGS_FAULT_WRITE(r) FAULT_WRITE((r)->fault_type) -+ -+#endif -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/skas.h um/arch/um/kernel/skas/include/skas.h ---- orig/arch/um/kernel/skas/include/skas.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/include/skas.h 2002-12-08 21:00:12.000000000 -0500 -@@ -0,0 +1,49 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SKAS_H -+#define __SKAS_H -+ -+#include "sysdep/ptrace.h" -+ -+extern int userspace_pid; -+ -+extern void switch_threads(void *me, void *next); -+extern void thread_wait(void *sw, void *fb); -+extern void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, -+ void (*handler)(int)); -+extern int start_idle_thread(void *stack, void *switch_buf_ptr, -+ void **fork_buf_ptr); -+extern int user_thread(unsigned long stack, int flags); -+extern void userspace(union uml_pt_regs *regs); -+extern void new_thread_proc(void *stack, void (*handler)(int sig)); -+extern void remove_sigstack(void); -+extern void new_thread_handler(int sig); -+extern void handle_syscall(union uml_pt_regs *regs); -+extern void map(int fd, unsigned long virt, unsigned long phys, -+ unsigned long len, int r, int w, int x); -+extern int unmap(int fd, void *addr, int len); -+extern int protect(int fd, unsigned long addr, unsigned long len, -+ int r, int w, int x, int must_succeed); -+extern void user_signal(int sig, union uml_pt_regs *regs); -+extern int singlestepping_skas(void); -+extern int new_mm(int from); -+extern void save_registers(union uml_pt_regs *regs); -+extern void restore_registers(union uml_pt_regs *regs); -+extern void start_userspace(void); -+extern void init_registers(int pid); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/include/uaccess.h um/arch/um/kernel/skas/include/uaccess.h ---- orig/arch/um/kernel/skas/include/uaccess.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/include/uaccess.h 2003-01-31 23:05:56.000000000 -0500 -@@ -0,0 +1,232 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __SKAS_UACCESS_H -+#define __SKAS_UACCESS_H -+ -+#include "linux/string.h" -+#include "linux/sched.h" -+#include "asm/processor.h" -+#include "asm/pgtable.h" -+#include "asm/errno.h" -+#include "asm/current.h" -+#include "asm/a.out.h" -+#include "kern_util.h" -+ -+#define access_ok_skas(type, addr, size) \ -+ ((segment_eq(get_fs(), KERNEL_DS)) || \ -+ (((unsigned long) (addr) < TASK_SIZE) && \ -+ ((unsigned long) (addr) + (size) <= TASK_SIZE))) -+ -+static inline int verify_area_skas(int type, const void * addr, -+ unsigned long size) -+{ -+ return(access_ok_skas(type, addr, size) ? 0 : -EFAULT); -+} -+ -+static inline unsigned long maybe_map(unsigned long virt, int is_write) -+{ -+ pte_t pte; -+ -+ void *phys = um_virt_to_phys(current, virt, &pte); -+ int dummy_code; -+ -+ if(IS_ERR(phys) || (is_write && !pte_write(pte))){ -+ if(!handle_page_fault(virt, 0, is_write, 0, &dummy_code)) -+ return(0); -+ phys = um_virt_to_phys(current, virt, NULL); -+ } -+ return((unsigned long) __va((unsigned long) phys)); -+} -+ -+static inline int buffer_op(unsigned long addr, int len, -+ int (*op)(unsigned long addr, int len, void *arg), -+ void *arg) -+{ -+ int size = min(PAGE_ALIGN(addr) - addr, (unsigned long) len); -+ int remain = len, n; -+ -+ n = (*op)(addr, size, arg); -+ if(n != 0) -+ return(n < 0 ? remain : 0); -+ -+ addr += size; -+ remain -= size; -+ if(remain == 0) -+ return(0); -+ -+ while(addr < ((addr + remain) & PAGE_MASK)){ -+ n = (*op)(addr, PAGE_SIZE, arg); -+ if(n != 0) -+ return(n < 0 ? remain : 0); -+ -+ addr += PAGE_SIZE; -+ remain -= PAGE_SIZE; -+ } -+ if(remain == 0) -+ return(0); -+ -+ n = (*op)(addr, remain, arg); -+ if(n != 0) -+ return(n < 0 ? remain : 0); -+ return(0); -+} -+ -+static inline int copy_chunk_from_user(unsigned long from, int len, void *arg) -+{ -+ unsigned long *to_ptr = arg, to = *to_ptr; -+ -+ from = maybe_map(from, 0); -+ if(from == 0) -+ return(-1); -+ -+ memcpy((void *) to, (void *) from, len); -+ *to_ptr += len; -+ return(0); -+} -+ -+static inline int copy_from_user_skas(void *to, const void *from, int n) -+{ -+ if(segment_eq(get_fs(), KERNEL_DS)){ -+ memcpy(to, from, n); -+ return(0); -+ } -+ -+ return(access_ok_skas(VERIFY_READ, from, n) ? -+ buffer_op((unsigned long) from, n, copy_chunk_from_user, &to) : -+ n); -+} -+ -+static inline int copy_chunk_to_user(unsigned long to, int len, void *arg) -+{ -+ unsigned long *from_ptr = arg, from = *from_ptr; -+ -+ to = maybe_map(to, 1); -+ if(to == 0) -+ return(-1); -+ -+ memcpy((void *) to, (void *) from, len); -+ *from_ptr += len; -+ return(0); -+} -+ -+static inline int copy_to_user_skas(void *to, const void *from, int n) -+{ -+ if(segment_eq(get_fs(), KERNEL_DS)){ -+ memcpy(to, from, n); -+ return(0); -+ } -+ -+ return(access_ok_skas(VERIFY_WRITE, to, n) ? -+ buffer_op((unsigned long) to, n, copy_chunk_to_user, &from) : -+ n); -+} -+ -+static inline int strncpy_chunk_from_user(unsigned long from, int len, -+ void *arg) -+{ -+ char **to_ptr = arg, *to = *to_ptr; -+ int n; -+ -+ from = maybe_map(from, 0); -+ if(from == 0) -+ return(-1); -+ -+ strncpy(to, (void *) from, len); -+ n = strnlen(to, len); -+ *to_ptr += n; -+ -+ if(n < len) -+ return(1); -+ return(0); -+} -+ -+static inline int strncpy_from_user_skas(char *dst, const char *src, int count) -+{ -+ int n; -+ char *ptr = dst; -+ -+ if(segment_eq(get_fs(), KERNEL_DS)){ -+ strncpy(dst, src, count); -+ return(strnlen(dst, count)); -+ } -+ -+ if(!access_ok_skas(VERIFY_READ, src, 1)) -+ return(-EFAULT); -+ -+ n = buffer_op((unsigned long) src, count, strncpy_chunk_from_user, -+ &ptr); -+ if(n != 0) -+ return(-EFAULT); -+ return(strnlen(dst, count)); -+} -+ -+static inline int clear_chunk(unsigned long addr, int len, void *unused) -+{ -+ addr = maybe_map(addr, 1); -+ if(addr == 0) -+ return(-1); -+ -+ memset((void *) addr, 0, len); -+ return(0); -+} -+ -+static inline int __clear_user_skas(void *mem, int len) -+{ -+ return(buffer_op((unsigned long) mem, len, clear_chunk, NULL)); -+} -+ -+static inline int clear_user_skas(void *mem, int len) -+{ -+ if(segment_eq(get_fs(), KERNEL_DS)){ -+ memset(mem, 0, len); -+ return(0); -+ } -+ -+ return(access_ok_skas(VERIFY_WRITE, mem, len) ? -+ buffer_op((unsigned long) mem, len, clear_chunk, NULL) : len); -+} -+ -+static inline int strnlen_chunk(unsigned long str, int len, void *arg) -+{ -+ int *len_ptr = arg, n; -+ -+ str = maybe_map(str, 0); -+ if(str == 0) -+ return(-1); -+ -+ n = strnlen((void *) str, len); -+ *len_ptr += n; -+ -+ if(n < len) -+ return(1); -+ return(0); -+} -+ -+static inline int strnlen_user_skas(const void *str, int len) -+{ -+ int count = 0, n; -+ -+ if(segment_eq(get_fs(), KERNEL_DS)) -+ return(strnlen(str, len) + 1); -+ -+ n = buffer_op((unsigned long) str, len, strnlen_chunk, &count); -+ if(n == 0) -+ return(count + 1); -+ return(-EFAULT); -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/Makefile um/arch/um/kernel/skas/Makefile ---- orig/arch/um/kernel/skas/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/Makefile 2002-11-01 16:05:44.000000000 -0500 -@@ -0,0 +1,30 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET = skas.o -+ -+obj-y = exec_kern.o exec_user.o mem.o mem_user.o mmu.o process.o \ -+ process_kern.o syscall_kern.o syscall_user.o time.o tlb.o trap_user.o -+ -+subdir-y = sys-$(SUBARCH) -+ -+obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) -+ -+USER_OBJS = $(filter %_user.o,$(obj-y)) process.o time.o -+ -+include $(TOPDIR)/Rules.make -+ -+include/skas_ptregs.h : util/mk_ptregs -+ util/mk_ptregs > $@ -+ -+util/mk_ptregs : -+ $(MAKE) -C util -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+clean : -+ $(MAKE) -C util clean -+ $(RM) -f include/skas_ptregs.h -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mem.c um/arch/um/kernel/skas/mem.c ---- orig/arch/um/kernel/skas/mem.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/mem.c 2002-12-16 21:49:39.000000000 -0500 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/mm.h" -+#include "mem_user.h" -+ -+unsigned long set_task_sizes_skas(int arg, unsigned long *host_size_out, -+ unsigned long *task_size_out) -+{ -+ /* Round up to the nearest 4M */ -+ unsigned long top = ROUND_4M((unsigned long) &arg); -+ -+ *host_size_out = top; -+ *task_size_out = top; -+ return(((unsigned long) set_task_sizes_skas) & ~0xffffff); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mem_user.c um/arch/um/kernel/skas/mem_user.c ---- orig/arch/um/kernel/skas/mem_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/mem_user.c 2002-12-31 00:13:18.000000000 -0500 -@@ -0,0 +1,95 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <errno.h> -+#include <sys/mman.h> -+#include <sys/ptrace.h> -+#include "mem_user.h" -+#include "user.h" -+#include "os.h" -+#include "proc_mm.h" -+ -+void map(int fd, unsigned long virt, unsigned long phys, unsigned long len, -+ int r, int w, int x) -+{ -+ struct proc_mm_op map; -+ struct mem_region *region; -+ int prot, n; -+ -+ prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | -+ (x ? PROT_EXEC : 0); -+ region = phys_region(phys); -+ -+ map = ((struct proc_mm_op) { .op = MM_MMAP, -+ .u = -+ { .mmap = -+ { .addr = virt, -+ .len = len, -+ .prot = prot, -+ .flags = MAP_SHARED | -+ MAP_FIXED, -+ .fd = region->fd, -+ .offset = phys_offset(phys) -+ } } } ); -+ n = os_write_file(fd, &map, sizeof(map)); -+ if(n != sizeof(map)) -+ printk("map : /proc/mm map failed, errno = %d\n", errno); -+} -+ -+int unmap(int fd, void *addr, int len) -+{ -+ struct proc_mm_op unmap; -+ int n; -+ -+ unmap = ((struct proc_mm_op) { .op = MM_MUNMAP, -+ .u = -+ { .munmap = -+ { .addr = (unsigned long) addr, -+ .len = len } } } ); -+ n = os_write_file(fd, &unmap, sizeof(unmap)); -+ if((n != 0) && (n != sizeof(unmap))) -+ return(-errno); -+ return(0); -+} -+ -+int protect(int fd, unsigned long addr, unsigned long len, int r, int w, -+ int x, int must_succeed) -+{ -+ struct proc_mm_op protect; -+ int prot, n; -+ -+ prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | -+ (x ? PROT_EXEC : 0); -+ -+ protect = ((struct proc_mm_op) { .op = MM_MPROTECT, -+ .u = -+ { .mprotect = -+ { .addr = (unsigned long) addr, -+ .len = len, -+ .prot = prot } } } ); -+ -+ n = os_write_file(fd, &protect, sizeof(protect)); -+ if((n != 0) && (n != sizeof(protect))){ -+ if(must_succeed) -+ panic("protect failed, errno = %d", errno); -+ return(-errno); -+ } -+ return(0); -+} -+ -+void before_mem_skas(unsigned long unused) -+{ -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/mmu.c um/arch/um/kernel/skas/mmu.c ---- orig/arch/um/kernel/skas/mmu.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/mmu.c 2002-11-13 13:09:57.000000000 -0500 -@@ -0,0 +1,44 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/list.h" -+#include "linux/spinlock.h" -+#include "linux/slab.h" -+#include "asm/segment.h" -+#include "asm/mmu.h" -+#include "os.h" -+#include "skas.h" -+ -+int init_new_context_skas(struct task_struct *task, struct mm_struct *mm) -+{ -+ int from; -+ -+ if((current->mm != NULL) && (current->mm != &init_mm)) -+ from = current->mm->context.skas.mm_fd; -+ else from = -1; -+ -+ mm->context.skas.mm_fd = new_mm(from); -+ if(mm->context.skas.mm_fd < 0) -+ panic("init_new_context_skas - new_mm failed, errno = %d\n", -+ mm->context.skas.mm_fd); -+ -+ return(0); -+} -+ -+void destroy_context_skas(struct mm_struct *mm) -+{ -+ os_close_file(mm->context.skas.mm_fd); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/process.c um/arch/um/kernel/skas/process.c ---- orig/arch/um/kernel/skas/process.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/process.c 2003-05-15 15:21:48.000000000 -0400 -@@ -0,0 +1,409 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <unistd.h> -+#include <errno.h> -+#include <signal.h> -+#include <setjmp.h> -+#include <sched.h> -+#include <sys/wait.h> -+#include <sys/ptrace.h> -+#include <sys/mman.h> -+#include <sys/user.h> -+#include <asm/unistd.h> -+#include "user.h" -+#include "ptrace_user.h" -+#include "time_user.h" -+#include "sysdep/ptrace.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "skas.h" -+#include "sysdep/sigcontext.h" -+#include "os.h" -+#include "proc_mm.h" -+#include "skas_ptrace.h" -+#include "chan_user.h" -+ -+int is_skas_winch(int pid, int fd, void *data) -+{ -+ if(pid != getpid()) -+ return(0); -+ -+ register_winch_irq(-1, fd, -1, data); -+ return(1); -+} -+ -+unsigned long exec_regs[FRAME_SIZE]; -+unsigned long exec_fp_regs[HOST_FP_SIZE]; -+unsigned long exec_fpx_regs[HOST_XFP_SIZE]; -+int have_fpx_regs = 1; -+ -+static void handle_segv(int pid) -+{ -+ struct ptrace_faultinfo fault; -+ int err; -+ -+ err = ptrace(PTRACE_FAULTINFO, pid, 0, &fault); -+ if(err) -+ panic("handle_segv - PTRACE_FAULTINFO failed, errno = %d\n", -+ errno); -+ -+ segv(fault.addr, 0, FAULT_WRITE(fault.is_write), 1, NULL); -+} -+ -+static void handle_trap(int pid, union uml_pt_regs *regs) -+{ -+ int err, syscall_nr, status; -+ -+ syscall_nr = PT_SYSCALL_NR(regs->skas.regs); -+ if(syscall_nr < 1){ -+ relay_signal(SIGTRAP, regs); -+ return; -+ } -+ UPT_SYSCALL_NR(regs) = syscall_nr; -+ -+ err = ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_getpid); -+ if(err < 0) -+ panic("handle_trap - nullifying syscall failed errno = %d\n", -+ errno); -+ -+ err = ptrace(PTRACE_SYSCALL, pid, 0, 0); -+ if(err < 0) -+ panic("handle_trap - continuing to end of syscall failed, " -+ "errno = %d\n", errno); -+ -+ err = waitpid(pid, &status, WUNTRACED); -+ if((err < 0) || !WIFSTOPPED(status) || (WSTOPSIG(status) != SIGTRAP)) -+ panic("handle_trap - failed to wait at end of syscall, " -+ "errno = %d, status = %d\n", errno, status); -+ -+ handle_syscall(regs); -+} -+ -+static int userspace_tramp(void *arg) -+{ -+ init_new_thread_signals(0); -+ enable_timer(); -+ ptrace(PTRACE_TRACEME, 0, 0, 0); -+ os_stop_process(os_getpid()); -+ return(0); -+} -+ -+int userspace_pid; -+ -+void start_userspace(void) -+{ -+ void *stack; -+ unsigned long sp; -+ int pid, status, n; -+ -+ stack = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, -+ MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -+ if(stack == MAP_FAILED) -+ panic("start_userspace : mmap failed, errno = %d", errno); -+ sp = (unsigned long) stack + PAGE_SIZE - sizeof(void *); -+ -+ pid = clone(userspace_tramp, (void *) sp, -+ CLONE_FILES | CLONE_VM | SIGCHLD, NULL); -+ if(pid < 0) -+ panic("start_userspace : clone failed, errno = %d", errno); -+ -+ do { -+ n = waitpid(pid, &status, WUNTRACED); -+ if(n < 0) -+ panic("start_userspace : wait failed, errno = %d", -+ errno); -+ } while(WIFSTOPPED(status) && (WSTOPSIG(status) == SIGVTALRM)); -+ -+ if(!WIFSTOPPED(status) || (WSTOPSIG(status) != SIGSTOP)) -+ panic("start_userspace : expected SIGSTOP, got status = %d", -+ status); -+ -+ if(munmap(stack, PAGE_SIZE) < 0) -+ panic("start_userspace : munmap failed, errno = %d\n", errno); -+ -+ userspace_pid = pid; -+} -+ -+void userspace(union uml_pt_regs *regs) -+{ -+ int err, status, op; -+ -+ restore_registers(regs); -+ -+ err = ptrace(PTRACE_SYSCALL, userspace_pid, 0, 0); -+ if(err) -+ panic("userspace - PTRACE_SYSCALL failed, errno = %d\n", -+ errno); -+ while(1){ -+ err = waitpid(userspace_pid, &status, WUNTRACED); -+ if(err < 0) -+ panic("userspace - waitpid failed, errno = %d\n", -+ errno); -+ -+ regs->skas.is_user = 1; -+ save_registers(regs); -+ -+ if(WIFSTOPPED(status)){ -+ switch(WSTOPSIG(status)){ -+ case SIGSEGV: -+ handle_segv(userspace_pid); -+ break; -+ case SIGTRAP: -+ handle_trap(userspace_pid, regs); -+ break; -+ case SIGIO: -+ case SIGVTALRM: -+ case SIGILL: -+ case SIGBUS: -+ case SIGFPE: -+ case SIGWINCH: -+ user_signal(WSTOPSIG(status), regs); -+ break; -+ default: -+ printk("userspace - child stopped with signal " -+ "%d\n", WSTOPSIG(status)); -+ } -+ interrupt_end(); -+ } -+ -+ restore_registers(regs); -+ -+ op = singlestepping_skas() ? PTRACE_SINGLESTEP : -+ PTRACE_SYSCALL; -+ err = ptrace(op, userspace_pid, 0, 0); -+ if(err) -+ panic("userspace - PTRACE_SYSCALL failed, " -+ "errno = %d\n", errno); -+ } -+} -+ -+void new_thread(void *stack, void **switch_buf_ptr, void **fork_buf_ptr, -+ void (*handler)(int)) -+{ -+ jmp_buf switch_buf, fork_buf; -+ -+ *switch_buf_ptr = &switch_buf; -+ *fork_buf_ptr = &fork_buf; -+ -+ if(setjmp(fork_buf) == 0) -+ new_thread_proc(stack, handler); -+ -+ remove_sigstack(); -+} -+ -+void thread_wait(void *sw, void *fb) -+{ -+ jmp_buf buf, **switch_buf = sw, *fork_buf; -+ -+ *switch_buf = &buf; -+ fork_buf = fb; -+ if(setjmp(buf) == 0) -+ longjmp(*fork_buf, 1); -+} -+ -+static int move_registers(int int_op, int fp_op, union uml_pt_regs *regs, -+ unsigned long *fp_regs) -+{ -+ if(ptrace(int_op, userspace_pid, 0, regs->skas.regs) < 0) -+ return(-errno); -+ if(ptrace(fp_op, userspace_pid, 0, fp_regs) < 0) -+ return(-errno); -+ return(0); -+} -+ -+void save_registers(union uml_pt_regs *regs) -+{ -+ unsigned long *fp_regs; -+ int err, fp_op; -+ -+ if(have_fpx_regs){ -+ fp_op = PTRACE_GETFPXREGS; -+ fp_regs = regs->skas.xfp; -+ } -+ else { -+ fp_op = PTRACE_GETFPREGS; -+ fp_regs = regs->skas.fp; -+ } -+ -+ err = move_registers(PTRACE_GETREGS, fp_op, regs, fp_regs); -+ if(err) -+ panic("save_registers - saving registers failed, errno = %d\n", -+ err); -+} -+ -+void restore_registers(union uml_pt_regs *regs) -+{ -+ unsigned long *fp_regs; -+ int err, fp_op; -+ -+ if(have_fpx_regs){ -+ fp_op = PTRACE_SETFPXREGS; -+ fp_regs = regs->skas.xfp; -+ } -+ else { -+ fp_op = PTRACE_SETFPREGS; -+ fp_regs = regs->skas.fp; -+ } -+ -+ err = move_registers(PTRACE_SETREGS, fp_op, regs, fp_regs); -+ if(err) -+ panic("restore_registers - saving registers failed, " -+ "errno = %d\n", err); -+} -+ -+void switch_threads(void *me, void *next) -+{ -+ jmp_buf my_buf, **me_ptr = me, *next_buf = next; -+ -+ *me_ptr = &my_buf; -+ if(setjmp(my_buf) == 0) -+ longjmp(*next_buf, 1); -+} -+ -+static jmp_buf initial_jmpbuf; -+ -+/* XXX Make these percpu */ -+static void (*cb_proc)(void *arg); -+static void *cb_arg; -+static jmp_buf *cb_back; -+ -+int start_idle_thread(void *stack, void *switch_buf_ptr, void **fork_buf_ptr) -+{ -+ jmp_buf **switch_buf = switch_buf_ptr; -+ int n; -+ -+ *fork_buf_ptr = &initial_jmpbuf; -+ n = setjmp(initial_jmpbuf); -+ if(n == 0) -+ new_thread_proc((void *) stack, new_thread_handler); -+ else if(n == 1) -+ remove_sigstack(); -+ else if(n == 2){ -+ (*cb_proc)(cb_arg); -+ longjmp(*cb_back, 1); -+ } -+ else if(n == 3){ -+ kmalloc_ok = 0; -+ return(0); -+ } -+ else if(n == 4){ -+ kmalloc_ok = 0; -+ return(1); -+ } -+ longjmp(**switch_buf, 1); -+} -+ -+void remove_sigstack(void) -+{ -+ stack_t stack = ((stack_t) { .ss_flags = SS_DISABLE, -+ .ss_sp = NULL, -+ .ss_size = 0 }); -+ -+ if(sigaltstack(&stack, NULL) != 0) -+ panic("disabling signal stack failed, errno = %d\n", errno); -+} -+ -+void initial_thread_cb_skas(void (*proc)(void *), void *arg) -+{ -+ jmp_buf here; -+ -+ cb_proc = proc; -+ cb_arg = arg; -+ cb_back = &here; -+ -+ block_signals(); -+ if(setjmp(here) == 0) -+ longjmp(initial_jmpbuf, 2); -+ unblock_signals(); -+ -+ cb_proc = NULL; -+ cb_arg = NULL; -+ cb_back = NULL; -+} -+ -+void halt_skas(void) -+{ -+ block_signals(); -+ longjmp(initial_jmpbuf, 3); -+} -+ -+void reboot_skas(void) -+{ -+ block_signals(); -+ longjmp(initial_jmpbuf, 4); -+} -+ -+int new_mm(int from) -+{ -+ struct proc_mm_op copy; -+ int n, fd = os_open_file("/proc/mm", -+ of_cloexec(of_write(OPENFLAGS())), 0); -+ -+ if(fd < 0) -+ return(-errno); -+ -+ if(from != -1){ -+ copy = ((struct proc_mm_op) { .op = MM_COPY_SEGMENTS, -+ .u = -+ { .copy_segments = from } } ); -+ n = os_write_file(fd, ©, sizeof(copy)); -+ if(n != sizeof(copy)) -+ printk("new_mm : /proc/mm copy_segments failed, " -+ "errno = %d\n", errno); -+ } -+ -+ return(fd); -+} -+ -+void switch_mm_skas(int mm_fd) -+{ -+ int err; -+ -+ err = ptrace(PTRACE_SWITCH_MM, userspace_pid, 0, mm_fd); -+ if(err) -+ panic("switch_mm_skas - PTRACE_SWITCH_MM failed, errno = %d\n", -+ errno); -+} -+ -+void kill_off_processes_skas(void) -+{ -+ os_kill_process(userspace_pid, 1); -+} -+ -+void init_registers(int pid) -+{ -+ int err; -+ -+ if(ptrace(PTRACE_GETREGS, pid, 0, exec_regs) < 0) -+ panic("check_ptrace : PTRACE_GETREGS failed, errno = %d", -+ errno); -+ -+ err = ptrace(PTRACE_GETFPXREGS, pid, 0, exec_fpx_regs); -+ if(!err) -+ return; -+ -+ have_fpx_regs = 0; -+ if(errno != EIO) -+ panic("check_ptrace : PTRACE_GETFPXREGS failed, errno = %d", -+ errno); -+ -+ err = ptrace(PTRACE_GETFPREGS, pid, 0, exec_fp_regs); -+ if(err) -+ panic("check_ptrace : PTRACE_GETFPREGS failed, errno = %d", -+ errno); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/process_kern.c um/arch/um/kernel/skas/process_kern.c ---- orig/arch/um/kernel/skas/process_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/process_kern.c 2002-12-22 20:37:39.000000000 -0500 -@@ -0,0 +1,191 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sched.h" -+#include "linux/slab.h" -+#include "kern_util.h" -+#include "time_user.h" -+#include "signal_user.h" -+#include "skas.h" -+#include "os.h" -+#include "user_util.h" -+#include "tlb.h" -+#include "frame.h" -+#include "kern.h" -+#include "mode.h" -+ -+int singlestepping_skas(void) -+{ -+ int ret = current->ptrace & PT_DTRACE; -+ -+ current->ptrace &= ~PT_DTRACE; -+ return(ret); -+} -+ -+void *_switch_to_skas(void *prev, void *next) -+{ -+ struct task_struct *from, *to; -+ -+ from = prev; -+ to = next; -+ -+ /* XXX need to check runqueues[cpu].idle */ -+ if(current->pid == 0) -+ switch_timers(0); -+ -+ to->thread.prev_sched = from; -+ set_current(to); -+ -+ switch_threads(&from->thread.mode.skas.switch_buf, -+ to->thread.mode.skas.switch_buf); -+ -+ if(current->pid == 0) -+ switch_timers(1); -+ -+ return(current->thread.prev_sched); -+} -+ -+extern void schedule_tail(struct task_struct *prev); -+ -+void new_thread_handler(int sig) -+{ -+ int (*fn)(void *), n; -+ void *arg; -+ -+ fn = current->thread.request.u.thread.proc; -+ arg = current->thread.request.u.thread.arg; -+ change_sig(SIGUSR1, 1); -+ thread_wait(¤t->thread.mode.skas.switch_buf, -+ current->thread.mode.skas.fork_buf); -+ -+ if(current->thread.prev_sched != NULL) -+ schedule_tail(current->thread.prev_sched); -+ current->thread.prev_sched = NULL; -+ -+ n = run_kernel_thread(fn, arg, ¤t->thread.exec_buf); -+ if(n == 1) -+ userspace(¤t->thread.regs.regs); -+ else do_exit(0); -+} -+ -+void new_thread_proc(void *stack, void (*handler)(int sig)) -+{ -+ init_new_thread_stack(stack, handler); -+ os_usr1_process(os_getpid()); -+} -+ -+void release_thread_skas(struct task_struct *task) -+{ -+} -+ -+void exit_thread_skas(void) -+{ -+} -+ -+void fork_handler(int sig) -+{ -+ change_sig(SIGUSR1, 1); -+ thread_wait(¤t->thread.mode.skas.switch_buf, -+ current->thread.mode.skas.fork_buf); -+ -+ force_flush_all(); -+ if(current->thread.prev_sched != NULL) -+ schedule_tail(current->thread.prev_sched); -+ current->thread.prev_sched = NULL; -+ unblock_signals(); -+ -+ userspace(¤t->thread.regs.regs); -+} -+ -+int copy_thread_skas(int nr, unsigned long clone_flags, unsigned long sp, -+ unsigned long stack_top, struct task_struct * p, -+ struct pt_regs *regs) -+{ -+ void (*handler)(int); -+ -+ if(current->thread.forking){ -+ memcpy(&p->thread.regs.regs.skas, -+ ¤t->thread.regs.regs.skas, -+ sizeof(p->thread.regs.regs.skas)); -+ REGS_SET_SYSCALL_RETURN(p->thread.regs.regs.skas.regs, 0); -+ if(sp != 0) REGS_SP(p->thread.regs.regs.skas.regs) = sp; -+ -+ handler = fork_handler; -+ } -+ else { -+ memcpy(p->thread.regs.regs.skas.regs, exec_regs, -+ sizeof(p->thread.regs.regs.skas.regs)); -+ memcpy(p->thread.regs.regs.skas.fp, exec_fp_regs, -+ sizeof(p->thread.regs.regs.skas.fp)); -+ memcpy(p->thread.regs.regs.skas.xfp, exec_fpx_regs, -+ sizeof(p->thread.regs.regs.skas.xfp)); -+ p->thread.request.u.thread = current->thread.request.u.thread; -+ handler = new_thread_handler; -+ } -+ -+ new_thread((void *) p->thread.kernel_stack, -+ &p->thread.mode.skas.switch_buf, -+ &p->thread.mode.skas.fork_buf, handler); -+ return(0); -+} -+ -+void init_idle_skas(void) -+{ -+ cpu_tasks[current->processor].pid = os_getpid(); -+} -+ -+extern void start_kernel(void); -+ -+static int start_kernel_proc(void *unused) -+{ -+ int pid; -+ -+ block_signals(); -+ pid = os_getpid(); -+ -+ cpu_tasks[0].pid = pid; -+ cpu_tasks[0].task = current; -+#ifdef CONFIG_SMP -+ cpu_online_map = 1; -+#endif -+ start_kernel(); -+ return(0); -+} -+ -+int start_uml_skas(void) -+{ -+ start_userspace(); -+ capture_signal_stack(); -+ -+ init_new_thread_signals(1); -+ idle_timer(); -+ -+ init_task.thread.request.u.thread.proc = start_kernel_proc; -+ init_task.thread.request.u.thread.arg = NULL; -+ return(start_idle_thread((void *) init_task.thread.kernel_stack, -+ &init_task.thread.mode.skas.switch_buf, -+ &init_task.thread.mode.skas.fork_buf)); -+} -+ -+int external_pid_skas(struct task_struct *task) -+{ -+ return(userspace_pid); -+} -+ -+int thread_pid_skas(struct thread_struct *thread) -+{ -+ return(userspace_pid); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/syscall_kern.c um/arch/um/kernel/skas/syscall_kern.c ---- orig/arch/um/kernel/skas/syscall_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/syscall_kern.c 2002-12-08 21:01:44.000000000 -0500 -@@ -0,0 +1,42 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sys.h" -+#include "asm/errno.h" -+#include "asm/unistd.h" -+#include "asm/ptrace.h" -+#include "asm/current.h" -+#include "sysdep/syscalls.h" -+#include "kern_util.h" -+ -+extern syscall_handler_t *sys_call_table[]; -+ -+long execute_syscall_skas(void *r) -+{ -+ struct pt_regs *regs = r; -+ long res; -+ int syscall; -+ -+ current->thread.nsyscalls++; -+ nsyscalls++; -+ syscall = UPT_SYSCALL_NR(®s->regs); -+ -+ if((syscall >= NR_syscalls) || (syscall < 0)) -+ res = -ENOSYS; -+ else res = EXECUTE_SYSCALL(syscall, regs); -+ -+ return(res); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/syscall_user.c um/arch/um/kernel/skas/syscall_user.c ---- orig/arch/um/kernel/skas/syscall_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/syscall_user.c 2002-12-08 21:00:12.000000000 -0500 -@@ -0,0 +1,46 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <signal.h> -+#include "kern_util.h" -+#include "syscall_user.h" -+#include "sysdep/ptrace.h" -+#include "sysdep/sigcontext.h" -+ -+/* XXX Bogus */ -+#define ERESTARTSYS 512 -+#define ERESTARTNOINTR 513 -+#define ERESTARTNOHAND 514 -+ -+void handle_syscall(union uml_pt_regs *regs) -+{ -+ long result; -+ int index; -+ -+ index = record_syscall_start(UPT_SYSCALL_NR(regs)); -+ -+ syscall_trace(); -+ result = execute_syscall(regs); -+ -+ REGS_SET_SYSCALL_RETURN(regs->skas.regs, result); -+ if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) || -+ (result == -ERESTARTNOINTR)) -+ do_signal(result); -+ -+ syscall_trace(); -+ record_syscall_end(index, result); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/sys-i386/Makefile um/arch/um/kernel/skas/sys-i386/Makefile ---- orig/arch/um/kernel/skas/sys-i386/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/sys-i386/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,17 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET = sys-i386.o -+ -+obj-y = sigcontext.o -+ -+USER_OBJS = sigcontext.o -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+clean : -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/sys-i386/sigcontext.c um/arch/um/kernel/skas/sys-i386/sigcontext.c ---- orig/arch/um/kernel/skas/sys-i386/sigcontext.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/sys-i386/sigcontext.c 2002-12-08 20:38:46.000000000 -0500 -@@ -0,0 +1,115 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <errno.h> -+#include <asm/sigcontext.h> -+#include <sys/ptrace.h> -+#include <linux/ptrace.h> -+#include "sysdep/ptrace.h" -+#include "sysdep/ptrace_user.h" -+#include "kern_util.h" -+#include "user.h" -+#include "sigcontext.h" -+ -+extern int userspace_pid; -+ -+int copy_sc_from_user_skas(union uml_pt_regs *regs, void *from_ptr) -+{ -+ struct sigcontext sc, *from = from_ptr; -+ unsigned long fpregs[FP_FRAME_SIZE]; -+ int err; -+ -+ err = copy_from_user_proc(&sc, from, sizeof(sc)); -+ err |= copy_from_user_proc(fpregs, sc.fpstate, sizeof(fpregs)); -+ if(err) -+ return(err); -+ -+ regs->skas.regs[GS] = sc.gs; -+ regs->skas.regs[FS] = sc.fs; -+ regs->skas.regs[ES] = sc.es; -+ regs->skas.regs[DS] = sc.ds; -+ regs->skas.regs[EDI] = sc.edi; -+ regs->skas.regs[ESI] = sc.esi; -+ regs->skas.regs[EBP] = sc.ebp; -+ regs->skas.regs[UESP] = sc.esp; -+ regs->skas.regs[EBX] = sc.ebx; -+ regs->skas.regs[EDX] = sc.edx; -+ regs->skas.regs[ECX] = sc.ecx; -+ regs->skas.regs[EAX] = sc.eax; -+ regs->skas.regs[EIP] = sc.eip; -+ regs->skas.regs[CS] = sc.cs; -+ regs->skas.regs[EFL] = sc.eflags; -+ regs->skas.regs[UESP] = sc.esp_at_signal; -+ regs->skas.regs[SS] = sc.ss; -+ regs->skas.fault_addr = sc.cr2; -+ regs->skas.fault_type = FAULT_WRITE(sc.err); -+ regs->skas.trap_type = sc.trapno; -+ -+ err = ptrace(PTRACE_SETFPREGS, userspace_pid, 0, fpregs); -+ if(err < 0){ -+ printk("copy_sc_to_user - PTRACE_SETFPREGS failed, " -+ "errno = %d\n", errno); -+ return(1); -+ } -+ -+ return(0); -+} -+ -+int copy_sc_to_user_skas(void *to_ptr, void *fp, union uml_pt_regs *regs, -+ unsigned long fault_addr, int fault_type) -+{ -+ struct sigcontext sc, *to = to_ptr; -+ struct _fpstate *to_fp; -+ unsigned long fpregs[FP_FRAME_SIZE]; -+ int err; -+ -+ sc.gs = regs->skas.regs[GS]; -+ sc.fs = regs->skas.regs[FS]; -+ sc.es = regs->skas.regs[ES]; -+ sc.ds = regs->skas.regs[DS]; -+ sc.edi = regs->skas.regs[EDI]; -+ sc.esi = regs->skas.regs[ESI]; -+ sc.ebp = regs->skas.regs[EBP]; -+ sc.esp = regs->skas.regs[UESP]; -+ sc.ebx = regs->skas.regs[EBX]; -+ sc.edx = regs->skas.regs[EDX]; -+ sc.ecx = regs->skas.regs[ECX]; -+ sc.eax = regs->skas.regs[EAX]; -+ sc.eip = regs->skas.regs[EIP]; -+ sc.cs = regs->skas.regs[CS]; -+ sc.eflags = regs->skas.regs[EFL]; -+ sc.esp_at_signal = regs->skas.regs[UESP]; -+ sc.ss = regs->skas.regs[SS]; -+ sc.cr2 = fault_addr; -+ sc.err = TO_SC_ERR(fault_type); -+ sc.trapno = regs->skas.trap_type; -+ -+ err = ptrace(PTRACE_GETFPREGS, userspace_pid, 0, fpregs); -+ if(err < 0){ -+ printk("copy_sc_to_user - PTRACE_GETFPREGS failed, " -+ "errno = %d\n", errno); -+ return(1); -+ } -+ to_fp = (struct _fpstate *) -+ (fp ? (unsigned long) fp : ((unsigned long) to + sizeof(*to))); -+ sc.fpstate = to_fp; -+ -+ if(err) -+ return(err); -+ -+ return(copy_to_user_proc(to, &sc, sizeof(sc)) || -+ copy_to_user_proc(to_fp, fpregs, sizeof(fpregs))); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/time.c um/arch/um/kernel/skas/time.c ---- orig/arch/um/kernel/skas/time.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/time.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,30 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <sys/signal.h> -+#include <sys/time.h> -+#include "time_user.h" -+#include "process.h" -+#include "user.h" -+ -+void user_time_init_skas(void) -+{ -+ if(signal(SIGALRM, (__sighandler_t) alarm_handler) == SIG_ERR) -+ panic("Couldn't set SIGALRM handler"); -+ if(signal(SIGVTALRM, (__sighandler_t) alarm_handler) == SIG_ERR) -+ panic("Couldn't set SIGVTALRM handler"); -+ set_interval(ITIMER_VIRTUAL); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/tlb.c um/arch/um/kernel/skas/tlb.c ---- orig/arch/um/kernel/skas/tlb.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/tlb.c 2002-12-22 18:30:35.000000000 -0500 -@@ -0,0 +1,153 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/stddef.h" -+#include "linux/sched.h" -+#include "asm/page.h" -+#include "asm/pgtable.h" -+#include "asm/mmu.h" -+#include "user_util.h" -+#include "mem_user.h" -+#include "skas.h" -+#include "os.h" -+ -+static void fix_range(struct mm_struct *mm, unsigned long start_addr, -+ unsigned long end_addr, int force) -+{ -+ pgd_t *npgd; -+ pmd_t *npmd; -+ pte_t *npte; -+ unsigned long addr; -+ int r, w, x, err, fd; -+ -+ if(mm == NULL) return; -+ fd = mm->context.skas.mm_fd; -+ for(addr = start_addr; addr < end_addr;){ -+ npgd = pgd_offset(mm, addr); -+ npmd = pmd_offset(npgd, addr); -+ if(pmd_present(*npmd)){ -+ npte = pte_offset(npmd, addr); -+ r = pte_read(*npte); -+ w = pte_write(*npte); -+ x = pte_exec(*npte); -+ if(!pte_dirty(*npte)) w = 0; -+ if(!pte_young(*npte)){ -+ r = 0; -+ w = 0; -+ } -+ if(force || pte_newpage(*npte)){ -+ err = unmap(fd, (void *) addr, PAGE_SIZE); -+ if(err < 0) -+ panic("munmap failed, errno = %d\n", -+ -err); -+ if(pte_present(*npte)) -+ map(fd, addr, -+ pte_val(*npte) & PAGE_MASK, -+ PAGE_SIZE, r, w, x); -+ } -+ else if(pte_newprot(*npte)){ -+ protect(fd, addr, PAGE_SIZE, r, w, x, 1); -+ } -+ *npte = pte_mkuptodate(*npte); -+ addr += PAGE_SIZE; -+ } -+ else { -+ if(force || pmd_newpage(*npmd)){ -+ err = unmap(fd, (void *) addr, PMD_SIZE); -+ if(err < 0) -+ panic("munmap failed, errno = %d\n", -+ -err); -+ pmd_mkuptodate(*npmd); -+ } -+ addr += PMD_SIZE; -+ } -+ } -+} -+ -+static void flush_kernel_vm_range(unsigned long start, unsigned long end) -+{ -+ struct mm_struct *mm; -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ unsigned long addr; -+ int updated = 0, err; -+ -+ mm = &init_mm; -+ for(addr = start_vm; addr < end_vm;){ -+ pgd = pgd_offset(mm, addr); -+ pmd = pmd_offset(pgd, addr); -+ if(pmd_present(*pmd)){ -+ pte = pte_offset(pmd, addr); -+ if(!pte_present(*pte) || pte_newpage(*pte)){ -+ updated = 1; -+ err = os_unmap_memory((void *) addr, -+ PAGE_SIZE); -+ if(err < 0) -+ panic("munmap failed, errno = %d\n", -+ -err); -+ if(pte_present(*pte)) -+ map_memory(addr, -+ pte_val(*pte) & PAGE_MASK, -+ PAGE_SIZE, 1, 1, 1); -+ } -+ else if(pte_newprot(*pte)){ -+ updated = 1; -+ protect_memory(addr, PAGE_SIZE, 1, 1, 1, 1); -+ } -+ addr += PAGE_SIZE; -+ } -+ else { -+ if(pmd_newpage(*pmd)){ -+ updated = 1; -+ err = os_unmap_memory((void *) addr, PMD_SIZE); -+ if(err < 0) -+ panic("munmap failed, errno = %d\n", -+ -err); -+ } -+ addr += PMD_SIZE; -+ } -+ } -+} -+ -+void flush_tlb_kernel_vm_skas(void) -+{ -+ flush_kernel_vm_range(start_vm, end_vm); -+} -+ -+void __flush_tlb_one_skas(unsigned long addr) -+{ -+ flush_kernel_vm_range(addr, addr + PAGE_SIZE); -+} -+ -+void flush_tlb_range_skas(struct mm_struct *mm, unsigned long start, -+ unsigned long end) -+{ -+ if(mm == NULL) -+ flush_kernel_vm_range(start, end); -+ else fix_range(mm, start, end, 0); -+} -+ -+void flush_tlb_mm_skas(struct mm_struct *mm) -+{ -+ flush_tlb_kernel_vm_skas(); -+ fix_range(mm, 0, host_task_size, 0); -+} -+ -+void force_flush_all_skas(void) -+{ -+ fix_range(current->mm, 0, host_task_size, 1); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/trap_user.c um/arch/um/kernel/skas/trap_user.c ---- orig/arch/um/kernel/skas/trap_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/trap_user.c 2002-12-15 13:28:41.000000000 -0500 -@@ -0,0 +1,65 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <signal.h> -+#include <errno.h> -+#include <asm/sigcontext.h> -+#include "sysdep/ptrace.h" -+#include "signal_user.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "task.h" -+#include "sigcontext.h" -+ -+void sig_handler_common_skas(int sig, void *sc_ptr) -+{ -+ struct sigcontext *sc = sc_ptr; -+ struct skas_regs *r; -+ struct signal_info *info; -+ int save_errno = errno; -+ -+ r = &TASK_REGS(get_current())->skas; -+ r->is_user = 0; -+ r->fault_addr = SC_FAULT_ADDR(sc); -+ r->fault_type = SC_FAULT_TYPE(sc); -+ r->trap_type = SC_TRAP_TYPE(sc); -+ -+ change_sig(SIGUSR1, 1); -+ info = &sig_info[sig]; -+ if(!info->is_irq) unblock_signals(); -+ -+ (*info->handler)(sig, (union uml_pt_regs *) r); -+ -+ errno = save_errno; -+} -+ -+extern int missed_ticks[]; -+ -+void user_signal(int sig, union uml_pt_regs *regs) -+{ -+ struct signal_info *info; -+ -+ if(sig == SIGVTALRM) -+ missed_ticks[cpu()]++; -+ regs->skas.is_user = 1; -+ regs->skas.fault_addr = 0; -+ regs->skas.fault_type = 0; -+ regs->skas.trap_type = 0; -+ info = &sig_info[sig]; -+ (*info->handler)(sig, regs); -+ -+ unblock_signals(); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/util/Makefile um/arch/um/kernel/skas/util/Makefile ---- orig/arch/um/kernel/skas/util/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/util/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,10 @@ -+all: mk_ptregs -+ -+mk_ptregs : mk_ptregs.o -+ $(CC) -o mk_ptregs mk_ptregs.o -+ -+mk_ptregs.o : mk_ptregs.c -+ $(CC) -c $< -+ -+clean : -+ $(RM) -f mk_ptregs *.o *~ -diff -Naur -X ../exclude-files orig/arch/um/kernel/skas/util/mk_ptregs.c um/arch/um/kernel/skas/util/mk_ptregs.c ---- orig/arch/um/kernel/skas/util/mk_ptregs.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/skas/util/mk_ptregs.c 2002-11-11 12:10:06.000000000 -0500 -@@ -0,0 +1,50 @@ -+#include <asm/ptrace.h> -+#include <asm/user.h> -+ -+#define PRINT_REG(name, val) printf("#define HOST_%s %d\n", (name), (val)) -+ -+int main(int argc, char **argv) -+{ -+ printf("/* Automatically generated by " -+ "arch/um/kernel/skas/util/mk_ptregs */\n"); -+ printf("\n"); -+ printf("#ifndef __SKAS_PT_REGS_\n"); -+ printf("#define __SKAS_PT_REGS_\n"); -+ printf("\n"); -+ printf("#define HOST_FRAME_SIZE %d\n", FRAME_SIZE); -+ printf("#define HOST_FP_SIZE %d\n", -+ sizeof(struct user_i387_struct) / sizeof(unsigned long)); -+ printf("#define HOST_XFP_SIZE %d\n", -+ sizeof(struct user_fxsr_struct) / sizeof(unsigned long)); -+ -+ PRINT_REG("IP", EIP); -+ PRINT_REG("SP", UESP); -+ PRINT_REG("EFLAGS", EFL); -+ PRINT_REG("EAX", EAX); -+ PRINT_REG("EBX", EBX); -+ PRINT_REG("ECX", ECX); -+ PRINT_REG("EDX", EDX); -+ PRINT_REG("ESI", ESI); -+ PRINT_REG("EDI", EDI); -+ PRINT_REG("EBP", EBP); -+ PRINT_REG("CS", CS); -+ PRINT_REG("SS", SS); -+ PRINT_REG("DS", DS); -+ PRINT_REG("FS", FS); -+ PRINT_REG("ES", ES); -+ PRINT_REG("GS", GS); -+ printf("\n"); -+ printf("#endif\n"); -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/smp.c um/arch/um/kernel/smp.c ---- orig/arch/um/kernel/smp.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/smp.c 2003-02-22 14:28:45.000000000 -0500 -@@ -0,0 +1,324 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+ -+ -+#ifdef CONFIG_SMP -+ -+#include "linux/sched.h" -+#include "linux/threads.h" -+#include "linux/interrupt.h" -+#include "asm/smp.h" -+#include "asm/processor.h" -+#include "asm/spinlock.h" -+#include "asm/softirq.h" -+#include "asm/hardirq.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "irq_user.h" -+#include "kern.h" -+#include "os.h" -+ -+/* Total count of live CPUs, set by smp_boot_cpus */ -+int smp_num_cpus = 1; -+ -+/* The 'big kernel lock' */ -+spinlock_cacheline_t kernel_flag_cacheline = {SPIN_LOCK_UNLOCKED}; -+ -+/* 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. -+ */ -+struct cpuinfo_um cpu_data[NR_CPUS]; -+ -+/* CPU online map, set by smp_boot_cpus */ -+unsigned long cpu_online_map; -+ -+atomic_t global_bh_count; -+ -+/* Set when the idlers are all forked */ -+int smp_threads_ready = 0; -+ -+/* Not used by UML */ -+unsigned char global_irq_holder = 0; -+unsigned volatile long global_irq_lock; -+ -+/* A statistic, can be a little off */ -+static int num_reschedules_sent = 0; -+ -+void smp_send_reschedule(int cpu) -+{ -+ write(cpu_data[cpu].ipi_pipe[1], "R", 1); -+ num_reschedules_sent++; -+} -+ -+static void show(char * str) -+{ -+ int cpu = smp_processor_id(); -+ -+ printk(KERN_INFO "\n%s, CPU %d:\n", str, cpu); -+} -+ -+#define MAXCOUNT 100000000 -+ -+static inline void wait_on_bh(void) -+{ -+ int count = MAXCOUNT; -+ do { -+ if (!--count) { -+ show("wait_on_bh"); -+ count = ~0; -+ } -+ /* nothing .. wait for the other bh's to go away */ -+ } while (atomic_read(&global_bh_count) != 0); -+} -+ -+/* -+ * This is called when we want to synchronize with -+ * bottom half handlers. We need to wait until -+ * no other CPU is executing any bottom half handler. -+ * -+ * Don't wait if we're already running in an interrupt -+ * context or are inside a bh handler. -+ */ -+void synchronize_bh(void) -+{ -+ if (atomic_read(&global_bh_count) && !in_interrupt()) -+ wait_on_bh(); -+} -+ -+void smp_send_stop(void) -+{ -+ int i; -+ -+ printk(KERN_INFO "Stopping all CPUs..."); -+ for(i = 0; i < ncpus; i++){ -+ if(i == current->processor) -+ continue; -+ write(cpu_data[i].ipi_pipe[1], "S", 1); -+ } -+ printk("done\n"); -+} -+ -+ -+static atomic_t smp_commenced = ATOMIC_INIT(0); -+static volatile unsigned long smp_callin_map = 0; -+ -+void smp_commence(void) -+{ -+ printk("All CPUs are go!\n"); -+ -+ wmb(); -+ atomic_set(&smp_commenced, 1); -+} -+ -+static int idle_proc(void *unused) -+{ -+ int cpu, err; -+ -+ set_current(current); -+ del_from_runqueue(current); -+ unhash_process(current); -+ -+ cpu = current->processor; -+ err = os_pipe(cpu_data[cpu].ipi_pipe, 1, 1); -+ if(err) -+ panic("CPU#%d failed to create IPI pipe, errno = %d", cpu, -+ -err); -+ -+ activate_ipi(cpu_data[cpu].ipi_pipe[0], -+ current->thread.mode.tt.extern_pid); -+ -+ wmb(); -+ if (test_and_set_bit(current->processor, &smp_callin_map)) { -+ printk("huh, CPU#%d already present??\n", current->processor); -+ BUG(); -+ } -+ -+ while (!atomic_read(&smp_commenced)) -+ cpu_relax(); -+ -+ init_idle(); -+ cpu_idle(); -+ return(0); -+} -+ -+static int idle_thread(int (*fn)(void *), int cpu) -+{ -+ struct task_struct *new_task; -+ int pid; -+ unsigned char c; -+ -+ current->thread.request.u.thread.proc = fn; -+ current->thread.request.u.thread.arg = NULL; -+ pid = do_fork(CLONE_VM | CLONE_PID, 0, NULL, 0); -+ if(pid < 0) panic("do_fork failed in idle_thread"); -+ new_task = get_task(pid, 1); -+ -+ cpu_tasks[cpu].pid = new_task->thread.mode.tt.extern_pid; -+ cpu_tasks[cpu].task = new_task; -+ init_tasks[cpu] = new_task; -+ new_task->processor = cpu; -+ new_task->cpus_allowed = 1 << cpu; -+ new_task->cpus_runnable = new_task->cpus_allowed; -+ CHOOSE_MODE(write(new_task->thread.mode.tt.switch_pipe[1], &c, -+ sizeof(c)), -+ ({ panic("skas mode doesn't support SMP"); })); -+ return(new_task->thread.mode.tt.extern_pid); -+} -+ -+void smp_boot_cpus(void) -+{ -+ int err; -+ -+ set_bit(0, &cpu_online_map); -+ set_bit(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); -+ -+ activate_ipi(cpu_data[0].ipi_pipe[0], -+ current->thread.mode.tt.extern_pid); -+ -+ if(ncpus < 1){ -+ printk(KERN_INFO "ncpus set to 1\n"); -+ ncpus = 1; -+ } -+ else if(ncpus > NR_CPUS){ -+ printk(KERN_INFO -+ "ncpus can't be greater than NR_CPUS, set to %d\n", -+ NR_CPUS); -+ ncpus = NR_CPUS; -+ } -+ -+ if(ncpus > 1){ -+ int i, pid; -+ -+ printk(KERN_INFO "Starting up other processors:\n"); -+ for(i=1;i<ncpus;i++){ -+ int waittime; -+ -+ /* Do this early, for hard_smp_processor_id() */ -+ cpu_tasks[i].pid = -1; -+ set_bit(i, &cpu_online_map); -+ smp_num_cpus++; -+ -+ pid = idle_thread(idle_proc, i); -+ printk(KERN_INFO "\t#%d - idle thread pid = %d.. ", -+ i, pid); -+ -+ waittime = 200000000; -+ while (waittime-- && !test_bit(i, &smp_callin_map)) -+ cpu_relax(); -+ -+ if (test_bit(i, &smp_callin_map)) -+ printk("online\n"); -+ else { -+ printk("failed\n"); -+ clear_bit(i, &cpu_online_map); -+ } -+ } -+ } -+} -+ -+int setup_profiling_timer(unsigned int multiplier) -+{ -+ printk(KERN_INFO "setup_profiling_timer\n"); -+ return(0); -+} -+ -+void smp_call_function_slave(int cpu); -+ -+void IPI_handler(int cpu) -+{ -+ unsigned char c; -+ int fd; -+ -+ fd = cpu_data[cpu].ipi_pipe[0]; -+ while (read(fd, &c, 1) == 1) { -+ switch (c) { -+ case 'C': -+ smp_call_function_slave(cpu); -+ break; -+ -+ case 'R': -+ current->need_resched = 1; -+ break; -+ -+ case 'S': -+ printk("CPU#%d stopping\n", cpu); -+ while(1) -+ pause(); -+ break; -+ -+ default: -+ printk("CPU#%d received unknown IPI [%c]!\n", cpu, c); -+ break; -+ } -+ } -+} -+ -+int hard_smp_processor_id(void) -+{ -+ return(pid_to_processor_id(os_getpid())); -+} -+ -+static spinlock_t call_lock = SPIN_LOCK_UNLOCKED; -+static atomic_t scf_started; -+static atomic_t scf_finished; -+static void (*func)(void *info); -+static void *info; -+ -+void smp_call_function_slave(int cpu) -+{ -+ atomic_inc(&scf_started); -+ (*func)(info); -+ atomic_inc(&scf_finished); -+} -+ -+int smp_call_function(void (*_func)(void *info), void *_info, int nonatomic, -+ int wait) -+{ -+ int cpus = smp_num_cpus - 1; -+ int i; -+ -+ if (!cpus) -+ return 0; -+ -+ spin_lock_bh(&call_lock); -+ atomic_set(&scf_started, 0); -+ atomic_set(&scf_finished, 0); -+ func = _func; -+ info = _info; -+ -+ for (i=0;i<NR_CPUS;i++) -+ if (i != current->processor && test_bit(i, &cpu_online_map)) -+ write(cpu_data[i].ipi_pipe[1], "C", 1); -+ -+ while (atomic_read(&scf_started) != cpus) -+ barrier(); -+ -+ if (wait) -+ while (atomic_read(&scf_finished) != cpus) -+ barrier(); -+ -+ spin_unlock_bh(&call_lock); -+ return 0; -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/syscall_kern.c um/arch/um/kernel/syscall_kern.c ---- orig/arch/um/kernel/syscall_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/syscall_kern.c 2002-11-08 14:04:10.000000000 -0500 -@@ -0,0 +1,343 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sched.h" -+#include "linux/file.h" -+#include "linux/smp_lock.h" -+#include "linux/mm.h" -+#include "linux/utsname.h" -+#include "linux/msg.h" -+#include "linux/shm.h" -+#include "linux/sys.h" -+#include "linux/unistd.h" -+#include "linux/slab.h" -+#include "linux/utime.h" -+#include "asm/mman.h" -+#include "asm/uaccess.h" -+#include "asm/ipc.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "sysdep/syscalls.h" -+#include "mode_kern.h" -+#include "choose-mode.h" -+ -+/* Unlocked, I don't care if this is a bit off */ -+int nsyscalls = 0; -+ -+long um_mount(char * dev_name, char * dir_name, char * type, -+ unsigned long new_flags, void * data) -+{ -+ if(type == NULL) type = ""; -+ return(sys_mount(dev_name, dir_name, type, new_flags, data)); -+} -+ -+long sys_fork(void) -+{ -+ long ret; -+ -+ current->thread.forking = 1; -+ ret = do_fork(SIGCHLD, 0, NULL, 0); -+ current->thread.forking = 0; -+ return(ret); -+} -+ -+long sys_clone(unsigned long clone_flags, unsigned long newsp) -+{ -+ long ret; -+ -+ current->thread.forking = 1; -+ ret = do_fork(clone_flags, newsp, NULL, 0); -+ current->thread.forking = 0; -+ return(ret); -+} -+ -+long sys_vfork(void) -+{ -+ long ret; -+ -+ current->thread.forking = 1; -+ ret = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, 0, NULL, 0); -+ current->thread.forking = 0; -+ return(ret); -+} -+ -+/* common code for old and new mmaps */ -+long do_mmap2(struct mm_struct *mm, unsigned long addr, unsigned long len, -+ unsigned long prot, unsigned long flags, unsigned long fd, -+ unsigned long pgoff) -+{ -+ int error = -EBADF; -+ struct file * file = NULL; -+ -+ flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); -+ if (!(flags & MAP_ANONYMOUS)) { -+ file = fget(fd); -+ if (!file) -+ goto out; -+ } -+ -+ down_write(&mm->mmap_sem); -+ error = do_mmap_pgoff(mm, file, addr, len, prot, flags, pgoff); -+ up_write(&mm->mmap_sem); -+ -+ if (file) -+ fput(file); -+ out: -+ return error; -+} -+ -+long sys_mmap2(unsigned long addr, unsigned long len, -+ unsigned long prot, unsigned long flags, -+ unsigned long fd, unsigned long pgoff) -+{ -+ return do_mmap2(current->mm, addr, len, prot, flags, fd, pgoff); -+} -+ -+/* -+ * Perform the select(nd, in, out, ex, tv) and mmap() system -+ * calls. Linux/i386 didn't use to be able to handle more than -+ * 4 system call parameters, so these system calls used a memory -+ * block for parameter passing.. -+ */ -+ -+struct mmap_arg_struct { -+ unsigned long addr; -+ unsigned long len; -+ unsigned long prot; -+ unsigned long flags; -+ unsigned long fd; -+ unsigned long offset; -+}; -+ -+int old_mmap(unsigned long addr, unsigned long len, -+ unsigned long prot, unsigned long flags, -+ unsigned long fd, unsigned long offset) -+{ -+ int err = -EINVAL; -+ if (offset & ~PAGE_MASK) -+ goto out; -+ -+ err = do_mmap2(current->mm, addr, len, prot, flags, fd, -+ offset >> PAGE_SHIFT); -+ out: -+ return err; -+} -+/* -+ * sys_pipe() is the normal C calling standard for creating -+ * a pipe. It's not the way unix traditionally does this, though. -+ */ -+int sys_pipe(unsigned long * fildes) -+{ -+ int fd[2]; -+ int error; -+ -+ error = do_pipe(fd); -+ if (!error) { -+ if (copy_to_user(fildes, fd, 2*sizeof(int))) -+ error = -EFAULT; -+ } -+ return error; -+} -+ -+int sys_pause(void) -+{ -+ current->state = TASK_INTERRUPTIBLE; -+ schedule(); -+ return -ERESTARTNOHAND; -+} -+ -+int sys_sigaction(int sig, const struct old_sigaction *act, -+ struct old_sigaction *oact) -+{ -+ struct k_sigaction new_ka, old_ka; -+ int ret; -+ -+ if (act) { -+ old_sigset_t mask; -+ if (verify_area(VERIFY_READ, act, sizeof(*act)) || -+ __get_user(new_ka.sa.sa_handler, &act->sa_handler) || -+ __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) -+ return -EFAULT; -+ __get_user(new_ka.sa.sa_flags, &act->sa_flags); -+ __get_user(mask, &act->sa_mask); -+ siginitset(&new_ka.sa.sa_mask, mask); -+ } -+ -+ ret = do_sigaction(sig, act ? &new_ka : NULL, oact ? &old_ka : NULL); -+ -+ if (!ret && oact) { -+ if (verify_area(VERIFY_WRITE, oact, sizeof(*oact)) || -+ __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || -+ __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) -+ return -EFAULT; -+ __put_user(old_ka.sa.sa_flags, &oact->sa_flags); -+ __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask); -+ } -+ -+ return ret; -+} -+ -+/* -+ * sys_ipc() is the de-multiplexer for the SysV IPC calls.. -+ * -+ * This is really horribly ugly. -+ */ -+int sys_ipc (uint call, int first, int second, -+ int third, void *ptr, long fifth) -+{ -+ int version, ret; -+ -+ version = call >> 16; /* hack for backward compatibility */ -+ call &= 0xffff; -+ -+ switch (call) { -+ case SEMOP: -+ return sys_semop (first, (struct sembuf *)ptr, second); -+ case SEMGET: -+ return sys_semget (first, second, third); -+ case SEMCTL: { -+ union semun fourth; -+ if (!ptr) -+ return -EINVAL; -+ if (get_user(fourth.__pad, (void **) ptr)) -+ return -EFAULT; -+ return sys_semctl (first, second, third, fourth); -+ } -+ -+ case MSGSND: -+ return sys_msgsnd (first, (struct msgbuf *) ptr, -+ second, third); -+ case MSGRCV: -+ switch (version) { -+ case 0: { -+ struct ipc_kludge tmp; -+ if (!ptr) -+ return -EINVAL; -+ -+ if (copy_from_user(&tmp, -+ (struct ipc_kludge *) ptr, -+ sizeof (tmp))) -+ return -EFAULT; -+ return sys_msgrcv (first, tmp.msgp, second, -+ tmp.msgtyp, third); -+ } -+ default: -+ panic("msgrcv with version != 0"); -+ return sys_msgrcv (first, -+ (struct msgbuf *) ptr, -+ second, fifth, third); -+ } -+ case MSGGET: -+ return sys_msgget ((key_t) first, second); -+ case MSGCTL: -+ return sys_msgctl (first, second, (struct msqid_ds *) ptr); -+ -+ case SHMAT: -+ switch (version) { -+ default: { -+ ulong raddr; -+ ret = sys_shmat (first, (char *) ptr, second, &raddr); -+ if (ret) -+ return ret; -+ return put_user (raddr, (ulong *) third); -+ } -+ case 1: /* iBCS2 emulator entry point */ -+ if (!segment_eq(get_fs(), get_ds())) -+ return -EINVAL; -+ return sys_shmat (first, (char *) ptr, second, (ulong *) third); -+ } -+ case SHMDT: -+ return sys_shmdt ((char *)ptr); -+ case SHMGET: -+ return sys_shmget (first, second, third); -+ case SHMCTL: -+ return sys_shmctl (first, second, -+ (struct shmid_ds *) ptr); -+ default: -+ return -EINVAL; -+ } -+} -+ -+int sys_uname(struct old_utsname * name) -+{ -+ int err; -+ if (!name) -+ return -EFAULT; -+ down_read(&uts_sem); -+ err=copy_to_user(name, &system_utsname, sizeof (*name)); -+ up_read(&uts_sem); -+ return err?-EFAULT:0; -+} -+ -+int sys_olduname(struct oldold_utsname * name) -+{ -+ int error; -+ -+ if (!name) -+ return -EFAULT; -+ if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname))) -+ return -EFAULT; -+ -+ down_read(&uts_sem); -+ -+ error = __copy_to_user(&name->sysname,&system_utsname.sysname, -+ __OLD_UTS_LEN); -+ error |= __put_user(0,name->sysname+__OLD_UTS_LEN); -+ error |= __copy_to_user(&name->nodename,&system_utsname.nodename, -+ __OLD_UTS_LEN); -+ error |= __put_user(0,name->nodename+__OLD_UTS_LEN); -+ error |= __copy_to_user(&name->release,&system_utsname.release, -+ __OLD_UTS_LEN); -+ error |= __put_user(0,name->release+__OLD_UTS_LEN); -+ error |= __copy_to_user(&name->version,&system_utsname.version, -+ __OLD_UTS_LEN); -+ error |= __put_user(0,name->version+__OLD_UTS_LEN); -+ error |= __copy_to_user(&name->machine,&system_utsname.machine, -+ __OLD_UTS_LEN); -+ error |= __put_user(0,name->machine+__OLD_UTS_LEN); -+ -+ up_read(&uts_sem); -+ -+ error = error ? -EFAULT : 0; -+ -+ return error; -+} -+ -+int sys_sigaltstack(const stack_t *uss, stack_t *uoss) -+{ -+ return(do_sigaltstack(uss, uoss, PT_REGS_SP(¤t->thread.regs))); -+} -+ -+long execute_syscall(void *r) -+{ -+ return(CHOOSE_MODE_PROC(execute_syscall_tt, execute_syscall_skas, r)); -+} -+ -+spinlock_t syscall_lock = SPIN_LOCK_UNLOCKED; -+ -+static int syscall_index = 0; -+ -+int next_syscall_index(int limit) -+{ -+ int ret; -+ -+ spin_lock(&syscall_lock); -+ ret = syscall_index; -+ if(++syscall_index == limit) -+ syscall_index = 0; -+ spin_unlock(&syscall_lock); -+ return(ret); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/sys_call_table.c um/arch/um/kernel/sys_call_table.c ---- orig/arch/um/kernel/sys_call_table.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/sys_call_table.c 2003-02-27 13:33:23.000000000 -0500 -@@ -0,0 +1,485 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/unistd.h" -+#include "linux/version.h" -+#include "linux/sys.h" -+#include "asm/signal.h" -+#include "sysdep/syscalls.h" -+#include "kern_util.h" -+ -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_exit; -+extern syscall_handler_t sys_fork; -+extern syscall_handler_t sys_creat; -+extern syscall_handler_t sys_link; -+extern syscall_handler_t sys_unlink; -+extern syscall_handler_t sys_chdir; -+extern syscall_handler_t sys_mknod; -+extern syscall_handler_t sys_chmod; -+extern syscall_handler_t sys_lchown16; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_stat; -+extern syscall_handler_t sys_getpid; -+extern syscall_handler_t sys_oldumount; -+extern syscall_handler_t sys_setuid16; -+extern syscall_handler_t sys_getuid16; -+extern syscall_handler_t sys_ptrace; -+extern syscall_handler_t sys_alarm; -+extern syscall_handler_t sys_fstat; -+extern syscall_handler_t sys_pause; -+extern syscall_handler_t sys_utime; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_access; -+extern syscall_handler_t sys_nice; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_sync; -+extern syscall_handler_t sys_kill; -+extern syscall_handler_t sys_rename; -+extern syscall_handler_t sys_mkdir; -+extern syscall_handler_t sys_rmdir; -+extern syscall_handler_t sys_pipe; -+extern syscall_handler_t sys_times; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_brk; -+extern syscall_handler_t sys_setgid16; -+extern syscall_handler_t sys_getgid16; -+extern syscall_handler_t sys_signal; -+extern syscall_handler_t sys_geteuid16; -+extern syscall_handler_t sys_getegid16; -+extern syscall_handler_t sys_acct; -+extern syscall_handler_t sys_umount; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_ioctl; -+extern syscall_handler_t sys_fcntl; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_setpgid; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_olduname; -+extern syscall_handler_t sys_umask; -+extern syscall_handler_t sys_chroot; -+extern syscall_handler_t sys_ustat; -+extern syscall_handler_t sys_dup2; -+extern syscall_handler_t sys_getppid; -+extern syscall_handler_t sys_getpgrp; -+extern syscall_handler_t sys_sigaction; -+extern syscall_handler_t sys_sgetmask; -+extern syscall_handler_t sys_ssetmask; -+extern syscall_handler_t sys_setreuid16; -+extern syscall_handler_t sys_setregid16; -+extern syscall_handler_t sys_sigsuspend; -+extern syscall_handler_t sys_sigpending; -+extern syscall_handler_t sys_sethostname; -+extern syscall_handler_t sys_setrlimit; -+extern syscall_handler_t sys_old_getrlimit; -+extern syscall_handler_t sys_getrusage; -+extern syscall_handler_t sys_gettimeofday; -+extern syscall_handler_t sys_settimeofday; -+extern syscall_handler_t sys_getgroups16; -+extern syscall_handler_t sys_setgroups16; -+extern syscall_handler_t sys_symlink; -+extern syscall_handler_t sys_lstat; -+extern syscall_handler_t sys_readlink; -+extern syscall_handler_t sys_uselib; -+extern syscall_handler_t sys_swapon; -+extern syscall_handler_t sys_reboot; -+extern syscall_handler_t old_readdir; -+extern syscall_handler_t sys_munmap; -+extern syscall_handler_t sys_truncate; -+extern syscall_handler_t sys_ftruncate; -+extern syscall_handler_t sys_fchmod; -+extern syscall_handler_t sys_fchown16; -+extern syscall_handler_t sys_getpriority; -+extern syscall_handler_t sys_setpriority; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_statfs; -+extern syscall_handler_t sys_fstatfs; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_socketcall; -+extern syscall_handler_t sys_syslog; -+extern syscall_handler_t sys_setitimer; -+extern syscall_handler_t sys_getitimer; -+extern syscall_handler_t sys_newstat; -+extern syscall_handler_t sys_newlstat; -+extern syscall_handler_t sys_newfstat; -+extern syscall_handler_t sys_uname; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_vhangup; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_swapoff; -+extern syscall_handler_t sys_sysinfo; -+extern syscall_handler_t sys_ipc; -+extern syscall_handler_t sys_fsync; -+extern syscall_handler_t sys_sigreturn; -+extern syscall_handler_t sys_rt_sigreturn; -+extern syscall_handler_t sys_clone; -+extern syscall_handler_t sys_setdomainname; -+extern syscall_handler_t sys_newuname; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_adjtimex; -+extern syscall_handler_t sys_mprotect; -+extern syscall_handler_t sys_sigprocmask; -+extern syscall_handler_t sys_create_module; -+extern syscall_handler_t sys_init_module; -+extern syscall_handler_t sys_delete_module; -+extern syscall_handler_t sys_get_kernel_syms; -+extern syscall_handler_t sys_quotactl; -+extern syscall_handler_t sys_getpgid; -+extern syscall_handler_t sys_fchdir; -+extern syscall_handler_t sys_bdflush; -+extern syscall_handler_t sys_sysfs; -+extern syscall_handler_t sys_personality; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_setfsuid16; -+extern syscall_handler_t sys_setfsgid16; -+extern syscall_handler_t sys_llseek; -+extern syscall_handler_t sys_getdents; -+extern syscall_handler_t sys_flock; -+extern syscall_handler_t sys_msync; -+extern syscall_handler_t sys_readv; -+extern syscall_handler_t sys_writev; -+extern syscall_handler_t sys_getsid; -+extern syscall_handler_t sys_fdatasync; -+extern syscall_handler_t sys_sysctl; -+extern syscall_handler_t sys_mlock; -+extern syscall_handler_t sys_munlock; -+extern syscall_handler_t sys_mlockall; -+extern syscall_handler_t sys_munlockall; -+extern syscall_handler_t sys_sched_setparam; -+extern syscall_handler_t sys_sched_getparam; -+extern syscall_handler_t sys_sched_setscheduler; -+extern syscall_handler_t sys_sched_getscheduler; -+extern syscall_handler_t sys_sched_get_priority_max; -+extern syscall_handler_t sys_sched_get_priority_min; -+extern syscall_handler_t sys_sched_rr_get_interval; -+extern syscall_handler_t sys_nanosleep; -+extern syscall_handler_t sys_mremap; -+extern syscall_handler_t sys_setresuid16; -+extern syscall_handler_t sys_getresuid16; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_query_module; -+extern syscall_handler_t sys_poll; -+extern syscall_handler_t sys_nfsservctl; -+extern syscall_handler_t sys_setresgid16; -+extern syscall_handler_t sys_getresgid16; -+extern syscall_handler_t sys_prctl; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_rt_sigaction; -+extern syscall_handler_t sys_rt_sigprocmask; -+extern syscall_handler_t sys_rt_sigpending; -+extern syscall_handler_t sys_rt_sigtimedwait; -+extern syscall_handler_t sys_rt_sigqueueinfo; -+extern syscall_handler_t sys_rt_sigsuspend; -+extern syscall_handler_t sys_pread; -+extern syscall_handler_t sys_pwrite; -+extern syscall_handler_t sys_chown16; -+extern syscall_handler_t sys_getcwd; -+extern syscall_handler_t sys_capget; -+extern syscall_handler_t sys_capset; -+extern syscall_handler_t sys_sigaltstack; -+extern syscall_handler_t sys_sendfile; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_ni_syscall; -+extern syscall_handler_t sys_vfork; -+extern syscall_handler_t sys_getrlimit; -+extern syscall_handler_t sys_mmap2; -+extern syscall_handler_t sys_truncate64; -+extern syscall_handler_t sys_ftruncate64; -+extern syscall_handler_t sys_stat64; -+extern syscall_handler_t sys_lstat64; -+extern syscall_handler_t sys_fstat64; -+extern syscall_handler_t sys_lchown; -+extern syscall_handler_t sys_getuid; -+extern syscall_handler_t sys_getgid; -+extern syscall_handler_t sys_geteuid; -+extern syscall_handler_t sys_getegid; -+extern syscall_handler_t sys_setreuid; -+extern syscall_handler_t sys_setregid; -+extern syscall_handler_t sys_getgroups; -+extern syscall_handler_t sys_setgroups; -+extern syscall_handler_t sys_fchown; -+extern syscall_handler_t sys_setresuid; -+extern syscall_handler_t sys_getresuid; -+extern syscall_handler_t sys_setresgid; -+extern syscall_handler_t sys_getresgid; -+extern syscall_handler_t sys_chown; -+extern syscall_handler_t sys_setuid; -+extern syscall_handler_t sys_setgid; -+extern syscall_handler_t sys_setfsuid; -+extern syscall_handler_t sys_setfsgid; -+extern syscall_handler_t sys_pivot_root; -+extern syscall_handler_t sys_mincore; -+extern syscall_handler_t sys_madvise; -+extern syscall_handler_t sys_fcntl64; -+extern syscall_handler_t sys_getdents64; -+extern syscall_handler_t sys_gettid; -+extern syscall_handler_t sys_readahead; -+extern syscall_handler_t sys_tkill; -+extern syscall_handler_t sys_setxattr; -+extern syscall_handler_t sys_lsetxattr; -+extern syscall_handler_t sys_fsetxattr; -+extern syscall_handler_t sys_getxattr; -+extern syscall_handler_t sys_lgetxattr; -+extern syscall_handler_t sys_fgetxattr; -+extern syscall_handler_t sys_listxattr; -+extern syscall_handler_t sys_llistxattr; -+extern syscall_handler_t sys_flistxattr; -+extern syscall_handler_t sys_removexattr; -+extern syscall_handler_t sys_lremovexattr; -+extern syscall_handler_t sys_fremovexattr; -+ -+extern syscall_handler_t um_mount; -+extern syscall_handler_t um_time; -+extern syscall_handler_t um_stime; -+ -+#define LAST_GENERIC_SYSCALL __NR_sched_getaffinity -+ -+#if LAST_GENERIC_SYSCALL > LAST_ARCH_SYSCALL -+#define LAST_SYSCALL LAST_GENERIC_SYSCALL -+#else -+#define LAST_SYSCALL LAST_ARCH_SYSCALL -+#endif -+ -+syscall_handler_t *sys_call_table[] = { -+ [ 0 ] = sys_ni_syscall, -+ [ __NR_exit ] = sys_exit, -+ [ __NR_fork ] = sys_fork, -+ [ __NR_read ] = (syscall_handler_t *) sys_read, -+ [ __NR_write ] = (syscall_handler_t *) sys_write, -+ -+ /* These three are declared differently in asm/unistd.h */ -+ [ __NR_open ] = (syscall_handler_t *) sys_open, -+ [ __NR_close ] = (syscall_handler_t *) sys_close, -+ [ __NR_waitpid ] = (syscall_handler_t *) sys_waitpid, -+ [ __NR_creat ] = sys_creat, -+ [ __NR_link ] = sys_link, -+ [ __NR_unlink ] = sys_unlink, -+ -+ /* declared differently in kern_util.h */ -+ [ __NR_execve ] = (syscall_handler_t *) sys_execve, -+ [ __NR_chdir ] = sys_chdir, -+ [ __NR_time ] = um_time, -+ [ __NR_mknod ] = sys_mknod, -+ [ __NR_chmod ] = sys_chmod, -+ [ __NR_lchown ] = sys_lchown16, -+ [ __NR_break ] = sys_ni_syscall, -+ [ __NR_oldstat ] = sys_stat, -+ [ __NR_lseek ] = (syscall_handler_t *) sys_lseek, -+ [ __NR_getpid ] = sys_getpid, -+ [ __NR_mount ] = um_mount, -+ [ __NR_umount ] = sys_oldumount, -+ [ __NR_setuid ] = sys_setuid16, -+ [ __NR_getuid ] = sys_getuid16, -+ [ __NR_stime ] = um_stime, -+ [ __NR_ptrace ] = sys_ptrace, -+ [ __NR_alarm ] = sys_alarm, -+ [ __NR_oldfstat ] = sys_fstat, -+ [ __NR_pause ] = sys_pause, -+ [ __NR_utime ] = sys_utime, -+ [ __NR_stty ] = sys_ni_syscall, -+ [ __NR_gtty ] = sys_ni_syscall, -+ [ __NR_access ] = sys_access, -+ [ __NR_nice ] = sys_nice, -+ [ __NR_ftime ] = sys_ni_syscall, -+ [ __NR_sync ] = sys_sync, -+ [ __NR_kill ] = sys_kill, -+ [ __NR_rename ] = sys_rename, -+ [ __NR_mkdir ] = sys_mkdir, -+ [ __NR_rmdir ] = sys_rmdir, -+ -+ /* Declared differently in asm/unistd.h */ -+ [ __NR_dup ] = (syscall_handler_t *) sys_dup, -+ [ __NR_pipe ] = sys_pipe, -+ [ __NR_times ] = sys_times, -+ [ __NR_prof ] = sys_ni_syscall, -+ [ __NR_brk ] = sys_brk, -+ [ __NR_setgid ] = sys_setgid16, -+ [ __NR_getgid ] = sys_getgid16, -+ [ __NR_signal ] = sys_signal, -+ [ __NR_geteuid ] = sys_geteuid16, -+ [ __NR_getegid ] = sys_getegid16, -+ [ __NR_acct ] = sys_acct, -+ [ __NR_umount2 ] = sys_umount, -+ [ __NR_lock ] = sys_ni_syscall, -+ [ __NR_ioctl ] = sys_ioctl, -+ [ __NR_fcntl ] = sys_fcntl, -+ [ __NR_mpx ] = sys_ni_syscall, -+ [ __NR_setpgid ] = sys_setpgid, -+ [ __NR_ulimit ] = sys_ni_syscall, -+ [ __NR_oldolduname ] = sys_olduname, -+ [ __NR_umask ] = sys_umask, -+ [ __NR_chroot ] = sys_chroot, -+ [ __NR_ustat ] = sys_ustat, -+ [ __NR_dup2 ] = sys_dup2, -+ [ __NR_getppid ] = sys_getppid, -+ [ __NR_getpgrp ] = sys_getpgrp, -+ [ __NR_setsid ] = (syscall_handler_t *) sys_setsid, -+ [ __NR_sigaction ] = sys_sigaction, -+ [ __NR_sgetmask ] = sys_sgetmask, -+ [ __NR_ssetmask ] = sys_ssetmask, -+ [ __NR_setreuid ] = sys_setreuid16, -+ [ __NR_setregid ] = sys_setregid16, -+ [ __NR_sigsuspend ] = sys_sigsuspend, -+ [ __NR_sigpending ] = sys_sigpending, -+ [ __NR_sethostname ] = sys_sethostname, -+ [ __NR_setrlimit ] = sys_setrlimit, -+ [ __NR_getrlimit ] = sys_old_getrlimit, -+ [ __NR_getrusage ] = sys_getrusage, -+ [ __NR_gettimeofday ] = sys_gettimeofday, -+ [ __NR_settimeofday ] = sys_settimeofday, -+ [ __NR_getgroups ] = sys_getgroups16, -+ [ __NR_setgroups ] = sys_setgroups16, -+ [ __NR_symlink ] = sys_symlink, -+ [ __NR_oldlstat ] = sys_lstat, -+ [ __NR_readlink ] = sys_readlink, -+ [ __NR_uselib ] = sys_uselib, -+ [ __NR_swapon ] = sys_swapon, -+ [ __NR_reboot ] = sys_reboot, -+ [ __NR_readdir ] = old_readdir, -+ [ __NR_munmap ] = sys_munmap, -+ [ __NR_truncate ] = sys_truncate, -+ [ __NR_ftruncate ] = sys_ftruncate, -+ [ __NR_fchmod ] = sys_fchmod, -+ [ __NR_fchown ] = sys_fchown16, -+ [ __NR_getpriority ] = sys_getpriority, -+ [ __NR_setpriority ] = sys_setpriority, -+ [ __NR_profil ] = sys_ni_syscall, -+ [ __NR_statfs ] = sys_statfs, -+ [ __NR_fstatfs ] = sys_fstatfs, -+ [ __NR_ioperm ] = sys_ni_syscall, -+ [ __NR_socketcall ] = sys_socketcall, -+ [ __NR_syslog ] = sys_syslog, -+ [ __NR_setitimer ] = sys_setitimer, -+ [ __NR_getitimer ] = sys_getitimer, -+ [ __NR_stat ] = sys_newstat, -+ [ __NR_lstat ] = sys_newlstat, -+ [ __NR_fstat ] = sys_newfstat, -+ [ __NR_olduname ] = sys_uname, -+ [ __NR_iopl ] = sys_ni_syscall, -+ [ __NR_vhangup ] = sys_vhangup, -+ [ __NR_idle ] = sys_ni_syscall, -+ [ __NR_wait4 ] = (syscall_handler_t *) sys_wait4, -+ [ __NR_swapoff ] = sys_swapoff, -+ [ __NR_sysinfo ] = sys_sysinfo, -+ [ __NR_ipc ] = sys_ipc, -+ [ __NR_fsync ] = sys_fsync, -+ [ __NR_sigreturn ] = sys_sigreturn, -+ [ __NR_clone ] = sys_clone, -+ [ __NR_setdomainname ] = sys_setdomainname, -+ [ __NR_uname ] = sys_newuname, -+ [ __NR_adjtimex ] = sys_adjtimex, -+ [ __NR_mprotect ] = sys_mprotect, -+ [ __NR_sigprocmask ] = sys_sigprocmask, -+ [ __NR_create_module ] = sys_create_module, -+ [ __NR_init_module ] = sys_init_module, -+ [ __NR_delete_module ] = sys_delete_module, -+ [ __NR_get_kernel_syms ] = sys_get_kernel_syms, -+ [ __NR_quotactl ] = sys_quotactl, -+ [ __NR_getpgid ] = sys_getpgid, -+ [ __NR_fchdir ] = sys_fchdir, -+ [ __NR_bdflush ] = sys_bdflush, -+ [ __NR_sysfs ] = sys_sysfs, -+ [ __NR_personality ] = sys_personality, -+ [ __NR_afs_syscall ] = sys_ni_syscall, -+ [ __NR_setfsuid ] = sys_setfsuid16, -+ [ __NR_setfsgid ] = sys_setfsgid16, -+ [ __NR__llseek ] = sys_llseek, -+ [ __NR_getdents ] = sys_getdents, -+ [ __NR__newselect ] = (syscall_handler_t *) sys_select, -+ [ __NR_flock ] = sys_flock, -+ [ __NR_msync ] = sys_msync, -+ [ __NR_readv ] = sys_readv, -+ [ __NR_writev ] = sys_writev, -+ [ __NR_getsid ] = sys_getsid, -+ [ __NR_fdatasync ] = sys_fdatasync, -+ [ __NR__sysctl ] = sys_sysctl, -+ [ __NR_mlock ] = sys_mlock, -+ [ __NR_munlock ] = sys_munlock, -+ [ __NR_mlockall ] = sys_mlockall, -+ [ __NR_munlockall ] = sys_munlockall, -+ [ __NR_sched_setparam ] = sys_sched_setparam, -+ [ __NR_sched_getparam ] = sys_sched_getparam, -+ [ __NR_sched_setscheduler ] = sys_sched_setscheduler, -+ [ __NR_sched_getscheduler ] = sys_sched_getscheduler, -+ [ __NR_sched_yield ] = (syscall_handler_t *) yield, -+ [ __NR_sched_get_priority_max ] = sys_sched_get_priority_max, -+ [ __NR_sched_get_priority_min ] = sys_sched_get_priority_min, -+ [ __NR_sched_rr_get_interval ] = sys_sched_rr_get_interval, -+ [ __NR_nanosleep ] = sys_nanosleep, -+ [ __NR_mremap ] = sys_mremap, -+ [ __NR_setresuid ] = sys_setresuid16, -+ [ __NR_getresuid ] = sys_getresuid16, -+ [ __NR_vm86 ] = sys_ni_syscall, -+ [ __NR_query_module ] = sys_query_module, -+ [ __NR_poll ] = sys_poll, -+ [ __NR_nfsservctl ] = sys_nfsservctl, -+ [ __NR_setresgid ] = sys_setresgid16, -+ [ __NR_getresgid ] = sys_getresgid16, -+ [ __NR_prctl ] = sys_prctl, -+ [ __NR_rt_sigreturn ] = sys_rt_sigreturn, -+ [ __NR_rt_sigaction ] = sys_rt_sigaction, -+ [ __NR_rt_sigprocmask ] = sys_rt_sigprocmask, -+ [ __NR_rt_sigpending ] = sys_rt_sigpending, -+ [ __NR_rt_sigtimedwait ] = sys_rt_sigtimedwait, -+ [ __NR_rt_sigqueueinfo ] = sys_rt_sigqueueinfo, -+ [ __NR_rt_sigsuspend ] = sys_rt_sigsuspend, -+ [ __NR_pread ] = sys_pread, -+ [ __NR_pwrite ] = sys_pwrite, -+ [ __NR_chown ] = sys_chown16, -+ [ __NR_getcwd ] = sys_getcwd, -+ [ __NR_capget ] = sys_capget, -+ [ __NR_capset ] = sys_capset, -+ [ __NR_sigaltstack ] = sys_sigaltstack, -+ [ __NR_sendfile ] = sys_sendfile, -+ [ __NR_getpmsg ] = sys_ni_syscall, -+ [ __NR_putpmsg ] = sys_ni_syscall, -+ [ __NR_vfork ] = sys_vfork, -+ [ __NR_ugetrlimit ] = sys_getrlimit, -+ [ __NR_mmap2 ] = sys_mmap2, -+ [ __NR_truncate64 ] = sys_truncate64, -+ [ __NR_ftruncate64 ] = sys_ftruncate64, -+ [ __NR_stat64 ] = sys_stat64, -+ [ __NR_lstat64 ] = sys_lstat64, -+ [ __NR_fstat64 ] = sys_fstat64, -+ [ __NR_fcntl64 ] = sys_fcntl64, -+ [ __NR_getdents64 ] = sys_getdents64, -+ [ __NR_security ] = sys_ni_syscall, -+ [ __NR_gettid ] = sys_gettid, -+ [ __NR_readahead ] = sys_readahead, -+ [ __NR_setxattr ] = sys_setxattr, -+ [ __NR_lsetxattr ] = sys_lsetxattr, -+ [ __NR_fsetxattr ] = sys_fsetxattr, -+ [ __NR_getxattr ] = sys_getxattr, -+ [ __NR_lgetxattr ] = sys_lgetxattr, -+ [ __NR_fgetxattr ] = sys_fgetxattr, -+ [ __NR_listxattr ] = sys_listxattr, -+ [ __NR_llistxattr ] = sys_llistxattr, -+ [ __NR_flistxattr ] = sys_flistxattr, -+ [ __NR_removexattr ] = sys_removexattr, -+ [ __NR_lremovexattr ] = sys_lremovexattr, -+ [ __NR_fremovexattr ] = sys_fremovexattr, -+ [ __NR_tkill ] = sys_tkill, -+ [ __NR_sendfile64 ] = sys_ni_syscall, -+ [ __NR_futex ] = sys_ni_syscall, -+ [ __NR_sched_setaffinity ] = sys_ni_syscall, -+ [ __NR_sched_getaffinity ] = sys_ni_syscall, -+ -+ ARCH_SYSCALLS -+ [ LAST_SYSCALL + 1 ... NR_syscalls ] = -+ (syscall_handler_t *) sys_ni_syscall -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/syscall_user.c um/arch/um/kernel/syscall_user.c ---- orig/arch/um/kernel/syscall_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/syscall_user.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,48 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <sys/time.h> -+#include "kern_util.h" -+#include "syscall_user.h" -+ -+struct { -+ int syscall; -+ int pid; -+ int result; -+ struct timeval start; -+ struct timeval end; -+} syscall_record[1024]; -+ -+int record_syscall_start(int syscall) -+{ -+ int max, index; -+ -+ max = sizeof(syscall_record)/sizeof(syscall_record[0]); -+ index = next_syscall_index(max); -+ -+ syscall_record[index].syscall = syscall; -+ syscall_record[index].pid = current_pid(); -+ syscall_record[index].result = 0xdeadbeef; -+ gettimeofday(&syscall_record[index].start, NULL); -+ return(index); -+} -+ -+void record_syscall_end(int index, int result) -+{ -+ syscall_record[index].result = result; -+ gettimeofday(&syscall_record[index].end, NULL); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/sysrq.c um/arch/um/kernel/sysrq.c ---- orig/arch/um/kernel/sysrq.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/sysrq.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,98 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sched.h" -+#include "linux/kernel.h" -+#include "linux/module.h" -+#include "asm/page.h" -+#include "asm/processor.h" -+#include "sysrq.h" -+#include "user_util.h" -+ -+ /* -+ * If the address is either in the .text section of the -+ * kernel, or in the vmalloc'ed module regions, it *may* -+ * be the address of a calling routine -+ */ -+ -+#ifdef CONFIG_MODULES -+ -+extern struct module *module_list; -+extern struct module kernel_module; -+ -+static inline int kernel_text_address(unsigned long addr) -+{ -+ int retval = 0; -+ struct module *mod; -+ -+ if (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext) -+ return 1; -+ -+ for (mod = module_list; mod != &kernel_module; mod = mod->next) { -+ /* mod_bound tests for addr being inside the vmalloc'ed -+ * module area. Of course it'd be better to test only -+ * for the .text subset... */ -+ if (mod_bound(addr, 0, mod)) { -+ retval = 1; -+ break; -+ } -+ } -+ -+ return retval; -+} -+ -+#else -+ -+static inline int kernel_text_address(unsigned long addr) -+{ -+ return (addr >= (unsigned long) &_stext && -+ addr <= (unsigned long) &_etext); -+} -+ -+#endif -+ -+void show_trace(unsigned long * stack) -+{ -+ int i; -+ unsigned long addr; -+ -+ if (!stack) -+ stack = (unsigned long*) &stack; -+ -+ printk("Call Trace: "); -+ i = 1; -+ while (((long) stack & (THREAD_SIZE-1)) != 0) { -+ addr = *stack++; -+ if (kernel_text_address(addr)) { -+ if (i && ((i % 6) == 0)) -+ printk("\n "); -+ printk("[<%08lx>] ", addr); -+ i++; -+ } -+ } -+ printk("\n"); -+} -+ -+void show_trace_task(struct task_struct *tsk) -+{ -+ unsigned long esp = PT_REGS_SP(&tsk->thread.regs); -+ -+ /* User space on another CPU? */ -+ if ((esp ^ (unsigned long)tsk) & (PAGE_MASK<<1)) -+ return; -+ show_trace((unsigned long *)esp); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tempfile.c um/arch/um/kernel/tempfile.c ---- orig/arch/um/kernel/tempfile.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tempfile.c 2003-01-17 23:16:19.000000000 -0500 -@@ -0,0 +1,80 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <string.h> -+#include <errno.h> -+#include <sys/param.h> -+#include "init.h" -+ -+/* Modified from create_mem_file and start_debugger */ -+static char *tempdir = NULL; -+ -+static void __init find_tempdir(void) -+{ -+ char *dirs[] = { "TMP", "TEMP", "TMPDIR", NULL }; -+ int i; -+ char *dir = NULL; -+ -+ if(tempdir != NULL) return; /* We've already been called */ -+ for(i = 0; dirs[i]; i++){ -+ dir = getenv(dirs[i]); -+ if((dir != NULL) && (*dir != '\0')) -+ break; -+ } -+ if((dir == NULL) || (*dir == '\0')) -+ dir = "/tmp"; -+ -+ tempdir = malloc(strlen(dir) + 2); -+ if(tempdir == NULL){ -+ fprintf(stderr, "Failed to malloc tempdir, " -+ "errno = %d\n", errno); -+ return; -+ } -+ strcpy(tempdir, dir); -+ strcat(tempdir, "/"); -+} -+ -+int make_tempfile(const char *template, char **out_tempname, int do_unlink) -+{ -+ char tempname[MAXPATHLEN]; -+ int fd; -+ -+ find_tempdir(); -+ if (*template != '/') -+ strcpy(tempname, tempdir); -+ else -+ *tempname = 0; -+ strcat(tempname, template); -+ if((fd = mkstemp(tempname)) < 0){ -+ fprintf(stderr, "open - cannot create %s: %s\n", tempname, -+ strerror(errno)); -+ return -1; -+ } -+ if(do_unlink && (unlink(tempname) < 0)){ -+ perror("unlink"); -+ return -1; -+ } -+ if(out_tempname){ -+ if((*out_tempname = strdup(tempname)) == NULL){ -+ perror("strdup"); -+ return -1; -+ } -+ } -+ return(fd); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/time.c um/arch/um/kernel/time.c ---- orig/arch/um/kernel/time.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/time.c 2003-04-23 20:45:19.000000000 -0400 -@@ -0,0 +1,127 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <time.h> -+#include <sys/time.h> -+#include <signal.h> -+#include <errno.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "process.h" -+#include "signal_user.h" -+#include "time_user.h" -+ -+extern struct timeval xtime; -+ -+struct timeval local_offset = { 0, 0 }; -+ -+void timer(void) -+{ -+ gettimeofday(&xtime, NULL); -+ timeradd(&xtime, &local_offset, &xtime); -+} -+ -+void set_interval(int timer_type) -+{ -+ int usec = 1000000/hz(); -+ struct itimerval interval = ((struct itimerval) { { 0, usec }, -+ { 0, usec } }); -+ -+ if(setitimer(timer_type, &interval, NULL) == -1) -+ panic("setitimer failed - errno = %d\n", errno); -+} -+ -+void enable_timer(void) -+{ -+ int usec = 1000000/hz(); -+ struct itimerval enable = ((struct itimerval) { { 0, usec }, -+ { 0, usec }}); -+ if(setitimer(ITIMER_VIRTUAL, &enable, NULL)) -+ printk("enable_timer - setitimer failed, errno = %d\n", -+ errno); -+} -+ -+void switch_timers(int to_real) -+{ -+ struct itimerval disable = ((struct itimerval) { { 0, 0 }, { 0, 0 }}); -+ struct itimerval enable = ((struct itimerval) { { 0, 1000000/hz() }, -+ { 0, 1000000/hz() }}); -+ int old, new; -+ -+ if(to_real){ -+ old = ITIMER_VIRTUAL; -+ new = ITIMER_REAL; -+ } -+ else { -+ old = ITIMER_REAL; -+ new = ITIMER_VIRTUAL; -+ } -+ -+ if((setitimer(old, &disable, NULL) < 0) || -+ (setitimer(new, &enable, NULL))) -+ printk("switch_timers - setitimer failed, errno = %d\n", -+ errno); -+} -+ -+void idle_timer(void) -+{ -+ if(signal(SIGVTALRM, SIG_IGN) == SIG_ERR) -+ panic("Couldn't unset SIGVTALRM handler"); -+ -+ set_handler(SIGALRM, (__sighandler_t) alarm_handler, -+ SA_RESTART, SIGUSR1, SIGIO, SIGWINCH, SIGVTALRM, -1); -+ set_interval(ITIMER_REAL); -+} -+ -+void time_init(void) -+{ -+ if(signal(SIGVTALRM, boot_timer_handler) == SIG_ERR) -+ panic("Couldn't set SIGVTALRM handler"); -+ set_interval(ITIMER_VIRTUAL); -+} -+ -+void do_gettimeofday(struct timeval *tv) -+{ -+ unsigned long flags; -+ -+ flags = time_lock(); -+ gettimeofday(tv, NULL); -+ timeradd(tv, &local_offset, tv); -+ time_unlock(flags); -+} -+ -+void do_settimeofday(struct timeval *tv) -+{ -+ struct timeval now; -+ unsigned long flags; -+ -+ flags = time_lock(); -+ gettimeofday(&now, NULL); -+ timersub(tv, &now, &local_offset); -+ time_unlock(flags); -+} -+ -+void idle_sleep(int secs) -+{ -+ struct timespec ts; -+ -+ ts.tv_sec = secs; -+ ts.tv_nsec = 0; -+ nanosleep(&ts, NULL); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/time_kern.c um/arch/um/kernel/time_kern.c ---- orig/arch/um/kernel/time_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/time_kern.c 2003-04-23 22:19:08.000000000 -0400 -@@ -0,0 +1,172 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/kernel.h" -+#include "linux/unistd.h" -+#include "linux/stddef.h" -+#include "linux/spinlock.h" -+#include "linux/sched.h" -+#include "linux/interrupt.h" -+#include "linux/init.h" -+#include "linux/delay.h" -+#include "asm/irq.h" -+#include "asm/param.h" -+#include "asm/current.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "time_user.h" -+#include "mode.h" -+ -+extern rwlock_t xtime_lock; -+ -+int hz(void) -+{ -+ return(HZ); -+} -+ -+/* Changed at early boot */ -+int timer_irq_inited = 0; -+ -+/* missed_ticks will be modified after kernel memory has been -+ * write-protected, so this puts it in a section which will be left -+ * write-enabled. -+ */ -+int __attribute__ ((__section__ (".unprotected"))) missed_ticks[NR_CPUS]; -+ -+void timer_irq(union uml_pt_regs *regs) -+{ -+ int cpu = current->processor, ticks = missed_ticks[cpu]; -+ -+ if(!timer_irq_inited) return; -+ missed_ticks[cpu] = 0; -+ while(ticks--) do_IRQ(TIMER_IRQ, regs); -+} -+ -+void boot_timer_handler(int sig) -+{ -+ struct pt_regs regs; -+ -+ CHOOSE_MODE((void) -+ (UPT_SC(®s.regs) = (struct sigcontext *) (&sig + 1)), -+ (void) (regs.regs.skas.is_user = 0)); -+ do_timer(®s); -+} -+ -+void um_timer(int irq, void *dev, struct pt_regs *regs) -+{ -+ do_timer(regs); -+ write_lock(&xtime_lock); -+ vxtime_lock(); -+ timer(); -+ vxtime_unlock(); -+ write_unlock(&xtime_lock); -+} -+ -+long um_time(int * tloc) -+{ -+ struct timeval now; -+ -+ do_gettimeofday(&now); -+ if (tloc) { -+ if (put_user(now.tv_sec,tloc)) -+ now.tv_sec = -EFAULT; -+ } -+ return now.tv_sec; -+} -+ -+long um_stime(int * tptr) -+{ -+ int value; -+ struct timeval new; -+ -+ if (get_user(value, tptr)) -+ return -EFAULT; -+ new.tv_sec = value; -+ new.tv_usec = 0; -+ do_settimeofday(&new); -+ return 0; -+} -+ -+/* XXX Needs to be moved under sys-i386 */ -+void __delay(um_udelay_t time) -+{ -+ /* Stolen from the i386 __loop_delay */ -+ int d0; -+ __asm__ __volatile__( -+ "\tjmp 1f\n" -+ ".align 16\n" -+ "1:\tjmp 2f\n" -+ ".align 16\n" -+ "2:\tdecl %0\n\tjns 2b" -+ :"=&a" (d0) -+ :"0" (time)); -+} -+ -+void __udelay(um_udelay_t usecs) -+{ -+ int i, n; -+ -+ n = (loops_per_jiffy * HZ * usecs) / 1000000; -+ for(i=0;i<n;i++) ; -+} -+ -+void __const_udelay(um_udelay_t usecs) -+{ -+ int i, n; -+ -+ n = (loops_per_jiffy * HZ * usecs) / 1000000; -+ for(i=0;i<n;i++) ; -+} -+ -+void timer_handler(int sig, union uml_pt_regs *regs) -+{ -+#ifdef CONFIG_SMP -+ update_process_times(user_context(UPT_SP(regs))); -+#endif -+ if(current->processor == 0) -+ timer_irq(regs); -+} -+ -+static spinlock_t timer_spinlock = SPIN_LOCK_UNLOCKED; -+ -+unsigned long time_lock(void) -+{ -+ unsigned long flags; -+ -+ spin_lock_irqsave(&timer_spinlock, flags); -+ return(flags); -+} -+ -+void time_unlock(unsigned long flags) -+{ -+ spin_unlock_irqrestore(&timer_spinlock, flags); -+} -+ -+int __init timer_init(void) -+{ -+ int err; -+ -+ CHOOSE_MODE(user_time_init_tt(), user_time_init_skas()); -+ if((err = request_irq(TIMER_IRQ, um_timer, SA_INTERRUPT, "timer", -+ NULL)) != 0) -+ printk(KERN_ERR "timer_init : request_irq failed - " -+ "errno = %d\n", -err); -+ timer_irq_inited = 1; -+ return(0); -+} -+ -+__initcall(timer_init); -+ -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tlb.c um/arch/um/kernel/tlb.c ---- orig/arch/um/kernel/tlb.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tlb.c 2002-10-23 22:15:51.000000000 -0400 -@@ -0,0 +1,80 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/mm.h" -+#include "asm/page.h" -+#include "asm/pgalloc.h" -+#include "choose-mode.h" -+#include "mode_kern.h" -+ -+void flush_tlb_page(struct vm_area_struct *vma, unsigned long address) -+{ -+ address &= PAGE_MASK; -+ flush_tlb_range(vma->vm_mm, address, address + PAGE_SIZE); -+} -+ -+void flush_tlb_all(void) -+{ -+ flush_tlb_mm(current->mm); -+} -+ -+void flush_tlb_kernel_vm(void) -+{ -+ CHOOSE_MODE(flush_tlb_kernel_vm_tt(), flush_tlb_kernel_vm_skas()); -+} -+ -+void __flush_tlb_one(unsigned long addr) -+{ -+ CHOOSE_MODE_PROC(__flush_tlb_one_tt, __flush_tlb_one_skas, addr); -+} -+ -+void flush_tlb_range(struct mm_struct *mm, unsigned long start, -+ unsigned long end) -+{ -+ CHOOSE_MODE_PROC(flush_tlb_range_tt, flush_tlb_range_skas, mm, start, -+ end); -+} -+ -+void flush_tlb_mm(struct mm_struct *mm) -+{ -+ CHOOSE_MODE_PROC(flush_tlb_mm_tt, flush_tlb_mm_skas, mm); -+} -+ -+void force_flush_all(void) -+{ -+ CHOOSE_MODE(force_flush_all_tt(), force_flush_all_skas()); -+} -+ -+ -+pgd_t *pgd_offset_proc(struct mm_struct *mm, unsigned long address) -+{ -+ return(pgd_offset(mm, address)); -+} -+ -+pmd_t *pmd_offset_proc(pgd_t *pgd, unsigned long address) -+{ -+ return(pmd_offset(pgd, address)); -+} -+ -+pte_t *pte_offset_proc(pmd_t *pmd, unsigned long address) -+{ -+ return(pte_offset(pmd, address)); -+} -+ -+pte_t *addr_pte(struct task_struct *task, unsigned long addr) -+{ -+ return(pte_offset(pmd_offset(pgd_offset(task->mm, addr), addr), addr)); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/trap_kern.c um/arch/um/kernel/trap_kern.c ---- orig/arch/um/kernel/trap_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/trap_kern.c 2003-03-26 13:26:00.000000000 -0500 -@@ -0,0 +1,192 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/kernel.h" -+#include "linux/sched.h" -+#include "linux/mm.h" -+#include "linux/spinlock.h" -+#include "linux/config.h" -+#include "linux/init.h" -+#include "asm/semaphore.h" -+#include "asm/pgtable.h" -+#include "asm/pgalloc.h" -+#include "asm/a.out.h" -+#include "asm/current.h" -+#include "asm/irq.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "chan_kern.h" -+#include "mconsole_kern.h" -+#include "2_5compat.h" -+ -+unsigned long handle_page_fault(unsigned long address, unsigned long ip, -+ int is_write, int is_user, int *code_out) -+{ -+ struct mm_struct *mm = current->mm; -+ struct vm_area_struct *vma; -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ unsigned long page; -+ int handled = 0; -+ -+ *code_out = SEGV_MAPERR; -+ down_read(&mm->mmap_sem); -+ vma = find_vma(mm, address); -+ if(!vma) -+ goto out; -+ else if(vma->vm_start <= address) -+ goto good_area; -+ else if(!(vma->vm_flags & VM_GROWSDOWN)) -+ goto out; -+ else if(expand_stack(vma, address)) -+ goto out; -+ -+ good_area: -+ *code_out = SEGV_ACCERR; -+ if(is_write && !(vma->vm_flags & VM_WRITE)) -+ goto out; -+ page = address & PAGE_MASK; -+ if(page == (unsigned long) current + PAGE_SIZE) -+ panic("Kernel stack overflow"); -+ pgd = pgd_offset(mm, page); -+ pmd = pmd_offset(pgd, page); -+ do { -+ survive: -+ switch (handle_mm_fault(mm, vma, address, is_write)) { -+ case 1: -+ current->min_flt++; -+ break; -+ case 2: -+ current->maj_flt++; -+ break; -+ default: -+ if (current->pid == 1) { -+ up_read(&mm->mmap_sem); -+ yield(); -+ down_read(&mm->mmap_sem); -+ goto survive; -+ } -+ /* Fall through to bad area case */ -+ case 0: -+ goto out; -+ } -+ pte = pte_offset(pmd, page); -+ } while(!pte_present(*pte)); -+ handled = 1; -+ *pte = pte_mkyoung(*pte); -+ if(pte_write(*pte)) *pte = pte_mkdirty(*pte); -+ flush_tlb_page(vma, page); -+ out: -+ up_read(&mm->mmap_sem); -+ return(handled); -+} -+ -+unsigned long segv(unsigned long address, unsigned long ip, int is_write, -+ int is_user, void *sc) -+{ -+ struct siginfo si; -+ void *catcher; -+ int handled; -+ -+ if(!is_user && (address >= start_vm) && (address < end_vm)){ -+ flush_tlb_kernel_vm(); -+ return(0); -+ } -+ if(current->mm == NULL) -+ panic("Segfault with no mm"); -+ -+ handled = handle_page_fault(address, ip, is_write, is_user, -+ &si.si_code); -+ -+ catcher = current->thread.fault_catcher; -+ if(handled) -+ return(0); -+ else if(catcher != NULL){ -+ current->thread.fault_addr = (void *) address; -+ do_longjmp(catcher, 1); -+ } -+ else if(current->thread.fault_addr != NULL){ -+ panic("fault_addr set but no fault catcher"); -+ } -+ else if(arch_fixup(ip, sc)) -+ return(0); -+ -+ if(!is_user) -+ panic("Kernel mode fault at addr 0x%lx, ip 0x%lx", -+ address, ip); -+ si.si_signo = SIGSEGV; -+ si.si_addr = (void *) address; -+ current->thread.cr2 = address; -+ current->thread.err = is_write; -+ force_sig_info(SIGSEGV, &si, current); -+ return(0); -+} -+ -+void bad_segv(unsigned long address, unsigned long ip, int is_write) -+{ -+ struct siginfo si; -+ -+ printk(KERN_ERR "Unfixable SEGV in '%s' (pid %d) at 0x%lx " -+ "(ip 0x%lx)\n", current->comm, current->pid, address, ip); -+ si.si_signo = SIGSEGV; -+ si.si_code = SEGV_ACCERR; -+ si.si_addr = (void *) address; -+ current->thread.cr2 = address; -+ current->thread.err = is_write; -+ force_sig_info(SIGSEGV, &si, current); -+} -+ -+void relay_signal(int sig, union uml_pt_regs *regs) -+{ -+ if(arch_handle_signal(sig, regs)) return; -+ if(!UPT_IS_USER(regs)) -+ panic("Kernel mode signal %d", sig); -+ force_sig(sig, current); -+} -+ -+void bus_handler(int sig, union uml_pt_regs *regs) -+{ -+ if(current->thread.fault_catcher != NULL) -+ do_longjmp(current->thread.fault_catcher, 1); -+ else relay_signal(sig, regs); -+} -+ -+void winch(int sig, union uml_pt_regs *regs) -+{ -+ do_IRQ(WINCH_IRQ, regs); -+} -+ -+void trap_init(void) -+{ -+} -+ -+spinlock_t trap_lock = SPIN_LOCK_UNLOCKED; -+ -+static int trap_index = 0; -+ -+int next_trap_index(int limit) -+{ -+ int ret; -+ -+ spin_lock(&trap_lock); -+ ret = trap_index; -+ if(++trap_index == limit) -+ trap_index = 0; -+ spin_unlock(&trap_lock); -+ return(ret); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/trap_user.c um/arch/um/kernel/trap_user.c ---- orig/arch/um/kernel/trap_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/trap_user.c 2003-03-26 13:25:50.000000000 -0500 -@@ -0,0 +1,140 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <errno.h> -+#include <fcntl.h> -+#include <setjmp.h> -+#include <signal.h> -+#include <sys/time.h> -+#include <sys/ioctl.h> -+#include <sys/ptrace.h> -+#include <sys/wait.h> -+#include <asm/page.h> -+#include <asm/unistd.h> -+#include <asm/ptrace.h> -+#include "init.h" -+#include "sysdep/ptrace.h" -+#include "sigcontext.h" -+#include "sysdep/sigcontext.h" -+#include "irq_user.h" -+#include "frame_user.h" -+#include "signal_user.h" -+#include "time_user.h" -+#include "task.h" -+#include "mode.h" -+#include "choose-mode.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "os.h" -+ -+void kill_child_dead(int pid) -+{ -+ kill(pid, SIGKILL); -+ kill(pid, SIGCONT); -+ while(waitpid(pid, NULL, 0) > 0) kill(pid, SIGCONT); -+} -+ -+/* Unlocked - don't care if this is a bit off */ -+int nsegfaults = 0; -+ -+struct { -+ unsigned long address; -+ int is_write; -+ int pid; -+ unsigned long sp; -+ int is_user; -+} segfault_record[1024]; -+ -+void segv_handler(int sig, union uml_pt_regs *regs) -+{ -+ int index, max; -+ -+ if(UPT_IS_USER(regs) && !UPT_SEGV_IS_FIXABLE(regs)){ -+ bad_segv(UPT_FAULT_ADDR(regs), UPT_IP(regs), -+ UPT_FAULT_WRITE(regs)); -+ return; -+ } -+ max = sizeof(segfault_record)/sizeof(segfault_record[0]); -+ index = next_trap_index(max); -+ -+ nsegfaults++; -+ segfault_record[index].address = UPT_FAULT_ADDR(regs); -+ segfault_record[index].pid = os_getpid(); -+ segfault_record[index].is_write = UPT_FAULT_WRITE(regs); -+ segfault_record[index].sp = UPT_SP(regs); -+ segfault_record[index].is_user = UPT_IS_USER(regs); -+ segv(UPT_FAULT_ADDR(regs), UPT_IP(regs), UPT_FAULT_WRITE(regs), -+ UPT_IS_USER(regs), regs); -+} -+ -+void usr2_handler(int sig, union uml_pt_regs *regs) -+{ -+ CHOOSE_MODE(syscall_handler_tt(sig, regs), (void) 0); -+} -+ -+struct signal_info sig_info[] = { -+ [ SIGTRAP ] { .handler = relay_signal, -+ .is_irq = 0 }, -+ [ SIGFPE ] { .handler = relay_signal, -+ .is_irq = 0 }, -+ [ SIGILL ] { .handler = relay_signal, -+ .is_irq = 0 }, -+ [ SIGWINCH ] { .handler = winch, -+ .is_irq = 1 }, -+ [ SIGBUS ] { .handler = bus_handler, -+ .is_irq = 0 }, -+ [ SIGSEGV] { .handler = segv_handler, -+ .is_irq = 0 }, -+ [ SIGIO ] { .handler = sigio_handler, -+ .is_irq = 1 }, -+ [ SIGVTALRM ] { .handler = timer_handler, -+ .is_irq = 1 }, -+ [ SIGALRM ] { .handler = timer_handler, -+ .is_irq = 1 }, -+ [ SIGUSR2 ] { .handler = usr2_handler, -+ .is_irq = 0 }, -+}; -+ -+void sig_handler(int sig, struct sigcontext sc) -+{ -+ CHOOSE_MODE_PROC(sig_handler_common_tt, sig_handler_common_skas, -+ sig, &sc); -+} -+ -+extern int timer_irq_inited, missed_ticks[]; -+ -+void alarm_handler(int sig, struct sigcontext sc) -+{ -+ if(!timer_irq_inited) return; -+ missed_ticks[cpu()]++; -+ -+ if(sig == SIGALRM) -+ switch_timers(0); -+ -+ CHOOSE_MODE_PROC(sig_handler_common_tt, sig_handler_common_skas, -+ sig, &sc); -+ -+ if(sig == SIGALRM) -+ switch_timers(1); -+} -+ -+void do_longjmp(void *b, int val) -+{ -+ jmp_buf *buf = b; -+ -+ longjmp(*buf, val); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/exec_kern.c um/arch/um/kernel/tt/exec_kern.c ---- orig/arch/um/kernel/tt/exec_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/exec_kern.c 2002-10-24 19:22:17.000000000 -0400 -@@ -0,0 +1,83 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/kernel.h" -+#include "linux/mm.h" -+#include "asm/signal.h" -+#include "asm/ptrace.h" -+#include "asm/uaccess.h" -+#include "asm/pgalloc.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "irq_user.h" -+#include "time_user.h" -+#include "mem_user.h" -+#include "os.h" -+#include "tlb.h" -+ -+static int exec_tramp(void *sig_stack) -+{ -+ init_new_thread_stack(sig_stack, NULL); -+ init_new_thread_signals(1); -+ os_stop_process(os_getpid()); -+ return(0); -+} -+ -+void flush_thread_tt(void) -+{ -+ unsigned long stack; -+ int new_pid; -+ -+ stack = alloc_stack(0, 0); -+ if(stack == 0){ -+ printk(KERN_ERR -+ "flush_thread : failed to allocate temporary stack\n"); -+ do_exit(SIGKILL); -+ } -+ -+ new_pid = start_fork_tramp((void *) current->thread.kernel_stack, -+ stack, 0, exec_tramp); -+ if(new_pid < 0){ -+ printk(KERN_ERR -+ "flush_thread : new thread failed, errno = %d\n", -+ -new_pid); -+ do_exit(SIGKILL); -+ } -+ -+ if(current->processor == 0) -+ forward_interrupts(new_pid); -+ current->thread.request.op = OP_EXEC; -+ current->thread.request.u.exec.pid = new_pid; -+ unprotect_stack((unsigned long) current); -+ os_usr1_process(os_getpid()); -+ -+ enable_timer(); -+ free_page(stack); -+ protect_memory(uml_reserved, high_physmem - uml_reserved, 1, 1, 0, 1); -+ task_protections((unsigned long) current); -+ force_flush_all(); -+ unblock_signals(); -+} -+ -+void start_thread_tt(struct pt_regs *regs, unsigned long eip, -+ unsigned long esp) -+{ -+ set_fs(USER_DS); -+ flush_tlb_mm(current->mm); -+ PT_REGS_IP(regs) = eip; -+ PT_REGS_SP(regs) = esp; -+ PT_FIX_EXEC_STACK(esp); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/exec_user.c um/arch/um/kernel/tt/exec_user.c ---- orig/arch/um/kernel/tt/exec_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/exec_user.c 2002-12-05 19:36:57.000000000 -0500 -@@ -0,0 +1,49 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <stdlib.h> -+#include <sched.h> -+#include <errno.h> -+#include <sys/wait.h> -+#include <sys/ptrace.h> -+#include <signal.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "ptrace_user.h" -+ -+void do_exec(int old_pid, int new_pid) -+{ -+ unsigned long regs[FRAME_SIZE]; -+ -+ if((ptrace(PTRACE_ATTACH, new_pid, 0, 0) < 0) || -+ (ptrace(PTRACE_CONT, new_pid, 0, 0) < 0) || -+ (waitpid(new_pid, 0, WUNTRACED) < 0)) -+ tracer_panic("do_exec failed to attach proc - errno = %d", -+ errno); -+ -+ if(ptrace_getregs(old_pid, regs) < 0) -+ tracer_panic("do_exec failed to get registers - errno = %d", -+ errno); -+ -+ kill(old_pid, SIGKILL); -+ -+ if(ptrace_setregs(new_pid, regs) < 0) -+ tracer_panic("do_exec failed to start new proc - errno = %d", -+ errno); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/gdb.c um/arch/um/kernel/tt/gdb.c ---- orig/arch/um/kernel/tt/gdb.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/gdb.c 2003-01-17 13:23:31.000000000 -0500 -@@ -0,0 +1,278 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <errno.h> -+#include <string.h> -+#include <signal.h> -+#include <sys/ptrace.h> -+#include <sys/types.h> -+#include "uml-config.h" -+#include "kern_constants.h" -+#include "chan_user.h" -+#include "init.h" -+#include "user.h" -+#include "debug.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "tt.h" -+#include "sysdep/thread.h" -+ -+extern int debugger_pid; -+extern int debugger_fd; -+extern int debugger_parent; -+ -+int detach(int pid, int sig) -+{ -+ return(ptrace(PTRACE_DETACH, pid, 0, sig)); -+} -+ -+int attach(int pid) -+{ -+ int err; -+ -+ err = ptrace(PTRACE_ATTACH, pid, 0, 0); -+ if(err < 0) return(-errno); -+ else return(err); -+} -+ -+int cont(int pid) -+{ -+ return(ptrace(PTRACE_CONT, pid, 0, 0)); -+} -+ -+#ifdef UML_CONFIG_PT_PROXY -+ -+int debugger_signal(int status, pid_t pid) -+{ -+ return(debugger_proxy(status, pid)); -+} -+ -+void child_signal(pid_t pid, int status) -+{ -+ child_proxy(pid, status); -+} -+ -+static void gdb_announce(char *dev_name, int dev) -+{ -+ printf("gdb assigned device '%s'\n", dev_name); -+} -+ -+static struct chan_opts opts = { -+ .announce = gdb_announce, -+ .xterm_title = "UML kernel debugger", -+ .raw = 0, -+ .tramp_stack = 0, -+ .in_kernel = 0, -+}; -+ -+/* Accessed by the tracing thread, which automatically serializes access */ -+static void *xterm_data; -+static int xterm_fd; -+ -+extern void *xterm_init(char *, int, struct chan_opts *); -+extern int xterm_open(int, int, int, void *, char **); -+extern void xterm_close(int, void *); -+ -+int open_gdb_chan(void) -+{ -+ char stack[UM_KERN_PAGE_SIZE], *dummy; -+ -+ opts.tramp_stack = (unsigned long) stack; -+ xterm_data = xterm_init("", 0, &opts); -+ xterm_fd = xterm_open(1, 1, 1, xterm_data, &dummy); -+ return(xterm_fd); -+} -+ -+static void exit_debugger_cb(void *unused) -+{ -+ if(debugger_pid != -1){ -+ if(gdb_pid != -1){ -+ fake_child_exit(); -+ gdb_pid = -1; -+ } -+ else kill_child_dead(debugger_pid); -+ debugger_pid = -1; -+ if(debugger_parent != -1) -+ detach(debugger_parent, SIGINT); -+ } -+ if(xterm_data != NULL) xterm_close(xterm_fd, xterm_data); -+} -+ -+static void exit_debugger(void) -+{ -+ initial_thread_cb(exit_debugger_cb, NULL); -+} -+ -+__uml_exitcall(exit_debugger); -+ -+struct gdb_data { -+ char *str; -+ int err; -+}; -+ -+static void config_gdb_cb(void *arg) -+{ -+ struct gdb_data *data = arg; -+ void *task; -+ int pid; -+ -+ data->err = -1; -+ if(debugger_pid != -1) exit_debugger_cb(NULL); -+ if(!strncmp(data->str, "pid,", strlen("pid,"))){ -+ data->str += strlen("pid,"); -+ pid = strtoul(data->str, NULL, 0); -+ task = cpu_tasks[0].task; -+ debugger_pid = attach_debugger(TASK_EXTERN_PID(task), pid, 0); -+ if(debugger_pid != -1){ -+ data->err = 0; -+ gdb_pid = pid; -+ } -+ return; -+ } -+ data->err = 0; -+ debugger_pid = start_debugger(linux_prog, 0, 0, &debugger_fd); -+ init_proxy(debugger_pid, 0, 0); -+} -+ -+int gdb_config(char *str) -+{ -+ struct gdb_data data; -+ -+ if(*str++ != '=') return(-1); -+ data.str = str; -+ initial_thread_cb(config_gdb_cb, &data); -+ return(data.err); -+} -+ -+void remove_gdb_cb(void *unused) -+{ -+ exit_debugger_cb(NULL); -+} -+ -+int gdb_remove(char *unused) -+{ -+ initial_thread_cb(remove_gdb_cb, NULL); -+ return(0); -+} -+ -+void signal_usr1(int sig) -+{ -+ if(debugger_pid != -1){ -+ printk(UM_KERN_ERR "The debugger is already running\n"); -+ return; -+ } -+ debugger_pid = start_debugger(linux_prog, 0, 0, &debugger_fd); -+ init_proxy(debugger_pid, 0, 0); -+} -+ -+int init_ptrace_proxy(int idle_pid, int startup, int stop) -+{ -+ int pid, status; -+ -+ pid = start_debugger(linux_prog, startup, stop, &debugger_fd); -+ status = wait_for_stop(idle_pid, SIGSTOP, PTRACE_CONT, NULL); -+ if(pid < 0){ -+ cont(idle_pid); -+ return(-1); -+ } -+ init_proxy(pid, 1, status); -+ return(pid); -+} -+ -+int attach_debugger(int idle_pid, int pid, int stop) -+{ -+ int status = 0, err; -+ -+ err = attach(pid); -+ if(err < 0){ -+ printf("Failed to attach pid %d, errno = %d\n", pid, -err); -+ return(-1); -+ } -+ if(stop) status = wait_for_stop(idle_pid, SIGSTOP, PTRACE_CONT, NULL); -+ init_proxy(pid, 1, status); -+ return(pid); -+} -+ -+#ifdef notdef /* Put this back in when it does something useful */ -+static int __init uml_gdb_init_setup(char *line, int *add) -+{ -+ gdb_init = uml_strdup(line); -+ return 0; -+} -+ -+__uml_setup("gdb=", uml_gdb_init_setup, -+"gdb=<channel description>\n\n" -+); -+#endif -+ -+static int __init uml_gdb_pid_setup(char *line, int *add) -+{ -+ gdb_pid = strtoul(line, NULL, 0); -+ *add = 0; -+ return 0; -+} -+ -+__uml_setup("gdb-pid=", uml_gdb_pid_setup, -+"gdb-pid=<pid>\n" -+" gdb-pid is used to attach an external debugger to UML. This may be\n" -+" an already-running gdb or a debugger-like process like strace.\n\n" -+); -+ -+#else -+ -+int debugger_signal(int status, pid_t pid){ return(0); } -+void child_signal(pid_t pid, int status){ } -+int init_ptrace_proxy(int idle_pid, int startup, int stop) -+{ -+ printk(UM_KERN_ERR "debug requested when CONFIG_PT_PROXY is off\n"); -+ kill_child_dead(idle_pid); -+ exit(1); -+} -+ -+void signal_usr1(int sig) -+{ -+ printk(UM_KERN_ERR "debug requested when CONFIG_PT_PROXY is off\n"); -+} -+ -+int attach_debugger(int idle_pid, int pid, int stop) -+{ -+ printk(UM_KERN_ERR "attach_debugger called when CONFIG_PT_PROXY " -+ "is off\n"); -+ return(-1); -+} -+ -+int config_gdb(char *str) -+{ -+ return(-1); -+} -+ -+int remove_gdb(void) -+{ -+ return(-1); -+} -+ -+int init_parent_proxy(int pid) -+{ -+ return(-1); -+} -+ -+void debugger_parent_signal(int status, int pid) -+{ -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/gdb_kern.c um/arch/um/kernel/tt/gdb_kern.c ---- orig/arch/um/kernel/tt/gdb_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/gdb_kern.c 2002-12-15 21:16:17.000000000 -0500 -@@ -0,0 +1,40 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/init.h" -+#include "linux/config.h" -+#include "mconsole_kern.h" -+ -+#ifdef CONFIG_MCONSOLE -+ -+extern int gdb_config(char *str); -+extern int gdb_remove(char *unused); -+ -+static struct mc_device gdb_mc = { -+ .name = "gdb", -+ .config = gdb_config, -+ .remove = gdb_remove, -+}; -+ -+int gdb_mc_init(void) -+{ -+ mconsole_register_dev(&gdb_mc); -+ return(0); -+} -+ -+__initcall(gdb_mc_init); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/debug.h um/arch/um/kernel/tt/include/debug.h ---- orig/arch/um/kernel/tt/include/debug.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/include/debug.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,29 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) and -+ * Lars Brinkhoff. -+ * Licensed under the GPL -+ */ -+ -+#ifndef __DEBUG_H -+#define __DEBUG_H -+ -+extern int debugger_proxy(int status, pid_t pid); -+extern void child_proxy(pid_t pid, int status); -+extern void init_proxy (pid_t pid, int waiting, int status); -+extern int start_debugger(char *prog, int startup, int stop, int *debugger_fd); -+extern void fake_child_exit(void); -+extern int gdb_config(char *str); -+extern int gdb_remove(char *unused); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mmu.h um/arch/um/kernel/tt/include/mmu.h ---- orig/arch/um/kernel/tt/include/mmu.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/include/mmu.h 2002-11-09 12:51:32.000000000 -0500 -@@ -0,0 +1,23 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __TT_MMU_H -+#define __TT_MMU_H -+ -+struct mmu_context_tt { -+}; -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mode.h um/arch/um/kernel/tt/include/mode.h ---- orig/arch/um/kernel/tt/include/mode.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/include/mode.h 2002-12-09 00:34:40.000000000 -0500 -@@ -0,0 +1,36 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __MODE_TT_H__ -+#define __MODE_TT_H__ -+ -+#include "sysdep/ptrace.h" -+ -+extern int tracing_pid; -+ -+extern int tracer(int (*init_proc)(void *), void *sp); -+extern void user_time_init_tt(void); -+extern int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data); -+extern int copy_sc_to_user_tt(void *to_ptr, void *fp, void *from_ptr, -+ void *data); -+extern void sig_handler_common_tt(int sig, void *sc); -+extern void syscall_handler_tt(int sig, union uml_pt_regs *regs); -+extern void reboot_tt(void); -+extern void halt_tt(void); -+extern int is_tracer_winch(int pid, int fd, void *data); -+extern void kill_off_processes_tt(void); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/mode_kern.h um/arch/um/kernel/tt/include/mode_kern.h ---- orig/arch/um/kernel/tt/include/mode_kern.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/include/mode_kern.h 2002-12-16 21:49:18.000000000 -0500 -@@ -0,0 +1,52 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __TT_MODE_KERN_H__ -+#define __TT_MODE_KERN_H__ -+ -+#include "linux/sched.h" -+#include "asm/page.h" -+#include "asm/ptrace.h" -+#include "asm/uaccess.h" -+ -+extern void *_switch_to_tt(void *prev, void *next); -+extern void flush_thread_tt(void); -+extern void start_thread_tt(struct pt_regs *regs, unsigned long eip, -+ unsigned long esp); -+extern int copy_thread_tt(int nr, unsigned long clone_flags, unsigned long sp, -+ unsigned long stack_top, struct task_struct *p, -+ struct pt_regs *regs); -+extern void release_thread_tt(struct task_struct *task); -+extern void exit_thread_tt(void); -+extern void initial_thread_cb_tt(void (*proc)(void *), void *arg); -+extern void init_idle_tt(void); -+extern void flush_tlb_kernel_vm_tt(void); -+extern void __flush_tlb_one_tt(unsigned long addr); -+extern void flush_tlb_range_tt(struct mm_struct *mm, unsigned long start, -+ unsigned long end); -+extern void flush_tlb_mm_tt(struct mm_struct *mm); -+extern void force_flush_all_tt(void); -+extern long execute_syscall_tt(void *r); -+extern void before_mem_tt(unsigned long brk_start); -+extern unsigned long set_task_sizes_tt(int arg, unsigned long *host_size_out, -+ unsigned long *task_size_out); -+extern int start_uml_tt(void); -+extern int external_pid_tt(struct task_struct *task); -+extern int thread_pid_tt(struct thread_struct *thread); -+ -+#define kmem_end_tt (host_task_size - ABOVE_KMEM) -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/ptrace-tt.h um/arch/um/kernel/tt/include/ptrace-tt.h ---- orig/arch/um/kernel/tt/include/ptrace-tt.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/include/ptrace-tt.h 2003-01-17 13:23:30.000000000 -0500 -@@ -0,0 +1,26 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __PTRACE_TT_H -+#define __PTRACE_TT_H -+ -+#include "uml-config.h" -+ -+#ifdef UML_CONFIG_MODE_TT -+#include "sysdep/sc.h" -+#endif -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/tt.h um/arch/um/kernel/tt/include/tt.h ---- orig/arch/um/kernel/tt/include/tt.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/include/tt.h 2002-12-20 23:29:11.000000000 -0500 -@@ -0,0 +1,46 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __TT_H__ -+#define __TT_H__ -+ -+#include "sysdep/ptrace.h" -+ -+extern int gdb_pid; -+extern int debug; -+extern int debug_stop; -+extern int debug_trace; -+ -+extern int honeypot; -+ -+extern int fork_tramp(void *sig_stack); -+extern int do_proc_op(void *t, int proc_id); -+extern int tracer(int (*init_proc)(void *), void *sp); -+extern void attach_process(int pid); -+extern void tracer_panic(char *format, ...); -+extern void set_init_pid(int pid); -+extern int set_user_mode(void *task); -+extern void set_tracing(void *t, int tracing); -+extern int is_tracing(void *task); -+extern int singlestepping_tt(void *t); -+extern void clear_singlestep(void *t); -+extern void syscall_handler(int sig, union uml_pt_regs *regs); -+extern void exit_kernel(int pid, void *task); -+extern int do_syscall(void *task, int pid); -+extern int is_valid_pid(int pid); -+extern void remap_data(void *segment_start, void *segment_end, int w); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/include/uaccess.h um/arch/um/kernel/tt/include/uaccess.h ---- orig/arch/um/kernel/tt/include/uaccess.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/include/uaccess.h 2003-03-25 16:58:42.000000000 -0500 -@@ -0,0 +1,122 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __TT_UACCESS_H -+#define __TT_UACCESS_H -+ -+#include "linux/string.h" -+#include "linux/sched.h" -+#include "asm/processor.h" -+#include "asm/errno.h" -+#include "asm/current.h" -+#include "asm/a.out.h" -+#include "uml_uaccess.h" -+ -+#define ABOVE_KMEM (16 * 1024 * 1024) -+ -+extern unsigned long end_vm; -+extern unsigned long uml_physmem; -+ -+#define under_task_size(addr, size) \ -+ (((unsigned long) (addr) < TASK_SIZE) && \ -+ (((unsigned long) (addr) + (size)) < TASK_SIZE)) -+ -+#define is_stack(addr, size) \ -+ (((unsigned long) (addr) < STACK_TOP) && \ -+ ((unsigned long) (addr) >= STACK_TOP - ABOVE_KMEM) && \ -+ (((unsigned long) (addr) + (size)) <= STACK_TOP)) -+ -+#define access_ok_tt(type, addr, size) \ -+ ((type == VERIFY_READ) || (segment_eq(get_fs(), KERNEL_DS)) || \ -+ (((unsigned long) (addr) <= ((unsigned long) (addr) + (size))) && \ -+ (under_task_size(addr, size) || is_stack(addr, size)))) -+ -+static inline int verify_area_tt(int type, const void * addr, -+ unsigned long size) -+{ -+ return(access_ok_tt(type, addr, size) ? 0 : -EFAULT); -+} -+ -+extern unsigned long get_fault_addr(void); -+ -+extern int __do_copy_from_user(void *to, const void *from, int n, -+ void **fault_addr, void **fault_catcher); -+ -+static inline int copy_from_user_tt(void *to, const void *from, int n) -+{ -+ if(!access_ok_tt(VERIFY_READ, from, n)) -+ return(n); -+ -+ return(__do_copy_from_user(to, from, n, ¤t->thread.fault_addr, -+ ¤t->thread.fault_catcher)); -+} -+ -+static inline int copy_to_user_tt(void *to, const void *from, int n) -+{ -+ if(!access_ok_tt(VERIFY_WRITE, to, n)) -+ return(n); -+ -+ return(__do_copy_to_user(to, from, n, ¤t->thread.fault_addr, -+ ¤t->thread.fault_catcher)); -+} -+ -+extern int __do_strncpy_from_user(char *dst, const char *src, size_t n, -+ void **fault_addr, void **fault_catcher); -+ -+static inline int strncpy_from_user_tt(char *dst, const char *src, int count) -+{ -+ int n; -+ -+ if(!access_ok_tt(VERIFY_READ, src, 1)) -+ return(-EFAULT); -+ -+ n = __do_strncpy_from_user(dst, src, count, -+ ¤t->thread.fault_addr, -+ ¤t->thread.fault_catcher); -+ if(n < 0) return(-EFAULT); -+ return(n); -+} -+ -+extern int __do_clear_user(void *mem, size_t len, void **fault_addr, -+ void **fault_catcher); -+ -+static inline int __clear_user_tt(void *mem, int len) -+{ -+ return(__do_clear_user(mem, len, -+ ¤t->thread.fault_addr, -+ ¤t->thread.fault_catcher)); -+} -+ -+static inline int clear_user_tt(void *mem, int len) -+{ -+ if(!access_ok_tt(VERIFY_WRITE, mem, len)) -+ return(len); -+ -+ return(__do_clear_user(mem, len, ¤t->thread.fault_addr, -+ ¤t->thread.fault_catcher)); -+} -+ -+extern int __do_strnlen_user(const char *str, unsigned long n, -+ void **fault_addr, void **fault_catcher); -+ -+static inline int strnlen_user_tt(const void *str, int len) -+{ -+ return(__do_strnlen_user(str, len, -+ ¤t->thread.fault_addr, -+ ¤t->thread.fault_catcher)); -+} -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ksyms.c um/arch/um/kernel/tt/ksyms.c ---- orig/arch/um/kernel/tt/ksyms.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ksyms.c 2002-10-27 17:01:56.000000000 -0500 -@@ -0,0 +1,28 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/module.h" -+#include "asm/uaccess.h" -+#include "mode.h" -+ -+EXPORT_SYMBOL(__do_copy_from_user); -+EXPORT_SYMBOL(__do_copy_to_user); -+EXPORT_SYMBOL(__do_strncpy_from_user); -+EXPORT_SYMBOL(__do_strnlen_user); -+EXPORT_SYMBOL(__do_clear_user); -+ -+EXPORT_SYMBOL(tracing_pid); -+EXPORT_SYMBOL(honeypot); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/Makefile um/arch/um/kernel/tt/Makefile ---- orig/arch/um/kernel/tt/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/Makefile 2002-12-20 23:29:42.000000000 -0500 -@@ -0,0 +1,39 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET = tt.o -+ -+obj-y = exec_kern.o exec_user.o gdb.o ksyms.o mem.o mem_user.o process_kern.o \ -+ syscall_kern.o syscall_user.o time.o tlb.o tracer.o trap_user.o \ -+ uaccess_user.o -+ -+obj-$(CONFIG_PT_PROXY) += gdb_kern.o -+ -+subdir-y = sys-$(SUBARCH) -+subdir-$(CONFIG_PT_PROXY) += ptproxy -+ -+obj-y += $(join $(subdir-y),$(subdir-y:%=/%.o)) -+ -+export-objs = ksyms.o -+ -+USER_OBJS = $(filter %_user.o,$(obj-y)) gdb.o time.o tracer.o -+ -+UNMAP_CFLAGS := $(patsubst -pg -DPROFILING,,$(USER_CFLAGS)) -+UNMAP_CFLAGS := $(patsubst -fprofile-arcs -ftest-coverage,,$(UNMAP_CFLAGS)) -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+$(O_TARGET) : unmap_fin.o -+ -+unmap.o: unmap.c -+ $(CC) $(UNMAP_CFLAGS) -c -o $@ $< -+ -+unmap_fin.o : unmap.o -+ ld -r -o $@ $< -lc -L/usr/lib -+ -+clean : -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/mem.c um/arch/um/kernel/tt/mem.c ---- orig/arch/um/kernel/tt/mem.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/mem.c 2002-12-16 21:49:51.000000000 -0500 -@@ -0,0 +1,51 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/stddef.h" -+#include "linux/config.h" -+#include "linux/mm.h" -+#include "asm/uaccess.h" -+#include "mem_user.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "kern.h" -+#include "tt.h" -+ -+void before_mem_tt(unsigned long brk_start) -+{ -+ if(!jail || debug) -+ remap_data(UML_ROUND_DOWN(&_stext), UML_ROUND_UP(&_etext), 1); -+ remap_data(UML_ROUND_DOWN(&_sdata), UML_ROUND_UP(&_edata), 1); -+ remap_data(UML_ROUND_DOWN(&__bss_start), UML_ROUND_UP(brk_start), 1); -+} -+ -+#ifdef CONFIG_HOST_2G_2G -+#define TOP 0x80000000 -+#else -+#define TOP 0xc0000000 -+#endif -+ -+#define SIZE ((CONFIG_NEST_LEVEL + CONFIG_KERNEL_HALF_GIGS) * 0x20000000) -+#define START (TOP - SIZE) -+ -+unsigned long set_task_sizes_tt(int arg, unsigned long *host_size_out, -+ unsigned long *task_size_out) -+{ -+ /* Round up to the nearest 4M */ -+ *host_size_out = ROUND_4M((unsigned long) &arg); -+ *task_size_out = START; -+ return(START); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/mem_user.c um/arch/um/kernel/tt/mem_user.c ---- orig/arch/um/kernel/tt/mem_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/mem_user.c 2003-01-17 22:07:31.000000000 -0500 -@@ -0,0 +1,50 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <stdio.h> -+#include <unistd.h> -+#include <string.h> -+#include <errno.h> -+#include <sys/mman.h> -+#include "tt.h" -+#include "mem_user.h" -+#include "user_util.h" -+ -+void remap_data(void *segment_start, void *segment_end, int w) -+{ -+ void *addr; -+ unsigned long size; -+ int data, prot; -+ -+ if(w) prot = PROT_WRITE; -+ else prot = 0; -+ prot |= PROT_READ | PROT_EXEC; -+ size = (unsigned long) segment_end - -+ (unsigned long) segment_start; -+ data = create_mem_file(size); -+ if((addr = mmap(NULL, size, PROT_WRITE | PROT_READ, -+ MAP_SHARED, data, 0)) == MAP_FAILED){ -+ perror("mapping new data segment"); -+ exit(1); -+ } -+ memcpy(addr, segment_start, size); -+ if(switcheroo(data, prot, addr, segment_start, -+ size) < 0){ -+ printf("switcheroo failed\n"); -+ exit(1); -+ } -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/process_kern.c um/arch/um/kernel/tt/process_kern.c ---- orig/arch/um/kernel/tt/process_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/process_kern.c 2003-05-29 13:46:00.000000000 -0400 -@@ -0,0 +1,517 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sched.h" -+#include "linux/signal.h" -+#include "linux/kernel.h" -+#include "asm/system.h" -+#include "asm/pgalloc.h" -+#include "asm/ptrace.h" -+#include "irq_user.h" -+#include "signal_user.h" -+#include "kern_util.h" -+#include "user_util.h" -+#include "os.h" -+#include "kern.h" -+#include "sigcontext.h" -+#include "time_user.h" -+#include "mem_user.h" -+#include "tlb.h" -+#include "mode.h" -+#include "init.h" -+#include "tt.h" -+ -+void *_switch_to_tt(void *prev, void *next) -+{ -+ struct task_struct *from, *to; -+ unsigned long flags; -+ int err, vtalrm, alrm, prof, cpu; -+ char c; -+ /* jailing and SMP are incompatible, so this doesn't need to be -+ * made per-cpu -+ */ -+ static int reading; -+ -+ from = prev; -+ to = next; -+ -+ to->thread.prev_sched = from; -+ -+ cpu = from->processor; -+ if(cpu == 0) -+ forward_interrupts(to->thread.mode.tt.extern_pid); -+#ifdef CONFIG_SMP -+ forward_ipi(cpu_data[cpu].ipi_pipe[0], to->thread.mode.tt.extern_pid); -+#endif -+ local_irq_save(flags); -+ -+ vtalrm = change_sig(SIGVTALRM, 0); -+ alrm = change_sig(SIGALRM, 0); -+ prof = change_sig(SIGPROF, 0); -+ -+ c = 0; -+ set_current(to); -+ -+ reading = 0; -+ err = os_write_file(to->thread.mode.tt.switch_pipe[1], &c, sizeof(c)); -+ if(err != sizeof(c)) -+ panic("write of switch_pipe failed, errno = %d", -err); -+ -+ reading = 1; -+ if(from->state == TASK_ZOMBIE) -+ os_kill_process(os_getpid(), 0); -+ -+ err = os_read_file(from->thread.mode.tt.switch_pipe[0], &c, sizeof(c)); -+ if(err != sizeof(c)) -+ panic("read of switch_pipe failed, errno = %d", -err); -+ -+ /* This works around a nasty race with 'jail'. If we are switching -+ * between two threads of a threaded app and the incoming process -+ * runs before the outgoing process reaches the read, and it makes -+ * it all the way out to userspace, then it will have write-protected -+ * the outgoing process stack. Then, when the outgoing process -+ * returns from the write, it will segfault because it can no longer -+ * write its own stack. So, in order to avoid that, the incoming -+ * thread sits in a loop yielding until 'reading' is set. This -+ * isn't entirely safe, since there may be a reschedule from a timer -+ * happening between setting 'reading' and sleeping in read. But, -+ * it should get a whole quantum in which to reach the read and sleep, -+ * which should be enough. -+ */ -+ -+ if(jail){ -+ while(!reading) sched_yield(); -+ } -+ -+ change_sig(SIGVTALRM, vtalrm); -+ change_sig(SIGALRM, alrm); -+ change_sig(SIGPROF, prof); -+ -+ arch_switch(); -+ -+ flush_tlb_all(); -+ local_irq_restore(flags); -+ -+ return(current->thread.prev_sched); -+} -+ -+void release_thread_tt(struct task_struct *task) -+{ -+ os_kill_process(task->thread.mode.tt.extern_pid, 0); -+} -+ -+void exit_thread_tt(void) -+{ -+ close(current->thread.mode.tt.switch_pipe[0]); -+ close(current->thread.mode.tt.switch_pipe[1]); -+} -+ -+extern void schedule_tail(struct task_struct *prev); -+ -+static void new_thread_handler(int sig) -+{ -+ int (*fn)(void *); -+ void *arg; -+ -+ fn = current->thread.request.u.thread.proc; -+ arg = current->thread.request.u.thread.arg; -+ UPT_SC(¤t->thread.regs.regs) = (void *) (&sig + 1); -+ suspend_new_thread(current->thread.mode.tt.switch_pipe[0]); -+ -+ init_new_thread_signals(1); -+ enable_timer(); -+ free_page(current->thread.temp_stack); -+ set_cmdline("(kernel thread)"); -+ force_flush_all(); -+ -+ if(current->thread.prev_sched != NULL) -+ schedule_tail(current->thread.prev_sched); -+ current->thread.prev_sched = NULL; -+ -+ change_sig(SIGUSR1, 1); -+ change_sig(SIGVTALRM, 1); -+ change_sig(SIGPROF, 1); -+ sti(); -+ if(!run_kernel_thread(fn, arg, ¤t->thread.exec_buf)) -+ do_exit(0); -+} -+ -+static int new_thread_proc(void *stack) -+{ -+ cli(); -+ init_new_thread_stack(stack, new_thread_handler); -+ os_usr1_process(os_getpid()); -+ return(0); -+} -+ -+/* Signal masking - signals are blocked at the start of fork_tramp. They -+ * are re-enabled when finish_fork_handler is entered by fork_tramp hitting -+ * itself with a SIGUSR1. set_user_mode has to be run with SIGUSR1 off, -+ * so it is blocked before it's called. They are re-enabled on sigreturn -+ * despite the fact that they were blocked when the SIGUSR1 was issued because -+ * copy_thread copies the parent's signcontext, including the signal mask -+ * onto the signal frame. -+ */ -+ -+static void finish_fork_handler(int sig) -+{ -+ UPT_SC(¤t->thread.regs.regs) = (void *) (&sig + 1); -+ suspend_new_thread(current->thread.mode.tt.switch_pipe[0]); -+ -+ init_new_thread_signals(1); -+ enable_timer(); -+ sti(); -+ force_flush_all(); -+ if(current->mm != current->p_pptr->mm) -+ protect_memory(uml_reserved, high_physmem - uml_reserved, 1, -+ 1, 0, 1); -+ task_protections((unsigned long) current); -+ -+ if(current->thread.prev_sched != NULL) -+ schedule_tail(current->thread.prev_sched); -+ current->thread.prev_sched = NULL; -+ -+ free_page(current->thread.temp_stack); -+ cli(); -+ change_sig(SIGUSR1, 0); -+ set_user_mode(current); -+} -+ -+int fork_tramp(void *stack) -+{ -+ cli(); -+ arch_init_thread(); -+ init_new_thread_stack(stack, finish_fork_handler); -+ os_usr1_process(os_getpid()); -+ return(0); -+} -+ -+int copy_thread_tt(int nr, unsigned long clone_flags, unsigned long sp, -+ unsigned long stack_top, struct task_struct * p, -+ struct pt_regs *regs) -+{ -+ int (*tramp)(void *); -+ int new_pid, err; -+ unsigned long stack; -+ -+ if(current->thread.forking) -+ tramp = fork_tramp; -+ else { -+ tramp = new_thread_proc; -+ p->thread.request.u.thread = current->thread.request.u.thread; -+ } -+ -+ err = os_pipe(p->thread.mode.tt.switch_pipe, 1, 1); -+ if(err){ -+ printk("copy_thread : pipe failed, errno = %d\n", -err); -+ return(err); -+ } -+ -+ stack = alloc_stack(0, 0); -+ if(stack == 0){ -+ printk(KERN_ERR "copy_thread : failed to allocate " -+ "temporary stack\n"); -+ return(-ENOMEM); -+ } -+ -+ clone_flags &= CLONE_VM; -+ p->thread.temp_stack = stack; -+ new_pid = start_fork_tramp((void *) p->thread.kernel_stack, stack, -+ clone_flags, tramp); -+ if(new_pid < 0){ -+ printk(KERN_ERR "copy_thread : clone failed - errno = %d\n", -+ -new_pid); -+ return(new_pid); -+ } -+ -+ if(current->thread.forking){ -+ sc_to_sc(UPT_SC(&p->thread.regs.regs), -+ UPT_SC(¤t->thread.regs.regs)); -+ SC_SET_SYSCALL_RETURN(UPT_SC(&p->thread.regs.regs), 0); -+ if(sp != 0) SC_SP(UPT_SC(&p->thread.regs.regs)) = sp; -+ } -+ p->thread.mode.tt.extern_pid = new_pid; -+ -+ current->thread.request.op = OP_FORK; -+ current->thread.request.u.fork.pid = new_pid; -+ os_usr1_process(os_getpid()); -+ return(0); -+} -+ -+void reboot_tt(void) -+{ -+ current->thread.request.op = OP_REBOOT; -+ os_usr1_process(os_getpid()); -+ os_kill_process(os_getpid(), 0); -+} -+ -+void halt_tt(void) -+{ -+ current->thread.request.op = OP_HALT; -+ os_usr1_process(os_getpid()); -+ os_kill_process(os_getpid(), 0); -+} -+ -+void kill_off_processes_tt(void) -+{ -+ struct task_struct *p; -+ int me; -+ -+ me = os_getpid(); -+ for_each_task(p){ -+ int pid = p->thread.mode.tt.extern_pid; -+ if((pid != me) && (pid != -1)) -+ os_kill_process(p->thread.mode.tt.extern_pid, 0); -+ } -+ if((init_task.thread.mode.tt.extern_pid != me) && -+ (init_task.thread.mode.tt.extern_pid != -1)) -+ os_kill_process(init_task.thread.mode.tt.extern_pid, 0); -+} -+ -+void initial_thread_cb_tt(void (*proc)(void *), void *arg) -+{ -+ if(os_getpid() == tracing_pid){ -+ (*proc)(arg); -+ } -+ else { -+ current->thread.request.op = OP_CB; -+ current->thread.request.u.cb.proc = proc; -+ current->thread.request.u.cb.arg = arg; -+ os_usr1_process(os_getpid()); -+ } -+} -+ -+int do_proc_op(void *t, int proc_id) -+{ -+ struct task_struct *task; -+ struct thread_struct *thread; -+ int op, pid; -+ -+ task = t; -+ thread = &task->thread; -+ op = thread->request.op; -+ switch(op){ -+ case OP_NONE: -+ case OP_TRACE_ON: -+ break; -+ case OP_EXEC: -+ pid = thread->request.u.exec.pid; -+ do_exec(thread->mode.tt.extern_pid, pid); -+ thread->mode.tt.extern_pid = pid; -+ cpu_tasks[task->processor].pid = pid; -+ break; -+ case OP_FORK: -+ attach_process(thread->request.u.fork.pid); -+ break; -+ case OP_CB: -+ (*thread->request.u.cb.proc)(thread->request.u.cb.arg); -+ break; -+ case OP_REBOOT: -+ case OP_HALT: -+ break; -+ default: -+ tracer_panic("Bad op in do_proc_op"); -+ break; -+ } -+ thread->request.op = OP_NONE; -+ return(op); -+} -+ -+void init_idle_tt(void) -+{ -+ idle_timer(); -+} -+ -+/* Changed by jail_setup, which is a setup */ -+int jail = 0; -+ -+int __init jail_setup(char *line, int *add) -+{ -+ int ok = 1; -+ -+ if(jail) return(0); -+#ifdef CONFIG_SMP -+ printf("'jail' may not used used in a kernel with CONFIG_SMP " -+ "enabled\n"); -+ ok = 0; -+#endif -+#ifdef CONFIG_HOSTFS -+ printf("'jail' may not used used in a kernel with CONFIG_HOSTFS " -+ "enabled\n"); -+ ok = 0; -+#endif -+#ifdef CONFIG_MODULES -+ printf("'jail' may not used used in a kernel with CONFIG_MODULES " -+ "enabled\n"); -+ ok = 0; -+#endif -+ if(!ok) exit(1); -+ -+ /* CAP_SYS_RAWIO controls the ability to open /dev/mem and /dev/kmem. -+ * Removing it from the bounding set eliminates the ability of anything -+ * to acquire it, and thus read or write kernel memory. -+ */ -+ cap_lower(cap_bset, CAP_SYS_RAWIO); -+ jail = 1; -+ return(0); -+} -+ -+__uml_setup("jail", jail_setup, -+"jail\n" -+" Enables the protection of kernel memory from processes.\n\n" -+); -+ -+static void mprotect_kernel_mem(int w) -+{ -+ unsigned long start, end; -+ int pages; -+ -+ if(!jail || (current == &init_task)) return; -+ -+ pages = (1 << CONFIG_KERNEL_STACK_ORDER); -+ -+ start = (unsigned long) current + PAGE_SIZE; -+ end = (unsigned long) current + PAGE_SIZE * pages; -+ protect_memory(uml_reserved, start - uml_reserved, 1, w, 1, 1); -+ protect_memory(end, high_physmem - end, 1, w, 1, 1); -+ -+ start = (unsigned long) UML_ROUND_DOWN(&_stext); -+ end = (unsigned long) UML_ROUND_UP(&_etext); -+ protect_memory(start, end - start, 1, w, 1, 1); -+ -+ start = (unsigned long) UML_ROUND_DOWN(&_unprotected_end); -+ end = (unsigned long) UML_ROUND_UP(&_edata); -+ protect_memory(start, end - start, 1, w, 1, 1); -+ -+ start = (unsigned long) UML_ROUND_DOWN(&__bss_start); -+ end = (unsigned long) UML_ROUND_UP(brk_start); -+ protect_memory(start, end - start, 1, w, 1, 1); -+ -+ mprotect_kernel_vm(w); -+} -+ -+void unprotect_kernel_mem(void) -+{ -+ mprotect_kernel_mem(1); -+} -+ -+void protect_kernel_mem(void) -+{ -+ mprotect_kernel_mem(0); -+} -+ -+extern void start_kernel(void); -+ -+static int start_kernel_proc(void *unused) -+{ -+ int pid; -+ -+ block_signals(); -+ pid = os_getpid(); -+ -+ cpu_tasks[0].pid = pid; -+ cpu_tasks[0].task = current; -+#ifdef CONFIG_SMP -+ cpu_online_map = 1; -+#endif -+ if(debug) os_stop_process(pid); -+ start_kernel(); -+ return(0); -+} -+ -+void set_tracing(void *task, int tracing) -+{ -+ ((struct task_struct *) task)->thread.mode.tt.tracing = tracing; -+} -+ -+int is_tracing(void *t) -+{ -+ return (((struct task_struct *) t)->thread.mode.tt.tracing); -+} -+ -+int set_user_mode(void *t) -+{ -+ struct task_struct *task; -+ -+ task = t ? t : current; -+ if(task->thread.mode.tt.tracing) -+ return(1); -+ task->thread.request.op = OP_TRACE_ON; -+ os_usr1_process(os_getpid()); -+ return(0); -+} -+ -+void set_init_pid(int pid) -+{ -+ int err; -+ -+ init_task.thread.mode.tt.extern_pid = pid; -+ err = os_pipe(init_task.thread.mode.tt.switch_pipe, 1, 1); -+ if(err) panic("Can't create switch pipe for init_task, errno = %d", -+ err); -+} -+ -+int singlestepping_tt(void *t) -+{ -+ struct task_struct *task = t; -+ -+ if(task->thread.mode.tt.singlestep_syscall) -+ return(0); -+ return(task->ptrace & PT_DTRACE); -+} -+ -+void clear_singlestep(void *t) -+{ -+ struct task_struct *task = t; -+ -+ task->ptrace &= ~PT_DTRACE; -+} -+ -+int start_uml_tt(void) -+{ -+ void *sp; -+ int pages; -+ -+ pages = (1 << CONFIG_KERNEL_STACK_ORDER) - 2; -+ sp = (void *) init_task.thread.kernel_stack + pages * PAGE_SIZE - -+ sizeof(unsigned long); -+ return(tracer(start_kernel_proc, sp)); -+} -+ -+int external_pid_tt(struct task_struct *task) -+{ -+ return(task->thread.mode.tt.extern_pid); -+} -+ -+int thread_pid_tt(struct thread_struct *thread) -+{ -+ return(thread->mode.tt.extern_pid); -+} -+ -+int is_valid_pid(int pid) -+{ -+ struct task_struct *task; -+ -+ read_lock(&tasklist_lock); -+ for_each_task(task){ -+ if(task->thread.mode.tt.extern_pid == pid){ -+ read_unlock(&tasklist_lock); -+ return(1); -+ } -+ } -+ read_unlock(&tasklist_lock); -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/Makefile um/arch/um/kernel/tt/ptproxy/Makefile ---- orig/arch/um/kernel/tt/ptproxy/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ptproxy/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,12 @@ -+O_TARGET = ptproxy.o -+ -+obj-y = proxy.o ptrace.o sysdep.o wait.o -+ -+USER_OBJS = $(obj-y) -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+clean: -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/proxy.c um/arch/um/kernel/tt/ptproxy/proxy.c ---- orig/arch/um/kernel/tt/ptproxy/proxy.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ptproxy/proxy.c 2003-04-16 14:01:03.000000000 -0400 -@@ -0,0 +1,370 @@ -+/********************************************************************** -+proxy.c -+ -+Copyright (C) 1999 Lars Brinkhoff. See the file COPYING for licensing -+terms and conditions. -+ -+Jeff Dike (jdike@karaya.com) : Modified for integration into uml -+**********************************************************************/ -+ -+/* XXX This file shouldn't refer to CONFIG_* */ -+ -+#include <errno.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <signal.h> -+#include <string.h> -+#include <fcntl.h> -+#include <termios.h> -+#include <sys/wait.h> -+#include <sys/types.h> -+#include <sys/ptrace.h> -+#include <sys/ioctl.h> -+#include <asm/unistd.h> -+ -+#include "ptproxy.h" -+#include "sysdep.h" -+#include "wait.h" -+ -+#include "user_util.h" -+#include "user.h" -+#include "os.h" -+#include "tempfile.h" -+ -+static int debugger_wait(debugger_state *debugger, int *status, int options, -+ int (*syscall)(debugger_state *debugger, pid_t child), -+ int (*normal_return)(debugger_state *debugger, -+ pid_t unused), -+ int (*wait_return)(debugger_state *debugger, -+ pid_t unused)) -+{ -+ if(debugger->real_wait){ -+ debugger->handle_trace = normal_return; -+ syscall_continue(debugger->pid); -+ debugger->real_wait = 0; -+ return(1); -+ } -+ debugger->wait_status_ptr = status; -+ debugger->wait_options = options; -+ if((debugger->debugee != NULL) && debugger->debugee->event){ -+ syscall_continue(debugger->pid); -+ wait_for_stop(debugger->pid, SIGTRAP, PTRACE_SYSCALL, -+ NULL); -+ (*wait_return)(debugger, -1); -+ return(0); -+ } -+ else if(debugger->wait_options & WNOHANG){ -+ syscall_cancel(debugger->pid, 0); -+ debugger->handle_trace = syscall; -+ return(0); -+ } -+ else { -+ syscall_pause(debugger->pid); -+ debugger->handle_trace = wait_return; -+ debugger->waiting = 1; -+ } -+ return(1); -+} -+ -+/* -+ * Handle debugger trap, i.e. syscall. -+ */ -+ -+int debugger_syscall(debugger_state *debugger, pid_t child) -+{ -+ long arg1, arg2, arg3, arg4, arg5, result; -+ int syscall, ret = 0; -+ -+ syscall = get_syscall(debugger->pid, &arg1, &arg2, &arg3, &arg4, -+ &arg5); -+ -+ switch(syscall){ -+ case __NR_execve: -+ /* execve never returns */ -+ debugger->handle_trace = debugger_syscall; -+ break; -+ -+ case __NR_ptrace: -+ if(debugger->debugee->pid != 0) arg2 = debugger->debugee->pid; -+ if(!debugger->debugee->in_context) -+ child = debugger->debugee->pid; -+ result = proxy_ptrace(debugger, arg1, arg2, arg3, arg4, child, -+ &ret); -+ syscall_cancel(debugger->pid, result); -+ debugger->handle_trace = debugger_syscall; -+ return(ret); -+ -+ case __NR_waitpid: -+ case __NR_wait4: -+ if(!debugger_wait(debugger, (int *) arg2, arg3, -+ debugger_syscall, debugger_normal_return, -+ proxy_wait_return)) -+ return(0); -+ break; -+ -+ case __NR_kill: -+ if(!debugger->debugee->in_context) -+ child = debugger->debugee->pid; -+ if(arg1 == debugger->debugee->pid){ -+ result = kill(child, arg2); -+ syscall_cancel(debugger->pid, result); -+ debugger->handle_trace = debugger_syscall; -+ return(0); -+ } -+ else debugger->handle_trace = debugger_normal_return; -+ break; -+ -+ default: -+ debugger->handle_trace = debugger_normal_return; -+ } -+ -+ syscall_continue(debugger->pid); -+ return(0); -+} -+ -+/* Used by the tracing thread */ -+static debugger_state parent; -+static int parent_syscall(debugger_state *debugger, int pid); -+ -+int init_parent_proxy(int pid) -+{ -+ parent = ((debugger_state) { .pid = pid, -+ .wait_options = 0, -+ .wait_status_ptr = NULL, -+ .waiting = 0, -+ .real_wait = 0, -+ .expecting_child = 0, -+ .handle_trace = parent_syscall, -+ .debugee = NULL } ); -+ return(0); -+} -+ -+int parent_normal_return(debugger_state *debugger, pid_t unused) -+{ -+ debugger->handle_trace = parent_syscall; -+ syscall_continue(debugger->pid); -+ return(0); -+} -+ -+static int parent_syscall(debugger_state *debugger, int pid) -+{ -+ long arg1, arg2, arg3, arg4, arg5; -+ int syscall; -+ -+ syscall = get_syscall(pid, &arg1, &arg2, &arg3, &arg4, &arg5); -+ -+ if((syscall == __NR_waitpid) || (syscall == __NR_wait4)){ -+ debugger_wait(&parent, (int *) arg2, arg3, parent_syscall, -+ parent_normal_return, parent_wait_return); -+ } -+ else ptrace(PTRACE_SYSCALL, pid, 0, 0); -+ return(0); -+} -+ -+int debugger_normal_return(debugger_state *debugger, pid_t unused) -+{ -+ debugger->handle_trace = debugger_syscall; -+ syscall_continue(debugger->pid); -+ return(0); -+} -+ -+void debugger_cancelled_return(debugger_state *debugger, int result) -+{ -+ debugger->handle_trace = debugger_syscall; -+ syscall_set_result(debugger->pid, result); -+ syscall_continue(debugger->pid); -+} -+ -+/* Used by the tracing thread */ -+static debugger_state debugger; -+static debugee_state debugee; -+ -+void init_proxy (pid_t debugger_pid, int stopped, int status) -+{ -+ debugger.pid = debugger_pid; -+ debugger.handle_trace = debugger_syscall; -+ debugger.debugee = &debugee; -+ debugger.waiting = 0; -+ debugger.real_wait = 0; -+ debugger.expecting_child = 0; -+ -+ debugee.pid = 0; -+ debugee.traced = 0; -+ debugee.stopped = stopped; -+ debugee.event = 0; -+ debugee.zombie = 0; -+ debugee.died = 0; -+ debugee.wait_status = status; -+ debugee.in_context = 1; -+} -+ -+int debugger_proxy(int status, int pid) -+{ -+ int ret = 0, sig; -+ -+ if(WIFSTOPPED(status)){ -+ sig = WSTOPSIG(status); -+ if (sig == SIGTRAP) -+ ret = (*debugger.handle_trace)(&debugger, pid); -+ -+ else if(sig == SIGCHLD){ -+ if(debugger.expecting_child){ -+ ptrace(PTRACE_SYSCALL, debugger.pid, 0, sig); -+ debugger.expecting_child = 0; -+ } -+ else if(debugger.waiting) -+ real_wait_return(&debugger); -+ else { -+ ptrace(PTRACE_SYSCALL, debugger.pid, 0, sig); -+ debugger.real_wait = 1; -+ } -+ } -+ else ptrace(PTRACE_SYSCALL, debugger.pid, 0, sig); -+ } -+ else if(WIFEXITED(status)){ -+ tracer_panic("debugger (pid %d) exited with status %d", -+ debugger.pid, WEXITSTATUS(status)); -+ } -+ else if(WIFSIGNALED(status)){ -+ tracer_panic("debugger (pid %d) exited with signal %d", -+ debugger.pid, WTERMSIG(status)); -+ } -+ else { -+ tracer_panic("proxy got unknown status (0x%x) on debugger " -+ "(pid %d)", status, debugger.pid); -+ } -+ return(ret); -+} -+ -+void child_proxy(pid_t pid, int status) -+{ -+ debugee.event = 1; -+ debugee.wait_status = status; -+ -+ if(WIFSTOPPED(status)){ -+ debugee.stopped = 1; -+ debugger.expecting_child = 1; -+ kill(debugger.pid, SIGCHLD); -+ } -+ else if(WIFEXITED(status) || WIFSIGNALED(status)){ -+ debugee.zombie = 1; -+ debugger.expecting_child = 1; -+ kill(debugger.pid, SIGCHLD); -+ } -+ else panic("proxy got unknown status (0x%x) on child (pid %d)", -+ status, pid); -+} -+ -+void debugger_parent_signal(int status, int pid) -+{ -+ int sig; -+ -+ if(WIFSTOPPED(status)){ -+ sig = WSTOPSIG(status); -+ if(sig == SIGTRAP) (*parent.handle_trace)(&parent, pid); -+ else ptrace(PTRACE_SYSCALL, pid, 0, sig); -+ } -+} -+ -+void fake_child_exit(void) -+{ -+ int status, pid; -+ -+ child_proxy(1, W_EXITCODE(0, 0)); -+ while(debugger.waiting == 1){ -+ pid = waitpid(debugger.pid, &status, WUNTRACED); -+ if(pid != debugger.pid){ -+ printk("fake_child_exit - waitpid failed, " -+ "errno = %d\n", errno); -+ return; -+ } -+ debugger_proxy(status, debugger.pid); -+ } -+ pid = waitpid(debugger.pid, &status, WUNTRACED); -+ if(pid != debugger.pid){ -+ printk("fake_child_exit - waitpid failed, " -+ "errno = %d\n", errno); -+ return; -+ } -+ if(ptrace(PTRACE_DETACH, debugger.pid, 0, SIGCONT) < 0) -+ printk("fake_child_exit - PTRACE_DETACH failed, errno = %d\n", -+ errno); -+} -+ -+char gdb_init_string[] = -+"att 1 \n\ -+b panic \n\ -+b stop \n\ -+handle SIGWINCH nostop noprint pass \n\ -+"; -+ -+int start_debugger(char *prog, int startup, int stop, int *fd_out) -+{ -+ int slave, child; -+ -+ slave = open_gdb_chan(); -+ if((child = fork()) == 0){ -+ char *tempname = NULL; -+ int fd; -+ -+ if(setsid() < 0) perror("setsid"); -+ if((dup2(slave, 0) < 0) || (dup2(slave, 1) < 0) || -+ (dup2(slave, 2) < 0)){ -+ printk("start_debugger : dup2 failed, errno = %d\n", -+ errno); -+ exit(1); -+ } -+ if(ioctl(0, TIOCSCTTY, 0) < 0){ -+ printk("start_debugger : TIOCSCTTY failed, " -+ "errno = %d\n", errno); -+ exit(1); -+ } -+ if(tcsetpgrp (1, os_getpid()) < 0){ -+ printk("start_debugger : tcsetpgrp failed, " -+ "errno = %d\n", errno); -+#ifdef notdef -+ exit(1); -+#endif -+ } -+ if((fd = make_tempfile("/tmp/gdb_init-XXXXXX", &tempname, 0)) < 0){ -+ printk("start_debugger : make_tempfile failed, errno = %d\n", -+ errno); -+ exit(1); -+ } -+ write(fd, gdb_init_string, sizeof(gdb_init_string) - 1); -+ if(startup){ -+ if(stop){ -+ write(fd, "b start_kernel\n", -+ strlen("b start_kernel\n")); -+ } -+ write(fd, "c\n", strlen("c\n")); -+ } -+ if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0){ -+ printk("start_debugger : PTRACE_TRACEME failed, " -+ "errno = %d\n", errno); -+ exit(1); -+ } -+ execlp("gdb", "gdb", "--command", tempname, prog, NULL); -+ printk("start_debugger : exec of gdb failed, errno = %d\n", -+ errno); -+ } -+ if(child < 0){ -+ printk("start_debugger : fork for gdb failed, errno = %d\n", -+ errno); -+ return(-1); -+ } -+ *fd_out = slave; -+ return(child); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/ptproxy.h um/arch/um/kernel/tt/ptproxy/ptproxy.h ---- orig/arch/um/kernel/tt/ptproxy/ptproxy.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ptproxy/ptproxy.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,61 @@ -+/********************************************************************** -+ptproxy.h -+ -+Copyright (C) 1999 Lars Brinkhoff. See the file COPYING for licensing -+terms and conditions. -+**********************************************************************/ -+ -+#ifndef __PTPROXY_H -+#define __PTPROXY_H -+ -+#include <sys/types.h> -+ -+typedef struct debugger debugger_state; -+typedef struct debugee debugee_state; -+ -+struct debugger -+{ -+ pid_t pid; -+ int wait_options; -+ int *wait_status_ptr; -+ unsigned int waiting : 1; -+ unsigned int real_wait : 1; -+ unsigned int expecting_child : 1; -+ int (*handle_trace) (debugger_state *, pid_t); -+ -+ debugee_state *debugee; -+}; -+ -+struct debugee -+{ -+ pid_t pid; -+ int wait_status; -+ unsigned int died : 1; -+ unsigned int event : 1; -+ unsigned int stopped : 1; -+ unsigned int trace_singlestep : 1; -+ unsigned int trace_syscall : 1; -+ unsigned int traced : 1; -+ unsigned int zombie : 1; -+ unsigned int in_context : 1; -+}; -+ -+extern int debugger_syscall(debugger_state *debugger, pid_t pid); -+extern int debugger_normal_return (debugger_state *debugger, pid_t unused); -+ -+extern long proxy_ptrace (struct debugger *, int, pid_t, long, long, pid_t, -+ int *strace_out); -+extern void debugger_cancelled_return(debugger_state *debugger, int result); -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/ptrace.c um/arch/um/kernel/tt/ptproxy/ptrace.c ---- orig/arch/um/kernel/tt/ptproxy/ptrace.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ptproxy/ptrace.c 2002-11-11 13:06:03.000000000 -0500 -@@ -0,0 +1,239 @@ -+/********************************************************************** -+ptrace.c -+ -+Copyright (C) 1999 Lars Brinkhoff. See the file COPYING for licensing -+terms and conditions. -+ -+Jeff Dike (jdike@karaya.com) : Modified for integration into uml -+**********************************************************************/ -+ -+#include <errno.h> -+#include <unistd.h> -+#include <signal.h> -+#include <sys/types.h> -+#include <sys/time.h> -+#include <sys/ptrace.h> -+#include <sys/wait.h> -+#include <asm/ptrace.h> -+ -+#include "ptproxy.h" -+#include "debug.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "ptrace_user.h" -+#include "tt.h" -+ -+long proxy_ptrace(struct debugger *debugger, int arg1, pid_t arg2, -+ long arg3, long arg4, pid_t child, int *ret) -+{ -+ sigset_t relay; -+ long result; -+ int status; -+ -+ *ret = 0; -+ if(debugger->debugee->died) return(-ESRCH); -+ -+ switch(arg1){ -+ case PTRACE_ATTACH: -+ if(debugger->debugee->traced) return(-EPERM); -+ -+ debugger->debugee->pid = arg2; -+ debugger->debugee->traced = 1; -+ -+ if(is_valid_pid(arg2) && (arg2 != child)){ -+ debugger->debugee->in_context = 0; -+ kill(arg2, SIGSTOP); -+ debugger->debugee->event = 1; -+ debugger->debugee->wait_status = W_STOPCODE(SIGSTOP); -+ } -+ else { -+ debugger->debugee->in_context = 1; -+ if(debugger->debugee->stopped) -+ child_proxy(child, W_STOPCODE(SIGSTOP)); -+ else kill(child, SIGSTOP); -+ } -+ -+ return(0); -+ -+ case PTRACE_DETACH: -+ if(!debugger->debugee->traced) return(-EPERM); -+ -+ debugger->debugee->traced = 0; -+ debugger->debugee->pid = 0; -+ if(!debugger->debugee->in_context) -+ kill(child, SIGCONT); -+ -+ return(0); -+ -+ case PTRACE_CONT: -+ if(!debugger->debugee->in_context) return(-EPERM); -+ *ret = PTRACE_CONT; -+ return(ptrace(PTRACE_CONT, child, arg3, arg4)); -+ -+#ifdef UM_HAVE_GETFPREGS -+ case PTRACE_GETFPREGS: -+ { -+ long regs[FP_FRAME_SIZE]; -+ int i, result; -+ -+ result = ptrace(PTRACE_GETFPREGS, child, 0, regs); -+ if(result == -1) return(-errno); -+ -+ for (i = 0; i < sizeof(regs)/sizeof(regs[0]); i++) -+ ptrace(PTRACE_POKEDATA, debugger->pid, arg4 + 4 * i, -+ regs[i]); -+ return(result); -+ } -+#endif -+ -+#ifdef UM_HAVE_GETFPXREGS -+ case PTRACE_GETFPXREGS: -+ { -+ long regs[FPX_FRAME_SIZE]; -+ int i, result; -+ -+ result = ptrace(PTRACE_GETFPXREGS, child, 0, regs); -+ if(result == -1) return(-errno); -+ -+ for (i = 0; i < sizeof(regs)/sizeof(regs[0]); i++) -+ ptrace(PTRACE_POKEDATA, debugger->pid, arg4 + 4 * i, -+ regs[i]); -+ return(result); -+ } -+#endif -+ -+#ifdef UM_HAVE_GETREGS -+ case PTRACE_GETREGS: -+ { -+ long regs[FRAME_SIZE]; -+ int i, result; -+ -+ result = ptrace(PTRACE_GETREGS, child, 0, regs); -+ if(result == -1) return(-errno); -+ -+ for (i = 0; i < sizeof(regs)/sizeof(regs[0]); i++) -+ ptrace (PTRACE_POKEDATA, debugger->pid, -+ arg4 + 4 * i, regs[i]); -+ return(result); -+ } -+ break; -+#endif -+ -+ case PTRACE_KILL: -+ result = ptrace(PTRACE_KILL, child, arg3, arg4); -+ if(result == -1) return(-errno); -+ -+ return(result); -+ -+ case PTRACE_PEEKDATA: -+ case PTRACE_PEEKTEXT: -+ case PTRACE_PEEKUSER: -+ /* The value being read out could be -1, so we have to -+ * check errno to see if there's an error, and zero it -+ * beforehand so we're not faked out by an old error -+ */ -+ -+ errno = 0; -+ result = ptrace(arg1, child, arg3, 0); -+ if((result == -1) && (errno != 0)) return(-errno); -+ -+ result = ptrace(PTRACE_POKEDATA, debugger->pid, arg4, result); -+ if(result == -1) return(-errno); -+ -+ return(result); -+ -+ case PTRACE_POKEDATA: -+ case PTRACE_POKETEXT: -+ case PTRACE_POKEUSER: -+ result = ptrace(arg1, child, arg3, arg4); -+ if(result == -1) return(-errno); -+ -+ if(arg1 == PTRACE_POKEUSER) ptrace_pokeuser(arg3, arg4); -+ return(result); -+ -+#ifdef UM_HAVE_SETFPREGS -+ case PTRACE_SETFPREGS: -+ { -+ long regs[FP_FRAME_SIZE]; -+ int i; -+ -+ for (i = 0; i < sizeof(regs)/sizeof(regs[0]); i++) -+ regs[i] = ptrace (PTRACE_PEEKDATA, debugger->pid, -+ arg4 + 4 * i, 0); -+ result = ptrace(PTRACE_SETFPREGS, child, 0, regs); -+ if(result == -1) return(-errno); -+ -+ return(result); -+ } -+#endif -+ -+#ifdef UM_HAVE_SETFPXREGS -+ case PTRACE_SETFPXREGS: -+ { -+ long regs[FPX_FRAME_SIZE]; -+ int i; -+ -+ for (i = 0; i < sizeof(regs)/sizeof(regs[0]); i++) -+ regs[i] = ptrace (PTRACE_PEEKDATA, debugger->pid, -+ arg4 + 4 * i, 0); -+ result = ptrace(PTRACE_SETFPXREGS, child, 0, regs); -+ if(result == -1) return(-errno); -+ -+ return(result); -+ } -+#endif -+ -+#ifdef UM_HAVE_SETREGS -+ case PTRACE_SETREGS: -+ { -+ long regs[FRAME_SIZE]; -+ int i; -+ -+ for (i = 0; i < sizeof(regs)/sizeof(regs[0]); i++) -+ regs[i] = ptrace(PTRACE_PEEKDATA, debugger->pid, -+ arg4 + 4 * i, 0); -+ result = ptrace(PTRACE_SETREGS, child, 0, regs); -+ if(result == -1) return(-errno); -+ -+ return(result); -+ } -+#endif -+ -+ case PTRACE_SINGLESTEP: -+ if(!debugger->debugee->in_context) return(-EPERM); -+ sigemptyset(&relay); -+ sigaddset(&relay, SIGSEGV); -+ sigaddset(&relay, SIGILL); -+ sigaddset(&relay, SIGBUS); -+ result = ptrace(PTRACE_SINGLESTEP, child, arg3, arg4); -+ if(result == -1) return(-errno); -+ -+ status = wait_for_stop(child, SIGTRAP, PTRACE_SINGLESTEP, -+ &relay); -+ child_proxy(child, status); -+ return(result); -+ -+ case PTRACE_SYSCALL: -+ if(!debugger->debugee->in_context) return(-EPERM); -+ result = ptrace(PTRACE_SYSCALL, child, arg3, arg4); -+ if(result == -1) return(-errno); -+ -+ *ret = PTRACE_SYSCALL; -+ return(result); -+ -+ case PTRACE_TRACEME: -+ default: -+ return(-EINVAL); -+ } -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/sysdep.c um/arch/um/kernel/tt/ptproxy/sysdep.c ---- orig/arch/um/kernel/tt/ptproxy/sysdep.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ptproxy/sysdep.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,71 @@ -+/********************************************************************** -+sysdep.c -+ -+Copyright (C) 1999 Lars Brinkhoff. See the file COPYING for licensing -+terms and conditions. -+**********************************************************************/ -+ -+#include <stdio.h> -+#include <string.h> -+#include <stdlib.h> -+#include <signal.h> -+#include <sys/types.h> -+#include <sys/ptrace.h> -+#include <asm/ptrace.h> -+#include <linux/unistd.h> -+#include "ptrace_user.h" -+#include "user_util.h" -+#include "user.h" -+ -+int get_syscall(pid_t pid, long *arg1, long *arg2, long *arg3, long *arg4, -+ long *arg5) -+{ -+ *arg1 = ptrace(PTRACE_PEEKUSER, pid, PT_SYSCALL_ARG1_OFFSET, 0); -+ *arg2 = ptrace(PTRACE_PEEKUSER, pid, PT_SYSCALL_ARG2_OFFSET, 0); -+ *arg3 = ptrace(PTRACE_PEEKUSER, pid, PT_SYSCALL_ARG3_OFFSET, 0); -+ *arg4 = ptrace(PTRACE_PEEKUSER, pid, PT_SYSCALL_ARG4_OFFSET, 0); -+ *arg5 = ptrace(PTRACE_PEEKUSER, pid, PT_SYSCALL_ARG5_OFFSET, 0); -+ return(ptrace(PTRACE_PEEKUSER, pid, PT_SYSCALL_NR_OFFSET, 0)); -+} -+ -+void syscall_cancel(pid_t pid, int result) -+{ -+ if((ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, -+ __NR_getpid) < 0) || -+ (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) || -+ (wait_for_stop(pid, SIGTRAP, PTRACE_SYSCALL, NULL) < 0) || -+ (ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_RET_OFFSET, result) < 0) || -+ (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)) -+ printk("ptproxy: couldn't cancel syscall: errno = %d\n", -+ errno); -+} -+ -+void syscall_set_result(pid_t pid, long result) -+{ -+ ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_RET_OFFSET, result); -+} -+ -+void syscall_continue(pid_t pid) -+{ -+ ptrace(PTRACE_SYSCALL, pid, 0, 0); -+} -+ -+int syscall_pause(pid_t pid) -+{ -+ if(ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, __NR_pause) < 0){ -+ printk("syscall_change - ptrace failed, errno = %d\n", errno); -+ return(-1); -+ } -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/sysdep.h um/arch/um/kernel/tt/ptproxy/sysdep.h ---- orig/arch/um/kernel/tt/ptproxy/sysdep.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ptproxy/sysdep.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,25 @@ -+/********************************************************************** -+sysdep.h -+ -+Copyright (C) 1999 Lars Brinkhoff. -+Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+See the file COPYING for licensing terms and conditions. -+**********************************************************************/ -+ -+extern int get_syscall(pid_t pid, long *arg1, long *arg2, long *arg3, -+ long *arg4, long *arg5); -+extern void syscall_cancel (pid_t pid, long result); -+extern void syscall_set_result (pid_t pid, long result); -+extern void syscall_continue (pid_t pid); -+extern int syscall_pause(pid_t pid); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/wait.c um/arch/um/kernel/tt/ptproxy/wait.c ---- orig/arch/um/kernel/tt/ptproxy/wait.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ptproxy/wait.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,86 @@ -+/********************************************************************** -+wait.c -+ -+Copyright (C) 1999 Lars Brinkhoff. See the file COPYING for licensing -+terms and conditions. -+ -+**********************************************************************/ -+ -+#include <errno.h> -+#include <signal.h> -+#include <sys/wait.h> -+#include <sys/ptrace.h> -+#include <asm/ptrace.h> -+ -+#include "ptproxy.h" -+#include "sysdep.h" -+#include "wait.h" -+#include "user_util.h" -+#include "sysdep/ptrace.h" -+#include "sysdep/ptrace_user.h" -+#include "sysdep/sigcontext.h" -+ -+int proxy_wait_return(struct debugger *debugger, pid_t unused) -+{ -+ debugger->waiting = 0; -+ -+ if(debugger->debugee->died || (debugger->wait_options & __WCLONE)){ -+ debugger_cancelled_return(debugger, -ECHILD); -+ return(0); -+ } -+ -+ if(debugger->debugee->zombie && debugger->debugee->event) -+ debugger->debugee->died = 1; -+ -+ if(debugger->debugee->event){ -+ debugger->debugee->event = 0; -+ ptrace(PTRACE_POKEDATA, debugger->pid, -+ debugger->wait_status_ptr, -+ debugger->debugee->wait_status); -+ /* if (wait4) -+ ptrace (PTRACE_POKEDATA, pid, rusage_ptr, ...); */ -+ debugger_cancelled_return(debugger, debugger->debugee->pid); -+ return(0); -+ } -+ -+ /* pause will return -EINTR, which happens to be right for wait */ -+ debugger_normal_return(debugger, -1); -+ return(0); -+} -+ -+int parent_wait_return(struct debugger *debugger, pid_t unused) -+{ -+ return(debugger_normal_return(debugger, -1)); -+} -+ -+int real_wait_return(struct debugger *debugger) -+{ -+ unsigned long ip; -+ int err, pid; -+ -+ pid = debugger->pid; -+ ip = ptrace(PTRACE_PEEKUSER, pid, PT_IP_OFFSET, 0); -+ ip = IP_RESTART_SYSCALL(ip); -+ err = ptrace(PTRACE_POKEUSER, pid, PT_IP_OFFSET, ip); -+ if(ptrace(PTRACE_POKEUSER, pid, PT_IP_OFFSET, ip) < 0) -+ tracer_panic("real_wait_return : Failed to restart system " -+ "call, errno = %d\n"); -+ if((ptrace(PTRACE_SYSCALL, debugger->pid, 0, SIGCHLD) < 0) || -+ (ptrace(PTRACE_SYSCALL, debugger->pid, 0, 0) < 0) || -+ (ptrace(PTRACE_SYSCALL, debugger->pid, 0, 0) < 0) || -+ debugger_normal_return(debugger, -1)) -+ tracer_panic("real_wait_return : gdb failed to wait, " -+ "errno = %d\n"); -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/ptproxy/wait.h um/arch/um/kernel/tt/ptproxy/wait.h ---- orig/arch/um/kernel/tt/ptproxy/wait.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/ptproxy/wait.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,15 @@ -+/********************************************************************** -+wait.h -+ -+Copyright (C) 1999 Lars Brinkhoff. See the file COPYING for licensing -+terms and conditions. -+**********************************************************************/ -+ -+#ifndef __PTPROXY_WAIT_H -+#define __PTPROXY_WAIT_H -+ -+extern int proxy_wait_return(struct debugger *debugger, pid_t unused); -+extern int real_wait_return(struct debugger *debugger); -+extern int parent_wait_return(struct debugger *debugger, pid_t unused); -+ -+#endif -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/syscall_kern.c um/arch/um/kernel/tt/syscall_kern.c ---- orig/arch/um/kernel/tt/syscall_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/syscall_kern.c 2002-12-08 19:32:53.000000000 -0500 -@@ -0,0 +1,142 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/types.h" -+#include "linux/utime.h" -+#include "linux/sys.h" -+#include "asm/unistd.h" -+#include "asm/ptrace.h" -+#include "asm/uaccess.h" -+#include "sysdep/syscalls.h" -+#include "kern_util.h" -+ -+static inline int check_area(void *ptr, int size) -+{ -+ return(verify_area(VERIFY_WRITE, ptr, size)); -+} -+ -+static int check_readlink(struct pt_regs *regs) -+{ -+ return(check_area((void *) UPT_SYSCALL_ARG1(®s->regs), -+ UPT_SYSCALL_ARG2(®s->regs))); -+} -+ -+static int check_utime(struct pt_regs *regs) -+{ -+ return(check_area((void *) UPT_SYSCALL_ARG1(®s->regs), -+ sizeof(struct utimbuf))); -+} -+ -+static int check_oldstat(struct pt_regs *regs) -+{ -+ return(check_area((void *) UPT_SYSCALL_ARG1(®s->regs), -+ sizeof(struct __old_kernel_stat))); -+} -+ -+static int check_stat(struct pt_regs *regs) -+{ -+ return(check_area((void *) UPT_SYSCALL_ARG1(®s->regs), -+ sizeof(struct stat))); -+} -+ -+static int check_stat64(struct pt_regs *regs) -+{ -+ return(check_area((void *) UPT_SYSCALL_ARG1(®s->regs), -+ sizeof(struct stat64))); -+} -+ -+struct bogus { -+ int kernel_ds; -+ int (*check_params)(struct pt_regs *); -+}; -+ -+struct bogus this_is_bogus[256] = { -+ [ __NR_mknod ] = { 1, NULL }, -+ [ __NR_mkdir ] = { 1, NULL }, -+ [ __NR_rmdir ] = { 1, NULL }, -+ [ __NR_unlink ] = { 1, NULL }, -+ [ __NR_symlink ] = { 1, NULL }, -+ [ __NR_link ] = { 1, NULL }, -+ [ __NR_rename ] = { 1, NULL }, -+ [ __NR_umount ] = { 1, NULL }, -+ [ __NR_mount ] = { 1, NULL }, -+ [ __NR_pivot_root ] = { 1, NULL }, -+ [ __NR_chdir ] = { 1, NULL }, -+ [ __NR_chroot ] = { 1, NULL }, -+ [ __NR_open ] = { 1, NULL }, -+ [ __NR_quotactl ] = { 1, NULL }, -+ [ __NR_sysfs ] = { 1, NULL }, -+ [ __NR_readlink ] = { 1, check_readlink }, -+ [ __NR_acct ] = { 1, NULL }, -+ [ __NR_execve ] = { 1, NULL }, -+ [ __NR_uselib ] = { 1, NULL }, -+ [ __NR_statfs ] = { 1, NULL }, -+ [ __NR_truncate ] = { 1, NULL }, -+ [ __NR_access ] = { 1, NULL }, -+ [ __NR_chmod ] = { 1, NULL }, -+ [ __NR_chown ] = { 1, NULL }, -+ [ __NR_lchown ] = { 1, NULL }, -+ [ __NR_utime ] = { 1, check_utime }, -+ [ __NR_oldlstat ] = { 1, check_oldstat }, -+ [ __NR_oldstat ] = { 1, check_oldstat }, -+ [ __NR_stat ] = { 1, check_stat }, -+ [ __NR_lstat ] = { 1, check_stat }, -+ [ __NR_stat64 ] = { 1, check_stat64 }, -+ [ __NR_lstat64 ] = { 1, check_stat64 }, -+ [ __NR_chown32 ] = { 1, NULL }, -+}; -+ -+/* sys_utimes */ -+ -+static int check_bogosity(struct pt_regs *regs) -+{ -+ struct bogus *bogon = &this_is_bogus[UPT_SYSCALL_NR(®s->regs)]; -+ -+ if(!bogon->kernel_ds) return(0); -+ if(bogon->check_params && (*bogon->check_params)(regs)) -+ return(-EFAULT); -+ set_fs(KERNEL_DS); -+ return(0); -+} -+ -+extern syscall_handler_t *sys_call_table[]; -+ -+long execute_syscall_tt(void *r) -+{ -+ struct pt_regs *regs = r; -+ long res; -+ int syscall; -+ -+ current->thread.nsyscalls++; -+ nsyscalls++; -+ syscall = UPT_SYSCALL_NR(®s->regs); -+ -+ if((syscall >= NR_syscalls) || (syscall < 0)) -+ res = -ENOSYS; -+ else if(honeypot && check_bogosity(regs)) -+ res = -EFAULT; -+ else res = EXECUTE_SYSCALL(syscall, regs); -+ -+ set_fs(USER_DS); -+ -+ if(current->thread.mode.tt.singlestep_syscall){ -+ current->thread.mode.tt.singlestep_syscall = 0; -+ current->ptrace &= ~PT_DTRACE; -+ force_sig(SIGTRAP, current); -+ } -+ -+ return(res); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/syscall_user.c um/arch/um/kernel/tt/syscall_user.c ---- orig/arch/um/kernel/tt/syscall_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/syscall_user.c 2002-12-08 21:00:11.000000000 -0500 -@@ -0,0 +1,89 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <unistd.h> -+#include <signal.h> -+#include <errno.h> -+#include <sys/ptrace.h> -+#include <asm/unistd.h> -+#include "sysdep/ptrace.h" -+#include "sigcontext.h" -+#include "ptrace_user.h" -+#include "task.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "syscall_user.h" -+#include "tt.h" -+ -+/* XXX Bogus */ -+#define ERESTARTSYS 512 -+#define ERESTARTNOINTR 513 -+#define ERESTARTNOHAND 514 -+ -+void syscall_handler_tt(int sig, union uml_pt_regs *regs) -+{ -+ void *sc; -+ long result; -+ int index, syscall; -+ -+ syscall = UPT_SYSCALL_NR(regs); -+ sc = UPT_SC(regs); -+ SC_START_SYSCALL(sc); -+ -+ index = record_syscall_start(syscall); -+ syscall_trace(); -+ result = execute_syscall(regs); -+ -+ /* regs->sc may have changed while the system call ran (there may -+ * have been an interrupt or segfault), so it needs to be refreshed. -+ */ -+ UPT_SC(regs) = sc; -+ -+ SC_SET_SYSCALL_RETURN(sc, result); -+ if((result == -ERESTARTNOHAND) || (result == -ERESTARTSYS) || -+ (result == -ERESTARTNOINTR)) -+ do_signal(result); -+ -+ syscall_trace(); -+ record_syscall_end(index, result); -+} -+ -+int do_syscall(void *task, int pid) -+{ -+ unsigned long proc_regs[FRAME_SIZE]; -+ union uml_pt_regs *regs; -+ int syscall; -+ -+ if(ptrace_getregs(pid, proc_regs) < 0) -+ tracer_panic("Couldn't read registers"); -+ syscall = PT_SYSCALL_NR(proc_regs); -+ -+ regs = TASK_REGS(task); -+ UPT_SYSCALL_NR(regs) = syscall; -+ -+ if(syscall < 1) return(0); -+ -+ if((syscall != __NR_sigreturn) && -+ ((unsigned long *) PT_IP(proc_regs) >= &_stext) && -+ ((unsigned long *) PT_IP(proc_regs) <= &_etext)) -+ tracer_panic("I'm tracing myself and I can't get out"); -+ -+ if(ptrace(PTRACE_POKEUSER, pid, PT_SYSCALL_NR_OFFSET, -+ __NR_getpid) < 0) -+ tracer_panic("do_syscall : Nullifying syscall failed, " -+ "errno = %d", errno); -+ return(1); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/sys-i386/Makefile um/arch/um/kernel/tt/sys-i386/Makefile ---- orig/arch/um/kernel/tt/sys-i386/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/sys-i386/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,17 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET = sys-i386.o -+ -+obj-y = sigcontext.o -+ -+USER_OBJS = sigcontext.o -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+clean : -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/sys-i386/sigcontext.c um/arch/um/kernel/tt/sys-i386/sigcontext.c ---- orig/arch/um/kernel/tt/sys-i386/sigcontext.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/sys-i386/sigcontext.c 2002-12-01 23:33:52.000000000 -0500 -@@ -0,0 +1,60 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <asm/sigcontext.h> -+#include "kern_util.h" -+#include "sysdep/frame.h" -+ -+int copy_sc_from_user_tt(void *to_ptr, void *from_ptr, void *data) -+{ -+ struct arch_frame_data *arch = data; -+ struct sigcontext *to = to_ptr, *from = from_ptr; -+ struct _fpstate *to_fp, *from_fp; -+ unsigned long sigs; -+ int err; -+ -+ to_fp = to->fpstate; -+ from_fp = from->fpstate; -+ sigs = to->oldmask; -+ err = copy_from_user_proc(to, from, sizeof(*to)); -+ to->oldmask = sigs; -+ if(to_fp != NULL){ -+ err |= copy_from_user_proc(&to->fpstate, &to_fp, -+ sizeof(to->fpstate)); -+ err |= copy_from_user_proc(to_fp, from_fp, arch->fpstate_size); -+ } -+ return(err); -+} -+ -+int copy_sc_to_user_tt(void *to_ptr, void *fp, void *from_ptr, void *data) -+{ -+ struct arch_frame_data *arch = data; -+ struct sigcontext *to = to_ptr, *from = from_ptr; -+ struct _fpstate *to_fp, *from_fp; -+ int err; -+ -+ to_fp = (struct _fpstate *) -+ (fp ? (unsigned long) fp : ((unsigned long) to + sizeof(*to))); -+ from_fp = from->fpstate; -+ err = copy_to_user_proc(to, from, sizeof(*to)); -+ if(from_fp != NULL){ -+ err |= copy_to_user_proc(&to->fpstate, &to_fp, -+ sizeof(to->fpstate)); -+ err |= copy_to_user_proc(to_fp, from_fp, arch->fpstate_size); -+ } -+ return(err); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/time.c um/arch/um/kernel/tt/time.c ---- orig/arch/um/kernel/tt/time.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/time.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,28 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <signal.h> -+#include <sys/time.h> -+#include <time_user.h> -+#include "process.h" -+#include "user.h" -+ -+void user_time_init_tt(void) -+{ -+ if(signal(SIGVTALRM, (__sighandler_t) alarm_handler) == SIG_ERR) -+ panic("Couldn't set SIGVTALRM handler"); -+ set_interval(ITIMER_VIRTUAL); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/tlb.c um/arch/um/kernel/tt/tlb.c ---- orig/arch/um/kernel/tt/tlb.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/tlb.c 2002-12-19 13:03:11.000000000 -0500 -@@ -0,0 +1,220 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/stddef.h" -+#include "linux/kernel.h" -+#include "linux/sched.h" -+#include "asm/page.h" -+#include "asm/pgtable.h" -+#include "asm/uaccess.h" -+#include "user_util.h" -+#include "mem_user.h" -+#include "os.h" -+ -+static void fix_range(struct mm_struct *mm, unsigned long start_addr, -+ unsigned long end_addr, int force) -+{ -+ pgd_t *npgd; -+ pmd_t *npmd; -+ pte_t *npte; -+ unsigned long addr; -+ int r, w, x, err; -+ -+ if((current->thread.mode.tt.extern_pid != -1) && -+ (current->thread.mode.tt.extern_pid != os_getpid())) -+ panic("fix_range fixing wrong address space, current = 0x%p", -+ current); -+ if(mm == NULL) return; -+ for(addr=start_addr;addr<end_addr;){ -+ if(addr == TASK_SIZE){ -+ /* Skip over kernel text, kernel data, and physical -+ * memory, which don't have ptes, plus kernel virtual -+ * memory, which is flushed separately, and remap -+ * the process stack. The only way to get here is -+ * if (end_addr == STACK_TOP) > TASK_SIZE, which is -+ * only true in the honeypot case. -+ */ -+ addr = STACK_TOP - ABOVE_KMEM; -+ continue; -+ } -+ npgd = pgd_offset(mm, addr); -+ npmd = pmd_offset(npgd, addr); -+ if(pmd_present(*npmd)){ -+ npte = pte_offset(npmd, addr); -+ r = pte_read(*npte); -+ w = pte_write(*npte); -+ x = pte_exec(*npte); -+ if(!pte_dirty(*npte)) w = 0; -+ if(!pte_young(*npte)){ -+ r = 0; -+ w = 0; -+ } -+ if(force || pte_newpage(*npte)){ -+ err = os_unmap_memory((void *) addr, -+ PAGE_SIZE); -+ if(err < 0) -+ panic("munmap failed, errno = %d\n", -+ -err); -+ if(pte_present(*npte)) -+ map_memory(addr, -+ pte_val(*npte) & PAGE_MASK, -+ PAGE_SIZE, r, w, x); -+ } -+ else if(pte_newprot(*npte)){ -+ protect_memory(addr, PAGE_SIZE, r, w, x, 1); -+ } -+ *npte = pte_mkuptodate(*npte); -+ addr += PAGE_SIZE; -+ } -+ else { -+ if(force || pmd_newpage(*npmd)){ -+ err = os_unmap_memory((void *) addr, PMD_SIZE); -+ if(err < 0) -+ panic("munmap failed, errno = %d\n", -+ -err); -+ pmd_mkuptodate(*npmd); -+ } -+ addr += PMD_SIZE; -+ } -+ } -+} -+ -+atomic_t vmchange_seq = ATOMIC_INIT(1); -+ -+static void flush_kernel_vm_range(unsigned long start, unsigned long end, -+ int update_seq) -+{ -+ struct mm_struct *mm; -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ unsigned long addr; -+ int updated = 0, err; -+ -+ mm = &init_mm; -+ for(addr = start; addr < end;){ -+ pgd = pgd_offset(mm, addr); -+ pmd = pmd_offset(pgd, addr); -+ if(pmd_present(*pmd)){ -+ pte = pte_offset(pmd, addr); -+ if(!pte_present(*pte) || pte_newpage(*pte)){ -+ updated = 1; -+ err = os_unmap_memory((void *) addr, -+ PAGE_SIZE); -+ if(err < 0) -+ panic("munmap failed, errno = %d\n", -+ -err); -+ if(pte_present(*pte)) -+ map_memory(addr, -+ pte_val(*pte) & PAGE_MASK, -+ PAGE_SIZE, 1, 1, 1); -+ } -+ else if(pte_newprot(*pte)){ -+ updated = 1; -+ protect_memory(addr, PAGE_SIZE, 1, 1, 1, 1); -+ } -+ addr += PAGE_SIZE; -+ } -+ else { -+ if(pmd_newpage(*pmd)){ -+ updated = 1; -+ err = os_unmap_memory((void *) addr, PMD_SIZE); -+ if(err < 0) -+ panic("munmap failed, errno = %d\n", -+ -err); -+ } -+ addr += PMD_SIZE; -+ } -+ } -+ if(updated && update_seq) atomic_inc(&vmchange_seq); -+} -+ -+static void protect_vm_page(unsigned long addr, int w, int must_succeed) -+{ -+ int err; -+ -+ err = protect_memory(addr, PAGE_SIZE, 1, w, 1, must_succeed); -+ if(err == 0) return; -+ else if((err == -EFAULT) || (err == -ENOMEM)){ -+ flush_kernel_vm_range(addr, addr + PAGE_SIZE, 1); -+ protect_vm_page(addr, w, 1); -+ } -+ else panic("protect_vm_page : protect failed, errno = %d\n", err); -+} -+ -+void mprotect_kernel_vm(int w) -+{ -+ struct mm_struct *mm; -+ pgd_t *pgd; -+ pmd_t *pmd; -+ pte_t *pte; -+ unsigned long addr; -+ -+ mm = &init_mm; -+ for(addr = start_vm; addr < end_vm;){ -+ pgd = pgd_offset(mm, addr); -+ pmd = pmd_offset(pgd, addr); -+ if(pmd_present(*pmd)){ -+ pte = pte_offset(pmd, addr); -+ if(pte_present(*pte)) protect_vm_page(addr, w, 0); -+ addr += PAGE_SIZE; -+ } -+ else addr += PMD_SIZE; -+ } -+} -+ -+void flush_tlb_kernel_vm_tt(void) -+{ -+ flush_kernel_vm_range(start_vm, end_vm, 1); -+} -+ -+void __flush_tlb_one_tt(unsigned long addr) -+{ -+ flush_kernel_vm_range(addr, addr + PAGE_SIZE, 1); -+} -+ -+void flush_tlb_range_tt(struct mm_struct *mm, unsigned long start, -+ unsigned long end) -+{ -+ if(mm != current->mm) return; -+ -+ /* Assumes that the range start ... end is entirely within -+ * either process memory or kernel vm -+ */ -+ if((start >= start_vm) && (start < end_vm)) -+ flush_kernel_vm_range(start, end, 1); -+ else fix_range(mm, start, end, 0); -+} -+ -+void flush_tlb_mm_tt(struct mm_struct *mm) -+{ -+ unsigned long seq; -+ -+ if(mm != current->mm) return; -+ -+ fix_range(mm, 0, STACK_TOP, 0); -+ -+ seq = atomic_read(&vmchange_seq); -+ if(current->thread.mode.tt.vm_seq == seq) return; -+ current->thread.mode.tt.vm_seq = seq; -+ flush_kernel_vm_range(start_vm, end_vm, 0); -+} -+ -+void force_flush_all_tt(void) -+{ -+ fix_range(current->mm, 0, STACK_TOP, 1); -+ flush_kernel_vm_range(start_vm, end_vm, 0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/tracer.c um/arch/um/kernel/tt/tracer.c ---- orig/arch/um/kernel/tt/tracer.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/tracer.c 2003-03-26 10:01:33.000000000 -0500 -@@ -0,0 +1,453 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <stdarg.h> -+#include <unistd.h> -+#include <signal.h> -+#include <errno.h> -+#include <sched.h> -+#include <string.h> -+#include <sys/mman.h> -+#include <sys/ptrace.h> -+#include <sys/time.h> -+#include <sys/wait.h> -+#include "user.h" -+#include "sysdep/ptrace.h" -+#include "sigcontext.h" -+#include "sysdep/sigcontext.h" -+#include "os.h" -+#include "signal_user.h" -+#include "user_util.h" -+#include "mem_user.h" -+#include "process.h" -+#include "kern_util.h" -+#include "frame.h" -+#include "chan_user.h" -+#include "ptrace_user.h" -+#include "mode.h" -+#include "tt.h" -+ -+static int tracer_winch[2]; -+ -+int is_tracer_winch(int pid, int fd, void *data) -+{ -+ if(pid != tracing_pid) -+ return(0); -+ -+ register_winch_irq(tracer_winch[0], fd, -1, data); -+ return(1); -+} -+ -+static void tracer_winch_handler(int sig) -+{ -+ char c = 1; -+ -+ if(write(tracer_winch[1], &c, sizeof(c)) != sizeof(c)) -+ printk("tracer_winch_handler - write failed, errno = %d\n", -+ errno); -+} -+ -+/* Called only by the tracing thread during initialization */ -+ -+static void setup_tracer_winch(void) -+{ -+ int err; -+ -+ err = os_pipe(tracer_winch, 1, 1); -+ if(err){ -+ printk("setup_tracer_winch : os_pipe failed, errno = %d\n", -+ -err); -+ return; -+ } -+ signal(SIGWINCH, tracer_winch_handler); -+} -+ -+void attach_process(int pid) -+{ -+ if((ptrace(PTRACE_ATTACH, pid, 0, 0) < 0) || -+ (ptrace(PTRACE_CONT, pid, 0, 0) < 0)) -+ tracer_panic("OP_FORK failed to attach pid"); -+ wait_for_stop(pid, SIGSTOP, PTRACE_CONT, NULL); -+ if(ptrace(PTRACE_CONT, pid, 0, 0) < 0) -+ tracer_panic("OP_FORK failed to continue process"); -+} -+ -+void tracer_panic(char *format, ...) -+{ -+ va_list ap; -+ -+ va_start(ap, format); -+ vprintf(format, ap); -+ printf("\n"); -+ while(1) pause(); -+} -+ -+static void tracer_segv(int sig, struct sigcontext sc) -+{ -+ printf("Tracing thread segfault at address 0x%lx, ip 0x%lx\n", -+ SC_FAULT_ADDR(&sc), SC_IP(&sc)); -+ while(1) -+ pause(); -+} -+ -+/* Changed early in boot, and then only read */ -+int debug = 0; -+int debug_stop = 1; -+int debug_parent = 0; -+int honeypot = 0; -+ -+static int signal_tramp(void *arg) -+{ -+ int (*proc)(void *); -+ -+ if(honeypot && munmap((void *) (host_task_size - 0x10000000), -+ 0x10000000)) -+ panic("Unmapping stack failed"); -+ if(ptrace(PTRACE_TRACEME, 0, 0, 0) < 0) -+ panic("ptrace PTRACE_TRACEME failed"); -+ os_stop_process(os_getpid()); -+ change_sig(SIGWINCH, 0); -+ signal(SIGUSR1, SIG_IGN); -+ change_sig(SIGCHLD, 0); -+ signal(SIGSEGV, (__sighandler_t) sig_handler); -+ set_cmdline("(idle thread)"); -+ set_init_pid(os_getpid()); -+ proc = arg; -+ return((*proc)(NULL)); -+} -+ -+static void sleeping_process_signal(int pid, int sig) -+{ -+ switch(sig){ -+ /* These two result from UML being ^Z-ed and bg-ed. PTRACE_CONT is -+ * right because the process must be in the kernel already. -+ */ -+ case SIGCONT: -+ case SIGTSTP: -+ if(ptrace(PTRACE_CONT, pid, 0, sig) < 0) -+ tracer_panic("sleeping_process_signal : Failed to " -+ "continue pid %d, errno = %d\n", pid, -+ sig); -+ break; -+ -+ /* This happens when the debugger (e.g. strace) is doing system call -+ * tracing on the kernel. During a context switch, the current task -+ * will be set to the incoming process and the outgoing process will -+ * hop into write and then read. Since it's not the current process -+ * any more, the trace of those will land here. So, we need to just -+ * PTRACE_SYSCALL it. -+ */ -+ case SIGTRAP: -+ if(ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0) -+ tracer_panic("sleeping_process_signal : Failed to " -+ "PTRACE_SYSCALL pid %d, errno = %d\n", -+ pid, sig); -+ break; -+ case SIGSTOP: -+ break; -+ default: -+ tracer_panic("sleeping process %d got unexpected " -+ "signal : %d\n", pid, sig); -+ break; -+ } -+} -+ -+/* Accessed only by the tracing thread */ -+int debugger_pid = -1; -+int debugger_parent = -1; -+int debugger_fd = -1; -+int gdb_pid = -1; -+ -+struct { -+ int pid; -+ int signal; -+ unsigned long addr; -+ struct timeval time; -+} signal_record[1024][32]; -+ -+int signal_index[32]; -+int nsignals = 0; -+int debug_trace = 0; -+extern int io_nsignals, io_count, intr_count; -+ -+extern void signal_usr1(int sig); -+ -+int tracing_pid = -1; -+ -+int tracer(int (*init_proc)(void *), void *sp) -+{ -+ void *task = NULL; -+ unsigned long eip = 0; -+ int status, pid = 0, sig = 0, cont_type, tracing = 0, op = 0; -+ int last_index, proc_id = 0, n, err, old_tracing = 0, strace = 0; -+ -+ capture_signal_stack(); -+ signal(SIGPIPE, SIG_IGN); -+ setup_tracer_winch(); -+ tracing_pid = os_getpid(); -+ printf("tracing thread pid = %d\n", tracing_pid); -+ -+ pid = clone(signal_tramp, sp, CLONE_FILES | SIGCHLD, init_proc); -+ n = waitpid(pid, &status, WUNTRACED); -+ if(n < 0){ -+ printf("waitpid on idle thread failed, errno = %d\n", errno); -+ exit(1); -+ } -+ if((ptrace(PTRACE_CONT, pid, 0, 0) < 0)){ -+ printf("Failed to continue idle thread, errno = %d\n", errno); -+ exit(1); -+ } -+ -+ signal(SIGSEGV, (sighandler_t) tracer_segv); -+ signal(SIGUSR1, signal_usr1); -+ if(debug_trace){ -+ printf("Tracing thread pausing to be attached\n"); -+ stop(); -+ } -+ if(debug){ -+ if(gdb_pid != -1) -+ debugger_pid = attach_debugger(pid, gdb_pid, 1); -+ else debugger_pid = init_ptrace_proxy(pid, 1, debug_stop); -+ if(debug_parent){ -+ debugger_parent = os_process_parent(debugger_pid); -+ init_parent_proxy(debugger_parent); -+ err = attach(debugger_parent); -+ if(err){ -+ printf("Failed to attach debugger parent %d, " -+ "errno = %d\n", debugger_parent, err); -+ debugger_parent = -1; -+ } -+ else { -+ if(ptrace(PTRACE_SYSCALL, debugger_parent, -+ 0, 0) < 0){ -+ printf("Failed to continue debugger " -+ "parent, errno = %d\n", errno); -+ debugger_parent = -1; -+ } -+ } -+ } -+ } -+ set_cmdline("(tracing thread)"); -+ while(1){ -+ if((pid = waitpid(-1, &status, WUNTRACED)) <= 0){ -+ if(errno != ECHILD){ -+ printf("wait failed - errno = %d\n", errno); -+ } -+ continue; -+ } -+ if(pid == debugger_pid){ -+ int cont = 0; -+ -+ if(WIFEXITED(status) || WIFSIGNALED(status)) -+ debugger_pid = -1; -+ /* XXX Figure out how to deal with gdb and SMP */ -+ else cont = debugger_signal(status, cpu_tasks[0].pid); -+ if(cont == PTRACE_SYSCALL) strace = 1; -+ continue; -+ } -+ else if(pid == debugger_parent){ -+ debugger_parent_signal(status, pid); -+ continue; -+ } -+ nsignals++; -+ if(WIFEXITED(status)) ; -+#ifdef notdef -+ { -+ printf("Child %d exited with status %d\n", pid, -+ WEXITSTATUS(status)); -+ } -+#endif -+ else if(WIFSIGNALED(status)){ -+ sig = WTERMSIG(status); -+ if(sig != 9){ -+ printf("Child %d exited with signal %d\n", pid, -+ sig); -+ } -+ } -+ else if(WIFSTOPPED(status)){ -+ proc_id = pid_to_processor_id(pid); -+ sig = WSTOPSIG(status); -+ if(signal_index[proc_id] == 1024){ -+ signal_index[proc_id] = 0; -+ last_index = 1023; -+ } -+ else last_index = signal_index[proc_id] - 1; -+ if(((sig == SIGPROF) || (sig == SIGVTALRM) || -+ (sig == SIGALRM)) && -+ (signal_record[proc_id][last_index].signal == sig)&& -+ (signal_record[proc_id][last_index].pid == pid)) -+ signal_index[proc_id] = last_index; -+ signal_record[proc_id][signal_index[proc_id]].pid = pid; -+ gettimeofday(&signal_record[proc_id][signal_index[proc_id]].time, NULL); -+ eip = ptrace(PTRACE_PEEKUSER, pid, PT_IP_OFFSET, 0); -+ signal_record[proc_id][signal_index[proc_id]].addr = eip; -+ signal_record[proc_id][signal_index[proc_id]++].signal = sig; -+ -+ if(proc_id == -1){ -+ sleeping_process_signal(pid, sig); -+ continue; -+ } -+ -+ task = cpu_tasks[proc_id].task; -+ tracing = is_tracing(task); -+ old_tracing = tracing; -+ -+ switch(sig){ -+ case SIGUSR1: -+ sig = 0; -+ op = do_proc_op(task, proc_id); -+ switch(op){ -+ case OP_TRACE_ON: -+ arch_leave_kernel(task, pid); -+ tracing = 1; -+ break; -+ case OP_REBOOT: -+ case OP_HALT: -+ unmap_physmem(); -+ kmalloc_ok = 0; -+ ptrace(PTRACE_KILL, pid, 0, 0); -+ return(op == OP_REBOOT); -+ case OP_NONE: -+ printf("Detaching pid %d\n", pid); -+ detach(pid, SIGSTOP); -+ continue; -+ default: -+ break; -+ } -+ /* OP_EXEC switches host processes on us, -+ * we want to continue the new one. -+ */ -+ pid = cpu_tasks[proc_id].pid; -+ break; -+ case SIGTRAP: -+ if(!tracing && (debugger_pid != -1)){ -+ child_signal(pid, status); -+ continue; -+ } -+ tracing = 0; -+ if(do_syscall(task, pid)) sig = SIGUSR2; -+ else clear_singlestep(task); -+ break; -+ case SIGPROF: -+ if(tracing) sig = 0; -+ break; -+ case SIGCHLD: -+ case SIGHUP: -+ sig = 0; -+ break; -+ case SIGSEGV: -+ case SIGIO: -+ case SIGALRM: -+ case SIGVTALRM: -+ case SIGFPE: -+ case SIGBUS: -+ case SIGILL: -+ case SIGWINCH: -+ default: -+ tracing = 0; -+ break; -+ } -+ set_tracing(task, tracing); -+ -+ if(!tracing && old_tracing) -+ arch_enter_kernel(task, pid); -+ -+ if(!tracing && (debugger_pid != -1) && (sig != 0) && -+ (sig != SIGALRM) && (sig != SIGVTALRM) && -+ (sig != SIGSEGV) && (sig != SIGTRAP) && -+ (sig != SIGUSR2) && (sig != SIGIO) && -+ (sig != SIGFPE)){ -+ child_signal(pid, status); -+ continue; -+ } -+ -+ if(tracing){ -+ if(singlestepping_tt(task)) -+ cont_type = PTRACE_SINGLESTEP; -+ else cont_type = PTRACE_SYSCALL; -+ } -+ else cont_type = PTRACE_CONT; -+ -+ if((cont_type == PTRACE_CONT) && -+ (debugger_pid != -1) && strace) -+ cont_type = PTRACE_SYSCALL; -+ -+ if(ptrace(cont_type, pid, 0, sig) != 0){ -+ tracer_panic("ptrace failed to continue " -+ "process - errno = %d\n", -+ errno); -+ } -+ } -+ } -+ return(0); -+} -+ -+static int __init uml_debug_setup(char *line, int *add) -+{ -+ char *next; -+ -+ debug = 1; -+ *add = 0; -+ if(*line != '=') return(0); -+ line++; -+ -+ while(line != NULL){ -+ next = strchr(line, ','); -+ if(next) *next++ = '\0'; -+ -+ if(!strcmp(line, "go")) debug_stop = 0; -+ else if(!strcmp(line, "parent")) debug_parent = 1; -+ else printf("Unknown debug option : '%s'\n", line); -+ -+ line = next; -+ } -+ return(0); -+} -+ -+__uml_setup("debug", uml_debug_setup, -+"debug\n" -+" Starts up the kernel under the control of gdb. See the \n" -+" kernel debugging tutorial and the debugging session pages\n" -+" at http://user-mode-linux.sourceforge.net/ for more information.\n\n" -+); -+ -+static int __init uml_debugtrace_setup(char *line, int *add) -+{ -+ debug_trace = 1; -+ return 0; -+} -+__uml_setup("debugtrace", uml_debugtrace_setup, -+"debugtrace\n" -+" Causes the tracing thread to pause until it is attached by a\n" -+" debugger and continued. This is mostly for debugging crashes\n" -+" early during boot, and should be pretty much obsoleted by\n" -+" the debug switch.\n\n" -+); -+ -+static int __init uml_honeypot_setup(char *line, int *add) -+{ -+ jail_setup("", add); -+ honeypot = 1; -+ return 0; -+} -+__uml_setup("honeypot", uml_honeypot_setup, -+"honeypot\n" -+" This makes UML put process stacks in the same location as they are\n" -+" on the host, allowing expoits such as stack smashes to work against\n" -+" UML. This implies 'jail'.\n\n" -+); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/trap_user.c um/arch/um/kernel/tt/trap_user.c ---- orig/arch/um/kernel/tt/trap_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/trap_user.c 2002-12-09 13:14:42.000000000 -0500 -@@ -0,0 +1,59 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <errno.h> -+#include <signal.h> -+#include <asm/sigcontext.h> -+#include "sysdep/ptrace.h" -+#include "signal_user.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "task.h" -+#include "tt.h" -+ -+void sig_handler_common_tt(int sig, void *sc_ptr) -+{ -+ struct sigcontext *sc = sc_ptr; -+ struct tt_regs save_regs, *r; -+ struct signal_info *info; -+ int save_errno = errno, is_user; -+ -+ unprotect_kernel_mem(); -+ -+ r = &TASK_REGS(get_current())->tt; -+ save_regs = *r; -+ is_user = user_context(SC_SP(sc)); -+ r->sc = sc; -+ if(sig != SIGUSR2) -+ r->syscall = -1; -+ -+ change_sig(SIGUSR1, 1); -+ info = &sig_info[sig]; -+ if(!info->is_irq) unblock_signals(); -+ -+ (*info->handler)(sig, (union uml_pt_regs *) r); -+ -+ if(is_user){ -+ interrupt_end(); -+ block_signals(); -+ change_sig(SIGUSR1, 0); -+ set_user_mode(NULL); -+ } -+ *r = save_regs; -+ errno = save_errno; -+ if(is_user) protect_kernel_mem(); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/uaccess_user.c um/arch/um/kernel/tt/uaccess_user.c ---- orig/arch/um/kernel/tt/uaccess_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/uaccess_user.c 2003-03-25 17:10:54.000000000 -0500 -@@ -0,0 +1,100 @@ -+/* -+ * Copyright (C) 2001 Chris Emerson (cemerson@chiark.greenend.org.uk) -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <setjmp.h> -+#include <string.h> -+#include "user_util.h" -+#include "uml_uaccess.h" -+#include "task.h" -+#include "kern_util.h" -+ -+int __do_copy_from_user(void *to, const void *from, int n, -+ void **fault_addr, void **fault_catcher) -+{ -+ struct tt_regs save = TASK_REGS(get_current())->tt; -+ unsigned long fault; -+ int faulted; -+ -+ fault = __do_user_copy(to, from, n, fault_addr, fault_catcher, -+ __do_copy, &faulted); -+ TASK_REGS(get_current())->tt = save; -+ -+ if(!faulted) return(0); -+ else return(n - (fault - (unsigned long) from)); -+} -+ -+static void __do_strncpy(void *dst, const void *src, int count) -+{ -+ strncpy(dst, src, count); -+} -+ -+int __do_strncpy_from_user(char *dst, const char *src, unsigned long count, -+ void **fault_addr, void **fault_catcher) -+{ -+ struct tt_regs save = TASK_REGS(get_current())->tt; -+ unsigned long fault; -+ int faulted; -+ -+ fault = __do_user_copy(dst, src, count, fault_addr, fault_catcher, -+ __do_strncpy, &faulted); -+ TASK_REGS(get_current())->tt = save; -+ -+ if(!faulted) return(strlen(dst)); -+ else return(-1); -+} -+ -+static void __do_clear(void *to, const void *from, int n) -+{ -+ memset(to, 0, n); -+} -+ -+int __do_clear_user(void *mem, unsigned long len, -+ void **fault_addr, void **fault_catcher) -+{ -+ struct tt_regs save = TASK_REGS(get_current())->tt; -+ unsigned long fault; -+ int faulted; -+ -+ fault = __do_user_copy(mem, NULL, len, fault_addr, fault_catcher, -+ __do_clear, &faulted); -+ TASK_REGS(get_current())->tt = save; -+ -+ if(!faulted) return(0); -+ else return(len - (fault - (unsigned long) mem)); -+} -+ -+int __do_strnlen_user(const char *str, unsigned long n, -+ void **fault_addr, void **fault_catcher) -+{ -+ struct tt_regs save = TASK_REGS(get_current())->tt; -+ int ret; -+ unsigned long *faddrp = (unsigned long *)fault_addr; -+ jmp_buf jbuf; -+ -+ *fault_catcher = &jbuf; -+ if(setjmp(jbuf) == 0){ -+ ret = strlen(str) + 1; -+ } -+ else { -+ ret = *faddrp - (unsigned long) str; -+ } -+ *fault_addr = NULL; -+ *fault_catcher = NULL; -+ -+ TASK_REGS(get_current())->tt = save; -+ return ret; -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tt/unmap.c um/arch/um/kernel/tt/unmap.c ---- orig/arch/um/kernel/tt/unmap.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tt/unmap.c 2002-12-11 10:42:21.000000000 -0500 -@@ -0,0 +1,31 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <sys/mman.h> -+ -+int switcheroo(int fd, int prot, void *from, void *to, int size) -+{ -+ if(munmap(to, size) < 0){ -+ return(-1); -+ } -+ if(mmap(to, size, prot, MAP_SHARED | MAP_FIXED, fd, 0) != to){ -+ return(-1); -+ } -+ if(munmap(from, size) < 0){ -+ return(-1); -+ } -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/tty_log.c um/arch/um/kernel/tty_log.c ---- orig/arch/um/kernel/tty_log.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/tty_log.c 2003-04-16 16:35:20.000000000 -0400 -@@ -0,0 +1,213 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) and -+ * geoffrey hing <ghing@net.ohio-state.edu> -+ * Licensed under the GPL -+ */ -+ -+#include <errno.h> -+#include <string.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <fcntl.h> -+#include <sys/time.h> -+#include "init.h" -+#include "user.h" -+#include "kern_util.h" -+#include "os.h" -+ -+#define TTY_LOG_DIR "./" -+ -+/* Set early in boot and then unchanged */ -+static char *tty_log_dir = TTY_LOG_DIR; -+static int tty_log_fd = -1; -+ -+#define TTY_LOG_OPEN 1 -+#define TTY_LOG_CLOSE 2 -+#define TTY_LOG_WRITE 3 -+#define TTY_LOG_EXEC 4 -+ -+#define TTY_READ 1 -+#define TTY_WRITE 2 -+ -+struct tty_log_buf { -+ int what; -+ unsigned long tty; -+ int len; -+ int direction; -+ unsigned long sec; -+ unsigned long usec; -+}; -+ -+int open_tty_log(void *tty, void *current_tty) -+{ -+ struct timeval tv; -+ struct tty_log_buf data; -+ char buf[strlen(tty_log_dir) + sizeof("01234567890-01234567\0")]; -+ int fd; -+ -+ gettimeofday(&tv, NULL); -+ if(tty_log_fd != -1){ -+ data = ((struct tty_log_buf) { .what = TTY_LOG_OPEN, -+ .tty = (unsigned long) tty, -+ .len = sizeof(current_tty), -+ .direction = 0, -+ .sec = tv.tv_sec, -+ .usec = tv.tv_usec } ); -+ write(tty_log_fd, &data, sizeof(data)); -+ write(tty_log_fd, ¤t_tty, data.len); -+ return(tty_log_fd); -+ } -+ -+ sprintf(buf, "%s/%0u-%0u", tty_log_dir, (unsigned int) tv.tv_sec, -+ (unsigned int) tv.tv_usec); -+ -+ fd = os_open_file(buf, of_append(of_create(of_rdwr(OPENFLAGS()))), -+ 0644); -+ if(fd < 0){ -+ printk("open_tty_log : couldn't open '%s', errno = %d\n", -+ buf, -fd); -+ } -+ return(fd); -+} -+ -+void close_tty_log(int fd, void *tty) -+{ -+ struct tty_log_buf data; -+ struct timeval tv; -+ -+ if(tty_log_fd != -1){ -+ gettimeofday(&tv, NULL); -+ data = ((struct tty_log_buf) { .what = TTY_LOG_CLOSE, -+ .tty = (unsigned long) tty, -+ .len = 0, -+ .direction = 0, -+ .sec = tv.tv_sec, -+ .usec = tv.tv_usec } ); -+ write(tty_log_fd, &data, sizeof(data)); -+ return; -+ } -+ close(fd); -+} -+ -+static int log_chunk(int fd, char *buf, int len) -+{ -+ int total = 0, try, missed, n; -+ char chunk[64]; -+ -+ while(len > 0){ -+ try = (len > sizeof(chunk)) ? sizeof(chunk) : len; -+ missed = copy_from_user_proc(chunk, buf, try); -+ try -= missed; -+ n = write(fd, chunk, try); -+ if(n != try) -+ return(-errno); -+ if(missed != 0) -+ return(-EFAULT); -+ -+ len -= try; -+ total += try; -+ buf += try; -+ } -+ -+ return(total); -+} -+ -+int write_tty_log(int fd, char *buf, int len, void *tty, int is_read) -+{ -+ struct timeval tv; -+ struct tty_log_buf data; -+ int direction; -+ -+ if(fd == tty_log_fd){ -+ gettimeofday(&tv, NULL); -+ direction = is_read ? TTY_READ : TTY_WRITE; -+ data = ((struct tty_log_buf) { .what = TTY_LOG_WRITE, -+ .tty = (unsigned long) tty, -+ .len = len, -+ .direction = direction, -+ .sec = tv.tv_sec, -+ .usec = tv.tv_usec } ); -+ write(tty_log_fd, &data, sizeof(data)); -+ } -+ -+ return(log_chunk(fd, buf, len)); -+} -+ -+void log_exec(char **argv, void *tty) -+{ -+ struct timeval tv; -+ struct tty_log_buf data; -+ char **ptr,*arg; -+ int len; -+ -+ if(tty_log_fd == -1) return; -+ -+ gettimeofday(&tv, NULL); -+ -+ len = 0; -+ for(ptr = argv; ; ptr++){ -+ if(copy_from_user_proc(&arg, ptr, sizeof(arg))) -+ return; -+ if(arg == NULL) break; -+ len += strlen_user_proc(arg); -+ } -+ -+ data = ((struct tty_log_buf) { .what = TTY_LOG_EXEC, -+ .tty = (unsigned long) tty, -+ .len = len, -+ .direction = 0, -+ .sec = tv.tv_sec, -+ .usec = tv.tv_usec } ); -+ write(tty_log_fd, &data, sizeof(data)); -+ -+ for(ptr = argv; ; ptr++){ -+ if(copy_from_user_proc(&arg, ptr, sizeof(arg))) -+ return; -+ if(arg == NULL) break; -+ log_chunk(tty_log_fd, arg, strlen_user_proc(arg)); -+ } -+} -+ -+static int __init set_tty_log_dir(char *name, int *add) -+{ -+ tty_log_dir = name; -+ return 0; -+} -+ -+__uml_setup("tty_log_dir=", set_tty_log_dir, -+"tty_log_dir=<directory>\n" -+" This is used to specify the directory where the logs of all pty\n" -+" data from this UML machine will be written.\n\n" -+); -+ -+static int __init set_tty_log_fd(char *name, int *add) -+{ -+ char *end; -+ -+ tty_log_fd = strtoul(name, &end, 0); -+ if((*end != '\0') || (end == name)){ -+ printf("set_tty_log_fd - strtoul failed on '%s'\n", name); -+ tty_log_fd = -1; -+ } -+ return 0; -+} -+ -+__uml_setup("tty_log_fd=", set_tty_log_fd, -+"tty_log_fd=<fd>\n" -+" This is used to specify a preconfigured file descriptor to which all\n" -+" tty data will be written. Preconfigure the descriptor with something\n" -+" like '10>tty_log tty_log_fd=10'.\n\n" -+); -+ -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/uaccess_user.c um/arch/um/kernel/uaccess_user.c ---- orig/arch/um/kernel/uaccess_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/uaccess_user.c 2003-03-25 17:06:05.000000000 -0500 -@@ -0,0 +1,64 @@ -+/* -+ * Copyright (C) 2001 Chris Emerson (cemerson@chiark.greenend.org.uk) -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <setjmp.h> -+#include <string.h> -+ -+/* These are here rather than tt/uaccess.c because skas mode needs them in -+ * order to do SIGBUS recovery when a tmpfs mount runs out of room. -+ */ -+ -+unsigned long __do_user_copy(void *to, const void *from, int n, -+ void **fault_addr, void **fault_catcher, -+ void (*op)(void *to, const void *from, -+ int n), int *faulted_out) -+{ -+ unsigned long *faddrp = (unsigned long *) fault_addr, ret; -+ -+ jmp_buf jbuf; -+ *fault_catcher = &jbuf; -+ if(setjmp(jbuf) == 0){ -+ (*op)(to, from, n); -+ ret = 0; -+ *faulted_out = 0; -+ } -+ else { -+ ret = *faddrp; -+ *faulted_out = 1; -+ } -+ *fault_addr = NULL; -+ *fault_catcher = NULL; -+ return ret; -+} -+ -+void __do_copy(void *to, const void *from, int n) -+{ -+ memcpy(to, from, n); -+} -+ -+ -+int __do_copy_to_user(void *to, const void *from, int n, -+ void **fault_addr, void **fault_catcher) -+{ -+ unsigned long fault; -+ int faulted; -+ -+ fault = __do_user_copy(to, from, n, fault_addr, fault_catcher, -+ __do_copy, &faulted); -+ if(!faulted) return(0); -+ else return(n - (fault - (unsigned long) to)); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/um_arch.c um/arch/um/kernel/um_arch.c ---- orig/arch/um/kernel/um_arch.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/um_arch.c 2003-03-06 19:06:09.000000000 -0500 -@@ -0,0 +1,425 @@ -+/* -+ * Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/kernel.h" -+#include "linux/sched.h" -+#include "linux/notifier.h" -+#include "linux/mm.h" -+#include "linux/types.h" -+#include "linux/tty.h" -+#include "linux/init.h" -+#include "linux/bootmem.h" -+#include "linux/spinlock.h" -+#include "linux/utsname.h" -+#include "linux/sysrq.h" -+#include "linux/seq_file.h" -+#include "linux/delay.h" -+#include "asm/page.h" -+#include "asm/pgtable.h" -+#include "asm/ptrace.h" -+#include "asm/elf.h" -+#include "asm/user.h" -+#include "ubd_user.h" -+#include "asm/current.h" -+#include "user_util.h" -+#include "kern_util.h" -+#include "kern.h" -+#include "mprot.h" -+#include "mem_user.h" -+#include "mem.h" -+#include "umid.h" -+#include "initrd.h" -+#include "init.h" -+#include "os.h" -+#include "choose-mode.h" -+#include "mode_kern.h" -+#include "mode.h" -+ -+#define DEFAULT_COMMAND_LINE "root=/dev/ubd0" -+ -+struct cpuinfo_um boot_cpu_data = { -+ .loops_per_jiffy = 0, -+ .pgd_quick = NULL, -+ .pmd_quick = NULL, -+ .pte_quick = NULL, -+ .pgtable_cache_sz = 0, -+ .ipi_pipe = { -1, -1 } -+}; -+ -+unsigned long thread_saved_pc(struct thread_struct *thread) -+{ -+ return(os_process_pc(CHOOSE_MODE_PROC(thread_pid_tt, thread_pid_skas, -+ thread))); -+} -+ -+static int show_cpuinfo(struct seq_file *m, void *v) -+{ -+ int index; -+ -+ index = (struct cpuinfo_um *)v - cpu_data; -+#ifdef CONFIG_SMP -+ if (!(cpu_online_map & (1 << index))) -+ return 0; -+#endif -+ -+ seq_printf(m, "processor\t: %d\n", index); -+ seq_printf(m, "vendor_id\t: User Mode Linux\n"); -+ seq_printf(m, "model name\t: UML\n"); -+ seq_printf(m, "mode\t\t: %s\n", CHOOSE_MODE("tt", "skas")); -+ seq_printf(m, "host\t\t: %s\n", host_info); -+ seq_printf(m, "bogomips\t: %lu.%02lu\n\n", -+ loops_per_jiffy/(500000/HZ), -+ (loops_per_jiffy/(5000/HZ)) % 100); -+ -+ return(0); -+} -+ -+static void *c_start(struct seq_file *m, loff_t *pos) -+{ -+ return *pos < NR_CPUS ? cpu_data + *pos : NULL; -+} -+ -+static void *c_next(struct seq_file *m, void *v, loff_t *pos) -+{ -+ ++*pos; -+ return c_start(m, pos); -+} -+ -+static void c_stop(struct seq_file *m, void *v) -+{ -+} -+ -+struct seq_operations cpuinfo_op = { -+ .start = c_start, -+ .next = c_next, -+ .stop = c_stop, -+ .show = show_cpuinfo, -+}; -+ -+pte_t * __bad_pagetable(void) -+{ -+ panic("Someone should implement __bad_pagetable"); -+ return(NULL); -+} -+ -+/* Set in linux_main */ -+unsigned long host_task_size; -+unsigned long task_size; -+unsigned long uml_start; -+ -+/* Set in early boot */ -+unsigned long uml_physmem; -+unsigned long uml_reserved; -+unsigned long start_vm; -+unsigned long end_vm; -+int ncpus = 1; -+ -+#ifdef CONFIG_MODE_TT -+/* Pointer set in linux_main, the array itself is private to each thread, -+ * and changed at address space creation time so this poses no concurrency -+ * problems. -+ */ -+static char *argv1_begin = NULL; -+static char *argv1_end = NULL; -+#endif -+ -+/* Set in early boot */ -+static int have_root __initdata = 0; -+long physmem_size = 32 * 1024 * 1024; -+ -+void set_cmdline(char *cmd) -+{ -+#ifdef CONFIG_MODE_TT -+ char *umid, *ptr; -+ -+ if(CHOOSE_MODE(honeypot, 0)) return; -+ -+ umid = get_umid(1); -+ if(umid != NULL){ -+ snprintf(argv1_begin, -+ (argv1_end - argv1_begin) * sizeof(*ptr), -+ "(%s) ", umid); -+ ptr = &argv1_begin[strlen(argv1_begin)]; -+ } -+ else ptr = argv1_begin; -+ -+ snprintf(ptr, (argv1_end - ptr) * sizeof(*ptr), "[%s]", cmd); -+ memset(argv1_begin + strlen(argv1_begin), '\0', -+ argv1_end - argv1_begin - strlen(argv1_begin)); -+#endif -+} -+ -+static char *usage_string = -+"User Mode Linux v%s\n" -+" available at http://user-mode-linux.sourceforge.net/\n\n"; -+ -+static int __init uml_version_setup(char *line, int *add) -+{ -+ printf("%s\n", system_utsname.release); -+ exit(0); -+} -+ -+__uml_setup("--version", uml_version_setup, -+"--version\n" -+" Prints the version number of the kernel.\n\n" -+); -+ -+static int __init uml_root_setup(char *line, int *add) -+{ -+ have_root = 1; -+ return 0; -+} -+ -+__uml_setup("root=", uml_root_setup, -+"root=<file containing the root fs>\n" -+" This is actually used by the generic kernel in exactly the same\n" -+" way as in any other kernel. If you configure a number of block\n" -+" devices and want to boot off something other than ubd0, you \n" -+" would use something like:\n" -+" root=/dev/ubd5\n\n" -+); -+ -+#ifdef CONFIG_SMP -+static int __init uml_ncpus_setup(char *line, int *add) -+{ -+ if (!sscanf(line, "%d", &ncpus)) { -+ printf("Couldn't parse [%s]\n", line); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+__uml_setup("ncpus=", uml_ncpus_setup, -+"ncpus=<# of desired CPUs>\n" -+" This tells an SMP kernel how many virtual processors to start.\n\n" -+); -+#endif -+ -+int force_tt = 0; -+ -+#if defined(CONFIG_MODE_TT) && defined(CONFIG_MODE_SKAS) -+#define DEFAULT_TT 0 -+ -+static int __init mode_tt_setup(char *line, int *add) -+{ -+ force_tt = 1; -+ return(0); -+} -+ -+#else -+#ifdef CONFIG_MODE_SKAS -+ -+#define DEFAULT_TT 0 -+ -+static int __init mode_tt_setup(char *line, int *add) -+{ -+ printf("CONFIG_MODE_TT disabled - 'mode=tt' ignored\n"); -+ return(0); -+} -+ -+#else -+#ifdef CONFIG_MODE_TT -+ -+#define DEFAULT_TT 1 -+ -+static int __init mode_tt_setup(char *line, int *add) -+{ -+ printf("CONFIG_MODE_SKAS disabled - 'mode=tt' redundant\n"); -+ return(0); -+} -+ -+#else -+ -+#error Either CONFIG_MODE_TT or CONFIG_MODE_SKAS must be enabled -+ -+#endif -+#endif -+#endif -+ -+__uml_setup("mode=tt", mode_tt_setup, -+"mode=tt\n" -+" When both CONFIG_MODE_TT and CONFIG_MODE_SKAS are enabled, this option\n" -+" forces UML to run in tt (tracing thread) mode. It is not the default\n" -+" because it's slower and less secure than skas mode.\n\n" -+); -+ -+int mode_tt = DEFAULT_TT; -+ -+static int __init Usage(char *line, int *add) -+{ -+ const char **p; -+ -+ printf(usage_string, system_utsname.release); -+ p = &__uml_help_start; -+ while (p < &__uml_help_end) { -+ printf("%s", *p); -+ p++; -+ } -+ exit(0); -+} -+ -+__uml_setup("--help", Usage, -+"--help\n" -+" Prints this message.\n\n" -+); -+ -+static int __init uml_checksetup(char *line, int *add) -+{ -+ struct uml_param *p; -+ -+ p = &__uml_setup_start; -+ while(p < &__uml_setup_end) { -+ int n; -+ -+ n = strlen(p->str); -+ if(!strncmp(line, p->str, n)){ -+ if (p->setup_func(line + n, add)) return 1; -+ } -+ p++; -+ } -+ return 0; -+} -+ -+static void __init uml_postsetup(void) -+{ -+ initcall_t *p; -+ -+ p = &__uml_postsetup_start; -+ while(p < &__uml_postsetup_end){ -+ (*p)(); -+ p++; -+ } -+ return; -+} -+ -+/* Set during early boot */ -+unsigned long brk_start; -+static struct vm_reserved kernel_vm_reserved; -+ -+#define MIN_VMALLOC (32 * 1024 * 1024) -+ -+int linux_main(int argc, char **argv) -+{ -+ unsigned long avail; -+ unsigned long virtmem_size, max_physmem; -+ unsigned int i, add, err; -+ -+ for (i = 1; i < argc; i++){ -+ if((i == 1) && (argv[i][0] == ' ')) continue; -+ add = 1; -+ uml_checksetup(argv[i], &add); -+ if(add) add_arg(saved_command_line, argv[i]); -+ } -+ if(have_root == 0) add_arg(saved_command_line, DEFAULT_COMMAND_LINE); -+ -+ mode_tt = force_tt ? 1 : !can_do_skas(); -+ uml_start = CHOOSE_MODE_PROC(set_task_sizes_tt, set_task_sizes_skas, 0, -+ &host_task_size, &task_size); -+ -+ brk_start = (unsigned long) sbrk(0); -+ CHOOSE_MODE_PROC(before_mem_tt, before_mem_skas, brk_start); -+ -+ uml_physmem = uml_start; -+ -+ /* Reserve up to 4M after the current brk */ -+ uml_reserved = ROUND_4M(brk_start) + (1 << 22); -+ -+ setup_machinename(system_utsname.machine); -+ -+#ifdef CONFIG_MODE_TT -+ argv1_begin = argv[1]; -+ argv1_end = &argv[1][strlen(argv[1])]; -+#endif -+ -+ set_usable_vm(uml_physmem, get_kmem_end()); -+ -+ highmem = 0; -+ max_physmem = get_kmem_end() - uml_physmem - MIN_VMALLOC; -+ if(physmem_size > max_physmem){ -+ highmem = physmem_size - max_physmem; -+ physmem_size -= highmem; -+#ifndef CONFIG_HIGHMEM -+ highmem = 0; -+ printf("CONFIG_HIGHMEM not enabled - physical memory shrunk " -+ "to %ld bytes\n", physmem_size); -+#endif -+ } -+ -+ high_physmem = uml_physmem + physmem_size; -+ high_memory = (void *) high_physmem; -+ -+ start_vm = VMALLOC_START; -+ -+ setup_physmem(uml_physmem, uml_reserved, physmem_size); -+ virtmem_size = physmem_size; -+ avail = get_kmem_end() - start_vm; -+ if(physmem_size > avail) virtmem_size = avail; -+ end_vm = start_vm + virtmem_size; -+ -+ if(virtmem_size < physmem_size) -+ printf("Kernel virtual memory size shrunk to %ld bytes\n", -+ virtmem_size); -+ -+ err = reserve_vm(high_physmem, end_vm, &kernel_vm_reserved); -+ if(err){ -+ printf("Failed to reserve VM area for kernel VM\n"); -+ exit(1); -+ } -+ -+ uml_postsetup(); -+ -+ init_task.thread.kernel_stack = (unsigned long) &init_task + -+ 2 * PAGE_SIZE; -+ -+ task_protections((unsigned long) &init_task); -+ os_flush_stdout(); -+ -+ return(CHOOSE_MODE(start_uml_tt(), start_uml_skas())); -+} -+ -+static int panic_exit(struct notifier_block *self, unsigned long unused1, -+ void *unused2) -+{ -+#ifdef CONFIG_SYSRQ -+ handle_sysrq('p', ¤t->thread.regs, NULL, NULL); -+#endif -+ machine_halt(); -+ return(0); -+} -+ -+static struct notifier_block panic_exit_notifier = { -+ .notifier_call = panic_exit, -+ .next = NULL, -+ .priority = 0 -+}; -+ -+void __init setup_arch(char **cmdline_p) -+{ -+ notifier_chain_register(&panic_notifier_list, &panic_exit_notifier); -+ paging_init(); -+ strcpy(command_line, saved_command_line); -+ *cmdline_p = command_line; -+ setup_hostinfo(); -+} -+ -+void __init check_bugs(void) -+{ -+ arch_check_bugs(); -+ check_ptrace(); -+ check_sigio(); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/umid.c um/arch/um/kernel/umid.c ---- orig/arch/um/kernel/umid.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/umid.c 2003-02-24 23:11:23.000000000 -0500 -@@ -0,0 +1,319 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <fcntl.h> -+#include <errno.h> -+#include <string.h> -+#include <stdlib.h> -+#include <dirent.h> -+#include <signal.h> -+#include <sys/stat.h> -+#include <sys/param.h> -+#include "user.h" -+#include "umid.h" -+#include "init.h" -+#include "os.h" -+#include "user_util.h" -+#include "choose-mode.h" -+ -+#define UMID_LEN 64 -+#define UML_DIR "~/.uml/" -+ -+/* Changed by set_umid and make_umid, which are run early in boot */ -+static char umid[UMID_LEN] = { 0 }; -+ -+/* Changed by set_uml_dir and make_uml_dir, which are run early in boot */ -+static char *uml_dir = UML_DIR; -+ -+/* Changed by set_umid */ -+static int umid_is_random = 1; -+static int umid_inited = 0; -+ -+static int make_umid(int (*printer)(const char *fmt, ...)); -+ -+static int __init set_umid(char *name, int is_random, -+ int (*printer)(const char *fmt, ...)) -+{ -+ if(umid_inited){ -+ (*printer)("Unique machine name can't be set twice\n"); -+ return(-1); -+ } -+ -+ if(strlen(name) > UMID_LEN - 1) -+ (*printer)("Unique machine name is being truncated to %s " -+ "characters\n", UMID_LEN); -+ strncpy(umid, name, UMID_LEN - 1); -+ umid[UMID_LEN - 1] = '\0'; -+ -+ umid_is_random = is_random; -+ umid_inited = 1; -+ return 0; -+} -+ -+static int __init set_umid_arg(char *name, int *add) -+{ -+ return(set_umid(name, 0, printf)); -+} -+ -+__uml_setup("umid=", set_umid_arg, -+"umid=<name>\n" -+" This is used to assign a unique identity to this UML machine and\n" -+" is used for naming the pid file and management console socket.\n\n" -+); -+ -+int __init umid_file_name(char *name, char *buf, int len) -+{ -+ int n; -+ -+ if(!umid_inited && make_umid(printk)) return(-1); -+ -+ n = strlen(uml_dir) + strlen(umid) + strlen(name) + 1; -+ if(n > len){ -+ printk("umid_file_name : buffer too short\n"); -+ return(-1); -+ } -+ -+ sprintf(buf, "%s%s/%s", uml_dir, umid, name); -+ return(0); -+} -+ -+extern int tracing_pid; -+ -+static int __init create_pid_file(void) -+{ -+ char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; -+ char pid[sizeof("nnnnn\0")]; -+ int fd; -+ -+ if(umid_file_name("pid", file, sizeof(file))) return 0; -+ -+ fd = os_open_file(file, of_create(of_excl(of_rdwr(OPENFLAGS()))), -+ 0644); -+ if(fd < 0){ -+ printf("Open of machine pid file \"%s\" failed - " -+ "errno = %d\n", file, -fd); -+ return 0; -+ } -+ -+ sprintf(pid, "%d\n", os_getpid()); -+ if(write(fd, pid, strlen(pid)) != strlen(pid)) -+ printf("Write of pid file failed - errno = %d\n", errno); -+ close(fd); -+ return 0; -+} -+ -+static int actually_do_remove(char *dir) -+{ -+ DIR *directory; -+ struct dirent *ent; -+ int len; -+ char file[256]; -+ -+ if((directory = opendir(dir)) == NULL){ -+ printk("actually_do_remove : couldn't open directory '%s', " -+ "errno = %d\n", dir, errno); -+ return(1); -+ } -+ while((ent = readdir(directory)) != NULL){ -+ if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) -+ continue; -+ len = strlen(dir) + sizeof("/") + strlen(ent->d_name) + 1; -+ if(len > sizeof(file)){ -+ printk("Not deleting '%s' from '%s' - name too long\n", -+ ent->d_name, dir); -+ continue; -+ } -+ sprintf(file, "%s/%s", dir, ent->d_name); -+ if(unlink(file) < 0){ -+ printk("actually_do_remove : couldn't remove '%s' " -+ "from '%s', errno = %d\n", ent->d_name, dir, -+ errno); -+ return(1); -+ } -+ } -+ if(rmdir(dir) < 0){ -+ printk("actually_do_remove : couldn't rmdir '%s', " -+ "errno = %d\n", dir, errno); -+ return(1); -+ } -+ return(0); -+} -+ -+void remove_umid_dir(void) -+{ -+ char dir[strlen(uml_dir) + UMID_LEN + 1]; -+ if(!umid_inited) return; -+ -+ sprintf(dir, "%s%s", uml_dir, umid); -+ actually_do_remove(dir); -+} -+ -+char *get_umid(int only_if_set) -+{ -+ if(only_if_set && umid_is_random) return(NULL); -+ return(umid); -+} -+ -+int not_dead_yet(char *dir) -+{ -+ char file[strlen(uml_dir) + UMID_LEN + sizeof("/pid\0")]; -+ char pid[sizeof("nnnnn\0")], *end; -+ int dead, fd, p; -+ -+ sprintf(file, "%s/pid", dir); -+ dead = 0; -+ if((fd = os_open_file(file, of_read(OPENFLAGS()), 0)) < 0){ -+ if(fd != -ENOENT){ -+ printk("not_dead_yet : couldn't open pid file '%s', " -+ "errno = %d\n", file, -fd); -+ return(1); -+ } -+ dead = 1; -+ } -+ if(fd > 0){ -+ if(read(fd, pid, sizeof(pid)) < 0){ -+ printk("not_dead_yet : couldn't read pid file '%s', " -+ "errno = %d\n", file, errno); -+ return(1); -+ } -+ p = strtoul(pid, &end, 0); -+ if(end == pid){ -+ printk("not_dead_yet : couldn't parse pid file '%s', " -+ "errno = %d\n", file, errno); -+ dead = 1; -+ } -+ if(((kill(p, 0) < 0) && (errno == ESRCH)) || -+ (p == CHOOSE_MODE(tracing_pid, os_getpid()))) -+ dead = 1; -+ } -+ if(!dead) return(1); -+ return(actually_do_remove(dir)); -+} -+ -+static int __init set_uml_dir(char *name, int *add) -+{ -+ if((strlen(name) > 0) && (name[strlen(name) - 1] != '/')){ -+ uml_dir = malloc(strlen(name) + 1); -+ if(uml_dir == NULL){ -+ printf("Failed to malloc uml_dir - error = %d\n", -+ errno); -+ uml_dir = name; -+ return(0); -+ } -+ sprintf(uml_dir, "%s/", name); -+ } -+ else uml_dir = name; -+ return 0; -+} -+ -+static int __init make_uml_dir(void) -+{ -+ char dir[MAXPATHLEN + 1] = { '\0' }; -+ int len; -+ -+ if(*uml_dir == '~'){ -+ char *home = getenv("HOME"); -+ -+ if(home == NULL){ -+ printf("make_uml_dir : no value in environment for " -+ "$HOME\n"); -+ exit(1); -+ } -+ strncpy(dir, home, sizeof(dir)); -+ uml_dir++; -+ } -+ len = strlen(dir); -+ strncat(dir, uml_dir, sizeof(dir) - len); -+ len = strlen(dir); -+ if((len > 0) && (len < sizeof(dir) - 1) && (dir[len - 1] != '/')){ -+ dir[len] = '/'; -+ dir[len + 1] = '\0'; -+ } -+ -+ if((uml_dir = malloc(strlen(dir) + 1)) == NULL){ -+ printf("make_uml_dir : malloc failed, errno = %d\n", errno); -+ exit(1); -+ } -+ strcpy(uml_dir, dir); -+ -+ if((mkdir(uml_dir, 0777) < 0) && (errno != EEXIST)){ -+ printf("Failed to mkdir %s - errno = %i\n", uml_dir, errno); -+ return(-1); -+ } -+ return 0; -+} -+ -+static int __init make_umid(int (*printer)(const char *fmt, ...)) -+{ -+ int fd, err; -+ char tmp[strlen(uml_dir) + UMID_LEN + 1]; -+ -+ strncpy(tmp, uml_dir, sizeof(tmp) - 1); -+ tmp[sizeof(tmp) - 1] = '\0'; -+ -+ if(!umid_inited){ -+ strcat(tmp, "XXXXXX"); -+ fd = mkstemp(tmp); -+ if(fd < 0){ -+ (*printer)("make_umid - mkstemp failed, errno = %d\n", -+ errno); -+ return(1); -+ } -+ -+ close(fd); -+ /* There's a nice tiny little race between this unlink and -+ * the mkdir below. It'd be nice if there were a mkstemp -+ * for directories. -+ */ -+ unlink(tmp); -+ set_umid(&tmp[strlen(uml_dir)], 1, printer); -+ } -+ -+ sprintf(tmp, "%s%s", uml_dir, umid); -+ -+ if((err = mkdir(tmp, 0777)) < 0){ -+ if(errno == EEXIST){ -+ if(not_dead_yet(tmp)){ -+ (*printer)("umid '%s' is in use\n", umid); -+ return(-1); -+ } -+ err = mkdir(tmp, 0777); -+ } -+ } -+ if(err < 0){ -+ (*printer)("Failed to create %s - errno = %d\n", umid, errno); -+ return(-1); -+ } -+ -+ return(0); -+} -+ -+__uml_setup("uml_dir=", set_uml_dir, -+"uml_dir=<directory>\n" -+" The location to place the pid and umid files.\n\n" -+); -+ -+__uml_postsetup(make_uml_dir); -+ -+static int __init make_umid_setup(void) -+{ -+ return(make_umid(printf)); -+} -+ -+__uml_postsetup(make_umid_setup); -+__uml_postsetup(create_pid_file); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/kernel/user_syms.c um/arch/um/kernel/user_syms.c ---- orig/arch/um/kernel/user_syms.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/user_syms.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,116 @@ -+#include <stdio.h> -+#include <unistd.h> -+#include <fcntl.h> -+#include <dirent.h> -+#include <errno.h> -+#include <utime.h> -+#include <string.h> -+#include <sys/stat.h> -+#include <sys/vfs.h> -+#include <sys/ioctl.h> -+#include "user_util.h" -+#include "mem_user.h" -+ -+/* XXX All the __CONFIG_* stuff is broken because this file can't include -+ * config.h -+ */ -+ -+/* Had to steal this from linux/module.h because that file can't be included -+ * since this includes various user-level headers. -+ */ -+ -+struct module_symbol -+{ -+ unsigned long value; -+ const char *name; -+}; -+ -+/* Indirect stringification. */ -+ -+#define __MODULE_STRING_1(x) #x -+#define __MODULE_STRING(x) __MODULE_STRING_1(x) -+ -+#if !defined(__AUTOCONF_INCLUDED__) -+ -+#define __EXPORT_SYMBOL(sym,str) error config_must_be_included_before_module -+#define EXPORT_SYMBOL(var) error config_must_be_included_before_module -+#define EXPORT_SYMBOL_NOVERS(var) error config_must_be_included_before_module -+ -+#elif !defined(__CONFIG_MODULES__) -+ -+#define __EXPORT_SYMBOL(sym,str) -+#define EXPORT_SYMBOL(var) -+#define EXPORT_SYMBOL_NOVERS(var) -+ -+#else -+ -+#define __EXPORT_SYMBOL(sym, str) \ -+const char __kstrtab_##sym[] \ -+__attribute__((section(".kstrtab"))) = str; \ -+const struct module_symbol __ksymtab_##sym \ -+__attribute__((section("__ksymtab"))) = \ -+{ (unsigned long)&sym, __kstrtab_##sym } -+ -+#if defined(__MODVERSIONS__) || !defined(__CONFIG_MODVERSIONS__) -+#define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(var)) -+#else -+#define EXPORT_SYMBOL(var) __EXPORT_SYMBOL(var, __MODULE_STRING(__VERSIONED_SYMBOL(var))) -+#endif -+ -+#define EXPORT_SYMBOL_NOVERS(var) __EXPORT_SYMBOL(var, __MODULE_STRING(var)) -+ -+#endif -+ -+EXPORT_SYMBOL(__errno_location); -+ -+EXPORT_SYMBOL(access); -+EXPORT_SYMBOL(open); -+EXPORT_SYMBOL(open64); -+EXPORT_SYMBOL(close); -+EXPORT_SYMBOL(read); -+EXPORT_SYMBOL(write); -+EXPORT_SYMBOL(dup2); -+EXPORT_SYMBOL(__xstat); -+EXPORT_SYMBOL(__lxstat); -+EXPORT_SYMBOL(__lxstat64); -+EXPORT_SYMBOL(lseek); -+EXPORT_SYMBOL(lseek64); -+EXPORT_SYMBOL(chown); -+EXPORT_SYMBOL(truncate); -+EXPORT_SYMBOL(utime); -+EXPORT_SYMBOL(chmod); -+EXPORT_SYMBOL(rename); -+EXPORT_SYMBOL(__xmknod); -+ -+EXPORT_SYMBOL(symlink); -+EXPORT_SYMBOL(link); -+EXPORT_SYMBOL(unlink); -+EXPORT_SYMBOL(readlink); -+ -+EXPORT_SYMBOL(mkdir); -+EXPORT_SYMBOL(rmdir); -+EXPORT_SYMBOL(opendir); -+EXPORT_SYMBOL(readdir); -+EXPORT_SYMBOL(closedir); -+EXPORT_SYMBOL(seekdir); -+EXPORT_SYMBOL(telldir); -+ -+EXPORT_SYMBOL(ioctl); -+ -+extern ssize_t pread64 (int __fd, void *__buf, size_t __nbytes, -+ __off64_t __offset); -+extern ssize_t pwrite64 (int __fd, __const void *__buf, size_t __n, -+ __off64_t __offset); -+EXPORT_SYMBOL(pread64); -+EXPORT_SYMBOL(pwrite64); -+ -+EXPORT_SYMBOL(statfs); -+EXPORT_SYMBOL(statfs64); -+ -+EXPORT_SYMBOL(memcpy); -+EXPORT_SYMBOL(getuid); -+ -+EXPORT_SYMBOL(memset); -+EXPORT_SYMBOL(strstr); -+ -+EXPORT_SYMBOL(find_iomem); -diff -Naur -X ../exclude-files orig/arch/um/kernel/user_util.c um/arch/um/kernel/user_util.c ---- orig/arch/um/kernel/user_util.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/kernel/user_util.c 2003-04-23 20:41:54.000000000 -0400 -@@ -0,0 +1,164 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <fcntl.h> -+#include <unistd.h> -+#include <limits.h> -+#include <sys/mman.h> -+#include <sys/stat.h> -+#include <sys/ptrace.h> -+#include <sys/utsname.h> -+#include <sys/param.h> -+#include <sys/time.h> -+#include "asm/types.h" -+#include <ctype.h> -+#include <signal.h> -+#include <wait.h> -+#include <errno.h> -+#include <stdarg.h> -+#include <sched.h> -+#include <termios.h> -+#include <string.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "user.h" -+#include "mem_user.h" -+#include "init.h" -+#include "helper.h" -+#include "uml-config.h" -+ -+#define COMMAND_LINE_SIZE _POSIX_ARG_MAX -+ -+/* Changed in linux_main and setup_arch, which run before SMP is started */ -+char saved_command_line[COMMAND_LINE_SIZE] = { 0 }; -+char command_line[COMMAND_LINE_SIZE] = { 0 }; -+ -+void add_arg(char *cmd_line, char *arg) -+{ -+ if (strlen(cmd_line) + strlen(arg) + 1 > COMMAND_LINE_SIZE) { -+ printf("add_arg: Too much command line!\n"); -+ exit(1); -+ } -+ if(strlen(cmd_line) > 0) strcat(cmd_line, " "); -+ strcat(cmd_line, arg); -+} -+ -+void stop(void) -+{ -+ while(1) sleep(1000000); -+} -+ -+void stack_protections(unsigned long address) -+{ -+ int prot = PROT_READ | PROT_WRITE | PROT_EXEC; -+ -+ if(mprotect((void *) address, page_size(), prot) < 0) -+ panic("protecting stack failed, errno = %d", errno); -+} -+ -+void task_protections(unsigned long address) -+{ -+ unsigned long guard = address + page_size(); -+ unsigned long stack = guard + page_size(); -+ int prot = 0, pages; -+#ifdef notdef -+ if(mprotect((void *) guard, page_size(), prot) < 0) -+ panic("protecting guard page failed, errno = %d", errno); -+#endif -+ pages = (1 << UML_CONFIG_KERNEL_STACK_ORDER) - 2; -+ prot = PROT_READ | PROT_WRITE | PROT_EXEC; -+ if(mprotect((void *) stack, pages * page_size(), prot) < 0) -+ panic("protecting stack failed, errno = %d", errno); -+} -+ -+int wait_for_stop(int pid, int sig, int cont_type, void *relay) -+{ -+ sigset_t *relay_signals = relay; -+ int status, ret; -+ -+ while(1){ -+ if(((ret = waitpid(pid, &status, WUNTRACED)) < 0) || -+ !WIFSTOPPED(status) || (WSTOPSIG(status) != sig)){ -+ if(ret < 0){ -+ if(errno == EINTR) continue; -+ printk("wait failed, errno = %d\n", -+ errno); -+ } -+ else if(WIFEXITED(status)) -+ printk("process exited with status %d\n", -+ WEXITSTATUS(status)); -+ else if(WIFSIGNALED(status)) -+ printk("process exited with signal %d\n", -+ WTERMSIG(status)); -+ else if((WSTOPSIG(status) == SIGVTALRM) || -+ (WSTOPSIG(status) == SIGALRM) || -+ (WSTOPSIG(status) == SIGIO) || -+ (WSTOPSIG(status) == SIGPROF) || -+ (WSTOPSIG(status) == SIGCHLD) || -+ (WSTOPSIG(status) == SIGWINCH) || -+ (WSTOPSIG(status) == SIGINT)){ -+ ptrace(cont_type, pid, 0, WSTOPSIG(status)); -+ continue; -+ } -+ else if((relay_signals != NULL) && -+ sigismember(relay_signals, WSTOPSIG(status))){ -+ ptrace(cont_type, pid, 0, WSTOPSIG(status)); -+ continue; -+ } -+ else printk("process stopped with signal %d\n", -+ WSTOPSIG(status)); -+ panic("wait_for_stop failed to wait for %d to stop " -+ "with %d\n", pid, sig); -+ } -+ return(status); -+ } -+} -+ -+int raw(int fd, int complain) -+{ -+ struct termios tt; -+ int err; -+ -+ tcgetattr(fd, &tt); -+ cfmakeraw(&tt); -+ err = tcsetattr(fd, TCSANOW, &tt); -+ if((err < 0) && complain){ -+ printk("tcsetattr failed, errno = %d\n", errno); -+ return(-errno); -+ } -+ return(0); -+} -+ -+void setup_machinename(char *machine_out) -+{ -+ struct utsname host; -+ -+ uname(&host); -+ strcpy(machine_out, host.machine); -+} -+ -+char host_info[(_UTSNAME_LENGTH + 1) * 4 + _UTSNAME_NODENAME_LENGTH + 1]; -+ -+void setup_hostinfo(void) -+{ -+ struct utsname host; -+ -+ uname(&host); -+ sprintf(host_info, "%s %s %s %s %s", host.sysname, host.nodename, -+ host.release, host.version, host.machine); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/link.ld.in um/arch/um/link.ld.in ---- orig/arch/um/link.ld.in 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/link.ld.in 2003-01-17 23:11:30.000000000 -0500 -@@ -0,0 +1,95 @@ -+OUTPUT_FORMAT("ELF_FORMAT") -+OUTPUT_ARCH(ELF_ARCH) -+ENTRY(_start) -+ -+SECTIONS -+{ -+ . = START() + SIZEOF_HEADERS; -+ -+ . = ALIGN(4096); -+ __binary_start = .; -+ifdef(`MODE_TT', ` -+ .thread_private : { -+ __start_thread_private = .; -+ errno = .; -+ . += 4; -+ arch/um/kernel/tt/unmap_fin.o (.data) -+ __end_thread_private = .; -+ } -+ . = ALIGN(4096); -+ .remap : { arch/um/kernel/tt/unmap_fin.o (.text) } -+') -+ . = ALIGN(4096); /* Init code and data */ -+ _stext = .; -+ __init_begin = .; -+ .text.init : { *(.text.init) } -+ . = ALIGN(4096); -+ .text : -+ { -+ *(.text) -+ /* .gnu.warning sections are handled specially by elf32.em. */ -+ *(.gnu.warning) -+ *(.gnu.linkonce.t*) -+ } -+ .fini : { *(.fini) } =0x9090 -+ .rodata : { *(.rodata) *(.gnu.linkonce.r*) } -+ .rodata1 : { *(.rodata1) } -+ _etext = .; -+ PROVIDE (etext = .); -+ -+ . = ALIGN(4096); -+ PROVIDE (_sdata = .); -+ -+include(`arch/um/common.ld.in') -+ -+ .data : -+ { -+ . = ALIGN(KERNEL_STACK_SIZE); /* init_task */ -+ *(.data.init_task) -+ *(.data) -+ *(.gnu.linkonce.d*) -+ CONSTRUCTORS -+ } -+ .data1 : { *(.data1) } -+ .ctors : -+ { -+ *(.ctors) -+ } -+ .dtors : -+ { -+ *(.dtors) -+ } -+ -+ .got : { *(.got.plt) *(.got) } -+ .dynamic : { *(.dynamic) } -+ /* We want the small data sections together, so single-instruction offsets -+ can access them all, and initialized data all before uninitialized, so -+ we can shorten the on-disk segment size. */ -+ .sdata : { *(.sdata) } -+ _edata = .; -+ PROVIDE (edata = .); -+ . = ALIGN(0x1000); -+ .sbss : -+ { -+ __bss_start = .; -+ PROVIDE(_bss_start = .); -+ *(.sbss) -+ *(.scommon) -+ } -+ .bss : -+ { -+ *(.dynbss) -+ *(.bss) -+ *(COMMON) -+ } -+ _end = . ; -+ PROVIDE (end = .); -+ /* Stabs debugging sections. */ -+ .stab 0 : { *(.stab) } -+ .stabstr 0 : { *(.stabstr) } -+ .stab.excl 0 : { *(.stab.excl) } -+ .stab.exclstr 0 : { *(.stab.exclstr) } -+ .stab.index 0 : { *(.stab.index) } -+ .stab.indexstr 0 : { *(.stab.indexstr) } -+ .comment 0 : { *(.comment) } -+} -diff -Naur -X ../exclude-files orig/arch/um/main.c um/arch/um/main.c ---- orig/arch/um/main.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/main.c 2003-01-17 13:22:40.000000000 -0500 -@@ -0,0 +1,195 @@ -+/* -+ * Copyright (C) 2000, 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <unistd.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <string.h> -+#include <signal.h> -+#include <sys/resource.h> -+#include <sys/mman.h> -+#include <sys/user.h> -+#include <asm/page.h> -+#include "user_util.h" -+#include "kern_util.h" -+#include "mem_user.h" -+#include "signal_user.h" -+#include "user.h" -+#include "init.h" -+#include "mode.h" -+#include "choose-mode.h" -+#include "uml-config.h" -+ -+/* Set in set_stklim, which is called from main and __wrap_malloc. -+ * __wrap_malloc only calls it if main hasn't started. -+ */ -+unsigned long stacksizelim; -+ -+/* Set in main */ -+char *linux_prog; -+ -+#define PGD_BOUND (4 * 1024 * 1024) -+#define STACKSIZE (8 * 1024 * 1024) -+#define THREAD_NAME_LEN (256) -+ -+static void set_stklim(void) -+{ -+ struct rlimit lim; -+ -+ if(getrlimit(RLIMIT_STACK, &lim) < 0){ -+ perror("getrlimit"); -+ exit(1); -+ } -+ if((lim.rlim_cur == RLIM_INFINITY) || (lim.rlim_cur > STACKSIZE)){ -+ lim.rlim_cur = STACKSIZE; -+ if(setrlimit(RLIMIT_STACK, &lim) < 0){ -+ perror("setrlimit"); -+ exit(1); -+ } -+ } -+ stacksizelim = (lim.rlim_cur + PGD_BOUND - 1) & ~(PGD_BOUND - 1); -+} -+ -+static __init void do_uml_initcalls(void) -+{ -+ initcall_t *call; -+ -+ call = &__uml_initcall_start; -+ while (call < &__uml_initcall_end){; -+ (*call)(); -+ call++; -+ } -+} -+ -+static void last_ditch_exit(int sig) -+{ -+ CHOOSE_MODE(kmalloc_ok = 0, (void) 0); -+ signal(SIGINT, SIG_DFL); -+ signal(SIGTERM, SIG_DFL); -+ signal(SIGHUP, SIG_DFL); -+ uml_cleanup(); -+ exit(1); -+} -+ -+extern int uml_exitcode; -+ -+int main(int argc, char **argv, char **envp) -+{ -+ char **new_argv; -+ sigset_t mask; -+ int ret, i; -+ -+ /* Enable all signals except SIGIO - in some environments, we can -+ * enter with some signals blocked -+ */ -+ -+ sigemptyset(&mask); -+ sigaddset(&mask, SIGIO); -+ if(sigprocmask(SIG_SETMASK, &mask, NULL) < 0){ -+ perror("sigprocmask"); -+ exit(1); -+ } -+ -+#ifdef UML_CONFIG_MODE_TT -+ /* Allocate memory for thread command lines */ -+ if(argc < 2 || strlen(argv[1]) < THREAD_NAME_LEN - 1){ -+ -+ char padding[THREAD_NAME_LEN] = { -+ [ 0 ... THREAD_NAME_LEN - 2] = ' ', '\0' -+ }; -+ -+ new_argv = malloc((argc + 2) * sizeof(char*)); -+ if(!new_argv) { -+ perror("Allocating extended argv"); -+ exit(1); -+ } -+ -+ new_argv[0] = argv[0]; -+ new_argv[1] = padding; -+ -+ for(i = 2; i <= argc; i++) -+ new_argv[i] = argv[i - 1]; -+ new_argv[argc + 1] = NULL; -+ -+ execvp(new_argv[0], new_argv); -+ perror("execing with extended args"); -+ exit(1); -+ } -+#endif -+ -+ linux_prog = argv[0]; -+ -+ set_stklim(); -+ -+ if((new_argv = malloc((argc + 1) * sizeof(char *))) == NULL){ -+ perror("Mallocing argv"); -+ exit(1); -+ } -+ for(i=0;i<argc;i++){ -+ if((new_argv[i] = strdup(argv[i])) == NULL){ -+ perror("Mallocing an arg"); -+ exit(1); -+ } -+ } -+ new_argv[argc] = NULL; -+ -+ set_handler(SIGINT, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1); -+ set_handler(SIGTERM, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1); -+ set_handler(SIGHUP, last_ditch_exit, SA_ONESHOT | SA_NODEFER, -1); -+ -+ do_uml_initcalls(); -+ ret = linux_main(argc, argv); -+ -+ /* Reboot */ -+ if(ret){ -+ printf("\n"); -+ execvp(new_argv[0], new_argv); -+ perror("Failed to exec kernel"); -+ ret = 1; -+ } -+ printf("\n"); -+ return(uml_exitcode); -+} -+ -+#define CAN_KMALLOC() \ -+ (kmalloc_ok && CHOOSE_MODE((getpid() != tracing_pid), 1)) -+ -+extern void *__real_malloc(int); -+ -+void *__wrap_malloc(int size) -+{ -+ if(CAN_KMALLOC()) -+ return(um_kmalloc(size)); -+ else -+ return(__real_malloc(size)); -+} -+ -+void *__wrap_calloc(int n, int size) -+{ -+ void *ptr = __wrap_malloc(n * size); -+ -+ if(ptr == NULL) return(NULL); -+ memset(ptr, 0, n * size); -+ return(ptr); -+} -+ -+extern void __real_free(void *); -+ -+void __wrap_free(void *ptr) -+{ -+ if(CAN_KMALLOC()) kfree(ptr); -+ else __real_free(ptr); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/Makefile um/arch/um/Makefile ---- orig/arch/um/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/Makefile 2003-06-05 15:42:11.000000000 -0400 -@@ -0,0 +1,168 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+OS := $(shell uname -s) -+ -+ARCH_DIR = arch/um -+ -+core-y := kernel sys-$(SUBARCH) os-$(OS) -+drivers-y := fs drivers -+subdir-y := $(core-y) $(drivers-y) -+SUBDIRS += $(foreach dir,$(subdir-y),$(ARCH_DIR)/$(dir)) -+ -+CORE_FILES += $(foreach dir,$(core-y),$(ARCH_DIR)/$(dir)/built-in.o) -+DRIVERS += $(foreach dir,$(drivers-y),$(ARCH_DIR)/$(dir)/built-in.o) -+ -+include $(ARCH_DIR)/Makefile-$(SUBARCH) -+include $(ARCH_DIR)/Makefile-os-$(OS) -+ -+MAKEFILE-$(CONFIG_MODE_TT) += Makefile-tt -+MAKEFILE-$(CONFIG_MODE_SKAS) += Makefile-skas -+ -+ifneq ($(MAKEFILE-y),) -+ include $(addprefix $(ARCH_DIR)/,$(MAKEFILE-y)) -+endif -+ -+EXTRAVERSION := $(EXTRAVERSION)-6um -+ -+include/linux/version.h: arch/$(ARCH)/Makefile -+ -+# Recalculate MODLIB to reflect the EXTRAVERSION changes (via KERNELRELEASE) -+# The way the toplevel Makefile is written EXTRAVERSION is not supposed -+# to be changed outside the toplevel Makefile, but recalculating MODLIB is -+# a sufficient workaround until we no longer need architecture dependent -+# EXTRAVERSION... -+MODLIB := $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE) -+ -+ifeq ($(CONFIG_DEBUGSYM),y) -+CFLAGS := $(subst -fomit-frame-pointer,,$(CFLAGS)) -+endif -+ -+CFLAGS-$(CONFIG_DEBUGSYM) += -g -+ -+ARCH_INCLUDE = -I$(TOPDIR)/$(ARCH_DIR)/include -+ -+# -Derrno=kernel_errno - This turns all kernel references to errno into -+# kernel_errno to separate them from the libc errno. This allows -fno-common -+# in CFLAGS. Otherwise, it would cause ld to complain about the two different -+# errnos. -+ -+CFLAGS += $(ARCH_CFLAGS) $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ -+ -D_LARGEFILE64_SOURCE $(ARCH_INCLUDE) -Derrno=kernel_errno \ -+ $(MODE_INCLUDE) -+ -+LINKFLAGS += -r -+ -+LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc -+ -+SIZE = (($(CONFIG_NEST_LEVEL) + $(CONFIG_KERNEL_HALF_GIGS)) * 0x20000000) -+ -+# These aren't in Makefile-tt because they are needed in the !CONFIG_MODE_TT + -+# CONFIG_MODE_SKAS + CONFIG_STATIC_LINK case. -+ -+LINK_TT = -static -+LD_SCRIPT_TT := link.ld -+ -+ifeq ($(CONFIG_STATIC_LINK),y) -+ LINK-y += $(LINK_TT) -+ LD_SCRIPT-y := $(LD_SCRIPT_TT) -+else -+ifeq ($(CONFIG_MODE_TT),y) -+ LINK-y += $(LINK_TT) -+ LD_SCRIPT-y := $(LD_SCRIPT_TT) -+else -+ifeq ($(CONFIG_MODE_SKAS),y) -+ LINK-y += $(LINK_SKAS) -+ LD_SCRIPT-y := $(LD_SCRIPT_SKAS) -+endif -+endif -+endif -+ -+LD_SCRIPT-y := $(ARCH_DIR)/$(LD_SCRIPT-y) -+M4_MODE_TT := $(shell [ "$(CONFIG_MODE_TT)" = "y" ] && echo -DMODE_TT) -+ -+$(LD_SCRIPT-y): $(LD_SCRIPT-y).in -+ pages=$$(( 1 << $(CONFIG_KERNEL_STACK_ORDER) )) ; \ -+ m4 -DSTART=$$(($(TOP_ADDR) - $(SIZE))) -DELF_ARCH=$(ELF_ARCH) \ -+ -DELF_FORMAT=$(ELF_FORMAT) $(M4_MODE_TT) \ -+ -DKERNEL_STACK_SIZE=$$(( 4096 * $$pages )) $< > $@ -+ -+SYMLINK_HEADERS = include/asm-um/archparam.h include/asm-um/system.h \ -+ include/asm-um/sigcontext.h include/asm-um/processor.h \ -+ include/asm-um/ptrace.h include/asm-um/arch-signal.h -+ -+ARCH_SYMLINKS = include/asm-um/arch arch/um/include/sysdep arch/um/os \ -+ $(SYMLINK_HEADERS) $(ARCH_DIR)/include/uml-config.h -+ -+ifeq ($(CONFIG_MODE_SKAS), y) -+$(SYS_HEADERS) : $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h -+endif -+ -+GEN_HEADERS += $(ARCH_DIR)/include/task.h $(ARCH_DIR)/include/kern_constants.h -+ -+setup: $(ARCH_SYMLINKS) $(SYS_HEADERS) $(GEN_HEADERS) -+ -+linux: setup $(ARCH_DIR)/main.o vmlinux $(LD_SCRIPT-y) -+ mv vmlinux vmlinux.o -+ $(CC) -Wl,-T,$(LD_SCRIPT-y) $(LINK-y) $(LINK_WRAPS) \ -+ -o linux $(ARCH_DIR)/main.o vmlinux.o -L/usr/lib -lutil -+ -+USER_CFLAGS := $(patsubst -I%,,$(CFLAGS)) -+USER_CFLAGS := $(patsubst -Derrno=kernel_errno,,$(USER_CFLAGS)) -+USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \ -+ $(MODE_INCLUDE) -+ -+# To get a definition of F_SETSIG -+USER_CFLAGS += -D_GNU_SOURCE -+ -+CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/link.ld $(ARCH_DIR)/dyn_link.ld \ -+ $(GEN_HEADERS) $(ARCH_DIR)/include/uml-config.h -+ -+$(ARCH_DIR)/main.o: $(ARCH_DIR)/main.c -+ $(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< -+ -+archmrproper: -+ rm -f $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) include/asm \ -+ $(LD_SCRIPT) $(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS)) -+ -+archclean: sysclean -+ find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ -+ -o -name '*.gcov' \) -type f -print | xargs rm -f -+ cd $(ARCH_DIR) ; \ -+ for dir in $(subdir-y) util ; do $(MAKE) -C $$dir clean; done -+ -+archdep: -+ -+$(SYMLINK_HEADERS): -+ cd $(TOPDIR)/$(dir $@) ; \ -+ ln -sf $(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $(notdir $@) -+ -+include/asm-um/arch: -+ cd $(TOPDIR)/include/asm-um && ln -sf ../asm-$(SUBARCH) arch -+ -+arch/um/include/sysdep: -+ cd $(TOPDIR)/arch/um/include && ln -sf sysdep-$(SUBARCH) sysdep -+ -+arch/um/os: -+ cd $(ARCH_DIR) && ln -sf os-$(OS) os -+ -+$(ARCH_DIR)/include/task.h : $(ARCH_DIR)/util/mk_task -+ $< > $@ -+ -+$(ARCH_DIR)/include/kern_constants.h : $(ARCH_DIR)/util/mk_constants -+ $< > $@ -+ -+$(ARCH_DIR)/include/uml-config.h : $(TOPDIR)/include/linux/autoconf.h -+ sed 's/ CONFIG/ UML_CONFIG/' $(TOPDIR)/include/linux/autoconf.h > $@ -+ -+$(ARCH_DIR)/util/mk_task : $(ARCH_DIR)/util/mk_task_user.c \ -+ $(ARCH_DIR)/util/mk_task_kern.c $(SYS_HEADERS) -+ $(MAKE) $(MFLAGS) -C $(ARCH_DIR)/util mk_task -+ -+$(ARCH_DIR)/util/mk_constants : $(ARCH_DIR)/util/mk_constants_user.c \ -+ $(ARCH_DIR)/util/mk_constants_kern.c -+ $(MAKE) $(MFLAGS) -C $(ARCH_DIR)/util mk_constants -+ -+export SUBARCH USER_CFLAGS OS -diff -Naur -X ../exclude-files orig/arch/um/Makefile-i386 um/arch/um/Makefile-i386 ---- orig/arch/um/Makefile-i386 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/Makefile-i386 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,35 @@ -+ifeq ($(CONFIG_HOST_2G_2G), y) -+TOP_ADDR = 0x80000000 -+else -+TOP_ADDR = 0xc0000000 -+endif -+ -+ARCH_CFLAGS = -U__$(SUBARCH)__ -U$(SUBARCH) -DUM_FASTCALL -+ELF_ARCH = $(SUBARCH) -+ELF_FORMAT = elf32-$(SUBARCH) -+ -+I386_H = $(ARCH_DIR)/include/sysdep-i386 -+SYS = $(ARCH_DIR)/sys-i386 -+UTIL = $(SYS)/util -+SUBDIRS += $(UTIL) -+ -+SYS_HEADERS = $(I386_H)/sc.h $(I386_H)/thread.h -+ -+$(I386_H)/sc.h : $(UTIL)/mk_sc -+ $(UTIL)/mk_sc > $@ -+ -+$(I386_H)/thread.h : $(UTIL)/mk_thread -+ $(UTIL)/mk_thread > $@ -+ -+$(UTIL)/mk_sc : $(UTIL)/mk_sc.c -+ $(MAKE) -C $(UTIL) mk_sc -+ -+$(UTIL)/mk_thread : $(UTIL)/mk_thread_user.c $(UTIL)/mk_thread_kern.c \ -+ $(I386_H)/sc.h -+ $(MAKE) -C $(UTIL) mk_thread -+ -+sysclean : -+ rm -f $(SYS_HEADERS) -+ $(MAKE) -C $(UTIL) clean -+ $(MAKE) -C $(SYS) clean -+ -diff -Naur -X ../exclude-files orig/arch/um/Makefile-ia64 um/arch/um/Makefile-ia64 ---- orig/arch/um/Makefile-ia64 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/Makefile-ia64 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1 @@ -+START_ADDR = 0x1000000000000000 -diff -Naur -X ../exclude-files orig/arch/um/Makefile-os-Linux um/arch/um/Makefile-os-Linux ---- orig/arch/um/Makefile-os-Linux 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/Makefile-os-Linux 2002-12-09 14:21:51.000000000 -0500 -@@ -0,0 +1,7 @@ -+# -+# Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+SUBDIRS += $(ARCH_DIR)/os-$(OS)/drivers -+DRIVERS += $(ARCH_DIR)/os-$(OS)/drivers/drivers.o -diff -Naur -X ../exclude-files orig/arch/um/Makefile-ppc um/arch/um/Makefile-ppc ---- orig/arch/um/Makefile-ppc 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/Makefile-ppc 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,9 @@ -+ifeq ($(CONFIG_HOST_2G_2G), y) -+START_ADDR = 0x80000000 -+else -+START_ADDR = 0xc0000000 -+endif -+ARCH_CFLAGS = -U__powerpc__ -D__UM_PPC__ -+ -+# The arch is ppc, but the elf32 name is powerpc -+ELF_SUBARCH = powerpc -diff -Naur -X ../exclude-files orig/arch/um/Makefile-skas um/arch/um/Makefile-skas ---- orig/arch/um/Makefile-skas 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/Makefile-skas 2002-12-15 22:02:57.000000000 -0500 -@@ -0,0 +1,20 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+PROFILE += -pg -+ -+CFLAGS-$(CONFIG_GCOV) += -fprofile-arcs -ftest-coverage -+CFLAGS-$(CONFIG_GPROF) += $(PROFILE) -+LINK-$(CONFIG_GPROF) += $(PROFILE) -+ -+MODE_INCLUDE += -I$(TOPDIR)/$(ARCH_DIR)/kernel/skas/include -+ -+LINK_SKAS = -Wl,-rpath,/lib -+LD_SCRIPT_SKAS = dyn_link.ld -+ -+GEN_HEADERS += $(ARCH_DIR)/kernel/skas/include/skas_ptregs.h -+ -+$(ARCH_DIR)/kernel/skas/include/skas_ptregs.h : -+ $(MAKE) -C $(ARCH_DIR)/kernel/skas include/skas_ptregs.h -diff -Naur -X ../exclude-files orig/arch/um/Makefile-tt um/arch/um/Makefile-tt ---- orig/arch/um/Makefile-tt 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/Makefile-tt 2002-12-16 20:22:23.000000000 -0500 -@@ -0,0 +1,7 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+MODE_INCLUDE += -I$(TOPDIR)/$(ARCH_DIR)/kernel/tt/include -+ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/etap.h um/arch/um/os-Linux/drivers/etap.h ---- orig/arch/um/os-Linux/drivers/etap.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/drivers/etap.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,27 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "net_user.h" -+ -+struct ethertap_data { -+ char *dev_name; -+ char *gate_addr; -+ int data_fd; -+ int control_fd; -+ void *dev; -+}; -+ -+extern struct net_user_info ethertap_user_info; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/ethertap_kern.c um/arch/um/os-Linux/drivers/ethertap_kern.c ---- orig/arch/um/os-Linux/drivers/ethertap_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/drivers/ethertap_kern.c 2002-12-15 21:17:37.000000000 -0500 -@@ -0,0 +1,122 @@ -+/* -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and -+ * James Leu (jleu@mindspring.net). -+ * Copyright (C) 2001 by various other people who didn't put their name here. -+ * Licensed under the GPL. -+ */ -+ -+#include "linux/init.h" -+#include "linux/netdevice.h" -+#include "linux/etherdevice.h" -+#include "linux/init.h" -+#include "net_kern.h" -+#include "net_user.h" -+#include "etap.h" -+ -+struct ethertap_init { -+ char *dev_name; -+ char *gate_addr; -+}; -+ -+static void etap_init(struct net_device *dev, void *data) -+{ -+ struct uml_net_private *pri; -+ struct ethertap_data *epri; -+ struct ethertap_init *init = data; -+ -+ init_etherdev(dev, 0); -+ pri = dev->priv; -+ epri = (struct ethertap_data *) pri->user; -+ *epri = ((struct ethertap_data) -+ { .dev_name = init->dev_name, -+ .gate_addr = init->gate_addr, -+ .data_fd = -1, -+ .control_fd = -1, -+ .dev = dev }); -+ -+ printk("ethertap backend - %s", epri->dev_name); -+ if(epri->gate_addr != NULL) -+ printk(", IP = %s", epri->gate_addr); -+ printk("\n"); -+} -+ -+static int etap_read(int fd, struct sk_buff **skb, struct uml_net_private *lp) -+{ -+ int len; -+ -+ *skb = ether_adjust_skb(*skb, ETH_HEADER_ETHERTAP); -+ if(*skb == NULL) return(-ENOMEM); -+ len = net_recvfrom(fd, (*skb)->mac.raw, -+ (*skb)->dev->mtu + 2 * ETH_HEADER_ETHERTAP); -+ if(len <= 0) return(len); -+ skb_pull(*skb, 2); -+ len -= 2; -+ return(len); -+} -+ -+static int etap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) -+{ -+ if(skb_headroom(*skb) < 2){ -+ struct sk_buff *skb2; -+ -+ skb2 = skb_realloc_headroom(*skb, 2); -+ dev_kfree_skb(*skb); -+ if (skb2 == NULL) return(-ENOMEM); -+ *skb = skb2; -+ } -+ skb_push(*skb, 2); -+ return(net_send(fd, (*skb)->data, (*skb)->len)); -+} -+ -+struct net_kern_info ethertap_kern_info = { -+ .init = etap_init, -+ .protocol = eth_protocol, -+ .read = etap_read, -+ .write = etap_write, -+}; -+ -+int ethertap_setup(char *str, char **mac_out, void *data) -+{ -+ struct ethertap_init *init = data; -+ -+ *init = ((struct ethertap_init) -+ { .dev_name = NULL, -+ .gate_addr = NULL }); -+ if(tap_setup_common(str, "ethertap", &init->dev_name, mac_out, -+ &init->gate_addr)) -+ return(0); -+ if(init->dev_name == NULL){ -+ printk("ethertap_setup : Missing tap device name\n"); -+ return(0); -+ } -+ -+ return(1); -+} -+ -+static struct transport ethertap_transport = { -+ .list = LIST_HEAD_INIT(ethertap_transport.list), -+ .name = "ethertap", -+ .setup = ethertap_setup, -+ .user = ðertap_user_info, -+ .kern = ðertap_kern_info, -+ .private_size = sizeof(struct ethertap_data), -+}; -+ -+static int register_ethertap(void) -+{ -+ register_transport(ðertap_transport); -+ return(1); -+} -+ -+__initcall(register_ethertap); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/ethertap_user.c um/arch/um/os-Linux/drivers/ethertap_user.c ---- orig/arch/um/os-Linux/drivers/ethertap_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/drivers/ethertap_user.c 2002-12-15 21:17:52.000000000 -0500 -@@ -0,0 +1,238 @@ -+/* -+ * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and -+ * James Leu (jleu@mindspring.net). -+ * Copyright (C) 2001 by various other people who didn't put their name here. -+ * Licensed under the GPL. -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <stddef.h> -+#include <fcntl.h> -+#include <stdlib.h> -+#include <sys/errno.h> -+#include <sys/socket.h> -+#include <sys/wait.h> -+#include <sys/un.h> -+#include <net/if.h> -+#include "user.h" -+#include "kern_util.h" -+#include "net_user.h" -+#include "etap.h" -+#include "helper.h" -+#include "os.h" -+ -+#define MAX_PACKET ETH_MAX_PACKET -+ -+void etap_user_init(void *data, void *dev) -+{ -+ struct ethertap_data *pri = data; -+ -+ pri->dev = dev; -+} -+ -+struct addr_change { -+ enum { ADD_ADDR, DEL_ADDR } what; -+ unsigned char addr[4]; -+ unsigned char netmask[4]; -+}; -+ -+static void etap_change(int op, unsigned char *addr, unsigned char *netmask, -+ int fd) -+{ -+ struct addr_change change; -+ void *output; -+ -+ change.what = op; -+ memcpy(change.addr, addr, sizeof(change.addr)); -+ memcpy(change.netmask, netmask, sizeof(change.netmask)); -+ if(write(fd, &change, sizeof(change)) != sizeof(change)) -+ printk("etap_change - request failed, errno = %d\n", -+ errno); -+ output = um_kmalloc(page_size()); -+ if(output == NULL) -+ printk("etap_change : Failed to allocate output buffer\n"); -+ read_output(fd, output, page_size()); -+ if(output != NULL){ -+ printk("%s", output); -+ kfree(output); -+ } -+} -+ -+static void etap_open_addr(unsigned char *addr, unsigned char *netmask, -+ void *arg) -+{ -+ etap_change(ADD_ADDR, addr, netmask, *((int *) arg)); -+} -+ -+static void etap_close_addr(unsigned char *addr, unsigned char *netmask, -+ void *arg) -+{ -+ etap_change(DEL_ADDR, addr, netmask, *((int *) arg)); -+} -+ -+struct etap_pre_exec_data { -+ int control_remote; -+ int control_me; -+ int data_me; -+}; -+ -+static void etap_pre_exec(void *arg) -+{ -+ struct etap_pre_exec_data *data = arg; -+ -+ dup2(data->control_remote, 1); -+ close(data->data_me); -+ close(data->control_me); -+} -+ -+static int etap_tramp(char *dev, char *gate, int control_me, -+ int control_remote, int data_me, int data_remote) -+{ -+ struct etap_pre_exec_data pe_data; -+ int pid, status, err; -+ char version_buf[sizeof("nnnnn\0")]; -+ char data_fd_buf[sizeof("nnnnnn\0")]; -+ char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")]; -+ char *setup_args[] = { "uml_net", version_buf, "ethertap", dev, -+ data_fd_buf, gate_buf, NULL }; -+ char *nosetup_args[] = { "uml_net", version_buf, "ethertap", -+ dev, data_fd_buf, NULL }; -+ char **args, c; -+ -+ sprintf(data_fd_buf, "%d", data_remote); -+ sprintf(version_buf, "%d", UML_NET_VERSION); -+ if(gate != NULL){ -+ strcpy(gate_buf, gate); -+ args = setup_args; -+ } -+ else args = nosetup_args; -+ -+ err = 0; -+ pe_data.control_remote = control_remote; -+ pe_data.control_me = control_me; -+ pe_data.data_me = data_me; -+ pid = run_helper(etap_pre_exec, &pe_data, args, NULL); -+ -+ if(pid < 0) err = errno; -+ close(data_remote); -+ close(control_remote); -+ if(read(control_me, &c, sizeof(c)) != sizeof(c)){ -+ printk("etap_tramp : read of status failed, errno = %d\n", -+ errno); -+ return(EINVAL); -+ } -+ if(c != 1){ -+ printk("etap_tramp : uml_net failed\n"); -+ err = EINVAL; -+ if(waitpid(pid, &status, 0) < 0) err = errno; -+ else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 1)){ -+ printk("uml_net didn't exit with status 1\n"); -+ } -+ } -+ return(err); -+} -+ -+static int etap_open(void *data) -+{ -+ struct ethertap_data *pri = data; -+ char *output; -+ int data_fds[2], control_fds[2], err, output_len; -+ -+ err = tap_open_common(pri->dev, pri->gate_addr); -+ if(err) return(err); -+ -+ err = os_pipe(data_fds, 0, 0); -+ if(err){ -+ printk("data os_pipe failed - errno = %d\n", -err); -+ return(err); -+ } -+ -+ err = os_pipe(control_fds, 1, 0); -+ if(err){ -+ printk("control os_pipe failed - errno = %d\n", -err); -+ return(err); -+ } -+ -+ err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0], -+ control_fds[1], data_fds[0], data_fds[1]); -+ output_len = page_size(); -+ output = um_kmalloc(output_len); -+ read_output(control_fds[0], output, output_len); -+ -+ if(output == NULL) -+ printk("etap_open : failed to allocate output buffer\n"); -+ else { -+ printk("%s", output); -+ kfree(output); -+ } -+ -+ if(err != 0){ -+ printk("etap_tramp failed - errno = %d\n", err); -+ return(-err); -+ } -+ -+ pri->data_fd = data_fds[0]; -+ pri->control_fd = control_fds[0]; -+ iter_addresses(pri->dev, etap_open_addr, &pri->control_fd); -+ return(data_fds[0]); -+} -+ -+static void etap_close(int fd, void *data) -+{ -+ struct ethertap_data *pri = data; -+ -+ iter_addresses(pri->dev, etap_close_addr, &pri->control_fd); -+ close(fd); -+ os_shutdown_socket(pri->data_fd, 1, 1); -+ close(pri->data_fd); -+ pri->data_fd = -1; -+ close(pri->control_fd); -+ pri->control_fd = -1; -+} -+ -+static int etap_set_mtu(int mtu, void *data) -+{ -+ return(mtu); -+} -+ -+static void etap_add_addr(unsigned char *addr, unsigned char *netmask, -+ void *data) -+{ -+ struct ethertap_data *pri = data; -+ -+ tap_check_ips(pri->gate_addr, addr); -+ if(pri->control_fd == -1) return; -+ etap_open_addr(addr, netmask, &pri->control_fd); -+} -+ -+static void etap_del_addr(unsigned char *addr, unsigned char *netmask, -+ void *data) -+{ -+ struct ethertap_data *pri = data; -+ -+ if(pri->control_fd == -1) return; -+ etap_close_addr(addr, netmask, &pri->control_fd); -+} -+ -+struct net_user_info ethertap_user_info = { -+ .init = etap_user_init, -+ .open = etap_open, -+ .close = etap_close, -+ .remove = NULL, -+ .set_mtu = etap_set_mtu, -+ .add_address = etap_add_addr, -+ .delete_address = etap_del_addr, -+ .max_packet = MAX_PACKET - ETH_HEADER_ETHERTAP -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/Makefile um/arch/um/os-Linux/drivers/Makefile ---- orig/arch/um/os-Linux/drivers/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/drivers/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,31 @@ -+# -+# Copyright (C) 2000, 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET := drivers.o -+ -+list-multi := tuntap.o ethertap.o -+ -+ethertap-objs := ethertap_kern.o ethertap_user.o -+tuntap-objs := tuntap_kern.o tuntap_user.o -+ -+obj-y = -+obj-$(CONFIG_UML_NET_ETHERTAP) += ethertap.o -+obj-$(CONFIG_UML_NET_TUNTAP) += tuntap.o -+ -+USER_SINGLE_OBJS = $(foreach f,$(patsubst %.o,%,$(obj-y)),$($(f)-objs)) -+ -+USER_OBJS = $(filter %_user.o,$(obj-y) $(USER_SINGLE_OBJS)) -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+ethertap.o : $(ethertap-objs) -+ -+tuntap.o : $(tuntap-objs) -+ -+$(list-multi) : # This doesn't work, but should : '%.o : $(%-objs)' -+ $(LD) $(LD_RFLAG) -r -o $@ $($(patsubst %.o,%,$@)-objs) -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap.h um/arch/um/os-Linux/drivers/tuntap.h ---- orig/arch/um/os-Linux/drivers/tuntap.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/drivers/tuntap.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,32 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __UM_TUNTAP_H -+#define __UM_TUNTAP_H -+ -+#include "net_user.h" -+ -+struct tuntap_data { -+ char *dev_name; -+ int fixed_config; -+ char *gate_addr; -+ int fd; -+ void *dev; -+}; -+ -+extern struct net_user_info tuntap_user_info; -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap_kern.c um/arch/um/os-Linux/drivers/tuntap_kern.c ---- orig/arch/um/os-Linux/drivers/tuntap_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/drivers/tuntap_kern.c 2002-12-15 21:18:16.000000000 -0500 -@@ -0,0 +1,105 @@ -+/* -+ * Copyright (C) 2001 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/stddef.h" -+#include "linux/netdevice.h" -+#include "linux/etherdevice.h" -+#include "linux/skbuff.h" -+#include "linux/init.h" -+#include "asm/errno.h" -+#include "net_kern.h" -+#include "net_user.h" -+#include "tuntap.h" -+ -+struct tuntap_init { -+ char *dev_name; -+ char *gate_addr; -+}; -+ -+static void tuntap_init(struct net_device *dev, void *data) -+{ -+ struct uml_net_private *pri; -+ struct tuntap_data *tpri; -+ struct tuntap_init *init = data; -+ -+ init_etherdev(dev, 0); -+ pri = dev->priv; -+ tpri = (struct tuntap_data *) pri->user; -+ *tpri = ((struct tuntap_data) -+ { .dev_name = init->dev_name, -+ .fixed_config = (init->dev_name != NULL), -+ .gate_addr = init->gate_addr, -+ .fd = -1, -+ .dev = dev }); -+ printk("TUN/TAP backend - "); -+ if(tpri->gate_addr != NULL) -+ printk("IP = %s", tpri->gate_addr); -+ printk("\n"); -+} -+ -+static int tuntap_read(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); -+ if(*skb == NULL) return(-ENOMEM); -+ return(net_read(fd, (*skb)->mac.raw, -+ (*skb)->dev->mtu + ETH_HEADER_OTHER)); -+} -+ -+static int tuntap_write(int fd, struct sk_buff **skb, -+ struct uml_net_private *lp) -+{ -+ return(net_write(fd, (*skb)->data, (*skb)->len)); -+} -+ -+struct net_kern_info tuntap_kern_info = { -+ .init = tuntap_init, -+ .protocol = eth_protocol, -+ .read = tuntap_read, -+ .write = tuntap_write, -+}; -+ -+int tuntap_setup(char *str, char **mac_out, void *data) -+{ -+ struct tuntap_init *init = data; -+ -+ *init = ((struct tuntap_init) -+ { .dev_name = NULL, -+ .gate_addr = NULL }); -+ if(tap_setup_common(str, "tuntap", &init->dev_name, mac_out, -+ &init->gate_addr)) -+ return(0); -+ -+ return(1); -+} -+ -+static struct transport tuntap_transport = { -+ .list = LIST_HEAD_INIT(tuntap_transport.list), -+ .name = "tuntap", -+ .setup = tuntap_setup, -+ .user = &tuntap_user_info, -+ .kern = &tuntap_kern_info, -+ .private_size = sizeof(struct tuntap_data), -+ .setup_size = sizeof(struct tuntap_init), -+}; -+ -+static int register_tuntap(void) -+{ -+ register_transport(&tuntap_transport); -+ return(1); -+} -+ -+__initcall(register_tuntap); -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/drivers/tuntap_user.c um/arch/um/os-Linux/drivers/tuntap_user.c ---- orig/arch/um/os-Linux/drivers/tuntap_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/drivers/tuntap_user.c 2002-12-15 21:18:25.000000000 -0500 -@@ -0,0 +1,223 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <stddef.h> -+#include <stdlib.h> -+#include <unistd.h> -+#include <errno.h> -+#include <fcntl.h> -+#include <sys/wait.h> -+#include <sys/socket.h> -+#include <sys/un.h> -+#include <sys/uio.h> -+#include <sys/ioctl.h> -+#include <net/if.h> -+#include <linux/if_tun.h> -+#include "net_user.h" -+#include "tuntap.h" -+#include "kern_util.h" -+#include "user.h" -+#include "helper.h" -+#include "os.h" -+ -+#define MAX_PACKET ETH_MAX_PACKET -+ -+void tuntap_user_init(void *data, void *dev) -+{ -+ struct tuntap_data *pri = data; -+ -+ pri->dev = dev; -+} -+ -+static void tuntap_add_addr(unsigned char *addr, unsigned char *netmask, -+ void *data) -+{ -+ struct tuntap_data *pri = data; -+ -+ tap_check_ips(pri->gate_addr, addr); -+ if((pri->fd == -1) || pri->fixed_config) return; -+ open_addr(addr, netmask, pri->dev_name); -+} -+ -+static void tuntap_del_addr(unsigned char *addr, unsigned char *netmask, -+ void *data) -+{ -+ struct tuntap_data *pri = data; -+ -+ if((pri->fd == -1) || pri->fixed_config) return; -+ close_addr(addr, netmask, pri->dev_name); -+} -+ -+struct tuntap_pre_exec_data { -+ int stdout; -+ int close_me; -+}; -+ -+static void tuntap_pre_exec(void *arg) -+{ -+ struct tuntap_pre_exec_data *data = arg; -+ -+ dup2(data->stdout, 1); -+ close(data->close_me); -+} -+ -+static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote, -+ char *buffer, int buffer_len, int *used_out) -+{ -+ struct tuntap_pre_exec_data data; -+ char version_buf[sizeof("nnnnn\0")]; -+ char *argv[] = { "uml_net", version_buf, "tuntap", "up", gate, -+ NULL }; -+ char buf[CMSG_SPACE(sizeof(*fd_out))]; -+ struct msghdr msg; -+ struct cmsghdr *cmsg; -+ struct iovec iov; -+ int pid, n; -+ -+ sprintf(version_buf, "%d", UML_NET_VERSION); -+ -+ data.stdout = remote; -+ data.close_me = me; -+ -+ pid = run_helper(tuntap_pre_exec, &data, argv, NULL); -+ -+ if(pid < 0) return(-pid); -+ -+ close(remote); -+ -+ msg.msg_name = NULL; -+ msg.msg_namelen = 0; -+ if(buffer != NULL){ -+ iov = ((struct iovec) { buffer, buffer_len }); -+ msg.msg_iov = &iov; -+ msg.msg_iovlen = 1; -+ } -+ else { -+ msg.msg_iov = NULL; -+ msg.msg_iovlen = 0; -+ } -+ msg.msg_control = buf; -+ msg.msg_controllen = sizeof(buf); -+ msg.msg_flags = 0; -+ n = recvmsg(me, &msg, 0); -+ *used_out = n; -+ if(n < 0){ -+ printk("tuntap_open_tramp : recvmsg failed - errno = %d\n", -+ errno); -+ return(errno); -+ } -+ waitpid(pid, NULL, 0); -+ -+ cmsg = CMSG_FIRSTHDR(&msg); -+ if(cmsg == NULL){ -+ printk("tuntap_open_tramp : didn't receive a message\n"); -+ return(EINVAL); -+ } -+ if((cmsg->cmsg_level != SOL_SOCKET) || -+ (cmsg->cmsg_type != SCM_RIGHTS)){ -+ printk("tuntap_open_tramp : didn't receive a descriptor\n"); -+ return(EINVAL); -+ } -+ *fd_out = ((int *) CMSG_DATA(cmsg))[0]; -+ return(0); -+} -+ -+static int tuntap_open(void *data) -+{ -+ struct ifreq ifr; -+ struct tuntap_data *pri = data; -+ char *output, *buffer; -+ int err, fds[2], len, used; -+ -+ err = tap_open_common(pri->dev, pri->gate_addr); -+ if(err) return(err); -+ -+ if(pri->fixed_config){ -+ if((pri->fd = open("/dev/net/tun", O_RDWR)) < 0){ -+ printk("Failed to open /dev/net/tun, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ memset(&ifr, 0, sizeof(ifr)); -+ ifr.ifr_flags = IFF_TAP; -+ strncpy(ifr.ifr_name, pri->dev_name, sizeof(ifr.ifr_name) - 1); -+ if(ioctl(pri->fd, TUNSETIFF, (void *) &ifr) < 0){ -+ printk("TUNSETIFF failed, errno = %d", errno); -+ close(pri->fd); -+ return(-errno); -+ } -+ } -+ else { -+ err = os_pipe(fds, 0, 0); -+ if(err){ -+ printk("tuntap_open : os_pipe failed - errno = %d\n", -+ -err); -+ return(err); -+ } -+ -+ buffer = get_output_buffer(&len); -+ if(buffer != NULL) len--; -+ used = 0; -+ -+ err = tuntap_open_tramp(pri->gate_addr, &pri->fd, fds[0], -+ fds[1], buffer, len, &used); -+ -+ output = buffer; -+ if(err == 0){ -+ pri->dev_name = uml_strdup(buffer); -+ output += IFNAMSIZ; -+ printk(output); -+ free_output_buffer(buffer); -+ } -+ else { -+ printk(output); -+ free_output_buffer(buffer); -+ printk("tuntap_open_tramp failed - errno = %d\n", err); -+ return(-err); -+ } -+ close(fds[0]); -+ iter_addresses(pri->dev, open_addr, pri->dev_name); -+ } -+ -+ return(pri->fd); -+} -+ -+static void tuntap_close(int fd, void *data) -+{ -+ struct tuntap_data *pri = data; -+ -+ if(!pri->fixed_config) -+ iter_addresses(pri->dev, close_addr, pri->dev_name); -+ close(fd); -+ pri->fd = -1; -+} -+ -+static int tuntap_set_mtu(int mtu, void *data) -+{ -+ return(mtu); -+} -+ -+struct net_user_info tuntap_user_info = { -+ .init = tuntap_user_init, -+ .open = tuntap_open, -+ .close = tuntap_close, -+ .remove = NULL, -+ .set_mtu = tuntap_set_mtu, -+ .add_address = tuntap_add_addr, -+ .delete_address = tuntap_del_addr, -+ .max_packet = MAX_PACKET -+}; -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/file.c um/arch/um/os-Linux/file.c ---- orig/arch/um/os-Linux/file.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/file.c 2003-02-04 19:32:10.000000000 -0500 -@@ -0,0 +1,384 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <unistd.h> -+#include <errno.h> -+#include <fcntl.h> -+#include <signal.h> -+#include <sys/socket.h> -+#include <sys/un.h> -+#include <sys/ioctl.h> -+#include <sys/mount.h> -+#include <sys/uio.h> -+#include "os.h" -+#include "user.h" -+#include "kern_util.h" -+ -+int os_file_type(char *file) -+{ -+ struct stat64 buf; -+ -+ if(stat64(file, &buf) == -1) -+ return(-errno); -+ -+ if(S_ISDIR(buf.st_mode)) return(OS_TYPE_DIR); -+ else if(S_ISLNK(buf.st_mode)) return(OS_TYPE_SYMLINK); -+ else if(S_ISCHR(buf.st_mode)) return(OS_TYPE_CHARDEV); -+ else if(S_ISBLK(buf.st_mode)) return(OS_TYPE_BLOCKDEV); -+ else if(S_ISFIFO(buf.st_mode)) return(OS_TYPE_FIFO); -+ else if(S_ISSOCK(buf.st_mode)) return(OS_TYPE_SOCK); -+ else return(OS_TYPE_FILE); -+} -+ -+int os_file_mode(char *file, struct openflags *mode_out) -+{ -+ *mode_out = OPENFLAGS(); -+ -+ if(!access(file, W_OK)) *mode_out = of_write(*mode_out); -+ else if(errno != EACCES) -+ return(-errno); -+ -+ if(!access(file, R_OK)) *mode_out = of_read(*mode_out); -+ else if(errno != EACCES) -+ return(-errno); -+ -+ return(0); -+} -+ -+int os_open_file(char *file, struct openflags flags, int mode) -+{ -+ int fd, f = 0; -+ -+ if(flags.r && flags.w) f = O_RDWR; -+ else if(flags.r) f = O_RDONLY; -+ else if(flags.w) f = O_WRONLY; -+ else f = 0; -+ -+ if(flags.s) f |= O_SYNC; -+ if(flags.c) f |= O_CREAT; -+ if(flags.t) f |= O_TRUNC; -+ if(flags.e) f |= O_EXCL; -+ -+ fd = open64(file, f, mode); -+ if(fd < 0) return(-errno); -+ -+ if(flags.cl){ -+ if(fcntl(fd, F_SETFD, 1)){ -+ close(fd); -+ return(-errno); -+ } -+ } -+ -+ return(fd); -+} -+ -+int os_connect_socket(char *name) -+{ -+ struct sockaddr_un sock; -+ int fd, err; -+ -+ sock.sun_family = AF_UNIX; -+ snprintf(sock.sun_path, sizeof(sock.sun_path), "%s", name); -+ -+ fd = socket(AF_UNIX, SOCK_STREAM, 0); -+ if(fd < 0) -+ return(fd); -+ -+ err = connect(fd, (struct sockaddr *) &sock, sizeof(sock)); -+ if(err) -+ return(err); -+ -+ return(fd); -+} -+ -+void os_close_file(int fd) -+{ -+ close(fd); -+} -+ -+int os_seek_file(int fd, __u64 offset) -+{ -+ __u64 actual; -+ -+ actual = lseek64(fd, offset, SEEK_SET); -+ if(actual != offset) return(-errno); -+ return(0); -+} -+ -+int os_read_file(int fd, void *buf, int len) -+{ -+ int n; -+ -+ /* Force buf into memory if it's not already. */ -+ -+ /* XXX This fails if buf is kernel memory */ -+#ifdef notdef -+ if(copy_to_user_proc(buf, &c, sizeof(c))) -+ return(-EFAULT); -+#endif -+ -+ n = read(fd, buf, len); -+ if(n < 0) -+ return(-errno); -+ return(n); -+} -+ -+int os_write_file(int fd, void *buf, int count) -+{ -+ int n; -+ -+ /* Force buf into memory if it's not already. */ -+ -+ /* XXX This fails if buf is kernel memory */ -+#ifdef notdef -+ if(copy_to_user_proc(buf, buf, buf[0])) -+ return(-EFAULT); -+#endif -+ -+ n = write(fd, buf, count); -+ if(n < 0) -+ return(-errno); -+ return(n); -+} -+ -+int os_file_size(char *file, long long *size_out) -+{ -+ struct stat64 buf; -+ -+ if(stat64(file, &buf) == -1){ -+ printk("Couldn't stat \"%s\" : errno = %d\n", file, errno); -+ return(-errno); -+ } -+ if(S_ISBLK(buf.st_mode)){ -+ int fd, blocks; -+ -+ if((fd = open64(file, O_RDONLY)) < 0){ -+ printk("Couldn't open \"%s\", errno = %d\n", file, -+ errno); -+ return(-errno); -+ } -+ if(ioctl(fd, BLKGETSIZE, &blocks) < 0){ -+ printk("Couldn't get the block size of \"%s\", " -+ "errno = %d\n", file, errno); -+ close(fd); -+ return(-errno); -+ } -+ *size_out = ((long long) blocks) * 512; -+ close(fd); -+ return(0); -+ } -+ *size_out = buf.st_size; -+ return(0); -+} -+ -+int os_pipe(int *fds, int stream, int close_on_exec) -+{ -+ int err, type = stream ? SOCK_STREAM : SOCK_DGRAM; -+ -+ err = socketpair(AF_UNIX, type, 0, fds); -+ if(err) -+ return(-errno); -+ -+ if(!close_on_exec) -+ return(0); -+ -+ if((fcntl(fds[0], F_SETFD, 1) < 0) || (fcntl(fds[1], F_SETFD, 1) < 0)) -+ printk("os_pipe : Setting FD_CLOEXEC failed, errno = %d", -+ errno); -+ -+ return(0); -+} -+ -+int os_set_fd_async(int fd, int owner) -+{ -+ /* XXX This should do F_GETFL first */ -+ if(fcntl(fd, F_SETFL, O_ASYNC | O_NONBLOCK) < 0){ -+ printk("os_set_fd_async : failed to set O_ASYNC and " -+ "O_NONBLOCK on fd # %d, errno = %d\n", fd, errno); -+ return(-errno); -+ } -+#ifdef notdef -+ if(fcntl(fd, F_SETFD, 1) < 0){ -+ printk("os_set_fd_async : Setting FD_CLOEXEC failed, " -+ "errno = %d\n", errno); -+ } -+#endif -+ -+ if((fcntl(fd, F_SETSIG, SIGIO) < 0) || -+ (fcntl(fd, F_SETOWN, owner) < 0)){ -+ printk("os_set_fd_async : Failed to fcntl F_SETOWN " -+ "(or F_SETSIG) fd %d to pid %d, errno = %d\n", fd, -+ owner, errno); -+ return(-errno); -+ } -+ -+ return(0); -+} -+ -+int os_set_fd_block(int fd, int blocking) -+{ -+ int flags; -+ -+ flags = fcntl(fd, F_GETFL); -+ -+ if(blocking) flags &= ~O_NONBLOCK; -+ else flags |= O_NONBLOCK; -+ -+ if(fcntl(fd, F_SETFL, flags) < 0){ -+ printk("Failed to change blocking on fd # %d, errno = %d\n", -+ fd, errno); -+ return(-errno); -+ } -+ return(0); -+} -+ -+int os_accept_connection(int fd) -+{ -+ int new; -+ -+ new = accept(fd, NULL, 0); -+ if(new < 0) -+ return(-errno); -+ return(new); -+} -+ -+#ifndef SHUT_RD -+#define SHUT_RD 0 -+#endif -+ -+#ifndef SHUT_WR -+#define SHUT_WR 1 -+#endif -+ -+#ifndef SHUT_RDWR -+#define SHUT_RDWR 2 -+#endif -+ -+int os_shutdown_socket(int fd, int r, int w) -+{ -+ int what, err; -+ -+ if(r && w) what = SHUT_RDWR; -+ else if(r) what = SHUT_RD; -+ else if(w) what = SHUT_WR; -+ else { -+ printk("os_shutdown_socket : neither r or w was set\n"); -+ return(-EINVAL); -+ } -+ err = shutdown(fd, what); -+ if(err) -+ return(-errno); -+ return(0); -+} -+ -+int os_rcv_fd(int fd, int *helper_pid_out) -+{ -+ int new, n; -+ char buf[CMSG_SPACE(sizeof(new))]; -+ struct msghdr msg; -+ struct cmsghdr *cmsg; -+ struct iovec iov; -+ -+ msg.msg_name = NULL; -+ msg.msg_namelen = 0; -+ iov = ((struct iovec) { .iov_base = helper_pid_out, -+ .iov_len = sizeof(*helper_pid_out) }); -+ msg.msg_iov = &iov; -+ msg.msg_iovlen = 1; -+ msg.msg_control = buf; -+ msg.msg_controllen = sizeof(buf); -+ msg.msg_flags = 0; -+ -+ n = recvmsg(fd, &msg, 0); -+ if(n < 0) -+ return(-errno); -+ -+ else if(n != sizeof(iov.iov_len)) -+ *helper_pid_out = -1; -+ -+ cmsg = CMSG_FIRSTHDR(&msg); -+ if(cmsg == NULL){ -+ printk("rcv_fd didn't receive anything, error = %d\n", errno); -+ return(-1); -+ } -+ if((cmsg->cmsg_level != SOL_SOCKET) || -+ (cmsg->cmsg_type != SCM_RIGHTS)){ -+ printk("rcv_fd didn't receive a descriptor\n"); -+ return(-1); -+ } -+ -+ new = ((int *) CMSG_DATA(cmsg))[0]; -+ return(new); -+} -+ -+int create_unix_socket(char *file, int len) -+{ -+ struct sockaddr_un addr; -+ int sock, err; -+ -+ sock = socket(PF_UNIX, SOCK_DGRAM, 0); -+ if (sock < 0){ -+ printk("create_unix_socket - socket failed, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ -+ addr.sun_family = AF_UNIX; -+ -+ /* XXX Be more careful about overflow */ -+ snprintf(addr.sun_path, len, "%s", file); -+ -+ err = bind(sock, (struct sockaddr *) &addr, sizeof(addr)); -+ if (err < 0){ -+ printk("create_listening_socket - bind failed, errno = %d\n", -+ errno); -+ return(-errno); -+ } -+ -+ return(sock); -+} -+ -+void os_flush_stdout(void) -+{ -+ fflush(stdout); -+} -+ -+int os_lock_file(int fd, int excl) -+{ -+ int type = excl ? F_WRLCK : F_RDLCK; -+ struct flock lock = ((struct flock) { .l_type = type, -+ .l_whence = SEEK_SET, -+ .l_start = 0, -+ .l_len = 0 } ); -+ int err, save; -+ -+ err = fcntl(fd, F_SETLK, &lock); -+ if(!err) -+ goto out; -+ -+ save = -errno; -+ err = fcntl(fd, F_GETLK, &lock); -+ if(err){ -+ err = -errno; -+ goto out; -+ } -+ -+ printk("F_SETLK failed, file already locked by pid %d\n", lock.l_pid); -+ err = save; -+ out: -+ return(err); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/include/file.h um/arch/um/os-Linux/include/file.h ---- orig/arch/um/os-Linux/include/file.h 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/include/file.h 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,22 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#ifndef __OS_FILE_H__ -+#define __OS_FILE_H__ -+ -+#define DEV_NULL "/dev/null" -+ -+#endif -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/Makefile um/arch/um/os-Linux/Makefile ---- orig/arch/um/os-Linux/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,17 @@ -+# -+# Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET = built-in.o -+ -+obj-y = file.o process.o tty.o -+ -+include $(TOPDIR)/Rules.make -+ -+$(obj-y) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+clean : -+ -+archmrproper: -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/process.c um/arch/um/os-Linux/process.c ---- orig/arch/um/os-Linux/process.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/process.c 2003-01-08 14:19:00.000000000 -0500 -@@ -0,0 +1,142 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <unistd.h> -+#include <stdio.h> -+#include <errno.h> -+#include <signal.h> -+#include <sys/mman.h> -+#include <sys/wait.h> -+#include "os.h" -+#include "user.h" -+ -+unsigned long os_process_pc(int pid) -+{ -+ char proc_stat[sizeof("/proc/#####/stat\0")], buf[256]; -+ unsigned long pc; -+ int fd; -+ -+ sprintf(proc_stat, "/proc/%d/stat", pid); -+ fd = os_open_file(proc_stat, of_read(OPENFLAGS()), 0); -+ if(fd < 0){ -+ printk("os_process_pc - couldn't open '%s', errno = %d\n", -+ proc_stat, errno); -+ return(-1); -+ } -+ if(read(fd, buf, sizeof(buf)) < 0){ -+ printk("os_process_pc - couldn't read '%s', errno = %d\n", -+ proc_stat, errno); -+ close(fd); -+ return(-1); -+ } -+ close(fd); -+ pc = -1; -+ if(sscanf(buf, "%*d %*s %*c %*d %*d %*d %*d %*d %*d %*d %*d " -+ "%*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d %*d " -+ "%*d %*d %*d %*d %ld", &pc) != 1){ -+ printk("os_process_pc - couldn't find pc in '%s'\n", buf); -+ } -+ return(pc); -+} -+ -+int os_process_parent(int pid) -+{ -+ char stat[sizeof("/proc/nnnnn/stat\0")]; -+ char data[256]; -+ int parent, n, fd; -+ -+ if(pid == -1) return(-1); -+ -+ snprintf(stat, sizeof(stat), "/proc/%d/stat", pid); -+ fd = os_open_file(stat, of_read(OPENFLAGS()), 0); -+ if(fd < 0){ -+ printk("Couldn't open '%s', errno = %d\n", stat, -fd); -+ return(-1); -+ } -+ -+ n = read(fd, data, sizeof(data)); -+ close(fd); -+ -+ if(n < 0){ -+ printk("Couldn't read '%s', errno = %d\n", stat); -+ return(-1); -+ } -+ -+ parent = -1; -+ /* XXX This will break if there is a space in the command */ -+ n = sscanf(data, "%*d %*s %*c %d", &parent); -+ if(n != 1) printk("Failed to scan '%s'\n", data); -+ -+ return(parent); -+} -+ -+void os_stop_process(int pid) -+{ -+ kill(pid, SIGSTOP); -+} -+ -+void os_kill_process(int pid, int reap_child) -+{ -+ kill(pid, SIGKILL); -+ if(reap_child) -+ waitpid(pid, NULL, 0); -+ -+} -+ -+void os_usr1_process(int pid) -+{ -+ kill(pid, SIGUSR1); -+} -+ -+int os_getpid(void) -+{ -+ return(getpid()); -+} -+ -+int os_map_memory(void *virt, int fd, unsigned long off, unsigned long len, -+ int r, int w, int x) -+{ -+ void *loc; -+ int prot; -+ -+ prot = (r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | -+ (x ? PROT_EXEC : 0); -+ -+ loc = mmap((void *) virt, len, prot, MAP_SHARED | MAP_FIXED, -+ fd, off); -+ if(loc == MAP_FAILED) -+ return(-errno); -+ return(0); -+} -+ -+int os_protect_memory(void *addr, unsigned long len, int r, int w, int x) -+{ -+ int prot = ((r ? PROT_READ : 0) | (w ? PROT_WRITE : 0) | -+ (x ? PROT_EXEC : 0)); -+ -+ if(mprotect(addr, len, prot) < 0) -+ return(-errno); -+ return(0); -+} -+ -+int os_unmap_memory(void *addr, int len) -+{ -+ int err; -+ -+ err = munmap(addr, len); -+ if(err < 0) return(-errno); -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/os-Linux/tty.c um/arch/um/os-Linux/tty.c ---- orig/arch/um/os-Linux/tty.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/os-Linux/tty.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,61 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdlib.h> -+#include <errno.h> -+#include "os.h" -+#include "user.h" -+#include "kern_util.h" -+ -+struct grantpt_info { -+ int fd; -+ int res; -+ int err; -+}; -+ -+static void grantpt_cb(void *arg) -+{ -+ struct grantpt_info *info = arg; -+ -+ info->res = grantpt(info->fd); -+ info->err = errno; -+} -+ -+int get_pty(void) -+{ -+ struct grantpt_info info; -+ int fd; -+ -+ if((fd = os_open_file("/dev/ptmx", of_rdwr(OPENFLAGS()), 0)) < 0){ -+ printk("get_pty : Couldn't open /dev/ptmx - errno = %d\n", -+ errno); -+ return(-1); -+ } -+ -+ info.fd = fd; -+ initial_thread_cb(grantpt_cb, &info); -+ -+ if(info.res < 0){ -+ printk("get_pty : Couldn't grant pty - errno = %d\n", -+ info.err); -+ return(-1); -+ } -+ if(unlockpt(fd) < 0){ -+ printk("get_pty : Couldn't unlock pty - errno = %d\n", errno); -+ return(-1); -+ } -+ return(fd); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/bugs.c um/arch/um/sys-i386/bugs.c ---- orig/arch/um/sys-i386/bugs.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/bugs.c 2003-05-29 13:46:50.000000000 -0400 -@@ -0,0 +1,177 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <unistd.h> -+#include <fcntl.h> -+#include <errno.h> -+#include <string.h> -+#include <sys/signal.h> -+#include <asm/ldt.h> -+#include "kern_util.h" -+#include "user.h" -+#include "sysdep/ptrace.h" -+#include "task.h" -+ -+#define MAXTOKEN 64 -+ -+/* Set during early boot */ -+int cpu_has_cmov = 1; -+int cpu_has_xmm = 0; -+ -+static char token(int fd, char *buf, int len, char stop) -+{ -+ int n; -+ char *ptr, *end, c; -+ -+ ptr = buf; -+ end = &buf[len]; -+ do { -+ n = read(fd, ptr, sizeof(*ptr)); -+ c = *ptr++; -+ if(n == 0) return(0); -+ else if(n != sizeof(*ptr)){ -+ printk("Reading /proc/cpuinfo failed, " -+ "errno = %d\n", errno); -+ return(-errno); -+ } -+ } while((c != '\n') && (c != stop) && (ptr < end)); -+ -+ if(ptr == end){ -+ printk("Failed to find '%c' in /proc/cpuinfo\n", stop); -+ return(-1); -+ } -+ *(ptr - 1) = '\0'; -+ return(c); -+} -+ -+static int check_cpu_feature(char *feature, int *have_it) -+{ -+ char buf[MAXTOKEN], c; -+ int fd, len = sizeof(buf)/sizeof(buf[0]), n; -+ -+ printk("Checking for host processor %s support...", feature); -+ fd = open("/proc/cpuinfo", O_RDONLY); -+ if(fd < 0){ -+ printk("Couldn't open /proc/cpuinfo, errno = %d\n", errno); -+ return(0); -+ } -+ -+ *have_it = 0; -+ buf[len - 1] = '\0'; -+ while(1){ -+ c = token(fd, buf, len - 1, ':'); -+ if(c <= 0) goto out; -+ else if(c != ':'){ -+ printk("Failed to find ':' in /proc/cpuinfo\n"); -+ goto out; -+ } -+ -+ if(!strncmp(buf, "flags", strlen("flags"))) break; -+ -+ do { -+ n = read(fd, &c, sizeof(c)); -+ if(n != sizeof(c)){ -+ printk("Failed to find newline in " -+ "/proc/cpuinfo, n = %d, errno = %d\n", -+ n, errno); -+ goto out; -+ } -+ } while(c != '\n'); -+ } -+ -+ c = token(fd, buf, len - 1, ' '); -+ if(c < 0) goto out; -+ else if(c != ' '){ -+ printk("Failed to find ':' in /proc/cpuinfo\n"); -+ goto out; -+ } -+ -+ while(1){ -+ c = token(fd, buf, len - 1, ' '); -+ if(c < 0) goto out; -+ else if(c == '\n') break; -+ -+ if(!strcmp(buf, feature)){ -+ *have_it = 1; -+ goto out; -+ } -+ } -+ out: -+ if(*have_it == 0) printk("No\n"); -+ else if(*have_it == 1) printk("Yes\n"); -+ close(fd); -+ return(1); -+} -+ -+static void disable_lcall(void) -+{ -+ struct modify_ldt_ldt_s ldt; -+ int err; -+ -+ bzero(&ldt, sizeof(ldt)); -+ ldt.entry_number = 7; -+ ldt.base_addr = 0; -+ ldt.limit = 0; -+ err = modify_ldt(1, &ldt, sizeof(ldt)); -+ if(err) -+ printk("Failed to disable lcall7 - errno = %d\n", errno); -+} -+ -+void arch_init_thread(void) -+{ -+ disable_lcall(); -+} -+ -+void arch_check_bugs(void) -+{ -+ int have_it; -+ -+ if(access("/proc/cpuinfo", R_OK)){ -+ printk("/proc/cpuinfo not available - skipping CPU capability " -+ "checks\n"); -+ return; -+ } -+ if(check_cpu_feature("cmov", &have_it)) cpu_has_cmov = have_it; -+ if(check_cpu_feature("xmm", &have_it)) cpu_has_xmm = have_it; -+} -+ -+int arch_handle_signal(int sig, union uml_pt_regs *regs) -+{ -+ unsigned long ip; -+ -+ /* This is testing for a cmov (0x0f 0x4x) instruction causing a -+ * SIGILL in init. -+ */ -+ if((sig != SIGILL) || (TASK_PID(get_current()) != 1)) return(0); -+ -+ ip = UPT_IP(regs); -+ if((*((char *) ip) != 0x0f) || ((*((char *) (ip + 1)) & 0xf0) != 0x40)) -+ return(0); -+ -+ if(cpu_has_cmov == 0) -+ panic("SIGILL caused by cmov, which this processor doesn't " -+ "implement, boot a filesystem compiled for older " -+ "processors"); -+ else if(cpu_has_cmov == 1) -+ panic("SIGILL caused by cmov, which this processor claims to " -+ "implement"); -+ else if(cpu_has_cmov == -1) -+ panic("SIGILL caused by cmov, couldn't tell if this processor " -+ "implements it, boot a filesystem compiled for older " -+ "processors"); -+ else panic("Bad value for cpu_has_cmov (%d)", cpu_has_cmov); -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/checksum.S um/arch/um/sys-i386/checksum.S ---- orig/arch/um/sys-i386/checksum.S 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/checksum.S 2002-10-31 20:17:50.000000000 -0500 -@@ -0,0 +1,460 @@ -+/* -+ * INET An implementation of the TCP/IP protocol suite for the LINUX -+ * operating system. INET is implemented using the BSD Socket -+ * interface as the means of communication with the user level. -+ * -+ * IP/TCP/UDP checksumming routines -+ * -+ * Authors: Jorge Cwik, <jorge@laser.satlink.net> -+ * Arnt Gulbrandsen, <agulbra@nvg.unit.no> -+ * Tom May, <ftom@netcom.com> -+ * Pentium Pro/II routines: -+ * Alexander Kjeldaas <astor@guardian.no> -+ * Finn Arne Gangstad <finnag@guardian.no> -+ * Lots of code moved from tcp.c and ip.c; see those files -+ * for more names. -+ * -+ * Changes: Ingo Molnar, converted csum_partial_copy() to 2.1 exception -+ * handling. -+ * Andi Kleen, add zeroing on error -+ * converted to pure assembler -+ * -+ * 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/config.h> -+#include <asm/errno.h> -+ -+/* -+ * computes a partial checksum, e.g. for TCP/UDP fragments -+ */ -+ -+/* -+unsigned int csum_partial(const unsigned char * buff, int len, unsigned int sum) -+ */ -+ -+.text -+.align 4 -+.globl arch_csum_partial -+ -+#ifndef CONFIG_X86_USE_PPRO_CHECKSUM -+ -+ /* -+ * Experiments with Ethernet and SLIP connections show that buff -+ * is aligned on either a 2-byte or 4-byte boundary. We get at -+ * least a twofold speedup on 486 and Pentium if it is 4-byte aligned. -+ * Fortunately, it is easy to convert 2-byte alignment to 4-byte -+ * alignment for the unrolled loop. -+ */ -+arch_csum_partial: -+ pushl %esi -+ pushl %ebx -+ movl 20(%esp),%eax # Function arg: unsigned int sum -+ movl 16(%esp),%ecx # Function arg: int len -+ movl 12(%esp),%esi # Function arg: unsigned char *buff -+ testl $2, %esi # Check alignment. -+ jz 2f # Jump if alignment is ok. -+ subl $2, %ecx # Alignment uses up two bytes. -+ jae 1f # Jump if we had at least two bytes. -+ addl $2, %ecx # ecx was < 2. Deal with it. -+ jmp 4f -+1: movw (%esi), %bx -+ addl $2, %esi -+ addw %bx, %ax -+ adcl $0, %eax -+2: -+ movl %ecx, %edx -+ shrl $5, %ecx -+ jz 2f -+ testl %esi, %esi -+1: movl (%esi), %ebx -+ adcl %ebx, %eax -+ movl 4(%esi), %ebx -+ adcl %ebx, %eax -+ movl 8(%esi), %ebx -+ adcl %ebx, %eax -+ movl 12(%esi), %ebx -+ adcl %ebx, %eax -+ movl 16(%esi), %ebx -+ adcl %ebx, %eax -+ movl 20(%esi), %ebx -+ adcl %ebx, %eax -+ movl 24(%esi), %ebx -+ adcl %ebx, %eax -+ movl 28(%esi), %ebx -+ adcl %ebx, %eax -+ lea 32(%esi), %esi -+ dec %ecx -+ jne 1b -+ adcl $0, %eax -+2: movl %edx, %ecx -+ andl $0x1c, %edx -+ je 4f -+ shrl $2, %edx # This clears CF -+3: adcl (%esi), %eax -+ lea 4(%esi), %esi -+ dec %edx -+ jne 3b -+ adcl $0, %eax -+4: andl $3, %ecx -+ jz 7f -+ cmpl $2, %ecx -+ jb 5f -+ movw (%esi),%cx -+ leal 2(%esi),%esi -+ je 6f -+ shll $16,%ecx -+5: movb (%esi),%cl -+6: addl %ecx,%eax -+ adcl $0, %eax -+7: -+ popl %ebx -+ popl %esi -+ ret -+ -+#else -+ -+/* Version for PentiumII/PPro */ -+ -+arch_csum_partial: -+ pushl %esi -+ pushl %ebx -+ movl 20(%esp),%eax # Function arg: unsigned int sum -+ movl 16(%esp),%ecx # Function arg: int len -+ movl 12(%esp),%esi # Function arg: const unsigned char *buf -+ -+ testl $2, %esi -+ jnz 30f -+10: -+ movl %ecx, %edx -+ movl %ecx, %ebx -+ andl $0x7c, %ebx -+ shrl $7, %ecx -+ addl %ebx,%esi -+ shrl $2, %ebx -+ negl %ebx -+ lea 45f(%ebx,%ebx,2), %ebx -+ testl %esi, %esi -+ jmp *%ebx -+ -+ # Handle 2-byte-aligned regions -+20: addw (%esi), %ax -+ lea 2(%esi), %esi -+ adcl $0, %eax -+ jmp 10b -+ -+30: subl $2, %ecx -+ ja 20b -+ je 32f -+ movzbl (%esi),%ebx # csumming 1 byte, 2-aligned -+ addl %ebx, %eax -+ adcl $0, %eax -+ jmp 80f -+32: -+ addw (%esi), %ax # csumming 2 bytes, 2-aligned -+ adcl $0, %eax -+ jmp 80f -+ -+40: -+ addl -128(%esi), %eax -+ adcl -124(%esi), %eax -+ adcl -120(%esi), %eax -+ adcl -116(%esi), %eax -+ adcl -112(%esi), %eax -+ adcl -108(%esi), %eax -+ adcl -104(%esi), %eax -+ adcl -100(%esi), %eax -+ adcl -96(%esi), %eax -+ adcl -92(%esi), %eax -+ adcl -88(%esi), %eax -+ adcl -84(%esi), %eax -+ adcl -80(%esi), %eax -+ adcl -76(%esi), %eax -+ adcl -72(%esi), %eax -+ adcl -68(%esi), %eax -+ adcl -64(%esi), %eax -+ adcl -60(%esi), %eax -+ adcl -56(%esi), %eax -+ adcl -52(%esi), %eax -+ adcl -48(%esi), %eax -+ adcl -44(%esi), %eax -+ adcl -40(%esi), %eax -+ adcl -36(%esi), %eax -+ adcl -32(%esi), %eax -+ adcl -28(%esi), %eax -+ adcl -24(%esi), %eax -+ adcl -20(%esi), %eax -+ adcl -16(%esi), %eax -+ adcl -12(%esi), %eax -+ adcl -8(%esi), %eax -+ adcl -4(%esi), %eax -+45: -+ lea 128(%esi), %esi -+ adcl $0, %eax -+ dec %ecx -+ jge 40b -+ movl %edx, %ecx -+50: andl $3, %ecx -+ jz 80f -+ -+ # Handle the last 1-3 bytes without jumping -+ notl %ecx # 1->2, 2->1, 3->0, higher bits are masked -+ movl $0xffffff,%ebx # by the shll and shrl instructions -+ shll $3,%ecx -+ shrl %cl,%ebx -+ andl -128(%esi),%ebx # esi is 4-aligned so should be ok -+ addl %ebx,%eax -+ adcl $0,%eax -+80: -+ popl %ebx -+ popl %esi -+ ret -+ -+#endif -+ -+/* -+unsigned int csum_partial_copy_generic (const char *src, char *dst, -+ int len, int sum, int *src_err_ptr, int *dst_err_ptr) -+ */ -+ -+/* -+ * Copy from ds while checksumming, otherwise like csum_partial -+ * -+ * The macros SRC and DST specify the type of access for the instruction. -+ * thus we can call a custom exception handler for all access types. -+ * -+ * FIXME: could someone double-check whether I haven't mixed up some SRC and -+ * DST definitions? It's damn hard to trigger all cases. I hope I got -+ * them all but there's no guarantee. -+ */ -+ -+#define SRC(y...) \ -+ 9999: y; \ -+ .section __ex_table, "a"; \ -+ .long 9999b, 6001f ; \ -+ .previous -+ -+#define DST(y...) \ -+ 9999: y; \ -+ .section __ex_table, "a"; \ -+ .long 9999b, 6002f ; \ -+ .previous -+ -+.align 4 -+.globl csum_partial_copy_generic_i386 -+ -+#ifndef CONFIG_X86_USE_PPRO_CHECKSUM -+ -+#define ARGBASE 16 -+#define FP 12 -+ -+csum_partial_copy_generic_i386: -+ subl $4,%esp -+ pushl %edi -+ pushl %esi -+ pushl %ebx -+ movl ARGBASE+16(%esp),%eax # sum -+ movl ARGBASE+12(%esp),%ecx # len -+ movl ARGBASE+4(%esp),%esi # src -+ movl ARGBASE+8(%esp),%edi # dst -+ -+ testl $2, %edi # Check alignment. -+ jz 2f # Jump if alignment is ok. -+ subl $2, %ecx # Alignment uses up two bytes. -+ jae 1f # Jump if we had at least two bytes. -+ addl $2, %ecx # ecx was < 2. Deal with it. -+ jmp 4f -+SRC(1: movw (%esi), %bx ) -+ addl $2, %esi -+DST( movw %bx, (%edi) ) -+ addl $2, %edi -+ addw %bx, %ax -+ adcl $0, %eax -+2: -+ movl %ecx, FP(%esp) -+ shrl $5, %ecx -+ jz 2f -+ testl %esi, %esi -+SRC(1: movl (%esi), %ebx ) -+SRC( movl 4(%esi), %edx ) -+ adcl %ebx, %eax -+DST( movl %ebx, (%edi) ) -+ adcl %edx, %eax -+DST( movl %edx, 4(%edi) ) -+ -+SRC( movl 8(%esi), %ebx ) -+SRC( movl 12(%esi), %edx ) -+ adcl %ebx, %eax -+DST( movl %ebx, 8(%edi) ) -+ adcl %edx, %eax -+DST( movl %edx, 12(%edi) ) -+ -+SRC( movl 16(%esi), %ebx ) -+SRC( movl 20(%esi), %edx ) -+ adcl %ebx, %eax -+DST( movl %ebx, 16(%edi) ) -+ adcl %edx, %eax -+DST( movl %edx, 20(%edi) ) -+ -+SRC( movl 24(%esi), %ebx ) -+SRC( movl 28(%esi), %edx ) -+ adcl %ebx, %eax -+DST( movl %ebx, 24(%edi) ) -+ adcl %edx, %eax -+DST( movl %edx, 28(%edi) ) -+ -+ lea 32(%esi), %esi -+ lea 32(%edi), %edi -+ dec %ecx -+ jne 1b -+ adcl $0, %eax -+2: movl FP(%esp), %edx -+ movl %edx, %ecx -+ andl $0x1c, %edx -+ je 4f -+ shrl $2, %edx # This clears CF -+SRC(3: movl (%esi), %ebx ) -+ adcl %ebx, %eax -+DST( movl %ebx, (%edi) ) -+ lea 4(%esi), %esi -+ lea 4(%edi), %edi -+ dec %edx -+ jne 3b -+ adcl $0, %eax -+4: andl $3, %ecx -+ jz 7f -+ cmpl $2, %ecx -+ jb 5f -+SRC( movw (%esi), %cx ) -+ leal 2(%esi), %esi -+DST( movw %cx, (%edi) ) -+ leal 2(%edi), %edi -+ je 6f -+ shll $16,%ecx -+SRC(5: movb (%esi), %cl ) -+DST( movb %cl, (%edi) ) -+6: addl %ecx, %eax -+ adcl $0, %eax -+7: -+5000: -+ -+# Exception handler: -+.section .fixup, "ax" -+ -+6001: -+ movl ARGBASE+20(%esp), %ebx # src_err_ptr -+ movl $-EFAULT, (%ebx) -+ -+ # zero the complete destination - computing the rest -+ # is too much work -+ movl ARGBASE+8(%esp), %edi # dst -+ movl ARGBASE+12(%esp), %ecx # len -+ xorl %eax,%eax -+ rep ; stosb -+ -+ jmp 5000b -+ -+6002: -+ movl ARGBASE+24(%esp), %ebx # dst_err_ptr -+ movl $-EFAULT,(%ebx) -+ jmp 5000b -+ -+.previous -+ -+ popl %ebx -+ popl %esi -+ popl %edi -+ popl %ecx # equivalent to addl $4,%esp -+ ret -+ -+#else -+ -+/* Version for PentiumII/PPro */ -+ -+#define ROUND1(x) \ -+ SRC(movl x(%esi), %ebx ) ; \ -+ addl %ebx, %eax ; \ -+ DST(movl %ebx, x(%edi) ) ; -+ -+#define ROUND(x) \ -+ SRC(movl x(%esi), %ebx ) ; \ -+ adcl %ebx, %eax ; \ -+ DST(movl %ebx, x(%edi) ) ; -+ -+#define ARGBASE 12 -+ -+csum_partial_copy_generic_i386: -+ pushl %ebx -+ pushl %edi -+ pushl %esi -+ movl ARGBASE+4(%esp),%esi #src -+ movl ARGBASE+8(%esp),%edi #dst -+ movl ARGBASE+12(%esp),%ecx #len -+ movl ARGBASE+16(%esp),%eax #sum -+# movl %ecx, %edx -+ movl %ecx, %ebx -+ movl %esi, %edx -+ shrl $6, %ecx -+ andl $0x3c, %ebx -+ negl %ebx -+ subl %ebx, %esi -+ subl %ebx, %edi -+ lea -1(%esi),%edx -+ andl $-32,%edx -+ lea 3f(%ebx,%ebx), %ebx -+ testl %esi, %esi -+ jmp *%ebx -+1: addl $64,%esi -+ addl $64,%edi -+ SRC(movb -32(%edx),%bl) ; SRC(movb (%edx),%bl) -+ ROUND1(-64) ROUND(-60) ROUND(-56) ROUND(-52) -+ ROUND (-48) ROUND(-44) ROUND(-40) ROUND(-36) -+ ROUND (-32) ROUND(-28) ROUND(-24) ROUND(-20) -+ ROUND (-16) ROUND(-12) ROUND(-8) ROUND(-4) -+3: adcl $0,%eax -+ addl $64, %edx -+ dec %ecx -+ jge 1b -+4: movl ARGBASE+12(%esp),%edx #len -+ andl $3, %edx -+ jz 7f -+ cmpl $2, %edx -+ jb 5f -+SRC( movw (%esi), %dx ) -+ leal 2(%esi), %esi -+DST( movw %dx, (%edi) ) -+ leal 2(%edi), %edi -+ je 6f -+ shll $16,%edx -+5: -+SRC( movb (%esi), %dl ) -+DST( movb %dl, (%edi) ) -+6: addl %edx, %eax -+ adcl $0, %eax -+7: -+.section .fixup, "ax" -+6001: movl ARGBASE+20(%esp), %ebx # src_err_ptr -+ movl $-EFAULT, (%ebx) -+ # zero the complete destination (computing the rest is too much work) -+ movl ARGBASE+8(%esp),%edi # dst -+ movl ARGBASE+12(%esp),%ecx # len -+ xorl %eax,%eax -+ rep; stosb -+ jmp 7b -+6002: movl ARGBASE+24(%esp), %ebx # dst_err_ptr -+ movl $-EFAULT, (%ebx) -+ jmp 7b -+.previous -+ -+ popl %esi -+ popl %edi -+ popl %ebx -+ ret -+ -+#undef ROUND -+#undef ROUND1 -+ -+#endif -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/fault.c um/arch/um/sys-i386/fault.c ---- orig/arch/um/sys-i386/fault.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/fault.c 2002-10-27 16:49:35.000000000 -0500 -@@ -0,0 +1,34 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <signal.h> -+#include "sysdep/ptrace.h" -+#include "sysdep/sigcontext.h" -+ -+extern unsigned long search_exception_table(unsigned long addr); -+ -+int arch_fixup(unsigned long address, void *sc_ptr) -+{ -+ struct sigcontext *sc = sc_ptr; -+ unsigned long fixup; -+ -+ fixup = search_exception_table(address); -+ if(fixup != 0){ -+ sc->eip = fixup; -+ return(1); -+ } -+ return(0); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ksyms.c um/arch/um/sys-i386/ksyms.c ---- orig/arch/um/sys-i386/ksyms.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/ksyms.c 2002-10-29 21:01:45.000000000 -0500 -@@ -0,0 +1,17 @@ -+#include "linux/module.h" -+#include "linux/in6.h" -+#include "linux/rwsem.h" -+#include "asm/byteorder.h" -+#include "asm/semaphore.h" -+#include "asm/uaccess.h" -+#include "asm/checksum.h" -+#include "asm/errno.h" -+ -+EXPORT_SYMBOL(__down_failed); -+EXPORT_SYMBOL(__down_failed_interruptible); -+EXPORT_SYMBOL(__down_failed_trylock); -+EXPORT_SYMBOL(__up_wakeup); -+ -+/* Networking helper routines. */ -+EXPORT_SYMBOL(csum_partial_copy_from); -+EXPORT_SYMBOL(csum_partial_copy_to); -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ldt.c um/arch/um/sys-i386/ldt.c ---- orig/arch/um/sys-i386/ldt.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/ldt.c 2002-11-13 12:43:04.000000000 -0500 -@@ -0,0 +1,92 @@ -+/* -+ * Copyright (C) 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/config.h" -+#include "linux/slab.h" -+#include "asm/uaccess.h" -+#include "asm/ptrace.h" -+#include "choose-mode.h" -+#include "kern.h" -+ -+#ifdef CONFIG_MODE_TT -+extern int modify_ldt(int func, void *ptr, unsigned long bytecount); -+ -+int sys_modify_ldt_tt(int func, void *ptr, unsigned long bytecount) -+{ -+ if(verify_area(VERIFY_READ, ptr, bytecount)) return(-EFAULT); -+ return(modify_ldt(func, ptr, bytecount)); -+} -+#endif -+ -+#ifdef CONFIG_MODE_SKAS -+extern int userspace_pid; -+ -+int sys_modify_ldt_skas(int func, void *ptr, unsigned long bytecount) -+{ -+ struct ptrace_ldt ldt; -+ void *buf; -+ int res, n; -+ -+ buf = kmalloc(bytecount, GFP_KERNEL); -+ if(buf == NULL) -+ return(-ENOMEM); -+ -+ res = 0; -+ -+ switch(func){ -+ case 1: -+ case 0x11: -+ res = copy_from_user(buf, ptr, bytecount); -+ break; -+ } -+ -+ if(res != 0){ -+ res = -EFAULT; -+ goto out; -+ } -+ -+ ldt = ((struct ptrace_ldt) { .func = func, -+ .ptr = buf, -+ .bytecount = bytecount }); -+ res = ptrace(PTRACE_LDT, userspace_pid, 0, (unsigned long) &ldt); -+ if(res < 0) -+ goto out; -+ -+ switch(func){ -+ case 0: -+ case 2: -+ n = res; -+ res = copy_to_user(ptr, buf, n); -+ if(res != 0) -+ res = -EFAULT; -+ else -+ res = n; -+ break; -+ } -+ -+ out: -+ kfree(buf); -+ return(res); -+} -+#endif -+ -+int sys_modify_ldt(int func, void *ptr, unsigned long bytecount) -+{ -+ return(CHOOSE_MODE_PROC(sys_modify_ldt_tt, sys_modify_ldt_skas, func, -+ ptr, bytecount)); -+} -+ -+ -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/Makefile um/arch/um/sys-i386/Makefile ---- orig/arch/um/sys-i386/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/Makefile 2002-11-23 23:34:24.000000000 -0500 -@@ -0,0 +1,46 @@ -+# -+# Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+# Licensed under the GPL -+# -+ -+O_TARGET = built-in.o -+ -+obj-y = bugs.o checksum.o extable.o fault.o ksyms.o ldt.o ptrace.o \ -+ ptrace_user.o semaphore.o sigcontext.o syscalls.o sysrq.o -+export-objs = ksyms.o -+ -+USER_OBJS = bugs.o ptrace_user.o sigcontext.o fault.o -+ -+SYMLINKS = semaphore.c extable.c -+ -+semaphore.c-dir = kernel -+extable.c-dir = mm -+ -+include $(TOPDIR)/Rules.make -+ -+$(USER_OBJS) : %.o: %.c -+ $(CC) $(CFLAGS_$@) $(USER_CFLAGS) -c -o $@ $< -+ -+define make_link -+ -rm -f $1 -+ ln -sf $(TOPDIR)/arch/i386/$($1-dir)/$1 $1 -+endef -+ -+$(SYMLINKS): -+ $(call make_link,$@) -+ -+clean: -+ $(MAKE) -C util clean -+ rm -f $(SYMLINKS) -+ -+fastdep: -+ -+dep: -+ -+archmrproper: -+ -+archclean: -+ -+archdep: -+ -+modules: -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ptrace.c um/arch/um/sys-i386/ptrace.c ---- orig/arch/um/sys-i386/ptrace.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/ptrace.c 2002-10-27 16:49:35.000000000 -0500 -@@ -0,0 +1,365 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "linux/sched.h" -+#include "asm/elf.h" -+#include "asm/ptrace.h" -+#include "asm/uaccess.h" -+#include "ptrace_user.h" -+#include "sysdep/sigcontext.h" -+#include "sysdep/sc.h" -+ -+void arch_switch(void) -+{ -+ update_debugregs(current->thread.arch.debugregs_seq); -+} -+ -+int is_syscall(unsigned long addr) -+{ -+ unsigned short instr; -+ int n; -+ -+ n = copy_from_user(&instr, (void *) addr, sizeof(instr)); -+ if(n){ -+ printk("is_syscall : failed to read instruction from 0x%lu\n", -+ addr); -+ return(0); -+ } -+ return(instr == 0x80cd); -+} -+ -+/* determines which flags the user has access to. */ -+/* 1 = access 0 = no access */ -+#define FLAG_MASK 0x00044dd5 -+ -+int putreg(struct task_struct *child, int regno, unsigned long value) -+{ -+ regno >>= 2; -+ switch (regno) { -+ case FS: -+ if (value && (value & 3) != 3) -+ return -EIO; -+ PT_REGS_FS(&child->thread.regs) = value; -+ return 0; -+ case GS: -+ if (value && (value & 3) != 3) -+ return -EIO; -+ PT_REGS_GS(&child->thread.regs) = value; -+ return 0; -+ case DS: -+ case ES: -+ if (value && (value & 3) != 3) -+ return -EIO; -+ value &= 0xffff; -+ break; -+ case SS: -+ case CS: -+ if ((value & 3) != 3) -+ return -EIO; -+ value &= 0xffff; -+ break; -+ case EFL: -+ value &= FLAG_MASK; -+ value |= PT_REGS_EFLAGS(&child->thread.regs); -+ break; -+ } -+ PT_REGS_SET(&child->thread.regs, regno, value); -+ return 0; -+} -+ -+unsigned long getreg(struct task_struct *child, int regno) -+{ -+ unsigned long retval = ~0UL; -+ -+ regno >>= 2; -+ switch (regno) { -+ case FS: -+ case GS: -+ case DS: -+ case ES: -+ case SS: -+ case CS: -+ retval = 0xffff; -+ /* fall through */ -+ default: -+ retval &= PT_REG(&child->thread.regs, regno); -+ } -+ return retval; -+} -+ -+struct i387_fxsave_struct { -+ unsigned short cwd; -+ unsigned short swd; -+ unsigned short twd; -+ unsigned short fop; -+ long fip; -+ long fcs; -+ long foo; -+ long fos; -+ long mxcsr; -+ long reserved; -+ long st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */ -+ long xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */ -+ long padding[56]; -+}; -+ -+/* -+ * FPU tag word conversions. -+ */ -+ -+static inline unsigned short twd_i387_to_fxsr( unsigned short twd ) -+{ -+ unsigned int tmp; /* to avoid 16 bit prefixes in the code */ -+ -+ /* Transform each pair of bits into 01 (valid) or 00 (empty) */ -+ tmp = ~twd; -+ tmp = (tmp | (tmp>>1)) & 0x5555; /* 0V0V0V0V0V0V0V0V */ -+ /* and move the valid bits to the lower byte. */ -+ tmp = (tmp | (tmp >> 1)) & 0x3333; /* 00VV00VV00VV00VV */ -+ tmp = (tmp | (tmp >> 2)) & 0x0f0f; /* 0000VVVV0000VVVV */ -+ tmp = (tmp | (tmp >> 4)) & 0x00ff; /* 00000000VVVVVVVV */ -+ return tmp; -+} -+ -+static inline unsigned long twd_fxsr_to_i387( struct i387_fxsave_struct *fxsave ) -+{ -+ struct _fpxreg *st = NULL; -+ unsigned long twd = (unsigned long) fxsave->twd; -+ unsigned long tag; -+ unsigned long ret = 0xffff0000; -+ int i; -+ -+#define FPREG_ADDR(f, n) ((char *)&(f)->st_space + (n) * 16); -+ -+ for ( i = 0 ; i < 8 ; i++ ) { -+ if ( twd & 0x1 ) { -+ st = (struct _fpxreg *) FPREG_ADDR( fxsave, i ); -+ -+ switch ( st->exponent & 0x7fff ) { -+ case 0x7fff: -+ tag = 2; /* Special */ -+ break; -+ case 0x0000: -+ if ( !st->significand[0] && -+ !st->significand[1] && -+ !st->significand[2] && -+ !st->significand[3] ) { -+ tag = 1; /* Zero */ -+ } else { -+ tag = 2; /* Special */ -+ } -+ break; -+ default: -+ if ( st->significand[3] & 0x8000 ) { -+ tag = 0; /* Valid */ -+ } else { -+ tag = 2; /* Special */ -+ } -+ break; -+ } -+ } else { -+ tag = 3; /* Empty */ -+ } -+ ret |= (tag << (2 * i)); -+ twd = twd >> 1; -+ } -+ return ret; -+} -+ -+/* -+ * FXSR floating point environment conversions. -+ */ -+ -+#ifdef CONFIG_MODE_TT -+static inline int convert_fxsr_to_user_tt(struct _fpstate *buf, -+ struct pt_regs *regs) -+{ -+ struct i387_fxsave_struct *fxsave = SC_FXSR_ENV(PT_REGS_SC(regs)); -+ unsigned long env[7]; -+ struct _fpreg *to; -+ struct _fpxreg *from; -+ int i; -+ -+ env[0] = (unsigned long)fxsave->cwd | 0xffff0000; -+ env[1] = (unsigned long)fxsave->swd | 0xffff0000; -+ env[2] = twd_fxsr_to_i387(fxsave); -+ env[3] = fxsave->fip; -+ env[4] = fxsave->fcs | ((unsigned long)fxsave->fop << 16); -+ env[5] = fxsave->foo; -+ env[6] = fxsave->fos; -+ -+ if ( __copy_to_user( buf, env, 7 * sizeof(unsigned long) ) ) -+ return 1; -+ -+ to = &buf->_st[0]; -+ from = (struct _fpxreg *) &fxsave->st_space[0]; -+ for ( i = 0 ; i < 8 ; i++, to++, from++ ) { -+ if ( __copy_to_user( to, from, sizeof(*to) ) ) -+ return 1; -+ } -+ return 0; -+} -+#endif -+ -+static inline int convert_fxsr_to_user(struct _fpstate *buf, -+ struct pt_regs *regs) -+{ -+ return(CHOOSE_MODE(convert_fxsr_to_user_tt(buf, regs), 0)); -+} -+ -+#ifdef CONFIG_MODE_TT -+static inline int convert_fxsr_from_user_tt(struct pt_regs *regs, -+ struct _fpstate *buf) -+{ -+ struct i387_fxsave_struct *fxsave = SC_FXSR_ENV(PT_REGS_SC(regs)); -+ unsigned long env[7]; -+ struct _fpxreg *to; -+ struct _fpreg *from; -+ int i; -+ -+ if ( __copy_from_user( env, buf, 7 * sizeof(long) ) ) -+ return 1; -+ -+ fxsave->cwd = (unsigned short)(env[0] & 0xffff); -+ fxsave->swd = (unsigned short)(env[1] & 0xffff); -+ fxsave->twd = twd_i387_to_fxsr((unsigned short)(env[2] & 0xffff)); -+ fxsave->fip = env[3]; -+ fxsave->fop = (unsigned short)((env[4] & 0xffff0000) >> 16); -+ fxsave->fcs = (env[4] & 0xffff); -+ fxsave->foo = env[5]; -+ fxsave->fos = env[6]; -+ -+ to = (struct _fpxreg *) &fxsave->st_space[0]; -+ from = &buf->_st[0]; -+ for ( i = 0 ; i < 8 ; i++, to++, from++ ) { -+ if ( __copy_from_user( to, from, sizeof(*from) ) ) -+ return 1; -+ } -+ return 0; -+} -+#endif -+ -+static inline int convert_fxsr_from_user(struct pt_regs *regs, -+ struct _fpstate *buf) -+{ -+ return(CHOOSE_MODE(convert_fxsr_from_user_tt(regs, buf), 0)); -+} -+ -+int get_fpregs(unsigned long buf, struct task_struct *child) -+{ -+ int err; -+ -+ err = convert_fxsr_to_user((struct _fpstate *) buf, -+ &child->thread.regs); -+ if(err) return(-EFAULT); -+ else return(0); -+} -+ -+int set_fpregs(unsigned long buf, struct task_struct *child) -+{ -+ int err; -+ -+ err = convert_fxsr_from_user(&child->thread.regs, -+ (struct _fpstate *) buf); -+ if(err) return(-EFAULT); -+ else return(0); -+} -+ -+#ifdef CONFIG_MODE_TT -+int get_fpxregs_tt(unsigned long buf, struct task_struct *tsk) -+{ -+ struct pt_regs *regs = &tsk->thread.regs; -+ struct i387_fxsave_struct *fxsave = SC_FXSR_ENV(PT_REGS_SC(regs)); -+ int err; -+ -+ err = __copy_to_user((void *) buf, fxsave, -+ sizeof(struct user_fxsr_struct)); -+ if(err) return -EFAULT; -+ else return 0; -+} -+#endif -+ -+int get_fpxregs(unsigned long buf, struct task_struct *tsk) -+{ -+ return(CHOOSE_MODE(get_fpxregs_tt(buf, tsk), 0)); -+} -+ -+#ifdef CONFIG_MODE_TT -+int set_fpxregs_tt(unsigned long buf, struct task_struct *tsk) -+{ -+ struct pt_regs *regs = &tsk->thread.regs; -+ struct i387_fxsave_struct *fxsave = SC_FXSR_ENV(PT_REGS_SC(regs)); -+ int err; -+ -+ err = __copy_from_user(fxsave, (void *) buf, -+ sizeof(struct user_fxsr_struct) ); -+ if(err) return -EFAULT; -+ else return 0; -+} -+#endif -+ -+int set_fpxregs(unsigned long buf, struct task_struct *tsk) -+{ -+ return(CHOOSE_MODE(set_fpxregs_tt(buf, tsk), 0)); -+} -+ -+#ifdef notdef -+int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu) -+{ -+ fpu->cwd = (((SC_FP_CW(PT_REGS_SC(regs)) & 0xffff) << 16) | -+ (SC_FP_SW(PT_REGS_SC(regs)) & 0xffff)); -+ fpu->swd = SC_FP_CSSEL(PT_REGS_SC(regs)) & 0xffff; -+ fpu->twd = SC_FP_IPOFF(PT_REGS_SC(regs)); -+ fpu->fip = SC_FP_CSSEL(PT_REGS_SC(regs)) & 0xffff; -+ fpu->fcs = SC_FP_DATAOFF(PT_REGS_SC(regs)); -+ fpu->foo = SC_FP_DATASEL(PT_REGS_SC(regs)); -+ fpu->fos = 0; -+ memcpy(fpu->st_space, (void *) SC_FP_ST(PT_REGS_SC(regs)), -+ sizeof(fpu->st_space)); -+ return(1); -+} -+#endif -+ -+#ifdef CONFIG_MODE_TT -+static inline void copy_fpu_fxsave_tt(struct pt_regs *regs, -+ struct user_i387_struct *buf) -+{ -+ struct i387_fxsave_struct *fpu = SC_FXSR_ENV(PT_REGS_SC(regs)); -+ unsigned short *to; -+ unsigned short *from; -+ int i; -+ -+ memcpy( buf, fpu, 7 * sizeof(long) ); -+ -+ to = (unsigned short *) &buf->st_space[0]; -+ from = (unsigned short *) &fpu->st_space[0]; -+ for ( i = 0 ; i < 8 ; i++, to += 5, from += 8 ) { -+ memcpy( to, from, 5 * sizeof(unsigned short) ); -+ } -+} -+#endif -+ -+static inline void copy_fpu_fxsave(struct pt_regs *regs, -+ struct user_i387_struct *buf) -+{ -+ (void) CHOOSE_MODE(copy_fpu_fxsave_tt(regs, buf), 0); -+} -+ -+int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu ) -+{ -+ copy_fpu_fxsave(regs, (struct user_i387_struct *) fpu); -+ return(1); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/ptrace_user.c um/arch/um/sys-i386/ptrace_user.c ---- orig/arch/um/sys-i386/ptrace_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/ptrace_user.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,117 @@ -+/* -+ * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stdio.h> -+#include <errno.h> -+#include <unistd.h> -+#include <linux/stddef.h> -+#include <sys/ptrace.h> -+#include <asm/ptrace.h> -+#include <asm/user.h> -+#include "kern_util.h" -+#include "sysdep/thread.h" -+#include "user.h" -+#include "os.h" -+ -+int ptrace_getregs(long pid, unsigned long *regs_out) -+{ -+ return(ptrace(PTRACE_GETREGS, pid, 0, regs_out)); -+} -+ -+int ptrace_setregs(long pid, unsigned long *regs) -+{ -+ return(ptrace(PTRACE_SETREGS, pid, 0, regs)); -+} -+ -+int ptrace_getfpregs(long pid, unsigned long *regs) -+{ -+ return(ptrace(PTRACE_GETFPREGS, pid, 0, regs)); -+} -+ -+static void write_debugregs(int pid, unsigned long *regs) -+{ -+ struct user *dummy; -+ int nregs, i; -+ -+ dummy = NULL; -+ nregs = sizeof(dummy->u_debugreg)/sizeof(dummy->u_debugreg[0]); -+ for(i = 0; i < nregs; i++){ -+ if((i == 4) || (i == 5)) continue; -+ if(ptrace(PTRACE_POKEUSR, pid, &dummy->u_debugreg[i], -+ regs[i]) < 0) -+ printk("write_debugregs - ptrace failed, " -+ "errno = %d\n", errno); -+ } -+} -+ -+static void read_debugregs(int pid, unsigned long *regs) -+{ -+ struct user *dummy; -+ int nregs, i; -+ -+ dummy = NULL; -+ nregs = sizeof(dummy->u_debugreg)/sizeof(dummy->u_debugreg[0]); -+ for(i = 0; i < nregs; i++){ -+ regs[i] = ptrace(PTRACE_PEEKUSR, pid, -+ &dummy->u_debugreg[i], 0); -+ } -+} -+ -+/* Accessed only by the tracing thread */ -+static unsigned long kernel_debugregs[8] = { [ 0 ... 7 ] = 0 }; -+static int debugregs_seq = 0; -+ -+void arch_enter_kernel(void *task, int pid) -+{ -+ read_debugregs(pid, TASK_DEBUGREGS(task)); -+ write_debugregs(pid, kernel_debugregs); -+} -+ -+void arch_leave_kernel(void *task, int pid) -+{ -+ read_debugregs(pid, kernel_debugregs); -+ write_debugregs(pid, TASK_DEBUGREGS(task)); -+} -+ -+void ptrace_pokeuser(unsigned long addr, unsigned long data) -+{ -+ if((addr < offsetof(struct user, u_debugreg[0])) || -+ (addr > offsetof(struct user, u_debugreg[7]))) -+ return; -+ addr -= offsetof(struct user, u_debugreg[0]); -+ addr = addr >> 2; -+ if(kernel_debugregs[addr] == data) return; -+ -+ kernel_debugregs[addr] = data; -+ debugregs_seq++; -+} -+ -+static void update_debugregs_cb(void *arg) -+{ -+ int pid = *((int *) arg); -+ -+ write_debugregs(pid, kernel_debugregs); -+} -+ -+void update_debugregs(int seq) -+{ -+ int me; -+ -+ if(seq == debugregs_seq) return; -+ -+ me = os_getpid(); -+ initial_thread_cb(update_debugregs_cb, &me); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/sigcontext.c um/arch/um/sys-i386/sigcontext.c ---- orig/arch/um/sys-i386/sigcontext.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/sigcontext.c 2002-12-02 23:20:13.000000000 -0500 -@@ -0,0 +1,80 @@ -+/* -+ * Copyright (C) 2000, 2001, 2002 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include <stddef.h> -+#include <string.h> -+#include <asm/ptrace.h> -+#include <asm/sigcontext.h> -+#include "sysdep/ptrace.h" -+#include "kern_util.h" -+#include "frame_user.h" -+ -+int sc_size(void *data) -+{ -+ struct arch_frame_data *arch = data; -+ -+ return(sizeof(struct sigcontext) + arch->fpstate_size); -+} -+ -+void sc_to_sc(void *to_ptr, void *from_ptr) -+{ -+ struct sigcontext *to = to_ptr, *from = from_ptr; -+ int size = sizeof(*to) + signal_frame_sc.common.arch.fpstate_size; -+ -+ memcpy(to, from, size); -+ if(from->fpstate != NULL) to->fpstate = (struct _fpstate *) (to + 1); -+} -+ -+unsigned long *sc_sigmask(void *sc_ptr) -+{ -+ struct sigcontext *sc = sc_ptr; -+ -+ return(&sc->oldmask); -+} -+ -+int sc_get_fpregs(unsigned long buf, void *sc_ptr) -+{ -+ struct sigcontext *sc = sc_ptr; -+ struct _fpstate *from = sc->fpstate, *to = (struct _fpstate *) buf; -+ int err = 0; -+ -+ if(from == NULL){ -+ err |= clear_user_proc(&to->cw, sizeof(to->cw)); -+ err |= clear_user_proc(&to->sw, sizeof(to->sw)); -+ err |= clear_user_proc(&to->tag, sizeof(to->tag)); -+ err |= clear_user_proc(&to->ipoff, sizeof(to->ipoff)); -+ err |= clear_user_proc(&to->cssel, sizeof(to->cssel)); -+ err |= clear_user_proc(&to->dataoff, sizeof(to->dataoff)); -+ err |= clear_user_proc(&to->datasel, sizeof(to->datasel)); -+ err |= clear_user_proc(&to->_st, sizeof(to->_st)); -+ } -+ else { -+ err |= copy_to_user_proc(&to->cw, &from->cw, sizeof(to->cw)); -+ err |= copy_to_user_proc(&to->sw, &from->sw, sizeof(to->sw)); -+ err |= copy_to_user_proc(&to->tag, &from->tag, -+ sizeof(to->tag)); -+ err |= copy_to_user_proc(&to->ipoff, &from->ipoff, -+ sizeof(to->ipoff)); -+ err |= copy_to_user_proc(&to->cssel,& from->cssel, -+ sizeof(to->cssel)); -+ err |= copy_to_user_proc(&to->dataoff, &from->dataoff, -+ sizeof(to->dataoff)); -+ err |= copy_to_user_proc(&to->datasel, &from->datasel, -+ sizeof(to->datasel)); -+ err |= copy_to_user_proc(to->_st, from->_st, sizeof(to->_st)); -+ } -+ return(err); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/syscalls.c um/arch/um/sys-i386/syscalls.c ---- orig/arch/um/sys-i386/syscalls.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/syscalls.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,68 @@ -+/* -+ * Copyright (C) 2000 Jeff Dike (jdike@karaya.com) -+ * Licensed under the GPL -+ */ -+ -+#include "asm/mman.h" -+#include "asm/uaccess.h" -+#include "asm/unistd.h" -+ -+/* -+ * Perform the select(nd, in, out, ex, tv) and mmap() system -+ * calls. Linux/i386 didn't use to be able to handle more than -+ * 4 system call parameters, so these system calls used a memory -+ * block for parameter passing.. -+ */ -+ -+struct mmap_arg_struct { -+ unsigned long addr; -+ unsigned long len; -+ unsigned long prot; -+ unsigned long flags; -+ unsigned long fd; -+ unsigned long offset; -+}; -+ -+extern int old_mmap(unsigned long addr, unsigned long len, -+ unsigned long prot, unsigned long flags, -+ unsigned long fd, unsigned long offset); -+ -+int old_mmap_i386(struct mmap_arg_struct *arg) -+{ -+ struct mmap_arg_struct a; -+ int err = -EFAULT; -+ -+ if (copy_from_user(&a, arg, sizeof(a))) -+ goto out; -+ -+ err = old_mmap(a.addr, a.len, a.prot, a.flags, a.fd, a.offset); -+ out: -+ return err; -+} -+ -+struct sel_arg_struct { -+ unsigned long n; -+ fd_set *inp, *outp, *exp; -+ struct timeval *tvp; -+}; -+ -+int old_select(struct sel_arg_struct *arg) -+{ -+ struct sel_arg_struct a; -+ -+ if (copy_from_user(&a, arg, sizeof(a))) -+ return -EFAULT; -+ /* sys_select() does the appropriate kernel locking */ -+ return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp); -+} -+ -+/* -+ * Overrides for Emacs so that we 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-file-style: "linux" -+ * End: -+ */ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/sysrq.c um/arch/um/sys-i386/sysrq.c ---- orig/arch/um/sys-i386/sysrq.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/sysrq.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,30 @@ -+#include "linux/kernel.h" -+#include "linux/smp.h" -+#include "linux/sched.h" -+#include "asm/ptrace.h" -+#include "sysrq.h" -+ -+void show_regs(struct pt_regs *regs) -+{ -+ printk("\n"); -+ printk("EIP: %04lx:[<%08lx>] CPU: %d %s", -+ 0xffff & PT_REGS_CS(regs), PT_REGS_IP(regs), -+ smp_processor_id(), print_tainted()); -+ if (PT_REGS_CS(regs) & 3) -+ printk(" ESP: %04lx:%08lx", 0xffff & PT_REGS_SS(regs), -+ PT_REGS_SP(regs)); -+ printk(" EFLAGS: %08lx\n %s\n", PT_REGS_EFLAGS(regs), -+ print_tainted()); -+ printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n", -+ PT_REGS_EAX(regs), PT_REGS_EBX(regs), -+ PT_REGS_ECX(regs), -+ PT_REGS_EDX(regs)); -+ printk("ESI: %08lx EDI: %08lx EBP: %08lx", -+ PT_REGS_ESI(regs), PT_REGS_EDI(regs), -+ PT_REGS_EBP(regs)); -+ printk(" DS: %04lx ES: %04lx\n", -+ 0xffff & PT_REGS_DS(regs), -+ 0xffff & PT_REGS_ES(regs)); -+ -+ show_trace((unsigned long *) ®s); -+} -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/Makefile um/arch/um/sys-i386/util/Makefile ---- orig/arch/um/sys-i386/util/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/util/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,28 @@ -+EXE = mk_sc mk_thread -+ -+include $(TOPDIR)/Rules.make -+ -+all : $(EXE) -+ -+mk_sc : mk_sc.o -+ $(CC) -o mk_sc mk_sc.o -+ -+mk_sc.o : mk_sc.c -+ $(CC) -c $< -+ -+mk_thread : mk_thread_user.o mk_thread_kern.o -+ $(CC) -o mk_thread mk_thread_user.o mk_thread_kern.o -+ -+mk_thread_user.o : mk_thread_user.c -+ $(CC) -c $< -+ -+mk_thread_kern.o : mk_thread_kern.c -+ $(CC) $(CFLAGS) -c $< -+ -+clean : -+ $(RM) $(EXE) *.o -+ -+archmrproper : clean -+ -+fastdep : -+ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_sc.c um/arch/um/sys-i386/util/mk_sc.c ---- orig/arch/um/sys-i386/util/mk_sc.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/util/mk_sc.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,51 @@ -+#include <stdio.h> -+#include <signal.h> -+#include <linux/stddef.h> -+ -+#define SC_OFFSET(name, field) \ -+ printf("#define " name "(sc) *((unsigned long *) &(((char *) (sc))[%d]))\n",\ -+ offsetof(struct sigcontext, field)) -+ -+#define SC_FP_OFFSET(name, field) \ -+ printf("#define " name \ -+ "(sc) *((unsigned long *) &(((char *) (SC_FPSTATE(sc)))[%d]))\n",\ -+ offsetof(struct _fpstate, field)) -+ -+#define SC_FP_OFFSET_PTR(name, field, type) \ -+ printf("#define " name \ -+ "(sc) ((" type " *) &(((char *) (SC_FPSTATE(sc)))[%d]))\n",\ -+ offsetof(struct _fpstate, field)) -+ -+int main(int argc, char **argv) -+{ -+ SC_OFFSET("SC_IP", eip); -+ SC_OFFSET("SC_SP", esp); -+ SC_OFFSET("SC_FS", fs); -+ SC_OFFSET("SC_GS", gs); -+ SC_OFFSET("SC_DS", ds); -+ SC_OFFSET("SC_ES", es); -+ SC_OFFSET("SC_SS", ss); -+ SC_OFFSET("SC_CS", cs); -+ SC_OFFSET("SC_EFLAGS", eflags); -+ SC_OFFSET("SC_EAX", eax); -+ SC_OFFSET("SC_EBX", ebx); -+ SC_OFFSET("SC_ECX", ecx); -+ SC_OFFSET("SC_EDX", edx); -+ SC_OFFSET("SC_EDI", edi); -+ SC_OFFSET("SC_ESI", esi); -+ SC_OFFSET("SC_EBP", ebp); -+ SC_OFFSET("SC_TRAPNO", trapno); -+ SC_OFFSET("SC_ERR", err); -+ SC_OFFSET("SC_CR2", cr2); -+ SC_OFFSET("SC_FPSTATE", fpstate); -+ SC_FP_OFFSET("SC_FP_CW", cw); -+ SC_FP_OFFSET("SC_FP_SW", sw); -+ SC_FP_OFFSET("SC_FP_TAG", tag); -+ SC_FP_OFFSET("SC_FP_IPOFF", ipoff); -+ SC_FP_OFFSET("SC_FP_CSSEL", cssel); -+ SC_FP_OFFSET("SC_FP_DATAOFF", dataoff); -+ SC_FP_OFFSET("SC_FP_DATASEL", datasel); -+ SC_FP_OFFSET_PTR("SC_FP_ST", _st, "struct _fpstate"); -+ SC_FP_OFFSET_PTR("SC_FXSR_ENV", _fxsr_env, "void"); -+ return(0); -+} -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_thread_kern.c um/arch/um/sys-i386/util/mk_thread_kern.c ---- orig/arch/um/sys-i386/util/mk_thread_kern.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/util/mk_thread_kern.c 2002-12-09 23:24:38.000000000 -0500 -@@ -0,0 +1,22 @@ -+#include "linux/config.h" -+#include "linux/stddef.h" -+#include "linux/sched.h" -+ -+extern void print_head(void); -+extern void print_constant_ptr(char *name, int value); -+extern void print_constant(char *name, char *type, int value); -+extern void print_tail(void); -+ -+#define THREAD_OFFSET(field) offsetof(struct task_struct, thread.field) -+ -+int main(int argc, char **argv) -+{ -+ print_head(); -+ print_constant_ptr("TASK_DEBUGREGS", THREAD_OFFSET(arch.debugregs)); -+#ifdef CONFIG_MODE_TT -+ print_constant("TASK_EXTERN_PID", "int", THREAD_OFFSET(mode.tt.extern_pid)); -+#endif -+ print_tail(); -+ return(0); -+} -+ -diff -Naur -X ../exclude-files orig/arch/um/sys-i386/util/mk_thread_user.c um/arch/um/sys-i386/util/mk_thread_user.c ---- orig/arch/um/sys-i386/util/mk_thread_user.c 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-i386/util/mk_thread_user.c 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,30 @@ -+#include <stdio.h> -+ -+void print_head(void) -+{ -+ printf("/*\n"); -+ printf(" * Generated by mk_thread\n"); -+ printf(" */\n"); -+ printf("\n"); -+ printf("#ifndef __UM_THREAD_H\n"); -+ printf("#define __UM_THREAD_H\n"); -+ printf("\n"); -+} -+ -+void print_constant_ptr(char *name, int value) -+{ -+ printf("#define %s(task) ((unsigned long *) " -+ "&(((char *) (task))[%d]))\n", name, value); -+} -+ -+void print_constant(char *name, char *type, int value) -+{ -+ printf("#define %s(task) *((%s *) &(((char *) (task))[%d]))\n", name, type, -+ value); -+} -+ -+void print_tail(void) -+{ -+ printf("\n"); -+ printf("#endif\n"); -+} -diff -Naur -X ../exclude-files orig/arch/um/sys-ia64/Makefile um/arch/um/sys-ia64/Makefile ---- orig/arch/um/sys-ia64/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-ia64/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,26 @@ -+OBJ = sys.o -+ -+OBJS = -+ -+all: $(OBJ) -+ -+$(OBJ): $(OBJS) -+ rm -f $@ -+ $(LD) $(LINKFLAGS) --start-group $^ --end-group -o $@ -+clean: -+ rm -f $(OBJS) -+ -+fastdep: -+ -+archmrproper: -+ -+archclean: -+ rm -f link.ld -+ @$(MAKEBOOT) clean -+ -+archdep: -+ @$(MAKEBOOT) dep -+ -+modules: -+ -+include $(TOPDIR)/Rules.make -diff -Naur -X ../exclude-files orig/arch/um/sys-ppc/Makefile um/arch/um/sys-ppc/Makefile ---- orig/arch/um/sys-ppc/Makefile 1969-12-31 19:00:00.000000000 -0500 -+++ um/arch/um/sys-ppc/Makefile 2002-10-23 21:08:04.000000000 -0400 -@@ -0,0 +1,80 @@ -+OBJ = sys.o -+ -+.S.o: -+ $(CC) $(AFLAGS) -D__ASSEMBLY__ -D__UM_PPC__ -c $< -o $*.o -+ -+OBJS = ptrace.o sigcontext.o semaphore.o checksum.o miscthings.o misc.o \ -+ ptrace_user.o sysrq.o -+ -+EXTRA_AFLAGS := -DCONFIG_ALL_PPC -I. -I$(TOPDIR)/arch/ppc/kernel -+ -+all: $(OBJ) -+ -+$(OBJ): $(OBJS) -+ rm -f $@ -+ $(LD) $(LINKFLAGS) --start-group $^ --end-group -o $@ -+ -+ptrace_user.o: ptrace_user.c -+ $(CC) -D__KERNEL__ $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< -+ -+sigcontext.o: sigcontext.c -+ $(CC) $(USER_CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $< -+ -+semaphore.c: -+ rm -f $@ -+ ln -s $(TOPDIR)/arch/ppc/kernel/$@ $@ -+ -+checksum.S: -+ rm -f $@ -+ ln -s $(TOPDIR)/arch/ppc/lib/$@ $@ -+ -+mk_defs.c: -+ rm -f $@ -+ ln -s $(TOPDIR)/arch/ppc/kernel/$@ $@ -+ -+ppc_defs.head: -+ rm -f $@ -+ ln -s $(TOPDIR)/arch/ppc/kernel/$@ $@ -+ -+ppc_defs.h: mk_defs.c ppc_defs.head \ -+ $(TOPDIR)/include/asm-ppc/mmu.h \ -+ $(TOPDIR)/include/asm-ppc/processor.h \ -+ $(TOPDIR)/include/asm-ppc/pgtable.h \ -+ $(TOPDIR)/include/asm-ppc/ptrace.h -+# $(CC) $(CFLAGS) -S mk_defs.c -+ cp ppc_defs.head ppc_defs.h -+# for bk, this way we can write to the file even if it's not checked out -+ echo '#define THREAD 608' >> ppc_defs.h -+ echo '#define PT_REGS 8' >> ppc_defs.h -+ echo '#define CLONE_VM 256' >> ppc_defs.h -+# chmod u+w ppc_defs.h -+# grep '^#define' mk_defs.s >> ppc_defs.h -+# rm mk_defs.s -+ -+# the asm link is horrible, and breaks the other targets. This is also -+# not going to work with parallel makes. -+ -+checksum.o: checksum.S -+ rm -f asm -+ ln -s $(TOPDIR)/include/asm-ppc asm -+ $(CC) $(EXTRA_AFLAGS) $(AFLAGS) -D__ASSEMBLY__ -D__UM_PPC__ -c $< -o $*.o -+ rm -f asm -+ -+misc.o: misc.S ppc_defs.h -+ rm -f asm -+ ln -s $(TOPDIR)/include/asm-ppc asm -+ $(CC) $(EXTRA_AFLAGS) $(AFLAGS) -D__ASSEMBLY__ -D__UM_PPC__ -c $<